Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-07-20 18:40:28 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-07-20 18:40:28 +0300
commitb595cb0c1dec83de5bdee18284abe86614bed33b (patch)
tree8c3d4540f193c5ff98019352f554e921b3a41a72
parent2f9104a328fc8a4bddeaa4627b595166d24671d0 (diff)
Add latest changes from gitlab-org/gitlab@15-2-stable-eev15.2.0-rc42
-rw-r--r--.browserslistrc15
-rw-r--r--.dockerignore10
-rw-r--r--.eslintrc.yml3
-rw-r--r--.gitlab-ci.yml22
-rw-r--r--.gitlab/CODEOWNERS11
-rw-r--r--.gitlab/ci/build-images.gitlab-ci.yml14
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml16
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml10
-rw-r--r--.gitlab/ci/pages.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/qa.gitlab-ci.yml8
-rw-r--r--.gitlab/ci/rails.gitlab-ci.yml18
-rw-r--r--.gitlab/ci/review-apps/main.gitlab-ci.yml6
-rw-r--r--.gitlab/ci/review-apps/qa.gitlab-ci.yml82
-rw-r--r--.gitlab/ci/review.gitlab-ci.yml6
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml118
-rw-r--r--.gitlab/ci/setup.gitlab-ci.yml25
-rw-r--r--.gitlab/ci/static-analysis.gitlab-ci.yml13
-rw-r--r--.gitlab/ci/vendored-gems.gitlab-ci.yml32
-rw-r--r--.gitlab/ci/workhorse.gitlab-ci.yml6
-rw-r--r--.gitlab/issue_templates/Broken Master - Flaky.md25
-rw-r--r--.gitlab/issue_templates/Broken Master - Non-flaky.md24
-rw-r--r--.gitlab/issue_templates/Feature Flag Roll Out.md6
-rw-r--r--.gitlab/issue_templates/Feature proposal - detailed.md4
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md4
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md4
-rw-r--r--.gitlab/merge_request_templates/New End To End Test.md5
-rw-r--r--.gitlab/sast-ruleset.toml10
-rw-r--r--.gitpod.yml11
-rw-r--r--.markdownlint.yml1
-rw-r--r--.nvmrc2
-rw-r--r--.rubocop.yml5
-rw-r--r--.rubocop_todo/capybara/visibility_matcher.yml3
-rw-r--r--.rubocop_todo/cop/user_admin.yml5
-rw-r--r--.rubocop_todo/database/rescue_query_canceled.yml9
-rw-r--r--.rubocop_todo/database/rescue_statement_timeout.yml5
-rw-r--r--.rubocop_todo/fips/open_ssl.yml222
-rw-r--r--.rubocop_todo/gitlab/delegate_predicate_methods.yml2
-rw-r--r--.rubocop_todo/gitlab/feature_available_usage.yml37
-rw-r--r--.rubocop_todo/gitlab/namespaced_class.yml18
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml12
-rw-r--r--.rubocop_todo/layout/first_array_element_indentation.yml7
-rw-r--r--.rubocop_todo/layout/first_hash_element_indentation.yml12
-rw-r--r--.rubocop_todo/layout/hash_alignment.yml4
-rw-r--r--.rubocop_todo/layout/line_length.yml118
-rw-r--r--.rubocop_todo/layout/multiline_operation_indentation.yml2
-rw-r--r--.rubocop_todo/layout/space_in_lambda_literal.yml2
-rw-r--r--.rubocop_todo/layout/space_inside_block_braces.yml12
-rw-r--r--.rubocop_todo/layout/space_inside_parens.yml10
-rw-r--r--.rubocop_todo/lint/constant_definition_in_block.yml2
-rw-r--r--.rubocop_todo/lint/redundant_cop_disable_directive.yml2
-rw-r--r--.rubocop_todo/migration/background_migration_base_class.yml1
-rw-r--r--.rubocop_todo/migration/background_migration_record.yml1
-rw-r--r--.rubocop_todo/naming/rescued_exceptions_variable_name.yml5
-rw-r--r--.rubocop_todo/performance/block_given_with_explicit_block.yml7
-rw-r--r--.rubocop_todo/performance/collection_literal_in_loop.yml7
-rw-r--r--.rubocop_todo/performance/constant_regexp.yml5
-rw-r--r--.rubocop_todo/performance/method_object_as_block.yml7
-rw-r--r--.rubocop_todo/rails/file_path.yml2
-rw-r--r--.rubocop_todo/rails/helper_instance_variable.yml2
-rw-r--r--.rubocop_todo/rails/inverse_of.yml1
-rw-r--r--.rubocop_todo/rails/pluck.yml1
-rw-r--r--.rubocop_todo/rails/redundant_foreign_key.yml1
-rw-r--r--.rubocop_todo/rails/skips_model_validations.yml4
-rw-r--r--.rubocop_todo/rails/squished_sql_heredocs.yml1
-rw-r--r--.rubocop_todo/rails/time_zone.yml1
-rw-r--r--.rubocop_todo/rspec/any_instance_of.yml35
-rw-r--r--.rubocop_todo/rspec/context_wording.yml38
-rw-r--r--.rubocop_todo/rspec/expect_change.yml6
-rw-r--r--.rubocop_todo/rspec/expect_in_hook.yml9
-rw-r--r--.rubocop_todo/rspec/instance_variable.yml3
-rw-r--r--.rubocop_todo/rspec/multiple_memoized_helpers.yml2
-rw-r--r--.rubocop_todo/rspec/predicate_matcher.yml7
-rw-r--r--.rubocop_todo/rspec/repeated_example_group_body.yml8
-rw-r--r--.rubocop_todo/rspec/repeated_example_group_description.yml18
-rw-r--r--.rubocop_todo/rspec/return_from_stub.yml6
-rw-r--r--.rubocop_todo/rspec/scattered_let.yml2
-rw-r--r--.rubocop_todo/rspec/verified_doubles.yml14
-rw-r--r--.rubocop_todo/style/case_like_if.yml2
-rw-r--r--.rubocop_todo/style/empty_method.yml1
-rw-r--r--.rubocop_todo/style/explicit_block_argument.yml1
-rw-r--r--.rubocop_todo/style/format_string.yml4
-rw-r--r--.rubocop_todo/style/guard_clause.yml1
-rw-r--r--.rubocop_todo/style/if_unless_modifier.yml8
-rw-r--r--.rubocop_todo/style/percent_literal_delimiters.yml10
-rw-r--r--.rubocop_todo/style/redundant_regexp_escape.yml1
-rw-r--r--.rubocop_todo/style/redundant_self.yml1
-rw-r--r--.rubocop_todo/style/symbol_proc.yml2
-rw-r--r--.stylelintrc9
-rw-r--r--CHANGELOG.md44
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_ELASTICSEARCH_INDEXER_VERSION2
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--GITLAB_PAGES_VERSION2
-rw-r--r--GITLAB_SHELL_VERSION2
-rw-r--r--Gemfile41
-rw-r--r--Gemfile.lock162
-rw-r--r--app/assets/javascripts/access_tokens/components/access_token_table_app.vue5
-rw-r--r--app/assets/javascripts/access_tokens/components/new_access_token_app.vue2
-rw-r--r--app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_trigger.vue6
-rw-r--r--app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue2
-rw-r--r--app/assets/javascripts/add_context_commits_modal/index.js4
-rw-r--r--app/assets/javascripts/admin/deploy_keys/components/table.vue22
-rw-r--r--app/assets/javascripts/admin/statistics_panel/components/app.vue29
-rw-r--r--app/assets/javascripts/admin/users/components/user_actions.vue14
-rw-r--r--app/assets/javascripts/analytics/devops_reports/components/devops_score.vue2
-rw-r--r--app/assets/javascripts/analytics/shared/constants.js28
-rw-r--r--app/assets/javascripts/batch_comments/components/draft_note.vue9
-rw-r--r--app/assets/javascripts/batch_comments/components/preview_dropdown.vue13
-rw-r--r--app/assets/javascripts/batch_comments/components/submit_dropdown.vue20
-rw-r--r--app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js6
-rw-r--r--app/assets/javascripts/blob/3d_viewer/index.js4
-rw-r--r--app/assets/javascripts/blob/3d_viewer/mesh_object.js4
-rw-r--r--app/assets/javascripts/blob/stl_viewer.js8
-rw-r--r--app/assets/javascripts/boards/components/board_card.vue27
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue3
-rw-r--r--app/assets/javascripts/boards/components/toggle_focus.vue2
-rw-r--r--app/assets/javascripts/ci_secure_files/components/secure_files_list.vue161
-rw-r--r--app/assets/javascripts/clusters_list/components/agent_table.vue4
-rw-r--r--app/assets/javascripts/clusters_list/constants.js6
-rw-r--r--app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue20
-rw-r--r--app/assets/javascripts/content_editor/components/content_editor_provider.vue2
-rw-r--r--app/assets/javascripts/content_editor/components/editor_state_observer.vue2
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue53
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_table_button.vue2
-rw-r--r--app/assets/javascripts/content_editor/components/top_toolbar.vue54
-rw-r--r--app/assets/javascripts/content_editor/extensions/code_block_highlight.js5
-rw-r--r--app/assets/javascripts/content_editor/extensions/division.js31
-rw-r--r--app/assets/javascripts/content_editor/extensions/html_nodes.js25
-rw-r--r--app/assets/javascripts/content_editor/extensions/sourcemap.js10
-rw-r--r--app/assets/javascripts/content_editor/services/content_editor.js4
-rw-r--r--app/assets/javascripts/content_editor/services/create_content_editor.js4
-rw-r--r--app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js6
-rw-r--r--app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js222
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_serializer.js18
-rw-r--r--app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js45
-rw-r--r--app/assets/javascripts/content_editor/services/serialization_helpers.js10
-rw-r--r--app/assets/javascripts/deploy_keys/components/key.vue18
-rw-r--r--app/assets/javascripts/deprecated_notes.js10
-rw-r--r--app/assets/javascripts/design_management/components/design_sidebar.vue78
-rw-r--r--app/assets/javascripts/design_management/constants.js2
-rw-r--r--app/assets/javascripts/design_management/pages/index.vue47
-rw-r--r--app/assets/javascripts/design_management/utils/error_messages.js14
-rw-r--r--app/assets/javascripts/diff.js58
-rw-r--r--app/assets/javascripts/diffs/components/commit_item.vue4
-rw-r--r--app/assets/javascripts/diffs/components/diff_code_quality.vue56
-rw-r--r--app/assets/javascripts/diffs/components/diff_content.vue2
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_note_form.vue2
-rw-r--r--app/assets/javascripts/diffs/components/diff_row.vue6
-rw-r--r--app/assets/javascripts/diffs/components/diff_view.vue63
-rw-r--r--app/assets/javascripts/diffs/components/tree_list.vue18
-rw-r--r--app/assets/javascripts/diffs/store/actions.js4
-rw-r--r--app/assets/javascripts/editor/schema/ci.json27
-rw-r--r--app/assets/javascripts/editor/source_editor_instance.js1
-rw-r--r--app/assets/javascripts/emoji/awards_app/store/actions.js2
-rw-r--r--app/assets/javascripts/environments/components/canary_update_modal.vue2
-rw-r--r--app/assets/javascripts/environments/components/confirm_rollback_modal.vue42
-rw-r--r--app/assets/javascripts/environments/components/deploy_board.vue6
-rw-r--r--app/assets/javascripts/environments/components/environments_table.vue2
-rw-r--r--app/assets/javascripts/environments/stores/environments_store.js2
-rw-r--r--app/assets/javascripts/error_tracking/components/error_tracking_list.vue10
-rw-r--r--app/assets/javascripts/feature_flags/components/strategies/default.vue2
-rw-r--r--app/assets/javascripts/gitlab_pages/components/pages_pipeline_wizard.vue84
-rw-r--r--app/assets/javascripts/gitlab_pages/queries/mark_onboarding_complete.graphql6
-rw-r--r--app/assets/javascripts/google_cloud/components/app.vue63
-rw-r--r--app/assets/javascripts/google_cloud/components/errors/gcp_error.vue29
-rw-r--r--app/assets/javascripts/google_cloud/components/errors/no_gcp_projects.vue26
-rw-r--r--app/assets/javascripts/google_cloud/components/google_cloud_menu.vue85
-rw-r--r--app/assets/javascripts/google_cloud/components/home.vue81
-rw-r--r--app/assets/javascripts/google_cloud/components/incubation_banner.vue28
-rw-r--r--app/assets/javascripts/google_cloud/configuration/index.js11
-rw-r--r--app/assets/javascripts/google_cloud/configuration/panel.vue88
-rw-r--r--app/assets/javascripts/google_cloud/databases/cloudsql/create_instance_form.vue132
-rw-r--r--app/assets/javascripts/google_cloud/databases/cloudsql/instance_table.vue75
-rw-r--r--app/assets/javascripts/google_cloud/databases/index.js11
-rw-r--r--app/assets/javascripts/google_cloud/databases/panel.vue38
-rw-r--r--app/assets/javascripts/google_cloud/databases/service_table.vue221
-rw-r--r--app/assets/javascripts/google_cloud/deployments/index.js11
-rw-r--r--app/assets/javascripts/google_cloud/deployments/panel.vue50
-rw-r--r--app/assets/javascripts/google_cloud/deployments/service_table.vue (renamed from app/assets/javascripts/google_cloud/components/deployments_service_table.vue)0
-rw-r--r--app/assets/javascripts/google_cloud/gcp_regions/form.vue (renamed from app/assets/javascripts/google_cloud/components/gcp_regions_form.vue)0
-rw-r--r--app/assets/javascripts/google_cloud/gcp_regions/index.js11
-rw-r--r--app/assets/javascripts/google_cloud/gcp_regions/list.vue (renamed from app/assets/javascripts/google_cloud/components/gcp_regions_list.vue)0
-rw-r--r--app/assets/javascripts/google_cloud/index.js12
-rw-r--r--app/assets/javascripts/google_cloud/service_accounts/form.vue (renamed from app/assets/javascripts/google_cloud/components/service_accounts_form.vue)0
-rw-r--r--app/assets/javascripts/google_cloud/service_accounts/index.js11
-rw-r--r--app/assets/javascripts/google_cloud/service_accounts/list.vue (renamed from app/assets/javascripts/google_cloud/components/service_accounts_list.vue)0
-rw-r--r--app/assets/javascripts/google_tag_manager/index.js8
-rw-r--r--app/assets/javascripts/graphql_shared/possible_types.json4
-rw-r--r--app/assets/javascripts/graphql_shared/queries/current_user.query.graphql7
-rw-r--r--app/assets/javascripts/graphql_shared/queries/get_users_by_usernames.query.graphql9
-rw-r--r--app/assets/javascripts/graphql_shared/queries/users_search_all.query.graphql9
-rw-r--r--app/assets/javascripts/groups/components/group_item.vue86
-rw-r--r--app/assets/javascripts/groups/components/group_name_and_path.vue6
-rw-r--r--app/assets/javascripts/groups/constants.js22
-rw-r--r--app/assets/javascripts/groups/index.js2
-rw-r--r--app/assets/javascripts/header.js19
-rw-r--r--app/assets/javascripts/header_search/components/app.vue111
-rw-r--r--app/assets/javascripts/header_search/components/header_search_scoped_items.vue44
-rw-r--r--app/assets/javascripts/header_search/constants.js22
-rw-r--r--app/assets/javascripts/header_search/init.js53
-rw-r--r--app/assets/javascripts/header_search/store/getters.js19
-rw-r--r--app/assets/javascripts/helpers/help_page_helper.js7
-rw-r--r--app/assets/javascripts/ide/components/ide_tree.vue10
-rw-r--r--app/assets/javascripts/ide/components/new_dropdown/modal.vue24
-rw-r--r--app/assets/javascripts/ide/components/repo_editor.vue47
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue15
-rw-r--r--app/assets/javascripts/import_entities/import_groups/index.js4
-rw-r--r--app/assets/javascripts/init_confirm_danger.js6
-rw-r--r--app/assets/javascripts/integrations/constants.js10
-rw-r--r--app/assets/javascripts/integrations/edit/components/integration_form.vue26
-rw-r--r--app/assets/javascripts/integrations/edit/components/sections/configuration.vue1
-rw-r--r--app/assets/javascripts/integrations/edit/components/trigger_fields.vue12
-rw-r--r--app/assets/javascripts/invite_members/components/group_select.vue1
-rw-r--r--app/assets/javascripts/invite_members/components/import_a_project_modal.vue157
-rw-r--r--app/assets/javascripts/invite_members/components/import_project_members_modal.vue149
-rw-r--r--app/assets/javascripts/invite_members/components/import_project_members_trigger.vue34
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue64
-rw-r--r--app/assets/javascripts/invite_members/components/invite_modal_base.vue8
-rw-r--r--app/assets/javascripts/invite_members/components/members_token_select.vue31
-rw-r--r--app/assets/javascripts/invite_members/constants.js4
-rw-r--r--app/assets/javascripts/invite_members/init_import_a_project_modal.js23
-rw-r--r--app/assets/javascripts/invite_members/init_import_project_members_modal.js23
-rw-r--r--app/assets/javascripts/invite_members/init_import_project_members_trigger.js20
-rw-r--r--app/assets/javascripts/invite_members/utils/member_utils.js4
-rw-r--r--app/assets/javascripts/invite_members/utils/response_message_parser.js31
-rw-r--r--app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js13
-rw-r--r--app/assets/javascripts/issuable/components/related_issuable_item.vue2
-rw-r--r--app/assets/javascripts/issuable/issuable_form.js5
-rw-r--r--app/assets/javascripts/issues/create_merge_request_dropdown.js43
-rw-r--r--app/assets/javascripts/issues/index.js2
-rw-r--r--app/assets/javascripts/issues/list/components/issues_list_app.vue52
-rw-r--r--app/assets/javascripts/issues/list/constants.js4
-rw-r--r--app/assets/javascripts/issues/list/queries/issue.fragment.graphql1
-rw-r--r--app/assets/javascripts/issues/list/utils.js25
-rw-r--r--app/assets/javascripts/issues/new/components/type_popover.vue5
-rw-r--r--app/assets/javascripts/issues/show/components/description.vue118
-rw-r--r--app/assets/javascripts/issues/show/components/edit_actions.vue3
-rw-r--r--app/assets/javascripts/issues/show/components/fields/description.vue3
-rw-r--r--app/assets/javascripts/issues/show/components/fields/title.vue2
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/constants.js26
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/graphql/queries/create_timeline_event.mutation.graphql13
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/graphql/queries/delete_timeline_event.mutation.graphql8
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/graphql/queries/get_timeline_events.query.graphql6
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue2
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue266
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/timeline_events_list.vue44
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/timeline_events_list_item.vue37
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/timeline_events_tab.vue36
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/utils.js14
-rw-r--r--app/assets/javascripts/issues/show/components/title.vue5
-rw-r--r--app/assets/javascripts/issues/show/index.js1
-rw-r--r--app/assets/javascripts/jobs/bridge/app.vue118
-rw-r--r--app/assets/javascripts/jobs/bridge/components/constants.js1
-rw-r--r--app/assets/javascripts/jobs/bridge/components/empty_state.vue45
-rw-r--r--app/assets/javascripts/jobs/bridge/components/sidebar.vue105
-rw-r--r--app/assets/javascripts/jobs/bridge/graphql/queries/pipeline.query.graphql70
-rw-r--r--app/assets/javascripts/jobs/components/job_app.vue12
-rw-r--r--app/assets/javascripts/jobs/components/job_log_controllers.vue95
-rw-r--r--app/assets/javascripts/jobs/components/log/collapsible_section.vue39
-rw-r--r--app/assets/javascripts/jobs/components/log/line.vue43
-rw-r--r--app/assets/javascripts/jobs/components/log/line_number.vue6
-rw-r--r--app/assets/javascripts/jobs/components/log/log.vue16
-rw-r--r--app/assets/javascripts/jobs/components/sidebar.vue2
-rw-r--r--app/assets/javascripts/jobs/components/sidebar_job_details_container.vue10
-rw-r--r--app/assets/javascripts/jobs/components/table/cells/actions_cell.vue2
-rw-r--r--app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql4
-rw-r--r--app/assets/javascripts/jobs/components/table/jobs_table.vue1
-rw-r--r--app/assets/javascripts/jobs/components/table/jobs_table_app.vue4
-rw-r--r--app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue3
-rw-r--r--app/assets/javascripts/jobs/constants.js2
-rw-r--r--app/assets/javascripts/jobs/index.js44
-rw-r--r--app/assets/javascripts/jobs/store/mutations.js27
-rw-r--r--app/assets/javascripts/jobs/store/state.js3
-rw-r--r--app/assets/javascripts/jobs/store/utils.js80
-rw-r--r--app/assets/javascripts/lib/dompurify.js1
-rw-r--r--app/assets/javascripts/lib/gfm/index.js40
-rw-r--r--app/assets/javascripts/lib/utils/common_utils.js12
-rw-r--r--app/assets/javascripts/lib/utils/text_utility.js14
-rw-r--r--app/assets/javascripts/linked_resources/index.js28
-rw-r--r--app/assets/javascripts/logs/components/environment_logs.vue280
-rw-r--r--app/assets/javascripts/logs/components/log_advanced_filters.vue99
-rw-r--r--app/assets/javascripts/logs/components/log_control_buttons.vue95
-rw-r--r--app/assets/javascripts/logs/components/log_simple_filters.vue68
-rw-r--r--app/assets/javascripts/logs/components/tokens/token_with_loading_state.vue30
-rw-r--r--app/assets/javascripts/logs/constants.js16
-rw-r--r--app/assets/javascripts/logs/index.js24
-rw-r--r--app/assets/javascripts/logs/logs_tracking_helper.js18
-rw-r--r--app/assets/javascripts/logs/stores/actions.js174
-rw-r--r--app/assets/javascripts/logs/stores/getters.js14
-rw-r--r--app/assets/javascripts/logs/stores/index.js23
-rw-r--r--app/assets/javascripts/logs/stores/mutation_types.js26
-rw-r--r--app/assets/javascripts/logs/stores/mutations.js110
-rw-r--r--app/assets/javascripts/logs/stores/state.js56
-rw-r--r--app/assets/javascripts/logs/utils.js4
-rw-r--r--app/assets/javascripts/main.js36
-rw-r--r--app/assets/javascripts/members/components/members_tabs.vue85
-rw-r--r--app/assets/javascripts/members/components/table/member_avatar.vue8
-rw-r--r--app/assets/javascripts/members/components/table/members_table_cell.vue2
-rw-r--r--app/assets/javascripts/members/constants.js6
-rw-r--r--app/assets/javascripts/members/index.js2
-rw-r--r--app/assets/javascripts/merge_request_tabs.js8
-rw-r--r--app/assets/javascripts/milestones/components/delete_milestone_modal.vue33
-rw-r--r--app/assets/javascripts/milestones/milestone.js12
-rw-r--r--app/assets/javascripts/mirrors/ssh_mirror.js2
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard.vue4
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_header.vue8
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_panel.vue38
-rw-r--r--app/assets/javascripts/monitoring/constants.js2
-rw-r--r--app/assets/javascripts/monitoring/stores/state.js1
-rw-r--r--app/assets/javascripts/monitoring/utils.js2
-rw-r--r--app/assets/javascripts/mr_notes/stores/index.js14
-rw-r--r--app/assets/javascripts/new_branch_form.js22
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue5
-rw-r--r--app/assets/javascripts/notes/components/discussion_filter_note.vue4
-rw-r--r--app/assets/javascripts/notes/components/discussion_navigator.vue2
-rw-r--r--app/assets/javascripts/notes/components/noteable_note.vue58
-rw-r--r--app/assets/javascripts/notes/components/toggle_replies_widget.vue93
-rw-r--r--app/assets/javascripts/notes/constants.js4
-rw-r--r--app/assets/javascripts/notes/mixins/discussion_navigation.js2
-rw-r--r--app/assets/javascripts/notes/stores/actions.js9
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/details_header.vue3
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue10
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue52
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/common.js3
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js7
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue3
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue20
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue24
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/constants.js7
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue6
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/bundle.js2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue18
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue65
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue28
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/constants.js15
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/expiration_dropdown.vue10
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy.vue68
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue137
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue10
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/constants.js25
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/graphql/fragments/packages_cleanup_policy.fragment.graphql4
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/graphql/mutations/update_packages_cleanup_policy.mutation.graphql10
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/graphql/queries/get_packages_cleanup_policy.query.graphql10
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js4
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/utils.js9
-rw-r--r--app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue17
-rw-r--r--app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js2
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue17
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js4
-rw-r--r--app/assets/javascripts/pages/dashboard/todos/index/todos.js36
-rw-r--r--app/assets/javascripts/pages/groups/group_members/index.js10
-rw-r--r--app/assets/javascripts/pages/groups/runners/index/index.js (renamed from app/assets/javascripts/pages/groups/runners/index.js)0
-rw-r--r--app/assets/javascripts/pages/groups/runners/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/branches/new/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue2
-rw-r--r--app/assets/javascripts/pages/projects/google_cloud/configuration/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/google_cloud/databases/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/google_cloud/deployments/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/google_cloud/gcp_regions/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/google_cloud/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/google_cloud/service_accounts/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/jobs/index/index.js22
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/included_in_trial_indicator.vue15
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue8
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue70
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue73
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js58
-rw-r--r--app/assets/javascripts/pages/projects/logs/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js2
-rw-r--r--app/assets/javascripts/pages/projects/project_members/index.js10
-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.vue31
-rw-r--r--app/assets/javascripts/pages/projects/shared/permissions/constants.js8
-rw-r--r--app/assets/javascripts/pages/projects/work_items/index.js2
-rw-r--r--app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue2
-rw-r--r--app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue286
-rw-r--r--app/assets/javascripts/performance_bar/components/performance_bar_app.vue2
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue2
-rw-r--r--app/assets/javascripts/pipeline_editor/components/lint/ci_lint_results.vue9
-rw-r--r--app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue32
-rw-r--r--app/assets/javascripts/pipeline_editor/components/popovers/validate_pipeline_popover.vue72
-rw-r--r--app/assets/javascripts/pipeline_editor/components/ui/editor_tab.vue27
-rw-r--r--app/assets/javascripts/pipeline_editor/components/validate/ci_validate.vue252
-rw-r--r--app/assets/javascripts/pipeline_editor/constants.js2
-rw-r--r--app/assets/javascripts/pipeline_editor/index.js4
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue1
-rw-r--r--app/assets/javascripts/pipeline_wizard/components/input_wrapper.vue6
-rw-r--r--app/assets/javascripts/pipeline_wizard/components/step.vue7
-rw-r--r--app/assets/javascripts/pipeline_wizard/components/widgets/checklist.vue80
-rw-r--r--app/assets/javascripts/pipeline_wizard/components/wrapper.vue1
-rw-r--r--app/assets/javascripts/pipeline_wizard/pipeline_wizard.vue1
-rw-r--r--app/assets/javascripts/pipeline_wizard/templates/pages.yml53
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue1
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_view_selector.vue37
-rw-r--r--app/assets/javascripts/pipelines/components/header_component.vue22
-rw-r--r--app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/performance_insights_modal.vue168
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/test_reports/test_case_details.vue15
-rw-r--r--app/assets/javascripts/pipelines/components/test_reports/test_reports.vue17
-rw-r--r--app/assets/javascripts/pipelines/components/test_reports/test_suite_table.vue10
-rw-r--r--app/assets/javascripts/pipelines/components/test_reports/test_summary_table.vue2
-rw-r--r--app/assets/javascripts/pipelines/constants.js2
-rw-r--r--app/assets/javascripts/pipelines/graphql/queries/get_performance_insights.query.graphql28
-rw-r--r--app/assets/javascripts/pipelines/pipeline_tabs.js3
-rw-r--r--app/assets/javascripts/pipelines/pipeline_test_details.js13
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/constants.js2
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/index.js12
-rw-r--r--app/assets/javascripts/pipelines/utils.js21
-rw-r--r--app/assets/javascripts/profile/account/index.js2
-rw-r--r--app/assets/javascripts/profile/profile.js11
-rw-r--r--app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue5
-rw-r--r--app/assets/javascripts/projects/commit_box/info/init_details_button.js8
-rw-r--r--app/assets/javascripts/projects/commits/components/author_select.vue2
-rw-r--r--app/assets/javascripts/projects/compare/components/app.vue12
-rw-r--r--app/assets/javascripts/projects/new/components/app.vue2
-rw-r--r--app/assets/javascripts/projects/new/components/new_project_url_select.vue30
-rw-r--r--app/assets/javascripts/projects/pipelines/charts/components/app.vue17
-rw-r--r--app/assets/javascripts/projects/project_new.js1
-rw-r--r--app/assets/javascripts/projects/project_visibility.js4
-rw-r--r--app/assets/javascripts/projects/settings/access_dropdown.js4
-rw-r--r--app/assets/javascripts/projects/settings/components/access_dropdown.vue7
-rw-r--r--app/assets/javascripts/projects/star.js34
-rw-r--r--app/assets/javascripts/related_issues/components/add_issuable_form.vue6
-rw-r--r--app/assets/javascripts/releases/components/app_edit_new.vue44
-rw-r--r--app/assets/javascripts/releases/components/app_index.vue18
-rw-r--r--app/assets/javascripts/releases/components/confirm_delete_modal.vue77
-rw-r--r--app/assets/javascripts/releases/components/release_block_footer.vue30
-rw-r--r--app/assets/javascripts/releases/components/tag_field.vue4
-rw-r--r--app/assets/javascripts/releases/components/tag_field_new.vue15
-rw-r--r--app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql2
-rw-r--r--app/assets/javascripts/releases/graphql/mutations/delete_release.mutation.graphql5
-rw-r--r--app/assets/javascripts/releases/mount_edit.js2
-rw-r--r--app/assets/javascripts/releases/mount_index.js2
-rw-r--r--app/assets/javascripts/releases/mount_new.js2
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/actions.js45
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/getters.js16
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js2
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/mutations.js9
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/state.js9
-rw-r--r--app/assets/javascripts/releases/util.js8
-rw-r--r--app/assets/javascripts/reports/components/summary_row.vue2
-rw-r--r--app/assets/javascripts/repository/components/blob_content_viewer.vue9
-rw-r--r--app/assets/javascripts/repository/components/last_commit.vue9
-rw-r--r--app/assets/javascripts/repository/components/table/index.vue8
-rw-r--r--app/assets/javascripts/repository/components/table/row.vue12
-rw-r--r--app/assets/javascripts/repository/constants.js1
-rw-r--r--app/assets/javascripts/repository/graphql.js3
-rw-r--r--app/assets/javascripts/repository/index.js4
-rw-r--r--app/assets/javascripts/repository/log_tree.js4
-rw-r--r--app/assets/javascripts/repository/queries/commit.fragment.graphql1
-rw-r--r--app/assets/javascripts/repository/queries/commit.query.graphql4
-rw-r--r--app/assets/javascripts/repository/utils/commit.js1
-rw-r--r--app/assets/javascripts/runner/admin_runner_show/admin_runner_show_app.vue45
-rw-r--r--app/assets/javascripts/runner/admin_runners/admin_runners_app.vue154
-rw-r--r--app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue36
-rw-r--r--app/assets/javascripts/runner/components/runner_detail.vue1
-rw-r--r--app/assets/javascripts/runner/components/runner_details.vue111
-rw-r--r--app/assets/javascripts/runner/components/runner_filtered_search_bar.vue12
-rw-r--r--app/assets/javascripts/runner/components/runner_type_tabs.vue46
-rw-r--r--app/assets/javascripts/runner/components/search_tokens/paused_token_config.js2
-rw-r--r--app/assets/javascripts/runner/components/search_tokens/status_token_config.js2
-rw-r--r--app/assets/javascripts/runner/components/search_tokens/upgrade_status_token_config.js2
-rw-r--r--app/assets/javascripts/runner/components/stat/runner_count.vue103
-rw-r--r--app/assets/javascripts/runner/components/stat/runner_stats.vue56
-rw-r--r--app/assets/javascripts/runner/constants.js1
-rw-r--r--app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql38
-rw-r--r--app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql11
-rw-r--r--app/assets/javascripts/runner/graphql/list/all_runners.query.graphql38
-rw-r--r--app/assets/javascripts/runner/graphql/list/all_runners_count.query.graphql11
-rw-r--r--app/assets/javascripts/runner/group_runner_show/group_runner_show_app.vue34
-rw-r--r--app/assets/javascripts/runner/group_runner_show/index.js8
-rw-r--r--app/assets/javascripts/runner/group_runners/group_runners_app.vue122
-rw-r--r--app/assets/javascripts/security_configuration/components/app.vue4
-rw-r--r--app/assets/javascripts/security_configuration/components/constants.js2
-rw-r--r--app/assets/javascripts/security_configuration/components/training_provider_list.vue26
-rw-r--r--app/assets/javascripts/security_configuration/graphql/security_training_vulnerability.query.graphql8
-rw-r--r--app/assets/javascripts/self_monitor/components/self_monitor_form.vue4
-rw-r--r--app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue163
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue14
-rw-r--r--app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue13
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue3
-rw-r--r--app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue5
-rw-r--r--app/assets/javascripts/sidebar/graphql.js3
-rw-r--r--app/assets/javascripts/sidebar/mount_sidebar.js6
-rw-r--r--app/assets/javascripts/sidebar/services/sidebar_service.js1
-rw-r--r--app/assets/javascripts/sidebar/sidebar_mediator.js2
-rw-r--r--app/assets/javascripts/sidebar/stores/sidebar_store.js1
-rw-r--r--app/assets/javascripts/surveys/components/satisfaction_rate.vue71
-rw-r--r--app/assets/javascripts/surveys/merge_request_experience/app.js52
-rw-r--r--app/assets/javascripts/surveys/merge_request_experience/app.vue169
-rw-r--r--app/assets/javascripts/surveys/merge_request_experience/index.js23
-rw-r--r--app/assets/javascripts/tabs/constants.js3
-rw-r--r--app/assets/javascripts/tabs/index.js23
-rw-r--r--app/assets/javascripts/terms/components/app.vue10
-rw-r--r--app/assets/javascripts/user_popovers.js2
-rw-r--r--app/assets/javascripts/users_select/index.js30
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue41
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue48
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js3
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue11
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/telemetry.js2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/merge_checks_failed.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue16
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/accessibility/index.js3
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/issues.js2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js62
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js14
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue12
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/queries/get_state.query.graphql2
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue12
-rw-r--r--app/assets/javascripts/vue_shared/components/color_select_dropdown/color_item.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/color_select_dropdown/color_select_root.vue31
-rw-r--r--app/assets/javascripts/vue_shared/components/color_select_dropdown/constants.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents.vue17
-rw-r--r--app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents_color_view.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_value.vue18
-rw-r--r--app/assets/javascripts/vue_shared/components/deployment_instance.vue18
-rw-r--r--app/assets/javascripts/vue_shared/components/dom_element_listener.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_contact.fragment.graphql6
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_organization.fragment.graphql4
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_contacts.query.graphql28
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_organizations.query.graphql28
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_contact_token.vue131
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_organization_token.vue125
-rw-r--r--app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/header_ci_component.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/help_popover.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/local_storage_sync.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/field.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue24
-rw-r--r--app/assets/javascripts/vue_shared/components/page_size_selector.vue37
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/list_item.vue29
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/title_area.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js1
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js1
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js1
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/slot_switch.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/constants.js11
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js6
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js25
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js15
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/package_json_linker.js46
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue33
-rw-r--r--app/assets/javascripts/vue_shared/components/usage_quotas/usage_banner.vue32
-rw-r--r--app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/user_callout_dismisser.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue90
-rw-r--r--app/assets/javascripts/vue_shared/components/vuex_module_provider.vue2
-rw-r--r--app/assets/javascripts/vue_shared/issuable/create/components/issuable_form.vue3
-rw-r--r--app/assets/javascripts/vue_shared/issuable/list/components/issuable_item.vue20
-rw-r--r--app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue53
-rw-r--r--app/assets/javascripts/vue_shared/issuable/list/constants.js2
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_description.vue6
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue3
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue10
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue5
-rw-r--r--app/assets/javascripts/work_items/components/item_state.vue2
-rw-r--r--app/assets/javascripts/work_items/components/item_title.vue11
-rw-r--r--app/assets/javascripts/work_items/components/work_item_actions.vue8
-rw-r--r--app/assets/javascripts/work_items/components/work_item_assignees.vue235
-rw-r--r--app/assets/javascripts/work_items/components/work_item_description.vue70
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail.vue138
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail_modal.vue8
-rw-r--r--app/assets/javascripts/work_items/components/work_item_information.vue57
-rw-r--r--app/assets/javascripts/work_items/components/work_item_labels.vue246
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/index.js6
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue51
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue116
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links_menu.vue101
-rw-r--r--app/assets/javascripts/work_items/components/work_item_weight.vue128
-rw-r--r--app/assets/javascripts/work_items/constants.js6
-rw-r--r--app/assets/javascripts/work_items/graphql/change_work_item_parent_link.mutation.graphql13
-rw-r--r--app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql8
-rw-r--r--app/assets/javascripts/work_items/graphql/local_update_work_item.mutation.graphql2
-rw-r--r--app/assets/javascripts/work_items/graphql/project_work_items.query.graphql14
-rw-r--r--app/assets/javascripts/work_items/graphql/provider.js58
-rw-r--r--app/assets/javascripts/work_items/graphql/typedefs.graphql15
-rw-r--r--app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql1
-rw-r--r--app/assets/javascripts/work_items/graphql/update_work_item_task.mutation.graphql5
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item.fragment.graphql26
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item.query.graphql10
-rw-r--r--app/assets/javascripts/work_items/index.js1
-rw-r--r--app/assets/javascripts/work_items/pages/create_work_item.vue37
-rw-r--r--app/assets/stylesheets/_page_specific_files.scss5
-rw-r--r--app/assets/stylesheets/components/content_editor.scss9
-rw-r--r--app/assets/stylesheets/framework/header.scss3
-rw-r--r--app/assets/stylesheets/framework/icons.scss8
-rw-r--r--app/assets/stylesheets/framework/variables.scss1
-rw-r--r--app/assets/stylesheets/highlight/hljs.scss4
-rw-r--r--app/assets/stylesheets/highlight/themes/dark.scss12
-rw-r--r--app/assets/stylesheets/highlight/themes/monokai.scss17
-rw-r--r--app/assets/stylesheets/highlight/themes/none.scss8
-rw-r--r--app/assets/stylesheets/highlight/themes/solarized-dark.scss17
-rw-r--r--app/assets/stylesheets/highlight/themes/solarized-light.scss13
-rw-r--r--app/assets/stylesheets/highlight/themes/white.scss3
-rw-r--r--app/assets/stylesheets/highlight/white_base.scss18
-rw-r--r--app/assets/stylesheets/mailer.scss2
-rw-r--r--app/assets/stylesheets/page_bundles/_ide_monaco_overrides.scss6
-rw-r--r--app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/merge_requests.scss20
-rw-r--r--app/assets/stylesheets/page_bundles/oncall_schedules.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/project.scss11
-rw-r--r--app/assets/stylesheets/page_bundles/work_items.scss35
-rw-r--r--app/assets/stylesheets/pages/branches.scss6
-rw-r--r--app/assets/stylesheets/pages/colors.scss24
-rw-r--r--app/assets/stylesheets/pages/commits.scss22
-rw-r--r--app/assets/stylesheets/pages/groups.scss1
-rw-r--r--app/assets/stylesheets/pages/issuable.scss33
-rw-r--r--app/assets/stylesheets/pages/issues.scss22
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss33
-rw-r--r--app/assets/stylesheets/pages/notes.scss35
-rw-r--r--app/assets/stylesheets/pages/profiles/preferences.scss4
-rw-r--r--app/assets/stylesheets/pages/projects.scss8
-rw-r--r--app/assets/stylesheets/pages/search.scss74
-rw-r--r--app/assets/stylesheets/pages/settings.scss52
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss84
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss70
-rw-r--r--app/assets/stylesheets/themes/_dark.scss4
-rw-r--r--app/assets/stylesheets/themes/theme_helper.scss9
-rw-r--r--app/assets/stylesheets/utilities.scss48
-rw-r--r--app/channels/awareness_channel.rb84
-rw-r--r--app/components/pajamas/spinner_component.html.haml5
-rw-r--r--app/components/pajamas/spinner_component.rb27
-rw-r--r--app/controllers/admin/application_settings_controller.rb11
-rw-r--r--app/controllers/admin/broadcast_messages_controller.rb2
-rw-r--r--app/controllers/admin/hooks_controller.rb51
-rw-r--r--app/controllers/admin/system_info_controller.rb3
-rw-r--r--app/controllers/admin/topics_controller.rb10
-rw-r--r--app/controllers/application_controller.rb4
-rw-r--r--app/controllers/clusters/clusters_controller.rb1
-rw-r--r--app/controllers/concerns/google_analytics_csp.rb24
-rw-r--r--app/controllers/concerns/harbor/access.rb27
-rw-r--r--app/controllers/concerns/harbor/artifact.rb41
-rw-r--r--app/controllers/concerns/harbor/repository.rb51
-rw-r--r--app/controllers/concerns/harbor/tag.rb41
-rw-r--r--app/controllers/concerns/integrations/hooks_execution.rb60
-rw-r--r--app/controllers/concerns/integrations/params.rb1
-rw-r--r--app/controllers/concerns/issuable_actions.rb1
-rw-r--r--app/controllers/concerns/issuable_collections.rb11
-rw-r--r--app/controllers/concerns/product_analytics_tracking.rb5
-rw-r--r--app/controllers/concerns/verifies_with_email.rb194
-rw-r--r--app/controllers/confirmations_controller.rb1
-rw-r--r--app/controllers/graphql_controller.rb7
-rw-r--r--app/controllers/groups/harbor/application_controller.rb16
-rw-r--r--app/controllers/groups/harbor/artifacts_controller.rb15
-rw-r--r--app/controllers/groups/harbor/repositories_controller.rb17
-rw-r--r--app/controllers/groups/harbor/tags_controller.rb15
-rw-r--r--app/controllers/groups/registry/repositories_controller.rb4
-rw-r--r--app/controllers/import/bitbucket_controller.rb15
-rw-r--r--app/controllers/import/bitbucket_server_controller.rb7
-rw-r--r--app/controllers/import/bulk_imports_controller.rb8
-rw-r--r--app/controllers/import/fogbugz_controller.rb10
-rw-r--r--app/controllers/import/gitea_controller.rb2
-rw-r--r--app/controllers/import/github_controller.rb16
-rw-r--r--app/controllers/import/gitlab_controller.rb6
-rw-r--r--app/controllers/jira_connect/oauth_application_ids_controller.rb9
-rw-r--r--app/controllers/jira_connect/subscriptions_controller.rb8
-rw-r--r--app/controllers/ldap/omniauth_callbacks_controller.rb16
-rw-r--r--app/controllers/oauth/applications_controller.rb6
-rw-r--r--app/controllers/oauth/authorizations_controller.rb2
-rw-r--r--app/controllers/profiles/personal_access_tokens_controller.rb29
-rw-r--r--app/controllers/projects/blame_controller.rb2
-rw-r--r--app/controllers/projects/blob_controller.rb1
-rw-r--r--app/controllers/projects/environments_controller.rb3
-rw-r--r--app/controllers/projects/google_cloud/base_controller.rb18
-rw-r--r--app/controllers/projects/google_cloud/configuration_controller.rb38
-rw-r--r--app/controllers/projects/google_cloud/databases_controller.rb18
-rw-r--r--app/controllers/projects/google_cloud/deployments_controller.rb31
-rw-r--r--app/controllers/projects/google_cloud/gcp_regions_controller.rb12
-rw-r--r--app/controllers/projects/google_cloud/revoke_oauth_controller.rb7
-rw-r--r--app/controllers/projects/google_cloud/service_accounts_controller.rb25
-rw-r--r--app/controllers/projects/google_cloud_controller.rb34
-rw-r--r--app/controllers/projects/group_links_controller.rb2
-rw-r--r--app/controllers/projects/harbor/application_controller.rb12
-rw-r--r--app/controllers/projects/harbor/artifacts_controller.rb15
-rw-r--r--app/controllers/projects/harbor/repositories_controller.rb8
-rw-r--r--app/controllers/projects/harbor/tags_controller.rb15
-rw-r--r--app/controllers/projects/hooks_controller.rb51
-rw-r--r--app/controllers/projects/incidents_controller.rb3
-rw-r--r--app/controllers/projects/issues_controller.rb5
-rw-r--r--app/controllers/projects/jobs_controller.rb26
-rw-r--r--app/controllers/projects/logs_controller.rb103
-rw-r--r--app/controllers/projects/merge_requests_controller.rb5
-rw-r--r--app/controllers/projects/metrics_dashboard_controller.rb1
-rw-r--r--app/controllers/projects/pipelines/tests_controller.rb19
-rw-r--r--app/controllers/projects/pipelines_controller.rb12
-rw-r--r--app/controllers/projects/project_members_controller.rb4
-rw-r--r--app/controllers/projects/registry/repositories_controller.rb4
-rw-r--r--app/controllers/projects/service_ping_controller.rb3
-rw-r--r--app/controllers/projects/settings/integrations_controller.rb5
-rw-r--r--app/controllers/projects/settings/operations_controller.rb18
-rw-r--r--app/controllers/projects/tags/releases_controller.rb2
-rw-r--r--app/controllers/projects/tags_controller.rb2
-rw-r--r--app/controllers/projects/tracings_controller.rb30
-rw-r--r--app/controllers/projects/tree_controller.rb1
-rw-r--r--app/controllers/projects_controller.rb1
-rw-r--r--app/controllers/registrations/welcome_controller.rb1
-rw-r--r--app/controllers/registrations_controller.rb3
-rw-r--r--app/controllers/search_controller.rb34
-rw-r--r--app/controllers/sessions_controller.rb2
-rw-r--r--app/controllers/users/terms_controller.rb5
-rw-r--r--app/controllers/users_controller.rb8
-rw-r--r--app/events/pages/page_deleted_event.rb3
-rw-r--r--app/events/pages/page_deployed_event.rb17
-rw-r--r--app/events/projects/project_created_event.rb17
-rw-r--r--app/events/projects/project_deleted_event.rb3
-rw-r--r--app/events/projects/project_path_changed_event.rb19
-rw-r--r--app/experiments/security_actions_continuous_onboarding_experiment.rb9
-rw-r--r--app/finders/ci/auth_job_finder.rb2
-rw-r--r--app/finders/ci/runners_finder.rb8
-rw-r--r--app/finders/clusters/agents_finder.rb19
-rw-r--r--app/finders/contributed_projects_finder.rb11
-rw-r--r--app/finders/groups/user_groups_finder.rb8
-rw-r--r--app/finders/issuable_finder.rb9
-rw-r--r--app/finders/projects_finder.rb13
-rw-r--r--app/finders/snippets_finder.rb2
-rw-r--r--app/finders/user_recent_events_finder.rb50
-rw-r--r--app/graphql/mutations/concerns/mutations/work_items/update_arguments.rb9
-rw-r--r--app/graphql/mutations/concerns/mutations/work_items/widgetable.rb25
-rw-r--r--app/graphql/mutations/notes/create/diff_note.rb3
-rw-r--r--app/graphql/mutations/pages/base.rb13
-rw-r--r--app/graphql/mutations/pages/mark_onboarding_complete.rb27
-rw-r--r--app/graphql/mutations/snippets/create.rb2
-rw-r--r--app/graphql/mutations/snippets/update.rb2
-rw-r--r--app/graphql/mutations/user_callouts/create.rb2
-rw-r--r--app/graphql/mutations/work_items/create.rb16
-rw-r--r--app/graphql/mutations/work_items/update.rb9
-rw-r--r--app/graphql/mutations/work_items/update_widgets.rb1
-rw-r--r--app/graphql/queries/container_registry/get_container_repositories.query.graphql8
-rw-r--r--app/graphql/queries/repository/path_last_commit.query.graphql59
-rw-r--r--app/graphql/resolvers/ci/jobs_resolver.rb8
-rw-r--r--app/graphql/resolvers/ci/runners_resolver.rb5
-rw-r--r--app/graphql/resolvers/ci/test_suite_resolver.rb2
-rw-r--r--app/graphql/resolvers/clusters/agents_resolver.rb6
-rw-r--r--app/graphql/resolvers/todo_resolver.rb66
-rw-r--r--app/graphql/resolvers/todos_resolver.rb69
-rw-r--r--app/graphql/types/alert_management/alert_type.rb2
-rw-r--r--app/graphql/types/ci/job_type.rb12
-rw-r--r--app/graphql/types/ci/runner_type.rb7
-rw-r--r--app/graphql/types/ci/runner_upgrade_status_type_enum.rb11
-rw-r--r--app/graphql/types/ci/variable_type.rb40
-rw-r--r--app/graphql/types/ci/variable_type_enum.rb13
-rw-r--r--app/graphql/types/group_type.rb7
-rw-r--r--app/graphql/types/issue_type_enum.rb4
-rw-r--r--app/graphql/types/mutation_type.rb1
-rw-r--r--app/graphql/types/permission_types/group_enum.rb2
-rw-r--r--app/graphql/types/project_type.rb11
-rw-r--r--app/graphql/types/query_type.rb15
-rw-r--r--app/graphql/types/release_type.rb2
-rw-r--r--app/graphql/types/user_interface.rb2
-rw-r--r--app/graphql/types/work_item_id_type.rb1
-rw-r--r--app/graphql/types/work_items/widget_interface.rb8
-rw-r--r--app/graphql/types/work_items/widgets/assignees_type.rb31
-rw-r--r--app/graphql/types/work_items/widgets/hierarchy_create_input_type.rb16
-rw-r--r--app/graphql/types/work_items/widgets/hierarchy_update_input_type.rb22
-rw-r--r--app/graphql/types/work_items/widgets/weight_input_type.rb15
-rw-r--r--app/graphql/types/work_items/widgets/weight_type.rb21
-rw-r--r--app/helpers/application_settings_helper.rb3
-rw-r--r--app/helpers/ci/pipeline_editor_helper.rb2
-rw-r--r--app/helpers/commits_helper.rb2
-rw-r--r--app/helpers/diff_helper.rb2
-rw-r--r--app/helpers/emails_helper.rb102
-rw-r--r--app/helpers/environments_helper.rb1
-rw-r--r--app/helpers/groups/group_members_helper.rb2
-rw-r--r--app/helpers/groups_helper.rb2
-rw-r--r--app/helpers/integrations_helper.rb2
-rw-r--r--app/helpers/learn_gitlab_helper.rb20
-rw-r--r--app/helpers/markup_helper.rb4
-rw-r--r--app/helpers/namespace_storage_limit_alert_helper.rb9
-rw-r--r--app/helpers/nav/new_dropdown_helper.rb2
-rw-r--r--app/helpers/packages_helper.rb10
-rw-r--r--app/helpers/projects/pipeline_helper.rb2
-rw-r--r--app/helpers/projects/project_members_helper.rb29
-rw-r--r--app/helpers/projects_helper.rb6
-rw-r--r--app/helpers/releases_helper.rb7
-rw-r--r--app/helpers/search_helper.rb18
-rw-r--r--app/helpers/sessions_helper.rb12
-rw-r--r--app/helpers/sorting_helper.rb7
-rw-r--r--app/helpers/storage_helper.rb3
-rw-r--r--app/helpers/todos_helper.rb11
-rw-r--r--app/helpers/tree_helper.rb18
-rw-r--r--app/helpers/users/callouts_helper.rb25
-rw-r--r--app/helpers/users_helper.rb2
-rw-r--r--app/helpers/visibility_level_helper.rb2
-rw-r--r--app/helpers/web_hooks/web_hooks_helper.rb27
-rw-r--r--app/mailers/emails/admin_notification.rb7
-rw-r--r--app/mailers/emails/identity_verification.rb15
-rw-r--r--app/mailers/emails/merge_requests.rb6
-rw-r--r--app/mailers/notify.rb1
-rw-r--r--app/mailers/previews/notify_preview.rb14
-rw-r--r--app/models/ability.rb7
-rw-r--r--app/models/application_setting.rb16
-rw-r--r--app/models/application_setting_implementation.rb5
-rw-r--r--app/models/authentication_event.rb5
-rw-r--r--app/models/awareness_session.rb236
-rw-r--r--app/models/ci/build.rb47
-rw-r--r--app/models/ci/build_report_result.rb4
-rw-r--r--app/models/ci/group.rb3
-rw-r--r--app/models/ci/group_variable.rb4
-rw-r--r--app/models/ci/job_artifact.rb2
-rw-r--r--app/models/ci/legacy_stage.rb73
-rw-r--r--app/models/ci/pending_build.rb14
-rw-r--r--app/models/ci/pipeline.rb85
-rw-r--r--app/models/ci/pipeline_artifact.rb17
-rw-r--r--app/models/ci/runner.rb20
-rw-r--r--app/models/ci/runner_version.rb34
-rw-r--r--app/models/ci/stage.rb2
-rw-r--r--app/models/ci/trigger.rb3
-rw-r--r--app/models/ci/variable.rb4
-rw-r--r--app/models/clusters/agent.rb2
-rw-r--r--app/models/clusters/applications/elastic_stack.rb113
-rw-r--r--app/models/clusters/cluster.rb21
-rw-r--r--app/models/clusters/concerns/elasticsearch_client.rb38
-rw-r--r--app/models/clusters/integrations/elastic_stack.rb40
-rw-r--r--app/models/clusters/integrations/prometheus.rb18
-rw-r--r--app/models/commit_status.rb9
-rw-r--r--app/models/concerns/awareness.rb41
-rw-r--r--app/models/concerns/cache_markdown_field.rb9
-rw-r--r--app/models/concerns/ci/artifactable.rb2
-rw-r--r--app/models/concerns/ci/bulk_insertable_tags.rb24
-rw-r--r--app/models/concerns/ci/has_status.rb6
-rw-r--r--app/models/concerns/each_batch.rb61
-rw-r--r--app/models/concerns/enums/ci/commit_status.rb5
-rw-r--r--app/models/concerns/integrations/has_issue_tracker_fields.rb18
-rw-r--r--app/models/concerns/integrations/slack_mattermost_notifier.rb2
-rw-r--r--app/models/concerns/loose_index_scan.rb67
-rw-r--r--app/models/concerns/milestoneable.rb2
-rw-r--r--app/models/concerns/notification_branch_selection.rb16
-rw-r--r--app/models/concerns/packages/fips.rb11
-rw-r--r--app/models/concerns/participable.rb23
-rw-r--r--app/models/concerns/require_email_verification.rb52
-rw-r--r--app/models/concerns/vulnerability_finding_helpers.rb37
-rw-r--r--app/models/container_registry/event.rb11
-rw-r--r--app/models/container_repository.rb2
-rw-r--r--app/models/customer_relations/contact.rb17
-rw-r--r--app/models/deploy_token.rb3
-rw-r--r--app/models/deployment.rb22
-rw-r--r--app/models/environment.rb8
-rw-r--r--app/models/error_tracking/client_key.rb2
-rw-r--r--app/models/group.rb20
-rw-r--r--app/models/hooks/project_hook.rb15
-rw-r--r--app/models/hooks/system_hook.rb2
-rw-r--r--app/models/hooks/web_hook.rb39
-rw-r--r--app/models/incident_management/issuable_escalation_status.rb2
-rw-r--r--app/models/integration.rb35
-rw-r--r--app/models/integrations/asana.rb37
-rw-r--r--app/models/integrations/assembla.rb29
-rw-r--r--app/models/integrations/bamboo.rb1
-rw-r--r--app/models/integrations/base_chat_notification.rb46
-rw-r--r--app/models/integrations/base_issue_tracker.rb2
-rw-r--r--app/models/integrations/campfire.rb63
-rw-r--r--app/models/integrations/confluence.rb19
-rw-r--r--app/models/integrations/datadog.rb157
-rw-r--r--app/models/integrations/discord.rb6
-rw-r--r--app/models/integrations/drone_ci.rb3
-rw-r--r--app/models/integrations/emails_on_push.rb51
-rw-r--r--app/models/integrations/external_wiki.rb22
-rw-r--r--app/models/integrations/field.rb27
-rw-r--r--app/models/integrations/flowdock.rb23
-rw-r--r--app/models/integrations/hangouts_chat.rb5
-rw-r--r--app/models/integrations/harbor.rb2
-rw-r--r--app/models/integrations/irker.rb93
-rw-r--r--app/models/integrations/jira.rb3
-rw-r--r--app/models/integrations/mattermost.rb6
-rw-r--r--app/models/integrations/microsoft_teams.rb5
-rw-r--r--app/models/integrations/mock_ci.rb2
-rw-r--r--app/models/integrations/packagist.rb51
-rw-r--r--app/models/integrations/pipelines_email.rb34
-rw-r--r--app/models/integrations/pivotaltracker.rb35
-rw-r--r--app/models/integrations/prometheus.rb66
-rw-r--r--app/models/integrations/pushover.rb141
-rw-r--r--app/models/integrations/shimo.rb18
-rw-r--r--app/models/integrations/slack.rb5
-rw-r--r--app/models/integrations/teamcity.rb5
-rw-r--r--app/models/integrations/unify_circuit.rb8
-rw-r--r--app/models/integrations/webex_teams.rb7
-rw-r--r--app/models/integrations/youtrack.rb5
-rw-r--r--app/models/integrations/zentao.rb56
-rw-r--r--app/models/issue.rb72
-rw-r--r--app/models/key.rb14
-rw-r--r--app/models/member.rb18
-rw-r--r--app/models/members/project_member.rb12
-rw-r--r--app/models/merge_request.rb5
-rw-r--r--app/models/merge_request_diff.rb51
-rw-r--r--app/models/merge_request_diff_file.rb43
-rw-r--r--app/models/namespace.rb15
-rw-r--r--app/models/namespace_setting.rb23
-rw-r--r--app/models/note.rb27
-rw-r--r--app/models/notification_recipient.rb4
-rw-r--r--app/models/oauth_access_token.rb2
-rw-r--r--app/models/operations/feature_flags_client.rb24
-rw-r--r--app/models/packages/cleanup/policy.rb15
-rw-r--r--app/models/packages/debian/file_entry.rb3
-rw-r--r--app/models/pages/virtual_domain.rb9
-rw-r--r--app/models/pages_domain.rb10
-rw-r--r--app/models/preloaders/users_max_access_level_in_projects_preloader.rb8
-rw-r--r--app/models/project.rb154
-rw-r--r--app/models/project_export_job.rb1
-rw-r--r--app/models/project_feature.rb5
-rw-r--r--app/models/project_import_state.rb9
-rw-r--r--app/models/project_setting.rb2
-rw-r--r--app/models/project_team.rb18
-rw-r--r--app/models/project_tracing_setting.rb15
-rw-r--r--app/models/projects/import_export/relation_export.rb22
-rw-r--r--app/models/projects/import_export/relation_export_upload.rb19
-rw-r--r--app/models/protected_branch.rb4
-rw-r--r--app/models/remote_mirror.rb5
-rw-r--r--app/models/repository.rb4
-rw-r--r--app/models/snippet.rb1
-rw-r--r--app/models/ssh_host_key.rb10
-rw-r--r--app/models/terraform/state.rb1
-rw-r--r--app/models/todo.rb4
-rw-r--r--app/models/user.rb118
-rw-r--r--app/models/users/callout.rb7
-rw-r--r--app/models/users/group_callout.rb3
-rw-r--r--app/models/users/in_product_marketing_email.rb2
-rw-r--r--app/models/users/namespace_callout.rb33
-rw-r--r--app/models/wiki_page.rb3
-rw-r--r--app/models/work_item.rb9
-rw-r--r--app/models/work_items/parent_link.rb19
-rw-r--r--app/models/work_items/type.rb6
-rw-r--r--app/models/work_items/widgets/assignees.rb10
-rw-r--r--app/models/work_items/widgets/description.rb4
-rw-r--r--app/models/work_items/widgets/hierarchy.rb4
-rw-r--r--app/models/work_items/widgets/weight.rb9
-rw-r--r--app/models/x509_certificate.rb2
-rw-r--r--app/models/x509_issuer.rb2
-rw-r--r--app/policies/global_policy.rb2
-rw-r--r--app/policies/group_policy.rb2
-rw-r--r--app/policies/incident_management/timeline_event_policy.rb10
-rw-r--r--app/policies/issue_policy.rb12
-rw-r--r--app/policies/merge_request_policy.rb2
-rw-r--r--app/policies/namespaces/user_namespace_policy.rb1
-rw-r--r--app/policies/project_policy.rb19
-rw-r--r--app/policies/work_item_policy.rb4
-rw-r--r--app/presenters/blob_presenter.rb2
-rw-r--r--app/presenters/ci/build_presenter.rb14
-rw-r--r--app/presenters/ci/legacy_stage_presenter.rb23
-rw-r--r--app/presenters/clusters/cluster_presenter.rb10
-rw-r--r--app/presenters/clusters/integration_presenter.rb2
-rw-r--r--app/presenters/commit_status_presenter.rb5
-rw-r--r--app/presenters/gitlab/blame_presenter.rb2
-rw-r--r--app/presenters/invitation_presenter.rb5
-rw-r--r--app/presenters/terraform/module_version_presenter.rb50
-rw-r--r--app/serializers/README.md4
-rw-r--r--app/serializers/ci/job_entity.rb2
-rw-r--r--app/serializers/ci/job_serializer.rb5
-rw-r--r--app/serializers/cluster_entity.rb14
-rw-r--r--app/serializers/cluster_serializer.rb2
-rw-r--r--app/serializers/environment_entity.rb21
-rw-r--r--app/serializers/error_tracking/error_entity.rb6
-rw-r--r--app/serializers/integrations/event_entity.rb10
-rw-r--r--app/serializers/integrations/harbor_serializers/artifact_entity.rb29
-rw-r--r--app/serializers/integrations/harbor_serializers/artifact_serializer.rb11
-rw-r--r--app/serializers/integrations/harbor_serializers/repository_entity.rb57
-rw-r--r--app/serializers/integrations/harbor_serializers/repository_serializer.rb11
-rw-r--r--app/serializers/integrations/harbor_serializers/tag_entity.rb41
-rw-r--r--app/serializers/integrations/harbor_serializers/tag_serializer.rb11
-rw-r--r--app/serializers/issue_entity.rb2
-rw-r--r--app/serializers/merge_request_basic_entity.rb1
-rw-r--r--app/serializers/stage_entity.rb22
-rw-r--r--app/services/alert_management/alerts/update_service.rb26
-rw-r--r--app/services/audit_event_service.rb7
-rw-r--r--app/services/auto_merge/base_service.rb15
-rw-r--r--app/services/bulk_imports/create_pipeline_trackers_service.rb2
-rw-r--r--app/services/ci/build_report_result_service.rb2
-rw-r--r--app/services/ci/external_pull_requests/create_pipeline_service.rb14
-rw-r--r--app/services/ci/generate_coverage_reports_service.rb13
-rw-r--r--app/services/ci/job_artifacts/create_service.rb15
-rw-r--r--app/services/ci/job_artifacts/destroy_batch_service.rb10
-rw-r--r--app/services/ci/pipeline_artifacts/coverage_report_service.rb30
-rw-r--r--app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb2
-rw-r--r--app/services/ci/queue/build_queue_service.rb26
-rw-r--r--app/services/ci/queue/builds_table_strategy.rb75
-rw-r--r--app/services/ci/queue/pending_builds_strategy.rb27
-rw-r--r--app/services/ci/runners/reconcile_existing_runner_versions_service.rb90
-rw-r--r--app/services/ci/runners/register_runner_service.rb14
-rw-r--r--app/services/ci/test_failure_history_service.rb2
-rw-r--r--app/services/ci/update_build_queue_service.rb10
-rw-r--r--app/services/ci/update_pending_build_service.rb2
-rw-r--r--app/services/clusters/integrations/create_service.rb2
-rw-r--r--app/services/concerns/alert_management/alert_processing.rb18
-rw-r--r--app/services/concerns/integrations/project_test_data.rb2
-rw-r--r--app/services/concerns/work_items/widgetable_service.rb26
-rw-r--r--app/services/deployments/create_for_build_service.rb12
-rw-r--r--app/services/error_tracking/list_issues_service.rb1
-rw-r--r--app/services/event_create_service.rb37
-rw-r--r--app/services/feature_flags/base_service.rb4
-rw-r--r--app/services/feature_flags/create_service.rb2
-rw-r--r--app/services/feature_flags/destroy_service.rb2
-rw-r--r--app/services/feature_flags/update_service.rb2
-rw-r--r--app/services/git/branch_hooks_service.rb8
-rw-r--r--app/services/git/branch_push_service.rb4
-rw-r--r--app/services/google_cloud/base_service.rb65
-rw-r--r--app/services/google_cloud/create_service_accounts_service.rb18
-rw-r--r--app/services/google_cloud/enable_cloud_run_service.rb15
-rw-r--r--app/services/google_cloud/gcp_region_add_or_replace_service.rb4
-rw-r--r--app/services/google_cloud/generate_pipeline_service.rb2
-rw-r--r--app/services/google_cloud/service_accounts_service.rb36
-rw-r--r--app/services/google_cloud/setup_cloudsql_instance_service.rb74
-rw-r--r--app/services/gravatar_service.rb1
-rw-r--r--app/services/groups/base_service.rb4
-rw-r--r--app/services/groups/create_service.rb2
-rw-r--r--app/services/groups/group_links/destroy_service.rb2
-rw-r--r--app/services/groups/transfer_service.rb6
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/after_update_service.rb22
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/build_service.rb17
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb2
-rw-r--r--app/services/incident_management/timeline_events/create_service.rb48
-rw-r--r--app/services/incident_management/timeline_events/update_service.rb5
-rw-r--r--app/services/issuable/clone/attributes_rewriter.rb126
-rw-r--r--app/services/issuable/clone/base_service.rb40
-rw-r--r--app/services/issuable/import_csv/base_service.rb3
-rw-r--r--app/services/issuable_base_service.rb23
-rw-r--r--app/services/issuable_links/create_service.rb2
-rw-r--r--app/services/issues/build_service.rb15
-rw-r--r--app/services/issues/clone_service.rb17
-rw-r--r--app/services/issues/close_service.rb5
-rw-r--r--app/services/issues/create_service.rb21
-rw-r--r--app/services/issues/move_service.rb1
-rw-r--r--app/services/issues/related_branches_service.rb33
-rw-r--r--app/services/issues/reopen_service.rb7
-rw-r--r--app/services/issues/update_service.rb3
-rw-r--r--app/services/members/create_service.rb2
-rw-r--r--app/services/members/creator_service.rb98
-rw-r--r--app/services/members/invite_member_builder.rb19
-rw-r--r--app/services/members/invite_service.rb4
-rw-r--r--app/services/members/projects/creator_service.rb2
-rw-r--r--app/services/members/standard_member_builder.rb23
-rw-r--r--app/services/merge_requests/approval_service.rb2
-rw-r--r--app/services/merge_requests/base_service.rb12
-rw-r--r--app/services/merge_requests/create_pipeline_service.rb8
-rw-r--r--app/services/namespaces/in_product_marketing_emails_service.rb5
-rw-r--r--app/services/notification_recipients/builder/base.rb10
-rw-r--r--app/services/packages/cleanup/execute_policy_service.rb98
-rw-r--r--app/services/packages/debian/create_package_file_service.rb3
-rw-r--r--app/services/packages/debian/extract_changes_metadata_service.rb3
-rw-r--r--app/services/packages/debian/generate_distribution_service.rb3
-rw-r--r--app/services/packages/mark_package_files_for_destruction_service.rb35
-rw-r--r--app/services/packages/pypi/create_package_service.rb2
-rw-r--r--app/services/pages/delete_service.rb3
-rw-r--r--app/services/pod_logs/base_service.rb91
-rw-r--r--app/services/pod_logs/elasticsearch_service.rb98
-rw-r--r--app/services/pod_logs/kubernetes_service.rb151
-rw-r--r--app/services/preview_markdown_service.rb2
-rw-r--r--app/services/projects/after_rename_service.rb13
-rw-r--r--app/services/projects/blame_service.rb9
-rw-r--r--app/services/projects/create_service.rb12
-rw-r--r--app/services/projects/destroy_service.rb41
-rw-r--r--app/services/projects/fork_service.rb16
-rw-r--r--app/services/projects/group_links/update_service.rb2
-rw-r--r--app/services/projects/move_deploy_keys_projects_service.rb11
-rw-r--r--app/services/projects/operations/update_service.rb10
-rw-r--r--app/services/projects/update_pages_service.rb143
-rw-r--r--app/services/projects/update_service.rb16
-rw-r--r--app/services/protected_branches/access_level_params.rb37
-rw-r--r--app/services/protected_branches/api_service.rb4
-rw-r--r--app/services/protected_refs/access_level_params.rb37
-rw-r--r--app/services/quick_actions/interpret_service.rb46
-rw-r--r--app/services/repositories/changelog_service.rb7
-rw-r--r--app/services/resource_access_tokens/create_service.rb2
-rw-r--r--app/services/search_service.rb17
-rw-r--r--app/services/service_ping/submit_service.rb13
-rw-r--r--app/services/system_notes/incidents_service.rb8
-rw-r--r--app/services/terraform/states/trigger_destroy_service.rb6
-rw-r--r--app/services/users/activity_service.rb2
-rw-r--r--app/services/web_hook_service.rb17
-rw-r--r--app/services/web_hooks/destroy_service.rb3
-rw-r--r--app/services/web_hooks/log_execution_service.rb1
-rw-r--r--app/services/work_items/create_and_link_service.rb6
-rw-r--r--app/services/work_items/create_from_task_service.rb3
-rw-r--r--app/services/work_items/create_service.rb23
-rw-r--r--app/services/work_items/parent_links/create_service.rb60
-rw-r--r--app/services/work_items/parent_links/destroy_service.rb32
-rw-r--r--app/services/work_items/task_list_reference_removal_service.rb15
-rw-r--r--app/services/work_items/task_list_reference_replacement_service.rb9
-rw-r--r--app/services/work_items/update_service.rb30
-rw-r--r--app/services/work_items/widgets/base_service.rb16
-rw-r--r--app/services/work_items/widgets/description_service/update_service.rb15
-rw-r--r--app/services/work_items/widgets/hierarchy_service/base_service.rb79
-rw-r--r--app/services/work_items/widgets/hierarchy_service/create_service.rb15
-rw-r--r--app/services/work_items/widgets/hierarchy_service/update_service.rb15
-rw-r--r--app/services/work_items/widgets/weight_service/update_service.rb15
-rw-r--r--app/views/admin/application_settings/_eks.html.haml2
-rw-r--r--app/views/admin/application_settings/_error_tracking.html.haml40
-rw-r--r--app/views/admin/application_settings/_external_authorization_service_form.html.haml2
-rw-r--r--app/views/admin/application_settings/_floc.html.haml2
-rw-r--r--app/views/admin/application_settings/_gitpod.html.haml4
-rw-r--r--app/views/admin/application_settings/_grafana.html.haml2
-rw-r--r--app/views/admin/application_settings/_jira_connect_application_key.html.haml4
-rw-r--r--app/views/admin/application_settings/_kroki.html.haml2
-rw-r--r--app/views/admin/application_settings/_mailgun.html.haml4
-rw-r--r--app/views/admin/application_settings/_package_registry.html.haml2
-rw-r--r--app/views/admin/application_settings/_performance_bar.html.haml2
-rw-r--r--app/views/admin/application_settings/_plantuml.html.haml4
-rw-r--r--app/views/admin/application_settings/_prometheus.html.haml2
-rw-r--r--app/views/admin/application_settings/_registry.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_check.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_mirrors_form.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_static_objects.html.haml2
-rw-r--r--app/views/admin/application_settings/_signup.html.haml2
-rw-r--r--app/views/admin/application_settings/_snowplow.html.haml2
-rw-r--r--app/views/admin/application_settings/_sourcegraph.html.haml2
-rw-r--r--app/views/admin/application_settings/_spam.html.haml2
-rw-r--r--app/views/admin/application_settings/_terminal.html.haml2
-rw-r--r--app/views/admin/application_settings/_third_party_offers.html.haml4
-rw-r--r--app/views/admin/application_settings/_visibility_and_access.html.haml4
-rw-r--r--app/views/admin/application_settings/appearances/_form.html.haml2
-rw-r--r--app/views/admin/application_settings/ci/_header.html.haml2
-rw-r--r--app/views/admin/application_settings/ci_cd.html.haml6
-rw-r--r--app/views/admin/application_settings/general.html.haml23
-rw-r--r--app/views/admin/application_settings/metrics_and_profiling.html.haml10
-rw-r--r--app/views/admin/application_settings/network.html.haml28
-rw-r--r--app/views/admin/application_settings/preferences.html.haml16
-rw-r--r--app/views/admin/application_settings/reporting.html.haml6
-rw-r--r--app/views/admin/application_settings/repository.html.haml10
-rw-r--r--app/views/admin/applications/_form.html.haml2
-rw-r--r--app/views/admin/broadcast_messages/_form.html.haml2
-rw-r--r--app/views/admin/groups/_form.html.haml72
-rw-r--r--app/views/admin/identities/_form.html.haml2
-rw-r--r--app/views/admin/identities/index.html.haml1
-rw-r--r--app/views/admin/system_info/show.html.haml4
-rw-r--r--app/views/admin/topics/_topic.html.haml1
-rw-r--r--app/views/admin/users/_access_levels.html.haml100
-rw-r--r--app/views/admin/users/_admin_notes.html.haml15
-rw-r--r--app/views/admin/users/_form.html.haml116
-rw-r--r--app/views/admin/users/_head.html.haml13
-rw-r--r--app/views/admin/users/_users.html.haml2
-rw-r--r--app/views/clusters/clusters/_integrations.html.haml12
-rw-r--r--app/views/clusters/clusters/_namespace.html.haml2
-rw-r--r--app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml7
-rw-r--r--app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml10
-rw-r--r--app/views/dashboard/_activities.html.haml2
-rw-r--r--app/views/dashboard/projects/_blank_state_welcome.html.haml2
-rw-r--r--app/views/dashboard/todos/_todo.html.haml10
-rw-r--r--app/views/devise/passwords/edit.html.haml13
-rw-r--r--app/views/devise/sessions/_new_ldap.html.haml2
-rw-r--r--app/views/devise/sessions/email_verification.haml19
-rw-r--r--app/views/devise/sessions/new.html.haml2
-rw-r--r--app/views/devise/sessions/successful_verification.haml11
-rw-r--r--app/views/devise/shared/_signup_box.html.haml7
-rw-r--r--app/views/errors/not_found.html.haml3
-rw-r--r--app/views/errors/omniauth_error.html.haml16
-rw-r--r--app/views/groups/_activities.html.haml2
-rw-r--r--app/views/groups/_group_admin_settings.html.haml59
-rw-r--r--app/views/groups/_import_group_from_another_instance_panel.html.haml2
-rw-r--r--app/views/groups/_import_group_from_file_panel.html.haml34
-rw-r--r--app/views/groups/_new_group_fields.html.haml4
-rw-r--r--app/views/groups/_shared_projects.html.haml2
-rw-r--r--app/views/groups/group_members/index.html.haml23
-rw-r--r--app/views/groups/harbor/repositories/index.html.haml2
-rw-r--r--app/views/groups/merge_requests.html.haml2
-rw-r--r--app/views/groups/runners/show.html.haml8
-rw-r--r--app/views/groups/settings/_general.html.haml10
-rw-r--r--app/views/groups/settings/_permissions.html.haml16
-rw-r--r--app/views/groups/settings/_project_creation_level.html.haml2
-rw-r--r--app/views/groups/settings/_resource_access_token_creation.html.haml5
-rw-r--r--app/views/groups/settings/_subgroup_creation_level.html.haml2
-rw-r--r--app/views/groups/settings/_transfer.html.haml2
-rw-r--r--app/views/groups/settings/_two_factor_auth.html.haml8
-rw-r--r--app/views/groups/settings/ci_cd/_auto_devops_form.html.haml2
-rw-r--r--app/views/groups/settings/ci_cd/_form.html.haml1
-rw-r--r--app/views/groups/settings/packages_and_registries/show.html.haml3
-rw-r--r--app/views/groups/settings/repository/_default_branch.html.haml2
-rw-r--r--app/views/groups/show.html.haml6
-rw-r--r--app/views/import/bitbucket/status.html.haml2
-rw-r--r--app/views/import/bitbucket_server/new.html.haml2
-rw-r--r--app/views/import/bitbucket_server/status.html.haml2
-rw-r--r--app/views/import/bulk_imports/status.html.haml1
-rw-r--r--app/views/import/fogbugz/new.html.haml2
-rw-r--r--app/views/import/fogbugz/new_user_map.html.haml2
-rw-r--r--app/views/import/fogbugz/status.html.haml2
-rw-r--r--app/views/import/gitlab/status.html.haml2
-rw-r--r--app/views/layouts/_bizible.html.haml1
-rw-r--r--app/views/layouts/_flash.html.haml3
-rw-r--r--app/views/layouts/_header_search.html.haml4
-rw-r--r--app/views/layouts/_page.html.haml1
-rw-r--r--app/views/layouts/devise.html.haml2
-rw-r--r--app/views/layouts/devise_empty.html.haml2
-rw-r--r--app/views/layouts/group.html.haml2
-rw-r--r--app/views/layouts/mailer.html.haml4
-rw-r--r--app/views/layouts/mailer.text.erb2
-rw-r--r--app/views/layouts/nav/_breadcrumbs.html.haml2
-rw-r--r--app/views/layouts/notify.html.haml11
-rw-r--r--app/views/layouts/notify.text.erb2
-rw-r--r--app/views/layouts/project.html.haml5
-rw-r--r--app/views/layouts/signup_onboarding.html.haml2
-rw-r--r--app/views/notify/_failed_builds.html.haml8
-rw-r--r--app/views/notify/_reassigned_issuable_email.html.haml11
-rw-r--r--app/views/notify/_relabeled_issuable_email.html.haml3
-rw-r--r--app/views/notify/_removal_notification.html.haml14
-rw-r--r--app/views/notify/_successful_pipeline.html.haml31
-rw-r--r--app/views/notify/approved_merge_request_email.html.haml4
-rw-r--r--app/views/notify/autodevops_disabled_email.html.haml38
-rw-r--r--app/views/notify/changed_milestone_email.html.haml4
-rw-r--r--app/views/notify/closed_merge_request_email.html.haml5
-rw-r--r--app/views/notify/member_access_denied_email.html.haml11
-rw-r--r--app/views/notify/merge_when_pipeline_succeeds_email.html.haml4
-rw-r--r--app/views/notify/unapproved_merge_request_email.html.haml4
-rw-r--r--app/views/notify/user_auto_banned_email.html.haml2
-rw-r--r--app/views/notify/user_auto_banned_email.text.erb2
-rw-r--r--app/views/notify/verification_instructions_email.html.haml12
-rw-r--r--app/views/notify/verification_instructions_email.text.erb8
-rw-r--r--app/views/profiles/_email_settings.html.haml4
-rw-r--r--app/views/profiles/_name.html.haml4
-rw-r--r--app/views/profiles/accounts/show.html.haml10
-rw-r--r--app/views/profiles/gpg_keys/_form.html.haml2
-rw-r--r--app/views/profiles/passwords/edit.html.haml5
-rw-r--r--app/views/profiles/passwords/new.html.haml5
-rw-r--r--app/views/profiles/show.html.haml36
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml2
-rw-r--r--app/views/projects/_activity.html.haml2
-rw-r--r--app/views/projects/_files.html.haml2
-rw-r--r--app/views/projects/_import_project_pane.html.haml8
-rw-r--r--app/views/projects/_merge_request_squash_options_settings.html.haml2
-rw-r--r--app/views/projects/_new_project_fields.html.haml13
-rw-r--r--app/views/projects/_remove.html.haml2
-rw-r--r--app/views/projects/_remove_fork.html.haml2
-rw-r--r--app/views/projects/_stat_anchor_list.html.haml2
-rw-r--r--app/views/projects/_transfer.html.haml2
-rw-r--r--app/views/projects/activity.html.haml1
-rw-r--r--app/views/projects/blame/show.html.haml2
-rw-r--r--app/views/projects/blob/_blob.html.haml4
-rw-r--r--app/views/projects/blob/_remove.html.haml16
-rw-r--r--app/views/projects/blob/show.html.haml3
-rw-r--r--app/views/projects/blob/viewers/_stl.html.haml8
-rw-r--r--app/views/projects/branches/_branch.html.haml4
-rw-r--r--app/views/projects/ci/builds/_build.html.haml2
-rw-r--r--app/views/projects/commit/_change.html.haml21
-rw-r--r--app/views/projects/commits/_commit.html.haml2
-rw-r--r--app/views/projects/diffs/_content.html.haml4
-rw-r--r--app/views/projects/edit.html.haml4
-rw-r--r--app/views/projects/empty.html.haml4
-rw-r--r--app/views/projects/find_file/show.html.haml2
-rw-r--r--app/views/projects/forks/new.html.haml2
-rw-r--r--app/views/projects/google_cloud/configuration/index.html.haml7
-rw-r--r--app/views/projects/google_cloud/databases/index.html.haml7
-rw-r--r--app/views/projects/google_cloud/deployments/index.html.haml7
-rw-r--r--app/views/projects/google_cloud/errors/gcp_error.html.haml6
-rw-r--r--app/views/projects/google_cloud/errors/no_gcp_projects.html.haml6
-rw-r--r--app/views/projects/google_cloud/gcp_regions/index.html.haml6
-rw-r--r--app/views/projects/google_cloud/index.html.haml6
-rw-r--r--app/views/projects/google_cloud/service_accounts/index.html.haml6
-rw-r--r--app/views/projects/harbor/repositories/index.html.haml2
-rw-r--r--app/views/projects/imports/show.html.haml5
-rw-r--r--app/views/projects/incidents/show.html.haml1
-rw-r--r--app/views/projects/issues/_discussion.html.haml2
-rw-r--r--app/views/projects/issues/_issue.html.haml7
-rw-r--r--app/views/projects/issues/_work_item_links.html.haml2
-rw-r--r--app/views/projects/issues/show.html.haml1
-rw-r--r--app/views/projects/jobs/index.html.haml10
-rw-r--r--app/views/projects/jobs/show.html.haml5
-rw-r--r--app/views/projects/labels/index.html.haml1
-rw-r--r--app/views/projects/logs/empty_logs.html.haml14
-rw-r--r--app/views/projects/logs/index.html.haml1
-rw-r--r--app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml4
-rw-r--r--app/views/projects/merge_requests/_commits.html.haml2
-rw-r--r--app/views/projects/merge_requests/_mr_title.html.haml2
-rw-r--r--app/views/projects/merge_requests/creations/_new_compare.html.haml2
-rw-r--r--app/views/projects/merge_requests/show.html.haml3
-rw-r--r--app/views/projects/milestones/_form.html.haml2
-rw-r--r--app/views/projects/mirrors/_mirror_repos.html.haml2
-rw-r--r--app/views/projects/mirrors/_ssh_host_keys.html.haml2
-rw-r--r--app/views/projects/new.html.haml4
-rw-r--r--app/views/projects/pipelines/_info.html.haml12
-rw-r--r--app/views/projects/pipelines/show.html.haml2
-rw-r--r--app/views/projects/project_members/index.html.haml66
-rw-r--r--app/views/projects/protected_branches/shared/_create_protected_branch.html.haml22
-rw-r--r--app/views/projects/protected_branches/shared/_dropdown.html.haml8
-rw-r--r--app/views/projects/protected_tags/shared/_create_protected_tag.html.haml2
-rw-r--r--app/views/projects/settings/_archive.html.haml4
-rw-r--r--app/views/projects/settings/ci_cd/_autodevops_form.html.haml2
-rw-r--r--app/views/projects/settings/ci_cd/_form.html.haml2
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml10
-rw-r--r--app/views/projects/settings/operations/_tracing.html.haml24
-rw-r--r--app/views/projects/settings/operations/show.html.haml3
-rw-r--r--app/views/projects/settings/packages_and_registries/show.html.haml2
-rw-r--r--app/views/projects/show.html.haml1
-rw-r--r--app/views/projects/tags/_edit_release_button.html.haml11
-rw-r--r--app/views/projects/tags/_tag.html.haml3
-rw-r--r--app/views/projects/tags/show.html.haml5
-rw-r--r--app/views/projects/tracings/_tracing_button.html.haml2
-rw-r--r--app/views/projects/tracings/show.html.haml50
-rw-r--r--app/views/projects/triggers/_form.html.haml2
-rw-r--r--app/views/projects/work_items/index.html.haml2
-rw-r--r--app/views/pwa/offline.html.haml2
-rw-r--r--app/views/shared/_allow_request_access.html.haml2
-rw-r--r--app/views/shared/_group_form.html.haml51
-rw-r--r--app/views/shared/_integration_settings.html.haml2
-rw-r--r--app/views/shared/_label.html.haml27
-rw-r--r--app/views/shared/_old_visibility_level.html.haml9
-rw-r--r--app/views/shared/_visibility_level.html.haml4
-rw-r--r--app/views/shared/_visibility_radios.html.haml16
-rw-r--r--app/views/shared/admin/_admin_note_form.html.haml8
-rw-r--r--app/views/shared/deploy_keys/_form.html.haml13
-rw-r--r--app/views/shared/deploy_keys/_project_group_form.html.haml4
-rw-r--r--app/views/shared/doorkeeper/applications/_form.html.haml2
-rw-r--r--app/views/shared/doorkeeper/applications/_index.html.haml28
-rw-r--r--app/views/shared/empty_states/_snippets.html.haml8
-rw-r--r--app/views/shared/form_elements/_apply_template_warning.html.haml4
-rw-r--r--app/views/shared/form_elements/_description.html.haml2
-rw-r--r--app/views/shared/groups/_group_name_and_path_fields.html.haml2
-rw-r--r--app/views/shared/issuable/_bulk_update_sidebar.html.haml10
-rw-r--r--app/views/shared/issuable/_form.html.haml6
-rw-r--r--app/views/shared/issuable/form/_contribution.html.haml13
-rw-r--r--app/views/shared/issuable/form/_type_selector.html.haml60
-rw-r--r--app/views/shared/issue_type/_details_content.html.haml1
-rw-r--r--app/views/shared/members/_member.html.haml3
-rw-r--r--app/views/shared/milestones/_header.html.haml18
-rw-r--r--app/views/shared/runners/_form.html.haml2
-rw-r--r--app/views/shared/snippets/_form.html.haml2
-rw-r--r--app/views/shared/web_hooks/_form.html.haml2
-rw-r--r--app/views/shared/wikis/edit.html.haml2
-rw-r--r--app/views/users/_profile_basic_info.html.haml3
-rw-r--r--app/workers/all_queues.yml105
-rw-r--r--app/workers/authorized_projects_worker.rb11
-rw-r--r--app/workers/build_hooks_worker.rb12
-rw-r--r--app/workers/bulk_imports/pipeline_worker.rb8
-rw-r--r--app/workers/ci/archive_trace_worker.rb8
-rw-r--r--app/workers/ci/build_finished_worker.rb13
-rw-r--r--app/workers/ci/pipeline_artifacts/coverage_report_worker.rb10
-rw-r--r--app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb23
-rw-r--r--app/workers/clusters/applications/activate_service_worker.rb12
-rw-r--r--app/workers/clusters/applications/deactivate_service_worker.rb12
-rw-r--r--app/workers/concerns/gitlab/github_import/object_importer.rb6
-rw-r--r--app/workers/concerns/gitlab/github_import/stage_methods.rb6
-rw-r--r--app/workers/concerns/packages/cleanup_artifact_worker.rb15
-rw-r--r--app/workers/concerns/waitable_worker.rb22
-rw-r--r--app/workers/container_registry/migration/enqueuer_worker.rb11
-rw-r--r--app/workers/deployments/hooks_worker.rb2
-rw-r--r--app/workers/gitlab/github_import/advance_stage_worker.rb1
-rw-r--r--app/workers/gitlab/github_import/import_issue_event_worker.rb21
-rw-r--r--app/workers/gitlab/github_import/stage/import_issue_events_worker.rb47
-rw-r--r--app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb2
-rw-r--r--app/workers/gitlab_service_ping_worker.rb2
-rw-r--r--app/workers/google_cloud/create_cloudsql_instance_worker.rb38
-rw-r--r--app/workers/incident_management/close_incident_worker.rb43
-rw-r--r--app/workers/irker_worker.rb9
-rw-r--r--app/workers/loose_foreign_keys/cleanup_worker.rb2
-rw-r--r--app/workers/packages/cleanup/execute_policy_worker.rb72
-rw-r--r--app/workers/packages/cleanup_package_registry_worker.rb8
-rw-r--r--app/workers/packages/debian/generate_distribution_worker.rb3
-rw-r--r--app/workers/packages/debian/process_changes_worker.rb5
-rw-r--r--app/workers/pages/invalidate_domain_cache_worker.rb25
-rw-r--r--app/workers/pages_transfer_worker.rb20
-rw-r--r--app/workers/post_receive.rb13
-rw-r--r--app/workers/project_service_worker.rb16
-rw-r--r--app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb12
-rw-r--r--app/workers/web_hooks/destroy_worker.rb27
-rw-r--r--config/application.rb27
-rw-r--r--config/environments/development.rb4
-rw-r--r--config/events/1655179428_design_actions_create_.yml25
-rw-r--r--config/events/1655179485_design_actions_update_.yml25
-rw-r--r--config/events/1655179517_design_actions_destroy_.yml25
-rw-r--r--config/events/1655281022_i_search_total.yml25
-rw-r--r--config/events/1655726589_ide_edit_g_edit_by_web_ide.yml22
-rw-r--r--config/events/1655726622_ide_edit_g_edit_by_live_preview.yml22
-rw-r--r--config/events/1655726650_ide_edit_g_edit_by_sfe.yml22
-rw-r--r--config/events/1655726683_ide_edit_g_edit_by_snippet_ide.yml22
-rw-r--r--config/events/1655841083_projects_settings_cicd_show_render.yml26
-rw-r--r--config/events/1655841352_projects_settings_cicd_show_upload.yml25
-rw-r--r--config/events/1655841364_projects_settings_cicd_show_delete.yml25
-rw-r--r--config/events/1656510012_merge_requests_i_code_review_user_approve_mr.yml26
-rw-r--r--config/events/1656554755_issues_edit_g_project_management_issue_added_to_epic.yml20
-rw-r--r--config/events/1656555050_issues_edit_g_project_management_issue_changed_epic.yml20
-rw-r--r--config/events/1656555163_issues_edit_g_project_management_issue_health_status_changed.yml20
-rw-r--r--config/events/1656555272_issues_edit_g_project_management_issue_iteration_changed.yml20
-rw-r--r--config/events/1656555342_issues_edit_g_project_management_issue_removed_from_epic.yml20
-rw-r--r--config/events/1656555426_issues_edit_g_project_management_issue_weight_changed.yml20
-rw-r--r--config/events/1656690716_post_receive_source_code_pushes.yml26
-rw-r--r--config/feature_flags/development/about_your_company_registration_flow.yml2
-rw-r--r--config/feature_flags/development/access_token_pagination.yml8
-rw-r--r--config/feature_flags/development/active_support_hash_digest_sha256.yml8
-rw-r--r--config/feature_flags/development/allow_possible_spam.yml2
-rw-r--r--config/feature_flags/development/approval_rules_pagination.yml8
-rw-r--r--config/feature_flags/development/auto_ban_user_on_excessive_projects_download.yml8
-rw-r--r--config/feature_flags/development/batch_load_environment_last_deployment_group.yml2
-rw-r--r--config/feature_flags/development/blame_page_pagination.yml2
-rw-r--r--config/feature_flags/development/cache_pages_domain_api.yml8
-rw-r--r--config/feature_flags/development/cache_unleash_client_api.yml8
-rw-r--r--config/feature_flags/development/change_response_code_merge_status.yml2
-rw-r--r--config/feature_flags/development/ci_build_finished_worker_namespace_changed.yml8
-rw-r--r--config/feature_flags/development/ci_child_pipeline_coverage_reports.yml8
-rw-r--r--config/feature_flags/development/ci_disallow_to_create_merge_request_pipelines_in_target_project.yml8
-rw-r--r--config/feature_flags/development/ci_docker_image_pull_policy.yml2
-rw-r--r--config/feature_flags/development/ci_increase_includes_to_250.yml8
-rw-r--r--config/feature_flags/development/ci_minimal_cost_factor_for_gitlab_contributors.yml8
-rw-r--r--config/feature_flags/development/ci_minutes_cost_factor_for_all_public_projects.yml8
-rw-r--r--config/feature_flags/development/ci_pending_builds_maintain_denormalized_data.yml8
-rw-r--r--config/feature_flags/development/ci_pending_builds_queue_source.yml8
-rw-r--r--config/feature_flags/development/ci_queuing_use_denormalized_data_strategy.yml8
-rw-r--r--config/feature_flags/development/closed_as_duplicate_of_issues_api.yml8
-rw-r--r--config/feature_flags/development/confidential_notes.yml8
-rw-r--r--config/feature_flags/development/contacts_autocomplete.yml8
-rw-r--r--config/feature_flags/development/container_registry_legacy_authentication_for_deploy_tokens.yml8
-rw-r--r--config/feature_flags/development/container_registry_show_shortened_path.yml8
-rw-r--r--config/feature_flags/development/contribution_analytics_optimized_base_query.yml8
-rw-r--r--config/feature_flags/development/custom_headers_streaming_audit_events_ui.yml8
-rw-r--r--config/feature_flags/development/delay_for_repository_update_mirror.yml8
-rw-r--r--config/feature_flags/development/delayed_project_import_schedule_worker.yml8
-rw-r--r--config/feature_flags/development/deployment_hooks_skip_worker.yml8
-rw-r--r--config/feature_flags/development/edit_tag_release_notes_via_release_page.yml8
-rw-r--r--config/feature_flags/development/externally_stored_diffs_caching_export.yml8
-rw-r--r--config/feature_flags/development/file_identifier_hash.yml8
-rw-r--r--config/feature_flags/development/fix_sliding_list_partitioning.yml2
-rw-r--r--config/feature_flags/development/git_abuse_rate_limit_feature_flag.yml8
-rw-r--r--config/feature_flags/development/gitlab_error_tracking.yml8
-rw-r--r--config/feature_flags/development/group_name_path_vue.yml8
-rw-r--r--config/feature_flags/development/hard_failure_for_mirrors_without_license.yml8
-rw-r--r--config/feature_flags/development/highlight_js.yml2
-rw-r--r--config/feature_flags/development/import_release_authors_from_github.yml2
-rw-r--r--config/feature_flags/development/incident_timeline.yml2
-rw-r--r--config/feature_flags/development/infinitely_collapsible_sections.yml8
-rw-r--r--config/feature_flags/development/issue_email_participants.yml2
-rw-r--r--config/feature_flags/development/issues_full_text_search.yml2
-rw-r--r--config/feature_flags/development/job_log_search.yml8
-rw-r--r--config/feature_flags/development/jobs_table_vue.yml8
-rw-r--r--config/feature_flags/development/jobs_table_vue_search.yml8
-rw-r--r--config/feature_flags/development/legacy_merge_request_state_check_for_merged_result_pipelines.yml8
-rw-r--r--config/feature_flags/development/log_response_length.yml8
-rw-r--r--config/feature_flags/development/measure_service_ping_metric_collection.yml8
-rw-r--r--config/feature_flags/development/migrate_vulnerability_finding_uuids.yml8
-rw-r--r--config/feature_flags/development/monitor_logging.yml8
-rw-r--r--config/feature_flags/development/monitor_tracing.yml8
-rw-r--r--config/feature_flags/development/mr_experience_survey.yml8
-rw-r--r--config/feature_flags/development/mr_show_reports_immediately.yml8
-rw-r--r--config/feature_flags/development/namespace_storage_limit_show_preenforcement_banner.yml8
-rw-r--r--config/feature_flags/development/omniauth_login_minimal_scopes.yml8
-rw-r--r--config/feature_flags/development/operational_vulnerabilities_filters.yml8
-rw-r--r--config/feature_flags/development/optimized_followed_users_queries.yml8
-rw-r--r--config/feature_flags/development/paginated_issue_discussions.yml8
-rw-r--r--config/feature_flags/development/pbkdf2_password_encryption.yml8
-rw-r--r--config/feature_flags/development/pbkdf2_password_encryption_write.yml8
-rw-r--r--config/feature_flags/development/prerecord_service_ping_data.yml8
-rw-r--r--config/feature_flags/development/prevent_abusive_searches.yml8
-rw-r--r--config/feature_flags/development/projects_build_artifacts_size_refresh_high.yml8
-rw-r--r--config/feature_flags/development/projects_build_artifacts_size_refresh_low.yml8
-rw-r--r--config/feature_flags/development/projects_build_artifacts_size_refresh_medium.yml8
-rw-r--r--config/feature_flags/development/rebalance_issues.yml2
-rw-r--r--config/feature_flags/development/refactor_blob_viewer.yml8
-rw-r--r--config/feature_flags/development/refactor_code_quality_inline_findings.yml8
-rw-r--r--config/feature_flags/development/refactor_mr_widgets_extensions.yml2
-rw-r--r--config/feature_flags/development/rename_integrations_workers.yml8
-rw-r--r--config/feature_flags/development/require_email_verification.yml8
-rw-r--r--config/feature_flags/development/show_minute_limit_banner.yml8
-rw-r--r--config/feature_flags/development/skip_group_share_unlink_auth_refresh.yml8
-rw-r--r--config/feature_flags/development/skip_scheduling_mirrors_for_free.yml8
-rw-r--r--config/feature_flags/development/split_operations_visibility_permissions.yml8
-rw-r--r--config/feature_flags/development/ssh_banned_key.yml8
-rw-r--r--config/feature_flags/development/standard_context_type_check.yml8
-rw-r--r--config/feature_flags/development/sticky_ci_archive_trace_worker.yml8
-rw-r--r--config/feature_flags/development/subgroups_approval_rules.yml8
-rw-r--r--config/feature_flags/development/tag_list_keyset_pagination.yml2
-rw-r--r--config/feature_flags/development/trigger_job_retry_action.yml8
-rw-r--r--config/feature_flags/development/update_oauth_registration_flow.yml6
-rw-r--r--config/feature_flags/development/use_click_house_database_for_error_tracking.yml8
-rw-r--r--config/feature_flags/development/use_keyset_aware_user_search_query.yml8
-rw-r--r--config/feature_flags/development/use_redis_hll_instrumentation_classes.yml8
-rw-r--r--config/feature_flags/development/use_status_for_repository_update_mirror.yml8
-rw-r--r--config/feature_flags/development/vsa_reaggregation_worker.yml8
-rw-r--r--config/feature_flags/development/web_hooks_no_rate_limit.yml8
-rw-r--r--config/feature_flags/development/webhooks_failed_callout.yml8
-rw-r--r--config/feature_flags/development/wiki_front_matter.yml8
-rw-r--r--config/feature_flags/experiment/combined_registration.yml2
-rw-r--r--config/feature_flags/experiment/invite_members_in_side_nav.yml2
-rw-r--r--config/feature_flags/experiment/null_hypothesis.yml2
-rw-r--r--config/feature_flags/experiment/pql_three_cta_test.yml2
-rw-r--r--config/feature_flags/experiment/security_actions_continuous_onboarding.yml8
-rw-r--r--config/feature_flags/experiment/security_reports_mr_widget_prompt.yml2
-rw-r--r--config/feature_flags/experiment/showcase_free_security_features.yml8
-rw-r--r--config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml2
-rw-r--r--config/feature_flags/ops/batched_migrations_health_status_autovacuum.yml8
-rw-r--r--config/feature_flags/ops/ci_minimal_cost_factor_for_gitlab_namespaces.yml8
-rw-r--r--config/feature_flags/ops/ci_pipeline_age_histogram.yml8
-rw-r--r--config/feature_flags/ops/enforce_memory_watchdog.yml8
-rw-r--r--config/feature_flags/ops/github_importer_issue_events_import.yml8
-rw-r--r--config/feature_flags/ops/gitlab_experiment.yml2
-rw-r--r--config/feature_flags/ops/gitlab_memory_watchdog.yml8
-rw-r--r--config/feature_flags/ops/projects_build_artifacts_size_refresh.yml8
-rw-r--r--config/feature_flags/ops/remote_mirror_no_delay.yml7
-rw-r--r--config/feature_flags/undefined/gitaly_revlist_for_repo_size.yml8
-rw-r--r--config/gitlab.yml.example24
-rw-r--r--config/gitlab_loose_foreign_keys.yml4
-rw-r--r--config/initializers/00_connection_logger.rb26
-rw-r--r--config/initializers/0_log_deprecations.rb14
-rw-r--r--config/initializers/1_acts_as_taggable.rb33
-rw-r--r--config/initializers/1_settings.rb11
-rw-r--r--config/initializers/8_devise.rb2
-rw-r--r--config/initializers/database_config.rb6
-rw-r--r--config/initializers/doorkeeper.rb2
-rw-r--r--config/initializers/enumerator_next_patch.rb44
-rw-r--r--config/initializers/memory_watchdog.rb19
-rw-r--r--config/initializers/peek.rb5
-rw-r--r--config/initializers/rack_timeout.rb4
-rw-r--r--config/initializers/set_active_support_hash_digest_class.rb11
-rw-r--r--config/initializers/wikicloth_redos_patch.rb75
-rw-r--r--config/locales/en.yml3
-rw-r--r--config/metrics/aggregates/common.yml10
-rw-r--r--config/metrics/counts_28d/20210201124930_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175055_merge_requests.yml2
-rw-r--r--config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml2
-rw-r--r--config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml2
-rw-r--r--config/metrics/counts_28d/20210216175101_merge_requests_users.yml2
-rw-r--r--config/metrics/counts_28d/20210216175109_suggestions.yml2
-rw-r--r--config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml2
-rw-r--r--config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml2
-rw-r--r--config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml2
-rw-r--r--config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml2
-rw-r--r--config/metrics/counts_28d/20210216175413_clusters_management_project.yml2
-rw-r--r--config/metrics/counts_28d/20210216175415_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175417_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml2
-rw-r--r--config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml2
-rw-r--r--config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml2
-rw-r--r--config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216175542_ci_builds.yml2
-rw-r--r--config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml2
-rw-r--r--config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml2
-rw-r--r--config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml2
-rw-r--r--config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml2
-rw-r--r--config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml2
-rw-r--r--config/metrics/counts_28d/20210216175554_ci_pipelines.yml2
-rw-r--r--config/metrics/counts_28d/20210216175556_ci_triggers.yml2
-rw-r--r--config/metrics/counts_28d/20210216180308_personal_snippets.yml2
-rw-r--r--config/metrics/counts_28d/20210216180310_project_snippets.yml2
-rw-r--r--config/metrics/counts_28d/20210216180312_snippets.yml2
-rw-r--r--config/metrics/counts_28d/20210216180317_snippets.yml2
-rw-r--r--config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml2
-rw-r--r--config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml2
-rw-r--r--config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml2
-rw-r--r--config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml2
-rw-r--r--config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml2
-rw-r--r--config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml2
-rw-r--r--config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml2
-rw-r--r--config/metrics/counts_28d/20210216180524_projects_with_incidents.yml2
-rw-r--r--config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml2
-rw-r--r--config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml2
-rw-r--r--config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml2
-rw-r--r--config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml2
-rw-r--r--config/metrics/counts_28d/20210216180814_events.yml2
-rw-r--r--config/metrics/counts_28d/20210216180816_groups.yml2
-rw-r--r--config/metrics/counts_28d/20210216180818_users_created.yml2
-rw-r--r--config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml2
-rw-r--r--config/metrics/counts_28d/20210216180956_clusters.yml2
-rw-r--r--config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml2
-rw-r--r--config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml2
-rw-r--r--config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml6
-rw-r--r--config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml2
-rw-r--r--config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml2
-rw-r--r--config/metrics/counts_28d/20210216181050_packages.yml2
-rw-r--r--config/metrics/counts_28d/20210216181057_projects_with_packages.yml2
-rw-r--r--config/metrics/counts_28d/20210216181139_issues.yml2
-rw-r--r--config/metrics/counts_28d/20210216181141_notes.yml2
-rw-r--r--config/metrics/counts_28d/20210216181143_projects.yml2
-rw-r--r--config/metrics/counts_28d/20210216181145_todos.yml2
-rw-r--r--config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml2
-rw-r--r--config/metrics/counts_28d/20210216181148_service_desk_issues.yml2
-rw-r--r--config/metrics/counts_28d/20210216181150_projects_jira_active.yml2
-rw-r--r--config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml2
-rw-r--r--config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml2
-rw-r--r--config/metrics/counts_28d/20210216181158_epics.yml2
-rw-r--r--config/metrics/counts_28d/20210216181200_label_lists.yml2
-rw-r--r--config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216181923_successful_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216181924_failed_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216181935_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216181937_failed_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216181939_releases.yml2
-rw-r--r--config/metrics/counts_28d/20210216181941_successful_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml2
-rw-r--r--config/metrics/counts_28d/20210216182034_deploy_keys.yml2
-rw-r--r--config/metrics/counts_28d/20210216182036_keys.yml2
-rw-r--r--config/metrics/counts_28d/20210216182038_remote_mirrors.yml2
-rw-r--r--config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml2
-rw-r--r--config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml2
-rw-r--r--config/metrics/counts_28d/20210216182051_protected_branches.yml2
-rw-r--r--config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216182106_design_action_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216182109_project_action_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216182129_sast_pipeline.yml2
-rw-r--r--config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml2
-rw-r--r--config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml2
-rw-r--r--config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml6
-rw-r--r--config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml6
-rw-r--r--config/metrics/counts_28d/20210216183627_omniauth_providers.yml2
-rw-r--r--config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml2
-rw-r--r--config/metrics/counts_28d/20210216183640_gitlab.yml2
-rw-r--r--config/metrics/counts_28d/20210216183642_gitlab_v1.yml2
-rw-r--r--config/metrics/counts_28d/20210216183644_gitlab_project.yml2
-rw-r--r--config/metrics/counts_28d/20210216183646_gitlab.yml2
-rw-r--r--config/metrics/counts_28d/20210216183648_github.yml2
-rw-r--r--config/metrics/counts_28d/20210216183650_bitbucket.yml2
-rw-r--r--config/metrics/counts_28d/20210216183652_bitbucket_server.yml2
-rw-r--r--config/metrics/counts_28d/20210216183653_gitea.yml2
-rw-r--r--config/metrics/counts_28d/20210216183655_git.yml2
-rw-r--r--config/metrics/counts_28d/20210216183657_manifest.yml2
-rw-r--r--config/metrics/counts_28d/20210216183659_gitlab_migration.yml2
-rw-r--r--config/metrics/counts_28d/20210216183701_jira.yml2
-rw-r--r--config/metrics/counts_28d/20210216183703_fogbugz.yml2
-rw-r--r--config/metrics/counts_28d/20210216183705_phabricator.yml2
-rw-r--r--config/metrics/counts_28d/20210216183707_csv.yml2
-rw-r--r--config/metrics/counts_28d/20210216183709_group_import.yml2
-rw-r--r--config/metrics/counts_28d/20210216183711_gitlab_migration.yml2
-rw-r--r--config/metrics/counts_28d/20210216183712_total.yml2
-rw-r--r--config/metrics/counts_28d/20210216183714_gitlab_project.yml2
-rw-r--r--config/metrics/counts_28d/20210216183716_gitlab.yml2
-rw-r--r--config/metrics/counts_28d/20210216183718_github.yml2
-rw-r--r--config/metrics/counts_28d/20210216183720_bitbucket.yml2
-rw-r--r--config/metrics/counts_28d/20210216183722_bitbucket_server.yml2
-rw-r--r--config/metrics/counts_28d/20210216183724_gitea.yml2
-rw-r--r--config/metrics/counts_28d/20210216183726_git.yml2
-rw-r--r--config/metrics/counts_28d/20210216183728_manifest.yml2
-rw-r--r--config/metrics/counts_28d/20210216183730_jira.yml2
-rw-r--r--config/metrics/counts_28d/20210216183731_fogbugz.yml2
-rw-r--r--config/metrics/counts_28d/20210216183733_phabricator.yml2
-rw-r--r--config/metrics/counts_28d/20210216183735_csv.yml2
-rw-r--r--config/metrics/counts_28d/20210216183737_groups_imported.yml2
-rw-r--r--config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml6
-rw-r--r--config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml2
-rwxr-xr-xconfig/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210409095855_users_expanding_secure_security_report_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210409100451_users_expanding_testing_code_quality_report_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210409100628_users_expanding_testing_accessibility_report_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210410012206_i_package_terraform_module_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210410012208_i_package_terraform_module_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210413205507_i_testing_summary_widget_total_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210421144352_i_code_review_click_single_file_mode_setting_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210421145818_i_code_review_click_file_browser_setting_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210421145945_i_code_review_click_whitespace_setting_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422101516_i_code_review_diff_view_inline_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422101613_i_code_review_diff_view_parallel_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422101753_i_code_review_file_browser_tree_view_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422101852_i_code_review_file_browser_list_view_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422101928_i_code_review_diff_show_whitespace_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422102010_i_code_review_diff_hide_whitespace_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422102121_i_code_review_diff_single_file_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210422102202_i_code_review_diff_multiple_files_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml2
-rw-r--r--config/metrics/counts_28d/20210427103010_code_review_extension_category_monthly_active_users.yml2
-rw-r--r--config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml2
-rw-r--r--config/metrics/counts_28d/20210427105033_pipeline_authoring_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml2
-rw-r--r--config/metrics/counts_28d/20210517074859_i_package_helm_deploy_token_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210517075259_i_package_helm_user_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210520111133_total.yml2
-rw-r--r--config/metrics/counts_28d/20210607113556_i_code_review_click_diff_view_setting_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210715094458_releases_with_milestones.yml2
-rw-r--r--config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210902191057_i_quickactions_unapprove_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml2
-rw-r--r--config/metrics/counts_28d/20210916080405_promoted_issues.yml6
-rw-r--r--config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml2
-rw-r--r--config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211015154445_p_ci_templates_kaniko_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211102141250_i_quickactions_promote_to_incident_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211102205024_p_ci_templates_security_sast_iac_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211102205223_p_ci_templates_implicit_security_sast_iac_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211102213704_p_ci_templates_jobs_sast_iac_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211102213921_p_ci_templates_implicit_jobs_sast_iac_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211104154357_i_code_review_widget_nothing_merge_click_new_file_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211109114953_i_quickactions_add_contacts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211109120251_i_quickactions_remove_contacts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211111162103_i_code_review_post_merge_delete_branch_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211111162422_i_code_review_post_merge_click_revert_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211112102446_i_code_review_post_merge_click_cherry_pick_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211112114333_i_code_review_post_merge_submit_revert_modal_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211112115144_i_code_review_post_merge_submit_cherry_pick_modal_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211126090835_p_analytics_ci_cd_deployment_frequency_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211126091206_p_analytics_ci_cd_lead_time_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211201140658_users_expanding_testing_license_compliance_report_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211201154341_users_visiting_license_compliance_full_report_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211202094237_users_visiting_manage_license_compliance_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20211216083832_users_clicking_license_testing_visiting_external_website_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220121140644_user_jetbrains_api_request_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220202160126_ci_users_executing_deployment_job_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220214202927_users_updating_work_item_title.yml2
-rw-r--r--config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220222215951_xmau_plan.yml2
-rw-r--r--config/metrics/counts_28d/20220222215952_xmau_project_management.yml2
-rw-r--r--config/metrics/counts_28d/20220222215955_users_work_items.yml2
-rw-r--r--config/metrics/counts_28d/20220308234005_p_ci_templates_jobs_sast_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220309001640_p_ci_templates_jobs_secret_detection_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220310213320_p_ci_templates_implicit_jobs_secret_detection_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220310213749_p_ci_templates_implicit_jobs_sast_latest_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220428154012_live_preview.yml2
-rw-r--r--config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml7
-rw-r--r--config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20220621085114_unique_active_users_monthly.yml24
-rw-r--r--config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml26
-rw-r--r--config/metrics/counts_28d/20220706175117_ci_users_executing_verify_job_monthly.yml26
-rw-r--r--config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml26
-rw-r--r--config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216174846_p_analytics_pipelines.yml2
-rw-r--r--config/metrics/counts_7d/20210216174850_p_analytics_valuestream.yml2
-rw-r--r--config/metrics/counts_7d/20210216174856_p_analytics_repo.yml2
-rw-r--r--config/metrics/counts_7d/20210216174858_i_analytics_cohorts.yml2
-rw-r--r--config/metrics/counts_7d/20210216174900_i_analytics_dev_ops_score.yml2
-rw-r--r--config/metrics/counts_7d/20210216174902_g_analytics_merge_request.yml2
-rw-r--r--config/metrics/counts_7d/20210216174906_i_analytics_instance_statistics.yml2
-rw-r--r--config/metrics/counts_7d/20210216174908_analytics_unique_visits_for_any_target.yml2
-rw-r--r--config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216180416_i_search_total.yml2
-rw-r--r--config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml2
-rw-r--r--config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml2
-rw-r--r--config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216182104_design_action_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216182107_project_action_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml6
-rw-r--r--config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml6
-rw-r--r--config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml2
-rwxr-xr-xconfig/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210409095855_users_expanding_secure_security_report_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210409100451_users_expanding_testing_code_quality_report_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210409100628_users_expanding_testing_accessibility_report_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210410012207_i_package_terraform_module_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210410012209_i_package_terraform_module_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210413205507_i_testing_summary_widget_total_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210421144349_i_code_review_click_single_file_mode_setting_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210421145814_i_code_review_click_file_browser_setting_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210421145942_i_code_review_click_whitespace_setting_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422101512_i_code_review_diff_view_inline_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422101609_i_code_review_diff_view_parallel_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422101750_i_code_review_file_browser_tree_view_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422101849_i_code_review_file_browser_list_view_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422101925_i_code_review_diff_show_whitespace_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422102007_i_code_review_diff_hide_whitespace_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422102118_i_code_review_diff_single_file_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210422102159_i_code_review_diff_multiple_files_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210423005644_i_analytics_dev_ops_adoption.yml2
-rw-r--r--config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml2
-rw-r--r--config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml2
-rw-r--r--config/metrics/counts_7d/20210427103452_code_review_extension_category_monthly_active_users.yml2
-rw-r--r--config/metrics/counts_7d/20210427105030_pipeline_authoring_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml2
-rw-r--r--config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210517074851_i_package_helm_deploy_token_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210517075252_i_package_helm_user_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210607113552_i_code_review_click_diff_view_setting_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210902000809_p_ci_templates_implicit_auto_devops_deploy_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210902191054_i_quickactions_unapprove_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml2
-rw-r--r--config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211015154445_p_ci_templates_kaniko_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211102141244_i_quickactions_promote_to_incident_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211102202454_p_ci_templates_security_sast_iac_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211102204352_p_ci_templates_implicit_security_sast_iac_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211102213112_p_ci_templates_jobs_sast_iac_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211102213417_p_ci_templates_implicit_jobs_sast_iac_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211104154352_i_code_review_widget_nothing_merge_click_new_file_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211109114948_i_quickactions_add_contacts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211109120245_i_quickactions_remove_contacts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211111162058_i_code_review_post_merge_delete_branch_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211111162417_i_code_review_post_merge_click_revert_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211112102440_i_code_review_post_merge_click_cherry_pick_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211112114327_i_code_review_post_merge_submit_revert_modal_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211112115138_i_code_review_post_merge_submit_cherry_pick_modal_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211126090001_p_analytics_ci_cd_pipelines.yml2
-rw-r--r--config/metrics/counts_7d/20211126090002_p_analytics_ci_cd_deployment_frequency.yml2
-rw-r--r--config/metrics/counts_7d/20211126090003_p_analytics_ci_cd_lead_time.yml2
-rw-r--r--config/metrics/counts_7d/20211126090829_p_analytics_ci_cd_deployment_frequency_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211126091200_p_analytics_ci_cd_lead_time_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211126154206_users_expanding_testing_license_compliance_report_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211201154118_users_visiting_license_compliance_full_report_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211202094430_users_visiting_manage_license_compliance_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20211216084934_users_clicking_license_testing_visiting_external_website_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220121140634_user_jetbrains_api_request_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220202160120_ci_users_executing_deployment_job_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220216204730_users_updating_work_item_title_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220222215851_xmau_plan.yml2
-rw-r--r--config/metrics/counts_7d/20220222215852_xmau_project_management.yml2
-rw-r--r--config/metrics/counts_7d/20220222215855_users_work_items.yml2
-rw-r--r--config/metrics/counts_7d/20220308233959_p_ci_templates_jobs_sast_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220309001635_p_ci_templates_jobs_secret_detection_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220310213315_p_ci_templates_implicit_jobs_secret_detection_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220310213743_p_ci_templates_implicit_jobs_sast_latest_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20220706175117_ci_users_executing_verify_job_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml26
-rw-r--r--config/metrics/counts_all/20210201124934_deployments.yml2
-rw-r--r--config/metrics/counts_all/20210204124930_servers.yml2
-rw-r--r--config/metrics/counts_all/20210204124932_clusters.yml2
-rw-r--r--config/metrics/counts_all/20210216174832_cycle_analytics_views.yml2
-rw-r--r--config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml2
-rw-r--r--config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml2
-rw-r--r--config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml2
-rw-r--r--config/metrics/counts_all/20210216175026_service_desk_issues.yml2
-rw-r--r--config/metrics/counts_all/20210216175037_suggestions.yml2
-rw-r--r--config/metrics/counts_all/20210216175039_merge_requests.yml2
-rw-r--r--config/metrics/counts_all/20210216175041_merge_request_comment.yml2
-rw-r--r--config/metrics/counts_all/20210216175043_merge_request_create.yml2
-rw-r--r--config/metrics/counts_all/20210216175045_merge_requests.yml2
-rw-r--r--config/metrics/counts_all/20210216175053_suggestions.yml2
-rw-r--r--config/metrics/counts_all/20210216175229_auto_devops_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175231_auto_devops_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175232_clusters.yml2
-rw-r--r--config/metrics/counts_all/20210216175234_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175236_project_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175238_group_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175242_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175244_project_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175246_group_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml2
-rw-r--r--config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml2
-rw-r--r--config/metrics/counts_all/20210216175253_clusters_platforms_user.yml2
-rw-r--r--config/metrics/counts_all/20210216175255_clusters_applications_helm.yml2
-rw-r--r--config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml2
-rw-r--r--config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml2
-rw-r--r--config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml2
-rw-r--r--config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml2
-rw-r--r--config/metrics/counts_all/20210216175305_clusters_applications_runner.yml2
-rw-r--r--config/metrics/counts_all/20210216175307_clusters_applications_knative.yml2
-rw-r--r--config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml2
-rw-r--r--config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml2
-rw-r--r--config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml2
-rw-r--r--config/metrics/counts_all/20210216175314_clusters_management_project.yml2
-rw-r--r--config/metrics/counts_all/20210216175316_kubernetes_agents.yml2
-rw-r--r--config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml2
-rw-r--r--config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml2
-rw-r--r--config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml2
-rw-r--r--config/metrics/counts_all/20210216175324_terraform_reports.yml2
-rw-r--r--config/metrics/counts_all/20210216175326_terraform_states.yml2
-rw-r--r--config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml2
-rw-r--r--config/metrics/counts_all/20210216175331_clusters_applications_helm.yml2
-rw-r--r--config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml2
-rw-r--r--config/metrics/counts_all/20210216175335_clusters_applications_knative.yml2
-rw-r--r--config/metrics/counts_all/20210216175337_clusters_management_project.yml2
-rw-r--r--config/metrics/counts_all/20210216175339_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175341_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml2
-rw-r--r--config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml2
-rw-r--r--config/metrics/counts_all/20210216175346_clusters_platforms_user.yml2
-rw-r--r--config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175352_group_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175354_group_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175356_project_clusters_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175358_project_clusters_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml2
-rw-r--r--config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml2
-rw-r--r--config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml2
-rw-r--r--config/metrics/counts_all/20210216175446_network_policy_forwards.yml2
-rw-r--r--config/metrics/counts_all/20210216175448_network_policy_drops.yml2
-rw-r--r--config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml2
-rw-r--r--config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml2
-rw-r--r--config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml2
-rw-r--r--config/metrics/counts_all/20210216175510_ci_builds.yml2
-rw-r--r--config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216175514_ci_external_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml2
-rw-r--r--config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml2
-rw-r--r--config/metrics/counts_all/20210216175520_ci_runners.yml2
-rw-r--r--config/metrics/counts_all/20210216175521_ci_triggers.yml2
-rw-r--r--config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml2
-rw-r--r--config/metrics/counts_all/20210216175525_ci_builds.yml2
-rw-r--r--config/metrics/counts_all/20210216175527_ci_external_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml2
-rw-r--r--config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml2
-rw-r--r--config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml2
-rw-r--r--config/metrics/counts_all/20210216175537_ci_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216175539_ci_triggers.yml2
-rw-r--r--config/metrics/counts_all/20210216175621_web_hooks.yml2
-rw-r--r--config/metrics/counts_all/20210216175623_projects_asana_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175625_groups_asana_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175627_templates_asana_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175628_instances_asana_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175634_projects_assembla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175636_groups_assembla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175638_templates_assembla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175640_instances_assembla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175645_projects_bamboo_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175647_groups_bamboo_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175649_templates_bamboo_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175651_instances_bamboo_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175708_projects_buildkite_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175710_groups_buildkite_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175712_templates_buildkite_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175714_instances_buildkite_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175719_projects_campfire_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175721_groups_campfire_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175723_templates_campfire_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175725_instances_campfire_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175731_projects_confluence_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175733_groups_confluence_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175734_templates_confluence_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175736_instances_confluence_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175753_projects_discord_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175755_groups_discord_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175756_templates_discord_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175758_instances_discord_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175837_projects_flowdock_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175839_groups_flowdock_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175840_templates_flowdock_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175842_instances_flowdock_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175910_projects_hipchat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175912_groups_hipchat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175913_templates_hipchat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175915_instances_hipchat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175921_projects_irker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175923_groups_irker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175924_templates_irker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175926_instances_irker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175932_projects_jenkins_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175934_groups_jenkins_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175935_templates_jenkins_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175937_instances_jenkins_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175943_projects_jira_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175945_groups_jira_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175946_templates_jira_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175948_instances_jira_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175954_projects_mattermost_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175956_groups_mattermost_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175957_templates_mattermost_active.yml2
-rw-r--r--config/metrics/counts_all/20210216175959_instances_mattermost_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180027_projects_packagist_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180029_groups_packagist_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180030_templates_packagist_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180032_instances_packagist_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180100_projects_pushover_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180102_groups_pushover_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180104_templates_pushover_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180105_instances_pushover_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180111_projects_redmine_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180113_groups_redmine_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180115_templates_redmine_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180116_instances_redmine_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180122_projects_slack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180124_groups_slack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180126_templates_slack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180127_instances_slack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180144_projects_teamcity_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180146_groups_teamcity_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180148_templates_teamcity_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180149_instances_teamcity_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180217_projects_youtrack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180219_groups_youtrack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180221_templates_youtrack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180223_instances_youtrack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180228_projects_jira_server_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180239_personal_snippets.yml2
-rw-r--r--config/metrics/counts_all/20210216180241_project_snippets.yml2
-rw-r--r--config/metrics/counts_all/20210216180242_web_ide_commits.yml2
-rw-r--r--config/metrics/counts_all/20210216180244_web_ide_views.yml2
-rw-r--r--config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml2
-rw-r--r--config/metrics/counts_all/20210216180248_web_ide_previews.yml2
-rw-r--r--config/metrics/counts_all/20210216180250_web_ide_terminals.yml2
-rw-r--r--config/metrics/counts_all/20210216180252_web_ide_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216180253_snippet_comment.yml2
-rw-r--r--config/metrics/counts_all/20210216180255_snippet_create.yml2
-rw-r--r--config/metrics/counts_all/20210216180257_snippet_update.yml2
-rw-r--r--config/metrics/counts_all/20210216180259_static_site_editor_views.yml2
-rw-r--r--config/metrics/counts_all/20210216180301_static_site_editor_commits.yml2
-rw-r--r--config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml2
-rw-r--r--config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216180306_snippets.yml2
-rw-r--r--config/metrics/counts_all/20210216180316_snippets.yml2
-rw-r--r--config/metrics/counts_all/20210216180410_pool_repositories.yml2
-rw-r--r--config/metrics/counts_all/20210216180413_all_searches.yml2
-rw-r--r--config/metrics/counts_all/20210216180414_navbar_searches.yml2
-rw-r--r--config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml2
-rw-r--r--config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml2
-rw-r--r--config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml2
-rw-r--r--config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml2
-rw-r--r--config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml2
-rw-r--r--config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml2
-rw-r--r--config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml2
-rw-r--r--config/metrics/counts_all/20210216180447_incident_issues.yml2
-rw-r--r--config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml2
-rw-r--r--config/metrics/counts_all/20210216180451_incident_labeled_issues.yml2
-rw-r--r--config/metrics/counts_all/20210216180453_projects_creating_incidents.yml2
-rw-r--r--config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml2
-rw-r--r--config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml2
-rw-r--r--config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216180518_projects_with_incidents.yml2
-rw-r--r--config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml2
-rw-r--r--config/metrics/counts_all/20210216180628_projects_imported_from_github.yml2
-rw-r--r--config/metrics/counts_all/20210216180630_projects_imported_from_github.yml2
-rw-r--r--config/metrics/counts_all/20210216180632_unique_users_all_imports.yml2
-rw-r--r--config/metrics/counts_all/20210216180634_gitlab.yml2
-rw-r--r--config/metrics/counts_all/20210216180636_gitlab_v1.yml2
-rw-r--r--config/metrics/counts_all/20210216180638_gitlab_project.yml2
-rw-r--r--config/metrics/counts_all/20210216180639_gitlab.yml2
-rw-r--r--config/metrics/counts_all/20210216180641_github.yml2
-rw-r--r--config/metrics/counts_all/20210216180643_bitbucket.yml2
-rw-r--r--config/metrics/counts_all/20210216180645_bitbucket_server.yml2
-rw-r--r--config/metrics/counts_all/20210216180647_gitea.yml2
-rw-r--r--config/metrics/counts_all/20210216180649_git.yml2
-rw-r--r--config/metrics/counts_all/20210216180650_manifest.yml2
-rw-r--r--config/metrics/counts_all/20210216180652_gitlab_migration.yml2
-rw-r--r--config/metrics/counts_all/20210216180654_jira.yml2
-rw-r--r--config/metrics/counts_all/20210216180656_fogbugz.yml2
-rw-r--r--config/metrics/counts_all/20210216180658_phabricator.yml2
-rw-r--r--config/metrics/counts_all/20210216180700_csv.yml2
-rw-r--r--config/metrics/counts_all/20210216180702_group_import.yml2
-rw-r--r--config/metrics/counts_all/20210216180703_gitlab_migration.yml2
-rw-r--r--config/metrics/counts_all/20210216180705_total.yml2
-rw-r--r--config/metrics/counts_all/20210216180707_gitlab_project.yml2
-rw-r--r--config/metrics/counts_all/20210216180709_gitlab.yml2
-rw-r--r--config/metrics/counts_all/20210216180711_github.yml2
-rw-r--r--config/metrics/counts_all/20210216180713_bitbucket.yml2
-rw-r--r--config/metrics/counts_all/20210216180715_bitbucket_server.yml2
-rw-r--r--config/metrics/counts_all/20210216180716_gitea.yml2
-rw-r--r--config/metrics/counts_all/20210216180718_git.yml2
-rw-r--r--config/metrics/counts_all/20210216180720_manifest.yml2
-rw-r--r--config/metrics/counts_all/20210216180722_jira.yml2
-rw-r--r--config/metrics/counts_all/20210216180724_fogbugz.yml2
-rw-r--r--config/metrics/counts_all/20210216180726_phabricator.yml2
-rw-r--r--config/metrics/counts_all/20210216180727_csv.yml2
-rw-r--r--config/metrics/counts_all/20210216180729_groups_imported.yml2
-rw-r--r--config/metrics/counts_all/20210216180734_wiki_pages_create.yml2
-rw-r--r--config/metrics/counts_all/20210216180736_wiki_pages_update.yml2
-rw-r--r--config/metrics/counts_all/20210216180738_wiki_pages_delete.yml2
-rw-r--r--config/metrics/counts_all/20210216180740_design_management_designs_create.yml2
-rw-r--r--config/metrics/counts_all/20210216180741_design_management_designs_update.yml2
-rw-r--r--config/metrics/counts_all/20210216180743_design_management_designs_delete.yml2
-rw-r--r--config/metrics/counts_all/20210216180750_groups.yml2
-rw-r--r--config/metrics/counts_all/20210216180752_keys.yml2
-rw-r--r--config/metrics/counts_all/20210216180754_events.yml2
-rw-r--r--config/metrics/counts_all/20210216180756_groups.yml2
-rw-r--r--config/metrics/counts_all/20210216180758_users_created.yml2
-rw-r--r--config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml2
-rw-r--r--config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml6
-rw-r--r--config/metrics/counts_all/20210216180931_projects_prometheus_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180933_groups_prometheus_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180934_templates_prometheus_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180936_instances_prometheus_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml2
-rw-r--r--config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml2
-rw-r--r--config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml2
-rw-r--r--config/metrics/counts_all/20210216180945_clusters.yml2
-rw-r--r--config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml2
-rw-r--r--config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml2
-rw-r--r--config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml6
-rw-r--r--config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml2
-rw-r--r--config/metrics/counts_all/20210216181009_lfs_objects.yml2
-rw-r--r--config/metrics/counts_all/20210216181011_projects_with_packages.yml2
-rw-r--r--config/metrics/counts_all/20210216181012_packages.yml2
-rw-r--r--config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml2
-rw-r--r--config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml2
-rw-r--r--config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml2
-rw-r--r--config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml2
-rw-r--r--config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml2
-rw-r--r--config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml2
-rw-r--r--config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml2
-rw-r--r--config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml2
-rw-r--r--config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml2
-rw-r--r--config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml2
-rw-r--r--config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml2
-rw-r--r--config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml2
-rw-r--r--config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml2
-rw-r--r--config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml2
-rw-r--r--config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml2
-rw-r--r--config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml2
-rw-r--r--config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml2
-rw-r--r--config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml2
-rw-r--r--config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml2
-rw-r--r--config/metrics/counts_all/20210216181051_vendor.yml2
-rw-r--r--config/metrics/counts_all/20210216181055_projects_with_packages.yml2
-rw-r--r--config/metrics/counts_all/20210216181102_issues.yml2
-rw-r--r--config/metrics/counts_all/20210216181104_label_lists.yml2
-rw-r--r--config/metrics/counts_all/20210216181108_milestones.yml2
-rw-r--r--config/metrics/counts_all/20210216181109_uploads.yml2
-rw-r--r--config/metrics/counts_all/20210216181111_labels.yml2
-rw-r--r--config/metrics/counts_all/20210216181113_notes.yml2
-rw-r--r--config/metrics/counts_all/20210216181115_issues.yml2
-rw-r--r--config/metrics/counts_all/20210216181117_notes.yml2
-rw-r--r--config/metrics/counts_all/20210216181119_projects.yml2
-rw-r--r--config/metrics/counts_all/20210216181121_todos.yml2
-rw-r--r--config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml2
-rw-r--r--config/metrics/counts_all/20210216181124_service_desk_issues.yml2
-rw-r--r--config/metrics/counts_all/20210216181126_projects_jira_active.yml2
-rw-r--r--config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml2
-rw-r--r--config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml2
-rw-r--r--config/metrics/counts_all/20210216181134_epics.yml2
-rw-r--r--config/metrics/counts_all/20210216181135_label_lists.yml2
-rw-r--r--config/metrics/counts_all/20210216181249_feature_flags.yml2
-rw-r--r--config/metrics/counts_all/20210216181252_boards.yml2
-rw-r--r--config/metrics/counts_all/20210216181254_projects.yml2
-rw-r--r--config/metrics/counts_all/20210216181256_todos.yml2
-rw-r--r--config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml2
-rw-r--r--config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml2
-rw-r--r--config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml2
-rw-r--r--config/metrics/counts_all/20210216181908_deploy_keys.yml2
-rw-r--r--config/metrics/counts_all/20210216181911_successful_deployments.yml2
-rw-r--r--config/metrics/counts_all/20210216181912_failed_deployments.yml2
-rw-r--r--config/metrics/counts_all/20210216181914_environments.yml2
-rw-r--r--config/metrics/counts_all/20210216181916_in_review_folder.yml2
-rw-r--r--config/metrics/counts_all/20210216181918_releases.yml4
-rw-r--r--config/metrics/counts_all/20210216181926_deployments.yml2
-rw-r--r--config/metrics/counts_all/20210216181928_failed_deployments.yml2
-rw-r--r--config/metrics/counts_all/20210216181930_releases.yml2
-rw-r--r--config/metrics/counts_all/20210216181932_successful_deployments.yml2
-rw-r--r--config/metrics/counts_all/20210216181946_pages_domains.yml2
-rw-r--r--config/metrics/counts_all/20210216181949_clusters_applications_runner.yml2
-rw-r--r--config/metrics/counts_all/20210216182002_remote_mirrors.yml2
-rw-r--r--config/metrics/counts_all/20210216182004_commit_comment.yml2
-rw-r--r--config/metrics/counts_all/20210216182006_source_code_pushes.yml2
-rw-r--r--config/metrics/counts_all/20210216182010_deploy_keys.yml2
-rw-r--r--config/metrics/counts_all/20210216182012_keys.yml2
-rw-r--r--config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml2
-rw-r--r--config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml2
-rw-r--r--config/metrics/counts_all/20210216182017_remote_mirrors.yml2
-rw-r--r--config/metrics/counts_all/20210216182454_protected_branches_except_default.yml2
-rw-r--r--config/metrics/counts_all/20210216182547_projects_datadog_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182549_groups_datadog_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182551_templates_datadog_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182553_instances_datadog_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182614_projects_ewm_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182616_groups_ewm_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182618_templates_ewm_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182620_instances_ewm_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml2
-rw-r--r--config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml2
-rw-r--r--config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml2
-rw-r--r--config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml2
-rw-r--r--config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml2
-rw-r--r--config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml2
-rw-r--r--config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml2
-rw-r--r--config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml2
-rw-r--r--config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml2
-rw-r--r--config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml2
-rw-r--r--config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210216183023_wiki_pages_view.yml2
-rw-r--r--config/metrics/counts_all/20210216183400_omniauth_providers.yml2
-rw-r--r--config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml2
-rw-r--r--config/metrics/counts_all/20210410012200_package_events_i_package_terraform_module_delete_package.yml2
-rw-r--r--config/metrics/counts_all/20210410012202_package_events_i_package_terraform_module_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210410012204_package_events_i_package_terraform_module_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml2
-rw-r--r--config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml2
-rw-r--r--config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml2
-rw-r--r--config/metrics/counts_all/20210502050942_ci_runners_online.yml2
-rw-r--r--config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml2
-rw-r--r--config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml2
-rw-r--r--config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml2
-rw-r--r--config/metrics/counts_all/20210505015532_kubernetes_agent_k8s_api_proxy_request.yml2
-rw-r--r--config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml2
-rw-r--r--config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210514141520_project_imports_total.yml2
-rw-r--r--config/metrics/counts_all/20210517073546_package_events_i_package_helm_pull_package.yml2
-rw-r--r--config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml6
-rw-r--r--config/metrics/counts_all/20210625095025_package_events_i_package_helm_push_package.yml2
-rw-r--r--config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml2
-rw-r--r--config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml2
-rw-r--r--config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml2
-rw-r--r--config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml2
-rw-r--r--config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml2
-rw-r--r--config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml2
-rw-r--r--config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml2
-rw-r--r--config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml2
-rw-r--r--config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml2
-rw-r--r--config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml2
-rw-r--r--config/metrics/counts_all/20210715094459_releases_with_milestones.yml2
-rw-r--r--config/metrics/counts_all/20210723075525_diff_searches.yml2
-rw-r--r--config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml2
-rw-r--r--config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml2
-rw-r--r--config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml2
-rw-r--r--config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml2
-rw-r--r--config/metrics/counts_all/20210730011801_projects_zentao_active.yml2
-rw-r--r--config/metrics/counts_all/20210730011802_groups_zentao_active.yml2
-rw-r--r--config/metrics/counts_all/20210730011804_instances_zentao_active.yml2
-rw-r--r--config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml2
-rw-r--r--config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml2
-rw-r--r--config/metrics/counts_all/20210910132001_user_auth_by_provider.yml2
-rw-r--r--config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml2
-rw-r--r--config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml2
-rw-r--r--config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml2
-rw-r--r--config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml2
-rw-r--r--config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml2
-rw-r--r--config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml6
-rw-r--r--config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml2
-rw-r--r--config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml2
-rw-r--r--config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml2
-rw-r--r--config/metrics/counts_all/20211028210001_projects_shimo_active.yml2
-rw-r--r--config/metrics/counts_all/20211028210002_groups_shimo_active.yml2
-rw-r--r--config/metrics/counts_all/20211028210003_instances_shimo_active.yml2
-rw-r--r--config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml2
-rw-r--r--config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml2
-rw-r--r--config/metrics/counts_all/20220122022215_web_ide_previews_success.yml2
-rw-r--r--config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml8
-rw-r--r--config/metrics/counts_all/20220315180122_projects_harbor_active.yml2
-rw-r--r--config/metrics/counts_all/20220315180124_groups_harbor_active.yml2
-rw-r--r--config/metrics/counts_all/20220315180127_instances_harbor_active.yml2
-rw-r--r--config/metrics/counts_all/20220315180129_projects_inheriting_harbor_active.yml2
-rw-r--r--config/metrics/counts_all/20220315180131_groups_inheriting_harbor_active.yml2
-rw-r--r--config/metrics/license/20210201124932_recorded_at.yml6
-rw-r--r--config/metrics/license/20210201124933_uuid.yml6
-rw-r--r--config/metrics/license/20210204124827_hostname.yml6
-rw-r--r--config/metrics/license/20210204124829_active_user_count.yml6
-rw-r--r--config/metrics/license/20210204124928_version.yml2
-rw-r--r--config/metrics/license/20210204124936_pages_version.yml2
-rw-r--r--config/metrics/license/20210204124938_recording_ce_finished_at.yml6
-rw-r--r--config/metrics/license/20210216175601_version.yml2
-rw-r--r--config/metrics/license/20210216175602_installation_type.yml2
-rw-r--r--config/metrics/license/20210216181053_version.yml2
-rw-r--r--config/metrics/license/20210216183237_version.yml2
-rw-r--r--config/metrics/schema.json3
-rw-r--r--config/metrics/settings/20210201124935_database_adapter.yml2
-rw-r--r--config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124858_container_registry_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124900_dependency_proxy_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124904_gravatar_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124906_ldap_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124908_mattermost_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124910_omniauth_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124912_prometheus_enabled.yml7
-rw-r--r--config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml7
-rw-r--r--config/metrics/settings/20210204124916_reply_by_email_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124918_signup_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml2
-rw-r--r--config/metrics/settings/20210204124922_grafana_link_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124934_pages_enabled.yml2
-rw-r--r--config/metrics/settings/20210216174829_smtp_server.yml2
-rw-r--r--config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml2
-rw-r--r--config/metrics/settings/20210216175604_edition.yml2
-rw-r--r--config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml2
-rw-r--r--config/metrics/settings/20210216175609_version.yml2
-rw-r--r--config/metrics/settings/20210216180314_gitpod_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180836_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180838_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180840_direct_upload.yml2
-rw-r--r--config/metrics/settings/20210216180841_background_upload.yml2
-rw-r--r--config/metrics/settings/20210216180843_provider.yml2
-rw-r--r--config/metrics/settings/20210216180845_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180847_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180849_direct_upload.yml2
-rw-r--r--config/metrics/settings/20210216180851_background_upload.yml2
-rw-r--r--config/metrics/settings/20210216180852_provider.yml2
-rw-r--r--config/metrics/settings/20210216180854_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180856_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180858_direct_upload.yml2
-rw-r--r--config/metrics/settings/20210216180900_background_upload.yml2
-rw-r--r--config/metrics/settings/20210216180902_provider.yml2
-rw-r--r--config/metrics/settings/20210216180903_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180905_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180907_direct_upload.yml2
-rw-r--r--config/metrics/settings/20210216180909_background_upload.yml2
-rw-r--r--config/metrics/settings/20210216180911_provider.yml2
-rw-r--r--config/metrics/settings/20210216180913_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180915_enabled.yml2
-rw-r--r--config/metrics/settings/20210216180916_direct_upload.yml2
-rw-r--r--config/metrics/settings/20210216180918_background_upload.yml2
-rw-r--r--config/metrics/settings/20210216180920_provider.yml2
-rw-r--r--config/metrics/settings/20210216183241_filesystems.yml2
-rw-r--r--config/metrics/settings/20210216183248_pg_system_id.yml2
-rw-r--r--config/metrics/settings/20210225045628_operating_system.yml2
-rw-r--r--config/metrics/settings/20210321224827_gitaly_apdex.yml2
-rw-r--r--config/metrics/settings/20210323120839_topology.yml2
-rw-r--r--config/metrics/settings/20210702140138_collected_data_categories.yml6
-rw-r--r--config/metrics/settings/20210915152326_service_ping_features_enabled.yml6
-rw-r--r--config/metrics/settings/20211124061450_snowplow_enabled.yml6
-rw-r--r--config/metrics/settings/20211124085521_snowplow_configured_to_gitlab_collector_hostname.yml6
-rw-r--r--config/metrics/settings/20211201012652_flavor.yml2
-rw-r--r--config/metrics/settings/20220222181654_certificate_based_clusters_ff.yml2
-rw-r--r--config/puma.example.development.rb3
-rw-r--r--config/routes.rb525
-rw-r--r--config/routes/admin.rb3
-rw-r--r--config/routes/group.rb9
-rw-r--r--config/routes/project.rb42
-rw-r--r--config/routes/user.rb4
-rw-r--r--config/sidekiq_queues.yml12
-rw-r--r--config/webpack.config.js29
-rw-r--r--danger/ci_config/Dangerfile3
-rw-r--r--danger/database/Dangerfile9
-rw-r--r--data/deprecations/14-7-deprecate-artifacts-keyword.yml4
-rw-r--r--data/deprecations/14-8-sast-analyzer-removals.yml17
-rw-r--r--data/deprecations/15-2-job_age-deprecation.yml41
-rw-r--r--data/removals/15_0/15-0-configure-self-managed-cert-based-kube-feature-flag.yml24
-rw-r--r--data/removals/15_0/15-0-removal-artifacts-keyword.yml4
-rw-r--r--data/removals/15_0/15-0-remove-background-upload-object-storage.yml35
-rw-r--r--data/removals/15_2/removal-outdated-browser-support.yml20
-rw-r--r--data/whats_new/202206220001_15_1.yml59
-rw-r--r--db/docs/broadcast_messages.yml4
-rw-r--r--db/docs/ci_job_token_project_scope_links.yml4
-rw-r--r--db/docs/ci_runner_versions.yml9
-rw-r--r--db/docs/ci_secure_file_states.yml9
-rw-r--r--db/docs/clusters_applications_elastic_stacks.yml9
-rw-r--r--db/docs/clusters_integration_elasticstack.yml9
-rw-r--r--db/docs/namespace_bans.yml9
-rw-r--r--db/docs/project_relation_export_uploads.yml9
-rw-r--r--db/docs/project_relation_exports.yml9
-rw-r--r--db/docs/project_tracing_settings.yml9
-rw-r--r--db/docs/sbom_component_versions.yml11
-rw-r--r--db/docs/sbom_components.yml11
-rw-r--r--db/docs/sbom_occurrences.yml11
-rw-r--r--db/docs/sbom_sources.yml11
-rw-r--r--db/docs/user_namespace_callouts.yml10
-rw-r--r--db/docs/vulnerability_merge_request_links.yml9
-rw-r--r--db/fixtures/development/06_teams.rb2
-rw-r--r--db/fixtures/development/33_triage_ops.rb48
-rw-r--r--db/migrate/20220523162734_add_vulnerability_reads_casted_cluster_agent_column.rb9
-rw-r--r--db/migrate/20220523163734_update_vulnerability_reads_trigger_functions.rb81
-rw-r--r--db/migrate/20220524164122_limit_project_and_group_variables.rb8
-rw-r--r--db/migrate/20220531024905_add_operations_access_levels_to_project_feature.rb24
-rw-r--r--db/migrate/20220531140515_add_applies_to_all_protected_branches_to_approval_project_rule.rb7
-rw-r--r--db/migrate/20220608074738_add_max_repository_downloads_limit_to_application_settings.rb15
-rw-r--r--db/migrate/20220610140605_change_public_projects_cost_factor.rb35
-rw-r--r--db/migrate/20220613054349_add_unique_project_download_limit_settings_to_namespace_settings.rb12
-rw-r--r--db/migrate/20220614120415_add_toggle_opt_in_jwt.rb7
-rw-r--r--db/migrate/20220616182001_create_sbom_components.rb11
-rw-r--r--db/migrate/20220616182015_create_sbom_component_versions.rb15
-rw-r--r--db/migrate/20220616182016_create_sbom_sources.rb12
-rw-r--r--db/migrate/20220616182038_create_sbom_occurrences.rb14
-rw-r--r--db/migrate/20220616183240_add_sbom_component_versions_foreign_key_to_sbom_occurrences.rb18
-rw-r--r--db/migrate/20220616183309_add_sbom_source_foreign_key_to_sbom_occurrences.rb15
-rw-r--r--db/migrate/20220616183310_add_project_foreign_key_to_sbom_occurrences.rb15
-rw-r--r--db/migrate/20220617123135_drop_temp_index_on_projects_on_id_and_runners_token.rb21
-rw-r--r--db/migrate/20220617123144_drop_temp_index_on_projects_on_id_and_runners_token_encrypted.rb21
-rw-r--r--db/migrate/20220617141347_create_ci_secure_file_states.rb34
-rw-r--r--db/migrate/20220619182308_create_project_relation_exports.rb20
-rw-r--r--db/migrate/20220619184931_create_project_relation_export_uploads.rb15
-rw-r--r--db/migrate/20220621202616_add_partial_index_on_oauth_access_tokens_revoked_at.rb19
-rw-r--r--db/migrate/20220624081524_add_ci_runner_versions_table.rb16
-rw-r--r--db/migrate/20220624090458_add_index_on_runner_version.rb15
-rw-r--r--db/migrate/20220627061008_add_fei_shu_integration.rb12
-rw-r--r--db/migrate/20220627122229_create_user_namespace_callouts.rb16
-rw-r--r--db/migrate/20220627122230_add_foreign_keys_to_user_namespace_callouts.rb28
-rw-r--r--db/migrate/20220627140315_add_last_feature_flag_updated_at_to_operations_feature_flags_clients.rb7
-rw-r--r--db/migrate/20220627171538_add_error_tracking_settings.rb21
-rw-r--r--db/migrate/20220628110214_add_namespace_id_column_to_issues_table.rb13
-rw-r--r--db/migrate/20220628120708_create_namespace_bans.rb15
-rw-r--r--db/migrate/20220628121644_add_namespace_bans_namespace_id_foreign_key.rb15
-rw-r--r--db/migrate/20220628121712_add_namespace_bans_user_id_foreign_key.rb15
-rw-r--r--db/migrate/20220629220129_increase_webauthn_xid_length.rb17
-rw-r--r--db/migrate/20220630202329_add_partial_index_on_oauth_access_tokens_revoked_at_with_order.rb20
-rw-r--r--db/migrate/20220701173859_remove_not_null_constraints_from_requirements.rb19
-rw-r--r--db/migrate/20220703182234_add_findings_partition_number_to_security_scans.rb9
-rw-r--r--db/migrate/20220703182254_add_partition_number_to_security_findings.rb9
-rw-r--r--db/migrate/20220704034050_add_users_allowlist_to_git_rate_limits.rb11
-rw-r--r--db/migrate/20220704034105_add_application_settings_git_users_allowlist_max_usernames_constraint.rb15
-rw-r--r--db/migrate/20220705145349_add_project_import_level_to_namespace_settings.rb9
-rw-r--r--db/migrate/20220706191627_add_encrypted_error_tracking_access_token.rb17
-rw-r--r--db/migrate/20220708100532_add_unique_index_on_ci_runner_versions_on_status_and_version.rb15
-rw-r--r--db/migrate/20220708132701_create_vulnerability_merge_request_links.rb29
-rw-r--r--db/migrate/20220708142744_add_composite_index_for_protected_environments.rb16
-rw-r--r--db/migrate/20220708142803_add_composite_index_for_protected_environment_approval_rules.rb16
-rw-r--r--db/migrate/20220708150315_add_vulnerabilities_foreign_key_to_vulnerability_merge_request_links.rb16
-rw-r--r--db/migrate/20220708150335_add_merge_requests_foreign_key_to_vulnerability_merge_request_links.rb16
-rw-r--r--db/migrate/20220708184822_cleanup_backfill_draft_status_on_merge_requests.rb14
-rw-r--r--db/migrate/20220712025712_update_insert_or_update_vulnerability_reads_function.rb86
-rw-r--r--db/migrate/20220712031923_create_vulnerability_reads_for_an_existing_vulnerability_record.rb56
-rw-r--r--db/migrate/20220712094945_add_include_for_free_user_cap_preview_to_namespace_settings.rb13
-rw-r--r--db/migrate/20220713175658_add_packages_cleanup_policies_worker_capacity_to_application_settings.rb11
-rw-r--r--db/migrate/20220713175737_add_application_settings_packages_cleanup_policies_worker_capacity_constraint.rb17
-rw-r--r--db/migrate/20220713175812_add_enabled_policies_index_to_packages_cleanup_policies.rb18
-rw-r--r--db/migrate/20220714105122_update_default_project_import_level_on_namespace_settings.rb13
-rw-r--r--db/migrate/20220714142424_update_trigger_update_vulnerability_reads_on_vulnerability_update.rb48
-rw-r--r--db/post_migrate/20220523164734_add_foreign_key_to_vulnerability_reads_casted_cluster_agent_id.rb16
-rw-r--r--db/post_migrate/20220523165734_add_index_to_vulnerability_reads_casted_cluster_agent_id.rb15
-rw-r--r--db/post_migrate/20220531035113_populate_operation_visibility_permissions.rb29
-rw-r--r--db/post_migrate/20220601151900_schedule_backfill_ci_runner_semver.rb31
-rw-r--r--db/post_migrate/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events.rb18
-rw-r--r--db/post_migrate/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences.rb20
-rw-r--r--db/post_migrate/20220617123022_add_unique_index_on_projects_on_runners_token.rb18
-rw-r--r--db/post_migrate/20220617123034_add_unique_index_on_projects_on_runners_token_encrypted.rb18
-rw-r--r--db/post_migrate/20220617123105_drop_index_on_projects_on_runners_token.rb17
-rw-r--r--db/post_migrate/20220617123113_drop_index_on_projects_on_runners_token_encrypted.rb17
-rw-r--r--db/post_migrate/20220617142124_add_index_on_installable_package_files.rb20
-rw-r--r--db/post_migrate/20220617143228_replace_packages_index_on_project_id_and_status.rb22
-rw-r--r--db/post_migrate/20220620060633_finalize_orphaned_routes_cleanup.rb22
-rw-r--r--db/post_migrate/20220620132300_update_last_run_date_for_iterations_cadences.rb19
-rw-r--r--db/post_migrate/20220620151740_add_indexes_issues_on_project_id_and_closed_at.rb31
-rw-r--r--db/post_migrate/20220621040800_backfill_imported_issue_search_data.rb11
-rw-r--r--db/post_migrate/20220621082245_remove_tmp_index_on_routes_namespace_id_column.rb18
-rw-r--r--db/post_migrate/20220621092245_validate_not_null_constraint_on_routes_namespace_id_column.rb14
-rw-r--r--db/post_migrate/20220622070547_add_temp_index_for_container_registry_size_migration.rb22
-rw-r--r--db/post_migrate/20220622080547_backfill_project_statistics_with_container_registry_size.rb33
-rw-r--r--db/post_migrate/20220624062300_delete_backfill_ci_runner_semver_migration.rb19
-rw-r--r--db/post_migrate/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects.rb33
-rw-r--r--db/post_migrate/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace.rb25
-rw-r--r--db/post_migrate/20220627223041_add_post_migrate_test_table.rb13
-rw-r--r--db/post_migrate/20220628012902_finalise_project_namespace_members.rb22
-rw-r--r--db/post_migrate/20220628110823_add_issues_namespace_id_fk_and_index.rb22
-rw-r--r--db/post_migrate/20220628111752_drop_token_index_from_ci_builds.rb17
-rw-r--r--db/post_migrate/20220628122622_rename_builds_sidekiq_queues_to_namespaces.rb22
-rw-r--r--db/post_migrate/20220629184402_unset_escalation_policies_for_alert_incidents.rb46
-rw-r--r--db/post_migrate/20220630050050_index_vulnerability_reads_on_casted_cluster_agent_id_full.rb18
-rw-r--r--db/post_migrate/20220630085003_drop_project_successfull_pages_deploy_index_from_ci_builds.rb21
-rw-r--r--db/post_migrate/20220630091409_add_index_on_events_for_contribution_analytics_optimization.rb15
-rw-r--r--db/post_migrate/20220630151641_schedule_set_correct_vulnerability_state.rb29
-rw-r--r--db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb13
-rw-r--r--db/post_migrate/20220703182314_add_check_constraint_for_security_findings_partition_number.rb15
-rw-r--r--db/post_migrate/20220704044408_remove_foreign_key_in_project_tracing_settings.rb16
-rw-r--r--db/post_migrate/20220704045440_drop_project_tracing_settings_table.rb17
-rw-r--r--db/post_migrate/20220705114635_drop_index_on_ci_runner_versions_on_version.rb15
-rw-r--r--db/post_migrate/20220705180843_validate_requirements_issue_id_not_null.rb15
-rw-r--r--db/post_migrate/20220706065245_remove_foreign_key_in_clusters_applications_elastic_stacks.rb16
-rw-r--r--db/post_migrate/20220706065611_remove_foreign_key_in_clusters_integration_elasticstack.rb16
-rw-r--r--db/post_migrate/20220706070804_drop_clusters_applications_elastic_stacks_table.rb17
-rw-r--r--db/post_migrate/20220706071304_drop_clusters_integration_elasticstack_table.rb22
-rw-r--r--db/post_migrate/20220706115138_create_async_index_on_security_findings.rb22
-rw-r--r--db/post_migrate/20220706122719_create_index_on_security_findings_uuid_id_desc.rb23
-rw-r--r--db/post_migrate/20220706132238_add_indices_on_security_scans_info_column.rb27
-rw-r--r--db/post_migrate/20220707075300_reschedule_backfill_imported_issue_search_data.rb35
-rw-r--r--db/post_migrate/20220708100508_drop_index_on_ci_runner_versions_on_status.rb15
-rw-r--r--db/post_migrate/20220713133515_cleanup_backfill_draft_statuses_on_merge_requests.rb15
-rw-r--r--db/post_migrate/20220714122311_add_async_index_on_security_findings_id_and_partition_number.rb15
-rw-r--r--db/post_migrate/20220714122418_add_async_index_on_security_findings_unique_columns.rb15
-rw-r--r--db/post_migrate/20220715054506_add_parent_link_unique_work_item_index.rb19
-rw-r--r--db/post_migrate/20220715160023_drop_post_migration_test_table.rb13
-rw-r--r--db/post_migrate/20220715163254_update_notes_in_past.rb22
-rw-r--r--db/schema_migrations/202205231627341
-rw-r--r--db/schema_migrations/202205231637341
-rw-r--r--db/schema_migrations/202205231647341
-rw-r--r--db/schema_migrations/202205231657341
-rw-r--r--db/schema_migrations/202205241641221
-rw-r--r--db/schema_migrations/202205310249051
-rw-r--r--db/schema_migrations/202205310351131
-rw-r--r--db/schema_migrations/202205311405151
-rw-r--r--db/schema_migrations/202206011519001
-rw-r--r--db/schema_migrations/202206011529161
-rw-r--r--db/schema_migrations/202206060829101
-rw-r--r--db/schema_migrations/202206080747381
-rw-r--r--db/schema_migrations/202206101406051
-rw-r--r--db/schema_migrations/202206130543491
-rw-r--r--db/schema_migrations/202206141204151
-rw-r--r--db/schema_migrations/202206161820011
-rw-r--r--db/schema_migrations/202206161820151
-rw-r--r--db/schema_migrations/202206161820161
-rw-r--r--db/schema_migrations/202206161820381
-rw-r--r--db/schema_migrations/202206161832401
-rw-r--r--db/schema_migrations/202206161833091
-rw-r--r--db/schema_migrations/202206161833101
-rw-r--r--db/schema_migrations/202206171230221
-rw-r--r--db/schema_migrations/202206171230341
-rw-r--r--db/schema_migrations/202206171231051
-rw-r--r--db/schema_migrations/202206171231131
-rw-r--r--db/schema_migrations/202206171231351
-rw-r--r--db/schema_migrations/202206171231441
-rw-r--r--db/schema_migrations/202206171413471
-rw-r--r--db/schema_migrations/202206171421241
-rw-r--r--db/schema_migrations/202206171432281
-rw-r--r--db/schema_migrations/202206191823081
-rw-r--r--db/schema_migrations/202206191849311
-rw-r--r--db/schema_migrations/202206200606331
-rw-r--r--db/schema_migrations/202206201323001
-rw-r--r--db/schema_migrations/202206201517401
-rw-r--r--db/schema_migrations/202206210408001
-rw-r--r--db/schema_migrations/202206210822451
-rw-r--r--db/schema_migrations/202206210922451
-rw-r--r--db/schema_migrations/202206212026161
-rw-r--r--db/schema_migrations/202206220705471
-rw-r--r--db/schema_migrations/202206220805471
-rw-r--r--db/schema_migrations/202206240623001
-rw-r--r--db/schema_migrations/202206240815241
-rw-r--r--db/schema_migrations/202206240904581
-rw-r--r--db/schema_migrations/202206270610081
-rw-r--r--db/schema_migrations/202206270902311
-rw-r--r--db/schema_migrations/202206271222291
-rw-r--r--db/schema_migrations/202206271222301
-rw-r--r--db/schema_migrations/202206271403151
-rw-r--r--db/schema_migrations/202206271526421
-rw-r--r--db/schema_migrations/202206271715381
-rw-r--r--db/schema_migrations/202206272230411
-rw-r--r--db/schema_migrations/202206280129021
-rw-r--r--db/schema_migrations/202206281102141
-rw-r--r--db/schema_migrations/202206281108231
-rw-r--r--db/schema_migrations/202206281117521
-rw-r--r--db/schema_migrations/202206281207081
-rw-r--r--db/schema_migrations/202206281216441
-rw-r--r--db/schema_migrations/202206281217121
-rw-r--r--db/schema_migrations/202206281226221
-rw-r--r--db/schema_migrations/202206291844021
-rw-r--r--db/schema_migrations/202206292201291
-rw-r--r--db/schema_migrations/202206300500501
-rw-r--r--db/schema_migrations/202206300850031
-rw-r--r--db/schema_migrations/202206300914091
-rw-r--r--db/schema_migrations/202206301516411
-rw-r--r--db/schema_migrations/202206302023291
-rw-r--r--db/schema_migrations/202207010855231
-rw-r--r--db/schema_migrations/202207011738591
-rw-r--r--db/schema_migrations/202207031822341
-rw-r--r--db/schema_migrations/202207031822541
-rw-r--r--db/schema_migrations/202207031823141
-rw-r--r--db/schema_migrations/202207040340501
-rw-r--r--db/schema_migrations/202207040341051
-rw-r--r--db/schema_migrations/202207040444081
-rw-r--r--db/schema_migrations/202207040454401
-rw-r--r--db/schema_migrations/202207051146351
-rw-r--r--db/schema_migrations/202207051453491
-rw-r--r--db/schema_migrations/202207051808431
-rw-r--r--db/schema_migrations/202207060652451
-rw-r--r--db/schema_migrations/202207060656111
-rw-r--r--db/schema_migrations/202207060708041
-rw-r--r--db/schema_migrations/202207060713041
-rw-r--r--db/schema_migrations/202207061151381
-rw-r--r--db/schema_migrations/202207061227191
-rw-r--r--db/schema_migrations/202207061322381
-rw-r--r--db/schema_migrations/202207061916271
-rw-r--r--db/schema_migrations/202207070753001
-rw-r--r--db/schema_migrations/202207081005081
-rw-r--r--db/schema_migrations/202207081005321
-rw-r--r--db/schema_migrations/202207081327011
-rw-r--r--db/schema_migrations/202207081427441
-rw-r--r--db/schema_migrations/202207081428031
-rw-r--r--db/schema_migrations/202207081503151
-rw-r--r--db/schema_migrations/202207081503351
-rw-r--r--db/schema_migrations/202207081848221
-rw-r--r--db/schema_migrations/202207120257121
-rw-r--r--db/schema_migrations/202207120319231
-rw-r--r--db/schema_migrations/202207120949451
-rw-r--r--db/schema_migrations/202207131335151
-rw-r--r--db/schema_migrations/202207131756581
-rw-r--r--db/schema_migrations/202207131757371
-rw-r--r--db/schema_migrations/202207131758121
-rw-r--r--db/schema_migrations/202207141051221
-rw-r--r--db/schema_migrations/202207141223111
-rw-r--r--db/schema_migrations/202207141224181
-rw-r--r--db/schema_migrations/202207141424241
-rw-r--r--db/schema_migrations/202207150545061
-rw-r--r--db/schema_migrations/202207151600231
-rw-r--r--db/schema_migrations/202207151632541
-rw-r--r--db/structure.sql590
-rw-r--r--doc/.vale/gitlab/Uppercase.yml7
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt2
-rw-r--r--doc/administration/audit_event_streaming.md356
-rw-r--r--doc/administration/auth/index.md10
-rw-r--r--doc/administration/auth/ldap/img/multi_login.gifbin321518 -> 0 bytes
-rw-r--r--doc/administration/auth/ldap/img/multi_login.pngbin0 -> 12689 bytes
-rw-r--r--doc/administration/auth/ldap/index.md4
-rw-r--r--doc/administration/auth/ldap/ldap_synchronization.md5
-rw-r--r--doc/administration/auth/oidc.md8
-rw-r--r--doc/administration/consul.md12
-rw-r--r--doc/administration/docs_self_host.md2
-rw-r--r--doc/administration/encrypted_configuration.md4
-rw-r--r--doc/administration/feature_flags.md10
-rw-r--r--doc/administration/geo/disaster_recovery/background_verification.md92
-rw-r--r--doc/administration/geo/disaster_recovery/index.md2
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md4
-rw-r--r--doc/administration/geo/index.md2
-rw-r--r--doc/administration/geo/replication/configuration.md6
-rw-r--r--doc/administration/geo/replication/datatypes.md4
-rw-r--r--doc/administration/geo/replication/object_storage.md5
-rw-r--r--doc/administration/geo/replication/troubleshooting.md17
-rw-r--r--doc/administration/geo/secondary_proxy/index.md2
-rw-r--r--doc/administration/geo/setup/database.md12
-rw-r--r--doc/administration/geo/setup/external_database.md29
-rw-r--r--doc/administration/geo/setup/index.md10
-rw-r--r--doc/administration/gitaly/configure_gitaly.md61
-rw-r--r--doc/administration/gitaly/index.md46
-rw-r--r--doc/administration/gitaly/monitoring.md2
-rw-r--r--doc/administration/gitaly/praefect.md3
-rw-r--r--doc/administration/gitaly/recovery.md2
-rw-r--r--doc/administration/gitaly/reference.md2
-rw-r--r--doc/administration/gitaly/troubleshooting.md8
-rw-r--r--doc/administration/housekeeping.md2
-rw-r--r--doc/administration/index.md7
-rw-r--r--doc/administration/instance_limits.md26
-rw-r--r--doc/administration/instance_review.md2
-rw-r--r--doc/administration/integration/mailgun.md2
-rw-r--r--doc/administration/integration/plantuml.md8
-rw-r--r--doc/administration/invalidate_markdown_cache.md25
-rw-r--r--doc/administration/lfs/index.md4
-rw-r--r--doc/administration/libravatar.md4
-rw-r--r--doc/administration/load_balancer.md8
-rw-r--r--doc/administration/logs.md18
-rw-r--r--doc/administration/monitoring/performance/grafana_configuration.md6
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md2
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md8
-rw-r--r--doc/administration/monitoring/prometheus/web_exporter.md20
-rw-r--r--doc/administration/nfs.md6
-rw-r--r--doc/administration/object_storage.md8
-rw-r--r--doc/administration/operations/extra_sidekiq_processes.md11
-rw-r--r--doc/administration/operations/extra_sidekiq_routing.md16
-rw-r--r--doc/administration/operations/filesystem_benchmarking.md6
-rw-r--r--doc/administration/operations/index.md6
-rw-r--r--doc/administration/operations/moving_repositories.md11
-rw-r--r--doc/administration/operations/puma.md124
-rw-r--r--doc/administration/operations/rails_console.md471
-rw-r--r--doc/administration/operations/ssh_certificates.md2
-rw-r--r--doc/administration/package_information/deprecation_policy.md4
-rw-r--r--doc/administration/package_information/postgresql_versions.md12
-rw-r--r--doc/administration/package_information/supported_os.md37
-rw-r--r--doc/administration/packages/container_registry.md14
-rw-r--r--doc/administration/pages/index.md23
-rw-r--r--doc/administration/postgresql/external.md19
-rw-r--r--doc/administration/postgresql/moving.md65
-rw-r--r--doc/administration/postgresql/pgbouncer.md2
-rw-r--r--doc/administration/postgresql/replication_and_failover.md6
-rw-r--r--doc/administration/raketasks/check.md14
-rw-r--r--doc/administration/raketasks/github_import.md6
-rw-r--r--doc/administration/raketasks/maintenance.md4
-rw-r--r--doc/administration/raketasks/praefect.md3
-rw-r--r--doc/administration/raketasks/smtp.md2
-rw-r--r--doc/administration/read_only_gitlab.md6
-rw-r--r--doc/administration/redis/index.md2
-rw-r--r--doc/administration/redis/standalone.md2
-rw-r--r--doc/administration/redis/troubleshooting.md8
-rw-r--r--doc/administration/reference_architectures/10k_users.md14
-rw-r--r--doc/administration/reference_architectures/1k_users.md8
-rw-r--r--doc/administration/reference_architectures/25k_users.md14
-rw-r--r--doc/administration/reference_architectures/2k_users.md12
-rw-r--r--doc/administration/reference_architectures/3k_users.md14
-rw-r--r--doc/administration/reference_architectures/50k_users.md14
-rw-r--r--doc/administration/reference_architectures/5k_users.md112
-rw-r--r--doc/administration/reference_architectures/index.md18
-rw-r--r--doc/administration/reference_architectures/troubleshooting.md18
-rw-r--r--doc/administration/reply_by_email_postfix_setup.md4
-rw-r--r--doc/administration/repository_checks.md5
-rw-r--r--doc/administration/repository_storage_paths.md4
-rw-r--r--doc/administration/repository_storage_types.md3
-rw-r--r--doc/administration/restart_gitlab.md2
-rw-r--r--doc/administration/server_hooks.md27
-rw-r--r--doc/administration/sidekiq.md136
-rw-r--r--doc/administration/smime_signing_email.md6
-rw-r--r--doc/administration/troubleshooting/debug.md292
-rw-r--r--doc/administration/troubleshooting/defcon.md38
-rw-r--r--doc/administration/troubleshooting/diagnostics_tools.md4
-rw-r--r--doc/administration/troubleshooting/gdb-stuck-ruby.txt142
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md47
-rw-r--r--doc/administration/troubleshooting/group_saml_scim.md96
-rw-r--r--doc/administration/troubleshooting/index.md7
-rw-r--r--doc/administration/troubleshooting/kubernetes_cheat_sheet.md298
-rw-r--r--doc/administration/troubleshooting/linux_cheat_sheet.md6
-rw-r--r--doc/administration/troubleshooting/log_parsing.md49
-rw-r--r--doc/administration/troubleshooting/navigating_gitlab_via_rails_console.md468
-rw-r--r--doc/administration/troubleshooting/postgresql.md2
-rw-r--r--doc/administration/troubleshooting/ssl.md9
-rw-r--r--doc/administration/troubleshooting/test_environments.md2
-rw-r--r--doc/administration/troubleshooting/tracing_correlation_id.md4
-rw-r--r--doc/administration/uploads.md2
-rw-r--r--doc/administration/whats-new.md6
-rw-r--r--doc/api/access_requests.md2
-rw-r--r--doc/api/api_resources.md5
-rw-r--r--doc/api/audit_events.md7
-rw-r--r--doc/api/award_emoji.md20
-rw-r--r--doc/api/broadcast_messages.md2
-rw-r--r--doc/api/deploy_keys.md42
-rw-r--r--doc/api/deployments.md4
-rw-r--r--doc/api/dora/metrics.md46
-rw-r--r--doc/api/dora4_project_analytics.md13
-rw-r--r--doc/api/experiments.md2
-rw-r--r--doc/api/feature_flags.md2
-rw-r--r--doc/api/feature_flags_legacy.md11
-rw-r--r--doc/api/graphql/index.md8
-rw-r--r--doc/api/graphql/reference/index.md369
-rw-r--r--doc/api/groups.md4
-rw-r--r--doc/api/index.md32
-rw-r--r--doc/api/integrations.md1
-rw-r--r--doc/api/invitations.md4
-rw-r--r--doc/api/jobs.md8
-rw-r--r--doc/api/members.md2
-rw-r--r--doc/api/merge_requests.md3
-rw-r--r--doc/api/metadata.md46
-rw-r--r--doc/api/metrics_user_starred_dashboards.md2
-rw-r--r--doc/api/notes.md2
-rw-r--r--doc/api/oauth2.md11
-rw-r--r--doc/api/openapi/openapi.yaml12
-rw-r--r--doc/api/openapi/v4/metadata.yaml43
-rw-r--r--doc/api/packages/conan.md4
-rw-r--r--doc/api/packages/debian.md4
-rw-r--r--doc/api/packages/debian_group_distributions.md4
-rw-r--r--doc/api/packages/debian_project_distributions.md4
-rw-r--r--doc/api/packages/pypi.md4
-rw-r--r--doc/api/project_level_variables.md2
-rw-r--r--doc/api/project_repository_storage_moves.md3
-rw-r--r--doc/api/projects.md351
-rw-r--r--doc/api/protected_tags.md1
-rw-r--r--doc/api/repositories.md4
-rw-r--r--doc/api/settings.md5
-rw-r--r--doc/api/snippets.md19
-rw-r--r--doc/api/usage_data.md6
-rw-r--r--doc/api/users.md164
-rw-r--r--doc/ci/ci_cd_for_external_repos/bitbucket_integration.md5
-rw-r--r--doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md51
-rw-r--r--doc/ci/cloud_deployment/heroku.md32
-rw-r--r--doc/ci/cloud_deployment/index.md2
-rw-r--r--doc/ci/environments/index.md58
-rw-r--r--doc/ci/examples/authenticating-with-hashicorp-vault/index.md47
-rw-r--r--doc/ci/examples/index.md5
-rw-r--r--doc/ci/index.md6
-rw-r--r--doc/ci/jobs/index.md11
-rw-r--r--doc/ci/jobs/job_control.md36
-rw-r--r--doc/ci/metrics_reports.md71
-rw-r--r--doc/ci/migration/circleci.md4
-rw-r--r--doc/ci/pipeline_editor/index.md2
-rw-r--r--doc/ci/pipelines/cicd_minutes.md80
-rw-r--r--doc/ci/pipelines/index.md4
-rw-r--r--doc/ci/pipelines/job_artifacts.md21
-rw-r--r--doc/ci/pipelines/merge_trains.md1
-rw-r--r--doc/ci/pipelines/merged_results_pipelines.md8
-rw-r--r--doc/ci/pipelines/multi_project_pipelines.md2
-rw-r--r--doc/ci/pipelines/pipeline_artifacts.md2
-rw-r--r--doc/ci/pipelines/pipeline_efficiency.md4
-rw-r--r--doc/ci/pipelines/pipelines_for_merged_results.md11
-rw-r--r--doc/ci/pipelines/settings.md5
-rw-r--r--doc/ci/review_apps/index.md3
-rw-r--r--doc/ci/runners/index.md2
-rw-r--r--doc/ci/runners/saas/macos_saas_runner.md10
-rw-r--r--doc/ci/services/index.md2
-rw-r--r--doc/ci/testing/accessibility_testing.md76
-rw-r--r--doc/ci/testing/browser_performance_testing.md242
-rw-r--r--doc/ci/testing/code_quality.md636
-rw-r--r--doc/ci/testing/fail_fast_testing.md97
-rw-r--r--doc/ci/testing/img/accessibility_mr_widget_v13_0.png (renamed from doc/user/project/merge_requests/img/accessibility_mr_widget_v13_0.png)bin61149 -> 61149 bytes
-rw-r--r--doc/ci/testing/img/browser_performance_testing.png (renamed from doc/user/project/merge_requests/img/browser_performance_testing.png)bin40417 -> 40417 bytes
-rw-r--r--doc/ci/testing/img/code_quality_host_bound_sequential.png (renamed from doc/user/project/merge_requests/img/code_quality_host_bound_sequential.png)bin12345 -> 12345 bytes
-rw-r--r--doc/ci/testing/img/code_quality_mr_diff_report_v14_2.png (renamed from doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14_2.png)bin40901 -> 40901 bytes
-rw-r--r--doc/ci/testing/img/code_quality_report_13_11.png (renamed from doc/user/project/merge_requests/img/code_quality_report_13_11.png)bin23710 -> 23710 bytes
-rw-r--r--doc/ci/testing/img/code_quality_widget_13_11.png (renamed from doc/user/project/merge_requests/img/code_quality_widget_13_11.png)bin29118 -> 29118 bytes
-rw-r--r--doc/ci/testing/img/load_performance_testing.png (renamed from doc/user/project/merge_requests/img/load_performance_testing.png)bin17506 -> 17506 bytes
-rw-r--r--doc/ci/testing/img/metrics_reports_advanced_v13_0.png (renamed from doc/ci/img/metrics_reports_advanced_v13_0.png)bin13879 -> 13879 bytes
-rw-r--r--doc/ci/testing/img/metrics_reports_v13_0.png (renamed from doc/ci/img/metrics_reports_v13_0.png)bin17996 -> 17996 bytes
-rw-r--r--doc/ci/testing/img/test_coverage_visualization_v12_9.png (renamed from doc/user/project/merge_requests/img/test_coverage_visualization_v12_9.png)bin17559 -> 17559 bytes
-rw-r--r--doc/ci/testing/img/unit_test_report_screenshot_v13_12.pngbin0 -> 17368 bytes
-rw-r--r--doc/ci/testing/index.md24
-rw-r--r--doc/ci/testing/load_performance_testing.md201
-rw-r--r--doc/ci/testing/metrics_reports.md68
-rw-r--r--doc/ci/testing/test_coverage_visualization.md435
-rw-r--r--doc/ci/testing/unit_test_reports.md22
-rw-r--r--doc/ci/troubleshooting.md23
-rw-r--r--doc/ci/variables/index.md4
-rw-r--r--doc/ci/variables/predefined_variables.md49
-rw-r--r--doc/ci/yaml/artifacts_reports.md43
-rw-r--r--doc/ci/yaml/index.md169
-rw-r--r--doc/ci/yaml/workflow.md41
-rw-r--r--doc/development/adding_database_indexes.md124
-rw-r--r--doc/development/api_graphql_styleguide.md62
-rw-r--r--doc/development/application_limits.md5
-rw-r--r--doc/development/application_slis/rails_request_apdex.md2
-rw-r--r--doc/development/appsec/index.md35
-rw-r--r--doc/development/backend/ruby_style_guide.md2
-rw-r--r--doc/development/cicd/pipeline_wizard.md18
-rw-r--r--doc/development/cicd/templates.md33
-rw-r--r--doc/development/code_review.md69
-rw-r--r--doc/development/contributing/index.md2
-rw-r--r--doc/development/contributing/issue_workflow.md2
-rw-r--r--doc/development/dangerbot.md12
-rw-r--r--doc/development/database/add_foreign_key_to_existing_column.md21
-rw-r--r--doc/development/database/batched_background_migrations.md135
-rw-r--r--doc/development/database/constraint_naming_convention.md2
-rw-r--r--doc/development/database/loose_foreign_keys.md4
-rw-r--r--doc/development/database/multiple_databases.md61
-rw-r--r--doc/development/database/transaction_guidelines.md4
-rw-r--r--doc/development/deprecation_guidelines/img/deprecation_removal_process.pngbin53890 -> 27632 bytes
-rw-r--r--doc/development/deprecation_guidelines/index.md4
-rw-r--r--doc/development/development_processes.md124
-rw-r--r--doc/development/documentation/restful_api_styleguide.md20
-rw-r--r--doc/development/documentation/site_architecture/folder_structure.md9
-rw-r--r--doc/development/documentation/site_architecture/index.md13
-rw-r--r--doc/development/documentation/styleguide/index.md15
-rw-r--r--doc/development/documentation/testing.md1
-rw-r--r--doc/development/event_store.md21
-rw-r--r--doc/development/experiment_guide/experiment_code_reviews.md2
-rw-r--r--doc/development/experiment_guide/experiment_rollout.md2
-rw-r--r--doc/development/experiment_guide/implementing_experiments.md2
-rw-r--r--doc/development/experiment_guide/index.md2
-rw-r--r--doc/development/experiment_guide/testing_experiments.md2
-rw-r--r--doc/development/fe_guide/graphql.md8
-rw-r--r--doc/development/fe_guide/haml.md19
-rw-r--r--doc/development/fe_guide/index.md4
-rw-r--r--doc/development/fe_guide/style/scss.md2
-rw-r--r--doc/development/fe_guide/view_component.md174
-rw-r--r--doc/development/fe_guide/vue.md209
-rw-r--r--doc/development/feature_development.md197
-rw-r--r--doc/development/feature_flags/index.md7
-rw-r--r--doc/development/fips_compliance.md227
-rw-r--r--doc/development/foreign_keys.md73
-rw-r--r--doc/development/geo.md255
-rw-r--r--doc/development/geo/proxying.md356
-rw-r--r--doc/development/git_object_deduplication.md3
-rw-r--r--doc/development/gitaly.md28
-rw-r--r--doc/development/gitlab_flavored_markdown/specification_guide/index.md79
-rw-r--r--doc/development/go_guide/index.md37
-rw-r--r--doc/development/i18n/externalization.md50
-rw-r--r--doc/development/i18n/proofreader.md4
-rw-r--r--doc/development/import_project.md67
-rw-r--r--doc/development/index.md304
-rw-r--r--doc/development/integrations/index.md1
-rw-r--r--doc/development/integrations/secure.md46
-rw-r--r--doc/development/internal_api/index.md7
-rw-r--r--doc/development/iterating_tables_in_batches.md35
-rw-r--r--doc/development/licensed_feature_availability.md9
-rw-r--r--doc/development/migration_style_guide.md14
-rw-r--r--doc/development/omnibus.md2
-rw-r--r--doc/development/packages/debian_repository.md151
-rw-r--r--doc/development/packages/structure.md1
-rw-r--r--doc/development/performance.md6
-rw-r--r--doc/development/pipelines.md41
-rw-r--r--doc/development/product_qualified_lead_guide/index.md2
-rw-r--r--doc/development/rails_initializers.md18
-rw-r--r--doc/development/rake_tasks.md30
-rw-r--r--doc/development/reusing_abstractions.md4
-rw-r--r--doc/development/secure_coding_guidelines.md28
-rw-r--r--doc/development/service_ping/implement.md4
-rw-r--r--doc/development/service_ping/index.md40
-rw-r--r--doc/development/service_ping/metrics_dictionary.md40
-rw-r--r--doc/development/service_ping/metrics_instrumentation.md2
-rw-r--r--doc/development/service_ping/metrics_lifecycle.md2
-rw-r--r--doc/development/service_ping/performance_indicator_metrics.md2
-rw-r--r--doc/development/service_ping/review_guidelines.md2
-rw-r--r--doc/development/service_ping/troubleshooting.md12
-rw-r--r--doc/development/service_ping/usage_data.md2
-rw-r--r--doc/development/sidekiq/compatibility_across_updates.md5
-rw-r--r--doc/development/snowplow/event_dictionary_guide.md2
-rw-r--r--doc/development/snowplow/implementation.md18
-rw-r--r--doc/development/snowplow/index.md2
-rw-r--r--doc/development/snowplow/infrastructure.md2
-rw-r--r--doc/development/snowplow/review_guidelines.md2
-rw-r--r--doc/development/snowplow/schemas.md2
-rw-r--r--doc/development/snowplow/troubleshooting.md2
-rw-r--r--doc/development/stage_group_dashboards.md11
-rw-r--r--doc/development/testing_guide/best_practices.md60
-rw-r--r--doc/development/testing_guide/contract/consumer_tests.md44
-rw-r--r--doc/development/testing_guide/contract/index.md39
-rw-r--r--doc/development/testing_guide/contract/provider_tests.md77
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md2
-rw-r--r--doc/development/testing_guide/end_to_end/index.md2
-rw-r--r--doc/development/testing_guide/end_to_end/resources.md10
-rw-r--r--doc/development/testing_guide/review_apps.md2
-rw-r--r--doc/development/uploads.md9
-rw-r--r--doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md2
-rw-r--r--doc/development/workhorse/new_features.md2
-rw-r--r--doc/gitlab-basics/add-file.md2
-rw-r--r--doc/gitlab-basics/create-branch.md11
-rw-r--r--doc/install/aws/eks_clusters_aws.md2
-rw-r--r--doc/install/aws/gitlab_sre_for_aws.md16
-rw-r--r--doc/install/aws/index.md22
-rw-r--r--doc/install/aws/manual_install_aws.md234
-rw-r--r--doc/install/docker.md9
-rw-r--r--doc/install/installation.md38
-rw-r--r--doc/install/requirements.md34
-rw-r--r--doc/integration/advanced_search/elasticsearch.md13
-rw-r--r--doc/integration/github.md2
-rw-r--r--doc/integration/gitlab.md7
-rw-r--r--doc/integration/jira/development_panel.md2
-rw-r--r--doc/integration/jira/index.md4
-rw-r--r--doc/integration/kerberos.md4
-rw-r--r--doc/integration/oauth_provider.md11
-rw-r--r--doc/integration/slash_commands.md2
-rw-r--r--doc/integration/twitter.md5
-rw-r--r--doc/operations/feature_flags.md1
-rw-r--r--doc/operations/incident_management/alerts.md5
-rw-r--r--doc/operations/incident_management/img/timeline_events_v15_1.pngbin0 -> 36994 bytes
-rw-r--r--doc/operations/incident_management/incidents.md87
-rw-r--r--doc/operations/incident_management/paging.md5
-rw-r--r--doc/operations/index.md27
-rw-r--r--doc/operations/metrics/dashboards/index.md3
-rw-r--r--doc/operations/metrics/embed_grafana.md5
-rw-r--r--doc/operations/metrics/img/prometheus_integration_alerts.pngbin16084 -> 0 bytes
-rw-r--r--doc/operations/metrics/index.md2
-rw-r--r--doc/operations/product_analytics.md2
-rw-r--r--doc/policy/alpha-beta-support.md4
-rw-r--r--doc/policy/maintenance.md10
-rw-r--r--doc/public_access/public_access.md11
-rw-r--r--doc/raketasks/backup_gitlab.md908
-rw-r--r--doc/raketasks/backup_restore.md1513
-rw-r--r--doc/raketasks/features.md9
-rw-r--r--doc/raketasks/import.md8
-rw-r--r--doc/raketasks/index.md1
-rw-r--r--doc/raketasks/restore_gitlab.md367
-rw-r--r--doc/raketasks/user_management.md2
-rw-r--r--doc/security/password_storage.md22
-rw-r--r--doc/security/rate_limits.md1
-rw-r--r--doc/security/ssh_keys_restrictions.md10
-rw-r--r--doc/security/two_factor_authentication.md54
-rw-r--r--doc/ssh/index.md11
-rw-r--r--doc/subscriptions/bronze_starter.md2
-rw-r--r--doc/subscriptions/gitlab_dedicated/index.md6
-rw-r--r--doc/subscriptions/self_managed/index.md63
-rw-r--r--doc/system_hooks/system_hooks.md11
-rw-r--r--doc/tools/email.md11
-rw-r--r--doc/topics/application_development_platform/index.md1
-rw-r--r--doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md116
-rw-r--r--doc/topics/autodevops/cloud_deployments/img/guide_base_domain_v12_3.pngbin42811 -> 0 bytes
-rw-r--r--doc/topics/autodevops/cloud_deployments/img/guide_create_project_v12_3.pngbin47644 -> 0 bytes
-rw-r--r--doc/topics/autodevops/cloud_deployments/img/guide_enable_autodevops_v12_3.pngbin49125 -> 0 bytes
-rw-r--r--doc/topics/autodevops/cloud_deployments/img/guide_merge_request_review_app_v12_3.pngbin74324 -> 0 bytes
-rw-r--r--doc/topics/autodevops/cloud_deployments/img/guide_merge_request_v12_3.pngbin82031 -> 0 bytes
-rw-r--r--doc/topics/autodevops/cloud_deployments/img/guide_project_landing_page_v12_10.pngbin21320 -> 0 bytes
-rw-r--r--doc/topics/autodevops/cloud_deployments/img/guide_project_template_v12_3.pngbin46440 -> 0 bytes
-rw-r--r--doc/topics/autodevops/customize.md30
-rw-r--r--doc/topics/autodevops/requirements.md2
-rw-r--r--doc/topics/autodevops/stages.md12
-rw-r--r--doc/topics/offline/quick_start_guide.md8
-rw-r--r--doc/topics/use_gitlab.md11
-rw-r--r--doc/tutorials/make_your_first_git_commit.md2
-rw-r--r--doc/tutorials/move_personal_project_to_a_group.md2
-rw-r--r--doc/update/deprecations.md42
-rw-r--r--doc/update/index.md60
-rw-r--r--doc/update/package/convert_to_ee.md26
-rw-r--r--doc/update/package/downgrade.md2
-rw-r--r--doc/update/package/index.md7
-rw-r--r--doc/update/patch_versions.md6
-rw-r--r--doc/update/plan_your_upgrade.md4
-rw-r--r--doc/update/removals.md72
-rw-r--r--doc/update/upgrading_from_ce_to_ee.md6
-rw-r--r--doc/update/upgrading_from_source.md19
-rw-r--r--doc/update/with_downtime.md20
-rw-r--r--doc/update/zero_downtime.md30
-rw-r--r--doc/user/admin_area/analytics/dev_ops_report.md9
-rw-r--r--doc/user/admin_area/broadcast_messages.md2
-rw-r--r--doc/user/admin_area/geo_nodes.md120
-rw-r--r--doc/user/admin_area/geo_sites.md117
-rw-r--r--doc/user/admin_area/index.md20
-rw-r--r--doc/user/admin_area/license_file.md7
-rw-r--r--doc/user/admin_area/moderate_users.md2
-rw-r--r--doc/user/admin_area/monitoring/background_migrations.md3
-rw-r--r--doc/user/admin_area/reporting/git_abuse_rate_limit.md29
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md8
-rw-r--r--doc/user/admin_area/settings/external_authorization.md2
-rw-r--r--doc/user/admin_area/settings/gitaly_timeouts.md5
-rw-r--r--doc/user/admin_area/settings/incident_management_rate_limits.md38
-rw-r--r--doc/user/admin_area/settings/index.md1
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md2
-rw-r--r--doc/user/analytics/ci_cd_analytics.md16
-rw-r--r--doc/user/analytics/img/time_to_restore_service_charts_v15_1.pngbin86137 -> 30457 bytes
-rw-r--r--doc/user/analytics/index.md10
-rw-r--r--doc/user/analytics/value_stream_analytics.md2
-rw-r--r--doc/user/application_security/api_fuzzing/index.md34
-rw-r--r--doc/user/application_security/configuration/index.md2
-rw-r--r--doc/user/application_security/container_scanning/index.md19
-rw-r--r--doc/user/application_security/coverage_fuzzing/index.md5
-rw-r--r--doc/user/application_security/dast/checks/1004.1.md2
-rw-r--r--doc/user/application_security/dast/checks/16.10.md30
-rw-r--r--doc/user/application_security/dast/checks/16.3.md2
-rw-r--r--doc/user/application_security/dast/checks/16.5.md2
-rw-r--r--doc/user/application_security/dast/checks/16.6.md2
-rw-r--r--doc/user/application_security/dast/checks/16.8.md30
-rw-r--r--doc/user/application_security/dast/checks/16.9.md32
-rw-r--r--doc/user/application_security/dast/checks/209.2.md43
-rw-r--r--doc/user/application_security/dast/checks/287.1.md33
-rw-r--r--doc/user/application_security/dast/checks/287.2.md35
-rw-r--r--doc/user/application_security/dast/checks/601.1.md14
-rw-r--r--doc/user/application_security/dast/checks/614.1.md2
-rw-r--r--doc/user/application_security/dast/checks/798.1.md26
-rw-r--r--doc/user/application_security/dast/checks/798.10.md26
-rw-r--r--doc/user/application_security/dast/checks/798.100.md26
-rw-r--r--doc/user/application_security/dast/checks/798.101.md26
-rw-r--r--doc/user/application_security/dast/checks/798.102.md26
-rw-r--r--doc/user/application_security/dast/checks/798.103.md26
-rw-r--r--doc/user/application_security/dast/checks/798.104.md26
-rw-r--r--doc/user/application_security/dast/checks/798.105.md26
-rw-r--r--doc/user/application_security/dast/checks/798.106.md26
-rw-r--r--doc/user/application_security/dast/checks/798.107.md26
-rw-r--r--doc/user/application_security/dast/checks/798.108.md26
-rw-r--r--doc/user/application_security/dast/checks/798.109.md26
-rw-r--r--doc/user/application_security/dast/checks/798.11.md26
-rw-r--r--doc/user/application_security/dast/checks/798.110.md26
-rw-r--r--doc/user/application_security/dast/checks/798.111.md26
-rw-r--r--doc/user/application_security/dast/checks/798.112.md26
-rw-r--r--doc/user/application_security/dast/checks/798.113.md26
-rw-r--r--doc/user/application_security/dast/checks/798.114.md26
-rw-r--r--doc/user/application_security/dast/checks/798.115.md26
-rw-r--r--doc/user/application_security/dast/checks/798.116.md26
-rw-r--r--doc/user/application_security/dast/checks/798.117.md26
-rw-r--r--doc/user/application_security/dast/checks/798.118.md26
-rw-r--r--doc/user/application_security/dast/checks/798.119.md26
-rw-r--r--doc/user/application_security/dast/checks/798.12.md26
-rw-r--r--doc/user/application_security/dast/checks/798.120.md26
-rw-r--r--doc/user/application_security/dast/checks/798.121.md26
-rw-r--r--doc/user/application_security/dast/checks/798.122.md26
-rw-r--r--doc/user/application_security/dast/checks/798.123.md26
-rw-r--r--doc/user/application_security/dast/checks/798.124.md26
-rw-r--r--doc/user/application_security/dast/checks/798.125.md26
-rw-r--r--doc/user/application_security/dast/checks/798.126.md26
-rw-r--r--doc/user/application_security/dast/checks/798.127.md26
-rw-r--r--doc/user/application_security/dast/checks/798.128.md26
-rw-r--r--doc/user/application_security/dast/checks/798.13.md26
-rw-r--r--doc/user/application_security/dast/checks/798.14.md26
-rw-r--r--doc/user/application_security/dast/checks/798.15.md26
-rw-r--r--doc/user/application_security/dast/checks/798.16.md26
-rw-r--r--doc/user/application_security/dast/checks/798.17.md26
-rw-r--r--doc/user/application_security/dast/checks/798.18.md26
-rw-r--r--doc/user/application_security/dast/checks/798.19.md26
-rw-r--r--doc/user/application_security/dast/checks/798.2.md26
-rw-r--r--doc/user/application_security/dast/checks/798.20.md26
-rw-r--r--doc/user/application_security/dast/checks/798.21.md26
-rw-r--r--doc/user/application_security/dast/checks/798.22.md26
-rw-r--r--doc/user/application_security/dast/checks/798.23.md26
-rw-r--r--doc/user/application_security/dast/checks/798.24.md26
-rw-r--r--doc/user/application_security/dast/checks/798.25.md26
-rw-r--r--doc/user/application_security/dast/checks/798.26.md26
-rw-r--r--doc/user/application_security/dast/checks/798.27.md26
-rw-r--r--doc/user/application_security/dast/checks/798.28.md26
-rw-r--r--doc/user/application_security/dast/checks/798.29.md26
-rw-r--r--doc/user/application_security/dast/checks/798.3.md26
-rw-r--r--doc/user/application_security/dast/checks/798.30.md26
-rw-r--r--doc/user/application_security/dast/checks/798.31.md26
-rw-r--r--doc/user/application_security/dast/checks/798.32.md26
-rw-r--r--doc/user/application_security/dast/checks/798.33.md26
-rw-r--r--doc/user/application_security/dast/checks/798.34.md26
-rw-r--r--doc/user/application_security/dast/checks/798.35.md26
-rw-r--r--doc/user/application_security/dast/checks/798.36.md26
-rw-r--r--doc/user/application_security/dast/checks/798.37.md26
-rw-r--r--doc/user/application_security/dast/checks/798.38.md26
-rw-r--r--doc/user/application_security/dast/checks/798.39.md26
-rw-r--r--doc/user/application_security/dast/checks/798.4.md26
-rw-r--r--doc/user/application_security/dast/checks/798.40.md26
-rw-r--r--doc/user/application_security/dast/checks/798.41.md26
-rw-r--r--doc/user/application_security/dast/checks/798.42.md26
-rw-r--r--doc/user/application_security/dast/checks/798.43.md26
-rw-r--r--doc/user/application_security/dast/checks/798.44.md26
-rw-r--r--doc/user/application_security/dast/checks/798.45.md26
-rw-r--r--doc/user/application_security/dast/checks/798.46.md26
-rw-r--r--doc/user/application_security/dast/checks/798.47.md26
-rw-r--r--doc/user/application_security/dast/checks/798.48.md26
-rw-r--r--doc/user/application_security/dast/checks/798.49.md26
-rw-r--r--doc/user/application_security/dast/checks/798.5.md26
-rw-r--r--doc/user/application_security/dast/checks/798.50.md26
-rw-r--r--doc/user/application_security/dast/checks/798.51.md26
-rw-r--r--doc/user/application_security/dast/checks/798.52.md26
-rw-r--r--doc/user/application_security/dast/checks/798.53.md26
-rw-r--r--doc/user/application_security/dast/checks/798.54.md26
-rw-r--r--doc/user/application_security/dast/checks/798.55.md26
-rw-r--r--doc/user/application_security/dast/checks/798.56.md26
-rw-r--r--doc/user/application_security/dast/checks/798.57.md26
-rw-r--r--doc/user/application_security/dast/checks/798.58.md26
-rw-r--r--doc/user/application_security/dast/checks/798.59.md26
-rw-r--r--doc/user/application_security/dast/checks/798.6.md26
-rw-r--r--doc/user/application_security/dast/checks/798.60.md26
-rw-r--r--doc/user/application_security/dast/checks/798.61.md26
-rw-r--r--doc/user/application_security/dast/checks/798.62.md26
-rw-r--r--doc/user/application_security/dast/checks/798.63.md26
-rw-r--r--doc/user/application_security/dast/checks/798.64.md26
-rw-r--r--doc/user/application_security/dast/checks/798.65.md26
-rw-r--r--doc/user/application_security/dast/checks/798.66.md26
-rw-r--r--doc/user/application_security/dast/checks/798.67.md26
-rw-r--r--doc/user/application_security/dast/checks/798.68.md26
-rw-r--r--doc/user/application_security/dast/checks/798.69.md26
-rw-r--r--doc/user/application_security/dast/checks/798.7.md26
-rw-r--r--doc/user/application_security/dast/checks/798.70.md26
-rw-r--r--doc/user/application_security/dast/checks/798.71.md26
-rw-r--r--doc/user/application_security/dast/checks/798.72.md26
-rw-r--r--doc/user/application_security/dast/checks/798.73.md26
-rw-r--r--doc/user/application_security/dast/checks/798.74.md26
-rw-r--r--doc/user/application_security/dast/checks/798.75.md26
-rw-r--r--doc/user/application_security/dast/checks/798.76.md26
-rw-r--r--doc/user/application_security/dast/checks/798.77.md26
-rw-r--r--doc/user/application_security/dast/checks/798.78.md26
-rw-r--r--doc/user/application_security/dast/checks/798.79.md26
-rw-r--r--doc/user/application_security/dast/checks/798.8.md26
-rw-r--r--doc/user/application_security/dast/checks/798.80.md26
-rw-r--r--doc/user/application_security/dast/checks/798.81.md26
-rw-r--r--doc/user/application_security/dast/checks/798.82.md26
-rw-r--r--doc/user/application_security/dast/checks/798.83.md26
-rw-r--r--doc/user/application_security/dast/checks/798.84.md26
-rw-r--r--doc/user/application_security/dast/checks/798.85.md26
-rw-r--r--doc/user/application_security/dast/checks/798.86.md26
-rw-r--r--doc/user/application_security/dast/checks/798.87.md26
-rw-r--r--doc/user/application_security/dast/checks/798.88.md26
-rw-r--r--doc/user/application_security/dast/checks/798.89.md26
-rw-r--r--doc/user/application_security/dast/checks/798.9.md26
-rw-r--r--doc/user/application_security/dast/checks/798.90.md26
-rw-r--r--doc/user/application_security/dast/checks/798.91.md26
-rw-r--r--doc/user/application_security/dast/checks/798.92.md26
-rw-r--r--doc/user/application_security/dast/checks/798.93.md26
-rw-r--r--doc/user/application_security/dast/checks/798.94.md26
-rw-r--r--doc/user/application_security/dast/checks/798.95.md26
-rw-r--r--doc/user/application_security/dast/checks/798.96.md26
-rw-r--r--doc/user/application_security/dast/checks/798.97.md26
-rw-r--r--doc/user/application_security/dast/checks/798.98.md26
-rw-r--r--doc/user/application_security/dast/checks/798.99.md26
-rw-r--r--doc/user/application_security/dast/checks/index.md134
-rw-r--r--doc/user/application_security/dast/dast_troubleshooting.md5
-rw-r--r--doc/user/application_security/dast/index.md14
-rw-r--r--doc/user/application_security/dast_api/index.md26
-rw-r--r--doc/user/application_security/dependency_scanning/index.md65
-rw-r--r--doc/user/application_security/generate_test_vulnerabilities/index.md28
-rw-r--r--doc/user/application_security/index.md80
-rw-r--r--doc/user/application_security/policies/img/policies_list_v15_0.pngbin29041 -> 0 bytes
-rw-r--r--doc/user/application_security/policies/img/policies_list_v15_1.pngbin0 -> 36075 bytes
-rw-r--r--doc/user/application_security/policies/index.md2
-rw-r--r--doc/user/application_security/policies/scan-execution-policies.md45
-rw-r--r--doc/user/application_security/policies/scan-result-policies.md12
-rw-r--r--doc/user/application_security/sast/index.md84
-rw-r--r--doc/user/application_security/secret_detection/index.md5
-rw-r--r--doc/user/application_security/security_dashboard/index.md51
-rw-r--r--doc/user/application_security/terminology/index.md5
-rw-r--r--doc/user/application_security/vulnerabilities/index.md9
-rw-r--r--doc/user/application_security/vulnerability_report/pipeline.md141
-rw-r--r--doc/user/clusters/agent/ci_cd_workflow.md34
-rw-r--r--doc/user/clusters/agent/gitops.md2
-rw-r--r--doc/user/clusters/agent/index.md20
-rw-r--r--doc/user/clusters/agent/install/index.md11
-rw-r--r--doc/user/clusters/agent/troubleshooting.md22
-rw-r--r--doc/user/clusters/agent/vulnerabilities.md40
-rw-r--r--doc/user/clusters/agent/work_with_agent.md24
-rw-r--r--doc/user/clusters/integrations.md75
-rw-r--r--doc/user/compliance/compliance_report/index.md2
-rw-r--r--doc/user/compliance/license_compliance/index.md10
-rw-r--r--doc/user/crm/index.md10
-rw-r--r--doc/user/discussions/img/start_image_discussion.gifbin208151 -> 0 bytes
-rw-r--r--doc/user/discussions/index.md10
-rw-r--r--doc/user/free_user_limit.md2
-rw-r--r--doc/user/gitlab_com/index.md24
-rw-r--r--doc/user/group/epics/manage_epics.md14
-rw-r--r--doc/user/group/import/index.md2
-rw-r--r--doc/user/group/index.md66
-rw-r--r--doc/user/group/saml_sso/group_managed_accounts.md14
-rw-r--r--doc/user/group/saml_sso/group_sync.md10
-rw-r--r--doc/user/group/saml_sso/img/unlink_group_saml.pngbin9399 -> 0 bytes
-rw-r--r--doc/user/group/saml_sso/index.md10
-rw-r--r--doc/user/group/saml_sso/scim_setup.md22
-rw-r--r--doc/user/group/settings/group_access_tokens.md4
-rw-r--r--doc/user/group/subgroups/index.md13
-rw-r--r--doc/user/group/value_stream_analytics/index.md144
-rw-r--r--doc/user/infrastructure/clusters/connect/img/variables_civo.pngbin74744 -> 22629 bytes
-rw-r--r--doc/user/infrastructure/clusters/connect/new_civo_cluster.md6
-rw-r--r--doc/user/infrastructure/clusters/index.md10
-rw-r--r--doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md2
-rw-r--r--doc/user/infrastructure/iac/terraform_state.md13
-rw-r--r--doc/user/infrastructure/iac/troubleshooting.md9
-rw-r--r--doc/user/packages/conan_repository/index.md5
-rw-r--r--doc/user/packages/container_registry/index.md32
-rw-r--r--doc/user/packages/debian_repository/index.md3
-rw-r--r--doc/user/packages/dependency_proxy/index.md8
-rw-r--r--doc/user/packages/generic_packages/index.md22
-rw-r--r--doc/user/packages/helm_repository/index.md5
-rw-r--r--doc/user/packages/infrastructure_registry/index.md16
-rw-r--r--doc/user/packages/npm_registry/index.md9
-rw-r--r--doc/user/packages/package_registry/reduce_package_registry_storage.md36
-rw-r--r--doc/user/packages/pypi_repository/index.md61
-rw-r--r--doc/user/packages/terraform_module_registry/index.md13
-rw-r--r--doc/user/permissions.md6
-rw-r--r--doc/user/profile/account/create_accounts.md33
-rw-r--r--doc/user/profile/account/img/admin_user_button.pngbin31006 -> 0 bytes
-rw-r--r--doc/user/profile/account/img/admin_user_form.pngbin67281 -> 0 bytes
-rw-r--r--doc/user/profile/account/img/register_v13_6.pngbin42777 -> 0 bytes
-rw-r--r--doc/user/profile/account/two_factor_authentication.md3
-rw-r--r--doc/user/profile/index.md2
-rw-r--r--doc/user/profile/personal_access_tokens.md4
-rw-r--r--doc/user/project/clusters/img/kubernetes_pod_logs_v12_10.pngbin143236 -> 0 bytes
-rw-r--r--doc/user/project/clusters/img/pod_logs_deploy_board.pngbin13291 -> 0 bytes
-rw-r--r--doc/user/project/clusters/kubernetes_pod_logs.md119
-rw-r--r--doc/user/project/code_owners.md6
-rw-r--r--doc/user/project/deploy_keys/index.md2
-rw-r--r--doc/user/project/highlighting.md2
-rw-r--r--doc/user/project/img/labels_drag_priority_v12_1.gifbin958437 -> 0 bytes
-rw-r--r--doc/user/project/img/time_tracking_report_v15_1.pngbin31669 -> 14862 bytes
-rw-r--r--doc/user/project/import/bitbucket.md8
-rw-r--r--doc/user/project/index.md4
-rw-r--r--doc/user/project/integrations/bamboo.md64
-rw-r--r--doc/user/project/integrations/mock_ci.md3
-rw-r--r--doc/user/project/integrations/webhook_events.md46
-rw-r--r--doc/user/project/issues/csv_import.md35
-rw-r--r--doc/user/project/issues/img/close_issue_from_board.gifbin109533 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/multiple_assignees.gifbin877551 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/turn_off_confidentiality_v15_0.pngbin10137 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/turn_on_confidentiality_v15_0.pngbin7550 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/turn_on_confidentiality_v15_1.pngbin37584 -> 16370 bytes
-rw-r--r--doc/user/project/issues/managing_issues.md2
-rw-r--r--doc/user/project/issues/multiple_assignees_for_issues.md35
-rw-r--r--doc/user/project/labels.md2
-rw-r--r--doc/user/project/members/index.md2
-rw-r--r--doc/user/project/members/share_project_with_groups.md24
-rw-r--r--doc/user/project/merge_requests/accessibility_testing.md79
-rw-r--r--doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v12_7.pngbin25594 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v15_2.pngbin0 -> 11263 bytes
-rw-r--r--doc/user/project/merge_requests/approvals/rules.md4
-rw-r--r--doc/user/project/merge_requests/approvals/settings.md6
-rw-r--r--doc/user/project/merge_requests/browser_performance_testing.md245
-rw-r--r--doc/user/project/merge_requests/code_quality.md637
-rw-r--r--doc/user/project/merge_requests/creating_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/csv_export.md2
-rw-r--r--doc/user/project/merge_requests/drafts.md8
-rw-r--r--doc/user/project/merge_requests/fail_fast_testing.md100
-rw-r--r--doc/user/project/merge_requests/img/attention_request_list_v14_10.pngbin11932 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.pngbin20471 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/merge_method_ff_v15_0.pngbin4744 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/merge_method_merge_commit_v15_0.pngbin14531 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/merge_method_merge_commit_with_semi_linear_history_v15_0.pngbin14867 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/index.md49
-rw-r--r--doc/user/project/merge_requests/load_performance_testing.md204
-rw-r--r--doc/user/project/merge_requests/methods/index.md50
-rw-r--r--doc/user/project/merge_requests/reviews/index.md8
-rw-r--r--doc/user/project/merge_requests/reviews/suggestions.md2
-rw-r--r--doc/user/project/merge_requests/status_checks.md2
-rw-r--r--doc/user/project/merge_requests/test_coverage_visualization.md444
-rw-r--r--doc/user/project/milestones/burndown_and_burnup_charts.md8
-rw-r--r--doc/user/project/milestones/img/burndown_and_burnup_charts_v15_1.pngbin34450 -> 0 bytes
-rw-r--r--doc/user/project/milestones/img/burndown_and_burnup_charts_v15_3.pngbin0 -> 47558 bytes
-rw-r--r--doc/user/project/milestones/img/burndown_chart_v15_1.pngbin20287 -> 0 bytes
-rw-r--r--doc/user/project/milestones/img/burndown_chart_v15_3.pngbin0 -> 26157 bytes
-rw-r--r--doc/user/project/milestones/img/burnup_chart_v15_1.pngbin21144 -> 0 bytes
-rw-r--r--doc/user/project/milestones/img/burnup_chart_v15_3.pngbin0 -> 26933 bytes
-rw-r--r--doc/user/project/milestones/img/milestones_promote_milestone.pngbin49288 -> 0 bytes
-rw-r--r--doc/user/project/milestones/index.md112
-rw-r--r--doc/user/project/pages/redirects.md5
-rw-r--r--doc/user/project/quick_actions.md1
-rw-r--r--doc/user/project/releases/index.md21
-rw-r--r--doc/user/project/repository/branches/default.md2
-rw-r--r--doc/user/project/repository/forking_workflow.md2
-rw-r--r--doc/user/project/repository/img/repository_languages_v12_2.gifbin159195 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/repository_languages_v15_2.pngbin0 -> 22240 bytes
-rw-r--r--doc/user/project/repository/index.md4
-rw-r--r--doc/user/project/repository/managing_large_repositories.md8
-rw-r--r--doc/user/project/repository/mirror/index.md11
-rw-r--r--doc/user/project/repository/mirror/pull.md2
-rw-r--r--doc/user/project/repository/reducing_the_repo_size_using_git.md15
-rw-r--r--doc/user/project/repository/web_editor.md2
-rw-r--r--doc/user/project/settings/img/cve_id_request_toggle.pngbin5395 -> 0 bytes
-rw-r--r--doc/user/project/settings/index.md172
-rw-r--r--doc/user/project/wiki/img/content_editor_v14.6.pngbin15534 -> 0 bytes
-rw-r--r--doc/user/project/wiki/img/use_new_editor_button_v14.6.pngbin11192 -> 0 bytes
-rw-r--r--doc/user/project/wiki/index.md20
-rw-r--r--doc/user/project/working_with_projects.md6
-rw-r--r--doc/user/public_access.md2
-rw-r--r--doc/user/search/advanced_search.md12
-rw-r--r--doc/user/search/img/basic_search_results_v15_1.pngbin52267 -> 17833 bytes
-rw-r--r--doc/user/search/img/code_search_git_blame_v15_1.pngbin20655 -> 7461 bytes
-rw-r--r--doc/user/ssh.md2
-rw-r--r--doc/user/tasks.md10
-rw-r--r--doc/user/usage_quotas.md54
-rw-r--r--glfm_specification/example_snapshots/examples_index.yml2017
-rw-r--r--glfm_specification/example_snapshots/html.yml7571
-rw-r--r--glfm_specification/example_snapshots/markdown.yml2195
-rw-r--r--glfm_specification/example_snapshots/prosemirror_json.yml19246
-rw-r--r--glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml4
-rw-r--r--jest.config.base.js6
-rw-r--r--lefthook.yml7
-rw-r--r--lib/api/api.rb5
-rw-r--r--lib/api/award_emoji.rb4
-rw-r--r--lib/api/broadcast_messages.rb2
-rw-r--r--lib/api/ci/helpers/runner.rb13
-rw-r--r--lib/api/commits.rb2
-rw-r--r--lib/api/concerns/packages/conan_endpoints.rb1
-rw-r--r--lib/api/debian_group_packages.rb4
-rw-r--r--lib/api/debian_project_packages.rb4
-rw-r--r--lib/api/entities/ci/job_request/service.rb1
-rw-r--r--lib/api/entities/deploy_key.rb3
-rw-r--r--lib/api/entities/environment.rb37
-rw-r--r--lib/api/entities/group_detail.rb10
-rw-r--r--lib/api/entities/hook.rb5
-rw-r--r--lib/api/entities/issue.rb4
-rw-r--r--lib/api/entities/project.rb1
-rw-r--r--lib/api/entities/terraform/module_version.rb18
-rw-r--r--lib/api/entities/unleash/client_feature_flags.rb12
-rw-r--r--lib/api/entities/user.rb2
-rw-r--r--lib/api/feature_flags_user_lists.rb20
-rw-r--r--lib/api/geo.rb2
-rw-r--r--lib/api/group_debian_distributions.rb4
-rw-r--r--lib/api/groups.rb25
-rw-r--r--lib/api/helpers.rb11
-rw-r--r--lib/api/helpers/integrations_helpers.rb6
-rw-r--r--lib/api/helpers/issues_helpers.rb2
-rw-r--r--lib/api/helpers/pagination_strategies.rb5
-rw-r--r--lib/api/helpers/projects_helpers.rb2
-rw-r--r--lib/api/helpers/protected_tags_helpers.rb15
-rw-r--r--lib/api/helpers/web_hooks_helpers.rb70
-rw-r--r--lib/api/hooks/test.rb21
-rw-r--r--lib/api/hooks/url_variables.rb45
-rw-r--r--lib/api/internal/base.rb12
-rw-r--r--lib/api/internal/error_tracking.rb56
-rw-r--r--lib/api/internal/kubernetes.rb4
-rw-r--r--lib/api/internal/pages.rb10
-rw-r--r--lib/api/maven_packages.rb4
-rw-r--r--lib/api/metadata.rb39
-rw-r--r--lib/api/project_debian_distributions.rb4
-rw-r--r--lib/api/project_hooks.rb53
-rw-r--r--lib/api/projects.rb1
-rw-r--r--lib/api/protected_tags.rb7
-rw-r--r--lib/api/pypi_packages.rb2
-rw-r--r--lib/api/repositories.rb8
-rw-r--r--lib/api/snippets.rb12
-rw-r--r--lib/api/system_hooks.rb79
-rw-r--r--lib/api/tags.rb6
-rw-r--r--lib/api/terraform/modules/v1/packages.rb37
-rw-r--r--lib/api/terraform/state.rb2
-rw-r--r--lib/api/unleash.rb33
-rw-r--r--lib/api/usage_data.rb2
-rw-r--r--lib/api/users.rb28
-rw-r--r--lib/backup/gitaly_backup.rb4
-rw-r--r--lib/banzai/filter/footnote_filter.rb7
-rw-r--r--lib/bulk_imports/groups/transformers/group_attributes_transformer.rb28
-rw-r--r--lib/bulk_imports/network_error.rb4
-rw-r--r--lib/bulk_imports/pipeline/runner.rb26
-rw-r--r--lib/bulk_imports/retry_pipeline_error.rb13
-rw-r--r--lib/container_registry/gitlab_api_client.rb2
-rw-r--r--lib/error_tracking/collector/dsn.rb30
-rw-r--r--lib/error_tracking/stacktrace_builder.rb4
-rw-r--r--lib/feature.rb11
-rw-r--r--lib/feature/definition.rb2
-rw-r--r--lib/feature/gitaly.rb2
-rw-r--r--lib/feature/logger.rb2
-rw-r--r--lib/feature/shared.rb2
-rw-r--r--lib/generators/gitlab/usage_metric_definition/redis_hll_generator.rb12
-rw-r--r--lib/generators/model/model_generator.rb25
-rw-r--r--lib/gitlab/application_rate_limiter.rb72
-rw-r--r--lib/gitlab/application_rate_limiter/base_strategy.rb24
-rw-r--r--lib/gitlab/application_rate_limiter/increment_per_action.rb22
-rw-r--r--lib/gitlab/application_rate_limiter/increment_per_actioned_resource.rb31
-rw-r--r--lib/gitlab/auth.rb22
-rw-r--r--lib/gitlab/auth/ldap/user.rb6
-rw-r--r--lib/gitlab/background_migration/backfill_ci_runner_semver.rb31
-rw-r--r--lib/gitlab/background_migration/backfill_imported_issue_search_data.rb62
-rw-r--r--lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb14
-rw-r--r--lib/gitlab/background_migration/batched_migration_job.rb14
-rw-r--r--lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb2
-rw-r--r--lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb2
-rw-r--r--lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy.rb21
-rw-r--r--lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy.rb17
-rw-r--r--lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb37
-rw-r--r--lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb23
-rw-r--r--lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb28
-rw-r--r--lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb2
-rw-r--r--lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb28
-rw-r--r--lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb4
-rw-r--r--lib/gitlab/background_migration/set_correct_vulnerability_state.rb19
-rw-r--r--lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb44
-rw-r--r--lib/gitlab/bitbucket_import/importer.rb8
-rw-r--r--lib/gitlab/changelog/config.rb9
-rw-r--r--lib/gitlab/ci/build/artifacts/expire_in_parser.rb59
-rw-r--r--lib/gitlab/ci/build/duration_parser.rb57
-rw-r--r--lib/gitlab/ci/build/rules/rule/clause/changes.rb20
-rw-r--r--lib/gitlab/ci/config/entry/artifacts.rb2
-rw-r--r--lib/gitlab/ci/config/entry/environment.rb2
-rw-r--r--lib/gitlab/ci/config/entry/image.rb2
-rw-r--r--lib/gitlab/ci/config/entry/processable.rb10
-rw-r--r--lib/gitlab/ci/config/entry/rules.rb2
-rw-r--r--lib/gitlab/ci/config/entry/rules/rule/changes.rb50
-rw-r--r--lib/gitlab/ci/config/entry/service.rb28
-rw-r--r--lib/gitlab/ci/config/external/context.rb15
-rw-r--r--lib/gitlab/ci/config/external/file/project.rb12
-rw-r--r--lib/gitlab/ci/config/external/mapper.rb6
-rw-r--r--lib/gitlab/ci/jwt.rb3
-rw-r--r--lib/gitlab/ci/pipeline/chain/create.rb12
-rw-r--r--lib/gitlab/ci/pipeline/metrics.rb9
-rw-r--r--lib/gitlab/ci/queue/metrics.rb6
-rw-r--r--lib/gitlab/ci/reports/coverage_report_generator.rb12
-rw-r--r--lib/gitlab/ci/reports/test_report.rb59
-rw-r--r--lib/gitlab/ci/reports/test_reports.rb59
-rw-r--r--lib/gitlab/ci/reports/test_reports_comparer.rb2
-rw-r--r--lib/gitlab/ci/runner/metrics.rb41
-rw-r--r--lib/gitlab/ci/runner_releases.rb67
-rw-r--r--lib/gitlab/ci/runner_upgrade_check.rb101
-rw-r--r--lib/gitlab/ci/status/build/failed.rb5
-rw-r--r--lib/gitlab/ci/status/composite.rb6
-rw-r--r--lib/gitlab/ci/tags/bulk_insert.rb38
-rw-r--r--lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml1
-rw-r--r--lib/gitlab/ci/templates/Android.latest.gitlab-ci.yml14
-rw-r--r--lib/gitlab/ci/templates/Bash.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/C++.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Chef.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/templates/Clojure.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Crystal.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Dart.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Elixir.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Flutter.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/templates/Go.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Grails.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml67
-rw-r--r--lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml11
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Julia.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/templates/Laravel.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Mono.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/PHP.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Ruby.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Rust.gitlab-ci.yml14
-rw-r--r--lib/gitlab/ci/templates/Scala.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Swift.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/dotNET.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/variables/builder.rb3
-rw-r--r--lib/gitlab/ci/yaml_processor.rb12
-rw-r--r--lib/gitlab/ci/yaml_processor/feature_flags.rb50
-rw-r--r--lib/gitlab/cluster/puma_worker_killer_initializer.rb8
-rw-r--r--lib/gitlab/content_security_policy/config_loader.rb9
-rw-r--r--lib/gitlab/contributions_calendar.rb7
-rw-r--r--lib/gitlab/data_builder/deployment.rb9
-rw-r--r--lib/gitlab/data_builder/issuable.rb2
-rw-r--r--lib/gitlab/data_builder/pipeline.rb1
-rw-r--r--lib/gitlab/database.rb40
-rw-r--r--lib/gitlab/database/background_migration/batched_job.rb4
-rw-r--r--lib/gitlab/database/background_migration/batched_migration.rb28
-rw-r--r--lib/gitlab/database/background_migration/batched_migration_runner.rb23
-rw-r--r--lib/gitlab/database/background_migration/health_status.rb33
-rw-r--r--lib/gitlab/database/background_migration/health_status/indicators.rb12
-rw-r--r--lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table.rb41
-rw-r--r--lib/gitlab/database/background_migration/health_status/signals.rb65
-rw-r--r--lib/gitlab/database/each_database.rb5
-rw-r--r--lib/gitlab/database/gitlab_schema.rb6
-rw-r--r--lib/gitlab/database/gitlab_schemas.yml14
-rw-r--r--lib/gitlab/database/load_balancing.rb2
-rw-r--r--lib/gitlab/database/migrations/batched_background_migration_helpers.rb12
-rw-r--r--lib/gitlab/database/migrations/test_batched_background_runner.rb2
-rw-r--r--lib/gitlab/database/postgres_autovacuum_activity.rb20
-rw-r--r--lib/gitlab/database_importers/instance_administrators/create_group.rb4
-rw-r--r--lib/gitlab/dependency_linker/base_linker.rb10
-rw-r--r--lib/gitlab/diff/file.rb2
-rw-r--r--lib/gitlab/diff/file_collection/base.rb16
-rw-r--r--lib/gitlab/diff/formatters/base_formatter.rb11
-rw-r--r--lib/gitlab/diff/highlight_cache.rb7
-rw-r--r--lib/gitlab/diff/position.rb7
-rw-r--r--lib/gitlab/diff/position_tracer/image_strategy.rb9
-rw-r--r--lib/gitlab/diff/position_tracer/line_strategy.rb30
-rw-r--r--lib/gitlab/diff/rendered/notebook/diff_file.rb2
-rw-r--r--lib/gitlab/diff/rendered/notebook/diff_file_helper.rb2
-rw-r--r--lib/gitlab/elasticsearch/logs/lines.rb157
-rw-r--r--lib/gitlab/elasticsearch/logs/pods.rb70
-rw-r--r--lib/gitlab/email/handler/service_desk_handler.rb5
-rw-r--r--lib/gitlab/email/message/in_product_marketing/experience.rb92
-rw-r--r--lib/gitlab/error_tracking.rb5
-rw-r--r--lib/gitlab/error_tracking/error_repository.rb16
-rw-r--r--lib/gitlab/error_tracking/error_repository/active_record_strategy.rb21
-rw-r--r--lib/gitlab/error_tracking/error_repository/open_api_strategy.rb248
-rw-r--r--lib/gitlab/error_tracking/processor/sanitizer_processor.rb48
-rw-r--r--lib/gitlab/event_store.rb5
-rw-r--r--lib/gitlab/git.rb2
-rw-r--r--lib/gitlab/git/blob.rb3
-rw-r--r--lib/gitlab/git/conflict/parser.rb2
-rw-r--r--lib/gitlab/git/repository.rb4
-rw-r--r--lib/gitlab/git/rugged_impl/tree.rb5
-rw-r--r--lib/gitlab/gitaly_client.rb20
-rw-r--r--lib/gitlab/gitaly_client/operation_service.rb27
-rw-r--r--lib/gitlab/gitaly_client/ref_service.rb11
-rw-r--r--lib/gitlab/github_import/importer/events/changed_label.rb43
-rw-r--r--lib/gitlab/github_import/importer/events/closed.rb50
-rw-r--r--lib/gitlab/github_import/importer/events/cross_referenced.rb86
-rw-r--r--lib/gitlab/github_import/importer/events/renamed.rb56
-rw-r--r--lib/gitlab/github_import/importer/events/reopened.rb47
-rw-r--r--lib/gitlab/github_import/importer/issue_event_importer.rb53
-rw-r--r--lib/gitlab/github_import/importer/issue_importer.rb1
-rw-r--r--lib/gitlab/github_import/importer/note_importer.rb11
-rw-r--r--lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer.rb6
-rw-r--r--lib/gitlab/github_import/importer/single_endpoint_issue_events_importer.rb82
-rw-r--r--lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer.rb6
-rw-r--r--lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer.rb6
-rw-r--r--lib/gitlab/github_import/markdown_text.rb30
-rw-r--r--lib/gitlab/github_import/representation/issue_event.rb54
-rw-r--r--lib/gitlab/github_import/single_endpoint_notes_importing.rb91
-rw-r--r--lib/gitlab/github_import/user_finder.rb10
-rw-r--r--lib/gitlab/gpg/commit.rb19
-rw-r--r--lib/gitlab/grape_logging/loggers/response_logger.rb19
-rw-r--r--lib/gitlab/graphql/pagination/keyset/connection.rb2
-rw-r--r--lib/gitlab/harbor/client.rb38
-rw-r--r--lib/gitlab/harbor/query.rb126
-rw-r--r--lib/gitlab/hash_digest/facade.rb29
-rw-r--r--lib/gitlab/hook_data/merge_request_builder.rb3
-rw-r--r--lib/gitlab/http.rb14
-rw-r--r--lib/gitlab/i18n.rb26
-rw-r--r--lib/gitlab/import_export/json/streaming_serializer.rb18
-rw-r--r--lib/gitlab/import_export/project/import_export.yml2
-rw-r--r--lib/gitlab/import_export/project/relation_factory.rb11
-rw-r--r--lib/gitlab/issuable/clone/attributes_rewriter.rb66
-rw-r--r--lib/gitlab/issuable/clone/copy_resource_events_service.rb116
-rw-r--r--lib/gitlab/jira_import/issue_serializer.rb11
-rw-r--r--lib/gitlab/jira_import/issues_importer.rb10
-rw-r--r--lib/gitlab/json.rb2
-rw-r--r--lib/gitlab/lograge/custom_options.rb6
-rw-r--r--lib/gitlab/memory/watchdog.rb192
-rw-r--r--lib/gitlab/metrics/exporter/base_exporter.rb43
-rw-r--r--lib/gitlab/metrics/memory.rb15
-rw-r--r--lib/gitlab/metrics/prometheus.rb1
-rw-r--r--lib/gitlab/metrics/samplers/ruby_sampler.rb12
-rw-r--r--lib/gitlab/metrics/sli.rb4
-rw-r--r--lib/gitlab/metrics/subscribers/active_record.rb7
-rw-r--r--lib/gitlab/pages/cache_control.rb31
-rw-r--r--lib/gitlab/pages/deployment_update.rb111
-rw-r--r--lib/gitlab/pagination/cursor_based_keyset.rb15
-rw-r--r--lib/gitlab/pagination/keyset/cursor_based_request_context.rb4
-rw-r--r--lib/gitlab/pagination/keyset/order.rb8
-rw-r--r--lib/gitlab/quick_actions/issuable_actions.rb26
-rw-r--r--lib/gitlab/quick_actions/users_extractor.rb94
-rw-r--r--lib/gitlab/redis/multi_store.rb19
-rw-r--r--lib/gitlab/regex.rb4
-rw-r--r--lib/gitlab/saas.rb4
-rw-r--r--lib/gitlab/security/scan_configuration.rb2
-rw-r--r--lib/gitlab/sidekiq_daemon/memory_killer.rb41
-rw-r--r--lib/gitlab/sidekiq_logging/structured_logger.rb6
-rw-r--r--lib/gitlab/sidekiq_middleware/server_metrics.rb5
-rw-r--r--lib/gitlab/signed_commit.rb35
-rw-r--r--lib/gitlab/tracking.rb24
-rw-r--r--lib/gitlab/tracking/destinations/snowplow_micro.rb13
-rw-r--r--lib/gitlab/tracking/standard_context.rb8
-rw-r--r--lib/gitlab/tree_summary.rb92
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric.rb29
-rw-r--r--lib/gitlab/usage/service_ping/instrumented_payload.rb7
-rw-r--r--lib/gitlab/usage_data.rb5
-rw-r--r--lib/gitlab/usage_data_counters/editor_unique_counter.rb28
-rw-r--r--lib/gitlab/usage_data_counters/hll_redis_counter.rb26
-rw-r--r--lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb13
-rw-r--r--lib/gitlab/usage_data_counters/known_events/analytics.yml28
-rw-r--r--lib/gitlab/usage_data_counters/known_events/ci_users.yml5
-rw-r--r--lib/gitlab/usage_data_counters/known_events/common.yml33
-rw-r--r--lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb13
-rw-r--r--lib/gitlab/usage_data_counters/work_item_activity_unique_counter.rb4
-rw-r--r--lib/gitlab/version_info.rb49
-rw-r--r--lib/gitlab/wiki_pages/front_matter_parser.rb18
-rw-r--r--lib/gitlab/x509/certificate.rb21
-rw-r--r--lib/gitlab/x509/commit.rb32
-rw-r--r--lib/gitlab/x509/signature.rb2
-rw-r--r--lib/google_api/cloud_platform/client.rb21
-rw-r--r--lib/initializer_connections.rb29
-rw-r--r--lib/learn_gitlab/onboarding.rb22
-rw-r--r--lib/sidebars/groups/menus/packages_registries_menu.rb2
-rw-r--r--lib/sidebars/projects/menus/infrastructure_menu.rb10
-rw-r--r--lib/sidebars/projects/menus/learn_gitlab_menu.rb5
-rw-r--r--lib/sidebars/projects/menus/monitor_menu.rb32
-rw-r--r--lib/sidebars/projects/menus/packages_registries_menu.rb4
-rw-r--r--lib/system_check/app/redis_version_check.rb2
-rw-r--r--lib/tasks/contracts.rake50
-rw-r--r--lib/tasks/contracts/merge_requests.rake47
-rw-r--r--lib/tasks/contracts/pipelines.rake39
-rw-r--r--lib/tasks/dev.rake3
-rw-r--r--lib/tasks/gems.rake108
-rw-r--r--lib/tasks/gitlab/bulk_add_permission.rake12
-rw-r--r--lib/tasks/gitlab/db.rake66
-rw-r--r--lib/tasks/gitlab/db/lock_writes.rake6
-rw-r--r--lib/tasks/gitlab/graphql.rake6
-rw-r--r--lib/tasks/gitlab/web_hook.rake3
-rw-r--r--lib/unnested_in_filters/dsl.rb87
-rw-r--r--lib/unnested_in_filters/rewriter.rb191
-rw-r--r--locale/am_ET/gitlab.po1838
-rw-r--r--locale/ar_SA/gitlab.po1874
-rw-r--r--locale/as_IN/gitlab.po1838
-rw-r--r--locale/az_AZ/gitlab.po1838
-rw-r--r--locale/ba_RU/gitlab.po1829
-rw-r--r--locale/bg/gitlab.po1838
-rw-r--r--locale/bn_BD/gitlab.po1838
-rw-r--r--locale/bn_IN/gitlab.po1838
-rw-r--r--locale/br_FR/gitlab.po1865
-rw-r--r--locale/bs_BA/gitlab.po1847
-rw-r--r--locale/ca_ES/gitlab.po1838
-rw-r--r--locale/cs_CZ/gitlab.po1856
-rw-r--r--locale/cy_GB/gitlab.po1874
-rw-r--r--locale/da_DK/gitlab.po1912
-rw-r--r--locale/de/gitlab.po2482
-rw-r--r--locale/el_GR/gitlab.po1838
-rw-r--r--locale/en_GB/gitlab.po47010
-rw-r--r--locale/eo/gitlab.po1838
-rw-r--r--locale/es/gitlab.po2914
-rw-r--r--locale/et_EE/gitlab.po1838
-rw-r--r--locale/fa_IR/gitlab.po1838
-rw-r--r--locale/fi_FI/gitlab.po1838
-rw-r--r--locale/fil_PH/gitlab.po1838
-rw-r--r--locale/fr/gitlab.po2562
-rw-r--r--locale/gitlab.pot1861
-rw-r--r--locale/gl_ES/gitlab.po1838
-rw-r--r--locale/he_IL/gitlab.po1856
-rw-r--r--locale/hi_IN/gitlab.po1838
-rw-r--r--locale/hr_HR/gitlab.po1847
-rw-r--r--locale/hu_HU/gitlab.po1838
-rw-r--r--locale/hy_AM/gitlab.po1838
-rw-r--r--locale/id_ID/gitlab.po1829
-rw-r--r--locale/ig_NG/gitlab.po1829
-rw-r--r--locale/is_IS/gitlab.po1838
-rw-r--r--locale/it/gitlab.po1840
-rw-r--r--locale/ja/gitlab.po2095
-rw-r--r--locale/ka_GE/gitlab.po1838
-rw-r--r--locale/kab/gitlab.po1838
-rw-r--r--locale/ko/gitlab.po1865
-rw-r--r--locale/ku_TR/gitlab.po1838
-rw-r--r--locale/ky_KG/gitlab.po1838
-rw-r--r--locale/lt_LT/gitlab.po1856
-rw-r--r--locale/mk_MK/gitlab.po1838
-rw-r--r--locale/ml_IN/gitlab.po1838
-rw-r--r--locale/mn_MN/gitlab.po1838
-rw-r--r--locale/nb_NO/gitlab.po1910
-rw-r--r--locale/nl_NL/gitlab.po1838
-rw-r--r--locale/or_IN/gitlab.po1838
-rw-r--r--locale/pa_IN/gitlab.po1838
-rw-r--r--locale/pl_PL/gitlab.po1856
-rw-r--r--locale/pt_BR/gitlab.po2396
-rw-r--r--locale/pt_PT/gitlab.po1840
-rw-r--r--locale/ro_RO/gitlab.po11753
-rw-r--r--locale/ru/gitlab.po1908
-rw-r--r--locale/si_LK/gitlab.po3988
-rw-r--r--locale/sk_SK/gitlab.po1856
-rw-r--r--locale/sl_SI/gitlab.po1856
-rw-r--r--locale/sq_AL/gitlab.po1838
-rw-r--r--locale/sr_CS/gitlab.po1847
-rw-r--r--locale/sr_SP/gitlab.po1847
-rw-r--r--locale/sv_SE/gitlab.po1838
-rw-r--r--locale/sw_KE/gitlab.po1838
-rw-r--r--locale/ta_IN/gitlab.po1838
-rw-r--r--locale/th_TH/gitlab.po1829
-rw-r--r--locale/tr_TR/gitlab.po1874
-rw-r--r--locale/uk/gitlab.po3724
-rw-r--r--locale/ur_PK/gitlab.po1838
-rw-r--r--locale/uz_UZ/gitlab.po1838
-rw-r--r--locale/vi_VN/gitlab.po1829
-rw-r--r--locale/zh_CN/gitlab.po3187
-rw-r--r--locale/zh_HK/gitlab.po1831
-rw-r--r--locale/zh_TW/gitlab.po2449
-rw-r--r--metrics_server/dependencies.rb1
-rw-r--r--metrics_server/metrics_server.rb5
-rw-r--r--package.json33
-rw-r--r--public/robots.txt1
-rw-r--r--qa/Dockerfile24
-rw-r--r--qa/lib/gitlab/page/admin/subscription.rb7
-rw-r--r--qa/qa.rb6
-rw-r--r--qa/qa/fixtures/software_licenses/GFDL-1.2-only397
-rw-r--r--qa/qa/fixtures/software_licenses/bsd-3-clause11
-rw-r--r--qa/qa/flow/login.rb10
-rw-r--r--qa/qa/git/repository.rb27
-rw-r--r--qa/qa/page/alert/free_trial.rb3
-rw-r--r--qa/qa/page/base.rb20
-rw-r--r--qa/qa/page/blame/show.rb37
-rw-r--r--qa/qa/page/component/access_tokens.rb1
-rw-r--r--qa/qa/page/component/blob_content.rb24
-rw-r--r--qa/qa/page/component/design_management.rb11
-rw-r--r--qa/qa/page/component/invite_members_modal.rb15
-rw-r--r--qa/qa/page/component/issuable/common.rb18
-rw-r--r--qa/qa/page/component/issuable/sidebar.rb2
-rw-r--r--qa/qa/page/component/note.rb2
-rw-r--r--qa/qa/page/component/visibility_setting.rb2
-rw-r--r--qa/qa/page/file/show.rb4
-rw-r--r--qa/qa/page/group/menu.rb8
-rw-r--r--qa/qa/page/group/new.rb2
-rw-r--r--qa/qa/page/group/settings/access_tokens.rb14
-rw-r--r--qa/qa/page/group/settings/package_registries.rb30
-rw-r--r--qa/qa/page/issuable/new.rb4
-rw-r--r--qa/qa/page/main/menu.rb10
-rw-r--r--qa/qa/page/mattermost/login.rb2
-rw-r--r--qa/qa/page/merge_request/new.rb8
-rw-r--r--qa/qa/page/merge_request/show.rb21
-rw-r--r--qa/qa/page/project/issue/show.rb10
-rw-r--r--qa/qa/page/project/new.rb2
-rw-r--r--qa/qa/page/project/settings/access_tokens.rb2
-rw-r--r--qa/qa/page/project/settings/deploy_keys.rb10
-rw-r--r--qa/qa/page/project/settings/integrations.rb5
-rw-r--r--qa/qa/page/project/settings/services/pipeline_status_emails.rb35
-rw-r--r--qa/qa/page/project/show.rb7
-rw-r--r--qa/qa/page/project/web_ide/edit.rb8
-rw-r--r--qa/qa/resource/deploy_key.rb4
-rw-r--r--qa/qa/resource/design.rb52
-rw-r--r--qa/qa/resource/group_access_token.rb71
-rw-r--r--qa/qa/resource/personal_access_token.rb4
-rw-r--r--qa/qa/resource/personal_access_token_cache.rb1
-rw-r--r--qa/qa/resource/project.rb29
-rw-r--r--qa/qa/resource/runner.rb7
-rw-r--r--qa/qa/resource/ssh_key.rb4
-rw-r--r--qa/qa/resource/user.rb20
-rw-r--r--qa/qa/runtime/api/request.rb2
-rw-r--r--qa/qa/runtime/browser.rb2
-rw-r--r--qa/qa/runtime/env.rb31
-rw-r--r--qa/qa/runtime/feature.rb13
-rw-r--r--qa/qa/runtime/key/base.rb10
-rw-r--r--qa/qa/scenario/template.rb2
-rw-r--r--qa/qa/service/docker_run/base.rb23
-rw-r--r--qa/qa/service/docker_run/mixins/third_party_docker.rb59
-rw-r--r--qa/qa/service/shellout.rb2
-rw-r--r--qa/qa/specs/features/api/1_manage/group_access_token_spec.rb51
-rw-r--r--qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb9
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb62
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb45
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb77
-rw-r--r--qa/qa/specs/features/api/5_package/container_registry_spec.rb109
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/group/group_access_token_spec.rb19
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb22
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb8
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb5
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb58
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb16
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb94
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb104
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/design_management/archive_design_content_spec.rb8
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb13
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/license_detecton_spec.rb45
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb34
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_lint_spec.rb11
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_status_emails_spec.rb134
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb8
-rw-r--r--qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb17
-rw-r--r--qa/qa/specs/features/sanity/feature_flags_spec.rb52
-rw-r--r--qa/qa/support/fips.rb14
-rw-r--r--qa/qa/support/run.rb4
-rw-r--r--qa/qa/support/waiter.rb6
-rw-r--r--qa/qa/tools/test_resources_handler.rb3
-rw-r--r--qa/qa/vendor/mail_hog/api.rb75
-rw-r--r--qa/spec/runtime/api/request_spec.rb3
-rw-r--r--qa/spec/service/docker_run/base_spec.rb31
-rw-r--r--qa/spec/service/docker_run/mixins/third_party_docker_spec.rb68
-rw-r--r--qa/spec/service/shellout_spec.rb6
-rw-r--r--rubocop/cop/database/rescue_query_canceled.rb46
-rw-r--r--rubocop/cop/database/rescue_statement_timeout.rb46
-rw-r--r--rubocop/cop/gitlab/namespaced_class.rb4
-rwxr-xr-xscripts/checkout-mr-source-sha7
-rwxr-xr-xscripts/decomposition/generate-loose-foreign-key138
-rwxr-xr-xscripts/determine-qa-tests106
-rw-r--r--scripts/frontend/stylelint/stylelint_duplicate_selectors.js25
-rw-r--r--scripts/frontend/stylelint/stylelint_utility_classes.js25
-rw-r--r--scripts/frontend/stylelint/stylelint_utility_map.js64
-rw-r--r--scripts/frontend/stylelint/stylelint_utils.js78
-rw-r--r--scripts/frontend/stylelint/utility_classes_map.js259
-rwxr-xr-xscripts/glfm/run-snapshot-tests.sh7
-rw-r--r--scripts/lib/glfm/constants.rb2
-rw-r--r--scripts/lib/glfm/parse_examples.rb59
-rw-r--r--scripts/lib/glfm/render_wysiwyg_html_and_json.js112
-rw-r--r--scripts/lib/glfm/update_example_snapshots.rb21
-rwxr-xr-xscripts/pipeline_test_report_builder.rb7
-rwxr-xr-xscripts/review_apps/gcp_cleanup.sh2
-rwxr-xr-xscripts/review_apps/review-apps.sh1
-rw-r--r--scripts/rspec_helpers.sh5
-rwxr-xr-xscripts/undercoverage26
-rw-r--r--scripts/utils.sh5
-rw-r--r--spec/channels/application_cable/connection_spec.rb4
-rw-r--r--spec/channels/awareness_channel_spec.rb80
-rw-r--r--spec/components/pajamas/alert_component_spec.rb54
-rw-r--r--spec/components/pajamas/banner_component_spec.rb42
-rw-r--r--spec/components/pajamas/button_component_spec.rb74
-rw-r--r--spec/components/pajamas/card_component_spec.rb30
-rw-r--r--spec/components/pajamas/checkbox_component_spec.rb10
-rw-r--r--spec/components/pajamas/radio_component_spec.rb6
-rw-r--r--spec/components/pajamas/spinner_component_spec.rb74
-rw-r--r--spec/components/pajamas/toggle_component_spec.rb32
-rw-r--r--spec/contracts/consumer/endpoints/project/pipelines.js16
-rw-r--r--spec/contracts/consumer/fixtures/project/pipeline/get_list_project_pipelines.fixture.js243
-rw-r--r--spec/contracts/consumer/fixtures/project/pipeline/get_pipeline_header_data.fixture.js99
-rw-r--r--spec/contracts/consumer/helpers/common_regex_patterns.js24
-rw-r--r--spec/contracts/consumer/helpers/graphql_query_extractor.js8
-rw-r--r--spec/contracts/consumer/resources/graphql/pipelines.js25
-rw-r--r--spec/contracts/consumer/specs/project/pipeline/index.spec.js44
-rw-r--r--spec/contracts/consumer/specs/project/pipeline/show.spec.js53
-rw-r--r--spec/contracts/consumer/yarn.lock4775
-rw-r--r--spec/contracts/contracts/project/pipeline/index/pipelines#index-get_list_project_pipelines.json472
-rw-r--r--spec/contracts/contracts/project/pipeline/show/pipelines#show-get_pipeline_header_data.json152
-rw-r--r--spec/contracts/provider/pact_helpers/project/pipeline/get_list_project_pipelines_helper.rb16
-rw-r--r--spec/contracts/provider/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb16
-rw-r--r--spec/contracts/provider/states/project/pipeline/pipeline_state.rb27
-rw-r--r--spec/contracts/provider/states/project/pipeline/pipelines_state.rb26
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb18
-rw-r--r--spec/controllers/admin/hooks_controller_spec.rb36
-rw-r--r--spec/controllers/admin/topics_controller_spec.rb22
-rw-r--r--spec/controllers/application_controller_spec.rb22
-rw-r--r--spec/controllers/concerns/harbor/artifact_spec.rb10
-rw-r--r--spec/controllers/concerns/harbor/repository_spec.rb10
-rw-r--r--spec/controllers/concerns/harbor/tag_spec.rb10
-rw-r--r--spec/controllers/graphql_controller_spec.rb12
-rw-r--r--spec/controllers/groups/group_links_controller_spec.rb20
-rw-r--r--spec/controllers/groups/variables_controller_spec.rb2
-rw-r--r--spec/controllers/groups_controller_spec.rb12
-rw-r--r--spec/controllers/import/available_namespaces_controller_spec.rb6
-rw-r--r--spec/controllers/import/bitbucket_controller_spec.rb36
-rw-r--r--spec/controllers/import/bitbucket_server_controller_spec.rb17
-rw-r--r--spec/controllers/import/bulk_imports_controller_spec.rb33
-rw-r--r--spec/controllers/import/fogbugz_controller_spec.rb50
-rw-r--r--spec/controllers/import/github_controller_spec.rb5
-rw-r--r--spec/controllers/import/gitlab_controller_spec.rb40
-rw-r--r--spec/controllers/profiles/emails_controller_spec.rb6
-rw-r--r--spec/controllers/profiles/personal_access_tokens_controller_spec.rb37
-rw-r--r--spec/controllers/projects/hooks_controller_spec.rb93
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb2
-rw-r--r--spec/controllers/projects/jobs_controller_spec.rb22
-rw-r--r--spec/controllers/projects/logs_controller_spec.rb214
-rw-r--r--spec/controllers/projects/mirrors_controller_spec.rb2
-rw-r--r--spec/controllers/projects/pipelines/tests_controller_spec.rb18
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb8
-rw-r--r--spec/controllers/projects/project_members_controller_spec.rb21
-rw-r--r--spec/controllers/projects/service_ping_controller_spec.rb12
-rw-r--r--spec/controllers/projects/settings/ci_cd_controller_spec.rb469
-rw-r--r--spec/controllers/projects/settings/integrations_controller_spec.rb28
-rw-r--r--spec/controllers/projects/settings/operations_controller_spec.rb102
-rw-r--r--spec/controllers/projects/tracings_controller_spec.rb72
-rw-r--r--spec/controllers/projects_controller_spec.rb18
-rw-r--r--spec/controllers/registrations_controller_spec.rb3
-rw-r--r--spec/controllers/search_controller_spec.rb39
-rw-r--r--spec/db/docs_spec.rb5
-rw-r--r--spec/db/schema_spec.rb10
-rw-r--r--spec/events/pages/page_deleted_event_spec.rb1
-rw-r--r--spec/events/pages/page_deployed_event_spec.rb34
-rw-r--r--spec/events/projects/project_created_event_spec.rb34
-rw-r--r--spec/events/projects/project_deleted_event_spec.rb1
-rw-r--r--spec/events/projects/project_path_changed_event_spec.rb46
-rw-r--r--spec/factories/ci/runner_versions.rb7
-rw-r--r--spec/factories/ci/stages.rb19
-rw-r--r--spec/factories/clusters/applications/helm.rb4
-rw-r--r--spec/factories/clusters/clusters.rb1
-rw-r--r--spec/factories/clusters/integrations/elastic_stack.rb12
-rw-r--r--spec/factories/error_tracking/open_api.rb41
-rw-r--r--spec/factories/gitlab/database/postgres_autovacuum_activity.rb10
-rw-r--r--spec/factories/import_states.rb4
-rw-r--r--spec/factories/integrations.rb2
-rw-r--r--spec/factories/keys.rb17
-rw-r--r--spec/factories/oauth_access_tokens.rb1
-rw-r--r--spec/factories/project_group_links.rb2
-rw-r--r--spec/factories/project_hooks.rb6
-rw-r--r--spec/factories/project_tracing_settings.rb8
-rw-r--r--spec/factories/projects.rb22
-rw-r--r--spec/factories/projects/import_export/export_relation.rb11
-rw-r--r--spec/factories/sequences.rb1
-rw-r--r--spec/factories/snippets.rb15
-rw-r--r--spec/factories/usage_data.rb4
-rw-r--r--spec/factories/users/namespace_user_callouts.rb10
-rw-r--r--spec/factories/work_items.rb5
-rw-r--r--spec/features/admin/admin_groups_spec.rb28
-rw-r--r--spec/features/admin/admin_projects_spec.rb28
-rw-r--r--spec/features/admin/admin_runners_spec.rb52
-rw-r--r--spec/features/admin/admin_sees_background_migrations_spec.rb4
-rw-r--r--spec/features/admin/admin_system_info_spec.rb6
-rw-r--r--spec/features/admin/users/user_spec.rb4
-rw-r--r--spec/features/dashboard/todos/todos_spec.rb19
-rw-r--r--spec/features/file_uploads/multipart_invalid_uploads_spec.rb2
-rw-r--r--spec/features/groups/group_runners_spec.rb44
-rw-r--r--spec/features/groups/group_settings_spec.rb4
-rw-r--r--spec/features/groups/import_export/import_file_spec.rb24
-rw-r--r--spec/features/groups/merge_requests_spec.rb2
-rw-r--r--spec/features/groups/settings/packages_and_registries_spec.rb22
-rw-r--r--spec/features/groups/settings/user_searches_in_settings_spec.rb2
-rw-r--r--spec/features/groups/show_spec.rb25
-rw-r--r--spec/features/groups_spec.rb18
-rw-r--r--spec/features/incidents/incident_details_spec.rb77
-rw-r--r--spec/features/incidents/incident_timeline_events_spec.rb70
-rw-r--r--spec/features/invites_spec.rb5
-rw-r--r--spec/features/issuables/issuable_list_spec.rb2
-rw-r--r--spec/features/issues/filtered_search/visual_tokens_spec.rb4
-rw-r--r--spec/features/issues/user_creates_branch_and_merge_request_spec.rb16
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb14
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb2
-rw-r--r--spec/features/merge_request/user_creates_merge_request_spec.rb38
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_deployment_widget_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb28
-rw-r--r--spec/features/merge_request/user_sees_pipelines_spec.rb4
-rw-r--r--spec/features/merge_request/user_sees_versions_spec.rb36
-rw-r--r--spec/features/milestone_spec.rb2
-rw-r--r--spec/features/monitor_sidebar_link_spec.rb5
-rw-r--r--spec/features/nav/top_nav_responsive_spec.rb2
-rw-r--r--spec/features/nav/top_nav_tooltip_spec.rb4
-rw-r--r--spec/features/profiles/account_spec.rb2
-rw-r--r--spec/features/profiles/oauth_applications_spec.rb55
-rw-r--r--spec/features/profiles/password_spec.rb2
-rw-r--r--spec/features/projects/blobs/blame_spec.rb39
-rw-r--r--spec/features/projects/blobs/blob_show_spec.rb1551
-rw-r--r--spec/features/projects/branches_spec.rb2
-rw-r--r--spec/features/projects/ci/secure_files_spec.rb4
-rw-r--r--spec/features/projects/commits/multi_view_diff_spec.rb26
-rw-r--r--spec/features/projects/deploy_keys_spec.rb26
-rw-r--r--spec/features/projects/diffs/diff_show_spec.rb4
-rw-r--r--spec/features/projects/environments_pod_logs_spec.rb68
-rw-r--r--spec/features/projects/files/dockerfile_dropdown_spec.rb2
-rw-r--r--spec/features/projects/files/gitignore_dropdown_spec.rb4
-rw-r--r--spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb12
-rw-r--r--spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb8
-rw-r--r--spec/features/projects/jobs/permissions_spec.rb6
-rw-r--r--spec/features/projects/jobs/user_browses_job_spec.rb23
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb59
-rw-r--r--spec/features/projects/jobs_spec.rb76
-rw-r--r--spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb4
-rw-r--r--spec/features/projects/navbar_spec.rb18
-rw-r--r--spec/features/projects/new_project_spec.rb57
-rw-r--r--spec/features/projects/pipelines/legacy_pipelines_spec.rb4
-rw-r--r--spec/features/projects/releases/user_creates_release_spec.rb21
-rw-r--r--spec/features/projects/settings/registry_settings_spec.rb20
-rw-r--r--spec/features/projects/settings/repository_settings_spec.rb1
-rw-r--r--spec/features/projects/settings/secure_files_settings_spec.rb46
-rw-r--r--spec/features/projects/settings/secure_files_spec.rb101
-rw-r--r--spec/features/projects/settings/visibility_settings_spec.rb6
-rw-r--r--spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb2
-rw-r--r--spec/features/projects/show/user_sees_collaboration_links_spec.rb2
-rw-r--r--spec/features/projects/tags/user_edits_tags_spec.rb47
-rw-r--r--spec/features/projects/tracings_spec.rb60
-rw-r--r--spec/features/projects_spec.rb93
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_line_permalink_updater_spec.rb103
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb1201
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb213
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/shortcuts_blob_spec.rb45
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/user_creates_new_blob_in_new_project_spec.rb63
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb80
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/user_views_pipeline_editor_button_spec.rb46
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/files/editing_a_file_spec.rb34
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/files/find_file_keyboard_spec.rb42
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/files/project_owner_creates_license_file_spec.rb72
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb377
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_lfs_files_spec.rb86
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/files/user_deletes_files_spec.rb74
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/files/user_edits_files_spec.rb226
-rw-r--r--spec/features/search/user_uses_header_search_field_spec.rb4
-rw-r--r--spec/features/tags/developer_updates_tag_spec.rb2
-rw-r--r--spec/features/unsubscribe_links_spec.rb2
-rw-r--r--spec/features/users/email_verification_on_login_spec.rb357
-rw-r--r--spec/features/users/google_analytics_csp_spec.rb15
-rw-r--r--spec/features/users/login_spec.rb4
-rw-r--r--spec/features/users/show_spec.rb6
-rw-r--r--spec/finders/autocomplete/users_finder_spec.rb2
-rw-r--r--spec/finders/branches_finder_spec.rb8
-rw-r--r--spec/finders/ci/runners_finder_spec.rb61
-rw-r--r--spec/finders/contributed_projects_finder_spec.rb10
-rw-r--r--spec/finders/groups/user_groups_finder_spec.rb30
-rw-r--r--spec/finders/joined_groups_finder_spec.rb2
-rw-r--r--spec/finders/packages/conan/package_finder_spec.rb2
-rw-r--r--spec/finders/packages/group_packages_finder_spec.rb4
-rw-r--r--spec/finders/projects_finder_spec.rb29
-rw-r--r--spec/finders/user_recent_events_finder_spec.rb374
-rw-r--r--spec/fixtures/api/schemas/entities/commit.json2
-rw-r--r--spec/fixtures/api/schemas/entities/github/user.json2
-rw-r--r--spec/fixtures/api/schemas/entities/member.json2
-rw-r--r--spec/fixtures/api/schemas/entities/merge_request_basic.json1
-rw-r--r--spec/fixtures/api/schemas/entities/note_user_entity.json2
-rw-r--r--spec/fixtures/api/schemas/entities/user.json2
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/commit/basic.json6
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/deploy_key.json3
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/environment.json5
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/metadata.json26
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/terraform/modules/v1/single_version.json55
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/project_hook.json62
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/project_hooks.json10
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/system_hook.json16
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/user/basic.json2
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/user/public.json2
-rw-r--r--spec/fixtures/csv_complex.csv6
-rw-r--r--spec/fixtures/emails/service_desk.eml1
-rw-r--r--spec/fixtures/gitlab/git/gitattributes16
-rw-r--r--spec/fixtures/gitlab/git/gitattributes_invalidbin0 -> 16 bytes
-rw-r--r--spec/fixtures/gitlab/import_export/labels.tar.gzbin0 -> 768 bytes
-rw-r--r--spec/fixtures/glfm/example_snapshots/examples_index.yml2017
-rw-r--r--spec/fixtures/glfm/example_snapshots/html.yml7479
-rw-r--r--spec/fixtures/glfm/example_snapshots/markdown.yml2201
-rw-r--r--spec/fixtures/glfm/example_snapshots/prosemirror_json.yml17018
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json82
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project/releases.ndjson4
-rw-r--r--spec/fixtures/product_intelligence/survey_response_schema.json58
-rw-r--r--spec/frontend/__helpers__/init_vue_mr_page_helper.js4
-rw-r--r--spec/frontend/__helpers__/matchers/index.js1
-rw-r--r--spec/frontend/__helpers__/matchers/to_match_expected_for_markdown.js60
-rw-r--r--spec/frontend/__helpers__/mock_user_callout_dismisser.js15
-rw-r--r--spec/frontend/__helpers__/performance.js8
-rw-r--r--spec/frontend/__helpers__/set_window_location_helper.js2
-rw-r--r--spec/frontend/__helpers__/shared_test_setup.js1
-rw-r--r--spec/frontend/__helpers__/web_worker_fake.js3
-rw-r--r--spec/frontend/access_tokens/components/access_token_table_app_spec.js15
-rw-r--r--spec/frontend/access_tokens/components/projects_field_spec.js8
-rw-r--r--spec/frontend/add_context_commits_modal/components/__snapshots__/add_context_commits_modal_spec.js.snap2
-rw-r--r--spec/frontend/admin/analytics/devops_score/components/devops_score_spec.js2
-rw-r--r--spec/frontend/admin/deploy_keys/components/table_spec.js29
-rw-r--r--spec/frontend/admin/signup_restrictions/components/signup_form_spec.js8
-rw-r--r--spec/frontend/admin/signup_restrictions/mock_data.js8
-rw-r--r--spec/frontend/admin/signup_restrictions/utils_spec.js4
-rw-r--r--spec/frontend/admin/statistics_panel/components/app_spec.js2
-rw-r--r--spec/frontend/admin/users/components/user_actions_spec.js6
-rw-r--r--spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap6
-rw-r--r--spec/frontend/alerts_settings/components/alerts_settings_form_spec.js2
-rw-r--r--spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap1
-rw-r--r--spec/frontend/batch_comments/components/draft_note_spec.js11
-rw-r--r--spec/frontend/batch_comments/components/preview_dropdown_spec.js26
-rw-r--r--spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js12
-rw-r--r--spec/frontend/behaviors/shortcuts/keybindings_spec.js4
-rw-r--r--spec/frontend/blob/viewer/index_spec.js189
-rw-r--r--spec/frontend/boards/components/board_card_spec.js38
-rw-r--r--spec/frontend/boards/components/config_toggle_spec.js59
-rw-r--r--spec/frontend/boards/components/toggle_focus_spec.js47
-rw-r--r--spec/frontend/boards/mock_data.js2
-rw-r--r--spec/frontend/boards/project_select_spec.js8
-rw-r--r--spec/frontend/ci_lint/mock_data.js11
-rw-r--r--spec/frontend/ci_secure_files/components/secure_files_list_spec.js41
-rw-r--r--spec/frontend/clusters_list/components/agent_table_spec.js8
-rw-r--r--spec/frontend/clusters_list/components/clusters_spec.js4
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/code_block_spec.js25
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/formatting_spec.js24
-rw-r--r--spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js35
-rw-r--r--spec/frontend/content_editor/components/top_toolbar_spec.js10
-rw-r--r--spec/frontend/content_editor/extensions/html_nodes_spec.js42
-rw-r--r--spec/frontend/content_editor/extensions/paste_markdown_spec.js2
-rw-r--r--spec/frontend/content_editor/markdown_snapshot_spec.js10
-rw-r--r--spec/frontend/content_editor/markdown_snapshot_spec_helper.js102
-rw-r--r--spec/frontend/content_editor/remark_markdown_processing_spec.js619
-rw-r--r--spec/frontend/content_editor/render_html_and_json_for_all_examples.js115
-rw-r--r--spec/frontend/content_editor/services/markdown_serializer_spec.js28
-rw-r--r--spec/frontend/content_editor/services/markdown_sourcemap_spec.js2
-rw-r--r--spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js2
-rw-r--r--spec/frontend/cycle_analytics/path_navigation_spec.js2
-rw-r--r--spec/frontend/cycle_analytics/value_stream_metrics_spec.js3
-rw-r--r--spec/frontend/design_management/components/design_sidebar_spec.js61
-rw-r--r--spec/frontend/design_management/components/image_spec.js5
-rw-r--r--spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap4
-rw-r--r--spec/frontend/design_management/pages/design/__snapshots__/index_spec.js.snap67
-rw-r--r--spec/frontend/design_management/pages/index_spec.js78
-rw-r--r--spec/frontend/diffs/components/app_spec.js2
-rw-r--r--spec/frontend/diffs/components/collapsed_files_warning_spec.js4
-rw-r--r--spec/frontend/diffs/components/diff_code_quality_spec.js66
-rw-r--r--spec/frontend/diffs/components/diff_content_spec.js6
-rw-r--r--spec/frontend/diffs/components/diff_expansion_cell_spec.js177
-rw-r--r--spec/frontend/diffs/components/diff_file_spec.js4
-rw-r--r--spec/frontend/diffs/components/diff_line_note_form_spec.js289
-rw-r--r--spec/frontend/diffs/components/diff_row_spec.js3
-rw-r--r--spec/frontend/diffs/components/diff_stats_spec.js3
-rw-r--r--spec/frontend/diffs/components/diff_view_spec.js32
-rw-r--r--spec/frontend/diffs/components/settings_dropdown_spec.js9
-rw-r--r--spec/frontend/diffs/components/tree_list_spec.js32
-rw-r--r--spec/frontend/diffs/mock_data/diff_code_quality.js62
-rw-r--r--spec/frontend/diffs/mock_data/diff_file.js4
-rw-r--r--spec/frontend/diffs/store/actions_spec.js4
-rw-r--r--spec/frontend/diffs/store/mutations_spec.js5
-rw-r--r--spec/frontend/diffs/store/utils_spec.js6
-rw-r--r--spec/frontend/diffs/utils/diff_file_spec.js6
-rw-r--r--spec/frontend/dirty_submit/dirty_submit_form_spec.js1
-rw-r--r--spec/frontend/emoji/awards_app/store/actions_spec.js12
-rw-r--r--spec/frontend/environment.js6
-rw-r--r--spec/frontend/environments/canary_update_modal_spec.js2
-rw-r--r--spec/frontend/environments/confirm_rollback_modal_spec.js15
-rw-r--r--spec/frontend/environments/deploy_board_component_spec.js8
-rw-r--r--spec/frontend/environments/environment_item_spec.js4
-rw-r--r--spec/frontend/environments/environment_table_spec.js3
-rw-r--r--spec/frontend/environments/environments_app_spec.js4
-rw-r--r--spec/frontend/error_tracking/components/error_tracking_list_spec.js24
-rw-r--r--spec/frontend/fixtures/api_deploy_keys.rb1
-rw-r--r--spec/frontend/fixtures/blob.rb1
-rw-r--r--spec/frontend/fixtures/deploy_keys.rb6
-rw-r--r--spec/frontend/fixtures/jobs.rb98
-rw-r--r--spec/frontend/fixtures/runner.rb16
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js11
-rw-r--r--spec/frontend/gitlab_pages/new/pages/pages_pipeline_wizard_spec.js102
-rw-r--r--spec/frontend/google_cloud/components/app_spec.js77
-rw-r--r--spec/frontend/google_cloud/components/deployments_service_table_spec.js41
-rw-r--r--spec/frontend/google_cloud/components/errors/gcp_error_spec.js34
-rw-r--r--spec/frontend/google_cloud/components/errors/no_gcp_projects_spec.js33
-rw-r--r--spec/frontend/google_cloud/components/gcp_regions_form_spec.js59
-rw-r--r--spec/frontend/google_cloud/components/gcp_regions_list_spec.js79
-rw-r--r--spec/frontend/google_cloud/components/google_cloud_menu_spec.js40
-rw-r--r--spec/frontend/google_cloud/components/home_spec.js66
-rw-r--r--spec/frontend/google_cloud/components/incubation_banner_spec.js21
-rw-r--r--spec/frontend/google_cloud/components/revoke_oauth_spec.js2
-rw-r--r--spec/frontend/google_cloud/components/service_accounts_form_spec.js70
-rw-r--r--spec/frontend/google_cloud/components/service_accounts_list_spec.js84
-rw-r--r--spec/frontend/google_cloud/configuration/panel_spec.js65
-rw-r--r--spec/frontend/google_cloud/databases/cloudsql/create_instance_form_spec.js103
-rw-r--r--spec/frontend/google_cloud/databases/cloudsql/instance_table_spec.js65
-rw-r--r--spec/frontend/google_cloud/databases/panel_spec.js36
-rw-r--r--spec/frontend/google_cloud/databases/service_table_spec.js44
-rw-r--r--spec/frontend/google_cloud/deployments/panel_spec.js46
-rw-r--r--spec/frontend/google_cloud/deployments/service_table_spec.js41
-rw-r--r--spec/frontend/google_cloud/gcp_regions/form_spec.js59
-rw-r--r--spec/frontend/google_cloud/gcp_regions/list_spec.js79
-rw-r--r--spec/frontend/google_cloud/service_accounts/form_spec.js70
-rw-r--r--spec/frontend/google_cloud/service_accounts/list_spec.js84
-rw-r--r--spec/frontend/google_tag_manager/index_spec.js11
-rw-r--r--spec/frontend/groups/components/group_folder_spec.js79
-rw-r--r--spec/frontend/groups/components/group_item_spec.js101
-rw-r--r--spec/frontend/groups/components/group_name_and_path_spec.js17
-rw-r--r--spec/frontend/groups/components/groups_spec.js72
-rw-r--r--spec/frontend/groups/mock_data.js21
-rw-r--r--spec/frontend/header_search/components/app_spec.js272
-rw-r--r--spec/frontend/header_search/components/header_search_scoped_items_spec.js47
-rw-r--r--spec/frontend/header_search/init_spec.js74
-rw-r--r--spec/frontend/header_search/mock_data.js75
-rw-r--r--spec/frontend/header_search/store/getters_spec.js8
-rw-r--r--spec/frontend/header_spec.js24
-rw-r--r--spec/frontend/ide/components/commit_sidebar/empty_state_spec.js26
-rw-r--r--spec/frontend/ide/components/commit_sidebar/list_spec.js56
-rw-r--r--spec/frontend/ide/components/commit_sidebar/success_message_spec.js30
-rw-r--r--spec/frontend/ide/components/ide_spec.js3
-rw-r--r--spec/frontend/ide/components/ide_tree_list_spec.js78
-rw-r--r--spec/frontend/ide/components/nav_dropdown_button_spec.js73
-rw-r--r--spec/frontend/ide/components/new_dropdown/modal_spec.js470
-rw-r--r--spec/frontend/ide/components/repo_editor_spec.js12
-rw-r--r--spec/frontend/ide/ide_router_spec.js3
-rw-r--r--spec/frontend/ide/stores/actions/file_spec.js3
-rw-r--r--spec/frontend/ide/stores/actions/merge_request_spec.js3
-rw-r--r--spec/frontend/ide/stores/actions/tree_spec.js3
-rw-r--r--spec/frontend/ide/stores/actions_spec.js3
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_spec.js32
-rw-r--r--spec/frontend/integrations/edit/components/active_checkbox_spec.js14
-rw-r--r--spec/frontend/integrations/edit/components/integration_form_spec.js57
-rw-r--r--spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js3
-rw-r--r--spec/frontend/invite_members/components/import_a_project_modal_spec.js168
-rw-r--r--spec/frontend/invite_members/components/import_project_members_modal_spec.js170
-rw-r--r--spec/frontend/invite_members/components/import_project_members_trigger_spec.js49
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js173
-rw-r--r--spec/frontend/invite_members/components/invite_modal_base_spec.js2
-rw-r--r--spec/frontend/invite_members/components/members_token_select_spec.js5
-rw-r--r--spec/frontend/invite_members/mock_data/member_modal.js10
-rw-r--r--spec/frontend/invite_members/utils/member_utils_spec.js12
-rw-r--r--spec/frontend/invite_members/utils/response_message_parser_spec.js33
-rw-r--r--spec/frontend/issuable/issuable_form_spec.js19
-rw-r--r--spec/frontend/issues/list/components/issues_list_app_spec.js61
-rw-r--r--spec/frontend/issues/list/mock_data.js1
-rw-r--r--spec/frontend/issues/list/utils_spec.js79
-rw-r--r--spec/frontend/issues/new/components/__snapshots__/type_popover_spec.js.snap3
-rw-r--r--spec/frontend/issues/show/components/description_spec.js45
-rw-r--r--spec/frontend/issues/show/components/edited_spec.js83
-rw-r--r--spec/frontend/issues/show/components/incidents/highlight_bar_spec.js2
-rw-r--r--spec/frontend/issues/show/components/incidents/mock_data.js33
-rw-r--r--spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js181
-rw-r--r--spec/frontend/issues/show/components/incidents/timeline_events_list_item_spec.js61
-rw-r--r--spec/frontend/issues/show/components/incidents/timeline_events_list_spec.js129
-rw-r--r--spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js78
-rw-r--r--spec/frontend/issues/show/components/incidents/utils_spec.js31
-rw-r--r--spec/frontend/jobs/bridge/app_spec.js146
-rw-r--r--spec/frontend/jobs/bridge/components/empty_state_spec.js58
-rw-r--r--spec/frontend/jobs/bridge/components/sidebar_spec.js99
-rw-r--r--spec/frontend/jobs/bridge/mock_data.js102
-rw-r--r--spec/frontend/jobs/components/job_app_spec.js7
-rw-r--r--spec/frontend/jobs/components/job_log_controllers_spec.js61
-rw-r--r--spec/frontend/jobs/components/job_sidebar_details_container_spec.js4
-rw-r--r--spec/frontend/jobs/components/jobs_container_spec.js2
-rw-r--r--spec/frontend/jobs/components/log/collapsible_section_spec.js9
-rw-r--r--spec/frontend/jobs/components/log/line_spec.js42
-rw-r--r--spec/frontend/jobs/components/log/log_spec.js91
-rw-r--r--spec/frontend/jobs/components/log/mock_data.js74
-rw-r--r--spec/frontend/jobs/components/table/cells/actions_cell_spec.js41
-rw-r--r--spec/frontend/jobs/components/table/cells/job_cell_spec.js32
-rw-r--r--spec/frontend/jobs/components/table/job_table_app_spec.js43
-rw-r--r--spec/frontend/jobs/components/table/jobs_table_spec.js10
-rw-r--r--spec/frontend/jobs/mock_data.js772
-rw-r--r--spec/frontend/jobs/store/mutations_spec.js94
-rw-r--r--spec/frontend/jobs/store/utils_spec.js111
-rw-r--r--spec/frontend/lib/dompurify_spec.js23
-rw-r--r--spec/frontend/lib/gfm/index_spec.js71
-rw-r--r--spec/frontend/lib/utils/common_utils_spec.js22
-rw-r--r--spec/frontend/lib/utils/navigation_utility_spec.js2
-rw-r--r--spec/frontend/lib/utils/rails_ujs_spec.js2
-rw-r--r--spec/frontend/lib/utils/text_utility_spec.js13
-rw-r--r--spec/frontend/logs/components/environment_logs_spec.js370
-rw-r--r--spec/frontend/logs/components/log_advanced_filters_spec.js175
-rw-r--r--spec/frontend/logs/components/log_control_buttons_spec.js88
-rw-r--r--spec/frontend/logs/components/log_simple_filters_spec.js134
-rw-r--r--spec/frontend/logs/components/tokens/token_with_loading_state_spec.js71
-rw-r--r--spec/frontend/logs/mock_data.js71
-rw-r--r--spec/frontend/logs/stores/actions_spec.js521
-rw-r--r--spec/frontend/logs/stores/getters_spec.js75
-rw-r--r--spec/frontend/logs/stores/mutations_spec.js257
-rw-r--r--spec/frontend/merge_request_tabs_spec.js19
-rw-r--r--spec/frontend/milestones/components/delete_milestone_modal_spec.js137
-rw-r--r--spec/frontend/milestones/components/milestone_combobox_spec.js8
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap2
-rw-r--r--spec/frontend/monitoring/components/dashboard_panel_spec.js98
-rw-r--r--spec/frontend/monitoring/components/dashboard_spec.js37
-rw-r--r--spec/frontend/monitoring/store/mutations_spec.js12
-rw-r--r--spec/frontend/new_branch_spec.js23
-rw-r--r--spec/frontend/notebook/cells/code_spec.js56
-rw-r--r--spec/frontend/notebook/cells/markdown_spec.js2
-rw-r--r--spec/frontend/notebook/cells/output/index_spec.js56
-rw-r--r--spec/frontend/notebook/cells/prompt_spec.js42
-rw-r--r--spec/frontend/notes/components/comment_form_spec.js122
-rw-r--r--spec/frontend/notes/components/note_signed_out_widget_spec.js37
-rw-r--r--spec/frontend/notes/components/noteable_discussion_spec.js6
-rw-r--r--spec/frontend/notes/components/noteable_note_spec.js23
-rw-r--r--spec/frontend/notes/components/notes_app_spec.js49
-rw-r--r--spec/frontend/notes/components/toggle_replies_widget_spec.js83
-rw-r--r--spec/frontend/notes/stores/actions_spec.js17
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/details_header_spec.js6
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status_spec.js12
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js44
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js8
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/pages/details_spec.js5
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/app_spec.js27
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js25
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js21
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js1
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js21
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/container_expiration_policy_form_spec.js.snap3
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/container_expiration_policy_spec.js7
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/expiration_dropdown_spec.js9
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_form_spec.js267
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_spec.js81
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js30
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/mock_data.js30
-rw-r--r--spec/frontend/packages_and_registries/shared/components/settings_block_spec.js43
-rw-r--r--spec/frontend/pages/dashboard/todos/index/todos_spec.js25
-rw-r--r--spec/frontend/pages/projects/forks/new/components/fork_form_spec.js15
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap244
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js57
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js6
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_trial_card_spec.js12
-rw-r--r--spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js8
-rw-r--r--spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js6
-rw-r--r--spec/frontend/pages/shared/wikis/components/wiki_content_spec.js8
-rw-r--r--spec/frontend/pages/shared/wikis/components/wiki_form_spec.js35
-rw-r--r--spec/frontend/pdf/index_spec.js39
-rw-r--r--spec/frontend/pipeline_editor/components/lint/ci_lint_results_spec.js22
-rw-r--r--spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js128
-rw-r--r--spec/frontend/pipeline_editor/components/popovers/validate_pipeline_popover_spec.js43
-rw-r--r--spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js23
-rw-r--r--spec/frontend/pipeline_editor/components/validate/ci_validate_spec.js259
-rw-r--r--spec/frontend/pipeline_editor/mock_data.js2
-rw-r--r--spec/frontend/pipeline_wizard/components/widgets/checklist_spec.js110
-rw-r--r--spec/frontend/pipeline_wizard/pipeline_wizard_spec.js8
-rw-r--r--spec/frontend/pipeline_wizard/templates/pages_spec.js89
-rw-r--r--spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js6
-rw-r--r--spec/frontend/pipelines/components/jobs/jobs_app_spec.js9
-rw-r--r--spec/frontend/pipelines/graph/graph_component_wrapper_spec.js17
-rw-r--r--spec/frontend/pipelines/graph/graph_view_selector_spec.js60
-rw-r--r--spec/frontend/pipelines/graph/job_group_dropdown_spec.js2
-rw-r--r--spec/frontend/pipelines/graph/linked_pipeline_spec.js2
-rw-r--r--spec/frontend/pipelines/graph/mock_data.js242
-rw-r--r--spec/frontend/pipelines/header_component_spec.js4
-rw-r--r--spec/frontend/pipelines/performance_insights_modal_spec.js122
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js1
-rw-r--r--spec/frontend/pipelines/test_reports/stores/mutations_spec.js2
-rw-r--r--spec/frontend/pipelines/test_reports/test_case_details_spec.js6
-rw-r--r--spec/frontend/pipelines/test_reports/test_reports_spec.js26
-rw-r--r--spec/frontend/pipelines/test_reports/test_suite_table_spec.js30
-rw-r--r--spec/frontend/pipelines/test_reports/test_summary_table_spec.js16
-rw-r--r--spec/frontend/pipelines/utils_spec.js44
-rw-r--r--spec/frontend/projects/new/components/new_project_url_select_spec.js25
-rw-r--r--spec/frontend/projects/pipelines/charts/components/app_spec.js80
-rw-r--r--spec/frontend/projects/settings/components/new_access_dropdown_spec.js23
-rw-r--r--spec/frontend/protected_branches/protected_branch_edit_spec.js36
-rw-r--r--spec/frontend/ref/components/ref_selector_spec.js6
-rw-r--r--spec/frontend/releases/__snapshots__/util_spec.js.snap12
-rw-r--r--spec/frontend/releases/components/app_edit_new_spec.js62
-rw-r--r--spec/frontend/releases/components/app_index_spec.js31
-rw-r--r--spec/frontend/releases/components/confirm_delete_modal_spec.js89
-rw-r--r--spec/frontend/releases/components/release_block_footer_spec.js26
-rw-r--r--spec/frontend/releases/components/release_block_spec.js5
-rw-r--r--spec/frontend/releases/components/tag_field_spec.js8
-rw-r--r--spec/frontend/releases/stores/modules/detail/actions_spec.js158
-rw-r--r--spec/frontend/releases/stores/modules/detail/getters_spec.js36
-rw-r--r--spec/frontend/releases/stores/modules/detail/mutations_spec.js23
-rw-r--r--spec/frontend/reports/components/grouped_issues_list_spec.js7
-rw-r--r--spec/frontend/reports/mock_data/new_failures_report.json2
-rw-r--r--spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap2
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js11
-rw-r--r--spec/frontend/repository/components/last_commit_spec.js290
-rw-r--r--spec/frontend/repository/components/table/row_spec.js9
-rw-r--r--spec/frontend/repository/log_tree_spec.js12
-rw-r--r--spec/frontend/repository/utils/commit_spec.js2
-rw-r--r--spec/frontend/runner/admin_runner_show/admin_runner_show_app_spec.js29
-rw-r--r--spec/frontend/runner/admin_runners/admin_runners_app_spec.js227
-rw-r--r--spec/frontend/runner/components/cells/runner_actions_cell_spec.js4
-rw-r--r--spec/frontend/runner/components/runner_delete_button_spec.js4
-rw-r--r--spec/frontend/runner/components/runner_details_spec.js32
-rw-r--r--spec/frontend/runner/components/runner_filtered_search_bar_spec.js10
-rw-r--r--spec/frontend/runner/components/runner_list_spec.js4
-rw-r--r--spec/frontend/runner/components/runner_pause_button_spec.js24
-rw-r--r--spec/frontend/runner/components/runner_type_tabs_spec.js137
-rw-r--r--spec/frontend/runner/components/search_tokens/tag_token_spec.js3
-rw-r--r--spec/frontend/runner/components/stat/runner_count_spec.js148
-rw-r--r--spec/frontend/runner/components/stat/runner_stats_spec.js61
-rw-r--r--spec/frontend/runner/group_runner_show/group_runner_show_app_spec.js213
-rw-r--r--spec/frontend/runner/group_runners/group_runners_app_spec.js211
-rw-r--r--spec/frontend/runner/mock_data.js212
-rw-r--r--spec/frontend/runner/runner_search_utils_spec.js212
-rw-r--r--spec/frontend/security_configuration/components/app_spec.js173
-rw-r--r--spec/frontend/security_configuration/components/training_provider_list_spec.js77
-rw-r--r--spec/frontend/security_configuration/mock_data.js11
-rw-r--r--spec/frontend/self_monitor/components/__snapshots__/self_monitor_form_spec.js.snap2
-rw-r--r--spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js22
-rw-r--r--spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js14
-rw-r--r--spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js7
-rw-r--r--spec/frontend/sidebar/components/subscriptions/sidebar_subscriptions_widget_spec.js41
-rw-r--r--spec/frontend/sidebar/lock/issuable_lock_form_spec.js45
-rw-r--r--spec/frontend/sidebar/mock_data.js13
-rw-r--r--spec/frontend/snippets/components/edit_spec.js3
-rw-r--r--spec/frontend/snippets/components/show_spec.js5
-rw-r--r--spec/frontend/surveys/merge_request_performance/app_spec.js143
-rw-r--r--spec/frontend/tabs/index_spec.js105
-rw-r--r--spec/frontend/test_setup.js2
-rw-r--r--spec/frontend/tracking/tracking_spec.js2
-rw-r--r--spec/frontend/user_lists/store/edit/mutations_spec.js4
-rw-r--r--spec/frontend/user_lists/store/new/mutations_spec.js2
-rw-r--r--spec/frontend/user_popovers_spec.js26
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js5
-rw-r--r--spec/frontend/vue_mr_widget/deployment/deployment_action_button_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js71
-rw-r--r--spec/frontend/vue_mr_widget/extensions/test_report/utils_spec.js242
-rw-r--r--spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js6
-rw-r--r--spec/frontend/vue_mr_widget/extentions/terraform/index_spec.js4
-rw-r--r--spec/frontend/vue_mr_widget/mr_widget_options_spec.js169
-rw-r--r--spec/frontend/vue_mr_widget/test_extensions.js33
-rw-r--r--spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js18
-rw-r--r--spec/frontend/vue_shared/components/color_select_dropdown/dropdown_contents_spec.js52
-rw-r--r--spec/frontend/vue_shared/components/color_select_dropdown/dropdown_value_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/deployment_instance/deployment_instance_spec.js50
-rw-r--r--spec/frontend/vue_shared/components/deployment_instance/mock_data.js1
-rw-r--r--spec/frontend/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js143
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js146
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js283
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js282
-rw-r--r--spec/frontend/vue_shared/components/markdown/field_spec.js5
-rw-r--r--spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap23
-rw-r--r--spec/frontend/vue_shared/components/notes/placeholder_note_spec.js12
-rw-r--r--spec/frontend/vue_shared/components/page_size_selector_spec.js44
-rw-r--r--spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap4
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js10
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/plugins/link_dependencies_spec.js14
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/plugins/mock_data.js2
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util_spec.js33
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/plugins/utils/package_json_linker_spec.js15
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js41
-rw-r--r--spec/frontend/vue_shared/components/user_popover/user_popover_spec.js31
-rw-r--r--spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js73
-rw-r--r--spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js23
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js2
-rw-r--r--spec/frontend/work_items/components/item_title_spec.js2
-rw-r--r--spec/frontend/work_items/components/work_item_assignees_spec.js407
-rw-r--r--spec/frontend/work_items/components/work_item_detail_modal_spec.js10
-rw-r--r--spec/frontend/work_items/components/work_item_information_spec.js48
-rw-r--r--spec/frontend/work_items/components/work_item_labels_spec.js171
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js65
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_links_menu_spec.js141
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_links_spec.js30
-rw-r--r--spec/frontend/work_items/components/work_item_weight_spec.js154
-rw-r--r--spec/frontend/work_items/mock_data.js292
-rw-r--r--spec/frontend/work_items/pages/create_work_item_spec.js52
-rw-r--r--spec/frontend/work_items/pages/work_item_detail_spec.js135
-rw-r--r--spec/frontend/work_items/pages/work_item_root_spec.js1
-rw-r--r--spec/frontend_integration/diffs/diffs_interopability_spec.js5
-rw-r--r--spec/frontend_integration/ide/ide_integration_spec.js4
-rw-r--r--spec/frontend_integration/ide/user_opens_file_spec.js2
-rw-r--r--spec/frontend_integration/ide/user_opens_ide_spec.js3
-rw-r--r--spec/frontend_integration/ide/user_opens_mr_spec.js3
-rw-r--r--spec/frontend_integration/snippets/snippets_notes_spec.js62
-rw-r--r--spec/frontend_integration/test_helpers/mock_server/routes/emojis.js9
-rw-r--r--spec/frontend_integration/test_helpers/mock_server/routes/index.js1
-rw-r--r--spec/graphql/mutations/design_management/delete_spec.rb31
-rw-r--r--spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb57
-rw-r--r--spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/ci/runners_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/container_repositories_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/todo_resolver_spec.rb157
-rw-r--r--spec/graphql/resolvers/todos_resolver_spec.rb157
-rw-r--r--spec/graphql/resolvers/users/groups_resolver_spec.rb19
-rw-r--r--spec/graphql/types/ci/detailed_status_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/job_token_scope_type_spec.rb4
-rw-r--r--spec/graphql/types/ci/job_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/runner_upgrade_status_type_enum_spec.rb17
-rw-r--r--spec/graphql/types/ci/status_action_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/variable_type_enum_spec.rb9
-rw-r--r--spec/graphql/types/ci/variable_type_spec.rb11
-rw-r--r--spec/graphql/types/group_type_spec.rb2
-rw-r--r--spec/graphql/types/issue_type_enum_spec.rb4
-rw-r--r--spec/graphql/types/project_type_spec.rb3
-rw-r--r--spec/graphql/types/query_type_spec.rb1
-rw-r--r--spec/graphql/types/release_type_spec.rb3
-rw-r--r--spec/graphql/types/work_items/widget_interface_spec.rb1
-rw-r--r--spec/graphql/types/work_items/widgets/assignees_type_spec.rb11
-rw-r--r--spec/graphql/types/work_items/widgets/description_input_type_spec.rb9
-rw-r--r--spec/graphql/types/work_items/widgets/hierarchy_update_input_type_spec.rb9
-rw-r--r--spec/helpers/avatars_helper_spec.rb70
-rw-r--r--spec/helpers/ci/pipeline_editor_helper_spec.rb4
-rw-r--r--spec/helpers/commits_helper_spec.rb4
-rw-r--r--spec/helpers/diff_helper_spec.rb61
-rw-r--r--spec/helpers/emails_helper_spec.rb2
-rw-r--r--spec/helpers/environments_helper_spec.rb1
-rw-r--r--spec/helpers/groups/group_members_helper_spec.rb2
-rw-r--r--spec/helpers/groups_helper_spec.rb4
-rw-r--r--spec/helpers/learn_gitlab_helper_spec.rb85
-rw-r--r--spec/helpers/namespace_storage_limit_alert_helper_spec.rb11
-rw-r--r--spec/helpers/nav/new_dropdown_helper_spec.rb2
-rw-r--r--spec/helpers/projects/pipeline_helper_spec.rb6
-rw-r--r--spec/helpers/projects/project_members_helper_spec.rb70
-rw-r--r--spec/helpers/projects_helper_spec.rb6
-rw-r--r--spec/helpers/releases_helper_spec.rb6
-rw-r--r--spec/helpers/search_helper_spec.rb2
-rw-r--r--spec/helpers/sessions_helper_spec.rb47
-rw-r--r--spec/helpers/storage_helper_spec.rb14
-rw-r--r--spec/helpers/todos_helper_spec.rb65
-rw-r--r--spec/helpers/tree_helper_spec.rb54
-rw-r--r--spec/helpers/users/callouts_helper_spec.rb56
-rw-r--r--spec/helpers/web_hooks/web_hooks_helper_spec.rb120
-rw-r--r--spec/initializers/00_connection_logger_spec.rb39
-rw-r--r--spec/initializers/0_log_deprecations_spec.rb18
-rw-r--r--spec/initializers/100_patch_omniauth_oauth2_spec.rb2
-rw-r--r--spec/initializers/1_acts_as_taggable_spec.rb64
-rw-r--r--spec/initializers/enumerator_next_patch_spec.rb167
-rw-r--r--spec/initializers/set_active_support_hash_digest_class_spec.rb9
-rw-r--r--spec/lib/api/ci/helpers/runner_spec.rb26
-rw-r--r--spec/lib/api/entities/ci/job_request/service_spec.rb51
-rw-r--r--spec/lib/api/entities/deploy_key_spec.rb9
-rw-r--r--spec/lib/api/helpers/pagination_strategies_spec.rb15
-rw-r--r--spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb3
-rw-r--r--spec/lib/backup/gitaly_backup_spec.rb4
-rw-r--r--spec/lib/banzai/filter/footnote_filter_spec.rb13
-rw-r--r--spec/lib/banzai/reference_parser/snippet_parser_spec.rb2
-rw-r--r--spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb65
-rw-r--r--spec/lib/bulk_imports/pipeline/runner_spec.rb155
-rw-r--r--spec/lib/bulk_imports/retry_pipeline_error_spec.rb13
-rw-r--r--spec/lib/container_registry/gitlab_api_client_spec.rb11
-rw-r--r--spec/lib/error_tracking/collector/dsn_spec.rb34
-rw-r--r--spec/lib/error_tracking/stacktrace_builder_spec.rb29
-rw-r--r--spec/lib/feature_spec.rb10
-rw-r--r--spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb23
-rw-r--r--spec/lib/generators/model/mocks/migration_file.txt26
-rw-r--r--spec/lib/generators/model/mocks/model_file.txt2
-rw-r--r--spec/lib/generators/model/mocks/spec_file.txt5
-rw-r--r--spec/lib/generators/model/model_generator_spec.rb47
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb6
-rw-r--r--spec/lib/gitlab/application_rate_limiter/base_strategy_spec.rb17
-rw-r--r--spec/lib/gitlab/application_rate_limiter/increment_per_action_spec.rb51
-rw-r--r--spec/lib/gitlab/application_rate_limiter/increment_per_actioned_resource_spec.rb52
-rw-r--r--spec/lib/gitlab/application_rate_limiter_spec.rb60
-rw-r--r--spec/lib/gitlab/auth/ldap/user_spec.rb18
-rw-r--r--spec/lib/gitlab/auth_spec.rb11
-rw-r--r--spec/lib/gitlab/background_migration/backfill_ci_runner_semver_spec.rb54
-rw-r--r--spec/lib/gitlab/background_migration/backfill_imported_issue_search_data_spec.rb106
-rw-r--r--spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb5
-rw-r--r--spec/lib/gitlab/background_migration/batched_migration_job_spec.rb64
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb138
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy_spec.rb119
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy_spec.rb67
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb22
-rw-r--r--spec/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects_spec.rb81
-rw-r--r--spec/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations_spec.rb80
-rw-r--r--spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb30
-rw-r--r--spec/lib/gitlab/background_migration/set_correct_vulnerability_state_spec.rb81
-rw-r--r--spec/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces_spec.rb49
-rw-r--r--spec/lib/gitlab/bare_repository_import/importer_spec.rb9
-rw-r--r--spec/lib/gitlab/bare_repository_import/repository_spec.rb11
-rw-r--r--spec/lib/gitlab/bitbucket_import/importer_spec.rb9
-rw-r--r--spec/lib/gitlab/changelog/config_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/build/artifacts/expire_in_parser_spec.rb74
-rw-r--r--spec/lib/gitlab/ci/build/duration_parser_spec.rb74
-rw-r--r--spec/lib/gitlab/ci/build/image_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb34
-rw-r--r--spec/lib/gitlab/ci/build/rules/rule_spec.rb20
-rw-r--r--spec/lib/gitlab/ci/config/entry/image_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/config/entry/rules/rule/changes_spec.rb64
-rw-r--r--spec/lib/gitlab/ci/config/entry/rules/rule_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/config/entry/rules_spec.rb16
-rw-r--r--spec/lib/gitlab/ci/config/entry/service_spec.rb58
-rw-r--r--spec/lib/gitlab/ci/config/external/context_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/config/external/file/project_spec.rb16
-rw-r--r--spec/lib/gitlab/ci/config/external/mapper_spec.rb14
-rw-r--r--spec/lib/gitlab/ci/config/external/processor_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/jwt_spec.rb20
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/create_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/ensure_environments_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/ensure_resource_groups_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/build_spec.rb48
-rw-r--r--spec/lib/gitlab/ci/reports/coverage_report_generator_spec.rb10
-rw-r--r--spec/lib/gitlab/ci/reports/test_report_spec.rb189
-rw-r--r--spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/reports/test_reports_spec.rb189
-rw-r--r--spec/lib/gitlab/ci/runner/metrics_spec.rb41
-rw-r--r--spec/lib/gitlab/ci/runner_releases_spec.rb196
-rw-r--r--spec/lib/gitlab/ci/runner_upgrade_check_spec.rb170
-rw-r--r--spec/lib/gitlab/ci/status/stage/factory_spec.rb20
-rw-r--r--spec/lib/gitlab/ci/status/stage/play_manual_spec.rb10
-rw-r--r--spec/lib/gitlab/ci/tags/bulk_insert_spec.rb70
-rw-r--r--spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb10
-rw-r--r--spec/lib/gitlab/ci/variables/builder_spec.rb10
-rw-r--r--spec/lib/gitlab/ci/yaml_processor/feature_flags_spec.rb80
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb94
-rw-r--r--spec/lib/gitlab/content_security_policy/config_loader_spec.rb13
-rw-r--r--spec/lib/gitlab/data_builder/deployment_spec.rb10
-rw-r--r--spec/lib/gitlab/data_builder/pipeline_spec.rb11
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_job_spec.rb6
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb63
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_spec.rb49
-rw-r--r--spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb61
-rw-r--r--spec/lib/gitlab/database/background_migration/health_status_spec.rb77
-rw-r--r--spec/lib/gitlab/database/each_database_spec.rb27
-rw-r--r--spec/lib/gitlab/database/gitlab_schema_spec.rb19
-rw-r--r--spec/lib/gitlab/database/loose_foreign_keys_spec.rb13
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb29
-rw-r--r--spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb24
-rw-r--r--spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb2
-rw-r--r--spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb4
-rw-r--r--spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb32
-rw-r--r--spec/lib/gitlab/database/reindexing_spec.rb2
-rw-r--r--spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb8
-rw-r--r--spec/lib/gitlab/database_spec.rb2
-rw-r--r--spec/lib/gitlab/dependency_linker/base_linker_spec.rb2
-rw-r--r--spec/lib/gitlab/diff/file_spec.rb8
-rw-r--r--spec/lib/gitlab/diff/formatters/image_formatter_spec.rb1
-rw-r--r--spec/lib/gitlab/diff/formatters/text_formatter_spec.rb1
-rw-r--r--spec/lib/gitlab/diff/highlight_cache_spec.rb19
-rw-r--r--spec/lib/gitlab/diff/position_spec.rb80
-rw-r--r--spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb113
-rw-r--r--spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb138
-rw-r--r--spec/lib/gitlab/diff/rendered/notebook/diff_file_helper_spec.rb6
-rw-r--r--spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb6
-rw-r--r--spec/lib/gitlab/elasticsearch/logs/lines_spec.rb97
-rw-r--r--spec/lib/gitlab/elasticsearch/logs/pods_spec.rb35
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb18
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb1
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb115
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing_spec.rb1
-rw-r--r--spec/lib/gitlab/encoding_helper_spec.rb48
-rw-r--r--spec/lib/gitlab/error_tracking/error_repository/open_api_strategy_spec.rb436
-rw-r--r--spec/lib/gitlab/error_tracking/processor/sanitizer_processor_spec.rb114
-rw-r--r--spec/lib/gitlab/error_tracking_spec.rb20
-rw-r--r--spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb2
-rw-r--r--spec/lib/gitlab/git/attributes_parser_spec.rb14
-rw-r--r--spec/lib/gitlab/git/blame_spec.rb16
-rw-r--r--spec/lib/gitlab/git/branch_spec.rb25
-rw-r--r--spec/lib/gitlab/git/commit_spec.rb75
-rw-r--r--spec/lib/gitlab/git/conflict/parser_spec.rb79
-rw-r--r--spec/lib/gitlab/git/object_pool_spec.rb12
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb266
-rw-r--r--spec/lib/gitlab/git/tree_spec.rb56
-rw-r--r--spec/lib/gitlab/gitaly_client/commit_service_spec.rb3
-rw-r--r--spec/lib/gitlab/gitaly_client/operation_service_spec.rb17
-rw-r--r--spec/lib/gitlab/gitaly_client/ref_service_spec.rb60
-rw-r--r--spec/lib/gitlab/gitaly_client_spec.rb58
-rw-r--r--spec/lib/gitlab/github_import/importer/events/changed_label_spec.rb61
-rw-r--r--spec/lib/gitlab/github_import/importer/events/closed_spec.rb72
-rw-r--r--spec/lib/gitlab/github_import/importer/events/cross_referenced_spec.rb96
-rw-r--r--spec/lib/gitlab/github_import/importer/events/renamed_spec.rb68
-rw-r--r--spec/lib/gitlab/github_import/importer/events/reopened_spec.rb56
-rw-r--r--spec/lib/gitlab/github_import/importer/issue_event_importer_spec.rb112
-rw-r--r--spec/lib/gitlab/github_import/importer/issue_importer_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer_spec.rb128
-rw-r--r--spec/lib/gitlab/github_import/markdown_text_spec.rb48
-rw-r--r--spec/lib/gitlab/github_import/representation/issue_event_spec.rb156
-rw-r--r--spec/lib/gitlab/github_import/single_endpoint_notes_importing_spec.rb29
-rw-r--r--spec/lib/gitlab/gitlab_import/importer_spec.rb4
-rw-r--r--spec/lib/gitlab/gpg/commit_spec.rb261
-rw-r--r--spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb31
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb2
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb6
-rw-r--r--spec/lib/gitlab/harbor/client_spec.rb269
-rw-r--r--spec/lib/gitlab/harbor/query_spec.rb375
-rw-r--r--spec/lib/gitlab/hash_digest/facade_spec.rb36
-rw-r--r--spec/lib/gitlab/hook_data/merge_request_builder_spec.rb52
-rw-r--r--spec/lib/gitlab/http_connection_adapter_spec.rb12
-rw-r--r--spec/lib/gitlab/http_spec.rb56
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml6
-rw-r--r--spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb23
-rw-r--r--spec/lib/gitlab/import_export/members_mapper_spec.rb6
-rw-r--r--spec/lib/gitlab/import_export/project/tree_restorer_spec.rb81
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml2
-rw-r--r--spec/lib/gitlab/issuable/clone/attributes_rewriter_spec.rb93
-rw-r--r--spec/lib/gitlab/issuable/clone/copy_resource_events_service_spec.rb91
-rw-r--r--spec/lib/gitlab/jira_import/issue_serializer_spec.rb7
-rw-r--r--spec/lib/gitlab/jira_import/issues_importer_spec.rb19
-rw-r--r--spec/lib/gitlab/lograge/custom_options_spec.rb17
-rw-r--r--spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb2
-rw-r--r--spec/lib/gitlab/memory/watchdog_spec.rb308
-rw-r--r--spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb47
-rw-r--r--spec/lib/gitlab/metrics/memory_spec.rb40
-rw-r--r--spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb6
-rw-r--r--spec/lib/gitlab/metrics/sli_spec.rb8
-rw-r--r--spec/lib/gitlab/pages/cache_control_spec.rb42
-rw-r--r--spec/lib/gitlab/pages/deployment_update_spec.rb140
-rw-r--r--spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb16
-rw-r--r--spec/lib/gitlab/pagination/keyset/order_spec.rb24
-rw-r--r--spec/lib/gitlab/quick_actions/users_extractor_spec.rb93
-rw-r--r--spec/lib/gitlab/redis/multi_store_spec.rb22
-rw-r--r--spec/lib/gitlab/regex_spec.rb14
-rw-r--r--spec/lib/gitlab/security/scan_configuration_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb77
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb10
-rw-r--r--spec/lib/gitlab/tracking/destinations/snowplow_micro_spec.rb79
-rw-r--r--spec/lib/gitlab/tracking/destinations/snowplow_spec.rb2
-rw-r--r--spec/lib/gitlab/tracking/incident_management_spec.rb2
-rw-r--r--spec/lib/gitlab/tracking/standard_context_spec.rb27
-rw-r--r--spec/lib/gitlab/tracking_spec.rb59
-rw-r--r--spec/lib/gitlab/tree_summary_spec.rb146
-rw-r--r--spec/lib/gitlab/usage/metric_definition_spec.rb4
-rw-r--r--spec/lib/gitlab/usage/metric_spec.rb2
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric_spec.rb31
-rw-r--r--spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb50
-rw-r--r--spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb30
-rw-r--r--spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb107
-rw-r--r--spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb34
-rw-r--r--spec/lib/gitlab/usage_data_counters/work_item_activity_unique_counter_spec.rb40
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb71
-rw-r--r--spec/lib/gitlab/user_access_spec.rb34
-rw-r--r--spec/lib/gitlab/version_info_spec.rb159
-rw-r--r--spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb29
-rw-r--r--spec/lib/gitlab/x509/certificate_spec.rb62
-rw-r--r--spec/lib/gitlab/x509/commit_spec.rb41
-rw-r--r--spec/lib/gitlab/x509/signature_spec.rb2
-rw-r--r--spec/lib/google_api/cloud_platform/client_spec.rb38
-rw-r--r--spec/lib/initializer_connections_spec.rb63
-rw-r--r--spec/lib/json_web_token/rsa_token_spec.rb2
-rw-r--r--spec/lib/learn_gitlab/onboarding_spec.rb35
-rw-r--r--spec/lib/sidebars/projects/menus/monitor_menu_spec.rb28
-rw-r--r--spec/lib/sidebars/projects/menus/settings_menu_spec.rb19
-rw-r--r--spec/lib/unnested_in_filters/dsl_spec.rb31
-rw-r--r--spec/lib/unnested_in_filters/rewriter_spec.rb157
-rw-r--r--spec/mailers/devise_mailer_spec.rb30
-rw-r--r--spec/mailers/emails/admin_notification_spec.rb18
-rw-r--r--spec/mailers/emails/in_product_marketing_spec.rb8
-rw-r--r--spec/mailers/emails/profile_spec.rb8
-rw-r--r--spec/mailers/notify_spec.rb17
-rw-r--r--spec/metrics_server/metrics_server_spec.rb23
-rw-r--r--spec/migrations/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events_spec.rb24
-rw-r--r--spec/migrations/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences_spec.rb22
-rw-r--r--spec/migrations/20220620132300_update_last_run_date_for_iterations_cadences_spec.rb29
-rw-r--r--spec/migrations/20220622080547_backfill_project_statistics_with_container_registry_size_spec.rb41
-rw-r--r--spec/migrations/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects_spec.rb63
-rw-r--r--spec/migrations/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace_spec.rb32
-rw-r--r--spec/migrations/20220628012902_finalise_project_namespace_members_spec.rb72
-rw-r--r--spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb72
-rw-r--r--spec/migrations/20220715163254_update_notes_in_past_spec.rb23
-rw-r--r--spec/migrations/change_public_projects_cost_factor_spec.rb68
-rw-r--r--spec/migrations/finalize_orphaned_routes_cleanup_spec.rb72
-rw-r--r--spec/migrations/populate_operation_visibility_permissions_spec.rb32
-rw-r--r--spec/migrations/reschedule_backfill_imported_issue_search_data_spec.rb55
-rw-r--r--spec/migrations/schedule_set_correct_vulnerability_state_spec.rb33
-rw-r--r--spec/models/ability_spec.rb32
-rw-r--r--spec/models/application_setting_spec.rb54
-rw-r--r--spec/models/authentication_event_spec.rb27
-rw-r--r--spec/models/awareness_session_spec.rb163
-rw-r--r--spec/models/ci/build_report_result_spec.rb6
-rw-r--r--spec/models/ci/build_spec.rb172
-rw-r--r--spec/models/ci/group_spec.rb2
-rw-r--r--spec/models/ci/group_variable_spec.rb6
-rw-r--r--spec/models/ci/legacy_stage_spec.rb268
-rw-r--r--spec/models/ci/pending_build_spec.rb58
-rw-r--r--spec/models/ci/pipeline_artifact_spec.rb74
-rw-r--r--spec/models/ci/pipeline_spec.rb287
-rw-r--r--spec/models/ci/processable_spec.rb4
-rw-r--r--spec/models/ci/runner_spec.rb147
-rw-r--r--spec/models/ci/runner_version_spec.rb53
-rw-r--r--spec/models/ci/stage_spec.rb28
-rw-r--r--spec/models/ci/variable_spec.rb6
-rw-r--r--spec/models/clusters/applications/elastic_stack_spec.rb177
-rw-r--r--spec/models/clusters/cluster_spec.rb17
-rw-r--r--spec/models/clusters/integrations/elastic_stack_spec.rb19
-rw-r--r--spec/models/clusters/integrations/prometheus_spec.rb26
-rw-r--r--spec/models/commit_status_spec.rb20
-rw-r--r--spec/models/concerns/awareness_spec.rb39
-rw-r--r--spec/models/concerns/cache_markdown_field_spec.rb2
-rw-r--r--spec/models/concerns/cacheable_attributes_spec.rb7
-rw-r--r--spec/models/concerns/ci/artifactable_spec.rb9
-rw-r--r--spec/models/concerns/ci/bulk_insertable_tags_spec.rb66
-rw-r--r--spec/models/concerns/each_batch_spec.rb99
-rw-r--r--spec/models/concerns/loose_index_scan_spec.rb57
-rw-r--r--spec/models/concerns/participable_spec.rb10
-rw-r--r--spec/models/concerns/pg_full_text_searchable_spec.rb4
-rw-r--r--spec/models/concerns/require_email_verification_spec.rb104
-rw-r--r--spec/models/concerns/token_authenticatable_spec.rb1
-rw-r--r--spec/models/container_registry/event_spec.rb38
-rw-r--r--spec/models/container_repository_spec.rb23
-rw-r--r--spec/models/deployment_spec.rb148
-rw-r--r--spec/models/diff_note_spec.rb30
-rw-r--r--spec/models/environment_spec.rb28
-rw-r--r--spec/models/factories_spec.rb1
-rw-r--r--spec/models/group_spec.rb95
-rw-r--r--spec/models/hooks/project_hook_spec.rb71
-rw-r--r--spec/models/hooks/web_hook_spec.rb91
-rw-r--r--spec/models/incident_management/issuable_escalation_status_spec.rb4
-rw-r--r--spec/models/integration_spec.rb109
-rw-r--r--spec/models/integrations/base_chat_notification_spec.rb18
-rw-r--r--spec/models/integrations/chat_message/deployment_message_spec.rb2
-rw-r--r--spec/models/integrations/datadog_spec.rb16
-rw-r--r--spec/models/integrations/field_spec.rb73
-rw-r--r--spec/models/integrations/harbor_spec.rb8
-rw-r--r--spec/models/integrations/irker_spec.rb14
-rw-r--r--spec/models/integrations/jira_spec.rb2
-rw-r--r--spec/models/integrations/prometheus_spec.rb43
-rw-r--r--spec/models/integrations/slack_spec.rb2
-rw-r--r--spec/models/integrations/youtrack_spec.rb6
-rw-r--r--spec/models/issue_spec.rb76
-rw-r--r--spec/models/key_spec.rb105
-rw-r--r--spec/models/members/group_member_spec.rb6
-rw-r--r--spec/models/members/project_member_spec.rb30
-rw-r--r--spec/models/merge_request_diff_file_spec.rb153
-rw-r--r--spec/models/merge_request_diff_spec.rb97
-rw-r--r--spec/models/merge_request_spec.rb16
-rw-r--r--spec/models/namespace_spec.rb42
-rw-r--r--spec/models/note_spec.rb16
-rw-r--r--spec/models/oauth_access_token_spec.rb48
-rw-r--r--spec/models/operations/feature_flags_client_spec.rb70
-rw-r--r--spec/models/packages/cleanup/policy_spec.rb36
-rw-r--r--spec/models/packages/debian/file_entry_spec.rb7
-rw-r--r--spec/models/pages/virtual_domain_spec.rb21
-rw-r--r--spec/models/pages_domain_spec.rb29
-rw-r--r--spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb3
-rw-r--r--spec/models/project_export_job_spec.rb13
-rw-r--r--spec/models/project_import_state_spec.rb41
-rw-r--r--spec/models/project_setting_spec.rb11
-rw-r--r--spec/models/project_spec.rb60
-rw-r--r--spec/models/project_team_spec.rb10
-rw-r--r--spec/models/project_tracing_setting_spec.rb40
-rw-r--r--spec/models/projects/import_export/relation_export_spec.rb23
-rw-r--r--spec/models/projects/import_export/relation_export_upload_spec.rb25
-rw-r--r--spec/models/protected_branch_spec.rb8
-rw-r--r--spec/models/remote_mirror_spec.rb18
-rw-r--r--spec/models/repository_spec.rb64
-rw-r--r--spec/models/ssh_host_key_spec.rb41
-rw-r--r--spec/models/todo_spec.rb20
-rw-r--r--spec/models/tree_spec.rb3
-rw-r--r--spec/models/user_spec.rb593
-rw-r--r--spec/models/users/namespace_callout_spec.rb39
-rw-r--r--spec/models/wiki_page_spec.rb57
-rw-r--r--spec/models/work_item_spec.rb57
-rw-r--r--spec/models/work_items/parent_link_spec.rb18
-rw-r--r--spec/models/work_items/type_spec.rb4
-rw-r--r--spec/models/work_items/widgets/assignees_spec.rb31
-rw-r--r--spec/models/work_items/widgets/hierarchy_spec.rb43
-rw-r--r--spec/models/x509_certificate_spec.rb5
-rw-r--r--spec/models/x509_issuer_spec.rb5
-rw-r--r--spec/policies/environment_policy_spec.rb8
-rw-r--r--spec/policies/global_policy_spec.rb40
-rw-r--r--spec/policies/group_policy_spec.rb27
-rw-r--r--spec/policies/incident_management/timeline_event_policy_spec.rb60
-rw-r--r--spec/policies/issue_policy_spec.rb12
-rw-r--r--spec/policies/merge_request_policy_spec.rb62
-rw-r--r--spec/policies/namespace/root_storage_statistics_policy_spec.rb2
-rw-r--r--spec/policies/namespaces/user_namespace_policy_spec.rb2
-rw-r--r--spec/policies/project_policy_spec.rb157
-rw-r--r--spec/policies/project_statistics_policy_spec.rb2
-rw-r--r--spec/policies/work_item_policy_spec.rb29
-rw-r--r--spec/presenters/blob_presenter_spec.rb2
-rw-r--r--spec/presenters/ci/build_presenter_spec.rb82
-rw-r--r--spec/presenters/ci/legacy_stage_presenter_spec.rb47
-rw-r--r--spec/presenters/clusters/cluster_presenter_spec.rb80
-rw-r--r--spec/presenters/gitlab/blame_presenter_spec.rb3
-rw-r--r--spec/requests/admin/background_migrations_controller_spec.rb4
-rw-r--r--spec/requests/api/api_spec.rb4
-rw-r--r--spec/requests/api/award_emoji_spec.rb112
-rw-r--r--spec/requests/api/ci/runner/jobs_request_post_spec.rb73
-rw-r--r--spec/requests/api/commits_spec.rb19
-rw-r--r--spec/requests/api/conan_instance_packages_spec.rb6
-rw-r--r--spec/requests/api/conan_project_packages_spec.rb6
-rw-r--r--spec/requests/api/environments_spec.rb83
-rw-r--r--spec/requests/api/events_spec.rb2
-rw-r--r--spec/requests/api/feature_flags_user_lists_spec.rb7
-rw-r--r--spec/requests/api/geo_spec.rb14
-rw-r--r--spec/requests/api/graphql/boards/board_lists_query_spec.rb3
-rw-r--r--spec/requests/api/graphql/ci/group_variables_spec.rb67
-rw-r--r--spec/requests/api/graphql/ci/instance_variables_spec.rb60
-rw-r--r--spec/requests/api/graphql/ci/job_spec.rb4
-rw-r--r--spec/requests/api/graphql/ci/jobs_spec.rb6
-rw-r--r--spec/requests/api/graphql/ci/manual_variables_spec.rb95
-rw-r--r--spec/requests/api/graphql/ci/pipelines_spec.rb4
-rw-r--r--spec/requests/api/graphql/ci/project_variables_spec.rb67
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb2
-rw-r--r--spec/requests/api/graphql/ci/stages_spec.rb2
-rw-r--r--spec/requests/api/graphql/container_repository/container_repository_details_spec.rb2
-rw-r--r--spec/requests/api/graphql/crm/contacts_spec.rb69
-rw-r--r--spec/requests/api/graphql/current_user/groups_query_spec.rb34
-rw-r--r--spec/requests/api/graphql/group/container_repositories_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb7
-rw-r--r--spec/requests/api/graphql/group/group_members_spec.rb48
-rw-r--r--spec/requests/api/graphql/mutations/issues/create_spec.rb36
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb14
-rw-r--r--spec/requests/api/graphql/mutations/snippets/update_spec.rb17
-rw-r--r--spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/work_items/create_spec.rb89
-rw-r--r--spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/work_items/update_spec.rb268
-rw-r--r--spec/requests/api/graphql/mutations/work_items/update_widgets_spec.rb51
-rw-r--r--spec/requests/api/graphql/project/container_repositories_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/issues_spec.rb37
-rw-r--r--spec/requests/api/graphql/project/jobs_spec.rb4
-rw-r--r--spec/requests/api/graphql/project/packages_cleanup_policy_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/pipeline_spec.rb60
-rw-r--r--spec/requests/api/graphql/project/project_members_spec.rb48
-rw-r--r--spec/requests/api/graphql/todo_query_spec.rb50
-rw-r--r--spec/requests/api/graphql/work_item_spec.rb98
-rw-r--r--spec/requests/api/group_export_spec.rb14
-rw-r--r--spec/requests/api/group_variables_spec.rb2
-rw-r--r--spec/requests/api/groups_spec.rb14
-rw-r--r--spec/requests/api/integrations_spec.rb40
-rw-r--r--spec/requests/api/internal/base_spec.rb58
-rw-r--r--spec/requests/api/internal/error_tracking_spec.rb108
-rw-r--r--spec/requests/api/internal/kubernetes_spec.rb4
-rw-r--r--spec/requests/api/invitations_spec.rb40
-rw-r--r--spec/requests/api/issues/issues_spec.rb14
-rw-r--r--spec/requests/api/markdown_snapshot_spec.rb4
-rw-r--r--spec/requests/api/maven_packages_spec.rb40
-rw-r--r--spec/requests/api/metadata_spec.rb94
-rw-r--r--spec/requests/api/npm_project_packages_spec.rb14
-rw-r--r--spec/requests/api/project_attributes.yml6
-rw-r--r--spec/requests/api/project_export_spec.rb14
-rw-r--r--spec/requests/api/project_hooks_spec.rb247
-rw-r--r--spec/requests/api/project_import_spec.rb10
-rw-r--r--spec/requests/api/projects_spec.rb43
-rw-r--r--spec/requests/api/protected_tags_spec.rb7
-rw-r--r--spec/requests/api/pypi_packages_spec.rb15
-rw-r--r--spec/requests/api/repositories_spec.rb74
-rw-r--r--spec/requests/api/settings_spec.rb2
-rw-r--r--spec/requests/api/snippets_spec.rb38
-rw-r--r--spec/requests/api/system_hooks_spec.rb229
-rw-r--r--spec/requests/api/tags_spec.rb7
-rw-r--r--spec/requests/api/terraform/modules/v1/packages_spec.rb210
-rw-r--r--spec/requests/api/unleash_spec.rb42
-rw-r--r--spec/requests/api/users_spec.rb109
-rw-r--r--spec/requests/groups/harbor/artifacts_controller_spec.rb10
-rw-r--r--spec/requests/groups/harbor/repositories_controller_spec.rb65
-rw-r--r--spec/requests/groups/harbor/tags_controller_spec.rb10
-rw-r--r--spec/requests/jira_authorizations_spec.rb6
-rw-r--r--spec/requests/jira_connect/oauth_application_ids_controller_spec.rb53
-rw-r--r--spec/requests/jira_connect/subscriptions_controller_spec.rb29
-rw-r--r--spec/requests/jwks_controller_spec.rb6
-rw-r--r--spec/requests/oauth_tokens_spec.rb78
-rw-r--r--spec/requests/openid_connect_spec.rb14
-rw-r--r--spec/requests/projects/environments_controller_spec.rb2
-rw-r--r--spec/requests/projects/google_cloud/configuration_controller_spec.rb141
-rw-r--r--spec/requests/projects/google_cloud/databases_controller_spec.rb135
-rw-r--r--spec/requests/projects/google_cloud/deployments_controller_spec.rb27
-rw-r--r--spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb16
-rw-r--r--spec/requests/projects/google_cloud/revoke_oauth_controller_spec.rb12
-rw-r--r--spec/requests/projects/google_cloud/service_accounts_controller_spec.rb67
-rw-r--r--spec/requests/projects/google_cloud_controller_spec.rb178
-rw-r--r--spec/requests/projects/harbor/artifacts_controller_spec.rb10
-rw-r--r--spec/requests/projects/harbor/repositories_controller_spec.rb65
-rw-r--r--spec/requests/projects/harbor/tags_controller_spec.rb10
-rw-r--r--spec/requests/projects/issues_controller_spec.rb16
-rw-r--r--spec/requests/projects/pipelines_controller_spec.rb67
-rw-r--r--spec/requests/users_controller_spec.rb8
-rw-r--r--spec/requests/verifies_with_email_spec.rb234
-rw-r--r--spec/routing/group_routing_spec.rb12
-rw-r--r--spec/routing/project_routing_spec.rb24
-rw-r--r--spec/routing/routing_spec.rb20
-rw-r--r--spec/rubocop/cop/database/rescue_query_canceled_spec.rb29
-rw-r--r--spec/rubocop/cop/database/rescue_statement_timeout_spec.rb29
-rw-r--r--spec/rubocop/cop/gitlab/namespaced_class_spec.rb6
-rw-r--r--spec/scripts/determine-qa-tests_spec.rb109
-rw-r--r--spec/scripts/lib/glfm/update_example_snapshots_spec.rb47
-rw-r--r--spec/scripts/pipeline_test_report_builder_spec.rb48
-rw-r--r--spec/serializers/ci/dag_job_group_entity_spec.rb6
-rw-r--r--spec/serializers/ci/dag_pipeline_entity_spec.rb6
-rw-r--r--spec/serializers/ci/dag_stage_entity_spec.rb4
-rw-r--r--spec/serializers/ci/job_entity_spec.rb8
-rw-r--r--spec/serializers/ci/job_serializer_spec.rb32
-rw-r--r--spec/serializers/cluster_entity_spec.rb60
-rw-r--r--spec/serializers/cluster_serializer_spec.rb2
-rw-r--r--spec/serializers/diffs_entity_spec.rb1
-rw-r--r--spec/serializers/diffs_metadata_entity_spec.rb1
-rw-r--r--spec/serializers/environment_entity_spec.rb48
-rw-r--r--spec/serializers/integrations/field_entity_spec.rb2
-rw-r--r--spec/serializers/integrations/harbor_serializers/artifact_entity_spec.rb51
-rw-r--r--spec/serializers/integrations/harbor_serializers/artifact_serializer_spec.rb9
-rw-r--r--spec/serializers/integrations/harbor_serializers/repository_entity_spec.rb55
-rw-r--r--spec/serializers/integrations/harbor_serializers/repository_serializer_spec.rb9
-rw-r--r--spec/serializers/integrations/harbor_serializers/tag_entity_spec.rb38
-rw-r--r--spec/serializers/integrations/harbor_serializers/tag_serializer_spec.rb9
-rw-r--r--spec/serializers/issue_entity_spec.rb2
-rw-r--r--spec/serializers/member_user_entity_spec.rb4
-rw-r--r--spec/serializers/paginated_diff_entity_spec.rb1
-rw-r--r--spec/serializers/stage_entity_spec.rb10
-rw-r--r--spec/serializers/stage_serializer_spec.rb4
-rw-r--r--spec/serializers/test_reports_comparer_entity_spec.rb4
-rw-r--r--spec/serializers/test_reports_comparer_serializer_spec.rb4
-rw-r--r--spec/services/alert_management/alerts/update_service_spec.rb51
-rw-r--r--spec/services/ci/abort_pipelines_service_spec.rb8
-rw-r--r--spec/services/ci/create_pipeline_service/include_spec.rb46
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb11
-rw-r--r--spec/services/ci/ensure_stage_service_spec.rb2
-rw-r--r--spec/services/ci/generate_coverage_reports_service_spec.rb40
-rw-r--r--spec/services/ci/job_artifacts/create_service_spec.rb28
-rw-r--r--spec/services/ci/job_artifacts/destroy_batch_service_spec.rb20
-rw-r--r--spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb42
-rw-r--r--spec/services/ci/play_manual_stage_service_spec.rb2
-rw-r--r--spec/services/ci/register_job_service_spec.rb60
-rw-r--r--spec/services/ci/retry_job_service_spec.rb4
-rw-r--r--spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb149
-rw-r--r--spec/services/ci/runners/register_runner_service_spec.rb41
-rw-r--r--spec/services/ci/unlock_artifacts_service_spec.rb2
-rw-r--r--spec/services/ci/update_pending_build_service_spec.rb26
-rw-r--r--spec/services/clusters/applications/create_service_spec.rb23
-rw-r--r--spec/services/clusters/integrations/create_service_spec.rb1
-rw-r--r--spec/services/deployments/create_for_build_service_spec.rb1
-rw-r--r--spec/services/deployments/create_service_spec.rb37
-rw-r--r--spec/services/deployments/update_environment_service_spec.rb2
-rw-r--r--spec/services/draft_notes/publish_service_spec.rb2
-rw-r--r--spec/services/event_create_service_spec.rb69
-rw-r--r--spec/services/feature_flags/create_service_spec.rb4
-rw-r--r--spec/services/feature_flags/destroy_service_spec.rb4
-rw-r--r--spec/services/feature_flags/update_service_spec.rb4
-rw-r--r--spec/services/git/branch_hooks_service_spec.rb21
-rw-r--r--spec/services/git/branch_push_service_spec.rb191
-rw-r--r--spec/services/git/process_ref_changes_service_spec.rb39
-rw-r--r--spec/services/git/tag_hooks_service_spec.rb2
-rw-r--r--spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb2
-rw-r--r--spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb158
-rw-r--r--spec/services/groups/destroy_service_spec.rb10
-rw-r--r--spec/services/groups/group_links/destroy_service_spec.rb56
-rw-r--r--spec/services/groups/transfer_service_spec.rb12
-rw-r--r--spec/services/groups/update_service_spec.rb12
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb54
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb6
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb15
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb6
-rw-r--r--spec/services/incident_management/timeline_events/create_service_spec.rb101
-rw-r--r--spec/services/incident_management/timeline_events/update_service_spec.rb6
-rw-r--r--spec/services/issuable/clone/attributes_rewriter_spec.rb140
-rw-r--r--spec/services/issues/clone_service_spec.rb51
-rw-r--r--spec/services/issues/close_service_spec.rb17
-rw-r--r--spec/services/issues/create_service_spec.rb25
-rw-r--r--spec/services/issues/import_csv_service_spec.rb24
-rw-r--r--spec/services/issues/move_service_spec.rb1
-rw-r--r--spec/services/issues/related_branches_service_spec.rb93
-rw-r--r--spec/services/issues/reopen_service_spec.rb33
-rw-r--r--spec/services/issues/update_service_spec.rb21
-rw-r--r--spec/services/members/create_service_spec.rb12
-rw-r--r--spec/services/members/creator_service_spec.rb4
-rw-r--r--spec/services/members/groups/creator_service_spec.rb6
-rw-r--r--spec/services/members/invite_member_builder_spec.rb44
-rw-r--r--spec/services/members/invite_service_spec.rb13
-rw-r--r--spec/services/members/projects/creator_service_spec.rb6
-rw-r--r--spec/services/members/standard_member_builder_spec.rb25
-rw-r--r--spec/services/merge_requests/approval_service_spec.rb2
-rw-r--r--spec/services/merge_requests/create_pipeline_service_spec.rb11
-rw-r--r--spec/services/merge_requests/create_service_spec.rb1
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb23
-rw-r--r--spec/services/merge_requests/update_service_spec.rb26
-rw-r--r--spec/services/namespaces/in_product_marketing_emails_service_spec.rb1
-rw-r--r--spec/services/notification_service_spec.rb83
-rw-r--r--spec/services/packages/cleanup/execute_policy_service_spec.rb163
-rw-r--r--spec/services/packages/debian/create_package_file_service_spec.rb8
-rw-r--r--spec/services/packages/debian/extract_changes_metadata_service_spec.rb6
-rw-r--r--spec/services/packages/debian/generate_distribution_service_spec.rb6
-rw-r--r--spec/services/packages/mark_package_files_for_destruction_service_spec.rb47
-rw-r--r--spec/services/packages/pypi/create_package_service_spec.rb15
-rw-r--r--spec/services/pages/delete_service_spec.rb6
-rw-r--r--spec/services/pod_logs/base_service_spec.rb147
-rw-r--r--spec/services/pod_logs/elasticsearch_service_spec.rb309
-rw-r--r--spec/services/pod_logs/kubernetes_service_spec.rb310
-rw-r--r--spec/services/preview_markdown_service_spec.rb20
-rw-r--r--spec/services/projects/after_rename_service_spec.rb32
-rw-r--r--spec/services/projects/blame_service_spec.rb36
-rw-r--r--spec/services/projects/create_from_template_service_spec.rb2
-rw-r--r--spec/services/projects/create_service_spec.rb26
-rw-r--r--spec/services/projects/destroy_service_spec.rb29
-rw-r--r--spec/services/projects/fork_service_spec.rb21
-rw-r--r--spec/services/projects/group_links/update_service_spec.rb2
-rw-r--r--spec/services/projects/move_deploy_keys_projects_service_spec.rb17
-rw-r--r--spec/services/projects/operations/update_service_spec.rb88
-rw-r--r--spec/services/projects/prometheus/alerts/notify_service_spec.rb2
-rw-r--r--spec/services/projects/transfer_service_spec.rb20
-rw-r--r--spec/services/projects/update_pages_service_spec.rb54
-rw-r--r--spec/services/projects/update_service_spec.rb44
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb57
-rw-r--r--spec/services/repositories/changelog_service_spec.rb19
-rw-r--r--spec/services/search_service_spec.rb17
-rw-r--r--spec/services/service_ping/submit_service_ping_service_spec.rb53
-rw-r--r--spec/services/suggestions/apply_service_spec.rb3
-rw-r--r--spec/services/system_notes/incidents_service_spec.rb14
-rw-r--r--spec/services/terraform/states/trigger_destroy_service_spec.rb13
-rw-r--r--spec/services/todo_service_spec.rb4
-rw-r--r--spec/services/users/activity_service_spec.rb7
-rw-r--r--spec/services/web_hook_service_spec.rb68
-rw-r--r--spec/services/web_hooks/log_execution_service_spec.rb6
-rw-r--r--spec/services/work_items/create_and_link_service_spec.rb19
-rw-r--r--spec/services/work_items/create_from_task_service_spec.rb10
-rw-r--r--spec/services/work_items/create_service_spec.rb123
-rw-r--r--spec/services/work_items/delete_task_service_spec.rb2
-rw-r--r--spec/services/work_items/parent_links/create_service_spec.rb173
-rw-r--r--spec/services/work_items/parent_links/destroy_service_spec.rb47
-rw-r--r--spec/services/work_items/task_list_reference_removal_service_spec.rb7
-rw-r--r--spec/services/work_items/task_list_reference_replacement_service_spec.rb10
-rw-r--r--spec/services/work_items/update_service_spec.rb109
-rw-r--r--spec/services/work_items/widgets/description_service/update_service_spec.rb35
-rw-r--r--spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb160
-rw-r--r--spec/services/work_items/widgets/weight_service/update_service_spec.rb36
-rw-r--r--spec/simplecov_env.rb2
-rw-r--r--spec/spec_helper.rb25
-rw-r--r--spec/support/finder_collection.rb48
-rw-r--r--spec/support/finder_collection_allowlist.yml66
-rw-r--r--spec/support/gitlab_experiment.rb1
-rw-r--r--spec/support/gitlab_stubs/gitlab_ci_dast_includes.yml10
-rw-r--r--spec/support/graphql/arguments.rb4
-rw-r--r--spec/support/helpers/database/database_helpers.rb6
-rw-r--r--spec/support/helpers/detailed_error_helpers.rb19
-rw-r--r--spec/support/helpers/features/invite_members_modal_helper.rb44
-rw-r--r--spec/support/helpers/features/source_editor_spec_helpers.rb7
-rw-r--r--spec/support/helpers/features/web_ide_spec_helpers.rb14
-rw-r--r--spec/support/helpers/harbor_helper.rb27
-rw-r--r--spec/support/helpers/kubernetes_helpers.rb18
-rw-r--r--spec/support/helpers/project_forks_helper.rb9
-rw-r--r--spec/support/helpers/project_helpers.rb2
-rw-r--r--spec/support/helpers/prometheus_helpers.rb7
-rw-r--r--spec/support/helpers/repo_helpers.rb76
-rw-r--r--spec/support/helpers/seed_helper.rb47
-rw-r--r--spec/support/helpers/stub_snowplow.rb21
-rw-r--r--spec/support/helpers/test_env.rb58
-rw-r--r--spec/support/helpers/usage_data_helpers.rb2
-rw-r--r--spec/support/matchers/background_migrations_matchers.rb7
-rw-r--r--spec/support/matchers/event_store.rb11
-rw-r--r--spec/support/matchers/match_file.rb2
-rw-r--r--spec/support/services/issuable_import_csv_service_shared_examples.rb4
-rw-r--r--spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb3
-rw-r--r--spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb7
-rw-r--r--spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/markdown_snapshot_shared_examples.rb4
-rw-r--r--spec/support/shared_contexts/navbar_structure_context.rb3
-rw-r--r--spec/support/shared_contexts/policies/group_policy_shared_context.rb1
-rw-r--r--spec/support/shared_contexts/policies/project_policy_shared_context.rb5
-rw-r--r--spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb37
-rw-r--r--spec/support/shared_examples/csp.rb76
-rw-r--r--spec/support/shared_examples/features/content_editor_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/discussion_comments_shared_example.rb2
-rw-r--r--spec/support/shared_examples/features/inviting_members_shared_examples.rb70
-rw-r--r--spec/support/shared_examples/features/multiple_assignees_mr_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/multiple_assignees_widget_mr_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/wiki/autocomplete_shared_examples.rb43
-rw-r--r--spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/finders/issues_finder_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/graphql/mutations/work_items/update_description_widget_shared_examples.rb34
-rw-r--r--spec/support/shared_examples/graphql/mutations/work_items/update_weight_widget_shared_examples.rb34
-rw-r--r--spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb12
-rw-r--r--spec/support/shared_examples/harbor/artifacts_controller_shared_examples.rb162
-rw-r--r--spec/support/shared_examples/harbor/container_shared_examples.rb9
-rw-r--r--spec/support/shared_examples/harbor/repositories_controller_shared_examples.rb172
-rw-r--r--spec/support/shared_examples/harbor/tags_controller_shared_examples.rb155
-rw-r--r--spec/support/shared_examples/integrations/integration_settings_form.rb5
-rw-r--r--spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb54
-rw-r--r--spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb42
-rw-r--r--spec/support/shared_examples/merge_request_author_auto_assign_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/models/chat_integration_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/models/clusters/elastic_stack_client_shared.rb82
-rw-r--r--spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/models/concerns/timebox_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/models/issuable_participants_shared_examples.rb53
-rw-r--r--spec/support/shared_examples/models/member_shared_examples.rb124
-rw-r--r--spec/support/shared_examples/models/mentionable_shared_examples.rb39
-rw-r--r--spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb7
-rw-r--r--spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb35
-rw-r--r--spec/support/shared_examples/requests/api/debian_common_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/requests/api/graphql/mutations/snippets_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/requests/api/hooks_shared_examples.rb415
-rw-r--r--spec/support/shared_examples/requests/api/notes_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb34
-rw-r--r--spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/services/alert_management/alert_processing/incident_resolution_shared_examples.rb40
-rw-r--r--spec/support/shared_examples/services/alert_management_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/services/feature_flags/client_shared_examples.rb19
-rw-r--r--spec/support/shared_examples/usage_data_counters/work_item_activity_unique_counter_shared_examples.rb41
-rw-r--r--spec/support/shared_examples/views/themed_layout_examples.rb35
-rw-r--r--spec/support/shared_examples/work_items/widgetable_service_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb37
-rw-r--r--spec/support/snowplow.rb16
-rw-r--r--spec/support/stub_snowplow.rb21
-rw-r--r--spec/support_specs/graphql/arguments_spec.rb3
-rw-r--r--spec/support_specs/helpers/graphql_helpers_spec.rb1
-rw-r--r--spec/tasks/dev_rake_spec.rb11
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb39
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb13
-rw-r--r--spec/tooling/danger/project_helper_spec.rb3
-rw-r--r--spec/views/admin/application_settings/general.html.haml_spec.rb31
-rw-r--r--spec/views/dashboard/projects/_blank_state_welcome.html.haml_spec.rb17
-rw-r--r--spec/views/devise/sessions/new.html.haml_spec.rb38
-rw-r--r--spec/views/errors/omniauth_error.html.haml_spec.rb22
-rw-r--r--spec/views/groups/edit.html.haml_spec.rb2
-rw-r--r--spec/views/groups/group_members/index.html.haml_spec.rb12
-rw-r--r--spec/views/layouts/_flash.html.haml_spec.rb14
-rw-r--r--spec/views/layouts/application.html.haml_spec.rb2
-rw-r--r--spec/views/layouts/devise.html.haml_spec.rb7
-rw-r--r--spec/views/layouts/devise_empty.html.haml_spec.rb7
-rw-r--r--spec/views/layouts/fullscreen.html.haml_spec.rb13
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb60
-rw-r--r--spec/views/layouts/signup_onboarding.html.haml_spec.rb7
-rw-r--r--spec/views/layouts/simple_registration.html.haml_spec.rb7
-rw-r--r--spec/views/layouts/terms.html.haml_spec.rb13
-rw-r--r--spec/views/projects/commits/_commit.html.haml_spec.rb2
-rw-r--r--spec/views/projects/issues/_issue.html.haml_spec.rb44
-rw-r--r--spec/views/projects/jobs/show.html.haml_spec.rb15
-rw-r--r--spec/views/projects/project_members/index.html.haml_spec.rb6
-rw-r--r--spec/views/projects/settings/operations/show.html.haml_spec.rb16
-rw-r--r--spec/views/projects/tracing/show.html.haml_spec.rb59
-rw-r--r--spec/views/shared/deploy_tokens/_form.html.haml_spec.rb2
-rw-r--r--spec/workers/build_finished_worker_spec.rb13
-rw-r--r--spec/workers/build_hooks_worker_spec.rb19
-rw-r--r--spec/workers/bulk_imports/pipeline_worker_spec.rb66
-rw-r--r--spec/workers/ci/archive_trace_worker_spec.rb17
-rw-r--r--spec/workers/ci/build_finished_worker_spec.rb13
-rw-r--r--spec/workers/ci/pipeline_artifacts/coverage_report_worker_spec.rb43
-rw-r--r--spec/workers/clusters/applications/activate_integration_worker_spec.rb9
-rw-r--r--spec/workers/clusters/applications/deactivate_integration_worker_spec.rb9
-rw-r--r--spec/workers/concerns/gitlab/github_import/object_importer_spec.rb22
-rw-r--r--spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb32
-rw-r--r--spec/workers/concerns/waitable_worker_spec.rb53
-rw-r--r--spec/workers/container_registry/migration/enqueuer_worker_spec.rb2
-rw-r--r--spec/workers/disallow_two_factor_for_group_worker_spec.rb2
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb8
-rw-r--r--spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb3
-rw-r--r--spec/workers/gitlab/github_import/import_issue_event_worker_spec.rb51
-rw-r--r--spec/workers/gitlab/github_import/import_issue_worker_spec.rb3
-rw-r--r--spec/workers/gitlab/github_import/import_note_worker_spec.rb3
-rw-r--r--spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb3
-rw-r--r--spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb48
-rw-r--r--spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb2
-rw-r--r--spec/workers/gitlab_service_ping_worker_spec.rb25
-rw-r--r--spec/workers/google_cloud/create_cloudsql_instance_worker_spec.rb50
-rw-r--r--spec/workers/incident_management/close_incident_worker_spec.rb65
-rw-r--r--spec/workers/integrations/execute_worker_spec.rb22
-rw-r--r--spec/workers/integrations/irker_worker_spec.rb6
-rw-r--r--spec/workers/loose_foreign_keys/cleanup_worker_spec.rb2
-rw-r--r--spec/workers/namespaces/onboarding_issue_created_worker_spec.rb2
-rw-r--r--spec/workers/packages/cleanup/execute_policy_worker_spec.rb160
-rw-r--r--spec/workers/packages/cleanup_package_file_worker_spec.rb5
-rw-r--r--spec/workers/packages/cleanup_package_registry_worker_spec.rb25
-rw-r--r--spec/workers/packages/debian/generate_distribution_worker_spec.rb6
-rw-r--r--spec/workers/packages/debian/process_changes_worker_spec.rb6
-rw-r--r--spec/workers/pages/invalidate_domain_cache_worker_spec.rb45
-rw-r--r--spec/workers/post_receive_spec.rb26
-rw-r--r--spec/workers/projects/after_import_worker_spec.rb13
-rw-r--r--spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb27
-rw-r--r--spec/workers/remove_expired_group_links_worker_spec.rb41
-rw-r--r--spec/workers/remove_expired_members_worker_spec.rb4
-rw-r--r--spec/workers/stage_update_worker_spec.rb2
-rw-r--r--spec/workers/web_hooks/destroy_worker_spec.rb64
-rwxr-xr-xtooling/bin/qa/check_if_qa_only_spec_changes22
-rw-r--r--tooling/config/CODEOWNERS.yml4
-rw-r--r--tooling/danger/project_helper.rb4
-rw-r--r--tooling/graphql/docs/renderer.rb2
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml26
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/Gemfile5
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/Gemfile.lock103
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/LICENSE201
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/devise-pbkdf2-encryptable.gemspec25
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/lib/devise-pbkdf2-encryptable.rb1
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptable.rb16
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/base.rb52
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/pbkdf2_sha512.rb41
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/model.rb77
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/encryptors/pbkdf2_sha512_spec.rb80
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/model_spec.rb127
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/spec/spec_helper.rb4
-rw-r--r--vendor/gems/error_tracking_open_api/.gitignore39
-rw-r--r--vendor/gems/error_tracking_open_api/.openapi-generator-ignore23
-rw-r--r--vendor/gems/error_tracking_open_api/.openapi-generator/FILES36
-rw-r--r--vendor/gems/error_tracking_open_api/.openapi-generator/VERSION1
-rw-r--r--vendor/gems/error_tracking_open_api/LICENSE7
-rw-r--r--vendor/gems/error_tracking_open_api/README.md103
-rw-r--r--vendor/gems/error_tracking_open_api/Rakefile10
-rw-r--r--vendor/gems/error_tracking_open_api/docs/Error.md36
-rw-r--r--vendor/gems/error_tracking_open_api/docs/ErrorEvent.md32
-rw-r--r--vendor/gems/error_tracking_open_api/docs/ErrorUpdatePayload.md20
-rw-r--r--vendor/gems/error_tracking_open_api/docs/ErrorsApi.md287
-rw-r--r--vendor/gems/error_tracking_open_api/docs/EventsApi.md206
-rw-r--r--vendor/gems/error_tracking_open_api/docs/ProjectsApi.md69
-rw-r--r--vendor/gems/error_tracking_open_api/error_tracking_open_api.gemspec38
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api.rb45
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb347
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb232
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb81
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb391
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb57
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb276
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb335
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb283
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb264
-rw-r--r--vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb15
-rw-r--r--vendor/gems/ipynbdiff/.gitignore2
-rw-r--r--vendor/gems/ipynbdiff/.gitlab-ci.yml32
-rw-r--r--vendor/gems/ipynbdiff/Gemfile5
-rw-r--r--vendor/gems/ipynbdiff/Gemfile.lock67
-rw-r--r--vendor/gems/ipynbdiff/LICENSE21
-rw-r--r--vendor/gems/ipynbdiff/README.md56
-rw-r--r--vendor/gems/ipynbdiff/ipynbdiff.gemspec34
-rw-r--r--vendor/gems/ipynbdiff/lib/diff.rb20
-rw-r--r--vendor/gems/ipynbdiff/lib/ipynbdiff.rb23
-rw-r--r--vendor/gems/ipynbdiff/lib/output_transformer.rb72
-rw-r--r--vendor/gems/ipynbdiff/lib/symbol_map.rb107
-rw-r--r--vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb26
-rw-r--r--vendor/gems/ipynbdiff/lib/transformed_notebook.rb20
-rw-r--r--vendor/gems/ipynbdiff/lib/transformer.rb112
-rw-r--r--vendor/gems/ipynbdiff/lib/version.rb5
-rw-r--r--vendor/gems/ipynbdiff/spec/benchmark.rb64
-rw-r--r--vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb126
-rw-r--r--vendor/gems/ipynbdiff/spec/symbol_map_spec.rb58
-rw-r--r--vendor/gems/ipynbdiff/spec/test_helper.rb23
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md7
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt7
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb16
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md16
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt16
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/error_output/input.ipynb32
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/from.ipynb197
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md10
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt10
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb45
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md11
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt11
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb74
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md10
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt10
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb34
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md9
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt9
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb25
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_cells/expected.md19
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt19
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb25
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md (renamed from app/assets/javascripts/pipeline_wizard/templates/.gitkeep)0
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt (renamed from tmp/run/.gitkeep)0
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb25
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md13
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt13
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb29
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code/expected.md7
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt7
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code/input.ipynb21
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb12
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb14
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb11
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_md/expected.md5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_md/input.ipynb21
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_raw/expected.md4
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt4
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb15
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md68
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt68
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected.md3
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt3
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb17
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md3
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt3
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb11
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md9
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt9
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb27
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/svg/expected.md17
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt17
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/svg/input.ipynb66
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md9
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt9
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/text_output/input.ipynb31
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md14
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt14
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt14
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb49
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/to.ipynb200
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt5
-rw-r--r--vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb27
-rw-r--r--vendor/gems/ipynbdiff/spec/transformer_spec.rb106
-rw-r--r--vendor/gems/omniauth-gitlab/.gitignore17
-rw-r--r--vendor/gems/omniauth-gitlab/.gitlab-ci.yml30
-rw-r--r--vendor/gems/omniauth-gitlab/Gemfile4
-rw-r--r--vendor/gems/omniauth-gitlab/Gemfile.lock73
-rw-r--r--vendor/gems/omniauth-gitlab/LICENSE.txt22
-rw-r--r--vendor/gems/omniauth-gitlab/README.md94
-rw-r--r--vendor/gems/omniauth-gitlab/Rakefile7
-rw-r--r--vendor/gems/omniauth-gitlab/lib/omniauth-gitlab.rb2
-rw-r--r--vendor/gems/omniauth-gitlab/lib/omniauth-gitlab/version.rb5
-rw-r--r--vendor/gems/omniauth-gitlab/lib/omniauth/strategies/gitlab.rb46
-rw-r--r--vendor/gems/omniauth-gitlab/omniauth-gitlab.gemspec25
-rw-r--r--vendor/gems/omniauth-gitlab/spec/omniauth/strategies/gitlab_spec.rb80
-rw-r--r--vendor/gems/omniauth-gitlab/spec/spec_helper.rb8
-rw-r--r--vendor/gems/omniauth_crowd/.gitlab-ci.yml30
-rw-r--r--vendor/gems/omniauth_crowd/Gemfile4
-rw-r--r--vendor/gems/omniauth_crowd/Gemfile.lock74
-rw-r--r--vendor/gems/omniauth_crowd/LICENSE.txt20
-rw-r--r--vendor/gems/omniauth_crowd/README.md52
-rw-r--r--vendor/gems/omniauth_crowd/Rakefile12
-rwxr-xr-xvendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd.rb97
-rw-r--r--vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/configuration.rb110
-rwxr-xr-xvendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/crowd_validator.rb186
-rw-r--r--vendor/gems/omniauth_crowd/lib/omniauth_crowd.rb1
-rw-r--r--vendor/gems/omniauth_crowd/lib/omniauth_crowd/version.rb5
-rw-r--r--vendor/gems/omniauth_crowd/omniauth_crowd.gemspec28
-rw-r--r--vendor/gems/omniauth_crowd/spec/fixtures/groups.xml8
-rw-r--r--vendor/gems/omniauth_crowd/spec/fixtures/session.xml8
-rw-r--r--vendor/gems/omniauth_crowd/spec/fixtures/success.xml11
-rwxr-xr-xvendor/gems/omniauth_crowd/spec/omniauth/strategies/crowd_spec.rb387
-rw-r--r--vendor/gems/omniauth_crowd/spec/spec_helper.rb14
-rw-r--r--vendor/project_templates/gatsby.tar.gzbin377283 -> 739260 bytes
-rw-r--r--vendor/project_templates/rails.tar.gzbin148742 -> 150831 bytes
-rw-r--r--workhorse/gitaly_integration_test.go2
-rw-r--r--workhorse/gitaly_test.go2
-rw-r--r--workhorse/go.mod51
-rw-r--r--workhorse/go.sum161
-rw-r--r--workhorse/internal/api/api.go8
-rw-r--r--workhorse/internal/api/api_test.go45
-rw-r--r--workhorse/internal/badgateway/embed/gitlab-logo-500.pngbin0 -> 6263 bytes
-rw-r--r--workhorse/internal/badgateway/roundtripper.go54
-rw-r--r--workhorse/internal/git/archive.go2
-rw-r--r--workhorse/internal/git/archive_test.go2
-rw-r--r--workhorse/internal/git/blob.go2
-rw-r--r--workhorse/internal/git/diff.go2
-rw-r--r--workhorse/internal/git/error.go4
-rw-r--r--workhorse/internal/git/error_test.go4
-rw-r--r--workhorse/internal/git/format-patch.go2
-rw-r--r--workhorse/internal/git/info-refs_test.go2
-rw-r--r--workhorse/internal/git/snapshot.go2
-rw-r--r--workhorse/internal/git/upload-pack_test.go4
-rw-r--r--workhorse/internal/gitaly/blob.go4
-rw-r--r--workhorse/internal/gitaly/diff.go4
-rw-r--r--workhorse/internal/gitaly/gitaly.go6
-rw-r--r--workhorse/internal/gitaly/namespace.go2
-rw-r--r--workhorse/internal/gitaly/repository.go4
-rw-r--r--workhorse/internal/gitaly/smarthttp.go6
-rw-r--r--workhorse/internal/gitaly/unmarshal_test.go2
-rw-r--r--workhorse/internal/log/logging.go8
-rw-r--r--workhorse/internal/log/logging_test.go11
-rw-r--r--workhorse/internal/lsif_transformer/parser/code_hover.go4
-rw-r--r--workhorse/internal/redis/keywatcher_test.go2
-rw-r--r--workhorse/internal/redis/redis_test.go2
-rw-r--r--workhorse/internal/testhelper/gitaly.go4
-rw-r--r--workhorse/internal/upload/artifacts_store_test.go19
-rw-r--r--workhorse/internal/upload/body_uploader_test.go12
-rw-r--r--workhorse/internal/upload/destination/destination_test.go12
-rw-r--r--workhorse/internal/upload/destination/multi_hash.go27
-rw-r--r--workhorse/internal/upload/destination/objectstore/object.go4
-rw-r--r--workhorse/internal/upload/destination/upload_opts.go6
-rw-r--r--workhorse/internal/upload/multipart_uploader.go22
-rw-r--r--workhorse/internal/upload/rewrite.go22
-rw-r--r--workhorse/internal/upload/uploads.go7
-rw-r--r--workhorse/internal/upload/uploads_test.go13
-rw-r--r--workhorse/internal/upstream/routes.go4
-rw-r--r--workhorse/internal/upstream/upstream.go40
-rw-r--r--workhorse/internal/upstream/upstream_test.go72
-rw-r--r--workhorse/main_test.go2
-rw-r--r--workhorse/upload_test.go63
-rw-r--r--yarn.lock793
5977 files changed, 279196 insertions, 124069 deletions
diff --git a/.browserslistrc b/.browserslistrc
index a608ac7c734..1bddd91cf0d 100644
--- a/.browserslistrc
+++ b/.browserslistrc
@@ -3,14 +3,13 @@
# https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers
# with the following reasoning:
#
-# - 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
+# - We should support the latest ESR of Firefox: 91, because it used quite a lot.
+# - We use Edge/Chrome >= 92 because they are about as old as the Firefox ESR
+# - Safari 14.1 because it is the current minor version of the previous major version
#
# See also this epic: https://gitlab.com/groups/gitlab-org/-/epics/3957
#
-chrome >= 84
-edge >= 84
-firefox >= 78
-safari >= 13.1
+chrome >= 92
+edge >= 92
+firefox >= 91
+safari >= 14.1 \ No newline at end of file
diff --git a/.dockerignore b/.dockerignore
index b2aef4d31cd..e145f368cb1 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,9 +1,9 @@
# `build_from_dir` can't find Dockerfile when `.dockerignore` is "*"
# See https://github.com/swipely/docker-api/issues/484
-# Ignore all folders except qa/, config/initializers and the root of lib/ since
-# the files we need to build the QA image are in these folders.
-# Following are the files we need:
+# Ignore all folders except the following files we need to build the QA image:
# - ./config/initializers/0_inject_enterprise_edition_module.rb
+# - ./config/feature_flags
+# - ./ee/config/feature_flags
# - ./ee/app/models/license.rb
# - ./lib/gitlab_edition.rb
# - ./lib/gitlab/utils.rb
@@ -28,7 +28,9 @@
/docker/
/ee/bin/
/ee/changelogs/
-/ee/config/
+/ee/config/events/
+/ee/config/metrics/
+/ee/config/routes/
/ee/db/
/ee/fixtures/
/ee/lib/
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 7505d864e6f..d268d73e6a6 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -53,6 +53,7 @@ rules:
- '^$'
- '^variables$'
- 'attrs?$'
+ '@gitlab/vue-prefer-dollar-scopedslots': error
no-param-reassign:
- error
- props: true
@@ -122,6 +123,8 @@ overrides:
rules:
'@gitlab/require-i18n-strings': off
'@gitlab/no-runtime-template-compiler': off
+ 'import/no-dynamic-require': off
+ 'no-import-assign': off
'no-restricted-syntax':
- error
- selector: CallExpression[callee.object.name=/(wrapper|vm)/][callee.property.name="setData"]
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9225f04ad79..0c06df88b3f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -36,15 +36,25 @@ workflow:
- if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^release-tools\/\d+\.\d+\.\d+-rc\d+$/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^[\d-]+-stable(-ee)?$/ && $CI_PROJECT_PATH == "gitlab-org/gitlab"'
when: never
# For merged result pipelines, set $QA_IMAGE, since $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is only available for merged result pipelines.
- - if: '$CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "merge_train"'
+ # AND
+ # For merge requests running exclusively in Ruby 3.0
+ - if: '($CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "merge_train") && $CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3/'
variables:
QA_IMAGE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA}"
- # Also run (detached) merge request pipelines.
+ RUBY_VERSION: "3.0"
+ # For merged result pipelines, set $QA_IMAGE, since $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is only available for merged result pipelines.
+ - if: '($CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "merge_train")'
+ variables:
+ QA_IMAGE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA}"
+ # For merge requests running exclusively in Ruby 3.0
+ - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3/'
+ variables:
+ RUBY_VERSION: "3.0"
+ # For (detached) merge request pipelines.
- if: '$CI_MERGE_REQUEST_IID'
- # For the 2-hourly scheduled pipelines, we set specific variables.
- - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
+ # For the maintenance scheduled pipelines, we set specific variables.
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "maintenance"'
variables:
- RUBY_VERSION: "2.7"
CRYSTALBALL: "true"
# For `$CI_DEFAULT_BRANCH` branch, create a pipeline (this includes on schedules, pushes, merges, etc.).
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
@@ -60,7 +70,7 @@ workflow:
variables:
PG_VERSION: "12"
- DEFAULT_CI_IMAGE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}.patched-golang-1.17-node-16.14-postgresql-${PG_VERSION}:git-2.36-lfs-2.9-chrome-${CHROME_VERSION}-yarn-1.22-graphicsmagick-1.3.36"
+ DEFAULT_CI_IMAGE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}.patched-golang-1.17-node-16.14-postgresql-${PG_VERSION}:rubygems-3.2-git-2.36-lfs-2.9-chrome-${CHROME_VERSION}-yarn-1.22-graphicsmagick-1.3.36"
RAILS_ENV: "test"
NODE_ENV: "test"
BUNDLE_WITHOUT: "production:development"
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 64955d67e34..777c5c54ea5 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -642,7 +642,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/admin_area/credentials_inventory.md @eread
/doc/user/admin_area/custom_project_templates.md @eread
/doc/user/admin_area/diff_limits.md @aqualls
-/doc/user/admin_area/geo_nodes.md @axil
+/doc/user/admin_area/geo_sites.md @axil
/doc/user/admin_area/labels.md @msedlakjakubowski
/doc/user/admin_area/license_file.md @sselhorn
/doc/user/admin_area/license.md @sselhorn
@@ -809,7 +809,6 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/app/assets/javascripts/authentication/ @gitlab-org/manage/authentication-and-authorization
/app/assets/javascripts/ide/components/shared/tokened_input.vue @gitlab-org/manage/authentication-and-authorization
/app/assets/javascripts/invite_members/components/members_token_select.vue @gitlab-org/manage/authentication-and-authorization
-/app/assets/javascripts/logs/components/tokens/ @gitlab-org/manage/authentication-and-authorization
/app/assets/javascripts/packages_and_registries/package_registry/components/list/tokens/ @gitlab-org/manage/authentication-and-authorization
/app/assets/javascripts/pages/admin/impersonation_tokens/ @gitlab-org/manage/authentication-and-authorization
/app/assets/javascripts/pages/groups/settings/access_tokens/ @gitlab-org/manage/authentication-and-authorization
@@ -929,16 +928,18 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/app/workers/authorized_projects_worker.rb @gitlab-org/manage/authentication-and-authorization
/app/workers/personal_access_tokens/ @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/application_settings_tokens_optional_encryption.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/async_only_project_authorizations_refresh.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/enforce_auth_checks_on_uploads.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/forti_authenticator.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/forti_token_cloud.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/groups_tokens_optional_encryption.yml @gitlab-org/manage/authentication-and-authorization
-/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/omniauth_login_minimal_scopes.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/personal_access_tokens_scoped_to_projects.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/projects_tokens_optional_encryption.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/refresh_authorizations_via_affected_projects_on_group_membership.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/skip_group_share_unlink_auth_refresh.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/specialized_worker_for_group_lock_update_auth_recalculation.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/update_oauth_registration_flow.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/development/webauthn.yml @gitlab-org/manage/authentication-and-authorization
/config/feature_flags/ops/block_password_auth_for_saml_users.yml @gitlab-org/manage/authentication-and-authorization
/config/initializers/01_secret_token.rb @gitlab-org/manage/authentication-and-authorization
@@ -975,6 +976,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/ee/app/helpers/ee/access_tokens_helper.rb @gitlab-org/manage/authentication-and-authorization
/ee/app/helpers/ee/auth_helper.rb @gitlab-org/manage/authentication-and-authorization
/ee/app/helpers/ee/personal_access_tokens_helper.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/models/concerns/password_complexity.rb @gitlab-org/manage/authentication-and-authorization
/ee/app/models/ee/personal_access_token.rb @gitlab-org/manage/authentication-and-authorization
/ee/app/models/ee/project_authorization.rb @gitlab-org/manage/authentication-and-authorization
/ee/app/models/scim_oauth_access_token.rb @gitlab-org/manage/authentication-and-authorization
@@ -984,6 +986,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/ee/app/services/ee/resource_access_tokens/ @gitlab-org/manage/authentication-and-authorization
/ee/app/services/personal_access_tokens/ @gitlab-org/manage/authentication-and-authorization
/ee/app/services/security/token_revocation_service.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/validators/password/ @gitlab-org/manage/authentication-and-authorization
/ee/app/views/admin/application_settings/_personal_access_token_expiration_policy.html.haml @gitlab-org/manage/authentication-and-authorization
/ee/app/views/credentials_inventory_mailer/personal_access_token_revoked_email.html.haml @gitlab-org/manage/authentication-and-authorization
/ee/app/views/credentials_inventory_mailer/personal_access_token_revoked_email.text.haml @gitlab-org/manage/authentication-and-authorization
@@ -996,6 +999,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/ee/app/views/shared/credentials_inventory/_project_access_tokens.html.haml @gitlab-org/manage/authentication-and-authorization
/ee/app/views/shared/credentials_inventory/personal_access_tokens/ @gitlab-org/manage/authentication-and-authorization
/ee/app/views/shared/credentials_inventory/project_access_tokens/ @gitlab-org/manage/authentication-and-authorization
+/ee/app/workers/auth/ @gitlab-org/manage/authentication-and-authorization
/ee/app/workers/personal_access_tokens/ @gitlab-org/manage/authentication-and-authorization
/ee/config/routes/oauth.rb @gitlab-org/manage/authentication-and-authorization
/ee/lib/ee/gitlab/auth/ @gitlab-org/manage/authentication-and-authorization
@@ -1012,6 +1016,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/lib/api/entities/impersonation_token.rb @gitlab-org/manage/authentication-and-authorization
/lib/api/entities/impersonation_token_with_token.rb @gitlab-org/manage/authentication-and-authorization
/lib/api/entities/personal_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/personal_access_token_with_details.rb @gitlab-org/manage/authentication-and-authorization
/lib/api/entities/personal_access_token_with_token.rb @gitlab-org/manage/authentication-and-authorization
/lib/api/entities/resource_access_token.rb @gitlab-org/manage/authentication-and-authorization
/lib/api/entities/resource_access_token_with_token.rb @gitlab-org/manage/authentication-and-authorization
diff --git a/.gitlab/ci/build-images.gitlab-ci.yml b/.gitlab/ci/build-images.gitlab-ci.yml
index 46d0bb2fb8f..3b360d66b7f 100644
--- a/.gitlab/ci/build-images.gitlab-ci.yml
+++ b/.gitlab/ci/build-images.gitlab-ci.yml
@@ -1,16 +1,9 @@
.base-image-build:
extends: .use-kaniko
+ variables:
+ GIT_LFS_SKIP_SMUDGE: 1
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.";
+ - scripts/checkout-mr-source-sha
retry: 2
# This image is used by:
@@ -37,6 +30,7 @@ build-qa-image:
--destination=${QA_IMAGE_BRANCH} \
--build-arg=CHROME_VERSION=${CHROME_VERSION} \
--build-arg=DOCKER_VERSION=${DOCKER_VERSION} \
+ --build-arg=QA_BUILD_TARGET=${QA_BUILD_TARGET:-qa} \
--cache=true
# This image is used by:
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index 8bfda0e6684..8c49d5c212a 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -11,7 +11,7 @@
- .default-retry
- .default-before_script
- .assets-compile-cache
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}-git-2.33-lfs-2.9-node-16.14-yarn-1.22-graphicsmagick-1.3.36
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}-node-16.14:rubygems-3.2-git-2.33-lfs-2.9-yarn-1.22-graphicsmagick-1.3.36
variables:
SETUP_DB: "false"
WEBPACK_VENDOR_DLL: "true"
@@ -43,13 +43,7 @@ compile-production-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.";
+ - scripts/checkout-mr-source-sha
- !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
@@ -186,6 +180,12 @@ graphql-schema-dump:
- tmp/tests/graphql/gitlab_schema.graphql
- tmp/tests/graphql/gitlab_schema.json
+graphql-schema-dump as-if-foss:
+ extends:
+ - graphql-schema-dump
+ - .frontend:rules:eslint-as-if-foss
+ - .as-if-foss
+
.frontend-test-base:
extends:
- .default-retry
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 344a31b28d8..9c92b11d4fd 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -79,7 +79,7 @@
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.assets-cache: &assets-cache
- key: "assets-debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}-node-${NODE_ENV}"
+ key: "assets-debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}-node-${NODE_ENV}-v2"
paths:
- assets-hash.txt
- public/assets/webpack/
@@ -179,11 +179,19 @@
- *ruby-gems-cache
- *node-modules-cache
+.qa-bundler-variables: &qa-bundler-variables
+ variables:
+ BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES: "true"
+ BUNDLE_SILENCE_ROOT_WARNING: "true"
+ BUNDLE_PATH: vendor
+
.qa-cache:
+ <<: *qa-bundler-variables
cache:
- *qa-ruby-gems-cache
.qa-cache-push:
+ <<: *qa-bundler-variables
cache:
- *qa-ruby-gems-cache-push
diff --git a/.gitlab/ci/pages.gitlab-ci.yml b/.gitlab/ci/pages.gitlab-ci.yml
index 6f96d84b8e3..1f9f57cfc22 100644
--- a/.gitlab/ci/pages.gitlab-ci.yml
+++ b/.gitlab/ci/pages.gitlab-ci.yml
@@ -15,7 +15,7 @@ pages:
- job: "compile-production-assets"
- job: "compile-storybook"
# `update-tests-metadata` only runs on GitLab.com's EE schedules pipelines
- # while `pages` runs for all the 2-hourly schedules.
+ # while `pages` runs for all the maintenance scheduled pipelines.
- job: "update-tests-metadata"
optional: true
before_script:
diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml
index 5ca70da352a..12275260c0c 100644
--- a/.gitlab/ci/qa.gitlab-ci.yml
+++ b/.gitlab/ci/qa.gitlab-ci.yml
@@ -11,8 +11,7 @@
QA_EXPORT_TEST_METRICS: "false"
before_script:
- !reference [.default-before_script, before_script]
- - cd qa/
- - bundle install
+ - cd qa && bundle install
qa:internal:
extends:
@@ -73,8 +72,7 @@ populate-qa-tests-var:
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
stage: prepare
script:
- - tooling/bin/qa/check_if_qa_only_spec_changes ${CHANGES_FILE} ${ONLY_QA_CHANGES_FILE}
- - '[ -f $ONLY_QA_CHANGES_FILE ] && export QA_TESTS="`cat $ONLY_QA_CHANGES_FILE`"'
+ - export QA_TESTS=$(scripts/determine-qa-tests --files $CHANGES_FILE --labels "$CI_MERGE_REQUEST_LABELS")
- 'echo "QA_TESTS=$QA_TESTS" >> qa_tests_var.env'
- 'echo "QA_TESTS: $QA_TESTS"'
artifacts:
@@ -83,11 +81,9 @@ populate-qa-tests-var:
dotenv: qa_tests_var.env
paths:
- ${CHANGES_FILE}
- - ${ONLY_QA_CHANGES_FILE}
- qa_tests_var.env
variables:
CHANGES_FILE: tmp/changed_files.txt
- ONLY_QA_CHANGES_FILE: tmp/qa_only_changed_files.txt
needs:
- detect-tests
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 0358fe8ec49..6fa9d14d47b 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -201,8 +201,9 @@ setup-test-env:
- ${TMP_TEST_FOLDER}/gitlab-elasticsearch-indexer/bin/gitlab-elasticsearch-indexer
- ${TMP_TEST_FOLDER}/gitlab-shell/
- ${TMP_TEST_FOLDER}/gitlab-test-fork/
- - ${TMP_TEST_FOLDER}/gitlab-test-fork_bare/
+ - ${TMP_TEST_FOLDER}/gitlab-test-fork.bundle
- ${TMP_TEST_FOLDER}/gitlab-test/
+ - ${TMP_TEST_FOLDER}/gitlab-test.bundle
- ${TMP_TEST_FOLDER}/repositories/
- ${TMP_TEST_FOLDER}/second_storage/
- ${TMP_TEST_GITLAB_WORKHORSE_PATH}/
@@ -609,17 +610,16 @@ rspec:undercoverage:
stage: post-test
needs: ["rspec:coverage"]
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 we can use $CI_MERGE_REQUEST_DIFF_BASE_SHA for undercoverage in this merged result pipeline";
- git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
- bundle_install_script;
+ - if [ -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" ]; then
+ echo "HEAD is $(git rev-parse HEAD). \$CI_MERGE_REQUEST_TARGET_BRANCH_SHA is ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA}";
else
- echo "Using \$CI_COMMIT_SHA ($CI_COMMIT_SHA) for this non-merge result pipeline.";
+ echo "HEAD is $(git rev-parse HEAD). \$CI_MERGE_REQUEST_DIFF_BASE_SHA is ${CI_MERGE_REQUEST_DIFF_BASE_SHA}";
fi;
- - UNDERCOVERAGE_COMPARE="${CI_MERGE_REQUEST_DIFF_BASE_SHA:-$(git merge-base origin/master HEAD)}"
- - echo "Undercoverage comparing with ${UNDERCOVERAGE_COMPARE}"
+ - UNDERCOVERAGE_COMPARE="${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-$CI_MERGE_REQUEST_DIFF_BASE_SHA}"
+ - git diff ${UNDERCOVERAGE_COMPARE} --stat
+ - echo "Undercoverage comparing with ${UNDERCOVERAGE_COMPARE}."
- if [ -f scripts/undercoverage ]; then
- run_timed_command "scripts/undercoverage ${UNDERCOVERAGE_COMPARE}";
+ run_timed_command "bundle exec scripts/undercoverage ${UNDERCOVERAGE_COMPARE}";
fi;
rspec:feature-flags:
diff --git a/.gitlab/ci/review-apps/main.gitlab-ci.yml b/.gitlab/ci/review-apps/main.gitlab-ci.yml
index f3cde5d7318..7f3ae70da8c 100644
--- a/.gitlab/ci/review-apps/main.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/main.gitlab-ci.yml
@@ -20,7 +20,7 @@ review-build-cng-env:
extends:
- .default-retry
- .review:rules:review-build-cng
- image: ${GITLAB_DEPENDENCY_PROXY}ruby:${RUBY_VERSION}-alpine3.13
+ image: ${GITLAB_DEPENDENCY_PROXY}ruby:3.0-alpine3.13
stage: prepare
needs: []
before_script:
@@ -77,9 +77,9 @@ review-build-cng:
variables:
HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}"
DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}"
- GITLAB_HELM_CHART_REF: "a6a609a19166f00b1a7774374041cd38a9f7e20d"
+ GITLAB_HELM_CHART_REF: "138c146a5ba787942f66d4c7d795d224d6ba206a"
environment:
- name: review/${CI_COMMIT_REF_SLUG}${FREQUENCY}
+ name: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # No separator for SCHEDULE_TYPE so it's compatible as before and looks nice without it
url: https://gitlab-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}
on_stop: review-stop
auto_stop_in: 48 hours
diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
index 07ad5a31135..8c48e803ad3 100644
--- a/.gitlab/ci/review-apps/qa.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
@@ -5,13 +5,7 @@ include:
- /ci/allure-report.yml
- /ci/knapsack-report.yml
-.bundler_variables:
- variables:
- BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES: "true"
- BUNDLE_SILENCE_ROOT_WARNING: "true"
- BUNDLE_PATH: vendor
-
-.test_variables:
+.test-variables:
variables:
QA_GENERATE_ALLURE_REPORT: "true"
COLORIZED_LOGS: "true"
@@ -22,13 +16,20 @@ include:
GITLAB_QA_ADMIN_ACCESS_TOKEN: "${REVIEW_APPS_ROOT_TOKEN}"
GITHUB_ACCESS_TOKEN: "${REVIEW_APPS_QA_GITHUB_ACCESS_TOKEN}"
+.bundle-base:
+ extends:
+ - .qa-cache
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-${RUBY_VERSION}:bundler-2.3
+ before_script:
+ - export QA_GITLAB_URL="$(cat environment_url.txt)"
+ - cd qa && bundle install
+
.review-qa-base:
extends:
- .use-docker-in-docker
- - .qa-cache
- - .test_variables
- - .bundler_variables
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23
+ - .bundle-base
+ - .test-variables
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-${RUBY_VERSION}:bundler-2.3-git-2.33-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23
stage: qa
needs:
- review-deploy
@@ -38,11 +39,13 @@ include:
DOCKER_TLS_CERTDIR: /certs
DOCKER_CERT_PATH: /certs/client
DOCKER_TLS_VERIFY: 1
+ GIT_LFS_SKIP_SMUDGE: 1
+ WD_INSTALL_DIR: /usr/local/bin
before_script:
- - export EE_LICENSE="$(cat $REVIEW_APPS_EE_LICENSE_FILE)"
- - export QA_GITLAB_URL="$(cat environment_url.txt)"
- - cd qa && bundle install
+ - scripts/checkout-mr-source-sha
+ - !reference [.bundle-base, before_script]
script:
+ - export EE_LICENSE="$(cat $REVIEW_APPS_EE_LICENSE_FILE)"
- qa_run_status=0
- |
bundle exec rake "knapsack:rspec[\
@@ -52,7 +55,6 @@ include:
--tag ~skip_signup_disabled \
--tag ~requires_git_protocol_v2 \
--tag ~requires_praefect \
- --tag ~sanity_feature_flags \
--force-color \
--order random \
--format documentation \
@@ -82,16 +84,12 @@ include:
# Store knapsack report as artifact so the same report is reused across all jobs
download-knapsack-report:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-chrome-${CHROME_VERSION}
extends:
- - .qa-cache
- - .bundler_variables
+ - .bundle-base
- .review:rules:review-qa-reliable
stage: prepare
variables:
QA_KNAPSACK_REPORTS: review-qa-reliable,review-qa-all
- before_script:
- - cd qa && bundle install
script:
- bundle exec rake "knapsack:download"
allow_failure: true
@@ -100,29 +98,6 @@ download-knapsack-report:
- qa/knapsack/review-qa-*.json
expire_in: 1 day
-review-qa-sanity:
- extends:
- - .review-qa-base
- - .review:rules:review-qa-sanity
- retry: 1
- variables:
- QA_RUN_TYPE: review-qa-sanity
- script:
- - qa_run_status=0
- - |
- bundle exec rake "knapsack:rspec[\
- --tag sanity_feature_flags \
- --force-color \
- --order random \
- --format documentation \
- --format RspecJunitFormatter --out tmp/rspec.xml \
- ]" || qa_run_status=$?
- - if [ ${qa_run_status} -ne 0 ]; then
- release_sha=$(echo "${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA:-${CI_COMMIT_SHA}}" | cut -c1-11);
- echo "Errors can be found at https://sentry.gitlab.net/gitlab/gitlab-review-apps/releases/${release_sha}/all-events/.";
- fi
- - exit ${qa_run_status}
-
review-qa-smoke:
extends:
- .review-qa-base
@@ -140,7 +115,7 @@ review-qa-reliable:
parallel: 10
variables:
QA_RUN_TYPE: review-qa-reliable
- RSPEC_TAGS: --tag reliable
+ RSPEC_TAGS: --tag reliable --tag sanity_feature_flags
review-qa-all:
extends:
@@ -149,7 +124,7 @@ review-qa-all:
parallel: 5
variables:
QA_RUN_TYPE: review-qa-all
- RSPEC_TAGS: --tag ~reliable --tag ~smoke
+ RSPEC_TAGS: --tag ~reliable --tag ~smoke --tag ~sanity_feature_flags
review-performance:
extends:
@@ -202,8 +177,21 @@ allure-report-qa-all:
upload-knapsack-report:
extends:
- .generate-knapsack-report-base
+ - .bundle-base
stage: post-qa
variables:
- # knapsack report upload uses gitlab-qa image with code already there
- GIT_STRATEGY: none
QA_KNAPSACK_REPORT_FILE_PATTERN: $CI_PROJECT_DIR/qa/tmp/knapsack/*/*.json
+
+delete-test-resources:
+ extends:
+ - .bundle-base
+ - .review:rules:review-qa-cleanup
+ stage: post-qa
+ variables:
+ QA_TEST_RESOURCES_FILE_PATTERN: $CI_PROJECT_DIR/qa/tmp/test-resources-*.json
+ GITLAB_QA_ACCESS_TOKEN: $REVIEW_APPS_ROOT_TOKEN
+ COLORIZED_LOGS: "true"
+ script:
+ - export GITLAB_ADDRESS="$QA_GITLAB_URL"
+ - bundle exec rake "test_resources:delete[$QA_TEST_RESOURCES_FILE_PATTERN]"
+ allow_failure: true
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index 26c7306c880..b2cd9d61fd8 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -5,10 +5,10 @@ review-cleanup:
extends:
- .default-retry
- .review:rules:review-cleanup
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:gitlab-helm3.5-kubectl1.17
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/ruby-3.0:gcloud-383-kubectl-1.23-helm-3.5
stage: prepare
environment:
- name: review/${CI_COMMIT_REF_SLUG}${FREQUENCY}
+ name: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # No separator for SCHEDULE_TYPE so it's compatible as before and looks nice without it
action: stop
before_script:
- source scripts/utils.sh
@@ -33,7 +33,7 @@ start-review-app-pipeline:
# They need to be explicitly passed on to the child pipeline.
# https://docs.gitlab.com/ee/ci/pipelines/multi_project_pipelines.html#pass-cicd-variables-to-a-downstream-pipeline-by-using-the-variables-keyword
variables:
- FREQUENCY: $FREQUENCY
+ SCHEDULE_TYPE: $SCHEDULE_TYPE
DAST_RUN: $DAST_RUN
trigger:
include:
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index ccdc2c1b90a..93790f431dd 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -49,6 +49,9 @@
.if-merge-request-targeting-stable-branch: &if-merge-request-targeting-stable-branch
if: '$CI_MERGE_REQUEST_IID && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^[\d-]+-stable(-ee)?$/'
+.if-merge-request-labels-run-in-ruby3: &if-merge-request-labels-run-in-ruby3
+ if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3/'
+
.if-merge-request-labels-as-if-foss: &if-merge-request-labels-as-if-foss
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-as-if-foss/'
@@ -91,11 +94,11 @@
.if-fork-merge-request: &if-fork-merge-request
if: '$CI_PROJECT_NAMESPACE !~ /^gitlab(-org)?($|\/)/ && $CI_MERGE_REQUEST_IID && $CI_MERGE_REQUEST_LABELS !~ /pipeline:run-all-rspec/'
-.if-default-branch-schedule-2-hourly: &if-default-branch-schedule-2-hourly
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
+.if-default-branch-schedule-maintenance: &if-default-branch-schedule-maintenance
+ if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "maintenance"'
.if-default-branch-schedule-nightly: &if-default-branch-schedule-nightly
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
+ if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "nightly"'
.if-security-schedule: &if-security-schedule
if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security" && $CI_PIPELINE_SOURCE == "schedule"'
@@ -106,17 +109,14 @@
.if-dot-com-ee-schedule: &if-dot-com-ee-schedule
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule"'
-.if-dot-com-ee-schedule-child-pipeline: &if-dot-com-ee-schedule-child-pipeline
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "parent_pipeline" && $FREQUENCY'
-
-.if-dot-com-ee-2-hourly-schedule: &if-dot-com-ee-2-hourly-schedule
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
+.if-dot-com-ee-schedule-maintenance: &if-dot-com-ee-schedule-maintenance
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "maintenance"'
-.if-dot-com-ee-nightly-schedule: &if-dot-com-ee-nightly-schedule
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
+.if-dot-com-ee-schedule-nightly: &if-dot-com-ee-schedule-nightly
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "nightly"'
-.if-dot-com-ee-nightly-schedule-child-pipeline: &if-dot-com-ee-nightly-schedule-child-pipeline
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "parent_pipeline" && $FREQUENCY == "nightly"'
+.if-dot-com-ee-schedule-nightly-child-pipeline: &if-dot-com-ee-schedule-nightly-child-pipeline
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "parent_pipeline" && $SCHEDULE_TYPE == "nightly"'
.if-dot-com-gitlab-org-default-branch: &if-dot-com-gitlab-org-default-branch
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
@@ -127,6 +127,9 @@
.if-dot-com-gitlab-org-and-security-merge-request: &if-dot-com-gitlab-org-and-security-merge-request
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_MERGE_REQUEST_IID'
+.if-dot-com-gitlab-org-and-security-merge-request-and-qa-tests-specified: &if-dot-com-gitlab-org-and-security-merge-request-and-qa-tests-specified
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_MERGE_REQUEST_IID && $QA_TESTS'
+
.if-dot-com-gitlab-org-and-security-merge-request-manual-ff-package-and-qa: &if-dot-com-gitlab-org-and-security-merge-request-manual-ff-package-and-qa
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_MERGE_REQUEST_IID && $QA_MANUAL_FF_PACKAGE_AND_QA'
@@ -325,7 +328,6 @@
- "danger/**/*"
- "{,ee/,jh/}fixtures/**/*"
- "{,ee/,jh/}rubocop/**/*"
- - ".rubocop_todo/**/*.yml"
- "{,ee/,jh/}spec/**/*"
- "{,spec/}tooling/**/*"
@@ -343,8 +345,7 @@
- "Dockerfile.assets"
- "vendor/assets/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo}.yml"
- - ".rubocop_todo/**/*.yml"
+ - ".gitlab-ci.yml"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
@@ -368,8 +369,7 @@
- "Dockerfile.assets"
- "vendor/assets/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo}.yml"
- - ".rubocop_todo/**/*.yml"
+ - ".gitlab-ci.yml"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
@@ -400,8 +400,7 @@
- "Dockerfile.assets"
- "vendor/assets/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo}.yml"
- - ".rubocop_todo/**/*.yml"
+ - ".gitlab-ci.yml"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
@@ -428,8 +427,7 @@
- "Dockerfile.assets"
- "vendor/assets/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo}.yml"
- - ".rubocop_todo/**/*.yml"
+ - ".gitlab-ci.yml"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
@@ -463,8 +461,7 @@
- "Dockerfile.assets"
- "vendor/assets/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo}.yml"
- - ".rubocop_todo/**/*.yml"
+ - ".gitlab-ci.yml"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
@@ -494,6 +491,12 @@
- "scripts/lint_templates_bash.rb"
- "lib/gitlab/ci/templates/**/*.gitlab-ci.yml"
+.static-analysis-patterns: &static-analysis-patterns
+ - ".{codeclimate,eslintrc,haml-lint,haml-lint_todo}.yml"
+ - ".rubocop.yml"
+ - ".rubocop_todo.yml"
+ - ".rubocop_todo/**/*.yml"
+
.danger-patterns: &danger-patterns
- "Dangerfile"
- "danger/**/*"
@@ -622,7 +625,7 @@
################
.shared:rules:update-cache:
rules:
- - <<: *if-default-branch-schedule-2-hourly
+ - <<: *if-default-branch-schedule-maintenance
- <<: *if-security-schedule
- <<: *if-merge-request-labels-update-caches
@@ -828,9 +831,7 @@
.frontend:rules:eslint-as-if-foss:
rules:
- !reference [".strict-ee-only-rules", rules]
- # We already have `static-analysis as-if-foss` which already runs `lint:eslint:all` if the `pipeline:run-as-if-foss` label is set.
- <<: *if-merge-request-labels-as-if-foss
- when: never
- <<: *if-merge-request
changes: *frontend-patterns
@@ -881,7 +882,7 @@
###############
.pages:rules:
rules:
- - <<: *if-dot-com-ee-2-hourly-schedule
+ - <<: *if-dot-com-ee-schedule-maintenance
############
# QA rules #
@@ -943,6 +944,9 @@
- <<: *if-dot-com-gitlab-org-and-security-merge-request
changes: *qa-patterns
allow_failure: true
+ - <<: *if-dot-com-gitlab-org-and-security-merge-request-and-qa-tests-specified
+ changes: *code-patterns
+ allow_failure: true
- <<: *if-dot-com-gitlab-org-and-security-merge-request
changes: *code-patterns
when: manual
@@ -1378,7 +1382,7 @@
- <<: *if-merge-request
changes: *code-backstage-patterns
when: always
- - <<: *if-default-branch-schedule-2-hourly
+ - <<: *if-default-branch-schedule-maintenance
- <<: *if-merge-request-labels-run-all-rspec
when: always
@@ -1434,16 +1438,19 @@
.static-analysis:rules:ee-and-foss:
rules:
- changes: *code-backstage-qa-patterns
+ - changes: *static-analysis-patterns
.static-analysis:rules:ee-and-foss-qa:
rules:
- changes: *qa-patterns
+ - changes: *static-analysis-patterns
.static-analysis:rules:ee:
rules:
- <<: *if-not-ee
when: never
- changes: *code-backstage-qa-patterns
+ - changes: *static-analysis-patterns
.static-analysis:rules:as-if-foss:
rules:
@@ -1455,6 +1462,8 @@
changes: *code-backstage-qa-patterns
- <<: *if-merge-request
changes: *ci-patterns
+ - <<: *if-merge-request
+ changes: *static-analysis-patterns
#######################
# Vendored gems rules #
@@ -1466,6 +1475,31 @@
changes: ["vendor/gems/mail-smtp_pool/**/*"]
- <<: *if-merge-request-labels-run-all-rspec
+.vendor:rules:ipynbdiff:
+ rules:
+ - <<: *if-merge-request
+ changes: ["vendor/gems/ipynbdiff/**/*"]
+ - <<: *if-merge-request-labels-run-all-rspec
+
+.vendor:rules:omniauth_crowd:
+ rules:
+ - <<: *if-merge-request
+ changes: ["vendor/gems/omniauth_crowd/**/*"]
+ - <<: *if-merge-request-labels-run-all-rspec
+
+
+.vendor:rules:omniauth-gitlab:
+ rules:
+ - <<: *if-merge-request
+ changes: ["vendor/gems/omniauth-gitlab/**/*"]
+ - <<: *if-merge-request-labels-run-all-rspec
+
+.vendor:rules:devise-pbkdf2-encryptable:
+ rules:
+ - <<: *if-merge-request
+ changes: ["vendor/gems/devise-pbkdf2-encryptable/**/*"]
+ - <<: *if-merge-request-labels-run-all-rspec
+
##################
# Releases rules #
##################
@@ -1524,6 +1558,7 @@
- '**/*.tsx'
- '**/*.c'
- '**/*.go'
+ - '**/*.rb'
.reports:rules:secret_detection:
rules:
@@ -1561,13 +1596,13 @@
rules:
- if: '$DAST_DISABLED || $GITLAB_FEATURES !~ /\bdast\b/'
when: never
- - <<: *if-dot-com-ee-nightly-schedule-child-pipeline
+ - <<: *if-dot-com-ee-schedule-nightly-child-pipeline
.reports:rules:package_hunter-yarn:
rules:
- if: "$PACKAGE_HUNTER_USER == null || $PACKAGE_HUNTER_USER == ''"
when: never
- - <<: *if-default-branch-schedule-2-hourly
+ - <<: *if-default-branch-schedule-maintenance
- <<: *if-merge-request
changes: ["yarn.lock"]
@@ -1575,7 +1610,7 @@
rules:
- if: "$PACKAGE_HUNTER_USER == null || $PACKAGE_HUNTER_USER == ''"
when: never
- - <<: *if-default-branch-schedule-2-hourly
+ - <<: *if-default-branch-schedule-maintenance
- <<: *if-merge-request
changes: ["Gemfile.lock"]
@@ -1612,6 +1647,7 @@
when: manual
allow_failure: true
- <<: *if-dot-com-gitlab-org-schedule
+ allow_failure: true
variables:
KNAPSACK_GENERATE_REPORT: "true"
@@ -1637,10 +1673,6 @@
rules:
- when: on_success
-.review:rules:review-qa-sanity:
- rules:
- - when: on_success
-
.review:rules:review-qa-smoke:
rules:
- when: on_success
@@ -1680,10 +1712,17 @@
- when: on_success
- when: on_failure
+.review:rules:review-qa-cleanup:
+ rules:
+ - when: always
+
.review:rules:review-cleanup:
rules:
- <<: *if-not-ee
when: never
+ - <<: *if-dot-com-gitlab-org-merge-request
+ when: manual
+ allow_failure: true
- <<: *if-dot-com-gitlab-org-schedule
allow_failure: true
@@ -1747,6 +1786,10 @@
- <<: *if-default-refs
changes: *code-backstage-patterns
+.setup:rules:verify-ruby-2.7:
+ rules:
+ - <<: *if-merge-request-labels-run-in-ruby3
+
.setup:rules:verify-tests-yml:
rules:
- <<: *if-not-ee
@@ -1760,12 +1803,11 @@
when: never
- <<: *if-merge-request-labels-jh-contribution
-
.setup:rules:generate-frontend-fixtures-mapping:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-dot-com-ee-2-hourly-schedule
+ - <<: *if-dot-com-ee-schedule-maintenance
- changes:
- ".gitlab/ci/setup.gitlab-ci.yml"
- ".gitlab/ci/test-metadata.gitlab-ci.yml"
@@ -1797,7 +1839,7 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-dot-com-ee-2-hourly-schedule
+ - <<: *if-dot-com-ee-schedule-maintenance
- changes:
- ".gitlab/ci/test-metadata.gitlab-ci.yml"
- "scripts/rspec_helpers.sh"
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index 505caeec837..2da397aaab8 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -23,13 +23,19 @@ cache gems:
- .default-retry
needs: []
-dont-interrupt-me:
- extends: .setup:rules:dont-interrupt-me
- stage: sync
+.absolutely-minimal-job:
+ extends:
+ - .minimal-job
image: ${GITLAB_DEPENDENCY_PROXY}alpine:edge
- interruptible: false
variables:
GIT_STRATEGY: none
+
+dont-interrupt-me:
+ extends:
+ - .absolutely-minimal-job
+ - .setup:rules:dont-interrupt-me
+ stage: sync
+ interruptible: false
script:
- echo "This jobs makes sure this pipeline won't be interrupted! See https://docs.gitlab.com/ee/ci/yaml/#interruptible."
@@ -57,6 +63,15 @@ no-jh-check:
script:
- scripts/no-dir-check jh
+verify-ruby-2.7:
+ extends:
+ - .absolutely-minimal-job
+ - .setup:rules:verify-ruby-2.7
+ stage: prepare
+ script:
+ - echo 'Please remove label ~"pipeline:run-in-ruby3" so we do test against Ruby 2.7 (default version) before merging the merge request'
+ - exit 1
+
verify-tests-yml:
extends:
- .setup:rules:verify-tests-yml
@@ -70,8 +85,8 @@ verify-tests-yml:
verify-approvals:
extends:
+ - .minimal-job
- .setup:rules:jh-contribution
- needs: []
script:
- source scripts/utils.sh
- install_gitlab_gem
diff --git a/.gitlab/ci/static-analysis.gitlab-ci.yml b/.gitlab/ci/static-analysis.gitlab-ci.yml
index e1257e778bd..b4efd9e49bf 100644
--- a/.gitlab/ci/static-analysis.gitlab-ci.yml
+++ b/.gitlab/ci/static-analysis.gitlab-ci.yml
@@ -7,7 +7,6 @@
variables:
SETUP_DB: "false"
ENABLE_SPRING: "1"
- SKIP_LOG_INITIALIZER_CONNECTIONS: "1"
# Disable warnings in browserslist which can break on backports
# https://github.com/browserslist/browserslist/blob/a287ec6/node.js#L367-L384
BROWSERSLIST_IGNORE_OLD_DATA: "true"
@@ -49,7 +48,7 @@ static-verification-with-database:
variables:
SETUP_DB: "true"
-generate-apollo-graphl-schema:
+generate-apollo-graphql-schema:
extends:
- .static-analysis-base
- .frontend:rules:default-frontend-jobs
@@ -66,12 +65,19 @@ generate-apollo-graphl-schema:
paths:
- "${GRAPHQL_SCHEMA_APOLLO_FILE}"
+generate-apollo-graphql-schema as-if-foss:
+ extends:
+ - generate-apollo-graphql-schema
+ - .frontend:rules:eslint-as-if-foss
+ - .as-if-foss
+ needs: ['graphql-schema-dump as-if-foss']
+
eslint:
extends:
- .static-analysis-base
- .yarn-cache
- .frontend:rules:default-frontend-jobs
- needs: ['generate-apollo-graphl-schema']
+ needs: ['generate-apollo-graphql-schema']
variables:
USE_BUNDLE_INSTALL: "false"
script:
@@ -83,6 +89,7 @@ eslint as-if-foss:
- eslint
- .frontend:rules:eslint-as-if-foss
- .as-if-foss
+ needs: ['generate-apollo-graphql-schema as-if-foss']
haml-lint foss:
extends:
diff --git a/.gitlab/ci/vendored-gems.gitlab-ci.yml b/.gitlab/ci/vendored-gems.gitlab-ci.yml
index a39c4307c13..8596d770a87 100644
--- a/.gitlab/ci/vendored-gems.gitlab-ci.yml
+++ b/.gitlab/ci/vendored-gems.gitlab-ci.yml
@@ -5,3 +5,35 @@ vendor mail-smtp_pool:
trigger:
include: vendor/gems/mail-smtp_pool/.gitlab-ci.yml
strategy: depend
+
+vendor ipynbdiff:
+ extends:
+ - .vendor:rules:ipynbdiff
+ needs: []
+ trigger:
+ include: vendor/gems/ipynbdiff/.gitlab-ci.yml
+ strategy: depend
+
+vendor omniauth_crowd:
+ extends:
+ - .vendor:rules:omniauth_crowd
+ needs: []
+ trigger:
+ include: vendor/gems/omniauth_crowd/.gitlab-ci.yml
+ strategy: depend
+
+vendor omniauth-gitlab:
+ extends:
+ - .vendor:rules:omniauth-gitlab
+ needs: []
+ trigger:
+ include: vendor/gems/omniauth-gitlab/.gitlab-ci.yml
+ strategy: depend
+
+vendor devise-pbkdf2-encryptable:
+ extends:
+ - .vendor:rules:devise-pbkdf2-encryptable
+ needs: []
+ trigger:
+ include: vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml
+ strategy: depend
diff --git a/.gitlab/ci/workhorse.gitlab-ci.yml b/.gitlab/ci/workhorse.gitlab-ci.yml
index 6db3582bdab..ade2f65441f 100644
--- a/.gitlab/ci/workhorse.gitlab-ci.yml
+++ b/.gitlab/ci/workhorse.gitlab-ci.yml
@@ -23,3 +23,9 @@ workhorse:verify:
workhorse:test using go 1.17:
extends: .workhorse:test
image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}-golang-1.17-git-2.31
+
+workhorse:test using go 1.17 with FIPS:
+ extends: .workhorse:test
+ variables:
+ WORKHORSE_TEST_FIPS_ENABLED: 1
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}-golang-1.17-git-2.31
diff --git a/.gitlab/issue_templates/Broken Master - Flaky.md b/.gitlab/issue_templates/Broken Master - Flaky.md
new file mode 100644
index 00000000000..6b56845ba8c
--- /dev/null
+++ b/.gitlab/issue_templates/Broken Master - Flaky.md
@@ -0,0 +1,25 @@
+<!---
+This issue template is for a master pipeline is failing for a flaky reason that cannot be reliably reproduced.
+
+Please read the below documentations for a workflow of triaging and resolving broken master.
+
+- https://about.gitlab.com/handbook/engineering/workflow/#triage-broken-master
+- https://gitlab.com/gitlab-org/quality/engineering-productivity/team/-/blob/main/runbooks/master-broken.md
+- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/testing_guide/flaky_tests.md
+--->
+
+### Summary
+
+<!-- Link to the failing master build and add the build failure output in the below code block section. -->
+
+### Steps to reproduce
+
+<!-- If the pipeline failure is reproducible, provide steps to recreate the issue locally. Please use an ordered list. -->
+
+### Proposed Resolution
+
+<!-- Describe the proposed change to restore master stability. -->
+
+Please refer to the [Resolution guidance](https://about.gitlab.com/handbook/engineering/workflow/#resolution-of-broken-master) to learn more about resolution of broken master.
+
+/label ~"failure::flaky-test" ~"Engineering Productivity" ~"priority::2" ~"severity::2"
diff --git a/.gitlab/issue_templates/Broken Master - Non-flaky.md b/.gitlab/issue_templates/Broken Master - Non-flaky.md
new file mode 100644
index 00000000000..97a34aa759d
--- /dev/null
+++ b/.gitlab/issue_templates/Broken Master - Non-flaky.md
@@ -0,0 +1,24 @@
+<!---
+This issue template is for a master pipeline is failing for a non-flaky reason.
+
+Please read the below documentations for a workflow of triaging and resolving broken master.
+
+- https://about.gitlab.com/handbook/engineering/workflow/#triage-broken-master
+- https://gitlab.com/gitlab-org/quality/engineering-productivity/team/-/blob/main/runbooks/master-broken.md
+--->
+
+### Summary
+
+<!-- Link to the failing master build and add the build failure output in the below code block section. -->
+
+### Steps to reproduce
+
+<!-- If the pipeline failure is reproducible, provide steps to recreate the issue locally. Please use an ordered list. -->
+
+### Proposed Resolution
+
+<!-- Describe the proposed change to restore master stability. -->
+
+Please refer to the [Resolution guidance](https://about.gitlab.com/handbook/engineering/workflow/#resolution-of-broken-master) to learn more about resolution of broken master.
+
+/label ~"master:broken" ~"Engineering Productivity" ~"priority::1" ~"severity::1"
diff --git a/.gitlab/issue_templates/Feature Flag Roll Out.md b/.gitlab/issue_templates/Feature Flag Roll Out.md
index 1b3d82cf522..f3830a5cc10 100644
--- a/.gitlab/issue_templates/Feature Flag Roll Out.md
+++ b/.gitlab/issue_templates/Feature Flag Roll Out.md
@@ -62,7 +62,7 @@ _Consider adding links to check for Sentry errors, Production logs for 5xx, 302s
- Ensure that the feature MRs have been deployed to non-production environments.
- [ ] `/chatops run auto_deploy status <merge-commit-of-your-feature>`
- [ ] Enable the feature globally on non-production environments.
- - [ ] `/chatops run feature set <feature-flag-name> true --dev --staging`
+ - [ ] `/chatops run feature set <feature-flag-name> true --dev --staging --staging-ref`
- [ ] Verify that the feature works as expected. Posting the QA result in this issue is preferable.
The best environment to validate the feature in is [staging-canary](https://about.gitlab.com/handbook/engineering/infrastructure/environments/#staging-canary)
as this is the first environment deployed to. Note you will need to make sure you are configured to use canary as outlined [here](https://about.gitlab.com/handbook/engineering/infrastructure/environments/canary-stage/)
@@ -120,7 +120,7 @@ To do so, follow these steps:
the feature can be officially announced in a release blog post.
- [ ] `/chatops run release check <merge-request-url> <milestone>`
- [ ] Consider cleaning up the feature flag from all environments by running these chatops command in `#production` channel. Otherwise these settings may override the default enabled.
- - [ ] `/chatops run feature delete <feature-flag-name> --dev --staging --production`
+ - [ ] `/chatops run feature delete <feature-flag-name> --dev --staging --staging-ref --production`
- [ ] 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](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Feature%20Flag%20Cleanup) for scheduling the steps below to [Release the feature](#release-the-feature).
@@ -156,7 +156,7 @@ You can either [create a follow-up issue for Feature Flag Cleanup](https://gitla
- [ ] `/chatops run release check <merge-request-url> <milestone>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] If not already done, clean up the feature flag from all environments by running these chatops command in `#production` channel:
- - [ ] `/chatops run feature delete <feature-flag-name> --dev --staging --production`
+ - [ ] `/chatops run feature delete <feature-flag-name> --dev --staging --staging-ref --production`
- [ ] Close this rollout issue.
## Rollback Steps
diff --git a/.gitlab/issue_templates/Feature proposal - detailed.md b/.gitlab/issue_templates/Feature proposal - detailed.md
index 9f8a0a92a58..48052ed49ea 100644
--- a/.gitlab/issue_templates/Feature proposal - detailed.md
+++ b/.gitlab/issue_templates/Feature proposal - detailed.md
@@ -81,7 +81,9 @@ Please list the test areas (unit, integration and end-to-end) that needs to be a
* Integration test changes
* End-to-end test change
-See the test engineering planning process and reach out to your counterpart Software Engineer in Test for assistance: https://about.gitlab.com/handbook/engineering/quality/test-engineering/#test-planning -->
+See the Quality Engineering quad planning and test planning processes and reach out to your counterpart Software Engineer in Test for assistance.
+Quad Planning: https://about.gitlab.com/handbook/engineering/quality/quality-engineering/quad-planning
+Test Planning: https://about.gitlab.com/handbook/engineering/quality/quality-engineering/test-engineering/#test-planning -->
### Available Tier
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 34e6e70015b..e1c5928b950 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
@@ -64,7 +64,7 @@ For more information, see the [Enable Geo migrations to use Migration[2.0]](http
disable_ddl_transaction!
def up
- ActiveRecord::Base.transaction do
+ ApplicationRecord.transaction do
create_table :cool_widget_registry, id: :bigserial, force: :cascade do |t|
t.bigint :cool_widget_id, null: false
t.datetime_with_timezone :created_at, null: false
@@ -128,7 +128,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
```ruby
# frozen_string_literal: true
- class CreateCoolWidgetStates < Gitlab::Database::Migration[1.0]
+ class CreateCoolWidgetStates < Gitlab::Database::Migration[2.0]
VERIFICATION_STATE_INDEX_NAME = "index_cool_widget_states_on_verification_state"
PENDING_VERIFICATION_INDEX_NAME = "index_cool_widget_states_pending_verification"
FAILED_VERIFICATION_INDEX_NAME = "index_cool_widget_states_failed_verification"
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 e6f96c575d2..9158885262d 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -66,7 +66,7 @@ For more information, see the [Enable Geo migrations to use Migration[2.0]](http
disable_ddl_transaction!
def up
- ActiveRecord::Base.transaction do
+ ApplicationRecord.transaction do
create_table :cool_widget_registry, id: :bigserial, force: :cascade do |t|
t.bigint :cool_widget_id, null: false
t.datetime_with_timezone :created_at, null: false
@@ -130,7 +130,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
```ruby
# frozen_string_literal: true
- class CreateCoolWidgetStates < Gitlab::Database::Migration[1.0]
+ class CreateCoolWidgetStates < Gitlab::Database::Migration[2.0]
VERIFICATION_STATE_INDEX_NAME = "index_cool_widget_states_on_verification_state"
PENDING_VERIFICATION_INDEX_NAME = "index_cool_widget_states_pending_verification"
FAILED_VERIFICATION_INDEX_NAME = "index_cool_widget_states_failed_verification"
diff --git a/.gitlab/merge_request_templates/New End To End Test.md b/.gitlab/merge_request_templates/New End To End Test.md
index 4c42b324553..46ccdb1cb0c 100644
--- a/.gitlab/merge_request_templates/New End To End Test.md
+++ b/.gitlab/merge_request_templates/New End To End Test.md
@@ -10,7 +10,10 @@ Please link to the respective test case in the testcases project
- [ ] Note if the test is intended to run in specific scenarios. If a scenario is new, add a link to the MR that adds the new scenario.
- [ ] Follow the end-to-end tests [style guide](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/style_guide.html) and [best practices](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/best_practices.html).
- [ ] Use the appropriate [RSpec metadata tag(s)](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/rspec_metadata_tests.html#rspec-metadata-for-end-to-end-tests).
-- [ ] Ensure that a created resource is removed after test execution. A `Group` resource can be shared between multiple tests. Do not remove it unless it has a unique path. Note that we have a cleanup job that periodically removes groups under `gitlab-qa-sandbox-group`.
+- Most resources will be cleaned up via the general [cleanup task](https://gitlab.com/gitlab-org/gitlab/-/blob/44345381e89d6bbd440f7b4c680d03e8b75b86de/qa/qa/tools/test_resources_handler.rb#L44). Check that is successful, or ensure resources are cleaned up in the test:
+ - [ ] New resources have `api_get_path` and `api_delete_path` implemented if possible.
+ - [ ] If any resource cannot be deleted in the general delete task, make sure it is [ignored](https://gitlab.com/gitlab-org/gitlab/-/blob/44345381e89d6bbd440f7b4c680d03e8b75b86de/qa/qa/tools/test_resources_handler.rb#L29).
+ - [ ] If any resource cannot be deleted in the general delete task, remove it in the test (e.g., in an `after` block).
- [ ] Ensure that no [transient bugs](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#transient-bugs) are hidden accidentally due to the usage of `waits` and `reloads`.
- [ ] Verify the tags to ensure it runs on the desired test environments.
- [ ] If this MR has a dependency on another MR, such as a GitLab QA MR, specify the order in which the MRs should be merged.
diff --git a/.gitlab/sast-ruleset.toml b/.gitlab/sast-ruleset.toml
new file mode 100644
index 00000000000..6bfb4618b73
--- /dev/null
+++ b/.gitlab/sast-ruleset.toml
@@ -0,0 +1,10 @@
+[semgrep]
+ description = 'semgrep custom rules configuration'
+ targetdir = "/sgrules"
+ validate = true
+
+ [[semgrep.passthrough]]
+ type = "git"
+ value = "https://gitlab.com/gitlab-com/gl-security/appsec/sast-custom-rules.git"
+ ref = "refs/heads/main"
+ subdir = "appsec-pings"
diff --git a/.gitpod.yml b/.gitpod.yml
index 96c4eafd0e4..3fb623b9fb6 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -3,7 +3,10 @@ image: registry.gitlab.com/gitlab-org/gitlab-development-kit/gitpod-workspace:st
tasks:
- name: GDK
- command: gp sync-await gdk-copied && cd /workspace/gitlab-development-kit && gdk help
+ command: |
+ echo START_TIME_IN_SECONDS="$(date +%s)" | tee /workspace/gitpod_start_time.sh
+ gp sync-done gitpod-start
+ gp sync-await gdk-copied && cd /workspace/gitlab-development-kit && gdk help
- init: |
echo "$(date) – Copying GDK" | tee -a /workspace/startup.log
@@ -33,8 +36,10 @@ tasks:
)
command: |
(
+ gp sync-await gitpod-start
set -e
gp sync-done gdk-copied
+ [[ -f /workspace/gitpod_start_time.sh ]] && source /workspace/gitpod_start_time.sh
SECONDS=0
cd /workspace/gitlab-development-kit
# update GDK
@@ -69,7 +74,7 @@ tasks:
git checkout db/structure.sql
cd /workspace/gitlab-development-kit
# Waiting for GitLab ...
- gp await-port 3000
+ gp ports await 3000
printf "Waiting for GitLab at $(gp url 3000) ..."
# Check /-/readiness which returns JSON, but we're only interested in the exit code
#
@@ -80,6 +85,8 @@ tasks:
sleep 5
printf "$(date) – GitLab is up (took ~%.1f minutes)\n" "$((10*$SECONDS/60))e-1" | tee -a /workspace/startup.log
gp preview $(gp url 3000) || true
+ PREBUILD_LOG=(/workspace/.gitpod/prebuild-log-*)
+ [[ -f /workspace/gitpod_start_time.sh ]] && printf "Took %.1f minutes from https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitpod.yml being executed through to completion %s\n" "$((10*(($(date +%s)-${START_TIME_IN_SECONDS}))/60))e-1" "$([[ -f "$PREBUILD_LOG" ]] && echo "With Prebuilds")"
)
ports:
diff --git a/.markdownlint.yml b/.markdownlint.yml
index 9d83bd2e1da..a5f74890815 100644
--- a/.markdownlint.yml
+++ b/.markdownlint.yml
@@ -123,6 +123,7 @@ proper-names:
"SAML",
"Sendmail",
"Sentry",
+ "Service Desk",
"Sidekiq",
"Shibboleth",
"Slack",
diff --git a/.nvmrc b/.nvmrc
index 832d3850644..99cdd8009c3 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-16.14.0
+16.15.0
diff --git a/.rubocop.yml b/.rubocop.yml
index 47c7e5b5e35..4c7abe0dc89 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -13,8 +13,6 @@ inherit_from:
<% end %>
- '.rubocop_todo.yml'
<% end %>
- <%# See https://gitlab.com/gitlab-org/gitlab/-/issues/321982#rubymine-note for context on why namespaced_class has special handling here %>
- - ./.rubocop_todo/gitlab/namespaced_class.yml
- ./rubocop/rubocop-migrations.yml
- ./rubocop/rubocop-usage-data.yml
- ./rubocop/rubocop-code_reuse.yml
@@ -779,3 +777,6 @@ Migration/BackgroundMigrationBaseClass:
Style/ClassAndModuleChildren:
Enabled: true
+
+Fips/OpenSSL:
+ Enabled: false
diff --git a/.rubocop_todo/capybara/visibility_matcher.yml b/.rubocop_todo/capybara/visibility_matcher.yml
index 015e246344d..90d71fe2d3a 100644
--- a/.rubocop_todo/capybara/visibility_matcher.yml
+++ b/.rubocop_todo/capybara/visibility_matcher.yml
@@ -18,7 +18,6 @@ Capybara/VisibilityMatcher:
- 'ee/spec/features/projects/requirements_management/requirements_list_spec.rb'
- 'ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb'
- 'ee/spec/features/promotion_spec.rb'
- - 'ee/spec/features/refactor_blob_viewer_disabled/projects/path_locks_spec.rb'
- 'ee/spec/features/registrations/welcome_spec.rb'
- 'ee/spec/support/shared_examples/views/issuable_bulk_dropdown_shared_examples.rb'
- 'ee/spec/views/layouts/_search.html.haml_spec.rb'
@@ -62,8 +61,6 @@ Capybara/VisibilityMatcher:
- 'spec/features/projects/tags/user_edits_tags_spec.rb'
- 'spec/features/projects/user_changes_project_visibility_spec.rb'
- 'spec/features/projects/user_sees_user_popover_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb'
- 'spec/features/search/user_searches_for_commits_spec.rb'
- 'spec/features/snippets/notes_on_personal_snippets_spec.rb'
- 'spec/features/task_lists_spec.rb'
diff --git a/.rubocop_todo/cop/user_admin.yml b/.rubocop_todo/cop/user_admin.yml
index ab5f76a002d..c9eed57e74d 100644
--- a/.rubocop_todo/cop/user_admin.yml
+++ b/.rubocop_todo/cop/user_admin.yml
@@ -2,7 +2,6 @@
Cop/UserAdmin:
Exclude:
- app/controllers/admin/impersonations_controller.rb
- - app/controllers/concerns/spammable_actions.rb
- app/controllers/sessions_controller.rb
- app/finders/autocomplete/routes_finder.rb
- app/finders/ci/jobs_finder.rb
@@ -32,8 +31,6 @@ Cop/UserAdmin:
- app/services/projects/fork_service.rb
- app/services/users/build_service.rb
- ee/app/controllers/ee/projects_controller.rb
- - ee/app/graphql/mutations/admin/analytics/devops_adoption/segments/mixins.rb
- - ee/app/graphql/resolvers/admin/analytics/devops_adoption/segments_resolver.rb
- ee/app/helpers/ee/dashboard_helper.rb
- ee/app/helpers/ee/import_helper.rb
- ee/app/helpers/ee/subscribable_banner_helper.rb
@@ -53,7 +50,6 @@ Cop/UserAdmin:
- lib/api/award_emoji.rb
- lib/api/ci/runners.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
@@ -61,7 +57,6 @@ Cop/UserAdmin:
- lib/api/v3/github.rb
- lib/constraints/admin_constrainer.rb
- lib/gitlab/auth.rb
- - lib/gitlab/background_migration/user_mentions/models/group.rb
- lib/gitlab/ci/runner_instructions.rb
- lib/gitlab/import_export/members_mapper.rb
- lib/gitlab/performance_bar.rb
diff --git a/.rubocop_todo/database/rescue_query_canceled.yml b/.rubocop_todo/database/rescue_query_canceled.yml
new file mode 100644
index 00000000000..76635ca4018
--- /dev/null
+++ b/.rubocop_todo/database/rescue_query_canceled.yml
@@ -0,0 +1,9 @@
+---
+Database/RescueQueryCanceled:
+ Exclude:
+ - 'app/services/issues/relative_position_rebalancing_service.rb'
+ - 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
+ - 'lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb'
+ - 'lib/gitlab/database/batch_counter.rb'
+ - 'lib/gitlab/issuables_count_for_state.rb'
+ - 'lib/tasks/gitlab/db/lock_writes.rake'
diff --git a/.rubocop_todo/database/rescue_statement_timeout.yml b/.rubocop_todo/database/rescue_statement_timeout.yml
new file mode 100644
index 00000000000..dc6b0bdfab3
--- /dev/null
+++ b/.rubocop_todo/database/rescue_statement_timeout.yml
@@ -0,0 +1,5 @@
+---
+Database/RescueStatementTimeout:
+ Exclude:
+ - 'app/services/issues/relative_position_rebalancing_service.rb'
+ - 'lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb'
diff --git a/.rubocop_todo/fips/open_ssl.yml b/.rubocop_todo/fips/open_ssl.yml
deleted file mode 100644
index 03a551112ab..00000000000
--- a/.rubocop_todo/fips/open_ssl.yml
+++ /dev/null
@@ -1,222 +0,0 @@
----
-# Cop supports --auto-correct.
-Fips/OpenSSL:
- Exclude:
- - 'app/controllers/application_controller.rb'
- - 'app/controllers/concerns/authenticates_with_two_factor.rb'
- - 'app/controllers/projects/merge_requests/diffs_controller.rb'
- - 'app/controllers/projects/merge_requests_controller.rb'
- - 'app/helpers/application_helper.rb'
- - 'app/models/ci/artifact_blob.rb'
- - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
- - 'app/models/concerns/checksummable.rb'
- - 'app/models/concerns/token_authenticatable_strategies/encryption_helper.rb'
- - 'app/models/diff_discussion.rb'
- - 'app/models/discussion.rb'
- - 'app/models/legacy_diff_note.rb'
- - 'app/models/namespace.rb'
- - 'app/models/note.rb'
- - 'app/models/performance_monitoring/prometheus_panel.rb'
- - 'app/models/protected_branch.rb'
- - 'app/models/release_highlight.rb'
- - 'app/models/repository.rb'
- - 'app/models/resource_event.rb'
- - 'app/models/snippet.rb'
- - 'app/models/storage/hashed.rb'
- - 'app/models/token_with_iv.rb'
- - 'app/presenters/packages/composer/packages_presenter.rb'
- - 'app/services/ci/build_report_result_service.rb'
- - 'app/services/metrics/dashboard/transient_embed_service.rb'
- - 'app/services/packages/debian/generate_distribution_service.rb'
- - 'app/services/packages/go/create_package_service.rb'
- - 'app/services/packages/maven/metadata/append_package_file_service.rb'
- - 'app/services/packages/rubygems/create_gemspec_service.rb'
- - 'app/services/pages/migrate_legacy_storage_to_deployment_service.rb'
- - 'app/services/projects/lfs_pointers/lfs_download_service.rb'
- - 'app/uploaders/ci/secure_file_uploader.rb'
- - 'config/initializers/doorkeeper_openid_connect.rb'
- - 'config/initializers/session_store.rb'
- - 'config/settings.rb'
- - 'db/post_migrate/20210731132939_backfill_stage_event_hash.rb'
- - 'ee/app/models/storage_shard.rb'
- - 'ee/app/services/elastic/bookkeeping_shard_service.rb'
- - 'ee/app/services/security/track_scan_service.rb'
- - 'ee/app/services/vulnerabilities/create_service_base.rb'
- - 'ee/app/services/vulnerabilities/manually_create_service.rb'
- - 'ee/app/services/vulnerabilities/starboard_vulnerability_create_service.rb'
- - 'ee/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids.rb'
- - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
- - 'ee/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
- - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/label_based_stage_event.rb'
- - 'ee/lib/gitlab/ci/reports/dependency_list/dependency.rb'
- - 'ee/lib/gitlab/ci/reports/security/remediation.rb'
- - 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
- - 'ee/spec/factories/vulnerabilities/feedback.rb'
- - 'ee/spec/factories/vulnerabilities/finding_signatures.rb'
- - 'ee/spec/factories/vulnerabilities/remediations.rb'
- - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
- - 'ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb'
- - 'ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb'
- - 'ee/spec/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
- - 'ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_added_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_removed_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_added_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_removed_spec.rb'
- - 'ee/spec/lib/gitlab/ci/reports/security/locations/cluster_image_scanning_spec.rb'
- - 'ee/spec/lib/gitlab/ci/reports/security/locations/container_scanning_spec.rb'
- - 'ee/spec/lib/gitlab/ci/reports/security/locations/dast_spec.rb'
- - 'ee/spec/lib/gitlab/ci/reports/security/locations/dependency_scanning_spec.rb'
- - 'ee/spec/migrations/update_vulnerability_occurrences_location_spec.rb'
- - 'ee/spec/models/merge_train_spec.rb'
- - 'ee/spec/models/resource_weight_event_spec.rb'
- - 'ee/spec/models/vulnerabilities/finding_signature_spec.rb'
- - 'ee/spec/models/vulnerabilities/finding_spec.rb'
- - 'ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb'
- - 'ee/spec/services/merge_trains/check_status_service_spec.rb'
- - 'ee/spec/services/projects/alerting/notify_service_spec.rb'
- - 'ee/spec/services/security/ingestion/tasks/ingest_identifiers_spec.rb'
- - 'ee/spec/services/security/ingestion/tasks/ingest_remediations_spec.rb'
- - 'ee/spec/services/security/override_uuids_service_spec.rb'
- - 'ee/spec/services/security/track_scan_service_spec.rb'
- - 'ee/spec/services/vulnerabilities/manually_create_service_spec.rb'
- - 'ee/spec/support/matchers/locked_schema.rb'
- - 'lib/api/files.rb'
- - 'lib/api/maven_packages.rb'
- - 'lib/atlassian/jira_connect/serializers/branch_entity.rb'
- - 'lib/container_registry/client.rb'
- - 'lib/extracts_path.rb'
- - 'lib/gitlab/alert_management/fingerprint.rb'
- - 'lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb'
- - 'lib/gitlab/background_migration/backfill_note_discussion_id.rb'
- - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
- - 'lib/gitlab/ci/pipeline/seed/build/cache.rb'
- - 'lib/gitlab/ci/reports/security/finding.rb'
- - 'lib/gitlab/ci/reports/security/finding_signature.rb'
- - 'lib/gitlab/ci/reports/security/identifier.rb'
- - 'lib/gitlab/ci/reports/security/locations/base.rb'
- - 'lib/gitlab/ci/reports/test_case.rb'
- - 'lib/gitlab/color.rb'
- - 'lib/gitlab/composer/version_index.rb'
- - 'lib/gitlab/crypto_helper.rb'
- - 'lib/gitlab/database/migration_helpers.rb'
- - 'lib/gitlab/database/migration_helpers/v2.rb'
- - 'lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb'
- - 'lib/gitlab/database/schema_helpers.rb'
- - 'lib/gitlab/database/schema_migrations/migrations.rb'
- - 'lib/gitlab/database/unidirectional_copy_trigger.rb'
- - 'lib/gitlab/diff/file.rb'
- - 'lib/gitlab/diff/formatters/base_formatter.rb'
- - 'lib/gitlab/diff/position.rb'
- - 'lib/gitlab/experimentation/controller_concern.rb'
- - 'lib/gitlab/git.rb'
- - 'lib/gitlab/git/branch.rb'
- - 'lib/gitlab/git/lfs_pointer_file.rb'
- - 'lib/gitlab/git/tag.rb'
- - 'lib/gitlab/hashed_path.rb'
- - 'lib/gitlab/insecure_key_fingerprint.rb'
- - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
- - 'lib/gitlab/slug/environment.rb'
- - 'lib/gitlab/verify/job_artifacts.rb'
- - 'lib/json_web_token/rsa_token.rb'
- - 'lib/tasks/gitlab/assets.rake'
- - 'lib/tasks/tanuki_emoji.rake'
- - 'qa/qa/service/praefect_manager.rb'
- - 'qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_non_enforced_sso_spec.rb'
- - 'scripts/security-harness'
- - 'spec/components/diffs/stats_component_spec.rb'
- - 'spec/controllers/projects/blob_controller_spec.rb'
- - 'spec/factories/ci/job_artifacts.rb'
- - 'spec/factories/ci/reports/security/finding_keys.rb'
- - 'spec/factories/ci/unit_test.rb'
- - 'spec/factories/commit_signature/gpg_signature.rb'
- - 'spec/factories/commit_signature/ssh_signature.rb'
- - 'spec/factories/commit_signature/x509_commit_signature.rb'
- - 'spec/factories/design_management/designs.rb'
- - 'spec/factories/diff_position.rb'
- - 'spec/factories/gitaly/commit.rb'
- - 'spec/factories/merge_request_context_commit.rb'
- - 'spec/factories/merge_request_context_commit_diff_file.rb'
- - 'spec/factories/merge_request_diff_commits.rb'
- - 'spec/factories/merge_request_diffs.rb'
- - 'spec/factories/pages_deployments.rb'
- - 'spec/factories/sequences.rb'
- - 'spec/factories/token_with_ivs.rb'
- - 'spec/features/file_uploads/git_lfs_spec.rb'
- - 'spec/features/merge_request/user_sees_diff_spec.rb'
- - 'spec/features/merge_request/user_suggests_changes_on_diff_spec.rb'
- - 'spec/finders/merge_requests/oldest_per_commit_finder_spec.rb'
- - 'spec/lib/gitlab/alert_management/fingerprint_spec.rb'
- - 'spec/lib/gitlab/alert_management/payload/base_spec.rb'
- - 'spec/lib/gitlab/alert_management/payload/generic_spec.rb'
- - 'spec/lib/gitlab/alert_management/payload/prometheus_spec.rb'
- - 'spec/lib/gitlab/background_migration/backfill_note_discussion_id_spec.rb'
- - 'spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb'
- - 'spec/lib/gitlab/ci/reports/security/finding_signature_spec.rb'
- - 'spec/lib/gitlab/ci/reports/security/locations/sast_spec.rb'
- - 'spec/lib/gitlab/ci/reports/security/locations/secret_detection_spec.rb'
- - 'spec/lib/gitlab/ci/reports/test_case_spec.rb'
- - 'spec/lib/gitlab/crypto_helper_spec.rb'
- - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
- - 'spec/lib/gitlab/database/schema_migrations/migrations_spec.rb'
- - 'spec/lib/gitlab/diff/file_spec.rb'
- - 'spec/lib/gitlab/diff/position_spec.rb'
- - 'spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb'
- - 'spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb'
- - 'spec/lib/gitlab/experimentation/controller_concern_spec.rb'
- - 'spec/lib/gitlab/git/branch_spec.rb'
- - 'spec/lib/gitlab/git/tag_spec.rb'
- - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb'
- - 'spec/lib/gitlab/slug/environment_spec.rb'
- - 'spec/migrations/20220107064845_populate_vulnerability_reads_spec.rb'
- - 'spec/migrations/20220524074947_finalize_backfill_null_note_discussion_ids_spec.rb'
- - 'spec/migrations/delete_security_findings_without_uuid_spec.rb'
- - 'spec/migrations/schedule_recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
- - 'spec/models/ci/artifact_blob_spec.rb'
- - 'spec/models/ci/job_artifact_spec.rb'
- - 'spec/models/ci/pipeline_spec.rb'
- - 'spec/models/ci/secure_file_spec.rb'
- - 'spec/models/ci/unit_test_spec.rb'
- - 'spec/models/concerns/checksummable_spec.rb'
- - 'spec/models/concerns/token_authenticatable_strategies/encryption_helper_spec.rb'
- - 'spec/models/design_management/version_spec.rb'
- - 'spec/models/diff_discussion_spec.rb'
- - 'spec/models/discussion_spec.rb'
- - 'spec/models/lfs_object_spec.rb'
- - 'spec/models/merge_request_diff_spec.rb'
- - 'spec/models/merge_request_spec.rb'
- - 'spec/models/note_spec.rb'
- - 'spec/models/pages_deployment_spec.rb'
- - 'spec/models/performance_monitoring/prometheus_panel_spec.rb'
- - 'spec/models/project_spec.rb'
- - 'spec/models/release_highlight_spec.rb'
- - 'spec/models/repository_spec.rb'
- - 'spec/models/token_with_iv_spec.rb'
- - 'spec/models/upload_spec.rb'
- - 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
- - 'spec/requests/api/ci/secure_files_spec.rb'
- - 'spec/requests/openid_connect_spec.rb'
- - 'spec/services/dependency_proxy/find_cached_manifest_service_spec.rb'
- - 'spec/services/dependency_proxy/head_manifest_service_spec.rb'
- - 'spec/services/dependency_proxy/request_token_service_spec.rb'
- - 'spec/services/import_export_clean_up_service_spec.rb'
- - 'spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb'
- - 'spec/services/projects/after_rename_service_spec.rb'
- - 'spec/services/projects/create_service_spec.rb'
- - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
- - 'spec/support/helpers/workhorse_helpers.rb'
- - 'spec/support/migrations_helpers/vulnerabilities_findings_helper.rb'
- - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
- - 'spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb'
- - 'spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb'
- - 'spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb'
- - 'spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb'
- - 'spec/support/shared_examples/services/metrics/dashboard_shared_examples.rb'
- - 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
- - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
- - 'spec/support/trace/trace_helpers.rb'
- - 'spec/uploaders/ci/secure_file_uploader_spec.rb'
- - 'spec/uploaders/job_artifact_uploader_spec.rb'
- - 'spec/validators/sha_validator_spec.rb'
- - 'spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb'
diff --git a/.rubocop_todo/gitlab/delegate_predicate_methods.yml b/.rubocop_todo/gitlab/delegate_predicate_methods.yml
index 854cd3e0a83..44d603b3206 100644
--- a/.rubocop_todo/gitlab/delegate_predicate_methods.yml
+++ b/.rubocop_todo/gitlab/delegate_predicate_methods.yml
@@ -2,5 +2,3 @@
Gitlab/DelegatePredicateMethods:
Exclude:
- app/models/clusters/cluster.rb
- - app/models/project.rb
- - ee/app/models/concerns/ee/ci/metadatable.rb
diff --git a/.rubocop_todo/gitlab/feature_available_usage.yml b/.rubocop_todo/gitlab/feature_available_usage.yml
index 168edd94f90..92aad8b990e 100644
--- a/.rubocop_todo/gitlab/feature_available_usage.yml
+++ b/.rubocop_todo/gitlab/feature_available_usage.yml
@@ -6,7 +6,6 @@ Gitlab/FeatureAvailableUsage:
- app/helpers/events_helper.rb
- app/helpers/labels_helper.rb
- app/policies/project_policy.rb
- - app/views/shared/boards/_switcher.html.haml
- ee/app/controllers/concerns/description_diff_actions.rb
- ee/app/controllers/concerns/ee/boards_actions.rb
- ee/app/controllers/concerns/security_dashboards_permissions.rb
@@ -18,23 +17,18 @@ Gitlab/FeatureAvailableUsage:
- ee/app/controllers/ee/projects/settings/operations_controller.rb
- ee/app/controllers/ee/projects/settings/repository_controller.rb
- ee/app/controllers/projects/audit_events_controller.rb
- - ee/app/controllers/projects/cluster_agents_controller.rb
- - ee/app/controllers/projects/iterations/inherited_controller.rb
- ee/app/controllers/projects/iterations_controller.rb
- ee/app/controllers/projects/path_locks_controller.rb
- ee/app/controllers/projects/subscriptions_controller.rb
- ee/app/finders/autocomplete/vulnerabilities_autocomplete_finder.rb
- - ee/app/finders/clusters/agents_finder.rb
- ee/app/finders/ee/alert_management/http_integrations_finder.rb
- ee/app/graphql/ee/types/group_type.rb
- ee/app/graphql/mutations/dast/profiles/create.rb
- ee/app/graphql/mutations/dast/profiles/run.rb
- ee/app/graphql/mutations/dast/profiles/update.rb
- ee/app/graphql/mutations/instance_security_dashboard/remove_project.rb
- - ee/app/graphql/resolvers/clusters/agent_tokens_resolver.rb
- ee/app/helpers/ee/application_helper.rb
- ee/app/helpers/ee/boards_helper.rb
- - ee/app/helpers/ee/clusters_helper.rb
- ee/app/helpers/ee/dashboard_helper.rb
- ee/app/helpers/ee/form_helper.rb
- ee/app/helpers/ee/graph_helper.rb
@@ -50,7 +44,6 @@ Gitlab/FeatureAvailableUsage:
- ee/app/models/concerns/approvable.rb
- ee/app/models/concerns/ee/project_security_scanners_information.rb
- ee/app/models/concerns/ee/protected_ref_access.rb
- - ee/app/models/concerns/has_timelogs_report.rb
- ee/app/models/concerns/insights_feature.rb
- ee/app/models/ee/board.rb
- ee/app/models/ee/ci/build.rb
@@ -66,11 +59,9 @@ Gitlab/FeatureAvailableUsage:
- ee/app/models/ee/namespace_setting.rb
- ee/app/models/ee/project.rb
- ee/app/models/ee/project_ci_cd_setting.rb
- - ee/app/models/namespace_statistics.rb
- ee/app/models/project_security_setting.rb
- ee/app/policies/compliance_management/framework_policy.rb
- ee/app/policies/ee/group_policy.rb
- - ee/app/policies/ee/namespace_policy.rb
- ee/app/policies/ee/project_policy.rb
- ee/app/policies/ee/protected_branch_policy.rb
- ee/app/presenters/ee/label_presenter.rb
@@ -81,17 +72,8 @@ Gitlab/FeatureAvailableUsage:
- ee/app/serializers/ee/note_entity.rb
- ee/app/services/boards/epic_boards/update_service.rb
- ee/app/services/ci/audit_variable_change_service.rb
- - ee/app/services/clusters/agent_tokens/create_service.rb
- - ee/app/services/clusters/agents/create_service.rb
- ee/app/services/dashboard/projects/create_service.rb
- ee/app/services/dashboard/projects/list_service.rb
- - ee/app/services/dast/profiles/create_service.rb
- - ee/app/services/dast/profiles/update_service.rb
- - ee/app/services/dast_on_demand_scans/create_service.rb
- - ee/app/services/dast_site_tokens/create_service.rb
- - ee/app/services/dast_site_validations/create_service.rb
- - ee/app/services/dast_site_validations/revoke_service.rb
- - ee/app/services/dast_site_validations/validate_service.rb
- ee/app/services/ee/alert_management/http_integrations/create_service.rb
- ee/app/services/ee/audit_event_service.rb
- ee/app/services/ee/boards/issues/list_service.rb
@@ -119,8 +101,6 @@ Gitlab/FeatureAvailableUsage:
- ee/app/services/quality_management/test_cases/create_service.rb
- ee/app/services/requirements_management/process_test_reports_service.rb
- ee/app/services/security/store_scans_service.rb
- - ee/app/views/layouts/nav/_test_cases_link.html.haml
- - ee/app/views/layouts/nav/sidebar/_project_iterations_link.html.haml
- ee/app/views/projects/_merge_request_approvals_settings.html.haml
- ee/app/views/projects/_merge_request_settings.html.haml
- ee/app/views/projects/_merge_request_settings_description_text.html.haml
@@ -128,14 +108,6 @@ Gitlab/FeatureAvailableUsage:
- ee/app/views/projects/blob/_header_file_locks.html.haml
- ee/app/views/projects/issues/_related_issues.html.haml
- ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- - ee/app/views/projects/merge_requests/show.html.haml
- ee/app/views/projects/pipelines/_tabs_content.html.haml
- ee/app/views/projects/protected_branches/ee/_code_owner_approval_form.html.haml
- ee/app/views/projects/protected_branches/ee/_code_owner_approval_table.html.haml
@@ -148,28 +120,19 @@ Gitlab/FeatureAvailableUsage:
- ee/app/views/projects/settings/ci_cd/_pipeline_subscriptions.html.haml
- ee/app/views/projects/settings/operations/_status_page.html.haml
- ee/app/views/projects/settings/repository/_protected_branches.html.haml
- - ee/app/views/projects/sidebar/_repository_locked_files.html.haml
- ee/app/views/shared/issuable/_group_bulk_update_sidebar.html.haml
- ee/app/views/shared/issuable/form/_default_templates.html.haml
- ee/app/views/shared/labels/_create_label_help_text.html.haml
- ee/app/views/shared/promotions/_promote_mr_features.html.haml
- - ee/app/views/shared/promotions/_promote_mr_features.html.haml
- - ee/app/views/shared/promotions/_promote_repository_features.html.haml
- - ee/app/views/shared/promotions/_promote_repository_features.html.haml
- - ee/app/views/shared/promotions/_promote_repository_features.html.haml
- - ee/app/views/shared/promotions/_promote_repository_features.html.haml
- - ee/app/views/shared/promotions/_promote_repository_features.html.haml
- ee/app/views/shared/promotions/_promote_repository_features.html.haml
- ee/app/workers/analytics/code_review_metrics_worker.rb
- ee/app/workers/group_saml_group_sync_worker.rb
- - ee/lib/api/external_status_checks.rb
- ee/lib/ee/api/entities/approval_state.rb
- ee/lib/ee/api/entities/board.rb
- ee/lib/ee/api/entities/issue.rb
- ee/lib/ee/api/entities/project.rb
- ee/lib/ee/api/helpers.rb
- ee/lib/ee/api/internal/kubernetes.rb
- - ee/lib/ee/api/job_artifacts.rb
- ee/lib/ee/api/projects.rb
- ee/lib/ee/gitlab/alert_management/payload/generic.rb
- ee/lib/ee/gitlab/checks/diff_check.rb
diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml
index 23ff86ba289..ac5edc05265 100644
--- a/.rubocop_todo/gitlab/namespaced_class.yml
+++ b/.rubocop_todo/gitlab/namespaced_class.yml
@@ -285,7 +285,6 @@ Gitlab/NamespacedClass:
- 'app/models/project_snippet.rb'
- 'app/models/project_statistics.rb'
- 'app/models/project_team.rb'
- - 'app/models/project_tracing_setting.rb'
- 'app/models/project_wiki.rb'
- 'app/models/prometheus_alert.rb'
- 'app/models/prometheus_alert_event.rb'
@@ -429,7 +428,6 @@ Gitlab/NamespacedClass:
- 'app/presenters/group_clusterable_presenter.rb'
- 'app/presenters/group_member_presenter.rb'
- 'app/presenters/instance_clusterable_presenter.rb'
- - 'app/presenters/invitation_presenter.rb'
- 'app/presenters/issue_presenter.rb'
- 'app/presenters/label_presenter.rb'
- 'app/presenters/member_presenter.rb'
@@ -767,7 +765,6 @@ Gitlab/NamespacedClass:
- 'app/workers/emails_on_push_worker.rb'
- 'app/workers/error_tracking_issue_link_worker.rb'
- 'app/workers/expire_build_artifacts_worker.rb'
- - 'app/workers/expire_job_cache_worker.rb'
- 'app/workers/export_csv_worker.rb'
- 'app/workers/external_service_reactive_caching_worker.rb'
- 'app/workers/file_hook_worker.rb'
@@ -783,8 +780,6 @@ Gitlab/NamespacedClass:
- 'app/workers/invalid_gpg_signature_update_worker.rb'
- 'app/workers/issuable_export_csv_worker.rb'
- 'app/workers/issue_due_scheduler_worker.rb'
- - 'app/workers/issue_placement_worker.rb'
- - 'app/workers/issue_rebalancing_worker.rb'
- 'app/workers/member_invitation_reminder_emails_worker.rb'
- 'app/workers/merge_request_cleanup_refs_worker.rb'
- 'app/workers/merge_request_mergeability_check_worker.rb'
@@ -798,7 +793,6 @@ Gitlab/NamespacedClass:
- '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_transfer_worker.rb'
- 'app/workers/pages_worker.rb'
- 'app/workers/partition_creation_worker.rb'
- 'app/workers/pipeline_hooks_worker.rb'
@@ -829,7 +823,6 @@ Gitlab/NamespacedClass:
- '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/run_pipeline_schedule_worker.rb'
- 'app/workers/schedule_merge_request_cleanup_refs_worker.rb'
@@ -861,10 +854,9 @@ Gitlab/NamespacedClass:
- 'ee/app/controllers/sitemap_controller.rb'
- 'ee/app/controllers/smartcard_controller.rb'
- 'ee/app/controllers/subscriptions_controller.rb'
- - 'ee/app/controllers/survey_responses_controller.rb'
- 'ee/app/controllers/trial_registrations_controller.rb'
- 'ee/app/controllers/trials_controller.rb'
- - 'ee/app/finders/audit_log_finder.rb'
+ - 'ee/app/finders/audit_event_finder.rb'
- 'ee/app/finders/billed_users_finder.rb'
- 'ee/app/finders/custom_project_templates_finder.rb'
- 'ee/app/finders/dast_scanner_profiles_finder.rb'
@@ -1013,7 +1005,6 @@ Gitlab/NamespacedClass:
- 'ee/app/serializers/group_analytics_serializer.rb'
- 'ee/app/serializers/group_vulnerability_autocomplete_entity.rb'
- 'ee/app/serializers/group_vulnerability_autocomplete_serializer.rb'
- - 'ee/app/serializers/invited_group_serializer.rb'
- 'ee/app/serializers/iteration_serializer.rb'
- 'ee/app/serializers/license_entity.rb'
- 'ee/app/serializers/license_scanning_reports_serializer.rb'
@@ -1052,7 +1043,6 @@ Gitlab/NamespacedClass:
- 'ee/app/workers/admin_emails_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/elastic_association_indexer_worker.rb'
- 'ee/app/workers/elastic_cluster_reindexing_cron_worker.rb'
- 'ee/app/workers/elastic_commit_indexer_worker.rb'
@@ -1094,7 +1084,6 @@ Gitlab/NamespacedClass:
- 'ee/lib/gitlab/group_plans_preloader.rb'
- 'ee/lib/gitlab/ip_address_state.rb'
- 'ee/lib/gitlab/items_collection.rb'
- - 'ee/lib/gitlab/manual_banner.rb'
- 'ee/lib/gitlab/manual_quarterly_co_term_banner.rb'
- 'ee/lib/gitlab/pagination_delegate.rb'
- 'ee/lib/gitlab/path_locks_finder.rb'
@@ -1106,11 +1095,6 @@ Gitlab/NamespacedClass:
- 'lib/carrier_wave_string_file.rb'
- 'lib/csv_builder.rb'
- 'lib/event_filter.rb'
- - 'lib/feature.rb'
- - 'lib/feature/definition.rb'
- - 'lib/feature/gitaly.rb'
- - 'lib/feature/logger.rb'
- - 'lib/feature/shared.rb'
- 'lib/file_size_validator.rb'
- 'lib/forever.rb'
- 'lib/generators/gitlab/snowplow_event_definition_generator.rb'
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
index e889a05ad36..1977bedd143 100644
--- a/.rubocop_todo/layout/argument_alignment.yml
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -397,7 +397,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/graphql/mutations/requirements_management/export_requirements_spec.rb'
- 'ee/spec/helpers/billing_plans_helper_spec.rb'
- 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'
- - 'ee/spec/helpers/projects/security/policies_helper_spec.rb'
- 'ee/spec/helpers/routing/pseudonymization_helper_spec.rb'
- 'ee/spec/helpers/trial_status_widget_helper_spec.rb'
- 'ee/spec/lib/analytics/group_activity_calculator_spec.rb'
@@ -475,10 +474,8 @@ Layout/ArgumentAlignment:
- 'ee/spec/services/epics/update_service_spec.rb'
- 'ee/spec/services/geo/file_registry_removal_service_spec.rb'
- 'ee/spec/services/geo/repository_verification_primary_service_spec.rb'
- - 'ee/spec/services/groups/recent_merge_requests_count_service_spec.rb'
- 'ee/spec/services/merge_requests/reset_approvals_service_spec.rb'
- 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
- - 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
- 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
- 'ee/spec/services/projects/restore_service_spec.rb'
- 'ee/spec/services/security/merge_reports_service_spec.rb'
@@ -536,7 +533,6 @@ Layout/ArgumentAlignment:
- 'lib/gitlab/background_migration/backfill_project_repositories.rb'
- 'lib/gitlab/background_migration/batching_strategies/base_strategy.rb'
- 'lib/gitlab/background_migration/legacy_upload_mover.rb'
- - 'lib/gitlab/background_migration/migrate_stage_status.rb'
- 'lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb'
- 'lib/gitlab/ci/config/entry/artifacts.rb'
- 'lib/gitlab/ci/config/entry/bridge.rb'
@@ -570,7 +566,6 @@ Layout/ArgumentAlignment:
- 'lib/gitlab/database_importers/instance_administrators/create_group.rb'
- 'lib/gitlab/database_importers/self_monitoring/project/create_service.rb'
- 'lib/gitlab/database_importers/self_monitoring/project/delete_service.rb'
- - 'lib/gitlab/diff/custom_diff.rb'
- 'lib/gitlab/diff/file.rb'
- 'lib/gitlab/diff/file_collection/base.rb'
- 'lib/gitlab/diff/suggestion.rb'
@@ -633,7 +628,6 @@ Layout/ArgumentAlignment:
- 'spec/controllers/projects/pipeline_schedules_controller_spec.rb'
- 'spec/controllers/projects/pipelines/tests_controller_spec.rb'
- 'spec/controllers/projects/pipelines_controller_spec.rb'
- - 'spec/controllers/projects/serverless/functions_controller_spec.rb'
- 'spec/controllers/projects/settings/operations_controller_spec.rb'
- 'spec/controllers/projects/tags_controller_spec.rb'
- 'spec/controllers/projects/todos_controller_spec.rb'
@@ -674,9 +668,6 @@ Layout/ArgumentAlignment:
- 'spec/features/projects/milestones/milestones_sorting_spec.rb'
- 'spec/features/projects/pipelines/pipeline_spec.rb'
- 'spec/features/projects/pipelines/pipelines_spec.rb'
- - 'spec/features/projects/serverless/functions_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/files/editing_a_file_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/files/project_owner_creates_license_file_spec.rb'
- 'spec/finders/ci/commit_statuses_finder_spec.rb'
- 'spec/finders/ci/pipelines_for_merge_request_finder_spec.rb'
- 'spec/finders/clusters/knative_services_finder_spec.rb'
@@ -897,7 +888,6 @@ Layout/ArgumentAlignment:
- 'spec/services/namespaces/package_settings/update_service_spec.rb'
- 'spec/services/notification_service_spec.rb'
- 'spec/services/packages/debian/extract_metadata_service_spec.rb'
- - 'spec/services/pod_logs/kubernetes_service_spec.rb'
- 'spec/services/projects/destroy_service_spec.rb'
- 'spec/services/security/merge_reports_service_spec.rb'
- 'spec/services/system_notes/design_management_service_spec.rb'
@@ -940,8 +930,6 @@ Layout/ArgumentAlignment:
- 'spec/views/projects/merge_requests/_commits.html.haml_spec.rb'
- 'spec/views/projects/merge_requests/edit.html.haml_spec.rb'
- 'spec/views/projects/tags/index.html.haml_spec.rb'
- - 'spec/workers/expire_job_cache_worker_spec.rb'
- - 'spec/workers/expire_pipeline_cache_worker_spec.rb'
- 'spec/workers/pipeline_notification_worker_spec.rb'
- 'spec/workers/remove_unreferenced_lfs_objects_worker_spec.rb'
- 'spec/workers/update_external_pull_requests_worker_spec.rb'
diff --git a/.rubocop_todo/layout/first_array_element_indentation.yml b/.rubocop_todo/layout/first_array_element_indentation.yml
index d613d083f9f..e3bbf9dc25a 100644
--- a/.rubocop_todo/layout/first_array_element_indentation.yml
+++ b/.rubocop_todo/layout/first_array_element_indentation.yml
@@ -51,7 +51,6 @@ Layout/FirstArrayElementIndentation:
- 'ee/app/models/ee/user.rb'
- 'ee/app/models/protected_environment.rb'
- 'ee/app/serializers/dashboard_environments_serializer.rb'
- - 'ee/app/serializers/merge_request_compliance_entity.rb'
- 'ee/app/services/app_sec/dast/profiles/update_service.rb'
- 'ee/app/services/vulnerabilities/create_service_base.rb'
- 'ee/lib/ee/api/helpers/award_emoji.rb'
@@ -90,7 +89,7 @@ Layout/FirstArrayElementIndentation:
- 'ee/spec/lib/gitlab/ci/templates/Jobs/load_performance_testing_gitlab_ci_yaml_spec.rb'
- 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/epics/epic_node_spec.rb'
- - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_links_aggregate_spec.rb'
- 'ee/spec/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_builds_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric_spec.rb'
@@ -147,7 +146,6 @@ Layout/FirstArrayElementIndentation:
- 'lib/gitlab/email/message/in_product_marketing/verify.rb'
- 'lib/gitlab/import_export/base/relation_factory.rb'
- 'lib/gitlab/import_export/json/streaming_serializer.rb'
- - 'lib/gitlab/integrations/sti_type.rb'
- 'lib/gitlab/kroki.rb'
- 'lib/gitlab/object_hierarchy.rb'
- 'lib/gitlab/pagination/keyset/simple_order_builder.rb'
@@ -190,7 +188,6 @@ Layout/FirstArrayElementIndentation:
- 'spec/controllers/projects/pipelines/tests_controller_spec.rb'
- 'spec/controllers/projects/pipelines_controller_spec.rb'
- 'spec/deprecation_toolkit_env.rb'
- - 'spec/experiments/new_project_sast_enabled_experiment_spec.rb'
- 'spec/features/clusters/create_agent_spec.rb'
- 'spec/features/issues/filtered_search/filter_issues_spec.rb'
- 'spec/features/issues/filtered_search/visual_tokens_spec.rb'
@@ -243,7 +240,6 @@ Layout/FirstArrayElementIndentation:
- 'spec/lib/gitlab/database/similarity_score_spec.rb'
- 'spec/lib/gitlab/diff/char_diff_spec.rb'
- 'spec/lib/gitlab/diff/file_collection_sorter_spec.rb'
- - 'spec/lib/gitlab/elasticsearch/logs/pods_spec.rb'
- 'spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb'
- 'spec/lib/gitlab/gitaly_client/blob_service_spec.rb'
- 'spec/lib/gitlab/github_import/parallel_scheduling_spec.rb'
@@ -285,7 +281,6 @@ Layout/FirstArrayElementIndentation:
- 'spec/models/ci/pipeline_spec.rb'
- 'spec/models/ci/unit_test_spec.rb'
- 'spec/models/clusters/applications/cert_manager_spec.rb'
- - 'spec/models/clusters/applications/elastic_stack_spec.rb'
- 'spec/models/clusters/platforms/kubernetes_spec.rb'
- 'spec/models/commit_collection_spec.rb'
- 'spec/models/compare_spec.rb'
diff --git a/.rubocop_todo/layout/first_hash_element_indentation.yml b/.rubocop_todo/layout/first_hash_element_indentation.yml
index 6000d3ea1af..22d66dcb8c1 100644
--- a/.rubocop_todo/layout/first_hash_element_indentation.yml
+++ b/.rubocop_todo/layout/first_hash_element_indentation.yml
@@ -84,7 +84,6 @@ Layout/FirstHashElementIndentation:
- 'ee/app/helpers/ee/ci/jobs_helper.rb'
- 'ee/app/helpers/ee/geo_helper.rb'
- 'ee/app/helpers/ee/groups/group_members_helper.rb'
- - 'ee/app/helpers/ee/ide_helper.rb'
- 'ee/app/helpers/ee/projects_helper.rb'
- 'ee/app/helpers/ee/sidebars_helper.rb'
- 'ee/app/helpers/ee/tree_helper.rb'
@@ -149,8 +148,6 @@ Layout/FirstHashElementIndentation:
- 'ee/spec/helpers/ee/projects/security/sast_configuration_helper_spec.rb'
- 'ee/spec/helpers/groups/sso_helper_spec.rb'
- 'ee/spec/helpers/nav/new_dropdown_helper_spec.rb'
- - 'ee/spec/helpers/projects/security/policies_helper_spec.rb'
- - 'ee/spec/helpers/projects/threat_monitoring_helper_spec.rb'
- 'ee/spec/helpers/projects_helper_spec.rb'
- 'ee/spec/helpers/routing/pseudonymization_helper_spec.rb'
- 'ee/spec/helpers/search_helper_spec.rb'
@@ -267,8 +264,6 @@ Layout/FirstHashElementIndentation:
- 'lib/gitlab/github_import/importer/diff_note_importer.rb'
- 'lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb'
- 'lib/gitlab/gitlab_import/client.rb'
- - 'lib/gitlab/graphql/query_analyzers/logger_analyzer.rb'
- - 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
- 'lib/gitlab/hook_data/issue_builder.rb'
- 'lib/gitlab/hook_data/release_builder.rb'
- 'lib/gitlab/kubernetes.rb'
@@ -410,7 +405,6 @@ Layout/FirstHashElementIndentation:
- 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
- 'spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb'
- 'spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb'
- - 'spec/lib/gitlab/ci/reports/coverage_reports_spec.rb'
- 'spec/lib/gitlab/ci/reports/security/identifier_spec.rb'
- 'spec/lib/gitlab/ci/reports/security/scanner_spec.rb'
- 'spec/lib/gitlab/ci/reports/terraform_reports_spec.rb'
@@ -434,10 +428,8 @@ Layout/FirstHashElementIndentation:
- 'spec/lib/gitlab/github_import/logger_spec.rb'
- 'spec/lib/gitlab/github_import/object_counter_spec.rb'
- 'spec/lib/gitlab/gpg_spec.rb'
- - 'spec/lib/gitlab/graphql/query_analyzers/logger_analyzer_spec.rb'
- 'spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb'
- 'spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb'
- - 'spec/lib/gitlab/hook_data/issuable_builder_spec.rb'
- 'spec/lib/gitlab/http_spec.rb'
- 'spec/lib/gitlab/i18n_spec.rb'
- 'spec/lib/gitlab/import/logger_spec.rb'
@@ -531,9 +523,6 @@ Layout/FirstHashElementIndentation:
- 'spec/services/metrics/dashboard/transient_embed_service_spec.rb'
- 'spec/services/notes/render_service_spec.rb'
- 'spec/services/packages/debian/parse_debian822_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/container_repository/delete_tags_service_spec.rb'
- 'spec/services/projects/create_from_template_service_spec.rb'
- 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
@@ -555,7 +544,6 @@ Layout/FirstHashElementIndentation:
- 'spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb'
- 'spec/support/shared_examples/models/clusters/prometheus_client_shared.rb'
- 'spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb'
- - 'spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb'
- 'spec/support/shared_examples/requests/rack_attack_shared_examples.rb'
- 'spec/support_specs/graphql/arguments_spec.rb'
- 'spec/support_specs/graphql/field_selection_spec.rb'
diff --git a/.rubocop_todo/layout/hash_alignment.yml b/.rubocop_todo/layout/hash_alignment.yml
index 2125c032437..d6772537f47 100644
--- a/.rubocop_todo/layout/hash_alignment.yml
+++ b/.rubocop_todo/layout/hash_alignment.yml
@@ -356,7 +356,6 @@ Layout/HashAlignment:
- 'ee/app/services/epics/issue_promote_service.rb'
- 'ee/app/services/external_status_checks/create_service.rb'
- 'ee/app/services/groups/memberships/export_service.rb'
- - 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
- 'ee/app/services/projects/setup_ci_cd.rb'
- 'ee/app/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service.rb'
- 'ee/config/routes/project.rb'
@@ -382,7 +381,6 @@ Layout/HashAlignment:
- 'ee/lib/gitlab/ci/parsers/security/formatters/dependency_list.rb'
- 'ee/lib/gitlab/elastic/helper.rb'
- 'ee/lib/gitlab/elastic/indexer.rb'
- - 'ee/lib/gitlab/geo/replication/base_transfer.rb'
- 'ee/spec/controllers/ee/projects/variables_controller_spec.rb'
- 'ee/spec/controllers/groups/epic_boards_controller_spec.rb'
- 'ee/spec/controllers/groups/issues_controller_spec.rb'
@@ -610,7 +608,6 @@ Layout/HashAlignment:
- 'spec/lib/gitlab/etag_caching/router/graphql_spec.rb'
- 'spec/lib/gitlab/git/repository_spec.rb'
- 'spec/lib/gitlab/grape_logging/formatters/lograge_with_timestamp_spec.rb'
- - 'spec/lib/gitlab/hook_data/issuable_builder_spec.rb'
- 'spec/lib/gitlab/import_export/attributes_finder_spec.rb'
- 'spec/lib/gitlab/import_export/group/object_builder_spec.rb'
- 'spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb'
@@ -688,7 +685,6 @@ Layout/HashAlignment:
- 'spec/services/ci/create_pipeline_service/logger_spec.rb'
- 'spec/services/ci/create_pipeline_service/tags_spec.rb'
- 'spec/services/ci/job_artifacts/create_service_spec.rb'
- - 'spec/services/ci/retry_build_service_spec.rb'
- 'spec/services/deployments/link_merge_requests_service_spec.rb'
- 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
- 'spec/services/groups/import_export/import_service_spec.rb'
diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index 6315f5dd28b..7d2674c34f8 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -88,7 +88,6 @@ Layout/LineLength:
- 'app/controllers/projects/issues_controller.rb'
- 'app/controllers/projects/jobs_controller.rb'
- 'app/controllers/projects/labels_controller.rb'
- - 'app/controllers/projects/logs_controller.rb'
- 'app/controllers/projects/merge_requests/conflicts_controller.rb'
- 'app/controllers/projects/merge_requests/creations_controller.rb'
- 'app/controllers/projects/merge_requests/diffs_controller.rb'
@@ -341,7 +340,6 @@ Layout/LineLength:
- 'app/models/ci/unit_test.rb'
- 'app/models/clusters/agent.rb'
- 'app/models/clusters/applications/cert_manager.rb'
- - 'app/models/clusters/applications/elastic_stack.rb'
- 'app/models/clusters/applications/knative.rb'
- 'app/models/clusters/applications/prometheus.rb'
- 'app/models/clusters/cluster.rb'
@@ -566,7 +564,6 @@ Layout/LineLength:
- 'app/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service.rb'
- 'app/services/ci/pipelines/add_job_service.rb'
- 'app/services/ci/prometheus_metrics/observe_histograms_service.rb'
- - 'app/services/ci/queue/builds_table_strategy.rb'
- 'app/services/ci/queue/pending_builds_strategy.rb'
- 'app/services/ci/runners/register_runner_service.rb'
- 'app/services/ci/runners/unregister_runner_service.rb'
@@ -619,7 +616,6 @@ Layout/LineLength:
- 'app/services/import/bitbucket_server_service.rb'
- 'app/services/import/github_service.rb'
- 'app/services/import/validate_remote_git_endpoint_service.rb'
- - 'app/services/issuable/clone/attributes_rewriter.rb'
- 'app/services/issuable/import_csv/base_service.rb'
- 'app/services/issuable/process_assignees.rb'
- 'app/services/issuable_base_service.rb'
@@ -696,8 +692,6 @@ Layout/LineLength:
- 'app/services/pages/migrate_legacy_storage_to_deployment_service.rb'
- 'app/services/personal_access_tokens/create_service.rb'
- 'app/services/personal_access_tokens/revoke_service.rb'
- - 'app/services/pod_logs/elasticsearch_service.rb'
- - 'app/services/pod_logs/kubernetes_service.rb'
- 'app/services/projects/branches_by_mode_service.rb'
- 'app/services/projects/container_repository/cleanup_tags_service.rb'
- 'app/services/projects/container_repository/gitlab/delete_tags_service.rb'
@@ -733,7 +727,6 @@ Layout/LineLength:
- 'app/services/security/ci_configuration/sast_iac_create_service.rb'
- 'app/services/security/ci_configuration/sast_parser_service.rb'
- 'app/services/security/ci_configuration/secret_detection_create_service.rb'
- - 'app/services/service_ping/devops_report_service.rb'
- 'app/services/service_ping/submit_service.rb'
- 'app/services/snippets/count_service.rb'
- 'app/services/snippets/create_service.rb'
@@ -782,7 +775,6 @@ Layout/LineLength:
- 'app/workers/gitlab/jira_import/stage/import_notes_worker.rb'
- 'app/workers/integrations/create_external_cross_reference_worker.rb'
- 'app/workers/issuable_export_csv_worker.rb'
- - 'app/workers/issue_rebalancing_worker.rb'
- 'app/workers/issues/rebalancing_worker.rb'
- 'app/workers/jira_connect/sync_branch_worker.rb'
- 'app/workers/jira_connect/sync_merge_request_worker.rb'
@@ -984,7 +976,6 @@ Layout/LineLength:
- 'db/migrate/20220215164709_update_application_settings_container_registry_exp_pol_worker_capacity_default.rb'
- 'db/migrate/20220216110023_create_saved_replies.rb'
- 'db/migrate/20220217100008_add_container_registry_expiration_policies_caching_to_application_settings.rb'
- - 'db/migrate/20220221102333_change_maintenance_note_limit_in_ci_runner.rb db/migrate/20220221102333_change_maintainer_note_limit_in_ci_runner.rb'
- 'db/migrate/20220222072536_add_target_access_levels_to_broadcast_messages.rb'
- 'db/migrate/20220301003502_add_security_orchestration_policy_configuration_namespace_index.rb'
- 'db/migrate/20220301175104_change_security_orchestration_policy_configuration_project_index.rb'
@@ -1127,7 +1118,7 @@ Layout/LineLength:
- 'ee/app/controllers/admin/geo/application_controller.rb'
- 'ee/app/controllers/admin/geo/projects_controller.rb'
- 'ee/app/controllers/admin/licenses_controller.rb'
- - 'ee/app/controllers/concerns/audit_events/audit_logs_params.rb'
+ - 'ee/app/controllers/concerns/audit_events/audit_events_params.rb'
- 'ee/app/controllers/concerns/audit_events/date_range.rb'
- 'ee/app/controllers/concerns/credentials_inventory_actions.rb'
- 'ee/app/controllers/concerns/ee/issuable_collections.rb'
@@ -1319,7 +1310,6 @@ Layout/LineLength:
- 'ee/app/helpers/projects/security/dast_profiles_helper.rb'
- 'ee/app/helpers/projects/security/discover_helper.rb'
- 'ee/app/helpers/push_rules_helper.rb'
- - 'ee/app/helpers/seats_count_alert_helper.rb'
- 'ee/app/helpers/security_helper.rb'
- 'ee/app/helpers/trial_status_widget_helper.rb'
- 'ee/app/helpers/vulnerabilities_helper.rb'
@@ -1394,7 +1384,6 @@ Layout/LineLength:
- 'ee/app/models/gitlab_subscriptions/features.rb'
- 'ee/app/models/incident_management/escalation_policy.rb'
- 'ee/app/models/incident_management/oncall_rotation.rb'
- - 'ee/app/models/incident_management/timeline_event.rb'
- 'ee/app/models/integrations/github.rb'
- 'ee/app/models/issuable_sla.rb'
- 'ee/app/models/iterations/cadence.rb'
@@ -1428,7 +1417,6 @@ Layout/LineLength:
- 'ee/app/policies/ee/identity_provider_policy.rb'
- 'ee/app/policies/ee/project_policy.rb'
- 'ee/app/presenters/dast/site_profile_presenter.rb'
- - 'ee/app/presenters/ee/commit_status_presenter.rb'
- 'ee/app/presenters/ee/merge_request_presenter.rb'
- 'ee/app/serializers/dashboard_environment_entity.rb'
- 'ee/app/serializers/ee/environment_entity.rb'
@@ -1438,7 +1426,6 @@ Layout/LineLength:
- 'ee/app/serializers/ee/note_user_entity.rb'
- 'ee/app/serializers/ee/user_entity.rb'
- 'ee/app/serializers/vulnerabilities/feedback_entity.rb'
- - 'ee/app/services/alert_management/metric_images/upload_service.rb'
- 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb'
- 'ee/app/services/analytics/cycle_analytics/value_streams/create_service.rb'
- 'ee/app/services/analytics/devops_adoption/enabled_namespaces/find_or_create_service.rb'
@@ -1517,7 +1504,6 @@ Layout/LineLength:
- 'ee/app/services/ee/users/update_service.rb'
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
- 'ee/app/services/elastic/indexing_control_service.rb'
- - 'ee/app/services/epic_links/list_service.rb'
- 'ee/app/services/epics/issue_promote_service.rb'
- 'ee/app/services/epics/update_service.rb'
- 'ee/app/services/external_status_checks/create_service.rb'
@@ -1557,8 +1543,6 @@ Layout/LineLength:
- 'ee/app/services/merge_requests/create_from_vulnerability_data_service.rb'
- 'ee/app/services/merge_trains/create_pipeline_service.rb'
- 'ee/app/services/merge_trains/refresh_merge_request_service.rb'
- - 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
- - 'ee/app/services/namespaces/check_storage_size_service.rb'
- 'ee/app/services/personal_access_tokens/rotation_verifier_service.rb'
- 'ee/app/services/projects/licenses/create_policy_service.rb'
- 'ee/app/services/projects/mark_for_deletion_service.rb'
@@ -1567,7 +1551,6 @@ Layout/LineLength:
- 'ee/app/services/resource_events/change_weight_service.rb'
- 'ee/app/services/security/auto_fix_service.rb'
- 'ee/app/services/security/dependency_list_service.rb'
- - 'ee/app/services/security/ingestion/bulk_updatable_task.rb'
- 'ee/app/services/security/ingestion/finding_map.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_remediations.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_vulnerabilities/create.rb'
@@ -1661,7 +1644,6 @@ Layout/LineLength:
- 'ee/elastic/migrate/20210510143200_delete_notes_from_original_index.rb'
- 'ee/lib/analytics/devops_adoption/snapshot_calculator.rb'
- 'ee/lib/analytics/productivity_analytics_request_params.rb'
- - 'ee/lib/api/alert_management_alerts.rb'
- 'ee/lib/api/analytics/code_review_analytics.rb'
- 'ee/lib/api/audit_events.rb'
- 'ee/lib/api/ci/minutes.rb'
@@ -1810,7 +1792,6 @@ Layout/LineLength:
- 'ee/lib/gitlab/geo/jwt_request_decoder.rb'
- 'ee/lib/gitlab/geo/log_cursor/events/repository_created_event.rb'
- 'ee/lib/gitlab/geo/registry_batcher.rb'
- - 'ee/lib/gitlab/geo/replication/base_transfer.rb'
- 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
- 'ee/lib/gitlab/geo/replicator.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb'
@@ -1832,7 +1813,6 @@ Layout/LineLength:
- 'ee/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric.rb'
- 'ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb'
- 'ee/lib/gitlab/usage_data_counters/license_testing_counter.rb'
- - 'ee/lib/system_check/app/elasticsearch_check.rb'
- 'ee/lib/system_check/geo/authorized_keys_check.rb'
- 'ee/lib/system_check/geo/current_node_check.rb'
- 'ee/lib/system_check/geo/geo_database_configured_check.rb'
@@ -1861,7 +1841,6 @@ Layout/LineLength:
- 'ee/spec/controllers/groups/analytics/tasks_by_type_controller_spec.rb'
- 'ee/spec/controllers/groups/audit_events_controller_spec.rb'
- 'ee/spec/controllers/groups/epic_issues_controller_spec.rb'
- - 'ee/spec/controllers/groups/epic_links_controller_spec.rb'
- 'ee/spec/controllers/groups/epics_controller_spec.rb'
- 'ee/spec/controllers/groups/group_members_controller_spec.rb'
- 'ee/spec/controllers/groups/groups_controller_spec.rb'
@@ -1889,7 +1868,6 @@ Layout/LineLength:
- 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
- 'ee/spec/controllers/projects/security/vulnerabilities_controller_spec.rb'
- 'ee/spec/controllers/projects/subscriptions_controller_spec.rb'
- - 'ee/spec/controllers/projects/threat_monitoring_controller_spec.rb'
- 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
- 'ee/spec/controllers/projects_controller_spec.rb'
- 'ee/spec/controllers/registrations/groups_controller_spec.rb'
@@ -1924,7 +1902,6 @@ Layout/LineLength:
- 'ee/spec/features/admin/geo/admin_geo_nodes_spec.rb'
- 'ee/spec/features/admin/groups/admin_changes_plan_spec.rb'
- 'ee/spec/features/admin/groups/admin_subscription_alerts_spec.rb'
- - 'ee/spec/features/admin/licenses/admin_uploads_license_spec.rb'
- 'ee/spec/features/admin/subscriptions/admin_views_subscription_spec.rb'
- 'ee/spec/features/billings/billing_plans_spec.rb'
- 'ee/spec/features/billings/extend_reactivate_trial_spec.rb'
@@ -1942,7 +1919,6 @@ Layout/LineLength:
- 'ee/spec/features/epics/epics_list_spec.rb'
- 'ee/spec/features/epics/issue_promotion_spec.rb'
- 'ee/spec/features/geo_node_spec.rb'
- - 'ee/spec/features/gitlab_subscriptions/seats_count_alert_spec.rb'
- 'ee/spec/features/google_analytics_datalayer_spec.rb'
- 'ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb'
- 'ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb'
@@ -1967,7 +1943,6 @@ Layout/LineLength:
- 'ee/spec/features/groups/security/compliance_dashboards_spec.rb'
- 'ee/spec/features/groups/sso_spec.rb'
- 'ee/spec/features/groups/usage_quotas_spec.rb'
- - 'ee/spec/features/incidents/incident_details_spec.rb'
- 'ee/spec/features/integrations/jira/jira_issues_list_spec.rb'
- 'ee/spec/features/invites_spec.rb'
- 'ee/spec/features/issues/filtered_search/filter_issues_weight_spec.rb'
@@ -2022,7 +1997,7 @@ Layout/LineLength:
- 'ee/spec/features/users/login_spec.rb'
- 'ee/spec/finders/analytics/devops_adoption/enabled_namespaces_finder_spec.rb'
- 'ee/spec/finders/analytics/devops_adoption/snapshots_finder_spec.rb'
- - 'ee/spec/finders/audit_log_finder_spec.rb'
+ - 'ee/spec/finders/audit_event_finder_spec.rb'
- 'ee/spec/finders/billed_users_finder_spec.rb'
- 'ee/spec/finders/boards/users_finder_spec.rb'
- 'ee/spec/finders/compliance_management/merge_requests/compliance_violations_finder_spec.rb'
@@ -2033,7 +2008,6 @@ Layout/LineLength:
- 'ee/spec/finders/ee/projects_finder_spec.rb'
- 'ee/spec/finders/epics_finder_spec.rb'
- 'ee/spec/finders/geo/container_repository_registry_finder_spec.rb'
- - 'ee/spec/finders/geo/job_artifact_legacy_registry_finder_spec.rb'
- 'ee/spec/finders/geo/project_registry_finder_spec.rb'
- 'ee/spec/finders/geo/project_registry_status_finder_spec.rb'
- 'ee/spec/finders/group_projects_finder_spec.rb'
@@ -2042,7 +2016,6 @@ Layout/LineLength:
- 'ee/spec/finders/incident_management/member_oncall_rotations_finder_spec.rb'
- 'ee/spec/finders/incident_management/oncall_rotations_finder_spec.rb'
- 'ee/spec/finders/incident_management/oncall_users_finder_spec.rb'
- - 'ee/spec/finders/incident_management/timeline_events_finder_spec.rb'
- 'ee/spec/finders/issues_finder_spec.rb'
- 'ee/spec/finders/iterations/cadences_finder_spec.rb'
- 'ee/spec/finders/iterations_finder_spec.rb'
@@ -2093,7 +2066,6 @@ Layout/LineLength:
- 'ee/spec/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
- 'ee/spec/graphql/mutations/incident_management/oncall_schedule/create_spec.rb'
- 'ee/spec/graphql/mutations/incident_management/oncall_schedule/update_spec.rb'
- - 'ee/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb'
- 'ee/spec/graphql/mutations/instance_security_dashboard/add_project_spec.rb'
- 'ee/spec/graphql/mutations/instance_security_dashboard/remove_project_spec.rb'
- 'ee/spec/graphql/mutations/issues/create_spec.rb'
@@ -2119,7 +2091,6 @@ Layout/LineLength:
- 'ee/spec/graphql/resolvers/incident_management/escalation_policies_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/incident_management/oncall_rotations_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/incident_management/oncall_schedule_resolver_spec.rb'
- - 'ee/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/iterations/cadences_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/iterations_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/network_policy_resolver_spec.rb'
@@ -2203,7 +2174,6 @@ Layout/LineLength:
- 'ee/spec/helpers/push_rules_helper_spec.rb'
- 'ee/spec/helpers/routing/pseudonymization_helper_spec.rb'
- 'ee/spec/helpers/search_helper_spec.rb'
- - 'ee/spec/helpers/seats_count_alert_helper_spec.rb'
- 'ee/spec/helpers/security_helper_spec.rb'
- 'ee/spec/helpers/subscriptions_helper_spec.rb'
- 'ee/spec/helpers/timeboxes_helper_spec.rb'
@@ -2349,18 +2319,12 @@ Layout/LineLength:
- 'ee/spec/lib/gitlab/geo/geo_tasks_spec.rb'
- 'ee/spec/lib/gitlab/geo/git_ssh_proxy_spec.rb'
- 'ee/spec/lib/gitlab/geo/health_check_spec.rb'
- - 'ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb'
- 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb'
- 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb'
- 'ee/spec/lib/gitlab/geo/log_cursor/lease_spec.rb'
- 'ee/spec/lib/gitlab/geo/oauth/login_state_spec.rb'
- 'ee/spec/lib/gitlab/geo/oauth/logout_token_spec.rb'
- 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/file_retriever_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/job_artifact_downloader_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/job_artifact_retriever_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb'
- 'ee/spec/lib/gitlab/geo_spec.rb'
- 'ee/spec/lib/gitlab/git_access_spec.rb'
- 'ee/spec/lib/gitlab/git_access_wiki_spec.rb'
@@ -2408,7 +2372,6 @@ Layout/LineLength:
- 'ee/spec/lib/omni_auth/strategies/group_saml_spec.rb'
- 'ee/spec/lib/peek/views/elasticsearch_spec.rb'
- 'ee/spec/lib/sidebars/groups/menus/security_compliance_menu_spec.rb'
- - 'ee/spec/lib/system_check/app/elasticsearch_check_spec.rb'
- 'ee/spec/lib/system_check/geo/authorized_keys_check_spec.rb'
- 'ee/spec/lib/system_check/geo/http_connection_check_spec.rb'
- 'ee/spec/mailers/ee/emails/issues_spec.rb'
@@ -2447,7 +2410,6 @@ Layout/LineLength:
- 'ee/spec/models/ci/daily_build_group_report_result_spec.rb'
- 'ee/spec/models/ci/minutes/namespace_monthly_usage_spec.rb'
- 'ee/spec/models/ci/minutes/project_monthly_usage_spec.rb'
- - 'ee/spec/models/ci/minutes/quota_spec.rb'
- 'ee/spec/models/ci/pipeline_spec.rb'
- 'ee/spec/models/ci/subscriptions/project_spec.rb'
- 'ee/spec/models/concerns/ee/clusters/agents/authorization_config_scopes_spec.rb'
@@ -2523,7 +2485,6 @@ Layout/LineLength:
- 'ee/spec/models/incident_management/issuable_escalation_status_spec.rb'
- 'ee/spec/models/incident_management/oncall_rotation_spec.rb'
- 'ee/spec/models/incident_management/oncall_shift_spec.rb'
- - 'ee/spec/models/incident_management/timeline_event_spec.rb'
- 'ee/spec/models/instance_security_dashboard_spec.rb'
- 'ee/spec/models/integrations/chat_message/vulnerability_message_spec.rb'
- 'ee/spec/models/integrations/github_spec.rb'
@@ -2591,7 +2552,6 @@ Layout/LineLength:
- 'ee/spec/requests/admin/credentials_controller_spec.rb'
- 'ee/spec/requests/admin/geo/replicables_controller_spec.rb'
- 'ee/spec/requests/admin/user_permission_exports_controller_spec.rb'
- - 'ee/spec/requests/api/alert_management_alerts_spec.rb'
- 'ee/spec/requests/api/analytics/code_review_analytics_spec.rb'
- 'ee/spec/requests/api/audit_events_spec.rb'
- 'ee/spec/requests/api/branches_spec.rb'
@@ -2643,7 +2603,6 @@ Layout/LineLength:
- 'ee/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/epic_tree/reorder_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/epics/add_issue_spec.rb'
- - 'ee/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/issues/create_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/issues/set_weight_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/iterations/cadences/create_spec.rb'
@@ -2667,7 +2626,6 @@ Layout/LineLength:
- 'ee/spec/requests/api/graphql/project/incident_management/escalation_policies_spec.rb'
- 'ee/spec/requests/api/graphql/project/incident_management/escalation_policy/rules_spec.rb'
- 'ee/spec/requests/api/graphql/project/incident_management/oncall_shifts_spec.rb'
- - 'ee/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb'
- 'ee/spec/requests/api/graphql/project/issues_spec.rb'
- 'ee/spec/requests/api/graphql/project/pipeline/security_report_summary_spec.rb'
- 'ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb'
@@ -2733,7 +2691,6 @@ Layout/LineLength:
- 'ee/spec/requests/rack_attack_global_spec.rb'
- 'ee/spec/requests/repositories/git_http_controller_spec.rb'
- 'ee/spec/requests/smartcard_controller_spec.rb'
- - 'ee/spec/requests/survey_responses_controller_spec.rb'
- 'ee/spec/routing/admin_routing_spec.rb'
- 'ee/spec/routing/group_routing_spec.rb'
- 'ee/spec/routing/groups/cadences_routing_spec.rb'
@@ -2750,7 +2707,6 @@ Layout/LineLength:
- 'ee/spec/serializers/integrations/jira_serializers/issue_detail_entity_spec.rb'
- 'ee/spec/serializers/integrations/jira_serializers/issue_entity_spec.rb'
- 'ee/spec/serializers/member_entity_spec.rb'
- - 'ee/spec/serializers/merge_request_compliance_entity_spec.rb'
- 'ee/spec/serializers/project_mirror_entity_spec.rb'
- 'ee/spec/serializers/security/license_policy_entity_spec.rb'
- 'ee/spec/serializers/status_page/renderer_spec.rb'
@@ -2758,7 +2714,6 @@ Layout/LineLength:
- 'ee/spec/serializers/vulnerabilities/finding_entity_spec.rb'
- 'ee/spec/serializers/vulnerabilities/finding_reports_comparer_entity_spec.rb'
- 'ee/spec/serializers/vulnerabilities/finding_serializer_spec.rb'
- - 'ee/spec/services/alert_management/metric_images/upload_service_spec.rb'
- 'ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb'
- 'ee/spec/services/analytics/cycle_analytics/consistency_check_service_spec.rb'
- 'ee/spec/services/analytics/cycle_analytics/data_loader_service_spec.rb'
@@ -2824,13 +2779,10 @@ Layout/LineLength:
- 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
- 'ee/spec/services/ee/boards/lists/max_limits_spec.rb'
- 'ee/spec/services/ee/ci/pipeline_processing/atomic_processing_service_spec.rb'
- - 'ee/spec/services/ee/commits/create_service_spec.rb'
- 'ee/spec/services/ee/git/wiki_push_service_spec.rb'
- 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
- 'ee/spec/services/ee/groups/deploy_tokens/create_service_spec.rb'
- 'ee/spec/services/ee/groups/import_export/export_service_spec.rb'
- - 'ee/spec/services/ee/incident_management/issuable_escalation_statuses/after_update_service_spec.rb'
- - 'ee/spec/services/ee/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb'
- 'ee/spec/services/ee/ip_restrictions/update_service_spec.rb'
- 'ee/spec/services/ee/issuable/common_system_notes_service_spec.rb'
- 'ee/spec/services/ee/issuable/destroy_service_spec.rb'
@@ -2852,7 +2804,6 @@ Layout/LineLength:
- 'ee/spec/services/ee/projects/autocomplete_service_spec.rb'
- 'ee/spec/services/ee/projects/deploy_tokens/create_service_spec.rb'
- 'ee/spec/services/ee/resource_events/merge_into_notes_service_spec.rb'
- - 'ee/spec/services/ee/service_ping/service_ping_settings_spec.rb'
- 'ee/spec/services/ee/system_notes/issuables_service_spec.rb'
- 'ee/spec/services/ee/users/destroy_service_spec.rb'
- 'ee/spec/services/ee/users/migrate_to_ghost_user_service_spec.rb'
@@ -2862,7 +2813,6 @@ Layout/LineLength:
- 'ee/spec/services/elastic/indexing_control_service_spec.rb'
- 'ee/spec/services/elastic/process_initial_bookkeeping_service_spec.rb'
- 'ee/spec/services/epic_issues/create_service_spec.rb'
- - 'ee/spec/services/epic_links/create_service_spec.rb'
- 'ee/spec/services/epics/issue_promote_service_spec.rb'
- 'ee/spec/services/epics/related_epic_links/create_service_spec.rb'
- 'ee/spec/services/epics/tree_reorder_service_spec.rb'
@@ -2923,7 +2873,6 @@ Layout/LineLength:
- 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
- 'ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb'
- 'ee/spec/services/merge_trains/refresh_service_spec.rb'
- - 'ee/spec/services/namespaces/check_excess_storage_size_service_spec.rb'
- 'ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb'
- 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
- 'ee/spec/services/projects/alerting/notify_service_spec.rb'
@@ -2981,7 +2930,6 @@ Layout/LineLength:
- 'ee/spec/services/start_pull_mirroring_service_spec.rb'
- 'ee/spec/services/status_page/publish_attachments_service_spec.rb'
- 'ee/spec/services/system_notes/escalations_service_spec.rb'
- - 'ee/spec/services/system_notes/incidents_service_spec.rb'
- 'ee/spec/services/system_notes/merge_train_service_spec.rb'
- 'ee/spec/services/timebox_report_service_spec.rb'
- 'ee/spec/services/todo_service_spec.rb'
@@ -3049,7 +2997,6 @@ Layout/LineLength:
- 'ee/spec/support/shared_examples/quick_actions/merge_request/unassign_reviewer_shared_examples.rb'
- 'ee/spec/support/shared_examples/requests/api/graphql/geo/registries_shared_examples.rb'
- 'ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb'
- - 'ee/spec/support/shared_examples/serializers/license_compliance/comparer_entity_examples.rb'
- 'ee/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb'
@@ -3068,7 +3015,6 @@ Layout/LineLength:
- 'ee/spec/tasks/geo/git_rake_spec.rb'
- 'ee/spec/tasks/geo_rake_spec.rb'
- 'ee/spec/tasks/gitlab/geo_rake_spec.rb'
- - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
- 'ee/spec/validators/json_schema_validator_spec.rb'
- 'ee/spec/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb'
- 'ee/spec/views/admin/application_settings/general.html.haml_spec.rb'
@@ -3080,7 +3026,6 @@ Layout/LineLength:
- 'ee/spec/views/layouts/header/help_dropdown/_cross_stage_fdm.html.haml_spec.rb'
- 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
- 'ee/spec/views/operations/environments.html.haml_spec.rb'
- - 'ee/spec/views/projects/protected_environments/_protected_environment.html.haml_spec.rb'
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
- 'ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb'
- 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
@@ -3134,7 +3079,6 @@ Layout/LineLength:
- 'ee/spec/workers/iterations/roll_over_issues_worker_spec.rb'
- 'ee/spec/workers/iterations_update_status_worker_spec.rb'
- 'ee/spec/workers/merge_request_reset_approvals_worker_spec.rb'
- - 'ee/spec/workers/network_policy_metrics_worker_spec.rb'
- 'ee/spec/workers/new_epic_worker_spec.rb'
- 'ee/spec/workers/refresh_license_compliance_checks_worker_spec.rb'
- 'ee/spec/workers/repository_import_worker_spec.rb'
@@ -3273,7 +3217,6 @@ Layout/LineLength:
- 'lib/api/todos.rb'
- 'lib/api/users.rb'
- 'lib/api/wikis.rb'
- - 'lib/atlassian/jira_connect/asymmetric_jwt.rb'
- 'lib/atlassian/jira_connect/client.rb'
- 'lib/atlassian/jira_connect/serializers/repository_entity.rb'
- 'lib/backup.rb'
@@ -3324,7 +3267,6 @@ Layout/LineLength:
- 'lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end.rb'
- 'lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start.rb'
- 'lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb'
- - 'lib/gitlab/analytics/unique_visits.rb'
- 'lib/gitlab/application_context.rb'
- 'lib/gitlab/application_rate_limiter.rb'
- 'lib/gitlab/asciidoc.rb'
@@ -3485,7 +3427,6 @@ Layout/LineLength:
- 'lib/gitlab/diff/highlight_cache.rb'
- 'lib/gitlab/diff/parser.rb'
- 'lib/gitlab/diff/rendered/notebook/diff_file.rb'
- - 'lib/gitlab/elasticsearch/logs/lines.rb'
- 'lib/gitlab/email/failure_handler.rb'
- 'lib/gitlab/email/handler/create_issue_handler.rb'
- 'lib/gitlab/email/handler/create_merge_request_handler.rb'
@@ -3550,8 +3491,6 @@ Layout/LineLength:
- 'lib/gitlab/grape_logging/loggers/client_env_logger.rb'
- 'lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb'
- 'lib/gitlab/graphql/pagination/keyset/query_builder.rb'
- - 'lib/gitlab/graphql/query_analyzers/logger_analyzer.rb'
- - 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
- 'lib/gitlab/graphql/timeout.rb'
- 'lib/gitlab/group_search_results.rb'
- 'lib/gitlab/hashed_storage/migrator.rb'
@@ -3583,10 +3522,8 @@ Layout/LineLength:
- 'lib/gitlab/jira_import.rb'
- 'lib/gitlab/jira_import/base_importer.rb'
- 'lib/gitlab/jira_import/issues_importer.rb'
- - 'lib/gitlab/kubernetes/cilium_network_policy.rb'
- 'lib/gitlab/kubernetes/helm/pod.rb'
- 'lib/gitlab/kubernetes/kubectl_cmd.rb'
- - 'lib/gitlab/kubernetes/network_policy.rb'
- 'lib/gitlab/kubernetes/pod_cmd.rb'
- 'lib/gitlab/legacy_github_import/importer.rb'
- 'lib/gitlab/legacy_github_import/project_creator.rb'
@@ -3597,7 +3534,6 @@ Layout/LineLength:
- 'lib/gitlab/merge_requests/commit_message_generator.rb'
- 'lib/gitlab/metrics/dashboard/importer.rb'
- 'lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb'
- - 'lib/gitlab/metrics/dashboard/stages/alerts_inserter.rb'
- 'lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb'
- 'lib/gitlab/metrics/dashboard/stages/custom_metrics_details_inserter.rb'
- 'lib/gitlab/metrics/dashboard/stages/metric_endpoint_inserter.rb'
@@ -3794,7 +3730,6 @@ Layout/LineLength:
- 'qa/qa/scenario/template.rb'
- 'qa/qa/service/cluster_provider/gcloud.rb'
- 'qa/qa/service/cluster_provider/k3s.rb'
- - 'qa/qa/service/cluster_provider/k3s_cilium.rb'
- 'qa/qa/service/kubernetes_cluster.rb'
- 'qa/qa/service/praefect_manager.rb'
- 'qa/qa/specs/features/api/1_manage/project_access_token_spec.rb'
@@ -3817,9 +3752,6 @@ Layout/LineLength:
- 'qa/qa/specs/features/api/3_create/snippet/snippet_repository_storage_move_spec.rb'
- 'qa/qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb'
- 'qa/qa/specs/features/api/5_package/container_registry_spec.rb'
- - 'qa/qa/specs/features/browser_ui/14_non_devops/performance_bar_spec.rb'
- - 'qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb'
- - 'qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/group/create_group_with_mattermost_team_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb'
@@ -3832,7 +3764,6 @@ Layout/LineLength:
- 'qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb'
- - 'qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb'
@@ -3927,9 +3858,6 @@ Layout/LineLength:
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb'
- 'qa/qa/specs/features/browser_ui/6_release/pages/pages_pipeline_spec.rb'
- - 'qa/qa/specs/features/browser_ui/6_release/pipeline/multi-project_pipelines_spec.rb'
- - 'qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb'
- - 'qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb'
- 'qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb'
- 'qa/qa/specs/features/ee/api/12_geo/geo_nodes_spec.rb'
- 'qa/qa/specs/features/ee/api/1_manage/user/minimal_access_user_spec.rb'
@@ -3944,7 +3872,6 @@ Layout/LineLength:
- 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/notes_index/note_index_spec.rb'
- 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/nightly_elasticsearch_test_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/10_protect/policies_list_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/10_protect/policy_alerts_list_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/free_trial_spec.rb'
@@ -4014,7 +3941,6 @@ Layout/LineLength:
- 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/4_verify/cancelling_merge_request_in_merge_train_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/4_verify/pipeline_status_on_operation_dashboard_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/4_verify/transient/merge_trains_transient_bug_spec.rb'
@@ -4040,7 +3966,6 @@ Layout/LineLength:
- 'qa/qa/vendor/jenkins/page/login.rb'
- 'qa/spec/git/repository_spec.rb'
- 'qa/spec/page/logging_spec.rb'
- - 'qa/spec/qa_deprecation_toolkit_env.rb'
- 'qa/spec/resource/api_fabricator_spec.rb'
- 'qa/spec/runtime/env_spec.rb'
- 'qa/spec/runtime/feature_spec.rb'
@@ -4100,7 +4025,6 @@ Layout/LineLength:
- 'spec/controllers/admin/groups_controller_spec.rb'
- 'spec/controllers/admin/impersonations_controller_spec.rb'
- 'spec/controllers/admin/projects_controller_spec.rb'
- - 'spec/controllers/admin/requests_profiles_controller_spec.rb'
- 'spec/controllers/admin/users_controller_spec.rb'
- 'spec/controllers/application_controller_spec.rb'
- 'spec/controllers/boards/issues_controller_spec.rb'
@@ -4184,7 +4108,6 @@ Layout/LineLength:
- 'spec/controllers/projects/registry/tags_controller_spec.rb'
- 'spec/controllers/projects/repositories_controller_spec.rb'
- 'spec/controllers/projects/runners_controller_spec.rb'
- - 'spec/controllers/projects/serverless/functions_controller_spec.rb'
- 'spec/controllers/projects/service_desk_controller_spec.rb'
- 'spec/controllers/projects/service_ping_controller_spec.rb'
- 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
@@ -4229,7 +4152,6 @@ Layout/LineLength:
- 'spec/features/action_cable_logging_spec.rb'
- 'spec/features/admin/admin_abuse_reports_spec.rb'
- 'spec/features/admin/admin_mode/login_spec.rb'
- - 'spec/features/admin/admin_runners_spec.rb'
- 'spec/features/admin/admin_sees_background_migrations_spec.rb'
- 'spec/features/admin/admin_sees_project_statistics_spec.rb'
- 'spec/features/admin/admin_settings_spec.rb'
@@ -4309,7 +4231,6 @@ Layout/LineLength:
- 'spec/features/labels_hierarchy_spec.rb'
- 'spec/features/markdown/copy_as_gfm_spec.rb'
- 'spec/features/markdown/gitlab_flavored_markdown_spec.rb'
- - 'spec/features/markdown/mermaid_spec.rb'
- 'spec/features/markdown/metrics_spec.rb'
- 'spec/features/merge_request/batch_comments_spec.rb'
- 'spec/features/merge_request/maintainer_edits_fork_spec.rb'
@@ -4430,13 +4351,6 @@ Layout/LineLength:
- 'spec/features/projects/tree/upload_file_spec.rb'
- 'spec/features/projects/view_on_env_spec.rb'
- 'spec/features/projects_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_line_permalink_updater_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/shortcuts_blob_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/user_views_pipeline_editor_button_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb'
- 'spec/features/runners_spec.rb'
- 'spec/features/search/user_searches_for_comments_spec.rb'
- 'spec/features/search/user_searches_for_merge_requests_spec.rb'
@@ -4477,7 +4391,6 @@ Layout/LineLength:
- 'spec/finders/deployments_finder_spec.rb'
- 'spec/finders/environments/environments_by_deployments_finder_spec.rb'
- 'spec/finders/environments/environments_finder_spec.rb'
- - 'spec/finders/error_tracking/errors_finder_spec.rb'
- 'spec/finders/events_finder_spec.rb'
- 'spec/finders/fork_targets_finder_spec.rb'
- 'spec/finders/group_descendants_finder_spec.rb'
@@ -4583,7 +4496,7 @@ Layout/LineLength:
- 'spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb'
- 'spec/graphql/resolvers/releases_resolver_spec.rb'
- 'spec/graphql/resolvers/snippets_resolver_spec.rb'
- - 'spec/graphql/resolvers/todo_resolver_spec.rb'
+ - 'spec/graphql/resolvers/todos_resolver_spec.rb'
- 'spec/graphql/resolvers/user_discussions_count_resolver_spec.rb'
- 'spec/graphql/resolvers/users/group_count_resolver_spec.rb'
- 'spec/graphql/resolvers/users/groups_resolver_spec.rb'
@@ -4707,20 +4620,14 @@ Layout/LineLength:
- 'spec/lib/api/helpers/packages_helpers_spec.rb'
- 'spec/lib/api/helpers/rate_limiter_spec.rb'
- 'spec/lib/api/helpers_spec.rb'
- - 'spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb'
- 'spec/lib/atlassian/jira_connect/client_spec.rb'
- 'spec/lib/atlassian/jira_connect/serializers/feature_flag_entity_spec.rb'
- 'spec/lib/atlassian/jira_issue_key_extractor_spec.rb'
- - 'spec/lib/backup/artifacts_spec.rb'
- 'spec/lib/backup/database_spec.rb'
- 'spec/lib/backup/files_spec.rb'
- 'spec/lib/backup/gitaly_backup_spec.rb'
- - 'spec/lib/backup/lfs_spec.rb'
- 'spec/lib/backup/manager_spec.rb'
- - 'spec/lib/backup/object_backup_spec.rb'
- - 'spec/lib/backup/pages_spec.rb'
- 'spec/lib/backup/repositories_spec.rb'
- - 'spec/lib/backup/uploads_spec.rb'
- 'spec/lib/banzai/commit_renderer_spec.rb'
- 'spec/lib/banzai/filter/ascii_doc_post_processing_filter_spec.rb'
- 'spec/lib/banzai/filter/ascii_doc_sanitization_filter_spec.rb'
@@ -4922,7 +4829,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/ci/templates/5_minute_production_app_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
- - 'spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/npm_spec.rb'
- 'spec/lib/gitlab/ci/variables/builder_spec.rb'
- 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
@@ -5007,7 +4913,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb'
- 'spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb'
- 'spec/lib/gitlab/diff/suggestion_spec.rb'
- - 'spec/lib/gitlab/elasticsearch/logs/lines_spec.rb'
- 'spec/lib/gitlab/email/failure_handler_spec.rb'
- 'spec/lib/gitlab/email/handler/create_issue_handler_spec.rb'
- 'spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb'
@@ -5127,14 +5032,12 @@ Layout/LineLength:
- 'spec/lib/gitlab/jira_import_spec.rb'
- 'spec/lib/gitlab/kas/client_spec.rb'
- 'spec/lib/gitlab/kas_spec.rb'
- - 'spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb'
- 'spec/lib/gitlab/kubernetes/deployment_spec.rb'
- 'spec/lib/gitlab/kubernetes/helm/api_spec.rb'
- 'spec/lib/gitlab/kubernetes/helm/pod_spec.rb'
- 'spec/lib/gitlab/kubernetes/kubeconfig/template_spec.rb'
- 'spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb'
- 'spec/lib/gitlab/kubernetes/namespace_spec.rb'
- - 'spec/lib/gitlab/kubernetes/network_policy_spec.rb'
- 'spec/lib/gitlab/kubernetes/pod_cmd_spec.rb'
- 'spec/lib/gitlab/kubernetes/rollout_status_spec.rb'
- 'spec/lib/gitlab/kubernetes_spec.rb'
@@ -5346,7 +5249,6 @@ Layout/LineLength:
- 'spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb'
- 'spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb'
- 'spec/migrations/backfill_project_namespaces_for_group_spec.rb'
- - 'spec/migrations/backfill_work_item_type_id_on_issues_spec.rb'
- 'spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb'
- 'spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb'
- 'spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb'
@@ -5369,7 +5271,6 @@ Layout/LineLength:
- 'spec/migrations/reset_severity_levels_to_new_default_spec.rb'
- 'spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb'
- 'spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb'
- - 'spec/migrations/schedule_migrate_pages_to_zip_storage_spec.rb'
- 'spec/migrations/schedule_populate_status_column_of_security_scans_spec.rb'
- 'spec/migrations/schedule_recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
- 'spec/migrations/schedule_update_timelogs_null_spent_at_spec.rb'
@@ -5591,7 +5492,6 @@ Layout/LineLength:
- 'spec/presenters/alert_management/alert_presenter_spec.rb'
- 'spec/presenters/blob_presenter_spec.rb'
- 'spec/presenters/blobs/notebook_presenter_spec.rb'
- - 'spec/presenters/ci/legacy_stage_presenter_spec.rb'
- 'spec/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter_spec.rb'
- 'spec/presenters/ci/pipeline_presenter_spec.rb'
- 'spec/presenters/clusters/cluster_presenter_spec.rb'
@@ -5607,7 +5507,6 @@ Layout/LineLength:
- 'spec/presenters/packages/nuget/package_metadata_presenter_spec.rb'
- 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb'
- 'spec/presenters/packages/nuget/search_results_presenter_spec.rb'
- - 'spec/presenters/packages/pypi/package_presenter_spec.rb'
- 'spec/presenters/projects/security/configuration_presenter_spec.rb'
- 'spec/presenters/prometheus_alert_presenter_spec.rb'
- 'spec/presenters/service_hook_presenter_spec.rb'
@@ -5837,7 +5736,6 @@ Layout/LineLength:
- 'spec/rubocop/cop/migration/safer_boolean_column_spec.rb'
- 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
- 'spec/rubocop/cop/performance/readlines_each_spec.rb'
- - 'spec/rubocop/cop/qa/testcase_link_format_spec.rb'
- 'spec/rubocop/cop/rspec/env_assignment_spec.rb'
- 'spec/rubocop/cop/rspec/expect_gitlab_tracking_spec.rb'
- 'spec/rubocop/cop/scalability/file_uploads_spec.rb'
@@ -5884,7 +5782,6 @@ Layout/LineLength:
- 'spec/services/alert_management/http_integrations/update_service_spec.rb'
- 'spec/services/application_settings/update_service_spec.rb'
- 'spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb'
- - 'spec/services/authorized_project_update/project_create_service_spec.rb'
- 'spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb'
- 'spec/services/boards/issues/create_service_spec.rb'
- 'spec/services/boards/issues/list_service_spec.rb'
@@ -5918,7 +5815,6 @@ Layout/LineLength:
- 'spec/services/clusters/applications/check_installation_progress_service_spec.rb'
- 'spec/services/clusters/applications/check_uninstall_progress_service_spec.rb'
- 'spec/services/clusters/applications/create_service_spec.rb'
- - 'spec/services/clusters/applications/schedule_update_service_spec.rb'
- 'spec/services/clusters/applications/uninstall_service_spec.rb'
- 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
- 'spec/services/clusters/aws/provision_service_spec.rb'
@@ -5981,7 +5877,6 @@ Layout/LineLength:
- 'spec/services/incident_management/pager_duty/process_webhook_service_spec.rb'
- 'spec/services/integrations/propagate_service_spec.rb'
- 'spec/services/issuable/bulk_update_service_spec.rb'
- - 'spec/services/issuable/clone/attributes_rewriter_spec.rb'
- 'spec/services/issuable/common_system_notes_service_spec.rb'
- 'spec/services/issuable/destroy_service_spec.rb'
- 'spec/services/issue_links/create_service_spec.rb'
@@ -6090,8 +5985,6 @@ Layout/LineLength:
- 'spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb'
- 'spec/services/personal_access_tokens/create_service_spec.rb'
- 'spec/services/personal_access_tokens/revoke_service_spec.rb'
- - 'spec/services/pod_logs/elasticsearch_service_spec.rb'
- - 'spec/services/pod_logs/kubernetes_service_spec.rb'
- 'spec/services/post_receive_service_spec.rb'
- 'spec/services/projects/apple_target_platform_detector_service_spec.rb'
- 'spec/services/projects/autocomplete_service_spec.rb'
@@ -6142,7 +6035,6 @@ Layout/LineLength:
- 'spec/services/search_service_spec.rb'
- 'spec/services/security/ci_configuration/sast_create_service_spec.rb'
- 'spec/services/security/merge_reports_service_spec.rb'
- - 'spec/services/service_ping/service_ping_settings_spec.rb'
- 'spec/services/service_ping/submit_service_ping_service_spec.rb'
- 'spec/services/snippets/create_service_spec.rb'
- 'spec/services/snippets/update_repository_storage_service_spec.rb'
@@ -6508,8 +6400,6 @@ Layout/LineLength:
- 'spec/workers/incident_management/pager_duty/process_incident_worker_spec.rb'
- 'spec/workers/incident_management/process_alert_worker_v2_spec.rb'
- 'spec/workers/invalid_gpg_signature_update_worker_spec.rb'
- - 'spec/workers/issue_placement_worker_spec.rb'
- - 'spec/workers/issue_rebalancing_worker_spec.rb'
- 'spec/workers/issues/placement_worker_spec.rb'
- 'spec/workers/issues/rebalancing_worker_spec.rb'
- 'spec/workers/issues/reschedule_stuck_issue_rebalances_worker_spec.rb'
@@ -6544,9 +6434,7 @@ Layout/LineLength:
- 'spec/workers/todos_destroyer/confidential_issue_worker_spec.rb'
- 'spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb'
- 'spec/workers/users/deactivate_dormant_users_worker_spec.rb'
- - 'spec/workers/web_hooks/destroy_worker_spec.rb'
- 'tooling/bin/find_changes'
- - 'tooling/bin/qa/check_if_qa_only_spec_changes'
- 'tooling/danger/product_intelligence.rb'
- 'tooling/danger/project_helper.rb'
- 'tooling/danger/specs.rb'
diff --git a/.rubocop_todo/layout/multiline_operation_indentation.yml b/.rubocop_todo/layout/multiline_operation_indentation.yml
index 0f2404ee3cc..51ecf97d318 100644
--- a/.rubocop_todo/layout/multiline_operation_indentation.yml
+++ b/.rubocop_todo/layout/multiline_operation_indentation.yml
@@ -71,7 +71,6 @@ Layout/MultilineOperationIndentation:
- 'lib/gitlab/ci/reports/security/finding_key.rb'
- 'lib/gitlab/database/load_balancing/connection_proxy.rb'
- 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
- - 'lib/gitlab/elasticsearch/logs/lines.rb'
- 'lib/gitlab/form_builders/gitlab_ui_form_builder.rb'
- 'lib/gitlab/git_access.rb'
- 'lib/gitlab/gl_repository/repo_type.rb'
@@ -96,7 +95,6 @@ Layout/MultilineOperationIndentation:
- 'qa/qa/page/component/snippet.rb'
- 'qa/qa/runtime/api/repository_storage_moves.rb'
- 'rubocop/cop/gitlab/keys_first_and_values_first.rb'
- - 'rubocop/cop/migration/hash_index.rb'
- 'rubocop/migration_helpers.rb'
- 'spec/frontend/fixtures/tabs.rb'
- 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
diff --git a/.rubocop_todo/layout/space_in_lambda_literal.yml b/.rubocop_todo/layout/space_in_lambda_literal.yml
index e633f51209d..c88fdf5a3b0 100644
--- a/.rubocop_todo/layout/space_in_lambda_literal.yml
+++ b/.rubocop_todo/layout/space_in_lambda_literal.yml
@@ -141,7 +141,6 @@ Layout/SpaceInLambdaLiteral:
- 'app/serializers/concerns/user_status_tooltip.rb'
- 'app/serializers/container_repository_entity.rb'
- 'app/serializers/container_tag_entity.rb'
- - 'app/serializers/deploy_key_entity.rb'
- 'app/serializers/deployment_cluster_entity.rb'
- 'app/serializers/deployment_entity.rb'
- 'app/serializers/detailed_status_entity.rb'
@@ -276,7 +275,6 @@ Layout/SpaceInLambdaLiteral:
- 'ee/app/serializers/epic_entity.rb'
- 'ee/app/serializers/epic_note_entity.rb'
- 'ee/app/serializers/linked_epic_issue_entity.rb'
- - 'ee/app/serializers/merge_request_compliance_entity.rb'
- 'ee/app/serializers/metrics_report_metric_entity.rb'
- 'ee/app/serializers/vulnerabilities/feedback_entity.rb'
- 'ee/app/serializers/vulnerabilities/finding_entity.rb'
diff --git a/.rubocop_todo/layout/space_inside_block_braces.yml b/.rubocop_todo/layout/space_inside_block_braces.yml
index 961b27f26e7..c084147eb58 100644
--- a/.rubocop_todo/layout/space_inside_block_braces.yml
+++ b/.rubocop_todo/layout/space_inside_block_braces.yml
@@ -11,7 +11,6 @@ Layout/SpaceInsideBlockBraces:
- 'app/controllers/projects/boards_controller.rb'
- 'app/experiments/security_reports_mr_widget_prompt_experiment.rb'
- 'app/experiments/video_tutorials_continuous_onboarding_experiment.rb'
- - 'app/graphql/types/concerns/find_closest.rb'
- 'app/helpers/favicon_helper.rb'
- 'app/helpers/time_zone_helper.rb'
- 'app/helpers/todos_helper.rb'
@@ -192,7 +191,6 @@ Layout/SpaceInsideBlockBraces:
- 'ee/spec/requests/groups/contribution_analytics_spec.rb'
- 'ee/spec/requests/lfs_http_spec.rb'
- 'ee/spec/requests/projects/security/policies_controller_spec.rb'
- - 'ee/spec/requests/survey_responses_controller_spec.rb'
- 'ee/spec/serializers/member_user_entity_spec.rb'
- 'ee/spec/serializers/merge_request_poll_widget_entity_spec.rb'
- 'ee/spec/serializers/vulnerabilities/finding_reports_comparer_entity_spec.rb'
@@ -245,7 +243,6 @@ Layout/SpaceInsideBlockBraces:
- 'ee/spec/support/shared_examples/services/boards/base_service_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/search_notes_shared_examples.rb'
- 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
- - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
- 'ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb'
- 'ee/spec/views/shared/billings/_eoa_bronze_plan_banner.html.haml_spec.rb'
- 'ee/spec/views/shared/credentials_inventory/_expiry_date.html.haml_spec.rb'
@@ -266,7 +263,6 @@ Layout/SpaceInsideBlockBraces:
- 'lib/gitlab/contributions_calendar.rb'
- 'lib/gitlab/database/migrations/test_background_runner.rb'
- 'lib/gitlab/database/postgres_hll/buckets.rb'
- - 'lib/gitlab/elasticsearch/logs/lines.rb'
- 'lib/gitlab/email/message/in_product_marketing/helper.rb'
- 'lib/gitlab/issues/rebalancing/state.rb'
- 'lib/gitlab/profiler.rb'
@@ -350,7 +346,6 @@ Layout/SpaceInsideBlockBraces:
- 'spec/features/projects/pipelines/pipelines_spec.rb'
- 'spec/features/projects/settings/service_desk_setting_spec.rb'
- 'spec/features/projects/tree/tree_show_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb'
- 'spec/features/users/login_spec.rb'
- 'spec/finders/ci/jobs_finder_spec.rb'
- 'spec/finders/ci/runners_finder_spec.rb'
@@ -378,9 +373,7 @@ Layout/SpaceInsideBlockBraces:
- 'spec/frontend/fixtures/pipeline_schedules.rb'
- 'spec/frontend/fixtures/pipelines.rb'
- 'spec/frontend/fixtures/projects.rb'
- - 'spec/frontend/fixtures/prometheus_service.rb'
- 'spec/frontend/fixtures/raw.rb'
- - 'spec/frontend/fixtures/services.rb'
- 'spec/frontend/fixtures/snippet.rb'
- 'spec/frontend/fixtures/todos.rb'
- 'spec/graphql/mutations/merge_requests/set_labels_spec.rb'
@@ -469,7 +462,6 @@ Layout/SpaceInsideBlockBraces:
- 'spec/lib/gitlab/database/with_lock_retries_spec.rb'
- 'spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb'
- 'spec/lib/gitlab/database_spec.rb'
- - 'spec/lib/gitlab/elasticsearch/logs/lines_spec.rb'
- 'spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
- 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
- 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
@@ -557,7 +549,6 @@ Layout/SpaceInsideBlockBraces:
- 'spec/models/ci/pipeline_schedule_spec.rb'
- 'spec/models/ci/pipeline_spec.rb'
- 'spec/models/ci/runner_spec.rb'
- - 'spec/models/clusters/applications/elastic_stack_spec.rb'
- 'spec/models/clusters/cluster_spec.rb'
- 'spec/models/commit_status_spec.rb'
- 'spec/models/concerns/chronic_duration_attribute_spec.rb'
@@ -604,7 +595,6 @@ Layout/SpaceInsideBlockBraces:
- 'spec/presenters/packages/composer/packages_presenter_spec.rb'
- 'spec/presenters/packages/conan/package_presenter_spec.rb'
- 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb'
- - 'spec/presenters/packages/pypi/package_presenter_spec.rb'
- 'spec/presenters/project_presenter_spec.rb'
- 'spec/requests/api/branches_spec.rb'
- 'spec/requests/api/ci/jobs_spec.rb'
@@ -659,7 +649,6 @@ Layout/SpaceInsideBlockBraces:
- 'spec/requests/oauth/tokens_controller_spec.rb'
- 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb'
- 'spec/serializers/cluster_entity_spec.rb'
- - 'spec/serializers/deploy_key_entity_spec.rb'
- 'spec/serializers/import/provider_repo_serializer_spec.rb'
- 'spec/services/auto_merge/base_service_spec.rb'
- 'spec/services/auto_merge_service_spec.rb'
@@ -762,4 +751,3 @@ Layout/SpaceInsideBlockBraces:
- 'spec/workers/pages_worker_spec.rb'
- 'spec/workers/purge_dependency_proxy_cache_worker_spec.rb'
- 'spec/workers/releases/manage_evidence_worker_spec.rb'
- - 'spec/workers/repository_remove_remote_worker_spec.rb'
diff --git a/.rubocop_todo/layout/space_inside_parens.yml b/.rubocop_todo/layout/space_inside_parens.yml
index 9022d41aeeb..301568f0ec4 100644
--- a/.rubocop_todo/layout/space_inside_parens.yml
+++ b/.rubocop_todo/layout/space_inside_parens.yml
@@ -44,7 +44,6 @@ Layout/SpaceInsideParens:
- 'ee/app/services/compliance_management/frameworks/destroy_service.rb'
- 'ee/app/services/compliance_management/frameworks/update_service.rb'
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
- - 'ee/app/services/namespaces/check_storage_size_service.rb'
- 'ee/app/services/sitemap/create_service.rb'
- 'ee/lib/ee/gitlab/auth/ldap/access.rb'
- 'ee/lib/gitlab/auth/smartcard/session.rb'
@@ -71,7 +70,6 @@ Layout/SpaceInsideParens:
- 'ee/spec/features/merge_requests/user_resets_approvers_spec.rb'
- 'ee/spec/features/merge_requests/user_views_all_merge_requests_spec.rb'
- 'ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb'
- - 'ee/spec/finders/ee/alert_management/alerts_finder_spec.rb'
- 'ee/spec/finders/ee/alert_management/http_integrations_finder_spec.rb'
- 'ee/spec/finders/epics_finder_spec.rb'
- 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
@@ -89,7 +87,6 @@ Layout/SpaceInsideParens:
- 'ee/spec/lib/gitlab/auth/group_saml/group_lookup_spec.rb'
- 'ee/spec/lib/gitlab/auth/otp/session_enforcer_spec.rb'
- 'ee/spec/lib/gitlab/auth/smartcard/ldap_certificate_spec.rb'
- - 'ee/spec/lib/gitlab/auth_spec.rb'
- 'ee/spec/lib/gitlab/ci/templates/coverage_fuzzing_gitlab_ci_yaml_spec.rb'
- 'ee/spec/lib/gitlab/ci/templates/dast_api_gitlab_ci_yaml_spec.rb'
- 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
@@ -132,7 +129,6 @@ Layout/SpaceInsideParens:
- 'ee/spec/requests/api/ldap_group_links_spec.rb'
- 'ee/spec/requests/api/project_milestones_spec.rb'
- 'ee/spec/requests/customers_dot/proxy_controller_spec.rb'
- - 'ee/spec/requests/survey_responses_controller_spec.rb'
- 'ee/spec/serializers/member_user_entity_spec.rb'
- 'ee/spec/services/app_sec/dast/profiles/create_service_spec.rb'
- 'ee/spec/services/app_sec/dast/site_profile_secret_variables/create_or_update_service_spec.rb'
@@ -188,7 +184,6 @@ Layout/SpaceInsideParens:
- 'spec/controllers/projects/runners_controller_spec.rb'
- 'spec/dependencies/omniauth_saml_spec.rb'
- 'spec/factories/usage_data.rb'
- - 'spec/features/admin/admin_runners_spec.rb'
- 'spec/features/boards/board_filters_spec.rb'
- 'spec/features/boards/user_visits_board_spec.rb'
- 'spec/features/dashboard/datetime_on_tooltips_spec.rb'
@@ -228,9 +223,7 @@ Layout/SpaceInsideParens:
- 'spec/frontend/fixtures/pipeline_schedules.rb'
- 'spec/frontend/fixtures/pipelines.rb'
- 'spec/frontend/fixtures/projects.rb'
- - 'spec/frontend/fixtures/prometheus_service.rb'
- 'spec/frontend/fixtures/raw.rb'
- - 'spec/frontend/fixtures/services.rb'
- 'spec/frontend/fixtures/snippet.rb'
- 'spec/frontend/fixtures/todos.rb'
- 'spec/graphql/mutations/todos/restore_many_spec.rb'
@@ -281,7 +274,6 @@ Layout/SpaceInsideParens:
- 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/flutter_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/kaniko_gitlab_ci_yaml_spec.rb'
- - 'spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/npm_spec.rb'
- 'spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb'
@@ -387,8 +379,6 @@ Layout/SpaceInsideParens:
- 'spec/requests/search_controller_spec.rb'
- 'spec/serializers/analytics_build_entity_spec.rb'
- 'spec/serializers/merge_request_user_entity_spec.rb'
- - 'spec/services/authorized_project_update/project_create_service_spec.rb'
- - 'spec/services/authorized_project_update/project_group_link_create_service_spec.rb'
- 'spec/services/boards/issues/list_service_spec.rb'
- 'spec/services/ci/compare_test_reports_service_spec.rb'
- 'spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb'
diff --git a/.rubocop_todo/lint/constant_definition_in_block.yml b/.rubocop_todo/lint/constant_definition_in_block.yml
index 1ffea85dfb0..fc70f4870b1 100644
--- a/.rubocop_todo/lint/constant_definition_in_block.yml
+++ b/.rubocop_todo/lint/constant_definition_in_block.yml
@@ -21,10 +21,8 @@ Lint/ConstantDefinitionInBlock:
- 'ee/app/models/ee/project_import_state.rb'
- 'ee/app/models/ee/user.rb'
- 'ee/app/models/ee/vulnerability.rb'
- - 'ee/app/presenters/ee/commit_status_presenter.rb'
- 'ee/app/services/ee/notes/quick_actions_service.rb'
- 'ee/lib/ee/api/search.rb'
- - 'ee/lib/ee/gitlab/ci/status/build/failed.rb'
- 'ee/lib/gitlab/subscription_portal/clients/rest.rb'
- 'ee/lib/tasks/geo.rake'
- 'ee/spec/db/schema_support.rb'
diff --git a/.rubocop_todo/lint/redundant_cop_disable_directive.yml b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
index d058e23109b..e4925aa2cfd 100644
--- a/.rubocop_todo/lint/redundant_cop_disable_directive.yml
+++ b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
@@ -44,7 +44,6 @@ Lint/RedundantCopDisableDirective:
- 'app/workers/bulk_imports/entity_worker.rb'
- 'app/workers/container_expiration_policy_worker.rb'
- 'app/workers/create_note_diff_file_worker.rb'
- - 'app/workers/expire_job_cache_worker.rb'
- 'app/workers/import_issues_csv_worker.rb'
- 'app/workers/incident_management/process_alert_worker_v2.rb'
- 'app/workers/merge_worker.rb'
@@ -152,7 +151,6 @@ Lint/RedundantCopDisableDirective:
- 'lib/gitlab/profiler.rb'
- 'lib/gitlab/project_search_results.rb'
- 'lib/gitlab/redis/hll.rb'
- - 'lib/gitlab/request_profiler.rb'
- 'lib/gitlab/slash_commands/issue_search.rb'
- 'lib/gitlab/usage_data.rb'
- 'lib/gitlab/usage_data_queries.rb'
diff --git a/.rubocop_todo/migration/background_migration_base_class.yml b/.rubocop_todo/migration/background_migration_base_class.yml
index f026ec19c7b..495b4a51e56 100644
--- a/.rubocop_todo/migration/background_migration_base_class.yml
+++ b/.rubocop_todo/migration/background_migration_base_class.yml
@@ -57,7 +57,6 @@ Migration/BackgroundMigrationBaseClass:
- 'lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics.rb'
- 'lib/gitlab/background_migration/migrate_requirements_to_work_items.rb'
- 'lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb'
- - 'lib/gitlab/background_migration/migrate_stage_status.rb'
- 'lib/gitlab/background_migration/migrate_u2f_webauthn.rb'
- 'lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb'
- 'lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds.rb'
diff --git a/.rubocop_todo/migration/background_migration_record.yml b/.rubocop_todo/migration/background_migration_record.yml
index cbf39285a7d..b4feb944d75 100644
--- a/.rubocop_todo/migration/background_migration_record.yml
+++ b/.rubocop_todo/migration/background_migration_record.yml
@@ -43,7 +43,6 @@ Migration/BackgroundMigrationRecord:
- ee/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb
- ee/lib/ee/gitlab/background_migration/create_security_setting.rb
- ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb
- - ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb
- ee/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used.rb
- ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb
- ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch.rb
diff --git a/.rubocop_todo/naming/rescued_exceptions_variable_name.yml b/.rubocop_todo/naming/rescued_exceptions_variable_name.yml
index 0e753a53dc3..b557ca8f06e 100644
--- a/.rubocop_todo/naming/rescued_exceptions_variable_name.yml
+++ b/.rubocop_todo/naming/rescued_exceptions_variable_name.yml
@@ -22,7 +22,6 @@ Naming/RescuedExceptionsVariableName:
- 'app/models/blob_viewer/metrics_dashboard_yml.rb'
- 'app/models/ci/build.rb'
- 'app/models/ci/deleted_object.rb'
- - 'app/models/clusters/concerns/elasticsearch_client.rb'
- 'app/models/concerns/prometheus_adapter.rb'
- 'app/models/concerns/repository_storage_movable.rb'
- 'app/models/concerns/x509_serial_number_attribute.rb'
@@ -116,9 +115,6 @@ Naming/RescuedExceptionsVariableName:
- 'ee/app/services/geo/repository_base_sync_service.rb'
- 'ee/app/services/incident_management/oncall_rotations/create_service.rb'
- 'ee/app/services/incident_management/oncall_rotations/edit_service.rb'
- - 'ee/app/services/namespaces/deactivate_members_over_limit_service.rb'
- - 'ee/app/services/namespaces/remove_project_group_links_outside_hierarchy_service.rb'
- - 'ee/app/services/namespaces/update_prevent_sharing_outside_hierarchy_service.rb'
- 'ee/app/services/projects/licenses/create_policy_service.rb'
- 'ee/app/services/projects/licenses/update_policy_service.rb'
- 'ee/app/services/security/ingestion/ingest_report_service.rb'
@@ -132,7 +128,6 @@ Naming/RescuedExceptionsVariableName:
- 'ee/app/workers/geo/file_removal_worker.rb'
- 'ee/app/workers/geo/repositories_clean_up_worker.rb'
- 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
- - 'ee/app/workers/namespaces/free_user_cap_worker.rb'
- 'ee/app/workers/refresh_license_compliance_checks_worker.rb'
- 'ee/app/workers/repository_update_mirror_worker.rb'
- 'ee/app/workers/sync_seat_link_request_worker.rb'
diff --git a/.rubocop_todo/performance/block_given_with_explicit_block.yml b/.rubocop_todo/performance/block_given_with_explicit_block.yml
index ff1f5e568ea..b919dbd19e6 100644
--- a/.rubocop_todo/performance/block_given_with_explicit_block.yml
+++ b/.rubocop_todo/performance/block_given_with_explicit_block.yml
@@ -1,9 +1,6 @@
---
# Cop supports --auto-correct.
Performance/BlockGivenWithExplicitBlock:
- # Offense count: 53
- # Temporarily disabled due to too many offenses
- Enabled: false
Exclude:
- 'app/controllers/concerns/redis_tracking.rb'
- 'app/helpers/badges_helper.rb'
@@ -26,11 +23,14 @@ Performance/BlockGivenWithExplicitBlock:
- 'lib/gitlab/metrics/methods/metric_options.rb'
- 'lib/gitlab/null_request_store.rb'
- 'lib/gitlab/quick_actions/dsl.rb'
+ - 'lib/gitlab/redis/multi_store.rb'
- 'lib/gitlab/safe_request_loader.rb'
- 'lib/gitlab/search/query.rb'
- 'lib/gitlab/string_placeholder_replacer.rb'
- 'lib/gitlab/terraform/state_migration_helper.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/base_metric.rb'
- 'lib/gitlab/usage/metrics/instrumentations/database_metric.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/numbers_metric.rb'
- 'lib/gitlab/usage_data_queries.rb'
- 'lib/gitlab/utils/usage_data.rb'
- 'qa/qa/page/view.rb'
@@ -38,5 +38,6 @@ Performance/BlockGivenWithExplicitBlock:
- 'spec/lib/gitlab/slash_commands/deploy_spec.rb'
- 'spec/support/helpers/graphql_helpers.rb'
- 'spec/support/helpers/query_recorder.rb'
+ - 'spec/support/helpers/stub_method_calls.rb'
- 'tooling/lib/tooling/helm3_client.rb'
- 'tooling/lib/tooling/test_map_packer.rb'
diff --git a/.rubocop_todo/performance/collection_literal_in_loop.yml b/.rubocop_todo/performance/collection_literal_in_loop.yml
index 4b012bf6645..50fd75827fb 100644
--- a/.rubocop_todo/performance/collection_literal_in_loop.yml
+++ b/.rubocop_todo/performance/collection_literal_in_loop.yml
@@ -1,12 +1,8 @@
---
Performance/CollectionLiteralInLoop:
- # Offense count: 45
- # Temporarily disabled due to too many offenses
- Enabled: false
Exclude:
- 'config/application.rb'
- 'config/initializers/1_settings.rb'
- - 'ee/app/models/ee/merge_request.rb'
- 'ee/spec/features/admin/admin_settings_spec.rb'
- 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
- 'ee/spec/workers/app_sec/dast/profile_schedule_worker_spec.rb'
@@ -20,15 +16,18 @@ Performance/CollectionLiteralInLoop:
- 'lib/tasks/gitlab/seed/group_seed.rake'
- 'spec/bin/sidekiq_cluster_spec.rb'
- 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/finders/ci/runners_finder_spec.rb'
- 'spec/lib/banzai/reference_parser/base_parser_spec.rb'
- 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
- 'spec/lib/gitlab/file_detector_spec.rb'
- 'spec/lib/gitlab/search/abuse_detection_spec.rb'
- 'spec/lib/gitlab/utils/markdown_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
- 'spec/models/analytics/cycle_analytics/aggregation_spec.rb'
- 'spec/models/ci/build_spec.rb'
- 'spec/models/ci/pipeline_spec.rb'
- 'spec/models/namespace_statistics_spec.rb'
+ - 'spec/models/project_spec.rb'
- 'spec/presenters/ci/build_runner_presenter_spec.rb'
- 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb'
- 'spec/presenters/packages/nuget/service_index_presenter_spec.rb'
diff --git a/.rubocop_todo/performance/constant_regexp.yml b/.rubocop_todo/performance/constant_regexp.yml
index 4ed40db498f..23d03ced8d7 100644
--- a/.rubocop_todo/performance/constant_regexp.yml
+++ b/.rubocop_todo/performance/constant_regexp.yml
@@ -1,15 +1,13 @@
---
# Cop supports --auto-correct.
Performance/ConstantRegexp:
- # Offense count: 46
- # Temporarily disabled due to too many offenses
- Enabled: false
Exclude:
- 'app/models/commit.rb'
- 'app/models/commit_range.rb'
- 'app/models/custom_emoji.rb'
- 'app/models/gpg_key.rb'
- 'app/models/merge_request.rb'
+ - 'app/models/packages/package.rb'
- 'app/models/project.rb'
- 'app/models/wiki.rb'
- 'ee/app/models/ee/epic.rb'
@@ -27,5 +25,6 @@ Performance/ConstantRegexp:
- 'lib/gitlab/regex.rb'
- 'scripts/perf/query_limiting_report.rb'
- 'scripts/validate_migration_schema'
+ - 'spec/features/users/email_verification_on_login_spec.rb'
- 'spec/models/concerns/token_authenticatable_spec.rb'
- 'spec/services/notes/copy_service_spec.rb'
diff --git a/.rubocop_todo/performance/method_object_as_block.yml b/.rubocop_todo/performance/method_object_as_block.yml
index 265e03073db..1bc82ff05ec 100644
--- a/.rubocop_todo/performance/method_object_as_block.yml
+++ b/.rubocop_todo/performance/method_object_as_block.yml
@@ -1,8 +1,5 @@
---
Performance/MethodObjectAsBlock:
- # Offense count: 150
- # Temporarily disabled due to too many offenses
- Enabled: false
Exclude:
- 'app/controllers/concerns/metrics_dashboard.rb'
- 'app/controllers/concerns/requires_whitelisted_monitoring_client.rb'
@@ -30,7 +27,6 @@ Performance/MethodObjectAsBlock:
- 'ee/app/graphql/resolvers/vulnerabilities/scanners_resolver.rb'
- 'ee/app/services/dashboard/projects/create_service.rb'
- 'ee/app/services/security/findings/cleanup_service.rb'
- - 'ee/app/services/security/ingestion/bulk_insertable_task.rb'
- 'ee/app/services/security/ingestion/ingest_reports_service.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_vulnerability_statistics.rb'
- 'ee/app/services/security/store_findings_metadata_service.rb'
@@ -38,6 +34,7 @@ Performance/MethodObjectAsBlock:
- 'ee/lib/ee/container_registry/client.rb'
- 'ee/lib/ee/gitlab/ci/config_ee.rb'
- 'ee/lib/ee/gitlab/etag_caching/router/rails.rb'
+ - 'ee/lib/gitlab/ingestion/bulk_insertable_task.rb'
- 'ee/spec/services/groups/participants_service_spec.rb'
- 'lib/api/helpers/packages/conan/api_helpers.rb'
- 'lib/bulk_imports/pipeline.rb'
@@ -80,6 +77,7 @@ Performance/MethodObjectAsBlock:
- 'lib/gitlab/utils.rb'
- 'lib/peek/views/detailed_view.rb'
- 'lib/tasks/gitlab/assets.rake'
+ - 'lib/unnested_in_filters/rewriter.rb'
- 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
- 'rubocop/cop/avoid_return_from_blocks.rb'
- 'rubocop/cop/gitlab/mark_used_feature_flags.rb'
@@ -95,5 +93,6 @@ Performance/MethodObjectAsBlock:
- 'spec/support/helpers/migrations_helpers.rb'
- 'spec/support/shared_examples/models/active_record_enum_shared_examples.rb'
- 'spec/support_specs/helpers/stub_feature_flags_spec.rb'
+ - 'tooling/lib/tooling/find_codeowners.rb'
- 'tooling/lib/tooling/test_map_packer.rb'
- 'tooling/quality/test_level.rb'
diff --git a/.rubocop_todo/rails/file_path.yml b/.rubocop_todo/rails/file_path.yml
index 1c442dcdec7..467073eb2db 100644
--- a/.rubocop_todo/rails/file_path.yml
+++ b/.rubocop_todo/rails/file_path.yml
@@ -8,7 +8,6 @@ Rails/FilePath:
- 'app/controllers/help_controller.rb'
- 'app/helpers/startupjs_helper.rb'
- 'app/models/clusters/applications/cert_manager.rb'
- - 'app/models/clusters/applications/elastic_stack.rb'
- 'app/models/clusters/concerns/application_data.rb'
- 'app/models/concerns/cross_database_modification.rb'
- 'app/models/release_highlight.rb'
@@ -103,7 +102,6 @@ Rails/FilePath:
- 'spec/features/projects/snippets/create_snippet_spec.rb'
- 'spec/features/projects/tags/user_edits_tags_spec.rb'
- 'spec/features/projects/tree/upload_file_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/files/user_replaces_files_spec.rb'
- 'spec/features/snippets/user_creates_snippet_spec.rb'
- 'spec/features/snippets/user_edits_snippet_spec.rb'
- 'spec/features/uploads/user_uploads_avatar_to_group_spec.rb'
diff --git a/.rubocop_todo/rails/helper_instance_variable.yml b/.rubocop_todo/rails/helper_instance_variable.yml
index 8a1a6093c3d..006e66ed0b2 100644
--- a/.rubocop_todo/rails/helper_instance_variable.yml
+++ b/.rubocop_todo/rails/helper_instance_variable.yml
@@ -71,7 +71,6 @@ Rails/HelperInstanceVariable:
- 'ee/app/helpers/ee/lock_helper.rb'
- 'ee/app/helpers/ee/merge_requests_helper.rb'
- 'ee/app/helpers/ee/mirror_helper.rb'
- - 'ee/app/helpers/ee/namespace_storage_limit_alert_helper.rb'
- 'ee/app/helpers/ee/notes_helper.rb'
- 'ee/app/helpers/ee/operations_helper.rb'
- 'ee/app/helpers/ee/projects/security/configuration_helper.rb'
@@ -82,4 +81,3 @@ Rails/HelperInstanceVariable:
- 'ee/app/helpers/ee/wiki_helper.rb'
- 'ee/app/helpers/path_locks_helper.rb'
- 'ee/app/helpers/projects/security/discover_helper.rb'
- - 'ee/app/helpers/seats_count_alert_helper.rb'
diff --git a/.rubocop_todo/rails/inverse_of.yml b/.rubocop_todo/rails/inverse_of.yml
index 7a757ec8a9d..98d116c3319 100644
--- a/.rubocop_todo/rails/inverse_of.yml
+++ b/.rubocop_todo/rails/inverse_of.yml
@@ -31,7 +31,6 @@ Rails/InverseOf:
- 'app/models/clusters/applications/runner.rb'
- 'app/models/clusters/cluster.rb'
- 'app/models/clusters/concerns/application_core.rb'
- - 'app/models/clusters/integrations/elastic_stack.rb'
- 'app/models/clusters/integrations/prometheus.rb'
- 'app/models/clusters/project.rb'
- 'app/models/commit_signatures/x509_commit_signature.rb'
diff --git a/.rubocop_todo/rails/pluck.yml b/.rubocop_todo/rails/pluck.yml
index 860b772d913..5e875daa569 100644
--- a/.rubocop_todo/rails/pluck.yml
+++ b/.rubocop_todo/rails/pluck.yml
@@ -14,7 +14,6 @@ Rails/Pluck:
- 'app/models/list.rb'
- 'app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb'
- 'app/services/feature_flags/update_service.rb'
- - 'app/services/pod_logs/base_service.rb'
- 'ee/app/graphql/mutations/incident_management/oncall_rotation/base.rb'
- 'ee/app/models/boards/epic_list.rb'
- 'ee/app/services/concerns/incident_management/oncall_rotations/shared_rotation_logic.rb'
diff --git a/.rubocop_todo/rails/redundant_foreign_key.yml b/.rubocop_todo/rails/redundant_foreign_key.yml
index db6e6cedc89..7e394849670 100644
--- a/.rubocop_todo/rails/redundant_foreign_key.yml
+++ b/.rubocop_todo/rails/redundant_foreign_key.yml
@@ -19,7 +19,6 @@ Rails/RedundantForeignKey:
- 'app/models/ci/unit_test_failure.rb'
- 'app/models/clusters/applications/runner.rb'
- 'app/models/clusters/concerns/application_core.rb'
- - 'app/models/clusters/integrations/elastic_stack.rb'
- 'app/models/clusters/integrations/prometheus.rb'
- 'app/models/commit_signatures/x509_commit_signature.rb'
- 'app/models/concerns/analytics/cycle_analytics/stage.rb'
diff --git a/.rubocop_todo/rails/skips_model_validations.yml b/.rubocop_todo/rails/skips_model_validations.yml
index 75a0d49862e..5c573a484f6 100644
--- a/.rubocop_todo/rails/skips_model_validations.yml
+++ b/.rubocop_todo/rails/skips_model_validations.yml
@@ -483,7 +483,6 @@ Rails/SkipsModelValidations:
- 'spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb'
- 'spec/features/projects/user_sees_sidebar_spec.rb'
- 'spec/features/projects_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb'
- 'spec/features/u2f_spec.rb'
- 'spec/features/users/show_spec.rb'
- 'spec/features/webauthn_spec.rb'
@@ -544,7 +543,6 @@ Rails/SkipsModelValidations:
- 'spec/lib/gitlab/middleware/go_spec.rb'
- 'spec/lib/gitlab/middleware/query_analyzer_spec.rb'
- 'spec/lib/gitlab/object_hierarchy_spec.rb'
- - 'spec/lib/gitlab/pages_transfer_spec.rb'
- 'spec/lib/gitlab/sidekiq_middleware/query_analyzer_spec.rb'
- 'spec/lib/sidebars/projects/menus/project_information_menu_spec.rb'
- 'spec/mailers/notify_spec.rb'
@@ -555,7 +553,6 @@ Rails/SkipsModelValidations:
- 'spec/models/ci/build_dependencies_spec.rb'
- 'spec/models/ci/build_spec.rb'
- 'spec/models/ci/group_spec.rb'
- - 'spec/models/ci/legacy_stage_spec.rb'
- 'spec/models/ci/pipeline_schedule_spec.rb'
- 'spec/models/ci/pipeline_spec.rb'
- 'spec/models/ci/processable_spec.rb'
@@ -718,7 +715,6 @@ Rails/SkipsModelValidations:
- 'spec/uploaders/job_artifact_uploader_spec.rb'
- 'spec/views/groups/edit.html.haml_spec.rb'
- 'spec/views/projects/environments/terminal.html.haml_spec.rb'
- - 'spec/views/projects/tracing/show.html.haml_spec.rb'
- 'spec/workers/auto_devops/disable_worker_spec.rb'
- 'spec/workers/build_finished_worker_spec.rb'
- 'spec/workers/ci/merge_requests/add_todo_when_build_fails_worker_spec.rb'
diff --git a/.rubocop_todo/rails/squished_sql_heredocs.yml b/.rubocop_todo/rails/squished_sql_heredocs.yml
index dc71b7b32ce..3696f661893 100644
--- a/.rubocop_todo/rails/squished_sql_heredocs.yml
+++ b/.rubocop_todo/rails/squished_sql_heredocs.yml
@@ -108,7 +108,6 @@ Rails/SquishedSQLHeredocs:
- 'ee/app/models/iterations/cadence.rb'
- 'ee/app/models/vulnerabilities/statistic.rb'
- 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb'
- - 'ee/app/services/security/ingestion/bulk_updatable_task.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_vulnerability_statistics.rb'
- 'ee/app/services/vulnerabilities/historical_statistics/adjustment_service.rb'
- 'ee/app/services/vulnerabilities/statistics/adjustment_service.rb'
diff --git a/.rubocop_todo/rails/time_zone.yml b/.rubocop_todo/rails/time_zone.yml
index 48e559312f8..8931b337ce1 100644
--- a/.rubocop_todo/rails/time_zone.yml
+++ b/.rubocop_todo/rails/time_zone.yml
@@ -121,7 +121,6 @@ Rails/TimeZone:
- spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb
- spec/lib/gitlab/prometheus/queries/validate_query_spec.rb
- spec/lib/gitlab/sidekiq_logging/json_formatter_spec.rb
- - spec/lib/gitlab/updated_notes_paginator_spec.rb
- spec/lib/gitlab/utils/json_size_estimator_spec.rb
- spec/lib/gitlab/x509/signature_spec.rb
- spec/lib/grafana/time_window_spec.rb
diff --git a/.rubocop_todo/rspec/any_instance_of.yml b/.rubocop_todo/rspec/any_instance_of.yml
index 399d1751687..2cc2478e530 100644
--- a/.rubocop_todo/rspec/any_instance_of.yml
+++ b/.rubocop_todo/rspec/any_instance_of.yml
@@ -47,7 +47,6 @@ RSpec/AnyInstanceOf:
- ee/spec/lib/gitlab/ci/templates/Jobs/load_performance_testing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/Verify/browser_performance_testing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb
- - ee/spec/lib/gitlab/ci/templates/api_fuzzing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/container_scanning_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/coverage_fuzzing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/dast_gitlab_ci_yaml_spec.rb
@@ -59,14 +58,7 @@ RSpec/AnyInstanceOf:
- ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
- ee/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb
- ee/spec/lib/omni_auth/strategies/group_saml_spec.rb
- - ee/spec/lib/security/ci_configuration/sast_build_actions_spec.rb
- ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb
- - ee/spec/migrations/schedule_populate_resolved_on_default_branch_column_spec.rb
- - ee/spec/migrations/update_location_fingerprint_column_for_cs_spec.rb
- - ee/spec/migrations/update_occurrence_severity_column_spec.rb
- - ee/spec/migrations/update_undefined_confidence_from_occurrences_spec.rb
- - ee/spec/migrations/update_undefined_confidence_from_vulnerabilities_spec.rb
- - ee/spec/migrations/update_vulnerability_severity_column_spec.rb
- ee/spec/models/ee/namespace_spec.rb
- ee/spec/models/geo_node_status_spec.rb
- ee/spec/models/issue_spec.rb
@@ -74,23 +66,18 @@ RSpec/AnyInstanceOf:
- ee/spec/models/project_import_state_spec.rb
- ee/spec/models/push_rule_spec.rb
- ee/spec/presenters/ci/pipeline_presenter_spec.rb
- - ee/spec/presenters/projects/security/configuration_presenter_spec.rb
- ee/spec/requests/api/geo_nodes_spec.rb
- ee/spec/requests/api/graphql/mutations/dast_on_demand_scans/create_spec.rb
- ee/spec/requests/api/graphql/mutations/dast_site_profiles/delete_spec.rb
- - ee/spec/requests/api/graphql/mutations/pipelines/run_dast_scan_spec.rb
- ee/spec/requests/api/issues_spec.rb
- ee/spec/requests/api/projects_spec.rb
- ee/spec/requests/git_http_spec.rb
- ee/spec/requests/groups_controller_spec.rb
- ee/spec/requests/omniauth_kerberos_spnego_spec.rb
- ee/spec/requests/repositories/git_http_controller_spec.rb
- - ee/spec/services/ci/expire_pipeline_cache_service_spec.rb
- - ee/spec/services/ci/run_dast_scan_service_spec.rb
- ee/spec/services/ee/git/branch_push_service_spec.rb
- ee/spec/services/ee/merge_requests/create_from_vulnerability_data_service_spec.rb
- ee/spec/services/ee/merge_requests/refresh_service_spec.rb
- - ee/spec/services/ee/security/ingress_modsecurity_usage_service_spec.rb
- ee/spec/services/ee/users/create_service_spec.rb
- ee/spec/services/ee/users/destroy_service_spec.rb
- ee/spec/services/geo/container_repository_sync_service_spec.rb
@@ -118,7 +105,6 @@ RSpec/AnyInstanceOf:
- ee/spec/support/shared_examples/models/member_shared_examples.rb
- ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb
- ee/spec/support/shared_examples/services/geo/geo_request_service_shared_examples.rb
- - ee/spec/workers/build_finished_worker_spec.rb
- ee/spec/workers/concerns/elastic/indexing_control_spec.rb
- ee/spec/workers/elastic_commit_indexer_worker_spec.rb
- ee/spec/workers/geo/design_repository_shard_sync_worker_spec.rb
@@ -155,7 +141,6 @@ RSpec/AnyInstanceOf:
- spec/controllers/projects/settings/integration_hook_logs_controller_spec.rb
- spec/controllers/projects/settings/integrations_controller_spec.rb
- spec/controllers/projects/tags_controller_spec.rb
- - spec/controllers/registrations/experience_levels_controller_spec.rb
- spec/controllers/registrations_controller_spec.rb
- spec/controllers/sessions_controller_spec.rb
- spec/controllers/snippets/notes_controller_spec.rb
@@ -176,7 +161,6 @@ RSpec/AnyInstanceOf:
- spec/features/projects/files/user_browses_lfs_files_spec.rb
- spec/features/projects/jobs_spec.rb
- spec/features/projects/navbar_spec.rb
- - spec/features/projects/pages_spec.rb
- spec/features/projects/settings/service_desk_setting_spec.rb
- spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb
- spec/features/snippets/embedded_snippet_spec.rb
@@ -190,7 +174,6 @@ RSpec/AnyInstanceOf:
- spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
- spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
- spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
- - spec/helpers/analytics/unique_visits_helper_spec.rb
- spec/helpers/projects_helper_spec.rb
- spec/initializers/lograge_spec.rb
- spec/lib/api/entities/merge_request_basic_spec.rb
@@ -211,8 +194,6 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
- spec/lib/gitlab/auth/request_authenticator_spec.rb
- spec/lib/gitlab/auth_spec.rb
- - spec/lib/gitlab/background_migration/populate_personal_snippet_statistics_spec.rb
- - spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb
- spec/lib/gitlab/checks/diff_check_spec.rb
- spec/lib/gitlab/checks/lfs_check_spec.rb
- spec/lib/gitlab/checks/lfs_integrity_spec.rb
@@ -231,8 +212,6 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/ci/templates/npm_spec.rb
- spec/lib/gitlab/ci/trace_spec.rb
- spec/lib/gitlab/current_settings_spec.rb
- - spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb
- - spec/lib/gitlab/database/multi_threaded_migration_spec.rb
- spec/lib/gitlab/diff/highlight_cache_spec.rb
- spec/lib/gitlab/diff/highlight_spec.rb
- spec/lib/gitlab/diff/position_spec.rb
@@ -272,10 +251,8 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/metrics/rack_middleware_spec.rb
- spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
- spec/lib/gitlab/metrics_spec.rb
- - spec/lib/gitlab/patch/action_dispatch_journey_formatter_spec.rb
- spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb
- spec/lib/gitlab/sidekiq_middleware_spec.rb
- - spec/lib/gitlab/tracking/destinations/product_analytics_spec.rb
- spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
- spec/lib/gitlab/tracking_spec.rb
- spec/lib/gitlab/usage_data_spec.rb
@@ -335,21 +312,17 @@ RSpec/AnyInstanceOf:
- spec/requests/git_http_spec.rb
- spec/requests/import/gitlab_projects_controller_spec.rb
- spec/routing/routing_spec.rb
- - spec/serializers/analytics_stage_serializer_spec.rb
- spec/serializers/merge_request_poll_cached_widget_entity_spec.rb
- spec/serializers/merge_request_poll_widget_entity_spec.rb
- spec/services/application_settings/update_service_spec.rb
- spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb
- spec/services/boards/lists/update_service_spec.rb
- spec/services/ci/create_pipeline_service_spec.rb
- - spec/services/ci/destroy_expired_job_artifacts_service_spec.rb
- spec/services/ci/expire_pipeline_cache_service_spec.rb
- spec/services/ci/list_config_variables_service_spec.rb
- spec/services/ci/register_job_service_spec.rb
- spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
- - spec/services/ci/retry_build_service_spec.rb
- spec/services/ci/retry_pipeline_service_spec.rb
- - spec/services/ci/stop_environments_service_spec.rb
- spec/services/clusters/applications/create_service_spec.rb
- spec/services/clusters/cleanup/project_namespace_service_spec.rb
- spec/services/clusters/cleanup/service_account_service_spec.rb
@@ -380,9 +353,6 @@ RSpec/AnyInstanceOf:
- spec/services/packages/conan/create_package_file_service_spec.rb
- spec/services/packages/nuget/metadata_extraction_service_spec.rb
- spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
- - spec/services/pages/delete_services_spec.rb
- - spec/services/pod_logs/elasticsearch_service_spec.rb
- - spec/services/pod_logs/kubernetes_service_spec.rb
- spec/services/post_receive_service_spec.rb
- spec/services/projects/after_rename_service_spec.rb
- spec/services/projects/container_repository/cleanup_tags_service_spec.rb
@@ -451,7 +421,6 @@ RSpec/AnyInstanceOf:
- spec/support/shared_examples/uploaders/object_storage_shared_examples.rb
- spec/support/shared_examples/workers/authorized_projects_worker_shared_example.rb
- spec/support/shared_examples/workers/reactive_cacheable_shared_examples.rb
- - spec/support/snowplow.rb
- spec/tasks/gitlab/cleanup_rake_spec.rb
- spec/tasks/gitlab/container_registry_rake_spec.rb
- spec/tasks/gitlab/db_rake_spec.rb
@@ -465,9 +434,7 @@ RSpec/AnyInstanceOf:
- spec/views/layouts/_head.html.haml_spec.rb
- spec/views/projects/artifacts/_artifact.html.haml_spec.rb
- spec/workers/archive_trace_worker_spec.rb
- - spec/workers/build_coverage_worker_spec.rb
- spec/workers/build_hooks_worker_spec.rb
- - spec/workers/build_trace_sections_worker_spec.rb
- spec/workers/ci/build_schedule_worker_spec.rb
- spec/workers/ci/daily_build_group_report_results_worker_spec.rb
- spec/workers/cluster_configure_istio_worker_spec.rb
@@ -481,14 +448,12 @@ RSpec/AnyInstanceOf:
- spec/workers/email_receiver_worker_spec.rb
- spec/workers/emails_on_push_worker_spec.rb
- spec/workers/error_tracking_issue_link_worker_spec.rb
- - spec/workers/expire_pipeline_cache_worker_spec.rb
- spec/workers/group_export_worker_spec.rb
- spec/workers/group_import_worker_spec.rb
- spec/workers/namespaces/root_statistics_worker_spec.rb
- spec/workers/new_note_worker_spec.rb
- spec/workers/object_pool/create_worker_spec.rb
- spec/workers/packages/nuget/extraction_worker_spec.rb
- - spec/workers/pages_remove_worker_spec.rb
- spec/workers/pipeline_hooks_worker_spec.rb
- spec/workers/pipeline_process_worker_spec.rb
- spec/workers/pipeline_schedule_worker_spec.rb
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
index 0e313122b09..724aa420d89 100644
--- a/.rubocop_todo/rspec/context_wording.yml
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -154,7 +154,6 @@ RSpec/ContextWording:
- 'ee/spec/features/groups/wiki/user_views_wiki_empty_spec.rb'
- 'ee/spec/features/groups_spec.rb'
- 'ee/spec/features/ide/user_opens_ide_spec.rb'
- - 'ee/spec/features/incidents/incident_details_spec.rb'
- 'ee/spec/features/integrations/jira/jira_issues_list_spec.rb'
- 'ee/spec/features/issues/epic_in_issue_sidebar_spec.rb'
- 'ee/spec/features/issues/filtered_search/filter_issues_by_iteration_spec.rb'
@@ -223,7 +222,7 @@ RSpec/ContextWording:
- 'ee/spec/features/trials/select_namespace_spec.rb'
- 'ee/spec/features/users/login_spec.rb'
- 'ee/spec/features/users/signup_spec.rb'
- - 'ee/spec/finders/audit_log_finder_spec.rb'
+ - 'ee/spec/finders/audit_event_finder_spec.rb'
- 'ee/spec/finders/autocomplete/vulnerabilities_autocomplete_finder_spec.rb'
- 'ee/spec/finders/billed_users_finder_spec.rb'
- 'ee/spec/finders/clusters/environments_finder_spec.rb'
@@ -233,7 +232,6 @@ RSpec/ContextWording:
- 'ee/spec/finders/dast_scanner_profiles_finder_spec.rb'
- 'ee/spec/finders/dast_site_profiles_finder_spec.rb'
- 'ee/spec/finders/dast_site_validations_finder_spec.rb'
- - 'ee/spec/finders/ee/alert_management/alerts_finder_spec.rb'
- 'ee/spec/finders/ee/alert_management/http_integrations_finder_spec.rb'
- 'ee/spec/finders/ee/clusters/agent_authorizations_finder_spec.rb'
- 'ee/spec/finders/ee/group_members_finder_spec.rb'
@@ -487,11 +485,6 @@ RSpec/ContextWording:
- 'ee/spec/lib/gitlab/geo/log_helpers_spec.rb'
- 'ee/spec/lib/gitlab/geo/oauth/session_spec.rb'
- 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/file_downloader_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/file_retriever_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/job_artifact_downloader_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb'
- 'ee/spec/lib/gitlab/geo/replicator_spec.rb'
- 'ee/spec/lib/gitlab/geo/signed_data_spec.rb'
- 'ee/spec/lib/gitlab/geo_spec.rb'
@@ -501,7 +494,7 @@ RSpec/ContextWording:
- 'ee/spec/lib/gitlab/gl_repository/repo_type_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/epics/epic_node_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate_spec.rb'
- - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_links_aggregate_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/vulnerabilities/lazy_user_notes_count_aggregate_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb'
@@ -875,11 +868,9 @@ RSpec/ContextWording:
- 'ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb'
- 'ee/spec/services/ee/git/branch_push_service_spec.rb'
- 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
- - 'ee/spec/services/ee/incident_management/issuable_escalation_statuses/after_update_service_spec.rb'
- 'ee/spec/services/ee/integrations/test/project_service_spec.rb'
- 'ee/spec/services/ee/ip_restrictions/update_service_spec.rb'
- 'ee/spec/services/ee/issuable/bulk_update_service_spec.rb'
- - 'ee/spec/services/ee/issuable/clone/attributes_rewriter_spec.rb'
- 'ee/spec/services/ee/issuable/common_system_notes_service_spec.rb'
- 'ee/spec/services/ee/issues/clone_service_spec.rb'
- 'ee/spec/services/ee/issues/close_service_spec.rb'
@@ -908,8 +899,6 @@ RSpec/ContextWording:
- 'ee/spec/services/ee/protected_branches/create_service_spec.rb'
- 'ee/spec/services/ee/quick_actions/target_service_spec.rb'
- 'ee/spec/services/ee/resource_events/merge_into_notes_service_spec.rb'
- - 'ee/spec/services/ee/service_ping/build_payload_service_spec.rb'
- - 'ee/spec/services/ee/service_ping/permit_data_categories_service_spec.rb'
- 'ee/spec/services/ee/users/build_service_spec.rb'
- 'ee/spec/services/ee/users/create_service_spec.rb'
- 'ee/spec/services/ee/users/destroy_service_spec.rb'
@@ -936,9 +925,7 @@ RSpec/ContextWording:
- 'ee/spec/services/geo/container_repository_sync_service_spec.rb'
- 'ee/spec/services/geo/container_repository_sync_spec.rb'
- 'ee/spec/services/geo/design_repository_sync_service_spec.rb'
- - 'ee/spec/services/geo/file_download_service_spec.rb'
- 'ee/spec/services/geo/file_registry_removal_service_spec.rb'
- - 'ee/spec/services/geo/file_upload_service_spec.rb'
- 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
- 'ee/spec/services/geo/hashed_storage_migration_service_spec.rb'
- 'ee/spec/services/geo/move_repository_service_spec.rb'
@@ -990,7 +977,6 @@ RSpec/ContextWording:
- 'ee/spec/services/merge_requests/merge_service_spec.rb'
- 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
- 'ee/spec/services/milestones/update_service_spec.rb'
- - 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
- 'ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
- 'ee/spec/services/namespaces/storage/email_notification_service_spec.rb'
- 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
@@ -1113,7 +1099,6 @@ RSpec/ContextWording:
- 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
- 'ee/spec/tasks/gitlab/license_rake_spec.rb'
- 'ee/spec/tasks/gitlab/uploads/migrate_rake_spec.rb'
- - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
- 'ee/spec/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb'
- 'ee/spec/views/admin/users/show.html.haml_spec.rb'
- 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb'
@@ -1160,7 +1145,6 @@ RSpec/ContextWording:
- 'ee/spec/workers/elastic_index_bulk_cron_worker_spec.rb'
- 'ee/spec/workers/elastic_indexing_control_worker_spec.rb'
- 'ee/spec/workers/geo/create_repository_updated_event_worker_spec.rb'
- - 'ee/spec/workers/geo/file_download_dispatch_worker_spec.rb'
- 'ee/spec/workers/geo/prune_event_log_worker_spec.rb'
- 'ee/spec/workers/geo/repository_shard_sync_worker_spec.rb'
- 'ee/spec/workers/geo/repository_sync_worker_spec.rb'
@@ -1178,7 +1162,6 @@ RSpec/ContextWording:
- 'ee/spec/workers/post_receive_spec.rb'
- 'ee/spec/workers/project_import_schedule_worker_spec.rb'
- 'ee/spec/workers/requirements_management/process_requirements_reports_worker_spec.rb'
- - 'ee/spec/workers/security/generate_scan_finding_rules_worker_spec.rb'
- 'ee/spec/workers/security/track_secure_scans_worker_spec.rb'
- 'ee/spec/workers/store_security_reports_worker_spec.rb'
- 'ee/spec/workers/sync_seat_link_request_worker_spec.rb'
@@ -1414,7 +1397,6 @@ RSpec/ContextWording:
- 'spec/features/admin/admin_mode/logout_spec.rb'
- 'spec/features/admin/admin_mode/workers_spec.rb'
- 'spec/features/admin/admin_mode_spec.rb'
- - 'spec/features/admin/admin_runners_spec.rb'
- 'spec/features/admin/admin_search_settings_spec.rb'
- 'spec/features/admin/admin_settings_spec.rb'
- 'spec/features/admin/dashboard_spec.rb'
@@ -1461,7 +1443,6 @@ RSpec/ContextWording:
- 'spec/features/groups/dependency_proxy_for_containers_spec.rb'
- 'spec/features/groups/dependency_proxy_spec.rb'
- 'spec/features/groups/empty_states_spec.rb'
- - 'spec/features/groups/group_runners_spec.rb'
- 'spec/features/groups/group_settings_spec.rb'
- 'spec/features/groups/issues_spec.rb'
- 'spec/features/groups/labels/subscription_spec.rb'
@@ -1484,7 +1465,6 @@ RSpec/ContextWording:
- 'spec/features/ics/project_issues_spec.rb'
- 'spec/features/ide/clientside_preview_csp_spec.rb'
- 'spec/features/ide/static_object_external_storage_csp_spec.rb'
- - 'spec/features/incidents/incident_details_spec.rb'
- 'spec/features/incidents/user_creates_new_incident_spec.rb'
- 'spec/features/invites_spec.rb'
- 'spec/features/issuables/markdown_references/internal_references_spec.rb'
@@ -1656,8 +1636,6 @@ RSpec/ContextWording:
- 'spec/features/projects/wiki/user_views_wiki_empty_spec.rb'
- 'spec/features/projects_spec.rb'
- 'spec/features/protected_branches_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb'
- 'spec/features/reportable_note/commit_spec.rb'
- 'spec/features/reportable_note/merge_request_spec.rb'
- 'spec/features/runners_spec.rb'
@@ -1859,7 +1837,6 @@ RSpec/ContextWording:
- 'spec/helpers/events_helper_spec.rb'
- 'spec/helpers/git_helper_spec.rb'
- 'spec/helpers/gitlab_routing_helper_spec.rb'
- - 'spec/helpers/groups/crm_settings_helper_spec.rb'
- 'spec/helpers/groups/group_members_helper_spec.rb'
- 'spec/helpers/groups_helper_spec.rb'
- 'spec/helpers/ide_helper_spec.rb'
@@ -2239,7 +2216,6 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/database_spec.rb'
- 'spec/lib/gitlab/default_branch_spec.rb'
- 'spec/lib/gitlab/deploy_key_access_spec.rb'
- - 'spec/lib/gitlab/diff/custom_diff_spec.rb'
- 'spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb'
- 'spec/lib/gitlab/diff/file_spec.rb'
- 'spec/lib/gitlab/diff/formatters/text_formatter_spec.rb'
@@ -2636,7 +2612,6 @@ RSpec/ContextWording:
- 'spec/models/ci/deleted_object_spec.rb'
- 'spec/models/ci/job_artifact_spec.rb'
- 'spec/models/ci/job_token/project_scope_link_spec.rb'
- - 'spec/models/ci/legacy_stage_spec.rb'
- 'spec/models/ci/namespace_mirror_spec.rb'
- 'spec/models/ci/pending_build_spec.rb'
- 'spec/models/ci/pipeline_artifact_spec.rb'
@@ -2657,7 +2632,6 @@ RSpec/ContextWording:
- 'spec/models/clusters/agent_spec.rb'
- 'spec/models/clusters/applications/cert_manager_spec.rb'
- 'spec/models/clusters/applications/crossplane_spec.rb'
- - 'spec/models/clusters/applications/elastic_stack_spec.rb'
- 'spec/models/clusters/applications/helm_spec.rb'
- 'spec/models/clusters/applications/ingress_spec.rb'
- 'spec/models/clusters/applications/jupyter_spec.rb'
@@ -2894,7 +2868,6 @@ RSpec/ContextWording:
- 'spec/presenters/packages/conan/package_presenter_spec.rb'
- 'spec/presenters/packages/npm/package_presenter_spec.rb'
- 'spec/presenters/packages/nuget/service_index_presenter_spec.rb'
- - 'spec/presenters/packages/pypi/package_presenter_spec.rb'
- 'spec/presenters/project_member_presenter_spec.rb'
- 'spec/presenters/project_presenter_spec.rb'
- 'spec/presenters/projects/import_export/project_export_presenter_spec.rb'
@@ -3168,7 +3141,6 @@ RSpec/ContextWording:
- 'spec/serializers/cluster_application_entity_spec.rb'
- 'spec/serializers/cluster_entity_spec.rb'
- 'spec/serializers/context_commits_diff_entity_spec.rb'
- - 'spec/serializers/deploy_key_entity_spec.rb'
- 'spec/serializers/diff_file_base_entity_spec.rb'
- 'spec/serializers/diff_file_entity_spec.rb'
- 'spec/serializers/diff_file_metadata_entity_spec.rb'
@@ -3330,7 +3302,6 @@ RSpec/ContextWording:
- 'spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb'
- 'spec/services/integrations/propagate_service_spec.rb'
- 'spec/services/integrations/test/project_service_spec.rb'
- - 'spec/services/issuable/clone/attributes_rewriter_spec.rb'
- 'spec/services/issuable/common_system_notes_service_spec.rb'
- 'spec/services/issue_links/list_service_spec.rb'
- 'spec/services/issues/build_service_spec.rb'
@@ -3483,7 +3454,6 @@ RSpec/ContextWording:
- 'spec/services/projects/update_remote_mirror_service_spec.rb'
- 'spec/services/projects/update_repository_storage_service_spec.rb'
- 'spec/services/projects/update_service_spec.rb'
- - 'spec/services/prometheus/create_default_alerts_service_spec.rb'
- 'spec/services/prometheus/proxy_service_spec.rb'
- 'spec/services/prometheus/proxy_variable_substitution_service_spec.rb'
- 'spec/services/protected_tags/create_service_spec.rb'
@@ -3682,7 +3652,6 @@ RSpec/ContextWording:
- 'spec/support/shared_examples/models/cluster_application_helm_cert_shared_examples.rb'
- 'spec/support/shared_examples/models/cluster_application_status_shared_examples.rb'
- 'spec/support/shared_examples/models/cluster_application_version_shared_examples.rb'
- - 'spec/support/shared_examples/models/clusters/elastic_stack_client_shared.rb'
- 'spec/support/shared_examples/models/clusters/prometheus_client_shared.rb'
- 'spec/support/shared_examples/models/concerns/can_move_repository_storage_shared_examples.rb'
- 'spec/support/shared_examples/models/concerns/composite_id_shared_examples.rb'
@@ -3883,11 +3852,9 @@ RSpec/ContextWording:
- 'spec/workers/deployments/update_environment_worker_spec.rb'
- 'spec/workers/design_management/new_version_worker_spec.rb'
- 'spec/workers/every_sidekiq_worker_spec.rb'
- - 'spec/workers/expire_build_instance_artifacts_worker_spec.rb'
- 'spec/workers/group_import_worker_spec.rb'
- 'spec/workers/incident_management/process_alert_worker_v2_spec.rb'
- 'spec/workers/integrations/create_external_cross_reference_worker_spec.rb'
- - 'spec/workers/issue_placement_worker_spec.rb'
- 'spec/workers/issues/placement_worker_spec.rb'
- 'spec/workers/merge_requests/delete_source_branch_worker_spec.rb'
- 'spec/workers/metrics/dashboard/prune_old_annotations_worker_spec.rb'
@@ -3902,7 +3869,6 @@ RSpec/ContextWording:
- 'spec/workers/projects/git_garbage_collect_worker_spec.rb'
- 'spec/workers/projects/post_creation_worker_spec.rb'
- 'spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb'
- - 'spec/workers/prometheus/create_default_alerts_worker_spec.rb'
- 'spec/workers/purge_dependency_proxy_cache_worker_spec.rb'
- 'spec/workers/remove_expired_group_links_worker_spec.rb'
- 'spec/workers/remove_expired_members_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/expect_change.yml b/.rubocop_todo/rspec/expect_change.yml
index 3b4d463ad69..b08830bd5a3 100644
--- a/.rubocop_todo/rspec/expect_change.yml
+++ b/.rubocop_todo/rspec/expect_change.yml
@@ -151,7 +151,6 @@ RSpec/ExpectChange:
- 'ee/spec/services/ee/groups/deploy_tokens/create_service_spec.rb'
- 'ee/spec/services/ee/groups/deploy_tokens/destroy_service_spec.rb'
- 'ee/spec/services/ee/groups/deploy_tokens/revoke_service_spec.rb'
- - 'ee/spec/services/ee/issuable/clone/attributes_rewriter_spec.rb'
- 'ee/spec/services/ee/issuable/common_system_notes_service_spec.rb'
- 'ee/spec/services/ee/issues/create_service_spec.rb'
- 'ee/spec/services/ee/issues/update_service_spec.rb'
@@ -181,7 +180,6 @@ RSpec/ExpectChange:
- 'ee/spec/services/external_status_checks/destroy_service_spec.rb'
- 'ee/spec/services/external_status_checks/update_service_spec.rb'
- 'ee/spec/services/geo/blob_download_service_spec.rb'
- - 'ee/spec/services/geo/file_download_service_spec.rb'
- 'ee/spec/services/geo/metrics_update_service_spec.rb'
- 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
- 'ee/spec/services/geo/registry_consistency_service_spec.rb'
@@ -190,7 +188,6 @@ RSpec/ExpectChange:
- 'ee/spec/services/group_saml/identity/destroy_service_spec.rb'
- 'ee/spec/services/group_saml/sign_up_service_spec.rb'
- 'ee/spec/services/groups/mark_for_deletion_service_spec.rb'
- - 'ee/spec/services/groups/recent_merge_requests_count_service_spec.rb'
- 'ee/spec/services/groups/restore_service_spec.rb'
- 'ee/spec/services/groups/sync_service_spec.rb'
- 'ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb'
@@ -201,7 +198,6 @@ RSpec/ExpectChange:
- 'ee/spec/services/lfs/unlock_file_service_spec.rb'
- 'ee/spec/services/merge_request_approval_settings/update_service_spec.rb'
- 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
- - 'ee/spec/services/namespaces/update_prevent_sharing_outside_hierarchy_service_spec.rb'
- 'ee/spec/services/projects/import_service_spec.rb'
- 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
- 'ee/spec/services/projects/restore_service_spec.rb'
@@ -242,7 +238,6 @@ RSpec/ExpectChange:
- 'ee/spec/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker_spec.rb'
- 'ee/spec/workers/geo/verification_state_backfill_service_spec.rb'
- 'ee/spec/workers/new_epic_worker_spec.rb'
- - 'ee/spec/workers/security/generate_scan_finding_rules_worker_spec.rb'
- 'ee/spec/workers/store_security_reports_worker_spec.rb'
- 'spec/controllers/admin/clusters_controller_spec.rb'
- 'spec/controllers/admin/groups_controller_spec.rb'
@@ -632,4 +627,3 @@ RSpec/ExpectChange:
- 'spec/workers/update_highest_role_worker_spec.rb'
- 'spec/workers/user_status_cleanup/batch_worker_spec.rb'
- 'spec/workers/users/create_statistics_worker_spec.rb'
- - 'spec/workers/web_hooks/destroy_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/expect_in_hook.yml b/.rubocop_todo/rspec/expect_in_hook.yml
index 09a6f5e6192..cd73b76b14e 100644
--- a/.rubocop_todo/rspec/expect_in_hook.yml
+++ b/.rubocop_todo/rspec/expect_in_hook.yml
@@ -30,7 +30,6 @@ RSpec/ExpectInHook:
- 'ee/spec/helpers/billing_plans_helper_spec.rb'
- 'ee/spec/helpers/ee/ci/runners_helper_spec.rb'
- 'ee/spec/helpers/ee/issues_helper_spec.rb'
- - 'ee/spec/helpers/ee/namespace_storage_limit_alert_helper_spec.rb'
- 'ee/spec/helpers/ee/welcome_helper_spec.rb'
- 'ee/spec/helpers/kerberos_spnego_helper_spec.rb'
- 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
@@ -42,11 +41,10 @@ RSpec/ExpectInHook:
- 'ee/spec/lib/gitlab/ci/minutes/cost_factor_spec.rb'
- 'ee/spec/lib/gitlab/code_owners/validator_spec.rb'
- 'ee/spec/lib/gitlab/code_owners_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/job_artifact_retriever_spec.rb'
- 'ee/spec/lib/gitlab/geo_spec.rb'
- 'ee/spec/lib/gitlab/git_access_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate_spec.rb'
- - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_links_aggregate_spec.rb'
- 'ee/spec/lib/gitlab/mirror_spec.rb'
- 'ee/spec/lib/gitlab/sitemaps/generator_spec.rb'
- 'ee/spec/lib/gitlab/subscription_portal/clients/graphql_spec.rb'
@@ -90,13 +88,11 @@ RSpec/ExpectInHook:
- 'ee/spec/services/groups/update_repository_storage_service_spec.rb'
- 'ee/spec/services/members/activate_service_spec.rb'
- 'ee/spec/services/merge_requests/approval_service_spec.rb'
- - 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
- 'ee/spec/services/projects/create_from_template_service_spec.rb'
- 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
- 'ee/spec/services/projects/update_mirror_service_spec.rb'
- 'ee/spec/services/security/findings/cleanup_service_spec.rb'
- 'ee/spec/services/upcoming_reconciliations/update_service_spec.rb'
- - 'ee/spec/support/shared_examples/controllers/namespace_storage_limit_alert_shared_examples.rb'
- 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
- 'ee/spec/support/shared_examples/models/concerns/elastic/cannot_read_cross_project_shared_examples.rb'
- 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
@@ -448,7 +444,6 @@ RSpec/ExpectInHook:
- 'spec/services/packages/update_package_file_service_spec.rb'
- 'spec/services/pages/zip_directory_service_spec.rb'
- 'spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb'
- - 'spec/services/projects/after_import_service_spec.rb'
- 'spec/services/projects/after_rename_service_spec.rb'
- 'spec/services/projects/branches_by_mode_service_spec.rb'
- 'spec/services/projects/container_repository/cleanup_tags_service_spec.rb'
@@ -456,7 +451,6 @@ RSpec/ExpectInHook:
- 'spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb'
- 'spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb'
- 'spec/services/projects/create_from_template_service_spec.rb'
- - 'spec/services/projects/destroy_rollback_service_spec.rb'
- 'spec/services/projects/destroy_service_spec.rb'
- 'spec/services/projects/import_export/export_service_spec.rb'
- 'spec/services/projects/import_service_spec.rb'
@@ -471,7 +465,6 @@ RSpec/ExpectInHook:
- 'spec/services/protected_branches/create_service_spec.rb'
- 'spec/services/protected_branches/destroy_service_spec.rb'
- 'spec/services/protected_branches/update_service_spec.rb'
- - 'spec/services/repositories/destroy_rollback_service_spec.rb'
- 'spec/services/repositories/destroy_service_spec.rb'
- 'spec/services/search_service_spec.rb'
- 'spec/services/serverless/associate_domain_service_spec.rb'
diff --git a/.rubocop_todo/rspec/instance_variable.yml b/.rubocop_todo/rspec/instance_variable.yml
index 7489aca5b51..df62a8b0f87 100644
--- a/.rubocop_todo/rspec/instance_variable.yml
+++ b/.rubocop_todo/rspec/instance_variable.yml
@@ -14,7 +14,6 @@ RSpec/InstanceVariable:
- ee/spec/graphql/types/vulnerability_request_type_spec.rb
- ee/spec/graphql/types/vulnerability_response_type_spec.rb
- ee/spec/helpers/ee/issuables_helper_spec.rb
- - ee/spec/helpers/ee/namespace_storage_limit_alert_helper_spec.rb
- ee/spec/helpers/ee/wiki_helper_spec.rb
- ee/spec/helpers/notes_helper_spec.rb
- ee/spec/helpers/search_helper_spec.rb
@@ -72,7 +71,6 @@ RSpec/InstanceVariable:
- qa/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb
- qa/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb
- qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb
- - qa/qa/specs/features/ee/browser_ui/4_verify/cancelling_merge_request_in_merge_train_spec.rb
- qa/spec/support/repeater_spec.rb
- spec/commands/metrics_server/metrics_server_spec.rb
- spec/controllers/admin/clusters_controller_spec.rb
@@ -89,7 +87,6 @@ RSpec/InstanceVariable:
- spec/controllers/profiles/avatars_controller_spec.rb
- spec/controllers/projects/clusters_controller_spec.rb
- spec/controllers/sessions_controller_spec.rb
- - spec/features/admin/admin_runners_spec.rb
- spec/features/calendar_spec.rb
- spec/features/issues/user_filters_issues_spec.rb
- spec/features/markdown/copy_as_gfm_spec.rb
diff --git a/.rubocop_todo/rspec/multiple_memoized_helpers.yml b/.rubocop_todo/rspec/multiple_memoized_helpers.yml
index 2f6d390bec2..8330d768794 100644
--- a/.rubocop_todo/rspec/multiple_memoized_helpers.yml
+++ b/.rubocop_todo/rspec/multiple_memoized_helpers.yml
@@ -1,11 +1,9 @@
---
RSpec/MultipleMemoizedHelpers:
Exclude:
- - spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb
- spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb
- spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb
- spec/requests/api/ci/runner/jobs_artifacts_spec.rb
- ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb
- ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb
- ee/spec/services/ee/boards/issues/move_service_spec.rb
- - ee/spec/services/security/store_report_service_spec.rb
diff --git a/.rubocop_todo/rspec/predicate_matcher.yml b/.rubocop_todo/rspec/predicate_matcher.yml
index ebd11aeb449..c6a75708ae8 100644
--- a/.rubocop_todo/rspec/predicate_matcher.yml
+++ b/.rubocop_todo/rspec/predicate_matcher.yml
@@ -32,8 +32,6 @@ RSpec/PredicateMatcher:
- 'ee/spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
- 'ee/spec/lib/gitlab/geo/geo_node_status_check_spec.rb'
- 'ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/base_transfer_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
- 'ee/spec/lib/gitlab/geo/replicator_spec.rb'
- 'ee/spec/lib/gitlab/geo_spec.rb'
- 'ee/spec/lib/gitlab/mirror_spec.rb'
@@ -72,7 +70,6 @@ RSpec/PredicateMatcher:
- 'ee/spec/models/project_spec.rb'
- 'ee/spec/models/saml_provider_spec.rb'
- 'ee/spec/models/security/orchestration_policy_configuration_spec.rb'
- - 'ee/spec/presenters/ci/minutes/quota_presenter_spec.rb'
- 'ee/spec/requests/api/boards_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/epics/set_subscription_spec.rb'
- 'ee/spec/requests/api/groups_spec.rb'
@@ -250,7 +247,6 @@ RSpec/PredicateMatcher:
- 'spec/lib/gitlab/dependency_linker/podspec_linker_spec.rb'
- 'spec/lib/gitlab/dependency_linker/requirements_txt_linker_spec.rb'
- 'spec/lib/gitlab/deploy_key_access_spec.rb'
- - 'spec/lib/gitlab/diff/custom_diff_spec.rb'
- 'spec/lib/gitlab/diff/file_spec.rb'
- 'spec/lib/gitlab/diff/position_spec.rb'
- 'spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb'
@@ -458,7 +454,6 @@ RSpec/PredicateMatcher:
- 'spec/services/projects/after_rename_service_spec.rb'
- 'spec/services/projects/cleanup_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/fork_service_spec.rb'
- 'spec/services/projects/hashed_storage/base_attachment_service_spec.rb'
@@ -471,7 +466,6 @@ RSpec/PredicateMatcher:
- 'spec/services/projects/update_pages_service_spec.rb'
- 'spec/services/projects/update_service_spec.rb'
- 'spec/services/releases/create_service_spec.rb'
- - 'spec/services/repositories/destroy_rollback_service_spec.rb'
- 'spec/services/repositories/destroy_service_spec.rb'
- 'spec/services/repository_archive_clean_up_service_spec.rb'
- 'spec/services/resource_access_tokens/revoke_service_spec.rb'
@@ -506,7 +500,6 @@ RSpec/PredicateMatcher:
- 'spec/workers/ci/delete_objects_worker_spec.rb'
- 'spec/workers/concerns/worker_attributes_spec.rb'
- 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
- - 'spec/workers/expire_build_instance_artifacts_worker_spec.rb'
- 'spec/workers/group_destroy_worker_spec.rb'
- 'spec/workers/hashed_storage/migrator_worker_spec.rb'
- 'spec/workers/hashed_storage/rollbacker_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/repeated_example_group_body.yml b/.rubocop_todo/rspec/repeated_example_group_body.yml
index 87148442b08..6fdeb9a2094 100644
--- a/.rubocop_todo/rspec/repeated_example_group_body.yml
+++ b/.rubocop_todo/rspec/repeated_example_group_body.yml
@@ -1,8 +1,5 @@
---
RSpec/RepeatedExampleGroupBody:
- # Offense count: 143
- # Temporarily disabled due to too many offenses
- Enabled: false
Exclude:
- 'ee/spec/controllers/ee/groups_controller_spec.rb'
- 'ee/spec/lib/banzai/filter/references/vulnerability_reference_filters_spec.rb'
@@ -18,12 +15,10 @@ RSpec/RepeatedExampleGroupBody:
- 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/update_spec.rb'
- 'ee/spec/requests/groups/security/credentials_controller_spec.rb'
- 'ee/spec/services/app_sec/dast/profiles/create_associations_service_spec.rb'
- - 'ee/spec/services/groups/sync_service_spec.rb'
- 'spec/controllers/groups/registry/repositories_controller_spec.rb'
- 'spec/controllers/projects/blob_controller_spec.rb'
- 'spec/controllers/projects/graphs_controller_spec.rb'
- 'spec/controllers/projects/registry/repositories_controller_spec.rb'
- - 'spec/features/incidents/incident_details_spec.rb'
- 'spec/features/issues/spam_akismet_issue_creation_spec.rb'
- 'spec/features/merge_request/user_sees_closing_issues_message_spec.rb'
- 'spec/features/projects/commit/cherry_pick_spec.rb'
@@ -31,6 +26,7 @@ RSpec/RepeatedExampleGroupBody:
- 'spec/features/security/project/private_access_spec.rb'
- 'spec/finders/packages/nuget/package_finder_spec.rb'
- 'spec/helpers/gitlab_routing_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
- 'spec/lib/api/entities/application_setting_spec.rb'
- 'spec/lib/banzai/filter/references/commit_range_reference_filter_spec.rb'
- 'spec/lib/banzai/filter/references/commit_reference_filter_spec.rb'
@@ -39,9 +35,9 @@ RSpec/RepeatedExampleGroupBody:
- 'spec/lib/gitlab/ci/config/entry/release_spec.rb'
- 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
- 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb'
- 'spec/lib/gitlab/empty_search_results_spec.rb'
- 'spec/lib/gitlab/import_export/project/sample/relation_factory_spec.rb'
- - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
- 'spec/lib/gitlab/lfs/client_spec.rb'
- 'spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb'
- 'spec/lib/gitlab/sanitizers/exif_spec.rb'
diff --git a/.rubocop_todo/rspec/repeated_example_group_description.yml b/.rubocop_todo/rspec/repeated_example_group_description.yml
index 562f5602d58..b5c4ac090ae 100644
--- a/.rubocop_todo/rspec/repeated_example_group_description.yml
+++ b/.rubocop_todo/rspec/repeated_example_group_description.yml
@@ -1,10 +1,8 @@
---
RSpec/RepeatedExampleGroupDescription:
- # Offense count: 263
- # Temporarily disabled due to too many offenses
- Enabled: false
Exclude:
- 'ee/spec/finders/merge_trains_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerability_reads_finder_spec.rb'
- 'ee/spec/graphql/resolvers/vulnerabilities_grade_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/vulnerability_severities_count_resolver_spec.rb'
- 'ee/spec/helpers/ee/auth_helper_spec.rb'
@@ -24,16 +22,15 @@ RSpec/RepeatedExampleGroupDescription:
- 'ee/spec/models/software_license_spec.rb'
- 'ee/spec/policies/app_sec/fuzzing/coverage/corpus_policy_spec.rb'
- 'ee/spec/policies/group_policy_spec.rb'
- - 'ee/spec/policies/project_policy_spec.rb'
- 'ee/spec/requests/api/graphql/iteration_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb'
- - 'ee/spec/requests/api/graphql/vulnerabilities/sort_spec.rb'
- 'ee/spec/requests/groups/security/credentials_controller_spec.rb'
+ - 'ee/spec/requests/groups/settings/reporting_controller_spec.rb'
- 'ee/spec/services/app_sec/dast/profiles/create_associations_service_spec.rb'
- 'ee/spec/services/app_sec/dast/site_validations/find_or_create_service_spec.rb'
- 'ee/spec/services/audit_event_service_spec.rb'
- - 'ee/spec/services/groups/sync_service_spec.rb'
- 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/scoped_label_shared_examples.rb'
- 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
- 'spec/controllers/profiles/notifications_controller_spec.rb'
@@ -44,6 +41,7 @@ RSpec/RepeatedExampleGroupDescription:
- 'spec/features/merge_request/user_sees_merge_widget_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- 'spec/features/projects/new_project_spec.rb'
+ - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- 'spec/features/security/project/private_access_spec.rb'
- 'spec/finders/ci/pipelines_for_merge_request_finder_spec.rb'
- 'spec/frontend/fixtures/runner.rb'
@@ -52,7 +50,6 @@ RSpec/RepeatedExampleGroupDescription:
- 'spec/helpers/dropdowns_helper_spec.rb'
- 'spec/helpers/gitlab_routing_helper_spec.rb'
- 'spec/helpers/namespaces_helper_spec.rb'
- - 'spec/initializers/omniauth_spec.rb'
- 'spec/lib/banzai/pipeline/gfm_pipeline_spec.rb'
- 'spec/lib/gitlab/alert_management/payload/base_spec.rb'
- 'spec/lib/gitlab/auth/atlassian/auth_hash_spec.rb'
@@ -69,14 +66,15 @@ RSpec/RepeatedExampleGroupDescription:
- 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
- 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
- 'spec/lib/gitlab/data_builder/push_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb'
- 'spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb'
- 'spec/lib/gitlab/git/diff_spec.rb'
- 'spec/lib/gitlab/git/push_spec.rb'
- 'spec/lib/gitlab/git/repository_spec.rb'
- 'spec/lib/gitlab/import_export/project/sample/relation_factory_spec.rb'
- - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
- 'spec/lib/gitlab/kubernetes/rollout_status_spec.rb'
- 'spec/lib/gitlab/metrics/dashboard/validator/errors_spec.rb'
+ - 'spec/lib/gitlab/redis/multi_store_spec.rb'
- 'spec/lib/gitlab/sanitizers/exif_spec.rb'
- 'spec/lib/gitlab/template/finders/global_template_finder_spec.rb'
- 'spec/lib/gitlab/usage_data_spec.rb'
@@ -93,8 +91,10 @@ RSpec/RepeatedExampleGroupDescription:
- 'spec/models/project_spec.rb'
- 'spec/models/ssh_host_key_spec.rb'
- 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/graphql/ci/runners_spec.rb'
- 'spec/requests/api/graphql/project/release_spec.rb'
- 'spec/requests/api/group_clusters_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
- 'spec/requests/api/merge_requests_spec.rb'
- 'spec/requests/api/notification_settings_spec.rb'
- 'spec/requests/api/project_clusters_spec.rb'
@@ -105,10 +105,10 @@ RSpec/RepeatedExampleGroupDescription:
- 'spec/services/import/github_service_spec.rb'
- 'spec/services/merge_requests/refresh_service_spec.rb'
- 'spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb'
- - 'spec/services/resource_access_tokens/create_service_spec.rb'
- 'spec/services/verify_pages_domain_service_spec.rb'
- 'spec/support/cycle_analytics_helpers/test_generation.rb'
- 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/limitable_shared_examples.rb'
- 'spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb'
- 'spec/support/shared_examples/serializers/diff_file_entity_shared_examples.rb'
- 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
diff --git a/.rubocop_todo/rspec/return_from_stub.yml b/.rubocop_todo/rspec/return_from_stub.yml
index 2fb01b855be..21cd26a0a6f 100644
--- a/.rubocop_todo/rspec/return_from_stub.yml
+++ b/.rubocop_todo/rspec/return_from_stub.yml
@@ -21,7 +21,6 @@ RSpec/ReturnFromStub:
- 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
- 'ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb'
- 'ee/spec/features/promotion_spec.rb'
- - 'ee/spec/features/refactor_blob_viewer_disabled/projects/path_locks_spec.rb'
- 'ee/spec/features/trials/select_namespace_spec.rb'
- 'ee/spec/graphql/mutations/projects/set_locked_spec.rb'
- 'ee/spec/helpers/application_helper_spec.rb'
@@ -45,8 +44,6 @@ RSpec/ReturnFromStub:
- 'ee/spec/lib/gitlab/code_owners_spec.rb'
- 'ee/spec/lib/gitlab/geo/health_check_spec.rb'
- 'ee/spec/lib/gitlab/geo/logger_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/base_transfer_spec.rb'
- - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
- 'ee/spec/lib/gitlab/geo_spec.rb'
- 'ee/spec/lib/gitlab/git_access_spec.rb'
- 'ee/spec/lib/gitlab/git_access_wiki_spec.rb'
@@ -71,7 +68,6 @@ RSpec/ReturnFromStub:
- 'ee/spec/services/geo/design_repository_sync_service_spec.rb'
- 'ee/spec/services/geo/files_expire_service_spec.rb'
- 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
- - 'ee/spec/services/geo/job_artifact_deleted_event_store_spec.rb'
- 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
- 'ee/spec/services/geo/repository_base_sync_service_spec.rb'
- 'ee/spec/services/geo/repository_updated_service_spec.rb'
@@ -81,7 +77,6 @@ RSpec/ReturnFromStub:
- 'ee/spec/services/merge_requests/build_service_spec.rb'
- 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
- 'ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb'
- - 'ee/spec/services/network_policies/resources_service_spec.rb'
- 'ee/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
- 'ee/spec/services/security/token_revocation_service_spec.rb'
- 'ee/spec/services/system_notes/merge_train_service_spec.rb'
@@ -99,7 +94,6 @@ RSpec/ReturnFromStub:
- 'ee/spec/workers/ee/ci/build_finished_worker_spec.rb'
- 'ee/spec/workers/geo/container_repository_sync_dispatch_worker_spec.rb'
- 'ee/spec/workers/geo/design_repository_shard_sync_worker_spec.rb'
- - 'ee/spec/workers/geo/file_download_dispatch_worker_spec.rb'
- 'ee/spec/workers/geo/repository_shard_sync_worker_spec.rb'
- 'ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb'
- 'ee/spec/workers/geo/repository_verification/primary/single_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/scattered_let.yml b/.rubocop_todo/rspec/scattered_let.yml
index 52f19bf0768..069f9a15fff 100644
--- a/.rubocop_todo/rspec/scattered_let.yml
+++ b/.rubocop_todo/rspec/scattered_let.yml
@@ -42,7 +42,6 @@ RSpec/ScatteredLet:
- 'ee/spec/models/approval_wrapped_any_approver_rule_spec.rb'
- 'ee/spec/models/approvals/scan_finding_wrapped_rule_set_spec.rb'
- 'ee/spec/models/ci/minutes/notification_spec.rb'
- - 'ee/spec/models/ci/minutes/quota_spec.rb'
- 'ee/spec/models/ci/pipeline_spec.rb'
- 'ee/spec/models/ee/ci/build_dependencies_spec.rb'
- 'ee/spec/models/ee/namespace/root_storage_size_spec.rb'
@@ -157,7 +156,6 @@ RSpec/ScatteredLet:
- 'spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb'
- 'spec/lib/gitlab/diff/suggestion_diff_spec.rb'
- 'spec/lib/gitlab/diff/suggestion_spec.rb'
- - 'spec/lib/gitlab/elasticsearch/logs/lines_spec.rb'
- 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
- 'spec/lib/gitlab/error_tracking/processor/context_payload_processor_spec.rb'
- 'spec/lib/gitlab/error_tracking_spec.rb'
diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml
index a69ab9198b1..84e862ff48b 100644
--- a/.rubocop_todo/rspec/verified_doubles.yml
+++ b/.rubocop_todo/rspec/verified_doubles.yml
@@ -82,17 +82,15 @@ RSpec/VerifiedDoubles:
- ee/spec/lib/gitlab/geo/replicator_spec.rb
- ee/spec/lib/gitlab/geo_spec.rb
- ee/spec/lib/gitlab/git_access_spec.rb
- - ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb
+ - ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_links_aggregate_spec.rb
- ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb
- ee/spec/lib/gitlab/middleware/ip_restrictor_spec.rb
- - ee/spec/lib/gitlab/patch/legacy_database_config_spec.rb
- ee/spec/lib/gitlab/prometheus/queries/cluster_query_spec.rb
- ee/spec/lib/gitlab/subscription_portal/clients/rest_spec.rb
- ee/spec/lib/sidebars/groups/menus/analytics_menu_spec.rb
- ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb
- ee/spec/models/app_sec/fuzzing/api/ci_configuration_spec.rb
- ee/spec/models/approvable_spec.rb
- - ee/spec/models/concerns/ee/sha_attribute_spec.rb
- ee/spec/models/concerns/geo/verification_state_spec.rb
- ee/spec/models/ee/ci/job_artifact_spec.rb
- ee/spec/models/ee/user_spec.rb
@@ -247,7 +245,6 @@ RSpec/VerifiedDoubles:
- qa/spec/support/formatters/allure_metadata_formatter_spec.rb
- qa/spec/support/page_error_checker_spec.rb
- qa/spec/support/run_spec.rb
- - qa/spec/support/shared_examples/scenario_shared_examples.rb
- qa/spec/tools/long_running_spec_reporter_spec.rb
- spec/benchmarks/banzai_benchmark.rb
- spec/bin/feature_flag_spec.rb
@@ -377,7 +374,6 @@ RSpec/VerifiedDoubles:
- spec/lib/api/helpers_spec.rb
- spec/lib/atlassian/jira_connect/client_spec.rb
- spec/lib/backup/files_spec.rb
- - spec/lib/backup/gitaly_rpc_backup_spec.rb
- spec/lib/backup/repositories_spec.rb
- spec/lib/banzai/cross_project_reference_spec.rb
- spec/lib/banzai/filter/gollum_tags_filter_spec.rb
@@ -400,7 +396,6 @@ RSpec/VerifiedDoubles:
- spec/lib/bulk_imports/projects/pipelines/snippets_repository_pipeline_spec.rb
- spec/lib/bulk_imports/projects/transformers/project_attributes_transformer_spec.rb
- spec/lib/constraints/admin_constrainer_spec.rb
- - spec/lib/constraints/feature_constrainer_spec.rb
- spec/lib/constraints/group_url_constrainer_spec.rb
- spec/lib/constraints/jira_encoded_url_constrainer_spec.rb
- spec/lib/constraints/project_url_constrainer_spec.rb
@@ -442,7 +437,6 @@ RSpec/VerifiedDoubles:
- spec/lib/gitlab/ci/build/policy/variables_spec.rb
- spec/lib/gitlab/ci/build/policy_spec.rb
- spec/lib/gitlab/ci/build/prerequisite/kubernetes_namespace_spec.rb
- - spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb
- spec/lib/gitlab/ci/build/rules/rule_spec.rb
- spec/lib/gitlab/ci/build/rules_spec.rb
- spec/lib/gitlab/ci/build/status/reason_spec.rb
@@ -647,7 +641,6 @@ RSpec/VerifiedDoubles:
- spec/lib/gitlab/grape_logging/loggers/urgency_logger_spec.rb
- spec/lib/gitlab/graphql/authorize/object_authorization_spec.rb
- spec/lib/gitlab/graphql/batch_key_spec.rb
- - spec/lib/gitlab/graphql/find_argument_in_parent_spec.rb
- spec/lib/gitlab/graphql/generic_tracing_spec.rb
- spec/lib/gitlab/graphql/lazy_spec.rb
- spec/lib/gitlab/graphql/loaders/issuable_loader_spec.rb
@@ -708,7 +701,6 @@ RSpec/VerifiedDoubles:
- spec/lib/gitlab/metrics/elasticsearch_rack_middleware_spec.rb
- spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb
- spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb
- - spec/lib/gitlab/metrics/exporter/health_checks_middleware_spec.rb
- spec/lib/gitlab/metrics/exporter/metrics_middleware_spec.rb
- spec/lib/gitlab/metrics/rack_middleware_spec.rb
- spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb
@@ -836,7 +828,6 @@ RSpec/VerifiedDoubles:
- spec/models/concerns/atomic_internal_id_spec.rb
- spec/models/concerns/legacy_bulk_insert_spec.rb
- spec/models/concerns/prometheus_adapter_spec.rb
- - spec/models/concerns/sha256_attribute_spec.rb
- spec/models/concerns/sha_attribute_spec.rb
- spec/models/concerns/token_authenticatable_strategies/base_spec.rb
- spec/models/concerns/token_authenticatable_strategies/encrypted_spec.rb
@@ -989,7 +980,6 @@ RSpec/VerifiedDoubles:
- spec/services/ide/schemas_config_service_spec.rb
- spec/services/import/bitbucket_server_service_spec.rb
- spec/services/import/github_service_spec.rb
- - spec/services/import/gitlab_projects/create_project_from_remote_file_service_spec.rb
- spec/services/issues/create_service_spec.rb
- spec/services/issues/related_branches_service_spec.rb
- spec/services/jira_connect_subscriptions/create_service_spec.rb
@@ -1008,7 +998,6 @@ RSpec/VerifiedDoubles:
- spec/services/metrics/users_starred_dashboards/create_service_spec.rb
- spec/services/milestones/update_service_spec.rb
- spec/services/namespaces/in_product_marketing_emails_service_spec.rb
- - spec/services/namespaces/invite_team_email_service_spec.rb
- spec/services/notes/create_service_spec.rb
- spec/services/notes/render_service_spec.rb
- spec/services/notification_service_spec.rb
@@ -1031,7 +1020,6 @@ RSpec/VerifiedDoubles:
- spec/services/projects/update_service_spec.rb
- spec/services/repositories/changelog_service_spec.rb
- spec/services/search_service_spec.rb
- - spec/services/service_ping/build_payload_service_spec.rb
- spec/services/service_ping/submit_service_ping_service_spec.rb
- spec/services/snippets/update_repository_storage_service_spec.rb
- spec/services/spam/akismet_mark_as_spam_service_spec.rb
diff --git a/.rubocop_todo/style/case_like_if.yml b/.rubocop_todo/style/case_like_if.yml
index f1e349fe836..119ca3d800f 100644
--- a/.rubocop_todo/style/case_like_if.yml
+++ b/.rubocop_todo/style/case_like_if.yml
@@ -24,7 +24,6 @@ Style/CaseLikeIf:
- 'ee/app/controllers/concerns/credentials_inventory_actions.rb'
- 'ee/app/finders/ee/notes_finder.rb'
- 'ee/app/helpers/ee/branches_helper.rb'
- - 'ee/app/helpers/ee/namespace_storage_limit_alert_helper.rb'
- 'ee/app/services/epics/tree_reorder_service.rb'
- 'ee/app/services/merge_request_approval_settings/update_service.rb'
- 'ee/lib/gitlab/alert_management/alert_payload_field_extractor.rb'
@@ -34,7 +33,6 @@ Style/CaseLikeIf:
- 'ee/spec/features/projects/custom_projects_template_spec.rb'
- 'ee/spec/support/matchers/ee/epic_aggregate_matchers.rb'
- 'lib/api/helpers/label_helpers.rb'
- - 'lib/gitlab/analytics/unique_visits.rb'
- 'lib/gitlab/ci/ansi2html.rb'
- 'lib/gitlab/ci/ansi2json/converter.rb'
- 'lib/gitlab/ci/build/image.rb'
diff --git a/.rubocop_todo/style/empty_method.yml b/.rubocop_todo/style/empty_method.yml
index aa3972a0b22..3e6a1efec70 100644
--- a/.rubocop_todo/style/empty_method.yml
+++ b/.rubocop_todo/style/empty_method.yml
@@ -61,7 +61,6 @@ Style/EmptyMethod:
- 'app/controllers/registrations/welcome_controller.rb'
- 'app/controllers/search_controller.rb'
- 'app/graphql/resolvers/concerns/caching_array_resolver.rb'
- - 'app/helpers/namespace_storage_limit_alert_helper.rb'
- 'app/helpers/subscribable_banner_helper.rb'
- 'app/helpers/users/callouts_helper.rb'
- 'app/models/ci/bridge.rb'
diff --git a/.rubocop_todo/style/explicit_block_argument.yml b/.rubocop_todo/style/explicit_block_argument.yml
index f6bff468c76..e5ce2576f8c 100644
--- a/.rubocop_todo/style/explicit_block_argument.yml
+++ b/.rubocop_todo/style/explicit_block_argument.yml
@@ -16,7 +16,6 @@ Style/ExplicitBlockArgument:
- 'app/models/merge_request.rb'
- 'app/models/snippet_repository.rb'
- 'app/services/import_export_clean_up_service.rb'
- - 'app/services/issuable/clone/attributes_rewriter.rb'
- 'app/services/packages/debian/generate_distribution_key_service.rb'
- 'app/workers/concerns/each_shard_worker.rb'
- 'db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb'
diff --git a/.rubocop_todo/style/format_string.yml b/.rubocop_todo/style/format_string.yml
index a9065bb5932..caa293b31ae 100644
--- a/.rubocop_todo/style/format_string.yml
+++ b/.rubocop_todo/style/format_string.yml
@@ -165,8 +165,6 @@ Style/FormatString:
- 'app/services/metrics/dashboard/update_dashboard_service.rb'
- 'app/services/milestones/promote_service.rb'
- 'app/services/personal_access_tokens/revoke_service.rb'
- - 'app/services/pod_logs/elasticsearch_service.rb'
- - 'app/services/pod_logs/kubernetes_service.rb'
- 'app/services/projects/cleanup_service.rb'
- 'app/services/projects/create_from_template_service.rb'
- 'app/services/projects/import_service.rb'
@@ -232,8 +230,6 @@ Style/FormatString:
- 'ee/app/services/incident_management/escalation_policies/base_service.rb'
- 'ee/app/services/issues/build_from_vulnerability_service.rb'
- 'ee/app/services/merge_requests/create_from_vulnerability_data_service.rb'
- - 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
- - 'ee/app/services/namespaces/check_storage_size_service.rb'
- 'ee/app/services/security/security_orchestration_policies/policy_configuration_validation_service.rb'
- 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
- 'ee/app/services/timebox_report_service.rb'
diff --git a/.rubocop_todo/style/guard_clause.yml b/.rubocop_todo/style/guard_clause.yml
index c7109639677..7ee19ee164e 100644
--- a/.rubocop_todo/style/guard_clause.yml
+++ b/.rubocop_todo/style/guard_clause.yml
@@ -682,7 +682,6 @@ Style/GuardClause:
- 'spec/deprecation_toolkit_env.rb'
- 'spec/features/issuables/issuable_list_spec.rb'
- 'spec/features/projects/blobs/edit_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb'
- 'spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb'
- 'spec/services/issues/relative_position_rebalancing_service_spec.rb'
- 'spec/services/packages/maven/metadata/append_package_file_service_spec.rb'
diff --git a/.rubocop_todo/style/if_unless_modifier.yml b/.rubocop_todo/style/if_unless_modifier.yml
index 645fc5f764c..1dfedcc91c0 100644
--- a/.rubocop_todo/style/if_unless_modifier.yml
+++ b/.rubocop_todo/style/if_unless_modifier.yml
@@ -153,7 +153,6 @@ Style/IfUnlessModifier:
- 'app/models/ci/build.rb'
- 'app/models/ci/build_trace_chunk.rb'
- 'app/models/ci/job_artifact.rb'
- - 'app/models/ci/legacy_stage.rb'
- 'app/models/ci/pipeline.rb'
- 'app/models/ci/runner.rb'
- 'app/models/ci/running_build.rb'
@@ -308,7 +307,6 @@ Style/IfUnlessModifier:
- 'app/services/import/github_service.rb'
- 'app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb'
- 'app/services/issuable/bulk_update_service.rb'
- - 'app/services/issuable/clone/attributes_rewriter.rb'
- 'app/services/issuable/common_system_notes_service.rb'
- 'app/services/issuable_base_service.rb'
- 'app/services/issuable_links/create_service.rb'
@@ -357,7 +355,6 @@ Style/IfUnlessModifier:
- 'app/services/packages/pypi/create_package_service.rb'
- 'app/services/packages/rubygems/dependency_resolver_service.rb'
- 'app/services/pages/migrate_legacy_storage_to_deployment_service.rb'
- - 'app/services/pod_logs/kubernetes_service.rb'
- 'app/services/post_receive_service.rb'
- 'app/services/projects/container_repository/gitlab/delete_tags_service.rb'
- 'app/services/projects/container_repository/third_party/delete_tags_service.rb'
@@ -716,7 +713,7 @@ Style/IfUnlessModifier:
- 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
- 'ee/lib/gitlab/geo/replicator.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate.rb'
- - 'ee/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/issues/lazy_links_aggregate.rb'
- 'ee/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate.rb'
- 'ee/lib/gitlab/graphql/aggregations/vulnerabilities/lazy_user_notes_count_aggregate.rb'
- 'ee/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate.rb'
@@ -937,7 +934,6 @@ Style/IfUnlessModifier:
- 'lib/gitlab/database/with_lock_retries.rb'
- 'lib/gitlab/diff/formatters/base_formatter.rb'
- 'lib/gitlab/diff/rendered/notebook/diff_file.rb'
- - 'lib/gitlab/elasticsearch/logs/lines.rb'
- 'lib/gitlab/email/handler/service_desk_handler.rb'
- 'lib/gitlab/email/message/in_product_marketing/base.rb'
- 'lib/gitlab/email/message/repository_push.rb'
@@ -1168,7 +1164,6 @@ Style/IfUnlessModifier:
- 'spec/features/merge_request/batch_comments_spec.rb'
- 'spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb'
- 'spec/features/projects/blobs/edit_spec.rb'
- - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb'
- 'spec/graphql/mutations/releases/update_spec.rb'
- 'spec/helpers/application_settings_helper_spec.rb'
- 'spec/helpers/invite_members_helper_spec.rb'
@@ -1251,7 +1246,6 @@ Style/IfUnlessModifier:
- 'spec/views/projects/edit.html.haml_spec.rb'
- 'spec/views/shared/access_tokens/_table.html.haml_spec.rb'
- 'spec/workers/analytics/usage_trends/counter_job_worker_spec.rb'
- - 'tooling/bin/qa/check_if_qa_only_spec_changes'
- 'tooling/danger/product_intelligence.rb'
- 'tooling/lib/tooling/image.rb'
- 'tooling/lib/tooling/test_map_packer.rb'
diff --git a/.rubocop_todo/style/percent_literal_delimiters.yml b/.rubocop_todo/style/percent_literal_delimiters.yml
index 487e0e7cd20..16ae8989c97 100644
--- a/.rubocop_todo/style/percent_literal_delimiters.yml
+++ b/.rubocop_todo/style/percent_literal_delimiters.yml
@@ -20,7 +20,6 @@ Style/PercentLiteralDelimiters:
- 'app/controllers/jira_connect/app_descriptor_controller.rb'
- 'app/controllers/jira_connect/subscriptions_controller.rb'
- 'app/controllers/profiles/two_factor_auths_controller.rb'
- - 'app/controllers/projects/logs_controller.rb'
- 'app/controllers/projects/performance_monitoring/dashboards_controller.rb'
- 'app/controllers/projects/product_analytics_controller.rb'
- 'app/controllers/projects/service_desk_controller.rb'
@@ -79,7 +78,6 @@ Style/PercentLiteralDelimiters:
- 'app/models/bulk_imports/file_transfer/project_config.rb'
- 'app/models/ci/build.rb'
- 'app/models/ci/build_runner_session.rb'
- - 'app/models/ci/legacy_stage.rb'
- 'app/models/ci/pipeline.rb'
- 'app/models/clusters/applications/cert_manager.rb'
- 'app/models/clusters/platforms/kubernetes.rb'
@@ -142,7 +140,6 @@ Style/PercentLiteralDelimiters:
- 'app/models/resource_timebox_event.rb'
- 'app/models/user.rb'
- 'app/models/user_interacted_project.rb'
- - 'app/models/users/in_product_marketing_email.rb'
- 'app/policies/identity_provider_policy.rb'
- 'app/presenters/dev_ops_report/metric_presenter.rb'
- 'app/presenters/search_service_presenter.rb'
@@ -166,8 +163,6 @@ Style/PercentLiteralDelimiters:
- 'app/services/merge_requests/update_service.rb'
- 'app/services/metrics/dashboard/default_embed_service.rb'
- 'app/services/packages/debian/generate_distribution_service.rb'
- - 'app/services/pod_logs/base_service.rb'
- - 'app/services/pod_logs/elasticsearch_service.rb'
- 'app/services/preview_markdown_service.rb'
- 'app/services/projects/apple_target_platform_detector_service.rb'
- 'app/services/projects/container_repository/cleanup_tags_service.rb'
@@ -674,7 +669,6 @@ Style/PercentLiteralDelimiters:
- 'spec/factories/ci/runners.rb'
- 'spec/factories/clusters/applications/helm.rb'
- 'spec/factories/clusters/clusters.rb'
- - 'spec/factories/clusters/integrations/elastic_stack.rb'
- 'spec/factories/clusters/integrations/prometheus.rb'
- 'spec/factories/clusters/providers/aws.rb'
- 'spec/factories/deployments.rb'
@@ -692,7 +686,6 @@ Style/PercentLiteralDelimiters:
- 'spec/features/projects/artifacts/user_downloads_artifacts_spec.rb'
- 'spec/features/projects/branches_spec.rb'
- 'spec/features/projects/environments/environment_spec.rb'
- - 'spec/features/projects/environments_pod_logs_spec.rb'
- 'spec/features/projects/integrations/user_activates_jira_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- 'spec/features/projects/labels/issues_sorted_by_priority_spec.rb'
@@ -1003,7 +996,6 @@ Style/PercentLiteralDelimiters:
- 'spec/models/project_setting_spec.rb'
- 'spec/models/project_spec.rb'
- 'spec/models/project_team_spec.rb'
- - 'spec/models/project_tracing_setting_spec.rb'
- 'spec/models/projects/topic_spec.rb'
- 'spec/models/prometheus_metric_spec.rb'
- 'spec/models/releases/link_spec.rb'
@@ -1115,8 +1107,6 @@ Style/PercentLiteralDelimiters:
- 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
- 'spec/services/packages/update_tags_service_spec.rb'
- 'spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb'
- - 'spec/services/pod_logs/base_service_spec.rb'
- - 'spec/services/pod_logs/kubernetes_service_spec.rb'
- 'spec/services/product_analytics/build_graph_service_spec.rb'
- 'spec/services/projects/branches_by_mode_service_spec.rb'
- 'spec/services/projects/container_repository/cleanup_tags_service_spec.rb'
diff --git a/.rubocop_todo/style/redundant_regexp_escape.yml b/.rubocop_todo/style/redundant_regexp_escape.yml
index 969a23601ca..cf502711f35 100644
--- a/.rubocop_todo/style/redundant_regexp_escape.yml
+++ b/.rubocop_todo/style/redundant_regexp_escape.yml
@@ -109,5 +109,4 @@ Style/RedundantRegexpEscape:
- 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
- 'spec/uploaders/personal_file_uploader_spec.rb'
- 'spec/views/help/index.html.haml_spec.rb'
- - 'tooling/bin/qa/check_if_qa_only_spec_changes'
- 'tooling/danger/project_helper.rb'
diff --git a/.rubocop_todo/style/redundant_self.yml b/.rubocop_todo/style/redundant_self.yml
index 1aba23c90ae..9951160ae02 100644
--- a/.rubocop_todo/style/redundant_self.yml
+++ b/.rubocop_todo/style/redundant_self.yml
@@ -143,7 +143,6 @@ Style/RedundantSelf:
- 'app/models/project_group_link.rb'
- 'app/models/project_import_data.rb'
- 'app/models/project_label.rb'
- - 'app/models/project_tracing_setting.rb'
- 'app/models/prometheus_alert.rb'
- 'app/models/protected_branch.rb'
- 'app/models/protected_branch/push_access_level.rb'
diff --git a/.rubocop_todo/style/symbol_proc.yml b/.rubocop_todo/style/symbol_proc.yml
index 5e3aa10d9e5..ea3a505d2da 100644
--- a/.rubocop_todo/style/symbol_proc.yml
+++ b/.rubocop_todo/style/symbol_proc.yml
@@ -133,7 +133,7 @@ Style/SymbolProc:
- 'ee/spec/helpers/ee/registrations_helper_spec.rb'
- 'ee/spec/lib/ee/gitlab/search_results_spec.rb'
- 'ee/spec/lib/gitlab/elastic/document_reference_spec.rb'
- - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_links_aggregate_spec.rb'
- 'ee/spec/models/ee/iterations/cadence_spec.rb'
- 'ee/spec/services/groups/participants_service_spec.rb'
- 'ee/spec/support/helpers/subscription_portal_helpers.rb'
diff --git a/.stylelintrc b/.stylelintrc
index 458fd51bdd7..faab22862fc 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -7,12 +7,5 @@
"app/assets/stylesheets/lazy_bundles/select2.scss",
"app/assets/stylesheets/highlight/themes/*.scss",
"app/assets/stylesheets/lazy_bundles/cropper.css"
- ],
- "plugins":[
- "./scripts/frontend/stylelint/stylelint_duplicate_selectors.js",
- "./scripts/frontend/stylelint/stylelint_utility_classes.js",
- ],
- "rules":{
- "stylelint-gitlab/utility-classes":[true,{ "severity": "warning" }],
- }
+ ]
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d81818121d5..e9c671cb99f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1011,6 +1011,28 @@ entry.
- [Fix JH skipped subscription portal spec](gitlab-org/gitlab@0e7e7cb4a62d004989c47fafe6fe1f9ffd90da44) by @chaomao ([merge request](gitlab-org/gitlab!87213))
- [Add not null constraint to requirements.issue_id validate:false](gitlab-org/gitlab@5ccac890b13c53c5761ccb8e5cb7ca202e0656c3) ([merge request](gitlab-org/gitlab!86590))
+## 15.0.4 (2022-06-30)
+
+### Security (17 changes)
+
+- [Fix group IP restrictions not enforced for container registry requests](gitlab-org/security/gitlab@7dea5867ea5e115a3a91576fec91de8e7f2a9915) ([merge request](gitlab-org/security/gitlab!2551))
+- [Update rack gem to version 2.2.3.1](gitlab-org/security/gitlab@c0df8beef0297e9b99b954fcdcbf07cee3f0e9d6) ([merge request](gitlab-org/security/gitlab!2553))
+- [Gitlab Runner version upgrade](gitlab-org/security/gitlab@012ff20c80754ff9ac38b82894346a51aa0a9b4c) ([merge request](gitlab-org/security/gitlab!2566))
+- [Update ProjectAttributesTransformer to use fixed number of attributes](gitlab-org/security/gitlab@619d77865f3e61f3cfb6ca92011ded44f6baf0ad) ([merge request](gitlab-org/security/gitlab!2548))
+- [Escape deploy key title to prevent XSS](gitlab-org/security/gitlab@7b1a458df5c553d6fa99b4fec0d677c9e924ad86) ([merge request](gitlab-org/security/gitlab!2493))
+- [Sanitize ZenTao breadcrumb links](gitlab-org/security/gitlab@adb8b2829e3d6b69ea32a7524c6f772be1debf82) ([merge request](gitlab-org/security/gitlab!2556))
+- [Fix permissions in the project labels API](gitlab-org/security/gitlab@4fd766e90ea6e8899897d7b7d9551b2edb5dce9a) ([merge request](gitlab-org/security/gitlab!2533))
+- [Security fix sentry issue leaks and access level check](gitlab-org/security/gitlab@d43b2c600a5fc31592eb8f07a4fcfdf3141911f7) ([merge request](gitlab-org/security/gitlab!2500))
+- [Check permissions before exposing user two factor enabled](gitlab-org/security/gitlab@aac30c9f3228efd643d3fc204ee49f740f1ebc81) ([merge request](gitlab-org/security/gitlab!2524))
+- [Filter milestone release by user access](gitlab-org/security/gitlab@aa1b76b8eb2966463c8a10869e00f3320bf4ea1a) ([merge request](gitlab-org/security/gitlab!2536))
+- [Fix the required access level in the Conan packages finder](gitlab-org/security/gitlab@fa090cd9d2adab46c6c3f2a70b351a61847b5c6c) ([merge request](gitlab-org/security/gitlab!2482))
+- [Allow inviting only groups with subset of allowed domains to groups](gitlab-org/security/gitlab@981be1afc7c6bf8f699ced1ae930b201699e29e3) ([merge request](gitlab-org/security/gitlab!2511))
+- [Fix open redirect vulnerability](gitlab-org/security/gitlab@fa9cf0a41f338e285701db231316897d362ce306) ([merge request](gitlab-org/security/gitlab!2541))
+- [Adds a filter based on user access to Runner jobs endpoint](gitlab-org/security/gitlab@8be3da271d2a6ff3285846c50a5ce4dd584419ff) ([merge request](gitlab-org/security/gitlab!2496))
+- [Prevent runners from picking IP restricted jobs](gitlab-org/security/gitlab@dcc830d14cc0ee616dc3ad263d66bd42f92b56a2) ([merge request](gitlab-org/security/gitlab!2504))
+- [Restrict CI lint access to pipeline creators](gitlab-org/security/gitlab@42425cd68755c53ed33952111be9803ce3b37515) ([merge request](gitlab-org/security/gitlab!2514))
+- [Catch endless headers when reading HTTP responses](gitlab-org/security/gitlab@d2ce0a236204b97a853bc35332d49d7427f38fbc) ([merge request](gitlab-org/security/gitlab!2528))
+
## 15.0.3 (2022-06-16)
### Fixed (2 changes)
@@ -1785,6 +1807,28 @@ entry.
- [Move methods to build email unsubscribe link to helper](gitlab-org/gitlab@ae4391a84d14d51ca5b5f2ffaada96e3b37a1d51) ([merge request](gitlab-org/gitlab!84696)) **GitLab Enterprise Edition**
- [Deprecate `push_rules_supersede_code_owners` feature flag](gitlab-org/gitlab@9ee99872b66a69c5a2d1c1c9863d960832a1d91f) ([merge request](gitlab-org/gitlab!85390))
+## 14.10.5 (2022-06-30)
+
+### Security (17 changes)
+
+- [Fix group IP restrictions not enforced for container registry requests](gitlab-org/security/gitlab@b146ad7b8c6fba9d3c5bea365ff8afd49949dcb0) ([merge request](gitlab-org/security/gitlab!2552))
+- [Update rack gem to version 2.2.3.1](gitlab-org/security/gitlab@09ebb50ceee5a2226c1f70fa1d6c25391d51dda6) ([merge request](gitlab-org/security/gitlab!2554))
+- [Gitlab Runner version upgrade](gitlab-org/security/gitlab@c91bfdb4f96e70e377a84b99c4edaa2fdecb8e16) ([merge request](gitlab-org/security/gitlab!2567))
+- [Update ProjectAttributesTransformer to use fixed number of attributes](gitlab-org/security/gitlab@6f892fb2a4b84473c3796533551f915c16cf77d9) ([merge request](gitlab-org/security/gitlab!2549))
+- [Escape deploy key title to prevent XSS](gitlab-org/security/gitlab@153a7c447e03a509b7f06ac7381f4f9db414c9ea) ([merge request](gitlab-org/security/gitlab!2494))
+- [Sanitize ZenTao breadcrumb links](gitlab-org/security/gitlab@530c7be82ae90138898ff99008d994b1c85d8cf1) ([merge request](gitlab-org/security/gitlab!2557))
+- [Fix permissions in the project labels API](gitlab-org/security/gitlab@f2c71f64c258bef9f56f4892d11a4dbf20d668e6) ([merge request](gitlab-org/security/gitlab!2534))
+- [Security fix sentry issue leaks and access level check](gitlab-org/security/gitlab@c644d94f58e30e1a9d87521b039a347412f0fead) ([merge request](gitlab-org/security/gitlab!2501))
+- [Check permissions before exposing user two factor enabled](gitlab-org/security/gitlab@8a623e8a4fdbd3421ac3ae0e37e156b7d3b04970) ([merge request](gitlab-org/security/gitlab!2525))
+- [Filter milestone release by user access](gitlab-org/security/gitlab@d7d6431a52808107a71f15d29e856eef2cb313e5) ([merge request](gitlab-org/security/gitlab!2537))
+- [Fix the required access level in the Conan packages finder](gitlab-org/security/gitlab@756fb242c4d6acf6cfd95fa39f37410eaf009747) ([merge request](gitlab-org/security/gitlab!2485))
+- [Allow inviting only groups with subset of allowed domains to groups](gitlab-org/security/gitlab@ca50492a32a2e367b0bc75dae0f91dc52d23b2ed) ([merge request](gitlab-org/security/gitlab!2512))
+- [Fix open redirect vulnerability](gitlab-org/security/gitlab@1450068a44d67af3cbe09fedcc4b1e9b4ea2e586) ([merge request](gitlab-org/security/gitlab!2540))
+- [Adds a filter based on user access to Runner jobs endpoint](gitlab-org/security/gitlab@dafaf3e50e8b1a18ff362cbb60e9482c9d60fc33) ([merge request](gitlab-org/security/gitlab!2497))
+- [Prevent runners from picking IP restricted jobs](gitlab-org/security/gitlab@0fad0cdde00b68c2a0f19ffa2681b438fcad4097) ([merge request](gitlab-org/security/gitlab!2503))
+- [Restrict CI lint access to pipeline creators](gitlab-org/security/gitlab@c5b79e969f10e3604eff16a9edef716e700cd201) ([merge request](gitlab-org/security/gitlab!2515))
+- [Catch endless headers when reading HTTP responses](gitlab-org/security/gitlab@65379002bd7a0259c425455c937b110bd96096dc) ([merge request](gitlab-org/security/gitlab!2529))
+
## 14.10.4 (2022-06-01)
### Security (7 changes)
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index a9e1108673e..095b6c8b4d6 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-15.1.3 \ No newline at end of file
+3fc66dc23581de48bdbbf1b5a5d5ca9faf5f925b
diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
index 4a36342fcab..cb2b00e4f7a 100644
--- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION
+++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
@@ -1 +1 @@
-3.0.0
+3.0.1
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index d14dfbac369..6c43fc8aefc 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-15.1.0
+15.2.0
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION
index bb120e876c6..91951fd8ad7 100644
--- a/GITLAB_PAGES_VERSION
+++ b/GITLAB_PAGES_VERSION
@@ -1 +1 @@
-1.59.0
+1.61.0
diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION
index 2422b2f9464..44a5e718d50 100644
--- a/GITLAB_SHELL_VERSION
+++ b/GITLAB_SHELL_VERSION
@@ -1 +1 @@
-14.7.4
+14.9.0
diff --git a/Gemfile b/Gemfile
index 195a4b2861b..71cd2609b3a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -30,6 +30,7 @@ gem 'declarative_policy', '~> 1.1.0'
# Authentication libraries
gem 'devise', '~> 4.7.2'
+gem 'devise-pbkdf2-encryptable', '~> 0.0.0', path: 'vendor/gems/devise-pbkdf2-encryptable'
gem 'bcrypt', '~> 3.1', '>= 3.1.14'
gem 'doorkeeper', '~> 5.5.0.rc2'
gem 'doorkeeper-openid_connect', '~> 1.7.5'
@@ -44,13 +45,13 @@ gem 'omniauth-dingtalk-oauth2', '~> 1.0'
gem 'omniauth-alicloud', '~> 1.0.1'
gem 'omniauth-facebook', '~> 4.0.0'
gem 'omniauth-github', '~> 1.4'
-gem 'omniauth-gitlab', '~> 1.0.2'
+gem 'omniauth-gitlab', '~> 4.0.0', path: 'vendor/gems/omniauth-gitlab' # See vendor/gems/omniauth-gitlab/README.md
gem 'omniauth-google-oauth2', '~> 0.6.0'
gem 'omniauth-oauth2-generic', '~> 0.2.2'
gem 'omniauth-saml', '~> 1.10'
gem 'omniauth-shibboleth', '~> 1.3.0'
gem 'omniauth-twitter', '~> 1.4'
-gem 'omniauth_crowd', '~> 2.4.0'
+gem 'omniauth_crowd', '~> 2.4.0', path: 'vendor/gems/omniauth_crowd' # See vendor/gems/omniauth_crowd/README.md
gem 'omniauth-authentiq', '~> 0.3.3'
gem 'gitlab-omniauth-openid-connect', '~> 0.9.0', require: 'omniauth_openid_connect'
gem 'omniauth-salesforce', '~> 1.0.5'
@@ -91,7 +92,7 @@ gem 'gpgme', '~> 2.0.19'
# LDAP Auth
# GitLab fork with several improvements to original library. For full list of changes
# see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master
-gem 'gitlab_omniauth-ldap', '~> 2.1.1', require: 'omniauth-ldap'
+gem 'gitlab_omniauth-ldap', '~> 2.2.0', require: 'omniauth-ldap'
gem 'net-ldap', '~> 0.16.3'
# API
@@ -103,7 +104,7 @@ gem 'rack-cors', '~> 1.1.0', require: 'rack/cors'
gem 'graphql', '~> 1.13.12'
gem 'graphiql-rails', '~> 1.8'
gem 'apollo_upload_server', '~> 2.1.0'
-gem 'graphql-docs', '~> 1.6.0', group: [:development, :test]
+gem 'graphql-docs', '~> 2.1.0', group: [:development, :test]
gem 'graphlient', '~> 0.5.0' # Used by BulkImport feature (group::import)
gem 'hashie'
@@ -145,9 +146,9 @@ gem 'seed-fu', '~> 2.3.7'
gem 'elasticsearch-model', '~> 7.2'
gem 'elasticsearch-rails', '~> 7.2', require: 'elasticsearch/rails/instrumentation'
gem 'elasticsearch-api', '7.13.3'
-gem 'aws-sdk-core', '~> 3'
+gem 'aws-sdk-core', '~> 3.131.0'
gem 'aws-sdk-cloudformation', '~> 1'
-gem 'aws-sdk-s3', '~> 1'
+gem 'aws-sdk-s3', '~> 1.114.0'
gem 'faraday_middleware-aws-sigv4', '~>0.3.0'
gem 'typhoeus', '~> 1.4.0' # Used with Elasticsearch to support http keep-alive connections
@@ -181,7 +182,7 @@ gem 'diffy', '~> 3.3'
gem 'diff_match_patch', '~> 0.1.0'
# Application server
-gem 'rack', '~> 2.2.3.0'
+gem 'rack', '~> 2.2.4'
# https://github.com/zombocom/rack-timeout/blob/master/README.md#rails-apps-manually
gem 'rack-timeout', '~> 0.6.0', require: 'rack/timeout/base'
@@ -255,7 +256,7 @@ gem 'slack-messenger', '~> 2.3.4'
gem 'hangouts-chat', '~> 0.0.5', require: 'hangouts_chat'
# Asana integration
-gem 'asana', '~> 0.10.3'
+gem 'asana', '~> 0.10.13'
# FogBugz integration
gem 'ruby-fogbugz', '~> 0.2.1'
@@ -268,7 +269,7 @@ gem 'sanitize', '~> 6.0'
gem 'babosa', '~> 1.0.4'
# Sanitizes SVG input
-gem 'loofah', '~> 2.2'
+gem 'loofah', '~> 2.18.0'
# Working with license
gem 'licensee', '~> 9.14.1'
@@ -323,7 +324,7 @@ gem 'thrift', '>= 0.14.0'
# I18n
gem 'ruby_parser', '~> 3.15', require: false
-gem 'rails-i18n', '~> 6.0'
+gem 'rails-i18n', '~> 7.0'
gem 'gettext_i18n_rails', '~> 1.8.0'
gem 'gettext_i18n_rails_js', '~> 1.3'
gem 'gettext', '~> 3.3', require: false, group: :development
@@ -339,12 +340,12 @@ gem 'snowplow-tracker', '~> 0.6.1'
# Metrics
gem 'method_source', '~> 1.0', require: false
gem 'webrick', '~> 1.6.1', require: false
-gem 'prometheus-client-mmap', '~> 0.15.0', require: 'prometheus/client'
+gem 'prometheus-client-mmap', '~> 0.16', require: 'prometheus/client'
-gem 'warning', '~> 1.2.0'
+gem 'warning', '~> 1.3.0'
group :development do
- gem 'lefthook', '~> 0.8.0', require: false
+ gem 'lefthook', '~> 1.0.0', require: false
gem 'rubocop'
gem 'solargraph', '~> 0.44.3', require: false
@@ -407,7 +408,7 @@ group :development, :test do
end
group :development, :test, :danger do
- gem 'gitlab-dangerfiles', '~> 3.4.0', require: false
+ gem 'gitlab-dangerfiles', '~> 3.4.3', require: false
end
group :development, :test, :coverage do
@@ -436,7 +437,7 @@ group :test do
gem 'capybara-screenshot', '~> 1.0.22'
gem 'selenium-webdriver', '~> 3.142'
- gem 'shoulda-matchers', '~> 4.0.1', require: false
+ gem 'shoulda-matchers', '~> 5.1.0', require: false
gem 'email_spec', '~> 2.2.0'
gem 'webmock', '~> 3.9.1'
gem 'rails-controller-testing'
@@ -466,7 +467,7 @@ gem 'benchmark-memory', '~> 0.1', require: false
gem 'activerecord-explain-analyze', '~> 0.1', require: false
# OAuth
-gem 'oauth2', '~> 1.4'
+gem 'oauth2', '~> 2.0'
# Health check
gem 'health_check', '~> 3.0'
@@ -535,7 +536,7 @@ gem 'valid_email', '~> 0.1'
# JSON
gem 'json', '~> 2.5.1'
gem 'json_schemer', '~> 0.2.18'
-gem 'oj', '~> 3.10.6'
+gem 'oj', '~> 3.13.16'
gem 'multi_json', '~> 1.14.1'
gem 'yajl-ruby', '~> 1.4.1', require: 'yajl'
@@ -546,6 +547,10 @@ gem 'ipaddress', '~> 0.8.3'
gem 'parslet', '~> 1.8'
-gem 'ipynbdiff', '0.4.7'
+gem 'ipynbdiff', path: 'vendor/gems/ipynbdiff'
gem 'ed25519', '~> 1.3.0'
+
+# Error Tracking OpenAPI client
+# See https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/rake_tasks.md#update-openapi-client-for-error-tracking-feature
+gem 'error_tracking_open_api', path: 'vendor/gems/error_tracking_open_api'
diff --git a/Gemfile.lock b/Gemfile.lock
index dab51a0803c..6ccdd090ee9 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,10 +1,44 @@
PATH
+ remote: vendor/gems/devise-pbkdf2-encryptable
+ specs:
+ devise-pbkdf2-encryptable (0.0.0)
+ devise (~> 4.0)
+
+PATH
+ remote: vendor/gems/error_tracking_open_api
+ specs:
+ error_tracking_open_api (1.0.0)
+ typhoeus (~> 1.0, >= 1.0.1)
+
+PATH
+ remote: vendor/gems/ipynbdiff
+ specs:
+ ipynbdiff (0.4.7)
+ diffy (~> 3.3)
+ oj (~> 3.13.16)
+
+PATH
remote: vendor/gems/mail-smtp_pool
specs:
mail-smtp_pool (0.1.0)
connection_pool (~> 2.0)
mail (~> 2.7)
+PATH
+ remote: vendor/gems/omniauth-gitlab
+ specs:
+ omniauth-gitlab (4.0.0)
+ omniauth (~> 1.0)
+ omniauth-oauth2 (~> 1.7.1)
+
+PATH
+ remote: vendor/gems/omniauth_crowd
+ specs:
+ omniauth_crowd (2.4.0)
+ activesupport
+ nokogiri (>= 1.4.4)
+ omniauth (~> 1.0, < 3)
+
GEM
remote: https://rubygems.org/
specs:
@@ -83,11 +117,11 @@ GEM
apollo_upload_server (2.1.0)
actionpack (>= 4.2)
graphql (>= 1.8)
- asana (0.10.3)
+ asana (0.10.13)
faraday (~> 1.0)
faraday_middleware (~> 1.0)
faraday_middleware-multi_json (~> 0.0)
- oauth2 (~> 1.4)
+ oauth2 (>= 1.4, < 3)
asciidoctor (2.0.15)
asciidoctor-include-ext (0.4.0)
asciidoctor (>= 1.5.6, < 3.0.0)
@@ -105,24 +139,24 @@ GEM
execjs (> 0)
awesome_print (1.9.2)
awrence (1.1.1)
- aws-eventstream (1.1.0)
- aws-partitions (1.345.0)
+ aws-eventstream (1.2.0)
+ aws-partitions (1.600.0)
aws-sdk-cloudformation (1.41.0)
aws-sdk-core (~> 3, >= 3.99.0)
aws-sigv4 (~> 1.1)
- aws-sdk-core (3.104.3)
+ aws-sdk-core (3.131.1)
aws-eventstream (~> 1, >= 1.0.2)
- aws-partitions (~> 1, >= 1.239.0)
+ aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
- jmespath (~> 1.0)
- aws-sdk-kms (1.36.0)
- aws-sdk-core (~> 3, >= 3.99.0)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.57.0)
+ aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.75.0)
- aws-sdk-core (~> 3, >= 3.104.1)
+ aws-sdk-s3 (1.114.0)
+ aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (~> 1)
- aws-sigv4 (~> 1.1)
- aws-sigv4 (1.2.1)
+ aws-sigv4 (~> 1.4)
+ aws-sigv4 (1.5.0)
aws-eventstream (~> 1, >= 1.0.2)
azure-storage-blob (2.0.3)
azure-storage-common (~> 2.0)
@@ -475,7 +509,7 @@ GEM
terminal-table (~> 1.5, >= 1.5.1)
gitlab-chronic (0.10.5)
numerizer (~> 0.2)
- gitlab-dangerfiles (3.4.0)
+ gitlab-dangerfiles (3.4.3)
danger (>= 8.4.5)
danger-gitlab (>= 8.0.0)
rake
@@ -523,9 +557,9 @@ GEM
rubocop-rspec (~> 1.44)
gitlab_chronic_duration (0.10.6.2)
numerizer (~> 0.2)
- gitlab_omniauth-ldap (2.1.1)
+ gitlab_omniauth-ldap (2.2.0)
net-ldap (~> 0.16)
- omniauth (~> 1.3)
+ omniauth (>= 1.3, < 3)
pyu-ruby-sasl (>= 0.0.3.3, < 0.1)
rubyntlm (~> 0.5)
globalid (1.0.0)
@@ -587,13 +621,13 @@ GEM
graphql-client (0.17.0)
activesupport (>= 3.0)
graphql (~> 1.10)
- graphql-docs (1.6.0)
+ graphql-docs (2.1.0)
commonmarker (~> 0.16)
escape_utils (~> 1.2)
extended-markdown-filter (~> 0.4)
gemoji (~> 3.0)
- graphql (~> 1.6)
- html-pipeline (~> 2.8)
+ graphql (~> 1.12)
+ html-pipeline (~> 2.9)
sass (~> 3.4)
grpc (1.42.0)
google-protobuf (~> 3.18)
@@ -667,9 +701,6 @@ GEM
invisible_captcha (1.1.0)
rails (>= 4.2)
ipaddress (0.8.3)
- ipynbdiff (0.4.7)
- diffy (~> 3.3)
- json (~> 2.5, >= 2.5.1)
jaeger-client (1.1.0)
opentracing (~> 0.3)
thrift
@@ -679,7 +710,7 @@ GEM
atlassian-jwt
multipart-post
oauth (~> 0.5, >= 0.5.0)
- jmespath (1.4.0)
+ jmespath (1.6.1)
js_regex (3.7.0)
character_set (~> 1.4)
regexp_parser (~> 2.1)
@@ -724,7 +755,7 @@ GEM
rest-client (~> 2.0)
launchy (2.5.0)
addressable (~> 2.7)
- lefthook (0.8.0)
+ lefthook (1.0.2)
letter_opener (1.7.0)
launchy (~> 2.2)
letter_opener_web (2.0.0)
@@ -749,7 +780,7 @@ GEM
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
- loofah (2.16.0)
+ loofah (2.18.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
lru_redux (1.1.0)
@@ -815,12 +846,13 @@ GEM
shellany (~> 0.0)
numerizer (0.2.0)
oauth (0.5.6)
- oauth2 (1.4.7)
- faraday (>= 0.8, < 2.0)
+ oauth2 (2.0.3)
+ faraday (>= 0.17.3, < 3.0)
jwt (>= 1.0, < 3.0)
- multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
+ rash_alt (>= 0.4, < 1)
+ version_gem (~> 1.0)
octokit (4.20.0)
faraday (>= 0.9)
sawyer (~> 0.8.0, >= 0.5.3)
@@ -837,7 +869,7 @@ GEM
plist (~> 3.1)
train-core
wmi-lite (~> 1.0)
- oj (3.10.6)
+ oj (3.13.16)
omniauth (1.9.1)
hashie (>= 3.4.6)
rack (>= 1.6.2, < 3)
@@ -868,18 +900,15 @@ GEM
omniauth-github (1.4.0)
omniauth (~> 1.5)
omniauth-oauth2 (>= 1.4.0, < 2.0)
- omniauth-gitlab (1.0.3)
- omniauth (~> 1.0)
- omniauth-oauth2 (~> 1.0)
omniauth-google-oauth2 (0.6.0)
jwt (>= 2.0)
omniauth (>= 1.1.1)
omniauth-oauth2 (>= 1.5)
- omniauth-oauth (1.1.0)
+ omniauth-oauth (1.2.0)
oauth
- omniauth (~> 1.0)
- omniauth-oauth2 (1.7.2)
- oauth2 (~> 1.4)
+ omniauth (>= 1.0, < 3)
+ omniauth-oauth2 (1.7.3)
+ oauth2 (>= 1.4, < 3)
omniauth (>= 1.9, < 3)
omniauth-oauth2-generic (0.2.2)
omniauth-oauth2 (~> 1.0)
@@ -894,10 +923,6 @@ GEM
omniauth-twitter (1.4.0)
omniauth-oauth (~> 1.1)
rack
- omniauth_crowd (2.4.0)
- activesupport
- nokogiri (>= 1.4.4)
- omniauth (~> 1.0)
open4 (1.3.4)
openid_connect (1.3.0)
activemodel
@@ -966,7 +991,7 @@ GEM
coderay
parser
unparser
- prometheus-client-mmap (0.15.0)
+ prometheus-client-mmap (0.16.2)
pry (0.13.1)
coderay (~> 1.1)
method_source (~> 1.0)
@@ -988,7 +1013,7 @@ GEM
pyu-ruby-sasl (0.0.3.3)
raabro (1.1.6)
racc (1.6.0)
- rack (2.2.3.1)
+ rack (2.2.4)
rack-accept (0.4.5)
rack (>= 0.4)
rack-attack (6.6.1)
@@ -1030,9 +1055,9 @@ GEM
nokogiri (>= 1.6)
rails-html-sanitizer (1.4.2)
loofah (~> 2.3)
- rails-i18n (6.0.0)
+ rails-i18n (7.0.3)
i18n (>= 0.7, < 2)
- railties (>= 6.0.0, < 7)
+ railties (>= 6.0.0, < 8)
railties (6.1.4.7)
actionpack (= 6.1.4.7)
activesupport (= 6.1.4.7)
@@ -1042,6 +1067,8 @@ GEM
rainbow (3.1.1)
rake (13.0.6)
randexp (0.1.7)
+ rash_alt (0.4.12)
+ hashie (>= 3.4)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
@@ -1174,7 +1201,7 @@ GEM
ruby2_keywords (0.0.5)
ruby_parser (3.15.0)
sexp_processor (~> 4.9)
- rubyntlm (0.6.2)
+ rubyntlm (0.6.3)
rubypants (0.2.0)
rubyzip (2.3.2)
rugged (1.2.0)
@@ -1225,8 +1252,8 @@ GEM
settingslogic (2.0.9)
sexp_processor (4.15.1)
shellany (0.0.1)
- shoulda-matchers (4.0.1)
- activesupport (>= 4.2.0)
+ shoulda-matchers (5.1.0)
+ activesupport (>= 5.2.0)
sidekiq (6.4.0)
connection_pool (>= 2.2.2)
rack (~> 2.0)
@@ -1400,6 +1427,7 @@ GEM
validates_hostname (1.0.11)
activerecord (>= 3.0)
activesupport (>= 3.0)
+ version_gem (1.0.0)
version_sorter (2.2.4)
view_component (2.50.0)
activesupport (>= 5.0.0, < 8.0)
@@ -1407,7 +1435,7 @@ GEM
vmstat (2.3.0)
warden (1.2.8)
rack (>= 2.0.6)
- warning (1.2.0)
+ warning (1.3.0)
webauthn (2.3.0)
android_key_attestation (~> 0.3.0)
awrence (~> 1.1)
@@ -1454,7 +1482,7 @@ DEPENDENCIES
addressable (~> 2.8)
akismet (~> 3.0)
apollo_upload_server (~> 2.1.0)
- asana (~> 0.10.3)
+ asana (~> 0.10.13)
asciidoctor (~> 2.0.10)
asciidoctor-include-ext (~> 0.4.0)
asciidoctor-kroki (~> 0.5.0)
@@ -1464,8 +1492,8 @@ DEPENDENCIES
autoprefixer-rails (= 10.2.5.1)
awesome_print
aws-sdk-cloudformation (~> 1)
- aws-sdk-core (~> 3)
- aws-sdk-s3 (~> 1)
+ aws-sdk-core (~> 3.131.0)
+ aws-sdk-s3 (~> 1.114.0)
babosa (~> 1.0.4)
base32 (~> 0.3.0)
batch-loader (~> 2.0.1)
@@ -1496,6 +1524,7 @@ DEPENDENCIES
derailed_benchmarks
device_detector
devise (~> 4.7.2)
+ devise-pbkdf2-encryptable (~> 0.0.0)!
devise-two-factor (~> 4.0.2)
diff_match_patch (~> 0.1.0)
diffy (~> 3.3)
@@ -1508,6 +1537,7 @@ DEPENDENCIES
elasticsearch-rails (~> 7.2)
email_reply_trimmer (~> 0.1)
email_spec (~> 2.2.0)
+ error_tracking_open_api!
erubi (~> 1.9.0)
escape_utils (~> 1.1)
factory_bot_rails (~> 6.2.0)
@@ -1534,7 +1564,7 @@ DEPENDENCIES
gitaly (~> 15.1.0.pre.rc1)
github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5)
- gitlab-dangerfiles (~> 3.4.0)
+ gitlab-dangerfiles (~> 3.4.3)
gitlab-experiment (~> 0.7.1)
gitlab-fog-azure-rm (~> 1.3.0)
gitlab-labkit (~> 0.23.0)
@@ -1547,7 +1577,7 @@ DEPENDENCIES
gitlab-sidekiq-fetcher (= 0.8.0)
gitlab-styles (~> 7.1.0)
gitlab_chronic_duration (~> 0.10.6.2)
- gitlab_omniauth-ldap (~> 2.1.1)
+ gitlab_omniauth-ldap (~> 2.2.0)
gon (~> 6.4.0)
google-api-client (~> 0.33)
google-protobuf (~> 3.19.0)
@@ -1559,7 +1589,7 @@ DEPENDENCIES
graphiql-rails (~> 1.8)
graphlient (~> 0.5.0)
graphql (~> 1.13.12)
- graphql-docs (~> 1.6.0)
+ graphql-docs (~> 2.1.0)
grpc (~> 1.42.0)
gssapi
guard-rspec
@@ -1575,7 +1605,7 @@ DEPENDENCIES
icalendar
invisible_captcha (~> 1.1.0)
ipaddress (~> 0.8.3)
- ipynbdiff (= 0.4.7)
+ ipynbdiff!
jira-ruby (~> 2.1.4)
js_regex (~> 3.7)
json (~> 2.5.1)
@@ -1586,12 +1616,12 @@ DEPENDENCIES
knapsack (~> 1.21.1)
kramdown (~> 2.3.1)
kubeclient (~> 4.9.2)
- lefthook (~> 0.8.0)
+ lefthook (~> 1.0.0)
letter_opener_web (~> 2.0.0)
licensee (~> 9.14.1)
lockbox (~> 0.6.2)
lograge (~> 0.5)
- loofah (~> 2.2)
+ loofah (~> 2.18.0)
lru_redux
mail (= 2.7.1)
mail-smtp_pool (~> 0.1.0)!
@@ -1604,10 +1634,10 @@ DEPENDENCIES
net-ldap (~> 0.16.3)
net-ntp
nokogiri (~> 1.13.6)
- oauth2 (~> 1.4)
+ oauth2 (~> 2.0)
octokit (~> 4.15)
ohai (~> 16.10)
- oj (~> 3.10.6)
+ oj (~> 3.13.16)
omniauth (~> 1.8)
omniauth-alicloud (~> 1.0.1)
omniauth-atlassian-oauth2 (~> 0.2.0)
@@ -1619,14 +1649,14 @@ DEPENDENCIES
omniauth-dingtalk-oauth2 (~> 1.0)
omniauth-facebook (~> 4.0.0)
omniauth-github (~> 1.4)
- omniauth-gitlab (~> 1.0.2)
+ omniauth-gitlab (~> 4.0.0)!
omniauth-google-oauth2 (~> 0.6.0)
omniauth-oauth2-generic (~> 0.2.2)
omniauth-salesforce (~> 1.0.5)
omniauth-saml (~> 1.10)
omniauth-shibboleth (~> 1.3.0)
omniauth-twitter (~> 1.4)
- omniauth_crowd (~> 2.4.0)
+ omniauth_crowd (~> 2.4.0)!
org-ruby (~> 0.9.12)
pact (~> 1.12)
parallel (~> 1.19)
@@ -1636,13 +1666,13 @@ DEPENDENCIES
pg_query (~> 2.1.0)
png_quantizator (~> 0.2.1)
premailer-rails (~> 1.10.3)
- prometheus-client-mmap (~> 0.15.0)
+ prometheus-client-mmap (~> 0.16)
pry-byebug
pry-rails (~> 0.3.9)
pry-shell (~> 0.5.0)
puma (~> 5.6.2)
puma_worker_killer (~> 0.3.1)
- rack (~> 2.2.3.0)
+ rack (~> 2.2.4)
rack-attack (~> 6.6.0)
rack-cors (~> 1.1.0)
rack-oauth2 (~> 1.19.0)
@@ -1650,7 +1680,7 @@ DEPENDENCIES
rack-timeout (~> 0.6.0)
rails (~> 6.1.4.7)
rails-controller-testing
- rails-i18n (~> 6.0)
+ rails-i18n (~> 7.0)
rainbow (~> 3.0)
rbtrace (~> 0.4)
rdoc (~> 6.3.2)
@@ -1690,7 +1720,7 @@ DEPENDENCIES
sentry-ruby (~> 5.1.1)
sentry-sidekiq (~> 5.1.1)
settingslogic (~> 2.0.9)
- shoulda-matchers (~> 4.0.1)
+ shoulda-matchers (~> 5.1.0)
sidekiq (~> 6.4)
sidekiq-cron (~> 1.2)
sigdump (~> 0.2.4)
@@ -1730,7 +1760,7 @@ DEPENDENCIES
version_sorter (~> 2.2.4)
view_component (~> 2.50.0)
vmstat (~> 2.3.0)
- warning (~> 1.2.0)
+ warning (~> 1.3.0)
webauthn (~> 2.3)
webmock (~> 3.9.1)
webrick (~> 1.6.1)
diff --git a/app/assets/javascripts/access_tokens/components/access_token_table_app.vue b/app/assets/javascripts/access_tokens/components/access_token_table_app.vue
index 944a2ef7f64..59f0e0dd17d 100644
--- a/app/assets/javascripts/access_tokens/components/access_token_table_app.vue
+++ b/app/assets/javascripts/access_tokens/components/access_token_table_app.vue
@@ -138,10 +138,9 @@ export default {
}}</span>
</template>
- <template #cell(action)="{ item: { revokePath, expiresAt } }">
+ <template #cell(action)="{ item: { revokePath } }">
<gl-button
- variant="danger"
- :category="expiresAt ? 'primary' : 'secondary'"
+ category="tertiary"
:aria-label="$options.i18n.revokeButton"
:data-confirm="modalMessage"
data-confirm-btn-variant="danger"
diff --git a/app/assets/javascripts/access_tokens/components/new_access_token_app.vue b/app/assets/javascripts/access_tokens/components/new_access_token_app.vue
index 904052688f3..e111ae91e5c 100644
--- a/app/assets/javascripts/access_tokens/components/new_access_token_app.vue
+++ b/app/assets/javascripts/access_tokens/components/new_access_token_app.vue
@@ -117,7 +117,7 @@ export default {
<template v-if="errors">
<gl-alert :title="alertDangerTitle" variant="danger" @dismiss="errors = null">
- <ul class="m-0">
+ <ul class="gl-m-0">
<li v-for="error in errors" :key="error">
{{ error }}
</li>
diff --git a/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_trigger.vue b/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_trigger.vue
index 78a575ffe96..a58b6e62254 100644
--- a/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_trigger.vue
+++ b/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_trigger.vue
@@ -37,11 +37,11 @@ export default {
<gl-button
:class="[
{
- 'ml-3': !contextCommitsEmpty,
- 'mt-3': !commitsEmpty && contextCommitsEmpty,
+ 'gl-ml-5': !contextCommitsEmpty,
+ 'gl-mt-5': !commitsEmpty && contextCommitsEmpty,
},
]"
- :variant="commitsEmpty ? 'info' : 'default'"
+ :variant="commitsEmpty ? 'confirm' : 'default'"
@click="openModal"
>
{{ buttonText }}
diff --git a/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue b/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue
index 96584080d0f..8ad218ab97b 100644
--- a/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue
+++ b/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue
@@ -244,7 +244,7 @@ export default {
</template>
</gl-sprintf>
</template>
- <div class="mt-2">
+ <div class="gl-mt-3">
<gl-search-box-by-type
ref="searchInput"
:placeholder="__(`Search by commit title or SHA`)"
diff --git a/app/assets/javascripts/add_context_commits_modal/index.js b/app/assets/javascripts/add_context_commits_modal/index.js
index 697d32664e8..110677781a7 100644
--- a/app/assets/javascripts/add_context_commits_modal/index.js
+++ b/app/assets/javascripts/add_context_commits_modal/index.js
@@ -8,7 +8,7 @@ export default function initAddContextCommitsTriggers() {
const addContextCommitsModalTriggerEl = document.querySelector('.add-review-item-modal-trigger');
const addContextCommitsModalWrapperEl = document.querySelector('.add-review-item-modal-wrapper');
- if (addContextCommitsModalTriggerEl || addContextCommitsModalWrapperEl) {
+ if (addContextCommitsModalTriggerEl) {
// eslint-disable-next-line no-new
new Vue({
el: addContextCommitsModalTriggerEl,
@@ -28,7 +28,9 @@ export default function initAddContextCommitsTriggers() {
});
},
});
+ }
+ if (addContextCommitsModalWrapperEl) {
const store = createStore();
// eslint-disable-next-line no-new
diff --git a/app/assets/javascripts/admin/deploy_keys/components/table.vue b/app/assets/javascripts/admin/deploy_keys/components/table.vue
index 29e8b9a724e..46e7ac3cf28 100644
--- a/app/assets/javascripts/admin/deploy_keys/components/table.vue
+++ b/app/assets/javascripts/admin/deploy_keys/components/table.vue
@@ -35,8 +35,12 @@ export default {
label: __('Title'),
},
{
+ key: 'fingerprint_sha256',
+ label: __('Fingerprint (SHA256)'),
+ },
+ {
key: 'fingerprint',
- label: __('Fingerprint'),
+ label: __('Fingerprint (MD5)'),
},
{
key: 'projects',
@@ -130,10 +134,18 @@ export default {
}
this.items = items.map(
- ({ id, title, fingerprint, projects_with_write_access, created_at }) => ({
+ ({
id,
title,
fingerprint,
+ fingerprint_sha256,
+ projects_with_write_access,
+ created_at,
+ }) => ({
+ id,
+ title,
+ fingerprint,
+ fingerprint_sha256,
projects: projects_with_write_access,
created: created_at,
}),
@@ -196,8 +208,12 @@ export default {
>
</template>
+ <template #cell(fingerprint_sha256)="{ item: { fingerprint_sha256 } }">
+ <span v-if="fingerprint_sha256" class="monospace">{{ fingerprint_sha256 }}</span>
+ </template>
+
<template #cell(fingerprint)="{ item: { fingerprint } }">
- <code>{{ fingerprint }}</code>
+ <span v-if="fingerprint" class="monospace">{{ fingerprint }}</span>
</template>
<template #cell(created)="{ item: { created } }">
diff --git a/app/assets/javascripts/admin/statistics_panel/components/app.vue b/app/assets/javascripts/admin/statistics_panel/components/app.vue
index f250bdae4f5..347d5f0229c 100644
--- a/app/assets/javascripts/admin/statistics_panel/components/app.vue
+++ b/app/assets/javascripts/admin/statistics_panel/components/app.vue
@@ -1,10 +1,11 @@
<script>
-import { GlLoadingIcon } from '@gitlab/ui';
+import { GlCard, GlLoadingIcon } from '@gitlab/ui';
import { mapState, mapGetters, mapActions } from 'vuex';
import statisticsLabels from '../constants';
export default {
components: {
+ GlCard,
GlLoadingIcon,
},
data() {
@@ -26,20 +27,14 @@ export default {
</script>
<template>
- <div class="gl-card">
- <div class="gl-card-body">
- <h4>{{ __('Statistics') }}</h4>
- <gl-loading-icon v-if="isLoading" size="lg" class="my-3" />
- <template v-else>
- <p
- v-for="statistic in getStatistics(statisticsLabels)"
- :key="statistic.key"
- class="js-stats"
- >
- {{ statistic.label }}
- <span class="light float-right">{{ statistic.value }}</span>
- </p>
- </template>
- </div>
- </div>
+ <gl-card>
+ <h4>{{ __('Statistics') }}</h4>
+ <gl-loading-icon v-if="isLoading" size="lg" class="my-3" />
+ <template v-else>
+ <p v-for="statistic in getStatistics(statisticsLabels)" :key="statistic.key" class="js-stats">
+ {{ statistic.label }}
+ <span class="light float-right">{{ statistic.value }}</span>
+ </p>
+ </template>
+ </gl-card>
</template>
diff --git a/app/assets/javascripts/admin/users/components/user_actions.vue b/app/assets/javascripts/admin/users/components/user_actions.vue
index 40e5f8d9d70..691a292673c 100644
--- a/app/assets/javascripts/admin/users/components/user_actions.vue
+++ b/app/assets/javascripts/admin/users/components/user_actions.vue
@@ -94,13 +94,13 @@ export default {
:data-testid="`user-actions-${user.id}`"
>
<div v-if="hasEditAction" class="gl-p-2">
- <gl-button v-if="showButtonLabels" v-bind="editButtonAttrs">{{
+ <gl-button v-if="showButtonLabels" v-bind="editButtonAttrs" icon="pencil-square">{{
$options.i18n.edit
}}</gl-button>
<gl-button
v-else
v-gl-tooltip="$options.i18n.edit"
- icon="pencil"
+ icon="pencil-square"
v-bind="editButtonAttrs"
:aria-label="$options.i18n.edit"
/>
@@ -108,18 +108,12 @@ export default {
<div v-if="hasDropdownActions" class="gl-p-2">
<gl-dropdown
- v-gl-tooltip="$options.i18n.userAdministration"
+ :text="$options.i18n.userAdministration"
data-testid="dropdown-toggle"
- icon="ellipsis_v"
data-qa-selector="user_actions_dropdown_toggle"
:data-qa-username="user.username"
- no-caret
- right
+ left
>
- <gl-dropdown-section-header>{{
- $options.i18n.userAdministration
- }}</gl-dropdown-section-header>
-
<template v-for="action in dropdownSafeActions">
<component
:is="getActionComponent(action)"
diff --git a/app/assets/javascripts/analytics/devops_reports/components/devops_score.vue b/app/assets/javascripts/analytics/devops_reports/components/devops_score.vue
index 5a394059931..fd966425920 100644
--- a/app/assets/javascripts/analytics/devops_reports/components/devops_score.vue
+++ b/app/assets/javascripts/analytics/devops_reports/components/devops_score.vue
@@ -40,7 +40,7 @@ export default {
return this.devopsScoreMetrics.averageScore === undefined;
},
},
- devopsReportDocsPath: helpPagePath('user/admin_area/analytics/dev_ops_report'),
+ devopsReportDocsPath: helpPagePath('user/admin_area/analytics/dev_ops_reports'),
tableHeaderFields: [
{
key: 'title',
diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js
index 38d05552783..e1bc59b36ef 100644
--- a/app/assets/javascripts/analytics/shared/constants.js
+++ b/app/assets/javascripts/analytics/shared/constants.js
@@ -16,60 +16,32 @@ export const dateFormats = {
// Some content is duplicated due to backward compatibility.
// It will be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/350614 in 14.9
export const METRICS_POPOVER_CONTENT = {
- 'lead-time': {
- description: s__('ValueStreamAnalytics|Median time from issue created to issue closed.'),
- },
lead_time: {
description: s__('ValueStreamAnalytics|Median time from issue created to issue closed.'),
},
- 'cycle-time': {
- description: s__(
- "ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed.",
- ),
- },
cycle_time: {
description: s__(
"ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed.",
),
},
- 'lead-time-for-changes': {
- description: s__(
- 'ValueStreamAnalytics|Median time between merge request merge and deployment to a production environment for all MRs deployed in the given time period.',
- ),
- },
lead_time_for_changes: {
description: s__(
'ValueStreamAnalytics|Median time between merge request merge and deployment to a production environment for all MRs deployed in the given time period.',
),
},
issues: { description: s__('ValueStreamAnalytics|Number of new issues created.') },
- 'new-issue': { description: s__('ValueStreamAnalytics|Number of new issues created.') },
- 'new-issues': { description: s__('ValueStreamAnalytics|Number of new issues created.') },
deploys: { description: s__('ValueStreamAnalytics|Total number of deploys to production.') },
- 'deployment-frequency': {
- description: s__('ValueStreamAnalytics|Average number of deployments to production per day.'),
- },
deployment_frequency: {
description: s__('ValueStreamAnalytics|Average number of deployments to production per day.'),
},
commits: {
description: s__('ValueStreamAnalytics|Number of commits pushed to the default branch'),
},
- 'time-to-restore-service': {
- description: s__(
- 'ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period.',
- ),
- },
time_to_restore_service: {
description: s__(
'ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period.',
),
},
- 'change-failure-rate': {
- description: s__(
- 'ValueStreamAnalytics|Percentage of deployments that cause an incident in production.',
- ),
- },
change_failure_rate: {
description: s__(
'ValueStreamAnalytics|Percentage of deployments that cause an incident in production.',
diff --git a/app/assets/javascripts/batch_comments/components/draft_note.vue b/app/assets/javascripts/batch_comments/components/draft_note.vue
index 2b1ab911fbe..300a81caa5c 100644
--- a/app/assets/javascripts/batch_comments/components/draft_note.vue
+++ b/app/assets/javascripts/batch_comments/components/draft_note.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlSafeHtmlDirective, GlBadge } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import NoteableNote from '~/notes/components/noteable_note.vue';
import PublishButton from './publish_button.vue';
@@ -14,6 +15,7 @@ export default {
directives: {
SafeHtml: GlSafeHtmlDirective,
},
+ mixins: [glFeatureFlagMixin()],
props: {
draft: {
type: Object,
@@ -92,6 +94,7 @@ export default {
:note="draft"
:line="line"
:discussion-root="true"
+ :class="{ 'gl-mb-0!': glFeatures.mrReviewSubmitComment }"
class="draft-note"
@handleEdit="handleEditing"
@cancelForm="handleNotEditing"
@@ -113,7 +116,11 @@ export default {
class="referenced-commands draft-note-commands"
></div>
- <p class="draft-note-actions d-flex" data-qa-selector="draft_note_content">
+ <p
+ v-if="!glFeatures.mrReviewSubmitComment"
+ class="draft-note-actions d-flex"
+ data-qa-selector="draft_note_content"
+ >
<publish-button
:show-count="true"
:should-publish="false"
diff --git a/app/assets/javascripts/batch_comments/components/preview_dropdown.vue b/app/assets/javascripts/batch_comments/components/preview_dropdown.vue
index f839056daf8..ba5cc0d1a76 100644
--- a/app/assets/javascripts/batch_comments/components/preview_dropdown.vue
+++ b/app/assets/javascripts/batch_comments/components/preview_dropdown.vue
@@ -2,6 +2,7 @@
import { GlDropdown, GlDropdownItem, GlIcon } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { setUrlParams, visitUrl } from '~/lib/utils/url_utility';
import PreviewItem from './preview_item.vue';
import DraftsCount from './drafts_count.vue';
@@ -17,6 +18,7 @@ export default {
computed: {
...mapState('diffs', ['viewDiffsFileByFile']),
...mapGetters('batchComments', ['draftsCount', 'sortedDrafts']),
+ ...mapGetters(['getNoteableData']),
},
methods: {
...mapActions('diffs', ['setCurrentFileHash']),
@@ -24,12 +26,21 @@ export default {
isLast(index) {
return index === this.sortedDrafts.length - 1;
},
+ isOnLatestDiff(draft) {
+ return draft.position?.head_sha === this.getNoteableData.diff_head_sha;
+ },
async onClickDraft(draft) {
if (this.viewDiffsFileByFile && draft.file_hash) {
await this.setCurrentFileHash(draft.file_hash);
}
- await this.scrollToDraft(draft);
+ if (draft.position && !this.isOnLatestDiff(draft)) {
+ const url = new URL(setUrlParams({ commit_id: draft.position.head_sha }));
+ url.hash = `note_${draft.id}`;
+ visitUrl(url.toString());
+ } else {
+ await this.scrollToDraft(draft);
+ }
},
},
};
diff --git a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
index 5f4a1e44ea3..b070848cae9 100644
--- a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
+++ b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
@@ -22,6 +22,18 @@ export default {
computed: {
...mapGetters(['getNotesData', 'getNoteableData', 'noteableType', 'getCurrentUserLastNote']),
},
+ mounted() {
+ // We override the Bootstrap Vue click outside behaviour
+ // to allow for clicking in the autocomplete dropdowns
+ // without this override the submit dropdown will close
+ // whenever a item in the autocomplete dropdown is clicked
+ const originalClickOutHandler = this.$refs.dropdown.$refs.dropdown.clickOutHandler;
+ this.$refs.dropdown.$refs.dropdown.clickOutHandler = (e) => {
+ if (!e.target.closest('.atwho-container')) {
+ originalClickOutHandler(e);
+ }
+ };
+ },
methods: {
...mapActions('batchComments', ['publishReview']),
async submitReview() {
@@ -52,7 +64,13 @@ export default {
</script>
<template>
- <gl-dropdown right class="submit-review-dropdown" variant="info" category="secondary">
+ <gl-dropdown
+ ref="dropdown"
+ right
+ class="submit-review-dropdown"
+ variant="info"
+ category="secondary"
+ >
<template #button-content>
{{ __('Finish review') }}
<gl-icon class="dropdown-chevron" name="chevron-up" />
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 908cbfd6dc8..a44b9827fe9 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
@@ -138,6 +138,12 @@ export const scrollToDraft = ({ dispatch, rootGetters }, draft) => {
window.mrTabs.tabShown(tab);
}
+ const { file_path: filePath } = draft;
+
+ if (filePath) {
+ dispatch('diffs/setFileCollapsedAutomatically', { filePath, collapsed: false }, { root: true });
+ }
+
if (discussion) {
dispatch('expandDiscussion', { discussionId: discussion.id }, { root: true });
}
diff --git a/app/assets/javascripts/blob/3d_viewer/index.js b/app/assets/javascripts/blob/3d_viewer/index.js
index fd064e7ca8f..d4efe409fef 100644
--- a/app/assets/javascripts/blob/3d_viewer/index.js
+++ b/app/assets/javascripts/blob/3d_viewer/index.js
@@ -98,9 +98,9 @@ export default class Renderer {
requestAnimationFrame(this.renderWrapper);
}
- changeObjectMaterials(type) {
+ changeObjectMaterials(material) {
this.objects.forEach((obj) => {
- obj.changeMaterial(type);
+ obj.changeMaterial(material);
});
}
diff --git a/app/assets/javascripts/blob/3d_viewer/mesh_object.js b/app/assets/javascripts/blob/3d_viewer/mesh_object.js
index cb7fcff8674..c55a9ca8926 100644
--- a/app/assets/javascripts/blob/3d_viewer/mesh_object.js
+++ b/app/assets/javascripts/blob/3d_viewer/mesh_object.js
@@ -30,7 +30,7 @@ export default class MeshObject extends Mesh {
}
}
- changeMaterial(type) {
- this.material = materials[type];
+ changeMaterial(materialKey) {
+ this.material = materials[materialKey];
}
}
diff --git a/app/assets/javascripts/blob/stl_viewer.js b/app/assets/javascripts/blob/stl_viewer.js
index 0ea623a705a..768bbce9c57 100644
--- a/app/assets/javascripts/blob/stl_viewer.js
+++ b/app/assets/javascripts/blob/stl_viewer.js
@@ -5,15 +5,15 @@ export default () => {
[].slice.call(document.querySelectorAll('.js-material-changer')).forEach((el) => {
el.addEventListener('click', (e) => {
- const { target } = e;
+ const { currentTarget } = e;
e.preventDefault();
document.querySelector('.js-material-changer.selected').classList.remove('selected');
- target.classList.add('selected');
- target.blur();
+ currentTarget.classList.add('selected');
+ currentTarget.blur();
- viewer.changeObjectMaterials(target.dataset.type);
+ viewer.changeObjectMaterials(currentTarget.dataset.material);
});
});
};
diff --git a/app/assets/javascripts/boards/components/board_card.vue b/app/assets/javascripts/boards/components/board_card.vue
index dc821cb9f58..3638fdd2ca5 100644
--- a/app/assets/javascripts/boards/components/board_card.vue
+++ b/app/assets/javascripts/boards/components/board_card.vue
@@ -48,6 +48,15 @@ export default {
isDraggable() {
return !this.disabled && this.item.id && !this.item.isLoading;
},
+ cardStyle() {
+ return this.isColorful && this.item.color ? { borderColor: this.item.color } : '';
+ },
+ isColorful() {
+ return gon?.features?.epicColorHighlight;
+ },
+ colorClass() {
+ return this.isColorful ? 'gl-pl-4 gl-border-l-solid gl-border-4' : '';
+ },
},
methods: {
...mapActions(['toggleBoardItemMultiSelection', 'toggleBoardItem']),
@@ -70,17 +79,21 @@ export default {
<template>
<li
data-qa-selector="board_card"
- :class="{
- 'multi-select': multiSelectVisible,
- 'gl-cursor-grab': isDraggable,
- 'is-disabled': isDisabled,
- 'is-active': isActive,
- 'gl-cursor-not-allowed gl-bg-gray-10': item.isLoading,
- }"
+ :class="[
+ {
+ 'multi-select': multiSelectVisible,
+ 'gl-cursor-grab': isDraggable,
+ 'is-disabled': isDisabled,
+ 'is-active': isActive,
+ 'gl-cursor-not-allowed gl-bg-gray-10': item.isLoading,
+ },
+ colorClass,
+ ]"
:index="index"
:data-item-id="item.id"
:data-item-iid="item.iid"
:data-item-path="item.referencePath"
+ :style="cardStyle"
data-testid="board_card"
class="board-card gl-p-5 gl-rounded-base"
@click="toggleIssue($event)"
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index 98ce1ac7f97..a632f5ae0ed 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -243,6 +243,7 @@ export default {
:description="label.description"
size="sm"
:scoped="showScopedLabel(label)"
+ target="#"
@click="filterByLabel(label)"
/>
</template>
@@ -253,7 +254,7 @@ export default {
<div
class="gl-display-flex align-items-start flex-wrap-reverse board-card-number-container gl-overflow-hidden"
>
- <gl-loading-icon v-if="item.isLoading" size="lg" class="mt-3" />
+ <gl-loading-icon v-if="item.isLoading" size="lg" class="gl-mt-5" />
<span
v-if="item.referencePath"
class="board-card-number gl-overflow-hidden gl-display-flex gl-mr-3 gl-mt-3"
diff --git a/app/assets/javascripts/boards/components/toggle_focus.vue b/app/assets/javascripts/boards/components/toggle_focus.vue
index 71612e0742f..990a6fa63d4 100644
--- a/app/assets/javascripts/boards/components/toggle_focus.vue
+++ b/app/assets/javascripts/boards/components/toggle_focus.vue
@@ -20,7 +20,7 @@ export default {
hide(this.$refs.toggleFocusModeButton);
const issueBoardsContent = document.querySelector('.content-wrapper > .js-focus-mode-board');
- issueBoardsContent.classList.toggle('is-focused');
+ issueBoardsContent?.classList.toggle('is-focused');
this.isFullscreen = !this.isFullscreen;
},
diff --git a/app/assets/javascripts/ci_secure_files/components/secure_files_list.vue b/app/assets/javascripts/ci_secure_files/components/secure_files_list.vue
index ebcc4b85ac4..9d8cb40b60a 100644
--- a/app/assets/javascripts/ci_secure_files/components/secure_files_list.vue
+++ b/app/assets/javascripts/ci_secure_files/components/secure_files_list.vue
@@ -3,7 +3,6 @@ import {
GlAlert,
GlButton,
GlIcon,
- GlLink,
GlLoadingIcon,
GlModal,
GlModalDirective,
@@ -14,9 +13,9 @@ import {
} from '@gitlab/ui';
import * as Sentry from '@sentry/browser';
import Api, { DEFAULT_PER_PAGE } from '~/api';
-import { helpPagePath } from '~/helpers/help_page_helper';
import httpStatusCodes from '~/lib/utils/http_status';
import { __, s__, sprintf } from '~/locale';
+import Tracking from '~/tracking';
import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
export default {
@@ -24,7 +23,6 @@ export default {
GlAlert,
GlButton,
GlIcon,
- GlLink,
GlLoadingIcon,
GlModal,
GlPagination,
@@ -36,22 +34,18 @@ export default {
GlTooltip: GlTooltipDirective,
GlModal: GlModalDirective,
},
+ mixins: [Tracking.mixin()],
inject: ['projectId', 'admin', 'fileSizeLimit'],
- docsLink: helpPagePath('ci/secure_files/index'),
DEFAULT_PER_PAGE,
i18n: {
deleteLabel: __('Delete File'),
uploadLabel: __('Upload File'),
uploadingLabel: __('Uploading...'),
+ noFilesMessage: __('There are no secure files yet.'),
pagination: {
next: __('Next'),
prev: __('Prev'),
},
- title: __('Secure Files'),
- overviewMessage: __(
- 'Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates.',
- ),
- moreInformation: __('More information'),
uploadErrorMessages: {
duplicate: __('A file with this name already exists.'),
tooLarge: __('File too large. Secure Files must be less than %{limit} MB.'),
@@ -79,12 +73,12 @@ export default {
fields: [
{
key: 'name',
- label: __('Filename'),
+ label: __('File name'),
tdClass: 'gl-vertical-align-middle!',
},
{
key: 'created_at',
- label: __('Uploaded'),
+ label: __('Uploaded date'),
tdClass: 'gl-vertical-align-middle!',
},
{
@@ -113,6 +107,8 @@ export default {
try {
await Api.deleteProjectSecureFile(this.projectId, secureFileId);
this.getProjectSecureFiles();
+
+ this.track('delete_secure_file');
} catch (error) {
Sentry.captureException(error);
this.error = true;
@@ -129,6 +125,7 @@ export default {
this.loading = false;
this.uploading = false;
+ this.track('render_secure_files_list');
},
async uploadSecureFile() {
this.error = null;
@@ -137,6 +134,7 @@ export default {
try {
await Api.uploadProjectSecureFile(this.projectId, this.uploadFormData(file));
this.getProjectSecureFiles();
+ this.track('upload_secure_file');
} catch (error) {
this.error = true;
this.errorMessage = this.formattedErrorMessage(error);
@@ -157,7 +155,7 @@ export default {
}
return message;
},
- loadFileSelctor() {
+ loadFileSelector() {
this.$refs.fileUpload.click();
},
setDeleteModalData(secureFile) {
@@ -177,91 +175,74 @@ export default {
<template>
<div>
- <gl-alert v-if="error" variant="danger" class="gl-mt-6" @dismiss="error = null">
- {{ errorMessage }}
- </gl-alert>
- <div class="row">
- <div class="col-md-12 col-lg-6 gl-display-flex">
- <div class="gl-flex-direction-column gl-flex-wrap">
- <h1 class="gl-font-size-h1 gl-mt-3 gl-mb-0">
- {{ $options.i18n.title }}
- </h1>
- </div>
- </div>
+ <div class="ci-secure-files-table">
+ <gl-alert v-if="error" variant="danger" class="gl-mt-6" @dismiss="error = null">
+ {{ errorMessage }}
+ </gl-alert>
+
+ <gl-table
+ :busy="loading"
+ :fields="fields"
+ :items="projectSecureFiles"
+ tbody-tr-class="js-ci-secure-files-row"
+ data-qa-selector="ci_secure_files_table_content"
+ sort-by="key"
+ sort-direction="asc"
+ stacked="lg"
+ table-class="text-secondary"
+ show-empty
+ sort-icon-left
+ no-sort-reset
+ :empty-text="$options.i18n.noFilesMessage"
+ >
+ <template #table-busy>
+ <gl-loading-icon size="lg" class="gl-my-5" />
+ </template>
+
+ <template #cell(name)="{ item }">
+ {{ item.name }}
+ </template>
- <div class="col-md-12 col-lg-6">
- <div class="gl-display-flex gl-flex-wrap gl-justify-content-end">
- <gl-button v-if="admin" class="gl-mt-3" variant="confirm" @click="loadFileSelctor">
- <span v-if="uploading">
- <gl-loading-icon size="sm" class="gl-my-5" inline />
- {{ $options.i18n.uploadingLabel }}
- </span>
- <span v-else>
- <gl-icon name="upload" class="gl-mr-2" /> {{ $options.i18n.uploadLabel }}
- </span>
- </gl-button>
- <input
- id="file-upload"
- ref="fileUpload"
- type="file"
- class="hidden"
- data-qa-selector="file_upload_field"
- @change="uploadSecureFile"
+ <template #cell(created_at)="{ item }">
+ <timeago-tooltip :time="item.created_at" />
+ </template>
+
+ <template #cell(actions)="{ item }">
+ <gl-button
+ v-if="admin"
+ v-gl-modal="$options.deleteModalId"
+ v-gl-tooltip.hover.top="$options.i18n.deleteLabel"
+ category="secondary"
+ variant="danger"
+ icon="remove"
+ :aria-label="$options.i18n.deleteLabel"
+ data-testid="delete-button"
+ @click="setDeleteModalData(item)"
/>
- </div>
- </div>
+ </template>
+ </gl-table>
</div>
- <div class="row">
- <div class="col-md-12 col-lg-12 gl-my-4">
- <span data-testid="info-message">
- {{ $options.i18n.overviewMessage }}
- <gl-link :href="$options.docsLink" target="_blank">{{
- $options.i18n.moreInformation
- }}</gl-link>
+ <div class="gl-display-flex gl-mt-5">
+ <gl-button v-if="admin" variant="confirm" @click="loadFileSelector">
+ <span v-if="uploading">
+ <gl-loading-icon class="gl-my-5" inline />
+ {{ $options.i18n.uploadingLabel }}
+ </span>
+ <span v-else>
+ <gl-icon name="upload" class="gl-mr-2" /> {{ $options.i18n.uploadLabel }}
</span>
- </div>
+ </gl-button>
+ <input
+ id="file-upload"
+ ref="fileUpload"
+ type="file"
+ class="hidden"
+ data-qa-selector="file_upload_field"
+ @change="uploadSecureFile"
+ />
</div>
- <gl-table
- :busy="loading"
- :fields="fields"
- :items="projectSecureFiles"
- tbody-tr-class="js-ci-secure-files-row"
- data-qa-selector="ci_secure_files_table_content"
- sort-by="key"
- sort-direction="asc"
- stacked="lg"
- table-class="text-secondary"
- show-empty
- sort-icon-left
- no-sort-reset
- >
- <template #table-busy>
- <gl-loading-icon size="lg" class="gl-my-5" />
- </template>
-
- <template #cell(name)="{ item }">
- {{ item.name }}
- </template>
-
- <template #cell(created_at)="{ item }">
- <timeago-tooltip :time="item.created_at" />
- </template>
-
- <template #cell(actions)="{ item }">
- <gl-button
- v-if="admin"
- v-gl-modal="$options.deleteModalId"
- v-gl-tooltip.hover.top="$options.i18n.deleteLabel"
- variant="danger"
- icon="remove"
- :aria-label="$options.i18n.deleteLabel"
- @click="setDeleteModalData(item)"
- />
- </template>
- </gl-table>
-
<gl-pagination
v-if="!loading"
v-model="page"
diff --git a/app/assets/javascripts/clusters_list/components/agent_table.vue b/app/assets/javascripts/clusters_list/components/agent_table.vue
index 496baf8cb08..e0e3b961c51 100644
--- a/app/assets/javascripts/clusters_list/components/agent_table.vue
+++ b/app/assets/javascripts/clusters_list/components/agent_table.vue
@@ -58,7 +58,7 @@ export default {
},
computed: {
fields() {
- const tdClass = 'gl-py-5!';
+ const tdClass = 'gl-pt-3! gl-pb-4! gl-vertical-align-middle!';
return [
{
key: 'name',
@@ -184,7 +184,7 @@ export default {
data-testid="cluster-agent-connection-status"
>
<span :class="$options.AGENT_STATUSES[item.status].class" class="gl-mr-3">
- <gl-icon :name="$options.AGENT_STATUSES[item.status].icon" :size="12" /></span
+ <gl-icon :name="$options.AGENT_STATUSES[item.status].icon" :size="16" /></span
>{{ $options.AGENT_STATUSES[item.status].name }}
</span>
<gl-tooltip v-if="item.status === 'active'" :target="getStatusCellId(item)" placement="right">
diff --git a/app/assets/javascripts/clusters_list/constants.js b/app/assets/javascripts/clusters_list/constants.js
index 10e71513065..7bc8a1a7304 100644
--- a/app/assets/javascripts/clusters_list/constants.js
+++ b/app/assets/javascripts/clusters_list/constants.js
@@ -145,8 +145,8 @@ export const AGENT_STATUSES = {
},
inactive: {
name: s__('ClusterAgents|Not connected'),
- icon: 'severity-critical',
- class: 'text-danger-800',
+ icon: 'status-alert',
+ class: 'text-danger-500',
tooltip: {
title: s__('ClusterAgents|Agent might not be connected to GitLab'),
body: sprintf(
@@ -159,7 +159,7 @@ export const AGENT_STATUSES = {
unused: {
name: s__('ClusterAgents|Never connected'),
icon: 'status-neutral',
- class: 'text-secondary-400',
+ class: 'text-secondary-500',
tooltip: {
title: s__('ClusterAgents|Agent never connected to GitLab'),
body: s__('ClusterAgents|Make sure you are using a valid token.'),
diff --git a/app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue b/app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue
index e35fbf14de5..f0726ff3e63 100644
--- a/app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue
+++ b/app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue
@@ -91,6 +91,26 @@ export default {
@execute="trackToolbarControlExecution"
/>
<toolbar-button
+ data-testid="superscript"
+ content-type="superscript"
+ icon-name="superscript"
+ editor-command="toggleSuperscript"
+ category="tertiary"
+ size="medium"
+ :label="__('Superscript')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="subscript"
+ content-type="subscript"
+ icon-name="subscript"
+ editor-command="toggleSubscript"
+ category="tertiary"
+ size="medium"
+ :label="__('Subscript')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
data-testid="link"
content-type="link"
icon-name="link"
diff --git a/app/assets/javascripts/content_editor/components/content_editor_provider.vue b/app/assets/javascripts/content_editor/components/content_editor_provider.vue
index cba3b627390..5dcff1f6295 100644
--- a/app/assets/javascripts/content_editor/components/content_editor_provider.vue
+++ b/app/assets/javascripts/content_editor/components/content_editor_provider.vue
@@ -19,7 +19,7 @@ export default {
},
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
diff --git a/app/assets/javascripts/content_editor/components/editor_state_observer.vue b/app/assets/javascripts/content_editor/components/editor_state_observer.vue
index 02de6470cf2..252f69f7a5d 100644
--- a/app/assets/javascripts/content_editor/components/editor_state_observer.vue
+++ b/app/assets/javascripts/content_editor/components/editor_state_observer.vue
@@ -58,7 +58,7 @@ export default {
},
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue b/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue
index ecde593147c..6e4cde5dad6 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue
@@ -10,9 +10,31 @@ export default {
GlTooltip,
},
inject: ['tiptapEditor'],
+ data() {
+ return {
+ isActive: {},
+ };
+ },
methods: {
- execute(contentType, attrs) {
- this.tiptapEditor.chain().focus().setNode(contentType, attrs).run();
+ insert(contentType, ...args) {
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .setNode(contentType, ...args)
+ .run();
+
+ this.$emit('execute', { contentType });
+ },
+
+ insertList(listType, listItemType) {
+ if (!this.tiptapEditor.isActive(listType))
+ this.tiptapEditor.chain().focus().toggleList(listType, listItemType).run();
+
+ this.$emit('execute', { contentType: listType });
+ },
+
+ execute(command, contentType) {
+ this.tiptapEditor.chain().focus()[command]().run();
this.$emit('execute', { contentType });
},
@@ -20,15 +42,30 @@ export default {
};
</script>
<template>
- <gl-dropdown size="small" category="tertiary" icon="plus">
- <gl-dropdown-item @click="execute('diagram', { language: 'mermaid' })">
- {{ __('Mermaid diagram') }}
+ <gl-dropdown size="small" category="tertiary" icon="plus" class="content-editor-dropdown" right>
+ <gl-dropdown-item @click="insert('codeBlock')">
+ {{ __('Code block') }}
</gl-dropdown-item>
- <gl-dropdown-item @click="execute('diagram', { language: 'plantuml' })">
- {{ __('PlantUML diagram') }}
+ <gl-dropdown-item @click="insertList('details', 'detailsContent')">
+ {{ __('Details block') }}
+ </gl-dropdown-item>
+ <gl-dropdown-item class="gl-sm-display-none!" @click="insertList('bulletList', 'listItem')">
+ {{ __('Bullet list') }}
+ </gl-dropdown-item>
+ <gl-dropdown-item class="gl-sm-display-none!" @click="insertList('orderedList', 'listItem')">
+ {{ __('Ordered list') }}
+ </gl-dropdown-item>
+ <gl-dropdown-item class="gl-sm-display-none!" @click="insertList('taskList', 'taskItem')">
+ {{ __('Task list') }}
</gl-dropdown-item>
- <gl-dropdown-item @click="execute('horizontalRule')">
+ <gl-dropdown-item @click="execute('setHorizontalRule', 'horizontalRule')">
{{ __('Horizontal rule') }}
</gl-dropdown-item>
+ <gl-dropdown-item @click="insert('diagram', { language: 'mermaid' })">
+ {{ __('Mermaid diagram') }}
+ </gl-dropdown-item>
+ <gl-dropdown-item @click="insert('diagram', { language: 'plantuml' })">
+ {{ __('PlantUML diagram') }}
+ </gl-dropdown-item>
</gl-dropdown>
</template>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_table_button.vue b/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
index 46db806da94..18928acef3c 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
@@ -62,7 +62,7 @@ export default {
};
</script>
<template>
- <gl-dropdown size="small" category="tertiary" icon="table" class="table-dropdown">
+ <gl-dropdown size="small" category="tertiary" icon="table" class="content-editor-dropdown" right>
<gl-dropdown-form class="gl-px-3!">
<div v-for="r of list(maxRows)" :key="r" class="gl-display-flex">
<gl-button
diff --git a/app/assets/javascripts/content_editor/components/top_toolbar.vue b/app/assets/javascripts/content_editor/components/top_toolbar.vue
index b652e634b0c..65d71814268 100644
--- a/app/assets/javascripts/content_editor/components/top_toolbar.vue
+++ b/app/assets/javascripts/content_editor/components/top_toolbar.vue
@@ -51,12 +51,12 @@ export default {
@execute="trackToolbarControlExecution"
/>
<toolbar-button
- data-testid="strike"
- content-type="strike"
- icon-name="strikethrough"
+ data-testid="blockquote"
+ content-type="blockquote"
+ icon-name="quote"
class="gl-mx-2"
- editor-command="toggleStrike"
- :label="__('Strikethrough')"
+ editor-command="toggleBlockquote"
+ :label="__('Insert a quote')"
@execute="trackToolbarControlExecution"
/>
<toolbar-button
@@ -69,34 +69,11 @@ export default {
@execute="trackToolbarControlExecution"
/>
<toolbar-link-button data-testid="link" @execute="trackToolbarControlExecution" />
- <toolbar-image-button
- ref="imageButton"
- data-testid="image"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="blockquote"
- content-type="blockquote"
- icon-name="quote"
- class="gl-mx-2"
- editor-command="toggleBlockquote"
- :label="__('Insert a quote')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="code-block"
- content-type="codeBlock"
- icon-name="doc-code"
- class="gl-mx-2"
- editor-command="toggleCodeBlock"
- :label="__('Insert a code block')"
- @execute="trackToolbarControlExecution"
- />
<toolbar-button
data-testid="bullet-list"
content-type="bulletList"
icon-name="list-bulleted"
- class="gl-mx-2"
+ class="gl-mx-2 gl-display-none gl-sm-display-inline"
editor-command="toggleBulletList"
:label="__('Add a bullet list')"
@execute="trackToolbarControlExecution"
@@ -105,18 +82,23 @@ export default {
data-testid="ordered-list"
content-type="orderedList"
icon-name="list-numbered"
- class="gl-mx-2"
+ class="gl-mx-2 gl-display-none gl-sm-display-inline"
editor-command="toggleOrderedList"
:label="__('Add a numbered list')"
@execute="trackToolbarControlExecution"
/>
<toolbar-button
- data-testid="details"
- content-type="details"
- icon-name="details-block"
- class="gl-mx-2"
- editor-command="toggleDetails"
- :label="__('Add a collapsible section')"
+ data-testid="task-list"
+ content-type="taskList"
+ icon-name="list-task"
+ class="gl-mx-2 gl-display-none gl-sm-display-inline"
+ editor-command="toggleTaskList"
+ :label="__('Add a task list')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-image-button
+ ref="imageButton"
+ data-testid="image"
@execute="trackToolbarControlExecution"
/>
<toolbar-table-button data-testid="table" @execute="trackToolbarControlExecution" />
diff --git a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
index 61f6a233694..edf8b3d3a0b 100644
--- a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
+++ b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
@@ -42,11 +42,14 @@ export default CodeBlockLowlight.extend({
},
parseHTML() {
return [
- ...(this.parent?.() || []),
{
tag: 'div.markdown-code-block',
skip: true,
},
+ {
+ tag: 'pre.js-syntax-highlight',
+ preserveWhitespace: 'full',
+ },
];
},
renderHTML({ HTMLAttributes }) {
diff --git a/app/assets/javascripts/content_editor/extensions/division.js b/app/assets/javascripts/content_editor/extensions/division.js
deleted file mode 100644
index 566ed85acf3..00000000000
--- a/app/assets/javascripts/content_editor/extensions/division.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Node } from '@tiptap/core';
-import { PARSE_HTML_PRIORITY_LOWEST } from '../constants';
-
-const getDiv = (element) => {
- if (element.nodeName === 'DIV') return element;
- return element.querySelector('div');
-};
-
-export default Node.create({
- name: 'division',
- content: 'block*',
- group: 'block',
- defining: true,
-
- addAttributes() {
- return {
- className: {
- default: null,
- parseHTML: (element) => getDiv(element).className || null,
- },
- };
- },
-
- parseHTML() {
- return [{ tag: 'div', priority: PARSE_HTML_PRIORITY_LOWEST }];
- },
-
- renderHTML({ HTMLAttributes }) {
- return ['div', HTMLAttributes, 0];
- },
-});
diff --git a/app/assets/javascripts/content_editor/extensions/html_nodes.js b/app/assets/javascripts/content_editor/extensions/html_nodes.js
new file mode 100644
index 00000000000..23409354814
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/html_nodes.js
@@ -0,0 +1,25 @@
+import { Node } from '@tiptap/core';
+import { PARSE_HTML_PRIORITY_LOWEST } from '../constants';
+
+const tags = ['div', 'pre'];
+
+const createHtmlNodeExtension = (tagName) =>
+ Node.create({
+ name: tagName,
+ content: 'block*',
+ group: 'block',
+ defining: true,
+ addOptions() {
+ return {
+ tagName,
+ };
+ },
+ parseHTML() {
+ return [{ tag: tagName, priority: PARSE_HTML_PRIORITY_LOWEST }];
+ },
+ renderHTML({ HTMLAttributes }) {
+ return [tagName, HTMLAttributes, 0];
+ },
+ });
+
+export default tags.map(createHtmlNodeExtension);
diff --git a/app/assets/javascripts/content_editor/extensions/sourcemap.js b/app/assets/javascripts/content_editor/extensions/sourcemap.js
index 87118074462..618f17b1c5e 100644
--- a/app/assets/javascripts/content_editor/extensions/sourcemap.js
+++ b/app/assets/javascripts/content_editor/extensions/sourcemap.js
@@ -9,6 +9,7 @@ import FootnoteDefinition from './footnote_definition';
import Heading from './heading';
import HardBreak from './hard_break';
import HorizontalRule from './horizontal_rule';
+import HTMLNodes from './html_nodes';
import Image from './image';
import Italic from './italic';
import Link from './link';
@@ -51,13 +52,22 @@ export default Extension.create({
TableCell.name,
TableHeader.name,
TableRow.name,
+ ...HTMLNodes.map((htmlNode) => htmlNode.name),
],
attributes: {
+ /**
+ * The reason to add a function that returns an empty
+ * string in these attributes is indicate that these
+ * attributes shouldn’t be rendered in the ProseMirror
+ * view.
+ */
sourceMarkdown: {
default: null,
+ renderHTML: () => '',
},
sourceMapKey: {
default: null,
+ renderHTML: () => '',
},
},
},
diff --git a/app/assets/javascripts/content_editor/services/content_editor.js b/app/assets/javascripts/content_editor/services/content_editor.js
index 06757e7a280..867bf0b4d55 100644
--- a/app/assets/javascripts/content_editor/services/content_editor.js
+++ b/app/assets/javascripts/content_editor/services/content_editor.js
@@ -39,12 +39,12 @@ export class ContentEditor {
this._eventHub.dispose();
}
- deserialize(serializedContent) {
+ deserialize(markdown) {
const { _tiptapEditor: editor, _deserializer: deserializer } = this;
return deserializer.deserialize({
schema: editor.schema,
- content: serializedContent,
+ markdown,
});
}
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 15aac3d86e5..c5cfa9a4285 100644
--- a/app/assets/javascripts/content_editor/services/create_content_editor.js
+++ b/app/assets/javascripts/content_editor/services/create_content_editor.js
@@ -16,7 +16,6 @@ import DescriptionList from '../extensions/description_list';
import Details from '../extensions/details';
import DetailsContent from '../extensions/details_content';
import Diagram from '../extensions/diagram';
-import Division from '../extensions/division';
import Document from '../extensions/document';
import Dropcursor from '../extensions/dropcursor';
import Emoji from '../extensions/emoji';
@@ -32,6 +31,7 @@ import Heading from '../extensions/heading';
import History from '../extensions/history';
import HorizontalRule from '../extensions/horizontal_rule';
import HTMLMarks from '../extensions/html_marks';
+import HTMLNodes from '../extensions/html_nodes';
import Image from '../extensions/image';
import InlineDiff from '../extensions/inline_diff';
import Italic from '../extensions/italic';
@@ -103,7 +103,6 @@ export const createContentEditor = ({
DetailsContent,
Document,
Diagram,
- Division,
Dropcursor,
Emoji,
Figure,
@@ -118,6 +117,7 @@ export const createContentEditor = ({
History,
HorizontalRule,
...HTMLMarks,
+ ...HTMLNodes,
Image,
InlineDiff,
Italic,
diff --git a/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js b/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js
index dcd56e55268..fa46bd9ff81 100644
--- a/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js
+++ b/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js
@@ -16,8 +16,8 @@ export default ({ render }) => {
* document. The dom property contains the HTML generated from the Markdown Source.
*/
return {
- deserialize: async ({ schema, content }) => {
- const html = await render(content);
+ deserialize: async ({ schema, markdown }) => {
+ const html = await render(markdown);
if (!html) return {};
@@ -25,7 +25,7 @@ export default ({ render }) => {
const { body } = parser.parseFromString(html, 'text/html');
// append original source as a comment that nodes can access
- body.append(document.createComment(content));
+ body.append(document.createComment(markdown));
return { document: ProseMirrorDOMParser.fromSchema(schema).parse(body) };
},
diff --git a/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js b/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js
index 2c462cdde91..312ab88de4a 100644
--- a/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js
+++ b/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js
@@ -21,9 +21,10 @@
import { Mark } from 'prosemirror-model';
import { visitParents, SKIP } from 'unist-util-visit-parents';
-import { toString } from 'hast-util-to-string';
import { isFunction, isString, noop } from 'lodash';
+const NO_ATTRIBUTES = {};
+
/**
* Merges two ProseMirror text nodes if both text nodes
* have the same set of marks.
@@ -51,7 +52,7 @@ function maybeMerge(a, b) {
* Hast node documentation: https://github.com/syntax-tree/hast
*
* @param {HastNode} hastNode A Hast node
- * @param {String} source Markdown source file
+ * @param {String} markdown Markdown source file
*
* @returns It returns an object with the following attributes:
*
@@ -60,13 +61,13 @@ function maybeMerge(a, b) {
* - sourceMarkdown: A node’s original Markdown source extrated
* from the Markdown source file.
*/
-function createSourceMapAttributes(hastNode, source) {
+function createSourceMapAttributes(hastNode, markdown) {
const { position } = hastNode;
return position && position.end
? {
sourceMapKey: `${position.start.offset}:${position.end.offset}`,
- sourceMarkdown: source.substring(position.start.offset, position.end.offset),
+ sourceMarkdown: markdown.substring(position.start.offset, position.end.offset),
}
: {};
}
@@ -82,16 +83,16 @@ function createSourceMapAttributes(hastNode, source) {
* @param {*} proseMirrorNodeSpec ProseMirror node spec object
* @param {HastNode} hastNode A hast node
* @param {Array<HastNode>} hastParents All the ancestors of the hastNode
- * @param {String} source Markdown source file’s content
+ * @param {String} markdown Markdown source file’s content
*
* @returns An object that contains a ProseMirror node’s attributes
*/
-function getAttrs(proseMirrorNodeSpec, hastNode, hastParents, source) {
+function getAttrs(proseMirrorNodeSpec, hastNode, hastParents, markdown) {
const { getAttrs: specGetAttrs } = proseMirrorNodeSpec;
return {
- ...createSourceMapAttributes(hastNode, source),
- ...(isFunction(specGetAttrs) ? specGetAttrs(hastNode, hastParents, source) : {}),
+ ...createSourceMapAttributes(hastNode, markdown),
+ ...(isFunction(specGetAttrs) ? specGetAttrs(hastNode, hastParents, markdown) : {}),
};
}
@@ -136,6 +137,10 @@ class HastToProseMirrorConverterState {
return this.stack[this.stack.length - 1];
}
+ get topNode() {
+ return this.findInStack((item) => item.type === 'node');
+ }
+
/**
* Detects if the node stack is empty
*/
@@ -177,7 +182,7 @@ class HastToProseMirrorConverterState {
*/
addText(schema, text) {
if (!text) return;
- const nodes = this.top.content;
+ const nodes = this.topNode?.content;
const last = nodes[nodes.length - 1];
const node = schema.text(text, this.marks);
const merged = maybeMerge(last, node);
@@ -187,57 +192,92 @@ class HastToProseMirrorConverterState {
} else {
nodes.push(node);
}
-
- this.closeMarks();
}
/**
* Adds a mark to the set of marks stored temporarily
- * until addText is called.
- * @param {*} markType
- * @param {*} attrs
+ * until an inline node is created.
+ * @param {https://prosemirror.net/docs/ref/#model.MarkType} schemaType Mark schema type
+ * @param {https://github.com/syntax-tree/hast#nodes} hastNode AST node that the mark is based on
+ * @param {Object} attrs Mark attributes
+ * @param {Object} factorySpec Specifications on how th mark should be created
*/
- openMark(markType, attrs) {
- this.marks = markType.create(attrs).addToSet(this.marks);
+ openMark(schemaType, hastNode, attrs, factorySpec) {
+ const mark = schemaType.create(attrs);
+ this.stack.push({
+ type: 'mark',
+ mark,
+ attrs,
+ hastNode,
+ factorySpec,
+ });
+
+ this.marks = mark.addToSet(this.marks);
}
/**
- * Empties the temporary Mark set.
+ * Removes a mark from the list of active marks that
+ * are applied to inline nodes.
*/
- closeMarks() {
- this.marks = Mark.none;
+ closeMark() {
+ const { mark } = this.stack.pop();
+
+ this.marks = mark.removeFromSet(this.marks);
}
/**
* Adds a node to the stack data structure.
*
- * @param {Schema.NodeType} type ProseMirror Schema for the node
- * @param {HastNode} hastNode Hast node from which the ProseMirror node will be created
+ * @param {https://prosemirror.net/docs/ref/#model.NodeType} schemaType ProseMirror Schema for the node
+ * @param {https://github.com/syntax-tree/hast#nodes} hastNode Hast node from which the ProseMirror node will be created
* @param {*} attrs Node’s attributes
* @param {*} factorySpec The factory spec used to create the node factory
*/
- openNode(type, hastNode, attrs, factorySpec) {
- this.stack.push({ type, attrs, content: [], hastNode, factorySpec });
+ openNode(schemaType, hastNode, attrs, factorySpec) {
+ this.stack.push({
+ type: 'node',
+ schemaType,
+ attrs,
+ content: [],
+ hastNode,
+ factorySpec,
+ });
}
/**
* Removes the top ProseMirror node from the
* conversion stack and adds the node to the
* previous element.
- * @returns
*/
closeNode() {
- const { type, attrs, content } = this.stack.pop();
- const node = type.createAndFill(attrs, content);
-
- if (!node) return null;
-
- if (this.marks.length) {
- this.marks = Mark.none;
+ const { schemaType, attrs, content, factorySpec } = this.stack.pop();
+ const node =
+ factorySpec.type === 'inline' && this.marks.length
+ ? schemaType.createAndFill(attrs, content, this.marks)
+ : schemaType.createAndFill(attrs, content);
+
+ if (!node) {
+ /*
+ When the node returned by `createAndFill` is null is because the `content` passed as a parameter
+ doesn’t conform with the document schema. We are handling the most likely scenario here that happens
+ when a paragraph is inside another paragraph.
+
+ This scenario happens when the converter encounters a mark wrapping one or more paragraphs.
+ In this case, the converter will wrap the mark in a paragraph as well because ProseMirror does
+ not allow marks wrapping block nodes or being direct children of certain nodes like the root nodes
+ or list items.
+ */
+ if (
+ schemaType.name === 'paragraph' &&
+ content.some((child) => child.type.name === 'paragraph')
+ ) {
+ this.topNode.content.push(...content);
+ }
+ return null;
}
if (!this.empty) {
- this.top.content.push(node);
+ this.topNode.content.push(node);
}
return node;
@@ -245,9 +285,27 @@ class HastToProseMirrorConverterState {
closeUntil(hastNode) {
while (hastNode !== this.top?.hastNode) {
- this.closeNode();
+ if (this.top.type === 'node') {
+ this.closeNode();
+ } else {
+ this.closeMark();
+ }
}
}
+
+ buildDoc() {
+ let doc;
+
+ do {
+ if (this.top.type === 'node') {
+ doc = this.closeNode();
+ } else {
+ this.closeMark();
+ }
+ } while (!this.empty);
+
+ return doc;
+ }
}
/**
@@ -260,20 +318,21 @@ class HastToProseMirrorConverterState {
* @param {model.ProseMirrorSchema} schema A ProseMirror schema used to create the
* ProseMirror nodes and marks.
* @param {Object} proseMirrorFactorySpecs ProseMirror nodes factory specifications.
- * @param {String} source Markdown source file’s content
+ * @param {String} markdown Markdown source file’s content
*
* @returns An object that contains ProseMirror node factories
*/
-const createProseMirrorNodeFactories = (schema, proseMirrorFactorySpecs, source) => {
+const createProseMirrorNodeFactories = (schema, proseMirrorFactorySpecs, markdown) => {
const factories = {
root: {
selector: 'root',
wrapInParagraph: true,
- handle: (state, hastNode) => state.openNode(schema.topNodeType, hastNode, {}, {}),
+ handle: (state, hastNode) =>
+ state.openNode(schema.topNodeType, hastNode, NO_ATTRIBUTES, factories.root),
},
text: {
selector: 'text',
- handle: (state, hastNode) => {
+ handle: (state, hastNode, parent) => {
const found = state.findInStack((node) => isFunction(node.factorySpec.processText));
const { value: text } = hastNode;
@@ -281,17 +340,14 @@ const createProseMirrorNodeFactories = (schema, proseMirrorFactorySpecs, source)
return;
}
+ state.closeUntil(parent);
state.addText(schema, found ? found.factorySpec.processText(text) : text);
},
},
};
for (const [proseMirrorName, factorySpec] of Object.entries(proseMirrorFactorySpecs)) {
const factory = {
- selector: factorySpec.selector,
- skipChildren: factorySpec.skipChildren,
- processText: factorySpec.processText,
- parent: factorySpec.parent,
- wrapInParagraph: factorySpec.wrapInParagraph,
+ ...factorySpec,
};
if (factorySpec.type === 'block') {
@@ -299,48 +355,22 @@ const createProseMirrorNodeFactories = (schema, proseMirrorFactorySpecs, source)
const nodeType = schema.nodeType(proseMirrorName);
state.closeUntil(parent);
- state.openNode(
- nodeType,
- hastNode,
- getAttrs(factorySpec, hastNode, parent, source),
- factorySpec,
- );
-
- /**
- * If a getContent function is provided, we immediately close
- * the node to delegate content processing to this function.
- * */
- if (isFunction(factorySpec.getContent)) {
- state.addText(
- schema,
- factorySpec.getContent({ hastNode, hastNodeText: toString(hastNode) }),
- );
- state.closeNode();
- }
+ state.openNode(nodeType, hastNode, getAttrs(factory, hastNode, parent, markdown), factory);
};
- } else if (factorySpec.type === 'inline') {
+ } else if (factory.type === 'inline') {
const nodeType = schema.nodeType(proseMirrorName);
factory.handle = (state, hastNode, parent) => {
state.closeUntil(parent);
- state.openNode(
- nodeType,
- hastNode,
- getAttrs(factorySpec, hastNode, parent, source),
- factorySpec,
- );
+ state.openNode(nodeType, hastNode, getAttrs(factory, hastNode, parent, markdown), factory);
// Inline nodes do not have children therefore they are immediately closed
state.closeNode();
};
- } else if (factorySpec.type === 'mark') {
+ } else if (factory.type === 'mark') {
const markType = schema.marks[proseMirrorName];
factory.handle = (state, hastNode, parent) => {
- state.openMark(markType, getAttrs(factorySpec, hastNode, parent, source));
-
- if (factorySpec.inlineContent) {
- state.addText(schema, hastNode.value);
- }
+ state.openMark(markType, hastNode, getAttrs(factory, hastNode, parent, markdown), factory);
};
- } else if (factorySpec.type === 'ignore') {
+ } else if (factory.type === 'ignore') {
factory.handle = noop;
} else {
throw new RangeError(
@@ -371,7 +401,7 @@ const findParent = (ancestors, parent) => {
return ancestors[ancestors.length - 1];
};
-const calcTextNodePosition = (textNode) => {
+const resolveNodePosition = (textNode) => {
const { position, value, type } = textNode;
if (type !== 'text' || (!position.start && !position.end) || (position.start && position.end)) {
@@ -414,11 +444,14 @@ const wrapInlineElements = (nodes, wrappableTags) =>
nodes.reduce((children, child) => {
const previous = children[children.length - 1];
- if (child.type !== 'text' && !wrappableTags.includes(child.tagName)) {
+ if (
+ child.type === 'comment' ||
+ (child.type !== 'text' && !wrappableTags.includes(child.tagName))
+ ) {
return [...children, child];
}
- const wrapperExists = previous?.properties.wrapper;
+ const wrapperExists = previous?.properties?.wrapper;
if (wrapperExists) {
const wrapper = previous;
@@ -432,7 +465,7 @@ const wrapInlineElements = (nodes, wrappableTags) =>
const wrapper = {
type: 'element',
tagName: 'p',
- position: calcTextNodePosition(child),
+ position: resolveNodePosition(child),
children: [child],
properties: { wrapper: true },
};
@@ -528,19 +561,6 @@ const wrapInlineElements = (nodes, wrappableTags) =>
* it allows applying a processing function to that text. This is useful when
* you can transform the text node, i.e trim(), substring(), etc.
*
- * **skipChildren**
- *
- * Skips a hast node’s children while traversing the tree.
- *
- * **getContent**
- *
- * Allows to pass a custom function that returns the content of a block node. The
- * Content is limited to a single text node therefore the function should return
- * a String value.
- *
- * Use this property along skipChildren to provide custom processing of child nodes
- * for a block node.
- *
* **parent**
*
* Specifies what is the node’s parent. This is useful when the node’s parent is not
@@ -561,20 +581,16 @@ export const createProseMirrorDocFromMdastTree = ({
factorySpecs,
wrappableTags,
tree,
- source,
+ markdown,
}) => {
- const proseMirrorNodeFactories = createProseMirrorNodeFactories(schema, factorySpecs, source);
+ const proseMirrorNodeFactories = createProseMirrorNodeFactories(schema, factorySpecs, markdown);
const state = new HastToProseMirrorConverterState();
visitParents(tree, (hastNode, ancestors) => {
const factory = findFactory(hastNode, ancestors, proseMirrorNodeFactories);
if (!factory) {
- throw new Error(
- `Hast node of type "${
- hastNode.tagName || hastNode.type
- }" not supported by this converter. Please, provide an specification.`,
- );
+ return SKIP;
}
const parent = findParent(ancestors, factory.parent);
@@ -595,14 +611,8 @@ export const createProseMirrorDocFromMdastTree = ({
factory.handle(state, hastNode, parent);
- return factory.skipChildren === true ? SKIP : true;
+ return true;
});
- let doc;
-
- do {
- doc = state.closeNode();
- } while (!state.empty);
-
- return doc;
+ return state.buildDoc();
};
diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js
index 2d33a16f1a5..c1c7af6b1af 100644
--- a/app/assets/javascripts/content_editor/services/markdown_serializer.js
+++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js
@@ -12,7 +12,6 @@ import DescriptionItem from '../extensions/description_item';
import DescriptionList from '../extensions/description_list';
import Details from '../extensions/details';
import DetailsContent from '../extensions/details_content';
-import Division from '../extensions/division';
import Diagram from '../extensions/diagram';
import Emoji from '../extensions/emoji';
import Figure from '../extensions/figure';
@@ -24,6 +23,7 @@ import HardBreak from '../extensions/hard_break';
import Heading from '../extensions/heading';
import HorizontalRule from '../extensions/horizontal_rule';
import HTMLMarks from '../extensions/html_marks';
+import HTMLNodes from '../extensions/html_nodes';
import Image from '../extensions/image';
import InlineDiff from '../extensions/inline_diff';
import Italic from '../extensions/italic';
@@ -123,16 +123,6 @@ const defaultSerializerConfig = {
[BulletList.name]: preserveUnchanged(renderBulletList),
[CodeBlockHighlight.name]: preserveUnchanged(renderCodeBlock),
[Diagram.name]: renderCodeBlock,
- [Division.name]: (state, node) => {
- if (node.attrs.className?.includes('js-markdown-code')) {
- state.renderInline(node);
- } else {
- const newNode = node;
- delete newNode.attrs.className;
-
- renderHTMLNode('div')(state, newNode);
- }
- },
[DescriptionList.name]: renderHTMLNode('dl', true),
[DescriptionItem.name]: (state, node, parent, index) => {
if (index === 1) state.ensureNewLine();
@@ -206,6 +196,12 @@ const defaultSerializerConfig = {
[Text.name]: defaultMarkdownSerializer.nodes.text,
[Video.name]: renderPlayable,
[WordBreak.name]: (state) => state.write('<wbr>'),
+ ...HTMLNodes.reduce((serializers, htmlNode) => {
+ return {
+ ...serializers,
+ [htmlNode.name]: (state, node) => renderHTMLNode(htmlNode.options.tagName)(state, node),
+ };
+ }, {}),
},
};
diff --git a/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js
index da10c684b0b..8e2c066e011 100644
--- a/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js
+++ b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js
@@ -1,11 +1,10 @@
-import { isString } from 'lodash';
import { render } from '~/lib/gfm';
import { createProseMirrorDocFromMdastTree } from './hast_to_prosemirror_converter';
const wrappableTags = ['img', 'br', 'code', 'i', 'em', 'b', 'strong', 'a', 'strike', 's', 'del'];
const isTaskItem = (hastNode) => {
- const { className } = hastNode.properties;
+ const className = hastNode.properties?.className;
return (
hastNode.tagName === 'li' && Array.isArray(className) && className.includes('task-list-item')
@@ -23,16 +22,16 @@ const factorySpecs = {
listItem: {
type: 'block',
wrapInParagraph: true,
- selector: (hastNode) => hastNode.tagName === 'li' && !hastNode.properties.className,
+ selector: (hastNode) => hastNode.tagName === 'li' && !hastNode.properties?.className,
processText: (text) => text.trimRight(),
},
orderedList: {
type: 'block',
- selector: (hastNode) => hastNode.tagName === 'ol' && !hastNode.properties.className,
+ selector: (hastNode) => hastNode.tagName === 'ol' && !hastNode.properties?.className,
},
bulletList: {
type: 'block',
- selector: (hastNode) => hastNode.tagName === 'ul' && !hastNode.properties.className,
+ selector: (hastNode) => hastNode.tagName === 'ul' && !hastNode.properties?.className,
},
heading: {
type: 'block',
@@ -45,15 +44,8 @@ const factorySpecs = {
},
codeBlock: {
type: 'block',
- skipChildren: true,
- selector: 'pre',
- getContent: ({ hastNodeText }) => hastNodeText.replace(/\n$/, ''),
- getAttrs: (hastNode) => {
- const languageClass = hastNode.children[0]?.properties.className?.[0];
- const language = isString(languageClass) ? languageClass.replace('language-', '') : null;
-
- return { language };
- },
+ selector: 'codeblock',
+ getAttrs: (hastNode) => ({ ...hastNode.properties }),
},
horizontalRule: {
type: 'block',
@@ -62,7 +54,7 @@ const factorySpecs = {
taskList: {
type: 'block',
selector: (hastNode) => {
- const { className } = hastNode.properties;
+ const className = hastNode.properties?.className;
return (
['ul', 'ol'].includes(hastNode.tagName) &&
@@ -88,6 +80,11 @@ const factorySpecs = {
selector: (hastNode, ancestors) =>
hastNode.tagName === 'input' && isTaskItem(ancestors[ancestors.length - 1]),
},
+ div: {
+ type: 'block',
+ selector: 'div',
+ wrapInParagraph: true,
+ },
table: {
type: 'block',
selector: 'table',
@@ -118,6 +115,11 @@ const factorySpecs = {
selector: 'footnotedefinition',
getAttrs: (hastNode) => hastNode.properties,
},
+ pre: {
+ type: 'block',
+ selector: 'pre',
+ wrapInParagraph: true,
+ },
image: {
type: 'inline',
selector: 'img',
@@ -160,11 +162,19 @@ const factorySpecs = {
type: 'mark',
selector: (hastNode) => ['strike', 's', 'del'].includes(hastNode.tagName),
},
+ /* TODO
+ * Implement proper editing support for HTML comments in the Content Editor
+ * https://gitlab.com/gitlab-org/gitlab/-/issues/342173
+ */
+ comment: {
+ type: 'ignore',
+ selector: (hastNode) => hastNode.type === 'comment',
+ },
};
export default () => {
return {
- deserialize: async ({ schema, content: markdown }) => {
+ deserialize: async ({ schema, markdown }) => {
const document = await render({
markdown,
renderer: (tree) =>
@@ -173,8 +183,9 @@ export default () => {
factorySpecs,
tree,
wrappableTags,
- source: markdown,
+ markdown,
}),
+ skipRendering: ['footnoteReference', 'footnoteDefinition', 'code'],
});
return { document };
diff --git a/app/assets/javascripts/content_editor/services/serialization_helpers.js b/app/assets/javascripts/content_editor/services/serialization_helpers.js
index 88f5192af77..7d5e718b41c 100644
--- a/app/assets/javascripts/content_editor/services/serialization_helpers.js
+++ b/app/assets/javascripts/content_editor/services/serialization_helpers.js
@@ -5,6 +5,8 @@ const defaultAttrs = {
th: { colspan: 1, rowspan: 1, colwidth: null },
};
+const defaultIgnoreAttrs = ['sourceMarkdown', 'sourceMapKey'];
+
const ignoreAttrs = {
dd: ['isTerm'],
dt: ['isTerm'],
@@ -101,13 +103,17 @@ function htmlEncode(str = '') {
.replace(/"/g, '&#34;');
}
+const shouldIgnoreAttr = (tagName, attrKey, attrValue) =>
+ ignoreAttrs[tagName]?.includes(attrKey) ||
+ defaultIgnoreAttrs.includes(attrKey) ||
+ defaultAttrs[tagName]?.[attrKey] === attrValue;
+
export function openTag(tagName, attrs) {
let str = `<${tagName}`;
str += Object.entries(attrs || {})
.map(([key, value]) => {
- if ((ignoreAttrs[tagName] || []).includes(key) || defaultAttrs[tagName]?.[key] === value)
- return '';
+ if (shouldIgnoreAttr(tagName, key, value)) return '';
return ` ${key}="${htmlEncode(value?.toString())}"`;
})
diff --git a/app/assets/javascripts/deploy_keys/components/key.vue b/app/assets/javascripts/deploy_keys/components/key.vue
index 8a7d3430063..d811bb3b0bf 100644
--- a/app/assets/javascripts/deploy_keys/components/key.vue
+++ b/app/assets/javascripts/deploy_keys/components/key.vue
@@ -115,10 +115,20 @@ export default {
<div role="rowheader" class="table-mobile-header">{{ s__('DeployKeys|Deploy key') }}</div>
<div class="table-mobile-content" data-qa-selector="key_container">
<strong class="title" data-qa-selector="key_title_content"> {{ deployKey.title }} </strong>
- <div class="fingerprint" data-qa-selector="key_md5_fingerprint_content">
- {{ __('MD5') }}:{{ deployKey.fingerprint }}
- </div>
- <div class="fingerprint">{{ __('SHA256') }}:{{ deployKey.fingerprint_sha256 }}</div>
+ <dl>
+ <dt>{{ __('SHA256') }}</dt>
+ <dd class="fingerprint" data-qa-selector="key_sha256_fingerprint_content">
+ {{ deployKey.fingerprint_sha256 }}
+ </dd>
+ <template v-if="deployKey.fingerprint">
+ <dt>
+ {{ __('MD5') }}
+ </dt>
+ <dd class="fingerprint" data-qa-selector="key_md5_fingerprint_content">
+ {{ deployKey.fingerprint }}
+ </dd>
+ </template>
+ </dl>
</div>
</div>
<div class="table-section section-30 section-wrap">
diff --git a/app/assets/javascripts/deprecated_notes.js b/app/assets/javascripts/deprecated_notes.js
index 73d872cf962..2ac62b9b927 100644
--- a/app/assets/javascripts/deprecated_notes.js
+++ b/app/assets/javascripts/deprecated_notes.js
@@ -1,4 +1,4 @@
-/* eslint-disable no-restricted-properties, camelcase,
+/* eslint-disable camelcase,
no-unused-expressions, default-case,
consistent-return, no-param-reassign,
no-shadow, no-useless-escape,
@@ -10,7 +10,7 @@ class-methods-use-this */
deprecated_notes_spec.js is the spec for the legacy, jQuery notes application. It has nothing to do with the new, fancy Vue notes app.
*/
-import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
+import { GlSkeletonLoader } from '@gitlab/ui';
import Autosize from 'autosize';
import $ from 'jquery';
import { escape, uniqueId } from 'lodash';
@@ -357,7 +357,7 @@ export default class Notes {
if (shouldReset == null) {
shouldReset = true;
}
- const nthInterval = this.basePollingInterval * Math.pow(2, this.maxPollingSteps - 1);
+ const nthInterval = this.basePollingInterval * 2 ** (this.maxPollingSteps - 1);
if (shouldReset) {
this.pollingInterval = this.basePollingInterval;
} else if (this.pollingInterval < nthInterval) {
@@ -1233,10 +1233,10 @@ export default class Notes {
new Vue({
el,
components: {
- GlSkeletonLoading,
+ GlSkeletonLoader,
},
render(createElement) {
- return createElement('gl-skeleton-loading');
+ return createElement('gl-skeleton-loader');
},
});
}
diff --git a/app/assets/javascripts/design_management/components/design_sidebar.vue b/app/assets/javascripts/design_management/components/design_sidebar.vue
index 8a6dd17a25b..24cc93f5eaf 100644
--- a/app/assets/javascripts/design_management/components/design_sidebar.vue
+++ b/app/assets/javascripts/design_management/components/design_sidebar.vue
@@ -1,6 +1,6 @@
<script>
-import { GlCollapse, GlButton, GlPopover, GlSkeletonLoader } from '@gitlab/ui';
-import { getCookie, setCookie, parseBoolean, isLoggedIn } from '~/lib/utils/common_utils';
+import { GlAccordion, GlAccordionItem, GlSkeletonLoader } from '@gitlab/ui';
+import { isLoggedIn } from '~/lib/utils/common_utils';
import { s__ } from '~/locale';
import Participants from '~/sidebar/components/participants/participants.vue';
@@ -17,9 +17,8 @@ export default {
DesignDiscussion,
DesignNoteSignedOut,
Participants,
- GlCollapse,
- GlButton,
- GlPopover,
+ GlAccordion,
+ GlAccordionItem,
GlSkeletonLoader,
DesignTodoButton,
},
@@ -58,7 +57,7 @@ export default {
},
data() {
return {
- isResolvedCommentsPopoverHidden: parseBoolean(getCookie(this.$options.cookieKey)),
+ isResolvedDiscussionsExpanded: this.resolvedDiscussionsExpanded,
discussionWithOpenForm: '',
isLoggedIn: isLoggedIn(),
};
@@ -79,18 +78,22 @@ export default {
resolvedDiscussions() {
return this.discussions.filter((discussion) => discussion.resolved);
},
+ hasResolvedDiscussions() {
+ return this.resolvedDiscussions.length > 0;
+ },
+ resolvedDiscussionsTitle() {
+ return `${this.$options.i18n.resolveCommentsToggleText} (${this.resolvedDiscussions.length})`;
+ },
unresolvedDiscussions() {
return this.discussions.filter((discussion) => !discussion.resolved);
},
- resolvedCommentsToggleIcon() {
- return this.resolvedDiscussionsExpanded ? 'chevron-down' : 'chevron-right';
- },
},
watch: {
- isResolvedCommentsPopoverHidden(newVal) {
- if (!newVal) {
- this.$refs.resolvedComments.scrollIntoView();
- }
+ resolvedDiscussionsExpanded(resolvedDiscussionsExpanded) {
+ this.isResolvedDiscussionsExpanded = resolvedDiscussionsExpanded;
+ },
+ isResolvedDiscussionsExpanded() {
+ this.$emit('toggleResolvedComments');
},
},
mounted() {
@@ -100,8 +103,6 @@ export default {
},
methods: {
handleSidebarClick() {
- this.isResolvedCommentsPopoverHidden = true;
- setCookie(this.$options.cookieKey, 'true', { expires: 365 * 10 });
this.updateActiveDiscussion();
},
updateActiveDiscussion(id) {
@@ -121,8 +122,9 @@ export default {
this.discussionWithOpenForm = id;
},
},
- resolveCommentsToggleText: s__('DesignManagement|Resolved Comments'),
- cookieKey: 'hide_design_resolved_comments_popover',
+ i18n: {
+ resolveCommentsToggleText: s__('DesignManagement|Resolved Comments'),
+ },
};
</script>
@@ -181,40 +183,12 @@ export default {
@click.native.stop="updateActiveDiscussion(discussion.notes[0].id)"
@open-form="updateDiscussionWithOpenForm"
/>
- <template v-if="resolvedDiscussions.length > 0">
- <gl-button
- id="resolved-comments"
- ref="resolvedComments"
- data-testid="resolved-comments"
- :icon="resolvedCommentsToggleIcon"
- variant="link"
- class="link-inherit-color gl-text-body gl-text-decoration-none gl-font-weight-bold gl-mb-4"
- @click="$emit('toggleResolvedComments')"
- >{{ $options.resolveCommentsToggleText }} ({{ resolvedDiscussions.length }})
- </gl-button>
- <gl-popover
- v-if="!isResolvedCommentsPopoverHidden"
- :show="!isResolvedCommentsPopoverHidden"
- target="resolved-comments"
- container="popovercontainer"
- placement="top"
- :title="s__('DesignManagement|Resolved Comments')"
+ <gl-accordion v-if="hasResolvedDiscussions" :header-level="3" class="gl-mb-5">
+ <gl-accordion-item
+ v-model="isResolvedDiscussionsExpanded"
+ :title="resolvedDiscussionsTitle"
+ header-class="gl-mb-5!"
>
- <p>
- {{
- s__(
- 'DesignManagement|Comments you resolve can be viewed and unresolved by going to the "Resolved Comments" section below',
- )
- }}
- </p>
- <a
- href="https://docs.gitlab.com/ee/user/project/issues/design_management.html#resolve-design-threads"
- rel="noopener noreferrer"
- target="_blank"
- >{{ s__('DesignManagement|Learn more about resolving comments') }}</a
- >
- </gl-popover>
- <gl-collapse :visible="resolvedDiscussionsExpanded" class="gl-mt-3">
<design-discussion
v-for="discussion in resolvedDiscussions"
:key="discussion.id"
@@ -232,8 +206,8 @@ export default {
@open-form="updateDiscussionWithOpenForm"
@click.native.stop="updateActiveDiscussion(discussion.notes[0].id)"
/>
- </gl-collapse>
- </template>
+ </gl-accordion-item>
+ </gl-accordion>
<slot name="reply-form"></slot>
</template>
</div>
diff --git a/app/assets/javascripts/design_management/constants.js b/app/assets/javascripts/design_management/constants.js
index 92928ca429f..afe621ac3c5 100644
--- a/app/assets/javascripts/design_management/constants.js
+++ b/app/assets/javascripts/design_management/constants.js
@@ -12,3 +12,5 @@ export const ACTIVE_DISCUSSION_SOURCE_TYPES = {
};
export const DESIGN_DETAIL_LAYOUT_CLASSLIST = ['design-detail-layout', 'overflow-hidden', 'm-0'];
+
+export const MAXIMUM_FILE_UPLOAD_LIMIT = 10;
diff --git a/app/assets/javascripts/design_management/pages/index.vue b/app/assets/javascripts/design_management/pages/index.vue
index f81d4f6662f..51983b19677 100644
--- a/app/assets/javascripts/design_management/pages/index.vue
+++ b/app/assets/javascripts/design_management/pages/index.vue
@@ -4,16 +4,15 @@ import { GlBreakpointInstance } from '@gitlab/ui/dist/utils';
import VueDraggable from 'vuedraggable';
import permissionsQuery from 'shared_queries/design_management/design_permissions.query.graphql';
import getDesignListQuery from 'shared_queries/design_management/get_design_list.query.graphql';
-import createFlash, { FLASH_TYPES } from '~/flash';
import { getFilename, validateImageName } from '~/lib/utils/file_upload';
-import { __, s__, sprintf } from '~/locale';
+import { __, s__ } from '~/locale';
import DesignDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
import DeleteButton from '../components/delete_button.vue';
import DesignDestroyer from '../components/design_destroyer.vue';
import Design from '../components/list/item.vue';
import UploadButton from '../components/upload/button.vue';
import DesignVersionDropdown from '../components/upload/design_version_dropdown.vue';
-import { VALID_DESIGN_FILE_MIMETYPE } from '../constants';
+import { MAXIMUM_FILE_UPLOAD_LIMIT, VALID_DESIGN_FILE_MIMETYPE } from '../constants';
import moveDesignMutation from '../graphql/mutations/move_design.mutation.graphql';
import uploadDesignMutation from '../graphql/mutations/upload_design.mutation.graphql';
import allDesignsMixin from '../mixins/all_designs';
@@ -35,11 +34,10 @@ import {
UPLOAD_DESIGN_INVALID_FILETYPE_ERROR,
designUploadSkippedWarning,
designDeletionError,
+ MAXIMUM_FILE_UPLOAD_LIMIT_REACHED,
} from '../utils/error_messages';
import { trackDesignCreate, trackDesignUpdate } from '../utils/tracking';
-const MAXIMUM_FILE_UPLOAD_LIMIT = 10;
-
export default {
components: {
GlLoadingIcon,
@@ -87,6 +85,7 @@ export default {
isDraggingDesign: false,
reorderedDesigns: null,
isReorderingInProgress: false,
+ uploadError: null,
};
},
computed: {
@@ -159,16 +158,7 @@ export default {
if (!this.canCreateDesign) return false;
if (files.length > MAXIMUM_FILE_UPLOAD_LIMIT) {
- createFlash({
- message: sprintf(
- s__(
- 'DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again.',
- ),
- {
- upload_limit: MAXIMUM_FILE_UPLOAD_LIMIT,
- },
- ),
- });
+ this.uploadError = MAXIMUM_FILE_UPLOAD_LIMIT_REACHED;
return false;
}
@@ -206,7 +196,7 @@ export default {
const skippedFiles = res?.data?.designManagementUpload?.skippedDesigns || [];
const skippedWarningMessage = designUploadSkippedWarning(this.filesToBeSaved, skippedFiles);
if (skippedWarningMessage) {
- createFlash({ message: skippedWarningMessage, types: FLASH_TYPES.WARNING });
+ this.uploadError = skippedWarningMessage;
}
// if this upload resulted in a new version being created, redirect user to the latest version
@@ -229,7 +219,7 @@ export default {
},
onUploadDesignError() {
this.resetFilesToBeSaved();
- createFlash({ message: UPLOAD_DESIGN_ERROR });
+ this.uploadError = UPLOAD_DESIGN_ERROR;
},
changeSelectedDesigns(filename) {
if (this.isDesignSelected(filename)) {
@@ -260,21 +250,21 @@ export default {
},
onDesignDeleteError() {
const errorMessage = designDeletionError(this.selectedDesigns.length);
- createFlash({ message: errorMessage });
+ this.uploadError = errorMessage;
},
onDesignDropzoneError() {
- createFlash({ message: UPLOAD_DESIGN_INVALID_FILETYPE_ERROR });
+ this.uploadError = UPLOAD_DESIGN_INVALID_FILETYPE_ERROR;
},
onExistingDesignDropzoneChange(files, existingDesignFilename) {
const filesArr = Array.from(files);
if (filesArr.length > 1) {
- createFlash({ message: EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE });
+ this.uploadError = EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE;
return;
}
if (!filesArr.some(({ name }) => existingDesignFilename === name)) {
- createFlash({ message: EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE });
+ this.uploadError = EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE;
return;
}
@@ -329,7 +319,7 @@ export default {
optimisticResponse: moveDesignOptimisticResponse(this.reorderedDesigns),
})
.catch(() => {
- createFlash({ message: MOVE_DESIGN_ERROR });
+ this.uploadError = MOVE_DESIGN_ERROR;
})
.finally(() => {
this.isReorderingInProgress = false;
@@ -338,6 +328,9 @@ export default {
onDesignMove(designs) {
this.reorderedDesigns = designs;
},
+ unsetUpdateError() {
+ this.uploadError = null;
+ },
},
dragOptions: {
animation: 200,
@@ -356,6 +349,15 @@ export default {
@mouseenter="toggleOnPasteListener"
@mouseleave="toggleOffPasteListener"
>
+ <gl-alert
+ v-if="uploadError"
+ variant="danger"
+ class="gl-mb-3"
+ data-testid="design-update-alert"
+ @dismiss="unsetUpdateError"
+ >
+ {{ uploadError }}
+ </gl-alert>
<header
v-if="showToolbar"
class="gl-display-flex gl-my-0 gl-text-gray-900"
@@ -371,6 +373,7 @@ export default {
<div
v-show="hasDesigns"
class="qa-selector-toolbar gl-display-flex gl-align-items-center gl-my-2"
+ data-testid="design-selector-toolbar"
>
<gl-button
v-if="isLatestVersion"
diff --git a/app/assets/javascripts/design_management/utils/error_messages.js b/app/assets/javascripts/design_management/utils/error_messages.js
index 981b50329b2..42f752efc9e 100644
--- a/app/assets/javascripts/design_management/utils/error_messages.js
+++ b/app/assets/javascripts/design_management/utils/error_messages.js
@@ -1,4 +1,5 @@
import { __, s__, n__, sprintf } from '~/locale';
+import { MAXIMUM_FILE_UPLOAD_LIMIT } from '../constants';
export const ADD_DISCUSSION_COMMENT_ERROR = s__(
'DesignManagement|Could not add a new comment. Please try again.',
@@ -27,11 +28,11 @@ export const DESIGN_NOT_FOUND_ERROR = __('Could not find design.');
export const DESIGN_VERSION_NOT_EXIST_ERROR = __('Requested design version does not exist.');
export const EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE = __(
- 'You can only upload one design when dropping onto an existing design.',
+ 'Your update failed. You can only upload one design when dropping onto an existing design.',
);
export const EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE = __(
- 'You must upload a file with the same file name when dropping onto an existing design.',
+ 'Your update failed. You must upload a file with the same file name when dropping onto an existing design.',
);
export const MOVE_DESIGN_ERROR = __(
@@ -122,3 +123,12 @@ export const designUploadSkippedWarning = (uploadedDesigns, skippedFiles) => {
return someDesignsSkippedMessage(skippedFiles);
};
+
+export const MAXIMUM_FILE_UPLOAD_LIMIT_REACHED = sprintf(
+ s__(
+ 'DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again.',
+ ),
+ {
+ upload_limit: MAXIMUM_FILE_UPLOAD_LIMIT,
+ },
+);
diff --git a/app/assets/javascripts/diff.js b/app/assets/javascripts/diff.js
index 9f3fb715150..8388458b11c 100644
--- a/app/assets/javascripts/diff.js
+++ b/app/assets/javascripts/diff.js
@@ -101,6 +101,7 @@ export default class Diff {
const clickTarget = $('.js-file-title, .click-to-expand', diffFile);
diffFile.data('singleFileDiff').toggleDiff(clickTarget, () => {
this.highlightSelectedLine();
+ this.prepareRenderedDiff();
if (cb) cb();
});
} else if (cb) {
@@ -156,20 +157,22 @@ export default class Diff {
}
prepareRenderedDiff() {
- const $elements = $('[data-diff-toggle-entity]');
-
- if ($elements.length === 0) return;
-
+ const allElements = this.elementsForRenderedDiff();
const diff = this;
- const elements = $elements.toArray().map(this.formatElementToObject).reduce(merge);
+ for (const [fileHash, fileElements] of Object.entries(allElements)) {
+ // eslint-disable no-param-reassign
+ fileElements.rawButton.onclick = () => {
+ diff.showRawViewer(fileHash, diff.elementsForRenderedDiff()[fileHash]);
+ };
- Object.values(elements).forEach((e) => {
- e.toShowBtn.onclick = () => diff.showOneHideAnother('rendered', e); // eslint-disable-line no-param-reassign
- e.toHideBtn.onclick = () => diff.showOneHideAnother('raw', e); // eslint-disable-line no-param-reassign
+ fileElements.renderedButton.onclick = () => {
+ diff.showRenderedViewer(fileHash, diff.elementsForRenderedDiff()[fileHash]);
+ };
+ // eslint-enable no-param-reassign
- diff.showOneHideAnother('rendered', e);
- });
+ diff.showRenderedViewer(fileHash, fileElements);
+ }
}
formatElementToObject = (element) => {
@@ -179,18 +182,33 @@ export default class Diff {
return { [key]: { [name]: element } };
};
- showOneHideAnother = (mode, elements) => {
- let { toShowBtn, toHideBtn, toShow, toHide } = elements;
+ elementsForRenderedDiff = () => {
+ const $elements = $('[data-diff-toggle-entity]');
+
+ if ($elements.length === 0) return {};
- if (mode === 'raw') {
- [toShowBtn, toHideBtn] = [toHideBtn, toShowBtn];
- [toShow, toHide] = [toHide, toShow];
- }
+ const diff = this;
+
+ return $elements.toArray().map(diff.formatElementToObject).reduce(merge);
+ };
+
+ showRawViewer = (fileHash, elements) => {
+ if (elements === undefined) return;
+
+ elements.rawButton.classList.add('selected');
+ elements.renderedButton.classList.remove('selected');
+
+ elements.renderedViewer.classList.add('hidden');
+ elements.rawViewer.classList.remove('hidden');
+ };
+
+ showRenderedViewer = (fileHash, elements) => {
+ if (elements === undefined) return;
- toShowBtn.classList.add('selected');
- toHideBtn.classList.remove('selected');
+ elements.rawButton.classList.remove('selected');
+ elements.rawViewer.classList.add('hidden');
- toHide.classList.add('hidden');
- toShow.classList.remove('hidden');
+ elements.renderedButton.classList.add('selected');
+ elements.renderedViewer.classList.remove('hidden');
};
}
diff --git a/app/assets/javascripts/diffs/components/commit_item.vue b/app/assets/javascripts/diffs/components/commit_item.vue
index 54b648e8d03..ad163a2a615 100644
--- a/app/assets/javascripts/diffs/components/commit_item.vue
+++ b/app/assets/javascripts/diffs/components/commit_item.vue
@@ -134,7 +134,9 @@ export default {
class="avatar-cell d-none d-sm-block"
/>
</div>
- <div class="commit-detail flex-list">
+ <div
+ class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-flex-start gl-flex-grow-1 gl-min-w-0"
+ >
<div class="commit-content" data-qa-selector="commit_content">
<a
v-safe-html:[$options.safeHtmlConfig]="commit.title_html"
diff --git a/app/assets/javascripts/diffs/components/diff_code_quality.vue b/app/assets/javascripts/diffs/components/diff_code_quality.vue
new file mode 100644
index 00000000000..f339b108a11
--- /dev/null
+++ b/app/assets/javascripts/diffs/components/diff_code_quality.vue
@@ -0,0 +1,56 @@
+<script>
+import { GlButton, GlIcon } from '@gitlab/ui';
+import { SEVERITY_CLASSES, SEVERITY_ICONS } from '~/reports/codequality_report/constants';
+
+export default {
+ components: { GlButton, GlIcon },
+ props: {
+ line: {
+ type: Number,
+ required: true,
+ },
+ codeQuality: {
+ type: Array,
+ required: true,
+ },
+ },
+ methods: {
+ severityClass(severity) {
+ return SEVERITY_CLASSES[severity] || SEVERITY_CLASSES.unknown;
+ },
+ severityIcon(severity) {
+ return SEVERITY_ICONS[severity] || SEVERITY_ICONS.unknown;
+ },
+ },
+};
+</script>
+
+<template>
+ <div data-testid="diff-codequality" class="gl-relative">
+ <ul
+ class="gl-list-style-none gl-mb-0 gl-p-0 codequality-findings-list gl-border-top-1 gl-border-bottom-1 gl-bg-gray-10"
+ >
+ <li
+ v-for="finding in codeQuality"
+ :key="finding.description"
+ class="gl-pt-1 gl-pb-1 gl-pl-3 gl-border-solid gl-border-bottom-0 gl-border-right-0 gl-border-1 gl-border-gray-100"
+ >
+ <gl-icon
+ :size="12"
+ :name="severityIcon(finding.severity)"
+ :class="severityClass(finding.severity)"
+ class="codequality-severity-icon"
+ />
+ {{ finding.description }}
+ </li>
+ </ul>
+ <gl-button
+ data-testid="diff-codequality-close"
+ category="tertiary"
+ size="small"
+ icon="close"
+ class="gl-absolute gl-right-2 gl-top-2"
+ @click="$emit('hideCodeQualityFindings', line)"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/diffs/components/diff_content.vue b/app/assets/javascripts/diffs/components/diff_content.vue
index bfe35e9346d..70071a3ff53 100644
--- a/app/assets/javascripts/diffs/components/diff_content.vue
+++ b/app/assets/javascripts/diffs/components/diff_content.vue
@@ -80,7 +80,7 @@ export default {
return this.getUserData;
},
mappedLines() {
- // TODO: Do this data generation when we recieve a response to save a computed property being created
+ // TODO: Do this data generation when we receive a response to save a computed property being created
return this.diffLines(this.diffFile).map(mapParallel(this)) || [];
},
},
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 ebc68bafb9a..467a0f8d2db 100644
--- a/app/assets/javascripts/diffs/components/diff_line_note_form.vue
+++ b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
@@ -206,6 +206,7 @@ export default {
);
},
updateStartLine(line) {
+ this.commentLineStart = line;
this.lines.start = line;
},
},
@@ -216,7 +217,6 @@ export default {
<div class="content discussion-form discussion-form-container discussion-notes">
<div class="gl-mb-3 gl-text-gray-500 gl-pb-3">
<multiline-comment-form
- v-model="commentLineStart"
:line="line"
:line-range="lines"
:comment-line-options="commentLineOptions"
diff --git a/app/assets/javascripts/diffs/components/diff_row.vue b/app/assets/javascripts/diffs/components/diff_row.vue
index 1b07b00d725..63c5aedd7ce 100644
--- a/app/assets/javascripts/diffs/components/diff_row.vue
+++ b/app/assets/javascripts/diffs/components/diff_row.vue
@@ -274,6 +274,9 @@ export default {
v-if="$options.showCodequalityLeft(props)"
:codequality="props.line.left.codequality"
:file-path="props.filePath"
+ @showCodeQualityFindings="
+ listeners.toggleCodeQualityFindings(props.line.left.codequality[0].line)
+ "
/>
</div>
<div
@@ -395,6 +398,9 @@ export default {
:codequality="props.line.right.codequality"
:file-path="props.filePath"
data-testid="codeQualityIcon"
+ @showCodeQualityFindings="
+ listeners.toggleCodeQualityFindings(props.line.right.codequality[0].line)
+ "
/>
</div>
<div
diff --git a/app/assets/javascripts/diffs/components/diff_view.vue b/app/assets/javascripts/diffs/components/diff_view.vue
index d740d5adcb6..ad406947561 100644
--- a/app/assets/javascripts/diffs/components/diff_view.vue
+++ b/app/assets/javascripts/diffs/components/diff_view.vue
@@ -2,12 +2,14 @@
import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import { mapGetters, mapState, mapActions } from 'vuex';
import { IdState } from 'vendor/vue-virtual-scroller';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
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 { pickDirection } from '../utils/diff_line';
import DiffCommentCell from './diff_comment_cell.vue';
+import DiffCodeQuality from './diff_code_quality.vue';
import DiffExpansionCell from './diff_expansion_cell.vue';
import DiffRow from './diff_row.vue';
import { isHighlighted } from './diff_row_utils';
@@ -17,12 +19,17 @@ export default {
DiffExpansionCell,
DiffRow,
DiffCommentCell,
+ DiffCodeQuality,
DraftNote,
},
directives: {
SafeHtml,
},
- mixins: [draftCommentsMixin, IdState({ idProp: (vm) => vm.diffFile.file_hash })],
+ mixins: [
+ draftCommentsMixin,
+ IdState({ idProp: (vm) => vm.diffFile.file_hash }),
+ glFeatureFlagsMixin(),
+ ],
props: {
diffFile: {
type: Object,
@@ -43,6 +50,11 @@ export default {
default: false,
},
},
+ data() {
+ return {
+ codeQualityExpandedLines: [],
+ };
+ },
idState() {
return {
dragStart: null,
@@ -84,6 +96,23 @@ export default {
}
this.idState.dragStart = line;
},
+ parseCodeQuality(line) {
+ return (line.left ?? line.right)?.codequality;
+ },
+
+ hideCodeQualityFindings(line) {
+ const index = this.codeQualityExpandedLines.indexOf(line);
+ if (index > -1) {
+ this.codeQualityExpandedLines.splice(index, 1);
+ }
+ },
+ toggleCodeQualityFindings(line) {
+ if (!this.codeQualityExpandedLines.includes(line)) {
+ this.codeQualityExpandedLines.push(line);
+ } else {
+ this.hideCodeQualityFindings(line);
+ }
+ },
onDragOver(line) {
if (line.chunk !== this.idState.dragStart.chunk) return;
@@ -125,15 +154,16 @@ export default {
},
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 (line) {
+ 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`);
+ if (lineClass) {
+ table.classList.add(`${lineClass}-selected`);
+ }
}
},
getCountBetweenIndex(index) {
@@ -148,6 +178,9 @@ export default {
Number(this.diffLines[index - 1].left.new_line)
);
},
+ getCodeQualityLine(line) {
+ return this.parseCodeQuality(line)?.[0]?.line;
+ },
},
userColorScheme: window.gon.user_color_scheme,
};
@@ -190,6 +223,7 @@ export default {
:coverage-loaded="coverageLoaded"
@showCommentForm="(code) => singleLineComment(code, line)"
@setHighlightedRow="setHighlightedRow"
+ @toggleCodeQualityFindings="toggleCodeQualityFindings"
@toggleLineDiscussions="
({ lineCode, expanded }) =>
toggleLineDiscussions({ lineCode, fileHash: diffFile.file_hash, expanded })
@@ -198,6 +232,17 @@ export default {
@startdragging="onStartDragging"
@stopdragging="onStopDragging"
/>
+
+ <diff-code-quality
+ v-if="
+ glFeatures.refactorCodeQualityInlineFindings &&
+ codeQualityExpandedLines.includes(getCodeQualityLine(line))
+ "
+ :key="line.line_code"
+ :line="getCodeQualityLine(line)"
+ :code-quality="parseCodeQuality(line)"
+ @hideCodeQualityFindings="hideCodeQualityFindings"
+ />
<div
v-if="line.renderCommentRow"
:key="`dcr-${line.line_code || index}`"
diff --git a/app/assets/javascripts/diffs/components/tree_list.vue b/app/assets/javascripts/diffs/components/tree_list.vue
index 85e4199d1c1..ffbea854001 100644
--- a/app/assets/javascripts/diffs/components/tree_list.vue
+++ b/app/assets/javascripts/diffs/components/tree_list.vue
@@ -1,6 +1,7 @@
<script>
import { GlTooltipDirective, GlIcon } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
+import micromatch from 'micromatch';
import { s__, sprintf } from '~/locale';
import FileTree from '~/vue_shared/components/file_tree.vue';
import DiffFileRow from './diff_file_row.vue';
@@ -28,14 +29,24 @@ export default {
...mapState('diffs', ['tree', 'renderTreeList', 'currentDiffFileId', 'viewedDiffFileIds']),
...mapGetters('diffs', ['allBlobs']),
filteredTreeList() {
- const search = this.search.toLowerCase().trim();
+ let search = this.search.toLowerCase().trim();
if (search === '') {
return this.renderTreeList ? this.tree : this.allBlobs;
}
+ const searchSplit = search.split(',').filter((t) => t);
+
+ if (searchSplit.length > 1) {
+ search = `(${searchSplit.map((s) => s.replace(/(^ +| +$)/g, '')).join('|')})`;
+ } else {
+ [search] = searchSplit;
+ }
+
return this.allBlobs.reduce((acc, folder) => {
- const tree = folder.tree.filter((f) => f.path.toLowerCase().indexOf(search) >= 0);
+ const tree = folder.tree.filter((f) =>
+ micromatch.contains(f.path, search, { nocase: true }),
+ );
if (tree.length) {
return acc.concat({
@@ -54,7 +65,7 @@ export default {
this.search = '';
},
},
- searchPlaceholder: sprintf(s__('MergeRequest|Search files (%{modifier_key}P)'), {
+ searchPlaceholder: sprintf(s__('MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)'), {
modifier_key: /Mac/i.test(navigator.userAgent) ? '⌘' : 'Ctrl+',
}),
DiffFileRow,
@@ -74,6 +85,7 @@ export default {
type="search"
name="diff-tree-search"
class="form-control"
+ data-testid="diff-tree-search"
/>
<button
v-show="search"
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index d5cd4af4d06..ace507f601a 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -744,6 +744,10 @@ export const setFileCollapsedByUser = ({ commit }, { filePath, collapsed }) => {
commit(types.SET_FILE_COLLAPSED, { filePath, collapsed, trigger: DIFF_FILE_MANUAL_COLLAPSE });
};
+export const setFileCollapsedAutomatically = ({ commit }, { filePath, collapsed }) => {
+ commit(types.SET_FILE_COLLAPSED, { filePath, collapsed, trigger: DIFF_FILE_AUTOMATIC_COLLAPSE });
+};
+
export const setSuggestPopoverDismissed = ({ commit, state }) =>
axios
.post(state.dismissEndpoint, {
diff --git a/app/assets/javascripts/editor/schema/ci.json b/app/assets/javascripts/editor/schema/ci.json
index c8015f884b7..e8b96c25965 100644
--- a/app/assets/javascripts/editor/schema/ci.json
+++ b/app/assets/javascripts/editor/schema/ci.json
@@ -436,6 +436,33 @@
"type": "string"
}
},
+ "pull_policy": {
+ "markdownDescription": "Specifies how to pull the image in Runner. It can be one of `always`, `never` or `if-not-present`. The default value is `always`. [Learn more](https://docs.gitlab.com/ee/ci/yaml/#servicepull_policy).",
+ "default": "always",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "always",
+ "never",
+ "if-not-present"
+ ]
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "always",
+ "never",
+ "if-not-present"
+ ]
+ },
+ "minItems": 1,
+ "uniqueItems": true
+ }
+ ]
+ },
"command": {
"type": "array",
"description": "Command or script that should be used as the container's command. It will be translated to arguments passed to Docker after the image's name. The syntax is similar to Dockerfile's CMD directive, where each shell token is a separate string in the array.",
diff --git a/app/assets/javascripts/editor/source_editor_instance.js b/app/assets/javascripts/editor/source_editor_instance.js
index 95a43c2b2d0..fb5d5414ca4 100644
--- a/app/assets/javascripts/editor/source_editor_instance.js
+++ b/app/assets/javascripts/editor/source_editor_instance.js
@@ -90,6 +90,7 @@ export default class EditorInstance {
this.dispatchExtAction = EditorInstance.useUnuse.bind(instProxy, extensionsStore);
+ // eslint-disable-next-line no-constructor-return
return instProxy;
}
diff --git a/app/assets/javascripts/emoji/awards_app/store/actions.js b/app/assets/javascripts/emoji/awards_app/store/actions.js
index f83bfe614dd..427a504e038 100644
--- a/app/assets/javascripts/emoji/awards_app/store/actions.js
+++ b/app/assets/javascripts/emoji/awards_app/store/actions.js
@@ -14,8 +14,6 @@ import {
export const setInitialData = ({ commit }, data) => commit(SET_INITIAL_DATA, data);
export const fetchAwards = async ({ commit, dispatch, state }, page = '1') => {
- if (!window.gon?.current_user_id) return;
-
try {
const { data, headers } = await axios.get(joinPaths(gon.relative_url_root || '', state.path), {
params: { per_page: 100, page },
diff --git a/app/assets/javascripts/environments/components/canary_update_modal.vue b/app/assets/javascripts/environments/components/canary_update_modal.vue
index fd4885a9dbd..cacd868bed0 100644
--- a/app/assets/javascripts/environments/components/canary_update_modal.vue
+++ b/app/assets/javascripts/environments/components/canary_update_modal.vue
@@ -42,7 +42,7 @@ export default {
modalId: CANARY_UPDATE_MODAL,
actionPrimary: {
text: s__('CanaryIngress|Change ratio'),
- attributes: [{ variant: 'info' }],
+ attributes: [{ variant: 'confirm' }],
},
actionCancel: { text: __('Cancel') },
static: true,
diff --git a/app/assets/javascripts/environments/components/confirm_rollback_modal.vue b/app/assets/javascripts/environments/components/confirm_rollback_modal.vue
index ce919f73858..8259574f8e3 100644
--- a/app/assets/javascripts/environments/components/confirm_rollback_modal.vue
+++ b/app/assets/javascripts/environments/components/confirm_rollback_modal.vue
@@ -6,6 +6,7 @@ import { GlModal, GlSprintf, GlLink } from '@gitlab/ui';
import { escape } from 'lodash';
import csrf from '~/lib/utils/csrf';
import { __, s__, sprintf } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
import rollbackEnvironment from '../graphql/mutations/rollback_environment.mutation.graphql';
import eventHub from '../event_hub';
@@ -84,7 +85,9 @@ export default {
return this.environment.commitUrl;
},
modalActionText() {
- return this.isLastDeployment ? s__('Environments|Re-deploy') : s__('Environments|Rollback');
+ return this.isLastDeployment
+ ? s__('Environments|Re-deploy environment')
+ : s__('Environments|Rollback environment');
},
primaryProps() {
let attributes = [{ variant: 'danger' }];
@@ -101,6 +104,15 @@ export default {
isLastDeployment() {
return this.environment?.isLastDeployment || this.environment?.lastDeployment?.isLast;
},
+ modalBodyText() {
+ return this.isLastDeployment
+ ? s__(
+ 'Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?',
+ )
+ : s__(
+ 'Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?',
+ );
+ },
},
methods: {
handleChange(event) {
@@ -125,6 +137,7 @@ export default {
text: __('Cancel'),
attributes: [{ variant: 'danger' }],
},
+ docsPath: helpPagePath('ci/environments/index.md', { anchor: 'retry-or-roll-back-a-deployment' }),
};
</script>
<template>
@@ -137,33 +150,14 @@ export default {
@ok="onOk"
@change="handleChange"
>
- <gl-sprintf
- v-if="environment.isLastDeployment"
- :message="
- s__(
- 'Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?',
- )
- "
- >
- <template #link>
+ <gl-sprintf :message="modalBodyText">
+ <template #commitId>
<gl-link :href="commitUrl" target="_blank" class="commit-sha mr-0">{{
commitShortSha
}}</gl-link>
</template>
- </gl-sprintf>
- <gl-sprintf
- v-else
- :message="
- s__(
- 'Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?',
- )
- "
- >
- <template #name>{{ environment.name }}</template>
- <template #link>
- <gl-link :href="commitUrl" target="_blank" class="commit-sha mr-0">{{
- commitShortSha
- }}</gl-link>
+ <template #docs="{ content }">
+ <gl-link :href="$options.docsLink" target="_blank">{{ content }}</gl-link>
</template>
</gl-sprintf>
</gl-modal>
diff --git a/app/assets/javascripts/environments/components/deploy_board.vue b/app/assets/javascripts/environments/components/deploy_board.vue
index 8a379ebdf66..7a2c9a8600e 100644
--- a/app/assets/javascripts/environments/components/deploy_board.vue
+++ b/app/assets/javascripts/environments/components/deploy_board.vue
@@ -51,11 +51,6 @@ export default {
type: Boolean,
required: true,
},
- logsPath: {
- type: String,
- required: false,
- default: '',
- },
graphql: {
type: Boolean,
required: false,
@@ -186,7 +181,6 @@ export default {
:status="instance.status"
:tooltip-text="instance.tooltip"
:pod-name="podName(instance)"
- :logs-path="logsPath"
:stable="instance.stable"
/>
</template>
diff --git a/app/assets/javascripts/environments/components/environments_table.vue b/app/assets/javascripts/environments/components/environments_table.vue
index 895a6cf2ccb..b47086a19da 100644
--- a/app/assets/javascripts/environments/components/environments_table.vue
+++ b/app/assets/javascripts/environments/components/environments_table.vue
@@ -164,7 +164,6 @@ export default {
:deploy-board-data="model.deployBoardData"
:is-loading="model.isLoadingDeployBoard"
:is-empty="model.isEmptyDeployBoard"
- :logs-path="model.logs_path"
@changeCanaryWeight="changeCanaryWeight(model, $event)"
/>
</div>
@@ -199,7 +198,6 @@ export default {
:deploy-board-data="child.deployBoardData"
:is-loading="child.isLoadingDeployBoard"
:is-empty="child.isEmptyDeployBoard"
- :logs-path="child.logs_path"
@changeCanaryWeight="changeCanaryWeight(child, $event)"
/>
</div>
diff --git a/app/assets/javascripts/environments/stores/environments_store.js b/app/assets/javascripts/environments/stores/environments_store.js
index a67e44b3348..4d70e29a684 100644
--- a/app/assets/javascripts/environments/stores/environments_store.js
+++ b/app/assets/javascripts/environments/stores/environments_store.js
@@ -15,8 +15,6 @@ export default class EnvironmentsStore {
this.state.availableCounter = 0;
this.state.paginationInformation = {};
this.state.reviewAppDetails = {};
-
- return this;
}
/**
diff --git a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
index d29d5aa0671..a07428dafea 100644
--- a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
+++ b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
@@ -150,6 +150,12 @@ export default {
paginationRequired() {
return !isEmpty(this.pagination);
},
+ previousPage() {
+ return this.pagination.previous ? this.$options.PREV_PAGE : null;
+ },
+ nextPage() {
+ return this.pagination.next ? this.$options.NEXT_PAGE : null;
+ },
errorTrackingHelpUrl() {
return helpPagePath('operations/error_tracking');
},
@@ -430,8 +436,8 @@ export default {
<gl-pagination
v-show="!loading"
v-if="paginationRequired"
- :prev-page="$options.PREV_PAGE"
- :next-page="$options.NEXT_PAGE"
+ :prev-page="previousPage"
+ :next-page="nextPage"
:value="pageValue"
align="center"
@input="goToPage"
diff --git a/app/assets/javascripts/feature_flags/components/strategies/default.vue b/app/assets/javascripts/feature_flags/components/strategies/default.vue
index cb8ffbddfbd..04190d7bfda 100644
--- a/app/assets/javascripts/feature_flags/components/strategies/default.vue
+++ b/app/assets/javascripts/feature_flags/components/strategies/default.vue
@@ -4,7 +4,7 @@ export default {
this.$emit('change', { parameters: {} });
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
diff --git a/app/assets/javascripts/gitlab_pages/components/pages_pipeline_wizard.vue b/app/assets/javascripts/gitlab_pages/components/pages_pipeline_wizard.vue
new file mode 100644
index 00000000000..f17a05999b0
--- /dev/null
+++ b/app/assets/javascripts/gitlab_pages/components/pages_pipeline_wizard.vue
@@ -0,0 +1,84 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import { captureException } from '@sentry/browser';
+import PipelineWizard from '~/pipeline_wizard/pipeline_wizard.vue';
+import PagesWizardTemplate from '~/pipeline_wizard/templates/pages.yml';
+import { logError } from '~/lib/logger';
+import { s__ } from '~/locale';
+import { redirectTo } from '~/lib/utils/url_utility';
+import pagesMarkOnboardingComplete from '../queries/mark_onboarding_complete.graphql';
+
+export const i18n = {
+ loadingMessage: s__('GitLabPages|Updating your Pages configuration...'),
+};
+
+export default {
+ name: 'PagesPipelineWizard',
+ i18n,
+ PagesWizardTemplate,
+ components: {
+ PipelineWizard,
+ GlLoadingIcon,
+ },
+ props: {
+ projectPath: {
+ type: String,
+ required: true,
+ },
+ defaultBranch: {
+ type: String,
+ required: true,
+ },
+ redirectToWhenDone: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ loading: false,
+ };
+ },
+ methods: {
+ async updateOnboardingState() {
+ try {
+ await this.$apollo.mutate({
+ mutation: pagesMarkOnboardingComplete,
+ variables: {
+ input: { projectPath: this.projectPath },
+ },
+ });
+ } catch (e) {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ logError('Updating the pages onboarding state failed', e);
+ captureException(e);
+ }
+ },
+ async onDone() {
+ this.loading = true;
+ await this.updateOnboardingState();
+ redirectTo(this.redirectToWhenDone);
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div
+ v-if="loading"
+ class="gl-p-3 gl-rounded-base gl-text-center"
+ data-testid="onboarding-mutation-loading"
+ >
+ <gl-loading-icon />
+ {{ $options.i18n.loadingMessage }}
+ </div>
+ <pipeline-wizard
+ v-else
+ :template="$options.PagesWizardTemplate"
+ :project-path="projectPath"
+ :default-branch="defaultBranch"
+ @done="onDone"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/gitlab_pages/queries/mark_onboarding_complete.graphql b/app/assets/javascripts/gitlab_pages/queries/mark_onboarding_complete.graphql
new file mode 100644
index 00000000000..abedd54b079
--- /dev/null
+++ b/app/assets/javascripts/gitlab_pages/queries/mark_onboarding_complete.graphql
@@ -0,0 +1,6 @@
+mutation pagesMarkOnboardingComplete($input: PagesMarkOnboardingCompleteInput!) {
+ pagesMarkOnboardingComplete(input: $input) {
+ onboardingComplete
+ errors
+ }
+}
diff --git a/app/assets/javascripts/google_cloud/components/app.vue b/app/assets/javascripts/google_cloud/components/app.vue
deleted file mode 100644
index b3d773e6bee..00000000000
--- a/app/assets/javascripts/google_cloud/components/app.vue
+++ /dev/null
@@ -1,63 +0,0 @@
-<script>
-import { __ } from '~/locale';
-
-import Home from './home.vue';
-import IncubationBanner from './incubation_banner.vue';
-import ServiceAccountsForm from './service_accounts_form.vue';
-import GcpRegionsForm from './gcp_regions_form.vue';
-import NoGcpProjects from './errors/no_gcp_projects.vue';
-import GcpError from './errors/gcp_error.vue';
-
-const SCREEN_GCP_ERROR = 'gcp_error';
-const SCREEN_HOME = 'home';
-const SCREEN_NO_GCP_PROJECTS = 'no_gcp_projects';
-const SCREEN_SERVICE_ACCOUNTS_FORM = 'service_accounts_form';
-const SCREEN_GCP_REGIONS_FORM = 'gcp_regions_form';
-
-export default {
- components: {
- IncubationBanner,
- },
- inheritAttrs: false,
- props: {
- screen: {
- required: true,
- type: String,
- },
- },
- computed: {
- mainComponent() {
- switch (this.screen) {
- case SCREEN_HOME:
- return Home;
- case SCREEN_GCP_ERROR:
- return GcpError;
- case SCREEN_NO_GCP_PROJECTS:
- return NoGcpProjects;
- case SCREEN_SERVICE_ACCOUNTS_FORM:
- return ServiceAccountsForm;
- case SCREEN_GCP_REGIONS_FORM:
- return GcpRegionsForm;
- default:
- throw new Error(__('Unknown screen'));
- }
- },
- },
- methods: {
- feedbackUrl(template) {
- return `https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new?issuable_template=${template}`;
- },
- },
-};
-</script>
-
-<template>
- <div>
- <incubation-banner
- :share-feedback-url="feedbackUrl('general_feedback')"
- :report-bug-url="feedbackUrl('report_bug')"
- :feature-request-url="feedbackUrl('feature_request')"
- />
- <component :is="mainComponent" v-bind="$attrs" />
- </div>
-</template>
diff --git a/app/assets/javascripts/google_cloud/components/errors/gcp_error.vue b/app/assets/javascripts/google_cloud/components/errors/gcp_error.vue
deleted file mode 100644
index 90aa0e1ae68..00000000000
--- a/app/assets/javascripts/google_cloud/components/errors/gcp_error.vue
+++ /dev/null
@@ -1,29 +0,0 @@
-<script>
-import { GlAlert } from '@gitlab/ui';
-import { __ } from '~/locale';
-
-export default {
- components: { GlAlert },
- props: {
- error: {
- type: String,
- required: true,
- },
- },
- i18n: {
- title: __('Google Cloud project misconfigured'),
- description: __(
- 'GitLab and Google Cloud configuration seems to be incomplete. This probably can be fixed by your GitLab administration team. You may share these logs with them:',
- ),
- },
-};
-</script>
-
-<template>
- <gl-alert :dismissible="false" variant="warning" :title="$options.i18n.title">
- {{ $options.i18n.description }}
- <blockquote>
- <code>{{ error }}</code>
- </blockquote>
- </gl-alert>
-</template>
diff --git a/app/assets/javascripts/google_cloud/components/errors/no_gcp_projects.vue b/app/assets/javascripts/google_cloud/components/errors/no_gcp_projects.vue
deleted file mode 100644
index da229ac3f0e..00000000000
--- a/app/assets/javascripts/google_cloud/components/errors/no_gcp_projects.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-<script>
-import { GlAlert, GlButton } from '@gitlab/ui';
-import { __ } from '~/locale';
-
-export default {
- components: { GlAlert, GlButton },
- i18n: {
- title: __('Google Cloud project required'),
- description: __(
- 'You do not have any Google Cloud projects. Please create a Google Cloud project and then reload this page.',
- ),
- createLabel: __('Create Google Cloud project'),
- },
-};
-</script>
-
-<template>
- <gl-alert :dismissible="false" variant="warning" :title="$options.i18n.title">
- {{ $options.i18n.description }}
- <template #actions>
- <gl-button href="https://console.cloud.google.com/projectcreate" target="_blank">
- {{ $options.i18n.createLabel }}
- </gl-button>
- </template>
- </gl-alert>
-</template>
diff --git a/app/assets/javascripts/google_cloud/components/google_cloud_menu.vue b/app/assets/javascripts/google_cloud/components/google_cloud_menu.vue
new file mode 100644
index 00000000000..d6b7c702b54
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/components/google_cloud_menu.vue
@@ -0,0 +1,85 @@
+<script>
+import { s__ } from '~/locale';
+
+const CONFIGURATION_KEY = 'configuration';
+const DEPLOYMENTS_KEY = 'deployments';
+const DATABASES_KEY = 'databases';
+
+const i18n = {
+ configuration: { title: s__('CloudSeed|Configuration') },
+ deployments: { title: s__('CloudSeed|Deployments') },
+ databases: { title: s__('CloudSeed|Databases') },
+};
+
+export default {
+ props: {
+ active: {
+ type: String,
+ required: true,
+ },
+ configurationUrl: {
+ type: String,
+ required: true,
+ },
+ deploymentsUrl: {
+ type: String,
+ required: true,
+ },
+ databasesUrl: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ isConfigurationActive() {
+ return this.active === CONFIGURATION_KEY;
+ },
+ isDeploymentsActive() {
+ return this.active === DEPLOYMENTS_KEY;
+ },
+ isDatabasesActive() {
+ return this.active === DATABASES_KEY;
+ },
+ },
+ i18n,
+};
+</script>
+<template>
+ <div class="tabs gl-tabs">
+ <ul role="tablist" class="nav gl-tabs-nav">
+ <li role="presentation" class="nav-item">
+ <a
+ data-testid="configurationLink"
+ role="tab"
+ :href="configurationUrl"
+ class="nav-link gl-tab-nav-item"
+ :class="{ 'gl-tab-nav-item-active': isConfigurationActive }"
+ >
+ {{ $options.i18n.configuration.title }}</a
+ >
+ </li>
+ <li role="presentation" class="nav-item">
+ <a
+ data-testid="deploymentsLink"
+ role="tab"
+ :href="deploymentsUrl"
+ class="nav-link gl-tab-nav-item"
+ :class="{ 'gl-tab-nav-item-active': isDeploymentsActive }"
+ >
+ {{ $options.i18n.deployments.title }}
+ </a>
+ </li>
+ <li role="presentation" class="nav-item">
+ <a
+ data-testid="databasesLink"
+ role="tab"
+ :href="databasesUrl"
+ class="nav-link gl-tab-nav-item"
+ :class="{ 'gl-tab-nav-item-active': isDatabasesActive }"
+ >
+ {{ $options.i18n.databases.title }}
+ </a>
+ </li>
+ </ul>
+ </div>
+</template>
diff --git a/app/assets/javascripts/google_cloud/components/home.vue b/app/assets/javascripts/google_cloud/components/home.vue
deleted file mode 100644
index e41337e2679..00000000000
--- a/app/assets/javascripts/google_cloud/components/home.vue
+++ /dev/null
@@ -1,81 +0,0 @@
-<script>
-import { GlTabs, GlTab } from '@gitlab/ui';
-import DeploymentsServiceTable from './deployments_service_table.vue';
-import RevokeOauth from './revoke_oauth.vue';
-import ServiceAccountsList from './service_accounts_list.vue';
-import GcpRegionsList from './gcp_regions_list.vue';
-
-export default {
- components: {
- GlTabs,
- GlTab,
- DeploymentsServiceTable,
- RevokeOauth,
- ServiceAccountsList,
- GcpRegionsList,
- },
- props: {
- serviceAccounts: {
- type: Array,
- required: true,
- },
- createServiceAccountUrl: {
- type: String,
- required: true,
- },
- configureGcpRegionsUrl: {
- type: String,
- required: true,
- },
- emptyIllustrationUrl: {
- type: String,
- required: true,
- },
- enableCloudRunUrl: {
- type: String,
- required: true,
- },
- enableCloudStorageUrl: {
- type: String,
- required: true,
- },
- gcpRegions: {
- type: Array,
- required: true,
- },
- revokeOauthUrl: {
- type: String,
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <gl-tabs>
- <gl-tab :title="__('Configuration')">
- <service-accounts-list
- class="gl-mx-4"
- :list="serviceAccounts"
- :create-url="createServiceAccountUrl"
- :empty-illustration-url="emptyIllustrationUrl"
- />
- <hr />
- <gcp-regions-list
- class="gl-mx-4"
- :empty-illustration-url="emptyIllustrationUrl"
- :create-url="configureGcpRegionsUrl"
- :list="gcpRegions"
- />
- <hr v-if="revokeOauthUrl" />
- <revoke-oauth v-if="revokeOauthUrl" :url="revokeOauthUrl" />
- </gl-tab>
- <gl-tab :title="__('Deployments')">
- <deployments-service-table
- :cloud-run-url="enableCloudRunUrl"
- :cloud-storage-url="enableCloudStorageUrl"
- />
- </gl-tab>
- <gl-tab :title="__('Services')" disabled />
- </gl-tabs>
-</template>
diff --git a/app/assets/javascripts/google_cloud/components/incubation_banner.vue b/app/assets/javascripts/google_cloud/components/incubation_banner.vue
index 652b8c1aecb..128b3dcb1d9 100644
--- a/app/assets/javascripts/google_cloud/components/incubation_banner.vue
+++ b/app/assets/javascripts/google_cloud/components/incubation_banner.vue
@@ -1,22 +1,20 @@
<script>
import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
+const FEATURE_REQUEST_KEY = 'feature_request';
+const REPORT_BUG_KEY = 'report_bug';
+const GENERAL_FEEDBACK_KEY = 'general_feedback';
+
export default {
components: { GlAlert, GlLink, GlSprintf },
- props: {
- shareFeedbackUrl: {
- required: true,
- type: String,
- },
- reportBugUrl: {
- required: true,
- type: String,
- },
- featureRequestUrl: {
- required: true,
- type: String,
+ methods: {
+ feedbackUrl(template) {
+ return `https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new?issuable_template=${template}`;
},
},
+ FEATURE_REQUEST_KEY,
+ REPORT_BUG_KEY,
+ GENERAL_FEEDBACK_KEY,
};
</script>
@@ -31,13 +29,13 @@ export default {
"
>
<template #featureLink="{ content }">
- <gl-link :href="featureRequestUrl">{{ content }}</gl-link>
+ <gl-link :href="feedbackUrl($options.FEATURE_REQUEST_KEY)">{{ content }}</gl-link>
</template>
<template #bugLink="{ content }">
- <gl-link :href="reportBugUrl">{{ content }}</gl-link>
+ <gl-link :href="feedbackUrl($options.REPORT_BUG_KEY)">{{ content }}</gl-link>
</template>
<template #feedbackLink="{ content }">
- <gl-link :href="shareFeedbackUrl">{{ content }}</gl-link>
+ <gl-link :href="feedbackUrl($options.GENERAL_FEEDBACK_KEY)">{{ content }}</gl-link>
</template>
</gl-sprintf>
</gl-alert>
diff --git a/app/assets/javascripts/google_cloud/configuration/index.js b/app/assets/javascripts/google_cloud/configuration/index.js
new file mode 100644
index 00000000000..580315588d0
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/configuration/index.js
@@ -0,0 +1,11 @@
+import Vue from 'vue';
+import Panel from './panel.vue';
+
+export default (containerId = '#js-google-cloud-configuration') => {
+ const element = document.querySelector(containerId);
+ const { ...attrs } = JSON.parse(element.getAttribute('data'));
+ return new Vue({
+ el: element,
+ render: (createElement) => createElement(Panel, { attrs }),
+ });
+};
diff --git a/app/assets/javascripts/google_cloud/configuration/panel.vue b/app/assets/javascripts/google_cloud/configuration/panel.vue
new file mode 100644
index 00000000000..ee046eb1988
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/configuration/panel.vue
@@ -0,0 +1,88 @@
+<script>
+import GcpRegionsList from '../gcp_regions/list.vue';
+import GoogleCloudMenu from '../components/google_cloud_menu.vue';
+import IncubationBanner from '../components/incubation_banner.vue';
+import RevokeOauth from '../components/revoke_oauth.vue';
+import ServiceAccountsList from '../service_accounts/list.vue';
+
+export default {
+ components: {
+ GcpRegionsList,
+ GoogleCloudMenu,
+ IncubationBanner,
+ RevokeOauth,
+ ServiceAccountsList,
+ },
+ props: {
+ configurationUrl: {
+ type: String,
+ required: true,
+ },
+ deploymentsUrl: {
+ type: String,
+ required: true,
+ },
+ databasesUrl: {
+ type: String,
+ required: true,
+ },
+ serviceAccounts: {
+ type: Array,
+ required: true,
+ },
+ createServiceAccountUrl: {
+ type: String,
+ required: true,
+ },
+ emptyIllustrationUrl: {
+ type: String,
+ required: true,
+ },
+ configureGcpRegionsUrl: {
+ type: String,
+ required: true,
+ },
+ gcpRegions: {
+ type: Array,
+ required: true,
+ },
+ revokeOauthUrl: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <incubation-banner />
+
+ <google-cloud-menu
+ active="configuration"
+ :configuration-url="configurationUrl"
+ :deployments-url="deploymentsUrl"
+ :databases-url="databasesUrl"
+ />
+
+ <service-accounts-list
+ class="gl-mx-4"
+ :list="serviceAccounts"
+ :create-url="createServiceAccountUrl"
+ :empty-illustration-url="emptyIllustrationUrl"
+ />
+
+ <hr />
+
+ <gcp-regions-list
+ class="gl-mx-4"
+ :empty-illustration-url="emptyIllustrationUrl"
+ :create-url="configureGcpRegionsUrl"
+ :list="gcpRegions"
+ />
+
+ <hr v-if="revokeOauthUrl" />
+
+ <revoke-oauth v-if="revokeOauthUrl" :url="revokeOauthUrl" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/google_cloud/databases/cloudsql/create_instance_form.vue b/app/assets/javascripts/google_cloud/databases/cloudsql/create_instance_form.vue
new file mode 100644
index 00000000000..0ac561b6132
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/databases/cloudsql/create_instance_form.vue
@@ -0,0 +1,132 @@
+<script>
+import { GlButton, GlFormCheckbox, GlFormGroup, GlFormSelect } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+const i18n = {
+ gcpProjectLabel: s__('CloudSeed|Google Cloud project'),
+ gcpProjectDescription: s__(
+ 'CloudSeed|Database instance is generated within the selected Google Cloud project',
+ ),
+ refsLabel: s__('CloudSeed|Refs'),
+ refsDescription: s__(
+ 'CloudSeed|Generated database instance is linked to the selected branch or tag',
+ ),
+ databaseVersionLabel: s__('CloudSeed|Database version'),
+ tierLabel: s__('CloudSeed|Machine type'),
+ tierDescription: s__('CloudSeed|Determines memory and virtual cores available to your instance'),
+ checkboxLabel: s__(
+ 'CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances',
+ ),
+ cancelLabel: s__('CloudSeed|Cancel'),
+ submitLabel: s__('CloudSeed|Create instance'),
+ all: s__('CloudSeed|All'),
+};
+
+export default {
+ ALL_REFS: '*',
+ components: {
+ GlButton,
+ GlFormCheckbox,
+ GlFormGroup,
+ GlFormSelect,
+ },
+ props: {
+ cancelPath: { required: true, type: String },
+ gcpProjects: { required: true, type: Array },
+ refs: { required: true, type: Array },
+ formTitle: { required: true, type: String },
+ formDescription: { required: true, type: String },
+ databaseVersions: { required: true, type: Array },
+ tiers: { required: true, type: Array },
+ },
+ i18n,
+};
+</script>
+<template>
+ <div>
+ <header class="gl-my-5 gl-border-b-1 gl-border-b-gray-100 gl-border-b-solid">
+ <h2 class="gl-font-size-h1">{{ formTitle }}</h2>
+ <p>{{ formDescription }}</p>
+ </header>
+
+ <gl-form-group
+ data-testid="form_group_gcp_project"
+ label-for="gcp_project"
+ :label="$options.i18n.gcpProjectLabel"
+ :description="$options.i18n.gcpProjectDescription"
+ >
+ <gl-form-select id="gcp_project" data-testid="select_gcp_project" name="gcp_project" required>
+ <option
+ v-for="gcpProject in gcpProjects"
+ :key="gcpProject.project_id"
+ :value="gcpProject.project_id"
+ >
+ {{ gcpProject.name }}
+ </option>
+ </gl-form-select>
+ </gl-form-group>
+
+ <gl-form-group
+ data-testid="form_group_environments"
+ label-for="ref"
+ :label="$options.i18n.refsLabel"
+ :description="$options.i18n.refsDescription"
+ >
+ <gl-form-select id="ref" data-testid="select_environments" name="ref" required>
+ <option :value="$options.ALL_REFS">{{ $options.i18n.all }}</option>
+ <option v-for="ref in refs" :key="ref" :value="ref">
+ {{ ref }}
+ </option>
+ </gl-form-select>
+ </gl-form-group>
+
+ <gl-form-group
+ data-testid="form_group_tier"
+ label-for="tier"
+ :label="$options.i18n.tierLabel"
+ :description="$options.i18n.tierDescription"
+ >
+ <gl-form-select id="tier" data-testid="select_tier" name="tier" required>
+ <option v-for="tier in tiers" :key="tier.value" :value="tier.value">
+ {{ tier.label }}
+ </option>
+ </gl-form-select>
+ </gl-form-group>
+
+ <gl-form-group
+ data-testid="form_group_database_version"
+ label-for="database-version"
+ :label="$options.i18n.databaseVersionLabel"
+ >
+ <gl-form-select
+ id="database-version"
+ data-testid="select_database_version"
+ name="database_version"
+ required
+ >
+ <option
+ v-for="databaseVersion in databaseVersions"
+ :key="databaseVersion.value"
+ :value="databaseVersion.value"
+ >
+ {{ databaseVersion.label }}
+ </option>
+ </gl-form-select>
+ </gl-form-group>
+
+ <gl-form-group>
+ <gl-form-checkbox name="confirmation" required>
+ {{ $options.i18n.checkboxLabel }}
+ </gl-form-checkbox>
+ </gl-form-group>
+
+ <div class="form-actions row">
+ <gl-button type="submit" category="primary" variant="confirm" data-testid="submit-button">
+ {{ $options.i18n.submitLabel }}
+ </gl-button>
+ <gl-button class="gl-ml-1" :href="cancelPath" data-testid="cancel-button">{{
+ $options.i18n.cancelLabel
+ }}</gl-button>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/google_cloud/databases/cloudsql/instance_table.vue b/app/assets/javascripts/google_cloud/databases/cloudsql/instance_table.vue
new file mode 100644
index 00000000000..823895214df
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/databases/cloudsql/instance_table.vue
@@ -0,0 +1,75 @@
+<script>
+import { GlEmptyState, GlLink, GlTable } from '@gitlab/ui';
+import { encodeSaferUrl, setUrlParams } from '~/lib/utils/url_utility';
+import { s__ } from '~/locale';
+
+const i18n = {
+ noInstancesTitle: s__('CloudSeed|No instances'),
+ noInstancesDescription: s__('CloudSeed|There are no instances to display.'),
+ title: s__('CloudSeed|Instances'),
+ description: s__('CloudSeed|Database instances associated with this project'),
+};
+
+export default {
+ components: { GlEmptyState, GlLink, GlTable },
+ props: {
+ cloudsqlInstances: {
+ type: Array,
+ required: true,
+ },
+ emptyIllustrationUrl: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ tableData() {
+ return this.cloudsqlInstances.filter((instance) => instance.instance_name);
+ },
+ },
+ methods: {
+ gcpProjectUrl(id) {
+ return setUrlParams({ project: id }, 'https://console.cloud.google.com/sql/instances');
+ },
+ instanceUrl(name, id) {
+ const saferName = encodeSaferUrl(name);
+
+ return setUrlParams(
+ { project: id },
+ `https://console.cloud.google.com/sql/instances/${saferName}/overview`,
+ );
+ },
+ },
+ fields: [
+ { key: 'ref', label: s__('CloudSeed|Environment') },
+ { key: 'gcp_project', label: s__('CloudSeed|Google Cloud Project') },
+ { key: 'instance_name', label: s__('CloudSeed|CloudSQL Instance') },
+ { key: 'version', label: s__('CloudSeed|Version') },
+ ],
+ i18n,
+};
+</script>
+
+<template>
+ <div class="gl-mx-3">
+ <gl-empty-state
+ v-if="tableData.length === 0"
+ :title="$options.i18n.noInstancesTitle"
+ :description="$options.i18n.noInstancesDescription"
+ :svg-path="emptyIllustrationUrl"
+ />
+
+ <div v-else>
+ <h2 class="gl-font-size-h2">{{ $options.i18n.title }}</h2>
+ <p>{{ $options.i18n.description }}</p>
+ <gl-table :fields="$options.fields" :items="tableData">
+ <template #cell(gcp_project)="{ value }">
+ <gl-link :href="gcpProjectUrl(value)">{{ value }}</gl-link>
+ </template>
+ <template #cell(instance_name)="{ item: { instance_name, gcp_project } }">
+ <a :href="instanceUrl(instance_name, gcp_project)">{{ instance_name }}</a>
+ </template>
+ </gl-table>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/google_cloud/databases/index.js b/app/assets/javascripts/google_cloud/databases/index.js
new file mode 100644
index 00000000000..e240a1116e8
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/databases/index.js
@@ -0,0 +1,11 @@
+import Vue from 'vue';
+import Panel from './panel.vue';
+
+export default (containerId = '#js-google-cloud-databases') => {
+ const element = document.querySelector(containerId);
+ const { ...attrs } = JSON.parse(element.getAttribute('data'));
+ return new Vue({
+ el: element,
+ render: (createElement) => createElement(Panel, { attrs }),
+ });
+};
diff --git a/app/assets/javascripts/google_cloud/databases/panel.vue b/app/assets/javascripts/google_cloud/databases/panel.vue
new file mode 100644
index 00000000000..e2f18c286a5
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/databases/panel.vue
@@ -0,0 +1,38 @@
+<script>
+import GoogleCloudMenu from '../components/google_cloud_menu.vue';
+import IncubationBanner from '../components/incubation_banner.vue';
+
+export default {
+ components: {
+ IncubationBanner,
+ GoogleCloudMenu,
+ },
+ props: {
+ configurationUrl: {
+ type: String,
+ required: true,
+ },
+ deploymentsUrl: {
+ type: String,
+ required: true,
+ },
+ databasesUrl: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <incubation-banner />
+
+ <google-cloud-menu
+ active="databases"
+ :configuration-url="configurationUrl"
+ :deployments-url="deploymentsUrl"
+ :databases-url="databasesUrl"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/google_cloud/databases/service_table.vue b/app/assets/javascripts/google_cloud/databases/service_table.vue
new file mode 100644
index 00000000000..80bd6ef28fb
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/databases/service_table.vue
@@ -0,0 +1,221 @@
+<script>
+import { GlAlert, GlButton, GlLink, GlSprintf, GlTable } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { s__ } from '~/locale';
+
+const KEY_CLOUDSQL_POSTGRES = 'cloudsql-postgres';
+const KEY_CLOUDSQL_MYSQL = 'cloudsql-mysql';
+const KEY_CLOUDSQL_SQLSERVER = 'cloudsql-sqlserver';
+const KEY_ALLOYDB_POSTGRES = 'alloydb-postgres';
+const KEY_MEMORYSTORE_REDIS = 'memorystore-redis';
+const KEY_FIRESTORE = 'firestore';
+
+const i18n = {
+ columnService: s__('CloudSeed|Service'),
+ columnDescription: s__('CloudSeed|Description'),
+ cloudsqlPostgresTitle: s__('CloudSeed|Cloud SQL for Postgres'),
+ cloudsqlPostgresDescription: s__(
+ 'CloudSeed|Fully managed relational database service for PostgreSQL',
+ ),
+ cloudsqlMysqlTitle: s__('CloudSeed|Cloud SQL for MySQL'),
+ cloudsqlMysqlDescription: s__('CloudSeed|Fully managed relational database service for MySQL'),
+ cloudsqlSqlserverTitle: s__('CloudSeed|Cloud SQL for SQL Server'),
+ cloudsqlSqlserverDescription: s__(
+ 'CloudSeed|Fully managed relational database service for SQL Server',
+ ),
+ alloydbPostgresTitle: s__('CloudSeed|AlloyDB for Postgres'),
+ alloydbPostgresDescription: s__(
+ 'CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads',
+ ),
+ memorystoreRedisTitle: s__('CloudSeed|Memorystore for Redis'),
+ memorystoreRedisDescription: s__(
+ 'CloudSeed|Scalable, secure, and highly available in-memory service for Redis',
+ ),
+ firestoreTitle: s__('CloudSeed|Cloud Firestore'),
+ firestoreDescription: s__(
+ 'CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development',
+ ),
+ createInstance: s__('CloudSeed|Create instance'),
+ createCluster: s__('CloudSeed|Create cluster'),
+ createDatabase: s__('CloudSeed|Create database'),
+ title: s__('CloudSeed|Services'),
+ description: s__('CloudSeed|Available database services through which instances may be created'),
+ pricingAlert: s__(
+ 'CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}.',
+ ),
+ secretManagersDescription: s__(
+ 'CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}',
+ ),
+};
+
+const helpUrlSecrets = helpPagePath('ee/ci/secrets');
+
+export default {
+ components: { GlAlert, GlButton, GlLink, GlSprintf, GlTable },
+ props: {
+ cloudsqlPostgresUrl: {
+ type: String,
+ required: true,
+ },
+ cloudsqlMysqlUrl: {
+ type: String,
+ required: true,
+ },
+ cloudsqlSqlserverUrl: {
+ type: String,
+ required: true,
+ },
+ alloydbPostgresUrl: {
+ type: String,
+ required: true,
+ },
+ memorystoreRedisUrl: {
+ type: String,
+ required: true,
+ },
+ firestoreUrl: {
+ type: String,
+ required: true,
+ },
+ },
+ methods: {
+ actionUrl(key) {
+ switch (key) {
+ case KEY_CLOUDSQL_POSTGRES:
+ return this.cloudsqlPostgresUrl;
+ case KEY_CLOUDSQL_MYSQL:
+ return this.cloudsqlMysqlUrl;
+ case KEY_CLOUDSQL_SQLSERVER:
+ return this.cloudsqlSqlserverUrl;
+ case KEY_ALLOYDB_POSTGRES:
+ return this.alloydbPostgresUrl;
+ case KEY_MEMORYSTORE_REDIS:
+ return this.memorystoreRedisUrl;
+ case KEY_FIRESTORE:
+ return this.firestoreUrl;
+ default:
+ return '#';
+ }
+ },
+ },
+ fields: [
+ { key: 'title', label: i18n.columnService },
+ { key: 'description', label: i18n.columnDescription },
+ { key: 'action', label: '' },
+ ],
+ items: [
+ {
+ title: i18n.cloudsqlPostgresTitle,
+ description: i18n.cloudsqlPostgresDescription,
+ action: {
+ key: KEY_CLOUDSQL_POSTGRES,
+ title: i18n.createInstance,
+ testId: 'button-cloudsql-postgres',
+ },
+ },
+ {
+ title: i18n.cloudsqlMysqlTitle,
+ description: i18n.cloudsqlMysqlDescription,
+ action: {
+ disabled: false,
+ key: KEY_CLOUDSQL_MYSQL,
+ title: i18n.createInstance,
+ testId: 'button-cloudsql-mysql',
+ },
+ },
+ {
+ title: i18n.cloudsqlSqlserverTitle,
+ description: i18n.cloudsqlSqlserverDescription,
+ action: {
+ disabled: false,
+ key: KEY_CLOUDSQL_SQLSERVER,
+ title: i18n.createInstance,
+ testId: 'button-cloudsql-sqlserver',
+ },
+ },
+ {
+ title: i18n.alloydbPostgresTitle,
+ description: i18n.alloydbPostgresDescription,
+ action: {
+ disabled: true,
+ key: KEY_ALLOYDB_POSTGRES,
+ title: i18n.createCluster,
+ testId: 'button-alloydb-postgres',
+ },
+ },
+ {
+ title: i18n.memorystoreRedisTitle,
+ description: i18n.memorystoreRedisDescription,
+ action: {
+ disabled: true,
+ key: KEY_MEMORYSTORE_REDIS,
+ title: i18n.createInstance,
+ testId: 'button-memorystore-redis',
+ },
+ },
+ {
+ title: i18n.firestoreTitle,
+ description: i18n.firestoreDescription,
+ action: {
+ disabled: true,
+ key: KEY_FIRESTORE,
+ title: i18n.createDatabase,
+ testId: 'button-firestore',
+ },
+ },
+ ],
+ helpUrlSecrets,
+ i18n,
+};
+</script>
+
+<template>
+ <div class="gl-mx-3">
+ <h2 class="gl-font-size-h2">{{ $options.i18n.title }}</h2>
+ <p>{{ $options.i18n.description }}</p>
+
+ <gl-table :fields="$options.fields" :items="$options.items">
+ <template #cell(action)="{ value }">
+ <gl-button
+ block
+ :disabled="value.disabled"
+ :href="actionUrl(value.key)"
+ :data-testid="value.testId"
+ category="secondary"
+ variant="confirm"
+ >
+ {{ value.title }}
+ </gl-button>
+ </template>
+ </gl-table>
+
+ <gl-alert class="gl-mt-5" :dismissible="false" variant="tip">
+ <gl-sprintf :message="$options.i18n.pricingAlert">
+ <template #cloudsqlPricing="{ content }">
+ <gl-link href="https://cloud.google.com/sql/pricing">{{ content }}</gl-link>
+ </template>
+ <template #alloydbPricing="{ content }">
+ <gl-link href="https://cloud.google.com/alloydb/pricing">{{ content }}</gl-link>
+ </template>
+ <template #memorystorePricing="{ content }">
+ <gl-link href="https://cloud.google.com/memorystore/docs/redis/pricing">{{
+ content
+ }}</gl-link>
+ </template>
+ <template #firestorePricing="{ content }">
+ <gl-link href="https://cloud.google.com/firestore/pricing">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+
+ <gl-alert class="gl-mt-5" :dismissible="false" variant="tip">
+ <gl-sprintf :message="$options.i18n.secretManagersDescription">
+ <template #docLink="{ content }">
+ <gl-link :href="$options.helpUrlSecrets">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+ </div>
+</template>
diff --git a/app/assets/javascripts/google_cloud/deployments/index.js b/app/assets/javascripts/google_cloud/deployments/index.js
new file mode 100644
index 00000000000..fcbb2209c40
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/deployments/index.js
@@ -0,0 +1,11 @@
+import Vue from 'vue';
+import Panel from './panel.vue';
+
+export default (containerId = '#js-google-cloud-deployments') => {
+ const element = document.querySelector(containerId);
+ const { ...attrs } = JSON.parse(element.getAttribute('data'));
+ return new Vue({
+ el: element,
+ render: (createElement) => createElement(Panel, { attrs }),
+ });
+};
diff --git a/app/assets/javascripts/google_cloud/deployments/panel.vue b/app/assets/javascripts/google_cloud/deployments/panel.vue
new file mode 100644
index 00000000000..89db132ad5e
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/deployments/panel.vue
@@ -0,0 +1,50 @@
+<script>
+import GoogleCloudMenu from '../components/google_cloud_menu.vue';
+import IncubationBanner from '../components/incubation_banner.vue';
+import ServiceTable from './service_table.vue';
+
+export default {
+ components: {
+ ServiceTable,
+ IncubationBanner,
+ GoogleCloudMenu,
+ },
+ props: {
+ configurationUrl: {
+ type: String,
+ required: true,
+ },
+ deploymentsUrl: {
+ type: String,
+ required: true,
+ },
+ databasesUrl: {
+ type: String,
+ required: true,
+ },
+ enableCloudRunUrl: {
+ type: String,
+ required: true,
+ },
+ enableCloudStorageUrl: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <incubation-banner />
+
+ <google-cloud-menu
+ active="deployments"
+ :configuration-url="configurationUrl"
+ :deployments-url="deploymentsUrl"
+ :databases-url="databasesUrl"
+ />
+
+ <service-table :cloud-run-url="enableCloudRunUrl" :cloud-storage-url="enableCloudStorageUrl" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/google_cloud/components/deployments_service_table.vue b/app/assets/javascripts/google_cloud/deployments/service_table.vue
index 26c9fd14dc6..26c9fd14dc6 100644
--- a/app/assets/javascripts/google_cloud/components/deployments_service_table.vue
+++ b/app/assets/javascripts/google_cloud/deployments/service_table.vue
diff --git a/app/assets/javascripts/google_cloud/components/gcp_regions_form.vue b/app/assets/javascripts/google_cloud/gcp_regions/form.vue
index 23011e5a5b0..23011e5a5b0 100644
--- a/app/assets/javascripts/google_cloud/components/gcp_regions_form.vue
+++ b/app/assets/javascripts/google_cloud/gcp_regions/form.vue
diff --git a/app/assets/javascripts/google_cloud/gcp_regions/index.js b/app/assets/javascripts/google_cloud/gcp_regions/index.js
new file mode 100644
index 00000000000..da37c612805
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/gcp_regions/index.js
@@ -0,0 +1,11 @@
+import Vue from 'vue';
+import Form from './form.vue';
+
+export default (containerId = '#js-google-cloud-gcp-regions') => {
+ const element = document.querySelector(containerId);
+ const { ...attrs } = JSON.parse(element.getAttribute('data'));
+ return new Vue({
+ el: element,
+ render: (createElement) => createElement(Form, { attrs }),
+ });
+};
diff --git a/app/assets/javascripts/google_cloud/components/gcp_regions_list.vue b/app/assets/javascripts/google_cloud/gcp_regions/list.vue
index 5d403d5cd65..5d403d5cd65 100644
--- a/app/assets/javascripts/google_cloud/components/gcp_regions_list.vue
+++ b/app/assets/javascripts/google_cloud/gcp_regions/list.vue
diff --git a/app/assets/javascripts/google_cloud/index.js b/app/assets/javascripts/google_cloud/index.js
deleted file mode 100644
index ab9e8227812..00000000000
--- a/app/assets/javascripts/google_cloud/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import Vue from 'vue';
-import App from './components/app.vue';
-
-export default () => {
- const root = '#js-google-cloud';
- const element = document.querySelector(root);
- const { screen, ...attrs } = JSON.parse(element.getAttribute('data'));
- return new Vue({
- el: element,
- render: (createElement) => createElement(App, { props: { screen }, attrs }),
- });
-};
diff --git a/app/assets/javascripts/google_cloud/components/service_accounts_form.vue b/app/assets/javascripts/google_cloud/service_accounts/form.vue
index faec94e735b..faec94e735b 100644
--- a/app/assets/javascripts/google_cloud/components/service_accounts_form.vue
+++ b/app/assets/javascripts/google_cloud/service_accounts/form.vue
diff --git a/app/assets/javascripts/google_cloud/service_accounts/index.js b/app/assets/javascripts/google_cloud/service_accounts/index.js
new file mode 100644
index 00000000000..5207b44deac
--- /dev/null
+++ b/app/assets/javascripts/google_cloud/service_accounts/index.js
@@ -0,0 +1,11 @@
+import Vue from 'vue';
+import Form from './form.vue';
+
+export default (containerId = '#js-google-cloud-service-accounts') => {
+ const element = document.querySelector(containerId);
+ const { ...attrs } = JSON.parse(element.getAttribute('data'));
+ return new Vue({
+ el: element,
+ render: (createElement) => createElement(Form, { attrs }),
+ });
+};
diff --git a/app/assets/javascripts/google_cloud/components/service_accounts_list.vue b/app/assets/javascripts/google_cloud/service_accounts/list.vue
index 4b580c594f5..4b580c594f5 100644
--- a/app/assets/javascripts/google_cloud/components/service_accounts_list.vue
+++ b/app/assets/javascripts/google_cloud/service_accounts/list.vue
diff --git a/app/assets/javascripts/google_tag_manager/index.js b/app/assets/javascripts/google_tag_manager/index.js
index 2969121bf06..c8204f397ff 100644
--- a/app/assets/javascripts/google_tag_manager/index.js
+++ b/app/assets/javascripts/google_tag_manager/index.js
@@ -176,6 +176,14 @@ export const trackSaasTrialGetStarted = () => {
});
};
+export const trackTrialAcceptTerms = () => {
+ if (!isSupported()) {
+ return;
+ }
+
+ pushEvent('saasTrialAcceptTerms');
+};
+
export const trackCheckout = (selectedPlan, quantity) => {
if (!isSupported()) {
return;
diff --git a/app/assets/javascripts/graphql_shared/possible_types.json b/app/assets/javascripts/graphql_shared/possible_types.json
index 50b40526ee0..45c5cca68cc 100644
--- a/app/assets/javascripts/graphql_shared/possible_types.json
+++ b/app/assets/javascripts/graphql_shared/possible_types.json
@@ -131,7 +131,9 @@
"VulnerabilityLocationSecretDetection"
],
"WorkItemWidget": [
+ "WorkItemWidgetAssignees",
"WorkItemWidgetDescription",
- "WorkItemWidgetHierarchy"
+ "WorkItemWidgetHierarchy",
+ "WorkItemWidgetWeight"
]
}
diff --git a/app/assets/javascripts/graphql_shared/queries/current_user.query.graphql b/app/assets/javascripts/graphql_shared/queries/current_user.query.graphql
new file mode 100644
index 00000000000..93335c93c1d
--- /dev/null
+++ b/app/assets/javascripts/graphql_shared/queries/current_user.query.graphql
@@ -0,0 +1,7 @@
+#import "../fragments/user.fragment.graphql"
+
+query currentUser {
+ currentUser {
+ ...User
+ }
+}
diff --git a/app/assets/javascripts/graphql_shared/queries/get_users_by_usernames.query.graphql b/app/assets/javascripts/graphql_shared/queries/get_users_by_usernames.query.graphql
new file mode 100644
index 00000000000..07398867544
--- /dev/null
+++ b/app/assets/javascripts/graphql_shared/queries/get_users_by_usernames.query.graphql
@@ -0,0 +1,9 @@
+#import "../fragments/user.fragment.graphql"
+
+query getUsersByUsernames($usernames: [String!]) {
+ users(usernames: $usernames) {
+ nodes {
+ ...User
+ }
+ }
+}
diff --git a/app/assets/javascripts/graphql_shared/queries/users_search_all.query.graphql b/app/assets/javascripts/graphql_shared/queries/users_search_all.query.graphql
new file mode 100644
index 00000000000..9c75df84e78
--- /dev/null
+++ b/app/assets/javascripts/graphql_shared/queries/users_search_all.query.graphql
@@ -0,0 +1,9 @@
+#import "../fragments/user.fragment.graphql"
+
+query searchAllUsers($search: String!, $first: Int = null) {
+ users(search: $search, first: $first) {
+ nodes {
+ ...User
+ }
+ }
+}
diff --git a/app/assets/javascripts/groups/components/group_item.vue b/app/assets/javascripts/groups/components/group_item.vue
index 2241d57f96f..7345afb8545 100644
--- a/app/assets/javascripts/groups/components/group_item.vue
+++ b/app/assets/javascripts/groups/components/group_item.vue
@@ -4,13 +4,24 @@ import {
GlLoadingIcon,
GlBadge,
GlIcon,
+ GlLabel,
+ GlButton,
+ GlPopover,
+ GlLink,
GlTooltipDirective,
GlSafeHtmlDirective,
} from '@gitlab/ui';
import { visitUrl } from '~/lib/utils/url_utility';
import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
-import { VISIBILITY_TYPE_ICON, GROUP_VISIBILITY_TYPE } from '../constants';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { __ } from '~/locale';
+import {
+ VISIBILITY_TYPE_ICON,
+ GROUP_VISIBILITY_TYPE,
+ ITEM_TYPE,
+ VISIBILITY_PRIVATE,
+} from '../constants';
import eventHub from '../event_hub';
import itemActions from './item_actions.vue';
@@ -28,16 +39,17 @@ export default {
GlBadge,
GlLoadingIcon,
GlIcon,
+ GlLabel,
+ GlButton,
+ GlPopover,
+ GlLink,
UserAccessRoleBadge,
- ComplianceFrameworkLabel: () =>
- import(
- 'ee_component/vue_shared/components/compliance_framework_label/compliance_framework_label.vue'
- ),
itemCaret,
itemTypeIcon,
itemActions,
itemStats,
},
+ inject: ['currentGroupVisibility'],
props: {
parentGroup: {
type: Object,
@@ -58,6 +70,9 @@ export default {
groupDomId() {
return `group-${this.group.id}`;
},
+ itemTestId() {
+ return `group-overview-item-${this.group.id}`;
+ },
rowClass() {
return {
'is-open': this.group.isOpen,
@@ -76,10 +91,10 @@ export default {
return Boolean(this.group.complianceFramework?.name);
},
isGroup() {
- return this.group.type === 'group';
+ return this.group.type === ITEM_TYPE.GROUP;
},
isGroupPendingRemoval() {
- return this.group.type === 'group' && this.group.pendingRemoval;
+ return this.group.type === ITEM_TYPE.GROUP && this.group.pendingRemoval;
},
visibilityIcon() {
return VISIBILITY_TYPE_ICON[this.group.visibility];
@@ -96,6 +111,13 @@ export default {
showActionsMenu() {
return this.isGroup && (this.group.canEdit || this.group.canRemove || this.group.canLeave);
},
+ shouldShowVisibilityWarning() {
+ return (
+ this.action === 'shared' &&
+ this.currentGroupVisibility === VISIBILITY_PRIVATE &&
+ this.group.visibility !== VISIBILITY_PRIVATE
+ );
+ },
},
methods: {
onClickRowGroup(e) {
@@ -112,6 +134,17 @@ export default {
}
},
},
+ i18n: {
+ popoverTitle: __('Less restrictive visibility'),
+ popoverBody: __('Project visibility level is less restrictive than the group settings.'),
+ learnMore: __('Learn more'),
+ },
+ shareProjectsWithGroupsHelpPagePath: helpPagePath(
+ 'user/project/members/share_project_with_groups',
+ {
+ anchor: 'share-a-public-project-with-private-group',
+ },
+ ),
safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
AVATAR_SHAPE_OPTION_RECT,
};
@@ -120,6 +153,7 @@ export default {
<template>
<li
:id="groupDomId"
+ :data-testid="itemTestId"
:class="rowClass"
class="group-row"
:itemprop="microdata.itemprop"
@@ -165,7 +199,7 @@ export default {
data-testid="group-name"
:href="group.relativePath"
:title="group.fullName"
- class="no-expand gl-mr-3 gl-mt-3 gl-text-gray-900!"
+ class="no-expand gl-mr-3 gl-text-gray-900!"
:itemprop="microdata.nameItemprop"
>
{{
@@ -176,20 +210,44 @@ export default {
</a>
<gl-icon
v-gl-tooltip.hover.bottom
- class="gl-display-inline-flex gl-align-items-center gl-mr-3 gl-mt-3 gl-text-gray-500"
+ class="gl-display-inline-flex gl-align-items-center gl-mr-3 gl-text-gray-500"
:name="visibilityIcon"
:title="visibilityTooltip"
data-testid="group-visibility-icon"
/>
- <user-access-role-badge v-if="group.permission" class="gl-mt-3">
+ <template v-if="shouldShowVisibilityWarning">
+ <gl-button
+ ref="visibilityWarningButton"
+ class="gl-p-1! gl-bg-transparent! gl-mr-3"
+ category="tertiary"
+ icon="warning"
+ :aria-label="$options.i18n.popoverTitle"
+ @click.stop
+ />
+ <gl-popover
+ :target="() => $refs.visibilityWarningButton.$el"
+ :title="$options.i18n.popoverTitle"
+ triggers="hover focus"
+ >
+ {{ $options.i18n.popoverBody }}
+ <div class="gl-mt-3">
+ <gl-link
+ class="gl-font-sm"
+ :href="$options.shareProjectsWithGroupsHelpPagePath"
+ >{{ $options.i18n.learnMore }}</gl-link
+ >
+ </div>
+ </gl-popover>
+ </template>
+ <user-access-role-badge v-if="group.permission" class="gl-mr-3">
{{ group.permission }}
</user-access-role-badge>
- <compliance-framework-label
+ <gl-label
v-if="hasComplianceFramework"
- class="gl-mt-3"
- :name="complianceFramework.name"
- :color="complianceFramework.color"
+ :title="complianceFramework.name"
+ :background-color="complianceFramework.color"
:description="complianceFramework.description"
+ size="sm"
/>
</div>
<div v-if="group.description" class="description">
diff --git a/app/assets/javascripts/groups/components/group_name_and_path.vue b/app/assets/javascripts/groups/components/group_name_and_path.vue
index f9bd8701199..983535d3e9c 100644
--- a/app/assets/javascripts/groups/components/group_name_and_path.vue
+++ b/app/assets/javascripts/groups/components/group_name_and_path.vue
@@ -133,6 +133,8 @@ export default {
signal: this.activeApiRequestAbortController.signal,
});
+ this.apiLoading = false;
+
if (exists) {
if (suggests.length) {
return Promise.resolve({ exists, suggests });
@@ -148,14 +150,14 @@ export default {
return Promise.resolve({ exists, suggests });
} catch (error) {
if (!axios.isCancel(error)) {
+ this.apiLoading = false;
+
createAlert({
message: this.$options.i18n.apiErrorMessage,
});
}
return Promise.reject();
- } finally {
- this.apiLoading = false;
}
},
handlePathInput(value) {
diff --git a/app/assets/javascripts/groups/constants.js b/app/assets/javascripts/groups/constants.js
index cacba2dfd23..29981d09155 100644
--- a/app/assets/javascripts/groups/constants.js
+++ b/app/assets/javascripts/groups/constants.js
@@ -28,28 +28,32 @@ export const ITEM_TYPE = {
GROUP: 'group',
};
+export const VISIBILITY_PUBLIC = 'public';
+export const VISIBILITY_INTERNAL = 'internal';
+export const VISIBILITY_PRIVATE = 'private';
+
export const GROUP_VISIBILITY_TYPE = {
- public: __(
+ [VISIBILITY_PUBLIC]: __(
'Public - The group and any public projects can be viewed without any authentication.',
),
- internal: __(
+ [VISIBILITY_INTERNAL]: __(
'Internal - The group and any internal projects can be viewed by any logged in user except external users.',
),
- private: __('Private - The group and its projects can only be viewed by members.'),
+ [VISIBILITY_PRIVATE]: __('Private - The group and its projects can only be viewed by members.'),
};
export const PROJECT_VISIBILITY_TYPE = {
- public: __('Public - The project can be accessed without any authentication.'),
- internal: __(
+ [VISIBILITY_PUBLIC]: __('Public - The project can be accessed without any authentication.'),
+ [VISIBILITY_INTERNAL]: __(
'Internal - The project can be accessed by any logged in user except external users.',
),
- private: __(
+ [VISIBILITY_PRIVATE]: __(
'Private - Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group.',
),
};
export const VISIBILITY_TYPE_ICON = {
- public: 'earth',
- internal: 'shield',
- private: 'lock',
+ [VISIBILITY_PUBLIC]: 'earth',
+ [VISIBILITY_INTERNAL]: 'shield',
+ [VISIBILITY_PRIVATE]: 'lock',
};
diff --git a/app/assets/javascripts/groups/index.js b/app/assets/javascripts/groups/index.js
index dfcee80aec7..a502fcd31ad 100644
--- a/app/assets/javascripts/groups/index.js
+++ b/app/assets/javascripts/groups/index.js
@@ -55,6 +55,7 @@ export default (containerId = 'js-groups-tree', endpoint, action = '') => {
renderEmptyState,
canCreateSubgroups,
canCreateProjects,
+ currentGroupVisibility,
},
} = this.$options.el;
@@ -67,6 +68,7 @@ export default (containerId = 'js-groups-tree', endpoint, action = '') => {
renderEmptyState: parseBoolean(renderEmptyState),
canCreateSubgroups: parseBoolean(canCreateSubgroups),
canCreateProjects: parseBoolean(canCreateProjects),
+ currentGroupVisibility,
};
},
data() {
diff --git a/app/assets/javascripts/header.js b/app/assets/javascripts/header.js
index 360a8d3bf8d..9b6113c7444 100644
--- a/app/assets/javascripts/header.js
+++ b/app/assets/javascripts/header.js
@@ -1,4 +1,3 @@
-import $ from 'jquery';
import Vue from 'vue';
import { highCountTrim } from '~/lib/utils/text_utility';
import Tracking from '~/tracking';
@@ -12,12 +11,18 @@ import Translate from '~/vue_shared/translate';
* @param {String} count
*/
export default function initTodoToggle() {
- $(document).on('todo:toggle', (e, count) => {
- const updatedCount = count || e?.detail?.count || 0;
- const $todoPendingCount = $('.js-todos-count');
+ document.addEventListener('todo:toggle', (e) => {
+ const updatedCount = e.detail.count || 0;
+ const todoPendingCount = document.querySelector('.js-todos-count');
- $todoPendingCount.text(highCountTrim(updatedCount));
- $todoPendingCount.toggleClass('hidden', updatedCount === 0);
+ if (todoPendingCount) {
+ todoPendingCount.textContent = highCountTrim(updatedCount);
+ if (updatedCount === 0) {
+ todoPendingCount.classList.add('hidden');
+ } else {
+ todoPendingCount.classList.remove('hidden');
+ }
+ }
});
}
@@ -85,7 +90,7 @@ function initStatusTriggers() {
function trackShowUserDropdownLink(trackEvent, elToTrack, el) {
const { trackLabel, trackProperty } = elToTrack.dataset;
- $(el).on('shown.bs.dropdown', () => {
+ el.addEventListener('shown.bs.dropdown', () => {
Tracking.event(document.body.dataset.page, trackEvent, {
label: trackLabel,
property: trackProperty,
diff --git a/app/assets/javascripts/header_search/components/app.vue b/app/assets/javascripts/header_search/components/app.vue
index adf304aebc7..0c4f9640972 100644
--- a/app/assets/javascripts/header_search/components/app.vue
+++ b/app/assets/javascripts/header_search/components/app.vue
@@ -1,8 +1,17 @@
<script>
-import { GlSearchBoxByType, GlOutsideDirective as Outside } from '@gitlab/ui';
+import {
+ GlSearchBoxByType,
+ GlOutsideDirective as Outside,
+ GlIcon,
+ GlToken,
+ GlSafeHtmlDirective as SafeHtml,
+ GlTooltipDirective,
+ GlResizeObserverDirective,
+} from '@gitlab/ui';
import { mapState, mapActions, mapGetters } from 'vuex';
import { debounce } from 'lodash';
import { visitUrl } from '~/lib/utils/url_utility';
+import { truncate } from '~/lib/utils/text_utility';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { s__, sprintf } from '~/locale';
import DropdownKeyboardNavigation from '~/vue_shared/components/dropdown_keyboard_navigation.vue';
@@ -12,6 +21,8 @@ import {
SEARCH_INPUT_DESCRIPTION,
SEARCH_RESULTS_DESCRIPTION,
SEARCH_SHORTCUTS_MIN_CHARACTERS,
+ SCOPE_TOKEN_MAX_LENGTH,
+ INPUT_FIELD_PADDING,
} from '../constants';
import HeaderSearchAutocompleteItems from './header_search_autocomplete_items.vue';
import HeaderSearchDefaultItems from './header_search_default_items.vue';
@@ -34,14 +45,22 @@ export default {
'GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit.',
),
searchResultsLoading: s__('GlobalSearch|Search results are loading'),
+ searchResultsScope: s__('GlobalSearch|in %{scope}'),
+ kbdHelp: sprintf(
+ s__('GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search'),
+ { kbdOpen: '<kbd>', kbdClose: '</kbd>' },
+ false,
+ ),
},
- directives: { Outside },
+ directives: { SafeHtml, Outside, GlTooltip: GlTooltipDirective, GlResizeObserverDirective },
components: {
GlSearchBoxByType,
HeaderSearchDefaultItems,
HeaderSearchScopedItems,
HeaderSearchAutocompleteItems,
DropdownKeyboardNavigation,
+ GlIcon,
+ GlToken,
},
data() {
return {
@@ -50,8 +69,8 @@ export default {
};
},
computed: {
- ...mapState(['search', 'loading']),
- ...mapGetters(['searchQuery', 'searchOptions', 'autocompleteGroupedSearchOptions']),
+ ...mapState(['search', 'loading', 'searchContext']),
+ ...mapGetters(['searchQuery', 'searchOptions']),
searchText: {
get() {
return this.search;
@@ -70,16 +89,17 @@ export default {
return Boolean(gon?.current_username);
},
showSearchDropdown() {
- const hasResultsUnderMinCharacters =
- this.searchText?.length === 1 ? this?.autocompleteGroupedSearchOptions?.length > 0 : true;
+ if (!this.showDropdown || !this.isLoggedIn) {
+ return false;
+ }
- return this.showDropdown && this.isLoggedIn && hasResultsUnderMinCharacters;
+ return this.searchOptions?.length > 0;
},
showDefaultItems() {
return !this.searchText;
},
- showShortcuts() {
- return this.searchText && this.searchText?.length >= SEARCH_SHORTCUTS_MIN_CHARACTERS;
+ showScopes() {
+ return this.searchText?.length > SEARCH_SHORTCUTS_MIN_CHARACTERS;
},
defaultIndex() {
if (this.showDefaultItems) {
@@ -88,11 +108,11 @@ export default {
return FIRST_DROPDOWN_INDEX;
},
+
searchInputDescribeBy() {
if (this.isLoggedIn) {
return this.$options.i18n.searchInputDescribeByWithDropdown;
}
-
return this.$options.i18n.searchInputDescribeByNoDropdown;
},
dropdownResultsDescription() {
@@ -112,8 +132,26 @@ export default {
count: this.searchOptions.length,
});
},
- headerSearchActivityDescriptor() {
- return this.showDropdown ? 'is-active' : 'is-not-active';
+ searchBarStateIndicator() {
+ const hasIcon =
+ this.searchContext?.project || this.searchContext?.group ? 'has-icon' : 'has-no-icon';
+ const isSearching = this.showScopes ? 'is-searching' : 'is-not-searching';
+ const isActive = this.showSearchDropdown ? 'is-active' : 'is-not-active';
+ return `${isActive} ${isSearching} ${hasIcon}`;
+ },
+ searchBarItem() {
+ return this.searchOptions?.[0];
+ },
+ infieldHelpContent() {
+ return this.searchBarItem?.scope || this.searchBarItem?.description;
+ },
+ infieldHelpIcon() {
+ return this.searchBarItem?.icon;
+ },
+ scopeTokenTitle() {
+ return sprintf(this.$options.i18n.searchResultsScope, {
+ scope: this.infieldHelpContent,
+ });
},
},
methods: {
@@ -127,6 +165,9 @@ export default {
this.$emit('toggleDropdown', this.showDropdown);
},
submitSearch() {
+ if (this.search?.length <= SEARCH_SHORTCUTS_MIN_CHARACTERS && this.currentFocusIndex < 0) {
+ return null;
+ }
return visitUrl(this.currentFocusedOption?.url || this.searchQuery);
},
getAutocompleteOptions: debounce(function debouncedSearch(searchTerm) {
@@ -136,8 +177,19 @@ export default {
this.fetchAutocompleteOptions();
}
}, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
+ getTruncatedScope(scope) {
+ return truncate(scope, SCOPE_TOKEN_MAX_LENGTH);
+ },
+ observeTokenWidth({ contentRect: { width } }) {
+ const inputField = this.$refs?.searchInputBox?.$el?.querySelector('input');
+ if (!inputField) {
+ return;
+ }
+ inputField.style.paddingRight = `${width + INPUT_FIELD_PADDING}px`;
+ },
},
SEARCH_BOX_INDEX,
+ FIRST_DROPDOWN_INDEX,
SEARCH_INPUT_DESCRIPTION,
SEARCH_RESULTS_DESCRIPTION,
};
@@ -149,10 +201,12 @@ export default {
role="search"
:aria-label="$options.i18n.searchGitlab"
class="header-search gl-relative gl-rounded-base gl-w-full"
- :class="headerSearchActivityDescriptor"
+ :class="searchBarStateIndicator"
+ data-testid="header-search-form"
>
<gl-search-box-by-type
id="search"
+ ref="searchInputBox"
v-model="searchText"
role="searchbox"
class="gl-z-index-1"
@@ -165,7 +219,34 @@ export default {
@click="openDropdown"
@input="getAutocompleteOptions"
@keydown.enter.stop.prevent="submitSearch"
+ @keydown.esc.stop.prevent="closeDropdown"
/>
+ <gl-token
+ v-if="showScopes"
+ v-gl-resize-observer-directive="observeTokenWidth"
+ class="in-search-scope-help"
+ :view-only="true"
+ :title="scopeTokenTitle"
+ ><gl-icon
+ v-if="infieldHelpIcon"
+ class="gl-mr-2"
+ :aria-label="infieldHelpContent"
+ :name="infieldHelpIcon"
+ :size="16"
+ />{{
+ getTruncatedScope(
+ sprintf($options.i18n.searchResultsScope, {
+ scope: infieldHelpContent,
+ }),
+ )
+ }}
+ </gl-token>
+ <kbd
+ v-gl-tooltip.bottom.hover.html
+ class="gl-absolute gl-right-3 gl-top-0 gl-z-index-1 keyboard-shortcut-helper"
+ :title="$options.i18n.kbdHelp"
+ >/</kbd
+ >
<span :id="$options.SEARCH_INPUT_DESCRIPTION" role="region" class="gl-sr-only">{{
searchInputDescribeBy
}}</span>
@@ -187,7 +268,7 @@ export default {
<dropdown-keyboard-navigation
v-model="currentFocusIndex"
:max="searchOptions.length - 1"
- :min="$options.SEARCH_BOX_INDEX"
+ :min="$options.FIRST_DROPDOWN_INDEX"
:default-index="defaultIndex"
@tab="closeDropdown"
/>
@@ -197,7 +278,7 @@ export default {
/>
<template v-else>
<header-search-scoped-items
- v-if="showShortcuts"
+ v-if="showScopes"
:current-focused-option="currentFocusedOption"
/>
<header-search-autocomplete-items :current-focused-option="currentFocusedOption" />
diff --git a/app/assets/javascripts/header_search/components/header_search_scoped_items.vue b/app/assets/javascripts/header_search/components/header_search_scoped_items.vue
index 34d1bd71399..f5be1bcb786 100644
--- a/app/assets/javascripts/header_search/components/header_search_scoped_items.vue
+++ b/app/assets/javascripts/header_search/components/header_search_scoped_items.vue
@@ -1,13 +1,16 @@
<script>
-import { GlDropdownItem, GlDropdownDivider } from '@gitlab/ui';
+import { GlDropdownItem, GlIcon, GlToken } from '@gitlab/ui';
import { mapState, mapGetters } from 'vuex';
-import { __, sprintf } from '~/locale';
+import { s__, sprintf } from '~/locale';
+import { truncate } from '~/lib/utils/text_utility';
+import { SCOPE_TOKEN_MAX_LENGTH } from '../constants';
export default {
name: 'HeaderSearchScopedItems',
components: {
GlDropdownItem,
- GlDropdownDivider,
+ GlIcon,
+ GlToken,
},
props: {
currentFocusedOption: {
@@ -25,12 +28,21 @@ export default {
return this.currentFocusedOption?.html_id === option.html_id;
},
ariaLabel(option) {
- return sprintf(__('%{search} %{description} %{scope}'), {
+ return sprintf(s__('GlobalSearch| %{search} %{description} %{scope}'), {
search: this.search,
- description: option.description,
+ description: option.description || option.icon,
scope: option.scope || '',
});
},
+ titleLabel(option) {
+ return sprintf(s__('GlobalSearch|in %{scope}'), {
+ search: this.search,
+ scope: option.scope || option.description,
+ });
+ },
+ getTruncatedScope(scope) {
+ return truncate(scope, SCOPE_TOKEN_MAX_LENGTH);
+ },
},
};
</script>
@@ -42,18 +54,30 @@ export default {
:id="option.html_id"
:ref="option.html_id"
:key="option.html_id"
+ class="gl-max-w-full"
:class="{ 'gl-bg-gray-50': isOptionFocused(option) }"
:aria-selected="isOptionFocused(option)"
:aria-label="ariaLabel(option)"
tabindex="-1"
:href="option.url"
+ :title="titleLabel(option)"
>
- <span aria-hidden="true">
- "<span class="gl-font-weight-bold">{{ search }}</span
- >" {{ option.description }}
- <span v-if="option.scope" class="gl-font-style-italic">{{ option.scope }}</span>
+ <span
+ ref="token-text-content"
+ class="gl-display-flex gl-justify-content-start search-text-content gl-line-height-24 gl-align-items-start gl-flex-direction-row gl-w-full"
+ >
+ <gl-icon name="search" class="gl-flex-shrink-0 gl-mr-2 gl-relative gl-pt-2" />
+ <span class="gl-flex-grow-1 gl-relative">
+ <gl-token
+ class="in-dropdown-scope-help has-icon gl-flex-shrink-0 gl-relative gl-white-space-nowrap gl-float-right gl-mr-n3!"
+ :view-only="true"
+ >
+ <gl-icon v-if="option.icon" :name="option.icon" class="gl-mr-2" />
+ <span>{{ getTruncatedScope(titleLabel(option)) }}</span>
+ </gl-token>
+ {{ search }}
+ </span>
</span>
</gl-dropdown-item>
- <gl-dropdown-divider v-if="autocompleteGroupedSearchOptions.length > 0" />
</div>
</template>
diff --git a/app/assets/javascripts/header_search/constants.js b/app/assets/javascripts/header_search/constants.js
index 045a552efb0..a026386b2bd 100644
--- a/app/assets/javascripts/header_search/constants.js
+++ b/app/assets/javascripts/header_search/constants.js
@@ -10,15 +10,21 @@ export const MSG_MR_IM_REVIEWER = s__("GlobalSearch|Merge requests that I'm a re
export const MSG_MR_IVE_CREATED = s__("GlobalSearch|Merge requests I've created");
-export const MSG_IN_ALL_GITLAB = s__('GlobalSearch|in all GitLab');
+export const MSG_IN_ALL_GITLAB = s__('GlobalSearch|all GitLab');
-export const MSG_IN_GROUP = s__('GlobalSearch|in group');
+export const MSG_IN_GROUP = s__('GlobalSearch|group');
-export const MSG_IN_PROJECT = s__('GlobalSearch|in project');
+export const MSG_IN_PROJECT = s__('GlobalSearch|project');
-export const GROUPS_CATEGORY = 'Groups';
+export const ICON_PROJECT = 'project';
-export const PROJECTS_CATEGORY = 'Projects';
+export const ICON_GROUP = 'group';
+
+export const ICON_SUBGROUP = 'subgroup';
+
+export const GROUPS_CATEGORY = s__('GlobalSearch|Groups');
+
+export const PROJECTS_CATEGORY = s__('GlobalSearch|Projects');
export const ISSUES_CATEGORY = 'Recent issues';
@@ -39,3 +45,9 @@ export const SEARCH_SHORTCUTS_MIN_CHARACTERS = 2;
export const SEARCH_INPUT_DESCRIPTION = 'search-input-description';
export const SEARCH_RESULTS_DESCRIPTION = 'search-results-description';
+
+export const SCOPE_TOKEN_MAX_LENGTH = 36;
+
+export const INPUT_FIELD_PADDING = 52;
+
+export const HEADER_INIT_EVENTS = ['input', 'focus'];
diff --git a/app/assets/javascripts/header_search/init.js b/app/assets/javascripts/header_search/init.js
new file mode 100644
index 00000000000..4e9404007ec
--- /dev/null
+++ b/app/assets/javascripts/header_search/init.js
@@ -0,0 +1,53 @@
+import * as Sentry from '@sentry/browser';
+import { HEADER_INIT_EVENTS } from './constants';
+
+async function eventHandler(callback = () => {}) {
+ if (this.newHeaderSearchFeatureFlag) {
+ const { initHeaderSearchApp } = await import(
+ /* webpackChunkName: 'globalSearch' */ '~/header_search'
+ ).catch((error) => Sentry.captureException(error));
+
+ // In case the user started searching before we bootstrapped,
+ // let's pass the search along.
+ const initialSearchValue = this.searchInputBox.value;
+ initHeaderSearchApp(initialSearchValue);
+
+ // this is new #search input element. We need to re-find it.
+ // And re-focus in it.
+ document.querySelector('#search').focus();
+ callback();
+ return;
+ }
+
+ const { default: initSearchAutocomplete } = await import(
+ /* webpackChunkName: 'globalSearch' */ '../search_autocomplete'
+ ).catch((error) => Sentry.captureException(error));
+
+ const searchDropdown = initSearchAutocomplete();
+ searchDropdown.onSearchInputFocus();
+ callback();
+}
+
+function cleanEventListeners() {
+ HEADER_INIT_EVENTS.forEach((eventType) => {
+ document.querySelector('#search').removeEventListener(eventType, eventHandler);
+ });
+}
+
+function initHeaderSearch() {
+ const searchInputBox = document.querySelector('#search');
+
+ HEADER_INIT_EVENTS.forEach((eventType) => {
+ searchInputBox?.addEventListener(
+ eventType,
+ eventHandler.bind(
+ { searchInputBox, newHeaderSearchFeatureFlag: gon?.features?.newHeaderSearch },
+ cleanEventListeners,
+ ),
+ { once: true },
+ );
+ });
+}
+
+export default initHeaderSearch;
+export { eventHandler, cleanEventListeners };
diff --git a/app/assets/javascripts/header_search/store/getters.js b/app/assets/javascripts/header_search/store/getters.js
index 7d08aa859fb..da7bccd35c0 100644
--- a/app/assets/javascripts/header_search/store/getters.js
+++ b/app/assets/javascripts/header_search/store/getters.js
@@ -7,9 +7,13 @@ import {
MSG_MR_ASSIGNED_TO_ME,
MSG_MR_IM_REVIEWER,
MSG_MR_IVE_CREATED,
- MSG_IN_PROJECT,
- MSG_IN_GROUP,
+ ICON_GROUP,
+ ICON_SUBGROUP,
+ ICON_PROJECT,
MSG_IN_ALL_GITLAB,
+ PROJECTS_CATEGORY,
+ GROUPS_CATEGORY,
+ SEARCH_SHORTCUTS_MIN_CHARACTERS,
} from '../constants';
export const searchQuery = (state) => {
@@ -149,7 +153,8 @@ export const scopedSearchOptions = (state, getters) => {
options.push({
html_id: 'scoped-in-project',
scope: state.searchContext.project?.name || '',
- description: MSG_IN_PROJECT,
+ scopeCategory: PROJECTS_CATEGORY,
+ icon: ICON_PROJECT,
url: getters.projectUrl,
});
}
@@ -158,7 +163,8 @@ export const scopedSearchOptions = (state, getters) => {
options.push({
html_id: 'scoped-in-group',
scope: state.searchContext.group?.name || '',
- description: MSG_IN_GROUP,
+ scopeCategory: GROUPS_CATEGORY,
+ icon: state.searchContext.group?.full_name?.includes('/') ? ICON_SUBGROUP : ICON_GROUP,
url: getters.groupUrl,
});
}
@@ -190,6 +196,7 @@ export const autocompleteGroupedSearchOptions = (state) => {
results.push(groupedOptions[option.category]);
}
});
+
return results;
};
@@ -205,5 +212,9 @@ export const searchOptions = (state, getters) => {
[],
);
+ if (state.search?.length <= SEARCH_SHORTCUTS_MIN_CHARACTERS) {
+ return sortedAutocompleteOptions;
+ }
+
return getters.scopedSearchOptions.concat(sortedAutocompleteOptions);
};
diff --git a/app/assets/javascripts/helpers/help_page_helper.js b/app/assets/javascripts/helpers/help_page_helper.js
index 0e824548646..21d27b5fea9 100644
--- a/app/assets/javascripts/helpers/help_page_helper.js
+++ b/app/assets/javascripts/helpers/help_page_helper.js
@@ -7,9 +7,10 @@ const HELP_PAGE_URL_ROOT = '/help/';
*
* This is designed to mirror the Ruby `help_page_path` helper function, so that
* the two can be used interchangeably.
- * @param {String} path - Path to doc file relative to the doc/ directory in the GitLab repository.
- * Optionally, including `.md` or `.html` prefix
- * @param {String} options.anchor - Name of the anchor to scroll to on the documentation page.
+ * @param {string} path - Path to doc file relative to the doc/ directory in the GitLab repository.
+ * Optionally, including `.md` or `.html` prefix
+ * @param {object} [options]
+ * @param {string} [options.anchor] - Name of the anchor to scroll to on the documentation page.
*/
export const helpPagePath = (path, { anchor = '' } = {}) => {
let helpPath = joinPaths(gon.relative_url_root || '/', HELP_PAGE_URL_ROOT, path);
diff --git a/app/assets/javascripts/ide/components/ide_tree.vue b/app/assets/javascripts/ide/components/ide_tree.vue
index 2df998d7518..6998f8ef0c4 100644
--- a/app/assets/javascripts/ide/components/ide_tree.vue
+++ b/app/assets/javascripts/ide/components/ide_tree.vue
@@ -54,25 +54,25 @@ export default {
<ide-tree-list @tree-ready="$emit('tree-ready')">
<template #header>
{{ __('Edit') }}
- <div class="ide-tree-actions ml-auto d-flex" data-testid="ide-root-actions">
+ <div class="ide-tree-actions gl-ml-auto gl-display-flex" data-testid="ide-root-actions">
<new-entry-button
:label="__('New file')"
:show-label="false"
- class="d-flex border-0 p-0 mr-3"
+ class="gl-display-flex gl-border-0 gl-p-0 gl-mr-5"
icon="doc-new"
data-qa-selector="new_file_button"
@click="createNewFile()"
/>
<upload
:show-label="false"
- class="d-flex mr-3"
- button-css-classes="border-0 p-0"
+ class="gl-display-flex gl-mr-5"
+ button-css-classes="gl-border-0 gl-p-0"
@create="createTempEntry"
/>
<new-entry-button
:label="__('New directory')"
:show-label="false"
- class="d-flex border-0 p-0"
+ class="gl-display-flex gl-border-0 gl-p-0"
icon="folder-new"
data-qa-selector="new_directory_button"
@click="createNewFolder()"
diff --git a/app/assets/javascripts/ide/components/new_dropdown/modal.vue b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
index e3c230f7660..d6207d4a557 100644
--- a/app/assets/javascripts/ide/components/new_dropdown/modal.vue
+++ b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
@@ -68,6 +68,10 @@ export default {
},
methods: {
...mapActions(['createTempEntry', 'renameEntry']),
+ submitAndClose() {
+ this.submitForm();
+ this.close();
+ },
submitForm() {
this.entryName = trimPathComponents(this.entryName);
@@ -161,15 +165,17 @@ export default {
<div class="form-group row">
<label class="label-bold col-form-label col-sm-2"> {{ __('Name') }} </label>
<div class="col-sm-10">
- <input
- ref="fieldName"
- v-model.trim="entryName"
- type="text"
- class="form-control"
- data-testid="file-name-field"
- data-qa-selector="file_name_field"
- :placeholder="placeholder"
- />
+ <form data-testid="file-name-form" @submit.prevent="submitAndClose">
+ <input
+ ref="fieldName"
+ v-model.trim="entryName"
+ type="text"
+ class="form-control"
+ data-testid="file-name-field"
+ data-qa-selector="file_name_field"
+ :placeholder="placeholder"
+ />
+ </form>
<ul v-if="isCreatingNewFile" class="file-templates gl-mt-3 list-inline qa-template-list">
<li v-for="(template, index) in templateTypes" :key="index" class="list-inline-item">
<gl-button
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue
index d71ac766933..a1396995a3b 100644
--- a/app/assets/javascripts/ide/components/repo_editor.vue
+++ b/app/assets/javascripts/ide/components/repo_editor.vue
@@ -1,4 +1,5 @@
<script>
+import { GlTabs, GlTab } from '@gitlab/ui';
import { debounce } from 'lodash';
import { mapState, mapGetters, mapActions } from 'vuex';
import {
@@ -45,6 +46,8 @@ const MARKDOWN_FILE_TYPE = 'markdown';
export default {
name: 'RepoEditor',
components: {
+ GlTabs,
+ GlTab,
FileAlert,
ContentViewer,
DiffViewer,
@@ -121,16 +124,6 @@ export default {
isPreviewViewMode() {
return this.fileEditor.viewMode === FILE_VIEW_MODE_PREVIEW;
},
- editTabCSS() {
- return {
- active: this.isEditorViewMode,
- };
- },
- previewTabCSS() {
- return {
- active: this.isPreviewViewMode,
- };
- },
showEditor() {
return !this.shouldHideEditor && this.isEditorViewMode;
},
@@ -487,28 +480,18 @@ export default {
<template>
<div id="ide" class="blob-viewer-container blob-editor-container">
- <div v-if="showTabs" class="ide-mode-tabs clearfix">
- <ul class="nav-links float-left border-bottom-0">
- <li :class="editTabCSS">
- <a
- href="javascript:void(0);"
- role="button"
- data-testid="edit-tab"
- @click.prevent="updateEditor({ viewMode: $options.FILE_VIEW_MODE_EDITOR })"
- >{{ __('Edit') }}</a
- >
- </li>
- <li :class="previewTabCSS">
- <a
- href="javascript:void(0);"
- role="button"
- data-testid="preview-tab"
- @click.prevent="updateEditor({ viewMode: $options.FILE_VIEW_MODE_PREVIEW })"
- >{{ previewMode.previewTitle }}</a
- >
- </li>
- </ul>
- </div>
+ <gl-tabs v-if="showTabs" content-class="gl-display-none">
+ <gl-tab
+ :title="__('Edit')"
+ data-testid="edit-tab"
+ @click="updateEditor({ viewMode: $options.FILE_VIEW_MODE_EDITOR })"
+ />
+ <gl-tab
+ :title="previewMode.previewTitle"
+ data-testid="preview-tab"
+ @click="updateEditor({ viewMode: $options.FILE_VIEW_MODE_PREVIEW })"
+ />
+ </gl-tabs>
<file-alert v-if="alertKey" :alert-key="alertKey" />
<file-templates-bar v-else-if="showFileTemplatesBar(file.name)" />
<div
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 6b96fa7c45c..98ee858ca91 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
@@ -78,6 +78,11 @@ export default {
type: String,
required: true,
},
+ defaultTargetNamespace: {
+ type: Number,
+ required: false,
+ default: null,
+ },
},
data() {
@@ -433,7 +438,15 @@ export default {
return this.importTargets[group.id];
}
- const defaultTargetNamespace = this.availableNamespaces[0] ?? ROOT_NAMESPACE;
+ // If we've reached this Vue application we have at least one potential import destination
+ const defaultTargetNamespace =
+ // first option: namespace id was explicitly provided
+ this.availableNamespaces.find((ns) => ns.id === this.defaultTargetNamespace) ??
+ // second option: first available namespace
+ this.availableNamespaces[0] ??
+ // last resort: if no namespaces are available - suggest creating new namespace at root
+ ROOT_NAMESPACE;
+
let importTarget;
if (group.lastImportTarget) {
const targetNamespace = [ROOT_NAMESPACE, ...this.availableNamespaces].find(
diff --git a/app/assets/javascripts/import_entities/import_groups/index.js b/app/assets/javascripts/import_entities/import_groups/index.js
index 02af0db7f9a..5d7e7911f5a 100644
--- a/app/assets/javascripts/import_entities/import_groups/index.js
+++ b/app/assets/javascripts/import_entities/import_groups/index.js
@@ -15,9 +15,10 @@ export function mountImportGroupsApp(mountElement) {
availableNamespacesPath,
createBulkImportPath,
jobsPath,
+ historyPath,
+ defaultTargetNamespace,
sourceUrl,
groupPathRegex,
- historyPath,
} = mountElement.dataset;
const apolloProvider = new VueApollo({
defaultClient: createApolloClient({
@@ -40,6 +41,7 @@ export function mountImportGroupsApp(mountElement) {
jobsPath,
groupPathRegex: new RegExp(`^(${groupPathRegex})$`),
historyPath,
+ defaultTargetNamespace: parseInt(defaultTargetNamespace, 10) || null,
},
});
},
diff --git a/app/assets/javascripts/init_confirm_danger.js b/app/assets/javascripts/init_confirm_danger.js
index 98bfa48740c..6c6cadedf00 100644
--- a/app/assets/javascripts/init_confirm_danger.js
+++ b/app/assets/javascripts/init_confirm_danger.js
@@ -12,11 +12,11 @@ export default () => {
phrase,
buttonText,
buttonClass = '',
- buttonTestid = null,
- buttonVariant = null,
+ buttonTestid,
+ buttonVariant,
confirmDangerMessage,
confirmButtonText = null,
- disabled = false,
+ disabled,
additionalInformation,
htmlConfirmationMessage,
} = el.dataset;
diff --git a/app/assets/javascripts/integrations/constants.js b/app/assets/javascripts/integrations/constants.js
index e4f6e931ec0..437bcc39886 100644
--- a/app/assets/javascripts/integrations/constants.js
+++ b/app/assets/javascripts/integrations/constants.js
@@ -18,7 +18,7 @@ export const overrideDropdownDescriptions = {
};
export const I18N_FETCH_TEST_SETTINGS_DEFAULT_ERROR_MESSAGE = s__(
- 'Integrations|Connection failed. Please check your settings.',
+ 'Integrations|Connection failed. Check your integration settings.',
);
export const I18N_DEFAULT_ERROR_MESSAGE = __('Something went wrong on our end.');
export const I18N_SUCCESSFUL_CONNECTION_MESSAGE = s__('Integrations|Connection successful.');
@@ -83,3 +83,11 @@ export const billingPlanNames = {
[billingPlans.PREMIUM]: s__('BillingPlans|Premium'),
[billingPlans.ULTIMATE]: s__('BillingPlans|Ultimate'),
};
+
+const INTEGRATION_TYPE_SLACK = 'slack';
+const INTEGRATION_TYPE_MATTERMOST = 'mattermost';
+
+export const placeholderForType = {
+ [INTEGRATION_TYPE_SLACK]: __('#general, #development'),
+ [INTEGRATION_TYPE_MATTERMOST]: __('my-channel'),
+};
diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue
index 9307d7c2d3d..f1f574c6424 100644
--- a/app/assets/javascripts/integrations/edit/components/integration_form.vue
+++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue
@@ -140,15 +140,24 @@ export default {
this.isTesting = true;
testIntegrationSettings(this.propsSource.testPath, this.getFormData())
- .then(({ data: { error, message = I18N_FETCH_TEST_SETTINGS_DEFAULT_ERROR_MESSAGE } }) => {
- if (error) {
- this.setIsValidated();
- this.$toast.show(message);
- return;
- }
+ .then(
+ ({
+ data: {
+ error,
+ message = I18N_FETCH_TEST_SETTINGS_DEFAULT_ERROR_MESSAGE,
+ service_response: serviceResponse,
+ },
+ }) => {
+ if (error) {
+ const errorMessage = serviceResponse ? [message, serviceResponse].join(' ') : message;
+ this.setIsValidated();
+ this.$toast.show(errorMessage);
+ return;
+ }
- this.$toast.show(I18N_SUCCESSFUL_CONNECTION_MESSAGE);
- })
+ this.$toast.show(I18N_SUCCESSFUL_CONNECTION_MESSAGE);
+ },
+ )
.catch((error) => {
this.$toast.show(I18N_DEFAULT_ERROR_MESSAGE);
Sentry.captureException(error);
@@ -284,6 +293,7 @@ export default {
:key="`${currentKey}-${field.name}`"
v-bind="field"
:is-validated="isValidated"
+ :data-qa-selector="`${field.name}_div`"
/>
</div>
</div>
diff --git a/app/assets/javascripts/integrations/edit/components/sections/configuration.vue b/app/assets/javascripts/integrations/edit/components/sections/configuration.vue
index 9e1ad24ae9f..b8fd8995744 100644
--- a/app/assets/javascripts/integrations/edit/components/sections/configuration.vue
+++ b/app/assets/javascripts/integrations/edit/components/sections/configuration.vue
@@ -33,6 +33,7 @@ export default {
:key="`${currentKey}-${field.name}`"
v-bind="field"
:is-validated="isValidated"
+ :data-qa-selector="`${field.name}_div`"
/>
</div>
</template>
diff --git a/app/assets/javascripts/integrations/edit/components/trigger_fields.vue b/app/assets/javascripts/integrations/edit/components/trigger_fields.vue
index 92042a5c981..67647cadf19 100644
--- a/app/assets/javascripts/integrations/edit/components/trigger_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/trigger_fields.vue
@@ -1,17 +1,7 @@
<script>
import { GlFormGroup, GlFormCheckbox, GlFormInput } from '@gitlab/ui';
import { mapGetters } from 'vuex';
-import { __ } from '~/locale';
-
-const typeWithPlaceholder = {
- SLACK: 'slack',
- MATTERMOST: 'mattermost',
-};
-
-const placeholderForType = {
- [typeWithPlaceholder.SLACK]: __('#general, #development'),
- [typeWithPlaceholder.MATTERMOST]: __('my-channel'),
-};
+import { placeholderForType } from 'jh_else_ce/integrations/constants';
export default {
name: 'TriggerFields',
diff --git a/app/assets/javascripts/invite_members/components/group_select.vue b/app/assets/javascripts/invite_members/components/group_select.vue
index fc14b2eba6a..e7f5211dc25 100644
--- a/app/assets/javascripts/invite_members/components/group_select.vue
+++ b/app/assets/javascripts/invite_members/components/group_select.vue
@@ -136,6 +136,7 @@ export default {
v-for="group in groups"
:key="group.id"
:name="group.name"
+ data-qa-selector="group_select_dropdown_item"
@click="selectGroup(group)"
>
<gl-avatar-labeled
diff --git a/app/assets/javascripts/invite_members/components/import_a_project_modal.vue b/app/assets/javascripts/invite_members/components/import_a_project_modal.vue
deleted file mode 100644
index fb6c376cfe6..00000000000
--- a/app/assets/javascripts/invite_members/components/import_a_project_modal.vue
+++ /dev/null
@@ -1,157 +0,0 @@
-<script>
-import { GlButton, GlFormGroup, GlModal, GlModalDirective, GlSprintf } from '@gitlab/ui';
-import { uniqueId } from 'lodash';
-import { importProjectMembers } from '~/api/projects_api';
-import { s__, __, sprintf } from '~/locale';
-import ProjectSelect from './project_select.vue';
-
-export default {
- components: {
- GlButton,
- GlFormGroup,
- GlModal,
- GlSprintf,
- ProjectSelect,
- },
- directives: {
- GlModal: GlModalDirective,
- },
- props: {
- projectId: {
- type: String,
- required: true,
- },
- projectName: {
- type: String,
- required: true,
- },
- },
- data() {
- return {
- projectToBeImported: {},
- invalidFeedbackMessage: '',
- isLoading: false,
- };
- },
- computed: {
- modalIntro() {
- return sprintf(this.$options.i18n.modalIntro, {
- name: this.projectName,
- });
- },
- importDisabled() {
- return Object.keys(this.projectToBeImported).length === 0;
- },
- validationState() {
- return this.invalidFeedbackMessage === '' ? null : false;
- },
- },
- methods: {
- submitImport() {
- this.isLoading = true;
- return importProjectMembers(this.projectId, this.projectToBeImported.id)
- .then(this.showToastMessage)
- .catch(this.showErrorAlert)
- .finally(() => {
- this.isLoading = false;
- this.projectToBeImported = {};
- });
- },
- closeModal() {
- this.invalidFeedbackMessage = '';
-
- this.$refs.modal.hide();
- },
- showToastMessage() {
- this.$toast.show(this.$options.i18n.successMessage, this.$options.toastOptions);
-
- this.closeModal();
- },
- showErrorAlert() {
- this.invalidFeedbackMessage = this.$options.i18n.defaultError;
- },
- },
- toastOptions() {
- return {
- onComplete: () => {
- this.projectToBeImported = {};
- },
- };
- },
- i18n: {
- buttonText: s__('ImportAProjectModal|Import from a project'),
- projectLabel: __('Project'),
- modalTitle: s__('ImportAProjectModal|Import members from another project'),
- modalIntro: s__(
- "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project.",
- ),
- modalHelpText: s__(
- 'ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from.',
- ),
- modalPrimaryButton: s__('ImportAProjectModal|Import project members'),
- modalCancelButton: __('Cancel'),
- defaultError: s__('ImportAProjectModal|Unable to import project members'),
- successMessage: s__('ImportAProjectModal|Successfully imported'),
- },
- projectSelectLabelId: 'project-select',
- modalId: uniqueId('import-a-project-modal-'),
- formClasses: 'gl-mt-3 gl-sm-w-auto gl-w-full',
- buttonClasses: 'gl-w-full',
-};
-</script>
-
-<template>
- <form :class="$options.formClasses">
- <gl-button v-gl-modal="$options.modalId" :class="$options.buttonClasses" variant="default">{{
- $options.i18n.buttonText
- }}</gl-button>
-
- <gl-modal
- ref="modal"
- :modal-id="$options.modalId"
- size="sm"
- :title="$options.i18n.modalTitle"
- ok-variant="danger"
- footer-class="gl-bg-gray-10 gl-p-5"
- >
- <div>
- <p ref="modalIntro">
- <gl-sprintf :message="modalIntro">
- <template #strong="{ content }">
- <strong>{{ content }}</strong>
- </template>
- </gl-sprintf>
- </p>
- <gl-form-group
- :invalid-feedback="invalidFeedbackMessage"
- :state="validationState"
- data-testid="form-group"
- >
- <label :id="$options.projectSelectLabelId" class="col-form-label">{{
- $options.i18n.projectLabel
- }}</label>
- <project-select v-model="projectToBeImported" />
- </gl-form-group>
- <p>{{ $options.i18n.modalHelpText }}</p>
- </div>
- <template #modal-footer>
- <div
- class="gl-display-flex gl-flex-direction-row gl-justify-content-end gl-flex-wrap gl-m-0"
- >
- <gl-button data-testid="cancel-button" @click="closeModal">
- {{ $options.i18n.modalCancelButton }}
- </gl-button>
- <div class="gl-mr-3"></div>
- <gl-button
- :disabled="importDisabled"
- :loading="isLoading"
- variant="confirm"
- data-testid="import-button"
- @click="submitImport"
- >{{ $options.i18n.modalPrimaryButton }}</gl-button
- >
- </div>
- </template>
- </gl-modal>
- </form>
-</template>
diff --git a/app/assets/javascripts/invite_members/components/import_project_members_modal.vue b/app/assets/javascripts/invite_members/components/import_project_members_modal.vue
new file mode 100644
index 00000000000..31b7fd4cc42
--- /dev/null
+++ b/app/assets/javascripts/invite_members/components/import_project_members_modal.vue
@@ -0,0 +1,149 @@
+<script>
+import { GlFormGroup, GlModal, GlSprintf } from '@gitlab/ui';
+import { uniqueId } from 'lodash';
+import { importProjectMembers } from '~/api/projects_api';
+import { BV_SHOW_MODAL } from '~/lib/utils/constants';
+import { s__, __, sprintf } from '~/locale';
+import eventHub from '../event_hub';
+import ProjectSelect from './project_select.vue';
+
+export default {
+ name: 'ImportProjectMembersModal',
+ components: {
+ GlFormGroup,
+ GlModal,
+ GlSprintf,
+ ProjectSelect,
+ },
+ props: {
+ projectId: {
+ type: String,
+ required: true,
+ },
+ projectName: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ projectToBeImported: {},
+ invalidFeedbackMessage: '',
+ isLoading: false,
+ };
+ },
+ computed: {
+ modalIntro() {
+ return sprintf(this.$options.i18n.modalIntro, {
+ name: this.projectName,
+ });
+ },
+ importDisabled() {
+ return Object.keys(this.projectToBeImported).length === 0;
+ },
+ validationState() {
+ return this.invalidFeedbackMessage === '' ? null : false;
+ },
+ actionPrimary() {
+ return {
+ text: this.$options.i18n.modalPrimaryButton,
+ attributes: {
+ variant: 'confirm',
+ disabled: this.importDisabled,
+ loading: this.isLoading,
+ },
+ };
+ },
+ actionCancel() {
+ return { text: this.$options.i18n.modalCancelButton };
+ },
+ },
+ mounted() {
+ eventHub.$on('openProjectMembersModal', () => {
+ this.openModal();
+ });
+ },
+ methods: {
+ openModal() {
+ this.$root.$emit(BV_SHOW_MODAL, this.$options.modalId);
+ },
+ resetFields() {
+ this.invalidFeedbackMessage = '';
+ this.projectToBeImported = {};
+ },
+ submitImport() {
+ this.isLoading = true;
+ return importProjectMembers(this.projectId, this.projectToBeImported.id)
+ .then(this.showToastMessage)
+ .catch(this.showErrorAlert)
+ .finally(() => {
+ this.isLoading = false;
+ this.projectToBeImported = {};
+ });
+ },
+ showToastMessage() {
+ this.$toast.show(this.$options.i18n.successMessage, this.$options.toastOptions);
+
+ this.closeModal();
+ },
+ showErrorAlert() {
+ this.invalidFeedbackMessage = this.$options.i18n.defaultError;
+ },
+ },
+ toastOptions() {
+ return {
+ onComplete: () => {
+ this.projectToBeImported = {};
+ },
+ };
+ },
+ i18n: {
+ projectLabel: __('Project'),
+ modalTitle: s__('ImportAProjectModal|Import members from another project'),
+ modalIntro: s__(
+ "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project.",
+ ),
+ modalHelpText: s__(
+ 'ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from.',
+ ),
+ modalPrimaryButton: s__('ImportAProjectModal|Import project members'),
+ modalCancelButton: __('Cancel'),
+ defaultError: s__('ImportAProjectModal|Unable to import project members'),
+ successMessage: s__('ImportAProjectModal|Successfully imported'),
+ },
+ projectSelectLabelId: 'project-select',
+ modalId: uniqueId('import-a-project-modal-'),
+};
+</script>
+
+<template>
+ <gl-modal
+ ref="modal"
+ :modal-id="$options.modalId"
+ size="sm"
+ :title="$options.i18n.modalTitle"
+ :action-primary="actionPrimary"
+ :action-cancel="actionCancel"
+ @primary="submitImport"
+ @hidden="resetFields"
+ >
+ <p ref="modalIntro">
+ <gl-sprintf :message="modalIntro">
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ </gl-sprintf>
+ </p>
+ <gl-form-group
+ :invalid-feedback="invalidFeedbackMessage"
+ :state="validationState"
+ data-testid="form-group"
+ >
+ <label :id="$options.projectSelectLabelId" class="col-form-label">{{
+ $options.i18n.projectLabel
+ }}</label>
+ <project-select v-model="projectToBeImported" />
+ </gl-form-group>
+ <p>{{ $options.i18n.modalHelpText }}</p>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/invite_members/components/import_project_members_trigger.vue b/app/assets/javascripts/invite_members/components/import_project_members_trigger.vue
new file mode 100644
index 00000000000..5781abb41b7
--- /dev/null
+++ b/app/assets/javascripts/invite_members/components/import_project_members_trigger.vue
@@ -0,0 +1,34 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import eventHub from '../event_hub';
+
+export default {
+ components: {
+ GlButton,
+ },
+ props: {
+ displayText: {
+ type: String,
+ required: false,
+ default: s__('ImportAProjectModal|Import from a project'),
+ },
+ classes: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ methods: {
+ openModal() {
+ eventHub.$emit('openProjectMembersModal');
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-button :class="classes" @click="openModal">
+ {{ displayText }}
+ </gl-button>
+</template>
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 d597c7e53bb..b71cfbb6112 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -7,12 +7,13 @@ import {
GlSprintf,
GlFormCheckboxGroup,
} from '@gitlab/ui';
-import { partition, isString, uniqueId } from 'lodash';
+import { partition, isString, uniqueId, isEmpty } from 'lodash';
import InviteModalBase from 'ee_else_ce/invite_members/components/invite_modal_base.vue';
import Api from '~/api';
import ExperimentTracking from '~/experimentation/experiment_tracking';
import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
import { getParameterValues } from '~/lib/utils/url_utility';
+import { n__ } from '~/locale';
import {
CLOSE_TO_LIMIT_COUNT,
USERS_FILTER_ALL,
@@ -21,7 +22,8 @@ import {
LEARN_GITLAB,
} from '../constants';
import eventHub from '../event_hub';
-import { responseMessageFromSuccess } from '../utils/response_message_parser';
+import { responseFromSuccess } from '../utils/response_message_parser';
+import { memberName } from '../utils/member_utils';
import { getInvalidFeedbackMessage } from '../utils/get_invalid_feedback_message';
import ModalConfetti from './confetti.vue';
import MembersTokenSelect from './members_token_select.vue';
@@ -101,6 +103,7 @@ export default {
isLoading: false,
modalId: uniqueId('invite-members-modal-'),
newUsersToInvite: [],
+ invalidMembers: {},
selectedTasksToBeDone: [],
selectedTaskProject: this.projects[0],
source: 'unknown',
@@ -125,6 +128,16 @@ export default {
inviteDisabled() {
return this.newUsersToInvite.length === 0;
},
+ hasInvalidMembers() {
+ return !isEmpty(this.invalidMembers);
+ },
+ memberErrorTitle() {
+ return n__(
+ "InviteMembersModal|The following member couldn't be invited",
+ "InviteMembersModal|The following %d members couldn't be invited",
+ Object.keys(this.invalidMembers).length,
+ );
+ },
tasksToBeDoneEnabled() {
return (
(getParameterValues('open_modal')[0] === 'invite_members_for_task' ||
@@ -218,7 +231,7 @@ export default {
},
sendInvite({ accessLevel, expiresAt }) {
this.isLoading = true;
- this.invalidFeedbackMessage = '';
+ this.clearValidation();
const [usersToInviteByEmail, usersToAddById] = this.partitionNewUsersToInvite();
@@ -242,12 +255,10 @@ export default {
...userId,
})
.then((response) => {
- const message = responseMessageFromSuccess(response);
+ const { error, message } = responseFromSuccess(response);
- if (message) {
- this.showInvalidFeedbackMessage({
- response: { data: { message } },
- });
+ if (error) {
+ this.showMemberErrors(message);
} else {
this.showSuccessMessage();
}
@@ -257,6 +268,13 @@ export default {
this.isLoading = false;
});
},
+ showMemberErrors(message) {
+ this.invalidMembers = message;
+ },
+ tokenName(username) {
+ // initial token creation hits this and nothing is found... so safe navigation
+ return this.newUsersToInvite.find((member) => memberName(member) === username)?.name;
+ },
trackinviteMembersForTask() {
const label = 'selected_tasks_to_be_done';
const property = this.selectedTasksToBeDone.join(',');
@@ -264,8 +282,8 @@ export default {
tracking.event(INVITE_MEMBERS_FOR_TASK.submit);
},
resetFields() {
+ this.clearValidation();
this.isLoading = false;
- this.invalidFeedbackMessage = '';
this.newUsersToInvite = [];
this.selectedTasksToBeDone = [];
[this.selectedTaskProject] = this.projects;
@@ -287,6 +305,11 @@ export default {
},
clearValidation() {
this.invalidFeedbackMessage = '';
+ this.invalidMembers = {};
+ },
+ removeToken(token) {
+ delete this.invalidMembers[memberName(token)];
+ this.invalidMembers = { ...this.invalidMembers };
},
},
labels: MEMBER_MODAL_LABELS,
@@ -324,23 +347,40 @@ export default {
<modal-confetti v-if="isCelebration" />
</template>
- <template #user-limit-notification>
+ <template #alert>
+ <gl-alert
+ v-if="hasInvalidMembers"
+ variant="danger"
+ :dismissible="false"
+ :title="memberErrorTitle"
+ data-testid="alert-member-error"
+ >
+ {{ $options.labels.memberErrorListText }}
+ <ul class="gl-pl-5">
+ <li v-for="(error, member) in invalidMembers" :key="member">
+ <strong>{{ tokenName(member) }}:</strong> {{ error }}
+ </li>
+ </ul>
+ </gl-alert>
<user-limit-notification
+ v-else
:close-to-limit="closeToLimit"
:reached-limit="reachedLimit"
:users-limit-dataset="usersLimitDataset"
/>
</template>
- <template #select="{ validationState, labelId }">
+ <template #select="{ exceptionState, labelId }">
<members-token-select
v-model="newUsersToInvite"
class="gl-mb-2"
- :validation-state="validationState"
+ :exception-state="exceptionState"
:aria-labelledby="labelId"
:users-filter="usersFilter"
:filter-id="filterId"
+ :invalid-members="invalidMembers"
@clear="clearValidation"
+ @token-remove="removeToken"
/>
</template>
<template #form-after>
diff --git a/app/assets/javascripts/invite_members/components/invite_modal_base.vue b/app/assets/javascripts/invite_members/components/invite_modal_base.vue
index 90d266c3155..f917ebc35c2 100644
--- a/app/assets/javascripts/invite_members/components/invite_modal_base.vue
+++ b/app/assets/javascripts/invite_members/components/invite_modal_base.vue
@@ -159,7 +159,7 @@ export default {
introText() {
return sprintf(this.labelIntroText, { name: this.name });
},
- validationState() {
+ exceptionState() {
return this.invalidFeedbackMessage ? false : null;
},
selectLabelId() {
@@ -306,11 +306,11 @@ export default {
<slot name="intro-text-after"></slot>
</div>
- <slot name="user-limit-notification"></slot>
+ <slot name="alert"></slot>
<gl-form-group
:invalid-feedback="invalidFeedbackMessage"
- :state="validationState"
+ :state="exceptionState"
data-testid="members-form-group"
>
<template #description>
@@ -320,7 +320,7 @@ export default {
<label :id="selectLabelId" :class="selectLabelClass">{{ labelSearchField }}</label>
<gl-form-input v-if="reachedLimit" data-testid="disabled-input" disabled />
- <slot v-else name="select" v-bind="{ validationState, labelId: selectLabelId }"></slot>
+ <slot v-else name="select" v-bind="{ exceptionState, labelId: selectLabelId }"></slot>
</gl-form-group>
<template v-if="!reachedLimit">
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 30c9294344e..b2bcb9a5906 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -3,6 +3,7 @@ import { GlTokenSelector, GlAvatar, GlAvatarLabeled, GlIcon, GlSprintf } from '@
import { debounce } from 'lodash';
import { __ } from '~/locale';
import { getUsers } from '~/rest_api';
+import { memberName } from '../utils/member_utils';
import { SEARCH_DELAY, USERS_FILTER_ALL, USERS_FILTER_SAML_PROVIDER_ID } from '../constants';
export default {
@@ -23,7 +24,7 @@ export default {
type: String,
required: true,
},
- validationState: {
+ exceptionState: {
type: Boolean,
required: false,
default: false,
@@ -38,6 +39,10 @@ export default {
required: false,
default: null,
},
+ invalidMembers: {
+ type: Object,
+ required: true,
+ },
},
data() {
return {
@@ -109,13 +114,18 @@ export default {
this.hasBeenFocused = true;
},
- handleTokenRemove() {
+ handleTokenRemove(value) {
if (this.selectedTokens.length) {
+ this.$emit('token-remove', value);
+
return;
}
this.$emit('clear');
},
+ hasError(token) {
+ return Object.keys(this.invalidMembers).includes(memberName(token));
+ },
},
defaultQueryOptions: { without_project_bots: true, active: true },
i18n: {
@@ -127,7 +137,7 @@ export default {
<template>
<gl-token-selector
v-model="selectedTokens"
- :state="validationState"
+ :state="exceptionState"
:dropdown-items="users"
:loading="loading"
:allow-user-defined-tokens="emailIsValid"
@@ -145,8 +155,19 @@ export default {
@token-remove="handleTokenRemove"
>
<template #token-content="{ token }">
- <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" />
+ <gl-icon
+ v-if="hasError(token)"
+ name="error"
+ :size="16"
+ class="gl-mr-2"
+ :data-testid="`error-icon-${token.id}`"
+ />
+ <gl-avatar
+ v-else-if="token.avatar_url"
+ :src="token.avatar_url"
+ :size="16"
+ data-testid="token-avatar"
+ />
{{ token.name }}
</template>
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index beb8f5b5aab..6141e5e9e0b 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -74,6 +74,9 @@ export const INVITE_BUTTON_TEXT_DISABLED = s__('InviteMembersModal|Manage member
export const CANCEL_BUTTON_TEXT = s__('InviteMembersModal|Cancel');
export const CANCEL_BUTTON_TEXT_DISABLED = s__('InviteMembersModal|Explore paid plans');
export const HEADER_CLOSE_LABEL = s__('InviteMembersModal|Close invite team members');
+export const MEMBER_ERROR_LIST_TEXT = s__(
+ 'InviteMembersModal|Review the invite errors and try again:',
+);
export const MEMBER_MODAL_LABELS = {
modal: {
@@ -109,6 +112,7 @@ export const MEMBER_MODAL_LABELS = {
title: MEMBERS_TASKS_PROJECTS_TITLE,
},
toastMessageSuccessful: TOAST_MESSAGE_SUCCESSFUL,
+ memberErrorListText: MEMBER_ERROR_LIST_TEXT,
};
export const GROUP_MODAL_LABELS = {
diff --git a/app/assets/javascripts/invite_members/init_import_a_project_modal.js b/app/assets/javascripts/invite_members/init_import_a_project_modal.js
deleted file mode 100644
index 954347467de..00000000000
--- a/app/assets/javascripts/invite_members/init_import_a_project_modal.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import Vue from 'vue';
-import ImportAProjectModal from '~/invite_members/components/import_a_project_modal.vue';
-
-export default function initImportAProjectModal() {
- const el = document.querySelector('.js-import-a-project-modal');
-
- if (!el) {
- return false;
- }
-
- const { projectId, projectName } = el.dataset;
-
- return new Vue({
- el,
- render: (createElement) =>
- createElement(ImportAProjectModal, {
- props: {
- projectId,
- projectName,
- },
- }),
- });
-}
diff --git a/app/assets/javascripts/invite_members/init_import_project_members_modal.js b/app/assets/javascripts/invite_members/init_import_project_members_modal.js
new file mode 100644
index 00000000000..daaa1315884
--- /dev/null
+++ b/app/assets/javascripts/invite_members/init_import_project_members_modal.js
@@ -0,0 +1,23 @@
+import Vue from 'vue';
+import ImportProjectMembersModal from '~/invite_members/components/import_project_members_modal.vue';
+
+export default function initImportProjectMembersModal() {
+ const el = document.querySelector('.js-import-project-members-modal');
+
+ if (!el) {
+ return false;
+ }
+
+ const { projectId, projectName } = el.dataset;
+
+ return new Vue({
+ el,
+ render: (createElement) =>
+ createElement(ImportProjectMembersModal, {
+ props: {
+ projectId,
+ projectName,
+ },
+ }),
+ });
+}
diff --git a/app/assets/javascripts/invite_members/init_import_project_members_trigger.js b/app/assets/javascripts/invite_members/init_import_project_members_trigger.js
new file mode 100644
index 00000000000..66a9bf118d2
--- /dev/null
+++ b/app/assets/javascripts/invite_members/init_import_project_members_trigger.js
@@ -0,0 +1,20 @@
+import Vue from 'vue';
+import ImportProjectMembersTrigger from '~/invite_members/components/import_project_members_trigger.vue';
+
+export default function initImportProjectMembersTrigger() {
+ const el = document.querySelector('.js-import-project-members-trigger');
+
+ if (!el) {
+ return false;
+ }
+
+ return new Vue({
+ el,
+ render: (createElement) =>
+ createElement(ImportProjectMembersTrigger, {
+ props: {
+ ...el.dataset,
+ },
+ }),
+ });
+}
diff --git a/app/assets/javascripts/invite_members/utils/member_utils.js b/app/assets/javascripts/invite_members/utils/member_utils.js
new file mode 100644
index 00000000000..d85162626f1
--- /dev/null
+++ b/app/assets/javascripts/invite_members/utils/member_utils.js
@@ -0,0 +1,4 @@
+export function memberName(member) {
+ // user defined tokens(invites by email) will have email in `name` and will not contain `username`
+ return member.username || member.name;
+}
diff --git a/app/assets/javascripts/invite_members/utils/response_message_parser.js b/app/assets/javascripts/invite_members/utils/response_message_parser.js
index db8ac303dc4..6e6431b89d9 100644
--- a/app/assets/javascripts/invite_members/utils/response_message_parser.js
+++ b/app/assets/javascripts/invite_members/utils/response_message_parser.js
@@ -1,15 +1,4 @@
-import { isString } from 'lodash';
-
-function responseKeyedMessageParsed(keyedMessage) {
- try {
- const keys = Object.keys(keyedMessage);
- const msg = keyedMessage[keys[0]];
-
- return msg;
- } catch {
- return '';
- }
-}
+import { isString, isArray } from 'lodash';
export function responseMessageFromError(response) {
if (!response?.response?.data) {
@@ -23,9 +12,9 @@ export function responseMessageFromError(response) {
return data.error || data.message?.error || data.message || '';
}
-export function responseMessageFromSuccess(response) {
+export function responseFromSuccess(response) {
if (!response?.data) {
- return '';
+ return { error: false };
}
const { data } = response;
@@ -34,11 +23,19 @@ export function responseMessageFromSuccess(response) {
const { message } = data;
if (isString(message)) {
- return message;
+ return { message, error: true };
+ }
+
+ if (isArray(message)) {
+ return { message: message[0], error: true };
}
+ // we assume object now with our keyed format
+ return { message: { ...message }, error: true };
+ }
- return responseKeyedMessageParsed(message);
+ if (data.error) {
+ return { message: data.error, error: true };
}
- return data.error || '';
+ return { error: false };
}
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
index d46354e240a..8a55176fed0 100644
--- 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
@@ -54,24 +54,23 @@ export default class IssuableBulkUpdateSidebar {
new MilestoneSelect();
subscriptionSelect();
+ // Checking IS_EE and using ee_else_ce is odd, but we do it here to satisfy
+ // the import/no-unresolved lint rule when FOSS_ONLY=1, even though at
+ // runtime this block won't execute.
if (IS_EE) {
- import('ee/vue_shared/components/sidebar/health_status_select/health_status_bundle')
+ import('ee_else_ce/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')
+ import('ee_else_ce/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')
+ import('ee_else_ce/vue_shared/components/sidebar/iterations_dropdown_bundle')
.then(({ default: iterationsDropdown }) => {
iterationsDropdown();
})
diff --git a/app/assets/javascripts/issuable/components/related_issuable_item.vue b/app/assets/javascripts/issuable/components/related_issuable_item.vue
index e6379b35f7a..a505a988360 100644
--- a/app/assets/javascripts/issuable/components/related_issuable_item.vue
+++ b/app/assets/javascripts/issuable/components/related_issuable_item.vue
@@ -84,7 +84,7 @@ export default {
<gl-icon
v-if="hasState"
ref="iconElementXL"
- class="mr-2 d-block"
+ class="gl-mr-3"
:class="iconClasses"
:name="iconName"
:title="stateTitle"
diff --git a/app/assets/javascripts/issuable/issuable_form.js b/app/assets/javascripts/issuable/issuable_form.js
index 38453072af8..cc2608b5c62 100644
--- a/app/assets/javascripts/issuable/issuable_form.js
+++ b/app/assets/javascripts/issuable/issuable_form.js
@@ -68,8 +68,7 @@ export default class IssuableForm {
this.gfmAutoComplete = new GfmAutoComplete(
gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources,
).setup();
- const autoAssignToMe = form.get(0).id === 'new_merge_request';
- this.usersSelect = new UsersSelect(undefined, undefined, { autoAssignToMe });
+ this.usersSelect = new UsersSelect();
this.reviewersSelect = new UsersSelect(undefined, '.js-reviewer-search');
this.zenMode = new ZenMode();
@@ -82,7 +81,7 @@ export default class IssuableForm {
this.initAutosave();
this.form.on('submit', this.handleSubmit);
- this.form.on('click', '.btn-cancel', this.resetAutosave);
+ this.form.on('click', '.btn-cancel, .js-reset-autosave', this.resetAutosave);
this.form.find('.js-unwrap-on-load').unwrap();
this.initWip();
diff --git a/app/assets/javascripts/issues/create_merge_request_dropdown.js b/app/assets/javascripts/issues/create_merge_request_dropdown.js
index edf3789e6dc..92ff7f21eff 100644
--- a/app/assets/javascripts/issues/create_merge_request_dropdown.js
+++ b/app/assets/javascripts/issues/create_merge_request_dropdown.js
@@ -169,28 +169,27 @@ export default class CreateMergeRequestDropdown {
}
createMergeRequest() {
- return new Promise(() => {
- this.isCreatingMergeRequest = true;
- return this.createBranch(false)
- .then(() => api.trackRedisHllUserEvent('i_code_review_user_create_mr_from_issue'))
- .then(() => {
- let path = canCreateConfidentialMergeRequest()
- ? this.createMrPath.replace(
- this.projectPath,
- confidentialMergeRequestState.selectedProject.pathWithNamespace,
- )
- : this.createMrPath;
- path = mergeUrlParams(
- {
- 'merge_request[target_branch]': this.refInput.value,
- 'merge_request[source_branch]': this.branchInput.value,
- },
- path,
- );
-
- window.location.href = path;
- });
- });
+ this.isCreatingMergeRequest = true;
+
+ return this.createBranch(false)
+ .then(() => api.trackRedisHllUserEvent('i_code_review_user_create_mr_from_issue'))
+ .then(() => {
+ let path = canCreateConfidentialMergeRequest()
+ ? this.createMrPath.replace(
+ this.projectPath,
+ confidentialMergeRequestState.selectedProject.pathWithNamespace,
+ )
+ : this.createMrPath;
+ path = mergeUrlParams(
+ {
+ 'merge_request[target_branch]': this.refInput.value,
+ 'merge_request[source_branch]': this.branchInput.value,
+ },
+ path,
+ );
+
+ window.location.href = path;
+ });
}
disable() {
diff --git a/app/assets/javascripts/issues/index.js b/app/assets/javascripts/issues/index.js
index 67c6c723dcc..380bb5f5346 100644
--- a/app/assets/javascripts/issues/index.js
+++ b/app/assets/javascripts/issues/index.js
@@ -23,6 +23,7 @@ import initNotesApp from '~/notes';
import { store } from '~/notes/stores';
import ZenMode from '~/zen_mode';
import initAwardsApp from '~/emoji/awards_app';
+import initLinkedResources from '~/linked_resources';
import FilteredSearchServiceDesk from './filtered_search_service_desk';
export function initFilteredSearchServiceDesk() {
@@ -59,6 +60,7 @@ export function initShow() {
if (issueType === IssueType.Incident) {
initIncidentApp({ ...issuableData, issuableId: el.dataset.issuableId });
initHeaderActions(store, IssueType.Incident);
+ initLinkedResources();
initRelatedIssues(IssueType.Incident);
} else {
initIssueApp(issuableData, store);
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 fa56c0183b2..f567b0f1d68 100644
--- a/app/assets/javascripts/issues/list/components/issues_list_app.vue
+++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue
@@ -70,6 +70,7 @@ import {
UPDATED_DESC,
urlSortParams,
} from '../constants';
+
import eventHub from '../eventhub';
import reorderIssuesMutation from '../queries/reorder_issues.mutation.graphql';
import searchLabelsQuery from '../queries/search_labels.query.graphql';
@@ -98,6 +99,10 @@ const MilestoneToken = () =>
import('~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue');
const ReleaseToken = () =>
import('~/vue_shared/components/filtered_search_bar/tokens/release_token.vue');
+const CrmContactToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/crm_contact_token.vue');
+const CrmOrganizationToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/crm_organization_token.vue');
export default {
i18n,
@@ -168,6 +173,7 @@ export default {
showBulkEditSidebar: false,
sortKey: CREATED_DESC,
state: IssuableStates.Opened,
+ pageSize: PAGE_SIZE,
};
},
apollo: {
@@ -383,7 +389,11 @@ export default {
type: TOKEN_TYPE_CONTACT,
title: TOKEN_TITLE_CONTACT,
icon: 'user',
- token: GlFilteredSearchToken,
+ token: CrmContactToken,
+ fullPath: this.fullPath,
+ isProject: this.isProject,
+ defaultContacts: DEFAULT_NONE_ANY,
+ recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-crm-contacts`,
operators: OPERATOR_IS_ONLY,
unique: true,
});
@@ -394,7 +404,11 @@ export default {
type: TOKEN_TYPE_ORGANIZATION,
title: TOKEN_TITLE_ORGANIZATION,
icon: 'users',
- token: GlFilteredSearchToken,
+ token: CrmOrganizationToken,
+ fullPath: this.fullPath,
+ isProject: this.isProject,
+ defaultOrganizations: DEFAULT_NONE_ANY,
+ recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-crm-organizations`,
operators: OPERATOR_IS_ONLY,
unique: true,
});
@@ -411,6 +425,10 @@ export default {
showPaginationControls() {
return this.issues.length > 0 && (this.pageInfo.hasNextPage || this.pageInfo.hasPreviousPage);
},
+ showPageSizeControls() {
+ /** only show page size controls when the tab count is greater than the default/minimum page size control i.e 20 in this case */
+ return this.currentTabCount > PAGE_SIZE;
+ },
sortOptions() {
return getSortOptions(this.hasIssueWeightsFeature, this.hasBlockedIssuesFeature);
},
@@ -433,8 +451,8 @@ export default {
...this.urlFilterParams,
first_page_size: this.pageParams.firstPageSize,
last_page_size: this.pageParams.lastPageSize,
- page_after: this.pageParams.afterCursor,
- page_before: this.pageParams.beforeCursor,
+ page_after: this.pageParams.afterCursor ?? undefined,
+ page_before: this.pageParams.beforeCursor ?? undefined,
};
},
},
@@ -543,7 +561,7 @@ export default {
},
handleClickTab(state) {
if (this.state !== state) {
- this.pageParams = getInitialPageParams(this.sortKey);
+ this.pageParams = getInitialPageParams(this.pageSize);
}
this.state = state;
@@ -558,7 +576,7 @@ export default {
return;
}
- this.pageParams = getInitialPageParams(this.sortKey);
+ this.pageParams = getInitialPageParams(this.pageSize);
this.filterTokens = filter;
this.$router.push({ query: this.urlParams });
@@ -566,7 +584,7 @@ export default {
handleNextPage() {
this.pageParams = {
afterCursor: this.pageInfo.endCursor,
- firstPageSize: PAGE_SIZE,
+ firstPageSize: this.pageSize,
};
scrollUp();
@@ -575,7 +593,7 @@ export default {
handlePreviousPage() {
this.pageParams = {
beforeCursor: this.pageInfo.startCursor,
- lastPageSize: PAGE_SIZE,
+ lastPageSize: this.pageSize,
};
scrollUp();
@@ -624,7 +642,7 @@ export default {
}
if (this.sortKey !== sortKey) {
- this.pageParams = getInitialPageParams(sortKey);
+ this.pageParams = getInitialPageParams(this.pageSize);
}
this.sortKey = sortKey;
@@ -664,6 +682,17 @@ export default {
toggleBulkEditSidebar(showBulkEditSidebar) {
this.showBulkEditSidebar = showBulkEditSidebar;
},
+ handlePageSizeChange(newPageSize) {
+ /** make sure the page number is preserved so that the current context is not lost* */
+ const lastPageSize = getParameterByName(PARAM_LAST_PAGE_SIZE);
+ const pageNumberSize = lastPageSize ? 'lastPageSize' : 'firstPageSize';
+ /** depending upon what page or page size we are dynamically set pageParams * */
+ this.pageParams[pageNumberSize] = newPageSize;
+ this.pageSize = newPageSize;
+ scrollUp();
+
+ this.$router.push({ query: this.urlParams });
+ },
updateData(sortValue) {
const firstPageSize = getParameterByName(PARAM_FIRST_PAGE_SIZE);
const lastPageSize = getParameterByName(PARAM_LAST_PAGE_SIZE);
@@ -696,7 +725,7 @@ export default {
this.exportCsvPathWithQuery = this.getExportCsvPathWithQuery();
this.filterTokens = isSearchDisabled ? [] : getFilterTokens(window.location.search);
this.pageParams = getInitialPageParams(
- sortKey,
+ this.pageSize,
isPositiveInteger(firstPageSize) ? parseInt(firstPageSize, 10) : undefined,
isPositiveInteger(lastPageSize) ? parseInt(lastPageSize, 10) : undefined,
pageAfter,
@@ -732,8 +761,10 @@ export default {
:is-manual-ordering="isManualOrdering"
:show-bulk-edit-sidebar="showBulkEditSidebar"
:show-pagination-controls="showPaginationControls"
+ :default-page-size="pageSize"
sync-filter-and-sort
use-keyset-pagination
+ :show-page-size-change-controls="showPageSizeControls"
:has-next-page="pageInfo.hasNextPage"
:has-previous-page="pageInfo.hasPreviousPage"
@click-tab="handleClickTab"
@@ -744,6 +775,7 @@ export default {
@reorder="handleReorder"
@sort="handleSort"
@update-legacy-bulk-edit="handleUpdateLegacyBulkEdit"
+ @page-size-change="handlePageSizeChange"
>
<template #nav-actions>
<gl-button
diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js
index 74f801f685c..a921eb62e26 100644
--- a/app/assets/javascripts/issues/list/constants.js
+++ b/app/assets/javascripts/issues/list/constants.js
@@ -90,6 +90,8 @@ export const UPDATED_ASC = 'UPDATED_ASC';
export const UPDATED_DESC = 'UPDATED_DESC';
export const WEIGHT_ASC = 'WEIGHT_ASC';
export const WEIGHT_DESC = 'WEIGHT_DESC';
+export const CLOSED_ASC = 'CLOSED_AT_ASC';
+export const CLOSED_DESC = 'CLOSED_AT_DESC';
export const urlSortParams = {
[PRIORITY_ASC]: 'priority',
@@ -98,6 +100,8 @@ export const urlSortParams = {
[CREATED_DESC]: 'created_date',
[UPDATED_ASC]: 'updated_asc',
[UPDATED_DESC]: 'updated_desc',
+ [CLOSED_ASC]: 'closed_asc',
+ [CLOSED_DESC]: 'closed_desc',
[MILESTONE_DUE_ASC]: 'milestone',
[MILESTONE_DUE_DESC]: 'milestone_due_desc',
[DUE_DATE_ASC]: 'due_date',
diff --git a/app/assets/javascripts/issues/list/queries/issue.fragment.graphql b/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
index 73a13cea94a..35762120f71 100644
--- a/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
+++ b/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
@@ -13,6 +13,7 @@ fragment IssueFragment on Issue {
state
title
updatedAt
+ closedAt
upvotes
userDiscussionsCount @include(if: $isSignedIn)
webPath
diff --git a/app/assets/javascripts/issues/list/utils.js b/app/assets/javascripts/issues/list/utils.js
index dfdc6e27f0d..f02c7a23f51 100644
--- a/app/assets/javascripts/issues/list/utils.js
+++ b/app/assets/javascripts/issues/list/utils.js
@@ -21,7 +21,6 @@ import {
MILESTONE_DUE_DESC,
NORMAL_FILTER,
PAGE_SIZE,
- PAGE_SIZE_MANUAL,
PARAM_ASSIGNEE_ID,
POPULARITY_ASC,
POPULARITY_DESC,
@@ -44,11 +43,13 @@ import {
urlSortParams,
WEIGHT_ASC,
WEIGHT_DESC,
+ CLOSED_ASC,
+ CLOSED_DESC,
} from './constants';
export const getInitialPageParams = (
- sortKey,
- firstPageSize = sortKey === RELATIVE_POSITION_ASC ? PAGE_SIZE_MANUAL : PAGE_SIZE,
+ pageSize,
+ firstPageSize = pageSize ?? PAGE_SIZE,
lastPageSize,
afterCursor,
beforeCursor,
@@ -92,6 +93,14 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
},
{
id: 4,
+ title: __('Closed date'),
+ sortDirection: {
+ ascending: CLOSED_ASC,
+ descending: CLOSED_DESC,
+ },
+ },
+ {
+ id: 5,
title: __('Milestone due date'),
sortDirection: {
ascending: MILESTONE_DUE_ASC,
@@ -99,7 +108,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
},
},
{
- id: 5,
+ id: 6,
title: __('Due date'),
sortDirection: {
ascending: DUE_DATE_ASC,
@@ -107,7 +116,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
},
},
{
- id: 6,
+ id: 7,
title: __('Popularity'),
sortDirection: {
ascending: POPULARITY_ASC,
@@ -115,7 +124,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
},
},
{
- id: 7,
+ id: 8,
title: __('Label priority'),
sortDirection: {
ascending: LABEL_PRIORITY_ASC,
@@ -123,7 +132,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
},
},
{
- id: 8,
+ id: 9,
title: __('Manual'),
sortDirection: {
ascending: RELATIVE_POSITION_ASC,
@@ -131,7 +140,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
},
},
{
- id: 9,
+ id: 10,
title: __('Title'),
sortDirection: {
ascending: TITLE_ASC,
diff --git a/app/assets/javascripts/issues/new/components/type_popover.vue b/app/assets/javascripts/issues/new/components/type_popover.vue
index a70e79b70f9..9c43e527f8b 100644
--- a/app/assets/javascripts/issues/new/components/type_popover.vue
+++ b/app/assets/javascripts/issues/new/components/type_popover.vue
@@ -18,8 +18,9 @@ export default {
</script>
<template>
- <span id="popovercontainer">
- <gl-icon id="issue-type-info" name="question-o" class="gl-ml-5 gl-text-gray-500" />
+ <span id="popovercontainer" class="gl-ml-2">
+ <gl-icon id="issue-type-info" name="question-o" class="gl-text-blue-600" />
+
<gl-popover
target="issue-type-info"
container="popovercontainer"
diff --git a/app/assets/javascripts/issues/show/components/description.vue b/app/assets/javascripts/issues/show/components/description.vue
index 892c631f8ea..449da394841 100644
--- a/app/assets/javascripts/issues/show/components/description.vue
+++ b/app/assets/javascripts/issues/show/components/description.vue
@@ -1,11 +1,5 @@
<script>
-import {
- GlSafeHtmlDirective as SafeHtml,
- GlModal,
- GlToast,
- GlTooltip,
- GlModalDirective,
-} from '@gitlab/ui';
+import { GlSafeHtmlDirective as SafeHtml, GlToast, GlTooltip, GlModalDirective } from '@gitlab/ui';
import $ from 'jquery';
import Sortable from 'sortablejs';
import Vue from 'vue';
@@ -20,11 +14,16 @@ import { getSortableDefaultOptions, isDragging } from '~/sortable/utils';
import TaskList from '~/task_list';
import Tracking from '~/tracking';
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
+import projectWorkItemTypesQuery from '~/work_items/graphql/project_work_item_types.query.graphql';
+import createWorkItemFromTaskMutation from '~/work_items/graphql/create_work_item_from_task.mutation.graphql';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
-import { TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
-import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
+import {
+ TRACKING_CATEGORY_SHOW,
+ TASK_TYPE_NAME,
+ WIDGET_TYPE_DESCRIPTION,
+} from '~/work_items/constants';
import animateMixin from '../mixins/animate';
import { convertDescriptionWithNewSort } from '../utils';
@@ -40,12 +39,11 @@ export default {
GlModal: GlModalDirective,
},
components: {
- GlModal,
- CreateWorkItem,
GlTooltip,
WorkItemDetailModal,
},
mixins: [animateMixin, glFeatureFlagMixin(), Tracking.mixin()],
+ inject: ['fullPath'],
props: {
canUpdate: {
type: Boolean,
@@ -103,6 +101,7 @@ export default {
workItemId: isPositiveInteger(workItemId)
? convertToGraphQLId(TYPE_WORK_ITEM, workItemId)
: undefined,
+ workItemTypes: [],
};
},
apollo: {
@@ -117,11 +116,28 @@ export default {
return !this.workItemId || !this.workItemsEnabled;
},
},
+ workItemTypes: {
+ query: projectWorkItemTypesQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ };
+ },
+ update(data) {
+ return data.workspace?.workItemTypes?.nodes;
+ },
+ skip() {
+ return !this.workItemsEnabled;
+ },
+ },
},
computed: {
workItemsEnabled() {
return this.glFeatures.workItems;
},
+ taskWorkItemType() {
+ return this.workItemTypes.find((type) => type.name === TASK_TYPE_NAME)?.id;
+ },
issueGid() {
return this.issueId ? convertToGraphQLId(TYPE_WORK_ITEM, this.issueId) : null;
},
@@ -344,8 +360,8 @@ export default {
<use href="${gon.sprite_icons}#doc-new"></use>
</svg>
`;
- button.setAttribute('aria-label', s__('WorkItem|Convert to work item'));
- button.addEventListener('click', () => this.openCreateTaskModal(button));
+ button.setAttribute('aria-label', s__('WorkItem|Create task'));
+ button.addEventListener('click', () => this.handleCreateTask(button));
this.insertButtonNextToTaskText(item, button);
});
},
@@ -386,17 +402,11 @@ export default {
lineNumberEnd: lineNumbers[1],
};
},
- openCreateTaskModal(el) {
- this.setActiveTask(el);
- this.$refs.modal.show();
- },
- closeCreateTaskModal() {
- this.$refs.modal.hide();
- },
openWorkItemDetailModal(el) {
if (!el) {
return;
}
+
this.setActiveTask(el);
this.$refs.detailsModal.show();
},
@@ -404,13 +414,58 @@ export default {
this.workItemId = undefined;
this.updateWorkItemIdUrlQuery(undefined);
},
- handleCreateTask(description) {
- this.$emit('updateDescription', description);
- this.closeCreateTaskModal();
+ async handleCreateTask(el) {
+ this.setActiveTask(el);
+ try {
+ const { data } = await this.$apollo.mutate({
+ mutation: createWorkItemFromTaskMutation,
+ variables: {
+ input: {
+ id: this.issueGid,
+ workItemData: {
+ lockVersion: this.lockVersion,
+ title: this.activeTask.title,
+ lineNumberStart: Number(this.activeTask.lineNumberStart),
+ lineNumberEnd: Number(this.activeTask.lineNumberEnd),
+ workItemTypeId: this.taskWorkItemType,
+ },
+ },
+ },
+ update(store, { data: { workItemCreateFromTask } }) {
+ const { newWorkItem } = workItemCreateFromTask;
+
+ store.writeQuery({
+ query: workItemQuery,
+ variables: {
+ id: newWorkItem.id,
+ },
+ data: {
+ workItem: newWorkItem,
+ },
+ });
+ },
+ });
+
+ const { workItem, newWorkItem } = data.workItemCreateFromTask;
+
+ const updatedDescription = workItem?.widgets?.find(
+ (widget) => widget.type === WIDGET_TYPE_DESCRIPTION,
+ )?.descriptionHtml;
+
+ this.$emit('updateDescription', updatedDescription);
+ this.workItemId = newWorkItem.id;
+ this.openWorkItemDetailModal(el);
+ } catch (error) {
+ createFlash({
+ message: s__('WorkItem|Something went wrong when creating a work item. Please try again'),
+ error,
+ captureError: true,
+ });
+ }
},
handleDeleteTask(description) {
this.$emit('updateDescription', description);
- this.$toast.show(s__('WorkItem|Work item deleted'));
+ this.$toast.show(s__('WorkItem|Task deleted'));
},
updateWorkItemIdUrlQuery(workItemId) {
updateHistory({
@@ -452,19 +507,6 @@ export default {
data-testid="textarea"
>
</textarea>
-
- <gl-modal ref="modal" size="lg" modal-id="create-task-modal" hide-footer body-class="gl-p-0!">
- <create-work-item
- is-modal
- :initial-title="activeTask.title"
- :issue-gid="issueGid"
- :lock-version="lockVersion"
- :line-number-start="activeTask.lineNumberStart"
- :line-number-end="activeTask.lineNumberEnd"
- @closeModal="closeCreateTaskModal"
- @onCreate="handleCreateTask"
- />
- </gl-modal>
<work-item-detail-modal
ref="detailsModal"
:can-update="canUpdate"
@@ -478,7 +520,7 @@ export default {
/>
<template v-if="workItemsEnabled">
<gl-tooltip v-for="item in taskButtons" :key="item" :target="item">
- {{ s__('WorkItem|Convert to work item') }}
+ {{ s__('WorkItem|Create task') }}
</gl-tooltip>
</template>
</div>
diff --git a/app/assets/javascripts/issues/show/components/edit_actions.vue b/app/assets/javascripts/issues/show/components/edit_actions.vue
index 9b31014c1ba..358b53bd131 100644
--- a/app/assets/javascripts/issues/show/components/edit_actions.vue
+++ b/app/assets/javascripts/issues/show/components/edit_actions.vue
@@ -105,7 +105,7 @@ export default {
:disabled="formState.updateLoading || !isSubmitEnabled"
category="primary"
variant="confirm"
- class="qa-save-button gl-mr-3"
+ class="gl-mr-3"
data-testid="issuable-save-button"
type="submit"
@click.prevent="updateIssuable"
@@ -123,7 +123,6 @@ export default {
:disabled="deleteLoading"
category="secondary"
variant="danger"
- class="qa-delete-button"
data-testid="issuable-delete-button"
@click="track('click_button')"
>
diff --git a/app/assets/javascripts/issues/show/components/fields/description.vue b/app/assets/javascripts/issues/show/components/fields/description.vue
index 0bb5e7cb2ee..f45af47374a 100644
--- a/app/assets/javascripts/issues/show/components/fields/description.vue
+++ b/app/assets/javascripts/issues/show/components/fields/description.vue
@@ -59,7 +59,8 @@ export default {
id="issue-description"
ref="textarea"
:value="value"
- class="note-textarea js-gfm-input js-autosize markdown-area qa-description-textarea"
+ class="note-textarea js-gfm-input js-autosize markdown-area"
+ data-qa-selector="description_field"
dir="auto"
data-supports-quick-actions="true"
:aria-label="__('Description')"
diff --git a/app/assets/javascripts/issues/show/components/fields/title.vue b/app/assets/javascripts/issues/show/components/fields/title.vue
index 594d1a65700..58d32256da4 100644
--- a/app/assets/javascripts/issues/show/components/fields/title.vue
+++ b/app/assets/javascripts/issues/show/components/fields/title.vue
@@ -19,7 +19,7 @@ export default {
id="issuable-title"
ref="input"
:value="value"
- class="form-control qa-title-input gl-border-gray-200"
+ class="form-control gl-border-gray-200"
dir="auto"
type="text"
:placeholder="__('Title')"
diff --git a/app/assets/javascripts/issues/show/components/incidents/constants.js b/app/assets/javascripts/issues/show/components/incidents/constants.js
new file mode 100644
index 00000000000..9fc5027d457
--- /dev/null
+++ b/app/assets/javascripts/issues/show/components/incidents/constants.js
@@ -0,0 +1,26 @@
+import { s__ } from '~/locale';
+
+export const timelineTabI18n = Object.freeze({
+ title: s__('Incident|Timeline'),
+ emptyDescription: s__('Incident|No timeline items have been added yet.'),
+ addEventButton: s__('Incident|Add new timeline event'),
+});
+
+export const timelineFormI18n = Object.freeze({
+ createError: s__('Incident|Error creating incident timeline event: %{error}'),
+ createErrorGeneric: s__(
+ 'Incident|Something went wrong while creating the incident timeline event.',
+ ),
+ areaPlaceholder: s__('Incident|Timeline text...'),
+ saveAndAdd: s__('Incident|Save and add another event'),
+ areaLabel: s__('Incident|Timeline text'),
+});
+
+export const timelineListI18n = Object.freeze({
+ deleteButton: s__('Incident|Delete event'),
+ deleteError: s__('Incident|Error deleting incident timeline event: %{error}'),
+ deleteErrorGeneric: s__(
+ 'Incident|Something went wrong while deleting the incident timeline event.',
+ ),
+ deleteModal: s__('Incident|Are you sure you want to delete this event?'),
+});
diff --git a/app/assets/javascripts/issues/show/components/incidents/graphql/queries/create_timeline_event.mutation.graphql b/app/assets/javascripts/issues/show/components/incidents/graphql/queries/create_timeline_event.mutation.graphql
new file mode 100644
index 00000000000..f1fc27dcb2a
--- /dev/null
+++ b/app/assets/javascripts/issues/show/components/incidents/graphql/queries/create_timeline_event.mutation.graphql
@@ -0,0 +1,13 @@
+mutation CreateTimelineEvent($input: TimelineEventCreateInput!) {
+ timelineEventCreate(input: $input) {
+ timelineEvent {
+ id
+ note
+ noteHtml
+ action
+ occurredAt
+ createdAt
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/issues/show/components/incidents/graphql/queries/delete_timeline_event.mutation.graphql b/app/assets/javascripts/issues/show/components/incidents/graphql/queries/delete_timeline_event.mutation.graphql
new file mode 100644
index 00000000000..78babf9d62e
--- /dev/null
+++ b/app/assets/javascripts/issues/show/components/incidents/graphql/queries/delete_timeline_event.mutation.graphql
@@ -0,0 +1,8 @@
+mutation DestroyTimelineEvent($input: TimelineEventDestroyInput!) {
+ timelineEventDestroy(input: $input) {
+ timelineEvent {
+ id
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/issues/show/components/incidents/graphql/queries/get_timeline_events.query.graphql b/app/assets/javascripts/issues/show/components/incidents/graphql/queries/get_timeline_events.query.graphql
index 7e049d98c1a..bc4e8414bfc 100644
--- a/app/assets/javascripts/issues/show/components/incidents/graphql/queries/get_timeline_events.query.graphql
+++ b/app/assets/javascripts/issues/show/components/incidents/graphql/queries/get_timeline_events.query.graphql
@@ -4,17 +4,11 @@ query GetTimelineEvents($fullPath: ID!, $incidentId: IssueID!) {
incidentManagementTimelineEvents(incidentId: $incidentId) {
nodes {
id
- author {
- id
- name
- username
- }
note
noteHtml
action
occurredAt
createdAt
- updatedAt
}
}
}
diff --git a/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue b/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue
index 6fdce6045f2..dd84a1d7d67 100644
--- a/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue
@@ -101,7 +101,7 @@ export default {
>
<gl-tab :title="s__('Incident|Summary')">
<highlight-bar :alert="alert" />
- <description-component v-bind="$attrs" />
+ <description-component v-bind="$attrs" v-on="$listeners" />
</gl-tab>
<incident-metric-tab />
<gl-tab
diff --git a/app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue b/app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue
new file mode 100644
index 00000000000..36ec6362a22
--- /dev/null
+++ b/app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue
@@ -0,0 +1,266 @@
+<script>
+import { GlDatepicker, GlFormInput, GlFormGroup, GlButton, GlIcon } from '@gitlab/ui';
+import { produce } from 'immer';
+import { sortBy } from 'lodash';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { TYPE_ISSUE } from '~/graphql_shared/constants';
+import MarkdownField from '~/vue_shared/components/markdown/field.vue';
+import { createAlert } from '~/flash';
+import autofocusonshow from '~/vue_shared/directives/autofocusonshow';
+import { sprintf } from '~/locale';
+import { getUtcShiftedDateNow } from './utils';
+import { timelineFormI18n } from './constants';
+
+import CreateTimelineEvent from './graphql/queries/create_timeline_event.mutation.graphql';
+import getTimelineEvents from './graphql/queries/get_timeline_events.query.graphql';
+
+export default {
+ name: 'IncidentTimelineEventForm',
+ restrictedToolBarItems: [
+ 'quote',
+ 'strikethrough',
+ 'bullet-list',
+ 'numbered-list',
+ 'task-list',
+ 'collapsible-section',
+ 'table',
+ 'full-screen',
+ ],
+ components: {
+ MarkdownField,
+ GlDatepicker,
+ GlFormInput,
+ GlFormGroup,
+ GlButton,
+ GlIcon,
+ },
+ i18n: timelineFormI18n,
+ directives: {
+ autofocusonshow,
+ },
+ inject: ['fullPath', 'issuableId'],
+ props: {
+ hasTimelineEvents: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ // Create shifted date to force the datepicker to format in UTC
+ const utcShiftedDate = getUtcShiftedDateNow();
+ return {
+ currentDate: utcShiftedDate,
+ currentHour: utcShiftedDate.getHours(),
+ currentMinute: utcShiftedDate.getMinutes(),
+ timelineText: '',
+ createTimelineEventActive: false,
+ datepickerTextInput: null,
+ };
+ },
+ methods: {
+ clear() {
+ const utcShiftedDate = getUtcShiftedDateNow();
+ this.currentDate = utcShiftedDate;
+ this.currentHour = utcShiftedDate.getHours();
+ this.currentMinute = utcShiftedDate.getMinutes();
+ },
+ hideIncidentTimelineEventForm() {
+ this.$emit('hide-incident-timeline-event-form');
+ },
+ focusDate() {
+ this.$refs.datepicker.$el.focus();
+ },
+ updateCache(store, { data }) {
+ const { timelineEvent: event, errors } = data?.timelineEventCreate || {};
+
+ if (errors.length) {
+ return;
+ }
+
+ const variables = {
+ incidentId: convertToGraphQLId(TYPE_ISSUE, this.issuableId),
+ fullPath: this.fullPath,
+ };
+
+ const sourceData = store.readQuery({
+ query: getTimelineEvents,
+ variables,
+ });
+
+ const newData = produce(sourceData, (draftData) => {
+ const { nodes: draftEventList } = draftData.project.incidentManagementTimelineEvents;
+ draftEventList.push(event);
+ // ISOStrings sort correctly in lexical order
+ const sortedEvents = sortBy(draftEventList, 'occurredAt');
+ draftData.project.incidentManagementTimelineEvents.nodes = sortedEvents;
+ });
+
+ store.writeQuery({
+ query: getTimelineEvents,
+ variables,
+ data: newData,
+ });
+ },
+ createIncidentTimelineEvent(addOneEvent) {
+ this.createTimelineEventActive = true;
+ return this.$apollo
+ .mutate({
+ mutation: CreateTimelineEvent,
+ variables: {
+ input: {
+ incidentId: convertToGraphQLId(TYPE_ISSUE, this.issuableId),
+ note: this.timelineText,
+ occurredAt: this.createDateString(),
+ },
+ },
+ update: this.updateCache,
+ })
+ .then(({ data = {} }) => {
+ const errors = data.timelineEventCreate?.errors;
+ if (errors.length) {
+ createAlert({
+ message: sprintf(this.$options.i18n.createError, { error: errors.join('. ') }, false),
+ });
+ }
+ })
+ .catch((error) => {
+ createAlert({
+ message: this.$options.i18n.createErrorGeneric,
+ captureError: true,
+ error,
+ });
+ })
+ .finally(() => {
+ this.createTimelineEventActive = false;
+ this.timelineText = '';
+ if (addOneEvent) {
+ this.hideIncidentTimelineEventForm();
+ }
+ });
+ },
+ createDateString() {
+ const [years, months, days] = this.datepickerTextInput.split('-');
+ const utcDate = new Date(
+ Date.UTC(years, months - 1, days, this.currentHour, this.currentMinute),
+ );
+ return utcDate.toISOString();
+ },
+ },
+};
+</script>
+
+<template>
+ <div
+ class="gl-relative gl-display-flex gl-align-items-center"
+ :class="{ 'timeline-entry-vertical-line': hasTimelineEvents }"
+ >
+ <div
+ v-if="hasTimelineEvents"
+ class="gl-display-flex gl-align-items-center gl-justify-content-center gl-align-self-start gl-bg-white gl-text-gray-200 gl-border-gray-100 gl-border-1 gl-border-solid gl-rounded-full gl-mt-2 gl-mr-3 gl-w-8 gl-h-8 gl-z-index-1"
+ >
+ <gl-icon name="comment" class="note-icon" />
+ </div>
+ <form class="gl-flex-grow-1 gl-border-gray-50" :class="{ 'gl-border-t': hasTimelineEvents }">
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-sm-flex-direction-row datetime-picker"
+ >
+ <gl-form-group :label="__('Date')" class="gl-mt-5 gl-mr-5">
+ <gl-datepicker id="incident-date" #default="{ formattedDate }" v-model="currentDate">
+ <gl-form-input
+ id="incident-date"
+ ref="datepicker"
+ v-model="datepickerTextInput"
+ data-testid="input-datepicker"
+ class="gl-datepicker-input gl-pr-7!"
+ :value="formattedDate"
+ :placeholder="__('YYYY-MM-DD')"
+ @keydown.enter="onKeydown"
+ />
+ </gl-datepicker>
+ </gl-form-group>
+ <div class="gl-display-flex gl-mt-5">
+ <gl-form-group :label="__('Time')">
+ <div class="gl-display-flex">
+ <label label-for="timeline-input-hours" class="sr-only"></label>
+ <gl-form-input
+ id="timeline-input-hours"
+ v-model="currentHour"
+ data-testid="input-hours"
+ size="xs"
+ type="number"
+ min="00"
+ max="23"
+ />
+ <label label-for="timeline-input-minutes" class="sr-only"></label>
+ <gl-form-input
+ id="timeline-input-minutes"
+ v-model="currentMinute"
+ class="gl-ml-3"
+ data-testid="input-minutes"
+ size="xs"
+ type="number"
+ min="00"
+ max="59"
+ />
+ </div>
+ </gl-form-group>
+ <p class="gl-ml-3 gl-align-self-end gl-line-height-32">{{ __('UTC') }}</p>
+ </div>
+ </div>
+ <div class="common-note-form">
+ <gl-form-group class="gl-mb-3" :label="$options.i18n.areaLabel">
+ <markdown-field
+ :can-attach-file="false"
+ :add-spacing-classes="false"
+ :show-comment-tool-bar="false"
+ :textarea-value="timelineText"
+ :restricted-tool-bar-items="$options.restrictedToolBarItems"
+ markdown-docs-path=""
+ :enable-preview="false"
+ class="bordered-box gl-mt-0"
+ >
+ <template #textarea>
+ <textarea
+ v-model="timelineText"
+ class="note-textarea js-gfm-input js-autosize markdown-area"
+ dir="auto"
+ data-supports-quick-actions="false"
+ :aria-label="__('Description')"
+ :placeholder="$options.i18n.areaPlaceholder"
+ >
+ </textarea>
+ </template>
+ </markdown-field>
+ </gl-form-group>
+ </div>
+ <gl-form-group class="gl-mb-0">
+ <gl-button
+ variant="confirm"
+ category="primary"
+ class="gl-mr-3"
+ :loading="createTimelineEventActive"
+ @click="createIncidentTimelineEvent(true)"
+ >
+ {{ __('Save') }}
+ </gl-button>
+ <gl-button
+ variant="confirm"
+ category="secondary"
+ class="gl-mr-3 gl-ml-n2"
+ :loading="createTimelineEventActive"
+ @click="createIncidentTimelineEvent(false)"
+ >
+ {{ $options.i18n.saveAndAdd }}
+ </gl-button>
+ <gl-button
+ class="gl-ml-n2"
+ :disabled="createTimelineEventActive"
+ @click="hideIncidentTimelineEventForm"
+ >
+ {{ __('Cancel') }}
+ </gl-button>
+ <div class="gl-border-b gl-pt-5"></div>
+ </gl-form-group>
+ </form>
+ </div>
+</template>
diff --git a/app/assets/javascripts/issues/show/components/incidents/timeline_events_list.vue b/app/assets/javascripts/issues/show/components/incidents/timeline_events_list.vue
index a6e58ee0bdc..519c0d402a0 100644
--- a/app/assets/javascripts/issues/show/components/incidents/timeline_events_list.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/timeline_events_list.vue
@@ -1,9 +1,16 @@
<script>
import { formatDate } from '~/lib/utils/datetime_utility';
+import { createAlert } from '~/flash';
+import { sprintf } from '~/locale';
+import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
+import { ignoreWhilePending } from '~/lib/utils/ignore_while_pending';
import IncidentTimelineEventListItem from './timeline_events_list_item.vue';
+import deleteTimelineEvent from './graphql/queries/delete_timeline_event.mutation.graphql';
+import { timelineListI18n } from './constants';
export default {
name: 'IncidentTimelineEventList',
+ i18n: timelineListI18n,
components: {
IncidentTimelineEventListItem,
},
@@ -43,6 +50,41 @@ export default {
}
return eventIndex === events.length - 1;
},
+ handleDelete: ignoreWhilePending(async function handleDelete(event) {
+ const msg = this.$options.i18n.deleteModal;
+
+ const confirmed = await confirmAction(msg, {
+ primaryBtnVariant: 'danger',
+ primaryBtnText: this.$options.i18n.deleteButton,
+ });
+
+ if (!confirmed) {
+ return;
+ }
+
+ try {
+ const result = await this.$apollo.mutate({
+ mutation: deleteTimelineEvent,
+ variables: {
+ input: {
+ id: event.id,
+ },
+ },
+ update: (cache) => {
+ const cacheId = cache.identify(event);
+ cache.evict({ id: cacheId });
+ },
+ });
+ const { errors } = result.data.timelineEventDestroy;
+ if (errors?.length) {
+ createAlert({
+ message: sprintf(this.$options.i18n.deleteError, { error: errors.join('. ') }, false),
+ });
+ }
+ } catch (error) {
+ createAlert({ message: this.$options.i18n.deleteErrorGeneric, captureError: true, error });
+ }
+ }),
},
};
</script>
@@ -65,7 +107,7 @@ export default {
:occurred-at="event.occurredAt"
:note-html="event.noteHtml"
:is-last-item="isLastItem(dateGroupedEvents, groupIndex, events, eventIndex)"
- data-testid="timeline-event"
+ @delete="handleDelete(event)"
/>
</ul>
</div>
diff --git a/app/assets/javascripts/issues/show/components/incidents/timeline_events_list_item.vue b/app/assets/javascripts/issues/show/components/incidents/timeline_events_list_item.vue
index fef9bf713b7..62ccd696ef6 100644
--- a/app/assets/javascripts/issues/show/components/incidents/timeline_events_list_item.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/timeline_events_list_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon, GlSafeHtmlDirective, GlSprintf } from '@gitlab/ui';
+import { GlDropdown, GlDropdownItem, GlIcon, GlSafeHtmlDirective, GlSprintf } from '@gitlab/ui';
import { formatDate } from '~/lib/utils/datetime_utility';
import { __ } from '~/locale';
import { getEventIcon } from './utils';
@@ -7,15 +7,20 @@ import { getEventIcon } from './utils';
export default {
name: 'IncidentTimelineEventListItem',
i18n: {
+ delete: __('Delete'),
+ moreActions: __('More actions'),
timeUTC: __('%{time} UTC'),
},
components: {
+ GlDropdown,
+ GlDropdownItem,
GlIcon,
GlSprintf,
},
directives: {
SafeHtml: GlSafeHtmlDirective,
},
+ inject: ['canUpdate'],
props: {
isLastItem: {
type: Boolean,
@@ -55,16 +60,32 @@ export default {
<gl-icon :name="getEventIcon(action)" class="note-icon" />
</div>
<div
- class="timeline-event-note gl-w-full"
+ class="timeline-event-note gl-w-full gl-display-flex gl-flex-direction-row"
:class="{ 'gl-pb-3 gl-border-gray-50 gl-border-1 gl-border-b-solid': !isLastItem }"
data-testid="event-text-container"
>
- <strong class="gl-font-lg" data-testid="event-time">
- <gl-sprintf :message="$options.i18n.timeUTC">
- <template #time>{{ time }}</template>
- </gl-sprintf>
- </strong>
- <div v-safe-html="noteHtml"></div>
+ <div>
+ <strong class="gl-font-lg" data-testid="event-time">
+ <gl-sprintf :message="$options.i18n.timeUTC">
+ <template #time>{{ time }}</template>
+ </gl-sprintf>
+ </strong>
+ <div v-safe-html="noteHtml"></div>
+ </div>
+ <gl-dropdown
+ v-if="canUpdate"
+ right
+ class="event-note-actions gl-ml-auto gl-align-self-center"
+ icon="ellipsis_v"
+ text-sr-only
+ :text="$options.i18n.moreActions"
+ category="tertiary"
+ no-caret
+ >
+ <gl-dropdown-item @click="$emit('delete')">
+ {{ $options.i18n.delete }}
+ </gl-dropdown-item>
+ </gl-dropdown>
</div>
</div>
</li>
diff --git a/app/assets/javascripts/issues/show/components/incidents/timeline_events_tab.vue b/app/assets/javascripts/issues/show/components/incidents/timeline_events_tab.vue
index 400e1f0b725..e1946ef4d07 100644
--- a/app/assets/javascripts/issues/show/components/incidents/timeline_events_tab.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/timeline_events_tab.vue
@@ -1,23 +1,29 @@
<script>
-import { GlEmptyState, GlLoadingIcon, GlTab } from '@gitlab/ui';
+import { GlButton, GlEmptyState, GlLoadingIcon, GlTab } from '@gitlab/ui';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { TYPE_ISSUE } from '~/graphql_shared/constants';
import { fetchPolicies } from '~/lib/graphql';
import getTimelineEvents from './graphql/queries/get_timeline_events.query.graphql';
import { displayAndLogError } from './utils';
+import { timelineTabI18n } from './constants';
+import IncidentTimelineEventForm from './timeline_events_form.vue';
import IncidentTimelineEventsList from './timeline_events_list.vue';
export default {
components: {
+ GlButton,
GlEmptyState,
GlLoadingIcon,
GlTab,
+ IncidentTimelineEventForm,
IncidentTimelineEventsList,
},
- inject: ['fullPath', 'issuableId'],
+ i18n: timelineTabI18n,
+ inject: ['canUpdate', 'fullPath', 'issuableId'],
data() {
return {
+ isEventFormVisible: false,
timelineEvents: [],
};
},
@@ -50,21 +56,43 @@ export default {
return !this.timelineEventLoading && !this.hasTimelineEvents;
},
},
+ methods: {
+ hideEventForm() {
+ this.isEventFormVisible = false;
+ },
+ async showEventForm() {
+ this.$refs.eventForm.clear();
+ this.isEventFormVisible = true;
+ await this.$nextTick();
+ this.$refs.eventForm.focusDate();
+ },
+ },
};
</script>
<template>
- <gl-tab :title="s__('Incident|Timeline')">
+ <gl-tab :title="$options.i18n.title">
<gl-loading-icon v-if="timelineEventLoading" size="lg" color="dark" class="gl-mt-5" />
<gl-empty-state
v-else-if="showEmptyState"
:compact="true"
- :description="s__('Incident|No timeline items have been added yet.')"
+ :description="$options.i18n.emptyDescription"
/>
<incident-timeline-events-list
v-if="hasTimelineEvents"
:timeline-event-loading="timelineEventLoading"
:timeline-events="timelineEvents"
/>
+ <incident-timeline-event-form
+ v-show="isEventFormVisible"
+ ref="eventForm"
+ :has-timeline-events="hasTimelineEvents"
+ class="timeline-event-note timeline-event-note-form"
+ :class="{ 'gl-pl-0': !hasTimelineEvents }"
+ @hide-incident-timeline-event-form="hideEventForm"
+ />
+ <gl-button v-if="canUpdate" variant="default" class="gl-mb-3 gl-mt-7" @click="showEventForm">
+ {{ $options.i18n.addEventButton }}
+ </gl-button>
</gl-tab>
</template>
diff --git a/app/assets/javascripts/issues/show/components/incidents/utils.js b/app/assets/javascripts/issues/show/components/incidents/utils.js
index 8b5a2ec4031..256e3025f19 100644
--- a/app/assets/javascripts/issues/show/components/incidents/utils.js
+++ b/app/assets/javascripts/issues/show/components/incidents/utils.js
@@ -10,9 +10,23 @@ export const displayAndLogError = (error) =>
const EVENT_ICONS = {
comment: 'comment',
+ issues: 'issues',
+ status: 'status',
default: 'comment',
};
export const getEventIcon = (actionName) => {
return EVENT_ICONS[actionName] ?? EVENT_ICONS.default;
};
+
+/**
+ * Returns a date shifted by the current timezone offset. Allows
+ * date.getHours() and similar to return UTC values.
+ *
+ * @returns {Date}
+ */
+export const getUtcShiftedDateNow = () => {
+ const date = new Date();
+ date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
+ return date;
+};
diff --git a/app/assets/javascripts/issues/show/components/title.vue b/app/assets/javascripts/issues/show/components/title.vue
index 7f67b31b122..307d9f9f69a 100644
--- a/app/assets/javascripts/issues/show/components/title.vue
+++ b/app/assets/javascripts/issues/show/components/title.vue
@@ -74,14 +74,15 @@ export default {
'issue-realtime-pre-pulse': preAnimation,
'issue-realtime-trigger-pulse': pulseAnimation,
}"
- class="title qa-title gl-font-size-h-display"
+ class="title gl-font-size-h-display"
+ data-qa-selector="title_content"
dir="auto"
></h1>
<gl-button
v-if="showInlineEditButton && canUpdate"
v-gl-tooltip.bottom
icon="pencil"
- class="btn-edit js-issuable-edit qa-edit-button"
+ class="btn-edit js-issuable-edit"
:title="$options.i18n.editTitleAndDescription"
:aria-label="$options.i18n.editTitleAndDescription"
@click="edit"
diff --git a/app/assets/javascripts/issues/show/index.js b/app/assets/javascripts/issues/show/index.js
index 5bdad010af7..459a3804837 100644
--- a/app/assets/javascripts/issues/show/index.js
+++ b/app/assets/javascripts/issues/show/index.js
@@ -63,6 +63,7 @@ export function initIncidentApp(issueData = {}) {
return createElement(IssueApp, {
props: {
...issueData,
+ issueId: Number(issuableId),
issuableStatus: state,
descriptionComponent: IncidentTabs,
showTitleBorder: false,
diff --git a/app/assets/javascripts/jobs/bridge/app.vue b/app/assets/javascripts/jobs/bridge/app.vue
deleted file mode 100644
index c639e49083b..00000000000
--- a/app/assets/javascripts/jobs/bridge/app.vue
+++ /dev/null
@@ -1,118 +0,0 @@
-<script>
-import { GlLoadingIcon } from '@gitlab/ui';
-import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { __, sprintf } from '~/locale';
-import CiHeader from '~/vue_shared/components/header_ci_component.vue';
-import getPipelineQuery from './graphql/queries/pipeline.query.graphql';
-import BridgeEmptyState from './components/empty_state.vue';
-import BridgeSidebar from './components/sidebar.vue';
-import { SIDEBAR_COLLAPSE_BREAKPOINTS } from './components/constants';
-
-export default {
- name: 'BridgePageApp',
- components: {
- BridgeEmptyState,
- BridgeSidebar,
- CiHeader,
- GlLoadingIcon,
- },
- inject: ['buildId', 'projectFullPath', 'pipelineIid'],
- apollo: {
- pipeline: {
- query: getPipelineQuery,
- variables() {
- return {
- fullPath: this.projectFullPath,
- iid: this.pipelineIid,
- };
- },
- update(data) {
- if (!data?.project?.pipeline) {
- return null;
- }
-
- const { pipeline } = data.project;
- const stages = pipeline?.stages.edges.map((edge) => edge.node) || [];
- const jobs = stages.map((stage) => stage.jobs.nodes).flat();
-
- return {
- ...pipeline,
- commit: {
- ...pipeline.commit,
- commit_path: pipeline.commit.webPath,
- short_id: pipeline.commit.shortId,
- },
- id: getIdFromGraphQLId(pipeline.id),
- jobs,
- stages,
- };
- },
- },
- },
- data() {
- return {
- isSidebarExpanded: true,
- pipeline: {},
- };
- },
- computed: {
- bridgeJob() {
- return (
- this.pipeline.jobs?.filter(
- (job) => getIdFromGraphQLId(job.id) === Number(this.buildId),
- )[0] || {}
- );
- },
- bridgeName() {
- return sprintf(__('Job %{jobName}'), { jobName: this.bridgeJob.name });
- },
- isPipelineLoading() {
- return this.$apollo.queries.pipeline.loading;
- },
- },
- created() {
- window.addEventListener('resize', this.onResize);
- },
- mounted() {
- this.onResize();
- },
- methods: {
- toggleSidebar() {
- this.isSidebarExpanded = !this.isSidebarExpanded;
- },
- onResize() {
- const breakpoint = bp.getBreakpointSize();
- if (SIDEBAR_COLLAPSE_BREAKPOINTS.includes(breakpoint)) {
- this.isSidebarExpanded = false;
- } else if (!this.isSidebarExpanded) {
- this.isSidebarExpanded = true;
- }
- },
- },
-};
-</script>
-<template>
- <div>
- <gl-loading-icon v-if="isPipelineLoading" size="lg" class="gl-mt-4" />
- <div v-else>
- <ci-header
- class="gl-border-b-1 gl-border-b-solid gl-border-b-gray-100"
- :status="bridgeJob.detailedStatus"
- :time="bridgeJob.createdAt"
- :user="pipeline.user"
- :has-sidebar-button="true"
- :item-name="bridgeName"
- @clickedSidebarButton="toggleSidebar"
- />
- <bridge-empty-state :downstream-pipeline-path="bridgeJob.downstreamPipeline.path" />
- <bridge-sidebar
- v-if="isSidebarExpanded"
- :bridge-job="bridgeJob"
- :commit="pipeline.commit"
- :is-sidebar-expanded="isSidebarExpanded"
- @toggleSidebar="toggleSidebar"
- />
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/jobs/bridge/components/constants.js b/app/assets/javascripts/jobs/bridge/components/constants.js
deleted file mode 100644
index 33310b3157a..00000000000
--- a/app/assets/javascripts/jobs/bridge/components/constants.js
+++ /dev/null
@@ -1 +0,0 @@
-export const SIDEBAR_COLLAPSE_BREAKPOINTS = ['xs', 'sm'];
diff --git a/app/assets/javascripts/jobs/bridge/components/empty_state.vue b/app/assets/javascripts/jobs/bridge/components/empty_state.vue
deleted file mode 100644
index bd07d863719..00000000000
--- a/app/assets/javascripts/jobs/bridge/components/empty_state.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-<script>
-import { GlButton } from '@gitlab/ui';
-import { __ } from '~/locale';
-
-export default {
- name: 'BridgeEmptyState',
- i18n: {
- title: __('This job triggers a downstream pipeline'),
- linkBtnText: __('View downstream pipeline'),
- },
- components: {
- GlButton,
- },
- inject: {
- emptyStateIllustrationPath: {
- type: String,
- require: true,
- },
- },
- props: {
- downstreamPipelinePath: {
- type: String,
- required: false,
- default: undefined,
- },
- },
-};
-</script>
-
-<template>
- <div class="gl-display-flex gl-flex-direction-column gl-align-items-center gl-mt-11">
- <img :src="emptyStateIllustrationPath" />
- <h1 class="gl-font-size-h1">{{ $options.i18n.title }}</h1>
- <gl-button
- v-if="downstreamPipelinePath"
- class="gl-mt-3"
- category="secondary"
- variant="confirm"
- size="medium"
- :href="downstreamPipelinePath"
- >
- {{ $options.i18n.linkBtnText }}
- </gl-button>
- </div>
-</template>
diff --git a/app/assets/javascripts/jobs/bridge/components/sidebar.vue b/app/assets/javascripts/jobs/bridge/components/sidebar.vue
deleted file mode 100644
index 3ba07cf55d1..00000000000
--- a/app/assets/javascripts/jobs/bridge/components/sidebar.vue
+++ /dev/null
@@ -1,105 +0,0 @@
-<script>
-import { GlButton, GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { __ } from '~/locale';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
-import { JOB_SIDEBAR } from '../../constants';
-import CommitBlock from '../../components/commit_block.vue';
-
-export default {
- styles: {
- width: '290px',
- },
- name: 'BridgeSidebar',
- i18n: {
- ...JOB_SIDEBAR,
- retryButton: __('Retry'),
- retryTriggerJob: __('Retry the trigger job'),
- retryDownstreamPipeline: __('Retry the downstream pipeline'),
- },
- sectionClass: ['gl-border-t-solid', 'gl-border-t-1', 'gl-border-t-gray-100', 'gl-py-5'],
- components: {
- CommitBlock,
- GlButton,
- GlDropdown,
- GlDropdownItem,
- TooltipOnTruncate,
- },
- mixins: [glFeatureFlagsMixin()],
- props: {
- bridgeJob: {
- type: Object,
- required: true,
- },
- commit: {
- type: Object,
- required: true,
- },
- },
- data() {
- return {
- topPosition: 0,
- };
- },
- computed: {
- rootStyle() {
- return { ...this.$options.styles, top: `${this.topPosition}px` };
- },
- },
- mounted() {
- this.setTopPosition();
- },
- methods: {
- onSidebarButtonClick() {
- this.$emit('toggleSidebar');
- },
- setTopPosition() {
- const navbarEl = document.querySelector('.js-navbar');
-
- if (navbarEl) {
- this.topPosition = navbarEl.getBoundingClientRect().bottom;
- }
- },
- },
-};
-</script>
-<template>
- <aside
- class="gl-fixed gl-right-0 gl-px-5 gl-bg-gray-10 gl-h-full gl-border-l-solid gl-border-1 gl-border-gray-100 gl-z-index-200 gl-overflow-hidden"
- :style="rootStyle"
- >
- <div class="gl-py-5 gl-display-flex gl-align-items-center">
- <tooltip-on-truncate :title="bridgeJob.name" truncate-target="child"
- ><h4 class="gl-mb-0 gl-mr-2 gl-text-truncate">
- {{ bridgeJob.name }}
- </h4>
- </tooltip-on-truncate>
- <!-- TODO: implement retry actions -->
- <div
- v-if="glFeatures.triggerJobRetryAction"
- class="gl-flex-grow-1 gl-flex-shrink-0 gl-text-right"
- >
- <gl-dropdown
- :text="$options.i18n.retryButton"
- category="primary"
- variant="confirm"
- right
- size="medium"
- >
- <gl-dropdown-item>{{ $options.i18n.retryTriggerJob }}</gl-dropdown-item>
- <gl-dropdown-item>{{ $options.i18n.retryDownstreamPipeline }}</gl-dropdown-item>
- </gl-dropdown>
- </div>
- <gl-button
- :aria-label="$options.i18n.toggleSidebar"
- data-testid="sidebar-expansion-toggle"
- category="tertiary"
- class="gl-md-display-none gl-ml-2"
- icon="chevron-double-lg-right"
- @click="onSidebarButtonClick"
- />
- </div>
- <commit-block :commit="commit" :class="$options.sectionClass" />
- <!-- TODO: show stage dropdown, jobs list -->
- </aside>
-</template>
diff --git a/app/assets/javascripts/jobs/bridge/graphql/queries/pipeline.query.graphql b/app/assets/javascripts/jobs/bridge/graphql/queries/pipeline.query.graphql
deleted file mode 100644
index 338ca9f16c7..00000000000
--- a/app/assets/javascripts/jobs/bridge/graphql/queries/pipeline.query.graphql
+++ /dev/null
@@ -1,70 +0,0 @@
-query getPipelineData($fullPath: ID!, $iid: ID!) {
- project(fullPath: $fullPath) {
- id
- pipeline(iid: $iid) {
- id
- iid
- path
- sha
- ref
- refPath
- commit {
- id
- shortId
- title
- webPath
- }
- detailedStatus {
- id
- icon
- group
- }
- stages {
- edges {
- node {
- id
- name
- jobs {
- nodes {
- id
- createdAt
- name
- scheduledAt
- startedAt
- status
- triggered
- detailedStatus {
- id
- detailsPath
- icon
- group
- text
- tooltip
- }
- downstreamPipeline {
- id
- path
- }
- stage {
- id
- name
- }
- }
- }
- }
- }
- }
- user {
- id
- avatarUrl
- name
- username
- webPath
- webUrl
- status {
- message
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/jobs/components/job_app.vue b/app/assets/javascripts/jobs/components/job_app.vue
index 396b015ad83..f9e6c64aad1 100644
--- a/app/assets/javascripts/jobs/components/job_app.vue
+++ b/app/assets/javascripts/jobs/components/job_app.vue
@@ -68,6 +68,11 @@ export default {
default: null,
},
},
+ data() {
+ return {
+ searchResults: [],
+ };
+ },
computed: {
...mapState([
'isLoading',
@@ -184,6 +189,9 @@ export default {
this.throttled();
},
+ setSearchResults(searchResults) {
+ this.searchResults = searchResults;
+ },
},
};
</script>
@@ -279,10 +287,12 @@ export default {
:is-scroll-top-disabled="isScrollTopDisabled"
:is-job-log-size-visible="isJobLogSizeVisible"
:is-scrolling-down="isScrollingDown"
+ :job-log="jobLog"
@scrollJobLogTop="scrollTop"
@scrollJobLogBottom="scrollBottom"
+ @searchResults="setSearchResults"
/>
- <log :job-log="jobLog" :is-complete="isJobLogComplete" />
+ <log :job-log="jobLog" :is-complete="isJobLogComplete" :search-results="searchResults" />
</div>
<!-- EO job log -->
diff --git a/app/assets/javascripts/jobs/components/job_log_controllers.vue b/app/assets/javascripts/jobs/components/job_log_controllers.vue
index eb6a284dfaf..5e89dd5acc2 100644
--- a/app/assets/javascripts/jobs/components/job_log_controllers.vue
+++ b/app/assets/javascripts/jobs/components/job_log_controllers.vue
@@ -1,21 +1,34 @@
<script>
-import { GlTooltipDirective, GlLink, GlButton } from '@gitlab/ui';
+import { GlTooltipDirective, GlLink, GlButton, GlSearchBoxByClick } from '@gitlab/ui';
+import { scrollToElement } from '~/lib/utils/common_utils';
import { numberToHumanSize } from '~/lib/utils/number_utils';
import { __, s__, sprintf } from '~/locale';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
i18n: {
scrollToBottomButtonLabel: s__('Job|Scroll to bottom'),
scrollToTopButtonLabel: s__('Job|Scroll to top'),
showRawButtonLabel: s__('Job|Show complete raw'),
+ searchPlaceholder: s__('Job|Search job log'),
+ noResults: s__('Job|No search results found'),
+ searchPopoverTitle: s__('Job|Job log search'),
+ searchPopoverDescription: s__(
+ 'Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size.',
+ ),
+ logLineNumberNotFound: s__('Job|We could not find this element'),
},
components: {
GlLink,
GlButton,
+ GlSearchBoxByClick,
+ HelpPopover,
},
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [glFeatureFlagMixin()],
props: {
size: {
type: Number,
@@ -42,6 +55,16 @@ export default {
type: Boolean,
required: true,
},
+ jobLog: {
+ type: Array,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ searchTerm: '',
+ searchResults: [],
+ };
},
computed: {
jobLogSize() {
@@ -49,6 +72,9 @@ export default {
size: numberToHumanSize(this.size),
});
},
+ showJobLogSearch() {
+ return this.glFeatures.jobLogSearch;
+ },
},
methods: {
handleScrollToTop() {
@@ -57,6 +83,54 @@ export default {
handleScrollToBottom() {
this.$emit('scrollJobLogBottom');
},
+ searchJobLog() {
+ this.searchResults = [];
+
+ if (!this.searchTerm) return;
+
+ const compactedLog = [];
+
+ this.jobLog.forEach((obj) => {
+ if (obj.lines && obj.lines.length > 0) {
+ compactedLog.push(...obj.lines);
+ }
+
+ if (!obj.lines && obj.content.length > 0) {
+ compactedLog.push(obj);
+ }
+ });
+
+ compactedLog.forEach((line) => {
+ const lineText = line.content[0].text;
+
+ if (lineText.toLocaleLowerCase().includes(this.searchTerm.toLocaleLowerCase())) {
+ this.searchResults.push(line);
+ }
+ });
+
+ if (this.searchResults.length > 0) {
+ this.$emit('searchResults', this.searchResults);
+
+ // BE returns zero based index, we need to add one to match the line numbers in the DOM
+ const firstSearchResult = `#L${this.searchResults[0].lineNumber + 1}`;
+ const logLine = document.querySelector(`.js-line ${firstSearchResult}`);
+
+ if (logLine) {
+ setTimeout(() => scrollToElement(logLine));
+
+ const message = sprintf(s__('Job|%{searchLength} results found for %{searchTerm}'), {
+ searchLength: this.searchResults.length,
+ searchTerm: this.searchTerm,
+ });
+
+ this.$toast.show(message);
+ } else {
+ this.$toast.show(this.$options.i18n.logLineNumberNotFound);
+ }
+ } else {
+ this.$toast.show(this.$options.i18n.noResults);
+ }
+ },
},
};
</script>
@@ -81,6 +155,25 @@ export default {
<!-- eo truncate information -->
<div class="controllers gl-float-right">
+ <template v-if="showJobLogSearch">
+ <gl-search-box-by-click
+ v-model="searchTerm"
+ class="gl-mr-3"
+ :placeholder="$options.i18n.searchPlaceholder"
+ data-testid="job-log-search-box"
+ @clear="$emit('searchResults', [])"
+ @submit="searchJobLog"
+ />
+
+ <help-popover class="gl-mr-3">
+ <template #title>{{ $options.i18n.searchPopoverTitle }}</template>
+
+ <p class="gl-mb-0">
+ {{ $options.i18n.searchPopoverDescription }}
+ </p>
+ </help-popover>
+ </template>
+
<!-- links -->
<gl-button
v-if="rawPath"
diff --git a/app/assets/javascripts/jobs/components/log/collapsible_section.vue b/app/assets/javascripts/jobs/components/log/collapsible_section.vue
index 757b2e458e9..13716b4d391 100644
--- a/app/assets/javascripts/jobs/components/log/collapsible_section.vue
+++ b/app/assets/javascripts/jobs/components/log/collapsible_section.vue
@@ -1,6 +1,4 @@
<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';
@@ -9,9 +7,7 @@ export default {
components: {
LogLine,
LogLineHeader,
- CollapsibleLogSection: () => import('./collapsible_section.vue'),
},
- mixins: [glFeatureFlagsMixin()],
props: {
section: {
type: Object,
@@ -21,14 +17,16 @@ export default {
type: String,
required: true,
},
+ searchResults: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
computed: {
badgeDuration() {
return this.section.line && this.section.line.section_duration;
},
- infinitelyCollapsibleSectionsFlag() {
- return this.glFeatures?.[INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF];
- },
},
methods: {
handleOnClickCollapsibleLine(section) {
@@ -47,26 +45,13 @@ export default {
@toggleLine="handleOnClickCollapsibleLine(section)"
/>
<template v-if="!section.isClosed">
- <template v-if="infinitelyCollapsibleSectionsFlag">
- <template v-for="line in section.lines">
- <collapsible-log-section
- v-if="line.isHeader"
- :key="line.line.offset"
- :section="line"
- :job-log-endpoint="jobLogEndpoint"
- @onClickCollapsibleLine="handleOnClickCollapsibleLine"
- />
- <log-line v-else :key="line.offset" :line="line" :path="jobLogEndpoint" />
- </template>
- </template>
- <template v-else>
- <log-line
- v-for="line in section.lines"
- :key="line.offset"
- :line="line"
- :path="jobLogEndpoint"
- />
- </template>
+ <log-line
+ v-for="line in section.lines"
+ :key="line.offset"
+ :line="line"
+ :path="jobLogEndpoint"
+ :search-results="searchResults"
+ />
</template>
</div>
</template>
diff --git a/app/assets/javascripts/jobs/components/log/line.vue b/app/assets/javascripts/jobs/components/log/line.vue
index 2d9714cd06b..36b350f4d64 100644
--- a/app/assets/javascripts/jobs/components/log/line.vue
+++ b/app/assets/javascripts/jobs/components/log/line.vue
@@ -14,9 +14,14 @@ export default {
type: String,
required: true,
},
+ searchResults: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
render(h, { props }) {
- const { line, path } = props;
+ const { line, path, searchResults } = props;
const chars = line.content.map((content) => {
return h(
@@ -46,15 +51,33 @@ export default {
);
});
- return h('div', { class: 'js-line log-line' }, [
- h(LineNumber, {
- props: {
- lineNumber: line.lineNumber,
- path,
- },
- }),
- ...chars,
- ]);
+ let applyHighlight = false;
+
+ if (searchResults.length > 0) {
+ const linesToHighlight = searchResults.map((searchResultLine) => searchResultLine.lineNumber);
+
+ linesToHighlight.forEach((num) => {
+ if (num === line.lineNumber) {
+ applyHighlight = true;
+ }
+ });
+ }
+
+ return h(
+ 'div',
+ {
+ class: ['js-line', 'log-line', applyHighlight ? 'gl-bg-gray-500' : ''],
+ },
+ [
+ h(LineNumber, {
+ props: {
+ lineNumber: line.lineNumber,
+ path,
+ },
+ }),
+ ...chars,
+ ],
+ );
},
};
</script>
diff --git a/app/assets/javascripts/jobs/components/log/line_number.vue b/app/assets/javascripts/jobs/components/log/line_number.vue
index c8ceac2c7ff..7ca9154d2fe 100644
--- a/app/assets/javascripts/jobs/components/log/line_number.vue
+++ b/app/assets/javascripts/jobs/components/log/line_number.vue
@@ -1,6 +1,4 @@
<script>
-import { INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF } from '../../constants';
-
export default {
functional: true,
props: {
@@ -16,9 +14,7 @@ export default {
render(h, { props }) {
const { lineNumber, path } = props;
- const parsedLineNumber = gon.features?.[INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF]
- ? lineNumber
- : lineNumber + 1;
+ const parsedLineNumber = lineNumber + 1;
const lineId = `L${parsedLineNumber}`;
const lineHref = `${path}#${lineId}`;
diff --git a/app/assets/javascripts/jobs/components/log/log.vue b/app/assets/javascripts/jobs/components/log/log.vue
index ef95d79b8ab..9647582b81d 100644
--- a/app/assets/javascripts/jobs/components/log/log.vue
+++ b/app/assets/javascripts/jobs/components/log/log.vue
@@ -8,6 +8,13 @@ export default {
CollapsibleLogSection,
LogLine,
},
+ props: {
+ searchResults: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ },
computed: {
...mapState([
'jobLogEndpoint',
@@ -56,9 +63,16 @@ export default {
:key="`collapsible-${index}`"
:section="section"
:job-log-endpoint="jobLogEndpoint"
+ :search-results="searchResults"
@onClickCollapsibleLine="handleOnClickCollapsibleLine"
/>
- <log-line v-else :key="section.offset" :line="section" :path="jobLogEndpoint" />
+ <log-line
+ v-else
+ :key="section.offset"
+ :line="section"
+ :path="jobLogEndpoint"
+ :search-results="searchResults"
+ />
</template>
<div v-if="!isJobLogComplete" class="js-log-animation loader-animation pt-3 pl-3">
diff --git a/app/assets/javascripts/jobs/components/sidebar.vue b/app/assets/javascripts/jobs/components/sidebar.vue
index cc099dba72f..a42e45ee7e4 100644
--- a/app/assets/javascripts/jobs/components/sidebar.vue
+++ b/app/assets/javascripts/jobs/components/sidebar.vue
@@ -89,7 +89,7 @@ export default {
<div class="blocks-container">
<div class="gl-py-5 gl-display-flex gl-align-items-center">
<tooltip-on-truncate :title="job.name" truncate-target="child"
- ><h4 class="my-0 mr-2 gl-text-truncate">
+ ><h4 class="gl-my-0 gl-mr-3 gl-text-truncate">
{{ job.name }}
</h4>
</tooltip-on-truncate>
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 2ba531c9e95..15c4e503685 100644
--- a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
+++ b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
@@ -42,14 +42,11 @@ export default {
this.job.duration ||
this.job.finished_at ||
this.job.erased_at ||
- this.job.queued ||
+ this.job.queued_duration ||
this.job.runner ||
this.job.coverage,
);
},
- queued() {
- return timeIntervalInWords(this.job.queued);
- },
runnerHelpUrl() {
return helpPagePath('ci/runners/configure_runners.html', {
anchor: 'set-maximum-job-timeout-for-a-runner',
@@ -60,6 +57,9 @@ export default {
return `#${id} (${token}) ${description}`;
},
+ queuedDuration() {
+ return timeIntervalInWords(this.job.queued_duration);
+ },
shouldRenderBlock() {
return Boolean(this.hasAnyDetail || this.hasTimeout || this.hasTags);
},
@@ -98,7 +98,7 @@ export default {
:title="$options.i18n.FINISHED"
/>
<detail-row v-if="job.erased_at" :value="erasedAt" :title="$options.i18n.ERASED" />
- <detail-row v-if="job.queued" :value="queued" :title="$options.i18n.QUEUED" />
+ <detail-row v-if="job.queued_duration" :value="queuedDuration" :title="$options.i18n.QUEUED" />
<detail-row
v-if="hasTimeout"
:help-url="runnerHelpUrl"
diff --git a/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue b/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
index 02aeb46a22b..6f351d91165 100644
--- a/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
+++ b/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
@@ -222,7 +222,7 @@ export default {
/>
<gl-button
v-else-if="isRetryable"
- icon="repeat"
+ icon="retry"
:title="$options.ACTIONS_RETRY"
:aria-label="$options.ACTIONS_RETRY"
:method="currentJobMethod"
diff --git a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
index f3ca958b3ca..5b1032c6448 100644
--- a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
+++ b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
@@ -1,8 +1,8 @@
-query getJobs($fullPath: ID!, $after: String, $statuses: [CiJobStatus!]) {
+query getJobs($fullPath: ID!, $after: String, $first: Int = 30, $statuses: [CiJobStatus!]) {
project(fullPath: $fullPath) {
id
__typename
- jobs(after: $after, first: 30, statuses: $statuses) {
+ jobs(after: $after, first: $first, statuses: $statuses) {
count
pageInfo {
endCursor
diff --git a/app/assets/javascripts/jobs/components/table/jobs_table.vue b/app/assets/javascripts/jobs/components/table/jobs_table.vue
index f513d2090fa..d8c5c292f52 100644
--- a/app/assets/javascripts/jobs/components/table/jobs_table.vue
+++ b/app/assets/javascripts/jobs/components/table/jobs_table.vue
@@ -45,6 +45,7 @@ export default {
:fields="tableFields"
:tbody-tr-attr="{ 'data-testid': 'jobs-table-row' }"
:empty-text="$options.i18n.emptyText"
+ data-testid="jobs-table"
show-empty
stacked="lg"
fixed
diff --git a/app/assets/javascripts/jobs/components/table/jobs_table_app.vue b/app/assets/javascripts/jobs/components/table/jobs_table_app.vue
index 1ac1a2d68e2..b3db5a94ac5 100644
--- a/app/assets/javascripts/jobs/components/table/jobs_table_app.vue
+++ b/app/assets/javascripts/jobs/components/table/jobs_table_app.vue
@@ -2,7 +2,6 @@
import { GlAlert, GlSkeletonLoader, GlIntersectionObserver, GlLoadingIcon } from '@gitlab/ui';
import { __ } from '~/locale';
import createFlash from '~/flash';
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import JobsFilteredSearch from '../filtered_search/jobs_filtered_search.vue';
import eventHub from './event_hub';
import GetJobs from './graphql/queries/get_jobs.query.graphql';
@@ -28,7 +27,6 @@ export default {
GlIntersectionObserver,
GlLoadingIcon,
},
- mixins: [glFeatureFlagMixin()],
inject: {
fullPath: {
default: '',
@@ -93,7 +91,7 @@ export default {
return this.loading && !this.showLoadingSpinner;
},
showFilteredSearch() {
- return this.glFeatures?.jobsTableVueSearch && !this.scope;
+ return !this.scope;
},
jobsCount() {
return this.jobs.count;
diff --git a/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue b/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
index 27e3b8028b7..68c6c669a1a 100644
--- a/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
+++ b/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
@@ -1,6 +1,7 @@
<script>
import { GlBadge, GlTab, GlTabs, GlLoadingIcon } from '@gitlab/ui';
import { s__ } from '~/locale';
+import { limitedCounterWithDelimiter } from '~/lib/utils/text_utility';
export default {
components: {
@@ -29,7 +30,7 @@ export default {
return [
{
text: s__('Jobs|All'),
- count: this.allJobsCount,
+ count: limitedCounterWithDelimiter(this.allJobsCount),
scope: null,
testId: 'jobs-all-tab',
showBadge: true,
diff --git a/app/assets/javascripts/jobs/constants.js b/app/assets/javascripts/jobs/constants.js
index 97f31eee57c..3040d4e2379 100644
--- a/app/assets/javascripts/jobs/constants.js
+++ b/app/assets/javascripts/jobs/constants.js
@@ -24,5 +24,3 @@ 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 26dd38bbe08..5c63ad96ad0 100644
--- a/app/assets/javascripts/jobs/index.js
+++ b/app/assets/javascripts/jobs/index.js
@@ -1,10 +1,10 @@
+import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import createDefaultClient from '~/lib/graphql';
-import BridgeApp from './bridge/app.vue';
import JobApp from './components/job_app.vue';
import createStore from './store';
+Vue.use(GlToast);
+
const initializeJobPage = (element) => {
const store = createStore();
@@ -51,43 +51,7 @@ const initializeJobPage = (element) => {
});
};
-const initializeBridgePage = (el) => {
- const {
- buildId,
- downstreamPipelinePath,
- emptyStateIllustrationPath,
- pipelineIid,
- projectFullPath,
- } = el.dataset;
-
- Vue.use(VueApollo);
- const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
- });
-
- return new Vue({
- el,
- apolloProvider,
- provide: {
- buildId,
- downstreamPipelinePath,
- emptyStateIllustrationPath,
- pipelineIid,
- projectFullPath,
- },
- render(h) {
- return h(BridgeApp);
- },
- });
-};
-
export default () => {
const jobElement = document.getElementById('js-job-page');
- const bridgeElement = document.getElementById('js-bridge-page');
-
- if (jobElement) {
- initializeJobPage(jobElement);
- } else {
- initializeBridgePage(bridgeElement);
- }
+ initializeJobPage(jobElement);
};
diff --git a/app/assets/javascripts/jobs/store/mutations.js b/app/assets/javascripts/jobs/store/mutations.js
index eda2ee0349a..87c00ad4d70 100644
--- a/app/assets/javascripts/jobs/store/mutations.js
+++ b/app/assets/javascripts/jobs/store/mutations.js
@@ -1,7 +1,6 @@
import Vue from 'vue';
-import { INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF } from '../constants';
import * as types from './mutation_types';
-import { logLinesParser, logLinesParserLegacy, updateIncrementalJobLog } from './utils';
+import { logLinesParser, updateIncrementalJobLog } from './utils';
export default {
[types.SET_JOB_ENDPOINT](state, endpoint) {
@@ -21,26 +20,12 @@ export default {
},
[types.RECEIVE_JOB_LOG_SUCCESS](state, log = {}) {
- const infinitelyCollapsibleSectionsFlag =
- gon.features?.[INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF];
if (log.state) {
state.jobLogState = log.state;
}
if (log.append) {
- if (infinitelyCollapsibleSectionsFlag) {
- if (log.lines) {
- const parsedResult = logLinesParser(
- log.lines,
- state.auxiliaryPartialJobLogHelpers,
- state.jobLog,
- );
- state.jobLog = parsedResult.parsedLines;
- state.auxiliaryPartialJobLogHelpers = parsedResult.auxiliaryPartialJobLogHelpers;
- }
- } else {
- state.jobLog = log.lines ? updateIncrementalJobLog(log.lines, state.jobLog) : state.jobLog;
- }
+ state.jobLog = log.lines ? updateIncrementalJobLog(log.lines, state.jobLog) : state.jobLog;
state.jobLogSize += log.size;
} else {
@@ -49,13 +34,7 @@ export default {
// html or size. We keep the old value otherwise these
// will be set to `null`
- if (infinitelyCollapsibleSectionsFlag) {
- const parsedResult = logLinesParser(log.lines);
- state.jobLog = parsedResult.parsedLines;
- state.auxiliaryPartialJobLogHelpers = parsedResult.auxiliaryPartialJobLogHelpers;
- } else {
- state.jobLog = log.lines ? logLinesParserLegacy(log.lines) : state.jobLog;
- }
+ state.jobLog = log.lines ? logLinesParser(log.lines) : state.jobLog;
state.jobLogSize = log.size || state.jobLogSize;
}
diff --git a/app/assets/javascripts/jobs/store/state.js b/app/assets/javascripts/jobs/store/state.js
index a1ba64aa71e..dfff65c364d 100644
--- a/app/assets/javascripts/jobs/store/state.js
+++ b/app/assets/javascripts/jobs/store/state.js
@@ -30,7 +30,4 @@ export default () => ({
selectedStage: '',
stages: [],
jobs: [],
-
- // to parse partial logs
- auxiliaryPartialJobLogHelpers: {},
});
diff --git a/app/assets/javascripts/jobs/store/utils.js b/app/assets/javascripts/jobs/store/utils.js
index 7dfe24afa23..a7b95154c1b 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 logLinesParserLegacy = (lines = [], accumulator = []) =>
+export const logLinesParser = (lines = [], accumulator = []) =>
lines.reduce(
(acc, line, index) => {
const lineNumber = accumulator.length > 0 ? getIncrementalLineNumber(acc) : index;
@@ -131,82 +131,6 @@ export const logLinesParserLegacy = (lines = [], accumulator = []) =>
[...accumulator],
);
-export const logLinesParser = (lines = [], previousJobLogState = {}, prevParsedLines = []) => {
- let currentLineCount = previousJobLogState?.prevLineCount ?? 0;
- let currentHeader = previousJobLogState?.currentHeader;
- let isPreviousLineHeader = previousJobLogState?.isPreviousLineHeader ?? false;
- const parsedLines = prevParsedLines.length > 0 ? prevParsedLines : [];
- const sectionsQueue = previousJobLogState?.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
- currentLineCount = previousJobLogState?.prevLineCount ? currentLineCount + 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, currentLineCount));
- 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, currentLineCount); // 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, currentLineCount));
- } else {
- // Otherwise add it to the innermost collapsible section lines array
- currentHeader.lines.push(parseLine(line, currentLineCount));
- }
- } 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 if (currentHeader?.isHeader) {
- 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 {
- // On older job logs, there's no `section_header: true` response, it's just an object
- // with the `section_duration` and `section` props, so we just parse it
- // as a standard line
- parsedLines.push(parseLine(line, currentLineCount));
- }
- } else {
- parsedLines.push(parseLine(line, currentLineCount));
- }
- }
-
- return {
- parsedLines,
- auxiliaryPartialJobLogHelpers: {
- isPreviousLineHeader,
- currentHeader,
- sectionsQueue,
- prevLineCount: currentLineCount,
- },
- };
-};
-
/**
* Finds the repeated offset, removes the old one
*
@@ -253,5 +177,5 @@ export const findOffsetAndRemove = (newLog = [], oldParsed = []) => {
export const updateIncrementalJobLog = (newLog = [], oldParsed = []) => {
const parsedLog = findOffsetAndRemove(newLog, oldParsed);
- return logLinesParserLegacy(newLog, parsedLog);
+ return logLinesParser(newLog, parsedLog);
};
diff --git a/app/assets/javascripts/lib/dompurify.js b/app/assets/javascripts/lib/dompurify.js
index 4959550e273..a01c6df0003 100644
--- a/app/assets/javascripts/lib/dompurify.js
+++ b/app/assets/javascripts/lib/dompurify.js
@@ -8,6 +8,7 @@ const defaultConfig = {
// See https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1421
FORBID_ATTR: ['data-remote', 'data-url', 'data-type', 'data-method'],
FORBID_TAGS: ['style', 'mstyle'],
+ ALLOW_UNKNOWN_PROTOCOLS: true,
};
// Only icons urls from `gon` are allowed
diff --git a/app/assets/javascripts/lib/gfm/index.js b/app/assets/javascripts/lib/gfm/index.js
index b4f941294de..92118c8929f 100644
--- a/app/assets/javascripts/lib/gfm/index.js
+++ b/app/assets/javascripts/lib/gfm/index.js
@@ -1,30 +1,34 @@
+import { pick } from 'lodash';
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkGfm from 'remark-gfm';
import remarkRehype, { all } from 'remark-rehype';
import rehypeRaw from 'rehype-raw';
-const createParser = () => {
+const skipRenderingHandlers = {
+ footnoteReference: (h, node) =>
+ h(node.position, 'footnoteReference', { identifier: node.identifier, label: node.label }, []),
+ footnoteDefinition: (h, node) =>
+ h(
+ node.position,
+ 'footnoteDefinition',
+ { identifier: node.identifier, label: node.label },
+ all(h, node),
+ ),
+ code: (h, node) =>
+ h(node.position, 'codeBlock', { language: node.lang, meta: node.meta }, [
+ { type: 'text', value: node.value },
+ ]),
+};
+
+const createParser = ({ skipRendering = [] }) => {
return unified()
.use(remarkParse)
.use(remarkGfm)
.use(remarkRehype, {
allowDangerousHtml: true,
handlers: {
- footnoteReference: (h, node) =>
- h(
- node.position,
- 'footnoteReference',
- { identifier: node.identifier, label: node.label },
- [],
- ),
- footnoteDefinition: (h, node) =>
- h(
- node.position,
- 'footnoteDefinition',
- { identifier: node.identifier, label: node.label },
- all(h, node),
- ),
+ ...pick(skipRenderingHandlers, skipRendering),
},
})
.use(rehypeRaw);
@@ -54,8 +58,10 @@ const compilerFactory = (renderer) =>
* @returns {Promise<any>} Returns a promise with the result of rendering
* the MDast tree
*/
-export const render = async ({ markdown, renderer }) => {
- const { result } = await createParser().use(compilerFactory(renderer)).process(markdown);
+export const render = async ({ markdown, renderer, skipRendering = [] }) => {
+ const { result } = await createParser({ skipRendering })
+ .use(compilerFactory(renderer))
+ .process(markdown);
return result;
};
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index 1ed0cc3130b..7925a10344a 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -11,6 +11,8 @@ import { convertToCamelCase, convertToSnakeCase } from './text_utility';
import { isObject } from './type_utility';
import { getLocationHash } from './url_utility';
+export const NO_SCROLL_TO_HASH_CLASS = 'js-no-scroll-to-hash';
+
export const getPagePath = (index = 0) => {
const { page = '' } = document.body.dataset;
return page.split(':')[index];
@@ -68,6 +70,10 @@ export const handleLocationHash = () => {
hash = decodeURIComponent(hash);
const target = document.getElementById(hash) || document.getElementById(`user-content-${hash}`);
+
+ // Allow targets to opt out of scroll behavior
+ if (target?.classList.contains(NO_SCROLL_TO_HASH_CLASS)) return;
+
const fixedTabs = document.querySelector('.js-tabs-affix');
const fixedDiffStats = document.querySelector('.js-diff-files-changed');
const fixedNav = document.querySelector('.navbar-gitlab');
@@ -585,8 +591,7 @@ export const addSelectOnFocusBehaviour = (selector = '.js-select-on-focus') => {
* @param {Number} precision
*/
export const roundOffFloat = (number, precision = 0) => {
- // eslint-disable-next-line no-restricted-properties
- const multiplier = Math.pow(10, precision);
+ const multiplier = 10 ** precision;
return Math.round(number * multiplier) / multiplier;
};
@@ -616,8 +621,7 @@ export const roundToNearestHalf = (num) => Math.round(num * 2).toFixed() / 2;
* @param {Number} precision
*/
export const roundDownFloat = (number, precision = 0) => {
- // eslint-disable-next-line no-restricted-properties
- const multiplier = Math.pow(10, precision);
+ const multiplier = 10 ** precision;
return Math.floor(number * multiplier) / multiplier;
};
diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js
index dad9cbcb6f6..7b00995b2e5 100644
--- a/app/assets/javascripts/lib/utils/text_utility.js
+++ b/app/assets/javascripts/lib/utils/text_utility.js
@@ -498,3 +498,17 @@ export const markdownConfig = {
* escaped to `'fix-'\''bug-behavior'\'''`.
*/
export const escapeShellString = (str) => `'${str.replace(allSingleQuotes, () => "'\\''")}'`;
+
+/**
+ * Adds plus character as delimiter for count
+ * if count is greater than limit of 1000
+ * FE creation of `app/helpers/numbers_helper.rb`
+ *
+ * @param {Number} count
+ * @return {Number|String}
+ */
+export const limitedCounterWithDelimiter = (count) => {
+ const limit = 1000;
+
+ return count > limit ? '1,000+' : count;
+};
diff --git a/app/assets/javascripts/linked_resources/index.js b/app/assets/javascripts/linked_resources/index.js
new file mode 100644
index 00000000000..244adca86c9
--- /dev/null
+++ b/app/assets/javascripts/linked_resources/index.js
@@ -0,0 +1,28 @@
+import Vue from 'vue';
+import ResourceLinksBlock from 'ee_component/linked_resources/components/resource_links_block.vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+
+export default function initLinkedResources() {
+ const linkedResourcesRootElement = document.querySelector('.js-linked-resources-root');
+
+ if (linkedResourcesRootElement) {
+ const { issuableId, canAddResourceLinks, helpPath } = linkedResourcesRootElement.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: linkedResourcesRootElement,
+ name: 'LinkedResourcesRoot',
+ components: {
+ resourceLinksBlock: ResourceLinksBlock,
+ },
+ render: (createElement) =>
+ createElement('resource-links-block', {
+ props: {
+ issuableId,
+ helpPath,
+ canAddResourceLinks: parseBoolean(canAddResourceLinks),
+ },
+ }),
+ });
+ }
+}
diff --git a/app/assets/javascripts/logs/components/environment_logs.vue b/app/assets/javascripts/logs/components/environment_logs.vue
deleted file mode 100644
index 609592edc3b..00000000000
--- a/app/assets/javascripts/logs/components/environment_logs.vue
+++ /dev/null
@@ -1,280 +0,0 @@
-<script>
-import {
- GlSprintf,
- GlAlert,
- GlLink,
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownItem,
- GlInfiniteScroll,
-} from '@gitlab/ui';
-import { throttle } from 'lodash';
-import { mapActions, mapState, mapGetters } from 'vuex';
-
-import { timeRangeFromUrl } from '~/monitoring/utils';
-import { defaultTimeRange } from '~/vue_shared/constants';
-import { formatDate } from '../utils';
-import LogAdvancedFilters from './log_advanced_filters.vue';
-import LogControlButtons from './log_control_buttons.vue';
-import LogSimpleFilters from './log_simple_filters.vue';
-
-export default {
- components: {
- GlSprintf,
- GlLink,
- GlAlert,
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownItem,
- GlInfiniteScroll,
- LogSimpleFilters,
- LogAdvancedFilters,
- LogControlButtons,
- },
- props: {
- environmentName: {
- type: String,
- required: false,
- default: '',
- },
- currentPodName: {
- type: [String, null],
- required: false,
- default: null,
- },
- environmentsPath: {
- type: String,
- required: false,
- default: '',
- },
- clusterApplicationsDocumentationPath: {
- type: String,
- required: true,
- },
- clustersPath: {
- type: String,
- required: true,
- },
- },
- data() {
- return {
- isElasticStackCalloutDismissed: false,
- scrollDownButtonDisabled: true,
- isDeprecationNoticeDismissed: false,
- };
- },
- computed: {
- ...mapState('environmentLogs', ['environments', 'timeRange', 'logs', 'pods']),
- ...mapGetters('environmentLogs', ['trace', 'showAdvancedFilters']),
-
- showLoader() {
- return this.logs.isLoading;
- },
- shouldShowElasticStackCallout() {
- return !(
- this.environments.isLoading ||
- this.isElasticStackCalloutDismissed ||
- this.showAdvancedFilters
- );
- },
- },
- mounted() {
- this.setInitData({
- timeRange: timeRangeFromUrl() || defaultTimeRange,
- environmentName: this.environmentName,
- podName: this.currentPodName,
- });
-
- this.fetchEnvironments(this.environmentsPath);
- },
- methods: {
- ...mapActions('environmentLogs', [
- 'setInitData',
- 'showEnvironment',
- 'fetchEnvironments',
- 'refreshPodLogs',
- 'fetchMoreLogsPrepend',
- 'dismissRequestEnvironmentsError',
- 'dismissInvalidTimeRangeWarning',
- 'dismissRequestLogsError',
- ]),
-
- isCurrentEnvironment(envName) {
- return envName === this.environments.current;
- },
- topReached() {
- if (!this.logs.isLoading) {
- this.fetchMoreLogsPrepend();
- }
- },
- scrollDown() {
- this.$refs.infiniteScroll.scrollDown();
- },
- scroll: throttle(function scrollThrottled({ target = {} }) {
- const { scrollTop = 0, clientHeight = 0, scrollHeight = 0 } = target;
- this.scrollDownButtonDisabled = scrollTop + clientHeight === scrollHeight;
- }, 200),
- formatDate,
- },
-};
-</script>
-<template>
- <div class="environment-logs-viewer d-flex flex-column py-3">
- <gl-alert
- v-if="shouldShowElasticStackCallout"
- ref="elasticsearchNotice"
- class="mb-3"
- @dismiss="isElasticStackCalloutDismissed = true"
- >
- {{
- s__(
- 'Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search.',
- )
- }}
- <a :href="clusterApplicationsDocumentationPath">
- <strong>
- {{ __('View Documentation') }}
- </strong>
- </a>
- </gl-alert>
- <gl-alert
- v-if="environments.fetchError"
- class="mb-3"
- variant="danger"
- @dismiss="dismissRequestEnvironmentsError"
- >
- {{ s__('Metrics|There was an error fetching the environments data, please try again') }}
- </gl-alert>
- <gl-alert
- v-if="timeRange.invalidWarning"
- class="mb-3"
- variant="warning"
- @dismiss="dismissInvalidTimeRangeWarning"
- >
- {{ s__('Metrics|Invalid time range, please verify.') }}
- </gl-alert>
- <gl-alert
- v-if="!isDeprecationNoticeDismissed"
- :title="s__('Deprecations|Feature deprecation and removal')"
- class="mb-3"
- variant="danger"
- @dismiss="isDeprecationNoticeDismissed = true"
- >
- <gl-sprintf
- :message="
- s__(
- 'Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0.',
- )
- "
- >
- <template #epic="{ content }">
- <gl-link href="https://gitlab.com/groups/gitlab-org/-/epics/7188" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
-
- <gl-sprintf
- :message="
- s__(
- 'Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}.',
- )
- "
- >
- <template #epic="{ content }">
- <gl-link href="https://gitlab.com/groups/gitlab-org/-/epics/6976" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </gl-alert>
- <gl-alert
- v-if="logs.fetchError"
- class="mb-3"
- variant="danger"
- @dismiss="dismissRequestLogsError"
- >
- {{ s__('Environments|There was an error fetching the logs. Please try again.') }}
- </gl-alert>
-
- <div class="top-bar d-md-flex border bg-secondary-50 pt-2 pr-1 pb-0 pl-2">
- <div class="flex-grow-0">
- <gl-dropdown
- id="environments-dropdown"
- :text="environments.current"
- :disabled="environments.isLoading"
- class="gl-mr-3 gl-mb-3 gl-display-flex gl-md-display-block js-environments-dropdown"
- >
- <gl-dropdown-section-header>
- {{ s__('Environments|Environments') }}
- </gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="env in environments.options"
- :key="env.id"
- :is-check-item="true"
- :is-checked="isCurrentEnvironment(env.name)"
- @click="showEnvironment(env.name)"
- >
- {{ env.name }}
- </gl-dropdown-item>
- </gl-dropdown>
- </div>
-
- <log-advanced-filters
- v-if="showAdvancedFilters"
- ref="log-advanced-filters"
- class="d-md-flex flex-grow-1 min-width-0"
- :disabled="environments.isLoading"
- />
- <log-simple-filters
- v-else
- ref="log-simple-filters"
- class="d-md-flex flex-grow-1 min-width-0"
- :disabled="environments.isLoading"
- />
-
- <log-control-buttons
- ref="scrollButtons"
- class="flex-grow-0 pr-2 mb-2 controllers gl-display-inline-flex"
- :scroll-down-button-disabled="scrollDownButtonDisabled"
- @refresh="refreshPodLogs()"
- @scrollDown="scrollDown"
- />
- </div>
-
- <gl-infinite-scroll
- ref="infiniteScroll"
- class="log-lines overflow-auto flex-grow-1 min-height-0"
- :fetched-items="logs.lines.length"
- @topReached="topReached"
- @scroll="scroll"
- >
- <template #items>
- <pre
- ref="logTrace"
- class="build-log"
- ><code class="bash js-build-output"><div v-if="showLoader" class="build-loader-animation js-build-loader-animation">
- <div class="dot"></div>
- <div class="dot"></div>
- <div class="dot"></div>
- </div>{{trace}}
- </code></pre>
- </template>
- <template #default><div></div></template>
- </gl-infinite-scroll>
-
- <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>{{ formatDate(timeRange.current.start) }}</template>
- <template #end>{{ formatDate(timeRange.current.end) }}</template>
- </gl-sprintf>
- <gl-sprintf
- v-if="!logs.isComplete"
- :message="s__('Environments|Currently showing %{fetched} results.')"
- >
- <template #fetched>{{ logs.lines.length }}</template>
- </gl-sprintf>
- <template v-else> {{ s__('Environments|Currently showing all results.') }}</template>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/logs/components/log_advanced_filters.vue b/app/assets/javascripts/logs/components/log_advanced_filters.vue
deleted file mode 100644
index c6d7c9ad1dc..00000000000
--- a/app/assets/javascripts/logs/components/log_advanced_filters.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-<script>
-import { GlFilteredSearch } from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue';
-import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
-import { timeRanges } from '~/vue_shared/constants';
-import { TOKEN_TYPE_POD_NAME } from '../constants';
-import TokenWithLoadingState from './tokens/token_with_loading_state.vue';
-
-export default {
- components: {
- GlFilteredSearch,
- DateTimePicker,
- },
- props: {
- disabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- timeRanges,
- };
- },
- computed: {
- ...mapState('environmentLogs', ['timeRange', 'pods', 'logs']),
-
- timeRangeModel: {
- get() {
- return this.timeRange.selected;
- },
- set(val) {
- this.setTimeRange(val);
- },
- },
- /**
- * Token options.
- *
- * Returns null when no pods are present, so suggestions are displayed in the token
- */
- podOptions() {
- if (this.pods.options.length) {
- return this.pods.options.map((podName) => ({ value: podName, title: podName }));
- }
- return null;
- },
-
- tokens() {
- return [
- {
- icon: 'pod',
- type: TOKEN_TYPE_POD_NAME,
- title: s__('Environments|Pod name'),
- token: TokenWithLoadingState,
- operators: OPERATOR_IS_ONLY,
- unique: true,
- options: this.podOptions,
- loading: this.logs.isLoading,
- noOptionsText: s__('Environments|No pods to display'),
- },
- ];
- },
- },
- methods: {
- ...mapActions('environmentLogs', ['showFilteredLogs', 'setTimeRange']),
-
- filteredSearchSubmit(filters) {
- this.showFilteredLogs(filters);
- },
- },
-};
-</script>
-<template>
- <div>
- <div class="mb-2 pr-2 flex-grow-1 min-width-0">
- <gl-filtered-search
- :placeholder="__('Search')"
- :clear-button-title="__('Clear')"
- :close-button-title="__('Close')"
- class="gl-h-32"
- :disabled="disabled || logs.isLoading"
- :available-tokens="tokens"
- @submit="filteredSearchSubmit"
- />
- </div>
-
- <date-time-picker
- ref="dateTimePicker"
- v-model="timeRangeModel"
- :disabled="disabled"
- :options="timeRanges"
- class="mb-2 gl-h-32 pr-2 d-block date-time-picker-wrapper"
- right
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/logs/components/log_control_buttons.vue b/app/assets/javascripts/logs/components/log_control_buttons.vue
deleted file mode 100644
index e44b5394fa1..00000000000
--- a/app/assets/javascripts/logs/components/log_control_buttons.vue
+++ /dev/null
@@ -1,95 +0,0 @@
-<script>
-import { GlButton, GlTooltipDirective } from '@gitlab/ui';
-
-export default {
- components: {
- GlButton,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- props: {
- scrollUpButtonDisabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- scrollDownButtonDisabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- scrollUpAvailable: Boolean(this.$listeners.scrollUp),
- scrollDownAvailable: Boolean(this.$listeners.scrollDown),
- };
- },
- methods: {
- handleRefreshClick() {
- this.$emit('refresh');
- },
- handleScrollUp() {
- this.$emit('scrollUp');
- },
- handleScrollDown() {
- this.$emit('scrollDown');
- },
- },
-};
-</script>
-
-<template>
- <div>
- <div
- v-if="scrollUpAvailable"
- v-gl-tooltip
- class="controllers-buttons"
- :title="__('Scroll to top')"
- aria-labelledby="scroll-to-top"
- >
- <gl-button
- id="scroll-to-top"
- class="js-scroll-to-top gl-mr-2 btn-blank"
- :aria-label="__('Scroll to top')"
- :disabled="scrollUpButtonDisabled"
- icon="scroll_up"
- category="primary"
- variant="default"
- @click="handleScrollUp()"
- />
- </div>
- <div
- v-if="scrollDownAvailable"
- v-gl-tooltip
- :disabled="scrollUpButtonDisabled"
- class="controllers-buttons"
- :title="__('Scroll to bottom')"
- aria-labelledby="scroll-to-bottom"
- >
- <gl-button
- id="scroll-to-bottom"
- class="js-scroll-to-bottom gl-mr-2 btn-blank"
- :aria-label="__('Scroll to bottom')"
- :v-if="scrollDownAvailable"
- :disabled="scrollDownButtonDisabled"
- icon="scroll_down"
- category="primary"
- variant="default"
- @click="handleScrollDown()"
- />
- </div>
- <gl-button
- id="refresh-log"
- v-gl-tooltip
- class="js-refresh-log"
- :title="__('Refresh')"
- :aria-label="__('Refresh')"
- icon="retry"
- category="primary"
- variant="default"
- @click="handleRefreshClick"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/logs/components/log_simple_filters.vue b/app/assets/javascripts/logs/components/log_simple_filters.vue
deleted file mode 100644
index 55bdd5f0088..00000000000
--- a/app/assets/javascripts/logs/components/log_simple_filters.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-<script>
-import { GlDropdown, GlDropdownSectionHeader, GlDropdownItem } from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
-import { s__ } from '~/locale';
-
-export default {
- components: {
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownItem,
- },
- props: {
- disabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- searchQuery: '',
- };
- },
- computed: {
- ...mapState('environmentLogs', ['pods']),
-
- podDropdownText() {
- return this.pods.current || s__('Environments|No pod selected');
- },
- },
- methods: {
- ...mapActions('environmentLogs', ['showPodLogs']),
- isCurrentPod(podName) {
- return podName === this.pods.current;
- },
- },
-};
-</script>
-<template>
- <div>
- <gl-dropdown
- ref="podsDropdown"
- :text="podDropdownText"
- :disabled="disabled"
- class="gl-mr-3 gl-mb-3 gl-display-flex gl-md-display-block qa-pods-dropdown"
- >
- <gl-dropdown-section-header>
- {{ s__('Environments|Select pod') }}
- </gl-dropdown-section-header>
-
- <gl-dropdown-item v-if="!pods.options.length" disabled>
- <span ref="noPodsMsg" class="text-muted">
- {{ s__('Environments|No pods to display') }}
- </span>
- </gl-dropdown-item>
- <gl-dropdown-item
- v-for="podName in pods.options"
- :key="podName"
- :is-check-item="true"
- :is-checked="isCurrentPod(podName)"
- class="text-nowrap"
- @click="showPodLogs(podName)"
- >
- {{ podName }}
- </gl-dropdown-item>
- </gl-dropdown>
- </div>
-</template>
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
deleted file mode 100644
index 4e672c1d121..00000000000
--- a/app/assets/javascripts/logs/components/tokens/token_with_loading_state.vue
+++ /dev/null
@@ -1,30 +0,0 @@
-<script>
-import { GlFilteredSearchToken, GlLoadingIcon } from '@gitlab/ui';
-
-export default {
- components: {
- GlFilteredSearchToken,
- GlLoadingIcon,
- },
- inheritAttrs: false,
- props: {
- config: {
- type: Object,
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <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" size="sm" />
- <div v-else class="py-1 px-2 text-muted">
- {{ config.noOptionsText }}
- </div>
- </div>
- </template>
- </gl-filtered-search-token>
-</template>
diff --git a/app/assets/javascripts/logs/constants.js b/app/assets/javascripts/logs/constants.js
deleted file mode 100644
index abc4d6679a0..00000000000
--- a/app/assets/javascripts/logs/constants.js
+++ /dev/null
@@ -1,16 +0,0 @@
-export const dateFormatMask = 'mmm dd HH:MM:ss.l';
-
-export const TOKEN_TYPE_POD_NAME = 'TOKEN_TYPE_POD_NAME';
-
-export const tracking = {
- USED_SEARCH_BAR: 'used_search_bar',
- POD_LOG_CHANGED: 'pod_log_changed',
- TIME_RANGE_SET: 'time_range_set',
- ENVIRONMENT_SELECTED: 'environment_selected',
- REFRESH_POD_LOGS: 'refresh_pod_logs',
- MANAGED_APP_SELECTED: 'managed_app_selected',
-};
-
-export const logExplorerOptions = {
- environments: 'environments',
-};
diff --git a/app/assets/javascripts/logs/index.js b/app/assets/javascripts/logs/index.js
deleted file mode 100644
index 70dbffdc3dd..00000000000
--- a/app/assets/javascripts/logs/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import Vue from 'vue';
-import { getParameterValues } from '~/lib/utils/url_utility';
-import LogViewer from './components/environment_logs.vue';
-import store from './stores';
-
-export default (props = {}) => {
- const el = document.getElementById('environment-logs');
- const [currentPodName] = getParameterValues('pod_name');
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- store,
- render(createElement) {
- return createElement(LogViewer, {
- props: {
- ...el.dataset,
- currentPodName,
- ...props,
- },
- });
- },
- });
-};
diff --git a/app/assets/javascripts/logs/logs_tracking_helper.js b/app/assets/javascripts/logs/logs_tracking_helper.js
deleted file mode 100644
index 26043d646b0..00000000000
--- a/app/assets/javascripts/logs/logs_tracking_helper.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import Tracking from '~/tracking';
-
-/**
- * The value of 1 in count, means there was one action performed
- * related to the tracked action, in either of the following categories
- * 1. Refreshing the logs
- * 2. Select an environment
- * 3. Change the time range
- * 4. Use the search bar
- */
-const trackLogs = (label) =>
- Tracking.event(document.body.dataset.page, 'logs_view', {
- label,
- property: 'count',
- value: 1,
- });
-
-export default trackLogs;
diff --git a/app/assets/javascripts/logs/stores/actions.js b/app/assets/javascripts/logs/stores/actions.js
deleted file mode 100644
index 56b832de9b8..00000000000
--- a/app/assets/javascripts/logs/stores/actions.js
+++ /dev/null
@@ -1,174 +0,0 @@
-import axios from '~/lib/utils/axios_utils';
-import { backOff } from '~/lib/utils/common_utils';
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import httpStatusCodes from '~/lib/utils/http_status';
-import { TOKEN_TYPE_POD_NAME, tracking, logExplorerOptions } from '../constants';
-import trackLogs from '../logs_tracking_helper';
-
-import * as types from './mutation_types';
-
-const requestUntilData = (url, params) =>
- backOff((next, stop) => {
- axios
- .get(url, { params })
- .then((res) => {
- if (res.status === httpStatusCodes.ACCEPTED) {
- next();
- return;
- }
- stop(res);
- })
- .catch((err) => {
- stop(err);
- });
- });
-
-const requestLogsUntilData = ({ commit, state }) => {
- const params = {};
- const type = logExplorerOptions.environments;
- const selectedObj = state[type].options.find(({ name }) => name === state[type].current);
- const path = selectedObj.logs_api_path;
-
- if (state.pods.current) {
- params.pod_name = state.pods.current;
- }
- if (state.search) {
- params.search = state.search;
- }
- if (state.timeRange.current) {
- try {
- const { start, end } = convertToFixedRange(state.timeRange.current);
- params.start_time = start;
- params.end_time = end;
- } catch {
- commit(types.SHOW_TIME_RANGE_INVALID_WARNING);
- }
- }
- if (state.logs.cursor) {
- params.cursor = state.logs.cursor;
- }
-
- return requestUntilData(path, params);
-};
-
-/**
- * Converts filters emitted by the component, e.g. a filterered-search
- * to parameters to be applied to the filters of the store
- * @param {Array} filters - List of strings or objects to filter by.
- * @returns {Object} - An object with `search` and `podName` keys.
- */
-const filtersToParams = (filters = []) => {
- // Strings become part of the `search`
- const search = filters
- .filter((f) => typeof f === 'string')
- .join(' ')
- .trim();
-
- // null podName to show all pods
- const podName = filters.find((f) => f?.type === TOKEN_TYPE_POD_NAME)?.value?.data ?? null;
-
- return { search, podName };
-};
-
-export const setInitData = ({ commit }, { timeRange, environmentName, podName }) => {
- commit(types.SET_TIME_RANGE, timeRange);
- commit(types.SET_PROJECT_ENVIRONMENT, environmentName);
- commit(types.SET_CURRENT_POD_NAME, podName);
-};
-
-export const showFilteredLogs = ({ dispatch, commit }, filters = []) => {
- const { podName, search } = filtersToParams(filters);
-
- commit(types.SET_CURRENT_POD_NAME, podName);
- commit(types.SET_SEARCH, search);
-
- dispatch('fetchLogs', tracking.USED_SEARCH_BAR);
-};
-
-export const showPodLogs = ({ dispatch, commit }, podName) => {
- commit(types.SET_CURRENT_POD_NAME, podName);
- dispatch('fetchLogs', tracking.POD_LOG_CHANGED);
-};
-
-export const setTimeRange = ({ dispatch, commit }, timeRange) => {
- commit(types.SET_TIME_RANGE, timeRange);
- dispatch('fetchLogs', tracking.TIME_RANGE_SET);
-};
-
-export const showEnvironment = ({ dispatch, commit }, environmentName) => {
- commit(types.SET_PROJECT_ENVIRONMENT, environmentName);
- dispatch('fetchLogs', tracking.ENVIRONMENT_SELECTED);
-};
-
-export const refreshPodLogs = ({ dispatch, commit }) => {
- commit(types.REFRESH_POD_LOGS);
- dispatch('fetchLogs', tracking.REFRESH_POD_LOGS);
-};
-
-/**
- * Fetch environments data and initial logs
- * @param {Object} store
- * @param {String} environmentsPath
- */
-export const fetchEnvironments = ({ commit, dispatch }, environmentsPath) => {
- commit(types.REQUEST_ENVIRONMENTS_DATA);
-
- return axios
- .get(environmentsPath)
- .then(({ data }) => {
- commit(types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS, data);
- dispatch('fetchLogs', tracking.ENVIRONMENT_SELECTED);
- })
- .catch(() => {
- commit(types.RECEIVE_ENVIRONMENTS_DATA_ERROR);
- });
-};
-
-export const fetchLogs = ({ commit, state }, trackingLabel) => {
- commit(types.REQUEST_LOGS_DATA);
-
- return requestLogsUntilData({ commit, state })
- .then(({ data }) => {
- const { pod_name, pods, logs, cursor } = data;
- if (logs && logs.length > 0) {
- trackLogs(trackingLabel);
- }
- commit(types.RECEIVE_LOGS_DATA_SUCCESS, { logs, cursor });
- commit(types.SET_CURRENT_POD_NAME, pod_name);
- commit(types.RECEIVE_PODS_DATA_SUCCESS, pods);
- })
- .catch(() => {
- commit(types.RECEIVE_PODS_DATA_ERROR);
- commit(types.RECEIVE_LOGS_DATA_ERROR);
- });
-};
-
-export const fetchMoreLogsPrepend = ({ commit, state }) => {
- if (state.logs.isComplete) {
- // return when all logs are loaded
- return Promise.resolve();
- }
-
- commit(types.REQUEST_LOGS_DATA_PREPEND);
-
- return requestLogsUntilData({ commit, state })
- .then(({ data }) => {
- const { logs, cursor } = data;
- commit(types.RECEIVE_LOGS_DATA_PREPEND_SUCCESS, { logs, cursor });
- })
- .catch(() => {
- commit(types.RECEIVE_LOGS_DATA_PREPEND_ERROR);
- });
-};
-
-export const dismissRequestEnvironmentsError = ({ commit }) => {
- commit(types.HIDE_REQUEST_ENVIRONMENTS_ERROR);
-};
-
-export const dismissRequestLogsError = ({ commit }) => {
- commit(types.HIDE_REQUEST_LOGS_ERROR);
-};
-
-export const dismissInvalidTimeRangeWarning = ({ commit }) => {
- commit(types.HIDE_TIME_RANGE_INVALID_WARNING);
-};
diff --git a/app/assets/javascripts/logs/stores/getters.js b/app/assets/javascripts/logs/stores/getters.js
deleted file mode 100644
index bf71cfd8eb2..00000000000
--- a/app/assets/javascripts/logs/stores/getters.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import { formatDate } from '../utils';
-
-const mapTrace = ({ timestamp = null, pod = '', message = '' }) =>
- [timestamp ? formatDate(timestamp) : '', pod, message].join(' | ');
-
-export const trace = (state) => state.logs.lines.map(mapTrace).join('\n');
-
-export const showAdvancedFilters = (state) => {
- const environment = state.environments.options.find(
- ({ name }) => name === state.environments.current,
- );
-
- return Boolean(environment?.enable_advanced_logs_querying);
-};
diff --git a/app/assets/javascripts/logs/stores/index.js b/app/assets/javascripts/logs/stores/index.js
deleted file mode 100644
index d16941ddf93..00000000000
--- a/app/assets/javascripts/logs/stores/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import * as actions from './actions';
-import * as getters from './getters';
-import mutations from './mutations';
-import state from './state';
-
-Vue.use(Vuex);
-
-export const createStore = () =>
- new Vuex.Store({
- modules: {
- environmentLogs: {
- namespaced: true,
- actions,
- mutations,
- state: state(),
- getters,
- },
- },
- });
-
-export default createStore;
diff --git a/app/assets/javascripts/logs/stores/mutation_types.js b/app/assets/javascripts/logs/stores/mutation_types.js
deleted file mode 100644
index c1ed65ff48b..00000000000
--- a/app/assets/javascripts/logs/stores/mutation_types.js
+++ /dev/null
@@ -1,26 +0,0 @@
-export const SET_PROJECT_ENVIRONMENT = 'SET_PROJECT_ENVIRONMENT';
-export const SET_SEARCH = 'SET_SEARCH';
-export const SET_MANAGED_APP = 'SET_MANAGED_APP';
-
-export const SET_TIME_RANGE = 'SET_TIME_RANGE';
-export const SHOW_TIME_RANGE_INVALID_WARNING = 'SHOW_TIME_RANGE_INVALID_WARNING';
-export const HIDE_TIME_RANGE_INVALID_WARNING = 'HIDE_TIME_RANGE_INVALID_WARNING';
-
-export const SET_CURRENT_POD_NAME = 'SET_CURRENT_POD_NAME';
-
-export const REQUEST_ENVIRONMENTS_DATA = 'REQUEST_ENVIRONMENTS_DATA';
-export const RECEIVE_ENVIRONMENTS_DATA_SUCCESS = 'RECEIVE_ENVIRONMENTS_DATA_SUCCESS';
-export const RECEIVE_ENVIRONMENTS_DATA_ERROR = 'RECEIVE_ENVIRONMENTS_DATA_ERROR';
-export const HIDE_REQUEST_ENVIRONMENTS_ERROR = 'HIDE_REQUEST_ENVIRONMENTS_ERROR';
-
-export const REQUEST_LOGS_DATA = 'REQUEST_LOGS_DATA';
-export const RECEIVE_LOGS_DATA_SUCCESS = 'RECEIVE_LOGS_DATA_SUCCESS';
-export const RECEIVE_LOGS_DATA_ERROR = 'RECEIVE_LOGS_DATA_ERROR';
-export const REQUEST_LOGS_DATA_PREPEND = 'REQUEST_LOGS_DATA_PREPEND';
-export const RECEIVE_LOGS_DATA_PREPEND_SUCCESS = 'RECEIVE_LOGS_DATA_PREPEND_SUCCESS';
-export const RECEIVE_LOGS_DATA_PREPEND_ERROR = 'RECEIVE_LOGS_DATA_PREPEND_ERROR';
-export const HIDE_REQUEST_LOGS_ERROR = 'HIDE_REQUEST_LOGS_ERROR';
-export const REFRESH_POD_LOGS = 'REFRESH_POD_LOGS';
-
-export const RECEIVE_PODS_DATA_SUCCESS = 'RECEIVE_PODS_DATA_SUCCESS';
-export const RECEIVE_PODS_DATA_ERROR = 'RECEIVE_PODS_DATA_ERROR';
diff --git a/app/assets/javascripts/logs/stores/mutations.js b/app/assets/javascripts/logs/stores/mutations.js
deleted file mode 100644
index 6736d7204b4..00000000000
--- a/app/assets/javascripts/logs/stores/mutations.js
+++ /dev/null
@@ -1,110 +0,0 @@
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import * as types from './mutation_types';
-
-const mapLine = ({ timestamp, pod, message }) => ({
- timestamp,
- pod,
- message,
-});
-
-export default {
- // Search Data
- [types.SET_SEARCH](state, searchQuery) {
- state.search = searchQuery;
- },
-
- // Time Range Data
- [types.SET_TIME_RANGE](state, timeRange) {
- state.timeRange.selected = timeRange;
- state.timeRange.current = convertToFixedRange(timeRange);
- },
- [types.SHOW_TIME_RANGE_INVALID_WARNING](state) {
- state.timeRange.invalidWarning = true;
- },
- [types.HIDE_TIME_RANGE_INVALID_WARNING](state) {
- state.timeRange.invalidWarning = false;
- },
-
- // Environments Data
- [types.SET_PROJECT_ENVIRONMENT](state, environmentName) {
- state.environments.current = environmentName;
-
- // Clear current pod options
- state.pods.current = null;
- state.pods.options = [];
- },
- [types.REQUEST_ENVIRONMENTS_DATA](state) {
- state.environments.options = [];
- state.environments.isLoading = true;
- },
- [types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS](state, environmentOptions) {
- state.environments.options = environmentOptions;
- state.environments.isLoading = false;
- },
- [types.RECEIVE_ENVIRONMENTS_DATA_ERROR](state) {
- state.environments.options = [];
- state.environments.isLoading = false;
- state.environments.fetchError = true;
- },
- [types.HIDE_REQUEST_ENVIRONMENTS_ERROR](state) {
- state.environments.fetchError = false;
- },
-
- // Logs data
- [types.REQUEST_LOGS_DATA](state) {
- state.timeRange.current = convertToFixedRange(state.timeRange.selected);
-
- state.logs.lines = [];
- state.logs.isLoading = true;
-
- // start pagination from the beginning
- state.logs.cursor = null;
- state.logs.isComplete = false;
- },
- [types.RECEIVE_LOGS_DATA_SUCCESS](state, { logs = [], cursor }) {
- state.logs.lines = logs.map(mapLine);
- state.logs.isLoading = false;
- state.logs.cursor = cursor;
-
- if (!cursor) {
- state.logs.isComplete = true;
- }
- },
- [types.RECEIVE_LOGS_DATA_ERROR](state) {
- state.logs.lines = [];
- state.logs.isLoading = false;
- state.logs.fetchError = true;
- },
-
- [types.REQUEST_LOGS_DATA_PREPEND](state) {
- state.logs.isLoading = true;
- },
- [types.RECEIVE_LOGS_DATA_PREPEND_SUCCESS](state, { logs = [], cursor }) {
- const lines = logs.map(mapLine);
- state.logs.lines = lines.concat(state.logs.lines);
- state.logs.isLoading = false;
- state.logs.cursor = cursor;
-
- if (!cursor) {
- state.logs.isComplete = true;
- }
- },
- [types.RECEIVE_LOGS_DATA_PREPEND_ERROR](state) {
- state.logs.isLoading = false;
- state.logs.fetchError = true;
- },
- [types.HIDE_REQUEST_LOGS_ERROR](state) {
- state.logs.fetchError = false;
- },
-
- // Pods data
- [types.SET_CURRENT_POD_NAME](state, podName) {
- state.pods.current = podName;
- },
- [types.RECEIVE_PODS_DATA_SUCCESS](state, podOptions) {
- state.pods.options = podOptions;
- },
- [types.RECEIVE_PODS_DATA_ERROR](state) {
- state.pods.options = [];
- },
-};
diff --git a/app/assets/javascripts/logs/stores/state.js b/app/assets/javascripts/logs/stores/state.js
deleted file mode 100644
index ee17e8ecef2..00000000000
--- a/app/assets/javascripts/logs/stores/state.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import { timeRanges, defaultTimeRange } from '~/vue_shared/constants';
-
-export default () => ({
- /**
- * Full text search
- */
- search: '',
-
- /**
- * Time range (Show last)
- */
- timeRange: {
- options: timeRanges,
- // Selected time range, can be fixed or relative
- selected: defaultTimeRange,
- // Current time range, must be fixed
- current: convertToFixedRange(defaultTimeRange),
-
- invalidWarning: false,
- },
-
- /**
- * Environments list information
- */
- environments: {
- options: [],
- isLoading: false,
- current: null,
- fetchError: false,
- },
-
- /**
- * Jobs with logs
- */
- logs: {
- lines: [],
- isLoading: false,
- /**
- * Logs `cursor` represents the current pagination position,
- * Should be sent in next batch (page) of logs to be fetched
- */
- cursor: null,
- isComplete: false,
-
- fetchError: false,
- },
-
- /**
- * Pods list information
- */
- pods: {
- options: [],
- current: null,
- },
-});
diff --git a/app/assets/javascripts/logs/utils.js b/app/assets/javascripts/logs/utils.js
deleted file mode 100644
index 74c2f8a68f8..00000000000
--- a/app/assets/javascripts/logs/utils.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import dateFormat from 'dateformat';
-import { dateFormatMask } from './constants';
-
-export const formatDate = (timestamp) => dateFormat(timestamp, dateFormatMask);
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index e3e8efdd771..349a28ace52 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -36,6 +36,7 @@ import initUserPopovers from './user_popovers';
import initBroadcastNotifications from './broadcast_notification';
import { initTopNav } from './nav';
import { initCopyCodeButton } from './behaviors/copy_code';
+import initHeaderSearch from './header_search/init';
import 'ee_else_ce/main_ee';
import 'jh_else_ce/main_jh';
@@ -53,7 +54,7 @@ window.gl = window.gl || {};
// inject test utilities if necessary
if (process.env.NODE_ENV !== 'production' && gon?.test_env) {
- import(/* webpackMode: "eager" */ './test_utils/');
+ import(/* webpackMode: "eager" */ './test_utils');
}
document.addEventListener('beforeunload', () => {
@@ -115,34 +116,6 @@ function deferredInitialisation() {
);
}
- const searchInputBox = document.querySelector('#search');
- if (searchInputBox) {
- searchInputBox.addEventListener(
- 'focus',
- () => {
- if (gon.features?.newHeaderSearch) {
- import(/* webpackChunkName: 'globalSearch' */ '~/header_search')
- .then(async ({ initHeaderSearchApp }) => {
- // In case the user started searching before we bootstrapped, let's pass the search along.
- const initialSearchValue = searchInputBox.value;
- await initHeaderSearchApp(initialSearchValue);
- // this is new #search input element. We need to re-find it.
- document.querySelector('#search').focus();
- })
- .catch(() => {});
- } else {
- import(/* webpackChunkName: 'globalSearch' */ './search_autocomplete')
- .then(({ default: initSearchAutocomplete }) => {
- const searchDropdown = initSearchAutocomplete();
- searchDropdown.onSearchInputFocus();
- })
- .catch(() => {});
- }
- },
- { once: true },
- );
- }
-
addSelectOnFocusBehaviour('.js-select-on-focus');
const glTooltipDelay = localStorage.getItem('gl-tooltip-delay');
@@ -169,6 +142,11 @@ function deferredInitialisation() {
}
}
+// header search vue component bootstrap
+// loading this inside requestIdleCallback is causing issues
+// see https://gitlab.com/gitlab-org/gitlab/-/issues/365746
+initHeaderSearch();
+
const $body = $('body');
const $document = $(document);
const bootstrapBreakpoint = bp.getBreakpointSize();
diff --git a/app/assets/javascripts/members/components/members_tabs.vue b/app/assets/javascripts/members/components/members_tabs.vue
index 98995730df4..b824a013f3b 100644
--- a/app/assets/javascripts/members/components/members_tabs.vue
+++ b/app/assets/javascripts/members/components/members_tabs.vue
@@ -1,40 +1,48 @@
<script>
import { GlTabs, GlTab, GlBadge, GlButton } from '@gitlab/ui';
import { mapState } from 'vuex';
-import { queryToObject } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import { MEMBER_TYPES, TAB_QUERY_PARAM_VALUES, ACTIVE_TAB_QUERY_PARAM_NAME } from '../constants';
+import { queryToObject } from '~/lib/utils/url_utility';
+import {
+ MEMBER_TYPES,
+ ACTIVE_TAB_QUERY_PARAM_NAME,
+ TAB_QUERY_PARAM_VALUES,
+ EE_TABS,
+} from 'ee_else_ce/members/constants';
import MembersApp from './app.vue';
const countComputed = (state, namespace) => state[namespace]?.pagination?.totalItems || 0;
+export const TABS = [
+ {
+ namespace: MEMBER_TYPES.user,
+ title: __('Members'),
+ },
+ {
+ 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,
+ },
+ ...EE_TABS,
+];
+
export default {
name: 'MembersTabs',
ACTIVE_TAB_QUERY_PARAM_NAME,
- TABS: [
- {
- namespace: MEMBER_TYPES.user,
- title: __('Members'),
- },
- {
- 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,
- },
- ],
+ TABS,
components: { MembersApp, GlTabs, GlTab, GlBadge, GlButton },
inject: ['canManageMembers', 'canExportMembers', 'exportCsvPath'],
data() {
@@ -43,20 +51,17 @@ export default {
};
},
computed: {
- ...mapState({
- userCount(state) {
- return countComputed(state, MEMBER_TYPES.user);
- },
- groupCount(state) {
- return countComputed(state, MEMBER_TYPES.group);
- },
- inviteCount(state) {
- return countComputed(state, MEMBER_TYPES.invite);
- },
- accessRequestCount(state) {
- return countComputed(state, MEMBER_TYPES.accessRequest);
- },
- }),
+ ...mapState(
+ Object.values(MEMBER_TYPES).reduce((getters, memberType) => {
+ return {
+ ...getters,
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ [`${memberType}Count`](state) {
+ return countComputed(state, memberType);
+ },
+ };
+ }, {}),
+ ),
urlParams() {
return Object.keys(queryToObject(window.location.search, { gatherArrays: true }));
},
diff --git a/app/assets/javascripts/members/components/table/member_avatar.vue b/app/assets/javascripts/members/components/table/member_avatar.vue
index 92b757ffcba..966eb90e402 100644
--- a/app/assets/javascripts/members/components/table/member_avatar.vue
+++ b/app/assets/javascripts/members/components/table/member_avatar.vue
@@ -6,7 +6,13 @@ import UserAvatar from '../avatars/user_avatar.vue';
export default {
name: 'MemberAvatar',
- components: { UserAvatar, InviteAvatar, GroupAvatar, AccessRequestAvatar: UserAvatar },
+ components: {
+ UserAvatar,
+ InviteAvatar,
+ GroupAvatar,
+ AccessRequestAvatar: UserAvatar,
+ BannedAvatar: UserAvatar,
+ },
props: {
memberType: {
type: String,
diff --git a/app/assets/javascripts/members/components/table/members_table_cell.vue b/app/assets/javascripts/members/components/table/members_table_cell.vue
index 3436bcab2fc..51eff428d63 100644
--- a/app/assets/javascripts/members/components/table/members_table_cell.vue
+++ b/app/assets/javascripts/members/components/table/members_table_cell.vue
@@ -1,5 +1,5 @@
<script>
-import { MEMBER_TYPES } from '../../constants';
+import { MEMBER_TYPES } from 'ee_else_ce/members/constants';
import {
isGroup,
isDirectMember,
diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js
index 8c40cc3f29d..2fe816c7ea2 100644
--- a/app/assets/javascripts/members/constants.js
+++ b/app/assets/javascripts/members/constants.js
@@ -3,6 +3,12 @@ import { GlFilteredSearchToken } from '@gitlab/ui';
import { __, s__ } from '~/locale';
import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
+// Overridden in EE
+export const EE_APP_OPTIONS = {};
+
+// Overridden in EE
+export const EE_TABS = [];
+
export const FIELD_KEY_ACCOUNT = 'account';
export const FIELD_KEY_SOURCE = 'source';
export const FIELD_KEY_GRANTED = 'granted';
diff --git a/app/assets/javascripts/members/index.js b/app/assets/javascripts/members/index.js
index 0df876cabd7..34660f8f499 100644
--- a/app/assets/javascripts/members/index.js
+++ b/app/assets/javascripts/members/index.js
@@ -2,8 +2,8 @@ import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
import Vuex from 'vuex';
import { parseDataAttributes } from '~/members/utils';
+import { MEMBER_TYPES } from 'ee_else_ce/members/constants';
import MembersTabs from './components/members_tabs.vue';
-import { MEMBER_TYPES } from './constants';
import membersStore from './store';
export const initMembersApp = (el, options) => {
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index 94041d77bb0..ed2e6a5af58 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -177,7 +177,7 @@ export default class MergeRequestTabs {
this.peek = document.getElementById('js-peek');
this.sidebar = document.querySelector('.js-right-sidebar');
this.pageLayout = document.querySelector('.layout-page');
- this.expandSidebar = document.querySelector('.js-expand-sidebar');
+ this.expandSidebar = document.querySelectorAll('.js-expand-sidebar, .js-sidebar-toggle');
this.paddingTop = 16;
this.scrollPositions = {};
@@ -282,7 +282,11 @@ export default class MergeRequestTabs {
const tab = this.mergeRequestTabs.querySelector(`.${action}-tab`);
if (tab) tab.classList.add('active');
- this.expandSidebar?.classList.toggle('gl-display-none!', action !== 'show');
+ if (window.gon?.features?.movedMrSidebar) {
+ this.expandSidebar?.forEach((el) =>
+ el.classList.toggle('gl-display-none!', action !== 'show'),
+ );
+ }
if (action === 'commits') {
this.loadCommits(href);
diff --git a/app/assets/javascripts/milestones/components/delete_milestone_modal.vue b/app/assets/javascripts/milestones/components/delete_milestone_modal.vue
index 34f9fe778ea..3a13c123d77 100644
--- a/app/assets/javascripts/milestones/components/delete_milestone_modal.vue
+++ b/app/assets/javascripts/milestones/components/delete_milestone_modal.vue
@@ -1,6 +1,6 @@
<script>
-import { GlSafeHtmlDirective as SafeHtml, GlModal } from '@gitlab/ui';
-import createFlash from '~/flash';
+import { GlSprintf, GlModal } from '@gitlab/ui';
+import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { redirectTo } from '~/lib/utils/url_utility';
@@ -10,9 +10,7 @@ import eventHub from '../event_hub';
export default {
components: {
GlModal,
- },
- directives: {
- SafeHtml,
+ GlSprintf,
},
props: {
issueCount: {
@@ -38,20 +36,10 @@ export default {
},
computed: {
text() {
- const milestoneTitle = sprintf('<strong>%{milestoneTitle}</strong>', {
- milestoneTitle: this.milestoneTitle,
- });
-
if (this.issueCount === 0 && this.mergeRequestCount === 0) {
- return sprintf(
- s__(`Milestones|
+ return s__(`Milestones|
You’re about to permanently delete the milestone %{milestoneTitle}.
-This milestone is not currently used in any issues or merge requests.`),
- {
- milestoneTitle,
- },
- false,
- );
+This milestone is not currently used in any issues or merge requests.`);
}
return sprintf(
@@ -59,7 +47,6 @@ This milestone is not currently used in any issues or merge requests.`),
You’re about to permanently delete the milestone %{milestoneTitle} and remove it from %{issuesWithCount} and %{mergeRequestsWithCount}.
Once deleted, it cannot be undone or recovered.`),
{
- milestoneTitle,
issuesWithCount: n__('%d issue', '%d issues', this.issueCount),
mergeRequestsWithCount: n__(
'%d merge request',
@@ -98,13 +85,13 @@ Once deleted, it cannot be undone or recovered.`),
});
if (error.response && error.response.status === 404) {
- createFlash({
+ createAlert({
message: sprintf(s__('Milestones|Milestone %{milestoneTitle} was not found'), {
milestoneTitle: this.milestoneTitle,
}),
});
} else {
- createFlash({
+ createAlert({
message: sprintf(s__('Milestones|Failed to delete milestone %{milestoneTitle}'), {
milestoneTitle: this.milestoneTitle,
}),
@@ -132,6 +119,10 @@ Once deleted, it cannot be undone or recovered.`),
:action-cancel="$options.cancelProps"
@primary="onSubmit"
>
- <p v-safe-html="text"></p>
+ <gl-sprintf :message="text">
+ <template #milestoneTitle>
+ <strong>{{ milestoneTitle }}</strong>
+ </template>
+ </gl-sprintf>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/milestones/milestone.js b/app/assets/javascripts/milestones/milestone.js
index 05102f73f92..8f2721c2a5b 100644
--- a/app/assets/javascripts/milestones/milestone.js
+++ b/app/assets/javascripts/milestones/milestone.js
@@ -1,33 +1,27 @@
import createFlash from '~/flash';
import { sanitize } from '~/lib/dompurify';
import axios from '~/lib/utils/axios_utils';
-import { historyPushState } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
-import { GlTabsBehavior, TAB_SHOWN_EVENT } from '~/tabs';
+import { GlTabsBehavior, TAB_SHOWN_EVENT, HISTORY_TYPE_HASH } from '~/tabs';
export default class Milestone {
constructor() {
this.tabsEl = document.querySelector('.js-milestone-tabs');
- this.glTabs = new GlTabsBehavior(this.tabsEl);
this.loadedTabs = new WeakSet();
this.bindTabsSwitching();
- this.loadInitialTab();
+ // eslint-disable-next-line no-new
+ new GlTabsBehavior(this.tabsEl, { history: HISTORY_TYPE_HASH });
}
bindTabsSwitching() {
this.tabsEl.addEventListener(TAB_SHOWN_EVENT, (event) => {
const tab = event.target;
const { activeTabPanel } = event.detail;
- historyPushState(tab.getAttribute('href'));
this.loadTab(tab, activeTabPanel);
});
}
- loadInitialTab() {
- const tab = this.tabsEl.querySelector(`a[href="${window.location.hash}"]`);
- this.glTabs.activateTab(tab || this.glTabs.activeTab);
- }
loadTab(tab, tabPanel) {
const { endpoint } = tab.dataset;
diff --git a/app/assets/javascripts/mirrors/ssh_mirror.js b/app/assets/javascripts/mirrors/ssh_mirror.js
index e375435436e..eb7c43034a4 100644
--- a/app/assets/javascripts/mirrors/ssh_mirror.js
+++ b/app/assets/javascripts/mirrors/ssh_mirror.js
@@ -163,7 +163,7 @@ export default class SSHMirror {
const $fingerprintsList = this.$hostKeysInformation.find('.js-fingerprints-list');
let fingerprints = '';
sshHostKeys.fingerprints.forEach((fingerprint) => {
- const escFingerprints = escape(fingerprint.fingerprint);
+ const escFingerprints = escape(fingerprint.fingerprint_sha256 || fingerprint.fingerprint);
fingerprints += `<code>${escFingerprints}</code>`;
});
diff --git a/app/assets/javascripts/monitoring/components/dashboard.vue b/app/assets/javascripts/monitoring/components/dashboard.vue
index 70e253508ce..250d4b3c55f 100644
--- a/app/assets/javascripts/monitoring/components/dashboard.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard.vue
@@ -358,10 +358,6 @@ export default {
actionToRun = 'onExpandFromKeyboardShortcut';
break;
- case keyboardShortcutKeys.VISIT_LOGS:
- actionToRun = 'visitLogsPageFromKeyboardShortcut';
- break;
-
case keyboardShortcutKeys.SHOW_ALERT:
actionToRun = 'showAlertModalFromKeyboardShortcut';
break;
diff --git a/app/assets/javascripts/monitoring/components/dashboard_header.vue b/app/assets/javascripts/monitoring/components/dashboard_header.vue
index f18290e7048..3338635bf96 100644
--- a/app/assets/javascripts/monitoring/components/dashboard_header.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard_header.vue
@@ -170,7 +170,7 @@ export default {
<template>
<div ref="prometheusGraphsHeader">
- <div class="mb-2 mr-2 d-flex d-sm-block">
+ <div class="gl-mb-3 gl-mr-3 gl-display-flex gl-sm-display-block">
<dashboards-dropdown
id="monitor-dashboards-dropdown"
data-qa-selector="dashboards_filter_dropdown"
@@ -240,7 +240,7 @@ export default {
<div class="flex-grow-1"></div>
<div class="d-sm-flex">
- <div v-if="showRearrangePanelsBtn" class="mb-2 mr-2 d-flex">
+ <div v-if="showRearrangePanelsBtn" class="gl-mb-3 gl-mr-3 gl-display-flex">
<gl-button
:pressed="isRearrangingPanels"
variant="default"
@@ -253,7 +253,7 @@ export default {
<div
v-if="externalDashboardUrl && externalDashboardUrl.length"
- class="mb-2 mr-2 d-flex d-sm-block"
+ class="gl-mb-3 gl-mr-3 gl-display-flex gl-sm-display-block"
>
<gl-button
class="flex-grow-1 js-external-dashboard-link"
@@ -280,7 +280,7 @@ export default {
<template v-if="shouldShowSettingsButton">
<span aria-hidden="true" class="gl-pl-3 border-left gl-mb-3 d-none d-sm-block"></span>
- <div class="mb-2 mr-2 d-flex d-sm-block">
+ <div class="gl-mb-3 gl-mr-3 d-flex d-sm-block">
<gl-button
v-gl-tooltip
data-testid="metrics-settings-button"
diff --git a/app/assets/javascripts/monitoring/components/dashboard_panel.vue b/app/assets/javascripts/monitoring/components/dashboard_panel.vue
index ff8ccded83b..7e7dcef7639 100644
--- a/app/assets/javascripts/monitoring/components/dashboard_panel.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard_panel.vue
@@ -15,15 +15,13 @@ import {
} from '@gitlab/ui';
import { mapState } from 'vuex';
import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import invalidUrl from '~/lib/utils/invalid_url';
-import { relativePathToAbsolute, getBaseURL, visitUrl, isSafeURL } from '~/lib/utils/url_utility';
+import { isSafeURL } from '~/lib/utils/url_utility';
import { __, n__ } from '~/locale';
import TrackEventDirective from '~/vue_shared/directives/track_event';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { panelTypes } from '../constants';
import { graphDataToCsv } from '../csv_export';
-import { timeRangeToUrl, downloadCSVOptions, generateLinkToChartOptions } from '../utils';
+import { downloadCSVOptions, generateLinkToChartOptions } from '../utils';
import MonitorAnomalyChart from './charts/anomaly.vue';
import MonitorBarChart from './charts/bar.vue';
import MonitorColumnChart from './charts/column.vue';
@@ -58,7 +56,6 @@ export default {
GlTooltip: GlTooltipDirective,
TrackEvent: TrackEventDirective,
},
- mixins: [glFeatureFlagsMixin()],
props: {
clipboardText: {
type: String,
@@ -106,9 +103,6 @@ export default {
projectPath(state) {
return state[this.namespace].projectPath;
},
- logsPath(state) {
- return state[this.namespace].logsPath;
- },
timeRange(state) {
return state[this.namespace].timeRange;
},
@@ -142,17 +136,6 @@ export default {
const metrics = this.graphData?.metrics || [];
return metrics.some(({ loading }) => loading);
},
- logsPathWithTimeRange() {
- if (!this.glFeatures.monitorLogging) {
- return null;
- }
- const timeRange = this.zoomedTimeRange || this.timeRange;
-
- if (this.logsPath && this.logsPath !== invalidUrl && timeRange) {
- return timeRangeToUrl(timeRange, this.logsPath);
- }
- return null;
- },
csvText() {
if (this.graphData) {
return graphDataToCsv(this.graphData);
@@ -278,16 +261,6 @@ export default {
safeUrl(url) {
return isSafeURL(url) ? url : '#';
},
- visitLogsPage() {
- if (this.logsPathWithTimeRange) {
- visitUrl(relativePathToAbsolute(this.logsPathWithTimeRange, getBaseURL()));
- }
- },
- visitLogsPageFromKeyboardShortcut() {
- if (this.isContextualMenuShown) {
- this.visitLogsPage();
- }
- },
downloadCsvFromKeyboardShortcut() {
if (this.csvText && this.isContextualMenuShown) {
this.$refs.downloadCsvLink.$el.firstChild.click();
@@ -351,13 +324,6 @@ export default {
>
{{ editCustomMetricLinkText }}
</gl-dropdown-item>
- <gl-dropdown-item
- v-if="logsPathWithTimeRange"
- ref="viewLogsLink"
- :href="logsPathWithTimeRange"
- >
- {{ s__('Metrics|View logs') }}
- </gl-dropdown-item>
<gl-dropdown-item
v-if="csvText"
diff --git a/app/assets/javascripts/monitoring/constants.js b/app/assets/javascripts/monitoring/constants.js
index 060ed896d7c..1b506c6564b 100644
--- a/app/assets/javascripts/monitoring/constants.js
+++ b/app/assets/javascripts/monitoring/constants.js
@@ -172,7 +172,6 @@ export const endpointKeys = [
'dashboardsEndpoint',
'currentDashboard',
'projectPath',
- 'logsPath',
];
/**
@@ -271,7 +270,6 @@ export const VARIABLE_PREFIX = 'var-';
export const keyboardShortcutKeys = {
EXPAND: 'e',
- VISIT_LOGS: 'l',
SHOW_ALERT: 'a',
DOWNLOAD_CSV: 'd',
CHART_COPY: 'c',
diff --git a/app/assets/javascripts/monitoring/stores/state.js b/app/assets/javascripts/monitoring/stores/state.js
index 3883fa3380d..e513b575475 100644
--- a/app/assets/javascripts/monitoring/stores/state.js
+++ b/app/assets/javascripts/monitoring/stores/state.js
@@ -83,7 +83,6 @@ export default () => ({
externalDashboardUrl: '',
projectPath: null,
operationsSettingsPath: '',
- logsPath: invalidUrl,
addDashboardDocumentationPath: '',
// static paths
diff --git a/app/assets/javascripts/monitoring/utils.js b/app/assets/javascripts/monitoring/utils.js
index 221f28e923b..fd8749625da 100644
--- a/app/assets/javascripts/monitoring/utils.js
+++ b/app/assets/javascripts/monitoring/utils.js
@@ -29,7 +29,6 @@ export const stateAndPropsFromDataset = (dataset = {}) => {
canAccessOperationsSettings,
operationsSettingsPath,
projectPath,
- logsPath,
externalDashboardUrl,
currentEnvironmentName,
customDashboardBasePath,
@@ -53,7 +52,6 @@ export const stateAndPropsFromDataset = (dataset = {}) => {
canAccessOperationsSettings,
operationsSettingsPath,
projectPath,
- logsPath,
externalDashboardUrl,
currentEnvironmentName,
customDashboardBasePath,
diff --git a/app/assets/javascripts/mr_notes/stores/index.js b/app/assets/javascripts/mr_notes/stores/index.js
index 4a0602ad512..7527c685c71 100644
--- a/app/assets/javascripts/mr_notes/stores/index.js
+++ b/app/assets/javascripts/mr_notes/stores/index.js
@@ -7,14 +7,16 @@ import mrPageModule from './modules';
Vue.use(Vuex);
+export const createModules = () => ({
+ page: mrPageModule(),
+ notes: notesModule(),
+ diffs: diffsModule(),
+ batchComments: batchCommentsModule(),
+});
+
export const createStore = () =>
new Vuex.Store({
- modules: {
- page: mrPageModule(),
- notes: notesModule(),
- diffs: diffsModule(),
- batchComments: batchCommentsModule(),
- },
+ modules: createModules(),
});
export default createStore();
diff --git a/app/assets/javascripts/new_branch_form.js b/app/assets/javascripts/new_branch_form.js
index d93db7399e6..ef36e58374c 100644
--- a/app/assets/javascripts/new_branch_form.js
+++ b/app/assets/javascripts/new_branch_form.js
@@ -1,4 +1,4 @@
-/* eslint-disable func-names, consistent-return, no-return-assign, @gitlab/require-i18n-strings */
+/* eslint-disable func-names, no-return-assign, @gitlab/require-i18n-strings */
import $ from 'jquery';
import RefSelectDropdown from './ref_select_dropdown';
@@ -6,9 +6,9 @@ import RefSelectDropdown from './ref_select_dropdown';
export default class NewBranchForm {
constructor(form, availableRefs) {
this.validate = this.validate.bind(this);
- this.branchNameError = form.find('.js-branch-name-error');
- this.name = form.find('.js-branch-name');
- this.ref = form.find('#ref');
+ this.branchNameError = form.querySelector('.js-branch-name-error');
+ this.name = form.querySelector('.js-branch-name');
+ this.ref = form.querySelector('#ref');
new RefSelectDropdown($('.js-branch-select'), availableRefs); // eslint-disable-line no-new
this.setupRestrictions();
this.addBinding();
@@ -16,12 +16,13 @@ export default class NewBranchForm {
}
addBinding() {
- return this.name.on('blur', this.validate);
+ this.name.addEventListener('blur', this.validate);
}
init() {
- if (this.name.length && this.name.val().length > 0) {
- return this.name.trigger('blur');
+ if (this.name != null && this.name.value.length > 0) {
+ const event = new CustomEvent('blur');
+ this.name.dispatchEvent(event);
}
}
@@ -52,7 +53,7 @@ export default class NewBranchForm {
validate() {
const { indexOf } = [];
- this.branchNameError.empty();
+ this.branchNameError.innerHTML = '';
const unique = function (values, value) {
if (indexOf.call(values, value) === -1) {
values.push(value);
@@ -73,7 +74,7 @@ export default class NewBranchForm {
return `${restriction.prefix} ${formatted.join(restriction.conjunction)}`;
};
const validator = (errors, restriction) => {
- const matched = this.name.val().match(restriction.pattern);
+ const matched = this.name.value.match(restriction.pattern);
if (matched) {
return errors.concat(formatter(matched.reduce(unique, []), restriction));
}
@@ -81,8 +82,7 @@ export default class NewBranchForm {
};
const errors = this.restrictions.reduce(validator, []);
if (errors.length > 0) {
- const errorMessage = $('<span/>').text(errors.join(', '));
- return this.branchNameError.append(errorMessage);
+ this.branchNameError.textContent = errors.join(', ');
}
}
}
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index e7ac27c5e3e..bd5945a951b 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -172,9 +172,6 @@ export default {
trackingLabel() {
return slugifyWithUnderscore(`${this.commentButtonTitle} button`);
},
- internalNotesEnabled() {
- return Boolean(this.glFeatures.confidentialNotes);
- },
disableSubmitButton() {
return this.note.length === 0 || this.isSubmitting;
},
@@ -414,7 +411,7 @@ export default {
</template>
<template v-else>
<gl-form-checkbox
- v-if="internalNotesEnabled && canSetInternalNote"
+ v-if="canSetInternalNote"
v-model="noteIsInternal"
class="gl-mb-2"
data-testid="internal-note-checkbox"
diff --git a/app/assets/javascripts/notes/components/discussion_filter_note.vue b/app/assets/javascripts/notes/components/discussion_filter_note.vue
index 83326279423..61af0b06535 100644
--- a/app/assets/javascripts/notes/components/discussion_filter_note.vue
+++ b/app/assets/javascripts/notes/components/discussion_filter_note.vue
@@ -39,8 +39,8 @@ export default {
</template>
</gl-sprintf>
</div>
- <div class="discussion-filter-actions mt-2">
- <gl-button variant="default" @click="selectFilter(0)">
+ <div class="discussion-filter-actions gl-mt-3 gl-display-flex">
+ <gl-button variant="default" class="gl-mr-3" @click="selectFilter(0)">
{{ __('Show all activity') }}
</gl-button>
<gl-button variant="default" @click="selectFilter(1)">
diff --git a/app/assets/javascripts/notes/components/discussion_navigator.vue b/app/assets/javascripts/notes/components/discussion_navigator.vue
index 7e8bb75902b..c1e39f31bbb 100644
--- a/app/assets/javascripts/notes/components/discussion_navigator.vue
+++ b/app/assets/javascripts/notes/components/discussion_navigator.vue
@@ -25,7 +25,7 @@ export default {
eventHub.$off('jumpToFirstUnresolvedDiscussion', this.jumpToFirstUnresolvedDiscussion);
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index af0c1e9619e..095ab5ddb0f 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -1,5 +1,5 @@
<script>
-import { GlSprintf, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
+import { GlSprintf, GlSafeHtmlDirective as SafeHtml, GlAvatarLink, GlAvatar } from '@gitlab/ui';
import $ from 'jquery';
import { escape, isEmpty } from 'lodash';
import { mapGetters, mapActions } from 'vuex';
@@ -11,7 +11,6 @@ import { ignoreWhilePending } from '~/lib/utils/ignore_while_pending';
import { truncateSha } from '~/lib/utils/text_utility';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
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';
@@ -31,11 +30,12 @@ export default {
name: 'NoteableNote',
components: {
GlSprintf,
- userAvatarLink,
noteHeader,
noteActions,
NoteBody,
TimelineEntryItem,
+ GlAvatarLink,
+ GlAvatar,
},
directives: {
SafeHtml,
@@ -196,13 +196,11 @@ export default {
return fileResolvedFromAvailableSource || null;
},
- avatarSize() {
- // Use a different size if shown on a Merge Request Diff
- if (this.line && !this.isOverviewTab) {
- return 24;
- }
-
- return 40;
+ isMRDiffView() {
+ return this.line && !this.isOverviewTab;
+ },
+ authorAvatarAdaptiveSize() {
+ return { default: 24, md: 32 };
},
},
created() {
@@ -261,7 +259,7 @@ export default {
});
const confirmed = await confirmAction(msg, {
primaryBtnVariant: 'danger',
- primaryBtnText: this.note.confidential ? __('Delete Internal Note') : __('Delete Comment'),
+ primaryBtnText: this.note.confidential ? __('Delete internal note') : __('Delete comment'),
});
if (confirmed) {
@@ -428,19 +426,33 @@ export default {
</template>
</gl-sprintf>
</div>
- <div class="timeline-icon">
- <user-avatar-link
- :link-href="author.path"
- :img-src="author.avatar_url"
- :img-alt="author.name"
- :img-size="avatarSize"
- lazy
- >
- <template #avatar-badge>
- <slot name="avatar-badge"></slot>
- </template>
- </user-avatar-link>
+
+ <div v-if="isMRDiffView" class="gl-float-left gl-mt-n1 gl-mr-3">
+ <gl-avatar-link :href="author.path">
+ <gl-avatar
+ :src="author.avatar_url"
+ :entity-name="author.username"
+ :alt="author.name"
+ :size="24"
+ />
+
+ <slot name="avatar-badge"></slot>
+ </gl-avatar-link>
+ </div>
+
+ <div v-else class="gl-float-left gl-pl-3 gl-mr-3 gl-md-pl-2 gl-md-pr-2">
+ <gl-avatar-link :href="author.path">
+ <gl-avatar
+ :src="author.avatar_url"
+ :entity-name="author.username"
+ :alt="author.name"
+ :size="authorAvatarAdaptiveSize"
+ />
+
+ <slot name="avatar-badge"></slot>
+ </gl-avatar-link>
</div>
+
<div class="timeline-content">
<div class="note-header">
<note-header
diff --git a/app/assets/javascripts/notes/components/toggle_replies_widget.vue b/app/assets/javascripts/notes/components/toggle_replies_widget.vue
index 8cd4477a3bb..2bd3488ae1b 100644
--- a/app/assets/javascripts/notes/components/toggle_replies_widget.vue
+++ b/app/assets/javascripts/notes/components/toggle_replies_widget.vue
@@ -1,13 +1,20 @@
<script>
-import { GlButton, GlIcon } from '@gitlab/ui';
+import { GlButton, GlLink, GlSprintf } from '@gitlab/ui';
import { uniqBy } from 'lodash';
+import { s__ } from '~/locale';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
export default {
+ i18n: {
+ collapseReplies: s__('Notes|Collapse replies'),
+ expandReplies: s__('Notes|Expand replies'),
+ lastReplyBy: s__('Notes|Last reply by %{name}'),
+ },
components: {
GlButton,
- GlIcon,
+ GlLink,
+ GlSprintf,
UserAvatarLink,
TimeAgoTooltip,
},
@@ -28,63 +35,83 @@ export default {
uniqueAuthors() {
const authors = this.replies.map((reply) => reply.author || {});
- return uniqBy(authors, (author) => author.username);
+ return uniqBy(authors, 'username');
+ },
+ liClasses() {
+ return this.collapsed
+ ? 'gl-text-gray-500 gl-rounded-bottom-left-base gl-rounded-bottom-right-base'
+ : 'gl-border-b';
},
- className() {
- return this.collapsed ? 'collapsed' : 'expanded';
+ buttonIcon() {
+ return this.collapsed ? 'chevron-right' : 'chevron-down';
+ },
+ buttonLabel() {
+ return this.collapsed ? this.$options.i18n.expandReplies : this.$options.i18n.collapseReplies;
},
},
methods: {
toggle() {
+ this.$refs.toggle.$el.focus();
this.$emit('toggle');
},
},
- ICON_CLASS: 'gl-mr-3 gl-cursor-pointer',
};
</script>
<template>
<li
- :class="className"
- class="replies-toggle js-toggle-replies gl-display-flex! gl-align-items-center gl-flex-wrap"
+ :class="liClasses"
+ class="gl-display-flex! gl-align-items-center gl-flex-wrap gl-bg-gray-10 gl-py-3 gl-px-5 gl-border-t"
>
+ <gl-button
+ ref="toggle"
+ class="gl-my-2 gl-mr-3 gl-p-0!"
+ category="tertiary"
+ :icon="buttonIcon"
+ :aria-label="buttonLabel"
+ @click="toggle"
+ />
<template v-if="collapsed">
- <gl-icon :class="$options.ICON_CLASS" name="chevron-right" @click.native="toggle" />
- <div>
- <user-avatar-link
- v-for="author in uniqueAuthors"
- :key="author.username"
- :link-href="author.path"
- :img-alt="author.name"
- :img-src="author.avatar_url"
- :img-size="24"
- :tooltip-text="author.name"
- tooltip-placement="bottom"
- />
- </div>
+ <user-avatar-link
+ v-for="author in uniqueAuthors"
+ :key="author.username"
+ class="gl-mr-3"
+ :link-href="author.path"
+ :img-alt="author.name"
+ img-css-classes="gl-mr-0!"
+ :img-src="author.avatar_url"
+ :img-size="24"
+ :tooltip-text="author.name"
+ tooltip-placement="bottom"
+ />
<gl-button
- class="js-replies-text gl-mr-2"
- category="tertiary"
+ class="gl-mr-2"
variant="link"
data-qa-selector="expand_replies_button"
@click="toggle"
>
- {{ replies.length }} {{ n__('reply', 'replies', replies.length) }}
+ {{ n__('%d reply', '%d replies', replies.length) }}
</gl-button>
- {{ __('Last reply by') }}
- <a :href="lastReply.author.path" class="btn btn-link author-link gl-mx-2 gl-button">
- {{ lastReply.author.name }}
- </a>
+ <gl-sprintf :message="$options.i18n.lastReplyBy">
+ <template #name>
+ <gl-link
+ :href="lastReply.author.path"
+ class="gl-text-body! gl-text-decoration-none! gl-mx-2"
+ >
+ {{ lastReply.author.name }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
<time-ago-tooltip :time="lastReply.created_at" tooltip-placement="bottom" />
</template>
- <div
+ <gl-button
v-else
- class="collapse-replies-btn js-collapse-replies gl-display-flex align-items-center"
+ class="gl-text-body! gl-text-decoration-none!"
+ variant="link"
data-qa-selector="collapse_replies_button"
@click="toggle"
>
- <gl-icon :class="$options.ICON_CLASS" name="chevron-down" />
- <span class="gl-cursor-pointer">{{ s__('Notes|Collapse replies') }}</span>
- </div>
+ {{ $options.i18n.collapseReplies }}
+ </gl-button>
</li>
</template>
diff --git a/app/assets/javascripts/notes/constants.js b/app/assets/javascripts/notes/constants.js
index b8575016762..3317f4e2383 100644
--- a/app/assets/javascripts/notes/constants.js
+++ b/app/assets/javascripts/notes/constants.js
@@ -10,8 +10,8 @@ export const OPENED = 'opened';
export const REOPENED = 'reopened';
export const CLOSED = 'closed';
export const MERGED = 'merged';
-export const ISSUE_NOTEABLE_TYPE = 'issue';
-export const EPIC_NOTEABLE_TYPE = 'epic';
+export const ISSUE_NOTEABLE_TYPE = 'Issue';
+export const EPIC_NOTEABLE_TYPE = 'Epic';
export const MERGE_REQUEST_NOTEABLE_TYPE = 'MergeRequest';
export const UNRESOLVE_NOTE_METHOD_NAME = 'delete';
export const RESOLVE_NOTE_METHOD_NAME = 'post';
diff --git a/app/assets/javascripts/notes/mixins/discussion_navigation.js b/app/assets/javascripts/notes/mixins/discussion_navigation.js
index 754a534e055..45df91796fc 100644
--- a/app/assets/javascripts/notes/mixins/discussion_navigation.js
+++ b/app/assets/javascripts/notes/mixins/discussion_navigation.js
@@ -41,8 +41,6 @@ function updateUrlWithNoteId(noteId) {
// Unmask the note's ID
note?.setAttribute('id', `note_${noteId}`);
- } else if (noteId) {
- updateHistory(newHistoryEntry);
}
}
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index 57bb9e295f9..82417c9134b 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -83,14 +83,17 @@ export const setExpandDiscussions = ({ commit }, { discussionIds, expanded }) =>
commit(types.SET_EXPAND_DISCUSSIONS, { discussionIds, expanded });
};
-export const fetchDiscussions = ({ commit, dispatch }, { path, filter, persistFilter }) => {
+export const fetchDiscussions = (
+ { commit, dispatch, getters },
+ { path, filter, persistFilter },
+) => {
const config =
filter !== undefined
? { params: { notes_filter: filter, persist_filter: persistFilter } }
: null;
if (
- window.gon?.features?.paginatedIssueDiscussions ||
+ getters.noteableType === constants.ISSUE_NOTEABLE_TYPE ||
window.gon?.features?.paginatedMrDiscussions
) {
return dispatch('fetchDiscussionsBatch', { path, config, perPage: 20 });
@@ -114,7 +117,7 @@ export const fetchDiscussionsBatch = ({ commit, dispatch }, { path, config, curs
return axios.get(path, { params }).then(({ data, headers }) => {
commit(types.ADD_OR_UPDATE_DISCUSSIONS, data);
- if (headers['x-next-page-cursor']) {
+ if (headers && headers['x-next-page-cursor']) {
const nextConfig = { ...config };
if (config?.params?.persist_filter) {
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/details_header.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/details_header.vue
index ab0418388cd..5d77ff9dc0d 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/details_header.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/details_header.vue
@@ -20,7 +20,6 @@ import {
UNSCHEDULED_STATUS,
SCHEDULED_STATUS,
ONGOING_STATUS,
- ROOT_IMAGE_TEXT,
ROOT_IMAGE_TOOLTIP,
} from '../../constants/index';
@@ -100,7 +99,7 @@ export default {
return !this.imageDetails.name ? ROOT_IMAGE_TOOLTIP : '';
},
imageName() {
- return this.imageDetails.name || ROOT_IMAGE_TEXT;
+ return this.imageDetails.name || this.imageDetails.project?.path;
},
formattedSize() {
const { size } = this.imageDetails;
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue
index 56da8e88b7a..bfa99c01c3f 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue
@@ -1,4 +1,5 @@
<script>
+import { uniqueId } from 'lodash';
import { GlIcon, GlPopover, GlLink, GlSprintf } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { timeTilRun } from '../../utils';
@@ -43,6 +44,11 @@ export default {
CLEANUP_STATUS_UNFINISHED,
PARTIAL_CLEANUP_CONTINUE_MESSAGE,
},
+ data() {
+ return {
+ iconId: uniqueId('status-info-'),
+ };
+ },
computed: {
showStatus() {
return this.status !== UNSCHEDULED_STATUS;
@@ -85,14 +91,14 @@ export default {
</span>
<gl-icon
v-if="failedDelete"
- id="status-info"
+ :id="iconId"
:size="14"
class="gl-text-gray-500"
data-testid="extra-info"
name="information-o"
/>
<gl-popover
- target="status-info"
+ :target="iconId"
container="status-popover-container"
v-bind="$options.statusPopoverOptions"
>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
index e67d77210bb..aecc0bf92ea 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
@@ -1,10 +1,12 @@
<script>
-import { GlTooltipDirective, GlIcon, GlSprintf, GlSkeletonLoader } from '@gitlab/ui';
+import { GlTooltipDirective, GlIcon, GlSprintf, GlSkeletonLoader, GlButton } from '@gitlab/ui';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { n__ } from '~/locale';
-
+import Tracking from '~/tracking';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
+import { joinPaths } from '~/lib/utils/url_utility';
import {
LIST_DELETE_BUTTON_DISABLED,
LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION,
@@ -13,8 +15,10 @@ import {
IMAGE_DELETE_SCHEDULED_STATUS,
IMAGE_FAILED_DELETED_STATUS,
IMAGE_MIGRATING_STATE,
- ROOT_IMAGE_TEXT,
COPY_IMAGE_PATH_TITLE,
+ IMAGE_FULL_PATH_LABEL,
+ TRACKING_ACTION_CLICK_SHOW_FULL_PATH,
+ TRACKING_LABEL_REGISTRY_IMAGE_LIST,
} from '../../constants/index';
import DeleteButton from '../delete_button.vue';
import CleanupStatus from './cleanup_status.vue';
@@ -25,6 +29,7 @@ export default {
ClipboardButton,
DeleteButton,
GlSprintf,
+ GlButton,
GlIcon,
ListItem,
GlSkeletonLoader,
@@ -33,6 +38,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [Tracking.mixin(), glFeatureFlagsMixin()],
inject: ['config'],
props: {
item: {
@@ -54,6 +60,12 @@ export default {
REMOVE_REPOSITORY_LABEL,
ROW_SCHEDULED_FOR_DELETION,
COPY_IMAGE_PATH_TITLE,
+ IMAGE_FULL_PATH_LABEL,
+ },
+ data() {
+ return {
+ showFullPath: false,
+ };
},
computed: {
disabledDelete() {
@@ -79,7 +91,17 @@ export default {
);
},
imageName() {
- return this.item.name ? this.item.path : `${this.item.path}/ ${ROOT_IMAGE_TEXT}`;
+ if (this.glFeatures.containerRegistryShowShortenedPath) {
+ if (this.showFullPath) {
+ return this.item.path;
+ }
+ const projectPath = this.item?.project?.path ?? '';
+ if (this.item.name) {
+ return joinPaths(projectPath, this.item.name);
+ }
+ return projectPath;
+ }
+ return this.item.path;
},
routerLinkEvent() {
return this.deleting ? '' : 'click';
@@ -90,6 +112,15 @@ export default {
: LIST_DELETE_BUTTON_DISABLED;
},
},
+ methods: {
+ hideButton() {
+ this.showFullPath = true;
+ this.$refs.imageName.$el.focus();
+ this.track(TRACKING_ACTION_CLICK_SHOW_FULL_PATH, {
+ label: TRACKING_LABEL_REGISTRY_IMAGE_LIST,
+ });
+ },
+ },
};
</script>
@@ -104,7 +135,20 @@ export default {
:disabled="deleting"
>
<template #left-primary>
+ <gl-button
+ v-if="glFeatures.containerRegistryShowShortenedPath && !showFullPath"
+ v-gl-tooltip="{
+ placement: 'top',
+ title: $options.i18n.IMAGE_FULL_PATH_LABEL,
+ }"
+ icon="ellipsis_h"
+ size="small"
+ class="gl-mr-2"
+ :aria-label="$options.i18n.IMAGE_FULL_PATH_LABEL"
+ @click="hideButton"
+ />
<router-link
+ ref="imageName"
class="gl-text-body gl-font-weight-bold"
data-testid="details-link"
data-qa-selector="registry_image_content"
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/common.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/common.js
index 17adaec7a7d..67ad281b835 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/common.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/common.js
@@ -1,6 +1,5 @@
-import { s__, __ } from '~/locale';
+import { __ } from '~/locale';
-export const ROOT_IMAGE_TEXT = s__('ContainerRegistry|Root image');
export const MORE_ACTIONS_TEXT = __('More actions');
export const NAME_SORT_FIELD = { orderBy: 'NAME', label: __('Name') };
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
index c6a7591e0d9..020d78ad364 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
@@ -43,6 +43,13 @@ export const EMPTY_RESULT_MESSAGE = s__(
export const COPY_IMAGE_PATH_TITLE = s__('ContainerRegistry|Copy image path');
+export const IMAGE_FULL_PATH_LABEL = s__('ContainerRegistry|Show full path');
+
+// Tracking
+
+export const TRACKING_LABEL_REGISTRY_IMAGE_LIST = 'registry_image_list';
+export const TRACKING_ACTION_CLICK_SHOW_FULL_PATH = 'click_show_full_path';
+
// Parameters
export const IMAGE_DELETE_SCHEDULED_STATUS = 'DELETE_SCHEDULED';
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue
index 71a85d8885e..9ebbdfa920d 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue
@@ -24,7 +24,6 @@ import {
FETCH_IMAGES_LIST_ERROR_MESSAGE,
UNFINISHED_STATUS,
MISSING_OR_DELETED_IMAGE_BREADCRUMB,
- ROOT_IMAGE_TEXT,
GRAPHQL_PAGE_SIZE,
MISSING_OR_DELETED_IMAGE_TITLE,
MISSING_OR_DELETED_IMAGE_MESSAGE,
@@ -111,7 +110,7 @@ export default {
methods: {
updateBreadcrumb() {
const name = this.containerRepository?.id
- ? this.containerRepository?.name || ROOT_IMAGE_TEXT
+ ? this.containerRepository?.name || this.containerRepository?.project?.path
: MISSING_OR_DELETED_IMAGE_BREADCRUMB;
this.breadCrumbState.updateName(name);
},
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue
index a25839be7e1..b91af19d623 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue
@@ -2,6 +2,12 @@
import { s__ } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import DetailsRow from '~/vue_shared/components/registry/details_row.vue';
+import Tracking from '~/tracking';
+import { packageTypeToTrackCategory } from '~/packages_and_registries/package_registry/utils';
+import {
+ TRACKING_ACTION_COPY_PACKAGE_ASSET_SHA,
+ TRACKING_LABEL_PACKAGE_ASSET,
+} from '~/packages_and_registries/package_registry/constants';
export default {
name: 'FileSha',
@@ -9,6 +15,7 @@ export default {
DetailsRow,
ClipboardButton,
},
+ mixins: [Tracking.mixin()],
props: {
sha: {
type: String,
@@ -22,6 +29,18 @@ export default {
i18n: {
copyButtonTitle: s__('PackageRegistry|Copy SHA'),
},
+ computed: {
+ tracking() {
+ return {
+ category: packageTypeToTrackCategory(this.packageType),
+ };
+ },
+ },
+ methods: {
+ copySha() {
+ this.track(TRACKING_ACTION_COPY_PACKAGE_ASSET_SHA, { label: TRACKING_LABEL_PACKAGE_ASSET });
+ },
+ },
};
</script>
@@ -35,6 +54,7 @@ export default {
:title="$options.i18n.copyButtonTitle"
category="tertiary"
size="small"
+ @click="copySha"
/>
</div>
</details-row>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue
index 9e700a5236f..a049b0eff8d 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue
@@ -5,8 +5,13 @@ import { numberToHumanSize } from '~/lib/utils/number_utils';
import { __ } from '~/locale';
import FileSha from '~/packages_and_registries/package_registry/components/details/file_sha.vue';
import Tracking from '~/tracking';
+import { packageTypeToTrackCategory } from '~/packages_and_registries/package_registry/utils';
import FileIcon from '~/vue_shared/components/file_icon.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import {
+ TRACKING_LABEL_PACKAGE_ASSET,
+ TRACKING_ACTION_EXPAND_PACKAGE_ASSET,
+} from '~/packages_and_registries/package_registry/constants';
export default {
name: 'PackageFiles',
@@ -76,6 +81,11 @@ export default {
},
].filter((c) => !c.hide);
},
+ tracking() {
+ return {
+ category: packageTypeToTrackCategory(this.packageType),
+ };
+ },
},
methods: {
formatSize(size) {
@@ -84,6 +94,11 @@ export default {
hasDetails(item) {
return item.fileSha256 || item.fileMd5 || item.fileSha1;
},
+ trackToggleDetails(detailsShowing) {
+ if (!detailsShowing) {
+ this.track(TRACKING_ACTION_EXPAND_PACKAGE_ASSET, { label: TRACKING_LABEL_PACKAGE_ASSET });
+ }
+ },
},
i18n: {
deleteFile: __('Delete file'),
@@ -106,7 +121,10 @@ export default {
:aria-label="detailsShowing ? __('Collapse') : __('Expand')"
category="tertiary"
size="small"
- @click="toggleDetails"
+ @click="
+ toggleDetails();
+ trackToggleDetails(detailsShowing);
+ "
/>
<gl-link
:href="item.downloadPath"
@@ -129,8 +147,8 @@ export default {
:href="item.pipeline.commitPath"
class="gl-text-gray-500"
data-testid="commit-link"
- >{{ item.pipeline.sha }}</gl-link
- >
+ >{{ item.pipeline.sha }}
+ </gl-link>
</template>
<template #cell(created)="{ item }">
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/constants.js b/app/assets/javascripts/packages_and_registries/package_registry/constants.js
index 3c090951b7d..cea053992f8 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/constants.js
+++ b/app/assets/javascripts/packages_and_registries/package_registry/constants.js
@@ -9,6 +9,7 @@ export {
DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
+ DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
} from '~/packages_and_registries/shared/constants';
export const PACKAGE_TYPE_CONAN = 'CONAN';
@@ -62,6 +63,12 @@ export const TRACKING_ACTION_COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND =
export const TRACKING_ACTION_COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND =
'copy_composer_package_include_command';
+export const TRACKING_LABEL_PACKAGE_ASSET = 'package_assets';
+
+export const TRACKING_ACTION_DOWNLOAD_PACKAGE_ASSET = 'download_package_asset';
+export const TRACKING_ACTION_EXPAND_PACKAGE_ASSET = 'expand_package_asset';
+export const TRACKING_ACTION_COPY_PACKAGE_ASSET_SHA = 'copy_package_asset_sha';
+
export const SHOW_DELETE_SUCCESS_ALERT = 'showSuccessDeleteAlert';
export const DELETE_PACKAGE_FILE_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while deleting the package file.',
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue
index 768c8d6478b..29438fba86b 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue
@@ -33,7 +33,6 @@ import {
DELETE_PACKAGE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
- PULL_PACKAGE_TRACKING_ACTION,
DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
@@ -41,6 +40,7 @@ import {
FETCH_PACKAGE_DETAILS_ERROR_MESSAGE,
DELETE_PACKAGE_FILE_ERROR_MESSAGE,
DELETE_PACKAGE_FILE_SUCCESS_MESSAGE,
+ DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
} from '~/packages_and_registries/package_registry/constants';
import destroyPackageFileMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_package_file.mutation.graphql';
@@ -76,10 +76,10 @@ export default {
DELETE_PACKAGE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
- PULL_PACKAGE_TRACKING_ACTION,
DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
+ DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
},
data() {
return {
@@ -288,7 +288,7 @@ export default {
v-if="showFiles"
:can-delete="packageEntity.canDestroy"
:package-files="packageFiles"
- @download-file="track($options.trackingActions.PULL_PACKAGE)"
+ @download-file="track($options.trackingActions.DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION)"
@delete-file="handleFileDelete"
/>
</gl-tab>
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/bundle.js b/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
index 482a3ef2ead..3689199751d 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
@@ -1,7 +1,6 @@
import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
-import { parseBoolean } from '~/lib/utils/common_utils';
import Translate from '~/vue_shared/translate';
import SettingsApp from './components/group_settings_app.vue';
import { apolloProvider } from './graphql';
@@ -20,7 +19,6 @@ export default () => {
provide: {
groupPath: el.dataset.groupPath,
groupDependencyProxyPath: el.dataset.groupDependencyProxyPath,
- defaultExpanded: parseBoolean(el.dataset.defaultExpanded),
},
render(createElement) {
return createElement(SettingsApp);
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue
index 130d6977936..59d4f5e24d0 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue
@@ -1,8 +1,7 @@
<script>
import { GlToggle, GlSprintf, GlLink } from '@gitlab/ui';
import { s__ } from '~/locale';
-import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
-import SettingsTitles from '~/packages_and_registries/settings/group/components/settings_titles.vue';
+import SettingsBlock from '~/packages_and_registries/shared/components/settings_block.vue';
import updateDependencyProxySettings from '~/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql';
import updateDependencyProxyImageTtlGroupPolicy from '~/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_image_ttl_group_policy.mutation.graphql';
import { updateGroupPackageSettings } from '~/packages_and_registries/settings/group/graphql/utils/cache_update';
@@ -13,6 +12,7 @@ import {
import {
DEPENDENCY_PROXY_HEADER,
+ DEPENDENCY_PROXY_DESCRIPTION,
DEPENDENCY_PROXY_DOCS_PATH,
} from '~/packages_and_registries/settings/group/constants';
@@ -23,15 +23,14 @@ export default {
GlSprintf,
GlLink,
SettingsBlock,
- SettingsTitles,
},
i18n: {
DEPENDENCY_PROXY_HEADER,
+ DEPENDENCY_PROXY_DESCRIPTION,
enabledProxyLabel: s__('DependencyProxy|Enable Dependency Proxy'),
enabledProxyHelpText: s__(
'DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}',
),
- storageSettingsTitle: s__('DependencyProxy|Storage settings'),
ttlPolicyEnabledLabel: s__('DependencyProxy|Clear the Dependency Proxy cache automatically'),
ttlPolicyEnabledHelpText: s__(
'DependencyProxy|When enabled, images older than 90 days will be removed from the cache.',
@@ -40,7 +39,7 @@ export default {
links: {
DEPENDENCY_PROXY_DOCS_PATH,
},
- inject: ['defaultExpanded', 'groupPath', 'groupDependencyProxyPath'],
+ inject: ['groupPath', 'groupDependencyProxyPath'],
props: {
dependencyProxySettings: {
type: Object,
@@ -130,11 +129,9 @@ export default {
</script>
<template>
- <settings-block
- :default-expanded="defaultExpanded"
- data-qa-selector="dependency_proxy_settings_content"
- >
+ <settings-block data-qa-selector="dependency_proxy_settings_content">
<template #title> {{ $options.i18n.DEPENDENCY_PROXY_HEADER }} </template>
+ <template #description> {{ $options.i18n.DEPENDENCY_PROXY_DESCRIPTION }} </template>
<template #default>
<div>
<gl-toggle
@@ -156,13 +153,12 @@ export default {
</span>
</template>
</gl-toggle>
-
- <settings-titles :title="$options.i18n.storageSettingsTitle" class="gl-my-6" />
<gl-toggle
v-model="ttlEnabled"
:disabled="isLoading"
:label="$options.i18n.ttlPolicyEnabledLabel"
:help="$options.i18n.ttlPolicyEnabledHelpText"
+ class="gl-mt-6"
data-testid="dependency-proxy-ttl-policies-toggle"
/>
</div>
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue
index b0088838acc..51a97aead49 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue
@@ -1,11 +1,9 @@
<script>
-import { GlSprintf, GlToggle, GlFormGroup, GlFormInput } from '@gitlab/ui';
+import { GlToggle, GlFormGroup, GlFormInput } from '@gitlab/ui';
import { isEqual } from 'lodash';
import {
DUPLICATES_TOGGLE_LABEL,
- DUPLICATES_ALLOWED_DISABLED,
- DUPLICATES_ALLOWED_ENABLED,
DUPLICATES_SETTING_EXCEPTION_TITLE,
DUPLICATES_SETTINGS_EXCEPTION_LEGEND,
} from '~/packages_and_registries/settings/group/constants';
@@ -18,7 +16,6 @@ export default {
DUPLICATES_SETTINGS_EXCEPTION_LEGEND,
},
components: {
- GlSprintf,
GlToggle,
GlFormGroup,
GlFormInput,
@@ -63,9 +60,6 @@ export default {
},
},
computed: {
- enabledButtonLabel() {
- return this.duplicatesAllowed ? DUPLICATES_ALLOWED_ENABLED : DUPLICATES_ALLOWED_DISABLED;
- },
isExceptionRegexValid() {
return !this.duplicateExceptionRegexError;
},
@@ -80,41 +74,30 @@ export default {
<template>
<form>
- <div class="gl-display-flex">
- <gl-toggle
- :data-qa-selector="toggleQaSelector"
- :label="$options.i18n.DUPLICATES_TOGGLE_LABEL"
- label-position="hidden"
- :value="duplicatesAllowed"
+ <gl-toggle
+ :data-qa-selector="toggleQaSelector"
+ :label="$options.i18n.DUPLICATES_TOGGLE_LABEL"
+ :value="!duplicatesAllowed"
+ :disabled="loading"
+ @change="update(modelNames.allowed, !$event)"
+ />
+ <gl-form-group
+ v-if="!duplicatesAllowed"
+ class="gl-mt-4"
+ :label="$options.i18n.DUPLICATES_SETTING_EXCEPTION_TITLE"
+ label-size="sm"
+ :state="isExceptionRegexValid"
+ :invalid-feedback="duplicateExceptionRegexError"
+ :description="$options.i18n.DUPLICATES_SETTINGS_EXCEPTION_LEGEND"
+ label-for="maven-duplicated-settings-regex-input"
+ >
+ <gl-form-input
+ id="maven-duplicated-settings-regex-input"
:disabled="loading"
- @change="update(modelNames.allowed, $event)"
+ size="lg"
+ :value="duplicateExceptionRegex"
+ @change="update(modelNames.exception, $event)"
/>
- <div class="gl-ml-5">
- <div data-testid="toggle-label" :data-qa-selector="labelQaSelector">
- <gl-sprintf :message="enabledButtonLabel">
- <template #bold="{ content }">
- <strong>{{ content }}</strong>
- </template>
- </gl-sprintf>
- </div>
- <gl-form-group
- v-if="!duplicatesAllowed"
- class="gl-mt-4"
- :label="$options.i18n.DUPLICATES_SETTING_EXCEPTION_TITLE"
- label-size="sm"
- :state="isExceptionRegexValid"
- :invalid-feedback="duplicateExceptionRegexError"
- :description="$options.i18n.DUPLICATES_SETTINGS_EXCEPTION_LEGEND"
- label-for="maven-duplicated-settings-regex-input"
- >
- <gl-form-input
- id="maven-duplicated-settings-regex-input"
- :disabled="loading"
- :value="duplicateExceptionRegex"
- @change="update(modelNames.exception, $event)"
- />
- </gl-form-group>
- </div>
- </div>
+ </gl-form-group>
</form>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue
index b7e88945dbd..abb9f02d290 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue
@@ -1,17 +1,15 @@
<script>
-import { GlSprintf, GlLink } from '@gitlab/ui';
import DuplicatesSettings from '~/packages_and_registries/settings/group/components/duplicates_settings.vue';
import GenericSettings from '~/packages_and_registries/settings/group/components/generic_settings.vue';
import MavenSettings from '~/packages_and_registries/settings/group/components/maven_settings.vue';
import {
PACKAGE_SETTINGS_HEADER,
PACKAGE_SETTINGS_DESCRIPTION,
- PACKAGES_DOCS_PATH,
} from '~/packages_and_registries/settings/group/constants';
import updateNamespacePackageSettings from '~/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql';
import { updateGroupPackageSettings } from '~/packages_and_registries/settings/group/graphql/utils/cache_update';
import { updateGroupPackagesSettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
-import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
+import SettingsBlock from '~/packages_and_registries/shared/components/settings_block.vue';
export default {
name: 'PackageSettings',
@@ -19,18 +17,13 @@ export default {
PACKAGE_SETTINGS_HEADER,
PACKAGE_SETTINGS_DESCRIPTION,
},
- links: {
- PACKAGES_DOCS_PATH,
- },
components: {
- GlSprintf,
- GlLink,
SettingsBlock,
MavenSettings,
GenericSettings,
DuplicatesSettings,
},
- inject: ['defaultExpanded', 'groupPath'],
+ inject: ['groupPath'],
props: {
packageSettings: {
type: Object,
@@ -91,20 +84,11 @@ export default {
</script>
<template>
- <settings-block
- :default-expanded="defaultExpanded"
- data-qa-selector="package_registry_settings_content"
- >
+ <settings-block data-qa-selector="package_registry_settings_content">
<template #title> {{ $options.i18n.PACKAGE_SETTINGS_HEADER }}</template>
<template #description>
<span data-testid="description">
- <gl-sprintf :message="$options.i18n.PACKAGE_SETTINGS_DESCRIPTION">
- <template #link="{ content }">
- <gl-link :href="$options.links.PACKAGES_DOCS_PATH" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
+ {{ $options.i18n.PACKAGE_SETTINGS_DESCRIPTION }}
</span>
</template>
<template #default>
@@ -116,8 +100,8 @@ export default {
:duplicate-exception-regex-error="errors.mavenDuplicateExceptionRegex"
:model-names="modelNames"
:loading="isLoading"
- toggle-qa-selector="allow_duplicates_toggle"
- label-qa-selector="allow_duplicates_label"
+ toggle-qa-selector="reject_duplicates_toggle"
+ label-qa-selector="reject_duplicates_label"
@update="updateSettings"
/>
</template>
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 0249b475e46..34764663892 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/constants.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/constants.js
@@ -1,17 +1,13 @@
import { helpPagePath } from '~/helpers/help_page_helper';
import { s__, __ } from '~/locale';
-export const PACKAGE_SETTINGS_HEADER = s__('PackageRegistry|Package Registry');
+export const PACKAGE_SETTINGS_HEADER = s__('PackageRegistry|Duplicate packages');
export const PACKAGE_SETTINGS_DESCRIPTION = s__(
- 'PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}',
+ 'PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing.',
);
-export const DUPLICATES_TOGGLE_LABEL = s__('PackageRegistry|Allow duplicates');
-export const DUPLICATES_ALLOWED_DISABLED = s__(
- '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} - Accept packages with the same name and version.',
+export const DUPLICATES_TOGGLE_LABEL = s__(
+ 'PackageRegistry|Reject packages with the same name and version',
);
export const DUPLICATES_SETTING_EXCEPTION_TITLE = __('Exceptions');
export const DUPLICATES_SETTINGS_EXCEPTION_LEGEND = s__(
@@ -19,6 +15,9 @@ export const DUPLICATES_SETTINGS_EXCEPTION_LEGEND = s__(
);
export const DEPENDENCY_PROXY_HEADER = s__('DependencyProxy|Dependency Proxy');
+export const DEPENDENCY_PROXY_DESCRIPTION = s__(
+ 'DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache.',
+);
// Parameters
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy.vue
index fdc7bd39780..90a18d5cf5a 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy.vue
@@ -81,7 +81,7 @@ export default {
</script>
<template>
- <settings-block :collapsible="false">
+ <settings-block data-testid="container-expiration-policy-project-settings">
<template #title> {{ $options.i18n.CONTAINER_CLEANUP_POLICY_TITLE }}</template>
<template #description>
<span>
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/expiration_dropdown.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/expiration_dropdown.vue
index d75fb31fd98..7682754fdcb 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/components/expiration_dropdown.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/expiration_dropdown.vue
@@ -30,6 +30,11 @@ export default {
type: String,
required: true,
},
+ description: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
};
</script>
@@ -46,5 +51,10 @@ export default {
{{ option.label }}
</option>
</gl-form-select>
+ <template v-if="description" #description>
+ <span data-testid="description" class="gl-text-gray-400">
+ {{ description }}
+ </span>
+ </template>
</gl-form-group>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy.vue
new file mode 100644
index 00000000000..1170407a349
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy.vue
@@ -0,0 +1,68 @@
+<script>
+import { GlAlert, GlSprintf } from '@gitlab/ui';
+import {
+ FETCH_SETTINGS_ERROR_MESSAGE,
+ PACKAGES_CLEANUP_POLICY_TITLE,
+ PACKAGES_CLEANUP_POLICY_DESCRIPTION,
+} from '~/packages_and_registries/settings/project/constants';
+import packagesCleanupPolicyQuery from '~/packages_and_registries/settings/project/graphql/queries/get_packages_cleanup_policy.query.graphql';
+import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
+
+import PackagesCleanupPolicyForm from './packages_cleanup_policy_form.vue';
+
+export default {
+ components: {
+ SettingsBlock,
+ GlAlert,
+ GlSprintf,
+ PackagesCleanupPolicyForm,
+ },
+ inject: ['projectPath'],
+ i18n: {
+ FETCH_SETTINGS_ERROR_MESSAGE,
+ PACKAGES_CLEANUP_POLICY_TITLE,
+ PACKAGES_CLEANUP_POLICY_DESCRIPTION,
+ },
+ apollo: {
+ packagesCleanupPolicy: {
+ query: packagesCleanupPolicyQuery,
+ variables() {
+ return {
+ projectPath: this.projectPath,
+ };
+ },
+ update: (data) => data.project?.packagesCleanupPolicy || {},
+ error(e) {
+ this.fetchSettingsError = e;
+ },
+ },
+ },
+ data() {
+ return {
+ fetchSettingsError: false,
+ packagesCleanupPolicy: {},
+ };
+ },
+};
+</script>
+
+<template>
+ <settings-block>
+ <template #title> {{ $options.i18n.PACKAGES_CLEANUP_POLICY_TITLE }}</template>
+ <template #description>
+ <span data-testid="description">
+ <gl-sprintf :message="$options.i18n.PACKAGES_CLEANUP_POLICY_DESCRIPTION" />
+ </span>
+ </template>
+ <template #default>
+ <gl-alert v-if="fetchSettingsError" variant="warning" :dismissible="false">
+ <gl-sprintf :message="$options.i18n.FETCH_SETTINGS_ERROR_MESSAGE" />
+ </gl-alert>
+ <packages-cleanup-policy-form
+ v-else
+ v-model="packagesCleanupPolicy"
+ :is-loading="$apollo.queries.packagesCleanupPolicy.loading"
+ />
+ </template>
+ </settings-block>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue
new file mode 100644
index 00000000000..b1751d5174a
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue
@@ -0,0 +1,137 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import {
+ UPDATE_SETTINGS_ERROR_MESSAGE,
+ UPDATE_SETTINGS_SUCCESS_MESSAGE,
+ SET_CLEANUP_POLICY_BUTTON,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_DESCRIPTION,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_FIELDNAME,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_LABEL,
+} from '~/packages_and_registries/settings/project/constants';
+import updatePackagesCleanupPolicyMutation from '~/packages_and_registries/settings/project/graphql/mutations/update_packages_cleanup_policy.mutation.graphql';
+import { formOptionsGenerator } from '~/packages_and_registries/settings/project/utils';
+import Tracking from '~/tracking';
+import ExpirationDropdown from './expiration_dropdown.vue';
+
+export default {
+ components: {
+ GlButton,
+ ExpirationDropdown,
+ },
+ mixins: [Tracking.mixin()],
+ inject: ['projectPath'],
+ props: {
+ value: {
+ type: Object,
+ required: true,
+ },
+ isLoading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ formOptions: formOptionsGenerator(),
+ i18n: {
+ KEEP_N_DUPLICATED_PACKAGE_FILES_LABEL,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_DESCRIPTION,
+ SET_CLEANUP_POLICY_BUTTON,
+ },
+ data() {
+ return {
+ tracking: {
+ label: 'packages_cleanup_policies',
+ },
+ mutationLoading: false,
+ };
+ },
+ computed: {
+ prefilledForm() {
+ return {
+ ...this.value,
+ keepNDuplicatedPackageFiles: this.findDefaultOption(
+ KEEP_N_DUPLICATED_PACKAGE_FILES_FIELDNAME,
+ ),
+ };
+ },
+ showLoadingIcon() {
+ return this.isLoading || this.mutationLoading;
+ },
+ isSubmitButtonDisabled() {
+ return this.showLoadingIcon;
+ },
+ isFieldDisabled() {
+ return this.showLoadingIcon;
+ },
+ mutationVariables() {
+ return {
+ projectPath: this.projectPath,
+ keepNDuplicatedPackageFiles: this.prefilledForm.keepNDuplicatedPackageFiles,
+ };
+ },
+ },
+ methods: {
+ findDefaultOption(option) {
+ return this.value[option] || this.$options.formOptions[option].find((f) => f.default)?.key;
+ },
+ submit() {
+ this.track('submit_packages_cleanup_form');
+ this.mutationLoading = true;
+ return this.$apollo
+ .mutate({
+ mutation: updatePackagesCleanupPolicyMutation,
+ variables: {
+ input: this.mutationVariables,
+ },
+ })
+ .then(({ data }) => {
+ const [errorMessage] = data?.updatePackagesCleanupPolicy?.errors ?? [];
+ if (errorMessage) {
+ throw errorMessage;
+ } else {
+ this.$toast.show(UPDATE_SETTINGS_SUCCESS_MESSAGE);
+ }
+ })
+ .catch(() => {
+ this.$toast.show(UPDATE_SETTINGS_ERROR_MESSAGE);
+ })
+ .finally(() => {
+ this.mutationLoading = false;
+ });
+ },
+ onModelChange(newValue, model) {
+ this.$emit('input', { ...this.value, [model]: newValue });
+ },
+ },
+};
+</script>
+
+<template>
+ <form ref="form-element" @submit.prevent="submit">
+ <div class="gl-md-max-w-50p">
+ <expiration-dropdown
+ v-model="prefilledForm.keepNDuplicatedPackageFiles"
+ :disabled="isFieldDisabled"
+ :form-options="$options.formOptions.keepNDuplicatedPackageFiles"
+ :label="$options.i18n.KEEP_N_DUPLICATED_PACKAGE_FILES_LABEL"
+ :description="$options.i18n.KEEP_N_DUPLICATED_PACKAGE_FILES_DESCRIPTION"
+ name="keep-n-duplicated-package-files"
+ data-testid="keep-n-duplicated-package-files-dropdown"
+ @input="onModelChange($event, 'keepNDuplicatedPackageFiles')"
+ />
+ </div>
+ <div class="gl-mt-7 gl-display-flex gl-align-items-center">
+ <gl-button
+ data-testid="save-button"
+ type="submit"
+ :disabled="isSubmitButtonDisabled"
+ :loading="showLoadingIcon"
+ category="primary"
+ variant="confirm"
+ class="js-no-auto-disable gl-mr-4"
+ >
+ {{ $options.i18n.SET_CLEANUP_POLICY_BUTTON }}
+ </gl-button>
+ </div>
+ </form>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue
index 95af19e6d85..710cfe7b1eb 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue
@@ -1,15 +1,19 @@
<script>
import ContainerExpirationPolicy from './container_expiration_policy.vue';
+import PackagesCleanupPolicy from './packages_cleanup_policy.vue';
export default {
components: {
ContainerExpirationPolicy,
+ PackagesCleanupPolicy,
},
+ inject: ['showContainerRegistrySettings', 'showPackageRegistrySettings'],
};
</script>
<template>
- <section data-testid="registry-settings-app">
- <container-expiration-policy />
- </section>
+ <div>
+ <packages-cleanup-policy v-if="showPackageRegistrySettings" />
+ <container-expiration-policy v-if="showContainerRegistrySettings" />
+ </div>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/constants.js b/app/assets/javascripts/packages_and_registries/settings/project/constants.js
index 40f980d15fb..948520151ce 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/constants.js
+++ b/app/assets/javascripts/packages_and_registries/settings/project/constants.js
@@ -55,6 +55,31 @@ export const EXPIRATION_POLICY_FOOTER_NOTE = s__(
'ContainerRegistry|Note: Any policy update will result in a change to the scheduled run date and time',
);
+export const PACKAGES_CLEANUP_POLICY_TITLE = s__(
+ 'PackageRegistry|Manage storage used by package assets',
+);
+export const PACKAGES_CLEANUP_POLICY_DESCRIPTION = s__(
+ 'PackageRegistry|When a package with same name and version is uploaded to the registry, more assets are added to the package. To save storage space, keep only the most recent assets.',
+);
+export const KEEP_N_DUPLICATED_PACKAGE_FILES_LABEL = s__(
+ 'PackageRegistry|Number of duplicate assets to keep',
+);
+export const KEEP_N_DUPLICATED_PACKAGE_FILES_DESCRIPTION = s__(
+ 'PackageRegistry|Examples of assets include .pom & .jar files',
+);
+
+export const KEEP_N_DUPLICATED_PACKAGE_FILES_FIELDNAME = 'keepNDuplicatedPackageFiles';
+
+export const KEEP_N_DUPLICATED_PACKAGE_FILES_OPTIONS = [
+ { key: 'ONE_PACKAGE_FILE', label: 1, default: false },
+ { key: 'TEN_PACKAGE_FILES', label: 10, default: false },
+ { key: 'TWENTY_PACKAGE_FILES', label: 20, default: false },
+ { key: 'THIRTY_PACKAGE_FILES', label: 30, default: false },
+ { key: 'FORTY_PACKAGE_FILES', label: 40, default: false },
+ { key: 'FIFTY_PACKAGE_FILES', label: 50, default: false },
+ { key: 'ALL_PACKAGE_FILES', label: __('All'), default: true },
+];
+
export const KEEP_N_OPTIONS = [
{ key: 'ONE_TAG', variable: 1, default: false },
{ key: 'FIVE_TAGS', variable: 5, default: false },
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/graphql/fragments/packages_cleanup_policy.fragment.graphql b/app/assets/javascripts/packages_and_registries/settings/project/graphql/fragments/packages_cleanup_policy.fragment.graphql
new file mode 100644
index 00000000000..a77ede37884
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/project/graphql/fragments/packages_cleanup_policy.fragment.graphql
@@ -0,0 +1,4 @@
+fragment PackagesCleanupPolicyFields on PackagesCleanupPolicy {
+ keepNDuplicatedPackageFiles
+ nextRunAt
+}
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/graphql/mutations/update_packages_cleanup_policy.mutation.graphql b/app/assets/javascripts/packages_and_registries/settings/project/graphql/mutations/update_packages_cleanup_policy.mutation.graphql
new file mode 100644
index 00000000000..31cdd67e881
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/project/graphql/mutations/update_packages_cleanup_policy.mutation.graphql
@@ -0,0 +1,10 @@
+#import "../fragments/packages_cleanup_policy.fragment.graphql"
+
+mutation updatePackagesCleanupPolicy($input: UpdatePackagesCleanupPolicyInput!) {
+ updatePackagesCleanupPolicy(input: $input) {
+ packagesCleanupPolicy {
+ ...PackagesCleanupPolicyFields
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/graphql/queries/get_packages_cleanup_policy.query.graphql b/app/assets/javascripts/packages_and_registries/settings/project/graphql/queries/get_packages_cleanup_policy.query.graphql
new file mode 100644
index 00000000000..0e9af253f2c
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/project/graphql/queries/get_packages_cleanup_policy.query.graphql
@@ -0,0 +1,10 @@
+#import "../fragments/packages_cleanup_policy.fragment.graphql"
+
+query getProjectPackagesCleanupPolicy($projectPath: ID!) {
+ project(fullPath: $projectPath) {
+ id
+ packagesCleanupPolicy {
+ ...PackagesCleanupPolicyFields
+ }
+ }
+}
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js b/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js
index 17c33073668..daf1da6eac8 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js
+++ b/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js
@@ -20,6 +20,8 @@ export default () => {
adminSettingsPath,
tagsRegexHelpPagePath,
helpPagePath,
+ showContainerRegistrySettings,
+ showPackageRegistrySettings,
} = el.dataset;
return new Vue({
el,
@@ -34,6 +36,8 @@ export default () => {
adminSettingsPath,
tagsRegexHelpPagePath,
helpPagePath,
+ showContainerRegistrySettings: parseBoolean(showContainerRegistrySettings),
+ showPackageRegistrySettings: parseBoolean(showPackageRegistrySettings),
},
render(createElement) {
return createElement('registry-settings-app', {});
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 b577a051862..847965454e9 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/utils.js
+++ b/app/assets/javascripts/packages_and_registries/settings/project/utils.js
@@ -1,5 +1,11 @@
import { n__ } from '~/locale';
-import { KEEP_N_OPTIONS, CADENCE_OPTIONS, OLDER_THAN_OPTIONS } from './constants';
+import {
+ KEEP_N_OPTIONS,
+ CADENCE_OPTIONS,
+ OLDER_THAN_OPTIONS,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_FIELDNAME,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_OPTIONS,
+} from './constants';
export const findDefaultOption = (options) => {
const item = options.find((o) => o.default);
@@ -25,5 +31,6 @@ export const formOptionsGenerator = () => {
olderThan: optionLabelGenerator(OLDER_THAN_OPTIONS, olderThanTranslationGenerator),
cadence: CADENCE_OPTIONS,
keepN: optionLabelGenerator(KEEP_N_OPTIONS, keepNTranslationGenerator),
+ [KEEP_N_DUPLICATED_PACKAGE_FILES_FIELDNAME]: KEEP_N_DUPLICATED_PACKAGE_FILES_OPTIONS,
};
};
diff --git a/app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue b/app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue
new file mode 100644
index 00000000000..5caf95cd050
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue
@@ -0,0 +1,17 @@
+<template>
+ <section class="settings gl-py-7">
+ <div class="gl-lg-display-flex">
+ <div class="gl-lg-w-half gl-pr-10">
+ <h4>
+ <slot name="title"></slot>
+ </h4>
+ <p>
+ <slot name="description"></slot>
+ </p>
+ </div>
+ <div class="gl-lg-w-half gl-pt-3">
+ <slot></slot>
+ </div>
+ </div>
+ </section>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js b/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js
index afc72a2c627..5505205cf33 100644
--- a/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js
+++ b/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js
@@ -11,6 +11,7 @@ export const PULL_PACKAGE_TRACKING_ACTION = 'pull_package';
export const DELETE_PACKAGE_FILE_TRACKING_ACTION = 'delete_package_file';
export const REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION = 'request_delete_package_file';
export const CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION = 'cancel_delete_package_file';
+export const DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION = 'download_package_asset';
export const TRACKING_ACTIONS = {
DELETE_PACKAGE: DELETE_PACKAGE_TRACKING_ACTION,
@@ -20,6 +21,7 @@ export const TRACKING_ACTIONS = {
DELETE_PACKAGE_FILE: DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE: REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE: CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
+ DOWNLOAD_PACKAGE_ASSET: DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
};
export const SHOW_DELETE_SUCCESS_ALERT = 'showSuccessDeleteAlert';
diff --git a/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue b/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue
index 5ecacb84d65..ccb449f96e1 100644
--- a/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue
+++ b/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue
@@ -12,6 +12,7 @@ import {
import { toSafeInteger } from 'lodash';
import csrf from '~/lib/utils/csrf';
import { __, n__, s__, sprintf } from '~/locale';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import SignupCheckbox from './signup_checkbox.vue';
const DENYLIST_TYPE_RAW = 'raw';
@@ -31,7 +32,12 @@ export default {
GlLink,
SignupCheckbox,
GlModal,
+ PasswordComplexityCheckboxGroup: () =>
+ import(
+ 'ee_component/pages/admin/application_settings/general/components/password_complexity_checkbox_group.vue'
+ ),
},
+ mixins: [glFeatureFlagMixin()],
inject: [
'host',
'settingsPath',
@@ -178,6 +184,9 @@ export default {
this.submitForm();
},
+ setPasswordComplexity({ name, value }) {
+ this.$set(this.form, name, value);
+ },
submitForm() {
this.$refs.form.submit();
},
@@ -291,9 +300,7 @@ export default {
<template #description>
<gl-sprintf
:message="
- s__(
- 'ApplicationSettings|See GitLab\'s %{linkStart}Password Policy Guidelines%{linkEnd}.',
- )
+ s__('ApplicationSettings|See %{linkStart}password policy guidelines%{linkEnd}.')
"
>
<template #link="{ content }">
@@ -305,6 +312,10 @@ export default {
</template>
</gl-form-group>
+ <password-complexity-checkbox-group
+ v-if="glFeatures.passwordComplexity"
+ @set-password-complexity="setPasswordComplexity"
+ />
<gl-form-group
:description="$options.i18n.domainAllowListDescription"
:label="$options.i18n.domainAllowListLabel"
diff --git a/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js b/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js
index a50d8de0e88..0d5c55cb87b 100644
--- a/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js
+++ b/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js
@@ -18,6 +18,10 @@ export default function initSignupRestrictions(elementSelector = '#js-signup-for
'domainDenylistEnabled',
'denylistTypeRawSelected',
'emailRestrictionsEnabled',
+ 'passwordNumberRequired',
+ 'passwordLowercaseRequired',
+ 'passwordUppercaseRequired',
+ 'passwordSymbolRequired',
],
});
diff --git a/app/assets/javascripts/pages/dashboard/todos/index/todos.js b/app/assets/javascripts/pages/dashboard/todos/index/todos.js
index 44299d235d5..e45a40bd44c 100644
--- a/app/assets/javascripts/pages/dashboard/todos/index/todos.js
+++ b/app/assets/javascripts/pages/dashboard/todos/index/todos.js
@@ -28,20 +28,32 @@ export default class Todos {
}
unbindEvents() {
- $('.js-done-todo, .js-undo-todo, .js-add-todo').off('click', this.updateRowStateClickedWrapper);
- $('.js-todos-mark-all', '.js-todos-undo-all').off('click', this.updateallStateClickedWrapper);
- $('.todo').off('click', this.goToTodoUrl);
- $('.todo').off('auxclick', this.goToTodoUrl);
+ document.querySelectorAll('.js-done-todo, .js-undo-todo, .js-add-todo').forEach((el) => {
+ el.removeEventListener('click', this.updateRowStateClickedWrapper);
+ });
+ document.querySelectorAll('.js-todos-mark-all, .js-todos-undo-all').forEach((el) => {
+ el.removeEventListener('click', this.updateallStateClickedWrapper);
+ });
+ document.querySelectorAll('.todo').forEach((el) => {
+ el.removeEventListener('click', this.goToTodoUrl);
+ el.removeEventListener('auxclick', this.goToTodoUrl);
+ });
}
bindEvents() {
this.updateRowStateClickedWrapper = this.updateRowStateClicked.bind(this);
this.updateAllStateClickedWrapper = this.updateAllStateClicked.bind(this);
- $('.js-done-todo, .js-undo-todo, .js-add-todo').on('click', this.updateRowStateClickedWrapper);
- $('.js-todos-mark-all, .js-todos-undo-all').on('click', this.updateAllStateClickedWrapper);
- $('.todo').on('click', this.goToTodoUrl);
- $('.todo').on('auxclick', this.goToTodoUrl);
+ document.querySelectorAll('.js-done-todo, .js-undo-todo, .js-add-todo').forEach((el) => {
+ el.addEventListener('click', this.updateRowStateClickedWrapper);
+ });
+ document.querySelectorAll('.js-todos-mark-all, .js-todos-undo-all').forEach((el) => {
+ el.addEventListener('click', this.updateAllStateClickedWrapper);
+ });
+ document.querySelectorAll('.todo').forEach((el) => {
+ el.addEventListener('click', this.goToTodoUrl);
+ el.addEventListener('auxclick', this.goToTodoUrl);
+ });
}
initFilters() {
@@ -181,7 +193,13 @@ export default class Todos {
}
updateBadges(data) {
- $(document).trigger('todo:toggle', data.count);
+ const event = new CustomEvent('todo:toggle', {
+ detail: {
+ count: data.count,
+ },
+ });
+
+ document.dispatchEvent(event);
document.querySelector('.js-todos-pending .js-todos-badge').innerHTML = addDelimiter(
data.count,
);
diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js
index c7c2f6f773e..62d47cb49b8 100644
--- a/app/assets/javascripts/pages/groups/group_members/index.js
+++ b/app/assets/javascripts/pages/groups/group_members/index.js
@@ -5,12 +5,11 @@ import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { s__ } from '~/locale';
import { initMembersApp } from '~/members';
-import { MEMBER_TYPES } from '~/members/constants';
+import { MEMBER_TYPES, EE_APP_OPTIONS } from 'ee_else_ce/members/constants';
import { groupLinkRequestFormatter } from '~/members/utils';
const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
-
-initMembersApp(document.querySelector('.js-group-members-list-app'), {
+const APP_OPTIONS = {
[MEMBER_TYPES.user]: {
tableFields: SHARED_FIELDS.concat(['source', 'granted', 'userCreatedAt', 'lastActivityOn']),
tableAttrs: { tr: { 'data-qa-selector': 'member_row' } },
@@ -61,7 +60,10 @@ initMembersApp(document.querySelector('.js-group-members-list-app'), {
tableFields: SHARED_FIELDS.concat('requested'),
requestFormatter: groupMemberRequestFormatter,
},
-});
+ ...EE_APP_OPTIONS,
+};
+
+initMembersApp(document.querySelector('.js-group-members-list-app'), APP_OPTIONS);
initInviteMembersModal();
initInviteGroupsModal();
diff --git a/app/assets/javascripts/pages/groups/runners/index.js b/app/assets/javascripts/pages/groups/runners/index/index.js
index ca1a6bdab75..ca1a6bdab75 100644
--- a/app/assets/javascripts/pages/groups/runners/index.js
+++ b/app/assets/javascripts/pages/groups/runners/index/index.js
diff --git a/app/assets/javascripts/pages/groups/runners/show/index.js b/app/assets/javascripts/pages/groups/runners/show/index.js
new file mode 100644
index 00000000000..c59e3b80dc1
--- /dev/null
+++ b/app/assets/javascripts/pages/groups/runners/show/index.js
@@ -0,0 +1,3 @@
+import { initGroupRunnerShow } from '~/runner/group_runner_show';
+
+initGroupRunnerShow();
diff --git a/app/assets/javascripts/pages/projects/branches/new/index.js b/app/assets/javascripts/pages/projects/branches/new/index.js
index 364223f1898..dbae89b5ade 100644
--- a/app/assets/javascripts/pages/projects/branches/new/index.js
+++ b/app/assets/javascripts/pages/projects/branches/new/index.js
@@ -1,8 +1,7 @@
-import $ from 'jquery';
import NewBranchForm from '~/new_branch_form';
// eslint-disable-next-line no-new
new NewBranchForm(
- $('.js-create-branch-form'),
+ document.querySelector('.js-create-branch-form'),
JSON.parse(document.getElementById('availableRefs').innerHTML),
);
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 701bf0c1e1d..f92a40e057f 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
@@ -329,7 +329,7 @@ export default {
</div>
<p class="gl-mt-n5 gl-text-gray-500">
- {{ s__('ForkProject|Want to house several dependent projects under the same namespace?') }}
+ {{ s__('ForkProject|Want to organize several dependent projects under the same namespace?') }}
<gl-link :href="newGroupPath" target="_blank">
{{ s__('ForkProject|Create a group') }}
</gl-link>
diff --git a/app/assets/javascripts/pages/projects/google_cloud/configuration/index.js b/app/assets/javascripts/pages/projects/google_cloud/configuration/index.js
new file mode 100644
index 00000000000..abececa44ee
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/google_cloud/configuration/index.js
@@ -0,0 +1,3 @@
+import init from '~/google_cloud/configuration/index';
+
+init();
diff --git a/app/assets/javascripts/pages/projects/google_cloud/databases/index.js b/app/assets/javascripts/pages/projects/google_cloud/databases/index.js
new file mode 100644
index 00000000000..5482324f1cd
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/google_cloud/databases/index.js
@@ -0,0 +1,3 @@
+import init from '~/google_cloud/databases/index';
+
+init();
diff --git a/app/assets/javascripts/pages/projects/google_cloud/deployments/index.js b/app/assets/javascripts/pages/projects/google_cloud/deployments/index.js
new file mode 100644
index 00000000000..b5a29b3825b
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/google_cloud/deployments/index.js
@@ -0,0 +1,3 @@
+import init from '~/google_cloud/deployments/index';
+
+init();
diff --git a/app/assets/javascripts/pages/projects/google_cloud/gcp_regions/index.js b/app/assets/javascripts/pages/projects/google_cloud/gcp_regions/index.js
new file mode 100644
index 00000000000..fb66e2fa051
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/google_cloud/gcp_regions/index.js
@@ -0,0 +1,3 @@
+import init from '~/google_cloud/gcp_regions/index';
+
+init();
diff --git a/app/assets/javascripts/pages/projects/google_cloud/index.js b/app/assets/javascripts/pages/projects/google_cloud/index.js
deleted file mode 100644
index 4506ea8efd1..00000000000
--- a/app/assets/javascripts/pages/projects/google_cloud/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import initGoogleCloud from '~/google_cloud/index';
-
-initGoogleCloud();
diff --git a/app/assets/javascripts/pages/projects/google_cloud/service_accounts/index.js b/app/assets/javascripts/pages/projects/google_cloud/service_accounts/index.js
new file mode 100644
index 00000000000..8b644c2b324
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/google_cloud/service_accounts/index.js
@@ -0,0 +1,3 @@
+import init from '~/google_cloud/service_accounts/index';
+
+init();
diff --git a/app/assets/javascripts/pages/projects/jobs/index/index.js b/app/assets/javascripts/pages/projects/jobs/index/index.js
index 75194499a7f..eb3a24f38a8 100644
--- a/app/assets/javascripts/pages/projects/jobs/index/index.js
+++ b/app/assets/javascripts/pages/projects/jobs/index/index.js
@@ -1,23 +1,3 @@
-import Vue from 'vue';
import initJobsTable from '~/jobs/components/table';
-import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
-if (gon.features?.jobsTableVue) {
- initJobsTable();
-} else {
- const remainingTimeElements = document.querySelectorAll('.js-remaining-time');
-
- remainingTimeElements.forEach(
- (el) =>
- new Vue({
- el,
- render(h) {
- return h(GlCountdown, {
- props: {
- endDateString: el.dateTime,
- },
- });
- },
- }),
- );
-}
+initJobsTable();
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/included_in_trial_indicator.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/included_in_trial_indicator.vue
new file mode 100644
index 00000000000..693dc6a15ad
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/included_in_trial_indicator.vue
@@ -0,0 +1,15 @@
+<script>
+import { s__ } from '~/locale';
+
+export default {
+ name: 'IncludedInTrialIndicator',
+ i18n: {
+ trialOnly: s__('LearnGitlab|- Included in trial'),
+ },
+};
+</script>
+<template>
+ <span class="gl-font-style-italic gl-text-gray-500" data-testid="trial-only">
+ {{ $options.i18n.trialOnly }}
+ </span>
+</template>
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue
index db9ef4df8af..54e15b6552c 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue
@@ -38,14 +38,16 @@ export default {
actionsData: this.actions,
};
},
- maxValue: Object.keys(ACTION_LABELS).length,
actionSections: Object.keys(ACTION_SECTIONS),
computed: {
+ maxValue() {
+ return Object.keys(this.actionsData).length;
+ },
progressValue() {
return Object.values(this.actionsData).filter((a) => a.completed).length;
},
progressPercentage() {
- return Math.round((this.progressValue / this.$options.maxValue) * 100);
+ return Math.round((this.progressValue / this.maxValue) * 100);
},
},
mounted() {
@@ -125,7 +127,7 @@ export default {
<template #percentSymbol>%</template>
</gl-sprintf>
</p>
- <gl-progress-bar :value="progressValue" :max="$options.maxValue" />
+ <gl-progress-bar :value="progressValue" :max="maxValue" />
</div>
<div class="row">
<div
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue
deleted file mode 100644
index 09cc0032871..00000000000
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-<script>
-import { GlLink, GlCard, GlIcon } from '@gitlab/ui';
-import { s__ } from '~/locale';
-
-export default {
- name: 'LearnGitlabInfoCard',
- components: { GlLink, GlCard, GlIcon },
- i18n: {
- trial: s__('Learn GitLab|Trial only'),
- },
- props: {
- title: {
- required: true,
- type: String,
- },
- description: {
- required: true,
- type: String,
- },
- actionLabel: {
- required: true,
- type: String,
- },
- url: {
- required: true,
- type: String,
- },
- completed: {
- required: true,
- type: Boolean,
- },
- svg: {
- required: true,
- type: String,
- },
- trialRequired: {
- default: false,
- required: false,
- type: Boolean,
- },
- },
-};
-</script>
-<template>
- <gl-card class="gl-pt-0">
- <div class="gl-text-right gl-h-5">
- <gl-icon
- v-if="completed"
- name="check-circle-filled"
- class="gl-text-green-500"
- :size="16"
- data-testid="completed-icon"
- />
- <span
- v-else-if="trialRequired"
- class="gl-text-gray-500 gl-font-sm gl-font-style-italic"
- data-testid="trial-only"
- >{{ $options.i18n.trial }}</span
- >
- </div>
- <div
- class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
- >
- <img :src="svg" :alt="actionLabel" />
- <h6>{{ title }}</h6>
- <p class="gl-font-sm gl-text-gray-700">{{ description }}</p>
- <gl-link :href="url" target="_blank" rel="noopener noreferrer" />
- </div>
- </gl-card>
-</template>
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
index 1912477758b..4eab0cccb06 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
@@ -6,6 +6,7 @@ import { isExperimentVariant } from '~/experimentation/utils';
import eventHub from '~/invite_members/event_hub';
import { s__, __ } from '~/locale';
import { ACTION_LABELS } from '../constants';
+import IncludedInTrialIndicator from './included_in_trial_indicator.vue';
export default {
name: 'LearnGitlabSectionLink',
@@ -15,12 +16,12 @@ export default {
GlButton,
GlPopover,
GitlabExperiment,
+ IncludedInTrialIndicator,
},
directives: {
GlTooltip,
},
i18n: {
- trialOnly: s__('LearnGitlab|Trial only'),
contactAdmin: s__('LearnGitlab|Contact your administrator to start a free Ultimate trial.'),
viewAdminList: s__('LearnGitlab|View administrator list'),
watchHow: __('Watch how'),
@@ -41,12 +42,6 @@ export default {
};
},
computed: {
- linkTitle() {
- return ACTION_LABELS[this.action].title;
- },
- trialOnly() {
- return ACTION_LABELS[this.action].trialRequired;
- },
showInviteModalLink() {
return (
this.action === 'userAdded' && isExperimentVariant('invite_for_help_continuous_onboarding')
@@ -55,49 +50,51 @@ export default {
openInNewTab() {
return ACTION_LABELS[this.action]?.openInNewTab === true || this.value.openInNewTab === true;
},
- linkToVideoTutorial() {
- return ACTION_LABELS[this.action].videoTutorial;
- },
},
methods: {
openModal() {
eventHub.$emit('openModal', { source: 'learn_gitlab' });
},
+ actionLabelValue(value) {
+ return ACTION_LABELS[this.action][value];
+ },
},
};
</script>
<template>
<div class="gl-mb-4">
- <div v-if="trialOnly" class="gl-font-style-italic gl-text-gray-500" data-testid="trial-only">
- {{ $options.i18n.trialOnly }}
- </div>
<div class="flex align-items-center">
<span v-if="value.completed" class="gl-text-green-500">
<gl-icon name="check-circle-filled" :size="16" data-testid="completed-icon" />
- {{ linkTitle }}
+ {{ actionLabelValue('title') }}
+ <included-in-trial-indicator v-if="actionLabelValue('trialRequired')" />
</span>
- <gl-link
- v-else-if="showInviteModalLink"
- data-track-action="click_link"
- :data-track-label="linkTitle"
- data-track-property="Growth::Activation::Experiment::InviteForHelpContinuousOnboarding"
- data-testid="invite-for-help-continuous-onboarding-experiment-link"
- @click="openModal"
- >
- {{ linkTitle }}
- </gl-link>
- <gl-link
- v-else-if="value.enabled"
- :target="openInNewTab ? '_blank' : '_self'"
- :href="value.url"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- :data-track-label="linkTitle"
- >
- {{ linkTitle }}
- </gl-link>
+ <div v-else-if="showInviteModalLink">
+ <gl-link
+ data-track-action="click_link"
+ :data-track-label="actionLabelValue('trackLabel')"
+ data-track-property="Growth::Activation::Experiment::InviteForHelpContinuousOnboarding"
+ data-testid="invite-for-help-continuous-onboarding-experiment-link"
+ @click="openModal"
+ >{{ actionLabelValue('title') }}</gl-link
+ >
+
+ <included-in-trial-indicator v-if="actionLabelValue('trialRequired')" />
+ </div>
+ <div v-else-if="value.enabled">
+ <gl-link
+ :target="openInNewTab ? '_blank' : '_self'"
+ :href="value.url"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ :data-track-label="actionLabelValue('trackLabel')"
+ >{{ actionLabelValue('title') }}</gl-link
+ >
+
+ <included-in-trial-indicator v-if="actionLabelValue('trialRequired')" />
+ </div>
<template v-else>
- <div data-testid="disabled-learn-gitlab-link">{{ linkTitle }}</div>
+ <div data-testid="disabled-learn-gitlab-link">{{ actionLabelValue('title') }}</div>
<gl-button
:id="popoverId"
category="tertiary"
@@ -127,19 +124,19 @@ export default {
<template #control></template>
<template #candidate>
<gl-button
- v-if="linkToVideoTutorial"
+ v-if="actionLabelValue('videoTutorial')"
v-gl-tooltip
category="tertiary"
icon="live-preview"
:title="$options.i18n.watchHow"
:aria-label="$options.i18n.watchHow"
- :href="linkToVideoTutorial"
+ :href="actionLabelValue('videoTutorial')"
target="_blank"
class="ml-auto"
size="small"
data-testid="video-tutorial-link"
data-track-action="click_video_link"
- :data-track-label="linkTitle"
+ :data-track-label="actionLabelValue('trackLabel')"
data-track-property="Growth::Conversion::Experiment::LearnGitLab"
data-track-experiment="video_tutorials_continuous_onboarding"
/>
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
index 05bacd9b350..cb1a0302d91 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
@@ -2,9 +2,10 @@ import { s__ } from '~/locale';
export const ACTION_LABELS = {
gitWrite: {
- title: s__('LearnGitLab|Create or import a repository'),
- actionLabel: s__('LearnGitLab|Create or import a repository'),
+ title: s__('LearnGitLab|Create a repository'),
+ actionLabel: s__('LearnGitLab|Create a repository'),
description: s__('LearnGitLab|Create or import your first repository into your new project.'),
+ trackLabel: 'create_a_repository',
section: 'workspace',
position: 1,
},
@@ -14,20 +15,23 @@ export const ACTION_LABELS = {
description: s__(
'LearnGitLab|GitLab works best as a team. Invite your colleague to enjoy all features.',
),
+ trackLabel: 'invite_your_colleagues',
section: 'workspace',
position: 0,
},
pipelineCreated: {
- title: s__('LearnGitLab|Set up CI/CD'),
- actionLabel: s__('LearnGitLab|Set-up CI/CD'),
+ title: s__("LearnGitLab|Set up your first project's CI/CD"),
+ actionLabel: s__('LearnGitLab|Set up CI/CD'),
description: s__('LearnGitLab|Save time by automating your integration and deployment tasks.'),
+ trackLabel: 'set_up_your_first_project_s_ci_cd',
section: 'workspace',
position: 2,
},
trialStarted: {
- title: s__('LearnGitLab|Start a free Ultimate trial'),
+ title: s__('LearnGitLab|Start a free trial of GitLab Ultimate'),
actionLabel: s__('LearnGitLab|Try GitLab Ultimate for free'),
description: s__('LearnGitLab|Try all GitLab features for 30 days, no credit card required.'),
+ trackLabel: 'start_a_free_trial_of_gitlab_ultimate',
section: 'workspace',
position: 3,
openInNewTab: true,
@@ -38,6 +42,7 @@ export const ACTION_LABELS = {
description: s__(
'LearnGitLab|Prevent unexpected changes to important assets by assigning ownership of files and paths.',
),
+ trackLabel: 'add_code_owners',
trialRequired: true,
section: 'workspace',
position: 4,
@@ -45,9 +50,10 @@ export const ACTION_LABELS = {
videoTutorial: 'https://vimeo.com/670896787',
},
requiredMrApprovalsEnabled: {
- title: s__('LearnGitLab|Add merge request approval'),
+ title: s__('LearnGitLab|Enable require merge approvals'),
actionLabel: s__('LearnGitLab|Enable require merge approvals'),
description: s__('LearnGitLab|Route code reviews to the right reviewers, every time.'),
+ trackLabel: 'enable_require_merge_approvals',
trialRequired: true,
section: 'workspace',
position: 5,
@@ -55,28 +61,52 @@ export const ACTION_LABELS = {
videoTutorial: 'https://vimeo.com/670904904',
},
mergeRequestCreated: {
- title: s__('LearnGitLab|Submit a merge request'),
+ title: s__('LearnGitLab|Submit a merge request (MR)'),
actionLabel: s__('LearnGitLab|Submit a merge request (MR)'),
description: s__('LearnGitLab|Review and edit proposed changes to source code.'),
+ trackLabel: 'submit_a_merge_request_mr',
section: 'plan',
position: 1,
},
- securityScanEnabled: {
- title: s__('LearnGitLab|Run a Security scan using CI/CD'),
- actionLabel: s__('LearnGitLab|Run a Security scan using CI/CD'),
- description: s__('LearnGitLab|Scan your code to uncover vulnerabilities before deploying.'),
- section: 'deploy',
- position: 1,
- },
issueCreated: {
title: s__('LearnGitLab|Create an issue'),
actionLabel: s__('LearnGitLab|Create an issue'),
description: s__(
'LearnGitLab|Create/import issues (tickets) to collaborate on ideas and plan work.',
),
+ trackLabel: 'create_an_issue',
section: 'plan',
position: 0,
},
+ securityScanEnabled: {
+ title: s__('LearnGitLab|Run a Security scan using CI/CD'),
+ actionLabel: s__('LearnGitLab|Run a Security scan using CI/CD'),
+ description: s__('LearnGitLab|Scan your code to uncover vulnerabilities before deploying.'),
+ trackLabel: 'run_a_security_scan_using_ci_cd',
+ section: 'deploy',
+ position: 1,
+ },
+ licenseScanningRun: {
+ title: s__('LearnGitLab|Scan dependencies for licenses'),
+ trackLabel: 'scan_dependencies_for_licenses',
+ trialRequired: true,
+ section: 'deploy',
+ position: 2,
+ },
+ secureDependencyScanningRun: {
+ title: s__('LearnGitLab|Scan dependencies for vulnerabilities'),
+ trackLabel: 'scan_dependencies_for_vulnerabilities',
+ trialRequired: true,
+ section: 'deploy',
+ position: 3,
+ },
+ secureDastRun: {
+ title: s__('LearnGitLab|Analyze your application for vulnerabilities with DAST'),
+ trackLabel: 'analyze_your_application_for_vulnerabilities_with_dast',
+ trialRequired: true,
+ section: 'deploy',
+ position: 4,
+ },
};
export const ACTION_SECTIONS = {
diff --git a/app/assets/javascripts/pages/projects/logs/index.js b/app/assets/javascripts/pages/projects/logs/index.js
deleted file mode 100644
index 0cff1ffc27e..00000000000
--- a/app/assets/javascripts/pages/projects/logs/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import logsBundle from '~/logs';
-
-logsBundle();
diff --git a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js
index 48e360ce762..2db804e1ad8 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js
@@ -9,6 +9,7 @@ import initSourcegraph from '~/sourcegraph';
import ZenMode from '~/zen_mode';
import initAwardsApp from '~/emoji/awards_app';
import MrWidgetHowToMergeModal from '~/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue';
+import { initMrExperienceSurvey } from '~/surveys/merge_request_experience';
import getStateQuery from './queries/get_state.query.graphql';
export default function initMergeRequestShow() {
@@ -18,6 +19,7 @@ export default function initMergeRequestShow() {
initSourcegraph();
initIssuableSidebar();
initAwardsApp(document.getElementById('js-vue-awards-block'));
+ initMrExperienceSurvey();
const el = document.querySelector('.js-mr-status-box');
const { iid, issuableType, projectPath } = el.dataset;
diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js
index bf4fb5f3b7e..9a7fd74fd8c 100644
--- a/app/assets/javascripts/pages/projects/project_members/index.js
+++ b/app/assets/javascripts/pages/projects/project_members/index.js
@@ -1,4 +1,5 @@
-import initImportAProjectModal from '~/invite_members/init_import_a_project_modal';
+import initImportProjectMembersTrigger from '~/invite_members/init_import_project_members_trigger';
+import initImportProjectMembersModal from '~/invite_members/init_import_project_members_modal';
import initInviteGroupTrigger from '~/invite_members/init_invite_group_trigger';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteGroupsModal from '~/invite_members/init_invite_groups_modal';
@@ -9,11 +10,12 @@ import { MEMBER_TYPES } from '~/members/constants';
import { groupLinkRequestFormatter } from '~/members/utils';
import { projectMemberRequestFormatter } from '~/projects/members/utils';
-initImportAProjectModal();
+initImportProjectMembersModal();
initInviteMembersModal();
initInviteGroupsModal();
initInviteMembersTrigger();
initInviteGroupTrigger();
+initImportProjectMembersTrigger();
const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
initMembersApp(document.querySelector('.js-project-members-list-app'), {
@@ -38,7 +40,7 @@ initMembersApp(document.querySelector('.js-project-members-list-app'), {
},
},
[MEMBER_TYPES.group]: {
- tableFields: SHARED_FIELDS.concat('granted'),
+ tableFields: SHARED_FIELDS.concat(['source', 'granted']),
tableAttrs: {
table: { 'data-qa-selector': 'groups_list' },
tr: { 'data-qa-selector': 'group_row' },
@@ -46,7 +48,7 @@ initMembersApp(document.querySelector('.js-project-members-list-app'), {
requestFormatter: groupLinkRequestFormatter,
filteredSearchBar: {
show: true,
- tokens: [],
+ tokens: ['groups_with_inherited_permissions'],
searchParam: 'search_groups',
placeholder: s__('Members|Search groups'),
recentSearchesStorageKey: 'project_group_links',
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 43ab829f5f9..6a9bd34db22 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
@@ -9,6 +9,7 @@ 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';
+import { initCiSecureFiles } from '~/ci_secure_files';
// Initialize expandable settings panels
initSettingsPanels();
@@ -41,3 +42,4 @@ initSharedRunnersToggle();
initInstallRunner();
initRunnerAwsDeployments();
initTokenAccess();
+initCiSecureFiles();
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 81b0dbec0bd..f2c30870a68 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
@@ -61,6 +61,10 @@ export default {
GlFormCheckbox,
GlToggle,
ConfirmDanger,
+ otherProjectSettings: () =>
+ import(
+ 'jh_component/pages/projects/shared/permissions/components/other_project_settings.vue'
+ ),
},
mixins: [settingsMixin, glFeatureFlagsMixin()],
@@ -182,6 +186,10 @@ export default {
required: false,
default: false,
},
+ membersPagePath: {
+ type: String,
+ required: true,
+ },
},
data() {
const defaults = {
@@ -521,12 +529,22 @@ export default {
/>
</div>
</div>
- <span v-if="!visibilityAllowed(visibilityLevel)" class="form-text text-muted">{{
- s__(
- 'ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project.',
- )
- }}</span>
- <span class="form-text text-muted">{{ visibilityLevelDescription }}</span>
+ <span
+ v-if="!visibilityAllowed(visibilityLevel)"
+ class="gl-display-block gl-text-gray-500 gl-mt-2"
+ >{{
+ s__(
+ 'ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project.',
+ )
+ }}</span
+ >
+ <span class="gl-display-block gl-text-gray-500 gl-mt-2">
+ <gl-sprintf :message="visibilityLevelDescription">
+ <template #membersPageLink="{ content }">
+ <gl-link class="gl-link" :href="membersPagePath">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </span>
<div v-if="showAdditonalSettings" class="gl-mt-4">
<strong class="gl-display-block">{{ s__('ProjectSettings|Additional options') }}</strong>
<label
@@ -891,6 +909,7 @@ export default {
<template #help>{{ $options.i18n.pucWarningHelpText }}</template>
</gl-form-checkbox>
</project-setting-row>
+ <other-project-settings />
<confirm-danger
v-if="isVisibilityReduced"
button-variant="confirm"
diff --git a/app/assets/javascripts/pages/projects/shared/permissions/constants.js b/app/assets/javascripts/pages/projects/shared/permissions/constants.js
index fb1acd5311c..cfca9d400e3 100644
--- a/app/assets/javascripts/pages/projects/shared/permissions/constants.js
+++ b/app/assets/javascripts/pages/projects/shared/permissions/constants.js
@@ -8,12 +8,10 @@ export const visibilityOptions = {
export const visibilityLevelDescriptions = {
[visibilityOptions.PRIVATE]: __(
- 'The project is accessible only by members of the project. Access must be granted explicitly to each user.',
- ),
- [visibilityOptions.INTERNAL]: __('The project can be accessed by any user who is logged in.'),
- [visibilityOptions.PUBLIC]: __(
- 'The project can be accessed by anyone, regardless of authentication.',
+ `Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user.`,
),
+ [visibilityOptions.INTERNAL]: __('Accessible by any user who is logged in.'),
+ [visibilityOptions.PUBLIC]: __('Accessible by anyone, regardless of authentication.'),
};
export const featureAccessLevel = {
diff --git a/app/assets/javascripts/pages/projects/work_items/index.js b/app/assets/javascripts/pages/projects/work_items/index.js
index 11c257611f0..6eef2352e2c 100644
--- a/app/assets/javascripts/pages/projects/work_items/index.js
+++ b/app/assets/javascripts/pages/projects/work_items/index.js
@@ -1,3 +1,5 @@
import { initWorkItemsRoot } from '~/work_items/index';
+import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
initWorkItemsRoot();
+initInviteMembersModal();
diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue
index 7c23f60954a..e92f386a29e 100644
--- a/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue
+++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue
@@ -3,6 +3,7 @@ import { GlSkeletonLoader, GlSafeHtmlDirective, GlAlert } from '@gitlab/ui';
import createFlash from '~/flash';
import { __ } from '~/locale';
import axios from '~/lib/utils/axios_utils';
+import { handleLocationHash } from '~/lib/utils/common_utils';
import { renderGFM } from '../render_gfm_facade';
export default {
@@ -43,6 +44,7 @@ export default {
this.$nextTick()
.then(() => {
renderGFM(this.$refs.content);
+ handleLocationHash();
})
.catch(() =>
createFlash({
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 024b3bc9595..3c22844434d 100644
--- a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
+++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
@@ -1,5 +1,16 @@
<script>
-import { GlForm, GlIcon, GlLink, GlButton, GlSprintf, GlAlert } from '@gitlab/ui';
+import {
+ GlForm,
+ GlIcon,
+ GlLink,
+ GlButton,
+ GlSprintf,
+ GlAlert,
+ GlFormGroup,
+ GlFormInput,
+ GlFormSelect,
+} from '@gitlab/ui';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import axios from '~/lib/utils/axios_utils';
import csrf from '~/lib/utils/csrf';
import { setUrlFragment } from '~/lib/utils/url_utility';
@@ -75,12 +86,16 @@ export default {
},
components: {
GlAlert,
+ GlIcon,
GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlFormSelect,
GlSprintf,
- GlIcon,
GlLink,
GlButton,
MarkdownField,
+ LocalStorageSync,
ContentEditor: () =>
import(
/* webpackChunkName: 'content_editor' */ '~/content_editor/components/content_editor.vue'
@@ -186,6 +201,10 @@ export default {
this.useContentEditor = !this.useContentEditor;
},
+ setUseContentEditor(value) {
+ this.useContentEditor = value;
+ },
+
async handleFormSubmit(e) {
e.preventDefault();
@@ -305,150 +324,151 @@ export default {
name="wiki[last_commit_sha]"
:value="pageInfo.lastCommitSha"
/>
- <div class="form-group row">
- <div class="col-sm-2 col-form-label">
- <label class="control-label-full-width" for="wiki_title">{{
- $options.i18n.title.label
- }}</label>
- </div>
- <div class="col-sm-10">
- <input
- id="wiki_title"
- v-model="title"
- name="wiki[title]"
- type="text"
- class="form-control"
- data-qa-selector="wiki_title_textbox"
- :required="true"
- :autofocus="!pageInfo.persisted"
- :placeholder="$options.i18n.title.placeholder"
- @input="updateCommitMessage"
- />
- <span class="gl-display-inline-block gl-max-w-full gl-mt-2 gl-text-gray-600">
- <gl-icon class="gl-mr-n1" name="bulb" />
- {{ titleHelpText }}
- <gl-link :href="helpPath" target="_blank">
- {{ $options.i18n.title.helpText.learnMore }}
- </gl-link>
- </span>
- </div>
- </div>
- <div class="form-group row">
- <div class="col-sm-2 col-form-label">
- <label class="control-label-full-width" for="wiki_format">{{
- $options.i18n.format.label
- }}</label>
+
+ <div class="row">
+ <div class="col-sm-9">
+ <gl-form-group :label="$options.i18n.title.label" label-for="wiki_title">
+ <template #description>
+ <gl-icon class="gl-mr-n1" name="bulb" />
+ {{ titleHelpText }}
+ <gl-link :href="helpPath" target="_blank">
+ {{ $options.i18n.title.helpText.learnMore }}
+ </gl-link>
+ </template>
+
+ <gl-form-input
+ id="wiki_title"
+ v-model="title"
+ name="wiki[title]"
+ type="text"
+ class="form-control"
+ data-qa-selector="wiki_title_textbox"
+ :required="true"
+ :autofocus="!pageInfo.persisted"
+ :placeholder="$options.i18n.title.placeholder"
+ @input="updateCommitMessage"
+ />
+ </gl-form-group>
</div>
- <div class="col-sm-10">
- <select
- id="wiki_format"
- v-model="format"
- class="form-control"
- name="wiki[format]"
- :disabled="isContentEditorActive"
- >
- <option v-for="(key, label) of formatOptions" :key="key" :value="key">
- {{ label }}
- </option>
- </select>
+
+ <div class="col-sm-3 row-sm-10">
+ <gl-form-group :label="$options.i18n.format.label" label-for="wiki_format">
+ <gl-form-select
+ id="wiki_format"
+ v-model="format"
+ name="wiki[format]"
+ :disabled="isContentEditorActive"
+ class="form-control"
+ :value="formatOptions.Markdown"
+ >
+ <option v-for="(key, label) of formatOptions" :key="key" :value="key">
+ {{ label }}
+ </option>
+ </gl-form-select>
+ </gl-form-group>
</div>
</div>
- <div class="form-group row" data-testid="wiki-form-content-fieldset">
- <div class="col-sm-2 col-form-label">
- <label class="control-label-full-width" for="wiki_content">{{
- $options.i18n.content.label
- }}</label>
- </div>
- <div class="col-sm-10">
- <div v-if="isMarkdownFormat" class="gl-display-flex gl-justify-content-end gl-mb-3">
- <gl-button
- data-testid="toggle-editing-mode-button"
- data-qa-selector="editing_mode_button"
- :data-qa-mode="toggleEditingModeButtonText"
- variant="link"
- @click="toggleEditingMode"
- >{{ toggleEditingModeButtonText }}</gl-button
- >
- </div>
- <markdown-field
- v-if="!isContentEditorActive"
- :markdown-preview-path="pageInfo.markdownPreviewPath"
- :can-attach-file="true"
- :enable-autocomplete="true"
- :textarea-value="content"
- :markdown-docs-path="pageInfo.markdownHelpPath"
- :uploads-path="pageInfo.uploadsPath"
- :enable-preview="isMarkdownFormat"
- class="bordered-box"
- >
- <template #textarea>
- <textarea
- id="wiki_content"
- ref="textarea"
- v-model="content"
- name="wiki[content]"
- class="note-textarea js-gfm-input js-autosize markdown-area"
- dir="auto"
- data-supports-quick-actions="false"
- data-qa-selector="wiki_content_textarea"
- :autofocus="pageInfo.persisted"
- :aria-label="$options.i18n.content.label"
- :placeholder="$options.i18n.content.placeholder"
- @input="handleContentChange"
+
+ <div class="row" data-testid="wiki-form-content-fieldset">
+ <div class="col-sm-12 row-sm-5">
+ <gl-form-group>
+ <div v-if="isMarkdownFormat" class="gl-display-flex gl-justify-content-end gl-mb-3">
+ <gl-button
+ data-testid="toggle-editing-mode-button"
+ data-qa-selector="editing_mode_button"
+ :data-qa-mode="toggleEditingModeButtonText"
+ variant="link"
+ @click="toggleEditingMode"
+ >{{ toggleEditingModeButtonText }}</gl-button
>
- </textarea>
- </template>
- </markdown-field>
- <div v-if="isContentEditorActive">
- <content-editor
- :render-markdown="renderMarkdown"
- :uploads-path="pageInfo.uploadsPath"
- @initialized="loadInitialContent"
- @change="handleContentEditorChange"
+ </div>
+ <local-storage-sync
+ storage-key="gl-wiki-content-editor-enabled"
+ :value="useContentEditor"
+ @input="setUseContentEditor"
/>
- <input id="wiki_content" v-model.trim="content" type="hidden" name="wiki[content]" />
- </div>
+ <markdown-field
+ v-if="!isContentEditorActive"
+ :markdown-preview-path="pageInfo.markdownPreviewPath"
+ :can-attach-file="true"
+ :enable-autocomplete="true"
+ :textarea-value="content"
+ :markdown-docs-path="pageInfo.markdownHelpPath"
+ :uploads-path="pageInfo.uploadsPath"
+ :enable-preview="isMarkdownFormat"
+ class="bordered-box"
+ >
+ <template #textarea>
+ <textarea
+ id="wiki_content"
+ ref="textarea"
+ v-model="content"
+ name="wiki[content]"
+ class="note-textarea js-gfm-input js-autosize markdown-area"
+ dir="auto"
+ data-supports-quick-actions="false"
+ data-qa-selector="wiki_content_textarea"
+ :autofocus="pageInfo.persisted"
+ :aria-label="$options.i18n.content.label"
+ :placeholder="$options.i18n.content.placeholder"
+ @input="handleContentChange"
+ >
+ </textarea>
+ </template>
+ </markdown-field>
+ <div v-if="isContentEditorActive">
+ <content-editor
+ :render-markdown="renderMarkdown"
+ :uploads-path="pageInfo.uploadsPath"
+ @initialized="loadInitialContent"
+ @change="handleContentEditorChange"
+ />
+ <input id="wiki_content" v-model.trim="content" type="hidden" name="wiki[content]" />
+ </div>
- <div class="clearfix"></div>
- <div class="error-alert"></div>
+ <div class="clearfix"></div>
+ <div class="error-alert"></div>
- <div class="form-text gl-text-gray-600">
- <gl-sprintf v-if="displayWikiSpecificMarkdownHelp" :message="$options.i18n.linksHelpText">
- <template #linkExample
- ><code>{{ linkExample }}</code></template
+ <div class="form-text gl-text-gray-600">
+ <gl-sprintf
+ v-if="displayWikiSpecificMarkdownHelp"
+ :message="$options.i18n.linksHelpText"
>
- <template
- #link="// eslint-disable-next-line vue/no-template-shadow
+ <template #linkExample>
+ <code>{{ linkExample }}</code>
+ </template>
+ <template
+ #link="// eslint-disable-next-line vue/no-template-shadow
{ content }"
- ><gl-link
- :href="wikiSpecificMarkdownHelpPath"
- target="_blank"
- data-testid="wiki-markdown-help-link"
- >{{ content }}</gl-link
- ></template
- >
- </gl-sprintf>
- </div>
+ ><gl-link
+ :href="wikiSpecificMarkdownHelpPath"
+ target="_blank"
+ data-testid="wiki-markdown-help-link"
+ >{{ content }}</gl-link
+ ></template
+ >
+ </gl-sprintf>
+ </div>
+ </gl-form-group>
</div>
</div>
- <div class="form-group row">
- <div class="col-sm-2 col-form-label">
- <label class="control-label-full-width" for="wiki_message">{{
- $options.i18n.commitMessage.label
- }}</label>
- </div>
- <div class="col-sm-10">
- <input
- id="wiki_message"
- v-model.trim="commitMessage"
- name="wiki[message]"
- type="text"
- class="form-control"
- data-qa-selector="wiki_message_textbox"
- :placeholder="$options.i18n.commitMessage.label"
- />
+
+ <div class="row">
+ <div class="col-sm-12 row-sm-5">
+ <gl-form-group :label="$options.i18n.commitMessage.label" label-for="wiki_message">
+ <gl-form-input
+ id="wiki_message"
+ v-model.trim="commitMessage"
+ name="wiki[message]"
+ type="text"
+ class="form-control"
+ data-qa-selector="wiki_message_textbox"
+ :placeholder="$options.i18n.commitMessage.label"
+ />
+ </gl-form-group>
</div>
</div>
+
<div class="form-actions">
<gl-button
category="primary"
diff --git a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
index 1da4a8fea73..a5fa85f1ed5 100644
--- a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
+++ b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
@@ -216,7 +216,7 @@ export default {
v-if="currentRequest"
:current-request="currentRequest"
:requests="requests"
- class="ml-auto"
+ class="gl-ml-auto"
@change-current-request="changeCurrentRequest"
/>
<add-request v-on="$listeners" />
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 23f1592cac1..610a570c4ce 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
@@ -19,7 +19,7 @@ export const i18n = {
invalid: s__('Pipelines|This GitLab CI configuration is invalid.'),
invalidWithReason: s__('Pipelines|This GitLab CI configuration is invalid: %{reason}.'),
unavailableValidation: s__('Pipelines|Configuration validation currently not available.'),
- valid: s__('Pipelines|This GitLab CI configuration is valid.'),
+ valid: s__('Pipelines|Pipeline syntax is correct.'),
};
export default {
diff --git a/app/assets/javascripts/pipeline_editor/components/lint/ci_lint_results.vue b/app/assets/javascripts/pipeline_editor/components/lint/ci_lint_results.vue
index 9a789ccab4d..0f19b9386e6 100644
--- a/app/assets/javascripts/pipeline_editor/components/lint/ci_lint_results.vue
+++ b/app/assets/javascripts/pipeline_editor/components/lint/ci_lint_results.vue
@@ -52,6 +52,11 @@ export default {
required: false,
default: false,
},
+ hideAlert: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
isValid: {
type: Boolean,
required: true,
@@ -63,7 +68,8 @@ export default {
},
lintHelpPagePath: {
type: String,
- required: true,
+ required: false,
+ default: '',
},
warnings: {
type: Array,
@@ -96,6 +102,7 @@ export default {
<template>
<div>
<gl-alert
+ v-if="!hideAlert"
class="gl-mb-5"
:variant="status.variant"
:title="__('Status:')"
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 08d246a9a00..99ee244577e 100644
--- a/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
+++ b/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
@@ -1,6 +1,6 @@
<script>
import { GlAlert, GlLoadingIcon, GlTabs } from '@gitlab/ui';
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
import PipelineGraph from '~/pipelines/components/pipeline_graph/pipeline_graph.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { getParameterValues, setUrlParams, updateHistory } from '~/lib/utils/url_utility';
@@ -16,6 +16,7 @@ import {
TAB_QUERY_PARAM,
TABS_INDEX,
VALIDATE_TAB,
+ VALIDATE_TAB_BADGE_DISMISSED_KEY,
VISUALIZE_TAB,
} from '../constants';
import getAppStatus from '../graphql/queries/client/app_status.query.graphql';
@@ -29,6 +30,7 @@ import WalkthroughPopover from './popovers/walkthrough_popover.vue';
export default {
i18n: {
+ new: __('NEW'),
tabEdit: s__('Pipelines|Edit'),
tabGraph: s__('Pipelines|Visualize'),
tabLint: s__('Pipelines|Lint'),
@@ -87,6 +89,10 @@ export default {
required: false,
default: '',
},
+ currentTab: {
+ type: String,
+ required: true,
+ },
isNewCiConfigFile: {
type: Boolean,
required: true,
@@ -104,6 +110,11 @@ export default {
},
},
},
+ data() {
+ return {
+ showValidateNewBadge: false,
+ };
+ },
computed: {
isMergedYamlAvailable() {
return this.ciConfigData?.mergedYaml;
@@ -123,6 +134,16 @@ export default {
isLoading() {
return this.appStatus === EDITOR_APP_STATUS_LOADING;
},
+ validateTabBadgeTitle() {
+ if (this.showValidateNewBadge) {
+ return this.$options.i18n.new;
+ }
+
+ return '';
+ },
+ },
+ mounted() {
+ this.showValidateNewBadge = !JSON.parse(localStorage.getItem(VALIDATE_TAB_BADGE_DISMISSED_KEY));
},
created() {
const [tabQueryParam] = getParameterValues(TAB_QUERY_PARAM);
@@ -134,6 +155,11 @@ export default {
},
methods: {
setCurrentTab(tabName) {
+ if (this.currentTab === VALIDATE_TAB) {
+ localStorage.setItem(VALIDATE_TAB_BADGE_DISMISSED_KEY, 'true');
+ this.showValidateNewBadge = false;
+ }
+
this.$emit('set-current-tab', tabName);
},
setDefaultTab(tabName) {
@@ -189,11 +215,11 @@ export default {
v-if="glFeatures.simulatePipeline"
class="gl-mb-3"
data-testid="validate-tab"
+ :badge-title="validateTabBadgeTitle"
:title="$options.i18n.tabValidate"
@click="setCurrentTab($options.tabConstants.VALIDATE_TAB)"
>
- <gl-loading-icon v-if="isLoading" size="lg" class="gl-m-3" />
- <ci-validate v-else />
+ <ci-validate :ci-file-content="ciFileContent" />
</editor-tab>
<editor-tab
v-else
diff --git a/app/assets/javascripts/pipeline_editor/components/popovers/validate_pipeline_popover.vue b/app/assets/javascripts/pipeline_editor/components/popovers/validate_pipeline_popover.vue
new file mode 100644
index 00000000000..4730a521227
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/popovers/validate_pipeline_popover.vue
@@ -0,0 +1,72 @@
+<script>
+import { GlLink, GlPopover, GlOutsideDirective as Outside, GlSprintf } from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+import { VALIDATE_TAB_FEEDBACK_URL } from '../../constants';
+
+export const i18n = {
+ feedbackLink: __('Provide Feedback'),
+ popoverContent: s__(
+ 'PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}',
+ ),
+ title: s__('PipelineEditor|Validate pipeline under simulated conditions'),
+};
+
+export default {
+ name: 'ValidatePipelinePopover',
+ directives: { Outside },
+ components: {
+ GlLink,
+ GlPopover,
+ GlSprintf,
+ },
+ inject: ['simulatePipelineHelpPagePath'],
+ data() {
+ return {
+ showPopover: false,
+ };
+ },
+ methods: {
+ dismiss() {
+ this.showPopover = false;
+ },
+ },
+ i18n,
+ VALIDATE_TAB_FEEDBACK_URL,
+};
+</script>
+
+<template>
+ <gl-popover
+ :show.sync="showPopover"
+ target="validate-pipeline-help"
+ triggers="hover focus"
+ placement="top"
+ >
+ <p class="gl-my-3 gl-font-weight-bold">{{ $options.i18n.title }}</p>
+ <p>
+ <gl-sprintf :message="$options.i18n.popoverContent">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ <template #link="{ content }">
+ <gl-link
+ class="gl-font-sm"
+ target="_blank"
+ :href="simulatePipelineHelpPagePath"
+ data-testid="help-link"
+ >{{ content }}</gl-link
+ >
+ </template>
+ </gl-sprintf>
+ </p>
+ <p class="gl-text-right gl-mb-3">
+ <gl-link
+ class="gl-font-sm"
+ target="_blank"
+ :href="$options.VALIDATE_TAB_FEEDBACK_URL"
+ data-testid="feedback-link"
+ >{{ $options.i18n.feedbackLink }}</gl-link
+ >
+ </p>
+ </gl-popover>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/ui/editor_tab.vue b/app/assets/javascripts/pipeline_editor/components/ui/editor_tab.vue
index 673599da085..65f399d1912 100644
--- a/app/assets/javascripts/pipeline_editor/components/ui/editor_tab.vue
+++ b/app/assets/javascripts/pipeline_editor/components/ui/editor_tab.vue
@@ -1,5 +1,5 @@
<script>
-import { GlAlert, GlTab } from '@gitlab/ui';
+import { GlAlert, GlBadge, GlTab } from '@gitlab/ui';
import { __, s__ } from '~/locale';
/**
* Wrapper of <gl-tab> to optionally lazily render this tab's content
@@ -48,6 +48,7 @@ export default {
},
components: {
GlAlert,
+ GlBadge,
GlTab,
// Use a small renderless component to know when the tab content mounts because:
// - gl-tab always gets mounted, even if lazy is `true`. See:
@@ -59,6 +60,16 @@ export default {
},
inheritAttrs: false,
props: {
+ badgeTitle: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ badgeVariant: {
+ type: String,
+ required: false,
+ default: 'info',
+ },
emptyMessage: {
type: String,
required: false,
@@ -91,6 +102,10 @@ export default {
required: false,
default: false,
},
+ title: {
+ type: String,
+ required: true,
+ },
},
data() {
return {
@@ -98,7 +113,11 @@ export default {
};
},
computed: {
+ hasBadgeTitle() {
+ return this.badgeTitle.length > 0;
+ },
slots() {
+ // eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots
return Object.keys(this.$slots);
},
},
@@ -116,6 +135,12 @@ export default {
</script>
<template>
<gl-tab :lazy="isLazy" v-bind="$attrs" v-on="$listeners">
+ <template #title>
+ <span>{{ title }}</span>
+ <gl-badge v-if="hasBadgeTitle" class="gl-ml-2" size="sm" :variant="badgeVariant">{{
+ badgeTitle
+ }}</gl-badge>
+ </template>
<gl-alert v-if="isEmpty" variant="tip">{{ emptyMessage }}</gl-alert>
<gl-alert v-else-if="isUnavailable" variant="danger" :dismissible="false">
{{ $options.i18n.unavailable }}</gl-alert
diff --git a/app/assets/javascripts/pipeline_editor/components/validate/ci_validate.vue b/app/assets/javascripts/pipeline_editor/components/validate/ci_validate.vue
index 5f26318497b..47673119db9 100644
--- a/app/assets/javascripts/pipeline_editor/components/validate/ci_validate.vue
+++ b/app/assets/javascripts/pipeline_editor/components/validate/ci_validate.vue
@@ -1,9 +1,35 @@
<script>
-import { GlButton, GlDropdown, GlTooltipDirective, GlSprintf } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlButton,
+ GlDropdown,
+ GlIcon,
+ GlLoadingIcon,
+ GlLink,
+ GlTooltip,
+ GlTooltipDirective,
+ GlSprintf,
+} from '@gitlab/ui';
import { s__, __ } from '~/locale';
+import ValidatePipelinePopover from '../popovers/validate_pipeline_popover.vue';
+import CiLintResults from '../lint/ci_lint_results.vue';
+import getBlobContent from '../../graphql/queries/blob_content.query.graphql';
+import getCurrentBranch from '../../graphql/queries/client/current_branch.query.graphql';
+import lintCiMutation from '../../graphql/mutations/client/lint_ci.mutation.graphql';
export const i18n = {
+ alertDesc: s__(
+ 'PipelineEditor|Simulated a %{codeStart}git push%{codeEnd} event for a default branch. %{codeStart}Rules%{codeEnd}, %{codeStart}only%{codeEnd}, %{codeStart}except%{codeEnd}, and %{codeStart}needs%{codeEnd} job dependencies logic have been evaluated. %{linkStart}Learn more%{linkEnd}',
+ ),
+ cancelBtn: __('Cancel'),
+ contentChange: s__(
+ 'PipelineEditor|Configuration content has changed. Re-run validation for updated results.',
+ ),
+ cta: s__('PipelineEditor|Validate pipeline'),
+ ctaDisabledTooltip: s__('PipelineEditor|Waiting for CI content to load...'),
+ errorAlertTitle: s__('PipelineEditor|Pipeline simulation completed with errors'),
help: __('Help'),
+ loading: s__('PipelineEditor|Validating pipeline... It can take up to a minute.'),
pipelineSource: s__('PipelineEditor|Pipeline Source'),
pipelineSourceDefault: s__('PipelineEditor|Git push event to the default branch'),
pipelineSourceTooltip: s__('PipelineEditor|Other pipeline sources are not available yet.'),
@@ -14,37 +40,179 @@ export const i18n = {
simulationNote: s__(
'PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies.',
),
- cta: s__('PipelineEditor|Validate pipeline'),
+ successAlertTitle: s__('PipelineEditor|Simulation completed successfully'),
};
+export const VALIDATE_TAB_INIT = 'VALIDATE_TAB_INIT';
+export const VALIDATE_TAB_RESULTS = 'VALIDATE_TAB_RESULTS';
+export const VALIDATE_TAB_LOADING = 'VALIDATE_TAB_LOADING';
+const BASE_CLASSES = [
+ 'gl-display-flex',
+ 'gl-flex-direction-column',
+ 'gl-align-items-center',
+ 'gl-mt-11',
+];
+
export default {
name: 'CiValidateTab',
components: {
+ CiLintResults,
+ GlAlert,
GlButton,
GlDropdown,
+ GlIcon,
+ GlLoadingIcon,
+ GlLink,
GlSprintf,
+ GlTooltip,
+ ValidatePipelinePopover,
},
directives: {
GlTooltip: GlTooltipDirective,
},
- inject: ['validateTabIllustrationPath'],
+ inject: ['ciConfigPath', 'ciLintPath', 'projectFullPath', 'validateTabIllustrationPath'],
+ props: {
+ ciFileContent: {
+ type: String,
+ required: true,
+ },
+ },
+ apollo: {
+ initialBlobContent: {
+ query: getBlobContent,
+ variables() {
+ return {
+ projectPath: this.projectFullPath,
+ path: this.ciConfigPath,
+ ref: this.currentBranch,
+ };
+ },
+ update(data) {
+ return data?.project?.repository?.blobs?.nodes[0]?.rawBlob;
+ },
+ },
+ currentBranch: {
+ query: getCurrentBranch,
+ update(data) {
+ return data.workBranches?.current?.name;
+ },
+ },
+ },
+ data() {
+ return {
+ yaml: this.ciFileContent,
+ state: VALIDATE_TAB_INIT,
+ errors: [],
+ hasCiContentChanged: false,
+ isValid: false,
+ jobs: [],
+ warnings: [],
+ };
+ },
+ computed: {
+ isInitialCiContentLoading() {
+ return this.$apollo.queries.initialBlobContent.loading;
+ },
+ isInitState() {
+ return this.state === VALIDATE_TAB_INIT;
+ },
+ isSimulationLoading() {
+ return this.state === VALIDATE_TAB_LOADING;
+ },
+ hasSimulationResults() {
+ return this.state === VALIDATE_TAB_RESULTS;
+ },
+ resultStatus() {
+ return {
+ title: this.isValid ? i18n.successAlertTitle : i18n.errorAlertTitle,
+ variant: this.isValid ? 'success' : 'danger',
+ };
+ },
+ },
+ watch: {
+ ciFileContent(value) {
+ this.yaml = value;
+ this.hasCiContentChanged = true;
+ },
+ },
+ methods: {
+ cancelSimulation() {
+ this.state = VALIDATE_TAB_INIT;
+ },
+ async validateYaml() {
+ this.state = VALIDATE_TAB_LOADING;
+
+ try {
+ const {
+ data: {
+ lintCI: { errors, jobs, valid, warnings },
+ },
+ } = await this.$apollo.mutate({
+ mutation: lintCiMutation,
+ variables: {
+ dry_run: true,
+ content: this.yaml,
+ endpoint: this.ciLintPath,
+ },
+ });
+
+ // only save the result if the user did not cancel the simulation
+ if (this.state === VALIDATE_TAB_LOADING) {
+ this.errors = errors;
+ this.jobs = jobs;
+ this.warnings = warnings;
+ this.isValid = valid;
+ this.state = VALIDATE_TAB_RESULTS;
+ this.hasCiContentChanged = false;
+ }
+ } catch (error) {
+ this.cancelSimulation();
+ }
+ },
+ },
i18n,
+ BASE_CLASSES,
};
</script>
<template>
<div>
- <div class="gl-mt-3">
- <label>{{ $options.i18n.pipelineSource }}</label>
- <gl-dropdown
- v-gl-tooltip.hover
- :title="$options.i18n.pipelineSourceTooltip"
- :text="$options.i18n.pipelineSourceDefault"
- disabled
- data-testid="pipeline-source"
- />
+ <div class="gl-display-flex gl-justify-content-space-between gl-mt-3">
+ <div>
+ <label>{{ $options.i18n.pipelineSource }}</label>
+ <gl-dropdown
+ v-gl-tooltip.hover
+ class="gl-ml-3"
+ :title="$options.i18n.pipelineSourceTooltip"
+ :text="$options.i18n.pipelineSourceDefault"
+ disabled
+ data-testid="pipeline-source"
+ />
+ <validate-pipeline-popover />
+ <gl-icon
+ id="validate-pipeline-help"
+ name="question-o"
+ class="gl-ml-1 gl-fill-blue-500"
+ category="secondary"
+ variant="confirm"
+ :aria-label="$options.i18n.help"
+ />
+ </div>
+ <div v-if="hasSimulationResults && hasCiContentChanged">
+ <span class="gl-text-gray-400" data-testid="content-status">
+ {{ $options.i18n.contentChange }}
+ </span>
+ <gl-button
+ variant="confirm"
+ class="gl-ml-2 gl-mb-2"
+ data-testid="resimulate-pipeline-button"
+ @click="validateYaml"
+ >
+ {{ $options.i18n.cta }}
+ </gl-button>
+ </div>
</div>
- <div class="gl-display-flex gl-flex-direction-column gl-align-items-center gl-mt-11">
+ <div v-if="isInitState" :class="$options.BASE_CLASSES">
<img :src="validateTabIllustrationPath" />
<h1 class="gl-font-size-h1 gl-mb-6">{{ $options.i18n.title }}</h1>
<ul>
@@ -57,9 +225,61 @@ export default {
</gl-sprintf>
</li>
</ul>
- <gl-button variant="confirm" class="gl-mt-3" data-qa-selector="simulate_pipeline">
- {{ $options.i18n.cta }}
- </gl-button>
+ <div ref="simulatePipelineButton">
+ <gl-button
+ ref="simulatePipelineButton"
+ variant="confirm"
+ class="gl-mt-3"
+ :disabled="isInitialCiContentLoading"
+ data-testid="simulate-pipeline-button"
+ @click="validateYaml"
+ >
+ {{ $options.i18n.cta }}
+ </gl-button>
+ </div>
+ <gl-tooltip
+ v-if="isInitialCiContentLoading"
+ :target="() => $refs.simulatePipelineButton"
+ :title="$options.i18n.ctaDisabledTooltip"
+ data-testid="cta-tooltip"
+ />
+ </div>
+ <div v-else-if="isSimulationLoading" :class="$options.BASE_CLASSES">
+ <gl-loading-icon size="lg" class="gl-m-3" />
+ <h1 class="gl-font-size-h1 gl-mb-6">{{ $options.i18n.loading }}</h1>
+ <div>
+ <gl-button class="gl-mt-3" data-testid="cancel-simulation" @click="cancelSimulation">
+ {{ $options.i18n.cancelBtn }}
+ </gl-button>
+ <gl-button class="gl-mt-3" loading data-testid="simulate-pipeline-button">
+ {{ $options.i18n.cta }}
+ </gl-button>
+ </div>
+ </div>
+ <div v-else-if="hasSimulationResults" class="gl-mt-5">
+ <gl-alert
+ class="gl-mb-5"
+ :dismissible="false"
+ :title="resultStatus.title"
+ :variant="resultStatus.variant"
+ >
+ <gl-sprintf :message="$options.i18n.alertDesc">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ <template #link="{ content }">
+ <gl-link target="_blank" href="#">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+ <ci-lint-results
+ dry-run
+ hide-alert
+ :is-valid="isValid"
+ :jobs="jobs"
+ :errors="errors"
+ :warnings="warnings"
+ />
</div>
</div>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/constants.js b/app/assets/javascripts/pipeline_editor/constants.js
index 8f688e6ba76..05db0afd15d 100644
--- a/app/assets/javascripts/pipeline_editor/constants.js
+++ b/app/assets/javascripts/pipeline_editor/constants.js
@@ -54,6 +54,7 @@ export const SOURCE_EDITOR_DEBOUNCE = 500;
export const FILE_TREE_DISPLAY_KEY = 'pipeline_editor_file_tree_display';
export const FILE_TREE_POPOVER_DISMISSED_KEY = 'pipeline_editor_file_tree_popover_dismissed';
export const FILE_TREE_TIP_DISMISSED_KEY = 'pipeline_editor_file_tree_tip_dismissed';
+export const VALIDATE_TAB_BADGE_DISMISSED_KEY = 'pipeline_editor_validate_tab_badge_dismissed';
export const STARTER_TEMPLATE_NAME = 'Getting-Started';
@@ -81,6 +82,7 @@ export const pipelineEditorTrackingOptions = {
export const TEMPLATE_REPOSITORY_URL =
'https://gitlab.com/gitlab-org/gitlab-foss/tree/master/lib/gitlab/ci/templates';
+export const VALIDATE_TAB_FEEDBACK_URL = 'https://gitlab.com/gitlab-org/gitlab/-/issues/346687';
export const COMMIT_SHA_POLL_INTERVAL = 1000;
diff --git a/app/assets/javascripts/pipeline_editor/index.js b/app/assets/javascripts/pipeline_editor/index.js
index 4caa253b85e..4f5b69107bf 100644
--- a/app/assets/javascripts/pipeline_editor/index.js
+++ b/app/assets/javascripts/pipeline_editor/index.js
@@ -27,6 +27,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
ciConfigPath,
ciExamplesHelpPagePath,
ciHelpPagePath,
+ ciLintPath,
defaultBranch,
emptyStateIllustrationPath,
helpPaths,
@@ -40,6 +41,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
projectPath,
projectNamespace,
runnerHelpPagePath,
+ simulatePipelineHelpPagePath,
totalBranches,
validateTabIllustrationPath,
ymlHelpPagePath,
@@ -115,6 +117,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
ciConfigPath,
ciExamplesHelpPagePath,
ciHelpPagePath,
+ ciLintPath,
configurationPaths,
dataMethod: 'graphql',
defaultBranch,
@@ -130,6 +133,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
projectPath,
projectNamespace,
runnerHelpPagePath,
+ simulatePipelineHelpPagePath,
totalBranches: parseInt(totalBranches, 10),
validateTabIllustrationPath,
ymlHelpPagePath,
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
index f26cdd8b017..2d5c01a58b7 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
@@ -150,6 +150,7 @@ export default {
:ci-config-data="ciConfigData"
:ci-file-content="ciFileContent"
:commit-sha="commitSha"
+ :current-tab="currentTab"
:is-new-ci-config-file="isNewCiConfigFile"
:show-drawer="showDrawer"
v-on="$listeners"
diff --git a/app/assets/javascripts/pipeline_wizard/components/input_wrapper.vue b/app/assets/javascripts/pipeline_wizard/components/input_wrapper.vue
index 5efae2471e5..c9649b2f2f7 100644
--- a/app/assets/javascripts/pipeline_wizard/components/input_wrapper.vue
+++ b/app/assets/javascripts/pipeline_wizard/components/input_wrapper.vue
@@ -3,10 +3,12 @@ import { isNode, isDocument, isSeq, visit } from 'yaml';
import { capitalize } from 'lodash';
import TextWidget from '~/pipeline_wizard/components/widgets/text.vue';
import ListWidget from '~/pipeline_wizard/components/widgets/list.vue';
+import ChecklistWidget from '~/pipeline_wizard/components/widgets/checklist.vue';
const widgets = {
TextWidget,
ListWidget,
+ ChecklistWidget,
};
function isNullOrUndefined(v) {
@@ -30,8 +32,9 @@ export default {
},
target: {
type: String,
- required: true,
+ required: false,
validator: (v) => /^\$.*/g.test(v),
+ default: null,
},
widget: {
type: String,
@@ -48,6 +51,7 @@ export default {
},
computed: {
path() {
+ if (!this.target) return null;
let res;
visit(this.template, (seqKey, node, path) => {
if (node && node.value === this.target) {
diff --git a/app/assets/javascripts/pipeline_wizard/components/step.vue b/app/assets/javascripts/pipeline_wizard/components/step.vue
index 220b068f747..c6ee883aec8 100644
--- a/app/assets/javascripts/pipeline_wizard/components/step.vue
+++ b/app/assets/javascripts/pipeline_wizard/components/step.vue
@@ -31,10 +31,7 @@ export default {
inputs: {
type: Array,
required: true,
- validator: (value) =>
- value.every((i) => {
- return i?.target && i?.widget;
- }),
+ validator: (value) => value.every((i) => i?.widget),
},
template: {
type: null,
@@ -131,7 +128,7 @@ export default {
:template="template"
:validate="validate"
:widget="input.widget"
- class="gl-mb-2"
+ class="gl-mb-8"
v-bind="input"
@highlight="onHighlight"
@update:valid="(validationState) => onInputValidationStateChange(i, validationState)"
diff --git a/app/assets/javascripts/pipeline_wizard/components/widgets/checklist.vue b/app/assets/javascripts/pipeline_wizard/components/widgets/checklist.vue
new file mode 100644
index 00000000000..f2b159acfee
--- /dev/null
+++ b/app/assets/javascripts/pipeline_wizard/components/widgets/checklist.vue
@@ -0,0 +1,80 @@
+<script>
+import { GlFormGroup, GlFormCheckbox, GlFormCheckboxGroup } from '@gitlab/ui';
+import { uniqueId } from 'lodash';
+
+const isValidItemDefinition = (value) => {
+ // The Item definition should either be a simple string
+ // or an object with at least a "title" property
+ return typeof value === 'string' || Boolean(value.text);
+};
+
+export default {
+ name: 'ChecklistWidget',
+ components: {
+ GlFormGroup,
+ GlFormCheckbox,
+ GlFormCheckboxGroup,
+ },
+ props: {
+ title: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ items: {
+ type: Array,
+ required: false,
+ validator: (v) => v.every(isValidItemDefinition),
+ default: () => [],
+ },
+ validate: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ checklistItems() {
+ return this.items.map((rawItem) => {
+ const id = rawItem.id || uniqueId();
+ return {
+ id,
+ text: rawItem.text || rawItem,
+ help: rawItem.help || null,
+ };
+ });
+ },
+ },
+ created() {
+ if (this.items.length > 0) {
+ this.$emit('update:valid', false);
+ }
+ },
+ methods: {
+ updateValidState(values) {
+ this.$emit(
+ 'update:valid',
+ this.checklistItems.every((item) => values.includes(item.id)),
+ );
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-form-group #default="{ ariaDescribedby }" :label="title">
+ <gl-form-checkbox-group :aria-describedby="ariaDescribedby" @input="updateValidState">
+ <gl-form-checkbox
+ v-for="item in checklistItems"
+ :id="item.id"
+ :key="item.id"
+ :value="item.id"
+ >
+ {{ item.text }}
+ <template v-if="item.help" #help>
+ {{ item.help }}
+ </template>
+ </gl-form-checkbox>
+ </gl-form-checkbox-group>
+ </gl-form-group>
+</template>
diff --git a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
index f50cd175510..0fe87bcee7b 100644
--- a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
+++ b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
@@ -128,6 +128,7 @@ export default {
:filename="filename"
:project-path="projectPath"
@back="currentStepIndex--"
+ @done="$emit('done')"
/>
<wizard-step
v-for="(step, i) in stepList"
diff --git a/app/assets/javascripts/pipeline_wizard/pipeline_wizard.vue b/app/assets/javascripts/pipeline_wizard/pipeline_wizard.vue
index 7200b4e3782..939702fd1b5 100644
--- a/app/assets/javascripts/pipeline_wizard/pipeline_wizard.vue
+++ b/app/assets/javascripts/pipeline_wizard/pipeline_wizard.vue
@@ -60,6 +60,7 @@ export default {
:filename="filename"
:project-path="projectPath"
:steps="steps"
+ @done="$emit('done')"
/>
</div>
</template>
diff --git a/app/assets/javascripts/pipeline_wizard/templates/pages.yml b/app/assets/javascripts/pipeline_wizard/templates/pages.yml
new file mode 100644
index 00000000000..cd2242b1ba7
--- /dev/null
+++ b/app/assets/javascripts/pipeline_wizard/templates/pages.yml
@@ -0,0 +1,53 @@
+title: Get started with Pages
+description: "GitLab Pages lets you deploy static websites in minutes. All you
+ need is a .gitlab-ci.yml file. Follow the below steps to
+ create one for your app now."
+steps:
+ - inputs:
+ - label: Select your build image
+ description: A Docker image that we can use to build your image
+ placeholder: node:lts
+ widget: text
+ target: $BUILD_IMAGE
+ required: true
+ pattern: "(?:[a-z]+/)?([a-z]+)(?::[0-9]+)?"
+ invalid-feedback: Please enter a valid docker image
+ - widget: checklist
+ title: "Before we begin, please check:"
+ items:
+ - text: The app's built output files are in a folder named "public"
+ help: GitLab Pages will only publish files in that folder.
+ You may need to adjust your build engine's config.
+ template:
+ # The Docker image that will be used to build your app
+ image: $BUILD_IMAGE
+ - inputs:
+ - label: Installation Steps
+ description: "Enter the steps that need to run to set up a local build
+ environment, for example installing dependencies."
+ placeholder: npm ci
+ widget: list
+ target: $INSTALLATION_STEPS
+ template:
+ # Functions that should be executed before the build script is run
+ before_script: $INSTALLATION_STEPS
+ - inputs:
+ - label: Build Steps
+ description: "Enter the steps necessary to build a production version of
+ your application."
+ widget: list
+ target: $BUILD_STEPS
+ template:
+
+ pages:
+ script: $BUILD_STEPS
+
+ artifacts:
+ paths:
+ # The folder that contains the files to be exposed at the Page URL
+ - public
+
+ rules:
+ # This ensures that only pushes to the default branch will trigger
+ # a pages deploy
+ - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
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 f822e2c0874..14872c34afb 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
@@ -281,6 +281,7 @@ export default {
:type="graphViewType"
:show-links="showLinks"
:tip-previously-dismissed="hoverTipPreviouslyDismissed"
+ :is-pipeline-complete="pipeline.complete"
@dismissHoverTip="handleTipDismissal"
@updateViewType="updateViewType"
@updateShowLinksState="updateShowLinksState"
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_view_selector.vue b/app/assets/javascripts/pipelines/components/graph/graph_view_selector.vue
index 1920fed84ec..a8c5d85f4ed 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_view_selector.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_view_selector.vue
@@ -1,17 +1,33 @@
<script>
-import { GlAlert, GlButton, GlButtonGroup, GlLoadingIcon, GlToggle } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlButton,
+ GlButtonGroup,
+ GlLoadingIcon,
+ GlToggle,
+ GlModalDirective,
+} from '@gitlab/ui';
import { __, s__ } from '~/locale';
+import Tracking from '~/tracking';
+import PerformanceInsightsModal from '../performance_insights_modal.vue';
+import { performanceModalId } from '../../constants';
import { STAGE_VIEW, LAYER_VIEW } from './constants';
export default {
name: 'GraphViewSelector',
+ performanceModalId,
components: {
GlAlert,
GlButton,
GlButtonGroup,
GlLoadingIcon,
GlToggle,
+ PerformanceInsightsModal,
},
+ directives: {
+ GlModal: GlModalDirective,
+ },
+ mixins: [Tracking.mixin()],
props: {
showLinks: {
type: Boolean,
@@ -25,6 +41,10 @@ export default {
type: String,
required: true,
},
+ isPipelineComplete: {
+ type: Boolean,
+ required: true,
+ },
},
data() {
return {
@@ -39,6 +59,7 @@ export default {
hoverTipText: __('Tip: Hover over a job to see the jobs it depends on to run.'),
linksLabelText: s__('GraphViewType|Show dependencies'),
viewLabelText: __('Group jobs by'),
+ performanceBtnText: __('Performance insights'),
},
views: {
[STAGE_VIEW]: {
@@ -129,6 +150,9 @@ export default {
this.$emit('updateShowLinksState', val);
});
},
+ trackInsightsClick() {
+ this.track('click_insights_button', { label: 'performance_insights' });
+ },
},
};
</script>
@@ -154,6 +178,15 @@ export default {
</gl-button>
</gl-button-group>
+ <gl-button
+ v-if="isPipelineComplete"
+ v-gl-modal="$options.performanceModalId"
+ data-testid="pipeline-insights-btn"
+ @click="trackInsightsClick"
+ >
+ {{ $options.i18n.performanceBtnText }}
+ </gl-button>
+
<div v-if="showLinksToggle" class="gl-display-flex gl-align-items-center">
<gl-toggle
v-model="showLinksActive"
@@ -169,5 +202,7 @@ export default {
<gl-alert v-if="showTip" class="gl-my-5" variant="tip" @dismiss="dismissTip">
{{ $options.i18n.hoverTipText }}
</gl-alert>
+
+ <performance-insights-modal />
</div>
</template>
diff --git a/app/assets/javascripts/pipelines/components/header_component.vue b/app/assets/javascripts/pipelines/components/header_component.vue
index 37878f3fb6d..fabae62fc45 100644
--- a/app/assets/javascripts/pipelines/components/header_component.vue
+++ b/app/assets/javascripts/pipelines/components/header_component.vue
@@ -63,6 +63,18 @@ export default {
default: '',
},
},
+ modal: {
+ id: DELETE_MODAL_ID,
+ actionPrimary: {
+ text: __('Delete pipeline'),
+ attributes: {
+ variant: 'danger',
+ },
+ },
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ },
apollo: {
pipeline: {
context() {
@@ -275,7 +287,7 @@ export default {
<gl-button
v-if="pipeline.userPermissions.destroyPipeline"
- v-gl-modal="$options.DELETE_MODAL_ID"
+ v-gl-modal="$options.modal.id"
:loading="isDeleting"
:disabled="isDeleting"
class="gl-ml-3"
@@ -289,11 +301,11 @@ export default {
<gl-loading-icon v-if="isLoadingInitialQuery" size="lg" class="gl-mt-3 gl-mb-3" />
<gl-modal
- :modal-id="$options.DELETE_MODAL_ID"
+ :modal-id="$options.modal.id"
:title="__('Delete pipeline')"
- :ok-title="__('Delete pipeline')"
- ok-variant="danger"
- @ok="deletePipeline()"
+ :action-primary="$options.modal.actionPrimary"
+ :action-cancel="$options.modal.actionCancel"
+ @primary="deletePipeline()"
>
<p>
{{ deleteModalConfirmationText }}
diff --git a/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
index 070c5ee59de..0c6b8b9ed2b 100644
--- a/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
+++ b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
@@ -96,7 +96,7 @@ export default {
<template #cell(actions)="{ item }">
<gl-button
v-if="canRetryJob(item)"
- icon="repeat"
+ icon="retry"
:title="$options.retry"
:aria-label="$options.retry"
@click="retryJob(item.id)"
diff --git a/app/assets/javascripts/pipelines/components/performance_insights_modal.vue b/app/assets/javascripts/pipelines/components/performance_insights_modal.vue
new file mode 100644
index 00000000000..ae6b9186930
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/performance_insights_modal.vue
@@ -0,0 +1,168 @@
+<script>
+import { GlAlert, GlCard, GlLink, GlLoadingIcon, GlModal } from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+import { humanizeTimeInterval } from '~/lib/utils/datetime_utility';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
+import getPerformanceInsightsQuery from '../graphql/queries/get_performance_insights.query.graphql';
+import { performanceModalId } from '../constants';
+import { calculateJobStats, calculateSlowestFiveJobs } from '../utils';
+
+export default {
+ name: 'PerformanceInsightsModal',
+ i18n: {
+ queuedCardHeader: s__('Pipeline|Longest queued job'),
+ queuedCardHelp: s__(
+ 'Pipeline|The longest queued job is the job that spent the longest time in the pending state, waiting to be picked up by a Runner',
+ ),
+ executedCardHeader: s__('Pipeline|Last executed job'),
+ executedCardHelp: s__(
+ 'Pipeline|The last executed job is the last job to start in the pipeline.',
+ ),
+ viewDependency: s__('Pipeline|View dependency'),
+ slowJobsTitle: s__('Pipeline|Five slowest jobs'),
+ feeback: __('Feedback issue'),
+ insightsLimit: s__('Pipeline|Only able to show first 100 results'),
+ },
+ modal: {
+ title: s__('Pipeline|Performance insights'),
+ actionCancel: {
+ text: __('Close'),
+ attributes: {
+ variant: 'confirm',
+ },
+ },
+ },
+ performanceModalId,
+ components: {
+ GlAlert,
+ GlCard,
+ GlLink,
+ GlModal,
+ GlLoadingIcon,
+ HelpPopover,
+ },
+ inject: {
+ pipelineIid: {
+ default: '',
+ },
+ pipelineProjectPath: {
+ default: '',
+ },
+ },
+ apollo: {
+ jobs: {
+ query: getPerformanceInsightsQuery,
+ variables() {
+ return {
+ fullPath: this.pipelineProjectPath,
+ iid: this.pipelineIid,
+ };
+ },
+ update(data) {
+ return data.project?.pipeline?.jobs;
+ },
+ },
+ },
+ data() {
+ return {
+ jobs: null,
+ };
+ },
+ computed: {
+ longestQueuedJob() {
+ return calculateJobStats(this.jobs, 'queuedDuration');
+ },
+ lastExecutedJob() {
+ return calculateJobStats(this.jobs, 'startedAt');
+ },
+ slowestFiveJobs() {
+ return calculateSlowestFiveJobs(this.jobs);
+ },
+ queuedDurationDisplay() {
+ return humanizeTimeInterval(this.longestQueuedJob.queuedDuration);
+ },
+ showLimitMessage() {
+ return this.jobs.pageInfo.hasNextPage;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-modal
+ :modal-id="$options.performanceModalId"
+ :title="$options.modal.title"
+ :action-cancel="$options.modal.actionCancel"
+ >
+ <gl-loading-icon v-if="$apollo.queries.jobs.loading" size="lg" />
+
+ <template v-else>
+ <gl-alert v-if="showLimitMessage" class="gl-mb-4" :dismissible="false">
+ <p>{{ $options.i18n.insightsLimit }}</p>
+ <gl-link href="https://gitlab.com/gitlab-org/gitlab/-/issues/365902" class="gl-mt-5">
+ {{ $options.i18n.feeback }}
+ </gl-link>
+ </gl-alert>
+ <div class="gl-display-flex gl-justify-content-space-between gl-mb-7">
+ <gl-card class="gl-w-half gl-mr-7 gl-text-center">
+ <template #header>
+ <span class="gl-font-weight-bold">{{ $options.i18n.queuedCardHeader }}</span>
+ <help-popover>
+ {{ $options.i18n.queuedCardHelp }}
+ </help-popover>
+ </template>
+ <div class="gl-display-flex gl-flex-direction-column">
+ <span
+ class="gl-font-weight-bold gl-font-size-h2 gl-mb-2"
+ data-testid="insights-queued-card-data"
+ >
+ {{ queuedDurationDisplay }}
+ </span>
+ <gl-link
+ :href="longestQueuedJob.detailedStatus.detailsPath"
+ data-testid="insights-queued-card-link"
+ >
+ {{ longestQueuedJob.name }}
+ </gl-link>
+ </div>
+ </gl-card>
+ <gl-card class="gl-w-half gl-text-center" data-testid="insights-executed-card">
+ <template #header>
+ <span class="gl-font-weight-bold">{{ $options.i18n.executedCardHeader }}</span>
+ <help-popover>
+ {{ $options.i18n.executedCardHelp }}
+ </help-popover>
+ </template>
+ <div class="gl-display-flex gl-flex-direction-column">
+ <span
+ class="gl-font-weight-bold gl-font-size-h2 gl-mb-2"
+ data-testid="insights-executed-card-data"
+ >
+ {{ lastExecutedJob.name }}
+ </span>
+ <gl-link
+ :href="lastExecutedJob.detailedStatus.detailsPath"
+ data-testid="insights-executed-card-link"
+ >
+ {{ $options.i18n.viewDependency }}
+ </gl-link>
+ </div>
+ </gl-card>
+ </div>
+
+ <div class="gl-mt-7">
+ <span class="gl-font-weight-bold">{{ $options.i18n.slowJobsTitle }}</span>
+ <div
+ v-for="job in slowestFiveJobs"
+ :key="job.name"
+ class="gl-display-flex gl-justify-content-space-between gl-mb-3 gl-mt-3 gl-p-4 gl-border-t-1 gl-border-t-solid gl-border-b-0 gl-border-b-solid gl-border-gray-100"
+ >
+ <span data-testid="insights-slow-job-stage">{{ job.stage.name }}</span>
+ <gl-link :href="job.detailedStatus.detailsPath" data-testid="insights-slow-job-link">{{
+ job.name
+ }}</gl-link>
+ </div>
+ </div>
+ </template>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue
index fa0e153b2af..7a08dacb824 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue
@@ -80,7 +80,7 @@ export default {
class="js-pipelines-retry-button"
data-qa-selector="pipeline_retry_button"
data-testid="pipelines-retry-button"
- icon="repeat"
+ icon="retry"
variant="default"
category="secondary"
@click="handleRetryClick"
diff --git a/app/assets/javascripts/pipelines/components/test_reports/test_case_details.vue b/app/assets/javascripts/pipelines/components/test_reports/test_case_details.vue
index 76ee6ab613b..69509c9088b 100644
--- a/app/assets/javascripts/pipelines/components/test_reports/test_case_details.vue
+++ b/app/assets/javascripts/pipelines/components/test_reports/test_case_details.vue
@@ -1,5 +1,6 @@
<script>
-import { GlBadge, GlFriendlyWrap, GlLink, GlModal } from '@gitlab/ui';
+import { GlBadge, GlFriendlyWrap, GlLink, GlModal, GlTooltipDirective } from '@gitlab/ui';
+import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
import { __, n__, s__, sprintf } from '~/locale';
import CodeBlock from '~/vue_shared/components/code_block.vue';
@@ -11,6 +12,10 @@ export default {
GlFriendlyWrap,
GlLink,
GlModal,
+ ModalCopyButton,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
},
props: {
modalId: {
@@ -57,6 +62,7 @@ export default {
history: __('History'),
trace: __('System output'),
attachment: s__('TestReports|Attachment'),
+ copyTestName: s__('TestReports|Copy test name to rerun locally'),
},
modalCloseButton: {
text: __('Close'),
@@ -85,6 +91,13 @@ export default {
{{ testCase.file }}
</gl-link>
<span v-else>{{ testCase.file }}</span>
+ <modal-copy-button
+ :title="$options.text.copyTestName"
+ :text="testCase.file"
+ :modal-id="modalId"
+ category="tertiary"
+ class="gl-ml-1"
+ />
</div>
</div>
diff --git a/app/assets/javascripts/pipelines/components/test_reports/test_reports.vue b/app/assets/javascripts/pipelines/components/test_reports/test_reports.vue
index 58d072b0005..3fb46a4f128 100644
--- a/app/assets/javascripts/pipelines/components/test_reports/test_reports.vue
+++ b/app/assets/javascripts/pipelines/components/test_reports/test_reports.vue
@@ -1,6 +1,7 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
+import createTestReportsStore from '../../stores/test_reports';
import EmptyState from './empty_state.vue';
import TestSuiteTable from './test_suite_table.vue';
import TestSummary from './test_summary.vue';
@@ -15,9 +16,10 @@ export default {
TestSummary,
TestSummaryTable,
},
+ inject: ['blobPath', 'summaryEndpoint', 'suiteEndpoint'],
computed: {
- ...mapState(['isLoading', 'selectedSuiteIndex', 'testReports']),
- ...mapGetters(['getSelectedSuite']),
+ ...mapState('testReports', ['isLoading', 'selectedSuiteIndex', 'testReports']),
+ ...mapGetters('testReports', ['getSelectedSuite']),
showSuite() {
return this.selectedSuiteIndex !== null;
},
@@ -27,10 +29,19 @@ export default {
},
},
created() {
+ this.$store.registerModule(
+ 'testReports',
+ createTestReportsStore({
+ blobPath: this.blobPath,
+ summaryEndpoint: this.summaryEndpoint,
+ suiteEndpoint: this.suiteEndpoint,
+ }),
+ );
+
this.fetchSummary();
},
methods: {
- ...mapActions([
+ ...mapActions('testReports', [
'fetchTestSuite',
'fetchSummary',
'setSelectedSuiteIndex',
diff --git a/app/assets/javascripts/pipelines/components/test_reports/test_suite_table.vue b/app/assets/javascripts/pipelines/components/test_reports/test_suite_table.vue
index 1e481d37017..1f438c63fee 100644
--- a/app/assets/javascripts/pipelines/components/test_reports/test_suite_table.vue
+++ b/app/assets/javascripts/pipelines/components/test_reports/test_suite_table.vue
@@ -51,14 +51,18 @@ export default {
},
},
computed: {
- ...mapState(['pageInfo']),
- ...mapGetters(['getSuiteTests', 'getSuiteTestCount', 'getSuiteArtifactsExpired']),
+ ...mapState('testReports', ['pageInfo']),
+ ...mapGetters('testReports', [
+ 'getSuiteTests',
+ 'getSuiteTestCount',
+ 'getSuiteArtifactsExpired',
+ ]),
hasSuites() {
return this.getSuiteTests.length > 0;
},
},
methods: {
- ...mapActions(['setPage']),
+ ...mapActions('testReports', ['setPage']),
},
wrapSymbols: ['::', '#', '.', '_', '-', '/', '\\'],
i18n,
diff --git a/app/assets/javascripts/pipelines/components/test_reports/test_summary_table.vue b/app/assets/javascripts/pipelines/components/test_reports/test_summary_table.vue
index 2b44ce57faa..8389c2a5104 100644
--- a/app/assets/javascripts/pipelines/components/test_reports/test_summary_table.vue
+++ b/app/assets/javascripts/pipelines/components/test_reports/test_summary_table.vue
@@ -19,7 +19,7 @@ export default {
},
},
computed: {
- ...mapGetters(['getTestSuites']),
+ ...mapGetters('testReports', ['getTestSuites']),
hasSuites() {
return this.getTestSuites.length > 0;
},
diff --git a/app/assets/javascripts/pipelines/constants.js b/app/assets/javascripts/pipelines/constants.js
index 0510992e962..2e825016c91 100644
--- a/app/assets/javascripts/pipelines/constants.js
+++ b/app/assets/javascripts/pipelines/constants.js
@@ -109,3 +109,5 @@ export const DEFAULT_FIELDS = [
columnClass: 'gl-w-20p',
},
];
+
+export const performanceModalId = 'performanceInsightsModal';
diff --git a/app/assets/javascripts/pipelines/graphql/queries/get_performance_insights.query.graphql b/app/assets/javascripts/pipelines/graphql/queries/get_performance_insights.query.graphql
new file mode 100644
index 00000000000..25e990c8934
--- /dev/null
+++ b/app/assets/javascripts/pipelines/graphql/queries/get_performance_insights.query.graphql
@@ -0,0 +1,28 @@
+query getPerformanceInsightsData($fullPath: ID!, $iid: ID!) {
+ project(fullPath: $fullPath) {
+ id
+ pipeline(iid: $iid) {
+ id
+ jobs {
+ pageInfo {
+ hasNextPage
+ }
+ nodes {
+ id
+ duration
+ detailedStatus {
+ id
+ detailsPath
+ }
+ name
+ stage {
+ id
+ name
+ }
+ startedAt
+ queuedDuration
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/pipelines/pipeline_tabs.js b/app/assets/javascripts/pipelines/pipeline_tabs.js
index e7c00d89a10..c0e769e2485 100644
--- a/app/assets/javascripts/pipelines/pipeline_tabs.js
+++ b/app/assets/javascripts/pipelines/pipeline_tabs.js
@@ -1,4 +1,5 @@
import Vue from 'vue';
+import Vuex from 'vuex';
import VueApollo from 'vue-apollo';
import PipelineTabs from 'ee_else_ce/pipelines/components/pipeline_tabs.vue';
import { removeParams, updateHistory } from '~/lib/utils/url_utility';
@@ -7,6 +8,7 @@ import { parseBoolean } from '~/lib/utils/common_utils';
import { getPipelineDefaultTab, reportToSentry } from './utils';
Vue.use(VueApollo);
+Vue.use(Vuex);
export const createAppOptions = (selector, apolloProvider) => {
const el = document.querySelector(selector);
@@ -37,6 +39,7 @@ export const createAppOptions = (selector, apolloProvider) => {
PipelineTabs,
},
apolloProvider,
+ store: new Vuex.Store(),
provide: {
canGenerateCodequalityReports: parseBoolean(canGenerateCodequalityReports),
codequalityReportDownloadPath,
diff --git a/app/assets/javascripts/pipelines/pipeline_test_details.js b/app/assets/javascripts/pipelines/pipeline_test_details.js
index 27ab2418440..fe4ca8e9529 100644
--- a/app/assets/javascripts/pipelines/pipeline_test_details.js
+++ b/app/assets/javascripts/pipelines/pipeline_test_details.js
@@ -1,9 +1,10 @@
import Vue from 'vue';
+import Vuex from 'vuex';
import { parseBoolean } from '~/lib/utils/common_utils';
import Translate from '~/vue_shared/translate';
import TestReports from './components/test_reports/test_reports.vue';
-import createTestReportsStore from './stores/test_reports';
+Vue.use(Vuex);
Vue.use(Translate);
export const createTestDetails = (selector) => {
@@ -16,11 +17,6 @@ export const createTestDetails = (selector) => {
suiteEndpoint,
artifactsExpiredImagePath,
} = el?.dataset || {};
- const testReportsStore = createTestReportsStore({
- blobPath,
- summaryEndpoint,
- suiteEndpoint,
- });
// eslint-disable-next-line no-new
new Vue({
@@ -32,8 +28,11 @@ export const createTestDetails = (selector) => {
emptyStateImagePath,
artifactsExpiredImagePath,
hasTestReport: parseBoolean(hasTestReport),
+ blobPath,
+ summaryEndpoint,
+ suiteEndpoint,
},
- store: testReportsStore,
+ store: new Vuex.Store(),
render(createElement) {
return createElement('test-reports');
},
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/constants.js b/app/assets/javascripts/pipelines/stores/test_reports/constants.js
index 8eebfb6b208..83d14e1a109 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/constants.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/constants.js
@@ -1 +1 @@
-export const ARTIFACTS_EXPIRED_ERROR_MESSAGE = 'Test report artifacts have expired';
+export const ARTIFACTS_EXPIRED_ERROR_MESSAGE = 'Test report artifacts not found';
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/index.js b/app/assets/javascripts/pipelines/stores/test_reports/index.js
index 64d4b8bafb1..f45a53f47b7 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/index.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/index.js
@@ -1,16 +1,14 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
import * as actions from './actions';
import * as getters from './getters';
import mutations from './mutations';
import state from './state';
-Vue.use(Vuex);
-
-export default (initialState) =>
- new Vuex.Store({
+export default (initialState) => {
+ return {
+ namespaced: true,
actions,
getters,
mutations,
state: state(initialState),
- });
+ };
+};
diff --git a/app/assets/javascripts/pipelines/utils.js b/app/assets/javascripts/pipelines/utils.js
index 588d15495ab..83e00b80426 100644
--- a/app/assets/javascripts/pipelines/utils.js
+++ b/app/assets/javascripts/pipelines/utils.js
@@ -153,3 +153,24 @@ export const getPipelineDefaultTab = (url) => {
return null;
};
+
+export const calculateJobStats = (jobs, sortField) => {
+ const jobNodes = [...jobs.nodes];
+
+ const sorted = jobNodes.sort((a, b) => {
+ return b[sortField] - a[sortField];
+ });
+
+ return sorted[0];
+};
+
+export const calculateSlowestFiveJobs = (jobs) => {
+ const jobNodes = [...jobs.nodes];
+ const limit = 5;
+
+ return jobNodes
+ .sort((a, b) => {
+ return b.duration - a.duration;
+ })
+ .slice(0, limit);
+};
diff --git a/app/assets/javascripts/profile/account/index.js b/app/assets/javascripts/profile/account/index.js
index 00fe0bcf89b..f208280af27 100644
--- a/app/assets/javascripts/profile/account/index.js
+++ b/app/assets/javascripts/profile/account/index.js
@@ -30,7 +30,7 @@ export default () => {
deleteAccountModal,
},
mounted() {
- deleteAccountButton.classList.remove('disabled');
+ deleteAccountButton.disabled = false;
deleteAccountButton.addEventListener('click', () => {
this.$root.$emit(BV_SHOW_MODAL, 'delete-account-modal', '#delete-account-button');
});
diff --git a/app/assets/javascripts/profile/profile.js b/app/assets/javascripts/profile/profile.js
index 25fefff219c..064bcf8e4c4 100644
--- a/app/assets/javascripts/profile/profile.js
+++ b/app/assets/javascripts/profile/profile.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import createFlash, { FLASH_TYPES } from '~/flash';
+import { VARIANT_DANGER, VARIANT_INFO, createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { parseBoolean } from '~/lib/utils/common_utils';
import { Rails } from '~/lib/utils/rails_ujs';
@@ -10,7 +10,7 @@ import TimezoneDropdown, {
export default class Profile {
constructor({ form } = {}) {
this.onSubmitForm = this.onSubmitForm.bind(this);
- this.form = form || $('.edit-user');
+ this.form = form || $('.js-edit-user');
this.setRepoRadio();
this.bindEvents();
this.initAvatarGlCrop();
@@ -84,9 +84,9 @@ export default class Profile {
this.updateHeaderAvatar();
}
- createFlash({
+ createAlert({
message: data.message,
- type: data.status === 'error' ? FLASH_TYPES.ALERT : FLASH_TYPES.NOTICE,
+ variant: data.status === 'error' ? VARIANT_DANGER : VARIANT_INFO,
});
})
.then(() => {
@@ -95,8 +95,9 @@ export default class Profile {
self.form.find(':input[disabled]').enable();
})
.catch((error) =>
- createFlash({
+ createAlert({
message: error.message,
+ variant: VARIANT_DANGER,
}),
);
}
diff --git a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
index 9bd78b7c89e..1cdf26b76b7 100644
--- a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
+++ b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
@@ -43,7 +43,11 @@ export default {
},
apollo: {
pipeline: {
+ context() {
+ return getQueryHeaders(this.graphqlResourceEtag);
+ },
query: getLinkedPipelinesQuery,
+ pollInterval: COMMIT_BOX_POLL_INTERVAL,
variables() {
return {
fullPath: this.fullPath,
@@ -116,6 +120,7 @@ export default {
},
mounted() {
toggleQueryPollingByVisibility(this.$apollo.queries.pipelineStages);
+ toggleQueryPollingByVisibility(this.$apollo.queries.pipeline);
},
};
</script>
diff --git a/app/assets/javascripts/projects/commit_box/info/init_details_button.js b/app/assets/javascripts/projects/commit_box/info/init_details_button.js
index 833e946af5c..bc2c16b9e83 100644
--- a/app/assets/javascripts/projects/commit_box/info/init_details_button.js
+++ b/app/assets/javascripts/projects/commit_box/info/init_details_button.js
@@ -1,9 +1,7 @@
-import $ from 'jquery';
-
export const initDetailsButton = () => {
- $('body').on('click', '.js-details-expand', function expand(e) {
+ document.querySelector('.commit-info').addEventListener('click', function expand(e) {
e.preventDefault();
- $(this).next('.js-details-content').removeClass('hide');
- $(this).hide();
+ this.querySelector('.js-details-content').classList.remove('hide');
+ this.querySelector('.js-details-expand').classList.add('gl-display-none');
});
};
diff --git a/app/assets/javascripts/projects/commits/components/author_select.vue b/app/assets/javascripts/projects/commits/components/author_select.vue
index 884ef732144..f85be67d4b3 100644
--- a/app/assets/javascripts/projects/commits/components/author_select.vue
+++ b/app/assets/javascripts/projects/commits/components/author_select.vue
@@ -110,7 +110,7 @@ export default {
:text="dropdownText"
:disabled="hasSearchParam"
toggle-class="gl-py-3 gl-border-0"
- class="w-100 mt-2 mt-sm-0"
+ class="w-100 gl-mt-3 mt-sm-0"
>
<gl-dropdown-section-header>
{{ __('Search by author') }}
diff --git a/app/assets/javascripts/projects/compare/components/app.vue b/app/assets/javascripts/projects/compare/components/app.vue
index 3945bed9649..bda58091b97 100644
--- a/app/assets/javascripts/projects/compare/components/app.vue
+++ b/app/assets/javascripts/projects/compare/components/app.vue
@@ -121,27 +121,21 @@ export default {
@selectRevision="onSelectRevision"
/>
</div>
- <div class="gl-mt-6">
+ <div class="gl-display-flex gl-mt-6 gl-gap-3">
<gl-button category="primary" variant="confirm" @click="onSubmit">
{{ s__('CompareRevisions|Compare') }}
</gl-button>
- <gl-button data-testid="swapRevisionsButton" class="btn btn-default" @click="onSwapRevision">
+ <gl-button data-testid="swapRevisionsButton" @click="onSwapRevision">
{{ s__('CompareRevisions|Swap revisions') }}
</gl-button>
<gl-button
v-if="projectMergeRequestPath"
:href="projectMergeRequestPath"
data-testid="projectMrButton"
- class="btn btn-default gl-button"
>
{{ s__('CompareRevisions|View open merge request') }}
</gl-button>
- <gl-button
- v-else-if="createMrPath"
- :href="createMrPath"
- data-testid="createMrButton"
- class="btn btn-default gl-button"
- >
+ <gl-button v-else-if="createMrPath" :href="createMrPath" data-testid="createMrButton">
{{ s__('CompareRevisions|Create merge request') }}
</gl-button>
</div>
diff --git a/app/assets/javascripts/projects/new/components/app.vue b/app/assets/javascripts/projects/new/components/app.vue
index 476d6466cbb..59ca393fe92 100644
--- a/app/assets/javascripts/projects/new/components/app.vue
+++ b/app/assets/javascripts/projects/new/components/app.vue
@@ -16,7 +16,7 @@ const PANELS = [
selector: '#blank-project-pane',
title: s__('ProjectsNew|Create blank project'),
description: s__(
- 'ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things.',
+ 'ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things.',
),
illustration: blankProjectIllustration,
},
diff --git a/app/assets/javascripts/projects/new/components/new_project_url_select.vue b/app/assets/javascripts/projects/new/components/new_project_url_select.vue
index 506f1ec5ffd..eccfb3d844c 100644
--- a/app/assets/javascripts/projects/new/components/new_project_url_select.vue
+++ b/app/assets/javascripts/projects/new/components/new_project_url_select.vue
@@ -7,6 +7,7 @@ import {
GlDropdownText,
GlDropdownSectionHeader,
GlSearchBoxByType,
+ GlTruncate,
} from '@gitlab/ui';
import { joinPaths, PATH_SEPARATOR } from '~/lib/utils/url_utility';
import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants';
@@ -26,6 +27,7 @@ export default {
GlDropdownText,
GlDropdownSectionHeader,
GlSearchBoxByType,
+ GlTruncate,
},
mixins: [Tracking.mixin()],
apollo: {
@@ -55,10 +57,7 @@ export default {
id: this.namespaceId,
fullPath: this.namespaceFullPath,
}
- : {
- id: undefined,
- fullPath: s__('ProjectsNew|Pick a group or namespace'),
- },
+ : this.$options.emptyNameSpace,
shouldSkipQuery: true,
userNamespaceId: this.userNamespaceId,
};
@@ -118,12 +117,18 @@ export default {
this.setNamespace({ id, fullPath });
},
setNamespace({ id, fullPath }) {
- this.selectedNamespace = {
- id: getIdFromGraphQLId(id),
- fullPath,
- };
+ this.selectedNamespace = id
+ ? {
+ id: getIdFromGraphQLId(id),
+ fullPath,
+ }
+ : this.$options.emptyNameSpace;
},
},
+ emptyNameSpace: {
+ id: undefined,
+ fullPath: s__('ProjectsNew|Pick a group or namespace'),
+ },
};
</script>
@@ -137,13 +142,20 @@ export default {
>
<gl-dropdown
- :text="selectedNamespace.fullPath"
class="js-group-namespace-dropdown gl-flex-grow-1"
:toggle-class="`gl-rounded-top-right-base! gl-rounded-bottom-right-base! gl-w-20 ${dropdownPlaceholderClass}`"
data-qa-selector="select_namespace_dropdown"
@show="track('activate_form_input', { label: trackLabel, property: 'project_path' })"
@shown="handleDropdownShown"
>
+ <template #button-text>
+ <gl-truncate
+ v-if="selectedNamespace.fullPath"
+ :text="selectedNamespace.fullPath"
+ position="start"
+ with-tooltip
+ />
+ </template>
<gl-search-box-by-type
ref="search"
v-model.trim="search"
diff --git a/app/assets/javascripts/projects/pipelines/charts/components/app.vue b/app/assets/javascripts/projects/pipelines/charts/components/app.vue
index 35e7554aee2..186fcf70838 100644
--- a/app/assets/javascripts/projects/pipelines/charts/components/app.vue
+++ b/app/assets/javascripts/projects/pipelines/charts/components/app.vue
@@ -14,12 +14,15 @@ export default {
LeadTimeCharts: () => import('ee_component/dora/components/lead_time_charts.vue'),
TimeToRestoreServiceCharts: () =>
import('ee_component/dora/components/time_to_restore_service_charts.vue'),
+ ChangeFailureRateCharts: () =>
+ import('ee_component/dora/components/change_failure_rate_charts.vue'),
ProjectQualitySummary: () => import('ee_component/project_quality_summary/app.vue'),
},
piplelinesTabEvent: 'p_analytics_ci_cd_pipelines',
deploymentFrequencyTabEvent: 'p_analytics_ci_cd_deployment_frequency',
leadTimeTabEvent: 'p_analytics_ci_cd_lead_time',
timeToRestoreServiceTabEvent: 'p_analytics_ci_cd_time_to_restore_service',
+ changeFailureRateTabEvent: 'p_analytics_ci_cd_change_failure_rate',
inject: {
shouldRenderDoraCharts: {
type: Boolean,
@@ -40,7 +43,12 @@ export default {
const chartsToShow = ['pipelines'];
if (this.shouldRenderDoraCharts) {
- chartsToShow.push('deployment-frequency', 'lead-time', 'time-to-restore-service');
+ chartsToShow.push(
+ 'deployment-frequency',
+ 'lead-time',
+ 'time-to-restore-service',
+ 'change-failure-rate',
+ );
}
if (this.shouldRenderQualitySummary) {
@@ -105,6 +113,13 @@ export default {
>
<time-to-restore-service-charts />
</gl-tab>
+ <gl-tab
+ :title="s__('DORA4Metrics|Change failure rate')"
+ data-testid="change-failure-rate-tab"
+ @click="trackTabClick($options.changeFailureRateTabEvent)"
+ >
+ <change-failure-rate-charts />
+ </gl-tab>
</template>
<gl-tab v-if="shouldRenderQualitySummary" :title="s__('QualitySummary|Project quality')">
<project-quality-summary />
diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js
index 186946a83ad..fe84660422b 100644
--- a/app/assets/javascripts/projects/project_new.js
+++ b/app/assets/javascripts/projects/project_new.js
@@ -342,6 +342,7 @@ const bindEvents = () => {
export default {
bindEvents,
+ validateGroupNamespaceDropdown,
deriveProjectPathFromUrl,
onProjectNameChange,
onProjectPathChange,
diff --git a/app/assets/javascripts/projects/project_visibility.js b/app/assets/javascripts/projects/project_visibility.js
index d299e106b14..b8ac17a01f2 100644
--- a/app/assets/javascripts/projects/project_visibility.js
+++ b/app/assets/javascripts/projects/project_visibility.js
@@ -10,7 +10,7 @@ const visibilityLevel = {
};
function setVisibilityOptions({ name, visibility, showPath, editPath }) {
- document.querySelectorAll('.visibility-level-setting .form-check').forEach((option) => {
+ document.querySelectorAll('.visibility-level-setting .gl-form-radio').forEach((option) => {
// Don't change anything if the option is restricted by admin
if (option.classList.contains('restricted')) {
return;
@@ -24,7 +24,7 @@ function setVisibilityOptions({ name, visibility, showPath, editPath }) {
optionInput.disabled = true;
const reason = option.querySelector('.option-disabled-reason');
if (reason) {
- const optionTitle = option.querySelector('.option-title');
+ const optionTitle = option.querySelector('.js-visibility-level-radio span');
const optionName = optionTitle ? optionTitle.innerText.toLowerCase() : '';
reason.innerHTML = sprintf(
__(
diff --git a/app/assets/javascripts/projects/settings/access_dropdown.js b/app/assets/javascripts/projects/settings/access_dropdown.js
index 79dfa166b1a..060178a3cfb 100644
--- a/app/assets/javascripts/projects/settings/access_dropdown.js
+++ b/app/assets/javascripts/projects/settings/access_dropdown.js
@@ -441,11 +441,13 @@ export default class AccessDropdown {
const {
id,
fingerprint,
+ fingerprint_sha256: fingerprintSha256,
title,
owner: { avatar_url, name, username },
} = response;
- const shortFingerprint = `(${fingerprint.substring(0, 14)}...)`;
+ const availableFingerprint = fingerprintSha256 || fingerprint;
+ const shortFingerprint = `(${availableFingerprint.substring(0, 14)}...)`;
return {
id,
diff --git a/app/assets/javascripts/projects/settings/components/access_dropdown.vue b/app/assets/javascripts/projects/settings/components/access_dropdown.vue
index 9823b0229a0..fcf81c9d1f7 100644
--- a/app/assets/javascripts/projects/settings/components/access_dropdown.vue
+++ b/app/assets/javascripts/projects/settings/components/access_dropdown.vue
@@ -203,11 +203,13 @@ export default {
const {
id,
fingerprint,
+ fingerprint_sha256: fingerprintSha256,
title,
owner: { avatar_url, name, username },
} = response;
- const shortFingerprint = `(${fingerprint.substring(0, 14)}...)`;
+ const availableFingerprint = fingerprintSha256 || fingerprint;
+ const shortFingerprint = `(${availableFingerprint.substring(0, 14)}...)`;
return {
id,
@@ -351,7 +353,6 @@ export default {
<gl-dropdown-item
v-for="group in groups"
:key="`${group.id}${group.name}`"
- fingerprint
data-testid="group-dropdown-item"
:avatar-url="group.avatar_url"
is-check-item
@@ -388,7 +389,7 @@ export default {
}}</gl-dropdown-section-header>
<gl-dropdown-item
v-for="key in deployKeys"
- :key="`${key.id}${key.fingerprint}`"
+ :key="`${key.id}-{key.title}`"
data-testid="deploy_key-dropdown-item"
is-check-item
:is-checked="isSelected(key)"
diff --git a/app/assets/javascripts/projects/star.js b/app/assets/javascripts/projects/star.js
index 578e22ca25d..5bbace11b15 100644
--- a/app/assets/javascripts/projects/star.js
+++ b/app/assets/javascripts/projects/star.js
@@ -1,31 +1,33 @@
-import $ from 'jquery';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { spriteIcon } from '~/lib/utils/common_utils';
import { __, s__ } from '~/locale';
export default class Star {
- constructor(container = '.project-home-panel') {
- $(`${container} .toggle-star`).on('click', function toggleStarClickCallback() {
- const $this = $(this);
- const $starSpan = $this.find('span');
- const $starIcon = $this.find('svg');
- const iconClasses = $starIcon.attr('class').split(' ');
+ constructor(containerSelector = '.project-home-panel') {
+ const container = document.querySelector(containerSelector);
+ const starToggle = container.querySelector('.toggle-star');
+ starToggle.addEventListener('click', function toggleStarClickCallback() {
+ const starSpan = starToggle.querySelector('span');
+ const starIcon = starToggle.querySelector('svg');
+ const iconClasses = Array.from(starIcon.classList.values());
axios
- .post($this.data('endpoint'))
+ .post(starToggle.dataset.endpoint)
.then(({ data }) => {
- const isStarred = $starSpan.hasClass('starred');
- $this.parent().find('.count').text(data.star_count);
+ const isStarred = starSpan.classList.contains('starred');
+ starToggle.parentNode.querySelector('.count').textContent = data.star_count;
if (isStarred) {
- $starSpan.removeClass('starred').text(s__('StarProject|Star'));
- $starIcon.remove();
- $this.prepend(spriteIcon('star-o', iconClasses));
+ starSpan.classList.remove('starred');
+ starSpan.textContent = s__('StarProject|Star');
+ starIcon.remove();
+ starSpan.insertAdjacentHTML('beforebegin', spriteIcon('star-o', iconClasses));
} else {
- $starSpan.addClass('starred').text(__('Unstar'));
- $starIcon.remove();
- $this.prepend(spriteIcon('star', iconClasses));
+ starSpan.classList.add('starred');
+ starSpan.textContent = __('Unstar');
+ starIcon.remove();
+ starSpan.insertAdjacentHTML('beforebegin', spriteIcon('star', iconClasses));
}
})
.catch(() =>
diff --git a/app/assets/javascripts/related_issues/components/add_issuable_form.vue b/app/assets/javascripts/related_issues/components/add_issuable_form.vue
index 42de419aec4..d765033d00b 100644
--- a/app/assets/javascripts/related_issues/components/add_issuable_form.vue
+++ b/app/assets/javascripts/related_issues/components/add_issuable_form.vue
@@ -173,7 +173,7 @@ export default {
:label="issuableCategoryHeaderText"
label-for="linked-issue-type-radio"
label-class="label-bold"
- class="mb-2"
+ class="gl-mb-3"
>
<gl-form-radio-group
id="linked-issue-type-radio"
@@ -216,12 +216,12 @@ export default {
:disabled="isSubmitButtonDisabled"
:loading="isSubmitting"
type="submit"
- class="float-left"
+ class="gl-float-left"
data-qa-selector="add_issue_button"
>
{{ __('Add') }}
</gl-button>
- <gl-button class="float-right" @click="onFormCancel">
+ <gl-button class="gl-float-right" @click="onFormCancel">
{{ __('Cancel') }}
</gl-button>
</div>
diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue
index 327da1fb2a1..022c3224bb4 100644
--- a/app/assets/javascripts/releases/components/app_edit_new.vue
+++ b/app/assets/javascripts/releases/components/app_edit_new.vue
@@ -1,5 +1,13 @@
<script>
-import { GlButton, GlFormCheckbox, GlFormInput, GlFormGroup, GlLink, GlSprintf } from '@gitlab/ui';
+import {
+ GlButton,
+ GlDatepicker,
+ GlFormCheckbox,
+ GlFormInput,
+ GlFormGroup,
+ GlLink,
+ GlSprintf,
+} from '@gitlab/ui';
import { mapState, mapActions, mapGetters } from 'vuex';
import { isSameOriginUrl, getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
@@ -7,6 +15,7 @@ import MilestoneCombobox from '~/milestones/components/milestone_combobox.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import AssetLinksForm from './asset_links_form.vue';
+import ConfirmDeleteModal from './confirm_delete_modal.vue';
import TagField from './tag_field.vue';
export default {
@@ -16,8 +25,10 @@ export default {
GlFormInput,
GlFormGroup,
GlButton,
+ GlDatepicker,
GlLink,
GlSprintf,
+ ConfirmDeleteModal,
MarkdownField,
AssetLinksForm,
MilestoneCombobox,
@@ -25,12 +36,14 @@ export default {
},
computed: {
...mapState('editNew', [
+ 'isExistingRelease',
'isFetchingRelease',
'isUpdatingRelease',
'fetchError',
'markdownDocsPath',
'markdownPreviewPath',
'editReleaseDocsPath',
+ 'upcomingReleaseDocsPath',
'releasesPagePath',
'release',
'newMilestonePath',
@@ -40,7 +53,7 @@ export default {
'groupMilestonesAvailable',
'tagNotes',
]),
- ...mapGetters('editNew', ['isValid', 'isExistingRelease', 'formattedReleaseNotes']),
+ ...mapGetters('editNew', ['isValid', 'formattedReleaseNotes']),
showForm() {
return Boolean(!this.isFetchingRelease && !this.fetchError && this.release);
},
@@ -76,6 +89,14 @@ export default {
this.updateIncludeTagNotes(includeTagNotes);
},
},
+ releasedAt: {
+ get() {
+ return this.release.releasedAt;
+ },
+ set(date) {
+ this.updateReleasedAt(date);
+ },
+ },
cancelPath() {
const backUrl = getParameterByName(BACK_URL_PARAM);
@@ -114,10 +135,12 @@ export default {
...mapActions('editNew', [
'initializeRelease',
'saveRelease',
+ 'deleteRelease',
'updateReleaseTitle',
'updateReleaseNotes',
'updateReleaseMilestones',
'updateIncludeTagNotes',
+ 'updateReleasedAt',
]),
submitForm() {
if (!this.isFormSubmissionDisabled) {
@@ -166,6 +189,22 @@ export default {
/>
</div>
</gl-form-group>
+ <gl-form-group :label="__('Release date')" label-for="release-released-at">
+ <template #label-description>
+ <gl-sprintf
+ :message="
+ __(
+ 'The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}.',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="upcomingReleaseDocsPath">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </template>
+ <gl-datepicker id="release-released-at" v-model="releasedAt" :default-date="releasedAt" />
+ </gl-form-group>
<gl-form-group data-testid="release-notes">
<label for="release-notes">{{ __('Release notes') }}</label>
<div class="bordered-box pr-3 pl-3">
@@ -224,6 +263,7 @@ export default {
>
{{ saveButtonLabel }}
</gl-button>
+ <confirm-delete-modal v-if="isExistingRelease" @delete="deleteRelease" />
<gl-button :href="cancelPath" class="js-cancel-button">{{ __('Cancel') }}</gl-button>
</div>
</form>
diff --git a/app/assets/javascripts/releases/components/app_index.vue b/app/assets/javascripts/releases/components/app_index.vue
index a949a9d1318..d63a83d1a08 100644
--- a/app/assets/javascripts/releases/components/app_index.vue
+++ b/app/assets/javascripts/releases/components/app_index.vue
@@ -4,9 +4,9 @@ import createFlash from '~/flash';
import { historyPushState } from '~/lib/utils/common_utils';
import { scrollUp } from '~/lib/utils/scroll_utils';
import { setUrlParams, getParameterByName } from '~/lib/utils/url_utility';
-import { __ } from '~/locale';
+import { __, sprintf } from '~/locale';
import { PAGE_SIZE, DEFAULT_SORT } from '~/releases/constants';
-import { convertAllReleasesGraphQLResponse } from '~/releases/util';
+import { convertAllReleasesGraphQLResponse, deleteReleaseSessionKey } from '~/releases/util';
import allReleasesQuery from '../graphql/queries/all_releases.query.graphql';
import ReleaseBlock from './release_block.vue';
import ReleaseSkeletonLoader from './release_skeleton_loader.vue';
@@ -172,6 +172,20 @@ export default {
return this.isFullRequestLoaded && !this.shouldRenderEmptyState;
},
},
+ mounted() {
+ const key = deleteReleaseSessionKey(this.projectPath);
+ const deletedRelease = window.sessionStorage.getItem(key);
+
+ if (deletedRelease) {
+ this.$toast.show(
+ sprintf(__('Release %{deletedRelease} has been successfully deleted.'), {
+ deletedRelease,
+ }),
+ );
+ }
+
+ window.sessionStorage.removeItem(key);
+ },
created() {
this.updateQueryParamsFromUrl();
diff --git a/app/assets/javascripts/releases/components/confirm_delete_modal.vue b/app/assets/javascripts/releases/components/confirm_delete_modal.vue
new file mode 100644
index 00000000000..aa948fbbaf6
--- /dev/null
+++ b/app/assets/javascripts/releases/components/confirm_delete_modal.vue
@@ -0,0 +1,77 @@
+<script>
+import { GlModal, GlSprintf, GlLink, GlButton } from '@gitlab/ui';
+import { mapState } from 'vuex';
+import { __, s__, sprintf } from '~/locale';
+
+export default {
+ components: {
+ GlModal,
+ GlSprintf,
+ GlLink,
+ GlButton,
+ },
+ data() {
+ return {
+ visible: false,
+ };
+ },
+ computed: {
+ ...mapState('editNew', ['release', 'deleteReleaseDocsPath']),
+ title() {
+ return sprintf(__('Delete release %{release}?'), { release: this.release.name });
+ },
+ },
+ modalOptions: {
+ modalId: 'confirm-delete-release',
+ static: true,
+ actionPrimary: {
+ attributes: { variant: 'danger' },
+ text: __('Delete release'),
+ },
+ actionSecondary: {
+ text: __('Cancel'),
+ attributes: { variant: 'default' },
+ },
+ },
+ i18n: {
+ buttonLabel: __('Delete'),
+ line1: s__(
+ 'DeleteRelease|You are about to delete release %{release} and its assets. The Git tag %{tag} will not be deleted.',
+ ),
+ line2: s__(
+ 'DeleteRelease|For more details, see %{docsPathStart}Deleting a release%{docsPathEnd}.',
+ ),
+ line3: s__('DeleteRelease|Are you sure you want to delete this release?'),
+ },
+};
+</script>
+<template>
+ <div>
+ <gl-button class="gl-mr-3" variant="danger" @click="visible = true">
+ {{ $options.i18n.buttonLabel }}
+ </gl-button>
+ <gl-modal
+ v-bind="$options.modalOptions"
+ v-model="visible"
+ :title="title"
+ @primary="$emit('delete')"
+ >
+ <p>
+ <gl-sprintf :message="$options.i18n.line1">
+ <template #release>{{ release.name }}</template>
+ <template #tag>
+ <gl-link :href="release.tagPath">{{ release.tagName }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ <p>
+ <gl-sprintf :message="$options.i18n.line2">
+ <template #docsPath="{ content }">
+ <gl-link :href="deleteReleaseDocsPath" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ <p>{{ $options.i18n.line3 }}</p>
+ </gl-modal>
+ </div>
+</template>
diff --git a/app/assets/javascripts/releases/components/release_block_footer.vue b/app/assets/javascripts/releases/components/release_block_footer.vue
index 91d6d0911a4..3881c83b5c2 100644
--- a/app/assets/javascripts/releases/components/release_block_footer.vue
+++ b/app/assets/javascripts/releases/components/release_block_footer.vue
@@ -42,9 +42,9 @@ export default {
default: null,
},
releasedAt: {
- type: String,
+ type: Date,
required: false,
- default: '',
+ default: null,
},
},
computed: {
@@ -66,8 +66,11 @@ export default {
</script>
<template>
<div>
- <div v-if="commit" class="float-left mr-3 d-flex align-items-center js-commit-info">
- <gl-icon ref="commitIcon" name="commit" class="mr-1" />
+ <div
+ v-if="commit"
+ class="gl-float-left gl-mr-5 gl-display-flex gl-align-items-center js-commit-info"
+ >
+ <gl-icon ref="commitIcon" name="commit" class="gl-mr-2" />
<div v-gl-tooltip.bottom :title="commit.title">
<gl-link v-if="commitPath" :href="commitPath">
{{ commit.shortId }}
@@ -76,8 +79,11 @@ export default {
</div>
</div>
- <div v-if="tagName" class="float-left mr-3 d-flex align-items-center js-tag-info">
- <gl-icon name="tag" class="mr-1" />
+ <div
+ v-if="tagName"
+ class="gl-float-left gl-mr-5 gl-display-flex gl-align-items-center js-tag-info"
+ >
+ <gl-icon name="tag" class="gl-mr-2" />
<div v-gl-tooltip.bottom :title="__('Tag')">
<gl-link v-if="tagPath" :href="tagPath">
{{ tagName }}
@@ -88,23 +94,23 @@ export default {
<div
v-if="releasedAt || author"
- class="float-left d-flex align-items-center js-author-date-info"
+ class="gl-float-left gl-display-flex gl-align-items-center js-author-date-info"
>
- <span class="text-secondary">{{ createdTime }}&nbsp;</span>
+ <span class="gl-text-secondary">{{ createdTime }}&nbsp;</span>
<template v-if="releasedAt">
<span
v-gl-tooltip.bottom
:title="tooltipTitle(releasedAt)"
- class="text-secondary flex-shrink-0"
+ class="gl-text-secondary gl-flex-shrink-0"
>
{{ releasedAtTimeAgo }}&nbsp;
</span>
</template>
- <div v-if="author" class="d-flex">
- <span class="text-secondary">{{ __('by') }}&nbsp;</span>
+ <div v-if="author" class="gl-display-flex">
+ <span class="gl-text-secondary">{{ __('by') }}&nbsp;</span>
<user-avatar-link
- class="gl-my-n1"
+ class="gl-my-n1 gl-display-flex"
:link-href="author.webUrl"
:img-src="author.avatarUrl"
:img-alt="userImageAltDescription"
diff --git a/app/assets/javascripts/releases/components/tag_field.vue b/app/assets/javascripts/releases/components/tag_field.vue
index f4c0fd5e9ce..b4fea9bee35 100644
--- a/app/assets/javascripts/releases/components/tag_field.vue
+++ b/app/assets/javascripts/releases/components/tag_field.vue
@@ -1,5 +1,5 @@
<script>
-import { mapGetters } from 'vuex';
+import { mapState } from 'vuex';
import TagFieldExisting from './tag_field_existing.vue';
import TagFieldNew from './tag_field_new.vue';
@@ -9,7 +9,7 @@ export default {
TagFieldNew,
},
computed: {
- ...mapGetters('editNew', ['isExistingRelease']),
+ ...mapState('editNew', ['isExistingRelease']),
},
};
</script>
diff --git a/app/assets/javascripts/releases/components/tag_field_new.vue b/app/assets/javascripts/releases/components/tag_field_new.vue
index d3b6d07590f..08b727dcca0 100644
--- a/app/assets/javascripts/releases/components/tag_field_new.vue
+++ b/app/assets/javascripts/releases/components/tag_field_new.vue
@@ -22,12 +22,10 @@ export default {
// the input field. This is used to avoid showing validation
// errors immediately when the page loads.
isInputDirty: false,
-
- showCreateFrom: true,
};
},
computed: {
- ...mapState('editNew', ['projectId', 'release', 'createFrom']),
+ ...mapState('editNew', ['projectId', 'release', 'createFrom', 'showCreateFrom']),
...mapGetters('editNew', ['validationErrors']),
tagName: {
get() {
@@ -40,7 +38,7 @@ export default {
// When this is called, the selection originated from the
// dropdown list of existing tag names, so we know the tag
// already exists and don't need to show the "create from" input
- this.showCreateFrom = false;
+ this.updateShowCreateFrom(false);
},
},
createFromModel: {
@@ -70,7 +68,12 @@ export default {
},
},
methods: {
- ...mapActions('editNew', ['updateReleaseTagName', 'updateCreateFrom', 'fetchTagNotes']),
+ ...mapActions('editNew', [
+ 'updateReleaseTagName',
+ 'updateCreateFrom',
+ 'fetchTagNotes',
+ 'updateShowCreateFrom',
+ ]),
markInputAsDirty() {
this.isInputDirty = true;
},
@@ -80,7 +83,7 @@ export default {
// This method is called when the user selects the "create tag"
// option, so the tag does not already exist. Because of this,
// we need to show the "create from" input.
- this.showCreateFrom = true;
+ this.updateShowCreateFrom(true);
},
shouldShowCreateTagOption(isLoading, matches, query) {
// Show the "create tag" option if:
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 236d266a40a..3ad66afa259 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
@@ -3,6 +3,8 @@ fragment ReleaseForEditing on Release {
name
tagName
description
+ releasedAt
+ tagPath
assets {
links {
nodes {
diff --git a/app/assets/javascripts/releases/graphql/mutations/delete_release.mutation.graphql b/app/assets/javascripts/releases/graphql/mutations/delete_release.mutation.graphql
new file mode 100644
index 00000000000..7a8bf9944a3
--- /dev/null
+++ b/app/assets/javascripts/releases/graphql/mutations/delete_release.mutation.graphql
@@ -0,0 +1,5 @@
+mutation deleteRelease($input: ReleaseDeleteInput!) {
+ releaseDelete(input: $input) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/releases/mount_edit.js b/app/assets/javascripts/releases/mount_edit.js
index fad0451ceef..c3130a0b778 100644
--- a/app/assets/javascripts/releases/mount_edit.js
+++ b/app/assets/javascripts/releases/mount_edit.js
@@ -11,7 +11,7 @@ export default () => {
const store = createStore({
modules: {
- editNew: createEditNewModule(el.dataset),
+ editNew: createEditNewModule({ ...el.dataset, isExistingRelease: true }),
},
});
diff --git a/app/assets/javascripts/releases/mount_index.js b/app/assets/javascripts/releases/mount_index.js
index afb8ab461cd..8e806f0e8d7 100644
--- a/app/assets/javascripts/releases/mount_index.js
+++ b/app/assets/javascripts/releases/mount_index.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import { GlToast } from '@gitlab/ui';
import createDefaultClient from '~/lib/graphql';
import ReleaseIndexApp from './components/app_index.vue';
@@ -7,6 +8,7 @@ export default () => {
const el = document.getElementById('js-releases-page');
Vue.use(VueApollo);
+ Vue.use(GlToast);
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(
diff --git a/app/assets/javascripts/releases/mount_new.js b/app/assets/javascripts/releases/mount_new.js
index b358a27f06d..0a3f8b5e63b 100644
--- a/app/assets/javascripts/releases/mount_new.js
+++ b/app/assets/javascripts/releases/mount_new.js
@@ -11,7 +11,7 @@ export default () => {
const store = createStore({
modules: {
- editNew: createEditNewModule(el.dataset),
+ editNew: createEditNewModule({ ...el.dataset, isExistingRelease: false }),
},
});
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 08197377f61..a71a8125d65 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js
@@ -3,16 +3,21 @@ import createFlash from '~/flash';
import { redirectTo } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import createReleaseMutation from '~/releases/graphql/mutations/create_release.mutation.graphql';
+import deleteReleaseMutation from '~/releases/graphql/mutations/delete_release.mutation.graphql';
import createReleaseAssetLinkMutation from '~/releases/graphql/mutations/create_release_link.mutation.graphql';
import deleteReleaseAssetLinkMutation from '~/releases/graphql/mutations/delete_release_link.mutation.graphql';
import updateReleaseMutation from '~/releases/graphql/mutations/update_release.mutation.graphql';
import oneReleaseForEditingQuery from '~/releases/graphql/queries/one_release_for_editing.query.graphql';
-import { gqClient, convertOneReleaseGraphQLResponse } from '~/releases/util';
+import {
+ gqClient,
+ convertOneReleaseGraphQLResponse,
+ deleteReleaseSessionKey,
+} from '~/releases/util';
import * as types from './mutation_types';
-export const initializeRelease = ({ commit, dispatch, getters }) => {
- if (getters.isExistingRelease) {
+export const initializeRelease = ({ commit, dispatch, state }) => {
+ if (state.isExistingRelease) {
// When editing an existing release,
// fetch the release object from the API
return dispatch('fetchRelease');
@@ -53,6 +58,9 @@ export const updateReleaseTagName = ({ commit }, tagName) =>
export const updateCreateFrom = ({ commit }, createFrom) =>
commit(types.UPDATE_CREATE_FROM, createFrom);
+export const updateShowCreateFrom = ({ commit }, showCreateFrom) =>
+ commit(types.UPDATE_SHOW_CREATE_FROM, showCreateFrom);
+
export const updateReleaseTitle = ({ commit }, title) => commit(types.UPDATE_RELEASE_TITLE, title);
export const updateReleaseNotes = ({ commit }, notes) => commit(types.UPDATE_RELEASE_NOTES, notes);
@@ -88,10 +96,10 @@ export const receiveSaveReleaseSuccess = ({ commit }, urlToRedirectTo) => {
redirectTo(urlToRedirectTo);
};
-export const saveRelease = ({ commit, dispatch, getters }) => {
+export const saveRelease = ({ commit, dispatch, state }) => {
commit(types.REQUEST_SAVE_RELEASE);
- dispatch(getters.isExistingRelease ? 'updateRelease' : 'createRelease');
+ dispatch(state.isExistingRelease ? 'updateRelease' : 'createRelease');
};
/**
@@ -246,3 +254,30 @@ export const fetchTagNotes = ({ commit, state }, tagName) => {
export const updateIncludeTagNotes = ({ commit }, includeTagNotes) => {
commit(types.UPDATE_INCLUDE_TAG_NOTES, includeTagNotes);
};
+
+export const updateReleasedAt = ({ commit }, releasedAt) => {
+ commit(types.UPDATE_RELEASED_AT, releasedAt);
+};
+
+export const deleteRelease = ({ commit, getters, dispatch, state }) => {
+ commit(types.REQUEST_SAVE_RELEASE);
+ return gqClient
+ .mutate({
+ mutation: deleteReleaseMutation,
+ variables: getters.releaseDeleteMutationVariables,
+ })
+ .then((response) => checkForErrorsAsData(response, 'releaseDelete', ''))
+ .then(() => {
+ window.sessionStorage.setItem(
+ deleteReleaseSessionKey(state.projectPath),
+ state.originalRelease.name,
+ );
+ return dispatch('receiveSaveReleaseSuccess', state.releasesPagePath);
+ })
+ .catch((error) => {
+ commit(types.RECEIVE_SAVE_RELEASE_ERROR, error);
+ createFlash({
+ message: s__('Release|Something went wrong while deleting the release.'),
+ });
+ });
+};
diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js
index 0ca5eb9931a..62d6bd42d51 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js
@@ -4,14 +4,6 @@ import { hasContent } from '~/lib/utils/text_utility';
import { getDuplicateItemsFromArray } from '~/lib/utils/array_utility';
/**
- * @returns {Boolean} `true` if the app is editing an existing release.
- * `false` if the app is creating a new release.
- */
-export const isExistingRelease = (state) => {
- return Boolean(state.tagName);
-};
-
-/**
* @param {Object} link The link to test
* @returns {Boolean} `true` if the release link is empty, i.e. it has
* empty (or whitespace-only) values for both `url` and `name`.
@@ -138,6 +130,7 @@ export const releaseUpdateMutatationVariables = (state, getters) => {
projectPath: state.projectPath,
tagName: state.release.tagName,
name,
+ releasedAt: state.release.releasedAt,
description: state.includeTagNotes
? getters.formattedReleaseNotes
: state.release.description,
@@ -163,6 +156,13 @@ export const releaseCreateMutatationVariables = (state, getters) => {
};
};
+export const releaseDeleteMutationVariables = (state) => ({
+ input: {
+ projectPath: state.projectPath,
+ tagName: state.release.tagName,
+ },
+});
+
export const formattedReleaseNotes = ({ includeTagNotes, release: { description }, tagNotes }) =>
includeTagNotes && tagNotes
? `${description}\n\n### ${s__('Releases|Tag message')}\n\n${tagNotes}\n`
diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js b/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js
index daa077309a1..0ef017f4eb4 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js
@@ -6,6 +6,7 @@ export const RECEIVE_RELEASE_ERROR = 'RECEIVE_RELEASE_ERROR';
export const UPDATE_RELEASE_TAG_NAME = 'UPDATE_RELEASE_TAG_NAME';
export const UPDATE_CREATE_FROM = 'UPDATE_CREATE_FROM';
+export const UPDATE_SHOW_CREATE_FROM = 'UPDATE_SHOW_CREATE_FROM';
export const UPDATE_RELEASE_TITLE = 'UPDATE_RELEASE_TITLE';
export const UPDATE_RELEASE_NOTES = 'UPDATE_RELEASE_NOTES';
export const UPDATE_RELEASE_MILESTONES = 'UPDATE_RELEASE_MILESTONES';
@@ -26,3 +27,4 @@ export const RECEIVE_TAG_NOTES_SUCCESS = 'RECEIVE_TAG_NOTES_SUCCESS';
export const RECEIVE_TAG_NOTES_ERROR = 'RECEIVE_TAG_NOTES_ERROR';
export const UPDATE_INCLUDE_TAG_NOTES = 'UPDATE_INCLUDE_TAG_NOTES';
+export const UPDATE_RELEASED_AT = 'UPDATE_RELEASED_AT';
diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js b/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js
index 6b22468bbfe..ea794f91f66 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js
@@ -9,11 +9,12 @@ const findReleaseLink = (release, id) => {
export default {
[types.INITIALIZE_EMPTY_RELEASE](state) {
state.release = {
- tagName: null,
+ tagName: state.tagName,
name: '',
description: '',
milestones: [],
groupMilestones: [],
+ releasedAt: new Date(),
assets: {
links: [],
},
@@ -41,6 +42,9 @@ export default {
[types.UPDATE_CREATE_FROM](state, createFrom) {
state.createFrom = createFrom;
},
+ [types.UPDATE_SHOW_CREATE_FROM](state, showCreateFrom) {
+ state.showCreateFrom = showCreateFrom;
+ },
[types.UPDATE_RELEASE_TITLE](state, title) {
state.release.name = title;
},
@@ -113,4 +117,7 @@ export default {
[types.UPDATE_INCLUDE_TAG_NOTES](state, includeTagNotes) {
state.includeTagNotes = includeTagNotes;
},
+ [types.UPDATE_RELEASED_AT](state, releasedAt) {
+ state.release.releasedAt = releasedAt;
+ },
};
diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/state.js b/app/assets/javascripts/releases/stores/modules/edit_new/state.js
index 33cb3ee06d0..cb447cf9aaf 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/state.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/state.js
@@ -1,4 +1,5 @@
export default ({
+ isExistingRelease,
projectId,
groupId,
groupMilestonesAvailable = false,
@@ -10,10 +11,13 @@ export default ({
newMilestonePath,
releasesPagePath,
editReleaseDocsPath,
+ upcomingReleaseDocsPath,
+ deleteReleaseDocsPath = '',
tagName = null,
defaultBranch = null,
}) => ({
+ isExistingRelease,
projectId,
groupId,
groupMilestonesAvailable: Boolean(groupMilestonesAvailable),
@@ -25,12 +29,15 @@ export default ({
newMilestonePath,
releasesPagePath,
editReleaseDocsPath,
+ upcomingReleaseDocsPath,
+ deleteReleaseDocsPath,
/**
* The name of the tag associated with the release, provided by the backend.
- * When creating a new release, this value is null.
+ * When creating a new release, this is the default from the URL
*/
tagName,
+ showCreateFrom: !tagName,
defaultBranch,
createFrom: defaultBranch,
diff --git a/app/assets/javascripts/releases/util.js b/app/assets/javascripts/releases/util.js
index 22d5fb4f620..f1f5f4bca4c 100644
--- a/app/assets/javascripts/releases/util.js
+++ b/app/assets/javascripts/releases/util.js
@@ -11,10 +11,13 @@ const convertScalarProperties = (graphQLRelease) =>
'tagPath',
'description',
'descriptionHtml',
- 'releasedAt',
'upcomingRelease',
]);
+const convertDateProperties = ({ releasedAt }) => ({
+ releasedAt: new Date(releasedAt),
+});
+
const convertAssets = (graphQLRelease) => {
let sources = [];
if (graphQLRelease.assets.sources?.nodes) {
@@ -88,6 +91,7 @@ const convertMilestones = (graphQLRelease) => ({
*/
export const convertGraphQLRelease = (graphQLRelease) => ({
...convertScalarProperties(graphQLRelease),
+ ...convertDateProperties(graphQLRelease),
...convertAssets(graphQLRelease),
...convertEvidences(graphQLRelease),
...convertLinks(graphQLRelease),
@@ -129,3 +133,5 @@ export const convertOneReleaseGraphQLResponse = (response) => {
return { data: release };
};
+
+export const deleteReleaseSessionKey = (projectPath) => `deleteRelease:${projectPath}`;
diff --git a/app/assets/javascripts/reports/components/summary_row.vue b/app/assets/javascripts/reports/components/summary_row.vue
index 92d0783749e..ee55368c829 100644
--- a/app/assets/javascripts/reports/components/summary_row.vue
+++ b/app/assets/javascripts/reports/components/summary_row.vue
@@ -84,7 +84,7 @@ export default {
</div>
</div>
<div
- v-if="$slots.default"
+ v-if="$slots.default /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */"
class="text-right flex-fill d-flex justify-content-end flex-column flex-sm-row"
>
<slot></slot>
diff --git a/app/assets/javascripts/repository/components/blob_content_viewer.vue b/app/assets/javascripts/repository/components/blob_content_viewer.vue
index 280455c3fed..bf4f19504f0 100644
--- a/app/assets/javascripts/repository/components/blob_content_viewer.vue
+++ b/app/assets/javascripts/repository/components/blob_content_viewer.vue
@@ -97,6 +97,7 @@ export default {
project: DEFAULT_BLOB_INFO.project,
gitpodEnabled: DEFAULT_BLOB_INFO.gitpodEnabled,
currentUser: DEFAULT_BLOB_INFO.currentUser,
+ useFallback: false,
};
},
computed: {
@@ -130,7 +131,7 @@ export default {
},
shouldLoadLegacyViewer() {
const isTextFile = this.viewer.fileType === TEXT_FILE_TYPE && !this.glFeatures.highlightJs;
- return isTextFile || LEGACY_FILE_TYPES.includes(this.blobInfo.fileType);
+ return isTextFile || LEGACY_FILE_TYPES.includes(this.blobInfo.fileType) || this.useFallback;
},
legacyViewerLoaded() {
return (
@@ -173,6 +174,10 @@ export default {
},
},
methods: {
+ onError() {
+ this.useFallback = true;
+ this.loadLegacyViewer();
+ },
loadLegacyViewer() {
if (this.legacyViewerLoaded) {
return;
@@ -303,7 +308,7 @@ export default {
:loading="isLoadingLegacyViewer"
:data-loading="isRenderingLegacyTextViewer"
/>
- <component :is="blobViewer" v-else :blob="blobInfo" class="blob-viewer" />
+ <component :is="blobViewer" v-else :blob="blobInfo" class="blob-viewer" @error="onError" />
<code-intelligence
v-if="blobViewer || legacyViewerLoaded"
:code-navigation-path="blobInfo.codeNavigationPath"
diff --git a/app/assets/javascripts/repository/components/last_commit.vue b/app/assets/javascripts/repository/components/last_commit.vue
index d24d7648f1b..9f2cf8505d3 100644
--- a/app/assets/javascripts/repository/components/last_commit.vue
+++ b/app/assets/javascripts/repository/components/last_commit.vue
@@ -49,10 +49,11 @@ export default {
};
},
update: (data) => {
- const pipelines = data.project?.repository?.tree?.lastCommit?.pipelines?.edges;
+ const lastCommit = data.project?.repository?.paginatedTree?.nodes[0]?.lastCommit;
+ const pipelines = lastCommit?.pipelines?.edges;
return {
- ...data.project?.repository?.tree?.lastCommit,
+ ...lastCommit,
pipeline: pipelines?.length && pipelines[0].node,
};
},
@@ -131,7 +132,9 @@ export default {
:css-classes="'gl-mr-0!' /* NOTE: this is needed only while we migrate user-avatar-image to GlAvatar (7731 epics) */"
:size="32"
/>
- <div class="commit-detail flex-list">
+ <div
+ class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-flex-start gl-flex-grow-1 gl-min-w-0"
+ >
<div class="commit-content qa-commit-content">
<gl-link
v-safe-html:[$options.safeHtmlConfig]="commit.titleHtml"
diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue
index 41f7a4b147f..1f6b5e98122 100644
--- a/app/assets/javascripts/repository/components/table/index.vue
+++ b/app/assets/javascripts/repository/components/table/index.vue
@@ -103,14 +103,12 @@ export default {
return this.rowNumbers[key];
},
- getCommit(fileName, type) {
+ getCommit(fileName) {
if (!this.glFeatures.lazyLoadCommits) {
return {};
}
- return this.commits.find(
- (commitEntry) => commitEntry.fileName === fileName && commitEntry.type === type,
- );
+ return this.commits.find((commitEntry) => commitEntry.fileName === fileName);
},
},
};
@@ -152,7 +150,7 @@ export default {
:loading-path="loadingPath"
:total-entries="totalEntries"
:row-number="generateRowNumber(entry.flatPath, entry.id, index)"
- :commit-info="getCommit(entry.name, entry.type)"
+ :commit-info="getCommit(entry.name)"
v-on="$listeners"
/>
</template>
diff --git a/app/assets/javascripts/repository/components/table/row.vue b/app/assets/javascripts/repository/components/table/row.vue
index 2b910109f7d..99b7395d6e7 100644
--- a/app/assets/javascripts/repository/components/table/row.vue
+++ b/app/assets/javascripts/repository/components/table/row.vue
@@ -43,7 +43,6 @@ export default {
variables() {
return {
fileName: this.name,
- type: this.type,
path: this.currentPath,
projectPath: this.projectPath,
maxOffset: this.totalEntries,
@@ -135,14 +134,11 @@ export default {
commitData() {
return this.glFeatures.lazyLoadCommits ? this.commitInfo : this.commit;
},
- refactorBlobViewerEnabled() {
- return this.glFeatures.refactorBlobViewer;
- },
routerLinkTo() {
const blobRouteConfig = { path: `/-/blob/${this.escapedRef}/${escapeFileUrl(this.path)}` };
const treeRouteConfig = { path: `/-/tree/${this.escapedRef}/${escapeFileUrl(this.path)}` };
- if (this.refactorBlobViewerEnabled && this.isBlob) {
+ if (this.isBlob) {
return blobRouteConfig;
}
@@ -158,7 +154,7 @@ export default {
return this.type === 'commit';
},
linkComponent() {
- return this.isFolder || (this.refactorBlobViewerEnabled && this.isBlob) ? 'router-link' : 'a';
+ return this.isFolder || this.isBlob ? 'router-link' : 'a';
},
fullPath() {
return this.path.replace(new RegExp(`^${escapeRegExp(this.currentPath)}/`), '');
@@ -187,10 +183,6 @@ export default {
});
},
loadBlob() {
- if (!this.refactorBlobViewerEnabled) {
- return;
- }
-
this.apolloQuery(blobInfoQuery, {
projectPath: this.projectPath,
filePath: this.path,
diff --git a/app/assets/javascripts/repository/constants.js b/app/assets/javascripts/repository/constants.js
index 2cafeed2ef4..0e80f306638 100644
--- a/app/assets/javascripts/repository/constants.js
+++ b/app/assets/javascripts/repository/constants.js
@@ -93,7 +93,6 @@ export const LFS_STORAGE = 'lfs';
* These are file types that we want the legacy (backend) syntax highlighter to highlight.
*/
export const LEGACY_FILE_TYPES = [
- 'package_json',
'gemfile',
'gemspec',
'composer_json',
diff --git a/app/assets/javascripts/repository/graphql.js b/app/assets/javascripts/repository/graphql.js
index 29aabe1b00f..3a59a02af01 100644
--- a/app/assets/javascripts/repository/graphql.js
+++ b/app/assets/javascripts/repository/graphql.js
@@ -9,7 +9,7 @@ Vue.use(VueApollo);
const defaultClient = createDefaultClient(
{
Query: {
- commit(_, { path, fileName, type, maxOffset }) {
+ commit(_, { path, fileName, maxOffset }) {
return new Promise((resolve) => {
fetchLogsTree(
defaultClient,
@@ -19,7 +19,6 @@ const defaultClient = createDefaultClient(
resolve,
entry: {
name: fileName,
- type,
},
},
maxOffset,
diff --git a/app/assets/javascripts/repository/index.js b/app/assets/javascripts/repository/index.js
index 8f8735a6371..1d295e18332 100644
--- a/app/assets/javascripts/repository/index.js
+++ b/app/assets/javascripts/repository/index.js
@@ -91,9 +91,7 @@ export default function setupVueRepositoryList() {
initLastCommitApp();
- if (gon.features.refactorBlobViewer) {
- initBlobControlsApp();
- }
+ initBlobControlsApp();
router.afterEach(({ params: { path } }) => {
setTitle(path, ref, fullName);
diff --git a/app/assets/javascripts/repository/log_tree.js b/app/assets/javascripts/repository/log_tree.js
index ac02392d60f..9345a8406e3 100644
--- a/app/assets/javascripts/repository/log_tree.js
+++ b/app/assets/javascripts/repository/log_tree.js
@@ -16,9 +16,7 @@ function setNextOffset(offset) {
}
export function resolveCommit(commits, path, { resolve, entry }) {
- const commit = commits.find(
- (c) => c.filePath === `${path}/${entry.name}` && c.type === entry.type,
- );
+ const commit = commits.find((c) => c.filePath === `${path}/${entry.name}`);
if (commit) {
resolve(commit);
diff --git a/app/assets/javascripts/repository/queries/commit.fragment.graphql b/app/assets/javascripts/repository/queries/commit.fragment.graphql
index b046fc1f730..80dedfe3e3f 100644
--- a/app/assets/javascripts/repository/queries/commit.fragment.graphql
+++ b/app/assets/javascripts/repository/queries/commit.fragment.graphql
@@ -6,5 +6,4 @@ fragment TreeEntryCommit on LogTreeCommit {
commitPath
fileName
filePath
- type
}
diff --git a/app/assets/javascripts/repository/queries/commit.query.graphql b/app/assets/javascripts/repository/queries/commit.query.graphql
index 7ae4a3b984a..1a01462bd19 100644
--- a/app/assets/javascripts/repository/queries/commit.query.graphql
+++ b/app/assets/javascripts/repository/queries/commit.query.graphql
@@ -1,7 +1,7 @@
#import "ee_else_ce/repository/queries/commit.fragment.graphql"
-query getCommit($fileName: String!, $type: String!, $path: String!, $maxOffset: Number!) {
- commit(path: $path, fileName: $fileName, type: $type, maxOffset: $maxOffset) @client {
+query getCommit($fileName: String!, $path: String!, $maxOffset: Number!) {
+ commit(path: $path, fileName: $fileName, maxOffset: $maxOffset) @client {
...TreeEntryCommit
}
}
diff --git a/app/assets/javascripts/repository/utils/commit.js b/app/assets/javascripts/repository/utils/commit.js
index a67252ec004..878b4fdd71a 100644
--- a/app/assets/javascripts/repository/utils/commit.js
+++ b/app/assets/javascripts/repository/utils/commit.js
@@ -7,7 +7,6 @@ export function normalizeData(data, path, extra = () => {}) {
commitPath: d.commit_path,
fileName: d.file_name,
filePath: `${path}/${d.file_name}`,
- type: d.type,
__typename: 'LogTreeCommit',
...extra(d),
}));
diff --git a/app/assets/javascripts/runner/admin_runner_show/admin_runner_show_app.vue b/app/assets/javascripts/runner/admin_runner_show/admin_runner_show_app.vue
index 06a8eb790fc..9fa4b521ebc 100644
--- a/app/assets/javascripts/runner/admin_runner_show/admin_runner_show_app.vue
+++ b/app/assets/javascripts/runner/admin_runner_show/admin_runner_show_app.vue
@@ -1,5 +1,5 @@
<script>
-import { GlBadge, GlTab, GlTooltipDirective } from '@gitlab/ui';
+import { GlBadge, GlTabs, GlTab, GlTooltipDirective } from '@gitlab/ui';
import { createAlert, VARIANT_SUCCESS } from '~/flash';
import { TYPE_CI_RUNNER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
@@ -11,7 +11,7 @@ import RunnerPauseButton from '../components/runner_pause_button.vue';
import RunnerHeader from '../components/runner_header.vue';
import RunnerDetails from '../components/runner_details.vue';
import RunnerJobs from '../components/runner_jobs.vue';
-import { I18N_FETCH_ERROR } from '../constants';
+import { I18N_DETAILS, I18N_FETCH_ERROR } from '../constants';
import runnerQuery from '../graphql/show/runner.query.graphql';
import { captureException } from '../sentry_utils';
import { saveAlertToLocalStorage } from '../local_storage_alert/save_alert_to_local_storage';
@@ -20,6 +20,7 @@ export default {
name: 'AdminRunnerShowApp',
components: {
GlBadge,
+ GlTabs,
GlTab,
RunnerDeleteButton,
RunnerEditButton,
@@ -84,6 +85,7 @@ export default {
redirectTo(this.runnersPath);
},
},
+ I18N_DETAILS,
};
</script>
<template>
@@ -96,24 +98,27 @@ export default {
</template>
</runner-header>
- <runner-details :runner="runner">
- <template #jobs-tab>
- <gl-tab>
- <template #title>
- {{ s__('Runners|Jobs') }}
- <gl-badge
- v-if="jobCount"
- data-testid="job-count-badge"
- class="gl-tab-counter-badge"
- size="sm"
- >
- {{ jobCount }}
- </gl-badge>
- </template>
+ <gl-tabs>
+ <gl-tab>
+ <template #title>{{ $options.I18N_DETAILS }}</template>
- <runner-jobs v-if="runner" :runner="runner" />
- </gl-tab>
- </template>
- </runner-details>
+ <runner-details v-if="runner" :runner="runner" />
+ </gl-tab>
+ <gl-tab>
+ <template #title>
+ {{ s__('Runners|Jobs') }}
+ <gl-badge
+ v-if="jobCount"
+ data-testid="job-count-badge"
+ class="gl-tab-counter-badge"
+ size="sm"
+ >
+ {{ jobCount }}
+ </gl-badge>
+ </template>
+
+ <runner-jobs v-if="runner" :runner="runner" />
+ </gl-tab>
+ </gl-tabs>
</div>
</template>
diff --git a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
index a90ef2d3530..f6b7a8b46d7 100644
--- a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
+++ b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
@@ -1,10 +1,17 @@
<script>
-import { GlBadge, GlLink } from '@gitlab/ui';
+import { GlLink } from '@gitlab/ui';
import { createAlert } from '~/flash';
import { updateHistory } from '~/lib/utils/url_utility';
-import { formatNumber } from '~/locale';
import { fetchPolicies } from '~/lib/graphql';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { upgradeStatusTokenConfig } from 'ee_else_ce/runner/components/search_tokens/upgrade_status_token_config';
+import {
+ fromUrlQueryToSearch,
+ fromSearchToUrl,
+ fromSearchToVariables,
+ isSearchFiltered,
+} from 'ee_else_ce/runner/runner_search_utils';
+import allRunnersQuery from 'ee_else_ce/runner/graphql/list/all_runners.query.graphql';
import RegistrationDropdown from '../components/registration/registration_dropdown.vue';
import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue';
@@ -20,74 +27,12 @@ import RunnerActionsCell from '../components/cells/runner_actions_cell.vue';
import { pausedTokenConfig } from '../components/search_tokens/paused_token_config';
import { statusTokenConfig } from '../components/search_tokens/status_token_config';
import { tagTokenConfig } from '../components/search_tokens/tag_token_config';
-import {
- ADMIN_FILTERED_SEARCH_NAMESPACE,
- INSTANCE_TYPE,
- GROUP_TYPE,
- PROJECT_TYPE,
- STATUS_ONLINE,
- STATUS_OFFLINE,
- STATUS_STALE,
- I18N_FETCH_ERROR,
-} from '../constants';
-import runnersAdminQuery from '../graphql/list/admin_runners.query.graphql';
-import runnersAdminCountQuery from '../graphql/list/admin_runners_count.query.graphql';
-import {
- fromUrlQueryToSearch,
- fromSearchToUrl,
- fromSearchToVariables,
- isSearchFiltered,
-} from '../runner_search_utils';
+import { ADMIN_FILTERED_SEARCH_NAMESPACE, INSTANCE_TYPE, I18N_FETCH_ERROR } from '../constants';
import { captureException } from '../sentry_utils';
-const countSmartQuery = () => ({
- query: runnersAdminCountQuery,
- fetchPolicy: fetchPolicies.NETWORK_ONLY,
- update(data) {
- return data?.runners?.count;
- },
- error(error) {
- this.reportToSentry(error);
- },
-});
-
-const tabCountSmartQuery = ({ type }) => {
- return {
- ...countSmartQuery(),
- variables() {
- return {
- ...this.countVariables,
- type,
- };
- },
- };
-};
-
-const statusCountSmartQuery = ({ status, name }) => {
- return {
- ...countSmartQuery(),
- skip() {
- // skip if filtering by status and not using _this_ status as filter
- if (this.countVariables.status && this.countVariables.status !== status) {
- // reset count for given status
- this[name] = null;
- return true;
- }
- return false;
- },
- variables() {
- return {
- ...this.countVariables,
- status,
- };
- },
- };
-};
-
export default {
name: 'AdminRunnersApp',
components: {
- GlBadge,
GlLink,
RegistrationDropdown,
RunnerFilteredSearchBar,
@@ -119,7 +64,7 @@ export default {
},
apollo: {
runners: {
- query: runnersAdminQuery,
+ query: allRunnersQuery,
fetchPolicy: fetchPolicies.NETWORK_ONLY,
variables() {
return this.variables;
@@ -137,31 +82,6 @@ export default {
this.reportToSentry(error);
},
},
-
- // Tabs counts
- allRunnersCount: {
- ...tabCountSmartQuery({ type: null }),
- },
- instanceRunnersCount: {
- ...tabCountSmartQuery({ type: INSTANCE_TYPE }),
- },
- groupRunnersCount: {
- ...tabCountSmartQuery({ type: GROUP_TYPE }),
- },
- projectRunnersCount: {
- ...tabCountSmartQuery({ type: PROJECT_TYPE }),
- },
-
- // Runner stats
- onlineRunnersTotal: {
- ...statusCountSmartQuery({ status: STATUS_ONLINE, name: 'onlineRunnersTotal' }),
- },
- offlineRunnersTotal: {
- ...statusCountSmartQuery({ status: STATUS_OFFLINE, name: 'offlineRunnersTotal' }),
- },
- staleRunnersTotal: {
- ...statusCountSmartQuery({ status: STATUS_STALE, name: 'staleRunnersTotal' }),
- },
},
computed: {
variables() {
@@ -186,6 +106,7 @@ export default {
...tagTokenConfig,
recentSuggestionsStorageKey: `${this.$options.filteredSearchNamespace}-recent-tags`,
},
+ upgradeStatusTokenConfig,
];
},
isBulkDeleteEnabled() {
@@ -214,39 +135,10 @@ export default {
this.reportToSentry(error);
},
methods: {
- tabCount({ runnerType }) {
- let count;
- switch (runnerType) {
- case null:
- count = this.allRunnersCount;
- break;
- case INSTANCE_TYPE:
- count = this.instanceRunnersCount;
- break;
- case GROUP_TYPE:
- count = this.groupRunnersCount;
- break;
- case PROJECT_TYPE:
- count = this.projectRunnersCount;
- break;
- default:
- return null;
- }
- if (typeof count === 'number') {
- return formatNumber(count);
- }
- return '';
- },
- refetchFilteredCounts() {
- this.$apollo.queries.allRunnersCount.refetch();
- this.$apollo.queries.instanceRunnersCount.refetch();
- this.$apollo.queries.groupRunnersCount.refetch();
- this.$apollo.queries.projectRunnersCount.refetch();
- },
onToggledPaused() {
- // When a runner is Paused, the tab count can
+ // When a runner becomes Paused, the tab count can
// become stale, refetch outdated counts.
- this.refetchFilteredCounts();
+ this.$refs['runner-type-tabs'].refetch();
},
onDeleted({ message }) {
this.$root.$toast?.show(message);
@@ -271,18 +163,14 @@ export default {
class="gl-display-flex gl-align-items-center gl-flex-direction-column-reverse gl-md-flex-direction-row gl-mt-3 gl-md-mt-0"
>
<runner-type-tabs
+ ref="runner-type-tabs"
v-model="search"
+ :count-scope="$options.INSTANCE_TYPE"
+ :count-variables="countVariables"
class="gl-w-full"
content-class="gl-display-none"
nav-class="gl-border-none!"
- >
- <template #title="{ tab }">
- {{ tab.title }}
- <gl-badge v-if="tabCount(tab)" class="gl-ml-1" size="sm">
- {{ tabCount(tab) }}
- </gl-badge>
- </template>
- </runner-type-tabs>
+ />
<registration-dropdown
class="gl-w-full gl-sm-w-auto gl-mr-auto"
@@ -298,11 +186,7 @@ export default {
:namespace="$options.filteredSearchNamespace"
/>
- <runner-stats
- :online-runners-count="onlineRunnersTotal"
- :offline-runners-count="offlineRunnersTotal"
- :stale-runners-count="staleRunnersTotal"
- />
+ <runner-stats :scope="$options.INSTANCE_TYPE" :variables="countVariables" />
<runner-list-empty-state
v-if="noRunnersFound"
diff --git a/app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue b/app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue
index 09d46ce3e66..667cb0090b3 100644
--- a/app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue
+++ b/app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue
@@ -8,14 +8,16 @@ import runnersRegistrationTokenResetMutation from '~/runner/graphql/list/runners
import { captureException } from '~/runner/sentry_utils';
import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '../../constants';
+const i18n = {
+ modalAction: s__('Runners|Reset token'),
+ modalCancel: __('Cancel'),
+ modalCopy: __('Are you sure you want to reset the registration token?'),
+ modalTitle: __('Reset registration token'),
+};
+
export default {
name: 'RunnerRegistrationTokenReset',
- i18n: {
- modalAction: s__('Runners|Reset token'),
- modalCancel: __('Cancel'),
- modalCopy: __('Are you sure you want to reset the registration token?'),
- modalTitle: __('Reset registration token'),
- },
+ i18n,
components: {
GlDropdownItem,
GlLoadingIcon,
@@ -68,6 +70,18 @@ export default {
return null;
}
},
+ actionPrimary() {
+ return {
+ text: i18n.modalAction,
+ attributes: [{ variant: 'danger' }],
+ };
+ },
+ actionSecondary() {
+ return {
+ text: i18n.modalCancel,
+ attributes: [{ variant: 'default' }],
+ };
+ },
},
methods: {
handleModalPrimary() {
@@ -115,14 +129,8 @@ export default {
<gl-modal
size="sm"
:modal-id="$options.modalId"
- :action-primary="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
- text: $options.i18n.modalAction,
- attributes: [{ variant: 'danger' }],
- } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
- :action-secondary="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
- text: $options.i18n.modalCancel,
- attributes: [{ variant: 'default' }],
- } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ :action-primary="actionPrimary"
+ :action-secondary="actionSecondary"
:title="$options.i18n.modalTitle"
@primary="handleModalPrimary"
>
diff --git a/app/assets/javascripts/runner/components/runner_detail.vue b/app/assets/javascripts/runner/components/runner_detail.vue
index b1234818b7e..db67acef3db 100644
--- a/app/assets/javascripts/runner/components/runner_detail.vue
+++ b/app/assets/javascripts/runner/components/runner_detail.vue
@@ -41,6 +41,7 @@ export default {
<div class="gl-display-flex gl-pb-4">
<dt class="gl-mr-2">{{ label }}</dt>
<dd class="gl-mb-0">
+ <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots -->
<template v-if="value || $slots.value">
<slot name="value">{{ value }}</slot>
</template>
diff --git a/app/assets/javascripts/runner/components/runner_details.vue b/app/assets/javascripts/runner/components/runner_details.vue
index 75ddec6c716..60469d26dd5 100644
--- a/app/assets/javascripts/runner/components/runner_details.vue
+++ b/app/assets/javascripts/runner/components/runner_details.vue
@@ -1,5 +1,5 @@
<script>
-import { GlTabs, GlTab, GlIntersperse } from '@gitlab/ui';
+import { GlIntersperse } from '@gitlab/ui';
import { s__ } from '~/locale';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
import { timeIntervalInWords } from '~/lib/utils/datetime_utility';
@@ -11,14 +11,16 @@ import RunnerTags from './runner_tags.vue';
export default {
components: {
- GlTabs,
- GlTab,
GlIntersperse,
RunnerDetail,
RunnerMaintenanceNoteDetail: () =>
import('ee_component/runner/components/runner_maintenance_note_detail.vue'),
RunnerGroups,
RunnerProjects,
+ RunnerUpgradeStatusBadge: () =>
+ import('ee_component/runner/components/runner_upgrade_status_badge.vue'),
+ RunnerUpgradeStatusAlert: () =>
+ import('ee_component/runner/components/runner_upgrade_status_alert.vue'),
RunnerTags,
TimeAgo,
},
@@ -61,58 +63,57 @@ export default {
</script>
<template>
- <gl-tabs>
- <gl-tab>
- <template #title>{{ s__('Runners|Details') }}</template>
-
- <template v-if="runner">
- <div class="gl-pt-4">
- <dl class="gl-mb-0" data-testid="runner-details-list">
- <runner-detail :label="s__('Runners|Description')" :value="runner.description" />
- <runner-detail
- :label="s__('Runners|Last contact')"
- :empty-value="s__('Runners|Never contacted')"
- >
- <template #value>
- <time-ago v-if="runner.contactedAt" :time="runner.contactedAt" />
- </template>
- </runner-detail>
- <runner-detail :label="s__('Runners|Version')" :value="runner.version" />
- <runner-detail :label="s__('Runners|IP Address')" :value="runner.ipAddress" />
- <runner-detail :label="s__('Runners|Executor')" :value="runner.executorName" />
- <runner-detail :label="s__('Runners|Architecture')" :value="runner.architectureName" />
- <runner-detail :label="s__('Runners|Platform')" :value="runner.platformName" />
- <runner-detail :label="s__('Runners|Configuration')">
- <template #value>
- <gl-intersperse v-if="configTextProtected || configTextUntagged">
- <span v-if="configTextProtected">{{ configTextProtected }}</span>
- <span v-if="configTextUntagged">{{ configTextUntagged }}</span>
- </gl-intersperse>
- </template>
- </runner-detail>
- <runner-detail :label="s__('Runners|Maximum job timeout')" :value="maximumTimeout" />
- <runner-detail :label="s__('Runners|Tags')">
- <template #value>
- <runner-tags
- v-if="runner.tagList && runner.tagList.length"
- class="gl-vertical-align-middle"
- :tag-list="runner.tagList"
- size="sm"
- />
- </template>
- </runner-detail>
-
- <runner-maintenance-note-detail
- class="gl-pt-4 gl-border-t-gray-100 gl-border-t-1 gl-border-t-solid"
- :value="runner.maintenanceNoteHtml"
+ <div>
+ <runner-upgrade-status-alert class="gl-my-4" :runner="runner" />
+ <div class="gl-pt-4">
+ <dl class="gl-mb-0" data-testid="runner-details-list">
+ <runner-detail :label="s__('Runners|Description')" :value="runner.description" />
+ <runner-detail
+ :label="s__('Runners|Last contact')"
+ :empty-value="s__('Runners|Never contacted')"
+ >
+ <template #value>
+ <time-ago v-if="runner.contactedAt" :time="runner.contactedAt" />
+ </template>
+ </runner-detail>
+ <runner-detail :label="s__('Runners|Version')">
+ <template v-if="runner.version" #value>
+ {{ runner.version }}
+ <runner-upgrade-status-badge size="sm" :runner="runner" />
+ </template>
+ </runner-detail>
+ <runner-detail :label="s__('Runners|IP Address')" :value="runner.ipAddress" />
+ <runner-detail :label="s__('Runners|Executor')" :value="runner.executorName" />
+ <runner-detail :label="s__('Runners|Architecture')" :value="runner.architectureName" />
+ <runner-detail :label="s__('Runners|Platform')" :value="runner.platformName" />
+ <runner-detail :label="s__('Runners|Configuration')">
+ <template #value>
+ <gl-intersperse v-if="configTextProtected || configTextUntagged">
+ <span v-if="configTextProtected">{{ configTextProtected }}</span>
+ <span v-if="configTextUntagged">{{ configTextUntagged }}</span>
+ </gl-intersperse>
+ </template>
+ </runner-detail>
+ <runner-detail :label="s__('Runners|Maximum job timeout')" :value="maximumTimeout" />
+ <runner-detail :label="s__('Runners|Tags')">
+ <template #value>
+ <runner-tags
+ v-if="runner.tagList && runner.tagList.length"
+ class="gl-vertical-align-middle"
+ :tag-list="runner.tagList"
+ size="sm"
/>
- </dl>
- </div>
+ </template>
+ </runner-detail>
+
+ <runner-maintenance-note-detail
+ class="gl-pt-4 gl-border-t-gray-100 gl-border-t-1 gl-border-t-solid"
+ :value="runner.maintenanceNoteHtml"
+ />
+ </dl>
+ </div>
- <runner-groups v-if="isGroupRunner" :runner="runner" />
- <runner-projects v-if="isProjectRunner" :runner="runner" />
- </template>
- </gl-tab>
- <slot name="jobs-tab"></slot>
- </gl-tabs>
+ <runner-groups v-if="isGroupRunner" :runner="runner" />
+ <runner-projects v-if="isProjectRunner" :runner="runner" />
+ </div>
</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 f0f8bbdf5df..bff5ec9b238 100644
--- a/app/assets/javascripts/runner/components/runner_filtered_search_bar.vue
+++ b/app/assets/javascripts/runner/components/runner_filtered_search_bar.vue
@@ -45,7 +45,7 @@ export default {
},
},
data() {
- // filtered_search_bar_root.vue may mutate the inital
+ // filtered_search_bar_root.vue may mutate the initial
// filters. Use `cloneDeep` to prevent those mutations
// from affecting this component
const { filters, sort } = cloneDeep(this.value);
@@ -54,6 +54,14 @@ export default {
initialSortBy: sort,
};
},
+ computed: {
+ validTokens() {
+ // Some filters are only available in EE
+ // EE-only tokens are represented by `null` or `undefined`
+ // values when in CE
+ return this.tokens.filter(Boolean);
+ },
+ },
methods: {
onFilter(filters) {
// Apply new filters, from page 1
@@ -83,7 +91,7 @@ export default {
recent-searches-storage-key="runners-search"
:sort-options="$options.sortOptions"
:initial-filter-value="initialFilterValue"
- :tokens="tokens"
+ :tokens="validTokens"
:initial-sort-by="initialSortBy"
:search-input-placeholder="__('Search or filter results...')"
data-testid="runners-filtered-search"
diff --git a/app/assets/javascripts/runner/components/runner_type_tabs.vue b/app/assets/javascripts/runner/components/runner_type_tabs.vue
index 25ed6600dc9..6b9e3bf91ad 100644
--- a/app/assets/javascripts/runner/components/runner_type_tabs.vue
+++ b/app/assets/javascripts/runner/components/runner_type_tabs.vue
@@ -1,6 +1,7 @@
<script>
-import { GlTabs, GlTab } from '@gitlab/ui';
+import { GlBadge, GlTabs, GlTab } from '@gitlab/ui';
import { searchValidator } from '~/runner/runner_search_utils';
+import { formatNumber } from '~/locale';
import {
INSTANCE_TYPE,
GROUP_TYPE,
@@ -10,6 +11,7 @@ import {
I18N_GROUP_TYPE,
I18N_PROJECT_TYPE,
} from '../constants';
+import RunnerCount from './stat/runner_count.vue';
const I18N_TAB_TITLES = {
[INSTANCE_TYPE]: I18N_INSTANCE_TYPE,
@@ -17,10 +19,14 @@ const I18N_TAB_TITLES = {
[PROJECT_TYPE]: I18N_PROJECT_TYPE,
};
+const TAB_COUNT_REF = 'tab-count';
+
export default {
components: {
+ GlBadge,
GlTabs,
GlTab,
+ RunnerCount,
},
props: {
runnerTypes: {
@@ -33,6 +39,14 @@ export default {
required: true,
validator: searchValidator,
},
+ countScope: {
+ type: String,
+ required: true,
+ },
+ countVariables: {
+ type: Object,
+ required: true,
+ },
},
computed: {
tabs() {
@@ -62,7 +76,25 @@ export default {
isTabActive({ runnerType }) {
return runnerType === this.value.runnerType;
},
+ tabBadgeCountVariables(runnerType) {
+ return { ...this.countVariables, type: runnerType };
+ },
+ tabCount(count) {
+ if (typeof count === 'number') {
+ return formatNumber(count);
+ }
+ return '';
+ },
+
+ // Component API
+ refetch() {
+ // Refresh all of the counts here, can be called by parent component
+ this.$refs[TAB_COUNT_REF].forEach((countComponent) => {
+ countComponent.refetch();
+ });
+ },
},
+ TAB_COUNT_REF,
};
</script>
<template>
@@ -74,7 +106,17 @@ export default {
@click="onTabSelected(tab)"
>
<template #title>
- <slot name="title" :tab="tab">{{ tab.title }}</slot>
+ {{ tab.title }}
+ <runner-count
+ #default="{ count }"
+ :ref="$options.TAB_COUNT_REF"
+ :scope="countScope"
+ :variables="tabBadgeCountVariables(tab.runnerType)"
+ >
+ <gl-badge v-if="tabCount(count)" class="gl-ml-1" size="sm">
+ {{ tabCount(count) }}
+ </gl-badge>
+ </runner-count>
</template>
</gl-tab>
</gl-tabs>
diff --git a/app/assets/javascripts/runner/components/search_tokens/paused_token_config.js b/app/assets/javascripts/runner/components/search_tokens/paused_token_config.js
index 1bab875a8a1..c1ad5da3ab9 100644
--- a/app/assets/javascripts/runner/components/search_tokens/paused_token_config.js
+++ b/app/assets/javascripts/runner/components/search_tokens/paused_token_config.js
@@ -22,7 +22,7 @@ export const pausedTokenConfig = {
// contain spaces!
// see: https://gitlab.com/gitlab-org/gitlab/-/issues/344142
// see: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1438
- title: title.replace(' ', '\u00a0'),
+ title: title.replace(/\s/g, '\u00a0'),
})),
operators: OPERATOR_IS_ONLY,
};
diff --git a/app/assets/javascripts/runner/components/search_tokens/status_token_config.js b/app/assets/javascripts/runner/components/search_tokens/status_token_config.js
index f28bd491ea5..9e6f63d3f7c 100644
--- a/app/assets/javascripts/runner/components/search_tokens/status_token_config.js
+++ b/app/assets/javascripts/runner/components/search_tokens/status_token_config.js
@@ -30,7 +30,7 @@ export const statusTokenConfig = {
// contain spaces!
// see: https://gitlab.com/gitlab-org/gitlab/-/issues/344142
// see: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1438
- title: title.replace(' ', '\u00a0'),
+ title: title.replace(/\s/g, '\u00a0'),
})),
operators: OPERATOR_IS_ONLY,
};
diff --git a/app/assets/javascripts/runner/components/search_tokens/upgrade_status_token_config.js b/app/assets/javascripts/runner/components/search_tokens/upgrade_status_token_config.js
new file mode 100644
index 00000000000..17ee7073360
--- /dev/null
+++ b/app/assets/javascripts/runner/components/search_tokens/upgrade_status_token_config.js
@@ -0,0 +1,2 @@
+// Overridden in EE
+export const upgradeStatusTokenConfig = null;
diff --git a/app/assets/javascripts/runner/components/stat/runner_count.vue b/app/assets/javascripts/runner/components/stat/runner_count.vue
new file mode 100644
index 00000000000..af18b203f90
--- /dev/null
+++ b/app/assets/javascripts/runner/components/stat/runner_count.vue
@@ -0,0 +1,103 @@
+<script>
+import { fetchPolicies } from '~/lib/graphql';
+import { captureException } from '../../sentry_utils';
+import allRunnersCountQuery from '../../graphql/list/all_runners_count.query.graphql';
+import groupRunnersCountQuery from '../../graphql/list/group_runners_count.query.graphql';
+import { INSTANCE_TYPE, GROUP_TYPE } from '../../constants';
+
+/**
+ * Renderless component that wraps a "count" query for the
+ * number of runners that follow a filter criteria.
+ *
+ * Example usage:
+ *
+ * Render the count of "online" runners in the instance in a
+ * <strong/> tag.
+ *
+ * ```vue
+ * <runner-count-stat
+ * #default="{ count }"
+ * :scope="INSTANCE_TYPE"
+ * :variables="{ status: 'ONLINE' }"
+ * >
+ * <strong>{{ count }}</strong>
+ * </runner-count-stat>
+ * ```
+ *
+ * Use `:skip="true"` to prevent data from being fetched and
+ * even rendered.
+ */
+export default {
+ name: 'RunnerCount',
+ props: {
+ scope: {
+ type: String,
+ required: true,
+ validator: (val) => [INSTANCE_TYPE, GROUP_TYPE].includes(val),
+ },
+ variables: {
+ type: Object,
+ required: false,
+ default: () => {},
+ },
+ skip: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ data() {
+ return { count: null };
+ },
+ apollo: {
+ count: {
+ query() {
+ if (this.scope === INSTANCE_TYPE) {
+ return allRunnersCountQuery;
+ } else if (this.scope === GROUP_TYPE) {
+ return groupRunnersCountQuery;
+ }
+ return null;
+ },
+ fetchPolicy: fetchPolicies.NETWORK_ONLY,
+ variables() {
+ return this.variables;
+ },
+ skip() {
+ if (this.skip) {
+ // Don't show data for skipped stats
+ this.count = null;
+ }
+ return this.skip;
+ },
+ update(data) {
+ if (this.scope === INSTANCE_TYPE) {
+ return data?.runners?.count;
+ } else if (this.scope === GROUP_TYPE) {
+ return data?.group?.runners?.count;
+ }
+ return null;
+ },
+ error(error) {
+ this.reportToSentry(error);
+ },
+ },
+ },
+ methods: {
+ reportToSentry(error) {
+ captureException({ error, component: this.$options.name });
+ },
+
+ // Component API
+ refetch() {
+ // Parent components can use this method to refresh the count
+ this.$apollo.queries.count.refetch();
+ },
+ },
+ render() {
+ return this.$scopedSlots.default({
+ count: this.count,
+ });
+ },
+};
+</script>
diff --git a/app/assets/javascripts/runner/components/stat/runner_stats.vue b/app/assets/javascripts/runner/components/stat/runner_stats.vue
index d3693ee593e..9e1ca9ba4ee 100644
--- a/app/assets/javascripts/runner/components/stat/runner_stats.vue
+++ b/app/assets/javascripts/runner/components/stat/runner_stats.vue
@@ -1,49 +1,47 @@
<script>
import { STATUS_ONLINE, STATUS_OFFLINE, STATUS_STALE } from '../../constants';
+import RunnerCount from './runner_count.vue';
import RunnerStatusStat from './runner_status_stat.vue';
export default {
components: {
+ RunnerCount,
RunnerStatusStat,
},
props: {
- onlineRunnersCount: {
- type: Number,
- required: false,
- default: null,
+ scope: {
+ type: String,
+ required: true,
},
- offlineRunnersCount: {
- type: Number,
+ variables: {
+ type: Object,
required: false,
- default: null,
+ default: () => {},
},
- staleRunnersCount: {
- type: Number,
- required: false,
- default: null,
+ },
+ methods: {
+ countVariables(vars) {
+ return { ...this.variables, ...vars };
+ },
+ statusCountSkip(status) {
+ // Show an empty result when we already filter by another status
+ return this.variables.status && this.variables.status !== status;
},
},
- STATUS_ONLINE,
- STATUS_OFFLINE,
- STATUS_STALE,
+ STATUS_LIST: [STATUS_ONLINE, STATUS_OFFLINE, STATUS_STALE],
};
</script>
<template>
<div class="gl-display-flex gl-py-6">
- <runner-status-stat
- class="gl-px-5"
- :status="$options.STATUS_ONLINE"
- :value="onlineRunnersCount"
- />
- <runner-status-stat
- class="gl-px-5"
- :status="$options.STATUS_OFFLINE"
- :value="offlineRunnersCount"
- />
- <runner-status-stat
- class="gl-px-5"
- :status="$options.STATUS_STALE"
- :value="staleRunnersCount"
- />
+ <runner-count
+ v-for="status in $options.STATUS_LIST"
+ #default="{ count }"
+ :key="status"
+ :scope="scope"
+ :variables="countVariables({ status })"
+ :skip="statusCountSkip(status)"
+ >
+ <runner-status-stat class="gl-px-5" :status="status" :value="count" />
+ </runner-count>
</div>
</template>
diff --git a/app/assets/javascripts/runner/constants.js b/app/assets/javascripts/runner/constants.js
index b9621c26b59..64541729701 100644
--- a/app/assets/javascripts/runner/constants.js
+++ b/app/assets/javascripts/runner/constants.js
@@ -81,6 +81,7 @@ export const I18N_LOCKED_RUNNER_DESCRIPTION = s__(
// Runner details
+export const I18N_DETAILS = s__('Runners|Details');
export const I18N_ASSIGNED_PROJECTS = s__('Runners|Assigned Projects (%{projectCount})');
export const I18N_NONE = __('None');
export const I18N_NO_JOBS_FOUND = s__('Runners|This runner has not run any jobs.');
diff --git a/app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql b/app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql
deleted file mode 100644
index 61bfe03bf6e..00000000000
--- a/app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql
+++ /dev/null
@@ -1,38 +0,0 @@
-#import "ee_else_ce/runner/graphql/list/list_item.fragment.graphql"
-#import "~/graphql_shared/fragments/page_info.fragment.graphql"
-
-query getRunners(
- $before: String
- $after: String
- $first: Int
- $last: Int
- $paused: Boolean
- $status: CiRunnerStatus
- $type: CiRunnerType
- $tagList: [String!]
- $search: String
- $sort: CiRunnerSort
-) {
- runners(
- before: $before
- after: $after
- first: $first
- last: $last
- paused: $paused
- status: $status
- type: $type
- tagList: $tagList
- search: $search
- sort: $sort
- ) {
- nodes {
- ...ListItem
- adminUrl
- editAdminUrl
- }
- pageInfo {
- __typename
- ...PageInfo
- }
- }
-}
diff --git a/app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql b/app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql
deleted file mode 100644
index 1dd258a3524..00000000000
--- a/app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql
+++ /dev/null
@@ -1,11 +0,0 @@
-query getRunnersCount(
- $paused: Boolean
- $status: CiRunnerStatus
- $type: CiRunnerType
- $tagList: [String!]
- $search: String
-) {
- runners(paused: $paused, status: $status, type: $type, tagList: $tagList, search: $search) {
- count
- }
-}
diff --git a/app/assets/javascripts/runner/graphql/list/all_runners.query.graphql b/app/assets/javascripts/runner/graphql/list/all_runners.query.graphql
new file mode 100644
index 00000000000..6bb896dda16
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/all_runners.query.graphql
@@ -0,0 +1,38 @@
+#import "ee_else_ce/runner/graphql/list/list_item.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+
+query getAllRunners(
+ $before: String
+ $after: String
+ $first: Int
+ $last: Int
+ $paused: Boolean
+ $status: CiRunnerStatus
+ $type: CiRunnerType
+ $tagList: [String!]
+ $search: String
+ $sort: CiRunnerSort
+) {
+ runners(
+ before: $before
+ after: $after
+ first: $first
+ last: $last
+ paused: $paused
+ status: $status
+ type: $type
+ tagList: $tagList
+ search: $search
+ sort: $sort
+ ) {
+ nodes {
+ ...ListItem
+ adminUrl
+ editAdminUrl
+ }
+ pageInfo {
+ __typename
+ ...PageInfo
+ }
+ }
+}
diff --git a/app/assets/javascripts/runner/graphql/list/all_runners_count.query.graphql b/app/assets/javascripts/runner/graphql/list/all_runners_count.query.graphql
new file mode 100644
index 00000000000..82591b88d3e
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/all_runners_count.query.graphql
@@ -0,0 +1,11 @@
+query getAllRunnersCount(
+ $paused: Boolean
+ $status: CiRunnerStatus
+ $type: CiRunnerType
+ $tagList: [String!]
+ $search: String
+) {
+ runners(paused: $paused, status: $status, type: $type, tagList: $tagList, search: $search) {
+ count
+ }
+}
diff --git a/app/assets/javascripts/runner/group_runner_show/group_runner_show_app.vue b/app/assets/javascripts/runner/group_runner_show/group_runner_show_app.vue
index c336e091fdf..75138b1bd81 100644
--- a/app/assets/javascripts/runner/group_runner_show/group_runner_show_app.vue
+++ b/app/assets/javascripts/runner/group_runner_show/group_runner_show_app.vue
@@ -1,16 +1,13 @@
<script>
-import { GlBadge, GlTab, GlTooltipDirective } from '@gitlab/ui';
import { createAlert, VARIANT_SUCCESS } from '~/flash';
import { TYPE_CI_RUNNER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { redirectTo } from '~/lib/utils/url_utility';
-import { formatJobCount } from '../utils';
import RunnerDeleteButton from '../components/runner_delete_button.vue';
import RunnerEditButton from '../components/runner_edit_button.vue';
import RunnerPauseButton from '../components/runner_pause_button.vue';
import RunnerHeader from '../components/runner_header.vue';
import RunnerDetails from '../components/runner_details.vue';
-import RunnerJobs from '../components/runner_jobs.vue';
import { I18N_FETCH_ERROR } from '../constants';
import runnerQuery from '../graphql/show/runner.query.graphql';
import { captureException } from '../sentry_utils';
@@ -19,17 +16,11 @@ import { saveAlertToLocalStorage } from '../local_storage_alert/save_alert_to_lo
export default {
name: 'GroupRunnerShowApp',
components: {
- GlBadge,
- GlTab,
RunnerDeleteButton,
RunnerEditButton,
RunnerPauseButton,
RunnerHeader,
RunnerDetails,
- RunnerJobs,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
},
props: {
runnerId: {
@@ -40,6 +31,11 @@ export default {
type: String,
required: true,
},
+ editGroupRunnerPath: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
data() {
return {
@@ -68,9 +64,6 @@ export default {
canDelete() {
return this.runner.userPermissions?.deleteRunner;
},
- jobCount() {
- return formatJobCount(this.runner?.jobCount);
- },
},
errorCaptured(error) {
this.reportToSentry(error);
@@ -90,25 +83,12 @@ export default {
<div>
<runner-header v-if="runner" :runner="runner">
<template #actions>
- <runner-edit-button v-if="canUpdate && runner.editAdminUrl" :href="runner.editAdminUrl" />
+ <runner-edit-button v-if="canUpdate && editGroupRunnerPath" :href="editGroupRunnerPath" />
<runner-pause-button v-if="canUpdate" :runner="runner" />
<runner-delete-button v-if="canDelete" :runner="runner" @deleted="onDeleted" />
</template>
</runner-header>
- <runner-details :runner="runner">
- <template #jobs-tab>
- <gl-tab>
- <template #title>
- {{ s__('Runners|Jobs') }}
- <gl-badge v-if="jobCount" data-testid="job-count-badge" class="gl-ml-1" size="sm">
- {{ jobCount }}
- </gl-badge>
- </template>
-
- <runner-jobs v-if="runner" :runner="runner" />
- </gl-tab>
- </template>
- </runner-details>
+ <runner-details v-if="runner" :runner="runner" />
</div>
</template>
diff --git a/app/assets/javascripts/runner/group_runner_show/index.js b/app/assets/javascripts/runner/group_runner_show/index.js
index d1b87c8e427..62a0dab9211 100644
--- a/app/assets/javascripts/runner/group_runner_show/index.js
+++ b/app/assets/javascripts/runner/group_runner_show/index.js
@@ -1,21 +1,18 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
-import { showAlertFromLocalStorage } from '../local_storage_alert/show_alert_from_local_storage';
import GroupRunnerShowApp from './group_runner_show_app.vue';
Vue.use(VueApollo);
-export const initAdminRunnerShow = (selector = '#js-group-runner-show') => {
- showAlertFromLocalStorage();
-
+export const initGroupRunnerShow = (selector = '#js-group-runner-show') => {
const el = document.querySelector(selector);
if (!el) {
return null;
}
- const { runnerId, runnersPath } = el.dataset;
+ const { runnerId, runnersPath, editGroupRunnerPath } = el.dataset;
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
@@ -29,6 +26,7 @@ export const initAdminRunnerShow = (selector = '#js-group-runner-show') => {
props: {
runnerId,
runnersPath,
+ editGroupRunnerPath,
},
});
},
diff --git a/app/assets/javascripts/runner/group_runners/group_runners_app.vue b/app/assets/javascripts/runner/group_runners/group_runners_app.vue
index 641b3a8f560..e8446dbe345 100644
--- a/app/assets/javascripts/runner/group_runners/group_runners_app.vue
+++ b/app/assets/javascripts/runner/group_runners/group_runners_app.vue
@@ -1,8 +1,7 @@
<script>
-import { GlBadge, GlLink } from '@gitlab/ui';
+import { GlLink } from '@gitlab/ui';
import { createAlert } from '~/flash';
import { updateHistory } from '~/lib/utils/url_utility';
-import { formatNumber } from '~/locale';
import { fetchPolicies } from '~/lib/graphql';
import RegistrationDropdown from '../components/registration/registration_dropdown.vue';
@@ -21,13 +20,9 @@ import {
GROUP_FILTERED_SEARCH_NAMESPACE,
GROUP_TYPE,
PROJECT_TYPE,
- STATUS_ONLINE,
- STATUS_OFFLINE,
- STATUS_STALE,
I18N_FETCH_ERROR,
} from '../constants';
import groupRunnersQuery from '../graphql/list/group_runners.query.graphql';
-import groupRunnersCountQuery from '../graphql/list/group_runners_count.query.graphql';
import {
fromUrlQueryToSearch,
fromSearchToUrl,
@@ -36,54 +31,9 @@ import {
} from '../runner_search_utils';
import { captureException } from '../sentry_utils';
-const countSmartQuery = () => ({
- query: groupRunnersCountQuery,
- fetchPolicy: fetchPolicies.NETWORK_ONLY,
- update(data) {
- return data?.group?.runners?.count;
- },
- error(error) {
- this.reportToSentry(error);
- },
-});
-
-const tabCountSmartQuery = ({ type }) => {
- return {
- ...countSmartQuery(),
- variables() {
- return {
- ...this.countVariables,
- type,
- };
- },
- };
-};
-
-const statusCountSmartQuery = ({ status, name }) => {
- return {
- ...countSmartQuery(),
- skip() {
- // skip if filtering by status and not using _this_ status as filter
- if (this.countVariables.status && this.countVariables.status !== status) {
- // reset count for given status
- this[name] = null;
- return true;
- }
- return false;
- },
- variables() {
- return {
- ...this.countVariables,
- status,
- };
- },
- };
-};
-
export default {
name: 'GroupRunnersApp',
components: {
- GlBadge,
GlLink,
RegistrationDropdown,
RunnerFilteredSearchBar,
@@ -153,28 +103,6 @@ export default {
this.reportToSentry(error);
},
},
-
- // Tabs counts
- allRunnersCount: {
- ...tabCountSmartQuery({ type: null }),
- },
- groupRunnersCount: {
- ...tabCountSmartQuery({ type: GROUP_TYPE }),
- },
- projectRunnersCount: {
- ...tabCountSmartQuery({ type: PROJECT_TYPE }),
- },
-
- // Runner status summary
- onlineRunnersTotal: {
- ...statusCountSmartQuery({ status: STATUS_ONLINE, name: 'onlineRunnersTotal' }),
- },
- offlineRunnersTotal: {
- ...statusCountSmartQuery({ status: STATUS_OFFLINE, name: 'offlineRunnersTotal' }),
- },
- staleRunnersTotal: {
- ...statusCountSmartQuery({ status: STATUS_STALE, name: 'staleRunnersTotal' }),
- },
},
computed: {
variables() {
@@ -221,41 +149,16 @@ export default {
this.reportToSentry(error);
},
methods: {
- tabCount({ runnerType }) {
- let count;
- switch (runnerType) {
- case null:
- count = this.allRunnersCount;
- break;
- case GROUP_TYPE:
- count = this.groupRunnersCount;
- break;
- case PROJECT_TYPE:
- count = this.projectRunnersCount;
- break;
- default:
- return null;
- }
- if (typeof count === 'number') {
- return formatNumber(count);
- }
- return null;
- },
webUrl(runner) {
return this.runners.urlsById[runner.id]?.web;
},
editUrl(runner) {
return this.runners.urlsById[runner.id]?.edit;
},
- refetchFilteredCounts() {
- this.$apollo.queries.allRunnersCount.refetch();
- this.$apollo.queries.groupRunnersCount.refetch();
- this.$apollo.queries.projectRunnersCount.refetch();
- },
onToggledPaused() {
- // When a runner is Paused, the tab count can
+ // When a runner becomes Paused, the tab count can
// become stale, refetch outdated counts.
- this.refetchFilteredCounts();
+ this.$refs['runner-type-tabs'].refetch();
},
onDeleted({ message }) {
this.$root.$toast?.show(message);
@@ -273,18 +176,15 @@ export default {
<div>
<div class="gl-display-flex gl-align-items-center">
<runner-type-tabs
+ ref="runner-type-tabs"
v-model="search"
+ :count-scope="$options.GROUP_TYPE"
+ :count-variables="countVariables"
:runner-types="$options.TABS_RUNNER_TYPES"
+ class="gl-w-full"
content-class="gl-display-none"
nav-class="gl-border-none!"
- >
- <template #title="{ tab }">
- {{ tab.title }}
- <gl-badge v-if="tabCount(tab)" class="gl-ml-1" size="sm">
- {{ tabCount(tab) }}
- </gl-badge>
- </template>
- </runner-type-tabs>
+ />
<registration-dropdown
class="gl-ml-auto"
@@ -300,11 +200,7 @@ export default {
:namespace="filteredSearchNamespace"
/>
- <runner-stats
- :online-runners-count="onlineRunnersTotal"
- :offline-runners-count="offlineRunnersTotal"
- :stale-runners-count="staleRunnersTotal"
- />
+ <runner-stats :scope="$options.GROUP_TYPE" :variables="countVariables" />
<runner-list-empty-state
v-if="noRunnersFound"
diff --git a/app/assets/javascripts/security_configuration/components/app.vue b/app/assets/javascripts/security_configuration/components/app.vue
index 34910781247..ecde9235e93 100644
--- a/app/assets/javascripts/security_configuration/components/app.vue
+++ b/app/assets/javascripts/security_configuration/components/app.vue
@@ -206,6 +206,7 @@ export default {
<template #features>
<feature-card
v-for="feature in augmentedSecurityFeatures"
+ :id="feature.anchor"
:key="feature.type"
data-testid="security-testing-card"
:feature="feature"
@@ -254,7 +255,6 @@ export default {
</section-layout>
</gl-tab>
<gl-tab
- v-if="securityTrainingEnabled"
data-testid="vulnerability-management-tab"
:title="$options.i18n.vulnerabilityManagement"
query-param-value="vulnerability-management"
@@ -271,7 +271,7 @@ export default {
</p>
</template>
<template #features>
- <training-provider-list />
+ <training-provider-list :security-training-enabled="securityTrainingEnabled" />
</template>
</section-layout>
</gl-tab>
diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js
index e4d2bd08f50..6efaf08a178 100644
--- a/app/assets/javascripts/security_configuration/components/constants.js
+++ b/app/assets/javascripts/security_configuration/components/constants.js
@@ -194,6 +194,7 @@ export const securityFeatures = [
helpPath: DAST_HELP_PATH,
configurationHelpPath: DAST_CONFIG_HELP_PATH,
type: REPORT_TYPE_DAST,
+ anchor: 'dast',
},
{
name: DEPENDENCY_SCANNING_NAME,
@@ -201,6 +202,7 @@ export const securityFeatures = [
helpPath: DEPENDENCY_SCANNING_HELP_PATH,
configurationHelpPath: DEPENDENCY_SCANNING_CONFIG_HELP_PATH,
type: REPORT_TYPE_DEPENDENCY_SCANNING,
+ anchor: 'dependency-scanning',
},
{
name: CONTAINER_SCANNING_NAME,
diff --git a/app/assets/javascripts/security_configuration/components/training_provider_list.vue b/app/assets/javascripts/security_configuration/components/training_provider_list.vue
index ef50d085ae8..0bcb2bb6720 100644
--- a/app/assets/javascripts/security_configuration/components/training_provider_list.vue
+++ b/app/assets/javascripts/security_configuration/components/training_provider_list.vue
@@ -39,6 +39,7 @@ const i18n = {
primaryTrainingDescription: s__(
'SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled.',
),
+ unavailableText: s__('SecurityConfiguration|Available with Ultimate'),
};
export default {
@@ -73,6 +74,13 @@ export default {
},
},
},
+ props: {
+ securityTrainingEnabled: {
+ type: Boolean,
+ required: true,
+ },
+ },
+
data() {
return {
errorMessage: '',
@@ -232,12 +240,13 @@ export default {
</div>
<ul v-else class="gl-list-style-none gl-m-0 gl-p-0">
<li v-for="provider in securityTrainingProviders" :key="provider.id" class="gl-mb-6">
- <gl-card>
+ <gl-card :body-class="{ 'gl-bg-gray-10': !securityTrainingEnabled }">
<div class="gl-display-flex">
<gl-toggle
:value="provider.isEnabled"
:label="__('Training mode')"
label-position="hidden"
+ :disabled="!securityTrainingEnabled"
@change="toggleProvider(provider)"
/>
<div v-if="$options.TEMP_PROVIDER_LOGOS[provider.name]" class="gl-ml-4">
@@ -249,7 +258,18 @@ export default {
></div>
</div>
<div class="gl-ml-3">
- <h3 class="gl-font-lg gl-m-0 gl-mb-2">{{ provider.name }}</h3>
+ <div class="gl-display-flex gl-justify-content-space-between">
+ <h3 class="gl-font-lg gl-m-0 gl-mb-2">
+ {{ provider.name }}
+ </h3>
+ <span
+ v-if="!securityTrainingEnabled"
+ data-testid="unavailable-text"
+ class="gl-text-gray-600"
+ >
+ {{ $options.i18n.unavailableText }}
+ </span>
+ </div>
<p>
{{ provider.description }}
<gl-link
@@ -263,7 +283,7 @@ export default {
</p>
<gl-form-radio
:checked="primaryProviderId"
- :disabled="!provider.isEnabled"
+ :disabled="!securityTrainingEnabled || !provider.isEnabled"
:value="provider.id"
@change="setPrimaryProvider(provider)"
>
diff --git a/app/assets/javascripts/security_configuration/graphql/security_training_vulnerability.query.graphql b/app/assets/javascripts/security_configuration/graphql/security_training_vulnerability.query.graphql
index 891e0dda312..9fdacb4ee10 100644
--- a/app/assets/javascripts/security_configuration/graphql/security_training_vulnerability.query.graphql
+++ b/app/assets/javascripts/security_configuration/graphql/security_training_vulnerability.query.graphql
@@ -1,7 +1,11 @@
-query getSecurityTrainingUrls($projectFullPath: ID!, $identifierExternalIds: [String!]!) {
+query getSecurityTrainingUrls(
+ $projectFullPath: ID!
+ $identifierExternalIds: [String!]!
+ $filename: String
+) {
project(fullPath: $projectFullPath) {
id
- securityTrainingUrls(identifierExternalIds: $identifierExternalIds) {
+ securityTrainingUrls(identifierExternalIds: $identifierExternalIds, filename: $filename) {
name
status
url
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 2f31d8ef3fb..b14e816a674 100644
--- a/app/assets/javascripts/self_monitor/components/self_monitor_form.vue
+++ b/app/assets/javascripts/self_monitor/components/self_monitor_form.vue
@@ -136,7 +136,9 @@ export default {
<template>
<section class="settings no-animate js-self-monitoring-settings">
<div class="settings-header">
- <h4 class="js-section-header">
+ <h4
+ class="js-section-header settings-title js-settings-toggle js-settings-toggle-trigger-only"
+ >
{{ s__('SelfMonitoring|Self monitoring') }}
</h4>
<gl-button class="js-settings-toggle">{{ __('Expand') }}</gl-button>
diff --git a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
index eb0931c6fe2..579316f481c 100644
--- a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
+++ b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
@@ -1,10 +1,13 @@
<script>
import {
+ GlButton,
GlToast,
GlModal,
GlTooltipDirective,
GlIcon,
GlFormCheckbox,
+ GlFormInput,
+ GlFormInputGroup,
GlDropdown,
GlDropdownItem,
GlSafeHtmlDirective,
@@ -38,9 +41,12 @@ const statusTimeRanges = [
export default {
components: {
+ GlButton,
GlIcon,
GlModal,
GlFormCheckbox,
+ GlFormInput,
+ GlFormInputGroup,
GlDropdown,
GlDropdownItem,
EmojiPicker: () => import('~/emoji/components/picker.vue'),
@@ -215,97 +221,80 @@ export default {
@primary="setStatus"
@secondary="removeStatus"
>
- <div>
- <input
- v-model="emoji"
- class="js-status-emoji-field"
- type="hidden"
- name="user[status][emoji]"
+ <input v-model="emoji" class="js-status-emoji-field" type="hidden" name="user[status][emoji]" />
+ <gl-form-input-group class="gl-mb-5">
+ <gl-form-input
+ ref="statusMessageField"
+ v-model="message"
+ :placeholder="s__(`SetStatusModal|What's your status?`)"
+ class="js-status-message-field"
+ name="user[status][message]"
+ @keyup="setDefaultEmoji"
+ @keyup.enter.prevent
/>
- <div ref="userStatusForm" class="form-group position-relative m-0">
- <div class="input-group gl-mb-5">
- <span class="input-group-prepend">
- <emoji-picker
- dropdown-class="gl-h-full"
- toggle-class="btn emoji-menu-toggle-button gl-px-4! gl-rounded-top-right-none! gl-rounded-bottom-right-none!"
- boundary="viewport"
- :right="false"
- @click="setEmoji"
+ <template #prepend>
+ <emoji-picker
+ dropdown-class="gl-h-full"
+ toggle-class="btn emoji-menu-toggle-button gl-px-4! gl-rounded-top-right-none! gl-rounded-bottom-right-none!"
+ boundary="viewport"
+ :right="false"
+ @click="setEmoji"
+ >
+ <template #button-content>
+ <span v-safe-html:[$options.safeHtmlConfig]="emojiTag"></span>
+ <span
+ v-show="noEmoji"
+ class="js-no-emoji-placeholder no-emoji-placeholder position-relative"
>
- <template #button-content>
- <span v-safe-html:[$options.safeHtmlConfig]="emojiTag"></span>
- <span
- v-show="noEmoji"
- class="js-no-emoji-placeholder no-emoji-placeholder position-relative"
- >
- <gl-icon name="slight-smile" class="award-control-icon-neutral" />
- <gl-icon name="smiley" class="award-control-icon-positive" />
- <gl-icon name="smile" class="award-control-icon-super-positive" />
- </span>
- </template>
- </emoji-picker>
- </span>
- <input
- ref="statusMessageField"
- v-model="message"
- :placeholder="s__('SetStatusModal|What\'s your status?')"
- type="text"
- class="form-control form-control input-lg js-status-message-field"
- name="user[status][message]"
- @keyup="setDefaultEmoji"
- @keyup.enter.prevent
- />
- <span v-show="isDirty" class="input-group-append">
- <button
- v-gl-tooltip.bottom
- :title="s__('SetStatusModal|Clear status')"
- :aria-label="s__('SetStatusModal|Clear status')"
- name="button"
- type="button"
- class="js-clear-user-status-button clear-user-status btn"
- @click="clearStatusInputs()"
- >
- <gl-icon name="close" />
- </button>
- </span>
- </div>
- <div class="form-group">
- <div class="gl-display-flex">
- <gl-form-checkbox
- v-model="availability"
- data-testid="user-availability-checkbox"
- class="gl-mb-0"
- >
- <span class="gl-font-weight-bold">{{ s__('SetStatusModal|Busy') }}</span>
- </gl-form-checkbox>
- </div>
- <div class="gl-display-flex">
- <span class="gl-text-gray-600 gl-ml-5">
- {{ s__('SetStatusModal|An indicator appears next to your name and avatar') }}
+ <gl-icon name="slight-smile" class="award-control-icon-neutral" />
+ <gl-icon name="smiley" class="award-control-icon-positive" />
+ <gl-icon name="smile" class="award-control-icon-super-positive" />
</span>
- </div>
- </div>
- <div class="form-group">
- <div class="gl-display-flex gl-align-items-baseline">
- <span class="gl-mr-3">{{ s__('SetStatusModal|Clear status after') }}</span>
- <gl-dropdown :text="clearStatusAfter" data-testid="clear-status-at-dropdown">
- <gl-dropdown-item
- v-for="after in $options.statusTimeRanges"
- :key="after.name"
- :data-testid="after.name"
- @click="setClearStatusAfter(after.label)"
- >{{ after.label }}</gl-dropdown-item
- >
- </gl-dropdown>
- </div>
- <div
- v-if="currentClearStatusAfter.length"
- class="gl-mt-3 gl-text-gray-400 gl-font-sm"
- data-testid="clear-status-at-message"
+ </template>
+ </emoji-picker>
+ </template>
+ <template v-if="isDirty" #append>
+ <gl-button
+ v-gl-tooltip.bottom
+ :title="s__('SetStatusModal|Clear status')"
+ :aria-label="s__('SetStatusModal|Clear status')"
+ icon="close"
+ class="js-clear-user-status-button"
+ @click="clearStatusInputs"
+ />
+ </template>
+ </gl-form-input-group>
+
+ <gl-form-checkbox
+ v-model="availability"
+ class="gl-mb-5"
+ data-testid="user-availability-checkbox"
+ >
+ {{ s__('SetStatusModal|Busy') }}
+ <template #help>
+ {{ s__('SetStatusModal|An indicator appears next to your name and avatar') }}
+ </template>
+ </gl-form-checkbox>
+
+ <div class="form-group">
+ <div class="gl-display-flex gl-align-items-baseline">
+ <span class="gl-mr-3">{{ s__('SetStatusModal|Clear status after') }}</span>
+ <gl-dropdown :text="clearStatusAfter" data-testid="clear-status-at-dropdown">
+ <gl-dropdown-item
+ v-for="after in $options.statusTimeRanges"
+ :key="after.name"
+ :data-testid="after.name"
+ @click="setClearStatusAfter(after.label)"
+ >{{ after.label }}</gl-dropdown-item
>
- {{ clearStatusAfterMessage }}
- </div>
- </div>
+ </gl-dropdown>
+ </div>
+ <div
+ v-if="currentClearStatusAfter.length"
+ class="gl-mt-3 gl-text-gray-400 gl-font-sm"
+ data-testid="clear-status-at-message"
+ >
+ {{ clearStatusAfterMessage }}
</div>
</div>
</gl-modal>
diff --git a/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue b/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue
index c20dd3b677d..d17c8a123d5 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue
@@ -72,9 +72,12 @@ export default {
},
},
computed: {
+ isMergeRequest() {
+ return this.issuableType === IssuableType.MergeRequest;
+ },
cannotMerge() {
const canMerge = this.user.mergeRequestInteraction?.canMerge || this.user.can_merge;
- return this.issuableType === IssuableType.MergeRequest && !canMerge;
+ return this.isMergeRequest && !canMerge;
},
tooltipTitle() {
const { name = '', availability = '' } = this.user;
@@ -86,6 +89,10 @@ export default {
});
},
tooltipOption() {
+ if (this.isMergeRequest) {
+ return null;
+ }
+
return {
container: 'body',
placement: this.tooltipPlacement,
@@ -96,6 +103,10 @@ export default {
return this.user.web_url || this.user.webUrl;
},
assigneeId() {
+ if (this.isMergeRequest) {
+ return null;
+ }
+
return isGid(this.user.id) ? getIdFromGraphQLId(this.user.id) : this.user.id;
},
},
@@ -105,6 +116,7 @@ export default {
<template>
<!-- must be `d-inline-block` or parent flex-basis causes width issues -->
<gl-link
+ v-gl-tooltip="tooltipOption"
:href="assigneeUrl"
:title="tooltipTitle"
:data-user-id="assigneeId"
diff --git a/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue b/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue
index 699d1bebea1..5f1808ff4da 100644
--- a/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue
+++ b/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue
@@ -1,10 +1,11 @@
<script>
-import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { GlIcon, GlTooltipDirective, GlOutsideDirective as Outside } from '@gitlab/ui';
import { mapGetters, mapActions } from 'vuex';
import { __, sprintf } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import createFlash from '~/flash';
import eventHub from '~/sidebar/event_hub';
+import toast from '~/vue_shared/plugins/global_toast';
import editForm from './edit_form.vue';
export default {
@@ -27,6 +28,7 @@ export default {
},
directives: {
GlTooltip: GlTooltipDirective,
+ Outside,
},
mixins: [glFeatureFlagMixin()],
inject: ['fullPath'],
@@ -84,6 +86,11 @@ export default {
locked: !this.isLocked,
fullPath: this.fullPath,
})
+ .then(() => {
+ if (this.isMergeRequest) {
+ toast(this.isLocked ? __('Merge request locked.') : __('Merge request unlocked.'));
+ }
+ })
.catch(() => {
const flashMessage = __(
'Something went wrong trying to change the locked state of this %{issuableDisplayName}',
@@ -96,6 +103,9 @@ export default {
this.isLoading = false;
});
},
+ closeForm() {
+ this.isLockDialogOpen = false;
+ },
},
};
</script>
@@ -142,6 +152,7 @@ export default {
<div class="value sidebar-item-value hide-collapsed">
<edit-form
v-if="isLockDialogOpen"
+ v-outside="closeForm"
data-testid="edit-form"
:is-locked="isLocked"
:issuable-display-name="issuableDisplayName"
diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
index 36a08482e69..c9b0a4ae2b3 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
@@ -68,10 +68,9 @@ export default {
<template>
<!-- must be `d-inline-block` or parent flex-basis causes width issues -->
<gl-link
+ v-gl-tooltip="tooltipOption"
:href="reviewerUrl"
:title="tooltipTitle"
- :data-user-id="user.id"
- data-placement="left"
class="gl-display-inline-block js-user-link"
>
<!-- use d-flex so that slot can be appropriately styled -->
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 1bafa845665..7662d645dd9 100644
--- a/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue
+++ b/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue
@@ -6,6 +6,7 @@ import { isLoggedIn } from '~/lib/utils/common_utils';
import { __, sprintf } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import toast from '~/vue_shared/plugins/global_toast';
import { subscribedQueries, Tracking } from '~/sidebar/constants';
const ICON_ON = 'notifications';
@@ -140,6 +141,10 @@ export default {
message: errors[0],
});
}
+
+ if (this.isMergeRequest) {
+ toast(subscribed ? __('Notifications turned on.') : __('Notifications turned off.'));
+ }
},
)
.catch(() => {
diff --git a/app/assets/javascripts/sidebar/graphql.js b/app/assets/javascripts/sidebar/graphql.js
index ff3fb4aae6b..127e3a3c610 100644
--- a/app/assets/javascripts/sidebar/graphql.js
+++ b/app/assets/javascripts/sidebar/graphql.js
@@ -2,7 +2,7 @@ import produce from 'immer';
import VueApollo from 'vue-apollo';
import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql';
import createDefaultClient from '~/lib/graphql';
-import { temporaryConfig } from '~/work_items/graphql/provider';
+import { temporaryConfig, resolvers as workItemResolvers } from '~/work_items/graphql/provider';
const resolvers = {
Mutation: {
@@ -13,6 +13,7 @@ const resolvers = {
});
cache.writeQuery({ query: getIssueStateQuery, data });
},
+ ...workItemResolvers.Mutation,
},
};
diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js
index bb40ac14438..3f82fe5ce87 100644
--- a/app/assets/javascripts/sidebar/mount_sidebar.js
+++ b/app/assets/javascripts/sidebar/mount_sidebar.js
@@ -73,12 +73,14 @@ function mountSidebarToDoWidget() {
props: {
fullPath: projectPath,
issuableId:
- isInIssuePage() || isInDesignPage()
+ isInIssuePage() || isInIncidentPage() || isInDesignPage()
? convertToGraphQLId(TYPE_ISSUE, id)
: convertToGraphQLId(TYPE_MERGE_REQUEST, id),
issuableIid: iid,
issuableType:
- isInIssuePage() || isInDesignPage() ? IssuableType.Issue : IssuableType.MergeRequest,
+ isInIssuePage() || isInIncidentPage() || isInDesignPage()
+ ? IssuableType.Issue
+ : IssuableType.MergeRequest,
},
}),
});
diff --git a/app/assets/javascripts/sidebar/services/sidebar_service.js b/app/assets/javascripts/sidebar/services/sidebar_service.js
index ea170203576..05268a5c89c 100644
--- a/app/assets/javascripts/sidebar/services/sidebar_service.js
+++ b/app/assets/javascripts/sidebar/services/sidebar_service.js
@@ -33,6 +33,7 @@ export default class SidebarService {
SidebarService.singleton = this;
}
+ // eslint-disable-next-line no-constructor-return
return SidebarService.singleton;
}
diff --git a/app/assets/javascripts/sidebar/sidebar_mediator.js b/app/assets/javascripts/sidebar/sidebar_mediator.js
index 7df901577b8..4df00903ab6 100644
--- a/app/assets/javascripts/sidebar/sidebar_mediator.js
+++ b/app/assets/javascripts/sidebar/sidebar_mediator.js
@@ -11,6 +11,8 @@ export default class SidebarMediator {
if (!SidebarMediator.singleton) {
this.initSingleton(options);
}
+
+ // eslint-disable-next-line no-constructor-return
return SidebarMediator.singleton;
}
diff --git a/app/assets/javascripts/sidebar/stores/sidebar_store.js b/app/assets/javascripts/sidebar/stores/sidebar_store.js
index ca85ee7fd94..971e2a15c68 100644
--- a/app/assets/javascripts/sidebar/stores/sidebar_store.js
+++ b/app/assets/javascripts/sidebar/stores/sidebar_store.js
@@ -4,6 +4,7 @@ export default class SidebarStore {
this.initSingleton(options);
}
+ // eslint-disable-next-line no-constructor-return
return SidebarStore.singleton;
}
diff --git a/app/assets/javascripts/surveys/components/satisfaction_rate.vue b/app/assets/javascripts/surveys/components/satisfaction_rate.vue
new file mode 100644
index 00000000000..d83de56169b
--- /dev/null
+++ b/app/assets/javascripts/surveys/components/satisfaction_rate.vue
@@ -0,0 +1,71 @@
+<script>
+import { GlButton, GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+ name: 'SatisfactionRate',
+ components: {
+ GlButton,
+ GlIcon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ i18n: {
+ unhappy: s__('Surveys|Unhappy'),
+ delighted: s__('Surveys|Delighted'),
+ },
+ grades: [
+ {
+ title: s__('Surveys|Unhappy'),
+ icon: 'face-unhappy',
+ value: 1,
+ },
+ {
+ title: s__('Surveys|Sad'),
+ icon: 'slight-frown',
+ value: 2,
+ },
+ {
+ title: s__('Surveys|Neutral'),
+ icon: 'face-neutral',
+ value: 3,
+ },
+ {
+ title: s__('Surveys|Happy'),
+ icon: 'slight-smile',
+ value: 4,
+ },
+ {
+ title: s__('Surveys|Delighted'),
+ icon: 'smiley',
+ value: 5,
+ },
+ ],
+};
+</script>
+
+<template>
+ <div>
+ <ul class="gl-list-style-none gl-display-flex gl-p-0 gl-m-0 gl-justify-content-space-between">
+ <li v-for="grade in $options.grades" :key="grade.value">
+ <gl-button
+ v-gl-tooltip="grade.title"
+ class="gl-p-2!"
+ variant="default"
+ category="tertiary"
+ :aria-label="grade.title"
+ @click="$emit('rate', grade.value)"
+ >
+ <gl-icon class="gl-vertical-align-top" :name="grade.icon" :size="24" />
+ </gl-button>
+ </li>
+ </ul>
+ <div
+ class="gl-display-flex gl-justify-content-space-between gl-pt-3 gl-text-gray-500 gl-font-sm"
+ >
+ <div>{{ $options.i18n.unhappy }}</div>
+ <div>{{ $options.i18n.delighted }}</div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/surveys/merge_request_experience/app.js b/app/assets/javascripts/surveys/merge_request_experience/app.js
new file mode 100644
index 00000000000..ea5d8aef3c5
--- /dev/null
+++ b/app/assets/javascripts/surveys/merge_request_experience/app.js
@@ -0,0 +1,52 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import MergeRequestExperienceSurveyApp from '~/surveys/merge_request_experience/app.vue';
+import createDefaultClient from '~/lib/graphql';
+import Translate from '~/vue_shared/translate';
+
+Vue.use(Translate);
+Vue.use(VueApollo);
+
+export const startMrSurveyApp = () => {
+ let channel = null;
+
+ const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(),
+ });
+
+ const app = new Vue({
+ apolloProvider,
+ data() {
+ return {
+ hidden: false,
+ };
+ },
+ render(h) {
+ if (this.hidden) return null;
+ return h(MergeRequestExperienceSurveyApp, {
+ on: {
+ close: () => {
+ channel?.postMessage('close');
+ app.hidden = true;
+ },
+ rate: () => {
+ channel?.postMessage('close');
+ },
+ },
+ });
+ },
+ });
+
+ app.$mount('#js-mr-experience-survey');
+
+ if (window.BroadcastChannel) {
+ channel = new BroadcastChannel('mr_survey');
+ channel.addEventListener('message', ({ data }) => {
+ if (data === 'close') {
+ app.hidden = true;
+ channel.close();
+ channel = null;
+ }
+ });
+ }
+};
diff --git a/app/assets/javascripts/surveys/merge_request_experience/app.vue b/app/assets/javascripts/surveys/merge_request_experience/app.vue
new file mode 100644
index 00000000000..85eed6ae82a
--- /dev/null
+++ b/app/assets/javascripts/surveys/merge_request_experience/app.vue
@@ -0,0 +1,169 @@
+<script>
+import { GlButton, GlSprintf, GlSafeHtmlDirective, GlTooltipDirective } from '@gitlab/ui';
+import gitlabLogo from '@gitlab/svgs/dist/illustrations/gitlab_logo.svg';
+import { s__, __ } from '~/locale';
+import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
+import SatisfactionRate from '~/surveys/components/satisfaction_rate.vue';
+import Tracking from '~/tracking';
+
+const steps = [
+ {
+ label: 'overall',
+ question: s__('MrSurvey|Overall, how satisfied are you with merge requests?'),
+ },
+ {
+ label: 'performance',
+ question: s__(
+ 'MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?',
+ ),
+ },
+];
+
+export default {
+ name: 'MergeRequestExperienceSurveyApp',
+ components: {
+ UserCalloutDismisser,
+ GlSprintf,
+ GlButton,
+ SatisfactionRate,
+ },
+ directives: {
+ safeHtml: GlSafeHtmlDirective,
+ tooltip: GlTooltipDirective,
+ },
+ mixins: [Tracking.mixin()],
+ i18n: {
+ survey: s__('MrSurvey|Merge request experience survey'),
+ close: __('Close'),
+ legal: s__(
+ 'MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}.',
+ ),
+ thanks: s__('MrSurvey|Thank you for your feedback!'),
+ },
+ gitlabLogo,
+ data() {
+ return {
+ visible: false,
+ stepIndex: 0,
+ };
+ },
+ computed: {
+ step() {
+ return steps[this.stepIndex];
+ },
+ },
+ mounted() {
+ document.addEventListener('keyup', this.handleKeyup);
+ },
+ destroyed() {
+ document.removeEventListener('keyup', this.handleKeyup);
+ },
+ methods: {
+ onQueryLoaded({ shouldShowCallout }) {
+ this.visible = shouldShowCallout;
+ if (!this.visible) this.$emit('close');
+ },
+ onRate(event) {
+ this.$emit('rate');
+ this.track('survey:mr_experience', {
+ label: this.step.label,
+ value: event,
+ });
+ this.stepIndex += 1;
+ if (!this.step) {
+ setTimeout(() => {
+ this.$emit('close');
+ }, 5000);
+ }
+ },
+ handleKeyup(e) {
+ if (e.key !== 'Escape') return;
+ this.$emit('close');
+ this.$refs.dismisser?.dismiss();
+ },
+ },
+};
+</script>
+
+<template>
+ <user-callout-dismisser
+ ref="dismisser"
+ feature-name="mr_experience_survey"
+ @queryResult.once="onQueryLoaded"
+ >
+ <template #default="{ dismiss }">
+ <aside
+ class="mr-experience-survey-wrapper gl-fixed gl-bottom-0 gl-right-0 gl-p-5"
+ :aria-label="$options.i18n.survey"
+ >
+ <transition name="survey-slide-up">
+ <div
+ v-if="visible"
+ class="mr-experience-survey-body gl-relative gl-display-flex gl-flex-direction-column gl-bg-white gl-p-5 gl-border gl-rounded-base"
+ >
+ <gl-button
+ v-tooltip="$options.i18n.close"
+ :aria-label="$options.i18n.close"
+ variant="default"
+ category="tertiary"
+ class="gl-top-4 gl-right-3 gl-absolute"
+ icon="close"
+ @click="
+ dismiss();
+ $emit('close');
+ "
+ />
+ <div
+ v-if="stepIndex === 0"
+ class="mr-experience-survey-legal gl-border-t gl-mt-5 gl-pt-3 gl-text-gray-500 gl-font-sm"
+ role="note"
+ >
+ <p class="gl-m-0">
+ <gl-sprintf :message="$options.i18n.legal">
+ <template #link="{ content }">
+ <a
+ class="gl-text-decoration-underline gl-text-gray-500"
+ href="https://about.gitlab.com/privacy/"
+ target="_blank"
+ rel="noreferrer nofollow"
+ v-text="content"
+ ></a>
+ </template>
+ </gl-sprintf>
+ </p>
+ </div>
+ <div class="gl-relative">
+ <div class="gl-absolute">
+ <div
+ v-safe-html="$options.gitlabLogo"
+ aria-hidden="true"
+ class="mr-experience-survey-logo"
+ ></div>
+ </div>
+ </div>
+ <section v-if="step">
+ <p id="mr_survey_question" ref="question" class="gl-m-0 gl-px-7">
+ <gl-sprintf :message="step.question">
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ </gl-sprintf>
+ </p>
+ <satisfaction-rate
+ aria-labelledby="mr_survey_question"
+ class="gl-mt-5"
+ @rate="
+ dismiss();
+ onRate($event);
+ "
+ />
+ </section>
+ <section v-else class="gl-px-7">
+ {{ $options.i18n.thanks }}
+ </section>
+ </div>
+ </transition>
+ </aside>
+ </template>
+ </user-callout-dismisser>
+</template>
diff --git a/app/assets/javascripts/surveys/merge_request_experience/index.js b/app/assets/javascripts/surveys/merge_request_experience/index.js
new file mode 100644
index 00000000000..6073bde56c0
--- /dev/null
+++ b/app/assets/javascripts/surveys/merge_request_experience/index.js
@@ -0,0 +1,23 @@
+import { Tracker } from '~/tracking/tracker';
+
+const MR_SURVEY_WAIT_DURATION = 10000;
+
+const broadcastNotificationVisible = () => {
+ // We don't want to clutter up the UI by displaying the survey when broadcast message(s)
+ // are visible as well.
+ return Boolean(document.querySelector('.broadcast-notification-message'));
+};
+
+export const initMrExperienceSurvey = () => {
+ if (!gon.features?.mrExperienceSurvey) return;
+ if (!gon.current_user_id) return;
+ if (!Tracker.enabled()) return;
+ if (broadcastNotificationVisible()) return;
+
+ setTimeout(() => {
+ // eslint-disable-next-line promise/catch-or-return
+ import('./app').then(({ startMrSurveyApp }) => {
+ startMrSurveyApp();
+ });
+ }, MR_SURVEY_WAIT_DURATION);
+};
diff --git a/app/assets/javascripts/tabs/constants.js b/app/assets/javascripts/tabs/constants.js
index 90c9a89d652..0c227ab7afc 100644
--- a/app/assets/javascripts/tabs/constants.js
+++ b/app/assets/javascripts/tabs/constants.js
@@ -14,3 +14,6 @@ export const ATTR_ROLE = 'role';
export const ATTR_TABINDEX = 'tabindex';
export const TAB_SHOWN_EVENT = 'gl-tab-shown';
+
+export const HISTORY_TYPE_HASH = 'hash';
+export const ALLOWED_HISTORY_TYPES = [HISTORY_TYPE_HASH];
diff --git a/app/assets/javascripts/tabs/index.js b/app/assets/javascripts/tabs/index.js
index 44937e593e0..9230b7361a5 100644
--- a/app/assets/javascripts/tabs/index.js
+++ b/app/assets/javascripts/tabs/index.js
@@ -1,4 +1,5 @@
import { uniqueId } from 'lodash';
+import { historyReplaceState, NO_SCROLL_TO_HASH_CLASS } from '~/lib/utils/common_utils';
import {
ACTIVE_TAB_CLASSES,
ATTR_ROLE,
@@ -12,9 +13,11 @@ import {
KEY_CODE_RIGHT,
KEY_CODE_DOWN,
TAB_SHOWN_EVENT,
+ HISTORY_TYPE_HASH,
+ ALLOWED_HISTORY_TYPES,
} from './constants';
-export { TAB_SHOWN_EVENT };
+export { TAB_SHOWN_EVENT, HISTORY_TYPE_HASH };
/**
* The `GlTabsBehavior` class adds interactivity to tabs created by the `gl_tabs_nav` and
@@ -88,9 +91,13 @@ export class GlTabsBehavior {
/**
* Create a GlTabsBehavior instance.
*
- * @param {HTMLElement} el The element created by the Rails `gl_tabs_nav` helper.
+ * @param {HTMLElement} el - The element created by the Rails `gl_tabs_nav` helper.
+ * @param {Object} [options]
+ * @param {'hash' | null} [options.history=null] - Sets the type of routing GlTabs will use when navigating between tabs.
+ * 'hash': Updates the URL hash with the current tab ID.
+ * null: No routing mechanism will be used.
*/
- constructor(el) {
+ constructor(el, { history = null } = {}) {
if (!el) {
throw new Error('Cannot instantiate GlTabsBehavior without an element');
}
@@ -100,8 +107,11 @@ export class GlTabsBehavior {
this.tabs = this.getTabs();
this.activeTab = null;
+ this.history = ALLOWED_HISTORY_TYPES.includes(history) ? history : null;
+
this.setAccessibilityAttrs();
this.bindEvents();
+ if (this.history === HISTORY_TYPE_HASH) this.loadInitialTab();
}
setAccessibilityAttrs() {
@@ -128,6 +138,7 @@ export class GlTabsBehavior {
tab.setAttribute(ATTR_ARIA_CONTROLS, tabPanel.id);
}
+ tabPanel.classList.add(NO_SCROLL_TO_HASH_CLASS);
tabPanel.setAttribute(ATTR_ROLE, 'tabpanel');
tabPanel.setAttribute(ATTR_ARIA_LABELLEDBY, tab.id);
});
@@ -164,6 +175,11 @@ export class GlTabsBehavior {
});
}
+ loadInitialTab() {
+ const tab = this.tabList.querySelector(`a[href="${CSS.escape(window.location.hash)}"]`);
+ this.activateTab(tab || this.activeTab);
+ }
+
activatePreviousTab() {
const currentTabIndex = this.tabs.indexOf(this.activeTab);
@@ -216,6 +232,7 @@ export class GlTabsBehavior {
const tabPanel = this.getPanelForTab(tabToActivate);
tabPanel.classList.add(ACTIVE_PANEL_CLASS);
+ if (this.history === HISTORY_TYPE_HASH) historyReplaceState(tabToActivate.getAttribute('href'));
this.activeTab = tabToActivate;
this.dispatchTabShown(tabToActivate, tabPanel);
diff --git a/app/assets/javascripts/terms/components/app.vue b/app/assets/javascripts/terms/components/app.vue
index aedf5b6acfe..a54a198faed 100644
--- a/app/assets/javascripts/terms/components/app.vue
+++ b/app/assets/javascripts/terms/components/app.vue
@@ -7,6 +7,7 @@ import { isLoggedIn } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import csrf from '~/lib/utils/csrf';
import '~/behaviors/markdown/render_gfm';
+import { trackTrialAcceptTerms } from '~/google_tag_manager';
export default {
name: 'TermsApp',
@@ -73,6 +74,7 @@ export default {
this.setScrollableViewportHeight();
event.target.removeEventListener(FLASH_CLOSED_EVENT, this.handleFlashClose);
},
+ trackTrialAcceptTerms,
},
};
</script>
@@ -99,7 +101,13 @@ export default {
<gl-button type="submit">{{ $options.i18n.decline }}</gl-button>
<input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
</form>
- <form v-if="permissions.canAccept" class="gl-ml-3" method="post" :action="paths.accept">
+ <form
+ v-if="permissions.canAccept"
+ class="gl-ml-3"
+ method="post"
+ :action="paths.accept"
+ @submit="trackTrialAcceptTerms"
+ >
<gl-button
type="submit"
variant="confirm"
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index a3615eab26f..3356cada58a 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -117,7 +117,7 @@ function launchPopover(el, mountPopover) {
mountPopover(popoverInstance);
}
-const userLinkSelector = 'a.js-user-link, a.gfm-project_member';
+const userLinkSelector = 'a.js-user-link[data-user], a.js-user-link[data-user-id]';
const getUserLinkNode = (node) => node.closest(userLinkSelector);
diff --git a/app/assets/javascripts/users_select/index.js b/app/assets/javascripts/users_select/index.js
index e1e5cc565c6..94b4ee77e7e 100644
--- a/app/assets/javascripts/users_select/index.js
+++ b/app/assets/javascripts/users_select/index.js
@@ -35,7 +35,7 @@ function UsersSelect(currentUser, els, options = {}) {
}
}
- const { handleClick, autoAssignToMe } = options;
+ const { handleClick } = options;
const userSelect = this;
$els.each((i, dropdown) => {
@@ -172,7 +172,10 @@ function UsersSelect(currentUser, els, options = {}) {
});
};
- const onAssignToMeClick = () => {
+ $assignToMeLink.on('click', (e) => {
+ e.preventDefault();
+ $(e.currentTarget).hide();
+
if ($dropdown.data('multiSelect')) {
assignYourself();
checkMaxSelect();
@@ -191,19 +194,8 @@ function UsersSelect(currentUser, els, options = {}) {
.text(gon.current_user_fullname)
.removeClass('is-default');
}
- };
-
- $assignToMeLink.on('click', (e) => {
- e.preventDefault();
- $(e.currentTarget).hide();
- onAssignToMeClick();
});
- if (autoAssignToMe) {
- $assignToMeLink.hide();
- onAssignToMeClick();
- }
-
$block.on('click', '.js-assign-yourself', (e) => {
e.preventDefault();
return assignTo(userSelect.currentUser.id);
@@ -249,7 +241,7 @@ function UsersSelect(currentUser, els, options = {}) {
)} <% } %>`,
);
assigneeTemplate = template(
- `<% if (username) { %> <a class="author-link bold" href="/<%- username %>"> <% if( avatar ) { %> <img width="32" class="avatar avatar-inline s32" alt="" src="<%- avatar %>"> <% } %> <span class="author"><%- name %></span> <span class="username"> @<%- username %> </span> </a> <% } else { %> <span class="no-value assign-yourself">
+ `<% if (username) { %> <a class="author-link gl-font-weight-bold" href="/<%- username %>"> <% if( avatar ) { %> <img width="32" class="avatar avatar-inline s32" alt="" src="<%- avatar %>"> <% } %> <span class="author"><%- name %></span> <span class="username"> @<%- username %> </span> </a> <% } else { %> <span class="no-value assign-yourself">
${sprintf(s__('UsersSelect|No assignee - %{openingTag} assign yourself %{closingTag}'), {
openingTag: '<a href="#" class="js-assign-yourself">',
closingTag: '</a>',
@@ -585,7 +577,7 @@ function UsersSelect(currentUser, els, options = {}) {
)}</a></li>`;
} else {
// 0 margin, because it's now handled by a wrapper
- img = `<img src='${avatar}' class='avatar avatar-inline m-0' width='32' />`;
+ img = `<img src='${avatar}' class='avatar avatar-inline gl-m-0!' width='32' />`;
}
return userSelect.renderRow(
@@ -806,9 +798,9 @@ UsersSelect.prototype.renderRow = function (
: user.name;
return `
<li data-user-id=${user.id}>
- <a href="#" class="dropdown-menu-user-link d-flex align-items-center ${linkClasses}" ${tooltipAttributes}>
+ <a href="#" class="dropdown-menu-user-link gl-display-flex! gl-align-items-center ${linkClasses}" ${tooltipAttributes}>
${this.renderRowAvatar(issuableType, user, img)}
- <span class="d-flex flex-column overflow-hidden">
+ <span class="gl-display-flex gl-flex-direction-column gl-overflow-hidden">
<strong class="dropdown-menu-user-full-name gl-font-weight-bold">
${escape(name)}
</strong>
@@ -836,7 +828,7 @@ UsersSelect.prototype.renderRowAvatar = function (issuableType, user, img) {
? spriteIcon('warning-solid', 's12 merge-icon')
: '';
- return `<span class="position-relative mr-2">
+ return `<span class="gl-relative gl-mr-3">
${img}
${mergeIcon}
</span>`;
@@ -851,7 +843,7 @@ UsersSelect.prototype.renderApprovalRules = function (elsClassName, approvalRule
const [rule] = approvalRules;
const countText = sprintf(__('(+%{count}&nbsp;rules)'), { count });
- const renderApprovalRulesCount = count > 1 ? `<span class="ml-1">${countText}</span>` : '';
+ const renderApprovalRulesCount = count > 1 ? `<span class="gl-ml-2">${countText}</span>` : '';
const ruleName = rule.rule_type === 'code_owner' ? __('Code Owner') : escape(rule.name);
return `<div class="gl-display-flex gl-font-sm">
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue
index 655ceb5f700..b76d5d90ead 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlButton, GlDropdown, GlDropdownItem, GlTooltipDirective } from '@gitlab/ui';
import { sprintf, __ } from '~/locale';
export default {
@@ -8,6 +8,9 @@ export default {
GlDropdown,
GlDropdownItem,
},
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
props: {
widget: {
type: String,
@@ -19,6 +22,12 @@ export default {
default: () => [],
},
},
+ data: () => {
+ return {
+ timeout: null,
+ updatingTooltip: false,
+ };
+ },
computed: {
dropdownLabel() {
return sprintf(__('%{widget} options'), { widget: this.widget });
@@ -27,9 +36,29 @@ export default {
methods: {
onClickAction(action) {
this.$emit('clickedAction', action);
+
if (action.onClick) {
action.onClick();
}
+
+ if (action.tooltipOnClick) {
+ this.updatingTooltip = true;
+ this.$root.$emit('bv::show::tooltip', action.id);
+
+ clearTimeout(this.timeout);
+
+ this.timeout = setTimeout(() => {
+ this.updatingTooltip = false;
+ this.$root.$emit('bv::hide::tooltip', action.id);
+ }, 1000);
+ }
+ },
+ setTooltip(btn) {
+ if (this.updatingTooltip && btn.tooltipOnClick) {
+ return btn.tooltipOnClick;
+ }
+
+ return btn.tooltipText;
},
},
};
@@ -55,6 +84,7 @@ export default {
:key="index"
:href="btn.href"
:target="btn.target"
+ :data-clipboard-text="btn.dataClipboardText"
@click="onClickAction(btn)"
>
{{ btn.text }}
@@ -63,15 +93,20 @@ export default {
<template v-if="tertiaryButtons.length">
<gl-button
v-for="(btn, index) in tertiaryButtons"
+ :id="btn.id"
:key="index"
+ v-gl-tooltip.hover
+ :title="setTooltip(btn)"
:href="btn.href"
:target="btn.target"
:class="{ 'gl-mr-3': index !== tertiaryButtons.length - 1 }"
+ :data-clipboard-text="btn.dataClipboardText"
+ :icon="btn.icon"
+ :data-testid="btn.testId || 'extension-actions-button'"
+ :variant="btn.variant || 'confirm'"
category="tertiary"
- variant="confirm"
size="small"
class="gl-display-none gl-md-display-block gl-float-left"
- data-testid="extension-actions-button"
@click="onClickAction(btn)"
>
{{ btn.text }}
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 4ba620da00a..410331004e4 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
@@ -194,6 +194,24 @@ export default {
poll.makeRequest();
},
+ initExtensionFullDataPolling() {
+ const poll = new Poll({
+ resource: {
+ fetchData: () => this.fetchFullData(this),
+ },
+ method: 'fetchData',
+ successCallback: (response) => {
+ this.headerCheck(response, (data) => {
+ this.setFullData(data);
+ });
+ },
+ errorCallback: (e) => {
+ this.setExpandedError(e);
+ },
+ });
+
+ poll.makeRequest();
+ },
headerCheck(response, callback) {
const headers = normalizeHeaders(response.headers);
@@ -220,6 +238,10 @@ export default {
});
}
},
+ setFullData(data) {
+ this.loadingState = null;
+ this.fullData = data.map((x, i) => ({ id: i, ...x }));
+ },
setCollapsedData(data) {
this.collapsedData = data;
this.loadingState = null;
@@ -229,21 +251,26 @@ export default {
Sentry.captureException(e);
},
+ setExpandedError(e) {
+ this.loadingState = LOADING_STATES.expandedError;
+ Sentry.captureException(e);
+ },
loadAllData() {
if (this.hasFullData) return;
this.loadingState = LOADING_STATES.expandedLoading;
- this.fetchFullData(this)
- .then((data) => {
- this.loadingState = null;
- this.fullData = data.map((x, i) => ({ id: i, ...x }));
- })
- .catch((e) => {
- this.loadingState = LOADING_STATES.expandedError;
-
- Sentry.captureException(e);
- });
+ if (this.$options.enableExpandedPolling) {
+ this.initExtensionFullDataPolling();
+ } else {
+ this.fetchFullData(this)
+ .then((data) => {
+ this.setFullData(data);
+ })
+ .catch((e) => {
+ this.setExpandedError(e);
+ });
+ }
},
appear(index) {
if (index === this.fullData.length - 1) {
@@ -288,6 +315,7 @@ export default {
@mouseup="onRowMouseUp"
>
<status-icon
+ :level="1"
:name="$options.label || $options.name"
:is-loading="isLoadingSummary"
:icon-name="statusIconName"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js b/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js
index f4fcf4c9571..7e329399957 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js
@@ -20,6 +20,7 @@ export const registerExtension = (extension) => {
i18n: extension.i18n,
expandEvent: extension.expandEvent,
enablePolling: extension.enablePolling,
+ enableExpandedPolling: extension.enableExpandedPolling,
modalComponent: extension.modalComponent,
computed: {
...extension.props.reduce(
@@ -35,7 +36,7 @@ export const registerExtension = (extension) => {
(acc, computedKey) => ({
...acc,
// Making the computed property a method allows us to pass in arguments
- // this allows for each computed property to recieve some data
+ // this allows for each computed property to receive some data
[computedKey]() {
return extension.computed[computedKey];
},
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue
index bb626c9adba..dc748ba44f2 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue
@@ -9,6 +9,11 @@ export default {
GlIcon,
},
props: {
+ level: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
name: {
type: String,
required: false,
@@ -27,7 +32,7 @@ export default {
size: {
type: Number,
required: false,
- default: 16,
+ default: 12,
},
},
computed: {
@@ -44,8 +49,8 @@ export default {
<div
:class="[
$options.EXTENSION_ICON_CLASS[iconName],
- { 'mr-widget-extension-icon': !isLoading && size === 16 },
- { 'gl-p-2': isLoading || size === 16 },
+ { 'mr-widget-extension-icon gl-w-6': !isLoading && level === 1 },
+ { 'gl-p-2': isLoading || level === 1 },
]"
class="gl-rounded-full gl-mr-3 gl-relative gl-p-2"
>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/telemetry.js b/app/assets/javascripts/vue_merge_request_widget/components/extensions/telemetry.js
index aec3a35f37c..b551cd2fd60 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/telemetry.js
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/telemetry.js
@@ -65,7 +65,7 @@ function simplifyWidgetName(componentName) {
function baseRedisEventName(extensionName) {
const redisEventName = extensionName.replace(/([A-Z])/g, '_$1').toLowerCase();
- return `i_merge_request_widget_${redisEventName}`;
+ return `i_code_review_merge_request_widget_${redisEventName}`;
}
function whenable(bus) {
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/merge_checks_failed.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/merge_checks_failed.vue
index 701ef89304c..a45823823f0 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/merge_checks_failed.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/merge_checks_failed.vue
@@ -4,7 +4,7 @@ import StatusIcon from '../mr_widget_status_icon.vue';
export default {
i18n: {
- approvalNeeded: s__('mrWidget|Merge blocked: this merge request must be approved.'),
+ approvalNeeded: s__('mrWidget|Merge blocked: all required approvals must be given.'),
blockingMergeRequests: s__(
'mrWidget|Merge blocked: you can only merge after the above items are resolved.',
),
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 3511fffcfbb..59767eb2e6e 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
@@ -3,6 +3,7 @@ import { GlButton, GlSkeletonLoader } from '@gitlab/ui';
import createFlash from '~/flash';
import { __ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import toast from '~/vue_shared/plugins/global_toast';
import simplePoll from '~/lib/utils/simple_poll';
import eventHub from '../../event_hub';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
@@ -120,13 +121,15 @@ export default {
.poll()
.then((res) => res.data)
.then((res) => {
- if (res.rebase_in_progress) {
+ if (res.rebase_in_progress || res.should_be_rebased) {
continuePolling();
} else {
this.isMakingRequest = false;
if (res.merge_error && res.merge_error.length) {
this.rebasingError = res.merge_error;
+ } else {
+ toast(__('Rebase completed'));
}
eventHub.$emit('MRWidgetRebaseSuccess');
@@ -218,6 +221,17 @@ export default {
>
{{ __('Rebase') }}
</gl-button>
+ <gl-button
+ v-if="glFeatures.restructuredMrWidget && showRebaseWithoutCi"
+ :loading="isMakingRequest"
+ variant="confirm"
+ size="small"
+ category="secondary"
+ data-testid="rebase-without-ci-button"
+ @click="rebaseWithoutCi"
+ >
+ {{ __('Rebase without pipeline') }}
+ </gl-button>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/accessibility/index.js b/app/assets/javascripts/vue_merge_request_widget/extensions/accessibility/index.js
index f14e80d0be6..22e907f7e48 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/accessibility/index.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/accessibility/index.js
@@ -40,6 +40,9 @@ export default {
return numOfResults === 0 ? successText : warningText;
},
+ shouldCollapse() {
+ return this.collapsedData?.summary?.errored > 0;
+ },
fetchCollapsedData() {
return axios.get(this.accessibilityReportPath);
},
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js b/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
index a7aaa2f4476..ca95e1b5de8 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
@@ -32,7 +32,7 @@ export default {
// Status icon to be used next to the summary text
// Receives the collapsed data as an argument
statusIcon(count) {
- return EXTENSION_ICONS.warning;
+ return EXTENSION_ICONS.failed;
},
// Tertiary action buttons that will take the user elsewhere
// in the GitLab app
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js
index 23f14bea4e1..4994a0bcbeb 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js
@@ -7,6 +7,8 @@ export const TESTS_FAILED_STATUS = 'failed';
export const ERROR_STATUS = 'error';
export const i18n = {
+ copyFailedSpecs: s__('Reports|Copy failed tests'),
+ copyFailedSpecsTooltip: s__('Reports|Copy failed test names to run locally'),
label: s__('Reports|Test summary'),
loading: s__('Reports|Test summary results are loading'),
error: s__('Reports|Test summary failed to load results'),
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js
index 164bda33b95..c74445a5b80 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js
@@ -1,4 +1,5 @@
import { uniqueId } from 'lodash';
+import { __ } from '~/locale';
import axios from '~/lib/utils/axios_utils';
import TestCaseDetails from '~/pipelines/components/test_reports/test_case_details.vue';
import { EXTENSION_ICONS } from '../../constants';
@@ -19,6 +20,20 @@ export default {
props: ['testResultsPath', 'headBlobPath', 'pipeline'],
modalComponent: TestCaseDetails,
computed: {
+ failedTestNames() {
+ if (!this.collapsedData?.suites) {
+ return '';
+ }
+
+ const newFailures = this.collapsedData?.suites.flatMap((suite) => [suite.new_failures || []]);
+ const fileNames = newFailures.flatMap((newFailure) => {
+ return newFailure.map((failure) => {
+ return failure.file;
+ });
+ });
+
+ return fileNames.join(' ');
+ },
summary(data) {
if (data.parsingInProgress) {
return this.$options.i18n.loading;
@@ -32,9 +47,6 @@ export default {
};
},
statusIcon(data) {
- if (data.parsingInProgress) {
- return null;
- }
if (data.status === TESTS_FAILED_STATUS) {
return EXTENSION_ICONS.warning;
}
@@ -44,30 +56,46 @@ export default {
return EXTENSION_ICONS.success;
},
tertiaryButtons() {
- return [
- {
- text: this.$options.i18n.fullReport,
- href: `${this.pipeline.path}/test_report`,
- target: '_blank',
- fullReport: true,
- },
- ];
+ const actionButtons = [];
+
+ if (this.failedTestNames().length > 0) {
+ actionButtons.push({
+ dataClipboardText: this.failedTestNames(),
+ id: uniqueId('copy-to-clipboard'),
+ icon: 'copy-to-clipboard',
+ testId: 'copy-failed-specs-btn',
+ text: this.$options.i18n.copyFailedSpecs,
+ tooltipText: this.$options.i18n.copyFailedSpecsTooltip,
+ tooltipOnClick: __('Copied'),
+ });
+ }
+
+ actionButtons.push({
+ text: this.$options.i18n.fullReport,
+ href: `${this.pipeline.path}/test_report`,
+ target: '_blank',
+ fullReport: true,
+ testId: 'full-report-link',
+ });
+
+ return actionButtons;
},
},
methods: {
fetchCollapsedData() {
- return axios.get(this.testResultsPath).then((res) => {
- const { data = {}, status } = res;
+ return axios.get(this.testResultsPath).then((response) => {
+ const { data = {}, status } = response;
+ const { suites = [], summary = {} } = data;
return {
- ...res,
+ ...response,
data: {
- hasSuiteError: data.suites?.some((suite) => suite.status === ERROR_STATUS),
+ hasSuiteError: suites.some((suite) => suite.status === ERROR_STATUS),
parsingInProgress: status === 204,
...data,
summary: {
- recentlyFailed: countRecentlyFailedTests(data.suites),
- ...data.summary,
+ recentlyFailed: countRecentlyFailedTests(suites),
+ ...summary,
},
},
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js
index 7bbcb0cd04a..4ffd06de61f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js
@@ -1,3 +1,4 @@
+import { isEmpty } from 'lodash';
import { i18n } from './constants';
const textBuilder = (results, boldNumbers = false) => {
@@ -65,6 +66,11 @@ export const reportSubTextBuilder = ({ suite_errors, summary }) => {
};
export const countRecentlyFailedTests = (subject) => {
+ // return 0 count if subject is [], null, or undefined
+ if (isEmpty(subject)) {
+ return 0;
+ }
+
// handle either a single report or an array of reports
const reports = !subject.length ? [subject] : subject;
@@ -73,10 +79,10 @@ export const countRecentlyFailedTests = (subject) => {
return (
[report.new_failures, report.existing_failures, report.resolved_failures]
// only count tests which have failed more than once
- .map(
- (failureArray) =>
- failureArray.filter((failure) => failure.recent_failures?.count > 1).length,
- )
+ .map((failureArray) => {
+ if (!failureArray) return 0;
+ return failureArray.filter((failure) => failure.recent_failures?.count > 1).length;
+ })
.reduce((total, count) => total + count, 0)
);
})
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 c68437b9879..3e0ac236fdf 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
@@ -221,8 +221,11 @@ export default {
formattedHumanAccess() {
return (this.mr.humanAccess || '').toLowerCase();
},
+ hasMergeError() {
+ return this.mr.mergeError && this.state !== 'closed';
+ },
hasAlerts() {
- return this.mr.mergeError || this.showMergePipelineForkWarning;
+ return this.hasMergeError || this.showMergePipelineForkWarning;
},
shouldShowExtension() {
return (
@@ -574,7 +577,12 @@ export default {
/>
<div class="mr-section-container mr-widget-workflow">
<div v-if="hasAlerts" class="gl-overflow-hidden mr-widget-alert-container">
- <mr-widget-alert-message v-if="mr.mergeError" type="danger" dismissible>
+ <mr-widget-alert-message
+ v-if="hasMergeError"
+ type="danger"
+ dismissible
+ data-testid="merge_error"
+ >
<span v-safe-html="mergeError"></span>
</mr-widget-alert-message>
<mr-widget-alert-message
diff --git a/app/assets/javascripts/vue_merge_request_widget/queries/get_state.query.graphql b/app/assets/javascripts/vue_merge_request_widget/queries/get_state.query.graphql
index 25c44beaf18..981c667f27a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/queries/get_state.query.graphql
+++ b/app/assets/javascripts/vue_merge_request_widget/queries/get_state.query.graphql
@@ -6,11 +6,13 @@ query getState($projectPath: ID!, $iid: String!) {
mergeRequest(iid: $iid) {
id
autoMergeEnabled
+ availableAutoMergeStrategies
commitCount
conflicts
diffHeadSha
mergeError
mergeStatus
+ mergeable
mergeableDiscussionsState
headPipeline {
id
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue
index 322ea64eb7e..f2c27cf611e 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue
@@ -61,7 +61,7 @@ export default {
},
});
- return document.dispatchEvent(headerTodoEvent);
+ document.dispatchEvent(headerTodoEvent);
},
addToDo() {
this.isUpdating = true;
@@ -75,9 +75,10 @@ export default {
})
.then(({ data: { errors = [] } }) => {
if (errors[0]) {
- return this.throwError(errors[0]);
+ this.throwError(errors[0]);
+ return;
}
- return this.updateToDoCount(true);
+ this.updateToDoCount(true);
})
.catch(() => {
this.throwError();
@@ -98,9 +99,10 @@ export default {
})
.then(({ data: { errors = [] } }) => {
if (errors[0]) {
- return this.throwError(errors[0]);
+ this.throwError(errors[0]);
+ return;
}
- return this.updateToDoCount(false);
+ this.updateToDoCount(false);
})
.catch(() => {
this.throwError();
diff --git a/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_item.vue b/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_item.vue
index 92817d5fa70..70cac061ca6 100644
--- a/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_item.vue
+++ b/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_item.vue
@@ -14,12 +14,12 @@ export default {
</script>
<template>
- <div>
+ <div class="color-item">
<span
- class="dropdown-label-box gl-flex-shrink-0 gl-top-1 gl-mr-0"
+ class="dropdown-label-box color-item-color"
data-testid="color-item"
:style="{ backgroundColor: color }"
></span>
- <span class="hide-collapsed">{{ title }}</span>
+ <span class="color-item-text">{{ title }}</span>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_select_root.vue b/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_select_root.vue
index 6b79883d76b..a88a4ca5cb8 100644
--- a/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_select_root.vue
+++ b/app/assets/javascripts/vue_shared/components/color_select_dropdown/color_select_root.vue
@@ -1,4 +1,5 @@
<script>
+import { isString } from 'lodash';
import createFlash from '~/flash';
import { s__ } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
@@ -52,13 +53,23 @@ export default {
required: false,
default: s__('ColorWidget|Assign epic color'),
},
+ defaultColor: {
+ type: Object,
+ required: false,
+ validator(value) {
+ return isString(value?.color) && isString(value?.title);
+ },
+ default() {
+ return {
+ color: '',
+ title: '',
+ };
+ },
+ },
},
data() {
return {
- issuableColor: {
- color: '',
- title: '',
- },
+ issuableColor: this.defaultColor,
colorUpdateInProgress: false,
oldIid: null,
sidebarExpandedOnClick: false,
@@ -106,9 +117,9 @@ export default {
methods: {
handleDropdownClose(color) {
if (this.iid !== '') {
- this.updateSelectedColor(this.getUpdateVariables(color));
+ this.updateSelectedColor(color);
} else {
- this.$emit('updateSelectedColor', color);
+ this.$emit('updateSelectedColor', { color });
}
this.collapseEditableItem();
@@ -129,13 +140,15 @@ export default {
color: color.color,
};
},
- updateSelectedColor(inputVariables) {
+ updateSelectedColor(color) {
this.colorUpdateInProgress = true;
+ const input = this.getUpdateVariables(color);
+
this.$apollo
.mutate({
mutation: updateEpicColorMutation,
- variables: { input: inputVariables },
+ variables: { input },
})
.then(({ data }) => {
if (data.updateIssuableColor?.errors?.length) {
@@ -144,7 +157,7 @@ export default {
this.$emit('updateSelectedColor', {
id: data.updateIssuableColor?.issuable?.id,
- color: data.updateIssuableColor?.issuable?.color,
+ color,
});
})
.catch((error) =>
diff --git a/app/assets/javascripts/vue_shared/components/color_select_dropdown/constants.js b/app/assets/javascripts/vue_shared/components/color_select_dropdown/constants.js
index c70785abd1e..701ac71d755 100644
--- a/app/assets/javascripts/vue_shared/components/color_select_dropdown/constants.js
+++ b/app/assets/javascripts/vue_shared/components/color_select_dropdown/constants.js
@@ -1,4 +1,4 @@
-import { __, s__ } from '~/locale';
+import { s__ } from '~/locale';
export const COLOR_WIDGET_COLOR = s__('ColorWidget|Color');
@@ -7,7 +7,7 @@ export const DROPDOWN_VARIANT = {
Embedded: 'embedded',
};
-export const DEFAULT_COLOR = { title: __('SuggestedColors|Blue'), color: '#1068bf' };
+export const DEFAULT_COLOR = { title: s__('SuggestedColors|Blue'), color: '#1068bf' };
export const ISSUABLE_COLORS = [
DEFAULT_COLOR,
diff --git a/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents.vue b/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents.vue
index 4eb1d3d08ca..84da6e1437e 100644
--- a/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents.vue
+++ b/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents.vue
@@ -1,11 +1,13 @@
<script>
import { GlDropdown } from '@gitlab/ui';
+import ColorItem from './color_item.vue';
import DropdownContentsColorView from './dropdown_contents_color_view.vue';
import DropdownHeader from './dropdown_header.vue';
import { isDropdownVariantSidebar } from './utils';
export default {
components: {
+ ColorItem,
DropdownContentsColorView,
DropdownHeader,
GlDropdown,
@@ -42,12 +44,15 @@ export default {
},
computed: {
buttonText() {
- if (!this.localSelectedColor?.title) {
+ if (!this.hasSelectedColor) {
return this.dropdownButtonText;
}
return this.localSelectedColor.title;
},
+ hasSelectedColor() {
+ return this.localSelectedColor?.title;
+ },
},
watch: {
localSelectedColor: {
@@ -91,7 +96,15 @@ export default {
</script>
<template>
- <gl-dropdown ref="dropdown" :text="buttonText" class="gl-w-full" @hide="handleDropdownHide">
+ <gl-dropdown ref="dropdown" class="gl-w-full" @hide="handleDropdownHide">
+ <template #button-text>
+ <color-item
+ v-if="hasSelectedColor"
+ :color="localSelectedColor.color"
+ :title="localSelectedColor.title"
+ />
+ <span v-else data-testid="fallback-button-text">{{ buttonText }}</span>
+ </template>
<template #header>
<dropdown-header
ref="header"
diff --git a/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents_color_view.vue b/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents_color_view.vue
index 62f4cf59c14..91906388049 100644
--- a/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents_color_view.vue
+++ b/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_contents_color_view.vue
@@ -36,8 +36,8 @@ export default {
</script>
<template>
- <gl-dropdown-form>
- <div>
+ <gl-dropdown-form class="js-colors-list">
+ <div data-testid="dropdown-content">
<gl-dropdown-item
v-for="color in colors"
:key="color.color"
diff --git a/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_value.vue b/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_value.vue
index 4cba66eefd2..7ae803ebf4d 100644
--- a/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_value.vue
+++ b/app/assets/javascripts/vue_shared/components/color_select_dropdown/dropdown_value.vue
@@ -20,6 +20,11 @@ export default {
required: true,
},
},
+ computed: {
+ hasColor() {
+ return this.selectedColor.color !== '';
+ },
+ },
};
</script>
@@ -31,13 +36,18 @@ export default {
class="sidebar-collapsed-icon"
>
<gl-icon name="appearance" />
+ <color-item :color="selectedColor.color" :title="selectedColor.title" />
+ </div>
+
+ <span v-if="!hasColor" class="no-value hide-collapsed">
+ <slot></slot>
+ </span>
+ <template v-else>
<color-item
+ class="hide-collapsed"
:color="selectedColor.color"
:title="selectedColor.title"
- class="gl-font-base gl-line-height-24"
/>
- </div>
-
- <color-item class="hide-collapsed" :color="selectedColor.color" :title="selectedColor.title" />
+ </template>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/deployment_instance.vue b/app/assets/javascripts/vue_shared/components/deployment_instance.vue
index 4aae86fc82b..1b907078cf9 100644
--- a/app/assets/javascripts/vue_shared/components/deployment_instance.vue
+++ b/app/assets/javascripts/vue_shared/components/deployment_instance.vue
@@ -13,8 +13,6 @@
* Mockup is https://gitlab.com/gitlab-org/gitlab/issues/35570
*/
import { GlLink, GlTooltipDirective } from '@gitlab/ui';
-import { mergeUrlParams } from '~/lib/utils/url_utility';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
components: {
@@ -23,7 +21,6 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
- mixins: [glFeatureFlagsMixin()],
props: {
/**
* Represents the status of the pod. Each state is represented with a different
@@ -54,17 +51,11 @@ export default {
required: false,
default: '',
},
-
- logsPath: {
- type: String,
- required: false,
- default: '',
- },
},
computed: {
isLink() {
- return this.logsPath !== '' && this.podName !== '';
+ return this.podName !== '';
},
cssClass() {
@@ -74,12 +65,6 @@ export default {
link: this.isLink,
};
},
-
- computedLogPath() {
- return this.isLink && this.glFeatures.monitorLogging
- ? mergeUrlParams({ pod_name: this.podName }, this.logsPath)
- : null;
- },
},
};
</script>
@@ -88,7 +73,6 @@ export default {
v-gl-tooltip
:class="cssClass"
:title="tooltipText"
- :href="computedLogPath"
class="deployment-instance d-flex justify-content-center align-items-center"
/>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/dom_element_listener.vue b/app/assets/javascripts/vue_shared/components/dom_element_listener.vue
index ca427ed4897..b9608a26d91 100644
--- a/app/assets/javascripts/vue_shared/components/dom_element_listener.vue
+++ b/app/assets/javascripts/vue_shared/components/dom_element_listener.vue
@@ -22,7 +22,7 @@ export default {
});
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
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 a512eb687b7..a246eadb790 100644
--- a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue
+++ b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue
@@ -37,6 +37,7 @@ export default {
aria-expanded="false"
>
<gl-loading-icon v-show="isLoading" size="sm" :inline="true" />
+ <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots -->
<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/dropdown_keyboard_navigation.vue b/app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue
index 5d0ed8b0821..1da84df022f 100644
--- a/app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue
+++ b/app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue
@@ -75,7 +75,7 @@ export default {
},
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_contact.fragment.graphql b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_contact.fragment.graphql
new file mode 100644
index 00000000000..38222e4e8c2
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_contact.fragment.graphql
@@ -0,0 +1,6 @@
+fragment ContactFragment on CustomerRelationsContact {
+ id
+ firstName
+ lastName
+ email
+}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_organization.fragment.graphql b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_organization.fragment.graphql
new file mode 100644
index 00000000000..a7de3c7f7af
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/crm_organization.fragment.graphql
@@ -0,0 +1,4 @@
+fragment OrganizationFragment on CustomerRelationsOrganization {
+ id
+ name
+}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_contacts.query.graphql b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_contacts.query.graphql
new file mode 100644
index 00000000000..647aaa0f7f8
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_contacts.query.graphql
@@ -0,0 +1,28 @@
+#import "./crm_contact.fragment.graphql"
+
+query searchCrmContacts(
+ $isProject: Boolean = false
+ $fullPath: ID!
+ $searchString: String
+ $searchIds: [CustomerRelationsContactID!]
+) {
+ group(fullPath: $fullPath) @skip(if: $isProject) {
+ id
+ contacts(search: $searchString, ids: $searchIds) {
+ nodes {
+ ...ContactFragment
+ }
+ }
+ }
+ project(fullPath: $fullPath) @include(if: $isProject) {
+ id
+ group {
+ id
+ contacts(search: $searchString, ids: $searchIds) {
+ nodes {
+ ...ContactFragment
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_organizations.query.graphql b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_organizations.query.graphql
new file mode 100644
index 00000000000..c4f4663de45
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_crm_organizations.query.graphql
@@ -0,0 +1,28 @@
+#import "./crm_organization.fragment.graphql"
+
+query searchCrmOrganizations(
+ $isProject: Boolean = false
+ $fullPath: ID!
+ $searchString: String
+ $searchIds: [CustomerRelationsOrganizationID!]
+) {
+ group(fullPath: $fullPath) @skip(if: $isProject) {
+ id
+ organizations(search: $searchString, ids: $searchIds) {
+ nodes {
+ ...OrganizationFragment
+ }
+ }
+ }
+ project(fullPath: $fullPath) @include(if: $isProject) {
+ id
+ group {
+ id
+ organizations(search: $searchString, ids: $searchIds) {
+ nodes {
+ ...OrganizationFragment
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_contact_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_contact_token.vue
new file mode 100644
index 00000000000..adfe0559b62
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_contact_token.vue
@@ -0,0 +1,131 @@
+<script>
+import { GlFilteredSearchSuggestion } from '@gitlab/ui';
+
+import { ITEM_TYPE } from '~/groups/constants';
+import { getIdFromGraphQLId, convertToGraphQLId } from '~/graphql_shared/utils';
+import createFlash from '~/flash';
+import { isPositiveInteger } from '~/lib/utils/number_utils';
+import { __ } from '~/locale';
+import searchCrmContactsQuery from '../queries/search_crm_contacts.query.graphql';
+
+import { DEFAULT_NONE_ANY } from '../constants';
+
+import BaseToken from './base_token.vue';
+
+export default {
+ components: {
+ BaseToken,
+ GlFilteredSearchSuggestion,
+ },
+ props: {
+ config: {
+ type: Object,
+ required: true,
+ },
+ value: {
+ type: Object,
+ required: true,
+ },
+ active: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ contacts: this.config.initialContacts || [],
+ loading: false,
+ };
+ },
+ computed: {
+ defaultContacts() {
+ return this.config.defaultContacts || DEFAULT_NONE_ANY;
+ },
+ namespace() {
+ return this.config.isProject ? ITEM_TYPE.PROJECT : ITEM_TYPE.GROUP;
+ },
+ },
+ methods: {
+ getActiveContact(contacts, data) {
+ return contacts.find((contact) => {
+ return `${this.formatContactId(contact)}` === data;
+ });
+ },
+ getContactName(contact) {
+ return `${contact.firstName} ${contact.lastName}`;
+ },
+ fetchContacts(searchTerm) {
+ let searchString = null;
+ let searchId = null;
+ if (isPositiveInteger(searchTerm)) {
+ searchId = this.formatContactGraphQLId(searchTerm);
+ } else {
+ searchString = searchTerm;
+ }
+
+ this.loading = true;
+
+ this.$apollo
+ .query({
+ query: searchCrmContactsQuery,
+ variables: {
+ fullPath: this.config.fullPath,
+ searchString,
+ searchIds: searchId ? [searchId] : null,
+ isProject: this.config.isProject,
+ },
+ })
+ .then(({ data }) => {
+ this.contacts = this.config.isProject
+ ? data[this.namespace]?.group.contacts.nodes
+ : data[this.namespace]?.contacts.nodes;
+ })
+ .catch(() =>
+ createFlash({
+ message: __('There was a problem fetching CRM contacts.'),
+ }),
+ )
+ .finally(() => {
+ this.loading = false;
+ });
+ },
+ formatContactId(contact) {
+ return `${getIdFromGraphQLId(contact.id)}`;
+ },
+ formatContactGraphQLId(id) {
+ return convertToGraphQLId('CustomerRelations::Contact', id);
+ },
+ },
+};
+</script>
+
+<template>
+ <base-token
+ :config="config"
+ :value="value"
+ :active="active"
+ :suggestions-loading="loading"
+ :suggestions="contacts"
+ :get-active-token-value="getActiveContact"
+ :default-suggestions="defaultContacts"
+ v-bind="$attrs"
+ @fetch-suggestions="fetchContacts"
+ v-on="$listeners"
+ >
+ <template #view="{ viewTokenProps: { inputValue, activeTokenValue } }">
+ {{ activeTokenValue ? getContactName(activeTokenValue) : inputValue }}
+ </template>
+ <template #suggestions-list="{ suggestions }">
+ <gl-filtered-search-suggestion
+ v-for="contact in suggestions"
+ :key="formatContactId(contact)"
+ :value="formatContactId(contact)"
+ >
+ <div>
+ <div>{{ getContactName(contact) }}</div>
+ <div class="gl-font-sm">{{ contact.email }}</div>
+ </div>
+ </gl-filtered-search-suggestion>
+ </template>
+ </base-token>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_organization_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_organization_token.vue
new file mode 100644
index 00000000000..e6ab944449e
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/crm_organization_token.vue
@@ -0,0 +1,125 @@
+<script>
+import { GlFilteredSearchSuggestion } from '@gitlab/ui';
+
+import { ITEM_TYPE } from '~/groups/constants';
+import { getIdFromGraphQLId, convertToGraphQLId } from '~/graphql_shared/utils';
+import createFlash from '~/flash';
+import { isPositiveInteger } from '~/lib/utils/number_utils';
+import { __ } from '~/locale';
+import searchCrmOrganizationsQuery from '../queries/search_crm_organizations.query.graphql';
+
+import { DEFAULT_NONE_ANY } from '../constants';
+
+import BaseToken from './base_token.vue';
+
+export default {
+ components: {
+ BaseToken,
+ GlFilteredSearchSuggestion,
+ },
+ props: {
+ config: {
+ type: Object,
+ required: true,
+ },
+ value: {
+ type: Object,
+ required: true,
+ },
+ active: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ organizations: this.config.initialOrganizations || [],
+ loading: false,
+ };
+ },
+ computed: {
+ defaultOrganizations() {
+ return this.config.defaultOrganizations || DEFAULT_NONE_ANY;
+ },
+ namespace() {
+ return this.config.isProject ? ITEM_TYPE.PROJECT : ITEM_TYPE.GROUP;
+ },
+ },
+ methods: {
+ getActiveOrganization(organizations, data) {
+ return organizations.find((organization) => {
+ return `${this.formatOrganizationId(organization)}` === data;
+ });
+ },
+ fetchOrganizations(searchTerm) {
+ let searchString = null;
+ let searchId = null;
+ if (isPositiveInteger(searchTerm)) {
+ searchId = this.formatOrganizationGraphQLId(searchTerm);
+ } else {
+ searchString = searchTerm;
+ }
+
+ this.loading = true;
+
+ this.$apollo
+ .query({
+ query: searchCrmOrganizationsQuery,
+ variables: {
+ fullPath: this.config.fullPath,
+ searchString,
+ searchIds: searchId ? [searchId] : null,
+ isProject: this.config.isProject,
+ },
+ })
+ .then(({ data }) => {
+ this.organizations = this.config.isProject
+ ? data[this.namespace]?.group.organizations.nodes
+ : data[this.namespace]?.organizations.nodes;
+ })
+ .catch(() =>
+ createFlash({
+ message: __('There was a problem fetching CRM organizations.'),
+ }),
+ )
+ .finally(() => {
+ this.loading = false;
+ });
+ },
+ formatOrganizationId(organization) {
+ return `${getIdFromGraphQLId(organization.id)}`;
+ },
+ formatOrganizationGraphQLId(id) {
+ return convertToGraphQLId('CustomerRelations::Organization', id);
+ },
+ },
+};
+</script>
+
+<template>
+ <base-token
+ :config="config"
+ :value="value"
+ :active="active"
+ :suggestions-loading="loading"
+ :suggestions="organizations"
+ :get-active-token-value="getActiveOrganization"
+ :default-suggestions="defaultOrganizations"
+ v-bind="$attrs"
+ @fetch-suggestions="fetchOrganizations"
+ v-on="$listeners"
+ >
+ <template #view="{ viewTokenProps: { inputValue, activeTokenValue } }">
+ {{ activeTokenValue ? activeTokenValue.name : inputValue }}
+ </template>
+ <template #suggestions-list="{ suggestions }">
+ <gl-filtered-search-suggestion
+ v-for="organization in suggestions"
+ :key="formatOrganizationId(organization)"
+ :value="formatOrganizationId(organization)"
+ >
+ {{ organization.name }}
+ </gl-filtered-search-suggestion>
+ </template>
+ </base-token>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
index 15d858b99b9..482a2964b4c 100644
--- a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
+++ b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
@@ -139,6 +139,7 @@ export default {
/>
</template>
</gl-form-input-group>
+ <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots -->
<template v-for="slot in Object.keys($slots)" #[slot]>
<slot :name="slot"></slot>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/header_ci_component.vue b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
index f2abade8036..96f7427dda1 100644
--- a/app/assets/javascripts/vue_shared/components/header_ci_component.vue
+++ b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
@@ -163,6 +163,7 @@ export default {
</template>
</section>
+ <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots -->
<section v-if="$slots.default" data-testid="ci-header-action-buttons" class="gl-display-flex">
<slot></slot>
</section>
diff --git a/app/assets/javascripts/vue_shared/components/help_popover.vue b/app/assets/javascripts/vue_shared/components/help_popover.vue
index c3f184446a8..1b89bd324c6 100644
--- a/app/assets/javascripts/vue_shared/components/help_popover.vue
+++ b/app/assets/javascripts/vue_shared/components/help_popover.vue
@@ -38,6 +38,7 @@ export default {
<template #default>
<div v-safe-html="options.content"></div>
</template>
+ <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots -->
<template v-for="slot in Object.keys($slots)" #[slot]>
<slot :name="slot"></slot>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/local_storage_sync.vue b/app/assets/javascripts/vue_shared/components/local_storage_sync.vue
index 4ece87310c7..96c779c5ce4 100644
--- a/app/assets/javascripts/vue_shared/components/local_storage_sync.vue
+++ b/app/assets/javascripts/vue_shared/components/local_storage_sync.vue
@@ -100,7 +100,7 @@ export default {
},
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue
index 1f309a19b14..32b3a0e22c2 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/field.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue
@@ -248,7 +248,7 @@ export default {
labels: this.enableAutocomplete,
snippets: this.enableAutocomplete,
vulnerabilities: this.enableAutocomplete,
- contacts: this.enableAutocomplete && this.glFeatures.contactsAutocomplete,
+ contacts: this.enableAutocomplete,
},
true,
);
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 8a1b8363f19..7646a8718d6 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
@@ -139,8 +139,8 @@ export default {
</script>
<template>
- <div class="md-suggestion-header border-bottom-0 mt-2">
- <div class="js-suggestion-diff-header font-weight-bold">
+ <div class="md-suggestion-header border-bottom-0 gl-mt-3">
+ <div class="js-suggestion-diff-header gl-font-weight-bold">
{{ __('Suggested change') }}
<a v-if="helpPagePath" :href="helpPagePath" :aria-label="__('Help')" class="js-help-btn">
<gl-icon name="question-o" css-classes="link-highlight" />
@@ -151,13 +151,13 @@ export default {
</gl-badge>
<div
v-else-if="isApplying"
- class="d-flex align-items-center text-secondary"
+ class="gl-display-flex gl-align-items-center text-secondary"
data-qa-selector="applying_badge"
>
- <gl-loading-icon size="sm" class="d-flex-center mr-2" />
+ <gl-loading-icon size="sm" class="gl-align-items-center gl-justify-content-center gl-mr-3" />
<span>{{ applyingSuggestionsMessage }}</span>
</div>
- <div v-else-if="isLoggedIn" class="d-flex align-items-center">
+ <div v-else-if="isLoggedIn" class="gl-display-flex gl-align-items-center">
<div v-if="isBatched">
<gl-button
class="btn-inverted js-remove-from-batch-btn btn-grouped"
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 624dbcc6d8e..0cb4a5bc39f 100644
--- a/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
+++ b/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
@@ -16,17 +16,17 @@
* :note="{body: 'This is a note'}"
* />
*/
-import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
+import { GlSafeHtmlDirective as SafeHtml, GlAvatarLink, GlAvatar } 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,
+ GlAvatarLink,
+ GlAvatar,
TimelineEntryItem,
},
props: {
@@ -55,7 +55,10 @@ export default {
return 24;
}
- return 40;
+ return {
+ default: 24,
+ md: 32,
+ };
},
},
};
@@ -64,11 +67,14 @@ export default {
<template>
<timeline-entry-item class="note note-wrapper being-posted fade-in-half">
<div class="timeline-icon">
- <user-avatar-link
- :link-href="getUserData.path"
- :img-src="getUserData.avatar_url"
- :img-size="avatarSize"
- />
+ <gl-avatar-link class="gl-mr-3" :href="getUserData.path">
+ <gl-avatar
+ :src="getUserData.avatar_url"
+ :entity-name="getUserData.username"
+ :alt="getUserData.name"
+ :size="avatarSize"
+ />
+ </gl-avatar-link>
</div>
<div ref="note" :class="{ discussion: !note.individual_note }" class="timeline-content">
<div class="note-header">
diff --git a/app/assets/javascripts/vue_shared/components/page_size_selector.vue b/app/assets/javascripts/vue_shared/components/page_size_selector.vue
new file mode 100644
index 00000000000..9783946b786
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/page_size_selector.vue
@@ -0,0 +1,37 @@
+<script>
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { s__, sprintf } from '~/locale';
+
+export const PAGE_SIZES = [20, 50, 100];
+
+export default {
+ components: { GlDropdown, GlDropdownItem },
+ props: {
+ value: {
+ type: Number,
+ required: true,
+ },
+ },
+ methods: {
+ emitInput(pageSize) {
+ this.$emit('input', pageSize);
+ },
+ getPageSizeText(pageSize) {
+ return sprintf(s__('SecurityReports|Show %{pageSize} items'), { pageSize });
+ },
+ },
+ PAGE_SIZES,
+};
+</script>
+
+<template>
+ <gl-dropdown :text="getPageSizeText(value)" right menu-class="gl-w-auto! gl-min-w-0">
+ <gl-dropdown-item
+ v-for="pageSize in $options.PAGE_SIZES"
+ :key="pageSize"
+ @click="emitInput(pageSize)"
+ >
+ <span class="gl-white-space-nowrap">{{ getPageSizeText(pageSize) }}</span>
+ </gl-dropdown-item>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/registry/list_item.vue b/app/assets/javascripts/vue_shared/components/registry/list_item.vue
index a8b250f2041..5516c9943b8 100644
--- a/app/assets/javascripts/vue_shared/components/registry/list_item.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/list_item.vue
@@ -38,6 +38,7 @@ export default {
},
},
mounted() {
+ // eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots
this.detailsSlots = Object.keys(this.$slots).filter((k) => k.startsWith('details-'));
},
methods: {
@@ -55,7 +56,7 @@ export default {
>
<div class="gl-display-flex gl-align-items-center gl-py-3">
<div
- v-if="$slots['left-action']"
+ v-if="$slots['left-action'] /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */"
class="gl-w-7 gl-display-flex gl-justify-content-start gl-pl-2"
>
<slot name="left-action"></slot>
@@ -65,7 +66,9 @@ export default {
>
<div class="gl-display-flex gl-flex-direction-column gl-xs-mb-3 gl-min-w-0 gl-flex-grow-1">
<div
- v-if="$slots['left-primary']"
+ v-if="
+ $slots['left-primary'] /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */
+ "
class="gl-display-flex gl-align-items-center gl-text-body gl-font-weight-bold gl-min-h-6 gl-min-w-0"
>
<slot name="left-primary"></slot>
@@ -79,7 +82,11 @@ export default {
/>
</div>
<div
- v-if="$slots['left-secondary']"
+ v-if="
+ /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */ $slots[
+ 'left-secondary'
+ ]
+ "
class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-min-h-6 gl-min-w-0 gl-flex-grow-1"
>
<slot name="left-secondary"></slot>
@@ -89,13 +96,21 @@ export default {
class="gl-display-flex gl-flex-direction-column gl-sm-align-items-flex-end gl-justify-content-space-between gl-text-gray-500 gl-flex-shrink-0"
>
<div
- v-if="$slots['right-primary']"
+ v-if="
+ /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */ $slots[
+ 'right-primary'
+ ]
+ "
class="gl-display-flex gl-align-items-center gl-sm-text-body gl-sm-font-weight-bold gl-min-h-6"
>
<slot name="right-primary"></slot>
</div>
<div
- v-if="$slots['right-secondary']"
+ v-if="
+ /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */ $slots[
+ 'right-secondary'
+ ]
+ "
class="gl-display-flex gl-align-items-center gl-min-h-6"
>
<slot name="right-secondary"></slot>
@@ -103,7 +118,9 @@ export default {
</div>
</div>
<div
- v-if="$slots['right-action']"
+ v-if="
+ $slots['right-action'] /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */
+ "
class="gl-w-9 gl-display-flex gl-justify-content-end gl-pr-1"
>
<slot name="right-action"></slot>
diff --git a/app/assets/javascripts/vue_shared/components/registry/title_area.vue b/app/assets/javascripts/vue_shared/components/registry/title_area.vue
index fc0976b0792..ad979387596 100644
--- a/app/assets/javascripts/vue_shared/components/registry/title_area.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/title_area.vue
@@ -47,6 +47,7 @@ export default {
methods: {
recalculateMetadataSlots() {
const METADATA_PREFIX = 'metadata-';
+ // eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots
const metadataSlots = Object.keys(this.$slots).filter((k) => k.startsWith(METADATA_PREFIX));
if (!isEqual(metadataSlots, this.metadataSlots)) {
@@ -76,7 +77,9 @@ export default {
</h2>
<div
- v-if="$slots['sub-header']"
+ v-if="
+ $slots['sub-header'] /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */
+ "
class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-mt-3"
>
<slot name="sub-header"></slot>
@@ -107,6 +110,7 @@ export default {
</template>
</div>
</div>
+ <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots -->
<div v-if="$slots['right-actions']" class="gl-mt-3">
<slot name="right-actions"></slot>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js b/app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js
new file mode 100644
index 00000000000..1c08433ee78
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js
@@ -0,0 +1 @@
+// This empty file satisfies the import/no-unresolved rule for ee_else_ce imports.
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js b/app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js
new file mode 100644
index 00000000000..1c08433ee78
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js
@@ -0,0 +1 @@
+// This empty file satisfies the import/no-unresolved rule for ee_else_ce imports.
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js b/app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js
new file mode 100644
index 00000000000..1c08433ee78
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js
@@ -0,0 +1 @@
+// This empty file satisfies the import/no-unresolved rule for ee_else_ce imports.
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
index 5471cda0cc5..0127df730b8 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
@@ -193,7 +193,7 @@ export default {
<gl-dropdown
ref="dropdown"
:text="buttonText"
- class="gl-w-full gl-mt-2"
+ class="gl-w-full"
data-testid="labels-select-dropdown-contents"
data-qa-selector="labels_dropdown_content"
@hide="handleDropdownHide"
diff --git a/app/assets/javascripts/vue_shared/components/slot_switch.vue b/app/assets/javascripts/vue_shared/components/slot_switch.vue
index 67726f01744..641b09e0982 100644
--- a/app/assets/javascripts/vue_shared/components/slot_switch.vue
+++ b/app/assets/javascripts/vue_shared/components/slot_switch.vue
@@ -20,6 +20,7 @@ export default {
computed: {
allSlotNames() {
+ // eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots
return Object.keys(this.$slots);
},
},
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
index 0d78530d878..3ac35abcf3a 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
@@ -45,6 +45,7 @@ export const ROUGE_TO_HLJS_LANGUAGE_MAP = {
haskell: 'haskell',
haxe: 'haxe',
http: 'http',
+ html: 'xml',
hylang: 'hy',
ini: 'ini',
isbl: 'isbl',
@@ -90,7 +91,7 @@ export const ROUGE_TO_HLJS_LANGUAGE_MAP = {
scala: 'scala',
scheme: 'scheme',
scss: 'scss',
- shell: 'shell',
+ shell: 'sh',
smalltalk: 'smalltalk',
sml: 'sml',
sqf: 'sqf',
@@ -112,6 +113,12 @@ export const ROUGE_TO_HLJS_LANGUAGE_MAP = {
yaml: 'yaml',
};
+export const EVENT_ACTION = 'view_source';
+
+export const EVENT_LABEL_VIEWER = 'source_viewer';
+
+export const EVENT_LABEL_FALLBACK = 'legacy_fallback';
+
export const LINES_PER_CHUNK = 70;
export const BIDI_CHARS = [
@@ -138,3 +145,5 @@ export const BIDI_CHAR_TOOLTIP = __(
export const HLJS_COMMENT_SELECTOR = 'hljs-comment';
export const HLJS_ON_AFTER_HIGHLIGHT = 'after:highlight';
+
+export const NPM_URL = 'https://npmjs.com/package';
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js
index c9f7e5508be..5d24a3d110b 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js
@@ -1,5 +1,6 @@
import { HLJS_ON_AFTER_HIGHLIGHT } from '../constants';
import wrapComments from './wrap_comments';
+import linkDependencies from './link_dependencies';
/**
* Registers our plugins for Highlight.js
@@ -8,6 +9,9 @@ import wrapComments from './wrap_comments';
*
* @param {Object} hljs - the Highlight.js instance.
*/
-export const registerPlugins = (hljs) => {
+export const registerPlugins = (hljs, fileType, rawContent) => {
hljs.addPlugin({ [HLJS_ON_AFTER_HIGHLIGHT]: wrapComments });
+ hljs.addPlugin({
+ [HLJS_ON_AFTER_HIGHLIGHT]: (result) => linkDependencies(result, fileType, rawContent),
+ });
};
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js
new file mode 100644
index 00000000000..5b7650c56ae
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js
@@ -0,0 +1,25 @@
+import packageJsonLinker from './utils/package_json_linker';
+
+const DEPENDENCY_LINKERS = {
+ package_json: packageJsonLinker,
+};
+
+/**
+ * Highlight.js plugin for generating links to dependencies when viewing dependency files.
+ *
+ * Plugin API: https://github.com/highlightjs/highlight.js/blob/main/docs/plugin-api.rst
+ *
+ * @param {Object} result - an object that represents the highlighted result from Highlight.js
+ * @param {String} fileType - a string containing the file type
+ * @param {String} rawContent - raw (non-highlighted) file content
+ */
+export default (result, fileType, rawContent) => {
+ if (DEPENDENCY_LINKERS[fileType]) {
+ try {
+ // eslint-disable-next-line no-param-reassign
+ result.value = DEPENDENCY_LINKERS[fileType](result, rawContent);
+ } catch (e) {
+ // Shallowed (do nothing), in this case the original unlinked dependencies will be rendered.
+ }
+ }
+};
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js
new file mode 100644
index 00000000000..56ad55ef553
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js
@@ -0,0 +1,15 @@
+import { escape } from 'lodash';
+import { setAttributes } from '~/lib/utils/dom_utils';
+
+export const createLink = (href, innerText) => {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ const rel = 'nofollow noreferrer noopener';
+ const link = document.createElement('a');
+
+ setAttributes(link, { href: escape(href), rel });
+ link.innerText = escape(innerText);
+
+ return link.outerHTML;
+};
+
+export const generateHLJSOpenTag = (type) => `<span class="hljs-${escape(type)}">&quot;`;
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/package_json_linker.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/package_json_linker.js
new file mode 100644
index 00000000000..d013d077ba3
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/package_json_linker.js
@@ -0,0 +1,46 @@
+import { joinPaths } from '~/lib/utils/url_utility';
+import { NPM_URL } from '../../constants';
+import { createLink, generateHLJSOpenTag } from './dependency_linker_util';
+
+const attrOpenTag = generateHLJSOpenTag('attr');
+const stringOpenTag = generateHLJSOpenTag('string');
+const closeTag = '&quot;</span>';
+const DEPENDENCY_REGEX = new RegExp(
+ /*
+ * Detects dependencies inside of content that is highlighted by Highlight.js
+ * Example: <span class="hljs-attr">&quot;@babel/core&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;^7.18.5&quot;</span>
+ * Group 1: @babel/core
+ * Group 2: ^7.18.5
+ */
+ `${attrOpenTag}(.*)${closeTag}.*${stringOpenTag}(.*[0-9].*)(${closeTag})`,
+ 'gm',
+);
+
+const handleReplace = (original, packageName, version, dependenciesToLink) => {
+ const href = joinPaths(NPM_URL, packageName);
+ const packageLink = createLink(href, packageName);
+ const versionLink = createLink(href, version);
+ const closeAndOpenTag = `${closeTag}: ${attrOpenTag}`;
+ const dependencyToLink = dependenciesToLink[packageName];
+
+ if (dependencyToLink && dependencyToLink === version) {
+ return `${attrOpenTag}${packageLink}${closeAndOpenTag}${versionLink}${closeTag}`;
+ }
+
+ return original;
+};
+
+export default (result, raw) => {
+ const { dependencies, devDependencies, peerDependencies, optionalDependencies } = JSON.parse(raw);
+
+ const dependenciesToLink = {
+ ...dependencies,
+ ...devDependencies,
+ ...peerDependencies,
+ ...optionalDependencies,
+ };
+
+ return result.value.replace(DEPENDENCY_REGEX, (original, packageName, version) =>
+ handleReplace(original, packageName, version, dependenciesToLink),
+ );
+};
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
index f819a9e5be2..1bdae40332f 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
@@ -3,7 +3,14 @@ import { GlSafeHtmlDirective, GlLoadingIcon } from '@gitlab/ui';
import LineHighlighter from '~/blob/line_highlighter';
import eventHub from '~/notes/event_hub';
import languageLoader from '~/content_editor/services/highlight_js_language_loader';
-import { ROUGE_TO_HLJS_LANGUAGE_MAP, LINES_PER_CHUNK } from './constants';
+import Tracking from '~/tracking';
+import {
+ EVENT_ACTION,
+ EVENT_LABEL_VIEWER,
+ EVENT_LABEL_FALLBACK,
+ ROUGE_TO_HLJS_LANGUAGE_MAP,
+ LINES_PER_CHUNK,
+} from './constants';
import Chunk from './components/chunk.vue';
import { registerPlugins } from './plugins/index';
@@ -23,6 +30,7 @@ export default {
directives: {
SafeHtml: GlSafeHtmlDirective,
},
+ mixins: [Tracking.mixin()],
props: {
blob: {
type: Object,
@@ -49,8 +57,22 @@ export default {
lineNumbers() {
return this.splitContent.length;
},
+ unsupportedLanguage() {
+ const supportedLanguages = Object.keys(languageLoader);
+ return (
+ !supportedLanguages.includes(this.language) &&
+ !supportedLanguages.includes(this.blob.language)
+ );
+ },
},
async created() {
+ this.trackEvent(EVENT_LABEL_VIEWER);
+
+ if (this.unsupportedLanguage) {
+ this.handleUnsupportedLanguage();
+ return;
+ }
+
this.generateFirstChunk();
this.hljs = await this.loadHighlightJS();
@@ -70,6 +92,13 @@ export default {
});
},
methods: {
+ trackEvent(label) {
+ this.track(EVENT_ACTION, { label, property: this.blob.language });
+ },
+ handleUnsupportedLanguage() {
+ this.trackEvent(EVENT_LABEL_FALLBACK);
+ this.$emit('error');
+ },
generateFirstChunk() {
const lines = this.splitContent.splice(0, LINES_PER_CHUNK);
this.firstChunk = this.createChunk(lines);
@@ -112,7 +141,7 @@ export default {
let detectedLanguage = language;
let highlightedContent;
if (this.hljs) {
- registerPlugins(this.hljs);
+ registerPlugins(this.hljs, this.blob.fileType, this.content);
if (!detectedLanguage) {
const hljsHighlightAuto = this.hljs.highlightAuto(content);
highlightedContent = hljsHighlightAuto.value;
diff --git a/app/assets/javascripts/vue_shared/components/usage_quotas/usage_banner.vue b/app/assets/javascripts/vue_shared/components/usage_quotas/usage_banner.vue
index 20a666509a4..779a2ab5461 100644
--- a/app/assets/javascripts/vue_shared/components/usage_quotas/usage_banner.vue
+++ b/app/assets/javascripts/vue_shared/components/usage_quotas/usage_banner.vue
@@ -1,7 +1,6 @@
<script>
import { GlSkeletonLoader } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
-import { s__ } from '~/locale';
export default {
name: 'UsageBanner',
@@ -15,13 +14,6 @@ export default {
default: false,
},
},
- i18n: {
- dependencyProxy: s__('UsageQuota|Dependency proxy'),
- storageUsed: s__('UsageQuota|Storage used'),
- dependencyProxyMessage: s__(
- 'UsageQuota|Local proxy used for frequently-accessed upstream Docker images. %{linkStart}More information%{linkEnd}',
- ),
- },
storageUsageQuotaHelpPage: helpPagePath('user/usage_quotas'),
};
</script>
@@ -33,13 +25,21 @@ export default {
>
<div class="gl-display-flex gl-flex-direction-column gl-xs-mb-3 gl-min-w-0 gl-flex-grow-1">
<div
- v-if="$slots['left-primary-text']"
+ v-if="
+ /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */ $slots[
+ 'left-primary-text'
+ ]
+ "
class="gl-display-flex gl-align-items-center gl-text-body gl-font-weight-bold gl-min-h-6 gl-min-w-0"
>
<slot name="left-primary-text"></slot>
</div>
<div
- v-if="$slots['left-secondary-text']"
+ v-if="
+ /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */ $slots[
+ 'left-secondary-text'
+ ]
+ "
class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-min-h-6 gl-min-w-0 gl-flex-grow-1 gl-w-70p gl-md-max-w-70p"
>
<slot name="left-secondary-text"></slot>
@@ -49,13 +49,21 @@ export default {
class="gl-display-flex gl-flex-direction-column gl-sm-align-items-flex-end gl-justify-content-space-between gl-text-gray-500 gl-flex-shrink-0"
>
<div
- v-if="$slots['right-primary-text']"
+ v-if="
+ /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */ $slots[
+ 'right-primary-text'
+ ]
+ "
class="gl-display-flex gl-align-items-center gl-sm-text-body gl-sm-font-weight-bold gl-min-h-6"
>
<slot name="right-primary-text"></slot>
</div>
<div
- v-if="$slots['right-secondary-text']"
+ v-if="
+ /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */ $slots[
+ 'right-secondary-text'
+ ]
+ "
class="gl-display-flex gl-align-items-center gl-min-h-6"
>
<slot v-if="!loading" name="right-secondary-text"></slot>
diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue
index c58a5357883..707b0bbec67 100644
--- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue
+++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue
@@ -96,7 +96,10 @@ export default {
/>
<gl-tooltip
- v-if="tooltipText || $slots.default"
+ v-if="
+ tooltipText ||
+ $slots.default /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */
+ "
:target="() => $refs.userAvatar.$el"
:placement="tooltipPlacement"
boundary="window"
diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue
index 15ba8e3b39b..6e8c200d5c3 100644
--- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue
+++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue
@@ -100,7 +100,10 @@ export default {
class="avatar"
/>
<gl-tooltip
- v-if="tooltipText || $slots.default"
+ v-if="
+ tooltipText ||
+ $slots.default /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */
+ "
:target="() => $refs.userAvatarImage"
:placement="tooltipPlacement"
boundary="window"
diff --git a/app/assets/javascripts/vue_shared/components/user_callout_dismisser.vue b/app/assets/javascripts/vue_shared/components/user_callout_dismisser.vue
index 121c3bd94ef..ab5ddbc8af8 100644
--- a/app/assets/javascripts/vue_shared/components/user_callout_dismisser.vue
+++ b/app/assets/javascripts/vue_shared/components/user_callout_dismisser.vue
@@ -56,7 +56,13 @@ import getUserCalloutsQuery from '~/graphql_shared/queries/get_user_callouts.que
* - shouldShowCallout: boolean
* - A combination of the above which should cover 95% of use cases: `true`
* if the query has loaded without error, and the user is logged in, and
- * the callout has not been dismissed yet; `false` otherwise.
+ * the callout has not been dismissed yet; `false` otherwise
+ *
+ * The component emits a `queryResult` event when the GraphQL query
+ * completes. The payload is a combination of the ApolloQueryResult object and
+ * this component's `slotProps` computed property. This is useful for things
+ * like cleaning up/unmounting the component if the callout shouldn't be
+ * displayed.
*/
export default {
name: 'UserCalloutDismisser',
@@ -86,6 +92,9 @@ export default {
update(data) {
return data?.currentUser;
},
+ result(data) {
+ this.$emit('queryResult', { ...data, ...this.slotProps });
+ },
error(err) {
this.queryError = err;
},
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 768cd005727..a0d8ca117a4 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
@@ -7,13 +7,13 @@ import {
GlSafeHtmlDirective,
GlSprintf,
GlButton,
+ GlAvatarLabeled,
} from '@gitlab/ui';
import { __ } from '~/locale';
-import UserNameWithStatus from '~/sidebar/components/assignees/user_name_with_status.vue';
import { glEmojiTag } from '~/emoji';
import createFlash from '~/flash';
import { followUser, unfollowUser } from '~/rest_api';
-import UserAvatarImage from '../user_avatar/user_avatar_image.vue';
+import { isUserBusy } from '~/set_status_modal/utils';
import { USER_POPOVER_DELAY } from './constants';
const MAX_SKELETON_LINES = 4;
@@ -22,15 +22,17 @@ export default {
name: 'UserPopover',
maxSkeletonLines: MAX_SKELETON_LINES,
USER_POPOVER_DELAY,
+ i18n: {
+ busy: __('Busy'),
+ },
components: {
GlIcon,
GlLink,
GlPopover,
GlSkeletonLoader,
- UserAvatarImage,
- UserNameWithStatus,
GlSprintf,
GlButton,
+ GlAvatarLabeled,
},
directives: {
SafeHtml: GlSafeHtmlDirective,
@@ -95,6 +97,15 @@ export default {
toggleFollowButtonVariant() {
return this.user?.isFollowed ? 'default' : 'confirm';
},
+ hasPronouns() {
+ return Boolean(this.user?.pronouns?.trim());
+ },
+ isBusy() {
+ return isUserBusy(this.availabilityStatus);
+ },
+ username() {
+ return `@${this.user?.username}`;
+ },
},
methods: {
async toggleFollow() {
@@ -149,43 +160,46 @@ export default {
:placement="placement"
boundary="viewport"
triggers="hover focus manual"
+ data-testid="user-popover"
>
- <div class="gl-py-3 gl-line-height-normal gl-display-flex" data-testid="user-popover">
- <div class="gl-mr-4 gl-flex-shrink-0">
- <user-avatar-image :img-src="user.avatarUrl" :size="64" css-classes="gl-m-0!" />
+ <div class="gl-mb-3">
+ <div v-if="userIsLoading" class="gl-w-20">
+ <gl-skeleton-loader :width="160" :height="64">
+ <rect x="70" y="19" rx="3" ry="3" width="88" height="9" />
+ <rect x="70" y="36" rx="3" ry="3" width="64" height="8" />
+ <circle cx="32" cy="32" r="32" />
+ </gl-skeleton-loader>
</div>
- <div class="gl-w-full gl-word-break-word gl-display-flex gl-align-items-center">
- <template v-if="userIsLoading">
- <gl-skeleton-loader
- :lines="$options.maxSkeletonLines"
- preserve-aspect-ratio="none"
- equal-width-lines
- :height="52"
- />
- </template>
- <template v-else>
- <div>
- <h5 class="gl-m-0">
- <user-name-with-status
- :name="user.name"
- :availability="availabilityStatus"
- :pronouns="user.pronouns"
- />
- </h5>
- <span class="gl-text-gray-500">@{{ user.username }}</span>
- <div v-if="shouldRenderToggleFollowButton" class="gl-mt-3">
- <gl-button
- :variant="toggleFollowButtonVariant"
- :loading="toggleFollowLoading"
- size="small"
- data-testid="toggle-follow-button"
- @click="toggleFollow"
- >{{ toggleFollowButtonText }}</gl-button
- >
- </div>
- </div>
+ <gl-avatar-labeled
+ v-else
+ :size="64"
+ :src="user.avatarUrl"
+ :label="user.name"
+ :sub-label="username"
+ >
+ <gl-button
+ v-if="shouldRenderToggleFollowButton"
+ class="gl-mt-3 gl-align-self-start"
+ :variant="toggleFollowButtonVariant"
+ :loading="toggleFollowLoading"
+ size="small"
+ data-testid="toggle-follow-button"
+ @click="toggleFollow"
+ >{{ toggleFollowButtonText }}</gl-button
+ >
+
+ <template #meta>
+ <span
+ v-if="hasPronouns"
+ class="gl-text-gray-500 gl-font-sm gl-font-weight-normal gl-p-1"
+ data-testid="user-popover-pronouns"
+ >({{ user.pronouns }})</span
+ >
+ <span v-if="isBusy" class="gl-text-gray-500 gl-font-sm gl-font-weight-normal gl-p-1"
+ >({{ $options.i18n.busy }})</span
+ >
</template>
- </div>
+ </gl-avatar-labeled>
</div>
<div class="gl-mt-2 gl-w-full gl-word-break-word">
<template v-if="userIsLoading">
diff --git a/app/assets/javascripts/vue_shared/components/vuex_module_provider.vue b/app/assets/javascripts/vue_shared/components/vuex_module_provider.vue
index eff39e2fb89..4ef9bc07b1c 100644
--- a/app/assets/javascripts/vue_shared/components/vuex_module_provider.vue
+++ b/app/assets/javascripts/vue_shared/components/vuex_module_provider.vue
@@ -15,7 +15,7 @@ export default {
},
},
render() {
- return this.$slots.default;
+ return this.$scopedSlots.default?.();
},
};
</script>
diff --git a/app/assets/javascripts/vue_shared/issuable/create/components/issuable_form.vue b/app/assets/javascripts/vue_shared/issuable/create/components/issuable_form.vue
index 89eecea5239..25799171905 100644
--- a/app/assets/javascripts/vue_shared/issuable/create/components/issuable_form.vue
+++ b/app/assets/javascripts/vue_shared/issuable/create/components/issuable_form.vue
@@ -81,7 +81,8 @@ export default {
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"
+ class="note-textarea rspec-issuable-form-description js-gfm-input js-autosize markdown-area"
+ data-qa-selector="issuable_form_description_field"
:aria-label="__('Description')"
:placeholder="__('Write a comment or drag your files here…')"
></textarea>
diff --git a/app/assets/javascripts/vue_shared/issuable/list/components/issuable_item.vue b/app/assets/javascripts/vue_shared/issuable/list/components/issuable_item.vue
index a9f8caa3e1f..b616b390032 100644
--- a/app/assets/javascripts/vue_shared/issuable/list/components/issuable_item.vue
+++ b/app/assets/javascripts/vue_shared/issuable/list/components/issuable_item.vue
@@ -86,7 +86,18 @@ export default {
createdAt() {
return getTimeago().format(this.issuable.createdAt);
},
- updatedAt() {
+ timestamp() {
+ if (this.issuable.state === 'closed' && this.issuable.closedAt) {
+ return this.issuable.closedAt;
+ }
+ return this.issuable.updatedAt;
+ },
+ formattedTimestamp() {
+ if (this.issuable.state === 'closed' && this.issuable.closedAt) {
+ return sprintf(__('closed %{timeago}'), {
+ timeago: getTimeago().format(this.issuable.closedAt),
+ });
+ }
return sprintf(__('updated %{timeAgo}'), {
timeAgo: getTimeago().format(this.issuable.updatedAt),
});
@@ -134,6 +145,7 @@ export default {
},
methods: {
hasSlotContents(slotName) {
+ // eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots
return Boolean(this.$slots[slotName]);
},
scopedLabel(label) {
@@ -311,10 +323,10 @@ export default {
<div
v-gl-tooltip.bottom
class="gl-text-gray-500 gl-display-none gl-sm-display-inline-block"
- :title="tooltipTitle(issuable.updatedAt)"
- data-testid="issuable-updated-at"
+ :title="tooltipTitle(timestamp)"
+ data-testid="issuable-timestamp"
>
- {{ updatedAt }}
+ {{ formattedTimestamp }}
</div>
</div>
</li>
diff --git a/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue b/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue
index 8fbf0bb10a0..189bbb56432 100644
--- a/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue
+++ b/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue
@@ -1,11 +1,13 @@
<script>
import { GlAlert, GlKeysetPagination, GlSkeletonLoader, GlPagination } from '@gitlab/ui';
import { uniqueId } from 'lodash';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+import PageSizeSelector from '~/vue_shared/components/page_size_selector.vue';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { updateHistory, setUrlParams } from '~/lib/utils/url_utility';
import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
-import { DEFAULT_SKELETON_COUNT } from '../constants';
+import { DEFAULT_SKELETON_COUNT, PAGE_SIZE_STORAGE_KEY } from '../constants';
import IssuableBulkEditSidebar from './issuable_bulk_edit_sidebar.vue';
import IssuableItem from './issuable_item.vue';
import IssuableTabs from './issuable_tabs.vue';
@@ -29,6 +31,8 @@ export default {
IssuableBulkEditSidebar,
GlPagination,
VueDraggable,
+ PageSizeSelector,
+ LocalStorageSync,
},
props: {
namespace: {
@@ -173,6 +177,11 @@ export default {
required: false,
default: false,
},
+ showPageSizeChangeControls: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -262,7 +271,11 @@ export default {
handleVueDraggableUpdate({ newIndex, oldIndex }) {
this.$emit('reorder', { newIndex, oldIndex });
},
+ handlePageSizeChange(newPageSize) {
+ this.$emit('page-size-change', newPageSize);
+ },
},
+ PAGE_SIZE_STORAGE_KEY,
};
</script>
@@ -353,24 +366,38 @@ export default {
<slot v-else name="empty-state"></slot>
</template>
- <div v-if="showPaginationControls && useKeysetPagination" class="gl-text-center gl-mt-3">
+ <div class="gl-text-center gl-mt-6 gl-relative">
<gl-keyset-pagination
+ v-if="showPaginationControls && useKeysetPagination"
:has-next-page="hasNextPage"
:has-previous-page="hasPreviousPage"
@next="$emit('next-page')"
@prev="$emit('previous-page')"
/>
+ <gl-pagination
+ v-else-if="showPaginationControls"
+ :per-page="defaultPageSize"
+ :total-items="totalItems"
+ :value="currentPage"
+ :prev-page="previousPage"
+ :next-page="nextPage"
+ align="center"
+ class="gl-pagination gl-mt-3"
+ @input="$emit('page-change', $event)"
+ />
+
+ <local-storage-sync
+ v-if="showPageSizeChangeControls"
+ :value="defaultPageSize"
+ :storage-key="$options.PAGE_SIZE_STORAGE_KEY"
+ @input="handlePageSizeChange"
+ >
+ <page-size-selector
+ :value="defaultPageSize"
+ class="gl-absolute gl-right-0"
+ @input="handlePageSizeChange"
+ />
+ </local-storage-sync>
</div>
- <gl-pagination
- v-else-if="showPaginationControls"
- :per-page="defaultPageSize"
- :total-items="totalItems"
- :value="currentPage"
- :prev-page="previousPage"
- :next-page="nextPage"
- align="center"
- class="gl-pagination gl-mt-3"
- @input="$emit('page-change', $event)"
- />
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/issuable/list/constants.js b/app/assets/javascripts/vue_shared/issuable/list/constants.js
index be9afc0610d..507f333a34e 100644
--- a/app/assets/javascripts/vue_shared/issuable/list/constants.js
+++ b/app/assets/javascripts/vue_shared/issuable/list/constants.js
@@ -56,3 +56,5 @@ export const IssuableTypes = {
export const DEFAULT_PAGE_SIZE = 20;
export const DEFAULT_SKELETON_COUNT = 5;
+
+export const PAGE_SIZE_STORAGE_KEY = 'issuable_list_page_size';
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_description.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_description.vue
index f57b5b2deb4..d4e9120ff17 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_description.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_description.vue
@@ -37,7 +37,11 @@ export default {
</script>
<template>
- <div class="description" :class="{ 'js-task-list-container': canEdit && enableTaskList }">
+ <div
+ class="description"
+ :class="{ 'js-task-list-container': canEdit && enableTaskList }"
+ data-qa-selector="description_content"
+ >
<div ref="gfmContainer" v-safe-html="issuable.descriptionHtml" class="md"></div>
<textarea
v-if="issuable.description && enableTaskList"
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue
index 33dca3e9332..2fc1f935501 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue
@@ -123,7 +123,6 @@ export default {
:placeholder="__('Title')"
:aria-label="__('Title')"
:autofocus="true"
- class="qa-title-input"
@keydown="handleKeydown($event, 'title')"
/>
</gl-form-group>
@@ -149,7 +148,7 @@ export default {
:data-supports-quick-actions="enableAutocomplete"
:aria-label="__('Description')"
:placeholder="__('Write a comment or drag your files here…')"
- class="note-textarea js-gfm-input js-autosize markdown-area qa-description-textarea"
+ class="note-textarea js-gfm-input js-autosize markdown-area"
dir="auto"
@keydown="handleKeydown($event, 'description')"
></textarea>
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
index f035795a045..cdc5903b934 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
@@ -112,7 +112,7 @@ export default {
<gl-icon v-if="statusIcon" :name="statusIcon" :class="statusIconClass" />
<span class="gl-display-none gl-sm-display-block"><slot name="status-badge"></slot></span>
</gl-badge>
- <div class="issuable-meta gl-display-flex gl-align-items-center d-md-inline-block">
+ <div class="issuable-meta gl-display-flex! gl-align-items-center">
<div v-if="blocked || confidential" class="gl-display-inline-block">
<div v-if="blocked" data-testid="blocked" class="issuable-warning-icon inline">
<gl-icon name="lock" :aria-label="__('Blocked')" />
@@ -139,13 +139,15 @@ export default {
:size="24"
:src="author.avatarUrl"
:label="author.name"
- class="d-none d-sm-inline-flex gl-mx-1"
+ :class="[{ 'gl-display-none': !isAuthorExternal }, 'gl-sm-display-inline-flex gl-mx-1']"
>
<template #meta>
- <gl-icon v-if="isAuthorExternal" name="external-link" />
+ <gl-icon v-if="isAuthorExternal" name="external-link" class="gl-ml-1" />
</template>
</gl-avatar-labeled>
- <strong class="author d-sm-none d-inline">@{{ author.username }}</strong>
+ <strong v-if="author.username" class="author gl-display-inline gl-sm-display-none!"
+ >@{{ author.username }}</strong
+ >
</gl-avatar-link>
<span
v-if="taskCompletionStatus && hasTasks"
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue
index 3d7c71ce974..35124bd15d2 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue
@@ -64,8 +64,9 @@ export default {
<div class="title-container">
<h1
v-safe-html="issuable.titleHtml || issuable.title"
- class="title qa-title gl-font-size-h-display"
+ class="title gl-font-size-h-display"
dir="auto"
+ data-qa-selector="title_content"
data-testid="title"
></h1>
<gl-button
@@ -74,7 +75,7 @@ export default {
:title="$options.i18n.editTitleAndDescription"
:aria-label="$options.i18n.editTitleAndDescription"
icon="pencil"
- class="btn-edit js-issuable-edit qa-edit-button"
+ class="btn-edit js-issuable-edit"
@click="$emit('edit-issuable', $event)"
/>
</div>
diff --git a/app/assets/javascripts/work_items/components/item_state.vue b/app/assets/javascripts/work_items/components/item_state.vue
index 69670d3471c..2dc8e3a1101 100644
--- a/app/assets/javascripts/work_items/components/item_state.vue
+++ b/app/assets/javascripts/work_items/components/item_state.vue
@@ -54,7 +54,7 @@ export default {
:label-for="$options.labelId"
label-cols="3"
label-cols-lg="2"
- label-class="gl-pb-0!"
+ label-class="gl-pb-0! gl-overflow-wrap-break"
class="gl-align-items-center"
>
<gl-form-select
diff --git a/app/assets/javascripts/work_items/components/item_title.vue b/app/assets/javascripts/work_items/components/item_title.vue
index ce2fa158596..1cdc9c28f05 100644
--- a/app/assets/javascripts/work_items/components/item_title.vue
+++ b/app/assets/javascripts/work_items/components/item_title.vue
@@ -1,5 +1,4 @@
<script>
-import { escape } from 'lodash';
import { __ } from '~/locale';
export default {
@@ -21,15 +20,11 @@ export default {
},
},
methods: {
- getSanitizedTitle(inputEl) {
- const { innerText } = inputEl;
- return escape(innerText);
- },
handleBlur({ target }) {
- this.$emit('title-changed', this.getSanitizedTitle(target));
+ this.$emit('title-changed', target.innerText);
},
handleInput({ target }) {
- this.$emit('title-input', this.getSanitizedTitle(target));
+ this.$emit('title-input', target.innerText);
},
handleSubmit() {
this.$refs.titleEl.blur();
@@ -40,7 +35,7 @@ export default {
<template>
<h2
- class="gl-font-weight-normal gl-sm-font-weight-bold gl-my-5 gl-w-full"
+ class="gl-font-weight-normal gl-sm-font-weight-bold gl-mb-5 gl-mt-0 gl-w-full"
:class="{ 'gl-cursor-not-allowed': disabled }"
aria-labelledby="item-title"
>
diff --git a/app/assets/javascripts/work_items/components/work_item_actions.vue b/app/assets/javascripts/work_items/components/work_item_actions.vue
index 31e4a932c5a..77002eeaf55 100644
--- a/app/assets/javascripts/work_items/components/work_item_actions.vue
+++ b/app/assets/javascripts/work_items/components/work_item_actions.vue
@@ -5,7 +5,7 @@ import Tracking from '~/tracking';
export default {
i18n: {
- deleteWorkItem: s__('WorkItem|Delete work item'),
+ deleteTask: s__('WorkItem|Delete task'),
},
components: {
GlDropdown,
@@ -54,7 +54,7 @@ export default {
right
>
<gl-dropdown-item v-gl-modal="'work-item-confirm-delete'">{{
- $options.i18n.deleteWorkItem
+ $options.i18n.deleteTask
}}</gl-dropdown-item>
</gl-dropdown>
<gl-modal
@@ -66,9 +66,7 @@ export default {
@hide="handleCancelDeleteWorkItem"
>
{{
- s__(
- 'WorkItem|Are you sure you want to delete the work item? This action cannot be reversed.',
- )
+ s__('WorkItem|Are you sure you want to delete the task? This action cannot be reversed.')
}}
</gl-modal>
</div>
diff --git a/app/assets/javascripts/work_items/components/work_item_assignees.vue b/app/assets/javascripts/work_items/components/work_item_assignees.vue
index 4d1c171772e..9ff424aa20f 100644
--- a/app/assets/javascripts/work_items/components/work_item_assignees.vue
+++ b/app/assets/javascripts/work_items/components/work_item_assignees.vue
@@ -1,10 +1,35 @@
<script>
-import { GlTokenSelector, GlIcon, GlAvatar, GlLink } from '@gitlab/ui';
+import {
+ GlTokenSelector,
+ GlIcon,
+ GlAvatar,
+ GlLink,
+ GlSkeletonLoader,
+ GlButton,
+ GlDropdownItem,
+ GlDropdownDivider,
+} from '@gitlab/ui';
+import { debounce } from 'lodash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import currentUserQuery from '~/graphql_shared/queries/current_user.query.graphql';
+import userSearchQuery from '~/graphql_shared/queries/users_search.query.graphql';
+import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue';
+import { n__, s__ } from '~/locale';
+import Tracking from '~/tracking';
+import SidebarParticipant from '~/sidebar/components/assignees/sidebar_participant.vue';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import localUpdateWorkItemMutation from '../graphql/local_update_work_item.mutation.graphql';
+import { i18n, TRACKING_CATEGORY_SHOW } from '../constants';
-function isClosingIcon(el) {
- return el?.classList.contains('gl-token-close');
+function isTokenSelectorElement(el) {
+ return el?.classList.contains('gl-token-close') || el?.classList.contains('dropdown-item');
+}
+
+function addClass(el) {
+ return {
+ ...el,
+ class: 'gl-bg-transparent',
+ };
}
export default {
@@ -13,7 +38,15 @@ export default {
GlIcon,
GlAvatar,
GlLink,
+ GlSkeletonLoader,
+ GlButton,
+ SidebarParticipant,
+ InviteMembersTrigger,
+ GlDropdownItem,
+ GlDropdownDivider,
},
+ mixins: [Tracking.mixin()],
+ inject: ['fullPath'],
props: {
workItemId: {
type: String,
@@ -23,67 +56,188 @@ export default {
type: Array,
required: true,
},
+ allowsMultipleAssignees: {
+ type: Boolean,
+ required: true,
+ },
+ workItemType: {
+ type: String,
+ required: true,
+ },
+ canUpdate: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
isEditing: false,
- localAssignees: this.assignees.map((assignee) => ({
- ...assignee,
- class: 'gl-bg-transparent!',
- })),
+ searchStarted: false,
+ localAssignees: this.assignees.map(addClass),
+ searchKey: '',
+ searchUsers: [],
+ currentUser: null,
};
},
+ apollo: {
+ searchUsers: {
+ query() {
+ return userSearchQuery;
+ },
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ search: this.searchKey,
+ };
+ },
+ skip() {
+ return !this.searchStarted;
+ },
+ update(data) {
+ return data.workspace?.users?.nodes.map((node) => addClass({ ...node, ...node.user }));
+ },
+ error() {
+ this.$emit('error', i18n.fetchError);
+ },
+ },
+ currentUser: {
+ query: currentUserQuery,
+ },
+ },
computed: {
- assigneeIds() {
- return this.localAssignees.map((assignee) => assignee.id);
+ tracking() {
+ return {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_assignees',
+ property: `type_${this.workItemType}`,
+ };
},
assigneeListEmpty() {
return this.assignees.length === 0;
},
containerClass() {
- return !this.isEditing ? 'gl-shadow-none! gl-bg-transparent!' : '';
+ return !this.isEditing ? 'gl-shadow-none!' : '';
+ },
+ isLoadingUsers() {
+ return this.$apollo.queries.searchUsers.loading;
+ },
+ assigneeText() {
+ return n__('WorkItem|Assignee', 'WorkItem|Assignees', this.localAssignees.length);
+ },
+ dropdownItems() {
+ if (this.currentUser && this.searchEmpty) {
+ if (this.searchUsers.some((user) => user.username === this.currentUser.username)) {
+ return this.moveCurrentUserToStart(this.searchUsers);
+ }
+ return [this.currentUser, ...this.searchUsers];
+ }
+ return this.searchUsers;
+ },
+ searchEmpty() {
+ return this.searchKey.length === 0;
+ },
+ addAssigneesText() {
+ return this.allowsMultipleAssignees
+ ? s__('WorkItem|Add assignees')
+ : s__('WorkItem|Add assignee');
},
},
+ watch: {
+ assignees(newVal) {
+ if (!this.isEditing) {
+ this.localAssignees = newVal.map(addClass);
+ }
+ },
+ },
+ created() {
+ this.debouncedSearchKeyUpdate = debounce(this.setSearchKey, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ },
methods: {
getUserId(id) {
return getIdFromGraphQLId(id);
},
- setAssignees(e) {
- if (isClosingIcon(e.relatedTarget) || !this.isEditing) return;
+ handleAssigneesInput(assignees) {
+ if (!this.allowsMultipleAssignees) {
+ this.localAssignees = assignees.length > 0 ? [assignees[assignees.length - 1]] : [];
+ this.isEditing = false;
+ return;
+ }
+ this.localAssignees = assignees;
+ this.focusTokenSelector();
+ },
+ handleBlur(e) {
+ if (isTokenSelectorElement(e.relatedTarget) || !this.isEditing) return;
this.isEditing = false;
+ this.setAssignees(this.localAssignees);
+ },
+ setAssignees(assignees) {
this.$apollo.mutate({
mutation: localUpdateWorkItemMutation,
variables: {
input: {
id: this.workItemId,
- assigneeIds: this.assigneeIds,
+ assignees,
},
},
});
+ this.track('updated_assignees');
},
- async focusTokenSelector() {
+ handleFocus() {
this.isEditing = true;
+ this.searchStarted = true;
+ },
+ async focusTokenSelector() {
+ this.handleFocus();
await this.$nextTick();
this.$refs.tokenSelector.focusTextInput();
},
+ handleMouseOver() {
+ this.timeout = setTimeout(() => {
+ this.searchStarted = true;
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ },
+ handleMouseOut() {
+ clearTimeout(this.timeout);
+ },
+ setSearchKey(value) {
+ this.searchKey = value;
+ },
+ moveCurrentUserToStart(users = []) {
+ if (this.currentUser) {
+ return [this.currentUser, ...users.filter((user) => user.id !== this.currentUser.id)];
+ }
+ return users;
+ },
+ closeDropdown() {
+ this.$refs.tokenSelector.closeDropdown();
+ },
},
};
</script>
<template>
- <div class="gl-display-flex gl-mb-4 work-item-assignees gl-relative">
- <span class="gl-font-weight-bold gl-w-15 gl-pt-2" data-testid="assignees-title">{{
- __('Assignee(s)')
- }}</span>
+ <div class="form-row gl-mb-5 work-item-assignees gl-relative">
+ <span
+ class="gl-font-weight-bold col-lg-2 col-3 gl-pt-2 min-w-fit-content gl-overflow-wrap-break"
+ data-testid="assignees-title"
+ >{{ assigneeText }}</span
+ >
<gl-token-selector
ref="tokenSelector"
- v-model="localAssignees"
- hide-dropdown-with-no-items
+ :selected-tokens="localAssignees"
:container-class="containerClass"
- class="gl-w-full gl-border gl-border-white gl-hover-border-gray-200 gl-rounded-base"
- @token-remove="focusTokenSelector"
- @focus="isEditing = true"
- @blur="setAssignees"
+ class="assignees-selector gl-flex-grow-1 gl-border gl-border-white gl-rounded-base col-9 gl-align-self-start gl-px-0!"
+ :class="{ 'gl-hover-border-gray-200': canUpdate }"
+ :dropdown-items="dropdownItems"
+ :loading="isLoadingUsers"
+ :view-only="!canUpdate"
+ @input="handleAssigneesInput"
+ @text-input="debouncedSearchKeyUpdate"
+ @focus="handleFocus"
+ @blur="handleBlur"
+ @mouseover.native="handleMouseOver"
+ @mouseout.native="handleMouseOut"
>
<template #empty-placeholder>
<div
@@ -91,7 +245,15 @@ export default {
data-testid="empty-state"
>
<gl-icon name="profile" />
- <span class="gl-ml-2">{{ __('Add assignees') }}</span>
+ <span class="gl-ml-2 gl-mr-4">{{ addAssigneesText }}</span>
+ <gl-button
+ v-if="currentUser"
+ size="small"
+ class="assign-myself"
+ data-testid="assign-self"
+ @click.stop="setAssignees([currentUser])"
+ >{{ __('Assign myself') }}</gl-button
+ >
</div>
</template>
<template #token-content="{ token }">
@@ -106,6 +268,29 @@ export default {
<span class="gl-pl-2">{{ token.name }}</span>
</gl-link>
</template>
+ <template #dropdown-item-content="{ dropdownItem }">
+ <sidebar-participant :user="dropdownItem" />
+ </template>
+ <template #loading-content>
+ <gl-skeleton-loader :height="170">
+ <rect width="380" height="20" x="10" y="15" rx="4" />
+ <rect width="280" height="20" x="10" y="50" rx="4" />
+ <rect width="380" height="20" x="10" y="95" rx="4" />
+ <rect width="280" height="20" x="10" y="130" rx="4" />
+ </gl-skeleton-loader>
+ </template>
+ <template #dropdown-footer>
+ <gl-dropdown-divider />
+ <gl-dropdown-item @click="closeDropdown">
+ <invite-members-trigger
+ :display-text="__('Invite members')"
+ trigger-element="side-nav"
+ icon="plus"
+ trigger-source="work-item-assignees-dropdown"
+ classes="gl-display-block gl-text-body! gl-hover-text-decoration-none gl-pb-2"
+ />
+ </gl-dropdown-item>
+ </template>
</gl-token-selector>
</div>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_description.vue b/app/assets/javascripts/work_items/components/work_item_description.vue
index 5a85fcdd7ac..90e3cd45cb4 100644
--- a/app/assets/javascripts/work_items/components/work_item_description.vue
+++ b/app/assets/javascripts/work_items/components/work_item_description.vue
@@ -35,7 +35,7 @@ export default {
isEditing: false,
isSubmitting: false,
isSubmittingWithKeydown: false,
- desc: '',
+ descriptionText: '',
};
},
apollo: {
@@ -71,16 +71,17 @@ export default {
descriptionHtml() {
return this.workItemDescription?.descriptionHtml;
},
- descriptionText: {
- get() {
- return this.desc;
- },
- set(desc) {
- this.desc = desc;
- },
+ descriptionEmpty() {
+ return this.descriptionHtml?.trim() === '';
},
workItemDescription() {
- return this.workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESCRIPTION);
+ const descriptionWidget = this.workItem?.widgets?.find(
+ (widget) => widget.type === WIDGET_TYPE_DESCRIPTION,
+ );
+ return {
+ ...descriptionWidget,
+ description: descriptionWidget?.description || '',
+ };
},
workItemType() {
return this.workItem?.workItemType?.name;
@@ -95,14 +96,14 @@ export default {
async startEditing() {
this.isEditing = true;
- this.desc = getDraft(this.autosaveKey) || this.workItemDescription?.description || '';
+ this.descriptionText = getDraft(this.autosaveKey) || this.workItemDescription?.description;
await this.$nextTick();
this.$refs.textarea.focus();
},
async cancelEditing() {
- const isDirty = this.desc !== this.workItemDescription?.description;
+ const isDirty = this.descriptionText !== this.workItemDescription?.description;
if (isDirty) {
const msg = s__('WorkItem|Are you sure you want to cancel editing?');
@@ -125,7 +126,7 @@ export default {
return;
}
- updateDraft(this.autosaveKey, this.desc);
+ updateDraft(this.autosaveKey, this.descriptionText);
},
async updateWorkItem(event) {
if (event.key) {
@@ -171,25 +172,10 @@ export default {
<template>
<gl-form-group
v-if="isEditing"
- class="gl-pt-5 gl-mb-5 gl-mt-0! gl-border-t! gl-border-b"
+ class="gl-my-5"
:label="__('Description')"
label-for="work-item-description"
- label-class="gl-float-left"
>
- <div class="gl-display-flex gl-justify-content-flex-end">
- <gl-button class="gl-ml-auto" data-testid="cancel" @click="cancelEditing">{{
- __('Cancel')
- }}</gl-button>
- <gl-button
- class="js-no-auto-disable gl-ml-4"
- category="primary"
- variant="confirm"
- :loading="isSubmitting"
- data-testid="save-description"
- @click="updateWorkItem"
- >{{ __('Save') }}</gl-button
- >
- </div>
<markdown-field
can-attach-file
:textarea-value="descriptionText"
@@ -216,19 +202,35 @@ export default {
></textarea>
</template>
</markdown-field>
- </gl-form-group>
- <div v-else class="gl-pt-5 gl-mb-5 gl-border-t gl-border-b">
+
<div class="gl-display-flex">
- <h3 class="gl-font-base gl-mt-0">{{ __('Description') }}</h3>
+ <gl-button
+ category="primary"
+ variant="confirm"
+ :loading="isSubmitting"
+ data-testid="save-description"
+ @click="updateWorkItem"
+ >{{ __('Save') }}</gl-button
+ >
+ <gl-button category="tertiary" class="gl-ml-3" data-testid="cancel" @click="cancelEditing">{{
+ __('Cancel')
+ }}</gl-button>
+ </div>
+ </gl-form-group>
+ <div v-else class="gl-mb-5">
+ <div class="gl-display-flex gl-align-items-center gl-mb-5">
+ <h3 class="gl-font-base gl-my-0">{{ __('Description') }}</h3>
<gl-button
v-if="canEdit"
class="gl-ml-auto"
icon="pencil"
data-testid="edit-description"
+ :aria-label="__('Edit')"
@click="startEditing"
- >{{ __('Edit') }}</gl-button
- >
+ />
</div>
- <div v-safe-html="descriptionHtml" class="md gl-mb-5"></div>
+
+ <div v-if="descriptionEmpty" class="gl-text-secondary gl-mb-5">{{ __('None') }}</div>
+ <div v-else v-safe-html="descriptionHtml" class="md gl-mb-5 gl-min-h-8"></div>
</div>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_detail.vue b/app/assets/javascripts/work_items/components/work_item_detail.vue
index 5272df2d53f..ad90fe88947 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail.vue
@@ -1,11 +1,15 @@
<script>
-import { GlAlert, GlSkeletonLoader } from '@gitlab/ui';
+import { GlAlert, GlSkeletonLoader, GlIcon, GlButton } from '@gitlab/ui';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import {
i18n,
- WIDGET_TYPE_ASSIGNEE,
+ WIDGET_TYPE_ASSIGNEES,
+ WIDGET_TYPE_LABELS,
WIDGET_TYPE_DESCRIPTION,
WIDGET_TYPE_WEIGHT,
+ WIDGET_TYPE_HIERARCHY,
+ WORK_ITEM_VIEWED_STORAGE_KEY,
} from '../constants';
import workItemQuery from '../graphql/work_item.query.graphql';
import workItemTitleSubscription from '../graphql/work_item_title.subscription.graphql';
@@ -14,22 +18,34 @@ import WorkItemState from './work_item_state.vue';
import WorkItemTitle from './work_item_title.vue';
import WorkItemDescription from './work_item_description.vue';
import WorkItemAssignees from './work_item_assignees.vue';
+import WorkItemLabels from './work_item_labels.vue';
import WorkItemWeight from './work_item_weight.vue';
+import WorkItemInformation from './work_item_information.vue';
export default {
i18n,
components: {
GlAlert,
+ GlButton,
GlSkeletonLoader,
+ GlIcon,
WorkItemAssignees,
WorkItemActions,
WorkItemDescription,
+ WorkItemLabels,
WorkItemTitle,
WorkItemState,
WorkItemWeight,
+ WorkItemInformation,
+ LocalStorageSync,
},
mixins: [glFeatureFlagMixin()],
props: {
+ isModal: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
workItemId: {
type: String,
required: false,
@@ -45,6 +61,7 @@ export default {
return {
error: undefined,
workItem: {},
+ showInfoBanner: true,
};
},
apollo: {
@@ -91,17 +108,40 @@ export default {
return this.workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESCRIPTION);
},
workItemAssignees() {
- return this.workItem?.mockWidgets?.find((widget) => widget.type === WIDGET_TYPE_ASSIGNEE);
+ return this.workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_ASSIGNEES);
+ },
+ workItemLabels() {
+ return this.workItem?.mockWidgets?.find((widget) => widget.type === WIDGET_TYPE_LABELS);
},
workItemWeight() {
return this.workItem?.mockWidgets?.find((widget) => widget.type === WIDGET_TYPE_WEIGHT);
},
+ workItemHierarchy() {
+ return this.workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_HIERARCHY);
+ },
+ parentWorkItem() {
+ return this.workItemHierarchy?.parent;
+ },
+ parentUrl() {
+ return `../../issues/${this.parentWorkItem?.iid}`;
+ },
+ },
+ beforeDestroy() {
+ /** make sure that if the user has not even dismissed the alert ,
+ * should no be able to see the information next time and update the local storage * */
+ this.dismissBanner();
},
+ methods: {
+ dismissBanner() {
+ this.showInfoBanner = false;
+ },
+ },
+ WORK_ITEM_VIEWED_STORAGE_KEY,
};
</script>
<template>
- <section>
+ <section class="gl-pt-5">
<gl-alert v-if="error" variant="danger" @dismiss="error = undefined">
{{ error }}
</gl-alert>
@@ -113,39 +153,95 @@ export default {
</gl-skeleton-loader>
</div>
<template v-else>
- <div class="gl-display-flex gl-align-items-start">
- <work-item-title
- :work-item-id="workItem.id"
- :work-item-title="workItem.title"
- :work-item-type="workItemType"
- :work-item-parent-id="workItemParentId"
- class="gl-mr-5"
- @error="error = $event"
- />
+ <div class="gl-display-flex gl-align-items-center">
+ <ul
+ v-if="parentWorkItem"
+ class="list-unstyled gl-display-flex gl-mr-auto"
+ data-testid="work-item-parent"
+ >
+ <li class="gl-ml-n4">
+ <gl-button icon="issues" category="tertiary" :href="parentUrl">{{
+ parentWorkItem.title
+ }}</gl-button>
+ <gl-icon name="chevron-right" :size="16" />
+ </li>
+ <li class="gl-px-4 gl-py-3 gl-line-height-0">
+ <gl-icon name="task-done" />
+ {{ workItemType }}
+ </li>
+ </ul>
+ <span
+ v-else
+ class="gl-font-weight-bold gl-text-secondary gl-mr-auto"
+ data-testid="work-item-type"
+ >{{ workItemType }}</span
+ >
<work-item-actions
:work-item-id="workItem.id"
:can-delete="canDelete"
- class="gl-ml-auto gl-mt-6"
@deleteWorkItem="$emit('deleteWorkItem')"
@error="error = $event"
/>
+ <gl-button
+ v-if="isModal"
+ category="tertiary"
+ data-testid="work-item-close"
+ icon="close"
+ :aria-label="__('Close')"
+ @click="$emit('close')"
+ />
</div>
- <template v-if="workItemsMvc2Enabled">
- <work-item-assignees
- v-if="workItemAssignees"
- :work-item-id="workItem.id"
- :assignees="workItemAssignees.nodes"
+ <local-storage-sync
+ v-model="showInfoBanner"
+ :storage-key="$options.WORK_ITEM_VIEWED_STORAGE_KEY"
+ >
+ <work-item-information
+ v-if="showInfoBanner"
+ :show-info-banner="showInfoBanner"
+ @work-item-banner-dismissed="dismissBanner"
/>
- <work-item-weight v-if="workItemWeight" :weight="workItemWeight.weight" />
- </template>
+ </local-storage-sync>
+ <work-item-title
+ :work-item-id="workItem.id"
+ :work-item-title="workItem.title"
+ :work-item-type="workItemType"
+ :work-item-parent-id="workItemParentId"
+ @error="error = $event"
+ />
<work-item-state
:work-item="workItem"
:work-item-parent-id="workItemParentId"
@error="error = $event"
/>
+ <template v-if="workItemsMvc2Enabled">
+ <work-item-assignees
+ v-if="workItemAssignees"
+ :can-update="canUpdate"
+ :work-item-id="workItem.id"
+ :assignees="workItemAssignees.assignees.nodes"
+ :allows-multiple-assignees="workItemAssignees.allowsMultipleAssignees"
+ :work-item-type="workItemType"
+ @error="error = $event"
+ />
+ <work-item-labels
+ v-if="workItemLabels"
+ :work-item-id="workItem.id"
+ :can-update="canUpdate"
+ @error="error = $event"
+ />
+ <work-item-weight
+ v-if="workItemWeight"
+ class="gl-mb-5"
+ :can-update="canUpdate"
+ :weight="workItemWeight.weight"
+ :work-item-id="workItem.id"
+ :work-item-type="workItemType"
+ />
+ </template>
<work-item-description
v-if="hasDescriptionWidget"
:work-item-id="workItem.id"
+ class="gl-pt-5"
@error="error = $event"
/>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
index d1c8022ac57..df7c6cab7ef 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
@@ -80,13 +80,16 @@ export default {
.catch((e) => {
this.error =
e.message ||
- s__('WorkItem|Something went wrong when deleting the work item. Please try again.');
+ s__('WorkItem|Something went wrong when deleting the task. Please try again.');
});
},
closeModal() {
this.error = '';
this.$emit('close');
},
+ hide() {
+ this.$refs.modal.hide();
+ },
setErrorMessage(message) {
this.error = message;
},
@@ -104,7 +107,6 @@ export default {
size="lg"
modal-id="work-item-detail-modal"
header-class="gl-p-0 gl-pb-2!"
- body-class="gl-pb-6!"
@hide="closeModal"
>
<gl-alert v-if="error" variant="danger" @dismiss="error = false">
@@ -112,9 +114,11 @@ export default {
</gl-alert>
<work-item-detail
+ is-modal
:work-item-parent-id="issueGid"
:work-item-id="workItemId"
class="gl-p-5 gl-mt-n3"
+ @close="hide"
@deleteWorkItem="deleteWorkItem"
/>
</gl-modal>
diff --git a/app/assets/javascripts/work_items/components/work_item_information.vue b/app/assets/javascripts/work_items/components/work_item_information.vue
new file mode 100644
index 00000000000..2ff7ba169ea
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_information.vue
@@ -0,0 +1,57 @@
+<script>
+import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
+
+export default {
+ i18n: {
+ learnTasksButtonText: s__('WorkItem|Learn about tasks'),
+ workItemsText: s__('WorkItem|work items'),
+ tasksInformationTitle: s__('WorkItem|Introducing tasks'),
+ tasksInformationBody: s__(
+ 'WorkItem|A task provides the ability to break down your work into smaller pieces tied to an issue. Tasks are the first items using our new %{workItemsLink} objects. Additional work item types will be coming soon.',
+ ),
+ },
+ helpPageLinks: {
+ tasksDocLinkPath: helpPagePath('user/tasks'),
+ workItemsLinkPath: helpPagePath(`development/work_items`),
+ },
+ components: {
+ GlAlert,
+ GlSprintf,
+ GlLink,
+ },
+ props: {
+ showInfoBanner: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ },
+ emits: ['work-item-banner-dismissed'],
+};
+</script>
+
+<template>
+ <section class="gl-display-block gl-mb-2">
+ <gl-alert
+ v-if="showInfoBanner"
+ variant="tip"
+ :title="$options.i18n.tasksInformationTitle"
+ :primary-button-link="$options.helpPageLinks.tasksDocLinkPath"
+ :primary-button-text="$options.i18n.learnTasksButtonText"
+ data-testid="work-item-information"
+ class="gl-mt-3"
+ @dismiss="$emit('work-item-banner-dismissed')"
+ >
+ <gl-sprintf :message="$options.i18n.tasksInformationBody">
+ <template #workItemsLink>
+ <gl-link :href="$options.helpPageLinks.workItemsLinkPath">{{
+ $options.i18n.workItemsText
+ }}</gl-link>
+ </template>
+ ></gl-sprintf
+ >
+ </gl-alert>
+ </section>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_labels.vue b/app/assets/javascripts/work_items/components/work_item_labels.vue
new file mode 100644
index 00000000000..78ed67998d7
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_labels.vue
@@ -0,0 +1,246 @@
+<script>
+import { GlTokenSelector, GlLabel, GlSkeletonLoader } from '@gitlab/ui';
+import { debounce } from 'lodash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import Tracking from '~/tracking';
+import labelSearchQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/project_labels.query.graphql';
+import LabelItem from '~/vue_shared/components/sidebar/labels_select_widget/label_item.vue';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
+import { isScopedLabel, scopedLabelKey } from '~/lib/utils/common_utils';
+import workItemQuery from '../graphql/work_item.query.graphql';
+import localUpdateWorkItemMutation from '../graphql/local_update_work_item.mutation.graphql';
+
+import { i18n, TRACKING_CATEGORY_SHOW, WIDGET_TYPE_LABELS } from '../constants';
+
+function isTokenSelectorElement(el) {
+ return el?.classList.contains('gl-label-close') || el?.classList.contains('dropdown-item');
+}
+
+function addClass(el) {
+ return {
+ ...el,
+ class: 'gl-bg-transparent',
+ };
+}
+
+export default {
+ components: {
+ GlTokenSelector,
+ GlLabel,
+ GlSkeletonLoader,
+ LabelItem,
+ },
+ mixins: [Tracking.mixin()],
+ inject: ['fullPath'],
+ props: {
+ workItemId: {
+ type: String,
+ required: true,
+ },
+ canUpdate: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ isEditing: false,
+ searchStarted: false,
+ localLabels: [],
+ searchKey: '',
+ searchLabels: [],
+ };
+ },
+ apollo: {
+ workItem: {
+ query: workItemQuery,
+ variables() {
+ return {
+ id: this.workItemId,
+ };
+ },
+ skip() {
+ return !this.workItemId;
+ },
+ error() {
+ this.$emit('error', i18n.fetchError);
+ },
+ },
+ searchLabels: {
+ query: labelSearchQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ search: this.searchKey,
+ };
+ },
+ skip() {
+ return !this.searchStarted;
+ },
+ update(data) {
+ return data.workspace?.labels?.nodes.map((node) => addClass({ ...node, ...node.label }));
+ },
+ error() {
+ this.$emit('error', i18n.fetchError);
+ },
+ },
+ },
+ computed: {
+ tracking() {
+ return {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_labels',
+ property: `type_${this.workItem.workItemType?.name}`,
+ };
+ },
+ allowScopedLabels() {
+ return this.labelsWidget.allowScopedLabels;
+ },
+ listEmpty() {
+ return this.labels.length === 0;
+ },
+ containerClass() {
+ return !this.isEditing ? 'gl-shadow-none!' : '';
+ },
+ isLoading() {
+ return this.$apollo.queries.searchLabels.loading;
+ },
+ labelsWidget() {
+ return this.workItem?.mockWidgets?.find((widget) => widget.type === WIDGET_TYPE_LABELS);
+ },
+ labels() {
+ return this.labelsWidget?.nodes || [];
+ },
+ },
+ watch: {
+ labels(newVal) {
+ if (!this.isEditing) {
+ this.localLabels = newVal.map(addClass);
+ }
+ },
+ },
+ created() {
+ this.debouncedSearchKeyUpdate = debounce(this.setSearchKey, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ },
+ methods: {
+ getId(id) {
+ return getIdFromGraphQLId(id);
+ },
+ removeLabel({ id }) {
+ this.localLabels = this.localLabels.filter((label) => label.id !== id);
+ },
+ setLabels(event) {
+ this.searchKey = '';
+ if (isTokenSelectorElement(event.relatedTarget) || !this.isEditing) return;
+ this.isEditing = false;
+ this.$apollo
+ .mutate({
+ mutation: localUpdateWorkItemMutation,
+ variables: {
+ input: {
+ id: this.workItemId,
+ labels: this.localLabels,
+ },
+ },
+ })
+ .catch((e) => {
+ this.$emit('error', e);
+ });
+ this.track('updated_labels');
+ },
+ handleFocus() {
+ this.isEditing = true;
+ this.searchStarted = true;
+ },
+ async focusTokenSelector(labels) {
+ if (this.allowScopedLabels) {
+ const newLabel = labels[labels.length - 1];
+ const existingLabels = labels.slice(0, labels.length - 1);
+
+ const newLabelKey = scopedLabelKey(newLabel);
+
+ const removeLabelsWithSameScope = existingLabels.filter((label) => {
+ const sameKey = newLabelKey === scopedLabelKey(label);
+ return !sameKey;
+ });
+
+ this.localLabels = [...removeLabelsWithSameScope, newLabel];
+ }
+ this.handleFocus();
+ await this.$nextTick();
+ this.$refs.tokenSelector.focusTextInput();
+ },
+ handleMouseOver() {
+ this.timeout = setTimeout(() => {
+ this.searchStarted = true;
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ },
+ handleMouseOut() {
+ clearTimeout(this.timeout);
+ },
+ setSearchKey(value) {
+ this.searchKey = value;
+ },
+ scopedLabel(label) {
+ return this.allowScopedLabels && isScopedLabel(label);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="form-row gl-mb-5 work-item-labels gl-relative">
+ <span
+ class="gl-font-weight-bold gl-mt-2 col-lg-2 col-3 gl-pt-2 min-w-fit-content gl-overflow-wrap-break"
+ data-testid="labels-title"
+ >{{ __('Labels') }}</span
+ >
+ <gl-token-selector
+ ref="tokenSelector"
+ v-model="localLabels"
+ :container-class="containerClass"
+ :dropdown-items="searchLabels"
+ :loading="isLoading"
+ :view-only="!canUpdate"
+ class="gl-flex-grow-1 gl-border gl-border-white gl-hover-border-gray-200 gl-rounded-base col-9 gl-align-self-start gl-px-0! gl-mx-2!"
+ @input="focusTokenSelector"
+ @text-input="debouncedSearchKeyUpdate"
+ @focus="handleFocus"
+ @blur="setLabels"
+ @mouseover.native="handleMouseOver"
+ @mouseout.native="handleMouseOut"
+ >
+ <template #empty-placeholder>
+ <div
+ class="add-labels gl-min-w-fit-content gl-display-flex gl-align-items-center gl-text-gray-400 gl-pr-4 gl-top-2"
+ data-testid="empty-state"
+ >
+ <span v-if="canUpdate" class="gl-ml-2">{{ __('Select labels') }}</span>
+ <span v-else class="gl-ml-2">{{ __('None') }}</span>
+ </div>
+ </template>
+ <template #token-content="{ token }">
+ <gl-label
+ :data-qa-label-name="token.title"
+ :title="token.title"
+ :description="token.description"
+ :background-color="token.color"
+ :scoped="scopedLabel(token)"
+ :show-close-button="canUpdate"
+ @close="removeLabel(token)"
+ />
+ </template>
+ <template #dropdown-item-content="{ dropdownItem }">
+ <label-item :label="dropdownItem" />
+ </template>
+ <template #loading-content>
+ <gl-skeleton-loader :height="170">
+ <rect width="380" height="20" x="10" y="15" rx="4" />
+ <rect width="280" height="20" x="10" y="50" rx="4" />
+ <rect width="380" height="20" x="10" y="95" rx="4" />
+ <rect width="280" height="20" x="10" y="130" rx="4" />
+ </gl-skeleton-loader>
+ </template>
+ </gl-token-selector>
+ </div>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/index.js b/app/assets/javascripts/work_items/components/work_item_links/index.js
index 320a4a213e3..176f84f6c1a 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/index.js
+++ b/app/assets/javascripts/work_items/components/work_item_links/index.js
@@ -1,9 +1,11 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import { GlToast } from '@gitlab/ui';
import createDefaultClient from '~/lib/graphql';
import WorkItemLinks from './work_item_links.vue';
Vue.use(VueApollo);
+Vue.use(GlToast);
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
@@ -19,6 +21,7 @@ export default function initWorkItemLinks() {
if (!workItemLinksRoot) {
return;
}
+
// eslint-disable-next-line no-new
new Vue({
el: workItemLinksRoot,
@@ -27,6 +30,9 @@ export default function initWorkItemLinks() {
components: {
workItemLinks: WorkItemLinks,
},
+ provide: {
+ projectPath: workItemLinksRoot.dataset.projectPath,
+ },
render: (createElement) =>
createElement('work-item-links', {
props: {
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
index bdfff100333..89f086cfca5 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
@@ -11,6 +11,7 @@ import {
} from '../../constants';
import getWorkItemLinksQuery from '../../graphql/work_item_links.query.graphql';
import WorkItemLinksForm from './work_item_links_form.vue';
+import WorkItemLinksMenu from './work_item_links_menu.vue';
export default {
components: {
@@ -19,6 +20,7 @@ export default {
GlIcon,
GlLoadingIcon,
WorkItemLinksForm,
+ WorkItemLinksMenu,
},
props: {
workItemId: {
@@ -77,6 +79,9 @@ export default {
isLoading() {
return this.$apollo.queries.children.loading;
},
+ childrenIds() {
+ return this.children.map((c) => c.id);
+ },
},
methods: {
badgeVariant(state) {
@@ -88,13 +93,16 @@ export default {
toggleAddForm() {
this.isShownAddForm = !this.isShownAddForm;
},
+ addChild(child) {
+ this.children = [child, ...this.children];
+ },
},
i18n: {
title: s__('WorkItem|Child items'),
emptyStateMessage: s__(
'WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!',
),
- addChildButtonLabel: s__('WorkItem|Add a child'),
+ addChildButtonLabel: s__('WorkItem|Add a task'),
},
WIDGET_TYPE_TASK_ICON: WIDGET_ICONS.TASK,
WORK_ITEM_STATUS_TEXT,
@@ -107,8 +115,16 @@ export default {
class="gl-p-4 gl-display-flex gl-justify-content-space-between"
:class="{ 'gl-border-b-1 gl-border-b-solid gl-border-b-gray-100': isOpen }"
>
- <h5 class="gl-m-0 gl-line-height-32">{{ $options.i18n.title }}</h5>
- <div class="gl-border-l-1 gl-border-l-solid gl-border-l-gray-50 gl-pl-4">
+ <h5 class="gl-m-0 gl-line-height-32 gl-flex-grow-1">{{ $options.i18n.title }}</h5>
+ <gl-button
+ v-if="!isShownAddForm"
+ category="secondary"
+ data-testid="toggle-add-form"
+ @click="toggleAddForm"
+ >
+ {{ $options.i18n.addChildButtonLabel }}
+ </gl-button>
+ <div class="gl-border-l-1 gl-border-l-solid gl-border-l-gray-50 gl-pl-4 gl-ml-3">
<gl-button
category="tertiary"
:icon="toggleIcon"
@@ -126,37 +142,38 @@ export default {
<gl-loading-icon v-if="isLoading" color="dark" class="gl-my-3" />
<template v-else>
- <div v-if="isChildrenEmpty" class="gl-px-8" data-testid="links-empty">
- <p>
+ <div v-if="isChildrenEmpty && !isShownAddForm" data-testid="links-empty">
+ <p class="gl-my-3">
{{ $options.i18n.emptyStateMessage }}
</p>
- <gl-button
- v-if="!isShownAddForm"
- category="secondary"
- variant="confirm"
- data-testid="toggle-add-form"
- @click="toggleAddForm"
- >
- {{ $options.i18n.addChildButtonLabel }}
- </gl-button>
- <work-item-links-form v-else data-testid="add-links-form" @cancel="toggleAddForm" />
</div>
+ <work-item-links-form
+ v-if="isShownAddForm"
+ data-testid="add-links-form"
+ :issuable-gid="issuableGid"
+ :children-ids="childrenIds"
+ @cancel="toggleAddForm"
+ @addWorkItemChild="addChild"
+ />
<div
v-for="child in children"
:key="child.id"
- class="gl-relative gl-display-flex gl-flex-direction-column gl-sm-flex-direction-row gl-overflow-break-word gl-min-w-0 gl-bg-white gl-mb-3 gl-py-3 gl-px-4 gl-border gl-border-gray-100 gl-rounded-base"
+ class="gl-relative gl-display-flex gl-flex-direction-column gl-sm-flex-direction-row gl-overflow-break-word gl-min-w-0 gl-bg-white gl-mb-3 gl-py-3 gl-px-4 gl-border gl-border-gray-100 gl-rounded-base gl-line-height-32"
data-testid="links-child"
>
<div>
<gl-icon :name="$options.WIDGET_TYPE_TASK_ICON" class="gl-mr-3 gl-text-gray-700" />
<span class="gl-word-break-all">{{ child.title }}</span>
</div>
- <div class="gl-ml-0 gl-sm-ml-auto! gl-mt-3 gl-sm-mt-0">
+ <div
+ class="gl-ml-0 gl-sm-ml-auto! gl-mt-3 gl-sm-mt-0 gl-display-inline-flex gl-align-items-center"
+ >
<gl-badge :variant="badgeVariant(child.state)">
<span class="gl-sm-display-block">{{
$options.WORK_ITEM_STATUS_TEXT[child.state]
}}</span>
</gl-badge>
+ <work-item-links-menu :work-item-id="child.id" :parent-work-item-id="issuableGid" />
</div>
</div>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
index 22728f58026..fadba0753db 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
@@ -1,27 +1,127 @@
<script>
-import { GlForm, GlFormInput, GlButton } from '@gitlab/ui';
+import { GlAlert, GlForm, GlFormCombobox, GlButton } from '@gitlab/ui';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { __, s__ } from '~/locale';
+import projectWorkItemsQuery from '../../graphql/project_work_items.query.graphql';
+import updateWorkItemMutation from '../../graphql/update_work_item.mutation.graphql';
export default {
components: {
+ GlAlert,
GlForm,
- GlFormInput,
+ GlFormCombobox,
GlButton,
},
+ inject: ['projectPath'],
+ props: {
+ issuableGid: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ childrenIds: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ },
+ apollo: {
+ availableWorkItems: {
+ query: projectWorkItemsQuery,
+ variables() {
+ return {
+ projectPath: this.projectPath,
+ searchTerm: this.search?.title || this.search,
+ types: ['TASK'],
+ };
+ },
+ skip() {
+ return this.search.length === 0;
+ },
+ update(data) {
+ return data.workspace.workItems.edges
+ .filter((wi) => !this.childrenIds.includes(wi.node.id))
+ .map((wi) => wi.node);
+ },
+ },
+ },
data() {
return {
- relatedWorkItem: '',
+ availableWorkItems: [],
+ search: '',
+ error: null,
};
},
+ methods: {
+ getIdFromGraphQLId,
+ unsetError() {
+ this.error = null;
+ },
+ addChild() {
+ this.$apollo
+ .mutate({
+ mutation: updateWorkItemMutation,
+ variables: {
+ input: {
+ id: this.issuableGid,
+ hierarchyWidget: {
+ childrenIds: [this.search.id],
+ },
+ },
+ },
+ })
+ .then(({ data }) => {
+ if (data.workItemUpdate?.errors?.length) {
+ [this.error] = data.workItemUpdate.errors;
+ } else {
+ this.unsetError();
+ this.$emit('addWorkItemChild', this.search);
+ }
+ })
+ .catch(() => {
+ this.error = this.$options.i18n.errorMessage;
+ })
+ .finally(() => {
+ this.search = '';
+ });
+ },
+ },
+ i18n: {
+ inputLabel: __('Children'),
+ errorMessage: s__(
+ 'WorkItem|Something went wrong when trying to add a child. Please try again.',
+ ),
+ },
};
</script>
<template>
- <gl-form @submit.prevent>
- <gl-form-input v-model="relatedWorkItem" class="gl-mb-4" />
- <gl-button type="submit" category="secondary" variant="confirm">
- {{ s__('WorkItem|Add') }}
+ <gl-form
+ class="gl-mb-3 gl-bg-white gl-mb-3 gl-py-3 gl-px-4 gl-border gl-border-gray-100 gl-rounded-base"
+ >
+ <gl-alert v-if="error" variant="danger" class="gl-mb-3" @dismiss="unsetError">
+ {{ error }}
+ </gl-alert>
+ <gl-form-combobox
+ v-model="search"
+ :token-list="availableWorkItems"
+ match-value-to-attr="title"
+ class="gl-mb-4"
+ :label-text="$options.i18n.inputLabel"
+ label-sr-only
+ autofocus
+ >
+ <template #result="{ item }">
+ <div class="gl-display-flex">
+ <div class="gl-text-gray-400 gl-mr-4">{{ getIdFromGraphQLId(item.id) }}</div>
+ <div>{{ item.title }}</div>
+ </div>
+ </template>
+ </gl-form-combobox>
+ <gl-button category="secondary" data-testid="add-child-button" @click="addChild">
+ {{ s__('WorkItem|Add task') }}
</gl-button>
- <gl-button category="tertiary" class="gl-float-right" @click="$emit('cancel')">
+ <gl-button category="tertiary" @click="$emit('cancel')">
{{ s__('WorkItem|Cancel') }}
</gl-button>
</gl-form>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_menu.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_menu.vue
new file mode 100644
index 00000000000..6deb87c5dca
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_menu.vue
@@ -0,0 +1,101 @@
+<script>
+import { GlIcon, GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { produce } from 'immer';
+import { s__ } from '~/locale';
+import changeWorkItemParentMutation from '../../graphql/change_work_item_parent_link.mutation.graphql';
+import getWorkItemLinksQuery from '../../graphql/work_item_links.query.graphql';
+import { WIDGET_TYPE_HIERARCHY } from '../../constants';
+
+export default {
+ components: {
+ GlDropdownItem,
+ GlDropdown,
+ GlIcon,
+ },
+ props: {
+ workItemId: {
+ type: String,
+ required: true,
+ },
+ parentWorkItemId: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ activeToast: null,
+ };
+ },
+ methods: {
+ toggleChildFromCache(data, store) {
+ const sourceData = store.readQuery({
+ query: getWorkItemLinksQuery,
+ variables: { id: this.parentWorkItemId },
+ });
+
+ const newData = produce(sourceData, (draftState) => {
+ const widgetHierarchy = draftState.workItem.widgets.find(
+ (widget) => widget.type === WIDGET_TYPE_HIERARCHY,
+ );
+
+ const index = widgetHierarchy.children.nodes.findIndex(
+ (child) => child.id === this.workItemId,
+ );
+
+ if (index >= 0) {
+ widgetHierarchy.children.nodes.splice(index, 1);
+ } else {
+ widgetHierarchy.children.nodes.push(data.workItemUpdate.workItem);
+ }
+ });
+
+ store.writeQuery({
+ query: getWorkItemLinksQuery,
+ variables: { id: this.parentWorkItemId },
+ data: newData,
+ });
+ },
+ async addChild(data) {
+ const { data: resp } = await this.$apollo.mutate({
+ mutation: changeWorkItemParentMutation,
+ variables: { id: this.workItemId, parentId: this.parentWorkItemId },
+ update: this.toggleChildFromCache.bind(this, data),
+ });
+
+ if (resp.workItemUpdate.errors.length === 0) {
+ this.activeToast?.hide();
+ }
+ },
+ async removeChild() {
+ const { data } = await this.$apollo.mutate({
+ mutation: changeWorkItemParentMutation,
+ variables: { id: this.workItemId, parentId: null },
+ update: this.toggleChildFromCache.bind(this, null),
+ });
+
+ if (data.workItemUpdate.errors.length === 0) {
+ this.activeToast = this.$toast.show(s__('WorkItem|Child removed'), {
+ action: {
+ text: s__('WorkItem|Undo'),
+ onClick: this.addChild.bind(this, data),
+ },
+ });
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <span class="gl-ml-2">
+ <gl-dropdown category="tertiary" toggle-class="btn-icon" :right="true">
+ <template #button-content>
+ <gl-icon name="ellipsis_v" :size="14" />
+ </template>
+ <gl-dropdown-item @click="removeChild">
+ {{ s__('WorkItem|Remove') }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ </span>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_weight.vue b/app/assets/javascripts/work_items/components/work_item_weight.vue
index b0f2b3aa14a..30e2c1e56b8 100644
--- a/app/assets/javascripts/work_items/components/work_item_weight.vue
+++ b/app/assets/javascripts/work_items/components/work_item_weight.vue
@@ -1,26 +1,142 @@
<script>
+import { GlForm, GlFormGroup, GlFormInput } from '@gitlab/ui';
import { __ } from '~/locale';
+import Tracking from '~/tracking';
+import { TRACKING_CATEGORY_SHOW } from '../constants';
+import localUpdateWorkItemMutation from '../graphql/local_update_work_item.mutation.graphql';
+
+/* eslint-disable @gitlab/require-i18n-strings */
+const allowedKeys = [
+ 'Alt',
+ 'ArrowDown',
+ 'ArrowLeft',
+ 'ArrowRight',
+ 'ArrowUp',
+ 'Backspace',
+ 'Control',
+ 'Delete',
+ 'End',
+ 'Enter',
+ 'Home',
+ 'Meta',
+ 'PageDown',
+ 'PageUp',
+ 'Tab',
+ '0',
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+];
+/* eslint-enable @gitlab/require-i18n-strings */
export default {
+ inputId: 'weight-widget-input',
+ components: {
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ },
+ mixins: [Tracking.mixin()],
inject: ['hasIssueWeightsFeature'],
props: {
+ canUpdate: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
weight: {
type: Number,
required: false,
default: undefined,
},
+ workItemId: {
+ type: String,
+ required: true,
+ },
+ workItemType: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ isEditing: false,
+ };
},
computed: {
- weightText() {
- return this.weight ?? __('None');
+ placeholder() {
+ return this.canUpdate && this.isEditing ? __('Enter a number') : __('None');
+ },
+ tracking() {
+ return {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_weight',
+ property: `type_${this.workItemType}`,
+ };
+ },
+ type() {
+ return this.canUpdate && this.isEditing ? 'number' : 'text';
+ },
+ },
+ methods: {
+ blurInput() {
+ this.$refs.input.$el.blur();
+ },
+ handleFocus() {
+ this.isEditing = true;
+ },
+ handleKeydown(event) {
+ if (!allowedKeys.includes(event.key)) {
+ event.preventDefault();
+ }
+ },
+ updateWeight(event) {
+ this.isEditing = false;
+ this.track('updated_weight');
+ this.$apollo.mutate({
+ mutation: localUpdateWorkItemMutation,
+ variables: {
+ input: {
+ id: this.workItemId,
+ weight: event.target.value === '' ? null : Number(event.target.value),
+ },
+ },
+ });
},
},
};
</script>
<template>
- <div v-if="hasIssueWeightsFeature" class="gl-mb-5">
- <span class="gl-display-inline-block gl-font-weight-bold gl-w-15">{{ __('Weight') }}</span>
- {{ weightText }}
- </div>
+ <gl-form v-if="hasIssueWeightsFeature" @submit.prevent="blurInput">
+ <gl-form-group
+ class="gl-align-items-center"
+ :label="__('Weight')"
+ :label-for="$options.inputId"
+ label-class="gl-pb-0! gl-overflow-wrap-break"
+ label-cols="3"
+ label-cols-lg="2"
+ >
+ <gl-form-input
+ :id="$options.inputId"
+ ref="input"
+ min="0"
+ :placeholder="placeholder"
+ :readonly="!canUpdate"
+ size="sm"
+ :type="type"
+ :value="weight"
+ @blur="updateWeight"
+ @focus="handleFocus"
+ @keydown="handleKeydown"
+ @keydown.exact.esc.stop="blurInput"
+ />
+ </gl-form-group>
+ </gl-form>
</template>
diff --git a/app/assets/javascripts/work_items/constants.js b/app/assets/javascripts/work_items/constants.js
index 2df4978a319..2140b418e6d 100644
--- a/app/assets/javascripts/work_items/constants.js
+++ b/app/assets/javascripts/work_items/constants.js
@@ -13,12 +13,14 @@ export const i18n = {
updateError: s__('WorkItem|Something went wrong while updating the work item. Please try again.'),
};
-export const DEFAULT_MODAL_TYPE = 'Task';
+export const TASK_TYPE_NAME = 'Task';
-export const WIDGET_TYPE_ASSIGNEE = 'ASSIGNEES';
+export const WIDGET_TYPE_ASSIGNEES = 'ASSIGNEES';
export const WIDGET_TYPE_DESCRIPTION = 'DESCRIPTION';
+export const WIDGET_TYPE_LABELS = 'LABELS';
export const WIDGET_TYPE_WEIGHT = 'WEIGHT';
export const WIDGET_TYPE_HIERARCHY = 'HIERARCHY';
+export const WORK_ITEM_VIEWED_STORAGE_KEY = 'gl-show-work-item-banner';
export const WIDGET_TYPE_TASK_ICON = 'task-done';
diff --git a/app/assets/javascripts/work_items/graphql/change_work_item_parent_link.mutation.graphql b/app/assets/javascripts/work_items/graphql/change_work_item_parent_link.mutation.graphql
new file mode 100644
index 00000000000..dc5286174d8
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/change_work_item_parent_link.mutation.graphql
@@ -0,0 +1,13 @@
+mutation changeWorkItemParentLink($id: WorkItemID!, $parentId: WorkItemID) {
+ workItemUpdate(input: { id: $id, hierarchyWidget: { parentId: $parentId } }) {
+ workItem {
+ id
+ workItemType {
+ id
+ }
+ title
+ state
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql b/app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql
index b25210f5c74..ccfe62cc585 100644
--- a/app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql
+++ b/app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql
@@ -1,8 +1,12 @@
+#import "./work_item.fragment.graphql"
+
mutation workItemCreateFromTask($input: WorkItemCreateFromTaskInput!) {
workItemCreateFromTask(input: $input) {
workItem {
- id
- descriptionHtml
+ ...WorkItem
+ }
+ newWorkItem {
+ ...WorkItem
}
errors
}
diff --git a/app/assets/javascripts/work_items/graphql/local_update_work_item.mutation.graphql b/app/assets/javascripts/work_items/graphql/local_update_work_item.mutation.graphql
index 0d31ecef6f8..43c92cf89ec 100644
--- a/app/assets/javascripts/work_items/graphql/local_update_work_item.mutation.graphql
+++ b/app/assets/javascripts/work_items/graphql/local_update_work_item.mutation.graphql
@@ -1,6 +1,6 @@
#import "./work_item.fragment.graphql"
-mutation localUpdateWorkItem($input: LocalWorkItemAssigneesInput) {
+mutation localUpdateWorkItem($input: LocalUpdateWorkItemInput) {
localUpdateWorkItem(input: $input) @client {
workItem {
...WorkItem
diff --git a/app/assets/javascripts/work_items/graphql/project_work_items.query.graphql b/app/assets/javascripts/work_items/graphql/project_work_items.query.graphql
new file mode 100644
index 00000000000..7d38d203b84
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/project_work_items.query.graphql
@@ -0,0 +1,14 @@
+query projectWorkItems($searchTerm: String, $projectPath: ID!, $types: [IssueType!]) {
+ workspace: project(fullPath: $projectPath) {
+ id
+ workItems(search: $searchTerm, types: $types) {
+ edges {
+ node {
+ id
+ title
+ state
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/provider.js b/app/assets/javascripts/work_items/graphql/provider.js
index 09d929faae2..8788ad21e7b 100644
--- a/app/assets/javascripts/work_items/graphql/provider.js
+++ b/app/assets/javascripts/work_items/graphql/provider.js
@@ -2,7 +2,7 @@ import produce from 'immer';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
-import { WIDGET_TYPE_ASSIGNEE } from '../constants';
+import { WIDGET_TYPE_ASSIGNEES, WIDGET_TYPE_LABELS, WIDGET_TYPE_WEIGHT } from '../constants';
import typeDefs from './typedefs.graphql';
import workItemQuery from './work_item.query.graphql';
@@ -10,7 +10,7 @@ export const temporaryConfig = {
typeDefs,
cacheConfig: {
possibleTypes: {
- LocalWorkItemWidget: ['LocalWorkItemAssignees'],
+ LocalWorkItemWidget: ['LocalWorkItemLabels', 'LocalWorkItemWeight'],
},
typePolicies: {
WorkItem: {
@@ -20,33 +20,15 @@ export const temporaryConfig = {
return (
widgets || [
{
- __typename: 'LocalWorkItemAssignees',
- type: 'ASSIGNEES',
- nodes: [
- {
- __typename: 'UserCore',
- id: 'gid://gitlab/User/1',
- avatarUrl: '',
- webUrl: '',
- // eslint-disable-next-line @gitlab/require-i18n-strings
- name: 'John Doe',
- username: 'doe_I',
- },
- {
- __typename: 'UserCore',
- id: 'gid://gitlab/User/2',
- avatarUrl: '',
- webUrl: '',
- // eslint-disable-next-line @gitlab/require-i18n-strings
- name: 'Marcus Rutherford',
- username: 'ruthfull',
- },
- ],
+ __typename: 'LocalWorkItemLabels',
+ type: WIDGET_TYPE_LABELS,
+ allowScopedLabels: true,
+ nodes: [],
},
{
__typename: 'LocalWorkItemWeight',
type: 'WEIGHT',
- weight: 0,
+ weight: null,
},
]
);
@@ -67,12 +49,26 @@ export const resolvers = {
});
const data = produce(sourceData, (draftData) => {
- const assigneesWidget = draftData.workItem.mockWidgets.find(
- (widget) => widget.type === WIDGET_TYPE_ASSIGNEE,
- );
- assigneesWidget.nodes = assigneesWidget.nodes.filter((assignee) =>
- input.assigneeIds.includes(assignee.id),
- );
+ if (input.assignees) {
+ const assigneesWidget = draftData.workItem.widgets.find(
+ (widget) => widget.type === WIDGET_TYPE_ASSIGNEES,
+ );
+ assigneesWidget.assignees.nodes = [...input.assignees];
+ }
+
+ if (input.weight != null) {
+ const weightWidget = draftData.workItem.mockWidgets.find(
+ (widget) => widget.type === WIDGET_TYPE_WEIGHT,
+ );
+ weightWidget.weight = input.weight;
+ }
+
+ if (input.labels) {
+ const labelsWidget = draftData.workItem.mockWidgets.find(
+ (widget) => widget.type === WIDGET_TYPE_LABELS,
+ );
+ labelsWidget.nodes = [...input.labels];
+ }
});
cache.writeQuery({
diff --git a/app/assets/javascripts/work_items/graphql/typedefs.graphql b/app/assets/javascripts/work_items/graphql/typedefs.graphql
index bfe2f0fe0ce..48228b15a53 100644
--- a/app/assets/javascripts/work_items/graphql/typedefs.graphql
+++ b/app/assets/javascripts/work_items/graphql/typedefs.graphql
@@ -1,5 +1,6 @@
enum LocalWidgetType {
ASSIGNEES
+ LABELS
WEIGHT
}
@@ -12,6 +13,12 @@ type LocalWorkItemAssignees implements LocalWorkItemWidget {
nodes: [UserCore]
}
+type LocalWorkItemLabels implements LocalWorkItemWidget {
+ type: LocalWidgetType!
+ allowScopedLabels: Boolean!
+ nodes: [Label!]
+}
+
type LocalWorkItemWeight implements LocalWorkItemWidget {
type: LocalWidgetType!
weight: Int
@@ -21,9 +28,11 @@ extend type WorkItem {
mockWidgets: [LocalWorkItemWidget]
}
-type LocalWorkItemAssigneesInput {
+input LocalUpdateWorkItemInput {
id: WorkItemID!
- assigneeIds: [ID!]
+ assignees: [UserCore!]
+ labels: [Label]
+ weight: Int
}
type LocalWorkItemPayload {
@@ -32,5 +41,5 @@ type LocalWorkItemPayload {
}
extend type Mutation {
- localUpdateWorkItem(input: LocalWorkItemAssigneesInput!): LocalWorkItemPayload
+ localUpdateWorkItem(input: LocalUpdateWorkItemInput!): LocalWorkItemPayload
}
diff --git a/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql b/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql
index c0b6e856411..25eb8099251 100644
--- a/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql
+++ b/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql
@@ -5,5 +5,6 @@ mutation workItemUpdate($input: WorkItemUpdateInput!) {
workItem {
...WorkItem
}
+ errors
}
}
diff --git a/app/assets/javascripts/work_items/graphql/update_work_item_task.mutation.graphql b/app/assets/javascripts/work_items/graphql/update_work_item_task.mutation.graphql
index 470de060ee3..ad861a60d15 100644
--- a/app/assets/javascripts/work_items/graphql/update_work_item_task.mutation.graphql
+++ b/app/assets/javascripts/work_items/graphql/update_work_item_task.mutation.graphql
@@ -1,8 +1,13 @@
+#import "./work_item.fragment.graphql"
+
mutation workItemUpdateTask($input: WorkItemUpdateTaskInput!) {
workItemUpdate: workItemUpdateTask(input: $input) {
workItem {
id
descriptionHtml
}
+ task {
+ ...WorkItem
+ }
}
}
diff --git a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
index 04701f6899e..5f64eda96aa 100644
--- a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
@@ -1,3 +1,5 @@
+#import "~/graphql_shared/fragments/user.fragment.graphql"
+
fragment WorkItem on WorkItem {
id
title
@@ -17,5 +19,29 @@ fragment WorkItem on WorkItem {
description
descriptionHtml
}
+ ... on WorkItemWidgetAssignees {
+ type
+ allowsMultipleAssignees
+ assignees {
+ nodes {
+ ...User
+ }
+ }
+ }
+ ... on WorkItemWidgetHierarchy {
+ type
+ parent {
+ id
+ iid
+ title
+ }
+ children {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+ }
}
}
diff --git a/app/assets/javascripts/work_items/graphql/work_item.query.graphql b/app/assets/javascripts/work_items/graphql/work_item.query.graphql
index 30bc61f5c59..61cb8802187 100644
--- a/app/assets/javascripts/work_items/graphql/work_item.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item.query.graphql
@@ -1,17 +1,15 @@
+#import "~/graphql_shared/fragments/label.fragment.graphql"
#import "./work_item.fragment.graphql"
query workItem($id: WorkItemID!) {
workItem(id: $id) {
...WorkItem
mockWidgets @client {
- ... on LocalWorkItemAssignees {
+ ... on LocalWorkItemLabels {
type
+ allowScopedLabels
nodes {
- id
- avatarUrl
- name
- username
- webUrl
+ ...Label
}
}
... on LocalWorkItemWeight {
diff --git a/app/assets/javascripts/work_items/index.js b/app/assets/javascripts/work_items/index.js
index 33e28831b54..6437df597b4 100644
--- a/app/assets/javascripts/work_items/index.js
+++ b/app/assets/javascripts/work_items/index.js
@@ -10,6 +10,7 @@ export const initWorkItemsRoot = () => {
return new Vue({
el,
+ name: 'WorkItemsRoot',
router: createRouter(el.dataset.fullPath),
apolloProvider: createApolloProvider(),
provide: {
diff --git a/app/assets/javascripts/work_items/pages/create_work_item.vue b/app/assets/javascripts/work_items/pages/create_work_item.vue
index 04c6a61689c..482da5419c6 100644
--- a/app/assets/javascripts/work_items/pages/create_work_item.vue
+++ b/app/assets/javascripts/work_items/pages/create_work_item.vue
@@ -6,12 +6,11 @@ import workItemQuery from '../graphql/work_item.query.graphql';
import createWorkItemMutation from '../graphql/create_work_item.mutation.graphql';
import createWorkItemFromTaskMutation from '../graphql/create_work_item_from_task.mutation.graphql';
import projectWorkItemTypesQuery from '../graphql/project_work_item_types.query.graphql';
-import { DEFAULT_MODAL_TYPE } from '../constants';
import ItemTitle from '../components/item_title.vue';
export default {
- createErrorText: s__('WorkItem|Something went wrong when creating a work item. Please try again'),
+ createErrorText: s__('WorkItem|Something went wrong when creating a task. Please try again'),
fetchTypesErrorText: s__(
'WorkItem|Something went wrong when fetching work item types. Please try again',
),
@@ -24,11 +23,6 @@ export default {
},
inject: ['fullPath'],
props: {
- isModal: {
- type: Boolean,
- required: false,
- default: false,
- },
initialTitle: {
type: String,
required: false,
@@ -78,13 +72,6 @@ export default {
text: node.name,
}));
},
- result() {
- if (!this.selectedWorkItemType && this.isModal) {
- this.selectedWorkItemType = this.formOptions.find(
- (options) => options.text === DEFAULT_MODAL_TYPE,
- )?.value;
- }
- },
error() {
this.error = this.$options.fetchTypesErrorText;
},
@@ -104,11 +91,7 @@ export default {
methods: {
async createWorkItem() {
this.loading = true;
- if (this.isModal) {
- await this.createWorkItemFromTask();
- } else {
- await this.createStandaloneWorkItem();
- }
+ await this.createStandaloneWorkItem();
this.loading = false;
},
async createStandaloneWorkItem() {
@@ -174,11 +157,7 @@ export default {
this.title = title;
},
handleCancelClick() {
- if (!this.isModal) {
- this.$router.go(-1);
- return;
- }
- this.$emit('closeModal');
+ this.$router.go(-1);
},
},
};
@@ -187,7 +166,7 @@ export default {
<template>
<form @submit.prevent="createWorkItem">
<gl-alert v-if="error" variant="danger" @dismiss="error = null">{{ error }}</gl-alert>
- <div :class="{ 'gl-px-5': isModal }" data-testid="content">
+ <div data-testid="content">
<item-title :title="initialTitle" data-testid="title-input" @title-input="handleTitleInput" />
<div>
<gl-loading-icon
@@ -203,14 +182,11 @@ export default {
/>
</div>
</div>
- <div
- class="gl-bg-gray-10 gl-py-5 gl-px-6 gl-mt-4"
- :class="{ 'gl-display-flex gl-justify-content-end': isModal }"
- >
+ <div class="gl-bg-gray-10 gl-py-5 gl-px-6 gl-mt-4">
<gl-button
variant="confirm"
:disabled="isButtonDisabled"
- :class="{ 'gl-mr-3': !isModal }"
+ class="gl-mr-3"
:loading="loading"
data-testid="create-button"
type="submit"
@@ -221,7 +197,6 @@ export default {
type="button"
data-testid="cancel-button"
class="gl-order-n1"
- :class="{ 'gl-mr-3': isModal }"
@click="handleCancelClick"
>
{{ __('Cancel') }}
diff --git a/app/assets/stylesheets/_page_specific_files.scss b/app/assets/stylesheets/_page_specific_files.scss
index 092cf643e0f..be72ec33465 100644
--- a/app/assets/stylesheets/_page_specific_files.scss
+++ b/app/assets/stylesheets/_page_specific_files.scss
@@ -1,5 +1,6 @@
@import './pages/branches';
@import './pages/clusters';
+@import './pages/colors';
@import './pages/commits';
@import './pages/deploy_keys';
@import './pages/detail_page';
@@ -8,6 +9,7 @@
@import './pages/events';
@import './pages/groups';
@import './pages/help';
+@import './pages/hierarchy';
@import './pages/issuable';
@import './pages/issues';
@import './pages/labels';
@@ -25,9 +27,8 @@
@import './pages/registry';
@import './pages/search';
@import './pages/service_desk';
-@import './pages/settings';
@import './pages/settings_ci_cd';
+@import './pages/settings';
@import './pages/storage_quota';
@import './pages/tree';
@import './pages/users';
-@import './pages/hierarchy';
diff --git a/app/assets/stylesheets/components/content_editor.scss b/app/assets/stylesheets/components/content_editor.scss
index 870ed50c6eb..1b6a0208ca7 100644
--- a/app/assets/stylesheets/components/content_editor.scss
+++ b/app/assets/stylesheets/components/content_editor.scss
@@ -106,11 +106,14 @@
}
}
-.table-dropdown .dropdown-menu {
+.content-editor-dropdown .dropdown-menu {
+ width: auto !important;
+
@include gl-min-w-0;
- @include gl-w-auto;
- @include gl-white-space-nowrap;
+ button {
+ @include gl-white-space-nowrap;
+ }
}
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index ced62926218..37f92d3cf3d 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -506,8 +506,7 @@
max-width: unset;
}
- .no-emoji-placeholder,
- .clear-user-status {
+ .no-emoji-placeholder {
svg {
fill: var(--gray-500, $gray-500);
}
diff --git a/app/assets/stylesheets/framework/icons.scss b/app/assets/stylesheets/framework/icons.scss
index a8e740525e2..f27a36d1966 100644
--- a/app/assets/stylesheets/framework/icons.scss
+++ b/app/assets/stylesheets/framework/icons.scss
@@ -60,6 +60,13 @@
@include icon-styles($gray-500, $gray-100);
}
+.password-status-icon-success {
+ svg {
+ vertical-align: middle;
+ fill: $green-500;
+ }
+}
+
.icon-link {
&:hover {
text-decoration: none;
@@ -67,6 +74,7 @@
}
.user-avatar-link {
+ display: inline-block;
text-decoration: none;
}
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index eeffc4fc21b..1e921b4234e 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -432,7 +432,6 @@ $gl-input-padding: 10px;
$gl-vert-padding: 6px;
$gl-padding-top: 10px;
$gl-sidebar-padding: 22px;
-$gl-bar-padding: 3px;
$input-horizontal-padding: 12px;
$browser-scrollbar-size: 10px;
diff --git a/app/assets/stylesheets/highlight/hljs.scss b/app/assets/stylesheets/highlight/hljs.scss
index 2e31e7c1f6d..e1bc23852a4 100644
--- a/app/assets/stylesheets/highlight/hljs.scss
+++ b/app/assets/stylesheets/highlight/hljs.scss
@@ -37,6 +37,10 @@
&.class_ {
color: var(--color-hljs-class);
+
+ &.inherited__ {
+ color: var(--color-hljs-variable);
+ }
}
&.function_ {
diff --git a/app/assets/stylesheets/highlight/themes/dark.scss b/app/assets/stylesheets/highlight/themes/dark.scss
index f4d9909d81f..709e7f5ae18 100644
--- a/app/assets/stylesheets/highlight/themes/dark.scss
+++ b/app/assets/stylesheets/highlight/themes/dark.scss
@@ -188,7 +188,11 @@ $dark-il: #de935f;
.diff-line-num.new,
.line-coverage.new,
.line-codequality.new,
- .line_content.new {
+ .line_content.new,
+ .diff-line-num.new-nomappinginraw,
+ .line-coverage.new-nomappinginraw,
+ .line-codequality.new-nomappinginraw,
+ .line_content.new-nomappinginraw {
@include diff-background($dark-new-bg, $dark-new-idiff, $dark-border);
&::before,
@@ -200,7 +204,11 @@ $dark-il: #de935f;
.diff-line-num.old,
.line-coverage.old,
.line-codequality.old,
- .line_content.old {
+ .line_content.old,
+ .diff-line-num.old-nomappinginraw,
+ .line-coverage.old-nomappinginraw,
+ .line-codequality.old-nomappinginraw,
+ .line_content.old-nomappinginraw {
@include diff-background($dark-old-bg, $dark-old-idiff, $dark-border);
&::before,
diff --git a/app/assets/stylesheets/highlight/themes/monokai.scss b/app/assets/stylesheets/highlight/themes/monokai.scss
index dfa32d4b773..0ed9c209417 100644
--- a/app/assets/stylesheets/highlight/themes/monokai.scss
+++ b/app/assets/stylesheets/highlight/themes/monokai.scss
@@ -100,6 +100,8 @@ $monokai-gh: #75715e;
// We should be able to remove the overrides once the upstream issue is fixed (https://github.com/sourcegraph/sourcegraph/issues/23251)
@include hljs-override('string', $monokai-s);
@include hljs-override('attr', $monokai-na);
+ @include hljs-override('attribute', $monokai-n);
+ @include hljs-override('selector-tag', $monokai-nt);
@include hljs-override('keyword', $monokai-k);
@include hljs-override('variable', $monokai-nv);
@include hljs-override('variable.language_', $monokai-k);
@@ -113,7 +115,8 @@ $monokai-gh: #75715e;
@include hljs-override('section', $monokai-gh);
@include hljs-override('bullet', $monokai-n);
@include hljs-override('subst', $monokai-p);
- @include hljs-override('symbol', $monokai-ni);
+ @include hljs-override('symbol', $monokai-ss);
+ @include hljs-override('title.class_.inherited__', $monokai-no);
// Line numbers
.file-line-num {
@@ -178,7 +181,11 @@ $monokai-gh: #75715e;
.diff-line-num.new,
.line-coverage.new,
.line-codequality.new,
- .line_content.new {
+ .line_content.new,
+ .diff-line-num.new-nomappinginraw,
+ .line-coverage.new-nomappinginraw,
+ .line-codequality.new-nomappinginraw,
+ .line_content.new-nomappinginraw {
@include diff-background($monokai-new-bg, $monokai-new-idiff, $monokai-diff-border);
&::before,
@@ -190,7 +197,11 @@ $monokai-gh: #75715e;
.diff-line-num.old,
.line-coverage.old,
.line-codequality.old,
- .line_content.old {
+ .line_content.old,
+ .diff-line-num.old-nomappinginraw,
+ .line-coverage.old-nomappinginraw,
+ .line-codequality.old-nomappinginraw,
+ .line_content.old-nomappinginraw {
@include diff-background($monokai-old-bg, $monokai-old-idiff, $monokai-diff-border);
&::before,
diff --git a/app/assets/stylesheets/highlight/themes/none.scss b/app/assets/stylesheets/highlight/themes/none.scss
index f70c53c9eaa..868e466b1f8 100644
--- a/app/assets/stylesheets/highlight/themes/none.scss
+++ b/app/assets/stylesheets/highlight/themes/none.scss
@@ -75,7 +75,9 @@
.line-coverage,
.line-codequality {
&.old,
- &.new {
+ &.new,
+ &.new-nomappinginraw,
+ &.old-nomappinginraw {
background-color: $white-normal;
}
}
@@ -131,7 +133,7 @@
}
.line_content {
- &.old {
+ &.old, &.old-nomappinginraw {
background-color: $white-normal;
&::before {
@@ -144,7 +146,7 @@
}
}
- &.new {
+ &.new, &.new-nomappinginraw {
background-color: $white-normal;
&::before {
diff --git a/app/assets/stylesheets/highlight/themes/solarized-dark.scss b/app/assets/stylesheets/highlight/themes/solarized-dark.scss
index 73aa6275d17..6260339a48d 100644
--- a/app/assets/stylesheets/highlight/themes/solarized-dark.scss
+++ b/app/assets/stylesheets/highlight/themes/solarized-dark.scss
@@ -103,6 +103,8 @@ $solarized-dark-il: #2aa198;
// We should be able to remove the overrides once the upstream issue is fixed (https://github.com/sourcegraph/sourcegraph/issues/23251)
@include hljs-override('string', $solarized-dark-s);
@include hljs-override('attr', $solarized-dark-na);
+ @include hljs-override('attribute', $solarized-dark-n);
+ @include hljs-override('selector-tag', $solarized-dark-nt);
@include hljs-override('keyword', $solarized-dark-k);
@include hljs-override('variable', $solarized-dark-nv);
@include hljs-override('variable.language_', $solarized-dark-k);
@@ -117,7 +119,8 @@ $solarized-dark-il: #2aa198;
@include hljs-override('bullet', $solarized-dark-n);
@include hljs-override('subst', $solarized-dark-p);
@include hljs-override('symbol', $solarized-dark-ni);
-
+ @include hljs-override('title.class_.inherited__', $solarized-dark-no);
+
// Line numbers
.file-line-num {
@include line-number-link($solarized-dark-line-color);
@@ -189,7 +192,11 @@ $solarized-dark-il: #2aa198;
.diff-line-num.new,
.line-coverage.new,
.line-codequality.new,
- .line_content.new {
+ .line_content.new,
+ .diff-line-num.new-nomappinginraw,
+ .line-coverage.new-nomappinginraw,
+ .line-codequality.new-nomappinginraw,
+ .line_content.new-nomappinginraw {
@include diff-background($solarized-dark-new-bg, $solarized-dark-new-idiff, $solarized-dark-border);
&::before,
@@ -201,7 +208,11 @@ $solarized-dark-il: #2aa198;
.diff-line-num.old,
.line-coverage.old,
.line-codequality.old,
- .line_content.old {
+ .line_content.old,
+ .diff-line-num.old-nomappinginraw,
+ .line-coverage.old-nomappinginraw,
+ .line-codequality.old-nomappinginraw,
+ .line_content.old-nomappinginraw {
@include diff-background($solarized-dark-old-bg, $solarized-dark-old-idiff, $solarized-dark-border);
&::before,
diff --git a/app/assets/stylesheets/highlight/themes/solarized-light.scss b/app/assets/stylesheets/highlight/themes/solarized-light.scss
index 74448317270..e6f098f4cdf 100644
--- a/app/assets/stylesheets/highlight/themes/solarized-light.scss
+++ b/app/assets/stylesheets/highlight/themes/solarized-light.scss
@@ -106,6 +106,7 @@ $solarized-light-il: #2aa198;
}
.code.solarized-light {
+ @include hljs-override('title.class_.inherited__', $solarized-light-no);
// Line numbers
.file-line-num {
@include line-number-link($solarized-light-line-color);
@@ -169,7 +170,11 @@ $solarized-light-il: #2aa198;
.diff-line-num.new,
.line-coverage.new,
.line-codequality.new,
- .line_content.new {
+ .line_content.new,
+ .diff-line-num.new-nomappinginraw,
+ .line-coverage.new-nomappinginraw,
+ .line-codequality.new-nomappinginraw,
+ .line_content.new-nomappinginraw {
@include diff-background($solarized-light-new-bg,
$solarized-light-new-idiff, $solarized-light-border);
@@ -190,7 +195,11 @@ $solarized-light-il: #2aa198;
.diff-line-num.old,
.line-coverage.old,
.line-codequality.old,
- .line_content.old {
+ .line_content.old,
+ .diff-line-num.old-nomappinginraw,
+ .line-coverage.old-nomappinginraw,
+ .line-codequality.old-nomappinginraw,
+ .line_content.old-nomappinginraw {
@include diff-background($solarized-light-old-bg, $solarized-light-old-idiff, $solarized-light-border);
&::before,
diff --git a/app/assets/stylesheets/highlight/themes/white.scss b/app/assets/stylesheets/highlight/themes/white.scss
index 8698e448c94..b0f6595feff 100644
--- a/app/assets/stylesheets/highlight/themes/white.scss
+++ b/app/assets/stylesheets/highlight/themes/white.scss
@@ -2,6 +2,9 @@
@import '../white_base';
@include conflict-colors('white');
+ @include hljs-override('variable', $white-nv);
+ @include hljs-override('symbol', $white-ss);
+ @include hljs-override('title.class_.inherited__', $white-no);
}
:root {
diff --git a/app/assets/stylesheets/highlight/white_base.scss b/app/assets/stylesheets/highlight/white_base.scss
index aac8ccde96e..770a90bbc57 100644
--- a/app/assets/stylesheets/highlight/white_base.scss
+++ b/app/assets/stylesheets/highlight/white_base.scss
@@ -158,7 +158,8 @@ pre.code,
}
.diff-line-num {
- &.old {
+ &.old,
+ &.old-nomappinginraw {
background-color: $line-number-old;
a {
@@ -166,7 +167,8 @@ pre.code,
}
}
- &.new {
+ &.new,
+ &.new-nomappinginraw {
background-color: $line-number-new;
a {
@@ -204,7 +206,8 @@ pre.code,
}
.line_content {
- &.old {
+ &.old,
+ &.old-nomappinginraw {
background-color: $line-removed;
&::before {
@@ -216,7 +219,8 @@ pre.code,
}
}
- &.new {
+ &.new,
+ &.new-nomappinginraw {
background-color: $line-added;
&::before {
@@ -243,11 +247,13 @@ pre.code,
.line-coverage,
.line-codequality {
- &.old {
+ &.old,
+ &.old-nomappinginraw {
background-color: $line-removed;
}
- &.new {
+ &.new,
+ &.new-nomappinginraw {
background-color: $line-added;
}
diff --git a/app/assets/stylesheets/mailer.scss b/app/assets/stylesheets/mailer.scss
index b8cbe64df38..da120b5fb4e 100644
--- a/app/assets/stylesheets/mailer.scss
+++ b/app/assets/stylesheets/mailer.scss
@@ -2,8 +2,6 @@
// Do not use 3-letter hex codes, bgcolor vs css background-color is problematic in emails
//
-// stylelint-disable color-hex-length
-
$mailer-font: 'Helvetica Neue', Helvetica, Arial, sans-serif;
$mailer-text-color: #333;
$mailer-bg-color: #fafafa;
diff --git a/app/assets/stylesheets/page_bundles/_ide_monaco_overrides.scss b/app/assets/stylesheets/page_bundles/_ide_monaco_overrides.scss
index 57053c7f0cb..d93b4f75d77 100644
--- a/app/assets/stylesheets/page_bundles/_ide_monaco_overrides.scss
+++ b/app/assets/stylesheets/page_bundles/_ide_monaco_overrides.scss
@@ -1,9 +1,3 @@
-
-// stylelint-disable selector-class-pattern
-// stylelint-disable selector-max-compound-selectors
-// stylelint-disable stylelint-gitlab/duplicate-selectors
-// stylelint-disable stylelint-gitlab/utility-classes
-
.blob-editor-container {
flex: 1;
height: 0;
diff --git a/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss b/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss
index 25a565ce2ba..c584bbaac09 100644
--- a/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss
+++ b/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss
@@ -64,10 +64,6 @@
border-color: var(--ide-input-border, $gray-darkest);
}
}
-
- a.gl-tab-nav-item-active {
- box-shadow: inset 0 -2px 0 0 var(--ide-input-border, $gray-darkest);
- }
}
.drag-handle:hover {
diff --git a/app/assets/stylesheets/page_bundles/merge_requests.scss b/app/assets/stylesheets/page_bundles/merge_requests.scss
index 14873c54cd7..1b27e51e793 100644
--- a/app/assets/stylesheets/page_bundles/merge_requests.scss
+++ b/app/assets/stylesheets/page_bundles/merge_requests.scss
@@ -46,9 +46,7 @@ $tabs-holder-z-index: 250;
position: -webkit-sticky;
position: sticky;
// Unitless zero values are not allowed in calculations
- // stylelint-disable-next-line length-zero-no-unit
top: calc(#{$top-pos} + var(--system-header-height, 0px) + var(--performance-bar-height, 0px));
- // stylelint-disable-next-line length-zero-no-unit
max-height: calc(100vh - #{$top-pos} - var(--system-header-height, 0px) - var(--performance-bar-height, 0px) - var(--review-bar-height, 0px));
.drag-handle {
@@ -632,6 +630,24 @@ $tabs-holder-z-index: 250;
height: 24px;
}
+.mr-widget-extension-icon::after {
+ @include gl-content-empty;
+ @include gl-absolute;
+ @include gl-rounded-full;
+
+ top: 4px;
+ left: 4px;
+ width: 16px;
+ height: 16px;
+ border: 4px solid currentColor;
+}
+
+.mr-widget-extension-icon svg {
+ position: relative;
+ top: 2px;
+ left: 2px;
+}
+
.mr-widget-heading {
position: relative;
border: 1px solid var(--border-color, $border-color);
diff --git a/app/assets/stylesheets/page_bundles/oncall_schedules.scss b/app/assets/stylesheets/page_bundles/oncall_schedules.scss
index ddc638197ca..91fd2d42657 100644
--- a/app/assets/stylesheets/page_bundles/oncall_schedules.scss
+++ b/app/assets/stylesheets/page_bundles/oncall_schedules.scss
@@ -70,7 +70,7 @@ $column-right-gradient: linear-gradient(to right, $gradient-dark-gray 0%, $gradi
.timeline-header-blank,
.timeline-header-item {
- @include float-left;
+ @include gl-float-left;
height: $header-item-height;
border-bottom: $border-style;
background-color: var(--white, $white);
@@ -150,7 +150,7 @@ $column-right-gradient: linear-gradient(to right, $gradient-dark-gray 0%, $gradi
.details-cell,
.timeline-cell {
- @include float-left;
+ @include gl-float-left;
height: $item-height;
}
diff --git a/app/assets/stylesheets/page_bundles/project.scss b/app/assets/stylesheets/page_bundles/project.scss
index 0bc3cc6678c..eec5ebdb383 100644
--- a/app/assets/stylesheets/page_bundles/project.scss
+++ b/app/assets/stylesheets/page_bundles/project.scss
@@ -128,10 +128,6 @@
> li {
display: inline-block;
- &:not(:last-child) {
- margin-right: $gl-padding;
- }
-
&.right {
vertical-align: top;
margin-top: 0;
@@ -179,7 +175,6 @@
}
.btn {
- margin-bottom: $gl-padding-8;
padding: $gl-btn-vert-padding $gl-btn-padding;
line-height: $gl-btn-line-height;
@@ -190,12 +185,6 @@
}
}
-.project-buttons {
- .nav > li:not(:last-child) {
- margin-right: $gl-padding-8;
- }
-}
-
.git-empty {
margin-bottom: 7px;
diff --git a/app/assets/stylesheets/page_bundles/work_items.scss b/app/assets/stylesheets/page_bundles/work_items.scss
new file mode 100644
index 00000000000..9220fa82b46
--- /dev/null
+++ b/app/assets/stylesheets/page_bundles/work_items.scss
@@ -0,0 +1,35 @@
+@import 'mixins_and_variables_and_functions';
+
+.gl-token-selector-token-container {
+ display: flex;
+ align-items: center;
+}
+
+#weight-widget-input:not(:hover, :focus),
+#weight-widget-input[readonly] {
+ box-shadow: inset 0 0 0 $gl-border-size-1 var(--white, $white);
+}
+
+#weight-widget-input[readonly] {
+ background-color: var(--white, $white);
+}
+
+.work-item-assignees {
+ .assign-myself {
+ display: none;
+ }
+
+ .assignees-selector:hover .assign-myself {
+ display: block;
+ }
+}
+
+.work-item-labels {
+ .gl-token {
+ padding-left: $gl-spacing-scale-1;
+ }
+
+ .gl-token-close {
+ display: none;
+ }
+}
diff --git a/app/assets/stylesheets/pages/branches.scss b/app/assets/stylesheets/pages/branches.scss
index d34d309eea3..18158fab75f 100644
--- a/app/assets/stylesheets/pages/branches.scss
+++ b/app/assets/stylesheets/pages/branches.scss
@@ -1,9 +1,3 @@
-.content-list > .branch-item,
-.branch-title {
- display: flex;
- align-items: center;
-}
-
.branch-info {
flex: auto;
min-width: 0;
diff --git a/app/assets/stylesheets/pages/colors.scss b/app/assets/stylesheets/pages/colors.scss
new file mode 100644
index 00000000000..20e072b9903
--- /dev/null
+++ b/app/assets/stylesheets/pages/colors.scss
@@ -0,0 +1,24 @@
+.color-item {
+ @include gl-align-items-center;
+ @include gl-display-flex;
+}
+
+.color-item-color {
+ @include gl-flex-shrink-0;
+ @include gl-mr-3;
+ @include gl-top-0;
+}
+
+.right-sidebar-collapsed {
+ .color-item {
+ @include gl-pt-3;
+ }
+
+ .color-item-color {
+ margin: 0;
+ }
+
+ .color-item-text {
+ display: none;
+ }
+}
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index 80b9e378252..c96d8ecc782 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -95,8 +95,14 @@
}
}
-.commits-row + .commits-row {
- border-top: 1px solid $white-normal;
+.commits-row {
+ + .commits-row {
+ border-top: 1px solid $white-normal;
+ }
+
+ + .commits-empty {
+ display: none;
+ }
}
.text-expander {
@@ -133,18 +139,6 @@
}
}
-.commit-detail {
- display: flex;
- justify-content: space-between;
- align-items: start;
- flex-grow: 1;
- min-width: 0;
-
- .project-namespace {
- color: $gl-text-color-tertiary;
- }
-}
-
.commit-content {
padding-right: 10px;
white-space: normal;
diff --git a/app/assets/stylesheets/pages/groups.scss b/app/assets/stylesheets/pages/groups.scss
index 96ca9fbcb43..2e1bb9b9eac 100644
--- a/app/assets/stylesheets/pages/groups.scss
+++ b/app/assets/stylesheets/pages/groups.scss
@@ -209,7 +209,6 @@ table.pipeline-project-metrics tr td {
}
.title {
- margin-top: -$gl-padding-8; // negative margin required for flex-wrap
font-size: $gl-font-size;
}
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index f3182af3047..51f964a4b70 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -176,11 +176,16 @@
}
.gutter-toggle {
+ display: flex;
+ align-items: center;
margin-left: 20px;
- padding-left: 10px;
+ padding: 4px;
+ border-radius: 4px;
+ height: 24px;
&:hover {
color: $gl-text-color;
+ background: $gray-50;
}
&:hover,
@@ -291,7 +296,7 @@
@include media-breakpoint-up(lg) {
padding: 0;
- form {
+ .issuable-context-form {
--initial-top: calc(#{$header-height} + #{$mr-tabs-height});
--top: var(--initial-top);
@@ -338,7 +343,6 @@
}
.gutter-toggle {
- border-left: 1px solid $border-gray-normal;
text-align: center;
}
@@ -405,8 +409,8 @@
width: 100%;
height: $sidebar-toggle-height;
margin-left: 0;
- padding-left: 0;
border-bottom: 1px solid $border-white-normal;
+ border-radius: 0;
}
a.gutter-toggle {
@@ -709,10 +713,6 @@
line-height: 20px;
padding: 0;
}
-
- .issue-updated-at {
- line-height: 20px;
- }
}
@include media-breakpoint-down(xs) {
@@ -736,7 +736,7 @@
.issuable-milestone,
.issuable-info,
.task-status,
- .issuable-updated-at {
+ .issuable-timestamp {
font-weight: $gl-font-weight-normal;
color: $gl-text-color-secondary;
@@ -991,4 +991,19 @@
bottom: -10%;
}
}
+
+ &.timeline-event-note-form {
+ &::before {
+ top: -15% !important; // Override default positioning
+ height: 20%;
+ }
+
+ &::after {
+ content: none;
+ }
+ }
+}
+
+.timeline-event-note-form {
+ padding-left: 20px;
}
diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss
index 04e0ef6631e..c0a283ec643 100644
--- a/app/assets/stylesheets/pages/issues.scss
+++ b/app/assets/stylesheets/pages/issues.scss
@@ -124,8 +124,16 @@ ul.related-merge-requests > li gl-emoji {
.new-branch-col {
.discussion-filter-container {
- &:not(:only-child) {
- margin-right: $gl-padding-8;
+ &:not(:last-child) {
+ margin-right: $gl-spacing-scale-3;
+ }
+ }
+
+ @include media-breakpoint-down(xs) {
+ width: 100%;
+
+ > div:not(:last-child) {
+ margin-bottom: $gl-spacing-scale-3;
}
}
}
@@ -147,6 +155,16 @@ ul.related-merge-requests > li gl-emoji {
.btn-group:not(.hidden) {
display: flex;
+
+ @include media-breakpoint-down(xs) {
+ .btn.btn-confirm {
+ @include gl-justify-content-start;
+
+ &.dropdown-toggle {
+ @include gl-flex-grow-0;
+ }
+ }
+ }
}
.js-create-merge-request {
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index a3fbedd87a9..96fe6caeea2 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -349,3 +349,36 @@ $comparison-empty-state-height: 62px;
}
}
}
+
+.mr-experience-survey-wrapper {
+ // setting this explicitly because:
+ // diff-files-holder has z-index 203
+ // z-index 9999 utility class breaks tooltips
+ z-index: 210;
+}
+
+.mr-experience-survey-body {
+ width: 300px;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.mr-experience-survey-legal {
+ order: 1;
+}
+
+.mr-experience-survey-logo {
+ width: 16px;
+
+ svg {
+ max-width: 100%;
+ }
+}
+
+.survey-slide-up-enter {
+ transform: translateY(10px);
+ opacity: 0;
+}
+
+.survey-slide-up-enter-active {
+ @include gl-transition-slow;
+}
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index 82e96dee4c6..4d0cf30a3b2 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -70,41 +70,6 @@ $system-note-svg-size: 16px;
}
}
- .replies-toggle {
- background-color: $gray-light;
- padding: $gl-padding-8 $gl-padding;
- border-top: 1px solid $gray-100;
- border-bottom: 1px solid $gray-100;
-
- .collapse-replies-btn:hover {
- color: $blue-600;
- }
-
- &.collapsed {
- color: $gl-text-color-secondary;
- border-radius: 0 0 $border-radius-default $border-radius-default;
-
- img {
- margin: -2px 4px 0 0;
- }
-
- .author-link {
- color: $gl-text-color;
- }
- }
-
- .user-avatar-link {
- &:last-child img {
- margin-right: $gl-padding-8;
- }
- }
-
- .btn-link {
- border: 0;
- vertical-align: baseline;
- }
- }
-
.discussion-toggle-replies {
border-top: 0;
border-radius: 4px 4px 0 0;
diff --git a/app/assets/stylesheets/pages/profiles/preferences.scss b/app/assets/stylesheets/pages/profiles/preferences.scss
index 518ec181e5e..c7d7aacceec 100644
--- a/app/assets/stylesheets/pages/profiles/preferences.scss
+++ b/app/assets/stylesheets/pages/profiles/preferences.scss
@@ -1,6 +1,6 @@
.application-theme {
- $ui-gray-bg: #2e2e2e;
- $ui-light-gray-bg: #dfdfdf;
+ $ui-gray-bg: #303030;
+ $ui-light-gray-bg: #f0f0f0;
$ui-dark-mode-bg: #1f1f1f;
.preview {
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 3b76130dd1a..0d45beab983 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -548,14 +548,6 @@ pre.light-well {
}
}
-.new-protected-branch,
-.new-protected-tag {
- label {
- margin-top: 6px;
- font-weight: $gl-font-weight-normal;
- }
-}
-
.protected-branches-list,
.protected-tags-list {
margin-bottom: 30px;
diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index 8755db83d35..f1865a7dc40 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -4,7 +4,8 @@ $search-sidebar-min-width: 240px;
$search-sidebar-max-width: 300px;
$search-input-field-x-min-width: 200px;
$search-input-field-min-width: 320px;
-$search-input-field-max-width: 600px;
+$search-input-field-max-width: 640px;
+$search-keyboard-shortcut: '/';
$border-radius-medium: 3px;
@@ -67,54 +68,53 @@ input[type='checkbox']:hover {
}
}
-// This is a temporary workaround!
-// the button in GitLab UI Search components need to be updated to not be the small size
-// see in Figma: https://www.figma.com/file/qEddyqCrI7kPSBjGmwkZzQ/Component-library?node-id=43905%3A45540
-.header-search .gl-search-box-by-type-clear.btn-sm {
- padding: 0.5rem !important;
-}
-
.header-search {
min-width: $search-input-field-min-width;
+ // This is a temporary workaround!
+ // the button in GitLab UI Search components need to be updated to not be the small size
+ // see in Figma: https://www.figma.com/file/qEddyqCrI7kPSBjGmwkZzQ/Component-library?node-id=43905%3A45540
+ .gl-search-box-by-type-clear.btn-sm {
+ padding: 0.5rem !important;
+ }
+
@include media-breakpoint-between(md, lg) {
min-width: $search-input-field-x-min-width;
}
- input,
- svg {
- transition: border-color ease-in-out $default-transition-duration,
- background-color ease-in-out $default-transition-duration;
+ &.is-active {
+ &.is-searching {
+ .in-search-scope-help {
+ position: absolute;
+ top: $gl-spacing-scale-2;
+ right: 2.125rem;
+ z-index: 2;
+ }
+ }
}
- &.is-not-active {
- .btn.gl-clear-icon-button {
+ &.is-not-searching {
+ .in-search-scope-help {
+ display: none;
+ }
+ }
+
+ .keyboard-shortcut-helper {
+ transform: translateY(calc(50% - 2px));
+ box-shadow: none;
+ border-color: transparent;
+ }
+
+ &.is-active {
+ .keyboard-shortcut-helper {
display: none;
}
+ }
- &::after {
- content: '/';
- display: inline-block;
- position: absolute;
- top: 0;
- right: 8px;
- transform: translateY(calc(50% - 4px));
- padding: 4px 5px;
- font-size: $gl-font-size-small;
- font-family: $monospace-font;
- line-height: 1;
- vertical-align: middle;
- border-width: 0;
- border-style: solid;
- border-image: none;
- border-radius: $border-radius-medium;
- box-shadow: none;
- white-space: pre-wrap;
- box-sizing: border-box;
- // Safari
- word-wrap: break-word;
- overflow-wrap: break-word;
- word-break: keep-all;
+ &.is-not-active {
+ .btn.gl-clear-icon-button,
+ .in-search-scope-help {
+ display: none;
}
}
}
diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss
index 0c7b74684cc..935595d1b3b 100644
--- a/app/assets/stylesheets/pages/settings.scss
+++ b/app/assets/stylesheets/pages/settings.scss
@@ -28,6 +28,7 @@
&:first-of-type {
margin-top: 10px;
+ padding-top: 0;
border: 0;
}
@@ -156,39 +157,33 @@
}
.visibility-level-setting {
- .form-check {
- margin-bottom: 10px;
-
- .option-title {
- font-weight: $gl-font-weight-normal;
- display: inline-block;
- color: $gl-text-color;
- vertical-align: top;
- }
+ .option-title {
+ font-weight: $gl-font-weight-normal;
+ display: inline-block;
+ color: $gl-text-color;
+ vertical-align: top;
+ }
- .option-description,
- .option-disabled-reason {
- margin-left: 20px;
- color: $project-option-descr-color;
- margin-top: -5px;
+ .option-description,
+ .option-disabled-reason {
+ color: $project-option-descr-color;
+ }
+
+ .option-disabled-reason {
+ display: none;
+ }
+
+ .disabled {
+ svg {
+ opacity: 0.5;
}
- .option-disabled-reason {
+ .option-description {
display: none;
}
- &.disabled {
- svg {
- opacity: 0.5;
- }
-
- .option-description {
- display: none;
- }
-
- .option-disabled-reason {
- display: block;
- }
+ .option-disabled-reason {
+ display: block;
}
}
}
@@ -320,7 +315,8 @@
}
.ci-variable-table,
-.deploy-freeze-table {
+.deploy-freeze-table,
+.ci-secure-files-table {
table {
thead {
border-bottom: 1px solid $white-normal;
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index 4cefa60b12a..801c9ea828f 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -2,10 +2,16 @@
// Please see the feedback issue for more details and help:
// https://gitlab.com/gitlab-org/gitlab/-/issues/331812
@charset "UTF-8";
+:root {
+ color-scheme: dark;
+}
body.gl-dark {
+ --gray-10: #1f1f1f;
--gray-50: #303030;
--gray-100: #404040;
+ --gray-200: #525252;
--gray-600: #bfbfbf;
+ --gray-700: #dbdbdb;
--gray-900: #fafafa;
--green-100: #0d532a;
--green-700: #91d4a8;
@@ -61,6 +67,11 @@ a:not([href]):not([class]) {
color: inherit;
text-decoration: none;
}
+kbd {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
+ "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ font-size: 1em;
+}
img {
vertical-align: middle;
border-style: none;
@@ -105,6 +116,18 @@ button::-moz-focus-inner,
padding-left: 0;
list-style: none;
}
+kbd {
+ padding: 0.2rem 0.4rem;
+ font-size: 90%;
+ color: #333;
+ background-color: #fafafa;
+ border-radius: 0.2rem;
+}
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 600;
+}
.container-fluid {
width: 100%;
padding-right: 15px;
@@ -740,6 +763,22 @@ input {
.form-control::placeholder {
color: #868686;
}
+kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ font-size: 0.6875rem;
+ line-height: 10px;
+ color: var(--gray-700, #dbdbdb);
+ vertical-align: middle;
+ background-color: var(--gray-10, #1f1f1f);
+ border-width: 1px;
+ border-style: solid;
+ border-color: var(--gray-100, #404040) var(--gray-100, #404040)
+ var(--gray-200, #525252);
+ border-image: none;
+ border-radius: 3px;
+ box-shadow: 0 -1px 0 var(--gray-200, #525252) inset;
+}
.navbar-gitlab {
padding: 0 16px;
z-index: 1000;
@@ -1504,7 +1543,7 @@ svg.s16 {
vertical-align: -3px;
}
.header-content .header-search-new {
- max-width: 600px;
+ max-width: 640px;
}
.header-search {
min-width: 320px;
@@ -1514,29 +1553,10 @@ svg.s16 {
min-width: 200px;
}
}
-.header-search.is-not-active::after {
- content: "/";
- display: inline-block;
- position: absolute;
- top: 0;
- right: 8px;
- transform: translateY(calc(50% - 4px));
- padding: 4px 5px;
- font-size: 12px;
- font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
- "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
- line-height: 1;
- vertical-align: middle;
- border-width: 0;
- border-style: solid;
- border-image: none;
- border-radius: 3px;
+.header-search .keyboard-shortcut-helper {
+ transform: translateY(calc(50% - 2px));
box-shadow: none;
- white-space: pre-wrap;
- box-sizing: border-box;
- word-wrap: break-word;
- overflow-wrap: break-word;
- word-break: keep-all;
+ border-color: transparent;
}
.search {
margin: 0 8px;
@@ -1697,6 +1717,9 @@ svg.s16 {
.rect-avatar.s32 {
border-radius: 4px;
}
+:root {
+ color-scheme: dark;
+}
body.gl-dark {
--gray-10: #1f1f1f;
--gray-50: #303030;
@@ -1884,7 +1907,7 @@ body.gl-dark .header-search input::placeholder {
body.gl-dark .header-search input:active::placeholder {
color: #868686;
}
-body.gl-dark .header-search.is-not-active::after {
+body.gl-dark .header-search.is-not-active .keyboard-shortcut-helper {
color: #fafafa;
background-color: rgba(250, 250, 250, 0.2);
}
@@ -1938,6 +1961,9 @@ body.gl-dark .navbar-gitlab .search form .search-input {
color: var(--gl-text-color);
}
+:root {
+ color-scheme: dark;
+}
body.gl-dark {
--gray-10: #1f1f1f;
--gray-50: #303030;
@@ -2030,7 +2056,6 @@ body.gl-dark {
--nav-active-bg: rgba(255, 255, 255, 0.08);
}
.tab-width-8 {
- -moz-tab-size: 8;
tab-size: 8;
}
.gl-sr-only {
@@ -2084,6 +2109,12 @@ body.gl-dark {
.gl-absolute {
position: absolute;
}
+.gl-top-0 {
+ top: 0;
+}
+.gl-right-3 {
+ right: 0.5rem;
+}
.gl-w-full {
width: 100%;
}
@@ -2119,6 +2150,9 @@ body.gl-dark {
.gl-font-weight-bold {
font-weight: 600;
}
+.gl-z-index-1 {
+ z-index: 1;
+}
@import "startup/cloaking";
@include cloak-startup-scss(none);
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index cb3c97f18a3..43ca5a512d5 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -46,6 +46,11 @@ a:not([href]):not([class]) {
color: inherit;
text-decoration: none;
}
+kbd {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
+ "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ font-size: 1em;
+}
img {
vertical-align: middle;
border-style: none;
@@ -90,6 +95,18 @@ button::-moz-focus-inner,
padding-left: 0;
list-style: none;
}
+kbd {
+ padding: 0.2rem 0.4rem;
+ font-size: 90%;
+ color: #fff;
+ background-color: #303030;
+ border-radius: 0.2rem;
+}
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 600;
+}
.container-fluid {
width: 100%;
padding-right: 15px;
@@ -725,6 +742,22 @@ input {
.form-control::placeholder {
color: #868686;
}
+kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ font-size: 0.6875rem;
+ line-height: 10px;
+ color: var(--gray-700, #525252);
+ vertical-align: middle;
+ background-color: var(--gray-10, #f5f5f5);
+ border-width: 1px;
+ border-style: solid;
+ border-color: var(--gray-100, #dbdbdb) var(--gray-100, #dbdbdb)
+ var(--gray-200, #bfbfbf);
+ border-image: none;
+ border-radius: 3px;
+ box-shadow: 0 -1px 0 var(--gray-200, #bfbfbf) inset;
+}
.navbar-gitlab {
padding: 0 16px;
z-index: 1000;
@@ -1489,7 +1522,7 @@ svg.s16 {
vertical-align: -3px;
}
.header-content .header-search-new {
- max-width: 600px;
+ max-width: 640px;
}
.header-search {
min-width: 320px;
@@ -1499,29 +1532,10 @@ svg.s16 {
min-width: 200px;
}
}
-.header-search.is-not-active::after {
- content: "/";
- display: inline-block;
- position: absolute;
- top: 0;
- right: 8px;
- transform: translateY(calc(50% - 4px));
- padding: 4px 5px;
- font-size: 12px;
- font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
- "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
- line-height: 1;
- vertical-align: middle;
- border-width: 0;
- border-style: solid;
- border-image: none;
- border-radius: 3px;
+.header-search .keyboard-shortcut-helper {
+ transform: translateY(calc(50% - 2px));
box-shadow: none;
- white-space: pre-wrap;
- box-sizing: border-box;
- word-wrap: break-word;
- overflow-wrap: break-word;
- word-break: keep-all;
+ border-color: transparent;
}
.search {
margin: 0 8px;
@@ -1684,7 +1698,6 @@ svg.s16 {
}
.tab-width-8 {
- -moz-tab-size: 8;
tab-size: 8;
}
.gl-sr-only {
@@ -1738,6 +1751,12 @@ svg.s16 {
.gl-absolute {
position: absolute;
}
+.gl-top-0 {
+ top: 0;
+}
+.gl-right-3 {
+ right: 0.5rem;
+}
.gl-w-full {
width: 100%;
}
@@ -1773,6 +1792,9 @@ svg.s16 {
.gl-font-weight-bold {
font-weight: 600;
}
+.gl-z-index-1 {
+ z-index: 1;
+}
@import "startup/cloaking";
@include cloak-startup-scss(none);
diff --git a/app/assets/stylesheets/themes/_dark.scss b/app/assets/stylesheets/themes/_dark.scss
index fe8a5aec1b3..e6e736ef47c 100644
--- a/app/assets/stylesheets/themes/_dark.scss
+++ b/app/assets/stylesheets/themes/_dark.scss
@@ -101,6 +101,10 @@ $white-dark: #444;
$border-color: #4f4f4f;
$nav-active-bg: rgba(255, 255, 255, 0.08);
+:root {
+ color-scheme: dark;
+}
+
body.gl-dark {
--gray-10: #{$gray-10};
--gray-50: #{$gray-50};
diff --git a/app/assets/stylesheets/themes/theme_helper.scss b/app/assets/stylesheets/themes/theme_helper.scss
index ad352f0022b..2b6221a6c87 100644
--- a/app/assets/stylesheets/themes/theme_helper.scss
+++ b/app/assets/stylesheets/themes/theme_helper.scss
@@ -159,7 +159,6 @@
color: rgba($search-and-nav-links, 0.8);
}
-
input {
background-color: transparent;
color: rgba($search-and-nav-links, 0.8);
@@ -177,9 +176,11 @@
}
}
- &.is-not-active::after {
- color: $search-and-nav-links;
- background-color: rgba($search-and-nav-links, 0.2);
+ &.is-not-active {
+ .keyboard-shortcut-helper {
+ color: $search-and-nav-links;
+ background-color: rgba($search-and-nav-links, 0.2);
+ }
}
}
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index 27fcade548f..6bd05f90f26 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -367,50 +367,6 @@ to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1709
-webkit-backdrop-filter: blur(2px); // still required by Safari
}
-/*
- * The styles from here to END-#1825 will be moved to @gitlab/ui by
- * https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1825
- */
-.gl-lg-mx-12 {
- @include media-breakpoint-up(lg) {
- margin-left: $gl-spacing-scale-12;
- margin-right: $gl-spacing-scale-12;
- }
-}
-
-.gl-lg-ml-12 {
- @include media-breakpoint-up(lg) {
- margin-left: $gl-spacing-scale-12;
- }
-}
-
-.gl-lg-mr-12 {
- @include media-breakpoint-up(lg) {
- margin-right: $gl-spacing-scale-12;
- }
-}
-
-.gl-lg-ml-10 {
- @include media-breakpoint-up(lg) {
- margin-left: $gl-spacing-scale-10;
- }
-}
-
-.gl-lg-mr-10 {
- @include media-breakpoint-up(lg) {
- margin-right: $gl-spacing-scale-10;
- }
-}
-
-.gl-lg-w-30p {
- @include gl-media-breakpoint-up(lg) {
- width: 30%;
- }
-}
-
-.gl-lg-w-40p {
- @include gl-media-breakpoint-up(lg) {
- width: 40%;
- }
+.gl-flex-flow-row-wrap {
+ flex-flow: row wrap;
}
-/* END-#1825 */
diff --git a/app/channels/awareness_channel.rb b/app/channels/awareness_channel.rb
new file mode 100644
index 00000000000..554e057ca83
--- /dev/null
+++ b/app/channels/awareness_channel.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+class AwarenessChannel < ApplicationCable::Channel # rubocop:disable Gitlab/NamespacedClass
+ REFRESH_INTERVAL = ENV.fetch("GITLAB_AWARENESS_REFRESH_INTERVAL_SEC", 60)
+ private_constant :REFRESH_INTERVAL
+
+ # Produces a refresh interval value, based of the
+ # GITLAB_AWARENESS_REFRESH_INTERVAL_SEC environment variable or the given
+ # default. Makes sure, that the interval after a jitter is applied, is never
+ # less than half the predefined interval.
+ def self.refresh_interval(range: -10..10)
+ min = REFRESH_INTERVAL / 2.to_f
+ [min.to_i, REFRESH_INTERVAL.to_i + rand(range)].max.seconds
+ end
+ private_class_method :refresh_interval
+
+ # keep clients updated about session membership
+ periodically every: self.refresh_interval do
+ transmit payload
+ end
+
+ def subscribed
+ reject unless valid_subscription?
+ return if subscription_rejected?
+
+ stream_for session, coder: ActiveSupport::JSON
+
+ session.join(current_user)
+ AwarenessChannel.broadcast_to(session, payload)
+ end
+
+ def unsubscribed
+ return if subscription_rejected?
+
+ session.leave(current_user)
+ AwarenessChannel.broadcast_to(session, payload)
+ end
+
+ # Allows a client to let the server know they are still around. This is not
+ # like a heartbeat mechanism. This can be triggered by any action that results
+ # in a meaningful "presence" update. Like scrolling the screen (debounce),
+ # window becoming active, user starting to type in a text field, etc.
+ def touch
+ session.touch!(current_user)
+
+ transmit payload
+ end
+
+ private
+
+ def valid_subscription?
+ current_user.present? && path.present?
+ end
+
+ def payload
+ { collaborators: collaborators }
+ end
+
+ def collaborators
+ session.online_users_with_last_activity.map do |user, last_activity|
+ collaborator(user, last_activity)
+ end
+ end
+
+ def collaborator(user, last_activity)
+ {
+ id: user.id,
+ name: user.name,
+ avatar_url: user.avatar_url(size: 36),
+ last_activity: last_activity,
+ last_activity_humanized: ActionController::Base.helpers.distance_of_time_in_words(
+ Time.zone.now, last_activity
+ )
+ }
+ end
+
+ def session
+ @session ||= AwarenessSession.for(path)
+ end
+
+ def path
+ params[:path]
+ end
+end
diff --git a/app/components/pajamas/spinner_component.html.haml b/app/components/pajamas/spinner_component.html.haml
new file mode 100644
index 00000000000..aab9c5fdbf7
--- /dev/null
+++ b/app/components/pajamas/spinner_component.html.haml
@@ -0,0 +1,5 @@
+.gl-spinner-container{ class: @class }
+ - if @inline
+ %span{ class: spinner_class, aria: {label: @label} }
+ - else
+ %div{ class: spinner_class, aria: {label: @label} }
diff --git a/app/components/pajamas/spinner_component.rb b/app/components/pajamas/spinner_component.rb
new file mode 100644
index 00000000000..c7ffc1ec3da
--- /dev/null
+++ b/app/components/pajamas/spinner_component.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Pajamas
+ class SpinnerComponent < Pajamas::Component
+ # @param [String] class
+ # @param [Symbol] color
+ # @param [Boolean] inline
+ # @param [String] label
+ # @param [Symbol] size
+ def initialize(class: '', color: :dark, inline: false, label: _("Loading"), size: :sm)
+ @class = binding.local_variable_get(:class)
+ @color = filter_attribute(color.to_sym, COLOR_OPTIONS)
+ @inline = inline
+ @label = label.presence
+ @size = filter_attribute(size.to_sym, SIZE_OPTIONS)
+ end
+
+ private
+
+ def spinner_class
+ ["gl-spinner", "gl-spinner-#{@size}", "gl-spinner-#{@color}"]
+ end
+
+ COLOR_OPTIONS = [:light, :dark].freeze
+ SIZE_OPTIONS = [:sm, :md, :lg, :xl].freeze
+ end
+end
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index 7f95b136e4e..e05e87ffd89 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -28,7 +28,8 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
:create_self_monitoring_project,
:status_create_self_monitoring_project,
:delete_self_monitoring_project,
- :status_delete_self_monitoring_project
+ :status_delete_self_monitoring_project,
+ :reset_error_tracking_access_token
]
feature_category :source_code_management, [:repository, :clear_repository_check_states]
@@ -37,6 +38,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
feature_category :service_ping, [:usage_data, :service_usage_data]
feature_category :integrations, [:integrations]
feature_category :pages, [:lets_encrypt_terms_of_service]
+ feature_category :error_tracking, [:reset_error_tracking_access_token]
VALID_SETTING_PANELS = %w(general repository
ci_cd reporting metrics_and_profiling
@@ -96,6 +98,13 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
redirect_back_or_default
end
+ def reset_error_tracking_access_token
+ @application_setting.reset_error_tracking_access_token!
+
+ redirect_to general_admin_application_settings_path,
+ notice: _('New error tracking access token has been generated!')
+ end
+
def clear_repository_check_states
RepositoryCheck::ClearWorker.perform_async # rubocop:disable CodeReuse/Worker
diff --git a/app/controllers/admin/broadcast_messages_controller.rb b/app/controllers/admin/broadcast_messages_controller.rb
index 865af244773..bf573d45852 100644
--- a/app/controllers/admin/broadcast_messages_controller.rb
+++ b/app/controllers/admin/broadcast_messages_controller.rb
@@ -5,7 +5,7 @@ class Admin::BroadcastMessagesController < Admin::ApplicationController
before_action :finder, only: [:edit, :update, :destroy]
- feature_category :navigation
+ feature_category :onboarding
urgency :low
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/controllers/admin/hooks_controller.rb b/app/controllers/admin/hooks_controller.rb
index 6f5475a4a78..810801d4209 100644
--- a/app/controllers/admin/hooks_controller.rb
+++ b/app/controllers/admin/hooks_controller.rb
@@ -8,40 +8,6 @@ class Admin::HooksController < Admin::ApplicationController
feature_category :integrations
urgency :low, [:test]
- def index
- @hooks = SystemHook.all.load
- @hook = SystemHook.new
- end
-
- def create
- @hook = SystemHook.new(hook_params.to_h)
-
- if @hook.save
- redirect_to admin_hooks_path, notice: _('Hook was successfully created.')
- else
- @hooks = SystemHook.all
- render :index
- end
- end
-
- def edit
- end
-
- def update
- if hook.update(hook_params)
- flash[:notice] = _('System hook was successfully updated.')
- redirect_to admin_hooks_path
- else
- render 'edit'
- end
- end
-
- def destroy
- destroy_hook(hook)
-
- redirect_to admin_hooks_path, status: :found
- end
-
def test
result = TestHooks::SystemService.new(hook, current_user, params[:trigger]).execute
@@ -52,6 +18,10 @@ class Admin::HooksController < Admin::ApplicationController
private
+ def relation
+ SystemHook
+ end
+
def hook
@hook ||= SystemHook.find(params[:id])
end
@@ -60,12 +30,11 @@ class Admin::HooksController < Admin::ApplicationController
@hook_logs ||= hook.web_hook_logs.recent.page(params[:page])
end
- def hook_params
- params.require(:hook).permit(
- :enable_ssl_verification,
- :token,
- :url,
- *SystemHook.triggers.values
- )
+ def hook_param_names
+ %i[enable_ssl_verification token url]
+ end
+
+ def trigger_values
+ SystemHook.triggers.values
end
end
diff --git a/app/controllers/admin/system_info_controller.rb b/app/controllers/admin/system_info_controller.rb
index 7ae930abb84..f81b02ad31f 100644
--- a/app/controllers/admin/system_info_controller.rb
+++ b/app/controllers/admin/system_info_controller.rb
@@ -12,7 +12,10 @@ class Admin::SystemInfoController < Admin::ApplicationController
EXCLUDED_MOUNT_TYPES = [
'autofs',
'binfmt_misc',
+ 'bpf',
'cgroup',
+ 'cgroup2',
+ 'configfs',
'debugfs',
'devfs',
'devpts',
diff --git a/app/controllers/admin/topics_controller.rb b/app/controllers/admin/topics_controller.rb
index 908313bdb83..b451928e591 100644
--- a/app/controllers/admin/topics_controller.rb
+++ b/app/controllers/admin/topics_controller.rb
@@ -4,7 +4,7 @@ class Admin::TopicsController < Admin::ApplicationController
include SendFileUpload
include PreviewMarkdown
- before_action :topic, only: [:edit, :update]
+ before_action :topic, only: [:edit, :update, :destroy]
feature_category :projects
@@ -37,6 +37,14 @@ class Admin::TopicsController < Admin::ApplicationController
end
end
+ def destroy
+ @topic.destroy!
+
+ redirect_to admin_topics_path,
+ status: :found,
+ notice: _('Topic %{topic_name} was successfully removed.') % { topic_name: @topic.title_or_name }
+ end
+
private
def topic
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 30760d472a4..71d9910b4b8 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -179,6 +179,10 @@ class ApplicationController < ActionController::Base
payload[:queue_duration_s] = request.env[::Gitlab::Middleware::RailsQueueDuration::GITLAB_RAILS_QUEUE_DURATION_KEY]
+ if Feature.enabled?(:log_response_length)
+ payload[:response_bytes] = response.body_parts.sum(&:bytesize)
+ end
+
store_cloudflare_headers!(payload, request)
end
diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb
index a04fd09aa22..51150700860 100644
--- a/app/controllers/clusters/clusters_controller.rb
+++ b/app/controllers/clusters/clusters_controller.rb
@@ -50,7 +50,6 @@ class Clusters::ClustersController < Clusters::BaseController
def show
if params[:tab] == 'integrations'
@prometheus_integration = Clusters::IntegrationPresenter.new(@cluster.find_or_build_integration_prometheus)
- @elastic_stack_integration = Clusters::IntegrationPresenter.new(@cluster.find_or_build_integration_elastic_stack)
end
end
diff --git a/app/controllers/concerns/google_analytics_csp.rb b/app/controllers/concerns/google_analytics_csp.rb
new file mode 100644
index 00000000000..1a8e405928d
--- /dev/null
+++ b/app/controllers/concerns/google_analytics_csp.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module GoogleAnalyticsCSP
+ extend ActiveSupport::Concern
+
+ included do
+ content_security_policy do |policy|
+ next unless helpers.google_tag_manager_enabled? || policy.directives.present?
+
+ default_script_src = policy.directives['script-src'] || policy.directives['default-src']
+ script_src_values = Array.wrap(default_script_src) | ['*.googletagmanager.com']
+ policy.script_src(*script_src_values)
+
+ default_img_src = policy.directives['img-src'] || policy.directives['default-src']
+ img_src_values = Array.wrap(default_img_src) | ['*.google-analytics.com', '*.googletagmanager.com']
+ policy.img_src(*img_src_values)
+
+ default_connect_src = policy.directives['connect-src'] || policy.directives['default-src']
+ connect_src_values =
+ Array.wrap(default_connect_src) | ['*.google-analytics.com', '*.analytics.google.com', '*.googletagmanager.com']
+ policy.connect_src(*connect_src_values)
+ end
+ end
+end
diff --git a/app/controllers/concerns/harbor/access.rb b/app/controllers/concerns/harbor/access.rb
new file mode 100644
index 00000000000..70de72f15fc
--- /dev/null
+++ b/app/controllers/concerns/harbor/access.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Harbor
+ module Access
+ extend ActiveSupport::Concern
+
+ included do
+ before_action :harbor_registry_enabled!
+ before_action :authorize_read_harbor_registry!
+ before_action do
+ push_frontend_feature_flag(:harbor_registry_integration)
+ end
+
+ feature_category :integrations
+ end
+
+ private
+
+ def harbor_registry_enabled!
+ render_404 unless Feature.enabled?(:harbor_registry_integration)
+ end
+
+ def authorize_read_harbor_registry!
+ raise NotImplementedError
+ end
+ end
+end
diff --git a/app/controllers/concerns/harbor/artifact.rb b/app/controllers/concerns/harbor/artifact.rb
new file mode 100644
index 00000000000..c9d7d26fbb9
--- /dev/null
+++ b/app/controllers/concerns/harbor/artifact.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Harbor
+ module Artifact
+ def index
+ respond_to do |format|
+ format.json do
+ artifacts
+ end
+ end
+ end
+
+ private
+
+ def query_params
+ params.permit(:repository_id, :search, :sort, :page, :limit)
+ end
+
+ def query
+ Gitlab::Harbor::Query.new(container.harbor_integration, query_params)
+ end
+
+ def artifacts
+ unless query.valid?
+ return render(
+ json: { message: 'Invalid parameters', errors: query.errors },
+ status: :unprocessable_entity
+ )
+ end
+
+ artifacts_json = ::Integrations::HarborSerializers::ArtifactSerializer.new
+ .with_pagination(request, response)
+ .represent(query.artifacts)
+ render json: artifacts_json
+ end
+
+ def container
+ raise NotImplementedError
+ end
+ end
+end
diff --git a/app/controllers/concerns/harbor/repository.rb b/app/controllers/concerns/harbor/repository.rb
new file mode 100644
index 00000000000..0e541e2172e
--- /dev/null
+++ b/app/controllers/concerns/harbor/repository.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module Harbor
+ module Repository
+ def index
+ respond_to do |format|
+ format.html
+ format.json do
+ repositories
+ end
+ end
+ end
+
+ # The show action renders index to allow frontend routing to work on page refresh
+ def show
+ render :index
+ end
+
+ private
+
+ def query_params
+ params.permit(:search, :sort, :page, :limit)
+ end
+
+ def query
+ Gitlab::Harbor::Query.new(container.harbor_integration, query_params)
+ end
+
+ def repositories
+ unless query.valid?
+ return render(
+ json: { message: 'Invalid parameters', errors: query.errors },
+ status: :unprocessable_entity
+ )
+ end
+
+ repositories_json = ::Integrations::HarborSerializers::RepositorySerializer.new
+ .with_pagination(request, response)
+ .represent(
+ query.repositories,
+ url: container.harbor_integration.url,
+ project_name: container.harbor_integration.project_name
+ )
+ render json: repositories_json
+ end
+
+ def container
+ raise NotImplementedError
+ end
+ end
+end
diff --git a/app/controllers/concerns/harbor/tag.rb b/app/controllers/concerns/harbor/tag.rb
new file mode 100644
index 00000000000..e0c00d1155a
--- /dev/null
+++ b/app/controllers/concerns/harbor/tag.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Harbor
+ module Tag
+ def index
+ respond_to do |format|
+ format.json do
+ tags
+ end
+ end
+ end
+
+ private
+
+ def query_params
+ params.permit(:repository_id, :artifact_id, :sort, :page, :limit)
+ end
+
+ def query
+ Gitlab::Harbor::Query.new(container.harbor_integration, query_params)
+ end
+
+ def tags
+ unless query.valid?
+ return render(
+ json: { message: 'Invalid parameters', errors: query.errors },
+ status: :unprocessable_entity
+ )
+ end
+
+ tags_json = ::Integrations::HarborSerializers::TagSerializer.new
+ .with_pagination(request, response)
+ .represent(query.tags)
+ render json: tags_json
+ end
+
+ def container
+ raise NotImplementedError
+ end
+ end
+end
diff --git a/app/controllers/concerns/integrations/hooks_execution.rb b/app/controllers/concerns/integrations/hooks_execution.rb
index 6a9d3d51f9b..fb26840168f 100644
--- a/app/controllers/concerns/integrations/hooks_execution.rb
+++ b/app/controllers/concerns/integrations/hooks_execution.rb
@@ -3,8 +3,68 @@
module Integrations::HooksExecution
extend ActiveSupport::Concern
+ included do
+ attr_writer :hooks, :hook
+ end
+
+ def index
+ self.hooks = relation.select(&:persisted?)
+ self.hook = relation.new
+ end
+
+ def create
+ self.hook = relation.new(hook_params)
+ hook.save
+
+ unless hook.valid?
+ self.hooks = relation.select(&:persisted?)
+ flash[:alert] = hook.errors.full_messages.join.html_safe
+ end
+
+ redirect_to action: :index
+ end
+
+ def update
+ if hook.update(hook_params)
+ flash[:notice] = _('Hook was successfully updated.')
+ redirect_to action: :index
+ else
+ render 'edit'
+ end
+ end
+
+ def destroy
+ destroy_hook(hook)
+
+ redirect_to action: :index, status: :found
+ end
+
+ def edit
+ redirect_to(action: :index) unless hook
+ end
+
private
+ def hook_params
+ permitted = hook_param_names + trigger_values
+ permitted << { url_variables: [:key, :value] }
+
+ ps = params.require(:hook).permit(*permitted).to_h
+
+ ps[:url_variables] = ps[:url_variables].to_h { [_1[:key], _1[:value].presence] } if ps.key?(:url_variables)
+
+ if action_name == 'update' && ps.key?(:url_variables)
+ supplied = ps[:url_variables]
+ ps[:url_variables] = hook.url_variables.merge(supplied).compact
+ end
+
+ ps
+ end
+
+ def hook_param_names
+ %i[enable_ssl_verification token url push_events_branch_filter]
+ end
+
def destroy_hook(hook)
result = WebHooks::DestroyService.new(current_user).execute(hook)
diff --git a/app/controllers/concerns/integrations/params.rb b/app/controllers/concerns/integrations/params.rb
index d256b331174..c3ad9d3dff3 100644
--- a/app/controllers/concerns/integrations/params.rb
+++ b/app/controllers/concerns/integrations/params.rb
@@ -6,7 +6,6 @@ module Integrations
ALLOWED_PARAMS_CE = [
:active,
- :add_pusher,
:alert_events,
:api_key,
:api_token,
diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb
index 07850acd23d..a5e49b1b16a 100644
--- a/app/controllers/concerns/issuable_actions.rb
+++ b/app/controllers/concerns/issuable_actions.rb
@@ -184,7 +184,6 @@ module IssuableActions
def paginated_discussions
return if params[:per_page].blank?
- return if issuable.instance_of?(Issue) && Feature.disabled?(:paginated_issue_discussions, project)
return if issuable.instance_of?(MergeRequest) && Feature.disabled?(:paginated_mr_discussions, project)
strong_memoize(:paginated_discussions) do
diff --git a/app/controllers/concerns/issuable_collections.rb b/app/controllers/concerns/issuable_collections.rb
index 4841225de08..de38d26e3fe 100644
--- a/app/controllers/concerns/issuable_collections.rb
+++ b/app/controllers/concerns/issuable_collections.rb
@@ -24,12 +24,9 @@ module IssuableCollections
show_alert_if_search_is_disabled
@issuables = issuables_collection
+ set_pagination
- unless pagination_disabled?
- set_pagination
-
- return if redirect_out_of_range(@issuables, @total_pages)
- end
+ return if redirect_out_of_range(@issuables, @total_pages)
if params[:label_name].present? && @project
labels_params = { project_id: @project.id, title: params[:label_name] }
@@ -59,10 +56,6 @@ module IssuableCollections
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
- def pagination_disabled?
- false
- end
-
# rubocop: disable CodeReuse/ActiveRecord
def issuables_collection
finder.execute.preload(preload_for_collection)
diff --git a/app/controllers/concerns/product_analytics_tracking.rb b/app/controllers/concerns/product_analytics_tracking.rb
index 0b51b3dd380..dc7ba8295b9 100644
--- a/app/controllers/concerns/product_analytics_tracking.rb
+++ b/app/controllers/concerns/product_analytics_tracking.rb
@@ -28,7 +28,10 @@ module ProductAnalyticsTracking
def event_enabled?(event)
events_to_ff = {
g_analytics_valuestream: :route_hll_to_snowplow,
- i_search_paid: :route_hll_to_snowplow_phase2
+
+ i_search_paid: :route_hll_to_snowplow_phase2,
+ i_search_total: :route_hll_to_snowplow_phase2,
+ i_search_advanced: :route_hll_to_snowplow_phase2
}
Feature.enabled?(events_to_ff[event.to_sym], tracking_namespace_source)
diff --git a/app/controllers/concerns/verifies_with_email.rb b/app/controllers/concerns/verifies_with_email.rb
new file mode 100644
index 00000000000..1a3e7136481
--- /dev/null
+++ b/app/controllers/concerns/verifies_with_email.rb
@@ -0,0 +1,194 @@
+# frozen_string_literal: true
+
+# == VerifiesWithEmail
+#
+# Controller concern to handle verification by email
+module VerifiesWithEmail
+ extend ActiveSupport::Concern
+ include ActionView::Helpers::DateHelper
+
+ TOKEN_LENGTH = 6
+ TOKEN_VALID_FOR_MINUTES = 60
+
+ included do
+ prepend_before_action :verify_with_email, only: :create, unless: -> { two_factor_enabled? }
+ end
+
+ def verify_with_email
+ return unless user = find_user || find_verification_user
+
+ if session[:verification_user_id] && token = verification_params[:verification_token].presence
+ # The verification token is submitted, verify it
+ verify_token(user, token)
+ elsif require_email_verification_enabled?(user)
+ # Limit the amount of password guesses, since we now display the email verification page
+ # when the password is correct, which could be a giveaway when brute-forced.
+ return render_sign_in_rate_limited if check_rate_limit!(:user_sign_in, scope: user) { true }
+
+ if user.valid_password?(user_params[:password])
+ # The user has logged in successfully.
+ if user.unlock_token
+ # Prompt for the token if it already has been set
+ prompt_for_email_verification(user)
+ elsif user.access_locked? || !AuthenticationEvent.initial_login_or_known_ip_address?(user, request.ip)
+ # require email verification if:
+ # - their account has been locked because of too many failed login attempts, or
+ # - they have logged in before, but never from the current ip address
+ send_verification_instructions(user)
+ prompt_for_email_verification(user)
+ end
+ end
+ end
+ end
+
+ def resend_verification_code
+ return unless user = find_verification_user
+
+ send_verification_instructions(user)
+ prompt_for_email_verification(user)
+ end
+
+ def successful_verification
+ session.delete(:verification_user_id)
+ @redirect_url = after_sign_in_path_for(current_user) # rubocop:disable Gitlab/ModuleWithInstanceVariables
+
+ render layout: 'minimal'
+ end
+
+ private
+
+ def find_verification_user
+ return unless session[:verification_user_id]
+
+ User.find_by_id(session[:verification_user_id])
+ end
+
+ # After successful verification and calling sign_in, devise redirects the
+ # user to this path. Override it to show the successful verified page.
+ def after_sign_in_path_for(resource)
+ if action_name == 'create' && session[:verification_user_id]
+ return users_successful_verification_path
+ end
+
+ super
+ end
+
+ def send_verification_instructions(user)
+ return if send_rate_limited?(user)
+
+ raw_token, encrypted_token = generate_token
+ user.unlock_token = encrypted_token
+ user.lock_access!({ send_instructions: false })
+ send_verification_instructions_email(user, raw_token)
+ end
+
+ def send_verification_instructions_email(user, token)
+ return unless user.can?(:receive_notifications)
+
+ Notify.verification_instructions_email(
+ user.id,
+ token: token,
+ expires_in: TOKEN_VALID_FOR_MINUTES).deliver_later
+
+ log_verification(user, :instructions_sent)
+ end
+
+ def verify_token(user, token)
+ return handle_verification_failure(user, :rate_limited) if verification_rate_limited?(user)
+ return handle_verification_failure(user, :invalid) unless valid_token?(user, token)
+ return handle_verification_failure(user, :expired) if expired_token?(user)
+
+ handle_verification_success(user)
+ end
+
+ def generate_token
+ raw_token = SecureRandom.random_number(10**TOKEN_LENGTH).to_s.rjust(TOKEN_LENGTH, '0')
+ encrypted_token = digest_token(raw_token)
+ [raw_token, encrypted_token]
+ end
+
+ def digest_token(token)
+ Devise.token_generator.digest(User, :unlock_token, token)
+ end
+
+ def render_sign_in_rate_limited
+ message = s_('IdentityVerification|Maximum login attempts exceeded. '\
+ 'Wait %{interval} and try again.') % { interval: user_sign_in_interval }
+ redirect_to new_user_session_path, alert: message
+ end
+
+ def user_sign_in_interval
+ interval_in_seconds = Gitlab::ApplicationRateLimiter.rate_limits[:user_sign_in][:interval]
+ distance_of_time_in_words(interval_in_seconds)
+ end
+
+ def verification_rate_limited?(user)
+ Gitlab::ApplicationRateLimiter.throttled?(:email_verification, scope: user.unlock_token)
+ end
+
+ def send_rate_limited?(user)
+ Gitlab::ApplicationRateLimiter.throttled?(:email_verification_code_send, scope: user)
+ end
+
+ def expired_token?(user)
+ user.locked_at < (Time.current - TOKEN_VALID_FOR_MINUTES.minutes)
+ end
+
+ def valid_token?(user, token)
+ user.unlock_token == digest_token(token)
+ end
+
+ def handle_verification_failure(user, reason)
+ message = case reason
+ when :rate_limited
+ s_("IdentityVerification|You've reached the maximum amount of tries. "\
+ 'Wait %{interval} or resend a new code and try again.') % { interval: email_verification_interval }
+ when :expired
+ s_('IdentityVerification|The code has expired. Resend a new code and try again.')
+ when :invalid
+ s_('IdentityVerification|The code is incorrect. Enter it again, or resend a new code.')
+ end
+
+ user.errors.add(:base, message)
+ log_verification(user, :failed_attempt, reason)
+
+ prompt_for_email_verification(user)
+ end
+
+ def email_verification_interval
+ interval_in_seconds = Gitlab::ApplicationRateLimiter.rate_limits[:email_verification][:interval]
+ distance_of_time_in_words(interval_in_seconds)
+ end
+
+ def handle_verification_success(user)
+ user.unlock_access!
+ log_verification(user, :successful)
+
+ sign_in(user)
+ end
+
+ def prompt_for_email_verification(user)
+ session[:verification_user_id] = user.id
+ self.resource = user
+
+ render 'devise/sessions/email_verification'
+ end
+
+ def verification_params
+ params.require(:user).permit(:verification_token)
+ end
+
+ def log_verification(user, event, reason = nil)
+ Gitlab::AppLogger.info(
+ message: 'Email Verification',
+ event: event.to_s.titlecase,
+ username: user.username,
+ ip: request.ip,
+ reason: reason.to_s
+ )
+ end
+
+ def require_email_verification_enabled?(user)
+ Feature.enabled?(:require_email_verification, user)
+ end
+end
diff --git a/app/controllers/confirmations_controller.rb b/app/controllers/confirmations_controller.rb
index 704453fbf44..713231cbc6f 100644
--- a/app/controllers/confirmations_controller.rb
+++ b/app/controllers/confirmations_controller.rb
@@ -4,6 +4,7 @@ class ConfirmationsController < Devise::ConfirmationsController
include AcceptsPendingInvitations
include GitlabRecaptcha
include OneTrustCSP
+ include GoogleAnalyticsCSP
prepend_before_action :check_recaptcha, only: :create
before_action :load_recaptcha, only: :new
diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb
index c71c101b434..67eeb43d5a2 100644
--- a/app/controllers/graphql_controller.rb
+++ b/app/controllers/graphql_controller.rb
@@ -82,6 +82,13 @@ class GraphqlController < ApplicationController
render_error(exception.message, status: :unprocessable_entity)
end
+ rescue_from ActiveRecord::QueryAborted do |exception|
+ log_exception(exception)
+
+ error = "Request timed out. Please try a less complex query or a smaller set of records."
+ render_error(error, status: :service_unavailable)
+ end
+
override :feature_category
def feature_category
::Gitlab::FeatureCategories.default.from_request(request) || super
diff --git a/app/controllers/groups/harbor/application_controller.rb b/app/controllers/groups/harbor/application_controller.rb
new file mode 100644
index 00000000000..cff767c8efd
--- /dev/null
+++ b/app/controllers/groups/harbor/application_controller.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Groups
+ module Harbor
+ class ApplicationController < Groups::ApplicationController
+ layout 'group'
+ include ::Harbor::Access
+
+ private
+
+ def authorize_read_harbor_registry!
+ render_404 unless can?(current_user, :read_harbor_registry, @group)
+ end
+ end
+ end
+end
diff --git a/app/controllers/groups/harbor/artifacts_controller.rb b/app/controllers/groups/harbor/artifacts_controller.rb
new file mode 100644
index 00000000000..b7570b44a2c
--- /dev/null
+++ b/app/controllers/groups/harbor/artifacts_controller.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Groups
+ module Harbor
+ class ArtifactsController < ::Groups::Harbor::ApplicationController
+ include ::Harbor::Artifact
+
+ private
+
+ def container
+ @group
+ end
+ end
+ end
+end
diff --git a/app/controllers/groups/harbor/repositories_controller.rb b/app/controllers/groups/harbor/repositories_controller.rb
index 364607f9b20..1ad38bd7103 100644
--- a/app/controllers/groups/harbor/repositories_controller.rb
+++ b/app/controllers/groups/harbor/repositories_controller.rb
@@ -2,22 +2,13 @@
module Groups
module Harbor
- class RepositoriesController < Groups::ApplicationController
- feature_category :integrations
-
- before_action :harbor_registry_enabled!
- before_action do
- push_frontend_feature_flag(:harbor_registry_integration)
- end
-
- def show
- render :index
- end
+ class RepositoriesController < ::Groups::Harbor::ApplicationController
+ include ::Harbor::Repository
private
- def harbor_registry_enabled!
- render_404 unless Feature.enabled?(:harbor_registry_integration)
+ def container
+ @group
end
end
end
diff --git a/app/controllers/groups/harbor/tags_controller.rb b/app/controllers/groups/harbor/tags_controller.rb
new file mode 100644
index 00000000000..da43cb3f64c
--- /dev/null
+++ b/app/controllers/groups/harbor/tags_controller.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Groups
+ module Harbor
+ class TagsController < ::Groups::Harbor::ApplicationController
+ include ::Harbor::Tag
+
+ private
+
+ def container
+ @group
+ end
+ end
+ end
+end
diff --git a/app/controllers/groups/registry/repositories_controller.rb b/app/controllers/groups/registry/repositories_controller.rb
index cb7bf001918..bb2d08e487a 100644
--- a/app/controllers/groups/registry/repositories_controller.rb
+++ b/app/controllers/groups/registry/repositories_controller.rb
@@ -8,6 +8,10 @@ module Groups
before_action :verify_container_registry_enabled!
before_action :authorize_read_container_image!
+ before_action do
+ push_frontend_feature_flag(:container_registry_show_shortened_path, group)
+ end
+
feature_category :container_registry
urgency :low
diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb
index 55707000cf8..75193309a4e 100644
--- a/app/controllers/import/bitbucket_controller.rb
+++ b/app/controllers/import/bitbucket_controller.rb
@@ -18,14 +18,14 @@ class Import::BitbucketController < Import::BaseController
if auth_state.blank? || !ActiveSupport::SecurityUtils.secure_compare(auth_state, params[:state])
go_to_bitbucket_for_permissions
else
- response = oauth_client.auth_code.get_token(params[:code], redirect_uri: users_import_bitbucket_callback_url)
+ response = oauth_client.auth_code.get_token(params[:code], redirect_uri: users_import_bitbucket_callback_url(namespace_id: params[:namespace_id]))
session[:bitbucket_token] = response.token
session[:bitbucket_expires_at] = response.expires_at
session[:bitbucket_expires_in] = response.expires_in
session[:bitbucket_refresh_token] = response.refresh_token
- redirect_to status_import_bitbucket_url
+ redirect_to status_import_bitbucket_url(namespace_id: params[:namespace_id])
end
end
@@ -78,16 +78,15 @@ class Import::BitbucketController < Import::BaseController
bitbucket_repos.reject { |repo| repo.valid? }
end
+ def provider_url
+ nil
+ end
+
override :provider_name
def provider_name
:bitbucket
end
- override :provider_url
- def provider_url
- provider.url
- end
-
private
def oauth_client
@@ -121,7 +120,7 @@ class Import::BitbucketController < Import::BaseController
def go_to_bitbucket_for_permissions
state = SecureRandom.base64(64)
session[:bitbucket_auth_state] = state
- redirect_to oauth_client.auth_code.authorize_url(redirect_uri: users_import_bitbucket_callback_url, state: state)
+ redirect_to oauth_client.auth_code.authorize_url(redirect_uri: users_import_bitbucket_callback_url(namespace_id: params[:namespace_id]), state: state)
end
def bitbucket_unauthorized(exception)
diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb
index 00f3f0b08b2..12147196749 100644
--- a/app/controllers/import/bitbucket_server_controller.rb
+++ b/app/controllers/import/bitbucket_server_controller.rb
@@ -49,7 +49,7 @@ class Import::BitbucketServerController < Import::BaseController
session[bitbucket_server_username_key] = params[:bitbucket_server_username]
session[bitbucket_server_url_key] = params[:bitbucket_server_url]
- redirect_to status_import_bitbucket_server_path
+ redirect_to status_import_bitbucket_server_path(namespace_id: params[:namespace_id])
end
# We need to re-expose controller's internal method 'status' as action.
@@ -115,7 +115,7 @@ class Import::BitbucketServerController < Import::BaseController
unless session[bitbucket_server_url_key].present? &&
session[bitbucket_server_username_key].present? &&
session[personal_access_token_key].present?
- redirect_to new_import_bitbucket_server_path
+ redirect_to new_import_bitbucket_server_path(namespace_id: params[:namespace_id])
end
end
@@ -170,9 +170,6 @@ class Import::BitbucketServerController < Import::BaseController
}
}, status: :unprocessable_entity
end
- format.html do
- redirect_to new_import_bitbucket_server_path
- end
end
end
end
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index 34f12aebb91..2d607fb7ff7 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -17,7 +17,7 @@ class Import::BulkImportsController < ApplicationController
session[access_token_key] = configure_params[access_token_key]&.strip
session[url_key] = configure_params[url_key]
- redirect_to status_import_bulk_imports_url
+ redirect_to status_import_bulk_imports_url(namespace_id: params[:namespace_id])
end
def status
@@ -35,6 +35,12 @@ class Import::BulkImportsController < ApplicationController
render json: json_response
end
format.html do
+ if params[:namespace_id]
+ @namespace = Namespace.find_by_id(params[:namespace_id])
+
+ render_404 unless current_user.can?(:create_subgroup, @namespace)
+ end
+
@source_url = session[url_key]
end
end
diff --git a/app/controllers/import/fogbugz_controller.rb b/app/controllers/import/fogbugz_controller.rb
index b949a99c250..7b580234227 100644
--- a/app/controllers/import/fogbugz_controller.rb
+++ b/app/controllers/import/fogbugz_controller.rb
@@ -17,12 +17,12 @@ class Import::FogbugzController < Import::BaseController
res = Gitlab::FogbugzImport::Client.new(import_params.to_h.symbolize_keys)
rescue StandardError
# If the URI is invalid various errors can occur
- return redirect_to new_import_fogbugz_path, alert: _('Could not connect to FogBugz, check your URL')
+ return redirect_to new_import_fogbugz_path(namespace_id: params[:namespace_id]), alert: _('Could not connect to FogBugz, check your URL')
end
session[:fogbugz_token] = res.get_token
session[:fogbugz_uri] = params[:uri]
- redirect_to new_user_map_import_fogbugz_path
+ redirect_to new_user_map_import_fogbugz_path(namespace_id: params[:namespace_id])
end
def new_user_map
@@ -41,12 +41,12 @@ class Import::FogbugzController < Import::BaseController
flash[:notice] = _('The user map has been saved. Continue by selecting the projects you want to import.')
- redirect_to status_import_fogbugz_path
+ redirect_to status_import_fogbugz_path(namespace_id: params[:namespace_id])
end
def status
unless client.valid?
- return redirect_to new_import_fogbugz_path
+ return redirect_to new_import_fogbugz_path(namespace_id: params[:namespace_id])
end
super
@@ -106,7 +106,7 @@ class Import::FogbugzController < Import::BaseController
end
def fogbugz_unauthorized(exception)
- redirect_to new_import_fogbugz_path, alert: exception.message
+ redirect_to new_import_fogbugz_path(namespace_id: params[:namespace_id]), alert: exception.message
end
def import_params
diff --git a/app/controllers/import/gitea_controller.rb b/app/controllers/import/gitea_controller.rb
index 399a92c59e0..4b4ac07b389 100644
--- a/app/controllers/import/gitea_controller.rb
+++ b/app/controllers/import/gitea_controller.rb
@@ -7,7 +7,7 @@ class Import::GiteaController < Import::GithubController
def new
if session[access_token_key].present? && provider_url.present?
- redirect_to status_import_url(namespace_id: params[:namespace_id])
+ redirect_to status_import_url
end
end
diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb
index 8dd40b6254e..9cc58ce542c 100644
--- a/app/controllers/import/github_controller.rb
+++ b/app/controllers/import/github_controller.rb
@@ -23,25 +23,24 @@ class Import::GithubController < Import::BaseController
if !ci_cd_only? && github_import_configured? && logged_in_with_provider?
go_to_provider_for_permissions
elsif session[access_token_key]
- redirect_to status_import_url(namespace_id: params[:namespace_id])
+ redirect_to status_import_url
end
end
def callback
auth_state = session.delete(auth_state_key)
- namespace_id = session.delete(:namespace_id)
if auth_state.blank? || !ActiveSupport::SecurityUtils.secure_compare(auth_state, params[:state])
provider_unauthorized
else
session[access_token_key] = get_token(params[:code])
- redirect_to status_import_url(namespace_id: namespace_id)
+ redirect_to status_import_url
end
end
def personal_access_token
session[access_token_key] = params[:personal_access_token]&.strip
- redirect_to status_import_url(namespace_id: params[:namespace_id].presence)
+ redirect_to status_import_url
end
def status
@@ -205,15 +204,15 @@ class Import::GithubController < Import::BaseController
end
def new_import_url
- public_send("new_import_#{provider_name}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend
+ public_send("new_import_#{provider_name}_url", extra_import_params.merge({ namespace_id: params[:namespace_id] })) # rubocop:disable GitlabSecurity/PublicSend
end
- def status_import_url(namespace_id: nil)
- public_send("status_import_#{provider_name}_url", extra_import_params.merge({ namespace_id: namespace_id })) # rubocop:disable GitlabSecurity/PublicSend
+ def status_import_url
+ public_send("status_import_#{provider_name}_url", extra_import_params.merge({ namespace_id: params[:namespace_id].presence })) # rubocop:disable GitlabSecurity/PublicSend
end
def callback_import_url
- public_send("users_import_#{provider_name}_callback_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend
+ public_send("users_import_#{provider_name}_callback_url", extra_import_params.merge({ namespace_id: params[:namespace_id] })) # rubocop:disable GitlabSecurity/PublicSend
end
def provider_unauthorized
@@ -255,7 +254,6 @@ class Import::GithubController < Import::BaseController
def provider_auth
if !ci_cd_only? && session[access_token_key].blank?
- session[:namespace_id] = params[:namespace_id]
go_to_provider_for_permissions
end
end
diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb
index c846d9d225a..dd25698d0a9 100644
--- a/app/controllers/import/gitlab_controller.rb
+++ b/app/controllers/import/gitlab_controller.rb
@@ -12,8 +12,8 @@ class Import::GitlabController < Import::BaseController
rescue_from OAuth2::Error, with: :gitlab_unauthorized
def callback
- session[:gitlab_access_token] = client.get_token(params[:code], callback_import_gitlab_url)
- redirect_to status_import_gitlab_url
+ session[:gitlab_access_token] = client.get_token(params[:code], callback_import_gitlab_url(namespace_id: params[:namespace_id]))
+ redirect_to status_import_gitlab_url(namespace_id: params[:namespace_id])
end
# We need to re-expose controller's internal method 'status' as action.
@@ -79,7 +79,7 @@ class Import::GitlabController < Import::BaseController
end
def go_to_gitlab_for_permissions
- redirect_to client.authorize_url(callback_import_gitlab_url)
+ redirect_to client.authorize_url(callback_import_gitlab_url(namespace_id: params[:namespace_id]))
end
def gitlab_unauthorized
diff --git a/app/controllers/jira_connect/oauth_application_ids_controller.rb b/app/controllers/jira_connect/oauth_application_ids_controller.rb
index 05c23210da2..a84b47f4c8b 100644
--- a/app/controllers/jira_connect/oauth_application_ids_controller.rb
+++ b/app/controllers/jira_connect/oauth_application_ids_controller.rb
@@ -5,9 +5,10 @@ module JiraConnect
feature_category :integrations
skip_before_action :authenticate_user!
+ skip_before_action :verify_authenticity_token
def show
- if Feature.enabled?(:jira_connect_oauth_self_managed) && jira_connect_application_key.present?
+ if show_application_id?
render json: { application_id: jira_connect_application_key }
else
head :not_found
@@ -16,6 +17,12 @@ module JiraConnect
private
+ def show_application_id?
+ return if Gitlab.com?
+
+ Feature.enabled?(:jira_connect_oauth_self_managed) && jira_connect_application_key.present?
+ end
+
def jira_connect_application_key
Gitlab::CurrentSettings.jira_connect_application_key.presence
end
diff --git a/app/controllers/jira_connect/subscriptions_controller.rb b/app/controllers/jira_connect/subscriptions_controller.rb
index 2ba9f8264e1..623113f8413 100644
--- a/app/controllers/jira_connect/subscriptions_controller.rb
+++ b/app/controllers/jira_connect/subscriptions_controller.rb
@@ -25,6 +25,7 @@ class JiraConnect::SubscriptionsController < JiraConnect::ApplicationController
before_action :allow_rendering_in_iframe, only: :index
before_action :verify_qsh_claim!, only: :index
+ before_action :allow_self_managed_content_security_policy, only: :index
before_action :authenticate_user!, only: :create
def index
@@ -62,6 +63,13 @@ class JiraConnect::SubscriptionsController < JiraConnect::ApplicationController
private
+ def allow_self_managed_content_security_policy
+ return unless current_jira_installation.instance_url?
+
+ request.content_security_policy.directives['connect-src'] ||= []
+ request.content_security_policy.directives['connect-src'] << Gitlab::Utils.append_path(current_jira_installation.instance_url, '/-/jira_connect/oauth_application_ids')
+ end
+
def create_service
JiraConnectSubscriptions::CreateService.new(current_jira_installation, current_user, namespace_path: params['namespace_path'], jira_user: jira_user)
end
diff --git a/app/controllers/ldap/omniauth_callbacks_controller.rb b/app/controllers/ldap/omniauth_callbacks_controller.rb
index 6aa46b8e4c3..955dfe58449 100644
--- a/app/controllers/ldap/omniauth_callbacks_controller.rb
+++ b/app/controllers/ldap/omniauth_callbacks_controller.rb
@@ -3,10 +3,12 @@
class Ldap::OmniauthCallbacksController < OmniauthCallbacksController
extend ::Gitlab::Utils::Override
+ before_action :check_action_name_in_available_providers
+
def self.define_providers!
return unless Gitlab::Auth::Ldap::Config.sign_in_enabled?
- Gitlab::Auth::Ldap::Config.available_servers.each do |server|
+ Gitlab::Auth::Ldap::Config.servers.each do |server|
alias_method server['provider_name'], :ldap
end
end
@@ -36,6 +38,18 @@ class Ldap::OmniauthCallbacksController < OmniauthCallbacksController
redirect_to new_user_session_path
end
+
+ private
+
+ def check_action_name_in_available_providers
+ render_404 unless available_providers.include?(action_name)
+ end
+
+ def available_providers
+ Gitlab::Auth::Ldap::Config.available_servers.map do |server|
+ server['provider_name']
+ end
+ end
end
Ldap::OmniauthCallbacksController.prepend_mod_with('Ldap::OmniauthCallbacksController')
diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb
index 3724bb0d925..a996bad3fac 100644
--- a/app/controllers/oauth/applications_controller.rb
+++ b/app/controllers/oauth/applications_controller.rb
@@ -52,10 +52,10 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController
end
def set_index_vars
- @applications = current_user.oauth_applications
+ @applications = current_user.oauth_applications.load
@authorized_tokens = current_user.oauth_authorized_tokens
- @authorized_anonymous_tokens = @authorized_tokens.reject(&:application)
- @authorized_apps = @authorized_tokens.map(&:application).uniq.reject(&:nil?)
+ .latest_per_application
+ .preload_application
# Don't overwrite a value possibly set by `create`
@application ||= Doorkeeper::Application.new
diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb
index c9c51289d3a..2e9fbb1d0d9 100644
--- a/app/controllers/oauth/authorizations_controller.rb
+++ b/app/controllers/oauth/authorizations_controller.rb
@@ -54,8 +54,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
# limit scopes when signing in with GitLab
def downgrade_scopes!
- return unless Feature.enabled?(:omniauth_login_minimal_scopes, current_user)
-
auth_type = params.delete('gl_auth_type')
return unless auth_type == 'login'
diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb
index 265fa505b2a..1a8908e8571 100644
--- a/app/controllers/profiles/personal_access_tokens_controller.rb
+++ b/app/controllers/profiles/personal_access_tokens_controller.rb
@@ -14,6 +14,13 @@ class Profiles::PersonalAccessTokensController < Profiles::ApplicationController
name: params[:name],
scopes: scopes
)
+
+ respond_to do |format|
+ format.html
+ format.json do
+ render json: @active_personal_access_tokens
+ end
+ end
end
def create
@@ -56,6 +63,28 @@ class Profiles::PersonalAccessTokensController < Profiles::ApplicationController
def active_personal_access_tokens
tokens = finder(state: 'active', sort: 'expires_at_asc').execute
+
+ if Feature.enabled?('access_token_pagination')
+ tokens = tokens.page(page)
+ add_pagination_headers(tokens)
+ end
+
::API::Entities::PersonalAccessTokenWithDetails.represent(tokens)
end
+
+ def add_pagination_headers(relation)
+ Gitlab::Pagination::OffsetHeaderBuilder.new(
+ request_context: self,
+ per_page: relation.limit_value,
+ page: relation.current_page,
+ next_page: relation.next_page,
+ prev_page: relation.prev_page,
+ total: relation.total_count,
+ params: params.permit(:page)
+ ).execute
+ end
+
+ def page
+ (params[:page] || 1).to_i
+ end
end
diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb
index 64ced43311a..5bfda526fb0 100644
--- a/app/controllers/projects/blame_controller.rb
+++ b/app/controllers/projects/blame_controller.rb
@@ -25,7 +25,7 @@ class Projects::BlameController < Projects::ApplicationController
blame_service = Projects::BlameService.new(@blob, @commit, params.permit(:page))
- @blame = Gitlab::View::Presenter::Factory.new(blame_service.blame, project: @project, path: @path).fabricate!
+ @blame = Gitlab::View::Presenter::Factory.new(blame_service.blame, project: @project, path: @path, page: blame_service.page).fabricate!
render locals: { blame_pagination: blame_service.pagination }
end
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index a9561fb9312..97aae56c4ec 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -42,7 +42,6 @@ class Projects::BlobController < Projects::ApplicationController
urgency :low, [:create, :show, :edit, :update, :diff]
before_action do
- push_frontend_feature_flag(:refactor_blob_viewer, @project)
push_frontend_feature_flag(:highlight_js, @project)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
end
diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
index ac3c85f3b40..7ef9fd9daed 100644
--- a/app/controllers/projects/environments_controller.rb
+++ b/app/controllers/projects/environments_controller.rb
@@ -24,9 +24,6 @@ class Projects::EnvironmentsController < Projects::ApplicationController
before_action :environment, only: [:show, :edit, :update, :stop, :terminal, :terminal_websocket_authorize, :metrics, :cancel_auto_stop]
before_action :verify_api_request!, only: :terminal_websocket_authorize
before_action :expire_etag_cache, only: [:index], unless: -> { request.format.json? }
- before_action do
- push_frontend_feature_flag(:monitor_logging, project)
- end
after_action :expire_etag_cache, only: [:cancel_auto_stop]
feature_category :continuous_delivery
diff --git a/app/controllers/projects/google_cloud/base_controller.rb b/app/controllers/projects/google_cloud/base_controller.rb
index 980e9bdcdad..050b26a40c7 100644
--- a/app/controllers/projects/google_cloud/base_controller.rb
+++ b/app/controllers/projects/google_cloud/base_controller.rb
@@ -12,7 +12,7 @@ class Projects::GoogleCloud::BaseController < Projects::ApplicationController
def admin_project_google_cloud!
unless can?(current_user, :admin_project_google_cloud, project)
- track_event('admin_project_google_cloud!', 'access_denied', 'invalid_user')
+ track_event('admin_project_google_cloud!', 'error_access_denied', 'invalid_user')
access_denied!
end
end
@@ -20,7 +20,11 @@ class Projects::GoogleCloud::BaseController < Projects::ApplicationController
def google_oauth2_enabled!
config = Gitlab::Auth::OAuth::Provider.config_for('google_oauth2')
if config.app_id.blank? || config.app_secret.blank?
- track_event('google_oauth2_enabled!', 'access_denied', { reason: 'google_oauth2_not_configured', config: config })
+ track_event(
+ 'google_oauth2_enabled!',
+ 'error_access_denied',
+ { reason: 'google_oauth2_not_configured', config: config }
+ )
access_denied! 'This GitLab instance not configured for Google Oauth2.'
end
end
@@ -31,7 +35,7 @@ class Projects::GoogleCloud::BaseController < Projects::ApplicationController
enabled_for_project = Feature.enabled?(:incubation_5mp_google_cloud, project)
feature_is_enabled = enabled_for_user || enabled_for_group || enabled_for_project
unless feature_is_enabled
- track_event('feature_flag_enabled!', 'access_denied', 'feature_flag_not_enabled')
+ track_event('feature_flag_enabled!', 'error_access_denied', 'feature_flag_not_enabled')
access_denied!
end
end
@@ -42,7 +46,7 @@ class Projects::GoogleCloud::BaseController < Projects::ApplicationController
return if is_token_valid
- return_url = project_google_cloud_index_path(project)
+ return_url = project_google_cloud_configuration_path(project)
state = generate_session_key_redirect(request.url, return_url)
@authorize_url = GoogleApi::CloudPlatform::Client.new(nil,
callback_google_api_auth_url,
@@ -65,12 +69,6 @@ class Projects::GoogleCloud::BaseController < Projects::ApplicationController
session[GoogleApi::CloudPlatform::Client.session_key_for_expires_at]
end
- def handle_gcp_error(action, error)
- track_event(action, 'gcp_error', error)
- @js_data = { screen: 'gcp_error', error: error.to_s }.to_json
- render status: :unauthorized, template: 'projects/google_cloud/errors/gcp_error'
- end
-
def track_event(action, label, property)
options = { label: label, project: project, user: current_user }
diff --git a/app/controllers/projects/google_cloud/configuration_controller.rb b/app/controllers/projects/google_cloud/configuration_controller.rb
new file mode 100644
index 00000000000..fa672058247
--- /dev/null
+++ b/app/controllers/projects/google_cloud/configuration_controller.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Projects
+ module GoogleCloud
+ class ConfigurationController < Projects::GoogleCloud::BaseController
+ def index
+ @google_cloud_path = project_google_cloud_configuration_path(project)
+ js_data = {
+ configurationUrl: project_google_cloud_configuration_path(project),
+ deploymentsUrl: project_google_cloud_deployments_path(project),
+ databasesUrl: project_google_cloud_databases_path(project),
+ serviceAccounts: ::GoogleCloud::ServiceAccountsService.new(project).find_for_project,
+ createServiceAccountUrl: project_google_cloud_service_accounts_path(project),
+ emptyIllustrationUrl: ActionController::Base.helpers.image_path('illustrations/pipelines_empty.svg'),
+ configureGcpRegionsUrl: project_google_cloud_gcp_regions_path(project),
+ gcpRegions: gcp_regions,
+ revokeOauthUrl: revoke_oauth_url
+ }
+ @js_data = js_data.to_json
+ track_event('configuration#index', 'success', js_data)
+ end
+
+ private
+
+ def gcp_regions
+ params = { key: Projects::GoogleCloud::GcpRegionsController::GCP_REGION_CI_VAR_KEY }
+ list = ::Ci::VariablesFinder.new(project, params).execute
+ list.map { |variable| { gcp_region: variable.value, environment: variable.environment_scope } }
+ end
+
+ def revoke_oauth_url
+ google_token_valid = GoogleApi::CloudPlatform::Client.new(token_in_session, nil)
+ .validate_token(expires_at_in_session)
+ google_token_valid ? project_google_cloud_revoke_oauth_index_path(project) : nil
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/google_cloud/databases_controller.rb b/app/controllers/projects/google_cloud/databases_controller.rb
new file mode 100644
index 00000000000..711409e7550
--- /dev/null
+++ b/app/controllers/projects/google_cloud/databases_controller.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Projects
+ module GoogleCloud
+ class DatabasesController < Projects::GoogleCloud::BaseController
+ def index
+ @google_cloud_path = project_google_cloud_configuration_path(project)
+ js_data = {
+ configurationUrl: project_google_cloud_configuration_path(project),
+ deploymentsUrl: project_google_cloud_deployments_path(project),
+ databasesUrl: project_google_cloud_databases_path(project)
+ }
+ @js_data = js_data.to_json
+ track_event('databases#index', 'success', js_data)
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/google_cloud/deployments_controller.rb b/app/controllers/projects/google_cloud/deployments_controller.rb
index 4867d344c5a..4aa17b36fad 100644
--- a/app/controllers/projects/google_cloud/deployments_controller.rb
+++ b/app/controllers/projects/google_cloud/deployments_controller.rb
@@ -3,32 +3,47 @@
class Projects::GoogleCloud::DeploymentsController < Projects::GoogleCloud::BaseController
before_action :validate_gcp_token!
+ def index
+ @google_cloud_path = project_google_cloud_configuration_path(project)
+ js_data = {
+ configurationUrl: project_google_cloud_configuration_path(project),
+ deploymentsUrl: project_google_cloud_deployments_path(project),
+ databasesUrl: project_google_cloud_databases_path(project),
+ enableCloudRunUrl: project_google_cloud_deployments_cloud_run_path(project),
+ enableCloudStorageUrl: project_google_cloud_deployments_cloud_storage_path(project)
+ }
+ @js_data = js_data.to_json
+ track_event('deployments#index', 'success', js_data)
+ end
+
def cloud_run
- params = { token_in_session: token_in_session }
+ params = { google_oauth2_token: token_in_session }
enable_cloud_run_response = GoogleCloud::EnableCloudRunService
.new(project, current_user, params).execute
if enable_cloud_run_response[:status] == :error
- track_event('deployments#cloud_run', 'enable_cloud_run_error', enable_cloud_run_response)
+ track_event('deployments#cloud_run', 'error_enable_cloud_run', enable_cloud_run_response)
flash[:error] = enable_cloud_run_response[:message]
- redirect_to project_google_cloud_index_path(project)
+ redirect_to project_google_cloud_deployments_path(project)
else
params = { action: GoogleCloud::GeneratePipelineService::ACTION_DEPLOY_TO_CLOUD_RUN }
generate_pipeline_response = GoogleCloud::GeneratePipelineService
.new(project, current_user, params).execute
if generate_pipeline_response[:status] == :error
- track_event('deployments#cloud_run', 'generate_pipeline_error', generate_pipeline_response)
+ track_event('deployments#cloud_run', 'error_generate_pipeline', generate_pipeline_response)
flash[:error] = 'Failed to generate pipeline'
- redirect_to project_google_cloud_index_path(project)
+ redirect_to project_google_cloud_deployments_path(project)
else
cloud_run_mr_params = cloud_run_mr_params(generate_pipeline_response[:branch_name])
- track_event('deployments#cloud_run', 'cloud_run_success', cloud_run_mr_params)
+ track_event('deployments#cloud_run', 'success', cloud_run_mr_params)
redirect_to project_new_merge_request_path(project, merge_request: cloud_run_mr_params)
end
end
- rescue Google::Apis::ClientError => error
- handle_gcp_error('deployments#cloud_run', error)
+ rescue Google::Apis::ClientError, Google::Apis::ServerError, Google::Apis::AuthorizationError => error
+ track_event('deployments#cloud_run', 'error_gcp', error)
+ flash[:warning] = _('Google Cloud Error - %{error}') % { error: error }
+ redirect_to project_google_cloud_deployments_path(project)
end
def cloud_storage
diff --git a/app/controllers/projects/google_cloud/gcp_regions_controller.rb b/app/controllers/projects/google_cloud/gcp_regions_controller.rb
index beeb91cfd80..3fbe9a96284 100644
--- a/app/controllers/projects/google_cloud/gcp_regions_controller.rb
+++ b/app/controllers/projects/google_cloud/gcp_regions_controller.rb
@@ -6,8 +6,10 @@ class Projects::GoogleCloud::GcpRegionsController < Projects::GoogleCloud::BaseC
# Source https://cloud.google.com/run/docs/locations 2022-01-30
AVAILABLE_REGIONS = %w[asia-east1 asia-northeast1 asia-southeast1 europe-north1 europe-west1 europe-west4 us-central1 us-east1 us-east4 us-west1].freeze
+ GCP_REGION_CI_VAR_KEY = 'GCP_REGION'
+
def index
- @google_cloud_path = project_google_cloud_index_path(project)
+ @google_cloud_path = project_google_cloud_configuration_path(project)
params = { per_page: 50 }
branches = BranchesFinder.new(project.repository, params).execute(gitaly_pagination: true)
tags = TagsFinder.new(project.repository, params).execute(gitaly_pagination: true)
@@ -16,16 +18,16 @@ class Projects::GoogleCloud::GcpRegionsController < Projects::GoogleCloud::BaseC
screen: 'gcp_regions_form',
availableRegions: AVAILABLE_REGIONS,
refs: refs,
- cancelPath: project_google_cloud_index_path(project)
+ cancelPath: project_google_cloud_configuration_path(project)
}
@js_data = js_data.to_json
- track_event('gcp_regions#index', 'form_render', js_data)
+ track_event('gcp_regions#index', 'success', js_data)
end
def create
permitted_params = params.permit(:ref, :gcp_region)
response = GoogleCloud::GcpRegionAddOrReplaceService.new(project).execute(permitted_params[:ref], permitted_params[:gcp_region])
- track_event('gcp_regions#create', 'form_submit', response)
- redirect_to project_google_cloud_index_path(project), notice: _('GCP region configured')
+ track_event('gcp_regions#create', 'success', response)
+ redirect_to project_google_cloud_configuration_path(project), notice: _('GCP region configured')
end
end
diff --git a/app/controllers/projects/google_cloud/revoke_oauth_controller.rb b/app/controllers/projects/google_cloud/revoke_oauth_controller.rb
index 03d1474707b..1a9a2daf4f2 100644
--- a/app/controllers/projects/google_cloud/revoke_oauth_controller.rb
+++ b/app/controllers/projects/google_cloud/revoke_oauth_controller.rb
@@ -8,16 +8,15 @@ class Projects::GoogleCloud::RevokeOauthController < Projects::GoogleCloud::Base
response = google_api_client.revoke_authorizations
if response.success?
- status = 'success'
redirect_message = { notice: s_('GoogleCloud|Google OAuth2 token revocation requested') }
+ track_event('revoke_oauth#create', 'success', response.to_json)
else
- status = 'failed'
redirect_message = { alert: s_('GoogleCloud|Google OAuth2 token revocation request failed') }
+ track_event('revoke_oauth#create', 'error', response.to_json)
end
session.delete(GoogleApi::CloudPlatform::Client.session_key_for_token)
- track_event('revoke_oauth#create', 'create', status)
- redirect_to project_google_cloud_index_path(project), redirect_message
+ redirect_to project_google_cloud_configuration_path(project), redirect_message
end
end
diff --git a/app/controllers/projects/google_cloud/service_accounts_controller.rb b/app/controllers/projects/google_cloud/service_accounts_controller.rb
index 5d8b2030d5c..dbd83be19db 100644
--- a/app/controllers/projects/google_cloud/service_accounts_controller.rb
+++ b/app/controllers/projects/google_cloud/service_accounts_controller.rb
@@ -4,14 +4,15 @@ class Projects::GoogleCloud::ServiceAccountsController < Projects::GoogleCloud::
before_action :validate_gcp_token!
def index
- @google_cloud_path = project_google_cloud_index_path(project)
+ @google_cloud_path = project_google_cloud_configuration_path(project)
google_api_client = GoogleApi::CloudPlatform::Client.new(token_in_session, nil)
gcp_projects = google_api_client.list_projects
if gcp_projects.empty?
@js_data = { screen: 'no_gcp_projects' }.to_json
- track_event('service_accounts#index', 'form_error', 'no_gcp_projects')
- render status: :unauthorized, template: 'projects/google_cloud/errors/no_gcp_projects'
+ track_event('service_accounts#index', 'error_form', 'no_gcp_projects')
+ flash[:warning] = _('No Google Cloud projects - You need at least one Google Cloud project')
+ redirect_to project_google_cloud_configuration_path(project)
else
params = { per_page: 50 }
branches = BranchesFinder.new(project.repository, params).execute(gitaly_pagination: true)
@@ -21,14 +22,16 @@ class Projects::GoogleCloud::ServiceAccountsController < Projects::GoogleCloud::
screen: 'service_accounts_form',
gcpProjects: gcp_projects,
refs: refs,
- cancelPath: project_google_cloud_index_path(project)
+ cancelPath: project_google_cloud_configuration_path(project)
}
@js_data = js_data.to_json
- track_event('service_accounts#index', 'form_success', js_data)
+ track_event('service_accounts#index', 'success', js_data)
end
- rescue Google::Apis::ClientError => error
- handle_gcp_error('service_accounts#index', error)
+ rescue Google::Apis::ClientError, Google::Apis::ServerError, Google::Apis::AuthorizationError => error
+ track_event('service_accounts#index', 'error_gcp', error)
+ flash[:warning] = _('Google Cloud Error - %{error}') % { error: error }
+ redirect_to project_google_cloud_configuration_path(project)
end
def create
@@ -42,9 +45,11 @@ class Projects::GoogleCloud::ServiceAccountsController < Projects::GoogleCloud::
environment_name: permitted_params[:ref]
).execute
- track_event('service_accounts#create', 'form_submit', response)
- redirect_to project_google_cloud_index_path(project), notice: response.message
+ track_event('service_accounts#create', 'success', response)
+ redirect_to project_google_cloud_configuration_path(project), notice: response.message
rescue Google::Apis::ClientError, Google::Apis::ServerError, Google::Apis::AuthorizationError => error
- handle_gcp_error('service_accounts#create', error)
+ track_event('service_accounts#create', 'error_gcp', error)
+ flash[:warning] = _('Google Cloud Error - %{error}') % { error: error }
+ redirect_to project_google_cloud_configuration_path(project)
end
end
diff --git a/app/controllers/projects/google_cloud_controller.rb b/app/controllers/projects/google_cloud_controller.rb
deleted file mode 100644
index 49bb4bec859..00000000000
--- a/app/controllers/projects/google_cloud_controller.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-class Projects::GoogleCloudController < Projects::GoogleCloud::BaseController
- GCP_REGION_CI_VAR_KEY = 'GCP_REGION'
-
- def index
- js_data = {
- screen: 'home',
- serviceAccounts: GoogleCloud::ServiceAccountsService.new(project).find_for_project,
- createServiceAccountUrl: project_google_cloud_service_accounts_path(project),
- enableCloudRunUrl: project_google_cloud_deployments_cloud_run_path(project),
- enableCloudStorageUrl: project_google_cloud_deployments_cloud_storage_path(project),
- emptyIllustrationUrl: ActionController::Base.helpers.image_path('illustrations/pipelines_empty.svg'),
- configureGcpRegionsUrl: project_google_cloud_gcp_regions_path(project),
- gcpRegions: gcp_regions,
- revokeOauthUrl: revoke_oauth_url
- }
- @js_data = js_data.to_json
- track_event('google_cloud#index', 'index', js_data)
- end
-
- private
-
- def gcp_regions
- list = ::Ci::VariablesFinder.new(project, { key: GCP_REGION_CI_VAR_KEY }).execute
- list.map { |variable| { gcp_region: variable.value, environment: variable.environment_scope } }
- end
-
- def revoke_oauth_url
- google_token_valid = GoogleApi::CloudPlatform::Client.new(token_in_session, nil)
- .validate_token(expires_at_in_session)
- google_token_valid ? project_google_cloud_revoke_oauth_index_path(project) : nil
- end
-end
diff --git a/app/controllers/projects/group_links_controller.rb b/app/controllers/projects/group_links_controller.rb
index 6007e09f109..08eebfa0e4b 100644
--- a/app/controllers/projects/group_links_controller.rb
+++ b/app/controllers/projects/group_links_controller.rb
@@ -9,7 +9,7 @@ class Projects::GroupLinksController < Projects::ApplicationController
def update
group_link = @project.project_group_links.find(params[:id])
- Projects::GroupLinks::UpdateService.new(group_link).execute(group_link_params)
+ Projects::GroupLinks::UpdateService.new(group_link, current_user).execute(group_link_params)
if group_link.expires?
render json: {
diff --git a/app/controllers/projects/harbor/application_controller.rb b/app/controllers/projects/harbor/application_controller.rb
index e6e694783fa..9271ec560dc 100644
--- a/app/controllers/projects/harbor/application_controller.rb
+++ b/app/controllers/projects/harbor/application_controller.rb
@@ -4,18 +4,12 @@ module Projects
module Harbor
class ApplicationController < Projects::ApplicationController
layout 'project'
-
- before_action :harbor_registry_enabled!
- before_action do
- push_frontend_feature_flag(:harbor_registry_integration)
- end
-
- feature_category :integrations
+ include ::Harbor::Access
private
- def harbor_registry_enabled!
- render_404 unless Feature.enabled?(:harbor_registry_integration)
+ def authorize_read_harbor_registry!
+ render_404 unless can?(current_user, :read_harbor_registry, @project)
end
end
end
diff --git a/app/controllers/projects/harbor/artifacts_controller.rb b/app/controllers/projects/harbor/artifacts_controller.rb
new file mode 100644
index 00000000000..ce36f181b42
--- /dev/null
+++ b/app/controllers/projects/harbor/artifacts_controller.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Projects
+ module Harbor
+ class ArtifactsController < ::Projects::Harbor::ApplicationController
+ include ::Harbor::Artifact
+
+ private
+
+ def container
+ @project
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/harbor/repositories_controller.rb b/app/controllers/projects/harbor/repositories_controller.rb
index dd3e3dc1978..4db13331bf0 100644
--- a/app/controllers/projects/harbor/repositories_controller.rb
+++ b/app/controllers/projects/harbor/repositories_controller.rb
@@ -3,8 +3,12 @@
module Projects
module Harbor
class RepositoriesController < ::Projects::Harbor::ApplicationController
- def show
- render :index
+ include ::Harbor::Repository
+
+ private
+
+ def container
+ @project
end
end
end
diff --git a/app/controllers/projects/harbor/tags_controller.rb b/app/controllers/projects/harbor/tags_controller.rb
new file mode 100644
index 00000000000..f49c5ac7768
--- /dev/null
+++ b/app/controllers/projects/harbor/tags_controller.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Projects
+ module Harbor
+ class TagsController < ::Projects::Harbor::ApplicationController
+ include ::Harbor::Tag
+
+ private
+
+ def container
+ @project
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb
index 99eba32e00f..50f388324f1 100644
--- a/app/controllers/projects/hooks_controller.rb
+++ b/app/controllers/projects/hooks_controller.rb
@@ -15,52 +15,21 @@ class Projects::HooksController < Projects::ApplicationController
feature_category :integrations
urgency :low, [:test]
- def index
- @hooks = @project.hooks.load
- @hook = ProjectHook.new
- end
-
- def create
- @hook = @project.hooks.new(hook_params)
- @hook.save
-
- unless @hook.valid?
- @hooks = @project.hooks.select(&:persisted?)
- flash[:alert] = @hook.errors.full_messages.join.html_safe
- end
-
- redirect_to action: :index
- end
-
- def edit
- redirect_to(action: :index) unless hook
- end
-
- def update
- if hook.update(hook_params)
- flash[:notice] = _('Hook was successfully updated.')
- redirect_to action: :index
- else
- render 'edit'
- end
- end
-
def test
- result = TestHooks::ProjectService.new(hook, current_user, params[:trigger]).execute
+ trigger = params.fetch(:trigger, ::ProjectHook.triggers.each_value.first.to_s)
+ result = TestHooks::ProjectService.new(hook, current_user, trigger).execute
set_hook_execution_notice(result)
redirect_back_or_default(default: { action: :index })
end
- def destroy
- destroy_hook(hook)
+ private
- redirect_to action: :index, status: :found
+ def relation
+ @project.hooks
end
- private
-
def hook
@hook ||= @project.hooks.find(params[:id])
end
@@ -69,13 +38,7 @@ class Projects::HooksController < Projects::ApplicationController
@hook_logs ||= hook.web_hook_logs.recent.page(params[:page])
end
- def hook_params
- params.require(:hook).permit(
- :enable_ssl_verification,
- :token,
- :url,
- :push_events_branch_filter,
- *ProjectHook.triggers.values
- )
+ def trigger_values
+ ProjectHook.triggers.values
end
end
diff --git a/app/controllers/projects/incidents_controller.rb b/app/controllers/projects/incidents_controller.rb
index 70eab792b40..f9fa8046962 100644
--- a/app/controllers/projects/incidents_controller.rb
+++ b/app/controllers/projects/incidents_controller.rb
@@ -8,6 +8,9 @@ class Projects::IncidentsController < Projects::ApplicationController
before_action :load_incident, only: [:show]
before_action do
push_frontend_feature_flag(:incident_timeline, @project)
+ push_force_frontend_feature_flag(:work_items, @project&.work_items_feature_flag_enabled?)
+ push_frontend_feature_flag(:work_items_mvc_2)
+ push_frontend_feature_flag(:work_items_hierarchy, @project)
end
feature_category :incident_management
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index f974b16468c..f1c9e2b2653 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -22,7 +22,7 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :issue, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) }
before_action :redirect_if_task, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) }
- after_action :log_issue_show, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) }
+ after_action :log_issue_show, only: :show
before_action :set_issuables_index, if: ->(c) {
SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !index_html_request?
@@ -41,14 +41,11 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :authorize_download_code!, only: [:related_branches]
before_action do
- push_frontend_feature_flag(:contacts_autocomplete, project&.group)
push_frontend_feature_flag(:incident_timeline, project)
end
before_action only: :show do
- push_frontend_feature_flag(:confidential_notes, project&.group)
push_frontend_feature_flag(:issue_assignees_widget, project)
- push_frontend_feature_flag(:paginated_issue_discussions, project)
push_frontend_feature_flag(:realtime_labels, project)
push_force_frontend_feature_flag(:work_items, project&.work_items_feature_flag_enabled?)
push_frontend_feature_flag(:work_items_mvc_2)
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index 9574c5d5849..ad59f421c06 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -5,28 +5,22 @@ class Projects::JobsController < Projects::ApplicationController
include ContinueParams
include ProjectStatsRefreshConflictsGuard
- urgency :low, [:index, :show, :trace, :retry, :play, :cancel, :unschedule, :status, :erase, :raw]
+ urgency :low, [:index, :show, :trace, :retry, :play, :cancel, :unschedule, :erase, :raw]
before_action :find_job_as_build, except: [:index, :play, :show]
before_action :find_job_as_processable, only: [:play, :show]
before_action :authorize_read_build_trace!, only: [:trace, :raw]
before_action :authorize_read_build!
before_action :authorize_update_build!,
- except: [:index, :show, :status, :raw, :trace, :erase, :cancel, :unschedule]
+ except: [:index, :show, :raw, :trace, :erase, :cancel, :unschedule]
before_action :authorize_erase_build!, only: [:erase]
before_action :authorize_use_build_terminal!, only: [:terminal, :terminal_websocket_authorize]
before_action :verify_api_request!, only: :terminal_websocket_authorize
before_action :authorize_create_proxy_build!, only: :proxy_websocket_authorize
before_action :verify_proxy_request!, only: :proxy_websocket_authorize
- before_action :push_jobs_table_vue, only: [:index]
- before_action :push_jobs_table_vue_search, only: [:index]
+ before_action :push_job_log_search, only: [:show]
before_action :reject_if_build_artifacts_size_refreshing!, only: [:erase]
- before_action do
- push_frontend_feature_flag(:infinitely_collapsible_sections, @project)
- push_frontend_feature_flag(:trigger_job_retry_action, @project)
- end
-
layout 'project'
feature_category :continuous_integration
@@ -125,12 +119,6 @@ class Projects::JobsController < Projects::ApplicationController
end
end
- def status
- render json: Ci::JobSerializer
- .new(project: @project, current_user: @current_user)
- .represent_status(@build.present(current_user: current_user))
- end
-
def erase
if @build.erase(erased_by: current_user)
redirect_to project_job_path(project, @build),
@@ -261,11 +249,7 @@ class Projects::JobsController < Projects::ApplicationController
::Gitlab::Workhorse.channel_websocket(service)
end
- def push_jobs_table_vue
- push_frontend_feature_flag(:jobs_table_vue, @project)
- end
-
- def push_jobs_table_vue_search
- push_frontend_feature_flag(:jobs_table_vue_search, @project)
+ def push_job_log_search
+ push_frontend_feature_flag(:job_log_search, @project)
end
end
diff --git a/app/controllers/projects/logs_controller.rb b/app/controllers/projects/logs_controller.rb
deleted file mode 100644
index 0f751db2064..00000000000
--- a/app/controllers/projects/logs_controller.rb
+++ /dev/null
@@ -1,103 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- class LogsController < Projects::ApplicationController
- include ::Gitlab::Utils::StrongMemoize
-
- before_action :authorize_read_pod_logs!
- before_action :ensure_deployments, only: %i(k8s elasticsearch)
-
- feature_category :logging
- urgency :low
-
- def index
- return render_404 unless Feature.enabled?(:monitor_logging, project)
-
- if environment || cluster
- render :index
- else
- render :empty_logs
- end
- end
-
- def k8s
- render_logs(::PodLogs::KubernetesService, k8s_params)
- end
-
- def elasticsearch
- render_logs(::PodLogs::ElasticsearchService, elasticsearch_params)
- end
-
- private
-
- def render_logs(service, permitted_params)
- ::Gitlab::PollingInterval.set_header(response, interval: 3_000)
-
- result = service.new(cluster, namespace, params: permitted_params).execute
-
- if result.nil?
- head :accepted
- elsif result[:status] == :success
- render json: result
- else
- render status: :bad_request, json: result
- end
- end
-
- # cluster is selected either via environment or directly by id
- def cluster_params
- params.permit(:environment_name, :cluster_id)
- end
-
- def k8s_params
- params.permit(:container_name, :pod_name)
- end
-
- def elasticsearch_params
- params.permit(:container_name, :pod_name, :search, :start_time, :end_time, :cursor)
- end
-
- def environment
- strong_memoize(:environment) do
- if cluster_params.key?(:environment_name)
- ::Environments::EnvironmentsFinder.new(project, current_user, name: cluster_params[:environment_name]).execute.first
- else
- project.default_environment
- end
- end
- end
-
- def cluster
- strong_memoize(:cluster) do
- if gitlab_managed_apps_logs?
- clusters = ClusterAncestorsFinder.new(project, current_user).execute
- clusters.find { |cluster| cluster.id == cluster_params[:cluster_id].to_i }
- else
- environment&.deployment_platform&.cluster
- end
- end
- end
-
- def namespace
- if gitlab_managed_apps_logs?
- Gitlab::Kubernetes::Helm::NAMESPACE
- else
- environment.deployment_namespace
- end
- end
-
- def ensure_deployments
- return if gitlab_managed_apps_logs?
- return if cluster && namespace.present?
-
- render status: :bad_request, json: {
- status: :error,
- message: _('Environment does not have deployments')
- }
- end
-
- def gitlab_managed_apps_logs?
- cluster_params.key?(:cluster_id)
- end
- end
-end
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index d420e136316..a2f018c013b 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -32,10 +32,8 @@ 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(:merge_request_widget_graphql, project)
push_frontend_feature_flag(:core_security_mr_widget_counts, project)
- push_frontend_feature_flag(:confidential_notes, project)
push_frontend_feature_flag(:restructured_mr_widget, project)
push_frontend_feature_flag(:refactor_mr_widgets_extensions, project)
push_frontend_feature_flag(:refactor_code_quality_extension, project)
@@ -44,10 +42,12 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:issue_assignees_widget, @project)
push_frontend_feature_flag(:realtime_labels, project)
push_frontend_feature_flag(:refactor_security_extension, @project)
+ push_frontend_feature_flag(:refactor_code_quality_inline_findings, project)
push_frontend_feature_flag(:mr_attention_requests, current_user)
push_frontend_feature_flag(:moved_mr_sidebar, project)
push_frontend_feature_flag(:paginated_mr_discussions, project)
push_frontend_feature_flag(:mr_review_submit_comment, project)
+ push_frontend_feature_flag(:mr_experience_survey, project)
end
before_action do
@@ -86,6 +86,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
:rebase,
:discussions,
:pipelines,
+ :coverage_reports,
:test_reports,
:codequality_mr_diff_reports,
:codequality_reports,
diff --git a/app/controllers/projects/metrics_dashboard_controller.rb b/app/controllers/projects/metrics_dashboard_controller.rb
index f2f276071a0..b78ee6ca917 100644
--- a/app/controllers/projects/metrics_dashboard_controller.rb
+++ b/app/controllers/projects/metrics_dashboard_controller.rb
@@ -12,7 +12,6 @@ module Projects
before_action do
push_frontend_feature_flag(:prometheus_computed_alerts)
push_frontend_feature_flag(:disable_metric_dashboard_refresh_rate)
- push_frontend_feature_flag(:monitor_logging, project)
end
feature_category :metrics
diff --git a/app/controllers/projects/pipelines/tests_controller.rb b/app/controllers/projects/pipelines/tests_controller.rb
index e5b2dd14f69..8ac370b1bd4 100644
--- a/app/controllers/projects/pipelines/tests_controller.rb
+++ b/app/controllers/projects/pipelines/tests_controller.rb
@@ -7,6 +7,7 @@ module Projects
before_action :authorize_read_build!
before_action :builds, only: [:show]
+ before_action :validate_test_reports!, only: [:show]
feature_category :code_testing
@@ -23,19 +24,21 @@ module Projects
def show
respond_to do |format|
format.json do
- if pipeline.has_expired_test_reports?
- render json: { errors: 'Test report artifacts have expired' }, status: :not_found
- else
- render json: TestSuiteSerializer
- .new(project: project, current_user: @current_user)
- .represent(test_suite, details: true)
- end
+ render json: TestSuiteSerializer
+ .new(project: project, current_user: @current_user)
+ .represent(test_suite, details: true)
end
end
end
private
+ def validate_test_reports!
+ unless pipeline.has_test_reports?
+ render json: { errors: 'Test report artifacts not found' }, status: :not_found
+ end
+ end
+
def builds
@builds ||= pipeline.latest_builds.id_in(build_ids).presence || render_404
end
@@ -48,7 +51,7 @@ module Projects
def test_suite
suite = builds.sum do |build|
- build.collect_test_reports!(Gitlab::Ci::Reports::TestReports.new)
+ build.collect_test_reports!(Gitlab::Ci::Reports::TestReport.new)
end
Gitlab::Ci::Reports::TestFailureHistory.new(suite.failed.values, project).load!
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index adc3a912a91..b2aa1d9f4ca 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -38,6 +38,8 @@ class Projects::PipelinesController < Projects::ApplicationController
track_redis_hll_event :charts, name: 'p_analytics_ci_cd_pipelines', if: -> { should_track_ci_cd_pipelines? }
track_redis_hll_event :charts, name: 'p_analytics_ci_cd_deployment_frequency', if: -> { should_track_ci_cd_deployment_frequency? }
track_redis_hll_event :charts, name: 'p_analytics_ci_cd_lead_time', if: -> { should_track_ci_cd_lead_time? }
+ track_redis_hll_event :charts, name: 'p_analytics_ci_cd_time_to_restore_service', if: -> { should_track_ci_cd_time_to_restore_service? }
+ track_redis_hll_event :charts, name: 'p_analytics_ci_cd_change_failure_rate', if: -> { should_track_ci_cd_change_failure_rate? }
wrap_parameters Ci::Pipeline
@@ -174,7 +176,7 @@ class Projects::PipelinesController < Projects::ApplicationController
end
def stage
- @stage = pipeline.legacy_stage(params[:stage])
+ @stage = pipeline.stage(params[:stage])
return not_found unless @stage
render json: StageSerializer
@@ -361,6 +363,14 @@ class Projects::PipelinesController < Projects::ApplicationController
def should_track_ci_cd_lead_time?
params[:chart] == 'lead-time'
end
+
+ def should_track_ci_cd_time_to_restore_service?
+ params[:chart] == 'time-to-restore-service'
+ end
+
+ def should_track_ci_cd_change_failure_rate?
+ params[:chart] == 'change-failure-rate'
+ end
end
Projects::PipelinesController.prepend_mod_with('Projects::PipelinesController')
diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb
index 168e703c87d..cd9c6efb106 100644
--- a/app/controllers/projects/project_members_controller.rb
+++ b/app/controllers/projects/project_members_controller.rb
@@ -13,9 +13,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController
def index
@sort = params[:sort].presence || sort_value_name
-
- @group_links = @project.project_group_links
- @group_links = @group_links.search(params[:search_groups]) if params[:search_groups].present?
+ @include_relations ||= requested_relations(:groups_with_inherited_permissions)
if can?(current_user, :admin_project_member, @project)
@invited_members = present_members(invited_members)
diff --git a/app/controllers/projects/registry/repositories_controller.rb b/app/controllers/projects/registry/repositories_controller.rb
index ad3b2bc98e7..87cb8e4781f 100644
--- a/app/controllers/projects/registry/repositories_controller.rb
+++ b/app/controllers/projects/registry/repositories_controller.rb
@@ -8,6 +8,10 @@ module Projects
before_action :authorize_update_container_image!, only: [:destroy]
+ before_action do
+ push_frontend_feature_flag(:container_registry_show_shortened_path, project)
+ end
+
def index
respond_to do |format|
format.html { ensure_root_container_repository! }
diff --git a/app/controllers/projects/service_ping_controller.rb b/app/controllers/projects/service_ping_controller.rb
index d8f1785d95e..43c249afd8e 100644
--- a/app/controllers/projects/service_ping_controller.rb
+++ b/app/controllers/projects/service_ping_controller.rb
@@ -17,7 +17,8 @@ class Projects::ServicePingController < Projects::ApplicationController
return render_404 unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?
Gitlab::UsageDataCounters::WebIdeCounter.increment_previews_success_count
- Gitlab::UsageDataCounters::EditorUniqueCounter.track_live_preview_edit_action(author: current_user)
+ Gitlab::UsageDataCounters::EditorUniqueCounter.track_live_preview_edit_action(author: current_user,
+ project: project)
head(200)
end
diff --git a/app/controllers/projects/settings/integrations_controller.rb b/app/controllers/projects/settings/integrations_controller.rb
index 3365da65de8..cee9e9feb7b 100644
--- a/app/controllers/projects/settings/integrations_controller.rb
+++ b/app/controllers/projects/settings/integrations_controller.rb
@@ -11,6 +11,7 @@ module Projects
before_action :integration, only: [:edit, :update, :test]
before_action :default_integration, only: [:edit, :update]
before_action :web_hook_logs, only: [:edit, :update]
+ before_action -> { check_rate_limit!(:project_testing_integration, scope: [@project, current_user]) }, only: :test
respond_to :html
@@ -88,7 +89,7 @@ module Projects
unless result[:success]
return {
error: true,
- message: s_('Integrations|Connection failed. Please check your settings.'),
+ message: s_('Integrations|Connection failed. Check your integration settings.'),
service_response: result[:message].to_s,
test_failed: true
}
@@ -98,7 +99,7 @@ module Projects
rescue *Gitlab::HTTP::HTTP_ERRORS => e
{
error: true,
- message: s_('Integrations|Connection failed. Please check your settings.'),
+ message: s_('Integrations|Connection failed. Check your integration settings.'),
service_response: e.message,
test_failed: true
}
diff --git a/app/controllers/projects/settings/operations_controller.rb b/app/controllers/projects/settings/operations_controller.rb
index 77d7f3570f3..478d9f0b38e 100644
--- a/app/controllers/projects/settings/operations_controller.rb
+++ b/app/controllers/projects/settings/operations_controller.rb
@@ -14,7 +14,6 @@ module Projects
respond_to :json, only: [:reset_alerting_token, :reset_pagerduty_token]
helper_method :error_tracking_setting
- helper_method :tracing_setting
feature_category :incident_management
urgency :low
@@ -60,19 +59,9 @@ module Projects
::Gitlab::Tracking::IncidentManagement.track_from_params(
update_params[:incident_management_setting_attributes]
)
- track_tracing_external_url
end
end
- def track_tracing_external_url
- external_url_previous_change = project&.tracing_setting&.external_url_previous_change
-
- return unless external_url_previous_change
- return unless external_url_previous_change[0].blank? && external_url_previous_change[1].present?
-
- ::Gitlab::Tracking.event('project:operations:tracing', 'external_url_populated', user: current_user, project: project, namespace: project.namespace)
- end
-
def alerting_params
{ alerting_setting_attributes: { regenerate_token: true } }
end
@@ -124,10 +113,6 @@ module Projects
project.build_error_tracking_setting
end
- def tracing_setting
- @tracing_setting ||= project.tracing_setting || project.build_tracing_setting
- end
-
def update_params
params.require(:project).permit(permitted_project_params)
end
@@ -147,8 +132,7 @@ module Projects
project: [:slug, :name, :organization_slug, :organization_name, :sentry_project_id]
],
- grafana_integration_attributes: [:token, :grafana_url, :enabled],
- tracing_setting_attributes: [:external_url]
+ grafana_integration_attributes: [:token, :grafana_url, :enabled]
}
end
end
diff --git a/app/controllers/projects/tags/releases_controller.rb b/app/controllers/projects/tags/releases_controller.rb
index b852673d82a..adeadf2133e 100644
--- a/app/controllers/projects/tags/releases_controller.rb
+++ b/app/controllers/projects/tags/releases_controller.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# TODO: remove this file together with FF https://gitlab.com/gitlab-org/gitlab/-/issues/366244
+# also delete view/routes
class Projects::Tags::ReleasesController < Projects::ApplicationController
# Authorize
before_action :require_non_empty_project
diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb
index 432497850f2..847b1baca10 100644
--- a/app/controllers/projects/tags_controller.rb
+++ b/app/controllers/projects/tags_controller.rb
@@ -53,7 +53,7 @@ class Projects::TagsController < Projects::ApplicationController
return render_404 unless @tag
- @release = @project.releases.find_or_initialize_by(tag: @tag.name)
+ @release = @project.releases.find_by(tag: @tag.name)
@commit = @repository.commit(@tag.dereferenced_target)
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/controllers/projects/tracings_controller.rb b/app/controllers/projects/tracings_controller.rb
deleted file mode 100644
index b5c1354c4a9..00000000000
--- a/app/controllers/projects/tracings_controller.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- class TracingsController < Projects::ApplicationController
- content_security_policy do |p|
- next if p.directives.blank?
-
- global_frame_src = p.frame_src
-
- p.frame_src -> { frame_src_csp_policy(global_frame_src) }
- end
-
- before_action :authorize_update_environment!
-
- feature_category :tracing
- urgency :low
-
- def show
- render_404 unless Feature.enabled?(:monitor_tracing, @project)
- end
-
- private
-
- def frame_src_csp_policy(global_frame_src)
- external_url = @project&.tracing_setting&.external_url
-
- external_url.presence || global_frame_src
- end
- end
-end
diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb
index ed14f66847c..ce51cbb6677 100644
--- a/app/controllers/projects/tree_controller.rb
+++ b/app/controllers/projects/tree_controller.rb
@@ -18,7 +18,6 @@ class Projects::TreeController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:lazy_load_commits, @project)
- push_frontend_feature_flag(:refactor_blob_viewer, @project)
push_frontend_feature_flag(:highlight_js, @project)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 1e0ef1ad337..37e472050a0 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -36,7 +36,6 @@ class ProjectsController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:lazy_load_commits, @project)
- push_frontend_feature_flag(:refactor_blob_viewer, @project)
push_frontend_feature_flag(:highlight_js, @project)
push_frontend_feature_flag(:increase_page_size_exponentially, @project)
push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks)
diff --git a/app/controllers/registrations/welcome_controller.rb b/app/controllers/registrations/welcome_controller.rb
index a2b25acae64..4e18e6a3b20 100644
--- a/app/controllers/registrations/welcome_controller.rb
+++ b/app/controllers/registrations/welcome_controller.rb
@@ -3,6 +3,7 @@
module Registrations
class WelcomeController < ApplicationController
include OneTrustCSP
+ include GoogleAnalyticsCSP
layout 'minimal'
skip_before_action :authenticate_user!, :required_signup_info, :check_two_factor_requirement, only: [:show, :update]
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index 206580d205a..bb16c2d2098 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -7,6 +7,7 @@ class RegistrationsController < Devise::RegistrationsController
include InvisibleCaptchaOnSignup
include OneTrustCSP
include BizibleCSP
+ include GoogleAnalyticsCSP
layout 'devise'
@@ -220,7 +221,7 @@ class RegistrationsController < Devise::RegistrationsController
return unless member
- Gitlab::Tracking.event(self.class.name, 'accepted', label: 'invite_email', property: member.id.to_s)
+ Gitlab::Tracking.event(self.class.name, 'accepted', label: 'invite_email', property: member.id.to_s, user: resource)
end
def context_user
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index 7d251ba555c..7a7e63f5fc4 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -9,7 +9,7 @@ class SearchController < ApplicationController
RESCUE_FROM_TIMEOUT_ACTIONS = [:count, :show, :autocomplete].freeze
- track_redis_hll_event :show, name: 'i_search_total'
+ track_event :show, name: 'i_search_total', destinations: [:redis_hll, :snowplow]
around_action :allow_gitaly_ref_name_caching
@@ -42,13 +42,19 @@ class SearchController < ApplicationController
@sort = params[:sort] || default_sort
@search_service = Gitlab::View::Presenter::Factory.new(search_service, current_user: current_user).fabricate!
- @scope = @search_service.scope
- @without_count = @search_service.without_count?
- @show_snippets = @search_service.show_snippets?
- @search_results = @search_service.search_results
- @search_objects = @search_service.search_objects
- @search_highlight = @search_service.search_highlight
- @aggregations = @search_service.search_aggregations
+
+ @search_level = @search_service.level
+ @search_type = search_type
+
+ @global_search_duration_s = Benchmark.realtime do
+ @scope = @search_service.scope
+ @without_count = @search_service.without_count?
+ @show_snippets = @search_service.show_snippets?
+ @search_results = @search_service.search_results
+ @search_objects = @search_service.search_objects
+ @search_highlight = @search_service.search_highlight
+ @aggregations = @search_service.search_aggregations
+ end
increment_search_counters
end
@@ -144,7 +150,9 @@ class SearchController < ApplicationController
payload[:metadata]['meta.search.filters.state'] = params[:state]
payload[:metadata]['meta.search.force_search_results'] = params[:force_search_results]
payload[:metadata]['meta.search.project_ids'] = params[:project_ids]
- payload[:metadata]['meta.search.search_level'] = params[:search_level]
+ payload[:metadata]['meta.search.type'] = @search_type if @search_type.present?
+ payload[:metadata]['meta.search.level'] = @search_level if @search_level.present?
+ payload[:metadata][:global_search_duration_s] = @global_search_duration_s if @global_search_duration_s.present?
if search_service.abuse_detected?
payload[:metadata]['abuse.confidence'] = Gitlab::Abuse.confidence(:certain)
@@ -203,6 +211,14 @@ class SearchController < ApplicationController
render status: :request_timeout
end
end
+
+ def tracking_namespace_source
+ search_service.project&.namespace || search_service.group
+ end
+
+ def search_type
+ 'basic'
+ end
end
SearchController.prepend_mod_with('SearchController')
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 9000e9c39de..6195d152f00 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -11,6 +11,8 @@ class SessionsController < Devise::SessionsController
include Gitlab::Utils::StrongMemoize
include OneTrustCSP
include BizibleCSP
+ include VerifiesWithEmail
+ include GoogleAnalyticsCSP
skip_before_action :check_two_factor_requirement, only: [:destroy]
skip_before_action :check_password_expiration, only: [:destroy]
diff --git a/app/controllers/users/terms_controller.rb b/app/controllers/users/terms_controller.rb
index f7eb2aad9dc..f36b140f3a2 100644
--- a/app/controllers/users/terms_controller.rb
+++ b/app/controllers/users/terms_controller.rb
@@ -4,6 +4,7 @@ module Users
class TermsController < ApplicationController
include InternalRedirect
include OneTrustCSP
+ include GoogleAnalyticsCSP
skip_before_action :authenticate_user!, only: [:index]
skip_before_action :enforce_terms!
@@ -13,6 +14,10 @@ module Users
before_action :terms
+ before_action only: [:index] do
+ push_frontend_feature_flag(:gitlab_gtm_datalayer, type: :ops)
+ end
+
layout 'terms'
feature_category :user_management
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 2799479d922..eaf08cd421b 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -58,7 +58,9 @@ class UsersController < ApplicationController
# Get all keys of a user(params[:username]) in a text format
# Helpful for sysadmins to put in respective servers
def ssh_keys
- render plain: user.all_ssh_keys.join("\n")
+ keys = user.all_ssh_keys.join("\n")
+ keys << "\n" unless keys.empty?
+ render plain: keys
end
def activity
@@ -74,7 +76,9 @@ class UsersController < ApplicationController
# Get all gpg keys of a user(params[:username]) in a text format
def gpg_keys
- render plain: user.gpg_keys.select(&:verified?).map(&:key).join("\n")
+ keys = user.gpg_keys.filter_map { |gpg_key| gpg_key.key if gpg_key.verified? }.join("\n")
+ keys << "\n" unless keys.empty?
+ render plain: keys
end
def groups
diff --git a/app/events/pages/page_deleted_event.rb b/app/events/pages/page_deleted_event.rb
index b1ea14a6ec5..5787506121a 100644
--- a/app/events/pages/page_deleted_event.rb
+++ b/app/events/pages/page_deleted_event.rb
@@ -7,7 +7,8 @@ module Pages
'type' => 'object',
'properties' => {
'project_id' => { 'type' => 'integer' },
- 'namespace_id' => { 'type' => 'integer' }
+ 'namespace_id' => { 'type' => 'integer' },
+ 'root_namespace_id' => { 'type' => 'integer' }
},
'required' => %w[project_id namespace_id]
}
diff --git a/app/events/pages/page_deployed_event.rb b/app/events/pages/page_deployed_event.rb
new file mode 100644
index 00000000000..52e53772a51
--- /dev/null
+++ b/app/events/pages/page_deployed_event.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Pages
+ class PageDeployedEvent < ::Gitlab::EventStore::Event
+ def schema
+ {
+ 'type' => 'object',
+ 'properties' => {
+ 'project_id' => { 'type' => 'integer' },
+ 'namespace_id' => { 'type' => 'integer' },
+ 'root_namespace_id' => { 'type' => 'integer' }
+ },
+ 'required' => %w[project_id namespace_id root_namespace_id]
+ }
+ end
+ end
+end
diff --git a/app/events/projects/project_created_event.rb b/app/events/projects/project_created_event.rb
new file mode 100644
index 00000000000..abac772dfc9
--- /dev/null
+++ b/app/events/projects/project_created_event.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Projects
+ class ProjectCreatedEvent < ::Gitlab::EventStore::Event
+ def schema
+ {
+ 'type' => 'object',
+ 'properties' => {
+ 'project_id' => { 'type' => 'integer' },
+ 'namespace_id' => { 'type' => 'integer' },
+ 'root_namespace_id' => { 'type' => 'integer' }
+ },
+ 'required' => %w[project_id namespace_id root_namespace_id]
+ }
+ end
+ end
+end
diff --git a/app/events/projects/project_deleted_event.rb b/app/events/projects/project_deleted_event.rb
index ac58c5c6755..fe0c832fe0f 100644
--- a/app/events/projects/project_deleted_event.rb
+++ b/app/events/projects/project_deleted_event.rb
@@ -7,7 +7,8 @@ module Projects
'type' => 'object',
'properties' => {
'project_id' => { 'type' => 'integer' },
- 'namespace_id' => { 'type' => 'integer' }
+ 'namespace_id' => { 'type' => 'integer' },
+ 'root_namespace_id' => { 'type' => 'integer' }
},
'required' => %w[project_id namespace_id]
}
diff --git a/app/events/projects/project_path_changed_event.rb b/app/events/projects/project_path_changed_event.rb
new file mode 100644
index 00000000000..965f9258d3f
--- /dev/null
+++ b/app/events/projects/project_path_changed_event.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Projects
+ class ProjectPathChangedEvent < ::Gitlab::EventStore::Event
+ def schema
+ {
+ 'type' => 'object',
+ 'properties' => {
+ 'project_id' => { 'type' => 'integer' },
+ 'namespace_id' => { 'type' => 'integer' },
+ 'root_namespace_id' => { 'type' => 'integer' },
+ 'old_path' => { 'type' => 'string' },
+ 'new_path' => { 'type' => 'string' }
+ },
+ 'required' => %w[project_id namespace_id root_namespace_id old_path new_path]
+ }
+ end
+ end
+end
diff --git a/app/experiments/security_actions_continuous_onboarding_experiment.rb b/app/experiments/security_actions_continuous_onboarding_experiment.rb
new file mode 100644
index 00000000000..6adfbedc744
--- /dev/null
+++ b/app/experiments/security_actions_continuous_onboarding_experiment.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class SecurityActionsContinuousOnboardingExperiment < ApplicationExperiment
+ def control_behavior
+ end
+
+ def candidate_behavior
+ end
+end
diff --git a/app/finders/ci/auth_job_finder.rb b/app/finders/ci/auth_job_finder.rb
index 2dbdcb3c472..360afe5a7ab 100644
--- a/app/finders/ci/auth_job_finder.rb
+++ b/app/finders/ci/auth_job_finder.rb
@@ -29,7 +29,7 @@ module Ci
private
- attr_reader :token, :require_running, :raise_on_missing
+ attr_reader :token
def find_job_by_token
::Ci::Build.find_by_token(token)
diff --git a/app/finders/ci/runners_finder.rb b/app/finders/ci/runners_finder.rb
index 356915722fe..4f9244d9825 100644
--- a/app/finders/ci/runners_finder.rb
+++ b/app/finders/ci/runners_finder.rb
@@ -17,6 +17,7 @@ module Ci
search!
filter_by_active!
filter_by_status!
+ filter_by_upgrade_status!
filter_by_runner_type!
filter_by_tag_list!
sort!
@@ -67,6 +68,13 @@ module Ci
filter_by!(:status_status, Ci::Runner::AVAILABLE_STATUSES)
end
+ def filter_by_upgrade_status!
+ return unless @params.key?(:upgrade_status)
+ return unless Ci::RunnerVersion.statuses.key?(@params[:upgrade_status])
+
+ @runners = @runners.with_upgrade_status(@params[:upgrade_status])
+ end
+
def filter_by_runner_type!
filter_by!(:type_type, Ci::Runner::AVAILABLE_TYPES)
end
diff --git a/app/finders/clusters/agents_finder.rb b/app/finders/clusters/agents_finder.rb
index d0b1240157c..14277db3f85 100644
--- a/app/finders/clusters/agents_finder.rb
+++ b/app/finders/clusters/agents_finder.rb
@@ -4,8 +4,8 @@ module Clusters
class AgentsFinder
include FinderMethods
- def initialize(project, current_user, params: {})
- @project = project
+ def initialize(object, current_user, params: {})
+ @object = object
@current_user = current_user
@params = params
end
@@ -13,18 +13,25 @@ module Clusters
def execute
return ::Clusters::Agent.none unless can_read_cluster_agents?
- agents = project.cluster_agents
- agents = agents.with_name(params[:name]) if params[:name].present?
+ agents = filter_clusters(object.cluster_agents)
agents.ordered_by_name
end
private
- attr_reader :project, :current_user, :params
+ attr_reader :object, :current_user, :params
+
+ def filter_clusters(agents)
+ agents = agents.with_name(params[:name]) if params[:name].present?
+
+ agents
+ end
def can_read_cluster_agents?
- current_user.can?(:read_cluster, project)
+ current_user&.can?(:read_cluster, object)
end
end
end
+
+Clusters::AgentsFinder.prepend_mod_with('Clusters::AgentsFinder')
diff --git a/app/finders/contributed_projects_finder.rb b/app/finders/contributed_projects_finder.rb
index a351d30229e..eccc7d3f2bb 100644
--- a/app/finders/contributed_projects_finder.rb
+++ b/app/finders/contributed_projects_finder.rb
@@ -11,12 +11,15 @@ class ContributedProjectsFinder < UnionFinder
# current_user - When given the list of the projects is limited to those only
# visible by this user.
#
+ # ignore_visibility - When true the list of projects will include all contributed
+ # projects, regardless of their visibility to the current_user
+ #
# Returns an ActiveRecord::Relation.
- def execute(current_user = nil)
+ def execute(current_user = nil, ignore_visibility: false)
# Do not show contributed projects if the user profile is private.
return Project.none unless can_read_profile?(current_user)
- segments = all_projects(current_user)
+ segments = all_projects(current_user, ignore_visibility)
find_union(segments, Project).with_namespace.order_id_desc
end
@@ -27,7 +30,9 @@ class ContributedProjectsFinder < UnionFinder
Ability.allowed?(current_user, :read_user_profile, @user)
end
- def all_projects(current_user)
+ def all_projects(current_user, ignore_visibility)
+ return [@user.contributed_projects] if ignore_visibility
+
projects = []
projects << @user.contributed_projects.visible_to_user(current_user) if current_user
diff --git a/app/finders/groups/user_groups_finder.rb b/app/finders/groups/user_groups_finder.rb
index f4aed413867..90367638dcf 100644
--- a/app/finders/groups/user_groups_finder.rb
+++ b/app/finders/groups/user_groups_finder.rb
@@ -35,7 +35,7 @@ module Groups
attr_reader :current_user, :target_user, :params
def sort(items)
- items.order(path: :asc, id: :asc) # rubocop: disable CodeReuse/ActiveRecord
+ items.order(Group.arel_table[:path].asc, Group.arel_table[:id].asc) # rubocop: disable CodeReuse/ActiveRecord
end
def by_search(items)
@@ -47,6 +47,8 @@ module Groups
def by_permission_scope
if permission_scope_create_projects?
target_user.manageable_groups(include_groups_with_developer_maintainer_access: true)
+ elsif permission_scope_transfer_projects?
+ target_user.manageable_groups(include_groups_with_developer_maintainer_access: false)
else
target_user.groups
end
@@ -55,5 +57,9 @@ module Groups
def permission_scope_create_projects?
params[:permission_scope] == :create_projects
end
+
+ def permission_scope_transfer_projects?
+ params[:permission_scope] == :transfer_projects
+ end
end
end
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 6bbbc237e62..8ecf0c158e0 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -316,7 +316,12 @@ class IssuableFinder
# rubocop: disable CodeReuse/ActiveRecord
def by_project(items)
- if params.project? || params.projects
+ # When finding issues for multiple projects it's more efficient
+ # to use a JOIN instead of running a sub-query
+ # See https://gitlab.com/gitlab-org/gitlab/-/commit/8591cc02be6b12ed60f763a5e0147f2cbbca99e1
+ if params.projects.is_a?(ActiveRecord::Relation)
+ items.merge(params.projects.reorder(nil)).join_project
+ elsif params.projects
items.of_projects(params.projects).references_project
else
items.none
@@ -431,7 +436,7 @@ class IssuableFinder
elsif not_params.filter_by_started_milestone?
items.joins(:milestone).merge(Milestone.not_started)
else
- items.without_particular_milestone(not_params[:milestone_title])
+ items.without_particular_milestones(not_params[:milestone_title])
end
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb
index f6db150c5d8..6b8dcd61d29 100644
--- a/app/finders/projects_finder.rb
+++ b/app/finders/projects_finder.rb
@@ -16,6 +16,7 @@
# visibility_level: int
# tag: string[] - deprecated, use 'topic' instead
# topic: string[]
+# topic_id: int
# personal: boolean
# search: string
# search_namespaces: boolean
@@ -81,6 +82,7 @@ class ProjectsFinder < UnionFinder
collection = by_trending(collection)
collection = by_visibility_level(collection)
collection = by_topics(collection)
+ collection = by_topic_id(collection)
collection = by_search(collection)
collection = by_archived(collection)
collection = by_custom_attributes(collection)
@@ -186,12 +188,21 @@ class ProjectsFinder < UnionFinder
topics = params[:topic].instance_of?(String) ? params[:topic].split(',') : params[:topic]
topics.map(&:strip).uniq.reject(&:empty?).each do |topic|
- items = items.with_topic(topic)
+ items = items.with_topic_by_name(topic)
end
items
end
+ def by_topic_id(items)
+ return items unless params[:topic_id].present?
+
+ topic = Projects::Topic.find_by(id: params[:topic_id]) # rubocop: disable CodeReuse/ActiveRecord
+ return Project.none unless topic
+
+ items.with_topic(topic)
+ end
+
def by_search(items)
params[:search] ||= params[:name]
diff --git a/app/finders/snippets_finder.rb b/app/finders/snippets_finder.rb
index b1e12721712..bf20a2c2c3d 100644
--- a/app/finders/snippets_finder.rb
+++ b/app/finders/snippets_finder.rb
@@ -41,6 +41,7 @@
class SnippetsFinder < UnionFinder
include FinderMethods
include Gitlab::Utils::StrongMemoize
+ include CreatedAtFilter
attr_reader :current_user, :params
@@ -69,6 +70,7 @@ class SnippetsFinder < UnionFinder
items = init_collection
items = by_ids(items)
items = items.with_optional_visibility(visibility_from_scope)
+ items = by_created_at(items)
items.order_by(sort_param)
end
diff --git a/app/finders/user_recent_events_finder.rb b/app/finders/user_recent_events_finder.rb
index 0f7bf893bb2..3e06dbb2e2c 100644
--- a/app/finders/user_recent_events_finder.rb
+++ b/app/finders/user_recent_events_finder.rb
@@ -47,24 +47,6 @@ class UserRecentEventsFinder
end
# rubocop: disable CodeReuse/ActiveRecord
- def execute_optimized_multi(users)
- Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new(
- scope: Event.reorder(id: :desc),
- array_scope: User.select(:id).where(id: users),
- # Event model has a default scope { reorder(nil) }
- # When a relation is rordered and used as a target when merging scope,
- # its order takes a precedence and _overwrites_ the original scope's order.
- # Thus we have to explicitly provide `reorder` for array_mapping_scope here.
- array_mapping_scope: -> (author_id_expression) { Event.where(Event.arel_table[:author_id].eq(author_id_expression)).reorder(id: :desc) },
- finder_query: -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
- )
- .execute
- .limit(limit)
- .offset(params[:offset] || 0)
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # rubocop: disable CodeReuse/ActiveRecord
def execute_multi
users = []
@target_user.each do |user|
@@ -73,26 +55,18 @@ class UserRecentEventsFinder
return Event.none if users.empty?
- if Feature.enabled?(:optimized_followed_users_queries, current_user)
- array_data = {
- scope_ids: users,
- scope_model: User,
- mapping_column: :author_id
- }
- query_builder_params = event_filter.in_operator_query_builder_params(array_data)
-
- Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
- .new(**query_builder_params)
- .execute
- .limit(limit)
- .offset(params[:offset] || 0)
- else
- if event_filter.filter == EventFilter::ALL
- execute_optimized_multi(users)
- else
- event_filter.apply_filter(Event.where(author: users).limit_recent(limit, params[:offset] || 0))
- end
- end
+ array_data = {
+ scope_ids: users,
+ scope_model: User,
+ mapping_column: :author_id
+ }
+ query_builder_params = event_filter.in_operator_query_builder_params(array_data)
+
+ Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
+ .new(**query_builder_params)
+ .execute
+ .limit(limit)
+ .offset(params[:offset] || 0)
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/graphql/mutations/concerns/mutations/work_items/update_arguments.rb b/app/graphql/mutations/concerns/mutations/work_items/update_arguments.rb
index 6a91a097a17..cbe1cfb4099 100644
--- a/app/graphql/mutations/concerns/mutations/work_items/update_arguments.rb
+++ b/app/graphql/mutations/concerns/mutations/work_items/update_arguments.rb
@@ -15,6 +15,15 @@ module Mutations
argument :title, GraphQL::Types::String,
required: false,
description: copy_field_description(Types::WorkItemType, :title)
+ argument :description_widget, ::Types::WorkItems::Widgets::DescriptionInputType,
+ required: false,
+ description: 'Input for description widget.'
+ argument :weight_widget, ::Types::WorkItems::Widgets::WeightInputType,
+ required: false,
+ description: 'Input for weight widget.'
+ argument :hierarchy_widget, ::Types::WorkItems::Widgets::HierarchyUpdateInputType,
+ required: false,
+ description: 'Input for hierarchy widget.'
end
end
end
diff --git a/app/graphql/mutations/concerns/mutations/work_items/widgetable.rb b/app/graphql/mutations/concerns/mutations/work_items/widgetable.rb
new file mode 100644
index 00000000000..445b2eb6441
--- /dev/null
+++ b/app/graphql/mutations/concerns/mutations/work_items/widgetable.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Mutations
+ module WorkItems
+ module Widgetable
+ extend ActiveSupport::Concern
+
+ def extract_widget_params!(work_item_type, attributes)
+ # Get the list of widgets for the work item's type to extract only the supported attributes
+ widget_keys = ::WorkItems::Type.available_widgets.map(&:api_symbol)
+ widget_params = attributes.extract!(*widget_keys)
+
+ not_supported_keys = widget_params.keys - work_item_type.widgets.map(&:api_symbol)
+ if not_supported_keys.present?
+ raise Gitlab::Graphql::Errors::ArgumentError,
+ "Following widget keys are not supported by #{work_item_type.name} type: #{not_supported_keys}"
+ end
+
+ # Cannot use prepare to use `.to_h` on each input due to
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87472#note_945199865
+ widget_params.transform_values { |values| values.to_h }
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/notes/create/diff_note.rb b/app/graphql/mutations/notes/create/diff_note.rb
index 019e7cb8623..7b8c06fd104 100644
--- a/app/graphql/mutations/notes/create/diff_note.rb
+++ b/app/graphql/mutations/notes/create/diff_note.rb
@@ -32,7 +32,8 @@ module Mutations
def create_note_params(noteable, args)
super(noteable, args).merge({
type: 'DiffNote',
- position: position(noteable, args)
+ position: position(noteable, args),
+ merge_request_diff_head_sha: args[:position][:head_sha]
})
end
diff --git a/app/graphql/mutations/pages/base.rb b/app/graphql/mutations/pages/base.rb
new file mode 100644
index 00000000000..5eb8ecdf0ba
--- /dev/null
+++ b/app/graphql/mutations/pages/base.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Pages
+ class Base < BaseMutation
+ include FindsProject
+
+ argument :project_path, GraphQL::Types::ID,
+ required: true,
+ description: 'Full path of the project.'
+ end
+ end
+end
diff --git a/app/graphql/mutations/pages/mark_onboarding_complete.rb b/app/graphql/mutations/pages/mark_onboarding_complete.rb
new file mode 100644
index 00000000000..2f5ce5db54a
--- /dev/null
+++ b/app/graphql/mutations/pages/mark_onboarding_complete.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Pages
+ class MarkOnboardingComplete < Base
+ graphql_name 'PagesMarkOnboardingComplete'
+
+ field :onboarding_complete,
+ Boolean,
+ null: false,
+ description: "Indicates the new onboarding_complete state of the project's Pages metadata."
+
+ authorize :admin_project
+
+ def resolve(project_path:)
+ project = authorized_find!(project_path)
+
+ project.mark_pages_onboarding_complete
+
+ {
+ onboarding_complete: project.pages_metadatum.onboarding_complete,
+ errors: errors_on_object(project)
+ }
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/snippets/create.rb b/app/graphql/mutations/snippets/create.rb
index 2921a77b86d..96ac3f8a113 100644
--- a/app/graphql/mutations/snippets/create.rb
+++ b/app/graphql/mutations/snippets/create.rb
@@ -54,7 +54,7 @@ module Mutations
# Only when the user is not an api user and the operation was successful
if !api_user? && service_response.success?
- ::Gitlab::UsageDataCounters::EditorUniqueCounter.track_snippet_editor_edit_action(author: current_user)
+ ::Gitlab::UsageDataCounters::EditorUniqueCounter.track_snippet_editor_edit_action(author: current_user, project: project)
end
snippet = service_response.payload[:snippet]
diff --git a/app/graphql/mutations/snippets/update.rb b/app/graphql/mutations/snippets/update.rb
index 2a2941c5328..39843a3714a 100644
--- a/app/graphql/mutations/snippets/update.rb
+++ b/app/graphql/mutations/snippets/update.rb
@@ -43,7 +43,7 @@ module Mutations
# Only when the user is not an api user and the operation was successful
if !api_user? && service_response.success?
- ::Gitlab::UsageDataCounters::EditorUniqueCounter.track_snippet_editor_edit_action(author: current_user)
+ ::Gitlab::UsageDataCounters::EditorUniqueCounter.track_snippet_editor_edit_action(author: current_user, project: snippet.project)
end
snippet = service_response.payload[:snippet]
diff --git a/app/graphql/mutations/user_callouts/create.rb b/app/graphql/mutations/user_callouts/create.rb
index 1be99ea0ecd..7f372053e84 100644
--- a/app/graphql/mutations/user_callouts/create.rb
+++ b/app/graphql/mutations/user_callouts/create.rb
@@ -15,7 +15,7 @@ module Mutations
description: 'User callout dismissed.'
def resolve(feature_name:)
- callout = Users::DismissCalloutService.new(
+ callout = ::Users::DismissCalloutService.new(
container: nil, current_user: current_user, params: { feature_name: feature_name }
).execute
errors = errors_on_object(callout)
diff --git a/app/graphql/mutations/work_items/create.rb b/app/graphql/mutations/work_items/create.rb
index 2ae26ed0e1a..350153eaf19 100644
--- a/app/graphql/mutations/work_items/create.rb
+++ b/app/graphql/mutations/work_items/create.rb
@@ -7,6 +7,7 @@ module Mutations
include Mutations::SpamProtection
include FindsProject
+ include Mutations::WorkItems::Widgetable
description "Creates a work item. Available only when feature flag `work_items` is enabled."
@@ -15,6 +16,9 @@ module Mutations
argument :description, GraphQL::Types::String,
required: false,
description: copy_field_description(Types::WorkItemType, :description)
+ argument :hierarchy_widget, ::Types::WorkItems::Widgets::HierarchyCreateInputType,
+ required: false,
+ description: 'Input for hierarchy widget.'
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Full path of the project the work item is associated with.'
@@ -36,10 +40,18 @@ module Mutations
return { errors: ['`work_items` feature flag disabled for this project'] }
end
+ spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
params = global_id_compatibility_params(attributes).merge(author_id: current_user.id)
+ type = ::WorkItems::Type.find(attributes[:work_item_type_id])
+ widget_params = extract_widget_params!(type, params)
- spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
- create_result = ::WorkItems::CreateService.new(project: project, current_user: current_user, params: params, spam_params: spam_params).execute
+ create_result = ::WorkItems::CreateService.new(
+ project: project,
+ current_user: current_user,
+ params: params,
+ spam_params: spam_params,
+ widget_params: widget_params
+ ).execute
check_spam_action_response!(create_result[:work_item]) if create_result[:work_item]
diff --git a/app/graphql/mutations/work_items/update.rb b/app/graphql/mutations/work_items/update.rb
index c495da00f41..5d8c574877a 100644
--- a/app/graphql/mutations/work_items/update.rb
+++ b/app/graphql/mutations/work_items/update.rb
@@ -9,6 +9,7 @@ module Mutations
include Mutations::SpamProtection
include Mutations::WorkItems::UpdateArguments
+ include Mutations::WorkItems::Widgetable
authorize :update_work_item
@@ -24,19 +25,21 @@ module Mutations
end
spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
+ widget_params = extract_widget_params!(work_item.work_item_type, attributes)
- ::WorkItems::UpdateService.new(
+ update_result = ::WorkItems::UpdateService.new(
project: work_item.project,
current_user: current_user,
params: attributes,
+ widget_params: widget_params,
spam_params: spam_params
).execute(work_item)
check_spam_action_response!(work_item)
{
- work_item: work_item.valid? ? work_item : nil,
- errors: errors_on_object(work_item)
+ work_item: (update_result[:work_item] if update_result[:status] == :success),
+ errors: Array.wrap(update_result[:message])
}
end
diff --git a/app/graphql/mutations/work_items/update_widgets.rb b/app/graphql/mutations/work_items/update_widgets.rb
index d19da0abaac..7037b7e5a2a 100644
--- a/app/graphql/mutations/work_items/update_widgets.rb
+++ b/app/graphql/mutations/work_items/update_widgets.rb
@@ -2,6 +2,7 @@
module Mutations
module WorkItems
+ # TODO: Deprecate in favor of using WorkItemUpdate. See https://gitlab.com/gitlab-org/gitlab/-/issues/366300
class UpdateWidgets < BaseMutation
graphql_name 'WorkItemUpdateWidgets'
description "Updates the attributes of a work item's widgets by global ID." \
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 264878ccaa2..5f995eb958b 100644
--- a/app/graphql/queries/container_registry/get_container_repositories.query.graphql
+++ b/app/graphql/queries/container_registry/get_container_repositories.query.graphql
@@ -32,6 +32,10 @@ query getProjectContainerRepositories(
createdAt
expirationPolicyStartedAt
expirationPolicyCleanupStatus
+ project {
+ id
+ path
+ }
__typename
}
pageInfo {
@@ -67,6 +71,10 @@ query getProjectContainerRepositories(
createdAt
expirationPolicyStartedAt
expirationPolicyCleanupStatus
+ project {
+ id
+ path
+ }
__typename
}
pageInfo {
diff --git a/app/graphql/queries/repository/path_last_commit.query.graphql b/app/graphql/queries/repository/path_last_commit.query.graphql
index bcb07ae3182..914be3a72c1 100644
--- a/app/graphql/queries/repository/path_last_commit.query.graphql
+++ b/app/graphql/queries/repository/path_last_commit.query.graphql
@@ -4,43 +4,46 @@ query pathLastCommit($projectPath: ID!, $path: String, $ref: String!) {
id
repository {
__typename
- tree(path: $path, ref: $ref) {
+ paginatedTree(path: $path, ref: $ref) {
__typename
- lastCommit {
+ nodes {
__typename
- id
- sha
- title
- titleHtml
- descriptionHtml
- message
- webPath
- authoredDate
- authorName
- authorGravatar
- author {
+ lastCommit {
__typename
id
- name
- avatarUrl
+ sha
+ title
+ titleHtml
+ descriptionHtml
+ message
webPath
- }
- signatureHtml
- pipelines(ref: $ref, first: 1) {
- __typename
- edges {
+ authoredDate
+ authorName
+ authorGravatar
+ author {
+ __typename
+ id
+ name
+ avatarUrl
+ webPath
+ }
+ signatureHtml
+ pipelines(ref: $ref, first: 1) {
__typename
- node {
+ edges {
__typename
- id
- detailedStatus {
+ node {
__typename
id
- detailsPath
- icon
- tooltip
- text
- group
+ detailedStatus {
+ __typename
+ id
+ detailsPath
+ icon
+ tooltip
+ text
+ group
+ }
}
}
}
diff --git a/app/graphql/resolvers/ci/jobs_resolver.rb b/app/graphql/resolvers/ci/jobs_resolver.rb
index df138a15538..91f29948ad0 100644
--- a/app/graphql/resolvers/ci/jobs_resolver.rb
+++ b/app/graphql/resolvers/ci/jobs_resolver.rb
@@ -15,9 +15,15 @@ module Resolvers
required: false,
description: 'Filter jobs by status.'
- def resolve(statuses: nil, security_report_types: [])
+ argument :retried, ::GraphQL::Types::Boolean,
+ required: false,
+ description: 'Filter jobs by retry-status.'
+
+ def resolve(statuses: nil, security_report_types: [], retried: nil)
jobs = init_collection(security_report_types)
jobs = jobs.with_status(statuses) if statuses.present?
+ jobs = jobs.retried if retried
+ jobs = jobs.latest if retried == false
jobs
end
diff --git a/app/graphql/resolvers/ci/runners_resolver.rb b/app/graphql/resolvers/ci/runners_resolver.rb
index e221dfea4d0..64738608b60 100644
--- a/app/graphql/resolvers/ci/runners_resolver.rb
+++ b/app/graphql/resolvers/ci/runners_resolver.rb
@@ -36,6 +36,10 @@ module Resolvers
required: false,
description: 'Sort order of results.'
+ argument :upgrade_status, ::Types::Ci::RunnerUpgradeStatusTypeEnum,
+ required: false,
+ description: 'Filter by upgrade status.'
+
def resolve_with_lookahead(**args)
apply_lookahead(
::Ci::RunnersFinder
@@ -54,6 +58,7 @@ module Resolvers
status_status: params[:status]&.to_s,
type_type: params[:type],
tag_name: params[:tag_list],
+ upgrade_status: params[:upgrade_status],
search: params[:search],
sort: params[:sort]&.to_s,
preload: {
diff --git a/app/graphql/resolvers/ci/test_suite_resolver.rb b/app/graphql/resolvers/ci/test_suite_resolver.rb
index 5d61d9e986b..f758e217b47 100644
--- a/app/graphql/resolvers/ci/test_suite_resolver.rb
+++ b/app/graphql/resolvers/ci/test_suite_resolver.rb
@@ -28,7 +28,7 @@ module Resolvers
def load_test_suite_data(builds)
suite = builds.sum do |build|
- build.collect_test_reports!(Gitlab::Ci::Reports::TestReports.new)
+ build.collect_test_reports!(Gitlab::Ci::Reports::TestReport.new)
end
Gitlab::Ci::Reports::TestFailureHistory.new(suite.failed.values, pipeline.project).load!
diff --git a/app/graphql/resolvers/clusters/agents_resolver.rb b/app/graphql/resolvers/clusters/agents_resolver.rb
index 28618bef807..0b9eb361dbd 100644
--- a/app/graphql/resolvers/clusters/agents_resolver.rb
+++ b/app/graphql/resolvers/clusters/agents_resolver.rb
@@ -15,12 +15,10 @@ module Resolvers
description: 'Name of the cluster agent.'
end
- alias_method :project, :object
-
def resolve_with_lookahead(**args)
apply_lookahead(
::Clusters::AgentsFinder
- .new(project, current_user, params: args)
+ .new(object, current_user, params: args)
.execute
)
end
@@ -36,3 +34,5 @@ module Resolvers
end
end
end
+
+Resolvers::Clusters::AgentsResolver.prepend_mod_with('Resolvers::Clusters::AgentsResolver')
diff --git a/app/graphql/resolvers/todo_resolver.rb b/app/graphql/resolvers/todo_resolver.rb
index f0be1b6e9a5..0653cd27b4d 100644
--- a/app/graphql/resolvers/todo_resolver.rb
+++ b/app/graphql/resolvers/todo_resolver.rb
@@ -2,68 +2,16 @@
module Resolvers
class TodoResolver < BaseResolver
- type Types::TodoType.connection_type, null: true
+ description 'Retrieve a single to-do item'
- alias_method :target, :object
+ type Types::TodoType, null: true
- argument :action, [Types::TodoActionEnum],
- required: false,
- description: 'Action to be filtered.'
+ argument :id, Types::GlobalIDType[Todo],
+ required: true,
+ description: 'ID of the to-do item.'
- argument :author_id, [GraphQL::Types::ID],
- required: false,
- description: 'ID of an author.'
-
- argument :project_id, [GraphQL::Types::ID],
- required: false,
- description: 'ID of a project.'
-
- argument :group_id, [GraphQL::Types::ID],
- required: false,
- description: 'ID of a group.'
-
- argument :state, [Types::TodoStateEnum],
- required: false,
- description: 'State of the todo.'
-
- argument :type, [Types::TodoTargetEnum],
- required: false,
- description: 'Type of the todo.'
-
- before_connection_authorization do |nodes, current_user|
- Preloaders::UserMaxAccessLevelInProjectsPreloader.new(
- nodes.map(&:project).compact,
- current_user
- ).execute
- end
-
- def resolve(**args)
- return Todo.none unless current_user.present? && target.present?
- return Todo.none if target.is_a?(User) && target != current_user
-
- TodosFinder.new(current_user, todo_finder_params(args)).execute.with_entity_associations
- end
-
- private
-
- def todo_finder_params(args)
- {
- state: args[:state],
- type: args[:type],
- group_id: args[:group_id],
- author_id: args[:author_id],
- action_id: args[:action],
- project_id: args[:project_id]
- }.merge(target_params)
- end
-
- def target_params
- return {} unless TodosFinder::TODO_TYPES.include?(target.class.name)
-
- {
- type: target.class.name,
- target_id: target.id
- }
+ def resolve(id:)
+ GitlabSchema.find_by_gid(id)
end
end
end
diff --git a/app/graphql/resolvers/todos_resolver.rb b/app/graphql/resolvers/todos_resolver.rb
new file mode 100644
index 00000000000..3e8dddb4859
--- /dev/null
+++ b/app/graphql/resolvers/todos_resolver.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class TodosResolver < BaseResolver
+ type Types::TodoType.connection_type, null: true
+
+ alias_method :target, :object
+
+ argument :action, [Types::TodoActionEnum],
+ required: false,
+ description: 'Action to be filtered.'
+
+ argument :author_id, [GraphQL::Types::ID],
+ required: false,
+ description: 'ID of an author.'
+
+ argument :project_id, [GraphQL::Types::ID],
+ required: false,
+ description: 'ID of a project.'
+
+ argument :group_id, [GraphQL::Types::ID],
+ required: false,
+ description: 'ID of a group.'
+
+ argument :state, [Types::TodoStateEnum],
+ required: false,
+ description: 'State of the todo.'
+
+ argument :type, [Types::TodoTargetEnum],
+ required: false,
+ description: 'Type of the todo.'
+
+ before_connection_authorization do |nodes, current_user|
+ Preloaders::UserMaxAccessLevelInProjectsPreloader.new(
+ nodes.map(&:project).compact,
+ current_user
+ ).execute
+ end
+
+ def resolve(**args)
+ return Todo.none unless current_user.present? && target.present?
+ return Todo.none if target.is_a?(User) && target != current_user
+
+ TodosFinder.new(current_user, todo_finder_params(args)).execute.with_entity_associations
+ end
+
+ private
+
+ def todo_finder_params(args)
+ {
+ state: args[:state],
+ type: args[:type],
+ group_id: args[:group_id],
+ author_id: args[:author_id],
+ action_id: args[:action],
+ project_id: args[:project_id]
+ }.merge(target_params)
+ end
+
+ def target_params
+ return {} unless TodosFinder::TODO_TYPES.include?(target.class.name)
+
+ {
+ type: target.class.name,
+ target_id: target.id
+ }
+ end
+ end
+end
diff --git a/app/graphql/types/alert_management/alert_type.rb b/app/graphql/types/alert_management/alert_type.rb
index 43b7bbb419f..a0d19229d3d 100644
--- a/app/graphql/types/alert_management/alert_type.rb
+++ b/app/graphql/types/alert_management/alert_type.rb
@@ -116,7 +116,7 @@ module Types
null: true,
description: 'Runbook for the alert as defined in alert details.'
- field :todos, description: 'To-do items of the current user for the alert.', resolver: Resolvers::TodoResolver
+ field :todos, description: 'To-do items of the current user for the alert.', resolver: Resolvers::TodosResolver
field :details_url,
GraphQL::Types::String,
diff --git a/app/graphql/types/ci/job_type.rb b/app/graphql/types/ci/job_type.rb
index b20a671179b..42b55f47f92 100644
--- a/app/graphql/types/ci/job_type.rb
+++ b/app/graphql/types/ci/job_type.rb
@@ -70,6 +70,8 @@ module Types
description: 'Downstream pipeline for a bridge.'
field :manual_job, GraphQL::Types::Boolean, null: true,
description: 'Whether the job has a manual action.'
+ field :manual_variables, VariableType.connection_type, null: true,
+ description: 'Variables added to a manual job when the job is triggered.'
field :playable, GraphQL::Types::Boolean, null: false, method: :playable?,
description: 'Indicates the job can be played.'
field :previous_stage_jobs_or_needs, Types::Ci::JobNeedUnion.connection_type, null: true,
@@ -78,6 +80,8 @@ module Types
description: 'Ref name of the job.'
field :ref_path, GraphQL::Types::String, null: true,
description: 'Path to the ref.'
+ field :retried, GraphQL::Types::Boolean, null: true,
+ description: 'Indicates that the job has been retried.'
field :retryable, GraphQL::Types::Boolean, null: false, method: :retryable?,
description: 'Indicates the job can be retried.'
field :scheduling_type, GraphQL::Types::String, null: true,
@@ -188,6 +192,14 @@ module Types
def triggered
object.try(:trigger_request)
end
+
+ def manual_variables
+ if object.manual? && object.respond_to?(:job_variables)
+ object.job_variables
+ else
+ []
+ end
+ end
end
end
end
diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb
index 949e216a982..ac5ffd39407 100644
--- a/app/graphql/types/ci/runner_type.rb
+++ b/app/graphql/types/ci/runner_type.rb
@@ -159,12 +159,19 @@ module Types
owner_ids = runner_owner_ids_by_runner_id.values.flatten.uniq
owners = assoc_type.where(id: owner_ids).index_by(&:id)
+ # Preload projects namespaces to avoid N+1 queries when checking the `read_project` policy for each
+ preload_projects_namespaces(owners.values) if assoc_type == Project
+
runner_ids.each do |runner_id|
loader.call(runner_id, runner_owner_ids_by_runner_id[runner_id]&.map { |owner_id| owners[owner_id] } || [])
end
end
end
# rubocop: enable CodeReuse/ActiveRecord
+
+ def preload_projects_namespaces(_projects)
+ # overridden in EE
+ end
end
end
end
diff --git a/app/graphql/types/ci/runner_upgrade_status_type_enum.rb b/app/graphql/types/ci/runner_upgrade_status_type_enum.rb
index 02feafe3df9..8e32eee5e6e 100644
--- a/app/graphql/types/ci/runner_upgrade_status_type_enum.rb
+++ b/app/graphql/types/ci/runner_upgrade_status_type_enum.rb
@@ -5,10 +5,15 @@ module Types
class RunnerUpgradeStatusTypeEnum < BaseEnum
graphql_name 'CiRunnerUpgradeStatusType'
- value 'UNKNOWN', description: 'Upgrade status is unknown.', value: :unknown
+ ::Ci::RunnerVersion::STATUS_DESCRIPTIONS.each do |status, description|
+ status_name_src =
+ if status == :invalid_version
+ :invalid
+ else
+ status
+ end
- Gitlab::Ci::RunnerUpgradeCheck::STATUSES.each do |status, description|
- value status.to_s.upcase, description: description, value: status
+ value status_name_src.to_s.upcase, description: description, value: status
end
end
end
diff --git a/app/graphql/types/ci/variable_type.rb b/app/graphql/types/ci/variable_type.rb
new file mode 100644
index 00000000000..63f89b6d207
--- /dev/null
+++ b/app/graphql/types/ci/variable_type.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ # rubocop: disable Graphql/AuthorizeTypes
+ class VariableType < BaseObject
+ graphql_name 'CiVariable'
+
+ field :id, GraphQL::Types::ID, null: false,
+ description: 'ID of the variable.'
+
+ field :key, GraphQL::Types::String, null: true,
+ description: 'Name of the variable.'
+
+ field :value, GraphQL::Types::String, null: true,
+ description: 'Value of the variable.'
+
+ field :variable_type, ::Types::Ci::VariableTypeEnum, null: true,
+ description: 'Type of the variable.'
+
+ field :protected, GraphQL::Types::Boolean, null: true,
+ description: 'Indicates whether the variable is protected.'
+
+ field :masked, GraphQL::Types::Boolean, null: true,
+ description: 'Indicates whether the variable is masked.'
+
+ field :raw, GraphQL::Types::Boolean, null: true,
+ description: 'Indicates whether the variable is raw.'
+
+ field :environment_scope, GraphQL::Types::String, null: true,
+ description: 'Scope defining the environments in which the variable can be used.'
+
+ def environment_scope
+ if object.respond_to?(:environment_scope)
+ object.environment_scope
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/ci/variable_type_enum.rb b/app/graphql/types/ci/variable_type_enum.rb
new file mode 100644
index 00000000000..44430754a2e
--- /dev/null
+++ b/app/graphql/types/ci/variable_type_enum.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ class VariableTypeEnum < BaseEnum
+ graphql_name 'CiVariableType'
+
+ ::Ci::Variable.variable_types.keys.each do |variable_type|
+ value variable_type.upcase, value: variable_type, description: "#{variable_type.humanize} type."
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb
index 49971d52a30..52e9f808066 100644
--- a/app/graphql/types/group_type.rb
+++ b/app/graphql/types/group_type.rb
@@ -194,6 +194,13 @@ module Types
complexity: 5,
resolver: Resolvers::GroupsResolver
+ field :ci_variables,
+ Types::Ci::VariableType.connection_type,
+ null: true,
+ description: "List of the group's CI/CD variables.",
+ authorize: :admin_group,
+ method: :variables
+
field :runners, Types::Ci::RunnerType.connection_type,
null: true,
resolver: Resolvers::Ci::GroupRunnersResolver,
diff --git a/app/graphql/types/issue_type_enum.rb b/app/graphql/types/issue_type_enum.rb
index b18c8b90e96..bc21b802179 100644
--- a/app/graphql/types/issue_type_enum.rb
+++ b/app/graphql/types/issue_type_enum.rb
@@ -8,5 +8,9 @@ module Types
::WorkItems::Type.allowed_types_for_issues.each do |issue_type|
value issue_type.upcase, value: issue_type, description: "#{issue_type.titleize} issue type"
end
+
+ value 'TASK', value: 'task',
+ description: 'Task issue type. Available only when feature flag `work_items` is enabled.',
+ deprecated: { milestone: '15.2', reason: :alpha }
end
end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index 8642957af02..46ab3f3f432 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -148,6 +148,7 @@ module Types
mount_mutation Mutations::WorkItems::UpdateTask, deprecated: { milestone: '15.1', reason: :alpha }
mount_mutation Mutations::SavedReplies::Create
mount_mutation Mutations::SavedReplies::Update
+ mount_mutation Mutations::Pages::MarkOnboardingComplete
mount_mutation Mutations::SavedReplies::Destroy
end
end
diff --git a/app/graphql/types/permission_types/group_enum.rb b/app/graphql/types/permission_types/group_enum.rb
index cc4f5e9f1f0..8b0fee8898c 100644
--- a/app/graphql/types/permission_types/group_enum.rb
+++ b/app/graphql/types/permission_types/group_enum.rb
@@ -7,6 +7,8 @@ module Types
description 'User permission on groups'
value 'CREATE_PROJECTS', value: :create_projects, description: 'Groups where the user can create projects.'
+ value 'TRANSFER_PROJECTS', value: :transfer_projects,
+ description: 'Groups where the user can transfer projects to.'
end
end
end
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index 603d5ead540..7e3800c6a13 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -70,10 +70,10 @@ module Types
description: 'Indicates if shared runners are enabled for the project.'
field :service_desk_enabled, GraphQL::Types::Boolean, null: true,
- description: 'Indicates if the project has service desk enabled.'
+ description: 'Indicates if the project has Service Desk enabled.'
field :service_desk_address, GraphQL::Types::String, null: true,
- description: 'E-mail address of the service desk.'
+ description: 'E-mail address of the Service Desk.'
field :avatar_url, GraphQL::Types::String, null: true, calls_gitaly: true,
description: 'URL to avatar image file of the project.'
@@ -220,6 +220,13 @@ module Types
description: 'Build pipeline counts of the project.',
resolver: Resolvers::Ci::ProjectPipelineCountsResolver
+ field :ci_variables,
+ Types::Ci::VariableType.connection_type,
+ null: true,
+ description: "List of the project's CI/CD variables.",
+ authorize: :admin_build,
+ method: :variables
+
field :ci_cd_settings,
Types::Ci::CiCdSettingType,
null: true,
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index 46d121f6552..9207a867639 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -123,6 +123,11 @@ module Types
resolver: Resolvers::Ci::RunnersResolver,
description: "Find runners visible to the current user."
+ field :ci_variables,
+ Types::Ci::VariableType.connection_type,
+ null: true,
+ description: "List of the instance's CI/CD variables."
+
field :ci_config, resolver: Resolvers::Ci::ConfigResolver, complexity: 126 # AUTHENTICATED_MAX_COMPLEXITY / 2 + 1
field :timelogs, Types::TimelogType.connection_type,
@@ -136,6 +141,10 @@ module Types
null: true,
resolver: Resolvers::BoardListResolver
+ field :todo,
+ null: true,
+ resolver: Resolvers::TodoResolver
+
field :topics, Types::Projects::TopicType.connection_type,
null: true,
resolver: Resolvers::TopicsResolver,
@@ -174,6 +183,12 @@ module Types
application_settings
end
+ def ci_variables
+ return unless current_user.can_admin_all_resources?
+
+ ::Ci::InstanceVariable.all
+ end
+
def application_settings
Gitlab::CurrentSettings.current_application_settings
end
diff --git a/app/graphql/types/release_type.rb b/app/graphql/types/release_type.rb
index 43dc0c4ce85..d906c577aa5 100644
--- a/app/graphql/types/release_type.rb
+++ b/app/graphql/types/release_type.rb
@@ -40,6 +40,8 @@ module Types
authorize: :download_code
field :upcoming_release, GraphQL::Types::Boolean, null: true, method: :upcoming_release?,
description: 'Indicates the release is an upcoming release.'
+ field :historical_release, GraphQL::Types::Boolean, null: true, method: :historical_release?,
+ description: 'Indicates the release is an historical release.'
field :author, Types::UserType, null: true,
description: 'User that created the release.'
diff --git a/app/graphql/types/user_interface.rb b/app/graphql/types/user_interface.rb
index 1c8a1352c72..edbc8aee9c5 100644
--- a/app/graphql/types/user_interface.rb
+++ b/app/graphql/types/user_interface.rb
@@ -88,7 +88,7 @@ module Types
null: true,
description: 'Personal namespace of the user.'
- field :todos, resolver: Resolvers::TodoResolver, description: 'To-do items of the user.'
+ field :todos, resolver: Resolvers::TodosResolver, description: 'To-do items of the user.'
# Merge request field: MRs can be authored, assigned, or assigned-for-review:
field :authored_merge_requests,
diff --git a/app/graphql/types/work_item_id_type.rb b/app/graphql/types/work_item_id_type.rb
index ddcf3416014..bb01f865414 100644
--- a/app/graphql/types/work_item_id_type.rb
+++ b/app/graphql/types/work_item_id_type.rb
@@ -27,6 +27,7 @@ module Types
def coerce_input(string, ctx)
gid = super
+ return if gid.nil?
# Always return a WorkItemID even if an Issue Global ID is provided as input
return work_item_gid(gid) if suitable?(gid)
diff --git a/app/graphql/types/work_items/widget_interface.rb b/app/graphql/types/work_items/widget_interface.rb
index f3cf1d74829..1b752393296 100644
--- a/app/graphql/types/work_items/widget_interface.rb
+++ b/app/graphql/types/work_items/widget_interface.rb
@@ -16,13 +16,19 @@ module Types
::Types::WorkItems::Widgets::DescriptionType
when ::WorkItems::Widgets::Hierarchy
::Types::WorkItems::Widgets::HierarchyType
+ when ::WorkItems::Widgets::Assignees
+ ::Types::WorkItems::Widgets::AssigneesType
+ when ::WorkItems::Widgets::Weight
+ ::Types::WorkItems::Widgets::WeightType
else
raise "Unknown GraphQL type for widget #{object}"
end
end
orphan_types ::Types::WorkItems::Widgets::DescriptionType,
- ::Types::WorkItems::Widgets::HierarchyType
+ ::Types::WorkItems::Widgets::HierarchyType,
+ ::Types::WorkItems::Widgets::AssigneesType,
+ ::Types::WorkItems::Widgets::WeightType
end
end
end
diff --git a/app/graphql/types/work_items/widgets/assignees_type.rb b/app/graphql/types/work_items/widgets/assignees_type.rb
new file mode 100644
index 00000000000..08ee06fdfa0
--- /dev/null
+++ b/app/graphql/types/work_items/widgets/assignees_type.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Types
+ module WorkItems
+ module Widgets
+ # Disabling widget level authorization as it might be too granular
+ # and we already authorize the parent work item
+ # rubocop:disable Graphql/AuthorizeTypes
+ class AssigneesType < BaseObject
+ graphql_name 'WorkItemWidgetAssignees'
+ description 'Represents an assignees widget'
+
+ implements Types::WorkItems::WidgetInterface
+
+ field :assignees, Types::UserType.connection_type, null: true,
+ description: 'Assignees of the work item.'
+
+ field :allows_multiple_assignees, GraphQL::Types::Boolean, null: true, method: :allows_multiple_assignees?,
+ description: 'Indicates whether multiple assignees are allowed.'
+
+ field :can_invite_members, GraphQL::Types::Boolean, null: false, resolver_method: :can_invite_members?,
+ description: 'Indicates whether the current user can invite members to the work item\'s project.'
+
+ def can_invite_members?
+ Ability.allowed?(current_user, :admin_project_member, object.work_item.project)
+ end
+ end
+ # rubocop:enable Graphql/AuthorizeTypes
+ end
+ end
+end
diff --git a/app/graphql/types/work_items/widgets/hierarchy_create_input_type.rb b/app/graphql/types/work_items/widgets/hierarchy_create_input_type.rb
new file mode 100644
index 00000000000..cee6d69cd0c
--- /dev/null
+++ b/app/graphql/types/work_items/widgets/hierarchy_create_input_type.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Types
+ module WorkItems
+ module Widgets
+ class HierarchyCreateInputType < BaseInputObject
+ graphql_name 'WorkItemWidgetHierarchyCreateInput'
+
+ argument :parent_id, ::Types::GlobalIDType[::WorkItem],
+ required: false,
+ loads: ::Types::WorkItemType,
+ description: 'Global ID of the parent work item.'
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/work_items/widgets/hierarchy_update_input_type.rb b/app/graphql/types/work_items/widgets/hierarchy_update_input_type.rb
new file mode 100644
index 00000000000..e1a9ebb76e9
--- /dev/null
+++ b/app/graphql/types/work_items/widgets/hierarchy_update_input_type.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Types
+ module WorkItems
+ module Widgets
+ class HierarchyUpdateInputType < BaseInputObject
+ graphql_name 'WorkItemWidgetHierarchyUpdateInput'
+
+ argument :parent_id, ::Types::GlobalIDType[::WorkItem],
+ required: false,
+ loads: ::Types::WorkItemType,
+ description: 'Global ID of the parent work item. Use `null` to remove the association.'
+
+ argument :children_ids, [::Types::GlobalIDType[::WorkItem]],
+ required: false,
+ description: 'Global IDs of children work items.',
+ loads: ::Types::WorkItemType,
+ as: :children
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/work_items/widgets/weight_input_type.rb b/app/graphql/types/work_items/widgets/weight_input_type.rb
new file mode 100644
index 00000000000..a01c63222a5
--- /dev/null
+++ b/app/graphql/types/work_items/widgets/weight_input_type.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Types
+ module WorkItems
+ module Widgets
+ class WeightInputType < BaseInputObject
+ graphql_name 'WorkItemWidgetWeightInput'
+
+ argument :weight, GraphQL::Types::Int,
+ required: true,
+ description: 'Weight of the work item.'
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/work_items/widgets/weight_type.rb b/app/graphql/types/work_items/widgets/weight_type.rb
new file mode 100644
index 00000000000..c8eaf560268
--- /dev/null
+++ b/app/graphql/types/work_items/widgets/weight_type.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Types
+ module WorkItems
+ module Widgets
+ # Disabling widget level authorization as it might be too granular
+ # and we already authorize the parent work item
+ # rubocop:disable Graphql/AuthorizeTypes
+ class WeightType < BaseObject
+ graphql_name 'WorkItemWidgetWeight'
+ description 'Represents a weight widget'
+
+ implements Types::WorkItems::WidgetInterface
+
+ field :weight, GraphQL::Types::Int, null: true,
+ description: 'Weight of the work item.'
+ end
+ # rubocop:enable Graphql/AuthorizeTypes
+ end
+ end
+end
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index cd31d2c75ab..321a6e9395e 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -238,6 +238,8 @@ module ApplicationSettingsHelper
:email_author_in_body,
:enabled_git_access_protocol,
:enforce_terms,
+ :error_tracking_enabled,
+ :error_tracking_api_url,
:external_pipeline_validation_service_timeout,
:external_pipeline_validation_service_token,
:external_pipeline_validation_service_url,
@@ -402,6 +404,7 @@ module ApplicationSettingsHelper
:wiki_page_max_content_bytes,
:container_registry_delete_tags_service_timeout,
:rate_limiting_response_text,
+ :package_registry_cleanup_policies_worker_capacity,
:container_registry_expiration_policies_worker_capacity,
:container_registry_cleanup_tags_service_max_list_size,
:container_registry_import_max_tags_count,
diff --git a/app/helpers/ci/pipeline_editor_helper.rb b/app/helpers/ci/pipeline_editor_helper.rb
index bb3f7b5aa79..d044a93213a 100644
--- a/app/helpers/ci/pipeline_editor_helper.rb
+++ b/app/helpers/ci/pipeline_editor_helper.rb
@@ -18,6 +18,7 @@ module Ci
"ci-config-path": project.ci_config_path_or_default,
"ci-examples-help-page-path" => help_page_path('ci/examples/index'),
"ci-help-page-path" => help_page_path('ci/index'),
+ "ci-lint-path" => project_ci_lint_path(project),
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => image_path('illustrations/empty-state/empty-dag-md.svg'),
"initial-branch-name" => initial_branch,
@@ -32,6 +33,7 @@ module Ci
"project-full-path" => project.full_path,
"project-namespace" => project.namespace.full_path,
"runner-help-page-path" => help_page_path('ci/runners/index'),
+ "simulate-pipeline-help-page-path" => help_page_path('ci/lint', anchor: 'simulate-a-pipeline'),
"total-branches" => total_branches,
"validate-tab-illustration-path" => image_path('illustrations/project-run-CICD-pipelines-sm.svg'),
"yml-help-page-path" => help_page_path('ci/yaml/index')
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index 3c3179f6fbe..33b771eef69 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -184,7 +184,7 @@ module CommitsHelper
def diff_mode_swap_button(mode, file_hash)
icon = mode == 'raw' ? 'doc-code' : 'doc-text'
- entity = mode == 'raw' ? 'toHideBtn' : 'toShowBtn'
+ entity = mode == 'raw' ? 'rawButton' : 'renderedButton'
title = "Display #{mode} diff"
link_to("##{mode}-diff-#{file_hash}",
diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb
index 71c8296ad2e..457502347ee 100644
--- a/app/helpers/diff_helper.rb
+++ b/app/helpers/diff_helper.rb
@@ -33,6 +33,7 @@ module DiffHelper
if action_name == 'diff_for_path'
options[:expanded] = true
options[:paths] = params.values_at(:old_path, :new_path)
+ options[:use_extra_viewer_as_main] = false
end
options
@@ -227,6 +228,7 @@ module DiffHelper
def conflicts(allow_tree_conflicts: false)
return unless options[:merge_ref_head_diff]
+ return unless merge_request.cannot_be_merged?
conflicts_service = MergeRequests::Conflicts::ListService.new(merge_request, allow_tree_conflicts: allow_tree_conflicts) # rubocop:disable CodeReuse/ServiceClass
diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb
index c23d905a008..54733fa9101 100644
--- a/app/helpers/emails_helper.rb
+++ b/app/helpers/emails_helper.rb
@@ -116,19 +116,16 @@ module EmailsHelper
end
end
- # "You are receiving this email because #{reason} on #{gitlab_host}."
- def notification_reason_text(reason)
- gitlab_host = Gitlab.config.gitlab.host
-
- case reason
- when NotificationReason::OWN_ACTIVITY
- _("You're receiving this email because of your activity on %{host}.") % { host: gitlab_host }
- when NotificationReason::ASSIGNED
- _("You're receiving this email because you have been assigned an item on %{host}.") % { host: gitlab_host }
- when NotificationReason::MENTIONED
- _("You're receiving this email because you have been mentioned on %{host}.") % { host: gitlab_host }
+ # "You are receiving this email because ... on #{host}. ..."
+ def notification_reason_text(reason: nil, show_manage_notifications_link: false, show_help_link: false, manage_label_subscriptions_url: nil, unsubscribe_url: nil, format: :text)
+ if unsubscribe_url && show_manage_notifications_link && show_help_link
+ notification_reason_text_with_unsubscribe_and_manage_notifications_and_help_links(reason: reason, unsubscribe_url: unsubscribe_url, format: format)
+ elsif !reason && manage_label_subscriptions_url && show_help_link
+ notification_reason_text_with_manage_label_subscriptions_and_help_links(manage_label_subscriptions_url: manage_label_subscriptions_url, format: format)
+ elsif show_manage_notifications_link && show_help_link
+ notification_reason_text_with_manage_notifications_and_help_links(reason: reason, format: format)
else
- _("You're receiving this email because of your account on %{host}.") % { host: gitlab_host }
+ notification_reason_text_without_links(reason: reason, format: format)
end
end
@@ -259,9 +256,7 @@ module EmailsHelper
end
def instance_access_request_text(user, format: nil)
- gitlab_host = Gitlab.config.gitlab.host
-
- _('%{username} has asked for a GitLab account on your instance %{host}:') % { username: sanitize_name(user.name), host: gitlab_host }
+ _('%{username} has asked for a GitLab account on your instance %{host}:').html_safe % { username: sanitize_name(user.name), host: gitlab_host_link(format) }
end
def instance_access_request_link(user, format: nil)
@@ -276,6 +271,14 @@ module EmailsHelper
end
end
+ def link_start(url)
+ '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: url }
+ end
+
+ def link_end
+ '</a>'.html_safe
+ end
+
def contact_your_administrator_text
_('Please contact your administrator with any questions.')
end
@@ -317,6 +320,75 @@ module EmailsHelper
def email_header_and_footer_enabled?
current_appearance&.email_header_and_footer_enabled?
end
+
+ def gitlab_host_link(format)
+ case format
+ when :html
+ generate_link(Gitlab.config.gitlab.host, Gitlab.config.gitlab.url)
+ when :text
+ Gitlab.config.gitlab.host
+ end
+ end
+
+ def notification_reason_text_with_unsubscribe_and_manage_notifications_and_help_links(reason:, unsubscribe_url:, format:)
+ unsubscribe_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: unsubscribe_url }
+ unsubscribe_link_end = '</a>'.html_safe
+
+ manage_notifications_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="mng-notif-link">'.html_safe % { url: profile_notifications_url }
+ manage_notifications_link_end = '</a>'.html_safe
+
+ help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="help-link">'.html_safe % { url: help_url }
+ help_link_end = '</a>'.html_safe
+
+ case reason
+ when NotificationReason::OWN_ACTIVITY
+ _("You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}").html_safe % { host: gitlab_host_link(format), unsubscribe_link_start: unsubscribe_link_start, unsubscribe_link_end: unsubscribe_link_end, manage_notifications_link_start: manage_notifications_link_start, manage_notifications_link_end: manage_notifications_link_end, help_link_start: help_link_start, help_link_end: help_link_end }
+ when NotificationReason::ASSIGNED
+ _("You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}").html_safe % { host: gitlab_host_link(format), unsubscribe_link_start: unsubscribe_link_start, unsubscribe_link_end: unsubscribe_link_end, manage_notifications_link_start: manage_notifications_link_start, manage_notifications_link_end: manage_notifications_link_end, help_link_start: help_link_start, help_link_end: help_link_end }
+ when NotificationReason::MENTIONED
+ _("You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}").html_safe % { host: gitlab_host_link(format), unsubscribe_link_start: unsubscribe_link_start, unsubscribe_link_end: unsubscribe_link_end, manage_notifications_link_start: manage_notifications_link_start, manage_notifications_link_end: manage_notifications_link_end, help_link_start: help_link_start, help_link_end: help_link_end }
+ else
+ _("You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}").html_safe % { host: gitlab_host_link(format), unsubscribe_link_start: unsubscribe_link_start, unsubscribe_link_end: unsubscribe_link_end, manage_notifications_link_start: manage_notifications_link_start, manage_notifications_link_end: manage_notifications_link_end, help_link_start: help_link_start, help_link_end: help_link_end }
+ end
+ end
+
+ def notification_reason_text_with_manage_label_subscriptions_and_help_links(manage_label_subscriptions_url:, format:)
+ manage_label_subscriptions_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="mng-notif-link">'.html_safe % { url: manage_label_subscriptions_url }
+ manage_label_subscriptions_link_end = '</a>'.html_safe
+
+ help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="help-link">'.html_safe % { url: help_url }
+ help_link_end = '</a>'.html_safe
+
+ _("You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}").html_safe % { host: gitlab_host_link(format), manage_label_subscriptions_link_start: manage_label_subscriptions_link_start, manage_label_subscriptions_link_end: manage_label_subscriptions_link_end, help_link_start: help_link_start, help_link_end: help_link_end }
+ end
+
+ def notification_reason_text_with_manage_notifications_and_help_links(reason:, format:)
+ manage_notifications_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="mng-notif-link">'.html_safe % { url: profile_notifications_url }
+ manage_notifications_link_end = '</a>'.html_safe
+
+ help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="help-link">'.html_safe % { url: help_url }
+ help_link_end = '</a>'.html_safe
+
+ case reason
+ when NotificationReason::MENTIONED
+ _("You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}").html_safe % { host: gitlab_host_link(format), manage_notifications_link_start: manage_notifications_link_start, manage_notifications_link_end: manage_notifications_link_end, help_link_start: help_link_start, help_link_end: help_link_end }
+ else
+ _("You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}").html_safe % { host: gitlab_host_link(format), manage_notifications_link_start: manage_notifications_link_start, manage_notifications_link_end: manage_notifications_link_end, help_link_start: help_link_start, help_link_end: help_link_end }
+ end
+ end
+
+ def notification_reason_text_without_links(reason:, format:)
+ case reason
+ when NotificationReason::OWN_ACTIVITY
+ _("You're receiving this email because of your activity on %{host}.").html_safe % { host: gitlab_host_link(format) }
+ when NotificationReason::ASSIGNED
+ _("You're receiving this email because you have been assigned an item on %{host}.").html_safe % { host: gitlab_host_link(format) }
+ when NotificationReason::MENTIONED
+ _("You're receiving this email because you have been mentioned on %{host}.").html_safe % { host: gitlab_host_link(format) }
+ else
+ _("You're receiving this email because of your account on %{host}.").html_safe % { host: gitlab_host_link(format) }
+ end
+ end
end
EmailsHelper.prepend_mod_with('EmailsHelper')
diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb
index 59d43c51db2..2623e32dbc8 100644
--- a/app/helpers/environments_helper.rb
+++ b/app/helpers/environments_helper.rb
@@ -36,7 +36,6 @@ module EnvironmentsHelper
"environment_name": environment.name,
"environments_path": api_v4_projects_environments_path(id: project.id),
"environment_id": environment.id,
- "cluster_applications_documentation_path" => help_page_path('user/clusters/integrations.md', anchor: 'elastic-stack-cluster-integration'),
"clusters_path": project_clusters_path(project, format: :json)
}
end
diff --git a/app/helpers/groups/group_members_helper.rb b/app/helpers/groups/group_members_helper.rb
index 37b23345d2a..2021961772a 100644
--- a/app/helpers/groups/group_members_helper.rb
+++ b/app/helpers/groups/group_members_helper.rb
@@ -9,7 +9,7 @@ module Groups::GroupMembersHelper
{ multiple: true, class: 'input-clamp qa-member-select-field ', scope: :all, email_user: true }
end
- def group_members_app_data(group, members:, invited:, access_requests:, include_relations:, search:)
+ def group_members_app_data(group, members:, invited:, access_requests:, banned:, include_relations:, search:)
{
user: group_members_list_data(group, members, { param_name: :page, params: { invited_members_page: nil, search_invited: nil } }),
group: group_group_links_list_data(group, include_relations, search),
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index 9ea9509bc28..9d152416b2e 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -126,7 +126,7 @@ module GroupsHelper
group.root? && current_user.can?(:admin_setting_to_allow_project_access_token_creation, group)
end
- def show_thanks_for_purchase_banner?
+ def show_thanks_for_purchase_alert?
params.key?(:purchased_quantity) && params[:purchased_quantity].to_i > 0
end
diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb
index 8d5523464c7..a1512d40235 100644
--- a/app/helpers/integrations_helper.rb
+++ b/app/helpers/integrations_helper.rb
@@ -216,7 +216,7 @@ module IntegrationsHelper
end
def fields_for_integration(integration)
- Integrations::FieldSerializer.new(integration: integration).represent(integration.global_fields).to_json
+ Integrations::FieldSerializer.new(integration: integration).represent(integration.form_fields).to_json
end
def integration_level(integration)
diff --git a/app/helpers/learn_gitlab_helper.rb b/app/helpers/learn_gitlab_helper.rb
index 890f7f099df..421cf84f98c 100644
--- a/app/helpers/learn_gitlab_helper.rb
+++ b/app/helpers/learn_gitlab_helper.rb
@@ -4,6 +4,7 @@ module LearnGitlabHelper
IMAGE_PATH_PLAN = "learn_gitlab/section_plan.svg"
IMAGE_PATH_DEPLOY = "learn_gitlab/section_deploy.svg"
IMAGE_PATH_WORKSPACE = "learn_gitlab/section_workspace.svg"
+ LICENSE_SCANNING_RUN_URL = 'https://docs.gitlab.com/ee/user/compliance/license_compliance/index.html'
def learn_gitlab_enabled?(project)
return false unless current_user
@@ -64,7 +65,7 @@ module LearnGitlabHelper
git_write: project_path(project),
merge_request_created: project_merge_requests_path(project),
user_added: project_members_url(project),
- security_scan_enabled: project_security_configuration_path(project)
+ **deploy_section_action_urls(project)
)
end
@@ -72,6 +73,23 @@ module LearnGitlabHelper
LearnGitlab::Onboarding::ACTION_ISSUE_IDS.transform_values { |id| project_issue_url(learn_gitlab_project, id) }
end
+ def deploy_section_action_urls(project)
+ experiment(:security_actions_continuous_onboarding,
+ namespace: project.namespace,
+ user: current_user,
+ sticky_to: current_user
+ ) do |e|
+ e.control { { security_scan_enabled: project_security_configuration_path(project) } }
+ e.candidate do
+ {
+ license_scanning_run: LICENSE_SCANNING_RUN_URL,
+ secure_dependency_scanning_run: project_security_configuration_path(project, anchor: 'dependency-scanning'),
+ secure_dast_run: project_security_configuration_path(project, anchor: 'dast')
+ }
+ end
+ end.run
+ end
+
def learn_gitlab_project
@learn_gitlab_project ||= LearnGitlab::Project.new(current_user).project
end
diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb
index 777d485797f..6077a059f6f 100644
--- a/app/helpers/markup_helper.rb
+++ b/app/helpers/markup_helper.rb
@@ -8,8 +8,8 @@ module MarkupHelper
# Let's increase the render timeout
# For a smaller one, a test that renders the blob content statically fails
- # We can consider removing this custom timeout when refactor_blob_viewer FF is removed:
- # https://gitlab.com/gitlab-org/gitlab/-/issues/324351
+ # We can consider removing this custom timeout when markup_rendering_timeout FF is removed:
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/365358
RENDER_TIMEOUT = 5.seconds
def plain?(filename)
diff --git a/app/helpers/namespace_storage_limit_alert_helper.rb b/app/helpers/namespace_storage_limit_alert_helper.rb
deleted file mode 100644
index ed11f89a7dd..00000000000
--- a/app/helpers/namespace_storage_limit_alert_helper.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module NamespaceStorageLimitAlertHelper
- # Overridden in EE
- def display_namespace_storage_limit_alert!
- end
-end
-
-NamespaceStorageLimitAlertHelper.prepend_mod_with('NamespaceStorageLimitAlertHelper')
diff --git a/app/helpers/nav/new_dropdown_helper.rb b/app/helpers/nav/new_dropdown_helper.rb
index 469d6c1a7eb..fb8fafe59f3 100644
--- a/app/helpers/nav/new_dropdown_helper.rb
+++ b/app/helpers/nav/new_dropdown_helper.rb
@@ -16,7 +16,7 @@ module Nav
menu_sections.push(general_menu_section)
{
- title: _("Create new"),
+ title: _("Create new..."),
menu_sections: menu_sections.select { |x| x.fetch(:menu_items).any? }
}
end
diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb
index 20d40626449..ec64746d6b6 100644
--- a/app/helpers/packages_helper.rb
+++ b/app/helpers/packages_helper.rb
@@ -53,4 +53,14 @@ module PackagesHelper
project.container_expiration_policy.nil? &&
project.container_repositories.exists?
end
+
+ def show_container_registry_settings(project)
+ Gitlab.config.registry.enabled &&
+ Ability.allowed?(current_user, :admin_container_image, project)
+ end
+
+ def show_package_registry_settings(project)
+ Gitlab.config.packages.enabled &&
+ Ability.allowed?(current_user, :admin_package, project)
+ end
end
diff --git a/app/helpers/projects/pipeline_helper.rb b/app/helpers/projects/pipeline_helper.rb
index eeee8290914..3b3fe13e58a 100644
--- a/app/helpers/projects/pipeline_helper.rb
+++ b/app/helpers/projects/pipeline_helper.rb
@@ -4,7 +4,7 @@ module Projects
module PipelineHelper
extend ::Ci::BuildsHelper
- def js_pipeline_tabs_data(project, pipeline)
+ def js_pipeline_tabs_data(project, pipeline, _user)
{
can_generate_codequality_reports: pipeline.can_generate_codequality_reports?.to_json,
failed_jobs_count: pipeline.failed_builds.count,
diff --git a/app/helpers/projects/project_members_helper.rb b/app/helpers/projects/project_members_helper.rb
index d5cc2b72ae9..51a7d3e35d0 100644
--- a/app/helpers/projects/project_members_helper.rb
+++ b/app/helpers/projects/project_members_helper.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
module Projects::ProjectMembersHelper
- def project_members_app_data_json(project, members:, group_links:, invited:, access_requests:)
+ def project_members_app_data_json(project, members:, invited:, access_requests:, include_relations:, search:)
{
user: project_members_list_data(project, members, { param_name: :page, params: { search_groups: nil } }),
- group: project_group_links_list_data(project, group_links),
+ group: project_group_links_list_data(project, include_relations, search),
invite: project_members_list_data(project, invited.nil? ? [] : invited),
access_request: project_members_list_data(project, access_requests.nil? ? [] : access_requests),
source_id: project.id,
@@ -57,10 +57,29 @@ module Projects::ProjectMembersHelper
}
end
- def project_group_links_list_data(project, group_links)
+ def project_group_links_list_data(project, include_relations, search)
+ members = []
+
+ if include_relations.include?(:direct)
+ project_group_links = project.project_group_links
+ project_group_links = project_group_links.search(search) if search
+ members += project_group_links_serialized(project, project_group_links)
+ end
+
+ if include_relations.include?(:inherited)
+ group_group_links = project.group_group_links.distinct_on_shared_with_group_id_with_group_access
+ group_group_links = group_group_links.search(search) if search
+ members += group_group_links_serialized(project, group_group_links)
+ end
+
+ if project_group_links.present? && group_group_links.present?
+ members = members.sort_by { |m| -m.dig(:access_level, :integer_value).to_i }
+ .uniq { |m| m.dig(:shared_with_group, :id) }
+ end
+
{
- members: project_group_links_serialized(project, group_links),
- pagination: members_pagination_data(group_links),
+ members: members,
+ pagination: members_pagination_data(members),
member_path: project_group_link_path(project, ':id')
}
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 95e91a7ba27..2ece3e87500 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -377,7 +377,7 @@ module ProjectsHelper
canDisableEmails: can_disable_emails?(project, current_user),
canChangeVisibilityLevel: can_change_visibility_level?(project, current_user),
allowedVisibilityOptions: project_allowed_visibility_levels(project),
- visibilityHelpPath: help_page_path('public_access/public_access'),
+ visibilityHelpPath: help_page_path('user/public_access'),
registryAvailable: Gitlab.config.registry.enabled,
registryHelpPath: help_page_path('user/packages/container_registry/index'),
lfsAvailable: Gitlab.config.lfs.enabled,
@@ -388,7 +388,8 @@ module ProjectsHelper
pagesAccessControlEnabled: Gitlab.config.pages.access_control,
pagesAccessControlForced: ::Gitlab::Pages.access_control_is_forced?,
pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control'),
- issuesHelpPath: help_page_path('user/project/issues/index')
+ issuesHelpPath: help_page_path('user/project/issues/index'),
+ membersPagePath: project_project_members_path(project)
}
end
@@ -684,7 +685,6 @@ module ProjectsHelper
product_analytics
metrics_dashboard
feature_flags
- tracings
terraform
]
end
diff --git a/app/helpers/releases_helper.rb b/app/helpers/releases_helper.rb
index a516ac85131..50089c7edab 100644
--- a/app/helpers/releases_helper.rb
+++ b/app/helpers/releases_helper.rb
@@ -53,12 +53,14 @@ module ReleasesHelper
def data_for_edit_release_page
new_edit_pages_shared_data.merge(
tag_name: @release.tag,
- releases_page_path: project_releases_path(@project, anchor: @release.tag)
+ releases_page_path: project_releases_path(@project, anchor: @release.tag),
+ delete_release_docs_path: releases_help_page_path(anchor: 'delete-a-release')
)
end
def data_for_new_release_page
new_edit_pages_shared_data.merge(
+ tag_name: params[:tag_name],
default_branch: @project.default_branch,
releases_page_path: project_releases_path(@project)
)
@@ -81,7 +83,8 @@ module ReleasesHelper
release_assets_docs_path: releases_help_page_path(anchor: 'release-assets'),
manage_milestones_path: project_milestones_path(@project),
new_milestone_path: new_project_milestone_path(@project),
- edit_release_docs_path: releases_help_page_path(anchor: 'edit-a-release')
+ edit_release_docs_path: releases_help_page_path(anchor: 'edit-a-release'),
+ upcoming_release_docs_path: releases_help_page_path(anchor: 'upcoming-releases')
}
end
end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index c8750cd9b52..ecbcaec27bc 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
module SearchHelper
+ # params which should persist when a new tab is selected
SEARCH_GENERIC_PARAMS = [
:search,
:scope,
@@ -129,7 +130,7 @@ module SearchHelper
end
def search_service
- @search_service ||= ::SearchService.new(current_user, params.merge(confidential: Gitlab::Utils.to_boolean(params[:confidential])))
+ @search_service ||= ::SearchService.new(current_user, sanitized_search_params)
end
def search_sort_options
@@ -169,7 +170,7 @@ module SearchHelper
# search_context exposes a bit too much data to the frontend, this controls what data we share and when.
def header_search_context
{}.tap do |hash|
- hash[:group] = { id: search_context.group.id, name: search_context.group.name } if search_context.for_group?
+ hash[:group] = { id: search_context.group.id, name: search_context.group.name, full_name: search_context.group.full_name } if search_context.for_group?
hash[:group_metadata] = search_context.group_metadata if search_context.for_group?
hash[:project] = { id: search_context.project.id, name: search_context.project.name } if search_context.for_project?
@@ -207,10 +208,10 @@ module SearchHelper
{ 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: _("Public Access Help"), url: help_page_path("user/public_access") },
{ category: "Help", label: _("Rake Tasks Help"), url: help_page_path("raketasks/index") },
- { 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: _("SSH Keys Help"), url: help_page_path("user/ssh") },
+ { category: "Help", label: _("System Hooks Help"), url: help_page_path("administration/system_hooks") },
{ category: "Help", label: _("Webhooks Help"), url: help_page_path("user/project/integrations/webhooks") }
]
end
@@ -481,6 +482,13 @@ module SearchHelper
def feature_flag_tab_enabled?(flag)
@group || Feature.enabled?(flag, current_user, type: :ops)
end
+
+ def sanitized_search_params
+ sanitized_params = params.dup
+ sanitized_params[:confidential] = Gitlab::Utils.to_boolean(sanitized_params[:confidential]) if sanitized_params.key?(:confidential)
+
+ sanitized_params
+ end
end
SearchHelper.prepend_mod_with('SearchHelper')
diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb
index f0389000eb3..129180d1ccf 100644
--- a/app/helpers/sessions_helper.rb
+++ b/app/helpers/sessions_helper.rb
@@ -39,4 +39,16 @@ module SessionsHelper
# 2. https://github.com/redis-store/redis-store/blob/3acfa95f4eb6260c714fdb00a3d84be8eedc13b2/lib/redis/store/ttl.rb#L32
request.env['rack.session.options'][:expire_after] = expiry_s
end
+
+ def send_rate_limited?(user)
+ Gitlab::ApplicationRateLimiter.peek(:email_verification_code_send, scope: user)
+ end
+
+ def obfuscated_email(email)
+ regex = ::Gitlab::UntrustedRegexp.new('^(..?)(.*)(@.?)(.*)(\..*)$')
+ match = regex.match(email)
+ return email unless match
+
+ match[1] + '*' * match[2].length + match[3] + '*' * match[4].length + match[5]
+ end
end
diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb
index 6f15cc7f4ec..ef79e2bc86f 100644
--- a/app/helpers/sorting_helper.rb
+++ b/app/helpers/sorting_helper.rb
@@ -254,6 +254,7 @@ module SortingHelper
options = [
{ value: sort_value_priority, text: sort_title_priority, href: page_filter_path(sort: sort_value_priority) },
{ value: sort_value_created_date, text: sort_title_created_date, href: page_filter_path(sort: sort_value_created_date) },
+ { value: sort_value_closed_date, text: sort_title_closed_date, href: page_filter_path(sort: sort_value_closed_date) },
{ value: sort_value_recently_updated, text: sort_title_recently_updated, href: page_filter_path(sort: sort_value_recently_updated) },
{ value: sort_value_milestone, text: sort_title_milestone, href: page_filter_path(sort: sort_value_milestone) }
]
@@ -261,7 +262,7 @@ module SortingHelper
options.concat([due_date_option]) if viewing_issues
options.concat([popularity_option, label_priority_option])
- options.concat([merged_option, closed_option]) if viewing_merge_requests
+ options.concat([merged_option]) if viewing_merge_requests
options.concat([relative_position_option]) if viewing_issues
options.concat([title_option])
@@ -287,10 +288,6 @@ module SortingHelper
{ value: sort_value_merged_date, text: sort_title_merged_date, href: page_filter_path(sort: sort_value_merged_date) }
end
- def closed_option
- { value: sort_value_closed_date, text: sort_title_closed_date, href: page_filter_path(sort: sort_value_closed_date) }
- end
-
def relative_position_option
{ value: sort_value_relative_position, text: sort_title_relative_position, href: page_filter_path(sort: sort_value_relative_position) }
end
diff --git a/app/helpers/storage_helper.rb b/app/helpers/storage_helper.rb
index 38ae9b5b634..ca81d5af4af 100644
--- a/app/helpers/storage_helper.rb
+++ b/app/helpers/storage_helper.rb
@@ -27,10 +27,11 @@ module StorageHelper
def storage_enforcement_banner_info(namespace)
root_ancestor = namespace.root_ancestor
- return unless can?(current_user, :admin_namespace, root_ancestor)
+ return unless can?(current_user, :maintain_namespace, root_ancestor)
return if root_ancestor.paid?
return unless future_enforcement_date?(root_ancestor)
return if user_dismissed_storage_enforcement_banner?(root_ancestor)
+ return unless ::Feature.enabled?(:namespace_storage_limit_show_preenforcement_banner, root_ancestor)
{
text: html_escape_once(s_("UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. " \
diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb
index 8529959f73c..f87125af07d 100644
--- a/app/helpers/todos_helper.rb
+++ b/app/helpers/todos_helper.rb
@@ -66,7 +66,13 @@ module TodosHelper
return _('design') if todo.for_design?
return _('alert') if todo.for_alert?
- todo.target_type.titleize.downcase
+ target_type = if todo.for_issue_or_work_item?
+ todo.target.issue_type
+ else
+ todo.target_type
+ end
+
+ target_type.titleize.downcase
end
def todo_target_path(todo)
@@ -80,6 +86,9 @@ module TodosHelper
todos_design_path(todo, path_options)
elsif todo.for_alert?
details_project_alert_management_path(todo.project, todo.target)
+ elsif todo.for_issue_or_work_item?
+ path_options[:only_path] = true
+ Gitlab::UrlBuilder.build(todo.target, **path_options)
else
path = [todo.resource_parent, todo.target]
diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb
index 2fef4ae98a9..370dbb10462 100644
--- a/app/helpers/tree_helper.rb
+++ b/app/helpers/tree_helper.rb
@@ -58,14 +58,6 @@ module TreeHelper
"#{username}-#{ref}-patch-#{epoch}"
end
- def tree_edit_project(project = @project)
- if can?(current_user, :push_code, project)
- project
- elsif current_user && current_user.already_forked?(project)
- current_user.fork_of(project)
- end
- end
-
def edit_in_new_fork_notice_now
_("You're not allowed to make changes to this project directly. "\
"A fork of this project is being created that you can make changes in, so you can submit a merge request.")
@@ -111,16 +103,6 @@ module TreeHelper
end
end
- def up_dir_path
- file = File.join(@path, "..")
- tree_join(@ref, file)
- end
-
- # returns the relative path of the first subdir that doesn't have only one directory descendant
- def flatten_tree(root_path, tree)
- tree.flat_path.sub(%r{\A#{Regexp.escape(root_path)}/}, '')
- end
-
def selected_branch
@branch_name || tree_edit_branch
end
diff --git a/app/helpers/users/callouts_helper.rb b/app/helpers/users/callouts_helper.rb
index b8231b02ac1..3dd6b3f4a80 100644
--- a/app/helpers/users/callouts_helper.rb
+++ b/app/helpers/users/callouts_helper.rb
@@ -9,9 +9,9 @@ module Users
FEATURE_FLAGS_NEW_VERSION = 'feature_flags_new_version'
REGISTRATION_ENABLED_CALLOUT = 'registration_enabled_callout'
UNFINISHED_TAG_CLEANUP_CALLOUT = 'unfinished_tag_cleanup_callout'
- MINUTE_LIMIT_BANNER = 'minute_limit_banner'
SECURITY_NEWSLETTER_CALLOUT = 'security_newsletter_callout'
REGISTRATION_ENABLED_CALLOUT_ALLOWED_CONTROLLER_PATHS = [/^root/, /^dashboard\S*/, /^admin\S*/].freeze
+ WEB_HOOK_DISABLED = 'web_hook_disabled'
def show_gke_cluster_integration_callout?(project)
active_nav_link?(controller: sidebar_operations_paths) &&
@@ -61,16 +61,31 @@ module Users
!user_dismissed?(SECURITY_NEWSLETTER_CALLOUT)
end
- def minute_limit_banner_dismissed?
- user_dismissed?(MINUTE_LIMIT_BANNER)
+ def web_hook_disabled_dismissed?(project)
+ return false unless project
+
+ last_failure = Gitlab::Redis::SharedState.with do |redis|
+ key = "web_hooks:last_failure:project-#{project.id}"
+ redis.get(key)
+ end
+
+ last_failure = DateTime.parse(last_failure) if last_failure
+
+ user_dismissed?(WEB_HOOK_DISABLED, last_failure, namespace: project.namespace)
end
private
- def user_dismissed?(feature_name, ignore_dismissal_earlier_than = nil)
+ def user_dismissed?(feature_name, ignore_dismissal_earlier_than = nil, namespace: nil)
return false unless current_user
- current_user.dismissed_callout?(feature_name: feature_name, ignore_dismissal_earlier_than: ignore_dismissal_earlier_than)
+ query = { feature_name: feature_name, ignore_dismissal_earlier_than: ignore_dismissal_earlier_than }
+
+ if namespace
+ current_user.dismissed_callout_for_namespace?(namespace: namespace, **query)
+ else
+ current_user.dismissed_callout?(**query)
+ end
end
end
end
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index e46aa6a446c..4ea2512bc67 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -15,7 +15,7 @@ module UsersHelper
end
def user_email_help_text(user)
- return 'We also use email for avatar detection if no avatar is uploaded' unless user.unconfirmed_email.present?
+ return 'We also use email for avatar detection if no avatar is uploaded.' unless user.unconfirmed_email.present?
confirmation_link = link_to 'Resend confirmation e-mail', user_confirmation_path(user: { email: @user.unconfirmed_email }), method: :post
diff --git a/app/helpers/visibility_level_helper.rb b/app/helpers/visibility_level_helper.rb
index b49bd33a30b..1baeeda0ef7 100644
--- a/app/helpers/visibility_level_helper.rb
+++ b/app/helpers/visibility_level_helper.rb
@@ -126,7 +126,7 @@ module VisibilityLevelHelper
def project_visibility_level_description(level)
case level
when Gitlab::VisibilityLevel::PRIVATE
- _("Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group.")
+ _("Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group.")
when Gitlab::VisibilityLevel::INTERNAL
_("The project can be accessed by any logged in user except external users.")
when Gitlab::VisibilityLevel::PUBLIC
diff --git a/app/helpers/web_hooks/web_hooks_helper.rb b/app/helpers/web_hooks/web_hooks_helper.rb
new file mode 100644
index 00000000000..95122750c2f
--- /dev/null
+++ b/app/helpers/web_hooks/web_hooks_helper.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module WebHooks
+ module WebHooksHelper
+ EXPIRY_TTL = 1.hour
+
+ def show_project_hook_failed_callout?(project:)
+ return false unless current_user
+ return false unless Feature.enabled?(:webhooks_failed_callout, project)
+ return false unless Feature.enabled?(:web_hooks_disable_failed, project)
+ return false unless Ability.allowed?(current_user, :read_web_hooks, project)
+
+ # Assumes include of Users::CalloutsHelper
+ return false if web_hook_disabled_dismissed?(project)
+
+ any_project_hook_failed?(project) # Most expensive query last
+ end
+
+ private
+
+ def any_project_hook_failed?(project)
+ Rails.cache.fetch("any_web_hook_failed:#{project.id}", expires_in: EXPIRY_TTL) do
+ ProjectHook.for_projects(project).disabled.exists?
+ end
+ end
+ end
+end
diff --git a/app/mailers/emails/admin_notification.rb b/app/mailers/emails/admin_notification.rb
index f44dd448a35..9d02d4132a1 100644
--- a/app/mailers/emails/admin_notification.rb
+++ b/app/mailers/emails/admin_notification.rb
@@ -16,11 +16,16 @@ module Emails
mail to: email, subject: "Unsubscribed from GitLab administrator notifications"
end
- def user_auto_banned_email(admin_id, user_id, max_project_downloads:, within_seconds:)
+ def user_auto_banned_email(admin_id, user_id, max_project_downloads:, within_seconds:, group: nil)
admin = User.find(admin_id)
@user = User.find(user_id)
@max_project_downloads = max_project_downloads
@within_minutes = within_seconds / 60
+ @ban_scope = if group.present?
+ _('your group (%{group_name})' % { group_name: group.name })
+ else
+ _('your GitLab instance')
+ end
Gitlab::I18n.with_locale(admin.preferred_language) do
email_with_layout(
diff --git a/app/mailers/emails/identity_verification.rb b/app/mailers/emails/identity_verification.rb
new file mode 100644
index 00000000000..2fc8cae06fe
--- /dev/null
+++ b/app/mailers/emails/identity_verification.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Emails
+ module IdentityVerification
+ def verification_instructions_email(user_id, token:, expires_in:)
+ @token = token
+ @expires_in_minutes = expires_in
+ @password_link = edit_profile_password_url
+ @two_fa_link = help_page_url('user/profile/account/two_factor_authentication')
+
+ user = User.find(user_id)
+ email_with_layout(to: user.email, subject: s_('IdentityVerification|Verify your identity'))
+ end
+ end
+end
diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb
index 83d37a365de..6a2b447f4a0 100644
--- a/app/mailers/emails/merge_requests.rb
+++ b/app/mailers/emails/merge_requests.rb
@@ -15,15 +15,15 @@ module Emails
end
# existing_commits - an array containing the first and last commits
- def push_to_merge_request_email(recipient_id, merge_request_id, updated_by_user_id, reason = nil, new_commits: [], total_new_commits_count: nil, existing_commits: [], total_existing_commits_count: nil)
+ def push_to_merge_request_email(recipient_id, merge_request_id, updated_by_user_id, reason = nil, new_commits:, total_new_commits_count:, existing_commits:, total_existing_commits_count:)
setup_merge_request_mail(merge_request_id, recipient_id)
@new_commits = new_commits
- @total_new_commits_count = total_new_commits_count || @new_commits.length
+ @total_new_commits_count = total_new_commits_count
@total_stripped_new_commits_count = @total_new_commits_count - @new_commits.length
@existing_commits = existing_commits
- @total_existing_commits_count = total_existing_commits_count || @existing_commits.length
+ @total_existing_commits_count = total_existing_commits_count
@updated_by_user = User.find(updated_by_user_id)
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index b70ce1d3655..ed7681e595f 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -23,6 +23,7 @@ class Notify < ApplicationMailer
include Emails::ServiceDesk
include Emails::InProductMarketing
include Emails::AdminNotification
+ include Emails::IdentityVerification
helper TimeboxesHelper
helper MergeRequestsHelper
diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb
index 61456ef79c8..be8d96012cc 100644
--- a/app/mailers/previews/notify_preview.rb
+++ b/app/mailers/previews/notify_preview.rb
@@ -205,10 +205,18 @@ class NotifyPreview < ActionMailer::Preview
Notify.inactive_project_deletion_warning_email(project, user, '2022-04-22').message
end
- def user_auto_banned_email
+ def user_auto_banned_instance_email
::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600).message
end
+ def user_auto_banned_namespace_email
+ ::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600, group: group).message
+ end
+
+ def verification_instructions_email
+ Notify.verification_instructions_email(user.id, token: '123456', expires_in: 60).message
+ end
+
private
def project
@@ -239,6 +247,10 @@ class NotifyPreview < ActionMailer::Preview
@user ||= User.last
end
+ def group
+ @group ||= Group.last
+ end
+
def member
@member ||= Member.last
end
diff --git a/app/models/ability.rb b/app/models/ability.rb
index a185448d5ea..b15143c8c9c 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -26,6 +26,13 @@ class Ability
end
end
+ # A list of users that can read confidential notes in a project
+ def users_that_can_read_internal_notes(users, note_parent)
+ DeclarativePolicy.subject_scope do
+ users.select { |u| allowed?(u, :reporter_access, note_parent) }
+ end
+ end
+
# Returns an Array of Issues that can be read by the given user.
#
# issues - The issues to reduce down to those readable by the user.
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 6acdc02c799..17b46f929c3 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -28,6 +28,7 @@ class ApplicationSetting < ApplicationRecord
add_authentication_token_field :runners_registration_token, encrypted: -> { Feature.enabled?(:application_settings_tokens_optional_encryption) ? :optional : :required }
add_authentication_token_field :health_check_access_token
add_authentication_token_field :static_objects_external_storage_auth_token, encrypted: :required
+ add_authentication_token_field :error_tracking_access_token, encrypted: :required
belongs_to :self_monitoring_project, class_name: "Project", foreign_key: 'instance_administration_project_id'
belongs_to :push_rule
@@ -171,6 +172,11 @@ class ApplicationSetting < ApplicationRecord
validates :kroki_formats, json_schema: { filename: 'application_setting_kroki_formats' }
+ validates :metrics_method_call_threshold,
+ numericality: { greater_than_or_equal_to: 0 },
+ presence: true,
+ if: :prometheus_metrics_enabled
+
validates :plantuml_url,
presence: true,
if: :plantuml_enabled
@@ -393,6 +399,7 @@ class ApplicationSetting < ApplicationRecord
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
validates :packages_cleanup_package_file_worker_capacity,
+ :package_registry_cleanup_policies_worker_capacity,
allow_nil: false,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
@@ -589,6 +596,14 @@ class ApplicationSetting < ApplicationRecord
presence: true, length: { maximum: 255 },
if: :sentry_enabled?
+ validates :error_tracking_enabled,
+ inclusion: { in: [true, false], message: _('must be a boolean value') }
+ validates :error_tracking_api_url,
+ presence: true,
+ addressable_url: true,
+ length: { maximum: 255 },
+ if: :error_tracking_enabled?
+
validates :users_get_by_id_limit,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
validates :users_get_by_id_limit_allowlist,
@@ -653,6 +668,7 @@ class ApplicationSetting < ApplicationRecord
before_save :ensure_runners_registration_token
before_save :ensure_health_check_access_token
+ before_save :ensure_error_tracking_access_token
after_commit do
reset_memoized_terms
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index a89ea05fb62..e9a0a156121 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -217,6 +217,7 @@ module ApplicationSettingImplementation
user_show_add_ssh_key_message: true,
valid_runner_registrars: VALID_RUNNER_REGISTRAR_TYPES,
wiki_page_max_content_bytes: 50.megabytes,
+ package_registry_cleanup_policies_worker_capacity: 2,
container_registry_delete_tags_service_timeout: 250,
container_registry_expiration_policies_worker_capacity: 4,
container_registry_cleanup_tags_service_max_list_size: 200,
@@ -445,6 +446,10 @@ module ApplicationSettingImplementation
ensure_health_check_access_token!
end
+ def error_tracking_access_token
+ ensure_error_tracking_access_token!
+ end
+
def usage_ping_can_be_configured?
Settings.gitlab.usage_ping_enabled
end
diff --git a/app/models/authentication_event.rb b/app/models/authentication_event.rb
index 1e822629ba1..0ed197f32df 100644
--- a/app/models/authentication_event.rb
+++ b/app/models/authentication_event.rb
@@ -25,4 +25,9 @@ class AuthenticationEvent < ApplicationRecord
def self.providers
STATIC_PROVIDERS | Devise.omniauth_providers.map(&:to_s)
end
+
+ def self.initial_login_or_known_ip_address?(user, ip_address)
+ !where(user_id: user).exists? ||
+ where(user_id: user, ip_address: ip_address).success.exists?
+ end
end
diff --git a/app/models/awareness_session.rb b/app/models/awareness_session.rb
new file mode 100644
index 00000000000..a84a3454a27
--- /dev/null
+++ b/app/models/awareness_session.rb
@@ -0,0 +1,236 @@
+# frozen_string_literal: true
+
+# A Redis backed session store for real-time collaboration. A session is defined
+# by its documents and the users that join this session. An online user can have
+# two states within the session: "active" and "away".
+#
+# By design, session must eventually be cleaned up. If this doesn't happen
+# explicitly, all keys used within the session model must have an expiry
+# timestamp set.
+class AwarenessSession # rubocop:disable Gitlab/NamespacedClass
+ # An awareness session expires automatically after 1 hour of no activity
+ SESSION_LIFETIME = 1.hour
+ private_constant :SESSION_LIFETIME
+
+ # Expire user awareness keys after some time of inactivity
+ USER_LIFETIME = 1.hour
+ private_constant :USER_LIFETIME
+
+ PRESENCE_LIFETIME = 10.minutes
+ private_constant :PRESENCE_LIFETIME
+
+ KEY_NAMESPACE = "gitlab:awareness"
+ private_constant :KEY_NAMESPACE
+
+ class << self
+ def for(value = nil)
+ # Creates a unique value for situations where we have no unique value to
+ # create a session with. This could be when creating a new issue, a new
+ # merge request, etc.
+ value = SecureRandom.uuid unless value.present?
+
+ # We use SHA-256 based session identifiers (similar to abbreviated git
+ # hashes). There is always a chance for Hash collisions (birthday
+ # problem), we therefore have to pick a good tradeoff between the amount
+ # of data stored and the probability of a collision.
+ #
+ # The approximate probability for a collision can be calculated:
+ #
+ # p ~= n^2 / 2m
+ # ~= (2^18)^2 / (2 * 16^15)
+ # ~= 2^36 / 2^61
+ #
+ # n is the number of awareness sessions and m the number of possibilities
+ # for each item. For a hex number, this is 16^c, where c is the number of
+ # characters. With 260k (~2^18) sessions, the probability for a collision
+ # is ~2^-25.
+ #
+ # The number of 15 is selected carefully. The integer representation fits
+ # nicely into a signed 64 bit integer and eventually allows Redis to
+ # optimize its memory usage. 16 chars would exceed the space for
+ # this datatype.
+ id = Digest::SHA256.hexdigest(value.to_s)[0, 15]
+
+ AwarenessSession.new(id)
+ end
+ end
+
+ def initialize(id)
+ @id = id
+ end
+
+ def join(user)
+ user_key = user_sessions_key(user.id)
+
+ with_redis do |redis|
+ redis.pipelined do |pipeline|
+ pipeline.sadd(user_key, id_i)
+ pipeline.expire(user_key, USER_LIFETIME.to_i)
+
+ pipeline.zadd(users_key, timestamp.to_f, user.id)
+
+ # We also mark for expiry when a session key is created (first user joins),
+ # because some users might never actively leave a session and the key could
+ # therefore become stale, w/o us noticing.
+ reset_session_expiry(pipeline)
+ end
+ end
+
+ nil
+ end
+
+ def leave(user)
+ user_key = user_sessions_key(user.id)
+
+ with_redis do |redis|
+ redis.pipelined do |pipeline|
+ pipeline.srem(user_key, id_i)
+ pipeline.zrem(users_key, user.id)
+ end
+
+ # cleanup orphan sessions and users
+ #
+ # this needs to be a second pipeline due to the delete operations being
+ # dependent on the result of the cardinality checks
+ user_sessions_count, session_users_count = redis.pipelined do |pipeline|
+ pipeline.scard(user_key)
+ pipeline.zcard(users_key)
+ end
+
+ redis.pipelined do |pipeline|
+ pipeline.del(user_key) unless user_sessions_count > 0
+
+ unless session_users_count > 0
+ pipeline.del(users_key)
+ @id = nil
+ end
+ end
+ end
+
+ nil
+ end
+
+ def present?(user, threshold: PRESENCE_LIFETIME)
+ with_redis do |redis|
+ user_timestamp = redis.zscore(users_key, user.id)
+ break false unless user_timestamp.present?
+
+ timestamp - user_timestamp < threshold
+ end
+ end
+
+ def away?(user, threshold: PRESENCE_LIFETIME)
+ !present?(user, threshold: threshold)
+ end
+
+ # Updates the last_activity timestamp for a user in this session
+ def touch!(user)
+ with_redis do |redis|
+ redis.pipelined do |pipeline|
+ pipeline.zadd(users_key, timestamp.to_f, user.id)
+
+ # extend the session lifetime due to user activity
+ reset_session_expiry(pipeline)
+ end
+ end
+
+ nil
+ end
+
+ def size
+ with_redis do |redis|
+ redis.zcard(users_key)
+ end
+ end
+
+ def to_param
+ id&.to_s
+ end
+
+ def to_s
+ "awareness_session=#{id}"
+ end
+
+ def online_users_with_last_activity(threshold: PRESENCE_LIFETIME)
+ users_with_last_activity.filter do |_user, last_activity|
+ user_online?(last_activity, threshold: threshold)
+ end
+ end
+
+ def users
+ User.where(id: user_ids)
+ end
+
+ def users_with_last_activity
+ # where in (x, y, [...z]) is a set and does not maintain any order, we need
+ # to make sure to establish a stable order for both, the pairs returned from
+ # redis and the ActiveRecord query. Using IDs in ascending order.
+ user_ids, last_activities = user_ids_with_last_activity
+ .sort_by(&:first)
+ .transpose
+
+ return [] if user_ids.blank?
+
+ users = User.where(id: user_ids).order(id: :asc)
+ users.zip(last_activities)
+ end
+
+ private
+
+ attr_reader :id
+
+ def user_online?(last_activity, threshold:)
+ last_activity.to_i + threshold.to_i > Time.zone.now.to_i
+ end
+
+ # converts session id from hex to integer representation
+ def id_i
+ Integer(id, 16) if id.present?
+ end
+
+ def users_key
+ "#{KEY_NAMESPACE}:session:#{id}:users"
+ end
+
+ def user_sessions_key(user_id)
+ "#{KEY_NAMESPACE}:user:#{user_id}:sessions"
+ end
+
+ def with_redis
+ Gitlab::Redis::SharedState.with do |redis|
+ yield redis if block_given?
+ end
+ end
+
+ def timestamp
+ Time.now.to_i
+ end
+
+ def user_ids
+ with_redis do |redis|
+ redis.zrange(users_key, 0, -1)
+ end
+ end
+
+ # Returns an array of tuples, where the first element in the tuple represents
+ # the user ID and the second part the last_activity timestamp.
+ def user_ids_with_last_activity
+ pairs = with_redis do |redis|
+ redis.zrange(users_key, 0, -1, with_scores: true)
+ end
+
+ # map data type of score (float) to Time
+ pairs.map do |user_id, score|
+ [user_id, Time.zone.at(score.to_i)]
+ end
+ end
+
+ # We want sessions to cleanup automatically after a certain period of
+ # inactivity. This sets the expiry timestamp for this session to
+ # [SESSION_LIFETIME].
+ def reset_session_expiry(redis)
+ redis.expire(users_key, SESSION_LIFETIME)
+
+ nil
+ end
+end
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index e35198ba31f..7f9697d0424 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -2,6 +2,7 @@
module Ci
class Build < Ci::Processable
+ prepend Ci::BulkInsertableTags
include Ci::Metadatable
include Ci::Contextable
include TokenAuthenticatable
@@ -14,8 +15,6 @@ module Ci
extend ::Gitlab::Utils::Override
- BuildArchivedError = Class.new(StandardError)
-
belongs_to :project, inverse_of: :builds
belongs_to :runner
belongs_to :trigger_request
@@ -30,10 +29,6 @@ module Ci
return_exit_code: -> (build) { build.exit_codes_defined? }
}.freeze
- DEFAULT_RETRIES = {
- scheduler_failure: 2
- }.freeze
-
DEGRADATION_THRESHOLD_VARIABLE_NAME = 'DEGRADATION_THRESHOLD'
RUNNERS_STATUS_CACHE_EXPIRATION = 1.minute
@@ -172,7 +167,6 @@ module Ci
end
scope :with_artifacts_not_expired, -> { with_downloadable_artifacts.where('artifacts_expire_at IS NULL OR artifacts_expire_at > ?', Time.current) }
- scope :with_expired_artifacts, -> { with_downloadable_artifacts.where('artifacts_expire_at < ?', Time.current) }
scope :with_pipeline_locked_artifacts, -> { joins(:pipeline).where('pipeline.locked': Ci::Pipeline.lockeds[:artifacts_locked]) }
scope :last_month, -> { where('created_at > ?', Date.today - 1.month) }
scope :manual_actions, -> { where(when: :manual, status: COMPLETED_STATUSES + %i[manual]) }
@@ -187,13 +181,6 @@ module Ci
joins(:metadata).where("ci_builds_metadata.config_options -> 'artifacts' -> 'reports' ?| array[:job_types]", job_types: job_types)
end
- scope :queued_before, ->(time) { where(arel_table[:queued_at].lt(time)) }
-
- scope :preload_project_and_pipeline_project, -> do
- preload(Ci::Pipeline::PROJECT_ROUTE_AND_NAMESPACE_ROUTE,
- pipeline: Ci::Pipeline::PROJECT_ROUTE_AND_NAMESPACE_ROUTE)
- end
-
scope :with_coverage, -> { where.not(coverage: nil) }
scope :without_coverage, -> { where(coverage: nil) }
scope :with_coverage_regex, -> { where.not(coverage_regex: nil) }
@@ -207,7 +194,7 @@ module Ci
after_save :stick_build_if_status_changed
after_create unless: :importing? do |build|
- run_after_commit { BuildHooksWorker.perform_async(build.id) }
+ run_after_commit { BuildHooksWorker.perform_async(build) }
end
class << self
@@ -217,10 +204,6 @@ module Ci
ActiveModel::Name.new(self, nil, 'job')
end
- def first_pending
- pending.unstarted.order('created_at ASC').first
- end
-
def with_preloads
preload(:job_artifacts_archive, :job_artifacts, :tags, project: [:namespace])
end
@@ -302,7 +285,7 @@ module Ci
build.run_after_commit do
BuildQueueWorker.perform_async(id)
- BuildHooksWorker.perform_async(id)
+ BuildHooksWorker.perform_async(build)
end
end
@@ -330,7 +313,7 @@ module Ci
build.run_after_commit do
build.ensure_persistent_ref
- BuildHooksWorker.perform_async(id)
+ BuildHooksWorker.perform_async(build)
end
end
@@ -338,11 +321,7 @@ module Ci
build.run_after_commit do
build.run_status_commit_hooks!
- if Feature.enabled?(:ci_build_finished_worker_namespace_changed, build.project)
- Ci::BuildFinishedWorker.perform_async(id)
- else
- ::BuildFinishedWorker.perform_async(id)
- end
+ Ci::BuildFinishedWorker.perform_async(id)
end
end
@@ -446,10 +425,6 @@ module Ci
true
end
- def save_tags
- super unless Thread.current['ci_bulk_insert_tags']
- end
-
def archived?
return true if degenerated?
@@ -556,10 +531,6 @@ module Ci
self.options.dig(:environment, :deployment_tier) if self.options
end
- def outdated_deployment?
- success? && !deployment.try(:last?)
- end
-
def triggered_by?(current_user)
user == current_user
end
@@ -1162,6 +1133,14 @@ module Ci
Gitlab::Utils::UsageData.track_usage_event('ci_users_executing_deployment_job', user_id) if user_id.present? && count_user_deployment?
end
+ def track_verify_usage
+ Gitlab::Utils::UsageData.track_usage_event('ci_users_executing_verify_environment_job', user_id) if user_id.present? && count_user_verification?
+ end
+
+ def count_user_verification?
+ has_environment? && environment_action == 'verify'
+ end
+
def each_report(report_types)
job_artifacts_for_types(report_types).each do |report_artifact|
report_artifact.each_blob do |blob|
diff --git a/app/models/ci/build_report_result.rb b/app/models/ci/build_report_result.rb
index 2c08fc4c8bf..b674c1b1a0e 100644
--- a/app/models/ci/build_report_result.rb
+++ b/app/models/ci/build_report_result.rb
@@ -39,9 +39,5 @@ module Ci
def suite_error
tests.dig("suite_error")
end
-
- def tests_total
- [tests_success, tests_failed, tests_errored, tests_skipped].sum
- end
end
end
diff --git a/app/models/ci/group.rb b/app/models/ci/group.rb
index e5cb2026503..0105366d99b 100644
--- a/app/models/ci/group.rb
+++ b/app/models/ci/group.rb
@@ -50,8 +50,7 @@ module Ci
def status_struct
strong_memoize(:status_struct) do
- Gitlab::Ci::Status::Composite
- .new(@jobs, project: project)
+ Gitlab::Ci::Status::Composite.new(@jobs)
end
end
diff --git a/app/models/ci/group_variable.rb b/app/models/ci/group_variable.rb
index 0af5533613f..e11edbda6dc 100644
--- a/app/models/ci/group_variable.rb
+++ b/app/models/ci/group_variable.rb
@@ -19,5 +19,9 @@ module Ci
scope :unprotected, -> { where(protected: false) }
scope :by_environment_scope, -> (environment_scope) { where(environment_scope: environment_scope) }
scope :for_groups, ->(group_ids) { where(group_id: group_ids) }
+
+ def audit_details
+ key
+ end
end
end
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index 81943cfa651..ee7175a4f69 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -322,7 +322,7 @@ module Ci
def expire_in=(value)
self.expire_at =
if value
- ::Gitlab::Ci::Build::Artifacts::ExpireInParser.new(value).seconds_from_now
+ ::Gitlab::Ci::Build::DurationParser.new(value).seconds_from_now
end
end
diff --git a/app/models/ci/legacy_stage.rb b/app/models/ci/legacy_stage.rb
deleted file mode 100644
index ffd3d3fcd88..00000000000
--- a/app/models/ci/legacy_stage.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-# frozen_string_literal: true
-
-module Ci
- # Currently this is artificial object, constructed dynamically
- # We should migrate this object to actual database record in the future
- class LegacyStage
- include StaticModel
- include Presentable
-
- attr_reader :pipeline, :name
-
- delegate :project, to: :pipeline
-
- def initialize(pipeline, name:, status: nil, warnings: nil)
- @pipeline = pipeline
- @name = name
- @status = status
- # support ints and booleans
- @has_warnings = ActiveRecord::Type::Boolean.new.cast(warnings)
- end
-
- def groups
- @groups ||= Ci::Group.fabricate(project, self)
- end
-
- def to_param
- name
- end
-
- def statuses_count
- @statuses_count ||= statuses.count
- end
-
- def status
- @status ||= statuses.latest.composite_status(project: project)
- end
-
- def detailed_status(current_user)
- Gitlab::Ci::Status::Stage::Factory
- .new(self, current_user)
- .fabricate!
- end
-
- def latest_statuses
- statuses.ordered.latest
- end
-
- def statuses
- @statuses ||= pipeline.statuses.where(stage: name)
- end
-
- def builds
- @builds ||= pipeline.builds.where(stage: name)
- end
-
- def success?
- status.to_s == 'success'
- end
-
- def has_warnings?
- # lazilly calculate the warnings
- if @has_warnings.nil?
- @has_warnings = statuses.latest.failed_but_allowed.any?
- end
-
- @has_warnings
- end
-
- def manual_playable?
- %[manual scheduled skipped].include?(status.to_s)
- end
- end
-end
diff --git a/app/models/ci/pending_build.rb b/app/models/ci/pending_build.rb
index d900a056242..0fa6a234a3d 100644
--- a/app/models/ci/pending_build.rb
+++ b/app/models/ci/pending_build.rb
@@ -30,10 +30,6 @@ module Ci
self.upsert(entry.attributes.compact, returning: %w[build_id], unique_by: :build_id)
end
- def maintain_denormalized_data?
- ::Feature.enabled?(:ci_pending_builds_maintain_denormalized_data)
- end
-
private
def args_from_build(build)
@@ -43,13 +39,13 @@ module Ci
build: build,
project: project,
protected: build.protected?,
- namespace: project.namespace
+ namespace: project.namespace,
+ tag_ids: build.tags_ids,
+ instance_runners_enabled: shared_runners_enabled?(project)
}
- if maintain_denormalized_data?
- args.store(:tag_ids, build.tags_ids)
- args.store(:instance_runners_enabled, shared_runners_enabled?(project))
- args.store(:namespace_traversal_ids, project.namespace.traversal_ids) if group_runners_enabled?(project)
+ if group_runners_enabled?(project)
+ args.store(:namespace_traversal_ids, project.namespace.traversal_ids)
end
args
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 5d316906bd3..78b55680b5e 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -27,8 +27,6 @@ module Ci
DEFAULT_CONFIG_PATH = CONFIG_EXTENSION
CANCELABLE_STATUSES = (Ci::HasStatus::CANCELABLE_STATUSES + ['manual']).freeze
- BridgeStatusError = Class.new(StandardError)
-
paginates_per 15
sha_attribute :source_sha
@@ -133,6 +131,7 @@ module Ci
validates :source, exclusion: { in: %w(unknown), unless: :importing? }, on: :create
after_create :keep_around_commits, unless: :importing?
+ after_find :observe_age_in_minutes, unless: :importing?
use_fast_destroy :job_artifacts
use_fast_destroy :build_trace_chunks
@@ -241,6 +240,13 @@ module Ci
pipeline.run_after_commit do
unless pipeline.user&.blocked?
+ Gitlab::AppLogger.info(
+ message: "Enqueuing hooks for Pipeline #{pipeline.id}: #{pipeline.status}",
+ class: self.class.name,
+ pipeline_id: pipeline.id,
+ project_id: pipeline.project_id,
+ pipeline_status: pipeline.status)
+
PipelineHooksWorker.perform_async(pipeline.id)
end
@@ -332,8 +338,8 @@ module Ci
scope :for_id, -> (id) { where(id: id) }
scope :for_iid, -> (iid) { where(iid: iid) }
scope :for_project, -> (project_id) { where(project_id: project_id) }
- scope :created_after, -> (time) { where('ci_pipelines.created_at > ?', time) }
- scope :created_before_id, -> (id) { where('ci_pipelines.id < ?', id) }
+ scope :created_after, -> (time) { where(arel_table[:created_at].gt(time)) }
+ scope :created_before_id, -> (id) { where(arel_table[:id].lt(id)) }
scope :before_pipeline, -> (pipeline) { created_before_id(pipeline.id).outside_pipeline_family(pipeline) }
scope :with_pipeline_source, -> (source) { where(source: source) }
@@ -490,40 +496,16 @@ module Ci
.pluck(:stage, :stage_idx).map(&:first)
end
- def legacy_stage(name)
- stage = Ci::LegacyStage.new(self, name: name)
- stage unless stage.statuses_count == 0
- end
-
def ref_exists?
project.repository.ref_exists?(git_ref)
rescue Gitlab::Git::Repository::NoRepository
false
end
- def legacy_stages_using_composite_status
- stages = latest_statuses_ordered_by_stage.group_by(&:stage)
-
- stages.map do |stage_name, jobs|
- composite_status = Gitlab::Ci::Status::Composite
- .new(jobs)
-
- Ci::LegacyStage.new(self,
- name: stage_name,
- status: composite_status.status,
- warnings: composite_status.warnings?)
- end
- end
-
def triggered_pipelines_with_preloads
triggered_pipelines.preload(:source_job)
end
- # TODO: Remove usage of this method in templates
- def legacy_stages
- legacy_stages_using_composite_status
- end
-
def valid_commit_sha
if self.sha == Gitlab::Git::BLANK_SHA
self.errors.add(:sha, " cant be 00000000 (branch removal)")
@@ -1004,6 +986,10 @@ module Ci
object_hierarchy(project_condition: :same).base_and_descendants
end
+ def self_and_descendants_complete?
+ self_and_descendants.all?(&:complete?)
+ end
+
# Follow the parent-child relationships and return the top-level parent
def root_ancestor
return self unless child?
@@ -1078,7 +1064,11 @@ module Ci
end
def has_reports?(reports_scope)
- complete? && latest_report_builds(reports_scope).exists?
+ if Feature.enabled?(:mr_show_reports_immediately, project, type: :development)
+ latest_report_builds(reports_scope).exists?
+ else
+ complete? && latest_report_builds(reports_scope).exists?
+ end
end
def has_coverage_reports?
@@ -1100,7 +1090,7 @@ module Ci
end
def test_reports
- Gitlab::Ci::Reports::TestReports.new.tap do |test_reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |test_reports|
latest_test_report_builds.find_each do |build|
build.collect_test_reports!(test_reports)
end
@@ -1222,6 +1212,10 @@ module Ci
Gitlab::Utils.slugify(source_ref.to_s)
end
+ def stage(name)
+ stages.find_by(name: name)
+ end
+
def find_stage_by_name!(name)
stages.find_by!(name: name)
end
@@ -1307,10 +1301,20 @@ module Ci
end
end
- def has_expired_test_reports?
- strong_memoize(:has_expired_test_reports) do
- has_reports?(::Ci::JobArtifact.test_reports.expired)
+ def has_test_reports?
+ strong_memoize(:has_test_reports) do
+ has_reports?(::Ci::JobArtifact.test_reports)
+ end
+ end
+
+ def age_in_minutes
+ return 0 unless persisted?
+
+ unless has_attribute?(:created_at)
+ raise ArgumentError, 'pipeline not fully loaded'
end
+
+ (Time.current - created_at).ceil / 60
end
private
@@ -1363,6 +1367,21 @@ module Ci
project.repository.keep_around(self.sha, self.before_sha)
end
+ def observe_age_in_minutes
+ return unless age_metric_enabled?
+ return unless persisted? && has_attribute?(:created_at)
+
+ ::Gitlab::Ci::Pipeline::Metrics
+ .pipeline_age_histogram
+ .observe({}, age_in_minutes)
+ end
+
+ def age_metric_enabled?
+ ::Gitlab::SafeRequestStore.fetch(:age_metric_enabled) do
+ ::Feature.enabled?(:ci_pipeline_age_histogram, type: :ops)
+ end
+ 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 = {})
diff --git a/app/models/ci/pipeline_artifact.rb b/app/models/ci/pipeline_artifact.rb
index 2284a05bcc9..cdc3d69f754 100644
--- a/app/models/ci/pipeline_artifact.rb
+++ b/app/models/ci/pipeline_artifact.rb
@@ -51,6 +51,23 @@ module Ci
def find_by_file_type(file_type)
find_by(file_type: file_type)
end
+
+ def create_or_replace_for_pipeline!(pipeline:, file_type:, file:, size:)
+ transaction do
+ pipeline.pipeline_artifacts.find_by_file_type(file_type)&.destroy!
+
+ pipeline.pipeline_artifacts.create!(
+ file_type: file_type,
+ project_id: pipeline.project_id,
+ size: size,
+ file: file,
+ file_format: REPORT_TYPES[file_type],
+ expire_at: EXPIRATION_DATE.from_now
+ )
+ end
+ rescue ActiveRecord::ActiveRecordError => err
+ Gitlab::ErrorTracking.track_and_raise_exception(err, { pipeline_id: pipeline.id, file_type: file_type })
+ end
end
def present
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 61194c9b7d1..f41ad890184 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -2,6 +2,7 @@
module Ci
class Runner < Ci::ApplicationRecord
+ prepend Ci::BulkInsertableTags
include Gitlab::SQL::Pattern
include RedisCacheable
include ChronicDurationAttribute
@@ -14,6 +15,8 @@ module Ci
include Presentable
include EachBatch
+ ignore_column :semver, remove_with: '15.3', remove_after: '2022-07-22'
+
add_authentication_token_field :token, encrypted: :optional, expires_at: :compute_token_expiration, expiration_enforced?: :token_expiration_enforced?
enum access_level: {
@@ -75,9 +78,9 @@ module Ci
has_many :groups, through: :runner_namespaces, disable_joins: true
has_one :last_build, -> { order('id DESC') }, class_name: 'Ci::Build'
+ has_one :runner_version, primary_key: :version, foreign_key: :version, class_name: 'Ci::RunnerVersion'
before_save :ensure_token
- before_save :update_semver, if: -> { version_changed? }
scope :active, -> (value = true) { where(active: value) }
scope :paused, -> { active(false) }
@@ -430,7 +433,6 @@ module Ci
values = values&.slice(:version, :revision, :platform, :architecture, :ip_address, :config, :executor) || {}
values[:contacted_at] = Time.current
values[:executor_type] = EXECUTOR_NAME_TO_TYPES.fetch(values.delete(:executor), :unknown)
- values[:semver] = semver_from_version(values[:version])
cache_attributes(values)
@@ -451,16 +453,6 @@ module Ci
read_attribute(:contacted_at)
end
- def semver_from_version(version)
- parsed_runner_version = ::Gitlab::VersionInfo.parse(version)
-
- parsed_runner_version.valid? ? parsed_runner_version.to_s : nil
- end
-
- def update_semver
- self.semver = semver_from_version(self.version)
- end
-
def namespace_ids
strong_memoize(:namespace_ids) do
runner_namespaces.pluck(:namespace_id).compact
@@ -484,6 +476,10 @@ module Ci
private
+ scope :with_upgrade_status, ->(upgrade_status) do
+ Ci::Runner.joins(:runner_version).where(runner_version: { status: upgrade_status })
+ end
+
EXECUTOR_NAME_TO_TYPES = {
'unknown' => :unknown,
'custom' => :custom,
diff --git a/app/models/ci/runner_version.rb b/app/models/ci/runner_version.rb
new file mode 100644
index 00000000000..6b2d0060c9b
--- /dev/null
+++ b/app/models/ci/runner_version.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Ci
+ class RunnerVersion < Ci::ApplicationRecord
+ include EachBatch
+ include EnumWithNil
+
+ enum_with_nil status: {
+ not_processed: nil,
+ invalid_version: -1,
+ unknown: 0,
+ not_available: 1,
+ available: 2,
+ recommended: 3
+ }
+
+ STATUS_DESCRIPTIONS = {
+ invalid_version: 'Runner version is not valid.',
+ unknown: 'Upgrade status is unknown.',
+ not_available: 'Upgrade is not available for the runner.',
+ available: 'Upgrade is available for the runner.',
+ recommended: 'Upgrade is available and recommended for the runner.'
+ }.freeze
+
+ # Override auto generated negative scope (from available) so the scope has expected behavior
+ scope :not_available, -> { where(status: :not_available) }
+
+ # This scope returns all versions that might need recalculating. For instance, once a version is considered
+ # :recommended, it normally doesn't change status even if the instance is upgraded
+ scope :potentially_outdated, -> { where(status: [nil, :not_available, :available, :unknown]) }
+
+ validates :version, length: { maximum: 2048 }
+ end
+end
diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index 8c4e97ac840..f03d1e96a4b 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -142,7 +142,7 @@ module Ci
end
def latest_stage_status
- statuses.latest.composite_status(project: project) || 'skipped'
+ statuses.latest.composite_status || 'skipped'
end
end
end
diff --git a/app/models/ci/trigger.rb b/app/models/ci/trigger.rb
index 5bf5ae51ec8..c4db4754c52 100644
--- a/app/models/ci/trigger.rb
+++ b/app/models/ci/trigger.rb
@@ -4,6 +4,9 @@ module Ci
class Trigger < Ci::ApplicationRecord
include Presentable
include Limitable
+ include IgnorableColumns
+
+ ignore_column :ref, remove_with: '15.4', remove_after: '2022-08-22'
self.limit_name = 'pipeline_triggers'
self.limit_scope = :project
diff --git a/app/models/ci/variable.rb b/app/models/ci/variable.rb
index 1e91f248fc4..c80c2ebe69a 100644
--- a/app/models/ci/variable.rb
+++ b/app/models/ci/variable.rb
@@ -18,5 +18,9 @@ module Ci
scope :unprotected, -> { where(protected: false) }
scope :by_environment_scope, -> (environment_scope) { where(environment_scope: environment_scope) }
+
+ def audit_details
+ key
+ end
end
end
diff --git a/app/models/clusters/agent.rb b/app/models/clusters/agent.rb
index fb12ce7d292..3478bb69707 100644
--- a/app/models/clusters/agent.rb
+++ b/app/models/clusters/agent.rb
@@ -53,3 +53,5 @@ module Clusters
end
end
end
+
+Clusters::Agent.prepend_mod_with('Clusters::Agent')
diff --git a/app/models/clusters/applications/elastic_stack.rb b/app/models/clusters/applications/elastic_stack.rb
deleted file mode 100644
index 73c731aab1a..00000000000
--- a/app/models/clusters/applications/elastic_stack.rb
+++ /dev/null
@@ -1,113 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Applications
- class ElasticStack < ApplicationRecord
- include ::Clusters::Concerns::ElasticsearchClient
-
- VERSION = '3.0.0'
-
- self.table_name = 'clusters_applications_elastic_stacks'
-
- include ::Clusters::Concerns::ApplicationCore
- include ::Clusters::Concerns::ApplicationStatus
- include ::Clusters::Concerns::ApplicationVersion
- include ::Clusters::Concerns::ApplicationData
-
- default_value_for :version, VERSION
-
- after_destroy do
- cluster&.find_or_build_integration_elastic_stack&.update(enabled: false, chart_version: nil)
- end
-
- state_machine :status do
- after_transition any => [:installed] do |application|
- application.cluster&.find_or_build_integration_elastic_stack&.update(enabled: true, chart_version: application.version)
- end
-
- after_transition any => [:uninstalled] do |application|
- application.cluster&.find_or_build_integration_elastic_stack&.update(enabled: false, chart_version: nil)
- end
- end
-
- def chart
- 'elastic-stack/elastic-stack'
- end
-
- def repository
- 'https://charts.gitlab.io'
- end
-
- def install_command
- helm_command_module::InstallCommand.new(
- name: 'elastic-stack',
- version: VERSION,
- rbac: cluster.platform_kubernetes_rbac?,
- chart: chart,
- repository: repository,
- files: files,
- preinstall: migrate_to_3_script,
- postinstall: post_install_script
- )
- end
-
- def uninstall_command
- helm_command_module::DeleteCommand.new(
- name: 'elastic-stack',
- rbac: cluster.platform_kubernetes_rbac?,
- files: files,
- postdelete: post_delete_script
- )
- end
-
- def files
- super.merge('wait-for-elasticsearch.sh': File.read("#{Rails.root}/vendor/elastic_stack/wait-for-elasticsearch.sh"))
- end
-
- def chart_above_v2?
- Gem::Version.new(version) >= Gem::Version.new('2.0.0')
- end
-
- def chart_above_v3?
- Gem::Version.new(version) >= Gem::Version.new('3.0.0')
- end
-
- private
-
- def service_name
- chart_above_v3? ? 'elastic-stack-elasticsearch-master' : 'elastic-stack-elasticsearch-client'
- end
-
- def pvc_selector
- chart_above_v3? ? "app=elastic-stack-elasticsearch-master" : "release=elastic-stack"
- end
-
- def post_install_script
- [
- "timeout 60 sh /data/helm/elastic-stack/config/wait-for-elasticsearch.sh http://elastic-stack-elasticsearch-master:9200"
- ]
- end
-
- def post_delete_script
- [
- Gitlab::Kubernetes::KubectlCmd.delete("pvc", "--selector", pvc_selector, "--namespace", Gitlab::Kubernetes::Helm::NAMESPACE)
- ]
- end
-
- def migrate_to_3_script
- return [] if !updating? || chart_above_v3?
-
- # Chart version 3.0.0 moves to our own chart at https://gitlab.com/gitlab-org/charts/elastic-stack
- # and is not compatible with pre-existing resources. We first remove them.
- [
- helm_command_module::DeleteCommand.new(
- name: 'elastic-stack',
- rbac: cluster.platform_kubernetes_rbac?,
- files: files
- ).delete_command,
- Gitlab::Kubernetes::KubectlCmd.delete("pvc", "--selector", "release=elastic-stack", "--namespace", Gitlab::Kubernetes::Helm::NAMESPACE)
- ]
- end
- end
- end
-end
diff --git a/app/models/clusters/cluster.rb b/app/models/clusters/cluster.rb
index 014f7530357..ad1e7dc305f 100644
--- a/app/models/clusters/cluster.rb
+++ b/app/models/clusters/cluster.rb
@@ -20,7 +20,6 @@ module Clusters
Clusters::Applications::Runner.application_name => Clusters::Applications::Runner,
Clusters::Applications::Jupyter.application_name => Clusters::Applications::Jupyter,
Clusters::Applications::Knative.application_name => Clusters::Applications::Knative,
- Clusters::Applications::ElasticStack.application_name => Clusters::Applications::ElasticStack,
Clusters::Applications::Cilium.application_name => Clusters::Applications::Cilium
}.freeze
DEFAULT_ENVIRONMENT = '*'
@@ -51,7 +50,6 @@ module Clusters
has_one :platform_kubernetes, class_name: 'Clusters::Platforms::Kubernetes', inverse_of: :cluster, autosave: true
has_one :integration_prometheus, class_name: 'Clusters::Integrations::Prometheus', inverse_of: :cluster
- has_one :integration_elastic_stack, class_name: 'Clusters::Integrations::ElasticStack', inverse_of: :cluster
def self.has_one_cluster_application(name) # rubocop:disable Naming/PredicateName
application = APPLICATIONS[name.to_s]
@@ -66,7 +64,6 @@ module Clusters
has_one_cluster_application :runner
has_one_cluster_application :jupyter
has_one_cluster_application :knative
- has_one_cluster_application :elastic_stack
has_one_cluster_application :cilium
has_many :kubernetes_namespaces
@@ -102,7 +99,6 @@ module Clusters
delegate :available?, to: :application_helm, prefix: true, allow_nil: true
delegate :available?, to: :application_ingress, prefix: true, allow_nil: true
delegate :available?, to: :application_knative, prefix: true, allow_nil: true
- delegate :available?, to: :integration_elastic_stack, prefix: true, allow_nil: true
delegate :available?, to: :integration_prometheus, prefix: true, allow_nil: true
delegate :external_ip, to: :application_ingress, prefix: true, allow_nil: true
delegate :external_hostname, to: :application_ingress, prefix: true, allow_nil: true
@@ -136,7 +132,6 @@ module Clusters
scope :gcp_installed, -> { gcp_provided.joins(:provider_gcp).merge(Clusters::Providers::Gcp.with_status(:created)) }
scope :aws_installed, -> { aws_provided.joins(:provider_aws).merge(Clusters::Providers::Aws.with_status(:created)) }
- scope :with_available_elasticstack, -> { joins(:application_elastic_stack).merge(::Clusters::Applications::ElasticStack.available) }
scope :distinct_with_deployed_environments, -> { joins(:environments).merge(::Deployment.success).distinct }
scope :managed, -> { where(managed: true) }
@@ -271,10 +266,6 @@ module Clusters
integration_prometheus || build_integration_prometheus
end
- def find_or_build_integration_elastic_stack
- integration_elastic_stack || build_integration_elastic_stack
- end
-
def provider
if gcp?
provider_gcp
@@ -309,18 +300,6 @@ module Clusters
platform_kubernetes&.kubeclient if kubernetes?
end
- def elastic_stack_adapter
- integration_elastic_stack
- end
-
- def elasticsearch_client
- elastic_stack_adapter&.elasticsearch_client
- end
-
- def elastic_stack_available?
- !!integration_elastic_stack_available?
- end
-
def kubernetes_namespace_for(environment, deployable: environment.last_deployable)
if deployable && environment.project_id != deployable.project_id
raise ArgumentError, 'environment.project_id must match deployable.project_id'
diff --git a/app/models/clusters/concerns/elasticsearch_client.rb b/app/models/clusters/concerns/elasticsearch_client.rb
deleted file mode 100644
index e9aab7897a8..00000000000
--- a/app/models/clusters/concerns/elasticsearch_client.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Concerns
- module ElasticsearchClient
- include ::Gitlab::Utils::StrongMemoize
-
- ELASTICSEARCH_PORT = 9200
- ELASTICSEARCH_NAMESPACE = 'gitlab-managed-apps'
-
- def elasticsearch_client(timeout: nil)
- strong_memoize(:elasticsearch_client) do
- kube_client = cluster&.kubeclient&.core_client
- next unless kube_client
-
- proxy_url = kube_client.proxy_url('service', service_name, ELASTICSEARCH_PORT, ELASTICSEARCH_NAMESPACE)
-
- Elasticsearch::Client.new(url: proxy_url, adapter: :net_http) do |faraday|
- # ensures headers containing auth data are appended to original client options
- faraday.headers.merge!(kube_client.headers)
- # ensure TLS certs are properly verified
- faraday.ssl[:verify] = kube_client.ssl_options[:verify_ssl]
- faraday.ssl[:cert_store] = kube_client.ssl_options[:cert_store]
- faraday.options.timeout = timeout unless timeout.nil?
- end
-
- rescue Kubeclient::HttpError => error
- # If users have mistakenly set parameters or removed the depended clusters,
- # `proxy_url` could raise an exception because gitlab can not communicate with the cluster.
- # We check for a nil client in downstream use and behaviour is equivalent to an empty state
- log_exception(error, :failed_to_create_elasticsearch_client)
-
- nil
- end
- end
- end
- end
-end
diff --git a/app/models/clusters/integrations/elastic_stack.rb b/app/models/clusters/integrations/elastic_stack.rb
deleted file mode 100644
index 97d73d252b9..00000000000
--- a/app/models/clusters/integrations/elastic_stack.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Integrations
- class ElasticStack < ApplicationRecord
- include ::Clusters::Concerns::ElasticsearchClient
- include ::Clusters::Concerns::KubernetesLogger
-
- self.table_name = 'clusters_integration_elasticstack'
- self.primary_key = :cluster_id
-
- belongs_to :cluster, class_name: 'Clusters::Cluster', foreign_key: :cluster_id
-
- validates :cluster, presence: true
- validates :enabled, inclusion: { in: [true, false] }
-
- scope :enabled, -> { where(enabled: true) }
-
- def available?
- enabled
- end
-
- def service_name
- chart_above_v3? ? 'elastic-stack-elasticsearch-master' : 'elastic-stack-elasticsearch-client'
- end
-
- def chart_above_v2?
- return true if chart_version.nil?
-
- Gem::Version.new(chart_version) >= Gem::Version.new('2.0.0')
- end
-
- def chart_above_v3?
- return true if chart_version.nil?
-
- Gem::Version.new(chart_version) >= Gem::Version.new('3.0.0')
- end
- end
- end
-end
diff --git a/app/models/clusters/integrations/prometheus.rb b/app/models/clusters/integrations/prometheus.rb
index 0d6177beae7..899529ff49f 100644
--- a/app/models/clusters/integrations/prometheus.rb
+++ b/app/models/clusters/integrations/prometheus.rb
@@ -55,23 +55,13 @@ module Clusters
private
def activate_project_integrations
- if Feature.enabled?(:rename_integrations_workers)
- ::Clusters::Applications::ActivateIntegrationWorker
- .perform_async(cluster_id, ::Integrations::Prometheus.to_param)
- else
- ::Clusters::Applications::ActivateServiceWorker
- .perform_async(cluster_id, ::Integrations::Prometheus.to_param)
- end
+ ::Clusters::Applications::ActivateIntegrationWorker
+ .perform_async(cluster_id, ::Integrations::Prometheus.to_param)
end
def deactivate_project_integrations
- if Feature.enabled?(:rename_integrations_workers)
- ::Clusters::Applications::DeactivateIntegrationWorker
- .perform_async(cluster_id, ::Integrations::Prometheus.to_param)
- else
- ::Clusters::Applications::DeactivateServiceWorker
- .perform_async(cluster_id, ::Integrations::Prometheus.to_param)
- end
+ ::Clusters::Applications::DeactivateIntegrationWorker
+ .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 ac9d8c39bd2..afe4927ee73 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -8,9 +8,12 @@ class CommitStatus < Ci::ApplicationRecord
include EnumWithNil
include BulkInsertableAssociations
include TaggableQueries
+ include IgnorableColumns
self.table_name = 'ci_builds'
+ ignore_column :token, remove_with: '15.4', remove_after: '2022-08-22'
+
belongs_to :user
belongs_to :project
belongs_to :pipeline, class_name: 'Ci::Pipeline', foreign_key: :commit_id
@@ -220,10 +223,6 @@ class CommitStatus < Ci::ApplicationRecord
false
end
- def self.bulk_insert_tags!(statuses)
- Gitlab::Ci::Tags::BulkInsert.new(statuses).insert!
- end
-
def locking_enabled?
will_save_change_to_status?
end
@@ -325,5 +324,3 @@ class CommitStatus < Ci::ApplicationRecord
script_failure? || missing_dependency_failure? || archived_failure? || scheduler_failure? || data_integrity_failure?
end
end
-
-CommitStatus.prepend_mod_with('CommitStatus')
diff --git a/app/models/concerns/awareness.rb b/app/models/concerns/awareness.rb
new file mode 100644
index 00000000000..da87d87e838
--- /dev/null
+++ b/app/models/concerns/awareness.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Awareness
+ extend ActiveSupport::Concern
+
+ KEY_NAMESPACE = "gitlab:awareness"
+ private_constant :KEY_NAMESPACE
+
+ def join(session)
+ session.join(self)
+
+ nil
+ end
+
+ def leave(session)
+ session.leave(self)
+
+ nil
+ end
+
+ def session_ids
+ with_redis do |redis|
+ redis
+ .smembers(user_sessions_key)
+ # converts session ids from (internal) integer to hex presentation
+ .map { |key| key.to_i.to_s(16) }
+ end
+ end
+
+ private
+
+ def user_sessions_key
+ "#{KEY_NAMESPACE}:user:#{id}:sessions"
+ end
+
+ def with_redis
+ Gitlab::Redis::SharedState.with do |redis|
+ yield redis if block_given?
+ end
+ end
+end
diff --git a/app/models/concerns/cache_markdown_field.rb b/app/models/concerns/cache_markdown_field.rb
index 99dbe464a7c..9ee0fd1db1d 100644
--- a/app/models/concerns/cache_markdown_field.rb
+++ b/app/models/concerns/cache_markdown_field.rb
@@ -172,7 +172,7 @@ module CacheMarkdownField
refs = all_references(self.author)
references = {}
- references[:mentioned_users_ids] = refs.mentioned_user_ids.presence
+ references[:mentioned_users_ids] = mentioned_filtered_user_ids_for(refs)
references[:mentioned_groups_ids] = refs.mentioned_group_ids.presence
references[:mentioned_projects_ids] = refs.mentioned_project_ids.presence
@@ -185,6 +185,13 @@ module CacheMarkdownField
true
end
+ # Overriden on objects that needs to filter
+ # mentioned users that cannot read them, for example,
+ # guest users that are referenced on a confidential note.
+ def mentioned_filtered_user_ids_for(refs)
+ refs.mentioned_user_ids.presence
+ end
+
def mentionable_attributes_changed?(changes = saved_changes)
return false unless is_a?(Mentionable)
diff --git a/app/models/concerns/ci/artifactable.rb b/app/models/concerns/ci/artifactable.rb
index 78340cf967b..fb4ea4206f4 100644
--- a/app/models/concerns/ci/artifactable.rb
+++ b/app/models/concerns/ci/artifactable.rb
@@ -30,6 +30,8 @@ module Ci
raise NotSupportedAdapterError, 'This file format requires a dedicated adapter'
end
+ ::Gitlab::ApplicationContext.push(artifact: file.model)
+
file.open do |stream|
file_format_adapter_class.new(stream).each_blob(&blk)
end
diff --git a/app/models/concerns/ci/bulk_insertable_tags.rb b/app/models/concerns/ci/bulk_insertable_tags.rb
new file mode 100644
index 00000000000..453b3b3fbc9
--- /dev/null
+++ b/app/models/concerns/ci/bulk_insertable_tags.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Ci
+ module BulkInsertableTags
+ extend ActiveSupport::Concern
+
+ BULK_INSERT_TAG_THREAD_KEY = 'ci_bulk_insert_tags'
+
+ class << self
+ def with_bulk_insert_tags
+ previous = Thread.current[BULK_INSERT_TAG_THREAD_KEY]
+ Thread.current[BULK_INSERT_TAG_THREAD_KEY] = true
+ yield
+ ensure
+ Thread.current[BULK_INSERT_TAG_THREAD_KEY] = previous
+ end
+ end
+
+ # overrides save_tags from acts-as-taggable
+ def save_tags
+ super unless Thread.current[BULK_INSERT_TAG_THREAD_KEY]
+ end
+ end
+end
diff --git a/app/models/concerns/ci/has_status.rb b/app/models/concerns/ci/has_status.rb
index cca66c3ec94..721cb14201f 100644
--- a/app/models/concerns/ci/has_status.rb
+++ b/app/models/concerns/ci/has_status.rb
@@ -23,11 +23,9 @@ module Ci
UnknownStatusError = Class.new(StandardError)
class_methods do
- # The parameter `project` is only used for the feature flag check, and will be removed with
- # https://gitlab.com/gitlab-org/gitlab/-/issues/321972
- def composite_status(project: nil)
+ def composite_status
Gitlab::Ci::Status::Composite
- .new(all, with_allow_failure: columns_hash.key?('allow_failure'), project: project)
+ .new(all, with_allow_failure: columns_hash.key?('allow_failure'))
.status
end
diff --git a/app/models/concerns/each_batch.rb b/app/models/concerns/each_batch.rb
index 443e1ab53b4..dbc0887dc97 100644
--- a/app/models/concerns/each_batch.rb
+++ b/app/models/concerns/each_batch.rb
@@ -2,6 +2,7 @@
module EachBatch
extend ActiveSupport::Concern
+ include LooseIndexScan
class_methods do
# Iterates over the rows in a relation in batches, similar to Rails'
@@ -100,5 +101,65 @@ module EachBatch
break unless stop
end
end
+
+ # Iterates over the rows in a relation in batches by skipping duplicated values in the column.
+ # Example: counting the number of distinct authors in `issues`
+ #
+ # - Table size: 100_000
+ # - Column: author_id
+ # - Distinct author_ids in the table: 1000
+ #
+ # The query will read maximum 1000 rows if we have index coverage on user_id.
+ #
+ # > count = 0
+ # > Issue.distinct_each_batch(column: 'author_id', of: 1000) { |r| count += r.count(:author_id) }
+ def distinct_each_batch(column:, order: :asc, of: 1000)
+ start = except(:select)
+ .select(column)
+ .reorder(column => order)
+
+ start = start.take
+
+ return unless start
+
+ start_id = start[column]
+ arel_table = self.arel_table
+ arel_column = arel_table[column.to_s]
+
+ 1.step do |index|
+ stop = loose_index_scan(column: column, order: order) do |cte_query, inner_query|
+ if order == :asc
+ [cte_query.where(arel_column.gteq(start_id)), inner_query]
+ else
+ [cte_query.where(arel_column.lteq(start_id)), inner_query]
+ end
+ end.offset(of).take
+
+ if stop
+ stop_id = stop[column]
+
+ relation = loose_index_scan(column: column, order: order) do |cte_query, inner_query|
+ if order == :asc
+ [cte_query.where(arel_column.gteq(start_id)), inner_query.where(arel_column.lt(stop_id))]
+ else
+ [cte_query.where(arel_column.lteq(start_id)), inner_query.where(arel_column.gt(stop_id))]
+ end
+ end
+ start_id = stop_id
+ else
+ relation = loose_index_scan(column: column, order: order) do |cte_query, inner_query|
+ if order == :asc
+ [cte_query.where(arel_column.gteq(start_id)), inner_query]
+ else
+ [cte_query.where(arel_column.lteq(start_id)), inner_query]
+ end
+ end
+ end
+
+ unscoped { yield relation, index }
+
+ break unless stop
+ end
+ end
end
end
diff --git a/app/models/concerns/enums/ci/commit_status.rb b/app/models/concerns/enums/ci/commit_status.rb
index 445277a7a7c..ecb120d8013 100644
--- a/app/models/concerns/enums/ci/commit_status.rb
+++ b/app/models/concerns/enums/ci/commit_status.rb
@@ -29,9 +29,12 @@ module Enums
builds_disabled: 20,
environment_creation_failure: 21,
deployment_rejected: 22,
+ protected_environment_failure: 1_000,
insufficient_bridge_permissions: 1_001,
downstream_bridge_project_not_found: 1_002,
invalid_bridge_trigger: 1_003,
+ upstream_bridge_project_not_found: 1_004,
+ insufficient_upstream_permissions: 1_005,
bridge_pipeline_is_child_pipeline: 1_006, # not used anymore, but cannot be deleted because of old data
downstream_pipeline_creation_failed: 1_007,
secrets_provider_not_found: 1_008,
@@ -42,5 +45,3 @@ module Enums
end
end
end
-
-Enums::Ci::CommitStatus.prepend_mod_with('Enums::Ci::CommitStatus')
diff --git a/app/models/concerns/integrations/has_issue_tracker_fields.rb b/app/models/concerns/integrations/has_issue_tracker_fields.rb
index b1def38d019..57f8e21c5a6 100644
--- a/app/models/concerns/integrations/has_issue_tracker_fields.rb
+++ b/app/models/concerns/integrations/has_issue_tracker_fields.rb
@@ -5,26 +5,32 @@ module Integrations
extend ActiveSupport::Concern
included do
+ self.field_storage = :data_fields
+
field :project_url,
required: true,
- storage: :data_fields,
title: -> { _('Project URL') },
- help: -> { s_('IssueTracker|The URL to the project in the external issue tracker.') }
+ help: -> do
+ s_('IssueTracker|The URL to the project in the external issue tracker.')
+ end
field :issues_url,
required: true,
- storage: :data_fields,
title: -> { s_('IssueTracker|Issue URL') },
help: -> do
- format s_('IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}.'),
+ ERB::Util.html_escape(
+ s_('IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}.')
+ ) % {
colon_id: '<code>:id</code>'.html_safe
+ }
end
field :new_issue_url,
required: true,
- storage: :data_fields,
title: -> { s_('IssueTracker|New issue URL') },
- help: -> { s_('IssueTracker|The URL to create an issue in the external issue tracker.') }
+ help: -> do
+ s_('IssueTracker|The URL to create an issue in the external issue tracker.')
+ end
end
end
end
diff --git a/app/models/concerns/integrations/slack_mattermost_notifier.rb b/app/models/concerns/integrations/slack_mattermost_notifier.rb
index 3bdaa852ddf..142e62bb501 100644
--- a/app/models/concerns/integrations/slack_mattermost_notifier.rb
+++ b/app/models/concerns/integrations/slack_mattermost_notifier.rb
@@ -34,7 +34,7 @@ module Integrations
class HTTPClient
def self.post(uri, params = {})
params.delete(:http_options) # these are internal to the client and we do not want them
- Gitlab::HTTP.post(uri, body: params, use_read_total_timeout: true)
+ Gitlab::HTTP.post(uri, body: params)
end
end
end
diff --git a/app/models/concerns/loose_index_scan.rb b/app/models/concerns/loose_index_scan.rb
new file mode 100644
index 00000000000..5d37a30171a
--- /dev/null
+++ b/app/models/concerns/loose_index_scan.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+module LooseIndexScan
+ extend ActiveSupport::Concern
+
+ class_methods do
+ # Builds a recursive query to read distinct values from a column.
+ #
+ # Example 1: collect all distinct author ids for the `issues` table
+ #
+ # Bad: The DB reads all issues, sorts and dedups them in memory
+ #
+ # > Issue.select(:author_id).distinct.map(&:author_id)
+ #
+ # Good: Use loose index scan (skip index scan)
+ #
+ # > Issue.loose_index_scan(column: :author_id).map(&:author_id)
+ #
+ # Example 2: List of users for the DONE todos selector. Select all users who created a todo.
+ #
+ # Bad: Loads all DONE todos for the given user and extracts the author_ids
+ #
+ # > User.where(id: Todo.where(user_id: 4156052).done.select(:author_id))
+ #
+ # Good: Loads distinct author_ids from todos and then loads users
+ #
+ # > distinct_authors = Todo.where(user_id: 4156052).done.loose_index_scan(column: :author_id).select(:author_id)
+ # > User.where(id: distinct_authors)
+ def loose_index_scan(column:, order: :asc)
+ arel_table = self.arel_table
+ arel_column = arel_table[column.to_s]
+
+ cte = Gitlab::SQL::RecursiveCTE.new(:loose_index_scan_cte, union_args: { remove_order: false })
+
+ cte_query = except(:select)
+ .select(column)
+ .order(column => order)
+ .limit(1)
+
+ inner_query = except(:select)
+
+ cte_query, inner_query = yield([cte_query, inner_query]) if block_given?
+ cte << cte_query
+
+ inner_query = if order == :asc
+ inner_query.where(arel_column.gt(cte.table[column.to_s]))
+ else
+ inner_query.where(arel_column.lt(cte.table[column.to_s]))
+ end
+
+ inner_query = inner_query.order(column => order)
+ .select(column)
+ .limit(1)
+
+ cte << cte.table
+ .project(Arel::Nodes::Grouping.new(Arel.sql(inner_query.to_sql)).as(column.to_s))
+
+ unscoped do
+ select(column)
+ .with
+ .recursive(cte.to_arel)
+ .from(cte.alias_to(arel_table))
+ .where(arel_column.not_eq(nil)) # filtering out the last NULL value
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/milestoneable.rb b/app/models/concerns/milestoneable.rb
index 12041b103f6..14c54d99ef3 100644
--- a/app/models/concerns/milestoneable.rb
+++ b/app/models/concerns/milestoneable.rb
@@ -16,7 +16,7 @@ module Milestoneable
scope :any_milestone, -> { where.not(milestone_id: nil) }
scope :with_milestone, ->(title) { left_joins_milestones.where(milestones: { title: title }) }
- scope :without_particular_milestone, ->(title) { left_outer_joins(:milestone).where("milestones.title != ? OR milestone_id IS NULL", title) }
+ scope :without_particular_milestones, ->(titles) { left_outer_joins(:milestone).where("milestones.title NOT IN (?) OR milestone_id IS NULL", titles) }
scope :any_release, -> { joins_milestone_releases }
scope :with_release, -> (tag, project_id) { joins_milestone_releases.where( milestones: { releases: { tag: tag, project_id: project_id } } ) }
scope :without_particular_release, -> (tag, project_id) { joins_milestone_releases.where.not(milestones: { releases: { tag: tag, project_id: project_id } }) }
diff --git a/app/models/concerns/notification_branch_selection.rb b/app/models/concerns/notification_branch_selection.rb
index 18ec996c3df..f2df7579a65 100644
--- a/app/models/concerns/notification_branch_selection.rb
+++ b/app/models/concerns/notification_branch_selection.rb
@@ -6,13 +6,15 @@
module NotificationBranchSelection
extend ActiveSupport::Concern
- def branch_choices
- [
- [_('All branches'), 'all'].freeze,
- [_('Default branch'), 'default'].freeze,
- [_('Protected branches'), 'protected'].freeze,
- [_('Default branch and protected branches'), 'default_and_protected'].freeze
- ].freeze
+ class_methods do
+ def branch_choices
+ [
+ [_('All branches'), 'all'].freeze,
+ [_('Default branch'), 'default'].freeze,
+ [_('Protected branches'), 'protected'].freeze,
+ [_('Default branch and protected branches'), 'default_and_protected'].freeze
+ ].freeze
+ end
end
def notify_for_branch?(data)
diff --git a/app/models/concerns/packages/fips.rb b/app/models/concerns/packages/fips.rb
new file mode 100644
index 00000000000..b8589cdc991
--- /dev/null
+++ b/app/models/concerns/packages/fips.rb
@@ -0,0 +1,11 @@
+# rubocop:disable Naming/FileName
+# frozen_string_literal: true
+
+module Packages
+ module FIPS
+ extend ActiveSupport::Concern
+
+ DisabledError = Class.new(StandardError)
+ end
+end
+# rubocop:enable Naming/FileName
diff --git a/app/models/concerns/participable.rb b/app/models/concerns/participable.rb
index 20743ebcb52..f59b5d1ecc8 100644
--- a/app/models/concerns/participable.rb
+++ b/app/models/concerns/participable.rb
@@ -92,7 +92,13 @@ module Participable
end
def raw_participants(current_user = nil, verify_access: false)
- ext = Gitlab::ReferenceExtractor.new(project, current_user)
+ extractor = Gitlab::ReferenceExtractor.new(project, current_user)
+
+ # Used to extract references from confidential notes.
+ # Referenced users that cannot read confidential notes are
+ # later removed from participants array.
+ internal_notes_extractor = Gitlab::ReferenceExtractor.new(project, current_user)
+
participants = Set.new
process = [self]
@@ -107,6 +113,8 @@ module Participable
source.class.participant_attrs.each do |attr|
if attr.respond_to?(:call)
+ ext = use_internal_notes_extractor_for?(source) ? internal_notes_extractor : extractor
+
source.instance_exec(current_user, ext, &attr)
else
process << source.__send__(attr) # rubocop:disable GitlabSecurity/PublicSend
@@ -121,7 +129,18 @@ module Participable
end
end
- participants.merge(ext.users)
+ participants.merge(users_that_can_read_internal_notes(internal_notes_extractor))
+ participants.merge(extractor.users)
+ end
+
+ def use_internal_notes_extractor_for?(source)
+ source.is_a?(Note) && source.confidential?
+ end
+
+ def users_that_can_read_internal_notes(extractor)
+ return [] unless self.is_a?(Noteable) && self.try(:resource_parent)
+
+ Ability.users_that_can_read_internal_notes(extractor.users, self.resource_parent)
end
def source_visible_to_user?(source, user)
diff --git a/app/models/concerns/require_email_verification.rb b/app/models/concerns/require_email_verification.rb
new file mode 100644
index 00000000000..cf6a31e6ebd
--- /dev/null
+++ b/app/models/concerns/require_email_verification.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+# == Require Email Verification module
+#
+# Contains functionality to handle email verification
+module RequireEmailVerification
+ extend ActiveSupport::Concern
+ include Gitlab::Utils::StrongMemoize
+
+ # This value is twice the amount we want it to be, because due to a bug in the devise-two-factor
+ # gem every failed login attempt increments the value of failed_attempts by 2 instead of 1.
+ # See: https://github.com/tinfoil/devise-two-factor/issues/127
+ MAXIMUM_ATTEMPTS = 3 * 2
+ UNLOCK_IN = 24.hours
+
+ included do
+ # Virtual attribute for the email verification token form
+ attr_accessor :verification_token
+ end
+
+ # When overridden, do not send Devise unlock instructions when locking access.
+ def lock_access!(opts = {})
+ return super unless override_devise_lockable?
+
+ super({ send_instructions: false })
+ end
+
+ protected
+
+ # We cannot override the class methods `maximum_attempts` and `unlock_in`, because we want to
+ # check for 2FA being enabled on the instance. So instead override the Devise Lockable methods
+ # where those values are used.
+ def attempts_exceeded?
+ return super unless override_devise_lockable?
+
+ failed_attempts >= MAXIMUM_ATTEMPTS
+ end
+
+ def lock_expired?
+ return super unless override_devise_lockable?
+
+ locked_at && locked_at < UNLOCK_IN.ago
+ end
+
+ private
+
+ def override_devise_lockable?
+ strong_memoize(:override_devise_lockable) do
+ Feature.enabled?(:require_email_verification, self) && !two_factor_enabled?
+ end
+ end
+end
diff --git a/app/models/concerns/vulnerability_finding_helpers.rb b/app/models/concerns/vulnerability_finding_helpers.rb
index 7f96b3901f1..4cf36f83857 100644
--- a/app/models/concerns/vulnerability_finding_helpers.rb
+++ b/app/models/concerns/vulnerability_finding_helpers.rb
@@ -42,4 +42,41 @@ module VulnerabilityFindingHelpers
)
end
end
+
+ def build_vulnerability_finding(security_finding)
+ report_finding = report_finding_for(security_finding)
+ return Vulnerabilities::Finding.new unless report_finding
+
+ finding_data = report_finding.to_hash.except(:compare_key, :identifiers, :location, :scanner, :links, :signatures,
+ :flags, :evidence)
+ identifiers = report_finding.identifiers.map do |identifier|
+ Vulnerabilities::Identifier.new(identifier.to_hash)
+ end
+ signatures = report_finding.signatures.map do |signature|
+ Vulnerabilities::FindingSignature.new(signature.to_hash)
+ end
+ evidence = Vulnerabilities::Finding::Evidence.new(data: report_finding.evidence.data) if report_finding.evidence
+
+ Vulnerabilities::Finding.new(finding_data).tap do |finding|
+ finding.location_fingerprint = report_finding.location.fingerprint
+ finding.vulnerability = vulnerability_for(security_finding.uuid)
+ finding.project = project
+ finding.sha = pipeline.sha
+ finding.scanner = security_finding.scanner
+ finding.finding_evidence = evidence
+
+ if calculate_false_positive?
+ finding.vulnerability_flags = report_finding.flags.map do |flag|
+ Vulnerabilities::Flag.new(flag)
+ end
+ end
+
+ finding.identifiers = identifiers
+ finding.signatures = signatures
+ end
+ end
+
+ def calculate_false_positive?
+ project.licensed_feature_available?(:sast_fp_reduction)
+ end
end
diff --git a/app/models/container_registry/event.rb b/app/models/container_registry/event.rb
index 47d21d21afd..d4075e1ff1b 100644
--- a/app/models/container_registry/event.rb
+++ b/app/models/container_registry/event.rb
@@ -6,6 +6,7 @@ module ContainerRegistry
ALLOWED_ACTIONS = %w(push delete).freeze
PUSH_ACTION = 'push'
+ DELETE_ACTION = 'delete'
EVENT_TRACKING_CATEGORY = 'container_registry:notification'
attr_reader :event
@@ -41,6 +42,10 @@ module ContainerRegistry
event['target'].has_key?('tag')
end
+ def target_digest?
+ event['target'].has_key?('digest')
+ end
+
def target_repository?
!target_tag? && event['target'].has_key?('repository')
end
@@ -53,6 +58,10 @@ module ContainerRegistry
PUSH_ACTION == action
end
+ def action_delete?
+ DELETE_ACTION == action
+ end
+
def container_repository_exists?
return unless container_registry_path
@@ -74,7 +83,7 @@ module ContainerRegistry
def update_project_statistics
return unless supported?
- return unless target_tag?
+ return unless target_tag? || (action_delete? && target_digest?)
return unless project
Rails.cache.delete(project.root_ancestor.container_repositories_size_cache_key)
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index c965d7cffe1..cdfd24e00aa 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -468,7 +468,7 @@ class ContainerRepository < ApplicationRecord
def size
strong_memoize(:size) do
next unless Gitlab.com?
- next if self.created_at.before?(MIGRATION_PHASE_1_STARTED_AT)
+ next if self.created_at.before?(MIGRATION_PHASE_1_STARTED_AT) && self.migration_state != 'import_done'
next unless gitlab_api_client.supports_gitlab_api?
gitlab_api_client.repository_details(self.path, sizing: :self)['size_bytes']
diff --git a/app/models/customer_relations/contact.rb b/app/models/customer_relations/contact.rb
index ded6ab8687a..0f13c45b84d 100644
--- a/app/models/customer_relations/contact.rb
+++ b/app/models/customer_relations/contact.rb
@@ -57,7 +57,22 @@ class CustomerRelations::Contact < ApplicationRecord
end
def self.sort_by_name
- order("last_name ASC, first_name ASC")
+ order(Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'last_name',
+ order_expression: arel_table[:last_name].asc,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'first_name',
+ order_expression: arel_table[:first_name].asc,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ order_expression: arel_table[:id].asc
+ )
+ ]))
end
def self.find_ids_by_emails(group, emails)
diff --git a/app/models/deploy_token.rb b/app/models/deploy_token.rb
index 3c0f7d91a03..20d19ec9541 100644
--- a/app/models/deploy_token.rb
+++ b/app/models/deploy_token.rb
@@ -5,9 +5,6 @@ class DeployToken < ApplicationRecord
include TokenAuthenticatable
include PolicyActor
include Gitlab::Utils::StrongMemoize
- include IgnorableColumns
-
- ignore_column :token, remove_with: '15.2', remove_after: '2022-07-22'
add_authentication_token_field :token, encrypted: :required
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index fc0dd7e00c7..c25ba6f9268 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -108,13 +108,9 @@ class Deployment < ApplicationRecord
end
end
- after_transition any => :running do |deployment|
+ after_transition any => :running do |deployment, transition|
deployment.run_after_commit do
- if Feature.enabled?(:deployment_hooks_skip_worker, deployment.project)
- deployment.execute_hooks(Time.current)
- else
- Deployments::HooksWorker.perform_async(deployment_id: id, status_changed_at: Time.current)
- end
+ Deployments::HooksWorker.perform_async(deployment_id: id, status: transition.to, status_changed_at: Time.current)
end
end
@@ -126,13 +122,9 @@ class Deployment < ApplicationRecord
end
end
- after_transition any => FINISHED_STATUSES do |deployment|
+ after_transition any => FINISHED_STATUSES do |deployment, transition|
deployment.run_after_commit do
- if Feature.enabled?(:deployment_hooks_skip_worker, deployment.project)
- deployment.execute_hooks(Time.current)
- else
- Deployments::HooksWorker.perform_async(deployment_id: id, status_changed_at: Time.current)
- end
+ Deployments::HooksWorker.perform_async(deployment_id: id, status: transition.to, status_changed_at: Time.current)
end
end
@@ -193,7 +185,7 @@ class Deployment < ApplicationRecord
def self.last_deployment_group_for_environment(env)
return self.none unless env.last_deployment_pipeline&.latest_successful_builds&.present?
- BatchLoader.for(env).batch do |environments, loader|
+ BatchLoader.for(env).batch(default_value: self.none) do |environments, loader|
latest_successful_build_ids = []
environments_hash = {}
@@ -269,8 +261,8 @@ class Deployment < ApplicationRecord
Commit.truncate_sha(sha)
end
- def execute_hooks(status_changed_at)
- deployment_data = Gitlab::DataBuilder::Deployment.build(self, status_changed_at)
+ def execute_hooks(status, status_changed_at)
+ deployment_data = Gitlab::DataBuilder::Deployment.build(self, status, status_changed_at)
project.execute_hooks(deployment_data, :deployment_hooks)
project.execute_integrations(deployment_data, :deployment_hooks)
end
diff --git a/app/models/environment.rb b/app/models/environment.rb
index da6ab5ed077..68540ce0f5c 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -451,13 +451,11 @@ class Environment < ApplicationRecord
def auto_stop_in=(value)
return unless value
- return unless parsed_result = ChronicDuration.parse(value)
- self.auto_stop_at = parsed_result.seconds.from_now
- end
+ parser = ::Gitlab::Ci::Build::DurationParser.new(value)
+ return if parser.seconds_from_now.nil?
- def elastic_stack_available?
- !!deployment_platform&.cluster&.elastic_stack_available?
+ self.auto_stop_at = parser.seconds_from_now
end
def rollout_status
diff --git a/app/models/error_tracking/client_key.rb b/app/models/error_tracking/client_key.rb
index bbc57573aa9..d58a183f223 100644
--- a/app/models/error_tracking/client_key.rb
+++ b/app/models/error_tracking/client_key.rb
@@ -16,7 +16,7 @@ class ErrorTracking::ClientKey < ApplicationRecord
end
def sentry_dsn
- @sentry_dsn ||= ErrorTracking::Collector::Dsn.build_url(public_key, project_id)
+ @sentry_dsn ||= ::Gitlab::ErrorTracking::ErrorRepository.build(project).dsn_url(public_key)
end
private
diff --git a/app/models/group.rb b/app/models/group.rb
index f5aad6e74ff..6d8f8bd7613 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -112,6 +112,8 @@ class Group < Namespace
has_many :dependency_proxy_blobs, class_name: 'DependencyProxy::Blob'
has_many :dependency_proxy_manifests, class_name: 'DependencyProxy::Manifest'
+ has_one :harbor_integration, class_name: 'Integrations::Harbor'
+
# debian_distributions and associated component_files must be destroyed by ruby code in order to properly remove carrierwave uploads
has_many :debian_distributions, class_name: 'Packages::Debian::GroupDistribution', dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
@@ -361,8 +363,8 @@ class Group < Namespace
owners.include?(user)
end
- def add_users(users, access_level, current_user: nil, expires_at: nil, tasks_to_be_done: [], tasks_project_id: nil)
- Members::Groups::CreatorService.add_users( # rubocop:disable CodeReuse/ServiceClass
+ def add_members(users, access_level, current_user: nil, expires_at: nil, tasks_to_be_done: [], tasks_project_id: nil)
+ Members::Groups::CreatorService.add_members( # rubocop:disable CodeReuse/ServiceClass
self,
users,
access_level,
@@ -373,8 +375,8 @@ class Group < Namespace
)
end
- def add_user(user, access_level, current_user: nil, expires_at: nil, ldap: false, blocking_refresh: true)
- Members::Groups::CreatorService.add_user( # rubocop:disable CodeReuse/ServiceClass
+ def add_member(user, access_level, current_user: nil, expires_at: nil, ldap: false, blocking_refresh: true)
+ Members::Groups::CreatorService.add_member( # rubocop:disable CodeReuse/ServiceClass
self,
user,
access_level,
@@ -386,23 +388,23 @@ class Group < Namespace
end
def add_guest(user, current_user = nil)
- add_user(user, :guest, current_user: current_user)
+ add_member(user, :guest, current_user: current_user)
end
def add_reporter(user, current_user = nil)
- add_user(user, :reporter, current_user: current_user)
+ add_member(user, :reporter, current_user: current_user)
end
def add_developer(user, current_user = nil)
- add_user(user, :developer, current_user: current_user)
+ add_member(user, :developer, current_user: current_user)
end
def add_maintainer(user, current_user = nil)
- add_user(user, :maintainer, current_user: current_user)
+ add_member(user, :maintainer, current_user: current_user)
end
def add_owner(user, current_user = nil)
- add_user(user, :owner, current_user: current_user)
+ add_member(user, :owner, current_user: current_user)
end
def member?(user, min_access_level = Gitlab::Access::GUEST)
diff --git a/app/models/hooks/project_hook.rb b/app/models/hooks/project_hook.rb
index b7ace34141e..bcbf43ee38b 100644
--- a/app/models/hooks/project_hook.rb
+++ b/app/models/hooks/project_hook.rb
@@ -27,6 +27,8 @@ class ProjectHook < WebHook
belongs_to :project
validates :project, presence: true
+ scope :for_projects, ->(project) { where(project: project) }
+
def pluralized_name
_('Webhooks')
end
@@ -41,6 +43,19 @@ class ProjectHook < WebHook
project
end
+ override :update_last_failure
+ def update_last_failure
+ return if executable?
+
+ key = "web_hooks:last_failure:project-#{project_id}"
+ time = Time.current.utc.iso8601
+
+ Gitlab::Redis::SharedState.with do |redis|
+ prev = redis.get(key)
+ redis.set(key, time) if !prev || prev < time
+ end
+ end
+
private
override :web_hooks_disable_failed?
diff --git a/app/models/hooks/system_hook.rb b/app/models/hooks/system_hook.rb
index c8a0cc05912..c0073f9a9b8 100644
--- a/app/models/hooks/system_hook.rb
+++ b/app/models/hooks/system_hook.rb
@@ -26,6 +26,6 @@ class SystemHook < WebHook
end
def help_path
- 'system_hooks/system_hooks'
+ 'administration/system_hooks'
end
end
diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb
index 37fd612e652..f428d07cd7f 100644
--- a/app/models/hooks/web_hook.rb
+++ b/app/models/hooks/web_hook.rb
@@ -3,6 +3,8 @@
class WebHook < ApplicationRecord
include Sortable
+ InterpolationError = Class.new(StandardError)
+
MAX_FAILURES = 100
FAILURE_THRESHOLD = 3 # three strikes
INITIAL_BACKOFF = 10.minutes
@@ -36,6 +38,7 @@ class WebHook < ApplicationRecord
validates :token, format: { without: /\n/ }
validates :push_events_branch_filter, branch_filter: true
validates :url_variables, json_schema: { filename: 'web_hooks_url_variables' }
+ validate :no_missing_url_variables
after_initialize :initialize_url_variables
@@ -45,6 +48,11 @@ class WebHook < ApplicationRecord
where('recent_failures <= ? AND (disabled_until IS NULL OR disabled_until < ?)', FAILURE_THRESHOLD, Time.current)
end
+ # Inverse of executable
+ scope :disabled, -> do
+ where('recent_failures > ? OR disabled_until >= ?', FAILURE_THRESHOLD, Time.current)
+ end
+
def executable?
!temporarily_disabled? && !permanently_disabled?
end
@@ -164,6 +172,24 @@ class WebHook < ApplicationRecord
super(options)
end
+ # See app/validators/json_schemas/web_hooks_url_variables.json
+ VARIABLE_REFERENCE_RE = /\{([A-Za-z_][A-Za-z0-9_]+)\}/.freeze
+
+ def interpolated_url
+ return url unless url.include?('{')
+
+ vars = url_variables
+ url.gsub(VARIABLE_REFERENCE_RE) do
+ vars.fetch(_1.delete_prefix('{').delete_suffix('}'))
+ end
+ rescue KeyError => e
+ raise InterpolationError, "Invalid URL template. Missing key #{e.key}"
+ end
+
+ def update_last_failure
+ # Overridden in child classes.
+ end
+
private
def web_hooks_disable_failed?
@@ -177,4 +203,17 @@ class WebHook < ApplicationRecord
def rate_limiter
@rate_limiter ||= Gitlab::WebHooks::RateLimiter.new(self)
end
+
+ def no_missing_url_variables
+ return if url.nil?
+
+ variable_names = url_variables.keys
+ used_variables = url.scan(VARIABLE_REFERENCE_RE).map(&:first)
+
+ missing = used_variables - variable_names
+
+ return if missing.empty?
+
+ errors.add(:url, "Invalid URL template. Missing keys: #{missing}")
+ end
end
diff --git a/app/models/incident_management/issuable_escalation_status.rb b/app/models/incident_management/issuable_escalation_status.rb
index fc881e62efd..3c581f0489a 100644
--- a/app/models/incident_management/issuable_escalation_status.rb
+++ b/app/models/incident_management/issuable_escalation_status.rb
@@ -7,7 +7,7 @@ module IncidentManagement
self.table_name = 'incident_management_issuable_escalation_statuses'
belongs_to :issue
- has_one :project, through: :issue, inverse_of: :incident_management_issuable_escalation_status
+ has_one :project, through: :issue, inverse_of: :incident_management_issuable_escalation_statuses
validates :issue, presence: true, uniqueness: true
diff --git a/app/models/integration.rb b/app/models/integration.rb
index 726e95b7cbf..f5f701662e7 100644
--- a/app/models/integration.rb
+++ b/app/models/integration.rb
@@ -13,8 +13,6 @@ class Integration < ApplicationRecord
include IgnorableColumns
extend ::Gitlab::Utils::Override
- ignore_column :properties, remove_with: '15.1', remove_after: '2022-05-22'
-
UnknownType = Class.new(StandardError)
self.inheritance_column = :type_new
@@ -154,6 +152,8 @@ class Integration < ApplicationRecord
else
raise ArgumentError, "Unknown field storage: #{storage}"
end
+
+ boolean_accessor(name) if attrs[:type] == 'checkbox'
end
# :nocov:
@@ -200,14 +200,21 @@ class Integration < ApplicationRecord
# Provide convenient boolean accessor methods for each serialized property.
# Also keep track of updated properties in a similar way as ActiveModel::Dirty
def self.boolean_accessor(*args)
- prop_accessor(*args)
-
args.each do |arg|
+ # TODO: Allow legacy usage of `.boolean_accessor`, once all integrations
+ # are converted to the field DSL we can remove this and only call
+ # `.boolean_accessor` through `.field`.
+ #
+ # See https://gitlab.com/groups/gitlab-org/-/epics/7652
+ prop_accessor(arg) unless method_defined?(arg)
+
class_eval <<~RUBY, __FILE__, __LINE__ + 1
- def #{arg}
- return if properties.blank?
+ # Make the original getter available as a private method.
+ alias_method :#{arg}_before_type_cast, :#{arg}
+ private(:#{arg}_before_type_cast)
- Gitlab::Utils.to_boolean(properties['#{arg}'])
+ def #{arg}
+ Gitlab::Utils.to_boolean(#{arg}_before_type_cast)
end
def #{arg}?
@@ -494,16 +501,12 @@ class Integration < ApplicationRecord
self.class.event_names
end
- def event_field(event)
- nil
- end
-
def api_field_names
fields.reject { _1[:type] == 'password' }.pluck(:name)
end
- def global_fields
- fields
+ def form_fields
+ fields.reject { _1[:api_only] == true }
end
def configurable_events
@@ -574,11 +577,7 @@ class Integration < ApplicationRecord
def async_execute(data)
return unless supported_events.include?(data[:object_kind])
- if Feature.enabled?(:rename_integrations_workers)
- Integrations::ExecuteWorker.perform_async(id, data)
- else
- ProjectServiceWorker.perform_async(id, data)
- end
+ Integrations::ExecuteWorker.perform_async(id, data)
end
# override if needed
diff --git a/app/models/integrations/asana.rb b/app/models/integrations/asana.rb
index d25bf8b1b1e..2cfd71c9eb2 100644
--- a/app/models/integrations/asana.rb
+++ b/app/models/integrations/asana.rb
@@ -4,9 +4,22 @@ require 'asana'
module Integrations
class Asana < Integration
- prop_accessor :api_key, :restrict_to_branch
validates :api_key, presence: true, if: :activated?
+ field :api_key,
+ type: 'password',
+ title: 'API key',
+ help: -> { s_('AsanaService|User Personal Access Token. User must have access to the task. All comments are attributed to this user.') },
+ non_empty_password_title: -> { s_('ProjectService|Enter new API key') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current API key.') },
+ # Example Personal Access Token from Asana docs
+ placeholder: '0/68a9e79b868c6789e79a124c30b0',
+ required: true
+
+ field :restrict_to_branch,
+ title: -> { s_('Integrations|Restrict to branch (optional)') },
+ help: -> { s_('AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches.') }
+
def title
'Asana'
end
@@ -24,28 +37,6 @@ module Integrations
'asana'
end
- def fields
- [
- {
- type: 'password',
- name: 'api_key',
- title: 'API key',
- help: s_('AsanaService|User Personal Access Token. User must have access to the task. All comments are attributed to this user.'),
- non_empty_password_title: s_('ProjectService|Enter new API key'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current API key.'),
- # Example Personal Access Token from Asana docs
- placeholder: '0/68a9e79b868c6789e79a124c30b0',
- required: true
- },
- {
- type: 'text',
- name: 'restrict_to_branch',
- title: 'Restrict to branch (optional)',
- help: s_('AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches.')
- }
- ]
- end
-
def self.supported_events
%w(push)
end
diff --git a/app/models/integrations/assembla.rb b/app/models/integrations/assembla.rb
index ccd24c1fb2c..88dbf2915ef 100644
--- a/app/models/integrations/assembla.rb
+++ b/app/models/integrations/assembla.rb
@@ -2,9 +2,18 @@
module Integrations
class Assembla < Integration
- prop_accessor :token, :subdomain
validates :token, presence: true, if: :activated?
+ field :token,
+ type: 'password',
+ non_empty_password_title: -> { s_('ProjectService|Enter new token') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current token.') },
+ placeholder: '',
+ required: true
+
+ field :subdomain,
+ placeholder: ''
+
def title
'Assembla'
end
@@ -17,24 +26,6 @@ module Integrations
'assembla'
end
- def fields
- [
- {
- type: 'password',
- name: 'token',
- non_empty_password_title: s_('ProjectService|Enter new token'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
- placeholder: '',
- required: true
- },
- {
- type: 'text',
- name: 'subdomain',
- placeholder: ''
- }
- ]
- end
-
def self.supported_events
%w(push)
end
diff --git a/app/models/integrations/bamboo.rb b/app/models/integrations/bamboo.rb
index 4e30c1ccc69..230dc6bb336 100644
--- a/app/models/integrations/bamboo.rb
+++ b/app/models/integrations/bamboo.rb
@@ -155,7 +155,6 @@ module Integrations
query_params[:os_authType] = 'basic'
params[:basic_auth] = basic_auth
- params[:use_read_total_timeout] = true
params
end
diff --git a/app/models/integrations/base_chat_notification.rb b/app/models/integrations/base_chat_notification.rb
index 33d4eecbf49..c7992e4083c 100644
--- a/app/models/integrations/base_chat_notification.rb
+++ b/app/models/integrations/base_chat_notification.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-# Base class for Chat notifications services
+# Base class for Chat notifications integrations
# This class is not meant to be used directly, but only to inherit from.
module Integrations
@@ -46,7 +46,7 @@ module Integrations
# `notify_only_default_branch`. Now we have a string property named
# `branches_to_be_notified`. Instead of doing a background migration, we
# opted to set a value for the new property based on the old one, if
- # users haven't specified one already. When users edit the service and
+ # users haven't specified one already. When users edit the integration and
# select a value for this new property, it will override everything.
self.branches_to_be_notified ||= notify_only_default_branch? ? "default" : "all"
@@ -78,7 +78,7 @@ module Integrations
type: 'select',
name: 'branches_to_be_notified',
title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices
+ choices: self.class.branch_choices
}.freeze,
{
type: 'text',
@@ -118,7 +118,7 @@ module Integrations
event_type = data[:event_type] || object_kind
- channel_names = get_channel_field(event_type).presence || channel.presence
+ channel_names = event_channel_value(event_type).presence || channel.presence
channels = channel_names&.split(',')&.map(&:strip)
opts = {}
@@ -134,15 +134,13 @@ module Integrations
end
def event_channel_names
- supported_events.map { |event| event_channel_name(event) }
- end
+ return [] unless configurable_channels?
- def event_field(event)
- fields.find { |field| field[:name] == event_channel_name(event) }
+ supported_events.map { |event| event_channel_name(event) }
end
- def global_fields
- fields.reject { |field| field[:name].end_with?('channel') }
+ def form_fields
+ super.reject { |field| field[:name].end_with?('channel') }
end
def default_channel_placeholder
@@ -153,6 +151,21 @@ module Integrations
raise NotImplementedError
end
+ # With some integrations the webhook is already tied to a specific channel,
+ # for others the channels are configurable for each event.
+ def configurable_channels?
+ false
+ end
+
+ def event_channel_name(event)
+ EVENT_CHANNEL[event]
+ end
+
+ def event_channel_value(event)
+ field_name = event_channel_name(event)
+ self.public_send(field_name) # rubocop:disable GitlabSecurity/PublicSend
+ end
+
private
def log_usage(_, _)
@@ -213,21 +226,12 @@ module Integrations
end
end
- def get_channel_field(event)
- field_name = event_channel_name(event)
- self.public_send(field_name) # rubocop:disable GitlabSecurity/PublicSend
- end
-
def build_event_channels
- supported_events.reduce([]) do |channels, event|
- channels << { type: 'text', name: event_channel_name(event), placeholder: default_channel_placeholder }
+ event_channel_names.map do |channel_field|
+ { type: 'text', name: channel_field, placeholder: default_channel_placeholder }
end
end
- def event_channel_name(event)
- EVENT_CHANNEL[event]
- end
-
def project_name
project.full_name
end
diff --git a/app/models/integrations/base_issue_tracker.rb b/app/models/integrations/base_issue_tracker.rb
index bffe87c21ee..fe4a2f43b13 100644
--- a/app/models/integrations/base_issue_tracker.rb
+++ b/app/models/integrations/base_issue_tracker.rb
@@ -94,7 +94,7 @@ module Integrations
result = false
begin
- response = Gitlab::HTTP.head(self.project_url, verify: true, use_read_total_timeout: true)
+ response = Gitlab::HTTP.head(self.project_url, verify: true)
if response
message = "#{self.type} received response #{response.code} when attempting to connect to #{self.project_url}"
diff --git a/app/models/integrations/campfire.rb b/app/models/integrations/campfire.rb
index 7889cd8f9a9..bf1358ac0f6 100644
--- a/app/models/integrations/campfire.rb
+++ b/app/models/integrations/campfire.rb
@@ -2,9 +2,34 @@
module Integrations
class Campfire < Integration
- prop_accessor :token, :subdomain, :room
validates :token, presence: true, if: :activated?
+ field :token,
+ type: 'password',
+ title: -> { _('Campfire token') },
+ help: -> { s_('CampfireService|API authentication token from Campfire.') },
+ non_empty_password_title: -> { s_('ProjectService|Enter new token') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current token.') },
+ placeholder: '',
+ required: true
+
+ field :subdomain,
+ title: -> { _('Campfire subdomain (optional)') },
+ placeholder: '',
+ help: -> do
+ ERB::Util.html_escape(
+ s_('CampfireService|The %{code_open}.campfirenow.com%{code_close} subdomain.')
+ ) % {
+ code_open: '<code>'.html_safe,
+ code_close: '</code>'.html_safe
+ }
+ end
+
+ field :room,
+ title: -> { _('Campfire room ID (optional)') },
+ placeholder: '123456',
+ help: -> { s_('CampfireService|From the end of the room URL.') }
+
def title
'Campfire'
end
@@ -15,42 +40,18 @@ module Integrations
def help
docs_link = ActionController::Base.helpers.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 }
+
+ ERB::Util.html_escape(
+ s_('CampfireService|Send notifications about push events to Campfire chat rooms. %{docs_link}')
+ ) % {
+ docs_link: docs_link.html_safe
+ }
end
def self.to_param
'campfire'
end
- def fields
- [
- {
- type: 'password',
- name: 'token',
- title: _('Campfire token'),
- help: s_('CampfireService|API authentication token from Campfire.'),
- non_empty_password_title: s_('ProjectService|Enter new token'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
- placeholder: '',
- 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
-
def self.supported_events
%w(push)
end
diff --git a/app/models/integrations/confluence.rb b/app/models/integrations/confluence.rb
index 4e1d1993d02..c1c43af99bf 100644
--- a/app/models/integrations/confluence.rb
+++ b/app/models/integrations/confluence.rb
@@ -6,11 +6,14 @@ module Integrations
VALID_HOST_MATCH = %r{\A.+\.atlassian\.net\Z}.freeze
VALID_PATH_MATCH = %r{\A/wiki(/|\Z)}.freeze
- prop_accessor :confluence_url
-
validates :confluence_url, presence: true, if: :activated?
validate :validate_confluence_url_is_cloud, if: :activated?
+ field :confluence_url,
+ title: -> { s_('Confluence Cloud Workspace URL') },
+ placeholder: 'https://example.atlassian.net/wiki',
+ required: true
+
def self.to_param
'confluence'
end
@@ -38,18 +41,6 @@ module Integrations
end
end
- def fields
- [
- {
- type: 'text',
- name: 'confluence_url',
- title: s_('Confluence Cloud Workspace URL'),
- placeholder: 'https://example.atlassian.net/wiki',
- required: true
- }
- ]
- end
-
def testable?
false
end
diff --git a/app/models/integrations/datadog.rb b/app/models/integrations/datadog.rb
index bb0fb6b9079..97e586c0662 100644
--- a/app/models/integrations/datadog.rb
+++ b/app/models/integrations/datadog.rb
@@ -15,7 +15,75 @@ module Integrations
TAG_KEY_VALUE_RE = %r{\A [\w-]+ : .*\S.* \z}x.freeze
- prop_accessor :datadog_site, :api_url, :api_key, :datadog_service, :datadog_env, :datadog_tags
+ field :datadog_site,
+ placeholder: DEFAULT_DOMAIN,
+ help: -> do
+ ERB::Util.html_escape(
+ s_('DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}.')
+ ) % {
+ codeOpen: '<code>'.html_safe,
+ codeClose: '</code>'.html_safe
+ }
+ end
+
+ field :api_url,
+ title: -> { s_('DatadogIntegration|API URL') },
+ help: -> { s_('DatadogIntegration|(Advanced) The full URL for your Datadog site.') }
+
+ field :api_key,
+ type: 'password',
+ title: -> { _('API key') },
+ non_empty_password_title: -> { s_('ProjectService|Enter new API key') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current API key') },
+ help: -> do
+ ERB::Util.html_escape(
+ s_('DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog.')
+ ) % {
+ linkOpen: %Q{<a href="#{URL_API_KEYS_DOCS}" target="_blank" rel="noopener noreferrer">}.html_safe,
+ linkClose: '</a>'.html_safe
+ }
+ end,
+ required: true
+
+ field :archive_trace_events,
+ type: 'checkbox',
+ title: -> { s_('Logs') },
+ checkbox_label: -> { s_('Enable logs collection') },
+ help: -> { s_('When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces.') }
+
+ field :datadog_service,
+ title: -> { s_('DatadogIntegration|Service') },
+ placeholder: 'gitlab-ci',
+ help: -> { s_('DatadogIntegration|Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments.') }
+
+ field :datadog_env,
+ title: -> { s_('DatadogIntegration|Environment') },
+ placeholder: 'ci',
+ help: -> do
+ ERB::Util.html_escape(
+ s_('DatadogIntegration|For self-managed deployments, set the %{codeOpen}env%{codeClose} tag for all the data sent to Datadog. %{linkOpen}How do I use tags?%{linkClose}')
+ ) % {
+ codeOpen: '<code>'.html_safe,
+ codeClose: '</code>'.html_safe,
+ linkOpen: '<a href="https://docs.datadoghq.com/getting_started/tagging/#using-tags" target="_blank" rel="noopener noreferrer">'.html_safe,
+ linkClose: '</a>'.html_safe
+ }
+ end
+
+ field :datadog_tags,
+ type: 'textarea',
+ title: -> { s_('DatadogIntegration|Tags') },
+ placeholder: "tag:value\nanother_tag:value",
+ help: -> do
+ ERB::Util.html_escape(
+ s_('DatadogIntegration|Custom tags in Datadog. Enter one tag per line in the %{codeOpen}key:value%{codeClose} format. %{linkOpen}How do I use tags?%{linkClose}')
+ ) % {
+ codeOpen: '<code>'.html_safe,
+ codeClose: '</code>'.html_safe,
+ linkOpen: '<a href="https://docs.datadoghq.com/getting_started/tagging/#using-tags" target="_blank" rel="noopener noreferrer">'.html_safe,
+ linkClose: '</a>'.html_safe
+ }
+ end
before_validation :strip_properties
@@ -77,92 +145,11 @@ module Integrations
end
def fields
- f = [
- {
- type: 'text',
- name: 'datadog_site',
- placeholder: DEFAULT_DOMAIN,
- help: ERB::Util.html_escape(
- s_('DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}.')
- ) % {
- codeOpen: '<code>'.html_safe,
- codeClose: '</code>'.html_safe
- },
- required: false
- },
- {
- type: 'text',
- name: 'api_url',
- title: s_('DatadogIntegration|API URL'),
- help: s_('DatadogIntegration|(Advanced) The full URL for your Datadog site.'),
- required: false
- },
- {
- type: 'password',
- name: 'api_key',
- title: _('API key'),
- non_empty_password_title: s_('ProjectService|Enter new API key'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current API key'),
- help: ERB::Util.html_escape(
- s_('DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog.')
- ) % {
- linkOpen: %Q{<a href="#{URL_API_KEYS_DOCS}" target="_blank" rel="noopener noreferrer">}.html_safe,
- linkClose: '</a>'.html_safe
- },
- required: true
- }
- ]
-
if Feature.enabled?(:datadog_integration_logs_collection, parent)
- f.append({
- type: 'checkbox',
- name: 'archive_trace_events',
- title: s_('Logs'),
- checkbox_label: s_('Enable logs collection'),
- help: s_('When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces.'),
- required: false
- })
+ super
+ else
+ super.reject { _1.name == 'archive_trace_events' }
end
-
- f += [
- {
- type: 'text',
- name: 'datadog_service',
- title: s_('DatadogIntegration|Service'),
- placeholder: 'gitlab-ci',
- help: s_('DatadogIntegration|Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments.')
- },
- {
- type: 'text',
- name: 'datadog_env',
- title: s_('DatadogIntegration|Environment'),
- placeholder: 'ci',
- help: ERB::Util.html_escape(
- s_('DatadogIntegration|For self-managed deployments, set the %{codeOpen}env%{codeClose} tag for all the data sent to Datadog. %{linkOpen}How do I use tags?%{linkClose}')
- ) % {
- codeOpen: '<code>'.html_safe,
- codeClose: '</code>'.html_safe,
- linkOpen: '<a href="https://docs.datadoghq.com/getting_started/tagging/#using-tags" target="_blank" rel="noopener noreferrer">'.html_safe,
- linkClose: '</a>'.html_safe
- }
- },
- {
- type: 'textarea',
- name: 'datadog_tags',
- title: s_('DatadogIntegration|Tags'),
- placeholder: "tag:value\nanother_tag:value",
- help: ERB::Util.html_escape(
- s_('DatadogIntegration|Custom tags in Datadog. Enter one tag per line in the %{codeOpen}key:value%{codeClose} format. %{linkOpen}How do I use tags?%{linkClose}')
- ) % {
- codeOpen: '<code>'.html_safe,
- codeClose: '</code>'.html_safe,
- linkOpen: '<a href="https://docs.datadoghq.com/getting_started/tagging/#using-tags" target="_blank" rel="noopener noreferrer">'.html_safe,
- linkClose: '</a>'.html_safe
- }
- }
- ]
-
- f
end
override :hook_url
diff --git a/app/models/integrations/discord.rb b/app/models/integrations/discord.rb
index 790e41e5a2a..ecabf23c90b 100644
--- a/app/models/integrations/discord.rb
+++ b/app/models/integrations/discord.rb
@@ -23,10 +23,6 @@ module Integrations
s_('Send notifications about project events to a Discord channel. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
end
- def event_field(event)
- # No-op.
- end
-
def default_channel_placeholder
# No-op.
end
@@ -43,7 +39,7 @@ module Integrations
type: 'select',
name: 'branches_to_be_notified',
title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices
+ choices: self.class.branch_choices
}
]
end
diff --git a/app/models/integrations/drone_ci.rb b/app/models/integrations/drone_ci.rb
index 35524503dea..b1f72b7144e 100644
--- a/app/models/integrations/drone_ci.rb
+++ b/app/models/integrations/drone_ci.rb
@@ -60,8 +60,7 @@ module Integrations
response = Gitlab::HTTP.try_get(
commit_status_path(sha, ref),
verify: enable_ssl_verification,
- extra_log_info: { project_id: project_id },
- use_read_total_timeout: true
+ extra_log_info: { project_id: project_id }
)
status =
diff --git a/app/models/integrations/emails_on_push.rb b/app/models/integrations/emails_on_push.rb
index ab458bb2c27..ed12a3a8d63 100644
--- a/app/models/integrations/emails_on_push.rb
+++ b/app/models/integrations/emails_on_push.rb
@@ -6,12 +6,35 @@ module Integrations
RECIPIENTS_LIMIT = 750
- boolean_accessor :send_from_committer_email
- boolean_accessor :disable_diffs
- prop_accessor :recipients, :branches_to_be_notified
validates :recipients, presence: true, if: :validate_recipients?
validate :number_of_recipients_within_limit, if: :validate_recipients?
+ field :send_from_committer_email,
+ type: 'checkbox',
+ title: -> { s_("EmailsOnPushService|Send from committer") },
+ help: -> do
+ @help ||= begin
+ domains = Notify.allowed_email_domains.map { |domain| "user@#{domain}" }.join(", ")
+
+ s_("EmailsOnPushService|Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as %{domains}).") % { domains: domains }
+ end
+ end
+
+ field :disable_diffs,
+ type: 'checkbox',
+ title: -> { s_("EmailsOnPushService|Disable code diffs") },
+ help: -> { s_("EmailsOnPushService|Don't include possibly sensitive code diffs in notification body.") }
+
+ field :branches_to_be_notified,
+ type: 'select',
+ title: -> { s_('Integrations|Branches for which notifications are to be sent') },
+ choices: branch_choices
+
+ field :recipients,
+ type: 'textarea',
+ placeholder: -> { s_('EmailsOnPushService|tanuki@example.com gitlab@example.com') },
+ help: -> { s_('EmailsOnPushService|Emails separated by whitespace.') }
+
def self.valid_recipients(recipients)
recipients.split.grep(Devise.email_regexp).uniq(&:downcase)
end
@@ -67,28 +90,6 @@ module Integrations
Gitlab::Utils.to_boolean(self.disable_diffs)
end
- def fields
- domains = Notify.allowed_email_domains.map { |domain| "user@#{domain}" }.join(", ")
- [
- { type: 'checkbox', name: 'send_from_committer_email', title: s_("EmailsOnPushService|Send from committer"),
- help: s_("EmailsOnPushService|Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as %{domains}).") % { domains: domains } },
- { type: 'checkbox', name: 'disable_diffs', title: s_("EmailsOnPushService|Disable code diffs"),
- help: s_("EmailsOnPushService|Don't include possibly sensitive code diffs in notification body.") },
- {
- type: 'select',
- name: 'branches_to_be_notified',
- title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices
- },
- {
- type: 'textarea',
- name: 'recipients',
- placeholder: s_('EmailsOnPushService|tanuki@example.com gitlab@example.com'),
- help: s_('EmailsOnPushService|Emails separated by whitespace.')
- }
- ]
- end
-
private
def number_of_recipients_within_limit
diff --git a/app/models/integrations/external_wiki.rb b/app/models/integrations/external_wiki.rb
index 18c48411e30..bc2ea193a84 100644
--- a/app/models/integrations/external_wiki.rb
+++ b/app/models/integrations/external_wiki.rb
@@ -2,9 +2,14 @@
module Integrations
class ExternalWiki < Integration
- prop_accessor :external_wiki_url
validates :external_wiki_url, presence: true, public_url: true, if: :activated?
+ field :external_wiki_url,
+ title: -> { s_('ExternalWikiService|External wiki URL') },
+ placeholder: -> { s_('ExternalWikiService|https://example.com/xxx/wiki/...') },
+ help: -> { s_('ExternalWikiService|Enter the URL to the external wiki.') },
+ required: true
+
def title
s_('ExternalWikiService|External wiki')
end
@@ -17,19 +22,6 @@ module Integrations
'external_wiki'
end
- def fields
- [
- {
- type: 'text',
- name: 'external_wiki_url',
- title: s_('ExternalWikiService|External wiki URL'),
- placeholder: s_('ExternalWikiService|https://example.com/xxx/wiki/...'),
- help: 'Enter the URL to the external wiki.',
- required: true
- }
- ]
- end
-
def help
docs_link = ActionController::Base.helpers.link_to _('Learn more.'), Rails.application.routes.url_helpers.help_page_url('user/project/wiki/index', anchor: 'link-an-external-wiki'), target: '_blank', rel: 'noopener noreferrer'
@@ -37,7 +29,7 @@ module Integrations
end
def execute(_data)
- response = Gitlab::HTTP.get(properties['external_wiki_url'], verify: true, use_read_total_timeout: true)
+ response = Gitlab::HTTP.get(properties['external_wiki_url'], verify: true)
response.body if response.code == 200
rescue StandardError
nil
diff --git a/app/models/integrations/field.rb b/app/models/integrations/field.rb
index cbda418755b..53c8f5f623e 100644
--- a/app/models/integrations/field.rb
+++ b/app/models/integrations/field.rb
@@ -4,14 +4,16 @@ module Integrations
class Field
SECRET_NAME = %r/token|key|password|passphrase|secret/.freeze
+ BOOLEAN_ATTRIBUTES = %i[required api_only exposes_secrets].freeze
+
ATTRIBUTES = %i[
- section type placeholder required choices value checkbox_label
+ section type placeholder choices value checkbox_label
title help
non_empty_password_help
non_empty_password_title
- api_only
- exposes_secrets
- ].freeze
+ ].concat(BOOLEAN_ATTRIBUTES).freeze
+
+ TYPES = %w[text textarea password checkbox select].freeze
attr_reader :name, :integration_class
@@ -22,6 +24,13 @@ module Integrations
attributes[:type] = SECRET_NAME.match?(@name) ? 'password' : type
attributes[:api_only] = api_only
@attributes = attributes.freeze
+
+ invalid_attributes = attributes.keys - ATTRIBUTES
+ if invalid_attributes.present?
+ raise ArgumentError, "Invalid attributes #{invalid_attributes.inspect}"
+ elsif !TYPES.include?(self[:type])
+ raise ArgumentError, "Invalid type #{self[:type].inspect}"
+ end
end
def [](key)
@@ -34,11 +43,19 @@ module Integrations
end
def secret?
- @attributes[:type] == 'password'
+ self[:type] == 'password'
end
ATTRIBUTES.each do |name|
define_method(name) { self[name] }
end
+
+ BOOLEAN_ATTRIBUTES.each do |name|
+ define_method("#{name}?") { !!self[name] }
+ end
+
+ TYPES.each do |type|
+ define_method("#{type}?") { self[:type] == type }
+ end
end
end
diff --git a/app/models/integrations/flowdock.rb b/app/models/integrations/flowdock.rb
index 703d8013bab..52efb29f2c1 100644
--- a/app/models/integrations/flowdock.rb
+++ b/app/models/integrations/flowdock.rb
@@ -2,9 +2,16 @@
module Integrations
class Flowdock < Integration
- prop_accessor :token
validates :token, presence: true, if: :activated?
+ field :token,
+ type: 'password',
+ help: -> { s_('FlowdockService|Enter your Flowdock token.') },
+ non_empty_password_title: -> { s_('ProjectService|Enter new token') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current token.') },
+ placeholder: '1b609b52537...',
+ required: true
+
def title
'Flowdock'
end
@@ -22,20 +29,6 @@ module Integrations
'flowdock'
end
- def fields
- [
- {
- type: 'password',
- name: 'token',
- help: s_('FlowdockService|Enter your Flowdock token.'),
- non_empty_password_title: s_('ProjectService|Enter new token'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
- placeholder: '1b609b52537...',
- required: true
- }
- ]
- end
-
def self.supported_events
%w(push)
end
diff --git a/app/models/integrations/hangouts_chat.rb b/app/models/integrations/hangouts_chat.rb
index 8c68c9ff95a..df112ad6ca8 100644
--- a/app/models/integrations/hangouts_chat.rb
+++ b/app/models/integrations/hangouts_chat.rb
@@ -19,9 +19,6 @@ module Integrations
s_('Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
end
- def event_field(event)
- end
-
def default_channel_placeholder
end
@@ -42,7 +39,7 @@ module Integrations
type: 'select',
name: 'branches_to_be_notified',
title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices
+ choices: self.class.branch_choices
}
]
end
diff --git a/app/models/integrations/harbor.rb b/app/models/integrations/harbor.rb
index 44813795fc0..82981493822 100644
--- a/app/models/integrations/harbor.rb
+++ b/app/models/integrations/harbor.rb
@@ -4,7 +4,7 @@ module Integrations
class Harbor < Integration
prop_accessor :url, :project_name, :username, :password
- validates :url, public_url: true, presence: true, if: :activated?
+ validates :url, public_url: true, presence: true, addressable_url: { allow_localhost: false, allow_local_network: false }, if: :activated?
validates :project_name, presence: true, if: :activated?
validates :username, presence: true, if: :activated?
validates :password, format: { with: ::Ci::Maskable::REGEX }, if: :activated?
diff --git a/app/models/integrations/irker.rb b/app/models/integrations/irker.rb
index 780f4bef0c9..3f3e321f45e 100644
--- a/app/models/integrations/irker.rb
+++ b/app/models/integrations/irker.rb
@@ -4,13 +4,55 @@ require 'uri'
module Integrations
class Irker < Integration
- prop_accessor :server_host, :server_port, :default_irc_uri
- prop_accessor :recipients, :channels
- boolean_accessor :colorize_messages
validates :recipients, presence: true, if: :validate_recipients?
-
before_validation :get_channels
+ field :server_host,
+ placeholder: 'localhost',
+ title: -> { s_('IrkerService|Server host (optional)') },
+ help: -> { s_('IrkerService|irker daemon hostname (defaults to localhost).') }
+
+ field :server_port,
+ placeholder: 6659,
+ title: -> { s_('IrkerService|Server port (optional)') },
+ help: -> { s_('IrkerService|irker daemon port (defaults to 6659).') }
+
+ field :default_irc_uri,
+ title: -> { s_('IrkerService|Default IRC URI (optional)') },
+ help: -> { s_('IrkerService|URI to add before each recipient.') },
+ placeholder: 'irc://irc.network.net:6697/'
+
+ field :recipients,
+ type: 'textarea',
+ title: -> { s_('IrkerService|Recipients') },
+ placeholder: 'irc[s]://irc.network.net[:port]/#channel',
+ required: true,
+ help: -> do
+ recipients_docs_link = ActionController::Base.helpers.link_to(
+ s_('IrkerService|How to enter channels or users?'),
+ Rails.application.routes.url_helpers.help_page_url(
+ 'user/project/integrations/irker',
+ anchor: 'enter-irker-recipients'
+ ),
+ target: '_blank', rel: 'noopener noreferrer'
+ )
+
+ ERB::Util.html_escape(
+ s_('IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}')
+ ) % {
+ recipients_docs_link: recipients_docs_link.html_safe
+ }
+ end
+
+ field :colorize_messages,
+ type: 'checkbox',
+ title: -> { _('Colorize messages') }
+
+ # NOTE: This field is only used internally to store the parsed
+ # channels from the `recipients` field, it should not be exposed
+ # in the UI or API.
+ prop_accessor :channels
+
def title
s_('IrkerService|irker (IRC gateway)')
end
@@ -30,17 +72,10 @@ module Integrations
def execute(data)
return unless supported_events.include?(data[:object_kind])
- if Feature.enabled?(:rename_integrations_workers)
- Integrations::IrkerWorker.perform_async(
- project_id, channels,
- colorize_messages, data, settings
- )
- else
- ::IrkerWorker.perform_async(
- project_id, channels,
- colorize_messages, data, settings
- )
- end
+ Integrations::IrkerWorker.perform_async(
+ project_id, channels,
+ colorize_messages, data, settings
+ )
end
def settings
@@ -50,34 +85,6 @@ module Integrations
}
end
- def fields
- recipients_docs_link = ActionController::Base.helpers.link_to(
- s_('IrkerService|How to enter channels or users?'),
- Rails.application.routes.url_helpers.help_page_url(
- 'user/project/integrations/irker',
- anchor: 'enter-irker-recipients'
- ),
- target: '_blank', rel: 'noopener noreferrer'
- )
-
- [
- { type: 'text', name: 'server_host', placeholder: 'localhost', title: s_('IrkerService|Server host (optional)'),
- help: s_('IrkerService|irker daemon hostname (defaults to localhost).') },
- { type: 'text', name: 'server_port', placeholder: 6659, title: s_('IrkerService|Server port (optional)'),
- help: s_('IrkerService|irker daemon port (defaults to 6659).') },
- { type: 'text', name: 'default_irc_uri', title: s_('IrkerService|Default IRC URI (optional)'),
- help: s_('IrkerService|URI to add before each recipient.'),
- placeholder: 'irc://irc.network.net:6697/' },
- { type: 'textarea', name: 'recipients', title: s_('IrkerService|Recipients'),
- placeholder: 'irc[s]://irc.network.net[:port]/#channel', required: true,
- help: format(
- s_('IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}').html_safe,
- recipients_docs_link: recipients_docs_link.html_safe
- ) },
- { type: 'checkbox', name: 'colorize_messages', title: _('Colorize messages') }
- ]
- end
-
def help
docs_link = ActionController::Base.helpers.link_to(
_('Learn more.'),
diff --git a/app/models/integrations/jira.rb b/app/models/integrations/jira.rb
index 125f52104d4..c9c9b9d59d6 100644
--- a/app/models/integrations/jira.rb
+++ b/app/models/integrations/jira.rb
@@ -71,11 +71,12 @@ module Integrations
non_empty_password_help: -> { s_('JiraService|Leave blank to use your current password or API token.') },
help: -> { s_('JiraService|Use a password for server version and an API token for cloud version.') }
+ field :jira_issue_transition_id, api_only: true
+
# TODO: we can probably just delegate as part of
# https://gitlab.com/gitlab-org/gitlab/issues/29404
# These fields are API only, so no field definition is required.
data_field :jira_issue_transition_automatic
- data_field :jira_issue_transition_id
data_field :project_key
data_field :issues_enabled
data_field :vulnerabilities_enabled
diff --git a/app/models/integrations/mattermost.rb b/app/models/integrations/mattermost.rb
index d9ccbb7ea34..dae11b99bc5 100644
--- a/app/models/integrations/mattermost.rb
+++ b/app/models/integrations/mattermost.rb
@@ -3,6 +3,7 @@
module Integrations
class Mattermost < BaseChatNotification
include SlackMattermostNotifier
+ extend ::Gitlab::Utils::Override
def title
s_('Mattermost notifications')
@@ -28,5 +29,10 @@ module Integrations
def webhook_placeholder
'http://mattermost.example.com/hooks/'
end
+
+ override :configurable_channels?
+ def configurable_channels?
+ true
+ end
end
end
diff --git a/app/models/integrations/microsoft_teams.rb b/app/models/integrations/microsoft_teams.rb
index 625ee0bc522..69863f164cd 100644
--- a/app/models/integrations/microsoft_teams.rb
+++ b/app/models/integrations/microsoft_teams.rb
@@ -22,9 +22,6 @@ module Integrations
'https://outlook.office.com/webhook/…'
end
- def event_field(event)
- end
-
def default_channel_placeholder
end
@@ -47,7 +44,7 @@ module Integrations
section: SECTION_TYPE_CONFIGURATION,
name: 'branches_to_be_notified',
title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices
+ choices: self.class.branch_choices
}
]
end
diff --git a/app/models/integrations/mock_ci.rb b/app/models/integrations/mock_ci.rb
index 0b3a9bc5405..2d8e26d409f 100644
--- a/app/models/integrations/mock_ci.rb
+++ b/app/models/integrations/mock_ci.rb
@@ -49,7 +49,7 @@ module Integrations
# # => 'running'
#
def commit_status(sha, ref)
- response = Gitlab::HTTP.get(commit_status_path(sha), verify: enable_ssl_verification, use_read_total_timeout: true)
+ response = Gitlab::HTTP.get(commit_status_path(sha), verify: enable_ssl_verification)
read_commit_status(response)
rescue Errno::ECONNREFUSED
:error
diff --git a/app/models/integrations/packagist.rb b/app/models/integrations/packagist.rb
index 758c9e4761b..05ee919892d 100644
--- a/app/models/integrations/packagist.rb
+++ b/app/models/integrations/packagist.rb
@@ -5,7 +5,25 @@ module Integrations
include HasWebHook
extend Gitlab::Utils::Override
- prop_accessor :username, :token, :server
+ field :username,
+ title: -> { _('Username') },
+ help: -> { s_('Enter your Packagist username.') },
+ placeholder: '',
+ required: true
+
+ field :token,
+ type: 'password',
+ title: -> { _('Token') },
+ help: -> { s_('Enter your Packagist token.') },
+ non_empty_password_title: -> { s_('ProjectService|Enter new token') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current token.') },
+ placeholder: '',
+ required: true
+
+ field :server,
+ title: -> { _('Server (optional)') },
+ help: -> { s_('Enter your Packagist server. Defaults to https://packagist.org.') },
+ placeholder: 'https://packagist.org'
validates :username, presence: true, if: :activated?
validates :token, presence: true, if: :activated?
@@ -22,37 +40,6 @@ module Integrations
'packagist'
end
- def fields
- [
- {
- type: 'text',
- name: 'username',
- title: _('Username'),
- help: s_('Enter your Packagist username.'),
- placeholder: '',
- required: true
- },
- {
- type: 'password',
- name: 'token',
- title: _('Token'),
- help: s_('Enter your Packagist token.'),
- non_empty_password_title: s_('ProjectService|Enter new token'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
- placeholder: '',
- required: true
- },
- {
- type: 'text',
- name: 'server',
- title: _('Server (optional)'),
- help: s_('Enter your Packagist server. Defaults to https://packagist.org.'),
- placeholder: 'https://packagist.org',
- required: false
- }
- ]
- end
-
def self.supported_events
%w(push merge_request tag_push)
end
diff --git a/app/models/integrations/pipelines_email.rb b/app/models/integrations/pipelines_email.rb
index f15482dc2e1..77cbba25f2c 100644
--- a/app/models/integrations/pipelines_email.rb
+++ b/app/models/integrations/pipelines_email.rb
@@ -6,11 +6,26 @@ module Integrations
RECIPIENTS_LIMIT = 30
- prop_accessor :recipients, :branches_to_be_notified
- boolean_accessor :notify_only_broken_pipelines, :notify_only_default_branch
validates :recipients, presence: true, if: :validate_recipients?
validate :number_of_recipients_within_limit, if: :validate_recipients?
+ field :recipients,
+ type: 'textarea',
+ help: -> { _('Comma-separated list of email addresses.') },
+ required: true
+
+ field :notify_only_broken_pipelines,
+ type: 'checkbox'
+
+ field :notify_only_default_branch,
+ type: 'checkbox',
+ api_only: true
+
+ field :branches_to_be_notified,
+ type: 'select',
+ title: -> { s_('Integrations|Branches for which notifications are to be sent') },
+ choices: branch_choices
+
def initialize_properties
super
@@ -65,21 +80,6 @@ module Integrations
project&.ci_pipelines&.any?
end
- def fields
- [
- { type: 'textarea',
- name: 'recipients',
- help: _('Comma-separated list of email addresses.'),
- required: true },
- { type: 'checkbox',
- name: 'notify_only_broken_pipelines' },
- { type: 'select',
- name: 'branches_to_be_notified',
- title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices }
- ]
- end
-
def test(data)
result = execute(data, force: true)
diff --git a/app/models/integrations/pivotaltracker.rb b/app/models/integrations/pivotaltracker.rb
index 931ccf46655..d32fb974339 100644
--- a/app/models/integrations/pivotaltracker.rb
+++ b/app/models/integrations/pivotaltracker.rb
@@ -4,9 +4,22 @@ module Integrations
class Pivotaltracker < Integration
API_ENDPOINT = 'https://www.pivotaltracker.com/services/v5/source_commits'
- prop_accessor :token, :restrict_to_branch
validates :token, presence: true, if: :activated?
+ field :token,
+ type: 'password',
+ help: -> { s_('PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user.') },
+ non_empty_password_title: -> { s_('ProjectService|Enter new token') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current token.') },
+ required: true
+
+ field :restrict_to_branch,
+ title: -> { s_('Integrations|Restrict to branch (optional)') },
+ help: -> do
+ s_('PivotalTrackerService|Comma-separated list of branches to ' \
+ 'automatically inspect. Leave blank to include all branches.')
+ end
+
def title
'Pivotal Tracker'
end
@@ -24,26 +37,6 @@ module Integrations
'pivotaltracker'
end
- def fields
- [
- {
- type: 'password',
- name: 'token',
- help: s_('PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user.'),
- non_empty_password_title: s_('ProjectService|Enter new token'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
- required: true
- },
- {
- type: 'text',
- name: 'restrict_to_branch',
- title: 'Restrict to branch (optional)',
- help: s_('PivotalTrackerService|Comma-separated list of branches to ' \
- 'automatically inspect. Leave blank to include all branches.')
- }
- ]
- end
-
def self.supported_events
%w(push)
end
diff --git a/app/models/integrations/prometheus.rb b/app/models/integrations/prometheus.rb
index 36060565317..e672a985810 100644
--- a/app/models/integrations/prometheus.rb
+++ b/app/models/integrations/prometheus.rb
@@ -4,11 +4,30 @@ 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
+ field :manual_configuration,
+ type: 'checkbox',
+ title: -> { s_('PrometheusService|Active') },
+ help: -> { s_('PrometheusService|Select this checkbox to override the auto configuration settings with your own settings.') },
+ required: true
+
+ field :api_url,
+ title: 'API URL',
+ placeholder: -> { s_('PrometheusService|https://prometheus.example.com/') },
+ help: -> { s_('PrometheusService|The Prometheus API base URL.') },
+ required: true
+
+ field :google_iap_audience_client_id,
+ title: 'Google IAP Audience Client ID',
+ placeholder: -> { s_('PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com') },
+ help: -> { s_('PrometheusService|The ID of the IAP-secured resource.') },
+ required: false
+
+ field :google_iap_service_account_json,
+ type: 'textarea',
+ 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
# We need to allow the self-monitoring project to connect to the internal
# Prometheus instance.
@@ -45,43 +64,6 @@ module Integrations
'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|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)
return { success: false, result: 'Prometheus configuration error' } unless prometheus_client
diff --git a/app/models/integrations/pushover.rb b/app/models/integrations/pushover.rb
index 7fd5efa8765..791e27c5db7 100644
--- a/app/models/integrations/pushover.rb
+++ b/app/models/integrations/pushover.rb
@@ -4,9 +4,73 @@ module Integrations
class Pushover < Integration
BASE_URI = 'https://api.pushover.net/1'
- prop_accessor :api_key, :user_key, :device, :priority, :sound
validates :api_key, :user_key, :priority, presence: true, if: :activated?
+ field :api_key,
+ type: 'password',
+ title: -> { _('API key') },
+ help: -> { s_('PushoverService|Enter your application key.') },
+ non_empty_password_title: -> { s_('ProjectService|Enter new API key') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current API key.') },
+ placeholder: '',
+ required: true
+
+ field :user_key,
+ type: 'password',
+ title: -> { _('User key') },
+ help: -> { s_('PushoverService|Enter your user key.') },
+ non_empty_password_title: -> { s_('PushoverService|Enter new user key') },
+ non_empty_password_help: -> { s_('PushoverService|Leave blank to use your current user key.') },
+ placeholder: '',
+ required: true
+
+ field :device,
+ title: -> { _('Devices (optional)') },
+ help: -> { s_('PushoverService|Leave blank for all active devices.') },
+ placeholder: ''
+
+ field :priority,
+ type: 'select',
+ required: true,
+ choices: -> do
+ [
+ [s_('PushoverService|Lowest priority'), -2],
+ [s_('PushoverService|Low priority'), -1],
+ [s_('PushoverService|Normal priority'), 0],
+ [s_('PushoverService|High priority'), 1]
+ ]
+ end
+
+ field :sound,
+ type: 'select',
+ choices: -> do
+ [
+ ['Device default sound', nil],
+ ['Pushover (default)', 'pushover'],
+ %w(Bike bike),
+ %w(Bugle bugle),
+ ['Cash Register', 'cashregister'],
+ %w(Classical classical),
+ %w(Cosmic cosmic),
+ %w(Falling falling),
+ %w(Gamelan gamelan),
+ %w(Incoming incoming),
+ %w(Intermission intermission),
+ %w(Magic magic),
+ %w(Mechanical mechanical),
+ ['Piano Bar', 'pianobar'],
+ %w(Siren siren),
+ ['Space Alarm', 'spacealarm'],
+ ['Tug Boat', 'tugboat'],
+ ['Alien Alarm (long)', 'alien'],
+ ['Climb (long)', 'climb'],
+ ['Persistent (long)', 'persistent'],
+ ['Pushover Echo (long)', 'echo'],
+ ['Up Down (long)', 'updown'],
+ ['None (silent)', 'none']
+ ]
+ end
+
def title
'Pushover'
end
@@ -19,81 +83,6 @@ module Integrations
'pushover'
end
- def fields
- [
- {
- type: 'password',
- name: 'api_key',
- title: _('API key'),
- help: s_('PushoverService|Enter your application key.'),
- non_empty_password_title: s_('ProjectService|Enter new API key'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current API key.'),
- placeholder: '',
- required: true
- },
- {
- type: 'password',
- name: 'user_key',
- title: _('User key'),
- help: s_('PushoverService|Enter your user key.'),
- non_empty_password_title: s_('PushoverService|Enter new user key'),
- non_empty_password_help: s_('PushoverService|Leave blank to use your current user key.'),
- placeholder: '',
- required: true
- },
- {
- type: 'text',
- name: 'device',
- title: _('Devices (optional)'),
- help: s_('PushoverService|Leave blank for all active devices.'),
- placeholder: ''
- },
- {
- type: 'select',
- name: 'priority',
- required: true,
- choices:
- [
- [s_('PushoverService|Lowest priority'), -2],
- [s_('PushoverService|Low priority'), -1],
- [s_('PushoverService|Normal priority'), 0],
- [s_('PushoverService|High priority'), 1]
- ],
- default_choice: 0
- },
- {
- type: 'select',
- name: 'sound',
- choices:
- [
- ['Device default sound', nil],
- ['Pushover (default)', 'pushover'],
- %w(Bike bike),
- %w(Bugle bugle),
- ['Cash Register', 'cashregister'],
- %w(Classical classical),
- %w(Cosmic cosmic),
- %w(Falling falling),
- %w(Gamelan gamelan),
- %w(Incoming incoming),
- %w(Intermission intermission),
- %w(Magic magic),
- %w(Mechanical mechanical),
- ['Piano Bar', 'pianobar'],
- %w(Siren siren),
- ['Space Alarm', 'spacealarm'],
- ['Tug Boat', 'tugboat'],
- ['Alien Alarm (long)', 'alien'],
- ['Climb (long)', 'climb'],
- ['Persistent (long)', 'persistent'],
- ['Pushover Echo (long)', 'echo'],
- ['Up Down (long)', 'updown'],
- ['None (silent)', 'none']
- ]
- }
- ]
- end
-
def self.supported_events
%w(push)
end
diff --git a/app/models/integrations/shimo.rb b/app/models/integrations/shimo.rb
index dd25a0bc558..8bc296e0320 100644
--- a/app/models/integrations/shimo.rb
+++ b/app/models/integrations/shimo.rb
@@ -2,9 +2,12 @@
module Integrations
class Shimo < BaseThirdPartyWiki
- prop_accessor :external_wiki_url
validates :external_wiki_url, presence: true, public_url: true, if: :activated?
+ field :external_wiki_url,
+ title: -> { s_('Shimo|Shimo Workspace URL') },
+ required: true
+
def render?
return false unless Feature.enabled?(:shimo_integration, project)
@@ -25,21 +28,10 @@ module Integrations
# support for `test` method
def execute(_data)
- response = Gitlab::HTTP.get(properties['external_wiki_url'], verify: true, use_read_total_timeout: true)
+ response = Gitlab::HTTP.get(properties['external_wiki_url'], verify: true)
response.body if response.code == 200
rescue StandardError
nil
end
-
- def fields
- [
- {
- type: 'text',
- name: 'external_wiki_url',
- title: s_('Shimo|Shimo Workspace URL'),
- required: true
- }
- ]
- end
end
end
diff --git a/app/models/integrations/slack.rb b/app/models/integrations/slack.rb
index 0381db3a67e..93263229109 100644
--- a/app/models/integrations/slack.rb
+++ b/app/models/integrations/slack.rb
@@ -55,5 +55,10 @@ module Integrations
Gitlab::UsageDataCounters::HLLRedisCounter.track_event(key, values: user_id)
end
+
+ override :configurable_channels?
+ def configurable_channels?
+ true
+ end
end
end
diff --git a/app/models/integrations/teamcity.rb b/app/models/integrations/teamcity.rb
index a23aa5f783d..e0299c9ac5f 100644
--- a/app/models/integrations/teamcity.rb
+++ b/app/models/integrations/teamcity.rb
@@ -156,7 +156,7 @@ module Integrations
end
def get_path(path)
- Gitlab::HTTP.try_get(build_url(path), verify: enable_ssl_verification, basic_auth: basic_auth, extra_log_info: { project_id: project_id }, use_read_total_timeout: true)
+ Gitlab::HTTP.try_get(build_url(path), verify: enable_ssl_verification, basic_auth: basic_auth, extra_log_info: { project_id: project_id })
end
def post_to_build_queue(data, branch)
@@ -167,8 +167,7 @@ module Integrations
'</build>',
headers: { 'Content-type' => 'application/xml' },
verify: enable_ssl_verification,
- basic_auth: basic_auth,
- use_read_total_timeout: true
+ basic_auth: basic_auth
)
end
diff --git a/app/models/integrations/unify_circuit.rb b/app/models/integrations/unify_circuit.rb
index f085423d229..f10a75fac5d 100644
--- a/app/models/integrations/unify_circuit.rb
+++ b/app/models/integrations/unify_circuit.rb
@@ -19,9 +19,6 @@ module Integrations
s_('Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
end
- def event_field(event)
- end
-
def default_channel_placeholder
end
@@ -38,7 +35,7 @@ module Integrations
type: 'select',
name: 'branches_to_be_notified',
title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices
+ choices: self.class.branch_choices
}
]
end
@@ -49,8 +46,7 @@ module Integrations
response = Gitlab::HTTP.post(webhook, body: {
subject: message.project_name,
text: message.summary,
- markdown: true,
- use_read_total_timeout: true
+ markdown: true
}.to_json)
response if response.success?
diff --git a/app/models/integrations/webex_teams.rb b/app/models/integrations/webex_teams.rb
index 345dd98cbc1..75be457dcf5 100644
--- a/app/models/integrations/webex_teams.rb
+++ b/app/models/integrations/webex_teams.rb
@@ -19,9 +19,6 @@ module Integrations
s_("WebexTeamsService|Send notifications about project events to a Webex Teams conversation. %{docs_link}") % { docs_link: docs_link.html_safe }
end
- def event_field(event)
- end
-
def default_channel_placeholder
end
@@ -38,7 +35,7 @@ module Integrations
type: 'select',
name: 'branches_to_be_notified',
title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: branch_choices
+ choices: self.class.branch_choices
}
]
end
@@ -47,7 +44,7 @@ module Integrations
def notify(message, opts)
header = { 'Content-Type' => 'application/json' }
- response = Gitlab::HTTP.post(webhook, headers: header, body: { markdown: message.summary }.to_json, use_read_total_timeout: true)
+ response = Gitlab::HTTP.post(webhook, headers: header, body: { markdown: message.summary }.to_json)
response if response.success?
end
diff --git a/app/models/integrations/youtrack.rb b/app/models/integrations/youtrack.rb
index ab6e1da27f8..fa719f925ed 100644
--- a/app/models/integrations/youtrack.rb
+++ b/app/models/integrations/youtrack.rb
@@ -33,10 +33,7 @@ module Integrations
end
def fields
- [
- { type: 'text', name: 'project_url', title: _('Project URL'), help: s_('IssueTracker|The URL to the project in YouTrack.'), required: true },
- { type: 'text', name: 'issues_url', title: s_('ProjectService|Issue URL'), help: s_('IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}.') % { colon_id: '<code>:id</code>'.html_safe }, required: true }
- ]
+ super.select { _1.name.in?(%w[project_url issues_url]) }
end
end
end
diff --git a/app/models/integrations/zentao.rb b/app/models/integrations/zentao.rb
index c33df465fde..11db469f7ee 100644
--- a/app/models/integrations/zentao.rb
+++ b/app/models/integrations/zentao.rb
@@ -4,7 +4,28 @@ module Integrations
class Zentao < Integration
include Gitlab::Routing
- data_field :url, :api_url, :api_token, :zentao_product_xid
+ self.field_storage = :data_fields
+
+ field :url,
+ title: -> { s_('ZentaoIntegration|ZenTao Web URL') },
+ placeholder: 'https://www.zentao.net',
+ help: -> { s_('ZentaoIntegration|Base URL of the ZenTao instance.') },
+ required: true
+
+ field :api_url,
+ title: -> { s_('ZentaoIntegration|ZenTao API URL (optional)') },
+ help: -> { s_('ZentaoIntegration|If different from Web URL.') }
+
+ field :api_token,
+ type: 'password',
+ title: -> { s_('ZentaoIntegration|ZenTao API token') },
+ non_empty_password_title: -> { s_('ZentaoIntegration|Enter new ZenTao API token') },
+ non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current token.') },
+ required: true
+
+ field :zentao_product_xid,
+ title: -> { s_('ZentaoIntegration|ZenTao Product ID') },
+ required: true
validates :url, public_url: true, presence: true, if: :activated?
validates :api_url, public_url: true, allow_blank: true
@@ -47,39 +68,6 @@ module Integrations
%w()
end
- def fields
- [
- {
- type: 'text',
- name: 'url',
- title: s_('ZentaoIntegration|ZenTao Web URL'),
- placeholder: 'https://www.zentao.net',
- help: s_('ZentaoIntegration|Base URL of the ZenTao instance.'),
- required: true
- },
- {
- type: 'text',
- name: 'api_url',
- title: s_('ZentaoIntegration|ZenTao API URL (optional)'),
- help: s_('ZentaoIntegration|If different from Web URL.')
- },
- {
- type: 'password',
- name: 'api_token',
- title: s_('ZentaoIntegration|ZenTao API token'),
- non_empty_password_title: s_('ZentaoIntegration|Enter new ZenTao API token'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
- required: true
- },
- {
- type: 'text',
- name: 'zentao_product_xid',
- title: s_('ZentaoIntegration|ZenTao Product ID'),
- required: true
- }
- ]
- end
-
private
def client
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 47aa2b24feb..cae42115bef 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -46,7 +46,7 @@ class Issue < ApplicationRecord
TYPES_FOR_LIST = %w(issue incident).freeze
belongs_to :project
- has_one :namespace, through: :project
+ belongs_to :namespace, inverse_of: :issues
belongs_to :duplicated_to, class_name: 'Issue'
belongs_to :closed_by, class_name: 'User'
@@ -98,6 +98,7 @@ class Issue < ApplicationRecord
validates :project, presence: true
validates :issue_type, presence: true
+ validates :namespace, presence: true, if: -> { project.present? }
enum issue_type: WorkItems::Type.base_types
@@ -123,8 +124,24 @@ class Issue < ApplicationRecord
scope :order_due_date_desc, -> { reorder(arel_table[:due_date].desc.nulls_last) }
scope :order_closest_future_date, -> { reorder(Arel.sql('CASE WHEN issues.due_date >= CURRENT_DATE THEN 0 ELSE 1 END ASC, ABS(CURRENT_DATE - issues.due_date) ASC')) }
scope :order_created_at_desc, -> { reorder(created_at: :desc) }
- scope :order_severity_asc, -> { includes(:issuable_severity).order('issuable_severities.severity ASC NULLS FIRST') }
- scope :order_severity_desc, -> { includes(:issuable_severity).order('issuable_severities.severity DESC NULLS LAST') }
+ scope :order_severity_asc, -> do
+ build_keyset_order_on_joined_column(
+ scope: includes(:issuable_severity),
+ attribute_name: 'issuable_severities_severity',
+ column: IssuableSeverity.arel_table[:severity],
+ direction: :asc,
+ nullable: :nulls_first
+ )
+ end
+ scope :order_severity_desc, -> do
+ build_keyset_order_on_joined_column(
+ scope: includes(:issuable_severity),
+ attribute_name: 'issuable_severities_severity',
+ column: IssuableSeverity.arel_table[:severity],
+ direction: :desc,
+ nullable: :nulls_last
+ )
+ end
scope :order_escalation_status_asc, -> { includes(:incident_management_issuable_escalation_status).order(IncidentManagement::IssuableEscalationStatus.arel_table[:status].asc.nulls_last).references(:incident_management_issuable_escalation_status) }
scope :order_escalation_status_desc, -> { includes(:incident_management_issuable_escalation_status).order(IncidentManagement::IssuableEscalationStatus.arel_table[:status].desc.nulls_last).references(:incident_management_issuable_escalation_status) }
scope :order_closed_at_asc, -> { reorder(arel_table[:closed_at].asc.nulls_last) }
@@ -184,6 +201,8 @@ class Issue < ApplicationRecord
scope :with_null_relative_position, -> { where(relative_position: nil) }
scope :with_non_null_relative_position, -> { where.not(relative_position: nil) }
+ before_validation :ensure_namespace_id
+
after_commit :expire_etag_cache, unless: :importing?
after_save :ensure_metrics, unless: :importing?
after_create_commit :record_create_action, unless: :importing?
@@ -231,6 +250,31 @@ class Issue < ApplicationRecord
alias_method :with_state, :with_state_id
alias_method :with_states, :with_state_ids
+ def build_keyset_order_on_joined_column(scope:, attribute_name:, column:, direction:, nullable:)
+ reversed_direction = direction == :asc ? :desc : :asc
+
+ # rubocop: disable GitlabSecurity/PublicSend
+ order = ::Gitlab::Pagination::Keyset::Order.build([
+ ::Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: attribute_name,
+ column_expression: column,
+ order_expression: column.send(direction).send(nullable),
+ reversed_order_expression: column.send(reversed_direction).send(nullable),
+ order_direction: direction,
+ distinct: false,
+ add_to_projections: true,
+ nullable: nullable
+ ),
+ ::Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ order_expression: arel_table['id'].desc
+ )
+ ])
+ # rubocop: enable GitlabSecurity/PublicSend
+
+ order.apply_cursor_conditions(scope).order(order)
+ end
+
override :order_upvotes_desc
def order_upvotes_desc
reorder(upvotes_count: :desc)
@@ -328,11 +372,11 @@ class Issue < ApplicationRecord
when 'due_date', 'due_date_asc' then order_due_date_asc.with_order_id_desc
when 'due_date_desc' then order_due_date_desc.with_order_id_desc
when 'relative_position', 'relative_position_asc' then order_by_relative_position
- when 'severity_asc' then order_severity_asc.with_order_id_desc
- when 'severity_desc' then order_severity_desc.with_order_id_desc
- when 'escalation_status_asc' then order_escalation_status_asc.with_order_id_desc
- when 'escalation_status_desc' then order_escalation_status_desc.with_order_id_desc
- when 'closed_at_asc' then order_closed_at_asc
+ when 'severity_asc' then order_severity_asc
+ when 'severity_desc' then order_severity_desc
+ when 'escalation_status_asc' then order_escalation_status_asc
+ when 'escalation_status_desc' then order_escalation_status_desc
+ when 'closed_at', 'closed_at_asc' then order_closed_at_asc
when 'closed_at_desc' then order_closed_at_desc
else
super
@@ -405,14 +449,6 @@ class Issue < ApplicationRecord
end
end
- # Returns boolean if a related branch exists for the current issue
- # ignores merge requests branchs
- def has_related_branch?
- project.repository.branch_names.any? do |branch|
- /\A#{iid}-(?!\d+-stable)/i =~ branch
- end
- end
-
# To allow polymorphism with MergeRequest.
def source_project
project
@@ -656,6 +692,10 @@ class Issue < ApplicationRecord
# Symptom of running out of space - schedule rebalancing
Issues::RebalancingWorker.perform_async(nil, *project.self_or_root_group_ids)
end
+
+ def ensure_namespace_id
+ self.namespace = project.project_namespace if project
+ end
end
Issue.prepend_mod_with('Issue')
diff --git a/app/models/key.rb b/app/models/key.rb
index 5268ce2e040..9f6029cc5d4 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -28,7 +28,7 @@ class Key < ApplicationRecord
validate :key_meets_restrictions
validate :expiration, on: :create
- validate :banned_key, if: :should_check_for_banned_key?
+ validate :banned_key, if: :key_changed?
delegate :name, :email, to: :user, prefix: true
@@ -121,6 +121,12 @@ class Key < ApplicationRecord
@public_key ||= Gitlab::SSHPublicKey.new(key)
end
+ def ensure_sha256_fingerprint!
+ return if self.fingerprint_sha256
+
+ save if generate_fingerprint
+ end
+
private
def generate_fingerprint
@@ -143,12 +149,6 @@ class Key < ApplicationRecord
end
end
- def should_check_for_banned_key?
- return false unless user
-
- key_changed? && Feature.enabled?(:ssh_banned_key, user)
- end
-
def banned_key
return unless public_key.banned?
diff --git a/app/models/member.rb b/app/models/member.rb
index bb5d2b10f8e..dcca63b5691 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -219,7 +219,23 @@ class Member < ApplicationRecord
class << self
def search(query)
- joins(:user).merge(User.search(query, use_minimum_char_limit: false))
+ scope = joins(:user).merge(User.search(query, use_minimum_char_limit: false))
+
+ return scope unless Gitlab::Pagination::Keyset::Order.keyset_aware?(scope)
+
+ # If the User.search method returns keyset pagination aware AR scope then we
+ # need call apply_cursor_conditions which adds the ORDER BY columns from the scope
+ # to the SELECT clause.
+ #
+ # Why is this needed:
+ # When using keyset pagination, the next page is loaded using the ORDER BY
+ # values of the last record (cursor). This query selects `members.*` and
+ # orders by a custom SQL expression on `users` and `users.name`. The values
+ # will not be part of `members.*`.
+ #
+ # Result: `SELECT members.*, users.column1, users.column2 FROM members ...`
+ order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
+ order.apply_cursor_conditions(scope).reorder(order)
end
def search_invite_email(query)
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 791cb6f0dff..c97f00364fd 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -21,30 +21,30 @@ class ProjectMember < Member
end
class << self
- # Add users to projects with passed access option
+ # Add members to projects with passed access option
#
# access can be an integer representing a access code
# or symbol like :maintainer representing role
#
# Ex.
- # add_users_to_projects(
+ # add_members_to_projects(
# project_ids,
# user_ids,
# ProjectMember::MAINTAINER
# )
#
- # add_users_to_projects(
+ # add_members_to_projects(
# project_ids,
# user_ids,
# :maintainer
# )
#
- def add_users_to_projects(project_ids, users, access_level, current_user: nil, expires_at: nil)
+ def add_members_to_projects(project_ids, users, access_level, current_user: nil, expires_at: nil)
self.transaction do
project_ids.each do |project_id|
project = Project.find(project_id)
- Members::Projects::CreatorService.add_users( # rubocop:disable CodeReuse/ServiceClass
+ Members::Projects::CreatorService.add_members( # rubocop:disable CodeReuse/ServiceClass
project,
users,
access_level,
@@ -111,7 +111,7 @@ class ProjectMember < Member
# rubocop:disable CodeReuse/ServiceClass
if blocking
- AuthorizedProjectUpdate::ProjectRecalculatePerUserService.new(project, user).execute
+ AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker.bulk_perform_and_wait([[project.id, user.id]])
else
AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker.perform_async(project.id, user.id)
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 1a3464d05a2..ec97ab0ea42 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -174,6 +174,10 @@ class MergeRequest < ApplicationRecord
merge_request.merge_jid = nil
end
+ before_transition any => :closed do |merge_request|
+ merge_request.merge_error = nil
+ end
+
after_transition any => :opened do |merge_request|
merge_request.run_after_commit do
UpdateHeadPipelineForMergeRequestWorker.perform_async(merge_request.id)
@@ -1567,6 +1571,7 @@ class MergeRequest < ApplicationRecord
variables.append(key: 'CI_MERGE_REQUEST_PROJECT_PATH', value: project.full_path)
variables.append(key: 'CI_MERGE_REQUEST_PROJECT_URL', value: project.web_url)
variables.append(key: 'CI_MERGE_REQUEST_TARGET_BRANCH_NAME', value: target_branch.to_s)
+ variables.append(key: 'CI_MERGE_REQUEST_TARGET_BRANCH_PROTECTED', value: ProtectedBranch.protected?(target_project, target_branch).to_s)
variables.append(key: 'CI_MERGE_REQUEST_TITLE', value: title)
variables.append(key: 'CI_MERGE_REQUEST_ASSIGNEES', value: assignee_username_list) if assignees.present?
variables.append(key: 'CI_MERGE_REQUEST_MILESTONE', value: milestone.title) if milestone
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index 87afb7a489a..e08b2cc2a7d 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -21,6 +21,10 @@ class MergeRequestDiff < ApplicationRecord
# from the database if this sentinel is seen
FILES_COUNT_SENTINEL = 2**15 - 1
+ # External diff cache key used by diffs export
+ EXTERNAL_DIFFS_CACHE_TMPDIR = 'project-%{project_id}-external-mr-%{mr_id}-diff-%{id}-cache'
+ EXTERNAL_DIFF_CACHE_CHUNK_SIZE = 8.megabytes
+
belongs_to :merge_request
manual_inverse_association :merge_request, :merge_request_diff
@@ -545,6 +549,28 @@ class MergeRequestDiff < ApplicationRecord
merge_request_diff_files.reset
end
+ # Yields locally cached external diff if it's externally stored.
+ # Used during Project Export to speed up externally
+ # stored merge request diffs export
+ def cached_external_diff
+ return yield(nil) unless stored_externally?
+
+ cache_external_diff unless File.exist?(external_diff_cache_filepath)
+
+ File.open(external_diff_cache_filepath) do |file|
+ yield(file)
+ end
+ end
+
+ def remove_cached_external_diff
+ Gitlab::Utils.check_path_traversal!(external_diff_cache_dir)
+ Gitlab::Utils.check_allowed_absolute_path!(external_diff_cache_dir, [Dir.tmpdir])
+
+ return unless Dir.exist?(external_diff_cache_dir)
+
+ FileUtils.rm_rf(external_diff_cache_dir)
+ end
+
private
def convert_external_diffs_to_database
@@ -791,6 +817,31 @@ class MergeRequestDiff < ApplicationRecord
def sort_diffs(diffs)
Gitlab::Diff::FileCollectionSorter.new(diffs).sort
end
+
+ # Downloads external diff to a temp storage location.
+ def cache_external_diff
+ return unless stored_externally?
+ return if File.exist?(external_diff_cache_filepath)
+
+ Dir.mkdir(external_diff_cache_dir) unless Dir.exist?(external_diff_cache_dir)
+
+ opening_external_diff do |external_diff|
+ File.open(external_diff_cache_filepath, 'wb') do |file|
+ file.write(external_diff.read(EXTERNAL_DIFF_CACHE_CHUNK_SIZE)) until external_diff.eof?
+ end
+ end
+ end
+
+ def external_diff_cache_filepath
+ File.join(external_diff_cache_dir, "diff-#{id}")
+ end
+
+ def external_diff_cache_dir
+ File.join(
+ Dir.tmpdir,
+ EXTERNAL_DIFFS_CACHE_TMPDIR % { project_id: project.id, mr_id: merge_request_id, id: id }
+ )
+ end
end
MergeRequestDiff.prepend_mod_with('MergeRequestDiff')
diff --git a/app/models/merge_request_diff_file.rb b/app/models/merge_request_diff_file.rb
index f7648937c1d..36902e43a77 100644
--- a/app/models/merge_request_diff_file.rb
+++ b/app/models/merge_request_diff_file.rb
@@ -15,7 +15,12 @@ class MergeRequestDiffFile < ApplicationRecord
end
def utf8_diff
- fetched_diff = diff
+ fetched_diff = if Feature.enabled?(:externally_stored_diffs_caching_export) &&
+ merge_request_diff&.stored_externally?
+ diff_export
+ else
+ diff
+ end
return '' if fetched_diff.blank?
@@ -45,4 +50,40 @@ class MergeRequestDiffFile < ApplicationRecord
content
end
end
+
+ private
+
+ # This method is meant to be used during Project Export.
+ # It is identical to the behaviour in #diff with the only
+ # difference of caching externally stored diffs on local disk in
+ # temp storage location in order to improve diff export performance.
+ def diff_export
+ content = merge_request_diff.cached_external_diff do |file|
+ file.seek(external_diff_offset)
+
+ force_encode_utf8(file.read(external_diff_size))
+ end
+
+ # See #diff
+ if binary?
+ content = begin
+ content.unpack1('m0')
+ rescue ArgumentError
+ content
+ end
+ end
+
+ content
+ rescue StandardError => e
+ log_payload = {
+ message: 'Cached external diff export failed',
+ merge_request_diff_file_id: id,
+ merge_request_diff_id: merge_request_diff&.id
+ }
+
+ Gitlab::ExceptionLogFormatter.format!(e, log_payload)
+ Gitlab::AppLogger.warn(log_payload)
+
+ diff
+ end
end
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 5bb06cdbb4a..f23a859b119 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -74,6 +74,8 @@ class Namespace < ApplicationRecord
has_many :sync_events, class_name: 'Namespaces::SyncEvent'
has_one :cluster_enabled_grant, inverse_of: :namespace, class_name: 'Clusters::ClusterEnabledGrant'
+ has_many :work_items, inverse_of: :namespace
+ has_many :issues, inverse_of: :namespace
validates :owner, presence: true, if: ->(n) { n.owner_required? }
validates :name,
@@ -341,6 +343,10 @@ class Namespace < ApplicationRecord
end
end
+ def emails_enabled?
+ !emails_disabled?
+ end
+
def lfs_enabled?
# User namespace will always default to the global setting
Gitlab.config.lfs.enabled
@@ -450,9 +456,14 @@ class Namespace < ApplicationRecord
end
def pages_virtual_domain
+ cache = if Feature.enabled?(:cache_pages_domain_api, root_ancestor)
+ ::Gitlab::Pages::CacheControl.for_namespace(root_ancestor.id)
+ end
+
Pages::VirtualDomain.new(
- all_projects_with_pages.includes(:route, :project_feature, pages_metadatum: :pages_deployment),
- trim_prefix: full_path
+ projects: all_projects_with_pages.includes(:route, :project_feature, pages_metadatum: :pages_deployment),
+ trim_prefix: full_path,
+ cache: cache
)
end
diff --git a/app/models/namespace_setting.rb b/app/models/namespace_setting.rb
index 504daf2662e..595e34821af 100644
--- a/app/models/namespace_setting.rb
+++ b/app/models/namespace_setting.rb
@@ -24,14 +24,27 @@ class NamespaceSetting < ApplicationRecord
chronic_duration_attr :subgroup_runner_token_expiration_interval_human_readable, :subgroup_runner_token_expiration_interval
chronic_duration_attr :project_runner_token_expiration_interval_human_readable, :project_runner_token_expiration_interval
- NAMESPACE_SETTINGS_PARAMS = [:default_branch_name, :delayed_project_removal,
- :lock_delayed_project_removal, :resource_access_token_creation_allowed,
- :prevent_sharing_groups_outside_hierarchy, :new_user_signups_cap,
- :setup_for_company, :jobs_to_be_done, :runner_token_expiration_interval, :enabled_git_access_protocol,
- :subgroup_runner_token_expiration_interval, :project_runner_token_expiration_interval].freeze
+ NAMESPACE_SETTINGS_PARAMS = %i[
+ default_branch_name
+ delayed_project_removal
+ lock_delayed_project_removal
+ resource_access_token_creation_allowed
+ prevent_sharing_groups_outside_hierarchy
+ new_user_signups_cap
+ setup_for_company
+ jobs_to_be_done
+ runner_token_expiration_interval
+ enabled_git_access_protocol
+ subgroup_runner_token_expiration_interval
+ project_runner_token_expiration_interval
+ ].freeze
self.primary_key = :namespace_id
+ def self.allowed_namespace_settings_params
+ NAMESPACE_SETTINGS_PARAMS
+ end
+
sanitizes! :default_branch_name
def prevent_sharing_groups_outside_hierarchy
diff --git a/app/models/note.rb b/app/models/note.rb
index 41e45a8759f..986a85acac6 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -111,6 +111,7 @@ class Note < ApplicationRecord
end
validate :does_not_exceed_notes_limit?, on: :create, unless: [:system?, :importing?]
+ validate :validate_created_after
# @deprecated attachments are handled by the Upload model.
#
@@ -665,6 +666,25 @@ class Note < ApplicationRecord
)
end
+ def mentioned_users(current_user = nil)
+ users = super
+
+ return users unless confidential?
+
+ Ability.users_that_can_read_internal_notes(users, resource_parent)
+ end
+
+ def mentioned_filtered_user_ids_for(references)
+ return super unless confidential?
+
+ user_ids = references.mentioned_user_ids.presence
+
+ return [] if user_ids.blank?
+
+ users = User.where(id: user_ids)
+ Ability.users_that_can_read_internal_notes(users, resource_parent).pluck(:id)
+ end
+
private
def system_note_viewable_by?(user)
@@ -729,6 +749,13 @@ class Note < ApplicationRecord
errors.add(:base, _('Maximum number of comments exceeded')) if noteable.notes.count >= Noteable::MAX_NOTES_LIMIT
end
+ def validate_created_after
+ return unless created_at
+ return if created_at >= '1970-01-01'
+
+ errors.add(:created_at, s_('Note|The created date provided is too far in the past.'))
+ end
+
def noteable_label_url_method
for_merge_request? ? :project_merge_requests_url : :project_issues_url
end
diff --git a/app/models/notification_recipient.rb b/app/models/notification_recipient.rb
index 79a84231083..b3eaed154e2 100644
--- a/app/models/notification_recipient.rb
+++ b/app/models/notification_recipient.rb
@@ -125,6 +125,10 @@ class NotificationRecipient
@project ? @project.emails_disabled? : @group&.emails_disabled?
end
+ def emails_enabled?
+ !emails_disabled?
+ end
+
def read_ability
return if @skip_read_ability
return @read_ability if instance_variable_defined?(:@read_ability)
diff --git a/app/models/oauth_access_token.rb b/app/models/oauth_access_token.rb
index 9789d8ed62b..20130f01d44 100644
--- a/app/models/oauth_access_token.rb
+++ b/app/models/oauth_access_token.rb
@@ -7,6 +7,8 @@ class OauthAccessToken < Doorkeeper::AccessToken
alias_attribute :user, :resource_owner
scope :distinct_resource_owner_counts, ->(applications) { where(application: applications).distinct.group(:application_id).count(:resource_owner_id) }
+ scope :latest_per_application, -> { select('distinct on(application_id) *').order(application_id: :desc, created_at: :desc) }
+ scope :preload_application, -> { preload(:application) }
def scopes=(value)
if value.is_a?(Array)
diff --git a/app/models/operations/feature_flags_client.rb b/app/models/operations/feature_flags_client.rb
index 1c65c3f096e..e8c237abbc5 100644
--- a/app/models/operations/feature_flags_client.rb
+++ b/app/models/operations/feature_flags_client.rb
@@ -4,6 +4,8 @@ module Operations
class FeatureFlagsClient < ApplicationRecord
include TokenAuthenticatable
+ DEFAULT_UNLEASH_API_VERSION = 1
+
self.table_name = 'operations_feature_flags_clients'
belongs_to :project
@@ -13,6 +15,8 @@ module Operations
add_authentication_token_field :token, encrypted: :required
+ attr_accessor :unleash_app_name
+
before_validation :ensure_token!
def self.find_for_project_and_token(project, token)
@@ -21,5 +25,25 @@ module Operations
where(project_id: project).find_by_token(token)
end
+
+ def self.update_last_feature_flag_updated_at!(project)
+ where(project: project).update_all(last_feature_flag_updated_at: Time.current)
+ end
+
+ def unleash_api_version
+ DEFAULT_UNLEASH_API_VERSION
+ end
+
+ def unleash_api_features
+ return [] unless unleash_app_name.present?
+
+ Operations::FeatureFlag.for_unleash_client(project, unleash_app_name)
+ end
+
+ def unleash_api_cache_key
+ "api_version:#{unleash_api_version}:" \
+ "app_name:#{unleash_app_name}:" \
+ "updated_at:#{last_feature_flag_updated_at.to_i}"
+ end
end
end
diff --git a/app/models/packages/cleanup/policy.rb b/app/models/packages/cleanup/policy.rb
index d7df90a4ce0..35f58f3680d 100644
--- a/app/models/packages/cleanup/policy.rb
+++ b/app/models/packages/cleanup/policy.rb
@@ -23,10 +23,25 @@ module Packages
where.not(keep_n_duplicated_package_files: 'all')
end
+ def self.with_packages
+ exists_select = ::Packages::Package.installable
+ .where('packages_packages.project_id = packages_cleanup_policies.project_id')
+ .select(1)
+ where('EXISTS (?)', exists_select)
+ end
+
+ def self.runnable
+ runnable_schedules.with_packages.order(next_run_at: :asc)
+ end
+
def set_next_run_at
# fixed cadence of 12 hours
self.next_run_at = Time.zone.now + 12.hours
end
+
+ def keep_n_duplicated_package_files_disabled?
+ keep_n_duplicated_package_files == 'all'
+ end
end
end
end
diff --git a/app/models/packages/debian/file_entry.rb b/app/models/packages/debian/file_entry.rb
index eb66f4acfa9..b70b6c460d2 100644
--- a/app/models/packages/debian/file_entry.rb
+++ b/app/models/packages/debian/file_entry.rb
@@ -4,6 +4,7 @@ module Packages
module Debian
class FileEntry
include ActiveModel::Model
+ include ::Packages::FIPS
DIGESTS = %i[md5 sha1 sha256].freeze
FILENAME_REGEX = %r{\A[a-zA-Z0-9][a-zA-Z0-9_.~+-]*\z}.freeze
@@ -31,6 +32,8 @@ module Packages
private
def valid_package_file_digests
+ raise DisabledError, 'Debian registry is not FIPS compliant' if Gitlab::FIPS.enabled?
+
DIGESTS.each do |digest|
package_file_digest = package_file["file_#{digest}"]
sum = public_send("#{digest}sum") # rubocop:disable GitlabSecurity/PublicSend
diff --git a/app/models/pages/virtual_domain.rb b/app/models/pages/virtual_domain.rb
index 497f67993ae..119cc7fc166 100644
--- a/app/models/pages/virtual_domain.rb
+++ b/app/models/pages/virtual_domain.rb
@@ -2,8 +2,9 @@
module Pages
class VirtualDomain
- def initialize(projects, trim_prefix: nil, domain: nil)
+ def initialize(projects:, cache: nil, trim_prefix: nil, domain: nil)
@projects = projects
+ @cache = cache
@trim_prefix = trim_prefix
@domain = domain
end
@@ -27,8 +28,12 @@ module Pages
paths.sort_by(&:prefix).reverse
end
+ def cache_key
+ @cache_key ||= cache&.cache_key
+ end
+
private
- attr_reader :projects, :trim_prefix, :domain
+ attr_reader :projects, :trim_prefix, :domain, :cache
end
end
diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb
index 93119bbff1f..9e93bff4acf 100644
--- a/app/models/pages_domain.rb
+++ b/app/models/pages_domain.rb
@@ -209,7 +209,15 @@ class PagesDomain < ApplicationRecord
def pages_virtual_domain
return unless pages_deployed?
- Pages::VirtualDomain.new([project], domain: self)
+ cache = if Feature.enabled?(:cache_pages_domain_api, project.root_namespace)
+ ::Gitlab::Pages::CacheControl.for_project(project.id)
+ end
+
+ Pages::VirtualDomain.new(
+ projects: [project],
+ domain: self,
+ cache: cache
+ )
end
def clear_auto_ssl_failure
diff --git a/app/models/preloaders/users_max_access_level_in_projects_preloader.rb b/app/models/preloaders/users_max_access_level_in_projects_preloader.rb
index b4ce61a869c..99a31a620c5 100644
--- a/app/models/preloaders/users_max_access_level_in_projects_preloader.rb
+++ b/app/models/preloaders/users_max_access_level_in_projects_preloader.rb
@@ -12,6 +12,8 @@ module Preloaders
def execute
return unless @projects.present? && @users.present?
+ preload_users_namespace_bans(@users)
+
access_levels.each do |(project_id, user_id), access_level|
project = projects_by_id[project_id]
@@ -42,5 +44,11 @@ module Preloaders
def projects_by_id
@projects_by_id ||= @projects.index_by(&:id)
end
+
+ def preload_users_namespace_bans(_users)
+ # overridden in EE
+ end
end
end
+
+# Preloaders::UsersMaxAccessLevelInProjectsPreloader.prepend_mod
diff --git a/app/models/project.rb b/app/models/project.rb
index dca47911d20..46e25564eab 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -247,7 +247,6 @@ class Project < ApplicationRecord
has_many :export_jobs, class_name: 'ProjectExportJob'
has_many :bulk_import_exports, class_name: 'BulkImports::Export', inverse_of: :project
has_one :project_repository, inverse_of: :project
- has_one :tracing_setting, class_name: 'ProjectTracingSetting'
has_one :incident_management_setting, inverse_of: :project, class_name: 'IncidentManagement::ProjectIncidentManagementSetting'
has_one :error_tracking_setting, inverse_of: :project, class_name: 'ErrorTracking::ProjectErrorTrackingSetting'
has_one :metrics_setting, inverse_of: :project, class_name: 'ProjectMetricsSetting'
@@ -261,6 +260,7 @@ class Project < ApplicationRecord
has_many :merge_request_metrics, foreign_key: 'target_project', class_name: 'MergeRequest::Metrics', inverse_of: :target_project
has_many :source_of_merge_requests, foreign_key: 'source_project_id', class_name: 'MergeRequest'
has_many :issues
+ has_many :incident_management_issuable_escalation_statuses, through: :issues, inverse_of: :project, class_name: 'IncidentManagement::IssuableEscalationStatus'
has_many :labels, class_name: 'ProjectLabel'
has_many :integrations
has_many :events
@@ -434,7 +434,6 @@ class Project < ApplicationRecord
allow_destroy: true,
reject_if: ->(attrs) { attrs[:id].blank? && attrs[:url].blank? }
- accepts_nested_attributes_for :tracing_setting, update_only: true, allow_destroy: true
accepts_nested_attributes_for :incident_management_setting, update_only: true
accepts_nested_attributes_for :error_tracking_setting, update_only: true
accepts_nested_attributes_for :metrics_setting, update_only: true, allow_destroy: true
@@ -442,33 +441,29 @@ class Project < ApplicationRecord
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?,
- :merge_requests_enabled?, :forking_enabled?, :issues_enabled?,
- :pages_enabled?, :analytics_enabled?, :snippets_enabled?, :public_pages?, :private_pages?,
- :merge_requests_access_level, :forking_access_level, :issues_access_level,
- :wiki_access_level, :snippets_access_level, :builds_access_level,
- :repository_access_level, :package_registry_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_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?,
- :enforce_auth_checks_on_uploads, :enforce_auth_checks_on_uploads=, :enforce_auth_checks_on_uploads?,
- :warn_about_potentially_unwanted_characters, :warn_about_potentially_unwanted_characters=, :warn_about_potentially_unwanted_characters?,
- to: :project_setting, allow_nil: true
- delegate :scheduled?, :started?, :in_progress?, :failed?, :finished?,
- prefix: :import, to: :import_state, allow_nil: true
+ delegate :merge_requests_access_level, :forking_access_level, :issues_access_level,
+ :wiki_access_level, :snippets_access_level, :builds_access_level,
+ :repository_access_level, :package_registry_access_level, :pages_access_level,
+ :metrics_dashboard_access_level, :analytics_access_level,
+ :operations_access_level, :security_and_compliance_access_level,
+ :container_registry_access_level,
+ to: :project_feature, allow_nil: true
+
+ delegate :show_default_award_emojis, :show_default_award_emojis=,
+ :enforce_auth_checks_on_uploads, :enforce_auth_checks_on_uploads=,
+ :warn_about_potentially_unwanted_characters, :warn_about_potentially_unwanted_characters=,
+ to: :project_setting, allow_nil: true
+
delegate :squash_always?, :squash_never?, :squash_enabled_by_default?, :squash_readonly?, to: :project_setting
delegate :squash_option, :squash_option=, to: :project_setting
delegate :mr_default_target_self, :mr_default_target_self=, 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_member, :add_members, to: :team
delegate :add_guest, :add_reporter, :add_developer, :add_maintainer, :add_owner, :add_role, to: :team
delegate :group_runners_enabled, :group_runners_enabled=, to: :ci_cd_settings, allow_nil: true
- delegate :root_ancestor, :certificate_based_clusters_enabled?, to: :namespace, 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
@@ -476,6 +471,7 @@ class Project < ApplicationRecord
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 :opt_in_jwt, :opt_in_jwt=, to: :ci_cd_settings, prefix: :ci, allow_nil: true
delegate :restrict_user_defined_variables, :restrict_user_defined_variables=, to: :ci_cd_settings, allow_nil: true
delegate :separated_caches, :separated_caches=, to: :ci_cd_settings, prefix: :ci, allow_nil: true
delegate :runner_token_expiration_interval, :runner_token_expiration_interval=, :runner_token_expiration_interval_human_readable, :runner_token_expiration_interval_human_readable=, to: :ci_cd_settings, allow_nil: true
@@ -483,7 +479,6 @@ class Project < ApplicationRecord
delegate :allow_merge_on_skipped_pipeline, :allow_merge_on_skipped_pipeline?,
:allow_merge_on_skipped_pipeline=, :has_confluence?, :has_shimo?,
to: :project_setting
- delegate :active?, to: :prometheus_integration, allow_nil: true, prefix: true
delegate :merge_commit_template, :merge_commit_template=, to: :project_setting, allow_nil: true
delegate :squash_commit_template, :squash_commit_template=, to: :project_setting, allow_nil: true
@@ -667,7 +662,6 @@ class Project < ApplicationRecord
scope :created_by, -> (user) { where(creator: user) }
scope :imported_from, -> (type) { where(import_type: type) }
scope :imported, -> { where.not(import_type: nil) }
- scope :with_tracing_enabled, -> { joins(:tracing_setting) }
scope :with_enabled_error_tracking, -> { joins(:error_tracking_setting).where(project_error_tracking_settings: { enabled: true }) }
scope :with_service_desk_key, -> (key) do
@@ -676,10 +670,12 @@ class Project < ApplicationRecord
joins(:service_desk_setting).where('service_desk_settings.project_key' => key)
end
- scope :with_topic, ->(topic_name) do
+ scope :with_topic, ->(topic) { where(id: topic.project_topics.select(:project_id)) }
+
+ scope :with_topic_by_name, ->(topic_name) do
topic = Projects::Topic.find_by_name(topic_name)
- topic ? where(id: topic.project_topics.select(:project_id)) : none
+ topic ? with_topic(topic) : none
end
enum auto_cancel_pending_pipelines: { disabled: 0, enabled: 1 }
@@ -917,6 +913,14 @@ class Project < ApplicationRecord
association(:namespace).loaded?
end
+ def certificate_based_clusters_enabled?
+ !!namespace&.certificate_based_clusters_enabled?
+ end
+
+ def prometheus_integration_active?
+ !!prometheus_integration&.active?
+ end
+
def personal_namespace_holder?(user)
return false unless personal?
return false unless user
@@ -933,6 +937,42 @@ class Project < ApplicationRecord
super.presence || build_project_setting
end
+ def show_default_award_emojis?
+ !!project_setting&.show_default_award_emojis?
+ end
+
+ def enforce_auth_checks_on_uploads?
+ !!project_setting&.enforce_auth_checks_on_uploads?
+ end
+
+ def warn_about_potentially_unwanted_characters?
+ !!project_setting&.warn_about_potentially_unwanted_characters?
+ end
+
+ def no_import?
+ !!import_state&.no_import?
+ end
+
+ def import_scheduled?
+ !!import_state&.scheduled?
+ end
+
+ def import_started?
+ !!import_state&.started?
+ end
+
+ def import_in_progress?
+ !!import_state&.in_progress?
+ end
+
+ def import_failed?
+ !!import_state&.failed?
+ end
+
+ def import_finished?
+ !!import_state&.finished?
+ end
+
def all_pipelines
if builds_enabled?
super
@@ -998,6 +1038,9 @@ class Project < ApplicationRecord
end
end
+ def emails_enabled?
+ !emails_disabled?
+ end
override :lfs_enabled?
def lfs_enabled?
return namespace.lfs_enabled? if self[:lfs_enabled].nil?
@@ -1840,6 +1883,59 @@ class Project < ApplicationRecord
end
end
+ def feature_available?(feature, user = nil)
+ !!project_feature&.feature_available?(feature, user)
+ end
+
+ def builds_enabled?
+ !!project_feature&.builds_enabled?
+ end
+
+ def wiki_enabled?
+ !!project_feature&.wiki_enabled?
+ end
+
+ def merge_requests_enabled?
+ !!project_feature&.merge_requests_enabled?
+ end
+
+ def forking_enabled?
+ !!project_feature&.forking_enabled?
+ end
+
+ def issues_enabled?
+ !!project_feature&.issues_enabled?
+ end
+
+ def pages_enabled?
+ !!project_feature&.pages_enabled?
+ end
+
+ def analytics_enabled?
+ !!project_feature&.analytics_enabled?
+ end
+
+ def snippets_enabled?
+ !!project_feature&.snippets_enabled?
+ end
+
+ def public_pages?
+ !!project_feature&.public_pages?
+ end
+
+ def private_pages?
+ !!project_feature&.private_pages?
+ end
+
+ def operations_enabled?
+ !!project_feature&.operations_enabled?
+ end
+
+ def container_registry_enabled?
+ !!project_feature&.container_registry_enabled?
+ end
+ alias_method :container_registry_enabled, :container_registry_enabled?
+
def enable_ci
project_feature.update_attribute(:builds_access_level, ProjectFeature::ENABLED)
end
@@ -2762,10 +2858,6 @@ class Project < ApplicationRecord
instance.token
end
- def tracing_external_url
- tracing_setting&.external_url
- end
-
override :git_garbage_collect_worker_klass
def git_garbage_collect_worker_klass
Projects::GitGarbageCollectWorker
@@ -2907,6 +2999,10 @@ class Project < ApplicationRecord
build_artifacts_size_refresh&.started?
end
+ def group_group_links
+ group&.shared_with_group_links&.of_ancestors_and_self || GroupGroupLink.none
+ end
+
def security_training_available?
licensed_feature_available?(:security_training)
end
diff --git a/app/models/project_export_job.rb b/app/models/project_export_job.rb
index c7fe3d7bc10..decc71ee193 100644
--- a/app/models/project_export_job.rb
+++ b/app/models/project_export_job.rb
@@ -2,6 +2,7 @@
class ProjectExportJob < ApplicationRecord
belongs_to :project
+ has_many :relation_exports, class_name: 'Projects::ImportExport::RelationExport'
validates :project, :jid, :status, presence: true
diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb
index f478af32788..0a30e125c83 100644
--- a/app/models/project_feature.rb
+++ b/app/models/project_feature.rb
@@ -69,6 +69,11 @@ class ProjectFeature < ApplicationRecord
default_value_for :metrics_dashboard_access_level, value: PRIVATE, allows_nil: false
default_value_for :operations_access_level, value: ENABLED, allows_nil: false
default_value_for :security_and_compliance_access_level, value: PRIVATE, allows_nil: false
+ default_value_for :monitor_access_level, value: ENABLED, allows_nil: false
+ default_value_for :infrastructure_access_level, value: ENABLED, allows_nil: false
+ default_value_for :feature_flags_access_level, value: ENABLED, allows_nil: false
+ default_value_for :environments_access_level, value: ENABLED, allows_nil: false
+ default_value_for :releases_access_level, value: ENABLED, allows_nil: false
default_value_for(:pages_access_level, allows_nil: false) do |feature|
if ::Gitlab::Pages.access_control_is_forced?
diff --git a/app/models/project_import_state.rb b/app/models/project_import_state.rb
index b1c1a5b6697..7711c6d604a 100644
--- a/app/models/project_import_state.rb
+++ b/app/models/project_import_state.rb
@@ -31,6 +31,10 @@ class ProjectImportState < ApplicationRecord
transition started: :finished
end
+ event :cancel do
+ transition [:none, :scheduled, :started] => :canceled
+ end
+
event :fail_op do
transition [:scheduled, :started] => :failed
end
@@ -39,6 +43,7 @@ class ProjectImportState < ApplicationRecord
state :started
state :finished
state :failed
+ state :canceled
after_transition [:none, :finished, :failed] => :scheduled do |state, _|
state.run_after_commit do
@@ -51,7 +56,7 @@ class ProjectImportState < ApplicationRecord
end
end
- after_transition any => :finished do |state, _|
+ after_transition any => [:canceled, :finished] do |state, _|
if state.jid.present?
Gitlab::SidekiqStatus.unset(state.jid)
@@ -59,7 +64,7 @@ class ProjectImportState < ApplicationRecord
end
end
- after_transition any => :failed do |state, _|
+ after_transition any => [:canceled, :failed] do |state, _|
state.project.remove_import_data
end
diff --git a/app/models/project_setting.rb b/app/models/project_setting.rb
index e9fd7e4446c..59d2e3deb4f 100644
--- a/app/models/project_setting.rb
+++ b/app/models/project_setting.rb
@@ -5,6 +5,8 @@ class ProjectSetting < ApplicationRecord
belongs_to :project, inverse_of: :project_setting
+ scope :for_projects, ->(projects) { where(project_id: projects) }
+
enum squash_option: {
never: 0,
always: 1,
diff --git a/app/models/project_team.rb b/app/models/project_team.rb
index 97ab5aa2619..5641fbfb867 100644
--- a/app/models/project_team.rb
+++ b/app/models/project_team.rb
@@ -8,23 +8,23 @@ class ProjectTeam
end
def add_guest(user, current_user: nil)
- add_user(user, :guest, current_user: current_user)
+ add_member(user, :guest, current_user: current_user)
end
def add_reporter(user, current_user: nil)
- add_user(user, :reporter, current_user: current_user)
+ add_member(user, :reporter, current_user: current_user)
end
def add_developer(user, current_user: nil)
- add_user(user, :developer, current_user: current_user)
+ add_member(user, :developer, current_user: current_user)
end
def add_maintainer(user, current_user: nil)
- add_user(user, :maintainer, current_user: current_user)
+ add_member(user, :maintainer, current_user: current_user)
end
def add_owner(user, current_user: nil)
- add_user(user, :owner, current_user: current_user)
+ add_member(user, :owner, current_user: current_user)
end
def add_role(user, role, current_user: nil)
@@ -43,8 +43,8 @@ class ProjectTeam
member
end
- def add_users(users, access_level, current_user: nil, expires_at: nil, tasks_to_be_done: [], tasks_project_id: nil)
- Members::Projects::CreatorService.add_users( # rubocop:disable CodeReuse/ServiceClass
+ def add_members(users, access_level, current_user: nil, expires_at: nil, tasks_to_be_done: [], tasks_project_id: nil)
+ Members::Projects::CreatorService.add_members( # rubocop:disable CodeReuse/ServiceClass
project,
users,
access_level,
@@ -55,8 +55,8 @@ class ProjectTeam
)
end
- def add_user(user, access_level, current_user: nil, expires_at: nil)
- Members::Projects::CreatorService.add_user( # rubocop:disable CodeReuse/ServiceClass
+ def add_member(user, access_level, current_user: nil, expires_at: nil)
+ Members::Projects::CreatorService.add_member( # rubocop:disable CodeReuse/ServiceClass
project,
user,
access_level,
diff --git a/app/models/project_tracing_setting.rb b/app/models/project_tracing_setting.rb
deleted file mode 100644
index 93fa80aed67..00000000000
--- a/app/models/project_tracing_setting.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class ProjectTracingSetting < ApplicationRecord
- belongs_to :project
-
- validates :external_url, length: { maximum: 255 }, public_url: true
-
- before_validation :sanitize_external_url
-
- private
-
- def sanitize_external_url
- self.external_url = Rails::Html::FullSanitizer.new.sanitize(self.external_url)
- end
-end
diff --git a/app/models/projects/import_export/relation_export.rb b/app/models/projects/import_export/relation_export.rb
new file mode 100644
index 00000000000..0a31e525ac2
--- /dev/null
+++ b/app/models/projects/import_export/relation_export.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Projects
+ module ImportExport
+ class RelationExport < ApplicationRecord
+ self.table_name = 'project_relation_exports'
+
+ belongs_to :project_export_job
+
+ has_one :upload,
+ class_name: 'Projects::ImportExport::RelationExportUpload',
+ foreign_key: :project_relation_export_id,
+ inverse_of: :relation_export
+
+ validates :export_error, length: { maximum: 300 }
+ validates :jid, length: { maximum: 255 }
+ validates :project_export_job, presence: true
+ validates :relation, presence: true, length: { maximum: 255 }, uniqueness: { scope: :project_export_job_id }
+ validates :status, numericality: { only_integer: true }, presence: true
+ end
+ end
+end
diff --git a/app/models/projects/import_export/relation_export_upload.rb b/app/models/projects/import_export/relation_export_upload.rb
new file mode 100644
index 00000000000..965dc39d19f
--- /dev/null
+++ b/app/models/projects/import_export/relation_export_upload.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Projects
+ module ImportExport
+ class RelationExportUpload < ApplicationRecord
+ include WithUploads
+ include ObjectStorage::BackgroundMove
+
+ self.table_name = 'project_relation_export_uploads'
+
+ belongs_to :relation_export,
+ class_name: 'Projects::ImportExport::RelationExport',
+ foreign_key: :project_relation_export_id,
+ inverse_of: :upload
+
+ mount_uploader :export_file, ImportExportUploader
+ end
+ end
+end
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index 77038d52efe..7cf15439b47 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -4,6 +4,8 @@ class ProtectedBranch < ApplicationRecord
include ProtectedRef
include Gitlab::SQL::Pattern
+ CACHE_EXPIRE_IN = 1.hour
+
scope :requiring_code_owner_approval,
-> { where(code_owner_approval_required: true) }
@@ -29,7 +31,7 @@ class ProtectedBranch < ApplicationRecord
return true if project.empty_repo? && project.default_branch_protected?
return false if ref_name.blank?
- Rails.cache.fetch(protected_ref_cache_key(project, ref_name)) do
+ Rails.cache.fetch(protected_ref_cache_key(project, ref_name), expires_in: CACHE_EXPIRE_IN) do
self.matching(ref_name, protected_refs: protected_refs(project)).present?
end
end
diff --git a/app/models/remote_mirror.rb b/app/models/remote_mirror.rb
index 7f41f0907d5..f8d500e106b 100644
--- a/app/models/remote_mirror.rb
+++ b/app/models/remote_mirror.rb
@@ -128,7 +128,7 @@ class RemoteMirror < ApplicationRecord
def sync
return unless sync?
- if recently_scheduled?
+ if schedule_with_delay?
RepositoryUpdateRemoteMirrorWorker.perform_in(backoff_delay, self.id, Time.current)
else
RepositoryUpdateRemoteMirrorWorker.perform_async(self.id, Time.current)
@@ -261,7 +261,8 @@ class RemoteMirror < ApplicationRecord
super
end
- def recently_scheduled?
+ def schedule_with_delay?
+ return false if Feature.enabled?(:remote_mirror_no_delay, project, type: :ops)
return false unless self.last_update_started_at
self.last_update_started_at >= Time.current - backoff_delay
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 0135020e586..0da71d87457 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -1049,8 +1049,8 @@ class Repository
blob_data_at(sha, '.lfsconfig')
end
- def changelog_config(ref = 'HEAD')
- blob_data_at(ref, Gitlab::Changelog::Config::FILE_PATH)
+ def changelog_config(ref, path)
+ blob_data_at(ref, path)
end
def fetch_ref(source_repository, source_ref:, target_ref:)
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index cf4b83d44c2..c813c5cb5b8 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -18,6 +18,7 @@ class Snippet < ApplicationRecord
include CanMoveRepositoryStorage
include AfterCommitQueue
extend ::Gitlab::Utils::Override
+ include CreatedAtFilterable
MAX_FILE_COUNT = 10
diff --git a/app/models/ssh_host_key.rb b/app/models/ssh_host_key.rb
index ac7ba9530dd..daa64f4e087 100644
--- a/app/models/ssh_host_key.rb
+++ b/app/models/ssh_host_key.rb
@@ -12,7 +12,15 @@ class SshHostKey
end
def as_json(*)
- { bits: bits, fingerprint: fingerprint, type: type, index: index }
+ { bits: bits, type: type, index: index }.merge(fingerprint_data)
+ end
+
+ private
+
+ def fingerprint_data
+ data = { fingerprint_sha256: fingerprint_sha256 }
+ data[:fingerprint] = fingerprint unless Gitlab::FIPS.enabled?
+ data
end
end
diff --git a/app/models/terraform/state.rb b/app/models/terraform/state.rb
index 4d17a4d332c..59f7d852ce6 100644
--- a/app/models/terraform/state.rb
+++ b/app/models/terraform/state.rb
@@ -3,6 +3,7 @@
module Terraform
class State < ApplicationRecord
include UsageStatistics
+ include AfterCommitQueue
HEX_REGEXP = %r{\A\h+\z}.freeze
UUID_LENGTH = 32
diff --git a/app/models/todo.rb b/app/models/todo.rb
index 45ab770a0f6..cff7a93f72f 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -230,6 +230,10 @@ class Todo < ApplicationRecord
target_type == AlertManagement::Alert.name
end
+ def for_issue_or_work_item?
+ [Issue.name, WorkItem.name].any? { |klass_name| target_type == klass_name }
+ end
+
# override to return commits, which are not active record
def target
if for_commit?
diff --git a/app/models/user.rb b/app/models/user.rb
index 40096dfa411..12f434db631 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -9,6 +9,7 @@ class User < ApplicationRecord
include Gitlab::SQL::Pattern
include AfterCommitQueue
include Avatarable
+ include Awareness
include Referable
include Sortable
include CaseSensitivity
@@ -80,7 +81,7 @@ class User < ApplicationRecord
serialize :otp_backup_codes, JSON # rubocop:disable Cop/ActiveRecordSerialize
devise :lockable, :recoverable, :rememberable, :trackable,
- :validatable, :omniauthable, :confirmable, :registerable
+ :validatable, :omniauthable, :confirmable, :registerable, :pbkdf2_encryptable
include AdminChangedPasswordNotifier
@@ -88,6 +89,7 @@ class User < ApplicationRecord
# and should be added after Devise modules are initialized.
include AsyncDeviseEmail
include ForcedEmailConfirmation
+ include RequireEmailVerification
MINIMUM_INACTIVE_DAYS = 90
MINIMUM_DAYS_CREATED = 7
@@ -220,6 +222,7 @@ class User < ApplicationRecord
has_many :custom_attributes, class_name: 'UserCustomAttribute'
has_many :callouts, class_name: 'Users::Callout'
has_many :group_callouts, class_name: 'Users::GroupCallout'
+ has_many :namespace_callouts, class_name: 'Users::NamespaceCallout'
has_many :term_agreements
belongs_to :accepted_term, class_name: 'ApplicationSetting::Term'
@@ -476,8 +479,8 @@ class User < ApplicationRecord
end
scope :order_recent_sign_in, -> { reorder(arel_table[:current_sign_in_at].desc.nulls_last) }
scope :order_oldest_sign_in, -> { reorder(arel_table[:current_sign_in_at].asc.nulls_last) }
- scope :order_recent_last_activity, -> { reorder(arel_table[:last_activity_on].desc.nulls_last) }
- scope :order_oldest_last_activity, -> { reorder(arel_table[:last_activity_on].asc.nulls_first) }
+ scope :order_recent_last_activity, -> { reorder(arel_table[:last_activity_on].desc.nulls_last, arel_table[:id].asc) }
+ scope :order_oldest_last_activity, -> { reorder(arel_table[:last_activity_on].asc.nulls_first, arel_table[:id].desc) }
scope :by_id_and_login, ->(id, login) { where(id: id).where('username = LOWER(:login) OR email = LOWER(:login)', login: login) }
scope :dormant, -> { with_state(:active).human_or_service_user.where('last_activity_on <= ?', MINIMUM_INACTIVE_DAYS.day.ago.to_date) }
scope :with_no_activity, -> { with_state(:active).human_or_service_user.where(last_activity_on: nil).where('created_at <= ?', MINIMUM_DAYS_CREATED.day.ago.to_date) }
@@ -687,7 +690,33 @@ class User < ApplicationRecord
scope = options[:with_private_emails] ? with_primary_or_secondary_email(query) : with_public_email(query)
scope = scope.or(search_by_name_or_username(query, use_minimum_char_limit: options[:use_minimum_char_limit]))
- scope.reorder(sanitized_order_sql, :name)
+ if Feature.enabled?(:use_keyset_aware_user_search_query)
+ order = Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'users_match_priority',
+ order_expression: sanitized_order_sql.asc,
+ add_to_projections: true,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'users_name',
+ order_expression: arel_table[:name].asc,
+ add_to_projections: true,
+ nullable: :not_nullable,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'users_id',
+ order_expression: arel_table[:id].asc,
+ add_to_projections: true,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ ])
+ scope.reorder(order)
+ else
+ scope.reorder(sanitized_order_sql, :name)
+ end
end
# Limits the result set to users _not_ in the given query/list of IDs.
@@ -894,21 +923,59 @@ class User < ApplicationRecord
reset_password_sent_at.present? && reset_password_sent_at >= 1.minute.ago
end
- # See https://gitlab.com/gitlab-org/security/gitlab/-/issues/638
- DISALLOWED_PASSWORDS = %w[123qweQWE!@#000000000].freeze
+ def authenticatable_salt
+ return encrypted_password[0, 29] unless Feature.enabled?(:pbkdf2_password_encryption)
+ return super if password_strategy == :pbkdf2_sha512
+
+ encrypted_password[0, 29]
+ end
# Overwrites valid_password? from Devise::Models::DatabaseAuthenticatable
# In constant-time, check both that the password isn't on a denylist AND
# that the password is the user's password
def valid_password?(password)
+ return false unless password_allowed?(password)
+ return super if Feature.enabled?(:pbkdf2_password_encryption)
+
+ Devise::Encryptor.compare(self.class, encrypted_password, password)
+ rescue Devise::Pbkdf2Encryptable::Encryptors::InvalidHash
+ validate_and_migrate_bcrypt_password(password)
+ rescue ::BCrypt::Errors::InvalidHash
+ false
+ end
+
+ # This method should be removed once the :pbkdf2_password_encryption feature flag is removed.
+ def password=(new_password)
+ if Feature.enabled?(:pbkdf2_password_encryption) && Feature.enabled?(:pbkdf2_password_encryption_write, self)
+ super
+ else
+ # Copied from Devise DatabaseAuthenticatable.
+ @password = new_password
+ self.encrypted_password = Devise::Encryptor.digest(self.class, new_password) if new_password.present?
+ end
+ end
+
+ def password_strategy
+ super
+ rescue Devise::Pbkdf2Encryptable::Encryptors::InvalidHash
+ begin
+ return :bcrypt if BCrypt::Password.new(encrypted_password)
+ rescue BCrypt::Errors::InvalidHash
+ :unknown
+ end
+ end
+
+ # See https://gitlab.com/gitlab-org/security/gitlab/-/issues/638
+ DISALLOWED_PASSWORDS = %w[123qweQWE!@#000000000].freeze
+
+ def password_allowed?(password)
password_allowed = true
+
DISALLOWED_PASSWORDS.each do |disallowed_password|
password_allowed = false if Devise.secure_compare(password, disallowed_password)
end
- original_result = super
-
- password_allowed && original_result
+ password_allowed
end
def remember_me!
@@ -1570,6 +1637,10 @@ class User < ApplicationRecord
self.followees.exists?(user.id)
end
+ def followed_by?(user)
+ self.followers.include?(user)
+ end
+
def follow(user)
return false if self.id == user.id
@@ -1625,7 +1696,7 @@ class User < ApplicationRecord
end
def oauth_authorized_tokens
- Doorkeeper::AccessToken.where(resource_owner_id: id, revoked_at: nil)
+ OauthAccessToken.where(resource_owner_id: id, revoked_at: nil)
end
# Returns the projects a user contributed to in the last year.
@@ -1899,7 +1970,7 @@ class User < ApplicationRecord
end
# override, from Devise
- def lock_access!
+ def lock_access!(opts = {})
Gitlab::AppLogger.info("Account Locked: username=#{username}")
super
end
@@ -2015,6 +2086,13 @@ class User < ApplicationRecord
callout_dismissed?(callout, ignore_dismissal_earlier_than)
end
+ def dismissed_callout_for_namespace?(feature_name:, namespace:, ignore_dismissal_earlier_than: nil)
+ source_feature_name = "#{feature_name}_#{namespace.id}"
+ callout = namespace_callouts_by_feature_name[source_feature_name]
+
+ callout_dismissed?(callout, ignore_dismissal_earlier_than)
+ end
+
# Load the current highest access by looking directly at the user's memberships
def current_highest_access_level
members.non_request.maximum(:access_level)
@@ -2041,6 +2119,11 @@ class User < ApplicationRecord
.find_or_initialize_by(feature_name: ::Users::GroupCallout.feature_names[feature_name], group_id: group_id)
end
+ def find_or_initialize_namespace_callout(feature_name, namespace_id)
+ namespace_callouts
+ .find_or_initialize_by(feature_name: ::Users::NamespaceCallout.feature_names[feature_name], namespace_id: namespace_id)
+ end
+
def can_trigger_notifications?
confirmed? && !blocked? && !ghost?
end
@@ -2158,6 +2241,10 @@ class User < ApplicationRecord
@group_callouts_by_feature_name ||= group_callouts.index_by(&:source_feature_name)
end
+ def namespace_callouts_by_feature_name
+ @namespace_callouts_by_feature_name ||= namespace_callouts.index_by(&:source_feature_name)
+ end
+
def authorized_groups_without_shared_membership
Group.from_union([
groups.select(*Namespace.cached_column_list),
@@ -2318,6 +2405,15 @@ class User < ApplicationRecord
Ci::NamespaceMirror.contains_traversal_ids(traversal_ids)
end
+
+ def validate_and_migrate_bcrypt_password(password)
+ return false unless Devise::Encryptor.compare(self.class, encrypted_password, password)
+ return true unless Feature.enabled?(:pbkdf2_password_encryption_write, self)
+
+ update_attribute(:password, password)
+ rescue ::BCrypt::Errors::InvalidHash
+ false
+ end
end
User.prepend_mod_with('User')
diff --git a/app/models/users/callout.rb b/app/models/users/callout.rb
index 0ecae4d148a..570e3ae9b3c 100644
--- a/app/models/users/callout.rb
+++ b/app/models/users/callout.rb
@@ -49,11 +49,14 @@ module Users
storage_enforcement_banner_fourth_enforcement_threshold: 46,
attention_requests_top_nav: 47,
attention_requests_side_nav: 48,
- minute_limit_banner: 49,
+ # 49 was removed with https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91533
+ # because the banner was no longer relevant.
+ # Records will be migrated with https://gitlab.com/gitlab-org/gitlab/-/issues/367293
preview_user_over_limit_free_plan_alert: 50, # EE-only
user_reached_limit_free_plan_alert: 51, # EE-only
submit_license_usage_data_banner: 52, # EE-only
- personal_project_limitations_banner: 53 # EE-only
+ personal_project_limitations_banner: 53, # EE-only
+ mr_experience_survey: 54
}
validates :feature_name,
diff --git a/app/models/users/group_callout.rb b/app/models/users/group_callout.rb
index 373bc30889f..0ea7b8199aa 100644
--- a/app/models/users/group_callout.rb
+++ b/app/models/users/group_callout.rb
@@ -16,7 +16,8 @@ module Users
storage_enforcement_banner_third_enforcement_threshold: 5,
storage_enforcement_banner_fourth_enforcement_threshold: 6,
preview_user_over_limit_free_plan_alert: 7, # EE-only
- user_reached_limit_free_plan_alert: 8 # EE-only
+ user_reached_limit_free_plan_alert: 8, # EE-only
+ free_group_limited_alert: 9 # EE-only
}
validates :group, presence: true
diff --git a/app/models/users/in_product_marketing_email.rb b/app/models/users/in_product_marketing_email.rb
index 82c2e336a09..f220cfd17c5 100644
--- a/app/models/users/in_product_marketing_email.rb
+++ b/app/models/users/in_product_marketing_email.rb
@@ -41,7 +41,7 @@ module Users
# Tracks we don't send emails for (e.g. unsuccessful experiment). These
# are kept since we already have DB records that use the enum value.
- INACTIVE_TRACK_NAMES = %w(invite_team).freeze
+ INACTIVE_TRACK_NAMES = %w[invite_team experience].freeze
ACTIVE_TRACKS = tracks.except(*INACTIVE_TRACK_NAMES)
scope :for_user_with_track_and_series, -> (user, track, series) do
diff --git a/app/models/users/namespace_callout.rb b/app/models/users/namespace_callout.rb
new file mode 100644
index 00000000000..a20a196a4ef
--- /dev/null
+++ b/app/models/users/namespace_callout.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Users
+ class NamespaceCallout < ApplicationRecord
+ include Users::Calloutable
+
+ self.table_name = 'user_namespace_callouts'
+
+ belongs_to :namespace
+
+ enum feature_name: {
+ invite_members_banner: 1,
+ approaching_seat_count_threshold: 2, # EE-only
+ storage_enforcement_banner_first_enforcement_threshold: 3,
+ storage_enforcement_banner_second_enforcement_threshold: 4,
+ storage_enforcement_banner_third_enforcement_threshold: 5,
+ storage_enforcement_banner_fourth_enforcement_threshold: 6,
+ preview_user_over_limit_free_plan_alert: 7, # EE-only
+ user_reached_limit_free_plan_alert: 8, # EE-only
+ web_hook_disabled: 9
+ }
+
+ validates :namespace, presence: true
+ validates :feature_name,
+ presence: true,
+ uniqueness: { scope: [:user_id, :namespace_id] },
+ inclusion: { in: NamespaceCallout.feature_names.keys }
+
+ def source_feature_name
+ "#{feature_name}_#{namespace_id}"
+ end
+ end
+end
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 647b4e787c6..63c60f5a89e 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -316,6 +316,7 @@ class WikiPage
end
def update_front_matter(attrs)
+ return unless Gitlab::WikiPages::FrontMatterParser.enabled?(container)
return unless attrs.has_key?(:front_matter)
fm_yaml = serialize_front_matter(attrs[:front_matter])
@@ -326,7 +327,7 @@ class WikiPage
def parsed_content
strong_memoize(:parsed_content) do
- Gitlab::WikiPages::FrontMatterParser.new(raw_content).parse
+ Gitlab::WikiPages::FrontMatterParser.new(raw_content, container).parse
end
end
diff --git a/app/models/work_item.rb b/app/models/work_item.rb
index bdd9aae90a4..d29df0c31fc 100644
--- a/app/models/work_item.rb
+++ b/app/models/work_item.rb
@@ -1,9 +1,12 @@
# frozen_string_literal: true
class WorkItem < Issue
+ include Gitlab::Utils::StrongMemoize
+
self.table_name = 'issues'
self.inheritance_column = :_type_disabled
+ belongs_to :namespace, inverse_of: :work_items
has_one :parent_link, class_name: '::WorkItems::ParentLink', foreign_key: :work_item_id
has_one :work_item_parent, through: :parent_link, class_name: 'WorkItem'
@@ -22,8 +25,10 @@ class WorkItem < Issue
end
def widgets
- work_item_type.widgets.map do |widget_class|
- widget_class.new(self)
+ strong_memoize(:widgets) do
+ work_item_type.widgets.map do |widget_class|
+ widget_class.new(self)
+ end
end
end
diff --git a/app/models/work_items/parent_link.rb b/app/models/work_items/parent_link.rb
index 3c405dbce3b..f5ebbfa59b8 100644
--- a/app/models/work_items/parent_link.rb
+++ b/app/models/work_items/parent_link.rb
@@ -5,11 +5,13 @@ module WorkItems
self.table_name = 'work_item_parent_links'
MAX_CHILDREN = 100
+ PARENT_TYPES = [:issue, :incident].freeze
belongs_to :work_item
belongs_to :work_item_parent, class_name: 'WorkItem'
- validates :work_item, :work_item_parent, presence: true
+ validates :work_item_parent, presence: true
+ validates :work_item, presence: true, uniqueness: true
validate :validate_child_type
validate :validate_parent_type
validate :validate_same_project
@@ -21,15 +23,20 @@ module WorkItems
return unless work_item
unless work_item.task?
- errors.add :work_item, _('Only Task can be assigned as a child in hierarchy.')
+ errors.add :work_item, _('only Task can be assigned as a child in hierarchy.')
end
end
def validate_parent_type
return unless work_item_parent
- unless work_item_parent.issue?
- errors.add :work_item_parent, _('Only Issue can be parent of Task.')
+ base_type = work_item_parent.work_item_type.base_type.to_sym
+ unless PARENT_TYPES.include?(base_type)
+ parent_names = WorkItems::Type::BASE_TYPES.slice(*WorkItems::ParentLink::PARENT_TYPES)
+ .values.map { |type| type[:name] }
+
+ errors.add :work_item_parent, _('only %{parent_types} can be parent of Task.') %
+ { parent_types: parent_names.to_sentence }
end
end
@@ -37,7 +44,7 @@ module WorkItems
return if work_item.nil? || work_item_parent.nil?
if work_item.resource_parent != work_item_parent.resource_parent
- errors.add :work_item_parent, _('Parent must be in the same project as child.')
+ errors.add :work_item_parent, _('parent must be in the same project as child.')
end
end
@@ -46,7 +53,7 @@ module WorkItems
max = persisted? ? MAX_CHILDREN : MAX_CHILDREN - 1
if work_item_parent.child_links.count > max
- errors.add :work_item_parent, _('Parent already has maximum number of children.')
+ errors.add :work_item_parent, _('parent already has maximum number of children.')
end
end
end
diff --git a/app/models/work_items/type.rb b/app/models/work_items/type.rb
index bf251a3ade5..e38d0ae153a 100644
--- a/app/models/work_items/type.rb
+++ b/app/models/work_items/type.rb
@@ -21,11 +21,11 @@ module WorkItems
}.freeze
WIDGETS_FOR_TYPE = {
- issue: [Widgets::Description, Widgets::Hierarchy],
- incident: [Widgets::Description],
+ issue: [Widgets::Assignees, Widgets::Description, Widgets::Hierarchy, Widgets::Weight],
+ incident: [Widgets::Description, Widgets::Hierarchy],
test_case: [Widgets::Description],
requirement: [Widgets::Description],
- task: [Widgets::Description, Widgets::Hierarchy]
+ task: [Widgets::Assignees, Widgets::Description, Widgets::Hierarchy, Widgets::Weight]
}.freeze
cache_markdown_field :description, pipeline: :single_line
diff --git a/app/models/work_items/widgets/assignees.rb b/app/models/work_items/widgets/assignees.rb
new file mode 100644
index 00000000000..ecbbee1bcfb
--- /dev/null
+++ b/app/models/work_items/widgets/assignees.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ class Assignees < Base
+ delegate :assignees, to: :work_item
+ delegate :allows_multiple_assignees?, to: :work_item
+ end
+ end
+end
diff --git a/app/models/work_items/widgets/description.rb b/app/models/work_items/widgets/description.rb
index 35b6d295321..1e84d172bef 100644
--- a/app/models/work_items/widgets/description.rb
+++ b/app/models/work_items/widgets/description.rb
@@ -4,10 +4,6 @@ module WorkItems
module Widgets
class Description < Base
delegate :description, to: :work_item
-
- def update(params:)
- work_item.description = params[:description] if params&.key?(:description)
- end
end
end
end
diff --git a/app/models/work_items/widgets/hierarchy.rb b/app/models/work_items/widgets/hierarchy.rb
index dadd341de83..930aced8ace 100644
--- a/app/models/work_items/widgets/hierarchy.rb
+++ b/app/models/work_items/widgets/hierarchy.rb
@@ -4,13 +4,13 @@ module WorkItems
module Widgets
class Hierarchy < Base
def parent
- return unless Feature.enabled?(:work_items_hierarchy, work_item.project)
+ return unless work_item.project.work_items_feature_flag_enabled?
work_item.work_item_parent
end
def children
- return WorkItem.none unless Feature.enabled?(:work_items_hierarchy, work_item.project)
+ return WorkItem.none unless work_item.project.work_items_feature_flag_enabled?
work_item.work_item_children
end
diff --git a/app/models/work_items/widgets/weight.rb b/app/models/work_items/widgets/weight.rb
new file mode 100644
index 00000000000..f589378f307
--- /dev/null
+++ b/app/models/work_items/widgets/weight.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ class Weight < Base
+ delegate :weight, to: :work_item
+ end
+ end
+end
diff --git a/app/models/x509_certificate.rb b/app/models/x509_certificate.rb
index 2c1d0110b7c..7c2581b8bb2 100644
--- a/app/models/x509_certificate.rb
+++ b/app/models/x509_certificate.rb
@@ -16,7 +16,7 @@ class X509Certificate < ApplicationRecord
has_many :x509_commit_signatures, class_name: 'CommitSignatures::X509CommitSignature', inverse_of: 'x509_certificate'
# rfc 5280 - 4.2.1.2 Subject Key Identifier
- validates :subject_key_identifier, presence: true, format: { with: /\A(\h{2}:){19}\h{2}\z/ }
+ validates :subject_key_identifier, presence: true, format: { with: Gitlab::Regex.x509_subject_key_identifier_regex }
# rfc 5280 - 4.1.2.6 Subject
validates :subject, presence: true
# rfc 5280 - 4.1.2.6 Subject (subjectAltName contains the email address)
diff --git a/app/models/x509_issuer.rb b/app/models/x509_issuer.rb
index 4b75e38bbde..81491d8e507 100644
--- a/app/models/x509_issuer.rb
+++ b/app/models/x509_issuer.rb
@@ -4,7 +4,7 @@ class X509Issuer < ApplicationRecord
has_many :x509_certificates, inverse_of: 'x509_issuer'
# rfc 5280 - 4.2.1.1 Authority Key Identifier
- validates :subject_key_identifier, presence: true, format: { with: /\A(\h{2}:){19}\h{2}\z/ }
+ validates :subject_key_identifier, presence: true, format: { with: Gitlab::Regex.x509_subject_key_identifier_regex }
# rfc 5280 - 4.1.2.4 Issuer
validates :subject, presence: true
# rfc 5280 - 4.2.1.13 CRL Distribution Points
diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb
index fa7b117f3cd..406144b7a5c 100644
--- a/app/policies/global_policy.rb
+++ b/app/policies/global_policy.rb
@@ -120,6 +120,8 @@ class GlobalPolicy < BasePolicy
# We can't use `read_statistics` because the user may have different permissions for different projects
rule { admin }.enable :use_project_statistics_filters
+ rule { admin }.enable :delete_runners
+
rule { external_user }.prevent :create_snippet
end
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 6ca30ba5dab..50b6f4bbe15 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -154,6 +154,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
rule { reporter }.policy do
enable :reporter_access
enable :read_container_image
+ enable :read_harbor_registry
enable :admin_issue_board
enable :admin_label
enable :admin_milestone
@@ -179,6 +180,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :read_deploy_token
enable :create_jira_connect_subscription
enable :maintainer_access
+ enable :maintain_namespace
end
rule { owner }.policy do
diff --git a/app/policies/incident_management/timeline_event_policy.rb b/app/policies/incident_management/timeline_event_policy.rb
index 514a2bf0a56..d8c3b283cd0 100644
--- a/app/policies/incident_management/timeline_event_policy.rb
+++ b/app/policies/incident_management/timeline_event_policy.rb
@@ -3,5 +3,15 @@
module IncidentManagement
class TimelineEventPolicy < ::BasePolicy
delegate { @subject.incident }
+
+ condition(:is_editable, scope: :subject, score: 0) { @subject.editable? }
+
+ rule { ~can?(:admin_incident_management_timeline_event) }.policy do
+ prevent :edit_incident_management_timeline_event
+ end
+
+ rule { is_editable }.policy do
+ enable :edit_incident_management_timeline_event
+ end
end
end
diff --git a/app/policies/issue_policy.rb b/app/policies/issue_policy.rb
index 2b6dcc56fa0..0a0a35d41cc 100644
--- a/app/policies/issue_policy.rb
+++ b/app/policies/issue_policy.rb
@@ -57,13 +57,7 @@ class IssuePolicy < IssuablePolicy
enable :update_subscription
end
- # admin can set metadata on new issues
- rule { ~persisted & admin }.policy do
- enable :set_issue_metadata
- end
-
- # support bot needs to be able to set metadata on new issues when service desk is enabled
- rule { ~persisted & support_bot & can?(:guest_access) }.policy do
+ rule { can?(:admin_issue) }.policy do
enable :set_issue_metadata
end
@@ -72,10 +66,6 @@ class IssuePolicy < IssuablePolicy
enable :set_issue_metadata
end
- rule { persisted & can?(:admin_issue) }.policy do
- enable :set_issue_metadata
- end
-
rule { can?(:set_issue_metadata) }.policy do
enable :set_confidentiality
end
diff --git a/app/policies/merge_request_policy.rb b/app/policies/merge_request_policy.rb
index 96002d98afe..bda327cb661 100644
--- a/app/policies/merge_request_policy.rb
+++ b/app/policies/merge_request_policy.rb
@@ -14,7 +14,7 @@ class MergeRequestPolicy < IssuablePolicy
prevent :accept_merge_request
end
- rule { can?(:update_merge_request) }.policy do
+ rule { can?(:update_merge_request) & is_project_member }.policy do
enable :approve_merge_request
end
diff --git a/app/policies/namespaces/user_namespace_policy.rb b/app/policies/namespaces/user_namespace_policy.rb
index 028247497e5..26112332003 100644
--- a/app/policies/namespaces/user_namespace_policy.rb
+++ b/app/policies/namespaces/user_namespace_policy.rb
@@ -11,6 +11,7 @@ module Namespaces
enable :owner_access
enable :create_projects
enable :admin_namespace
+ enable :maintain_namespace
enable :read_namespace
enable :read_statistics
enable :create_jira_connect_subscription
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 2594310c498..54270dc186e 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -195,6 +195,8 @@ class ProjectPolicy < BasePolicy
with_scope :subject
condition(:packages_disabled) { !@subject.packages_enabled }
+ condition(:work_items_enabled, scope: :subject) { project&.work_items_feature_flag_enabled? }
+
features = %w[
merge_requests
issues
@@ -223,6 +225,10 @@ class ProjectPolicy < BasePolicy
Gitlab.config.registry.enabled
end
+ condition :packages_enabled do
+ Gitlab.config.packages.enabled
+ end
+
# `:read_project` may be prevented in EE, but `:read_project_for_iids` should
# not.
rule { guest | admin }.enable :read_project_for_iids
@@ -290,10 +296,9 @@ class ProjectPolicy < BasePolicy
rule { can?(:reporter_access) & can?(:create_issue) }.enable :create_incident
- rule { can?(:create_issue) }.policy do
- enable :create_task
- enable :create_work_item
- end
+ rule { can?(:create_issue) }.enable :create_work_item
+
+ rule { can?(:create_issue) & work_items_enabled }.enable :create_task
# These abilities are not allowed to admins that are not members of the project,
# that's why they are defined separately.
@@ -317,6 +322,7 @@ class ProjectPolicy < BasePolicy
enable :read_commit_status
enable :read_build
enable :read_container_image
+ enable :read_harbor_registry
enable :read_deploy_board
enable :read_pipeline
enable :read_pipeline_schedule
@@ -490,6 +496,7 @@ class ProjectPolicy < BasePolicy
enable :update_runners_registration_token
enable :admin_project_google_cloud
enable :admin_secure_files
+ enable :read_web_hooks
end
rule { public_project & metrics_dashboard_allowed }.policy do
@@ -792,6 +799,10 @@ class ProjectPolicy < BasePolicy
enable :view_package_registry_project_settings
end
+ rule { packages_enabled & can?(:admin_package) }.policy do
+ enable :view_package_registry_project_settings
+ end
+
private
def user_is_user?
diff --git a/app/policies/work_item_policy.rb b/app/policies/work_item_policy.rb
index ea7559592e1..2f3561f1135 100644
--- a/app/policies/work_item_policy.rb
+++ b/app/policies/work_item_policy.rb
@@ -13,4 +13,8 @@ class WorkItemPolicy < IssuePolicy
# need to make sure we also prevent this rule if read_issue
# is prevented
rule { ~can?(:read_issue) }.prevent :read_work_item
+
+ rule { can?(:reporter_access) }.policy do
+ enable :admin_parent_link
+ end
end
diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb
index 2dcc6cd5df3..74ac47fa439 100644
--- a/app/presenters/blob_presenter.rb
+++ b/app/presenters/blob_presenter.rb
@@ -69,7 +69,7 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def find_file_path
- url_helpers.project_find_file_path(project, ref_qualified_path)
+ url_helpers.project_find_file_path(project, blob.commit_id)
end
def blame_path
diff --git a/app/presenters/ci/build_presenter.rb b/app/presenters/ci/build_presenter.rb
index 0be684901d5..513fcd90cf8 100644
--- a/app/presenters/ci/build_presenter.rb
+++ b/app/presenters/ci/build_presenter.rb
@@ -4,16 +4,6 @@ module Ci
class BuildPresenter < ProcessablePresenter
presents ::Ci::Build, as: :build
- def erased_by_user?
- # Build can be erased through API, therefore it does not have
- # `erased_by` user assigned in that case.
- erased? && erased_by
- end
-
- def erased_by_name
- erased_by.name if erased_by_user?
- end
-
def status_title(status = detailed_status)
if auto_canceled?
"Job is redundant and is auto-canceled by Pipeline ##{auto_canceled_by_id}"
@@ -33,10 +23,6 @@ module Ci
end
end
- def tooltip_message
- "#{build.name} - #{detailed_status.status_tooltip}"
- end
-
def execute_in
scheduled? && scheduled_at && [0, scheduled_at - Time.now].max
end
diff --git a/app/presenters/ci/legacy_stage_presenter.rb b/app/presenters/ci/legacy_stage_presenter.rb
deleted file mode 100644
index c803abfab6a..00000000000
--- a/app/presenters/ci/legacy_stage_presenter.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module Ci
- class LegacyStagePresenter < Gitlab::View::Presenter::Delegated
- presents ::Ci::LegacyStage, as: :legacy_stage
-
- def latest_ordered_statuses
- preload_statuses(legacy_stage.statuses.latest_ordered)
- end
-
- def retried_ordered_statuses
- preload_statuses(legacy_stage.statuses.retried_ordered)
- end
-
- private
-
- def preload_statuses(statuses)
- Preloaders::CommitStatusPreloader.new(statuses).execute(Ci::StagePresenter::PRELOADED_RELATIONS)
-
- statuses
- end
- end
-end
diff --git a/app/presenters/clusters/cluster_presenter.rb b/app/presenters/clusters/cluster_presenter.rb
index 454e5c0e44a..ec1dc96c2e3 100644
--- a/app/presenters/clusters/cluster_presenter.rb
+++ b/app/presenters/clusters/cluster_presenter.rb
@@ -52,16 +52,6 @@ module Clusters
end
end
- def gitlab_managed_apps_logs_path
- return unless logs_project && can_read_cluster?
-
- if cluster.elastic_stack_adapter&.available?
- elasticsearch_project_logs_path(logs_project, cluster_id: cluster.id, format: :json)
- else
- k8s_project_logs_path(logs_project, cluster_id: cluster.id, format: :json)
- end
- end
-
def read_only_kubernetes_platform_fields?
!cluster.provided_by_user?
end
diff --git a/app/presenters/clusters/integration_presenter.rb b/app/presenters/clusters/integration_presenter.rb
index f7be59f00f3..af735e1c18b 100644
--- a/app/presenters/clusters/integration_presenter.rb
+++ b/app/presenters/clusters/integration_presenter.rb
@@ -2,7 +2,7 @@
module Clusters
class IntegrationPresenter < Gitlab::View::Presenter::Delegated
- presents ::Clusters::Integrations::Prometheus, ::Clusters::Integrations::ElasticStack, as: :integration
+ presents ::Clusters::Integrations::Prometheus, as: :integration
def application_type
integration.class.name.demodulize.underscore
diff --git a/app/presenters/commit_status_presenter.rb b/app/presenters/commit_status_presenter.rb
index 675288da35b..815a4da25ab 100644
--- a/app/presenters/commit_status_presenter.rb
+++ b/app/presenters/commit_status_presenter.rb
@@ -16,8 +16,11 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated
data_integrity_failure: 'There has been a structural integrity problem detected, please contact system administrator',
forward_deployment_failure: 'The deployment job is older than the previously succeeded deployment job, and therefore cannot be run',
pipeline_loop_detected: 'This job could not be executed because it would create infinitely looping pipelines',
+ insufficient_upstream_permissions: 'This job could not be executed because of insufficient permissions to track the upstream project.',
+ upstream_bridge_project_not_found: 'This job could not be executed because upstream bridge project could not be found.',
invalid_bridge_trigger: 'This job could not be executed because downstream pipeline trigger definition is invalid',
downstream_bridge_project_not_found: 'This job could not be executed because downstream bridge project could not be found',
+ protected_environment_failure: 'The environment this job is deploying to is protected. Only users with permission may successfully run this job.',
insufficient_bridge_permissions: 'This job could not be executed because of insufficient permissions to create a downstream pipeline',
bridge_pipeline_is_child_pipeline: 'This job belongs to a child pipeline and cannot create further child pipelines',
downstream_pipeline_creation_failed: 'The downstream pipeline could not be created',
@@ -62,5 +65,3 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated
ActionController::Base.helpers.link_to('How do I fix it?', help_page_path(path, anchor: anchor))
end
end
-
-CommitStatusPresenter.prepend_mod_with('CommitStatusPresenter')
diff --git a/app/presenters/gitlab/blame_presenter.rb b/app/presenters/gitlab/blame_presenter.rb
index 81a954761ea..6230e61d2be 100644
--- a/app/presenters/gitlab/blame_presenter.rb
+++ b/app/presenters/gitlab/blame_presenter.rb
@@ -66,7 +66,7 @@ module Gitlab
previous_commit_id = commit.parent_id
return unless previous_commit_id && !previous_path.nil?
- link_to project_blame_path(project, tree_join(previous_commit_id, previous_path)),
+ link_to project_blame_path(project, tree_join(previous_commit_id, previous_path), page: page),
title: _('View blame prior to this change'),
aria: { label: _('View blame prior to this change') },
class: 'version-link',
diff --git a/app/presenters/invitation_presenter.rb b/app/presenters/invitation_presenter.rb
deleted file mode 100644
index ada8227a477..00000000000
--- a/app/presenters/invitation_presenter.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-class InvitationPresenter < Gitlab::View::Presenter::Delegated
- presents nil, as: :invitation
-end
diff --git a/app/presenters/terraform/module_version_presenter.rb b/app/presenters/terraform/module_version_presenter.rb
new file mode 100644
index 00000000000..776a4d8ab82
--- /dev/null
+++ b/app/presenters/terraform/module_version_presenter.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Terraform
+ class ModuleVersionPresenter < Gitlab::View::Presenter::Simple
+ attr_accessor :package, :system
+
+ def initialize(package, system)
+ @package = package
+ @system = system
+ end
+
+ def name
+ package.name
+ end
+
+ def provider
+ system
+ end
+
+ def providers
+ [
+ provider
+ ]
+ end
+
+ def root
+ {
+ 'dependencies' => []
+ }
+ end
+
+ def source
+ package&.project&.web_url
+ end
+
+ def submodules
+ []
+ end
+
+ def version
+ package.version
+ end
+
+ def versions
+ [
+ version
+ ]
+ end
+ end
+end
diff --git a/app/serializers/README.md b/app/serializers/README.md
index d83c2061e0b..6bab3c83e1b 100644
--- a/app/serializers/README.md
+++ b/app/serializers/README.md
@@ -22,6 +22,10 @@ Using serializers, instead of `to_json` method, has several benefits:
* it makes it easier to reduce merge conflicts between CE -> EE
* it makes it easier to benefit from domain driven development techniques
+## Security considerations
+
+Consult the `Serialization` section of our [Secure Coding Guidelines](../../doc/development/secure_coding_guidelines.md#serialization) to help avoiding leaking sensitive attributes when using serializers.
+
## What is a serializer?
A serializer is a class that encapsulates all business rules for building a
diff --git a/app/serializers/ci/job_entity.rb b/app/serializers/ci/job_entity.rb
index b6b11e54a16..813938c2a18 100644
--- a/app/serializers/ci/job_entity.rb
+++ b/app/serializers/ci/job_entity.rb
@@ -41,6 +41,8 @@ module Ci
expose :scheduled?, as: :scheduled
expose :scheduled_at, if: -> (*) { scheduled? }
expose :created_at
+ expose :queued_at
+ expose :queued_duration
expose :updated_at
expose :detailed_status, as: :status, with: DetailedStatusEntity
expose :callout_message, if: -> (*) { failed? && !job.script_failure? }
diff --git a/app/serializers/ci/job_serializer.rb b/app/serializers/ci/job_serializer.rb
index 01f9e223943..37213ee284a 100644
--- a/app/serializers/ci/job_serializer.rb
+++ b/app/serializers/ci/job_serializer.rb
@@ -3,10 +3,5 @@
module Ci
class JobSerializer < BaseSerializer
entity Ci::JobEntity
-
- def represent_status(resource)
- data = represent(resource, { only: [:status] })
- data.fetch(:status, {})
- end
end
end
diff --git a/app/serializers/cluster_entity.rb b/app/serializers/cluster_entity.rb
index df72a994143..8e256863bcd 100644
--- a/app/serializers/cluster_entity.rb
+++ b/app/serializers/cluster_entity.rb
@@ -19,21 +19,7 @@ class ClusterEntity < Grape::Entity
Clusters::ClusterPresenter.new(cluster).show_path # rubocop: disable CodeReuse/Presenter
end
- expose :gitlab_managed_apps_logs_path, if: -> (*) { logging_enabled? } do |cluster|
- Clusters::ClusterPresenter.new(cluster, current_user: request.current_user).gitlab_managed_apps_logs_path # rubocop: disable CodeReuse/Presenter
- end
-
expose :kubernetes_errors do |cluster|
Clusters::KubernetesErrorEntity.new(cluster)
end
-
- expose :enable_advanced_logs_querying, if: -> (*) { logging_enabled? } do |cluster|
- cluster.elastic_stack_available?
- end
-
- private
-
- def logging_enabled?
- Feature.enabled?(:monitor_logging, object.project)
- end
end
diff --git a/app/serializers/cluster_serializer.rb b/app/serializers/cluster_serializer.rb
index f71591612a6..30b8863efa2 100644
--- a/app/serializers/cluster_serializer.rb
+++ b/app/serializers/cluster_serializer.rb
@@ -10,8 +10,6 @@ class ClusterSerializer < BaseSerializer
:cluster_type,
:enabled,
:environment_scope,
- :gitlab_managed_apps_logs_path,
- :enable_advanced_logs_querying,
:id,
:kubernetes_errors,
:name,
diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb
index ac99463bd64..3473b4aebc8 100644
--- a/app/serializers/environment_entity.rb
+++ b/app/serializers/environment_entity.rb
@@ -66,22 +66,6 @@ class EnvironmentEntity < Grape::Entity
environment.available? && can?(current_user, :stop_environment, environment)
end
- expose :logs_path, if: -> (*) { can_read_pod_logs? } do |environment|
- project_logs_path(environment.project, environment_name: environment.name)
- end
-
- expose :logs_api_path, if: -> (*) { can_read_pod_logs? } do |environment|
- if environment.elastic_stack_available?
- elasticsearch_project_logs_path(environment.project, environment_name: environment.name, format: :json)
- else
- k8s_project_logs_path(environment.project, environment_name: environment.name, format: :json)
- end
- end
-
- expose :enable_advanced_logs_querying, if: -> (*) { can_read_pod_logs? } do |environment|
- environment.elastic_stack_available?
- end
-
expose :can_delete do |environment|
can?(current_user, :destroy_environment, environment)
end
@@ -102,11 +86,6 @@ class EnvironmentEntity < Grape::Entity
can?(current_user, :update_environment, environment)
end
- def can_read_pod_logs?
- Feature.enabled?(:monitor_logging, environment.project) &&
- can?(current_user, :read_pod_logs, environment.project)
- end
-
def can_read_deploy_board?
can?(current_user, :read_deploy_board, environment.project)
end
diff --git a/app/serializers/error_tracking/error_entity.rb b/app/serializers/error_tracking/error_entity.rb
index 91388e7c3ad..49644ed2fe7 100644
--- a/app/serializers/error_tracking/error_entity.rb
+++ b/app/serializers/error_tracking/error_entity.rb
@@ -2,7 +2,11 @@
module ErrorTracking
class ErrorEntity < Grape::Entity
- expose :id, :title, :type, :user_count, :count,
+ expose :id do |error|
+ error.id.to_s
+ end
+
+ expose :title, :type, :user_count, :count,
:first_seen, :last_seen, :message, :culprit,
:external_url, :project_id, :project_name, :project_slug,
:short_id, :status, :frequency
diff --git a/app/serializers/integrations/event_entity.rb b/app/serializers/integrations/event_entity.rb
index 170f660f334..91bd91dd941 100644
--- a/app/serializers/integrations/event_entity.rb
+++ b/app/serializers/integrations/event_entity.rb
@@ -18,12 +18,12 @@ module Integrations
IntegrationsHelper.integration_event_description(integration, event)
end
- expose :field, if: ->(_, _) { event_field } do
+ expose :field, if: ->(_, _) { integration.try(:configurable_channels?) } do
expose :name do |event|
- event_field[:name]
+ integration.event_channel_name(event)
end
expose :value do |event|
- integration.public_send(event_field[:name]) # rubocop:disable GitlabSecurity/PublicSend
+ integration.event_channel_value(event)
end
end
@@ -35,10 +35,6 @@ module Integrations
IntegrationsHelper.integration_event_field_name(event)
end
- def event_field
- @event_field ||= integration.event_field(event)
- end
-
def integration
request.integration
end
diff --git a/app/serializers/integrations/harbor_serializers/artifact_entity.rb b/app/serializers/integrations/harbor_serializers/artifact_entity.rb
new file mode 100644
index 00000000000..010380561eb
--- /dev/null
+++ b/app/serializers/integrations/harbor_serializers/artifact_entity.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Integrations
+ module HarborSerializers
+ class ArtifactEntity < Grape::Entity
+ include ActionView::Helpers::SanitizeHelper
+
+ expose :harbor_id do |item|
+ item['id']
+ end
+
+ expose :digest do |item|
+ strip_tags(item['digest'])
+ end
+
+ expose :size do |item|
+ item['size']
+ end
+
+ expose :push_time do |item|
+ item['push_time']&.to_datetime&.utc
+ end
+
+ expose :tags do |item|
+ item['tags'].map { |tag| strip_tags(tag['name']) }
+ end
+ end
+ end
+end
diff --git a/app/serializers/integrations/harbor_serializers/artifact_serializer.rb b/app/serializers/integrations/harbor_serializers/artifact_serializer.rb
new file mode 100644
index 00000000000..aaf78a72330
--- /dev/null
+++ b/app/serializers/integrations/harbor_serializers/artifact_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Integrations
+ module HarborSerializers
+ class ArtifactSerializer < BaseSerializer
+ include WithPagination
+
+ entity ::Integrations::HarborSerializers::ArtifactEntity
+ end
+ end
+end
diff --git a/app/serializers/integrations/harbor_serializers/repository_entity.rb b/app/serializers/integrations/harbor_serializers/repository_entity.rb
new file mode 100644
index 00000000000..f03465fe8e2
--- /dev/null
+++ b/app/serializers/integrations/harbor_serializers/repository_entity.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Integrations
+ module HarborSerializers
+ class RepositoryEntity < Grape::Entity
+ include ActionView::Helpers::SanitizeHelper
+
+ expose :harbor_id do |item|
+ item['id']
+ end
+
+ expose :name do |item|
+ strip_tags(item['name'])
+ end
+
+ expose :artifact_count do |item|
+ item['artifact_count']
+ end
+
+ expose :creation_time do |item|
+ item['creation_time']&.to_datetime&.utc
+ end
+
+ expose :update_time do |item|
+ item['update_time']&.to_datetime&.utc
+ end
+
+ expose :harbor_project_id do |item|
+ item['project_id']
+ end
+
+ expose :pull_count do |item|
+ item['pull_count']
+ end
+
+ expose :location do |item|
+ path = [
+ 'harbor/projects',
+ item['project_id'].to_s,
+ 'repositories',
+ item['name'].remove("#{options[:project_name]}/")
+ ].join('/')
+ path = validate_path(path)
+ strip_tags(Gitlab::Utils.append_path(options[:url], path))
+ end
+
+ private
+
+ def validate_path(path)
+ Gitlab::Utils.check_path_traversal!(path)
+ rescue ::Gitlab::Utils::PathTraversalAttackError
+ Gitlab::AppLogger.error("Path traversal attack detected #{path}")
+ ''
+ end
+ end
+ end
+end
diff --git a/app/serializers/integrations/harbor_serializers/repository_serializer.rb b/app/serializers/integrations/harbor_serializers/repository_serializer.rb
new file mode 100644
index 00000000000..9b9e089eab8
--- /dev/null
+++ b/app/serializers/integrations/harbor_serializers/repository_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Integrations
+ module HarborSerializers
+ class RepositorySerializer < BaseSerializer
+ include WithPagination
+
+ entity ::Integrations::HarborSerializers::RepositoryEntity
+ end
+ end
+end
diff --git a/app/serializers/integrations/harbor_serializers/tag_entity.rb b/app/serializers/integrations/harbor_serializers/tag_entity.rb
new file mode 100644
index 00000000000..8c26bc1ecbd
--- /dev/null
+++ b/app/serializers/integrations/harbor_serializers/tag_entity.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Integrations
+ module HarborSerializers
+ class TagEntity < Grape::Entity
+ include ActionView::Helpers::SanitizeHelper
+
+ expose :harbor_repository_id do |item|
+ item['repository_id']
+ end
+
+ expose :harbor_artifact_id do |item|
+ item['artifact_id']
+ end
+
+ expose :harbor_id do |item|
+ item['id']
+ end
+
+ expose :name do |item|
+ strip_tags(item['name'])
+ end
+
+ expose :pull_time do |item|
+ item['pull_time']&.to_datetime&.utc
+ end
+
+ expose :push_time do |item|
+ item['push_time']&.to_datetime&.utc
+ end
+
+ expose :signed do |item|
+ item['signed']
+ end
+
+ expose :immutable do |item|
+ item['immutable']
+ end
+ end
+ end
+end
diff --git a/app/serializers/integrations/harbor_serializers/tag_serializer.rb b/app/serializers/integrations/harbor_serializers/tag_serializer.rb
new file mode 100644
index 00000000000..7111e65e3e6
--- /dev/null
+++ b/app/serializers/integrations/harbor_serializers/tag_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Integrations
+ module HarborSerializers
+ class TagSerializer < BaseSerializer
+ include WithPagination
+
+ entity ::Integrations::HarborSerializers::TagEntity
+ end
+ end
+end
diff --git a/app/serializers/issue_entity.rb b/app/serializers/issue_entity.rb
index eba2c49bc2e..ea43ed87d22 100644
--- a/app/serializers/issue_entity.rb
+++ b/app/serializers/issue_entity.rb
@@ -73,7 +73,7 @@ class IssueEntity < IssuableEntity
end
expose :archived_project_docs_path, if: -> (issue) { issue.project.archived? } do |issue|
- help_page_path('user/project/settings/index.md', anchor: 'archiving-a-project')
+ help_page_path('user/project/settings/index.md', anchor: 'archive-a-project')
end
expose :issue_email_participants do |issue|
diff --git a/app/serializers/merge_request_basic_entity.rb b/app/serializers/merge_request_basic_entity.rb
index 7d45484fc2f..2820c88b293 100644
--- a/app/serializers/merge_request_basic_entity.rb
+++ b/app/serializers/merge_request_basic_entity.rb
@@ -7,6 +7,7 @@ class MergeRequestBasicEntity < Grape::Entity
expose :state
expose :source_branch_exists?, as: :source_branch_exists
expose :rebase_in_progress?, as: :rebase_in_progress
+ expose :should_be_rebased?, as: :should_be_rebased
expose :milestone, using: API::Entities::Milestone
expose :labels, using: LabelEntity
expose :assignees, using: API::Entities::UserBasic
diff --git a/app/serializers/stage_entity.rb b/app/serializers/stage_entity.rb
index 548ff577863..f278ccfce73 100644
--- a/app/serializers/stage_entity.rb
+++ b/app/serializers/stage_entity.rb
@@ -50,14 +50,6 @@ class StageEntity < Grape::Entity
stage.detailed_status(request.current_user)
end
- def grouped_statuses
- @grouped_statuses ||= stage.statuses.latest_ordered.group_by(&:status)
- end
-
- def grouped_retried_statuses
- @grouped_retried_statuses ||= stage.statuses.retried_ordered.group_by(&:status)
- end
-
def latest_statuses
Ci::HasStatus::ORDERED_STATUSES.flat_map do |ordered_status|
grouped_statuses.fetch(ordered_status, [])
@@ -69,4 +61,18 @@ class StageEntity < Grape::Entity
grouped_retried_statuses.fetch(ordered_status, [])
end
end
+
+ def grouped_statuses
+ @grouped_statuses ||= preload_metadata(stage.statuses.latest_ordered).group_by(&:status)
+ end
+
+ def grouped_retried_statuses
+ @grouped_retried_statuses ||= preload_metadata(stage.statuses.retried_ordered).group_by(&:status)
+ end
+
+ def preload_metadata(statuses)
+ Preloaders::CommitStatusPreloader.new(statuses).execute([:metadata])
+
+ statuses
+ end
end
diff --git a/app/services/alert_management/alerts/update_service.rb b/app/services/alert_management/alerts/update_service.rb
index 6bdceb0f27b..f273e15b159 100644
--- a/app/services/alert_management/alerts/update_service.rb
+++ b/app/services/alert_management/alerts/update_service.rb
@@ -12,7 +12,6 @@ module AlertManagement
@alert = alert
@param_errors = []
@status = params.delete(:status)
- @status_change_reason = params.delete(:status_change_reason)
super(project: alert.project, current_user: current_user, params: params)
end
@@ -37,7 +36,7 @@ module AlertManagement
private
- attr_reader :alert, :param_errors, :status, :status_change_reason
+ attr_reader :alert, :param_errors, :status
def allowed?
current_user&.can?(:update_alert_management_alert, alert)
@@ -130,37 +129,16 @@ module AlertManagement
def handle_status_change
add_status_change_system_note
resolve_todos if alert.resolved?
- sync_to_incident if should_sync_to_incident?
end
def add_status_change_system_note
- SystemNoteService.change_alert_status(alert, current_user, status_change_reason)
+ SystemNoteService.change_alert_status(alert, current_user)
end
def resolve_todos
todo_service.resolve_todos_for_target(alert, current_user)
end
- def sync_to_incident
- ::Issues::UpdateService.new(
- project: project,
- current_user: current_user,
- params: {
- escalation_status: {
- status: status,
- status_change_reason: " by changing the status of #{alert.to_reference(project)}"
- }
- }
- ).execute(alert.issue)
- end
-
- def should_sync_to_incident?
- alert.issue &&
- alert.issue.supports_escalation? &&
- alert.issue.escalation_status &&
- alert.issue.escalation_status.status != alert.status
- end
-
def filter_duplicate
# Only need to check if changing to a not-resolved status
return if params[:status_event].blank? || params[:status_event] == :resolve
diff --git a/app/services/audit_event_service.rb b/app/services/audit_event_service.rb
index 97debccfb18..26244a8bcc5 100644
--- a/app/services/audit_event_service.rb
+++ b/app/services/audit_event_service.rb
@@ -121,12 +121,15 @@ class AuditEventService
def log_security_event_to_database
return if Gitlab::Database.read_only?
- event = AuditEvent.new(base_payload.merge(details: @details))
+ event = build_event
save_or_track event
-
event
end
+ def build_event
+ AuditEvent.new(base_payload.merge(details: @details))
+ end
+
def stream_event_to_external_destinations(_event)
# Defined in EE
end
diff --git a/app/services/auto_merge/base_service.rb b/app/services/auto_merge/base_service.rb
index 2a32f0c74ac..9e49bd86ec0 100644
--- a/app/services/auto_merge/base_service.rb
+++ b/app/services/auto_merge/base_service.rb
@@ -63,21 +63,6 @@ module AutoMerge
end
end
- ##
- # NOTE: This method is to be removed when `disallow_to_create_merge_request_pipelines_in_target_project`
- # feature flag is removed.
- def self.can_add_to_merge_train?(merge_request)
- if ::Feature.enabled?(:ci_disallow_to_create_merge_request_pipelines_in_target_project, merge_request.target_project)
- merge_request.for_same_project?
- else
- true
- end
- end
-
- def can_add_to_merge_train?(merge_request)
- self.class.can_add_to_merge_train?(merge_request)
- end
-
private
# Overridden in child classes
diff --git a/app/services/bulk_imports/create_pipeline_trackers_service.rb b/app/services/bulk_imports/create_pipeline_trackers_service.rb
index 5c9c68e62b5..af97aec09b5 100644
--- a/app/services/bulk_imports/create_pipeline_trackers_service.rb
+++ b/app/services/bulk_imports/create_pipeline_trackers_service.rb
@@ -47,7 +47,7 @@ module BulkImports
end
def non_patch_source_version
- Gitlab::VersionInfo.new(source_version.major, source_version.minor, 0)
+ source_version.without_patch
end
def log_skipped_pipeline(pipeline, minimum_version, maximum_version)
diff --git a/app/services/ci/build_report_result_service.rb b/app/services/ci/build_report_result_service.rb
index 8bdb51320f9..f9146b3677a 100644
--- a/app/services/ci/build_report_result_service.rb
+++ b/app/services/ci/build_report_result_service.rb
@@ -22,7 +22,7 @@ module Ci
private
def generate_test_suite_report(build)
- build.collect_test_reports!(Gitlab::Ci::Reports::TestReports.new)
+ build.collect_test_reports!(Gitlab::Ci::Reports::TestReport.new)
end
def tests_params(test_suite)
diff --git a/app/services/ci/external_pull_requests/create_pipeline_service.rb b/app/services/ci/external_pull_requests/create_pipeline_service.rb
index 66127c94d35..ffc129eccda 100644
--- a/app/services/ci/external_pull_requests/create_pipeline_service.rb
+++ b/app/services/ci/external_pull_requests/create_pipeline_service.rb
@@ -10,24 +10,12 @@ module Ci
return pull_request_not_open_error unless pull_request.open?
return pull_request_branch_error unless pull_request.actual_branch_head?
- create_pipeline_for(pull_request)
- end
-
- private
-
- def create_pipeline_for(pull_request)
Ci::ExternalPullRequests::CreatePipelineWorker.perform_async(
project.id, current_user.id, pull_request.id
)
end
- def create_params(pull_request)
- {
- ref: pull_request.source_ref,
- source_sha: pull_request.source_sha,
- target_sha: pull_request.target_sha
- }
- end
+ private
def pull_request_not_open_error
ServiceResponse.error(message: 'The pull request is not opened', payload: nil)
diff --git a/app/services/ci/generate_coverage_reports_service.rb b/app/services/ci/generate_coverage_reports_service.rb
index 12b1f19f4b5..81f26e84ef8 100644
--- a/app/services/ci/generate_coverage_reports_service.rb
+++ b/app/services/ci/generate_coverage_reports_service.rb
@@ -32,5 +32,18 @@ module Ci
def latest?(base_pipeline, head_pipeline, data)
data&.fetch(:key, nil) == key(base_pipeline, head_pipeline)
end
+
+ private
+
+ def key(base_pipeline, head_pipeline)
+ [
+ base_pipeline&.id, last_update_timestamp(base_pipeline),
+ head_pipeline&.id, last_update_timestamp(head_pipeline)
+ ]
+ end
+
+ def last_update_timestamp(pipeline_hierarchy)
+ pipeline_hierarchy&.self_and_descendants&.maximum(:updated_at)
+ end
end
end
diff --git a/app/services/ci/job_artifacts/create_service.rb b/app/services/ci/job_artifacts/create_service.rb
index 635111130d6..05f8e804c67 100644
--- a/app/services/ci/job_artifacts/create_service.rb
+++ b/app/services/ci/job_artifacts/create_service.rb
@@ -5,10 +5,7 @@ module Ci
class CreateService < ::BaseService
include Gitlab::Utils::UsageData
- ArtifactsExistError = Class.new(StandardError)
-
LSIF_ARTIFACT_TYPE = 'lsif'
- METRICS_REPORT_UPLOAD_EVENT_NAME = 'i_testing_metrics_report_artifact_uploaders'
OBJECT_STORAGE_ERRORS = [
Errno::EIO,
@@ -74,10 +71,6 @@ module Ci
Ci::JobArtifact.max_artifact_size(type: type, project: project)
end
- def forbidden_type_error(type)
- error("#{type} artifacts are forbidden", :forbidden)
- end
-
def too_large_error
error('file size has reached maximum size limit', :payload_too_large)
end
@@ -160,10 +153,8 @@ module Ci
)
end
- def track_artifact_uploader(artifact)
- return unless artifact.file_type == 'metrics'
-
- track_usage_event(METRICS_REPORT_UPLOAD_EVENT_NAME, @job.user_id)
+ def track_artifact_uploader(_artifact)
+ # Overridden in EE
end
def parse_dotenv_artifact(artifact)
@@ -172,3 +163,5 @@ module Ci
end
end
end
+
+Ci::JobArtifacts::CreateService.prepend_mod
diff --git a/app/services/ci/job_artifacts/destroy_batch_service.rb b/app/services/ci/job_artifacts/destroy_batch_service.rb
index 49b65f13804..9d6b413ce59 100644
--- a/app/services/ci/job_artifacts/destroy_batch_service.rb
+++ b/app/services/ci/job_artifacts/destroy_batch_service.rb
@@ -184,10 +184,12 @@ module Ci
project_ids << artifact.project_id
end
- Gitlab::ProjectStatsRefreshConflictsLogger.warn_skipped_artifact_deletion_during_stats_refresh(
- method: 'Ci::JobArtifacts::DestroyBatchService#execute',
- project_ids: project_ids
- )
+ if project_ids.any?
+ Gitlab::ProjectStatsRefreshConflictsLogger.warn_skipped_artifact_deletion_during_stats_refresh(
+ method: 'Ci::JobArtifacts::DestroyBatchService#execute',
+ project_ids: project_ids
+ )
+ end
end
end
end
diff --git a/app/services/ci/pipeline_artifacts/coverage_report_service.rb b/app/services/ci/pipeline_artifacts/coverage_report_service.rb
index b0acb1d5a0b..c11a8f7a0fd 100644
--- a/app/services/ci/pipeline_artifacts/coverage_report_service.rb
+++ b/app/services/ci/pipeline_artifacts/coverage_report_service.rb
@@ -9,17 +9,11 @@ module Ci
end
def execute
- return if pipeline.has_coverage_reports?
return if report.empty?
- pipeline.pipeline_artifacts.create!(
- project_id: pipeline.project_id,
- file_type: :code_coverage,
- file_format: Ci::PipelineArtifact::REPORT_TYPES.fetch(:code_coverage),
- size: carrierwave_file["tempfile"].size,
- file: carrierwave_file,
- expire_at: Ci::PipelineArtifact::EXPIRATION_DATE.from_now
- )
+ Ci::PipelineArtifact.create_or_replace_for_pipeline!(**pipeline_artifact_params).tap do |pipeline_artifact|
+ Gitlab::AppLogger.info(log_params(pipeline_artifact))
+ end
end
private
@@ -32,6 +26,15 @@ module Ci
end
end
+ def pipeline_artifact_params
+ {
+ pipeline: pipeline,
+ file_type: :code_coverage,
+ file: carrierwave_file,
+ size: carrierwave_file['tempfile'].size
+ }
+ end
+
def carrierwave_file
strong_memoize(:carrier_wave_file) do
CarrierWaveStringFile.new_file(
@@ -41,6 +44,15 @@ module Ci
)
end
end
+
+ def log_params(pipeline_artifact)
+ {
+ project_id: pipeline.project_id,
+ pipeline_id: pipeline.id,
+ pipeline_artifact_id: pipeline_artifact.id,
+ message: "Created code coverage for pipeline."
+ }
+ end
end
end
end
diff --git a/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb b/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb
index 4d1b2e07d7f..676c2ecb257 100644
--- a/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb
+++ b/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb
@@ -78,7 +78,7 @@ module Ci
def status_for_array(statuses, dag:)
result = Gitlab::Ci::Status::Composite
- .new(statuses, dag: dag, project: pipeline.project)
+ .new(statuses, dag: dag)
.status
result || 'success'
end
diff --git a/app/services/ci/queue/build_queue_service.rb b/app/services/ci/queue/build_queue_service.rb
index fefbdb151ec..2deebc1d725 100644
--- a/app/services/ci/queue/build_queue_service.rb
+++ b/app/services/ci/queue/build_queue_service.rb
@@ -24,25 +24,7 @@ module Ci
# rubocop:disable CodeReuse/ActiveRecord
def builds_for_group_runner
- if strategy.use_denormalized_data_strategy?
- strategy.builds_for_group_runner
- else
- # 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
+ strategy.builds_for_group_runner
end
def builds_for_project_runner
@@ -80,11 +62,7 @@ module Ci
def strategy
strong_memoize(:strategy) do
- if ::Feature.enabled?(:ci_pending_builds_queue_source, runner)
- Queue::PendingBuildsStrategy.new(runner)
- else
- Queue::BuildsTableStrategy.new(runner)
- end
+ Queue::PendingBuildsStrategy.new(runner)
end
end
diff --git a/app/services/ci/queue/builds_table_strategy.rb b/app/services/ci/queue/builds_table_strategy.rb
deleted file mode 100644
index c27c10bd18d..00000000000
--- a/app/services/ci/queue/builds_table_strategy.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# 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)
- # 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_group_runner
- raise NotImplementedError
- 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
-
- def use_denormalized_data_strategy?
- false
- 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
index f2eba0681db..c8bdbba5e65 100644
--- a/app/services/ci/queue/pending_builds_strategy.rb
+++ b/app/services/ci/queue/pending_builds_strategy.rb
@@ -23,19 +23,11 @@ module Ci
end
def builds_matching_tag_ids(relation, ids)
- if use_denormalized_data_strategy?
- relation.for_tags(runner.tags_ids)
- else
- relation.merge(CommitStatus.matches_tag_ids(ids, table: 'ci_pending_builds', column: 'build_id'))
- end
+ relation.for_tags(runner.tags_ids)
end
def builds_with_any_tags(relation)
- if use_denormalized_data_strategy?
- relation.where('cardinality(tag_ids) > 0')
- else
- relation.merge(CommitStatus.with_any_tags(table: 'ci_pending_builds', column: 'build_id'))
- end
+ relation.where('cardinality(tag_ids) > 0')
end
def order(relation)
@@ -50,23 +42,10 @@ module Ci
relation.pluck(:build_id)
end
- def use_denormalized_data_strategy?
- ::Feature.enabled?(:ci_queuing_use_denormalized_data_strategy)
- end
-
private
def builds_available_for_shared_runners
- if use_denormalized_data_strategy?
- new_builds.with_instance_runners
- else
- 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')
- end
+ new_builds.with_instance_runners
end
def builds_ordered_for_shared_runners(relation)
diff --git a/app/services/ci/runners/reconcile_existing_runner_versions_service.rb b/app/services/ci/runners/reconcile_existing_runner_versions_service.rb
new file mode 100644
index 00000000000..e04079bfe27
--- /dev/null
+++ b/app/services/ci/runners/reconcile_existing_runner_versions_service.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+module Ci
+ module Runners
+ class ReconcileExistingRunnerVersionsService
+ include BaseServiceUtility
+
+ VERSION_BATCH_SIZE = 100
+
+ def execute
+ insert_result = insert_runner_versions
+ total_deleted = cleanup_runner_versions(insert_result[:versions_from_runners])
+ total_updated = update_status_on_outdated_runner_versions(insert_result[:versions_from_runners])
+
+ success({
+ total_inserted: insert_result[:new_record_count],
+ total_updated: total_updated,
+ total_deleted: total_deleted
+ })
+ end
+
+ private
+
+ def upgrade_check
+ Gitlab::Ci::RunnerUpgradeCheck.instance
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def insert_runner_versions
+ versions_from_runners = Set[]
+ new_record_count = 0
+ Ci::Runner.distinct_each_batch(column: :version, of: VERSION_BATCH_SIZE) do |version_batch|
+ batch_versions = version_batch.pluck(:version).to_set
+ versions_from_runners += batch_versions
+
+ # Avoid hitting primary DB
+ already_existing_versions = Ci::RunnerVersion.where(version: batch_versions).pluck(:version)
+ new_versions = batch_versions - already_existing_versions
+
+ if new_versions.any?
+ new_record_count += Ci::RunnerVersion.insert_all(
+ new_versions.map { |v| { version: v } },
+ returning: :version,
+ unique_by: :version).count
+ end
+ end
+
+ { versions_from_runners: versions_from_runners, new_record_count: new_record_count }
+ end
+
+ def cleanup_runner_versions(versions_from_runners)
+ Ci::RunnerVersion.where.not(version: versions_from_runners).delete_all
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def outdated_runner_versions
+ Ci::RunnerVersion.potentially_outdated
+ end
+
+ def update_status_on_outdated_runner_versions(versions_from_runners)
+ total_updated = 0
+
+ outdated_runner_versions.each_batch(of: VERSION_BATCH_SIZE) do |version_batch|
+ updated = version_batch
+ .select { |runner_version| versions_from_runners.include?(runner_version['version']) }
+ .filter_map { |runner_version| runner_version_with_updated_status(runner_version) }
+
+ if updated.any?
+ total_updated += Ci::RunnerVersion.upsert_all(updated, unique_by: :version).count
+ end
+ end
+
+ total_updated
+ end
+
+ def runner_version_with_updated_status(runner_version)
+ version = runner_version['version']
+ suggestion = upgrade_check.check_runner_upgrade_status(version)
+ new_status = suggestion.each_key.first
+
+ if new_status != :error && new_status != runner_version['status'].to_sym
+ {
+ version: version,
+ status: Ci::RunnerVersion.statuses[new_status]
+ }
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/ci/runners/register_runner_service.rb b/app/services/ci/runners/register_runner_service.rb
index 196d2de1a65..6588cd7e248 100644
--- a/app/services/ci/runners/register_runner_service.rb
+++ b/app/services/ci/runners/register_runner_service.rb
@@ -8,7 +8,19 @@ module Ci
return unless runner_type_attrs
- ::Ci::Runner.create(attributes.merge(runner_type_attrs))
+ runner = ::Ci::Runner.new(attributes.merge(runner_type_attrs))
+
+ Ci::BulkInsertableTags.with_bulk_insert_tags do
+ Ci::Runner.transaction do
+ if runner.save
+ Gitlab::Ci::Tags::BulkInsert.bulk_insert_tags!([runner])
+ else
+ raise ActiveRecord::Rollback
+ end
+ end
+ end
+
+ runner
end
private
diff --git a/app/services/ci/test_failure_history_service.rb b/app/services/ci/test_failure_history_service.rb
index 7323ad417ea..2214a6a2729 100644
--- a/app/services/ci/test_failure_history_service.rb
+++ b/app/services/ci/test_failure_history_service.rb
@@ -81,7 +81,7 @@ module Ci
def generate_test_suite!(build)
# Returns an instance of Gitlab::Ci::Reports::TestSuite
- build.collect_test_reports!(Gitlab::Ci::Reports::TestReports.new)
+ build.collect_test_reports!(Gitlab::Ci::Reports::TestReport.new)
end
def ci_unit_test_attrs(batch)
diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb
index a525ea179e0..58927a90b6e 100644
--- a/app/services/ci/update_build_queue_service.rb
+++ b/app/services/ci/update_build_queue_service.rb
@@ -14,8 +14,6 @@ module Ci
# Add a build to the pending builds queue
#
def push(build, transition)
- return unless maintain_pending_builds_queue?
-
raise InvalidQueueTransition unless transition.to == 'pending'
transition.within_transaction do
@@ -33,8 +31,6 @@ module Ci
# Remove a build from the pending builds queue
#
def pop(build, transition)
- return unless maintain_pending_builds_queue?
-
raise InvalidQueueTransition unless transition.from == 'pending'
transition.within_transaction { remove!(build) }
@@ -57,7 +53,6 @@ module Ci
# Add shared runner build tracking entry (used for queuing).
#
def track(build, transition)
- return unless maintain_pending_builds_queue?
return unless build.shared_runner_build?
raise InvalidQueueTransition unless transition.to == 'running'
@@ -78,7 +73,6 @@ module Ci
# queuing).
#
def untrack(build, transition)
- return unless maintain_pending_builds_queue?
return unless build.shared_runner_build?
raise InvalidQueueTransition unless transition.from == 'running'
@@ -115,9 +109,5 @@ module Ci
runner.pick_build!(build)
end
end
-
- def maintain_pending_builds_queue?
- ::Ci::PendingBuild.maintain_denormalized_data?
- end
end
end
diff --git a/app/services/ci/update_pending_build_service.rb b/app/services/ci/update_pending_build_service.rb
index 733b684bcc6..2118dbcc19e 100644
--- a/app/services/ci/update_pending_build_service.rb
+++ b/app/services/ci/update_pending_build_service.rb
@@ -15,8 +15,6 @@ module Ci
end
def execute
- return unless ::Ci::PendingBuild.maintain_denormalized_data?
-
@model.pending_builds.each_batch do |relation|
relation.update_all(@update_params)
end
diff --git a/app/services/clusters/integrations/create_service.rb b/app/services/clusters/integrations/create_service.rb
index 142f731a7d3..555df52d177 100644
--- a/app/services/clusters/integrations/create_service.rb
+++ b/app/services/clusters/integrations/create_service.rb
@@ -31,8 +31,6 @@ module Clusters
case params[:application_type]
when 'prometheus'
cluster.find_or_build_integration_prometheus
- when 'elastic_stack'
- cluster.find_or_build_integration_elastic_stack
else
raise ArgumentError, "invalid application_type: #{params[:application_type]}"
end
diff --git a/app/services/concerns/alert_management/alert_processing.rb b/app/services/concerns/alert_management/alert_processing.rb
index abbfd4d66d4..f10ff4e6f19 100644
--- a/app/services/concerns/alert_management/alert_processing.rb
+++ b/app/services/concerns/alert_management/alert_processing.rb
@@ -38,7 +38,7 @@ module AlertManagement
if alert.resolve(incoming_payload.ends_at)
SystemNoteService.change_alert_status(alert, User.alert_bot)
- close_issue(alert.issue) if auto_close_incident?
+ close_issue(alert.issue_id) if auto_close_incident?
else
logger.warn(
message: 'Unable to update AlertManagement::Alert status to resolved',
@@ -52,22 +52,18 @@ module AlertManagement
alert.register_new_event!
end
- def close_issue(issue)
- return if issue.blank? || issue.closed?
+ def close_issue(issue_id)
+ return unless issue_id
- ::Issues::CloseService
- .new(project: project, current_user: User.alert_bot)
- .execute(issue, system_note: false)
-
- SystemNoteService.auto_resolve_prometheus_alert(issue, project, User.alert_bot) if issue.reset.closed?
+ ::IncidentManagement::CloseIncidentWorker.perform_async(issue_id)
end
def process_new_alert
+ return if resolving_alert?
+
if alert.save
alert.execute_integrations
SystemNoteService.create_new_alert(alert, alert_source)
-
- process_resolved_alert if resolving_alert?
else
logger.warn(
message: "Unable to create AlertManagement::Alert from #{alert_source}",
@@ -78,7 +74,7 @@ module AlertManagement
end
def process_incident_issues
- return if alert.issue || alert.resolved?
+ return if alert.issue_id || alert.resolved?
::IncidentManagement::ProcessAlertWorkerV2.perform_async(alert.id)
end
diff --git a/app/services/concerns/integrations/project_test_data.rb b/app/services/concerns/integrations/project_test_data.rb
index acaa773fd49..ae1e1d1e66c 100644
--- a/app/services/concerns/integrations/project_test_data.rb
+++ b/app/services/concerns/integrations/project_test_data.rb
@@ -63,7 +63,7 @@ module Integrations
return { error: s_('TestHooks|Ensure the project has deployments.') } unless deployment.present?
- Gitlab::DataBuilder::Deployment.build(deployment, Time.current)
+ Gitlab::DataBuilder::Deployment.build(deployment, deployment.status, Time.current)
end
def releases_events_data
diff --git a/app/services/concerns/work_items/widgetable_service.rb b/app/services/concerns/work_items/widgetable_service.rb
new file mode 100644
index 00000000000..5665b07dce1
--- /dev/null
+++ b/app/services/concerns/work_items/widgetable_service.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module WidgetableService
+ def execute_widgets(work_item:, callback:, widget_params: {})
+ work_item.widgets.each do |widget|
+ widget_service(widget).try(callback, params: widget_params[widget.class.api_symbol])
+ end
+ end
+
+ # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ def widget_service(widget)
+ @widget_services ||= {}
+ return @widget_services[widget] if @widget_services.has_key?(widget)
+
+ @widget_services[widget] = widget_service_class(widget)&.new(widget: widget, current_user: current_user)
+ end
+ # rubocop:enable Gitlab/ModuleWithInstanceVariables
+
+ def widget_service_class(widget)
+ "WorkItems::Widgets::#{widget.type.capitalize}Service::#{self.class.name.demodulize}".constantize
+ rescue NameError
+ nil
+ end
+ end
+end
diff --git a/app/services/deployments/create_for_build_service.rb b/app/services/deployments/create_for_build_service.rb
index b3e2d2edb59..76d871161e3 100644
--- a/app/services/deployments/create_for_build_service.rb
+++ b/app/services/deployments/create_for_build_service.rb
@@ -11,8 +11,18 @@ module Deployments
# TODO: Move all buisness logic in `Seed::Deployment` to this class after
# `create_deployment_in_separate_transaction` feature flag has been removed.
# See https://gitlab.com/gitlab-org/gitlab/-/issues/348778
+
+ # If build.persisted_environment is a BatchLoader, we need to remove
+ # the method proxy in order to clone into new item here
+ # https://github.com/exAspArk/batch-loader/issues/31
+ environment = if build.persisted_environment.respond_to?(:__sync)
+ build.persisted_environment.__sync
+ else
+ build.persisted_environment
+ end
+
deployment = ::Gitlab::Ci::Pipeline::Seed::Deployment
- .new(build, build.persisted_environment).to_resource
+ .new(build, environment).to_resource
return unless deployment
diff --git a/app/services/error_tracking/list_issues_service.rb b/app/services/error_tracking/list_issues_service.rb
index ca7208dba96..eae736ae10d 100644
--- a/app/services/error_tracking/list_issues_service.rb
+++ b/app/services/error_tracking/list_issues_service.rb
@@ -75,6 +75,7 @@ module ErrorTracking
# For now we implement the bare minimum for rendering the list in UI.
list_opts = {
filters: { status: opts[:issue_status] },
+ query: opts[:search_term],
sort: opts[:sort],
limit: opts[:limit],
cursor: opts[:cursor]
diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb
index 2ab4bb47462..019246dfc9f 100644
--- a/app/services/event_create_service.rb
+++ b/app/services/event_create_service.rb
@@ -25,14 +25,18 @@ class EventCreateService
def open_mr(merge_request, current_user)
create_record_event(merge_request, current_user, :created).tap do
track_event(event_action: :created, event_target: MergeRequest, author_id: current_user.id)
- track_mr_snowplow_event(merge_request, current_user, :create)
+ track_snowplow_event(merge_request, current_user,
+ Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+ :create, 'merge_requests_users')
end
end
def close_mr(merge_request, current_user)
create_record_event(merge_request, current_user, :closed).tap do
track_event(event_action: :closed, event_target: MergeRequest, author_id: current_user.id)
- track_mr_snowplow_event(merge_request, current_user, :close)
+ track_snowplow_event(merge_request, current_user,
+ Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+ :close, 'merge_requests_users')
end
end
@@ -43,7 +47,9 @@ class EventCreateService
def merge_mr(merge_request, current_user)
create_record_event(merge_request, current_user, :merged).tap do
track_event(event_action: :merged, event_target: MergeRequest, author_id: current_user.id)
- track_mr_snowplow_event(merge_request, current_user, :merge)
+ track_snowplow_event(merge_request, current_user,
+ Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+ :merge, 'merge_requests_users')
end
end
@@ -67,7 +73,9 @@ class EventCreateService
create_record_event(note, current_user, :commented).tap do
if note.is_a?(DiffNote) && note.for_merge_request?
track_event(event_action: :commented, event_target: MergeRequest, author_id: current_user.id)
- track_mr_snowplow_event(note, current_user, :comment)
+ track_snowplow_event(note, current_user,
+ Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+ :comment, 'merge_requests_users')
end
end
end
@@ -100,12 +108,27 @@ class EventCreateService
records = create.zip([:created].cycle) + update.zip([:updated].cycle)
return [] if records.empty?
+ if create.any?
+ track_snowplow_event(create.first, current_user,
+ Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION,
+ :create, 'design_users')
+ end
+
+ if update.any?
+ track_snowplow_event(update.first, current_user,
+ Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION,
+ :update, 'design_users')
+ end
+
create_record_events(records, current_user)
end
def destroy_designs(designs, current_user)
return [] unless designs.present?
+ track_snowplow_event(designs.first, current_user,
+ Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION,
+ :destroy, 'design_users')
create_record_events(designs.zip([:destroyed].cycle), current_user)
end
@@ -230,14 +253,14 @@ class EventCreateService
Gitlab::UsageDataCounters::TrackUniqueEvents.track_event(**params)
end
- def track_mr_snowplow_event(record, current_user, action)
+ def track_snowplow_event(record, current_user, category, action, label)
return unless Feature.enabled?(:route_hll_to_snowplow_phase2)
project = record.project
Gitlab::Tracking.event(
- Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION.to_s,
+ category.to_s,
action.to_s,
- label: 'merge_requests_users',
+ label: label,
project: project,
namespace: project.namespace,
user: current_user
diff --git a/app/services/feature_flags/base_service.rb b/app/services/feature_flags/base_service.rb
index 86dc6188f0a..59db1a5f12f 100644
--- a/app/services/feature_flags/base_service.rb
+++ b/app/services/feature_flags/base_service.rb
@@ -15,6 +15,10 @@ module FeatureFlags
protected
+ def update_last_feature_flag_updated_at!
+ Operations::FeatureFlagsClient.update_last_feature_flag_updated_at!(project)
+ end
+
def audit_event(feature_flag)
message = audit_message(feature_flag)
diff --git a/app/services/feature_flags/create_service.rb b/app/services/feature_flags/create_service.rb
index ebbe71f39c7..6ea40345191 100644
--- a/app/services/feature_flags/create_service.rb
+++ b/app/services/feature_flags/create_service.rb
@@ -10,6 +10,8 @@ module FeatureFlags
feature_flag = project.operations_feature_flags.new(params)
if feature_flag.save
+ update_last_feature_flag_updated_at!
+
success(feature_flag: feature_flag)
else
error(feature_flag.errors.full_messages, 400)
diff --git a/app/services/feature_flags/destroy_service.rb b/app/services/feature_flags/destroy_service.rb
index 817a80940c0..0fdc890b8a3 100644
--- a/app/services/feature_flags/destroy_service.rb
+++ b/app/services/feature_flags/destroy_service.rb
@@ -13,6 +13,8 @@ module FeatureFlags
ApplicationRecord.transaction do
if feature_flag.destroy
+ update_last_feature_flag_updated_at!
+
success(feature_flag: feature_flag)
else
error(feature_flag.errors.full_messages)
diff --git a/app/services/feature_flags/update_service.rb b/app/services/feature_flags/update_service.rb
index bcfd2c15189..a465ca1dd5f 100644
--- a/app/services/feature_flags/update_service.rb
+++ b/app/services/feature_flags/update_service.rb
@@ -29,6 +29,8 @@ module FeatureFlags
audit_event = audit_event(feature_flag)
if feature_flag.save
+ update_last_feature_flag_updated_at!
+
success(feature_flag: feature_flag, audit_event: audit_event)
else
error(feature_flag.errors.full_messages, :bad_request)
diff --git a/app/services/git/branch_hooks_service.rb b/app/services/git/branch_hooks_service.rb
index aa471d3a69f..7de56c037ed 100644
--- a/app/services/git/branch_hooks_service.rb
+++ b/app/services/git/branch_hooks_service.rb
@@ -81,6 +81,8 @@ module Git
branch_update_hooks if updating_branch?
branch_change_hooks if creating_branch? || updating_branch?
branch_remove_hooks if removing_branch?
+
+ track_process_commit_limit_overflow
end
def branch_create_hooks
@@ -123,6 +125,12 @@ module Git
end
end
+ def track_process_commit_limit_overflow
+ return if threshold_commits.count <= PROCESS_COMMIT_LIMIT
+
+ Gitlab::Metrics.add_event(:process_commit_limit_overflow)
+ end
+
# Schedules processing of commit messages
def enqueue_process_commit_messages
referencing_commits = limited_commits.select(&:matches_cross_reference_regex?)
diff --git a/app/services/git/branch_push_service.rb b/app/services/git/branch_push_service.rb
index 91f14251608..464d79d9991 100644
--- a/app/services/git/branch_push_service.rb
+++ b/app/services/git/branch_push_service.rb
@@ -39,13 +39,13 @@ module Git
def enqueue_update_mrs
return if params[:merge_request_branches]&.exclude?(branch_name)
- # TODO: pass params[:push_options] to worker
UpdateMergeRequestsWorker.perform_async(
project.id,
current_user.id,
oldrev,
newrev,
- ref
+ ref,
+ params.slice(:push_options).deep_stringify_keys
)
end
diff --git a/app/services/google_cloud/base_service.rb b/app/services/google_cloud/base_service.rb
new file mode 100644
index 00000000000..016ab15408f
--- /dev/null
+++ b/app/services/google_cloud/base_service.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+module GoogleCloud
+ class BaseService < ::BaseService
+ protected
+
+ def google_oauth2_token
+ @params[:google_oauth2_token]
+ end
+
+ def gcp_project_id
+ @params[:gcp_project_id]
+ end
+
+ def environment_name
+ @params[:environment_name]
+ end
+
+ def google_api_client
+ @google_api_client_instance ||= GoogleApi::CloudPlatform::Client.new(google_oauth2_token, nil)
+ end
+
+ def unique_gcp_project_ids
+ filter_params = { key: 'GCP_PROJECT_ID' }
+ ::Ci::VariablesFinder.new(project, filter_params).execute.map(&:value).uniq
+ end
+
+ def group_vars_by_environment(keys)
+ filtered_vars = project.variables.filter { |variable| keys.include? variable.key }
+ filtered_vars.each_with_object({}) do |variable, grouped|
+ grouped[variable.environment_scope] ||= {}
+ grouped[variable.environment_scope][variable.key] = variable.value
+ end
+ end
+
+ def create_or_replace_project_vars(environment_scope, key, value, is_protected, is_masked = false)
+ change_params = {
+ variable_params: {
+ key: key,
+ value: value,
+ environment_scope: environment_scope,
+ protected: is_protected,
+ masked: is_masked
+ }
+ }
+ existing_variable = find_existing_variable(environment_scope, key)
+
+ if existing_variable
+ change_params[:action] = :update
+ change_params[:variable] = existing_variable
+ else
+ change_params[:action] = :create
+ end
+
+ ::Ci::ChangeVariableService.new(container: project, current_user: current_user, params: change_params).execute
+ end
+
+ private
+
+ def find_existing_variable(environment_scope, key)
+ filter_params = { key: key, filter: { environment_scope: environment_scope } }
+ ::Ci::VariablesFinder.new(project, filter_params).execute.first
+ end
+ end
+end
diff --git a/app/services/google_cloud/create_service_accounts_service.rb b/app/services/google_cloud/create_service_accounts_service.rb
index 51d08cc5b55..9617161b8e9 100644
--- a/app/services/google_cloud/create_service_accounts_service.rb
+++ b/app/services/google_cloud/create_service_accounts_service.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module GoogleCloud
- class CreateServiceAccountsService < :: BaseService
+ class CreateServiceAccountsService < ::GoogleCloud::BaseService
def execute
service_account = google_api_client.create_service_account(gcp_project_id, service_account_name, service_account_desc)
service_account_key = google_api_client.create_service_account_key(gcp_project_id, service_account.unique_id)
@@ -23,22 +23,6 @@ module GoogleCloud
private
- def google_oauth2_token
- @params[:google_oauth2_token]
- end
-
- def gcp_project_id
- @params[:gcp_project_id]
- end
-
- def environment_name
- @params[:environment_name]
- end
-
- def google_api_client
- @google_api_client_instance ||= GoogleApi::CloudPlatform::Client.new(google_oauth2_token, nil)
- end
-
def service_accounts_service
GoogleCloud::ServiceAccountsService.new(project)
end
diff --git a/app/services/google_cloud/enable_cloud_run_service.rb b/app/services/google_cloud/enable_cloud_run_service.rb
index 643f2b2b6d2..4fd92f423c5 100644
--- a/app/services/google_cloud/enable_cloud_run_service.rb
+++ b/app/services/google_cloud/enable_cloud_run_service.rb
@@ -1,15 +1,13 @@
# frozen_string_literal: true
module GoogleCloud
- class EnableCloudRunService < :: BaseService
+ class EnableCloudRunService < ::GoogleCloud::BaseService
def execute
gcp_project_ids = unique_gcp_project_ids
if gcp_project_ids.empty?
error("No GCP projects found. Configure a service account or GCP_PROJECT_ID ci variable.")
else
- google_api_client = GoogleApi::CloudPlatform::Client.new(token_in_session, nil)
-
gcp_project_ids.each do |gcp_project_id|
google_api_client.enable_cloud_run(gcp_project_id)
google_api_client.enable_artifacts_registry(gcp_project_id)
@@ -19,16 +17,5 @@ module GoogleCloud
success({ gcp_project_ids: gcp_project_ids })
end
end
-
- private
-
- def unique_gcp_project_ids
- all_gcp_project_ids = project.variables.filter { |var| var.key == 'GCP_PROJECT_ID' }.map { |var| var.value }
- all_gcp_project_ids.uniq
- end
-
- def token_in_session
- @params[:token_in_session]
- end
end
end
diff --git a/app/services/google_cloud/gcp_region_add_or_replace_service.rb b/app/services/google_cloud/gcp_region_add_or_replace_service.rb
index 467f818bcc7..f79df707a08 100644
--- a/app/services/google_cloud/gcp_region_add_or_replace_service.rb
+++ b/app/services/google_cloud/gcp_region_add_or_replace_service.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
module GoogleCloud
- class GcpRegionAddOrReplaceService < ::BaseService
+ class GcpRegionAddOrReplaceService < ::GoogleCloud::BaseService
def execute(environment, region)
- gcp_region_key = Projects::GoogleCloudController::GCP_REGION_CI_VAR_KEY
+ gcp_region_key = Projects::GoogleCloud::GcpRegionsController::GCP_REGION_CI_VAR_KEY
change_params = { variable_params: { key: gcp_region_key, value: region, environment_scope: environment } }
filter_params = { key: gcp_region_key, filter: { environment_scope: environment } }
diff --git a/app/services/google_cloud/generate_pipeline_service.rb b/app/services/google_cloud/generate_pipeline_service.rb
index 077f815e60c..be0c7a783c9 100644
--- a/app/services/google_cloud/generate_pipeline_service.rb
+++ b/app/services/google_cloud/generate_pipeline_service.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module GoogleCloud
- class GeneratePipelineService < :: BaseService
+ class GeneratePipelineService < ::GoogleCloud::BaseService
ACTION_DEPLOY_TO_CLOUD_RUN = 'DEPLOY_TO_CLOUD_RUN'
ACTION_DEPLOY_TO_CLOUD_STORAGE = 'DEPLOY_TO_CLOUD_STORAGE'
diff --git a/app/services/google_cloud/service_accounts_service.rb b/app/services/google_cloud/service_accounts_service.rb
index b791f07cd65..e90fd112e2e 100644
--- a/app/services/google_cloud/service_accounts_service.rb
+++ b/app/services/google_cloud/service_accounts_service.rb
@@ -8,7 +8,7 @@ module GoogleCloud
##
# This service deals with GCP Service Accounts in GitLab
- class ServiceAccountsService < ::BaseService
+ class ServiceAccountsService < ::GoogleCloud::BaseService
##
# Find GCP Service Accounts in a GitLab project
#
@@ -17,7 +17,7 @@ module GoogleCloud
# aligning GitLab project and ref to GCP projects
def find_for_project
- group_vars_by_ref.map do |environment_scope, value|
+ group_vars_by_environment(GCP_KEYS).map do |environment_scope, value|
{
ref: environment_scope,
gcp_project: value['GCP_PROJECT_ID'],
@@ -28,50 +28,24 @@ module GoogleCloud
end
def add_for_project(ref, gcp_project_id, service_account, service_account_key, is_protected)
- project_var_create_or_replace(
+ create_or_replace_project_vars(
ref,
'GCP_PROJECT_ID',
gcp_project_id,
is_protected
)
- project_var_create_or_replace(
+ create_or_replace_project_vars(
ref,
'GCP_SERVICE_ACCOUNT',
service_account,
is_protected
)
- project_var_create_or_replace(
+ create_or_replace_project_vars(
ref,
'GCP_SERVICE_ACCOUNT_KEY',
service_account_key,
is_protected
)
end
-
- private
-
- def group_vars_by_ref
- filtered_vars = project.variables.filter { |variable| GCP_KEYS.include? variable.key }
- filtered_vars.each_with_object({}) do |variable, grouped|
- grouped[variable.environment_scope] ||= {}
- grouped[variable.environment_scope][variable.key] = variable.value
- end
- end
-
- def project_var_create_or_replace(environment_scope, key, value, is_protected)
- change_params = { variable_params: { key: key, value: value, environment_scope: environment_scope, protected: is_protected } }
- filter_params = { key: key, filter: { environment_scope: environment_scope } }
-
- existing_variable = ::Ci::VariablesFinder.new(project, filter_params).execute.first
-
- if existing_variable
- change_params[:action] = :update
- change_params[:variable] = existing_variable
- else
- change_params[:action] = :create
- end
-
- ::Ci::ChangeVariableService.new(container: project, current_user: current_user, params: change_params).execute
- end
end
end
diff --git a/app/services/google_cloud/setup_cloudsql_instance_service.rb b/app/services/google_cloud/setup_cloudsql_instance_service.rb
new file mode 100644
index 00000000000..73650ee752f
--- /dev/null
+++ b/app/services/google_cloud/setup_cloudsql_instance_service.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+module GoogleCloud
+ class SetupCloudsqlInstanceService < ::GoogleCloud::BaseService
+ INSTANCE_STATE_RUNNABLE = 'RUNNABLE'
+ OPERATION_STATE_DONE = 'DONE'
+ DEFAULT_DATABASE_NAME = 'main_db'
+ DEFAULT_DATABASE_USER = 'main_user'
+
+ def execute
+ return error('Unauthorized user') unless Ability.allowed?(current_user, :admin_project_google_cloud, project)
+
+ get_instance_response = google_api_client.get_cloudsql_instance(gcp_project_id, instance_name)
+
+ if get_instance_response.state != INSTANCE_STATE_RUNNABLE
+ return error("CloudSQL instance not RUNNABLE: #{get_instance_response.to_json}")
+ end
+
+ database_response = google_api_client.create_cloudsql_database(gcp_project_id, instance_name, database_name)
+
+ if database_response.status != OPERATION_STATE_DONE
+ return error("Database creation failed: #{database_response.to_json}")
+ end
+
+ user_response = google_api_client.create_cloudsql_user(gcp_project_id, instance_name, username, password)
+
+ if user_response.status != OPERATION_STATE_DONE
+ return error("User creation failed: #{user_response.to_json}")
+ end
+
+ primary_ip_address = get_instance_response.ip_addresses.first.ip_address
+ connection_name = get_instance_response.connection_name
+
+ save_ci_var('GCP_PROJECT_ID', gcp_project_id)
+ save_ci_var('GCP_CLOUDSQL_INSTANCE_NAME', instance_name)
+ save_ci_var('GCP_CLOUDSQL_CONNECTION_NAME', connection_name)
+ save_ci_var('GCP_CLOUDSQL_PRIMARY_IP_ADDRESS', primary_ip_address)
+ save_ci_var('GCP_CLOUDSQL_VERSION', database_version)
+ save_ci_var('GCP_CLOUDSQL_DATABASE_NAME', database_name)
+ save_ci_var('GCP_CLOUDSQL_DATABASE_USER', username)
+ save_ci_var('GCP_CLOUDSQL_DATABASE_PASS', password, true)
+
+ success
+ rescue Google::Apis::Error => err
+ error(message: err.to_json)
+ end
+
+ private
+
+ def instance_name
+ @params[:instance_name]
+ end
+
+ def database_version
+ @params[:database_version]
+ end
+
+ def database_name
+ @params.fetch(:database_name, DEFAULT_DATABASE_NAME)
+ end
+
+ def username
+ @params.fetch(:username, DEFAULT_DATABASE_USER)
+ end
+
+ def password
+ SecureRandom.hex(16)
+ end
+
+ def save_ci_var(key, value, is_masked = false)
+ create_or_replace_project_vars(environment_name, key, value, @params[:is_protected], is_masked)
+ end
+ end
+end
diff --git a/app/services/gravatar_service.rb b/app/services/gravatar_service.rb
index a689b088854..9d5990f2c8a 100644
--- a/app/services/gravatar_service.rb
+++ b/app/services/gravatar_service.rb
@@ -2,6 +2,7 @@
class GravatarService
def execute(email, size = nil, scale = 2, username: nil)
+ return if Gitlab::FIPS.enabled?
return unless Gitlab::CurrentSettings.gravatar_enabled?
identifier = email.presence || username.presence
diff --git a/app/services/groups/base_service.rb b/app/services/groups/base_service.rb
index 06136aff50e..9705f3a560d 100644
--- a/app/services/groups/base_service.rb
+++ b/app/services/groups/base_service.rb
@@ -13,11 +13,11 @@ module Groups
private
def handle_namespace_settings
- settings_params = params.slice(*::NamespaceSetting::NAMESPACE_SETTINGS_PARAMS)
+ settings_params = params.slice(*::NamespaceSetting.allowed_namespace_settings_params)
return if settings_params.empty?
- ::NamespaceSetting::NAMESPACE_SETTINGS_PARAMS.each do |nsp|
+ ::NamespaceSetting.allowed_namespace_settings_params.each do |nsp|
params.delete(nsp)
end
diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb
index 639f7c68c40..35716f7742a 100644
--- a/app/services/groups/create_service.rb
+++ b/app/services/groups/create_service.rb
@@ -13,7 +13,7 @@ module Groups
remove_unallowed_params
set_visibility_level
- @group = Group.new(params.except(*::NamespaceSetting::NAMESPACE_SETTINGS_PARAMS))
+ @group = Group.new(params.except(*::NamespaceSetting.allowed_namespace_settings_params))
@group.build_namespace_settings
handle_namespace_settings
diff --git a/app/services/groups/group_links/destroy_service.rb b/app/services/groups/group_links/destroy_service.rb
index 0e7fd7e0817..4d74b5f32e2 100644
--- a/app/services/groups/group_links/destroy_service.rb
+++ b/app/services/groups/group_links/destroy_service.rb
@@ -16,6 +16,8 @@ module Groups
groups_to_refresh = links.map(&:shared_with_group)
groups_to_refresh.uniq.each do |group|
+ next if Feature.enabled?(:skip_group_share_unlink_auth_refresh, group.root_ancestor)
+
group.refresh_members_authorized_projects(blocking: false, direct_members_only: true)
end
else
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index a0021ae2ccb..29e3a9473ab 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -162,6 +162,12 @@ module Groups
projects_to_update
.update_all(visibility_level: @new_parent_group.visibility_level)
+
+ update_project_settings(@updated_project_ids)
+ end
+
+ # Overridden in EE
+ def update_project_settings(updated_project_ids)
end
def update_two_factor_authentication
diff --git a/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb b/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb
index b7f8b268f18..d11492e062a 100644
--- a/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb
+++ b/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb
@@ -6,7 +6,6 @@ module IncidentManagement
def initialize(issuable, current_user, **params)
@issuable = issuable
@escalation_status = issuable.escalation_status
- @alert = issuable.alert_management_alert
super(project: issuable.project, current_user: current_user, params: params)
end
@@ -19,29 +18,24 @@ module IncidentManagement
private
- attr_reader :issuable, :escalation_status, :alert
+ attr_reader :issuable, :escalation_status
def after_update
- sync_status_to_alert
add_status_system_note
+ add_timeline_event
end
- def sync_status_to_alert
- return unless alert
- return if alert.status == escalation_status.status
+ def add_status_system_note
+ return unless escalation_status.status_previously_changed?
- ::AlertManagement::Alerts::UpdateService.new(
- alert,
- current_user,
- status: escalation_status.status_name,
- status_change_reason: " by changing the incident status of #{issuable.to_reference(project)}"
- ).execute
+ SystemNoteService.change_incident_status(issuable, current_user, params[:status_change_reason])
end
- def add_status_system_note
+ def add_timeline_event
return unless escalation_status.status_previously_changed?
- SystemNoteService.change_incident_status(issuable, current_user, params[:status_change_reason])
+ IncidentManagement::TimelineEvents::CreateService
+ .change_incident_status(issuable, current_user, escalation_status)
end
end
end
diff --git a/app/services/incident_management/issuable_escalation_statuses/build_service.rb b/app/services/incident_management/issuable_escalation_statuses/build_service.rb
index 9ebcf72a0c9..b3c57da03cb 100644
--- a/app/services/incident_management/issuable_escalation_statuses/build_service.rb
+++ b/app/services/incident_management/issuable_escalation_statuses/build_service.rb
@@ -5,30 +5,17 @@ module IncidentManagement
class BuildService < ::BaseProjectService
def initialize(issue)
@issue = issue
- @alert = issue.alert_management_alert
super(project: issue.project)
end
def execute
- return issue.escalation_status if issue.escalation_status
-
- issue.build_incident_management_issuable_escalation_status(alert_params)
+ issue.escalation_status || issue.build_incident_management_issuable_escalation_status
end
private
- attr_reader :issue, :alert
-
- def alert_params
- return {} unless alert
-
- {
- status_event: alert.status_event_for(alert.status_name)
- }
- end
+ attr_reader :issue
end
end
end
-
-IncidentManagement::IssuableEscalationStatuses::BuildService.prepend_mod
diff --git a/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb b/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
index 1d0504a6e80..58777848151 100644
--- a/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
+++ b/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
@@ -5,7 +5,7 @@ module IncidentManagement
class PrepareUpdateService < ::BaseProjectService
include Gitlab::Utils::StrongMemoize
- SUPPORTED_PARAMS = %i[status status_change_reason].freeze
+ SUPPORTED_PARAMS = %i[status].freeze
def initialize(issuable, current_user, params)
@issuable = issuable
diff --git a/app/services/incident_management/timeline_events/create_service.rb b/app/services/incident_management/timeline_events/create_service.rb
index 5e5feed65c2..3cb67ccf2b1 100644
--- a/app/services/incident_management/timeline_events/create_service.rb
+++ b/app/services/incident_management/timeline_events/create_service.rb
@@ -4,6 +4,7 @@ module IncidentManagement
module TimelineEvents
DEFAULT_ACTION = 'comment'
DEFAULT_EDITABLE = false
+ DEFAULT_AUTO_CREATED = false
class CreateService < TimelineEvents::BaseService
def initialize(incident, user, params)
@@ -11,6 +12,42 @@ module IncidentManagement
@incident = incident
@user = user
@params = params
+ @auto_created = !!params.fetch(:auto_created, DEFAULT_AUTO_CREATED)
+ end
+
+ class << self
+ def create_incident(incident, user)
+ note = "@#{user.username} created the incident"
+ occurred_at = incident.created_at
+ action = 'issues'
+
+ new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
+ end
+
+ def reopen_incident(incident, user)
+ note = "@#{user.username} reopened the incident"
+ occurred_at = incident.updated_at
+ action = 'issues'
+
+ new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
+ end
+
+ def resolve_incident(incident, user)
+ note = "@#{user.username} resolved the incident"
+ occurred_at = incident.updated_at
+ action = 'status'
+
+ new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
+ end
+
+ def change_incident_status(incident, user, escalation_status)
+ status = escalation_status.status_name.to_s.titleize
+ note = "@#{user.username} changed the incident status to **#{status}**"
+ occurred_at = incident.updated_at
+ action = 'status'
+
+ new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
+ end
end
def execute
@@ -32,8 +69,8 @@ module IncidentManagement
if timeline_event.save
add_system_note(timeline_event)
-
track_usage_event(:incident_management_timeline_event_created, user.id)
+
success(timeline_event)
else
error_in_save(timeline_event)
@@ -42,9 +79,16 @@ module IncidentManagement
private
- attr_reader :project, :user, :incident, :params
+ attr_reader :project, :user, :incident, :params, :auto_created
+
+ def allowed?
+ return true if auto_created
+
+ super
+ end
def add_system_note(timeline_event)
+ return if auto_created
return unless Feature.enabled?(:incident_timeline, project)
SystemNoteService.add_timeline_event(timeline_event)
diff --git a/app/services/incident_management/timeline_events/update_service.rb b/app/services/incident_management/timeline_events/update_service.rb
index 83497b123dd..8217c8125c2 100644
--- a/app/services/incident_management/timeline_events/update_service.rb
+++ b/app/services/incident_management/timeline_events/update_service.rb
@@ -17,7 +17,6 @@ module IncidentManagement
end
def execute
- return error_non_editable unless timeline_event.editable?
return error_no_permissions unless allowed?
if timeline_event.update(update_params)
@@ -59,8 +58,8 @@ module IncidentManagement
:none
end
- def error_non_editable
- error(_('You cannot edit this timeline event.'))
+ def allowed?
+ user&.can?(:edit_incident_management_timeline_event, timeline_event)
end
end
end
diff --git a/app/services/issuable/clone/attributes_rewriter.rb b/app/services/issuable/clone/attributes_rewriter.rb
deleted file mode 100644
index 279d3051848..00000000000
--- a/app/services/issuable/clone/attributes_rewriter.rb
+++ /dev/null
@@ -1,126 +0,0 @@
-# frozen_string_literal: true
-
-module Issuable
- module Clone
- class AttributesRewriter < ::Issuable::Clone::BaseService
- def initialize(current_user, original_entity, new_entity)
- @current_user = current_user
- @original_entity = original_entity
- @new_entity = new_entity
- end
-
- def execute
- update_attributes = { labels: cloneable_labels }
-
- milestone = matching_milestone(original_entity.milestone&.title)
- update_attributes[:milestone] = milestone if milestone.present?
-
- new_entity.update(update_attributes)
-
- copy_resource_label_events
- copy_resource_milestone_events
- copy_resource_state_events
- end
-
- private
-
- def matching_milestone(title)
- return if title.blank? || !new_entity.supports_milestone?
-
- params = { title: title, project_ids: new_entity.project&.id, group_ids: group&.id }
-
- milestones = MilestonesFinder.new(params).execute
- milestones.first
- end
-
- def cloneable_labels
- params = {
- project_id: new_entity.project&.id,
- group_id: group&.id,
- title: original_entity.labels.select(:title),
- include_ancestor_groups: true
- }
-
- params[:only_group_labels] = true if new_parent.is_a?(Group)
-
- LabelsFinder.new(current_user, params).execute
- end
-
- def copy_resource_label_events
- copy_events(ResourceLabelEvent.table_name, original_entity.resource_label_events) do |event|
- event.attributes
- .except('id', 'reference', 'reference_html')
- .merge(entity_key => new_entity.id, 'action' => ResourceLabelEvent.actions[event.action])
- end
- end
-
- def copy_resource_milestone_events
- return unless milestone_events_supported?
-
- copy_events(ResourceMilestoneEvent.table_name, original_entity.resource_milestone_events) do |event|
- if event.remove?
- event_attributes_with_milestone(event, nil)
- else
- matching_destination_milestone = matching_milestone(event.milestone_title)
-
- event_attributes_with_milestone(event, matching_destination_milestone) if matching_destination_milestone.present?
- end
- end
- end
-
- def copy_resource_state_events
- return unless state_events_supported?
-
- copy_events(ResourceStateEvent.table_name, original_entity.resource_state_events) do |event|
- event.attributes
- .except(*blocked_state_event_attributes)
- .merge(entity_key => new_entity.id,
- 'state' => ResourceStateEvent.states[event.state])
- end
- end
-
- # Overriden on EE::Issuable::Clone::AttributesRewriter
- def blocked_state_event_attributes
- ['id']
- end
-
- def event_attributes_with_milestone(event, milestone)
- event.attributes
- .except('id')
- .merge(entity_key => new_entity.id,
- 'milestone_id' => milestone&.id,
- 'action' => ResourceMilestoneEvent.actions[event.action],
- 'state' => ResourceMilestoneEvent.states[event.state])
- end
-
- def copy_events(table_name, events_to_copy)
- events_to_copy.find_in_batches do |batch|
- events = batch.map do |event|
- yield(event)
- end.compact
-
- ApplicationRecord.legacy_bulk_insert(table_name, events) # rubocop:disable Gitlab/BulkInsert
- end
- end
-
- def entity_key
- new_entity.class.name.underscore.foreign_key
- end
-
- def milestone_events_supported?
- both_respond_to?(:resource_milestone_events)
- end
-
- def state_events_supported?
- both_respond_to?(:resource_state_events)
- end
-
- def both_respond_to?(method)
- original_entity.respond_to?(method) &&
- new_entity.respond_to?(method)
- end
- end
- end
-end
-
-Issuable::Clone::AttributesRewriter.prepend_mod_with('Issuable::Clone::AttributesRewriter')
diff --git a/app/services/issuable/clone/base_service.rb b/app/services/issuable/clone/base_service.rb
index ce9918a4b56..98c50347719 100644
--- a/app/services/issuable/clone/base_service.rb
+++ b/app/services/issuable/clone/base_service.rb
@@ -3,13 +3,13 @@
module Issuable
module Clone
class BaseService < IssuableBaseService
- attr_reader :original_entity, :new_entity, :target_project
+ attr_reader :original_entity, :new_entity
alias_method :old_project, :project
- def execute(original_entity, target_project = nil)
+ def execute(original_entity, target_parent)
@original_entity = original_entity
- @target_project = target_project
+ @target_parent = target_parent
# Using transaction because of a high resources footprint
# on rewriting notes (unfolding references)
@@ -25,19 +25,21 @@ module Issuable
private
- def copy_award_emoji
- AwardEmojis::CopyService.new(original_entity, new_entity).execute
- end
+ attr_reader :target_parent
- def copy_notes
- Notes::CopyService.new(current_user, original_entity, new_entity).execute
+ def rewritten_old_entity_attributes(include_milestone: true)
+ Gitlab::Issuable::Clone::AttributesRewriter.new(
+ current_user,
+ original_entity,
+ target_parent
+ ).execute(include_milestone: include_milestone)
end
def update_new_entity
update_new_entity_description
- update_new_entity_attributes
copy_award_emoji
copy_notes
+ copy_resource_events
end
def update_new_entity_description
@@ -52,8 +54,16 @@ module Issuable
new_entity.update!(update_description_params)
end
- def update_new_entity_attributes
- AttributesRewriter.new(current_user, original_entity, new_entity).execute
+ def copy_award_emoji
+ AwardEmojis::CopyService.new(original_entity, new_entity).execute
+ end
+
+ def copy_notes
+ Notes::CopyService.new(current_user, original_entity, new_entity).execute
+ end
+
+ def copy_resource_events
+ Gitlab::Issuable::Clone::CopyResourceEventsService.new(current_user, original_entity, new_entity).execute
end
def update_old_entity
@@ -74,14 +84,8 @@ module Issuable
new_entity.resource_parent
end
- def group
- if new_entity.project&.group && current_user.can?(:read_group, new_entity.project.group)
- new_entity.project.group
- end
- end
-
def relative_position
- return if original_entity.project.root_ancestor.id != target_project.root_ancestor.id
+ return if original_entity.project.root_ancestor.id != target_parent.root_ancestor.id
original_entity.relative_position
end
diff --git a/app/services/issuable/import_csv/base_service.rb b/app/services/issuable/import_csv/base_service.rb
index 4a2078a4e60..9b41c88159f 100644
--- a/app/services/issuable/import_csv/base_service.rb
+++ b/app/services/issuable/import_csv/base_service.rb
@@ -23,7 +23,8 @@ module Issuable
with_csv_lines.each do |row, line_no|
issuable_attributes = {
title: row[:title],
- description: row[:description]
+ description: row[:description],
+ due_date: row[:due_date]
}
if create_issuable(issuable_attributes).persisted?
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index 03115416607..acd6d45af7a 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -162,8 +162,6 @@ class IssuableBaseService < ::BaseProjectService
return unless result.success? && result[:escalation_status].present?
- @escalation_status_change_reason = result[:escalation_status].delete(:status_change_reason)
-
params[:incident_management_issuable_escalation_status_attributes] = result[:escalation_status]
end
@@ -231,7 +229,7 @@ class IssuableBaseService < ::BaseProjectService
before_create(issuable)
issuable_saved = issuable.with_transaction_returning_status do
- issuable.save
+ transaction_create(issuable)
end
if issuable_saved
@@ -282,8 +280,9 @@ class IssuableBaseService < ::BaseProjectService
assign_requested_labels(issuable)
assign_requested_assignees(issuable)
assign_requested_crm_contacts(issuable)
+ widget_params = filter_widget_params
- if issuable.changed? || params.present?
+ if issuable.changed? || params.present? || widget_params.present?
issuable.assign_attributes(allowed_update_params(params))
if has_title_or_description_changed?(issuable)
@@ -303,7 +302,7 @@ class IssuableBaseService < ::BaseProjectService
ensure_milestone_available(issuable)
issuable_saved = issuable.with_transaction_returning_status do
- issuable.save(touch: should_touch)
+ transaction_update(issuable, { save_with_touch: should_touch })
end
if issuable_saved
@@ -332,6 +331,16 @@ class IssuableBaseService < ::BaseProjectService
issuable
end
+ def transaction_update(issuable, opts = {})
+ touch = opts[:save_with_touch] || false
+
+ issuable.save(touch: touch)
+ end
+
+ def transaction_create(issuable)
+ issuable.save
+ end
+
def update_task(issuable)
filter_params(issuable)
@@ -590,6 +599,10 @@ class IssuableBaseService < ::BaseProjectService
issuable_sla.update(issuable_closed: issuable.closed?)
end
+
+ def filter_widget_params
+ params.delete(:widget_params)
+ end
end
IssuableBaseService.prepend_mod_with('IssuableBaseService')
diff --git a/app/services/issuable_links/create_service.rb b/app/services/issuable_links/create_service.rb
index 0887f04760c..aca98596a02 100644
--- a/app/services/issuable_links/create_service.rb
+++ b/app/services/issuable_links/create_service.rb
@@ -8,6 +8,7 @@ module IssuableLinks
@issuable = issuable
@current_user = user
@params = params.dup
+ @errors = []
end
def execute
@@ -22,7 +23,6 @@ module IssuableLinks
return error(issuables_not_found_message, 404)
end
- @errors = []
references = create_links
if @errors.present?
diff --git a/app/services/issues/build_service.rb b/app/services/issues/build_service.rb
index 1ebf9bb6ba2..75bd2b88e86 100644
--- a/app/services/issues/build_service.rb
+++ b/app/services/issues/build_service.rb
@@ -81,8 +81,9 @@ module Issues
::Issue
end
- def allowed_issue_params
- allowed_params = [
+ def public_params
+ # Additional params may be assigned later (in a CreateService for example)
+ public_issue_params = [
:title,
:description,
:confidential
@@ -90,17 +91,17 @@ module Issues
params[:work_item_type] = WorkItems::Type.find_by(id: params[:work_item_type_id]) if params[:work_item_type_id].present? # rubocop: disable CodeReuse/ActiveRecord
- allowed_params << :milestone_id if can?(current_user, :admin_issue, project)
- allowed_params << :issue_type if create_issue_type_allowed?(project, params[:issue_type])
- allowed_params << :work_item_type if create_issue_type_allowed?(project, params[:work_item_type]&.base_type)
+ public_issue_params << :milestone_id if can?(current_user, :admin_issue, project)
+ public_issue_params << :issue_type if create_issue_type_allowed?(project, params[:issue_type])
+ public_issue_params << :work_item_type if create_issue_type_allowed?(project, params[:work_item_type]&.base_type)
- params.slice(*allowed_params)
+ params.slice(*public_issue_params)
end
def build_issue_params
{ author: current_user }
.merge(issue_params_with_info_from_discussions)
- .merge(allowed_issue_params)
+ .merge(public_params)
.with_indifferent_access
end
diff --git a/app/services/issues/clone_service.rb b/app/services/issues/clone_service.rb
index c675f957cd7..896b15a14b8 100644
--- a/app/services/issues/clone_service.rb
+++ b/app/services/issues/clone_service.rb
@@ -41,9 +41,12 @@ module Issues
def update_new_entity
# we don't call `super` because we want to be able to decide whether or not to copy all comments over.
update_new_entity_description
- update_new_entity_attributes
copy_award_emoji
- copy_notes if with_notes
+
+ if with_notes
+ copy_notes
+ copy_resource_events
+ end
end
def update_old_entity
@@ -62,14 +65,18 @@ module Issues
}
new_params = original_entity.serializable_hash.symbolize_keys.merge(new_params)
+ new_params = new_params.merge(rewritten_old_entity_attributes)
+ new_params.delete(:created_at)
+ new_params.delete(:updated_at)
# 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, spam_params: spam_params).execute(skip_system_notes: true)
+ # Skip creation of system notes for existing attributes of the issue when cloning with notes.
+ # The system notes of the old issue are copied over so we don't want to end up with duplicate notes.
+ # When cloning without notes, we want to generate system notes for the attributes that were copied.
+ CreateService.new(project: target_project, current_user: current_user, params: new_params, spam_params: spam_params).execute(skip_system_notes: with_notes)
end
def queue_copy_designs
diff --git a/app/services/issues/close_service.rb b/app/services/issues/close_service.rb
index ff45091c7e6..d08e4d12a92 100644
--- a/app/services/issues/close_service.rb
+++ b/app/services/issues/close_service.rb
@@ -97,7 +97,10 @@ module Issues
status = issue.incident_management_issuable_escalation_status || issue.build_incident_management_issuable_escalation_status
- SystemNoteService.change_incident_status(issue, current_user, ' by closing the incident') if status.resolve
+ return unless status.resolve
+
+ SystemNoteService.change_incident_status(issue, current_user, ' by closing the incident')
+ IncidentManagement::TimelineEvents::CreateService.resolve_incident(issue, current_user)
end
def store_first_mentioned_in_commit_at(issue, merge_request, max_commit_lookup: 100)
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index edf6d75b632..30d4cb68840 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -13,6 +13,7 @@ module Issues
# 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:, build_service: nil)
+ @extra_params = params.delete(:extra_params) || {}
super(project: project, current_user: current_user, params: params)
@spam_params = spam_params
@build_service = build_service || BuildService.new(project: project, current_user: current_user, params: params)
@@ -46,7 +47,7 @@ module Issues
issue.run_after_commit do
NewIssueWorker.perform_async(issue.id, user.id)
Issues::PlacementWorker.perform_async(nil, issue.project_id)
- Namespaces::OnboardingIssueCreatedWorker.perform_async(issue.namespace.id)
+ Namespaces::OnboardingIssueCreatedWorker.perform_async(issue.project.namespace_id)
end
end
@@ -56,7 +57,8 @@ module Issues
handle_add_related_issue(issue)
resolve_discussions_with_issue(issue)
create_escalation_status(issue)
- try_to_associate_contact(issue)
+ create_timeline_event(issue)
+ try_to_associate_contacts(issue)
super
end
@@ -85,12 +87,18 @@ module Issues
private
- attr_reader :spam_params
+ attr_reader :spam_params, :extra_params
def create_escalation_status(issue)
::IncidentManagement::IssuableEscalationStatuses::CreateService.new(issue).execute if issue.supports_escalation?
end
+ def create_timeline_event(issue)
+ return unless issue.incident?
+
+ IncidentManagement::TimelineEvents::CreateService.create_incident(issue, current_user)
+ end
+
def user_agent_detail_service
UserAgentDetailService.new(spammable: @issue, spam_params: spam_params)
end
@@ -101,11 +109,14 @@ module Issues
IssueLinks::CreateService.new(issue, issue.author, { target_issuable: @add_related_issue }).execute
end
- def try_to_associate_contact(issue)
+ def try_to_associate_contacts(issue)
return unless issue.external_author
return unless current_user.can?(:set_issue_crm_contacts, issue)
- set_crm_contacts(issue, [issue.external_author])
+ contacts = [issue.external_author]
+ contacts.concat extra_params[:cc] unless extra_params[:cc].nil?
+
+ set_crm_contacts(issue, contacts)
end
end
end
diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb
index d210ba2a76c..edab62b1fdf 100644
--- a/app/services/issues/move_service.rb
+++ b/app/services/issues/move_service.rb
@@ -76,6 +76,7 @@ module Issues
}
new_params = original_entity.serializable_hash.symbolize_keys.merge(new_params)
+ new_params = new_params.merge(rewritten_old_entity_attributes)
# 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
diff --git a/app/services/issues/related_branches_service.rb b/app/services/issues/related_branches_service.rb
index 8b08c1f8ddb..2ecd3e561c9 100644
--- a/app/services/issues/related_branches_service.rb
+++ b/app/services/issues/related_branches_service.rb
@@ -5,26 +5,23 @@
module Issues
class RelatedBranchesService < Issues::BaseService
def execute(issue)
- branch_names = branches_with_iid_of(issue) - branches_with_merge_request_for(issue)
- branch_names.map { |branch_name| branch_data(branch_name) }
+ branch_names_with_mrs = branches_with_merge_request_for(issue)
+ branches = branches_with_iid_of(issue).reject { |b| branch_names_with_mrs.include?(b[:name]) }
+
+ branches.map { |branch| branch_data(branch) }
end
private
- def branch_data(branch_name)
+ def branch_data(branch)
{
- name: branch_name,
- pipeline_status: pipeline_status(branch_name)
+ name: branch[:name],
+ pipeline_status: pipeline_status(branch)
}
end
- def pipeline_status(branch_name)
- branch = project.repository.find_branch(branch_name)
- target = branch&.dereferenced_target
-
- return unless target
-
- pipeline = project.latest_pipeline(branch_name, target.sha)
+ def pipeline_status(branch)
+ pipeline = project.latest_pipeline(branch[:name], branch[:target])
pipeline.detailed_status(current_user) if can?(current_user, :read_pipeline, pipeline)
end
@@ -36,8 +33,16 @@ module Issues
end
def branches_with_iid_of(issue)
- project.repository.branch_names.select do |branch|
- branch =~ /\A#{issue.iid}-(?!\d+-stable)/i
+ branch_ref_regex = /\A#{Gitlab::Git::BRANCH_REF_PREFIX}#{issue.iid}-(?!\d+-stable)/i
+
+ return [] unless project.repository.exists?
+
+ project.repository.list_refs(
+ [Gitlab::Git::BRANCH_REF_PREFIX + "#{issue.iid}-*"]
+ ).each_with_object([]) do |ref, results|
+ if ref.name.match?(branch_ref_regex)
+ results << { name: ref.name.delete_prefix(Gitlab::Git::BRANCH_REF_PREFIX), target: ref.target }
+ end
end
end
end
diff --git a/app/services/issues/reopen_service.rb b/app/services/issues/reopen_service.rb
index 4abd1dfbf4e..e003ecacb3f 100644
--- a/app/services/issues/reopen_service.rb
+++ b/app/services/issues/reopen_service.rb
@@ -32,11 +32,18 @@ module Issues
end
def perform_incident_management_actions(issue)
+ return unless issue.incident?
+
+ create_timeline_event(issue)
end
def create_note(issue, state = issue.state)
SystemNoteService.change_status(issue, issue.project, current_user, state, nil)
end
+
+ def create_timeline_event(issue)
+ IncidentManagement::TimelineEvents::CreateService.reopen_incident(issue, current_user)
+ end
end
end
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index d9210169005..afc61eed287 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -199,8 +199,7 @@ module Issues
::IncidentManagement::IssuableEscalationStatuses::AfterUpdateService.new(
issue,
- current_user,
- status_change_reason: @escalation_status_change_reason # Defined in IssuableBaseService before save
+ current_user
).execute
end
diff --git a/app/services/members/create_service.rb b/app/services/members/create_service.rb
index 57d9da4cefd..38bebc1d09d 100644
--- a/app/services/members/create_service.rb
+++ b/app/services/members/create_service.rb
@@ -84,7 +84,7 @@ module Members
end
def add_members
- @members = source.add_users(
+ @members = source.add_members(
invites,
params[:access_level],
expires_at: params[:expires_at],
diff --git a/app/services/members/creator_service.rb b/app/services/members/creator_service.rb
index 276093a00a9..f59a3ed77eb 100644
--- a/app/services/members/creator_service.rb
+++ b/app/services/members/creator_service.rb
@@ -13,9 +13,9 @@ module Members
Gitlab::Access.sym_options_with_owner
end
- def add_users( # rubocop:disable Metrics/ParameterLists
+ def add_members( # rubocop:disable Metrics/ParameterLists
source,
- users,
+ invitees,
access_level,
current_user: nil,
expires_at: nil,
@@ -24,41 +24,49 @@ module Members
ldap: nil,
blocking_refresh: nil
)
- return [] unless users.present?
+ return [] unless invitees.present?
# If this user is attempting to manage Owner members and doesn't have permission, do not allow
return [] if managing_owners?(current_user, access_level) && cannot_manage_owners?(source, current_user)
- emails, users, existing_members = parse_users_list(source, users)
+ emails, users, existing_members = parse_users_list(source, invitees)
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,
- tasks_to_be_done: tasks_to_be_done,
- tasks_project_id: tasks_project_id,
- ldap: ldap,
- blocking_refresh: blocking_refresh)
- .execute
+ common_arguments = {
+ source: source,
+ access_level: access_level,
+ existing_members: existing_members,
+ current_user: current_user,
+ expires_at: expires_at,
+ tasks_to_be_done: tasks_to_be_done,
+ tasks_project_id: tasks_project_id,
+ ldap: ldap,
+ blocking_refresh: blocking_refresh
+ }
+
+ members = emails.map do |email|
+ new(invitee: email, builder: InviteMemberBuilder, **common_arguments).execute
end
+
+ members += users.map do |user|
+ new(invitee: user, **common_arguments).execute
+ end
+
+ members
end
end
- def add_user( # rubocop:disable Metrics/ParameterLists
+ def add_member( # rubocop:disable Metrics/ParameterLists
source,
- user,
+ invitee,
access_level,
current_user: nil,
expires_at: nil,
ldap: nil,
blocking_refresh: nil
)
- add_users(source,
- [user],
+ add_members(source,
+ [invitee],
access_level,
current_user: current_user,
expires_at: expires_at,
@@ -113,11 +121,11 @@ module Members
end
end
- def initialize(source, user, access_level, **args)
- @source = source
- @user = user
- @access_level = self.class.parsed_access_level(access_level)
+ def initialize(invitee:, builder: StandardMemberBuilder, **args)
+ @invitee = invitee
+ @builder = builder
@args = args
+ @access_level = self.class.parsed_access_level(args[:access_level])
end
private_class_method :new
@@ -133,7 +141,7 @@ module Members
private
delegate :new_record?, to: :member
- attr_reader :source, :user, :access_level, :member, :args
+ attr_reader :invitee, :access_level, :member, :args, :builder
def assign_member_attributes
member.attributes = member_attributes
@@ -170,7 +178,7 @@ module Members
# 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.
+ # without having to patch the `add_members` method directly.
def member_attributes
{
created_by: member.created_by || current_user,
@@ -182,14 +190,14 @@ module Members
def commit_changes
if member.request?
approve_request
- else
+ elsif member.changed?
# Calling #save triggers callbacks even if there is no change on object.
# This previously caused an incident due to the hard to predict
# behaviour caused by the large number of callbacks.
# See https://gitlab.com/gitlab-com/gl-infra/production/-/issues/6351
# and https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80920#note_911569038
# for details.
- member.save if member.changed?
+ member.save
end
end
@@ -241,43 +249,19 @@ module Members
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
+ @member = builder.new(source, invitee, existing_members).execute
@member.blocking_refresh = args[:blocking_refresh]
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
- source.users_by_emails([user])[user] || user
- end
- end
-
- def find_or_initialize_member_by_user
- # We have to use `members_and_requesters` here since the given `members` is modified in the models
- # to act more like a scope(removing the requested_at members) and therefore ActiveRecord has issues with that
- # on build and refreshing that relation.
- existing_members[user.id] || source.members_and_requesters.build(user_id: user.id) # rubocop:disable CodeReuse/ActiveRecord
- end
-
def ldap
args[:ldap] || false
end
+ def source
+ args[:source]
+ end
+
def existing_members
args[:existing_members] || {}
end
diff --git a/app/services/members/invite_member_builder.rb b/app/services/members/invite_member_builder.rb
new file mode 100644
index 00000000000..e925121bb1e
--- /dev/null
+++ b/app/services/members/invite_member_builder.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Members
+ class InviteMemberBuilder < StandardMemberBuilder
+ def execute
+ if user_by_email
+ find_or_initialize_member_by_user(user_by_email.id)
+ else
+ source.members_and_requesters.find_or_initialize_by(invite_email: invitee) # rubocop:disable CodeReuse/ActiveRecord
+ end
+ end
+
+ private
+
+ def user_by_email
+ source.users_by_emails([invitee])[invitee]
+ end
+ end
+end
diff --git a/app/services/members/invite_service.rb b/app/services/members/invite_service.rb
index 1bf209ab79d..6d23a9bc2dc 100644
--- a/app/services/members/invite_service.rb
+++ b/app/services/members/invite_service.rb
@@ -31,8 +31,8 @@ module Members
return if params[:email].blank?
- # 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
+ # we need the below due to add_member hitting Members::CreatorService.parse_users_list and ignoring invalid emails
+ # ideally we wouldn't need this, but we can't really change the add_members method
invalid_emails.each { |email| errors[email] = s_('AddMember|Invite email is invalid') }
end
diff --git a/app/services/members/projects/creator_service.rb b/app/services/members/projects/creator_service.rb
index cde1d0462e8..f45132749f9 100644
--- a/app/services/members/projects/creator_service.rb
+++ b/app/services/members/projects/creator_service.rb
@@ -32,7 +32,7 @@ module Members
end
def adding_the_creator_as_owner_in_a_personal_project?
- # this condition is reached during testing setup a lot due to use of `.add_user`
+ # this condition is reached during testing setup a lot due to use of `.add_member`
member.project.personal_namespace_holder?(member.user)
end
diff --git a/app/services/members/standard_member_builder.rb b/app/services/members/standard_member_builder.rb
new file mode 100644
index 00000000000..24e71f80d7e
--- /dev/null
+++ b/app/services/members/standard_member_builder.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Members
+ class StandardMemberBuilder
+ def initialize(source, invitee, existing_members)
+ @source = source
+ @invitee = invitee
+ @existing_members = existing_members
+ end
+
+ def execute
+ find_or_initialize_member_by_user(invitee.id)
+ end
+
+ private
+
+ attr_reader :source, :invitee, :existing_members
+
+ def find_or_initialize_member_by_user(user_id)
+ existing_members[user_id] || source.members_and_requesters.build(user_id: user_id) # rubocop:disable CodeReuse/ActiveRecord
+ end
+ end
+end
diff --git a/app/services/merge_requests/approval_service.rb b/app/services/merge_requests/approval_service.rb
index e3f0758699b..b8d817a15f3 100644
--- a/app/services/merge_requests/approval_service.rb
+++ b/app/services/merge_requests/approval_service.rb
@@ -16,7 +16,7 @@ module MergeRequests
mark_pending_todos_as_done(merge_request)
execute_approval_hooks(merge_request, current_user)
remove_attention_requested(merge_request)
- merge_request_activity_counter.track_approve_mr_action(user: current_user)
+ merge_request_activity_counter.track_approve_mr_action(user: current_user, merge_request: merge_request)
success
end
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index 2b6a66b9dee..9bd38478796 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -128,13 +128,8 @@ module MergeRequests
if draft_event = params.delete(:wip_event)
# We update the title that is provided in the params or we use the mr title
title = params[:title] || merge_request.title
- # Supports both `wip` and `draft` permutations of draft_event
- # This support can be removed >= %15.2
- #
params[:title] = case draft_event
- when 'wip' then MergeRequest.draft_title(title)
when 'draft' then MergeRequest.draft_title(title)
- when 'unwip' then MergeRequest.draftless_title(title)
when 'ready' then MergeRequest.draftless_title(title)
end
end
@@ -190,8 +185,11 @@ module MergeRequests
def create_pipeline_for(merge_request, user, async: false)
if async
- # TODO: pass push_options to worker
- MergeRequests::CreatePipelineWorker.perform_async(project.id, user.id, merge_request.id)
+ MergeRequests::CreatePipelineWorker.perform_async(
+ project.id,
+ user.id,
+ merge_request.id,
+ params.slice(:push_options).deep_stringify_keys)
else
MergeRequests::CreatePipelineService
.new(project: project, current_user: user, params: params.slice(:push_options))
diff --git a/app/services/merge_requests/create_pipeline_service.rb b/app/services/merge_requests/create_pipeline_service.rb
index 37c734613e7..c6a91a3b61e 100644
--- a/app/services/merge_requests/create_pipeline_service.rb
+++ b/app/services/merge_requests/create_pipeline_service.rb
@@ -50,12 +50,8 @@ module MergeRequests
end
def can_create_pipeline_in_target_project?(merge_request)
- if ::Feature.enabled?(:ci_disallow_to_create_merge_request_pipelines_in_target_project, merge_request.target_project)
- merge_request.for_same_project?
- else
- can?(current_user, :create_pipeline, merge_request.target_project) &&
- can_update_source_branch_in_target_project?(merge_request)
- end
+ can?(current_user, :create_pipeline, merge_request.target_project) &&
+ can_update_source_branch_in_target_project?(merge_request)
end
def can_update_source_branch_in_target_project?(merge_request)
diff --git a/app/services/namespaces/in_product_marketing_emails_service.rb b/app/services/namespaces/in_product_marketing_emails_service.rb
index 414f253deb8..c139b2e11dd 100644
--- a/app/services/namespaces/in_product_marketing_emails_service.rb
+++ b/app/services/namespaces/in_product_marketing_emails_service.rb
@@ -37,11 +37,6 @@ module Namespaces
interval_days: [1, 5, 10],
completed_actions: [:git_write, :pipeline_created, :trial_started],
incomplete_actions: [:user_added]
- },
- experience: {
- interval_days: [30],
- completed_actions: [:created, :git_write],
- incomplete_actions: []
}
}.freeze
diff --git a/app/services/notification_recipients/builder/base.rb b/app/services/notification_recipients/builder/base.rb
index 4f1bb0dc877..0a7f25f1af3 100644
--- a/app/services/notification_recipients/builder/base.rb
+++ b/app/services/notification_recipients/builder/base.rb
@@ -47,6 +47,8 @@ module NotificationRecipients
end
users = Array(users).compact
+ preload_users_namespace_bans(users)
+
recipients.concat(users.map { |u| make_recipient(u, type, reason) })
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -240,6 +242,14 @@ module NotificationRecipients
add_recipients(label.subscribers(project), :subscription, NotificationReason::SUBSCRIBED)
end
end
+
+ private
+
+ def preload_users_namespace_bans(_users)
+ # overridden in EE
+ end
end
end
end
+
+NotificationRecipients::Builder::Base.prepend_mod_with('NotificationRecipients::Builder::Base')
diff --git a/app/services/packages/cleanup/execute_policy_service.rb b/app/services/packages/cleanup/execute_policy_service.rb
new file mode 100644
index 00000000000..b432f6d0acb
--- /dev/null
+++ b/app/services/packages/cleanup/execute_policy_service.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+module Packages
+ module Cleanup
+ class ExecutePolicyService
+ include Gitlab::Utils::StrongMemoize
+
+ MAX_EXECUTION_TIME = 250.seconds
+
+ DUPLICATED_FILES_BATCH_SIZE = 10_000
+ MARK_PACKAGE_FILES_FOR_DESTRUCTION_SERVICE_BATCH_SIZE = 200
+
+ def initialize(policy)
+ @policy = policy
+ @counts = {
+ marked_package_files_total_count: 0,
+ unique_package_id_and_file_name_total_count: 0
+ }
+ end
+
+ def execute
+ cleanup_duplicated_files
+ end
+
+ private
+
+ def cleanup_duplicated_files
+ return if @policy.keep_n_duplicated_package_files_disabled?
+
+ result = installable_package_files.each_batch(of: DUPLICATED_FILES_BATCH_SIZE) do |package_files|
+ break :timeout if cleanup_duplicated_files_on(package_files) == :timeout
+ end
+
+ response_success(timeout: result == :timeout)
+ end
+
+ def cleanup_duplicated_files_on(package_files)
+ unique_package_id_and_file_name_from(package_files).each do |package_id, file_name|
+ result = remove_duplicated_files_for(package_id: package_id, file_name: file_name)
+ @counts[:marked_package_files_total_count] += result.payload[:marked_package_files_count]
+ @counts[:unique_package_id_and_file_name_total_count] += 1
+
+ break :timeout unless result.success?
+ end
+ end
+
+ def unique_package_id_and_file_name_from(package_files)
+ # This is a highly custom query for this service, that's why it's not in the model.
+ # rubocop: disable CodeReuse/ActiveRecord
+ package_files.group(:package_id, :file_name)
+ .having("COUNT(*) > #{@policy.keep_n_duplicated_package_files}")
+ .pluck(:package_id, :file_name)
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+
+ def remove_duplicated_files_for(package_id:, file_name:)
+ base = ::Packages::PackageFile.for_package_ids(package_id)
+ .installable
+ .with_file_name(file_name)
+ ids_to_keep = base.recent
+ .limit(@policy.keep_n_duplicated_package_files)
+ .pluck_primary_key
+
+ duplicated_package_files = base.id_not_in(ids_to_keep)
+ ::Packages::MarkPackageFilesForDestructionService.new(duplicated_package_files)
+ .execute(batch_deadline: batch_deadline, batch_size: MARK_PACKAGE_FILES_FOR_DESTRUCTION_SERVICE_BATCH_SIZE)
+ end
+
+ def project
+ @policy.project
+ end
+
+ def installable_package_files
+ ::Packages::PackageFile.installable
+ .for_package_ids(
+ ::Packages::Package.installable
+ .for_projects(project.id)
+ )
+ end
+
+ def batch_deadline
+ strong_memoize(:batch_deadline) do
+ MAX_EXECUTION_TIME.from_now
+ end
+ end
+
+ def response_success(timeout:)
+ ServiceResponse.success(
+ message: "Packages cleanup policy executed for project #{project.id}",
+ payload: {
+ timeout: timeout,
+ counts: @counts
+ }
+ )
+ end
+ end
+ end
+end
diff --git a/app/services/packages/debian/create_package_file_service.rb b/app/services/packages/debian/create_package_file_service.rb
index 2022a63a725..fbbc8159ca0 100644
--- a/app/services/packages/debian/create_package_file_service.rb
+++ b/app/services/packages/debian/create_package_file_service.rb
@@ -3,12 +3,15 @@
module Packages
module Debian
class CreatePackageFileService
+ include ::Packages::FIPS
+
def initialize(package, params)
@package = package
@params = params
end
def execute
+ raise DisabledError, 'Debian registry is not FIPS compliant' if Gitlab::FIPS.enabled?
raise ArgumentError, "Invalid package" unless package.present?
# Debian package file are first uploaded to incoming with empty metadata,
diff --git a/app/services/packages/debian/extract_changes_metadata_service.rb b/app/services/packages/debian/extract_changes_metadata_service.rb
index 43a4db5bdfc..30480834748 100644
--- a/app/services/packages/debian/extract_changes_metadata_service.rb
+++ b/app/services/packages/debian/extract_changes_metadata_service.rb
@@ -4,6 +4,7 @@ module Packages
module Debian
class ExtractChangesMetadataService
include Gitlab::Utils::StrongMemoize
+ include ::Packages::FIPS
ExtractionError = Class.new(StandardError)
@@ -13,6 +14,8 @@ module Packages
end
def execute
+ raise DisabledError, 'Debian registry is not FIPS compliant' if Gitlab::FIPS.enabled?
+
{
file_type: file_type,
architecture: metadata[:architecture],
diff --git a/app/services/packages/debian/generate_distribution_service.rb b/app/services/packages/debian/generate_distribution_service.rb
index 33bf877a153..7db27f9234d 100644
--- a/app/services/packages/debian/generate_distribution_service.rb
+++ b/app/services/packages/debian/generate_distribution_service.rb
@@ -4,6 +4,7 @@ module Packages
module Debian
class GenerateDistributionService
include Gitlab::Utils::StrongMemoize
+ include ::Packages::FIPS
include ExclusiveLeaseGuard
ONE_HOUR = 1.hour.freeze
@@ -70,6 +71,8 @@ module Packages
end
def execute
+ raise DisabledError, 'Debian registry is not FIPS compliant' if Gitlab::FIPS.enabled?
+
try_obtain_lease do
@distribution.transaction do
# We consider `apt-get update` can take at most one hour
diff --git a/app/services/packages/mark_package_files_for_destruction_service.rb b/app/services/packages/mark_package_files_for_destruction_service.rb
index 3672b44b409..e7fdd88843a 100644
--- a/app/services/packages/mark_package_files_for_destruction_service.rb
+++ b/app/services/packages/mark_package_files_for_destruction_service.rb
@@ -9,18 +9,41 @@ module Packages
@package_files = package_files
end
- def execute
- @package_files.each_batch(of: BATCH_SIZE) do |batched_package_files|
- batched_package_files.update_all(status: :pending_destruction)
+ def execute(batch_deadline: nil, batch_size: BATCH_SIZE)
+ timeout = false
+ updates_count = 0
+ min_batch_size = [batch_size, BATCH_SIZE].min
+
+ @package_files.each_batch(of: min_batch_size) do |batched_package_files|
+ if batch_deadline && Time.zone.now > batch_deadline
+ timeout = true
+ break
+ end
+
+ updates_count += batched_package_files.update_all(status: :pending_destruction)
end
- service_response_success('Package files are now pending destruction')
+ payload = { marked_package_files_count: updates_count }
+
+ return response_error(payload) if timeout
+
+ response_success(payload)
end
private
- def service_response_success(message)
- ServiceResponse.success(message: message)
+ def response_success(payload)
+ ServiceResponse.success(
+ message: 'Package files are now pending destruction',
+ payload: payload
+ )
+ end
+
+ def response_error(payload)
+ ServiceResponse.error(
+ message: 'Timeout while marking package files as pending destruction',
+ payload: payload
+ )
end
end
end
diff --git a/app/services/packages/pypi/create_package_service.rb b/app/services/packages/pypi/create_package_service.rb
index 5d7e967ceb0..b464ce4504a 100644
--- a/app/services/packages/pypi/create_package_service.rb
+++ b/app/services/packages/pypi/create_package_service.rb
@@ -16,6 +16,8 @@ module Packages
raise ActiveRecord::RecordInvalid, meta
end
+ params.delete(:md5_digest) if Gitlab::FIPS.enabled?
+
Packages::Pypi::Metadatum.upsert(meta.attributes)
::Packages::CreatePackageFileService.new(created_package, file_params).execute
diff --git a/app/services/pages/delete_service.rb b/app/services/pages/delete_service.rb
index 95e99daeb6c..dcee4c5b665 100644
--- a/app/services/pages/delete_service.rb
+++ b/app/services/pages/delete_service.rb
@@ -21,7 +21,8 @@ module Pages
def publish_deleted_event
event = Pages::PageDeletedEvent.new(data: {
project_id: project.id,
- namespace_id: project.namespace_id
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
})
Gitlab::EventStore.publish(event)
diff --git a/app/services/pod_logs/base_service.rb b/app/services/pod_logs/base_service.rb
deleted file mode 100644
index e4b6ad31e33..00000000000
--- a/app/services/pod_logs/base_service.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-# frozen_string_literal: true
-
-module PodLogs
- class BaseService < ::BaseService
- include ReactiveCaching
- include Stepable
-
- attr_reader :cluster, :namespace, :params
-
- CACHE_KEY_GET_POD_LOG = 'get_pod_log'
- K8S_NAME_MAX_LENGTH = 253
-
- self.reactive_cache_work_type = :external_dependency
-
- def id
- cluster.id
- end
-
- def initialize(cluster, namespace, params: {})
- @cluster = cluster
- @namespace = namespace
- @params = filter_params(params.dup.stringify_keys).to_hash
- end
-
- def execute
- with_reactive_cache(
- CACHE_KEY_GET_POD_LOG,
- namespace,
- params
- ) do |result|
- result
- end
- end
-
- def calculate_reactive_cache(request, _namespace, _params)
- case request
- when CACHE_KEY_GET_POD_LOG
- execute_steps
- else
- exception = StandardError.new('Unknown reactive cache request')
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(exception, request: request)
- error(_('Unknown cache key'))
- end
- end
-
- private
-
- def valid_params
- %w(pod_name container_name)
- end
-
- def success_return_keys
- %i(status logs pod_name container_name pods)
- end
-
- def check_arguments(result)
- return error(_('Cluster does not exist')) if cluster.nil?
- return error(_('Namespace is empty')) if namespace.blank?
-
- result[:pod_name] = params['pod_name'].presence
- result[:container_name] = params['container_name'].presence
-
- return error(_('Invalid pod_name')) if result[:pod_name] && !result[:pod_name].is_a?(String)
- return error(_('Invalid container_name')) if result[:container_name] && !result[:container_name].is_a?(String)
-
- success(result)
- end
-
- def get_raw_pods(result)
- raise NotImplementedError
- end
-
- def get_pod_names(result)
- result[:pods] = result[:raw_pods].map { |p| p[:name] }
-
- success(result)
- end
-
- def pod_logs(result)
- raise NotImplementedError
- end
-
- def filter_return_keys(result)
- result.slice(*success_return_keys)
- end
-
- def filter_params(params)
- params.slice(*valid_params)
- end
- end
-end
diff --git a/app/services/pod_logs/elasticsearch_service.rb b/app/services/pod_logs/elasticsearch_service.rb
deleted file mode 100644
index 28ccace62e5..00000000000
--- a/app/services/pod_logs/elasticsearch_service.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-# frozen_string_literal: true
-
-module PodLogs
- class ElasticsearchService < PodLogs::BaseService
- steps :check_arguments,
- :get_raw_pods,
- :get_pod_names,
- :check_times,
- :check_search,
- :check_cursor,
- :pod_logs,
- :filter_return_keys
-
- self.reactive_cache_worker_finder = ->(id, _cache_key, namespace, params) { new(::Clusters::Cluster.find(id), namespace, params: params) }
-
- private
-
- def valid_params
- super + %w(search start_time end_time cursor)
- end
-
- def success_return_keys
- super + %i(cursor)
- end
-
- def get_raw_pods(result)
- client = cluster&.elasticsearch_client
- return error(_('Unable to connect to Elasticsearch')) unless client
-
- result[:raw_pods] = ::Gitlab::Elasticsearch::Logs::Pods.new(client).pods(namespace)
-
- success(result)
- rescue Elasticsearch::Transport::Transport::ServerError => e
- ::Gitlab::ErrorTracking.track_exception(e)
-
- error(_('Elasticsearch returned status code: %{status_code}') % {
- # ServerError is the parent class of exceptions named after HTTP status codes, eg: "Elasticsearch::Transport::Transport::Errors::NotFound"
- # there is no method on the exception other than the class name to determine the type of error encountered.
- status_code: e.class.name.split('::').last
- })
- end
-
- def check_times(result)
- result[:start_time] = params['start_time'] if params.key?('start_time') && Time.iso8601(params['start_time'])
- result[:end_time] = params['end_time'] if params.key?('end_time') && Time.iso8601(params['end_time'])
-
- success(result)
- rescue ArgumentError
- error(_('Invalid start or end time format'))
- end
-
- def check_search(result)
- result[:search] = params['search'] if params.key?('search')
-
- return error(_('Invalid search parameter')) if result[:search] && !result[:search].is_a?(String)
-
- success(result)
- end
-
- def check_cursor(result)
- result[:cursor] = params['cursor'] if params.key?('cursor')
-
- return error(_('Invalid cursor parameter')) if result[:cursor] && !result[:cursor].is_a?(String)
-
- success(result)
- end
-
- def pod_logs(result)
- client = cluster&.elasticsearch_client
- return error(_('Unable to connect to Elasticsearch')) unless client
-
- response = ::Gitlab::Elasticsearch::Logs::Lines.new(client).pod_logs(
- namespace,
- pod_name: result[:pod_name],
- container_name: result[:container_name],
- search: result[:search],
- start_time: result[:start_time],
- end_time: result[:end_time],
- cursor: result[:cursor],
- chart_above_v2: cluster.elastic_stack_adapter.chart_above_v2?
- )
-
- result.merge!(response)
-
- success(result)
- rescue Elasticsearch::Transport::Transport::ServerError => e
- ::Gitlab::ErrorTracking.track_exception(e)
-
- error(_('Elasticsearch returned status code: %{status_code}') % {
- # ServerError is the parent class of exceptions named after HTTP status codes, eg: "Elasticsearch::Transport::Transport::Errors::NotFound"
- # there is no method on the exception other than the class name to determine the type of error encountered.
- status_code: e.class.name.split('::').last
- })
- rescue ::Gitlab::Elasticsearch::Logs::Lines::InvalidCursor
- error(_('Invalid cursor value provided'))
- end
- end
-end
diff --git a/app/services/pod_logs/kubernetes_service.rb b/app/services/pod_logs/kubernetes_service.rb
deleted file mode 100644
index 28b1a179635..00000000000
--- a/app/services/pod_logs/kubernetes_service.rb
+++ /dev/null
@@ -1,151 +0,0 @@
-# frozen_string_literal: true
-
-module PodLogs
- class KubernetesService < PodLogs::BaseService
- LOGS_LIMIT = 500
- REPLACEMENT_CHAR = "\u{FFFD}"
-
- EncodingHelperError = Class.new(StandardError)
-
- steps :check_arguments,
- :get_raw_pods,
- :get_pod_names,
- :check_pod_name,
- :check_container_name,
- :pod_logs,
- :encode_logs_to_utf8,
- :split_logs,
- :filter_return_keys
-
- self.reactive_cache_worker_finder = ->(id, _cache_key, namespace, params) { new(::Clusters::Cluster.find(id), namespace, params: params) }
-
- private
-
- def get_raw_pods(result)
- result[:raw_pods] = cluster.kubeclient.get_pods(namespace: namespace).map do |pod|
- {
- name: pod.metadata.name,
- container_names: pod.spec.containers.map(&:name)
- }
- end
-
- success(result)
- end
-
- def check_pod_name(result)
- # If pod_name is not received as parameter, get the pod logs of the first
- # pod of this namespace.
- result[:pod_name] ||= result[:pods].first
-
- unless result[:pod_name]
- return error(_('No pods available'))
- end
-
- unless result[:pod_name].length.to_i <= K8S_NAME_MAX_LENGTH
- return error(_('pod_name cannot be larger than %{max_length}'\
- ' chars' % { max_length: K8S_NAME_MAX_LENGTH }))
- end
-
- unless result[:pod_name] =~ Gitlab::Regex.kubernetes_dns_subdomain_regex
- return error(_('pod_name can contain only lowercase letters, digits, \'-\', and \'.\' and must start and end with an alphanumeric character'))
- end
-
- unless result[:pods].include?(result[:pod_name])
- return error(_('Pod does not exist'))
- end
-
- success(result)
- end
-
- def check_container_name(result)
- pod_details = result[:raw_pods].find { |p| p[:name] == result[:pod_name] }
- container_names = pod_details[:container_names]
-
- # select first container if not specified
- result[:container_name] ||= container_names.first
-
- unless result[:container_name]
- return error(_('No containers available'))
- end
-
- unless result[:container_name].length.to_i <= K8S_NAME_MAX_LENGTH
- return error(_('container_name cannot be larger than'\
- ' %{max_length} chars' % { max_length: K8S_NAME_MAX_LENGTH }))
- end
-
- unless result[:container_name] =~ Gitlab::Regex.kubernetes_dns_subdomain_regex
- return error(_('container_name can contain only lowercase letters, digits, \'-\', and \'.\' and must start and end with an alphanumeric character'))
- end
-
- unless container_names.include?(result[:container_name])
- return error(_('Container does not exist'))
- end
-
- success(result)
- end
-
- def pod_logs(result)
- result[:logs] = cluster.kubeclient.get_pod_log(
- result[:pod_name],
- namespace,
- container: result[:container_name],
- tail_lines: LOGS_LIMIT,
- timestamps: true
- ).body
-
- success(result)
- rescue Kubeclient::ResourceNotFoundError
- error(_('Pod not found'))
- rescue Kubeclient::HttpError => e
- ::Gitlab::ErrorTracking.track_exception(e)
-
- error(_('Kubernetes API returned status code: %{error_code}') % {
- error_code: e.error_code
- })
- end
-
- # Check https://gitlab.com/gitlab-org/gitlab/issues/34965#note_292261879
- # for more details on why this is necessary.
- def encode_logs_to_utf8(result)
- return success(result) if result[:logs].nil?
- return success(result) if result[:logs].encoding == Encoding::UTF_8
-
- result[:logs] = encode_utf8(result[:logs])
-
- success(result)
- rescue EncodingHelperError
- error(_('Unable to convert Kubernetes logs encoding to UTF-8'))
- end
-
- def split_logs(result)
- result[:logs] = result[:logs].strip.lines(chomp: true).map do |line|
- # message contains a RFC3339Nano timestamp, then a space, then the log line.
- # resolution of the nanoseconds can vary, so we split on the first space
- values = line.split(' ', 2)
- {
- timestamp: values[0],
- message: values[1],
- pod: result[:pod_name]
- }
- end
-
- success(result)
- end
-
- def encode_utf8(logs)
- utf8_logs = Gitlab::EncodingHelper.encode_utf8(logs.dup, replace: REPLACEMENT_CHAR)
-
- # Gitlab::EncodingHelper.encode_utf8 can return '' or nil if an exception
- # is raised while encoding. We prefer to return an error rather than wrongly
- # display blank logs.
- no_utf8_logs = logs.present? && utf8_logs.blank?
- unexpected_encoding = utf8_logs&.encoding != Encoding::UTF_8
-
- if no_utf8_logs || unexpected_encoding
- raise EncodingHelperError, 'Could not convert Kubernetes logs to UTF-8'
- end
-
- utf8_logs
- end
- end
-end
diff --git a/app/services/preview_markdown_service.rb b/app/services/preview_markdown_service.rb
index af9c338b59e..03844c2dc7e 100644
--- a/app/services/preview_markdown_service.rb
+++ b/app/services/preview_markdown_service.rb
@@ -10,7 +10,7 @@ class PreviewMarkdownService < BaseService
text: text,
users: users,
suggestions: suggestions,
- commands: commands.join(' ')
+ commands: commands.join('<br>')
)
end
diff --git a/app/services/projects/after_rename_service.rb b/app/services/projects/after_rename_service.rb
index 2ed4346e5ca..9dc957b5be2 100644
--- a/app/services/projects/after_rename_service.rb
+++ b/app/services/projects/after_rename_service.rb
@@ -46,6 +46,7 @@ module Projects
update_repository_configuration
rename_transferred_documents
log_completion
+ publish_event
end
def first_ensure_no_registry_tags_are_present
@@ -132,6 +133,18 @@ module Projects
raise RenameFailedError, error
end
+
+ def publish_event
+ event = Projects::ProjectPathChangedEvent.new(data: {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id,
+ old_path: full_path_before,
+ new_path: full_path_after
+ })
+
+ Gitlab::EventStore.publish(event)
+ end
end
end
diff --git a/app/services/projects/blame_service.rb b/app/services/projects/blame_service.rb
index f7c1240a3ba..b324ea27360 100644
--- a/app/services/projects/blame_service.rb
+++ b/app/services/projects/blame_service.rb
@@ -12,6 +12,8 @@ module Projects
@page = extract_page(params)
end
+ attr_reader :page
+
def blame
Gitlab::Blame.new(blob, commit, range: blame_range)
end
@@ -19,15 +21,14 @@ module Projects
def pagination
return unless pagination_enabled?
- Kaminari.paginate_array([], total_count: blob_lines_count)
+ Kaminari.paginate_array([], total_count: blob_lines_count, limit: per_page)
+ .tap { |pagination| pagination.max_paginates_per(per_page) }
.page(page)
- .per(per_page)
- .limit(per_page)
end
private
- attr_reader :blob, :commit, :page
+ attr_reader :blob, :commit
def blame_range
return unless pagination_enabled?
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index c7f284bec9b..9bc8bb428fb 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -129,6 +129,8 @@ module Projects
create_readme if @initialize_with_readme
create_sast_commit if @initialize_with_sast
+
+ publish_event
end
def create_project_settings
@@ -294,6 +296,16 @@ module Projects
params[:topic_list] ||= topic_list if topic_list
end
+
+ def publish_event
+ event = Projects::ProjectCreatedEvent.new(data: {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
+ })
+
+ Gitlab::EventStore.publish(event)
+ end
end
end
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index bc5be5bdff3..06a44b07f9f 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -132,7 +132,7 @@ module Projects
destroy_web_hooks!
destroy_project_bots!
destroy_ci_records!
- destroy_mr_diff_commits!
+ destroy_mr_diff_relations!
# Rails attempts to load all related records into memory before
# destroying: https://github.com/rails/rails/issues/22510
@@ -153,23 +153,28 @@ module Projects
# cascading deletes may exceed statement timeouts, causing failures.
# (see https://gitlab.com/gitlab-org/gitlab/-/issues/346166)
#
+ # Removing merge_request_diff_files records may also cause timeouts, so they
+ # can be deleted in batches as well.
+ #
# rubocop: disable CodeReuse/ActiveRecord
- def destroy_mr_diff_commits!
+ def destroy_mr_diff_relations!
mr_batch_size = 100
delete_batch_size = 1000
project.merge_requests.each_batch(column: :iid, of: mr_batch_size) do |relation_ids|
- loop do
- inner_query = MergeRequestDiffCommit
- .select(:merge_request_diff_id, :relative_order)
- .where(merge_request_diff_id: MergeRequestDiff.where(merge_request_id: relation_ids).select(:id))
- .limit(delete_batch_size)
-
- deleted_rows = MergeRequestDiffCommit
- .where('(merge_request_diff_commits.merge_request_diff_id, merge_request_diff_commits.relative_order) IN (?)', inner_query)
- .delete_all
-
- break if deleted_rows == 0
+ [MergeRequestDiffCommit, MergeRequestDiffFile].each do |model|
+ loop do
+ inner_query = model
+ .select(:merge_request_diff_id, :relative_order)
+ .where(merge_request_diff_id: MergeRequestDiff.where(merge_request_id: relation_ids).select(:id))
+ .limit(delete_batch_size)
+
+ deleted_rows = model
+ .where("(#{model.table_name}.merge_request_diff_id, #{model.table_name}.relative_order) IN (?)", inner_query) # rubocop:disable GitlabSecurity/SqlInjection
+ .delete_all
+
+ break if deleted_rows == 0
+ end
end
end
end
@@ -212,7 +217,7 @@ module Projects
# produces smaller and faster queries to the database.
def destroy_web_hooks!
project.hooks.find_each do |web_hook|
- result = ::WebHooks::DestroyService.new(current_user).sync_destroy(web_hook)
+ result = ::WebHooks::DestroyService.new(current_user).execute(web_hook)
unless result[:status] == :success
raise_error(s_('DeleteProject|Failed to remove webhooks. Please try again or contact administrator.'))
@@ -263,8 +268,12 @@ module Projects
end
def publish_project_deleted_event_for(project)
- data = { project_id: project.id, namespace_id: project.namespace_id }
- event = Projects::ProjectDeletedEvent.new(data: data)
+ event = Projects::ProjectDeletedEvent.new(data: {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
+ })
+
Gitlab::EventStore.publish(event)
end
end
diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb
index 3e8d6563709..70a04cd556a 100644
--- a/app/services/projects/fork_service.rb
+++ b/app/services/projects/fork_service.rb
@@ -5,7 +5,10 @@ module Projects
def execute(fork_to_project = nil)
forked_project = fork_to_project ? link_existing_project(fork_to_project) : fork_new_project
- refresh_forks_count if forked_project&.saved?
+ if forked_project&.saved?
+ refresh_forks_count
+ stream_audit_event(forked_project)
+ end
forked_project
end
@@ -62,7 +65,10 @@ module Projects
# exception.
relations_block: -> (project) { build_fork_network_member(project) },
skip_disk_validation: skip_disk_validation,
- external_authorization_classification_label: @project.external_authorization_classification_label
+ external_authorization_classification_label: @project.external_authorization_classification_label,
+ suggestion_commit_message: @project.suggestion_commit_message,
+ merge_commit_template: @project.merge_commit_template,
+ squash_commit_template: @project.squash_commit_template
}
if @project.avatar.present? && @project.avatar.image?
@@ -133,5 +139,11 @@ module Projects
def target_mr_default_target_self
@target_mr_default_target_self ||= params[:mr_default_target_self]
end
+
+ def stream_audit_event(forked_project)
+ # Defined in EE
+ end
end
end
+
+Projects::ForkService.prepend_mod
diff --git a/app/services/projects/group_links/update_service.rb b/app/services/projects/group_links/update_service.rb
index a836b96cac3..c271b0a2307 100644
--- a/app/services/projects/group_links/update_service.rb
+++ b/app/services/projects/group_links/update_service.rb
@@ -37,3 +37,5 @@ module Projects
end
end
end
+
+Projects::GroupLinks::UpdateService.prepend_mod
diff --git a/app/services/projects/move_deploy_keys_projects_service.rb b/app/services/projects/move_deploy_keys_projects_service.rb
index 98ba5eb3f13..a45b78db383 100644
--- a/app/services/projects/move_deploy_keys_projects_service.rb
+++ b/app/services/projects/move_deploy_keys_projects_service.rb
@@ -5,6 +5,10 @@ module Projects
def execute(source_project, remove_remaining_elements: true)
return unless super
+ # The SHA256 fingerprint should be there, but just in case it isn't
+ # we want to make sure it's generated. Otherwise we might delete keys.
+ ensure_sha256_fingerprints
+
Project.transaction do
move_deploy_keys_projects
remove_remaining_deploy_keys_projects if remove_remaining_elements
@@ -15,6 +19,11 @@ module Projects
private
+ def ensure_sha256_fingerprints
+ @project.deploy_keys.each(&:ensure_sha256_fingerprint!)
+ source_project.deploy_keys.each(&:ensure_sha256_fingerprint!)
+ end
+
def move_deploy_keys_projects
non_existent_deploy_keys_projects.update_all(project_id: @project.id)
end
@@ -23,7 +32,7 @@ module Projects
def non_existent_deploy_keys_projects
source_project.deploy_keys_projects
.joins(:deploy_key)
- .where.not(keys: { fingerprint: @project.deploy_keys.select(:fingerprint) })
+ .where.not(keys: { fingerprint_sha256: @project.deploy_keys.select(:fingerprint_sha256) })
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb
index 7e4e0d7378e..b2166dc84c7 100644
--- a/app/services/projects/operations/update_service.rb
+++ b/app/services/projects/operations/update_service.rb
@@ -18,7 +18,6 @@ module Projects
.merge(grafana_integration_params)
.merge(prometheus_integration_params)
.merge(incident_management_setting_params)
- .merge(tracing_setting_params)
end
def alerting_setting_params
@@ -132,15 +131,6 @@ module Projects
{ incident_management_setting_attributes: attrs }
end
-
- def tracing_setting_params
- attr = params[:tracing_setting_attributes]
- return {} unless attr
-
- destroy = attr[:external_url].blank?
-
- { tracing_setting_attributes: attr.merge(_destroy: destroy) }
- end
end
end
end
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index 8ded2516b97..dd1c2b94e18 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -2,21 +2,17 @@
module Projects
class UpdatePagesService < BaseService
- InvalidStateError = Class.new(StandardError)
- WrongUploadedDeploymentSizeError = Class.new(StandardError)
- BLOCK_SIZE = 32.kilobytes
- PUBLIC_DIR = 'public'
-
# old deployment can be cached by pages daemon
# so we need to give pages daemon some time update cache
# 10 minutes is enough, but 30 feels safer
OLD_DEPLOYMENTS_DESTRUCTION_DELAY = 30.minutes.freeze
- attr_reader :build
+ attr_reader :build, :deployment_update
def initialize(project, build)
@project = project
@build = build
+ @deployment_update = ::Gitlab::Pages::DeploymentUpdate.new(project, build)
end
def execute
@@ -29,20 +25,20 @@ module Projects
job.run!
end
- validate_state!
- validate_max_size!
- validate_public_folder!
- validate_max_entries!
+ return error(deployment_update.errors.first.full_message) unless deployment_update.valid?
build.artifacts_file.use_file do |artifacts_path|
- create_pages_deployment(artifacts_path, build)
- success
+ deployment = create_pages_deployment(artifacts_path, build)
+
+ break error('The uploaded artifact size does not match the expected value') unless deployment
+
+ if deployment_update.valid?
+ update_project_pages_deployment(deployment)
+ success
+ else
+ error(deployment_update.errors.first.full_message)
+ end
end
- rescue InvalidStateError => e
- error(e.message)
- rescue WrongUploadedDeploymentSizeError => e
- error("Uploading artifacts to pages storage failed")
- raise e
rescue StandardError => e
error(e.message)
raise e
@@ -53,13 +49,14 @@ module Projects
def success
@commit_status.success
@project.mark_pages_as_deployed
+ publish_deployed_event
super
end
def error(message)
register_failure
log_error("Projects::UpdatePagesService: #{message}")
- @commit_status.allow_failure = !latest?
+ @commit_status.allow_failure = !deployment_update.latest?
@commit_status.description = message
@commit_status.drop(:script_failure)
super
@@ -75,24 +72,22 @@ module Projects
def create_pages_deployment(artifacts_path, build)
sha256 = build.job_artifacts_archive.file_sha256
-
- deployment = nil
File.open(artifacts_path) do |file|
- deployment = project.pages_deployments.create!(file: file,
- file_count: entries_count,
- file_sha256: sha256,
- ci_build_id: build.id
- )
-
- if deployment.size != file.size || deployment.file.size != file.size
- raise(WrongUploadedDeploymentSizeError)
- end
+ deployment = project.pages_deployments.create!(
+ file: file,
+ file_count: deployment_update.entries_count,
+ file_sha256: sha256,
+ ci_build_id: build.id
+ )
- validate_outdated_sha!
+ break if deployment.size != file.size || deployment.file.size != file.size
- project.update_pages_deployment!(deployment)
+ deployment
end
+ end
+ def update_project_pages_deployment(deployment)
+ project.update_pages_deployment!(deployment)
DestroyPagesDeploymentsWorker.perform_in(
OLD_DEPLOYMENTS_DESTRUCTION_DELAY,
project.id,
@@ -108,17 +103,6 @@ module Projects
build.artifacts_file.path
end
- def latest_sha
- project.commit(build.ref).try(:sha).to_s
- ensure
- # Close any file descriptors that were opened and free libgit2 buffers
- project.cleanup
- end
-
- def sha
- build.sha
- end
-
def register_attempt
pages_deployments_total_counter.increment
end
@@ -135,75 +119,14 @@ module Projects
@pages_deployments_failed_total_counter ||= Gitlab::Metrics.counter(:pages_deployments_failed_total, "Counter of GitLab Pages deployments which failed")
end
- def validate_state!
- raise InvalidStateError, 'missing pages artifacts' unless build.artifacts?
- raise InvalidStateError, 'missing artifacts metadata' unless build.artifacts_metadata?
-
- validate_outdated_sha!
- end
-
- def validate_outdated_sha!
- return if latest?
+ def publish_deployed_event
+ event = ::Pages::PageDeployedEvent.new(data: {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
+ })
- # use pipeline_id in case the build is retried
- last_deployed_pipeline_id = project.pages_metadatum&.pages_deployment&.ci_build&.pipeline_id
-
- return unless last_deployed_pipeline_id
- return if last_deployed_pipeline_id <= build.pipeline_id
-
- raise InvalidStateError, 'build SHA is outdated for this ref'
- end
-
- def latest?
- # check if sha for the ref is still the most recent one
- # this helps in case when multiple deployments happens
- sha == latest_sha
- end
-
- def validate_max_size!
- if total_size > max_size
- raise InvalidStateError, "artifacts for pages are too large: #{total_size}"
- end
- end
-
- # Calculate page size after extract
- def total_size
- @total_size ||= build.artifacts_metadata_entry(PUBLIC_DIR + '/', recursive: true).total_size
- end
-
- def max_size_from_settings
- Gitlab::CurrentSettings.max_pages_size.megabytes
- end
-
- def max_size
- max_pages_size = max_size_from_settings
-
- return ::Gitlab::Pages::MAX_SIZE if max_pages_size == 0
-
- max_pages_size
- end
-
- def validate_max_entries!
- if pages_file_entries_limit > 0 && entries_count > pages_file_entries_limit
- raise InvalidStateError, "pages site contains #{entries_count} file entries, while limit is set to #{pages_file_entries_limit}"
- end
- end
-
- def validate_public_folder!
- raise InvalidStateError, 'Error: The `public/` folder is missing, or not declared in `.gitlab-ci.yml`.' unless total_size > 0
- end
-
- def entries_count
- # we're using the full archive and pages daemon needs to read it
- # so we want the total count from entries, not only "public/" directory
- # because it better approximates work we need to do before we can serve the site
- @entries_count = build.artifacts_metadata_entry("", recursive: true).entries.count
- end
-
- def pages_file_entries_limit
- project.actual_limits.pages_file_entries
+ Gitlab::EventStore.publish(event)
end
end
end
-
-Projects::UpdatePagesService.prepend_mod_with('Projects::UpdatePagesService')
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
index fb810af3e6b..5708421014a 100644
--- a/app/services/projects/update_service.rb
+++ b/app/services/projects/update_service.rb
@@ -10,6 +10,7 @@ module Projects
def execute
build_topics
remove_unallowed_params
+ mirror_operations_access_level_changes
validate!
ensure_wiki_exists if enabling_wiki?
@@ -82,6 +83,21 @@ module Projects
params.delete(:emails_disabled) unless can?(current_user, :set_emails_disabled, project)
end
+ # Temporary code to sync permissions changes as operations access setting
+ # is being split into monitor_access_level, deployments_access_level, infrastructure_access_level.
+ # To be removed as part of https://gitlab.com/gitlab-org/gitlab/-/issues/364240
+ def mirror_operations_access_level_changes
+ return if Feature.enabled?(:split_operations_visibility_permissions, project)
+
+ operations_access_level = params.dig(:project_feature_attributes, :operations_access_level)
+
+ return if operations_access_level.nil?
+
+ [:monitor_access_level, :infrastructure_access_level, :feature_flags_access_level, :environments_access_level].each do |key|
+ params[:project_feature_attributes][key] = operations_access_level
+ end
+ end
+
def after_update
todos_features_changes = %w(
issues_access_level
diff --git a/app/services/protected_branches/access_level_params.rb b/app/services/protected_branches/access_level_params.rb
deleted file mode 100644
index 6f7a289d9b4..00000000000
--- a/app/services/protected_branches/access_level_params.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-module ProtectedBranches
- class AccessLevelParams
- attr_reader :type, :params
-
- def initialize(type, params)
- @type = type
- @params = params_with_default(params)
- end
-
- def access_levels
- ce_style_access_level
- end
-
- private
-
- def params_with_default(params)
- params[:"#{type}_access_level"] ||= Gitlab::Access::MAINTAINER if use_default_access_level?(params)
- params
- end
-
- def use_default_access_level?(params)
- true
- end
-
- def ce_style_access_level
- access_level = params[:"#{type}_access_level"]
-
- return [] unless access_level
-
- [{ access_level: access_level }]
- end
- end
-end
-
-ProtectedBranches::AccessLevelParams.prepend_mod_with('ProtectedBranches::AccessLevelParams')
diff --git a/app/services/protected_branches/api_service.rb b/app/services/protected_branches/api_service.rb
index d0d0737fd66..f604a57bcd1 100644
--- a/app/services/protected_branches/api_service.rb
+++ b/app/services/protected_branches/api_service.rb
@@ -10,8 +10,8 @@ module ProtectedBranches
{
name: params[:name],
allow_force_push: allow_force_push?,
- push_access_levels_attributes: AccessLevelParams.new(:push, params).access_levels,
- merge_access_levels_attributes: AccessLevelParams.new(:merge, params).access_levels
+ push_access_levels_attributes: ::ProtectedRefs::AccessLevelParams.new(:push, params).access_levels,
+ merge_access_levels_attributes: ::ProtectedRefs::AccessLevelParams.new(:merge, params).access_levels
}
end
diff --git a/app/services/protected_refs/access_level_params.rb b/app/services/protected_refs/access_level_params.rb
new file mode 100644
index 00000000000..59fc17868d1
--- /dev/null
+++ b/app/services/protected_refs/access_level_params.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module ProtectedRefs
+ class AccessLevelParams
+ attr_reader :type, :params
+
+ def initialize(type, params)
+ @type = type
+ @params = params_with_default(params)
+ end
+
+ def access_levels
+ ce_style_access_level
+ end
+
+ private
+
+ def params_with_default(params)
+ params[:"#{type}_access_level"] ||= Gitlab::Access::MAINTAINER if use_default_access_level?(params)
+ params
+ end
+
+ def use_default_access_level?(params)
+ true
+ end
+
+ def ce_style_access_level
+ access_level = params[:"#{type}_access_level"]
+
+ return [] unless access_level
+
+ [{ access_level: access_level }]
+ end
+ end
+end
+
+ProtectedRefs::AccessLevelParams.prepend_mod_with('ProtectedRefs::AccessLevelParams')
diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb
index 4bcb15b2d9c..1d7c5d2c80a 100644
--- a/app/services/quick_actions/interpret_service.rb
+++ b/app/services/quick_actions/interpret_service.rb
@@ -69,28 +69,32 @@ module QuickActions
Gitlab::QuickActions::Extractor.new(self.class.command_definitions)
end
+ # Find users for commands like /assign
+ #
+ # eg. /assign me and @jane and jack
def extract_users(params)
- return [] if params.blank?
-
- # We are using the a simple User.by_username query here rather than a ReferenceExtractor
- # because the needs here are much simpler: we only deal in usernames, and
- # want to also handle bare usernames. The ReferenceExtractor also has
- # different behaviour, and will return all group members for groups named
- # using a user-style reference, which is not in scope here.
- #
- # nb: underscores may be passed in escaped to protect them from markdown rendering
- args = params.split(/\s|,/).select(&:present?).uniq - ['and']
- args.map! { _1.gsub(/\\_/, '_') }
- usernames = (args - ['me']).map { _1.delete_prefix('@') }
- found = User.by_username(usernames).to_a.select { can?(:read_user, _1) }
- found_names = found.map(&:username).map(&:downcase).to_set
- missing = args.reject do |arg|
- arg == 'me' || found_names.include?(arg.downcase.delete_prefix('@'))
- end.map { "'#{_1}'" }
-
- failed_parse(format(_("Failed to find users for %{missing}"), missing: missing.to_sentence)) if missing.present?
-
- found + [current_user].select { args.include?('me') }
+ Gitlab::QuickActions::UsersExtractor
+ .new(current_user, project: project, group: group, target: quick_action_target, text: params)
+ .execute
+
+ rescue Gitlab::QuickActions::UsersExtractor::Error => err
+ extract_users_failed(err)
+ end
+
+ def extract_users_failed(err)
+ case err
+ when Gitlab::QuickActions::UsersExtractor::MissingError
+ failed_parse(format(_("Failed to find users for %{missing}"), missing: err.message))
+ when Gitlab::QuickActions::UsersExtractor::TooManyRefsError
+ failed_parse(format(_('Too many references. Quick actions are limited to at most %{max_count} user references'),
+ max_count: err.limit))
+ when Gitlab::QuickActions::UsersExtractor::TooManyFoundError
+ failed_parse(format(_("Too many users found. Quick actions are limited to at most %{max_count} users"),
+ max_count: err.limit))
+ else
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(err)
+ failed_parse(_('Something went wrong'))
+ end
end
def find_milestones(project, params = {})
diff --git a/app/services/repositories/changelog_service.rb b/app/services/repositories/changelog_service.rb
index 7a78b323453..447d4d979a6 100644
--- a/app/services/repositories/changelog_service.rb
+++ b/app/services/repositories/changelog_service.rb
@@ -41,6 +41,9 @@ module Repositories
# The `trailer` argument is the Git trailer to use for determining what
# commits to include in the changelog.
#
+ # The `config_file` arguments specifies the path to the configuration file as
+ # stored in the project's Git repository.
+ #
# The `file` arguments specifies the name/path of the file to commit the
# changes to. If the file doesn't exist, it's created automatically.
#
@@ -57,6 +60,7 @@ module Repositories
to: branch,
date: DateTime.now,
trailer: DEFAULT_TRAILER,
+ config_file: Gitlab::Changelog::Config::DEFAULT_FILE_PATH,
file: DEFAULT_FILE,
message: "Add changelog for version #{version}"
)
@@ -68,13 +72,14 @@ module Repositories
@date = date
@branch = branch
@trailer = trailer
+ @config_file = config_file
@file = file
@message = message
end
# rubocop: enable Metrics/ParameterLists
def execute(commit_to_changelog: true)
- config = Gitlab::Changelog::Config.from_git(@project, @user)
+ config = Gitlab::Changelog::Config.from_git(@project, @user, @config_file)
from = start_of_commit_range(config)
# For every entry we want to only include the merge request that
diff --git a/app/services/resource_access_tokens/create_service.rb b/app/services/resource_access_tokens/create_service.rb
index 316e6367aa7..eed03ba22fe 100644
--- a/app/services/resource_access_tokens/create_service.rb
+++ b/app/services/resource_access_tokens/create_service.rb
@@ -108,7 +108,7 @@ module ResourceAccessTokens
end
def create_membership(resource, user, access_level)
- resource.add_user(user, access_level, expires_at: params[:expires_at])
+ resource.add_member(user, access_level, expires_at: params[:expires_at])
end
def log_event(token)
diff --git a/app/services/search_service.rb b/app/services/search_service.rb
index 28e487aa24d..cea7fc5769e 100644
--- a/app/services/search_service.rb
+++ b/app/services/search_service.rb
@@ -11,7 +11,7 @@ class SearchService
def initialize(current_user, params = {})
@current_user = current_user
- @params = Gitlab::Search::Params.new(params, detect_abuse: prevent_abusive_searches?)
+ @params = Gitlab::Search::Params.new(params, detect_abuse: true)
end
# rubocop: disable CodeReuse/ActiveRecord
@@ -91,12 +91,19 @@ class SearchService
end
end
- private
-
- def prevent_abusive_searches?
- Feature.enabled?(:prevent_abusive_searches, current_user)
+ def level
+ @level ||=
+ if project
+ 'project'
+ elsif group
+ 'group'
+ else
+ 'global'
+ end
end
+ private
+
def page
[1, params[:page].to_i].max
end
diff --git a/app/services/service_ping/submit_service.rb b/app/services/service_ping/submit_service.rb
index b850592f7ba..89cb14e6fff 100644
--- a/app/services/service_ping/submit_service.rb
+++ b/app/services/service_ping/submit_service.rb
@@ -52,15 +52,22 @@ module ServicePing
ServicePing::DevopsReport.new(response).execute
end
- return unless Feature.enabled?(:measure_service_ping_metric_collection)
-
- submit_payload({ metadata: { metrics: metrics_collection_time(usage_data) } }, path: METADATA_PATH)
+ submit_payload(metadata(usage_data), path: METADATA_PATH)
end
private
attr_reader :payload, :skip_db_write
+ def metadata(service_ping_payload)
+ {
+ metadata: {
+ uuid: service_ping_payload[:uuid],
+ metrics: metrics_collection_time(service_ping_payload)
+ }
+ }
+ end
+
def metrics_collection_time(payload, parents = [])
return [] unless payload.is_a?(Hash)
diff --git a/app/services/system_notes/incidents_service.rb b/app/services/system_notes/incidents_service.rb
index d5da684a2d8..137994baa74 100644
--- a/app/services/system_notes/incidents_service.rb
+++ b/app/services/system_notes/incidents_service.rb
@@ -15,18 +15,14 @@ module SystemNotes
def add_timeline_event(timeline_event)
author = timeline_event.author
- anchor = "timeline_event_#{timeline_event.id}"
- path = url_helpers.project_issues_incident_path(project, noteable, anchor: anchor)
- body = "added an [incident timeline event](#{path})"
+ body = 'added an incident timeline event'
create_note(NoteSummary.new(noteable, project, author, body, action: 'timeline_event'))
end
def edit_timeline_event(timeline_event, author, was_changed:)
- anchor = "timeline_event_#{timeline_event.id}"
- path = url_helpers.project_issues_incident_path(project, noteable, anchor: anchor)
changed_text = CHANGED_TEXT.fetch(was_changed, '')
- body = "edited #{changed_text}[incident timeline event](#{path})"
+ body = "edited #{changed_text}incident timeline event"
create_note(NoteSummary.new(noteable, project, author, body, action: 'timeline_event'))
end
diff --git a/app/services/terraform/states/trigger_destroy_service.rb b/app/services/terraform/states/trigger_destroy_service.rb
index 3669bdcf716..3347d429bb4 100644
--- a/app/services/terraform/states/trigger_destroy_service.rb
+++ b/app/services/terraform/states/trigger_destroy_service.rb
@@ -12,9 +12,11 @@ module Terraform
return unauthorized_response unless can_destroy_state?
return state_locked_response if state.locked?
- state.update!(deleted_at: Time.current)
+ state.run_after_commit do
+ Terraform::States::DestroyWorker.perform_async(id)
+ end
- Terraform::States::DestroyWorker.perform_async(state.id)
+ state.update!(deleted_at: Time.current)
ServiceResponse.success
end
diff --git a/app/services/users/activity_service.rb b/app/services/users/activity_service.rb
index 20594bec28d..4978f778870 100644
--- a/app/services/users/activity_service.rb
+++ b/app/services/users/activity_service.rb
@@ -34,6 +34,8 @@ module Users
return unless lease.try_obtain
@user.update_attribute(:last_activity_on, today)
+
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('unique_active_user', values: @user.id)
end
end
end
diff --git a/app/services/web_hook_service.rb b/app/services/web_hook_service.rb
index f2f94563e56..cd2c7402713 100644
--- a/app/services/web_hook_service.rb
+++ b/app/services/web_hook_service.rb
@@ -48,7 +48,6 @@ class WebHookService
@force = force
@request_options = {
timeout: Gitlab.config.gitlab.webhook_timeout,
- use_read_total_timeout: true,
allow_local_requests: hook.allow_local_requests?
}
end
@@ -70,7 +69,7 @@ class WebHookService
start_time = Gitlab::Metrics::System.monotonic_time
response = if parsed_url.userinfo.blank?
- make_request(hook.url)
+ make_request(parsed_url.to_s)
else
make_request_with_auth
end
@@ -88,17 +87,19 @@ class WebHookService
rescue *Gitlab::HTTP::HTTP_ERRORS,
Gitlab::Json::LimitedEncoder::LimitExceeded, URI::InvalidURIError => e
execution_duration = Gitlab::Metrics::System.monotonic_time - start_time
+ error_message = e.to_s
+
log_execution(
response: InternalErrorResponse.new,
execution_duration: execution_duration,
- error_message: e.to_s
+ error_message: error_message
)
Gitlab::AppLogger.error("WebHook Error after #{execution_duration.to_i.seconds}s => #{e}")
{
status: :error,
- message: e.to_s
+ message: error_message
}
end
@@ -118,7 +119,11 @@ class WebHookService
private
def parsed_url
- @parsed_url ||= URI.parse(hook.url)
+ @parsed_url ||= URI.parse(hook.interpolated_url)
+ rescue WebHook::InterpolationError => e
+ # Behavior-preserving fallback.
+ Gitlab::ErrorTracking.track_exception(e)
+ @parsed_url = URI.parse(hook.url)
end
def make_request(url, basic_auth = false)
@@ -131,7 +136,7 @@ class WebHookService
end
def make_request_with_auth
- post_url = hook.url.gsub("#{parsed_url.userinfo}@", '')
+ post_url = parsed_url.to_s.gsub("#{parsed_url.userinfo}@", '')
basic_auth = {
username: CGI.unescape(parsed_url.user),
password: CGI.unescape(parsed_url.password.presence || '')
diff --git a/app/services/web_hooks/destroy_service.rb b/app/services/web_hooks/destroy_service.rb
index ecb530f0d2a..54c6c7ea71b 100644
--- a/app/services/web_hooks/destroy_service.rb
+++ b/app/services/web_hooks/destroy_service.rb
@@ -21,8 +21,5 @@ module WebHooks
ServiceResponse.error(message: "Unable to destroy #{web_hook.model_name.human}")
end
end
-
- # Backwards compatibility with WebHooks::DestroyWorker
- alias_method :sync_destroy, :execute
end
end
diff --git a/app/services/web_hooks/log_execution_service.rb b/app/services/web_hooks/log_execution_service.rb
index 0ee7c41469f..17dcf615830 100644
--- a/app/services/web_hooks/log_execution_service.rb
+++ b/app/services/web_hooks/log_execution_service.rb
@@ -44,6 +44,7 @@ module WebHooks
end
log_state_change
+ hook.update_last_failure
end
rescue Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError
raise if raise_lock_error?
diff --git a/app/services/work_items/create_and_link_service.rb b/app/services/work_items/create_and_link_service.rb
index 534d220a846..6a773a84225 100644
--- a/app/services/work_items/create_and_link_service.rb
+++ b/app/services/work_items/create_and_link_service.rb
@@ -25,7 +25,11 @@ module WorkItems
work_item = create_result[:work_item]
return ::ServiceResponse.success(payload: payload(work_item)) if @link_params.blank?
- result = IssueLinks::CreateService.new(work_item, @current_user, @link_params).execute
+ result = WorkItems::ParentLinks::CreateService.new(
+ @link_params[:parent_work_item],
+ @current_user,
+ { target_issuable: work_item }
+ ).execute
if result[:status] == :success
::ServiceResponse.success(payload: payload(work_item))
diff --git a/app/services/work_items/create_from_task_service.rb b/app/services/work_items/create_from_task_service.rb
index 4203c96e676..ef1d47c560d 100644
--- a/app/services/work_items/create_from_task_service.rb
+++ b/app/services/work_items/create_from_task_service.rb
@@ -17,7 +17,7 @@ module WorkItems
current_user: @current_user,
params: @work_item_params.slice(:title, :work_item_type_id),
spam_params: @spam_params,
- link_params: { target_issuable: @work_item }
+ link_params: { parent_work_item: @work_item }
).execute
if create_and_link_result.error?
@@ -27,6 +27,7 @@ module WorkItems
replacement_result = TaskListReferenceReplacementService.new(
work_item: @work_item,
+ current_user: @current_user,
work_item_reference: create_and_link_result[:work_item].to_reference,
line_number_start: @work_item_params[:line_number_start],
line_number_end: @work_item_params[:line_number_end],
diff --git a/app/services/work_items/create_service.rb b/app/services/work_items/create_service.rb
index 705735fe403..c2ceb701a2f 100644
--- a/app/services/work_items/create_service.rb
+++ b/app/services/work_items/create_service.rb
@@ -1,19 +1,19 @@
# frozen_string_literal: true
module WorkItems
- class CreateService
+ class CreateService < Issues::CreateService
include ::Services::ReturnServiceResponses
+ include WidgetableService
- def initialize(project:, current_user: nil, params: {}, spam_params:)
- @create_service = ::Issues::CreateService.new(
+ def initialize(project:, current_user: nil, params: {}, spam_params:, widget_params: {})
+ super(
project: project,
current_user: current_user,
params: params,
spam_params: spam_params,
build_service: ::WorkItems::BuildService.new(project: project, current_user: current_user, params: params)
)
- @current_user = current_user
- @project = project
+ @widget_params = widget_params
end
def execute
@@ -21,13 +21,24 @@ module WorkItems
return error(_('Operation not allowed'), :forbidden)
end
- work_item = @create_service.execute
+ work_item = super
if work_item.valid?
success(payload(work_item))
else
error(work_item.errors.full_messages, :unprocessable_entity, pass_back: payload(work_item))
end
+ rescue ::WorkItems::Widgets::BaseService::WidgetError => e
+ error(e.message, :unprocessable_entity)
+ end
+
+ def transaction_create(work_item)
+ super.tap do |save_result|
+ if save_result
+ execute_widgets(work_item: work_item, callback: :after_create_in_transaction,
+ widget_params: @widget_params)
+ end
+ end
end
private
diff --git a/app/services/work_items/parent_links/create_service.rb b/app/services/work_items/parent_links/create_service.rb
new file mode 100644
index 00000000000..9940776e367
--- /dev/null
+++ b/app/services/work_items/parent_links/create_service.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module ParentLinks
+ class CreateService < IssuableLinks::CreateService
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def relate_issuables(work_item)
+ link = WorkItems::ParentLink.find_or_initialize_by(work_item: work_item)
+ link.work_item_parent = issuable
+
+ if link.changed? && link.save
+ create_notes(work_item)
+ end
+
+ link
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def linkable_issuables(work_items)
+ @linkable_issuables ||= begin
+ return [] unless can?(current_user, :admin_parent_link, issuable)
+
+ work_items.select do |work_item|
+ linkable?(work_item)
+ end
+ end
+ end
+
+ def linkable?(work_item)
+ can?(current_user, :admin_parent_link, work_item) &&
+ !previous_related_issuables.include?(work_item)
+ end
+
+ def previous_related_issuables
+ @related_issues ||= issuable.work_item_children.to_a
+ end
+
+ def extract_references
+ params[:issuable_references]
+ end
+
+ # TODO: Create system notes when work item's parent or children are updated
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/362213
+ def create_notes(work_item)
+ # no-op
+ end
+
+ def target_issuable_type
+ issuable.issue_type == 'issue' ? 'task' : issuable.issue_type
+ end
+
+ def issuables_not_found_message
+ _('No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID.' %
+ { issuable: target_issuable_type })
+ end
+ end
+ end
+end
diff --git a/app/services/work_items/parent_links/destroy_service.rb b/app/services/work_items/parent_links/destroy_service.rb
new file mode 100644
index 00000000000..55870d44db9
--- /dev/null
+++ b/app/services/work_items/parent_links/destroy_service.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module ParentLinks
+ class DestroyService < IssuableLinks::DestroyService
+ attr_reader :link, :current_user, :parent, :child
+
+ def initialize(link, user)
+ @link = link
+ @current_user = user
+ @parent = link.work_item_parent
+ @child = link.work_item
+ end
+
+ private
+
+ # TODO: Create system notes when work item's parent or children are removed
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/362213
+ def create_notes
+ # no-op
+ end
+
+ def not_found_message
+ _('No Work Item Link found')
+ end
+
+ def permission_to_remove_relation?
+ can?(current_user, :admin_parent_link, child) && can?(current_user, :admin_parent_link, parent)
+ end
+ end
+ end
+end
diff --git a/app/services/work_items/task_list_reference_removal_service.rb b/app/services/work_items/task_list_reference_removal_service.rb
index e7ec73a96e0..9152580bef0 100644
--- a/app/services/work_items/task_list_reference_removal_service.rb
+++ b/app/services/work_items/task_list_reference_removal_service.rb
@@ -11,6 +11,7 @@ module WorkItems
@line_number_end = line_number_end
@lock_version = lock_version
@current_user = current_user
+ @task_reference = /#{Regexp.escape(@task.to_reference)}(?!\d)\+/
end
def execute
@@ -26,7 +27,9 @@ module WorkItems
line_matches_reference = (@line_number_start..@line_number_end).any? do |line_number|
markdown_line = source_lines[line_number - 1]
- /#{Regexp.escape(@task.to_reference)}(?!\d)/.match?(markdown_line)
+ if @task_reference.match?(markdown_line)
+ markdown_line.sub!(@task_reference, @task.title)
+ end
end
unless line_matches_reference
@@ -35,8 +38,6 @@ module WorkItems
)
end
- remove_task_lines!(source_lines)
-
::WorkItems::UpdateService.new(
project: @work_item.project,
current_user: @current_user,
@@ -51,13 +52,5 @@ module WorkItems
rescue ActiveRecord::StaleObjectError
::ServiceResponse.error(message: STALE_OBJECT_MESSAGE)
end
-
- private
-
- def remove_task_lines!(source_lines)
- source_lines.delete_if.each_with_index do |_line, index|
- index >= @line_number_start - 1 && index < @line_number_end
- end
- end
end
end
diff --git a/app/services/work_items/task_list_reference_replacement_service.rb b/app/services/work_items/task_list_reference_replacement_service.rb
index 1044a4feb88..b098d67561b 100644
--- a/app/services/work_items/task_list_reference_replacement_service.rb
+++ b/app/services/work_items/task_list_reference_replacement_service.rb
@@ -4,8 +4,9 @@ module WorkItems
class TaskListReferenceReplacementService
STALE_OBJECT_MESSAGE = 'Stale work item. Check lock version'
- def initialize(work_item:, work_item_reference:, line_number_start:, line_number_end:, title:, lock_version:)
+ def initialize(work_item:, current_user:, work_item_reference:, line_number_start:, line_number_end:, title:, lock_version:)
@work_item = work_item
+ @current_user = current_user
@work_item_reference = work_item_reference
@line_number_start = line_number_start
@line_number_end = line_number_end
@@ -32,7 +33,11 @@ module WorkItems
source_lines[@line_number_start - 1] = markdown_task_first_line
remove_additional_lines!(source_lines)
- @work_item.update!(description: source_lines.join("\n"))
+ ::WorkItems::UpdateService.new(
+ project: @work_item.project,
+ current_user: @current_user,
+ params: { description: source_lines.join("\n"), lock_version: @lock_version }
+ ).execute(@work_item)
::ServiceResponse.success
rescue ActiveRecord::StaleObjectError
diff --git a/app/services/work_items/update_service.rb b/app/services/work_items/update_service.rb
index 0b420881b4b..98818fda263 100644
--- a/app/services/work_items/update_service.rb
+++ b/app/services/work_items/update_service.rb
@@ -2,16 +2,38 @@
module WorkItems
class UpdateService < ::Issues::UpdateService
+ include WidgetableService
+
def initialize(project:, current_user: nil, params: {}, spam_params: nil, widget_params: {})
+ params[:widget_params] = true if widget_params.present?
+
super(project: project, current_user: current_user, params: params, spam_params: nil)
@widget_params = widget_params
end
+ def execute(work_item)
+ updated_work_item = super
+
+ if updated_work_item.valid?
+ success(payload(work_item))
+ else
+ error(updated_work_item.errors.full_messages, :unprocessable_entity, pass_back: payload(updated_work_item))
+ end
+ rescue ::WorkItems::Widgets::BaseService::WidgetError => e
+ error(e.message, :unprocessable_entity)
+ end
+
private
def update(work_item)
- execute_widgets(work_item: work_item, callback: :update)
+ execute_widgets(work_item: work_item, callback: :update, widget_params: @widget_params)
+
+ super
+ end
+
+ def transaction_update(work_item, opts = {})
+ execute_widgets(work_item: work_item, callback: :before_update_in_transaction, widget_params: @widget_params)
super
end
@@ -22,10 +44,8 @@ module WorkItems
GraphqlTriggers.issuable_title_updated(work_item) if work_item.previous_changes.key?(:title)
end
- def execute_widgets(work_item:, callback:)
- work_item.widgets.each do |widget|
- widget.try(callback, params: @widget_params[widget.class.api_symbol])
- end
+ def payload(work_item)
+ { work_item: work_item }
end
end
end
diff --git a/app/services/work_items/widgets/base_service.rb b/app/services/work_items/widgets/base_service.rb
new file mode 100644
index 00000000000..037733bbed5
--- /dev/null
+++ b/app/services/work_items/widgets/base_service.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ class BaseService < ::BaseService
+ WidgetError = Class.new(StandardError)
+
+ attr_reader :widget, :current_user
+
+ def initialize(widget:, current_user:)
+ @widget = widget
+ @current_user = current_user
+ end
+ end
+ end
+end
diff --git a/app/services/work_items/widgets/description_service/update_service.rb b/app/services/work_items/widgets/description_service/update_service.rb
new file mode 100644
index 00000000000..e63b6b2ee6c
--- /dev/null
+++ b/app/services/work_items/widgets/description_service/update_service.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ module DescriptionService
+ class UpdateService < WorkItems::Widgets::BaseService
+ def update(params: {})
+ return unless params.present? && params[:description]
+
+ widget.work_item.description = params[:description]
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/work_items/widgets/hierarchy_service/base_service.rb b/app/services/work_items/widgets/hierarchy_service/base_service.rb
new file mode 100644
index 00000000000..085d6c6b0e7
--- /dev/null
+++ b/app/services/work_items/widgets/hierarchy_service/base_service.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ module HierarchyService
+ class BaseService < WorkItems::Widgets::BaseService
+ private
+
+ def handle_hierarchy_changes(params)
+ return feature_flag_error unless feature_flag_enabled?
+ return incompatible_args_error if incompatible_args?(params)
+
+ if params.key?(:parent)
+ update_work_item_parent(params.delete(:parent))
+ elsif params.key?(:children)
+ update_work_item_children(params.delete(:children))
+ else
+ invalid_args_error
+ end
+ end
+
+ def update_work_item_parent(parent)
+ if parent.nil?
+ remove_parent
+ else
+ set_parent(parent)
+ end
+ end
+
+ def set_parent(parent)
+ ::WorkItems::ParentLinks::CreateService
+ .new(parent, current_user, { target_issuable: widget.work_item })
+ .execute
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def remove_parent
+ link = ::WorkItems::ParentLink.find_by(work_item: widget.work_item)
+ return success unless link.present?
+
+ ::WorkItems::ParentLinks::DestroyService.new(link, current_user).execute
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def update_work_item_children(children)
+ ::WorkItems::ParentLinks::CreateService
+ .new(widget.work_item, current_user, { issuable_references: children })
+ .execute
+ end
+
+ def feature_flag_enabled?
+ Feature.enabled?(:work_items_hierarchy, widget.work_item&.project)
+ end
+
+ def incompatible_args?(params)
+ params[:children] && params[:parent]
+ end
+
+ def feature_flag_error
+ error(_('`work_items_hierarchy` feature flag disabled for this project'))
+ end
+
+ def incompatible_args_error
+ error(_('A Work Item can be a parent or a child, but not both.'))
+ end
+
+ def invalid_args_error
+ error(_("One or more arguments are invalid: %{args}." % { args: params.keys.to_sentence } ))
+ end
+
+ def service_response!(result)
+ return result unless result[:status] == :error
+
+ raise WidgetError, result[:message]
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/work_items/widgets/hierarchy_service/create_service.rb b/app/services/work_items/widgets/hierarchy_service/create_service.rb
new file mode 100644
index 00000000000..c97812fade2
--- /dev/null
+++ b/app/services/work_items/widgets/hierarchy_service/create_service.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ module HierarchyService
+ class CreateService < WorkItems::Widgets::HierarchyService::BaseService
+ def after_create_in_transaction(params:)
+ return unless params.present?
+
+ service_response!(handle_hierarchy_changes(params))
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/work_items/widgets/hierarchy_service/update_service.rb b/app/services/work_items/widgets/hierarchy_service/update_service.rb
new file mode 100644
index 00000000000..48b540f919e
--- /dev/null
+++ b/app/services/work_items/widgets/hierarchy_service/update_service.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ module HierarchyService
+ class UpdateService < WorkItems::Widgets::HierarchyService::BaseService
+ def before_update_in_transaction(params:)
+ return unless params.present?
+
+ service_response!(handle_hierarchy_changes(params))
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/work_items/widgets/weight_service/update_service.rb b/app/services/work_items/widgets/weight_service/update_service.rb
new file mode 100644
index 00000000000..cd62a25358f
--- /dev/null
+++ b/app/services/work_items/widgets/weight_service/update_service.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module WorkItems
+ module Widgets
+ module WeightService
+ class UpdateService < WorkItems::Widgets::BaseService
+ def update(params: {})
+ return unless params.present? && params[:weight]
+
+ widget.work_item.weight = params[:weight]
+ end
+ end
+ end
+ end
+end
diff --git a/app/views/admin/application_settings/_eks.html.haml b/app/views/admin/application_settings/_eks.html.haml
index 370d3cea07c..68eb33d6552 100644
--- a/app/views/admin/application_settings/_eks.html.haml
+++ b/app/views/admin/application_settings/_eks.html.haml
@@ -1,7 +1,7 @@
- expanded = integration_expanded?('eks_')
%section.settings.as-eks.no-animate#js-eks-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Amazon EKS')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/_error_tracking.html.haml b/app/views/admin/application_settings/_error_tracking.html.haml
new file mode 100644
index 00000000000..2dcd9d0d2c0
--- /dev/null
+++ b/app/views/admin/application_settings/_error_tracking.html.haml
@@ -0,0 +1,40 @@
+- expanded = integration_expanded?('error_tracking_')
+
+%section.settings.as-error-tracking.no-animate#js-error-tracking-settings{ class: ('expanded' if expanded) }
+ .settings-header
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
+ = _('GitLab Error Tracking')
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
+ = expanded ? _('Collapse') : _('Expand')
+ %p
+ = _('Allows projects to track errors using an Opstrace integration.').html_safe % { link: help_page_path('operations/error_tracking.md') }
+ = link_to _('Learn more.'), help_page_path('operations/error_tracking.md'), target: '_blank', rel: 'noopener noreferrer'
+
+ .settings-content
+
+ %fieldset
+ .sub-section
+ %h4= _('Access Token')
+ .form-group
+ .form-text
+ %p.text-secondary
+ = s_("ErrorTracking|Access token is %{token_in_code_tag}").html_safe % { token_in_code_tag: content_tag(:code, Gitlab::CurrentSettings.error_tracking_access_token, id: 'error-tracking-access-token') }
+ .form-inline
+ = button_to _("Reset error tracking access token"), reset_error_tracking_access_token_admin_application_settings_path,
+ method: :put, class: 'gl-button btn btn-danger btn-sm',
+ data: { confirm: _('Are you sure you want to reset the error tracking access token?') }
+
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-error-tracking-settings'), html: { class: 'fieldset-form', id: 'error-tracking-settings' } do |f|
+ = form_errors(@application_setting, pajamas_alert: true) if expanded
+
+ %fieldset
+ .sub-section
+ %h4= _('Configure Error Tracking')
+ .form-group
+ = f.gitlab_ui_checkbox_component :error_tracking_enabled,
+ _('Enable GitLab Error Tracking')
+ .form-group
+ = f.label :error_tracking_api_url, _('Opstrace endpoint for Error Tracking integration'), class: 'label-light'
+ = f.text_field :error_tracking_api_url, class: 'form-control gl-form-input'
+
+ = f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_external_authorization_service_form.html.haml b/app/views/admin/application_settings/_external_authorization_service_form.html.haml
index 4d0faf69958..f287dba9866 100644
--- a/app/views/admin/application_settings/_external_authorization_service_form.html.haml
+++ b/app/views/admin/application_settings/_external_authorization_service_form.html.haml
@@ -1,6 +1,6 @@
%section.settings.as-external-auth.no-animate#js-external-auth-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= s_('ExternalAuthorization|External authorization')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/_floc.html.haml b/app/views/admin/application_settings/_floc.html.haml
index b5a63aa0847..d63eb2bd09d 100644
--- a/app/views/admin/application_settings/_floc.html.haml
+++ b/app/views/admin/application_settings/_floc.html.haml
@@ -2,7 +2,7 @@
%section.settings.no-animate#js-floc-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= s_('FloC|Federated Learning of Cohorts')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/_gitpod.html.haml b/app/views/admin/application_settings/_gitpod.html.haml
index eb47d177701..cc1e3f968cb 100644
--- a/app/views/admin/application_settings/_gitpod.html.haml
+++ b/app/views/admin/application_settings/_gitpod.html.haml
@@ -2,7 +2,7 @@
%section.settings.no-animate#js-gitpod-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Gitpod')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
@@ -13,7 +13,7 @@
.settings-content
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-gitpod-settings'), html: { class: 'fieldset-form', id: 'gitpod-settings' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_grafana.html.haml b/app/views/admin/application_settings/_grafana.html.haml
index 7f305b9ad9c..f17f63c7df7 100644
--- a/app/views/admin/application_settings/_grafana.html.haml
+++ b/app/views/admin/application_settings/_grafana.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-grafana-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_jira_connect_application_key.html.haml b/app/views/admin/application_settings/_jira_connect_application_key.html.haml
index e395741dcaa..68a82288573 100644
--- a/app/views/admin/application_settings/_jira_connect_application_key.html.haml
+++ b/app/views/admin/application_settings/_jira_connect_application_key.html.haml
@@ -2,7 +2,7 @@
%section.settings.no-animate#js-jira_connect-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= s_('JiraConnect|GitLab for Jira App')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
@@ -12,7 +12,7 @@
.settings-content
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-jira-connect-application-id-settings'), html: { class: 'fieldset-form', id: 'jira-connect-application-id-settings' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_kroki.html.haml b/app/views/admin/application_settings/_kroki.html.haml
index b1dd8a282ec..c0ac924407f 100644
--- a/app/views/admin/application_settings/_kroki.html.haml
+++ b/app/views/admin/application_settings/_kroki.html.haml
@@ -1,7 +1,7 @@
- expanded = integration_expanded?('kroki_')
%section.settings.as-kroki.no-animate#js-kroki-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Kroki')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/_mailgun.html.haml b/app/views/admin/application_settings/_mailgun.html.haml
index e84fdc56f93..cbe7e1c5bb6 100644
--- a/app/views/admin/application_settings/_mailgun.html.haml
+++ b/app/views/admin/application_settings/_mailgun.html.haml
@@ -1,7 +1,7 @@
- expanded = integration_expanded?('mailgun_')
%section.settings.as-mailgun.no-animate#js-mailgun-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Mailgun')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
@@ -9,7 +9,7 @@
= _('Configure the %{link} integration.').html_safe % { link: link_to(_('Mailgun events'), 'https://documentation.mailgun.com/en/latest/user_manual.html#webhooks', target: '_blank', rel: 'noopener noreferrer') }
.settings-content
= gitlab_ui_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
+ = form_errors(@application_setting, pajamas_alert: true) if expanded
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_package_registry.html.haml b/app/views/admin/application_settings/_package_registry.html.haml
index c0fabb1d42e..b31576b5c48 100644
--- a/app/views/admin/application_settings/_package_registry.html.haml
+++ b/app/views/admin/application_settings/_package_registry.html.haml
@@ -1,7 +1,7 @@
- if Gitlab.config.packages.enabled
%section.settings.as-package.no-animate#js-package-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Package Registry')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/_performance_bar.html.haml b/app/views/admin/application_settings/_performance_bar.html.haml
index 4e37c4c3c98..a7f73edcf69 100644
--- a/app/views/admin/application_settings/_performance_bar.html.haml
+++ b/app/views/admin/application_settings/_performance_bar.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-performance-bar-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_plantuml.html.haml b/app/views/admin/application_settings/_plantuml.html.haml
index 57931544e65..8be37ff1dda 100644
--- a/app/views/admin/application_settings/_plantuml.html.haml
+++ b/app/views/admin/application_settings/_plantuml.html.haml
@@ -1,7 +1,7 @@
- expanded = integration_expanded?('plantuml_')
%section.settings.as-plantuml.no-animate#js-plantuml-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('PlantUML')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
@@ -10,7 +10,7 @@
= link_to _('Learn more.'), help_page_path('administration/integration/plantuml.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-plantuml-settings'), html: { class: 'fieldset-form', id: 'plantuml-settings' } do |f|
- = form_errors(@application_setting) if expanded
+ = form_errors(@application_setting, pajamas_alert: true) if expanded
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_prometheus.html.haml b/app/views/admin/application_settings/_prometheus.html.haml
index 59681c0278e..d8dffd6bc16 100644
--- a/app/views/admin/application_settings/_prometheus.html.haml
+++ b/app/views/admin/application_settings/_prometheus.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-prometheus-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml
index 856db32e088..db4d1cb323c 100644
--- a/app/views/admin/application_settings/_registry.html.haml
+++ b/app/views/admin/application_settings/_registry.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_repository_check.html.haml b/app/views/admin/application_settings/_repository_check.html.haml
index ef8d3ccc8ab..40d847f4949 100644
--- a/app/views/admin/application_settings/_repository_check.html.haml
+++ b/app/views/admin/application_settings/_repository_check.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-check-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.sub-section
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 dad8d5f3fae..156a6bbcfa6 100644
--- a/app/views/admin/application_settings/_repository_mirrors_form.html.haml
+++ b/app/views/admin/application_settings/_repository_mirrors_form.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-mirror-settings') do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_repository_static_objects.html.haml b/app/views/admin/application_settings/_repository_static_objects.html.haml
index d962d050ebc..a8e109ce377 100644
--- a/app/views/admin/application_settings/_repository_static_objects.html.haml
+++ b/app/views/admin/application_settings/_repository_static_objects.html.haml
@@ -1,5 +1,5 @@
= form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-static-objects-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_signup.html.haml b/app/views/admin/application_settings/_signup.html.haml
index fccf039533b..2365daa2c70 100644
--- a/app/views/admin/application_settings/_signup.html.haml
+++ b/app/views/admin/application_settings/_signup.html.haml
@@ -1,3 +1,3 @@
-= form_errors(@application_setting)
+= form_errors(@application_setting, pajamas_alert: true)
#js-signup-form{ data: signup_form_data }
diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml
index e9387ab3f26..8684b909853 100644
--- a/app/views/admin/application_settings/_snowplow.html.haml
+++ b/app/views/admin/application_settings/_snowplow.html.haml
@@ -1,7 +1,7 @@
- expanded = integration_expanded?('snowplow_')
%section.settings.as-snowplow.no-animate#js-snowplow-settings{ class: ('expanded' if expanded), data: { qa_selector: 'snowplow_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Snowplow')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/_sourcegraph.html.haml b/app/views/admin/application_settings/_sourcegraph.html.haml
index a0cbbecb943..43ff2bc02f5 100644
--- a/app/views/admin/application_settings/_sourcegraph.html.haml
+++ b/app/views/admin/application_settings/_sourcegraph.html.haml
@@ -3,7 +3,7 @@
%section.settings.as-sourcegraph.no-animate#js-sourcegraph-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Sourcegraph')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/_spam.html.haml b/app/views/admin/application_settings/_spam.html.haml
index bb512940be2..7f3125d91ba 100644
--- a/app/views/admin/application_settings/_spam.html.haml
+++ b/app/views/admin/application_settings/_spam.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: reporting_admin_application_settings_path(anchor: 'js-spam-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
%h5
diff --git a/app/views/admin/application_settings/_terminal.html.haml b/app/views/admin/application_settings/_terminal.html.haml
index c53f63e124b..5703fbb463e 100644
--- a/app/views/admin/application_settings/_terminal.html.haml
+++ b/app/views/admin/application_settings/_terminal.html.haml
@@ -1,5 +1,5 @@
= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-terminal-settings'), html: { class: 'fieldset-form', id: 'terminal-settings' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
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 205e14fb8ab..397b47eefaa 100644
--- a/app/views/admin/application_settings/_third_party_offers.html.haml
+++ b/app/views/admin/application_settings/_third_party_offers.html.haml
@@ -1,7 +1,7 @@
- expanded = integration_expanded?('hide_third_party_')
%section.settings.as-third-party-offers.no-animate#js-third-party-offers-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Customer experience improvement and third-party offers')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
@@ -9,7 +9,7 @@
= _('Control whether to display customer experience improvement content and third-party offers in GitLab.')
.settings-content
= gitlab_ui_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
+ = form_errors(@application_setting, pajamas_alert: true) if expanded
%fieldset
.form-group
diff --git a/app/views/admin/application_settings/_visibility_and_access.html.haml b/app/views/admin/application_settings/_visibility_and_access.html.haml
index 96dcd7e1111..d35fba7d3b2 100644
--- a/app/views/admin/application_settings/_visibility_and_access.html.haml
+++ b/app/views/admin/application_settings/_visibility_and_access.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-visibility-settings'), html: { class: 'fieldset-form', id: 'visibility-settings' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
= render 'shared/project_creation_levels', f: f, method: :default_project_creation, legend: s_('ProjectCreationLevel|Default project creation protection')
@@ -24,7 +24,7 @@
.form-group
= f.label :import_sources, s_('AdminSettings|Import sources'), class: 'label-bold gl-mb-0'
%span.form-text.gl-mt-0.gl-mb-3#import-sources-help
- = _('Enabled sources for code import during project creation. OmniAuth must be configured for GitHub')
+ = _('Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub')
= link_to sprite_icon('question-o'), help_page_path("integration/github")
, Bitbucket
= link_to sprite_icon('question-o'), help_page_path("integration/bitbucket")
diff --git a/app/views/admin/application_settings/appearances/_form.html.haml b/app/views/admin/application_settings/appearances/_form.html.haml
index 5816bd42a83..224d9fbe953 100644
--- a/app/views/admin/application_settings/appearances/_form.html.haml
+++ b/app/views/admin/application_settings/appearances/_form.html.haml
@@ -1,7 +1,7 @@
- parsed_with_gfm = (_("Content parsed with %{link}.") % { link: link_to('GitLab Flavored Markdown', help_page_path('user/markdown'), target: '_blank') }).html_safe
= gitlab_ui_form_for @appearance, url: admin_application_settings_appearances_path, html: { class: 'gl-mt-3' } do |f|
- = form_errors(@appearance)
+ = form_errors(@appearance, pajamas_alert: true)
.row
diff --git a/app/views/admin/application_settings/ci/_header.html.haml b/app/views/admin/application_settings/ci/_header.html.haml
index 5e3f0d6f2aa..0adb6cbbcf0 100644
--- a/app/views/admin/application_settings/ci/_header.html.haml
+++ b/app/views/admin/application_settings/ci/_header.html.haml
@@ -1,6 +1,6 @@
- expanded = local_assigns.fetch(:expanded)
-%h4
+%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Variables')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml
index b635e7198cb..f0f7e6868da 100644
--- a/app/views/admin/application_settings/ci_cd.html.haml
+++ b/app/views/admin/application_settings/ci_cd.html.haml
@@ -14,7 +14,7 @@
%section.settings.as-ci-cd.no-animate#js-ci-cd-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Continuous Integration and Deployment')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -29,7 +29,7 @@
- if Gitlab.config.registry.enabled
%section.settings.as-registry.no-animate#js-registry-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Container Registry')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -41,7 +41,7 @@
- if Feature.enabled?(:runner_registration_control)
%section.settings.as-runner.no-animate#js-runner-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= s_('Runners|Runner registration')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? 'Collapse' : 'Expand'
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index 36b9ad189d8..d7559fcd48b 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -4,18 +4,18 @@
%section.settings.as-visibility-access.no-animate#js-visibility-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Visibility and access controls')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Set default and restrict visibility levels. Configure import sources and git access protocol.')
+ = _('Set visibility of project contents. Configure import sources and Git access protocols.')
.settings-content
= render 'visibility_and_access'
%section.settings.as-account-limit.no-animate#js-account-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'account_and_limit_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Account and limit')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -26,7 +26,7 @@
%section.settings.as-diff-limits.no-animate#js-merge-request-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Diff limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -37,7 +37,7 @@
%section.settings.as-signup.no-animate#js-signup-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'sign_up_restrictions_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Sign-up restrictions')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -48,7 +48,7 @@
%section.settings.as-signin.no-animate#js-signin-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Sign-in restrictions')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -60,7 +60,7 @@
%section.settings.as-terms.no-animate#js-terms-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Terms of Service and Privacy Policy')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -74,7 +74,7 @@
%section.settings.as-terminal.no-animate#js-terminal-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Web terminal')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -86,7 +86,7 @@
%section.settings.no-animate#js-web-ide-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Web IDE')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -94,7 +94,7 @@
= _('Manage Web IDE features.')
.settings-content
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: "js-web-ide-settings"), html: { class: 'fieldset-form', id: 'web-ide-settings' } do |f|
- = form_errors(@application_setting)
+ = form_errors(@application_setting, pajamas_alert: true)
%fieldset
.form-group
@@ -113,8 +113,11 @@
= render_if_exists 'admin/application_settings/slack'
-# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/417
= render_if_exists 'admin/application_settings/dingtalk_integration'
+-# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/640
+= render_if_exists 'admin/application_settings/feishu_integration'
= render 'admin/application_settings/third_party_offers'
= render 'admin/application_settings/snowplow'
+= render 'admin/application_settings/error_tracking' if Feature.enabled?(:gitlab_error_tracking)
= render 'admin/application_settings/eks'
= render 'admin/application_settings/floc'
= render_if_exists 'admin/application_settings/add_license'
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 7cc0ff2c28e..d4476bf838a 100644
--- a/app/views/admin/application_settings/metrics_and_profiling.html.haml
+++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml
@@ -6,7 +6,7 @@
%section.settings.as-prometheus.no-animate#js-prometheus-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Metrics - Prometheus')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -17,7 +17,7 @@
%section.settings.as-grafana.no-animate#js-grafana-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Metrics - Grafana')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -30,7 +30,7 @@
%section.settings.as-performance-bar.no-animate#js-performance-bar-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'performance_bar_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Profiling - Performance bar')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -44,7 +44,7 @@
%section.settings.as-usage.no-animate#js-usage-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'usage_statistics_settings_content' } }
.settings-header#usage-statistics
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Usage statistics')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -56,7 +56,7 @@
- if Feature.enabled?(:configure_sentry_in_application_settings)
%section.settings.as-sentry.no-animate#js-sentry-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'sentry_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Sentry')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml
index f3264f733ab..485b3a9828b 100644
--- a/app/views/admin/application_settings/network.html.haml
+++ b/app/views/admin/application_settings/network.html.haml
@@ -4,7 +4,7 @@
%section.settings.as-performance.no-animate#js-performance-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Performance optimization')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -15,7 +15,7 @@
%section.settings.as-ip-limits.no-animate#js-ip-limits-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'ip_limits_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('User and IP rate limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -27,7 +27,7 @@
%section.settings.as-packages-limits.no-animate#js-packages-limits-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'packages_limits_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Package registry rate limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -39,7 +39,7 @@
%section.settings.as-files-limits.no-animate#js-files-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Files API Rate Limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -50,7 +50,7 @@
%section.settings.as-search-limits.no-animate#js-search-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Search rate limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -61,7 +61,7 @@
%section.settings.as-deprecated-limits.no-animate#js-deprecated-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Deprecated API rate limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -73,7 +73,7 @@
%section.settings.as-git-lfs-limits.no-animate#js-git-lfs-limits-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'git_lfs_limits_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Git LFS Rate Limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -85,7 +85,7 @@
%section.settings.as-outbound.no-animate#js-outbound-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'outbound_requests_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= s_('OutboundRequests|Outbound requests')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
@@ -98,7 +98,7 @@
%section.settings.as-protected-paths.no-animate#js-protected-paths-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Protected paths')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -111,7 +111,7 @@
%section.settings.as-issue-limits.no-animate#js-issue-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Issues Rate Limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -123,7 +123,7 @@
%section.settings.as-note-limits.no-animate#js-note-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Notes rate limit')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -135,7 +135,7 @@
%section.settings.as-users-api-limits.no-animate#js-users-api-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Users API rate limit')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -147,7 +147,7 @@
%section.settings.as-import-export-limits.no-animate#js-import-export-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Import and export rate limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -159,7 +159,7 @@
%section.settings.as-pipeline-limits.no-animate#js-pipeline-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Pipeline creation rate limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/preferences.html.haml b/app/views/admin/application_settings/preferences.html.haml
index 858f96fc0d0..bd92f7d490c 100644
--- a/app/views/admin/application_settings/preferences.html.haml
+++ b/app/views/admin/application_settings/preferences.html.haml
@@ -4,7 +4,7 @@
%section.settings.as-email.no-animate#js-email-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'email_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Email')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -15,7 +15,7 @@
%section.settings.as-whats-new-page.no-animate#js-whats-new-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("What's new")
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -26,7 +26,7 @@
%section.settings.as-help-page.no-animate#js-help-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Sign-in and Help page')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -38,7 +38,7 @@
%section.settings.as-pages.no-animate#js-pages-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Pages')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -49,7 +49,7 @@
%section.settings.as-realtime.no-animate#js-realtime-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Polling interval multiplier')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -61,7 +61,7 @@
%section.settings.as-gitaly.no-animate#js-gitaly-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Gitaly timeouts')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -74,7 +74,7 @@
%section.settings.as-localization.no-animate#js-localization-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Localization')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -85,7 +85,7 @@
%section.settings.as-sidekiq-job-limits.no-animate#js-sidekiq-job-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Sidekiq job size limits')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/application_settings/reporting.html.haml b/app/views/admin/application_settings/reporting.html.haml
index b15fcd93d1a..af9145bf1e7 100644
--- a/app/views/admin/application_settings/reporting.html.haml
+++ b/app/views/admin/application_settings/reporting.html.haml
@@ -4,7 +4,7 @@
%section.settings.as-spam.no-animate#js-spam-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Spam and Anti-bot Protection')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -18,7 +18,7 @@
%section.settings.as-abuse.no-animate#js-abuse-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Abuse reports')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -27,3 +27,5 @@
= link_to _('Learn more.'), help_page_path('user/admin_area/review_abuse_reports.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'abuse'
+
+= render_if_exists 'admin/application_settings/git_abuse_rate_limit'
diff --git a/app/views/admin/application_settings/repository.html.haml b/app/views/admin/application_settings/repository.html.haml
index 785261b4c7b..12063ea700b 100644
--- a/app/views/admin/application_settings/repository.html.haml
+++ b/app/views/admin/application_settings/repository.html.haml
@@ -4,7 +4,7 @@
%section.settings.as-default-branch-name.no-animate#js-default-branch-name{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Default branch')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -15,7 +15,7 @@
%section.settings.as-mirror.no-animate#js-mirror-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Repository mirroring')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? 'Collapse' : 'Expand'
@@ -27,7 +27,7 @@
%section.settings.as-repository-storage.no-animate#js-repository-storage-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'repository_storage_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Repository storage')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -39,7 +39,7 @@
%section.settings.as-repository-check.no-animate#js-repository-check-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Repository maintenance')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
@@ -54,7 +54,7 @@
%section.settings.as-repository-static-objects.no-animate#js-repository-static-objects-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('External storage for repository static objects')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded_by_default? ? _('Collapse') : _('Expand')
diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml
index fd73d4c5671..e0926221bcc 100644
--- a/app/views/admin/applications/_form.html.haml
+++ b/app/views/admin/applications/_form.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for [:admin, @application], url: @url, html: {role: 'form'} do |f|
- = form_errors(application)
+ = form_errors(application, pajamas_alert: true)
= content_tag :div, class: 'form-group row' do
.col-sm-2.col-form-label
diff --git a/app/views/admin/broadcast_messages/_form.html.haml b/app/views/admin/broadcast_messages/_form.html.haml
index dfd3b87c674..865b60a74b8 100644
--- a/app/views/admin/broadcast_messages/_form.html.haml
+++ b/app/views/admin/broadcast_messages/_form.html.haml
@@ -2,7 +2,7 @@
= render 'preview'
= gitlab_ui_form_for [:admin, @broadcast_message], html: { class: 'broadcast-message-form js-quick-submit js-requires-input'} do |f|
- = form_errors(@broadcast_message)
+ = form_errors(@broadcast_message, pajamas_alert: true)
.form-group.row.mt-4
.col-sm-2.col-form-label
diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml
index 43a8d56d584..7bcc97914e5 100644
--- a/app/views/admin/groups/_form.html.haml
+++ b/app/views/admin/groups/_form.html.haml
@@ -1,40 +1,52 @@
= gitlab_ui_form_for [:admin, @group] do |f|
= form_errors(@group, pajamas_alert: true)
- = render 'shared/group_form', f: f
- = render 'shared/group_form_description', f: f
-
- = render 'shared/admin/admin_note_form', f: f
-
- = render_if_exists 'shared/old_repository_size_limit_setting', form: f, type: :group
- = render_if_exists 'admin/namespace_plan', f: f
-
- .form-group.row.group-description-holder
- .col-sm-2.col-form-label
- = f.label :avatar, _("Group avatar")
- .col-sm-10
- = render 'shared/choose_avatar_button', f: f
-
- = render 'shared/old_visibility_level', f: f, visibility_level: visibility_level, can_change_visibility_level: can_change_group_visibility_level?(@group), form_model: @group, with_label: false
-
- .form-group.row
- .offset-sm-2.col-sm-10
- = render 'shared/allow_request_access', form: f
-
- = render 'groups/group_admin_settings', f: f
-
- = render_if_exists 'namespaces/shared_runners_minutes_settings', group: @group, form: f
+ .gl-border-b.gl-mb-6
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Naming, visibility')
+ %p
+ = _('Update your group name, description, avatar, and visibility.')
+ = link_to _('Learn more about groups.'), help_page_path('user/group/index')
+ .col-lg-8
+ = render 'shared/group_form', f: f
+ = render 'shared/group_form_description', f: f
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :avatar, _("Group avatar"), class: 'gl-display-block col-form-label'
+ = render 'shared/choose_avatar_button', f: f
+ = render 'shared/old_visibility_level', f: f, visibility_level: visibility_level, can_change_visibility_level: can_change_group_visibility_level?(@group), form_model: @group, with_label: false
+
+ .gl-border-b.gl-pb-3.gl-mb-6
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Permissions and group features')
+ %p
+ = _('Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings.')
+ .col-lg-8
+ = render_if_exists 'shared/old_repository_size_limit_setting', form: f, type: :group
+ = render_if_exists 'admin/namespace_plan', f: f
+ .form-group.gl-form-group{ role: 'group' }
+ = render 'shared/allow_request_access', form: f
+ = render 'groups/group_admin_settings', f: f
+ = render_if_exists 'namespaces/shared_runners_minutes_settings', group: @group, form: f
+ .gl-mb-3
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Admin notes')
+ .col-lg-8
+ = render 'shared/admin/admin_note_form', f: f
- if @group.new_record?
- .form-group.row
- .offset-sm-2.col-sm-10
- = render Pajamas::AlertComponent.new(dismissible: false) do |c|
- = c.body do
- = render 'shared/group_tips'
- .form-actions
+ = render Pajamas::AlertComponent.new(dismissible: false) do |c|
+ = c.body do
+ = render 'shared/group_tips'
+ .gl-mt-5
= f.submit _('Create group'), class: "gl-button btn btn-confirm"
= link_to _('Cancel'), admin_groups_path, class: "gl-button btn btn-default btn-cancel"
- else
- .form-actions
+ .gl-mt-5
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
= link_to _('Cancel'), admin_group_path(@group), class: "gl-button btn btn-cancel"
diff --git a/app/views/admin/identities/_form.html.haml b/app/views/admin/identities/_form.html.haml
index ba7687db9c7..40c4d292e9d 100644
--- a/app/views/admin/identities/_form.html.haml
+++ b/app/views/admin/identities/_form.html.haml
@@ -1,5 +1,5 @@
= form_for [:admin, @user, @identity], html: { class: 'fieldset-form' } do |f|
- = form_errors(@identity)
+ = form_errors(@identity, pajamas_alert: true)
.form-group.row
.col-sm-2.col-form-label
diff --git a/app/views/admin/identities/index.html.haml b/app/views/admin/identities/index.html.haml
index b4dd92bf15c..2bab802b2c1 100644
--- a/app/views/admin/identities/index.html.haml
+++ b/app/views/admin/identities/index.html.haml
@@ -3,7 +3,6 @@
- page_title _("Identities"), @user.name, _("Users")
= render 'admin/users/head'
-= link_to _('New identity'), new_admin_user_identity_path, class: 'float-right gl-button btn-confirm'
- if @identities.present?
.table-holder
%table.table
diff --git a/app/views/admin/system_info/show.html.haml b/app/views/admin/system_info/show.html.haml
index 7a34972dfbf..049f3d61294 100644
--- a/app/views/admin/system_info/show.html.haml
+++ b/app/views/admin/system_info/show.html.haml
@@ -29,9 +29,9 @@
%h4.page-title.d-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
= sprite_icon('clock', size: 18, css_class: 'pod-icon gl-mr-3')
- = _('Uptime')
+ = _('System started')
.data
- %h2= distance_of_time_in_words_to_now(Rails.application.config.booted_at)
+ %h2= time_ago_with_tooltip(Rails.application.config.booted_at)
.col-sm
.bg-light.info-well.p-3
%h4.page-title.d-flex
diff --git a/app/views/admin/topics/_topic.html.haml b/app/views/admin/topics/_topic.html.haml
index 462943263df..869194a21f6 100644
--- a/app/views/admin/topics/_topic.html.haml
+++ b/app/views/admin/topics/_topic.html.haml
@@ -18,3 +18,4 @@
.controls.gl-flex-shrink-0.gl-ml-5
= link_to _('Edit'), edit_admin_topic_path(topic), id: "edit_#{dom_id(topic)}", class: 'btn gl-button btn-default'
+ = link_to _('Remove'), admin_topic_path(topic), aria: { label: _('Remove') }, data: { confirm: _("Are you sure you want to remove %{topic_name}?") % { topic_name: title }, confirm_btn_variant: 'danger' }, method: :delete, class: 'gl-button btn btn-danger'
diff --git a/app/views/admin/users/_access_levels.html.haml b/app/views/admin/users/_access_levels.html.haml
index cf951ae0265..b255354f2c1 100644
--- a/app/views/admin/users/_access_levels.html.haml
+++ b/app/views/admin/users/_access_levels.html.haml
@@ -1,52 +1,48 @@
-%fieldset
- %legend.gl-border-bottom-0
- = s_('AdminUsers|Access')
- .form-group.row
- .col-12
- = f.label :projects_limit
- = f.number_field :projects_limit, min: 0, max: Gitlab::Database::MAX_INT_VALUE, class: 'form-control gl-form-input'
-
- .form-group.row
- .col-12.gl-pt-0
- = f.label :can_create_group
- = f.gitlab_ui_checkbox_component :can_create_group, ''
-
- .form-group.row
- .col-12.gl-pt-0
- = f.label :access_level
- - editing_current_user = (current_user == @user)
-
- = f.gitlab_ui_radio_component :access_level, :regular,
- s_('AdminUsers|Regular'),
- radio_options: { disabled: editing_current_user },
- help_text: s_('AdminUsers|Regular users have access to their groups and projects.')
-
- = render_if_exists 'admin/users/auditor_access_level_radio', f: f, disabled: editing_current_user
-
- - help_text = s_('AdminUsers|The user has unlimited access to all groups, projects, users, and features.')
- - help_text += ' ' + s_('AdminUsers|You cannot remove your own administrator access.') if editing_current_user
- = f.gitlab_ui_radio_component :access_level, :admin,
- s_('AdminUsers|Administrator'),
- radio_options: { disabled: editing_current_user },
- help_text: help_text
-
-
- .form-group.row
- .col-12.gl-pt-0
- = f.label :external
- .hidden{ data: user_internal_regex_data }
- .col-12.gl-display-flex.gl-align-items-baseline
- = f.gitlab_ui_checkbox_component :external, s_('AdminUsers|External users cannot see internal or private projects unless access is explicitly granted. Also, external users cannot create projects, groups, or personal snippets.')
- %row.hidden#warning_external_automatically_set
- = gl_badge_tag s_('AdminUsers|Automatically marked as default internal user'), variant: :warning
-
- .form-group.row
- - @user.credit_card_validation || @user.build_credit_card_validation
- = f.fields_for :credit_card_validation do |ff|
- .col-12.gl-pt-0
- = ff.label s_('AdminUsers|Validate user account')
- .col-12.gl-display-flex.gl-align-items-baseline
- = ff.gitlab_ui_checkbox_component :credit_card_validated_at,
- s_('AdminUsers|User is validated and can use free CI minutes on shared runners.'),
- help_text: s_('AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user.'),
- checkbox_options: { checked: @user.credit_card_validated_at.present? }
+.gl-border-b.gl-pb-3.gl-mb-6
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = s_('AdminUsers|Access')
+ .col-lg-8
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :projects_limit, class: 'gl-display-block col-form-label'
+ = f.number_field :projects_limit, min: 0, max: Gitlab::Database::MAX_INT_VALUE, class: 'form-control gl-form-input'
+
+ .form-group.gl-form-group{ role: 'group' }
+ = f.gitlab_ui_checkbox_component :can_create_group, s_('AdminUsers|Can create group')
+
+ %fieldset.form-group.gl-form-group
+ %legend.col-form-label.col-form-label
+ = s_('AdminUsers|Access level')
+ - editing_current_user = (current_user == @user)
+
+ = f.gitlab_ui_radio_component :access_level, :regular,
+ s_('AdminUsers|Regular'),
+ radio_options: { disabled: editing_current_user },
+ help_text: s_('AdminUsers|Regular users have access to their groups and projects.')
+
+ = render_if_exists 'admin/users/auditor_access_level_radio', f: f, disabled: editing_current_user
+
+ - help_text = s_('AdminUsers|The user has unlimited access to all groups, projects, users, and features.')
+ - help_text += ' ' + s_('AdminUsers|You cannot remove your own administrator access.') if editing_current_user
+ = f.gitlab_ui_radio_component :access_level, :admin,
+ s_('AdminUsers|Administrator'),
+ radio_options: { disabled: editing_current_user },
+ help_text: help_text
+
+ .form-group.gl-form-group{ role: 'group' }
+ = f.gitlab_ui_checkbox_component :external,
+ s_('AdminUsers|External'),
+ help_text: s_('AdminUsers|External users cannot see internal or private projects unless access is explicitly granted. Also, external users cannot create projects, groups, or personal snippets.')
+ .hidden{ data: user_internal_regex_data }
+ .gl-display-flex.gl-align-items-baseline
+ %row.hidden#warning_external_automatically_set
+ = gl_badge_tag s_('AdminUsers|Automatically marked as default internal user'), variant: :warning
+
+ .form-group.gl-form-group{ role: 'group' }
+ - @user.credit_card_validation || @user.build_credit_card_validation
+ = f.fields_for :credit_card_validation do |ff|
+ = ff.gitlab_ui_checkbox_component :credit_card_validated_at,
+ s_('AdminUsers|Validate user account'),
+ help_text: s_('AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners.'),
+ checkbox_options: { checked: @user.credit_card_validated_at.present? }
diff --git a/app/views/admin/users/_admin_notes.html.haml b/app/views/admin/users/_admin_notes.html.haml
index 10f654e0f71..dce008afb26 100644
--- a/app/views/admin/users/_admin_notes.html.haml
+++ b/app/views/admin/users/_admin_notes.html.haml
@@ -1,6 +1,9 @@
-%fieldset
- %legend.gl-border-bottom-0= _('Admin notes')
- .form-group.row
- .col-12
- = f.label :note, s_('Admin|Note')
- = f.text_area :note, class: 'form-control gl-form-input gl-form-textarea'
+.gl-mb-3
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Admin notes')
+ .col-lg-8
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :note, s_('Admin|Note')
+ = f.text_area :note, class: 'form-control gl-form-input gl-form-textarea'
diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml
index 7995bc1b6f4..5ac15694922 100644
--- a/app/views/admin/users/_form.html.haml
+++ b/app/views/admin/users/_form.html.haml
@@ -2,41 +2,42 @@
= gitlab_ui_form_for [:admin, @user], html: { class: 'fieldset-form' } do |f|
= form_errors(@user, pajamas_alert: true)
- %fieldset
- %legend.gl-border-bottom-0= _('Account')
- .form-group.row
- .col-12
- = f.label "#{:name} (required)"
- = f.text_field :name, required: true, autocomplete: 'off', class: 'form-control gl-form-input'
- .form-group.row
- .col-12
- = f.label "#{:username} (required)"
- = f.text_field :username, required: true, autocomplete: 'off', autocorrect: 'off', autocapitalize: 'off', spellcheck: false, class: 'form-control gl-form-input'
- .form-group.row
- .col-12
- = f.label "#{:email} (required)"
- = f.text_field :email, required: true, autocomplete: 'off', class: 'form-control gl-form-input'
+ .gl-border-b.gl-pb-3.gl-mb-6
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Account')
+ .col-lg-8
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :name, _('Name'), class: 'gl-display-block col-form-label'
+ = f.text_field :name, required: true, autocomplete: 'off', class: 'form-control gl-form-input'
- - if @user.new_record?
- %fieldset
- %legend.gl-border-bottom-0= _('Password')
- .form-group.row
- .col-12
- %strong
- = _('Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in.').html_safe % { break: '<br />'.html_safe }
- - else
- %fieldset
- %legend.gl-border-bottom-0= _('Password')
- .form-group.row
- .col-12
- = f.label :password
- .col-12
- = f.password_field :password, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input'
- .form-group.row
- .col-12
- = f.label :password_confirmation
- .col-12
- = f.password_field :password_confirmation, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input'
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :username, _('Username'), class: 'gl-display-block col-form-label'
+ = f.text_field :username, required: true, autocomplete: 'off', autocorrect: 'off', autocapitalize: 'off', spellcheck: false, class: 'form-control gl-form-input'
+
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :email, _('Email'), class: 'gl-display-block col-form-label'
+ = f.text_field :email, required: true, autocomplete: 'off', class: 'form-control gl-form-input'
+
+ .gl-border-b.gl-pb-3.gl-mb-6
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Password')
+ .col-lg-8
+ - if @user.new_record?
+ = render Pajamas::AlertComponent.new(variant: :info, dismissible: false, alert_options: { class: 'gl-mb-5' }) do |c|
+ = c.body do
+ = s_('AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in.')
+ - else
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :password, _('Password'), class: 'gl-display-block col-form-label'
+ = f.password_field :password, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input js-password-complexity-validation'
+ = render_if_exists 'shared/password_requirements_list'
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :password_confirmation, _('Password confirmation'), class: 'gl-display-block col-form-label'
+ = f.password_field :password_confirmation, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input'
= render partial: 'access_levels', locals: { f: f }
@@ -44,30 +45,31 @@
= render_if_exists 'admin/users/limits', f: f
- %fieldset
- %legend.gl-border-bottom-0= _('Profile')
- .form-group.row
- .col-12
- = f.label :avatar
- .col-12
- = f.file_field :avatar
+ .gl-border-b.gl-pb-6.gl-mb-6
+ .row
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Profile')
+ .col-lg-8
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :avatar, s_('AdminUsers|Avatar'), class: 'gl-display-block col-form-label'
+ = f.file_field :avatar
+
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :skype, s_('AdminUsers|Skype'), class: 'gl-display-block col-form-label'
+ = f.text_field :skype, class: 'form-control gl-form-input'
+
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :linkedin, s_('AdminUsers|Linkedin'), class: 'gl-display-block col-form-label'
+ = f.text_field :linkedin, class: 'form-control gl-form-input'
+
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :twitter, _('Twitter'), class: 'gl-display-block col-form-label'
+ = f.text_field :twitter, class: 'form-control gl-form-input'
- .form-group.row
- .col-12
- = f.label :skype
- = f.text_field :skype, class: 'form-control gl-form-input'
- .form-group.row
- .col-12
- = f.label :linkedin
- = f.text_field :linkedin, class: 'form-control gl-form-input'
- .form-group.row
- .col-12
- = f.label :twitter
- = f.text_field :twitter, class: 'form-control gl-form-input'
- .form-group.row
- .col-12
- = f.label :website_url
- = f.text_field :website_url, class: 'form-control gl-form-input'
+ .form-group.gl-form-group{ role: 'group' }
+ = f.label :website_url, s_('AdminUsers|Website URL'), class: 'gl-display-block col-form-label'
+ = f.text_field :website_url, class: 'form-control gl-form-input'
= render 'admin/users/admin_notes', f: f
diff --git a/app/views/admin/users/_head.html.haml b/app/views/admin/users/_head.html.haml
index 529692df0b6..ed453b42725 100644
--- a/app/views/admin/users/_head.html.haml
+++ b/app/views/admin/users/_head.html.haml
@@ -27,15 +27,18 @@
= render_if_exists 'admin/users/gma_user_badge'
.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)
+ - if impersonation_enabled? && @user.can?(:log_in)
+ .gl-p-2
= 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)
- = render Pajamas::ButtonComponent.new(variant: :confirm, button_options: { class: 'js-confirm-modal-button', data: confirm_user_data(@user) }) do
+ - if can_force_email_confirmation?(@user)
+ .gl-p-2
+ = render Pajamas::ButtonComponent.new(variant: :default, button_options: { class: 'js-confirm-modal-button', data: confirm_user_data(@user) }) do
= _('Confirm user')
.gl-p-2
- #js-admin-user-actions{ data: admin_user_actions_data_attributes(@user) }
+ = link_to _('New identity'), new_admin_user_identity_path(@user), class: "btn btn-primary gl-button"
= gl_tabs_nav do
= gl_tab_link_to _("Account"), admin_user_path(@user)
= gl_tab_link_to _("Groups and projects"), projects_admin_user_path(@user)
diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml
index 2dbafb517be..8c77cb394ba 100644
--- a/app/views/admin/users/_users.html.haml
+++ b/app/views/admin/users/_users.html.haml
@@ -64,6 +64,6 @@
= gl_redirect_listbox_tag admin_users_sort_options(filter: params[:filter], search_query: params[:search_query]), @sort, data: { right: true }
#js-admin-users-app{ data: admin_users_data_attributes(@users) }
- = gl_loading_icon(size: 'lg', css_class: 'gl-my-7')
+ = render Pajamas::SpinnerComponent.new(size: :lg, class: 'gl-my-7')
= paginate_collection @users
diff --git a/app/views/clusters/clusters/_integrations.html.haml b/app/views/clusters/clusters/_integrations.html.haml
index 62ae551fee7..4a3062def8c 100644
--- a/app/views/clusters/clusters/_integrations.html.haml
+++ b/app/views/clusters/clusters/_integrations.html.haml
@@ -14,15 +14,3 @@
s_('ClusterIntegration|Enable Prometheus integration'),
help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
= prometheus_form.submit _('Save changes'), class: 'btn gl-button btn-confirm'
-
- - if Feature.enabled?(:monitor_logging, @project)
- .sub-section.form-group
- = gitlab_ui_form_for @elastic_stack_integration, as: :integration, namespace: :elastic_stack, url: @cluster.integrations_path, method: :post, html: { class: 'js-cluster-integrations-form' } do |elastic_stack_form|
- = elastic_stack_form.hidden_field :application_type
- .form-group.gl-form-group
- - help_text = s_('ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs.')
- - help_link = link_to(_('More information.'), help_page_path("user/clusters/integrations", anchor: "elastic-stack-cluster-integration"), target: '_blank', rel: 'noopener noreferrer')
- = elastic_stack_form.gitlab_ui_checkbox_component :enabled,
- s_('ClusterIntegration|Enable Elastic Stack integration'),
- help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
- = elastic_stack_form.submit _('Save changes'), class: 'btn gl-button btn-confirm'
diff --git a/app/views/clusters/clusters/_namespace.html.haml b/app/views/clusters/clusters/_namespace.html.haml
index cedece5ad93..572f2d6d9a2 100644
--- a/app/views/clusters/clusters/_namespace.html.haml
+++ b/app/views/clusters/clusters/_namespace.html.haml
@@ -1,5 +1,5 @@
- managed_namespace_help_text = s_('ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
-- non_managed_namespace_help_text = s_('ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals.')
+- non_managed_namespace_help_text = s_('ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals.')
- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer'
.js-namespace-prefixed
diff --git a/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml b/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml
index bed671832f3..3e0a8a4f88b 100644
--- a/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml
+++ b/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml
@@ -2,10 +2,11 @@
- help_path = local_assigns.fetch(:help_path)
- label = local_assigns.fetch(:label)
- last = local_assigns.fetch(:last, false)
-- classes = ["btn btn-confirm gl-button btn-confirm-secondary gl-flex-direction-column gl-w-half"]
+- classes = ["btn btn-confirm gl-button btn-confirm-secondary gl-flex-direction-column gl-flex-basis-0 gl-flex-grow-1 gl-min-w-0"]
- conditional_classes = [("gl-mr-5" unless last)]
= link_to help_path, class: classes + conditional_classes do
- .svg-content.gl-p-3= image_tag logo_path, alt: label, class: "gl-w-64 gl-h-64"
- %span
+ %span.gl-display-flex.gl-align-items-center.gl-m-3.gl-h-64
+ = image_tag logo_path, alt: label, class: "gl-w-15 gl-max-h-full gl-max-w-full"
+ %span.gl-white-space-normal
= label
diff --git a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml
index e4128ee22a4..7039ce57bd9 100644
--- a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml
+++ b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml
@@ -1,14 +1,18 @@
- gke_label = s_('ClusterIntegration|Google GKE')
- eks_label = s_('ClusterIntegration|Amazon EKS')
+- civo_label = s_('ClusterIntegration|Civo Kubernetes')
- create_cluster_label = s_('ClusterIntegration|Where do you want to create a cluster?')
-- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster')
-- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster')
+- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster.md')
+- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster.md')
+- civo_help_path = help_page_path('user/infrastructure/clusters/connect/new_civo_cluster.md')
-.gl-p-5
+.gl-py-5.gl-md-pl-5.gl-md-pr-5
%h4.gl-mb-5
= create_cluster_label
.gl-display-flex
= render partial: 'clusters/clusters/cloud_providers/cloud_provider_button',
locals: { label: eks_label, logo_path: 'illustrations/logos/amazon_eks.svg', help_path: eks_help_path }
= render partial: 'clusters/clusters/cloud_providers/cloud_provider_button',
+ locals: { label: civo_label, logo_path: 'illustrations/third-party-logos/civo.svg', help_path: civo_help_path }
+ = render partial: 'clusters/clusters/cloud_providers/cloud_provider_button',
locals: { label: gke_label, logo_path: 'illustrations/logos/google_gke.svg', help_path: gke_help_path, last: true }
diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml
index 7c948260d4b..ed6cecdcc3d 100644
--- a/app/views/dashboard/_activities.html.haml
+++ b/app/views/dashboard/_activities.html.haml
@@ -6,4 +6,4 @@
.content_list
.loading
- = gl_loading_icon(size: 'md')
+ = render Pajamas::SpinnerComponent.new(size: :md)
diff --git a/app/views/dashboard/projects/_blank_state_welcome.html.haml b/app/views/dashboard/projects/_blank_state_welcome.html.haml
index e0b8850357e..0658d548eab 100644
--- a/app/views/dashboard/projects/_blank_state_welcome.html.haml
+++ b/app/views/dashboard/projects/_blank_state_welcome.html.haml
@@ -39,7 +39,7 @@
%p
= _('Public projects are an easy way to allow everyone to have read-only access.')
- = link_to "https://docs.gitlab.com/", class: link_classes do
+ = link_to Gitlab::Saas::doc_url, class: link_classes do
.blank-state-icon
= custom_icon("lightbulb", size: 50)
.blank-state-body.gl-sm-pl-0.gl-pl-6
diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml
index c932b416b66..8d82116bf10 100644
--- a/app/views/dashboard/todos/_todo.html.haml
+++ b/app/views/dashboard/todos/_todo.html.haml
@@ -12,7 +12,7 @@
- if todo.author
= link_to_author(todo, self_added: todo.self_added?)
- else
- (removed)
+ = _('(removed)')
%span.title-item.action-name{ data: { qa_selector: "todo_action_name_content" } }
= todo_action_name(todo)
@@ -45,17 +45,17 @@
.todo-body
.todo-note.break-word
.md
- = first_line_in_markdown(todo, :body, 150, project: todo.project)
+ = first_line_in_markdown(todo, :body, 150, project: todo.project, group: todo.group)
.todo-actions.gl-ml-3
- if todo.pending?
= link_to dashboard_todo_path(todo), method: :delete, class: 'gl-button btn btn-default btn-loading d-flex align-items-center js-done-todo', data: { href: dashboard_todo_path(todo) } do
= gl_loading_icon(inline: true)
- Done
+ = _('Done')
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'gl-button btn btn-default btn-loading d-flex align-items-center js-undo-todo hidden', data: { href: restore_dashboard_todo_path(todo) } do
= gl_loading_icon(inline: true)
- Undo
+ = _('Undo')
- else
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'gl-button btn btn-default btn-loading d-flex align-items-center js-add-todo', data: { href: restore_dashboard_todo_path(todo) } do
= gl_loading_icon(inline: true)
- Add a to do
+ = _('Add a to do')
diff --git a/app/views/devise/passwords/edit.html.haml b/app/views/devise/passwords/edit.html.haml
index 56bd30fac73..498fb08969c 100644
--- a/app/views/devise/passwords/edit.html.haml
+++ b/app/views/devise/passwords/edit.html.haml
@@ -1,17 +1,18 @@
= render 'devise/shared/tab_single', tab_title: _('Change your password')
.login-box
.login-body
- = form_for(resource, as: resource_name, url: password_path(:user), html: { method: :put, class: 'gl-show-field-errors' }) do |f|
- .devise-errors
+ = form_for(resource, as: resource_name, url: password_path(:user), html: { method: :put, class: 'gl-show-field-errors gl-pt-5' }) do |f|
+ .devise-errors.gl-px-5
= render "devise/shared/error_messages", resource: resource
= f.hidden_field :reset_password_token
- .form-group
+ .form-group.gl-px-5
= f.label _('New password'), for: "user_password"
- = f.password_field :password, autocomplete: 'new-password', class: "form-control gl-form-input top", required: true, title: _('This field is required.'), data: { qa_selector: 'password_field'}
- .form-group
+ = f.password_field :password, autocomplete: 'new-password', class: "form-control gl-form-input top js-password-complexity-validation", required: true, title: _('This field is required.'), data: { qa_selector: 'password_field'}
+ = render_if_exists 'shared/password_requirements_list'
+ .form-group.gl-px-5
= f.label _('Confirm new password'), for: "user_password_confirmation"
= f.password_field :password_confirmation, autocomplete: 'new-password', class: "form-control gl-form-input bottom", title: _('This field is required.'), data: { qa_selector: 'password_confirmation_field' }, required: true
- .clearfix
+ .clearfix.gl-px-5.gl-pb-5
= f.submit _("Change your password"), class: "gl-button btn btn-confirm", data: { qa_selector: 'change_password_button' }
.clearfix.prepend-top-20
diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml
index 4cde24f4afa..d06043c1750 100644
--- a/app/views/devise/sessions/_new_ldap.html.haml
+++ b/app/views/devise/sessions/_new_ldap.html.haml
@@ -15,5 +15,5 @@
= check_box_tag :remember_me, '1', false, id: 'remember_me'
%span= _('Remember me')
- .submit-container.move-submit-down.gl-px-5
+ .submit-container.move-submit-down.gl-px-5.gl-pb-5
= submit_tag submit_message, class: "gl-button btn btn-confirm", data: { qa_selector: 'sign_in_button' }
diff --git a/app/views/devise/sessions/email_verification.haml b/app/views/devise/sessions/email_verification.haml
new file mode 100644
index 00000000000..6cafcb941b4
--- /dev/null
+++ b/app/views/devise/sessions/email_verification.haml
@@ -0,0 +1,19 @@
+%div
+ = render 'devise/shared/tab_single', tab_title: s_('IdentityVerification|Help us protect your account')
+ .login-box.gl-p-5
+ .login-body
+ = form_for(resource, as: resource_name, url: session_path(resource_name), method: :post, html: { class: 'gl-show-field-errors' }) do |f|
+ %p
+ = s_("IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}").html_safe % { email: "<strong>#{sanitize(obfuscated_email(resource.email))}</strong>".html_safe }
+ %div
+ = f.label :verification_token, s_('IdentityVerification|Verification code')
+ = f.text_field :verification_token, class: 'form-control gl-form-input', required: true, autofocus: true, autocomplete: 'off', title: s_('IdentityVerification|Please enter a valid code'), inputmode: 'numeric', maxlength: 6, pattern: '[0-9]{6}'
+ %p.gl-field-error.gl-mt-2
+ = resource.errors.full_messages.to_sentence
+ .gl-mt-5
+ = f.submit s_('IdentityVerification|Verify code'), class: 'gl-button btn btn-confirm'
+ - unless send_rate_limited?(resource)
+ = link_to s_('IdentityVerification|Resend code'), users_resend_verification_code_path, method: :post, class: 'form-control gl-button btn-link gl-mt-3 gl-mb-0'
+ %p.gl-p-5.gl-text-secondary
+ - support_link_start = '<a href="https://about.gitlab.com/support/" target="_blank" rel="noopener noreferrer">'.html_safe
+ = s_("IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}").html_safe % { link_start: support_link_start, link_end: '</a>'.html_safe }
diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml
index c669f3efec6..9a09f6bee38 100644
--- a/app/views/devise/sessions/new.html.haml
+++ b/app/views/devise/sessions/new.html.haml
@@ -1,7 +1,9 @@
- page_title _("Sign in")
- content_for :page_specific_javascripts do
+ = render "layouts/google_tag_manager_head"
= render "layouts/one_trust"
= render "layouts/bizible"
+= render "layouts/google_tag_manager_body"
#signin-container
- if any_form_based_providers_enabled?
diff --git a/app/views/devise/sessions/successful_verification.haml b/app/views/devise/sessions/successful_verification.haml
new file mode 100644
index 00000000000..8af80fbdceb
--- /dev/null
+++ b/app/views/devise/sessions/successful_verification.haml
@@ -0,0 +1,11 @@
+= content_for :meta_tags do
+ %meta{ 'http-equiv': 'refresh', content: "3; url=#{@redirect_url}" }
+.gl-text-center.gl-max-w-62.gl-mx-auto
+ .svg-content.svg-80
+ = image_tag 'illustrations/success-sm.svg'
+ %h2
+ = s_('IdentityVerification|Verification successful')
+ %p.gl-pt-2
+ - redirect_url_start = '<a href="%{url}"">'.html_safe % { url: @redirect_url }
+ - redirect_url_end = '</a>'.html_safe
+ = html_escape(s_("IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh.")) % { redirect_url_start: redirect_url_start, redirect_url_end: redirect_url_end }
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index 57135c6cdfc..1868cfa06e9 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -45,21 +45,24 @@
= f.label :email, class: 'label-bold'
= f.email_field :email,
value: @invite_email,
- class: 'form-control gl-form-input middle',
+ class: 'form-control gl-form-input middle js-validate-email',
data: { qa_selector: 'new_user_email_field' },
required: true,
title: _('Please provide a valid email address.')
%p.gl-field-hint.text-secondary= _('We recommend a work email address.')
+ -# This is used for providing entry to Jihu on email verification
+ = render_if_exists 'devise/shared/signup_email_additional_info'
.form-group.gl-mb-5#password-strength
= f.label :password, class: 'label-bold'
= f.password_field :password,
- class: 'form-control gl-form-input bottom',
+ class: 'form-control gl-form-input bottom js-password-complexity-validation',
data: { qa_selector: 'new_user_password_field' },
autocomplete: 'new-password',
required: true,
pattern: ".{#{@minimum_password_length},}",
title: s_('SignUp|Minimum length is %{minimum_password_length} characters.') % { minimum_password_length: @minimum_password_length }
%p.gl-field-hint.text-secondary= s_('SignUp|Minimum length is %{minimum_password_length} characters.') % { minimum_password_length: @minimum_password_length }
+ = render_if_exists 'shared/password_requirements_list'
= render_if_exists 'devise/shared/phone_verification', form: f
%div
- if show_recaptcha_sign_up?
diff --git a/app/views/errors/not_found.html.haml b/app/views/errors/not_found.html.haml
index 291adbc0ae8..54291cd9abc 100644
--- a/app/views/errors/not_found.html.haml
+++ b/app/views/errors/not_found.html.haml
@@ -11,5 +11,6 @@
= form_tag search_path, method: :get, class: 'form-inline-flex' do |f|
.field
= search_field_tag :search, '', placeholder: _('Search for projects, issues, etc.'), class: 'form-control'
- = button_tag _('Search'), class: 'gl-button btn btn-sm btn-success', name: nil, type: 'submit'
+ = render Pajamas::ButtonComponent.new(variant: :confirm, size: :small, type: :submit) do
+ = _('Search')
= render 'errors/footer'
diff --git a/app/views/errors/omniauth_error.html.haml b/app/views/errors/omniauth_error.html.haml
index e114e4609f8..3090c823677 100644
--- a/app/views/errors/omniauth_error.html.haml
+++ b/app/views/errors/omniauth_error.html.haml
@@ -2,14 +2,18 @@
.container
= render partial: "shared/errors/graphic_422", formats: :svg
- %h3 Sign-in using #{@provider} auth failed
+ %h3
+ = _('Sign-in using %{provider} auth failed') % { provider: @provider }
- %p.light.subtitle Sign-in failed because #{@error}.
+ %p.light.subtitle
+ = _('Sign-in failed because %{error}.') % { error: @error }
- %p Try logging in using your username or email. If you have forgotten your password, try recovering it
+ %p
+ = _('Try logging in using your username or email. If you have forgotten your password, try recovering it')
- = link_to "Sign in", new_session_path(:user), class: 'gl-button btn primary'
- = link_to "Recover password", new_password_path(:user), class: 'gl-button btn secondary'
+ = link_to _('Sign in'), new_session_path(:user), class: 'gl-button btn primary'
+ = link_to _('Recover password'), new_password_path(:user), class: 'gl-button btn secondary'
%hr
- %p.light If none of the options work, try contacting a GitLab administrator.
+ %p.light
+ = _('If none of the options work, try contacting a GitLab administrator.')
diff --git a/app/views/groups/_activities.html.haml b/app/views/groups/_activities.html.haml
index 614d9610f31..757c0a836f3 100644
--- a/app/views/groups/_activities.html.haml
+++ b/app/views/groups/_activities.html.haml
@@ -6,4 +6,4 @@
.content_list
.loading
- = gl_loading_icon(size: 'md')
+ = render Pajamas::SpinnerComponent.new(size: :md)
diff --git a/app/views/groups/_group_admin_settings.html.haml b/app/views/groups/_group_admin_settings.html.haml
index 0a170ebdb24..687a1fb32bf 100644
--- a/app/views/groups/_group_admin_settings.html.haml
+++ b/app/views/groups/_group_admin_settings.html.haml
@@ -1,34 +1,29 @@
-.form-group.row
- .col-sm-2.col-form-label.pt-0
- = f.label :lfs_enabled, _('Large File Storage')
- .col-sm-10
- = f.gitlab_ui_checkbox_component :lfs_enabled, checkbox_options: { checked: @group.lfs_enabled? } do |c|
- = c.label do
- = _('Allow projects within this group to use Git LFS')
- = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index'), class: 'gl-ml-2'
- = c.help_text do
- = _('This setting can be overridden in each project.')
-.form-group.row
- .col-sm-2.col-form-label
- = f.label s_('ProjectCreationLevel|Allowed to create projects')
- .col-sm-10
- = f.select :project_creation_level, options_for_select(::Gitlab::Access.project_creation_options, @group.project_creation_level), {}, class: 'form-control'
+%fieldset.form-group.gl-form-group
+ %legend.col-form-label.col-form-label
+ = _('Large File Storage')
+ = f.gitlab_ui_checkbox_component :lfs_enabled, checkbox_options: { checked: @group.lfs_enabled? } do |c|
+ = c.label do
+ = _('Projects in this group can use Git LFS')
+ = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index'), class: 'gl-ml-2'
+ = c.help_text do
+ = _('This setting can be overridden in each project.')
+.form-group.gl-form-group{ role: 'group' }
+ = f.label s_('ProjectCreationLevel|Allowed to create projects'), class: 'gl-display-block col-form-label'
+ = f.select :project_creation_level, options_for_select(::Gitlab::Access.project_creation_options, @group.project_creation_level), {}, class: 'gl-form-select custom-select'
-.form-group.row
- .col-sm-2.col-form-label
- = f.label s_('SubgroupCreationlevel|Allowed to create subgroups')
- .col-sm-10
- = f.select :subgroup_creation_level, options_for_select(::Gitlab::Access.subgroup_creation_options, @group.subgroup_creation_level), {}, class: 'form-control'
+.form-group.gl-form-group{ role: 'group' }
+ = f.label s_('SubgroupCreationlevel|Allowed to create subgroups'), class: 'gl-display-block col-form-label'
+ = f.select :subgroup_creation_level, options_for_select(::Gitlab::Access.subgroup_creation_options, @group.subgroup_creation_level), {}, class: 'gl-form-select custom-select'
-.form-group.row
- .col-sm-2.col-form-label.pt-0
- = f.label :require_two_factor_authentication, _('Two-factor authentication')
- .col-sm-10
- - label = _("Require all users in this group to set up two-factor authentication")
- - help_link = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication', anchor: 'enforce-2fa-for-all-users-in-a-group'), class: 'gl-ml-2'
- = f.gitlab_ui_checkbox_component :require_two_factor_authentication, '%{label}%{help_link}'.html_safe % { label: label, help_link: help_link }
-.form-group.row
- .offset-sm-2.col-sm-10
- .form-check
- = f.text_field :two_factor_grace_period, class: 'form-control'
- .form-text.text-muted= _("Time (in hours) that users are allowed to skip forced configuration of two-factor authentication.")
+%fieldset.form-group.gl-form-group
+ %legend.col-form-label.col-form-label
+ = _('Two-factor authentication')
+ - label = _("All users in this group must set up two-factor authentication")
+ - help_link = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication', anchor: 'enforce-2fa-for-all-users-in-a-group'), class: 'gl-ml-2'
+ = f.gitlab_ui_checkbox_component :require_two_factor_authentication, '%{label}%{help_link}'.html_safe % { label: label, help_link: help_link }
+
+.form-group.gl-form-group{ role: 'group' }
+ = f.label :two_factor_grace_period, _('Two-factor authentication grace period'), class: 'gl-display-block col-form-label'
+ = f.text_field :two_factor_grace_period, class: 'form-control gl-form-input gl-form-input-sm'
+ %small.form-text.text-gl-muted
+ = _("Time (in hours) that users are allowed to skip forced configuration of two-factor authentication.")
diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml
index 654ee70dbee..a9234753aa2 100644
--- a/app/views/groups/_import_group_from_another_instance_panel.html.haml
+++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml
@@ -1,4 +1,4 @@
-= form_with url: configure_import_bulk_imports_path, class: 'group-form gl-show-field-errors' do |f|
+= form_with url: configure_import_bulk_imports_path(namespace_id: params[:parent_id]), class: 'group-form gl-show-field-errors' do |f|
.gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5
.gl-display-flex.gl-align-items-center
%h4.gl-display-flex
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 04170c30a20..022777eea27 100644
--- a/app/views/groups/_import_group_from_file_panel.html.haml
+++ b/app/views/groups/_import_group_from_file_panel.html.haml
@@ -2,46 +2,18 @@
- group_path = root_url
- group_path << parent.full_path + '/' if parent
-= form_with url: import_gitlab_group_path, class: 'group-form gl-show-field-errors', multipart: true do |f|
+= form_for '', url: import_gitlab_group_path, namespace: 'import_group', class: 'group-form gl-show-field-errors', multipart: true do |f|
.gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5
%h4
= _('Import group from file')
= render Pajamas::AlertComponent.new(variant: :warning,
+ alert_options: { class: 'gl-mb-5' },
dismissible: false) do |c|
= c.body do
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index.md') }
- link_end = '</a>'.html_safe
= s_('GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end }
-
- .form-group.gl-display-flex.gl-flex-direction-column.gl-mt-5
- = f.label :name, _('New group name'), for: 'import_group_name'
- = f.text_field :name, placeholder: s_('GroupsNew|My Awesome Group'), class: 'js-autofill-group-name gl-form-input col-xs-12 col-sm-8',
- required: true,
- title: _('Please fill in a descriptive name for your group.'),
- autofocus: true,
- id: 'import_group_name'
-
- .form-group.gl-display-flex.gl-flex-direction-column
- = f.label :import_group_path, _('New group URL'), for: 'import_group_path'
- .input-group.gl-field-error-anchor.col-xs-12.col-sm-8.gl-p-0
- .group-root-path.input-group-prepend.has-tooltip{ title: group_path, :'data-placement' => 'bottom' }
- .input-group-text
- %span
- = root_url
- - if parent
- %strong= parent.full_path + '/'
- = f.hidden_field :parent_id, value: parent&.id
- = f.text_field :path, placeholder: 'my-awesome-group', class: 'form-control js-validate-group-path js-autofill-group-path',
- id: 'import_group_path',
- required: true,
- pattern: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS,
- title: group_url_error_message,
- maxlength: ::Namespace::URL_MAX_LENGTH,
- "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. 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...')
+ = render 'shared/groups/group_name_and_path_fields', f: f
.form-group
= f.label :file, s_('GroupsNew|Upload file')
.gl-font-weight-normal
diff --git a/app/views/groups/_new_group_fields.html.haml b/app/views/groups/_new_group_fields.html.haml
index 83211505f36..0527d38159b 100644
--- a/app/views/groups/_new_group_fields.html.haml
+++ b/app/views/groups/_new_group_fields.html.haml
@@ -2,12 +2,12 @@
= render 'shared/group_form', f: f, autofocus: true
.row
- .form-group.col-sm-12.gl-mb-0
+ .form-group.gl-form-group.col-sm-12
%label.label-bold
= _('Visibility level')
%p
= _('Who will be able to see this group?')
- = link_to _('View the documentation'), help_page_path("public_access/public_access"), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('View the documentation'), help_page_path("user/public_access"), target: '_blank', rel: 'noopener noreferrer'
= render 'shared/visibility_level', f: f, visibility_level: default_group_visibility, can_change_visibility_level: true, form_model: @group, with_label: false
- if Gitlab.config.mattermost.enabled
diff --git a/app/views/groups/_shared_projects.html.haml b/app/views/groups/_shared_projects.html.haml
index ef6410ad439..6063d160fab 100644
--- a/app/views/groups/_shared_projects.html.haml
+++ b/app/views/groups/_shared_projects.html.haml
@@ -3,5 +3,5 @@
%p= _("There are no projects shared with this group yet")
%ul.content-list{ data: { hide_projects: 'false', group_id: group.id, path: group_path(group) } }
- .js-groups-list-holder
+ .js-groups-list-holder{ data: { current_group_visibility: group.visibility } }
= gl_loading_icon
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index 635a74d8179..d9fef8940eb 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -7,18 +7,16 @@
.col-lg-12
.gl-display-flex.gl-flex-wrap
- if can_admin_group_member?(@group)
- .gl-w-half.gl-xs-w-full
- %h4
- = _('Group members')
- %p
- = group_member_header_subtext(@group)
- .gl-w-half.gl-xs-w-full
- .gl-display-flex.gl-flex-wrap.gl-justify-content-end.gl-mb-3
- .js-invite-group-trigger{ data: { classes: 'gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite a group') } }
- .js-invite-members-trigger{ data: { variant: 'confirm',
- classes: 'gl-mt-3 gl-sm-w-auto gl-w-full gl-sm-ml-3',
- trigger_source: 'group-members-page',
- display_text: _('Invite members') } }
+ %h4
+ = _('Group members')
+ %p.gl-w-full.order-md-1
+ = group_member_header_subtext(@group)
+ .gl-display-flex.gl-flex-wrap.gl-align-items-flex-start.gl-ml-auto.gl-md-w-auto.gl-w-full.gl-mt-3
+ .js-invite-group-trigger{ data: { classes: 'gl-md-w-auto gl-w-full', display_text: _('Invite a group') } }
+ .js-invite-members-trigger{ data: { variant: 'confirm',
+ classes: 'gl-md-w-auto gl-w-full gl-md-ml-3 gl-md-mt-0 gl-mt-3',
+ trigger_source: 'group-members-page',
+ display_text: _('Invite members') } }
= render 'groups/invite_groups_modal', group: @group
= render 'groups/invite_members_modal', group: @group
@@ -28,6 +26,7 @@
members: @members,
invited: @invited_members,
access_requests: @requesters,
+ banned: @banned || [],
include_relations: @include_relations,
search: params[:search_groups]).to_json } }
= gl_loading_icon(css_class: 'gl-my-5', size: 'md')
diff --git a/app/views/groups/harbor/repositories/index.html.haml b/app/views/groups/harbor/repositories/index.html.haml
index 6a1e66520b5..a8a52b2aba7 100644
--- a/app/views/groups/harbor/repositories/index.html.haml
+++ b/app/views/groups/harbor/repositories/index.html.haml
@@ -1,7 +1,7 @@
- page_title _("Harbor Registry")
- @content_class = "limit-container-width" unless fluid_layout
-#js-harbor-registry-list-group{ data: { endpoint: group_harbor_registries_path(@group),
+#js-harbor-registry-list-group{ data: { endpoint: group_harbor_repositories_path(@group),
"no_containers_image" => image_path('illustrations/docker-empty-state.svg'),
"containers_error_image" => image_path('illustrations/docker-error-state.svg'),
"repository_url" => 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml
index b33d1443706..33fcda6129c 100644
--- a/app/views/groups/merge_requests.html.haml
+++ b/app/views/groups/merge_requests.html.haml
@@ -3,6 +3,8 @@
- page_title _("Merge requests")
- if issuables_count_for_state(:merge_requests, :all) == 0
+ = render 'shared/issuable/search_bar', type: :merge_requests
+
= render 'shared/empty_states/merge_requests', project_select_button: true
- else
.top-area
diff --git a/app/views/groups/runners/show.html.haml b/app/views/groups/runners/show.html.haml
index 5a9d2ca858e..65e797a2e82 100644
--- a/app/views/groups/runners/show.html.haml
+++ b/app/views/groups/runners/show.html.haml
@@ -1,6 +1,10 @@
- add_to_breadcrumbs _('Runners'), group_runners_path(@group)
-- if Feature.enabled?(:group_runner_view_ui)
- #js-group-runner-show{ data: {runner_id: @runner.id, runners_path: group_runners_path(@group)} }
+- if Feature.enabled?(:group_runner_view_ui, @group)
+ - title = "##{@runner.id} (#{@runner.short_sha})"
+ - breadcrumb_title title
+ - page_title title
+
+ #js-group-runner-show{ data: {runner_id: @runner.id, runners_path: group_runners_path(@group), edit_group_runner_path: edit_group_runner_path(@group, @runner)} }
- else
= render 'shared/runners/runner_details', runner: @runner
diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml
index ad0780e869c..527791dfc04 100644
--- a/app/views/groups/settings/_general.html.haml
+++ b/app/views/groups/settings/_general.html.haml
@@ -1,6 +1,6 @@
-= form_for @group, html: { multipart: true, class: 'gl-show-field-errors js-general-settings-form' }, authenticity_token: true do |f|
+= gitlab_ui_form_for @group, html: { multipart: true, class: 'gl-show-field-errors js-general-settings-form' }, authenticity_token: true do |f|
%input{ type: 'hidden', name: 'update_section', value: 'js-general-settings' }
- = form_errors(@group)
+ = form_errors(@group, pajamas_alert: true)
%fieldset
.row
@@ -30,6 +30,6 @@
- if @group.avatar?
%hr
= link_to s_('Groups|Remove avatar'), group_avatar_path(@group.to_param), aria: { label: s_('Groups|Remove avatar') }, data: { confirm: s_('Groups|Avatar will be removed. Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :delete, class: 'gl-button btn btn-danger-secondary'
-
- = render 'shared/visibility_level', f: f, visibility_level: @group.visibility_level, can_change_visibility_level: can_change_group_visibility_level?(@group), form_model: @group
- = f.submit s_('Groups|Save changes'), class: 'btn gl-button btn-confirm mt-4 js-dirty-submit', data: { qa_selector: 'save_name_visibility_settings_button' }
+ .form-group.gl-form-group
+ = render 'shared/visibility_level', f: f, visibility_level: @group.visibility_level, can_change_visibility_level: can_change_group_visibility_level?(@group), form_model: @group
+ = f.submit s_('Groups|Save changes'), class: 'btn gl-button btn-confirm js-dirty-submit', data: { qa_selector: 'save_name_visibility_settings_button' }
diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml
index 319af7be22e..a60ab43f566 100644
--- a/app/views/groups/settings/_permissions.html.haml
+++ b/app/views/groups/settings/_permissions.html.haml
@@ -1,33 +1,33 @@
= gitlab_ui_form_for @group, html: { multipart: true, class: 'gl-show-field-errors js-general-permissions-form' }, authenticity_token: true do |f|
%input{ type: 'hidden', name: 'update_section', value: 'js-permissions-settings' }
- = form_errors(@group)
+ = form_errors(@group, pajamas_alert: true)
%fieldset
%h5= _('Permissions')
- if @group.root?
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :prevent_sharing_groups_outside_hierarchy,
- s_('GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups').html_safe % { group: link_to_group(@group) },
+ s_('GroupSettings|Members cannot invite groups outside of %{group} and its subgroups').html_safe % { group: link_to_group(@group) },
help_text: prevent_sharing_groups_outside_hierarchy_help_text(@group),
checkbox_options: { disabled: !can_change_prevent_sharing_groups_outside_hierarchy?(@group) }
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :share_with_group_lock,
- s_('GroupSettings|Prevent sharing a project within %{group} with other groups').html_safe % { group: link_to_group(@group) },
+ s_('GroupSettings|Projects in %{group} cannot be shared with other groups').html_safe % { group: link_to_group(@group) },
checkbox_options: { disabled: !can_change_share_with_group_lock?(@group) },
help_text: share_with_group_lock_help_text(@group)
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :emails_disabled,
- s_('GroupSettings|Disable email notifications'),
+ s_('GroupSettings|Email notifications are disabled'),
checkbox_options: { checked: @group.emails_disabled?, disabled: !can_disable_group_emails?(@group) },
help_text: s_('GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects.')
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :mentions_disabled,
- s_('GroupSettings|Disable group mentions'),
+ s_('GroupSettings|Group mentions are disabled'),
checkbox_options: { checked: @group.mentions_disabled? },
- help_text: s_('GroupSettings|Prevents group members from being notified if the group is mentioned.')
+ help_text: s_('GroupSettings|Group members are not notified if the group is mentioned.')
= render 'groups/settings/resource_access_token_creation', f: f, group: @group
= render_if_exists 'groups/settings/delayed_project_removal', f: f, group: @group
@@ -48,8 +48,8 @@
%h5= _('Customer relations')
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :crm_enabled,
- s_('GroupSettings|Enable customer relations'),
+ s_('GroupSettings|Customer relations is enabled'),
checkbox_options: { checked: @group.crm_enabled? },
- help_text: s_('GroupSettings|Allows creating organizations and contacts and associating them with issues.')
+ help_text: s_('GroupSettings|Organizations and contacts can be created and associated with issues.')
= f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mt-3 js-dirty-submit', data: { qa_selector: 'save_permissions_changes_button' }
diff --git a/app/views/groups/settings/_project_creation_level.html.haml b/app/views/groups/settings/_project_creation_level.html.haml
index 36b714535d2..ef535b8a21c 100644
--- a/app/views/groups/settings/_project_creation_level.html.haml
+++ b/app/views/groups/settings/_project_creation_level.html.haml
@@ -1,3 +1,3 @@
.form-group
- = f.label s_('ProjectCreationLevel|Allowed to create projects'), class: 'label-bold'
+ = f.label s_('ProjectCreationLevel|Roles allowed to create projects'), class: 'label-bold'
= f.select :project_creation_level, options_for_select(::Gitlab::Access.project_creation_options, group.project_creation_level), {}, class: 'form-control', data: { qa_selector: 'project_creation_level_dropdown' }
diff --git a/app/views/groups/settings/_resource_access_token_creation.html.haml b/app/views/groups/settings/_resource_access_token_creation.html.haml
index 160f8ae1e07..d304dba3250 100644
--- a/app/views/groups/settings/_resource_access_token_creation.html.haml
+++ b/app/views/groups/settings/_resource_access_token_creation.html.haml
@@ -6,6 +6,5 @@
- link_start_project = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: project_access_tokens_link }
- link_start_group = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: group_access_tokens_link }
= f.gitlab_ui_checkbox_component :resource_access_token_creation_allowed,
- s_('GroupSettings|Allow project and group access token creation'),
- checkbox_options: { checked: group.namespace_settings.resource_access_token_creation_allowed?, data: { qa_selector: 'resource_access_token_creation_allowed_checkbox' } },
- help_text: s_('GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group.').html_safe % { link_start_project: link_start_project, link_start_group: link_start_group, link_end: '</a>'.html_safe }
+ s_('GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group').html_safe % { link_start_project: link_start_project, link_start_group: link_start_group, link_end: '</a>'.html_safe },
+ checkbox_options: { checked: group.namespace_settings.resource_access_token_creation_allowed?, data: { qa_selector: 'resource_access_token_creation_allowed_checkbox' } }
diff --git a/app/views/groups/settings/_subgroup_creation_level.html.haml b/app/views/groups/settings/_subgroup_creation_level.html.haml
index f36ad192bad..d92610367ae 100644
--- a/app/views/groups/settings/_subgroup_creation_level.html.haml
+++ b/app/views/groups/settings/_subgroup_creation_level.html.haml
@@ -1,3 +1,3 @@
.form-group
- = f.label s_('SubgroupCreationLevel|Allowed to create subgroups'), class: 'label-bold'
+ = f.label s_('SubgroupCreationLevel|Roles allowed to create subgroups'), class: 'label-bold'
= f.select :subgroup_creation_level, options_for_select(::Gitlab::Access.subgroup_creation_options, group.subgroup_creation_level), {}, class: 'form-control'
diff --git a/app/views/groups/settings/_transfer.html.haml b/app/views/groups/settings/_transfer.html.haml
index e6c88977cb1..7fe5a7a665b 100644
--- a/app/views/groups/settings/_transfer.html.haml
+++ b/app/views/groups/settings/_transfer.html.haml
@@ -6,7 +6,7 @@
%p= _('Transfer group to another parent group.')
= form_for group, url: transfer_group_path(group), method: :put, html: { id: form_id, class: 'js-group-transfer-form' } do |f|
%ul
- - learn_more_link_start = '<a href="https://docs.gitlab.com/ee/user/project/index.html#redirects-when-changing-repository-paths" target="_blank" rel="noopener noreferrer">'.html_safe
+ - learn_more_link_start = '<a href="https://docs.gitlab.com/ee/user/project/repository/index.html#what-happens-when-a-repository-path-changes" target="_blank" rel="noopener noreferrer">'.html_safe
- warning_text = s_("GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}") % { learn_more_link_start: learn_more_link_start, learn_more_link_end: '</a>'.html_safe }
%li= warning_text.html_safe
%li= s_('GroupSettings|You can only transfer the group to a group you manage.')
diff --git a/app/views/groups/settings/_two_factor_auth.html.haml b/app/views/groups/settings/_two_factor_auth.html.haml
index f86bcb24e63..03813f6f8a2 100644
--- a/app/views/groups/settings/_two_factor_auth.html.haml
+++ b/app/views/groups/settings/_two_factor_auth.html.haml
@@ -8,14 +8,14 @@
.form-group
= f.gitlab_ui_checkbox_component :require_two_factor_authentication,
- _('Require all users in this group to set up two-factor authentication'),
+ _('All users in this group must set up two-factor authentication'),
checkbox_options: { data: { qa_selector: 'require_2fa_checkbox' } }
.form-group
- = f.label :two_factor_grace_period, _('Time before enforced')
+ = f.label :two_factor_grace_period, _('Delay 2FA enforcement (hours)')
= f.text_field :two_factor_grace_period, class: 'form-control form-control-sm w-auto gl-form-input gl-mb-3'
- .form-text.text-muted= _('Time (in hours) that users are allowed to skip forced configuration of two-factor authentication.')
+ .form-text.text-muted= _("The maximum amount of time users have to set up two-factor authentication before it's enforced.")
- unless group.has_parent?
.form-group
= f.gitlab_ui_checkbox_component :allow_mfa_for_subgroups,
- _('Allow subgroups to set up their own two-factor authentication rules'),
+ _('Subgroups can set up their own two-factor authentication rules'),
checkbox_options: { checked: group.namespace_settings&.allow_mfa_for_subgroups }
diff --git a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml
index 86c0a8d0c52..c294df5ac62 100644
--- a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml
+++ b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for group, url: update_auto_devops_group_settings_ci_cd_path(group), method: :patch do |f|
- = form_errors(group)
+ = form_errors(group, pajamas_alert: true)
%fieldset
.form-group
.card.auto-devops-card
diff --git a/app/views/groups/settings/ci_cd/_form.html.haml b/app/views/groups/settings/ci_cd/_form.html.haml
index b6f70879d17..59c67197f81 100644
--- a/app/views/groups/settings/ci_cd/_form.html.haml
+++ b/app/views/groups/settings/ci_cd/_form.html.haml
@@ -1,7 +1,6 @@
.row.gl-mt-3
.col-lg-12
= form_for group, url: group_settings_ci_cd_path(group, anchor: 'js-general-pipeline-settings') do |f|
- = form_errors(group)
%fieldset.builds-feature
.form-group
= f.label :max_artifacts_size, _('Maximum artifacts size'), class: 'label-bold'
diff --git a/app/views/groups/settings/packages_and_registries/show.html.haml b/app/views/groups/settings/packages_and_registries/show.html.haml
index c4ce76c43ec..888419e463a 100644
--- a/app/views/groups/settings/packages_and_registries/show.html.haml
+++ b/app/views/groups/settings/packages_and_registries/show.html.haml
@@ -2,6 +2,5 @@
- page_title _('Packages & Registries')
- @content_class = 'limit-container-width' unless fluid_layout
-%section#js-packages-and-registries-settings{ data: { default_expanded: expanded_by_default?.to_s,
- group_path: @group.full_path,
+%section#js-packages-and-registries-settings{ data: { group_path: @group.full_path,
group_dependency_proxy_path: group_dependency_proxy_path(@group) } }
diff --git a/app/views/groups/settings/repository/_default_branch.html.haml b/app/views/groups/settings/repository/_default_branch.html.haml
index 844a5f890a4..cae33820a05 100644
--- a/app/views/groups/settings/repository/_default_branch.html.haml
+++ b/app/views/groups/settings/repository/_default_branch.html.haml
@@ -8,7 +8,7 @@
= s_('GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group.')
.settings-content
= gitlab_ui_form_for @group, url: group_path(@group, anchor: 'js-default-branch-name'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@group)
+ = form_errors(@group, pajamas_alert: true)
- fallback_branch_name = "<code>#{Gitlab::DefaultBranch.value(object: @group)}</code>"
%fieldset
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index 3614d854036..d8da77dc5cc 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -3,8 +3,8 @@
- @skip_current_level_breadcrumb = true
- add_page_specific_style 'page_bundles/group'
-- if show_thanks_for_purchase_banner?
- = render_if_exists 'shared/thanks_for_purchase_banner', plan_title: plan_title, quantity: params[:purchased_quantity].to_i
+- if show_thanks_for_purchase_alert?
+ = render_if_exists 'shared/thanks_for_purchase_alert', plan_title: plan_title, quantity: params[:purchased_quantity].to_i
= render_if_exists 'shared/qrtly_reconciliation_alert', group: @group
= render_if_exists 'shared/free_user_cap_alert', source: @group
@@ -25,7 +25,7 @@
= render partial: 'flash_messages'
-= render_if_exists 'trials/banner', namespace: @group
+= render_if_exists 'trials/alert', namespace: @group
= render 'groups/home_panel'
diff --git a/app/views/import/bitbucket/status.html.haml b/app/views/import/bitbucket/status.html.haml
index e69ca4663b4..b4b73e9e790 100644
--- a/app/views/import/bitbucket/status.html.haml
+++ b/app/views/import/bitbucket/status.html.haml
@@ -6,4 +6,4 @@
= sprite_icon('bitbucket', css_class: 'gl-mr-2')
= _('Import projects from Bitbucket')
-= render 'import/githubish_status', provider: 'bitbucket'
+= render 'import/githubish_status', provider: 'bitbucket', default_namespace: @namespace
diff --git a/app/views/import/bitbucket_server/new.html.haml b/app/views/import/bitbucket_server/new.html.haml
index 0d87cf66814..292dd9d071c 100644
--- a/app/views/import/bitbucket_server/new.html.haml
+++ b/app/views/import/bitbucket_server/new.html.haml
@@ -10,7 +10,7 @@
%p
= _('Enter in your Bitbucket Server URL and personal access token below')
-= form_tag configure_import_bitbucket_server_path, method: :post do
+= form_tag configure_import_bitbucket_server_path(namespace_id: params[:namespace_id]), method: :post do
.form-group.row
= label_tag :bitbucket_server_url, 'Bitbucket Server URL', class: 'col-form-label col-md-2'
.col-md-4
diff --git a/app/views/import/bitbucket_server/status.html.haml b/app/views/import/bitbucket_server/status.html.haml
index 05b42767668..7e0c7b3dd74 100644
--- a/app/views/import/bitbucket_server/status.html.haml
+++ b/app/views/import/bitbucket_server/status.html.haml
@@ -5,4 +5,4 @@
= sprite_icon('bitbucket', css_class: 'gl-mr-2')
= _('Import projects from Bitbucket Server')
-= render 'import/githubish_status', provider: 'bitbucket_server', paginatable: true, extra_data: { reconfigure_path: configure_import_bitbucket_server_path }
+= render 'import/githubish_status', provider: 'bitbucket_server', paginatable: true, default_namespace: @namespace, extra_data: { reconfigure_path: configure_import_bitbucket_server_path }
diff --git a/app/views/import/bulk_imports/status.html.haml b/app/views/import/bulk_imports/status.html.haml
index 71866bab30b..1c8de23f28f 100644
--- a/app/views/import/bulk_imports/status.html.haml
+++ b/app/views/import/bulk_imports/status.html.haml
@@ -4,6 +4,7 @@
#import-groups-mount-element{ data: { status_path: status_import_bulk_imports_path(format: :json),
available_namespaces_path: import_available_namespaces_path(format: :json),
+ default_target_namespace: @namespace&.id,
create_bulk_import_path: import_bulk_imports_path(format: :json),
jobs_path: realtime_changes_import_bulk_imports_path(format: :json),
source_url: @source_url,
diff --git a/app/views/import/fogbugz/new.html.haml b/app/views/import/fogbugz/new.html.haml
index b74262f2567..bd0e4b51a63 100644
--- a/app/views/import/fogbugz/new.html.haml
+++ b/app/views/import/fogbugz/new.html.haml
@@ -8,7 +8,7 @@
= _('Import projects from FogBugz')
%hr
-= form_tag callback_import_fogbugz_path do
+= form_tag callback_import_fogbugz_path(namespace_id: params[:namespace_id]) do
%p
= _("To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import.")
.form-group.row
diff --git a/app/views/import/fogbugz/new_user_map.html.haml b/app/views/import/fogbugz/new_user_map.html.haml
index 5caee78b9c4..28836055e0e 100644
--- a/app/views/import/fogbugz/new_user_map.html.haml
+++ b/app/views/import/fogbugz/new_user_map.html.haml
@@ -8,7 +8,7 @@
= _('Import projects from FogBugz')
%hr
-= form_tag create_user_map_import_fogbugz_path do
+= form_tag create_user_map_import_fogbugz_path(namespace_id: params[:namespace_id]) do
%p
= _("Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import.")
%p
diff --git a/app/views/import/fogbugz/status.html.haml b/app/views/import/fogbugz/status.html.haml
index 3e303d3163d..fb05e8e9724 100644
--- a/app/views/import/fogbugz/status.html.haml
+++ b/app/views/import/fogbugz/status.html.haml
@@ -8,4 +8,4 @@
- link_to_customize = link_to('customize', new_user_map_import_fogbugz_path)
= _('Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab.').html_safe % { link_to_customize: link_to_customize }
%hr
-= render 'import/githubish_status', provider: 'fogbugz', filterable: false
+= render 'import/githubish_status', provider: 'fogbugz', filterable: false, default_namespace: @namespace
diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml
index 13aaa41de9b..d2d49266350 100644
--- a/app/views/import/gitlab/status.html.haml
+++ b/app/views/import/gitlab/status.html.haml
@@ -3,4 +3,4 @@
= sprite_icon('heart', css_class: 'gl-vertical-align-middle')
= _('Import projects from GitLab.com')
-= render 'import/githubish_status', provider: 'gitlab', filterable: false
+= render 'import/githubish_status', provider: 'gitlab', filterable: false, default_namespace: @namespace
diff --git a/app/views/layouts/_bizible.html.haml b/app/views/layouts/_bizible.html.haml
index a2b28c138e5..8d173a7ab61 100644
--- a/app/views/layouts/_bizible.html.haml
+++ b/app/views/layouts/_bizible.html.haml
@@ -1,6 +1,5 @@
- if bizible_enabled?
<!-- Bizible -->
- = javascript_include_tag "https://cdn.bizible.com/scripts/bizible.js"
= javascript_tag nonce: content_security_policy_nonce do
:plain
const bizibleScript = document.createElement('script');
diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml
index 21cccb86398..ab4b3cf6afd 100644
--- a/app/views/layouts/_flash.html.haml
+++ b/app/views/layouts/_flash.html.haml
@@ -1,6 +1,7 @@
-# We currently only support `alert`, `notice`, `success`, 'toast', and 'raw'
- icons = {'alert' => 'error', 'notice' => 'information-o', 'success' => 'check-circle'}
- type_to_variant = {'alert' => 'danger', 'notice' => 'info', 'success' => 'success'}
+- closable = %w[alert notice success]
.flash-container.flash-container-page.sticky{ data: { qa_selector: 'flash_container' } }
- flash.each do |key, value|
- if key == 'toast' && value
@@ -13,6 +14,6 @@
%div{ class: "flash-#{key} mb-2", data: { testid: "alert-#{type_to_variant[key]}" } }
= sprite_icon(icons[key], css_class: 'align-middle mr-1') unless icons[key].nil?
%span= value
- - if %w(alert notice success).include?(key)
+ - if closable.include?(key)
%div{ class: "close-icon-wrapper js-close-icon" }
= sprite_icon('close', css_class: 'close-icon gl-vertical-align-baseline!')
diff --git a/app/views/layouts/_header_search.html.haml b/app/views/layouts/_header_search.html.haml
index 3c62180214b..28118cf4aaa 100644
--- a/app/views/layouts/_header_search.html.haml
+++ b/app/views/layouts/_header_search.html.haml
@@ -25,3 +25,7 @@
-# workaround for non-JS feature specs, see spec/support/helpers/search_helpers.rb
- if ENV['RAILS_ENV'] == 'test'
%noscript= button_tag 'Search'
+ %kbd.gl-absolute.gl-right-3.gl-top-0.keyboard-shortcut-helper.gl-z-index-1.has-tooltip{ data: { html: 'true',
+ placement: 'bottom' },
+ title: html_escape(s_('GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search')) % { kbdOpen: '<kbd>'.html_safe, kbdClose: '</kbd>'.html_safe } }
+ = '/'
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index b7cf7b7468f..59d4c81358d 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -17,7 +17,6 @@
= dispensable_render "shared/service_ping_consent"
= dispensable_render_if_exists "layouts/header/ee_subscribable_banner"
= dispensable_render_if_exists "layouts/header/seat_count_alert"
- = dispensable_render_if_exists "shared/namespace_storage_limit_alert"
= dispensable_render_if_exists "shared/namespace_user_cap_reached_alert"
= dispensable_render_if_exists "shared/new_user_signups_cap_reached_alert"
= yield :page_level_alert
diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml
index cee5c1b6b69..cb1a2a8c690 100644
--- a/app/views/layouts/devise.html.haml
+++ b/app/views/layouts/devise.html.haml
@@ -1,7 +1,7 @@
!!! 5
%html.devise-layout-html{ class: system_message_class }
= render "layouts/head", { startup_filename: 'signin' }
- %body.ui-indigo.login-page.application.navless{ class: "#{client_class_list}", data: { page: body_data_page, qa_selector: 'login_page' } }
+ %body.login-page.application.navless{ class: "#{user_application_theme} #{client_class_list}", data: { page: body_data_page, qa_selector: 'login_page' } }
= header_message
= render "layouts/init_client_detection_flags"
.page-wrap
diff --git a/app/views/layouts/devise_empty.html.haml b/app/views/layouts/devise_empty.html.haml
index b5649be8917..cadba3f91e9 100644
--- a/app/views/layouts/devise_empty.html.haml
+++ b/app/views/layouts/devise_empty.html.haml
@@ -1,7 +1,7 @@
!!! 5
%html.devise-layout-html{ lang: "en", class: system_message_class }
= render "layouts/head"
- %body.ui-indigo.login-page.application.navless{ class: "#{client_class_list}" }
+ %body.login-page.application.navless{ class: "#{user_application_theme} #{client_class_list}" }
= header_message
= render "layouts/init_client_detection_flags"
= render "layouts/header/empty"
diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml
index 940724e0e4a..1c2ab8cf008 100644
--- a/app/views/layouts/group.html.haml
+++ b/app/views/layouts/group.html.haml
@@ -3,11 +3,11 @@
- header_title group_title(@group) unless header_title
- nav "group"
- display_subscription_banner!
-- display_namespace_storage_limit_alert!
- @left_sidebar = true
- content_for :flash_message do
= render "layouts/header/storage_enforcement_banner", namespace: @group
+ = dispensable_render_if_exists "shared/namespace_storage_limit_alert"
- content_for :page_specific_javascripts do
- if current_user
diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml
index 580b8e67a3c..8452f0d9976 100644
--- a/app/views/layouts/mailer.html.haml
+++ b/app/views/layouts/mailer.html.haml
@@ -3,8 +3,6 @@
%td
%img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png') }
%div
- - manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, class: 'mng-notif-link')
- - help_link = link_to(_("Help"), help_url, class: 'help-link')
- = _("You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}").html_safe % { host: Gitlab.config.gitlab.host, manage_notifications_link: manage_notifications_link, help_link: help_link }
+ = notification_reason_text(show_manage_notifications_link: true, show_help_link: true, format: :html)
= render 'layouts/mailer'
diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb
index 1a06ea68bcd..24553734e49 100644
--- a/app/views/layouts/mailer.text.erb
+++ b/app/views/layouts/mailer.text.erb
@@ -3,7 +3,7 @@
<%= yield -%>
-- <%# signature marker %>
-<%= _("You're receiving this email because of your account on %{host}.") % { host: Gitlab.config.gitlab.host } %>
+<%= notification_reason_text %>
<%= render_if_exists 'layouts/mailer/additional_text' %>
<%= text_footer_message %>
diff --git a/app/views/layouts/nav/_breadcrumbs.html.haml b/app/views/layouts/nav/_breadcrumbs.html.haml
index fde4e74fb7a..98d6af28cf5 100644
--- a/app/views/layouts/nav/_breadcrumbs.html.haml
+++ b/app/views/layouts/nav/_breadcrumbs.html.haml
@@ -8,7 +8,7 @@
- if defined?(@left_sidebar)
= button_tag class: 'toggle-mobile-nav', data: { qa_selector: 'toggle_mobile_nav_button' }, type: 'button' do
%span.sr-only= _("Open sidebar")
- = sprite_icon('hamburger', size: 18)
+ = sprite_icon('sidebar', size: 18)
.breadcrumbs-links{ data: { testid: 'breadcrumb-links', qa_selector: 'breadcrumb_links_content' } }
%ul.list-unstyled.breadcrumbs-list.js-breadcrumbs-list
- unless hide_top_links
diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml
index d9f16a89fbc..d05b6951fbf 100644
--- a/app/views/layouts/notify.html.haml
+++ b/app/views/layouts/notify.html.haml
@@ -26,16 +26,7 @@
- else
#{link_to _("View it on GitLab"), @target_url}.
%br
- -# Don't link the host in the line below, one link in the email is easier to quickly click than two.
- = notification_reason_text(@reason)
- If you'd like to receive fewer emails, you can
- - if @labels_url
- adjust your #{link_to 'label subscriptions', @labels_url}.
- - else
- - if @unsubscribe_url
- = link_to "unsubscribe", @unsubscribe_url
- from this thread or
- adjust your notification settings.
+ = notification_reason_text(reason: @reason, show_manage_notifications_link: !@labels_url, show_help_link: true, manage_label_subscriptions_url: @labels_url, unsubscribe_url: @unsubscribe_url, format: :html)
= email_action @target_url
diff --git a/app/views/layouts/notify.text.erb b/app/views/layouts/notify.text.erb
index 49ad0b5abc5..4eae96dc376 100644
--- a/app/views/layouts/notify.text.erb
+++ b/app/views/layouts/notify.text.erb
@@ -11,7 +11,7 @@
<% end -%>
<% end -%>
-<%= notification_reason_text(@reason) %>
+<%= notification_reason_text(reason: @reason) %>
<%= render_if_exists 'layouts/mailer/additional_text' %>
<%= text_footer_message -%>
diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml
index a54e0351d2f..86b4c4eabe3 100644
--- a/app/views/layouts/project.html.haml
+++ b/app/views/layouts/project.html.haml
@@ -4,10 +4,13 @@
- nav "project"
- page_itemtype 'http://schema.org/SoftwareSourceCode'
- display_subscription_banner!
-- display_namespace_storage_limit_alert!
- @left_sidebar = true
- @content_class = [@content_class, project_classes(@project)].compact.join(" ")
+- content_for :flash_message do
+ = render "layouts/header/storage_enforcement_banner", namespace: @project.namespace
+ = dispensable_render_if_exists "shared/namespace_storage_limit_alert"
+
- content_for :project_javascripts do
- project = @target_project || @project
- if current_user
diff --git a/app/views/layouts/signup_onboarding.html.haml b/app/views/layouts/signup_onboarding.html.haml
index f768fba84ca..4d0bb36d4b5 100644
--- a/app/views/layouts/signup_onboarding.html.haml
+++ b/app/views/layouts/signup_onboarding.html.haml
@@ -2,7 +2,7 @@
%html.devise-layout-html.navless{ class: system_message_class }
- add_page_specific_style 'page_bundles/signup'
= render "layouts/head"
- %body.ui-indigo.signup-page{ class: "#{client_class_list}", data: { page: body_data_page, qa_selector: 'signup_page' } }
+ %body.signup-page{ class: "#{user_application_theme} #{client_class_list}", data: { page: body_data_page, qa_selector: 'signup_page' } }
= render "layouts/header/logo_with_title"
= render "layouts/init_client_detection_flags"
.page-wrap
diff --git a/app/views/notify/_failed_builds.html.haml b/app/views/notify/_failed_builds.html.haml
index afed3c95130..fc4a063f5a9 100644
--- a/app/views/notify/_failed_builds.html.haml
+++ b/app/views/notify/_failed_builds.html.haml
@@ -1,12 +1,10 @@
%tr
%td{ colspan: 2, style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; color: #333333; font-size: 14px; font-weight: 400; line-height: 1.4; padding: 0 8px 16px; text-align: center;" }
- had
- = failed.size
- failed
- #{'job'.pluralize(failed.size)}.
+ = n_('had %{count} failed job', 'had %{count} failed jobs', failed.size).html_safe % { count: failed.size }
+
%tr.table-warning
%td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; border: 1px solid #ededed; border-bottom: 0; border-radius: 4px 4px 0 0; overflow: hidden; background-color: #fdf4f6; color: #d22852; font-size: 14px; line-height: 1.4; text-align: center; padding: 8px 16px;" }
- Failed jobs
+ = n_('Failed job', 'Failed jobs', failed.size)
%tr.section
%td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; padding: 0 16px; border: 1px solid #ededed; border-radius: 4px; overflow: hidden; border-top: 0; border-radius: 0 0 4px 4px;" }
%table.builds{ border: "0", cellpadding: "0", cellspacing: "0", style: "width: 100%; border-collapse: collapse;" }
diff --git a/app/views/notify/_reassigned_issuable_email.html.haml b/app/views/notify/_reassigned_issuable_email.html.haml
index 4ab40ff2659..54e51e07c86 100644
--- a/app/views/notify/_reassigned_issuable_email.html.haml
+++ b/app/views/notify/_reassigned_issuable_email.html.haml
@@ -1,10 +1,7 @@
+- to_names = content_tag(:strong, issuable.assignees.any? ? sanitize_name(issuable.assignee_list) : s_('Unassigned'))
+
%p
- Assignee changed
- if previous_assignees.any?
- from
- %strong= sanitize_name(previous_assignees.map(&:name).to_sentence)
- to
- - if issuable.assignees.any?
- %strong= sanitize_name(issuable.assignee_list)
+ = html_escape(s_('Notify|Assignee changed from %{fromNames} to %{toNames}').html_safe % { fromNames: content_tag(:strong, sanitize_name(previous_assignees.map(&:name).to_sentence)), toNames: to_names })
- else
- %strong Unassigned
+ = html_escape(s_('Notify|Assignee changed to %{toNames}').html_safe % { toNames: to_names})
diff --git a/app/views/notify/_relabeled_issuable_email.html.haml b/app/views/notify/_relabeled_issuable_email.html.haml
index 80a0de255be..41d3a63845f 100644
--- a/app/views/notify/_relabeled_issuable_email.html.haml
+++ b/app/views/notify/_relabeled_issuable_email.html.haml
@@ -1,3 +1,2 @@
%p
- #{'Label'.pluralize(@label_names.size)} added:
- %em= @label_names.to_sentence
+ = html_escape(n_('Label added: %{labels}', 'Labels added: %{labels}', @label_names.size).html_safe % { labels: content_tag(:em, @label_names.to_sentence).html_safe })
diff --git a/app/views/notify/_removal_notification.html.haml b/app/views/notify/_removal_notification.html.haml
index 590e0d569aa..1c3c84e0f41 100644
--- a/app/views/notify/_removal_notification.html.haml
+++ b/app/views/notify/_removal_notification.html.haml
@@ -1,9 +1,5 @@
-- if @domain.remove_at
- %p
- Unless you verify your domain by
- %strong= @domain.remove_at.strftime('%F %T,')
- it will be removed from your GitLab project.
-- else
- %p
- If you no longer wish to use this domain with GitLab Pages, please remove it
- from your GitLab project and delete any related DNS records.
+%p
+ - if @domain.remove_at
+ = s_('Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project.').html_safe % { time_start: '<strong>'.html_safe, time_end: '</strong>'.html_safe, time: @domain.remove_at.strftime('%F %T,') }
+ - else
+ = s_('Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records.')
diff --git a/app/views/notify/_successful_pipeline.html.haml b/app/views/notify/_successful_pipeline.html.haml
index 231df2e9206..e77db14a9c5 100644
--- a/app/views/notify/_successful_pipeline.html.haml
+++ b/app/views/notify/_successful_pipeline.html.haml
@@ -45,12 +45,12 @@
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" }
%img{ height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-commit-gray.gif'), style: "display:block;", width: "13", alt: "" }/
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" }
- %a{ href: commit_url(@pipeline), style: "color:#3777b0;text-decoration:none;" }
- = @pipeline.short_sha
+ - commit_link = content_tag(:a, @pipeline.short_sha, href: commit_url(@pipeline), style: "color:#3777b0;text-decoration:none;").html_safe
- if @merge_request
- in
- %a{ href: merge_request_url(@merge_request), style: "color:#3777b0;text-decoration:none;" }
- = @merge_request.to_reference
+ - mr_link = content_tag(:a, @merge_request.to_reference, href: merge_request_url(@merge_request), style: "color:#3777b0;text-decoration:none;").html_safe
+ = s_('Notify|%{commit_link} in %{mr_link}').html_safe % { commit_link: commit_link, mr_link: mr_link }
+ - else
+ = commit_link
.commit{ style: "color:#5c5c5c;font-weight:300;" }
= @pipeline.git_commit_message.truncate(50)
- commit = @pipeline.commit
@@ -94,25 +94,22 @@
%table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;margin:0 auto;" }
%tbody
%tr
- %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;font-weight:500;line-height:1.4;vertical-align:baseline;" }
- Pipeline
- %a{ href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;" }
- = "\##{@pipeline.id}"
- triggered by
+ - common_style = "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;"
+ - pipeline_link = content_tag(:a, "\##{@pipeline.id}", href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;").html_safe
+ %td{ style: "#{common_style} font-weight:500;vertical-align:baseline;" }
+ = s_('Notify|Pipeline %{pipeline_link} triggered by').html_safe % { pipeline_link: pipeline_link }
- if @pipeline.user
- %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;padding-left:5px", width: "24" }
+ %td{ style: "#{common_style} font-weight:500;vertical-align:middle;padding-right:5px;padding-left:5px", width: "24" }
%img.avatar{ height: "24", src: avatar_icon_for_user(@pipeline.user, 24, only_path: false), style: "display:block;border-radius:12px;margin:-2px 0;", width: "24", alt: "" }/
- %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;font-weight:500;line-height:1.4;vertical-align:baseline;" }
+ %td{ style: "#{common_style} vertical-align:baseline;" }
%a.muted{ href: user_url(@pipeline.user), style: "color:#333333;text-decoration:none;" }
= @pipeline.user.name
- else
%td{ style: "font-family:'Menlo','Liberation Mono','Consolas','DejaVu Sans Mono','Ubuntu Mono','Courier New','andale mono','lucida console',monospace;font-size:14px;line-height:1.4;vertical-align:baseline;padding:0 5px;" }
- API
+ = _('API')
+
%tr
%td{ colspan: 2, style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#333333;font-size:15px;font-weight:300;line-height:1.4;padding:15px 5px;text-align:center;" }
- job_count = @pipeline.total_size
- stage_count = @pipeline.stages_count
- successfully completed
- #{job_count} #{'job'.pluralize(job_count)}
- in
- #{stage_count} #{'stage'.pluralize(stage_count)}.
+ = s_('Notify|successfully completed %{jobs} in %{stages}.').html_safe % { jobs: n_('%d job', '%d jobs', job_count) % job_count, stages: n_('%d stage', '%d stages', stage_count) % stage_count }
diff --git a/app/views/notify/approved_merge_request_email.html.haml b/app/views/notify/approved_merge_request_email.html.haml
index c51fe02370d..28da1182d49 100644
--- a/app/views/notify/approved_merge_request_email.html.haml
+++ b/app/views/notify/approved_merge_request_email.html.haml
@@ -152,6 +152,4 @@
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
%img{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png'), style: "display:block;margin:0 auto 1em;", width: "90" }/
%div
- - manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, style: "color:#3777b0;text-decoration:none;")
- - help_link = link_to(_("Help"), help_url, style: "color:#3777b0;text-decoration:none;")
- = _("You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}").html_safe % { host: Gitlab.config.gitlab.host, manage_notifications_link: manage_notifications_link, help_link: help_link }
+ = notification_reason_text(show_manage_notifications_link: true, show_help_link: true, format: :html)
diff --git a/app/views/notify/autodevops_disabled_email.html.haml b/app/views/notify/autodevops_disabled_email.html.haml
index 72bcfbdf3af..bdf2a1136d3 100644
--- a/app/views/notify/autodevops_disabled_email.html.haml
+++ b/app/views/notify/autodevops_disabled_email.html.haml
@@ -4,46 +4,40 @@
%tbody
%tr
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; vertical-align: middle; color: #ffffff; text-align: center;" }
- Auto DevOps pipeline was disabled for #{@project.name}
+ = s_('Notify|Auto DevOps pipeline was disabled for %{project}') % { project: @project.name }
%tr.pre-section
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; color: #333333; font-size: 14px; font-weight: 400; line-height: 1.7; padding: 16px 8px 0;" }
- The Auto DevOps pipeline failed for pipeline
- %a{ href: pipeline_url(@pipeline), style: "color: #1b69b6; text-decoration:none;" }
- = "\##{@pipeline.iid}"
- and has been disabled for
- %a{ href: project_url(@project), style: "color: #1b69b6; text-decoration: none;" }
- = @project.name + "."
- In order to use the Auto DevOps pipeline with your project, please review the
- %a{ href: 'https://docs.gitlab.com/ee/topics/autodevops/#currently-supported-languages', style: "color:#1b69b6;text-decoration:none;" } currently supported languages,
- adjust your project accordingly, and turn on the Auto DevOps pipeline within your
- %a{ href: project_settings_ci_cd_url(@project), style: "color: #1b69b6; text-decoration: none;" }
- CI/CD project settings.
+ - link_style = "color: #1b69b6; text-decoration:none;"
+ - pipeline_link = link_to("\##{@pipeline.iid}", pipeline_url(@pipeline), style: link_style).html_safe
+ - project_link = link_to(@project.name, project_url(@project), style: link_style).html_safe
+ - supported_langs_link = link_to(s_('Notify|currently supported languages'), 'https://docs.gitlab.com/ee/topics/autodevops/#currently-supported-languages', style: link_style ).html_safe
+ - settings_link = link_to(s_('Notify|CI/CD project settings'), project_settings_ci_cd_url(@project), style: link_style).html_safe
+ = s_('Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}.').html_safe % { pipeline_link: pipeline_link, project_link: project_link, supported_langs_link: supported_langs_link, settings_link: settings_link }
%tr.pre-section
%td{ style: 'text-align: center;border-bottom:1px solid #ededed' }
%a{ href: 'https://docs.gitlab.com/ee/topics/autodevops/', style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
%button{ type: 'button', style: 'border-color: #dfdfdf; border-style: solid; border-width: 1px; border-radius: 4px; font-size: 14px; padding: 8px 16px; background-color:#fff; margin: 8px 0; cursor: pointer;' }
- Learn more about Auto DevOps
+ = s_('Notify|Learn more about Auto DevOps')
%tr.pre-section
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; color: #333333; font-size: 14px; font-weight: 400; line-height: 1.4; padding: 16px 8px; text-align: center;" }
%table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;margin:0 auto;" }
%tbody
%tr
- %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:14px; font-weight:500;line-height: 1.4; vertical-align: baseline;" }
- Pipeline
- %a{ href: pipeline_url(@pipeline), style: "color: #1b69b6; text-decoration: none;" }
- = "\##{@pipeline.id}"
- triggered by
+ - common_style = "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif;line-height: 1.4;"
+ - pipeline_link = link_to("\##{@pipeline.id}", pipeline_url(@pipeline), style: "color: #1b69b6; text-decoration: none;").html_safe
+ %td{ style: "#{common_style} font-size:14px;font-weight:500;vertical-align:baseline;" }
+ = s_("Notify|Pipeline %{pipeline_link} triggered by").html_safe % { pipeline_link: pipeline_link }
- if @pipeline.user
- %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 15px; line-height: 1.4; vertical-align: middle; padding-right: 8px; padding-left:8px", width: "24" }
- %img.avatar{ height: "24", src: avatar_icon_for_user(@pipeline.user, 24, only_path: false), style: "display: block; border-radius: 12px; margin: -2px 0;", width: "24", alt: "" }/
- %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 14px; font-weight: 500; line-height: 1.4; vertical-align: baseline;" }
+ %td{ style: "#{common_style} font-size: 15px; vertical-align: middle; padding-right: 8px; padding-left:8px", width: "24" }
+ %img.avatar{ height: "24", src: avatar_icon_for_user(@pipeline.user, 24, only_path: false), style: "display: block; border-radius: 12px; margin: -2px 0;", width: "24", alt: "" }
+ %td{ style: "#{common_style} font-size: 14px; font-weight: 500; vertical-align: baseline;" }
%a.muted{ href: user_url(@pipeline.user), style: "color: #333333; text-decoration: none;" }
= @pipeline.user.name
- else
%td{ style: "font-family: 'Menlo','Liberation Mono','Consolas','DejaVu Sans Mono','Ubuntu Mono','Courier New','andale mono','lucida console',monospace; font-size: 14px; line-height: 1.4; vertical-align: baseline; padding:0 8px;" }
- API
+ = _('API')
= render 'notify/failed_builds', pipeline: @pipeline, failed: @pipeline.latest_statuses.failed
diff --git a/app/views/notify/changed_milestone_email.html.haml b/app/views/notify/changed_milestone_email.html.haml
index 01d27cac36b..bfc9d65d1c2 100644
--- a/app/views/notify/changed_milestone_email.html.haml
+++ b/app/views/notify/changed_milestone_email.html.haml
@@ -1,5 +1,5 @@
%p
- Milestone changed to
- %strong= link_to(@milestone.name, @milestone_url)
+ - milestone_link = link_to(@milestone.name, @milestone_url)
+ = s_('Notify|Milestone changed to %{milestone}').html_safe % { milestone: content_tag(:strong, milestone_link).html_safe }
- if date_range = milestone_date_range(@milestone)
= "(#{date_range})"
diff --git a/app/views/notify/closed_merge_request_email.html.haml b/app/views/notify/closed_merge_request_email.html.haml
index 749584a7044..bd98003a804 100644
--- a/app/views/notify/closed_merge_request_email.html.haml
+++ b/app/views/notify/closed_merge_request_email.html.haml
@@ -1,3 +1,4 @@
%p
- Merge request #{merge_request_reference_link(@merge_request)}
- was closed by #{sanitize_name(@updated_by.name)}
+ - mr_link = merge_request_reference_link(@merge_request)
+ - closed_by = sanitize_name(@updated_by.name)
+ = s_('Notify|Merge request %{mr_link} was closed by %{closed_by}').html_safe % { mr_link: mr_link, closed_by: closed_by }
diff --git a/app/views/notify/member_access_denied_email.html.haml b/app/views/notify/member_access_denied_email.html.haml
index eeef66d353d..98d3daf2107 100644
--- a/app/views/notify/member_access_denied_email.html.haml
+++ b/app/views/notify/member_access_denied_email.html.haml
@@ -1,12 +1,7 @@
%tr
%td.text-content
%p
- Your request to join the
-
- - if @source_hidden
- #{content_tag :span, 'Hidden', class: :highlight}
- - else
- #{link_to member_source.human_name, member_source.web_url, class: :highlight}
-
- #{member_source.model_name.singular} has been #{content_tag :span, 'denied', class: :highlight}.
+ - target_to_join = @source_hidden ? content_tag(:span, _('Hidden'), class: :highlight) : link_to(member_source.human_name, member_source.web_url, class: :highlight)
+ - denied_tag = content_tag :span, _('denied'), class: :highlight
+ = s_('Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}.').html_safe % { target_to_join: target_to_join, target_type: member_source.model_name.singular, denied_tag: denied_tag }
diff --git a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
index 550d386c843..f6b517d6e34 100644
--- a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
+++ b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
@@ -148,6 +148,4 @@
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
%img{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png'), style: "display:block;margin:0 auto 1em;", width: "90" }
%div
- - manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, style: "color:#3777b0;text-decoration:none;")
- - help_link = link_to(_("Help"), help_url, style: "color:#3777b0;text-decoration:none;")
- = _("You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}").html_safe % { host: Gitlab.config.gitlab.host, manage_notifications_link: manage_notifications_link, help_link: help_link }
+ = notification_reason_text(show_manage_notifications_link: true, show_help_link: true, format: :html)
diff --git a/app/views/notify/unapproved_merge_request_email.html.haml b/app/views/notify/unapproved_merge_request_email.html.haml
index ae58ccd3995..0b8fbe14228 100644
--- a/app/views/notify/unapproved_merge_request_email.html.haml
+++ b/app/views/notify/unapproved_merge_request_email.html.haml
@@ -151,6 +151,4 @@
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
%img{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png'), style: "display:block;margin:0 auto 1em;", width: "90" }/
%div
- - manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, style: "color:#3777b0;text-decoration:none;")
- - help_link = link_to(_("Help"), help_url, style: "color:#3777b0;text-decoration:none;")
- = _("You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}").html_safe % { host: Gitlab.config.gitlab.host, manage_notifications_link: manage_notifications_link, help_link: help_link }
+ = notification_reason_text(show_manage_notifications_link: true, show_help_link: true, format: :html)
diff --git a/app/views/notify/user_auto_banned_email.html.haml b/app/views/notify/user_auto_banned_email.html.haml
index d88c06526eb..8c33cd7299d 100644
--- a/app/views/notify/user_auto_banned_email.html.haml
+++ b/app/views/notify/user_auto_banned_email.html.haml
@@ -2,7 +2,7 @@
- link_end = '</a>'.html_safe
= email_default_heading(_("We've detected some unusual activity"))
%p
- = _('We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes }
+ = _('We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes, scope: @ban_scope }
%p
= _('If this is a mistake, you can %{link_start}unban them%{link_end}.').html_safe % { link_start: link_start % { url: admin_users_url(filter: 'banned') }, link_end: link_end }
%p
diff --git a/app/views/notify/user_auto_banned_email.text.erb b/app/views/notify/user_auto_banned_email.text.erb
index 0469ee9788c..336973c2e42 100644
--- a/app/views/notify/user_auto_banned_email.text.erb
+++ b/app/views/notify/user_auto_banned_email.text.erb
@@ -1,6 +1,6 @@
<%= _("We've detected some unusual activity") %>
-<%= _('We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes } %>
+<%= _('We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes, scope: @ban_scope } %>
<%= _('If this is a mistake, you can unban them: %{url}.') % { url: admin_users_url(filter: 'banned') } %>
diff --git a/app/views/notify/verification_instructions_email.html.haml b/app/views/notify/verification_instructions_email.html.haml
new file mode 100644
index 00000000000..63d8d1b2461
--- /dev/null
+++ b/app/views/notify/verification_instructions_email.html.haml
@@ -0,0 +1,12 @@
+%div{ style: 'text-align:center;color:#1F1F1F;line-height:1.25em;max-width:400px;margin:0 auto;' }
+ %h3
+ = s_('IdentityVerification|Help us protect your account')
+ %p{ style: 'font-size:0.9em' }
+ = s_('IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page.')
+ %div{ style: 'margin:26px 0;width:207px;height:53px;background-color:#F0F0F0;line-height:53px;font-weight:700;font-size:1.5em;color:#303030;' }
+ = @token
+ %p{ style: 'font-size:0.75em' }
+ = s_('IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes.').html_safe % { link_end: link_end,
+ password_link_start: link_start(@password_link),
+ two_fa_link_start: link_start(@two_fa_link),
+ expires_in_minutes: @expires_in_minutes }
diff --git a/app/views/notify/verification_instructions_email.text.erb b/app/views/notify/verification_instructions_email.text.erb
new file mode 100644
index 00000000000..df507b5db71
--- /dev/null
+++ b/app/views/notify/verification_instructions_email.text.erb
@@ -0,0 +1,8 @@
+<%= s_('IdentityVerification|Help us protect your account') %>
+
+<%= s_('IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page.') %>
+
+<%= @token %>
+
+<%= s_('IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe.') % { password_link: @password_link, two_fa_link: @two_fa_link } %>
+<%= s_('IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes.') % { expires_in_minutes: @expires_in_minutes } %>
diff --git a/app/views/profiles/_email_settings.html.haml b/app/views/profiles/_email_settings.html.haml
index 457d6690a78..0ca9acba2de 100644
--- a/app/views/profiles/_email_settings.html.haml
+++ b/app/views/profiles/_email_settings.html.haml
@@ -22,12 +22,12 @@
{ include_blank: s_("Profiles|Do not show on profile") },
{ class: 'gl-form-select custom-select', disabled: email_change_disabled }
%small.form-text.text-gl-muted
- = s_("Profiles|This email will be displayed on your public profile")
+ = s_("Profiles|This email will be displayed on your public profile.")
.form-group.gl-form-group
- commit_email_link_url = help_page_path('user/profile/index', anchor: 'change-the-email-displayed-on-your-commits', target: '_blank')
- commit_email_link_start = '<a href="%{url}">'.html_safe % { url: commit_email_link_url }
- - commit_email_docs_link = s_('Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}').html_safe % { commit_email_link_start: commit_email_link_start, commit_email_link_end: '</a>'.html_safe }
+ - commit_email_docs_link = s_('Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}').html_safe % { commit_email_link_start: commit_email_link_start, commit_email_link_end: '</a>'.html_safe }
= form.label :commit_email, s_('Profiles|Commit email')
.gl-md-form-input-lg
= form.select :commit_email,
diff --git a/app/views/profiles/_name.html.haml b/app/views/profiles/_name.html.haml
index 5af4fe24d62..d798eab7635 100644
--- a/app/views/profiles/_name.html.haml
+++ b/app/views/profiles/_name.html.haml
@@ -2,8 +2,8 @@
- if user.read_only_attribute?(:name)
= form.text_field :name, class: 'gl-form-input form-control', required: true, readonly: true
%small.form-text.text-gl-muted
- = s_("Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you") % { provider_label: attribute_provider_label(:name) }
+ = s_("Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you.") % { provider_label: attribute_provider_label(:name) }
- else
= form.text_field :name, class: 'gl-form-input form-control', required: true, title: s_("Profiles|Using emojis in names seems fun, but please try to set a status message instead")
%small.form-text.text-gl-muted
- = s_("Profiles|Enter your name, so people you know can recognize you")
+ = s_("Profiles|Enter your name, so people you know can recognize you.")
diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml
index 745d3c62c5d..cdd5a9ae7a1 100644
--- a/app/views/profiles/accounts/show.html.haml
+++ b/app/views/profiles/accounts/show.html.haml
@@ -17,9 +17,9 @@
.row.gl-mt-3.js-search-settings-section
.col-lg-4.profile-settings-sidebar
%h4.gl-mt-0
- = s_('Profiles|Two-Factor Authentication')
+ = s_('Profiles|Two-factor authentication')
%p
- = s_("Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)")
+ = s_("Profiles|Increase your account's security by enabling two-factor authentication (2FA).")
.col-lg-8
%p
#{_('Status')}: #{current_user.two_factor_enabled? ? _('Enabled') : _('Disabled')}
@@ -35,9 +35,9 @@
.row.gl-mt-3.js-search-settings-section
.col-lg-4.profile-settings-sidebar
%h4.gl-mt-0
- = s_('Profiles|Social sign-in')
+ = s_('Profiles|Service sign-in')
%p
- = s_('Profiles|Activate signin with one of the following services')
+ = s_('Profiles|Connect a service for sign-in.')
.col-lg-8
= render 'providers', providers: button_based_providers, group_saml_identities: local_assigns[:group_saml_identities]
.col-lg-12
@@ -68,7 +68,7 @@
= render 'users/deletion_guidance', user: current_user
-# Delete button here
- %button#delete-account-button.gl-button.btn.btn-danger.disabled{ data: { qa_selector: 'delete_account_button' } }
+ = render Pajamas::ButtonComponent.new(variant: :danger, button_options: { id: 'delete-account-button', disabled: true, data: { qa_selector: 'delete_account_button' }}) do
= s_('Profiles|Delete account')
#delete-account-modal{ data: { action_url: user_registration_path,
diff --git a/app/views/profiles/gpg_keys/_form.html.haml b/app/views/profiles/gpg_keys/_form.html.haml
index 9804a3b7735..b3784faed28 100644
--- a/app/views/profiles/gpg_keys/_form.html.haml
+++ b/app/views/profiles/gpg_keys/_form.html.haml
@@ -1,6 +1,6 @@
%div
= form_for [:profile, @gpg_key], html: { class: 'js-requires-input' } do |f|
- = form_errors(@gpg_key)
+ = form_errors(@gpg_key, pajamas_alert: true)
.form-group
= f.label :key, s_('Profiles|Key'), class: 'label-bold'
diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml
index 5d3e0720176..46ae602359f 100644
--- a/app/views/profiles/passwords/edit.html.haml
+++ b/app/views/profiles/passwords/edit.html.haml
@@ -15,7 +15,7 @@
- else
= _('Change your password or recover your current one')
= form_for @user, url: profile_password_path, method: :put, html: {class: "update-password"} do |f|
- = form_errors(@user)
+ = form_errors(@user, pajamas_alert: true)
- unless @user.password_automatically_set?
.form-group
@@ -25,7 +25,8 @@
= _('You must provide your current password in order to change it.')
.form-group
= f.label :new_password, _('New password'), class: 'label-bold'
- = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'new_password_field' }
+ = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input js-password-complexity-validation', data: { qa_selector: 'new_password_field' }
+ = render_if_exists 'shared/password_requirements_list'
.form-group
= f.label :password_confirmation, _('Password confirmation'), class: 'label-bold'
= f.password_field :password_confirmation, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' }
diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml
index a2180dc68a6..5bcc92dcdfd 100644
--- a/app/views/profiles/passwords/new.html.haml
+++ b/app/views/profiles/passwords/new.html.haml
@@ -9,7 +9,7 @@
%br
= _('After a successful password update you will be redirected to login screen.')
- = form_errors(@user)
+ = form_errors(@user, pajamas_alert: true)
- unless @user.password_automatically_set?
.form-group.row
@@ -21,7 +21,8 @@
.col-sm-2.col-form-label
= f.label :new_password, _('New password')
.col-sm-10
- = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'new_password_field' }
+ = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input js-password-complexity-validation', data: { qa_selector: 'new_password_field' }
+ = render_if_exists 'shared/password_requirements_list'
.form-group.row
.col-sm-2.col-form-label
= f.label :password_confirmation, _('Password confirmation')
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index d1f1ff892d5..dda1640968e 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -5,9 +5,7 @@
- availability = availability_values
- custom_emoji = show_status_emoji?(@user.status)
-= gitlab_ui_form_for @user, url: profile_path, method: :put, html: { multipart: true, class: 'edit-user gl-mt-3 js-quick-submit gl-show-field-errors js-password-prompt-form', remote: true }, authenticity_token: true do |f|
- = form_errors(@user)
-
+= gitlab_ui_form_for @user, url: profile_path, method: :put, html: { multipart: true, class: 'edit-user js-edit-user gl-mt-3 js-quick-submit gl-show-field-errors js-password-prompt-form', remote: true }, authenticity_token: true do |f|
.row.js-search-settings-section
.col-lg-4.profile-settings-sidebar
%h4.gl-mt-0
@@ -46,20 +44,18 @@
%p= s_("Profiles|This emoji and message will appear on your profile and throughout the interface.")
.col-lg-8
= f.fields_for :status, @user.status do |status_form|
- - emoji_button = button_tag type: :button,
- class: 'js-toggle-emoji-menu emoji-menu-toggle-button btn gl-button btn-default has-tooltip',
- title: s_("Profiles|Add status emoji") do
+ - emoji_button = render Pajamas::ButtonComponent.new(button_options: { title: s_("Profiles|Add status emoji"),
+ class: 'js-toggle-emoji-menu emoji-menu-toggle-button has-tooltip' } ) do
- if custom_emoji
= emoji_icon(@user.status.emoji, class: 'gl-mr-0!')
%span#js-no-emoji-placeholder.no-emoji-placeholder{ class: ('hidden' if custom_emoji) }
= sprite_icon('slight-smile', css_class: 'award-control-icon-neutral')
= sprite_icon('smiley', css_class: 'award-control-icon-positive')
= sprite_icon('smile', css_class: 'award-control-icon-super-positive')
- - reset_message_button = button_tag type: :button,
- id: 'js-clear-user-status-button',
- class: 'clear-user-status btn gl-button btn-default has-tooltip',
- title: s_("Profiles|Clear status") do
- = sprite_icon("close")
+ - reset_message_button = render Pajamas::ButtonComponent.new(icon: 'close',
+ button_options: { id: 'js-clear-user-status-button',
+ class: 'has-tooltip',
+ title: s_("Profiles|Clear status") } )
= status_form.hidden_field :emoji, id: 'js-status-emoji-field'
.form-group.gl-form-group
@@ -76,7 +72,7 @@
.form-group.gl-form-group
= status_form.gitlab_ui_checkbox_component :availability,
s_("Profiles|Busy"),
- help_text: s_('Profiles|An indicator appears next to your name and avatar'),
+ help_text: s_('Profiles|An indicator appears next to your name and avatar.'),
checkbox_options: { data: { testid: "user-availability-checkbox" } },
checked_value: availability["busy"],
unchecked_value: availability["not_set"]
@@ -85,7 +81,7 @@
.row.user-time-preferences.js-search-settings-section
.col-lg-4.profile-settings-sidebar
%h4.gl-mt-0= s_("Profiles|Time settings")
- %p= s_("Profiles|Set your local time zone")
+ %p= s_("Profiles|Set your local time zone.")
.col-lg-8
%h5= _("Time zone")
= dropdown_tag(_("Select a time zone"), options: { toggle_class: 'gl-button btn js-timezone-dropdown input-lg gl-w-full!', title: _("Select a time zone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } )
@@ -97,7 +93,7 @@
%h4.gl-mt-0
= s_("Profiles|Main settings")
%p
- = s_("Profiles|This information will appear on your profile")
+ = s_("Profiles|This information will appear on your profile.")
- if current_user.ldap_user?
= s_("Profiles|Some options are unavailable for LDAP accounts")
.col-lg-8
@@ -111,12 +107,12 @@
= f.label :pronouns, s_('Profiles|Pronouns')
= f.text_field :pronouns, class: 'gl-form-input form-control gl-md-form-input-lg'
%small.form-text.text-gl-muted
- = s_("Profiles|Enter your pronouns to let people know how to refer to you")
+ = s_("Profiles|Enter your pronouns to let people know how to refer to you.")
.form-group.gl-form-group
= f.label :pronunciation, s_('Profiles|Pronunciation')
= f.text_field :pronunciation, class: 'gl-form-input form-control gl-md-form-input-lg'
%small.form-text.text-gl-muted
- = s_("Profiles|Enter how your name is pronounced to help people address you correctly")
+ = s_("Profiles|Enter how your name is pronounced to help people address you correctly.")
= render_if_exists 'profiles/extra_settings', form: f
= render_if_exists 'profiles/email_settings', form: f
.form-group.gl-form-group
@@ -148,17 +144,17 @@
= f.label :organization, s_('Profiles|Organization')
= f.text_field :organization, class: 'gl-form-input form-control gl-md-form-input-lg'
%small.form-text.text-gl-muted
- = s_("Profiles|Who you represent or work for")
+ = s_("Profiles|Who you represent or work for.")
.form-group.gl-form-group
= f.label :bio, s_('Profiles|Bio')
= f.text_area :bio, class: 'gl-form-input gl-form-textarea form-control', rows: 4, maxlength: 250
%small.form-text.text-gl-muted
- = s_("Profiles|Tell us about yourself in fewer than 250 characters")
+ = s_("Profiles|Tell us about yourself in fewer than 250 characters.")
%hr
%fieldset.form-group.gl-form-group
%legend.col-form-label.col-form-label
= _('Private profile')
- - private_profile_label = s_("Profiles|Don't display activity-related personal information on your profile")
+ - private_profile_label = s_("Profiles|Don't display activity-related personal information on your profile.")
- private_profile_help_link = link_to sprite_icon('question-o'), help_page_path('user/profile/index.md', anchor: 'make-your-user-profile-page-private')
= f.gitlab_ui_checkbox_component :private_profile, '%{private_profile_label} %{private_profile_help_link}'.html_safe % { private_profile_label: private_profile_label, private_profile_help_link: private_profile_help_link.html_safe }
%fieldset.form-group.gl-form-group
@@ -166,7 +162,7 @@
= s_("Profiles|Private contributions")
= f.gitlab_ui_checkbox_component :include_private_contributions,
s_('Profiles|Include private contributions on my profile'),
- help_text: s_("Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information")
+ help_text: s_("Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information.")
%hr
= f.submit s_("Profiles|Update profile settings"), class: 'gl-button btn btn-confirm gl-mr-3 js-password-prompt-btn'
= link_to _("Cancel"), user_path(current_user), class: 'gl-button btn btn-default btn-cancel'
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index 845baae3bb2..6304d42896d 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -78,7 +78,7 @@
.col-lg-8
- registration = webauthn_enabled ? @webauthn_registration : @u2f_registration
- if registration.errors.present?
- = form_errors(registration)
+ = form_errors(registration, pajamas_alert: true)
- if webauthn_enabled
= render "authentication/register", target_path: create_webauthn_profile_two_factor_auth_path
- else
diff --git a/app/views/projects/_activity.html.haml b/app/views/projects/_activity.html.haml
index 05166395067..402affc7b0e 100644
--- a/app/views/projects/_activity.html.haml
+++ b/app/views/projects/_activity.html.haml
@@ -11,4 +11,4 @@
.content_list.project-activity{ :"data-href" => activity_project_path(@project) }
.loading
- = gl_loading_icon(size: 'md')
+ = render Pajamas::SpinnerComponent.new(size: :md)
diff --git a/app/views/projects/_files.html.haml b/app/views/projects/_files.html.haml
index bea5d548e03..319c6333e77 100644
--- a/app/views/projects/_files.html.haml
+++ b/app/views/projects/_files.html.haml
@@ -16,7 +16,7 @@
#js-code-owners
- if is_project_overview
- .project-buttons.gl-mb-3.js-show-on-project-root
+ .project-buttons.gl-mb-5.js-show-on-project-root{ data: { qa_selector: 'project_buttons' } }
= render 'stat_anchor_list', anchors: @project.statistics_buttons(show_auto_devops_callout: show_auto_devops_callout), project_buttons: true
#js-tree-list{ data: vue_file_list_data(project, ref) }
diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml
index cb15858a935..42cdc1d6989 100644
--- a/app/views/projects/_import_project_pane.html.haml
+++ b/app/views/projects/_import_project_pane.html.haml
@@ -24,21 +24,21 @@
- if bitbucket_import_enabled?
%div
- = link_to status_import_bitbucket_path, class: "gl-button btn-default btn import_bitbucket js-import-project-btn #{'js-how-to-import-link' unless bitbucket_import_configured?}",
+ = link_to status_import_bitbucket_path(namespace_id: namespace_id), class: "gl-button btn-default btn import_bitbucket js-import-project-btn #{'js-how-to-import-link' unless bitbucket_import_configured?}",
data: { modal_title: _("Import projects from Bitbucket"), modal_message: import_from_bitbucket_message, platform: 'bitbucket_cloud', **tracking_attrs_data(track_label, 'click_button', 'bitbucket_cloud') } do
.gl-button-icon
= sprite_icon('bitbucket')
Bitbucket Cloud
- if bitbucket_server_import_enabled?
%div
- = link_to status_import_bitbucket_server_path, class: "gl-button btn-default btn import_bitbucket js-import-project-btn", data: { platform: 'bitbucket_server', **tracking_attrs_data(track_label, 'click_button', 'bitbucket_server') } do
+ = link_to status_import_bitbucket_server_path(namespace_id: namespace_id), class: "gl-button btn-default btn import_bitbucket js-import-project-btn", data: { platform: 'bitbucket_server', **tracking_attrs_data(track_label, 'click_button', 'bitbucket_server') } do
.gl-button-icon
= sprite_icon('bitbucket')
Bitbucket Server
%div
- if gitlab_import_enabled?
%div
- = link_to status_import_gitlab_path, class: "gl-button btn-default btn import_gitlab js-import-project-btn #{'js-how-to-import-link' unless gitlab_import_configured?}",
+ = link_to status_import_gitlab_path(namespace_id: namespace_id), class: "gl-button btn-default btn import_gitlab js-import-project-btn #{'js-how-to-import-link' unless gitlab_import_configured?}",
data: { modal_title: _("Import projects from GitLab.com"), modal_message: import_from_gitlab_message, platform: 'gitlab_com', **tracking_attrs_data(track_label, 'click_button', 'gitlab_com') } do
.gl-button-icon
= sprite_icon('tanuki')
@@ -46,7 +46,7 @@
- if fogbugz_import_enabled?
%div
- = link_to new_import_fogbugz_path, class: 'gl-button btn-default btn import_fogbugz js-import-project-btn', data: { platform: 'fogbugz', **tracking_attrs_data(track_label, 'click_button', 'fogbugz') } do
+ = link_to new_import_fogbugz_path(namespace_id: namespace_id), class: 'gl-button btn-default btn import_fogbugz js-import-project-btn', data: { platform: 'fogbugz', **tracking_attrs_data(track_label, 'click_button', 'fogbugz') } do
.gl-button-icon
= sprite_icon('bug')
FogBugz
diff --git a/app/views/projects/_merge_request_squash_options_settings.html.haml b/app/views/projects/_merge_request_squash_options_settings.html.haml
index 4b428363646..372c0723600 100644
--- a/app/views/projects/_merge_request_squash_options_settings.html.haml
+++ b/app/views/projects/_merge_request_squash_options_settings.html.haml
@@ -5,7 +5,7 @@
%b= s_('ProjectSettings|Squash commits when merging')
%p.text-secondary
= s_('ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests.')
- = link_to "What is squashing?", help_page_path('user/project/merge_requests/squash_and_merge.md'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to s_('ProjectSettings|What is squashing?'), help_page_path('user/project/merge_requests/squash_and_merge.md'), target: '_blank', rel: 'noopener noreferrer'
= settings.gitlab_ui_radio_component :squash_option,
:never,
diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml
index 2cbb9758703..992b46c1f7b 100644
--- a/app/views/projects/_new_project_fields.html.haml
+++ b/app/views/projects/_new_project_fields.html.haml
@@ -35,7 +35,7 @@
- if current_user.can_create_group?
.form-text.text-muted
- link_start_group_path = '<a href="%{path}">' % { path: new_group_path }
- - project_tip = s_('ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}') % { link_start: link_start_group_path, link_end: '</a>' }
+ - project_tip = s_('ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}') % { link_start: link_start_group_path, link_end: '</a>' }
= project_tip.html_safe
= render Pajamas::AlertComponent.new(alert_options: { class: "gl-mb-4 gl-display-none js-user-readme-repo" },
dismissible: false,
@@ -52,10 +52,11 @@
- unless Gitlab::CurrentSettings.current_application_settings.hide_third_party_offers? || !Gitlab.com?
.js-deployment-target-select
-= f.label :visibility_level, class: 'label-bold' do
- = s_('ProjectsNew|Visibility Level')
- = link_to sprite_icon('question-o'), help_page_path('public_access/public_access'), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer'
-= render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false, data: { qa_selector: 'visibility_radios'}
+.form-group.gl-form-group
+ = f.label :visibility_level, class: 'label-bold' do
+ = s_('ProjectsNew|Visibility Level')
+ = link_to sprite_icon('question-o'), help_page_path('user/public_access'), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer'
+ = render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false, data: { qa_selector: 'visibility_radios'}
- if !hide_init_with_readme
= f.label :project_configuration, class: 'label-bold' do
@@ -77,5 +78,7 @@
= s_('ProjectsNew|Analyze your source code for known security vulnerabilities.')
= link_to _('Learn more.'), help_page_path('user/application_security/sast/index'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed' }
+-# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/675
+= render_if_exists 'shared/other_project_options', f: f, visibility_level: visibility_level, track_label: track_label
= f.submit _('Create project'), class: "btn gl-button btn-confirm js-create-project-button", data: { qa_selector: 'project_create_button', track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" }
= link_to _('Cancel'), dashboard_projects_path, class: 'btn gl-button btn-default btn-cancel', data: { track_label: "#{track_label}", track_action: "click_button", track_property: "cancel", track_value: "" }
diff --git a/app/views/projects/_remove.html.haml b/app/views/projects/_remove.html.haml
index d0dfbb89ca7..ed238dab4ff 100644
--- a/app/views/projects/_remove.html.haml
+++ b/app/views/projects/_remove.html.haml
@@ -7,7 +7,7 @@
%h4.danger-title= _('Delete project')
%p
%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'
+ = link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'remove-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer'
%p
%strong= _('Deleted projects cannot be restored!')
#js-project-delete-button{ data: { form_path: project_path(project), confirm_phrase: delete_confirm_phrase(project), is_fork: project.forked?.to_s, issues_count: number_with_delimiter(issues_count), merge_requests_count: number_with_delimiter(merge_requests_count), forks_count: number_with_delimiter(forks_count), stars_count: number_with_delimiter(project.star_count) } }
diff --git a/app/views/projects/_remove_fork.html.haml b/app/views/projects/_remove_fork.html.haml
index bb51aa86170..bfc1e77118a 100644
--- a/app/views/projects/_remove_fork.html.haml
+++ b/app/views/projects/_remove_fork.html.haml
@@ -8,5 +8,5 @@
= form_for @project, url: remove_fork_project_path(@project), method: :delete, html: { id: remove_form_id } do |f|
%p
%strong= _('Once removed, the fork relationship cannot be restored. This project will no longer be able to receive or send merge requests to the source project or other forks.')
- = link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'removing-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'remove-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer'
.js-confirm-danger{ data: remove_fork_project_confirm_json(@project, remove_form_id) }
diff --git a/app/views/projects/_stat_anchor_list.html.haml b/app/views/projects/_stat_anchor_list.html.haml
index 13ff8abe499..4a21cb32c20 100644
--- a/app/views/projects/_stat_anchor_list.html.haml
+++ b/app/views/projects/_stat_anchor_list.html.haml
@@ -2,7 +2,7 @@
- project_buttons = local_assigns.fetch(:project_buttons, false)
- return unless anchors.any?
-%ul.nav
+%ul.nav.gl-gap-3
- anchors.each do |anchor|
%li.nav-item
= link_to_if(anchor.link, anchor.label, anchor.link, stat_anchor_attrs(anchor)) do
diff --git a/app/views/projects/_transfer.html.haml b/app/views/projects/_transfer.html.haml
index 9e6648c71fc..393b199fb05 100644
--- a/app/views/projects/_transfer.html.haml
+++ b/app/views/projects/_transfer.html.haml
@@ -7,7 +7,7 @@
%h4.danger-title= _('Transfer project')
= form_for @project, url: transfer_project_path(@project), method: :put, html: { class: 'js-project-transfer-form', id: form_id } do |f|
.form-group
- - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'transferring-an-existing-project-into-another-namespace') }
+ - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'transfer-a-project-to-another-namespace') }
%p= _("Transfer your project into another namespace. %{link_start}Learn more.%{link_end}").html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
%p= _('When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier.')
%p
diff --git a/app/views/projects/activity.html.haml b/app/views/projects/activity.html.haml
index e69c4f51ec4..6a4760c3954 100644
--- a/app/views/projects/activity.html.haml
+++ b/app/views/projects/activity.html.haml
@@ -1,5 +1,4 @@
- page_title _("Activity")
-= render_if_exists 'shared/minute_limit_banner', namespace: @project
= render 'projects/last_push'
= render 'projects/activity'
diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml
index bc1e62a8980..b44c773adff 100644
--- a/app/views/projects/blame/show.html.haml
+++ b/app/views/projects/blame/show.html.haml
@@ -20,7 +20,7 @@
%span.legend-box.legend-box-9
%span.right-label Older
- .table-responsive.file-content.blame.code{ class: user_color_scheme }
+ .table-responsive.file-content.blame.code{ class: user_color_scheme, data: { qa_selector: 'blame_file_content' } }
%table
- current_line = @blame.first_line
- @blame.groups.each do |blame_group|
diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml
index 2c3aade1068..4139be053f8 100644
--- a/app/views/projects/blob/_blob.html.haml
+++ b/app/views/projects/blob/_blob.html.haml
@@ -2,6 +2,8 @@
- project = @project.present(current_user: current_user)
- ref = local_assigns[:ref] || @ref
- expanded = params[:expanded].present?
+- if blob.rich_viewer
+ - add_page_startup_api_call local_assigns.fetch(:viewer_url) { url_for(safe_params.merge(viewer: blob.rich_viewer.type, format: :json)) }
.info-well.d-none.d-sm-block
.well-segment
@@ -14,7 +16,7 @@
#blob-content-holder.blob-content-holder
- if @code_navigation_path
#js-code-navigation{ data: { code_navigation_path: @code_navigation_path, blob_path: blob.path, definition_path_prefix: project_blob_path(@project, @ref) } }
- - if Feature.enabled?(:refactor_blob_viewer, @project) && !expanded
+ - if !expanded
-# Data info will be removed once we migrate this to use GraphQL
-# Follow-up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/330406
#js-view-blob-app{ data: { blob_path: blob.path,
diff --git a/app/views/projects/blob/_remove.html.haml b/app/views/projects/blob/_remove.html.haml
deleted file mode 100644
index 7511de76223..00000000000
--- a/app/views/projects/blob/_remove.html.haml
+++ /dev/null
@@ -1,16 +0,0 @@
-#modal-remove-blob.modal
- .modal-dialog
- .modal-content
- .modal-header
- %h1.page-title.gl-font-size-h-display Delete #{@blob.name}
- %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') }
- %span{ "aria-hidden": "true" } &times;
-
- .modal-body
- = form_tag project_blob_path(@project, @id), method: :delete, class: 'js-delete-blob-form js-quick-submit js-requires-input' do
- = render 'shared/new_commit_form', placeholder: "Delete #{@blob.name}"
-
- .form-group.row
- .offset-sm-2.col-sm-10
- = button_tag 'Delete file', class: 'btn gl-button btn-danger btn-remove-file'
- = link_to _('Cancel'), '#', class: "btn gl-button btn-cancel", "data-dismiss" => "modal"
diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml
index a91c0d63b00..16ecc1cc5a0 100644
--- a/app/views/projects/blob/show.html.haml
+++ b/app/views/projects/blob/show.html.haml
@@ -11,8 +11,5 @@
#tree-holder.tree-holder
= render 'blob', blob: @blob
- - if can_modify_blob?(@blob)
- = render 'projects/blob/remove'
-
= render partial: 'pipeline_tour_success' if show_suggest_pipeline_creation_celebration?
= render 'shared/web_ide_path'
diff --git a/app/views/projects/blob/viewers/_stl.html.haml b/app/views/projects/blob/viewers/_stl.html.haml
index 8bf0339fc3c..7206a969fb7 100644
--- a/app/views/projects/blob/viewers/_stl.html.haml
+++ b/app/views/projects/blob/viewers/_stl.html.haml
@@ -3,7 +3,7 @@
= gl_loading_icon(size: "md", css_class: "gl-my-4")
.text-center.gl-mt-3.gl-mb-3.stl-controls
.btn-group
- %button.gl-button.btn.btn-default.btn-sm.js-material-changer{ data: { type: 'wireframe' } }
- Wireframe
- %button.gl-button.btn.btn-default.btn-sm.selected.js-material-changer{ data: { type: 'default' } }
- Solid
+ = render Pajamas::ButtonComponent.new(size: :small, button_options: { class: 'js-material-changer', data: { material: 'wireframe' } }) do
+ = _('Wireframe')
+ = render Pajamas::ButtonComponent.new(size: :small, button_options: { class: 'js-material-changer selected', data: { material: 'default' } }) do
+ = _('Solid')
diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml
index e4ec7a43d61..1477ae66d80 100644
--- a/app/views/projects/branches/_branch.html.haml
+++ b/app/views/projects/branches/_branch.html.haml
@@ -1,9 +1,9 @@
- merged = local_assigns.fetch(:merged, false)
- commit = @repository.commit(branch.dereferenced_target)
- merge_project = merge_request_source_project_for_project(@project)
-%li{ class: "branch-item js-branch-item js-branch-#{branch.name}", data: { name: branch.name } }
+%li{ class: "branch-item gl-display-flex! gl-align-items-center! js-branch-item js-branch-#{branch.name}", data: { name: branch.name } }
.branch-info
- .branch-title
+ .gl-display-flex.gl-align-items-center
= sprite_icon('branch', size: 12, css_class: 'gl-flex-shrink-0')
= link_to project_tree_path(@project, branch.name), class: 'item-title str-truncated-100 ref-name gl-ml-3 qa-branch-name' do
= branch.name
diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml
index c33b9b538f3..bd096ed74f5 100644
--- a/app/views/projects/ci/builds/_build.html.haml
+++ b/app/views/projects/ci/builds/_build.html.haml
@@ -132,4 +132,4 @@
= sprite_icon('play', css_class: 'gl-icon')
- elsif job.retryable?
= link_to retry_project_job_path(job.project, job, return_to: request.original_url), method: :post, title: _('Retry'), class: 'gl-button btn btn-default btn-icon' do
- = sprite_icon('repeat', css_class: 'gl-icon')
+ = sprite_icon('retry', css_class: 'gl-icon')
diff --git a/app/views/projects/commit/_change.html.haml b/app/views/projects/commit/_change.html.haml
index 81a77489075..e04c4ebfda2 100644
--- a/app/views/projects/commit/_change.html.haml
+++ b/app/views/projects/commit/_change.html.haml
@@ -1,3 +1,12 @@
+- can_push_code = can?(current_user, :push_code, @project)
+
+- if !can_push_code && selected_branch.present?
+ - branch_collaboration = @project.branch_allows_collaboration?(current_user, selected_branch)
+ - existing_branch = ERB::Util.html_escape(selected_branch)
+- else
+ - branch_collaboration = false
+ - existing_branch = ''
+
- case type.to_s
- when 'revert'
- revert_merge_request = _('Revert this merge request')
@@ -7,9 +16,9 @@
.js-revert-commit-modal{ data: { title: title,
endpoint: revert_namespace_project_commit_path(commit, namespace_id: @project.namespace.full_path, project_id: @project),
branch: @project.default_branch,
- push_code: can?(current_user, :push_code, @project).to_s,
- branch_collaboration: @project.branch_allows_collaboration?(current_user, selected_branch).to_s,
- existing_branch: ERB::Util.html_escape(selected_branch),
+ push_code: can_push_code.to_s,
+ branch_collaboration: branch_collaboration.to_s,
+ existing_branch: existing_branch,
branches_endpoint: project_branches_path(@project) } }
- when 'cherry-pick'
@@ -20,8 +29,8 @@
branch: @project.default_branch,
target_project_id: @project.id,
target_project_name: @project.full_path,
- push_code: can?(current_user, :push_code, @project).to_s,
- branch_collaboration: @project.branch_allows_collaboration?(current_user, selected_branch).to_s,
- existing_branch: ERB::Util.html_escape(selected_branch),
+ push_code: can_push_code.to_s,
+ branch_collaboration: branch_collaboration.to_s,
+ existing_branch: existing_branch,
branches_endpoint: refs_project_path(@project),
projects: cherry_pick_projects_data(@project).to_json } }
diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml
index 4442f62b221..71485e203db 100644
--- a/app/views/projects/commits/_commit.html.haml
+++ b/app/views/projects/commits/_commit.html.haml
@@ -24,7 +24,7 @@
.avatar-cell.d-none.d-sm-block
= author_avatar(commit, size: 40, has_tooltip: false)
- .commit-detail.flex-list
+ .commit-detail.flex-list.gl-display-flex.gl-justify-content-space-between.gl-align-items-flex-start.gl-flex-grow-1.gl-min-w-0
.commit-content{ data: { qa_selector: 'commit_content' } }
- if view_details && merge_request
= link_to commit.title, project_commit_path(project, commit.id, merge_request_iid: merge_request.iid), class: ["commit-row-message item-title js-onboarding-commit-item", ("font-italic" if commit.message.empty?)]
diff --git a/app/views/projects/diffs/_content.html.haml b/app/views/projects/diffs/_content.html.haml
index 23f9afe8352..780bb3404cc 100644
--- a/app/views/projects/diffs/_content.html.haml
+++ b/app/views/projects/diffs/_content.html.haml
@@ -3,9 +3,9 @@
.diff-content
- if diff_file.has_renderable?
- %div{ id: "#raw-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'toHide' } }
+ .hidden{ id: "#raw-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'rawViewer' } }
= render 'projects/diffs/viewer', viewer: diff_file.viewer
- %div{ id: "#rendered-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'toShow' } }
+ %div{ id: "#rendered-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'renderedViewer' } }
= render 'projects/diffs/viewer', viewer: diff_file.rendered.viewer
- else
= render 'projects/diffs/viewer', viewer: diff_file.viewer
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index 41d6b7086c1..a7dd69a9607 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -5,8 +5,6 @@
- expanded = expanded_by_default?
- reduce_visibility_form_id = 'reduce-visibility-form'
-= render_if_exists 'shared/minute_limit_banner', namespace: @project
-
%section.settings.general-settings.no-animate.expanded#js-general-settings
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Naming, topics, avatar')
@@ -90,7 +88,7 @@
= render 'projects/errors'
= form_for @project do |f|
.form-group
- - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'renaming-a-repository') }
+ - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'rename-a-repository') }
%p= _("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}").html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
%ul
%li= _("Be careful. Renaming a project's repository can have unintended side effects.")
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index ce6d021ce2f..6f2e135f9d3 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -21,10 +21,10 @@
= _('You can get started by cloning the repository or start adding files to it with one of the following options.')
.project-buttons.qa-quick-actions
- .project-clone-holder.d-block.d-md-none.mt-2.mr-2
+ .project-clone-holder.d-block.d-md-none.gl-mt-3.gl-mr-3
= render "shared/mobile_clone_panel"
- .project-clone-holder.d-none.d-md-inline-block.mb-2.mr-2.float-left
+ .project-clone-holder.d-none.d-md-inline-block.gl-mb-3.gl-mr-3.float-left
= render "projects/buttons/clone"
= render 'stat_anchor_list', anchors: @project.empty_repo_statistics_buttons, project_buttons: true
diff --git a/app/views/projects/find_file/show.html.haml b/app/views/projects/find_file/show.html.haml
index af5ad06d30e..2e024b8ffc4 100644
--- a/app/views/projects/find_file/show.html.haml
+++ b/app/views/projects/find_file/show.html.haml
@@ -1,6 +1,6 @@
- page_title _("Find File"), @ref
-.file-finder-holder.tree-holder.clearfix.js-file-finder{ 'data-file-find-url': "#{escape_javascript(project_files_path(@project, @ref, format: :json))}", 'data-find-tree-url': escape_javascript(project_tree_path(@project, @ref)), 'data-blob-url-template': escape_javascript(project_blob_path(@project, @id || @commit.id)) }
+.file-finder-holder.tree-holder.clearfix.js-file-finder{ 'data-file-find-url': "#{escape_javascript(project_files_path(@project, @ref, format: :json))}", 'data-find-tree-url': escape_javascript(project_tree_path(@project, @ref)), 'data-blob-url-template': escape_javascript(project_blob_path(@project, @ref)) }
.nav-block
.tree-ref-holder
= render 'shared/ref_switcher', destination: 'find_file', path: @path
diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml
index 7243852e1f5..36347776ec9 100644
--- a/app/views/projects/forks/new.html.haml
+++ b/app/views/projects/forks/new.html.haml
@@ -4,7 +4,7 @@
endpoint: new_project_fork_path(@project, format: :json),
new_group_path: new_group_path,
project_full_path: project_path(@project),
- visibility_help_path: help_page_path("public_access/public_access"),
+ visibility_help_path: help_page_path("user/public_access"),
project_id: @project.id,
project_name: @project.name,
project_path: @project.path,
diff --git a/app/views/projects/google_cloud/configuration/index.html.haml b/app/views/projects/google_cloud/configuration/index.html.haml
new file mode 100644
index 00000000000..ec977898f47
--- /dev/null
+++ b/app/views/projects/google_cloud/configuration/index.html.haml
@@ -0,0 +1,7 @@
+- add_to_breadcrumbs _('Google Cloud'), @google_cloud_path
+- breadcrumb_title s_('CloudSeed|Configuration')
+- page_title s_('CloudSeed|Configuration')
+
+- @content_class = "limit-container-width" unless fluid_layout
+
+#js-google-cloud-configuration{ data: @js_data }
diff --git a/app/views/projects/google_cloud/databases/index.html.haml b/app/views/projects/google_cloud/databases/index.html.haml
new file mode 100644
index 00000000000..ad732317d8d
--- /dev/null
+++ b/app/views/projects/google_cloud/databases/index.html.haml
@@ -0,0 +1,7 @@
+- add_to_breadcrumbs _('Google Cloud'), @google_cloud_path
+- breadcrumb_title s_('CloudSeed|Databases')
+- page_title s_('CloudSeed|Databases')
+
+- @content_class = "limit-container-width" unless fluid_layout
+
+#js-google-cloud-databases{ data: @js_data }
diff --git a/app/views/projects/google_cloud/deployments/index.html.haml b/app/views/projects/google_cloud/deployments/index.html.haml
new file mode 100644
index 00000000000..b140159a7f5
--- /dev/null
+++ b/app/views/projects/google_cloud/deployments/index.html.haml
@@ -0,0 +1,7 @@
+- add_to_breadcrumbs _('Google Cloud'), @google_cloud_path
+- breadcrumb_title s_('CloudSeed|Deployments')
+- page_title s_('CloudSeed|Deployments')
+
+- @content_class = "limit-container-width" unless fluid_layout
+
+#js-google-cloud-deployments{ data: @js_data }
diff --git a/app/views/projects/google_cloud/errors/gcp_error.html.haml b/app/views/projects/google_cloud/errors/gcp_error.html.haml
deleted file mode 100644
index 69e481501d5..00000000000
--- a/app/views/projects/google_cloud/errors/gcp_error.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-- breadcrumb_title _('Google Cloud')
-- page_title _('Google Cloud')
-
-- @content_class = "limit-container-width" unless fluid_layout
-
-#js-google-cloud{ data: @js_data }
diff --git a/app/views/projects/google_cloud/errors/no_gcp_projects.html.haml b/app/views/projects/google_cloud/errors/no_gcp_projects.html.haml
deleted file mode 100644
index 69e481501d5..00000000000
--- a/app/views/projects/google_cloud/errors/no_gcp_projects.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-- breadcrumb_title _('Google Cloud')
-- page_title _('Google Cloud')
-
-- @content_class = "limit-container-width" unless fluid_layout
-
-#js-google-cloud{ data: @js_data }
diff --git a/app/views/projects/google_cloud/gcp_regions/index.html.haml b/app/views/projects/google_cloud/gcp_regions/index.html.haml
index 3a6f8ca059d..d7cabaa029b 100644
--- a/app/views/projects/google_cloud/gcp_regions/index.html.haml
+++ b/app/views/projects/google_cloud/gcp_regions/index.html.haml
@@ -1,8 +1,8 @@
- add_to_breadcrumbs _('Google Cloud'), @google_cloud_path
-- breadcrumb_title _('Regions')
-- page_title _('Regions')
+- breadcrumb_title _('CloudSeed|Regions')
+- page_title s_('CloudSeed|Regions')
- @content_class = "limit-container-width" unless fluid_layout
= form_tag project_google_cloud_gcp_regions_path(@project), method: 'post' do
- #js-google-cloud{ data: @js_data }
+ #js-google-cloud-gcp-regions{ data: @js_data }
diff --git a/app/views/projects/google_cloud/index.html.haml b/app/views/projects/google_cloud/index.html.haml
deleted file mode 100644
index 69e481501d5..00000000000
--- a/app/views/projects/google_cloud/index.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-- breadcrumb_title _('Google Cloud')
-- page_title _('Google Cloud')
-
-- @content_class = "limit-container-width" unless fluid_layout
-
-#js-google-cloud{ data: @js_data }
diff --git a/app/views/projects/google_cloud/service_accounts/index.html.haml b/app/views/projects/google_cloud/service_accounts/index.html.haml
index 9b82bc0acb5..6191de577fe 100644
--- a/app/views/projects/google_cloud/service_accounts/index.html.haml
+++ b/app/views/projects/google_cloud/service_accounts/index.html.haml
@@ -1,8 +1,8 @@
- add_to_breadcrumbs _('Google Cloud'), @google_cloud_path
-- breadcrumb_title _('Service Account')
-- page_title _('Service Account')
+- breadcrumb_title s_('CloudSeed|Service Account')
+- page_title s_('CloudSeed|Service Account')
- @content_class = "limit-container-width" unless fluid_layout
= form_tag project_google_cloud_service_accounts_path(@project), method: 'post' do
- #js-google-cloud{ data: @js_data }
+ #js-google-cloud-service-accounts{ data: @js_data }
diff --git a/app/views/projects/harbor/repositories/index.html.haml b/app/views/projects/harbor/repositories/index.html.haml
index 270cbf3facd..0fce3b7f8aa 100644
--- a/app/views/projects/harbor/repositories/index.html.haml
+++ b/app/views/projects/harbor/repositories/index.html.haml
@@ -1,7 +1,7 @@
- page_title _("Harbor Registry")
- @content_class = "limit-container-width" unless fluid_layout
-#js-harbor-registry-list-project{ data: { endpoint: project_harbor_registry_index_path(@project),
+#js-harbor-registry-list-project{ data: { endpoint: project_harbor_repositories_path(@project),
"no_containers_image" => image_path('illustrations/docker-empty-state.svg'),
"containers_error_image" => image_path('illustrations/docker-error-state.svg'),
"repository_url" => 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml
index 8096bc6cead..9fe541c5912 100644
--- a/app/views/projects/imports/show.html.haml
+++ b/app/views/projects/imports/show.html.haml
@@ -3,9 +3,10 @@
.save-project-loader
.center
- %h2
+ %h2.gl--flex-center.gl-flex-direction-column.gl-sm-flex-direction-row
= gl_loading_icon(inline: true)
- = import_in_progress_title
+ %span.gl-ml-3
+ = import_in_progress_title
- if !has_ci_cd_only_params? && @project.external_import?
%p.monospace git clone --bare #{@project.safe_import_url}
%p
diff --git a/app/views/projects/incidents/show.html.haml b/app/views/projects/incidents/show.html.haml
index 4d4607e8e36..5043f94bd5c 100644
--- a/app/views/projects/incidents/show.html.haml
+++ b/app/views/projects/incidents/show.html.haml
@@ -2,5 +2,6 @@
- add_to_breadcrumbs _("Incidents"), project_incidents_path(@project)
- breadcrumb_title @issue.to_reference
- page_title "#{@issue.title} (#{@issue.to_reference})", _("Incidents")
+- add_page_specific_style 'page_bundles/issues_show'
= render 'projects/issuable/show', issuable: @issue
diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml
index a904b53515c..16b795ee3c9 100644
--- a/app/views/projects/issues/_discussion.html.haml
+++ b/app/views/projects/issues/_discussion.html.haml
@@ -1,4 +1,4 @@
-- add_page_startup_api_call Feature.enabled?(:paginated_issue_discussions, @project) ? discussions_path(@issue, per_page: 20) : discussions_path(@issue)
+- add_page_startup_api_call discussions_path(@issue, per_page: 20)
- @gfm_form = true
diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml
index 4c96875ce42..4d4645c7087 100644
--- a/app/views/projects/issues/_issue.html.haml
+++ b/app/views/projects/issues/_issue.html.haml
@@ -65,6 +65,9 @@
= render 'shared/issuable_meta_data', issuable: issue
- .float-right.issuable-updated-at.d-none.d-sm-inline-block
+ .float-right.issuable-timestamp.d-none.d-sm-inline-block
%span
- = _('updated %{time_ago}').html_safe % { time_ago: time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago') }
+ - if issue.closed? && issue.closed_at
+ = _('closed %{timeago}').html_safe % { timeago: time_ago_with_tooltip(issue.closed_at, placement: 'bottom') }
+ - else
+ = _('updated %{time_ago}').html_safe % { time_ago: time_ago_with_tooltip(issue.updated_at, placement: 'bottom') }
diff --git a/app/views/projects/issues/_work_item_links.html.haml b/app/views/projects/issues/_work_item_links.html.haml
index 55a8eb720b6..5d478784350 100644
--- a/app/views/projects/issues/_work_item_links.html.haml
+++ b/app/views/projects/issues/_work_item_links.html.haml
@@ -1,2 +1,2 @@
- if Feature.enabled?(:work_items_hierarchy, @project)
- .js-work-item-links-root{ data: { issuable_id: @issue.id } }
+ .js-work-item-links-root{ data: { issuable_id: @issue.id, project_path: @project.full_path } }
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index 3572d1d6556..06c422fc4d6 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -3,6 +3,7 @@
- breadcrumb_title @issue.to_reference
- page_title "#{@issue.title} (#{@issue.to_reference})", _("Issues")
- add_page_specific_style 'page_bundles/issues_show'
+- add_page_specific_style 'page_bundles/work_items'
= render 'projects/issuable/show', issuable: @issue, api_awards_path: award_emoji_issue_api_path(@issue)
= render 'projects/invite_members_modal', project: @project
diff --git a/app/views/projects/jobs/index.html.haml b/app/views/projects/jobs/index.html.haml
index dfea4db4d07..d39d292fb53 100644
--- a/app/views/projects/jobs/index.html.haml
+++ b/app/views/projects/jobs/index.html.haml
@@ -2,12 +2,4 @@
- add_page_specific_style 'page_bundles/ci_status'
- admin = local_assigns.fetch(:admin, false)
-- if Feature.enabled?(:jobs_table_vue, @project)
- #js-jobs-table{ data: { admin: admin, full_path: @project.full_path, job_statuses: job_statuses.to_json, pipeline_editor_path: project_ci_pipeline_editor_path(@project), empty_state_svg_path: image_path('jobs-empty-state.svg') } }
-- else
- .top-area
- - build_path_proc = ->(scope) { project_jobs_path(@project, scope: scope) }
- = render "shared/builds/tabs", build_path_proc: build_path_proc, all_builds: @all_builds, scope: @scope
-
- .content-list.builds-content-list
- = render "table", builds: @builds, project: @project
+#js-jobs-table{ data: { admin: admin, full_path: @project.full_path, job_statuses: job_statuses.to_json, pipeline_editor_path: project_ci_pipeline_editor_path(@project), empty_state_svg_path: image_path('jobs-empty-state.svg') } }
diff --git a/app/views/projects/jobs/show.html.haml b/app/views/projects/jobs/show.html.haml
index fedc1291a92..5f249f693ff 100644
--- a/app/views/projects/jobs/show.html.haml
+++ b/app/views/projects/jobs/show.html.haml
@@ -7,7 +7,4 @@
= render_if_exists "shared/shared_runners_minutes_limit_flash_message"
-- if @build.is_a? ::Ci::Build
- #js-job-page{ data: jobs_data }
-- else
- #js-bridge-page{ data: bridge_data(@build, @project) }
+#js-job-page{ data: jobs_data }
diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml
index dd63e854a36..647464b31f8 100644
--- a/app/views/projects/labels/index.html.haml
+++ b/app/views/projects/labels/index.html.haml
@@ -4,7 +4,6 @@
- subscribed = params[:subscribed]
- labels_or_filters = @labels.exists? || @prioritized_labels.exists? || search.present? || subscribed.present?
-= render_if_exists 'shared/minute_limit_banner', namespace: @project
- if labels_or_filters
#js-promote-label-modal
= render 'shared/labels/nav', labels_or_filters: labels_or_filters, can_admin_label: can_admin_label
diff --git a/app/views/projects/logs/empty_logs.html.haml b/app/views/projects/logs/empty_logs.html.haml
deleted file mode 100644
index 48403f5e55e..00000000000
--- a/app/views/projects/logs/empty_logs.html.haml
+++ /dev/null
@@ -1,14 +0,0 @@
-- page_title _('Logs')
-
-.row.empty-state
- .col-sm-12
- .svg-content
- = image_tag 'illustrations/operations_log_pods_empty.svg'
- .col-12
- .text-content
- %h4.text-center
- = s_('Environments|No deployed environments')
- %p.state-description.text-center
- = s_('Logs|To see the logs, deploy your code to an environment.')
- .text-center
- = link_to s_('Environments|Learn about environments'), help_page_path('ci/environments/index.md'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/projects/logs/index.html.haml b/app/views/projects/logs/index.html.haml
deleted file mode 100644
index 1f74eb52fd9..00000000000
--- a/app/views/projects/logs/index.html.haml
+++ /dev/null
@@ -1 +0,0 @@
-#environment-logs{ data: environment_logs_data(@project, @environment) }
diff --git a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml
index a0810cfe37d..6b367c735c3 100644
--- a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml
+++ b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml
@@ -26,7 +26,7 @@
.gl-new-dropdown-item-text-wrapper
= _('Close')
= display_issuable_type
- - elsif !@merge_request.source_project_missing?
+ - elsif !@merge_request.source_project_missing? && @merge_request.closed?
%li.gl-new-dropdown-item
= link_to reopen_issuable_path(@merge_request), method: :put, class: 'dropdown-item' do
.gl-new-dropdown-item-text-wrapper
@@ -34,7 +34,7 @@
= display_issuable_type
- unless current_controller?('conflicts')
- - if current_user && moved_mr_sidebar_enabled?
+ - if current_user && moved_mr_sidebar_enabled? && !@merge_request.merged?
%li.gl-new-dropdown-divider
%hr.dropdown-divider
%li.gl-new-dropdown-item.js-sidebar-subscriptions-entry-point
diff --git a/app/views/projects/merge_requests/_commits.html.haml b/app/views/projects/merge_requests/_commits.html.haml
index 14ddaf8d2b7..7cadc37b0fd 100644
--- a/app/views/projects/merge_requests/_commits.html.haml
+++ b/app/views/projects/merge_requests/_commits.html.haml
@@ -8,7 +8,7 @@
- if can_update_merge_request
%p
= _('Push commits to the source branch or add previously merged commits to review them.')
- %button.btn.gl-button.btn-confirm.add-review-item-modal-trigger{ type: "button", data: { commits_empty: 'true', context_commits_empty: 'true' } }
+ = render Pajamas::ButtonComponent.new(variant: 'confirm', button_options: { class: 'add-review-item-modal-trigger', data: { commits_empty: 'true', context_commits_empty: 'true' } }) do
= _('Add previously merged commits')
- else
%ol#commits-list.list-unstyled
diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml
index 4f4acb6103f..893f03157db 100644
--- a/app/views/projects/merge_requests/_mr_title.html.haml
+++ b/app/views/projects/merge_requests/_mr_title.html.haml
@@ -3,7 +3,7 @@
- can_reopen_merge_request = can?(current_user, :reopen_merge_request, @merge_request)
- are_close_and_open_buttons_hidden = merge_request_button_hidden?(@merge_request, true) && merge_request_button_hidden?(@merge_request, false)
- hide_gutter_toggle = local_assigns.fetch(:hide_gutter_toggle, false)
-- cache_key = [@project, @merge_request, can_update_merge_request, can_reopen_merge_request, are_close_and_open_buttons_hidden, current_user&.preferred_language, "1.1-updated_header", moved_mr_sidebar_enabled?, hide_gutter_toggle]
+- cache_key = [@project, @merge_request, can_update_merge_request, can_reopen_merge_request, are_close_and_open_buttons_hidden, current_user&.preferred_language, "1.1-updated_header", moved_mr_sidebar_enabled?, hide_gutter_toggle, fluid_layout]
= cache(cache_key, expires_in: 1.day) do
- if @merge_request.closed_or_merged_without_fork?
diff --git a/app/views/projects/merge_requests/creations/_new_compare.html.haml b/app/views/projects/merge_requests/creations/_new_compare.html.haml
index 8cd0d2f9e32..cee8d2e92aa 100644
--- a/app/views/projects/merge_requests/creations/_new_compare.html.haml
+++ b/app/views/projects/merge_requests/creations/_new_compare.html.haml
@@ -67,5 +67,5 @@
%ul.list-unstyled.mr_target_commit
- if @merge_request.errors.any?
- = form_errors(@merge_request)
+ = form_errors(@merge_request, pajamas_alert: true)
= f.submit 'Compare branches and continue', class: "gl-button btn btn-confirm mr-compare-btn gl-mt-4", data: { qa_selector: "compare_branches_button" }
diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml
index 99b84339058..4ef557fbd8f 100644
--- a/app/views/projects/merge_requests/show.html.haml
+++ b/app/views/projects/merge_requests/show.html.haml
@@ -99,6 +99,9 @@
#js-review-bar
+- if Feature.enabled?(:mr_experience_survey, @project)
+ #js-mr-experience-survey
+
- if current_user&.mr_attention_requests_enabled?
#js-need-attention-sidebar-onboarding
diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml
index 5f2057df4aa..9b0508d8cb5 100644
--- a/app/views/projects/milestones/_form.html.haml
+++ b/app/views/projects/milestones/_form.html.haml
@@ -1,6 +1,6 @@
= form_for [@project, @milestone],
html: { class: 'milestone-form common-note-form js-quick-submit js-requires-input' } do |f|
- = form_errors(@milestone)
+ = form_errors(@milestone, pajamas_alert: true)
.form-group.row
.col-form-label.col-sm-2
= f.label :title, _('Title')
diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml
index 339042eb703..a90d5224d04 100644
--- a/app/views/projects/mirrors/_mirror_repos.html.haml
+++ b/app/views/projects/mirrors/_mirror_repos.html.haml
@@ -17,7 +17,7 @@
= gitlab_ui_form_for @project, url: project_mirror_path(@project), html: { class: 'gl-show-field-errors js-mirror-form', autocomplete: 'new-password', data: mirrors_form_data_attributes } do |f|
.panel.panel-default
.panel-body
- %div= form_errors(@project)
+ %div= form_errors(@project, pajamas_alert: true)
.form-group.has-feedback
= label_tag :url, _('Git repository URL'), class: 'label-light'
diff --git a/app/views/projects/mirrors/_ssh_host_keys.html.haml b/app/views/projects/mirrors/_ssh_host_keys.html.haml
index e3fe098c807..d367f383e5a 100644
--- a/app/views/projects/mirrors/_ssh_host_keys.html.haml
+++ b/app/views/projects/mirrors/_ssh_host_keys.html.haml
@@ -11,7 +11,7 @@
= _('Fingerprints')
.fingerprints-list.js-fingerprints-list{ data: { qa_selector: 'fingerprints_list' } }
- mirror.ssh_known_hosts_fingerprints.each do |fp|
- %code= fp.fingerprint
+ %code= fp.fingerprint_sha256 || fp.fingerprint
- if verified_at
.form-text.text-muted.js-fingerprint-verification
= sprite_icon('check', css_class: 'gl-text-green-500')
diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml
index 511adf37b39..07c38d9845c 100644
--- a/app/views/projects/new.html.haml
+++ b/app/views/projects/new.html.haml
@@ -12,7 +12,7 @@
.row{ 'v-cloak': true }
#blank-project-pane.tab-pane.active
- = form_for @project, html: { class: 'new_project gl-mt-3' } do |f|
+ = gitlab_ui_form_for @project, html: { class: 'new_project gl-mt-3' } do |f|
= render 'new_project_fields', f: f, project_name_id: "blank-project-name"
#create-from-template-pane.tab-pane
@@ -22,7 +22,7 @@
- contributing_templates_url = 'https://gitlab.com/gitlab-org/project-templates/contributing'
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: contributing_templates_url }
= _('Learn how to %{link_start}contribute to the built-in templates%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- = form_for @project, html: { class: 'new_project' } do |f|
+ = gitlab_ui_form_for @project, html: { class: 'new_project' } do |f|
.project-template
.form-group
%div
diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml
index 54435f675a7..07e299d71ea 100644
--- a/app/views/projects/pipelines/_info.html.haml
+++ b/app/views/projects/pipelines/_info.html.haml
@@ -6,9 +6,9 @@
= preserve(markdown(commit.description, pipeline: :single_line))
.info-well
- .well-segment.pipeline-info
- .icon-container.gl-vertical-align-text-bottom
- = sprite_icon('clock')
+ .well-segment.pipeline-info{ class: "gl-align-items-baseline!" }
+ .icon-container
+ = sprite_icon('clock', css_class: 'gl-top-0!')
= pluralize @pipeline.total_size, "job"
= @pipeline.ref_text
- if @pipeline.duration
@@ -20,7 +20,7 @@
- if has_pipeline_badges?(@pipeline)
.well-segment.qa-pipeline-badges
.icon-container
- = sprite_icon('flag')
+ = sprite_icon('flag', css_class: 'gl-top-0!')
- if @pipeline.child?
- text = sprintf(s_('Pipelines|Child pipeline (%{link_start}parent%{link_end})'), { link_start: "<a href='#{pipeline_path(@pipeline.triggered_by_pipeline)}' class='text-underline'>", link_end: "</a>"}).html_safe
= gl_badge_tag text, { variant: :info, size: :sm }, { class: 'js-pipeline-child has-tooltip', title: s_("Pipelines|This is a child pipeline within the parent pipeline") }
@@ -44,13 +44,13 @@
.well-segment.branch-info
.icon-container.commit-icon
- = custom_icon("icon_commit")
+ = sprite_icon('commit', css_class: 'gl-top-0!')
= link_to commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha"
= clipboard_button(text: @pipeline.sha, title: _("Copy commit SHA"))
.well-segment.related-merge-request-info
.icon-container
- = sprite_icon("git-merge")
+ = sprite_icon("git-merge", css_class: 'gl-top-0!')
%span.related-merge-requests
%span.js-truncated-mr-list
= @pipeline.all_related_merge_request_text(limit: 1)
diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml
index 10ff9c31c3e..c9eb2e92193 100644
--- a/app/views/projects/pipelines/show.html.haml
+++ b/app/views/projects/pipelines/show.html.haml
@@ -27,7 +27,7 @@
= s_('You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}').html_safe % { gitlab_ci_yml: '.gitlab-ci.yml', lint_link_start: lint_link_start, lint_link_end: '</a>'.html_safe }
- if Feature.enabled?(:pipeline_tabs_vue, @project)
- #js-pipeline-tabs{ data: js_pipeline_tabs_data(@project, @pipeline) }
+ #js-pipeline-tabs{ data: js_pipeline_tabs_data(@project, @pipeline, @current_user) }
- else
= render "projects/pipelines/with_tabs", pipeline: @pipeline, stages: @stages, pipeline_has_errors: pipeline_has_errors
.js-pipeline-details-vue{ data: { metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: @project.namespace, project_id: @project, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid, graphql_resource_etag: graphql_etag_pipeline_path(@pipeline) } }
diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml
index 8c616b89658..37fe80d2aaf 100644
--- a/app/views/projects/project_members/index.html.haml
+++ b/app/views/projects/project_members/index.html.haml
@@ -2,47 +2,45 @@
- page_title _("Members")
= render_if_exists 'projects/free_user_cap_alert', project: @project
-= render_if_exists 'shared/minute_limit_banner', namespace: @project
.row.gl-mt-3
.col-lg-12
- - if can_invite_members_for_project?(@project)
- .row
- .col-md-12.col-lg-6.gl-display-flex
- .gl-flex-direction-column.gl-flex-wrap.align-items-baseline
- %h4
- = _("Project members")
- .gl-justify-content-bottom.gl-display-flex.align-items-center
- %p
- = project_member_header_subtext(@project)
- .col-md-12.col-lg-6
- .gl-display-flex.gl-flex-wrap.gl-justify-content-end
- - if can_admin_project_member?(@project)
- .js-import-a-project-modal{ data: { project_id: @project.id, project_name: @project.name } }
- - if @project.allowed_to_share_with_group?
- .js-invite-group-trigger{ data: { classes: 'gl-mt-3 gl-sm-w-auto gl-w-full gl-sm-ml-3', display_text: _('Invite a group') } }
- = render 'projects/invite_groups_modal', project: @project
- - if can_admin_project_member?(@project)
- .js-invite-members-trigger{ data: { variant: 'confirm',
- classes: 'gl-mt-3 gl-sm-w-auto gl-w-full gl-sm-ml-3',
- trigger_source: 'project-members-page',
- display_text: _('Invite members') } }
- = render 'projects/invite_members_modal', project: @project
-
- - else
- - if project_can_be_shared?
+ .gl-display-flex.gl-flex-wrap
+ - if can_invite_members_for_project?(@project)
%h4
= _("Project members")
- - if can?(current_user, :admin_project_member, @project)
- %p
- = project_member_header_subtext(@project)
- - else
- %p
- = html_escape(_("Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}")) % { i_open: '<i>'.html_safe, i_close: '</i>'.html_safe }
+ %p.gl-w-full.order-md-1
+ = project_member_header_subtext(@project)
+ .gl-display-flex.gl-flex-wrap.gl-align-items-flex-start.gl-ml-auto.gl-md-w-auto.gl-w-full.gl-mt-3
+ - invite_group_top_margin = ''
+ - if can_admin_project_member?(@project)
+ .js-import-project-members-trigger{ data: { classes: 'gl-md-w-auto gl-w-full' } }
+ .js-import-project-members-modal{ data: { project_id: @project.id, project_name: @project.name } }
+ - invite_group_top_margin = 'gl-md-mt-0 gl-mt-3'
+ - if @project.allowed_to_share_with_group?
+ .js-invite-group-trigger{ data: { classes: "gl-md-w-auto gl-w-full gl-md-ml-3 #{invite_group_top_margin}", display_text: _('Invite a group') } }
+ = render 'projects/invite_groups_modal', project: @project
+ - if can_admin_project_member?(@project)
+ .js-invite-members-trigger{ data: { variant: 'confirm',
+ classes: 'gl-md-w-auto gl-w-full gl-md-ml-3 gl-md-mt-0 gl-mt-3',
+ trigger_source: 'project-members-page',
+ display_text: _('Invite members') } }
+ = render 'projects/invite_members_modal', project: @project
+ - else
+ - if project_can_be_shared?
+ %h4
+ = _("Project members")
+ - if can?(current_user, :admin_project_member, @project)
+ %p.gl-w-full
+ = project_member_header_subtext(@project)
+ - else
+ %p.gl-w-full
+ = html_escape(_("Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}")) % { i_open: '<i>'.html_safe, i_close: '</i>'.html_safe }
.js-project-members-list-app{ data: { members_data: project_members_app_data_json(@project,
members: @project_members,
- group_links: @group_links,
invited: @invited_members,
- access_requests: @requesters) } }
+ access_requests: @requesters,
+ include_relations: @include_relations,
+ search: params[:search_groups]) } }
= gl_loading_icon(css_class: 'gl-my-5', size: 'md')
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 e5810930be2..3b8294a1dec 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
@@ -1,29 +1,29 @@
= form_for [@project, @protected_branch], html: { class: 'new-protected-branch js-new-protected-branch' } do |f|
%input{ type: 'hidden', name: 'update_section', value: 'js-protected-branches-settings' }
.card
- .card-header
+ .card-header.gl-font-weight-bold
= s_("ProtectedBranch|Protect a branch")
.card-body
- = form_errors(@protected_branch)
+ = form_errors(@protected_branch, pajamas_alert: true)
.form-group.row
- = f.label :name, s_('ProtectedBranch|Branch:'), class: 'col-md-2 text-left text-md-right'
- .col-md-10
- = render partial: "projects/protected_branches/shared/dropdown", locals: { f: f }
+ = f.label :name, s_('ProtectedBranch|Branch:'), class: 'col-sm-12'
+ .col-sm-12
+ = render partial: "projects/protected_branches/shared/dropdown", locals: { f: f, toggle_classes: 'gl-w-full! gl-form-input-lg' }
.form-text.text-muted
- 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
- = f.label :merge_access_levels_attributes, s_("ProtectedBranch|Allowed to merge:"), class: 'col-md-2 text-left text-md-right'
- .col-md-10
+ = f.label :merge_access_levels_attributes, s_("ProtectedBranch|Allowed to merge:"), class: 'col-sm-12'
+ .col-sm-12
= yield :merge_access_levels
.form-group.row
- = f.label :push_access_levels_attributes, s_("ProtectedBranch|Allowed to push:"), class: 'col-md-2 text-left text-md-right'
- .col-md-10
+ = f.label :push_access_levels_attributes, s_("ProtectedBranch|Allowed to push:"), class: 'col-sm-12'
+ .col-sm-12
= yield :push_access_levels
.form-group.row
- = f.label :allow_force_push, s_("ProtectedBranch|Allowed to force push:"), class: 'col-md-2 gl-text-left text-md-right'
- .col-md-10
+ = f.label :allow_force_push, s_("ProtectedBranch|Allowed to force push:"), class: 'col-sm-12'
+ .col-sm-12
= render Pajamas::ToggleComponent.new(classes: 'js-force-push-toggle',
label: s_("ProtectedBranch|Allowed to force push"),
label_position: :hidden) do
diff --git a/app/views/projects/protected_branches/shared/_dropdown.html.haml b/app/views/projects/protected_branches/shared/_dropdown.html.haml
index 67a6e8efae8..4b09d36e7c3 100644
--- a/app/views/projects/protected_branches/shared/_dropdown.html.haml
+++ b/app/views/projects/protected_branches/shared/_dropdown.html.haml
@@ -1,8 +1,12 @@
+- toggle_classes = local_assigns.fetch(:toggle_classes, '')
+
= f.hidden_field(:name)
= dropdown_tag('Select branch or create wildcard',
- options: { toggle_class: 'js-protected-branch-select js-filter-submit wide monospace qa-protected-branch-select',
- filter: true, dropdown_class: "dropdown-menu-selectable git-revision-dropdown qa-protected-branch-dropdown", placeholder: "Search protected branches",
+ options: { toggle_class: "js-protected-branch-select js-filter-submit wide monospace qa-protected-branch-select #{toggle_classes}",
+ filter: true,
+ dropdown_class: "dropdown-menu-selectable git-revision-dropdown qa-protected-branch-dropdown",
+ placeholder: "Search protected branches",
footer_content: true,
data: { show_no: true, show_any: true, show_upcoming: true,
selected: params[:protected_branch_name],
diff --git a/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml b/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml
index ba0935fff7d..e257117a32e 100644
--- a/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml
+++ b/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml
@@ -4,7 +4,7 @@
.card-header
= _('Protect a tag')
.card-body
- = form_errors(@protected_tag)
+ = form_errors(@protected_tag, pajamas_alert: true)
.form-group.row
= f.label :name, _('Tag:'), class: 'col-md-2 text-left text-md-right'
.col-md-10.protected-tags-dropdown
diff --git a/app/views/projects/settings/_archive.html.haml b/app/views/projects/settings/_archive.html.haml
index 8a080241513..2f97a068b49 100644
--- a/app/views/projects/settings/_archive.html.haml
+++ b/app/views/projects/settings/_archive.html.haml
@@ -7,14 +7,14 @@
- else
= _('Archive project')
- if @project.archived?
- - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'unarchiving-a-project') }
+ - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'unarchive-a-project') }
%p= _("Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, link_start: link_start, link_end: '</a>'.html_safe }
= link_to _('Unarchive project'), unarchive_project_path(@project),
aria: { label: _('Unarchive project') },
data: { confirm: _("Are you sure that you want to unarchive this project?"), qa_selector: 'unarchive_project_link' },
method: :post, class: "gl-button btn btn-confirm"
- else
- - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'archiving-a-project') }
+ - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'archive-a-project') }
%p= _("Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, link_start: link_start, link_end: '</a>'.html_safe }
= link_to _('Archive project'), archive_project_path(@project),
aria: { label: _('Archive project') },
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 96564e44cf2..64f45ec89d1 100644
--- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
@@ -16,7 +16,7 @@
.row
.col-lg-12
= gitlab_ui_form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'autodevops-settings') do |f|
- = form_errors(@project)
+ = form_errors(@project, pajamas_alert: true)
%fieldset.builds-feature.js-auto-devops-settings
.form-group
= f.fields_for :auto_devops_attributes, @auto_devops do |form|
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index 9419dacc16f..50e96528c0d 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -6,7 +6,7 @@
.row.gl-mt-3
.col-lg-12
= gitlab_ui_form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'js-general-pipeline-settings') do |f|
- = form_errors(@project)
+ = form_errors(@project, pajamas_alert: true)
%fieldset.builds-feature
.form-group
= f.gitlab_ui_checkbox_component :public_builds,
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index 5da3d2b891c..09f9ca60b3e 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -109,13 +109,15 @@
= render 'ci/token_access/index'
- if show_secure_files_setting(@project, current_user)
- %section.settings
+ %section.settings.no-animate#js-secure-files{ class: ('expanded' if expanded) }
.settings-header
- %h4.settings-title
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("Secure Files")
- = button_to project_ci_secure_files_path(@project), method: :get, class: 'btn gl-button btn-default' do
- = _('Manage')
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
+ = expanded ? _('Collapse') : _('Expand')
%p
= _("Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates.")
= link_to _('Learn more'), help_page_path('ci/secure_files/index'), target: '_blank', rel: 'noopener noreferrer'
+ .settings-content
+ #js-ci-secure-files{ data: { project_id: @project.id, admin: can?(current_user, :admin_secure_files, @project).to_s, file_size_limit: Ci::SecureFile::FILE_SIZE_LIMIT.to_mb } }
diff --git a/app/views/projects/settings/operations/_tracing.html.haml b/app/views/projects/settings/operations/_tracing.html.haml
deleted file mode 100644
index 3c8ebe3fb20..00000000000
--- a/app/views/projects/settings/operations/_tracing.html.haml
+++ /dev/null
@@ -1,24 +0,0 @@
-- setting = tracing_setting
-
-%section.settings.border-0.no-animate
- .settings-header{ :class => 'border-top' }
- %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
- = _('Tracing')
- = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
- = _('Expand')
- %p
- = _('Embed an image of your existing Jaeger server in GitLab.')
- = link_to _('Learn more.'), help_page_path('operations/tracing'), target: '_blank', rel: 'noopener noreferrer'
- .settings-content
- = form_for @project, url: project_settings_operations_path(@project), method: :patch do |f|
- = form_errors(@project)
- .form-group
- = f.fields_for :tracing_setting_attributes, setting do |form|
- = form.label :external_url, _('Jaeger URL'), class: 'label-bold'
- = form.url_field :external_url, class: 'form-control gl-form-input', placeholder: 'https://jaeger.example.com'
- %p.form-text.text-muted
- - jaeger_help_url = 'https://www.jaegertracing.io/docs/getting-started/'
- - link_start_tag = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: jaeger_help_url }
- - link_end_tag = "#{sprite_icon('external-link', css_class: 'gl-ml-2 gl-vertical-align-middle')}</a>".html_safe
- = _('Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}.').html_safe % { link_start_tag: link_start_tag, link_end_tag: link_end_tag }
- = f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml
index 80c22604e49..50bfd3c6976 100644
--- a/app/views/projects/settings/operations/show.html.haml
+++ b/app/views/projects/settings/operations/show.html.haml
@@ -16,11 +16,10 @@
.gl-alert-body
%p
= html_escape(s_('Deprecations|The metrics feature was deprecated in GitLab 14.7.'))
- = html_escape(s_('Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0.')) % {removal_link_start: removal_epic_link_start, link_end: link_end } if Feature.enabled?(:monitor_tracing, @project)
+ = html_escape(s_('Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0.')) % {removal_link_start: removal_epic_link_start, link_end: link_end }
= html_escape(s_('Deprecations|For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}.')) % {opstrace_link_start: opstrace_link_start, link_end: link_end }
= render 'projects/settings/operations/metrics_dashboard'
-= render 'projects/settings/operations/tracing' if Feature.enabled?(:monitor_tracing, @project)
= render 'projects/settings/operations/error_tracking'
= render 'projects/settings/operations/alert_management'
= render 'projects/settings/operations/incidents'
diff --git a/app/views/projects/settings/packages_and_registries/show.html.haml b/app/views/projects/settings/packages_and_registries/show.html.haml
index 378bb0f9306..1a7821d3268 100644
--- a/app/views/projects/settings/packages_and_registries/show.html.haml
+++ b/app/views/projects/settings/packages_and_registries/show.html.haml
@@ -8,6 +8,8 @@
keep_n_options: keep_n_options.to_json,
older_than_options: older_than_options.to_json,
is_admin: current_user&.admin.to_s,
+ show_container_registry_settings: show_container_registry_settings(@project).to_s,
+ show_package_registry_settings: show_package_registry_settings(@project).to_s,
admin_settings_path: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'),
enable_historic_entries: container_expiration_policies_historic_entry_enabled?.to_s,
help_page_path: help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'cleanup-policy'),
diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml
index 290ef79f261..1f529849b28 100644
--- a/app/views/projects/show.html.haml
+++ b/app/views/projects/show.html.haml
@@ -7,7 +7,6 @@
= auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity")
= render_if_exists 'projects/free_user_cap_alert', project: @project
-= render_if_exists 'shared/minute_limit_banner', namespace: @project
= render partial: 'flash_messages', locals: { project: @project }
= render 'clusters_deprecation_alert'
diff --git a/app/views/projects/tags/_edit_release_button.html.haml b/app/views/projects/tags/_edit_release_button.html.haml
new file mode 100644
index 00000000000..5bdf1c7896c
--- /dev/null
+++ b/app/views/projects/tags/_edit_release_button.html.haml
@@ -0,0 +1,11 @@
+- if Feature.enabled?(:edit_tag_release_notes_via_release_page, project)
+ - release_btn_text = s_('TagsPage|Create release')
+ - release_btn_path = new_project_release_path(project, tag_name: tag.name)
+ - if release
+ - release_btn_text = s_('TagsPage|Edit release')
+ - release_btn_path = edit_project_release_path(project, release)
+ = link_to release_btn_path, class: 'btn gl-button btn-default btn-icon btn-edit has-tooltip', title: release_btn_text, data: { container: "body" } do
+ = sprite_icon('pencil', css_class: 'gl-icon')
+- else
+ = link_to edit_project_tag_release_path(project, tag.name), class: 'btn gl-button btn-default btn-icon btn-edit has-tooltip', title: s_('TagsPage|Edit release notes'), data: { container: "body" } do
+ = sprite_icon('pencil', css_class: 'gl-icon')
diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml
index 7654150509e..258f662420b 100644
--- a/app/views/projects/tags/_tag.html.haml
+++ b/app/views/projects/tags/_tag.html.haml
@@ -40,6 +40,5 @@
= render 'projects/buttons/download', project: @project, ref: tag.name, pipeline: @tags_pipelines[tag.name]
- if can?(current_user, :admin_tag, @project)
- = link_to edit_project_tag_release_path(@project, tag.name), class: 'btn gl-button btn-default btn-icon btn-edit has-tooltip', title: s_('TagsPage|Edit release notes'), data: { container: "body" } do
- = sprite_icon('pencil', css_class: 'gl-icon')
+ = render 'edit_release_button', tag: tag, project: @project, release: release
= render 'projects/buttons/remove_tag', project: @project, tag: tag
diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml
index 2a68ad37c1e..24da8e2db87 100644
--- a/app/views/projects/tags/show.html.haml
+++ b/app/views/projects/tags/show.html.haml
@@ -41,8 +41,7 @@
- if @tag.has_signature?
= render partial: 'projects/commit/signature', object: @tag.signature
- if can?(current_user, :admin_tag, @project)
- = link_to edit_project_tag_release_path(@project, @tag.name), class: 'btn btn-icon btn-edit gl-button btn-default controls-item has-tooltip', title: s_('TagsPage|Edit release notes') do
- = sprite_icon("pencil", css_class: 'gl-icon')
+ = render 'edit_release_button', tag: @tag, project: @project, release: @release
= link_to project_tree_path(@project, @tag.name), class: 'btn btn-icon gl-button btn-default controls-item has-tooltip', title: s_('TagsPage|Browse files') do
= sprite_icon('folder-open', css_class: 'gl-icon')
= link_to project_commits_path(@project, @tag.name), class: 'btn btn-icon gl-button btn-default controls-item has-tooltip', title: s_('TagsPage|Browse commits') do
@@ -58,7 +57,7 @@
= strip_signature(@tag.message)
.gl-mb-3.gl-mt-3
- - if @release.description.present?
+ - if @release&.description.present?
.description.md{ data: { qa_selector: 'tag_release_notes_content' } }
= markdown_field(@release, :description)
- else
diff --git a/app/views/projects/tracings/_tracing_button.html.haml b/app/views/projects/tracings/_tracing_button.html.haml
deleted file mode 100644
index fe3af1c6a1a..00000000000
--- a/app/views/projects/tracings/_tracing_button.html.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-= link_to project_settings_operations_path(@project), title: _('Configure Tracing'), class: 'gl-button btn btn-confirm' do
- = _('Add Jaeger URL')
diff --git a/app/views/projects/tracings/show.html.haml b/app/views/projects/tracings/show.html.haml
deleted file mode 100644
index 61f2cd8ac7f..00000000000
--- a/app/views/projects/tracings/show.html.haml
+++ /dev/null
@@ -1,50 +0,0 @@
-- @content_class = "limit-container-width" unless fluid_layout
-- page_title _("Tracing")
-
-.gl-alert.gl-alert-danger.gl-mb-5
- - removal_epic_link_url = 'https://gitlab.com/groups/gitlab-org/-/epics/7188'
- - removal_epic_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="gl-link">'.html_safe % { url: removal_epic_link_url }
- - opstrace_link_url = 'https://gitlab.com/groups/gitlab-org/-/epics/6976'
- - opstrace_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="gl-link">'.html_safe % { url: opstrace_link_url }
- - link_end = '</a>'.html_safe
- .gl-alert-container
- = sprite_icon('error', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content
- .gl-alert-title
- = s_('Deprecations|Feature deprecation and removal')
- .gl-alert-body
- %p
- = html_escape(s_('Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}.')) % {removal_link_start: removal_epic_link_start, opstrace_link_start: opstrace_link_start, link_end: link_end }
-
-- if @project.tracing_external_url.present?
- %h1.page-title.gl-font-size-h-display= _('Tracing')
- .gl-alert.gl-alert-info.gl-mb-5
- .gl-alert-container
- = sprite_icon('information-o', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content
- .gl-alert-body
- = _("Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse.")
- - jaeger_link = link_to('Jaeger tracing', 'https://www.jaegertracing.io/', target: "_blank", rel: "noreferrer")
- %p.light= _("GitLab uses %{jaeger_link} to monitor distributed systems.").html_safe % { jaeger_link: jaeger_link }
-
-
- .card
- - iframe_permissions = "allow-forms allow-scripts allow-same-origin allow-popups"
- %iframe.border-0{ src: sanitize(@project.tracing_external_url, scrubber: Rails::Html::TextOnlyScrubber.new), width: '100%', height: 970, sandbox: iframe_permissions }
-- else
- .row.empty-state
- .col-12
- .svg-content
- = image_tag 'illustrations/monitoring/tracing.svg'
-
- .col-12
- .text-content
- %h4.text-left= _('Troubleshoot and monitor your application with tracing')
- %p
- - jaeger_help_url = "https://www.jaegertracing.io/docs/getting-started/"
- - link_start_tag = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: jaeger_help_url }
- - link_end_tag = "#{sprite_icon('external-link', css_class: 'ml-1 vertical-align-middle')}</a>".html_safe
- = _('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}.').html_safe % { link_start_tag: link_start_tag, link_end_tag: link_end_tag }
-
- .text-center
- = render 'tracing_button'
diff --git a/app/views/projects/triggers/_form.html.haml b/app/views/projects/triggers/_form.html.haml
index 9043b8e60fc..d24cfd61052 100644
--- a/app/views/projects/triggers/_form.html.haml
+++ b/app/views/projects/triggers/_form.html.haml
@@ -1,5 +1,5 @@
= form_for [@project, @trigger], html: { class: 'gl-show-field-errors' } do |f|
- = form_errors(@trigger)
+ = form_errors(@trigger, pajamas_alert: true)
- if @trigger.token
.form-group
diff --git a/app/views/projects/work_items/index.html.haml b/app/views/projects/work_items/index.html.haml
index 1f36afc48aa..8575fd10ad3 100644
--- a/app/views/projects/work_items/index.html.haml
+++ b/app/views/projects/work_items/index.html.haml
@@ -1,3 +1,5 @@
- page_title s_('WorkItem|Work Items')
+- add_page_specific_style 'page_bundles/work_items'
#js-work-items{ data: work_items_index_data(@project) }
+= render 'projects/invite_members_modal', project: @project
diff --git a/app/views/pwa/offline.html.haml b/app/views/pwa/offline.html.haml
index 5eae546bea9..cd1fca5d2b5 100644
--- a/app/views/pwa/offline.html.haml
+++ b/app/views/pwa/offline.html.haml
@@ -1,5 +1,5 @@
= link_to root_path do
- = render 'shared/logo.svg'
+ = render partial: 'shared/logo', formats: :svg
%h1= _('Offline')
.container
%h3= _('You are currently offline, or the GitLab instance is not reachable.')
diff --git a/app/views/shared/_allow_request_access.html.haml b/app/views/shared/_allow_request_access.html.haml
index 608a0ca37d9..ab5f2fb1772 100644
--- a/app/views/shared/_allow_request_access.html.haml
+++ b/app/views/shared/_allow_request_access.html.haml
@@ -1,3 +1,3 @@
= form.gitlab_ui_checkbox_component :request_access_enabled,
- _('Allow users to request access (if visibility is public or internal)'),
+ _('Users can request access (if visibility is public or internal)'),
checkbox_options: { data: { qa_selector: 'request_access_checkbox' } }
diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml
index 5ae99474c70..db5e055a1c4 100644
--- a/app/views/shared/_group_form.html.haml
+++ b/app/views/shared/_group_form.html.haml
@@ -3,53 +3,4 @@
- group_path << parent.full_path + '/' if parent
-- if Feature::enabled?(:group_name_path_vue, current_user)
- = render 'shared/groups/group_name_and_path_fields', f: f
-- else
- .row
- .form-group.group-name-holder.col-sm-12
- = f.label :name, class: 'label-bold' do
- = s_('Groups|Group name')
- = f.text_field :name, placeholder: _('My awesome group'), class: 'js-autofill-group-name form-control input-lg', data: { qa_selector: 'group_name_field' },
- required: true,
- title: s_('Groups|Enter a descriptive name for your group.'),
- autofocus: true
- .text-muted
- = s_('Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses.')
-
- .row
- .form-group.col-xs-12.col-sm-8
- = f.label :path, class: 'label-bold' do
- = s_('Groups|Group URL')
- .input-group.gl-field-error-anchor
- .group-root-path.input-group-prepend.has-tooltip{ title: group_path, :'data-placement' => 'bottom' }
- .input-group-text
- %span>= root_url
- - if parent
- %strong= parent.full_path + '/'
- = f.hidden_field :parent_id
- = f.text_field :path, placeholder: _('my-awesome-group'), class: 'form-control js-validate-group-path js-autofill-group-path', data: { qa_selector: 'group_path_field' },
- autofocus: local_assigns[:autofocus] || false, required: true,
- pattern: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS,
- title: group_url_error_message,
- maxlength: ::Namespace::URL_MAX_LENGTH,
- "data-bind-in" => "#{'create_chat_team' if Gitlab.config.mattermost.enabled}"
- %p.validation-error.gl-field-error.field-validation.hide
- = s_('Groups|Group path is unavailable. Path has been replaced with a suggested available path.')
- %p.validation-success.gl-field-success.field-validation.hide= s_('Groups|Group path is available.')
- %p.validation-pending.gl-field-error-ignore.field-validation.hide= s_('Groups|Checking group URL availability...')
-
- - if @group.persisted?
- .gl-alert.gl-alert-warning.gl-mt-3.gl-mb-3
- = sprite_icon('warning', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-body
- = s_('Groups|Changing group URL can have unintended side effects.')
- = succeed '.' do
- = link_to s_('Groups|Learn more'), help_page_path('user/group/index', anchor: 'change-a-groups-path'), target: '_blank', class: 'gl-link'
-
- - if @group.persisted?
- .row
- .form-group.group-name-holder.col-sm-8
- = f.label :id, class: 'label-bold' do
- = s_('Groups|Group ID')
- = f.text_field :id, class: 'form-control', readonly: true
+= render 'shared/groups/group_name_and_path_fields', f: f
diff --git a/app/views/shared/_integration_settings.html.haml b/app/views/shared/_integration_settings.html.haml
index 84710b2ecc7..d58be0f0f4a 100644
--- a/app/views/shared/_integration_settings.html.haml
+++ b/app/views/shared/_integration_settings.html.haml
@@ -1,4 +1,4 @@
-= form_errors(integration)
+= form_errors(integration, pajamas_alert: true)
%div{ data: { testid: "integration-settings-form" } }
- if @default_integration
diff --git a/app/views/shared/_label.html.haml b/app/views/shared/_label.html.haml
index af5657e0e14..c0bc50fef5b 100644
--- a/app/views/shared/_label.html.haml
+++ b/app/views/shared/_label.html.haml
@@ -31,22 +31,19 @@
%ul
- if label.project_label? && label.project.group && can?(current_user, :admin_label, label.project.group)
%li
- %button.js-promote-project-label-button.gl-button.btn.btn-default-tertiary{ disabled: true, type: 'button',
- data: { url: promote_project_label_path(label.project, label),
- label_title: label.title,
- label_color: label.color,
- label_text_color: label.text_color,
- group_name: label.project.group.name } }
+ = render Pajamas::ButtonComponent.new(category: :tertiary,
+ button_options: { class: 'js-promote-project-label-button', data: { url: promote_project_label_path(label.project, label), label_title: label.title, label_color: label.color, label_text_color: label.text_color, group_name: label.project.group.name } } ) do
= _('Promote to group label')
%li
%span
- %button.text-danger.js-delete-label-modal-button{ type: 'button', data: { label_name: label.name, subject_name: label.subject_name, destroy_path: label.destroy_path } }
+ = render Pajamas::ButtonComponent.new(category: :tertiary,
+ button_options: { class: 'text-danger js-delete-label-modal-button', data: { label_name: label.name, subject_name: label.subject_name, destroy_path: label.destroy_path } } ) do
= _('Delete')
- if current_user
%li.gl-display-inline-block.label-subscription.js-label-subscription.gl-ml-3
- if label.can_subscribe_to_label_in_different_levels?
- %button.js-unsubscribe-button.gl-button.btn.btn-default.gl-w-full{ class: ('hidden' if status.unsubscribed?), data: { url: toggle_subscription_path, toggle: 'tooltip' }, title: tooltip_title }
- %span.gl-button-text= _('Unsubscribe')
+ = render Pajamas::ButtonComponent.new(button_options: { class: "js-unsubscribe-button #{('hidden' if status.unsubscribed?)}", data: { url: toggle_subscription_path, toggle: 'tooltip', container: 'body' }, title: tooltip_title } ) do
+ = _('Unsubscribe')
.dropdown.dropdown-group-label{ class: ('hidden' unless status.unsubscribed?) }
= render Pajamas::ButtonComponent.new(button_options: { class: 'gl-w-full', data: { toggle: 'dropdown' } }) do
= _('Subscribe')
@@ -54,11 +51,11 @@
.dropdown-menu.dropdown-open-left
%ul
%li
- %button.js-subscribe-button{ class: ('hidden' unless status.unsubscribed?), data: { status: status, url: toggle_subscription_project_label_path(@project, label) } }
- %span.gl-button-text= _('Subscribe at project level')
+ = render Pajamas::ButtonComponent.new(category: :tertiary, button_options: { class: "js-subscribe-button #{('hidden' unless status.unsubscribed?)}", data: { status: status, url: toggle_subscription_project_label_path(@project, label) } } ) do
+ = _('Subscribe at project level')
%li
- %button.js-subscribe-button.js-group-level{ class: ('hidden' unless status.unsubscribed?), data: { status: status, url: toggle_subscription_group_label_path(label.group, label) } }
- %span.gl-button-text= _('Subscribe at group level')
+ = render Pajamas::ButtonComponent.new(category: :tertiary, button_options: { class: "js-subscribe-button js-group-level #{('hidden' unless status.unsubscribed?)}", data: { status: status, url: toggle_subscription_group_label_path(label.group, label) } } ) do
+ = _('Subscribe at group level')
- else
- %button.gl-button.js-subscribe-button.btn.btn-default.gl-w-full{ data: { status: status, url: toggle_subscription_path, toggle: 'tooltip' }, title: tooltip_title }
- %span.gl-button-text= label_subscription_toggle_button_text(label, @project)
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-subscribe-button gl-w-full', data: { status: status, url: toggle_subscription_path, toggle: 'tooltip', container: 'body' }, title: tooltip_title } ) do
+ = label_subscription_toggle_button_text(label, @project)
diff --git a/app/views/shared/_old_visibility_level.html.haml b/app/views/shared/_old_visibility_level.html.haml
index 104c722ee65..6bcac2b0e6b 100644
--- a/app/views/shared/_old_visibility_level.html.haml
+++ b/app/views/shared/_old_visibility_level.html.haml
@@ -1,6 +1,5 @@
-.form-group.row
- .col-sm-2.col-form-label
+%fieldset.form-group.gl-form-group
+ %legend.col-form-label.col-form-label
= _('Visibility level')
- = link_to sprite_icon('question-o'), help_page_path('public_access/public_access'), target: '_blank', rel: 'noopener noreferrer'
- .col-sm-10
- = render 'shared/visibility_level', f: f, visibility_level: visibility_level, can_change_visibility_level: can_change_visibility_level, form_model: form_model, with_label: with_label
+ = link_to sprite_icon('question-o'), help_page_path('user/public_access'), target: '_blank', rel: 'noopener noreferrer'
+ = render 'shared/visibility_level', f: f, visibility_level: visibility_level, can_change_visibility_level: can_change_visibility_level, form_model: form_model, with_label: with_label
diff --git a/app/views/shared/_visibility_level.html.haml b/app/views/shared/_visibility_level.html.haml
index 3e30dcaf35a..763ae5a498b 100644
--- a/app/views/shared/_visibility_level.html.haml
+++ b/app/views/shared/_visibility_level.html.haml
@@ -1,11 +1,11 @@
- with_label = local_assigns.fetch(:with_label, true)
-.form-group.visibility-level-setting
+.visibility-level-setting
- if with_label
= f.label :visibility_level, _('Visibility level'), class: 'label-bold gl-mb-0'
%p
= _('Who can see this group?')
- - visibility_docs_path = help_page_path('public_access/public_access')
+ - visibility_docs_path = help_page_path('user/public_access')
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: visibility_docs_path }
= _('%{docs_link_start}Learn about visibility levels.%{docs_link_end}').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
- if can_change_visibility_level
diff --git a/app/views/shared/_visibility_radios.html.haml b/app/views/shared/_visibility_radios.html.haml
index 760fe18ddec..1bac75e0ff5 100644
--- a/app/views/shared/_visibility_radios.html.haml
+++ b/app/views/shared/_visibility_radios.html.haml
@@ -2,15 +2,13 @@
- selected_level = snippets_selected_visibility_level(available_visibility_levels, selected_level)
- available_visibility_levels.each do |level|
- .form-check
- = form.radio_button model_method, level, checked: (selected_level == level), class: 'form-check-input', data: { track_label: "blank_project", track_action: "activate_form_input", track_property: "#{model_method}_#{level}", track_value: "", qa_selector: "#{visibility_level_label(level).downcase}_radio" }
- = form.label "#{model_method}_#{level}", class: 'form-check-label' do
- = visibility_level_icon(level)
- .option-title
- = visibility_level_label(level)
- .option-description
- = visibility_level_description(level, form_model)
- .option-disabled-reason
+
+ = form.gitlab_ui_radio_component model_method, level,
+ "#{visibility_level_icon(level)} #{visibility_level_label(level)}".html_safe,
+ help_text: '<span class="option-description">%{visibility_level_description}</span><span class="option-disabled-reason"></span>'.html_safe % { visibility_level_description: visibility_level_description(level, form_model)},
+ radio_options: { checked: (selected_level == level), data: { track_label: "blank_project", track_action: "activate_form_input", track_property: "#{model_method}_#{level}", track_value: "", qa_selector: "#{visibility_level_label(level).downcase}_radio" } },
+ label_options: { class: 'js-visibility-level-radio' }
+
.text-muted
- if all_visibility_levels_restricted?
diff --git a/app/views/shared/admin/_admin_note_form.html.haml b/app/views/shared/admin/_admin_note_form.html.haml
index 0bc26f9120f..09b059774bc 100644
--- a/app/views/shared/admin/_admin_note_form.html.haml
+++ b/app/views/shared/admin/_admin_note_form.html.haml
@@ -1,6 +1,4 @@
-.form-group.row
+.form-group.gl-form-group{ role: 'group' }
= f.fields_for :admin_note do |an|
- .col-sm-2.col-form-label.gl-text-right
- = an.label :note, s_('Admin|Admin notes')
- .col-sm-10
- = an.text_area :note, class: 'form-control'
+ = an.label :note, s_('Admin|Admin notes'), class: 'gl-display-block col-form-label'
+ = an.text_area :note, class: 'form-control gl-form-input gl-form-textarea'
diff --git a/app/views/shared/deploy_keys/_form.html.haml b/app/views/shared/deploy_keys/_form.html.haml
index 4ab93030638..38985319ca5 100644
--- a/app/views/shared/deploy_keys/_form.html.haml
+++ b/app/views/shared/deploy_keys/_form.html.haml
@@ -13,14 +13,19 @@
= form.label :key, class: 'col-form-label col-sm-2'
.col-sm-10
%p.light
- - link_start = "<a href='#{help_page_path('ssh/index')}' target='_blank' rel='noreferrer noopener'>".html_safe
+ - link_start = "<a href='#{help_page_path('user/ssh')}' 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' }
- else
- = form.label :fingerprint, class: 'col-form-label col-sm-2'
- .col-sm-10
- = form.text_field :fingerprint, class: 'form-control gl-form-input', readonly: 'readonly'
+ - if deploy_key.fingerprint_sha256.present?
+ = form.label :fingerprint, _('Fingerprint (SHA256)'), class: 'col-form-label col-sm-2'
+ .col-sm-10
+ = form.text_field :fingerprint_sha256, class: 'form-control gl-form-input', readonly: 'readonly'
+ - if deploy_key.fingerprint.present?
+ = form.label :fingerprint, _('Fingerprint (MD5)'), class: 'col-form-label col-sm-2'
+ .col-sm-10
+ = form.text_field :fingerprint, class: 'form-control gl-form-input', readonly: 'readonly'
- if deploy_keys_project.present?
= form.fields_for :deploy_keys_projects, deploy_keys_project do |deploy_keys_project_form|
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 c9edf09b350..4bedce71c0f 100644
--- a/app/views/shared/deploy_keys/_project_group_form.html.haml
+++ b/app/views/shared/deploy_keys/_project_group_form.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for [@project.namespace, @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input container" } do |f|
- = form_errors(@deploy_keys.new_key)
+ = form_errors(@deploy_keys.new_key, pajamas_alert: true)
.form-group.row
= f.label :title, class: "label-bold"
= f.text_field :title, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'deploy_key_title_field' }
@@ -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/index")
+ = link_to _('How do I generate it?'), help_page_path("user/ssh")
= f.fields_for :deploy_keys_projects do |deploy_keys_project_form|
.form-group.row
diff --git a/app/views/shared/doorkeeper/applications/_form.html.haml b/app/views/shared/doorkeeper/applications/_form.html.haml
index b40e2630011..9810754f52b 100644
--- a/app/views/shared/doorkeeper/applications/_form.html.haml
+++ b/app/views/shared/doorkeeper/applications/_form.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for @application, url: url, html: { role: 'form', class: 'doorkeeper-app-form' } do |f|
- = form_errors(@application)
+ = form_errors(@application, pajamas_alert: true)
.form-group
= f.label :name, class: 'label-bold'
diff --git a/app/views/shared/doorkeeper/applications/_index.html.haml b/app/views/shared/doorkeeper/applications/_index.html.haml
index 0359c28794c..b14ff9b2508 100644
--- a/app/views/shared/doorkeeper/applications/_index.html.haml
+++ b/app/views/shared/doorkeeper/applications/_index.html.haml
@@ -55,7 +55,7 @@
.oauth-authorized-applications.prepend-top-20.gl-mb-3
- if oauth_applications_enabled
%h5
- = _("Authorized applications (%{size})") % { size: @authorized_apps.size + @authorized_anonymous_tokens.size }
+ = _("Authorized applications (%{size})") % { size: @authorized_tokens.size }
- if @authorized_tokens.any?
.table-responsive
@@ -67,22 +67,22 @@
%th= _('Scope')
%th
%tbody
- - @authorized_apps.each do |app|
- - token = app.authorized_tokens.order('created_at desc').first # rubocop: disable CodeReuse/ActiveRecord
- %tr{ id: "application_#{app.id}" }
- %td= app.name
- %td= token.created_at
- %td= token.scopes
- %td= render 'doorkeeper/authorized_applications/delete_form', application: app
- - @authorized_anonymous_tokens.each do |token|
- %tr
+ - @authorized_tokens.each do |token|
+ %tr{ id: ("application_#{token.application.id}" if token.application) }
%td
- = _('Anonymous')
- .form-text.text-muted
- %em= _("Authorization was granted by entering your username and password in the application.")
+ - if token.application
+ = token.application.name
+ - else
+ = _('Anonymous')
+ .form-text.text-muted
+ %em= _("Authorization was granted by entering your username and password in the application.")
%td= token.created_at
%td= token.scopes
- %td= render 'doorkeeper/authorized_applications/delete_form', token: token
+ %td
+ - if token.application
+ = render 'doorkeeper/authorized_applications/delete_form', application: token.application
+ - else
+ = render 'doorkeeper/authorized_applications/delete_form', token: token
- else
.settings-message.text-center
= _("You don't have any authorized applications")
diff --git a/app/views/shared/empty_states/_snippets.html.haml b/app/views/shared/empty_states/_snippets.html.haml
index 20ca7954479..a006a3bc0a4 100644
--- a/app/views/shared/empty_states/_snippets.html.haml
+++ b/app/views/shared/empty_states/_snippets.html.haml
@@ -4,15 +4,15 @@
.col-12
.svg-content
= image_tag 'illustrations/snippets_empty.svg', data: { qa_selector: 'svg_content' }
- .text-content.text-center.pt-0
+ .text-content.gl-text-center.gl-pt-0
- if current_user
%h4
= s_('SnippetsEmptyState|Code snippets')
- %p.mb-0
+ %p.gl-mb-0
= s_('SnippetsEmptyState|Store, share, and embed small pieces of code and text.')
- .mt-2<
+ .gl-mt-3<
- if button_path
= link_to s_('SnippetsEmptyState|New snippet'), button_path, class: 'btn gl-button btn-confirm', title: s_('SnippetsEmptyState|New snippet'), id: 'new_snippet_link', data: { qa_selector: 'create_first_snippet_link' }
= link_to s_('SnippetsEmptyState|Documentation'), help_page_path('user/snippets.md'), class: 'btn gl-button btn-default', title: s_('SnippetsEmptyState|Documentation')
- else
- %h4.text-center= s_('SnippetsEmptyState|There are no snippets to show.')
+ %h4.gl-text-center= s_('SnippetsEmptyState|There are no snippets to show.')
diff --git a/app/views/shared/form_elements/_apply_template_warning.html.haml b/app/views/shared/form_elements/_apply_template_warning.html.haml
index ca1d3d53f16..131c450ddd7 100644
--- a/app/views/shared/form_elements/_apply_template_warning.html.haml
+++ b/app/views/shared/form_elements/_apply_template_warning.html.haml
@@ -7,7 +7,7 @@
%p
= _("Applying a template will replace the existing issue description. Any changes you have made will be lost.")
- %button.js-override-template.btn.gl-button.btn-confirm.mr-2{ type: 'button' }
+ = render Pajamas::ButtonComponent.new(variant: :confirm, button_options: { class: 'gl-mr-3 js-override-template' }) do
= _("Apply template")
- %button.js-close-btn.js-cancel-btn.btn.gl-button.btn-default{ type: 'button' }
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-close-btn js-cancel-btn' }) do
= _("Cancel")
diff --git a/app/views/shared/form_elements/_description.html.haml b/app/views/shared/form_elements/_description.html.haml
index a87aa8de679..2c46b2191c6 100644
--- a/app/views/shared/form_elements/_description.html.haml
+++ b/app/views/shared/form_elements/_description.html.haml
@@ -21,7 +21,7 @@
classes: 'note-textarea rspec-issuable-form-description',
placeholder: placeholder,
supports_quick_actions: supports_quick_actions,
- qa_selector: 'issuable_form_description'
+ qa_selector: 'issuable_form_description_field'
= render 'shared/notes/hints', supports_quick_actions: supports_quick_actions
.clearfix
.error-alert
diff --git a/app/views/shared/groups/_group_name_and_path_fields.html.haml b/app/views/shared/groups/_group_name_and_path_fields.html.haml
index 709130a47d3..634b8448535 100644
--- a/app/views/shared/groups/_group_name_and_path_fields.html.haml
+++ b/app/views/shared/groups/_group_name_and_path_fields.html.haml
@@ -1,5 +1,5 @@
.js-group-name-and-path{ data: group_name_and_path_app_data(@group) }
= f.hidden_field :name, data: { js_name: 'name' }
= f.hidden_field :path, maxlength: ::Namespace::URL_MAX_LENGTH, pattern: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS, data: { js_name: 'path' }
- = f.hidden_field :parent_id, data: { js_name: 'parentId' }
+ = f.hidden_field :parent_id, value: @group.parent&.id, data: { js_name: 'parentId' }
= f.hidden_field :id, data: { js_name: 'groupId' }
diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml
index 8409f224158..0bec94f70ea 100644
--- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml
+++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml
@@ -26,16 +26,16 @@
= render_if_exists 'shared/issuable/epic_dropdown', parent: @project.group
.block
.title
+ = _('Labels')
+ .filter-item.labels-filter
+ = render "shared/issuable/label_dropdown", classes: ["js-filter-bulk-update", "js-multiselect"], dropdown_title: _("Apply a label"), show_create: false, show_footer: false, extra_options: false, filter_submit: false, data_options: { persist_when_hide: "true", field_name: "update[label_ids][]", show_no: false, show_any: false, use_id: true, default_label: _("Labels") }, label_name: _("Select labels"), no_default_styles: true
+ .block
+ .title
= _('Milestone')
.filter-item
= dropdown_tag(_("Select milestone"), options: { title: _("Assign milestone"), toggle_class: "js-milestone-select js-extra-options js-filter-submit js-filter-bulk-update", filter: true, dropdown_class: "dropdown-menu-selectable dropdown-menu-milestone", placeholder: _("Search milestones"), data: { show_no: true, field_name: "update[milestone_id]", project_id: @project.id, use_id: true, default_label: _("Milestone") } })
- if is_issue
= render_if_exists 'shared/issuable/iterations_dropdown', parent: @project.group
- .block
- .title
- = _('Labels')
- .filter-item.labels-filter
- = render "shared/issuable/label_dropdown", classes: ["js-filter-bulk-update", "js-multiselect"], dropdown_title: _("Apply a label"), show_create: false, show_footer: false, extra_options: false, filter_submit: false, data_options: { persist_when_hide: "true", field_name: "update[label_ids][]", show_no: false, show_any: false, use_id: true, default_label: _("Labels") }, label_name: _("Select labels"), no_default_styles: true
- if is_issue
= render_if_exists 'shared/issuable/health_status_dropdown', parent: @project
.block
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index da49a301087..e90ea35f28e 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -67,11 +67,11 @@
= form.submit _('Save changes'), class: 'gl-button btn btn-confirm gl-mr-2', data: { track_experiment: 'promote_mr_approvals_in_free', track_action: 'click_button', track_label: 'submit_mr', track_value: 0 }
- if issuable.new_record?
- = link_to _('Cancel'), polymorphic_path([@project, issuable.class]), class: 'btn gl-button btn-default'
+ = link_to _('Cancel'), polymorphic_path([@project, issuable.class]), class: 'btn gl-button btn-default js-reset-autosave'
- else
- = link_to _('Cancel'), polymorphic_path([@project, issuable]), class: 'gl-button btn btn-default'
+ = link_to _('Cancel'), polymorphic_path([@project, issuable]), class: 'gl-button btn btn-default js-reset-autosave'
- if can?(current_user, :"destroy_#{issuable.to_ability_name}", @project)
- = link_to 'Delete', polymorphic_path([@project, issuable], params: { destroy_confirm: true }), data: { confirm: _('%{issuableType} will be removed! Are you sure?') % { issuableType: issuable.human_class_name } }, method: :delete, class: 'btn gl-button btn-danger btn-danger-secondary gl-float-right'
+ = link_to 'Delete', polymorphic_path([@project, issuable], params: { destroy_confirm: true }), data: { confirm: _('%{issuableType} will be removed! Are you sure?') % { issuableType: issuable.human_class_name } }, method: :delete, class: 'btn gl-button btn-danger btn-danger-secondary gl-float-right js-reset-autosave'
- if issuable.respond_to?(:issue_type)
= form.hidden_field :issue_type
diff --git a/app/views/shared/issuable/form/_contribution.html.haml b/app/views/shared/issuable/form/_contribution.html.haml
index c9dda22de46..f9c70236c8f 100644
--- a/app/views/shared/issuable/form/_contribution.html.haml
+++ b/app/views/shared/issuable/form/_contribution.html.haml
@@ -9,11 +9,10 @@
%hr
-.form-group.row
- %label.col-form-label.col-sm-2.pt-sm-0
+.form-group
+ %label
= _('Contribution')
- .col-sm-10
- = form.gitlab_ui_checkbox_component :allow_collaboration,
- _('Allow commits from members who can merge to the target branch. %{link_start}About this feature.%{link_end}').html_safe % { link_start: contribution_help_link_start, link_end: '</a>'.html_safe },
- checkbox_options: { disabled: !issuable.can_allow_collaboration?(current_user) },
- help_text: allow_collaboration_unavailable_reason(issuable)
+ = form.gitlab_ui_checkbox_component :allow_collaboration,
+ _('Allow commits from members who can merge to the target branch. %{link_start}About this feature.%{link_end}').html_safe % { link_start: contribution_help_link_start, link_end: '</a>'.html_safe },
+ checkbox_options: { disabled: !issuable.can_allow_collaboration?(current_user) },
+ help_text: allow_collaboration_unavailable_reason(issuable)
diff --git a/app/views/shared/issuable/form/_type_selector.html.haml b/app/views/shared/issuable/form/_type_selector.html.haml
index d5c696b1698..a94ef70b2d5 100644
--- a/app/views/shared/issuable/form/_type_selector.html.haml
+++ b/app/views/shared/issuable/form/_type_selector.html.haml
@@ -1,35 +1,35 @@
- return unless issuable.supports_issue_type? && can?(current_user, :create_issue, @project)
.form-group
- = form.label :type, _('Type')
- .gl-display-flex.gl-align-items-center
- .issuable-form-select-holder.selectbox.form-group.gl-mb-0
- .dropdown.js-issuable-type-filter-dropdown-wrap
- %button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' }
- %span.dropdown-toggle-text.is-default
- = issuable.issue_type.capitalize || _("Select type")
- = sprite_icon('chevron-down', css_class: "dropdown-menu-toggle-icon gl-top-3")
- .dropdown-menu.dropdown-menu-selectable.dropdown-select
- .dropdown-title.gl-display-flex
- %span.gl-ml-auto
- = _("Select type")
- %button.dropdown-title-button.dropdown-menu-close.gl-ml-auto{ type: 'button', "aria-label" => _('Close') }
- = sprite_icon('close', size: 16, css_class: 'dropdown-menu-close-icon')
- .dropdown-content{ data: { testid: 'issue-type-select-dropdown' } }
- %ul
- - if create_issue_type_allowed?(@project, :issue)
- %li.js-filter-issuable-type
- = link_to new_project_issue_path(@project), class: ("is-active" if issuable.issue?) do
- #{sprite_icon(work_item_type_icon(:issue), css_class: 'gl-icon')} #{_('Issue')}
- - if create_issue_type_allowed?(@project, :incident)
- %li.js-filter-issuable-type{ data: { track: { action: "select_issue_type_incident", label: "select_issue_type_incident_dropdown_option" } } }
- = link_to new_project_issue_path(@project, { issuable_template: 'incident', issue: { issue_type: 'incident' } }), class: ("is-active" if issuable.incident?) do
- #{sprite_icon(work_item_type_icon(:incident), css_class: 'gl-icon')} #{_('Incident')}
-
+ = form.label :type do
+ = _('Type')
#js-type-popover
- - if issuable.incident?
- %p.form-text.text-muted
- - incident_docs_url = help_page_path('operations/incident_management/incidents.md')
- - incident_docs_start = format('<a href="%{url}" target="_blank" rel="noopener noreferrer">', url: incident_docs_url)
- = format(_('A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents.'), incident_docs_start: incident_docs_start, incident_docs_end: '</a>').html_safe
+ .issuable-form-select-holder.selectbox.form-group.gl-mb-0.gl-display-block
+ .dropdown.js-issuable-type-filter-dropdown-wrap
+ %button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' }
+ %span.dropdown-toggle-text.is-default
+ = issuable.issue_type.capitalize || _("Select type")
+ = sprite_icon('chevron-down', css_class: "dropdown-menu-toggle-icon gl-top-3")
+ .dropdown-menu.dropdown-menu-selectable.dropdown-select
+ .dropdown-title.gl-display-flex
+ %span.gl-ml-auto
+ = _("Select type")
+ %button.dropdown-title-button.dropdown-menu-close.gl-ml-auto{ type: 'button', "aria-label" => _('Close') }
+ = sprite_icon('close', size: 16, css_class: 'dropdown-menu-close-icon')
+ .dropdown-content{ data: { testid: 'issue-type-select-dropdown' } }
+ %ul
+ - if create_issue_type_allowed?(@project, :issue)
+ %li.js-filter-issuable-type
+ = link_to new_project_issue_path(@project), class: ("is-active" if issuable.issue?) do
+ #{sprite_icon(work_item_type_icon(:issue), css_class: 'gl-icon')} #{_('Issue')}
+ - if create_issue_type_allowed?(@project, :incident)
+ %li.js-filter-issuable-type{ data: { track: { action: "select_issue_type_incident", label: "select_issue_type_incident_dropdown_option" } } }
+ = link_to new_project_issue_path(@project, { issuable_template: 'incident', issue: { issue_type: 'incident' } }), class: ("is-active" if issuable.incident?) do
+ #{sprite_icon(work_item_type_icon(:incident), css_class: 'gl-icon')} #{_('Incident')}
+
+ - if issuable.incident?
+ %p.form-text.text-muted
+ - incident_docs_url = help_page_path('operations/incident_management/incidents.md')
+ - incident_docs_start = format('<a href="%{url}" target="_blank" rel="noopener noreferrer">', url: incident_docs_url)
+ = format(_('A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents.'), incident_docs_start: incident_docs_start, incident_docs_end: '</a>').html_safe
diff --git a/app/views/shared/issue_type/_details_content.html.haml b/app/views/shared/issue_type/_details_content.html.haml
index 7c5b3fd4b3c..39e7d196965 100644
--- a/app/views/shared/issue_type/_details_content.html.haml
+++ b/app/views/shared/issue_type/_details_content.html.haml
@@ -18,6 +18,7 @@
= render 'projects/issues/design_management'
= render_if_exists 'projects/issues/work_item_links'
+ = render_if_exists 'projects/issues/linked_resources'
= render_if_exists 'projects/issues/related_issues'
#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 } }
diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml
index ba0e5e492f4..23f78f4be45 100644
--- a/app/views/shared/members/_member.html.haml
+++ b/app/views/shared/members/_member.html.haml
@@ -45,7 +45,8 @@
&middot;
%span.js-expires-in-text{ class: "has-tooltip#{' text-warning' if member.expires_soon?}", title: (member.expires_at.to_time.in_time_zone.to_s(:medium) if member.expires?) }
- if member.expires?
- = _("Expires in %{expires_at}").html_safe % { expires_at: distance_of_time_in_words_to_now(member.expires_at) }
+ - preposition = current_user.time_display_relative ? '' : 'on'
+ = _("Expires %{preposition} %{expires_at}").html_safe % { expires_at: time_ago_with_tooltip(member.expires_at), preposition: preposition }
- else
= image_tag avatar_icon_for_email(member.invite_email, 40), class: "avatar s40 flex-shrink-0 flex-grow-0", alt: ''
diff --git a/app/views/shared/milestones/_header.html.haml b/app/views/shared/milestones/_header.html.haml
index 541d7a52385..18db556e024 100644
--- a/app/views/shared/milestones/_header.html.haml
+++ b/app/views/shared/milestones/_header.html.haml
@@ -11,23 +11,21 @@
.milestone-buttons
- if can?(current_user, :admin_milestone, @group || @project)
- = link_to _('Edit'), edit_milestone_path(milestone), class: 'btn gl-button btn-grouped'
+ = render Pajamas::ButtonComponent.new(href: edit_milestone_path(milestone), button_options: { class: 'btn-grouped' }) do
+ = _('Edit')
- if milestone.project_milestone? && milestone.project.group
- %button.js-promote-project-milestone-button.btn.gl-button.btn-grouped{ data: { milestone_title: milestone.title,
- group_name: milestone.project.group.name,
- url: promote_project_milestone_path(milestone.project, milestone)},
- disabled: true,
- type: 'button' }
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-promote-project-milestone-button btn-grouped', data: { milestone_title: milestone.title, group_name: milestone.project.group.name, url: promote_project_milestone_path(milestone.project, milestone) }, disabled: true }) do
= _('Promote')
#promote-milestone-modal
- if milestone.active?
- = link_to _('Close milestone'), update_milestone_path(milestone, { state_event: :close }), method: :put, class: 'btn gl-button btn-grouped btn-close'
+ = render Pajamas::ButtonComponent.new(href: update_milestone_path(milestone, { state_event: :close }), button_options: { class: 'btn-grouped btn-close', data: { method: 'put' }, rel: 'nofollow' }) do
+ = _('Close milestone')
- else
- = link_to _('Reopen milestone'), update_milestone_path(milestone, { state_event: :activate }), method: :put, class: 'btn gl-button btn-grouped'
+ = render Pajamas::ButtonComponent.new(href: update_milestone_path(milestone, { state_event: :activate }), button_options: { class: 'btn-grouped', data: { method: 'put' }, rel: 'nofollow' }) do
+ = _('Reopen milestone')
= render 'shared/milestones/delete_button'
- %button.btn.gl-button.btn-default.btn-grouped.float-right.d-block.d-sm-none.js-sidebar-toggle{ type: 'button' }
- = sprite_icon('chevron-double-lg-left')
+ = render Pajamas::ButtonComponent.new(icon: 'chevron-double-lg-left', button_options: { 'aria-label' => _('Toggle sidebar'), class: 'btn-grouped gl-float-right! gl-sm-display-none js-sidebar-toggle' })
diff --git a/app/views/shared/runners/_form.html.haml b/app/views/shared/runners/_form.html.haml
index 024b06fe97a..e0079a95cec 100644
--- a/app/views/shared/runners/_form.html.haml
+++ b/app/views/shared/runners/_form.html.haml
@@ -1,5 +1,5 @@
= gitlab_ui_form_for runner, url: runner_form_url do |f|
- = form_errors(runner)
+ = form_errors(runner, pajamas_alert: true)
.form-group.row
= label :active, _("Active"), class: 'col-form-label col-sm-2'
.col-sm-10
diff --git a/app/views/shared/snippets/_form.html.haml b/app/views/shared/snippets/_form.html.haml
index 5f511b35b61..33b0e1f693e 100644
--- a/app/views/shared/snippets/_form.html.haml
+++ b/app/views/shared/snippets/_form.html.haml
@@ -1,2 +1,2 @@
- available_visibility_levels = available_visibility_levels(@snippet)
-#js-snippet-edit.snippet-form{ data: {'project_path': @snippet.project&.full_path, 'snippet-gid': @snippet.new_record? ? '' : @snippet.to_global_id, 'markdown-preview-path': preview_markdown_path(parent), 'markdown-docs-path': help_page_path('user/markdown'), 'visibility-help-link': help_page_path("public_access/public_access"), 'visibility_levels': available_visibility_levels, 'selected_level': snippets_selected_visibility_level(available_visibility_levels, @snippet.visibility_level), 'multiple_levels_restricted': multiple_visibility_levels_restricted? } }
+#js-snippet-edit.snippet-form{ data: {'project_path': @snippet.project&.full_path, 'snippet-gid': @snippet.new_record? ? '' : @snippet.to_global_id, 'markdown-preview-path': preview_markdown_path(parent), 'markdown-docs-path': help_page_path('user/markdown'), 'visibility-help-link': help_page_path("user/public_access"), 'visibility_levels': available_visibility_levels, 'selected_level': snippets_selected_visibility_level(available_visibility_levels, @snippet.visibility_level), 'multiple_levels_restricted': multiple_visibility_levels_restricted? } }
diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml
index afe72767b9a..fe68244f1da 100644
--- a/app/views/shared/web_hooks/_form.html.haml
+++ b/app/views/shared/web_hooks/_form.html.haml
@@ -1,4 +1,4 @@
-= form_errors(hook)
+= form_errors(hook, pajamas_alert: true)
.form-group
= form.label :url, s_('Webhooks|URL'), class: 'label-bold'
diff --git a/app/views/shared/wikis/edit.html.haml b/app/views/shared/wikis/edit.html.haml
index 6bbce6b80d8..fc56a191cad 100644
--- a/app/views/shared/wikis/edit.html.haml
+++ b/app/views/shared/wikis/edit.html.haml
@@ -1,5 +1,7 @@
- wiki_page_title @page, @page.persisted? ? _('Edit') : _('New')
- add_page_specific_style 'page_bundles/wiki'
+- @gfm_form = true
+- @noteable_type = 'Wiki'
- if @error
#js-wiki-error{ data: { error: @error, wiki_page_path: wiki_page_path(@wiki, @page) } }
diff --git a/app/views/users/_profile_basic_info.html.haml b/app/views/users/_profile_basic_info.html.haml
index 3b0186e84e1..b62440fcbde 100644
--- a/app/views/users/_profile_basic_info.html.haml
+++ b/app/views/users/_profile_basic_info.html.haml
@@ -3,4 +3,7 @@
@#{@user.username}
- if can?(current_user, :read_user_profile, @user)
= render 'middle_dot_divider' do
+ = s_('UserProfile|User ID: %{id}') % { id: @user.id }
+ = clipboard_button(title: s_('UserProfile|Copy user ID'), text: @user.id)
+ = render 'middle_dot_divider' do
= s_('Member since %{date}') % { date: @user.created_at.to_date.to_s(:long) }
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index ab75abff9ba..966a1202db2 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -219,6 +219,15 @@
:weight: 1
:idempotent: false
:tags: []
+- :name: cronjob:ci_runners_reconcile_existing_runner_versions_cron
+ :worker_name: Ci::Runners::ReconcileExistingRunnerVersionsCronWorker
+ :feature_category: :runner_fleet
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:ci_schedule_delete_objects_cron
:worker_name: Ci::ScheduleDeleteObjectsCronWorker
:feature_category: :continuous_integration
@@ -948,15 +957,6 @@
:weight: 1
:idempotent: false
:tags: []
-- :name: gcp_cluster:clusters_applications_activate_service
- :worker_name: Clusters::Applications::ActivateServiceWorker
- :feature_category: :kubernetes_management
- :has_external_dependencies: false
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: false
- :tags: []
- :name: gcp_cluster:clusters_applications_deactivate_integration
:worker_name: Clusters::Applications::DeactivateIntegrationWorker
:feature_category: :kubernetes_management
@@ -966,15 +966,6 @@
:weight: 1
:idempotent: false
:tags: []
-- :name: gcp_cluster:clusters_applications_deactivate_service
- :worker_name: Clusters::Applications::DeactivateServiceWorker
- :feature_category: :kubernetes_management
- :has_external_dependencies: false
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: false
- :tags: []
- :name: gcp_cluster:clusters_applications_uninstall
:worker_name: Clusters::Applications::UninstallWorker
:feature_category: :kubernetes_management
@@ -1038,6 +1029,15 @@
:weight: 1
:idempotent: false
:tags: []
+- :name: github_importer:github_import_import_issue_event
+ :worker_name: Gitlab::GithubImport::ImportIssueEventWorker
+ :feature_category: :importers
+ :has_external_dependencies: true
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: false
+ :tags: []
- :name: github_importer:github_import_import_lfs_object
:worker_name: Gitlab::GithubImport::ImportLfsObjectWorker
:feature_category: :importers
@@ -1110,6 +1110,15 @@
:weight: 1
:idempotent: false
:tags: []
+- :name: github_importer:github_import_stage_import_issue_events
+ :worker_name: Gitlab::GithubImport::Stage::ImportIssueEventsWorker
+ :feature_category: :importers
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: false
+ :tags: []
- :name: github_importer:github_import_stage_import_issues_and_diff_notes
:worker_name: Gitlab::GithubImport::Stage::ImportIssuesAndDiffNotesWorker
:feature_category: :importers
@@ -1452,6 +1461,15 @@
:weight: 1
:idempotent: false
:tags: []
+- :name: package_cleanup:packages_cleanup_execute_policy
+ :worker_name: Packages::Cleanup::ExecutePolicyWorker
+ :feature_category: :package_registry
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: package_cleanup:packages_cleanup_package_file
:worker_name: Packages::CleanupPackageFileWorker
:feature_category: :package_registry
@@ -2344,6 +2362,15 @@
:weight: 2
:idempotent: false
:tags: []
+- :name: google_cloud_create_cloudsql_instance
+ :worker_name: GoogleCloud::CreateCloudsqlInstanceWorker
+ :feature_category: :not_owned
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: group_destroy
:worker_name: GroupDestroyWorker
:feature_category: :subgroups
@@ -2389,6 +2416,15 @@
:weight: 2
:idempotent: true
:tags: []
+- :name: incident_management_close_incident
+ :worker_name: IncidentManagement::CloseIncidentWorker
+ :feature_category: :incident_management
+ :has_external_dependencies: true
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: integrations_create_external_cross_reference
:worker_name: Integrations::CreateExternalCrossReferenceWorker
:feature_category: :integrations
@@ -2425,15 +2461,6 @@
:weight: 2
:idempotent: false
:tags: []
-- :name: irker
- :worker_name: IrkerWorker
- :feature_category: :integrations
- :has_external_dependencies: false
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: false
- :tags: []
- :name: issuable_export_csv
:worker_name: IssuableExportCsvWorker
:feature_category: :team_planning
@@ -2704,14 +2731,14 @@
:weight: 1
:idempotent: false
:tags: []
-- :name: pages_transfer
- :worker_name: PagesTransferWorker
+- :name: pages_invalidate_domain_cache
+ :worker_name: Pages::InvalidateDomainCacheWorker
:feature_category: :pages
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: false
+ :idempotent: true
:tags: []
- :name: phabricator_import_import_tasks
:worker_name: Gitlab::PhabricatorImport::ImportTasksWorker
@@ -2767,15 +2794,6 @@
:weight: 1
:idempotent: false
:tags: []
-- :name: project_service
- :worker_name: ProjectServiceWorker
- :feature_category: :integrations
- :has_external_dependencies: true
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: false
- :tags: []
- :name: projects_after_import
:worker_name: Projects::AfterImportWorker
:feature_category: :importers
@@ -3092,15 +3110,6 @@
:weight: 1
:idempotent: false
:tags: []
-- :name: web_hooks_destroy
- :worker_name: WebHooks::DestroyWorker
- :feature_category: :integrations
- :has_external_dependencies: false
- :urgency: :high
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
- :name: web_hooks_log_destroy
:worker_name: WebHooks::LogDestroyWorker
:feature_category: :integrations
diff --git a/app/workers/authorized_projects_worker.rb b/app/workers/authorized_projects_worker.rb
index afe14369d43..4312ba41367 100644
--- a/app/workers/authorized_projects_worker.rb
+++ b/app/workers/authorized_projects_worker.rb
@@ -14,17 +14,6 @@ class AuthorizedProjectsWorker
idempotent!
loggable_arguments 1 # For the job waiter key
- # This is a workaround for a Ruby 2.3.7 bug. rspec-mocks cannot restore the
- # visibility of prepended modules. See https://github.com/rspec/rspec-mocks/issues/1231
- # for more details.
- if Rails.env.test?
- def self.bulk_perform_and_wait(args_list, timeout: 10)
- end
-
- def self.bulk_perform_inline(args_list)
- end
- end
-
def perform(user_id)
user = User.find_by_id(user_id)
diff --git a/app/workers/build_hooks_worker.rb b/app/workers/build_hooks_worker.rb
index 78244e0941e..5c08344bfe3 100644
--- a/app/workers/build_hooks_worker.rb
+++ b/app/workers/build_hooks_worker.rb
@@ -18,4 +18,16 @@ class BuildHooksWorker # rubocop:disable Scalability/IdempotentWorker
.try(:execute_hooks)
end
# rubocop: enable CodeReuse/ActiveRecord
+
+ def self.perform_async(build)
+ Gitlab::AppLogger.info(
+ message: "Enqueuing hooks for Build #{build.id}: #{build.status}",
+ class: self.name,
+ build_id: build.id,
+ pipeline_id: build.pipeline_id,
+ project_id: build.project_id,
+ build_status: build.status)
+
+ super(build.id)
+ end
end
diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb
index 9c95e25e2e8..e171ec1e194 100644
--- a/app/workers/bulk_imports/pipeline_worker.rb
+++ b/app/workers/bulk_imports/pipeline_worker.rb
@@ -53,12 +53,8 @@ module BulkImports
pipeline_tracker.update!(status_event: 'start', jid: jid)
pipeline_tracker.pipeline_class.new(context).run
pipeline_tracker.finish!
- rescue BulkImports::NetworkError => e
- if e.retriable?(pipeline_tracker)
- retry_tracker(e)
- else
- fail_tracker(e)
- end
+ rescue BulkImports::RetryPipelineError => e
+ retry_tracker(e)
rescue StandardError => e
fail_tracker(e)
end
diff --git a/app/workers/ci/archive_trace_worker.rb b/app/workers/ci/archive_trace_worker.rb
index 47d77c15b4a..edbaf0536a2 100644
--- a/app/workers/ci/archive_trace_worker.rb
+++ b/app/workers/ci/archive_trace_worker.rb
@@ -4,17 +4,13 @@ module Ci
class ArchiveTraceWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
- data_consistency :sticky, feature_flag: :sticky_ci_archive_trace_worker
+ data_consistency :sticky
sidekiq_options retry: 3
include PipelineBackgroundQueue
def perform(job_id)
- archivable_jobs = Ci::Build.without_archived_trace
-
- if Feature.enabled?(:sticky_ci_archive_trace_worker)
- archivable_jobs = archivable_jobs.eager_load_for_archiving_trace
- end
+ archivable_jobs = Ci::Build.without_archived_trace.eager_load_for_archiving_trace
archivable_jobs.find_by_id(job_id).try do |job|
Ci::ArchiveTraceService.new.execute(job, worker_name: self.class.name)
diff --git a/app/workers/ci/build_finished_worker.rb b/app/workers/ci/build_finished_worker.rb
index 2d7f3a67004..25c7637a79f 100644
--- a/app/workers/ci/build_finished_worker.rb
+++ b/app/workers/ci/build_finished_worker.rb
@@ -37,9 +37,10 @@ module Ci
Ci::BuildReportResultService.new.execute(build)
# We execute these async as these are independent operations.
- BuildHooksWorker.perform_async(build.id)
+ BuildHooksWorker.perform_async(build)
ChatNotificationWorker.perform_async(build.id) if build.pipeline.chat?
build.track_deployment_usage
+ build.track_verify_usage
if build.failed? && !build.auto_retry_expected?
::Ci::MergeRequests::AddTodoWhenBuildFailsWorker.perform_async(build.id)
@@ -57,15 +58,7 @@ module Ci
# 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)
- Ci::ArchiveTraceWorker
- else
- ::ArchiveTraceWorker
- end
+ Ci::ArchiveTraceWorker.perform_in(ARCHIVE_TRACES_IN, build.id)
end
end
end
diff --git a/app/workers/ci/pipeline_artifacts/coverage_report_worker.rb b/app/workers/ci/pipeline_artifacts/coverage_report_worker.rb
index 8ee518e3ae6..127eb3b6f44 100644
--- a/app/workers/ci/pipeline_artifacts/coverage_report_worker.rb
+++ b/app/workers/ci/pipeline_artifacts/coverage_report_worker.rb
@@ -15,8 +15,14 @@ module Ci
idempotent!
def perform(pipeline_id)
- Ci::Pipeline.find_by_id(pipeline_id).try do |pipeline|
- Ci::PipelineArtifacts::CoverageReportService.new(pipeline).execute
+ pipeline = Ci::Pipeline.find_by_id(pipeline_id)
+
+ return unless pipeline
+
+ pipeline.root_ancestor.try do |root_ancestor_pipeline|
+ next unless root_ancestor_pipeline.self_and_descendants_complete?
+
+ Ci::PipelineArtifacts::CoverageReportService.new(root_ancestor_pipeline).execute
end
end
end
diff --git a/app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb b/app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb
new file mode 100644
index 00000000000..035b2563e56
--- /dev/null
+++ b/app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Ci
+ module Runners
+ class ReconcileExistingRunnerVersionsCronWorker
+ include ApplicationWorker
+
+ # This worker does not schedule other workers that require context.
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ data_consistency :sticky
+ feature_category :runner_fleet
+ urgency :low
+
+ idempotent!
+
+ def perform
+ result = ::Ci::Runners::ReconcileExistingRunnerVersionsService.new.execute
+ result.each { |key, value| log_extra_metadata_on_done(key, value) }
+ end
+ end
+ end
+end
diff --git a/app/workers/clusters/applications/activate_service_worker.rb b/app/workers/clusters/applications/activate_service_worker.rb
deleted file mode 100644
index abc84bcd093..00000000000
--- a/app/workers/clusters/applications/activate_service_worker.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# This worker was renamed in 15.1, we can delete it in 15.2.
-# See: https://gitlab.com/gitlab-org/gitlab/-/issues/364112
-#
-# rubocop:disable Scalability/IdempotentWorker
-module Clusters
- module Applications
- class ActivateServiceWorker < ActivateIntegrationWorker
- end
- end
-end
diff --git a/app/workers/clusters/applications/deactivate_service_worker.rb b/app/workers/clusters/applications/deactivate_service_worker.rb
deleted file mode 100644
index 88219b8b17e..00000000000
--- a/app/workers/clusters/applications/deactivate_service_worker.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# This worker was renamed in 15.1, we can delete it in 15.2.
-# See: https://gitlab.com/gitlab-org/gitlab/-/issues/364112
-#
-# rubocop:disable Scalability/IdempotentWorker
-module Clusters
- module Applications
- class DeactivateServiceWorker < DeactivateIntegrationWorker
- end
- end
-end
diff --git a/app/workers/concerns/gitlab/github_import/object_importer.rb b/app/workers/concerns/gitlab/github_import/object_importer.rb
index e1f404b250d..c2cd50d8c21 100644
--- a/app/workers/concerns/gitlab/github_import/object_importer.rb
+++ b/app/workers/concerns/gitlab/github_import/object_importer.rb
@@ -23,6 +23,12 @@ module Gitlab
# client - An instance of `Gitlab::GithubImport::Client`
# hash - A Hash containing the details of the object to import.
def import(project, client, hash)
+ if project.import_state&.canceled?
+ info(project.id, message: 'project import canceled')
+
+ return
+ end
+
object = representation_class.from_json_hash(hash)
# To better express in the logs what object is being imported.
diff --git a/app/workers/concerns/gitlab/github_import/stage_methods.rb b/app/workers/concerns/gitlab/github_import/stage_methods.rb
index 225716f6bf3..b12c2311ea8 100644
--- a/app/workers/concerns/gitlab/github_import/stage_methods.rb
+++ b/app/workers/concerns/gitlab/github_import/stage_methods.rb
@@ -9,6 +9,12 @@ module Gitlab
return unless (project = find_project(project_id))
+ if project.import_state&.canceled?
+ info(project_id, message: 'project import canceled')
+
+ return
+ end
+
client = GithubImport.new_client_for(project)
try_import(client, project)
diff --git a/app/workers/concerns/packages/cleanup_artifact_worker.rb b/app/workers/concerns/packages/cleanup_artifact_worker.rb
index a01d7e8abba..7e647ddd229 100644
--- a/app/workers/concerns/packages/cleanup_artifact_worker.rb
+++ b/app/workers/concerns/packages/cleanup_artifact_worker.rb
@@ -9,14 +9,21 @@ module Packages
def perform_work
return unless artifact
- artifact.transaction do
- log_metadata(artifact)
+ begin
+ artifact.transaction do
+ log_metadata(artifact)
- artifact.destroy!
- rescue StandardError
+ artifact.destroy!
+ end
+ rescue StandardError => exception
unless artifact&.destroyed?
artifact&.update_column(:status, :error)
end
+
+ Gitlab::ErrorTracking.log_exception(
+ exception,
+ class: self.class.name
+ )
end
after_destroy
diff --git a/app/workers/concerns/waitable_worker.rb b/app/workers/concerns/waitable_worker.rb
index f8b945b8892..336d60d46ac 100644
--- a/app/workers/concerns/waitable_worker.rb
+++ b/app/workers/concerns/waitable_worker.rb
@@ -5,25 +5,13 @@ module WaitableWorker
class_methods do
# Schedules multiple jobs and waits for them to be completed.
- def bulk_perform_and_wait(args_list, timeout: 10)
+ def bulk_perform_and_wait(args_list)
# Short-circuit: it's more efficient to do small numbers of jobs inline
- return bulk_perform_inline(args_list) if args_list.size <= 3
-
- # Don't wait if there's too many jobs to be waited for. Not including the
- # waiter allows them to be deduplicated and it skips waiting for jobs that
- # are not likely to finish within the timeout. This assumes we can process
- # 10 jobs per second:
- # https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/205
- return bulk_perform_async(args_list) if args_list.length >= 10 * timeout
-
- waiter = Gitlab::JobWaiter.new(args_list.size, worker_label: self.to_s)
-
- # Point all the bulk jobs at the same JobWaiter. Converts, [[1], [2], [3]]
- # into [[1, "key"], [2, "key"], [3, "key"]]
- waiting_args_list = args_list.map { |args| [*args, waiter.key] }
- bulk_perform_async(waiting_args_list)
+ if args_list.size == 1
+ return bulk_perform_inline(args_list)
+ end
- waiter.wait(timeout)
+ bulk_perform_async(args_list)
end
# Performs multiple jobs directly. Failed jobs will be put into sidekiq so
diff --git a/app/workers/container_registry/migration/enqueuer_worker.rb b/app/workers/container_registry/migration/enqueuer_worker.rb
index f3c8dfa63ad..1dd29eff86e 100644
--- a/app/workers/container_registry/migration/enqueuer_worker.rb
+++ b/app/workers/container_registry/migration/enqueuer_worker.rb
@@ -125,17 +125,18 @@ module ContainerRegistry
def next_repository
strong_memoize(:next_repository) do
- # Using .limit(2)[0] instead of take here. Using a LIMIT 1 caused the query planner to
- # use an inefficient sequential scan instead of picking an index. LIMIT 2 works around
+ # Using .limit(25)[0] instead of take here. Using a LIMIT 1 and 2 caused the query planner to
+ # use an inefficient sequential scan instead of picking an index. LIMIT 25 works around
# this issue.
- # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87733 for details.
- ContainerRepository.ready_for_import.limit(2)[0] # rubocop:disable CodeReuse/ActiveRecord
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87733 and
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90735 for details.
+ ContainerRepository.ready_for_import.limit(25)[0] # rubocop:disable CodeReuse/ActiveRecord
end
end
def next_aborted_repository
strong_memoize(:next_aborted_repository) do
- ContainerRepository.with_migration_state('import_aborted').limit(2)[0] # rubocop:disable CodeReuse/ActiveRecord
+ ContainerRepository.with_migration_state('import_aborted').limit(25)[0] # rubocop:disable CodeReuse/ActiveRecord
end
end
diff --git a/app/workers/deployments/hooks_worker.rb b/app/workers/deployments/hooks_worker.rb
index 608601b4eb9..62e75638c7d 100644
--- a/app/workers/deployments/hooks_worker.rb
+++ b/app/workers/deployments/hooks_worker.rb
@@ -16,7 +16,7 @@ module Deployments
log_extra_metadata_on_done(:deployment_project_id, deploy.project.id)
log_extra_metadata_on_done(:deployment_id, params[:deployment_id])
- deploy.execute_hooks(params[:status_changed_at].to_time)
+ deploy.execute_hooks(params[:status], params[:status_changed_at].to_time)
end
end
end
diff --git a/app/workers/gitlab/github_import/advance_stage_worker.rb b/app/workers/gitlab/github_import/advance_stage_worker.rb
index 06f0ef623c2..70d18d8004c 100644
--- a/app/workers/gitlab/github_import/advance_stage_worker.rb
+++ b/app/workers/gitlab/github_import/advance_stage_worker.rb
@@ -23,6 +23,7 @@ module Gitlab
pull_requests_merged_by: Stage::ImportPullRequestsMergedByWorker,
pull_request_reviews: Stage::ImportPullRequestsReviewsWorker,
issues_and_diff_notes: Stage::ImportIssuesAndDiffNotesWorker,
+ issue_events: Stage::ImportIssueEventsWorker,
notes: Stage::ImportNotesWorker,
lfs_objects: Stage::ImportLfsObjectsWorker,
finish: Stage::FinishImportWorker
diff --git a/app/workers/gitlab/github_import/import_issue_event_worker.rb b/app/workers/gitlab/github_import/import_issue_event_worker.rb
new file mode 100644
index 00000000000..d7071d3ee09
--- /dev/null
+++ b/app/workers/gitlab/github_import/import_issue_event_worker.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ class ImportIssueEventWorker # rubocop:disable Scalability/IdempotentWorker
+ include ObjectImporter
+
+ def representation_class
+ Representation::IssueEvent
+ end
+
+ def importer_class
+ Importer::IssueEventImporter
+ end
+
+ def object_type
+ :issue_event
+ end
+ end
+ end
+end
diff --git a/app/workers/gitlab/github_import/stage/import_issue_events_worker.rb b/app/workers/gitlab/github_import/stage/import_issue_events_worker.rb
new file mode 100644
index 00000000000..8155b910677
--- /dev/null
+++ b/app/workers/gitlab/github_import/stage/import_issue_events_worker.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Stage
+ class ImportIssueEventsWorker # rubocop:disable Scalability/IdempotentWorker
+ include ApplicationWorker
+
+ data_consistency :always
+
+ sidekiq_options retry: 3
+ include GithubImport::Queue
+ include StageMethods
+
+ # client - An instance of Gitlab::GithubImport::Client.
+ # project - An instance of Project.
+ def import(client, project)
+ importer = ::Gitlab::GithubImport::Importer::SingleEndpointIssueEventsImporter
+ return skip_to_next_stage(project, importer) if feature_disabled?(project)
+
+ start_importer(project, importer, client)
+ end
+
+ private
+
+ def start_importer(project, importer, client)
+ info(project.id, message: "starting importer", importer: importer.name)
+ waiter = importer.new(project, client).execute
+ move_to_next_stage(project, waiter.key => waiter.jobs_remaining)
+ end
+
+ def skip_to_next_stage(project, importer)
+ info(project.id, message: "skipping importer", importer: importer.name)
+ move_to_next_stage(project)
+ end
+
+ def move_to_next_stage(project, waiters = {})
+ AdvanceStageWorker.perform_async(project.id, waiters, :notes)
+ end
+
+ def feature_disabled?(project)
+ Feature.disabled?(:github_importer_issue_events_import, project.group, type: :ops)
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb b/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb
index 34996b710d4..7922c1113c4 100644
--- a/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb
@@ -21,7 +21,7 @@ module Gitlab
hash[waiter.key] = waiter.jobs_remaining
end
- AdvanceStageWorker.perform_async(project.id, waiters, :notes)
+ AdvanceStageWorker.perform_async(project.id, waiters, :issue_events)
end
# The importers to run in this stage. Issues can't be imported earlier
diff --git a/app/workers/gitlab_service_ping_worker.rb b/app/workers/gitlab_service_ping_worker.rb
index 0f7b3ba56a5..a974667e5e0 100644
--- a/app/workers/gitlab_service_ping_worker.rb
+++ b/app/workers/gitlab_service_ping_worker.rb
@@ -30,8 +30,6 @@ class GitlabServicePingWorker # rubocop:disable Scalability/IdempotentWorker
end
def usage_data
- return unless Feature.enabled?(:prerecord_service_ping_data)
-
ServicePing::BuildPayload.new.execute.tap do |payload|
record = {
recorded_at: payload[:recorded_at],
diff --git a/app/workers/google_cloud/create_cloudsql_instance_worker.rb b/app/workers/google_cloud/create_cloudsql_instance_worker.rb
new file mode 100644
index 00000000000..3c15c59b8d9
--- /dev/null
+++ b/app/workers/google_cloud/create_cloudsql_instance_worker.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module GoogleCloud
+ class CreateCloudsqlInstanceWorker
+ include ApplicationWorker
+
+ data_consistency :always
+ feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned
+ idempotent!
+
+ def perform(user_id, project_id, options = {})
+ user = User.find(user_id)
+ project = Project.find(project_id)
+
+ google_oauth2_token = options[:google_oauth2_token]
+ gcp_project_id = options[:gcp_project_id]
+ instance_name = options[:instance_name]
+ database_version = options[:database_version]
+ environment_name = options[:environment_name]
+ is_protected = options[:is_protected]
+
+ params = {
+ google_oauth2_token: google_oauth2_token,
+ gcp_project_id: gcp_project_id,
+ instance_name: instance_name,
+ database_version: database_version,
+ environment_name: environment_name,
+ is_protected: is_protected
+ }
+
+ response = GoogleCloud::SetupCloudsqlInstanceService.new(project, user, params).execute
+
+ if response[:status] == :error
+ raise response[:message]
+ end
+ end
+ end
+end
diff --git a/app/workers/incident_management/close_incident_worker.rb b/app/workers/incident_management/close_incident_worker.rb
new file mode 100644
index 00000000000..7d45a6785ea
--- /dev/null
+++ b/app/workers/incident_management/close_incident_worker.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ class CloseIncidentWorker
+ include ApplicationWorker
+
+ idempotent!
+ deduplicate :until_executed
+ data_consistency :always
+ feature_category :incident_management
+ urgency :low
+
+ # Issues:CloseService execute webhooks which are treated as external dependencies
+ worker_has_external_dependencies!
+
+ def perform(issue_id)
+ incident = Issue.incident.opened.find_by_id(issue_id)
+
+ return unless incident
+
+ close_incident(incident)
+ add_system_note(incident)
+ end
+
+ private
+
+ def user
+ @user ||= User.alert_bot
+ end
+
+ def close_incident(incident)
+ ::Issues::CloseService
+ .new(project: incident.project, current_user: user)
+ .execute(incident, system_note: false)
+ end
+
+ def add_system_note(incident)
+ return unless incident.reset.closed?
+
+ SystemNoteService.auto_resolve_prometheus_alert(incident, incident.project, user)
+ end
+ end
+end
diff --git a/app/workers/irker_worker.rb b/app/workers/irker_worker.rb
deleted file mode 100644
index a054021e418..00000000000
--- a/app/workers/irker_worker.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-# This worker was renamed in 15.1, we can delete it in 15.2.
-# See: https://gitlab.com/gitlab-org/gitlab/-/issues/364112
-#
-# rubocop: disable Gitlab/NamespacedClass
-# rubocop:disable Scalability/IdempotentWorker
-class IrkerWorker < Integrations::IrkerWorker
-end
diff --git a/app/workers/loose_foreign_keys/cleanup_worker.rb b/app/workers/loose_foreign_keys/cleanup_worker.rb
index 0d04c503fbf..0a3a834578a 100644
--- a/app/workers/loose_foreign_keys/cleanup_worker.rb
+++ b/app/workers/loose_foreign_keys/cleanup_worker.rb
@@ -34,7 +34,7 @@ module LooseForeignKeys
# If two DBs are configured (Main, CI): minute 1 -> Main, minute 2 -> CI
def current_connection_name_and_base_model
minutes_since_epoch = Time.current.to_i / 60
- connections_with_name = Gitlab::Database.database_base_models.to_a # this will never be empty
+ connections_with_name = Gitlab::Database.database_base_models_with_gitlab_shared.to_a # this will never be empty
connections_with_name[minutes_since_epoch % connections_with_name.count]
end
end
diff --git a/app/workers/packages/cleanup/execute_policy_worker.rb b/app/workers/packages/cleanup/execute_policy_worker.rb
new file mode 100644
index 00000000000..59f0f0250c8
--- /dev/null
+++ b/app/workers/packages/cleanup/execute_policy_worker.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+module Packages
+ module Cleanup
+ class ExecutePolicyWorker
+ include ApplicationWorker
+ include LimitedCapacity::Worker
+ include Gitlab::Utils::StrongMemoize
+
+ data_consistency :always
+ queue_namespace :package_cleanup
+ feature_category :package_registry
+ urgency :low
+ worker_resource_boundary :unknown
+ idempotent!
+
+ COUNTS_KEYS = %i[
+ marked_package_files_total_count
+ unique_package_id_and_file_name_total_count
+ ].freeze
+
+ def perform_work
+ return unless next_policy
+
+ log_extra_metadata_on_done(:project_id, next_policy.project_id)
+ result = ::Packages::Cleanup::ExecutePolicyService.new(next_policy).execute
+
+ if result.success?
+ timeout = !!result.payload[:timeout]
+ counts = result.payload[:counts]
+ log_extra_metadata_on_done(:execution_timeout, timeout)
+ COUNTS_KEYS.each do |count_key|
+ log_extra_metadata_on_done(count_key, counts[count_key])
+ end
+ end
+ end
+
+ def remaining_work_count
+ ::Packages::Cleanup::Policy.runnable
+ .limit(max_running_jobs + 1)
+ .count
+ end
+
+ def max_running_jobs
+ ::Gitlab::CurrentSettings.package_registry_cleanup_policies_worker_capacity
+ end
+
+ private
+
+ def next_policy
+ strong_memoize(:next_policy) do
+ ::Packages::Cleanup::Policy.transaction do
+ # the #lock call is specific to this worker
+ # rubocop: disable CodeReuse/ActiveRecord
+ policy = ::Packages::Cleanup::Policy.runnable
+ .limit(1)
+ .lock('FOR UPDATE SKIP LOCKED')
+ .first
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ next nil unless policy
+
+ policy.set_next_run_at
+ policy.save!
+
+ policy
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/packages/cleanup_package_registry_worker.rb b/app/workers/packages/cleanup_package_registry_worker.rb
index a849e055b64..5f14102b5a1 100644
--- a/app/workers/packages/cleanup_package_registry_worker.rb
+++ b/app/workers/packages/cleanup_package_registry_worker.rb
@@ -12,6 +12,7 @@ module Packages
def perform
enqueue_package_file_cleanup_job if Packages::PackageFile.pending_destruction.exists?
+ enqueue_cleanup_policy_jobs if Packages::Cleanup::Policy.runnable.exists?
log_counts
end
@@ -22,6 +23,10 @@ module Packages
Packages::CleanupPackageFileWorker.perform_with_capacity
end
+ def enqueue_cleanup_policy_jobs
+ Packages::Cleanup::ExecutePolicyWorker.perform_with_capacity
+ end
+
def log_counts
use_replica_if_available do
pending_destruction_package_files_count = Packages::PackageFile.pending_destruction.count
@@ -31,6 +36,9 @@ module Packages
log_extra_metadata_on_done(:pending_destruction_package_files_count, pending_destruction_package_files_count)
log_extra_metadata_on_done(:processing_package_files_count, processing_package_files_count)
log_extra_metadata_on_done(:error_package_files_count, error_package_files_count)
+
+ pending_cleanup_policies_count = Packages::Cleanup::Policy.runnable.count
+ log_extra_metadata_on_done(:pending_cleanup_policies_count, pending_cleanup_policies_count)
end
end
diff --git a/app/workers/packages/debian/generate_distribution_worker.rb b/app/workers/packages/debian/generate_distribution_worker.rb
index 1eff3ea02dd..822fe5a1517 100644
--- a/app/workers/packages/debian/generate_distribution_worker.rb
+++ b/app/workers/packages/debian/generate_distribution_worker.rb
@@ -4,6 +4,7 @@ module Packages
module Debian
class GenerateDistributionWorker
include ApplicationWorker
+ include ::Packages::FIPS
data_consistency :always
include Gitlab::Utils::StrongMemoize
@@ -20,6 +21,8 @@ module Packages
loggable_arguments 0
def perform(container_type, distribution_id)
+ raise DisabledError, 'Debian registry is not FIPS compliant' if Gitlab::FIPS.enabled?
+
@container_type = container_type
@distribution_id = distribution_id
diff --git a/app/workers/packages/debian/process_changes_worker.rb b/app/workers/packages/debian/process_changes_worker.rb
index 0a716c61203..d477a6f2e1f 100644
--- a/app/workers/packages/debian/process_changes_worker.rb
+++ b/app/workers/packages/debian/process_changes_worker.rb
@@ -4,6 +4,7 @@ module Packages
module Debian
class ProcessChangesWorker
include ApplicationWorker
+ include ::Packages::FIPS
data_consistency :always
include Gitlab::Utils::StrongMemoize
@@ -15,6 +16,8 @@ module Packages
feature_category :package_registry
def perform(package_file_id, user_id)
+ raise DisabledError, 'Debian registry is not FIPS compliant' if Gitlab::FIPS.enabled?
+
@package_file_id = package_file_id
@user_id = user_id
@@ -22,6 +25,8 @@ module Packages
::Packages::Debian::ProcessChangesService.new(package_file, user).execute
rescue StandardError => e
+ raise if e.instance_of?(DisabledError)
+
Gitlab::ErrorTracking.log_exception(e, package_file_id: @package_file_id, user_id: @user_id)
package_file.destroy!
end
diff --git a/app/workers/pages/invalidate_domain_cache_worker.rb b/app/workers/pages/invalidate_domain_cache_worker.rb
new file mode 100644
index 00000000000..63b6f5c05b5
--- /dev/null
+++ b/app/workers/pages/invalidate_domain_cache_worker.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Pages
+ class InvalidateDomainCacheWorker
+ include Gitlab::EventStore::Subscriber
+
+ idempotent!
+
+ feature_category :pages
+
+ def handle_event(event)
+ if event.data[:project_id]
+ ::Gitlab::Pages::CacheControl
+ .for_project(event.data[:project_id])
+ .clear_cache
+ end
+
+ if event.data[:root_namespace_id]
+ ::Gitlab::Pages::CacheControl
+ .for_namespace(event.data[:root_namespace_id])
+ .clear_cache
+ end
+ end
+ end
+end
diff --git a/app/workers/pages_transfer_worker.rb b/app/workers/pages_transfer_worker.rb
deleted file mode 100644
index 6d3918e7ab6..00000000000
--- a/app/workers/pages_transfer_worker.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class PagesTransferWorker # rubocop:disable Scalability/IdempotentWorker
- include ApplicationWorker
-
- data_consistency :always
-
- sidekiq_options retry: 3
-
- TransferFailedError = Class.new(StandardError)
-
- feature_category :pages
- loggable_arguments 0, 1
-
- def perform(method, args)
- # noop
- # This worker is not necessary anymore and will be removed
- # https://gitlab.com/gitlab-org/gitlab/-/issues/340616
- end
-end
diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb
index 45af15216fc..68a0934e2b7 100644
--- a/app/workers/post_receive.rb
+++ b/app/workers/post_receive.rb
@@ -131,11 +131,24 @@ class PostReceive
repository_update_hook_data = Gitlab::DataBuilder::Repository.update(project, user, changes, refs)
SystemHooksService.new.execute_hooks(repository_update_hook_data, :repository_update_hooks)
Gitlab::UsageDataCounters::SourceCodeCounter.count(:pushes)
+ emit_snowplow_event(project, user)
end
def log(message)
Gitlab::GitLogger.error("POST-RECEIVE: #{message}")
end
+
+ def emit_snowplow_event(project, user)
+ return unless Feature.enabled?(:route_hll_to_snowplow_phase2, project.namespace)
+
+ Gitlab::Tracking.event(
+ 'PostReceive',
+ 'source_code_pushes',
+ project: project,
+ namespace: project.namespace,
+ user: user
+ )
+ end
end
PostReceive.prepend_mod_with('PostReceive')
diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb
deleted file mode 100644
index 56ac4bc046a..00000000000
--- a/app/workers/project_service_worker.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# This worker was renamed in 15.1, we can delete it in 15.2.
-# See: https://gitlab.com/gitlab-org/gitlab/-/issues/364112
-#
-# rubocop: disable Gitlab/NamespacedClass
-# rubocop: disable Scalability/IdempotentWorker
-class ProjectServiceWorker < Integrations::ExecuteWorker
- data_consistency :always
- sidekiq_options retry: 3
- sidekiq_options dead: false
- feature_category :integrations
- urgency :low
-
- worker_has_external_dependencies!
-end
diff --git a/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb b/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb
index a91af72cc2c..705bf0534f7 100644
--- a/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb
+++ b/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb
@@ -5,10 +5,6 @@ module Projects
include ApplicationWorker
include LimitedCapacity::Worker
- MAX_RUNNING_LOW = 2
- MAX_RUNNING_MEDIUM = 20
- MAX_RUNNING_HIGH = 50
-
data_consistency :always
feature_category :build_artifacts
@@ -37,12 +33,8 @@ module Projects
end
def max_running_jobs
- if ::Feature.enabled?(:projects_build_artifacts_size_refresh_high)
- MAX_RUNNING_HIGH
- elsif ::Feature.enabled?(:projects_build_artifacts_size_refresh_medium)
- MAX_RUNNING_MEDIUM
- elsif ::Feature.enabled?(:projects_build_artifacts_size_refresh_low)
- MAX_RUNNING_LOW
+ if ::Feature.enabled?(:projects_build_artifacts_size_refresh, type: :ops)
+ 10
else
0
end
diff --git a/app/workers/web_hooks/destroy_worker.rb b/app/workers/web_hooks/destroy_worker.rb
deleted file mode 100644
index 8f9b194f88a..00000000000
--- a/app/workers/web_hooks/destroy_worker.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-module WebHooks
- class DestroyWorker
- include ApplicationWorker
-
- DestroyError = Class.new(StandardError)
-
- data_consistency :always
- sidekiq_options retry: 3
- feature_category :integrations
- urgency :high
-
- idempotent!
-
- def perform(user_id, web_hook_id)
- user = User.find_by_id(user_id)
- hook = WebHook.find_by_id(web_hook_id)
-
- return unless user && hook
-
- result = ::WebHooks::DestroyService.new(user).sync_destroy(hook)
-
- result.track_and_raise_exception(as: DestroyError, web_hook_id: hook.id)
- end
- end
-end
diff --git a/config/application.rb b/config/application.rb
index ad76a6d8e7e..b758f2df857 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -20,6 +20,8 @@ module Gitlab
config.view_component.preview_route = "/-/view_component/previews"
+ config.active_support.hash_digest_class = ::OpenSSL::Digest::SHA256
+
# This section contains configuration from Rails upgrades to override the new defaults so that we
# keep existing behavior.
#
@@ -38,7 +40,6 @@ module Gitlab
# Rails 5.2
config.action_dispatch.use_authenticated_cookie_encryption = false
config.active_support.use_authenticated_message_encryption = false
- config.active_support.hash_digest_class = ::Digest::MD5 # New default is ::Digest::SHA1
config.action_controller.default_protect_from_forgery = false
config.action_view.form_with_generates_ids = false
@@ -303,6 +304,7 @@ module Gitlab
config.assets.precompile << "page_bundles/terms.css"
config.assets.precompile << "page_bundles/todos.css"
config.assets.precompile << "page_bundles/wiki.css"
+ config.assets.precompile << "page_bundles/work_items.css"
config.assets.precompile << "page_bundles/xterm.css"
config.assets.precompile << "lazy_bundles/cropper.css"
config.assets.precompile << "lazy_bundles/select2.css"
@@ -404,6 +406,16 @@ module Gitlab
end
end
+ # Cross-origin requests must be enabled to fetch the self-managed application oauth application ID
+ # for the GitLab for Jira app.
+ allow do
+ origins '*'
+ resource '/-/jira_connect/oauth_application_id',
+ headers: :any,
+ methods: %i(get options),
+ credentials: false
+ end
+
# These are routes from doorkeeper-openid_connect:
# https://github.com/doorkeeper-gem/doorkeeper-openid_connect#routes
allow do
@@ -492,19 +504,6 @@ module Gitlab
end
end
- # We know Rails closes database connections in the
- # active_record.clear_active_connections initializer, so only log database
- # connections opened after that.
- initializer :start_logging_new_postgresql_connections, after: :finisher_hook do
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.warn_on_new_connection = true
- end
-
- # It is legitimate to open database connections after initializers so stop
- # logging
- initializer :stop_logging_new_postgresql_connections, after: :set_routes_reloader_hook do
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.warn_on_new_connection = false
- end
-
# Add assets for variants of GitLab. They should take precedence over CE.
# This means if multiple files exist, e.g.:
#
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 076957f3057..5b72c6b35f8 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -37,6 +37,9 @@ Rails.application.configure do
# Expands the lines which load the assets
# config.assets.debug = true
+ # Annotate rendered view with template file names as HTML comments
+ config.action_view.annotate_rendered_view_with_filenames = true
+
# Adds additional error checking when serving assets at runtime.
# Checks for improperly declared sprockets dependencies.
# Raises helpful error messages.
@@ -66,6 +69,7 @@ Rails.application.configure do
config.active_record.migration_error = false
config.active_record.verbose_query_logs = false
config.action_view.cache_template_loading = true
+ config.action_view.annotate_rendered_view_with_filenames = false
config.middleware.delete BetterErrors::Middleware
end
diff --git a/config/events/1655179428_design_actions_create_.yml b/config/events/1655179428_design_actions_create_.yml
new file mode 100644
index 00000000000..25e03a08a7a
--- /dev/null
+++ b/config/events/1655179428_design_actions_create_.yml
@@ -0,0 +1,25 @@
+---
+description: Triggered from backend layer when design is created
+category: design_actions
+action: create
+label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: plan
+product_group: group::product_planning
+product_category: design_management
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/events/1655179485_design_actions_update_.yml b/config/events/1655179485_design_actions_update_.yml
new file mode 100644
index 00000000000..7648e51f0ae
--- /dev/null
+++ b/config/events/1655179485_design_actions_update_.yml
@@ -0,0 +1,25 @@
+---
+description: Triggered from backend layer when design is updated
+category: design_actions
+action: update
+label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: plan
+product_group: group::product_planning
+product_category: design_management
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/events/1655179517_design_actions_destroy_.yml b/config/events/1655179517_design_actions_destroy_.yml
new file mode 100644
index 00000000000..fd75f698e5e
--- /dev/null
+++ b/config/events/1655179517_design_actions_destroy_.yml
@@ -0,0 +1,25 @@
+---
+description: Triggered from backend layer when design is deleted
+category: design_actions
+action: destroy
+label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: plan
+product_group: group::product_planning
+product_category: design_management
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/events/1655281022_i_search_total.yml b/config/events/1655281022_i_search_total.yml
new file mode 100644
index 00000000000..1fe8432fff0
--- /dev/null
+++ b/config/events/1655281022_i_search_total.yml
@@ -0,0 +1,25 @@
+---
+description: Triggered from backend layer Search controller performs search operation
+category: SearchController
+action: i_search_total
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90224
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
diff --git a/config/events/1655726589_ide_edit_g_edit_by_web_ide.yml b/config/events/1655726589_ide_edit_g_edit_by_web_ide.yml
new file mode 100644
index 00000000000..128bfaf6029
--- /dev/null
+++ b/config/events/1655726589_ide_edit_g_edit_by_web_ide.yml
@@ -0,0 +1,22 @@
+---
+description: Triggered from backend on editing file in web ide
+category: ide_edit
+action: g_edit_by_web_ide
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90484
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
+
diff --git a/config/events/1655726622_ide_edit_g_edit_by_live_preview.yml b/config/events/1655726622_ide_edit_g_edit_by_live_preview.yml
new file mode 100644
index 00000000000..d9d54e1c311
--- /dev/null
+++ b/config/events/1655726622_ide_edit_g_edit_by_live_preview.yml
@@ -0,0 +1,22 @@
+---
+description: Triggered from backend on showing a file in live preview
+category: ide_edit
+action: g_edit_by_live_preview
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90484
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
+
diff --git a/config/events/1655726650_ide_edit_g_edit_by_sfe.yml b/config/events/1655726650_ide_edit_g_edit_by_sfe.yml
new file mode 100644
index 00000000000..9acdc317cf5
--- /dev/null
+++ b/config/events/1655726650_ide_edit_g_edit_by_sfe.yml
@@ -0,0 +1,22 @@
+---
+description: Triggered from backend on editing file by sfe
+category: ide_edit
+action: g_edit_by_sfe
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90484
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
+
diff --git a/config/events/1655726683_ide_edit_g_edit_by_snippet_ide.yml b/config/events/1655726683_ide_edit_g_edit_by_snippet_ide.yml
new file mode 100644
index 00000000000..2b3ed1a5d7a
--- /dev/null
+++ b/config/events/1655726683_ide_edit_g_edit_by_snippet_ide.yml
@@ -0,0 +1,22 @@
+---
+description: Triggered from backend on editing file by ide snippet
+category: ide_edit
+action: g_edit_by_snippet_ide
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90484
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
+
diff --git a/config/events/1655841083_projects_settings_cicd_show_render.yml b/config/events/1655841083_projects_settings_cicd_show_render.yml
new file mode 100644
index 00000000000..45f0037443b
--- /dev/null
+++ b/config/events/1655841083_projects_settings_cicd_show_render.yml
@@ -0,0 +1,26 @@
+---
+description: Load Project-level Secure Files list in CI/CD settings
+category: projects:settings:ci_cd:show
+action: render
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: ops
+product_stage: verify
+product_group: group::pipeline_authoring
+product_category: secrets_management
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90449
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
+
diff --git a/config/events/1655841352_projects_settings_cicd_show_upload.yml b/config/events/1655841352_projects_settings_cicd_show_upload.yml
new file mode 100644
index 00000000000..a19462d671e
--- /dev/null
+++ b/config/events/1655841352_projects_settings_cicd_show_upload.yml
@@ -0,0 +1,25 @@
+---
+description: Upload a Project-level Secure Files in the CI/CD settings page
+category: projects:settings:ci_cd:show
+action: upload
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: ops
+product_stage: verify
+product_group: group::pipeline_authoring
+product_category: secrets_management
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90449
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
diff --git a/config/events/1655841364_projects_settings_cicd_show_delete.yml b/config/events/1655841364_projects_settings_cicd_show_delete.yml
new file mode 100644
index 00000000000..c106ab376e3
--- /dev/null
+++ b/config/events/1655841364_projects_settings_cicd_show_delete.yml
@@ -0,0 +1,25 @@
+---
+description: Delete a Project-level Secure Files via the CI/CD settings page
+category: projects:settings:ci_cd:show
+action: delete
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: ops
+product_stage: verify
+product_group: group::pipeline_authoring
+product_category: secrets_management
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90449
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
diff --git a/config/events/1656510012_merge_requests_i_code_review_user_approve_mr.yml b/config/events/1656510012_merge_requests_i_code_review_user_approve_mr.yml
new file mode 100644
index 00000000000..10ebf12253f
--- /dev/null
+++ b/config/events/1656510012_merge_requests_i_code_review_user_approve_mr.yml
@@ -0,0 +1,26 @@
+---
+description: Merge request approvals
+category: merge_requests
+action: i_code_review_user_approve_mr
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: 'TBD'
+product_stage: create
+product_group: code_review
+product_category: code_review
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91493
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
+
diff --git a/config/events/1656554755_issues_edit_g_project_management_issue_added_to_epic.yml b/config/events/1656554755_issues_edit_g_project_management_issue_added_to_epic.yml
new file mode 100644
index 00000000000..0c1ea4584e1
--- /dev/null
+++ b/config/events/1656554755_issues_edit_g_project_management_issue_added_to_epic.yml
@@ -0,0 +1,20 @@
+---
+description: Issue was added to an epic
+category: issues_edit
+action: g_project_management_issue_added_to_epic
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: plan
+product_group: project_management
+product_category: issue_tracking
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91443
+distributions:
+ - ee
+tiers:
+ - premium
+ - ultimate
+
diff --git a/config/events/1656555050_issues_edit_g_project_management_issue_changed_epic.yml b/config/events/1656555050_issues_edit_g_project_management_issue_changed_epic.yml
new file mode 100644
index 00000000000..b74054b4eb5
--- /dev/null
+++ b/config/events/1656555050_issues_edit_g_project_management_issue_changed_epic.yml
@@ -0,0 +1,20 @@
+---
+description: Epic was changed on an issue
+category: issues_edit
+action: g_project_management_issue_changed_epic
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: plan
+product_group: project_management
+product_category: issue_tracking
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91443
+distributions:
+ - ee
+tiers:
+ - premium
+ - ultimate
+
diff --git a/config/events/1656555163_issues_edit_g_project_management_issue_health_status_changed.yml b/config/events/1656555163_issues_edit_g_project_management_issue_health_status_changed.yml
new file mode 100644
index 00000000000..00a375074f6
--- /dev/null
+++ b/config/events/1656555163_issues_edit_g_project_management_issue_health_status_changed.yml
@@ -0,0 +1,20 @@
+---
+description: Health status was changed on an issue
+category: issues_edit
+action: g_project_management_issue_health_status_changed
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: plan
+product_group: project_management
+product_category: issue_tracking
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91443
+distributions:
+ - ee
+tiers:
+ - premium
+ - ultimate
+
diff --git a/config/events/1656555272_issues_edit_g_project_management_issue_iteration_changed.yml b/config/events/1656555272_issues_edit_g_project_management_issue_iteration_changed.yml
new file mode 100644
index 00000000000..7e755c6e0e9
--- /dev/null
+++ b/config/events/1656555272_issues_edit_g_project_management_issue_iteration_changed.yml
@@ -0,0 +1,20 @@
+---
+description: Issue's iteration was changed
+category: issues_edit
+action: g_project_management_issue_iteration_changed
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: plan
+product_group: project_management
+product_category: issue_tracking
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91443
+distributions:
+ - ee
+tiers:
+ - premium
+ - ultimate
+
diff --git a/config/events/1656555342_issues_edit_g_project_management_issue_removed_from_epic.yml b/config/events/1656555342_issues_edit_g_project_management_issue_removed_from_epic.yml
new file mode 100644
index 00000000000..5241e48ee9f
--- /dev/null
+++ b/config/events/1656555342_issues_edit_g_project_management_issue_removed_from_epic.yml
@@ -0,0 +1,20 @@
+---
+description: An issue was removed from an epic
+category: issues_edit
+action: g_project_management_issue_removed_from_epic
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: plan
+product_group: project_management
+product_category: issue_tracking
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91443
+distributions:
+ - ee
+tiers:
+ - premium
+ - ultimate
+
diff --git a/config/events/1656555426_issues_edit_g_project_management_issue_weight_changed.yml b/config/events/1656555426_issues_edit_g_project_management_issue_weight_changed.yml
new file mode 100644
index 00000000000..99492d50176
--- /dev/null
+++ b/config/events/1656555426_issues_edit_g_project_management_issue_weight_changed.yml
@@ -0,0 +1,20 @@
+---
+description: Issue's weight was changed
+category: issues_edit
+action: g_project_management_issue_weight_changed
+identifiers:
+ - project
+ - user
+ - namespace
+product_section: dev
+product_stage: plan
+product_group: project_management
+product_category: issue_tracking
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91443
+distributions:
+ - ee
+tiers:
+ - premium
+ - ultimate
+
diff --git a/config/events/1656690716_post_receive_source_code_pushes.yml b/config/events/1656690716_post_receive_source_code_pushes.yml
new file mode 100644
index 00000000000..d0c9fa35d09
--- /dev/null
+++ b/config/events/1656690716_post_receive_source_code_pushes.yml
@@ -0,0 +1,26 @@
+---
+description: All events of Git push operations
+category: PostReceive
+action: source_code_pushes
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: create
+product_group: source_code
+product_category: source_code_management
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91605
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
+
diff --git a/config/feature_flags/development/about_your_company_registration_flow.yml b/config/feature_flags/development/about_your_company_registration_flow.yml
index 424de7a9ba2..63c1e42972a 100644
--- a/config/feature_flags/development/about_your_company_registration_flow.yml
+++ b/config/feature_flags/development/about_your_company_registration_flow.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83345
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355909
milestone: '14.10'
type: development
-group: group::adoption
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/development/access_token_pagination.yml b/config/feature_flags/development/access_token_pagination.yml
new file mode 100644
index 00000000000..df003ed8891
--- /dev/null
+++ b/config/feature_flags/development/access_token_pagination.yml
@@ -0,0 +1,8 @@
+---
+name: access_token_pagination
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91372
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366534
+milestone: '15.2'
+type: development
+group: group::authentication and authorization
+default_enabled: false
diff --git a/config/feature_flags/development/active_support_hash_digest_sha256.yml b/config/feature_flags/development/active_support_hash_digest_sha256.yml
deleted file mode 100644
index 147b84bf112..00000000000
--- a/config/feature_flags/development/active_support_hash_digest_sha256.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: active_support_hash_digest_sha256
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90098
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365314
-milestone: '15.1'
-type: development
-group: group::sharding
-default_enabled: false
diff --git a/config/feature_flags/development/allow_possible_spam.yml b/config/feature_flags/development/allow_possible_spam.yml
index 3f7a084130a..89393c91c43 100644
--- a/config/feature_flags/development/allow_possible_spam.yml
+++ b/config/feature_flags/development/allow_possible_spam.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17604
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/33421
milestone: '12.4'
type: development
-group: group::product planning
+group: group::anti-abuse
default_enabled: false
diff --git a/config/feature_flags/development/approval_rules_pagination.yml b/config/feature_flags/development/approval_rules_pagination.yml
new file mode 100644
index 00000000000..494109e3f5a
--- /dev/null
+++ b/config/feature_flags/development/approval_rules_pagination.yml
@@ -0,0 +1,8 @@
+---
+name: approval_rules_pagination
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91702
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366823
+milestone: '15.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/auto_ban_user_on_excessive_projects_download.yml b/config/feature_flags/development/auto_ban_user_on_excessive_projects_download.yml
new file mode 100644
index 00000000000..d3883086088
--- /dev/null
+++ b/config/feature_flags/development/auto_ban_user_on_excessive_projects_download.yml
@@ -0,0 +1,8 @@
+---
+name: auto_ban_user_on_excessive_projects_download
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87872
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364782
+milestone: '15.2'
+type: development
+group: group::anti-abuse
+default_enabled: false
diff --git a/config/feature_flags/development/batch_load_environment_last_deployment_group.yml b/config/feature_flags/development/batch_load_environment_last_deployment_group.yml
index d6de45eacdf..4d35b638fbc 100644
--- a/config/feature_flags/development/batch_load_environment_last_deployment_group.yml
+++ b/config/feature_flags/development/batch_load_environment_last_deployment_group.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/363023
milestone: '15.1'
type: development
group: group::release
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/blame_page_pagination.yml b/config/feature_flags/development/blame_page_pagination.yml
index 49fb1a7f605..8465b40b4c5 100644
--- a/config/feature_flags/development/blame_page_pagination.yml
+++ b/config/feature_flags/development/blame_page_pagination.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360927
milestone: '15.0'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/cache_pages_domain_api.yml b/config/feature_flags/development/cache_pages_domain_api.yml
new file mode 100644
index 00000000000..409497aa22d
--- /dev/null
+++ b/config/feature_flags/development/cache_pages_domain_api.yml
@@ -0,0 +1,8 @@
+---
+name: cache_pages_domain_api
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88956
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364127
+milestone: '15.2'
+type: development
+group: group::editor
+default_enabled: false
diff --git a/config/feature_flags/development/cache_unleash_client_api.yml b/config/feature_flags/development/cache_unleash_client_api.yml
new file mode 100644
index 00000000000..dcaa9c323c4
--- /dev/null
+++ b/config/feature_flags/development/cache_unleash_client_api.yml
@@ -0,0 +1,8 @@
+---
+name: cache_unleash_client_api
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90490
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365575
+milestone: '15.2'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/change_response_code_merge_status.yml b/config/feature_flags/development/change_response_code_merge_status.yml
index 89092fe4164..9f102d70354 100644
--- a/config/feature_flags/development/change_response_code_merge_status.yml
+++ b/config/feature_flags/development/change_response_code_merge_status.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356930
milestone: '15.1'
type: development
group: group::code review
-default_enabled: false
+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
deleted file mode 100644
index 3b25bc1ed39..00000000000
--- a/config/feature_flags/development/ci_build_finished_worker_namespace_changed.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-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_child_pipeline_coverage_reports.yml b/config/feature_flags/development/ci_child_pipeline_coverage_reports.yml
deleted file mode 100644
index c77bd223eff..00000000000
--- a/config/feature_flags/development/ci_child_pipeline_coverage_reports.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_child_pipeline_coverage_reports
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88626
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/363557
-milestone: '15.1'
-type: development
-group: group::pipeline insights
-default_enabled: false
diff --git a/config/feature_flags/development/ci_disallow_to_create_merge_request_pipelines_in_target_project.yml b/config/feature_flags/development/ci_disallow_to_create_merge_request_pipelines_in_target_project.yml
deleted file mode 100644
index 3962af65540..00000000000
--- a/config/feature_flags/development/ci_disallow_to_create_merge_request_pipelines_in_target_project.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_disallow_to_create_merge_request_pipelines_in_target_project
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40724
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/235119
-milestone: '13.4'
-type: development
-group: group::release
-default_enabled: false
diff --git a/config/feature_flags/development/ci_docker_image_pull_policy.yml b/config/feature_flags/development/ci_docker_image_pull_policy.yml
index 09e01fb5232..5bdcdf03d27 100644
--- a/config/feature_flags/development/ci_docker_image_pull_policy.yml
+++ b/config/feature_flags/development/ci_docker_image_pull_policy.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/363186
milestone: '15.1'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/ci_increase_includes_to_250.yml b/config/feature_flags/development/ci_increase_includes_to_250.yml
new file mode 100644
index 00000000000..b6291ab0cd3
--- /dev/null
+++ b/config/feature_flags/development/ci_increase_includes_to_250.yml
@@ -0,0 +1,8 @@
+---
+name: ci_increase_includes_to_250
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64934
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/344449
+milestone: '15.2'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_minimal_cost_factor_for_gitlab_contributors.yml b/config/feature_flags/development/ci_minimal_cost_factor_for_gitlab_contributors.yml
new file mode 100644
index 00000000000..e571abdc97f
--- /dev/null
+++ b/config/feature_flags/development/ci_minimal_cost_factor_for_gitlab_contributors.yml
@@ -0,0 +1,8 @@
+---
+name: ci_minimal_cost_factor_for_gitlab_contributors
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89742
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365862
+milestone: '15.2'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_minutes_cost_factor_for_all_public_projects.yml b/config/feature_flags/development/ci_minutes_cost_factor_for_all_public_projects.yml
deleted file mode 100644
index 24932e0cfe4..00000000000
--- a/config/feature_flags/development/ci_minutes_cost_factor_for_all_public_projects.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_minutes_cost_factor_for_all_public_projects
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85357
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359094
-milestone: '15.0'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_pending_builds_maintain_denormalized_data.yml b/config/feature_flags/development/ci_pending_builds_maintain_denormalized_data.yml
deleted file mode 100644
index 51c9fd21564..00000000000
--- a/config/feature_flags/development/ci_pending_builds_maintain_denormalized_data.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pending_builds_maintain_denormalized_data
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75425
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354496
-milestone: '14.6'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_pending_builds_queue_source.yml b/config/feature_flags/development/ci_pending_builds_queue_source.yml
deleted file mode 100644
index 5fc2fcdb77a..00000000000
--- a/config/feature_flags/development/ci_pending_builds_queue_source.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pending_builds_queue_source
-introduced_by_url:
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354496
-milestone: '14.0'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_queuing_use_denormalized_data_strategy.yml b/config/feature_flags/development/ci_queuing_use_denormalized_data_strategy.yml
deleted file mode 100644
index 43c7c8e7c2a..00000000000
--- a/config/feature_flags/development/ci_queuing_use_denormalized_data_strategy.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_queuing_use_denormalized_data_strategy
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76543
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354496
-milestone: '14.6'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/closed_as_duplicate_of_issues_api.yml b/config/feature_flags/development/closed_as_duplicate_of_issues_api.yml
deleted file mode 100644
index 6628feb3879..00000000000
--- a/config/feature_flags/development/closed_as_duplicate_of_issues_api.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: closed_as_duplicate_of_issues_api
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89375
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364749
-milestone: '15.1'
-type: development
-group: group::respond
-default_enabled: false
diff --git a/config/feature_flags/development/confidential_notes.yml b/config/feature_flags/development/confidential_notes.yml
deleted file mode 100644
index 8c7197d2ef9..00000000000
--- a/config/feature_flags/development/confidential_notes.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: confidential_notes
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52949
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/207474
-milestone: '13.9'
-type: development
-group: group::product planning
-default_enabled: true
diff --git a/config/feature_flags/development/contacts_autocomplete.yml b/config/feature_flags/development/contacts_autocomplete.yml
deleted file mode 100644
index 2b0908e7343..00000000000
--- a/config/feature_flags/development/contacts_autocomplete.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: contacts_autocomplete
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79639
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352123
-milestone: '14.8'
-type: development
-group: group::product planning
-default_enabled: true
diff --git a/config/feature_flags/development/container_registry_legacy_authentication_for_deploy_tokens.yml b/config/feature_flags/development/container_registry_legacy_authentication_for_deploy_tokens.yml
new file mode 100644
index 00000000000..fefc84ed0a0
--- /dev/null
+++ b/config/feature_flags/development/container_registry_legacy_authentication_for_deploy_tokens.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_legacy_authentication_for_deploy_tokens
+introduced_by_url: https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/2470
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365968
+milestone: '15.1'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_registry_show_shortened_path.yml b/config/feature_flags/development/container_registry_show_shortened_path.yml
new file mode 100644
index 00000000000..33781386e8a
--- /dev/null
+++ b/config/feature_flags/development/container_registry_show_shortened_path.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_show_shortened_path
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91548
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366808
+milestone: '15.2'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/contribution_analytics_optimized_base_query.yml b/config/feature_flags/development/contribution_analytics_optimized_base_query.yml
new file mode 100644
index 00000000000..0e8697fb206
--- /dev/null
+++ b/config/feature_flags/development/contribution_analytics_optimized_base_query.yml
@@ -0,0 +1,8 @@
+---
+name: contribution_analytics_optimized_base_query
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91468
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367090
+milestone: '15.2'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/config/feature_flags/development/custom_headers_streaming_audit_events_ui.yml b/config/feature_flags/development/custom_headers_streaming_audit_events_ui.yml
new file mode 100644
index 00000000000..710a4f55130
--- /dev/null
+++ b/config/feature_flags/development/custom_headers_streaming_audit_events_ui.yml
@@ -0,0 +1,8 @@
+---
+name: custom_headers_streaming_audit_events_ui
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90135
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365259
+milestone: '15.2'
+type: development
+group: group::compliance
+default_enabled: false
diff --git a/config/feature_flags/development/delay_for_repository_update_mirror.yml b/config/feature_flags/development/delay_for_repository_update_mirror.yml
new file mode 100644
index 00000000000..c736036beb5
--- /dev/null
+++ b/config/feature_flags/development/delay_for_repository_update_mirror.yml
@@ -0,0 +1,8 @@
+---
+name: delay_for_repository_update_mirror
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90749
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365948
+milestone: '15.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/delayed_project_import_schedule_worker.yml b/config/feature_flags/development/delayed_project_import_schedule_worker.yml
deleted file mode 100644
index cdf42fbb8ec..00000000000
--- a/config/feature_flags/development/delayed_project_import_schedule_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: delayed_project_import_schedule_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87438
-rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1681
-milestone: '15.0'
-type: development
-group: group::scalability
-default_enabled: false
diff --git a/config/feature_flags/development/deployment_hooks_skip_worker.yml b/config/feature_flags/development/deployment_hooks_skip_worker.yml
deleted file mode 100644
index d7d35912e2d..00000000000
--- a/config/feature_flags/development/deployment_hooks_skip_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: deployment_hooks_skip_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83351
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356468
-milestone: '14.10'
-type: development
-group: group::integrations
-default_enabled: false
diff --git a/config/feature_flags/development/edit_tag_release_notes_via_release_page.yml b/config/feature_flags/development/edit_tag_release_notes_via_release_page.yml
new file mode 100644
index 00000000000..1f67eafc06b
--- /dev/null
+++ b/config/feature_flags/development/edit_tag_release_notes_via_release_page.yml
@@ -0,0 +1,8 @@
+---
+name: edit_tag_release_notes_via_release_page
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88832
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366244
+milestone: '15.2'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/externally_stored_diffs_caching_export.yml b/config/feature_flags/development/externally_stored_diffs_caching_export.yml
new file mode 100644
index 00000000000..395ce5c7cb9
--- /dev/null
+++ b/config/feature_flags/development/externally_stored_diffs_caching_export.yml
@@ -0,0 +1,8 @@
+---
+name: externally_stored_diffs_caching_export
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90159
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366255
+milestone: '15.2'
+type: development
+group: group::import
+default_enabled: false
diff --git a/config/feature_flags/development/file_identifier_hash.yml b/config/feature_flags/development/file_identifier_hash.yml
deleted file mode 100644
index 84879e6c33e..00000000000
--- a/config/feature_flags/development/file_identifier_hash.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: file_identifier_hash
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33028
-rollout_issue_url:
-milestone: '13.1'
-type: development
-group: group::code review
-default_enabled: false
diff --git a/config/feature_flags/development/fix_sliding_list_partitioning.yml b/config/feature_flags/development/fix_sliding_list_partitioning.yml
index 90b4bf87740..7d553ea938c 100644
--- a/config/feature_flags/development/fix_sliding_list_partitioning.yml
+++ b/config/feature_flags/development/fix_sliding_list_partitioning.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/362246
milestone: '15.1'
type: development
group: group::sharding
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/git_abuse_rate_limit_feature_flag.yml b/config/feature_flags/development/git_abuse_rate_limit_feature_flag.yml
new file mode 100644
index 00000000000..c71a5064b29
--- /dev/null
+++ b/config/feature_flags/development/git_abuse_rate_limit_feature_flag.yml
@@ -0,0 +1,8 @@
+---
+name: git_abuse_rate_limit_feature_flag
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87872
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364782
+milestone: '15.1'
+type: development
+group: group::anti-abuse
+default_enabled: false
diff --git a/config/feature_flags/development/gitlab_error_tracking.yml b/config/feature_flags/development/gitlab_error_tracking.yml
new file mode 100644
index 00000000000..fa185416a94
--- /dev/null
+++ b/config/feature_flags/development/gitlab_error_tracking.yml
@@ -0,0 +1,8 @@
+---
+name: gitlab_error_tracking
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91148
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366382
+milestone: '15.2'
+type: development
+group: group::observability
+default_enabled: false
diff --git a/config/feature_flags/development/group_name_path_vue.yml b/config/feature_flags/development/group_name_path_vue.yml
deleted file mode 100644
index 6ecb0eaf20e..00000000000
--- a/config/feature_flags/development/group_name_path_vue.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_name_path_vue
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88085
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/363623
-milestone: '15.1'
-type: development
-group: group::workspace
-default_enabled: false
diff --git a/config/feature_flags/development/hard_failure_for_mirrors_without_license.yml b/config/feature_flags/development/hard_failure_for_mirrors_without_license.yml
new file mode 100644
index 00000000000..f138c8ea497
--- /dev/null
+++ b/config/feature_flags/development/hard_failure_for_mirrors_without_license.yml
@@ -0,0 +1,8 @@
+---
+name: hard_failure_for_mirrors_without_license
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92422
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367851
+milestone: '15.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/highlight_js.yml b/config/feature_flags/development/highlight_js.yml
index 40ea462447e..65f5fbc5b89 100644
--- a/config/feature_flags/development/highlight_js.yml
+++ b/config/feature_flags/development/highlight_js.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346257
milestone: '14.6'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/import_release_authors_from_github.yml b/config/feature_flags/development/import_release_authors_from_github.yml
index b0ddca12d87..c263892fbf8 100644
--- a/config/feature_flags/development/import_release_authors_from_github.yml
+++ b/config/feature_flags/development/import_release_authors_from_github.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343448
milestone: '15.1'
type: development
group: group::release
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/incident_timeline.yml b/config/feature_flags/development/incident_timeline.yml
index 09a08b9fcb6..587ef8b55e8 100644
--- a/config/feature_flags/development/incident_timeline.yml
+++ b/config/feature_flags/development/incident_timeline.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353426
milestone: '14.9'
type: development
group: group::respond
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/infinitely_collapsible_sections.yml b/config/feature_flags/development/infinitely_collapsible_sections.yml
deleted file mode 100644
index 44f37c06d70..00000000000
--- a/config/feature_flags/development/infinitely_collapsible_sections.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-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/issue_email_participants.yml b/config/feature_flags/development/issue_email_participants.yml
index 1459d2bc7f5..b5ebb9d8c13 100644
--- a/config/feature_flags/development/issue_email_participants.yml
+++ b/config/feature_flags/development/issue_email_participants.yml
@@ -1,7 +1,7 @@
---
name: issue_email_participants
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49264
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350460
milestone: '13.8'
type: development
group: group::product planning
diff --git a/config/feature_flags/development/issues_full_text_search.yml b/config/feature_flags/development/issues_full_text_search.yml
index 354dbede75f..31fe543e35e 100644
--- a/config/feature_flags/development/issues_full_text_search.yml
+++ b/config/feature_flags/development/issues_full_text_search.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354784
milestone: '14.5'
type: development
group: group::project management
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/job_log_search.yml b/config/feature_flags/development/job_log_search.yml
new file mode 100644
index 00000000000..b6f1cec26f6
--- /dev/null
+++ b/config/feature_flags/development/job_log_search.yml
@@ -0,0 +1,8 @@
+---
+name: job_log_search
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91293
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366455
+milestone: '15.2'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/jobs_table_vue.yml b/config/feature_flags/development/jobs_table_vue.yml
deleted file mode 100644
index ea489278b20..00000000000
--- a/config/feature_flags/development/jobs_table_vue.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: jobs_table_vue
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57155
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/327500
-milestone: '13.11'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/jobs_table_vue_search.yml b/config/feature_flags/development/jobs_table_vue_search.yml
deleted file mode 100644
index ad0c25eccce..00000000000
--- a/config/feature_flags/development/jobs_table_vue_search.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: jobs_table_vue_search
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82539
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356007
-milestone: '14.10'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/legacy_merge_request_state_check_for_merged_result_pipelines.yml b/config/feature_flags/development/legacy_merge_request_state_check_for_merged_result_pipelines.yml
new file mode 100644
index 00000000000..f0f38d8e9b2
--- /dev/null
+++ b/config/feature_flags/development/legacy_merge_request_state_check_for_merged_result_pipelines.yml
@@ -0,0 +1,8 @@
+---
+name: legacy_merge_request_state_check_for_merged_result_pipelines
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91849
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367019
+milestone: '15.2'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/log_response_length.yml b/config/feature_flags/development/log_response_length.yml
new file mode 100644
index 00000000000..1ade057204c
--- /dev/null
+++ b/config/feature_flags/development/log_response_length.yml
@@ -0,0 +1,8 @@
+---
+name: log_response_length
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91448
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366854
+milestone: '15.3'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/measure_service_ping_metric_collection.yml b/config/feature_flags/development/measure_service_ping_metric_collection.yml
deleted file mode 100644
index c480bdedae6..00000000000
--- a/config/feature_flags/development/measure_service_ping_metric_collection.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: measure_service_ping_metric_collection
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82607
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358128
-milestone: '15.0'
-type: development
-group: group::product intelligence
-default_enabled: true
diff --git a/config/feature_flags/development/migrate_vulnerability_finding_uuids.yml b/config/feature_flags/development/migrate_vulnerability_finding_uuids.yml
deleted file mode 100644
index dc168ba5374..00000000000
--- a/config/feature_flags/development/migrate_vulnerability_finding_uuids.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: migrate_vulnerability_finding_uuids
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75546
-rollout_issue_url:
-milestone: '14.7'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/monitor_logging.yml b/config/feature_flags/development/monitor_logging.yml
deleted file mode 100644
index e9e3f49a3bb..00000000000
--- a/config/feature_flags/development/monitor_logging.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: monitor_logging
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86214
-rollout_issue_url:
-milestone: '15.0'
-type: development
-group: group::respond
-default_enabled: false
diff --git a/config/feature_flags/development/monitor_tracing.yml b/config/feature_flags/development/monitor_tracing.yml
deleted file mode 100644
index e4de215cc97..00000000000
--- a/config/feature_flags/development/monitor_tracing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: monitor_tracing
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85877
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359904
-milestone: '15.0'
-type: development
-group: group::respond
-default_enabled: false
diff --git a/config/feature_flags/development/mr_experience_survey.yml b/config/feature_flags/development/mr_experience_survey.yml
new file mode 100644
index 00000000000..c6487dbaf3a
--- /dev/null
+++ b/config/feature_flags/development/mr_experience_survey.yml
@@ -0,0 +1,8 @@
+---
+name: mr_experience_survey
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90036
+rollout_issue_url:
+milestone: '15.2'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/mr_show_reports_immediately.yml b/config/feature_flags/development/mr_show_reports_immediately.yml
new file mode 100644
index 00000000000..23ac381a521
--- /dev/null
+++ b/config/feature_flags/development/mr_show_reports_immediately.yml
@@ -0,0 +1,8 @@
+---
+name: mr_show_reports_immediately
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76612
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367027
+milestone: '15.2'
+type: development
+group: group::pipeline insights
+default_enabled: false
diff --git a/config/feature_flags/development/namespace_storage_limit_show_preenforcement_banner.yml b/config/feature_flags/development/namespace_storage_limit_show_preenforcement_banner.yml
new file mode 100644
index 00000000000..754a6a16356
--- /dev/null
+++ b/config/feature_flags/development/namespace_storage_limit_show_preenforcement_banner.yml
@@ -0,0 +1,8 @@
+---
+name: namespace_storage_limit_show_preenforcement_banner
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350632
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/362340
+milestone: '15.2'
+type: development
+group: group::utilization
+default_enabled: false
diff --git a/config/feature_flags/development/omniauth_login_minimal_scopes.yml b/config/feature_flags/development/omniauth_login_minimal_scopes.yml
deleted file mode 100644
index b2ca3484a98..00000000000
--- a/config/feature_flags/development/omniauth_login_minimal_scopes.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: omniauth_login_minimal_scopes
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78556
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351331
-milestone: '14.8'
-type: development
-group: 'group::authentication and authorization'
-default_enabled: false
diff --git a/config/feature_flags/development/operational_vulnerabilities_filters.yml b/config/feature_flags/development/operational_vulnerabilities_filters.yml
new file mode 100644
index 00000000000..0a96954ef66
--- /dev/null
+++ b/config/feature_flags/development/operational_vulnerabilities_filters.yml
@@ -0,0 +1,8 @@
+---
+name: operational_vulnerabilities_filters
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90845
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365986
+milestone: '15.2'
+type: development
+group: group::container security
+default_enabled: false
diff --git a/config/feature_flags/development/optimized_followed_users_queries.yml b/config/feature_flags/development/optimized_followed_users_queries.yml
deleted file mode 100644
index 9e08810659b..00000000000
--- a/config/feature_flags/development/optimized_followed_users_queries.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: optimized_followed_users_queries
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84856
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358649
-milestone: '15.0'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/paginated_issue_discussions.yml b/config/feature_flags/development/paginated_issue_discussions.yml
deleted file mode 100644
index f4e765bd7f2..00000000000
--- a/config/feature_flags/development/paginated_issue_discussions.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: paginated_issue_discussions
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69933
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345351
-milestone: '14.5'
-type: development
-group: group::project management
-default_enabled: false
diff --git a/config/feature_flags/development/pbkdf2_password_encryption.yml b/config/feature_flags/development/pbkdf2_password_encryption.yml
new file mode 100644
index 00000000000..995173a6a38
--- /dev/null
+++ b/config/feature_flags/development/pbkdf2_password_encryption.yml
@@ -0,0 +1,8 @@
+---
+name: pbkdf2_password_encryption
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91622
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367147
+milestone: '15.2'
+type: development
+group: group::authentication and authorization
+default_enabled: false
diff --git a/config/feature_flags/development/pbkdf2_password_encryption_write.yml b/config/feature_flags/development/pbkdf2_password_encryption_write.yml
new file mode 100644
index 00000000000..29c7baedaf2
--- /dev/null
+++ b/config/feature_flags/development/pbkdf2_password_encryption_write.yml
@@ -0,0 +1,8 @@
+---
+name: pbkdf2_password_encryption_write
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91622
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367147
+milestone: '15.2'
+type: development
+group: group::authentication and authorization
+default_enabled: false
diff --git a/config/feature_flags/development/prerecord_service_ping_data.yml b/config/feature_flags/development/prerecord_service_ping_data.yml
deleted file mode 100644
index ad284dbcce8..00000000000
--- a/config/feature_flags/development/prerecord_service_ping_data.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: prerecord_service_ping_data
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85503
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360675
-milestone: '15.0'
-type: development
-group: group::product intelligence
-default_enabled: true
diff --git a/config/feature_flags/development/prevent_abusive_searches.yml b/config/feature_flags/development/prevent_abusive_searches.yml
deleted file mode 100644
index 1c08e0d16cb..00000000000
--- a/config/feature_flags/development/prevent_abusive_searches.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: prevent_abusive_searches
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74953
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346263
-milestone: '14.6'
-type: development
-group: group::global search
-default_enabled: false
diff --git a/config/feature_flags/development/projects_build_artifacts_size_refresh_high.yml b/config/feature_flags/development/projects_build_artifacts_size_refresh_high.yml
deleted file mode 100644
index 77b5feafd6a..00000000000
--- a/config/feature_flags/development/projects_build_artifacts_size_refresh_high.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: projects_build_artifacts_size_refresh_high
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81306
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356018
-milestone: '14.9'
-type: development
-group: group::pipeline insights
-default_enabled: false
diff --git a/config/feature_flags/development/projects_build_artifacts_size_refresh_low.yml b/config/feature_flags/development/projects_build_artifacts_size_refresh_low.yml
deleted file mode 100644
index cefecb245e3..00000000000
--- a/config/feature_flags/development/projects_build_artifacts_size_refresh_low.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: projects_build_artifacts_size_refresh_low
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81306
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356018
-milestone: '14.9'
-type: development
-group: group::pipeline insights
-default_enabled: false
diff --git a/config/feature_flags/development/projects_build_artifacts_size_refresh_medium.yml b/config/feature_flags/development/projects_build_artifacts_size_refresh_medium.yml
deleted file mode 100644
index caeb6647782..00000000000
--- a/config/feature_flags/development/projects_build_artifacts_size_refresh_medium.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: projects_build_artifacts_size_refresh_medium
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81306
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356018
-milestone: '14.9'
-type: development
-group: group::pipeline insights
-default_enabled: false
diff --git a/config/feature_flags/development/rebalance_issues.yml b/config/feature_flags/development/rebalance_issues.yml
index 5b2a4c2437b..5651b02b073 100644
--- a/config/feature_flags/development/rebalance_issues.yml
+++ b/config/feature_flags/development/rebalance_issues.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/239344
milestone: '13.4'
type: development
group: group::project management
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/refactor_blob_viewer.yml b/config/feature_flags/development/refactor_blob_viewer.yml
deleted file mode 100644
index 2c418e87a49..00000000000
--- a/config/feature_flags/development/refactor_blob_viewer.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: refactor_blob_viewer
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57326
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/324351
-milestone: '13.11'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/refactor_code_quality_inline_findings.yml b/config/feature_flags/development/refactor_code_quality_inline_findings.yml
new file mode 100644
index 00000000000..3f2e35c202d
--- /dev/null
+++ b/config/feature_flags/development/refactor_code_quality_inline_findings.yml
@@ -0,0 +1,8 @@
+---
+name: refactor_code_quality_inline_findings
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88576
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364198
+milestone: '15.1'
+type: development
+group: group::static analysis
+default_enabled: false
diff --git a/config/feature_flags/development/refactor_mr_widgets_extensions.yml b/config/feature_flags/development/refactor_mr_widgets_extensions.yml
index 5b6ea22aafe..3f71e786f99 100644
--- a/config/feature_flags/development/refactor_mr_widgets_extensions.yml
+++ b/config/feature_flags/development/refactor_mr_widgets_extensions.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341759
milestone: '14.4'
type: development
group: group::code review
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/rename_integrations_workers.yml b/config/feature_flags/development/rename_integrations_workers.yml
deleted file mode 100644
index 307b21c0545..00000000000
--- a/config/feature_flags/development/rename_integrations_workers.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: rename_integrations_workers
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88558
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364112
-milestone: '15.1'
-type: development
-group: group::integrations
-default_enabled: true
diff --git a/config/feature_flags/development/require_email_verification.yml b/config/feature_flags/development/require_email_verification.yml
new file mode 100644
index 00000000000..e6cb78ffcf7
--- /dev/null
+++ b/config/feature_flags/development/require_email_verification.yml
@@ -0,0 +1,8 @@
+---
+name: require_email_verification
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86352
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364835
+milestone: "15.2"
+type: development
+group: group::anti-abuse
+default_enabled: false
diff --git a/config/feature_flags/development/show_minute_limit_banner.yml b/config/feature_flags/development/show_minute_limit_banner.yml
deleted file mode 100644
index ecf9d98bea2..00000000000
--- a/config/feature_flags/development/show_minute_limit_banner.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: show_minute_limit_banner
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84644
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358191
-milestone: '14.10'
-type: development
-group: group::workspace
-default_enabled: false
diff --git a/config/feature_flags/development/skip_group_share_unlink_auth_refresh.yml b/config/feature_flags/development/skip_group_share_unlink_auth_refresh.yml
new file mode 100644
index 00000000000..cd7acaceaf5
--- /dev/null
+++ b/config/feature_flags/development/skip_group_share_unlink_auth_refresh.yml
@@ -0,0 +1,8 @@
+---
+name: skip_group_share_unlink_auth_refresh
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90871
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366086
+milestone: '15.2'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/skip_scheduling_mirrors_for_free.yml b/config/feature_flags/development/skip_scheduling_mirrors_for_free.yml
new file mode 100644
index 00000000000..09f41fa9ff4
--- /dev/null
+++ b/config/feature_flags/development/skip_scheduling_mirrors_for_free.yml
@@ -0,0 +1,8 @@
+---
+name: skip_scheduling_mirrors_for_free
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92377
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367712
+milestone: '15.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/split_operations_visibility_permissions.yml b/config/feature_flags/development/split_operations_visibility_permissions.yml
new file mode 100644
index 00000000000..612876a2dcd
--- /dev/null
+++ b/config/feature_flags/development/split_operations_visibility_permissions.yml
@@ -0,0 +1,8 @@
+---
+name: split_operations_visibility_permissions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89089
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364240
+milestone: '15.1'
+type: development
+group: group::respond
+default_enabled: false
diff --git a/config/feature_flags/development/ssh_banned_key.yml b/config/feature_flags/development/ssh_banned_key.yml
deleted file mode 100644
index e628e440176..00000000000
--- a/config/feature_flags/development/ssh_banned_key.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ssh_banned_key
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87541
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/363410
-milestone: '15.1'
-type: development
-group: 'group::authentication and authorization'
-default_enabled: true
diff --git a/config/feature_flags/development/standard_context_type_check.yml b/config/feature_flags/development/standard_context_type_check.yml
deleted file mode 100644
index 1c6094abbf4..00000000000
--- a/config/feature_flags/development/standard_context_type_check.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: standard_context_type_check
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88540
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364265
-milestone: '15.1'
-type: development
-group: group::product intelligence
-default_enabled: false
diff --git a/config/feature_flags/development/sticky_ci_archive_trace_worker.yml b/config/feature_flags/development/sticky_ci_archive_trace_worker.yml
deleted file mode 100644
index 9494f6070f4..00000000000
--- a/config/feature_flags/development/sticky_ci_archive_trace_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: sticky_ci_archive_trace_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87577
-rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1681
-milestone: '15.1'
-type: development
-group: group::scalability
-default_enabled: false
diff --git a/config/feature_flags/development/subgroups_approval_rules.yml b/config/feature_flags/development/subgroups_approval_rules.yml
new file mode 100644
index 00000000000..13f4e872b4f
--- /dev/null
+++ b/config/feature_flags/development/subgroups_approval_rules.yml
@@ -0,0 +1,8 @@
+---
+name: subgroups_approval_rules
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91598
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366741
+milestone: '15.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/tag_list_keyset_pagination.yml b/config/feature_flags/development/tag_list_keyset_pagination.yml
index 54bd96d82cf..52c21e22d9f 100644
--- a/config/feature_flags/development/tag_list_keyset_pagination.yml
+++ b/config/feature_flags/development/tag_list_keyset_pagination.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345595
milestone: '14.5'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/trigger_job_retry_action.yml b/config/feature_flags/development/trigger_job_retry_action.yml
deleted file mode 100644
index 79a8593fd05..00000000000
--- a/config/feature_flags/development/trigger_job_retry_action.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: trigger_job_retry_action
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77951
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/349966
-milestone: '14.7'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/update_oauth_registration_flow.yml b/config/feature_flags/development/update_oauth_registration_flow.yml
index 5dd565e2143..7b066ebf9ab 100644
--- a/config/feature_flags/development/update_oauth_registration_flow.yml
+++ b/config/feature_flags/development/update_oauth_registration_flow.yml
@@ -1,8 +1,8 @@
---
name: update_oauth_registration_flow
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85871
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/363030
-milestone: '15.1'
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364342
+milestone: '15.2'
type: development
-group: group::adoption
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/development/use_click_house_database_for_error_tracking.yml b/config/feature_flags/development/use_click_house_database_for_error_tracking.yml
new file mode 100644
index 00000000000..15d31568fb0
--- /dev/null
+++ b/config/feature_flags/development/use_click_house_database_for_error_tracking.yml
@@ -0,0 +1,8 @@
+---
+name: use_click_house_database_for_error_tracking
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90675
+rollout_issue_url: https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1728
+milestone: '15.2'
+type: development
+group: group::observability
+default_enabled: false
diff --git a/config/feature_flags/development/use_keyset_aware_user_search_query.yml b/config/feature_flags/development/use_keyset_aware_user_search_query.yml
new file mode 100644
index 00000000000..8c2babfd1c7
--- /dev/null
+++ b/config/feature_flags/development/use_keyset_aware_user_search_query.yml
@@ -0,0 +1,8 @@
+---
+name: use_keyset_aware_user_search_query
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91764
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367025
+milestone: '15.2'
+type: development
+group: group::optimize
+default_enabled: true
diff --git a/config/feature_flags/development/use_redis_hll_instrumentation_classes.yml b/config/feature_flags/development/use_redis_hll_instrumentation_classes.yml
new file mode 100644
index 00000000000..46e53688b70
--- /dev/null
+++ b/config/feature_flags/development/use_redis_hll_instrumentation_classes.yml
@@ -0,0 +1,8 @@
+---
+name: use_redis_hll_instrumentation_classes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90237
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365332
+milestone: '15.1'
+type: development
+group: group::product intelligence
+default_enabled: false
diff --git a/config/feature_flags/development/use_status_for_repository_update_mirror.yml b/config/feature_flags/development/use_status_for_repository_update_mirror.yml
deleted file mode 100644
index 37c26f14791..00000000000
--- a/config/feature_flags/development/use_status_for_repository_update_mirror.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_status_for_repository_update_mirror
-introduced_by_url:
-rollout_issue_url:
-milestone: '15.1'
-type: development
-group: group::source code
-default_enabled: false
diff --git a/config/feature_flags/development/vsa_reaggregation_worker.yml b/config/feature_flags/development/vsa_reaggregation_worker.yml
deleted file mode 100644
index a3cc83722a3..00000000000
--- a/config/feature_flags/development/vsa_reaggregation_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vsa_reaggregation_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84171
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357647
-milestone: '14.10'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/web_hooks_no_rate_limit.yml b/config/feature_flags/development/web_hooks_no_rate_limit.yml
new file mode 100644
index 00000000000..387aa8bb007
--- /dev/null
+++ b/config/feature_flags/development/web_hooks_no_rate_limit.yml
@@ -0,0 +1,8 @@
+---
+name: web_hooks_no_rate_limit
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90868
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366084
+milestone: '15.2'
+type: development
+group: group::integrations
+default_enabled: false
diff --git a/config/feature_flags/development/webhooks_failed_callout.yml b/config/feature_flags/development/webhooks_failed_callout.yml
new file mode 100644
index 00000000000..11de5a793f6
--- /dev/null
+++ b/config/feature_flags/development/webhooks_failed_callout.yml
@@ -0,0 +1,8 @@
+---
+name: webhooks_failed_callout
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91092
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365535
+milestone: '15.2'
+type: development
+group: group::integrations
+default_enabled: false
diff --git a/config/feature_flags/development/wiki_front_matter.yml b/config/feature_flags/development/wiki_front_matter.yml
new file mode 100644
index 00000000000..39196440d17
--- /dev/null
+++ b/config/feature_flags/development/wiki_front_matter.yml
@@ -0,0 +1,8 @@
+---
+name: wiki_front_matter
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27706
+rollout_issue_url:
+milestone: '12.10'
+type: development
+group: group::editor
+default_enabled: false
diff --git a/config/feature_flags/experiment/combined_registration.yml b/config/feature_flags/experiment/combined_registration.yml
index 1be740c7141..0b867353946 100644
--- a/config/feature_flags/experiment/combined_registration.yml
+++ b/config/feature_flags/experiment/combined_registration.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67614
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/285533
milestone: '14.3'
type: experiment
-group: group::adoption
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/experiment/invite_members_in_side_nav.yml b/config/feature_flags/experiment/invite_members_in_side_nav.yml
index 7968a885374..1cb8d6d2b0a 100644
--- a/config/feature_flags/experiment/invite_members_in_side_nav.yml
+++ b/config/feature_flags/experiment/invite_members_in_side_nav.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70451
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342951
milestone: '14.5'
type: experiment
-group: group::expansion
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/experiment/null_hypothesis.yml b/config/feature_flags/experiment/null_hypothesis.yml
index 8ac76809842..bf1526fa950 100644
--- a/config/feature_flags/experiment/null_hypothesis.yml
+++ b/config/feature_flags/experiment/null_hypothesis.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45840
rollout_issue_url:
milestone: '13.7'
type: experiment
-group: group::adoption
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/experiment/pql_three_cta_test.yml b/config/feature_flags/experiment/pql_three_cta_test.yml
index f65d3080c05..aa46c51d7ed 100644
--- a/config/feature_flags/experiment/pql_three_cta_test.yml
+++ b/config/feature_flags/experiment/pql_three_cta_test.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74054
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/349799
milestone: '14.7'
type: experiment
-group: group::conversion
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/experiment/security_actions_continuous_onboarding.yml b/config/feature_flags/experiment/security_actions_continuous_onboarding.yml
new file mode 100644
index 00000000000..ce7124cf0c8
--- /dev/null
+++ b/config/feature_flags/experiment/security_actions_continuous_onboarding.yml
@@ -0,0 +1,8 @@
+---
+name: security_actions_continuous_onboarding
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82274
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345176
+milestone: '15.2'
+type: experiment
+group: group::acquisition
+default_enabled: false
diff --git a/config/feature_flags/experiment/security_reports_mr_widget_prompt.yml b/config/feature_flags/experiment/security_reports_mr_widget_prompt.yml
index ca6d17b1720..16cc3d890d7 100644
--- a/config/feature_flags/experiment/security_reports_mr_widget_prompt.yml
+++ b/config/feature_flags/experiment/security_reports_mr_widget_prompt.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70086
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340436
milestone: '14.3'
type: experiment
-group: group::adoption
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/experiment/showcase_free_security_features.yml b/config/feature_flags/experiment/showcase_free_security_features.yml
new file mode 100644
index 00000000000..e9a55d03adc
--- /dev/null
+++ b/config/feature_flags/experiment/showcase_free_security_features.yml
@@ -0,0 +1,8 @@
+---
+name: showcase_free_security_features
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85359
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360677
+milestone: '15.2'
+type: experiment
+group: group::acquisition
+default_enabled: false
diff --git a/config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml b/config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml
index 6dc3f798f63..e047a4e9682 100644
--- a/config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml
+++ b/config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82274
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351916
milestone: '14.9'
type: experiment
-group: group::adoption
+group: group::acquisition
default_enabled: false
diff --git a/config/feature_flags/ops/batched_migrations_health_status_autovacuum.yml b/config/feature_flags/ops/batched_migrations_health_status_autovacuum.yml
new file mode 100644
index 00000000000..f0e4dfcabb9
--- /dev/null
+++ b/config/feature_flags/ops/batched_migrations_health_status_autovacuum.yml
@@ -0,0 +1,8 @@
+---
+name: batched_migrations_health_status_autovacuum
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85196
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360331
+milestone: '15.2'
+type: ops
+group: group::database
+default_enabled: false
diff --git a/config/feature_flags/ops/ci_minimal_cost_factor_for_gitlab_namespaces.yml b/config/feature_flags/ops/ci_minimal_cost_factor_for_gitlab_namespaces.yml
new file mode 100644
index 00000000000..fbbd4d9672b
--- /dev/null
+++ b/config/feature_flags/ops/ci_minimal_cost_factor_for_gitlab_namespaces.yml
@@ -0,0 +1,8 @@
+---
+name: ci_minimal_cost_factor_for_gitlab_namespaces
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89742
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367692
+milestone: '15.2'
+type: ops
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/ops/ci_pipeline_age_histogram.yml b/config/feature_flags/ops/ci_pipeline_age_histogram.yml
new file mode 100644
index 00000000000..bbf7edfa9b9
--- /dev/null
+++ b/config/feature_flags/ops/ci_pipeline_age_histogram.yml
@@ -0,0 +1,8 @@
+---
+name: ci_pipeline_age_histogram
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90027
+rollout_issue_url:
+milestone: '15.1'
+type: ops
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/ops/enforce_memory_watchdog.yml b/config/feature_flags/ops/enforce_memory_watchdog.yml
new file mode 100644
index 00000000000..1d1f9a4eef0
--- /dev/null
+++ b/config/feature_flags/ops/enforce_memory_watchdog.yml
@@ -0,0 +1,8 @@
+---
+name: enforce_memory_watchdog
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91910
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367534
+milestone: '15.2'
+type: ops
+group: group::memory
+default_enabled: false
diff --git a/config/feature_flags/ops/github_importer_issue_events_import.yml b/config/feature_flags/ops/github_importer_issue_events_import.yml
new file mode 100644
index 00000000000..c4710858a0a
--- /dev/null
+++ b/config/feature_flags/ops/github_importer_issue_events_import.yml
@@ -0,0 +1,8 @@
+---
+name: github_importer_issue_events_import
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89134
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365977
+milestone: '15.2'
+type: ops
+group: group::import
+default_enabled: false
diff --git a/config/feature_flags/ops/gitlab_experiment.yml b/config/feature_flags/ops/gitlab_experiment.yml
index bd676fc7c9c..faf55130c33 100644
--- a/config/feature_flags/ops/gitlab_experiment.yml
+++ b/config/feature_flags/ops/gitlab_experiment.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81834
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353921
milestone: '14.9'
type: ops
-group: group::conversion
+group: group::acquisition
default_enabled: true
diff --git a/config/feature_flags/ops/gitlab_memory_watchdog.yml b/config/feature_flags/ops/gitlab_memory_watchdog.yml
new file mode 100644
index 00000000000..9b995ea607e
--- /dev/null
+++ b/config/feature_flags/ops/gitlab_memory_watchdog.yml
@@ -0,0 +1,8 @@
+---
+name: gitlab_memory_watchdog
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91910
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367534
+milestone: '15.2'
+type: ops
+group: group::memory
+default_enabled: false
diff --git a/config/feature_flags/ops/projects_build_artifacts_size_refresh.yml b/config/feature_flags/ops/projects_build_artifacts_size_refresh.yml
new file mode 100644
index 00000000000..8b54a0e3ff5
--- /dev/null
+++ b/config/feature_flags/ops/projects_build_artifacts_size_refresh.yml
@@ -0,0 +1,8 @@
+---
+name: projects_build_artifacts_size_refresh
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84701
+rollout_issue_url:
+milestone: '15.1'
+type: ops
+group: group::pipeline insights
+default_enabled: true
diff --git a/config/feature_flags/ops/remote_mirror_no_delay.yml b/config/feature_flags/ops/remote_mirror_no_delay.yml
new file mode 100644
index 00000000000..17937b35cf0
--- /dev/null
+++ b/config/feature_flags/ops/remote_mirror_no_delay.yml
@@ -0,0 +1,7 @@
+---
+name: remote_mirror_no_delay
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92093
+milestone: '15.2'
+type: ops
+group: group::scalability
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_revlist_for_repo_size.yml b/config/feature_flags/undefined/gitaly_revlist_for_repo_size.yml
new file mode 100644
index 00000000000..376874b2c83
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_revlist_for_repo_size.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_revlist_for_repo_size
+introduced_by_url:
+rollout_issue_url:
+milestone:
+type: undefined
+group:
+default_enabled: false
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 841e7670e45..78ddc0afa3a 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -540,6 +540,10 @@ production: &base
ci_platform_metrics_update_cron_worker:
cron: "47 9 * * *"
+ # Periodically update ci_runner_versions table with up-to-date versions and status.
+ ci_runner_versions_reconciliation_worker:
+ cron: "20 * * * *"
+
# GitLab EE only jobs. These jobs are automatically enabled for an EE
# installation, and ignored for a CE installation.
ee_cron_jobs:
@@ -661,12 +665,6 @@ production: &base
gitlab_ci:
# Default project notifications settings:
- #
- # Send emails only on broken builds (default: true)
- # all_broken_builds: true
- #
- # Add pusher to recipients list (default: false)
- # add_pusher: true
# The location where build traces are stored (default: builds/). Relative paths are relative to Rails.root
# builds_path: builds/
@@ -1266,24 +1264,29 @@ production: &base
ip_whitelist:
- 127.0.0.0/8
- # Sidekiq exporter is webserver built in to Sidekiq to expose Prometheus metrics
+ # Sidekiq exporter is a dedicated Prometheus metrics server optionally running alongside Sidekiq.
sidekiq_exporter:
# enabled: true
# log_enabled: false
# address: localhost
# port: 8082
+ # tls_enabled: false
+ # tls_cert_path: /path/to/cert.pem
+ # tls_key_path: /path/to/key.pem
sidekiq_health_checks:
# enabled: true
# address: localhost
# port: 8092
- # Web exporter is a dedicated Rack server running alongside Puma to expose Prometheus metrics
- # It runs alongside the `/metrics` endpoints to ease the publish of metrics
+ # Web exporter is a dedicated Prometheus metrics server optionally running alongside Puma.
web_exporter:
# enabled: true
# address: localhost
# port: 8083
+ # tls_enabled: false
+ # tls_cert_path: /path/to/cert.pem
+ # tls_key_path: /path/to/key.pem
## Prometheus settings
# Do not modify these settings here. They should be modified in /etc/gitlab/gitlab.rb
@@ -1294,6 +1297,9 @@ production: &base
prometheus:
# enabled: true
# server_address: 'localhost:9090'
+ snowplow_micro:
+ enabled: true
+ address: '127.0.0.1:9091'
## Consul settings
consul:
diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml
index 309afe413cc..8a9f3f0da43 100644
--- a/config/gitlab_loose_foreign_keys.yml
+++ b/config/gitlab_loose_foreign_keys.yml
@@ -219,6 +219,10 @@ requirements_management_test_reports:
- table: ci_builds
column: build_id
on_delete: async_nullify
+sbom_occurrences:
+ - table: ci_pipelines
+ column: pipeline_id
+ on_delete: async_nullify
security_scans:
- table: ci_builds
column: build_id
diff --git a/config/initializers/00_connection_logger.rb b/config/initializers/00_connection_logger.rb
deleted file mode 100644
index 9f03d13f95f..00000000000
--- a/config/initializers/00_connection_logger.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-module NewConnectionLogger
- extend ActiveSupport::Concern
-
- prepended do |base|
- base.class_attribute :warn_on_new_connection, default: false
- end
-
- class_methods do
- def new_client(...)
- if warn_on_new_connection && !ENV['SKIP_LOG_INITIALIZER_CONNECTIONS']
- cleaned_caller = Gitlab::BacktraceCleaner.clean_backtrace(caller)
- message = "Database connection should not be called during initializers. Read more at https://docs.gitlab.com/ee/development/rails_initializers.html#database-connections-in-initializers"
-
- ActiveSupport::Deprecation.warn(message, cleaned_caller)
-
- warn caller if ENV['DEBUG_INITIALIZER_CONNECTIONS']
- end
-
- super
- end
- end
-end
-
-ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(NewConnectionLogger)
diff --git a/config/initializers/0_log_deprecations.rb b/config/initializers/0_log_deprecations.rb
index 20fb5144937..6ba18ea1136 100644
--- a/config/initializers/0_log_deprecations.rb
+++ b/config/initializers/0_log_deprecations.rb
@@ -9,11 +9,15 @@ end
if log_deprecations?
# Log deprecation warnings emitted through Kernel#warn, such as from gems or
# the Ruby VM.
- Warning.process(/.+is deprecated$/) do |warning|
- Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'ruby')
- # Returning :default means we continue emitting this to stderr as well.
- :default
- end
+ actions = {
+ /.+is deprecated$/ => lambda do |warning|
+ Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'ruby')
+ # Returning :default means we continue emitting this to stderr as well.
+ :default
+ end
+ }
+
+ Warning.process('', actions)
# Log deprecation warnings emitted from Rails (see ActiveSupport::Deprecation).
ActiveSupport::Notifications.subscribe('deprecation.rails') do |name, start, finish, id, payload|
diff --git a/config/initializers/1_acts_as_taggable.rb b/config/initializers/1_acts_as_taggable.rb
index 59412aef755..0c34bf3941b 100644
--- a/config/initializers/1_acts_as_taggable.rb
+++ b/config/initializers/1_acts_as_taggable.rb
@@ -15,3 +15,36 @@ raise "Counter cache is not disabled" if
model.connection_specification_name = Ci::ApplicationRecord.connection_specification_name
model.singleton_class.delegate :connection, :sticking, to: '::Ci::ApplicationRecord'
end
+
+# Modified from https://github.com/mbleigh/acts-as-taggable-on/pull/1081
+# with insert_all, which is not supported in MySQL
+# See https://gitlab.com/gitlab-org/gitlab/-/issues/338346#note_996969960
+module ActsAsTaggableOnTagPatch
+ def find_or_create_all_with_like_by_name(*list)
+ list = Array(list).flatten
+
+ return [] if list.empty?
+
+ existing_tags = named_any(list)
+
+ missing = list.reject do |tag_name|
+ comparable_tag_name = comparable_name(tag_name)
+ existing_tags.find { |tag| comparable_name(tag.name) == comparable_tag_name }
+ end
+
+ if missing.empty?
+ new_tags = []
+ else
+ attributes_to_add = missing.map do |tag_name|
+ { name: tag_name }
+ end
+
+ insert_all(attributes_to_add, unique_by: :name)
+ new_tags = named_any(missing)
+ end
+
+ existing_tags + new_tags
+ end
+end
+
+::ActsAsTaggableOn::Tag.singleton_class.prepend(ActsAsTaggableOnTagPatch)
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 8de514e9455..2de4efbe8ef 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -241,8 +241,6 @@ end
#
Settings['gitlab_ci'] ||= Settingslogic.new({})
Settings.gitlab_ci['shared_runners_enabled'] = true if Settings.gitlab_ci['shared_runners_enabled'].nil?
-Settings.gitlab_ci['all_broken_builds'] = true if Settings.gitlab_ci['all_broken_builds'].nil?
-Settings.gitlab_ci['add_pusher'] = false if Settings.gitlab_ci['add_pusher'].nil?
Settings.gitlab_ci['builds_path'] = Settings.absolute(Settings.gitlab_ci['builds_path'] || "builds/")
Settings.gitlab_ci['url'] ||= Settings.__send__(:build_gitlab_ci_url)
@@ -632,6 +630,9 @@ Settings.cron_jobs['inactive_projects_deletion_cron_worker']['job_class'] = 'Pro
Settings.cron_jobs['loose_foreign_keys_cleanup_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['loose_foreign_keys_cleanup_worker']['cron'] ||= '*/1 * * * *'
Settings.cron_jobs['loose_foreign_keys_cleanup_worker']['job_class'] = 'LooseForeignKeys::CleanupWorker'
+Settings.cron_jobs['ci_runner_versions_reconciliation_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['ci_runner_versions_reconciliation_worker']['cron'] ||= '20 * * * *'
+Settings.cron_jobs['ci_runner_versions_reconciliation_worker']['job_class'] = 'Ci::Runners::ReconcileExistingRunnerVersionsCronWorker'
Gitlab.ee do
Settings.cron_jobs['analytics_devops_adoption_create_all_snapshots_worker'] ||= Settingslogic.new({})
@@ -971,6 +972,9 @@ Settings.monitoring.sidekiq_exporter['enabled'] ||= false
Settings.monitoring.sidekiq_exporter['log_enabled'] ||= false
Settings.monitoring.sidekiq_exporter['address'] ||= 'localhost'
Settings.monitoring.sidekiq_exporter['port'] ||= 8082
+Settings.monitoring.sidekiq_exporter['tls_enabled'] ||= false
+Settings.monitoring.sidekiq_exporter['tls_cert_path'] ||= nil
+Settings.monitoring.sidekiq_exporter['tls_key_path'] ||= nil
Settings.monitoring['sidekiq_health_checks'] ||= Settingslogic.new({})
Settings.monitoring.sidekiq_health_checks['enabled'] ||= false
@@ -981,6 +985,9 @@ Settings.monitoring['web_exporter'] ||= Settingslogic.new({})
Settings.monitoring.web_exporter['enabled'] ||= false
Settings.monitoring.web_exporter['address'] ||= 'localhost'
Settings.monitoring.web_exporter['port'] ||= 8083
+Settings.monitoring.web_exporter['tls_enabled'] ||= false
+Settings.monitoring.web_exporter['tls_cert_path'] ||= nil
+Settings.monitoring.web_exporter['tls_key_path'] ||= nil
#
# Prometheus settings
diff --git a/config/initializers/8_devise.rb b/config/initializers/8_devise.rb
index 3cac012c2f7..65314c4472f 100644
--- a/config/initializers/8_devise.rb
+++ b/config/initializers/8_devise.rb
@@ -184,7 +184,7 @@ Devise.setup do |config|
# :authlogic_sha512 (then you should set stretches above to 20 for default behavior)
# and :restful_authentication_sha1 (then you should set stretches to 10, and copy
# REST_AUTH_SITE_KEY to pepper)
- # config.encryptor = :sha512
+ config.encryptor = :pbkdf2_sha512
# Authentication through token does not store user in session and needs
# to be supplied on each request. Useful if you are using the token as API token.
diff --git a/config/initializers/database_config.rb b/config/initializers/database_config.rb
index 84ef0bc9f16..31666c884bc 100644
--- a/config/initializers/database_config.rb
+++ b/config/initializers/database_config.rb
@@ -1,6 +1,12 @@
# frozen_string_literal: true
Gitlab.ee do
+ if Gitlab::Geo.geo_database_configured?
+ # Make sure connects_to for geo gets called outside of config/routes.rb first
+ # See InitializerConnections.with_disabled_database_connections
+ Geo::TrackingBase
+ end
+
if Gitlab::Runtime.sidekiq? && Gitlab::Geo.geo_database_configured?
# The Geo::TrackingBase model does not yet use connects_to. So,
# this will not properly support geo: from config/databse.yml
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 7827ad8f168..6ad8b02bfea 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -39,7 +39,7 @@ Doorkeeper.configure do
# Reuse access token for the same resource owner within an application (disabled by default)
# Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/383
- reuse_access_token
+ # reuse_access_token
# Issue access tokens with refresh token (disabled by default)
use_refresh_token
diff --git a/config/initializers/enumerator_next_patch.rb b/config/initializers/enumerator_next_patch.rb
new file mode 100644
index 00000000000..e1fc04731ae
--- /dev/null
+++ b/config/initializers/enumerator_next_patch.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+# Monkey patch of Enumerator#next to get better stack traces
+# when an error is raised from within a Fiber.
+# https://bugs.ruby-lang.org/issues/16829
+module EnumeratorNextPatch
+ %w(next next_values peek peek_values).each do |name|
+ define_method(name) do |*args|
+ gitlab_patch_backtrace_marker { super(*args) }
+ rescue Exception => err # rubocop: disable Lint/RescueException
+ err.set_backtrace(err.backtrace + caller) unless
+ has_gitlab_patch_backtrace_marker?(err.backtrace) && backtrace_matches_caller?(err.backtrace)
+
+ raise
+ end
+ end
+
+ private
+
+ def gitlab_patch_backtrace_marker
+ yield
+ end
+
+ # This function tells us whether the exception was generated by #next itself or by something in
+ # the Fiber that it invokes. If it's generated by #next, then the backtrace will have
+ # #gitlab_patch_backtrace_marker as the third item down the trace (since
+ # #gitlab_patch_backtrace_marker calls a block, which in turn calls #next.) If it's generated
+ # by the Fiber that #next invokes, then it won't contain this marker.
+ def has_gitlab_patch_backtrace_marker?(backtrace)
+ match = %r(^(.*):[0-9]+:in `gitlab_patch_backtrace_marker'$).match(backtrace[2])
+
+ !!match && match[1] == __FILE__
+ end
+
+ # This function makes sure that the rest of the stack trace matches in order to avoid missing
+ # an exception that was generated by calling #next on another Enumerator inside the Fiber.
+ # This might miss some *very* contrived scenarios involving recursion, but exceptions don't
+ # provide Fiber information, so it's the best we can do.
+ def backtrace_matches_caller?(backtrace)
+ backtrace[3..] == caller[1..]
+ end
+end
+
+Enumerator.prepend(EnumeratorNextPatch)
diff --git a/config/initializers/memory_watchdog.rb b/config/initializers/memory_watchdog.rb
new file mode 100644
index 00000000000..72779a18b10
--- /dev/null
+++ b/config/initializers/memory_watchdog.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+return unless Gitlab::Runtime.application?
+return unless Gitlab::Utils.to_boolean(ENV['GITLAB_MEMORY_WATCHDOG_ENABLED'])
+
+Gitlab::Cluster::LifecycleEvents.on_worker_start do
+ handler =
+ if Gitlab::Runtime.puma?
+ Gitlab::Memory::Watchdog::PumaHandler.new
+ elsif Gitlab::Runtime.sidekiq?
+ Gitlab::Memory::Watchdog::TermProcessHandler.new
+ else
+ Gitlab::Memory::Watchdog::NullHandler.instance
+ end
+
+ Gitlab::Memory::Watchdog.new(
+ handler: handler, logger: Gitlab::AppLogger
+ ).start
+end
diff --git a/config/initializers/peek.rb b/config/initializers/peek.rb
index 9662039e3eb..efd4594e64c 100644
--- a/config/initializers/peek.rb
+++ b/config/initializers/peek.rb
@@ -5,7 +5,10 @@ require 'peek/adapters/redis'
Peek::Adapters::Redis.prepend ::Gitlab::PerformanceBar::RedisAdapterWhenPeekEnabled
Peek.singleton_class.prepend ::Gitlab::PerformanceBar::WithTopLevelWarnings
-Rails.application.config.peek.adapter = :redis, { client: ::Redis.new(Gitlab::Redis::Cache.params) }
+Rails.application.config.peek.adapter = :redis, {
+ client: ::Redis.new(Gitlab::Redis::Cache.params),
+ expires_in: 5.minutes
+}
Peek.into Peek::Views::Host
Peek.into Peek::Views::ActiveRecord
diff --git a/config/initializers/rack_timeout.rb b/config/initializers/rack_timeout.rb
index c2f2f3e093c..27077f4f0f6 100644
--- a/config/initializers/rack_timeout.rb
+++ b/config/initializers/rack_timeout.rb
@@ -20,3 +20,7 @@ if Gitlab::Runtime.puma? && !Rails.env.test?
observer = Gitlab::Cluster::RackTimeoutObserver.new
Rack::Timeout.register_state_change_observer(:gitlab_rack_timeout, &observer.callback)
end
+
+unless Gitlab::Utils.to_boolean(ENV['GITLAB_RAILS_RACK_TIMEOUT_ENABLE_LOGGING'], default: true)
+ Rack::Timeout::Logger.disable
+end
diff --git a/config/initializers/set_active_support_hash_digest_class.rb b/config/initializers/set_active_support_hash_digest_class.rb
deleted file mode 100644
index 743b45eed34..00000000000
--- a/config/initializers/set_active_support_hash_digest_class.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-Rails.application.configure do
- # We set ActiveSupport::Digest.hash_digest_class directly copying
- # See https://github.com/rails/rails/blob/6-1-stable/activesupport/lib/active_support/railtie.rb#L96-L98
- #
- # Note that is the only usage of config.active_support.hash_digest_class
- config.after_initialize do
- ActiveSupport::Digest.hash_digest_class = Gitlab::HashDigest::Facade
- end
-end
diff --git a/config/initializers/wikicloth_redos_patch.rb b/config/initializers/wikicloth_redos_patch.rb
index 13180180c32..a0b7c2e2466 100644
--- a/config/initializers/wikicloth_redos_patch.rb
+++ b/config/initializers/wikicloth_redos_patch.rb
@@ -2,15 +2,22 @@
require 'wikicloth'
require 'wikicloth/wiki_buffer/var'
+require 'digest/sha2'
-# Adds patch for changes in this PR: https://github.com/nricciar/wikicloth/pull/112/files
+# Adds patch for changes in these PRs:
#
-# That fix has already been merged, but the maintainers are not releasing new versions, so we
-# need to patch it here.
+# https://github.com/nricciar/wikicloth/pull/112
+# https://github.com/nricciar/wikicloth/pull/131
+#
+# The first fix has already been merged, but the second has not,
+# and the maintainers are not releasing new versions, so we
+# need to patch them here.
#
# If they ever do release a version, then we can remove this file.
#
-# See: https://gitlab.com/gitlab-org/gitlab/-/issues/334056#note_745336618
+# See:
+# - https://gitlab.com/gitlab-org/gitlab/-/issues/334056#note_745336618
+# - https://gitlab.com/gitlab-org/gitlab/-/issues/361266
# Guard to ensure we remember to delete this patch if they ever release a new version of wikicloth
raise 'New version of WikiCloth detected, please remove this patch' unless Gem::Version.new(WikiCloth::VERSION) == Gem::Version.new('0.8.1')
@@ -30,9 +37,12 @@ raise 'New version of WikiCloth detected, please remove this patch' unless Gem::
# rubocop:disable Layout/EmptyLineAfterGuardClause
# rubocop:disable Performance/ReverseEach
# rubocop:disable Style/BlockDelimiters
-# rubocop:disable Cop/LineBreakAroundConditionalBlock
# rubocop:disable Layout/MultilineBlockLayout
# rubocop:disable Layout/BlockEndNewline
+# rubocop:disable Style/PerlBackrefs
+# rubocop:disable Style/RegexpLiteralMixedPreserve
+# rubocop:disable Style/RedundantRegexpCharacterClass
+# rubocop:disable Performance/StringInclude
module WikiCloth
class WikiCloth
def render(opt={})
@@ -110,7 +120,7 @@ module WikiCloth
key = params[0].to_s.strip
key_options = params[1..].collect { |p| p.is_a?(Hash) ? { :name => p[:name].strip, :value => p[:value].strip } : p.strip }
key_options ||= []
- key_digest = Digest::MD5.hexdigest(key_options.to_a.sort {|x,y| (x.is_a?(Hash) ? x[:name] : x) <=> (y.is_a?(Hash) ? y[:name] : y) }.inspect)
+ key_digest = Digest::SHA256.hexdigest(key_options.to_a.sort {|x,y| (x.is_a?(Hash) ? x[:name] : x) <=> (y.is_a?(Hash) ? y[:name] : y) }.inspect)
return @options[:params][key] if @options[:params].has_key?(key)
# if we have a valid cache fragment use it
@@ -138,6 +148,54 @@ module WikiCloth
end
end
end
+
+ class WikiBuffer::HTMLElement < WikiBuffer
+ def to_html
+ if NO_NEED_TO_CLOSE.include?(self.element_name)
+ return "<#{self.element_name} />" if SHORT_TAGS.include?(self.element_name)
+ return "</#{self.element_name}><#{self.element_name}>" if @tag_check == self.element_name
+ end
+
+ if ESCAPED_TAGS.include?(self.element_name)
+ # remove empty first line
+ self.element_content = $1 if self.element_content =~ /^\s*\n(.*)$/m
+ # escape all html inside this element
+ self.element_content = self.element_content.gsub('<','&lt;').gsub('>','&gt;')
+ # hack to fix <code><nowiki> nested mess
+ self.element_content = self.element_content.gsub(/&lt;[\/]*\s*nowiki\s*&gt;/,'')
+ end
+
+ case self.element_name
+ when "template"
+ @options[:link_handler].cache({ :name => self.element_attributes["__name"], :content => self.element_content, :sha256 => self.element_attributes["__hash"] })
+ return self.element_content
+ when "noinclude"
+ return self.in_template? ? "" : self.element_content
+ when "includeonly"
+ return self.in_template? ? self.element_content : ""
+ when "nowiki"
+ return self.element_content
+ when "a"
+ if self.element_attributes['href'] =~ /:\/\//
+ return @options[:link_handler].external_link(self.element_attributes['href'], self.element_content)
+ elsif self.element_attributes['href'].nil? || self.element_attributes['href'] =~ /^\s*([\?\/])/
+ # if a element has no href attribute, or href starts with / or ?
+ return elem.tag!(self.element_name, self.element_attributes) { |x| x << self.element_content }
+ end
+ else
+ if Extension.element_exists?(self.element_name)
+ return Extension.html_elements[self.element_name][:klass].new(@options).instance_exec( self, &Extension.html_elements[self.element_name][:block] ).to_s
+ end
+ end
+
+ tmp = elem.tag!(self.element_name, self.element_attributes) { |x| x << self.element_content }
+ unless ALLOWED_ELEMENTS.include?(self.element_name)
+ tmp.gsub!(/[\-!\|&"\{\}\[\]]/) { |r| self.escape_char(r) }
+ return tmp.gsub('<', '&lt;').gsub('>', '&gt;')
+ end
+ tmp
+ end
+ end
end
# rubocop:enable Style/ClassAndModuleChildren
# rubocop:enable Layout/SpaceAroundEqualsInParameterDefault
@@ -154,6 +212,9 @@ end
# rubocop:enable Layout/EmptyLineAfterGuardClause
# rubocop:enable Performance/ReverseEach
# rubocop:enable Style/BlockDelimiters
-# rubocop:enable Cop/LineBreakAroundConditionalBlock
# rubocop:enable Layout/MultilineBlockLayout
# rubocop:enable Layout/BlockEndNewline
+# rubocop:enable Style/PerlBackrefs
+# rubocop:enable Style/RegexpLiteralMixedPreserve
+# rubocop:enable Style/RedundantRegexpCharacterClass
+# rubocop:enable Performance/StringInclude
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 233dca33bb8..56df8f93113 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -10,6 +10,9 @@ en:
target: Target issue
group:
path: Group URL
+ namespace_setting:
+ unique_project_download_limit: "Number of projects"
+ unique_project_download_limit_interval_in_seconds: "Interval (seconds)"
member:
user: "The member's email address"
invite_email: "The member's email address"
diff --git a/config/metrics/aggregates/common.yml b/config/metrics/aggregates/common.yml
index 0a9aec02b1a..6396187a26a 100644
--- a/config/metrics/aggregates/common.yml
+++ b/config/metrics/aggregates/common.yml
@@ -52,16 +52,6 @@
- 'incident_management_incident_relate'
- 'incident_management_incident_unrelate'
- 'incident_management_incident_change_confidential'
-- name: i_testing_paid_monthly_active_user_total
- operator: OR
- source: redis
- time_frame: [7d, 28d]
- events:
- - 'i_testing_web_performance_widget_total'
- - 'i_testing_full_code_quality_report_total'
- - 'i_testing_group_code_coverage_visit_total'
- - 'i_testing_load_performance_widget_total'
- - 'i_testing_metrics_report_widget_total'
- name: xmau_plan
operator: OR
source: redis
diff --git a/config/metrics/counts_28d/20210201124930_deployments.yml b/config/metrics/counts_28d/20210201124930_deployments.yml
index 385bdb47484..56ea95bdb69 100644
--- a/config/metrics/counts_28d/20210201124930_deployments.yml
+++ b/config/metrics/counts_28d/20210201124930_deployments.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.deployments
description: Total deployments count for recent 28 days
product_section: ops
product_stage: release
-product_group: group::ops release
+product_group: ops_release
product_category:
value_type: number
status: active
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 791cad7b6e2..e766c555d3a 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
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.analytics_unique_visits_for_any_target_monthly
description: Unique visitors to any analytics feature by month
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
@@ -33,6 +33,13 @@ options:
- p_analytics_ci_cd_pipelines
- p_analytics_ci_cd_deployment_frequency
- p_analytics_ci_cd_lead_time
+ - p_analytics_ci_cd_time_to_restore_service
+ - p_analytics_ci_cd_change_failure_rate
+ - g_analytics_ci_cd_release_statistics
+ - g_analytics_ci_cd_deployment_frequency
+ - g_analytics_ci_cd_lead_time
+ - g_analytics_ci_cd_time_to_restore_service
+ - g_analytics_ci_cd_change_failure_rate
distribution:
- ce
- ee
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 e0f19ac36f0..f053d0870ac 100644
--- a/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
+++ b/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.analytics.p_analytics_pipelines_monthly
description: Unique visitors to /groups/:group/-/analytics/ci_cd by month
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 95861042b1c..c92230af6b8 100644
--- a/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
+++ b/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.analytics.p_analytics_valuestream_monthly
description: Unique visitors to /:group/:project/-/value_stream_analytics by month
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 0b235a98677..553161c1470 100644
--- a/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
+++ b/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.analytics.i_analytics_cohorts_monthly
description: "Unique visitors to /-/instance_statistics/cohorts"
product_section: fulfillment
product_stage: fulfillment
-product_group: group::utilization
+product_group: utilization
product_category:
value_type: number
status: active
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 016cbb23d49..2de313948aa 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly
description: Unique visitors to /admin/dev_ops_reports by month
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 1f5e3108758..af4493b676b 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.analytics.g_analytics_merge_request_monthly
description:
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: removed
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 b2e6ce34d2e..798c16fd68f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.analytics.i_analytics_instance_statistics_monthly
description: Unique visitors to /admin/usage_trends by month
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 b4ac7032df6..30de14c43f0 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
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175055_merge_requests.yml b/config/metrics/counts_28d/20210216175055_merge_requests.yml
index c57b9e281cf..a66896951f7 100644
--- a/config/metrics/counts_28d/20210216175055_merge_requests.yml
+++ b/config/metrics/counts_28d/20210216175055_merge_requests.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.merge_requests
description: Count distinct authors of merge requests
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: removed
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 e3ba4019000..5db58dd93ae 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
@@ -5,7 +5,7 @@ description: Count of the number of projects with setting to disable overriding
per merge request
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 eaf3bc545c0..32a68c1de56 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
@@ -5,7 +5,7 @@ description: Count of the number of projects without setting to disable overridi
approvers per merge request
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
index e5b5300dae3..07ad35e45bf 100644
--- a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
+++ b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.merge_requests_users
description: Distinct count of users performing merge request actions like closed, merged, created, commented
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175109_suggestions.yml b/config/metrics/counts_28d/20210216175109_suggestions.yml
index 27288e43eee..7f4e0569e25 100644
--- a/config/metrics/counts_28d/20210216175109_suggestions.yml
+++ b/config/metrics/counts_28d/20210216175109_suggestions.yml
@@ -5,7 +5,7 @@ description: Count of unique users per month who create suggestions in merge req
comments
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: removed
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 abd5157271a..5a6150b21af 100644
--- a/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 aa0c6e6136c..1329aff088d 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 9ca7370c953..8d88ab365bd 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 62cbdb0feb5..263a59891b4 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_single_file_diffs_mo
description: Count of unique users per month with diffs viewed file by file
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 67955a7d32b..8370eb21f36 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_mont
description: Count of unique merge requests per month with diffs viewed file by file
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 c88cff6b2f9..a6bfeed7059 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 df3a461d7c8..c8f2386e908 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 a1b8c4037be..2f3c61f4f3c 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 98e413605f0..de20c8fdc7a 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 c968aee2190..761683fe34f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_comment_mo
description: Count of unique users per month who commented on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 f82608a637c..16351810c6f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_mont
description: Count of unique users per month who edited a comment on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 056b7d70e47..c15d962b0de 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_mo
description: Count of unique users per month who removed a comment on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 03a0a97423b..d28e463dc1b 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_add_suggestion_month
description: Count of unique users per month who added a suggestion
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 483d06265fc..6ed0515fec5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_apply_suggestion_mon
description: Count of unique users per month who applied a suggestion
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 76627a91d0f..71304cdcc77 100644
--- a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_applications_cert_m
description: Count user ids from GitLab Managed clusters with Cert Manager enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
index ced2b454844..c772e7ba6cb 100644
--- a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
+++ b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_applications_helm
description: Count user ids from GitLab Managed clusters with Helm enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
index eee58397947..0a36f99563f 100644
--- a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
+++ b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_applications_ingres
description: Count user ids from GitLab Managed clusters with Ingress enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
index f12fe191220..e01b941912f 100644
--- a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
+++ b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_applications_knativ
description: Count user ids from GitLab Managed clusters with Knative enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
index 0d908d3c45d..708c1e64326 100644
--- a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
+++ b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
@@ -6,7 +6,7 @@ description: Number of Kubernetes clusters with clusters management project bein
set
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
index f6296b5429b..b91eed1c015 100644
--- a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_disabled
description: Number of user ids from GitLab Managed disabled clusters
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
index 9df51868bef..2c56b369b49 100644
--- a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_enabled
description: Number of distict user ids from GitLab Managed clusters currently enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
index 9a9db498d6a..3b7c869c851 100644
--- a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
+++ b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_gke
description: Number of user ids from GitLab Managed clusters provisioned with GitLab on GCE GKE
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
index ff7ab633e81..b48556ca885 100644
--- a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
+++ b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_eks
description: Number of user ids from GitLab Managed clusters provisioned with GitLab on AWS EKS
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
index c548b9e9eff..f9e5657144c 100644
--- a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
+++ b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_user
description: Number of user ids from GitLab Managed clusters that are user provisioned
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
index 7bdb34f236c..399046a2d6d 100644
--- a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.instance_clusters_disabled
description: Number of users from GitLab Managed disabled clusters attached to the instance
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
index 81022cc7411..059e26a137b 100644
--- a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.instance_clusters_enabled
description: Number of user ids from GitLab Managed enabled clusters attached to the instance
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
index d38d34867ff..dbc86047521 100644
--- a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.group_clusters_disabled
description: Number of user ids GitLab Managed disabled clusters attached to groups
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
index 9d53421eb69..e1ff7306af0 100644
--- a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.group_clusters_enabled
description: Count disctinct user ids from GitLab Managed enabled clusters attached to groups
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
index 10806cc50fd..edf02be00dd 100644
--- a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.project_clusters_disabled
description: Number of user ids from GitLab Managed disabled clusters attached to projects
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
index 28b81acb709..2b601bf2760 100644
--- a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.project_clusters_enabled
description: Number of user ids from GitLab Managed enabled clusters attached to projects
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175542_ci_builds.yml b/config/metrics/counts_28d/20210216175542_ci_builds.yml
index 8664ee1bcc9..454b02bd04d 100644
--- a/config/metrics/counts_28d/20210216175542_ci_builds.yml
+++ b/config/metrics/counts_28d/20210216175542_ci_builds.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_builds
description: Unique monthly builds in project
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
index d21d70c8abb..1de544315ab 100644
--- a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_external_pipelines
description: Total pipelines in external repositories in a month
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
index 47bf8c9c821..94faa5b1833 100644
--- a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_internal_pipelines
description: Total pipelines in GitLab repositories in a month
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 934d9f77c24..6bda7c714d7 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops
description: Distinct users that ran an auto DevOps pipeline without a .gitlab-ci.yml file.
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: auto_devops
value_type: number
status: active
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 9d12339717d..5253731dcc8 100644
--- a/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
+++ b/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository
description: Monthly count of unique users creating pipelines from CI files in the repository
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
index bfc39e672ca..323606abd00 100644
--- a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_schedules
description: Total monthly Pipeline schedules in GitLab
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175554_ci_pipelines.yml b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
index 3c0c401f38b..da338611257 100644
--- a/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_pipelines
description: Distinct users triggering pipelines in a month
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216175556_ci_triggers.yml b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
index c70a9337c6c..4fd645a39cd 100644
--- a/config/metrics/counts_28d/20210216175556_ci_triggers.yml
+++ b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.ci_triggers
description: Total configured Triggers in project
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180308_personal_snippets.yml b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
index 2416212f1eb..3b036d022c7 100644
--- a/config/metrics/counts_28d/20210216180308_personal_snippets.yml
+++ b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.personal_snippets
description: Monthly count of personal Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180310_project_snippets.yml b/config/metrics/counts_28d/20210216180310_project_snippets.yml
index 4a0a02f701d..8dc9caee45b 100644
--- a/config/metrics/counts_28d/20210216180310_project_snippets.yml
+++ b/config/metrics/counts_28d/20210216180310_project_snippets.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.project_snippets
description: Monthly count of project Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180312_snippets.yml b/config/metrics/counts_28d/20210216180312_snippets.yml
index 214ceaa7740..dfe24039f52 100644
--- a/config/metrics/counts_28d/20210216180312_snippets.yml
+++ b/config/metrics/counts_28d/20210216180312_snippets.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.snippets
description: Monthly count of All Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180317_snippets.yml b/config/metrics/counts_28d/20210216180317_snippets.yml
index a80991452c3..21c1196f241 100644
--- a/config/metrics/counts_28d/20210216180317_snippets.yml
+++ b/config/metrics/counts_28d/20210216180317_snippets.yml
@@ -5,7 +5,7 @@ name: count_distinct_author_id_from_snippets
description: Count of distinct author_id from snippets for last 28 days
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
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 b9982520cbc..dd66f4a3b47 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_web
description: Number of users editing using web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 a3eb1192e49..8dbf5e5ba41 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe
description: Number of users using single file editor
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 3dc7f774fe2..5a2d9c197ce 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sni
description: Number of users using the snippet editor
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
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 0c6421ad1fa..79f1db5e730 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sse
description: Number of users using the static site editor
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: static_site_editor
value_type: number
status: removed
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 76e24559ff2..2b5b0eaa2cc 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_ide
description: Number of unique users per month who edited a file from any web editor
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 2e00a23ca7c..afd69a800cc 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 88d7c43a90e..78622d0fc18 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 78a01d5ef64..5e3ee643e07 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly
description: Count of monthly edits to a snippet
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
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 35291d12239..6aadaed5180 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
@@ -16,6 +16,7 @@ options:
- g_edit_by_web_ide
- g_edit_by_sfe
- g_edit_by_snippet_ide
+ - g_edit_by_live_preview
distribution:
- ce
- ee
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 e85084f25f0..0d4a62696b7 100644
--- a/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
+++ b/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
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 aad1d911a6f..b38129071bf 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
@@ -7,7 +7,7 @@ description: Total unique users for i_search_total, i_search_advanced, i_search_
just want the total
product_section: enablement
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
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 9bed122a0a5..1632aed611a 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
@@ -4,7 +4,7 @@ key_path: counts_monthly.aggregated_metrics.incident_management_alerts_total_uni
description: Count of unique users per month to take an action on an alert
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 3e0aed47e2d..3174894384a 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
@@ -4,7 +4,7 @@ key_path: counts_monthly.aggregated_metrics.incident_management_incidents_total_
description: Count of unique users per month to take an action on an incident
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
index c2b1d11d2e9..405a43b3766 100644
--- a/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
+++ b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 2d17b84f7de..e0aa35fea62 100644
--- a/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
+++ b/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
@@ -5,7 +5,7 @@ description: Count of unique projects with an incident from an alert created in
last month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 23c7b6172fd..e1c9d40715c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_alert_statu
description: Count of unique users changing alert's status changes per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 3d77ae78849..c3bacf2d529 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_alert_assig
description: Count of unique users assigning an alert per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 68a99ecae82..8d8239e5403 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_alert_todo_
description: Count of unique users adding alerts to the TODO list per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 6df78064a8a..3f6af2826c5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_cr
description: Count of unique users creating incidents per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 1ffce106c7d..7684c4714d4 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_re
description: Count of unique users reopening incidents per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 0f02aef017c..b769652890b 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_cl
description: Count of users closing incidents per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 6130cb51ef5..ac4aedc8be6 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_as
description: Count of users assigning incidents per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 a4affa056c9..3cdfe2a3bf3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_to
description: Count of unique users adding incidents to the TODO list per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 4b7880627a2..cb6dd8ce5c2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_co
description: Count of unique users adding comments per month on incidents
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 11a53605434..a4ecf832a9e 100644
--- 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_zo
description: Count of users creating Zoom meetings about incidents per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 ee1e29f0caf..b060d0c8c2a 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
@@ -5,7 +5,7 @@ description: Count of unique users adding issues per month that are related to a
incident
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 b24e653bda5..af2b7b26610 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_un
description: Count of users removing issues that are related to an incident per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 78a52e1f4bf..92e2413f93a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_ch
description: Count of users changing incidents to confidential per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 9bc738cee98..ab0ddaf32e9 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_total_uniqu
description: Count of unique users performing events related with incidents per month
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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 379f9ec1a3c..e8791ee4ea6 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
@@ -5,7 +5,7 @@ description: Count of unique users per month to create an incident corresponding
an alert
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 fd9b3ed719a..6c2f8f75861 100644
--- a/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
+++ b/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.projects_imported_from_github
description: Count of projects imported from GitHub
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
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 5189d4685d0..28b876507a7 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_des
description: Monthly active users for design management
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: design_management
value_type: number
status: active
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 cc950591e6e..9e1c5477bab 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_wik
description: Unique monthly active users of the Wiki
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: wiki
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180814_events.yml b/config/metrics/counts_28d/20210216180814_events.yml
index 8e974979ae8..3d3d9015e57 100644
--- a/config/metrics/counts_28d/20210216180814_events.yml
+++ b/config/metrics/counts_28d/20210216180814_events.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.events
description: Number of distinct users who have generated a manage event by month
product_section: dev
product_stage: manage
-product_group: group::manage
+product_group: manage
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180816_groups.yml b/config/metrics/counts_28d/20210216180816_groups.yml
index 9ddb7547644..806b78be7b6 100644
--- a/config/metrics/counts_28d/20210216180816_groups.yml
+++ b/config/metrics/counts_28d/20210216180816_groups.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.groups
description: Number of users who are group members for last 28 days
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: subgroups
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180818_users_created.yml b/config/metrics/counts_28d/20210216180818_users_created.yml
index 80fef7467e0..b4646b3e012 100644
--- a/config/metrics/counts_28d/20210216180818_users_created.yml
+++ b/config/metrics/counts_28d/20210216180818_users_created.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.users_created
description: Number of users created in the month
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: users
value_type: number
status: active
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 a67113825e8..bfbad28ff80 100644
--- a/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
+++ b/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.configure.projects_with_prometheus_ale
description: Projects with Prometheus alerting enabled
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216180956_clusters.yml b/config/metrics/counts_28d/20210216180956_clusters.yml
index 6b9015dbdfe..f5100e8a67e 100644
--- a/config/metrics/counts_28d/20210216180956_clusters.yml
+++ b/config/metrics/counts_28d/20210216180956_clusters.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.monitor.clusters
description: Count users creating clusters in last 28 days.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
index 895746f5121..ce391200627 100644
--- a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.monitor.clusters_applications_promethe
description: Users creating clusters with Prometheus enabled in last 28 days.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: removed
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 0870789a515..47321b7b6c9 100644
--- a/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
+++ b/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_default_d
description: Active users with enabled operations dashboard
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 60b1ca2b765..d0e433af157 100644
--- a/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
+++ b/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
@@ -4,10 +4,10 @@ key_path: usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled
description: Projects with tracing enabled
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: tracing
value_type: number
-status: active
+status: removed
time_frame: 28d
data_source: database
distribution:
@@ -19,3 +19,5 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "15.2"
+removed_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90607"
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 3267d7d4412..0f6696d1666 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_e
description: Count of users creating projects with error tracking enabled.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 612a6f9be40..037da98e5fa 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_users_wit
description: Active users with projects on operations dashboard
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181050_packages.yml b/config/metrics/counts_28d/20210216181050_packages.yml
index 966f3fa48a3..39af30e7b21 100644
--- a/config/metrics/counts_28d/20210216181050_packages.yml
+++ b/config/metrics/counts_28d/20210216181050_packages.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.packages
description: A monthly count of packages published to the registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
index 17749102974..ff4a0887c01 100644
--- a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
+++ b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181139_issues.yml b/config/metrics/counts_28d/20210216181139_issues.yml
index de5238e3e77..13b38a681b1 100644
--- a/config/metrics/counts_28d/20210216181139_issues.yml
+++ b/config/metrics/counts_28d/20210216181139_issues.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.issues
description: Count of users creating Issues in last 28 days.
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181141_notes.yml b/config/metrics/counts_28d/20210216181141_notes.yml
index 280722a8a1c..3bb61debcc0 100644
--- a/config/metrics/counts_28d/20210216181141_notes.yml
+++ b/config/metrics/counts_28d/20210216181141_notes.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.notes
description: Count of MAU commenting on an issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181143_projects.yml b/config/metrics/counts_28d/20210216181143_projects.yml
index daad51c1409..4d9de3799ad 100644
--- a/config/metrics/counts_28d/20210216181143_projects.yml
+++ b/config/metrics/counts_28d/20210216181143_projects.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.projects
description: Count of MAU creating projects
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: projects
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181145_todos.yml b/config/metrics/counts_28d/20210216181145_todos.yml
index ad42b23ceb9..9cffb8c2b35 100644
--- a/config/metrics/counts_28d/20210216181145_todos.yml
+++ b/config/metrics/counts_28d/20210216181145_todos.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.todos
description: Count of MAU creating todos
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 b0f78840daa..a2a3d0e297f 100644
--- a/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.service_desk_enabled_projects
description: Count creator ids from projects with service desk enabled
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181148_service_desk_issues.yml b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
index 1b5d647fa0d..8ca0b6a55c3 100644
--- a/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
+++ b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.service_desk_issues
description: Count of service desk issues
product_section: dev
product_stage: plan
-product_group: group::plan
+product_group: plan
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181150_projects_jira_active.yml b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
index 84edf3f7e9c..dcfe0bb5638 100644
--- a/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
+++ b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.projects_jira_active
description: Distinct count of creator_id from projects with an active Jira integration.
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 07955a6cad1..9c2a821ea1d 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
@@ -5,7 +5,7 @@ description: Distinct count of creator_id from projects with an active Jira Clou
DVCS integration.
product_section: dev
product_stage: ecosystem
-product_group: group::integration
+product_group: integration
product_category: integrations
value_type: number
status: active
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 e87b69c266b..214dd882f1f 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
@@ -5,7 +5,7 @@ description: Distinct count of creator_id from projects with an active Jira Serv
DVCS integration.
product_section: dev
product_stage: ecosystem
-product_group: group::integration
+product_group: integration
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181158_epics.yml b/config/metrics/counts_28d/20210216181158_epics.yml
index aa3658b03bd..0c913b31f6d 100644
--- a/config/metrics/counts_28d/20210216181158_epics.yml
+++ b/config/metrics/counts_28d/20210216181158_epics.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.epics
description: Count distinct author ids from epics
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: epics
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181200_label_lists.yml b/config/metrics/counts_28d/20210216181200_label_lists.yml
index 3b97c6eb94c..a35840cf395 100644
--- a/config/metrics/counts_28d/20210216181200_label_lists.yml
+++ b/config/metrics/counts_28d/20210216181200_label_lists.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.plan.label_lists
description: Count of MAU creating label lists on Boards
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: boards
value_type: number
status: active
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 8e2b416af70..b61909074df 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_title_change
description: Count of MAU editing an issue title
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 942ad55d540..7aa9aec3e83 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_description_
description: Count of MAU editing an issue description
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 734da3e5403..a7ac8e5ff84 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_assignee_cha
description: Count of MAU changing issue assignees
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 45cc0d88c4d..10ce645e3c1 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_confide
description: Count of MAU making an issue confidential
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 4109da5e9e1..5264a1b5d7f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_visible
description: Count of MAU making an issue not confidential
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 0e8df458927..9d8424e05f8 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_created_mont
description: Count of MAU creating new issues
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 3334d9518ef..4c8177c17b3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_closed_month
description: Count of MAU closing an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 66034b7d1e4..4c09b7ee20c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_reopened_mon
description: Count of MAU re-opening a closed issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 ccb50cc01d5..3d50e6cd9b7 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_label_change
description: Count of MAU changing an issue's label
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 5dc6c335f34..af66e66109a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_milestone_ch
description: Count of MAU changing an issue's milestone
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 b2da497f7bf..b1c9d8b9fde 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_cross_refere
description: Count of MAU referencing an issue from somewhere else
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 a76a89646da..4b12bba4a5d 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_moved_monthl
description: Count of MAU moving an issue to another project
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 43a3e4a7d46..0bd107cdaed 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_related_mont
description: Count of MAU relating an issue to another issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 db3a3eb2a8f..fe0942b44b5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_unrelated_mo
description: Count of MAU unrelating an issue to another issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 39185b34916..882eb5d1ac2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_marked_as_du
description: Count of MAU marking an issue as a duplicate
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 c0d6bb6dd94..b8eb3dcf218 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_locked_month
description: Count of MAU locking an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 927e5abdb69..7260222961c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_unlocked_mon
description: Count of MAU unlocking an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 10a0aa99000..6022e93b0a5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_adde
description: Count of MAU adding a design to an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 9583b98427e..95543c6093d 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_modi
description: Count of MAU modifying a design on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 2df771c4aba..85341debfb7 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_remo
description: Count of MAU removing a design from an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 5c1d36a2795..60c293fd04d 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_due_date_cha
description: Count of MAU changing an issue due date
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 55ebaaf73bf..db15f121047 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_estimat
description: Count of MAU changing an issue time estimate
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 0551e7607ec..50dcf6156b1 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_spent_c
description: Count of MAU recording time spent on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 d6876e29cb4..38532866753 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_adde
description: Count of MAU commenting on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 0347b00d871..944b706bdc5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_edit
description: Count of MAU editing a comment on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 f2ef56645a2..201d9d5f169 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_remo
description: Count of MAU deleting a comment from an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 d0da9b74eb8..6aa874e0703 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_cloned_month
description: Count of MAU cloning an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 7d490a3dc95..fd67504fee9 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 90bc9ba73d0..3d6bb37de79 100644
--- a/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
+++ b/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_approve_monthly
description: Count of MAU using the `/approve` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 0c78cd4faa8..c905cdcfb04 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
@@ -5,7 +5,7 @@ description: Count of MAU using the `/assign @user1` quick action to assign a si
individual to an issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 fde995ff768..89d0de2550f 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
@@ -5,7 +5,7 @@ description: Count of MAU using the `/assign me` quick action to assign self to
issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 9eeb21e4c0b..ef2778050b0 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
@@ -5,7 +5,7 @@ description: Count of MAU using the `/assign_reviewer` or `request_reviewer` qui
action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 6a8564ed981..ac3ca60d777 100644
--- a/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
+++ b/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
@@ -5,7 +5,7 @@ description: Count of MAU using the `/award` quick action to set an award emoji
an issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 f92880c38eb..4f35a7dcd33 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_board_move_monthly
description: Count of MAU using the `/board_move` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 10f4e667e25..235d6505438 100644
--- a/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
+++ b/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 7a41293254e..d2ae2e53f38 100644
--- a/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
+++ b/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 3c5bdf3a4a3..9dca99be928 100644
--- a/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
+++ b/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
@@ -5,7 +5,7 @@ description: Count of MAU using the `/confidential` quick action to set an issue
confidential
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 3a9f9f70110..1b8e52b127e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_req
description: Count of MAU using the `/copy_metadata` quick action on a Merge Request
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 e8266a1989e..68d3b37035c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_mon
description: Count of MAU using the `/copy_metadata` quick action on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 5132d880fe8..ddcec1d9a86 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_create_merge_request_mo
description: Count of MAU using the `/create_merge_request` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 bd96f6965a0..725e369519d 100644
--- a/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
+++ b/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 825d8355a70..77a22a982d4 100644
--- a/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
+++ b/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 a8bcaf7b2c9..aea158347d2 100644
--- a/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
+++ b/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
@@ -5,7 +5,7 @@ description: Count of MAU using the `/due` quick action to change the due date o
an issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 41c067dc88c..e79a1b5e869 100644
--- a/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
@@ -5,7 +5,7 @@ description: Count of MAU using the `/duplicate` quick action to mark an issue a
a duplicate of another
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 96a51c514c7..e59d264fe1d 100644
--- a/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
@@ -5,7 +5,7 @@ description: Count of MAU using the `/estimate` quick action to set a time estim
on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 3f5fa5396e3..5b34fee13fd 100644
--- a/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
+++ b/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_label_monthly
description: Count of MAU using the `/label` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 7b65c2cecbb..6c1d4bb8520 100644
--- a/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
+++ b/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_lock_monthly
description: Count of MAU using the `/lock` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 2b9c653e31e..524a75f84d4 100644
--- a/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
+++ b/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_merge_monthly
description: Count of MAU using the `/merge` quick action
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 dca92829b75..7e373fe2e13 100644
--- a/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
+++ b/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_milestone_monthly
description: Count of MAU using the `/milestone` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 20bb3e82ce5..88765db809e 100644
--- a/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
+++ b/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_move_monthly
description: Count of MAU using the `/move` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 06cb49ad587..44d3d677dee 100644
--- a/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
+++ b/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_reassign_monthly
description: Count of MAU using the `/reassign @user1` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 de7bf045dbc..061bcbbb6c0 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_month
description: Count of MAU using the `/reassign_reviewer` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 177be7f33b4..ae3b9ae13c2 100644
--- a/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
+++ b/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: source_code
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 bcbee861e6a..4e3f6f53694 100644
--- a/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
+++ b/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_relabel_monthly
description: Count of MAU using the `/relabel` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 e16251e169a..88b3d2c6c6d 100644
--- a/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_relate_monthly
description: Count of MAU using the `/relate` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 f573957f5fd..ec0f16a09c2 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 8df0eb3ed73..831f9a93982 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly
description: Count of MAU using the `/remove_estimate` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 71f51658ba9..aacd8916937 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthl
description: Count of MAU using the `/remove_milestone` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 dae709a56f7..13adfd63500 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_time_spent_month
description: Count of MAU using the `/remove_time_spent` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 fcc00892045..4e0e679e4d8 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly
description: Count of MAU using the `/remove_zoom` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 4b9e1af8108..8341b7f0179 100644
--- a/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
+++ b/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_reopen_monthly
description: Count of MAU using the `/reopen` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 fb549d259d4..c711dff2df0 100644
--- a/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
+++ b/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_shrug_monthly
description: Count of MAU using the `/shrug` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 912ea2487be..7de55598d47 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 d6992675957..99f7aa98719 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 5b2272f09e2..1e3fefbcfae 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 03be662de07..9eca7c87963 100644
--- a/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
+++ b/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_subscribe_monthly
description: Count of MAU using the `/subscribe` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 b7a9bb1b669..5280ed2fcbf 100644
--- a/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
+++ b/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_tableflip_monthly
description: Count of MAU using the `/tableflip` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 c48efc45953..15c89bcec88 100644
--- a/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
+++ b/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_tag_monthly
description: Count of MAU using the `/tag` quick action
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 372220ae58b..21cb0a54942 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 76004594d85..82168bfe6ca 100644
--- a/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
+++ b/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_title_monthly
description: Count of MAU using the `/title` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 05353f9c3bc..78a05e1003c 100644
--- a/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
+++ b/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_todo_monthly
description: Count of MAU using the `/todo` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 095e11f90dd..df49d1b427c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unassign_specific_month
description: Count of MAU using the `/unassign @user1` quick action on Merge Requests
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 54ed00ab80a..426ab3bf763 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 f9132b9d641..5cb2e620dc1 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
@@ -5,7 +5,7 @@ description: Count of MAU using the `/unassign_reviewer` or `/remove_reviewer` q
action on Merge Requests
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 38c44348a4c..00aa10d9578 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
@@ -5,7 +5,7 @@ description: Count of MAU using the `/unlabel` or `/remove_label` quick action t
remove one or more specific labels
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 ce3d14e8906..97e40c5a1b1 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 0f9c059409c..29c61e97726 100644
--- a/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
+++ b/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unlock_monthly
description: Count of MAU using the `/unlock` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 585370e1fa2..879a60fc8e7 100644
--- a/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
+++ b/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly
description: Count of MAU using the `/unsubscribe` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 fed595813ca..fcdc2e28030 100644
--- a/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
+++ b/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 d6b8bb2b366..5c346f40ebc 100644
--- a/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
+++ b/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_zoom_monthly
description: Count of MAU using the `/zoom` quick action on Issues
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181923_successful_deployments.yml b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
index 675a7972ddc..27881c0975a 100644
--- a/config/metrics/counts_28d/20210216181923_successful_deployments.yml
+++ b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.successful_deployments
description: Total successful deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181924_failed_deployments.yml b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
index b173c4dd125..1cd1a8a032a 100644
--- a/config/metrics/counts_28d/20210216181924_failed_deployments.yml
+++ b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.failed_deployments
description: Total failed deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181935_deployments.yml b/config/metrics/counts_28d/20210216181935_deployments.yml
index a8c2928caeb..5e7ee9b1d50 100644
--- a/config/metrics/counts_28d/20210216181935_deployments.yml
+++ b/config/metrics/counts_28d/20210216181935_deployments.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.release.deployments
description: Unique users triggering deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181937_failed_deployments.yml b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
index 00967fc519c..adf373cde20 100644
--- a/config/metrics/counts_28d/20210216181937_failed_deployments.yml
+++ b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.release.failed_deployments
description: Disinct users who initiated a failed deployment.
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181939_releases.yml b/config/metrics/counts_28d/20210216181939_releases.yml
index ea59a5be99f..a2a5a4adb0b 100644
--- a/config/metrics/counts_28d/20210216181939_releases.yml
+++ b/config/metrics/counts_28d/20210216181939_releases.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.release.releases
description: Unique users creating release tags
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181941_successful_deployments.yml b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
index cc176feb5d3..a2282df3e4f 100644
--- a/config/metrics/counts_28d/20210216181941_successful_deployments.yml
+++ b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.release.successful_deployments
description: Disinct users who initiated a successful deployment.
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
index eebce0dcb81..9752c924a90 100644
--- a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
+++ b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.verify.clusters_applications_runner
description: Total GitLab Managed clusters with Runner enabled
product_section: ops
product_stage: verify
-product_group: group::runner
+product_group: runner
product_category: runner
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216182034_deploy_keys.yml b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
index 77902b38f6d..22e30fd46cd 100644
--- a/config/metrics/counts_28d/20210216182034_deploy_keys.yml
+++ b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.deploy_keys
description: Count of users creating deploy keys in last 28 days.
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182036_keys.yml b/config/metrics/counts_28d/20210216182036_keys.yml
index 63df27fe2e7..32debdcde5c 100644
--- a/config/metrics/counts_28d/20210216182036_keys.yml
+++ b/config/metrics/counts_28d/20210216182036_keys.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.keys
description: Count of users creating regular keys in last 28 days.
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
index 888a25194b2..49a8bd129c4 100644
--- a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
+++ b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
@@ -5,7 +5,7 @@ description: Count of users creating projects with remote mirrors. Includes both
and pull mirrors.
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 e8d8ad16a08..3db7aec4eab 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_pro
description: Count of monthly active users who have performed any Git operation (read/write/push)
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 28b03586bb8..eaad616dbb5 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_git
description: Aggregated value for wiki, design, and project repo Git write actions
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182051_protected_branches.yml b/config/metrics/counts_28d/20210216182051_protected_branches.yml
index 3718bef319c..30a3fdec69a 100644
--- a/config/metrics/counts_28d/20210216182051_protected_branches.yml
+++ b/config/metrics/counts_28d/20210216182051_protected_branches.yml
@@ -5,7 +5,7 @@ description: Count of users creating projects with repositories making use of at
one protected branch in last 28 days.
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
index 490c2260902..09aa1254bf7 100644
--- a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
index 28807011aa2..41157cef2fe 100644
--- a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.source_code.design_action_monthly
description: Count of total design actions (upload, delete, comment, reply)
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
index 4ef38c412a5..d6fc28af969 100644
--- a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
@@ -5,7 +5,7 @@ description: Count of unique actions done on projects and related resources (cre
edit, delete, comment)
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182129_sast_pipeline.yml b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
index 2fd7a4bf683..53f1d30f870 100644
--- a/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
+++ b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.secure.sast_pipeline
description: Counts of Pipelines that have at least 1 SAST job
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
index 1690987c446..fee63f8d9fd 100644
--- a/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
+++ b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
@@ -4,7 +4,7 @@ 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
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: secret_detection
value_type: number
status: active
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 ad5bba69a67..12b9e922a1c 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
@@ -5,7 +5,7 @@ description: Internal Tracking to count number of unit tests parsed for planning
future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
product_section: ops
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: code_testing
value_type: number
status: active
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 45f136efb76..37c12a1e9be 100644
--- a/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
+++ b/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.projects_with_alerts_created
description: Monthly count of unique projects with HTTP alerting enabled
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 8ea92369e0b..d617f3dcebd 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
@@ -2,9 +2,9 @@
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
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: number
status: removed
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 1e3913056e1..b5c1114ddbb 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
@@ -2,9 +2,9 @@
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
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183627_omniauth_providers.yml b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
index 4240abf9aa9..b65141906e8 100644
--- a/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
+++ b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.omniauth_providers
description: List of unique OmniAuth providers
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: object
status: active
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 95c4946756c..4e6bb25cb13 100644
--- a/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
+++ b/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.unique_users_all_imports
description: Number of unique users performing imports
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183640_gitlab.yml b/config/metrics/counts_28d/20210216183640_gitlab.yml
index 9fc8a81d95f..2c29feff047 100644
--- a/config/metrics/counts_28d/20210216183640_gitlab.yml
+++ b/config/metrics/counts_28d/20210216183640_gitlab.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab
description: REMOVED - Count of projects imported using bulk imports
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183642_gitlab_v1.yml b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
index aa1eae2e0c0..6deb3c937b2 100644
--- a/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
+++ b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1
description: Count of bulk imports - GitLab Migration
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183644_gitlab_project.yml b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
index c74e5c56a8d..0b776822fcc 100644
--- a/config/metrics/counts_28d/20210216183644_gitlab_project.yml
+++ b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_project
description: Count of projects imported using Project Import/Export
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183646_gitlab.yml b/config/metrics/counts_28d/20210216183646_gitlab.yml
index 511f9cd279c..73b7ae42466 100644
--- a/config/metrics/counts_28d/20210216183646_gitlab.yml
+++ b/config/metrics/counts_28d/20210216183646_gitlab.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183648_github.yml b/config/metrics/counts_28d/20210216183648_github.yml
index 0894998c7c4..159f0440bb8 100644
--- a/config/metrics/counts_28d/20210216183648_github.yml
+++ b/config/metrics/counts_28d/20210216183648_github.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.github
description: Count of projects imported from GitHub
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183650_bitbucket.yml b/config/metrics/counts_28d/20210216183650_bitbucket.yml
index 2f205a8995a..3ad9a26367e 100644
--- a/config/metrics/counts_28d/20210216183650_bitbucket.yml
+++ b/config/metrics/counts_28d/20210216183650_bitbucket.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket
description: Count of projects imported from Bitbucket
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
index 7f470f7955f..87c88931a7c 100644
--- a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
+++ b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket_serve
description: Count of projects imported from Bitbucket Server
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183653_gitea.yml b/config/metrics/counts_28d/20210216183653_gitea.yml
index 37e3ed2bf43..f23380e1726 100644
--- a/config/metrics/counts_28d/20210216183653_gitea.yml
+++ b/config/metrics/counts_28d/20210216183653_gitea.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.gitea
description: Count of projects imported from Gitea
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183655_git.yml b/config/metrics/counts_28d/20210216183655_git.yml
index daf8875ad12..e886cf6132b 100644
--- a/config/metrics/counts_28d/20210216183655_git.yml
+++ b/config/metrics/counts_28d/20210216183655_git.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.git
description: Count of projects imported from Git
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183657_manifest.yml b/config/metrics/counts_28d/20210216183657_manifest.yml
index d597be585f3..316755c772f 100644
--- a/config/metrics/counts_28d/20210216183657_manifest.yml
+++ b/config/metrics/counts_28d/20210216183657_manifest.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.manifest
description: Count of projects imported using Manifest file
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
index 68d5d3604a0..413ccf6d2c0 100644
--- a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
+++ b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_migratio
description: Count of projects imported using GitLab Migration
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183701_jira.yml b/config/metrics/counts_28d/20210216183701_jira.yml
index b171deb35f0..dc7c6c925f2 100644
--- a/config/metrics/counts_28d/20210216183701_jira.yml
+++ b/config/metrics/counts_28d/20210216183701_jira.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issue_imports.jira
description: Count of imports from Jira
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183703_fogbugz.yml b/config/metrics/counts_28d/20210216183703_fogbugz.yml
index e3286c11f2a..44acc1f7fdb 100644
--- a/config/metrics/counts_28d/20210216183703_fogbugz.yml
+++ b/config/metrics/counts_28d/20210216183703_fogbugz.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issue_imports.fogbugz
description: Count of imports from Fogbugz
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183705_phabricator.yml b/config/metrics/counts_28d/20210216183705_phabricator.yml
index 942f5e9dabc..69ea2a20a69 100644
--- a/config/metrics/counts_28d/20210216183705_phabricator.yml
+++ b/config/metrics/counts_28d/20210216183705_phabricator.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issue_imports.phabricator
description: Count of imports from Phabricator
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183707_csv.yml b/config/metrics/counts_28d/20210216183707_csv.yml
index a43bc380daa..5fd80dfd9a3 100644
--- a/config/metrics/counts_28d/20210216183707_csv.yml
+++ b/config/metrics/counts_28d/20210216183707_csv.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issue_imports.csv
description: Count of (issue) imports from CSV file
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183709_group_import.yml b/config/metrics/counts_28d/20210216183709_group_import.yml
index 7485b5a0b4a..03ad489c40c 100644
--- a/config/metrics/counts_28d/20210216183709_group_import.yml
+++ b/config/metrics/counts_28d/20210216183709_group_import.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.group_imports.group_import
description: Number of group import states
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
index 4c80d88c922..8e44c933e6e 100644
--- a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
+++ b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration
description: Count of groups imported using GitLab Migration
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210216183712_total.yml b/config/metrics/counts_28d/20210216183712_total.yml
index 7d20907a88c..0c97b73c81a 100644
--- a/config/metrics/counts_28d/20210216183712_total.yml
+++ b/config/metrics/counts_28d/20210216183712_total.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.total
description: Count of all imported projects
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183714_gitlab_project.yml b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
index 11397036533..9257e00455c 100644
--- a/config/metrics/counts_28d/20210216183714_gitlab_project.yml
+++ b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab_projec
description: Count of projects imported using Project Import/Export
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183716_gitlab.yml b/config/metrics/counts_28d/20210216183716_gitlab.yml
index 1f7a233360a..0b9b9163ef1 100644
--- a/config/metrics/counts_28d/20210216183716_gitlab.yml
+++ b/config/metrics/counts_28d/20210216183716_gitlab.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab
description: Count of projects imported using Project Import/Export
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183718_github.yml b/config/metrics/counts_28d/20210216183718_github.yml
index d3686ee5f13..b25a9b9266f 100644
--- a/config/metrics/counts_28d/20210216183718_github.yml
+++ b/config/metrics/counts_28d/20210216183718_github.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.github
description: Count of projects imported from GitHub
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183720_bitbucket.yml b/config/metrics/counts_28d/20210216183720_bitbucket.yml
index 281ddbc4179..7ae5c83bc6c 100644
--- a/config/metrics/counts_28d/20210216183720_bitbucket.yml
+++ b/config/metrics/counts_28d/20210216183720_bitbucket.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket
description: Count of projects imported from Bitbucket
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183722_bitbucket_server.yml b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
index bdff1803a6a..dee0bcf6600 100644
--- a/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
+++ b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_ser
description: Count of projects imported from Bitbucket Server
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183724_gitea.yml b/config/metrics/counts_28d/20210216183724_gitea.yml
index eecbd276e0c..cdb61b51634 100644
--- a/config/metrics/counts_28d/20210216183724_gitea.yml
+++ b/config/metrics/counts_28d/20210216183724_gitea.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitea
description: Count of projects imported from Gitea
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183726_git.yml b/config/metrics/counts_28d/20210216183726_git.yml
index e9b7a0d5e76..91e6a29d6fe 100644
--- a/config/metrics/counts_28d/20210216183726_git.yml
+++ b/config/metrics/counts_28d/20210216183726_git.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.git
description: Count of projects imported from Git
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183728_manifest.yml b/config/metrics/counts_28d/20210216183728_manifest.yml
index 8cf5bb94cef..470aee68e76 100644
--- a/config/metrics/counts_28d/20210216183728_manifest.yml
+++ b/config/metrics/counts_28d/20210216183728_manifest.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.projects_imported.manifest
description: Count of projects imported from Git using file Manifest
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183730_jira.yml b/config/metrics/counts_28d/20210216183730_jira.yml
index 094e46ba7f6..04d2f7f19ad 100644
--- a/config/metrics/counts_28d/20210216183730_jira.yml
+++ b/config/metrics/counts_28d/20210216183730_jira.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issues_imported.jira
description: Count of projects imported from Jira
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183731_fogbugz.yml b/config/metrics/counts_28d/20210216183731_fogbugz.yml
index 678d57b894e..a11a386f014 100644
--- a/config/metrics/counts_28d/20210216183731_fogbugz.yml
+++ b/config/metrics/counts_28d/20210216183731_fogbugz.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issues_imported.fogbugz
description: Count of projects imported from Fogbugz
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183733_phabricator.yml b/config/metrics/counts_28d/20210216183733_phabricator.yml
index 0f3b9cc46ee..4237650388a 100644
--- a/config/metrics/counts_28d/20210216183733_phabricator.yml
+++ b/config/metrics/counts_28d/20210216183733_phabricator.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issues_imported.phabricator
description: Count of projects imported from Phabricator
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183735_csv.yml b/config/metrics/counts_28d/20210216183735_csv.yml
index e81cc094832..4bceff8d3f6 100644
--- a/config/metrics/counts_28d/20210216183735_csv.yml
+++ b/config/metrics/counts_28d/20210216183735_csv.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.issues_imported.csv
description: Count of projects imported from CSV file
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210216183737_groups_imported.yml b/config/metrics/counts_28d/20210216183737_groups_imported.yml
index 3c62a859573..643b5010c09 100644
--- a/config/metrics/counts_28d/20210216183737_groups_imported.yml
+++ b/config/metrics/counts_28d/20210216183737_groups_imported.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.groups_imported
description: Count of imported groups
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
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 b4e45462f71..7901b72ea4b 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
@@ -7,7 +7,7 @@ description: Total unique users for i_search_total, i_search_advanced, i_search_
just want the total
product_section: enablement
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
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 e4c831091da..4225932b14b 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: static_site_editor
value_type: number
status: removed
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 ed703302451..d3dcfa28f58 100644
--- a/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.source_code.git_write_action_monthly
description: Count of unique Git write actions
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 fc007008b87..9c8ce1a1f06 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
@@ -2,9 +2,9 @@
data_category: optional
key_path: redis_hll_counters.testing.testing_total_unique_counts_monthly
description: Total users for events under testing category
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
value_type: number
status: removed
time_frame: 28d
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 70fc51b3d43..ffa7e442f40 100644
--- a/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
+++ b/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.snippets.i_snippets_show_monthly
description: Monthly number of users viewing snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
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 4f6aeb09d70..382c98ccbe2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthl
description: Monthly active users of GitLab Managed Terraform states
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 19e4aa14577..bbdead7be2e 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
@@ -5,7 +5,7 @@ description: Monthly unique user count doing commits which contains the CI confi
file
product_section: ops
product_stage: verify
-product_group: group::pipeline authoring
+product_group: pipeline_authoring
product_category: pipeline_authoring
value_type: number
status: active
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 495c7740e3f..f3b794bcc95 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 e3e7aa10c95..7968c4cbba5 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
@@ -3,7 +3,7 @@ data_category: operational
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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 94ac6d7b6b7..60a38d6fa8e 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 5cd9131d663..e58f002071a 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 01ab33527cc..d19a8a9d711 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 e09ac66953f..526a0da2dd8 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 99bddd4591b..1df6ec58528 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 9626907c904..144b0c4cd6a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_create_review_note_m
description: Count of unique users per month who create a note as part of a merge
request review
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 1153c89126e..33e9f1a2e66 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_publish_review_month
description: Count of unique users per month who publish their review as part of a
merge request review
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 805914598d6..0d487ff783e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_
description: Count of unique users per month who create a multiline comment in a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 84fa938126f..b430d20b4c5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_co
description: Count of unique users per week who edit a multiline comment in a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 db2155a71fe..eaf0244a307 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_
description: Count of unique users per month who remove a multiline comment in a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 da36f141a43..b53f211203c 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 4afb00c81dd..df3b27dae2e 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 c104c010002..8257411194d 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 d65c8380bc9..e3c41d33dfc 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 0da9ce57fea..475623aaa65 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 d2be31f7e89..23795ffbead 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_delete
description: Count of unique users per month who delete an approval rule to a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 2c1fc6664ff..aa60572f00a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_edited
description: Count of unique users per month who delete an approval rule to a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 fec6640220f..3a94b3062e0 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: editor_extension
product_section: 'TBD'
value_type: number
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 27c161cf13c..a4133bbef1f 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 f41722f99cc..f2e72cb8fff 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 09590b677f6..43a8a2340eb 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_mo
description: Count of pipelines with implicit Auto DevOps runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 407768232a5..0143fa01995 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_bu
description: Count of pipelines with implicit Auto Build runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
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 291ee7eb149..ee1c9ff1694 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_de
description: Count of pipelines with implicit Auto Deploy runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
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 822b436dfdd..a26887fef7d 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_
description: Count of pipelines with implicit SAST runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
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 57831d3a9dc..9e97dbe0bf2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secre
description: Count of pipelines with implicit Secret Detection runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: secret_detection
value_type: number
status: active
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 155994cb6f8..6fd6f8eb080 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_mo
description: Number of projects using 5 min production app CI template in last 7 days.
product_section: seg
product_stage: deploy
-product_group: group::5-min-app
+product_group: 5-min-app
product_category: five_minute_production_app
value_type: number
status: removed
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 6ca23b2d634..ac40f896b35 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
@@ -4,7 +4,7 @@ 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
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 7d3462cb068..6da5d7822d2 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
@@ -5,7 +5,7 @@ description: Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.
template in last 28 days.
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: removed
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 0645894329a..0ad5b9a9a5c 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
@@ -5,7 +5,7 @@ description: Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in
28 days.
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
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 5b95b20f38d..a5e5b1239d4 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_month
description: Count of pipelines using the Auto Build template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
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 6747c81367c..affc895a9ed 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_mont
description: Count of pipelines using the stable Auto Deploy template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
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 9efd5df6104..d1f300d4ab5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_late
description: Count of pipelines using the latest Auto Deploy template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
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 6c838d74576..2d8d1f10866 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly
description: Count of pipelines with SAST runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
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 cda8ebf1550..b8114ecb647 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_secret_detecti
description: Count of pipelines with Secret Detection runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: secret_detection
value_type: number
status: active
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 1831c8827f3..9774fc3a35e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_m
description: Count of pipelines that include the terraform base template from GitLab
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 df70ef7c718..a2a97eb7477 100755
--- 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.ci_templates_total_unique_counts_month
description: Total count of pipelines runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
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 23f3d923576..c5e686a5353 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.quickactions_total_unique_counts_month
description: Count of MAU using one or more quick actions
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 9f4cfe0fc13..1f68d5e5af8 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
@@ -5,7 +5,7 @@ description: A monthly count of Composer packages published to the registry usin
a deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 89a54558bd7..7f412de4467 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
@@ -5,7 +5,7 @@ description: A monthly count of Conan packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 3ddc5ee355a..d664a9fec80 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
@@ -5,7 +5,7 @@ description: A monthly count of container images published to the registry using
deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: removed
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 3de1fc2c0e8..20dbc97c7e8 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
@@ -5,7 +5,7 @@ description: A monthly count of Debian packages published to the registry using
deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 a09e973206d..fb60d6165ba 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
@@ -5,7 +5,7 @@ description: A monthly count of generic packages published to the registry using
deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 c11dead0b06..e4c289fc23f 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
@@ -5,7 +5,7 @@ description: A monthly count of Go modules published to the registry using a dep
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 c6e71e4a61b..5451a18cc82 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
@@ -5,7 +5,7 @@ description: A monthly count of Maven packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 143a840761c..123df5707f8 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
@@ -5,7 +5,7 @@ description: A monthly count of npm packages published to the registry using a d
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 cb7c6ae2e5b..b9f87e33fa9 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
@@ -5,7 +5,7 @@ description: A monthly count of NuGet packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 cadeb269204..05e80915b60 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
@@ -5,7 +5,7 @@ description: A monthly count of PyPI packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 bb6dd458ca6..a1409e87db2 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
@@ -5,7 +5,7 @@ description: A monthly count of package tags published to the registry using a d
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 344f35fa353..720165425fa 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
@@ -5,7 +5,7 @@ description: A monthly count of packages published to the registry using a deplo
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 f9baba603e9..f0fc010c722 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
@@ -5,7 +5,7 @@ description: A monthly count of users that have published a Composer package to
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 8a50ea78fe2..7388ed8860b 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 0e018dcd1a2..5c7f1b30f44 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
@@ -5,7 +5,7 @@ description: A monthly count of users that have published a container image to t
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: removed
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 03e9ec5f665..f6a96c326c9 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
@@ -5,7 +5,7 @@ description: A monthly count of users that have published a Debian package to th
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 93f551178c3..cce0c3d6a65 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
@@ -5,7 +5,7 @@ description: A monthly count of users that have published a generic package to t
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 5f135e00214..b6df3cb30f2 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 3fdb957ef0d..d591e6ec5da 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 f945fbf5266..e9992148893 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 782e7788eb2..0a77f2de550 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 d86147526e0..6cc9645516a 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 4912d7fd40d..9fc86ae712c 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 98679813670..52e2eec71c5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.user_packages.user_packages_total_unique_counts_mon
description: A monthly count of users that have published a package to the registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 7c4a4c8b032..bb919257a57 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_mont
description: Number of users closing Jira issues by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 2e41282a9cf..efd75c178b3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_
description: Number of users that cross-referenced Jira issues by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 1c89217829c..2d9e5402ffa 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly
description: Number of users for Jira and Slack by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 660f3675359..ae717f7cc1e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_single_mon
description: Unique users using the /invite_email quick action to add a single email participant to an issue within 28 days
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: issue_tracking
value_type: number
status: active
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 034eda07221..ce22e3ad675 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_m
description: Unique users using the /invite_email quick action to add a multiple email participants to an issue within 28 days
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: issue_tracking
value_type: number
status: active
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 2a7484f710a..c8d329a777b 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_change
description: Count of unique users per month who changed time estimate of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 febb6ea8464..aee5fb45c10 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_m
description: Count of unique users per month who changed time spent on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 d5b943fbed4..9cc58cc7963 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked
description: Count of unique users per month who locked a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 022047e7d0e..9474d1c8253 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlock
description: Count of unique users per month who unlocked a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 41e0d1c4a4d..25f6292cae0 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_user
description: Monthly unique user count having merge requests which contains the CI config file
product_section: ops
product_stage: verify
-product_group: group::pipeline authoring
+product_group: pipeline_authoring
product_category: pipeline_authoring
value_type: number
status: active
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 6fc1b724468..2e23791ef95 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_milestone_changed_mo
description: Count of unique users per month who changed milestone of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 644a09ffc23..d93dd8e64a8 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_labels_changed_month
description: Count of unique users per month who changed labels of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 a72f0675c6f..e42d744b718 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_assignees_changed_mo
description: Count of unique users per month who changed assignees of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 679cef614ef..9bbee5ed9b6 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_reviewers_changed_mo
description: Count of unique users per month who changed reviewers of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 5bee115d9d3..d668067c0ff 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notificat
description: Calculated unique users to trigger a Slack message by performing an action on an issue by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 3860335ef8e..f342e358301 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notificati
description: Calculated unique users to trigger a Slack message by performing a Git push by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 69b0bcb7181..daa96258a11 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_noti
description: Calculated unique users to trigger a Slack message by performing a deployment by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 3a2d77b811a..d8852ab90bd 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notif
description: Calculated unique users to trigger a Slack message by performing an action on a wiki page by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 e9f1ad972f7..9b485c7c39d 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_n
description: Calculated unique users to trigger a Slack message by performing an action on a merge request by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 d30874198d0..f407a19aab3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notificati
description: Calculated unique users to trigger a Slack message by creating a note by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 3f58d21ae15..f815f161859 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notifi
description: Calculated unique users to trigger a Slack message by performing a tag push by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 516b1385474..b8485c38da2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_no
description: Calculated unique users to trigger a Slack message by creating a confidential note by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 e959116a4fa..023bf9955b9 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_is
description: Calculated unique users to trigger a Slack message by performing an action on a confidential issue by month
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 07fd63aacec..6ca11514b09 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_tok
description: Distinct count events for RubyGems packages published using a Deploy token in recent 28 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 e7ecbddda51..2d5eda05a7f 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 5a2d55f35a0..dfaff8de054 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.secure.users_expanding_secure_security_report_month
description: Count of expanding the security report widget
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
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 7d8b1753990..65b9764cf10 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_expanding_testing_code_quality_report
description: Count of expanding the code quality widget
product_section: ops
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: code_quality
value_type: number
status: active
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 d0c8c0404fb..601fc6fdab3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_expanding_testing_accessibility_repor
description: Count of expanding the accessibility report widget
product_section: ops
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: accessibility_testing
value_type: number
status: active
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 d55ba9c7937..64daea732c5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.deploy_token_packages.i_package_terraform_module_de
description: Number of distinct users authorized via deploy token creating Terraform Module packages in recent 28 days
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 58700643680..070a0669d54 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.user_packages.i_package_terraform_module_user_month
description: Number of distinct users creating Terraform Module packages in recent 28 days
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 1edc5ce21df..49cab313fc8 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
@@ -4,7 +4,7 @@ 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
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: testing
value_type: number
status: active
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 da9bc2493a7..5557480f8fb 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_single_file_mode_se
description: Count of users clicking single file mode setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 5a4cf3692ae..e8e988a4523 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_file_browser_settin
description: Count of users clicking merge request file browser setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 a378c9eb07f..483923397b5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_whitespace_setting_
description: Count of users clicking merge request whitespae setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 3d271e3b38f..bc628468e30 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 0e2f0430a38..f1c431574f9 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_diff_view_parallel_monthl
description: Count of users with merge request view type as parallel
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 1bbf3a04418..75f0169692a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_file_browser_tree_view_mo
description: Count of users with merge request file tree setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 8aeb80499ae..ccd333ba13a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_file_browser_list_view_mo
description: Count of users with merge request file list setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 306eeddc25b..23dae4618b1 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_diff_show_whitespace_mont
description: Count of users with show whitespace enabled
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 ef8410fdb7b..4a639d02565 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_diff_hide_whitespace_mont
description: Count of users with show whitespace disabled
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 76fe3b835fa..8ae647ab1de 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 9ab2bd2e48a..f4aa1da6498 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_diff_multiple_files_month
description: Count of users with single mode disabled
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 67cae705601..f3df451f720 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
@@ -4,7 +4,7 @@ key_path: counts_monthly.aggregated_metrics.code_review_category_monthly_active_
description: Unique users performing actions on code review events
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category:
value_type: number
status: active
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 b379aa78586..4594539267d 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
@@ -4,7 +4,7 @@ key_path: counts_monthly.aggregated_metrics.code_review_extension_category_month
description: Number of users performing i_code_review_user_vs_code_api_request event
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category:
value_type: number
status: active
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 01c4724971d..939e8d69063 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
@@ -4,7 +4,7 @@ key_path: counts_monthly.aggregated_metrics.code_review_group_monthly_active_use
description: Number of users performing at least one of the code review events
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category:
value_type: number
status: active
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 b37c149ec11..a3f1a052531 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.pipeline_authoring.pipeline_authoring_total_unique_
description: Unique users doing commits or push MRs which contains CI cifig file
product_section: ops
product_stage: verify
-product_group: group::pipeline authoring
+product_group: pipeline_authoring
product_category: pipeline_authoring
value_type: number
status: active
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 c854fe7e34d..f08a7bfd4d6 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_resolve_conflict_mon
name: resolve_conflict
description: Count of unique users per week who attempt to resolve a conflict through the ui
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 49500d88646..b8dc238e59f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_load_conflict_ui_mon
name: load_conflict_ui
description: Count of unique users per week who load the conflict resolution page
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
diff --git a/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml b/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml
index 7b39c8a3996..9a6bf373cbe 100644
--- a/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml
+++ b/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml
@@ -4,7 +4,7 @@ key_path: counts_monthly.projects
description: 'Count number of projects created monthly'
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: ''
value_type: number
status: active
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 e891843a68d..c0fd95f4be2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.deploy_token_packages.i_package_helm_deploy_token_m
description: Distinct Helm pakages deployed in recent 28 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 3653e1d2b2f..0e32bf86f68 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210520111133_total.yml b/config/metrics/counts_28d/20210520111133_total.yml
index cef2766c95a..1a7437259f6 100644
--- a/config/metrics/counts_28d/20210520111133_total.yml
+++ b/config/metrics/counts_28d/20210520111133_total.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.manage.project_imports.total
description: Total count of projects imported
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
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 35dfad5b7a8..28425f5f1cd 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_diff_view_setting_m
description: Count of users clicking diff view setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml b/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
index d5656bcc80b..0efb03c9fe9 100644
--- a/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
+++ b/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
@@ -4,7 +4,7 @@ description: Unique users creating releases with milestones associated
performance_indicator_type: []
product_section: ops
product_stage: release
-product_group: 'group::release'
+product_group: 'release'
product_category: Release Orchestration
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml b/config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml
index 3414cf0e868..106ab05f6d5 100644
--- a/config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml
+++ b/config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_searches_diff_monthl
description: Count of users who search merge request diffs
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml b/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml
index a2af908ea49..eedece821d0 100644
--- a/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml
+++ b/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_severity_monthly
description: Count of MAU using the `/severity` quick action
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml b/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml
index a5bd56d0a7d..19bd4f54e5c 100644
--- a/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml
+++ b/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml
@@ -4,7 +4,7 @@ name: "count_notes_with_suggestions_monthly"
description: Total number of monthly suggestions
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml b/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml
index 2d4f41f6dff..97550aee80e 100644
--- a/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml
+++ b/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml
@@ -4,7 +4,7 @@ name: "count_notes_with_applied_suggestions_monthly"
description: Total number of monthly suggestions applied
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210902191057_i_quickactions_unapprove_monthly.yml b/config/metrics/counts_28d/20210902191057_i_quickactions_unapprove_monthly.yml
index 6cd2704b058..8611f03604e 100644
--- a/config/metrics/counts_28d/20210902191057_i_quickactions_unapprove_monthly.yml
+++ b/config/metrics/counts_28d/20210902191057_i_quickactions_unapprove_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unapprove_monthly
description: Count of MAU using the `/unapprove` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml b/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml
index 072305ed6f4..5c2327fd50b 100644
--- a/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml
+++ b/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml
@@ -4,7 +4,7 @@ name: resolve_thread_in_issue
description: The number of users who resolve a thread in a new issue through the MR page monthly
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml b/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
index 65a9a0b3cee..0ee3d694317 100644
--- a/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
+++ b/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
@@ -4,7 +4,7 @@ name: count_distinct_users_using_two_factor_authentication
description: Number of unique user logins using two factor authentication for available providers
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: object
status: active
diff --git a/config/metrics/counts_28d/20210916080405_promoted_issues.yml b/config/metrics/counts_28d/20210916080405_promoted_issues.yml
index 27c9f01edbe..5c1ad6446f0 100644
--- a/config/metrics/counts_28d/20210916080405_promoted_issues.yml
+++ b/config/metrics/counts_28d/20210916080405_promoted_issues.yml
@@ -2,9 +2,9 @@
key_path: counts_monthly.promoted_issues
name: count_promoted_issues
description: Count of issues promoted to epics
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: number
status: removed
diff --git a/config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml b/config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml
index 6ecc98dcad1..1d3b7907c13 100644
--- a/config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml
+++ b/config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.monitor.clusters_integrations_promethe
description: Users creating clusters with Prometheus integration enabled in last 28 days.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml b/config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml
index d79dede39f0..baa0b529d26 100644
--- a/config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml
+++ b/config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.importer.github_import_project_start_monthly
description: The number of github projects that were enqueued to start monthy
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml b/config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml
index eb4ce81997f..ca943ecad7f 100644
--- a/config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml
+++ b/config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.importer.github_import_project_success_monthly
description: The number of github projects that were successful monthly
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml b/config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml
index 0f16cf65ca5..fe97d6c0eeb 100644
--- a/config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml
+++ b/config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.importer.github_import_project_failure_monthly
description: The number of github projects that failed monthly
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211015154445_p_ci_templates_kaniko_monthly.yml b/config/metrics/counts_28d/20211015154445_p_ci_templates_kaniko_monthly.yml
index 1278c880072..eb03acc2476 100644
--- a/config/metrics/counts_28d/20211015154445_p_ci_templates_kaniko_monthly.yml
+++ b/config/metrics/counts_28d/20211015154445_p_ci_templates_kaniko_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_kaniko_monthly
description: ''
product_section: ops
product_stage: verify
-product_group: group::pipeline authoring
+product_group: pipeline_authoring
product_category: pipeline_authoring
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211102141250_i_quickactions_promote_to_incident_monthly.yml b/config/metrics/counts_28d/20211102141250_i_quickactions_promote_to_incident_monthly.yml
index 76f24633869..e50780d378f 100644
--- a/config/metrics/counts_28d/20211102141250_i_quickactions_promote_to_incident_monthly.yml
+++ b/config/metrics/counts_28d/20211102141250_i_quickactions_promote_to_incident_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_promote_to_incident_mon
description: Count of MAU using the `/promote_to_incident` quick action
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211102205024_p_ci_templates_security_sast_iac_latest_monthly.yml b/config/metrics/counts_28d/20211102205024_p_ci_templates_security_sast_iac_latest_monthly.yml
index c9589f3ff29..5f171c62bab 100644
--- a/config/metrics/counts_28d/20211102205024_p_ci_templates_security_sast_iac_latest_monthly.yml
+++ b/config/metrics/counts_28d/20211102205024_p_ci_templates_security_sast_iac_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_iac_lates
description: Count of pipelines using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211102205223_p_ci_templates_implicit_security_sast_iac_latest_monthly.yml b/config/metrics/counts_28d/20211102205223_p_ci_templates_implicit_security_sast_iac_latest_monthly.yml
index 9e5724b1e40..72a061f831b 100644
--- a/config/metrics/counts_28d/20211102205223_p_ci_templates_implicit_security_sast_iac_latest_monthly.yml
+++ b/config/metrics/counts_28d/20211102205223_p_ci_templates_implicit_security_sast_iac_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_
description: Count of pipelines with implicit runs using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211102213704_p_ci_templates_jobs_sast_iac_latest_monthly.yml b/config/metrics/counts_28d/20211102213704_p_ci_templates_jobs_sast_iac_latest_monthly.yml
index 40aa9cdbab1..90f8eae91fe 100644
--- a/config/metrics/counts_28d/20211102213704_p_ci_templates_jobs_sast_iac_latest_monthly.yml
+++ b/config/metrics/counts_28d/20211102213704_p_ci_templates_jobs_sast_iac_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_iac_latest_mo
description: Count of pipelines using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211102213921_p_ci_templates_implicit_jobs_sast_iac_latest_monthly.yml b/config/metrics/counts_28d/20211102213921_p_ci_templates_implicit_jobs_sast_iac_latest_monthly.yml
index 3fa3c751366..2a34553de79 100644
--- a/config/metrics/counts_28d/20211102213921_p_ci_templates_implicit_jobs_sast_iac_latest_monthly.yml
+++ b/config/metrics/counts_28d/20211102213921_p_ci_templates_implicit_jobs_sast_iac_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_sast_iac_
description: Count of pipelines with implicit runs using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211104154357_i_code_review_widget_nothing_merge_click_new_file_monthly.yml b/config/metrics/counts_28d/20211104154357_i_code_review_widget_nothing_merge_click_new_file_monthly.yml
index 928dd24b701..d20b78cab9b 100644
--- a/config/metrics/counts_28d/20211104154357_i_code_review_widget_nothing_merge_click_new_file_monthly.yml
+++ b/config/metrics/counts_28d/20211104154357_i_code_review_widget_nothing_merge_click_new_file_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_widget_nothing_merge_clic
description: Count of users who click the create file button in the nothing to merge widget state
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211109114953_i_quickactions_add_contacts_monthly.yml b/config/metrics/counts_28d/20211109114953_i_quickactions_add_contacts_monthly.yml
index ce6ab2f1580..f00f7cfafb9 100644
--- a/config/metrics/counts_28d/20211109114953_i_quickactions_add_contacts_monthly.yml
+++ b/config/metrics/counts_28d/20211109114953_i_quickactions_add_contacts_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_add_contacts_monthly
description: Count of MAU using the `/add_contacts` quick action
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211109120251_i_quickactions_remove_contacts_monthly.yml b/config/metrics/counts_28d/20211109120251_i_quickactions_remove_contacts_monthly.yml
index 7a544890e5a..cdf2b6abf39 100644
--- a/config/metrics/counts_28d/20211109120251_i_quickactions_remove_contacts_monthly.yml
+++ b/config/metrics/counts_28d/20211109120251_i_quickactions_remove_contacts_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_contacts_monthly
description: Count of MAU using the `/remove_contacts` quick action
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211111162103_i_code_review_post_merge_delete_branch_monthly.yml b/config/metrics/counts_28d/20211111162103_i_code_review_post_merge_delete_branch_monthly.yml
index 8bdad9d6837..c944a82a373 100644
--- a/config/metrics/counts_28d/20211111162103_i_code_review_post_merge_delete_branch_monthly.yml
+++ b/config/metrics/counts_28d/20211111162103_i_code_review_post_merge_delete_branch_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_delete_branch_
description: Count of users who click the delete source branch button after merge
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211111162422_i_code_review_post_merge_click_revert_monthly.yml b/config/metrics/counts_28d/20211111162422_i_code_review_post_merge_click_revert_monthly.yml
index aac7e359887..b01a6fe58f5 100644
--- a/config/metrics/counts_28d/20211111162422_i_code_review_post_merge_click_revert_monthly.yml
+++ b/config/metrics/counts_28d/20211111162422_i_code_review_post_merge_click_revert_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_click_revert_m
description: Count of users who click the revert button in the merge requet widget
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211112102446_i_code_review_post_merge_click_cherry_pick_monthly.yml b/config/metrics/counts_28d/20211112102446_i_code_review_post_merge_click_cherry_pick_monthly.yml
index cb0eb0e9b34..40f5cac914c 100644
--- a/config/metrics/counts_28d/20211112102446_i_code_review_post_merge_click_cherry_pick_monthly.yml
+++ b/config/metrics/counts_28d/20211112102446_i_code_review_post_merge_click_cherry_pick_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_click_cherry_p
description: Count of users who click the cherry pick button in the merge requet widget
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211112114333_i_code_review_post_merge_submit_revert_modal_monthly.yml b/config/metrics/counts_28d/20211112114333_i_code_review_post_merge_submit_revert_modal_monthly.yml
index 8e20f87ee29..592f51e2e99 100644
--- a/config/metrics/counts_28d/20211112114333_i_code_review_post_merge_submit_revert_modal_monthly.yml
+++ b/config/metrics/counts_28d/20211112114333_i_code_review_post_merge_submit_revert_modal_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_submit_revert_
description: Count of users who submit the post merge revert modal
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211112115144_i_code_review_post_merge_submit_cherry_pick_modal_monthly.yml b/config/metrics/counts_28d/20211112115144_i_code_review_post_merge_submit_cherry_pick_modal_monthly.yml
index e1492156507..15d1bc80bb2 100644
--- a/config/metrics/counts_28d/20211112115144_i_code_review_post_merge_submit_cherry_pick_modal_monthly.yml
+++ b/config/metrics/counts_28d/20211112115144_i_code_review_post_merge_submit_cherry_pick_modal_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_submit_cherry_
description: Count of users who submit the post merge revert modal
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml b/config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml
index bd1e7a74b46..c10bc664168 100644
--- a/config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml
+++ b/config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.analytics.p_analytics_ci_cd_pipelines_monthly
description: Count of unique visits to the project level CI CD Analytics pipelines tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211126090835_p_analytics_ci_cd_deployment_frequency_monthly.yml b/config/metrics/counts_28d/20211126090835_p_analytics_ci_cd_deployment_frequency_monthly.yml
index 9a829f0b172..8cf5acd5b0c 100644
--- a/config/metrics/counts_28d/20211126090835_p_analytics_ci_cd_deployment_frequency_monthly.yml
+++ b/config/metrics/counts_28d/20211126090835_p_analytics_ci_cd_deployment_frequency_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.analytics.p_analytics_ci_cd_deployment_frequency_mo
description: Count of unique visits to the project level CI CD Analytics deployment frequency tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211126091206_p_analytics_ci_cd_lead_time_monthly.yml b/config/metrics/counts_28d/20211126091206_p_analytics_ci_cd_lead_time_monthly.yml
index b053926a87a..60dcee1d757 100644
--- a/config/metrics/counts_28d/20211126091206_p_analytics_ci_cd_lead_time_monthly.yml
+++ b/config/metrics/counts_28d/20211126091206_p_analytics_ci_cd_lead_time_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.analytics.p_analytics_ci_cd_lead_time_monthly
description: Count of unique visits to the project level CI CD Analytics lead time tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211201140658_users_expanding_testing_license_compliance_report_monthly.yml b/config/metrics/counts_28d/20211201140658_users_expanding_testing_license_compliance_report_monthly.yml
index 75e9fb02788..c353641bd6f 100644
--- a/config/metrics/counts_28d/20211201140658_users_expanding_testing_license_compliance_report_monthly.yml
+++ b/config/metrics/counts_28d/20211201140658_users_expanding_testing_license_compliance_report_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_expanding_testing_license_compliance_
description: Count of expanding the license compliance widget
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211201154341_users_visiting_license_compliance_full_report_monthly.yml b/config/metrics/counts_28d/20211201154341_users_visiting_license_compliance_full_report_monthly.yml
index 96e1bc1f949..1f84c9f1788 100644
--- a/config/metrics/counts_28d/20211201154341_users_visiting_license_compliance_full_report_monthly.yml
+++ b/config/metrics/counts_28d/20211201154341_users_visiting_license_compliance_full_report_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_visiting_testing_license_compliance_f
description: Count of visiting the license compliance full report
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211202094237_users_visiting_manage_license_compliance_monthly.yml b/config/metrics/counts_28d/20211202094237_users_visiting_manage_license_compliance_monthly.yml
index dc4bc631759..a8fcd038e84 100644
--- a/config/metrics/counts_28d/20211202094237_users_visiting_manage_license_compliance_monthly.yml
+++ b/config/metrics/counts_28d/20211202094237_users_visiting_manage_license_compliance_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_visiting_testing_manage_license_compl
description: Count of visiting the manage license compliance page
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20211216083832_users_clicking_license_testing_visiting_external_website_monthly.yml b/config/metrics/counts_28d/20211216083832_users_clicking_license_testing_visiting_external_website_monthly.yml
index 99b64d7a379..cd9132bbcfc 100644
--- a/config/metrics/counts_28d/20211216083832_users_clicking_license_testing_visiting_external_website_monthly.yml
+++ b/config/metrics/counts_28d/20211216083832_users_clicking_license_testing_visiting_external_website_monthly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_clicking_license_testing_visiting_ext
description: Count of users clicking licence to visit external information website
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220121140644_user_jetbrains_api_request_monthly.yml b/config/metrics/counts_28d/20220121140644_user_jetbrains_api_request_monthly.yml
index deae309753a..2ca245c3c68 100644
--- a/config/metrics/counts_28d/20220121140644_user_jetbrains_api_request_monthly.yml
+++ b/config/metrics/counts_28d/20220121140644_user_jetbrains_api_request_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_jetbrains_api_reques
description: Count of unique users per month who use GitLab plugin for JetBrains
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: editor_extension
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml b/config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml
index a7ae893ebe9..f3fa80b4f25 100644
--- a/config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml
+++ b/config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_attention_monthly
description: Count of MAU using the `/attention` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml b/config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml
index 3f6fe27c6e4..773fc5564bb 100644
--- a/config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml
+++ b/config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_attention_monthl
description: Count of MAU using the `/remove_attention` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220202160126_ci_users_executing_deployment_job_monthly.yml b/config/metrics/counts_28d/20220202160126_ci_users_executing_deployment_job_monthly.yml
index d33dd895022..ddc6907ee19 100644
--- a/config/metrics/counts_28d/20220202160126_ci_users_executing_deployment_job_monthly.yml
+++ b/config/metrics/counts_28d/20220202160126_ci_users_executing_deployment_job_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_users.ci_users_executing_deployment_job_monthly
description: Monthly counts of times users have executed deployment jobs
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220214202927_users_updating_work_item_title.yml b/config/metrics/counts_28d/20220214202927_users_updating_work_item_title.yml
index 734bf674f00..cf711de79a9 100644
--- a/config/metrics/counts_28d/20220214202927_users_updating_work_item_title.yml
+++ b/config/metrics/counts_28d/20220214202927_users_updating_work_item_title.yml
@@ -4,7 +4,7 @@ description: Unique users updating a work item's title
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml b/config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml
index 30cd65425fe..82130118e43 100644
--- a/config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml
+++ b/config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml
@@ -4,7 +4,7 @@ description: Unique users creating work items
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_28d/20220222215951_xmau_plan.yml b/config/metrics/counts_28d/20220222215951_xmau_plan.yml
index bab5f66eecd..aaa9558d5a6 100644
--- a/config/metrics/counts_28d/20220222215951_xmau_plan.yml
+++ b/config/metrics/counts_28d/20220222215951_xmau_plan.yml
@@ -4,7 +4,7 @@ description: Unique users interacting with Plan features
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_28d/20220222215952_xmau_project_management.yml b/config/metrics/counts_28d/20220222215952_xmau_project_management.yml
index 0f970f2a344..ede46c85292 100644
--- a/config/metrics/counts_28d/20220222215952_xmau_project_management.yml
+++ b/config/metrics/counts_28d/20220222215952_xmau_project_management.yml
@@ -4,7 +4,7 @@ description: Unique users interacting with Project Management features
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_28d/20220222215955_users_work_items.yml b/config/metrics/counts_28d/20220222215955_users_work_items.yml
index a0111383f1d..a0f892fcef2 100644
--- a/config/metrics/counts_28d/20220222215955_users_work_items.yml
+++ b/config/metrics/counts_28d/20220222215955_users_work_items.yml
@@ -4,7 +4,7 @@ description: Unique users interacting with work items
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_28d/20220308234005_p_ci_templates_jobs_sast_latest_monthly.yml b/config/metrics/counts_28d/20220308234005_p_ci_templates_jobs_sast_latest_monthly.yml
index 260bae1061f..219147def08 100644
--- a/config/metrics/counts_28d/20220308234005_p_ci_templates_jobs_sast_latest_monthly.yml
+++ b/config/metrics/counts_28d/20220308234005_p_ci_templates_jobs_sast_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_latest_monthl
description: Weekly counts for SAST CI Latest template (Jobs folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220309001640_p_ci_templates_jobs_secret_detection_latest_monthly.yml b/config/metrics/counts_28d/20220309001640_p_ci_templates_jobs_secret_detection_latest_monthly.yml
index 163fc9c9ad6..c0d4ba01f03 100644
--- a/config/metrics/counts_28d/20220309001640_p_ci_templates_jobs_secret_detection_latest_monthly.yml
+++ b/config/metrics/counts_28d/20220309001640_p_ci_templates_jobs_secret_detection_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_secret_detection_l
description: Weekly counts for Secret Detection CI Latest template (Security folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220310213320_p_ci_templates_implicit_jobs_secret_detection_latest_monthly.yml b/config/metrics/counts_28d/20220310213320_p_ci_templates_implicit_jobs_secret_detection_latest_monthly.yml
index 2d3ca5386f7..d627a61d553 100644
--- a/config/metrics/counts_28d/20220310213320_p_ci_templates_implicit_jobs_secret_detection_latest_monthly.yml
+++ b/config/metrics/counts_28d/20220310213320_p_ci_templates_implicit_jobs_secret_detection_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_secret_de
description: Weekly counts for implicit use of Secret Detection CI Latest template (Jobs folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220310213749_p_ci_templates_implicit_jobs_sast_latest_monthly.yml b/config/metrics/counts_28d/20220310213749_p_ci_templates_implicit_jobs_sast_latest_monthly.yml
index 72d37ffb037..a9902f76feb 100644
--- a/config/metrics/counts_28d/20220310213749_p_ci_templates_implicit_jobs_sast_latest_monthly.yml
+++ b/config/metrics/counts_28d/20220310213749_p_ci_templates_implicit_jobs_sast_latest_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_sast_late
description: Weekly counts for implicit use of SAST CI Latest template (Jobs folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml b/config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml
index 2d534efba1c..1496e9dd5e5 100644
--- a/config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml
+++ b/config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_gitlab_cli_api_reque
description: Count of unique users per month who use the GitLab CLI
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: editor_extension
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220428154012_live_preview.yml b/config/metrics/counts_28d/20220428154012_live_preview.yml
index 8d2954cb825..23bfd9334bc 100644
--- a/config/metrics/counts_28d/20220428154012_live_preview.yml
+++ b/config/metrics/counts_28d/20220428154012_live_preview.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_liv
description: Count of monthly unique users that successfully connect to Live Preview
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml b/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml
index b14d684b908..ddde77a1755 100644
--- a/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml
+++ b/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_iac_monthly
description: Count of pipelines using the stable SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml b/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml
index 0925312f33a..7b817928c59 100644
--- a/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml
+++ b/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_iac_month
description: Count of pipelines using the stable SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml b/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml
index 658db1a27af..a4042763c46 100644
--- a/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml
+++ b/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml
@@ -5,11 +5,12 @@ description: Users that have a last_activity_on date within the past 28 days
product_category:
product_section: dev
product_stage: manage
-product_group: group::manage
+product_group: manage
value_type: number
-status: active
+status: removed
milestone: "15.1"
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88631
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88631/
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90468/
time_frame: 28d
data_source: database
data_category: optional
diff --git a/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml
index 1c70507da36..9f7a78cefdf 100644
--- a/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml
@@ -4,7 +4,7 @@ name: count_unique_users_interacting_with_timeline_events_monthly
description: Counts unique users for timeline events create, edit and delete events per month
product_section: ops
product_stage: monitor
-product_group: group::respond
+product_group: respond
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20220621085114_unique_active_users_monthly.yml b/config/metrics/counts_28d/20220621085114_unique_active_users_monthly.yml
new file mode 100644
index 00000000000..3282a4db173
--- /dev/null
+++ b/config/metrics/counts_28d/20220621085114_unique_active_users_monthly.yml
@@ -0,0 +1,24 @@
+---
+key_path: redis_hll_counters.manage.unique_active_users_monthly
+description: Users that have a last_activity_on date within the past 28 days
+product_section: dev
+product_stage: manage
+product_group: manage
+value_type: number
+status: active
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90468/
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - unique_active_user
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml b/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml
new file mode 100644
index 00000000000..a9a62b1aa79
--- /dev/null
+++ b/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_ci_cd_time_to_restore_service_monthly
+name: p_analytics_ci_cd_time_to_restore_service_monthly
+description: Count of unique visits to the project level CI/CD Analytics Time to restore service tab
+product_section: dev
+product_stage: manage
+product_group: optimize
+product_category:
+value_type: number
+status: active
+milestone: "15.2"
+introduced_by_url:
+time_frame: 28d
+data_source: redis_hll
+data_category: operational
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- premium
+- ultimate
+options:
+ events:
+ - p_analytics_ci_cd_time_to_restore_service
diff --git a/config/metrics/counts_28d/20220706175117_ci_users_executing_verify_job_monthly.yml b/config/metrics/counts_28d/20220706175117_ci_users_executing_verify_job_monthly.yml
new file mode 100644
index 00000000000..7abc7b63c84
--- /dev/null
+++ b/config/metrics/counts_28d/20220706175117_ci_users_executing_verify_job_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_users.ci_users_executing_verify_environment_job_monthly
+description: Monthly counts of times users have executed verify jobs
+product_section: ops
+product_stage: release
+product_group: release
+product_category: continuous_delivery
+value_type: number
+status: active
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91925
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+options:
+ events:
+ - ci_users_executing_verify_environment_job
+distribution:
+ - ce
+ - ee
+tier:
+ - free
+ - premium
+ - ultimate
diff --git a/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml b/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml
new file mode 100644
index 00000000000..186011b35af
--- /dev/null
+++ b/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_ci_cd_change_failure_rate_monthly
+name: p_analytics_ci_cd_change_failure_rate_monthly
+description: Count of unique visits to the project level CI/CD Analytics Change failure rate tab
+product_section: dev
+product_stage: manage
+product_group: optimize
+product_category:
+value_type: number
+status: active
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91726
+time_frame: 28d
+data_source: redis_hll
+data_category: operational
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- premium
+- ultimate
+options:
+ events:
+ - p_analytics_ci_cd_change_failure_rate
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 36097c13951..8abe9b7e66f 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
@@ -3,7 +3,7 @@ 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
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
product_section: 'TBD'
value_type: number
diff --git a/config/metrics/counts_7d/20210216174846_p_analytics_pipelines.yml b/config/metrics/counts_7d/20210216174846_p_analytics_pipelines.yml
index 8c491bc24b1..fad71037d79 100644
--- a/config/metrics/counts_7d/20210216174846_p_analytics_pipelines.yml
+++ b/config/metrics/counts_7d/20210216174846_p_analytics_pipelines.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.p_analytics_pipelines
description: Unique visitors to /:group/:project/pipelines/charts
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216174850_p_analytics_valuestream.yml b/config/metrics/counts_7d/20210216174850_p_analytics_valuestream.yml
index 0cb77ed4933..b575d7abf6d 100644
--- a/config/metrics/counts_7d/20210216174850_p_analytics_valuestream.yml
+++ b/config/metrics/counts_7d/20210216174850_p_analytics_valuestream.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.p_analytics_valuestream
description: Unique visitors to /:group/:project/-/value_stream_analytics
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216174856_p_analytics_repo.yml b/config/metrics/counts_7d/20210216174856_p_analytics_repo.yml
index fc1fb3470db..dd1b09ead42 100644
--- a/config/metrics/counts_7d/20210216174856_p_analytics_repo.yml
+++ b/config/metrics/counts_7d/20210216174856_p_analytics_repo.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.p_analytics_repo
description: Unique visitors to /:group/:project/-/graphs/master/charts
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216174858_i_analytics_cohorts.yml b/config/metrics/counts_7d/20210216174858_i_analytics_cohorts.yml
index 705cfefc5b5..27f8887cf9b 100644
--- a/config/metrics/counts_7d/20210216174858_i_analytics_cohorts.yml
+++ b/config/metrics/counts_7d/20210216174858_i_analytics_cohorts.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.i_analytics_cohorts
description: Unique visitors to /-/instance_statistics/cohorts
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216174900_i_analytics_dev_ops_score.yml b/config/metrics/counts_7d/20210216174900_i_analytics_dev_ops_score.yml
index 72db511d1e7..912386ac1c5 100644
--- a/config/metrics/counts_7d/20210216174900_i_analytics_dev_ops_score.yml
+++ b/config/metrics/counts_7d/20210216174900_i_analytics_dev_ops_score.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.i_analytics_dev_ops_score
description: Unique visitors to /-/instance_statistics/dev_ops_score
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216174902_g_analytics_merge_request.yml b/config/metrics/counts_7d/20210216174902_g_analytics_merge_request.yml
index 0e726cfceae..a51c51fc6c2 100644
--- a/config/metrics/counts_7d/20210216174902_g_analytics_merge_request.yml
+++ b/config/metrics/counts_7d/20210216174902_g_analytics_merge_request.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.g_analytics_merge_request
description: Unique visitors to /groups/:group/-/analytics/merge_request_analytics
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210216174906_i_analytics_instance_statistics.yml b/config/metrics/counts_7d/20210216174906_i_analytics_instance_statistics.yml
index 06123553499..9a5109f436c 100644
--- a/config/metrics/counts_7d/20210216174906_i_analytics_instance_statistics.yml
+++ b/config/metrics/counts_7d/20210216174906_i_analytics_instance_statistics.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.i_analytics_instance_statistics
description: Unique visitors to/admin/usage_trends
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216174908_analytics_unique_visits_for_any_target.yml b/config/metrics/counts_7d/20210216174908_analytics_unique_visits_for_any_target.yml
index cdc7ee79752..9865183388f 100644
--- a/config/metrics/counts_7d/20210216174908_analytics_unique_visits_for_any_target.yml
+++ b/config/metrics/counts_7d/20210216174908_analytics_unique_visits_for_any_target.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.analytics_unique_visits_for_any_target
description: Unique visitors to any analytics feature by week
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 c24d51412f8..eb85af4f7a0 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.analytics.i_analytics_instance_statistics_weekly
description: Unique visitors to /admin/usage_trends by week
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 4efbc3f14de..09940ac08dd 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
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 da938f35fa9..b513b694165 100644
--- a/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 6814b32f2bf..2db98f5087d 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 57987f98ab6..29b224c7aa4 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 63a8442c4e6..55957fe4c4b 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_single_file_diffs_we
description: Count of unique users per week with diffs viewed file by file
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 2883082131e..bb698f7cad2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_week
description: Count of unique merge requests per week with diffs viewed file by file
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 b7ceec20354..a1275a7bbeb 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 dd0cef04ca9..5ec666df078 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 3c79f72dd19..294a93a75d9 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 ec5e7fbc032..7f2311f33ea 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 d03ac5f1ef1..838fbf0e2d2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_comment_we
description: Count of unique users per week who commented on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 01b6ac1ee34..5510109edda 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_week
description: Count of unique users per week who edited a comment on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 082cf4b5f0f..b55bb571bd2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_we
description: Count of unique users per month who removed a comment on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 a7faca5bc28..6d3aafa428a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_add_suggestion_weekl
description: Count of unique users per week who added a suggestion
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 d313eccb956..7f4931eb125 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_apply_suggestion_wee
description: Count of unique users per week who applied a suggestion
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 74d8cf777af..cd1bf837b3f 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 8624ceac7d3..3995843b24a 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 299237ec022..97e7b0b849e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ide_edit.g_edit_by_snippet_ide_weekly
description: Weekly number of users editing Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
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 00c19a06ab9..ef67ab7f11e 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
@@ -16,6 +16,7 @@ options:
- g_edit_by_web_ide
- g_edit_by_sfe
- g_edit_by_snippet_ide
+ - g_edit_by_live_preview
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216180416_i_search_total.yml b/config/metrics/counts_7d/20210216180416_i_search_total.yml
index 82e2c0eceb3..e2bdc40d887 100644
--- a/config/metrics/counts_7d/20210216180416_i_search_total.yml
+++ b/config/metrics/counts_7d/20210216180416_i_search_total.yml
@@ -4,7 +4,7 @@ key_path: search_unique_visits.i_search_total
description: Calculated unique users to perform Basic or Advanced searches by week
product_section: enablement
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
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 2c02c296a85..01a2cdaee26 100644
--- a/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
+++ b/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
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 55170e41c2c..b3f32ed28c6 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
@@ -4,7 +4,7 @@ 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
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
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
index 8501aca963d..eeb751682c7 100644
--- 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
@@ -4,7 +4,7 @@ key_path: counts_weekly.aggregated_metrics.incident_management_alerts_total_uniq
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_group: monitor
product_category: incident_management
value_type: number
status: active
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
index 8e78722a377..6089b36401e 100644
--- 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
@@ -4,7 +4,7 @@ key_path: counts_weekly.aggregated_metrics.incident_management_incidents_total_u
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_group: monitor
product_category: incident_management
value_type: number
status: active
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
index cffbc350343..faa01b2c14e 100644
--- 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_alert_statu
description: Count of unique users changing alert's status per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index bfc8fd42716..88aae8134a4 100644
--- a/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml
+++ b/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_alert_assig
description: Count of unique users assigning an alert per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 174c58230ca..56b27038a3e 100644
--- a/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml
+++ b/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_alert_todo_
description: Count of unique users adding alerts to the TODO list per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 953c7962708..40b42fd1be4 100644
--- a/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml
+++ b/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_cr
description: Count of unique users creating incidents per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index e7cac727367..8453a7bf93b 100644
--- a/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml
+++ b/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_re
description: Count of unique users reopening incidents per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 65780586fcc..ce7a34aaeb2 100644
--- a/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml
+++ b/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_cl
description: Count of users closing incidents per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index f7dc966bb72..192e78b2675 100644
--- a/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml
+++ b/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_as
description: Count of unique users assiging incidents per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index d21ba880611..c15a71876c0 100644
--- a/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml
+++ b/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_to
description: Count of unique users adding incidents to the TODO list per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index f1f1ae465e6..5d7e5408466 100644
--- a/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml
+++ b/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_co
description: Count of unique users adding comments on incidents per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 45b0709bf25..763e713cc23 100644
--- 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_zo
description: Count of unique users creating Zoom meetings about incidents per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index d0ef9bd6e52..263d2d60274 100644
--- a/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml
+++ b/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml
@@ -5,7 +5,7 @@ description: Count of unique users adding issues per that are related to an inci
week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 6755ffd46a6..3bd90957bb9 100644
--- a/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml
+++ b/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml
@@ -5,7 +5,7 @@ description: Count of unique users removing issue that are related to an inciden
per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 2c6efe436cb..9b7d216a18d 100644
--- 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_incident_ch
description: Count of unique users changing incidents to confidential per week
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index f5d49e87d1c..6ad3e8e0c16 100644
--- 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.incident_management.incident_management_total_uniqu
description: Count of unique users performing events related to the incident management
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category:
value_type: number
status: active
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
index 24cd426e329..7abfc39fb41 100644
--- 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
@@ -5,7 +5,7 @@ description: Count of unique users per week to create an incident corresponding
an alert
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 9c2fbc1b9ac..c630b1bad72 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_description_
description: Count of WAU editing an issue description
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 be1e250f443..afd7ac16acc 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_assignee_cha
description: Count of WAU changing issue assignees
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 49fa886e26f..4a7590fa63e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_confide
description: Count of WAU making an issue confidential
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 e8a0b4dea52..eae4cf74b4f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_visible
description: Count of WAU making an issue not confidential
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 10a19c045cc..b59d309e25b 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_created_week
description: Count of WAU creating issues
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 8b8348e479a..bce3c7466d5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_closed_weekl
description: Count of WAU closing an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 36cfe848518..8e7f0a92086 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_reopened_wee
description: Count of WAU re-opening a closed issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 9a271f2a877..0a6436946a3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_label_change
description: Count of WAU changing an issue's label
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 83a8c402c00..39909e9d2f6 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_milestone_ch
description: Count of WAU changing an issue's milestone
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 d74794c08c7..1b20184f93f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_cross_refere
description: Count of WAU referencing an issue from somewhere else
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 0f344e64f41..1ef7e30cf80 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 39ee0d124bd..7df346d1c0f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_related_week
description: Count of WAU relating an issue to another issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 38606e53f88..e493200cb7e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_unrelated_we
description: Count of WAU unrelating an issue to another issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 647e9504281..7609355ef9e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_marked_as_du
description: Count of WAU marking an issue as a duplicate
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 de8177bd331..04c1c33b614 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_locked_weekl
description: Count of WAU locking an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 e514429b22d..99a46162e24 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_unlocked_wee
description: Count of WAU unlocking an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 86b6b48f6a8..6c54cda8cca 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_adde
description: Count of WAU adding a design to an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 da25aafd304..50591b27826 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_modi
description: Count of WAU modifying a design on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 1ece28bef07..f25c8fab470 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_remo
description: Count of WAU removing a design from an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 048bc6955b4..8fc70434d77 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_due_date_cha
description: Count of WAU changing an issue due date
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 a839582fd15..66313eadfb5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_estimat
description: Count of WAU changing an issue time estimate
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 f30fa4a93ac..2ad1a1fc35c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_spent_c
description: Count of WAU recording time spent on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 bf575481220..ca24e7b8d2e 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_adde
description: Count of WAU commenting on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 b1aa4e063ad..25d6d63f7b2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_edit
description: Count of WAU editing a comment on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 1af96466839..a11431c52f3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_remo
description: Count of WAU deleting a comment from an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 6dd6c3db6c5..0421bd5e6f3 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.issues_edit.g_project_management_issue_cloned_weekl
description: Count of WAU cloning an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 ad741e44bb6..5863d5c6d33 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 8a9121e954c..8ba9912367b 100644
--- a/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml
+++ b/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_approve_weekly
description: Count of WAU using the `/approve` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 d89739ce6fc..ce8b74e809d 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
@@ -5,7 +5,7 @@ description: Count of WAU using the `/assign @user1` quick action to assign a si
individual to an issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 dfc0547fbf3..e7a9da77a57 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
@@ -5,7 +5,7 @@ description: Count of WAU using the `/assign me` quick action to assign self to
issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 2482fa44596..2bb14fd86d6 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
@@ -5,7 +5,7 @@ description: Count of WAU using the `/assign_reviewer` or `request_reviewer` qui
action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 f0a6f19180d..f30c48afe27 100644
--- a/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml
+++ b/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml
@@ -5,7 +5,7 @@ description: Count of WAU using the `/award` quick action to set an award emoji
an issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 b036a1f2a9a..2fcfd76f2cf 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_board_move_weekly
description: Count of WAU using the `/board_move` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 cb9ed4dd02f..56666aa5c27 100644
--- a/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml
+++ b/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 c2fbf0dfad1..5f66e29d64d 100644
--- a/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml
+++ b/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 952d089c404..7044ec1cee0 100644
--- a/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml
+++ b/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml
@@ -5,7 +5,7 @@ description: Count of WAU using the `/confidential` quick action to set an issue
confidential
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 66e0558593e..477b01fe58a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_req
description: Count of WAU using the `/copy_metadata` quick action on a Merge Request
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 a55680b9a9f..ba3122f506f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_wee
description: Count of WAU using the `/copy_metadata` quick action on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 589f64cb96f..2cbaad8e195 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_create_merge_request_we
description: Count of WAU using the `/create_merge_request` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 0d8379ef87c..20a148487ed 100644
--- a/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml
+++ b/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 4722680c905..1862579b010 100644
--- a/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml
+++ b/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 c1ab3be82a4..6d91df37fff 100644
--- a/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml
+++ b/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml
@@ -5,7 +5,7 @@ description: Count of WAU using the `/due` quick action to change the due date o
an issuable
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 86e7e3f5fe7..2aa366e6189 100644
--- a/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml
@@ -5,7 +5,7 @@ description: Count of WAU using the `/duplicate` quick action to mark an issue a
a duplicate of another
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 148a58433f7..51a8b104c13 100644
--- a/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml
@@ -5,7 +5,7 @@ description: Count of WAU using the `/estimate` quick action to set a time estim
on an issue
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 9312c4cad2e..162ed402b2d 100644
--- a/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml
+++ b/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_label_weekly
description: Count of WAU using the `/label` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 619c94b117b..6f2cd99e56b 100644
--- a/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml
+++ b/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_lock_weekly
description: Count of WAU using the `/lock` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 6bacac4beb7..aaeda7d38c7 100644
--- a/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml
+++ b/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_merge_weekly
description: Count of WAU using the `/merge` quick action
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 1db5048970d..5c9333b86cc 100644
--- a/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml
+++ b/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_milestone_weekly
description: Count of WAU using the `/milestone` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 00b5e9db85c..9b0298c05ef 100644
--- a/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml
+++ b/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_move_weekly
description: Count of WAU using the `/move` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 488f5dcd547..5f692ea8693 100644
--- a/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml
+++ b/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_reassign_weekly
description: Count of WAU using the `/reassign @user1` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 be7648f6fc9..bebba3c9c16 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_weekl
description: Count of WAU using the `/reassign_reviewer` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 fd68d75a7d1..332b4a9d49f 100644
--- a/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml
+++ b/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: source_code
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 d25540e9127..30b34915504 100644
--- a/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml
+++ b/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_relabel_weekly
description: Count of WAU using the `/relabel` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 6114b6340da..0676a68294c 100644
--- a/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_relate_weekly
description: Count of WAU using the `/relate` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 b0fe3966750..851221e77a5 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 181533aa209..c61ef9beb0d 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_estimate_weekly
description: Count of WAU using the `/remove_estimate` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 fa4c059c8a3..6b27c442b53 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_milestone_weekly
description: Count of WAU using the `/remove_milestone` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 884c0b82e08..5e8b08a8b2f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_time_spent_weekl
description: Count of WAU using the `/remove_time_spent` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 5bace9a2061..1286451c093 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_zoom_weekly
description: Count of WAU using the `/remove_zoom` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 fe59955bc03..30230076606 100644
--- a/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml
+++ b/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_reopen_weekly
description: Count of WAU using the `/reopen` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 7e984753739..6dea3beeffb 100644
--- a/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml
+++ b/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_shrug_weekly
description: Count of WAU using the `/shrug` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 7225a40b37b..747db90fc0c 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: time_tracking
value_type: number
status: active
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 5cc536093c5..f0ef4fc1443 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 9a70b3d8e26..d59582d77a4 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 aeffa97de1f..45f12337aed 100644
--- a/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml
+++ b/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_subscribe_weekly
description: Count of WAU using the `/subscribe` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 0b2d759771a..2496a625ba4 100644
--- a/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml
+++ b/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_tableflip_weekly
description: Count of WAU using the `/tableflip` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 d7073ac8378..8fa970a825c 100644
--- a/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml
+++ b/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_tag_weekly
description: Count of WAU using the `/tag` quick action
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 6741280b2e4..1cacf957c29 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 30b60d472ff..7ed0c90fe63 100644
--- a/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml
+++ b/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_title_weekly
description: Count of WAU using the `/title` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 1752c3a4fd4..e626eb20f0e 100644
--- a/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml
+++ b/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_todo_weekly
description: Count of WAU using the `/todo` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 fe8532e5e47..c15a1a910e1 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unassign_specific_weekl
description: Count of WAU using the `/unassign @user1` quick action on Merge Requests
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 c9b473cc2de..ade389e3109 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 8b3be77a180..df8989017e4 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
@@ -5,7 +5,7 @@ description: Count of WAU using the `/unassign_reviewer` or `/remove_reviewer` q
action on Merge Requests
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 1725a41355f..f9bcdfae4e0 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
@@ -5,7 +5,7 @@ description: Count of WAU using the `/unlabel` or `/remove_label` quick action t
remove one or more specific labels
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 314d0520116..0b85ab538d8 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
@@ -4,7 +4,7 @@ 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
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 e43a93bcb14..e0954fdb822 100644
--- a/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml
+++ b/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unlock_weekly
description: Count of WAU using the `/unlock` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 02d944eca4f..a8c7c6d7f4a 100644
--- a/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml
+++ b/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unsubscribe_weekly
description: Count of WAU using the `/unsubscribe` quick action
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 c5d3ed1a478..b041898637a 100644
--- a/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml
+++ b/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 5f60ce53ab5..6591335ab5c 100644
--- a/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml
+++ b/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_zoom_weekly
description: Count of WAU using the `/zoom` quick action on Issues
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml b/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml
index 550d825a1e8..20bc1976170 100644
--- a/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216182104_design_action_weekly.yml b/config/metrics/counts_7d/20210216182104_design_action_weekly.yml
index 75b340a8ad5..b80ec9236a2 100644
--- a/config/metrics/counts_7d/20210216182104_design_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216182104_design_action_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.source_code.design_action_weekly
description: Count of total design actions (upload, delete, comment, reply)
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216182107_project_action_weekly.yml b/config/metrics/counts_7d/20210216182107_project_action_weekly.yml
index 21f857dac99..7ecc4a9ffaa 100644
--- a/config/metrics/counts_7d/20210216182107_project_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216182107_project_action_weekly.yml
@@ -5,7 +5,7 @@ description: Count of unique actions done on projects and related resources (cre
edit, delete, comment)
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 1dd4cc50c09..49d882f893b 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
@@ -5,7 +5,7 @@ description: Internal Tracking to count number of unit tests parsed for planning
future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
product_section: ops
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: code_testing
value_type: number
status: active
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 98bcd975333..6d7b16b9f3d 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
@@ -2,9 +2,9 @@
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
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: number
status: removed
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 bfd8f27de07..46295dcdb00 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
@@ -2,9 +2,9 @@
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
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: number
status: removed
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 d0e3ac2ceb3..25deb6b9c3b 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: static_site_editor
value_type: number
status: removed
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 7c49c843167..66811db0a95 100644
--- a/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.source_code.git_write_action_weekly
description: Count of unique Git write actions
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 7fd1d24d098..3b84b959cdc 100644
--- a/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml
+++ b/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.snippets.i_snippets_show_weekly
description: Weekly number of users viewing snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml b/config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml
index bb33cc5bed5..885f408188f 100644
--- a/config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml
+++ b/config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.terraform.p_terraform_state_api_unique_users_weekly
description: Monthly active users of GitLab Managed Terraform states
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 eaf4f7780cd..795acd44f85 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_user
description: Weekly unique user count doing commits which contains the CI config file
product_section: ops
product_stage: verify
-product_group: group::pipeline authoring
+product_group: pipeline_authoring
product_category: pipeline_authoring
value_type: number
status: active
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 78d489712bb..a84d38cc106 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 50a616d3156..2b013d9bd6f 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 341178587c9..cb199460b56 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 bb80932f86b..a4793165d84 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 1d91fa77e0c..2f7a8f95e60 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 bb2ebfc942b..f274a3c84ee 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 64de1c4ef82..a33decb9829 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 731c07d4fad..2f973ca280c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_create_review_note_w
description: Count of unique users per week who create a note as part of a merge request
review
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 d036350ef9d..12ab4d9e142 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_publish_review_weekl
description: Count of unique users per week who publish their review as part of a
merge request review
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 b90e46a5cd8..42350e2ed46 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_
description: Count of unique users per week who create a multiline comment in a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 5efcda783ff..e97a2d484a0 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_co
description: Count of unique users per week who edit a multiline comment in a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 71f051f10ee..c3116458680 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_
description: Count of unique users per week who remove a multiline comment in a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 2bef437e3d0..72a1a0d27cb 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 28bfd16ef6f..523df4fc166 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_section: 'TBD'
product_category: code_review
value_type: number
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 4c2944cf0c1..85e3cb7fa2e 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 57381e15a19..d38e248ab3d 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 b38faa983c7..3528cc2cdf5 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 02fe4cc5993..5745700f3b4 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_delete
description: Count of unique users per week who delete an approval rule to a merge
request
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 58b569521bb..42b67c04587 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 3e3668df67d..4dbf661eaa0 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: editor_extension
product_section: 'TBD'
value_type: number
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 7cf0936e79f..4e7bd44586c 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
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 eb62bf37a70..ab39318eb0d 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
@@ -3,7 +3,7 @@ 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
-product_group: group::code review
+product_group: code_review
product_category: code_review
product_section: 'TBD'
value_type: number
diff --git a/config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml b/config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml
index a6db13c8904..e00e435cf88 100644
--- a/config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml
+++ b/config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_we
description: Count of pipelines with implicit Auto Build runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml b/config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml
index 9bec574722c..3a522e9088e 100644
--- a/config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml
+++ b/config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_bu
description: Count of pipelines with implicit Auto Build runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml b/config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml
index ec176ce689c..71ceb5f2b1c 100644
--- a/config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml
+++ b/config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_de
description: Count of pipelines with implicit Auto Deploy runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml b/config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml
index b5d9e4f7992..a9cc39612a2 100644
--- a/config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml
+++ b/config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_
description: Count of pipelines with implicit SAST runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml b/config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml
index c7673adedfd..3d65b0c40e2 100644
--- a/config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml
+++ b/config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secre
description: Count of pipelines with implicit Secret Detection runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: secret_detection
value_type: number
status: active
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 050ad56eb91..e6f8be30ffc 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_we
description: Number of projects using 5 min production app CI template in last 7 days.
product_section: seg
product_stage: deploy
-product_group: group::5-min-app
+product_group: 5-min-app
product_category: five_minute_production_app
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml b/config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml
index 606fed4b823..d3e606940ea 100644
--- a/config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml
+++ b/config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_weekly
description: Count of pipelines using the latest Auto Deploy template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 0477d58a5d8..5ef3202e2b7 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
@@ -5,7 +5,7 @@ description: Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.
template in last 7 days.
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: removed
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 f5e03b1fbcb..2cbe1cf6e69 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
@@ -5,7 +5,7 @@ description: Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in
7 days.
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml b/config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml
index 408c03894fd..64ed870d8ef 100644
--- a/config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml
+++ b/config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_week
description: Count of pipelines using the stable Auto Deploy template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml b/config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml
index d7278e2dd34..681c013a387 100644
--- a/config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml
+++ b/config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_late
description: Count of pipelines using the latest Auto Deploy template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml b/config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml
index 07fa0b9ca40..e1898c66232 100644
--- a/config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml
+++ b/config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_weekly
description: Count of pipelines with SAST runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml b/config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml
index d73981915e1..e10586708bd 100644
--- a/config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml
+++ b/config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_secret_detecti
description: Count of pipelines with Secret Detection runs
product_section: ops
product_stage: verify
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: secret_detection
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml b/config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml
index d17d8c10e55..103bb221b98 100644
--- a/config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml
+++ b/config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_w
description: Count of pipelines that include the terraform base template from GitLab
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 a3696ba0098..aa25ab379b9 100755
--- 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.ci_templates_total_unique_counts_weekl
description: Total count of pipelines runs
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml
index e4826e6575c..f66f4acd853 100644
--- a/config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.quickactions_total_unique_counts_weekl
description: Count of WAU using one or more quick actions
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 4238901ee7f..d4bca957360 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
@@ -5,7 +5,7 @@ description: A weekly count of Composer packages published to the registry using
deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 f2c52f8b08a..8c312a52af0 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
@@ -5,7 +5,7 @@ description: A weekly count of Conan packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 5e724cef1b7..5e56465dbd4 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
@@ -5,7 +5,7 @@ description: A weekly count of container images published to the registry using
deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: removed
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 6f190f6b4ec..828e3662601 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
@@ -5,7 +5,7 @@ description: A weekly count of Debian packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 02bc59f30d8..6233c2339de 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
@@ -5,7 +5,7 @@ description: A weekly count of generic packages published to the registry using
deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 00103711910..3df457db03b 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
@@ -5,7 +5,7 @@ description: A weekly count of Go modules published to the registry using a depl
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 e4edfff33a7..8485e4013f3 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
@@ -5,7 +5,7 @@ description: A weekly count of Maven packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 95e1f413b12..7d8c3585aa2 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
@@ -5,7 +5,7 @@ description: A weekly count of npm packages published to the registry using a de
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 55d3a87db45..f2a0460bc27 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
@@ -5,7 +5,7 @@ description: A weekly count of NuGet packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 14c71a5ab70..a0c74b4f002 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
@@ -5,7 +5,7 @@ description: A weekly count of Python packages published to the registry using a
token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 9b8ca1c5d7c..27863bdde3d 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
@@ -5,7 +5,7 @@ description: A weekly count of users that have published a package tag to the re
using a deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 4a90ff637d6..671b8a1785a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.deploy_token_packages.deploy_token_packages_total_u
description: A weekly count of packages published to the registry using a deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 8ffcc7acc57..85bacdd8f17 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
@@ -5,7 +5,7 @@ description: A weekly count of users that have published a Composer package to t
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 dbca15deac9..78e2ad69fe8 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 abd37cd02d6..3ecf501dc1b 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
@@ -5,7 +5,7 @@ description: A weekly count of users that have published a container image to th
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: removed
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 29aabf7a7fa..e71927d20ee 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 d529d1c2f38..fe0b86aaa07 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
@@ -5,7 +5,7 @@ description: A weekly count of users that have published a generic package to th
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 75437f7e174..cfda35c0968 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 170c03065e5..fabc6d05016 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 6f340c74ae9..f48c0a9a506 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 ff0c7edfe44..bd4b8b006ec 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 9d227bf4d9e..5c52ee9137d 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 976ca5febe1..b934af222a8 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
@@ -5,7 +5,7 @@ description: A weekly count of users that have published a package with a tag to
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 1bd4181f952..81181baa4ee 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.user_packages.user_packages_total_unique_counts_wee
description: A weekly count of users that have published a package to the registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 33004c0a8a8..2b433855670 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_week
description: Number of users closing Jira issues by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 193fe8cef3a..aa3c99eab67 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_
description: Number of users that cross-referenced Jira issues by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 6f1332ca69e..513b3ba1f5e 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
@@ -4,7 +4,7 @@ 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
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 a9622709a20..6ea3c5d8e46 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_user
description: Weekly unique user count having merge requests which contains the CI config file
product_section: ops
product_stage: verify
-product_group: group::pipeline authoring
+product_group: pipeline_authoring
product_category: pipeline_authoring
value_type: number
status: active
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 343f01e8223..fac4c52904a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notificat
description: Calculated unique users to trigger a Slack message by performing an action on an issue by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 ae24bce7880..78f3c6d3d4a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_change
description: Count of unique users per week who changed time estimate of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 1f184726f6e..6a5f5914ded 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_w
description: Count of unique users per week who changed time spent on a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 7dc1fef5996..bac63e461c9 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notificati
description: Calculated unique users to trigger a Slack message by performing a Git push by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 7c5df5c4d30..30ee2e05a18 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_noti
description: Calculated unique users to trigger a Slack message by performing a deployment by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 1ff2ae4bfbe..54ff97eeb13 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notif
description: Calculated unique users to trigger a Slack message by performing an action on a wiki page by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 0d5259cd109..4a2a99f8282 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_n
description: Calculated unique users to trigger a Slack message by performing an action on a merge request by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 502633cf2e4..559940a3be9 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notificati
description: Calculated unique users to trigger a Slack message by creating a note by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 462e3a936bd..a029e1b30c4 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notifi
description: Calculated unique users to trigger a Slack message by performing a tag push by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 ed317741522..b278b731c7d 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_no
description: Calculated unique users to trigger a Slack message by creating a confidential note by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 7f3ec3d463e..fe0a2011392 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_is
description: Calculated unique users to trigger a Slack message by performing an action on a confidential issue by week
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 0ab35b83efb..a5f45d5ca39 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlock
description: Count of unique users per week who unlocked a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 05850bd0ecf..06b61434043 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked
description: Count of unique users per week who locked a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 d0becbb1f82..09d2a58fa35 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_milestone_changed_we
description: Count of unique users per week who changed milestone of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 84102e9d620..fc28f4ee95f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_labels_changed_weekl
description: Count of unique users per week who changed labels of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 7be4524a57e..687100f1572 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_assignees_changed_we
description: Count of unique users per week who changed assignees of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 9f7603e1669..9b8f57680e6 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_reviewers_changed_we
description: Count of unique users per week who changed reviewers of a MR
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 6668773a8a1..84c514f2b4c 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_single_wee
description: Unique users using the /invite_email quick action to add a single email participant to an issue within 7 days
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: issue_tracking
value_type: number
status: active
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 4e395cbaa75..b4085cc431b 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_w
description: Unique users using the /invite_email quick action to add a multiple email participants to an issue within 7 days
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: issue_tracking
value_type: number
status: active
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 dcbe3878463..4e22dafd1a2 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_tok
description: A weekly count of distinct RubyGems packages published using a deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 e8871c1868e..5fafa692102 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 ebe67adad33..41948e72b14 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.secure.users_expanding_secure_security_report_weekl
description: Count of expanding the security report widget
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
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 2a26794ed92..a8686e59e13 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_expanding_testing_code_quality_report
description: Count of expanding the code quality widget
product_section: ops
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: code_quality
value_type: number
status: active
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 87e8873ed00..bbad1715f98 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_expanding_testing_accessibility_repor
description: Count of expanding the accessibility report widget
product_section: ops
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: accessibility_testing
value_type: number
status: active
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 8325cb2620d..51cb976a888 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.deploy_token_packages.i_package_terraform_module_de
description: Number of distinct users authorized via deploy token creating Terraform Module packages in recent 7 days
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 90a8a3bad22..ad5002fe9b9 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.user_packages.i_package_terraform_module_user_weekl
description: Number of distinct users creating Terraform Module packages in recent 7 days
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 2b378da8347..f9c34ab4fe9 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
@@ -4,7 +4,7 @@ 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
product_stage: verify
-product_group: group::pipeline insights
+product_group: pipeline_insights
product_category: testing
value_type: number
status: active
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 027fd5d31d7..2822bc33d13 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_single_file_mode_se
description: Count of users clicking single file mode setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 76a53ef1b37..8e23a2aae8f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_file_browser_settin
description: Count of users with merge request file list setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 7d3f82bfbaf..6a127785a51 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_whitespace_setting_
description: Count of users clicking merge request whitespae setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 8e12608620d..e63400107c8 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 bcef87a890b..2968d582466 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 1a2e4fcf83e..62fb89aa5c5 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_file_browser_tree_view_we
description: Count of users with merge request file tree setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 813641cb82d..ea0d1039057 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_file_browser_list_view_we
description: Count of users with merge request file list setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 f11db5ceacd..0b791d84552 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_diff_show_whitespace_week
description: Count of users with show whitespace enabled
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 c2282fc9bc3..f5ab68f120f 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_diff_hide_whitespace_week
description: Count of users with show whitespace disabled
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 32318d1c4ff..613368825ec 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
@@ -4,7 +4,7 @@ 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
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 e83bd92cfd3..6eb1c55d098 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_diff_multiple_files_weekl
description: Count of users with single mode disabled
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210423005644_i_analytics_dev_ops_adoption.yml b/config/metrics/counts_7d/20210423005644_i_analytics_dev_ops_adoption.yml
index b79b021901c..02d537394f4 100644
--- a/config/metrics/counts_7d/20210423005644_i_analytics_dev_ops_adoption.yml
+++ b/config/metrics/counts_7d/20210423005644_i_analytics_dev_ops_adoption.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.i_analytics_dev_ops_adoption
description: Unique users viewing analytics devops adoption
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 1143a233e85..bb909bd10b2 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
@@ -4,7 +4,7 @@ key_path: counts_weekly.aggregated_metrics.code_review_group_monthly_active_user
description: Number of users performing at least one of the code review events
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category:
value_type: number
status: active
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 96490623d95..ce6093ed7fc 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
@@ -4,7 +4,7 @@ key_path: counts_weekly.aggregated_metrics.code_review_category_monthly_active_u
description: Unique users performing actions on code review events
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category:
value_type: number
status: active
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 d452a7d2c28..0ca1e03ab11 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
@@ -4,7 +4,7 @@ key_path: counts_weekly.aggregated_metrics.code_review_extension_category_monthl
description: Number of users performing code review extension_category events
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category:
value_type: number
status: active
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 fcaeed5faf6..1439c31a1cb 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.pipeline_authoring.pipeline_authoring_total_unique_
description: Unique users doing commits or push MRs which contains CI cifig file
product_section: ops
product_stage: verify
-product_group: group::pipeline authoring
+product_group: pipeline_authoring
product_category: pipeline_authoring
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml b/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml
index 2f5415c7802..378637ab14b 100644
--- a/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml
+++ b/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml
@@ -5,7 +5,7 @@ name: unique_users_viewing_analytics_group_devops_adoption
description: Unique users viewing analytics group devops adoption
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 a8449bad161..5e5f8012a25 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
@@ -5,7 +5,7 @@ name: load_conflict_ui
description: Count of unique users per week who load the conflict resolution page
product_section: 'TBD'
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 b25ed55bae1..be7905f3908 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
@@ -5,7 +5,7 @@ name: resolve_conflict
description: Count of unique users per week who attempt to resolve a conflict through the ui
product_section: 'TBD'
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
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 80ed666e376..48a6f7b6f80 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.deploy_token_packages.i_package_helm_deploy_token_w
description: Distinct Helm pakages deployed in recent 7 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 a3aede72682..2b144ddfea5 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 01ff67560ba..9b8408c193a 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
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.code_review.i_code_review_click_diff_view_setting_w
description: Count of users clicking diff view setting
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml b/config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml
index 18a5f85d719..4f96db892f6 100644
--- a/config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml
+++ b/config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_searches_diff_weekly
description: Count of users who search merge request diffs
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml b/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml
index abce1f1b04b..68bae7212c5 100644
--- a/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml
+++ b/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_severity_weekly
description: Count of WAU using the `/severity` quick action
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml b/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml
index 4460136d6fa..485ad63052e 100644
--- a/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml
+++ b/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml
@@ -4,7 +4,7 @@ name: "count_notes_with_suggestions_weekly"
description: Total number of weekly suggestions
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml b/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml
index 9388bad2024..fa2952320ef 100644
--- a/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml
+++ b/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml
@@ -4,7 +4,7 @@ name: "count_notes_with_applied_suggestions_weekly"
description: Total number of weekly suggestions applied
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210902000809_p_ci_templates_implicit_auto_devops_deploy_latest_weekly.yml b/config/metrics/counts_7d/20210902000809_p_ci_templates_implicit_auto_devops_deploy_latest_weekly.yml
index beb82977e3f..9afd7e8e3f8 100644
--- a/config/metrics/counts_7d/20210902000809_p_ci_templates_implicit_auto_devops_deploy_latest_weekly.yml
+++ b/config/metrics/counts_7d/20210902000809_p_ci_templates_implicit_auto_devops_deploy_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_de
description: Count of pipelines using the latest Auto Deploy template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210902191054_i_quickactions_unapprove_weekly.yml b/config/metrics/counts_7d/20210902191054_i_quickactions_unapprove_weekly.yml
index b3a4699307e..bba2b2bcfaf 100644
--- a/config/metrics/counts_7d/20210902191054_i_quickactions_unapprove_weekly.yml
+++ b/config/metrics/counts_7d/20210902191054_i_quickactions_unapprove_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_unapprove_weekly
description: Count of WAU using the `/unapprove` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml b/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml
index c9d0c92194b..7fdce381a55 100644
--- a/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml
+++ b/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml
@@ -4,7 +4,7 @@ name: resolve_thread_in_issue
description: The number of users who resolve a thread in a new issue through the MR page weekly
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
index 27e0505c2cd..d1021ed4c0b 100644
--- a/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
@@ -4,7 +4,7 @@ name: count_templates_gitlab_slack_application_active
description: Count templates with active slack application
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml b/config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml
index fb065ffe3b1..4d75becbbc3 100644
--- a/config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml
+++ b/config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.importer.github_import_project_start_weekly
description: The number of github projects that were enqueued to start weekly
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml b/config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml
index 887dc2565dc..19188213132 100644
--- a/config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml
+++ b/config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.importer.github_import_project_success_weekly
description: The number of github projects that were successful weekly
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml b/config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml
index c4ffb079c38..db77985ad5e 100644
--- a/config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml
+++ b/config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.importer.github_import_project_failure_weekly
description: The number of github projects that failed weekly
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211015154445_p_ci_templates_kaniko_weekly.yml b/config/metrics/counts_7d/20211015154445_p_ci_templates_kaniko_weekly.yml
index f101eefc933..0234ff62765 100644
--- a/config/metrics/counts_7d/20211015154445_p_ci_templates_kaniko_weekly.yml
+++ b/config/metrics/counts_7d/20211015154445_p_ci_templates_kaniko_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_kaniko_weekly
description: ''
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211102141244_i_quickactions_promote_to_incident_weekly.yml b/config/metrics/counts_7d/20211102141244_i_quickactions_promote_to_incident_weekly.yml
index a3ca5d70089..ee086b844cc 100644
--- a/config/metrics/counts_7d/20211102141244_i_quickactions_promote_to_incident_weekly.yml
+++ b/config/metrics/counts_7d/20211102141244_i_quickactions_promote_to_incident_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_promote_to_incident_wee
description: Count of WAU using the `/severity` quick action
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211102202454_p_ci_templates_security_sast_iac_latest_weekly.yml b/config/metrics/counts_7d/20211102202454_p_ci_templates_security_sast_iac_latest_weekly.yml
index 4fb9a64a234..371e684e406 100644
--- a/config/metrics/counts_7d/20211102202454_p_ci_templates_security_sast_iac_latest_weekly.yml
+++ b/config/metrics/counts_7d/20211102202454_p_ci_templates_security_sast_iac_latest_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_iac_lates
description: Count of pipelines using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211102204352_p_ci_templates_implicit_security_sast_iac_latest_weekly.yml b/config/metrics/counts_7d/20211102204352_p_ci_templates_implicit_security_sast_iac_latest_weekly.yml
index 09070adb2c1..fd4b22fd1e5 100644
--- a/config/metrics/counts_7d/20211102204352_p_ci_templates_implicit_security_sast_iac_latest_weekly.yml
+++ b/config/metrics/counts_7d/20211102204352_p_ci_templates_implicit_security_sast_iac_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_
description: Count of pipelines with implicit runs using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211102213112_p_ci_templates_jobs_sast_iac_latest_weekly.yml b/config/metrics/counts_7d/20211102213112_p_ci_templates_jobs_sast_iac_latest_weekly.yml
index 3fdd37bffa5..5b419846d35 100644
--- a/config/metrics/counts_7d/20211102213112_p_ci_templates_jobs_sast_iac_latest_weekly.yml
+++ b/config/metrics/counts_7d/20211102213112_p_ci_templates_jobs_sast_iac_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_iac_latest_we
description: Count of pipelines using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211102213417_p_ci_templates_implicit_jobs_sast_iac_latest_weekly.yml b/config/metrics/counts_7d/20211102213417_p_ci_templates_implicit_jobs_sast_iac_latest_weekly.yml
index 3a58cd033f2..9b71c66ca77 100644
--- a/config/metrics/counts_7d/20211102213417_p_ci_templates_implicit_jobs_sast_iac_latest_weekly.yml
+++ b/config/metrics/counts_7d/20211102213417_p_ci_templates_implicit_jobs_sast_iac_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_sast_iac_
description: Count of pipelines with implicit runs using the latest SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211104154352_i_code_review_widget_nothing_merge_click_new_file_weekly.yml b/config/metrics/counts_7d/20211104154352_i_code_review_widget_nothing_merge_click_new_file_weekly.yml
index 3a647c52f71..7e1e436142a 100644
--- a/config/metrics/counts_7d/20211104154352_i_code_review_widget_nothing_merge_click_new_file_weekly.yml
+++ b/config/metrics/counts_7d/20211104154352_i_code_review_widget_nothing_merge_click_new_file_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_widget_nothing_merge_clic
description: Count of users who click the create file button in the nothing to merge widget state
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211109114948_i_quickactions_add_contacts_weekly.yml b/config/metrics/counts_7d/20211109114948_i_quickactions_add_contacts_weekly.yml
index 356d969cea5..cfab4e79963 100644
--- a/config/metrics/counts_7d/20211109114948_i_quickactions_add_contacts_weekly.yml
+++ b/config/metrics/counts_7d/20211109114948_i_quickactions_add_contacts_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_add_contacts_weekly
description: Count of WAU using the `/add_contacts` quick action
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211109120245_i_quickactions_remove_contacts_weekly.yml b/config/metrics/counts_7d/20211109120245_i_quickactions_remove_contacts_weekly.yml
index 7a660ddffd2..81c0740dba6 100644
--- a/config/metrics/counts_7d/20211109120245_i_quickactions_remove_contacts_weekly.yml
+++ b/config/metrics/counts_7d/20211109120245_i_quickactions_remove_contacts_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_contacts_weekly
description: Count of WAU using the `/remove_contacts` quick action
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211111162058_i_code_review_post_merge_delete_branch_weekly.yml b/config/metrics/counts_7d/20211111162058_i_code_review_post_merge_delete_branch_weekly.yml
index f6cd1f6a86b..78a318cba53 100644
--- a/config/metrics/counts_7d/20211111162058_i_code_review_post_merge_delete_branch_weekly.yml
+++ b/config/metrics/counts_7d/20211111162058_i_code_review_post_merge_delete_branch_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_delete_branch_
description: Count of users who click the delete source branch button after merge
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211111162417_i_code_review_post_merge_click_revert_weekly.yml b/config/metrics/counts_7d/20211111162417_i_code_review_post_merge_click_revert_weekly.yml
index 70f968fcc0e..6a687646417 100644
--- a/config/metrics/counts_7d/20211111162417_i_code_review_post_merge_click_revert_weekly.yml
+++ b/config/metrics/counts_7d/20211111162417_i_code_review_post_merge_click_revert_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_click_revert_w
description: Count of users who click the revert button in the merge requet widget
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211112102440_i_code_review_post_merge_click_cherry_pick_weekly.yml b/config/metrics/counts_7d/20211112102440_i_code_review_post_merge_click_cherry_pick_weekly.yml
index 90428f31a7a..a6221b0a1dc 100644
--- a/config/metrics/counts_7d/20211112102440_i_code_review_post_merge_click_cherry_pick_weekly.yml
+++ b/config/metrics/counts_7d/20211112102440_i_code_review_post_merge_click_cherry_pick_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_click_cherry_p
description: Count of users who click the cherry pick button in the merge requet widget
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211112114327_i_code_review_post_merge_submit_revert_modal_weekly.yml b/config/metrics/counts_7d/20211112114327_i_code_review_post_merge_submit_revert_modal_weekly.yml
index ea7238e9913..4761f07cf17 100644
--- a/config/metrics/counts_7d/20211112114327_i_code_review_post_merge_submit_revert_modal_weekly.yml
+++ b/config/metrics/counts_7d/20211112114327_i_code_review_post_merge_submit_revert_modal_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_submit_revert_
description: Count of users who submit the post merge revert modal
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211112115138_i_code_review_post_merge_submit_cherry_pick_modal_weekly.yml b/config/metrics/counts_7d/20211112115138_i_code_review_post_merge_submit_cherry_pick_modal_weekly.yml
index ac8649eef80..344f60897bd 100644
--- a/config/metrics/counts_7d/20211112115138_i_code_review_post_merge_submit_cherry_pick_modal_weekly.yml
+++ b/config/metrics/counts_7d/20211112115138_i_code_review_post_merge_submit_cherry_pick_modal_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_post_merge_submit_cherry_
description: Count of users who submit the post merge revert modal
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml b/config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml
index e77af4df59a..ead9799711b 100644
--- a/config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml
+++ b/config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.analytics.p_analytics_ci_cd_pipelines_weekly
description: Count of unique visits to the project level CI CD Analytics pipelines tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211126090001_p_analytics_ci_cd_pipelines.yml b/config/metrics/counts_7d/20211126090001_p_analytics_ci_cd_pipelines.yml
index ec686425d7c..4afd72d630a 100644
--- a/config/metrics/counts_7d/20211126090001_p_analytics_ci_cd_pipelines.yml
+++ b/config/metrics/counts_7d/20211126090001_p_analytics_ci_cd_pipelines.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.p_analytics_ci_cd_pipelines
description: Count of unique visits to the project level CI CD Analytics pipelines tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211126090002_p_analytics_ci_cd_deployment_frequency.yml b/config/metrics/counts_7d/20211126090002_p_analytics_ci_cd_deployment_frequency.yml
index bee4b88889e..1f7be3ded22 100644
--- a/config/metrics/counts_7d/20211126090002_p_analytics_ci_cd_deployment_frequency.yml
+++ b/config/metrics/counts_7d/20211126090002_p_analytics_ci_cd_deployment_frequency.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.p_analytics_ci_cd_deployment_frequency
description: Count of unique visits to the project level CI CD Analytics deployment frequency tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211126090003_p_analytics_ci_cd_lead_time.yml b/config/metrics/counts_7d/20211126090003_p_analytics_ci_cd_lead_time.yml
index 3c1f6082049..4d74fb08f1b 100644
--- a/config/metrics/counts_7d/20211126090003_p_analytics_ci_cd_lead_time.yml
+++ b/config/metrics/counts_7d/20211126090003_p_analytics_ci_cd_lead_time.yml
@@ -4,7 +4,7 @@ key_path: analytics_unique_visits.p_analytics_ci_cd_lead_time
description: Count of unique visits to the project level CI CD Analytics lead time tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211126090829_p_analytics_ci_cd_deployment_frequency_weekly.yml b/config/metrics/counts_7d/20211126090829_p_analytics_ci_cd_deployment_frequency_weekly.yml
index d2181a95876..6826e082e79 100644
--- a/config/metrics/counts_7d/20211126090829_p_analytics_ci_cd_deployment_frequency_weekly.yml
+++ b/config/metrics/counts_7d/20211126090829_p_analytics_ci_cd_deployment_frequency_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.analytics.p_analytics_ci_cd_deployment_frequency_we
description: Count of unique visits to the project level CI CD Analytics deployment frequency tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211126091200_p_analytics_ci_cd_lead_time_weekly.yml b/config/metrics/counts_7d/20211126091200_p_analytics_ci_cd_lead_time_weekly.yml
index 8d11cc16fcc..ba1b01f2e9c 100644
--- a/config/metrics/counts_7d/20211126091200_p_analytics_ci_cd_lead_time_weekly.yml
+++ b/config/metrics/counts_7d/20211126091200_p_analytics_ci_cd_lead_time_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.analytics.p_analytics_ci_cd_lead_time_weekly
description: Count of unique visits to the project level CI CD Analytics lead time tab
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211126154206_users_expanding_testing_license_compliance_report_weekly.yml b/config/metrics/counts_7d/20211126154206_users_expanding_testing_license_compliance_report_weekly.yml
index ae251b65362..6677e5d3b56 100644
--- a/config/metrics/counts_7d/20211126154206_users_expanding_testing_license_compliance_report_weekly.yml
+++ b/config/metrics/counts_7d/20211126154206_users_expanding_testing_license_compliance_report_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_expanding_testing_license_compliance_
description: Count of expanding the license compliance widget
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211201154118_users_visiting_license_compliance_full_report_weekly.yml b/config/metrics/counts_7d/20211201154118_users_visiting_license_compliance_full_report_weekly.yml
index 96c2fb4ced9..fc5dceec67d 100644
--- a/config/metrics/counts_7d/20211201154118_users_visiting_license_compliance_full_report_weekly.yml
+++ b/config/metrics/counts_7d/20211201154118_users_visiting_license_compliance_full_report_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_visiting_testing_license_compliance_f
description: Count of visiting the license compliance full report
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211202094430_users_visiting_manage_license_compliance_weekly.yml b/config/metrics/counts_7d/20211202094430_users_visiting_manage_license_compliance_weekly.yml
index 831ec2509b1..07375b2d712 100644
--- a/config/metrics/counts_7d/20211202094430_users_visiting_manage_license_compliance_weekly.yml
+++ b/config/metrics/counts_7d/20211202094430_users_visiting_manage_license_compliance_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_visiting_testing_manage_license_compl
description: Count of visiting the manage license compliance page
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20211216084934_users_clicking_license_testing_visiting_external_website_weekly.yml b/config/metrics/counts_7d/20211216084934_users_clicking_license_testing_visiting_external_website_weekly.yml
index cfdbc345ef9..3cc1e18c738 100644
--- a/config/metrics/counts_7d/20211216084934_users_clicking_license_testing_visiting_external_website_weekly.yml
+++ b/config/metrics/counts_7d/20211216084934_users_clicking_license_testing_visiting_external_website_weekly.yml
@@ -4,7 +4,7 @@ key_path: redis_hll_counters.testing.users_clicking_license_testing_visiting_ext
description: Count of users clicking licence to visit external information website
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: dependency_scanning
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220121140634_user_jetbrains_api_request_weekly.yml b/config/metrics/counts_7d/20220121140634_user_jetbrains_api_request_weekly.yml
index 40e7b3ba04f..b98c4aefe7b 100644
--- a/config/metrics/counts_7d/20220121140634_user_jetbrains_api_request_weekly.yml
+++ b/config/metrics/counts_7d/20220121140634_user_jetbrains_api_request_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_jetbrains_api_reques
description: Count of unique users per month who use GitLab plugin for JetBrains
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: editor_extension
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml b/config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml
index 2bd6c25281d..3e47fca1265 100644
--- a/config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml
+++ b/config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_attention_weekly
description: Count of WAU using the `/attention` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml b/config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml
index 38f9841f447..315cac183d1 100644
--- a/config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml
+++ b/config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.quickactions.i_quickactions_remove_attention_weekly
description: Count of WAU using the `/remove_attention` quick action
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220202160120_ci_users_executing_deployment_job_weekly.yml b/config/metrics/counts_7d/20220202160120_ci_users_executing_deployment_job_weekly.yml
index ca5f67e0ac5..e3b9e3623a5 100644
--- a/config/metrics/counts_7d/20220202160120_ci_users_executing_deployment_job_weekly.yml
+++ b/config/metrics/counts_7d/20220202160120_ci_users_executing_deployment_job_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_users.ci_users_executing_deployment_job_weekly
description: Weekly counts of times users have executed deployment jobs
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220216204730_users_updating_work_item_title_weekly.yml b/config/metrics/counts_7d/20220216204730_users_updating_work_item_title_weekly.yml
index 92fb6dbd03d..e533d2a309e 100644
--- a/config/metrics/counts_7d/20220216204730_users_updating_work_item_title_weekly.yml
+++ b/config/metrics/counts_7d/20220216204730_users_updating_work_item_title_weekly.yml
@@ -4,7 +4,7 @@ description: Unique users updating a work item's title
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml b/config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml
index 0c7e18ec458..fbc8e23b018 100644
--- a/config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml
+++ b/config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml
@@ -4,7 +4,7 @@ description: Unique users creating work items
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_7d/20220222215851_xmau_plan.yml b/config/metrics/counts_7d/20220222215851_xmau_plan.yml
index cc393d6b0a5..170b1c595de 100644
--- a/config/metrics/counts_7d/20220222215851_xmau_plan.yml
+++ b/config/metrics/counts_7d/20220222215851_xmau_plan.yml
@@ -4,7 +4,7 @@ description: Unique users interacting with Plan features
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_7d/20220222215852_xmau_project_management.yml b/config/metrics/counts_7d/20220222215852_xmau_project_management.yml
index 40eaf21889e..061ee13722b 100644
--- a/config/metrics/counts_7d/20220222215852_xmau_project_management.yml
+++ b/config/metrics/counts_7d/20220222215852_xmau_project_management.yml
@@ -4,7 +4,7 @@ description: Unique users interacting with Project Management features
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_7d/20220222215855_users_work_items.yml b/config/metrics/counts_7d/20220222215855_users_work_items.yml
index fe77e885449..b749a7c9430 100644
--- a/config/metrics/counts_7d/20220222215855_users_work_items.yml
+++ b/config/metrics/counts_7d/20220222215855_users_work_items.yml
@@ -4,7 +4,7 @@ description: Unique users interacting with work items
product_category: team planning
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
value_type: number
status: active
milestone: '14.9'
diff --git a/config/metrics/counts_7d/20220308233959_p_ci_templates_jobs_sast_latest_weekly.yml b/config/metrics/counts_7d/20220308233959_p_ci_templates_jobs_sast_latest_weekly.yml
index 1b65c7b1c84..da30c60b823 100644
--- a/config/metrics/counts_7d/20220308233959_p_ci_templates_jobs_sast_latest_weekly.yml
+++ b/config/metrics/counts_7d/20220308233959_p_ci_templates_jobs_sast_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_latest_weekly
description: Weekly counts for SAST CI Latest template (Jobs folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220309001635_p_ci_templates_jobs_secret_detection_latest_weekly.yml b/config/metrics/counts_7d/20220309001635_p_ci_templates_jobs_secret_detection_latest_weekly.yml
index 64760e33d59..f60936e8492 100644
--- a/config/metrics/counts_7d/20220309001635_p_ci_templates_jobs_secret_detection_latest_weekly.yml
+++ b/config/metrics/counts_7d/20220309001635_p_ci_templates_jobs_secret_detection_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_secret_detection_l
description: Weekly counts for Secret Detection CI Latest template (Jobs folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220310213315_p_ci_templates_implicit_jobs_secret_detection_latest_weekly.yml b/config/metrics/counts_7d/20220310213315_p_ci_templates_implicit_jobs_secret_detection_latest_weekly.yml
index 13d03d6c833..85e32e385fb 100644
--- a/config/metrics/counts_7d/20220310213315_p_ci_templates_implicit_jobs_secret_detection_latest_weekly.yml
+++ b/config/metrics/counts_7d/20220310213315_p_ci_templates_implicit_jobs_secret_detection_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_secret_de
description: Weekly counts for implicit use of Secret Detection CI Latest template (Jobs folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220310213743_p_ci_templates_implicit_jobs_sast_latest_weekly.yml b/config/metrics/counts_7d/20220310213743_p_ci_templates_implicit_jobs_sast_latest_weekly.yml
index 74eb8fffa9a..61d3ceff055 100644
--- a/config/metrics/counts_7d/20220310213743_p_ci_templates_implicit_jobs_sast_latest_weekly.yml
+++ b/config/metrics/counts_7d/20220310213743_p_ci_templates_implicit_jobs_sast_latest_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_sast_late
description: Weekly counts for implicit use of SAST CI Latest template (Jobs folder)
product_section: sec
product_stage: secure
-product_group: group::static analysis
+product_group: static_analysis
product_category: static_application_security_testing
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml b/config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml
index 333e84873b4..272bd61d336 100644
--- a/config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml
+++ b/config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.code_review.i_code_review_user_gitlab_cli_api_reque
description: Count of unique users per week who use the GitLab CLI
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: editor_extension
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml b/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml
index 9bba92b5162..55f2b54a373 100644
--- a/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml
+++ b/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_iac_weekly
description: Count of pipelines using the stable SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml b/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml
index c28dfd94cad..0ce53e6433e 100644
--- a/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml
+++ b/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_iac_weekl
description: Count of pipelines using the stable SAST IaC template
product_section: sec
product_stage: secure
-product_group: "group::static analysis"
+product_group: "static_analysis"
product_category: SAST
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml
index 33e5c7f25f9..d67dc70f013 100644
--- a/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml
@@ -4,7 +4,7 @@ name: count_unique_users_interacting_with_timeline_events_weekly
description: Counts unique users for timeline events create, edit and delete events per month
product_section: ops
product_stage: monitor
-product_group: group::respond
+product_group: respond
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml b/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml
new file mode 100644
index 00000000000..681fed23d11
--- /dev/null
+++ b/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_ci_cd_time_to_restore_service_weekly
+name: p_analytics_ci_cd_time_to_restore_service_weekly
+description: Count of unique visits to the project level CI/CD Analytics Time to restore service tab
+product_section: dev
+product_stage: manage
+product_group: optimize
+product_category:
+value_type: number
+status: active
+milestone: "15.2"
+introduced_by_url:
+time_frame: 7d
+data_source: redis_hll
+data_category: operational
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- premium
+- ultimate
+options:
+ events:
+ - p_analytics_ci_cd_time_to_restore_service
diff --git a/config/metrics/counts_7d/20220706175117_ci_users_executing_verify_job_weekly.yml b/config/metrics/counts_7d/20220706175117_ci_users_executing_verify_job_weekly.yml
new file mode 100644
index 00000000000..032ecc838b4
--- /dev/null
+++ b/config/metrics/counts_7d/20220706175117_ci_users_executing_verify_job_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_users.ci_users_executing_verify_environment_job_weekly
+description: Weekly counts of times users have executed verify jobs
+product_section: ops
+product_stage: release
+product_group: release
+product_category: continuous_delivery
+value_type: number
+status: active
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91925
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+options:
+ events:
+ - ci_users_executing_verify_environment_job
+distribution:
+ - ce
+ - ee
+tier:
+ - free
+ - premium
+ - ultimate
diff --git a/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml b/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml
new file mode 100644
index 00000000000..2a4889cc3ac
--- /dev/null
+++ b/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_ci_cd_change_failure_rate_weekly
+name: p_analytics_ci_cd_change_failure_rate_weekly
+description: Count of unique visits to the project level CI/CD Analytics Change failure rate tab
+product_section: dev
+product_stage: manage
+product_group: optimize
+product_category:
+value_type: number
+status: active
+milestone: "15.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91726
+time_frame: 7d
+data_source: redis_hll
+data_category: operational
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- premium
+- ultimate
+options:
+ events:
+ - p_analytics_ci_cd_change_failure_rate
diff --git a/config/metrics/counts_all/20210201124934_deployments.yml b/config/metrics/counts_all/20210201124934_deployments.yml
index edf11470cb3..b779e3f5955 100644
--- a/config/metrics/counts_all/20210201124934_deployments.yml
+++ b/config/metrics/counts_all/20210201124934_deployments.yml
@@ -4,7 +4,7 @@ key_path: counts.deployments
description: Total deployments count
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
value_type: number
status: active
milestone: "8.12"
diff --git a/config/metrics/counts_all/20210204124930_servers.yml b/config/metrics/counts_all/20210204124930_servers.yml
index 16e7504db9c..bd756b8bcef 100644
--- a/config/metrics/counts_all/20210204124930_servers.yml
+++ b/config/metrics/counts_all/20210204124930_servers.yml
@@ -4,7 +4,7 @@ key_path: gitaly.servers
description: Total Gitalty Servers
product_section: dev
product_stage: create
-product_group: group::gitaly
+product_group: gitaly
product_category: gitaly
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210204124932_clusters.yml b/config/metrics/counts_all/20210204124932_clusters.yml
index 963726e3a14..6f7524c8765 100644
--- a/config/metrics/counts_all/20210204124932_clusters.yml
+++ b/config/metrics/counts_all/20210204124932_clusters.yml
@@ -4,7 +4,7 @@ key_path: gitaly.clusters
description: Total GitLab Managed clusters both enabled and disabled
product_section: dev
product_stage: create
-product_group: group::gitaly
+product_group: gitaly
product_category: gitaly
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
index 324ceb8ec84..d7b16d01d8b 100644
--- a/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
+++ b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
@@ -4,7 +4,7 @@ key_path: counts.cycle_analytics_views
description: Total visits to VSA (both group- and project-level) all time
product_section: dev
product_stage: manage
-product_group: group::optimize
+product_group: optimize
product_category:
value_type: number
status: active
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 4957376bb26..e0f5b6d986d 100644
--- a/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
+++ b/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_with_prometheus_alerts
description: Projects with Prometheus alerting enabled
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: removed
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 e228a852d5d..b824d0a5467 100644
--- a/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
+++ b/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
@@ -4,7 +4,7 @@ key_path: counts.pod_logs_usages_total
description: Count the total number of log views
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: logging
value_type: number
status: removed
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 6c96cc69601..24d6586559a 100644
--- a/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
@@ -4,7 +4,7 @@ key_path: counts.service_desk_enabled_projects
description: Count of service desk enabled projects
product_section: dev
product_stage: plan
-product_group: group::certify
+product_group: certify
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175026_service_desk_issues.yml b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
index 139f8716978..f0045c46d56 100644
--- a/config/metrics/counts_all/20210216175026_service_desk_issues.yml
+++ b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
@@ -4,7 +4,7 @@ key_path: counts.service_desk_issues
description: Count of service desk issues
product_section: dev
product_stage: plan
-product_group: group::certify
+product_group: certify
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175037_suggestions.yml b/config/metrics/counts_all/20210216175037_suggestions.yml
index a1ba75cd51a..0cb2d37cbf3 100644
--- a/config/metrics/counts_all/20210216175037_suggestions.yml
+++ b/config/metrics/counts_all/20210216175037_suggestions.yml
@@ -4,7 +4,7 @@ key_path: counts.suggestions
description: Count of all comments that contain suggested changes
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175039_merge_requests.yml b/config/metrics/counts_all/20210216175039_merge_requests.yml
index e7d46f138b5..fb465ace311 100644
--- a/config/metrics/counts_all/20210216175039_merge_requests.yml
+++ b/config/metrics/counts_all/20210216175039_merge_requests.yml
@@ -4,7 +4,7 @@ key_path: counts.merge_requests
description: Count of the number of merge requests
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175041_merge_request_comment.yml b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
index 2e14d7f87ab..2c060e57c49 100644
--- a/config/metrics/counts_all/20210216175041_merge_request_comment.yml
+++ b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
@@ -4,7 +4,7 @@ key_path: counts.merge_request_comment
description: Count of the number of merge request comments
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175043_merge_request_create.yml b/config/metrics/counts_all/20210216175043_merge_request_create.yml
index 4986a4f3f6e..3c2eb359f93 100644
--- a/config/metrics/counts_all/20210216175043_merge_request_create.yml
+++ b/config/metrics/counts_all/20210216175043_merge_request_create.yml
@@ -4,7 +4,7 @@ key_path: counts.merge_request_create
description: Count of the number of merge requests created
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175045_merge_requests.yml b/config/metrics/counts_all/20210216175045_merge_requests.yml
index 2871c70abaa..5cf80a4b438 100644
--- a/config/metrics/counts_all/20210216175045_merge_requests.yml
+++ b/config/metrics/counts_all/20210216175045_merge_requests.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.create.merge_requests
description: Count of the number of users creating merge requests
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175053_suggestions.yml b/config/metrics/counts_all/20210216175053_suggestions.yml
index 774f355b02c..594832cae4f 100644
--- a/config/metrics/counts_all/20210216175053_suggestions.yml
+++ b/config/metrics/counts_all/20210216175053_suggestions.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.create.suggestions
description: Count of unique users who create suggestions in merge request comments
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
index 85870f728bb..0ab6b1178da 100644
--- a/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
+++ b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
@@ -5,7 +5,7 @@ description: Projects with Auto DevOps template enabled (excluding implicit Auto
enabled and Auto DevOps template includes)
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: auto_devops
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
index 19089c21eb4..b4f194b147d 100644
--- a/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
+++ b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
@@ -4,7 +4,7 @@ key_path: counts.auto_devops_disabled
description: Projects with Auto DevOps template disabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: auto_devops
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175232_clusters.yml b/config/metrics/counts_all/20210216175232_clusters.yml
index e642c22a735..81714863df8 100644
--- a/config/metrics/counts_all/20210216175232_clusters.yml
+++ b/config/metrics/counts_all/20210216175232_clusters.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters
description: Total GitLab Managed clusters both enabled and disabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175234_clusters_enabled.yml b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
index cc230c6a201..35f4706cfa5 100644
--- a/config/metrics/counts_all/20210216175234_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_enabled
description: Number of Kubernetes clusters attached to GitLab currently enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
index f12ec1f7301..c7b45d0cdb6 100644
--- a/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: counts.project_clusters_enabled
description: Total GitLab Managed clusters attached to projects
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
index 2fa75d87214..1e660cc2623 100644
--- a/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: counts.group_clusters_enabled
description: Total GitLab Managed clusters attached to groups
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
index 201d1f72b8d..fb335e9811c 100644
--- a/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: counts.instance_clusters_enabled
description: Total GitLab Managed clusters attached to the instance
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175242_clusters_disabled.yml b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
index 00fdee27e2c..67e21b57030 100644
--- a/config/metrics/counts_all/20210216175242_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_disabled
description: Number of Kubernetes clusters attached to GitLab currently disabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
index 21d704b5090..fc22e4deb5d 100644
--- a/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: counts.project_clusters_disabled
description: Total GitLab Managed disabled clusters previously attached to projects
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
index b31c129496c..154926ce1cb 100644
--- a/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: counts.group_clusters_disabled
description: Total GitLab Managed disabled clusters previously attached to groups
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
index e60c7a13fcf..bd91e116f6b 100644
--- a/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: counts.instance_clusters_disabled
description: Total GitLab Managed disabled clusters previously attached to the instance
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
index 343275db3f7..f3ba6bb42dc 100644
--- a/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
+++ b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_platforms_eks
description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
index 4f7c85953ed..7c0df4a79fb 100644
--- a/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
+++ b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_platforms_gke
description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
index c0cce763b21..b56a1e17984 100644
--- a/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
+++ b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_platforms_user
description: Total GitLab Managed clusters that are user provisioned
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
index e772f669513..4d727e9c7d7 100644
--- a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
+++ b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_helm
description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
index 1e31c28f543..e59c89952aa 100644
--- a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
+++ b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_ingress
description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
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 bc16040f143..b42537dab1c 100644
--- a/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_cert_managers
description: Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
index 2856a0e25ac..2ffd21a39a4 100644
--- a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
+++ b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_crossplane
description: Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
index 961c9adfdb7..0735993d627 100644
--- a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_prometheus
description: Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
index 33f8d045d2b..c3a30bf8452 100644
--- a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
+++ b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_runner
description: Total GitLab Managed clusters with GitLab Managed App:Runner installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
index e5a80ca6385..08f543609b5 100644
--- a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
+++ b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_knative
description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
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 4d5dbcd198f..7a303ed2f1e 100644
--- a/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
+++ b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_elastic_stack
description: Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
index 85d62985fa8..d4870126fb0 100644
--- a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
+++ b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_jupyter
description: Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
index 33a8a53a8ab..415c9fc7811 100644
--- a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
+++ b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_applications_cilium
description: Total GitLab Managed clusters with GitLab Managed App:Cilium installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175314_clusters_management_project.yml b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
index fb8421d4bf2..b0fa6e65e07 100644
--- a/config/metrics/counts_all/20210216175314_clusters_management_project.yml
+++ b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_management_project
description: Total GitLab Managed clusters with defined cluster management project
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175316_kubernetes_agents.yml b/config/metrics/counts_all/20210216175316_kubernetes_agents.yml
index f126415a78f..7c97d38a300 100644
--- a/config/metrics/counts_all/20210216175316_kubernetes_agents.yml
+++ b/config/metrics/counts_all/20210216175316_kubernetes_agents.yml
@@ -4,7 +4,7 @@ key_path: counts.kubernetes_agents
description: Count of Kubernetes registered agents
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml b/config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml
index 6cbdb1679a5..c96ab785fbb 100644
--- a/config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml
+++ b/config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml
@@ -4,7 +4,7 @@ key_path: counts.kubernetes_agents_with_token
description: Count of Kubernetes agents with at least one token
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
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 1008e17211d..490d267a856 100644
--- a/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
+++ b/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_with_terraform_reports
description: Count of projects with Terraform MR reports
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 14621390630..27c1087a3a7 100644
--- a/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
+++ b/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_with_terraform_states
description: Count of projects with GitLab Managed Terraform State
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175324_terraform_reports.yml b/config/metrics/counts_all/20210216175324_terraform_reports.yml
index 69e21a7d63e..eed669c8583 100644
--- a/config/metrics/counts_all/20210216175324_terraform_reports.yml
+++ b/config/metrics/counts_all/20210216175324_terraform_reports.yml
@@ -4,7 +4,7 @@ key_path: counts.terraform_reports
description: Count of Terraform MR reports generated
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175326_terraform_states.yml b/config/metrics/counts_all/20210216175326_terraform_states.yml
index 06b6e6d7928..3540b0bf02a 100644
--- a/config/metrics/counts_all/20210216175326_terraform_states.yml
+++ b/config/metrics/counts_all/20210216175326_terraform_states.yml
@@ -4,7 +4,7 @@ key_path: counts.terraform_states
description: Count of GitLab Managed Terraform States
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 f97816e18c1..43731d35061 100644
--- a/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
@@ -4,7 +4,7 @@ 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
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
index 28c58e11854..d044a7bfbe2 100644
--- a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
+++ b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_applications_helm
description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
index b93198b92a4..dd80a467825 100644
--- a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
+++ b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_applications_ingress
description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
index 735f3ea8e04..d0bd9329b6f 100644
--- a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
+++ b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_applications_knative
description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175337_clusters_management_project.yml b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
index 8ed91a5e0f0..958760f57e6 100644
--- a/config/metrics/counts_all/20210216175337_clusters_management_project.yml
+++ b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_management_project
description: Total GitLab Managed clusters with defined cluster management project
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175339_clusters_disabled.yml b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
index 5490df2a311..63fd19ddff2 100644
--- a/config/metrics/counts_all/20210216175339_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_disabled
description: Total GitLab Managed disabled clusters
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175341_clusters_enabled.yml b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
index a5b64e3490b..6e8761ae414 100644
--- a/config/metrics/counts_all/20210216175341_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_enabled
description: Total GitLab Managed clusters currently enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
index 3be2ae9259b..02730ce5bc2 100644
--- a/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
+++ b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_platforms_gke
description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
index 898db74ceed..ad7c5dd99c9 100644
--- a/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
+++ b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_platforms_eks
description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
index d6fe1d162c4..fc7710bc490 100644
--- a/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
+++ b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.clusters_platforms_user
description: Total GitLab Managed clusters that are user provisioned
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
index 4c8c3ccac9d..6a621914e27 100644
--- a/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.instance_clusters_disabled
description: Total GitLab Managed disabled clusters attached to the instance
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
index 4f065bb0506..5f81b41a670 100644
--- a/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.instance_clusters_enabled
description: Total GitLab Managed enabled clusters attached to the instance
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
index 902fd31a5f3..a16a70d822e 100644
--- a/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.group_clusters_disabled
description: Total GitLab Managed disabled clusters attached to groups
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
index 197f0a7ea1b..c036e3ea7b0 100644
--- a/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.group_clusters_enabled
description: Total GitLab Managed enabled clusters attached to groups
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
index cd406c21eed..a36f8deebfc 100644
--- a/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.project_clusters_disabled
description: Total GitLab Managed disabled clusters attached to projects
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
index e106a31c4b6..1a189b8d0da 100644
--- a/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.project_clusters_enabled
description: Total GitLab Managed enabled clusters attached to projects
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
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 71a38117826..b443721868c 100644
--- a/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
+++ b/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.configure.projects_with_prometheus_alerts
description: Projects with Prometheus alerting enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
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 ef8bb634b85..fb8c3b61355 100644
--- a/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
+++ b/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
@@ -5,7 +5,7 @@ description: Cumulative count of packets processed by ModSecurity since Usage Pi
was last reported
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: web_firewall
value_type: number
status: removed
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 067ac95782f..ba3575f8b0b 100644
--- a/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
+++ b/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
@@ -5,7 +5,7 @@ description: Cumulative count of packets identified as anomalous by ModSecurity
Usage Ping was last reported
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: web_firewall
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
index 64d7a9434be..92774a9aa54 100644
--- a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
+++ b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
@@ -5,7 +5,7 @@ description: Cumulative count of packets forwarded by Cilium (Container Network
since Usage Ping was last reported
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: container_network_security
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175448_network_policy_drops.yml b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
index d3a874253f9..10b6a79205b 100644
--- a/config/metrics/counts_all/20210216175448_network_policy_drops.yml
+++ b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
@@ -5,7 +5,7 @@ description: Cumulative count of packets dropped by Cilium (Container Network Se
since Usage Ping was last reported
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: container_network_security
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
index 55dc3b6ca3b..3255aa90e63 100644
--- a/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
+++ b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
@@ -4,7 +4,7 @@ key_path: counts.ingress_modsecurity_logging
description: Whether or not ModSecurity is set to logging mode
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: web_firewall
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
index c21b1d24885..4589c483ae2 100644
--- a/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
+++ b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
@@ -4,7 +4,7 @@ key_path: counts.ingress_modsecurity_blocking
description: Whether or not ModSecurity is set to blocking mode
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: web_firewall
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
index a4f4910cf76..9213bbcefb7 100644
--- a/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
+++ b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
@@ -4,7 +4,7 @@ key_path: counts.ingress_modsecurity_disabled
description: Whether or not ModSecurity is disabled within Ingress
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: web_firewall
value_type: number
status: removed
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 4a3717786be..659a3b66a8b 100644
--- a/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
+++ b/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
@@ -4,7 +4,7 @@ key_path: counts.ingress_modsecurity_not_installed
description: Whether or not ModSecurity has not been installed into the cluster
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: web_firewall
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175510_ci_builds.yml b/config/metrics/counts_all/20210216175510_ci_builds.yml
index d4d566eef00..ee7f91cd1e8 100644
--- a/config/metrics/counts_all/20210216175510_ci_builds.yml
+++ b/config/metrics/counts_all/20210216175510_ci_builds.yml
@@ -4,7 +4,7 @@ key_path: counts.ci_builds
description: Unique builds in project
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
index fbe697fc77b..44a384a8ff5 100644
--- a/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
+++ b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
@@ -4,7 +4,7 @@ key_path: counts.ci_internal_pipelines
description: Total pipelines in GitLab repositories
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
index b27115aa904..03958d43d99 100644
--- a/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
+++ b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
@@ -4,7 +4,7 @@ key_path: counts.ci_external_pipelines
description: Total pipelines in external repositories
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 7dc2a7a756b..1b4c8cfc73b 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
@@ -4,7 +4,7 @@ key_path: counts.ci_pipeline_config_auto_devops
description: Total pipelines from an Auto DevOps template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: auto_devops
value_type: number
status: active
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 2d904295d18..12ec851fef7 100644
--- a/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
+++ b/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
@@ -4,7 +4,7 @@ key_path: counts.ci_pipeline_config_repository
description: Total Pipelines from CI files in repository
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175520_ci_runners.yml b/config/metrics/counts_all/20210216175520_ci_runners.yml
index b3fa3f2678b..f3f13553663 100644
--- a/config/metrics/counts_all/20210216175520_ci_runners.yml
+++ b/config/metrics/counts_all/20210216175520_ci_runners.yml
@@ -4,7 +4,7 @@ key_path: counts.ci_runners
description: Total configured Runners of all types
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175521_ci_triggers.yml b/config/metrics/counts_all/20210216175521_ci_triggers.yml
index 7b8f54f0e25..14a305c5c4d 100644
--- a/config/metrics/counts_all/20210216175521_ci_triggers.yml
+++ b/config/metrics/counts_all/20210216175521_ci_triggers.yml
@@ -4,7 +4,7 @@ key_path: counts.ci_triggers
description: Total configured Triggers in project
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
index 7917c26b8f9..a498f4d0e6f 100644
--- a/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
@@ -4,7 +4,7 @@ key_path: counts.ci_pipeline_schedules
description: Pipeline schedules in GitLab
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175525_ci_builds.yml b/config/metrics/counts_all/20210216175525_ci_builds.yml
index cfa86761e7e..37ffe117ede 100644
--- a/config/metrics/counts_all/20210216175525_ci_builds.yml
+++ b/config/metrics/counts_all/20210216175525_ci_builds.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_builds
description: Unique count of builds in project
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
index 531f402ce0a..d393fd3e924 100644
--- a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
+++ b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_external_pipelines
description: Total pipelines in external repositories
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
index b58e49b2603..0114bf5a9f2 100644
--- a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
+++ b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_internal_pipelines
description: Total pipelines in GitLab repositories
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 982fe4799e8..abdb32a404f 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_pipeline_config_auto_devops
description: Total pipelines from an Auto DevOps template
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: auto_devops
value_type: number
status: active
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 c28daf950dd..e43db505fb3 100644
--- a/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
+++ b/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_pipeline_config_repository
description: Total count of unique users creating pipelines from CI files in the repository
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
index 82084178273..99e59274094 100644
--- a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_pipeline_schedules
description: Pipeline schedules in GitLab
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175537_ci_pipelines.yml b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
index 70b1c4138be..bfd90a78524 100644
--- a/config/metrics/counts_all/20210216175537_ci_pipelines.yml
+++ b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_pipelines
description: Distinct Users triggering Total pipelines
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175539_ci_triggers.yml b/config/metrics/counts_all/20210216175539_ci_triggers.yml
index 76824228a41..e28a8487c04 100644
--- a/config/metrics/counts_all/20210216175539_ci_triggers.yml
+++ b/config/metrics/counts_all/20210216175539_ci_triggers.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.ci_triggers
description: Total configured Triggers in project
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175621_web_hooks.yml b/config/metrics/counts_all/20210216175621_web_hooks.yml
index 326c1f08539..8614e7d4be6 100644
--- a/config/metrics/counts_all/20210216175621_web_hooks.yml
+++ b/config/metrics/counts_all/20210216175621_web_hooks.yml
@@ -4,7 +4,7 @@ key_path: counts.web_hooks
description: Count of web hooks
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175623_projects_asana_active.yml b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
index ca0ff0cdaf7..5b6e4ece343 100644
--- a/config/metrics/counts_all/20210216175623_projects_asana_active.yml
+++ b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_asana_active
description: Count of projects with active integrations for Asana
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175625_groups_asana_active.yml b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
index 3c1cd0378d0..87269b04570 100644
--- a/config/metrics/counts_all/20210216175625_groups_asana_active.yml
+++ b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_asana_active
description: Count of groups with active integrations for Asana
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175627_templates_asana_active.yml b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
index 3575f359f99..121409c5b7f 100644
--- a/config/metrics/counts_all/20210216175627_templates_asana_active.yml
+++ b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_asana_active
description: Count of active service templates for Asana
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175628_instances_asana_active.yml b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
index ab2a7ab1fd8..0a5c5fa1242 100644
--- a/config/metrics/counts_all/20210216175628_instances_asana_active.yml
+++ b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_asana_active
description: Count of active instance-level integrations for Asana
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 fd79b15fd68..be27b267acd 100644
--- a/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
+++ b/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_asana_active
description: Count of active projects inheriting integrations for Asana
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 5f8203fda4b..06bb348d677 100644
--- a/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
+++ b/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_asana_active
description: Count of active groups inheriting integrations for Asana
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175634_projects_assembla_active.yml b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
index 6d98db7ab3c..ad6ae1afc72 100644
--- a/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_assembla_active
description: Count of projects with active integrations for Assembla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175636_groups_assembla_active.yml b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
index e04faffc57f..a9a1ba26633 100644
--- a/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_assembla_active
description: Count of groups with active integrations for Assembla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
index d0f203e12c5..88d0c631218 100644
--- a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_assembla_active
description: Count of active service templates for Assembla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175640_instances_assembla_active.yml b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
index ee2ff3254cc..c76d508d58c 100644
--- a/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_assembla_active
description: Count of active instance-level integrations for Assembla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 c67864be199..72143e165cc 100644
--- a/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_assembla_active
description: Count of active projects inheriting integrations for Assembla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 4d220c45a70..d22ac41c550 100644
--- a/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_assembla_active
description: Count of active groups inheriting integrations for Assembla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
index 2f5fa08d325..3ad3dfb25a9 100644
--- a/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_bamboo_active
description: Count of projects with active integrations for Bamboo CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
index c136a7b1c41..e5543ca5766 100644
--- a/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_bamboo_active
description: Count of groups with active integrations for Bamboo CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
index 2e97c4bf1be..96947738ac7 100644
--- a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_bamboo_active
description: Count of active service templates for Bamboo CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
index d7a266eceb8..db0824288cd 100644
--- a/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_bamboo_active
description: Count of active instance-level integrations for Bamboo CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 69f8205923c..429540bdbd4 100644
--- a/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_bamboo_active
description: Count of active projects inheriting integrations for Bamboo CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 6c71d922567..19bc979b41e 100644
--- a/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_bamboo_active
description: Count of active groups inheriting integrations for Bamboo CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
index e4869d575a1..39caf54919d 100644
--- a/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_bugzilla_active
description: Count of projects with active integrations for Bugzilla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
index 433eb3f248c..2e3c1b5527f 100644
--- a/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_bugzilla_active
description: Count of groups with active integrations for Bugzilla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
index 6d26fbfb8dd..12866071b53 100644
--- a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_bugzilla_active
description: Count of active service templates for Bugzilla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
index 89aac1d7bb8..55f5f38555a 100644
--- a/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_bugzilla_active
description: Count of active instance-level integrations for Bugzilla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 c85fdde5970..be9231fcece 100644
--- a/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_bugzilla_active
description: Count of active projects inheriting integrations for Bugzilla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 9b9e49052c0..699b9019dfc 100644
--- a/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_bugzilla_active
description: Count of active groups inheriting integrations for Bugzilla
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
index cd99e26434e..741b7220458 100644
--- a/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_buildkite_active
description: Count of projects with active integrations for Buildkite
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
index fde47913509..1b334022e44 100644
--- a/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_buildkite_active
description: Count of groups with active integrations for Buildkite
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
index 8218ae10cae..d5a46ed861c 100644
--- a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_buildkite_active
description: Count of active service templates for Buildkite
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
index ee905ce7668..8d99d2c1f05 100644
--- a/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_buildkite_active
description: Count of active instance-level integrations for Buildkite
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 f91773fe320..fd54ff78891 100644
--- a/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_buildkite_active
description: Count of active projects inheriting integrations for Buildkite
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 fee0f23de9e..350f74c97b7 100644
--- a/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_buildkite_active
description: Count of active groups inheriting integrations for Buildkite
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175719_projects_campfire_active.yml b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
index b61c070c844..73d8a063f0b 100644
--- a/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_campfire_active
description: Count of projects with active integrations for Campfire
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175721_groups_campfire_active.yml b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
index 0bb65e4336a..c4879e4fd91 100644
--- a/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_campfire_active
description: Count of groups with active integrations for Campfire
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
index 2e8b09e4997..b5b8b9905ca 100644
--- a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_campfire_active
description: Count of active service templates for Campfire
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175725_instances_campfire_active.yml b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
index f5082d71885..88a013fff2f 100644
--- a/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_campfire_active
description: Count of active instance-level integrations for Campfire
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 11f7ba2bcc9..51150db3bdd 100644
--- a/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_campfire_active
description: Count of active projects inheriting integrations for Campfire
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 8a4585d6d6e..f081a57eff4 100644
--- a/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_campfire_active
description: Count of active groups inheriting integrations for Campfire
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175731_projects_confluence_active.yml b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
index edab23f9eb5..c361af80c75 100644
--- a/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_confluence_active
description: Count of projects with active integrations for Confluence
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175733_groups_confluence_active.yml b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
index 818be9e61bc..8a9d3e4aa2b 100644
--- a/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_confluence_active
description: Count of groups with active integrations for Confluence
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
index 2287415e83c..5b09f81d9f7 100644
--- a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_confluence_active
description: Count of active service templates for Confluence
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175736_instances_confluence_active.yml b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
index 83da2211379..f8df0b86ffd 100644
--- a/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_confluence_active
description: Count of active instance-level integrations for Confluence
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 104ee9b8afa..c59ba1dd8f8 100644
--- a/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_confluence_active
description: Count of active projects inheriting integrations for Confluence
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 855f298d716..2242a04f332 100644
--- a/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_confluence_active
description: Count of active groups inheriting integrations for Confluence
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 f6125e01db2..a727e6fedb6 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
@@ -4,7 +4,7 @@ key_path: counts.projects_custom_issue_tracker_active
description: Count of projects with active integrations for a Custom Issue Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 78078808ced..4c63579d92e 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
@@ -4,7 +4,7 @@ key_path: counts.groups_custom_issue_tracker_active
description: Count of groups with active integrations for a Custom Issue Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 343c4c887aa..b1f0c7955ff 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
@@ -4,7 +4,7 @@ key_path: counts.templates_custom_issue_tracker_active
description: Count of active service templates for a Custom Issue Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 c63b95a30fa..a87c20b1e8b 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
@@ -4,7 +4,7 @@ key_path: counts.instances_custom_issue_tracker_active
description: Count of active instance-level integrations for a Custom Issue Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 b25687486b8..1ef220f5e4f 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_custom_issue_tracker_active
description: Count of active projects inheriting integrations for a Custom Issue Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 5ec00059577..0ff7a037288 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_custom_issue_tracker_active
description: Count of active groups inheriting integrations for a Custom Issue Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175753_projects_discord_active.yml b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
index 7337be70d10..9b4eecbd372 100644
--- a/config/metrics/counts_all/20210216175753_projects_discord_active.yml
+++ b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_discord_active
description: Count of projects with active integrations for Discord
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175755_groups_discord_active.yml b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
index f9b38fee8fa..7ac463d87e3 100644
--- a/config/metrics/counts_all/20210216175755_groups_discord_active.yml
+++ b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_discord_active
description: Count of groups with active integrations for Discord
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175756_templates_discord_active.yml b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
index 9f057665e3a..4b913f35acd 100644
--- a/config/metrics/counts_all/20210216175756_templates_discord_active.yml
+++ b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_discord_active
description: Count of active service templates for Discord
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175758_instances_discord_active.yml b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
index 9eaaa0763cd..5d790f5d6df 100644
--- a/config/metrics/counts_all/20210216175758_instances_discord_active.yml
+++ b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_discord_active
description: Count of active instance-level integrations for Discord
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 bfc703c42a9..85634cb58b2 100644
--- a/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
+++ b/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_discord_active
description: Count of active projects inheriting integrations for Discord
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 fe0e87708e6..74f1c4a32f5 100644
--- a/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
+++ b/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_discord_active
description: Count of active groups inheriting integrations for Discord
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 2315bf3d9e4..005d9f65a33 100644
--- a/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_drone_ci_active
description: Count of projects with active integrations for Drone CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 acb551bab24..23b4fab18b3 100644
--- a/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_drone_ci_active
description: Count of groups with active integrations for Drone CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 edec715a037..e3422fb6193 100644
--- a/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_drone_ci_active
description: Count of active service templates for Drone CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 d20dd22b65f..a47163d7540 100644
--- a/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_drone_ci_active
description: Count of active instance-level integrations for Drone CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 2e5f7446e19..ee862f15d30 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_drone_ci_active
description: Count of active projects inheriting integrations for Drone CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 0ff92225b8c..aafc802b87c 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_drone_ci_active
description: Count of active groups inheriting integrations for Drone CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 4b81186a6f2..1ba9979c98a 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
@@ -4,7 +4,7 @@ key_path: counts.projects_emails_on_push_active
description: Count of projects with active integrations for Emails on Push
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 dc298ba5974..6049a9126a7 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
@@ -4,7 +4,7 @@ key_path: counts.groups_emails_on_push_active
description: Count of groups with active integrations for Emails on Push
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 057e3b3056b..33e588ce60e 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
@@ -4,7 +4,7 @@ key_path: counts.templates_emails_on_push_active
description: Count of active service templates for Emails on Push
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 d37c992ebf4..40ab3459baf 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
@@ -4,7 +4,7 @@ key_path: counts.instances_emails_on_push_active
description: Count of active instance-level integrations for Emails on Push
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 b86e285c986..5df16d4bcaf 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_emails_on_push_active
description: Count of active projects inheriting integrations for Emails on Push
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 0d15b246455..c478fc02745 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_emails_on_push_active
description: Count of active groups inheriting integrations for Emails on Push
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 3754c837376..fc99b7a20cc 100644
--- a/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_external_wiki_active
description: Count of projects with active integrations for External Wiki
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 011a185439a..d154a4ec723 100644
--- a/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_external_wiki_active
description: Count of groups with active integrations for External Wiki
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 31a270395fb..522315e40f6 100644
--- a/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_external_wiki_active
description: Count of active service templates for External Wiki
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 f587b145229..9d5e41f4302 100644
--- a/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_external_wiki_active
description: Count of active instance-level integrations for External Wiki
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 2662f6299da..166d7f1734b 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_external_wiki_active
description: Count of active projects inheriting integrations for External Wiki
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 f0bb398258f..c233df8e8ff 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_external_wiki_active
description: Count of active groups inheriting integrations for External Wiki
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
index 24f36849e59..0ca23369618 100644
--- a/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_flowdock_active
description: Count of projects with active integrations for Flowdock
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
index 91c41908e5e..878a6b1615a 100644
--- a/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_flowdock_active
description: Count of groups with active integrations for Flowdock
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
index 74d085a4447..19bd891b300 100644
--- a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_flowdock_active
description: Count of active service templates for Flowdock
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
index 0da1700a699..2b58b35d466 100644
--- a/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_flowdock_active
description: Count of active instance-level integrations for Flowdock
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 e930d8642fb..88425a3aaff 100644
--- a/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_flowdock_active
description: Count of active projects inheriting integrations for Flowdock
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 1d6d4eac8b0..8c8150ec316 100644
--- a/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_flowdock_active
description: Count of active groups inheriting integrations for Flowdock
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 e5ae5159d47..bdb36ce40a4 100644
--- a/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_hangouts_chat_active
description: Count of projects with active integrations for Hangouts Chat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 a16d9ceed31..ce776453c04 100644
--- a/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_hangouts_chat_active
description: Count of groups with active integrations for Hangouts Chat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 fb007335b2d..c41f72918d9 100644
--- a/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_hangouts_chat_active
description: Count of active service templates for Hangouts Chat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 6f04eb7456c..023893954f3 100644
--- a/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_hangouts_chat_active
description: Count of active instance-level integrations for Hangouts Chat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 85e735be109..2a706665d8f 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_hangouts_chat_active
description: Count of active projects inheriting integrations for Hangouts Chat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 04fb8b998ce..8586fb00ab4 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_hangouts_chat_active
description: Count of active groups inheriting integrations for Hangouts Chat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
index b1e5dfecea4..779f0579f49 100644
--- a/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_hipchat_active
description: Count of projects with active integrations for HipChat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
index 444bbafc516..16419a7005b 100644
--- a/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_hipchat_active
description: Count of groups with active integrations for HipChat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
index 40db443b150..65516f0a17b 100644
--- a/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_hipchat_active
description: Count of active service templates for HipChat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
index ef754887184..0c7c6c5ee99 100644
--- a/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_hipchat_active
description: Count of active instance-level integrations for HipChat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 d93814d3b71..febbbf234aa 100644
--- a/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_hipchat_active
description: Count of active projects inheriting integrations for HipChat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 75fbbb12034..df5bc192dfd 100644
--- a/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_hipchat_active
description: Count of active groups inheriting integrations for HipChat
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175921_projects_irker_active.yml b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
index 95eb098645c..c23511b99b0 100644
--- a/config/metrics/counts_all/20210216175921_projects_irker_active.yml
+++ b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_irker_active
description: Count of projects with active integrations for Irker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175923_groups_irker_active.yml b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
index f8321d3a18e..efb8317fd4a 100644
--- a/config/metrics/counts_all/20210216175923_groups_irker_active.yml
+++ b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_irker_active
description: Count of groups with active integrations for Irker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175924_templates_irker_active.yml b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
index c3491169a7e..6075daa321b 100644
--- a/config/metrics/counts_all/20210216175924_templates_irker_active.yml
+++ b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_irker_active
description: Count of active service templates for Irker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175926_instances_irker_active.yml b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
index ac306aaeb5f..e2821326503 100644
--- a/config/metrics/counts_all/20210216175926_instances_irker_active.yml
+++ b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_irker_active
description: Count of active instance-level integrations for Irker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 5e2e0b9fd65..bce07c5c584 100644
--- a/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
+++ b/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_irker_active
description: Count of active projects inheriting integrations for Irker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 eff596e72fb..c99e8ed3d01 100644
--- a/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
+++ b/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_irker_active
description: Count of active groups inheriting integrations for Irker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
index 3fd0e56a4e9..7e71a319c67 100644
--- a/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_jenkins_active
description: Count of projects with active integrations for Jenkins
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
index ffc47a98ea0..5db9b4b46a9 100644
--- a/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_jenkins_active
description: Count of groups with active integrations for Jenkins
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
index 96938d84aee..0205e0497bf 100644
--- a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_jenkins_active
description: Count of active service templates for Jenkins
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
index 39eabd6c502..4135f36bd0a 100644
--- a/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_jenkins_active
description: Count of active instance-level integrations for Jenkins
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 98115a001a6..82f93fa3bcd 100644
--- a/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_jenkins_active
description: Count of active projects inheriting integrations for Jenkins
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 ad5dd2a38d3..7b01ab9e25a 100644
--- a/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_jenkins_active
description: Count of active groups inheriting integrations for Jenkins
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175943_projects_jira_active.yml b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
index cc1cd2b73dd..ac627472066 100644
--- a/config/metrics/counts_all/20210216175943_projects_jira_active.yml
+++ b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_jira_active
description: Count of projects with active integrations for Jira
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175945_groups_jira_active.yml b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
index c1632e6006a..d99920be62a 100644
--- a/config/metrics/counts_all/20210216175945_groups_jira_active.yml
+++ b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_jira_active
description: Count of groups with active integrations for Jira
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175946_templates_jira_active.yml b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
index 964aef061d2..63c1929b00e 100644
--- a/config/metrics/counts_all/20210216175946_templates_jira_active.yml
+++ b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_jira_active
description: Count of active service templates for Jira
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175948_instances_jira_active.yml b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
index 6d7cdae01d1..98d1d27bed7 100644
--- a/config/metrics/counts_all/20210216175948_instances_jira_active.yml
+++ b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_jira_active
description: Count of active instance-level integrations for Jira
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 df0874cff7b..af8e8414beb 100644
--- a/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
+++ b/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_jira_active
description: Count of active projects inheriting integrations for Jira
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 c4ec2c12954..3e9531cba26 100644
--- a/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
+++ b/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_jira_active
description: Count of active groups inheriting integrations for Jira
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
index bf021f1b175..b02c9e4919f 100644
--- a/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_mattermost_active
description: Count of projects with active integrations for Mattermost
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
index 70756d6ae02..cdf2962548c 100644
--- a/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_mattermost_active
description: Count of groups with active integrations for Mattermost
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
index 9e472a1cb54..ced52649fd3 100644
--- a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_mattermost_active
description: Count of active service templates for Mattermost
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
index fedc53d1944..519039cb6c2 100644
--- a/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_mattermost_active
description: Count of active instance-level integrations for Mattermost
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 536586a5e62..40a9e3f3eac 100644
--- a/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_mattermost_active
description: Count of active projects inheriting integrations for Mattermost
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 9ceaa7c4a1c..eea105726c1 100644
--- a/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_mattermost_active
description: Count of active groups inheriting integrations for Mattermost
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 8204da004d8..36cdffa264b 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
@@ -4,7 +4,7 @@ key_path: counts.projects_mattermost_slash_commands_active
description: Count of projects with active integrations for Mattermost (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 80b38b68eff..5356bbad505 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
@@ -4,7 +4,7 @@ key_path: counts.groups_mattermost_slash_commands_active
description: Count of groups with active integrations for Mattermost (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 97a8dccd834..9851fc82dcd 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
@@ -4,7 +4,7 @@ key_path: counts.templates_mattermost_slash_commands_active
description: Count of active service templates for Mattermost (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 6ad05101cbf..08026f0a267 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
@@ -4,7 +4,7 @@ key_path: counts.instances_mattermost_slash_commands_active
description: Count of active instance-level integrations for Mattermost (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 01e97fa6ec3..08ea0768dcd 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
@@ -5,7 +5,7 @@ description: Count of active projects inheriting integrations for Mattermost (sl
commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 ebedb6796b6..0458c912d4f 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
@@ -5,7 +5,7 @@ description: Count of active groups inheriting integrations for Mattermost (slas
commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 9306aca0d2d..60dece28890 100644
--- a/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_microsoft_teams_active
description: Count of projects with active integrations for Microsoft Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 71b6ba02769..b6ff5d7e4a3 100644
--- a/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_microsoft_teams_active
description: Count of groups with active integrations for Microsoft Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 1fed89e7932..f3b96753b7b 100644
--- a/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_microsoft_teams_active
description: Count of active service templates for Microsoft Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 d58b7483f1f..04c89b9544c 100644
--- a/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_microsoft_teams_active
description: Count of active instance-level integrations for Microsoft Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 2135727416d..0a9c6e8f2d5 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_microsoft_teams_active
description: Count of active projects inheriting integrations for Microsoft Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 5e16c68d9d9..430438fa682 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_microsoft_teams_active
description: Count of active groups inheriting integrations for Microsoft Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180027_projects_packagist_active.yml b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
index cff969cb8bb..2d6da6dd87c 100644
--- a/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_packagist_active
description: Count of projects with active integrations for Packagist
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180029_groups_packagist_active.yml b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
index 1f97e3104c8..72d22778e35 100644
--- a/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_packagist_active
description: Count of groups with active integrations for Packagist
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
index 75c4f0f2428..83e0d46c6b8 100644
--- a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_packagist_active
description: Count of active service templates for Packagist
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180032_instances_packagist_active.yml b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
index eb3492ae263..f79210d6870 100644
--- a/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_packagist_active
description: Count of active instance-level integrations for Packagist
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 35b79aad0b7..0dfdbd5b610 100644
--- a/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_packagist_active
description: Count of active projects inheriting integrations for Packagist
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 6b182ca55e7..21b7b80ec17 100644
--- a/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_packagist_active
description: Count of active groups inheriting integrations for Packagist
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 61555020204..b1f315903a6 100644
--- a/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_pipelines_email_active
description: Count of projects with active integrations for Pipeline Emails
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 035bcf7d1b2..b3e5ff8ea4c 100644
--- a/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_pipelines_email_active
description: Count of groups with active integrations for Pipeline Emails
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 74629749687..ad3ed4311ff 100644
--- a/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_pipelines_email_active
description: Count of active service templates for Pipeline Emails
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 8c93ccf8d3d..c815050bec2 100644
--- a/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_pipelines_email_active
description: Count of active instance-level integrations for Pipeline Emails
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 68c59a66251..04cff98babb 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_pipelines_email_active
description: Count of active projects inheriting integrations for Pipeline Emails
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 c05c227723d..1408f2084b8 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_pipelines_email_active
description: Count of active groups inheriting integrations for Pipeline Emails
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
index afa3609ae5b..312e0c0dd93 100644
--- a/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_pivotaltracker_active
description: Count of projects with active integrations for Pivotal Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
index 487b55d438e..2d1d3110957 100644
--- a/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_pivotaltracker_active
description: Count of groups with active integrations for Pivotal Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
index abc6227f431..338fa4f6adc 100644
--- a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_pivotaltracker_active
description: Count of active service templates for Pivotal Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
index 6334dcf7ea0..8e6590c031c 100644
--- a/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_pivotaltracker_active
description: Count of active instance-level integrations for Pivotal Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 15d298ab409..14f61d6c3e2 100644
--- a/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_pivotaltracker_active
description: Count of active projects inheriting integrations for Pivotal Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 c201fc24426..9dfa4d23021 100644
--- a/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_pivotaltracker_active
description: Count of active groups inheriting integrations for Pivotal Tracker
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180100_projects_pushover_active.yml b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
index 1e8a1a69a13..85f9bfdf6c6 100644
--- a/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_pushover_active
description: Count of projects with active integrations for Pushover
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180102_groups_pushover_active.yml b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
index bf2d9691718..ab43af5212f 100644
--- a/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_pushover_active
description: Count of groups with active integrations for Pushover
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
index 9580fe01068..7ba07c02ded 100644
--- a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_pushover_active
description: Count of active service templates for Pushover
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180105_instances_pushover_active.yml b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
index 97f79e00bbb..362873d1d7b 100644
--- a/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_pushover_active
description: Count of active instance-level integrations for Pushover
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 78ee7710012..b8c567b02bf 100644
--- a/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_pushover_active
description: Count of active projects inheriting integrations for Pushover
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 bc303da80b2..a587a6ab81c 100644
--- a/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_pushover_active
description: Count of active groups inheriting integrations for Pushover
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180111_projects_redmine_active.yml b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
index 6ce6e0e40a3..bcb72acdf48 100644
--- a/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_redmine_active
description: Count of projects with active integrations for Redmine
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180113_groups_redmine_active.yml b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
index c4890014899..ab31eb0ec82 100644
--- a/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_redmine_active
description: Count of groups with active integrations for Redmine
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
index 47ba5ed946b..7bddca755ec 100644
--- a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_redmine_active
description: Count of active service templates for Redmine
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180116_instances_redmine_active.yml b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
index 9d9de8d5f76..2e1cd17c20f 100644
--- a/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_redmine_active
description: Count of active instance-level integrations for Redmine
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 396e007dcad..ba6aacb1d0a 100644
--- a/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_redmine_active
description: Count of active projects inheriting integrations for Redmine
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 260b4059958..c219ea9aa92 100644
--- a/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_redmine_active
description: Count of active groups inheriting integrations for Redmine
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180122_projects_slack_active.yml b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
index 781fabdea25..206d36548ad 100644
--- a/config/metrics/counts_all/20210216180122_projects_slack_active.yml
+++ b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_slack_active
description: Count of projects with active integrations for Slack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180124_groups_slack_active.yml b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
index 3d33c9c941c..91bf70daa37 100644
--- a/config/metrics/counts_all/20210216180124_groups_slack_active.yml
+++ b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_slack_active
description: Count of groups with active integrations for Slack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180126_templates_slack_active.yml b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
index 792c965216e..aa90f12ab18 100644
--- a/config/metrics/counts_all/20210216180126_templates_slack_active.yml
+++ b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_slack_active
description: Count of active service templates for Slack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180127_instances_slack_active.yml b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
index badd214e967..931404189d1 100644
--- a/config/metrics/counts_all/20210216180127_instances_slack_active.yml
+++ b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_slack_active
description: Count of active instance-level integrations for Slack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 c2ffb561f59..84552e83be8 100644
--- a/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
+++ b/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_slack_active
description: Count of active projects inheriting integrations for Slack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 98478a5141e..ec48bd47db0 100644
--- a/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
+++ b/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_slack_active
description: Count of active groups inheriting integrations for Slack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 a3bb1984b6a..790872db206 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
@@ -4,7 +4,7 @@ key_path: counts.projects_slack_slash_commands_active
description: Count of projects with active integrations for Slack (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 8a57b153de4..5a820ea6ae7 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
@@ -4,7 +4,7 @@ key_path: counts.groups_slack_slash_commands_active
description: Count of groups with active integrations for Slack (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 38bc6959318..1718564975d 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
@@ -4,7 +4,7 @@ key_path: counts.templates_slack_slash_commands_active
description: Count of active service templates for Slack (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 05ef50c0704..9f6da9f0e7f 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
@@ -4,7 +4,7 @@ key_path: counts.instances_slack_slash_commands_active
description: Count of active instance-level integrations for Slack (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 256e8460570..7e8f209f625 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_slack_slash_commands_active
description: Count of active projects inheriting integrations for Slack (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 514176e1d69..4dfed91dc58 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_slack_slash_commands_active
description: Count of active groups inheriting integrations for Slack (slash commands)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
index f2646e8833f..ad8d1afcc8e 100644
--- a/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_teamcity_active
description: Count of projects with active integrations for Teamcity CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
index 38f02ab6471..20deac7fe75 100644
--- a/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_teamcity_active
description: Count of groups with active integrations for Teamcity CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
index 63e8285e220..e1f01e57a31 100644
--- a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_teamcity_active
description: Count of active service templates for Teamcity CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
index e79ea145ec9..32404539b74 100644
--- a/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_teamcity_active
description: Count of active instance-level integrations for Teamcity CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 189211686a7..daddf5ca1db 100644
--- a/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_teamcity_active
description: Count of active projects inheriting integrations for Teamcity CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 b99e26f4394..53879bc7462 100644
--- a/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_teamcity_active
description: Count of active groups inheriting integrations for Teamcity CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 f6e854b241d..3b678d43017 100644
--- a/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_unify_circuit_active
description: Count of projects with active integrations for Unifiy Circuit
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 278260d1aaa..4d40f5a473d 100644
--- a/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_unify_circuit_active
description: Count of groups with active integrations for Unifiy Circuit
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 10c7b23a308..6e7c83ed6fc 100644
--- a/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_unify_circuit_active
description: Count of active service templates for Unifiy Circuit
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 89e36459000..74f90bf006c 100644
--- a/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_unify_circuit_active
description: Count of active instance-level integrations for Unifiy Circuit
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 d053ad5183e..0f3c151d505 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_unify_circuit_active
description: Count of active projects inheriting integrations for Unifiy Circuit
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 f7bc5ab4a9d..af114532491 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_unify_circuit_active
description: Count of active groups inheriting integrations for Unifiy Circuit
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 95f4efbb24b..07f5c5d5ce1 100644
--- a/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_webex_teams_active
description: Count of projects with active integrations for Webex Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 aa1ad25479b..682e719a37c 100644
--- a/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_webex_teams_active
description: Count of groups with active integrations for Webex Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 1e41a8170d4..ace629d4322 100644
--- a/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_webex_teams_active
description: Count of active service templates for Webex Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 20bdf4f0616..2d75cb7bebe 100644
--- a/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_webex_teams_active
description: Count of active instance-level integrations for Webex Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 cb4e3a00dd7..b2527e738ca 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_webex_teams_active
description: Count of active projects inheriting integrations for Webex Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 38623c9f105..5a59e20a5af 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_webex_teams_active
description: Count of active groups inheriting integrations for Webex Teams
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
index 63addd163cd..3e65b2b28dd 100644
--- a/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_youtrack_active
description: Count of projects with active integrations for YouTrack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
index 3261458496b..6c57b9e5c86 100644
--- a/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_youtrack_active
description: Count of groups with active integrations for YouTrack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
index edd5aa07f59..252c1724c48 100644
--- a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_youtrack_active
description: Count of active service templates for YouTrack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
index 83844709763..e678f693ef4 100644
--- a/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_youtrack_active
description: Count of active instance-level integrations for YouTrack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 cb0ff9b5cf2..ffeecb454d2 100644
--- a/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_youtrack_active
description: Count of active projects inheriting integrations for YouTrack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 1a49783e7b6..c8874399e76 100644
--- a/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_youtrack_active
description: Count of active groups inheriting integrations for YouTrack
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 f53ca3bf5e4..752f280dab3 100644
--- a/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
+++ b/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_jira_server_active
description: Count of active integrations with Jira Software (server)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 7ad776bf919..ceea89b7035 100644
--- a/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
+++ b/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_jira_cloud_active
description: Count of active integrations with Jira Cloud (Saas)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 a94b2209a3b..c98c7526f16 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
@@ -4,7 +4,7 @@ key_path: counts.projects_jira_dvcs_cloud_active
description: Count of active integrations with Jira Cloud (DVCS Connector)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 2f6d7defbb9..9179ec898f3 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
@@ -4,7 +4,7 @@ key_path: counts.projects_jira_dvcs_server_active
description: Count of active integrations with Jira Software (DVCS connector)
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180239_personal_snippets.yml b/config/metrics/counts_all/20210216180239_personal_snippets.yml
index 35467ce30c4..146b3217514 100644
--- a/config/metrics/counts_all/20210216180239_personal_snippets.yml
+++ b/config/metrics/counts_all/20210216180239_personal_snippets.yml
@@ -4,7 +4,7 @@ key_path: counts.personal_snippets
description: Count of personal Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180241_project_snippets.yml b/config/metrics/counts_all/20210216180241_project_snippets.yml
index 61ed32e7de5..c60a82e9ef0 100644
--- a/config/metrics/counts_all/20210216180241_project_snippets.yml
+++ b/config/metrics/counts_all/20210216180241_project_snippets.yml
@@ -4,7 +4,7 @@ key_path: counts.project_snippets
description: Count of project Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180242_web_ide_commits.yml b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
index 618e09027b5..3d1d416a7c2 100644
--- a/config/metrics/counts_all/20210216180242_web_ide_commits.yml
+++ b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
@@ -4,7 +4,7 @@ key_path: counts.web_ide_commits
description: Count of commits made from the Web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180244_web_ide_views.yml b/config/metrics/counts_all/20210216180244_web_ide_views.yml
index cac6e315d6d..7bc32b3dbc9 100644
--- a/config/metrics/counts_all/20210216180244_web_ide_views.yml
+++ b/config/metrics/counts_all/20210216180244_web_ide_views.yml
@@ -4,7 +4,7 @@ key_path: counts.web_ide_views
description: Count of views of the Web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
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 60281e0b57b..eb02d98dc85 100644
--- a/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
+++ b/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
@@ -4,7 +4,7 @@ key_path: counts.web_ide_merge_requests
description: Count of merge requests created from the Web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180248_web_ide_previews.yml b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
index 249654a68fd..4d581fc7f7e 100644
--- a/config/metrics/counts_all/20210216180248_web_ide_previews.yml
+++ b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
@@ -4,7 +4,7 @@ key_path: counts.web_ide_previews
description: Count of Live Preview tab views in the Web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180250_web_ide_terminals.yml b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
index d674e379091..e8c1f425639 100644
--- a/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
+++ b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
@@ -4,7 +4,7 @@ key_path: counts.web_ide_terminals
description: Count of Web Terminal tab views in the Web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
index bd2e3a97c88..ae891775bf9 100644
--- a/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
+++ b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
@@ -4,7 +4,7 @@ key_path: counts.web_ide_pipelines
description: Count of Pipeline tab views in the Web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180253_snippet_comment.yml b/config/metrics/counts_all/20210216180253_snippet_comment.yml
index e28994afad8..f01f62f361d 100644
--- a/config/metrics/counts_all/20210216180253_snippet_comment.yml
+++ b/config/metrics/counts_all/20210216180253_snippet_comment.yml
@@ -4,7 +4,7 @@ key_path: counts.snippet_comment
description: Count of comments on Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180255_snippet_create.yml b/config/metrics/counts_all/20210216180255_snippet_create.yml
index 5afc32bd5b1..7cea58039e1 100644
--- a/config/metrics/counts_all/20210216180255_snippet_create.yml
+++ b/config/metrics/counts_all/20210216180255_snippet_create.yml
@@ -4,7 +4,7 @@ key_path: counts.snippet_create
description: Count of newly created Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180257_snippet_update.yml b/config/metrics/counts_all/20210216180257_snippet_update.yml
index 462daa9e4da..5cb80f5e830 100644
--- a/config/metrics/counts_all/20210216180257_snippet_update.yml
+++ b/config/metrics/counts_all/20210216180257_snippet_update.yml
@@ -4,7 +4,7 @@ key_path: counts.snippet_update
description: Count of updates to existing Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
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 3dad2082894..f80d80ff42e 100644
--- a/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
+++ b/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
@@ -4,7 +4,7 @@ key_path: counts.static_site_editor_views
description: Count of Static Site Editor views
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: static_site_editor
value_type: number
status: removed
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 eef5102a070..f2fd1b12e1f 100644
--- a/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
+++ b/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
@@ -4,7 +4,7 @@ key_path: counts.static_site_editor_commits
description: Count of commits created from the Static Site Editor
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: static_site_editor
value_type: number
status: removed
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 01f0fee9a58..149ff63703d 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
@@ -4,7 +4,7 @@ key_path: counts.static_site_editor_merge_requests
description: Count of merge requests created via Static Site Editor
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: static_site_editor
value_type: number
status: removed
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 b24b8075439..7fa03fd335e 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
@@ -4,7 +4,7 @@ key_path: counts.user_preferences_user_gitpod_enabled
description: Count of users with the GitPod integration enabled
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180306_snippets.yml b/config/metrics/counts_all/20210216180306_snippets.yml
index 5945b8925aa..08344a43f39 100644
--- a/config/metrics/counts_all/20210216180306_snippets.yml
+++ b/config/metrics/counts_all/20210216180306_snippets.yml
@@ -4,7 +4,7 @@ key_path: counts.snippets
description: Count of all Snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180316_snippets.yml b/config/metrics/counts_all/20210216180316_snippets.yml
index 2c6f32afcae..6196e159588 100644
--- a/config/metrics/counts_all/20210216180316_snippets.yml
+++ b/config/metrics/counts_all/20210216180316_snippets.yml
@@ -5,7 +5,7 @@ name: count_distinct_author_id_from_snippets
description: Count of distinct author_id from snippets
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: snippets
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180410_pool_repositories.yml b/config/metrics/counts_all/20210216180410_pool_repositories.yml
index 71d2763685b..1e5938b6eef 100644
--- a/config/metrics/counts_all/20210216180410_pool_repositories.yml
+++ b/config/metrics/counts_all/20210216180410_pool_repositories.yml
@@ -4,7 +4,7 @@ key_path: counts.pool_repositories
description: Count of unique object pool repositories for fork deduplication
product_section: dev
product_stage: create
-product_group: group::gitaly
+product_group: gitaly
product_category: gitaly
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180413_all_searches.yml b/config/metrics/counts_all/20210216180413_all_searches.yml
index cf19868b47f..2f45e0c6e20 100644
--- a/config/metrics/counts_all/20210216180413_all_searches.yml
+++ b/config/metrics/counts_all/20210216180413_all_searches.yml
@@ -5,7 +5,7 @@ description: Total Searches for All Basic Search and Advanced Search in self-man
and SaaS
product_section: enablement
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180414_navbar_searches.yml b/config/metrics/counts_all/20210216180414_navbar_searches.yml
index 118ce95550d..b2af79bb43c 100644
--- a/config/metrics/counts_all/20210216180414_navbar_searches.yml
+++ b/config/metrics/counts_all/20210216180414_navbar_searches.yml
@@ -5,7 +5,7 @@ description: Total Searches using the navbar for All Basic Search and Advanced S
in self-managed and SaaS
product_section: enablement
product_stage: enablement
-product_group: group::global search
+product_group: global_search
product_category: global_search
value_type: number
status: active
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 14c96ec488c..640f5798d87 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: error_tracking
value_type: number
status: active
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 dd5b6d74486..7bdb4b65b29 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 680d1931eb9..6a0d68c289d 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
@@ -5,7 +5,7 @@ description: Count of issues where a user have added AND removed a zoom meeting
slash commands
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 7c4c973c370..48782412f7b 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 2b3db17c271..7b46d786a7a 100644
--- a/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
+++ b/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 0f09d09a8ac..c53df182d94 100644
--- a/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
+++ b/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 d5f0cfbb02f..1cd832617b2 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180447_incident_issues.yml b/config/metrics/counts_all/20210216180447_incident_issues.yml
index b47ba495373..33726405845 100644
--- a/config/metrics/counts_all/20210216180447_incident_issues.yml
+++ b/config/metrics/counts_all/20210216180447_incident_issues.yml
@@ -4,7 +4,7 @@ key_path: counts.incident_issues
description: Count of incidents (issues where issue_type=incident)
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 3f43709e753..83c77355282 100644
--- a/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
+++ b/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
index 635dcd57168..e734fbc6735 100644
--- a/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
+++ b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
@@ -4,7 +4,7 @@ key_path: counts.incident_labeled_issues
description: Count of all issues with the label=incident
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
index 763ecb49e55..ee200720ad1 100644
--- a/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
+++ b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 1d2d9bf518c..965b16e77f5 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: error_tracking
value_type: number
status: active
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 609760e25c6..741a523e113 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: removed
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 9b85ad8d146..863f2bc63c3 100644
--- a/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
+++ b/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: alert_management
value_type: number
status: active
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 44301e6a5bc..4a9ffeb2c2a 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 fc8c5d59eea..d684c6dc71c 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
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: error_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180518_projects_with_incidents.yml b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
index 627328016e2..7b6ca1dce80 100644
--- a/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
+++ b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 64844280a58..50b2b6307d9 100644
--- a/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
+++ b/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
@@ -4,7 +4,7 @@ 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::monitor
+product_group: monitor
product_category: incident_management
value_type: number
status: active
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 c8732efd549..a55600b2b7d 100644
--- a/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
+++ b/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_imported_from_github
description: Count of projects imported from GitHub
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
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 360bb66dee8..d5226578de5 100644
--- a/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
+++ b/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.create.projects_imported_from_github
description: Count of projects imported from GitHub
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
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 df9c9d99eb1..5bfc7ea3069 100644
--- a/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
+++ b/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180634_gitlab.yml b/config/metrics/counts_all/20210216180634_gitlab.yml
index 491095d836e..f908af91de7 100644
--- a/config/metrics/counts_all/20210216180634_gitlab.yml
+++ b/config/metrics/counts_all/20210216180634_gitlab.yml
@@ -5,7 +5,7 @@ description: Distinct count of users that triggered an import using the Group Mi
tool
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180636_gitlab_v1.yml b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
index d390645eada..b1b6e20e092 100644
--- a/config/metrics/counts_all/20210216180636_gitlab_v1.yml
+++ b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.bulk_imports.gitlab_v1
description: Count of imports using GitLab Migration
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180638_gitlab_project.yml b/config/metrics/counts_all/20210216180638_gitlab_project.yml
index a3991441a70..5635d3918f4 100644
--- a/config/metrics/counts_all/20210216180638_gitlab_project.yml
+++ b/config/metrics/counts_all/20210216180638_gitlab_project.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.gitlab_project
description: Count of projects imported using Project Import/Export
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180639_gitlab.yml b/config/metrics/counts_all/20210216180639_gitlab.yml
index 3497675a00c..ffee62ebbf7 100644
--- a/config/metrics/counts_all/20210216180639_gitlab.yml
+++ b/config/metrics/counts_all/20210216180639_gitlab.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.gitlab
description: Count of projects imported from GitLab.com
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180641_github.yml b/config/metrics/counts_all/20210216180641_github.yml
index 930c96898de..72f7a33beb6 100644
--- a/config/metrics/counts_all/20210216180641_github.yml
+++ b/config/metrics/counts_all/20210216180641_github.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.github
description: Count of projects imported from GitHub
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180643_bitbucket.yml b/config/metrics/counts_all/20210216180643_bitbucket.yml
index 2e612b09057..86f7d15eea5 100644
--- a/config/metrics/counts_all/20210216180643_bitbucket.yml
+++ b/config/metrics/counts_all/20210216180643_bitbucket.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.bitbucket
description: Count of projects imported from Bitbucket
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180645_bitbucket_server.yml b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
index fc5df480f75..c37009c4ed5 100644
--- a/config/metrics/counts_all/20210216180645_bitbucket_server.yml
+++ b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.bitbucket_server
description: Count of projects imported from Bitbucket Server
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180647_gitea.yml b/config/metrics/counts_all/20210216180647_gitea.yml
index 584d0f26cb1..a7d80f15686 100644
--- a/config/metrics/counts_all/20210216180647_gitea.yml
+++ b/config/metrics/counts_all/20210216180647_gitea.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.gitea
description: Count of projects imported from Gitea
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180649_git.yml b/config/metrics/counts_all/20210216180649_git.yml
index d5569d2a56e..9851e1b97eb 100644
--- a/config/metrics/counts_all/20210216180649_git.yml
+++ b/config/metrics/counts_all/20210216180649_git.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.git
description: Count of projects imported by URL
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180650_manifest.yml b/config/metrics/counts_all/20210216180650_manifest.yml
index e6578f840bb..a76dc28c9c5 100644
--- a/config/metrics/counts_all/20210216180650_manifest.yml
+++ b/config/metrics/counts_all/20210216180650_manifest.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.manifest
description: Count of projects imported using manifst file
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180652_gitlab_migration.yml b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
index 7e9e9b6d261..a563b3d53d1 100644
--- a/config/metrics/counts_all/20210216180652_gitlab_migration.yml
+++ b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.gitlab_migration
description: Count of projects imported using GitLab Migration
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180654_jira.yml b/config/metrics/counts_all/20210216180654_jira.yml
index 890e4b46391..cf33c7f8128 100644
--- a/config/metrics/counts_all/20210216180654_jira.yml
+++ b/config/metrics/counts_all/20210216180654_jira.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.issue_imports.jira
description: Count of projects imported from Jira
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180656_fogbugz.yml b/config/metrics/counts_all/20210216180656_fogbugz.yml
index ef5baf27291..d51591d0297 100644
--- a/config/metrics/counts_all/20210216180656_fogbugz.yml
+++ b/config/metrics/counts_all/20210216180656_fogbugz.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.issue_imports.fogbugz
description: Count of projects imported from fogbugz
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180658_phabricator.yml b/config/metrics/counts_all/20210216180658_phabricator.yml
index 1f48180200b..834322726fa 100644
--- a/config/metrics/counts_all/20210216180658_phabricator.yml
+++ b/config/metrics/counts_all/20210216180658_phabricator.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.issue_imports.phabricator
description: Count of projects imported from phabricator
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180700_csv.yml b/config/metrics/counts_all/20210216180700_csv.yml
index 78322ba56b2..e5ca3cbc7e2 100644
--- a/config/metrics/counts_all/20210216180700_csv.yml
+++ b/config/metrics/counts_all/20210216180700_csv.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.issue_imports.csv
description: Count of (attempted) imports from csv files
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180702_group_import.yml b/config/metrics/counts_all/20210216180702_group_import.yml
index 68042d4a4a3..ed0b3b9d032 100644
--- a/config/metrics/counts_all/20210216180702_group_import.yml
+++ b/config/metrics/counts_all/20210216180702_group_import.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.group_imports.group_import
description: Count of groups imported using Group Import/Export
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180703_gitlab_migration.yml b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
index a4aca8f7859..b5b6f0a73b5 100644
--- a/config/metrics/counts_all/20210216180703_gitlab_migration.yml
+++ b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.group_imports.gitlab_migration
description: Count of groups imported using GitLab Migration
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180705_total.yml b/config/metrics/counts_all/20210216180705_total.yml
index a159fe43199..22f46b6bf04 100644
--- a/config/metrics/counts_all/20210216180705_total.yml
+++ b/config/metrics/counts_all/20210216180705_total.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180707_gitlab_project.yml b/config/metrics/counts_all/20210216180707_gitlab_project.yml
index 3627fe7c13f..76c17b6c81d 100644
--- a/config/metrics/counts_all/20210216180707_gitlab_project.yml
+++ b/config/metrics/counts_all/20210216180707_gitlab_project.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180709_gitlab.yml b/config/metrics/counts_all/20210216180709_gitlab.yml
index 97826963cef..28495cc221a 100644
--- a/config/metrics/counts_all/20210216180709_gitlab.yml
+++ b/config/metrics/counts_all/20210216180709_gitlab.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.projects_imported.gitlab
description: Distinct count of users that imported projects from GitLab.com
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180711_github.yml b/config/metrics/counts_all/20210216180711_github.yml
index 1df68631a35..db8655eba39 100644
--- a/config/metrics/counts_all/20210216180711_github.yml
+++ b/config/metrics/counts_all/20210216180711_github.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.projects_imported.github
description: Distinct count of users that imported projects from GitHub
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180713_bitbucket.yml b/config/metrics/counts_all/20210216180713_bitbucket.yml
index c2ad8aeb57b..d2dd844a237 100644
--- a/config/metrics/counts_all/20210216180713_bitbucket.yml
+++ b/config/metrics/counts_all/20210216180713_bitbucket.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.projects_imported.bitbucket
description: Distinct count of users that imported projects from Bitbucket Cloud
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180715_bitbucket_server.yml b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
index d588f1f48cf..8110fc3e008 100644
--- a/config/metrics/counts_all/20210216180715_bitbucket_server.yml
+++ b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180716_gitea.yml b/config/metrics/counts_all/20210216180716_gitea.yml
index 7e585cd6808..4a32e8e5ca1 100644
--- a/config/metrics/counts_all/20210216180716_gitea.yml
+++ b/config/metrics/counts_all/20210216180716_gitea.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.projects_imported.gitea
description: Distinct count of users that imported projects from Gitea
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180718_git.yml b/config/metrics/counts_all/20210216180718_git.yml
index 9e23899875a..f1ea4ca9441 100644
--- a/config/metrics/counts_all/20210216180718_git.yml
+++ b/config/metrics/counts_all/20210216180718_git.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180720_manifest.yml b/config/metrics/counts_all/20210216180720_manifest.yml
index 07a5e2ce282..938ba0b48f4 100644
--- a/config/metrics/counts_all/20210216180720_manifest.yml
+++ b/config/metrics/counts_all/20210216180720_manifest.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.projects_imported.manifest
description: Distinct count of users that imported projects using Manifest file
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180722_jira.yml b/config/metrics/counts_all/20210216180722_jira.yml
index a069aa329a7..63b8b83f219 100644
--- a/config/metrics/counts_all/20210216180722_jira.yml
+++ b/config/metrics/counts_all/20210216180722_jira.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180724_fogbugz.yml b/config/metrics/counts_all/20210216180724_fogbugz.yml
index ff1abeef151..618b647a931 100644
--- a/config/metrics/counts_all/20210216180724_fogbugz.yml
+++ b/config/metrics/counts_all/20210216180724_fogbugz.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180726_phabricator.yml b/config/metrics/counts_all/20210216180726_phabricator.yml
index e7de4c560bd..0fa06ea3ab7 100644
--- a/config/metrics/counts_all/20210216180726_phabricator.yml
+++ b/config/metrics/counts_all/20210216180726_phabricator.yml
@@ -4,7 +4,7 @@ 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
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180727_csv.yml b/config/metrics/counts_all/20210216180727_csv.yml
index a132f2e53c1..e700a0dbf8d 100644
--- a/config/metrics/counts_all/20210216180727_csv.yml
+++ b/config/metrics/counts_all/20210216180727_csv.yml
@@ -5,7 +5,7 @@ description: Distinct count of users that imported issues into projects using CS
upload
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180729_groups_imported.yml b/config/metrics/counts_all/20210216180729_groups_imported.yml
index 5631a1315e6..c7f0f128d83 100644
--- a/config/metrics/counts_all/20210216180729_groups_imported.yml
+++ b/config/metrics/counts_all/20210216180729_groups_imported.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.groups_imported
description: Distinct count of users that imported groups using Group Import
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category: importers
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180734_wiki_pages_create.yml b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
index e30c339d73c..675a9db7a7b 100644
--- a/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
+++ b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
@@ -4,7 +4,7 @@ key_path: counts.wiki_pages_create
description: Count of all Wiki pages created
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: wiki
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180736_wiki_pages_update.yml b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
index de168835e07..c985d876c96 100644
--- a/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
+++ b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
@@ -4,7 +4,7 @@ key_path: counts.wiki_pages_update
description: Count of all Wiki page updates
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: wiki
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
index d9175cd64e8..6ac0825996c 100644
--- a/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
+++ b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
@@ -4,7 +4,7 @@ key_path: counts.wiki_pages_delete
description: Count of all Wiki pages deleted
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: wiki
value_type: number
status: active
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 82575446cdc..42f06ef563f 100644
--- a/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
+++ b/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
@@ -4,7 +4,7 @@ key_path: counts.design_management_designs_create
description: Number of designs that were created
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: design_management
value_type: number
status: active
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 49894014da5..a4e526214aa 100644
--- a/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
+++ b/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
@@ -4,7 +4,7 @@ key_path: counts.design_management_designs_update
description: Number of updates to designs
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: design_management
value_type: number
status: active
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 173c9522c39..4eff2b1b0ff 100644
--- a/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
+++ b/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
@@ -4,7 +4,7 @@ key_path: counts.design_management_designs_delete
description: Number of designs that were deleted
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: design_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180750_groups.yml b/config/metrics/counts_all/20210216180750_groups.yml
index 2ed6e0f7da2..e8298cb7fbc 100644
--- a/config/metrics/counts_all/20210216180750_groups.yml
+++ b/config/metrics/counts_all/20210216180750_groups.yml
@@ -4,7 +4,7 @@ key_path: counts.groups
description: Total count of groups as of usage ping snapshot
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: subgroups
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180752_keys.yml b/config/metrics/counts_all/20210216180752_keys.yml
index 546bc303314..f6de1a1fdd1 100644
--- a/config/metrics/counts_all/20210216180752_keys.yml
+++ b/config/metrics/counts_all/20210216180752_keys.yml
@@ -4,7 +4,7 @@ key_path: counts.keys
description: Number of keys.
product_section: dev
product_stage: managed
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180754_events.yml b/config/metrics/counts_all/20210216180754_events.yml
index 85875448f00..068ff246f97 100644
--- a/config/metrics/counts_all/20210216180754_events.yml
+++ b/config/metrics/counts_all/20210216180754_events.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.events
description: Number of distinct users who have generated a manage event
product_section: dev
product_stage: manage
-product_group: group::manage
+product_group: manage
product_category:
value_type: number
status: broken
diff --git a/config/metrics/counts_all/20210216180756_groups.yml b/config/metrics/counts_all/20210216180756_groups.yml
index 0aaffbc9eae..cacd3061278 100644
--- a/config/metrics/counts_all/20210216180756_groups.yml
+++ b/config/metrics/counts_all/20210216180756_groups.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.groups
description: Number of users who are group members.
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: subgroups
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180758_users_created.yml b/config/metrics/counts_all/20210216180758_users_created.yml
index 9567dbf5e23..c34c1cfe264 100644
--- a/config/metrics/counts_all/20210216180758_users_created.yml
+++ b/config/metrics/counts_all/20210216180758_users_created.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.users_created
description: Number of users
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
index 0e2ac43de54..35117f6217d 100644
--- a/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
+++ b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
@@ -4,7 +4,7 @@ key_path: counts.grafana_integrated_projects
description: Total Grafana integrations attached to projects
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 87668ca0e4f..106ecfa4483 100644
--- a/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
+++ b/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
@@ -4,10 +4,10 @@ key_path: counts.projects_with_tracing_enabled
description: Projects with tracing enabled
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: tracing
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,5 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "15.2"
+removed_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90607"
diff --git a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
index c753ae06c09..112e7a493c0 100644
--- a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_prometheus_active
description: Count of projects with active integrations for Prometheus
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
index 3cc8dcb47c8..92b913621e3 100644
--- a/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_prometheus_active
description: Count of groups with active integrations for Prometheus
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
index 9f8a24488ad..e71461d1a5a 100644
--- a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_prometheus_active
description: Count of active service templates for Prometheus
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
index 7308e5c82b4..17cf56a6fc4 100644
--- a/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_prometheus_active
description: Count of active instance-level integrations for Prometheus
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 32b59d9948a..9dbd83529d6 100644
--- a/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_prometheus_active
description: Count of active projects inheriting integrations for Prometheus
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 0604fadab62..10a149c3ae8 100644
--- a/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_prometheus_active
description: Count of active groups inheriting integrations for Prometheus
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 3d00a873ea3..ae3909f78a4 100644
--- a/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
+++ b/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
@@ -4,7 +4,7 @@ key_path: counts.operations_dashboard_default_dashboard
description: Active users with enabled operations dashboard
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 c510f56b392..843f75ef12a 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
@@ -4,7 +4,7 @@ key_path: counts.operations_dashboard_users_with_projects_added
description: Active users with projects on operations dashboard
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180945_clusters.yml b/config/metrics/counts_all/20210216180945_clusters.yml
index ef1694a274f..93fffedd2e6 100644
--- a/config/metrics/counts_all/20210216180945_clusters.yml
+++ b/config/metrics/counts_all/20210216180945_clusters.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.monitor.clusters
description: Users creating clusters.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
index bf567337380..0148788f635 100644
--- a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.monitor.clusters_applications_prometheus
description: Users creating clusters with Prometheus enabled.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: removed
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 618f0049e50..c3c840c6228 100644
--- a/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
+++ b/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.monitor.operations_dashboard_default_dashboard
description: Active users with enabled operations dashboard
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
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 3532dc60ff0..62f472da341 100644
--- a/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
+++ b/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
@@ -4,10 +4,10 @@ key_path: usage_activity_by_stage.monitor.projects_with_tracing_enabled
description: Projects with tracing enabled
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: tracing
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -18,3 +18,5 @@ tier:
- premium
- ultimate
milestone: "<13.9"
+milestone_removed: "15.2"
+removed_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90607"
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 1f80f3a935d..b22402d2a1b 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.monitor.operations_dashboard_users_with_projec
description: Active users with projects on operations dashboard
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181009_lfs_objects.yml b/config/metrics/counts_all/20210216181009_lfs_objects.yml
index 5b025ff4947..851281b799d 100644
--- a/config/metrics/counts_all/20210216181009_lfs_objects.yml
+++ b/config/metrics/counts_all/20210216181009_lfs_objects.yml
@@ -4,7 +4,7 @@ key_path: counts.lfs_objects
description: Count of lfs objects
product_section: ops
product_stage: create
-product_group: group::create
+product_group: create
product_category:
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181011_projects_with_packages.yml b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
index 554ed451d64..f2f7870cfc9 100644
--- a/config/metrics/counts_all/20210216181011_projects_with_packages.yml
+++ b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_with_packages
description: Projects with package registry enabled
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181012_packages.yml b/config/metrics/counts_all/20210216181012_packages.yml
index 65cc8b20b0d..647e4dd3183 100644
--- a/config/metrics/counts_all/20210216181012_packages.yml
+++ b/config/metrics/counts_all/20210216181012_packages.yml
@@ -4,7 +4,7 @@ key_path: counts.packages
description: The total number of packages published to the registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 0a6e00a0006..1d71cc632c4 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
@@ -4,7 +4,7 @@ key_path: counts.projects_with_expiration_policy_disabled
description: The number of projects with cleanup policy for tags turned off
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 c21b1eeb2cc..c5e5e7fffd1 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
@@ -4,7 +4,7 @@ key_path: counts.projects_with_expiration_policy_enabled
description: A count of projects with the cleanup policy for tags turned on
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 9b786709798..2a531707621 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 92f242f0a1c..4e9df93f171 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 0b2f360437e..da0e5006521 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 756ddb1f11b..84bce062d63 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 5b5b0d3734c..38579a1bdc2 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 8b4ebb9b020..69c59dd2262 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 d1033a11ea5..1694127fd2c 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 9e8db324e41..a9f8ed70c94 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 19360edf23f..7afc773b713 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 946330fb339..b083411ab7f 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
@@ -4,7 +4,7 @@ key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1mo
description: A count of projects with the cleanup policy set to run monthly
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 c24f474379a..0df858b127d 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
@@ -4,7 +4,7 @@ key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3mo
description: A count of projects with the cleanup policy set to run every 3 months
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 76f20bc31b6..bf1a98fd290 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
@@ -5,7 +5,7 @@ description: A count of projects with the cleanup policy set delete tags older t
7 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 0f60e003840..31f7f6562e4 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
@@ -5,7 +5,7 @@ description: A count of projects with the cleanup policy set delete tags older t
14 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 90d034f8294..577e9e60d56 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
@@ -5,7 +5,7 @@ description: A count of projects with the cleanup policy set delete tags older t
30 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 6add782766a..3ef97b5a6f8 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
@@ -5,7 +5,7 @@ description: A count of projects with the cleanup policy set delete tags older t
90 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 67c18c86aee..6a98e4ecfd8 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
@@ -5,7 +5,7 @@ description: A count of projects with the cleanup policy with the number of tags
keep unset
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
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 205f46dd8a2..d2be783a12a 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
@@ -5,7 +5,7 @@ description: A count of projects with the cleanup policy with the number of tags
delete unset
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181051_vendor.yml b/config/metrics/counts_all/20210216181051_vendor.yml
index 82bf1d6393a..3ea154f5877 100644
--- a/config/metrics/counts_all/20210216181051_vendor.yml
+++ b/config/metrics/counts_all/20210216181051_vendor.yml
@@ -5,7 +5,7 @@ description: Identifies if a user is using an external container registry and wh
type
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181055_projects_with_packages.yml b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
index cc2fa107b47..efee3ba55ce 100644
--- a/config/metrics/counts_all/20210216181055_projects_with_packages.yml
+++ b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.package.projects_with_packages
description: Projects with package registry enabled
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181102_issues.yml b/config/metrics/counts_all/20210216181102_issues.yml
index b902437e2f9..894691e7880 100644
--- a/config/metrics/counts_all/20210216181102_issues.yml
+++ b/config/metrics/counts_all/20210216181102_issues.yml
@@ -4,7 +4,7 @@ key_path: counts.issues
description: Count of Issues created
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181104_label_lists.yml b/config/metrics/counts_all/20210216181104_label_lists.yml
index fd58d1866bb..80a18c67252 100644
--- a/config/metrics/counts_all/20210216181104_label_lists.yml
+++ b/config/metrics/counts_all/20210216181104_label_lists.yml
@@ -4,7 +4,7 @@ key_path: counts.label_lists
description: Count of label lists created on Boards
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: boards
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181108_milestones.yml b/config/metrics/counts_all/20210216181108_milestones.yml
index aa7c8f90f80..abeec87524c 100644
--- a/config/metrics/counts_all/20210216181108_milestones.yml
+++ b/config/metrics/counts_all/20210216181108_milestones.yml
@@ -4,7 +4,7 @@ key_path: counts.milestones
description: Count of milestones created
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181109_uploads.yml b/config/metrics/counts_all/20210216181109_uploads.yml
index 220009a2ff5..bd2dc41838f 100644
--- a/config/metrics/counts_all/20210216181109_uploads.yml
+++ b/config/metrics/counts_all/20210216181109_uploads.yml
@@ -4,7 +4,7 @@ key_path: counts.uploads
description: Count of Uploads via Notes and Descriptions
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181111_labels.yml b/config/metrics/counts_all/20210216181111_labels.yml
index 48980c7cba4..b91356054bb 100644
--- a/config/metrics/counts_all/20210216181111_labels.yml
+++ b/config/metrics/counts_all/20210216181111_labels.yml
@@ -4,7 +4,7 @@ key_path: counts.labels
description: Count of Labels
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181113_notes.yml b/config/metrics/counts_all/20210216181113_notes.yml
index 2d5d5c405cd..8a73c5f93b0 100644
--- a/config/metrics/counts_all/20210216181113_notes.yml
+++ b/config/metrics/counts_all/20210216181113_notes.yml
@@ -4,7 +4,7 @@ key_path: counts.notes
description: Count of Notes across all objects that use them
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181115_issues.yml b/config/metrics/counts_all/20210216181115_issues.yml
index f80ae26eea0..e7383e40f9d 100644
--- a/config/metrics/counts_all/20210216181115_issues.yml
+++ b/config/metrics/counts_all/20210216181115_issues.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.issues
description: Count of users creating Issues
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181117_notes.yml b/config/metrics/counts_all/20210216181117_notes.yml
index e8cc952b05c..5f8a7097ec0 100644
--- a/config/metrics/counts_all/20210216181117_notes.yml
+++ b/config/metrics/counts_all/20210216181117_notes.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.notes
description: Count of users creating Notes on Issues
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181119_projects.yml b/config/metrics/counts_all/20210216181119_projects.yml
index e8bce2b79bf..31b315b6e12 100644
--- a/config/metrics/counts_all/20210216181119_projects.yml
+++ b/config/metrics/counts_all/20210216181119_projects.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.projects
description: Count of users creating projects
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: projects
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181121_todos.yml b/config/metrics/counts_all/20210216181121_todos.yml
index e20fe6f7b84..c89cd1208c4 100644
--- a/config/metrics/counts_all/20210216181121_todos.yml
+++ b/config/metrics/counts_all/20210216181121_todos.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.todos
description: Count of users todos created
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 d57a1b6a052..e25512bf85f 100644
--- a/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.service_desk_enabled_projects
description: Count creator ids from projects with service desk enabled
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181124_service_desk_issues.yml b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
index 476d2fab058..4d2c933ea59 100644
--- a/config/metrics/counts_all/20210216181124_service_desk_issues.yml
+++ b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.service_desk_issues
description: Count of service desk issues
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: service_desk
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181126_projects_jira_active.yml b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
index 63b13a17b67..2bd0cdf62c3 100644
--- a/config/metrics/counts_all/20210216181126_projects_jira_active.yml
+++ b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.projects_jira_active
description: Distinct count of creator_id from projects with an active Jira integration.
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 7e42a3e57a4..9d17fd23fde 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
@@ -5,7 +5,7 @@ description: Distinct count of creator_id from projects with an active Jira Clou
DVCS integration.
product_section: dev
product_stage: ecosystem
-product_group: group::integration
+product_group: integration
product_category: integrations
value_type: number
status: active
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 55d90e282c6..49747d3239c 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
@@ -5,7 +5,7 @@ description: Distinct count of creator_id from projects with an active Jira Serv
DVCS integration.
product_section: dev
product_stage: ecosystem
-product_group: group::integration
+product_group: integration
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181134_epics.yml b/config/metrics/counts_all/20210216181134_epics.yml
index 4b6a1ed0291..9f491a10552 100644
--- a/config/metrics/counts_all/20210216181134_epics.yml
+++ b/config/metrics/counts_all/20210216181134_epics.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.epics
description: Count distinct author ids from epics
product_section: dev
product_stage: plan
-product_group: group::product planning
+product_group: product_planning
product_category: epics
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181135_label_lists.yml b/config/metrics/counts_all/20210216181135_label_lists.yml
index 8bcabe8cd38..4a8714c16c6 100644
--- a/config/metrics/counts_all/20210216181135_label_lists.yml
+++ b/config/metrics/counts_all/20210216181135_label_lists.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.plan.label_lists
description: Count of users creating label lists on Boards
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: boards
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181249_feature_flags.yml b/config/metrics/counts_all/20210216181249_feature_flags.yml
index 70e6e6c04eb..2b25ce6a32b 100644
--- a/config/metrics/counts_all/20210216181249_feature_flags.yml
+++ b/config/metrics/counts_all/20210216181249_feature_flags.yml
@@ -4,7 +4,7 @@ key_path: counts.feature_flags
description: Number of feature flag toggles
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: feature_flags
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181252_boards.yml b/config/metrics/counts_all/20210216181252_boards.yml
index 683fa274e63..6d4c41cd95e 100644
--- a/config/metrics/counts_all/20210216181252_boards.yml
+++ b/config/metrics/counts_all/20210216181252_boards.yml
@@ -4,7 +4,7 @@ key_path: counts.boards
description: Count of Boards created
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: boards
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181254_projects.yml b/config/metrics/counts_all/20210216181254_projects.yml
index 00af8e92387..1327d016b9d 100644
--- a/config/metrics/counts_all/20210216181254_projects.yml
+++ b/config/metrics/counts_all/20210216181254_projects.yml
@@ -4,7 +4,7 @@ key_path: counts.projects
description: Count of Projects created
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: projects
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181256_todos.yml b/config/metrics/counts_all/20210216181256_todos.yml
index 72932b9ec84..27edfc7527a 100644
--- a/config/metrics/counts_all/20210216181256_todos.yml
+++ b/config/metrics/counts_all/20210216181256_todos.yml
@@ -4,7 +4,7 @@ key_path: counts.todos
description: Count of todos created
product_section: dev
product_stage: plan
-product_group: group::project management
+product_group: project_management
product_category: issue_tracking
value_type: number
status: active
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 a4abbad0b7d..c38fc0bd081 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
@@ -4,7 +4,7 @@ key_path: counts.jira_imports_total_imported_count
description: Count of Jira imports completed
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: jira_importer
value_type: number
status: active
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 3722c7ccaa4..0188ba1510b 100644
--- a/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
+++ b/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
@@ -4,7 +4,7 @@ key_path: counts.jira_imports_projects_count
description: Count of Projects that imported Issues from Jira
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: jira_importer
value_type: number
status: active
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 312bbc1dff6..c67c7daa770 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
@@ -5,7 +5,7 @@ instrumentation_class: JiraImportsTotalImportedIssuesCountMetric
description: Count of total issues imported via the Jira Importer
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: jira_importer
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181908_deploy_keys.yml b/config/metrics/counts_all/20210216181908_deploy_keys.yml
index 40cf2ceb97a..b160392c5ac 100644
--- a/config/metrics/counts_all/20210216181908_deploy_keys.yml
+++ b/config/metrics/counts_all/20210216181908_deploy_keys.yml
@@ -4,7 +4,7 @@ key_path: counts.deploy_keys
description: Count of deploy keys
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181911_successful_deployments.yml b/config/metrics/counts_all/20210216181911_successful_deployments.yml
index dcaf37a62f3..b684cf0aa93 100644
--- a/config/metrics/counts_all/20210216181911_successful_deployments.yml
+++ b/config/metrics/counts_all/20210216181911_successful_deployments.yml
@@ -4,7 +4,7 @@ key_path: counts.successful_deployments
description: Total successful deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181912_failed_deployments.yml b/config/metrics/counts_all/20210216181912_failed_deployments.yml
index 0c3837e3f0b..605282e0ae0 100644
--- a/config/metrics/counts_all/20210216181912_failed_deployments.yml
+++ b/config/metrics/counts_all/20210216181912_failed_deployments.yml
@@ -4,7 +4,7 @@ key_path: counts.failed_deployments
description: Total failed deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181914_environments.yml b/config/metrics/counts_all/20210216181914_environments.yml
index ce6fb171f79..8985639f927 100644
--- a/config/metrics/counts_all/20210216181914_environments.yml
+++ b/config/metrics/counts_all/20210216181914_environments.yml
@@ -4,7 +4,7 @@ key_path: counts.environments
description: Total available and stopped environments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181916_in_review_folder.yml b/config/metrics/counts_all/20210216181916_in_review_folder.yml
index 145f0a3ab02..eaebd12475c 100644
--- a/config/metrics/counts_all/20210216181916_in_review_folder.yml
+++ b/config/metrics/counts_all/20210216181916_in_review_folder.yml
@@ -4,7 +4,7 @@ key_path: counts.in_review_folder
description: A number of environments with name review/*
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181918_releases.yml b/config/metrics/counts_all/20210216181918_releases.yml
index edd72afffff..aff67e4e6e5 100644
--- a/config/metrics/counts_all/20210216181918_releases.yml
+++ b/config/metrics/counts_all/20210216181918_releases.yml
@@ -3,8 +3,8 @@ data_category: optional
key_path: counts.releases
description: Count of releases
product_section: ops
-product_stage: releases
-product_group: group::release
+product_stage: release
+product_group: release
product_category: release_orchestration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181926_deployments.yml b/config/metrics/counts_all/20210216181926_deployments.yml
index cabf887d72d..51650d645e8 100644
--- a/config/metrics/counts_all/20210216181926_deployments.yml
+++ b/config/metrics/counts_all/20210216181926_deployments.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.release.deployments
description: Unique users triggering deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181928_failed_deployments.yml b/config/metrics/counts_all/20210216181928_failed_deployments.yml
index d3208764244..670c7fb65cc 100644
--- a/config/metrics/counts_all/20210216181928_failed_deployments.yml
+++ b/config/metrics/counts_all/20210216181928_failed_deployments.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.release.failed_deployments
description: Total failed deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181930_releases.yml b/config/metrics/counts_all/20210216181930_releases.yml
index 7d3ba2eb218..b86e467b2d3 100644
--- a/config/metrics/counts_all/20210216181930_releases.yml
+++ b/config/metrics/counts_all/20210216181930_releases.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.release.releases
description: Unique users creating release tags
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: release_orchestration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181932_successful_deployments.yml b/config/metrics/counts_all/20210216181932_successful_deployments.yml
index e85b46027b4..003d5e8ef6f 100644
--- a/config/metrics/counts_all/20210216181932_successful_deployments.yml
+++ b/config/metrics/counts_all/20210216181932_successful_deployments.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.release.successful_deployments
description: Total successful deployments
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: continuous_delivery
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181946_pages_domains.yml b/config/metrics/counts_all/20210216181946_pages_domains.yml
index cba92282125..8df4f3bd3a5 100644
--- a/config/metrics/counts_all/20210216181946_pages_domains.yml
+++ b/config/metrics/counts_all/20210216181946_pages_domains.yml
@@ -4,7 +4,7 @@ key_path: counts.pages_domains
description: Total GitLab Pages domains
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: pages
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
index 3c3fc600698..37128c7aa0a 100644
--- a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
+++ b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.verify.clusters_applications_runner
description: Count of users creating managed clusters with Runner enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216182002_remote_mirrors.yml b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
index 2730750ee5a..3f9b8ded5ce 100644
--- a/config/metrics/counts_all/20210216182002_remote_mirrors.yml
+++ b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
@@ -4,7 +4,7 @@ key_path: counts.remote_mirrors
description: Count of total remote mirrors. Includes both push and pull mirrors
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182004_commit_comment.yml b/config/metrics/counts_all/20210216182004_commit_comment.yml
index b2b19dfcf17..7755fec3a2c 100644
--- a/config/metrics/counts_all/20210216182004_commit_comment.yml
+++ b/config/metrics/counts_all/20210216182004_commit_comment.yml
@@ -4,7 +4,7 @@ key_path: counts.commit_comment
description: Count of total unique commit comments. Does not include MR diff comments
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182006_source_code_pushes.yml b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
index 9930105d8cf..5c3c70f2496 100644
--- a/config/metrics/counts_all/20210216182006_source_code_pushes.yml
+++ b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
@@ -4,7 +4,7 @@ key_path: counts.source_code_pushes
description: Count of total Git push operations
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182010_deploy_keys.yml b/config/metrics/counts_all/20210216182010_deploy_keys.yml
index cedafd4a576..347b487c999 100644
--- a/config/metrics/counts_all/20210216182010_deploy_keys.yml
+++ b/config/metrics/counts_all/20210216182010_deploy_keys.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.create.deploy_keys
description: Count of users creating deploy keys.
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182012_keys.yml b/config/metrics/counts_all/20210216182012_keys.yml
index 72d7f5b2b7b..66d0c070b1c 100644
--- a/config/metrics/counts_all/20210216182012_keys.yml
+++ b/config/metrics/counts_all/20210216182012_keys.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.create.keys
description: Count of users creating regular keys.
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 37709066148..ca48d4f4251 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
@@ -5,7 +5,7 @@ description: Total count of projects that do not allow overriding approvers on d
merge requests
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 6613f87aafd..dbbb491e3f0 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
@@ -5,7 +5,7 @@ description: Count of total projects that do not disable overriding approvers pe
discrete merge request
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182017_remote_mirrors.yml b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
index 9930c937aee..df9dd1e03f9 100644
--- a/config/metrics/counts_all/20210216182017_remote_mirrors.yml
+++ b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.create.remote_mirrors
description: Count of users creating projects with remote mirrors.
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
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 f1f1e877a83..1bc3b8ba43a 100644
--- a/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
+++ b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
@@ -4,7 +4,7 @@ key_path: counts.protected_branches_except_default
description: Count of branches that have been protected and are not the default branch
product_section: dev
product_stage: create
-product_group: group::source code
+product_group: source_code
product_category: source_code_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182547_projects_datadog_active.yml b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
index a321b90faa5..90be5ffdc55 100644
--- a/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_datadog_active
description: Count of projects with active integrations for Datadog
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182549_groups_datadog_active.yml b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
index 0647618b825..a3a52c46c32 100644
--- a/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_datadog_active
description: Count of groups with active integrations for Datadog
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
index 975bc2164bc..9046087dbdc 100644
--- a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_datadog_active
description: Count of active service templates for Datadog
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216182553_instances_datadog_active.yml b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
index 0584c5c2c81..396e3f19253 100644
--- a/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_datadog_active
description: Count of active instance-level integrations for Datadog
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 1ef23e06c10..50b1f471188 100644
--- a/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_datadog_active
description: Count of active projects inheriting integrations for Datadog
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 aed458187a8..039c71f6b32 100644
--- a/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_datadog_active
description: Count of active groups inheriting integrations for Datadog
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182614_projects_ewm_active.yml b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
index 93d73cf233f..2a906265e76 100644
--- a/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_ewm_active
description: Count of projects with active integrations for EWM
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182616_groups_ewm_active.yml b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
index 441f6e05077..f2de8af7f77 100644
--- a/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_ewm_active
description: Count of groups with active integrations for EWM
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
index be61177d818..de408750880 100644
--- a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_ewm_active
description: Count of active service templates for EWM
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216182620_instances_ewm_active.yml b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
index cb3821cbb24..3cf2648b6ba 100644
--- a/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_ewm_active
description: Count of active instance-level integrations for EWM
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 b5ac09a9313..5c7b7c23d20 100644
--- a/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_ewm_active
description: Count of active projects inheriting integrations for EWM
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 4cd950aeff5..c385ba3eccc 100644
--- a/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_ewm_active
description: Count of active groups inheriting integrations for EWM
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
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 5c12fa79916..a3d554185c3 100644
--- a/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_mock_ci_active
description: Count of projects with active integrations for Mock CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 eafff875bfb..0f00e04dbf9 100644
--- a/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_mock_ci_active
description: Count of groups with active integrations for Mock CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 b421b3d1843..4cff208fc0e 100644
--- a/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_mock_ci_active
description: Count of active service templates for Mock CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 eb7009db600..90878f664ca 100644
--- a/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_mock_ci_active
description: Count of active instance-level integrations for Mock CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 d2f5d4fe1e3..0e7cee64e47 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_mock_ci_active
description: Count of active projects inheriting integrations for Mock CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 3727a16d08c..4bd419796cd 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_mock_ci_active
description: Count of active groups inheriting integrations for Mock CI
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 59ffe96bc36..b44a007dd38 100644
--- a/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_mock_monitoring_active
description: Count of projects with active integrations for Mock Monitoring
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 2ac5362c37b..c7d70b6fb98 100644
--- a/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_mock_monitoring_active
description: Count of groups with active integrations for Mock Monitoring
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 961d787b203..7971b785633 100644
--- a/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
@@ -4,7 +4,7 @@ key_path: counts.templates_mock_monitoring_active
description: Count of active service templates for Mock Monitoring
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 9f2ece8e9a4..b5949125a90 100644
--- a/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_mock_monitoring_active
description: Count of active instance-level integrations for Mock Monitoring
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 842d4047986..9cd2d8c098a 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
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_mock_monitoring_active
description: Count of active projects inheriting integrations for Mock Monitoring
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 bd8f344bb36..681ee727cd6 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
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_mock_monitoring_active
description: Count of active groups inheriting integrations for Mock Monitoring
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: removed
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 56909d1bb7b..4db8a831afc 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_composer_delete_package
description: A count of Composer packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 9dd401d73a9..cb1e984786c 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_composer_pull_package
description: A count of Composer packages that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 336d177a739..0296f58dfb0 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_composer_push_package
description: A count of Composer packages that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 548b005e9be..7617489c5f4 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_conan_delete_package
description: A count of Conan packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 65b5cd2a1a4..125ef341824 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_conan_pull_package
description: A count of Conan packages that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 8a8cc252b1e..3225658d982 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_conan_push_package
description: A count of Conan packages that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 c20a79a2f29..1a208c53f81 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_container_delete_package
description: A count of container images that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: removed
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 ff3ab7b40cd..db4e4f63fff 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_container_pull_package
description: A count of container images that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: removed
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 2c9d9a391a0..29b93b42dfb 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_container_push_package
description: A count of container images that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: removed
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 e842155ca69..453f55a5e6a 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_debian_delete_package
description: A count of Debian packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 be0e94f8beb..2949e819dff 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_debian_pull_package
description: A count of Debian packages that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 c6f23fe0c80..c71e5d608cf 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_debian_push_package
description: A count of Debian packages that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 988dc7118cb..eeb5198e028 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_delete_package
description: A count of packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 725df820fde..4d688af3908 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 ea88cab3192..9978595cb0a 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 a87126920ce..1e348c18943 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 c8b2f9d61ef..b88a0fe1622 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_generic_delete_package
description: A count of generic packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 af84d46955a..b2bcf1baffe 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_generic_pull_package
description: A count of generic packages that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 55d368c2f6b..54063d11b9f 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_generic_push_package
description: A count of generic packages that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 14d8fc53a7e..0ea0007c525 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_golang_delete_package
description: A count of Go modules that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 65e38c0eb8e..1b68386e3fe 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_golang_pull_package
description: A count of Go modules that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 3b65801378b..be3f7974a44 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_golang_push_package
description: A count of Go modules that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 7505efb4e47..676748442a5 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_maven_delete_package
description: A count of Maven packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 dc5211f9524..f035edcc74c 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_maven_pull_package
description: A count of Maven packages that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 0facf7697a8..92521cc1fda 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_maven_push_package
description: A count of Maven packages that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 dade0515709..24188860b45 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_npm_delete_package
description: A count of npm packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 607db7969cf..5dc94ab61fb 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_npm_pull_package
description: A count of npm packages that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 2aa9a9ac676..0878ec9ade8 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_npm_push_package
description: A count of npm packages that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 78a5f920c0a..bd45f8fd652 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_nuget_delete_package
description: A count of NuGet packages that have been deleted
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 29471d9fc68..e175f9ea64c 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_nuget_pull_package
description: A count of NuGet packages that have been downloaded
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 2074fa19d5a..5e3c4d13177 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_nuget_push_package
description: A count of NuGet packages that have been published
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 0d09c626f2b..b059c11bf40 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 eeb5c150f0f..532546fd7f3 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
@@ -5,7 +5,7 @@ description: A count of packages that have been downloaded from the package regi
using a Deploy Token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 63ec075c163..d402d29612f 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
@@ -5,7 +5,7 @@ description: A count of packages that have been downloaded from the package regi
by a guest
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 ce0c3c455ff..21076556ce4 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
@@ -5,7 +5,7 @@ description: A count of packages that have been downloaded from the package regi
by a user
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 845251f1aca..c9f52de010b 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 4484250f136..cf0c42dce28 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
@@ -5,7 +5,7 @@ description: A count of packages that have been published to the package registr
using a deploy token
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 a657e2f228e..92d31d03faa 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
@@ -5,7 +5,7 @@ description: A count of packages that have been published to the package registr
by a Guest
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 a3e0a65453d..1a3b14e8a0b 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
@@ -5,7 +5,7 @@ description: A count of packages that have been published to the package registr
by a user
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 2c5b6efe160..6c0e86090ae 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 b659a207b00..2512818a4e1 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
@@ -5,7 +5,7 @@ description: A count of Python packages that have been downloaded from the packa
registry
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 33b0819be0b..4234dd52964 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: active
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 7f5dab5e1bc..eef109e87c1 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 6cf631953f6..76923282a40 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
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 dbd553d3ea1..823c81d37c4 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
@@ -4,7 +4,7 @@ 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
product_stage: package
-product_group: group::package
+product_group: package
product_category: package registry
value_type: number
status: removed
diff --git a/config/metrics/counts_all/20210216183023_wiki_pages_view.yml b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
index 16cec4839a5..059087a406d 100644
--- a/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
+++ b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
@@ -4,7 +4,7 @@ key_path: counts.wiki_pages_view
description: Total number of wiki page views
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: wiki
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210216183400_omniauth_providers.yml b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
index a1cfca9019c..f4d6e2bc57b 100644
--- a/config/metrics/counts_all/20210216183400_omniauth_providers.yml
+++ b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.omniauth_providers
description: List of unique OmniAuth providers
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: object
status: active
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 1ddfdd79f5c..15f3003f5d6 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_rubygems_delete_package
description: Total count of RubyGems packages delete events
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 7fd10456636..5c825c76296 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_rubygems_pull_package
description: Total count of pull RubyGems packages events
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 73b2e4a5a25..f8a8fcf8abd 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_rubygems_push_package
description: Total count of push RubyGems packages events
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 91235499c14..df47faec027 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
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.monitor.projects_with_enabled_alert_integratio
description: Histogram (buckets 1 to 100) of projects with at least 1 enabled integration.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: incident_management
value_type: object
status: active
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 cca5b684905..b914a60050d 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_terraform_module_delete_package
description: Total count of Terraform Module packages delete events
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 860bfbe6884..85258f27878 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_terraform_module_pull_package
description: Total count of pull Terraform Module packages events
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 89fcae57044..f8d0643ab3a 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_terraform_module_push_package
description: Total count of push Terraform Module packages events
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: infrastructure_as_code
value_type: number
status: active
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 d0331a65b0b..e07dc348c67 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
@@ -5,7 +5,7 @@ name: "count_active_instance_ci_runners"
description: Total active Shared (Instance) Runners
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 b1a360df561..4b578cecb9d 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
@@ -5,7 +5,7 @@ name: "count_active_group_ci_runners"
description: Total active Group Runners
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 b344f64c250..2e21fdc511e 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
@@ -5,7 +5,7 @@ name: "count_active_project_ci_runners"
description: Total active Specific (Project) Runners
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210502050942_ci_runners_online.yml b/config/metrics/counts_all/20210502050942_ci_runners_online.yml
index d24d7f0125b..455c3e39d4d 100644
--- a/config/metrics/counts_all/20210502050942_ci_runners_online.yml
+++ b/config/metrics/counts_all/20210502050942_ci_runners_online.yml
@@ -5,7 +5,7 @@ name: "counts_online_runners"
description: Total online Runners of all types
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 621590185a9..6a7f1f7c776 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
@@ -5,7 +5,7 @@ name: "count_instance_active_online_ci_runners"
description: Total active and online Shared (Instance) Runners
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 82c639c72c6..2c604235f36 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
@@ -5,7 +5,7 @@ name: "count_group_active_online_ci_runners"
description: Total active and online Group Runners
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
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 f124d8d4ae5..aaedfeaf477 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
@@ -5,7 +5,7 @@ name: "count_project_active_online_ci_runners"
description: Total active and online Specific (Project) Runners
product_section: ops
product_stage: verify
-product_group: group::pipeline execution
+product_group: pipeline_execution
product_category: continuous_integration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210505015532_kubernetes_agent_k8s_api_proxy_request.yml b/config/metrics/counts_all/20210505015532_kubernetes_agent_k8s_api_proxy_request.yml
index a1a49a1a07e..185e8a199b6 100644
--- a/config/metrics/counts_all/20210505015532_kubernetes_agent_k8s_api_proxy_request.yml
+++ b/config/metrics/counts_all/20210505015532_kubernetes_agent_k8s_api_proxy_request.yml
@@ -4,7 +4,7 @@ key_path: counts.kubernetes_agent_k8s_api_proxy_request
description: Count of Kubernetes API proxy requests
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
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 c201b4c79ee..1ce9be56198 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
@@ -5,7 +5,7 @@ name: "count_sent_first_email_of_the_create_track_for_in_product_marketing_email
description: Total sent emails of the create track's first email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 92209dffa2d..98ed67d0910 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_first_email_of_the_create_track_for_in_product_market
description: Total clicks on the create track's first email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 2b849be1c32..67177bce5dd 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
@@ -5,7 +5,7 @@ name: "count_sent_second_email_of_the_create_track_for_in_product_marketing_emai
description: Total sent emails of the create track's second email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 a864858ae3a..c5c057fce25 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_second_email_of_the_create_track_for_in_product_marke
description: Total clicks on the create track's second email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 72a1d56cab2..c25864475c4 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
@@ -5,7 +5,7 @@ name: "count_sent_third_email_of_the_create_track_for_in_product_marketing_email
description: Total sent emails of the create track's third email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 17dcf4286ac..37ec35d95ba 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_third_email_of_the_create_track_for_in_product_market
description: Total clicks on the create track's third email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 c504783a652..59e3aff567d 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
@@ -5,7 +5,7 @@ name: "count_sent_first_email_of_the_verify_track_for_in_product_marketing_email
description: Total sent emails of the verify track's first email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 cb316eb3164..17ca0252a0c 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_first_email_of_the_verify_track_for_in_product_market
description: Total clicks on the verify track's first email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 e4d1e90bb22..dfd8bb11919 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
@@ -5,7 +5,7 @@ name: "count_sent_second_email_of_the_verify_track_for_in_product_marketing_emai
description: Total sent emails of the verify track's second email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 6675c6e9a0b..6c76386456a 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_second_email_of_the_verify_track_for_in_product_marke
description: Total clicks on the verify track's second email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 33c77609b6f..8cc755cc5bf 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
@@ -5,7 +5,7 @@ name: "count_sent_third_email_of_the_verify_track_for_in_product_marketing_email
description: Total sent emails of the verify track's third email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 0cd780b53ed..61940a9e0cb 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_third_email_of_the_verify_track_for_in_product_market
description: Total clicks on the verify track's third email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 70c1e3d1250..cc2a9c29f1f 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
@@ -5,7 +5,7 @@ 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
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 258273438e3..3b4a1f7a88e 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_first_email_of_the_trial_track_for_in_product_marketi
description: Total clicks on the verify trial's first email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 f32440ca1ae..dd7487b6609 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
@@ -5,7 +5,7 @@ name: "count_sent_second_email_of_the_trial_track_for_in_product_marketing_email
description: Total sent emails of the trial track's second email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 0b68b88570c..0dd150778fe 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_second_email_of_the_trial_track_for_in_product_market
description: Total clicks on the trial track's second email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 185d5bb3aee..66610ba34f5 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
@@ -5,7 +5,7 @@ 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
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 f3a54e2ae31..e630c81f53c 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_third_email_of_the_trial_track_for_in_product_marketi
description: Total clicks on the trial track's third email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 07b61f70b2e..b8febff5fcd 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
@@ -5,7 +5,7 @@ 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
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 27d47aff9c3..d90a0f9dbde 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_first_email_of_the_team_track_for_in_product_marketin
description: Total clicks on the team track's first email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 daba149d6c5..84f7d7d28af 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
@@ -5,7 +5,7 @@ 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
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 7bb67a87c75..1abe86f5a89 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_second_email_of_the_team_track_for_in_product_marketi
description: Total clicks on the team track's second email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 aaaecb85e74..ba1530445e8 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
@@ -5,7 +5,7 @@ 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
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
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 0618ca56e89..f9b473aec6c 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
@@ -5,7 +5,7 @@ name: "count_clicks_on_the_third_email_of_the_team_track_for_in_product_marketin
description: Total clicks on the team track's third email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210514141520_project_imports_total.yml b/config/metrics/counts_all/20210514141520_project_imports_total.yml
index 14eac482774..cfd3581c337 100644
--- a/config/metrics/counts_all/20210514141520_project_imports_total.yml
+++ b/config/metrics/counts_all/20210514141520_project_imports_total.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.manage.project_imports.total
description: Number of projects imported
product_section: dev
product_stage: manage
-product_group: group::import
+product_group: import
product_category:
value_type: number
status: active
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 111056238bd..04cc4a17b45 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
@@ -4,7 +4,7 @@ key_path: counts.package_events_i_package_helm_pull_package
description: Total count of pull Helm packages events
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: package_registry
value_type: number
status: active
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 d4b2f57f3a4..720b0dde650 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
@@ -5,12 +5,14 @@ name: "count_sent_first_email_of_the_experience_track_for_in_product_marketing_e
description: Total sent emails of the experience track's first email
product_section: 'TBD'
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
-status: active
+status: removed
milestone: "13.12"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61347
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92280
+milestone_removed: "15.2"
time_frame: all
data_source: database
distribution:
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
index 3752f3c8b2f..c529f1ecb8a 100644
--- 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
@@ -3,7 +3,7 @@ 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_group: package
product_category: package_registry
value_type: number
status: active
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
index 8515a522a60..164cdd477cb 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index 819c53bcc4f..eb9576c864c 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index 7d390649020..712eeb644cc 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index f3e48ba6786..d4ebb18d006 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index c80ddea659f..d84a218e88e 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index 8959af7f70c..b91dfa334a5 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index 35d89b856f3..a6335011ddd 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index f102da96d17..acc00f50744 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index 7e5e63b6a17..16635a5f6a9 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
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
index e45db0aee02..653814c4bf0 100644
--- 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
@@ -4,7 +4,7 @@ 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_group: package
product_category: package registry
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210715094459_releases_with_milestones.yml b/config/metrics/counts_all/20210715094459_releases_with_milestones.yml
index 0be5497e561..a935f1e5829 100644
--- a/config/metrics/counts_all/20210715094459_releases_with_milestones.yml
+++ b/config/metrics/counts_all/20210715094459_releases_with_milestones.yml
@@ -4,7 +4,7 @@ description: Unique users creating releases with milestones associated
performance_indicator_type: []
product_section: ops
product_stage: release
-product_group: 'group::release'
+product_group: 'release'
product_category: Release Orchestration
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210723075525_diff_searches.yml b/config/metrics/counts_all/20210723075525_diff_searches.yml
index 28e1ce927dc..0cce12a8659 100644
--- a/config/metrics/counts_all/20210723075525_diff_searches.yml
+++ b/config/metrics/counts_all/20210723075525_diff_searches.yml
@@ -3,7 +3,7 @@ key_path: counts.diff_searches
description: Total count of merge request diff searches
product_section: dev
product_stage: create
-product_group: group::code review
+product_group: code_review
product_category: code_review
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml b/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml
index 0f0b467ab45..94b3340d1ca 100644
--- a/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml
@@ -4,7 +4,7 @@ name: "count_clicks_on_the_first_email_of_the_team_short_track_for_in_product_ma
description: Total clicks on the team_short track's first email
product_section: growth
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml b/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml
index e60be585be8..dbcd4faf26f 100644
--- a/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml
+++ b/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml
@@ -4,7 +4,7 @@ name: "count_sent_first_email_of_the_team_short_track_for_in_product_marketing_e
description: Total sent emails of the team_short track's first email
product_section: growth
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml b/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml
index a34cc75c09b..a23c977240a 100644
--- a/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml
@@ -4,7 +4,7 @@ name: "count_clicks_on_the_first_email_of_the_trial_short_track_for_in_product_m
description: Total clicks on the trial_short track's first email
product_section: growth
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml b/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml
index 05711afef8f..c24e2f4b6b5 100644
--- a/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml
+++ b/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml
@@ -4,7 +4,7 @@ name: "count_sent_first_email_of_the_trial_short_track_for_in_product_marketing_
description: Total sent emails of the trial_short track's first email
product_section: growth
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml b/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml
index 695fada6670..2a62f9a572f 100644
--- a/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml
@@ -4,7 +4,7 @@ name: "count_clicks_on_the_first_email_of_the_admin_verify_track_for_in_product_
description: Total clicks on the admin_verify track's first email
product_section: growth
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml b/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml
index 8f52a79cc2a..b04c9502a12 100644
--- a/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml
+++ b/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml
@@ -4,7 +4,7 @@ name: "count_sent_first_email_of_the_admin_verify_track_for_in_product_marketing
description: Total sent emails of the admin_verify track's first email
product_section: growth
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210730011801_projects_zentao_active.yml b/config/metrics/counts_all/20210730011801_projects_zentao_active.yml
index 8a9c3f969a0..857e96901a1 100644
--- a/config/metrics/counts_all/20210730011801_projects_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011801_projects_zentao_active.yml
@@ -4,7 +4,7 @@ name: count_all_projects_zentao_active
description: Count of projects with active Zentao integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210730011802_groups_zentao_active.yml b/config/metrics/counts_all/20210730011802_groups_zentao_active.yml
index c8a1dfbbdd2..d0b023c241e 100644
--- a/config/metrics/counts_all/20210730011802_groups_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011802_groups_zentao_active.yml
@@ -4,7 +4,7 @@ name: count_all_groups_zentao_active
description: Count of groups with active Zentao integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210730011804_instances_zentao_active.yml b/config/metrics/counts_all/20210730011804_instances_zentao_active.yml
index b1c2a9d8b13..89532a91d52 100644
--- a/config/metrics/counts_all/20210730011804_instances_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011804_instances_zentao_active.yml
@@ -4,7 +4,7 @@ name: count_all_instances_zentao_active
description: Count of instances with active Zentao integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml b/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml
index 34c48ada0ee..054714f5c42 100644
--- a/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml
@@ -4,7 +4,7 @@ name: count_all_projects_inheriting_zentao_active
description: Count of projects that inherit active Zentao integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml b/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml
index 4d374db026e..ce6797e5114 100644
--- a/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml
@@ -4,7 +4,7 @@ name: count_all_groups_inheriting_zentao_active
description: Count of groups that inherit active Zentao integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml b/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml
index bb79aa07e86..98ac9ace52f 100644
--- a/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml
+++ b/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml
@@ -4,7 +4,7 @@ name: count_distinct_users_using_two_factor_authentication
description: Number of unique user logins using two factor authentication for available providers
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: object
status: active
diff --git a/config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml b/config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml
index 1a9fe349a90..276b1c97e0c 100644
--- a/config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml
+++ b/config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml
@@ -5,7 +5,7 @@ description: A count of projects with the cleanup policy set delete tags older t
60 days
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml
index 43b71ec1c8a..5c3fc71f564 100644
--- a/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml
@@ -4,7 +4,7 @@ name: count_groups_gitlab_slack_application_active
description: Count groups with active slack application
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml
index 13954e6d01b..a3fac680dbf 100644
--- a/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml
@@ -4,7 +4,7 @@ name: count_project_gitlab_slack_application_active
description: Count projects with active slack application
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml
index 43ea3d2d6e6..a4908a2a8e1 100644
--- a/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml
@@ -4,7 +4,7 @@ name: count_instances_gitlab_slack_application_active
description: Count instances with active slack application
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml b/config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml
index 2e17c5d261b..fd4a833b2b3 100644
--- a/config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml
+++ b/config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml
@@ -4,7 +4,7 @@ key_path: counts.clusters_integrations_prometheus
description: Total clusters with Clusters::Integrations::Prometheus enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml b/config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml
index 54437cfbf36..72183cdf8ac 100644
--- a/config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml
+++ b/config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml
@@ -4,10 +4,10 @@ key_path: counts.clusters_integrations_elastic_stack
description: Total clusters with Clusters::Integrations::ElasticStack enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,5 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "14.4"
+milestone_removed: "15.2"
+removed_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90699"
diff --git a/config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml b/config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml
index d0baa4d0751..47928eee9cb 100644
--- a/config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml
+++ b/config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml
@@ -4,7 +4,7 @@ key_path: usage_activity_by_stage.monitor.clusters_integrations_prometheus
description: Users creating clusters with Prometheus integration enabled in last 28 days.
product_section: ops
product_stage: monitor
-product_group: group::monitor
+product_group: monitor
product_category: metrics
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
index 70dc230ac85..f5d10688fec 100644
--- a/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
@@ -4,7 +4,7 @@ name: count_groups_inheriting_gitlab_slack_application_active
description: Count groups inheriting active slack application
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
index 29781313d61..17bb5b34247 100644
--- a/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
@@ -4,7 +4,7 @@ name: count_project_inheriting_gitlab_slack_application_active
description: Count projects inheriting active slack application
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20211028210001_projects_shimo_active.yml b/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
index b6b11407c6a..3d7f04a9f82 100644
--- a/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
@@ -4,7 +4,7 @@ name: count_all_projects_shimo_active
description: Count of projects with active Shimo integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20211028210002_groups_shimo_active.yml b/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
index 3f2423f7696..641d40aa1fd 100644
--- a/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
@@ -4,7 +4,7 @@ name: count_all_groups_shimo_active
description: Count of groups with active Shimo integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20211028210003_instances_shimo_active.yml b/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
index 2b835ef6d6c..e9b77835ca4 100644
--- a/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
@@ -4,7 +4,7 @@ name: count_all_instances_shimo_active
description: Count of instances with active Shimo integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml b/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
index d7d231206d5..7693de6b2f2 100644
--- a/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
@@ -4,7 +4,7 @@ name: count_all_projects_inheriting_shimo_active
description: Count of projects that inherit active Shimo integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml b/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
index d979e672f60..b81747fee78 100644
--- a/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
@@ -4,7 +4,7 @@ name: count_all_groups_inheriting_shimo_active
description: Count of groups that inherit active Shimo integrations
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20220122022215_web_ide_previews_success.yml b/config/metrics/counts_all/20220122022215_web_ide_previews_success.yml
index 4042e892a61..203201e9174 100644
--- a/config/metrics/counts_all/20220122022215_web_ide_previews_success.yml
+++ b/config/metrics/counts_all/20220122022215_web_ide_previews_success.yml
@@ -4,7 +4,7 @@ key_path: counts.web_ide_previews_success
description: Count of Live Preview tab successful initializations in the Web IDE
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: web_ide
value_type: number
status: active
diff --git a/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml b/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml
index 0174f9a6222..1b26202c5ef 100644
--- a/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml
+++ b/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml
@@ -2,10 +2,10 @@
key_path: counts.service_usage_data_download_payload_click
description: Count Download Payload button clicks
data_category: optional
-name: count_promoted_issues
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+name: service_usage_data_download_payload_click
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: number
status: active
diff --git a/config/metrics/counts_all/20220315180122_projects_harbor_active.yml b/config/metrics/counts_all/20220315180122_projects_harbor_active.yml
index 90bdad02b8b..ff28b7df17f 100644
--- a/config/metrics/counts_all/20220315180122_projects_harbor_active.yml
+++ b/config/metrics/counts_all/20220315180122_projects_harbor_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_harbor_active
description: Count of projects with active integrations for Harbor
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20220315180124_groups_harbor_active.yml b/config/metrics/counts_all/20220315180124_groups_harbor_active.yml
index 6fc8d9a8ec2..79614c925d1 100644
--- a/config/metrics/counts_all/20220315180124_groups_harbor_active.yml
+++ b/config/metrics/counts_all/20220315180124_groups_harbor_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_harbor_active
description: Count of groups with active integrations for Harbor
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20220315180127_instances_harbor_active.yml b/config/metrics/counts_all/20220315180127_instances_harbor_active.yml
index a5621da5390..b865a905c0b 100644
--- a/config/metrics/counts_all/20220315180127_instances_harbor_active.yml
+++ b/config/metrics/counts_all/20220315180127_instances_harbor_active.yml
@@ -4,7 +4,7 @@ key_path: counts.instances_harbor_active
description: Count of active instance-level integrations for Harbor
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20220315180129_projects_inheriting_harbor_active.yml b/config/metrics/counts_all/20220315180129_projects_inheriting_harbor_active.yml
index 97c31b331aa..375f3b9a0b3 100644
--- a/config/metrics/counts_all/20220315180129_projects_inheriting_harbor_active.yml
+++ b/config/metrics/counts_all/20220315180129_projects_inheriting_harbor_active.yml
@@ -4,7 +4,7 @@ key_path: counts.projects_inheriting_harbor_active
description: Count of active projects inheriting integrations for Harbor
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/counts_all/20220315180131_groups_inheriting_harbor_active.yml b/config/metrics/counts_all/20220315180131_groups_inheriting_harbor_active.yml
index 7091a87632f..6e216121414 100644
--- a/config/metrics/counts_all/20220315180131_groups_inheriting_harbor_active.yml
+++ b/config/metrics/counts_all/20220315180131_groups_inheriting_harbor_active.yml
@@ -4,7 +4,7 @@ key_path: counts.groups_inheriting_harbor_active
description: Count of active groups inheriting integrations for Harbor
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: number
status: active
diff --git a/config/metrics/license/20210201124932_recorded_at.yml b/config/metrics/license/20210201124932_recorded_at.yml
index 59388f5bb20..c9d98a96727 100644
--- a/config/metrics/license/20210201124932_recorded_at.yml
+++ b/config/metrics/license/20210201124932_recorded_at.yml
@@ -2,9 +2,9 @@
data_category: standard
key_path: recorded_at
description: When the Usage Ping computation was started
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/license/20210201124933_uuid.yml b/config/metrics/license/20210201124933_uuid.yml
index 11cb6ac1411..f864c2be37a 100644
--- a/config/metrics/license/20210201124933_uuid.yml
+++ b/config/metrics/license/20210201124933_uuid.yml
@@ -1,9 +1,9 @@
---
key_path: uuid
description: GitLab instance unique identifier
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/license/20210204124827_hostname.yml b/config/metrics/license/20210204124827_hostname.yml
index 4496f158ea1..f545ae0c061 100644
--- a/config/metrics/license/20210204124827_hostname.yml
+++ b/config/metrics/license/20210204124827_hostname.yml
@@ -1,9 +1,9 @@
---
key_path: hostname
description: Host name of GitLab instance
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/license/20210204124829_active_user_count.yml b/config/metrics/license/20210204124829_active_user_count.yml
index e4347ebef9d..037ac7b5a03 100644
--- a/config/metrics/license/20210204124829_active_user_count.yml
+++ b/config/metrics/license/20210204124829_active_user_count.yml
@@ -1,9 +1,9 @@
---
key_path: active_user_count
description: The number of active users existing in the instance. This is named the instance_user_count in the Versions application.
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: number
status: active
diff --git a/config/metrics/license/20210204124928_version.yml b/config/metrics/license/20210204124928_version.yml
index de081d10cff..77cfcc38204 100644
--- a/config/metrics/license/20210204124928_version.yml
+++ b/config/metrics/license/20210204124928_version.yml
@@ -4,7 +4,7 @@ key_path: gitaly.version
description: Version of Gitaly
product_section: dev
product_stage: create
-product_group: group::gitaly
+product_group: gitaly
product_category: gitaly
value_type: string
status: active
diff --git a/config/metrics/license/20210204124936_pages_version.yml b/config/metrics/license/20210204124936_pages_version.yml
index 878134574e2..c056ca97ed0 100644
--- a/config/metrics/license/20210204124936_pages_version.yml
+++ b/config/metrics/license/20210204124936_pages_version.yml
@@ -4,7 +4,7 @@ key_path: gitlab_pages.version
description: The version number of GitLab Pages
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: pages
value_type: string
status: active
diff --git a/config/metrics/license/20210204124938_recording_ce_finished_at.yml b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
index 02521e8bd2c..54728ff8206 100644
--- a/config/metrics/license/20210204124938_recording_ce_finished_at.yml
+++ b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
@@ -2,9 +2,9 @@
data_category: standard
key_path: recording_ce_finished_at
description: When the core features were computed
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/license/20210216175601_version.yml b/config/metrics/license/20210216175601_version.yml
index a6af4ff2c9b..3eb94445513 100644
--- a/config/metrics/license/20210216175601_version.yml
+++ b/config/metrics/license/20210216175601_version.yml
@@ -4,7 +4,7 @@ key_path: version
description: Version of GitLab instance
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/license/20210216175602_installation_type.yml b/config/metrics/license/20210216175602_installation_type.yml
index d19405549d6..9c3abd0131f 100644
--- a/config/metrics/license/20210216175602_installation_type.yml
+++ b/config/metrics/license/20210216175602_installation_type.yml
@@ -4,7 +4,7 @@ key_path: installation_type
description: The installation method used to install GitLab (Omnibus, Helm, etc)
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/license/20210216181053_version.yml b/config/metrics/license/20210216181053_version.yml
index d6e6ea1c0e0..36920d7c895 100644
--- a/config/metrics/license/20210216181053_version.yml
+++ b/config/metrics/license/20210216181053_version.yml
@@ -4,7 +4,7 @@ key_path: container_registry_server.version
description: Identifies the version of the external registry being used
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: number
status: active
diff --git a/config/metrics/license/20210216183237_version.yml b/config/metrics/license/20210216183237_version.yml
index 8d00f03f52b..3303d8fbdef 100644
--- a/config/metrics/license/20210216183237_version.yml
+++ b/config/metrics/license/20210216183237_version.yml
@@ -4,7 +4,7 @@ key_path: git.version
description: Information about Git version
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category: ''
value_type: object
value_json_schema: 'config/metrics/objects_schemas/git_version_schema.json'
diff --git a/config/metrics/schema.json b/config/metrics/schema.json
index bb024eac8c1..8991385b714 100644
--- a/config/metrics/schema.json
+++ b/config/metrics/schema.json
@@ -19,7 +19,8 @@
"type": ["string"]
},
"product_group": {
- "type": "string"
+ "type": "string",
+ "pattern": "^$|^([a-z]+_)*[a-z]+$"
},
"product_category": {
"type": ["string", "null"]
diff --git a/config/metrics/settings/20210201124935_database_adapter.yml b/config/metrics/settings/20210201124935_database_adapter.yml
index a127b2b70dd..335f8eb15ac 100644
--- a/config/metrics/settings/20210201124935_database_adapter.yml
+++ b/config/metrics/settings/20210201124935_database_adapter.yml
@@ -6,7 +6,7 @@ description: This metric only returns a value of PostgreSQL in supported version
supported.
product_section: enablement
product_stage: enablement
-product_group: group::enablement distribution
+product_group: enablement_distribution
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
index f0bcf95871a..a5406c43c4b 100644
--- a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
+++ b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
@@ -4,7 +4,7 @@ key_path: instance_auto_devops_enabled
description: Whether auto DevOps is enabled
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category: auto_devops
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124858_container_registry_enabled.yml b/config/metrics/settings/20210204124858_container_registry_enabled.yml
index 1fdee829b84..de5f181216b 100644
--- a/config/metrics/settings/20210204124858_container_registry_enabled.yml
+++ b/config/metrics/settings/20210204124858_container_registry_enabled.yml
@@ -4,7 +4,7 @@ key_path: container_registry_enabled
description: A count of projects where the container registry is enabled
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
index 694bb4b08bd..3ed4fa06c05 100644
--- a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
+++ b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
@@ -4,7 +4,7 @@ key_path: dependency_proxy_enabled
description: A count of projects where the dependency proxy is enabled
product_section: ops
product_stage: package
-product_group: group::package
+product_group: package
product_category: container registry
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
index c58b3a8c8d5..8c92609ca26 100644
--- a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
+++ b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
@@ -4,7 +4,7 @@ key_path: gitlab_shared_runners_enabled
description: Whether shared runners is enabled
product_section: ops
product_stage: verify
-product_group: group::runner
+product_group: runner
product_category: runner
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124904_gravatar_enabled.yml b/config/metrics/settings/20210204124904_gravatar_enabled.yml
index a6997b74c3c..ec7495cfbe5 100644
--- a/config/metrics/settings/20210204124904_gravatar_enabled.yml
+++ b/config/metrics/settings/20210204124904_gravatar_enabled.yml
@@ -4,7 +4,7 @@ key_path: gravatar_enabled
description: Whether gravatar is enabled
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: users
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124906_ldap_enabled.yml b/config/metrics/settings/20210204124906_ldap_enabled.yml
index 8f44f0c9de5..2c506cb40fc 100644
--- a/config/metrics/settings/20210204124906_ldap_enabled.yml
+++ b/config/metrics/settings/20210204124906_ldap_enabled.yml
@@ -4,7 +4,7 @@ key_path: ldap_enabled
description: Whether LDAP is enabled
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124908_mattermost_enabled.yml b/config/metrics/settings/20210204124908_mattermost_enabled.yml
index cc00b3b9da2..c269fe6edd4 100644
--- a/config/metrics/settings/20210204124908_mattermost_enabled.yml
+++ b/config/metrics/settings/20210204124908_mattermost_enabled.yml
@@ -4,7 +4,7 @@ key_path: mattermost_enabled
description: Whether Mattermost is enabled
product_section: dev
product_stage: ecosystem
-product_group: group::integrations
+product_group: integrations
product_category: integrations
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124910_omniauth_enabled.yml b/config/metrics/settings/20210204124910_omniauth_enabled.yml
index 8932b275f38..83ea666a331 100644
--- a/config/metrics/settings/20210204124910_omniauth_enabled.yml
+++ b/config/metrics/settings/20210204124910_omniauth_enabled.yml
@@ -4,7 +4,7 @@ key_path: omniauth_enabled
description: Whether OmniAuth is enabled
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124912_prometheus_enabled.yml b/config/metrics/settings/20210204124912_prometheus_enabled.yml
index e19d5ff781a..dbbd2b74970 100644
--- a/config/metrics/settings/20210204124912_prometheus_enabled.yml
+++ b/config/metrics/settings/20210204124912_prometheus_enabled.yml
@@ -2,10 +2,9 @@
data_category: operational
key_path: prometheus_enabled
description: Whether the bundled Prometheus is enabled
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
-product_category: collection
+product_section: ops
+product_stage: monitor
+product_group: respond
value_type: boolean
status: active
time_frame: none
diff --git a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
index 5b1447a58e8..197ea408f73 100644
--- a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
+++ b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
@@ -2,10 +2,9 @@
data_category: operational
key_path: prometheus_metrics_enabled
description: Whether Prometheus Metrics endpoint is enabled
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
-product_category: collection
+product_section: ops
+product_stage: monitor
+product_group: respond
value_type: boolean
status: active
time_frame: none
diff --git a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
index c9d223c8c58..b003b2d8c19 100644
--- a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
+++ b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
@@ -4,7 +4,7 @@ key_path: reply_by_email_enabled
description: Whether incoming email is setup
product_section: dev
product_stage: plan
-product_group: group::certify
+product_group: certify
product_category: collection
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124918_signup_enabled.yml b/config/metrics/settings/20210204124918_signup_enabled.yml
index 4fa464fa5c7..df7f03a7d2e 100644
--- a/config/metrics/settings/20210204124918_signup_enabled.yml
+++ b/config/metrics/settings/20210204124918_signup_enabled.yml
@@ -4,7 +4,7 @@ key_path: signup_enabled
description: Whether public signup is enabled
product_section: dev
product_stage: manage
-product_group: group::authentication and authorization
+product_group: authentication_and_authorization
product_category: authentication_and_authorization
value_type: boolean
status: active
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 9bc2a90fc1d..ba19088442f 100644
--- a/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
+++ b/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
@@ -4,7 +4,7 @@ key_path: web_ide_clientside_preview_enabled
description: Whether Web IDE clientside preview is enabled
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: collection
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124922_grafana_link_enabled.yml b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
index d636f00312d..104f991e96f 100644
--- a/config/metrics/settings/20210204124922_grafana_link_enabled.yml
+++ b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
@@ -2,9 +2,9 @@
data_category: optional
key_path: grafana_link_enabled
description: Whether Grafana is enabled
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: ops
+product_stage: monitor
+product_group: respond
product_category: collection
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210204124934_pages_enabled.yml b/config/metrics/settings/20210204124934_pages_enabled.yml
index e267bd7109b..1535932b559 100644
--- a/config/metrics/settings/20210204124934_pages_enabled.yml
+++ b/config/metrics/settings/20210204124934_pages_enabled.yml
@@ -4,7 +4,7 @@ key_path: gitlab_pages.enabled
description: Whether GitLab Pages is enabled
product_section: ops
product_stage: release
-product_group: group::release
+product_group: release
product_category: collection
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216174829_smtp_server.yml b/config/metrics/settings/20210216174829_smtp_server.yml
index c1e4d77bc6c..8d126e75ac0 100644
--- a/config/metrics/settings/20210216174829_smtp_server.yml
+++ b/config/metrics/settings/20210216174829_smtp_server.yml
@@ -4,7 +4,7 @@ key_path: mail.smtp_server
description: The value of the SMTP server that is used
product_section: growth
product_stage: growth
-product_group: group::activation
+product_group: activation
product_category: onboarding
value_type: number
status: active
diff --git a/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
index 9bf0277363f..afd8478ae1c 100644
--- a/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
+++ b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
@@ -4,7 +4,7 @@ key_path: ingress_modsecurity_enabled
description: Whether or not ModSecurity is enabled within Ingress
product_section: sec
product_stage: protect
-product_group: group::container security
+product_group: container_security
product_category: web_firewall
value_type: boolean
status: removed
diff --git a/config/metrics/settings/20210216175604_edition.yml b/config/metrics/settings/20210216175604_edition.yml
index 9a586f0c78b..a8d363796ed 100644
--- a/config/metrics/settings/20210216175604_edition.yml
+++ b/config/metrics/settings/20210216175604_edition.yml
@@ -4,7 +4,7 @@ key_path: edition
description: Edition of GitLab such as EE or CE
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
index 046811b8686..b1eee864e24 100644
--- a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
+++ b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
@@ -4,7 +4,7 @@ key_path: settings.ldap_encrypted_secrets_enabled
description: Is encrypted LDAP secrets configured?
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category: global_search
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216175609_version.yml b/config/metrics/settings/20210216175609_version.yml
index 136b8fed4ff..24637178a2a 100644
--- a/config/metrics/settings/20210216175609_version.yml
+++ b/config/metrics/settings/20210216175609_version.yml
@@ -4,7 +4,7 @@ key_path: database.version
description: The version of the PostgreSQL database.
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/settings/20210216180314_gitpod_enabled.yml b/config/metrics/settings/20210216180314_gitpod_enabled.yml
index 15a747fdffb..73ba2dd01fd 100644
--- a/config/metrics/settings/20210216180314_gitpod_enabled.yml
+++ b/config/metrics/settings/20210216180314_gitpod_enabled.yml
@@ -4,7 +4,7 @@ key_path: gitpod_enabled
description: Whether Gitpod is enabled in the instance
product_section: dev
product_stage: create
-product_group: group::editor
+product_group: editor
product_category: integrations
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180836_enabled.yml b/config/metrics/settings/20210216180836_enabled.yml
index 12eae478add..a52473734eb 100644
--- a/config/metrics/settings/20210216180836_enabled.yml
+++ b/config/metrics/settings/20210216180836_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.artifacts.enabled
description: Whether Object Storage is enabled for Artifacts
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180838_enabled.yml b/config/metrics/settings/20210216180838_enabled.yml
index da6dd5fce62..68a466ebf0a 100644
--- a/config/metrics/settings/20210216180838_enabled.yml
+++ b/config/metrics/settings/20210216180838_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.artifacts.object_store.enabled
description: Whether Object Storage is enabled for Artifacts
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180840_direct_upload.yml b/config/metrics/settings/20210216180840_direct_upload.yml
index 279b9472364..242add8c15b 100644
--- a/config/metrics/settings/20210216180840_direct_upload.yml
+++ b/config/metrics/settings/20210216180840_direct_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.artifacts.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for Artifacts
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180841_background_upload.yml b/config/metrics/settings/20210216180841_background_upload.yml
index 829e20e2405..e9d9d475b06 100644
--- a/config/metrics/settings/20210216180841_background_upload.yml
+++ b/config/metrics/settings/20210216180841_background_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.artifacts.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for Artifacts
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180843_provider.yml b/config/metrics/settings/20210216180843_provider.yml
index 848e0669b73..bdb58fff347 100644
--- a/config/metrics/settings/20210216180843_provider.yml
+++ b/config/metrics/settings/20210216180843_provider.yml
@@ -4,7 +4,7 @@ key_path: object_store.artifacts.object_store.provider
description: What Object Storage provider has been configured for Artifacts
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: string
status: active
diff --git a/config/metrics/settings/20210216180845_enabled.yml b/config/metrics/settings/20210216180845_enabled.yml
index d5e42959871..f712d4fd306 100644
--- a/config/metrics/settings/20210216180845_enabled.yml
+++ b/config/metrics/settings/20210216180845_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.external_diffs.enabled
description: Whether Object Storage is enabled for External Diffs
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180847_enabled.yml b/config/metrics/settings/20210216180847_enabled.yml
index 49c8c887ccc..128418f4bd3 100644
--- a/config/metrics/settings/20210216180847_enabled.yml
+++ b/config/metrics/settings/20210216180847_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.external_diffs.object_store.enabled
description: Whether Object Storage is enabled for External Diffs
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180849_direct_upload.yml b/config/metrics/settings/20210216180849_direct_upload.yml
index d91e033ee4a..e1865f244e9 100644
--- a/config/metrics/settings/20210216180849_direct_upload.yml
+++ b/config/metrics/settings/20210216180849_direct_upload.yml
@@ -4,7 +4,7 @@ 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
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180851_background_upload.yml b/config/metrics/settings/20210216180851_background_upload.yml
index 76dc5007857..b7a0d328b8b 100644
--- a/config/metrics/settings/20210216180851_background_upload.yml
+++ b/config/metrics/settings/20210216180851_background_upload.yml
@@ -5,7 +5,7 @@ description: Whether Background Upload for Object Storage is enabled for Externa
Diffs
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180852_provider.yml b/config/metrics/settings/20210216180852_provider.yml
index 01cd2a43ff2..c6d09c82480 100644
--- a/config/metrics/settings/20210216180852_provider.yml
+++ b/config/metrics/settings/20210216180852_provider.yml
@@ -4,7 +4,7 @@ key_path: object_store.external_diffs.object_store.provider
description: What Object Storage provider has been configured for External Diffs
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: string
status: active
diff --git a/config/metrics/settings/20210216180854_enabled.yml b/config/metrics/settings/20210216180854_enabled.yml
index bf0ec99486b..a4fca5e347b 100644
--- a/config/metrics/settings/20210216180854_enabled.yml
+++ b/config/metrics/settings/20210216180854_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.lfs.enabled
description: Whether Object Storage is enabled for LFS
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180856_enabled.yml b/config/metrics/settings/20210216180856_enabled.yml
index a21b8f0eb15..05c390c0040 100644
--- a/config/metrics/settings/20210216180856_enabled.yml
+++ b/config/metrics/settings/20210216180856_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.lfs.object_store.enabled
description: Whether Object Storage is enabled for LFS
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180858_direct_upload.yml b/config/metrics/settings/20210216180858_direct_upload.yml
index 85619adc8f2..8cdfd1844b8 100644
--- a/config/metrics/settings/20210216180858_direct_upload.yml
+++ b/config/metrics/settings/20210216180858_direct_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.lfs.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for LFS
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180900_background_upload.yml b/config/metrics/settings/20210216180900_background_upload.yml
index 959ae65306d..ed6931dd443 100644
--- a/config/metrics/settings/20210216180900_background_upload.yml
+++ b/config/metrics/settings/20210216180900_background_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.lfs.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for LFS
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180902_provider.yml b/config/metrics/settings/20210216180902_provider.yml
index 50b88f893ee..40a39acc8fd 100644
--- a/config/metrics/settings/20210216180902_provider.yml
+++ b/config/metrics/settings/20210216180902_provider.yml
@@ -4,7 +4,7 @@ key_path: object_store.lfs.object_store.provider
description: What Object Storage provider has been configured for LFS
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: string
status: active
diff --git a/config/metrics/settings/20210216180903_enabled.yml b/config/metrics/settings/20210216180903_enabled.yml
index 759fdeeba93..3e3f1ec17dc 100644
--- a/config/metrics/settings/20210216180903_enabled.yml
+++ b/config/metrics/settings/20210216180903_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.uploads.enabled
description: Whether Object Storage is enabled for Uploads
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: string
status: active
diff --git a/config/metrics/settings/20210216180905_enabled.yml b/config/metrics/settings/20210216180905_enabled.yml
index b71472488b1..7e35d718dd3 100644
--- a/config/metrics/settings/20210216180905_enabled.yml
+++ b/config/metrics/settings/20210216180905_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.uploads.object_store.enabled
description: Whether Object Storage is enabled for Uploads
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180907_direct_upload.yml b/config/metrics/settings/20210216180907_direct_upload.yml
index b5e702462ec..53f3e2a7022 100644
--- a/config/metrics/settings/20210216180907_direct_upload.yml
+++ b/config/metrics/settings/20210216180907_direct_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.uploads.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for Uploads
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180909_background_upload.yml b/config/metrics/settings/20210216180909_background_upload.yml
index e4800ee74a7..c18a22d1634 100644
--- a/config/metrics/settings/20210216180909_background_upload.yml
+++ b/config/metrics/settings/20210216180909_background_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.uploads.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for Uploads
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180911_provider.yml b/config/metrics/settings/20210216180911_provider.yml
index c0e69fe0646..ba3f68dab4d 100644
--- a/config/metrics/settings/20210216180911_provider.yml
+++ b/config/metrics/settings/20210216180911_provider.yml
@@ -4,7 +4,7 @@ key_path: object_store.uploads.object_store.provider
description: What Object Storage provider has been configured for Uploads
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: string
status: active
diff --git a/config/metrics/settings/20210216180913_enabled.yml b/config/metrics/settings/20210216180913_enabled.yml
index 9411f1cacf8..7c91a7cbe5b 100644
--- a/config/metrics/settings/20210216180913_enabled.yml
+++ b/config/metrics/settings/20210216180913_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.packages.enabled
description: Whether Object Storage is enabled for Uploads
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180915_enabled.yml b/config/metrics/settings/20210216180915_enabled.yml
index 34649634deb..ae465ef80b3 100644
--- a/config/metrics/settings/20210216180915_enabled.yml
+++ b/config/metrics/settings/20210216180915_enabled.yml
@@ -4,7 +4,7 @@ key_path: object_store.packages.object_store.enabled
description: Whether Object Storage is enabled for Packages
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180916_direct_upload.yml b/config/metrics/settings/20210216180916_direct_upload.yml
index 3f5d354baa1..8628e5aeda9 100644
--- a/config/metrics/settings/20210216180916_direct_upload.yml
+++ b/config/metrics/settings/20210216180916_direct_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.packages.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for Packages
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180918_background_upload.yml b/config/metrics/settings/20210216180918_background_upload.yml
index d2e630e2a17..940273ff972 100644
--- a/config/metrics/settings/20210216180918_background_upload.yml
+++ b/config/metrics/settings/20210216180918_background_upload.yml
@@ -4,7 +4,7 @@ key_path: object_store.packages.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for Packages
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: boolean
status: active
diff --git a/config/metrics/settings/20210216180920_provider.yml b/config/metrics/settings/20210216180920_provider.yml
index 6de7aed8801..88fd70061db 100644
--- a/config/metrics/settings/20210216180920_provider.yml
+++ b/config/metrics/settings/20210216180920_provider.yml
@@ -4,7 +4,7 @@ key_path: object_store.packages.object_store.provider
description: What Object Storage provider has been configured for Packages
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category: memory
value_type: string
status: active
diff --git a/config/metrics/settings/20210216183241_filesystems.yml b/config/metrics/settings/20210216183241_filesystems.yml
index 216ca790638..b0df7200270 100644
--- a/config/metrics/settings/20210216183241_filesystems.yml
+++ b/config/metrics/settings/20210216183241_filesystems.yml
@@ -4,7 +4,7 @@ key_path: gitaly.filesystems
description: Filesystem data for Gitaly installations
product_section: dev
product_stage: create
-product_group: group::gitaly
+product_group: gitaly
product_category: gitaly
value_type: string
status: active
diff --git a/config/metrics/settings/20210216183248_pg_system_id.yml b/config/metrics/settings/20210216183248_pg_system_id.yml
index a96994f9de6..a466872922e 100644
--- a/config/metrics/settings/20210216183248_pg_system_id.yml
+++ b/config/metrics/settings/20210216183248_pg_system_id.yml
@@ -4,7 +4,7 @@ key_path: database.pg_system_id
description: TBD
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category:
value_type: number
status: active
diff --git a/config/metrics/settings/20210225045628_operating_system.yml b/config/metrics/settings/20210225045628_operating_system.yml
index 3db6412cc13..5eeb45ea062 100644
--- a/config/metrics/settings/20210225045628_operating_system.yml
+++ b/config/metrics/settings/20210225045628_operating_system.yml
@@ -4,7 +4,7 @@ key_path: settings.operating_system
description: Information about the operating system running GitLab
product_section: enablement
product_stage: enablement
-product_group: group::distribution
+product_group: distribution
product_category: collection
value_type: string
status: active
diff --git a/config/metrics/settings/20210321224827_gitaly_apdex.yml b/config/metrics/settings/20210321224827_gitaly_apdex.yml
index 6d5204f61bf..101c94157eb 100644
--- a/config/metrics/settings/20210321224827_gitaly_apdex.yml
+++ b/config/metrics/settings/20210321224827_gitaly_apdex.yml
@@ -4,7 +4,7 @@ key_path: settings.gitaly_apdex
description: Gitaly application performance
product_section: dev
product_stage: create
-product_group: group::gitaly
+product_group: gitaly
product_category: gitaly
value_type: number
status: active
diff --git a/config/metrics/settings/20210323120839_topology.yml b/config/metrics/settings/20210323120839_topology.yml
index d07de69e530..6cd6e91d2c4 100644
--- a/config/metrics/settings/20210323120839_topology.yml
+++ b/config/metrics/settings/20210323120839_topology.yml
@@ -4,7 +4,7 @@ key_path: topology
description: Topology data
product_section: enablement
product_stage: enablement
-product_group: group::memory
+product_group: memory
product_category:
value_type: object
status: active
diff --git a/config/metrics/settings/20210702140138_collected_data_categories.yml b/config/metrics/settings/20210702140138_collected_data_categories.yml
index 27262af8aa5..006a77f8b29 100644
--- a/config/metrics/settings/20210702140138_collected_data_categories.yml
+++ b/config/metrics/settings/20210702140138_collected_data_categories.yml
@@ -2,9 +2,9 @@
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_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: object
status: active
diff --git a/config/metrics/settings/20210915152326_service_ping_features_enabled.yml b/config/metrics/settings/20210915152326_service_ping_features_enabled.yml
index 41101f0ff9d..d7e1a7f68bf 100644
--- a/config/metrics/settings/20210915152326_service_ping_features_enabled.yml
+++ b/config/metrics/settings/20210915152326_service_ping_features_enabled.yml
@@ -2,9 +2,9 @@
key_path: settings.service_ping_features_enabled
name: "service_ping_features_enabled"
description: Whether Service Ping features are enabled
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: collection
value_type: boolean
status: active
diff --git a/config/metrics/settings/20211124061450_snowplow_enabled.yml b/config/metrics/settings/20211124061450_snowplow_enabled.yml
index ae947115704..14662665cf7 100644
--- a/config/metrics/settings/20211124061450_snowplow_enabled.yml
+++ b/config/metrics/settings/20211124061450_snowplow_enabled.yml
@@ -2,9 +2,9 @@
key_path: settings.snowplow_enabled
name: snowplow_enabled_gitlab_instance
description: Whether snowplow is enabled for the GitLab instance
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: product intelligence
value_type: boolean
status: active
diff --git a/config/metrics/settings/20211124085521_snowplow_configured_to_gitlab_collector_hostname.yml b/config/metrics/settings/20211124085521_snowplow_configured_to_gitlab_collector_hostname.yml
index 4dff0b2af2f..c634facdd92 100644
--- a/config/metrics/settings/20211124085521_snowplow_configured_to_gitlab_collector_hostname.yml
+++ b/config/metrics/settings/20211124085521_snowplow_configured_to_gitlab_collector_hostname.yml
@@ -2,9 +2,9 @@
key_path: settings.snowplow_configured_to_gitlab_collector
name: snowplow_configured_to_gitlab_collector
description: Metric informs if currently configured Snowplow collector hostname points towards Gitlab Snowplow collection pipeline.
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
+product_section: analytics
+product_stage: analytics
+product_group: product_intelligence
product_category: product intelligence
value_type: boolean
status: active
diff --git a/config/metrics/settings/20211201012652_flavor.yml b/config/metrics/settings/20211201012652_flavor.yml
index 3a409424eef..8148ad7ad89 100644
--- a/config/metrics/settings/20211201012652_flavor.yml
+++ b/config/metrics/settings/20211201012652_flavor.yml
@@ -6,7 +6,7 @@ description: What PostgreSQL flavor is being used. Possible values are
or "null".
product_section: enablement
product_stage: enablement
-product_group: group::database
+product_group: database
product_category: database
value_type: string
status: active
diff --git a/config/metrics/settings/20220222181654_certificate_based_clusters_ff.yml b/config/metrics/settings/20220222181654_certificate_based_clusters_ff.yml
index 6e17601e76d..f331aab7882 100644
--- a/config/metrics/settings/20220222181654_certificate_based_clusters_ff.yml
+++ b/config/metrics/settings/20220222181654_certificate_based_clusters_ff.yml
@@ -4,7 +4,7 @@ name: "certificate_based_clusters_ff"
description: "Certificate-based clusters feature flag"
product_section: ops
product_stage: configure
-product_group: group::configure
+product_group: configure
product_category:
value_type: boolean
status: active
diff --git a/config/puma.example.development.rb b/config/puma.example.development.rb
index ad33250011e..3164ffe3ef4 100644
--- a/config/puma.example.development.rb
+++ b/config/puma.example.development.rb
@@ -54,7 +54,8 @@ end
before_fork do
# Signal to the puma killer
- Gitlab::Cluster::PumaWorkerKillerInitializer.start @config.options unless ENV['DISABLE_PUMA_WORKER_KILLER']
+ enable_puma_worker_killer = !Gitlab::Utils.to_boolean(ENV['DISABLE_PUMA_WORKER_KILLER'])
+ Gitlab::Cluster::PumaWorkerKillerInitializer.start(@config.options) if enable_puma_worker_killer
# Signal application hooks that we're about to fork
Gitlab::Cluster::LifecycleEvents.do_before_fork
diff --git a/config/routes.rb b/config/routes.rb
index 44e89f0d387..dd3095f0a8d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -4,334 +4,335 @@ require 'sidekiq/web'
require 'sidekiq/cron/web'
require 'product_analytics/collector_app'
-Rails.application.routes.draw do
- concern :access_requestable do
- post :request_access, on: :collection
- post :approve_access_request, on: :member
- end
+InitializerConnections.with_disabled_database_connections do
+ Rails.application.routes.draw do
+ concern :access_requestable do
+ post :request_access, on: :collection
+ post :approve_access_request, on: :member
+ end
- concern :awardable do
- post :toggle_award_emoji, on: :member
- end
+ concern :awardable do
+ post :toggle_award_emoji, on: :member
+ end
- favicon_redirect = redirect do |_params, _request|
- ActionController::Base.helpers.asset_url(Gitlab::Favicon.main)
- end
- get 'favicon.png', to: favicon_redirect
- get 'favicon.ico', to: favicon_redirect
+ favicon_redirect = redirect do |_params, _request|
+ ActionController::Base.helpers.asset_url(Gitlab::Favicon.main)
+ end
+ get 'favicon.png', to: favicon_redirect
+ get 'favicon.ico', to: favicon_redirect
- draw :development
+ draw :development
- use_doorkeeper do
- controllers applications: 'oauth/applications',
- authorized_applications: 'oauth/authorized_applications',
- authorizations: 'oauth/authorizations',
- token_info: 'oauth/token_info',
- tokens: 'oauth/tokens'
- end
+ use_doorkeeper do
+ controllers applications: 'oauth/applications',
+ authorized_applications: 'oauth/authorized_applications',
+ authorizations: 'oauth/authorizations',
+ token_info: 'oauth/token_info',
+ tokens: 'oauth/tokens'
+ end
- # This prefixless path is required because Jira gets confused if we set it up with a path
- # More information: https://gitlab.com/gitlab-org/gitlab/issues/6752
- scope path: '/login/oauth', controller: 'oauth/jira_dvcs/authorizations', as: :oauth_jira_dvcs do
- get :authorize, action: :new
- get :callback
- post :access_token
+ # This prefixless path is required because Jira gets confused if we set it up with a path
+ # More information: https://gitlab.com/gitlab-org/gitlab/issues/6752
+ scope path: '/login/oauth', controller: 'oauth/jira_dvcs/authorizations', as: :oauth_jira_dvcs do
+ get :authorize, action: :new
+ get :callback
+ post :access_token
- match '*all', via: [:get, :post], to: proc { [404, {}, ['']] }
- end
+ match '*all', via: [:get, :post], to: proc { [404, {}, ['']] }
+ end
- draw :oauth
+ draw :oauth
- use_doorkeeper_openid_connect do
- controllers discovery: 'jwks'
- end
+ use_doorkeeper_openid_connect do
+ controllers discovery: 'jwks'
+ end
- # Add OPTIONS method for CORS preflight requests
- match '/oauth/userinfo' => 'doorkeeper/openid_connect/userinfo#show', via: :options
- match '/oauth/discovery/keys' => 'jwks#keys', via: :options
- match '/.well-known/openid-configuration' => 'jwks#provider', via: :options
- match '/.well-known/webfinger' => 'jwks#webfinger', via: :options
+ # Add OPTIONS method for CORS preflight requests
+ match '/oauth/userinfo' => 'doorkeeper/openid_connect/userinfo#show', via: :options
+ match '/oauth/discovery/keys' => 'jwks#keys', via: :options
+ match '/.well-known/openid-configuration' => 'jwks#provider', via: :options
+ match '/.well-known/webfinger' => 'jwks#webfinger', via: :options
- match '/oauth/token' => 'oauth/tokens#create', via: :options
- match '/oauth/revoke' => 'oauth/tokens#revoke', via: :options
+ match '/oauth/token' => 'oauth/tokens#create', via: :options
+ match '/oauth/revoke' => 'oauth/tokens#revoke', via: :options
- # Sign up
- scope path: '/users/sign_up', module: :registrations, as: :users_sign_up do
- resource :welcome, only: [:show, :update], controller: 'welcome' do
- Gitlab.ee do
- get :trial_getting_started, on: :collection
- get :trial_onboarding_board, on: :collection
- get :continuous_onboarding_getting_started, on: :collection
+ match '/-/jira_connect/oauth_application_id' => 'jira_connect/oauth_application_ids#show', via: :options
+
+ # Sign up
+ scope path: '/users/sign_up', module: :registrations, as: :users_sign_up do
+ resource :welcome, only: [:show, :update], controller: 'welcome' do
+ Gitlab.ee do
+ get :trial_getting_started, on: :collection
+ get :trial_onboarding_board, on: :collection
+ get :continuous_onboarding_getting_started, on: :collection
+ end
end
- end
- Gitlab.ee do
- resource :company, only: [:new, :create], controller: 'company'
- resources :groups, only: [:new, :create]
- resources :projects, only: [:new, :create]
- resources :groups_projects, only: [:new, :create] do
- collection do
- post :import
- put :exit
+ Gitlab.ee do
+ resource :company, only: [:new, :create], controller: 'company'
+ resources :groups, only: [:new, :create]
+ resources :projects, only: [:new, :create]
+ resources :groups_projects, only: [:new, :create] do
+ collection do
+ post :import
+ put :exit
+ end
end
+ draw :verification
end
- draw :verification
end
- end
- # Search
- get 'search' => 'search#show', as: :search
- get 'search/autocomplete' => 'search#autocomplete', as: :search_autocomplete
- get 'search/count' => 'search#count', as: :search_count
- get 'search/opensearch' => 'search#opensearch', as: :search_opensearch
+ # Search
+ get 'search' => 'search#show', as: :search
+ get 'search/autocomplete' => 'search#autocomplete', as: :search_autocomplete
+ get 'search/count' => 'search#count', as: :search_count
+ get 'search/opensearch' => 'search#opensearch', as: :search_opensearch
- # JSON Web Token
- get 'jwt/auth' => 'jwt#auth'
+ # JSON Web Token
+ get 'jwt/auth' => 'jwt#auth'
- # Health check
- get 'health_check(/:checks)' => 'health_check#index', as: :health_check
+ # Health check
+ get 'health_check(/:checks)' => 'health_check#index', as: :health_check
- # Terraform service discovery
- get '.well-known/terraform.json' => 'terraform/services#index', as: :terraform_services
+ # Terraform service discovery
+ get '.well-known/terraform.json' => 'terraform/services#index', as: :terraform_services
- # Begin of the /-/ scope.
- # Use this scope for all new global routes.
- scope path: '-' do
- # Autocomplete
- get '/autocomplete/users' => 'autocomplete#users'
- get '/autocomplete/users/:id' => 'autocomplete#user'
- get '/autocomplete/projects' => 'autocomplete#projects'
- get '/autocomplete/award_emojis' => 'autocomplete#award_emojis'
- get '/autocomplete/merge_request_target_branches' => 'autocomplete#merge_request_target_branches'
- get '/autocomplete/deploy_keys_with_owners' => 'autocomplete#deploy_keys_with_owners'
+ # Begin of the /-/ scope.
+ # Use this scope for all new global routes.
+ scope path: '-' do
+ # Autocomplete
+ get '/autocomplete/users' => 'autocomplete#users'
+ get '/autocomplete/users/:id' => 'autocomplete#user'
+ get '/autocomplete/projects' => 'autocomplete#projects'
+ get '/autocomplete/award_emojis' => 'autocomplete#award_emojis'
+ get '/autocomplete/merge_request_target_branches' => 'autocomplete#merge_request_target_branches'
+ get '/autocomplete/deploy_keys_with_owners' => 'autocomplete#deploy_keys_with_owners'
- Gitlab.ee do
- get '/autocomplete/project_groups' => 'autocomplete#project_groups'
- get '/autocomplete/project_routes' => 'autocomplete#project_routes'
- get '/autocomplete/namespace_routes' => 'autocomplete#namespace_routes'
- get '/autocomplete/group_subgroups' => 'autocomplete#group_subgroups'
- end
+ Gitlab.ee do
+ get '/autocomplete/project_groups' => 'autocomplete#project_groups'
+ get '/autocomplete/project_routes' => 'autocomplete#project_routes'
+ get '/autocomplete/namespace_routes' => 'autocomplete#namespace_routes'
+ get '/autocomplete/group_subgroups' => 'autocomplete#group_subgroups'
+ end
- # sandbox
- get '/sandbox/mermaid' => 'sandbox#mermaid'
+ # sandbox
+ get '/sandbox/mermaid' => 'sandbox#mermaid'
- get '/whats_new' => 'whats_new#index'
+ get '/whats_new' => 'whats_new#index'
- get 'offline' => "pwa#offline"
- get 'manifest' => "pwa#manifest", constraints: lambda { |req| req.format == :json }
+ get 'offline' => "pwa#offline"
+ get 'manifest' => "pwa#manifest", constraints: lambda { |req| req.format == :json }
- # '/-/health' implemented by BasicHealthCheck middleware
- get 'liveness' => 'health#liveness'
- get 'readiness' => 'health#readiness'
- controller :metrics do
- get 'metrics', action: :index
- get 'metrics/system', action: :system
- end
- mount Peek::Railtie => '/peek', as: 'peek_routes'
+ # '/-/health' implemented by BasicHealthCheck middleware
+ get 'liveness' => 'health#liveness'
+ get 'readiness' => 'health#readiness'
+ controller :metrics do
+ get 'metrics', action: :index
+ get 'metrics/system', action: :system
+ end
+ mount Peek::Railtie => '/peek', as: 'peek_routes'
- get 'runner_setup/platforms' => 'runner_setup#platforms'
+ get 'runner_setup/platforms' => 'runner_setup#platforms'
- # Boards resources shared between group and projects
- resources :boards, only: [] do
- resources :lists, module: :boards, only: [:index, :create, :update, :destroy] do
- collection do
- post :generate
- end
+ # Boards resources shared between group and projects
+ resources :boards, only: [] do
+ resources :lists, module: :boards, only: [:index, :create, :update, :destroy] do
+ collection do
+ post :generate
+ end
- resources :issues, only: [:index, :create, :update]
- end
+ resources :issues, only: [:index, :create, :update]
+ end
- resources :issues, module: :boards, only: [:index, :update] do
- collection do
- put :bulk_move, format: :json
+ resources :issues, module: :boards, only: [:index, :update] do
+ collection do
+ put :bulk_move, format: :json
+ end
end
- end
- Gitlab.ee do
- resources :users, module: :boards, only: [:index]
- resources :milestones, module: :boards, only: [:index]
+ Gitlab.ee do
+ resources :users, module: :boards, only: [:index]
+ resources :milestones, module: :boards, only: [:index]
+ end
end
- end
-
- get 'acme-challenge/' => 'acme_challenges#show'
- scope :ide, as: :ide, format: false do
- get '/', to: 'ide#index'
- get '/project', to: 'ide#index'
+ get 'acme-challenge/' => 'acme_challenges#show'
- scope path: 'project/:project_id', as: :project, constraints: { project_id: Gitlab::PathRegex.full_namespace_route_regex } do
- %w[edit tree blob].each do |action|
- get "/#{action}", to: 'ide#index'
- get "/#{action}/*branch/-/*path", to: 'ide#index'
- get "/#{action}/*branch/-", to: 'ide#index'
- get "/#{action}/*branch", to: 'ide#index'
- end
-
- get '/merge_requests/:merge_request_id', to: 'ide#index', constraints: { merge_request_id: /\d+/ }
+ scope :ide, as: :ide, format: false do
get '/', to: 'ide#index'
+ get '/project', to: 'ide#index'
+
+ scope path: 'project/:project_id', as: :project, constraints: { project_id: Gitlab::PathRegex.full_namespace_route_regex } do
+ %w[edit tree blob].each do |action|
+ get "/#{action}", to: 'ide#index'
+ get "/#{action}/*branch/-/*path", to: 'ide#index'
+ get "/#{action}/*branch/-", to: 'ide#index'
+ get "/#{action}/*branch", to: 'ide#index'
+ end
+
+ get '/merge_requests/:merge_request_id', to: 'ide#index', constraints: { merge_request_id: /\d+/ }
+ get '/', to: 'ide#index'
+ end
end
- end
- draw :operations
- draw :jira_connect
+ draw :operations
+ draw :jira_connect
- Gitlab.ee do
- draw :security
- draw :smartcard
- draw :trial
- draw :trial_registration
- draw :country
- draw :country_state
- draw :subscription
-
- scope '/push_from_secondary/:geo_node_id' do
- draw :git_http
+ Gitlab.ee do
+ draw :security
+ draw :smartcard
+ draw :trial
+ draw :trial_registration
+ draw :country
+ draw :country_state
+ draw :subscription
+
+ scope '/push_from_secondary/:geo_node_id' do
+ draw :git_http
+ end
end
- # Used for survey responses
- resources :survey_responses, only: :index
- end
-
- Gitlab.jh do
- draw :global_jh
- end
+ Gitlab.jh do
+ draw :global_jh
+ end
- if ENV['GITLAB_CHAOS_SECRET'] || Rails.env.development? || Rails.env.test?
- resource :chaos, only: [] do
- get :leakmem
- get :cpu_spin
- get :db_spin
- get :sleep
- get :kill
- get :quit
- post :gc
+ if ENV['GITLAB_CHAOS_SECRET'] || Rails.env.development? || Rails.env.test?
+ resource :chaos, only: [] do
+ get :leakmem
+ get :cpu_spin
+ get :db_spin
+ get :sleep
+ get :kill
+ get :quit
+ post :gc
+ end
end
- end
- resources :invites, only: [:show], constraints: { id: /[A-Za-z0-9_-]+/ } do
- member do
- post :accept
- match :decline, via: [:get, :post]
+ resources :invites, only: [:show], constraints: { id: /[A-Za-z0-9_-]+/ } do
+ member do
+ post :accept
+ match :decline, via: [:get, :post]
+ end
end
- end
- resources :sent_notifications, only: [], constraints: { id: /\h{32}/ } do
- member do
- get :unsubscribe
+ resources :sent_notifications, only: [], constraints: { id: /\h{32}/ } do
+ member do
+ get :unsubscribe
+ end
end
- end
- # Spam reports
- resources :abuse_reports, only: [:new, :create]
+ # Spam reports
+ resources :abuse_reports, only: [:new, :create]
- # JWKS (JSON Web Key Set) endpoint
- # Used by third parties to verify CI_JOB_JWT
- get 'jwks' => 'jwks#index'
+ # JWKS (JSON Web Key Set) endpoint
+ # Used by third parties to verify CI_JOB_JWT
+ get 'jwks' => 'jwks#index'
- draw :snippets
- draw :profile
+ draw :snippets
+ draw :profile
- post '/mailgun/webhooks' => 'mailgun/webhooks#process_webhook'
+ post '/mailgun/webhooks' => 'mailgun/webhooks#process_webhook'
- # Deprecated route for permanent failures
- # https://gitlab.com/gitlab-org/gitlab/-/issues/362606
- post '/members/mailgun/permanent_failures' => 'mailgun/webhooks#process_webhook'
+ # Deprecated route for permanent failures
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/362606
+ post '/members/mailgun/permanent_failures' => 'mailgun/webhooks#process_webhook'
- # Product analytics collector
- match '/collector/i', to: ProductAnalytics::CollectorApp.new, via: :all
- end
- # End of the /-/ scope.
-
- concern :clusterable do
- resources :clusters, only: [:index, :show, :update, :destroy] do
- collection do
- get :connect
- get :new_cluster_docs
- post :create_user
- end
+ # Product analytics collector
+ match '/collector/i', to: ProductAnalytics::CollectorApp.new, via: :all
+ end
+ # End of the /-/ scope.
- resource :integration, controller: 'clusters/integrations', only: [] do
+ concern :clusterable do
+ resources :clusters, only: [:index, :show, :update, :destroy] do
collection do
- post :create_or_update
+ get :connect
+ get :new_cluster_docs
+ post :create_user
end
- end
- member do
- Gitlab.ee do
- get :metrics, format: :json
- get :environments, format: :json
+ resource :integration, controller: 'clusters/integrations', only: [] do
+ collection do
+ post :create_or_update
+ end
end
- get :metrics_dashboard
- get :'/prometheus/api/v1/*proxy_path', to: 'clusters#prometheus_proxy', as: :prometheus_api
- get :cluster_status, format: :json
- delete :clear_cache
+ member do
+ Gitlab.ee do
+ get :metrics, format: :json
+ get :environments, format: :json
+ end
+
+ get :metrics_dashboard
+ get :'/prometheus/api/v1/*proxy_path', to: 'clusters#prometheus_proxy', as: :prometheus_api
+ get :cluster_status, format: :json
+ delete :clear_cache
+ end
end
end
- end
- resources :groups, only: [:index, :new, :create] do
- post :preview_markdown
- end
+ resources :groups, only: [:index, :new, :create] do
+ post :preview_markdown
+ end
- draw :group
-
- resources :projects, only: [:index, :new, :create]
-
- get '/projects/:id' => 'projects/redirect#redirect_from_id'
-
- draw :git_http
- draw :api
- draw :customers_dot
- draw :sidekiq
- draw :help
- draw :google_api
- draw :import
- draw :uploads
- draw :explore
- draw :admin
- draw :dashboard
- draw :user
- draw :project
- draw :unmatched_project
-
- # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/210024
- scope as: 'deprecated' do
- # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/223719
- get '/snippets/:id/raw',
- to: 'snippets#raw',
- format: false,
- constraints: { id: /\d+/ }
-
- Gitlab::Routing.redirect_legacy_paths(self, :snippets)
- end
+ draw :group
+
+ resources :projects, only: [:index, :new, :create]
+
+ get '/projects/:id' => 'projects/redirect#redirect_from_id'
+
+ draw :git_http
+ draw :api
+ draw :customers_dot
+ draw :sidekiq
+ draw :help
+ draw :google_api
+ draw :import
+ draw :uploads
+ draw :explore
+ draw :admin
+ draw :dashboard
+ draw :user
+ draw :project
+ draw :unmatched_project
+
+ # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/210024
+ scope as: 'deprecated' do
+ # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/223719
+ get '/snippets/:id/raw',
+ to: 'snippets#raw',
+ format: false,
+ constraints: { id: /\d+/ }
+
+ Gitlab::Routing.redirect_legacy_paths(self, :snippets)
+ end
- Gitlab.ee do
- get '/sitemap' => 'sitemap#show', format: :xml
- end
+ Gitlab.ee do
+ get '/sitemap' => 'sitemap#show', format: :xml
+ end
- # Creates shorthand helper methods for project resources.
- # For example; for the `namespace_project_path` this also creates `project_path`.
- #
- # TODO: We don't need the `Gitlab::Routing` module at all as we can use
- # the `direct` DSL method of Rails to define url helpers. Move all the
- # custom url helpers to use the `direct` DSL method and remove the `Gitlab::Routing`.
- # For more information: https://gitlab.com/gitlab-org/gitlab/-/issues/299583
- Gitlab::Application.routes.set.filter_map { |route| route.name if route.name&.include?('namespace_project') }.each do |name|
- new_name = name.sub('namespace_project', 'project')
-
- direct(new_name) do |project, *args|
- # This is due to a bug I've found in Rails.
- # For more information: https://gitlab.com/gitlab-org/gitlab/-/issues/299591
- args.pop if args.last == {}
-
- send("#{name}_url", project&.namespace, project, *args)
+ # Creates shorthand helper methods for project resources.
+ # For example; for the `namespace_project_path` this also creates `project_path`.
+ #
+ # TODO: We don't need the `Gitlab::Routing` module at all as we can use
+ # the `direct` DSL method of Rails to define url helpers. Move all the
+ # custom url helpers to use the `direct` DSL method and remove the `Gitlab::Routing`.
+ # For more information: https://gitlab.com/gitlab-org/gitlab/-/issues/299583
+ Gitlab::Application.routes.set.filter_map { |route| route.name if route.name&.include?('namespace_project') }.each do |name|
+ new_name = name.sub('namespace_project', 'project')
+
+ direct(new_name) do |project, *args|
+ # This is due to a bug I've found in Rails.
+ # For more information: https://gitlab.com/gitlab-org/gitlab/-/issues/299591
+ args.pop if args.last == {}
+
+ send("#{name}_url", project&.namespace, project, *args)
+ end
end
- end
- root to: "root#index"
+ root to: "root#index"
- get '*unmatched_route', to: 'application#route_not_found', format: false
-end
+ get '*unmatched_route', to: 'application#route_not_found', format: false
+ end
-Gitlab::Routing.add_helpers(TimeboxesRoutingHelper)
+ Gitlab::Routing.add_helpers(TimeboxesRoutingHelper)
+end
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 8148e92d0e5..bbf00cd0b00 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -61,7 +61,7 @@ namespace :admin do
end
end
- resources :topics, only: [:index, :new, :create, :edit, :update] do
+ resources :topics, only: [:index, :new, :create, :edit, :update, :destroy] do
resource :avatar, controller: 'topics/avatars', only: [:destroy]
collection do
post :preview_markdown
@@ -138,6 +138,7 @@ namespace :admin do
get :usage_data
put :reset_registration_token
put :reset_health_check_token
+ put :reset_error_tracking_access_token
put :clear_repository_check_states
match :general, :integrations, :repository, :ci_cd, :reporting, :metrics_and_profiling, :network, :preferences, via: [:get, :patch]
get :lets_encrypt_terms_of_service
diff --git a/config/routes/group.rb b/config/routes/group.rb
index bf6094ff2f1..2a5931207b0 100644
--- a/config/routes/group.rb
+++ b/config/routes/group.rb
@@ -118,10 +118,17 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
end
resources :container_registries, only: [:index, :show], controller: 'registry/repositories'
- resources :harbor_registries, only: [:index, :show], controller: 'harbor/repositories'
resource :dependency_proxy, only: [:show, :update]
resources :email_campaigns, only: :index
+ namespace :harbor do
+ resources :repositories, only: [:index] do
+ resources :artifacts, only: [:index] do
+ resources :tags, only: [:index]
+ end
+ end
+ end
+
resources :autocomplete_sources, only: [] do
collection do
get 'members'
diff --git a/config/routes/project.rb b/config/routes/project.rb
index afc06780471..5eb0b9396c9 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -221,20 +221,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
- # Legacy routes for `/-/integrations` which are now in `/-/settings/integrations`.
- # Can be removed in 15.2, see https://gitlab.com/gitlab-org/gitlab/-/issues/334846
- resources :integrations, controller: 'settings/integrations', constraints: { id: %r{[^/]+} }, only: [:edit, :update] do
- member do
- put :test
- end
-
- resources :hook_logs, only: [:show], controller: 'settings/integration_hook_logs' do
- member do
- post :retry
- end
- end
- end
-
resources :boards, only: [:index, :show, :create, :update, :destroy], constraints: { id: /\d+/ } do
collection do
get :recent
@@ -252,13 +238,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
- resources :logs, only: [:index] do
- collection do
- get :k8s
- get :elasticsearch
- end
- end
-
resources :starrers, only: [:index]
resources :forks, only: [:index, :new, :create]
resources :group_links, only: [:update, :destroy], constraints: { id: /\d+|:id/ }
@@ -319,15 +298,18 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resources :terraform, only: [:index]
- resources :google_cloud, only: [:index]
-
namespace :google_cloud do
+ get '/configuration', to: 'configuration#index'
+
resources :revoke_oauth, only: [:create]
resources :service_accounts, only: [:index, :create]
resources :gcp_regions, only: [:index, :create]
+ get '/deployments', to: 'deployments#index'
get '/deployments/cloud_run', to: 'deployments#cloud_run'
get '/deployments/cloud_storage', to: 'deployments#cloud_storage'
+
+ get '/databases', to: 'databases#index'
end
resources :environments, except: [:destroy] do
@@ -377,8 +359,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
get 'work_items/*work_items_path' => 'work_items#index', as: :work_items
- resource :tracing, only: [:show]
-
post 'incidents/integrations/pagerduty', to: 'incident_management/pager_duty_incidents#create'
resources :incidents, only: [:index]
@@ -480,6 +460,14 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
end
+
+ namespace :harbor do
+ resources :repositories, only: [:index, :show] do
+ resources :artifacts, only: [:index] do
+ resources :tags, only: [:index]
+ end
+ end
+ end
end
# End of the /-/ scope.
@@ -546,9 +534,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resources :container_registry, only: [:index, :destroy, :show], # rubocop: disable Cop/PutProjectRoutesUnderScope
controller: 'registry/repositories'
- resources :harbor_registry, only: [:index, :show], # rubocop: disable Cop/PutProjectRoutesUnderScope
- controller: 'harbor/repositories'
-
namespace :registry do
resources :repository, only: [] do # rubocop: disable Cop/PutProjectRoutesUnderScope
# We default to JSON format in the controller to avoid ambiguity.
@@ -638,7 +623,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
:commits, :commit, :find_file, :files, :compare,
:cycle_analytics, :mattermost, :variables, :triggers,
:environments, :protected_environments, :error_tracking, :alert_management,
- :tracing,
:serverless, :clusters, :audit_events, :wikis, :merge_requests,
:vulnerability_feedback, :security, :dependencies, :issues,
:pipelines, :pipeline_schedules, :runners, :snippets)
diff --git a/config/routes/user.rb b/config/routes/user.rb
index ccacf817cc5..96e8c850da4 100644
--- a/config/routes/user.rb
+++ b/config/routes/user.rb
@@ -15,7 +15,7 @@ end
# Use custom controller for LDAP omniauth callback
if Gitlab::Auth::Ldap::Config.sign_in_enabled?
devise_scope :user do
- Gitlab::Auth::Ldap::Config.available_servers.each do |server|
+ Gitlab::Auth::Ldap::Config.servers.each do |server|
override_omniauth(server['provider_name'], 'ldap/omniauth_callbacks')
end
end
@@ -53,6 +53,8 @@ end
devise_scope :user do
get '/users/almost_there' => 'confirmations#almost_there'
+ post '/users/resend_verification_code', to: 'sessions#resend_verification_code'
+ get '/users/successful_verification', to: 'sessions#successful_verification'
end
scope '-/users', module: :users do
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 2838f0a8436..c901ea09f4c 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -193,6 +193,8 @@
- 2
- - gitlab_subscriptions_notify_seats_exceeded
- 1
+- - google_cloud_create_cloudsql_instance
+ - 1
- - group_destroy
- 1
- - group_export
@@ -221,6 +223,8 @@
- 2
- - incident_management_apply_incident_sla_exceeded_label
- 1
+- - incident_management_close_incident
+ - 1
- - incident_management_oncall_rotations_persist_shifts_job
- 1
- - incident_management_pending_escalations_alert_check
@@ -239,8 +243,6 @@
- 1
- - invalid_gpg_signature_update
- 2
-- - irker
- - 1
- - issuable_export_csv
- 1
- - issuable_label_links_destroy
@@ -327,7 +329,7 @@
- 1
- - pages_domain_verification
- 1
-- - pages_transfer
+- - pages_invalidate_domain_cache
- 1
- - personal_access_tokens
- 1
@@ -355,8 +357,6 @@
- 1
- - project_import_schedule
- 1
-- - project_service
- - 1
- - project_template_export
- 1
- - projects_after_import
@@ -469,8 +469,6 @@
- 1
- - web_hook
- 1
-- - web_hooks_destroy
- - 1
- - web_hooks_log_destroy
- 1
- - web_hooks_log_execution
diff --git a/config/webpack.config.js b/config/webpack.config.js
index aff906353f6..3c1d7cbf631 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -158,7 +158,6 @@ const alias = {
images: path.join(ROOT_PATH, 'app/assets/images'),
vendor: path.join(ROOT_PATH, 'vendor/assets/javascripts'),
jquery$: 'jquery/dist/jquery.slim.js',
- jest: path.join(ROOT_PATH, 'spec/frontend'),
shared_queries: path.join(ROOT_PATH, 'app/graphql/queries'),
// the following resolves files which are different between CE and EE
@@ -175,6 +174,16 @@ const alias = {
ROOT_PATH,
'app/assets/javascripts/lib/utils/icons_path.js',
),
+
+ // test-environment-only aliases duplicated from Jest config
+ 'spec/test_constants$': path.join(ROOT_PATH, 'spec/frontend/__helpers__/test_constants'),
+ ee_else_ce_jest: path.join(ROOT_PATH, 'spec/frontend'),
+ helpers: path.join(ROOT_PATH, 'spec/frontend/__helpers__'),
+ jest: path.join(ROOT_PATH, 'spec/frontend'),
+ test_fixtures: path.join(ROOT_PATH, 'tmp/tests/frontend/fixtures'),
+ test_fixtures_static: path.join(ROOT_PATH, 'spec/frontend/fixtures/static'),
+ test_helpers: path.join(ROOT_PATH, 'spec/frontend_integration/test_helpers'),
+ public: path.join(ROOT_PATH, 'public'),
};
if (IS_EE) {
@@ -184,10 +193,14 @@ if (IS_EE) {
ee_empty_states: path.join(ROOT_PATH, 'ee/app/views/shared/empty_states'),
ee_icons: path.join(ROOT_PATH, 'ee/app/views/shared/icons'),
ee_images: path.join(ROOT_PATH, 'ee/app/assets/images'),
- ee_jest: path.join(ROOT_PATH, 'ee/spec/frontend'),
ee_else_ce: path.join(ROOT_PATH, 'ee/app/assets/javascripts'),
jh_else_ee: path.join(ROOT_PATH, 'ee/app/assets/javascripts'),
any_else_ce: path.join(ROOT_PATH, 'ee/app/assets/javascripts'),
+
+ // test-environment-only aliases duplicated from Jest config
+ ee_else_ce_jest: path.join(ROOT_PATH, 'ee/spec/frontend'),
+ ee_jest: path.join(ROOT_PATH, 'ee/spec/frontend'),
+ test_fixtures: path.join(ROOT_PATH, 'tmp/tests/frontend/fixtures-ee'),
});
}
@@ -198,21 +211,13 @@ if (IS_JH) {
jh_empty_states: path.join(ROOT_PATH, 'jh/app/views/shared/empty_states'),
jh_icons: path.join(ROOT_PATH, 'jh/app/views/shared/icons'),
jh_images: path.join(ROOT_PATH, 'jh/app/assets/images'),
- jh_jest: path.join(ROOT_PATH, 'jh/spec/frontend'),
// jh path alias https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74305#note_732793956
jh_else_ce: path.join(ROOT_PATH, 'jh/app/assets/javascripts'),
jh_else_ee: path.join(ROOT_PATH, 'jh/app/assets/javascripts'),
any_else_ce: path.join(ROOT_PATH, 'jh/app/assets/javascripts'),
- });
-}
-if (!IS_PRODUCTION) {
- const fixtureDir = IS_EE ? 'fixtures-ee' : 'fixtures';
-
- Object.assign(alias, {
- test_fixtures: path.join(ROOT_PATH, `tmp/tests/frontend/${fixtureDir}`),
- test_fixtures_static: path.join(ROOT_PATH, 'spec/frontend/fixtures/static'),
- test_helpers: path.join(ROOT_PATH, 'spec/frontend_integration/test_helpers'),
+ // test-environment-only aliases duplicated from Jest config
+ jh_jest: path.join(ROOT_PATH, 'jh/spec/frontend'),
});
}
diff --git a/danger/ci_config/Dangerfile b/danger/ci_config/Dangerfile
index 5022ccc1539..f29888d1ec8 100644
--- a/danger/ci_config/Dangerfile
+++ b/danger/ci_config/Dangerfile
@@ -9,6 +9,7 @@ def get_ci_config_files(files)
end
schema_path = 'app/assets/javascripts/editor/schema/ci.json'
+schema_docs_path = 'https://docs.gitlab.com/ee/development/cicd/schema.html#write-specs'
has_schema_update = all_changed_files.include?(schema_path)
return if has_schema_update
@@ -17,4 +18,4 @@ return if ci_config_files.empty?
file_list = "- #{ci_config_files.map { |path| "`#{path}`" }.join("\n- ")}"
-warn "This merge request changed CI config files but did not update the schema. Please consider updating [the schema](#{schema_path}) to reflect these changes:\n#{file_list}"
+warn "This merge request changed CI config files but did not update the schema. Please consider updating [the schema](#{schema_path}) to reflect these changes:\n#{file_list}.\n\nRefer to the [docs](#{schema_docs_path}) for help on how to run and write specs for the CI schema."
diff --git a/danger/database/Dangerfile b/danger/database/Dangerfile
index f94184263ad..7b3a32358fe 100644
--- a/danger/database/Dangerfile
+++ b/danger/database/Dangerfile
@@ -30,6 +30,12 @@ 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
+DB_MIGRATION_TESTING_REQUIRED_MESSAGE = <<~MSG
+1. If this is not a ~"Community contribution" or from a Fork, kick off the
+ `db:gitlabcom-database-testing` manual job.
+
+MSG
+
DATABASE_APPROVED_LABEL = 'database::approved'
non_geo_db_schema_updated = !git.modified_files.grep(%r{\Adb/structure\.sql}).empty?
@@ -58,9 +64,10 @@ if helper.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_MIGRATION_TESTING_REQUIRED_MESSAGE) if non_geo_migration_created
if db_paths_to_review.any?
- markdown(DB_FILES_MESSAGE + helper.markdown_list(db_paths_to_review))
+ markdown(DB_FILES_MESSAGE + helper.markdown_list(db_paths_to_review.to_set))
else
markdown(DB_REMOVE_MESSAGE)
end
diff --git a/data/deprecations/14-7-deprecate-artifacts-keyword.yml b/data/deprecations/14-7-deprecate-artifacts-keyword.yml
index 20be00ef6d0..29b5ec39193 100644
--- a/data/deprecations/14-7-deprecate-artifacts-keyword.yml
+++ b/data/deprecations/14-7-deprecate-artifacts-keyword.yml
@@ -1,4 +1,4 @@
-- name: "`artifacts:report:cobertura` keyword"
+- name: "`artifacts:reports:cobertura` keyword"
announcement_milestone: "14.7"
announcement_date: "2022-01-22"
removal_milestone: "15.0"
@@ -6,7 +6,7 @@
breaking_change: false
body: |
Currently, test coverage visualizations in GitLab only support Cobertura reports. Starting 15.0, the
- `artifacts:report:cobertura` keyword will be replaced by
+ `artifacts:reports:cobertura` keyword will be replaced by
[`artifacts:reports:coverage_report`](https://gitlab.com/gitlab-org/gitlab/-/issues/344533). Cobertura will be the
only supported report file in 15.0, but this is the first step towards GitLab supporting other report types.
diff --git a/data/deprecations/14-8-sast-analyzer-removals.yml b/data/deprecations/14-8-sast-analyzer-removals.yml
index cf9549f7315..85d1533b762 100644
--- a/data/deprecations/14-8-sast-analyzer-removals.yml
+++ b/data/deprecations/14-8-sast-analyzer-removals.yml
@@ -1,17 +1,17 @@
- name: "SAST analyzer consolidation and CI/CD template changes"
announcement_milestone: "14.8"
announcement_date: "2022-02-22"
- removal_milestone: "15.2"
- removal_date: "2022-07-22"
+ removal_milestone: "15.4"
+ removal_date: "2022-09-22"
breaking_change: true
reporter: connorgilbert
body: | # Do not modify this line, instead modify the lines below.
GitLab SAST uses various [analyzers](https://docs.gitlab.com/ee/user/application_security/sast/analyzers/) to scan code for vulnerabilities.
We are reducing the number of analyzers used in GitLab SAST as part of our long-term strategy to deliver a better and more consistent user experience.
- Streamlining the set of analyzers will also enable faster [iteration](https://about.gitlab.com/handbook/values/#iteration), better [results](https://about.gitlab.com/handbook/values/#results), and greater [efficiency](https://about.gitlab.com/handbook/values/#results) (including a reduction in CI runner usage in most cases).
+ Streamlining the set of analyzers will also enable faster [iteration](https://about.gitlab.com/handbook/values/#iteration), better [results](https://about.gitlab.com/handbook/values/#results), and greater [efficiency](https://about.gitlab.com/handbook/values/#efficiency) (including a reduction in CI runner usage in most cases).
- In GitLab 15.2, GitLab SAST will no longer use the following analyzers:
+ In GitLab 15.4, GitLab SAST will no longer use the following analyzers:
- [ESLint](https://gitlab.com/gitlab-org/security-products/analyzers/eslint) (JavaScript, TypeScript, React)
- [Gosec](https://gitlab.com/gitlab-org/security-products/analyzers/gosec) (Go)
@@ -26,7 +26,14 @@
We will also remove Java from the scope of the [SpotBugs](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) analyzer and replace it with the [Semgrep-based analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep).
This change will make it simpler to scan Java code; compilation will no longer be required.
- This change will be reflected in the automatic language detection portion of the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml).
+ This change will be reflected in the automatic language detection portion of the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml). Note that the SpotBugs-based analyzer will continue to cover Groovy, Kotlin, and Scala.
+
+ If you've already dismissed a vulnerability finding from one of the deprecated analyzers, the replacement attempts to respect your previous dismissal. The system behavior depends on:
+
+ - whether you’ve excluded the Semgrep-based analyzer from running in the past.
+ - which analyzer first discovered the vulnerabilities shown in the project’s Vulnerability Report.
+
+ See [Vulnerability translation documentation](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#vulnerability-translation) for further details.
If you applied customizations to any of the affected analyzers or if you currently disable the Semgrep analyzer in your pipelines, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352554#breaking-change).
# The following items are not published on the docs page, but may be used in the future.
diff --git a/data/deprecations/15-2-job_age-deprecation.yml b/data/deprecations/15-2-job_age-deprecation.yml
new file mode 100644
index 00000000000..889c8651bbe
--- /dev/null
+++ b/data/deprecations/15-2-job_age-deprecation.yml
@@ -0,0 +1,41 @@
+# This is a template for a feature deprecation.
+#
+# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
+# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
+#
+# Deprecations must be announced at least three releases prior to removal.
+#
+# If an End of Support period applies, the announcement should be shared with GitLab Support
+# in the `#spt_managers` on Slack and mention `@gitlab-com/support` in this MR.
+#
+# Breaking changes must happen in a major release.
+#
+# For more information please refer to the handbook documentation here:
+# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations
+#
+# Please delete this line and above before submitting your merge request.
+#
+# REQUIRED FIELDS
+#
+- name: "Remove `job_age` parameter from `POST /jobs/request` Runner endpoint" # (required) The name of the feature to be deprecated
+ announcement_milestone: "15.2" # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: "2022-07-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
+ reporter: jheimbuck_gl # (required) GitLab username of the person reporting the deprecation
+ stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334253 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The `job_age` parameter, returned from the `POST /jobs/request` API endpoint used in communication with GitLab Runner, was never used by any GitLab or Runner feature. This parameter will be removed in GitLab 16.0.
+
+ This could be a breaking change for anyone that developed their own runner that relies on this parameter being returned by the endpoint. This is not a breaking change for anyone using an officially released version of GitLab Runner, including public shared runners on GitLab.com.
+#
+# OPTIONAL FIELDS
+#
+ end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
+ end_of_support_date: # (optional) The date of the milestone release when support for this feature will end.
+ tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/15_0/15-0-configure-self-managed-cert-based-kube-feature-flag.yml b/data/removals/15_0/15-0-configure-self-managed-cert-based-kube-feature-flag.yml
new file mode 100644
index 00000000000..a4b8b422dd9
--- /dev/null
+++ b/data/removals/15_0/15-0-configure-self-managed-cert-based-kube-feature-flag.yml
@@ -0,0 +1,24 @@
+- name: "Self-managed certificate-based integration with Kubernetes feature flagged"
+ announcement_milestone: "14.5"
+ announcement_date: "2021-11-15"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: nagyv-gitlab
+ stage: Configure
+ issue_url: https://gitlab.com/groups/gitlab-org/configure/-/epics/8
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ In 15.0 the certificate-based integration with Kubernetes will be disabled by default.
+
+ After 15.0, you should use the [agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. The agent for Kubernetes is a more robust, secure, and reliable integration with Kubernetes. [How do I migrate to the agent?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
+
+ If you need more time to migrate, you can enable the `certificate_based_clusters` [feature flag](https://docs.gitlab.com/ee/administration/feature_flags.html), which re-enables the certificate-based integration.
+
+ In GitLab 16.0, we will [remove the feature, its related code, and the feature flag](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). GitLab will continue to fix any security or critical issues until 16.0.
+
+ For updates and details, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+#
+# OPTIONAL FIELDS
+#
+ tiers: [Core, Premium, Ultimate]
+ documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated'
diff --git a/data/removals/15_0/15-0-removal-artifacts-keyword.yml b/data/removals/15_0/15-0-removal-artifacts-keyword.yml
index 39f618c47f5..29edd922eae 100644
--- a/data/removals/15_0/15-0-removal-artifacts-keyword.yml
+++ b/data/removals/15_0/15-0-removal-artifacts-keyword.yml
@@ -1,11 +1,11 @@
-- name: "`artifacts:report:cobertura` keyword"
+- name: "`artifacts:reports:cobertura` keyword"
announcement_milestone: "14.7"
announcement_date: "2022-02-22"
removal_milestone: "15.0"
removal_date: "2022-05-22"
breaking_change: false
body: |
- As of GitLab 15.0, the [`artifacts:report:cobertura`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscobertura-removed)
+ As of GitLab 15.0, the [`artifacts:reports:cobertura`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscobertura-removed)
keyword has been [replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/344533) by
[`artifacts:reports:coverage_report`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscoverage_report).
Cobertura is the only supported report file, but this is the first step towards GitLab supporting other report types.
diff --git a/data/removals/15_0/15-0-remove-background-upload-object-storage.yml b/data/removals/15_0/15-0-remove-background-upload-object-storage.yml
index 7d077175b29..16aab3d14c2 100644
--- a/data/removals/15_0/15-0-remove-background-upload-object-storage.yml
+++ b/data/removals/15_0/15-0-remove-background-upload-object-storage.yml
@@ -7,13 +7,46 @@
reporter: fzimmer
body: | # Do not modify this line, instead modify the lines below.
To reduce the overall complexity and maintenance burden of GitLab's [object storage feature](https://docs.gitlab.com/ee/administration/object_storage.html), support for using `background_upload` has been removed in GitLab 15.0.
+ By default [direct upload](https://docs.gitlab.com/ee/development/uploads/index.html#direct-upload) will be used.
- This impacts a small subset of object storage providers, including but not limited to:
+ This impacts a subset of object storage providers, including but not limited to:
- **OpenStack** Customers using OpenStack need to change their configuration to use the S3 API instead of Swift.
- **RackSpace** Customers using RackSpace-based object storage need to migrate data to a different provider.
If your object storage provider does not support `background_upload`, please [migrate objects to a supported object storage provider](https://docs.gitlab.com/ee/administration/object_storage.html#migrate-objects-to-a-different-object-storage-provider).
+
+ #### Encrypted S3 buckets
+
+ Additionally, this also breaks the use of [encrypted S3 buckets](https://docs.gitlab.com/ee/administration/object_storage.html#encrypted-s3-buckets) with [storage-specific configuration form](https://docs.gitlab.com/ee/administration/object_storage.html#storage-specific-configuration).
+
+ If your S3 buckets have [SSE-S3 or SSE-KMS encryption enabled](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html), please [migrate your configuration to use consolidated object storage form](https://docs.gitlab.com/ee/administration/object_storage.html#transition-to-consolidated-form) before upgrading to GitLab 15.0. Otherwise, you may start getting `ETag mismatch` errors during objects upload.
+
+ #### 403 errors
+
+ If you see 403 errors when uploading to object storage after
+ upgrading to GitLab 15.0, check that the [correct permissions](https://docs.gitlab.com/ee/administration/object_storage.html#iam-permissions)
+ are assigned to the bucket. Direct upload needs the ability to delete an
+ object (example: `s3:DeleteObject`), but background uploads do not.
+
+ #### `remote_directory` with a path prefix
+
+ If the object storage `remote_directory` configuration contains a slash (`/`) after the bucket (example: `gitlab/uploads`), be aware that this [was never officially supported](https://gitlab.com/gitlab-org/gitlab/-/issues/292958).
+ Some users found that they could specify a path prefix to the bucket. In direct upload mode, object storage uploads will fail if a slash is present in GitLab 15.0.
+
+ If you have set a prefix, you can use a workaround to revert to background uploads:
+
+ 1. Continue to use [storage-specific configuration](https://docs.gitlab.com/ee/administration/object_storage.html#storage-specific-configuration).
+ 1. In Omnibus GitLab, set the `GITLAB_LEGACY_BACKGROUND_UPLOADS` to re-enable background uploads:
+
+ ```ruby
+ gitlab_rails['env'] = { 'GITLAB_LEGACY_BACKGROUND_UPLOADS' => 'artifacts,external_diffs,lfs,uploads,packages,dependency_proxy,terraform_state,pages' }
+ ```
+
+ Prefixes will be supported officially in [GitLab 15.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91307).
+ This workaround will be dropped, so we encourage migrating to consolidated object storage.
+
+
stage: Enablement
tiers: [Core, Premium, Ultimate]
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/26600
diff --git a/data/removals/15_2/removal-outdated-browser-support.yml b/data/removals/15_2/removal-outdated-browser-support.yml
new file mode 100644
index 00000000000..84b2fa32020
--- /dev/null
+++ b/data/removals/15_2/removal-outdated-browser-support.yml
@@ -0,0 +1,20 @@
+- name: "Support for older browsers"
+ removal_date: July 22, 2022
+ removal_milestone: "15.2"
+ reporter: leipert
+ breaking_change: false
+ body: |
+ In GitLab 15.2, we are cleaning up and [removing old code](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86003) that was specific for browsers that we no longer support. This has no impact on users if they use one of our [supported web browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers).
+
+ Most notably, support for the following browsers has been removed:
+
+ - Apple Safari 14 and older.
+ - Mozilla Firefox 78.
+
+ The minimum supported browser versions are:
+
+ - Apple Safari 14.1.
+ - Mozilla Firefox 91.
+ - Google Chrome 92.
+ - Chromium 92.
+ - Microsoft Edge 92.
diff --git a/data/whats_new/202206220001_15_1.yml b/data/whats_new/202206220001_15_1.yml
new file mode 100644
index 00000000000..76ef7fd1a46
--- /dev/null
+++ b/data/whats_new/202206220001_15_1.yml
@@ -0,0 +1,59 @@
+# This is a template for a "Whats New" release.
+# A release typically contains multiple entries of features that we'd like to highlight.
+#
+# Below is an example of what a single entry should look like, it's required attributes,
+# and what types we expect those attribute values to be. All attributes are required.
+#
+# For more information please refer to the handbook documentation here:
+# https://about.gitlab.com/handbook/marketing/blog/release-posts/index.html#create-mr-for-whats-new-entries
+#
+# Please delete this line and above before submitting your merge request.
+
+- title: SAML Group Sync for self-managed GitLab
+ body: | # Do not modify this line, instead modify the lines below.
+ You can now map a group in your identity provider to a self-managed GitLab group using SAML group links. Previously, this feature was only available for GitLab.com. Group memberships are updated when a user logs into GitLab through their SAML provider. This new functionality decreases the workload for GitLab administrators and reduces onboarding time for group members.
+ stage: manage # String value of the stage that the feature was created in. e.g., Growth
+ self-managed: true
+ gitlab-com: true
+ packages: [Premium, Ultimate]
+ url: https://docs.gitlab.com/ee/user/group/saml_sso/group_sync.html
+ image_url: https://about.gitlab.com/images/15_1/SAML_Group_Sync.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
+ published_at: 2022-06-22
+ release: 15.1
+- title: Enhancing visibility into Value Stream with DORA metrics
+ body: | # Do not modify this line, instead modify the lines below.
+ With the addition of the four [DORA metrics](https://docs.gitlab.com/ee/user/analytics/#devops-research-and-assessment-dora-key-metrics) tiles to the [Value Stream Analytics](https://docs.gitlab.com/ee/user/group/value_stream_analytics/) dashboard, you can now track team performance and value flow from ideation to customer delivery. Additionally, we added a new trend chart for the DORA [Time to restore service](https://docs.gitlab.com/ee/user/analytics/ci_cd_analytics.html) metric to provide insights into software stability and reliability trends. This new chart shows information about how long it takes an organization to recover from a failure in production. This is the third DORA chart that's available out of the box in GitLab. We plan to keep improving the visibility into DORA metrics and also add charts for the fourth metric- Change failure rate.
+ stage: manage # String value of the stage that the feature was created in. e.g., Growth
+ self-managed: true
+ gitlab-com: true
+ packages: [Free, Premium, Ultimate]
+ url: https://docs.gitlab.com/ee/user/analytics/ci_cd_analytics.html
+ image_url: https://about.gitlab.com/images/15_1/vsa_dora_n_ttrs.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
+ published_at: 2022-06-22
+ release: 15.1
+- title: "SLSA-2 attestation included for build artifacts"
+ body: | # Do not modify this line, instead modify the lines below.
+ [Supply-chain Levels for Software Artifacts (SLSA)](https://github.com/slsa-framework/slsa) is a security framework that helps ensure the security and integrity of your software supply chain. By default, GitLab Runner is now capable of generating and producing SLSA-2 compliant attestation metadata for build artifacts.
+ If the artifact is stored in a registry, then the attestation metadata is stored alongside the artifact in that registry. Otherwise, the metadata is in rendered in a plain text `.json` file that's stored with the artifact.
+ This new attestation information can help you more easily verify that your build artifacts have not been tampered with. To enable this feature, simply set `RUNNER_GENERATE_ARTIFACTS_METADATA = "true"` in your `.gitlab-ci.yml` file.
+ As part of the Limited Availability release, CI jobs that run on the macOS runners will count toward your CI/CD minutes quota at a [cost factor](https://docs.gitlab.com/ee/ci/pipelines/cicd_minutes.html#cost-factor) of 6.
+ stage: verify
+ self-managed: true
+ gitlab-com: true
+ packages: [Free, Premium, Ultimate]
+ url: https://docs.gitlab.com/ee/ci/runners/configure_runners.html#artifact-attestation
+ image_url: https://www.youtube.com/embed/MlIdqrDgI8U
+ published_at: 2022-06-22
+ release: 15.1
+- title: "Link to included CI/CD configuration from the pipeline editor"
+ body: | # Do not modify this line, instead modify the lines below.
+ A typical CI/CD configuration uses the `include` keyword to import configuration stored in other files or CI/CD templates. When editing or troubleshooting your configuration though, it can be difficult to understand how all the configuration works together because the included configuration is not visible in your `.gitlab-ci-yml`, you only see the `include` entry.
+ In this release, we added links to all included configuration files and templates to the pipeline editor. Now you can easily access and view all the CI/CD configuration your pipeline uses, making it much easier to manage large and complex pipelines.
+ stage: verify
+ self-managed: true
+ gitlab-com: true
+ packages: [Free, Premium, Ultimate]
+ url: https://docs.gitlab.com/ee/ci/pipeline_editor/
+ image_url: https://www.youtube.com/embed/7BNDUYfY_ok
+ published_at: 2022-06-22
+ release: 15.1
diff --git a/db/docs/broadcast_messages.yml b/db/docs/broadcast_messages.yml
index da8693df4fc..1e4c181d48f 100644
--- a/db/docs/broadcast_messages.yml
+++ b/db/docs/broadcast_messages.yml
@@ -3,7 +3,7 @@ table_name: broadcast_messages
classes:
- BroadcastMessage
feature_categories:
-- navigation
-description: TODO
+- onboarding
+description: GitLab can display broadcast messages to users of a GitLab instance
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f1ecf53c1e55fbbc66cb2d7d12fb411cbfc2ace8
milestone: '6.3'
diff --git a/db/docs/ci_job_token_project_scope_links.yml b/db/docs/ci_job_token_project_scope_links.yml
index e073b63e924..993d392bb93 100644
--- a/db/docs/ci_job_token_project_scope_links.yml
+++ b/db/docs/ci_job_token_project_scope_links.yml
@@ -3,7 +3,7 @@ table_name: ci_job_token_project_scope_links
classes:
- Ci::JobToken::ProjectScopeLink
feature_categories:
-- pipeline_authoring
-description: TODO
+- continuous_integration
+description: The connection between a source project, which defines the job token scope, and a target project, which is the one allowed to be accessed by the job token.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62733
milestone: '14.0'
diff --git a/db/docs/ci_runner_versions.yml b/db/docs/ci_runner_versions.yml
new file mode 100644
index 00000000000..e0221e3956f
--- /dev/null
+++ b/db/docs/ci_runner_versions.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_runner_versions
+classes:
+- Ci::RunnerVersion
+feature_categories:
+- runner_fleet
+description: Information about used Ci::Runner versions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90982
+milestone: '15.2'
diff --git a/db/docs/ci_secure_file_states.yml b/db/docs/ci_secure_file_states.yml
new file mode 100644
index 00000000000..5e8a748e52a
--- /dev/null
+++ b/db/docs/ci_secure_file_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_secure_file_states
+classes:
+- Geo::CiSecureFileState
+feature_categories:
+- pipeline_authoring
+description: Stores verification state for Geo replicated Project-level Secure Files.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90510
+milestone: '15.2'
diff --git a/db/docs/clusters_applications_elastic_stacks.yml b/db/docs/clusters_applications_elastic_stacks.yml
deleted file mode 100644
index 97943a9516b..00000000000
--- a/db/docs/clusters_applications_elastic_stacks.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-table_name: clusters_applications_elastic_stacks
-classes:
-- Clusters::Applications::ElasticStack
-feature_categories:
-- kubernetes_management
-description: (Deprecated) A GitLab managed Elastic Stack installation in a Kubernetes cluster
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18015
-milestone: '12.5'
diff --git a/db/docs/clusters_integration_elasticstack.yml b/db/docs/clusters_integration_elasticstack.yml
deleted file mode 100644
index 2c2261a53e2..00000000000
--- a/db/docs/clusters_integration_elasticstack.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-table_name: clusters_integration_elasticstack
-classes:
-- Clusters::Integrations::ElasticStack
-feature_categories:
-- configure
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61077
-milestone: '13.12'
diff --git a/db/docs/namespace_bans.yml b/db/docs/namespace_bans.yml
new file mode 100644
index 00000000000..7e11738ab81
--- /dev/null
+++ b/db/docs/namespace_bans.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_bans
+classes:
+ - NamespaceBan
+feature_categories:
+ - instance_resiliency
+description: Contains users banned from namespaces
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91271
+milestone: "15.2"
diff --git a/db/docs/project_relation_export_uploads.yml b/db/docs/project_relation_export_uploads.yml
new file mode 100644
index 00000000000..369f6d281ee
--- /dev/null
+++ b/db/docs/project_relation_export_uploads.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_relation_export_uploads
+classes:
+- Projects::ImportExport::RelationExportUpload
+feature_categories:
+- importers
+description: Used to store relation export files location
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90624
+milestone: '15.2'
diff --git a/db/docs/project_relation_exports.yml b/db/docs/project_relation_exports.yml
new file mode 100644
index 00000000000..7014d4cae0d
--- /dev/null
+++ b/db/docs/project_relation_exports.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_relation_exports
+classes:
+- Projects::ImportExport::RelationExport
+feature_categories:
+- importers
+description: Used to track the generation of relation export files for projects
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90624
+milestone: '15.2'
diff --git a/db/docs/project_tracing_settings.yml b/db/docs/project_tracing_settings.yml
deleted file mode 100644
index 1a864dc7eae..00000000000
--- a/db/docs/project_tracing_settings.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-table_name: project_tracing_settings
-classes:
-- ProjectTracingSetting
-feature_categories:
-- tracing
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7903
-milestone: '11.5'
diff --git a/db/docs/sbom_component_versions.yml b/db/docs/sbom_component_versions.yml
new file mode 100644
index 00000000000..7fb9b7fcec5
--- /dev/null
+++ b/db/docs/sbom_component_versions.yml
@@ -0,0 +1,11 @@
+---
+table_name: sbom_component_versions
+classes:
+- Sbom::ComponentVersion
+feature_categories:
+- container_scanning
+- dependency_scanning
+- license_compliance
+description: Stores version information for software components produced by a Software Bill of Materials (SBoM)
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90809
+milestone: '15.2'
diff --git a/db/docs/sbom_components.yml b/db/docs/sbom_components.yml
new file mode 100644
index 00000000000..8860c253cd5
--- /dev/null
+++ b/db/docs/sbom_components.yml
@@ -0,0 +1,11 @@
+---
+table_name: sbom_components
+classes:
+- Sbom::Component
+feature_categories:
+- container_scanning
+- dependency_scanning
+- license_compliance
+description: Stores information about software components produced by a Software Bill of Materials (SBoM)
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90809
+milestone: '15.2'
diff --git a/db/docs/sbom_occurrences.yml b/db/docs/sbom_occurrences.yml
new file mode 100644
index 00000000000..82d9e21aa42
--- /dev/null
+++ b/db/docs/sbom_occurrences.yml
@@ -0,0 +1,11 @@
+---
+table_name: sbom_occurrences
+classes:
+- Sbom::Occurrence
+feature_categories:
+- container_scanning
+- dependency_scanning
+- license_compliance
+description: Tracks each occurrence of an SBoM component
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90814
+milestone: '15.2'
diff --git a/db/docs/sbom_sources.yml b/db/docs/sbom_sources.yml
new file mode 100644
index 00000000000..514386536da
--- /dev/null
+++ b/db/docs/sbom_sources.yml
@@ -0,0 +1,11 @@
+---
+table_name: sbom_sources
+classes:
+- Sbom::Source
+feature_categories:
+- container_scanning
+- dependency_scanning
+- license_compliance
+description: Stores information about where an SBoM component originated from
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90812
+milestone: '15.2'
diff --git a/db/docs/user_namespace_callouts.yml b/db/docs/user_namespace_callouts.yml
new file mode 100644
index 00000000000..5038ecce3bc
--- /dev/null
+++ b/db/docs/user_namespace_callouts.yml
@@ -0,0 +1,10 @@
+
+---
+table_name: user_namespace_callouts
+classes:
+- Users::NamespaceCallout
+feature_categories:
+- navigation
+description: Contains records of which users have dismissed a callout, grouped by namespace.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91092
+milestone: '15.2'
diff --git a/db/docs/vulnerability_merge_request_links.yml b/db/docs/vulnerability_merge_request_links.yml
new file mode 100644
index 00000000000..7c9d958303f
--- /dev/null
+++ b/db/docs/vulnerability_merge_request_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_merge_request_links
+classes:
+- Vulnerabilities::MergeRequestLink
+feature_categories:
+- vulnerability_management
+description: Join table between Vulnerabilities and Merge Requests
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92096
+milestone: '15.2'
diff --git a/db/fixtures/development/06_teams.rb b/db/fixtures/development/06_teams.rb
index 7aaaa48d6d4..71fe0df70f4 100644
--- a/db/fixtures/development/06_teams.rb
+++ b/db/fixtures/development/06_teams.rb
@@ -4,7 +4,7 @@ Sidekiq::Testing.inline! do
Gitlab::Seeder.quiet do
Group.not_mass_generated.each do |group|
User.not_mass_generated.sample(4).each do |user|
- if group.add_user(user, Gitlab::Access.values.sample).persisted?
+ if group.add_member(user, Gitlab::Access.values.sample).persisted?
print '.'
else
print 'F'
diff --git a/db/fixtures/development/33_triage_ops.rb b/db/fixtures/development/33_triage_ops.rb
index aaf92315125..b2dd3861169 100644
--- a/db/fixtures/development/33_triage_ops.rb
+++ b/db/fixtures/development/33_triage_ops.rb
@@ -11,29 +11,31 @@ class Gitlab::Seeder::TriageOps
puts "Updating settings to allow web hooks to localhost"
ApplicationSetting.current_without_cache.update!(allow_local_requests_from_web_hooks_and_services: true)
- Sidekiq::Testing.inline! do
- puts "Ensuring required groups"
- ensure_group('gitlab-com')
- ensure_group('gitlab-com/gl-security/appsec')
- ensure_group('gitlab-jh/jh-team')
- ensure_group('gitlab-org')
- ensure_group('gitlab-org/gitlab-core-team/community-members')
- ensure_group('gitlab-org/security')
-
- puts "Ensuring required projects"
- ensure_project('gitlab-org/gitlab')
- ensure_project('gitlab-org/security/gitlab')
-
- puts "Ensuring required bot user"
- ensure_bot_user
-
- puts "Setting up webhooks"
- ensure_webhook_for('gitlab-com')
- ensure_webhook_for('gitlab-org')
-
- puts "Ensuring work type labels"
- ensure_work_type_labels_for('gitlab-com')
- ensure_work_type_labels_for('gitlab-org')
+ Sidekiq::Worker.skipping_transaction_check do
+ Sidekiq::Testing.inline! do
+ puts "Ensuring required groups"
+ ensure_group('gitlab-com')
+ ensure_group('gitlab-com/gl-security/appsec')
+ ensure_group('gitlab-jh/jh-team')
+ ensure_group('gitlab-org')
+ ensure_group('gitlab-org/gitlab-core-team/community-members')
+ ensure_group('gitlab-org/security')
+
+ puts "Ensuring required projects"
+ ensure_project('gitlab-org/gitlab')
+ ensure_project('gitlab-org/security/gitlab')
+
+ puts "Ensuring required bot user"
+ ensure_bot_user
+
+ puts "Setting up webhooks"
+ ensure_webhook_for('gitlab-com')
+ ensure_webhook_for('gitlab-org')
+
+ puts "Ensuring work type labels"
+ ensure_work_type_labels_for('gitlab-com')
+ ensure_work_type_labels_for('gitlab-org')
+ end
end
end
diff --git a/db/migrate/20220523162734_add_vulnerability_reads_casted_cluster_agent_column.rb b/db/migrate/20220523162734_add_vulnerability_reads_casted_cluster_agent_column.rb
new file mode 100644
index 00000000000..ce222906e25
--- /dev/null
+++ b/db/migrate/20220523162734_add_vulnerability_reads_casted_cluster_agent_column.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddVulnerabilityReadsCastedClusterAgentColumn < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def change
+ add_column :vulnerability_reads, :casted_cluster_agent_id, :bigint
+ end
+end
diff --git a/db/migrate/20220523163734_update_vulnerability_reads_trigger_functions.rb b/db/migrate/20220523163734_update_vulnerability_reads_trigger_functions.rb
new file mode 100644
index 00000000000..645d19c8f51
--- /dev/null
+++ b/db/migrate/20220523163734_update_vulnerability_reads_trigger_functions.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+class UpdateVulnerabilityReadsTriggerFunctions < Gitlab::Database::Migration[2.0]
+ AGENT_ID_VALUE = "NEW.location->'kubernetes_resource'->>'agent_id'"
+ CASTED_AGENT_ID_VALUE = "CAST(#{AGENT_ID_VALUE} AS bigint)"
+
+ def up
+ update_insert_or_update_vulnerability_reads_function(with_casted_cluster_agent_id: true)
+ update_update_location_from_vulnerability_occurrences_function(with_casted_cluster_agent_id: true)
+ end
+
+ def down
+ update_insert_or_update_vulnerability_reads_function(with_casted_cluster_agent_id: false)
+ update_update_location_from_vulnerability_occurrences_function(with_casted_cluster_agent_id: false)
+ end
+
+ private
+
+ def update_insert_or_update_vulnerability_reads_function(with_casted_cluster_agent_id: false)
+ insert_fields = with_casted_cluster_agent_id ? 'cluster_agent_id, casted_cluster_agent_id' : 'cluster_agent_id'
+ insert_values = with_casted_cluster_agent_id ? [AGENT_ID_VALUE, CASTED_AGENT_ID_VALUE].join(', ') : AGENT_ID_VALUE
+
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION insert_or_update_vulnerability_reads()
+ RETURNS TRIGGER
+ LANGUAGE plpgsql
+ AS $$
+ DECLARE
+ severity smallint;
+ state smallint;
+ report_type smallint;
+ resolved_on_default_branch boolean;
+ BEGIN
+ IF (NEW.vulnerability_id IS NULL AND (TG_OP = 'INSERT' OR TG_OP = 'UPDATE')) THEN
+ RETURN NULL;
+ END IF;
+
+ IF (TG_OP = 'UPDATE' AND OLD.vulnerability_id IS NOT NULL AND NEW.vulnerability_id IS NOT NULL) THEN
+ RETURN NULL;
+ END IF;
+
+ SELECT
+ vulnerabilities.severity, vulnerabilities.state, vulnerabilities.report_type, vulnerabilities.resolved_on_default_branch
+ INTO
+ severity, state, report_type, resolved_on_default_branch
+ FROM
+ vulnerabilities
+ WHERE
+ vulnerabilities.id = NEW.vulnerability_id;
+
+ INSERT INTO vulnerability_reads (vulnerability_id, project_id, scanner_id, report_type, severity, state, resolved_on_default_branch, uuid, location_image, #{insert_fields})
+ VALUES (NEW.vulnerability_id, NEW.project_id, NEW.scanner_id, report_type, severity, state, resolved_on_default_branch, NEW.uuid::uuid, NEW.location->>'image', #{insert_values})
+ ON CONFLICT(vulnerability_id) DO NOTHING;
+ RETURN NULL;
+ END
+ $$;
+ SQL
+ end
+
+ def update_update_location_from_vulnerability_occurrences_function(with_casted_cluster_agent_id: false)
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION update_location_from_vulnerability_occurrences()
+ RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+ BEGIN
+ UPDATE
+ vulnerability_reads
+ SET
+ location_image = NEW.location->>'image',
+ #{with_casted_cluster_agent_id ? "casted_cluster_agent_id = #{CASTED_AGENT_ID_VALUE}," : ''}
+ cluster_agent_id = #{AGENT_ID_VALUE}
+ WHERE
+ vulnerability_id = NEW.vulnerability_id;
+ RETURN NULL;
+
+ END
+ $$;
+ SQL
+ end
+end
diff --git a/db/migrate/20220524164122_limit_project_and_group_variables.rb b/db/migrate/20220524164122_limit_project_and_group_variables.rb
new file mode 100644
index 00000000000..e8776e35730
--- /dev/null
+++ b/db/migrate/20220524164122_limit_project_and_group_variables.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class LimitProjectAndGroupVariables < Gitlab::Database::Migration[2.0]
+ def change
+ add_column(:plan_limits, :project_ci_variables, :integer, default: 200, null: false)
+ add_column(:plan_limits, :group_ci_variables, :integer, default: 200, null: false)
+ end
+end
diff --git a/db/migrate/20220531024905_add_operations_access_levels_to_project_feature.rb b/db/migrate/20220531024905_add_operations_access_levels_to_project_feature.rb
new file mode 100644
index 00000000000..68921cd1468
--- /dev/null
+++ b/db/migrate/20220531024905_add_operations_access_levels_to_project_feature.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class AddOperationsAccessLevelsToProjectFeature < Gitlab::Database::Migration[2.0]
+ OPERATIONS_DEFAULT_VALUE = 20
+
+ enable_lock_retries!
+
+ # rubocop:disable Layout/LineLength
+ def up
+ add_column :project_features, :monitor_access_level, :integer, null: false, default: OPERATIONS_DEFAULT_VALUE
+ add_column :project_features, :infrastructure_access_level, :integer, null: false, default: OPERATIONS_DEFAULT_VALUE
+ add_column :project_features, :feature_flags_access_level, :integer, null: false, default: OPERATIONS_DEFAULT_VALUE
+ add_column :project_features, :environments_access_level, :integer, null: false, default: OPERATIONS_DEFAULT_VALUE
+ add_column :project_features, :releases_access_level, :integer, null: false, default: OPERATIONS_DEFAULT_VALUE
+ end
+
+ def down
+ remove_column :project_features, :monitor_access_level
+ remove_column :project_features, :infrastructure_access_level
+ remove_column :project_features, :feature_flags_access_level
+ remove_column :project_features, :environments_access_level
+ remove_column :project_features, :releases_access_level
+ end
+end
diff --git a/db/migrate/20220531140515_add_applies_to_all_protected_branches_to_approval_project_rule.rb b/db/migrate/20220531140515_add_applies_to_all_protected_branches_to_approval_project_rule.rb
new file mode 100644
index 00000000000..4015d3fa1f7
--- /dev/null
+++ b/db/migrate/20220531140515_add_applies_to_all_protected_branches_to_approval_project_rule.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddAppliesToAllProtectedBranchesToApprovalProjectRule < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :approval_project_rules, :applies_to_all_protected_branches, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20220608074738_add_max_repository_downloads_limit_to_application_settings.rb b/db/migrate/20220608074738_add_max_repository_downloads_limit_to_application_settings.rb
new file mode 100644
index 00000000000..9252262c26f
--- /dev/null
+++ b/db/migrate/20220608074738_add_max_repository_downloads_limit_to_application_settings.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddMaxRepositoryDownloadsLimitToApplicationSettings < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings, :max_number_of_repository_downloads,
+ :smallint,
+ default: 0,
+ null: false
+
+ add_column :application_settings, :max_number_of_repository_downloads_within_time_period,
+ :integer,
+ default: 0,
+ null: false
+ end
+end
diff --git a/db/migrate/20220610140605_change_public_projects_cost_factor.rb b/db/migrate/20220610140605_change_public_projects_cost_factor.rb
new file mode 100644
index 00000000000..cf0c275828c
--- /dev/null
+++ b/db/migrate/20220610140605_change_public_projects_cost_factor.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class ChangePublicProjectsCostFactor < Gitlab::Database::Migration[2.0]
+ # This migration updates SaaS Runner cost factors for public projects.
+ # Previously we had a disabled cost factor for public projects, meaning
+ # that no CI minutes were counted by default. With a low cost factor
+ # we count CI minutes consumption at a very low rate to prevent
+ # abuses.
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ DISABLED_COST_FACTOR = 0
+ LOW_COST_FACTOR = 0.008
+
+ class Runner < MigrationRecord
+ self.table_name = 'ci_runners'
+
+ scope :shared, -> { where(runner_type: 1) }
+ end
+
+ def up
+ return unless Gitlab.com?
+
+ Runner.shared.where(public_projects_minutes_cost_factor: DISABLED_COST_FACTOR)
+ .update_all(public_projects_minutes_cost_factor: LOW_COST_FACTOR)
+ end
+
+ def down
+ return unless Gitlab.com?
+
+ Runner.shared.where(public_projects_minutes_cost_factor: LOW_COST_FACTOR)
+ .update_all(public_projects_minutes_cost_factor: DISABLED_COST_FACTOR)
+ end
+end
diff --git a/db/migrate/20220613054349_add_unique_project_download_limit_settings_to_namespace_settings.rb b/db/migrate/20220613054349_add_unique_project_download_limit_settings_to_namespace_settings.rb
new file mode 100644
index 00000000000..7e821cb17a2
--- /dev/null
+++ b/db/migrate/20220613054349_add_unique_project_download_limit_settings_to_namespace_settings.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class AddUniqueProjectDownloadLimitSettingsToNamespaceSettings < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def change
+ add_column :namespace_settings, :unique_project_download_limit, :smallint,
+ default: 0, null: false
+ add_column :namespace_settings, :unique_project_download_limit_interval_in_seconds, :integer,
+ default: 0, null: false
+ end
+end
diff --git a/db/migrate/20220614120415_add_toggle_opt_in_jwt.rb b/db/migrate/20220614120415_add_toggle_opt_in_jwt.rb
new file mode 100644
index 00000000000..40e07504ac6
--- /dev/null
+++ b/db/migrate/20220614120415_add_toggle_opt_in_jwt.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddToggleOptInJwt < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :project_ci_cd_settings, :opt_in_jwt, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20220616182001_create_sbom_components.rb b/db/migrate/20220616182001_create_sbom_components.rb
new file mode 100644
index 00000000000..59e8e76393a
--- /dev/null
+++ b/db/migrate/20220616182001_create_sbom_components.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class CreateSbomComponents < Gitlab::Database::Migration[2.0]
+ def change
+ create_table :sbom_components do |t|
+ t.timestamps_with_timezone
+ t.integer :component_type, null: false, limit: 2
+ t.text :name, null: false, limit: 255
+ end
+ end
+end
diff --git a/db/migrate/20220616182015_create_sbom_component_versions.rb b/db/migrate/20220616182015_create_sbom_component_versions.rb
new file mode 100644
index 00000000000..aea99c8c0ce
--- /dev/null
+++ b/db/migrate/20220616182015_create_sbom_component_versions.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateSbomComponentVersions < Gitlab::Database::Migration[2.0]
+ def change
+ create_table :sbom_component_versions do |t|
+ t.timestamps_with_timezone
+ t.references :component,
+ index: true,
+ null: false,
+ foreign_key: { to_table: :sbom_components, on_delete: :cascade }
+
+ t.text :version, null: false, limit: 255
+ end
+ end
+end
diff --git a/db/migrate/20220616182016_create_sbom_sources.rb b/db/migrate/20220616182016_create_sbom_sources.rb
new file mode 100644
index 00000000000..b4fe9519f7b
--- /dev/null
+++ b/db/migrate/20220616182016_create_sbom_sources.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class CreateSbomSources < Gitlab::Database::Migration[2.0]
+ def change
+ create_table :sbom_sources do |t|
+ t.timestamps_with_timezone
+ t.integer :source_type, null: false, limit: 2
+ t.jsonb :source, null: false, default: {}
+ t.binary :fingerprint, null: false
+ end
+ end
+end
diff --git a/db/migrate/20220616182038_create_sbom_occurrences.rb b/db/migrate/20220616182038_create_sbom_occurrences.rb
new file mode 100644
index 00000000000..8fc80970d45
--- /dev/null
+++ b/db/migrate/20220616182038_create_sbom_occurrences.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class CreateSbomOccurrences < Gitlab::Database::Migration[2.0]
+ def change
+ create_table :sbom_occurrences do |t|
+ t.timestamps_with_timezone
+ t.bigint :component_version_id, null: false, index: true
+ t.bigint :project_id, null: false, index: true
+ t.bigint :pipeline_id, index: true
+ t.bigint :source_id, index: true
+ t.binary :commit_sha, null: false
+ end
+ end
+end
diff --git a/db/migrate/20220616183240_add_sbom_component_versions_foreign_key_to_sbom_occurrences.rb b/db/migrate/20220616183240_add_sbom_component_versions_foreign_key_to_sbom_occurrences.rb
new file mode 100644
index 00000000000..abaf9939456
--- /dev/null
+++ b/db/migrate/20220616183240_add_sbom_component_versions_foreign_key_to_sbom_occurrences.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddSbomComponentVersionsForeignKeyToSbomOccurrences < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :sbom_occurrences,
+ :sbom_component_versions,
+ column: :component_version_id,
+ on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :sbom_occurrences, column: :component_version_id
+ end
+ end
+end
diff --git a/db/migrate/20220616183309_add_sbom_source_foreign_key_to_sbom_occurrences.rb b/db/migrate/20220616183309_add_sbom_source_foreign_key_to_sbom_occurrences.rb
new file mode 100644
index 00000000000..3818e5f51c7
--- /dev/null
+++ b/db/migrate/20220616183309_add_sbom_source_foreign_key_to_sbom_occurrences.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddSbomSourceForeignKeyToSbomOccurrences < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :sbom_occurrences, :sbom_sources, column: :source_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :sbom_occurrences, column: :source_id
+ end
+ end
+end
diff --git a/db/migrate/20220616183310_add_project_foreign_key_to_sbom_occurrences.rb b/db/migrate/20220616183310_add_project_foreign_key_to_sbom_occurrences.rb
new file mode 100644
index 00000000000..d2e32ffbb3f
--- /dev/null
+++ b/db/migrate/20220616183310_add_project_foreign_key_to_sbom_occurrences.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddProjectForeignKeyToSbomOccurrences < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :sbom_occurrences, :projects, column: :project_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :sbom_occurrences, column: :project_id
+ end
+ end
+end
diff --git a/db/migrate/20220617123135_drop_temp_index_on_projects_on_id_and_runners_token.rb b/db/migrate/20220617123135_drop_temp_index_on_projects_on_id_and_runners_token.rb
new file mode 100644
index 00000000000..c860a2208fe
--- /dev/null
+++ b/db/migrate/20220617123135_drop_temp_index_on_projects_on_id_and_runners_token.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class DropTempIndexOnProjectsOnIdAndRunnersToken < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ TEMP_INDEX_NAME = 'tmp_index_projects_on_id_and_runners_token'
+
+ def up
+ finalize_background_migration 'ResetDuplicateCiRunnersTokenValuesOnProjects'
+
+ remove_concurrent_index_by_name :projects, TEMP_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :projects,
+ [:id, :runners_token],
+ where: "runners_token IS NOT NULL",
+ unique: false,
+ name: TEMP_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220617123144_drop_temp_index_on_projects_on_id_and_runners_token_encrypted.rb b/db/migrate/20220617123144_drop_temp_index_on_projects_on_id_and_runners_token_encrypted.rb
new file mode 100644
index 00000000000..254a73a9b1f
--- /dev/null
+++ b/db/migrate/20220617123144_drop_temp_index_on_projects_on_id_and_runners_token_encrypted.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class DropTempIndexOnProjectsOnIdAndRunnersTokenEncrypted < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ TEMP_INDEX_NAME = 'tmp_index_projects_on_id_and_runners_token_encrypted'
+
+ def up
+ finalize_background_migration 'ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects'
+
+ remove_concurrent_index_by_name :projects, TEMP_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :projects,
+ [:id, :runners_token_encrypted],
+ where: "runners_token_encrypted IS NOT NULL",
+ unique: false,
+ name: TEMP_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220617141347_create_ci_secure_file_states.rb b/db/migrate/20220617141347_create_ci_secure_file_states.rb
new file mode 100644
index 00000000000..63cbcca2913
--- /dev/null
+++ b/db/migrate/20220617141347_create_ci_secure_file_states.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+# rubocop:disable Layout/LineLength
+
+class CreateCiSecureFileStates < Gitlab::Database::Migration[2.0]
+ VERIFICATION_STATE_INDEX_NAME = "index_ci_secure_file_states_on_verification_state"
+ PENDING_VERIFICATION_INDEX_NAME = "index_ci_secure_file_states_pending_verification"
+ FAILED_VERIFICATION_INDEX_NAME = "index_ci_secure_file_states_failed_verification"
+ NEEDS_VERIFICATION_INDEX_NAME = "index_ci_secure_file_states_needs_verification"
+
+ enable_lock_retries!
+
+ def up
+ create_table :ci_secure_file_states, id: false do |t|
+ t.datetime_with_timezone :verification_started_at
+ t.datetime_with_timezone :verification_retry_at
+ t.datetime_with_timezone :verified_at
+ t.references :ci_secure_file, primary_key: true, null: false, foreign_key: { on_delete: :cascade }
+ t.integer :verification_state, default: 0, limit: 2, null: false
+ t.integer :verification_retry_count, limit: 2
+ t.binary :verification_checksum, using: 'verification_checksum::bytea'
+ t.text :verification_failure, limit: 255
+
+ t.index :verification_state, name: VERIFICATION_STATE_INDEX_NAME
+ t.index :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME
+ t.index :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME
+ t.index :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
+ end
+ end
+
+ def down
+ drop_table :ci_secure_file_states
+ end
+end
+# rubocop:enable Layout/LineLength
diff --git a/db/migrate/20220619182308_create_project_relation_exports.rb b/db/migrate/20220619182308_create_project_relation_exports.rb
new file mode 100644
index 00000000000..7b92ca5110f
--- /dev/null
+++ b/db/migrate/20220619182308_create_project_relation_exports.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class CreateProjectRelationExports < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ UNIQUE_INDEX_NAME = 'index_project_export_job_relation'
+
+ def change
+ create_table :project_relation_exports do |t|
+ t.references :project_export_job, null: false, foreign_key: { on_delete: :cascade }
+ t.timestamps_with_timezone null: false
+ t.integer :status, limit: 2, null: false, default: 0
+ t.text :relation, null: false, limit: 255
+ t.text :jid, limit: 255
+ t.text :export_error, limit: 300
+
+ t.index [:project_export_job_id, :relation], unique: true, name: UNIQUE_INDEX_NAME
+ end
+ end
+end
diff --git a/db/migrate/20220619184931_create_project_relation_export_uploads.rb b/db/migrate/20220619184931_create_project_relation_export_uploads.rb
new file mode 100644
index 00000000000..03abf980f13
--- /dev/null
+++ b/db/migrate/20220619184931_create_project_relation_export_uploads.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateProjectRelationExportUploads < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ INDEX = 'index_project_relation_export_upload_id'
+
+ def change
+ create_table :project_relation_export_uploads do |t|
+ t.references :project_relation_export, null: false, foreign_key: { on_delete: :cascade }, index: { name: INDEX }
+ t.timestamps_with_timezone null: false
+ t.text :export_file, null: false, limit: 255
+ end
+ end
+end
diff --git a/db/migrate/20220621202616_add_partial_index_on_oauth_access_tokens_revoked_at.rb b/db/migrate/20220621202616_add_partial_index_on_oauth_access_tokens_revoked_at.rb
new file mode 100644
index 00000000000..2222698dcea
--- /dev/null
+++ b/db/migrate/20220621202616_add_partial_index_on_oauth_access_tokens_revoked_at.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddPartialIndexOnOauthAccessTokensRevokedAt < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'partial_index_resource_owner_id_created_at_token_not_revoked'
+ EXISTING_INDEX_NAME = 'index_oauth_access_tokens_on_resource_owner_id'
+
+ def up
+ add_concurrent_index :oauth_access_tokens, [:resource_owner_id, :created_at],
+ name: INDEX_NAME, where: 'revoked_at IS NULL'
+ remove_concurrent_index :oauth_access_tokens, :resource_owner_id, name: EXISTING_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :oauth_access_tokens, :resource_owner_id, name: EXISTING_INDEX_NAME
+ remove_concurrent_index :oauth_access_tokens, [:resource_owner_id, :created_at], name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220624081524_add_ci_runner_versions_table.rb b/db/migrate/20220624081524_add_ci_runner_versions_table.rb
new file mode 100644
index 00000000000..844c5898d75
--- /dev/null
+++ b/db/migrate/20220624081524_add_ci_runner_versions_table.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddCiRunnerVersionsTable < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ create_table :ci_runner_versions, id: false do |t|
+ t.text :version, primary_key: true, index: true, null: false, limit: 2048
+ t.integer :status, null: true, limit: 2, index: true
+ end
+ end
+
+ def down
+ drop_table :ci_runner_versions, if_exists: true
+ end
+end
diff --git a/db/migrate/20220624090458_add_index_on_runner_version.rb b/db/migrate/20220624090458_add_index_on_runner_version.rb
new file mode 100644
index 00000000000..e28bf0d8a76
--- /dev/null
+++ b/db/migrate/20220624090458_add_index_on_runner_version.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexOnRunnerVersion < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_runners_on_version'
+
+ def up
+ add_concurrent_index :ci_runners, :version, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_runners, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220627061008_add_fei_shu_integration.rb b/db/migrate/20220627061008_add_fei_shu_integration.rb
new file mode 100644
index 00000000000..8feedc70ce6
--- /dev/null
+++ b/db/migrate/20220627061008_add_fei_shu_integration.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class AddFeiShuIntegration < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings, :feishu_integration_enabled, :boolean, null: false,
+ default: false, comment: 'JiHu-specific column'
+ add_column :application_settings, :encrypted_feishu_app_key, :binary, comment: 'JiHu-specific column'
+ add_column :application_settings, :encrypted_feishu_app_key_iv, :binary, comment: 'JiHu-specific column'
+ add_column :application_settings, :encrypted_feishu_app_secret, :binary, comment: 'JiHu-specific column'
+ add_column :application_settings, :encrypted_feishu_app_secret_iv, :binary, comment: 'JiHu-specific column'
+ end
+end
diff --git a/db/migrate/20220627122229_create_user_namespace_callouts.rb b/db/migrate/20220627122229_create_user_namespace_callouts.rb
new file mode 100644
index 00000000000..fc85c02d2db
--- /dev/null
+++ b/db/migrate/20220627122229_create_user_namespace_callouts.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class CreateUserNamespaceCallouts < Gitlab::Database::Migration[2.0]
+ def up
+ create_table :user_namespace_callouts do |t|
+ t.bigint :user_id, null: false
+ t.bigint :namespace_id, null: false, index: true
+ t.datetime_with_timezone :dismissed_at
+ t.integer :feature_name, limit: 2, null: false
+ end
+ end
+
+ def down
+ drop_table :user_namespace_callouts
+ end
+end
diff --git a/db/migrate/20220627122230_add_foreign_keys_to_user_namespace_callouts.rb b/db/migrate/20220627122230_add_foreign_keys_to_user_namespace_callouts.rb
new file mode 100644
index 00000000000..f78eb978a9b
--- /dev/null
+++ b/db/migrate/20220627122230_add_foreign_keys_to_user_namespace_callouts.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class AddForeignKeysToUserNamespaceCallouts < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :user_namespace_callouts, :users,
+ column: :user_id,
+ on_delete: :cascade
+
+ add_concurrent_foreign_key :user_namespace_callouts, :namespaces,
+ column: :namespace_id,
+ on_delete: :cascade
+
+ add_concurrent_index :user_namespace_callouts, [:user_id, :feature_name, :namespace_id],
+ unique: true,
+ name: 'index_ns_user_callouts_feature'
+ end
+
+ def down
+ remove_concurrent_index_by_name :user_namespace_callouts, 'index_ns_user_callouts_feature'
+
+ with_lock_retries do
+ remove_foreign_key :user_namespace_callouts, column: :user_id
+ remove_foreign_key :user_namespace_callouts, column: :namespace_id
+ end
+ end
+end
diff --git a/db/migrate/20220627140315_add_last_feature_flag_updated_at_to_operations_feature_flags_clients.rb b/db/migrate/20220627140315_add_last_feature_flag_updated_at_to_operations_feature_flags_clients.rb
new file mode 100644
index 00000000000..9309f4899ab
--- /dev/null
+++ b/db/migrate/20220627140315_add_last_feature_flag_updated_at_to_operations_feature_flags_clients.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddLastFeatureFlagUpdatedAtToOperationsFeatureFlagsClients < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :operations_feature_flags_clients, :last_feature_flag_updated_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20220627171538_add_error_tracking_settings.rb b/db/migrate/20220627171538_add_error_tracking_settings.rb
new file mode 100644
index 00000000000..f3bf086b58a
--- /dev/null
+++ b/db/migrate/20220627171538_add_error_tracking_settings.rb
@@ -0,0 +1,21 @@
+# 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 AddErrorTrackingSettings < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_column :application_settings, :error_tracking_enabled, :boolean,
+ default: false, null: false, if_not_exists: true
+
+ add_column :application_settings, :error_tracking_api_url, :text, if_not_exists: true
+ add_text_limit :application_settings, :error_tracking_api_url, 255
+ end
+
+ def down
+ remove_column :application_settings, :error_tracking_enabled, if_exists: true
+ remove_column :application_settings, :error_tracking_api_url, if_exists: true
+ end
+end
diff --git a/db/migrate/20220628110214_add_namespace_id_column_to_issues_table.rb b/db/migrate/20220628110214_add_namespace_id_column_to_issues_table.rb
new file mode 100644
index 00000000000..111ef8babae
--- /dev/null
+++ b/db/migrate/20220628110214_add_namespace_id_column_to_issues_table.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddNamespaceIdColumnToIssuesTable < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ add_column :issues, :namespace_id, :bigint
+ end
+
+ def down
+ remove_column :issues, :namespace_id
+ end
+end
diff --git a/db/migrate/20220628120708_create_namespace_bans.rb b/db/migrate/20220628120708_create_namespace_bans.rb
new file mode 100644
index 00000000000..657d13f6448
--- /dev/null
+++ b/db/migrate/20220628120708_create_namespace_bans.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateNamespaceBans < Gitlab::Database::Migration[2.0]
+ UNIQUE_INDEX_NAME = 'index_namespace_bans_on_namespace_id_and_user_id'
+
+ def change
+ create_table :namespace_bans do |t|
+ t.bigint :namespace_id, null: false
+ t.bigint :user_id, null: false, index: true
+ t.timestamps_with_timezone
+
+ t.index [:namespace_id, :user_id], unique: true, name: UNIQUE_INDEX_NAME
+ end
+ end
+end
diff --git a/db/migrate/20220628121644_add_namespace_bans_namespace_id_foreign_key.rb b/db/migrate/20220628121644_add_namespace_bans_namespace_id_foreign_key.rb
new file mode 100644
index 00000000000..30928123618
--- /dev/null
+++ b/db/migrate/20220628121644_add_namespace_bans_namespace_id_foreign_key.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddNamespaceBansNamespaceIdForeignKey < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :namespace_bans, :namespaces, column: :namespace_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :namespace_bans, column: :namespace_id
+ end
+ end
+end
diff --git a/db/migrate/20220628121712_add_namespace_bans_user_id_foreign_key.rb b/db/migrate/20220628121712_add_namespace_bans_user_id_foreign_key.rb
new file mode 100644
index 00000000000..16a73c29cae
--- /dev/null
+++ b/db/migrate/20220628121712_add_namespace_bans_user_id_foreign_key.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddNamespaceBansUserIdForeignKey < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :namespace_bans, :users, column: :user_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :namespace_bans, column: :user_id
+ end
+ end
+end
diff --git a/db/migrate/20220629220129_increase_webauthn_xid_length.rb b/db/migrate/20220629220129_increase_webauthn_xid_length.rb
new file mode 100644
index 00000000000..c5b107ce3f6
--- /dev/null
+++ b/db/migrate/20220629220129_increase_webauthn_xid_length.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class IncreaseWebauthnXidLength < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ new_constraint_name = check_constraint_name(:webauthn_registrations, :credential_xid, 'max_length_v3')
+ add_text_limit :webauthn_registrations, :credential_xid, 1364, constraint_name: new_constraint_name
+
+ prev_constraint_name = check_constraint_name(:webauthn_registrations, :credential_xid, 'max_length_v2')
+ remove_text_limit :webauthn_registrations, :credential_xid, constraint_name: prev_constraint_name
+ end
+
+ def down
+ # no-op: Danger of failling if there are records with length(credential_xid) > 1364
+ end
+end
diff --git a/db/migrate/20220630202329_add_partial_index_on_oauth_access_tokens_revoked_at_with_order.rb b/db/migrate/20220630202329_add_partial_index_on_oauth_access_tokens_revoked_at_with_order.rb
new file mode 100644
index 00000000000..03eb8c2f29d
--- /dev/null
+++ b/db/migrate/20220630202329_add_partial_index_on_oauth_access_tokens_revoked_at_with_order.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddPartialIndexOnOauthAccessTokensRevokedAtWithOrder < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'partial_index_user_id_app_id_created_at_token_not_revoked'
+ EXISTING_INDEX_NAME = 'partial_index_resource_owner_id_created_at_token_not_revoked'
+
+ def up
+ add_concurrent_index :oauth_access_tokens, [:resource_owner_id, :application_id, :created_at],
+ name: INDEX_NAME, where: 'revoked_at IS NULL'
+ remove_concurrent_index :oauth_access_tokens, [:resource_owner_id, :created_at], name: EXISTING_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :oauth_access_tokens, [:resource_owner_id, :created_at],
+ name: EXISTING_INDEX_NAME, where: 'revoked_at IS NULL'
+ remove_concurrent_index :oauth_access_tokens, [:resource_owner_id, :application_id, :created_at], name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220701173859_remove_not_null_constraints_from_requirements.rb b/db/migrate/20220701173859_remove_not_null_constraints_from_requirements.rb
new file mode 100644
index 00000000000..97b223f1800
--- /dev/null
+++ b/db/migrate/20220701173859_remove_not_null_constraints_from_requirements.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class RemoveNotNullConstraintsFromRequirements < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ change_column_null :requirements, :created_at, true
+ change_column_null :requirements, :updated_at, true
+ change_column_null :requirements, :title, true
+ change_column_null :requirements, :state, true
+ end
+
+ def down
+ # No OP
+ # The columns could have nil values again at this point. Rolling back
+ # would cause an exception, also we cannot insert data and modify the schema within the same migration.
+ # More details at https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91611#note_1017066470
+ end
+end
diff --git a/db/migrate/20220703182234_add_findings_partition_number_to_security_scans.rb b/db/migrate/20220703182234_add_findings_partition_number_to_security_scans.rb
new file mode 100644
index 00000000000..f7d50a6d5cf
--- /dev/null
+++ b/db/migrate/20220703182234_add_findings_partition_number_to_security_scans.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddFindingsPartitionNumberToSecurityScans < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def change
+ add_column :security_scans, :findings_partition_number, :integer, default: 1, null: false
+ end
+end
diff --git a/db/migrate/20220703182254_add_partition_number_to_security_findings.rb b/db/migrate/20220703182254_add_partition_number_to_security_findings.rb
new file mode 100644
index 00000000000..85ff4f2eb7c
--- /dev/null
+++ b/db/migrate/20220703182254_add_partition_number_to_security_findings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddPartitionNumberToSecurityFindings < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def change
+ add_column :security_findings, :partition_number, :integer, default: 1, null: false
+ end
+end
diff --git a/db/migrate/20220704034050_add_users_allowlist_to_git_rate_limits.rb b/db/migrate/20220704034050_add_users_allowlist_to_git_rate_limits.rb
new file mode 100644
index 00000000000..7dd1bb45e4c
--- /dev/null
+++ b/db/migrate/20220704034050_add_users_allowlist_to_git_rate_limits.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddUsersAllowlistToGitRateLimits < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings, :git_rate_limit_users_allowlist,
+ :text,
+ array: true,
+ default: [],
+ null: false
+ end
+end
diff --git a/db/migrate/20220704034105_add_application_settings_git_users_allowlist_max_usernames_constraint.rb b/db/migrate/20220704034105_add_application_settings_git_users_allowlist_max_usernames_constraint.rb
new file mode 100644
index 00000000000..ceb3807f817
--- /dev/null
+++ b/db/migrate/20220704034105_add_application_settings_git_users_allowlist_max_usernames_constraint.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddApplicationSettingsGitUsersAllowlistMaxUsernamesConstraint < Gitlab::Database::Migration[2.0]
+ CONSTRAINT_NAME = 'app_settings_git_rate_limit_users_allowlist_max_usernames'
+
+ disable_ddl_transaction!
+
+ def up
+ add_check_constraint :application_settings, 'CARDINALITY(git_rate_limit_users_allowlist) <= 100', CONSTRAINT_NAME
+ end
+
+ def down
+ remove_check_constraint :application_settings, CONSTRAINT_NAME
+ end
+end
diff --git a/db/migrate/20220705145349_add_project_import_level_to_namespace_settings.rb b/db/migrate/20220705145349_add_project_import_level_to_namespace_settings.rb
new file mode 100644
index 00000000000..e46f0221782
--- /dev/null
+++ b/db/migrate/20220705145349_add_project_import_level_to_namespace_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddProjectImportLevelToNamespaceSettings < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def change
+ add_column :namespace_settings, :project_import_level, :smallint, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20220706191627_add_encrypted_error_tracking_access_token.rb b/db/migrate/20220706191627_add_encrypted_error_tracking_access_token.rb
new file mode 100644
index 00000000000..b73556e6caa
--- /dev/null
+++ b/db/migrate/20220706191627_add_encrypted_error_tracking_access_token.rb
@@ -0,0 +1,17 @@
+# 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 AddEncryptedErrorTrackingAccessToken < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_column :application_settings, :error_tracking_access_token_encrypted, :text, if_not_exists: true
+ add_text_limit :application_settings, :error_tracking_access_token_encrypted, 255
+ end
+
+ def down
+ remove_column :application_settings, :error_tracking_access_token_encrypted, if_exists: true
+ end
+end
diff --git a/db/migrate/20220708100532_add_unique_index_on_ci_runner_versions_on_status_and_version.rb b/db/migrate/20220708100532_add_unique_index_on_ci_runner_versions_on_status_and_version.rb
new file mode 100644
index 00000000000..663614a321b
--- /dev/null
+++ b/db/migrate/20220708100532_add_unique_index_on_ci_runner_versions_on_status_and_version.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexOnCiRunnerVersionsOnStatusAndVersion < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_runner_versions_on_unique_status_and_version'
+
+ def up
+ add_concurrent_index :ci_runner_versions, [:status, :version], name: INDEX_NAME, unique: true
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_runner_versions, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220708132701_create_vulnerability_merge_request_links.rb b/db/migrate/20220708132701_create_vulnerability_merge_request_links.rb
new file mode 100644
index 00000000000..51fe15bee6e
--- /dev/null
+++ b/db/migrate/20220708132701_create_vulnerability_merge_request_links.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class CreateVulnerabilityMergeRequestLinks < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = "unique_vuln_merge_request_link_vuln_id_and_mr_id"
+
+ def up
+ create_table :vulnerability_merge_request_links do |t|
+ t.bigint :vulnerability_id, null: false
+ t.integer :merge_request_id, null: false
+
+ t.index :merge_request_id
+ t.timestamps_with_timezone null: false
+ end
+
+ add_index(
+ :vulnerability_merge_request_links,
+ %i[vulnerability_id merge_request_id],
+ unique: true,
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ drop_table(
+ :vulnerability_merge_request_links,
+ if_exists: true
+ )
+ end
+end
diff --git a/db/migrate/20220708142744_add_composite_index_for_protected_environments.rb b/db/migrate/20220708142744_add_composite_index_for_protected_environments.rb
new file mode 100644
index 00000000000..ab93f5ca9ca
--- /dev/null
+++ b/db/migrate/20220708142744_add_composite_index_for_protected_environments.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddCompositeIndexForProtectedEnvironments < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # skips the `required_` part because index limit is 63 characters
+ INDEX_NAME = 'index_protected_environments_on_approval_count_and_created_at'
+
+ def up
+ add_concurrent_index :protected_environments, %i[required_approval_count created_at], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :protected_environments, %i[required_approval_count created_at], name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220708142803_add_composite_index_for_protected_environment_approval_rules.rb b/db/migrate/20220708142803_add_composite_index_for_protected_environment_approval_rules.rb
new file mode 100644
index 00000000000..6952489588d
--- /dev/null
+++ b/db/migrate/20220708142803_add_composite_index_for_protected_environment_approval_rules.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddCompositeIndexForProtectedEnvironmentApprovalRules < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # uses `pe_` instead of `protected_environment_` because index limit is 63 characters
+ INDEX_NAME = 'index_pe_approval_rules_on_required_approvals_and_created_at'
+
+ def up
+ add_concurrent_index :protected_environment_approval_rules, %i[required_approvals created_at], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :protected_environment_approval_rules, %i[required_approvals created_at], name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220708150315_add_vulnerabilities_foreign_key_to_vulnerability_merge_request_links.rb b/db/migrate/20220708150315_add_vulnerabilities_foreign_key_to_vulnerability_merge_request_links.rb
new file mode 100644
index 00000000000..f821e2fbe3a
--- /dev/null
+++ b/db/migrate/20220708150315_add_vulnerabilities_foreign_key_to_vulnerability_merge_request_links.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddVulnerabilitiesForeignKeyToVulnerabilityMergeRequestLinks < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :vulnerability_merge_request_links, :vulnerabilities, column: :vulnerability_id,
+ on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :vulnerability_merge_request_links, column: :vulnerability_id
+ end
+ end
+end
diff --git a/db/migrate/20220708150335_add_merge_requests_foreign_key_to_vulnerability_merge_request_links.rb b/db/migrate/20220708150335_add_merge_requests_foreign_key_to_vulnerability_merge_request_links.rb
new file mode 100644
index 00000000000..fedda9677f1
--- /dev/null
+++ b/db/migrate/20220708150335_add_merge_requests_foreign_key_to_vulnerability_merge_request_links.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddMergeRequestsForeignKeyToVulnerabilityMergeRequestLinks < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :vulnerability_merge_request_links, :merge_requests, column: :merge_request_id,
+ on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :vulnerability_merge_request_links, column: :merge_request_id
+ end
+ end
+end
diff --git a/db/migrate/20220708184822_cleanup_backfill_draft_status_on_merge_requests.rb b/db/migrate/20220708184822_cleanup_backfill_draft_status_on_merge_requests.rb
new file mode 100644
index 00000000000..5d91054763e
--- /dev/null
+++ b/db/migrate/20220708184822_cleanup_backfill_draft_status_on_merge_requests.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class CleanupBackfillDraftStatusOnMergeRequests < Gitlab::Database::Migration[2.0]
+ def up
+ # no-op
+ #
+ # moved to post-deployment migration:
+ # db/post_migrate/20220713133515_cleanup_backfill_draft_statuses_on_merge_requests.rb
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20220712025712_update_insert_or_update_vulnerability_reads_function.rb b/db/migrate/20220712025712_update_insert_or_update_vulnerability_reads_function.rb
new file mode 100644
index 00000000000..55aeacfbecd
--- /dev/null
+++ b/db/migrate/20220712025712_update_insert_or_update_vulnerability_reads_function.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+class UpdateInsertOrUpdateVulnerabilityReadsFunction < Gitlab::Database::Migration[2.0]
+ FUNCTION_NAME = 'insert_or_update_vulnerability_reads'
+
+ enable_lock_retries!
+
+ def up
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION #{FUNCTION_NAME}() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+ DECLARE
+ severity smallint;
+ state smallint;
+ report_type smallint;
+ resolved_on_default_branch boolean;
+ present_on_default_branch boolean;
+ BEGIN
+ IF (NEW.vulnerability_id IS NULL AND (TG_OP = 'INSERT' OR TG_OP = 'UPDATE')) THEN
+ RETURN NULL;
+ END IF;
+
+ IF (TG_OP = 'UPDATE' AND OLD.vulnerability_id IS NOT NULL AND NEW.vulnerability_id IS NOT NULL) THEN
+ RETURN NULL;
+ END IF;
+
+ SELECT
+ vulnerabilities.severity, vulnerabilities.state, vulnerabilities.report_type, vulnerabilities.resolved_on_default_branch, vulnerabilities.present_on_default_branch
+ INTO
+ severity, state, report_type, resolved_on_default_branch, present_on_default_branch
+ FROM
+ vulnerabilities
+ WHERE
+ vulnerabilities.id = NEW.vulnerability_id;
+
+ IF present_on_default_branch IS NOT true THEN
+ RETURN NULL;
+ END IF;
+
+ INSERT INTO vulnerability_reads (vulnerability_id, project_id, scanner_id, report_type, severity, state, resolved_on_default_branch, uuid, location_image, cluster_agent_id, casted_cluster_agent_id)
+ VALUES (NEW.vulnerability_id, NEW.project_id, NEW.scanner_id, report_type, severity, state, resolved_on_default_branch, NEW.uuid::uuid, NEW.location->>'image', NEW.location->'kubernetes_resource'->>'agent_id', CAST(NEW.location->'kubernetes_resource'->>'agent_id' AS bigint))
+ ON CONFLICT(vulnerability_id) DO NOTHING;
+ RETURN NULL;
+ END
+ $$;
+ SQL
+ end
+
+ def down
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION #{FUNCTION_NAME}() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+ DECLARE
+ severity smallint;
+ state smallint;
+ report_type smallint;
+ resolved_on_default_branch boolean;
+ BEGIN
+ IF (NEW.vulnerability_id IS NULL AND (TG_OP = 'INSERT' OR TG_OP = 'UPDATE')) THEN
+ RETURN NULL;
+ END IF;
+
+ IF (TG_OP = 'UPDATE' AND OLD.vulnerability_id IS NOT NULL AND NEW.vulnerability_id IS NOT NULL) THEN
+ RETURN NULL;
+ END IF;
+
+ SELECT
+ vulnerabilities.severity, vulnerabilities.state, vulnerabilities.report_type, vulnerabilities.resolved_on_default_branch
+ INTO
+ severity, state, report_type, resolved_on_default_branch
+ FROM
+ vulnerabilities
+ WHERE
+ vulnerabilities.id = NEW.vulnerability_id;
+
+ INSERT INTO vulnerability_reads (vulnerability_id, project_id, scanner_id, report_type, severity, state, resolved_on_default_branch, uuid, location_image, cluster_agent_id, casted_cluster_agent_id)
+ VALUES (NEW.vulnerability_id, NEW.project_id, NEW.scanner_id, report_type, severity, state, resolved_on_default_branch, NEW.uuid::uuid, NEW.location->>'image', NEW.location->'kubernetes_resource'->>'agent_id', CAST(NEW.location->'kubernetes_resource'->>'agent_id' AS bigint))
+ ON CONFLICT(vulnerability_id) DO NOTHING;
+ RETURN NULL;
+ END
+ $$;
+ SQL
+ end
+end
diff --git a/db/migrate/20220712031923_create_vulnerability_reads_for_an_existing_vulnerability_record.rb b/db/migrate/20220712031923_create_vulnerability_reads_for_an_existing_vulnerability_record.rb
new file mode 100644
index 00000000000..68769f9e4e3
--- /dev/null
+++ b/db/migrate/20220712031923_create_vulnerability_reads_for_an_existing_vulnerability_record.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+class CreateVulnerabilityReadsForAnExistingVulnerabilityRecord < Gitlab::Database::Migration[2.0]
+ include Gitlab::Database::SchemaHelpers
+
+ FUNCTION_NAME = 'insert_vulnerability_reads_from_vulnerability'
+ TRIGGER_NAME = 'trigger_insert_vulnerability_reads_from_vulnerability'
+
+ enable_lock_retries!
+
+ def up
+ execute(<<~SQL)
+ CREATE FUNCTION #{FUNCTION_NAME}() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+ DECLARE
+ scanner_id bigint;
+ uuid uuid;
+ location_image text;
+ cluster_agent_id text;
+ casted_cluster_agent_id bigint;
+ BEGIN
+ SELECT
+ v_o.scanner_id, v_o.uuid, v_o.location->>'image', v_o.location->'kubernetes_resource'->>'agent_id', CAST(v_o.location->'kubernetes_resource'->>'agent_id' AS bigint)
+ INTO
+ scanner_id, uuid, location_image, cluster_agent_id, casted_cluster_agent_id
+ FROM
+ vulnerability_occurrences v_o
+ WHERE
+ v_o.vulnerability_id = NEW.id
+ LIMIT 1;
+
+ INSERT INTO vulnerability_reads (vulnerability_id, project_id, scanner_id, report_type, severity, state, resolved_on_default_branch, uuid, location_image, cluster_agent_id, casted_cluster_agent_id)
+ VALUES (NEW.id, NEW.project_id, scanner_id, NEW.report_type, NEW.severity, NEW.state, NEW.resolved_on_default_branch, uuid::uuid, location_image, cluster_agent_id, casted_cluster_agent_id)
+ ON CONFLICT(vulnerability_id) DO NOTHING;
+ RETURN NULL;
+ END
+ $$;
+ SQL
+
+ execute(<<~SQL)
+ CREATE TRIGGER #{TRIGGER_NAME}
+ AFTER UPDATE ON vulnerabilities
+ FOR EACH ROW
+ WHEN (
+ OLD.present_on_default_branch IS NOT true AND NEW.present_on_default_branch IS true
+ )
+ EXECUTE PROCEDURE #{FUNCTION_NAME}();
+ SQL
+ end
+
+ def down
+ drop_trigger(:vulnerabilities, TRIGGER_NAME)
+ drop_function(FUNCTION_NAME)
+ end
+end
diff --git a/db/migrate/20220712094945_add_include_for_free_user_cap_preview_to_namespace_settings.rb b/db/migrate/20220712094945_add_include_for_free_user_cap_preview_to_namespace_settings.rb
new file mode 100644
index 00000000000..79e71827408
--- /dev/null
+++ b/db/migrate/20220712094945_add_include_for_free_user_cap_preview_to_namespace_settings.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddIncludeForFreeUserCapPreviewToNamespaceSettings < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ add_column :namespace_settings, :include_for_free_user_cap_preview, :boolean, null: false, default: false
+ end
+
+ def down
+ remove_column :namespace_settings, :include_for_free_user_cap_preview
+ end
+end
diff --git a/db/migrate/20220713175658_add_packages_cleanup_policies_worker_capacity_to_application_settings.rb b/db/migrate/20220713175658_add_packages_cleanup_policies_worker_capacity_to_application_settings.rb
new file mode 100644
index 00000000000..8768786410a
--- /dev/null
+++ b/db/migrate/20220713175658_add_packages_cleanup_policies_worker_capacity_to_application_settings.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddPackagesCleanupPoliciesWorkerCapacityToApplicationSettings < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings,
+ :package_registry_cleanup_policies_worker_capacity,
+ :integer,
+ default: 2,
+ null: false
+ end
+end
diff --git a/db/migrate/20220713175737_add_application_settings_packages_cleanup_policies_worker_capacity_constraint.rb b/db/migrate/20220713175737_add_application_settings_packages_cleanup_policies_worker_capacity_constraint.rb
new file mode 100644
index 00000000000..9aba85570ea
--- /dev/null
+++ b/db/migrate/20220713175737_add_application_settings_packages_cleanup_policies_worker_capacity_constraint.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddApplicationSettingsPackagesCleanupPoliciesWorkerCapacityConstraint < Gitlab::Database::Migration[2.0]
+ CONSTRAINT_NAME = 'app_settings_pkg_registry_cleanup_pol_worker_capacity_gte_zero'
+
+ disable_ddl_transaction!
+
+ def up
+ add_check_constraint :application_settings,
+ 'package_registry_cleanup_policies_worker_capacity >= 0',
+ CONSTRAINT_NAME
+ end
+
+ def down
+ remove_check_constraint :application_settings, CONSTRAINT_NAME
+ end
+end
diff --git a/db/migrate/20220713175812_add_enabled_policies_index_to_packages_cleanup_policies.rb b/db/migrate/20220713175812_add_enabled_policies_index_to_packages_cleanup_policies.rb
new file mode 100644
index 00000000000..fe4162e8ac3
--- /dev/null
+++ b/db/migrate/20220713175812_add_enabled_policies_index_to_packages_cleanup_policies.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddEnabledPoliciesIndexToPackagesCleanupPolicies < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'idx_enabled_pkgs_cleanup_policies_on_next_run_at_project_id'
+
+ def up
+ add_concurrent_index :packages_cleanup_policies,
+ [:next_run_at, :project_id],
+ where: "keep_n_duplicated_package_files <> 'all'",
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :packages_cleanup_policies, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220714105122_update_default_project_import_level_on_namespace_settings.rb b/db/migrate/20220714105122_update_default_project_import_level_on_namespace_settings.rb
new file mode 100644
index 00000000000..30357ded9ce
--- /dev/null
+++ b/db/migrate/20220714105122_update_default_project_import_level_on_namespace_settings.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class UpdateDefaultProjectImportLevelOnNamespaceSettings < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ change_column :namespace_settings, :project_import_level, :smallint, default: 50, null: false
+ end
+
+ def down
+ change_column :namespace_settings, :project_import_level, :smallint, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20220714142424_update_trigger_update_vulnerability_reads_on_vulnerability_update.rb b/db/migrate/20220714142424_update_trigger_update_vulnerability_reads_on_vulnerability_update.rb
new file mode 100644
index 00000000000..00fc4ac1ed6
--- /dev/null
+++ b/db/migrate/20220714142424_update_trigger_update_vulnerability_reads_on_vulnerability_update.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+class UpdateTriggerUpdateVulnerabilityReadsOnVulnerabilityUpdate < Gitlab::Database::Migration[2.0]
+ include Gitlab::Database::SchemaHelpers
+
+ TRIGGER_NAME = 'trigger_update_vulnerability_reads_on_vulnerability_update'
+ FUNCTION_NAME = 'update_vulnerability_reads_from_vulnerability'
+
+ enable_lock_retries!
+
+ def up
+ drop_trigger(:vulnerabilities, TRIGGER_NAME)
+
+ # If the vulnerability record was not already marked as `present_on_default_branch`,
+ # we shouldn't try to update `vulnerability_records` since there will be no records
+ # anyway.
+ execute(<<~SQL)
+ CREATE TRIGGER #{TRIGGER_NAME}
+ AFTER UPDATE ON vulnerabilities
+ FOR EACH ROW
+ WHEN (
+ OLD.present_on_default_branch IS TRUE AND
+ (
+ OLD.severity IS DISTINCT FROM NEW.severity OR
+ OLD.state IS DISTINCT FROM NEW.state OR
+ OLD.resolved_on_default_branch IS DISTINCT FROM NEW.resolved_on_default_branch
+ )
+ )
+ EXECUTE PROCEDURE #{FUNCTION_NAME}();
+ SQL
+ end
+
+ def down
+ drop_trigger(:vulnerabilities, TRIGGER_NAME)
+
+ execute(<<~SQL)
+ CREATE TRIGGER #{TRIGGER_NAME}
+ AFTER UPDATE ON vulnerabilities
+ FOR EACH ROW
+ WHEN (
+ OLD.severity IS DISTINCT FROM NEW.severity OR
+ OLD.state IS DISTINCT FROM NEW.state OR
+ OLD.resolved_on_default_branch IS DISTINCT FROM NEW.resolved_on_default_branch
+ )
+ EXECUTE PROCEDURE #{FUNCTION_NAME}();
+ SQL
+ end
+end
diff --git a/db/post_migrate/20220523164734_add_foreign_key_to_vulnerability_reads_casted_cluster_agent_id.rb b/db/post_migrate/20220523164734_add_foreign_key_to_vulnerability_reads_casted_cluster_agent_id.rb
new file mode 100644
index 00000000000..364570973ab
--- /dev/null
+++ b/db/post_migrate/20220523164734_add_foreign_key_to_vulnerability_reads_casted_cluster_agent_id.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToVulnerabilityReadsCastedClusterAgentId < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :vulnerability_reads, :cluster_agents,
+ column: :casted_cluster_agent_id, on_delete: :nullify
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :vulnerability_reads, :cluster_agents, column: :casted_cluster_agent_id
+ end
+ end
+end
diff --git a/db/post_migrate/20220523165734_add_index_to_vulnerability_reads_casted_cluster_agent_id.rb b/db/post_migrate/20220523165734_add_index_to_vulnerability_reads_casted_cluster_agent_id.rb
new file mode 100644
index 00000000000..51842af3f12
--- /dev/null
+++ b/db/post_migrate/20220523165734_add_index_to_vulnerability_reads_casted_cluster_agent_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToVulnerabilityReadsCastedClusterAgentId < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_cis_vulnerability_reads_on_cluster_agent_id'
+
+ def up
+ add_concurrent_index :vulnerability_reads, :casted_cluster_agent_id, name: INDEX_NAME, where: 'report_type = 7'
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerability_reads, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220531035113_populate_operation_visibility_permissions.rb b/db/post_migrate/20220531035113_populate_operation_visibility_permissions.rb
new file mode 100644
index 00000000000..1d385b13f75
--- /dev/null
+++ b/db/post_migrate/20220531035113_populate_operation_visibility_permissions.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class PopulateOperationVisibilityPermissions < Gitlab::Database::Migration[2.0]
+ BATCH_SIZE = 50_000
+ MAX_BATCH_SIZE = 50_000
+ SUB_BATCH_SIZE = 1_000
+ INTERVAL = 2.minutes
+ MIGRATION = 'PopulateOperationVisibilityPermissionsFromOperations'
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :project_features,
+ :id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ max_batch_size: MAX_BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :project_features, :id, [])
+ end
+end
diff --git a/db/post_migrate/20220601151900_schedule_backfill_ci_runner_semver.rb b/db/post_migrate/20220601151900_schedule_backfill_ci_runner_semver.rb
new file mode 100644
index 00000000000..9c62ec1b87b
--- /dev/null
+++ b/db/post_migrate/20220601151900_schedule_backfill_ci_runner_semver.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class ScheduleBackfillCiRunnerSemver < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ MIGRATION = 'BackfillCiRunnerSemver'
+ INTERVAL = 2.minutes.freeze
+ BATCH_SIZE = 500
+ MAX_BATCH_SIZE = 10_000
+ SUB_BATCH_SIZE = 100
+
+ disable_ddl_transaction!
+
+ def up
+ # Disabled background migration introduced in same milestone as it was decided to change approach
+ # and the semver column will no longer be needed
+ # queue_batched_background_migration(
+ # MIGRATION,
+ # :ci_runners,
+ # :id,
+ # job_interval: INTERVAL,
+ # batch_size: BATCH_SIZE,
+ # max_batch_size: MAX_BATCH_SIZE,
+ # sub_batch_size: SUB_BATCH_SIZE
+ # )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :ci_runners, :id, [])
+ end
+end
diff --git a/db/post_migrate/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events.rb b/db/post_migrate/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events.rb
new file mode 100644
index 00000000000..aa860959c20
--- /dev/null
+++ b/db/post_migrate/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddUserIdAndIpAddressSuccessIndexToAuthenticationEvents < Gitlab::Database::Migration[2.0]
+ OLD_INDEX_NAME = 'index_authentication_events_on_user_id'
+ NEW_INDEX_NAME = 'index_authentication_events_on_user_and_ip_address_and_result'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :authentication_events, [:user_id, :ip_address, :result], name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :authentication_events, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :authentication_events, :user_id, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :authentication_events, NEW_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences.rb b/db/post_migrate/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..1207b51f190
--- /dev/null
+++ b/db/post_migrate/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddTmpIndexForPotentiallyMisassociatedVulnerabilityOccurrences < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = "tmp_index_vulnerability_occurrences_on_id_and_scanner_id"
+ REPORT_TYPES = { cluster_image_scanning: 7, generic: 99 }.freeze
+ CLAUSE = "report_type IN (#{REPORT_TYPES.values.join(',')})"
+
+ disable_ddl_transaction!
+
+ def up
+ prepare_async_index :vulnerability_occurrences,
+ [:id, :scanner_id],
+ where: CLAUSE,
+ name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index_by_name :vulnerability_occurrences, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220617123022_add_unique_index_on_projects_on_runners_token.rb b/db/post_migrate/20220617123022_add_unique_index_on_projects_on_runners_token.rb
new file mode 100644
index 00000000000..1e0409b16ea
--- /dev/null
+++ b/db/post_migrate/20220617123022_add_unique_index_on_projects_on_runners_token.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexOnProjectsOnRunnersToken < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_uniq_projects_on_runners_token'
+
+ def up
+ add_concurrent_index :projects,
+ :runners_token,
+ name: INDEX_NAME,
+ unique: true
+ end
+
+ def down
+ remove_concurrent_index_by_name :projects, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220617123034_add_unique_index_on_projects_on_runners_token_encrypted.rb b/db/post_migrate/20220617123034_add_unique_index_on_projects_on_runners_token_encrypted.rb
new file mode 100644
index 00000000000..b9ba570606e
--- /dev/null
+++ b/db/post_migrate/20220617123034_add_unique_index_on_projects_on_runners_token_encrypted.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexOnProjectsOnRunnersTokenEncrypted < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_uniq_projects_on_runners_token_encrypted'
+
+ def up
+ add_concurrent_index :projects,
+ :runners_token_encrypted,
+ name: INDEX_NAME,
+ unique: true
+ end
+
+ def down
+ remove_concurrent_index_by_name :projects, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220617123105_drop_index_on_projects_on_runners_token.rb b/db/post_migrate/20220617123105_drop_index_on_projects_on_runners_token.rb
new file mode 100644
index 00000000000..6b76a92a9f4
--- /dev/null
+++ b/db/post_migrate/20220617123105_drop_index_on_projects_on_runners_token.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropIndexOnProjectsOnRunnersToken < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_projects_on_runners_token'
+
+ def up
+ remove_concurrent_index_by_name :projects, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :projects,
+ :runners_token,
+ name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220617123113_drop_index_on_projects_on_runners_token_encrypted.rb b/db/post_migrate/20220617123113_drop_index_on_projects_on_runners_token_encrypted.rb
new file mode 100644
index 00000000000..213f55bfcc4
--- /dev/null
+++ b/db/post_migrate/20220617123113_drop_index_on_projects_on_runners_token_encrypted.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropIndexOnProjectsOnRunnersTokenEncrypted < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_projects_on_runners_token_encrypted'
+
+ def up
+ remove_concurrent_index_by_name :projects, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :projects,
+ :runners_token_encrypted,
+ name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220617142124_add_index_on_installable_package_files.rb b/db/post_migrate/20220617142124_add_index_on_installable_package_files.rb
new file mode 100644
index 00000000000..e74c6c0935e
--- /dev/null
+++ b/db/post_migrate/20220617142124_add_index_on_installable_package_files.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddIndexOnInstallablePackageFiles < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'idx_pkgs_installable_package_files_on_package_id_id_file_name'
+ # See https://gitlab.com/gitlab-org/gitlab/-/blob/e3ed2c1f65df2e137fc714485d7d42264a137968/app/models/packages/package_file.rb#L16
+ DEFAULT_STATUS = 0
+
+ def up
+ add_concurrent_index :packages_package_files,
+ [:package_id, :id, :file_name],
+ where: "(status = #{DEFAULT_STATUS})",
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :packages_package_files, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220617143228_replace_packages_index_on_project_id_and_status.rb b/db/post_migrate/20220617143228_replace_packages_index_on_project_id_and_status.rb
new file mode 100644
index 00000000000..d1e70f04468
--- /dev/null
+++ b/db/post_migrate/20220617143228_replace_packages_index_on_project_id_and_status.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class ReplacePackagesIndexOnProjectIdAndStatus < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ NEW_INDEX_NAME = 'index_packages_packages_on_project_id_and_status_and_id'
+ OLD_INDEX_NAME = 'index_packages_packages_on_project_id_and_status'
+
+ def up
+ add_concurrent_index :packages_packages,
+ [:project_id, :status, :id],
+ name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :packages_packages, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :packages_packages,
+ [:project_id, :status],
+ name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :packages_packages, NEW_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220620060633_finalize_orphaned_routes_cleanup.rb b/db/post_migrate/20220620060633_finalize_orphaned_routes_cleanup.rb
new file mode 100644
index 00000000000..4a3218af2c0
--- /dev/null
+++ b/db/post_migrate/20220620060633_finalize_orphaned_routes_cleanup.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class FinalizeOrphanedRoutesCleanup < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ MIGRATION = 'CleanupOrphanedRoutes'
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :routes,
+ column_name: :id,
+ job_arguments: []
+ )
+ end
+
+ def down
+ # noop
+ end
+end
diff --git a/db/post_migrate/20220620132300_update_last_run_date_for_iterations_cadences.rb b/db/post_migrate/20220620132300_update_last_run_date_for_iterations_cadences.rb
new file mode 100644
index 00000000000..50b0b25d469
--- /dev/null
+++ b/db/post_migrate/20220620132300_update_last_run_date_for_iterations_cadences.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class UpdateLastRunDateForIterationsCadences < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ execute <<~SQL
+ UPDATE iterations_cadences SET last_run_date=CURRENT_DATE WHERE automatic=true;
+ SQL
+ end
+
+ def down
+ # no op
+ # 'last_run_date' stores the date on which the cadence record should be
+ # updated using `CreateIterationsInAdvance` service that is idempotent
+ # and the column is only useful for optimizing when to run the service
+ # ('last_run_date' is also a misnomer as it can be better-named 'next_run_date'.)
+ end
+end
diff --git a/db/post_migrate/20220620151740_add_indexes_issues_on_project_id_and_closed_at.rb b/db/post_migrate/20220620151740_add_indexes_issues_on_project_id_and_closed_at.rb
new file mode 100644
index 00000000000..066e72dce45
--- /dev/null
+++ b/db/post_migrate/20220620151740_add_indexes_issues_on_project_id_and_closed_at.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class AddIndexesIssuesOnProjectIdAndClosedAt < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_issues_on_project_id_and_closed_at'
+ NEW_INDEX_NAME_1 = 'index_issues_on_project_id_closed_at_desc_state_id_and_id'
+ NEW_INDEX_NAME_2 = 'index_issues_on_project_id_closed_at_state_id_and_id'
+
+ def up
+ # Index to improve performance when sorting issues by closed_at desc
+ unless index_exists_by_name?(:issues, NEW_INDEX_NAME_1)
+ add_concurrent_index :issues, 'project_id, closed_at DESC NULLS LAST, state_id, id', name: NEW_INDEX_NAME_1
+ end
+
+ # Index to improve performance when sorting issues by closed_at asc
+ # This replaces the old index which didn't account for state_id and id
+ unless index_exists_by_name?(:issues, NEW_INDEX_NAME_2)
+ add_concurrent_index :issues, [:project_id, :closed_at, :state_id, :id], name: NEW_INDEX_NAME_2
+ end
+
+ remove_concurrent_index_by_name :issues, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :issues, [:project_id, :closed_at], name: OLD_INDEX_NAME
+
+ remove_concurrent_index_by_name :issues, NEW_INDEX_NAME_1
+ remove_concurrent_index_by_name :issues, NEW_INDEX_NAME_2
+ end
+end
diff --git a/db/post_migrate/20220621040800_backfill_imported_issue_search_data.rb b/db/post_migrate/20220621040800_backfill_imported_issue_search_data.rb
new file mode 100644
index 00000000000..bc7d0eb3a13
--- /dev/null
+++ b/db/post_migrate/20220621040800_backfill_imported_issue_search_data.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class BackfillImportedIssueSearchData < Gitlab::Database::Migration[2.0]
+ def up
+ # replaced by 20220707075300_reschedule_backfill_imported_issue_search_data.rb
+ end
+
+ def down
+ # replaced by 20220707075300_reschedule_backfill_imported_issue_search_data.rb
+ end
+end
diff --git a/db/post_migrate/20220621082245_remove_tmp_index_on_routes_namespace_id_column.rb b/db/post_migrate/20220621082245_remove_tmp_index_on_routes_namespace_id_column.rb
new file mode 100644
index 00000000000..4aa125d3c14
--- /dev/null
+++ b/db/post_migrate/20220621082245_remove_tmp_index_on_routes_namespace_id_column.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class RemoveTmpIndexOnRoutesNamespaceIdColumn < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'tmp_index_for_namespace_id_migration_on_routes'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :routes, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :routes,
+ :id,
+ where: "routes.namespace_id is null and routes.source_type = 'Namespace'",
+ name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220621092245_validate_not_null_constraint_on_routes_namespace_id_column.rb b/db/post_migrate/20220621092245_validate_not_null_constraint_on_routes_namespace_id_column.rb
new file mode 100644
index 00000000000..73e2f6b2b38
--- /dev/null
+++ b/db/post_migrate/20220621092245_validate_not_null_constraint_on_routes_namespace_id_column.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class ValidateNotNullConstraintOnRoutesNamespaceIdColumn < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ validate_not_null_constraint :routes, :namespace_id
+ end
+
+ def down
+ remove_not_null_constraint :routes, :namespace_id
+ add_not_null_constraint :routes, :namespace_id, validate: false
+ end
+end
diff --git a/db/post_migrate/20220622070547_add_temp_index_for_container_registry_size_migration.rb b/db/post_migrate/20220622070547_add_temp_index_for_container_registry_size_migration.rb
new file mode 100644
index 00000000000..64cdd75f5a7
--- /dev/null
+++ b/db/post_migrate/20220622070547_add_temp_index_for_container_registry_size_migration.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddTempIndexForContainerRegistrySizeMigration < Gitlab::Database::Migration[2.0]
+ INDEX_CONTAINER_REGISTRY_SIZE = 'tmp_index_migrated_container_registries'
+ INDEX_PROJECT_STATS_CONT_REG_SIZE = 'tmp_index_project_statistics_cont_registry_size'
+
+ disable_ddl_transaction!
+
+ def up
+ # Temporary index used in 20220622080547_backfill_project_statistics_with_container_registry_size
+ # Temporary index to be remove via https://gitlab.com/gitlab-org/gitlab/-/issues/366392
+ add_concurrent_index :container_repositories, [:project_id], name: INDEX_CONTAINER_REGISTRY_SIZE,
+ where: "migration_state = 'import_done' OR created_at >= '2022-01-23'"
+ add_concurrent_index :project_statistics, [:project_id], name: INDEX_PROJECT_STATS_CONT_REG_SIZE,
+ where: "container_registry_size = 0"
+ end
+
+ def down
+ remove_concurrent_index_by_name :container_repositories, INDEX_CONTAINER_REGISTRY_SIZE
+ remove_concurrent_index_by_name :project_statistics, INDEX_PROJECT_STATS_CONT_REG_SIZE
+ end
+end
diff --git a/db/post_migrate/20220622080547_backfill_project_statistics_with_container_registry_size.rb b/db/post_migrate/20220622080547_backfill_project_statistics_with_container_registry_size.rb
new file mode 100644
index 00000000000..2cab7ae25f5
--- /dev/null
+++ b/db/post_migrate/20220622080547_backfill_project_statistics_with_container_registry_size.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+class BackfillProjectStatisticsWithContainerRegistrySize < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 500
+ MIGRATION_CLASS = 'BackfillProjectStatisticsContainerRepositorySize'
+ BATCH_CLASS_NAME = 'BackfillProjectStatisticsWithContainerRegistrySizeBatchingStrategy'
+ SUB_BATCH_SIZE = 100
+
+ disable_ddl_transaction!
+
+ def up
+ return unless Gitlab.dev_or_test_env? || Gitlab.com?
+
+ queue_batched_background_migration(
+ MIGRATION_CLASS,
+ :container_repositories,
+ :project_id,
+ job_interval: DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ batch_class_name: BATCH_CLASS_NAME,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ return unless Gitlab.dev_or_test_env? || Gitlab.com?
+
+ delete_batched_background_migration(MIGRATION_CLASS, :container_repositories, :project_id, [])
+ end
+end
diff --git a/db/post_migrate/20220624062300_delete_backfill_ci_runner_semver_migration.rb b/db/post_migrate/20220624062300_delete_backfill_ci_runner_semver_migration.rb
new file mode 100644
index 00000000000..4632d9104ea
--- /dev/null
+++ b/db/post_migrate/20220624062300_delete_backfill_ci_runner_semver_migration.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class DeleteBackfillCiRunnerSemverMigration < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ MIGRATION = 'BackfillCiRunnerSemver'
+
+ disable_ddl_transaction!
+
+ def up
+ # Disabled background migration introduced in same milestone as it was decided to change approach
+ # and the semver column will no longer be needed
+ delete_batched_background_migration(MIGRATION, :ci_runners, :id, [])
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects.rb b/db/post_migrate/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects.rb
new file mode 100644
index 00000000000..06bdb78698d
--- /dev/null
+++ b/db/post_migrate/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+class ScheduleDisableLegacyOpenSourceLicenseForInactivePublicProjects < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'DisableLegacyOpenSourceLicenseForInactivePublicProjects'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 1_000
+ MAX_BATCH_SIZE = 5_000
+ SUB_BATCH_SIZE = 200
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ return unless Gitlab.com?
+
+ queue_batched_background_migration(
+ MIGRATION,
+ :projects,
+ :id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ max_batch_size: MAX_BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ return unless Gitlab.com?
+
+ delete_batched_background_migration(MIGRATION, :projects, :id, [])
+ end
+end
diff --git a/db/post_migrate/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace.rb b/db/post_migrate/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace.rb
new file mode 100644
index 00000000000..2f407b78b6d
--- /dev/null
+++ b/db/post_migrate/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class QueueUpdateDelayedProjectRemovalToNullForUserNamespace < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'UpdateDelayedProjectRemovalToNullForUserNamespaces'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 10_000
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :namespace_settings,
+ :namespace_id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :namespace_settings, :namespace_id, [])
+ end
+end
diff --git a/db/post_migrate/20220627223041_add_post_migrate_test_table.rb b/db/post_migrate/20220627223041_add_post_migrate_test_table.rb
new file mode 100644
index 00000000000..8d97444f8c1
--- /dev/null
+++ b/db/post_migrate/20220627223041_add_post_migrate_test_table.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddPostMigrateTestTable < Gitlab::Database::Migration[2.0]
+ # Fake table to be used for testing the post-deploy pipeline,
+ # details can be seen on https://gitlab.com/gitlab-com/gl-infra/delivery/-/issues/2352.
+ #
+ # It should be deleted after the testing is completed.
+ def change
+ create_table :post_migration_test_table do |t|
+ t.integer :status, null: false
+ end
+ end
+end
diff --git a/db/post_migrate/20220628012902_finalise_project_namespace_members.rb b/db/post_migrate/20220628012902_finalise_project_namespace_members.rb
new file mode 100644
index 00000000000..29b11fb4357
--- /dev/null
+++ b/db/post_migrate/20220628012902_finalise_project_namespace_members.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class FinaliseProjectNamespaceMembers < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'BackfillProjectMemberNamespaceId'
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :members,
+ column_name: :id,
+ job_arguments: [],
+ finalize: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220628110823_add_issues_namespace_id_fk_and_index.rb b/db/post_migrate/20220628110823_add_issues_namespace_id_fk_and_index.rb
new file mode 100644
index 00000000000..5a7ca428383
--- /dev/null
+++ b/db/post_migrate/20220628110823_add_issues_namespace_id_fk_and_index.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddIssuesNamespaceIdFkAndIndex < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+ INDEX_NAME = 'index_issues_on_namespace_id'
+
+ def up
+ add_concurrent_index :issues, :namespace_id, name: INDEX_NAME
+ add_concurrent_foreign_key :issues, :namespaces,
+ column: :namespace_id,
+ on_delete: :nullify,
+ reverse_lock_order: true
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :issues, column: :namespace_id
+ end
+
+ remove_concurrent_index_by_name :issues, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220628111752_drop_token_index_from_ci_builds.rb b/db/post_migrate/20220628111752_drop_token_index_from_ci_builds.rb
new file mode 100644
index 00000000000..d551eeebeb6
--- /dev/null
+++ b/db/post_migrate/20220628111752_drop_token_index_from_ci_builds.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropTokenIndexFromCiBuilds < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_builds_on_token_partial'
+
+ def up
+ remove_concurrent_index_by_name :ci_builds, INDEX_NAME
+ end
+
+ # rubocop:disable Migration/PreventIndexCreation
+ def down
+ add_concurrent_index :ci_builds, :token, unique: true, where: 'token IS NOT NULL', name: INDEX_NAME
+ end
+ # rubocop:enable Migration/PreventIndexCreation
+end
diff --git a/db/post_migrate/20220628122622_rename_builds_sidekiq_queues_to_namespaces.rb b/db/post_migrate/20220628122622_rename_builds_sidekiq_queues_to_namespaces.rb
new file mode 100644
index 00000000000..f692d1476ce
--- /dev/null
+++ b/db/post_migrate/20220628122622_rename_builds_sidekiq_queues_to_namespaces.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class RenameBuildsSidekiqQueuesToNamespaces < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+ disable_ddl_transaction!
+
+ BUILD_OLD_QUEUE = 'pipeline_processing:build_finished'
+ BUILD_NEW_QUEUE = 'pipeline_processing:ci_build_finished'
+
+ TRACE_OLD_QUEUE = 'pipeline_background:archive_trace'
+ TRACE_NEW_QUEUE = 'pipeline_background:ci_archive_trace'
+
+ def up
+ sidekiq_queue_migrate BUILD_OLD_QUEUE, to: BUILD_NEW_QUEUE
+ sidekiq_queue_migrate TRACE_OLD_QUEUE, to: TRACE_NEW_QUEUE
+ end
+
+ def down
+ sidekiq_queue_migrate BUILD_NEW_QUEUE, to: BUILD_OLD_QUEUE
+ sidekiq_queue_migrate TRACE_NEW_QUEUE, to: TRACE_OLD_QUEUE
+ end
+end
diff --git a/db/post_migrate/20220629184402_unset_escalation_policies_for_alert_incidents.rb b/db/post_migrate/20220629184402_unset_escalation_policies_for_alert_incidents.rb
new file mode 100644
index 00000000000..89adc4b2703
--- /dev/null
+++ b/db/post_migrate/20220629184402_unset_escalation_policies_for_alert_incidents.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+class UnsetEscalationPoliciesForAlertIncidents < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ class EscalationStatus < MigrationRecord
+ include EachBatch
+
+ self.table_name = 'incident_management_issuable_escalation_statuses'
+
+ scope :having_alert_policy, -> do
+ joins(
+ 'INNER JOIN alert_management_alerts ' \
+ 'ON alert_management_alerts.issue_id ' \
+ '= incident_management_issuable_escalation_statuses.issue_id'
+ )
+ end
+ end
+
+ def up
+ EscalationStatus.each_batch do |escalation_statuses|
+ escalation_statuses
+ .where.not(policy_id: nil)
+ .having_alert_policy
+ .update_all(policy_id: nil, escalations_started_at: nil)
+ end
+ end
+
+ def down
+ # no-op
+ #
+ # We cannot retrieve the exact nullified values. We could
+ # approximately guess what the values are via the alert's
+ # escalation policy. However, that may not be accurate
+ # in all cases, as an alert's escalation policy is implictly
+ # inferred from the project rather than explicit, like an incident.
+ # So we won't backfill potentially incorrect data.
+ #
+ # This data is functionally safe to delete, as the relevant
+ # fields are read-only, and exclusively informational.
+ #
+ # Re-running the migration will have no effect.
+ end
+end
diff --git a/db/post_migrate/20220630050050_index_vulnerability_reads_on_casted_cluster_agent_id_full.rb b/db/post_migrate/20220630050050_index_vulnerability_reads_on_casted_cluster_agent_id_full.rb
new file mode 100644
index 00000000000..58b6342e30f
--- /dev/null
+++ b/db/post_migrate/20220630050050_index_vulnerability_reads_on_casted_cluster_agent_id_full.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class IndexVulnerabilityReadsOnCastedClusterAgentIdFull < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_vuln_reads_on_casted_cluster_agent_id_where_it_is_null'
+
+ def up
+ add_concurrent_index :vulnerability_reads,
+ :casted_cluster_agent_id,
+ name: INDEX_NAME,
+ where: 'casted_cluster_agent_id IS NOT NULL'
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerability_reads, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220630085003_drop_project_successfull_pages_deploy_index_from_ci_builds.rb b/db/post_migrate/20220630085003_drop_project_successfull_pages_deploy_index_from_ci_builds.rb
new file mode 100644
index 00000000000..0810419a4e8
--- /dev/null
+++ b/db/post_migrate/20220630085003_drop_project_successfull_pages_deploy_index_from_ci_builds.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class DropProjectSuccessfullPagesDeployIndexFromCiBuilds < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_builds_on_project_id_for_successfull_pages_deploy'
+
+ def up
+ remove_concurrent_index_by_name :ci_builds, INDEX_NAME
+ end
+
+ # rubocop:disable Migration/PreventIndexCreation
+ def down
+ add_concurrent_index :ci_builds,
+ :project_id,
+ where: "(((type)::text = 'GenericCommitStatus'::text) AND ((stage)::text = 'deploy'::text) AND " \
+ "((name)::text = 'pages:deploy'::text) AND ((status)::text = 'success'::text))",
+ name: INDEX_NAME
+ end
+ # rubocop:enable Migration/PreventIndexCreation
+end
diff --git a/db/post_migrate/20220630091409_add_index_on_events_for_contribution_analytics_optimization.rb b/db/post_migrate/20220630091409_add_index_on_events_for_contribution_analytics_optimization.rb
new file mode 100644
index 00000000000..de16b17f489
--- /dev/null
+++ b/db/post_migrate/20220630091409_add_index_on_events_for_contribution_analytics_optimization.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexOnEventsForContributionAnalyticsOptimization < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_events_to_improve_contribution_analytics_performance'
+
+ def up
+ add_concurrent_index :events, [:project_id, :target_type, :action, :created_at, :author_id, :id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :events, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220630151641_schedule_set_correct_vulnerability_state.rb b/db/post_migrate/20220630151641_schedule_set_correct_vulnerability_state.rb
new file mode 100644
index 00000000000..7c9211ff282
--- /dev/null
+++ b/db/post_migrate/20220630151641_schedule_set_correct_vulnerability_state.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class ScheduleSetCorrectVulnerabilityState < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ MAX_BATCH_SIZE = 5_000
+ JOB_INTERVAL = 2.minutes
+ MIGRATION_NAME = 'SetCorrectVulnerabilityState'
+ BATCH_CLASS_NAME = 'DismissedVulnerabilitiesStrategy'
+ SUB_BATCH_SIZE = 100
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION_NAME,
+ :vulnerabilities,
+ :id,
+ job_interval: JOB_INTERVAL,
+ batch_size: MAX_BATCH_SIZE,
+ max_batch_size: MAX_BATCH_SIZE,
+ batch_class_name: BATCH_CLASS_NAME,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION_NAME, :vulnerabilities, :id, [])
+ end
+end
diff --git a/db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb b/db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb
new file mode 100644
index 00000000000..10be7a25965
--- /dev/null
+++ b/db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ScheduleIndexOnEventsForContributionAnalyticsOptimization < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_on_events_to_improve_contribution_analytics_performance'
+
+ def up
+ prepare_async_index :events, [:project_id, :target_type, :action, :created_at, :author_id, :id], name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :events, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220703182314_add_check_constraint_for_security_findings_partition_number.rb b/db/post_migrate/20220703182314_add_check_constraint_for_security_findings_partition_number.rb
new file mode 100644
index 00000000000..82b5d0b165d
--- /dev/null
+++ b/db/post_migrate/20220703182314_add_check_constraint_for_security_findings_partition_number.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddCheckConstraintForSecurityFindingsPartitionNumber < Gitlab::Database::Migration[2.0]
+ CONSTRAINT_NAME = 'check_partition_number'
+
+ disable_ddl_transaction!
+
+ def up
+ add_check_constraint(:security_findings, 'partition_number = 1', CONSTRAINT_NAME)
+ end
+
+ def down
+ remove_check_constraint(:security_findings, CONSTRAINT_NAME)
+ end
+end
diff --git a/db/post_migrate/20220704044408_remove_foreign_key_in_project_tracing_settings.rb b/db/post_migrate/20220704044408_remove_foreign_key_in_project_tracing_settings.rb
new file mode 100644
index 00000000000..95eb461238f
--- /dev/null
+++ b/db/post_migrate/20220704044408_remove_foreign_key_in_project_tracing_settings.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveForeignKeyInProjectTracingSettings < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:project_tracing_settings, column: :project_id)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key :project_tracing_settings, :projects,
+ column: :project_id, on_delete: :cascade, name: 'fk_rails_fe56f57fc6'
+ end
+end
diff --git a/db/post_migrate/20220704045440_drop_project_tracing_settings_table.rb b/db/post_migrate/20220704045440_drop_project_tracing_settings_table.rb
new file mode 100644
index 00000000000..1ce8b05a08d
--- /dev/null
+++ b/db/post_migrate/20220704045440_drop_project_tracing_settings_table.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropProjectTracingSettingsTable < Gitlab::Database::Migration[2.0]
+ def up
+ drop_table :project_tracing_settings
+ end
+
+ def down
+ create_table :project_tracing_settings, id: :bigserial do |t|
+ t.timestamps_with_timezone null: false
+
+ t.references :project, type: :integer, null: false, index: { unique: true }
+
+ t.string :external_url, null: false
+ end
+ end
+end
diff --git a/db/post_migrate/20220705114635_drop_index_on_ci_runner_versions_on_version.rb b/db/post_migrate/20220705114635_drop_index_on_ci_runner_versions_on_version.rb
new file mode 100644
index 00000000000..22ff65f6fc3
--- /dev/null
+++ b/db/post_migrate/20220705114635_drop_index_on_ci_runner_versions_on_version.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropIndexOnCiRunnerVersionsOnVersion < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_runner_versions_on_version'
+
+ def up
+ remove_concurrent_index_by_name :ci_runner_versions, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :ci_runner_versions, :version, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220705180843_validate_requirements_issue_id_not_null.rb b/db/post_migrate/20220705180843_validate_requirements_issue_id_not_null.rb
new file mode 100644
index 00000000000..a0c8954b481
--- /dev/null
+++ b/db/post_migrate/20220705180843_validate_requirements_issue_id_not_null.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class ValidateRequirementsIssueIdNotNull < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ constraint_name = 'check_requirement_issue_not_null'
+
+ validate_not_null_constraint(:requirements, :issue_id, constraint_name: constraint_name)
+ end
+
+ def down
+ # No op
+ end
+end
diff --git a/db/post_migrate/20220706065245_remove_foreign_key_in_clusters_applications_elastic_stacks.rb b/db/post_migrate/20220706065245_remove_foreign_key_in_clusters_applications_elastic_stacks.rb
new file mode 100644
index 00000000000..bfe60099bfa
--- /dev/null
+++ b/db/post_migrate/20220706065245_remove_foreign_key_in_clusters_applications_elastic_stacks.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveForeignKeyInClustersApplicationsElasticStacks < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:clusters_applications_elastic_stacks, column: :cluster_id)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key :clusters_applications_elastic_stacks, :clusters,
+ column: :cluster_id, on_delete: :cascade, name: 'fk_rails_026f219f46'
+ end
+end
diff --git a/db/post_migrate/20220706065611_remove_foreign_key_in_clusters_integration_elasticstack.rb b/db/post_migrate/20220706065611_remove_foreign_key_in_clusters_integration_elasticstack.rb
new file mode 100644
index 00000000000..eeec465f6b9
--- /dev/null
+++ b/db/post_migrate/20220706065611_remove_foreign_key_in_clusters_integration_elasticstack.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveForeignKeyInClustersIntegrationElasticstack < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:clusters_integration_elasticstack, column: :cluster_id)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key :clusters_integration_elasticstack, :clusters,
+ column: :cluster_id, on_delete: :cascade, name: 'fk_rails_cc5ba8f658'
+ end
+end
diff --git a/db/post_migrate/20220706070804_drop_clusters_applications_elastic_stacks_table.rb b/db/post_migrate/20220706070804_drop_clusters_applications_elastic_stacks_table.rb
new file mode 100644
index 00000000000..cedf666e428
--- /dev/null
+++ b/db/post_migrate/20220706070804_drop_clusters_applications_elastic_stacks_table.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropClustersApplicationsElasticStacksTable < Gitlab::Database::Migration[2.0]
+ def up
+ drop_table :clusters_applications_elastic_stacks
+ end
+
+ def down
+ create_table :clusters_applications_elastic_stacks do |t|
+ t.timestamps_with_timezone null: false
+ t.references :cluster, type: :bigint, null: false, index: { unique: true }
+ t.integer :status, null: false
+ t.string :version, null: false, limit: 255
+ t.text :status_reason
+ end
+ end
+end
diff --git a/db/post_migrate/20220706071304_drop_clusters_integration_elasticstack_table.rb b/db/post_migrate/20220706071304_drop_clusters_integration_elasticstack_table.rb
new file mode 100644
index 00000000000..206652b5dcf
--- /dev/null
+++ b/db/post_migrate/20220706071304_drop_clusters_integration_elasticstack_table.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class DropClustersIntegrationElasticstackTable < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_clusters_integration_elasticstack_enabled'
+
+ def up
+ drop_table :clusters_integration_elasticstack
+ end
+
+ def down
+ create_table :clusters_integration_elasticstack, id: false do |t|
+ t.timestamps_with_timezone null: false
+ t.references :cluster, primary_key: true, type: :bigint, default: nil, index: false
+ t.boolean :enabled, null: false, default: false
+ t.text :chart_version, limit: 10
+ end
+
+ add_concurrent_index(:clusters_integration_elasticstack, [:enabled, :created_at, :cluster_id], name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20220706115138_create_async_index_on_security_findings.rb b/db/post_migrate/20220706115138_create_async_index_on_security_findings.rb
new file mode 100644
index 00000000000..30baa1af91c
--- /dev/null
+++ b/db/post_migrate/20220706115138_create_async_index_on_security_findings.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class CreateAsyncIndexOnSecurityFindings < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_on_security_findings_uuid_and_id_order_desc'
+
+ def up
+ prepare_async_index(
+ :security_findings,
+ %i[uuid id],
+ order: { id: :desc },
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ unprepare_async_index(
+ :security_findings,
+ %i[uuid id],
+ name: INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20220706122719_create_index_on_security_findings_uuid_id_desc.rb b/db/post_migrate/20220706122719_create_index_on_security_findings_uuid_id_desc.rb
new file mode 100644
index 00000000000..0c2e2cb4b70
--- /dev/null
+++ b/db/post_migrate/20220706122719_create_index_on_security_findings_uuid_id_desc.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class CreateIndexOnSecurityFindingsUuidIdDesc < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_security_findings_uuid_and_id_order_desc'
+
+ def up
+ add_concurrent_index(
+ :security_findings,
+ %i[uuid id],
+ order: { id: :desc },
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(
+ :security_findings,
+ INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20220706132238_add_indices_on_security_scans_info_column.rb b/db/post_migrate/20220706132238_add_indices_on_security_scans_info_column.rb
new file mode 100644
index 00000000000..48dc5b5d84a
--- /dev/null
+++ b/db/post_migrate/20220706132238_add_indices_on_security_scans_info_column.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class AddIndicesOnSecurityScansInfoColumn < Gitlab::Database::Migration[2.0]
+ INDEX_NAME_ON_ERRORS = :index_security_scans_on_length_of_errors
+ INDEX_NAME_ON_WARNINGS = :index_security_scans_on_length_of_warnings
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(
+ :security_scans,
+ "pipeline_id, jsonb_array_length(COALESCE((security_scans.info -> 'errors'::text), '[]'::jsonb))",
+ name: INDEX_NAME_ON_ERRORS
+ )
+
+ add_concurrent_index(
+ :security_scans,
+ "pipeline_id, jsonb_array_length(COALESCE((security_scans.info -> 'warnings'::text), '[]'::jsonb))",
+ name: INDEX_NAME_ON_WARNINGS
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name :security_scans, INDEX_NAME_ON_ERRORS
+ remove_concurrent_index_by_name :security_scans, INDEX_NAME_ON_WARNINGS
+ end
+end
diff --git a/db/post_migrate/20220707075300_reschedule_backfill_imported_issue_search_data.rb b/db/post_migrate/20220707075300_reschedule_backfill_imported_issue_search_data.rb
new file mode 100644
index 00000000000..b5124ce667c
--- /dev/null
+++ b/db/post_migrate/20220707075300_reschedule_backfill_imported_issue_search_data.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class RescheduleBackfillImportedIssueSearchData < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ MIGRATION = 'BackfillImportedIssueSearchData'
+ DELAY_INTERVAL = 120.seconds
+ BATCH_SIZE = 50_000
+ SUB_BATCH_SIZE = 1_000
+
+ def up
+ # remove the original migration
+ delete_batched_background_migration(MIGRATION, :issues, :id, [])
+
+ # reschedule the migration
+ min_value = Gitlab::Database::BackgroundMigration::BatchedMigration.find_by(
+ job_class_name: "BackfillIssueSearchData"
+ )&.max_value || BATCH_MIN_VALUE
+
+ queue_batched_background_migration(
+ MIGRATION,
+ :issues,
+ :id,
+ job_interval: DELAY_INTERVAL,
+ batch_min_value: min_value,
+ batch_size: BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :issues, :id, [])
+ end
+end
diff --git a/db/post_migrate/20220708100508_drop_index_on_ci_runner_versions_on_status.rb b/db/post_migrate/20220708100508_drop_index_on_ci_runner_versions_on_status.rb
new file mode 100644
index 00000000000..71eb5a0867e
--- /dev/null
+++ b/db/post_migrate/20220708100508_drop_index_on_ci_runner_versions_on_status.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropIndexOnCiRunnerVersionsOnStatus < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_runner_versions_on_status'
+
+ def up
+ remove_concurrent_index_by_name :ci_runner_versions, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :ci_runner_versions, :version, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220713133515_cleanup_backfill_draft_statuses_on_merge_requests.rb b/db/post_migrate/20220713133515_cleanup_backfill_draft_statuses_on_merge_requests.rb
new file mode 100644
index 00000000000..eb612a98ae6
--- /dev/null
+++ b/db/post_migrate/20220713133515_cleanup_backfill_draft_statuses_on_merge_requests.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CleanupBackfillDraftStatusesOnMergeRequests < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'BackfillDraftStatusOnMergeRequests'
+
+ def up
+ finalize_background_migration(MIGRATION)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220714122311_add_async_index_on_security_findings_id_and_partition_number.rb b/db/post_migrate/20220714122311_add_async_index_on_security_findings_id_and_partition_number.rb
new file mode 100644
index 00000000000..02d18ba8b40
--- /dev/null
+++ b/db/post_migrate/20220714122311_add_async_index_on_security_findings_id_and_partition_number.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddAsyncIndexOnSecurityFindingsIdAndPartitionNumber < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'security_findings_partitioned_pkey'
+
+ disable_ddl_transaction!
+
+ def up
+ prepare_async_index :security_findings, [:id, :partition_number], unique: true, name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index_by_name :security_findings, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220714122418_add_async_index_on_security_findings_unique_columns.rb b/db/post_migrate/20220714122418_add_async_index_on_security_findings_unique_columns.rb
new file mode 100644
index 00000000000..e21d3db6798
--- /dev/null
+++ b/db/post_migrate/20220714122418_add_async_index_on_security_findings_unique_columns.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddAsyncIndexOnSecurityFindingsUniqueColumns < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_security_findings_on_unique_columns'
+
+ disable_ddl_transaction!
+
+ def up
+ prepare_async_index :security_findings, [:uuid, :scan_id, :partition_number], unique: true, name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index_by_name :security_findings, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220715054506_add_parent_link_unique_work_item_index.rb b/db/post_migrate/20220715054506_add_parent_link_unique_work_item_index.rb
new file mode 100644
index 00000000000..ed5b85b711c
--- /dev/null
+++ b/db/post_migrate/20220715054506_add_parent_link_unique_work_item_index.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddParentLinkUniqueWorkItemIndex < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_work_item_parent_links_on_work_item_id'
+ OLD_INDEX_NAME = 'index_parent_links_on_work_item_id_and_work_item_parent_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :work_item_parent_links, :work_item_id, unique: true, name: INDEX_NAME
+ remove_concurrent_index_by_name :work_item_parent_links, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :work_item_parent_links, [:work_item_id, :work_item_parent_id],
+ unique: true, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :work_item_parent_links, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220715160023_drop_post_migration_test_table.rb b/db/post_migrate/20220715160023_drop_post_migration_test_table.rb
new file mode 100644
index 00000000000..98b4cbcf972
--- /dev/null
+++ b/db/post_migrate/20220715160023_drop_post_migration_test_table.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class DropPostMigrationTestTable < Gitlab::Database::Migration[2.0]
+ def up
+ drop_table :post_migration_test_table
+ end
+
+ def down
+ create_table :post_migration_test_table do |t|
+ t.integer :status, null: false
+ end
+ end
+end
diff --git a/db/post_migrate/20220715163254_update_notes_in_past.rb b/db/post_migrate/20220715163254_update_notes_in_past.rb
new file mode 100644
index 00000000000..1c46a3bc9dc
--- /dev/null
+++ b/db/post_migrate/20220715163254_update_notes_in_past.rb
@@ -0,0 +1,22 @@
+# 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 UpdateNotesInPast < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ loop do
+ update_count = define_batchable_model('notes')
+ .where('created_at < ?', '1970-01-01').limit(100)
+ .update_all(created_at: '1970-01-01 00:00:00')
+
+ break if update_count == 0
+ end
+ end
+
+ def down
+ # no op
+ end
+end
diff --git a/db/schema_migrations/20220523162734 b/db/schema_migrations/20220523162734
new file mode 100644
index 00000000000..dd319042965
--- /dev/null
+++ b/db/schema_migrations/20220523162734
@@ -0,0 +1 @@
+af6f954426b714649a3b19e80a20cf99475cdc8496c23add8032cda27072d31d \ No newline at end of file
diff --git a/db/schema_migrations/20220523163734 b/db/schema_migrations/20220523163734
new file mode 100644
index 00000000000..622ea4abb95
--- /dev/null
+++ b/db/schema_migrations/20220523163734
@@ -0,0 +1 @@
+02821039feda457c1fb61dc6ff62756752c0c1c0ad01e12ecf28c265462529d4 \ No newline at end of file
diff --git a/db/schema_migrations/20220523164734 b/db/schema_migrations/20220523164734
new file mode 100644
index 00000000000..3538f55712d
--- /dev/null
+++ b/db/schema_migrations/20220523164734
@@ -0,0 +1 @@
+ef078bbcf8415a7bb49ed919739005d22c21199da1a0e5e5c0971d2a8e1b2a40 \ No newline at end of file
diff --git a/db/schema_migrations/20220523165734 b/db/schema_migrations/20220523165734
new file mode 100644
index 00000000000..b1d8fa16dd5
--- /dev/null
+++ b/db/schema_migrations/20220523165734
@@ -0,0 +1 @@
+89a03d69c44ed95133446275bb9b39dfe91ad3022cefdfa438ea3c96ab4f8e69 \ No newline at end of file
diff --git a/db/schema_migrations/20220524164122 b/db/schema_migrations/20220524164122
new file mode 100644
index 00000000000..26e3b596910
--- /dev/null
+++ b/db/schema_migrations/20220524164122
@@ -0,0 +1 @@
+dc449f4ea28da3662fce663dcd5cdc9e37417e14b39e26897cc35a2bebfa22f0 \ No newline at end of file
diff --git a/db/schema_migrations/20220531024905 b/db/schema_migrations/20220531024905
new file mode 100644
index 00000000000..3892c437701
--- /dev/null
+++ b/db/schema_migrations/20220531024905
@@ -0,0 +1 @@
+3470fa801f5d6c343c95d78a710aa1907a581575465718c8d971f4b8f305a39b \ No newline at end of file
diff --git a/db/schema_migrations/20220531035113 b/db/schema_migrations/20220531035113
new file mode 100644
index 00000000000..133741d8a36
--- /dev/null
+++ b/db/schema_migrations/20220531035113
@@ -0,0 +1 @@
+4e4e158655d40797c4f9152ad3e4f8b9b4894ce1ce92bf89c6219f9c69847c45 \ No newline at end of file
diff --git a/db/schema_migrations/20220531140515 b/db/schema_migrations/20220531140515
new file mode 100644
index 00000000000..1e89b902026
--- /dev/null
+++ b/db/schema_migrations/20220531140515
@@ -0,0 +1 @@
+2c0c801506c47adb74c4a91a5fcf37b02355b35570ffbdd18c8aa6a11a8397ac \ No newline at end of file
diff --git a/db/schema_migrations/20220601151900 b/db/schema_migrations/20220601151900
new file mode 100644
index 00000000000..d758b7aa67c
--- /dev/null
+++ b/db/schema_migrations/20220601151900
@@ -0,0 +1 @@
+c215c9ef738ab0d466d9244c0596164d6860728ac92fac90bef5a987c2cef6b7 \ No newline at end of file
diff --git a/db/schema_migrations/20220601152916 b/db/schema_migrations/20220601152916
new file mode 100644
index 00000000000..4858976aa3a
--- /dev/null
+++ b/db/schema_migrations/20220601152916
@@ -0,0 +1 @@
+f460407888e289580dec15ea27e19fa5cc2d2116a831105b71b980c617971743 \ No newline at end of file
diff --git a/db/schema_migrations/20220606082910 b/db/schema_migrations/20220606082910
new file mode 100644
index 00000000000..5917ba95971
--- /dev/null
+++ b/db/schema_migrations/20220606082910
@@ -0,0 +1 @@
+ecab80f469d2aea061b5c8371a243e4b6686d637c3df284f23e575606ef8c1a6 \ No newline at end of file
diff --git a/db/schema_migrations/20220608074738 b/db/schema_migrations/20220608074738
new file mode 100644
index 00000000000..035979d8f04
--- /dev/null
+++ b/db/schema_migrations/20220608074738
@@ -0,0 +1 @@
+0bf44279d1fd78a8df1ec2898b6170e587fb2dd5d692b9c31648aa19dffa5fe8 \ No newline at end of file
diff --git a/db/schema_migrations/20220610140605 b/db/schema_migrations/20220610140605
new file mode 100644
index 00000000000..c2ae3528d21
--- /dev/null
+++ b/db/schema_migrations/20220610140605
@@ -0,0 +1 @@
+9c64f9fb286992b6cdad8f7f22084c2d538bccf97e9c649f47284c5828a850e3 \ No newline at end of file
diff --git a/db/schema_migrations/20220613054349 b/db/schema_migrations/20220613054349
new file mode 100644
index 00000000000..1c3806a80c8
--- /dev/null
+++ b/db/schema_migrations/20220613054349
@@ -0,0 +1 @@
+4c3e4852614dd1a59d63809c40417887794bcbbcf8d3ea3a96f8846e2bd5f795 \ No newline at end of file
diff --git a/db/schema_migrations/20220614120415 b/db/schema_migrations/20220614120415
new file mode 100644
index 00000000000..2357871c8d8
--- /dev/null
+++ b/db/schema_migrations/20220614120415
@@ -0,0 +1 @@
+a18f38b1f25ab3344c3ce8dcefc4579370c79e70354dc1665dbb8026892e1e37 \ No newline at end of file
diff --git a/db/schema_migrations/20220616182001 b/db/schema_migrations/20220616182001
new file mode 100644
index 00000000000..8167bae8550
--- /dev/null
+++ b/db/schema_migrations/20220616182001
@@ -0,0 +1 @@
+7276612cf3f2fd968405c1bb31afe2eafeca3dc9e145f5f4c2e1609a93926e04 \ No newline at end of file
diff --git a/db/schema_migrations/20220616182015 b/db/schema_migrations/20220616182015
new file mode 100644
index 00000000000..00f4825677c
--- /dev/null
+++ b/db/schema_migrations/20220616182015
@@ -0,0 +1 @@
+4c2d89fc0aae46c08fc03018de7fafc9a040fa94284224a89ae626a1ddd2cfa9 \ No newline at end of file
diff --git a/db/schema_migrations/20220616182016 b/db/schema_migrations/20220616182016
new file mode 100644
index 00000000000..a2c9beba76b
--- /dev/null
+++ b/db/schema_migrations/20220616182016
@@ -0,0 +1 @@
+ebb53cf83d85c5b1b07e206e7190a3d17e37ec35f085e8e57e1245ba1a3acbf6 \ No newline at end of file
diff --git a/db/schema_migrations/20220616182038 b/db/schema_migrations/20220616182038
new file mode 100644
index 00000000000..1bf761987d8
--- /dev/null
+++ b/db/schema_migrations/20220616182038
@@ -0,0 +1 @@
+969b07e2aa0422f9eae171b7c345f2fdaf061bd0ea05bc76618d986364b9223c \ No newline at end of file
diff --git a/db/schema_migrations/20220616183240 b/db/schema_migrations/20220616183240
new file mode 100644
index 00000000000..39d0cab11ca
--- /dev/null
+++ b/db/schema_migrations/20220616183240
@@ -0,0 +1 @@
+7714fa874067ab65a0374617e83a53986105cafe0d92319b21a4f7d7ad2fc600 \ No newline at end of file
diff --git a/db/schema_migrations/20220616183309 b/db/schema_migrations/20220616183309
new file mode 100644
index 00000000000..cd44061963f
--- /dev/null
+++ b/db/schema_migrations/20220616183309
@@ -0,0 +1 @@
+717dd5d40fca276c49b42909e5e3ec9e0cef7f0e534c428d849528003af44fd8 \ No newline at end of file
diff --git a/db/schema_migrations/20220616183310 b/db/schema_migrations/20220616183310
new file mode 100644
index 00000000000..a854df90812
--- /dev/null
+++ b/db/schema_migrations/20220616183310
@@ -0,0 +1 @@
+c175c13b220873cea28ea3963cf461aaeb570051ef3834b8520b7ad9520a0f19 \ No newline at end of file
diff --git a/db/schema_migrations/20220617123022 b/db/schema_migrations/20220617123022
new file mode 100644
index 00000000000..043b16b6cb6
--- /dev/null
+++ b/db/schema_migrations/20220617123022
@@ -0,0 +1 @@
+247c6cba3cee4413a17193aeebd77eae79a7ced17a5a2b785f0ecd682e823c02 \ No newline at end of file
diff --git a/db/schema_migrations/20220617123034 b/db/schema_migrations/20220617123034
new file mode 100644
index 00000000000..f0ecdc68113
--- /dev/null
+++ b/db/schema_migrations/20220617123034
@@ -0,0 +1 @@
+d72ffd09437a576edb2d046963e8d004c5a2b13586f7318361fea6d673f5cece \ No newline at end of file
diff --git a/db/schema_migrations/20220617123105 b/db/schema_migrations/20220617123105
new file mode 100644
index 00000000000..a3ffe22bca4
--- /dev/null
+++ b/db/schema_migrations/20220617123105
@@ -0,0 +1 @@
+d382bfcfcf79ba38a388ac5496a194adc0c392ba6685c024d7bd55a14d57c1b8 \ No newline at end of file
diff --git a/db/schema_migrations/20220617123113 b/db/schema_migrations/20220617123113
new file mode 100644
index 00000000000..deb71083ab0
--- /dev/null
+++ b/db/schema_migrations/20220617123113
@@ -0,0 +1 @@
+ebe1b2db48b987720e7c561b30ce41e7542d8cd190e4b454bd28d6fdfa8bff0d \ No newline at end of file
diff --git a/db/schema_migrations/20220617123135 b/db/schema_migrations/20220617123135
new file mode 100644
index 00000000000..3cafd00560c
--- /dev/null
+++ b/db/schema_migrations/20220617123135
@@ -0,0 +1 @@
+2fcb9e7ecdc387d5dd4dfe78544289026bb2626eca2650da590f6181deeaadef \ No newline at end of file
diff --git a/db/schema_migrations/20220617123144 b/db/schema_migrations/20220617123144
new file mode 100644
index 00000000000..6f9c5e33092
--- /dev/null
+++ b/db/schema_migrations/20220617123144
@@ -0,0 +1 @@
+5a03ed4bc5791d0feb72203553f77ed37f37127309eda6c7dc75c7ac950e28e3 \ No newline at end of file
diff --git a/db/schema_migrations/20220617141347 b/db/schema_migrations/20220617141347
new file mode 100644
index 00000000000..d8c8ff580cf
--- /dev/null
+++ b/db/schema_migrations/20220617141347
@@ -0,0 +1 @@
+64473c05cc67d6d87d921921ea09e0962f51092d5bb565cc387def8d91676728 \ No newline at end of file
diff --git a/db/schema_migrations/20220617142124 b/db/schema_migrations/20220617142124
new file mode 100644
index 00000000000..c8fd06f2c10
--- /dev/null
+++ b/db/schema_migrations/20220617142124
@@ -0,0 +1 @@
+668404076e9cfc91817b8ae3ec995a69ec0db283153bbe497a81eb83c2188ceb \ No newline at end of file
diff --git a/db/schema_migrations/20220617143228 b/db/schema_migrations/20220617143228
new file mode 100644
index 00000000000..cb4ac555bc3
--- /dev/null
+++ b/db/schema_migrations/20220617143228
@@ -0,0 +1 @@
+547fc0071177395133497cbcec9a9d9ed058fe74f632f5e84d9a6416047503f2 \ No newline at end of file
diff --git a/db/schema_migrations/20220619182308 b/db/schema_migrations/20220619182308
new file mode 100644
index 00000000000..7d85fb1c487
--- /dev/null
+++ b/db/schema_migrations/20220619182308
@@ -0,0 +1 @@
+f8830ecd0c49aea19857fec9b07d238f4bc269a758b6a3495d57222ab1604c74 \ No newline at end of file
diff --git a/db/schema_migrations/20220619184931 b/db/schema_migrations/20220619184931
new file mode 100644
index 00000000000..a98c1f3e847
--- /dev/null
+++ b/db/schema_migrations/20220619184931
@@ -0,0 +1 @@
+2cdbc5b29e11a2ce0679f218adc57c95d483139ca0bcd1801ea97fbd4ba68ddf \ No newline at end of file
diff --git a/db/schema_migrations/20220620060633 b/db/schema_migrations/20220620060633
new file mode 100644
index 00000000000..d6a627ff611
--- /dev/null
+++ b/db/schema_migrations/20220620060633
@@ -0,0 +1 @@
+29b2e0496736ae09f7d2b6a971a7a9a946379469de0f5488a3ff16efd896e306 \ No newline at end of file
diff --git a/db/schema_migrations/20220620132300 b/db/schema_migrations/20220620132300
new file mode 100644
index 00000000000..8355b33c868
--- /dev/null
+++ b/db/schema_migrations/20220620132300
@@ -0,0 +1 @@
+cc7a1d81c9de121380b7b1a4bbbb1947313635c6ae16ce15184b586765333a8e \ No newline at end of file
diff --git a/db/schema_migrations/20220620151740 b/db/schema_migrations/20220620151740
new file mode 100644
index 00000000000..fae240f63f9
--- /dev/null
+++ b/db/schema_migrations/20220620151740
@@ -0,0 +1 @@
+b54da707978fc5e90183331250ab66b5438c6c9f9ecd50a50db5b63a5993bd6b \ No newline at end of file
diff --git a/db/schema_migrations/20220621040800 b/db/schema_migrations/20220621040800
new file mode 100644
index 00000000000..dbdc38367be
--- /dev/null
+++ b/db/schema_migrations/20220621040800
@@ -0,0 +1 @@
+effd82de862e39edcba7793010bdd377b8141c49edebdd380276a8b558886835 \ No newline at end of file
diff --git a/db/schema_migrations/20220621082245 b/db/schema_migrations/20220621082245
new file mode 100644
index 00000000000..42e34952c30
--- /dev/null
+++ b/db/schema_migrations/20220621082245
@@ -0,0 +1 @@
+290ff026a11ac5eadd71fb9fb3ba21bed535d148c56b3176f115e973cdb41369 \ No newline at end of file
diff --git a/db/schema_migrations/20220621092245 b/db/schema_migrations/20220621092245
new file mode 100644
index 00000000000..86274a80e6d
--- /dev/null
+++ b/db/schema_migrations/20220621092245
@@ -0,0 +1 @@
+c414443040bb168009bcbe00f874b1f474c1d1dcf563e621cfdf641f21846d59 \ No newline at end of file
diff --git a/db/schema_migrations/20220621202616 b/db/schema_migrations/20220621202616
new file mode 100644
index 00000000000..187ff41b3c1
--- /dev/null
+++ b/db/schema_migrations/20220621202616
@@ -0,0 +1 @@
+6567c86c14f741b7ea8f49b04c3ad82f226f04c0ab2e68212b5f6e7bf4ef615f \ No newline at end of file
diff --git a/db/schema_migrations/20220622070547 b/db/schema_migrations/20220622070547
new file mode 100644
index 00000000000..da1b4231b0d
--- /dev/null
+++ b/db/schema_migrations/20220622070547
@@ -0,0 +1 @@
+e259a91d467b3ec3e09c4514de0e798cffa697a8bc492edd6ad0dcab7f9a9623 \ No newline at end of file
diff --git a/db/schema_migrations/20220622080547 b/db/schema_migrations/20220622080547
new file mode 100644
index 00000000000..c7b3e676a30
--- /dev/null
+++ b/db/schema_migrations/20220622080547
@@ -0,0 +1 @@
+366f0819ce42bc84fc88871872d4b5870e63894fa2e32fbd7808cce2afe4815b \ No newline at end of file
diff --git a/db/schema_migrations/20220624062300 b/db/schema_migrations/20220624062300
new file mode 100644
index 00000000000..a13fda7e34b
--- /dev/null
+++ b/db/schema_migrations/20220624062300
@@ -0,0 +1 @@
+d09b9359b871c96511c255abdc1ff82640420f469a16c5e76461ca47dca58770 \ No newline at end of file
diff --git a/db/schema_migrations/20220624081524 b/db/schema_migrations/20220624081524
new file mode 100644
index 00000000000..f643b1223a8
--- /dev/null
+++ b/db/schema_migrations/20220624081524
@@ -0,0 +1 @@
+3245905956e4781629bbf6398c9534cf35eab469e8a703f755ed26de90dee0e1 \ No newline at end of file
diff --git a/db/schema_migrations/20220624090458 b/db/schema_migrations/20220624090458
new file mode 100644
index 00000000000..62473bf8bd3
--- /dev/null
+++ b/db/schema_migrations/20220624090458
@@ -0,0 +1 @@
+cf3c6e8d720ce48272b8b9658d3c240e8fe3c9a26284a9e169f7bb6a40c862bc \ No newline at end of file
diff --git a/db/schema_migrations/20220627061008 b/db/schema_migrations/20220627061008
new file mode 100644
index 00000000000..8a576f791ad
--- /dev/null
+++ b/db/schema_migrations/20220627061008
@@ -0,0 +1 @@
+80c35cd4dbc2e00e721ccb9313ff0f2f4f85e781c7961680e14769c308f067ed \ No newline at end of file
diff --git a/db/schema_migrations/20220627090231 b/db/schema_migrations/20220627090231
new file mode 100644
index 00000000000..ca24023b011
--- /dev/null
+++ b/db/schema_migrations/20220627090231
@@ -0,0 +1 @@
+e0038cb5687098e93a250e6fb0449d0ae2eb7c534219b3f24a9258f2a3c0fedb \ No newline at end of file
diff --git a/db/schema_migrations/20220627122229 b/db/schema_migrations/20220627122229
new file mode 100644
index 00000000000..040376e1aa0
--- /dev/null
+++ b/db/schema_migrations/20220627122229
@@ -0,0 +1 @@
+29ab69647b53c331aefdd62e8fbcc1567df4424a8e7ae6f8eb7b1e9afa7a6911 \ No newline at end of file
diff --git a/db/schema_migrations/20220627122230 b/db/schema_migrations/20220627122230
new file mode 100644
index 00000000000..82ba0d503ee
--- /dev/null
+++ b/db/schema_migrations/20220627122230
@@ -0,0 +1 @@
+6d65af0d20cd80cf3367f48c5447ff33046e982ac1cfd55aaf52a7cc2330e428 \ No newline at end of file
diff --git a/db/schema_migrations/20220627140315 b/db/schema_migrations/20220627140315
new file mode 100644
index 00000000000..1ff8388f109
--- /dev/null
+++ b/db/schema_migrations/20220627140315
@@ -0,0 +1 @@
+0511a510621fec3b4b22ac55f151ec3fd83206cc39e97ac3b93a61a80e7a43f8 \ No newline at end of file
diff --git a/db/schema_migrations/20220627152642 b/db/schema_migrations/20220627152642
new file mode 100644
index 00000000000..b92fde2e5ca
--- /dev/null
+++ b/db/schema_migrations/20220627152642
@@ -0,0 +1 @@
+24b07a6966c6fd7ab680cf5a9052b7c2f6d20944eaae5d06ef42934364dce222 \ No newline at end of file
diff --git a/db/schema_migrations/20220627171538 b/db/schema_migrations/20220627171538
new file mode 100644
index 00000000000..a2c269b4348
--- /dev/null
+++ b/db/schema_migrations/20220627171538
@@ -0,0 +1 @@
+1f44130f3f8af92bfaa7de488da2f5f0804045afa6e2ac233d2660a7937a9e32 \ No newline at end of file
diff --git a/db/schema_migrations/20220627223041 b/db/schema_migrations/20220627223041
new file mode 100644
index 00000000000..3292e76e1de
--- /dev/null
+++ b/db/schema_migrations/20220627223041
@@ -0,0 +1 @@
+225606ccdf0979aaf70ff8b9a44269e69b1598718e3d7c1944ed41c07b5e33f6 \ No newline at end of file
diff --git a/db/schema_migrations/20220628012902 b/db/schema_migrations/20220628012902
new file mode 100644
index 00000000000..ef7325629ca
--- /dev/null
+++ b/db/schema_migrations/20220628012902
@@ -0,0 +1 @@
+5881441f8a6c0f25cff00aa9e164a1c19bcc34d4db678fc50712824fff82b24e \ No newline at end of file
diff --git a/db/schema_migrations/20220628110214 b/db/schema_migrations/20220628110214
new file mode 100644
index 00000000000..97bab836225
--- /dev/null
+++ b/db/schema_migrations/20220628110214
@@ -0,0 +1 @@
+f95de3ed746d6f661358a3826587da37009f20ba3cd0e8a332e57f9276fb856c \ No newline at end of file
diff --git a/db/schema_migrations/20220628110823 b/db/schema_migrations/20220628110823
new file mode 100644
index 00000000000..1c5bb0f3320
--- /dev/null
+++ b/db/schema_migrations/20220628110823
@@ -0,0 +1 @@
+50d788ced675b3773bbb84122040c775c24c0993c95542f5130a6456fcd4ee69 \ No newline at end of file
diff --git a/db/schema_migrations/20220628111752 b/db/schema_migrations/20220628111752
new file mode 100644
index 00000000000..747546f1ba4
--- /dev/null
+++ b/db/schema_migrations/20220628111752
@@ -0,0 +1 @@
+5a4a6355d1954735a05831e17c97e2879320f2cb313be56fb72e1cd2c20d9090 \ No newline at end of file
diff --git a/db/schema_migrations/20220628120708 b/db/schema_migrations/20220628120708
new file mode 100644
index 00000000000..b6961491c93
--- /dev/null
+++ b/db/schema_migrations/20220628120708
@@ -0,0 +1 @@
+75027a5b09491b156837707af20406b2672d5ee3ce2272ecf1496e98da2861bf \ No newline at end of file
diff --git a/db/schema_migrations/20220628121644 b/db/schema_migrations/20220628121644
new file mode 100644
index 00000000000..cac9b9d9a0b
--- /dev/null
+++ b/db/schema_migrations/20220628121644
@@ -0,0 +1 @@
+90b9b47ef3671b73117205264589f895a083b0d00db00e684b25e60673d2e840 \ No newline at end of file
diff --git a/db/schema_migrations/20220628121712 b/db/schema_migrations/20220628121712
new file mode 100644
index 00000000000..e1c0ed37cff
--- /dev/null
+++ b/db/schema_migrations/20220628121712
@@ -0,0 +1 @@
+d64a9c41376bbb3bc2c9df846668b1a67b0bed1b1410d97dba17c19a2f322b38 \ No newline at end of file
diff --git a/db/schema_migrations/20220628122622 b/db/schema_migrations/20220628122622
new file mode 100644
index 00000000000..ce29140a862
--- /dev/null
+++ b/db/schema_migrations/20220628122622
@@ -0,0 +1 @@
+aeaa386b52a2a5e30b59fbe57e9c701298fea45219b3ec419866d40c6d2a5e5d \ No newline at end of file
diff --git a/db/schema_migrations/20220629184402 b/db/schema_migrations/20220629184402
new file mode 100644
index 00000000000..7e8b0c47bd1
--- /dev/null
+++ b/db/schema_migrations/20220629184402
@@ -0,0 +1 @@
+9414b08c3eacadffd8759739da163eb378776d3ecdb06dab7c66e259ff1bed29 \ No newline at end of file
diff --git a/db/schema_migrations/20220629220129 b/db/schema_migrations/20220629220129
new file mode 100644
index 00000000000..580da9df82a
--- /dev/null
+++ b/db/schema_migrations/20220629220129
@@ -0,0 +1 @@
+2f5e08212b2f733ce5812d7154879768532e31e642b647648d1c03fd4ddf8b13 \ No newline at end of file
diff --git a/db/schema_migrations/20220630050050 b/db/schema_migrations/20220630050050
new file mode 100644
index 00000000000..2ec998847eb
--- /dev/null
+++ b/db/schema_migrations/20220630050050
@@ -0,0 +1 @@
+dfb314ef76efc54a2464e6b84e71753caf58bc8508f9e64b403066ea4847fe56 \ No newline at end of file
diff --git a/db/schema_migrations/20220630085003 b/db/schema_migrations/20220630085003
new file mode 100644
index 00000000000..9e020afbe84
--- /dev/null
+++ b/db/schema_migrations/20220630085003
@@ -0,0 +1 @@
+c1fb356eb437f9511c0af324f9f4a173245a427d20e2bbda0557dfaff28911c3 \ No newline at end of file
diff --git a/db/schema_migrations/20220630091409 b/db/schema_migrations/20220630091409
new file mode 100644
index 00000000000..e36a91febe6
--- /dev/null
+++ b/db/schema_migrations/20220630091409
@@ -0,0 +1 @@
+f8c8489ecded214bbc4ab615a23eceaef3b6f650e98514f8e2b4b2fa6d328f4e \ No newline at end of file
diff --git a/db/schema_migrations/20220630151641 b/db/schema_migrations/20220630151641
new file mode 100644
index 00000000000..f32c607c840
--- /dev/null
+++ b/db/schema_migrations/20220630151641
@@ -0,0 +1 @@
+55794a6bb6380adc662fb90f60596477ff81d83b05b4cca83d72332d869d08fb \ No newline at end of file
diff --git a/db/schema_migrations/20220630202329 b/db/schema_migrations/20220630202329
new file mode 100644
index 00000000000..c45ba56ad4b
--- /dev/null
+++ b/db/schema_migrations/20220630202329
@@ -0,0 +1 @@
+5b12e0fbebef2979cfc31aab16ce78988a2f94662dbe1048791413347edb3c99 \ No newline at end of file
diff --git a/db/schema_migrations/20220701085523 b/db/schema_migrations/20220701085523
new file mode 100644
index 00000000000..c835395cd6d
--- /dev/null
+++ b/db/schema_migrations/20220701085523
@@ -0,0 +1 @@
+eb28e690d810a6b23454b0b5a2ebc1ff802cdf52f7c41faae7519ea8f018b96a \ No newline at end of file
diff --git a/db/schema_migrations/20220701173859 b/db/schema_migrations/20220701173859
new file mode 100644
index 00000000000..c5f72bfb817
--- /dev/null
+++ b/db/schema_migrations/20220701173859
@@ -0,0 +1 @@
+7c9b8b433553e83bb05208e62541e3d51bcc1083ff33d1146e93b92d954f9cb0 \ No newline at end of file
diff --git a/db/schema_migrations/20220703182234 b/db/schema_migrations/20220703182234
new file mode 100644
index 00000000000..7d977a4ea9f
--- /dev/null
+++ b/db/schema_migrations/20220703182234
@@ -0,0 +1 @@
+cb1457d19b058add7a966690f8d83e4f7e1612f2de3d6d8a87873bb7fb19960b \ No newline at end of file
diff --git a/db/schema_migrations/20220703182254 b/db/schema_migrations/20220703182254
new file mode 100644
index 00000000000..9d454d07600
--- /dev/null
+++ b/db/schema_migrations/20220703182254
@@ -0,0 +1 @@
+aa4e72f0f6596a609a7620c32e2a5def1ce3ee7200cf7513dd3c6569f68db342 \ No newline at end of file
diff --git a/db/schema_migrations/20220703182314 b/db/schema_migrations/20220703182314
new file mode 100644
index 00000000000..94d06e2075e
--- /dev/null
+++ b/db/schema_migrations/20220703182314
@@ -0,0 +1 @@
+e52d274075c18c3b80ed8306138eabd6dd3d1157dd1093f7f769b0a6cfb56791 \ No newline at end of file
diff --git a/db/schema_migrations/20220704034050 b/db/schema_migrations/20220704034050
new file mode 100644
index 00000000000..4ddb8267bf5
--- /dev/null
+++ b/db/schema_migrations/20220704034050
@@ -0,0 +1 @@
+3c2e9dfb0bbd31f01a9f1b3bc7d5e1865b0ae0c94dcfd6e900890677ca276e6c \ No newline at end of file
diff --git a/db/schema_migrations/20220704034105 b/db/schema_migrations/20220704034105
new file mode 100644
index 00000000000..5d08da1b417
--- /dev/null
+++ b/db/schema_migrations/20220704034105
@@ -0,0 +1 @@
+45347ab01c723358a736268c40f04efd7f4ce4be0570072f3740acdc73b6a203 \ No newline at end of file
diff --git a/db/schema_migrations/20220704044408 b/db/schema_migrations/20220704044408
new file mode 100644
index 00000000000..083554d2ffd
--- /dev/null
+++ b/db/schema_migrations/20220704044408
@@ -0,0 +1 @@
+4fd3bd4f3f3fd521b5491c38636c4c6e73470367b7510ebe517e7557c6b341ff \ No newline at end of file
diff --git a/db/schema_migrations/20220704045440 b/db/schema_migrations/20220704045440
new file mode 100644
index 00000000000..3d8be03c87f
--- /dev/null
+++ b/db/schema_migrations/20220704045440
@@ -0,0 +1 @@
+0494aa671826be96811e2985560c70b0ba4bce4272ca7d94222eff6761d305ed \ No newline at end of file
diff --git a/db/schema_migrations/20220705114635 b/db/schema_migrations/20220705114635
new file mode 100644
index 00000000000..1ab54b47282
--- /dev/null
+++ b/db/schema_migrations/20220705114635
@@ -0,0 +1 @@
+b9d37f6b3f59c4d2a08533fd1e2dc91403081fdf5691c86a1874079cb7937588 \ No newline at end of file
diff --git a/db/schema_migrations/20220705145349 b/db/schema_migrations/20220705145349
new file mode 100644
index 00000000000..6c309d401db
--- /dev/null
+++ b/db/schema_migrations/20220705145349
@@ -0,0 +1 @@
+7f5288a47ce5d548bf47fbcd107e31f5448ec1d730ce5b13a760c155c50b44fb \ No newline at end of file
diff --git a/db/schema_migrations/20220705180843 b/db/schema_migrations/20220705180843
new file mode 100644
index 00000000000..4e39726e61e
--- /dev/null
+++ b/db/schema_migrations/20220705180843
@@ -0,0 +1 @@
+755e06f8bd3a0a28820f6ec2ee52a39a7920eb9d8ae0315a8a179139c78645d9 \ No newline at end of file
diff --git a/db/schema_migrations/20220706065245 b/db/schema_migrations/20220706065245
new file mode 100644
index 00000000000..46abcb3e7c8
--- /dev/null
+++ b/db/schema_migrations/20220706065245
@@ -0,0 +1 @@
+3583de8dc55a1e9835b64542bb11a94084d34c2409f63cd7e402bd3c5c0009ef \ No newline at end of file
diff --git a/db/schema_migrations/20220706065611 b/db/schema_migrations/20220706065611
new file mode 100644
index 00000000000..24b6523f24f
--- /dev/null
+++ b/db/schema_migrations/20220706065611
@@ -0,0 +1 @@
+eab26142f1314caa9ff6a6f07b6c787d276653d9bf6702bce9355c0e9605a909 \ No newline at end of file
diff --git a/db/schema_migrations/20220706070804 b/db/schema_migrations/20220706070804
new file mode 100644
index 00000000000..08943e8fe00
--- /dev/null
+++ b/db/schema_migrations/20220706070804
@@ -0,0 +1 @@
+7bf55a7614afcb210b22df1ea38cf16fde9510bbe66d9b19f0fb63d668ac4e72 \ No newline at end of file
diff --git a/db/schema_migrations/20220706071304 b/db/schema_migrations/20220706071304
new file mode 100644
index 00000000000..e2e0ba301e5
--- /dev/null
+++ b/db/schema_migrations/20220706071304
@@ -0,0 +1 @@
+ed72bfafe1c04826ce57b9068c537df563bc193f231f4f223348b084c68a8bde \ No newline at end of file
diff --git a/db/schema_migrations/20220706115138 b/db/schema_migrations/20220706115138
new file mode 100644
index 00000000000..0c139470b47
--- /dev/null
+++ b/db/schema_migrations/20220706115138
@@ -0,0 +1 @@
+c0c4a18cb711e0288bf1d385e06151e0e329dc40d4e9cd51e6437fe73d6bfc21 \ No newline at end of file
diff --git a/db/schema_migrations/20220706122719 b/db/schema_migrations/20220706122719
new file mode 100644
index 00000000000..6341be22a00
--- /dev/null
+++ b/db/schema_migrations/20220706122719
@@ -0,0 +1 @@
+b80d15b0176f0372a1553920ba72c43a2f9831f786358397f820a83b1b840cdc \ No newline at end of file
diff --git a/db/schema_migrations/20220706132238 b/db/schema_migrations/20220706132238
new file mode 100644
index 00000000000..32ae901bfb9
--- /dev/null
+++ b/db/schema_migrations/20220706132238
@@ -0,0 +1 @@
+ea387b35bfb7f15a036aca9413b8fd15ede6b16048fa9e9be5a62b9e21ca362d \ No newline at end of file
diff --git a/db/schema_migrations/20220706191627 b/db/schema_migrations/20220706191627
new file mode 100644
index 00000000000..3b66876ff9a
--- /dev/null
+++ b/db/schema_migrations/20220706191627
@@ -0,0 +1 @@
+28aecb58b63bdc910c3a37b5ff0f99d2feb42dcb49ba894bb017115f2b33f531 \ No newline at end of file
diff --git a/db/schema_migrations/20220707075300 b/db/schema_migrations/20220707075300
new file mode 100644
index 00000000000..1374cbd2036
--- /dev/null
+++ b/db/schema_migrations/20220707075300
@@ -0,0 +1 @@
+f796c973e95ad95fb95e72214ba664382757c5127bdd19b00934bf99b394fde3 \ No newline at end of file
diff --git a/db/schema_migrations/20220708100508 b/db/schema_migrations/20220708100508
new file mode 100644
index 00000000000..73de59b95ab
--- /dev/null
+++ b/db/schema_migrations/20220708100508
@@ -0,0 +1 @@
+041c729542e7bf418ee805d6c1878aa62fd274a97583cc11dfebae9e7bdac896 \ No newline at end of file
diff --git a/db/schema_migrations/20220708100532 b/db/schema_migrations/20220708100532
new file mode 100644
index 00000000000..8f4f3876515
--- /dev/null
+++ b/db/schema_migrations/20220708100532
@@ -0,0 +1 @@
+28cf54895ada6e5d501bd5dcb9e7e161fd44ce51494b984dde7beadd0895c952 \ No newline at end of file
diff --git a/db/schema_migrations/20220708132701 b/db/schema_migrations/20220708132701
new file mode 100644
index 00000000000..01fdd550b06
--- /dev/null
+++ b/db/schema_migrations/20220708132701
@@ -0,0 +1 @@
+a91b2e3c9f89c6b7a0e4330fe617b22ee3b22100fc868ef13b5c656580175816 \ No newline at end of file
diff --git a/db/schema_migrations/20220708142744 b/db/schema_migrations/20220708142744
new file mode 100644
index 00000000000..980c0b43c52
--- /dev/null
+++ b/db/schema_migrations/20220708142744
@@ -0,0 +1 @@
+b93ab540270a4b743c12fe5d1d6963cfeb29ee3b0a1e4e012cd4b3d1b3a08cde \ No newline at end of file
diff --git a/db/schema_migrations/20220708142803 b/db/schema_migrations/20220708142803
new file mode 100644
index 00000000000..4eb59905dd0
--- /dev/null
+++ b/db/schema_migrations/20220708142803
@@ -0,0 +1 @@
+7929540cf382f282f75f2f9c9dd6196d426ed1edb1f6744da1f0a627e7fb0cfc \ No newline at end of file
diff --git a/db/schema_migrations/20220708150315 b/db/schema_migrations/20220708150315
new file mode 100644
index 00000000000..10b3f069ffa
--- /dev/null
+++ b/db/schema_migrations/20220708150315
@@ -0,0 +1 @@
+925069c0dd5058e38da16496b140ea4139318a40c8207fcd7116d76562b0e959 \ No newline at end of file
diff --git a/db/schema_migrations/20220708150335 b/db/schema_migrations/20220708150335
new file mode 100644
index 00000000000..ee0bc1a666e
--- /dev/null
+++ b/db/schema_migrations/20220708150335
@@ -0,0 +1 @@
+9a41920cb988c3c5459e33c143f4bb97d8d6cf4fc691aa87f3fd7ef9f2a726f8 \ No newline at end of file
diff --git a/db/schema_migrations/20220708184822 b/db/schema_migrations/20220708184822
new file mode 100644
index 00000000000..095ed891609
--- /dev/null
+++ b/db/schema_migrations/20220708184822
@@ -0,0 +1 @@
+80ac782e6e3ee1daec9e18f88a823d7cd43152a36f53c9d50758ba88a5711642 \ No newline at end of file
diff --git a/db/schema_migrations/20220712025712 b/db/schema_migrations/20220712025712
new file mode 100644
index 00000000000..68e8a510feb
--- /dev/null
+++ b/db/schema_migrations/20220712025712
@@ -0,0 +1 @@
+f0bba8e67c97d6dea461d8626a07820c52e20ab6578ad40e8873ad0031a2ce62 \ No newline at end of file
diff --git a/db/schema_migrations/20220712031923 b/db/schema_migrations/20220712031923
new file mode 100644
index 00000000000..1cb2b63faa8
--- /dev/null
+++ b/db/schema_migrations/20220712031923
@@ -0,0 +1 @@
+db2c19f15a03a6222627875d8bd27368de43fb6485961f866de61b3017796e28 \ No newline at end of file
diff --git a/db/schema_migrations/20220712094945 b/db/schema_migrations/20220712094945
new file mode 100644
index 00000000000..1c03490d054
--- /dev/null
+++ b/db/schema_migrations/20220712094945
@@ -0,0 +1 @@
+ef638a5168e2d98621e1c80216bc75500b4de39c40121a7044f039c28448fe82 \ No newline at end of file
diff --git a/db/schema_migrations/20220713133515 b/db/schema_migrations/20220713133515
new file mode 100644
index 00000000000..8c3b76a5d63
--- /dev/null
+++ b/db/schema_migrations/20220713133515
@@ -0,0 +1 @@
+4c0f48149987c821c8666df7a1d9e9780146d356ffb9539572d5a3c77038e237 \ No newline at end of file
diff --git a/db/schema_migrations/20220713175658 b/db/schema_migrations/20220713175658
new file mode 100644
index 00000000000..9b086972336
--- /dev/null
+++ b/db/schema_migrations/20220713175658
@@ -0,0 +1 @@
+6bbaa8006a848a65e866c7836d0b0e28e3c303d28b329f5e12f978dd895e868f \ No newline at end of file
diff --git a/db/schema_migrations/20220713175737 b/db/schema_migrations/20220713175737
new file mode 100644
index 00000000000..88f4550ced0
--- /dev/null
+++ b/db/schema_migrations/20220713175737
@@ -0,0 +1 @@
+95a535d8f97ec96df918547aff7947acacbdf37fd0d3656878c9c60d80f3fd02 \ No newline at end of file
diff --git a/db/schema_migrations/20220713175812 b/db/schema_migrations/20220713175812
new file mode 100644
index 00000000000..13e0279a11e
--- /dev/null
+++ b/db/schema_migrations/20220713175812
@@ -0,0 +1 @@
+41e42a51a0c5b3af8d94edc25e9421a754d6fc517f343bd718b16fd6bfc383f3 \ No newline at end of file
diff --git a/db/schema_migrations/20220714105122 b/db/schema_migrations/20220714105122
new file mode 100644
index 00000000000..f3ec5c17af7
--- /dev/null
+++ b/db/schema_migrations/20220714105122
@@ -0,0 +1 @@
+c452f7dc9a76b6daa7ced88f2ed93332a84bfcb94a7e94f31149e43b888e210f \ No newline at end of file
diff --git a/db/schema_migrations/20220714122311 b/db/schema_migrations/20220714122311
new file mode 100644
index 00000000000..bb7bb022791
--- /dev/null
+++ b/db/schema_migrations/20220714122311
@@ -0,0 +1 @@
+6e59a39a5d843b5df3b33edb54c51f08062bff7ab1676b9326bb5aa8da159027 \ No newline at end of file
diff --git a/db/schema_migrations/20220714122418 b/db/schema_migrations/20220714122418
new file mode 100644
index 00000000000..a7eeeba0255
--- /dev/null
+++ b/db/schema_migrations/20220714122418
@@ -0,0 +1 @@
+efdfa1c6ffb1b5e4de42bbfd87820eb5d1b87883c8b93cb4cb4101ba928f56dd \ No newline at end of file
diff --git a/db/schema_migrations/20220714142424 b/db/schema_migrations/20220714142424
new file mode 100644
index 00000000000..1a7f5e7dcaf
--- /dev/null
+++ b/db/schema_migrations/20220714142424
@@ -0,0 +1 @@
+42387b8524845aeb76d8b6584ffa480819f682538ca9578492eed53baa49bc09 \ No newline at end of file
diff --git a/db/schema_migrations/20220715054506 b/db/schema_migrations/20220715054506
new file mode 100644
index 00000000000..ad01657f92a
--- /dev/null
+++ b/db/schema_migrations/20220715054506
@@ -0,0 +1 @@
+ecd71a6f9c90bd19a28edcd054ce2ef826859e051dd44c9fea875a5c32040a12 \ No newline at end of file
diff --git a/db/schema_migrations/20220715160023 b/db/schema_migrations/20220715160023
new file mode 100644
index 00000000000..39a141fb743
--- /dev/null
+++ b/db/schema_migrations/20220715160023
@@ -0,0 +1 @@
+3696ff7ea12600702911895c085a85b49e613bc133a580d895fc53cf1f6912a8 \ No newline at end of file
diff --git a/db/schema_migrations/20220715163254 b/db/schema_migrations/20220715163254
new file mode 100644
index 00000000000..71461af7b68
--- /dev/null
+++ b/db/schema_migrations/20220715163254
@@ -0,0 +1 @@
+ea8182741ce0b30f2de23041d1f6bafaf6e04a7a7d0f50abcd04462683637596 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index e92e77f0f60..cb0d4696931 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -53,6 +53,7 @@ DECLARE
state smallint;
report_type smallint;
resolved_on_default_branch boolean;
+ present_on_default_branch boolean;
BEGIN
IF (NEW.vulnerability_id IS NULL AND (TG_OP = 'INSERT' OR TG_OP = 'UPDATE')) THEN
RETURN NULL;
@@ -63,16 +64,20 @@ BEGIN
END IF;
SELECT
- vulnerabilities.severity, vulnerabilities.state, vulnerabilities.report_type, vulnerabilities.resolved_on_default_branch
+ vulnerabilities.severity, vulnerabilities.state, vulnerabilities.report_type, vulnerabilities.resolved_on_default_branch, vulnerabilities.present_on_default_branch
INTO
- severity, state, report_type, resolved_on_default_branch
+ severity, state, report_type, resolved_on_default_branch, present_on_default_branch
FROM
vulnerabilities
WHERE
vulnerabilities.id = NEW.vulnerability_id;
- INSERT INTO vulnerability_reads (vulnerability_id, project_id, scanner_id, report_type, severity, state, resolved_on_default_branch, uuid, location_image, cluster_agent_id)
- VALUES (NEW.vulnerability_id, NEW.project_id, NEW.scanner_id, report_type, severity, state, resolved_on_default_branch, NEW.uuid::uuid, NEW.location->>'image', NEW.location->'kubernetes_resource'->>'agent_id')
+ IF present_on_default_branch IS NOT true THEN
+ RETURN NULL;
+ END IF;
+
+ INSERT INTO vulnerability_reads (vulnerability_id, project_id, scanner_id, report_type, severity, state, resolved_on_default_branch, uuid, location_image, cluster_agent_id, casted_cluster_agent_id)
+ VALUES (NEW.vulnerability_id, NEW.project_id, NEW.scanner_id, report_type, severity, state, resolved_on_default_branch, NEW.uuid::uuid, NEW.location->>'image', NEW.location->'kubernetes_resource'->>'agent_id', CAST(NEW.location->'kubernetes_resource'->>'agent_id' AS bigint))
ON CONFLICT(vulnerability_id) DO NOTHING;
RETURN NULL;
END
@@ -89,6 +94,33 @@ RETURN NULL;
END
$$;
+CREATE FUNCTION insert_vulnerability_reads_from_vulnerability() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+DECLARE
+ scanner_id bigint;
+ uuid uuid;
+ location_image text;
+ cluster_agent_id text;
+ casted_cluster_agent_id bigint;
+BEGIN
+ SELECT
+ v_o.scanner_id, v_o.uuid, v_o.location->>'image', v_o.location->'kubernetes_resource'->>'agent_id', CAST(v_o.location->'kubernetes_resource'->>'agent_id' AS bigint)
+ INTO
+ scanner_id, uuid, location_image, cluster_agent_id, casted_cluster_agent_id
+ FROM
+ vulnerability_occurrences v_o
+ WHERE
+ v_o.vulnerability_id = NEW.id
+ LIMIT 1;
+
+ INSERT INTO vulnerability_reads (vulnerability_id, project_id, scanner_id, report_type, severity, state, resolved_on_default_branch, uuid, location_image, cluster_agent_id, casted_cluster_agent_id)
+ VALUES (NEW.id, NEW.project_id, scanner_id, NEW.report_type, NEW.severity, NEW.state, NEW.resolved_on_default_branch, uuid::uuid, location_image, cluster_agent_id, casted_cluster_agent_id)
+ ON CONFLICT(vulnerability_id) DO NOTHING;
+ RETURN NULL;
+END
+$$;
+
CREATE FUNCTION next_traversal_ids_sibling(traversal_ids integer[]) RETURNS integer[]
LANGUAGE plpgsql IMMUTABLE STRICT
AS $$
@@ -206,6 +238,7 @@ UPDATE
vulnerability_reads
SET
location_image = NEW.location->>'image',
+ casted_cluster_agent_id = CAST(NEW.location->'kubernetes_resource'->>'agent_id' AS bigint),
cluster_agent_id = NEW.location->'kubernetes_resource'->>'agent_id'
WHERE
vulnerability_id = NEW.vulnerability_id;
@@ -11321,11 +11354,25 @@ CREATE TABLE application_settings (
container_registry_pre_import_tags_rate numeric(6,2) DEFAULT 0.5 NOT NULL,
license_usage_data_exported boolean DEFAULT false NOT NULL,
phone_verification_code_enabled boolean DEFAULT false NOT NULL,
+ max_number_of_repository_downloads smallint DEFAULT 0 NOT NULL,
+ max_number_of_repository_downloads_within_time_period integer DEFAULT 0 NOT NULL,
+ feishu_integration_enabled boolean DEFAULT false NOT NULL,
+ encrypted_feishu_app_key bytea,
+ encrypted_feishu_app_key_iv bytea,
+ encrypted_feishu_app_secret bytea,
+ encrypted_feishu_app_secret_iv bytea,
+ error_tracking_enabled boolean DEFAULT false NOT NULL,
+ error_tracking_api_url text,
+ git_rate_limit_users_allowlist text[] DEFAULT '{}'::text[] NOT NULL,
+ error_tracking_access_token_encrypted text,
+ package_registry_cleanup_policies_worker_capacity integer DEFAULT 2 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_container_registry_pre_import_tags_rate_positive CHECK ((container_registry_pre_import_tags_rate >= (0)::numeric)),
CONSTRAINT app_settings_dep_proxy_ttl_policies_worker_capacity_positive CHECK ((dependency_proxy_ttl_group_policy_worker_capacity >= 0)),
CONSTRAINT app_settings_ext_pipeline_validation_service_url_text_limit CHECK ((char_length(external_pipeline_validation_service_url) <= 255)),
+ CONSTRAINT app_settings_git_rate_limit_users_allowlist_max_usernames CHECK ((cardinality(git_rate_limit_users_allowlist) <= 100)),
CONSTRAINT app_settings_p_cleanup_package_file_worker_capacity_positive CHECK ((packages_cleanup_package_file_worker_capacity >= 0)),
+ CONSTRAINT app_settings_pkg_registry_cleanup_pol_worker_capacity_gte_zero CHECK ((package_registry_cleanup_policies_worker_capacity >= 0)),
CONSTRAINT app_settings_registry_exp_policies_worker_capacity_positive CHECK ((container_registry_expiration_policies_worker_capacity >= 0)),
CONSTRAINT app_settings_yaml_max_depth_positive CHECK ((max_yaml_depth > 0)),
CONSTRAINT app_settings_yaml_max_size_positive CHECK ((max_yaml_size_bytes > 0)),
@@ -11336,8 +11383,10 @@ CREATE TABLE application_settings (
CONSTRAINT check_3455368420 CHECK ((char_length(database_grafana_api_url) <= 255)),
CONSTRAINT check_3559645ae5 CHECK ((char_length(container_registry_import_target_plan) <= 255)),
CONSTRAINT check_3def0f1829 CHECK ((char_length(sentry_clientside_dsn) <= 255)),
+ CONSTRAINT check_492cc1354d CHECK ((char_length(error_tracking_api_url) <= 255)),
CONSTRAINT check_4f8b811780 CHECK ((char_length(sentry_dsn) <= 255)),
CONSTRAINT check_51700b31b5 CHECK ((char_length(default_branch_name) <= 255)),
+ CONSTRAINT check_5688c70478 CHECK ((char_length(error_tracking_access_token_encrypted) <= 255)),
CONSTRAINT check_57123c9593 CHECK ((char_length(help_page_documentation_base_url) <= 255)),
CONSTRAINT check_5a84c3ffdc CHECK ((char_length(content_validation_endpoint_url) <= 255)),
CONSTRAINT check_5bcba483c4 CHECK ((char_length(sentry_environment) <= 255)),
@@ -11383,6 +11432,16 @@ COMMENT ON COLUMN application_settings.encrypted_dingtalk_app_secret_iv IS 'JiHu
COMMENT ON COLUMN application_settings.phone_verification_code_enabled IS 'JiHu-specific column';
+COMMENT ON COLUMN application_settings.feishu_integration_enabled IS 'JiHu-specific column';
+
+COMMENT ON COLUMN application_settings.encrypted_feishu_app_key IS 'JiHu-specific column';
+
+COMMENT ON COLUMN application_settings.encrypted_feishu_app_key_iv IS 'JiHu-specific column';
+
+COMMENT ON COLUMN application_settings.encrypted_feishu_app_secret IS 'JiHu-specific column';
+
+COMMENT ON COLUMN application_settings.encrypted_feishu_app_secret_iv IS 'JiHu-specific column';
+
CREATE SEQUENCE application_settings_id_seq
START WITH 1
INCREMENT BY 1
@@ -11493,7 +11552,8 @@ CREATE TABLE approval_project_rules (
severity_levels text[] DEFAULT '{}'::text[] NOT NULL,
report_type smallint,
vulnerability_states text[] DEFAULT '{newly_detected}'::text[] NOT NULL,
- orchestration_policy_idx smallint
+ orchestration_policy_idx smallint,
+ applies_to_all_protected_branches boolean DEFAULT false NOT NULL
);
CREATE TABLE approval_project_rules_groups (
@@ -13061,6 +13121,12 @@ CREATE SEQUENCE ci_runner_projects_id_seq
ALTER SEQUENCE ci_runner_projects_id_seq OWNED BY ci_runner_projects.id;
+CREATE TABLE ci_runner_versions (
+ version text NOT NULL,
+ status smallint,
+ CONSTRAINT check_b5a3714594 CHECK ((char_length(version) <= 2048))
+);
+
CREATE TABLE ci_runners (
id integer NOT NULL,
token character varying,
@@ -13120,6 +13186,27 @@ CREATE SEQUENCE ci_running_builds_id_seq
ALTER SEQUENCE ci_running_builds_id_seq OWNED BY ci_running_builds.id;
+CREATE TABLE ci_secure_file_states (
+ verification_started_at timestamp with time zone,
+ verification_retry_at timestamp with time zone,
+ verified_at timestamp with time zone,
+ ci_secure_file_id bigint NOT NULL,
+ verification_state smallint DEFAULT 0 NOT NULL,
+ verification_retry_count smallint,
+ verification_checksum bytea,
+ verification_failure text,
+ CONSTRAINT check_a79e5a9261 CHECK ((char_length(verification_failure) <= 255))
+);
+
+CREATE SEQUENCE ci_secure_file_states_ci_secure_file_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_secure_file_states_ci_secure_file_id_seq OWNED BY ci_secure_file_states.ci_secure_file_id;
+
CREATE TABLE ci_secure_files (
id bigint NOT NULL,
project_id bigint NOT NULL,
@@ -13568,25 +13655,6 @@ CREATE SEQUENCE clusters_applications_crossplane_id_seq
ALTER SEQUENCE clusters_applications_crossplane_id_seq OWNED BY clusters_applications_crossplane.id;
-CREATE TABLE clusters_applications_elastic_stacks (
- id bigint NOT NULL,
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
- cluster_id bigint NOT NULL,
- status integer NOT NULL,
- version character varying(255) NOT NULL,
- status_reason text
-);
-
-CREATE SEQUENCE clusters_applications_elastic_stacks_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE clusters_applications_elastic_stacks_id_seq OWNED BY clusters_applications_elastic_stacks.id;
-
CREATE TABLE clusters_applications_helm (
id integer NOT NULL,
cluster_id integer NOT NULL,
@@ -13728,15 +13796,6 @@ CREATE SEQUENCE clusters_id_seq
ALTER SEQUENCE clusters_id_seq OWNED BY clusters.id;
-CREATE TABLE clusters_integration_elasticstack (
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
- cluster_id bigint NOT NULL,
- enabled boolean DEFAULT false NOT NULL,
- chart_version text,
- CONSTRAINT check_f8d671ce04 CHECK ((char_length(chart_version) <= 10))
-);
-
CREATE TABLE clusters_integration_prometheus (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
@@ -16524,6 +16583,7 @@ CREATE TABLE issues (
blocking_issues_count integer DEFAULT 0 NOT NULL,
upvotes_count integer DEFAULT 0 NOT NULL,
work_item_type_id bigint,
+ namespace_id bigint,
CONSTRAINT check_fba63f706d CHECK ((lock_version IS NOT NULL))
);
@@ -17445,6 +17505,23 @@ CREATE TABLE namespace_aggregation_schedules (
namespace_id integer NOT NULL
);
+CREATE TABLE namespace_bans (
+ id bigint NOT NULL,
+ namespace_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE namespace_bans_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE namespace_bans_id_seq OWNED BY namespace_bans.id;
+
CREATE TABLE namespace_ci_cd_settings (
namespace_id bigint NOT NULL,
allow_stale_runner_pruning boolean DEFAULT false NOT NULL
@@ -17504,6 +17581,10 @@ CREATE TABLE namespace_settings (
project_runner_token_expiration_interval integer,
exclude_from_free_user_cap boolean DEFAULT false NOT NULL,
enabled_git_access_protocol smallint DEFAULT 0 NOT NULL,
+ unique_project_download_limit smallint DEFAULT 0 NOT NULL,
+ unique_project_download_limit_interval_in_seconds integer DEFAULT 0 NOT NULL,
+ project_import_level smallint DEFAULT 50 NOT NULL,
+ include_for_free_user_cap_preview boolean DEFAULT false NOT NULL,
CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255))
);
@@ -17861,7 +17942,8 @@ CREATE TABLE operations_feature_flags (
CREATE TABLE operations_feature_flags_clients (
id bigint NOT NULL,
project_id integer NOT NULL,
- token_encrypted character varying
+ token_encrypted character varying,
+ last_feature_flag_updated_at timestamp with time zone
);
CREATE SEQUENCE operations_feature_flags_clients_id_seq
@@ -18789,7 +18871,9 @@ CREATE TABLE plan_limits (
repository_size bigint DEFAULT 0 NOT NULL,
security_policy_scan_execution_schedules integer DEFAULT 0 NOT NULL,
web_hook_calls_mid integer DEFAULT 0 NOT NULL,
- web_hook_calls_low integer DEFAULT 0 NOT NULL
+ web_hook_calls_low integer DEFAULT 0 NOT NULL,
+ project_ci_variables integer DEFAULT 200 NOT NULL,
+ group_ci_variables integer DEFAULT 200 NOT NULL
);
CREATE SEQUENCE plan_limits_id_seq
@@ -19200,7 +19284,8 @@ CREATE TABLE project_ci_cd_settings (
restrict_user_defined_variables boolean DEFAULT false NOT NULL,
job_token_scope_enabled boolean DEFAULT false NOT NULL,
runner_token_expiration_interval integer,
- separated_caches boolean DEFAULT true NOT NULL
+ separated_caches boolean DEFAULT true NOT NULL,
+ opt_in_jwt boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE project_ci_cd_settings_id_seq
@@ -19348,7 +19433,12 @@ CREATE TABLE project_features (
analytics_access_level integer DEFAULT 20 NOT NULL,
security_and_compliance_access_level integer DEFAULT 10 NOT NULL,
container_registry_access_level integer DEFAULT 0 NOT NULL,
- package_registry_access_level integer DEFAULT 0 NOT NULL
+ package_registry_access_level integer DEFAULT 0 NOT NULL,
+ monitor_access_level integer DEFAULT 20 NOT NULL,
+ infrastructure_access_level integer DEFAULT 20 NOT NULL,
+ feature_flags_access_level integer DEFAULT 20 NOT NULL,
+ environments_access_level integer DEFAULT 20 NOT NULL,
+ releases_access_level integer DEFAULT 20 NOT NULL
);
CREATE SEQUENCE project_features_id_seq
@@ -19458,6 +19548,47 @@ CREATE TABLE project_pages_metadata (
onboarding_complete boolean DEFAULT false NOT NULL
);
+CREATE TABLE project_relation_export_uploads (
+ id bigint NOT NULL,
+ project_relation_export_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ export_file text NOT NULL,
+ CONSTRAINT check_d8ee243e9e CHECK ((char_length(export_file) <= 255))
+);
+
+CREATE SEQUENCE project_relation_export_uploads_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_relation_export_uploads_id_seq OWNED BY project_relation_export_uploads.id;
+
+CREATE TABLE project_relation_exports (
+ id bigint NOT NULL,
+ project_export_job_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status smallint DEFAULT 0 NOT NULL,
+ relation text NOT NULL,
+ jid text,
+ export_error text,
+ CONSTRAINT check_15e644d856 CHECK ((char_length(jid) <= 255)),
+ CONSTRAINT check_4b5880b795 CHECK ((char_length(relation) <= 255)),
+ CONSTRAINT check_dbd1cf73d0 CHECK ((char_length(export_error) <= 300))
+);
+
+CREATE SEQUENCE project_relation_exports_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_relation_exports_id_seq OWNED BY project_relation_exports.id;
+
CREATE TABLE project_repositories (
id bigint NOT NULL,
shard_id integer NOT NULL,
@@ -19612,23 +19743,6 @@ CREATE SEQUENCE project_topics_id_seq
ALTER SEQUENCE project_topics_id_seq OWNED BY project_topics.id;
-CREATE TABLE project_tracing_settings (
- id bigint NOT NULL,
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
- project_id integer NOT NULL,
- external_url character varying NOT NULL
-);
-
-CREATE SEQUENCE project_tracing_settings_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE project_tracing_settings_id_seq OWNED BY project_tracing_settings.id;
-
CREATE TABLE projects (
id integer NOT NULL,
name character varying,
@@ -20176,19 +20290,20 @@ ALTER SEQUENCE required_code_owners_sections_id_seq OWNED BY required_code_owner
CREATE TABLE requirements (
id bigint NOT NULL,
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
+ created_at timestamp with time zone,
+ updated_at timestamp with time zone,
project_id integer NOT NULL,
author_id integer,
iid integer NOT NULL,
cached_markdown_version integer,
- state smallint DEFAULT 1 NOT NULL,
- title character varying(255) NOT NULL,
+ state smallint DEFAULT 1,
+ title character varying(255),
title_html text,
description text,
description_html text,
issue_id bigint,
- CONSTRAINT check_785ae25b9d CHECK ((char_length(description) <= 10000))
+ CONSTRAINT check_785ae25b9d CHECK ((char_length(description) <= 10000)),
+ CONSTRAINT check_requirement_issue_not_null CHECK ((issue_id IS NOT NULL))
);
CREATE SEQUENCE requirements_id_seq
@@ -20347,7 +20462,8 @@ CREATE TABLE routes (
created_at timestamp without time zone,
updated_at timestamp without time zone,
name character varying,
- namespace_id bigint
+ namespace_id bigint,
+ CONSTRAINT check_af84c6c93f CHECK ((namespace_id IS NOT NULL))
);
CREATE SEQUENCE routes_id_seq
@@ -20420,6 +20536,80 @@ CREATE SEQUENCE saved_replies_id_seq
ALTER SEQUENCE saved_replies_id_seq OWNED BY saved_replies.id;
+CREATE TABLE sbom_component_versions (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ component_id bigint NOT NULL,
+ version text NOT NULL,
+ CONSTRAINT check_e71cad08d3 CHECK ((char_length(version) <= 255))
+);
+
+CREATE SEQUENCE sbom_component_versions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE sbom_component_versions_id_seq OWNED BY sbom_component_versions.id;
+
+CREATE TABLE sbom_components (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ component_type smallint NOT NULL,
+ name text NOT NULL,
+ CONSTRAINT check_91a8f6ad53 CHECK ((char_length(name) <= 255))
+);
+
+CREATE SEQUENCE sbom_components_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE sbom_components_id_seq OWNED BY sbom_components.id;
+
+CREATE TABLE sbom_occurrences (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ component_version_id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ pipeline_id bigint,
+ source_id bigint,
+ commit_sha bytea NOT NULL
+);
+
+CREATE SEQUENCE sbom_occurrences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE sbom_occurrences_id_seq OWNED BY sbom_occurrences.id;
+
+CREATE TABLE sbom_sources (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ source_type smallint NOT NULL,
+ source jsonb DEFAULT '{}'::jsonb NOT NULL,
+ fingerprint bytea NOT NULL
+);
+
+CREATE SEQUENCE sbom_sources_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE sbom_sources_id_seq OWNED BY sbom_sources.id;
+
CREATE TABLE schema_migrations (
version character varying NOT NULL,
finished_at timestamp with time zone DEFAULT now()
@@ -20471,8 +20661,10 @@ CREATE TABLE security_findings (
deduplicated boolean DEFAULT false NOT NULL,
uuid uuid,
overridden_uuid uuid,
+ partition_number integer DEFAULT 1 NOT NULL,
CONSTRAINT check_6c2851a8c9 CHECK ((uuid IS NOT NULL)),
- CONSTRAINT check_b9508c6df8 CHECK ((char_length(project_fingerprint) <= 40))
+ CONSTRAINT check_b9508c6df8 CHECK ((char_length(project_fingerprint) <= 40)),
+ CONSTRAINT check_partition_number CHECK ((partition_number = 1))
);
CREATE SEQUENCE security_findings_id_seq
@@ -20540,7 +20732,8 @@ CREATE TABLE security_scans (
project_id bigint,
pipeline_id bigint,
latest boolean DEFAULT true NOT NULL,
- status smallint DEFAULT 0 NOT NULL
+ status smallint DEFAULT 0 NOT NULL,
+ findings_partition_number integer DEFAULT 1 NOT NULL
);
CREATE SEQUENCE security_scans_id_seq
@@ -21508,6 +21701,23 @@ CREATE TABLE user_interacted_projects (
project_id integer NOT NULL
);
+CREATE TABLE user_namespace_callouts (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ namespace_id bigint NOT NULL,
+ dismissed_at timestamp with time zone,
+ feature_name smallint NOT NULL
+);
+
+CREATE SEQUENCE user_namespace_callouts_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_namespace_callouts_id_seq OWNED BY user_namespace_callouts.id;
+
CREATE TABLE user_permission_export_uploads (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -22045,6 +22255,23 @@ CREATE SEQUENCE vulnerability_issue_links_id_seq
ALTER SEQUENCE vulnerability_issue_links_id_seq OWNED BY vulnerability_issue_links.id;
+CREATE TABLE vulnerability_merge_request_links (
+ id bigint NOT NULL,
+ vulnerability_id bigint NOT NULL,
+ merge_request_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE vulnerability_merge_request_links_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_merge_request_links_id_seq OWNED BY vulnerability_merge_request_links.id;
+
CREATE TABLE vulnerability_occurrence_identifiers (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -22132,6 +22359,7 @@ CREATE TABLE vulnerability_reads (
uuid uuid NOT NULL,
location_image text,
cluster_agent_id text,
+ casted_cluster_agent_id bigint,
CONSTRAINT check_380451bdbe CHECK ((char_length(location_image) <= 2048)),
CONSTRAINT check_a105eb825a CHECK ((char_length(cluster_agent_id) <= 10))
);
@@ -22315,7 +22543,7 @@ CREATE TABLE webauthn_registrations (
public_key text NOT NULL,
u2f_registration_id integer,
CONSTRAINT check_2f02e74321 CHECK ((char_length(name) <= 255)),
- CONSTRAINT check_e54008d9ce CHECK ((char_length(credential_xid) <= 340))
+ CONSTRAINT check_f5ab2b551a CHECK ((char_length(credential_xid) <= 1364))
);
CREATE SEQUENCE webauthn_registrations_id_seq
@@ -22707,6 +22935,8 @@ ALTER TABLE ONLY ci_runners ALTER COLUMN id SET DEFAULT nextval('ci_runners_id_s
ALTER TABLE ONLY ci_running_builds ALTER COLUMN id SET DEFAULT nextval('ci_running_builds_id_seq'::regclass);
+ALTER TABLE ONLY ci_secure_file_states ALTER COLUMN ci_secure_file_id SET DEFAULT nextval('ci_secure_file_states_ci_secure_file_id_seq'::regclass);
+
ALTER TABLE ONLY ci_secure_files ALTER COLUMN id SET DEFAULT nextval('ci_secure_files_id_seq'::regclass);
ALTER TABLE ONLY ci_sources_pipelines ALTER COLUMN id SET DEFAULT nextval('ci_sources_pipelines_id_seq'::regclass);
@@ -22751,8 +22981,6 @@ ALTER TABLE ONLY clusters_applications_cilium ALTER COLUMN id SET DEFAULT nextva
ALTER TABLE ONLY clusters_applications_crossplane ALTER COLUMN id SET DEFAULT nextval('clusters_applications_crossplane_id_seq'::regclass);
-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_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);
@@ -23089,6 +23317,8 @@ ALTER TABLE ONLY milestones ALTER COLUMN id SET DEFAULT nextval('milestones_id_s
ALTER TABLE ONLY namespace_admin_notes ALTER COLUMN id SET DEFAULT nextval('namespace_admin_notes_id_seq'::regclass);
+ALTER TABLE ONLY namespace_bans ALTER COLUMN id SET DEFAULT nextval('namespace_bans_id_seq'::regclass);
+
ALTER TABLE ONLY namespace_statistics ALTER COLUMN id SET DEFAULT nextval('namespace_statistics_id_seq'::regclass);
ALTER TABLE ONLY namespaces ALTER COLUMN id SET DEFAULT nextval('namespaces_id_seq'::regclass);
@@ -23231,6 +23461,10 @@ ALTER TABLE ONLY project_incident_management_settings ALTER COLUMN project_id SE
ALTER TABLE ONLY project_mirror_data ALTER COLUMN id SET DEFAULT nextval('project_mirror_data_id_seq'::regclass);
+ALTER TABLE ONLY project_relation_export_uploads ALTER COLUMN id SET DEFAULT nextval('project_relation_export_uploads_id_seq'::regclass);
+
+ALTER TABLE ONLY project_relation_exports ALTER COLUMN id SET DEFAULT nextval('project_relation_exports_id_seq'::regclass);
+
ALTER TABLE ONLY project_repositories ALTER COLUMN id SET DEFAULT nextval('project_repositories_id_seq'::regclass);
ALTER TABLE ONLY project_repository_states ALTER COLUMN id SET DEFAULT nextval('project_repository_states_id_seq'::regclass);
@@ -23243,8 +23477,6 @@ ALTER TABLE ONLY project_statistics ALTER COLUMN id SET DEFAULT nextval('project
ALTER TABLE ONLY project_topics ALTER COLUMN id SET DEFAULT nextval('project_topics_id_seq'::regclass);
-ALTER TABLE ONLY project_tracing_settings ALTER COLUMN id SET DEFAULT nextval('project_tracing_settings_id_seq'::regclass);
-
ALTER TABLE ONLY projects ALTER COLUMN id SET DEFAULT nextval('projects_id_seq'::regclass);
ALTER TABLE ONLY projects_sync_events ALTER COLUMN id SET DEFAULT nextval('projects_sync_events_id_seq'::regclass);
@@ -23313,6 +23545,14 @@ ALTER TABLE ONLY saml_providers ALTER COLUMN id SET DEFAULT nextval('saml_provid
ALTER TABLE ONLY saved_replies ALTER COLUMN id SET DEFAULT nextval('saved_replies_id_seq'::regclass);
+ALTER TABLE ONLY sbom_component_versions ALTER COLUMN id SET DEFAULT nextval('sbom_component_versions_id_seq'::regclass);
+
+ALTER TABLE ONLY sbom_components ALTER COLUMN id SET DEFAULT nextval('sbom_components_id_seq'::regclass);
+
+ALTER TABLE ONLY sbom_occurrences ALTER COLUMN id SET DEFAULT nextval('sbom_occurrences_id_seq'::regclass);
+
+ALTER TABLE ONLY sbom_sources ALTER COLUMN id SET DEFAULT nextval('sbom_sources_id_seq'::regclass);
+
ALTER TABLE ONLY scim_identities ALTER COLUMN id SET DEFAULT nextval('scim_identities_id_seq'::regclass);
ALTER TABLE ONLY scim_oauth_access_tokens ALTER COLUMN id SET DEFAULT nextval('scim_oauth_access_tokens_id_seq'::regclass);
@@ -23411,6 +23651,8 @@ ALTER TABLE ONLY user_details ALTER COLUMN user_id SET DEFAULT nextval('user_det
ALTER TABLE ONLY user_group_callouts ALTER COLUMN id SET DEFAULT nextval('user_group_callouts_id_seq'::regclass);
+ALTER TABLE ONLY user_namespace_callouts ALTER COLUMN id SET DEFAULT nextval('user_namespace_callouts_id_seq'::regclass);
+
ALTER TABLE ONLY user_permission_export_uploads ALTER COLUMN id SET DEFAULT nextval('user_permission_export_uploads_id_seq'::regclass);
ALTER TABLE ONLY user_preferences ALTER COLUMN id SET DEFAULT nextval('user_preferences_id_seq'::regclass);
@@ -23451,6 +23693,8 @@ ALTER TABLE ONLY vulnerability_identifiers ALTER COLUMN id SET DEFAULT nextval('
ALTER TABLE ONLY vulnerability_issue_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_issue_links_id_seq'::regclass);
+ALTER TABLE ONLY vulnerability_merge_request_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_merge_request_links_id_seq'::regclass);
+
ALTER TABLE ONLY vulnerability_occurrence_identifiers ALTER COLUMN id SET DEFAULT nextval('vulnerability_occurrence_identifiers_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_occurrence_pipelines ALTER COLUMN id SET DEFAULT nextval('vulnerability_occurrence_pipelines_id_seq'::regclass);
@@ -24300,9 +24544,6 @@ ALTER TABLE ONLY chat_teams
ALTER TABLE vulnerability_scanners
ADD CONSTRAINT check_37608c9db5 CHECK ((char_length(vendor) <= 255)) NOT VALID;
-ALTER TABLE routes
- ADD CONSTRAINT check_af84c6c93f CHECK ((namespace_id IS NOT NULL)) NOT VALID;
-
ALTER TABLE sprints
ADD CONSTRAINT check_ccd8a1eae0 CHECK ((start_date IS NOT NULL)) NOT VALID;
@@ -24315,9 +24556,6 @@ ALTER TABLE sprints
ALTER TABLE projects
ADD CONSTRAINT check_fa75869cb1 CHECK ((project_namespace_id IS NOT NULL)) NOT VALID;
-ALTER TABLE requirements
- ADD CONSTRAINT check_requirement_issue_not_null CHECK ((issue_id IS NOT NULL)) NOT VALID;
-
ALTER TABLE ONLY ci_build_needs
ADD CONSTRAINT ci_build_needs_pkey PRIMARY KEY (id);
@@ -24429,12 +24667,18 @@ ALTER TABLE ONLY ci_runner_namespaces
ALTER TABLE ONLY ci_runner_projects
ADD CONSTRAINT ci_runner_projects_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_runner_versions
+ ADD CONSTRAINT ci_runner_versions_pkey PRIMARY KEY (version);
+
ALTER TABLE ONLY ci_runners
ADD CONSTRAINT ci_runners_pkey PRIMARY KEY (id);
ALTER TABLE ONLY ci_running_builds
ADD CONSTRAINT ci_running_builds_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_secure_file_states
+ ADD CONSTRAINT ci_secure_file_states_pkey PRIMARY KEY (ci_secure_file_id);
+
ALTER TABLE ONLY ci_secure_files
ADD CONSTRAINT ci_secure_files_pkey PRIMARY KEY (id);
@@ -24498,9 +24742,6 @@ ALTER TABLE ONLY clusters_applications_cilium
ALTER TABLE ONLY clusters_applications_crossplane
ADD CONSTRAINT clusters_applications_crossplane_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY clusters_applications_elastic_stacks
- ADD CONSTRAINT clusters_applications_elastic_stacks_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY clusters_applications_helm
ADD CONSTRAINT clusters_applications_helm_pkey PRIMARY KEY (id);
@@ -24519,9 +24760,6 @@ ALTER TABLE ONLY clusters_applications_prometheus
ALTER TABLE ONLY clusters_applications_runners
ADD CONSTRAINT clusters_applications_runners_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY clusters_integration_elasticstack
- ADD CONSTRAINT clusters_integration_elasticstack_pkey PRIMARY KEY (cluster_id);
-
ALTER TABLE ONLY clusters_integration_prometheus
ADD CONSTRAINT clusters_integration_prometheus_pkey PRIMARY KEY (cluster_id);
@@ -25089,6 +25327,9 @@ ALTER TABLE ONLY namespace_admin_notes
ALTER TABLE ONLY namespace_aggregation_schedules
ADD CONSTRAINT namespace_aggregation_schedules_pkey PRIMARY KEY (namespace_id);
+ALTER TABLE ONLY namespace_bans
+ ADD CONSTRAINT namespace_bans_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY namespace_ci_cd_settings
ADD CONSTRAINT namespace_ci_cd_settings_pkey PRIMARY KEY (namespace_id);
@@ -25362,6 +25603,12 @@ ALTER TABLE ONLY project_mirror_data
ALTER TABLE ONLY project_pages_metadata
ADD CONSTRAINT project_pages_metadata_pkey PRIMARY KEY (project_id);
+ALTER TABLE ONLY project_relation_export_uploads
+ ADD CONSTRAINT project_relation_export_uploads_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_relation_exports
+ ADD CONSTRAINT project_relation_exports_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY project_repositories
ADD CONSTRAINT project_repositories_pkey PRIMARY KEY (id);
@@ -25383,9 +25630,6 @@ ALTER TABLE ONLY project_statistics
ALTER TABLE ONLY project_topics
ADD CONSTRAINT project_topics_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY project_tracing_settings
- ADD CONSTRAINT project_tracing_settings_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY projects
ADD CONSTRAINT projects_pkey PRIMARY KEY (id);
@@ -25497,6 +25741,18 @@ ALTER TABLE ONLY saml_providers
ALTER TABLE ONLY saved_replies
ADD CONSTRAINT saved_replies_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY sbom_component_versions
+ ADD CONSTRAINT sbom_component_versions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY sbom_components
+ ADD CONSTRAINT sbom_components_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY sbom_occurrences
+ ADD CONSTRAINT sbom_occurrences_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY sbom_sources
+ ADD CONSTRAINT sbom_sources_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY schema_migrations
ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
@@ -25674,6 +25930,9 @@ ALTER TABLE ONLY user_highest_roles
ALTER TABLE ONLY user_interacted_projects
ADD CONSTRAINT user_interacted_projects_pkey PRIMARY KEY (project_id, user_id);
+ALTER TABLE ONLY user_namespace_callouts
+ ADD CONSTRAINT user_namespace_callouts_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY user_permission_export_uploads
ADD CONSTRAINT user_permission_export_uploads_pkey PRIMARY KEY (id);
@@ -25740,6 +25999,9 @@ ALTER TABLE ONLY vulnerability_identifiers
ALTER TABLE ONLY vulnerability_issue_links
ADD CONSTRAINT vulnerability_issue_links_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY vulnerability_merge_request_links
+ ADD CONSTRAINT vulnerability_merge_request_links_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY vulnerability_occurrence_identifiers
ADD CONSTRAINT vulnerability_occurrence_identifiers_pkey PRIMARY KEY (id);
@@ -26817,6 +27079,8 @@ CREATE INDEX idx_eaprpb_external_approval_rule_id ON external_approval_rules_pro
CREATE INDEX idx_elastic_reindexing_slices_on_elastic_reindexing_subtask_id ON elastic_reindexing_slices USING btree (elastic_reindexing_subtask_id);
+CREATE INDEX idx_enabled_pkgs_cleanup_policies_on_next_run_at_project_id ON packages_cleanup_policies USING btree (next_run_at, project_id) WHERE (keep_n_duplicated_package_files <> 'all'::text);
+
CREATE UNIQUE INDEX idx_environment_merge_requests_unique_index ON deployment_merge_requests USING btree (environment_id, merge_request_id);
CREATE UNIQUE INDEX idx_external_audit_event_destination_id_key_uniq ON audit_events_streaming_headers USING btree (key, external_audit_event_destination_id);
@@ -26897,6 +27161,8 @@ CREATE INDEX idx_pkgs_debian_project_distribution_keys_on_distribution_id ON pac
CREATE UNIQUE INDEX idx_pkgs_dep_links_on_pkg_id_dependency_id_dependency_type ON packages_dependency_links USING btree (package_id, dependency_id, dependency_type);
+CREATE INDEX idx_pkgs_installable_package_files_on_package_id_id_file_name ON packages_package_files USING btree (package_id, id, file_name) WHERE (status = 0);
+
CREATE INDEX idx_proj_feat_usg_on_jira_dvcs_cloud_last_sync_at_and_proj_id ON project_feature_usages USING btree (jira_dvcs_cloud_last_sync_at, project_id) WHERE (jira_dvcs_cloud_last_sync_at IS NOT NULL);
CREATE INDEX idx_proj_feat_usg_on_jira_dvcs_server_last_sync_at_and_proj_id ON project_feature_usages USING btree (jira_dvcs_server_last_sync_at, project_id) WHERE (jira_dvcs_server_last_sync_at IS NOT NULL);
@@ -27107,7 +27373,7 @@ CREATE INDEX index_authentication_events_on_provider ON authentication_events US
CREATE INDEX index_authentication_events_on_provider_user_id_created_at ON authentication_events USING btree (provider, user_id, created_at) WHERE (result = 1);
-CREATE INDEX index_authentication_events_on_user_id ON authentication_events USING btree (user_id);
+CREATE INDEX index_authentication_events_on_user_and_ip_address_and_result ON authentication_events USING btree (user_id, ip_address, result);
CREATE INDEX index_award_emoji_on_awardable_type_and_awardable_id ON award_emoji USING btree (awardable_type, awardable_id);
@@ -27271,8 +27537,6 @@ CREATE INDEX index_ci_builds_on_project_id_and_id ON ci_builds USING btree (proj
CREATE INDEX index_ci_builds_on_project_id_and_name_and_ref ON ci_builds USING btree (project_id, name, ref) WHERE (((type)::text = 'Ci::Build'::text) AND ((status)::text = 'success'::text) AND ((retried = false) OR (retried IS NULL)));
-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_queued_at ON ci_builds USING btree (queued_at);
CREATE INDEX index_ci_builds_on_resource_group_and_status_and_commit_id ON ci_builds USING btree (resource_group_id, status, commit_id) WHERE (resource_group_id IS NOT NULL);
@@ -27285,8 +27549,6 @@ CREATE INDEX index_ci_builds_on_status_and_type_and_runner_id ON ci_builds USING
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);
@@ -27467,6 +27729,8 @@ CREATE UNIQUE INDEX index_ci_runner_namespaces_on_runner_id_and_namespace_id ON
CREATE INDEX index_ci_runner_projects_on_project_id ON ci_runner_projects USING btree (project_id);
+CREATE UNIQUE INDEX index_ci_runner_versions_on_unique_status_and_version ON ci_runner_versions USING btree (status, version);
+
CREATE INDEX index_ci_runners_on_active ON ci_runners USING btree (active, id);
CREATE INDEX index_ci_runners_on_contacted_at_and_id_desc ON ci_runners USING btree (contacted_at, id DESC);
@@ -27497,12 +27761,24 @@ CREATE INDEX index_ci_runners_on_token_expires_at_and_id_desc ON ci_runners USIN
CREATE INDEX index_ci_runners_on_token_expires_at_desc_and_id_desc ON ci_runners USING btree (token_expires_at DESC, id DESC);
+CREATE INDEX index_ci_runners_on_version ON ci_runners USING btree (version);
+
CREATE UNIQUE INDEX index_ci_running_builds_on_build_id ON ci_running_builds USING btree (build_id);
CREATE INDEX index_ci_running_builds_on_project_id ON ci_running_builds USING btree (project_id);
CREATE INDEX index_ci_running_builds_on_runner_id ON ci_running_builds USING btree (runner_id);
+CREATE INDEX index_ci_secure_file_states_failed_verification ON ci_secure_file_states USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
+
+CREATE INDEX index_ci_secure_file_states_needs_verification ON ci_secure_file_states USING btree (verification_state) WHERE ((verification_state = 0) OR (verification_state = 3));
+
+CREATE INDEX index_ci_secure_file_states_on_ci_secure_file_id ON ci_secure_file_states USING btree (ci_secure_file_id);
+
+CREATE INDEX index_ci_secure_file_states_on_verification_state ON ci_secure_file_states USING btree (verification_state);
+
+CREATE INDEX index_ci_secure_file_states_pending_verification ON ci_secure_file_states USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+
CREATE INDEX index_ci_secure_files_on_project_id ON ci_secure_files USING btree (project_id);
CREATE INDEX index_ci_sources_pipelines_on_pipeline_id ON ci_sources_pipelines USING btree (pipeline_id);
@@ -27551,6 +27827,8 @@ CREATE UNIQUE INDEX index_ci_variables_on_project_id_and_key_and_environment_sco
CREATE INDEX index_cicd_settings_on_namespace_id_where_stale_pruning_enabled ON namespace_ci_cd_settings USING btree (namespace_id) WHERE (allow_stale_runner_pruning = true);
+CREATE INDEX index_cis_vulnerability_reads_on_cluster_agent_id ON vulnerability_reads USING btree (casted_cluster_agent_id) WHERE (report_type = 7);
+
CREATE INDEX index_cluster_agent_tokens_on_agent_id_status_last_used_at ON cluster_agent_tokens USING btree (agent_id, status, last_used_at DESC NULLS LAST);
CREATE INDEX index_cluster_agent_tokens_on_created_by_user_id ON cluster_agent_tokens USING btree (created_by_user_id);
@@ -27589,8 +27867,6 @@ CREATE UNIQUE INDEX index_clusters_applications_cilium_on_cluster_id ON clusters
CREATE UNIQUE INDEX index_clusters_applications_crossplane_on_cluster_id ON clusters_applications_crossplane USING btree (cluster_id);
-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_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);
@@ -27607,8 +27883,6 @@ CREATE UNIQUE INDEX index_clusters_applications_runners_on_cluster_id ON cluster
CREATE INDEX index_clusters_applications_runners_on_runner_id ON clusters_applications_runners USING btree (runner_id);
-CREATE INDEX index_clusters_integration_elasticstack_enabled ON clusters_integration_elasticstack USING btree (enabled, created_at, cluster_id);
-
CREATE INDEX index_clusters_integration_prometheus_enabled ON clusters_integration_prometheus USING btree (enabled, created_at, cluster_id);
CREATE INDEX index_clusters_kubernetes_namespaces_on_cluster_project_id ON clusters_kubernetes_namespaces USING btree (cluster_project_id);
@@ -28289,7 +28563,7 @@ CREATE INDEX index_issues_on_milestone_id ON issues USING btree (milestone_id);
CREATE INDEX index_issues_on_moved_to_id ON issues USING btree (moved_to_id) WHERE (moved_to_id IS NOT NULL);
-CREATE INDEX index_issues_on_project_id_and_closed_at ON issues USING btree (project_id, closed_at);
+CREATE INDEX index_issues_on_namespace_id ON issues USING btree (namespace_id);
CREATE INDEX index_issues_on_project_id_and_created_at_issue_type_incident ON issues USING btree (project_id, created_at) WHERE (issue_type = 1);
@@ -28301,6 +28575,10 @@ CREATE INDEX index_issues_on_project_id_and_state_id_and_created_at_and_id ON is
CREATE INDEX index_issues_on_project_id_and_upvotes_count ON issues USING btree (project_id, upvotes_count);
+CREATE INDEX index_issues_on_project_id_closed_at_desc_state_id_and_id ON issues USING btree (project_id, closed_at DESC NULLS LAST, state_id, id);
+
+CREATE INDEX index_issues_on_project_id_closed_at_state_id_and_id ON issues USING btree (project_id, closed_at, state_id, id);
+
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);
@@ -28603,6 +28881,10 @@ CREATE INDEX index_namespace_admin_notes_on_namespace_id ON namespace_admin_note
CREATE UNIQUE INDEX index_namespace_aggregation_schedules_on_namespace_id ON namespace_aggregation_schedules USING btree (namespace_id);
+CREATE UNIQUE INDEX index_namespace_bans_on_namespace_id_and_user_id ON namespace_bans USING btree (namespace_id, user_id);
+
+CREATE INDEX index_namespace_bans_on_user_id ON namespace_bans USING btree (user_id);
+
CREATE UNIQUE INDEX index_namespace_root_storage_statistics_on_namespace_id ON namespace_root_storage_statistics USING btree (namespace_id);
CREATE UNIQUE INDEX index_namespace_statistics_on_namespace_id ON namespace_statistics USING btree (namespace_id);
@@ -28681,6 +28963,8 @@ CREATE INDEX index_notification_settings_on_source_and_level_and_user ON notific
CREATE UNIQUE INDEX index_notifications_on_user_id_and_source_id_and_source_type ON notification_settings USING btree (user_id, source_id, source_type);
+CREATE UNIQUE INDEX index_ns_user_callouts_feature ON user_namespace_callouts USING btree (user_id, feature_name, namespace_id);
+
CREATE INDEX index_oauth_access_grants_on_resource_owner_id ON oauth_access_grants USING btree (resource_owner_id, application_id, created_at);
CREATE UNIQUE INDEX index_oauth_access_grants_on_token ON oauth_access_grants USING btree (token);
@@ -28689,8 +28973,6 @@ CREATE INDEX index_oauth_access_tokens_on_application_id ON oauth_access_tokens
CREATE UNIQUE INDEX index_oauth_access_tokens_on_refresh_token ON oauth_access_tokens USING btree (refresh_token);
-CREATE INDEX index_oauth_access_tokens_on_resource_owner_id ON oauth_access_tokens USING btree (resource_owner_id);
-
CREATE UNIQUE INDEX index_oauth_access_tokens_on_token ON oauth_access_tokens USING btree (token);
CREATE INDEX index_oauth_applications_on_owner_id_and_owner_type ON oauth_applications USING btree (owner_id, owner_type);
@@ -28705,6 +28987,8 @@ CREATE INDEX index_on_dingtalk_tracker_data_corpid ON dingtalk_tracker_data USIN
COMMENT ON INDEX index_on_dingtalk_tracker_data_corpid IS 'JiHu-specific index';
+CREATE INDEX index_on_events_to_improve_contribution_analytics_performance ON events USING btree (project_id, target_type, action, created_at, author_id, id);
+
CREATE INDEX index_on_group_id_on_webhooks ON web_hooks USING btree (group_id);
CREATE INDEX index_on_identities_lower_extern_uid_and_provider ON identities USING btree (lower((extern_uid)::text), provider);
@@ -28743,6 +29027,8 @@ CREATE INDEX index_on_projects_path ON projects USING btree (path);
CREATE INDEX index_on_routes_lower_path ON routes USING btree (lower((path)::text));
+CREATE INDEX index_on_security_findings_uuid_and_id_order_desc ON security_findings USING btree (uuid, id DESC);
+
CREATE INDEX index_on_users_lower_email ON users USING btree (lower((email)::text));
CREATE INDEX index_on_users_lower_username ON users USING btree (lower((username)::text));
@@ -28857,7 +29143,7 @@ CREATE INDEX index_packages_packages_on_project_id_and_created_at ON packages_pa
CREATE INDEX index_packages_packages_on_project_id_and_package_type ON packages_packages USING btree (project_id, package_type);
-CREATE INDEX index_packages_packages_on_project_id_and_status ON packages_packages USING btree (project_id, status);
+CREATE INDEX index_packages_packages_on_project_id_and_status_and_id ON packages_packages USING btree (project_id, status, id);
CREATE INDEX index_packages_packages_on_project_id_and_version ON packages_packages USING btree (project_id, version);
@@ -28911,8 +29197,6 @@ CREATE INDEX index_pages_domains_on_verified_at_and_enabled_until ON pages_domai
CREATE INDEX index_pages_domains_on_wildcard ON pages_domains USING btree (wildcard);
-CREATE UNIQUE INDEX index_parent_links_on_work_item_id_and_work_item_parent_id ON work_item_parent_links USING btree (work_item_id, work_item_parent_id);
-
CREATE INDEX index_partial_ci_builds_on_user_id_name_parser_features ON ci_builds USING btree (user_id, name) WHERE (((type)::text = 'Ci::Build'::text) AND ((name)::text = ANY (ARRAY[('container_scanning'::character varying)::text, ('dast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('license_management'::character varying)::text, ('license_scanning'::character varying)::text, ('sast'::character varying)::text, ('coverage_fuzzing'::character varying)::text, ('secret_detection'::character varying)::text])));
CREATE INDEX index_pat_on_user_id_and_expires_at ON personal_access_tokens USING btree (user_id, expires_at);
@@ -28923,6 +29207,8 @@ CREATE INDEX index_path_locks_on_project_id ON path_locks USING btree (project_i
CREATE INDEX index_path_locks_on_user_id ON path_locks USING btree (user_id);
+CREATE INDEX index_pe_approval_rules_on_required_approvals_and_created_at ON protected_environment_approval_rules USING btree (required_approvals, created_at);
+
CREATE UNIQUE INDEX index_personal_access_tokens_on_token_digest ON personal_access_tokens USING btree (token_digest);
CREATE INDEX index_personal_access_tokens_on_user_id ON personal_access_tokens USING btree (user_id);
@@ -28973,6 +29259,8 @@ CREATE INDEX index_project_deploy_tokens_on_deploy_token_id ON project_deploy_to
CREATE UNIQUE INDEX index_project_deploy_tokens_on_project_id_and_deploy_token_id ON project_deploy_tokens USING btree (project_id, deploy_token_id);
+CREATE UNIQUE INDEX index_project_export_job_relation ON project_relation_exports USING btree (project_export_job_id, relation);
+
CREATE UNIQUE INDEX index_project_export_jobs_on_jid ON project_export_jobs USING btree (jid);
CREATE INDEX index_project_export_jobs_on_project_id_and_jid ON project_export_jobs USING btree (project_id, jid);
@@ -29011,6 +29299,10 @@ CREATE INDEX index_project_pages_metadata_on_pages_deployment_id ON project_page
CREATE INDEX index_project_pages_metadata_on_project_id_and_deployed_is_true ON project_pages_metadata USING btree (project_id) WHERE (deployed = true);
+CREATE INDEX index_project_relation_export_upload_id ON project_relation_export_uploads USING btree (project_relation_export_id);
+
+CREATE INDEX index_project_relation_exports_on_project_export_job_id ON project_relation_exports USING btree (project_export_job_id);
+
CREATE UNIQUE INDEX index_project_repositories_on_disk_path ON project_repositories USING btree (disk_path);
CREATE UNIQUE INDEX index_project_repositories_on_project_id ON project_repositories USING btree (project_id);
@@ -29047,8 +29339,6 @@ CREATE UNIQUE INDEX index_project_topics_on_project_id_and_topic_id ON project_t
CREATE INDEX index_project_topics_on_topic_id ON project_topics USING btree (topic_id);
-CREATE UNIQUE INDEX index_project_tracing_settings_on_project_id ON project_tracing_settings USING btree (project_id);
-
CREATE INDEX index_projects_aimed_for_deletion ON projects USING btree (marked_for_deletion_at) WHERE ((marked_for_deletion_at IS NOT NULL) AND (pending_delete = false));
CREATE INDEX index_projects_api_created_at_id_desc ON projects USING btree (created_at, id DESC);
@@ -29127,10 +29417,6 @@ CREATE UNIQUE INDEX index_projects_on_project_namespace_id ON projects USING btr
CREATE INDEX index_projects_on_repository_storage ON projects USING btree (repository_storage);
-CREATE INDEX index_projects_on_runners_token ON projects USING btree (runners_token);
-
-CREATE INDEX index_projects_on_runners_token_encrypted ON projects USING btree (runners_token_encrypted);
-
CREATE INDEX index_projects_on_star_count ON projects USING btree (star_count);
CREATE INDEX index_projects_on_updated_at_and_id ON projects USING btree (updated_at, id);
@@ -29187,6 +29473,8 @@ CREATE INDEX index_protected_environment_deploy_access_levels_on_group_id ON pro
CREATE INDEX index_protected_environment_deploy_access_levels_on_user_id ON protected_environment_deploy_access_levels USING btree (user_id);
+CREATE INDEX index_protected_environments_on_approval_count_and_created_at ON protected_environments USING btree (required_approval_count, created_at);
+
CREATE UNIQUE INDEX index_protected_environments_on_group_id_and_name ON protected_environments USING btree (group_id, name) WHERE (group_id IS NOT NULL);
CREATE INDEX index_protected_environments_on_project_id ON protected_environments USING btree (project_id);
@@ -29333,6 +29621,16 @@ CREATE INDEX index_saml_providers_on_group_id ON saml_providers USING btree (gro
CREATE UNIQUE INDEX index_saved_replies_on_name_text_pattern_ops ON saved_replies USING btree (user_id, name text_pattern_ops);
+CREATE INDEX index_sbom_component_versions_on_component_id ON sbom_component_versions USING btree (component_id);
+
+CREATE INDEX index_sbom_occurrences_on_component_version_id ON sbom_occurrences USING btree (component_version_id);
+
+CREATE INDEX index_sbom_occurrences_on_pipeline_id ON sbom_occurrences USING btree (pipeline_id);
+
+CREATE INDEX index_sbom_occurrences_on_project_id ON sbom_occurrences USING btree (project_id);
+
+CREATE INDEX index_sbom_occurrences_on_source_id ON sbom_occurrences USING btree (source_id);
+
CREATE INDEX index_scim_identities_on_group_id ON scim_identities USING btree (group_id);
CREATE UNIQUE INDEX index_scim_identities_on_lower_extern_uid_and_group_id ON scim_identities USING btree (lower((extern_uid)::text), group_id);
@@ -29363,6 +29661,10 @@ CREATE INDEX index_security_scans_on_created_at ON security_scans USING btree (c
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_security_scans_on_length_of_errors ON security_scans USING btree (pipeline_id, jsonb_array_length(COALESCE((info -> 'errors'::text), '[]'::jsonb)));
+
+CREATE INDEX index_security_scans_on_length_of_warnings ON security_scans USING btree (pipeline_id, jsonb_array_length(COALESCE((info -> 'warnings'::text), '[]'::jsonb)));
+
CREATE INDEX index_security_scans_on_pipeline_id ON security_scans USING btree (pipeline_id);
CREATE INDEX index_security_scans_on_project_id ON security_scans USING btree (project_id);
@@ -29597,6 +29899,10 @@ CREATE INDEX index_u2f_registrations_on_user_id ON u2f_registrations USING btree
CREATE UNIQUE INDEX index_uniq_im_issuable_escalation_statuses_on_issue_id ON incident_management_issuable_escalation_statuses USING btree (issue_id);
+CREATE UNIQUE INDEX index_uniq_projects_on_runners_token ON projects USING btree (runners_token);
+
+CREATE UNIQUE INDEX index_uniq_projects_on_runners_token_encrypted ON projects USING btree (runners_token_encrypted);
+
CREATE UNIQUE INDEX index_unique_ci_runner_projects_on_runner_id_and_project_id ON ci_runner_projects USING btree (runner_id, project_id);
CREATE UNIQUE INDEX index_unique_issue_metrics_issue_id ON issue_metrics USING btree (issue_id);
@@ -29661,6 +29967,8 @@ CREATE INDEX index_user_highest_roles_on_user_id_and_highest_access_level ON use
CREATE INDEX index_user_interacted_projects_on_user_id ON user_interacted_projects USING btree (user_id);
+CREATE INDEX index_user_namespace_callouts_on_namespace_id ON user_namespace_callouts USING btree (namespace_id);
+
CREATE INDEX index_user_permission_export_uploads_on_user_id_and_status ON user_permission_export_uploads USING btree (user_id, status);
CREATE INDEX index_user_preferences_on_gitpod_enabled ON user_preferences USING btree (gitpod_enabled);
@@ -29741,6 +30049,8 @@ COMMENT ON INDEX index_verification_codes_on_phone_and_visitor_id_code IS 'JiHu-
CREATE UNIQUE INDEX index_vuln_historical_statistics_on_project_id_and_date ON vulnerability_historical_statistics USING btree (project_id, date);
+CREATE INDEX index_vuln_reads_on_casted_cluster_agent_id_where_it_is_null ON vulnerability_reads USING btree (casted_cluster_agent_id) WHERE (casted_cluster_agent_id IS NOT NULL);
+
CREATE INDEX index_vuln_reads_on_project_id_state_severity_and_vuln_id ON vulnerability_reads USING btree (project_id, state, severity, vulnerability_id DESC);
CREATE INDEX index_vulnerabilites_common_finder_query ON vulnerabilities USING btree (project_id, state, report_type, severity, id);
@@ -29817,6 +30127,8 @@ CREATE UNIQUE INDEX index_vulnerability_identifiers_on_project_id_and_fingerprin
CREATE INDEX index_vulnerability_issue_links_on_issue_id ON vulnerability_issue_links USING btree (issue_id);
+CREATE INDEX index_vulnerability_merge_request_links_on_merge_request_id ON vulnerability_merge_request_links USING btree (merge_request_id);
+
CREATE INDEX index_vulnerability_occurrence_identifiers_on_identifier_id ON vulnerability_occurrence_identifiers USING btree (identifier_id);
CREATE UNIQUE INDEX index_vulnerability_occurrence_identifiers_on_unique_keys ON vulnerability_occurrence_identifiers USING btree (occurrence_id, identifier_id);
@@ -29905,6 +30217,8 @@ CREATE UNIQUE INDEX index_wiki_page_slugs_on_slug_and_wiki_page_meta_id ON wiki_
CREATE INDEX index_wiki_page_slugs_on_wiki_page_meta_id ON wiki_page_slugs USING btree (wiki_page_meta_id);
+CREATE UNIQUE INDEX index_work_item_parent_links_on_work_item_id ON work_item_parent_links USING btree (work_item_id);
+
CREATE INDEX index_work_item_parent_links_on_work_item_parent_id ON work_item_parent_links USING btree (work_item_parent_id);
CREATE INDEX index_x509_certificates_on_subject_key_identifier ON x509_certificates USING btree (subject_key_identifier);
@@ -29975,6 +30289,8 @@ CREATE UNIQUE INDEX partial_index_sop_configs_on_namespace_id ON security_orches
CREATE UNIQUE INDEX partial_index_sop_configs_on_project_id ON security_orchestration_policy_configurations USING btree (project_id) WHERE (project_id IS NOT NULL);
+CREATE INDEX partial_index_user_id_app_id_created_at_token_not_revoked ON oauth_access_tokens USING btree (resource_owner_id, application_id, created_at) WHERE (revoked_at IS NULL);
+
CREATE UNIQUE INDEX snippet_user_mentions_on_snippet_id_and_note_id_index ON snippet_user_mentions USING btree (snippet_id, note_id);
CREATE UNIQUE INDEX snippet_user_mentions_on_snippet_id_index ON snippet_user_mentions USING btree (snippet_id) WHERE (note_id IS NULL);
@@ -29995,8 +30311,6 @@ CREATE INDEX tmp_index_for_namespace_id_migration_on_group_members ON members US
CREATE INDEX tmp_index_for_namespace_id_migration_on_project_members ON members USING btree (id) WHERE ((member_namespace_id IS NULL) AND ((type)::text = 'ProjectMember'::text));
-CREATE INDEX tmp_index_for_namespace_id_migration_on_routes ON routes USING btree (id) WHERE ((namespace_id IS NULL) AND ((source_type)::text = 'Namespace'::text));
-
CREATE INDEX tmp_index_for_null_project_namespace_id ON projects USING btree (id) WHERE (project_namespace_id IS NULL);
CREATE INDEX tmp_index_for_project_namespace_id_migration_on_routes ON routes USING btree (id) WHERE ((namespace_id IS NULL) AND ((source_type)::text = 'Project'::text));
@@ -30007,13 +30321,13 @@ CREATE INDEX tmp_index_members_on_state ON members USING btree (state) WHERE (st
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_migrated_container_registries ON container_repositories USING btree (project_id) WHERE ((migration_state = 'import_done'::text) OR (created_at >= '2022-01-23 00:00:00'::timestamp without time zone));
+
CREATE UNIQUE INDEX tmp_index_on_tmp_project_id_on_namespaces ON namespaces USING btree (tmp_project_id);
CREATE INDEX tmp_index_on_vulnerabilities_non_dismissed ON vulnerabilities USING btree (id) WHERE (state <> 2);
-CREATE INDEX tmp_index_projects_on_id_and_runners_token ON projects USING btree (id, runners_token) WHERE (runners_token IS NOT NULL);
-
-CREATE INDEX tmp_index_projects_on_id_and_runners_token_encrypted ON projects USING btree (id, runners_token_encrypted) WHERE (runners_token_encrypted IS NOT NULL);
+CREATE INDEX tmp_index_project_statistics_cont_registry_size ON project_statistics USING btree (project_id) WHERE (container_registry_size = 0);
CREATE UNIQUE INDEX uniq_pkgs_deb_grp_architectures_on_distribution_id_and_name ON packages_debian_group_architectures USING btree (distribution_id, name);
@@ -30035,6 +30349,8 @@ CREATE UNIQUE INDEX unique_merge_request_metrics_by_merge_request_id ON merge_re
CREATE UNIQUE INDEX unique_projects_on_name_namespace_id ON projects USING btree (name, namespace_id);
+CREATE UNIQUE INDEX unique_vuln_merge_request_link_vuln_id_and_mr_id ON vulnerability_merge_request_links USING btree (vulnerability_id, merge_request_id);
+
CREATE INDEX user_follow_users_followee_id_idx ON user_follow_users USING btree (followee_id);
CREATE INDEX users_forbidden_state_idx ON users USING btree (id) WHERE ((confirmed_at IS NOT NULL) AND ((state)::text <> ALL (ARRAY['blocked'::text, 'banned'::text, 'ldap_blocked'::text])));
@@ -31361,6 +31677,8 @@ CREATE TRIGGER trigger_has_external_wiki_on_update AFTER UPDATE ON integrations
CREATE TRIGGER trigger_insert_or_update_vulnerability_reads_from_occurrences AFTER INSERT OR UPDATE ON vulnerability_occurrences FOR EACH ROW EXECUTE FUNCTION insert_or_update_vulnerability_reads();
+CREATE TRIGGER trigger_insert_vulnerability_reads_from_vulnerability AFTER UPDATE ON vulnerabilities FOR EACH ROW WHEN (((old.present_on_default_branch IS NOT TRUE) AND (new.present_on_default_branch IS TRUE))) EXECUTE FUNCTION insert_vulnerability_reads_from_vulnerability();
+
CREATE TRIGGER trigger_namespaces_parent_id_on_insert AFTER INSERT ON namespaces FOR EACH ROW EXECUTE FUNCTION insert_namespaces_sync_event();
CREATE TRIGGER trigger_namespaces_parent_id_on_update AFTER UPDATE ON namespaces FOR EACH ROW WHEN ((old.parent_id IS DISTINCT FROM new.parent_id)) EXECUTE FUNCTION insert_namespaces_sync_event();
@@ -31375,7 +31693,7 @@ CREATE TRIGGER trigger_update_has_issues_on_vulnerability_issue_links_update AFT
CREATE TRIGGER trigger_update_location_on_vulnerability_occurrences_update AFTER UPDATE ON vulnerability_occurrences FOR EACH ROW WHEN (((new.report_type = ANY (ARRAY[2, 7])) AND (((old.location ->> 'image'::text) IS DISTINCT FROM (new.location ->> 'image'::text)) OR (((old.location -> 'kubernetes_resource'::text) ->> 'agent_id'::text) IS DISTINCT FROM ((new.location -> 'kubernetes_resource'::text) ->> 'agent_id'::text))))) EXECUTE FUNCTION update_location_from_vulnerability_occurrences();
-CREATE TRIGGER trigger_update_vulnerability_reads_on_vulnerability_update AFTER UPDATE ON vulnerabilities FOR EACH ROW WHEN (((old.severity IS DISTINCT FROM new.severity) OR (old.state IS DISTINCT FROM new.state) OR (old.resolved_on_default_branch IS DISTINCT FROM new.resolved_on_default_branch))) EXECUTE FUNCTION update_vulnerability_reads_from_vulnerability();
+CREATE TRIGGER trigger_update_vulnerability_reads_on_vulnerability_update AFTER UPDATE ON vulnerabilities FOR EACH ROW WHEN (((old.present_on_default_branch IS TRUE) AND ((old.severity IS DISTINCT FROM new.severity) OR (old.state IS DISTINCT FROM new.state) OR (old.resolved_on_default_branch IS DISTINCT FROM new.resolved_on_default_branch)))) EXECUTE FUNCTION update_vulnerability_reads_from_vulnerability();
CREATE TRIGGER users_loose_fk_trigger AFTER DELETE ON users REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
@@ -31445,6 +31763,9 @@ ALTER TABLE ONLY vulnerabilities
ALTER TABLE ONLY webauthn_registrations
ADD CONSTRAINT fk_13e04d719a FOREIGN KEY (u2f_registration_id) REFERENCES u2f_registrations(id) ON DELETE CASCADE;
+ALTER TABLE ONLY sbom_occurrences
+ ADD CONSTRAINT fk_157506c0e2 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY protected_branch_push_access_levels
ADD CONSTRAINT fk_15d2a7a4ae FOREIGN KEY (deploy_key_id) REFERENCES keys(id) ON DELETE CASCADE;
@@ -31517,6 +31838,9 @@ ALTER TABLE ONLY ci_pipelines
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_27548c6db3 FOREIGN KEY (hashed_storage_migrated_event_id) REFERENCES geo_hashed_storage_migrated_events(id) ON DELETE CASCADE;
+ALTER TABLE ONLY user_namespace_callouts
+ ADD CONSTRAINT fk_27a69fd1bd FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY merge_requests_compliance_violations
ADD CONSTRAINT fk_290ec1ab02 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
@@ -31538,6 +31862,9 @@ ALTER TABLE ONLY members
ALTER TABLE ONLY lfs_objects_projects
ADD CONSTRAINT fk_2eb33f7a78 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE NOT VALID;
+ALTER TABLE ONLY vulnerability_merge_request_links
+ ADD CONSTRAINT fk_2ef3954596 FOREIGN KEY (vulnerability_id) REFERENCES vulnerabilities(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY analytics_cycle_analytics_group_stages
ADD CONSTRAINT fk_3078345d6d FOREIGN KEY (stage_event_hash_id) REFERENCES analytics_cycle_analytics_stage_event_hashes(id) ON DELETE CASCADE;
@@ -31598,6 +31925,9 @@ ALTER TABLE ONLY protected_environment_approval_rules
ALTER TABLE ONLY ci_pipeline_schedule_variables
ADD CONSTRAINT fk_41c35fda51 FOREIGN KEY (pipeline_schedule_id) REFERENCES ci_pipeline_schedules(id) ON DELETE CASCADE;
+ALTER TABLE ONLY namespace_bans
+ ADD CONSTRAINT fk_4275fbb1d7 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_42c3b54bed FOREIGN KEY (cache_invalidation_event_id) REFERENCES geo_cache_invalidation_events(id) ON DELETE CASCADE;
@@ -31616,6 +31946,12 @@ ALTER TABLE ONLY releases
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_4a99ebfd60 FOREIGN KEY (repositories_changed_event_id) REFERENCES geo_repositories_changed_events(id) ON DELETE CASCADE;
+ALTER TABLE ONLY user_namespace_callouts
+ ADD CONSTRAINT fk_4b1257f385 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY sbom_occurrences
+ ADD CONSTRAINT fk_4b88e5b255 FOREIGN KEY (component_version_id) REFERENCES sbom_component_versions(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_reads
ADD CONSTRAINT fk_5001652292 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -31694,6 +32030,12 @@ ALTER TABLE ONLY projects
ALTER TABLE ONLY dast_profile_schedules
ADD CONSTRAINT fk_6cca0d8800 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_merge_request_links
+ ADD CONSTRAINT fk_6d7aa8796e FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_6e10d4d38a FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY projects
ADD CONSTRAINT fk_6e5c14658a FOREIGN KEY (pool_repository_id) REFERENCES pool_repositories(id) ON DELETE SET NULL;
@@ -31928,6 +32270,9 @@ ALTER TABLE ONLY merge_requests
ALTER TABLE ONLY merge_request_metrics
ADD CONSTRAINT fk_ae440388cc FOREIGN KEY (latest_closed_by_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY vulnerability_reads
+ ADD CONSTRAINT fk_aee839e611 FOREIGN KEY (casted_cluster_agent_id) REFERENCES cluster_agents(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY dast_profile_schedules
ADD CONSTRAINT fk_aef03d62e5 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -31982,6 +32327,9 @@ ALTER TABLE ONLY deployments
ALTER TABLE ONLY routes
ADD CONSTRAINT fk_bb2e5b8968 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY namespace_bans
+ ADD CONSTRAINT fk_bcc024eef2 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY gitlab_subscriptions
ADD CONSTRAINT fk_bd0c4019c3 FOREIGN KEY (hosted_plan_id) REFERENCES plans(id) ON DELETE CASCADE;
@@ -32006,6 +32354,9 @@ ALTER TABLE ONLY design_management_versions
ALTER TABLE ONLY packages_packages
ADD CONSTRAINT fk_c188f0dba4 FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY sbom_occurrences
+ ADD CONSTRAINT fk_c2a5562923 FOREIGN KEY (source_id) REFERENCES sbom_sources(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY analytics_cycle_analytics_project_stages
ADD CONSTRAINT fk_c3339bdfc9 FOREIGN KEY (stage_event_hash_id) REFERENCES analytics_cycle_analytics_stage_event_hashes(id) ON DELETE CASCADE;
@@ -32261,9 +32612,6 @@ ALTER TABLE ONLY approval_merge_request_rules
ALTER TABLE ONLY namespace_statistics
ADD CONSTRAINT fk_rails_0062050394 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY clusters_applications_elastic_stacks
- ADD CONSTRAINT fk_rails_026f219f46 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY incident_management_oncall_participants
ADD CONSTRAINT fk_rails_032b12996a FOREIGN KEY (oncall_rotation_id) REFERENCES incident_management_oncall_rotations(id) ON DELETE CASCADE;
@@ -32804,6 +33152,9 @@ ALTER TABLE ONLY badges
ALTER TABLE ONLY resource_label_events
ADD CONSTRAINT fk_rails_5ac1d2fc24 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_secure_file_states
+ ADD CONSTRAINT fk_rails_5adba40c5f FOREIGN KEY (ci_secure_file_id) REFERENCES ci_secure_files(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY approval_merge_request_rules_groups
ADD CONSTRAINT fk_rails_5b2ecf6139 FOREIGN KEY (approval_merge_request_rule_id) REFERENCES approval_merge_request_rules(id) ON DELETE CASCADE;
@@ -32858,6 +33209,9 @@ ALTER TABLE ONLY dependency_proxy_group_settings
ALTER TABLE ONLY group_deploy_tokens
ADD CONSTRAINT fk_rails_61a572b41a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY sbom_component_versions
+ ADD CONSTRAINT fk_rails_61a83aa892 FOREIGN KEY (component_id) REFERENCES sbom_components(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY status_page_published_incidents
ADD CONSTRAINT fk_rails_61e5493940 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -32900,6 +33254,9 @@ ALTER TABLE ONLY design_management_versions
ALTER TABLE ONLY approval_merge_request_rules_approved_approvers
ADD CONSTRAINT fk_rails_6577725edb FOREIGN KEY (approval_merge_request_rule_id) REFERENCES approval_merge_request_rules(id) ON DELETE CASCADE;
+ALTER TABLE ONLY project_relation_export_uploads
+ ADD CONSTRAINT fk_rails_660ada90c9 FOREIGN KEY (project_relation_export_id) REFERENCES project_relation_exports(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY operations_feature_flags_clients
ADD CONSTRAINT fk_rails_6650ed902c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -33515,9 +33872,6 @@ ALTER TABLE ONLY boards_epic_board_positions
ALTER TABLE ONLY vulnerability_finding_links
ADD CONSTRAINT fk_rails_cbdfde27ce FOREIGN KEY (vulnerability_occurrence_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
-ALTER TABLE ONLY clusters_integration_elasticstack
- ADD CONSTRAINT fk_rails_cc5ba8f658 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY issues_self_managed_prometheus_alert_events
ADD CONSTRAINT fk_rails_cc5d88bbb0 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -33710,6 +34064,9 @@ ALTER TABLE ONLY ci_daily_build_group_report_results
ALTER TABLE ONLY packages_debian_group_architectures
ADD CONSTRAINT fk_rails_ef667d1b03 FOREIGN KEY (distribution_id) REFERENCES packages_debian_group_distributions(id) ON DELETE CASCADE;
+ALTER TABLE ONLY project_relation_exports
+ ADD CONSTRAINT fk_rails_ef89b354fc FOREIGN KEY (project_export_job_id) REFERENCES project_export_jobs(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY label_priorities
ADD CONSTRAINT fk_rails_ef916d14fa FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -33806,9 +34163,6 @@ ALTER TABLE ONLY experiment_users
ALTER TABLE ONLY cluster_groups
ADD CONSTRAINT fk_rails_fdb8648a96 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
-ALTER TABLE ONLY project_tracing_settings
- ADD CONSTRAINT fk_rails_fe56f57fc6 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY resource_label_events
ADD CONSTRAINT fk_rails_fe91ece594 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
diff --git a/doc/.vale/gitlab/Uppercase.yml b/doc/.vale/gitlab/Uppercase.yml
index bdbee8108d5..a8519d898db 100644
--- a/doc/.vale/gitlab/Uppercase.yml
+++ b/doc/.vale/gitlab/Uppercase.yml
@@ -16,6 +16,7 @@ second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
exceptions:
- ACL
- AJAX
+ - AMI
- ANSI
- APAC
- API
@@ -23,6 +24,7 @@ exceptions:
- ARM
- ARN
- ASCII
+ - ASG
- AWS
- BMP
- BSD
@@ -58,11 +60,13 @@ exceptions:
- DSL
- DVCS
- DVD
+ - EBS
- ECDSA
- ECS
- EFS
- EKS
- ELB
+ - ENA
- EOL
- EWM
- EXIF
@@ -88,6 +92,7 @@ exceptions:
- GPG
- GPL
- GPS
+ - GPT
- GPU
- GUI
- HAML
@@ -125,10 +130,12 @@ exceptions:
- LSIF
- LTM
- LTS
+ - LVM
- MIME
- MIT
- MITRE
- MVC
+ - NAS
- NAT
- NDA
- NFS
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index de7fb45490d..43ccaf6bd7a 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -125,6 +125,7 @@ colocated
colocating
compilable
composable
+composables
Conda
Consul
Contentful
@@ -239,6 +240,7 @@ Fortinet
Fugit
fuzzer
Gantt
+Gbps
Gemfile
Gemnasium
Gemojione
diff --git a/doc/administration/audit_event_streaming.md b/doc/administration/audit_event_streaming.md
index ad235ead992..817f22debbc 100644
--- a/doc/administration/audit_event_streaming.md
+++ b/doc/administration/audit_event_streaming.md
@@ -9,6 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332747) in GitLab 14.5 [with a flag](../administration/feature_flags.md) named `ff_external_audit_events_namespace`. Disabled by default.
> - [Enabled on GitLab.com and by default on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/338939) in GitLab 14.7.
> - [Feature flag `ff_external_audit_events_namespace`](https://gitlab.com/gitlab-org/gitlab/-/issues/349588) removed in GitLab 14.8.
+> - [Subgroup events recording](https://gitlab.com/gitlab-org/gitlab/-/issues/366878) fixed in GitLab 15.2.
Users can set an HTTP endpoint for a top-level group to receive all audit events about the group, its subgroups, and
projects as structured JSON.
@@ -29,11 +30,11 @@ Event streaming destinations receive **all** audit event data, which could inclu
Users with at least the Owner role for a group can add event streaming destinations for it:
1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Security & Compliance > Audit events**
+1. On the left sidebar, select **Security & Compliance > Audit events**.
1. On the main area, select **Streams** tab.
- - When the destination list is empty, select **Add stream** activate edit mode and add a new destination.
- - When the destination list is not empty, select **{plus}** under the **Streams** tab to activate edit mode.
-1. Enter the endpoint you wish to add and select **Add**.
+ - When the destination list is empty, select **Add stream** to show the section for adding destinations.
+ - When the destination list is not empty, select **{plus}** to show the section for adding destinations.
+1. Enter the destination URL to add and select **Add**.
Event streaming is enabled if:
@@ -76,7 +77,7 @@ Users with at least the Owner role for a group can list event streaming destinat
Users with at least the Owner role for a group can list event streaming destinations:
1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Security & Compliance > Audit events**
+1. On the left sidebar, select **Security & Compliance > Audit events**.
1. On the main area, select **Streams** tab.
### Use the API
@@ -115,7 +116,7 @@ When the last destination is successfully deleted, event streaming is disabled f
Users with at least the Owner role for a group can delete event streaming destinations.
1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Security & Compliance > Audit events**
+1. On the left sidebar, select **Security & Compliance > Audit events**.
1. On the main area, select **Streams** tab.
1. Select **{remove}** at the right side of each item.
@@ -143,20 +144,26 @@ Destination is deleted if:
- The returned `errors` object is empty.
- The API responds with `200 OK`.
-## Custom HTTP header values
+## Custom HTTP headers
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361216) in GitLab 15.1 [with a flag](feature_flags.md) named `streaming_audit_event_headers`. Disabled by default.
+> - API [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361216) in GitLab 15.1 [with a flag](feature_flags.md) named `streaming_audit_event_headers`. Disabled by default.
+> - API [enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/362941) in GitLab 15.2.
+> - UI [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361630) in GitLab 15.2 [with a flag](feature_flags.md) named `custom_headers_streaming_audit_events_ui`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per group, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `streaming_audit_event_headers`.
-On GitLab.com, this feature is not available.
-The feature is not ready for production use.
+On self-managed GitLab, by default the API for this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `streaming_audit_event_headers`.
+On GitLab.com, the API for this feature is available.
Each streaming destination can have up to 20 custom HTTP headers included with each streamed event.
-### Add with the API
+### Adding custom HTTP headers
-Group owners can add a HTTP header using the GraphQL `auditEventsStreamingHeadersCreate` mutation.
+Add custom HTTP headers with the API or GitLab UI.
+
+#### Use the API
+
+Group owners can add a HTTP header using the GraphQL `auditEventsStreamingHeadersCreate` mutation. You can retrieve the destination ID
+by [listing the external audit destinations](#list-streaming-destinations) on the group.
```graphql
mutation {
@@ -166,19 +173,111 @@ mutation {
}
```
-### Delete with the API
+The header is created if the returned `errors` object is empty.
+
+#### Use the GitLab UI
+
+FLAG:
+On self-managed GitLab, by default the UI for this feature is not available. To make it available per group, ask an administrator to
+[enable the feature flag](../administration/feature_flags.md) named `custom_headers_streaming_audit_events_ui`. On GitLab.com, the UI for this feature is
+not available. The UI for this feature is not ready for production use.
+
+Users with at least the Owner role for a group can add event streaming destinations and custom HTTP headers for it:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Security & Compliance > Audit events**.
+1. On the main area, select **Streams** tab.
+ - When the destination list is empty, select **Add stream** to show the section for adding destinations.
+ - When the destination list is not empty, select **{plus}** to show the section for adding destinations.
+1. Enter the destination URL to add.
+1. Locate the **Custom HTTP headers** table.
+1. In the **Header** column, add the header's name.
+1. In the **Value** column, add the header's value.
+1. Ignore the **Active** checkbox because it isn't functional. To track progress on adding functionality to the **Active** checkbox, see the
+ [relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/361925).
+1. Enter as many name and value pairs as required. When you enter a unique name and a value for a header, a new row in the table automatically appears. You can add up to
+ 20 headers per endpoint.
+1. After all headers have been filled out, select **Add** to add the new endpoint.
+
+Event streaming is enabled if:
+
+- No warning is shown.
+- The added endpoint is displayed in the UI.
+
+### Updating custom HTTP headers
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361964) in GitLab 15.2.
-Group owners can remove a HTTP header using the GraphQL `auditEventsStreamingHeadersDestroy` mutation.
+Group owners can update a HTTP header using the GraphQL `auditEventsStreamingHeadersCreate` mutation.
```graphql
mutation {
- auditEventsStreamingHeadersDestroy(input: { headerId: "gid://gitlab/AuditEvents::ExternalAuditEventDestination/24601" }) {
+ auditEventsStreamingHeadersUpdate(input: { headerId: "gid://gitlab/AuditEvents::Streaming::Header/24255", key: "new-foo", value: "new-bar" }) {
errors
}
}
```
-The header is created if the returned `errors` object is empty.
+### Deleting custom HTTP headers
+
+Group owners can remove a HTTP header using the GraphQL `auditEventsStreamingHeadersDestroy` mutation. You can retrieve the header ID
+by [listing all the custom headers](#list-all-custom-headers) on the group.
+
+```graphql
+mutation {
+ auditEventsStreamingHeadersDestroy(input: { headerId: "gid://gitlab/AuditEvents::Streaming::Header/1" }) {
+ errors
+ }
+}
+```
+
+The header is deleted if the returned `errors` object is empty.
+
+### List all custom headers
+
+List all custom HTTP headers with the API or GitLab UI.
+
+#### Use the API
+
+You can list all custom headers for a top-level group as well as their value and ID using the GraphQL `externalAuditEventDestinations` query. The ID
+value returned by this query is what you need to pass to the `deletion` mutation.
+
+```graphql
+query {
+ group(fullPath: "your-group") {
+ id
+ externalAuditEventDestinations {
+ nodes {
+ destinationUrl
+ id
+ headers {
+ nodes {
+ key
+ value
+ id
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+#### Use the GitLab UI
+
+FLAG:
+On self-managed GitLab, by default the UI for this feature is not available. To make it available per group, ask an administrator to
+[enable the feature flag](../administration/feature_flags.md) named `custom_headers_streaming_audit_events_ui`. On GitLab.com, the UI for this feature is
+not available. The UI for this feature is not ready for production use.
+
+Users with at least the Owner role for a group can add event streaming destinations and custom HTTP headers for it:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Security & Compliance > Audit events**.
+1. On the main area, select **Streams** tab.
+1. Select **{pencil}** at the right side of an item.
+1. A read-only view of the items custom headers is shown. To track progress on adding editing functionality, see the [relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/361925).
+1. Select **Cancel** to close the read-only view.
## Verify event authenticity
@@ -190,6 +289,17 @@ token is generated when the event destination is created and cannot be changed.
Each streamed event contains a random alphanumeric identifier for the `X-Gitlab-Event-Streaming-Token` HTTP header that can be verified against
the destination's value when [listing streaming destinations](#list-streaming-destinations).
+### Use the GitLab UI
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/360814) in GitLab 15.2.
+
+Users with at least the Owner role for a group can list event streaming destinations and see the verification tokens:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Security & Compliance > Audit events**.
+1. On the main area, select **Streams**.
+1. View the verification token on the right side of each item.
+
## Audit event streaming on Git operations
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332747) in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `audit_event_streaming_git_operations`. Disabled by default.
@@ -427,3 +537,215 @@ X-Gitlab-Audit-Event-Type: audit_operation
"event_type": "audit_operation"
}
```
+
+## Audit event streaming on merge request create actions
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90911) in GitLab 15.2.
+
+Stream audit events that relate to merge request create actions using the `/logs` endpoint.
+
+Send API requests that contain the `X-Gitlab-Audit-Event-Type` header with value `merge_request_create`. GitLab responds with JSON payloads with an
+`event_type` field set to `merge_request_create`.
+
+### Headers
+
+Headers are formatted as follows:
+
+```plaintext
+POST /logs HTTP/1.1
+Host: <DESTINATION_HOST>
+Content-Type: application/x-www-form-urlencoded
+X-Gitlab-Audit-Event-Type: merge_request_create
+X-Gitlab-Event-Streaming-Token: <DESTINATION_TOKEN>
+```
+
+### Example payload
+
+```json
+{
+ "id": 1,
+ "author_id": 1,
+ "entity_id": 24,
+ "entity_type": "Project",
+ "details": {
+ "author_name": "example_user",
+ "target_id": 132,
+ "target_type": "MergeRequest",
+ "target_details": "Update test.md",
+ "custom_message": "Added merge request",
+ "ip_address": "127.0.0.1",
+ "entity_path": "example-group/example-project"
+ },
+ "ip_address": "127.0.0.1",
+ "author_name": "Administrator",
+ "entity_path": "example-group/example-project",
+ "target_details": "Update test.md",
+ "created_at": "2022-07-04T00:19:22.675Z",
+ "target_type": "MergeRequest",
+ "target_id": 132,
+ "event_type": "merge_request_create"
+}
+```
+
+## Audit event streaming on project fork actions
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90916) in GitLab 15.2.
+
+Stream audit events that relate to project fork actions using the `/logs` endpoint.
+
+Send API requests that contain the `X-Gitlab-Audit-Event-Type` header with value `project_fork_operation`. GitLab responds with JSON payloads with an
+`event_type` field set to `project_fork_operation`.
+
+### Headers
+
+Headers are formatted as follows:
+
+```plaintext
+POST /logs HTTP/1.1
+Host: <DESTINATION_HOST>
+Content-Type: application/x-www-form-urlencoded
+X-Gitlab-Audit-Event-Type: project_fork_operation
+X-Gitlab-Event-Streaming-Token: <DESTINATION_TOKEN>
+```
+
+### Example payload
+
+```json
+{
+ "id": 1,
+ "author_id": 1,
+ "entity_id": 24,
+ "entity_type": "Project",
+ "details": {
+ "author_name": "example_username",
+ "target_id": 24,
+ "target_type": "Project",
+ "target_details": "example-project",
+ "custom_message": "Forked project to another-group/example-project-forked",
+ "ip_address": "127.0.0.1",
+ "entity_path": "example-group/example-project"
+ },
+ "ip_address": "127.0.0.1",
+ "author_name": "example_username",
+ "entity_path": "example-group/example-project",
+ "target_details": "example-project",
+ "created_at": "2022-06-30T03:43:35.384Z",
+ "target_type": "Project",
+ "target_id": 24,
+ "event_type": "project_fork_operation"
+}
+```
+
+## Audit event streaming on project group link actions
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90955) in GitLab 15.2.
+
+Stream audit events that relate to project group link creation, updates, and deletion using the `/logs` endpoint.
+
+Send API requests that contain the `X-Gitlab-Audit-Event-Type` header with value of either:
+
+- `project_group_link_create`.
+- `project_group_link_update`.
+- `project_group_link_destroy`.
+
+GitLab responds with JSON payloads with an `event_type` field set to either:
+
+- `project_group_link_create`.
+- `project_group_link_update`.
+- `project_group_link_destroy`.
+
+### Example Headers
+
+Headers are formatted as follows:
+
+```plaintext
+POST /logs HTTP/1.1
+Host: <DESTINATION_HOST>
+Content-Type: application/x-www-form-urlencoded
+X-Gitlab-Audit-Event-Type: project_group_link_create
+X-Gitlab-Event-Streaming-Token: <DESTINATION_TOKEN>
+```
+
+### Example payload for project group link create
+
+```json
+{
+ "id": 1,
+ "author_id": 1,
+ "entity_id": 24,
+ "entity_type": "Project",
+ "details": {
+ "author_name": "example-user",
+ "target_id": 31,
+ "target_type": "Group",
+ "target_details": "another-group",
+ "custom_message": "Added project group link",
+ "ip_address": "127.0.0.1",
+ "entity_path": "example-group/example-project"
+ },
+ "ip_address": "127.0.0.1",
+ "author_name": "example-user",
+ "entity_path": "example-group/example-project",
+ "target_details": "another-group",
+ "created_at": "2022-07-04T00:43:09.318Z",
+ "target_type": "Group",
+ "target_id": 31,
+ "event_type": "project_group_link_create"
+}
+```
+
+### Example payload for project group link update
+
+```json
+{
+ "id": 1,
+ "author_id": 1,
+ "entity_id": 24,
+ "entity_type": "Project",
+ "details": {
+ "author_name": "example-user",
+ "target_id": 31,
+ "target_type": "Group",
+ "target_details": "another-group",
+ "custom_message": "Changed project group link profile group_access from Developer to Guest",
+ "ip_address": "127.0.0.1",
+ "entity_path": "example-group/example-project"
+ },
+ "ip_address": "127.0.0.1",
+ "author_name": "example-user",
+ "entity_path": "example-group/example-project",
+ "target_details": "another-group",
+ "created_at": "2022-07-04T00:43:28.328Z",
+ "target_type": "Group",
+ "target_id": 31,
+ "event_type": "project_group_link_update"
+}
+```
+
+### Example payload for project group link delete
+
+```json
+{
+ "id": 1,
+ "author_id": 1,
+ "entity_id": 24,
+ "entity_type": "Project",
+ "details": {
+ "author_name": "example-user",
+ "target_id": 31,
+ "target_type": "Group",
+ "target_details": "another-group",
+ "custom_message": "Removed project group link",
+ "ip_address": "127.0.0.1",
+ "entity_path": "example-group/example-project"
+ },
+ "ip_address": "127.0.0.1",
+ "author_name": "example-user",
+ "entity_path": "example-group/example-project",
+ "target_details": "another-group",
+ "created_at": "2022-07-04T00:42:56.279Z",
+ "target_type": "Group",
+ "target_id": 31,
+ "event_type": "project_group_link_destroy"
+}
+```
diff --git a/doc/administration/auth/index.md b/doc/administration/auth/index.md
index ad8d78fdfd6..a412875501e 100644
--- a/doc/administration/auth/index.md
+++ b/doc/administration/auth/index.md
@@ -25,13 +25,15 @@ UltraAuth has removed their software which supports OmniAuth integration. We hav
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 |
+| Capability | SaaS | Self-managed |
|-------------------------------------------------|-----------------------------------------|------------------------------------|
-| **User Provisioning** | SCIM<br>Just-In-Time (JIT) Provisioning | LDAP Sync |
+| **User Provisioning** | SCIM<br>SAML <sup>1</sup> | LDAP <sup>1</sup><br>SAML <sup>1</sup><br>[OmniAuth Providers](../../integration/omniauth.md#supported-providers) <sup>1</sup> |
| **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) |
+| **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](../../integration/omniauth.md#supported-providers) (only 1 permitted per unique provider) |
| **Provider-to-GitLab Role Sync** | SAML Group Sync | LDAP Group Sync<br>SAML Group Sync ([GitLab 15.1](https://gitlab.com/gitlab-org/gitlab/-/issues/285150) and later) |
-| **User Removal** | SCIM (remove user from top-level group) | LDAP (Blocking User from Instance) |
+| **User Removal** | SCIM (remove user from top-level group) | LDAP (remove user from groups and block from the instance) |
+
+1. Using Just-In-Time (JIT) provisioning, user accounts are created when the user first signs in.
## Change apps or configuration
diff --git a/doc/administration/auth/ldap/img/multi_login.gif b/doc/administration/auth/ldap/img/multi_login.gif
deleted file mode 100644
index 5aee6090793..00000000000
--- a/doc/administration/auth/ldap/img/multi_login.gif
+++ /dev/null
Binary files differ
diff --git a/doc/administration/auth/ldap/img/multi_login.png b/doc/administration/auth/ldap/img/multi_login.png
new file mode 100644
index 00000000000..512f403a442
--- /dev/null
+++ b/doc/administration/auth/ldap/img/multi_login.png
Binary files differ
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index 55b57193bf3..05eee338e64 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Integrate LDAP with GitLab **(FREE SELF)**
-GitLab integrates with [LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)
+GitLab integrates with [LDAP - Lightweight Directory Access Protocol](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)
to support user authentication.
This integration works with most LDAP-compliant directory servers, including:
@@ -274,7 +274,7 @@ gitlab_rails['ldap_servers'] = {
This example results in the following sign-in page:
-![Multiple LDAP servers sign in](img/multi_login.gif)
+![Multiple LDAP servers sign in](img/multi_login.png)
### Set up LDAP user filter
diff --git a/doc/administration/auth/ldap/ldap_synchronization.md b/doc/administration/auth/ldap/ldap_synchronization.md
index 0f0d301bfa9..b0ada1c11dd 100644
--- a/doc/administration/auth/ldap/ldap_synchronization.md
+++ b/doc/administration/auth/ldap/ldap_synchronization.md
@@ -42,11 +42,6 @@ The process also updates the following user information:
- SSH public keys (if `sync_ssh_keys` is set)
- Kerberos identity (if Kerberos is enabled)
-The LDAP sync process:
-
-- Updates existing users.
-- Creates new users on first sign in.
-
### Adjust LDAP user sync schedule
By default, GitLab runs a worker once per day at 01:30 a.m. server time to
diff --git a/doc/administration/auth/oidc.md b/doc/administration/auth/oidc.md
index deb47160d98..60a4cc8706f 100644
--- a/doc/administration/auth/oidc.md
+++ b/doc/administration/auth/oidc.md
@@ -339,7 +339,7 @@ The trailing forward slash is required.
This configuration corresponds with the `Supported account types` setting used when
creating the `IdentityExperienceFramework` app.
-#### Keycloak
+### Keycloak
GitLab works with OpenID providers that use HTTPS. Although a Keycloak
server can be set up using HTTP, GitLab can only communicate
@@ -380,7 +380,7 @@ gitlab_rails['omniauth_providers'] = [
]
```
-##### Configure Keycloak with a symmetric key algorithm
+#### Configure Keycloak with a symmetric key algorithm
> Introduced in GitLab 14.2.
@@ -461,7 +461,7 @@ To use symmetric key encryption:
If after reconfiguring, you see the error `JSON::JWS::VerificationFailed` error message, this means
the incorrect secret was specified.
-#### Casdoor
+### Casdoor
GitLab works with OpenID providers that use HTTPS. To connect to GitLab using OpenID with Casdoor, use HTTPS instead of HTTP.
@@ -471,7 +471,7 @@ For your app, complete the following steps on Casdoor:
1. Add your GitLab redirect URL. For example, if your GitLab domain is `gitlab.example.com`, ensure the Casdoor app has the following
`Redirect URI`: `https://gitlab.example.com/users/auth/openid_connect/callback`.
-See the [Casdoor documentation](https://casdoor.org/docs/integration/gitlab/) for more details.
+See the [Casdoor documentation](https://casdoor.org/docs/integration/gitlab) for more details.
Example Omnibus GitLab configuration (file path: `/etc/gitlab/gitlab.rb`):
diff --git a/doc/administration/consul.md b/doc/administration/consul.md
index e1f2bd90e05..e282960c857 100644
--- a/doc/administration/consul.md
+++ b/doc/administration/consul.md
@@ -80,14 +80,14 @@ Nodes should be:
- Upgraded one node at a time.
Identify any existing health issues in the cluster by running the following command
-within each node. The command will return an empty array if the cluster is healthy:
+in each node. The command returns an empty array if the cluster is healthy:
```shell
curl "http://127.0.0.1:8500/v1/health/state/critical"
```
-If the Consul version has changed, you'll see a notice at the end of `gitlab-ctl reconfigure`
-informing you that Consul needs to be restarted for the new version to be used.
+If the Consul version has changed, you see a notice at the end of `gitlab-ctl reconfigure`
+informing you that Consul must be restarted for the new version to be used.
Restart Consul one node at a time:
@@ -96,7 +96,7 @@ sudo gitlab-ctl restart consul
```
Consul nodes communicate using the raft protocol. If the current leader goes
-offline, there needs to be a leader election. A leader node must exist to facilitate
+offline, there must be a leader election. A leader node must exist to facilitate
synchronization across the cluster. If too many nodes go offline at the same time,
the cluster loses quorum and doesn't elect a leader due to
[broken consensus](https://www.consul.io/docs/architecture/consensus).
@@ -111,7 +111,7 @@ bundled Consul wasn't used by any process other than GitLab itself, you can
## Troubleshooting Consul
-Below are some useful operations should you need to debug any issues.
+Below are some operations should you debug any issues.
You can see any error logs by running:
```shell
@@ -149,7 +149,7 @@ To be safe, it's recommended that you only restart Consul in one node at a time
ensure the cluster remains intact. For larger clusters, it is possible to restart
multiple nodes at a time. See the
[Consul consensus document](https://www.consul.io/docs/architecture/consensus#deployment-table)
-for the number of failures it can tolerate. This will be the number of simultaneous
+for the number of failures it can tolerate. This is the number of simultaneous
restarts it can sustain.
To restart Consul:
diff --git a/doc/administration/docs_self_host.md b/doc/administration/docs_self_host.md
index 338601a054f..3f5d4adc95c 100644
--- a/doc/administration/docs_self_host.md
+++ b/doc/administration/docs_self_host.md
@@ -149,7 +149,7 @@ To extract the HTML files of the Docs site:
docker cp gitlab-docs:/usr/share/nginx/html /srv/gitlab/
```
- You will end up with a `/srv/gitlab/html/` directory that holds the documentation website.
+ You end up with a `/srv/gitlab/html/` directory that holds the documentation website.
1. Remove the container:
diff --git a/doc/administration/encrypted_configuration.md b/doc/administration/encrypted_configuration.md
index 38f033e260a..a96a4c4405d 100644
--- a/doc/administration/encrypted_configuration.md
+++ b/doc/administration/encrypted_configuration.md
@@ -14,12 +14,12 @@ GitLab can read settings for certain features from encrypted settings files. The
- [LDAP `bind_dn` and `password`](auth/ldap/index.md#use-encrypted-credentials).
- [SMTP `user_name` and `password`](raketasks/smtp.md#secrets).
-In order to enable the encrypted configuration settings, a new base key needs to be generated for
+To enable the encrypted configuration settings, a new base key must be generated for
`encrypted_settings_key_base`. The secret can be generated in the following ways:
**Omnibus Installation**
-Starting with 13.7 the new secret is automatically generated for you, but you need to ensure your
+Starting with 13.7 the new secret is automatically generated for you, but you must ensure your
`/etc/gitlab/gitlab-secrets.json` contains the same values on all nodes.
**GitLab Cloud Native Helm Chart**
diff --git a/doc/administration/feature_flags.md b/doc/administration/feature_flags.md
index 8a021c6d588..77f7f621a07 100644
--- a/doc/administration/feature_flags.md
+++ b/doc/administration/feature_flags.md
@@ -64,7 +64,7 @@ the status of the flag and the command to enable or disable it.
### Start the GitLab Rails console
-The first thing you need to enable or disable a feature behind a flag is to
+The first thing you must do to enable or disable a feature behind a flag is to
start a session on GitLab Rails console.
For Omnibus installations:
@@ -83,7 +83,7 @@ For details, see [starting a Rails console session](operations/rails_console.md#
### Enable or disable the feature
-Once the Rails console session has started, run the `Feature.enable` or
+After the Rails console session has started, run the `Feature.enable` or
`Feature.disable` commands accordingly. The specific flag can be found
in the feature's documentation itself.
@@ -123,11 +123,11 @@ For example, to enable the [`:product_analytics`](../operations/product_analytic
Feature.enable(:product_analytics, Project.find(1234))
```
-`Feature.enable` and `Feature.disable` always return `nil`, this is not an indication that the command failed:
+`Feature.enable` and `Feature.disable` always return `true`, even if the application doesn't use the flag:
```ruby
irb(main):001:0> Feature.enable(:my_awesome_feature)
-=> nil
+=> true
```
When the feature is ready, GitLab removes the feature flag, and the option for
@@ -159,7 +159,7 @@ Feature.all
### Unset feature flag
-You can unset a feature flag so that GitLab will fall back to the current defaults for that flag:
+You can unset a feature flag so that GitLab falls back to the current defaults for that flag:
```ruby
Feature.remove(:my_awesome_feature)
diff --git a/doc/administration/geo/disaster_recovery/background_verification.md b/doc/administration/geo/disaster_recovery/background_verification.md
index 57f8664ba11..97c9a6c5576 100644
--- a/doc/administration/geo/disaster_recovery/background_verification.md
+++ b/doc/administration/geo/disaster_recovery/background_verification.md
@@ -13,29 +13,25 @@ disable or enable this feature manually by following
[these instructions](#disabling-or-enabling-the-automatic-background-verification).
Automatic background verification ensures that the transferred data matches a
-calculated checksum. If the checksum of the data on the **primary** node matches checksum of the
-data on the **secondary** node, the data transferred successfully. Following a planned failover,
+calculated checksum. If the checksum of the data on the **primary** site matches checksum of the
+data on the **secondary** site, the data transferred successfully. Following a planned failover,
any corrupted data may be **lost**, depending on the extent of the corruption.
-If verification fails on the **primary** node, this indicates Geo is replicating a corrupted object.
-You can restore it from backup or remove it from the **primary** node to resolve the issue.
+If verification fails on the **primary** site, this indicates Geo is replicating a corrupted object.
+You can restore it from backup or remove it from the **primary** site to resolve the issue.
-If verification succeeds on the **primary** node but fails on the **secondary** node,
+If verification succeeds on the **primary** site but fails on the **secondary** site,
this indicates that the object was corrupted during the replication process.
Geo actively try to correct verification failures marking the repository to
be resynced with a back-off period. If you want to reset the verification for
these failures, so you should follow [these instructions](background_verification.md#reset-verification-for-projects-where-verification-has-failed).
If verification is lagging significantly behind replication, consider giving
-the node more time before scheduling a planned failover.
+the site more time before scheduling a planned failover.
## Disabling or enabling the automatic background verification
-Run the following commands in a Rails console on the **primary** node:
-
-```shell
-gitlab-rails console
-```
+Run the following commands in a [Rails console](../../operations/rails_console.md) on a **Rails node on the primary** site.
To check if automatic background verification is enabled:
@@ -57,33 +53,33 @@ Feature.enable('geo_repository_verification')
## Repository verification
-On the **primary** node:
+On the **primary** site:
1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Geo > Nodes**.
-1. Expand **Verification information** tab for that node to view automatic checksumming
+1. On the left sidebar, select **Geo > Sites**.
+1. Expand **Verification information** tab for that site to view automatic checksumming
status for repositories and wikis. Successes are shown in green, pending work
in gray, and failures in red.
![Verification status](img/verification_status_primary_v14_0.png)
-On the **secondary** node:
+On the **secondary** site:
1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Geo > Nodes**.
-1. Expand **Verification information** tab for that node to view automatic checksumming
+1. On the left sidebar, select **Geo > Sites**.
+1. Expand **Verification information** tab for that site to view automatic checksumming
status for repositories and wikis. Successes are shown in green, pending work
in gray, and failures in red.
![Verification status](img/verification_status_secondary_v14_0.png)
-## Using checksums to compare Geo nodes
+## Using checksums to compare Geo sites
-To check the health of Geo **secondary** nodes, we use a checksum over the list of
+To check the health of Geo **secondary** sites, we use a checksum over the list of
Git references and their values. The checksum includes `HEAD`, `heads`, `tags`,
-`notes`, and GitLab-specific references to ensure true consistency. If two nodes
+`notes`, and GitLab-specific references to ensure true consistency. If two sites
have the same checksum, then they definitely hold the same references. We compute
-the checksum for every node after every update to make sure that they are all
+the checksum for every site after every update to make sure that they are all
in sync.
## Repository re-verification
@@ -95,22 +91,17 @@ data. The default and recommended re-verification interval is 7 days, though
an interval as short as 1 day can be set. Shorter intervals reduce risk but
increase load and vice versa.
-On the **primary** node:
+On the **primary** site:
1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Geo > Nodes**.
-1. Select **Edit** for the **primary** node to customize the minimum
+1. On the left sidebar, select **Geo > Sites**.
+1. Select **Edit** for the **primary** site to customize the minimum
re-verification interval:
![Re-verification interval](img/reverification-interval.png)
The automatic background re-verification is enabled by default, but you can
-disable if you need. Run the following commands in a Rails console on the
-**primary** node:
-
-```shell
-gitlab-rails console
-```
+disable if you need. Run the following commands in a [Rails console](../../operations/rails_console.md) on a **Rails node on the primary** site:
To disable automatic background re-verification:
@@ -126,11 +117,13 @@ Feature.enable('geo_repository_reverification')
## Reset verification for projects where verification has failed
-Geo actively try to correct verification failures marking the repository to
+Geo actively tries to correct verification failures marking the repository to
be resynced with a back-off period. If you want to reset them manually, this
Rake task marks projects where verification has failed or the checksum mismatch
to be resynced without the back-off period:
+Run the appropriate commands on a **Rails node on the primary** site.
+
For repositories:
```shell
@@ -145,9 +138,9 @@ sudo gitlab-rake geo:verification:wiki:reset
## Reconcile differences with checksum mismatches
-If the **primary** and **secondary** nodes have a checksum verification mismatch, the cause may not be apparent. To find the cause of a checksum mismatch:
+If the **primary** and **secondary** sites have a checksum verification mismatch, the cause may not be apparent. To find the cause of a checksum mismatch:
-1. On the **primary** node:
+1. On the **primary** site:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Overview > Projects**.
1. Find the project that you want to check the checksum differences and
@@ -157,31 +150,32 @@ If the **primary** and **secondary** nodes have a checksum verification mismatch
![Project administration page](img/checksum-differences-admin-project-page.png)
-1. Go to the project's repository directory on both **primary** and **secondary** nodes
- (the path is usually `/var/opt/gitlab/git-data/repositories`). If `git_data_dirs`
+1. On a **Gitaly node on the primary** site and a **Gitaly node on the secondary** site, go to the project's repository directory. If using Gitaly Cluster, [check that it is in a healthy state](../../gitaly/troubleshooting.md#check-cluster-health) prior to running these commands.
+
+ The default path is `/var/opt/gitlab/git-data/repositories`. If `git_data_dirs`
is customized, check the directory layout on your server to be sure:
```shell
cd /var/opt/gitlab/git-data/repositories
```
-1. Run the following command on the **primary** node, redirecting the output to a file:
+ 1. Run the following command on the **primary** site, redirecting the output to a file:
- ```shell
- git show-ref --head | grep -E "HEAD|(refs/(heads|tags|keep-around|merge-requests|environments|notes)/)" > primary-node-refs
- ```
+ ```shell
+ git show-ref --head | grep -E "HEAD|(refs/(heads|tags|keep-around|merge-requests|environments|notes)/)" > primary-site-refs
+ ```
-1. Run the following command on the **secondary** node, redirecting the output to a file:
+ 1. Run the following command on the **secondary** site, redirecting the output to a file:
- ```shell
- git show-ref --head | grep -E "HEAD|(refs/(heads|tags|keep-around|merge-requests|environments|notes)/)" > secondary-node-refs
- ```
+ ```shell
+ git show-ref --head | grep -E "HEAD|(refs/(heads|tags|keep-around|merge-requests|environments|notes)/)" > secondary-site-refs
+ ```
-1. Copy the files from the previous steps on the same system, and do a diff between the contents:
+ 1. Copy the files from the previous steps on the same system, and do a diff between the contents:
- ```shell
- diff primary-node-refs secondary-node-refs
- ```
+ ```shell
+ diff primary-site-refs secondary-site-refs
+ ```
## Current limitations
@@ -191,10 +185,10 @@ progress to include them in [Geo: Verify all replicated data](https://gitlab.com
For now, you can verify their integrity
manually by following [these instructions](../../raketasks/check.md) on both
-nodes, and comparing the output between them.
+sites, and comparing the output between them.
In GitLab EE 12.1, Geo calculates checksums for attachments, LFS objects, and
-archived traces on secondary nodes after the transfer, compares it with the
+archived traces on secondary sites after the transfer, compares it with the
stored checksums, and rejects transfers if mismatched. Geo
currently does not support an automatic way to verify these data if they have
been synced before GitLab EE 12.1.
diff --git a/doc/administration/geo/disaster_recovery/index.md b/doc/administration/geo/disaster_recovery/index.md
index e5b9a14cfbd..f457cb4b0a2 100644
--- a/doc/administration/geo/disaster_recovery/index.md
+++ b/doc/administration/geo/disaster_recovery/index.md
@@ -413,7 +413,7 @@ required:
1. Promote the replica database associated with the **secondary** site. This
sets the database to read-write. The instructions vary depending on where your database is hosted:
- [Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html#USER_ReadRepl.Promote)
- - [Azure PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/howto-read-replicas-portal#stop-replication)
+ - [Azure PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/single-server/how-to-read-replicas-portal#stop-replication)
- [Google Cloud SQL](https://cloud.google.com/sql/docs/mysql/replication/manage-replicas#promote-replica)
- For other external PostgreSQL databases, save the following script in your
secondary site, for example `/tmp/geo_promote.sh`, and modify the connection
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index c351b4031b5..5a5d896c20a 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -60,8 +60,8 @@ Alternatively, you can [back up](../../../raketasks/backup_restore.md#back-up-gi
the container registry on the primary site and restore it onto the secondary
site:
-1. On your primary site, back up only the registry and [exclude specific directories
-from the backup](../../../raketasks/backup_restore.md#excluding-specific-directories-from-the-backup):
+1. On your primary site, back up only the registry and
+ [exclude specific directories from the backup](../../../raketasks/backup_gitlab.md#excluding-specific-directories-from-the-backup):
```shell
# Create a backup in the /var/opt/gitlab/backups folder
diff --git a/doc/administration/geo/index.md b/doc/administration/geo/index.md
index c5472e412d3..cf7d2649142 100644
--- a/doc/administration/geo/index.md
+++ b/doc/administration/geo/index.md
@@ -123,7 +123,7 @@ The following are required to run Geo:
- PostgreSQL 13 is not supported for Geo, see [epic 3832](https://gitlab.com/groups/gitlab-org/-/epics/3832)
- Git 2.9 or later
- Git-lfs 2.4.2 or later on the user side when using LFS
-- All sites must run the same GitLab version.
+- All sites must run [the same GitLab and PostgreSQL versions](setup/database.md#postgresql-replication).
Additionally, check the GitLab [minimum requirements](../../install/requirements.md),
and we recommend you use the latest version of GitLab for a better experience.
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index 043b96478c9..7666a450648 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -12,7 +12,9 @@ type: howto
NOTE:
This is the final step in setting up a **secondary** Geo site. Stages of the
setup process must be completed in the documented order.
-Before attempting the steps in this stage, [complete all prior stages](../setup/index.md#using-omnibus-gitlab).
+If not, [complete all prior stages](../setup/index.md#using-omnibus-gitlab) before procceed.
+
+Make sure you [set up the database replication](../setup/database.md), and [configured fast lookup of authorized SSH keys](../../operations/fast_ssh_key_lookup.md) in **both primary and secondary sites**.
The basic steps of configuring a **secondary** site are to:
@@ -318,7 +320,7 @@ the **primary** site. After you sign in:
1. Verify that it's correctly identified as a **secondary** Geo site, and that
Geo is enabled.
-The initial replication, or 'backfill', is probably still in progress. You
+The initial replication may take some time. The status of the site or the ‘backfill’ may still in progress. You
can monitor the synchronization process on each Geo site from the **primary**
site's **Geo Sites** dashboard in your browser.
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index e49d5260233..acd27d5feed 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -202,8 +202,8 @@ successfully, you must replicate their data using some other means.
|[External merge request diffs](../../merge_request_diffs.md) | **Yes** (13.5) | **Yes** (14.6) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | Replication is behind the feature flag `geo_merge_request_diff_replication`, enabled by default. Verification was behind the feature flag `geo_merge_request_diff_verification`, removed in 14.7.|
|[Versioned snippets](../../../user/snippets.md#versioned-snippets) | [**Yes** (13.7)](https://gitlab.com/groups/gitlab-org/-/epics/2809) | [**Yes** (14.2)](https://gitlab.com/groups/gitlab-org/-/epics/2810) | N/A | N/A | Verification was implemented behind the feature flag `geo_snippet_repository_verification` in 13.11, and the feature flag was removed in 14.2. |
|[GitLab Pages](../../pages/index.md) | [**Yes** (14.3)](https://gitlab.com/groups/gitlab-org/-/epics/589) | **Yes** (14.6) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | Behind feature flag `geo_pages_deployment_replication`, enabled by default. Verification was behind the feature flag `geo_pages_deployment_verification`, removed in 14.7. |
-|[Incident Metric Images](../../../operations/incident_management/incidents.md#metrics) | [Planned](https://gitlab.com/gitlab-org/gitlab/-/issues/352326) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/362561) | No | No | |
-|[Alert Metric Images](../../../operations/incident_management/alerts.md#metrics-tab) | [Planned](https://gitlab.com/gitlab-org/gitlab/-/issues/352326) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/362561) | No | No | |
+|[Incident Metric Images](../../../operations/incident_management/incidents.md#metrics) | [Planned](https://gitlab.com/gitlab-org/gitlab/-/issues/362561) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/362561) | No | No | |
+|[Alert Metric Images](../../../operations/incident_management/alerts.md#metrics-tab) | [Planned](https://gitlab.com/gitlab-org/gitlab/-/issues/362564) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/362564) | No | No | |
|[Server-side Git hooks](../../server_hooks.md) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/1867) | No | N/A | N/A | Not planned because of current implementation complexity, low customer interest, and availability of alternatives to hooks. |
|[Elasticsearch integration](../../../integration/elasticsearch.md) | [Not planned](https://gitlab.com/gitlab-org/gitlab/-/issues/1186) | No | No | No | Not planned because further product discovery is required and Elasticsearch (ES) clusters can be rebuilt. Secondaries use the same ES cluster as the primary. |
|[Dependency proxy images](../../../user/packages/dependency_proxy/index.md) | [Not planned](https://gitlab.com/gitlab-org/gitlab/-/issues/259694) | No | No | No | Blocked by [Geo: Secondary Mimicry](https://gitlab.com/groups/gitlab-org/-/epics/1528). Replication of this cache is not needed for disaster recovery purposes because it can be recreated from external sources. |
diff --git a/doc/administration/geo/replication/object_storage.md b/doc/administration/geo/replication/object_storage.md
index dd1f982b3a1..d2e10678f8c 100644
--- a/doc/administration/geo/replication/object_storage.md
+++ b/doc/administration/geo/replication/object_storage.md
@@ -34,8 +34,7 @@ See [Object storage replication tests](geo_validation_tests.md#object-storage-re
## Enabling GitLab-managed object storage replication
-> The beta feature was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10586) in GitLab 12.4.
-> The feature was made [generally available] in GitLab 15.1.
+> The feature was made [generally available](https://gitlab.com/groups/gitlab-org/-/epics/5551) in GitLab 15.1.
**Secondary** sites can replicate files stored on the **primary** site regardless of
whether they are stored on the local file system or in object storage.
@@ -79,7 +78,7 @@ the bucket used by **secondary** sites.
If you are using Google Cloud Storage, consider using
[Multi-Regional Storage](https://cloud.google.com/storage/docs/storage-classes#multi-regional).
-Or you can use the [Storage Transfer Service](https://cloud.google.com/storage-transfer/docs/),
+Or you can use the [Storage Transfer Service](https://cloud.google.com/storage-transfer/docs/overview),
although this only supports daily synchronization.
For manual synchronization, or scheduled by `cron`, see:
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index bb7dbef214b..082ecbbb208 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -183,7 +183,7 @@ This machine's Geo node name matches a database record ... no
```
Learn more about recommended site names in the description of the Name field in
-[Geo Admin Area Common Settings](../../../user/admin_area/geo_nodes.md#common-settings).
+[Geo Admin Area Common Settings](../../../user/admin_area/geo_sites.md#common-settings).
### Message: `WARNING: oldest xmin is far in the past` and `pg_wal` size growing
@@ -519,7 +519,7 @@ To solve this:
curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<first_failed_geo_sync_ID>"
```
-1. Enter the [Rails console](../../troubleshooting/navigating_gitlab_via_rails_console.md) and run:
+1. Enter the [Rails console](../../operations/rails_console.md) and run:
```ruby
failed_geo_syncs = Geo::ProjectRegistry.failed.pluck(:id)
@@ -651,8 +651,11 @@ to start again from scratch, there are a few steps that can help you:
1. Reset the Tracking Database.
+ WARNING:
+ If you skipped the optional step 3, be sure both `geo-postgresql` and `postgresql` services are running.
+
```shell
- gitlab-rake db:drop:geo # on a secondary app node
+ gitlab-rake db:drop:geo DISABLE_DATABASE_ENVIRONMENT_CHECK=1 # on a secondary app node
gitlab-ctl reconfigure # on the tracking database node
gitlab-rake db:migrate:geo # on a secondary app node
```
@@ -805,7 +808,7 @@ You can work around this by marking the objects as synced and succeeded verifica
be aware that can also mark objects that may be
[missing from the primary](#missing-files-on-the-geo-primary-site).
-To do that, enter the [Rails console](../../troubleshooting/navigating_gitlab_via_rails_console.md)
+To do that, enter the [Rails console](../../operations/rails_console.md)
and run:
```ruby
@@ -817,16 +820,16 @@ end
### Message: curl 18 transfer closed with outstanding read data remaining & fetch-pack: unexpected disconnect while reading sideband packet
-Unstable networking conditions can cause Gitaly to fail when trying to fetch large repository
+Unstable networking conditions can cause Gitaly to fail when trying to fetch large repository
data from the primary site. This is more likely to happen if a repository has to be
replicated from scratch between sites.
Geo retries several times, but if the transmission is consistently interrupted
-by network hiccups, an alternative method such as `rsync` can be used to circumvent `git` and
+by network hiccups, an alternative method such as `rsync` can be used to circumvent `git` and
create the initial copy of any repository that fails to be replicated by Geo.
We recommend transferring each failing repository individually and checking for consistency
-after each transfer. Follow the [single target `rsync` instructions](../../operations/moving_repositories.md#single-rsync-to-another-server)
+after each transfer. Follow the [single target `rsync` instructions](../../operations/moving_repositories.md#single-rsync-to-another-server)
to transfer each affected repository from the primary to the secondary site.
## Fixing errors during a failover or when promoting a secondary to a primary node
diff --git a/doc/administration/geo/secondary_proxy/index.md b/doc/administration/geo/secondary_proxy/index.md
index 9a1aab8c238..e8c290e197b 100644
--- a/doc/administration/geo/secondary_proxy/index.md
+++ b/doc/administration/geo/secondary_proxy/index.md
@@ -124,7 +124,7 @@ sudo gitlab-rails runner "Feature.disable(:geo_secondary_proxy_separate_urls)"
```
In Kubernetes, you can run the same command in the toolbox pod. Refer to the
-[Kubernetes cheat sheet](../../troubleshooting/kubernetes_cheat_sheet.md#gitlab-specific-kubernetes-information)
+[Kubernetes cheat sheet](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html#gitlab-specific-kubernetes-information)
for details.
## Limitations
diff --git a/doc/administration/geo/setup/database.md b/doc/administration/geo/setup/database.md
index 7dfca4c8f73..c0ed7829fce 100644
--- a/doc/administration/geo/setup/database.md
+++ b/doc/administration/geo/setup/database.md
@@ -17,8 +17,11 @@ PostgreSQL instances, the Omnibus roles cannot perform all necessary
configuration steps. In this case, use the [Geo with external PostgreSQL instances](external_database.md)
process instead.
+NOTE:
The stages of the setup process must be completed in the documented order.
-Before you attempt the steps in this stage, [complete all prior stages](../setup/index.md#using-omnibus-gitlab).
+If not, [complete all prior stages](../setup/index.md#using-omnibus-gitlab) before proceeding.
+
+Ensure the **secondary** site is running the same version of GitLab Enterprise Edition as the **primary** site. Confirm you have added the [premium or higher licenses](https://about.gitlab.com/pricing/) to your **primary** site.
Be sure to read and review all of these steps before you execute them in your
testing or production environments.
@@ -52,8 +55,9 @@ The following guide assumes that:
which includes the [`pg_basebackup` tool](https://www.postgresql.org/docs/12/app-pgbasebackup.html).
- You have a **primary** node already set up (the GitLab server you are
replicating from), running Omnibus' PostgreSQL (or equivalent version), and
- you have a new **secondary** server set up with the same versions of the OS,
- PostgreSQL, and GitLab on all nodes.
+ you have a new **secondary** server set up with the same
+ [versions of PostgreSQL](../index.md#requirements-for-running-geo),
+ OS, and GitLab on all nodes.
WARNING:
Geo works with streaming replication. Logical replication is not supported at this time.
@@ -478,7 +482,7 @@ data before running `pg_basebackup`.
```shell
gitlab-ctl replicate-geo-database \
--slot-name=<secondary_node_name> \
- --host=<primary_node_ip>
+ --host=<primary_node_ip> \
--sslmode=verify-ca
```
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index 7e8ffa829f9..b87baa658a1 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -10,14 +10,19 @@ This document is relevant if you are using a PostgreSQL instance that is *not
managed by Omnibus*. This includes cloud-managed instances like Amazon RDS, or
manually installed and configured PostgreSQL instances.
+Ensure that you are using one of the PostgreSQL versions that
+[Omnibus ships with](../../package_information/postgresql_versions.md)
+to [avoid version mismatches](../index.md#requirements-for-running-geo)
+in case a Geo site has to be rebuilt.
+
NOTE:
We strongly recommend running Omnibus-managed instances as they are actively
developed and tested. We aim to be compatible with most external
(not managed by Omnibus) databases but we do not guarantee compatibility.
-## **Primary** node
+## **Primary** site
-1. SSH into a GitLab **primary** application server and login as root:
+1. SSH into a **Rails node on your primary** site and login as root:
```shell
sudo -i
@@ -39,13 +44,13 @@ developed and tested. We aim to be compatible with most external
gitlab_rails['geo_node_name'] = '<site_name_here>'
```
-1. Reconfigure the **primary** node for the change to take effect:
+1. Reconfigure the **Rails node** for the change to take effect:
```shell
gitlab-ctl reconfigure
```
-1. Execute the command below to define the node as **primary** node:
+1. Execute the command below on the **Rails node** to define the site as **primary** site:
```shell
gitlab-ctl set-geo-primary-node
@@ -62,10 +67,10 @@ To set up an external database, you can either:
#### Leverage your cloud provider's tools to replicate the primary database
-Given you have a primary node set up on AWS EC2 that uses RDS.
+Given you have a primary site set up on AWS EC2 that uses RDS.
You can now just create a read-only replica in a different region and the
replication process is managed by AWS. Make sure you've set Network ACL (Access Control List), Subnet, and
-Security Group according to your needs, so the secondary application node can access the database.
+Security Group according to your needs, so the secondary Rails node(s) can access the database.
The following instructions detail how to create a read-only replica for common
cloud providers:
@@ -74,7 +79,7 @@ cloud providers:
- Azure Database for PostgreSQL - [Create and manage read replicas in Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/single-server/how-to-read-replicas-portal)
- Google Cloud SQL - [Creating read replicas](https://cloud.google.com/sql/docs/postgres/replication/create-replica)
-Once your read-only replica is set up, you can skip to [configure your secondary application node](#configure-secondary-application-nodes-to-use-the-external-read-replica).
+Once your read-only replica is set up, you can skip to [configure your secondary site](#configure-secondary-site-to-use-the-external-read-replica)
#### Manually configure the primary database for replication
@@ -107,7 +112,7 @@ max_replication_slots = 1 # number of secondary instances
hot_standby = on
```
-## **Secondary** nodes
+## **Secondary** sites
### Manually configure the replica database
@@ -136,7 +141,7 @@ wal_keep_segments = 10
hot_standby = on
```
-### Configure **secondary** application nodes to use the external read-replica
+### Configure **secondary** site to use the external read-replica
With Omnibus, the
[`geo_secondary_role`](https://docs.gitlab.com/omnibus/roles/#gitlab-geo-roles)
@@ -148,7 +153,7 @@ has three main functions:
To configure the connection to the external read-replica database and enable Log Cursor:
-1. SSH into a GitLab **secondary** application server and login as root:
+1. SSH into each **Rails, Sidekiq and Geo Log Cursor** node on your **secondary** site and login as root:
```shell
sudo -i
@@ -179,7 +184,7 @@ To configure the connection to the external read-replica database and enable Log
### Configure the tracking database
-**Secondary** nodes use a separate PostgreSQL installation as a tracking
+**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.
@@ -209,7 +214,7 @@ the tracking database on port 5432.
[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
+ site 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 f4c21293782..5ddfee6774e 100644
--- a/doc/administration/geo/setup/index.md
+++ b/doc/administration/geo/setup/index.md
@@ -12,21 +12,25 @@ These instructions assume you have a working instance of GitLab. They guide you
1. Making your existing instance the **primary** site.
1. Adding **secondary** sites.
+You must use a [GitLab Premium](https://about.gitlab.com/pricing/) license or higher,
+but you only need one license for all the sites.
+
WARNING:
-The steps below should be followed in the order they appear. **Make sure the GitLab version is the same on all sites.**
+The steps below should be followed in the order they appear. **Make sure the GitLab version is the same on all sites. Do not create an account or log in to the new secondary.**
## 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 nodes that serve as the **secondary** site. Do not create an account or log in to the new **secondary** site. The **GitLab version must match** across primary and secondary sites.
+1. [Install GitLab Enterprise Edition](https://about.gitlab.com/install/) on the nodes that serve as the **secondary** site. **Do not create an account or log in** to the new **secondary** site. The **GitLab version must match** across primary and secondary sites.
1. [Add 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** sites.
1. [Configure GitLab](../replication/configuration.md) to set the **primary** and **secondary** sites.
+1. Optional: [Configure Object storage](../../object_storage.md)
1. Optional: [Configure a secondary LDAP server](../../auth/ldap/index.md) for the **secondary** sites. See [notes on LDAP](../index.md#ldap).
+1. Optional: [Configure Geo secondary proxying](../secondary_proxy/index.md) to use a single, unified URL for all Geo sites. This step is recommended to accelerate most read requests while transparently proxying writes to the primary Geo site.
1. Follow the [Using a Geo Site](../replication/usage.md) guide.
-1. [Configure Geo secondary proxying](../secondary_proxy/index.md) to use a single, unified URL for all Geo sites. This step is recommended to accelerate most read requests while transparently proxying writes to the primary Geo site.
## Post-installation documentation
diff --git a/doc/administration/gitaly/configure_gitaly.md b/doc/administration/gitaly/configure_gitaly.md
index 426d07b154d..4b2832bebc0 100644
--- a/doc/administration/gitaly/configure_gitaly.md
+++ b/doc/administration/gitaly/configure_gitaly.md
@@ -1,5 +1,5 @@
---
-stage: Create
+stage: Systems
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
---
@@ -130,57 +130,49 @@ Install Gitaly on each Gitaly server using either Omnibus GitLab or install it f
- To install from source, follow the steps at
[Install Gitaly](../../install/installation.md#install-gitaly).
-### Configure authentication
+### Configure Gitaly servers
-Gitaly and GitLab use two shared secrets for authentication:
+To configure Gitaly servers, you must:
-- One to authenticate gRPC requests to Gitaly.
-- A second for authentication callbacks from GitLab Shell to the GitLab internal API.
+- Configure authentication.
+- Configure storage paths.
+- Enable the network listener.
-**For Omnibus GitLab**
+The `git` user must be able to read, write, and set permissions on the configured storage path.
-To configure the Gitaly token:
+To avoid downtime while rotating Gitaly's token, you can temporarily disable authentication using the `gitaly['auth_transitioning']` setting. For more information, see the documentation on
+[enabling "auth transitioning mode"](#enable-auth-transitioning-mode).
-1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
+#### Configure authentication
- ```ruby
- gitlab_rails['gitaly_token'] = 'abc123secret'
- ```
+Gitaly and GitLab use two shared secrets for authentication:
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly server, edit `/etc/gitlab/gitlab.rb`:
+- _Gitaly token_: used to authenticate gRPC requests to Gitaly
+- _GitLab Shell token_: used for authentication callbacks from GitLab Shell to the GitLab internal API
+
+**For Omnibus GitLab**
+
+To configure the _Gitaly token_, edit `/etc/gitlab/gitlab.rb`:
```ruby
gitaly['auth_token'] = 'abc123secret'
```
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-There are two ways to configure the GitLab Shell token.
+There are two ways to configure the _GitLab Shell token_.
-Method 1:
+Method 1 (recommended):
-1. Copy `/etc/gitlab/gitlab-secrets.json` from the Gitaly client to same path on the Gitaly servers
+Copy `/etc/gitlab/gitlab-secrets.json` from the Gitaly client to same path on the Gitaly servers
(and any other Gitaly clients).
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) on Gitaly servers.
Method 2:
-1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
+Edit `/etc/gitlab/gitlab.rb`:
```ruby
gitlab_shell['secret_token'] = 'shellsecret'
```
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly servers, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_shell['secret_token'] = 'shellsecret'
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
**For installations from source**
1. Copy `/home/git/gitlab/.gitlab_shell_secret` from the Gitaly client to the same path on the
@@ -203,14 +195,7 @@ Method 2:
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-### Configure Gitaly servers
-
-On the Gitaly servers, you must configure storage paths and enable the network listener.
-The Gitaly server must be able to read, write, and set permissions on the configured path.
-
-If you want to reduce the risk of downtime when you enable authentication, you can temporarily
-disable enforcement. For more information, see the documentation on configuring
-[Gitaly authentication](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/configuration/README.md#authentication).
+#### Configure Gitaly server
**For Omnibus GitLab**
@@ -904,7 +889,7 @@ gitaly['cgroups_repositories_cpu_shares'] => 512
which represents 100% of CPU. This value cannot exceed that of the top
level`cgroups_cpu_shares`.
-#### Configure cgroups (legacy method)
+#### Configure cgroups (legacy method)
To configure cgroups in Gitaly for GitLab versions using the legacy method, add `gitaly['cgroups']` to `/etc/gitlab/gitlab.rb`. For
example:
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index 160313073a5..c543f62f135 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -1,5 +1,5 @@
---
-stage: Create
+stage: Systems
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
---
@@ -71,7 +71,7 @@ the current status of these issues, please refer to the referenced issues and ep
| Issue | Summary | How to avoid |
|:--------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------|
| Gitaly Cluster + Geo - Issues retrying failed syncs | If Gitaly Cluster is used on a Geo secondary site, repositories that have failed to sync could continue to fail when Geo tries to resync them. Recovering from this state requires assistance from support to run manual steps. Work is in-progress to update Gitaly Cluster to [identify repositories with a unique and persistent identifier](https://gitlab.com/gitlab-org/gitaly/-/issues/3485), which is expected to resolve the issue. | No known solution at this time. |
-| Praefect unable to insert data into the database due to migrations not being applied after an upgrade | If the database is not kept up to date with completed migrations, then the Praefect node is unable to perform normal operation. | Make sure the Praefect database is up and running with all migrations completed (For example: `/opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate-status` should show a list of all applied migrations). Consider [requesting live upgrade assistance](https://about.gitlab.com/support/scheduling-upgrade-assistance/) so your upgrade plan can be reviewed by support. |
+| Praefect unable to insert data into the database due to migrations not being applied after an upgrade | If the database is not kept up to date with completed migrations, then the Praefect node is unable to perform normal operation. | Make sure the Praefect database is up and running with all migrations completed (For example: `/opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate-status` should show a list of all applied migrations). Consider [requesting upgrade assistance](https://about.gitlab.com/support/scheduling-upgrade-assistance/) so your upgrade plan can be reviewed by support. |
| Restoring a Gitaly Cluster node from a snapshot in a running cluster | Because the Gitaly Cluster runs with consistent state, introducing a single node that is behind will result in the cluster not being able to reconcile the nodes data and other nodes data | Don't restore a single Gitaly Cluster node from a backup snapshot. If you must restore from backup, it's best to snapshot all Gitaly Cluster nodes at the same time and take a database dump of the Praefect database. |
### Snapshot backup and recovery limitations
@@ -523,6 +523,48 @@ For more information on configuring Gitaly Cluster, see [Configure Gitaly Cluste
To upgrade a Gitaly Cluster, follow the documentation for
[zero downtime upgrades](../../update/zero_downtime.md#gitaly-or-gitaly-cluster).
+### Downgrade Gitaly Cluster to a previous version
+
+If you need to roll back a Gitaly Cluster to an earlier version, some Praefect database migrations may need to be reverted. In a cluster with:
+
+- A single Praefect node, this happens when GitLab itself is downgraded.
+- Multiple Praefect nodes, additional steps are required.
+
+To downgrade a Gitaly Cluster with multiple Praefect nodes:
+
+1. Stop the Praefect service on all Praefect nodes:
+
+ ```shell
+ gitlab-ctl stop praefect
+ ```
+
+1. Downgrade the GitLab package to the older version on one of the Praefect nodes.
+1. On the downgraded node, check the state of Praefect migrations:
+
+ ```shell
+ /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate-status
+ ```
+
+1. Count the number of migrations with `unknown migration` in the `APPLIED` column.
+1. On a Praefect node that has **not** been downgraded, perform a dry run of the rollback to validate which migrations to revert. `<CT_UNKNOWN>`
+ is the number of unknown migrations reported by the downgraded node.
+
+ ```shell
+ /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate <CT_UNKNOWN>
+ ```
+
+1. If the results look correct, run the same command with the `-f` option to revert the migrations:
+
+ ```shell
+ /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate -f <CT_UNKNOWN>
+ ```
+
+1. Downgrade the GitLab package on the remaining Praefect nodes and start the Praefect service again:
+
+ ```shell
+ gitlab-ctl start praefect
+ ```
+
## Migrate to Gitaly Cluster
WARNING:
diff --git a/doc/administration/gitaly/monitoring.md b/doc/administration/gitaly/monitoring.md
index ac0c4cf139d..0dd9e0d7128 100644
--- a/doc/administration/gitaly/monitoring.md
+++ b/doc/administration/gitaly/monitoring.md
@@ -1,5 +1,5 @@
---
-stage: Create
+stage: Systems
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
---
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index f6166d713b1..5635898293b 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -1,5 +1,5 @@
---
-stage: Create
+stage: Systems
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
---
@@ -833,6 +833,7 @@ For more information on Gitaly server configuration, see our
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
prometheus_monitoring['enable'] = false
+ gitlab_kas['enable'] = false
# Enable only the Gitaly service
gitaly['enable'] = true
diff --git a/doc/administration/gitaly/recovery.md b/doc/administration/gitaly/recovery.md
index 2b5916be916..551a7ab289a 100644
--- a/doc/administration/gitaly/recovery.md
+++ b/doc/administration/gitaly/recovery.md
@@ -1,5 +1,5 @@
---
-stage: Create
+stage: Systems
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
---
diff --git a/doc/administration/gitaly/reference.md b/doc/administration/gitaly/reference.md
index d1e802111cd..91780ec5661 100644
--- a/doc/administration/gitaly/reference.md
+++ b/doc/administration/gitaly/reference.md
@@ -1,5 +1,5 @@
---
-stage: Create
+stage: Systems
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
---
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index a1f542ddac8..fb3a31d61b8 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -1,5 +1,5 @@
---
-stage: Create
+stage: Systems
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
---
@@ -220,6 +220,12 @@ 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).
+If you've confirmed that your `gitlab-secrets.json` file is the same on all Gitaly servers and clients,
+the application might be fetching this secret from a different file. Your Gitaly server's
+`config.toml file` indicates the secrets file in use.
+If that setting is missing, GitLab defaults to using `.gitlab_shell_secret` under
+`/opt/gitlab/embedded/service/gitlab-rails/.gitlab_shell_secret`.
+
### Repository pushes fail with a `deny updating a hidden ref` error
Due to [a change](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3426)
diff --git a/doc/administration/housekeeping.md b/doc/administration/housekeeping.md
index 93409b54c0d..31b7ac9fd3e 100644
--- a/doc/administration/housekeeping.md
+++ b/doc/administration/housekeeping.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Housekeeping **(FREE SELF)**
-GitLab supports and automates housekeeping tasks within your current repository such as:
+GitLab supports and automates housekeeping tasks in your current repository such as:
- Compressing Git objects.
- Removing unreachable objects.
diff --git a/doc/administration/index.md b/doc/administration/index.md
index 29fb65e2deb..4565c0a8e00 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -207,15 +207,14 @@ Learn how to install, configure, update, and maintain your GitLab instance.
## Troubleshooting
-- [Debugging tips](troubleshooting/debug.md): Tips to debug problems when things go wrong.
- [Log system](logs.md): Where to look for logs.
- [Sidekiq Troubleshooting](troubleshooting/sidekiq.md): Debug when Sidekiq appears hung and is not processing jobs.
- [Troubleshooting Elasticsearch](troubleshooting/elasticsearch.md)
-- [Navigating GitLab via Rails console](troubleshooting/navigating_gitlab_via_rails_console.md)
+- [Navigating GitLab via Rails console](operations/rails_console.md)
- [GitLab application limits](instance_limits.md)
- [Responding to security incidents](../security/responding_to_security_incidents.md)
-### Support Team Docs
+### Support Team Documentation
The GitLab Support Team has collected a lot of information about troubleshooting GitLab.
The following documents are used by the Support Team or by customers
@@ -231,7 +230,7 @@ who are aware of the risks.
- [Diagnostics tools](troubleshooting/diagnostics_tools.md)
- [Linux commands](troubleshooting/linux_cheat_sheet.md)
-- [Troubleshooting Kubernetes](troubleshooting/kubernetes_cheat_sheet.md)
+- [Troubleshooting Kubernetes](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html)
- [Troubleshooting PostgreSQL](troubleshooting/postgresql.md)
- [Guide to test environments](troubleshooting/test_environments.md) (for Support Engineers)
- [GitLab Rails console commands](troubleshooting/gitlab_rails_cheat_sheet.md) (for Support Engineers)
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index d86414ae285..2007f5edb3b 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -7,7 +7,7 @@ type: reference
# GitLab application limits **(FREE SELF)**
-GitLab, like most large applications, enforces limits within certain features to maintain a
+GitLab, like most large applications, enforces limits in certain features to maintain a
minimum quality of performance. Allowing some features to be limitless could affect security,
performance, data, or could even exhaust the allocated resources for the application.
@@ -156,7 +156,7 @@ Set the limit to `0` to disable it.
### Search rate limit
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80631) in GitLab 14.9
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80631) in GitLab 14.9.
This setting limits global search requests.
@@ -309,7 +309,7 @@ Blocked recursive webhook calls are logged in `auth.log` with the message `"Recu
The [minimum wait time between pull refreshes](../user/project/repository/mirror/index.md)
defaults to 300 seconds (5 minutes). For example, a pull refresh only runs once in a given 300 second period, regardless of how many times you trigger it.
-This setting applies in the context of pull refreshes invoked via the [projects API](../api/projects.md#start-the-pull-mirroring-process-for-a-project), or when forcing an update by selecting the **Update now** (**{retry}**) button within **Settings > Repository > Mirroring repositories**. This setting has no effect on the automatic 30 minute interval schedule used by Sidekiq for [pull mirroring](../user/project/repository/mirror/pull.md).
+This setting applies in the context of pull refreshes invoked via the [projects API](../api/projects.md#start-the-pull-mirroring-process-for-a-project), or when forcing an update by selecting **Update now** (**{retry}**) in **Settings > Repository > Mirroring repositories**. This setting has no effect on the automatic 30 minute interval schedule used by Sidekiq for [pull mirroring](../user/project/repository/mirror/pull.md).
To change this limit for a self-managed installation, run the following in the
[GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
@@ -342,7 +342,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/index.md#pagination).
+found in the [API documentation 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):
@@ -793,19 +793,9 @@ Plan.default.actual_limits.update!(dotenv_size: 5.kilobytes)
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17859) in GitLab 12.5.
-You can limit the number of inbound alerts for [incidents](../operations/incident_management/incidents.md)
-that can be created in a period of time. The inbound [incident management](../operations/incident_management/index.md)
-alert limit can help prevent overloading your incident responders by reducing the
-number of alerts or duplicate issues.
+This setting limits the number of inbound alert payloads over a period of time.
-To set inbound incident management alert limits:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > Network**.
-1. Expand General **Incident Management Limits**.
-1. Select the **Enable Incident Management inbound alert limit** checkbox.
-1. Optional. Input a custom value for **Maximum requests per project per rate limit period**. Default is 3600.
-1. Optional. Input a custom value for **Rate limit period**. Default is 3600 seconds.
+Read more about [incident management rate limits](../user/admin_area/settings/rate_limit_on_pipelines_creation.md).
### Prometheus Alert JSON payloads
@@ -954,7 +944,7 @@ The maximum allowed [push size](../user/admin_area/settings/account_and_limit_se
Total number of changes (branches or tags) in a single push. If changes are more
than the specified limit, hooks are not executed.
-More information can be found in these docs:
+More information can be found in these documentations:
- [Webhooks push events](../user/project/integrations/webhook_events.md#push-events)
- [Project services push hooks limit](../user/project/integrations/index.md#push-hooks-limit)
@@ -1050,7 +1040,7 @@ In addition to application-based limits, GitLab.com is configured to use Cloudfl
## Container Repository tag deletion limit
-Container repository tags are in the Container Registry and, as such, each tag deletion will trigger network requests to the Container Registry. Because of this, we limit the number of tags that a single API call can delete to 20.
+Container repository tags are in the Container Registry and, as such, each tag deletion triggers network requests to the Container Registry. Because of this, we limit the number of tags that a single API call can delete to 20.
## Project-level Secure Files API limits
diff --git a/doc/administration/instance_review.md b/doc/administration/instance_review.md
index f444589bdf3..d9126036a16 100644
--- a/doc/administration/instance_review.md
+++ b/doc/administration/instance_review.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Conversion
+group: Acquisition
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
---
diff --git a/doc/administration/integration/mailgun.md b/doc/administration/integration/mailgun.md
index fbad201be7d..6b0cb0466fc 100644
--- a/doc/administration/integration/mailgun.md
+++ b/doc/administration/integration/mailgun.md
@@ -23,7 +23,7 @@ After completing the integration, Mailgun `temporary_failure` and `permanent_fai
Before you can enable Mailgun in GitLab, set up your own Mailgun endpoints to receive the webhooks.
-Using the [Mailgun webhook guide](https://www.mailgun.com/blog/a-guide-to-using-mailguns-webhooks/):
+Using the [Mailgun webhook guide](https://www.mailgun.com/blog/product/a-guide-to-using-mailguns-webhooks/):
1. Add a webhook with the **Event type** set to **Permanent Failure**.
1. Enter the URL of your instance and include the `/-/mailgun/webhooks` path.
diff --git a/doc/administration/integration/plantuml.md b/doc/administration/integration/plantuml.md
index cdf6d48ad41..58c9e01a151 100644
--- a/doc/administration/integration/plantuml.md
+++ b/doc/administration/integration/plantuml.md
@@ -7,9 +7,11 @@ type: reference, howto
# PlantUML and GitLab **(FREE)**
-When [PlantUML](https://plantuml.com) integration is enabled and configured in
-GitLab, you can create diagrams in snippets, wikis, and repositories. To set up
-the integration, you must:
+When the [PlantUML](https://plantuml.com) integration is enabled and configured in
+GitLab, you can create diagrams in snippets, wikis, and repositories. This integration
+is enabled on GitLab.com for all SaaS users and does not require any additional configuration.
+
+To set up the integration on a self-managed instance, you must:
1. [Configure your PlantUML server](#configure-your-plantuml-server).
1. [Configure local PlantUML access](#configure-local-plantuml-access).
diff --git a/doc/administration/invalidate_markdown_cache.md b/doc/administration/invalidate_markdown_cache.md
index 855910fec6a..20a77691bbc 100644
--- a/doc/administration/invalidate_markdown_cache.md
+++ b/doc/administration/invalidate_markdown_cache.md
@@ -5,18 +5,25 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Invalidate Markdown Cache **(FREE)**
+# Markdown cache **(FREE)**
-For performance reasons, GitLab caches the HTML version of Markdown text
-in fields like comments, issue descriptions, and merge request descriptions. These
-cached versions can become outdated, such as
-when the `external_url` configuration option is changed. Links
+For performance reasons, GitLab caches the HTML version of Markdown text in fields such as:
+
+- Comments.
+- Issue descriptions.
+- Merge request descriptions.
+
+These cached versions can become outdated, such as when the `external_url` configuration option is changed. Links
in the cached text would still refer to the old URL.
-To avoid this problem, the administrator can invalidate the existing cache by
-increasing the `local_markdown_version` setting in application settings. This can
-be done by changing the application settings
-[through the API](../api/settings.md#change-application-settings):
+## Invalidate the cache
+
+Pre-requisite:
+
+- You must be an administrator.
+
+To avoid problems caused by cached HTML versions, invalidate the existing cache by increasing the `local_markdown_version`
+setting in application settings [using the API](../api/settings.md#change-application-settings):
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/settings?local_markdown_version=<increased_number>"
diff --git a/doc/administration/lfs/index.md b/doc/administration/lfs/index.md
index ebf76cc6aec..2fcf7d2f276 100644
--- a/doc/administration/lfs/index.md
+++ b/doc/administration/lfs/index.md
@@ -184,7 +184,11 @@ Verify `objectstg` below (where `store=2`) has count of all LFS objects:
```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 lfs_objects;
+```
+
+**Example Output**
+```shell
total | filesystem | objectstg
------+------------+-----------
2409 | 0 | 2409
diff --git a/doc/administration/libravatar.md b/doc/administration/libravatar.md
index 442c233a536..eac7c6f848b 100644
--- a/doc/administration/libravatar.md
+++ b/doc/administration/libravatar.md
@@ -12,7 +12,7 @@ GitLab by default supports the [Gravatar](https://gravatar.com) avatar service.
Libravatar is another service that delivers your avatar (profile picture) to
other websites. The Libravatar API is
[heavily based on gravatar](https://wiki.libravatar.org/api/), so you can
-easily switch to the Libravatar avatar service or even your own Libravatar
+switch to the Libravatar avatar service or even your own Libravatar
server.
## Configuration
@@ -45,7 +45,7 @@ the URL is different in the configuration, but you must provide the same
placeholders so GitLab can parse the URL correctly.
For example, you host a service on `http://libravatar.example.com` and the
-`plain_url` you need to supply in `gitlab.yml` is
+`plain_url` you must supply in `gitlab.yml` is
`http://libravatar.example.com/avatar/%{hash}?s=%{size}&d=identicon`
diff --git a/doc/administration/load_balancer.md b/doc/administration/load_balancer.md
index e6a1c0c25d5..988bddcfe62 100644
--- a/doc/administration/load_balancer.md
+++ b/doc/administration/load_balancer.md
@@ -11,8 +11,8 @@ traffic to the application servers. The specifics on which load balancer to use
or the exact configuration is beyond the scope of GitLab documentation. We hope
that if you're managing HA systems like GitLab you have a load balancer of
choice already. Some examples including HAProxy (open-source), F5 Big-IP LTM,
-and Citrix Net Scaler. This documentation outlines what ports and protocols
-you need to use with GitLab.
+and Citrix NetScaler. This documentation outlines what ports and protocols
+to use with GitLab.
## SSL
@@ -40,7 +40,7 @@ Configure your load balancers to use the 'HTTP(S)' protocol rather than 'TCP'.
The load balancers is be responsible for managing SSL certificates and
terminating SSL.
-Since communication between the load balancers and GitLab isn't secure,
+Because communication between the load balancers and GitLab isn't secure,
there is some additional configuration needed. See
[NGINX Proxied SSL documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#supporting-proxied-ssl)
for details.
@@ -52,7 +52,7 @@ The load balancers is responsible for managing SSL certificates that
end users see.
Traffic is secure between the load balancers and NGINX in this
-scenario. There is no need to add configuration for proxied SSL since the
+scenario. There is no need to add configuration for proxied SSL because the
connection is secure all the way. However, configuration must be
added to GitLab to configure SSL certificates. See
[NGINX HTTPS documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https)
diff --git a/doc/administration/logs.md b/doc/administration/logs.md
index 5a2c1190896..671c264ed85 100644
--- a/doc/administration/logs.md
+++ b/doc/administration/logs.md
@@ -1063,23 +1063,23 @@ For Omnibus GitLab installations, Mattermost logs are in these locations:
## Workhorse Logs
-For Omnibus GitLab installations, Workhorse logs are in `/var/log/gitlab/gitlab-workhorse/`.
+For Omnibus GitLab installations, Workhorse logs are in `/var/log/gitlab/gitlab-workhorse/current`.
## PostgreSQL Logs
-For Omnibus GitLab installations, PostgreSQL logs are in `/var/log/gitlab/postgresql/`.
+For Omnibus GitLab installations, PostgreSQL logs are in `/var/log/gitlab/postgresql/current`.
## Prometheus Logs
-For Omnibus GitLab installations, Prometheus logs are in `/var/log/gitlab/prometheus/`.
+For Omnibus GitLab installations, Prometheus logs are in `/var/log/gitlab/prometheus/current`.
## Redis Logs
-For Omnibus GitLab installations, Redis logs are in `/var/log/gitlab/redis/`.
+For Omnibus GitLab installations, Redis logs are in `/var/log/gitlab/redis/current`.
## Alertmanager Logs
-For Omnibus GitLab installations, Alertmanager logs are in `/var/log/gitlab/alertmanager/`.
+For Omnibus GitLab installations, Alertmanager logs are in `/var/log/gitlab/alertmanager/current`.
<!-- vale gitlab.Spelling = NO -->
@@ -1091,11 +1091,11 @@ For Omnibus GitLab installations, crond logs are in `/var/log/gitlab/crond/`.
## Grafana Logs
-For Omnibus GitLab installations, Grafana logs are in `/var/log/gitlab/grafana/`.
+For Omnibus GitLab installations, Grafana logs are in `/var/log/gitlab/grafana/current`.
## LogRotate Logs
-For Omnibus GitLab installations, `logrotate` logs are in `/var/log/gitlab/logrotate/`.
+For Omnibus GitLab installations, `logrotate` logs are in `/var/log/gitlab/logrotate/current`.
## GitLab Monitor Logs
@@ -1103,12 +1103,12 @@ For Omnibus GitLab installations, GitLab Monitor logs are in `/var/log/gitlab/gi
## GitLab Exporter
-For Omnibus GitLab installations, GitLab Exporter logs are in `/var/log/gitlab/gitlab-exporter/`.
+For Omnibus GitLab installations, GitLab Exporter logs are in `/var/log/gitlab/gitlab-exporter/current`.
## GitLab agent server
For Omnibus GitLab installations, GitLab agent server logs are
-in `/var/log/gitlab/gitlab-kas/`.
+in `/var/log/gitlab/gitlab-kas/current`.
## Praefect Logs
diff --git a/doc/administration/monitoring/performance/grafana_configuration.md b/doc/administration/monitoring/performance/grafana_configuration.md
index 79612145327..3a76e2e4578 100644
--- a/doc/administration/monitoring/performance/grafana_configuration.md
+++ b/doc/administration/monitoring/performance/grafana_configuration.md
@@ -14,7 +14,7 @@ and Grafana allows you to query the data to display useful graphs.
Omnibus GitLab can [help you install Grafana (recommended)](https://docs.gitlab.com/omnibus/settings/grafana.html)
or Grafana supplies package repositories (Yum/Apt) for easy installation.
-See [Grafana installation documentation](https://grafana.com/docs/grafana/latest/installation/)
+See [Grafana installation documentation](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)
for detailed steps.
Before starting Grafana for the first time, set the administration user
@@ -133,8 +133,8 @@ However, you should **not** reinstate your old data _except_ under one of the fo
If you require access to your old Grafana data but don't meet one of these criteria, you may consider:
1. Reinstating it temporarily.
-1. [Exporting the dashboards](https://grafana.com/docs/grafana/latest/reference/export_import/#exporting-a-dashboard) you need.
-1. Refreshing the data and [re-importing your dashboards](https://grafana.com/docs/grafana/latest/reference/export_import/#importing-a-dashboard).
+1. [Exporting the dashboards](https://grafana.com/docs/grafana/latest/dashboards/export-import/#exporting-a-dashboard) you need.
+1. Refreshing the data and [re-importing your dashboards](https://grafana.com/docs/grafana/latest/dashboards/export-import/#import-dashboard).
WARNING:
These actions pose a temporary vulnerability while your old Grafana data is in use.
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index aefd7a49b8b..759f485c109 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -54,7 +54,7 @@ From left to right, the performance bar displays:
- [**First Contentful Paint**](https://web.dev/first-contentful-paint/):
Time until something was visible to the user. Displays `NaN` if your browser does not
support this feature.
- - [**DomContentLoaded**](https://developers.google.com/web/fundamentals/performance/critical-rendering-path/measure-crp) Event.
+ - [**DomContentLoaded**](https://web.dev/critical-rendering-path-measure-crp/) Event.
- **Total number of requests** the page loaded.
- **Memory**: the amount of memory consumed and objects allocated during the selected request.
Select it to display a window with more details.
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 4f8fbd0c07e..d6575766b17 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -42,6 +42,8 @@ The following metrics are available:
| `gitlab_ci_pipeline_builder_scoped_variables_duration` | Histogram | 14.5 | Time in seconds it takes to create the scoped variables for a CI/CD job
| `gitlab_ci_pipeline_creation_duration_seconds` | Histogram | 13.0 | Time in seconds it takes to create a CI/CD pipeline | |
| `gitlab_ci_pipeline_size_builds` | Histogram | 13.1 | Total number of builds within a pipeline grouped by a pipeline source | `source` |
+| `gitlab_ci_runner_authentication_success_total` | Counter | 15.2 | Total number of times that runner authentication has succeeded | `type` |
+| `gitlab_ci_runner_authentication_failure_total` | Counter | 15.2 | Total number of times that runner authentication has failed
| `job_waiter_started_total` | Counter | 12.9 | Number of batches of jobs started where a web request is waiting for the jobs to complete | `worker` |
| `job_waiter_timeouts_total` | Counter | 12.9 | Number of batches of jobs that timed out where a web request is waiting for the jobs to complete | `worker` |
| `gitlab_ci_active_jobs` | Histogram | 14.2 | Count of active jobs when pipeline is created | |
@@ -136,8 +138,8 @@ The following metrics are available:
| `pipeline_graph_links_per_job_ratio` | Histogram | 13.9 | Ratio of links to job per graph | |
| `gitlab_ci_pipeline_security_orchestration_policy_processing_duration_seconds` | Histogram | 13.12 | Time in seconds it takes to process Security Policies in CI/CD pipeline | |
| `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 | |
+| `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 | |
@@ -176,6 +178,7 @@ configuration option in `gitlab.yml`. These metrics are served from the
| `sidekiq_jobs_queue_duration_seconds` | Histogram | 12.5 | Duration in seconds that a Sidekiq job was queued before being executed | `queue`, `boundary`, `external_dependencies`, `feature_category`, `urgency` |
| `sidekiq_jobs_failed_total` | Counter | 12.2 | Sidekiq jobs failed | `queue`, `boundary`, `external_dependencies`, `feature_category`, `urgency` |
| `sidekiq_jobs_retried_total` | Counter | 12.2 | Sidekiq jobs retried | `queue`, `boundary`, `external_dependencies`, `feature_category`, `urgency` |
+| `sidekiq_jobs_interrupted_total` | Counter | 15.2 | Sidekiq jobs interrupted | `queue`, `boundary`, `external_dependencies`, `feature_category`, `urgency` |
| `sidekiq_jobs_dead_total` | Counter | 13.7 | Sidekiq dead jobs (jobs that have run out of retries) | `queue`, `boundary`, `external_dependencies`, `feature_category`, `urgency` |
| `sidekiq_redis_requests_total` | Counter | 13.1 | Redis requests during a Sidekiq job execution | `queue`, `boundary`, `external_dependencies`, `feature_category`, `job_status`, `urgency` |
| `sidekiq_elasticsearch_requests_total` | Counter | 13.1 | Elasticsearch requests during a Sidekiq job execution | `queue`, `boundary`, `external_dependencies`, `feature_category`, `job_status`, `urgency` |
@@ -347,6 +350,7 @@ Some basic Ruby runtime metrics are available:
|:---------------------------------------- |:--------- |:----- |:----------- |
| `ruby_gc_duration_seconds` | Counter | 11.1 | Time spent by Ruby in GC |
| `ruby_gc_stat_...` | Gauge | 11.1 | Various metrics from [GC.stat](https://ruby-doc.org/core-2.6.5/GC.html#method-c-stat) |
+| `ruby_gc_stat_ext_heap_fragmentation` | Gauge | 15.2 | Degree of Ruby heap fragmentation as live objects versus eden slots (range 0 to 1) |
| `ruby_file_descriptors` | Gauge | 11.1 | File descriptors per process |
| `ruby_sampler_duration_seconds` | Counter | 11.1 | Time spent collecting stats |
| `ruby_process_cpu_seconds_total` | Gauge | 12.0 | Total amount of CPU time per process |
diff --git a/doc/administration/monitoring/prometheus/web_exporter.md b/doc/administration/monitoring/prometheus/web_exporter.md
index 4b449a1d74e..fe140b15ed2 100644
--- a/doc/administration/monitoring/prometheus/web_exporter.md
+++ b/doc/administration/monitoring/prometheus/web_exporter.md
@@ -51,3 +51,23 @@ To enable the dedicated server:
for the changes to take effect.
Metrics can now be served and scraped from `localhost:8083/metrics`.
+
+## Enable HTTPS
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/364771) in GitLab 15.2.
+
+To serve metrics via HTTPS instead of HTTP, enable TLS in the exporter settings:
+
+1. Edit `/etc/gitlab/gitlab.rb` to add (or find and uncomment) the following lines:
+
+ ```ruby
+ puma['exporter_tls_enabled'] = true
+ puma['exporter_tls_cert_path'] = "/path/to/certificate.pem"
+ puma['exporter_tls_key_path'] = "/path/to/private-key.pem"
+ ```
+
+1. Save the file and [reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect.
+
+When TLS is enabled, the same `port` and `address` will be used as described above.
+The metrics server cannot serve both HTTP and HTTPS at the same time.
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index d9866a6c09f..51fa627b8d4 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -24,7 +24,7 @@ file system performance, see
Starting with GitLab version 14.0, support for NFS to store Git repository data is deprecated. Technical customer support and engineering support is available for the 14.x releases. Engineering is fixing bugs and security vulnerabilities consistent with our [release and maintenance policy](../policy/maintenance.md#security-releases).
-Upon the release of GitLab 15.6 technical and engineering support for using NFS to store Git repository data will be officially at end-of-life. There will be no product changes or troubleshooting provided via Engineering, Security or Paid Support channels after the release date of 15.6, regardless of your GitLab version.
+Upon the release of GitLab 15.6 technical and engineering support for using NFS to store Git repository data is officially at end-of-life. There are no product changes or troubleshooting provided via Engineering, Security or Paid Support channels after the release date of 15.6, regardless of your GitLab version.
Until the release of 15.6, for customers running 14.x releases, we continue to help with Git related tickets from customers running one or more Gitaly servers with its data stored on NFS. Examples may include:
@@ -268,9 +268,9 @@ version of a directory.
From the [Linux man page](https://linux.die.net/man/5/nfs), the important parts:
-> If the nocto option is specified, the client uses a non-standard heuristic to determine when files on the server have changed.
+> If the `nocto` option is specified, the client uses a non-standard heuristic to determine when files on the server have changed.
>
-> Using the nocto option may improve performance for read-only mounts, but should be used only if the data on the server changes only occasionally.
+> Using the `nocto` option may improve performance for read-only mounts, but should be used only if the data on the server changes only occasionally.
We have noticed this behavior in an issue about [refs not found after a push](https://gitlab.com/gitlab-org/gitlab/-/issues/326066),
where newly added loose refs can be seen as missing on a different client with a local dentry cache, as
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 7e6dc51d27c..ddeaf0280eb 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -76,7 +76,7 @@ because it does not require a shared folder.
Consolidated object storage configuration can't be used for backups or
Mattermost. See the [full table for a complete list](#storage-specific-configuration).
-However, backups can be configured with [server side encryption](../raketasks/backup_restore.md#s3-encrypted-buckets) separately.
+However, backups can be configured with [server side encryption](../raketasks/backup_gitlab.md#s3-encrypted-buckets) separately.
Enabling consolidated object storage enables object storage for all object
types. If not all buckets are specified, `sudo gitlab-ctl reconfigure` may fail with the error like:
@@ -528,7 +528,7 @@ supported by consolidated configuration form, refer to the following guides:
| Object storage type | Supported by consolidated configuration? |
|---------------------|------------------------------------------|
-| [Backups](../raketasks/backup_restore.md#uploading-backups-to-a-remote-cloud-storage) | **{dotted-circle}** No |
+| [Backups](../raketasks/backup_gitlab.md#uploading-backups-to-a-remote-cloud-storage) | **{dotted-circle}** No |
| [Job artifacts](job_artifacts.md#using-object-storage) including archived job logs | **{check-circle}** Yes |
| [LFS objects](lfs/index.md#storing-lfs-objects-in-remote-object-storage) | **{check-circle}** Yes |
| [Uploads](uploads.md#using-object-storage) | **{check-circle}** Yes |
@@ -542,7 +542,7 @@ supported by consolidated configuration form, refer to the following guides:
| [Pages content](pages/index.md#using-object-storage) | **{check-circle}** Yes |
WARNING:
-The use of [encrypted S3 buckets](#encrypted-s3-buckets) with non-consolidated configuration is not supported.
+The use of [encrypted S3 buckets](#encrypted-s3-buckets) with non-consolidated configuration is not supported.
You may start getting [ETag mismatch errors](#etag-mismatch) if you use it.
### Other alternatives to file system storage
@@ -587,7 +587,7 @@ Helm-based installs require separate buckets to
### S3 API compatibility issues
-Not all S3 providers [are fully compatible](../raketasks/backup_restore.md#other-s3-providers)
+Not all S3 providers [are fully compatible](../raketasks/backup_gitlab.md#other-s3-providers)
with the Fog library that GitLab uses. Symptoms include an error in `production.log`:
```plaintext
diff --git a/doc/administration/operations/extra_sidekiq_processes.md b/doc/administration/operations/extra_sidekiq_processes.md
index cffe682a80b..373017eefa7 100644
--- a/doc/administration/operations/extra_sidekiq_processes.md
+++ b/doc/administration/operations/extra_sidekiq_processes.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab allows you to start multiple Sidekiq processes.
These processes can be used to consume a dedicated set
of queues. This can be used to ensure certain queues always have dedicated
-workers, no matter the number of jobs that need to be processed.
+workers, no matter the number of jobs to be processed.
NOTE:
The information in this page applies only to Omnibus GitLab.
@@ -325,17 +325,16 @@ you'd use the following:
The `sidekiq-cluster` command does not terminate once it has started the desired
amount of Sidekiq processes. Instead, the process continues running and
-forward any signals to the child processes. This makes it easy to stop all
-Sidekiq processes as you simply send a signal to the `sidekiq-cluster` process,
+forwards any signals to the child processes. This allows you to stop all
+Sidekiq processes as you send a signal to the `sidekiq-cluster` process,
instead of having to send it to the individual processes.
If the `sidekiq-cluster` process crashes or receives a `SIGKILL`, the child
processes terminate themselves after a few seconds. This ensures you don't
end up with zombie Sidekiq processes.
-All of this makes monitoring the processes fairly easy. Simply hook up
-`sidekiq-cluster` to your supervisor of choice (for example, runit) and you're good to
-go.
+This allows you to monitor the processes by hooking up
+`sidekiq-cluster` to your supervisor of choice (for example, runit).
If a child process died the `sidekiq-cluster` command signals all remaining
process to terminate, then terminate itself. This removes the need for
diff --git a/doc/administration/operations/extra_sidekiq_routing.md b/doc/administration/operations/extra_sidekiq_routing.md
index 2a14fa1d312..a6ad3e62bb7 100644
--- a/doc/administration/operations/extra_sidekiq_routing.md
+++ b/doc/administration/operations/extra_sidekiq_routing.md
@@ -75,7 +75,7 @@ workers.
## Worker matching query
-GitLab provides a simple query syntax to match a worker based on its
+GitLab provides a query syntax to match a worker based on its
attributes. This query syntax is employed by both [Queue routing
rules](#queue-routing-rules) and [Queue
selector](extra_sidekiq_processes.md#queue-selector). A query includes two
@@ -102,12 +102,8 @@ based on a subset of worker attributes:
quickly. Can be `high`, `low`, or `throttled`. For example, the
`authorized_projects` queue is used to refresh user permissions, and
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.
-- `name` - the queue name generated from the worker name. The other attributes
- are typically more useful as they are more general, but this is available in
- case a particular queue needs to be selected. Because this is generated from
+- `worker_name` - the worker name. Use this attribute to select a specific worker.
+- `name` - the queue name generated from the worker name. Use this attribute to select a specific queue. Because this is generated from
the worker name, it does not change based on the result of other routing
rules.
- `resource_boundary` - if the queue is bound by `cpu`, `memory`, or
@@ -137,7 +133,7 @@ GitLab Enterprise Edition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee
to lowest precedence:
- `|` - the logical `OR` operator. For example, `query_a|query_b` (where `query_a`
- and `query_b` are queries made up of the other operators here) will include
+ and `query_b` are queries made up of the other operators here) includes
queues that match either query.
- `&` - the logical `AND` operator. For example, `query_a&query_b` (where
`query_a` and `query_b` are queries made up of the other operators here) will
@@ -161,7 +157,7 @@ entire queue group selects all queues.
### Migration
-After the Sidekiq routing rules are changed, administrators need to take care
+After the Sidekiq routing rules are changed, administrators must take care
with the migration to avoid losing jobs entirely, especially in a system with
long queues of jobs. The migration can be done by following the migration steps
mentioned in [Sidekiq job
@@ -181,7 +177,7 @@ sidekiq['routing_rules'] = [
]
```
-These queues will also need to be included in at least one [Sidekiq
+These queues must also be included in at least one [Sidekiq
queue group](extra_sidekiq_processes.md#start-multiple-processes).
The following table shows the workers that should have their own queue:
diff --git a/doc/administration/operations/filesystem_benchmarking.md b/doc/administration/operations/filesystem_benchmarking.md
index 9403634d905..a5c4795efea 100644
--- a/doc/administration/operations/filesystem_benchmarking.md
+++ b/doc/administration/operations/filesystem_benchmarking.md
@@ -36,7 +36,7 @@ fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --bs
```
This creates a 4GB file in `/path/to/git-data/testfile`. It performs
-4KB reads and writes using a 75%/25% split within the file, with 64
+4KB reads and writes using a 75%/25% split in the file, with 64
operations running at a time. Be sure to delete the file after the test
completes.
@@ -72,7 +72,7 @@ operations per second.
### Simple benchmarking
NOTE:
-This test is naive but may be useful if `fio` is not
+This test is naive but can be used if `fio` is not
available on the system. It's possible to receive good results on this
test but still have poor performance due to read speed and various other
factors.
@@ -83,7 +83,7 @@ executed, and then reads the same 1,000 files.
1. Change into the root of the appropriate
[repository storage path](../repository_storage_paths.md).
-1. Create a temporary directory for the test so it's easy to remove the files later:
+1. Create a temporary directory for the test so it can be removed later:
```shell
mkdir test; cd test
diff --git a/doc/administration/operations/index.md b/doc/administration/operations/index.md
index fe531407eb2..41a9a0e6d67 100644
--- a/doc/administration/operations/index.md
+++ b/doc/administration/operations/index.md
@@ -15,7 +15,7 @@ Keep your GitLab instance up and running smoothly.
by GitLab to another file system or another server.
- [Sidekiq MemoryKiller](sidekiq_memory_killer.md): Configure Sidekiq MemoryKiller
to restart Sidekiq.
-- [Multiple Sidekiq processes](extra_sidekiq_processes.md): Configure multiple Sidekiq processes to ensure certain queues always have dedicated workers, no matter the number of jobs that need to be processed. **(FREE SELF)**
+- [Multiple Sidekiq processes](extra_sidekiq_processes.md): Configure multiple Sidekiq processes to ensure certain queues always have dedicated workers, no matter the number of jobs that must be processed. **(FREE SELF)**
- [Sidekiq routing rules](extra_sidekiq_routing.md): Configure the routing rules to route a job from a worker to a desirable queue. **(FREE SELF)**
- [Puma](puma.md): Understand Puma and puma-worker-killer.
- Speed up SSH operations by [Authorizing SSH users via a fast,
@@ -24,10 +24,10 @@ Keep your GitLab instance up and running smoothly.
of SSH certificates](ssh_certificates.md).
- [File System Performance Benchmarking](filesystem_benchmarking.md): File system
performance can have a big impact on GitLab performance, especially for actions
- that read or write Git repositories. This information will help benchmark
+ that read or write Git repositories. This information helps benchmark
file system performance against known good and bad real-world systems.
- [The Rails Console](rails_console.md): Provides a way to interact with your GitLab instance from the command line.
Used for troubleshooting a problem or retrieving some data that can only be done through direct access to GitLab.
- [ChatOps Scripts](https://gitlab.com/gitlab-com/chatops): The GitLab.com Infrastructure team uses this repository to house
common ChatOps scripts they use to troubleshoot and maintain the production instance of GitLab.com.
- These scripts are likely useful to administrators of GitLab instances of all sizes.
+ These scripts can be used by administrators of GitLab instances of all sizes.
diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md
index 1459b707e5c..4228b792fdc 100644
--- a/doc/administration/operations/moving_repositories.md
+++ b/doc/administration/operations/moving_repositories.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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
---
# Moving repositories managed by GitLab **(FREE SELF)**
@@ -189,9 +188,9 @@ should be used. Git repositories are accessed, managed, and stored on GitLab ser
can result from directly accessing and copying Gitaly's files using tools like `rsync`.
- From GitLab 13.3, backup performance can be improved by
- [processing multiple repositories concurrently](../../raketasks/backup_restore.md#back-up-git-repositories-concurrently).
+ [processing multiple repositories concurrently](../../raketasks/backup_gitlab.md#back-up-git-repositories-concurrently).
- Backups can be created of just the repositories using the
- [skip feature](../../raketasks/backup_restore.md#excluding-specific-directories-from-the-backup).
+ [skip feature](../../raketasks/backup_gitlab.md#excluding-specific-directories-from-the-backup).
No other method works for Gitaly Cluster targets.
@@ -385,6 +384,6 @@ See the following for information on troubleshooting repository moves.
### Repository move fails for archived projects
Because of a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/363670),
-[archived projects](../../user/project/settings/index.md#advanced-settings) fail to move even though the data is cloned
+[archived projects](../../user/project/settings/index.md#advanced-project-settings) fail to move even though the data is cloned
by Gitaly. Make sure archived projects are
-[unarchived](../../user/project/settings/index.md#unarchiving-a-project) before initiating a move.
+[unarchived](../../user/project/settings/index.md#unarchive-a-project) before initiating a move.
diff --git a/doc/administration/operations/puma.md b/doc/administration/operations/puma.md
index 0025ca109e5..bc95ee626ce 100644
--- a/doc/administration/operations/puma.md
+++ b/doc/administration/operations/puma.md
@@ -111,7 +111,7 @@ To change the worker timeout to 600 seconds:
WARNING:
This is an experimental [Alpha feature](../../policy/alpha-beta-support.md#alpha-features) and subject to change without notice. The feature
is not ready for production use. If you want to use this feature, we recommend testing
-with non-production data first. See the [known issues](#puma-single-mode-known-issues)
+outside of production first. See the [known issues](#puma-single-mode-known-issues)
for additional details.
In a memory-constrained environment with less than 4GB of RAM available, consider disabling Puma
@@ -137,6 +137,10 @@ For details on Puma worker and thread settings, see the [Puma requirements](../.
The downside of running Puma in this configuration is the reduced throughput, which can be
considered a fair tradeoff in a memory-constrained environment.
+Remember to have sufficient swap available to avoid out of memory (OOM)
+conditions. View the [Memory requirements](../../install/requirements.md#memory)
+for details.
+
### Puma single mode known issues
When running Puma in single mode, some features are not supported:
@@ -279,6 +283,124 @@ To switch from Unicorn to Puma:
1. Optional. For multi-node deployments, configure the load balancer to use the
[readiness check](../load_balancer.md#readiness-check).
+## Troubleshooting Puma
+
+### 502 Gateway Timeout after Puma spins at 100% CPU
+
+This error occurs when the Web server times out (default: 60 s) after not
+hearing back from the Puma worker. If the CPU spins to 100% while this is in
+progress, there may be something taking longer than it should.
+
+To fix this issue, we first need to figure out what is happening. The
+following tips are only recommended if you do not mind users being affected by
+downtime. Otherwise, skip to the next section.
+
+1. Load the problematic URL
+1. Run `sudo gdb -p <PID>` to attach to the Puma process.
+1. In the GDB window, type:
+
+ ```plaintext
+ call (void) rb_backtrace()
+ ```
+
+1. This forces the process to generate a Ruby backtrace. Check
+ `/var/log/gitlab/puma/puma_stderr.log` for the backtrace. For example, you may see:
+
+ ```plaintext
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:33:in `block in start'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:33:in `loop'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:36:in `block (2 levels) in start'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:44:in `sample'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:68:in `sample_objects'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:68:in `each_with_object'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:68:in `each'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:69:in `block in sample_objects'
+ from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:69:in `name'
+ ```
+
+1. To see the current threads, run:
+
+ ```plaintext
+ thread apply all bt
+ ```
+
+1. Once you're done debugging with `gdb`, be sure to detach from the process and exit:
+
+ ```plaintext
+ detach
+ exit
+ ```
+
+GDB reports an error if the Puma process terminates before you can run these commands.
+To buy more time, you can always raise the
+Puma worker timeout. For omnibus users, you can edit `/etc/gitlab/gitlab.rb` and
+increase it from 60 seconds to 600:
+
+```ruby
+gitlab_rails['env'] = {
+ 'GITLAB_RAILS_RACK_TIMEOUT' => 600
+}
+```
+
+For source installations, set the environment variable.
+Refer to [Puma Worker timeout](../operations/puma.md#change-the-worker-timeout).
+
+[Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab for the changes to take effect.
+
+#### Troubleshooting without affecting other users
+
+The previous section attached to a running Puma process, which may have
+undesirable effects on users trying to access GitLab during this time. If you
+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 (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:
+
+ ```ruby
+ app.get '<URL FROM STEP 2>/?private_token=<TOKEN FROM STEP 3>'
+ ```
+
+ For example:
+
+ ```ruby
+ app.get 'https://gitlab.com/gitlab-org/gitlab-foss/-/issues/1?private_token=123456'
+ ```
+
+1. In a new window, run `top`. It should show this Ruby process using 100% CPU. Write down the PID.
+1. Follow step 2 from the previous section on using GDB.
+
+### GitLab: API is not accessible
+
+This often occurs when GitLab Shell attempts to request authorization via the
+[internal API](../../development/internal_api/index.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 (for example, PostgreSQL or Redis)
+1. Error in Git hooks or push rules
+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 Puma worker that is spinning via `top`. Try to use the `gdb`
+techniques above. In addition, using `strace` may help isolate issues:
+
+```shell
+strace -ttTfyyy -s 1024 -p <PID of puma worker> -o /tmp/puma.txt
+```
+
+If you cannot isolate which Puma worker is the issue, try to run `strace`
+on all the Puma workers to see where the
+[`/internal/allowed`](../../development/internal_api/index.md) endpoint gets stuck:
+
+```shell
+ps auwx | grep puma | awk '{ print " -p " $2}' | xargs strace -ttTfyyy -s 1024 -o /tmp/puma.txt
+```
+
+The output in `/tmp/puma.txt` may help diagnose the root cause.
+
## Related topics
- [Use a dedicated metrics server to export web metrics](../monitoring/prometheus/puma_exporter.md)
diff --git a/doc/administration/operations/rails_console.md b/doc/administration/operations/rails_console.md
index df039ee734f..660a99faaf8 100644
--- a/doc/administration/operations/rails_console.md
+++ b/doc/administration/operations/rails_console.md
@@ -6,8 +6,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Rails console **(FREE SELF)**
+At the heart of GitLab is a web application [built using the Ruby on Rails
+framework](https://about.gitlab.com/blog/2018/10/29/why-we-use-rails-to-build-gitlab/).
The [Rails console](https://guides.rubyonrails.org/command_line.html#rails-console).
-provides a way to interact with your GitLab instance from the command line.
+provides a way to interact with your GitLab instance from the command line, and also grants access to the amazing tools built right into Rails.
WARNING:
The Rails console interacts directly with GitLab. In many cases,
@@ -17,7 +19,9 @@ with no consequences, you are strongly advised to do so in a test environment.
The Rails console is for GitLab system administrators who are troubleshooting
a problem or need to retrieve some data that can only be done through direct
-access of the GitLab application.
+access of the GitLab application. Basic knowledge of Ruby is needed (try [this
+30-minute tutorial](https://try.ruby-lang.org/) for a quick introduction).
+Rails experience is useful but not required.
## Starting a Rails console session
@@ -35,10 +39,39 @@ sudo -u git -H bundle exec rails console -e production
**For Kubernetes deployments**
-The console is in the toolbox pod. Refer to our [Kubernetes cheat sheet](../troubleshooting/kubernetes_cheat_sheet.md#gitlab-specific-kubernetes-information) for details.
+The console is in the toolbox pod. Refer to our [Kubernetes cheat sheet](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html#gitlab-specific-kubernetes-information) for details.
To exit the console, type: `quit`.
+## Enable Active Record logging
+
+You can enable output of Active Record debug logging in the Rails console
+session by running:
+
+```ruby
+ActiveRecord::Base.logger = Logger.new($stdout)
+```
+
+This shows information about database queries triggered by any Ruby code
+you may run in the console. To turn off logging again, run:
+
+```ruby
+ActiveRecord::Base.logger = nil
+```
+
+## Disable database statement timeout
+
+You can disable the PostgreSQL statement timeout for the current Rails console
+session by running:
+
+```ruby
+ActiveRecord::Base.connection.execute('SET statement_timeout TO 0')
+```
+
+This change only affects the current Rails console session and is
+not persisted in the GitLab production environment or in the next Rails
+console session.
+
## Output Rails console session history
Enter the following command on the rails console to display
@@ -168,3 +201,435 @@ sudo chown -R git:git /scripts
sudo chmod 700 /scripts
sudo gitlab-rails runner /scripts/helloworld.rb
```
+
+## Active Record objects
+
+### Looking up database-persisted objects
+
+Under the hood, Rails uses [Active Record](https://guides.rubyonrails.org/active_record_basics.html),
+an object-relational mapping system, to read, write, and map application objects
+to the PostgreSQL database. These mappings are handled by Active Record models,
+which are Ruby classes defined in a Rails app. For GitLab, the model classes
+can be found at `/opt/gitlab/embedded/service/gitlab-rails/app/models`.
+
+Let's enable debug logging for Active Record so we can see the underlying
+database queries made:
+
+```ruby
+ActiveRecord::Base.logger = Logger.new($stdout)
+```
+
+Now, let's try retrieving a user from the database:
+
+```ruby
+user = User.find(1)
+```
+
+Which would return:
+
+```ruby
+D, [2020-03-05T16:46:25.571238 #910] DEBUG -- : User Load (1.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
+=> #<User id:1 @root>
+```
+
+We can see that we've queried the `users` table in the database for a row whose
+`id` column has the value `1`, and Active Record has translated that database
+record into a Ruby object that we can interact with. Try some of the following:
+
+- `user.username`
+- `user.created_at`
+- `user.admin`
+
+By convention, column names are directly translated into Ruby object attributes,
+so you should be able to do `user.<column_name>` to view the attribute's value.
+
+Also by convention, Active Record class names (singular and in camel case) map
+directly onto table names (plural and in snake case) and vice versa. For example,
+the `users` table maps to the `User` class, while the `application_settings`
+table maps to the `ApplicationSetting` class.
+
+You can find a list of tables and column names in the Rails database schema,
+available at `/opt/gitlab/embedded/service/gitlab-rails/db/schema.rb`.
+
+You can also look up an object from the database by attribute name:
+
+```ruby
+user = User.find_by(username: 'root')
+```
+
+Which would return:
+
+```ruby
+D, [2020-03-05T17:03:24.696493 #910] DEBUG -- : User Load (2.1ms) SELECT "users".* FROM "users" WHERE "users"."username" = 'root' LIMIT 1
+=> #<User id:1 @root>
+```
+
+Give the following a try:
+
+- `User.find_by(email: 'admin@example.com')`
+- `User.where.not(admin: true)`
+- `User.where('created_at < ?', 7.days.ago)`
+
+Did you notice that the last two commands returned an `ActiveRecord::Relation`
+object that appeared to contain multiple `User` objects?
+
+Up to now, we've been using `.find` or `.find_by`, which are designed to return
+only a single object (notice the `LIMIT 1` in the generated SQL query?).
+`.where` is used when it is desirable to get a collection of objects.
+
+Let's get a collection of non-administrator users and see what we can do with it:
+
+```ruby
+users = User.where.not(admin: true)
+```
+
+Which would return:
+
+```ruby
+D, [2020-03-05T17:11:16.845387 #910] DEBUG -- : User Load (2.8ms) SELECT "users".* FROM "users" WHERE "users"."admin" != TRUE LIMIT 11
+=> #<ActiveRecord::Relation [#<User id:3 @support-bot>, #<User id:7 @alert-bot>, #<User id:5 @carrie>, #<User id:4 @bernice>, #<User id:2 @anne>]>
+```
+
+Now, try the following:
+
+- `users.count`
+- `users.order(created_at: :desc)`
+- `users.where(username: 'support-bot')`
+
+In the last command, we see that we can chain `.where` statements to generate
+more complex queries. Notice also that while the collection returned contains
+only a single object, we cannot directly interact with it:
+
+```ruby
+users.where(username: 'support-bot').username
+```
+
+Which would return:
+
+```ruby
+Traceback (most recent call last):
+ 1: from (irb):37
+D, [2020-03-05T17:18:25.637607 #910] DEBUG -- : User Load (1.6ms) SELECT "users".* FROM "users" WHERE "users"."admin" != TRUE AND "users"."username" = 'support-bot' LIMIT 11
+NoMethodError (undefined method `username' for #<ActiveRecord::Relation [#<User id:3 @support-bot>]>)
+Did you mean? by_username
+```
+
+Let's retrieve the single object from the collection by using the `.first`
+method to get the first item in the collection:
+
+```ruby
+users.where(username: 'support-bot').first.username
+```
+
+We now get the result we wanted:
+
+```ruby
+D, [2020-03-05T17:18:30.406047 #910] DEBUG -- : User Load (2.6ms) SELECT "users".* FROM "users" WHERE "users"."admin" != TRUE AND "users"."username" = 'support-bot' ORDER BY "users"."id" ASC LIMIT 1
+=> "support-bot"
+```
+
+For more on different ways to retrieve data from the database using Active
+Record, please see the [Active Record Query Interface documentation](https://guides.rubyonrails.org/active_record_querying.html).
+
+### Modifying Active Record objects
+
+In the previous section, we learned about retrieving database records using
+Active Record. Now, let's learn how to write changes to the database.
+
+First, let's retrieve the `root` user:
+
+```ruby
+user = User.find_by(username: 'root')
+```
+
+Next, let's try updating the user's password:
+
+```ruby
+user.password = 'password'
+user.save
+```
+
+Which would return:
+
+```ruby
+Enqueued ActionMailer::MailDeliveryJob (Job ID: 05915c4e-c849-4e14-80bb-696d5ae22065) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", #<GlobalID:0x00007f42d8ccebe8 @uri=#<URI::GID gid://gitlab/User/1>>
+=> true
+```
+
+Here, we see that the `.save` command returned `true`, indicating that the
+password change was successfully saved to the database.
+
+We also see that the save operation triggered some other action -- in this case
+a background job to deliver an email notification. This is an example of an
+[Active Record callback](https://guides.rubyonrails.org/active_record_callbacks.html)
+-- code which is designated to run in response to events in the Active Record
+object life cycle. This is also why using the Rails console is preferred when
+direct changes to data is necessary as changes made via direct database queries
+do not trigger these callbacks.
+
+It's also possible to update attributes in a single line:
+
+```ruby
+user.update(password: 'password')
+```
+
+Or update multiple attributes at once:
+
+```ruby
+user.update(password: 'password', email: 'hunter2@example.com')
+```
+
+Now, let's try something different:
+
+```ruby
+# Retrieve the object again so we get its latest state
+user = User.find_by(username: 'root')
+user.password = 'password'
+user.password_confirmation = 'hunter2'
+user.save
+```
+
+This returns `false`, indicating that the changes we made were not saved to the
+database. You can probably guess why, but let's find out for sure:
+
+```ruby
+user.save!
+```
+
+This should return:
+
+```ruby
+Traceback (most recent call last):
+ 1: from (irb):64
+ActiveRecord::RecordInvalid (Validation failed: Password confirmation doesn't match Password)
+```
+
+Aha! We've tripped an [Active Record Validation](https://guides.rubyonrails.org/active_record_validations.html).
+Validations are business logic put in place at the application-level to prevent
+unwanted data from being saved to the database and in most cases come with
+helpful messages letting you know how to fix the problem inputs.
+
+We can also add the bang (Ruby speak for `!`) to `.update`:
+
+```ruby
+user.update!(password: 'password', password_confirmation: 'hunter2')
+```
+
+In Ruby, method names ending with `!` are commonly known as "bang methods". By
+convention, the bang indicates that the method directly modifies the object it
+is acting on, as opposed to returning the transformed result and leaving the
+underlying object untouched. For Active Record methods that write to the
+database, bang methods also serve an additional function: they raise an
+explicit exception whenever an error occurs, instead of just returning `false`.
+
+We can also skip validations entirely:
+
+```ruby
+# Retrieve the object again so we get its latest state
+user = User.find_by(username: 'root')
+user.password = 'password'
+user.password_confirmation = 'hunter2'
+user.save!(validate: false)
+```
+
+This is not recommended, as validations are usually put in place to ensure the
+integrity and consistency of user-provided data.
+
+A validation error prevents the entire object from being saved to
+the database. You can see a little of this in the section below. If you're getting
+a mysterious red banner in the GitLab UI when submitting a form, this can often
+be the fastest way to get to the root of the problem.
+
+### Interacting with Active Record objects
+
+At the end of the day, Active Record objects are just normal Ruby objects. As
+such, we can define methods on them which perform arbitrary actions.
+
+For example, GitLab developers have added some methods which help with
+two-factor authentication:
+
+```ruby
+def disable_two_factor!
+ transaction do
+ update(
+ otp_required_for_login: false,
+ encrypted_otp_secret: nil,
+ encrypted_otp_secret_iv: nil,
+ encrypted_otp_secret_salt: nil,
+ otp_grace_period_started_at: nil,
+ otp_backup_codes: nil
+ )
+ self.u2f_registrations.destroy_all # rubocop: disable DestroyAll
+ end
+end
+
+def two_factor_enabled?
+ two_factor_otp_enabled? || two_factor_u2f_enabled?
+end
+```
+
+(See: `/opt/gitlab/embedded/service/gitlab-rails/app/models/user.rb`)
+
+We can then use these methods on any user object:
+
+```ruby
+user = User.find_by(username: 'root')
+user.two_factor_enabled?
+user.disable_two_factor!
+```
+
+Some methods are defined by gems, or Ruby software packages, which GitLab uses.
+For example, the [StateMachines](https://github.com/state-machines/state_machines-activerecord)
+gem which GitLab uses to manage user state:
+
+```ruby
+state_machine :state, initial: :active do
+ event :block do
+
+ ...
+
+ event :activate do
+
+ ...
+
+end
+```
+
+Give it a try:
+
+```ruby
+user = User.find_by(username: 'root')
+user.state
+user.block
+user.state
+user.activate
+user.state
+```
+
+Earlier, we mentioned that a validation error prevents the entire object
+from being saved to the database. Let's see how this can have unexpected
+interactions:
+
+```ruby
+user.password = 'password'
+user.password_confirmation = 'hunter2'
+user.block
+```
+
+We get `false` returned! Let's find out what happened by adding a bang as we did
+earlier:
+
+```ruby
+user.block!
+```
+
+Which would return:
+
+```ruby
+Traceback (most recent call last):
+ 1: from (irb):87
+StateMachines::InvalidTransition (Cannot transition state via :block from :active (Reason(s): Password confirmation doesn't match Password))
+```
+
+We see that a validation error from what feels like a completely separate
+attribute comes back to haunt us when we try to update the user in any way.
+
+In practical terms, we sometimes see this happen with GitLab administration settings --
+validations are sometimes added or changed in a GitLab update, resulting in
+previously saved settings now failing validation. Because you can only update
+a subset of settings at once through the UI, in this case the only way to get
+back to a good state is direct manipulation via Rails console.
+
+### Commonly used Active Record models and how to look up objects
+
+**Get a user by primary email address or username:**
+
+```ruby
+User.find_by(email: 'admin@example.com')
+User.find_by(username: 'root')
+```
+
+**Get a user by primary OR secondary email address:**
+
+```ruby
+User.find_by_any_email('user@example.com')
+```
+
+The `find_by_any_email` method is a custom method added by GitLab developers rather
+than a Rails-provided default method.
+
+**Get a collection of administrator users:**
+
+```ruby
+User.admins
+```
+
+`admins` is a [scope convenience method](https://guides.rubyonrails.org/active_record_querying.html#scopes)
+which does `where(admin: true)` under the hood.
+
+**Get a project by its path:**
+
+```ruby
+Project.find_by_full_path('group/subgroup/project')
+```
+
+`find_by_full_path` is a custom method added by GitLab developers rather
+than a Rails-provided default method.
+
+**Get a project's issue or merge request by its numeric ID:**
+
+```ruby
+project = Project.find_by_full_path('group/subgroup/project')
+project.issues.find_by(iid: 42)
+project.merge_requests.find_by(iid: 42)
+```
+
+`iid` means "internal ID" and is how we keep issue and merge request IDs
+scoped to each GitLab project.
+
+**Get a group by its path:**
+
+```ruby
+Group.find_by_full_path('group/subgroup')
+```
+
+**Get a group's related groups:**
+
+```ruby
+group = Group.find_by_full_path('group/subgroup')
+
+# Get a group's parent group
+group.parent
+
+# Get a group's child groups
+group.children
+```
+
+**Get a group's projects:**
+
+```ruby
+group = Group.find_by_full_path('group/subgroup')
+
+# Get group's immediate child projects
+group.projects
+
+# Get group's child projects, including those in subgroups
+group.all_projects
+```
+
+**Get CI pipeline or builds:**
+
+```ruby
+Ci::Pipeline.find(4151)
+Ci::Build.find(66124)
+```
+
+The pipeline and job ID numbers increment globally across your GitLab
+instance, so there's no requirement to use an internal ID attribute to look them up,
+unlike with issues or merge requests.
+
+**Get the current application settings object:**
+
+```ruby
+ApplicationSetting.current
+```
diff --git a/doc/administration/operations/ssh_certificates.md b/doc/administration/operations/ssh_certificates.md
index 3141312612e..a777f5484fd 100644
--- a/doc/administration/operations/ssh_certificates.md
+++ b/doc/administration/operations/ssh_certificates.md
@@ -96,7 +96,7 @@ Match User git
AuthorizedPrincipalsCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-principals-check %i sshUsers
```
-This command will emit output that looks something like:
+This command emits output that looks something like:
```shell
command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell username-{KEY_ID}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty {PRINCIPAL}
diff --git a/doc/administration/package_information/deprecation_policy.md b/doc/administration/package_information/deprecation_policy.md
index 420690866e5..422339c014c 100644
--- a/doc/administration/package_information/deprecation_policy.md
+++ b/doc/administration/package_information/deprecation_policy.md
@@ -41,7 +41,7 @@ We can differentiate two different types of configuration:
installation usable (like a change in default project/group settings, or
miscommunication with other components)
-We also need to differentiate deprecation and removal procedure.
+We must also differentiate deprecation and removal procedure.
#### Deprecating configuration
@@ -78,7 +78,7 @@ The final comment in the issue **has to have**:
1. Text snippet for the release blog post section
1. Documentation MR ( or snippet ) for introducing the change
-1. Draft MR removing the configuration OR details on what needs to be done. See [Adding deprecation messages](https://docs.gitlab.com/omnibus/development/adding-deprecation-messages.html) for more on this
+1. Draft MR removing the configuration or details on what must be done. See [Adding deprecation messages](https://docs.gitlab.com/omnibus/development/adding-deprecation-messages.html) for more on this
## Example
diff --git a/doc/administration/package_information/postgresql_versions.md b/doc/administration/package_information/postgresql_versions.md
index 8aab4121a0b..afdc63c4851 100644
--- a/doc/administration/package_information/postgresql_versions.md
+++ b/doc/administration/package_information/postgresql_versions.md
@@ -29,18 +29,18 @@ Read more about update policies and warnings in the PostgreSQL
| GitLab version | PostgreSQL versions | Default version for fresh installs | Default version for upgrades | Notes |
| -------------- | --------------------- | ---------------------------------- | ---------------------------- | ----- |
-| 15.0 | 12.10, 13.6 | 13.6 | 12.10 | For upgrades, users can manually upgrade to 13.6 following the [upgrade docs](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-150-and-later). |
+| 15.0 | 12.10, 13.6 | 13.6 | 12.10 | For upgrades, users can manually upgrade to 13.6 following the [upgrade documentation](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-150-and-later). |
| 14.1 | 12.7, 13.3 | 12.7 | 12.7 | PostgreSQL 13 available for fresh installations if not using [Geo](../geo/index.md#requirements-for-running-geo) or [Patroni](../postgresql/index.md#postgresql-replication-and-failover-with-omnibus-gitlab).
-| 14.0 | 12.7 | 12.7 | 12.7 | HA installations with repmgr are no longer supported and will be prevented from upgrading to Omnibus GitLab 14.0 |
+| 14.0 | 12.7 | 12.7 | 12.7 | HA installations with repmgr are no longer supported and are prevented from upgrading to Omnibus GitLab 14.0 |
| 13.8 | 11.9, 12.4 | 12.4 | 12.4 | Package upgrades automatically performed PostgreSQL upgrade for nodes that are not part of a Geo or HA cluster.). |
-| 13.7 | 11.9, 12.4 | 12.4 | 11.9 | For upgrades users can manually upgrade to 12.4 following the [upgrade docs](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-133-and-later). |
+| 13.7 | 11.9, 12.4 | 12.4 | 11.9 | For upgrades users can manually upgrade to 12.4 following the [upgrade documentation](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-133-and-later). |
| 13.4 | 11.9, 12.4 | 11.9 | 11.9 | Package upgrades aborted if users not running PostgreSQL 11 already |
| 13.3 | 11.7, 12.3 | 11.7 | 11.7 | Package upgrades aborted if users not running PostgreSQL 11 already |
| 13.0 | 11.7 | 11.7 | 11.7 | Package upgrades aborted if users not running PostgreSQL 11 already |
| 12.10 | 9.6.17, 10.12, and 11.7 | 11.7 | 11.7 | Package upgrades automatically performed PostgreSQL upgrade for nodes that are not part of a Geo or repmgr cluster. |
-| 12.8 | 9.6.17, 10.12, and 11.7 | 10.12 | 10.12 | Users can manually upgrade to 11.7 following the upgrade docs. |
+| 12.8 | 9.6.17, 10.12, and 11.7 | 10.12 | 10.12 | Users can manually upgrade to 11.7 following the upgrade documentation. |
| 12.0 | 9.6.11 and 10.7 | 10.7 | 10.7 | Package upgrades automatically performed PostgreSQL upgrade. |
-| 11.11 | 9.6.11 and 10.7 | 9.6.11 | 9.6.11 | Users can manually upgrade to 10.7 following the upgrade docs. |
+| 11.11 | 9.6.11 and 10.7 | 9.6.11 | 9.6.11 | Users can manually upgrade to 10.7 following the upgrade documentation. |
| 10.0 | 9.6.3 | 9.6.3 | 9.6.3 | Package upgrades aborted if users still on 9.2. |
| 9.0 | 9.2.18 and 9.6.1 | 9.6.1 | 9.6.1 | Package upgrades automatically performed PostgreSQL upgrade. |
-| 8.14 | 9.2.18 and 9.6.1 | 9.2.18 | 9.2.18 | Users can manually upgrade to 9.6 following the upgrade docs. |
+| 8.14 | 9.2.18 and 9.6.1 | 9.2.18 | 9.2.18 | Users can manually upgrade to 9.6 following the upgrade documentation. |
diff --git a/doc/administration/package_information/supported_os.md b/doc/administration/package_information/supported_os.md
index f2838cd779b..4f31981a05c 100644
--- a/doc/administration/package_information/supported_os.md
+++ b/doc/administration/package_information/supported_os.md
@@ -15,28 +15,27 @@ page](https://about.gitlab.com/install/).
The following lists the currently supported OSs and their possible EOL dates.
-| OS Version | First supported GitLab version | Arch | Install Docs | OS EOL | Details |
+| OS Version | First supported GitLab version | Arch | Install Documentation | OS EOL | Details |
| ------------------------------------------------------------ | ------------------------------ | --------------- | :----------------------------------------------------------: | ---------- | ------------------------------------------------------------ |
-| AlmaLinux 8 | GitLab CE / GitLab EE 14.5.0 | x86_64, aarch64 | [AlmaLinux Install Docs](https://about.gitlab.com/install/#almalinux-8) | 2029 | <https://almalinux.org/> |
-| CentOS 7 | GitLab CE / GitLab EE 7.10.0 | x86_64 | [CentOS Install Docs](https://about.gitlab.com/install/#centos-7) | June 2024 | <https://wiki.centos.org/About/Product> |
-| Debian 9 | GitLab CE / GitLab EE 9.3.0 | amd64 | [Debian Install Docs](https://about.gitlab.com/install/#debian) | 2022 | <https://wiki.debian.org/LTS> |
-| Debian 10 | GitLab CE / GitLab EE 12.2.0 | amd64, arm64 | [Debian Install Docs](https://about.gitlab.com/install/#debian) | 2024 | <https://wiki.debian.org/LTS> |
-| Debian 11 | GitLab CE / GitLab EE 14.6.0 | amd64, arm64 | [Debian Install Docs](https://about.gitlab.com/install/#debian) | 2026 | <https://wiki.debian.org/LTS> |
-| OpenSUSE 15.3 | GitLab CE / GitLab EE 14.5.0 | x86_64, aarch64 | [OpenSUSE Install Docs](https://about.gitlab.com/install/#opensuse-leap-15-3) | Nov 2022 | <https://en.opensuse.org/Lifetime> |
-| RHEL 8 | GitLab CE / GitLab EE 12.8.1 | x86_64, arm64 | [Use CentOS Install Docs](https://about.gitlab.com/install/#centos-7) | May 2024 | [RHEL Details](https://access.redhat.com/support/policy/updates/errata/#Life_Cycle_Dates) |
-| SLES 12 | GitLab EE 9.0.0 | x86_64 | [Use OpenSUSE Install Docs](https://about.gitlab.com/install/#opensuse-leap-15-3) | Oct 2027 | <https://www.suse.com/lifecycle/> |
-
-| Oracle Linux | GitLab CE / GitLab EE 8.14.0 | x86_64 | [Use CentOS Install Docs](https://about.gitlab.com/install/#centos-7) | Jul 2024 | <https://www.oracle.com/a/ocom/docs/elsp-lifetime-069338.pdf> |
-| Scientific Linux | GitLab CE / GitLab EE 8.14.0 | x86_64 | [Use CentOS Install Docs](https://about.gitlab.com/install/#centos-7) | June 2024 | <https://scientificlinux.org/downloads/sl-versions/sl7/> |
-| Ubuntu 18.04 | GitLab CE / GitLab EE 10.7.0 | amd64 | [Ubuntu Install Docs](https://about.gitlab.com/install/#ubuntu) | April 2023 | <https://wiki.ubuntu.com/Releases> |
-| Ubuntu 20.04 | GitLab CE / GitLab EE 13.2.0 | amd64, arm64 | [Ubuntu Install Docs](https://about.gitlab.com/install/#ubuntu) | April 2025 | <https://wiki.ubuntu.com/Releases> |
-| Amazon Linux 2 | GitLab CE / GitLab EE 14.9.0 | amd64, arm64 | [Amazon Linux 2 Instal Docsl](https://about.gitlab.com/install/#amazonlinux-2) | June 2023 | <https://aws.amazon.com/amazon-linux-2/faqs/> |
-| Raspberry Pi OS (Buster) (formerly known as Raspbian Buster) | GitLab CE 12.2.0 | armhf | [Raspberry Pi Install Docs](https://about.gitlab.com/install/#raspberry-pi-os) | 2024 | [Raspberry Pi Details](https://www.raspberrypi.com/news/new-old-functionality-with-raspberry-pi-os-legacy/) |
+| AlmaLinux 8 | GitLab CE / GitLab EE 14.5.0 | x86_64, aarch64 | [AlmaLinux Install Documentation](https://about.gitlab.com/install/#almalinux-8) | 2029 | <https://almalinux.org/> |
+| CentOS 7 | GitLab CE / GitLab EE 7.10.0 | x86_64 | [CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | June 2024 | <https://wiki.centos.org/About/Product> |
+| Debian 9 | GitLab CE / GitLab EE 9.3.0 | amd64 | [Debian Install Documentation](https://about.gitlab.com/install/#debian) | 2022 | <https://wiki.debian.org/LTS> |
+| Debian 10 | GitLab CE / GitLab EE 12.2.0 | amd64, arm64 | [Debian Install Documentation](https://about.gitlab.com/install/#debian) | 2024 | <https://wiki.debian.org/LTS> |
+| Debian 11 | GitLab CE / GitLab EE 14.6.0 | amd64, arm64 | [Debian Install Documentation](https://about.gitlab.com/install/#debian) | 2026 | <https://wiki.debian.org/LTS> |
+| OpenSUSE 15.3 | GitLab CE / GitLab EE 14.5.0 | x86_64, aarch64 | [OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap-15-3) | Nov 2022 | <https://en.opensuse.org/Lifetime> |
+| RHEL 8 | GitLab CE / GitLab EE 12.8.1 | x86_64, arm64 | [Use CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | May 2024 | [RHEL Details](https://access.redhat.com/support/policy/updates/errata/#Life_Cycle_Dates) |
+| SLES 12 | GitLab EE 9.0.0 | x86_64 | [Use OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap-15-3) | Oct 2027 | <https://www.suse.com/lifecycle/> |
+| Oracle Linux | GitLab CE / GitLab EE 8.14.0 | x86_64 | [Use CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | Jul 2024 | <https://www.oracle.com/a/ocom/docs/elsp-lifetime-069338.pdf> |
+| Scientific Linux | GitLab CE / GitLab EE 8.14.0 | x86_64 | [Use CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | June 2024 | <https://scientificlinux.org/downloads/sl-versions/sl7/> |
+| Ubuntu 18.04 | GitLab CE / GitLab EE 10.7.0 | amd64 | [Ubuntu Install Documentation](https://about.gitlab.com/install/#ubuntu) | April 2023 | <https://wiki.ubuntu.com/Releases> |
+| Ubuntu 20.04 | GitLab CE / GitLab EE 13.2.0 | amd64, arm64 | [Ubuntu Install Documentation](https://about.gitlab.com/install/#ubuntu) | April 2025 | <https://wiki.ubuntu.com/Releases> |
+| Amazon Linux 2 | GitLab CE / GitLab EE 14.9.0 | amd64, arm64 | [Amazon Linux 2 Install Documentation](https://about.gitlab.com/install/#amazonlinux-2) | June 2023 | <https://aws.amazon.com/amazon-linux-2/faqs/> |
+| Raspberry Pi OS (Buster) (formerly known as Raspbian Buster) | GitLab CE 12.2.0 | armhf | [Raspberry Pi Install Documentation](https://about.gitlab.com/install/#raspberry-pi-os) | 2024 | [Raspberry Pi Details](https://www.raspberrypi.com/news/new-old-functionality-with-raspberry-pi-os-legacy/) |
NOTE:
CentOS 8 was EOL on December 31, 2021. In GitLab 14.5 and later,
[CentOS builds work in AlmaLinux](https://gitlab.com/gitlab-org/distribution/team-tasks/-/issues/954#note_730198505).
-We will officially support all distributions that are binary compatible with Red Hat Enterprise Linux.
+We officially support all distributions that are binary compatible with Red Hat Enterprise Linux.
This gives users a path forward for their CentOS 8 builds at its end of life.
## Update GitLab package sources after upgrading the OS
@@ -48,7 +47,7 @@ If your package manager reports that no further updates are available,
although [new versions have been released](https://about.gitlab.com/releases/categories/releases/), repeat the
"Add the GitLab package repository" instructions
of the [Linux package install guide](https://about.gitlab.com/install/#content).
-Future GitLab upgrades will now be fetched according to your upgraded OS.
+Future GitLab upgrades are fetched according to your upgraded OS.
## Packages for ARM64
@@ -65,7 +64,7 @@ running GitLab on ARM.
## OS Versions that are no longer supported
GitLab provides omnibus packages for operating systems only until their
-EOL (End-Of-Life). After the EOL date of the OS, GitLab will stop releasing
+EOL (End-Of-Life). After the EOL date of the OS, GitLab stops releasing
official packages. The list of deprecated operating systems and the final GitLab
release for them can be found below:
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 2fa3eea54bd..3bfb3ceca86 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -887,7 +887,7 @@ administrators can clean up image tags
and [run garbage collection](#container-registry-garbage-collection).
To remove image tags by running the cleanup policy, run the following commands in the
-[GitLab Rails console](../troubleshooting/navigating_gitlab_via_rails_console.md):
+[GitLab Rails console](../operations/rails_console.md):
```ruby
# Numeric ID of the project whose container registry should be cleaned up
@@ -927,9 +927,9 @@ these controls should migrate to the GitLab interface.
Users who have the [Maintainer role](../../user/permissions.md) for the project can
[delete Container Registry tags in bulk](../../api/container_registry.md#delete-registry-repository-tags-in-bulk)
-periodically based on their own criteria, however, this alone does not recycle data,
+periodically based on their own criteria. However, deleting the tags alone does not recycle data,
it only unlinks tags from manifests and image blobs. To recycle the Container
-Registry data in the whole GitLab instance, you can use the built-in command
+Registry data in the whole GitLab instance, you can use the built-in garbage collection command
provided by `gitlab-ctl`.
Prerequisites:
@@ -938,7 +938,7 @@ Prerequisites:
[cloud native chart](https://docs.gitlab.com/charts/charts/registry/#garbage-collection).
- You must set the Registry to [read-only mode](#performing-garbage-collection-without-downtime).
Running garbage collection causes downtime for the Container Registry. When you run this command
- on an instance in an environment where another instances is still writing to the Registry storage,
+ on an instance in an environment where another instance is still writing to the Registry storage,
referenced manifests are removed.
### Understanding the content-addressable layers
@@ -1389,7 +1389,7 @@ project or branch name. Special characters can include:
- Double hyphen/dash
To get around this, you can [change the group path](../../user/group/index.md#change-a-groups-path),
-[change the project path](../../user/project/settings/index.md#renaming-a-repository) or change the
+[change the project path](../../user/project/settings/index.md#rename-a-repository) or change the
branch name. Another option is to create a [push rule](../../user/project/repository/push_rules.md) to prevent
this at the instance level.
@@ -1452,7 +1452,7 @@ curl "localhost:5001/debug/vars"
### Access old schema v1 Docker images
-Support for the [Docker registry v1 API](https://www.docker.com/blog/registry-v1-api-deprecation/),
+Support for the Docker registry API V1,
including [schema V1 image manifests](https://docs.docker.com/registry/spec/manifest-v2-1/),
was:
@@ -1738,7 +1738,7 @@ In this case, follow these steps:
1. Try the removal again.
If you still can't remove the repository using the common methods, you can use the
-[GitLab Rails console](../troubleshooting/navigating_gitlab_via_rails_console.md)
+[GitLab Rails console](../operations/rails_console.md)
to remove the project by force:
```ruby
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 1535de0c2c2..b58eeff48cf 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -269,6 +269,9 @@ control over how the Pages daemon runs and serves content in your environment.
| `max_uri_length` | The maximum length of URIs accepted by GitLab Pages. Set to 0 for unlimited length. [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/659) in GitLab 14.5.
| `metrics_address` | The address to listen on for metrics requests. |
| `redirect_http` | Redirect pages from HTTP to HTTPS, true/false. |
+| `redirects_max_config_size` | The maximum size of the _redirects file, in bytes (default: 65536). |
+| `redirects_max_path_segments` | The maximum number of path segments allowed in _redirects rules URLs (default: 25). |
+| `redirects_max_rule_count` | The maximum number of rules allowed in _redirects (default: 1000). |
| `sentry_dsn` | The address for sending Sentry crash reporting to. |
| `sentry_enabled` | Enable reporting and logging with Sentry, true/false. |
| `sentry_environment` | The environment for Sentry crash reporting. |
@@ -489,11 +492,6 @@ To do that:
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
-redeployed. Resolve this issue by
-[sourcing domain configuration from the GitLab API](https://gitlab.com/gitlab-org/gitlab/-/issues/218357).
-
### Running behind a proxy
Like the rest of GitLab, Pages can be used in those environments where external
@@ -582,6 +580,19 @@ HTTP Strict Transport Security (HSTS) can be enabled through the `gitlab_pages['
gitlab_pages['headers'] = ['Strict-Transport-Security: max-age=63072000']
```
+### Pages project redirects limits
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/778) in GitLab 15.2.
+
+GitLab Pages comes with a set of default limits for the [`_redirects` file](../../user/project/pages/redirects.md)
+to minimize the impact on performance. You can configure these limits if you'd like to increase or decrease the limits.
+
+```ruby
+gitlab_pages['redirects_max_config_size'] = 131072
+gitlab_pages['redirects_max_path_segments'] = 50
+gitlab_pages['redirects_max_rule_count'] = 2000
+```
+
## Activate verbose logging for daemon
Follow the steps below to configure verbose logging of GitLab Pages daemon.
@@ -1400,7 +1411,7 @@ this setting needs to be configured on the main GitLab server.
If the wildcard DNS [prerequisite](#prerequisites) can't be met, you can still use GitLab Pages in a limited fashion:
-1. [Move](../../user/project/settings/index.md#transferring-an-existing-project-into-another-namespace)
+1. [Move](../../user/project/settings/index.md#transfer-a-project-to-another-namespace)
all projects you need to use Pages with into a single group namespace, for example `pages`.
1. Configure a [DNS entry](#dns-configuration) without the `*.`-wildcard, for example `pages.example.io`.
1. Configure `pages_external_url http://example.io/` in your `gitlab.rb` file.
diff --git a/doc/administration/postgresql/external.md b/doc/administration/postgresql/external.md
index 5d693793a92..7036502e377 100644
--- a/doc/administration/postgresql/external.md
+++ b/doc/administration/postgresql/external.md
@@ -21,7 +21,7 @@ If you use a cloud-managed service, or provide your own PostgreSQL instance:
1. If you are using a cloud-managed service, you may need to grant additional
roles to your `gitlab` user:
- Amazon RDS requires the [`rds_superuser`](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.Roles) role.
- - Azure Database for PostgreSQL requires the [`azure_pg_admin`](https://docs.microsoft.com/en-us/azure/postgresql/howto-create-users#how-to-create-additional-admin-users-in-azure-database-for-postgresql) role. Azure Database for PostgreSQL - Flexible Server requires [allow-listing extensions before they can be installed](https://docs.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-extensions#how-to-use-postgresql-extensions).
+ - Azure Database for PostgreSQL requires the [`azure_pg_admin`](https://docs.microsoft.com/en-us/azure/postgresql/single-server/how-to-create-users#how-to-create-additional-admin-users-in-azure-database-for-postgresql) role. Azure Database for PostgreSQL - Flexible Server requires [allow-listing extensions before they can be installed](https://docs.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-extensions#how-to-use-postgresql-extensions).
- Google Cloud SQL requires the [`cloudsqlsuperuser`](https://cloud.google.com/sql/docs/postgres/users#default-users) role.
This is for the installation of extensions during installation and upgrades. As an alternative,
@@ -48,3 +48,20 @@ If you use a cloud-managed service, or provide your own PostgreSQL instance:
```shell
sudo gitlab-ctl reconfigure
```
+
+## Troubleshooting
+
+### Resolve `SSL SYSCALL error: EOF detected` error
+
+When using an external PostgreSQL instance, you may see an error like:
+
+```shell
+pg_dump: error: Error message from server: SSL SYSCALL error: EOF detected
+```
+
+To resolve this error, ensure that you are meeting the
+[minimum PostgreSQL requirements](../../install/requirements.md#postgresql-requirements). After
+upgrading your RDS instance to a suitable version, you should be able to perform a backup without
+this error. Refer to issue #64763
+([Segmentation fault citing `LooseForeignKeys::CleanupWorker` causes complete database restart](https://gitlab.com/gitlab-org/gitlab/-/issues/364763))
+for more information.
diff --git a/doc/administration/postgresql/moving.md b/doc/administration/postgresql/moving.md
new file mode 100644
index 00000000000..23d377dba37
--- /dev/null
+++ b/doc/administration/postgresql/moving.md
@@ -0,0 +1,65 @@
+---
+stage: Data Stores
+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
+---
+
+# Moving GitLab databases to a different PostgreSQL instance **(FREE SELF)**
+
+Sometimes it is necessary to move your databases from one PostgreSQL instance to
+another. For example, if you are using AWS Aurora and are preparing to
+enable Database Load Balancing, you will need to move your databases to
+RDS for PostgreSQL.
+
+To move databases from one instance to another:
+
+1. Gather the source and destination PostgreSQL endpoint information:
+
+ ```shell
+ SRC_PGHOST=<source postgresql host>
+ SRC_PGUSER=<source postgresql user>
+
+ DST_PGHOST=<destination postgresql host>
+ DST_PGUSER=<destination postgresql user>
+ ```
+
+1. Stop GitLab:
+
+ ```shell
+ sudo gitlab-ctl stop
+ ```
+
+1. Dump the databases from the source:
+
+ ```shell
+ /opt/gitlab/embedded/bin/pg_dump -h $SRC_PGHOST -U $SRC_PGUSER -c -C -f gitlabhq_production.sql gitlabhq_production
+ /opt/gitlab/embedded/bin/pg_dump -h $SRC_PGHOST -U $SRC_PGUSER -c -C -f praefect_production.sql praefect_production
+ ```
+
+1. Restore the databases to the destination (this will overwrite any existing databases with the same names):
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -h $DST_PGHOST -U $DST_PGUSER -f praefect_production.sql postgres
+ /opt/gitlab/embedded/bin/psql -h $DST_PGHOST -U $DST_PGUSER -f gitlabhq_production.sql postgres
+ ```
+
+1. Configure the GitLab application servers with the appropriate connection details
+ for your destination PostgreSQL instance in your `/etc/gitlab/gitlab.rb` file:
+
+ ```ruby
+ gitlab_rails['db_host'] = '<destination postgresql host>'
+ ```
+
+ For more information on GitLab multi-node setups, refer to the [reference architectures](../reference_architectures/index.md).
+
+1. Reconfigure for the changes to take effect:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Restart GitLab:
+
+ ```shell
+ sudo gitlab-ctl start
+ ```
diff --git a/doc/administration/postgresql/pgbouncer.md b/doc/administration/postgresql/pgbouncer.md
index 8ae2b6497f8..b12edd4b9ad 100644
--- a/doc/administration/postgresql/pgbouncer.md
+++ b/doc/administration/postgresql/pgbouncer.md
@@ -173,7 +173,7 @@ ote_pid | tls
Some database changes have to be done directly, and not through PgBouncer.
Read more about the affected tasks: [database restores](../../raketasks/backup_restore.md#back-up-and-restore-for-installations-using-pgbouncer)
-and [GitLab upgrades](../../update/zero_downtime.md#use-postgresql-ha).
+and [GitLab upgrades](../../update/zero_downtime.md#postgresql).
1. To find the primary node, run the following on a database node:
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index e9b607ad5d4..37471a4f491 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -996,7 +996,7 @@ You can switch an exiting database cluster to use Patroni instead of repmgr with
### Upgrading PostgreSQL major version in a Patroni cluster
-As of GitLab 13.3, PostgreSQL 11.7 and 12.3 are both shipped with Omnibus GitLab by default. As of GitLab 13.7, PostgreSQL 12 is the default. If you want to upgrade to PostgreSQL 12 in versions prior to GitLab 13.7, you must ask for it explicitly.
+As of GitLab 14.1, PostgreSQL 12.6 and 13.3 are both shipped with Omnibus GitLab by default. As of GitLab 15.0, PostgreSQL 13 is the default. If you want to upgrade to PostgreSQL 13 in versions prior to GitLab 15.0, you must ask for it explicitly.
WARNING:
The procedure for upgrading PostgreSQL in a Patroni cluster is different than when upgrading using repmgr.
@@ -1046,7 +1046,7 @@ Considering these, you should carefully plan your PostgreSQL upgrade:
1. Upgrade PostgreSQL on **the leader node** and make sure that the upgrade is completed successfully:
```shell
- sudo gitlab-ctl pg-upgrade -V 12
+ sudo gitlab-ctl pg-upgrade -V 13
```
NOTE:
@@ -1073,7 +1073,7 @@ Considering these, you should carefully plan your PostgreSQL upgrade:
1. Upgrade PostgreSQL **on replicas** (you can do this in parallel on all of them):
```shell
- sudo gitlab-ctl pg-upgrade -V 12
+ sudo gitlab-ctl pg-upgrade -V 13
```
NOTE:
diff --git a/doc/administration/raketasks/check.md b/doc/administration/raketasks/check.md
index d66ff9afb94..cf569cd81d0 100644
--- a/doc/administration/raketasks/check.md
+++ b/doc/administration/raketasks/check.md
@@ -211,7 +211,7 @@ secrets file (`gitlab-secrets.json`).
Automatic resolution is not yet implemented. If you have values that
cannot be decrypted, you can follow steps to reset them, see our
-docs on what to do [when the secrets file is lost](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
+documentation on what to do [when the secrets file is lost](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
This can take a very long time, depending on the size of your
database, as it checks all rows in all tables.
@@ -352,23 +352,23 @@ When this scenario is detected, the Rake task displays an error message. For exa
```shell
Checking integrity of Job artifacts
-- 3..8: Failures: 2
- - Job artifact: 3: #<Errno::ENOENT: No such file or directory @ rb_sysopen - /var/opt/gitlab/gitlab-rails/shared/artifacts/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce/2021_05_26/5/3/job.log>
- - Job artifact: 8: #<Errno::ENOENT: No such file or directory @ rb_sysopen - /var/opt/gitlab/gitlab-rails/shared/artifacts/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce/2021_05_26/6/8/job.log>
+- 1..15: Failures: 2
+ - Job artifact: 9: #<Errno::ENOENT: No such file or directory @ rb_sysopen - /var/opt/gitlab/gitlab-rails/shared/artifacts/4b/22/4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a/2022_06_30/8/9/job.log>
+ - Job artifact: 15: Remote object does not exist
Done!
```
-To delete these references to missing local artifacts (`job.log` files):
+To delete these references to missing local and/or remote artifacts (`job.log` files):
1. Open the [GitLab Rails Console](../operations/rails_console.md#starting-a-rails-console-session).
1. Run the following Ruby code:
```ruby
artifacts_deleted = 0
- ::Ci::JobArtifact.find_each do |artifact| ### Iterate artifacts
+ ::Ci::JobArtifact.find_each do |artifact| ### Iterate artifacts
# next if artifact.file.filename != "job.log" ### Uncomment if only `job.log` files' references are to be processed
- next if artifact.file.exists? ### Skip if the file reference is valid
+ next if artifact.file.file.exists? ### Skip if the file reference is valid
artifacts_deleted += 1
puts "#{artifact.id} #{artifact.file.path} is missing." ### Allow verification before destroy
# artifact.destroy! ### Uncomment to actually destroy
diff --git a/doc/administration/raketasks/github_import.md b/doc/administration/raketasks/github_import.md
index 30c8518c209..0d724bfd4dc 100644
--- a/doc/administration/raketasks/github_import.md
+++ b/doc/administration/raketasks/github_import.md
@@ -11,13 +11,13 @@ A username should be passed as the second argument to the Rake task,
which becomes the owner of the project. You can resume an import
with the same command.
-Bear in mind that the syntax is very specific. Remove any spaces within the argument block and
+Bear in mind that the syntax is very specific. Remove any spaces in the argument block and
before/after the brackets. Also, some shells (for example, Zsh) can interpret the open/close brackets
-(`[]`) separately. You may need to either escape the brackets or use double quotes.
+(`[]`) separately. You may want to either escape the brackets or use double quotes.
## Caveats
-If the GitHub [rate limit](https://docs.github.com/en/rest/reference/rate-limit) is reached while
+If the GitHub [rate limit](https://docs.github.com/en/rest/rate-limit) is reached while
importing, the importing process waits (`sleep()`) until it can continue importing.
## Importing multiple projects
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index f4bd6f255e5..6de47c37957 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -186,7 +186,7 @@ Checking GitLab ... Finished
## Rebuild `authorized_keys` file
In some cases it is necessary to rebuild the `authorized_keys` file,
-for example, if after an upgrade you receive `Permission denied (publickey)` when pushing [via SSH](../../ssh/index.md)
+for example, if after an upgrade you receive `Permission denied (publickey)` when pushing [via SSH](../../user/ssh.md)
and find `404 Key Not Found` errors in [the `gitlab-shell.log` file](../logs.md#gitlab-shelllog).
To rebuild `authorized_keys`, run:
@@ -234,7 +234,7 @@ sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
Sometimes during version upgrades you might end up with some wrong CSS or
missing some icons. In that case, try to precompile the assets again.
-This only applies to source installations and does NOT apply to
+This only applies to source installations and does not apply to
Omnibus packages.
**Source Installation**
diff --git a/doc/administration/raketasks/praefect.md b/doc/administration/raketasks/praefect.md
index d2fd4943c68..b7db3f26a60 100644
--- a/doc/administration/raketasks/praefect.md
+++ b/doc/administration/raketasks/praefect.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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
---
# Praefect Rake tasks **(FREE SELF)**
diff --git a/doc/administration/raketasks/smtp.md b/doc/administration/raketasks/smtp.md
index bc78d54aa1b..49274501809 100644
--- a/doc/administration/raketasks/smtp.md
+++ b/doc/administration/raketasks/smtp.md
@@ -55,7 +55,7 @@ bundle exec rake gitlab:smtp:secret:edit RAILS_ENV=production EDITOR=vim
### Write raw secret
-Write new secret content by providing it on STDIN.
+Write new secret content by providing it on `STDIN`.
**Omnibus Installation**
diff --git a/doc/administration/read_only_gitlab.md b/doc/administration/read_only_gitlab.md
index a601ba4cd7a..387a1a75393 100644
--- a/doc/administration/read_only_gitlab.md
+++ b/doc/administration/read_only_gitlab.md
@@ -63,7 +63,7 @@ sudo gitlab-ctl start puma
## Make the database read-only
-If you want to allow users to use the GitLab UI, then you need to ensure that
+If you want to allow users to use the GitLab UI, ensure that
the database is read-only:
1. Take a [GitLab backup](../raketasks/backup_restore.md)
@@ -113,7 +113,7 @@ the database is read-only:
sudo gitlab-ctl restart postgresql
```
-When you're ready to revert the read-only state, you need to remove the added
+When you're ready to revert the read-only state, remove the added
lines in `/etc/gitlab/gitlab.rb`, and reconfigure GitLab and restart PostgreSQL:
```shell
@@ -121,5 +121,5 @@ sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart postgresql
```
-Once you verify all works as expected, you can remove the `gitlab_read_only`
+After you verify all works as expected, remove the `gitlab_read_only`
user from the database.
diff --git a/doc/administration/redis/index.md b/doc/administration/redis/index.md
index 3581b27a4c8..fb5f6cc3a54 100644
--- a/doc/administration/redis/index.md
+++ b/doc/administration/redis/index.md
@@ -12,7 +12,7 @@ multiple ways to configure Redis.
You can choose to install and manage Redis and Sentinel yourself, use a hosted
cloud solution, or you can use the ones that come bundled with the Omnibus GitLab
-packages so you only need to focus on configuration. Pick the one that suits your needs.
+packages so you can only focus on configuration. Pick the one that suits your needs.
## Redis replication and failover using Omnibus GitLab
diff --git a/doc/administration/redis/standalone.md b/doc/administration/redis/standalone.md
index 6e0e1eb886e..bd5b30efb7b 100644
--- a/doc/administration/redis/standalone.md
+++ b/doc/administration/redis/standalone.md
@@ -44,7 +44,7 @@ Omnibus GitLab:
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
1. Note the Redis node's IP address or hostname, port, and
- Redis password. These will be necessary when [configuring the GitLab application servers](#set-up-the-gitlab-rails-application-instance).
+ Redis password. These are necessary when [configuring the GitLab application servers](#set-up-the-gitlab-rails-application-instance).
[Advanced configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
are supported and can be added if needed.
diff --git a/doc/administration/redis/troubleshooting.md b/doc/administration/redis/troubleshooting.md
index 4426adc5d51..ca52fe0a29a 100644
--- a/doc/administration/redis/troubleshooting.md
+++ b/doc/administration/redis/troubleshooting.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Troubleshooting Redis **(FREE SELF)**
-There are a lot of moving parts that needs to be taken care carefully
+There are a lot of moving parts that must be taken care carefully
in order for the HA setup to work as expected.
Before proceeding with the troubleshooting below, check your firewall rules:
@@ -41,7 +41,7 @@ You can check if everything is correct by connecting to each server using
/opt/gitlab/embedded/bin/redis-cli -h <redis-host-or-ip> -a '<redis-password>' info replication
```
-When connected to a `Primary` Redis, you will see the number of connected
+When connected to a `Primary` Redis, you see the number of connected
`replicas`, and a list of each with connection details:
```plaintext
@@ -56,7 +56,7 @@ repl_backlog_first_byte_offset:206989083
repl_backlog_histlen:1048576
```
-When it's a `replica`, you will see details of the primary connection and if
+When it's a `replica`, you see details of the primary connection and if
its `up` or `down`:
```plaintext
@@ -138,7 +138,7 @@ there may be something wrong with your configuration files or it can be related
to [this upstream issue](https://github.com/redis/redis-rb/issues/531).
You must make sure that `resque.yml` and `sentinel.conf` are configured correctly,
-otherwise `redis-rb` will not work properly.
+otherwise `redis-rb` does not work properly.
The `master-group-name` (`gitlab-redis`) defined in (`sentinel.conf`)
**must** be used as the hostname in GitLab (`resque.yml`):
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index 99272cdd226..a64828be4be 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -38,7 +38,7 @@ full list of reference architectures, see
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
@@ -153,6 +153,7 @@ As a general guidance, GitLab should run on most infrastructure such as reputabl
Be aware of the following specific call outs:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/#:~:text=Azure%20Database%20for%20PostgreSQL%20is,high%20availability%2C%20and%20dynamic%20scalability.) is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to known performance issues or missing features.
- [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/) is recommended to be configured with [Premium accounts](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-block-blob-premium) to ensure consistent performance.
@@ -502,7 +503,7 @@ cluster to be used with GitLab.
If you're hosting GitLab on a cloud provider, you can optionally use a
managed service for PostgreSQL.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
If you use a cloud-managed service, or provide your own PostgreSQL:
@@ -1271,7 +1272,7 @@ you are using Geo, where separate database instances are required for handling r
In this setup, the specs of the main database setup shouldn't need to be changed as the impact should be
minimal.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
@@ -1351,6 +1352,9 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+ NOTE:
+ You can't remove the `default` entry from `virtual_storages` because [GitLab requires it](../gitaly/configure_gitaly.md#gitlab-requires-a-default-repository-storage).
+
<!--
Updates to example must be made at:
- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
@@ -2202,7 +2206,7 @@ on what features you intend to use:
|Object storage type|Supported by consolidated configuration?|
|-------------------|----------------------------------------|
-| [Backups](../../raketasks/backup_restore.md#uploading-backups-to-a-remote-cloud-storage) | No |
+| [Backups](../../raketasks/backup_gitlab.md#uploading-backups-to-a-remote-cloud-storage) | No |
| [Job artifacts](../job_artifacts.md#using-object-storage) including archived job logs | Yes |
| [LFS objects](../lfs/index.md#storing-lfs-objects-in-remote-object-storage) | Yes |
| [Uploads](../uploads.md#using-object-storage) | Yes |
@@ -2328,7 +2332,7 @@ services where applicable):
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
diff --git a/doc/administration/reference_architectures/1k_users.md b/doc/administration/reference_architectures/1k_users.md
index c356c7224cb..1a774603863 100644
--- a/doc/administration/reference_architectures/1k_users.md
+++ b/doc/administration/reference_architectures/1k_users.md
@@ -10,7 +10,7 @@ This page describes GitLab reference architecture for up to 1,000 users. For a
full list of reference architectures, see
[Available reference architectures](index.md#available-reference-architectures).
-If you need to serve up to 1,000 users and you don't have strict availability
+If you are serving up to 1,000 users and you don't have strict availability
requirements, a single-node solution with
[frequent backups](index.md#automated-backups) is appropriate for
many organizations.
@@ -83,6 +83,7 @@ As a general guidance, GitLab should run on most infrastructure such as reputabl
Be aware of the following specific call outs:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/#:~:text=Azure%20Database%20for%20PostgreSQL%20is,high%20availability%2C%20and%20dynamic%20scalability.) is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to known performance issues or missing features.
- [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/) is recommended to be configured with [Premium accounts](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-block-blob-premium) to ensure consistent performance.
@@ -93,7 +94,8 @@ swap on your server, even if you currently have enough available memory. Having
swap helps to reduce the chance of errors occurring if your available memory
changes. We also recommend configuring the kernel's swappiness setting to a
lower value (such as `10`) to make the most of your memory, while still having
-the swap available when needed.
+the swap available when needed. View the
+[Memory requirements](../../install/requirements.md#memory) for details.
## Setup instructions
@@ -121,4 +123,4 @@ components are deployed in Kubernetes via our official [Helm Charts](https://doc
and _stateful_ components are deployed in compute VMs with Omnibus.
The [2k GitLab Cloud Native Hybrid](2k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) (non HA) and [3k GitLab Cloud Native Hybrid](3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) (HA) reference architectures are the smallest we recommend in Kubernetes.
-For environments that need to serve less users, you can lower the node specs. Depending on your user count, you can lower all suggested node specs as desired. However, it's recommended that you don't go lower than the [general requirements](../../install/requirements.md).
+For environments that serve fewer users, you can lower the node specs. Depending on your user count, you can lower all suggested node specs as desired. However, it's recommended that you don't go lower than the [general requirements](../../install/requirements.md).
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 367654b8e59..5b1e8bfc16b 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -38,7 +38,7 @@ full list of reference architectures, see
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
@@ -153,6 +153,7 @@ As a general guidance, GitLab should run on most infrastructure such as reputabl
Be aware of the following specific call outs:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/#:~:text=Azure%20Database%20for%20PostgreSQL%20is,high%20availability%2C%20and%20dynamic%20scalability.) is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to known performance issues or missing features.
- [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/) is recommended to be configured with [Premium accounts](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-block-blob-premium) to ensure consistent performance.
@@ -505,7 +506,7 @@ cluster to be used with GitLab.
If you're hosting GitLab on a cloud provider, you can optionally use a
managed service for PostgreSQL.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
If you use a cloud-managed service, or provide your own PostgreSQL:
@@ -1277,7 +1278,7 @@ you are using Geo, where separate database instances are required for handling r
In this setup, the specs of the main database setup shouldn't need to be changed as the impact should be
minimal.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
@@ -1355,6 +1356,9 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+ NOTE:
+ You can't remove the `default` entry from `virtual_storages` because [GitLab requires it](../gitaly/configure_gitaly.md#gitlab-requires-a-default-repository-storage).
+
<!--
Updates to example must be made at:
- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
@@ -2206,7 +2210,7 @@ on what features you intend to use:
|Object storage type|Supported by consolidated configuration?|
|-------------------|----------------------------------------|
-| [Backups](../../raketasks/backup_restore.md#uploading-backups-to-a-remote-cloud-storage) | No |
+| [Backups](../../raketasks/backup_gitlab.md#uploading-backups-to-a-remote-cloud-storage) | No |
| [Job artifacts](../job_artifacts.md#using-object-storage) including archived job logs | Yes |
| [LFS objects](../lfs/index.md#storing-lfs-objects-in-remote-object-storage) | Yes |
| [Uploads](../uploads.md#using-object-storage) | Yes |
@@ -2326,7 +2330,7 @@ services where applicable):
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 3b9a8f966c8..df84bf0402d 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -31,7 +31,7 @@ For a full list of reference architectures, see
| NFS server (non-Gitaly) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
<!-- markdownlint-disable MD029 -->
-1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul is also used optionally by Prometheus for Omnibus auto host discovery.
2. Can be optionally run as reputable third-party external PaaS Redis solutions. Google Memorystore and AWS ElastiCache are known to work.
3. Can be optionally run as 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.
@@ -89,6 +89,7 @@ As a general guidance, GitLab should run on most infrastructure such as reputabl
Be aware of the following specific call outs:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/#:~:text=Azure%20Database%20for%20PostgreSQL%20is,high%20availability%2C%20and%20dynamic%20scalability.) is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to known performance issues or missing features.
- [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/) is recommended to be configured with [Premium accounts](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-block-blob-premium) to ensure consistent performance.
@@ -246,7 +247,7 @@ to be used with GitLab.
If you're hosting GitLab on a cloud provider, you can optionally use a
managed service for PostgreSQL.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
If you use a cloud-managed service, or provide your own PostgreSQL:
@@ -444,6 +445,9 @@ To configure the Gitaly server, on the server node you want to use for Gitaly:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
+ NOTE:
+ You can't remove the `default` entry from `git_data_dirs` because [GitLab requires it](../gitaly/configure_gitaly.md#gitlab-requires-a-default-repository-storage).
+
<!--
Updates to example must be made at:
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
@@ -916,7 +920,7 @@ on what features you intend to use:
|Object storage type|Supported by consolidated configuration?|
|-------------------|----------------------------------------|
-| [Backups](../../raketasks/backup_restore.md#uploading-backups-to-a-remote-cloud-storage) | No |
+| [Backups](../../raketasks/backup_gitlab.md#uploading-backups-to-a-remote-cloud-storage) | No |
| [Job artifacts](../job_artifacts.md#using-object-storage) including archived job logs | Yes |
| [LFS objects](../lfs/index.md#storing-lfs-objects-in-remote-object-storage) | Yes |
| [Uploads](../uploads.md#using-object-storage) | Yes |
@@ -1027,7 +1031,7 @@ services where applicable):
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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. 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 -->
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index a43d33a4d4a..6a70739ca31 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -47,7 +47,7 @@ For a full list of reference architectures, see
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
@@ -159,6 +159,7 @@ As a general guidance, GitLab should run on most infrastructure such as reputabl
Be aware of the following specific call outs:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/#:~:text=Azure%20Database%20for%20PostgreSQL%20is,high%20availability%2C%20and%20dynamic%20scalability.) is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to known performance issues or missing features.
- [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/) is recommended to be configured with [Premium accounts](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-block-blob-premium) to ensure consistent performance.
@@ -787,7 +788,7 @@ cluster to be used with GitLab.
If you're hosting GitLab on a cloud provider, you can optionally use a
managed service for PostgreSQL.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
If you use a cloud-managed service, or provide your own PostgreSQL:
@@ -1217,7 +1218,7 @@ you are using Geo, where separate database instances are required for handling r
In this setup, the specs of the main database setup shouldn't need to be changed as the impact should be
minimal.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
@@ -1295,6 +1296,9 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+ NOTE:
+ You can't remove the `default` entry from `virtual_storages` because [GitLab requires it](../gitaly/configure_gitaly.md#gitlab-requires-a-default-repository-storage).
+
<!--
Updates to example must be made at:
- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
@@ -2141,7 +2145,7 @@ on what features you intend to use:
|Object storage type|Supported by consolidated configuration?|
|-------------------|----------------------------------------|
-| [Backups](../../raketasks/backup_restore.md#uploading-backups-to-a-remote-cloud-storage) | No |
+| [Backups](../../raketasks/backup_gitlab.md#uploading-backups-to-a-remote-cloud-storage) | No |
| [Job artifacts](../job_artifacts.md#using-object-storage) including archived job logs | Yes |
| [LFS objects](../lfs/index.md#storing-lfs-objects-in-remote-object-storage) | Yes |
| [Uploads](../uploads.md#using-object-storage) | Yes |
@@ -2285,7 +2289,7 @@ services where applicable):
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index 316969dfacc..0d0e44e2364 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -38,7 +38,7 @@ full list of reference architectures, see
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
@@ -153,6 +153,7 @@ As a general guidance, GitLab should run on most infrastructure such as reputabl
Be aware of the following specific call outs:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/#:~:text=Azure%20Database%20for%20PostgreSQL%20is,high%20availability%2C%20and%20dynamic%20scalability.) is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to known performance issues or missing features.
- [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/) is recommended to be configured with [Premium accounts](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-block-blob-premium) to ensure consistent performance.
@@ -511,7 +512,7 @@ cluster to be used with GitLab.
If you're hosting GitLab on a cloud provider, you can optionally use a
managed service for PostgreSQL.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
If you use a cloud-managed service, or provide your own PostgreSQL:
@@ -1284,7 +1285,7 @@ you are using Geo, where separate database instances are required for handling r
In this setup, the specs of the main database setup shouldn't need to be changed as the impact should be
minimal.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
@@ -1364,6 +1365,9 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+ NOTE:
+ You can't remove the `default` entry from `virtual_storages` because [GitLab requires it](../gitaly/configure_gitaly.md#gitlab-requires-a-default-repository-storage).
+
<!--
Updates to example must be made at:
- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
@@ -2222,7 +2226,7 @@ on what features you intend to use:
|Object storage type|Supported by consolidated configuration?|
|-------------------|----------------------------------------|
-| [Backups](../../raketasks/backup_restore.md#uploading-backups-to-a-remote-cloud-storage) | No |
+| [Backups](../../raketasks/backup_gitlab.md#uploading-backups-to-a-remote-cloud-storage) | No |
| [Job artifacts](../job_artifacts.md#using-object-storage) including archived job logs | Yes |
| [LFS objects](../lfs/index.md#storing-lfs-objects-in-remote-object-storage) | Yes |
| [Uploads](../uploads.md#using-object-storage) | Yes |
@@ -2342,7 +2346,7 @@ services where applicable):
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index ef44d688f31..ef2e48baa33 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -44,7 +44,7 @@ costly-to-operate environment by using the
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
@@ -156,13 +156,14 @@ As a general guidance, GitLab should run on most infrastructure such as reputabl
Be aware of the following specific call outs:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/#:~:text=Azure%20Database%20for%20PostgreSQL%20is,high%20availability%2C%20and%20dynamic%20scalability.) is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to known performance issues or missing features.
- [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/) is recommended to be configured with [Premium accounts](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-block-blob-premium) to ensure consistent performance.
### Praefect PostgreSQL
It's worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
-that to achieve full High Availability a third-party PostgreSQL database solution will be required.
+that to achieve full High Availability a third-party PostgreSQL database solution is required.
We hope to offer a built in solutions for these restrictions in the future but in the meantime a non HA PostgreSQL server
can be set up via Omnibus GitLab, which the above specs reflect. Refer to the following issues for more information: [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919) & [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398).
@@ -232,7 +233,7 @@ The following list includes descriptions of each server and its assigned IP:
## Configure the external load balancer
-In a multi-node GitLab configuration, you'll need a load balancer to route
+In a multi-node GitLab configuration, you need a load balancer to route
traffic to the application servers. The specifics on which load balancer to use
or its exact configuration is beyond the scope of GitLab documentation. We assume
that if you're managing multi-node systems like GitLab, you already have a load
@@ -245,7 +246,7 @@ This architecture has been tested and validated with [HAProxy](https://www.hapro
as the load balancer. Although other load balancers with similar feature sets
could also be used, those load balancers have not been validated.
-The next question is how you will handle SSL in your environment.
+The next question is how you handle SSL in your environment.
There are several different options:
- [The application node terminates SSL](#application-node-terminates-ssl).
@@ -257,8 +258,8 @@ There are several different options:
### Application node terminates SSL
Configure your load balancer to pass connections on port 443 as `TCP` rather
-than `HTTP(S)` protocol. This will pass the connection to the application node's
-NGINX service untouched. NGINX will have the SSL certificate and listen on port 443.
+than `HTTP(S)` protocol. This passes the connection to the application node's
+NGINX service untouched. NGINX has the SSL certificate and listen on port 443.
See the [NGINX HTTPS documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https)
for details on managing SSL certificates and configuring NGINX.
@@ -266,10 +267,10 @@ for details on managing SSL certificates and configuring NGINX.
### Load balancer terminates SSL without backend SSL
Configure your load balancer to use the `HTTP(S)` protocol rather than `TCP`.
-The load balancer will then be responsible for managing SSL certificates and
+The load balancer is then responsible for managing SSL certificates and
terminating SSL.
-Since communication between the load balancer and GitLab will not be secure,
+Since communication between the load balancer and GitLab is not secure,
there is some additional configuration needed. See the
[NGINX proxied SSL documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#supporting-proxied-ssl)
for details.
@@ -277,12 +278,12 @@ for details.
### Load balancer terminates SSL with backend SSL
Configure your load balancers to use the 'HTTP(S)' protocol rather than 'TCP'.
-The load balancers will be responsible for managing SSL certificates that
-end users will see.
+The load balancers are responsible for managing SSL certificates that
+end users see.
-Traffic will also be secure between the load balancers and NGINX in this
+Traffic is also secure between the load balancers and NGINX in this
scenario. There is no need to add configuration for proxied SSL since the
-connection will be secure all the way. However, configuration will need to be
+connection is secure all the way. However, configuration needs to be
added to GitLab to configure SSL certificates. See
[NGINX HTTPS documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https)
for details on managing SSL certificates and configuring NGINX.
@@ -292,7 +293,7 @@ for details on managing SSL certificates and configuring NGINX.
Ensure the external load balancer only routes to working services with built
in monitoring endpoints. The [readiness checks](../../user/admin_area/monitoring/health_check.md)
all require [additional configuration](../monitoring/ip_whitelist.md)
-on the nodes being checked, otherwise, the external load balancer will not be able to
+on the nodes being checked, otherwise, the external load balancer is not able to
connect.
### Ports
@@ -311,11 +312,11 @@ The basic ports to be used are shown in the table below.
to pass through the `Connection` and `Upgrade` hop-by-hop headers. See the
[web terminal](../integration/terminal.md) integration guide for
more details.
-- (*2*): When using HTTPS protocol for port 443, you will need to add an SSL
+- (*2*): When using HTTPS protocol for port 443, you need to add an SSL
certificate to the load balancers. If you wish to terminate SSL at the
GitLab application server instead, use TCP protocol.
-If you're using GitLab Pages with custom domain support you will need some
+If you're using GitLab Pages with custom domain support you need some
additional port configurations.
GitLab Pages requires a separate virtual IP address. Configure DNS to point the
`pages_external_url` from `/etc/gitlab/gitlab.rb` at the new virtual IP address. See the
@@ -337,7 +338,7 @@ GitLab Pages requires a separate virtual IP address. Configure DNS to point the
Some organizations have policies against opening SSH port 22. In this case,
it may be helpful to configure an alternate SSH hostname that allows users
-to use SSH on port 443. An alternate SSH hostname will require a new virtual IP address
+to use SSH on port 443. An alternate SSH hostname requires a new virtual IP address
compared to the other GitLab HTTP configuration above.
Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
@@ -359,7 +360,7 @@ such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configu
It's a separate node from the External Load Balancer and shouldn't have any access externally.
-The following IP will be used as an example:
+The following IP is used as an example:
- `10.6.0.40`: Internal Load Balancer
@@ -433,8 +434,8 @@ You are highly encouraged to read the [Redis Sentinel](https://redis.io/topics/s
before configuring Redis with GitLab to fully understand the topology and
architecture.
-In this section, you'll be guided through configuring an external Redis instance
-to be used with GitLab. The following IPs will be used as an example:
+In this section, you are guided through configuring an external Redis instance
+to be used with GitLab. The following IPs are used as an example:
- `10.6.0.61`: Redis Primary
- `10.6.0.62`: Redis Replica 1
@@ -442,7 +443,7 @@ to be used with GitLab. The following IPs will be used as an example:
### Provide your own Redis instance
-Managed Redis from cloud providers such as AWS ElastiCache will work. If these
+Managed Redis from cloud providers such as AWS ElastiCache works. If these
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
@@ -451,7 +452,7 @@ do not support an optional count argument to SPOP which is now 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 when configuring the
+These are necessary when configuring the
[GitLab application servers](#configure-gitlab-rails) later.
### Standalone Redis using Omnibus GitLab
@@ -617,8 +618,8 @@ You can specify multiple roles, like sentinel and Redis, as:
[roles](https://docs.gitlab.com/omnibus/roles/).
These values don't have to be changed again in `/etc/gitlab/gitlab.rb` after
-a failover, as the nodes will be managed by the [Sentinels](#configure-consul-and-sentinel), and even after a
-`gitlab-ctl reconfigure`, they will get their configuration restored by
+a failover, as the nodes are managed by the [Sentinels](#configure-consul-and-sentinel), and even after a
+`gitlab-ctl reconfigure`, they get their configuration restored by
the same Sentinels.
Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
@@ -633,7 +634,7 @@ are supported and can be added if needed.
## Configure Consul and Sentinel
Now that the Redis servers are all set up, let's configure the Sentinel
-servers. The following IPs will be used as an example:
+servers. The following IPs are used as an example:
- `10.6.0.11`: Consul/Sentinel 1
- `10.6.0.12`: Consul/Sentinel 2
@@ -647,7 +648,7 @@ clients to report `NOAUTH Authentication required.`.
To configure the Sentinel:
-1. SSH in to the server that will host Consul/Sentinel.
+1. SSH in to the server that hosts Consul/Sentinel.
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version
@@ -776,7 +777,7 @@ run: sentinel: (pid 30098) 76832s; run: log: (pid 29704) 76850s
## Configure PostgreSQL
-In this section, you'll be guided through configuring a highly available PostgreSQL
+In this section, you are guided through configuring a highly available PostgreSQL
cluster to be used with GitLab.
### Provide your own PostgreSQL instance
@@ -784,7 +785,7 @@ cluster to be used with GitLab.
If you're hosting GitLab on a cloud provider, you can optionally use a
managed service for PostgreSQL.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
If you use a cloud-managed service, or provide your own PostgreSQL:
@@ -813,7 +814,7 @@ replication and failover requires:
A local PgBouncer service to be configured on each PostgreSQL node. Note that this is separate from the main PgBouncer cluster that tracks the primary.
-The following IPs will be used as an example:
+The following IPs are used as an example:
- `10.6.0.31`: PostgreSQL primary
- `10.6.0.32`: PostgreSQL secondary 1
@@ -828,8 +829,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
#### PostgreSQL nodes
1. SSH in to one of the PostgreSQL nodes.
-1. Generate a password hash for the PostgreSQL username/password pair. This assumes you will use the default
- username of `gitlab` (recommended). The command will request a password
+1. Generate a password hash for the PostgreSQL username/password pair. This assumes you use the default
+ username of `gitlab` (recommended). The command requests a password
and confirmation. Use the value that is output by this command in the next
step as the value of `<postgresql_password_hash>`:
@@ -837,8 +838,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
sudo gitlab-ctl pg-password-md5 gitlab
```
-1. Generate a password hash for the PgBouncer username/password pair. This assumes you will use the default
- username of `pgbouncer` (recommended). The command will request a password
+1. Generate a password hash for the PgBouncer username/password pair. This assumes you use the default
+ username of `pgbouncer` (recommended). The command requests a password
and confirmation. Use the value that is output by this command in the next
step as the value of `<pgbouncer_password_hash>`:
@@ -846,8 +847,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
sudo gitlab-ctl pg-password-md5 pgbouncer
```
-1. Generate a password hash for the PostgreSQL replication username/password pair. This assumes you will use the default
- username of `gitlab_replicator` (recommended). The command will request a password
+1. Generate a password hash for the PostgreSQL replication username/password pair. This assumes you use the default
+ username of `gitlab_replicator` (recommended). The command requests 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>`:
@@ -855,8 +856,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
sudo gitlab-ctl pg-password-md5 gitlab_replicator
```
-1. Generate a password hash for the Consul database username/password pair. This assumes you will use the default
- username of `gitlab-consul` (recommended). The command will request a password
+1. Generate a password hash for the Consul database username/password pair. This assumes you use the default
+ username of `gitlab-consul` (recommended). The command requests a password
and confirmation. Use the value that is output by this command in the next
step as the value of `<consul_password_hash>`:
@@ -935,7 +936,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# END user configuration
```
-PostgreSQL, with Patroni managing its failover, will default to use `pg_rewind` by default to handle conflicts.
+PostgreSQL, with Patroni managing its failover, defaults to use `pg_rewind` by default to handle conflicts.
Like most failover handling methods, this has a small chance of leading to data loss.
Learn more about the various [Patroni replication methods](../postgresql/replication_and_failover.md#selecting-the-appropriate-patroni-replication-method).
@@ -987,7 +988,7 @@ If the 'State' column for any node doesn't say "running", check the
Now that the PostgreSQL servers are all set up, let's configure PgBouncer
for tracking and handling reads/writes to the primary database.
-The following IPs will be used as an example:
+The following IPs are used as an example:
- `10.6.0.21`: PgBouncer 1
- `10.6.0.22`: PgBouncer 2
@@ -1111,9 +1112,9 @@ The recommended cluster setup includes the following components:
- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
is required for Praefect database connections to be made highly available.
- 1 load balancer: A load balancer is required for Praefect. The
- [internal load balancer](#configure-the-internal-load-balancer) will be used.
+ [internal load balancer](#configure-the-internal-load-balancer) is used.
-This section will detail how to configure the recommended standard setup in order.
+This section details how to configure the recommended standard setup in order.
For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
### Configure Praefect PostgreSQL
@@ -1125,7 +1126,7 @@ A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-g
#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
-The following IPs will be used as an example:
+The following IPs are used as an example:
- `10.6.0.141`: Praefect PostgreSQL
@@ -1137,8 +1138,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
1. SSH in to the Praefect PostgreSQL node.
1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
-1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
- username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you use the default
+ username of `praefect` (recommended). The command requests the password `<praefect_postgresql_password>`
and confirmation. Use the value that is output by this command in the next
step as the value of `<praefect_postgresql_password_hash>`:
@@ -1215,13 +1216,13 @@ you are using Geo, where separate database instances are required for handling r
In this setup, the specs of the main database setup shouldn't need to be changed as the impact should be
minimal.
-A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
+A reputable provider or solution should be used for this. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61).
Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
#### Praefect PostgreSQL post-configuration
-After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+After the Praefect PostgreSQL server has been set up, you then need to configure the user and database for Praefect to use.
We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
@@ -1274,12 +1275,12 @@ Praefect requires several secret tokens to secure communications across the Clus
Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
the details of each Gitaly node that makes up the cluster. Each storage is also given a name
-and this name is used in several areas of the configuration. In this guide, the name of the storage will be
+and this name is used in several areas of the configuration. In this guide, the name of the storage is
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more information.
-The following IPs will be used as an example:
+The following IPs are used as an example:
- `10.6.0.131`: Praefect 1
- `10.6.0.132`: Praefect 2
@@ -1293,6 +1294,9 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+ NOTE:
+ You can't remove the `default` entry from `virtual_storages` because [GitLab requires it](../gitaly/configure_gitaly.md#gitlab-requires-a-default-repository-storage).
+
<!--
Updates to example must be made at:
- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
@@ -1429,7 +1433,7 @@ For configuring Gitaly you should note the following:
- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
- `auth_token` should be the same as `praefect_internal_token`
-The following IPs will be used as an example:
+The following IPs are used as an example:
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
@@ -1811,7 +1815,7 @@ On each node perform the following:
```
1. Specify the necessary NFS mounts in `/etc/fstab`.
- The exact contents of `/etc/fstab` will depend on how you chose
+ The exact contents of `/etc/fstab` depends on how you chose
to configure your NFS server. See the [NFS documentation](../nfs.md)
for examples and the various options.
@@ -1827,9 +1831,9 @@ On each node perform the following:
on the page.
1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration.
To maintain uniformity of links across nodes, the `external_url`
- on the application server should point to the external URL that users will use
+ on the application server should point to the external URL that users use
to access GitLab. This would be the URL of the [external load balancer](#configure-the-external-load-balancer)
- which will route traffic to the GitLab application server:
+ which routes traffic to the GitLab application server:
```ruby
external_url 'https://gitlab.example.com'
@@ -1999,7 +2003,7 @@ On each node perform the following:
When you specify `https` in the `external_url`, as in the previous example,
GitLab expects that the SSL certificates are in `/etc/gitlab/ssl/`. If the
-certificates aren't present, NGINX will fail to start. For more information, see
+certificates aren't present, NGINX fails to start. For more information, see
the [NGINX documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https).
### GitLab Rails post-configuration
@@ -2141,7 +2145,7 @@ on what features you intend to use:
|Object storage type|Supported by consolidated configuration?|
|-------------------|----------------------------------------|
-| [Backups](../../raketasks/backup_restore.md#uploading-backups-to-a-remote-cloud-storage) | No |
+| [Backups](../../raketasks/backup_gitlab.md#uploading-backups-to-a-remote-cloud-storage) | No |
| [Job artifacts](../job_artifacts.md#using-object-storage) including archived job logs | Yes |
| [LFS objects](../lfs/index.md#storing-lfs-objects-in-remote-object-storage) | Yes |
| [Uploads](../uploads.md#using-object-storage) | Yes |
@@ -2260,7 +2264,7 @@ services where applicable):
<!-- 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](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work, however Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). 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.
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) and [Amazon RDS](https://aws.amazon.com/rds/) are known to work. However, Amazon Aurora is **incompatible** with load balancing enabled by default in [14.4.0](../../update/index.md#1440), and Azure Database for PostgreSQL is **not recommended** due to [performance issues](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61). Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However, Consul 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.
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index d9fa6c7bdd9..e996acb1157 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -296,7 +296,7 @@ The following table details the cost to run the different reference architecture
NOTE:
The following lists are non exhaustive. Generally, other cloud providers not listed
-here will likely work with the same specs, but this hasn't been validated.
+here likely work with the same specs, but this hasn't been validated.
Additionally, when it comes to other cloud provider services not listed here,
it's advised to be cautious as each implementation can be notably different
and should be tested thoroughly before production use.
@@ -366,9 +366,9 @@ Additionally, the following cloud provider services are validated and supported
The following specific cloud provider services have been found to have issues in terms of either functionality or performance. As such, they either have caveats that should be considered or are not recommended:
+- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible. See [14.4.0](../../update/index.md#1440) for more details.
- [Azure Blob Storage](https://azure.microsoft.com/en-gb/services/storage/blobs/) has been found to have performance limits that can impact production use at certain times. For larger Reference Architectures the service may not be sufficient for production use and an alternative is recommended for use instead.
- [Azure Database for PostgreSQL Server](https://azure.microsoft.com/en-gb/services/postgresql/#overview) (Single / Flexible) is not recommended for use due to notable performance issues or missing functionality.
-- [AWS Aurora Database](https://aws.amazon.com/rds/aurora/) is not recommended due to compatibility issues.
NOTE:
As a general rule we unfortunately don't recommend Azure Services at this time.
@@ -389,7 +389,7 @@ most complex:
As you implement these components, begin with a single server and then do
backups. Only after completing the first server should you proceed to the next.
-Also, not implementing extra servers for GitLab doesn't necessarily mean that you'll have
+Also, not implementing extra servers for GitLab doesn't necessarily mean that you have
more downtime. Depending on your needs and experience level, single servers can
have more actual perceived uptime for your users.
@@ -401,7 +401,7 @@ have more actual perceived uptime for your users.
This solution is appropriate for many teams that have the default GitLab installation.
With automatic backups of the GitLab repositories, configuration, and the database,
this can be an optimal solution if you don't have strict requirements.
-[Automated backups](../../raketasks/backup_restore.md#configuring-cron-to-make-daily-backups)
+[Automated backups](../../raketasks/backup_gitlab.md#configuring-cron-to-make-daily-backups)
is the least complex to setup. This provides a point-in-time recovery of a predetermined schedule.
### Traffic load balancer **(PREMIUM SELF)**
@@ -410,7 +410,7 @@ is the least complex to setup. This provides a point-in-time recovery of a prede
> - Required domain knowledge: HAProxy, shared storage, distributed systems
This requires separating out GitLab into multiple application nodes with an added
-[load balancer](../load_balancer.md). The load balancer will distribute traffic
+[load balancer](../load_balancer.md). The load balancer distributes traffic
across GitLab application nodes. Meanwhile, each application node connects to a
shared file server and database systems on the back end. This way, if one of the
application servers fails, the workflow is not interrupted.
@@ -434,7 +434,7 @@ to any of the [available reference architectures](#available-reference-architect
GitLab supports [zero-downtime upgrades](../../update/zero_downtime.md).
Single GitLab nodes can be updated with only a [few minutes of downtime](../../update/index.md#upgrade-based-on-installation-method).
To avoid this, we recommend to separate GitLab into several application nodes.
-As long as at least one of each component is online and capable of handling the instance's usage load, your team's productivity will not be interrupted during the update.
+As long as at least one of each component is online and capable of handling the instance's usage load, your team's productivity is not interrupted during the update.
### Automated database failover **(PREMIUM SELF)**
@@ -459,8 +459,8 @@ that can also be promoted in case of disaster.
## Deviating from the suggested reference architectures
As a general guideline, the further away you move from the Reference Architectures,
-the harder it will be get support for it. With any deviation, you're introducing
-a layer of complexity that will add challenges to finding out where potential
+the harder it is to get support for it. With any deviation, you're introducing
+a layer of complexity that adds challenges to finding out where potential
issues might lie.
The reference architectures use the official GitLab Linux packages (Omnibus
@@ -474,7 +474,7 @@ However, it is still an additional layer and may still add some support complexi
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.
+case, GitLab Support is not able to help you.
## Supported modifications for lower user count HA reference architectures
diff --git a/doc/administration/reference_architectures/troubleshooting.md b/doc/administration/reference_architectures/troubleshooting.md
index 2d10d05da37..6e0aaacd598 100644
--- a/doc/administration/reference_architectures/troubleshooting.md
+++ b/doc/administration/reference_architectures/troubleshooting.md
@@ -13,7 +13,7 @@ the [reference architectures](index.md#reference-architectures).
### S3 API compatibility issues
-Not all S3 providers [are fully compatible](../../raketasks/backup_restore.md#other-s3-providers)
+Not all S3 providers [are fully compatible](../../raketasks/backup_gitlab.md#other-s3-providers)
with the Fog library that GitLab uses. Symptoms include:
```plaintext
@@ -54,20 +54,20 @@ This can result in some of the following problems:
- If GitLab is using non-secure HTTP to access the object storage, clients may generate
`https->http` downgrade errors and refuse to process the redirect. The solution to this
-is for GitLab to use HTTPS. LFS, for example, will generate this error:
+is for GitLab to use HTTPS. LFS, for example, generates this error:
```plaintext
LFS: lfsapi/client: refusing insecure redirect, https->http
```
-- Clients will need to trust the certificate authority that issued the object storage
+- Clients must trust the certificate authority that issued the object storage
certificate, or may return common TLS errors such as:
```plaintext
x509: certificate signed by unknown authority
```
-- Clients will need network access to the object storage. Errors that might result
+- Clients need network access to the object storage. Errors that might result
if this access is not in place include:
```plaintext
@@ -113,7 +113,7 @@ You can check if everything is correct by connecting to each server using
/opt/gitlab/embedded/bin/redis-cli -h <redis-host-or-ip> -a '<redis-password>' info replication
```
-When connected to a `Primary` Redis, you will see the number of connected
+When connected to a `Primary` Redis, you see the number of connected
`replicas`, and a list of each with connection details:
```plaintext
@@ -128,7 +128,7 @@ repl_backlog_first_byte_offset:206989083
repl_backlog_histlen:1048576
```
-When it's a `replica`, you will see details of the primary connection and if
+When it's a `replica`, you see details of the primary connection and if
its `up` or `down`:
```plaintext
@@ -254,7 +254,7 @@ To start a session:
sudo gitlab-ctl pgb-console
```
-The password you will be prompted for is the `pgbouncer_user_password`
+The password you are prompted for is the `pgbouncer_user_password`
To get some basic information about the instance, run
@@ -315,7 +315,7 @@ sudo gitlab-ctl tail patroni
### Consul and PostgreSQL with Patroni changes not taking effect
-Due to the potential impacts, `gitlab-ctl reconfigure` only reloads Consul and PostgreSQL, it will not restart the services. However, not all changes can be activated by reloading.
+Due to the potential impacts, `gitlab-ctl reconfigure` only reloads Consul and PostgreSQL, it does not restart the services. However, not all changes can be activated by reloading.
To restart either service, run `gitlab-ctl restart consul` or `gitlab-ctl restart patroni` respectively.
@@ -335,7 +335,7 @@ PG::ConnectionBad: ERROR: pgbouncer cannot connect to server
The problem may be that your PgBouncer node's IP address is not included in the
`trust_auth_cidr_addresses` setting in `/etc/gitlab/gitlab.rb` on the database nodes.
-You can confirm that this is the issue by checking the PostgreSQL log on the master
+You can confirm that this is the issue by checking the PostgreSQL log on the primary
database node. If you see the following error then `trust_auth_cidr_addresses`
is the problem.
diff --git a/doc/administration/reply_by_email_postfix_setup.md b/doc/administration/reply_by_email_postfix_setup.md
index 2652ad20329..0fbb4562995 100644
--- a/doc/administration/reply_by_email_postfix_setup.md
+++ b/doc/administration/reply_by_email_postfix_setup.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Set up Postfix for incoming email **(FREE SELF)**
-This document will take you through the steps of setting up a basic Postfix mail
+This document takes you through the steps of setting up a basic Postfix mail
server with IMAP authentication on Ubuntu, to be used with [incoming email](incoming_email.md).
The instructions make the assumption that you are using the email address `incoming@gitlab.example.com`, that is, username `incoming` on host `gitlab.example.com`. Don't forget to change it to your actual host when executing the example code snippets.
@@ -46,7 +46,7 @@ The instructions make the assumption that you are using the email address `incom
sudo passwd incoming
```
- Be sure not to forget this, you'll need it later.
+ Be sure not to forget this, you will need it later.
## Test the out-of-the-box setup
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index c2233f70a9a..8cfefdb9b56 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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
+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
---
# Repository checks **(FREE SELF)**
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index 3acaad8231e..f001ba35bca 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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, howto
---
# Repository storage **(FREE SELF)**
@@ -169,7 +168,6 @@ NOTE:
If all storage weights are `0` (for example, when `default` does not exist), GitLab attempts to
create new repositories on `default`, regardless of the configuration or if `default` exists.
See [the tracking issue](https://gitlab.com/gitlab-org/gitlab/-/issues/36175) for more information.
-information.
## Move repositories
diff --git a/doc/administration/repository_storage_types.md b/doc/administration/repository_storage_types.md
index 1a593c8c6bd..7ce629b5d71 100644
--- a/doc/administration/repository_storage_types.md
+++ b/doc/administration/repository_storage_types.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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, howto
---
# Repository storage types **(FREE SELF)**
diff --git a/doc/administration/restart_gitlab.md b/doc/administration/restart_gitlab.md
index 06b6cbd4271..6ac031ea6bd 100644
--- a/doc/administration/restart_gitlab.md
+++ b/doc/administration/restart_gitlab.md
@@ -31,7 +31,7 @@ GitLab Rails application (Puma) as well as the other components, like:
### Omnibus GitLab restart
There may be times in the documentation where you are asked to _restart_
-GitLab. In that case, you need to run the following command:
+GitLab. To restart, run the following command:
```shell
sudo gitlab-ctl restart
diff --git a/doc/administration/server_hooks.md b/doc/administration/server_hooks.md
index a83a17d6d52..1a47dc4ccf2 100644
--- a/doc/administration/server_hooks.md
+++ b/doc/administration/server_hooks.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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, howto
disqus_identifier: 'https://docs.gitlab.com/ee/administration/custom_hooks.html'
---
@@ -27,9 +26,9 @@ alternatives to server hooks include:
[Geo](geo/index.md) doesn't replicate server hooks to secondary nodes.
-## Create a server hook for a single repository
+## Create server hooks for a repository
-To create a server hook for a single repository:
+To create server hooks for a repository:
1. On the top bar, select **Menu > Admin**.
1. Go to **Overview > Projects** and select the project you want to add a server hook to.
@@ -41,16 +40,21 @@ To create a server hook for a single repository:
- For Omnibus GitLab installations, the path is usually `/var/opt/gitlab/git-data/repositories/<group>/<project>.git`.
- For an installation from source, the path is usually `/home/git/repositories/<group>/<project>.git`.
1. On the file system, create a new directory in the correct location called `custom_hooks`.
-1. In the new `custom_hooks` directory, create a file with a name that matches the hook type. For example, for a
- `pre-receive` server hook, the filename should be `pre-receive` with no extension.
-1. Make the server hook file executable and ensure that it's owned by the Git user.
+1. In the new `custom_hooks` directory:
+ - To create a single server hook, create a file with a name that matches the hook type. For example, for a
+ `pre-receive` server hook, the filename should be `pre-receive` with no extension.
+ - To create many server hooks, create a directory for the hooks that matches the hook type. For example, for a
+ `pre-receive` server hook, the directory name should be `pre-receive.d`. Put the files for the hook in that directory.
+1. Make the server hook files executable and ensure that they are owned by the Git user.
1. Write the code to make the server hook function as expected. Server hooks can be in any programming language. Ensure
the [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) at the top reflects the language type. For
example, if the script is in Ruby the shebang is probably `#!/usr/bin/env ruby`.
+1. Make the hook file executable, ensure that it's owned by the Git user, and ensure it does not match the backup file
+ pattern (`*~`).
If the server hook code is properly implemented, it should execute when the Git hook is next triggered.
-## Create a global server hook for all repositories
+## Create global server hooks for all repositories
To create a Git hook that applies to all repositories, set a global server hook. The default global server hook directory
is in the GitLab Shell directory. Any server hook added there applies to all repositories, including:
@@ -80,8 +84,11 @@ To use a different directory for global server hooks, set `custom_hooks_dir` in
To create a global server hook for all repositories:
1. On the GitLab server, go to the configured global server hook directory.
-1. Create a new directory in this location called `pre-receive.d`, `post-receive.d`, or `update.d`, depending on the type
- of server hook. Any other names are ignored.
+1. In the configured global server hook directory:
+ - To create a single server hook, create a file with a name that matches the hook type. For example, for a
+ `pre-receive` server hook, the filename should be `pre-receive` with no extension.
+ - To create many server hooks, create a directory for the hooks that matches the hook type. For example, for a
+ `pre-receive` server hook, the directory name should be `pre-receive.d`. Put the files for the hook in that directory.
1. Inside this new directory, add your server hook. Server hooks can be in any programming language. Ensure the
[shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) at the top reflects the language type. For example, if the
script is in Ruby the shebang is probably `#!/usr/bin/env ruby`.
diff --git a/doc/administration/sidekiq.md b/doc/administration/sidekiq.md
index 528ecf12df9..fc24c764330 100644
--- a/doc/administration/sidekiq.md
+++ b/doc/administration/sidekiq.md
@@ -6,19 +6,92 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Configure an external Sidekiq instance **(FREE SELF)**
-You can configure an external Sidekiq instance by using the Sidekiq that's
-bundled in the GitLab package. Sidekiq requires connection to the Redis,
+You can configure an external Sidekiq instance by using the Sidekiq that's bundled in the GitLab package. Sidekiq requires connection to the Redis,
PostgreSQL, and Gitaly instances.
-## Required configuration
+## Configure TCP access for PostgreSQL, Gitaly, and Redis
-To configure Sidekiq:
+By default, GitLab uses UNIX sockets and is not set up to communicate via TCP. To change this:
+
+1. Edit the `/etc/gitlab/gitlab.rb` file on your GitLab instance, and add the following:
+
+ ```ruby
+
+ ## PostgreSQL
+
+ # Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = 'POSTGRESQL_PASSWORD_HASH'
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['port'] = 5432
+
+ # Add the Sidekiq nodes to PostgreSQL's trusted addresses.
+ # In the following example, 10.10.1.30/32 is the private IP
+ # of the Sidekiq server.
+ postgresql['md5_auth_cidr_addresses'] = %w(127.0.0.1/32 10.10.1.30/32)
+ postgresql['trust_auth_cidr_addresses'] = %w(127.0.0.1/32 10.10.1.30/32)
+
+ ## Gitaly
+
+ # Make Gitaly accept connections on all network interfaces
+ gitaly['listen_addr'] = "0.0.0.0:8075"
+ ## Set up the Gitaly token as a form of authentication since you are accessing Gitaly over the network
+ ## https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#about-the-gitaly-token
+ gitaly['auth_token'] = 'abc123secret'
+ praefect['auth_token'] = 'abc123secret'
+ gitlab_rails['gitaly_token'] = 'abc123secret'
+
+ ## Redis configuration
+
+ redis['bind'] = '0.0.0.0'
+ redis['port'] = 6379
+ # Password to Authenticate Redis
+ redis['password'] = 'redis-password-goes-here'
+ gitlab_rails['redis_password'] = 'redis-password-goes-here'
+
+ gitlab_rails['auto_migrate'] = false
+ ```
+
+1. Run `reconfigure`:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Restart the `PostgreSQL` server:
+
+ ```shell
+ sudo gitlab-ctl restart postgresql
+ ```
+
+1. After the restart, set `auto_migrate` to `true` or comment to use the default settings:
+
+ ```ruby
+ gitlab_rails['auto_migrate'] = true
+ ```
+
+1. Run `reconfigure` again:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+## Set up Sidekiq instance
1. SSH into the Sidekiq server.
+
+1. Confirm that you can access the PostgreSQL, Gitaly, and Redis ports:
+
+ ```shell
+ telnet <GitLab host> 5432 # PostgreSQL
+ telnet <GitLab host> 8075 # Gitaly
+ telnet <GitLab host> 6379 # Redis
+ ```
+
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab package
using steps 1 and 2. **Do not complete any other steps.**
-1. Edit `/etc/gitlab/gitlab.rb` with the following information and make sure
- to replace with your values:
+
+1. Copy the `/etc/gitlab/gitlab.rb` file from the GitLab instance and add the following settings. Make sure
+ to replace them with your values:
<!--
Updates to example must be made at:
@@ -59,16 +132,25 @@ Updates to example must be made at:
##
external_url 'https://gitlab.example.com'
+ # Configure the gitlab-shell API callback URL. Without this, `git push` will
+ # fail. This can be your 'front door' GitLab URL or an internal load
+ # balancer.
+ gitlab_rails['internal_api_url'] = 'GITLAB_URL'
+ gitlab_shell['secret_token'] = 'SHELL_TOKEN'
+
########################################
#### Redis ###
########################################
- ## Must be the same in every sentinel node
- redis['master_name'] = 'gitlab-redis'
-
+ ## Must be the same in every sentinel node.
+ redis['master_name'] = 'gitlab-redis' # Required if you have setup redis cluster
## The same password for Redis authentication you set up for the master node.
redis['master_password'] = '<redis_master_password>'
+ ### If redis is running on the main Gitlab instance and you have opened the TCP port as above add the following
+ gitlab_rails['redis_host'] = '<gitlab_host>'
+ gitlab_rails['redis_port'] = 6379
+
#######################################
### Gitaly ###
#######################################
@@ -77,8 +159,8 @@ Updates to example must be made at:
## https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#about-the-gitaly-token
git_data_dirs({
"default" => {
- "gitaly_address" => "tcp://gitaly:8075",
- "gitaly_token" => "<gitaly_token>"
+ "gitaly_address" => "tcp://<gitlab_host>:8075",
+ "gitaly_token" => "<gitaly_token>"
}
})
@@ -90,12 +172,6 @@ Updates to example must be made at:
gitlab_rails['db_host'] = '<database_host>'
gitlab_rails['db_port'] = '5432'
gitlab_rails['db_password'] = '<database_password>'
-
- # Add the Sidekiq nodes to PostgreSQL's trusted addresses.
- # In the following example, 10.10.1.30/32 is the private IP
- # of the Sidekiq server.
- postgresql['trust_auth_cidr_addresses'] = %w(127.0.0.1/32 10.10.1.30/32)
-
## Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -112,13 +188,15 @@ Updates to example must be made at:
sidekiq['max_concurrency'] = 10
```
+1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the GitLab instance and replace the file in the Sidekiq instance.
+
1. Reconfigure GitLab:
```shell
sudo gitlab-ctl reconfigure
```
-1. Restart the Sidekiq nodes after completing the process and finishing the database migrations.
+1. Restart the Sidekiq instance after completing the process and finishing the database migrations.
## Configure multiple Sidekiq nodes with shared storage
@@ -191,6 +269,26 @@ To configure the metrics server:
sudo gitlab-ctl reconfigure
```
+### Enable HTTPS
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/364771) in GitLab 15.2.
+
+To serve metrics via HTTPS instead of HTTP, enable TLS in the exporter settings:
+
+1. Edit `/etc/gitlab/gitlab.rb` to add (or find and uncomment) the following lines:
+
+ ```ruby
+ sidekiq['exporter_tls_enabled'] = true
+ sidekiq['exporter_tls_cert_path'] = "/path/to/certificate.pem"
+ sidekiq['exporter_tls_key_path'] = "/path/to/private-key.pem"
+ ```
+
+1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect.
+
+When TLS is enabled, the same `port` and `address` are used as described above.
+The metrics server cannot serve both HTTP and HTTPS at the same time.
+
## Configure health checks
If you use health check probes to observe Sidekiq, enable the Sidekiq health check server.
@@ -198,7 +296,7 @@ To make health checks available from `localhost:8092`:
1. Edit `/etc/gitlab/gitlab.rb`:
- ```ruby
+ ```ruby
sidekiq['health_checks_enabled'] = true
sidekiq['health_checks_listen_address'] = "localhost"
sidekiq['health_checks_listen_port'] = "8092"
diff --git a/doc/administration/smime_signing_email.md b/doc/administration/smime_signing_email.md
index 943fd91c885..c9647129104 100644
--- a/doc/administration/smime_signing_email.md
+++ b/doc/administration/smime_signing_email.md
@@ -24,7 +24,7 @@ files must be provided:
- Only RSA keys are supported.
Optionally, you can also provide a bundle of CA certs (PEM-encoded) to be
-included on each signature. This will typically be an intermediate CA.
+included on each signature. This is typically an intermediate CA.
WARNING:
Be mindful of the access levels for your private keys and visibility to
@@ -44,7 +44,7 @@ third parties.
1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-The key needs to be readable by the GitLab system user (`git` by default).
+The key must be readable by the GitLab system user (`git` by default).
**For installations from source:**
@@ -67,7 +67,7 @@ The key needs to be readable by the GitLab system user (`git` by default).
1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
-The key needs to be readable by the GitLab system user (`git` by default).
+The key must be readable by the GitLab system user (`git` by default).
### How to convert S/MIME PKCS #12 format to PEM encoding
diff --git a/doc/administration/troubleshooting/debug.md b/doc/administration/troubleshooting/debug.md
index 81ca1bda5d0..d5019f1aa4a 100644
--- a/doc/administration/troubleshooting/debug.md
+++ b/doc/administration/troubleshooting/debug.md
@@ -1,289 +1,11 @@
---
-stage: Systems
-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
+redirect_to: '../reference_architectures/troubleshooting.md'
+remove_date: '2022-10-19'
---
-# Debugging tips **(FREE SELF)**
+This document was moved to [another location](../reference_architectures/troubleshooting.md).
-Sometimes things don't work the way they should. Here are some tips on debugging issues out
-in production.
-
-## Starting a Rails console session
-
-Troubleshooting and debugging your GitLab instance often requires a Rails console.
-
-Your type of GitLab installation determines how
-[to start a rails console](../operations/rails_console.md).
-See also:
-
-- [GitLab Rails Console Cheat Sheet](gitlab_rails_cheat_sheet.md).
-- [Navigating GitLab via Rails console](navigating_gitlab_via_rails_console.md).
-
-### Enabling Active Record logging
-
-You can enable output of Active Record debug logging in the Rails console
-session by running:
-
-```ruby
-ActiveRecord::Base.logger = Logger.new($stdout)
-```
-
-This will show information about database queries triggered by any Ruby code
-you may run in the console. To turn off logging again, run:
-
-```ruby
-ActiveRecord::Base.logger = nil
-```
-
-### Disabling database statement timeout
-
-You can disable the PostgreSQL statement timeout for the current Rails console
-session by running:
-
-```ruby
-ActiveRecord::Base.connection.execute('SET statement_timeout TO 0')
-```
-
-This change only affects the current Rails console session and will
-not be persisted in the GitLab production environment or in the next Rails
-console session.
-
-### Output Rails console session history
-
-If you'd like to output your Rails console command history in a format that's
-easy to copy and save for future reference, you can run:
-
-```ruby
-puts Readline::HISTORY.to_a
-```
-
-## Using the Rails runner
-
-If you need to run some Ruby code in the context of your GitLab production
-environment, you can do so using the [Rails runner](https://guides.rubyonrails.org/command_line.html#rails-runner). When executing a script file, the script must be accessible by the `git` user.
-
-**For Omnibus installations**
-
-```shell
-sudo gitlab-rails runner "RAILS_COMMAND"
-
-# Example with a two-line Ruby script
-sudo gitlab-rails runner "user = User.first; puts user.username"
-
-# Example with a ruby script file (make sure to use the full path)
-sudo gitlab-rails runner /path/to/script.rb
-```
-
-**For installations from source**
-
-```shell
-sudo -u git -H bundle exec rails runner -e production "RAILS_COMMAND"
-
-# Example with a two-line Ruby script
-sudo -u git -H bundle exec rails runner -e production "user = User.first; puts user.username"
-
-# Example with a ruby script file (make sure to use the full path)
-sudo -u git -H bundle exec rails runner -e production /path/to/script.rb
-```
-
-## Mail not working
-
-A common problem is that mails are not being sent for some reason. Suppose you configured
-an SMTP server, but you're not seeing mail delivered. Here's how to check the settings:
-
-1. Run a [Rails console](../operations/rails_console.md#starting-a-rails-console-session).
-
-1. Look at the ActionMailer `delivery_method` to make sure it matches what you
- intended. If you configured SMTP, it should say `:smtp`. If you're using
- Sendmail, it should say `:sendmail`:
-
- ```ruby
- irb(main):001:0> ActionMailer::Base.delivery_method
- => :smtp
- ```
-
-1. If you're using SMTP, check the mail settings:
-
- ```ruby
- irb(main):002:0> ActionMailer::Base.smtp_settings
- => {:address=>"localhost", :port=>25, :domain=>"localhost.localdomain", :user_name=>nil, :password=>nil, :authentication=>nil, :enable_starttls_auto=>true}
- ```
-
- 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 (for example, `/var/log/mail.log`) for more details.
-
-1. Send a test message via the console.
-
- ```ruby
- 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 email and/or see an error message, then check
- your mail server settings.
-
-## Advanced Issues
-
-For more advanced issues, `gdb` is a must-have tool for debugging issues.
-
-### The GNU Project Debugger (GDB)
-
-To install on Ubuntu/Debian:
-
-```shell
-sudo apt-get install gdb
-```
-
-On CentOS:
-
-```shell
-sudo yum install gdb
-```
-
-<!-- vale gitlab.Spelling = NO -->
-
-### rbtrace
-
-<!-- vale gitlab.Spelling = YES -->
-
-GitLab 11.2 ships with [`rbtrace`](https://github.com/tmm1/rbtrace), which
-allows you to trace Ruby code, view all running threads, take memory dumps,
-and more. However, this is not enabled by default. To enable it, define the
-`ENABLE_RBTRACE` variable to the environment. For example, in Omnibus:
-
-```ruby
-gitlab_rails['env'] = {"ENABLE_RBTRACE" => "1"}
-```
-
-Then reconfigure the system and restart Puma and Sidekiq. To run this
-in Omnibus, run as root:
-
-```ruby
-/opt/gitlab/embedded/bin/ruby /opt/gitlab/embedded/bin/rbtrace
-```
-
-## Common Problems
-
-Many of the tips to diagnose issues below apply to many different situations. We'll use one
-concrete example to illustrate what you can do to learn what is going wrong.
-
-### 502 Gateway Timeout after Unicorn spins at 100% CPU
-
-This error occurs when the Web server times out (default: 60 s) after not
-hearing back from the Unicorn worker. If the CPU spins to 100% while this in
-progress, there may be something taking longer than it should.
-
-To fix this issue, we first need to figure out what is happening. The
-following tips are only recommended if you do not mind users being affected by
-downtime. Otherwise skip to the next section.
-
-1. Load the problematic URL
-1. Run `sudo gdb -p <PID>` to attach to the Puma process.
-1. In the GDB window, type:
-
- ```plaintext
- call (void) rb_backtrace()
- ```
-
-1. This forces the process to generate a Ruby backtrace. Check
- `/var/log/gitlab/puma/puma_stderr.log` for the backtrace. For example, you may see:
-
- ```plaintext
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:33:in `block in start'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:33:in `loop'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:36:in `block (2 levels) in start'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:44:in `sample'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:68:in `sample_objects'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:68:in `each_with_object'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:68:in `each'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:69:in `block in sample_objects'
- from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/sampler.rb:69:in `name'
- ```
-
-1. To see the current threads, run:
-
- ```plaintext
- thread apply all bt
- ```
-
-1. Once you're done debugging with `gdb`, be sure to detach from the process and exit:
-
- ```plaintext
- detach
- exit
- ```
-
-If the Puma process terminates before you are able to run these
-commands, GDB will report an error. To buy more time, you can always raise the
-Puma worker timeout. For omnibus users, you can edit `/etc/gitlab/gitlab.rb` and
-increase it from 60 seconds to 600:
-
-```ruby
-gitlab_rails['env'] = {
- 'GITLAB_RAILS_RACK_TIMEOUT' => 600
-}
-```
-
-For source installations, set the environment variable.
-Refer to [Puma Worker timeout](../operations/puma.md#change-the-worker-timeout).
-
-[Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab for the changes to take effect.
-
-#### Troubleshooting without affecting other users
-
-The previous section attached to a running Unicorn process, and this may have
-undesirable effects for users trying to access GitLab during this time. If you
-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 (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:
-
- ```ruby
- app.get '<URL FROM STEP 2>/?private_token=<TOKEN FROM STEP 3>'
- ```
-
- For example:
-
- ```ruby
- app.get 'https://gitlab.com/gitlab-org/gitlab-foss/-/issues/1?private_token=123456'
- ```
-
-1. In a new window, run `top`. It should show this Ruby process using 100% CPU. Write down the PID.
-1. Follow step 2 from the previous section on using GDB.
-
-### GitLab: API is not accessible
-
-This often occurs when GitLab Shell attempts to request authorization via the
-[internal API](../../development/internal_api/index.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 (for example, PostgreSQL or Redis)
-1. Error in Git hooks or push rules
-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`
-techniques above. In addition, using `strace` may help isolate issues:
-
-```shell
-strace -ttTfyyy -s 1024 -p <PID of puma worker> -o /tmp/puma.txt
-```
-
-If you cannot isolate which Unicorn worker is the issue, try to run `strace`
-on all the Unicorn workers to see where the
-[`/internal/allowed`](../../development/internal_api/index.md) endpoint gets stuck:
-
-```shell
-ps auwx | grep puma | awk '{ print " -p " $2}' | xargs strace -ttTfyyy -s 1024 -o /tmp/puma.txt
-```
-
-The output in `/tmp/puma.txt` may help diagnose the root cause.
-
-## More information
-
-- [Debugging Stuck Ruby Processes](https://newrelic.com/blog/best-practices/debugging-stuck-ruby-processes-what-to-do-before-you-kill-9)
-- [Cheat sheet of using GDB and Ruby processes](gdb-stuck-ruby.txt)
+<!-- This redirect file can be deleted after 2022-10-19. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/administration/troubleshooting/defcon.md b/doc/administration/troubleshooting/defcon.md
index 292b4b13967..f2554f523f0 100644
--- a/doc/administration/troubleshooting/defcon.md
+++ b/doc/administration/troubleshooting/defcon.md
@@ -1,35 +1,11 @@
---
-stage: Systems
-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: reference
+redirect_to: '../../ci/troubleshooting.md#disaster-recovery'
+remove_date: '2022-10-04'
---
-# Disaster recovery **(FREE SELF)**
+This document was moved to [another location](../../ci/troubleshooting.md#disaster-recovery).
-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_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
-by significantly reducing the computations being performed.
-
-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/CD 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`).
+<!-- This redirect file can be deleted after <2022-10-04>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/administration/troubleshooting/diagnostics_tools.md b/doc/administration/troubleshooting/diagnostics_tools.md
index 6055746238f..faddf12b97d 100644
--- a/doc/administration/troubleshooting/diagnostics_tools.md
+++ b/doc/administration/troubleshooting/diagnostics_tools.md
@@ -8,7 +8,7 @@ type: reference
# Diagnostics tools **(FREE SELF)**
These are some of the diagnostics tools the GitLab Support team uses during troubleshooting.
-They are listed here for transparency, and they may be useful for users with experience
+They are listed here for transparency, and for users with experience
with troubleshooting GitLab. If you are currently having an issue with GitLab, you
may want to check your [support options](https://about.gitlab.com/support/) first,
before attempting to use these tools.
@@ -24,6 +24,6 @@ running on.
[strace-parser](https://gitlab.com/wchandler/strace-parser) is a small tool to analyze
and summarize raw `strace` data.
-## kubesos
+## `kubesos`
The [`kubesos`](https://gitlab.com/gitlab-com/support/toolbox/kubesos/) utility retrieves GitLab cluster configuration and logs from GitLab Cloud Native chart deployments.
diff --git a/doc/administration/troubleshooting/gdb-stuck-ruby.txt b/doc/administration/troubleshooting/gdb-stuck-ruby.txt
deleted file mode 100644
index de8d704f9e3..00000000000
--- a/doc/administration/troubleshooting/gdb-stuck-ruby.txt
+++ /dev/null
@@ -1,142 +0,0 @@
-# Here's the script I'll use to demonstrate - it just loops forever:
-
-$ cat test.rb
-#!/usr/bin/env ruby
-
-loop do
- sleep 1
-end
-
-# Now, I'll start the script in the background, and redirect stdout and stderr
-# to /dev/null:
-
-$ ruby ./test.rb >/dev/null 2>/dev/null &
-[1] 1343
-
-# Next, I'll grab the PID of the script (1343):
-
-$ ps aux | grep test.rb
-vagrant 1343 0.0 0.4 3884 1652 pts/0 S 14:42 0:00 ruby ./test.rb
-vagrant 1345 0.0 0.2 4624 852 pts/0 S+ 14:42 0:00 grep --color=auto test.rb
-
-# Now I start gdb. Note that I'm using sudo here. This may or may not be
-# necessary in your setup. I'd try without sudo first, and fall back to adding
-# it if the next step fails:
-
-$ sudo gdb
-GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
-Copyright (C) 2012 Free Software Foundation, Inc.
-License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law. Type "show copying"
-and "show warranty" for details.
-This GDB was configured as "i686-linux-gnu".
-For bug reporting instructions, please see:
-<http://bugs.launchpad.net/gdb-linaro/>.
-
-# OK, now I'm in gdb, and I want to instruct it to attach to our Ruby process.
-# I can do that using the 'attach' command, which takes a PID (the one we
-# gathered above):
-
-(gdb) attach 1343
-Attaching to process 1343
-Reading symbols from /opt/vagrant_ruby/bin/ruby...done.
-Reading symbols from /lib/i386-linux-gnu/librt.so.1...(no debugging symbols found)...done.
-Loaded symbols for /lib/i386-linux-gnu/librt.so.1
-Reading symbols from /lib/i386-linux-gnu/libdl.so.2...(no debugging symbols found)...done.
-Loaded symbols for /lib/i386-linux-gnu/libdl.so.2
-Reading symbols from /lib/i386-linux-gnu/libcrypt.so.1...(no debugging symbols found)...done.
-Loaded symbols for /lib/i386-linux-gnu/libcrypt.so.1
-Reading symbols from /lib/i386-linux-gnu/libm.so.6...(no debugging symbols found)...done.
-Loaded symbols for /lib/i386-linux-gnu/libm.so.6
-Reading symbols from /lib/i386-linux-gnu/libc.so.6...(no debugging symbols found)...done.
-Loaded symbols for /lib/i386-linux-gnu/libc.so.6
-Reading symbols from /lib/i386-linux-gnu/libpthread.so.0...(no debugging symbols found)...done.
-[Thread debugging using libthread_db enabled]
-Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".
-Loaded symbols for /lib/i386-linux-gnu/libpthread.so.0
-Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
-Loaded symbols for /lib/ld-linux.so.2
-0xb770c424 in __kernel_vsyscall ()
-
-# Great, now gdb is attached to the target process. If the step above fails, try
-# going back and running gdb under sudo. The next thing I want to do is gather
-# C-level backtraces from all threads in the process. The following command
-# stands for 'thread apply all backtrace':
-
-(gdb) t a a bt
-
-Thread 1 (Thread 0xb74d76c0 (LWP 1343)):
-#0 0xb770c424 in __kernel_vsyscall ()
-#1 0xb75d7abd in select () from /lib/i386-linux-gnu/libc.so.6
-#2 0x08069c56 in rb_thread_wait_for (time=...) at eval.c:11376
-#3 0x080a20fd in rb_f_sleep (argc=1, argv=0xbf85f490) at process.c:1633
-#4 0x0805e0e2 in call_cfunc (argv=0xbf85f490, argc=1, len=-1, recv=3075299660, func=0x80a20b0 <rb_f_sleep>)
- at eval.c:5778
-#5 rb_call0 (klass=3075304600, recv=3075299660, id=9393, oid=9393, argc=1, argv=0xbf85f490, body=0xb74c85a8, flags=2)
- at eval.c:5928
-#6 0x0805e35d in rb_call (klass=3075304600, recv=3075299660, mid=9393, argc=1, argv=0xbf85f490, scope=1,
- self=<optimized out>) at eval.c:6176
-#7 0x080651ec in rb_eval (self=3075299660, n=0xb74c4e1c) at eval.c:3521
-#8 0x0805c31c in rb_yield_0 (val=6, self=3075299660, klass=<optimized out>, flags=0, avalue=0) at eval.c:5095
-#9 0x0806a1e5 in loop_i () at eval.c:5227
-#10 0x08058dbd in rb_rescue2 (b_proc=0x806a1c0 <loop_i>, data1=0, r_proc=0, data2=0) at eval.c:5491
-#11 0x08058f28 in rb_f_loop () at eval.c:5252
-#12 0x0805e0c1 in call_cfunc (argv=0x0, argc=0, len=0, recv=3075299660, func=0x8058ef0 <rb_f_loop>) at eval.c:5781
-#13 rb_call0 (klass=3075304600, recv=3075299660, id=4121, oid=4121, argc=0, argv=0x0, body=0xb74d4dbc, flags=2)
- at eval.c:5928
-#14 0x0805e35d in rb_call (klass=3075304600, recv=3075299660, mid=4121, argc=0, argv=0x0, scope=1, self=<optimized out>)
- at eval.c:6176
-#15 0x080651ec in rb_eval (self=3075299660, n=0xb74c4dcc) at eval.c:3521
-#16 0x080662c6 in rb_eval (self=3075299660, n=0xb74c4de0) at eval.c:3236
-#17 0x08068ee4 in ruby_exec_internal () at eval.c:1654
-#18 0x08068f24 in ruby_exec () at eval.c:1674
-#19 0x0806b2cd in ruby_run () at eval.c:1684
-#20 0x08053771 in main (argc=2, argv=0xbf860204, envp=0xbf860210) at main.c:48
-
-# C backtraces are sometimes sufficient, but often Ruby backtraces are necessary
-# for debugging as well. Ruby has a built-in function called rb_backtrace() that
-# we can use to dump out a Ruby backtrace, but it prints to stdout or stderr
-# (depending on your Ruby version), which might have been redirected to a file
-# or to /dev/null (as in our example) when the process started up.
-#
-# To get aroundt this, we'll do a little trick and redirect the target process's
-# stdout and stderr to the current TTY, so that any output from the process
-# will appear directly on our screen.
-
-# First, let's close the existing file descriptors for stdout and stderr
-# (FD 1 and 2, respectively):
-(gdb) call (void) close(1)
-(gdb) call (void) close(2)
-
-# Next, we need to figure out the device name for the current TTY:
-(gdb) shell tty
-/dev/pts/0
-
-# OK, now we can pass the device name obtained above to open() and attach
-# file descriptors 1 and 2 back to the current TTY with these calls:
-
-(gdb) call (int) open("/dev/pts/0", 2, 0)
-$1 = 1
-(gdb) call (int) open("/dev/pts/0", 2, 0)
-$2 = 2
-
-# Finally, we call rb_backtrace() in order to dump the Ruby backtrace:
-
-(gdb) call (void) rb_backtrace()
- from ./test.rb:4:in `sleep'
- from ./test.rb:4
- from ./test.rb:3:in `loop'
- from ./test.rb:3
-
-# And here's how we get out of gdb. Once you've quit, you'll probably want to
-# clean up the stuck process by killing it.
-
-(gdb) quit
-A debugging session is active.
-
- Inferior 1 [process 1343] will be detached.
-
-Quit anyway? (y or n) y
-Detaching from program: /opt/vagrant_ruby/bin/ruby, process 1343
-$
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index b57bc0a1119..0ff1afa86ed 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -8,9 +8,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This is the GitLab Support Team's collection of information regarding the GitLab Rails
console, for use while troubleshooting. It is listed here for transparency,
-and it may be useful for users with experience with these tools. If you are currently
+and for users with experience with these tools. If you are currently
having an issue with GitLab, it is highly recommended that you first check
-our guide on [navigating our Rails console](navigating_gitlab_via_rails_console.md),
+our guide on [our Rails console](../operations/rails_console.md),
and your [support options](https://about.gitlab.com/support/), before attempting to use
this information.
@@ -80,7 +80,7 @@ Notify.test_email(u.email, "Test email for #{u.name}", 'Test email').deliver_now
## Limiting output
-Adding a semicolon(`;`) and a follow-up statement at the end of a statement prevents the default implicit return output. This is useful if you are already explicitly printing details and potentially have a lot of return output:
+Adding a semicolon(`;`) and a follow-up statement at the end of a statement prevents the default implicit return output. This can be used if you are already explicitly printing details and potentially have a lot of return output:
```ruby
puts ActiveRecord::Base.descendants; :ok
@@ -100,9 +100,9 @@ project.id
# => 2537
```
-## Open object in irb
+## Open object in `irb`
-Sometimes it is easier to navigate through a method if you are within the context of the object. You can shim into the namespace of `Object` to let you open `irb` within the context of any object:
+Sometimes it is easier to go through a method if you are in the context of the object. You can shim into the namespace of `Object` to let you open `irb` in the context of any object:
```ruby
Object.define_method(:irb) { binding.irb }
@@ -311,7 +311,7 @@ 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:
+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 email domain only:
``` ruby
Project.find_each do |p|
@@ -443,7 +443,7 @@ p.create_wiki ### creates the wiki project on the filesystem
## Issue boards
-### In case of issue boards not loading properly and it's getting time out. We need to call the Issue Rebalancing service to fix this
+### In case of issue boards not loading properly and it's getting time out. Call the Issue Rebalancing service to fix this
```ruby
p = Project.find_by_full_path('<username-or-group>/<project-name>')
@@ -515,9 +515,9 @@ If this all runs successfully, you see an output like the following before being
=> nil
```
-The exported project is located within a `.tar.gz` file in `/var/opt/gitlab/gitlab-rails/uploads/-/system/import_export_upload/export_file/`.
+The exported project is located in a `.tar.gz` file in `/var/opt/gitlab/gitlab-rails/uploads/-/system/import_export_upload/export_file/`.
-If this fails, [enable verbose logging](navigating_gitlab_via_rails_console.md#looking-up-database-persisted-objects),
+If this fails, [enable verbose logging](../operations/rails_console.md#looking-up-database-persisted-objects),
repeat the above procedure after,
and report the output to
[GitLab Support](https://about.gitlab.com/support/).
@@ -611,6 +611,13 @@ user.skip_reconfirmation!
### Disable 2fa for single user
+**In GitLab 13.5 and later:**
+
+Use the code under [Disable 2FA | For a single user](../../security/two_factor_authentication.md#for-a-single-user) so that the target user
+is notified that 2FA has been disabled.
+
+**In GitLab 13.4 and earlier:**
+
```ruby
user = User.find_by_username('<username>')
user.disable_two_factor!
@@ -629,7 +636,7 @@ User.billable.count
::HistoricalData.max_historical_user_count(from: 1.year.ago.beginning_of_day, to: Time.current.end_of_day)
```
-Using cURL and jq (up to a max 100, see the [pagination docs](../../api/index.md#pagination)):
+Using cURL and jq (up to a max 100, see [Pagination](../../api/index.md#pagination)):
```shell
curl --silent --header "Private-Token: ********************" \
@@ -1053,6 +1060,9 @@ License.current.expires_at
# Is this a trial license?
License.current.trial?
+
+# License ID for lookup on CustomersDot
+License.current.license_id
```
### Check if a project feature is available on the instance
@@ -1101,10 +1111,10 @@ License.select(&TYPE).each(&:destroy!)
### Registry Disk Space Usage by Project
-As a GitLab administrator, you may need to reduce disk space consumption.
+As a GitLab administrator, you may want to reduce disk space consumption.
A common culprit is Docker Registry images that are no longer in use. To find
the storage broken down by each project, run the following in the
-[GitLab Rails console](../troubleshooting/navigating_gitlab_via_rails_console.md):
+[GitLab Rails console](../operations/rails_console.md):
```ruby
projects_and_size = [["project_id", "creator_id", "registry_size_bytes", "project path"]]
@@ -1135,11 +1145,11 @@ end
### Run the Cleanup policy now
-Find this content in the [Container Registry troubleshooting docs](../packages/container_registry.md#run-the-cleanup-policy-now).
+Find this content in the [Container Registry troubleshooting documentation](../packages/container_registry.md#run-the-cleanup-policy-now).
## Sidekiq
-This content has been moved to the [Troubleshooting Sidekiq docs](sidekiq.md).
+This content has been moved to [Troubleshooting Sidekiq](sidekiq.md).
## Redis
@@ -1275,11 +1285,16 @@ project = Project.find_by_full_path('<group/project>')
Geo::RepositorySyncService.new(project).execute
```
-### Blob types newer than uploads/artifacts/LFS
+### Blob types
+- `Ci::JobArtifact`
+- `Ci::PipelineArtifact`
+- `LfsObject`
+- `MergeRequestDiff`
- `Packages::PackageFile`
+- `PagesDeployment`
- `Terraform::StateVersion`
-- `MergeRequestDiff`
+- `Upload`
`Packages::PackageFile` is used in the following examples, but things generally work the same for the other Blob types.
diff --git a/doc/administration/troubleshooting/group_saml_scim.md b/doc/administration/troubleshooting/group_saml_scim.md
index c6a102e87ee..145eb5f65ae 100644
--- a/doc/administration/troubleshooting/group_saml_scim.md
+++ b/doc/administration/troubleshooting/group_saml_scim.md
@@ -60,6 +60,10 @@ User claims and attributes:
IdP links and certificate:
+NOTE:
+Google Workspace displays a SHA256 fingerprint. To retrieve the SHA1 fingerprint required by GitLab for configuring SAML, download the certificate and calculate the SHA1 certificate
+fingerprint.
+
![Google Workspace Links and Certificate](img/GoogleWorkspace-linkscert_v14_10.png)
## Okta
@@ -109,3 +113,95 @@ Adding a user:
SSO settings:
![OneLogin SSO settings](img/OneLogin-SSOsettings.png)
+
+## SAML response example
+
+When a user signs in using SAML, GitLab receives a SAML response. The SAML response can be found in `production.log` logs as a base64-encoded message. Locate the response by
+searching for `SAMLResponse`. The decoded SAML response is in XML format. For example:
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema" Destination="https://gitlabexample/-/saml/callback" ID="id4898983630840142426821432" InResponseTo="_c65e4c88-9425-4472-b42c-37f4186ac0ee" IssueInstant="2022-05-30T21:30:35.696Z" Version="2.0">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">http://www.okta.com/exk2y6j57o1Pdr2lI8qh7</saml2:Issuer>
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:SignedInfo>
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
+ <ds:Reference URI="#id4898983630840142426821432">
+ <ds:Transforms>
+ <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
+ <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
+ <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/>
+ </ds:Transform>
+ </ds:Transforms>
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
+ <ds:DigestValue>neiQvv9d3OgS4GZW8Nptp4JhjpKs3GCefibn+vmRgk4=</ds:DigestValue>
+ </ds:Reference>
+ </ds:SignedInfo>
+ <ds:SignatureValue>dMsQX8ivi...HMuKGhyLRvabGU6CuPrf7==</ds:SignatureValue>
+ <ds:KeyInfo>
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDq...cptGr3vN9TQ==</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </ds:Signature>
+ <saml2p:Status xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="id489" IssueInstant="2022-05-30T21:30:35.696Z" Version="2.0">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">http://www.okta.com/exk2y6j57o1Pdr2lI8qh7</saml2:Issuer>
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:SignedInfo>
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
+ <ds:Reference URI="#id48989836309833801859473359">
+ <ds:Transforms>
+ <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
+ <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
+ <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/>
+ </ds:Transform>
+ </ds:Transforms>
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
+ <ds:DigestValue>MaIsoi8hbT9gsi/mNZsz449mUuAcuEWY0q3bc4asOQs=</ds:DigestValue>
+ </ds:Reference>
+ </ds:SignedInfo>
+ <ds:SignatureValue>dMsQX8ivi...HMuKGhyLRvabGU6CuPrf7==<</ds:SignatureValue>
+ <ds:KeyInfo>
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDq...cptGr3vN9TQ==</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </ds:Signature>
+ <saml2:Subject xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">useremail@domain.com</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_c65e4c88-9425-4472-b42c-37f4186ac0ee" NotOnOrAfter="2022-05-30T21:35:35.696Z" Recipient="https://gitlab.example.com/-/saml/callback"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" NotBefore="2022-05-30T21:25:35.696Z" NotOnOrAfter="2022-05-30T21:35:35.696Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://gitlab.example.com/</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" AuthnInstant="2022-05-30T21:30:35.696Z" SessionIndex="_c65e4c88-9425-4472-b42c-37f4186ac0ee">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
+ <saml2:Attribute Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
+ <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">useremail@domain.com</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute Name="firtname" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
+ <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">John</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute Name="lastname" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
+ <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Doe</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute Name="Groups" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
+ <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Super-awesome-group</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
+```
diff --git a/doc/administration/troubleshooting/index.md b/doc/administration/troubleshooting/index.md
index 7d40a9e9683..7fe731bda66 100644
--- a/doc/administration/troubleshooting/index.md
+++ b/doc/administration/troubleshooting/index.md
@@ -17,13 +17,14 @@ installation.
- [Sidekiq](sidekiq.md)
- [GitLab Rails console cheat sheet](gitlab_rails_cheat_sheet.md)
- [Group SAML and SCIM troubleshooting](group_saml_scim.md) **(PREMIUM SAAS)**
-- [Kubernetes cheat sheet](kubernetes_cheat_sheet.md)
+- [Kubernetes cheat sheet](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html)
- [Linux cheat sheet](linux_cheat_sheet.md)
- [Parsing GitLab logs with `jq`](log_parsing.md)
-- [Navigating GitLab via Rails console](navigating_gitlab_via_rails_console.md)
- [Diagnostics tools](diagnostics_tools.md)
-- [Debugging tips](debug.md)
- [Tracing requests with correlation ID](tracing_correlation_id.md)
+Some feature documentation pages also have a troubleshooting section at the end
+that you can check for feature-specific help.
+
If you need a testing environment to troubleshoot, see the
[apps for a testing environment](test_environments.md).
diff --git a/doc/administration/troubleshooting/kubernetes_cheat_sheet.md b/doc/administration/troubleshooting/kubernetes_cheat_sheet.md
index 0c93d1ab3ee..15ec8d5940b 100644
--- a/doc/administration/troubleshooting/kubernetes_cheat_sheet.md
+++ b/doc/administration/troubleshooting/kubernetes_cheat_sheet.md
@@ -1,295 +1,11 @@
---
-stage: Systems
-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: reference
+redirect_to: 'https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html'
+remove_date: '2022-10-05'
---
-# Kubernetes, GitLab, and you **(FREE SELF)**
+This document was moved to [another location](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html).
-This is a list of useful information regarding Kubernetes that the GitLab Support
-Team sometimes uses while troubleshooting. GitLab is making this public, so that anyone
-can make use of the Support team's collected knowledge
-
-WARNING:
-These commands **can alter or break** your Kubernetes components so use these at your own risk.
-
-If you are on a [paid tier](https://about.gitlab.com/pricing/) and are not sure how
-to use these commands, it is best to [contact Support](https://about.gitlab.com/support/)
-and they will assist you with any issues you are having.
-
-## Generic Kubernetes commands
-
-- How to authorize to your GCP project (can be especially useful if you have projects
- under different GCP accounts):
-
- ```shell
- gcloud auth login
- ```
-
-- How to access Kubernetes dashboard:
-
- ```shell
- # for minikube:
- minikube dashboard —url
- # for non-local installations if access via Kubectl is configured:
- kubectl proxy
- ```
-
-- How to SSH to a Kubernetes node and enter the container as root
- <https://github.com/kubernetes/kubernetes/issues/30656>:
-
- - For GCP, you may find the node name and run `gcloud compute ssh node-name`.
- - List containers using `docker ps`.
- - Enter container using `docker exec --user root -ti container-id bash`.
-
-- How to copy a file from local machine to a pod:
-
- ```shell
- kubectl cp file-name pod-name:./destination-path
- ```
-
-- What to do with pods in `CrashLoopBackoff` status:
-
- - Check logs via Kubernetes dashboard.
- - Check logs via Kubectl:
-
- ```shell
- kubectl logs <webservice pod> -c dependencies
- ```
-
-- How to tail all Kubernetes cluster events in real time:
-
- ```shell
- kubectl get events -w --all-namespaces
- ```
-
-- How to get logs of the previously terminated pod instance:
-
- ```shell
- kubectl logs <pod-name> --previous
- ```
-
- No logs are kept in the containers/pods themselves. Everything is written to `stdout`.
- This is the principle of Kubernetes, read [Twelve-factor app](https://12factor.net/)
- for details.
-
-- How to get cron jobs configured on a cluster
-
- ```shell
- kubectl get cronjobs
- ```
-
- When one configures [cron-based backups](https://docs.gitlab.com/charts/backup-restore/backup.html#cron-based-backup),
- you will be able to see the new schedule here. Some details about the schedules can be found
- in [Running Automated Tasks with a CronJob](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#creating-a-cron-job)
-
-## GitLab-specific Kubernetes information
-
-- Minimal configuration that can be used to [test a Kubernetes Helm chart](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/620).
-
-- Tailing logs of a separate pod. An example for a `webservice` pod:
-
- ```shell
- kubectl logs gitlab-webservice-54fbf6698b-hpckq -c webservice
- ```
-
-- Tail and follow all pods that share a label (in this case, `webservice`):
-
- ```shell
- # all containers in the webservice pods
- kubectl logs -f -l app=webservice --all-containers=true --max-log-requests=50
-
- # only the webservice containers in all webservice pods
- kubectl logs -f -l app=webservice -c webservice --max-log-requests=50
- ```
-
-- One can stream logs from all containers at once, similar to the Omnibus
- command `gitlab-ctl tail`:
-
- ```shell
- kubectl logs -f -l release=gitlab --all-containers=true --max-log-requests=100
- ```
-
-- Check all events in the `gitlab` namespace (the namespace name can be different if you
- specified a different one when deploying the Helm chart):
-
- ```shell
- kubectl get events -w --namespace=gitlab
- ```
-
-- Most of the useful GitLab tools (console, Rake tasks, etc) are found in the toolbox
- pod. You may enter it and run commands inside or run them from the outside.
-
- NOTE:
- The `task-runner` pod was renamed to `toolbox` in GitLab 14.2 (charts 5.2).
-
- ```shell
- # find the pod
- kubectl --namespace gitlab get pods -lapp=toolbox
-
- # enter it
- kubectl exec -it <toolbox-pod-name> -- bash
-
- # open rails console
- # rails console can be also called from other GitLab pods
- /srv/gitlab/bin/rails console
-
- # source-style commands should also work
- cd /srv/gitlab && bundle exec rake gitlab:check RAILS_ENV=production
-
- # run GitLab check. The output can be confusing and invalid because of the specific structure of GitLab installed via helm chart
- /usr/local/bin/gitlab-rake gitlab:check
-
- # open console without entering pod
- kubectl exec -it <toolbox-pod-name> -- /srv/gitlab/bin/rails console
-
- # check the status of DB migrations
- kubectl exec -it <toolbox-pod-name> -- /usr/local/bin/gitlab-rake db:migrate:status
- ```
-
- You can also use `gitlab-rake`, instead of `/usr/local/bin/gitlab-rake`.
-
-- Troubleshooting **Infrastructure > Kubernetes clusters** integration:
-
- - Check the output of `kubectl get events -w --all-namespaces`.
- - Check the logs of pods within `gitlab-managed-apps` namespace.
- - On the side of GitLab check Sidekiq log and Kubernetes log. When GitLab is installed
- via Helm Chart, `kubernetes.log` can be found inside the Sidekiq pod.
-
-- How to get your initial administrator password <https://docs.gitlab.com/charts/installation/deployment.html#initial-login>:
-
- ```shell
- # find the name of the secret containing the password
- kubectl get secrets | grep initial-root
- # decode it
- kubectl get secret <secret-name> -ojsonpath={.data.password} | base64 --decode ; echo
- ```
-
-- How to connect to a GitLab PostgreSQL database.
-
- NOTE:
- The `task-runner` pod was renamed to `toolbox` in GitLab 14.2 (charts 5.2).
-
- In GitLab 14.2 (chart 5.2) and later:
-
- ```shell
- kubectl exec -it <toolbox-pod-name> -- /srv/gitlab/bin/rails dbconsole --include-password --database main
- ```
-
- In GitLab 14.1 (chart 5.1) and earlier:
-
- ```shell
- kubectl exec -it <task-runner-pod-name> -- /srv/gitlab/bin/rails dbconsole --include-password
- ```
-
-- How to get information about Helm installation status:
-
- ```shell
- helm status name-of-installation
- ```
-
-- How to update GitLab installed using Helm Chart:
-
- ```shell
- helm repo upgrade
-
- # get current values and redirect them to yaml file (analogue of gitlab.rb values)
- helm get values <release name> > gitlab.yaml
-
- # run upgrade itself
- helm upgrade <release name> <chart path> -f gitlab.yaml
- ```
-
- After <https://gitlab.com/gitlab-org/charts/gitlab/-/issues/780> is fixed, it should
- be possible to use [Updating GitLab using the Helm Chart](https://docs.gitlab.com/charts/index.html#updating-gitlab-using-the-helm-chart)
- for upgrades.
-
-- How to apply changes to GitLab configuration:
-
- - Modify the `gitlab.yaml` file.
- - Run the following command to apply changes:
-
- ```shell
- helm upgrade <release name> <chart path> -f gitlab.yaml
- ```
-
-- How to get the manifest for a release. It can be useful because it contains the information about
-all Kubernetes resources and dependent charts:
-
- ```shell
- helm get manifest <release name>
- ```
-
-## Installation of minimal GitLab configuration via minikube on macOS
-
-This section is based on [Developing for Kubernetes with minikube](https://docs.gitlab.com/charts/development/minikube/index.html)
-and [Helm](https://docs.gitlab.com/charts/installation/tools.html#helm). Refer
-to those documents for details.
-
-- Install Kubectl via Homebrew:
-
- ```shell
- brew install kubernetes-cli
- ```
-
-- Install minikube via Homebrew:
-
- ```shell
- brew cask install minikube
- ```
-
-- Start minikube and configure it. If minikube cannot start, try running `minikube delete && minikube start`
- and repeat the steps:
-
- ```shell
- minikube start --cpus 3 --memory 8192 # minimum amount for GitLab to work
- minikube addons enable ingress
- ```
-
-- Install Helm via Homebrew and initialize it:
-
- ```shell
- brew install helm
- ```
-
-- Copy the [minikube minimum values YAML file](https://gitlab.com/gitlab-org/charts/gitlab/raw/master/examples/values-minikube-minimum.yaml)
- to your workstation:
-
- ```shell
- curl --output values.yaml "https://gitlab.com/gitlab-org/charts/gitlab/raw/master/examples/values-minikube-minimum.yaml"
- ```
-
-- Find the IP address in the output of `minikube ip` and update the YAML file with
- this IP address.
-
-- Install the GitLab Helm Chart:
-
- ```shell
- helm repo add gitlab https://charts.gitlab.io
- helm install gitlab -f <path-to-yaml-file> gitlab/gitlab
- ```
-
- If you want to modify some GitLab settings, you can use the above-mentioned configuration
- as a base and create your own YAML file.
-
-- Monitor the installation progress via `helm status gitlab` and `minikube dashboard`.
- The installation could take up to 20-30 minutes depending on the amount of resources
- on your workstation.
-
-- When all the pods show either a `Running` or `Completed` status, get the GitLab password as
- described in [Initial login](https://docs.gitlab.com/charts/installation/deployment.html#initial-login),
- and log in to GitLab via the UI. It will be accessible via `https://gitlab.domain`
- where `domain` is the value provided in the YAML file.
-
-<!-- ## 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 2022-10-05. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/administration/troubleshooting/linux_cheat_sheet.md b/doc/administration/troubleshooting/linux_cheat_sheet.md
index 0245af39e45..66d5fb82936 100644
--- a/doc/administration/troubleshooting/linux_cheat_sheet.md
+++ b/doc/administration/troubleshooting/linux_cheat_sheet.md
@@ -9,7 +9,7 @@ type: reference
This is the GitLab Support Team's collection of information regarding Linux, that they
sometimes use while troubleshooting. It is listed here for transparency,
-and it may be useful for users with experience with Linux. If you are currently
+and for users with experience with Linux. If you are currently
having an issue with GitLab, you may want to check your [support options](https://about.gitlab.com/support/)
first, before attempting to use this information.
@@ -107,6 +107,9 @@ grep -2 search_term <filename>
# Search on all files in directory (recursively)
grep -r search_term <directory>
+# Grep namespace/project/name of a GitLab repository
+grep 'fullpath' /var/opt/gitlab/git-data/repositories/@hashed/<repo hash>/.git/config
+
# search through *.gz files is the same except with zgrep
zgrep search_term <filename>
@@ -126,6 +129,7 @@ history
# Search through command history
<ctrl>-R
+
# Execute last command with sudo
sudo !!
```
diff --git a/doc/administration/troubleshooting/log_parsing.md b/doc/administration/troubleshooting/log_parsing.md
index 4cc62c08f4f..0320b2e52ce 100644
--- a/doc/administration/troubleshooting/log_parsing.md
+++ b/doc/administration/troubleshooting/log_parsing.md
@@ -47,7 +47,7 @@ grep <TERM> <FILE> | jq .
jq -cR 'fromjson?' file.json | jq <COMMAND>
```
-By default `jq` will error out when it encounters a line that is not valid JSON.
+By default `jq` errors out when it encounters a line that is not valid JSON.
This skips over all invalid lines and parses the rest.
#### Print a JSON log's time range
@@ -152,6 +152,51 @@ CT: 297 ROUTE: /api/:version/projects/:id/repository/tags DURS: 731.39,
CT: 190 ROUTE: /api/:version/projects/:id/repository/commits DURS: 1079.02, 979.68, 958.21
```
+### Print top API user agents
+
+```shell
+jq --raw-output '[.route, .ua] | @tsv' api_json.log | sort | uniq -c | sort -n
+```
+
+**Example output**:
+
+```plaintext
+ 89 /api/:version/usage_data/increment_unique_users # plus browser details
+ 567 /api/:version/jobs/:id/trace gitlab-runner # plus version details
+1234 /api/:version/internal/allowed GitLab-Shell
+```
+
+This sample response seems normal. A custom tool or script might be causing a high load
+if the output contains many:
+
+- Third party libraries like `python-requests` or `curl`.
+- [GitLab CLI clients](https://about.gitlab.com/partners/technology-partners/#cli-clients).
+
+You can also [use `fast-stats top`](#parsing-gitlab-logs-with-jq) to extract performance statistics.
+
+### Parsing `gitlab-workhorse/current`
+
+### Print top Workhorse user agents
+
+```shell
+jq --raw-output '[.uri, .user_agent] | @tsv' current | sort | uniq -c | sort -n
+```
+
+**Example output**:
+
+```plaintext
+ 89 /api/graphql # plus browser details
+ 567 /api/v4/internal/allowed GitLab-Shell
+1234 /api/v4/jobs/request gitlab-runner # plus version details
+```
+
+Similar to the [API `ua` data](#print-top-api-user-agents),
+deviations from this common order might indicate scripts that could be optimized.
+
+The performance impact of runners checking for new jobs can be reduced by increasing
+[the `check_interval` setting](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-global-section),
+for example.
+
### Parsing `gitlab-rails/geo.log`
#### Find most common Geo sync errors
@@ -166,7 +211,7 @@ jq --raw-output 'select(.severity == "ERROR") | [.project_path, .message] | @tsv
### Parsing `gitaly/current`
-The following examples are useful to [troubleshoot Gitaly](../gitaly/troubleshooting.md).
+Use the following examples to [troubleshoot Gitaly](../gitaly/troubleshooting.md).
#### Find all Gitaly requests sent from web UI
diff --git a/doc/administration/troubleshooting/navigating_gitlab_via_rails_console.md b/doc/administration/troubleshooting/navigating_gitlab_via_rails_console.md
index 51ef3d95a4e..09a5cb8d185 100644
--- a/doc/administration/troubleshooting/navigating_gitlab_via_rails_console.md
+++ b/doc/administration/troubleshooting/navigating_gitlab_via_rails_console.md
@@ -1,465 +1,11 @@
---
-stage: Systems
-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
+redirect_to: '../operations/rails_console.md'
+remove_date: '2022-10-05'
---
-# Navigating GitLab via Rails console **(FREE SELF)**
+This document was moved to [another location](../operations/rails_console.md).
-At the heart of GitLab is a web application [built using the Ruby on Rails
-framework](https://about.gitlab.com/blog/2018/10/29/why-we-use-rails-to-build-gitlab/).
-Thanks to this, we also get access to the amazing tools built right into Rails.
-This guide introduces the [Rails console](../operations/rails_console.md#starting-a-rails-console-session)
-and the basics of interacting with your GitLab instance from the command line.
-
-WARNING:
-The Rails console interacts directly with your GitLab instance. In many cases,
-there are no handrails to prevent you from permanently modifying, corrupting
-or destroying production data. If you would like to explore the Rails console
-with no consequences, you are strongly advised to do so in a test environment.
-
-This guide is targeted at GitLab system administrators who are troubleshooting
-a problem or must retrieve some data that can only be done through direct
-access of the GitLab application. Basic knowledge of Ruby is needed (try [this
-30-minute tutorial](https://try.ruby-lang.org/) for a quick introduction).
-Rails experience is helpful to have but not a must.
-
-## Starting a Rails console session
-
-Your type of GitLab installation determines how
-[to start a rails console](../operations/rails_console.md).
-
-The following code examples take place inside the Rails console and also
-assume an Omnibus GitLab installation.
-
-## Active Record objects
-
-### Looking up database-persisted objects
-
-Under the hood, Rails uses [Active Record](https://guides.rubyonrails.org/active_record_basics.html),
-an object-relational mapping system, to read, write, and map application objects
-to the PostgreSQL database. These mappings are handled by Active Record models,
-which are Ruby classes defined in a Rails app. For GitLab, the model classes
-can be found at `/opt/gitlab/embedded/service/gitlab-rails/app/models`.
-
-Let's enable debug logging for Active Record so we can see the underlying
-database queries made:
-
-```ruby
-ActiveRecord::Base.logger = Logger.new($stdout)
-```
-
-Now, let's try retrieving a user from the database:
-
-```ruby
-user = User.find(1)
-```
-
-Which would return:
-
-```ruby
-D, [2020-03-05T16:46:25.571238 #910] DEBUG -- : User Load (1.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
-=> #<User id:1 @root>
-```
-
-We can see that we've queried the `users` table in the database for a row whose
-`id` column has the value `1`, and Active Record has translated that database
-record into a Ruby object that we can interact with. Try some of the following:
-
-- `user.username`
-- `user.created_at`
-- `user.admin`
-
-By convention, column names are directly translated into Ruby object attributes,
-so you should be able to do `user.<column_name>` to view the attribute's value.
-
-Also by convention, Active Record class names (singular and in camel case) map
-directly onto table names (plural and in snake case) and vice versa. For example,
-the `users` table maps to the `User` class, while the `application_settings`
-table maps to the `ApplicationSetting` class.
-
-You can find a list of tables and column names in the Rails database schema,
-available at `/opt/gitlab/embedded/service/gitlab-rails/db/schema.rb`.
-
-You can also look up an object from the database by attribute name:
-
-```ruby
-user = User.find_by(username: 'root')
-```
-
-Which would return:
-
-```ruby
-D, [2020-03-05T17:03:24.696493 #910] DEBUG -- : User Load (2.1ms) SELECT "users".* FROM "users" WHERE "users"."username" = 'root' LIMIT 1
-=> #<User id:1 @root>
-```
-
-Give the following a try:
-
-- `User.find_by(email: 'admin@example.com')`
-- `User.where.not(admin: true)`
-- `User.where('created_at < ?', 7.days.ago)`
-
-Did you notice that the last two commands returned an `ActiveRecord::Relation`
-object that appeared to contain multiple `User` objects?
-
-Up to now, we've been using `.find` or `.find_by`, which are designed to return
-only a single object (notice the `LIMIT 1` in the generated SQL query?).
-`.where` is used when it is desirable to get a collection of objects.
-
-Let's get a collection of non-administrator users and see what we can do with it:
-
-```ruby
-users = User.where.not(admin: true)
-```
-
-Which would return:
-
-```ruby
-D, [2020-03-05T17:11:16.845387 #910] DEBUG -- : User Load (2.8ms) SELECT "users".* FROM "users" WHERE "users"."admin" != TRUE LIMIT 11
-=> #<ActiveRecord::Relation [#<User id:3 @support-bot>, #<User id:7 @alert-bot>, #<User id:5 @carrie>, #<User id:4 @bernice>, #<User id:2 @anne>]>
-```
-
-Now, try the following:
-
-- `users.count`
-- `users.order(created_at: :desc)`
-- `users.where(username: 'support-bot')`
-
-In the last command, we see that we can chain `.where` statements to generate
-more complex queries. Notice also that while the collection returned contains
-only a single object, we cannot directly interact with it:
-
-```ruby
-users.where(username: 'support-bot').username
-```
-
-Which would return:
-
-```ruby
-Traceback (most recent call last):
- 1: from (irb):37
-D, [2020-03-05T17:18:25.637607 #910] DEBUG -- : User Load (1.6ms) SELECT "users".* FROM "users" WHERE "users"."admin" != TRUE AND "users"."username" = 'support-bot' LIMIT 11
-NoMethodError (undefined method `username' for #<ActiveRecord::Relation [#<User id:3 @support-bot>]>)
-Did you mean? by_username
-```
-
-Let's retrieve the single object from the collection by using the `.first`
-method to get the first item in the collection:
-
-```ruby
-users.where(username: 'support-bot').first.username
-```
-
-We now get the result we wanted:
-
-```ruby
-D, [2020-03-05T17:18:30.406047 #910] DEBUG -- : User Load (2.6ms) SELECT "users".* FROM "users" WHERE "users"."admin" != TRUE AND "users"."username" = 'support-bot' ORDER BY "users"."id" ASC LIMIT 1
-=> "support-bot"
-```
-
-For more on different ways to retrieve data from the database using Active
-Record, please see the [Active Record Query Interface documentation](https://guides.rubyonrails.org/active_record_querying.html).
-
-### Modifying Active Record objects
-
-In the previous section, we learned about retrieving database records using
-Active Record. Now, let's learn how to write changes to the database.
-
-First, let's retrieve the `root` user:
-
-```ruby
-user = User.find_by(username: 'root')
-```
-
-Next, let's try updating the user's password:
-
-```ruby
-user.password = 'password'
-user.save
-```
-
-Which would return:
-
-```ruby
-Enqueued ActionMailer::MailDeliveryJob (Job ID: 05915c4e-c849-4e14-80bb-696d5ae22065) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", #<GlobalID:0x00007f42d8ccebe8 @uri=#<URI::GID gid://gitlab/User/1>>
-=> true
-```
-
-Here, we see that the `.save` command returned `true`, indicating that the
-password change was successfully saved to the database.
-
-We also see that the save operation triggered some other action -- in this case
-a background job to deliver an email notification. This is an example of an
-[Active Record callback](https://guides.rubyonrails.org/active_record_callbacks.html)
--- code which is designated to run in response to events in the Active Record
-object life cycle. This is also why using the Rails console is preferred when
-direct changes to data is necessary as changes made via direct database queries
-do not trigger these callbacks.
-
-It's also possible to update attributes in a single line:
-
-```ruby
-user.update(password: 'password')
-```
-
-Or update multiple attributes at once:
-
-```ruby
-user.update(password: 'password', email: 'hunter2@example.com')
-```
-
-Now, let's try something different:
-
-```ruby
-# Retrieve the object again so we get its latest state
-user = User.find_by(username: 'root')
-user.password = 'password'
-user.password_confirmation = 'hunter2'
-user.save
-```
-
-This returns `false`, indicating that the changes we made were not saved to the
-database. You can probably guess why, but let's find out for sure:
-
-```ruby
-user.save!
-```
-
-This should return:
-
-```ruby
-Traceback (most recent call last):
- 1: from (irb):64
-ActiveRecord::RecordInvalid (Validation failed: Password confirmation doesn't match Password)
-```
-
-Aha! We've tripped an [Active Record Validation](https://guides.rubyonrails.org/active_record_validations.html).
-Validations are business logic put in place at the application-level to prevent
-unwanted data from being saved to the database and in most cases come with
-helpful messages letting you know how to fix the problem inputs.
-
-We can also add the bang (Ruby speak for `!`) to `.update`:
-
-```ruby
-user.update!(password: 'password', password_confirmation: 'hunter2')
-```
-
-In Ruby, method names ending with `!` are commonly known as "bang methods". By
-convention, the bang indicates that the method directly modifies the object it
-is acting on, as opposed to returning the transformed result and leaving the
-underlying object untouched. For Active Record methods that write to the
-database, bang methods also serve an additional function: they raise an
-explicit exception whenever an error occurs, instead of just returning `false`.
-
-We can also skip validations entirely:
-
-```ruby
-# Retrieve the object again so we get its latest state
-user = User.find_by(username: 'root')
-user.password = 'password'
-user.password_confirmation = 'hunter2'
-user.save!(validate: false)
-```
-
-This is not recommended, as validations are usually put in place to ensure the
-integrity and consistency of user-provided data.
-
-A validation error prevents the entire object from being saved to
-the database. You can see a little of this in the section below. If you're getting
-a mysterious red banner in the GitLab UI when submitting a form, this can often
-be the fastest way to get to the root of the problem.
-
-### Interacting with Active Record objects
-
-At the end of the day, Active Record objects are just normal Ruby objects. As
-such, we can define methods on them which perform arbitrary actions.
-
-For example, GitLab developers have added some methods which help with
-two-factor authentication:
-
-```ruby
-def disable_two_factor!
- transaction do
- update(
- otp_required_for_login: false,
- encrypted_otp_secret: nil,
- encrypted_otp_secret_iv: nil,
- encrypted_otp_secret_salt: nil,
- otp_grace_period_started_at: nil,
- otp_backup_codes: nil
- )
- self.u2f_registrations.destroy_all # rubocop: disable DestroyAll
- end
-end
-
-def two_factor_enabled?
- two_factor_otp_enabled? || two_factor_u2f_enabled?
-end
-```
-
-(See: `/opt/gitlab/embedded/service/gitlab-rails/app/models/user.rb`)
-
-We can then use these methods on any user object:
-
-```ruby
-user = User.find_by(username: 'root')
-user.two_factor_enabled?
-user.disable_two_factor!
-```
-
-Some methods are defined by gems, or Ruby software packages, which GitLab uses.
-For example, the [StateMachines](https://github.com/state-machines/state_machines-activerecord)
-gem which GitLab uses to manage user state:
-
-```ruby
-state_machine :state, initial: :active do
- event :block do
-
- ...
-
- event :activate do
-
- ...
-
-end
-```
-
-Give it a try:
-
-```ruby
-user = User.find_by(username: 'root')
-user.state
-user.block
-user.state
-user.activate
-user.state
-```
-
-Earlier, we mentioned that a validation error prevents the entire object
-from being saved to the database. Let's see how this can have unexpected
-interactions:
-
-```ruby
-user.password = 'password'
-user.password_confirmation = 'hunter2'
-user.block
-```
-
-We get `false` returned! Let's find out what happened by adding a bang as we did
-earlier:
-
-```ruby
-user.block!
-```
-
-Which would return:
-
-```ruby
-Traceback (most recent call last):
- 1: from (irb):87
-StateMachines::InvalidTransition (Cannot transition state via :block from :active (Reason(s): Password confirmation doesn't match Password))
-```
-
-We see that a validation error from what feels like a completely separate
-attribute comes back to haunt us when we try to update the user in any way.
-
-In practical terms, we sometimes see this happen with GitLab administration settings --
-validations are sometimes added or changed in a GitLab update, resulting in
-previously saved settings now failing validation. Because you can only update
-a subset of settings at once through the UI, in this case the only way to get
-back to a good state is direct manipulation via Rails console.
-
-### Commonly used Active Record models and how to look up objects
-
-**Get a user by primary email address or username:**
-
-```ruby
-User.find_by(email: 'admin@example.com')
-User.find_by(username: 'root')
-```
-
-**Get a user by primary OR secondary email address:**
-
-```ruby
-User.find_by_any_email('user@example.com')
-```
-
-The `find_by_any_email` method is a custom method added by GitLab developers rather
-than a Rails-provided default method.
-
-**Get a collection of administrator users:**
-
-```ruby
-User.admins
-```
-
-`admins` is a [scope convenience method](https://guides.rubyonrails.org/active_record_querying.html#scopes)
-which does `where(admin: true)` under the hood.
-
-**Get a project by its path:**
-
-```ruby
-Project.find_by_full_path('group/subgroup/project')
-```
-
-`find_by_full_path` is a custom method added by GitLab developers rather
-than a Rails-provided default method.
-
-**Get a project's issue or merge request by its numeric ID:**
-
-```ruby
-project = Project.find_by_full_path('group/subgroup/project')
-project.issues.find_by(iid: 42)
-project.merge_requests.find_by(iid: 42)
-```
-
-`iid` means "internal ID" and is how we keep issue and merge request IDs
-scoped to each GitLab project.
-
-**Get a group by its path:**
-
-```ruby
-Group.find_by_full_path('group/subgroup')
-```
-
-**Get a group's related groups:**
-
-```ruby
-group = Group.find_by_full_path('group/subgroup')
-
-# Get a group's parent group
-group.parent
-
-# Get a group's child groups
-group.children
-```
-
-**Get a group's projects:**
-
-```ruby
-group = Group.find_by_full_path('group/subgroup')
-
-# Get group's immediate child projects
-group.projects
-
-# Get group's child projects, including those in subgroups
-group.all_projects
-```
-
-**Get CI pipeline or builds:**
-
-```ruby
-Ci::Pipeline.find(4151)
-Ci::Build.find(66124)
-```
-
-The pipeline and job ID numbers increment globally across your GitLab
-instance, so there's no requirement to use an internal ID attribute to look them up,
-unlike with issues or merge requests.
-
-**Get the current application settings object:**
-
-```ruby
-ApplicationSetting.current
-```
+<!-- This redirect file can be deleted after <2022-10-05>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/administration/troubleshooting/postgresql.md b/doc/administration/troubleshooting/postgresql.md
index cdbf786bdb2..61b661d45f8 100644
--- a/doc/administration/troubleshooting/postgresql.md
+++ b/doc/administration/troubleshooting/postgresql.md
@@ -54,7 +54,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/index.md#database-guides),
+- [Developer database documentation](../../development/feature_development.md#database-guides),
some of which is absolutely not for production use. Including:
- Understanding EXPLAIN plans.
diff --git a/doc/administration/troubleshooting/ssl.md b/doc/administration/troubleshooting/ssl.md
index d5d50127ad5..e1cd92a788f 100644
--- a/doc/administration/troubleshooting/ssl.md
+++ b/doc/administration/troubleshooting/ssl.md
@@ -9,7 +9,7 @@ type: reference
This page contains a list of common SSL-related errors and scenarios that you
may encounter while working with GitLab. It should serve as an addition to the
-main SSL docs available here:
+main SSL documentation:
- [Omnibus SSL Configuration](https://docs.gitlab.com/omnibus/settings/ssl.html).
- [Self-signed certificates or custom Certification Authorities for GitLab Runner](https://docs.gitlab.com/runner/configuration/tls-self-signed.html).
@@ -110,8 +110,7 @@ https://gitlab.domain.tld/api/v4/jobs/request: Post https://gitlab.domain.tld/ap
x509: certificate signed by unknown authority
```
-If you encounter a similar problem, add your certificate to `/etc/gitlab-runner/certs`,
-and the restart the runner by running `gitlab-runner restart`.
+Follow the details in [Self-signed certificates or custom Certification Authorities for GitLab Runner](https://docs.gitlab.com/runner/configuration/tls-self-signed.html).
## Mirroring a remote GitLab repository that uses a self-signed SSL certificate
@@ -237,7 +236,7 @@ remote server that is serving only HTTP.
One scenario is that you're using [object storage](../object_storage.md), which
isn't served under HTTPS. GitLab is misconfigured and attempts a TLS handshake,
-but the object storage will respond with plain HTTP.
+but the object storage responds with plain HTTP.
## `schannel: SEC_E_UNTRUSTED_ROOT`
@@ -247,7 +246,7 @@ If you're on Windows and get the following error:
Fatal: unable to access 'https://gitlab.domain.tld/group/project.git': schannel: SEC_E_UNTRUSTED_ROOT (0x80090325) - The certificate chain was issued by an authority that is not trusted."
```
-You may need to specify that Git should use OpenSSL:
+You must specify that Git should use OpenSSL:
```shell
git config --system http.sslbackend openssl
diff --git a/doc/administration/troubleshooting/test_environments.md b/doc/administration/troubleshooting/test_environments.md
index 94d17ba714e..d240103a51c 100644
--- a/doc/administration/troubleshooting/test_environments.md
+++ b/doc/administration/troubleshooting/test_environments.md
@@ -45,7 +45,7 @@ docker run --name gitlab_saml -p 8080:8080 -p 8443:8443 \
-d jamedjo/test-saml-idp
```
-The following will also need to go in your `/etc/gitlab/gitlab.rb`. See [our SAML docs](../../integration/saml.md)
+The following must also go in your `/etc/gitlab/gitlab.rb`. See [our SAML docs](../../integration/saml.md)
for more, as well as the list of [default usernames, passwords, and emails](https://hub.docker.com/r/jamedjo/test-saml-idp/#usage).
```ruby
diff --git a/doc/administration/troubleshooting/tracing_correlation_id.md b/doc/administration/troubleshooting/tracing_correlation_id.md
index fed3604057b..418dd729066 100644
--- a/doc/administration/troubleshooting/tracing_correlation_id.md
+++ b/doc/administration/troubleshooting/tracing_correlation_id.md
@@ -32,7 +32,7 @@ documentation for some popular browsers.
To locate a relevant request and view its correlation ID:
-1. Enable persistent logging in your network monitor. Some actions in GitLab will redirect you quickly after you submit a form, so this will help capture all relevant activity.
+1. Enable persistent logging in your network monitor. Some actions in GitLab redirect you quickly after you submit a form, so this helps capture all relevant activity.
1. To help isolate the requests you are looking for, you can filter for `document` requests.
1. Select the request of interest to view further detail.
1. Go to the **Headers** section and look for **Response Headers**. There you should find an `x-request-id` header with a
@@ -121,7 +121,7 @@ find /var/log/gitlab -type f -mtime 0 -exec grep 'LOt9hgi1TV4' '{}' '+'
### Searching in distributed architectures
If you have done some horizontal scaling in your GitLab infrastructure, then
-you will need to search across _all_ of your GitLab nodes. You can do this with
+you must search across _all_ of your GitLab nodes. You can do this with
some sort of log aggregation software like Loki, ELK, Splunk, or others.
You can use a tool like Ansible or PSSH (parallel SSH) that can execute identical commands across your servers in
diff --git a/doc/administration/uploads.md b/doc/administration/uploads.md
index e618c4787ab..0bd46193d10 100644
--- a/doc/administration/uploads.md
+++ b/doc/administration/uploads.md
@@ -66,7 +66,7 @@ For source installations the following settings are nested under `uploads:` and
| Setting | Description | Default |
|---------|-------------|---------|
| `enabled` | Enable/disable object storage | `false` |
-| `remote_directory` | The bucket name where Uploads will be stored| |
+| `remote_directory` | The bucket name where Uploads are stored| |
| `proxy_download` | Set to `true` to enable proxying all files served. Option allows to reduce egress traffic as this allows clients to download directly from remote storage instead of proxying all data | `false` |
| `connection` | Various connection options described below | |
diff --git a/doc/administration/whats-new.md b/doc/administration/whats-new.md
index beb47254573..05c769cf20c 100644
--- a/doc/administration/whats-new.md
+++ b/doc/administration/whats-new.md
@@ -1,7 +1,7 @@
---
-stage: Growth
-group: Adoption
-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
+stage: none
+group: unassigned
+info: For assistance with this What's new page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-other-projects-and-subjects.
---
# What's new **(FREE)**
diff --git a/doc/api/access_requests.md b/doc/api/access_requests.md
index 32411a2f557..adaae78f1b5 100644
--- a/doc/api/access_requests.md
+++ b/doc/api/access_requests.md
@@ -17,7 +17,7 @@ following levels are recognized:
- Reporter (`20`)
- Developer (`30`)
- Maintainer (`40`)
-- Owner (`50`) - Only valid to set for groups
+- Owner (`50`). Valid for projects in [GitLab 14.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/21432).
## List access requests for a group or project
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index 9408e7c25a6..aa942582e9c 100644
--- a/doc/api/api_resources.md
+++ b/doc/api/api_resources.md
@@ -24,7 +24,7 @@ The following API resources are available in the project context:
| Resource | Available endpoints |
|:------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [Access requests](access_requests.md) | `/projects/:id/access_requests` (also available for groups) |
-| [Access tokens](project_access_tokens.md) | `/projects/:id/access_tokens` (also available for groups) |
+| [Access tokens](project_access_tokens.md) | `/projects/:id/access_tokens` (also available for groups) |
| [Agents](cluster_agents.md) | `/projects/:id/cluster_agents` |
| [Award emoji](award_emoji.md) | `/projects/:id/issues/.../award_emoji`, `/projects/:id/merge_requests/.../award_emoji`, `/projects/:id/snippets/.../award_emoji` |
| [Branches](branches.md) | `/projects/:id/repository/branches/`, `/projects/:id/repository/merged_branches` |
@@ -57,6 +57,7 @@ The following API resources are available in the project context:
| [Merge request approvals](merge_request_approvals.md) **(PREMIUM)** | `/projects/:id/approvals`, `/projects/:id/merge_requests/.../approvals` |
| [Merge requests](merge_requests.md) | `/projects/:id/merge_requests` (also available for groups and standalone) |
| [Merge trains](merge_trains.md) | `/projects/:id/merge_trains` |
+| [Metadata](metadata.md) | `/metadata` |
| [Notes](notes.md) (comments) | `/projects/:id/issues/.../notes`, `/projects/:id/snippets/.../notes`, `/projects/:id/merge_requests/.../notes` (also available for groups) |
| [Notification settings](notification_settings.md) | `/projects/:id/notification_settings` (also available for groups and standalone) |
| [Packages](packages.md) | `/projects/:id/packages` |
@@ -70,7 +71,7 @@ The following API resources are available in the project context:
| [Project milestones](milestones.md) | `/projects/:id/milestones` |
| [Project snippets](project_snippets.md) | `/projects/:id/snippets` |
| [Project templates](project_templates.md) | `/projects/:id/templates` |
-| [Project vulnerabilities](project_vulnerabilities.md) **(ULTIMATE)** | `/projects/:id/vulnerabilities` |
+| [Project vulnerabilities](project_vulnerabilities.md) **(ULTIMATE)** | `/projects/:id/vulnerabilities` |
| [Project wikis](wikis.md) | `/projects/:id/wikis` |
| [Project-level variables](project_level_variables.md) | `/projects/:id/variables` |
| [Projects](projects.md) including setting Webhooks | `/projects`, `/projects/:id/hooks` (also available for users) |
diff --git a/doc/api/audit_events.md b/doc/api/audit_events.md
index 4ddd851ebda..753e01a15aa 100644
--- a/doc/api/audit_events.md
+++ b/doc/api/audit_events.md
@@ -131,7 +131,8 @@ Example response:
## Group Audit Events
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34078) in GitLab 12.5.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34078) in GitLab 12.5.
+> - [Support for keyset pagination added](https://gitlab.com/gitlab-org/gitlab/-/issues/333968) in GitLab 15.2.
The Group Audit Events API allows you to retrieve [group audit events](../administration/audit_events.md#group-events).
This API cannot retrieve project audit events.
@@ -139,6 +140,10 @@ This API cannot retrieve project audit events.
A user with a Owner role (or above) can retrieve group audit events of all users.
A user with a Developer or Maintainer role is limited to group audit events based on their individual actions.
+This endpoint optionally supports [keyset pagination](index.md#keyset-based-pagination):
+
+- When requesting consecutive pages of results, we recommend you use keyset pagination.
+
### Retrieve all group audit events
```plaintext
diff --git a/doc/api/award_emoji.md b/doc/api/award_emoji.md
index 61f84dfb812..5b350dd88c6 100644
--- a/doc/api/award_emoji.md
+++ b/doc/api/award_emoji.md
@@ -23,7 +23,10 @@ See [Award Emoji on Comments](#award-emoji-on-comments) for information on using
### List an awardable's award emojis
-Get a list of all award emojis for a specified awardable.
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/335068) in GitLab 15.1 to allow unauthenticated access to public awardables.
+
+Get a list of all award emojis for a specified awardable. This endpoint can
+be accessed without authentication if the awardable is publicly accessible.
```plaintext
GET /projects/:id/issues/:issue_iid/award_emoji
@@ -85,7 +88,10 @@ Example response:
### Get single award emoji
-Get a single award emoji from an issue, snippet, or merge request.
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/335068) in GitLab 15.1 to allow unauthenticated access to public awardables.
+
+Get a single award emoji from an issue, snippet, or merge request. This endpoint can
+be accessed without authentication if the awardable is publicly accessible.
```plaintext
GET /projects/:id/issues/:issue_iid/award_emoji/:award_id
@@ -206,7 +212,10 @@ adapted to comments on merge requests and snippets. Therefore, you have to repla
### List a comment's award emojis
-Get all award emojis for a comment (note).
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/335068) in GitLab 15.1 to allow unauthenticated access to public comments.
+
+Get all award emojis for a comment (note). This endpoint can
+be accessed without authentication if the comment is publicly accessible.
```plaintext
GET /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji
@@ -251,7 +260,10 @@ Example response:
### Get an award emoji for a comment
-Get a single award emoji for a comment (note).
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/335068) in GitLab 15.1 to allow unauthenticated access to public comments.
+
+Get a single award emoji for a comment (note). This endpoint can
+be accessed without authentication if the comment is publicly accessible.
```plaintext
GET /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji/:award_id
diff --git a/doc/api/broadcast_messages.md b/doc/api/broadcast_messages.md
index 2252568be61..6c95bf2fda5 100644
--- a/doc/api/broadcast_messages.md
+++ b/doc/api/broadcast_messages.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Activation
+group: Acquisition
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
---
diff --git a/doc/api/deploy_keys.md b/doc/api/deploy_keys.md
index adeda014af0..40641c6e2f7 100644
--- a/doc/api/deploy_keys.md
+++ b/doc/api/deploy_keys.md
@@ -6,6 +6,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Deploy keys API **(FREE)**
+The deploy keys API can return in responses fingerprints of the public key in the following fields:
+
+- `fingerprint` (MD5 hash). Not available on FIPS-enabled systems.
+- `fingerprint_sha256` (SHA256 hash). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91302) in GitLab 15.2.
+
## List all deploy keys **(FREE SELF)**
Get a list of all deploy keys across all projects of the GitLab instance. This
@@ -34,8 +39,9 @@ Example response:
{
"id": 1,
"title": "Public key",
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
- "fingerprint": "7f:72:08:7d:0e:47:48:ec:37:79:b2:76:68:b5:87:65",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNJAkI3Wdf0r13c8a5pEExB2YowPWCSVzfZV22pNBc1CuEbyYLHpUyaD0GwpGvFdx2aP7lMEk35k6Rz3ccBF6jRaVJyhsn5VNnW92PMpBJ/P1UebhXwsFHdQf5rTt082cSxWuk61kGWRQtk4ozt/J2DF/dIUVaLvc+z4HomT41fQ==",
+ "fingerprint": "4a:9d:64:15:ed:3a:e6:07:6e:89:36:b3:3b:03:05:d9",
+ "fingerprint_sha256": "SHA256:Jrs3LD1Ji30xNLtTVf9NDCj7kkBgPBb2pjvTZ3HfIgU",
"created_at": "2013-10-02T10:12:29Z",
"projects_with_write_access": [
{
@@ -61,8 +67,9 @@ Example response:
{
"id": 3,
"title": "Another Public key",
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
- "fingerprint": "64:d3:73:d4:83:70:ab:41:96:68:d5:3d:a5:b0:34:ea",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDIJFwIL6YNcCgVBLTHgM6hzmoL5vf0ThDKQMWT3HrwCjUCGPwR63vBwn6+/Gx+kx+VTo9FuojzR0O4XfwD3LrYA+oT3ETbn9U4e/VS4AH/G4SDMzgSLwu0YuPe517FfGWhWGQhjiXphkaQ+6bXPmcASWb0RCO5+pYlGIfxv4eFGQ=="
+ "fingerprint": "0b:cf:58:40:b9:23:96:c7:ba:44:df:0e:9e:87:5e:75",
+ "fingerprint_sha256": "SHA256:lGI/Ys/Wx7PfMhUO1iuBH92JQKYN+3mhJZvWO4Q5ims",
"created_at": "2013-10-02T11:12:29Z",
"projects_with_write_access": []
}
@@ -92,14 +99,18 @@ Example response:
{
"id": 1,
"title": "Public key",
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNJAkI3Wdf0r13c8a5pEExB2YowPWCSVzfZV22pNBc1CuEbyYLHpUyaD0GwpGvFdx2aP7lMEk35k6Rz3ccBF6jRaVJyhsn5VNnW92PMpBJ/P1UebhXwsFHdQf5rTt082cSxWuk61kGWRQtk4ozt/J2DF/dIUVaLvc+z4HomT41fQ==",
+ "fingerprint": "4a:9d:64:15:ed:3a:e6:07:6e:89:36:b3:3b:03:05:d9",
+ "fingerprint_sha256": "SHA256:Jrs3LD1Ji30xNLtTVf9NDCj7kkBgPBb2pjvTZ3HfIgU",
"created_at": "2013-10-02T10:12:29Z",
"can_push": false
},
{
"id": 3,
"title": "Another Public key",
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDIJFwIL6YNcCgVBLTHgM6hzmoL5vf0ThDKQMWT3HrwCjUCGPwR63vBwn6+/Gx+kx+VTo9FuojzR0O4XfwD3LrYA+oT3ETbn9U4e/VS4AH/G4SDMzgSLwu0YuPe517FfGWhWGQhjiXphkaQ+6bXPmcASWb0RCO5+pYlGIfxv4eFGQ=="
+ "fingerprint": "0b:cf:58:40:b9:23:96:c7:ba:44:df:0e:9e:87:5e:75",
+ "fingerprint_sha256": "SHA256:lGI/Ys/Wx7PfMhUO1iuBH92JQKYN+3mhJZvWO4Q5ims",
"created_at": "2013-10-02T11:12:29Z",
"can_push": false
}
@@ -129,16 +140,18 @@ Parameters:
"title": "Key A",
"created_at": "2022-05-30T12:28:27.855Z",
"expires_at": null,
- "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTEVaAtU5wiVducsOa01InRFf7QSTxoAm6Xy0PGv/k48M6xCALa9nY+BzlOv47jUT57 Key",
- "fingerprint": "60:8e:10:f0:6a:82:c8:29:5f:bf:c0:38:72:00:6f:8f"
+ "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILkYXU2fVeO4/0rDCSsswP5iIX2+B6tv15YT3KObgyDl Key",
+ "fingerprint": "40:8e:fa:df:70:f7:a7:06:1e:0d:6f:ae:f2:27:92:01",
+ "fingerprint_sha256": "SHA256:Ojq2LZW43BFK/AMP81jBkDGn9YpPWYRNcViKBB44LPU"
},
{
"id": 2,
"title": "Key B",
"created_at": "2022-05-30T13:34:56.219Z",
"expires_at": null,
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
- "fingerprint": "75:33:44:7e:55:84:dd:70:29:a3:8e:a3:c0:b9:8b:65"
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNJAkI3Wdf0r13c8a5pEExB2YowPWCSVzfZV22pNBc1CuEbyYLHpUyaD0GwpGvFdx2aP7lMEk35k6Rz3ccBF6jRaVJyhsn5VNnW92PMpBJ/P1UebhXwsFHdQf5rTt082cSxWuk61kGWRQtk4ozt/J2DF/dIUVaLvc+z4HomT41fQ==",
+ "fingerprint": "4a:9d:64:15:ed:3a:e6:07:6e:89:36:b3:3b:03:05:d9",
+ "fingerprint_sha256": "SHA256:Jrs3LD1Ji30xNLtTVf9NDCj7kkBgPBb2pjvTZ3HfIgU",
}
]
```
@@ -156,8 +169,9 @@ Example response:
"title": "Key A",
"created_at": "2022-05-30T12:28:27.855Z",
"expires_at": "2022-10-30T12:28:27.855Z",
- "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTEVaAtU5wiVducsOa01InRFf7QSTxoAm6Xy0PGv/k48M6xCALa9nY+BzlOv47jUT57 Key",
- "fingerprint": "60:8e:10:f0:6a:82:c8:29:5f:bf:c0:38:72:00:6f:8f"
+ "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILkYXU2fVeO4/0rDCSsswP5iIX2+B6tv15YT3KObgyDl Key",
+ "fingerprint": "40:8e:fa:df:70:f7:a7:06:1e:0d:6f:ae:f2:27:92:01",
+ "fingerprint_sha256": "SHA256:Ojq2LZW43BFK/AMP81jBkDGn9YpPWYRNcViKBB44LPU"
}
]
```
@@ -187,7 +201,9 @@ Example response:
{
"id": 1,
"title": "Public key",
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNJAkI3Wdf0r13c8a5pEExB2YowPWCSVzfZV22pNBc1CuEbyYLHpUyaD0GwpGvFdx2aP7lMEk35k6Rz3ccBF6jRaVJyhsn5VNnW92PMpBJ/P1UebhXwsFHdQf5rTt082cSxWuk61kGWRQtk4ozt/J2DF/dIUVaLvc+z4HomT41fQ==",
+ "fingerprint": "4a:9d:64:15:ed:3a:e6:07:6e:89:36:b3:3b:03:05:d9",
+ "fingerprint_sha256": "SHA256:Jrs3LD1Ji30xNLtTVf9NDCj7kkBgPBb2pjvTZ3HfIgU",
"created_at": "2013-10-02T10:12:29Z",
"can_push": false
}
diff --git a/doc/api/deployments.md b/doc/api/deployments.md
index fb255bfa226..6831f86e4ea 100644
--- a/doc/api/deployments.md
+++ b/doc/api/deployments.md
@@ -345,7 +345,7 @@ POST /projects/:id/deployments
| `sha` | string | yes | The SHA of the commit that is deployed. |
| `ref` | string | yes | The name of the branch or tag that is deployed. |
| `tag` | boolean | yes | A boolean that indicates if the deployed ref is a tag (`true`) or not (`false`). |
-| `status` | string | no | The status to filter deployments by. One of `created`, `running`, `success`, `failed`, or `canceled`. |
+| `status` | string | yes | The status to filter deployments by. One of `running`, `success`, `failed`, or `canceled`. |
```shell
curl --data "environment=production&sha=a91957a858320c0e17f3a0eca7cfacbff50ea29a&ref=main&tag=false&status=success" \
@@ -400,7 +400,7 @@ PUT /projects/:id/deployments/:deployment_id
|------------------|----------------|----------|---------------------|
| `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`. |
+| `status` | string | yes | The new status of the deployment. One of `running`, `success`, `failed`, or `canceled`. |
```shell
curl --request PUT --data "status=success" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/deployments/42"
diff --git a/doc/api/dora/metrics.md b/doc/api/dora/metrics.md
index f5373d02156..99473ca7b4c 100644
--- a/doc/api/dora/metrics.md
+++ b/doc/api/dora/metrics.md
@@ -21,14 +21,15 @@ Get project-level DORA metrics.
GET /projects/:id/dora/metrics
```
-| Attribute | Type | Required | Description |
-|-------------- |-------- |----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `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: `deployment_frequency`, `lead_time_for_changes` or `time_to_restore_service`.|
-| `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. |
-| `interval` | string | no | The bucketing interval. One of `all`, `monthly` or `daily`. Default is `daily`. |
-| `environment_tier` | string | no | The [tier of the environment](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. |
+| Attribute | Type | Required | Description |
+|:---------------------|:-----------------|:---------|:------------|
+| `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 | One of `deployment_frequency`, `lead_time_for_changes`, `time_to_restore_service` or `change_failure_rate`. |
+| `end_date` | string | no | Date range to end at. ISO 8601 Date format, for example `2021-03-01`. Default is the current date. |
+| `environment_tier` | string | no | The [tier of the environment](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. Deprecated, please use `environment_tiers`. |
+| `environment_tiers` | array of strings | no | The [tiers of the environments](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. |
+| `interval` | string | no | The bucketing interval. One of `all`, `monthly` or `daily`. Default is `daily`. |
+| `start_date` | string | no | Date range to start from. ISO 8601 Date format, for example `2021-03-01`. Default is 3 months ago. |
Example request:
@@ -61,14 +62,15 @@ Get group-level DORA metrics.
GET /groups/:id/dora/metrics
```
-| Attribute | Type | Required | Description |
-|-------------- |-------- |----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `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 | One of `deployment_frequency`, `lead_time_for_changes`, `time_to_restore_service` or `change_failure_rate`. |
-| `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. |
-| `interval` | string | no | The bucketing interval. One of `all`, `monthly` or `daily`. Default is `daily`. |
-| `environment_tier` | string | no | The [tier of the environment](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. |
+| Attribute | Type | Required | Description |
+|:--------------------|:-----------------|:---------|:------------|
+| `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 | One of `deployment_frequency`, `lead_time_for_changes`, `time_to_restore_service` or `change_failure_rate`. |
+| `end_date` | string | no | Date range to end at. ISO 8601 Date format, for example `2021-03-01`. Default is the current date. |
+| `environment_tier` | string | no | The [tier of the environment](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. Deprecated, please use `environment_tiers`. |
+| `environment_tiers` | array of strings | no | The [tiers of the environments](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. |
+| `interval` | string | no | The bucketing interval. One of `all`, `monthly` or `daily`. Default is `daily`. |
+| `start_date` | string | no | Date range to start from. ISO 8601 Date format, for example `2021-03-01`. Default is 3 months ago. |
Example request:
@@ -97,9 +99,9 @@ For both the project and group-level endpoints above, the `value` field in the
API response has a different meaning depending on the provided `metric` query
parameter:
-| `metric` query parameter | Description of `value` in response |
-| ------------------------ |--------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `deployment_frequency` | The number of successful deployments during the time period. |
-| `lead_time_for_changes` | The median number of seconds between the merge of the merge request (MR) and the deployment of the MR's commits for all MRs deployed during the time period. |
-| `time_to_restore_service` | The median number of seconds an incident was open during the time period. Available only for production environment. |
-| `change_failure_rate` | The number of incidents divided by the number of deployments during the time period. Available only for production environment. |
+| `metric` query parameter | Description of `value` in response |
+|:---------------------------|:-----------------------------------|
+| `change_failure_rate` | The number of incidents divided by the number of deployments during the time period. Available only for production environment. |
+| `deployment_frequency` | The number of successful deployments during the time period. |
+| `lead_time_for_changes` | The median number of seconds between the merge of the merge request (MR) and the deployment of the MR's commits for all MRs deployed during the time period. |
+| `time_to_restore_service` | The median number of seconds an incident was open during the time period. Available only for production environment. |
diff --git a/doc/api/dora4_project_analytics.md b/doc/api/dora4_project_analytics.md
deleted file mode 100644
index 19c7afd9d22..00000000000
--- a/doc/api/dora4_project_analytics.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-stage: Manage
-group: Optimize
-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, api
-remove_date: '2022-05-18'
-redirect_to: 'dora/metrics.md'
----
-
-# DORA4 Analytics Project API (removed) **(ULTIMATE)**
-
-WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/323713) in 13.11 and removed in GitLab 14.0. Use the [DORA metrics API](dora/metrics.md) instead.
diff --git a/doc/api/experiments.md b/doc/api/experiments.md
index 669d00454bd..6393a358e51 100644
--- a/doc/api/experiments.md
+++ b/doc/api/experiments.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Expansion
+group: Acquisition
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
---
diff --git a/doc/api/feature_flags.md b/doc/api/feature_flags.md
index 0ad7b04d4f7..b00917674b0 100644
--- a/doc/api/feature_flags.md
+++ b/doc/api/feature_flags.md
@@ -144,7 +144,7 @@ POST /projects/:id/feature_flags
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
| `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). |
+| `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. |
| `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). |
diff --git a/doc/api/feature_flags_legacy.md b/doc/api/feature_flags_legacy.md
deleted file mode 100644
index 1cf05144a1b..00000000000
--- a/doc/api/feature_flags_legacy.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'feature_flags.md'
-remove_date: '2022-06-22'
----
-
-This document was moved to [another location](feature_flags).
-
-<!-- This redirect file can be deleted after <2022-06-22>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 09b97a78e04..be1bfc79aeb 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -61,14 +61,6 @@ You can work with sample queries that pull data from public projects on GitLab.c
The [get started](getting_started.md) page includes different methods to customize GraphQL queries.
-### Update the GraphQL API reference
-
-If you change the GraphQL schema, create a merge request to get your changes approved.
-To generate the required documentation and schema, see
-[Rake tasks for developers](../../development/rake_tasks.md#update-graphql-documentation-and-schema-definitions).
-
-Run the commands using the [GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit/).
-
## Breaking changes
The GitLab GraphQL API is [versionless](https://graphql.org/learn/best-practices/#versioning) and changes to the API are primarily backward-compatible.
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 805f6a506b7..fbf6bc116f4 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -87,6 +87,16 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="queryciminutesusagenamespaceid"></a>`namespaceId` | [`NamespaceID`](#namespaceid) | Global ID of the Namespace for the monthly CI/CD minutes usage. |
+### `Query.ciVariables`
+
+List of the instance's CI/CD variables.
+
+Returns [`CiVariableConnection`](#civariableconnection).
+
+This field returns a [connection](#connections). It accepts the
+four standard [pagination arguments](#connection-pagination-arguments):
+`before: String`, `after: String`, `first: Int`, `last: Int`.
+
### `Query.containerRepository`
Find a container repository.
@@ -377,6 +387,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="queryrunnersstatus"></a>`status` | [`CiRunnerStatus`](#cirunnerstatus) | Filter runners by status. |
| <a id="queryrunnerstaglist"></a>`tagList` | [`[String!]`](#string) | Filter by tags associated with the runner (comma-separated or array). |
| <a id="queryrunnerstype"></a>`type` | [`CiRunnerType`](#cirunnertype) | Filter runners by type. |
+| <a id="queryrunnersupgradestatus"></a>`upgradeStatus` | [`CiRunnerUpgradeStatusType`](#cirunnerupgradestatustype) | Filter by upgrade status. |
### `Query.snippets`
@@ -431,6 +442,18 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="querytimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="querytimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
+### `Query.todo`
+
+Retrieve a single to-do item.
+
+Returns [`Todo`](#todo).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="querytodoid"></a>`id` | [`TodoID!`](#todoid) | ID of the to-do item. |
+
### `Query.topics`
Find project topics.
@@ -756,6 +779,27 @@ Input type: `AuditEventsStreamingHeadersDestroyInput`
| <a id="mutationauditeventsstreamingheadersdestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationauditeventsstreamingheadersdestroyerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+### `Mutation.auditEventsStreamingHeadersUpdate`
+
+Input type: `AuditEventsStreamingHeadersUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationauditeventsstreamingheadersupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationauditeventsstreamingheadersupdateheaderid"></a>`headerId` | [`AuditEventsStreamingHeaderID!`](#auditeventsstreamingheaderid) | Header to update. |
+| <a id="mutationauditeventsstreamingheadersupdatekey"></a>`key` | [`String!`](#string) | Header key. |
+| <a id="mutationauditeventsstreamingheadersupdatevalue"></a>`value` | [`String!`](#string) | Header value. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationauditeventsstreamingheadersupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationauditeventsstreamingheadersupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationauditeventsstreamingheadersupdateheader"></a>`header` | [`AuditEventStreamingHeader`](#auditeventstreamingheader) | Updates header. |
+
### `Mutation.awardEmojiAdd`
Input type: `AwardEmojiAddInput`
@@ -1391,6 +1435,7 @@ Input type: `CreateEpicInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationcreateepicaddlabelids"></a>`addLabelIds` | [`[ID!]`](#id) | IDs of labels to be added to the epic. |
+| <a id="mutationcreateepicaddlabels"></a>`addLabels` | [`[String!]`](#string) | Array of labels to be added to the epic. |
| <a id="mutationcreateepicclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcreateepiccolor"></a>`color` | [`Color`](#color) | Color of the epic. Available only when feature flag `epic_color_highlight` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. |
| <a id="mutationcreateepicconfidential"></a>`confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
@@ -2904,6 +2949,25 @@ Input type: `IssuableResourceLinkCreateInput`
| <a id="mutationissuableresourcelinkcreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationissuableresourcelinkcreateissuableresourcelink"></a>`issuableResourceLink` | [`IssuableResourceLink`](#issuableresourcelink) | Issuable resource link. |
+### `Mutation.issuableResourceLinkDestroy`
+
+Input type: `IssuableResourceLinkDestroyInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationissuableresourcelinkdestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationissuableresourcelinkdestroyid"></a>`id` | [`IncidentManagementIssuableResourceLinkID!`](#incidentmanagementissuableresourcelinkid) | Issuable resource link ID to remove. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationissuableresourcelinkdestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationissuableresourcelinkdestroyerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationissuableresourcelinkdestroyissuableresourcelink"></a>`issuableResourceLink` | [`IssuableResourceLink`](#issuableresourcelink) | Issuable resource link. |
+
### `Mutation.issueMove`
Input type: `IssueMoveInput`
@@ -3782,6 +3846,25 @@ Input type: `MergeRequestUpdateInput`
| <a id="mutationmergerequestupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationmergerequestupdatemergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request after mutation. |
+### `Mutation.namespaceBanDestroy`
+
+Input type: `NamespaceBanDestroyInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationnamespacebandestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationnamespacebandestroyid"></a>`id` | [`NamespacesNamespaceBanID!`](#namespacesnamespacebanid) | Global ID of the namespace ban to remove. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationnamespacebandestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationnamespacebandestroyerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationnamespacebandestroynamespaceban"></a>`namespaceBan` | [`NamespaceBan`](#namespaceban) | Namespace Ban. |
+
### `Mutation.namespaceCiCdSettingsUpdate`
Input type: `NamespaceCiCdSettingsUpdateInput`
@@ -3958,6 +4041,25 @@ Input type: `OncallScheduleUpdateInput`
| <a id="mutationoncallscheduleupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationoncallscheduleupdateoncallschedule"></a>`oncallSchedule` | [`IncidentManagementOncallSchedule`](#incidentmanagementoncallschedule) | On-call schedule. |
+### `Mutation.pagesMarkOnboardingComplete`
+
+Input type: `PagesMarkOnboardingCompleteInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationpagesmarkonboardingcompleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationpagesmarkonboardingcompleteprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationpagesmarkonboardingcompleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationpagesmarkonboardingcompleteerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationpagesmarkonboardingcompleteonboardingcomplete"></a>`onboardingComplete` | [`Boolean!`](#boolean) | Indicates the new onboarding_complete state of the project's Pages metadata. |
+
### `Mutation.pipelineCancel`
Input type: `PipelineCancelInput`
@@ -5016,6 +5118,7 @@ Input type: `UpdateEpicInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationupdateepicaddlabelids"></a>`addLabelIds` | [`[ID!]`](#id) | IDs of labels to be added to the epic. |
+| <a id="mutationupdateepicaddlabels"></a>`addLabels` | [`[String!]`](#string) | Array of labels to be added to the epic. |
| <a id="mutationupdateepicclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationupdateepiccolor"></a>`color` | [`Color`](#color) | Color of the epic. Available only when feature flag `epic_color_highlight` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. |
| <a id="mutationupdateepicconfidential"></a>`confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
@@ -5025,6 +5128,7 @@ Input type: `UpdateEpicInput`
| <a id="mutationupdateepicgrouppath"></a>`groupPath` | [`ID!`](#id) | Group the epic to mutate is in. |
| <a id="mutationupdateepiciid"></a>`iid` | [`ID!`](#id) | IID of the epic to mutate. |
| <a id="mutationupdateepicremovelabelids"></a>`removeLabelIds` | [`[ID!]`](#id) | IDs of labels to be removed from the epic. |
+| <a id="mutationupdateepicremovelabels"></a>`removeLabels` | [`[String!]`](#string) | Array of labels to be removed from the epic. |
| <a id="mutationupdateepicstartdatefixed"></a>`startDateFixed` | [`String`](#string) | Start date of the epic. |
| <a id="mutationupdateepicstartdateisfixed"></a>`startDateIsFixed` | [`Boolean`](#boolean) | Indicates start date should be sourced from start_date_fixed field not the issue milestones. |
| <a id="mutationupdateepicstateevent"></a>`stateEvent` | [`EpicStateEvent`](#epicstateevent) | State event for the epic. |
@@ -5419,7 +5523,8 @@ Input type: `VulnerabilityFindingDismissInput`
| <a id="mutationvulnerabilityfindingdismissclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationvulnerabilityfindingdismisscomment"></a>`comment` | [`String`](#string) | Comment why finding should be dismissed. |
| <a id="mutationvulnerabilityfindingdismissdismissalreason"></a>`dismissalReason` | [`VulnerabilityDismissalReason`](#vulnerabilitydismissalreason) | Reason why finding should be dismissed. |
-| <a id="mutationvulnerabilityfindingdismissid"></a>`id` | [`VulnerabilitiesFindingID!`](#vulnerabilitiesfindingid) | ID of the finding to be dismissed. |
+| <a id="mutationvulnerabilityfindingdismissid"></a>`id` **{warning-solid}** | [`VulnerabilitiesFindingID`](#vulnerabilitiesfindingid) | **Deprecated:** Use `uuid`. Deprecated in 15.2. |
+| <a id="mutationvulnerabilityfindingdismissuuid"></a>`uuid` | [`String`](#string) | UUID of the finding to be dismissed. |
#### Fields
@@ -5483,6 +5588,7 @@ Input type: `WorkItemCreateInput`
| ---- | ---- | ----------- |
| <a id="mutationworkitemcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationworkitemcreatedescription"></a>`description` | [`String`](#string) | Description of the work item. |
+| <a id="mutationworkitemcreatehierarchywidget"></a>`hierarchyWidget` | [`WorkItemWidgetHierarchyCreateInput`](#workitemwidgethierarchycreateinput) | Input for hierarchy widget. |
| <a id="mutationworkitemcreateprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project the work item is associated with. |
| <a id="mutationworkitemcreatetitle"></a>`title` | [`String!`](#string) | Title of the work item. |
| <a id="mutationworkitemcreateworkitemtypeid"></a>`workItemTypeId` | [`WorkItemsTypeID!`](#workitemstypeid) | Global ID of a work item type. |
@@ -5589,9 +5695,12 @@ Input type: `WorkItemUpdateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationworkitemupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationworkitemupdatedescriptionwidget"></a>`descriptionWidget` | [`WorkItemWidgetDescriptionInput`](#workitemwidgetdescriptioninput) | Input for description widget. |
+| <a id="mutationworkitemupdatehierarchywidget"></a>`hierarchyWidget` | [`WorkItemWidgetHierarchyUpdateInput`](#workitemwidgethierarchyupdateinput) | Input for hierarchy widget. |
| <a id="mutationworkitemupdateid"></a>`id` | [`WorkItemID!`](#workitemid) | Global ID of the work item. |
| <a id="mutationworkitemupdatestateevent"></a>`stateEvent` | [`WorkItemStateEvent`](#workitemstateevent) | Close or reopen a work item. |
| <a id="mutationworkitemupdatetitle"></a>`title` | [`String`](#string) | Title of the work item. |
+| <a id="mutationworkitemupdateweightwidget"></a>`weightWidget` | [`WorkItemWidgetWeightInput`](#workitemwidgetweightinput) | Input for weight widget. |
#### Fields
@@ -6216,6 +6325,29 @@ The edge type for [`CiStage`](#cistage).
| <a id="cistageedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="cistageedgenode"></a>`node` | [`CiStage`](#cistage) | The item at the end of the edge. |
+#### `CiVariableConnection`
+
+The connection type for [`CiVariable`](#civariable).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="civariableconnectionedges"></a>`edges` | [`[CiVariableEdge]`](#civariableedge) | A list of edges. |
+| <a id="civariableconnectionnodes"></a>`nodes` | [`[CiVariable]`](#civariable) | A list of nodes. |
+| <a id="civariableconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `CiVariableEdge`
+
+The edge type for [`CiVariable`](#civariable).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="civariableedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="civariableedgenode"></a>`node` | [`CiVariable`](#civariable) | The item at the end of the edge. |
+
#### `ClusterAgentActivityEventConnection`
The connection type for [`ClusterAgentActivityEvent`](#clusteragentactivityevent).
@@ -7166,6 +7298,29 @@ The edge type for [`IncidentManagementOncallShift`](#incidentmanagementoncallshi
| <a id="incidentmanagementoncallshiftedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="incidentmanagementoncallshiftedgenode"></a>`node` | [`IncidentManagementOncallShift`](#incidentmanagementoncallshift) | The item at the end of the edge. |
+#### `IssuableResourceLinkConnection`
+
+The connection type for [`IssuableResourceLink`](#issuableresourcelink).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="issuableresourcelinkconnectionedges"></a>`edges` | [`[IssuableResourceLinkEdge]`](#issuableresourcelinkedge) | A list of edges. |
+| <a id="issuableresourcelinkconnectionnodes"></a>`nodes` | [`[IssuableResourceLink]`](#issuableresourcelink) | A list of nodes. |
+| <a id="issuableresourcelinkconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `IssuableResourceLinkEdge`
+
+The edge type for [`IssuableResourceLink`](#issuableresourcelink).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="issuableresourcelinkedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="issuableresourcelinkedgenode"></a>`node` | [`IssuableResourceLink`](#issuableresourcelink) | The item at the end of the edge. |
+
#### `IssueConnection`
The connection type for [`Issue`](#issue).
@@ -9422,7 +9577,7 @@ Represents an epic on an issue board.
| <a id="boardepicblockedbyepics"></a>`blockedByEpics` | [`EpicConnection`](#epicconnection) | Epics blocking this epic. (see [Connections](#connections)) |
| <a id="boardepicblockingcount"></a>`blockingCount` | [`Int`](#int) | Count of epics that this epic is blocking. |
| <a id="boardepicclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the epic was closed. |
-| <a id="boardepiccolor"></a>`color` | [`String!`](#string) | Color of the epic. Available only when feature flag `epic_color_highlight` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. |
+| <a id="boardepiccolor"></a>`color` | [`String`](#string) | Color of the epic. Returns `null` if `epic_color_highlight` feature flag is disabled. |
| <a id="boardepicconfidential"></a>`confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
| <a id="boardepiccreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of when the epic was created. |
| <a id="boardepicdescendantcounts"></a>`descendantCounts` | [`EpicDescendantCount`](#epicdescendantcount) | Number of open and closed descendant epics and issues. |
@@ -9458,7 +9613,7 @@ Represents an epic on an issue board.
| <a id="boardepicstartdateisfixed"></a>`startDateIsFixed` | [`Boolean`](#boolean) | Indicates if the start date has been manually set. |
| <a id="boardepicstate"></a>`state` | [`EpicState!`](#epicstate) | State of the epic. |
| <a id="boardepicsubscribed"></a>`subscribed` | [`Boolean!`](#boolean) | Indicates the currently logged in user is subscribed to the epic. |
-| <a id="boardepictextcolor"></a>`textColor` | [`String!`](#string) | Text color generated for the epic. Available only when feature flag `epic_color_highlight` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. |
+| <a id="boardepictextcolor"></a>`textColor` | [`String`](#string) | Text color generated for the epic. Returns `null` if `epic_color_highlight` feature flag is disabled. |
| <a id="boardepictitle"></a>`title` | [`String`](#string) | Title of the epic. |
| <a id="boardepictitlehtml"></a>`titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title`. |
| <a id="boardepicupdatedat"></a>`updatedAt` | [`Time`](#time) | Timestamp of when the epic was updated. |
@@ -9782,6 +9937,7 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cijobid"></a>`id` | [`JobID`](#jobid) | ID of the job. |
| <a id="cijobkind"></a>`kind` | [`CiJobKind!`](#cijobkind) | Indicates the type of job. |
| <a id="cijobmanualjob"></a>`manualJob` | [`Boolean`](#boolean) | Whether the job has a manual action. |
+| <a id="cijobmanualvariables"></a>`manualVariables` | [`CiVariableConnection`](#civariableconnection) | Variables added to a manual job when the job is triggered. (see [Connections](#connections)) |
| <a id="cijobname"></a>`name` | [`String`](#string) | Name of the job. |
| <a id="cijobneeds"></a>`needs` | [`CiBuildNeedConnection`](#cibuildneedconnection) | References to builds that must complete before the jobs run. (see [Connections](#connections)) |
| <a id="cijobpipeline"></a>`pipeline` | [`Pipeline`](#pipeline) | Pipeline the job belongs to. |
@@ -9791,6 +9947,7 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cijobqueuedduration"></a>`queuedDuration` | [`Duration`](#duration) | How long the job was enqueued before starting. |
| <a id="cijobrefname"></a>`refName` | [`String`](#string) | Ref name of the job. |
| <a id="cijobrefpath"></a>`refPath` | [`String`](#string) | Path to the ref. |
+| <a id="cijobretried"></a>`retried` | [`Boolean`](#boolean) | Indicates that the job has been retried. |
| <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 job scheduling. Value is `dag` if the job uses the `needs` keyword, and `stage` otherwise. |
@@ -9937,6 +10094,21 @@ GitLab CI/CD configuration template.
| <a id="citemplatecontent"></a>`content` | [`String!`](#string) | Contents of the CI template. |
| <a id="citemplatename"></a>`name` | [`String!`](#string) | Name of the CI template. |
+### `CiVariable`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="civariableenvironmentscope"></a>`environmentScope` | [`String`](#string) | Scope defining the environments in which the variable can be used. |
+| <a id="civariableid"></a>`id` | [`ID!`](#id) | ID of the variable. |
+| <a id="civariablekey"></a>`key` | [`String`](#string) | Name of the variable. |
+| <a id="civariablemasked"></a>`masked` | [`Boolean`](#boolean) | Indicates whether the variable is masked. |
+| <a id="civariableprotected"></a>`protected` | [`Boolean`](#boolean) | Indicates whether the variable is protected. |
+| <a id="civariableraw"></a>`raw` | [`Boolean`](#boolean) | Indicates whether the variable is raw. |
+| <a id="civariablevalue"></a>`value` | [`String`](#string) | Value of the variable. |
+| <a id="civariablevariabletype"></a>`variableType` | [`CiVariableType`](#civariabletype) | Type of the variable. |
+
### `ClusterAgent`
#### Fields
@@ -10950,7 +11122,8 @@ Returns [`[DoraMetric!]`](#dorametric).
| 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) | Deployment tier of the environments to return. Defaults to `PRODUCTION`. |
+| <a id="dorametricsenvironmenttier"></a>`environmentTier` | [`DeploymentTier`](#deploymenttier) | Deployment tier of the environments to return. Deprecated, please update to `environment_tiers` param. |
+| <a id="dorametricsenvironmenttiers"></a>`environmentTiers` | [`[DeploymentTier!]`](#deploymenttier) | Deployment tiers 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) | Type of metric to return. |
| <a id="dorametricsstartdate"></a>`startDate` | [`Date`](#date) | Date range to start from. Default is 3 months ago. |
@@ -11007,7 +11180,7 @@ Represents an epic.
| <a id="epicblockedbyepics"></a>`blockedByEpics` | [`EpicConnection`](#epicconnection) | Epics blocking this epic. (see [Connections](#connections)) |
| <a id="epicblockingcount"></a>`blockingCount` | [`Int`](#int) | Count of epics that this epic is blocking. |
| <a id="epicclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the epic was closed. |
-| <a id="epiccolor"></a>`color` | [`String!`](#string) | Color of the epic. Available only when feature flag `epic_color_highlight` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. |
+| <a id="epiccolor"></a>`color` | [`String`](#string) | Color of the epic. Returns `null` if `epic_color_highlight` feature flag is disabled. |
| <a id="epicconfidential"></a>`confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
| <a id="epiccreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of when the epic was created. |
| <a id="epicdescendantcounts"></a>`descendantCounts` | [`EpicDescendantCount`](#epicdescendantcount) | Number of open and closed descendant epics and issues. |
@@ -11043,7 +11216,7 @@ Represents an epic.
| <a id="epicstartdateisfixed"></a>`startDateIsFixed` | [`Boolean`](#boolean) | Indicates if the start date has been manually set. |
| <a id="epicstate"></a>`state` | [`EpicState!`](#epicstate) | State of the epic. |
| <a id="epicsubscribed"></a>`subscribed` | [`Boolean!`](#boolean) | Indicates the currently logged in user is subscribed to the epic. |
-| <a id="epictextcolor"></a>`textColor` | [`String!`](#string) | Text color generated for the epic. Available only when feature flag `epic_color_highlight` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. |
+| <a id="epictextcolor"></a>`textColor` | [`String`](#string) | Text color generated for the epic. Returns `null` if `epic_color_highlight` feature flag is disabled. |
| <a id="epictitle"></a>`title` | [`String`](#string) | Title of the epic. |
| <a id="epictitlehtml"></a>`titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title`. |
| <a id="epicupdatedat"></a>`updatedAt` | [`Time`](#time) | Timestamp of when the epic was updated. |
@@ -11322,6 +11495,22 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="epicissuecurrentusertodosstate"></a>`state` | [`TodoStateEnum`](#todostateenum) | State of the to-do items. |
+##### `EpicIssue.issuableResourceLinks`
+
+Issuable resource links of the incident issue.
+
+Returns [`IssuableResourceLinkConnection`](#issuableresourcelinkconnection).
+
+This field returns a [connection](#connections). It accepts the
+four standard [pagination arguments](#connection-pagination-arguments):
+`before: String`, `after: String`, `first: Int`, `last: Int`.
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="epicissueissuableresourcelinksincidentid"></a>`incidentId` | [`IssueID!`](#issueid) | ID of the incident. |
+
##### `EpicIssue.reference`
Internal reference of the issue. Returned in shortened format by default.
@@ -11448,7 +11637,7 @@ Represents an external resource to send audit events to.
| ---- | ---- | ----------- |
| <a id="externalauditeventdestinationdestinationurl"></a>`destinationUrl` | [`String!`](#string) | External destination to send audit events to. |
| <a id="externalauditeventdestinationgroup"></a>`group` | [`Group!`](#group) | Group the destination belongs to. |
-| <a id="externalauditeventdestinationheaders"></a>`headers` | [`AuditEventStreamingHeaderConnection!`](#auditeventstreamingheaderconnection) | List of additional HTTP headers sent with each event. Available only when feature flag `streaming_audit_event_headers` 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="externalauditeventdestinationheaders"></a>`headers` | [`AuditEventStreamingHeaderConnection!`](#auditeventstreamingheaderconnection) | List of additional HTTP headers sent with each event. Available only when feature flag `streaming_audit_event_headers` is enabled. This flag is enabled by default. (see [Connections](#connections)) |
| <a id="externalauditeventdestinationid"></a>`id` | [`ID!`](#id) | ID of the destination. |
| <a id="externalauditeventdestinationverificationtoken"></a>`verificationToken` | [`String!`](#string) | Verification token to validate source of event. |
@@ -11675,6 +11864,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupallowstalerunnerpruning"></a>`allowStaleRunnerPruning` | [`Boolean!`](#boolean) | Indicates whether to regularly prune stale group runners. Defaults to false. |
| <a id="groupautodevopsenabled"></a>`autoDevopsEnabled` | [`Boolean`](#boolean) | Indicates whether Auto DevOps is enabled for all projects within this group. |
| <a id="groupavatarurl"></a>`avatarUrl` | [`String`](#string) | Avatar URL of the group. |
+| <a id="groupcivariables"></a>`ciVariables` | [`CiVariableConnection`](#civariableconnection) | List of the group's CI/CD variables. (see [Connections](#connections)) |
| <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="groupcrossprojectpipelineavailable"></a>`crossProjectPipelineAvailable` | [`Boolean!`](#boolean) | Indicates if the cross_project_pipeline feature is available for the namespace. |
@@ -11691,6 +11881,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
| <a id="groupdora"></a>`dora` | [`Dora`](#dora) | Group's DORA metrics. |
| <a id="groupemailsdisabled"></a>`emailsDisabled` | [`Boolean`](#boolean) | Indicates if a group has email notifications disabled. |
+| <a id="groupenforcefreeusercap"></a>`enforceFreeUserCap` | [`Boolean`](#boolean) | Indicates whether the group has limited users for a free plan. |
| <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. |
| <a id="groupexternalauditeventdestinations"></a>`externalAuditEventDestinations` | [`ExternalAuditEventDestinationConnection`](#externalauditeventdestinationconnection) | External locations that receive audit events belonging to the group. (see [Connections](#connections)) |
@@ -11766,6 +11957,22 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="groupboardsid"></a>`id` | [`BoardID`](#boardid) | Find a board by its ID. |
+##### `Group.clusterAgents`
+
+Cluster agents associated with projects in the group and its subgroups.
+
+Returns [`ClusterAgentConnection`](#clusteragentconnection).
+
+This field returns a [connection](#connections). It accepts the
+four standard [pagination arguments](#connection-pagination-arguments):
+`before: String`, `after: String`, `first: Int`, `last: Int`.
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="groupclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
+
##### `Group.codeCoverageActivities`
Represents the code coverage activity for this group.
@@ -12236,6 +12443,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="grouprunnersstatus"></a>`status` | [`CiRunnerStatus`](#cirunnerstatus) | Filter runners by status. |
| <a id="grouprunnerstaglist"></a>`tagList` | [`[String!]`](#string) | Filter by tags associated with the runner (comma-separated or array). |
| <a id="grouprunnerstype"></a>`type` | [`CiRunnerType`](#cirunnertype) | Filter runners by type. |
+| <a id="grouprunnersupgradestatus"></a>`upgradeStatus` | [`CiRunnerUpgradeStatusType`](#cirunnerupgradestatustype) | Filter by upgrade status. |
##### `Group.scanExecutionPolicies`
@@ -12559,6 +12767,22 @@ A block of time for which a participant is on-call.
#### Fields with arguments
+##### `InstanceSecurityDashboard.clusterAgents`
+
+Cluster agents associated with projects selected in the Instance Security Dashboard.
+
+Returns [`ClusterAgentConnection`](#clusteragentconnection).
+
+This field returns a [connection](#connections). It accepts the
+four standard [pagination arguments](#connection-pagination-arguments):
+`before: String`, `after: String`, `first: Int`, `last: Int`.
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="instancesecuritydashboardclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
+
##### `InstanceSecurityDashboard.projects`
Projects selected in Instance Security Dashboard.
@@ -12695,6 +12919,22 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="issuecurrentusertodosstate"></a>`state` | [`TodoStateEnum`](#todostateenum) | State of the to-do items. |
+##### `Issue.issuableResourceLinks`
+
+Issuable resource links of the incident issue.
+
+Returns [`IssuableResourceLinkConnection`](#issuableresourcelinkconnection).
+
+This field returns a [connection](#connections). It accepts the
+four standard [pagination arguments](#connection-pagination-arguments):
+`before: String`, `after: String`, `first: Int`, `last: Int`.
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="issueissuableresourcelinksincidentid"></a>`incidentId` | [`IssueID!`](#issueid) | ID of the incident. |
+
##### `Issue.reference`
Internal reference of the issue. Returned in shortened format by default.
@@ -14289,6 +14529,16 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="namespacescanexecutionpoliciesactionscantypes"></a>`actionScanTypes` | [`[SecurityReportTypeEnum!]`](#securityreporttypeenum) | Filters policies by the action scan type. Only these scan types are supported: `dast`, `secret_detection`, `cluster_image_scanning`, `container_scanning`, `sast`. |
| <a id="namespacescanexecutionpoliciesrelationship"></a>`relationship` | [`SecurityPolicyRelationType`](#securitypolicyrelationtype) | Filter policies by the given policy relationship. |
+### `NamespaceBan`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="namespacebanid"></a>`id` | [`GlobalID!`](#globalid) | Global ID of the namespace ban. |
+| <a id="namespacebannamespace"></a>`namespace` | [`Namespace!`](#namespace) | Root namespace to which the ban applies. |
+| <a id="namespacebanuser"></a>`user` | [`UserCore!`](#usercore) | User to which the namespace ban applies. |
+
### `NamespaceCiCdSetting`
#### Fields
@@ -14757,6 +15007,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="pipelinejobsretried"></a>`retried` | [`Boolean`](#boolean) | Filter jobs by retry-status. |
| <a id="pipelinejobssecurityreporttypes"></a>`securityReportTypes` | [`[SecurityReportTypeEnum!]`](#securityreporttypeenum) | Filter jobs by the type of security report they produce. |
| <a id="pipelinejobsstatuses"></a>`statuses` | [`[CiJobStatus!]`](#cijobstatus) | Filter jobs by status. |
@@ -14913,7 +15164,7 @@ Represents vulnerability finding of a security report on the pipeline.
| <a id="projectcicdsettings"></a>`ciCdSettings` | [`ProjectCiCdSetting`](#projectcicdsetting) | CI/CD settings for the project. |
| <a id="projectciconfigpathordefault"></a>`ciConfigPathOrDefault` | [`String!`](#string) | Path of the CI configuration file. |
| <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="projectcivariables"></a>`ciVariables` | [`CiVariableConnection`](#civariableconnection) | List of the project's CI/CD variables. (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) | Container expiration policy of the project. |
@@ -14966,8 +15217,8 @@ Represents vulnerability finding of a security report on the pipeline.
| <a id="projectsecuritydashboardpath"></a>`securityDashboardPath` | [`String`](#string) | Path to project's security dashboard. |
| <a id="projectsecurityscanners"></a>`securityScanners` | [`SecurityScanners`](#securityscanners) | Information about security analyzers used in the project. |
| <a id="projectsentryerrors"></a>`sentryErrors` | [`SentryErrorCollection`](#sentryerrorcollection) | Paginated collection of Sentry errors on the project. |
-| <a id="projectservicedeskaddress"></a>`serviceDeskAddress` | [`String`](#string) | E-mail address of the service desk. |
-| <a id="projectservicedeskenabled"></a>`serviceDeskEnabled` | [`Boolean`](#boolean) | Indicates if the project has service desk enabled. |
+| <a id="projectservicedeskaddress"></a>`serviceDeskAddress` | [`String`](#string) | E-mail address of the Service Desk. |
+| <a id="projectservicedeskenabled"></a>`serviceDeskEnabled` | [`Boolean`](#boolean) | Indicates if the project has Service Desk enabled. |
| <a id="projectsharedrunnersenabled"></a>`sharedRunnersEnabled` | [`Boolean`](#boolean) | Indicates if shared runners are enabled for the project. |
| <a id="projectsnippetsenabled"></a>`snippetsEnabled` | [`Boolean`](#boolean) | Indicates if Snippets are enabled for the current user. |
| <a id="projectsquashcommittemplate"></a>`squashCommitTemplate` | [`String`](#string) | Template used to create squash commit message in merge requests. |
@@ -15133,8 +15384,25 @@ Returns [`ClusterAgent`](#clusteragent).
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="projectclusteragenthasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
| <a id="projectclusteragentname"></a>`name` | [`String!`](#string) | Name of the cluster agent. |
+##### `Project.clusterAgents`
+
+Cluster agents associated with the project.
+
+Returns [`ClusterAgentConnection`](#clusteragentconnection).
+
+This field returns a [connection](#connections). It accepts the
+four standard [pagination arguments](#connection-pagination-arguments):
+`before: String`, `after: String`, `first: Int`, `last: Int`.
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="projectclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
+
##### `Project.containerRepositories`
Container repositories of the project.
@@ -16206,6 +16474,7 @@ Represents a release.
| <a id="releasedescription"></a>`description` | [`String`](#string) | Description (also known as "release notes") of the release. |
| <a id="releasedescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
| <a id="releaseevidences"></a>`evidences` | [`ReleaseEvidenceConnection`](#releaseevidenceconnection) | Evidence for the release. (see [Connections](#connections)) |
+| <a id="releasehistoricalrelease"></a>`historicalRelease` | [`Boolean`](#boolean) | Indicates the release is an historical release. |
| <a id="releaseid"></a>`id` | [`ReleaseID!`](#releaseid) | Global ID of the release. |
| <a id="releaselinks"></a>`links` | [`ReleaseLinks`](#releaselinks) | Links of the release. |
| <a id="releasemilestones"></a>`milestones` | [`MilestoneConnection`](#milestoneconnection) | Milestones associated to the release. (see [Connections](#connections)) |
@@ -16628,8 +16897,10 @@ Represents the scan result policy.
| ---- | ---- | ----------- |
| <a id="scanresultpolicydescription"></a>`description` | [`String!`](#string) | Description of the policy. |
| <a id="scanresultpolicyenabled"></a>`enabled` | [`Boolean!`](#boolean) | Indicates whether this policy is enabled. |
+| <a id="scanresultpolicygroupapprovers"></a>`groupApprovers` | [`[Group!]`](#group) | Approvers of the group type. |
| <a id="scanresultpolicyname"></a>`name` | [`String!`](#string) | Name of the policy. |
| <a id="scanresultpolicyupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of when the policy YAML was last updated. |
+| <a id="scanresultpolicyuserapprovers"></a>`userApprovers` | [`[UserCore!]`](#usercore) | Approvers of the user type. |
| <a id="scanresultpolicyyaml"></a>`yaml` | [`String!`](#string) | YAML definition of the policy. |
### `ScannedResource`
@@ -18273,6 +18544,19 @@ Check permissions for the current user on a work item.
| <a id="workitemtypeid"></a>`id` | [`WorkItemsTypeID!`](#workitemstypeid) | Global ID of the work item type. |
| <a id="workitemtypename"></a>`name` | [`String!`](#string) | Name of the work item type. |
+### `WorkItemWidgetAssignees`
+
+Represents an assignees widget.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitemwidgetassigneesallowsmultipleassignees"></a>`allowsMultipleAssignees` | [`Boolean`](#boolean) | Indicates whether multiple assignees are allowed. |
+| <a id="workitemwidgetassigneesassignees"></a>`assignees` | [`UserCoreConnection`](#usercoreconnection) | Assignees of the work item. (see [Connections](#connections)) |
+| <a id="workitemwidgetassigneescaninvitemembers"></a>`canInviteMembers` | [`Boolean!`](#boolean) | Indicates whether the current user can invite members to the work item's project. |
+| <a id="workitemwidgetassigneestype"></a>`type` | [`WorkItemWidgetType`](#workitemwidgettype) | Widget type. |
+
### `WorkItemWidgetDescription`
Represents a description widget.
@@ -18297,6 +18581,17 @@ Represents a hierarchy widget.
| <a id="workitemwidgethierarchyparent"></a>`parent` | [`WorkItem`](#workitem) | Parent work item. |
| <a id="workitemwidgethierarchytype"></a>`type` | [`WorkItemWidgetType`](#workitemwidgettype) | Widget type. |
+### `WorkItemWidgetWeight`
+
+Represents a weight widget.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitemwidgetweighttype"></a>`type` | [`WorkItemWidgetType`](#workitemwidgettype) | Widget type. |
+| <a id="workitemwidgetweightweight"></a>`weight` | [`Int`](#int) | Weight of the work item. |
+
## Enumeration types
Also called _Enums_, enumeration types are a special kind of scalar that
@@ -18568,6 +18863,13 @@ Values for sorting runners.
| <a id="cirunnerupgradestatustyperecommended"></a>`RECOMMENDED` | Upgrade is available and recommended for the runner. |
| <a id="cirunnerupgradestatustypeunknown"></a>`UNKNOWN` | Upgrade status is unknown. |
+### `CiVariableType`
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="civariabletypeenv_var"></a>`ENV_VAR` | Env var type. |
+| <a id="civariabletypefile"></a>`FILE` | File type. |
+
### `CodeQualityDegradationSeverity`
| Value | Description |
@@ -19005,6 +19307,7 @@ User permission on groups.
| Value | Description |
| ----- | ----------- |
| <a id="grouppermissioncreate_projects"></a>`CREATE_PROJECTS` | Groups where the user can create projects. |
+| <a id="grouppermissiontransfer_projects"></a>`TRANSFER_PROJECTS` | Groups where the user can transfer projects to. |
### `HealthStatus`
@@ -19148,6 +19451,7 @@ Issue type.
| <a id="issuetypeincident"></a>`INCIDENT` | Incident issue type. |
| <a id="issuetypeissue"></a>`ISSUE` | Issue issue type. |
| <a id="issuetyperequirement"></a>`REQUIREMENT` | Requirement issue type. |
+| <a id="issuetypetask"></a>`TASK` **{warning-solid}** | **Introduced** in 15.2. This feature is in Alpha. It can be changed or removed at any time. |
| <a id="issuetypetest_case"></a>`TEST_CASE` | Test Case issue type. |
### `IterationSearchableField`
@@ -19669,8 +19973,9 @@ The status of the security scan.
| Value | Description |
| ----- | ----------- |
-| <a id="securitypolicyrelationtypedirect"></a>`DIRECT` | Policies defined for the project only. |
-| <a id="securitypolicyrelationtypeinherited"></a>`INHERITED` | Policies defined for the project and project's ancestor groups. |
+| <a id="securitypolicyrelationtypedirect"></a>`DIRECT` | Policies defined for the project/group only. |
+| <a id="securitypolicyrelationtypeinherited"></a>`INHERITED` | Policies defined for the project/group and ancestor groups. |
+| <a id="securitypolicyrelationtypeinherited_only"></a>`INHERITED_ONLY` | Policies defined for the project/group's ancestor groups only. |
### `SecurityReportTypeEnum`
@@ -19911,7 +20216,7 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumgeo_migrate_hashed_storage"></a>`GEO_MIGRATE_HASHED_STORAGE` | Callout feature name for geo_migrate_hashed_storage. |
| <a id="usercalloutfeaturenameenumgke_cluster_integration"></a>`GKE_CLUSTER_INTEGRATION` | Callout feature name for gke_cluster_integration. |
| <a id="usercalloutfeaturenameenumgold_trial_billings"></a>`GOLD_TRIAL_BILLINGS` | Callout feature name for gold_trial_billings. |
-| <a id="usercalloutfeaturenameenumminute_limit_banner"></a>`MINUTE_LIMIT_BANNER` | Callout feature name for minute_limit_banner. |
+| <a id="usercalloutfeaturenameenummr_experience_survey"></a>`MR_EXPERIENCE_SURVEY` | Callout feature name for mr_experience_survey. |
| <a id="usercalloutfeaturenameenumnew_user_signups_cap_reached"></a>`NEW_USER_SIGNUPS_CAP_REACHED` | Callout feature name for new_user_signups_cap_reached. |
| <a id="usercalloutfeaturenameenumpersonal_access_token_expiry"></a>`PERSONAL_ACCESS_TOKEN_EXPIRY` | Callout feature name for personal_access_token_expiry. |
| <a id="usercalloutfeaturenameenumpersonal_project_limitations_banner"></a>`PERSONAL_PROJECT_LIMITATIONS_BANNER` | Callout feature name for personal_project_limitations_banner. |
@@ -20138,8 +20443,10 @@ Type of a work item widget.
| Value | Description |
| ----- | ----------- |
+| <a id="workitemwidgettypeassignees"></a>`ASSIGNEES` | Assignees widget. |
| <a id="workitemwidgettypedescription"></a>`DESCRIPTION` | Description widget. |
| <a id="workitemwidgettypehierarchy"></a>`HIERARCHY` | Hierarchy widget. |
+| <a id="workitemwidgettypeweight"></a>`WEIGHT` | Weight widget. |
## Scalar types
@@ -20541,6 +20848,12 @@ A `NamespaceID` is a global ID. It is encoded as a string.
An example `NamespaceID` is: `"gid://gitlab/Namespace/1"`.
+### `NamespacesNamespaceBanID`
+
+A `NamespacesNamespaceBanID` is a global ID. It is encoded as a string.
+
+An example `NamespacesNamespaceBanID` is: `"gid://gitlab/Namespaces::NamespaceBan/1"`.
+
### `NoteID`
A `NoteID` is a global ID. It is encoded as a string.
@@ -21358,8 +21671,10 @@ four standard [pagination arguments](#connection-pagination-arguments):
Implementations:
+- [`WorkItemWidgetAssignees`](#workitemwidgetassignees)
- [`WorkItemWidgetDescription`](#workitemwidgetdescription)
- [`WorkItemWidgetHierarchy`](#workitemwidgethierarchy)
+- [`WorkItemWidgetWeight`](#workitemwidgetweight)
##### Fields
@@ -21845,9 +22160,12 @@ A time-frame defined as a closed inclusive range of two dates.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="workitemupdatedtaskinputdescriptionwidget"></a>`descriptionWidget` | [`WorkItemWidgetDescriptionInput`](#workitemwidgetdescriptioninput) | Input for description widget. |
+| <a id="workitemupdatedtaskinputhierarchywidget"></a>`hierarchyWidget` | [`WorkItemWidgetHierarchyUpdateInput`](#workitemwidgethierarchyupdateinput) | Input for hierarchy widget. |
| <a id="workitemupdatedtaskinputid"></a>`id` | [`WorkItemID!`](#workitemid) | Global ID of the work item. |
| <a id="workitemupdatedtaskinputstateevent"></a>`stateEvent` | [`WorkItemStateEvent`](#workitemstateevent) | Close or reopen a work item. |
| <a id="workitemupdatedtaskinputtitle"></a>`title` | [`String`](#string) | Title of the work item. |
+| <a id="workitemupdatedtaskinputweightwidget"></a>`weightWidget` | [`WorkItemWidgetWeightInput`](#workitemwidgetweightinput) | Input for weight widget. |
### `WorkItemWidgetDescriptionInput`
@@ -21856,3 +22174,28 @@ A time-frame defined as a closed inclusive range of two dates.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="workitemwidgetdescriptioninputdescription"></a>`description` | [`String!`](#string) | Description of the work item. |
+
+### `WorkItemWidgetHierarchyCreateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitemwidgethierarchycreateinputparentid"></a>`parentId` | [`WorkItemID`](#workitemid) | Global ID of the parent work item. |
+
+### `WorkItemWidgetHierarchyUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitemwidgethierarchyupdateinputchildrenids"></a>`childrenIds` | [`[WorkItemID!]`](#workitemid) | Global IDs of children work items. |
+| <a id="workitemwidgethierarchyupdateinputparentid"></a>`parentId` | [`WorkItemID`](#workitemid) | Global ID of the parent work item. Use `null` to remove the association. |
+
+### `WorkItemWidgetWeightInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitemwidgetweightinputweight"></a>`weight` | [`Int!`](#int) | Weight of the work item. |
diff --git a/doc/api/groups.md b/doc/api/groups.md
index 8372d6deddd..c51f23decb9 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -823,7 +823,7 @@ Parameters:
| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#create-a-subgroup). Can be `owner` (Owners), or `maintainer` (users with the Maintainer role). |
| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
| `visibility` | string | no | The group's visibility. Can be `private`, `internal`, or `public`. |
-| `membership_lock` **(PREMIUM)** | boolean | no | Prevent adding new members to projects within this group. |
+| `membership_lock` **(PREMIUM)** | boolean | no | Users cannot be added to projects in this group. |
| `extra_shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
| `shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
@@ -930,7 +930,7 @@ PUT /groups/:id
| `visibility` | string | no | The visibility level of the group. Can be `private`, `internal`, or `public`. |
| `extra_shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
| `file_template_project_id` **(PREMIUM)** | integer | no | The ID of a project to load custom file templates from. |
-| `membership_lock` **(PREMIUM)** | boolean | no | Prevent adding new members to projects within this group. |
+| `membership_lock` **(PREMIUM)** | boolean | no | Users cannot be added to projects in this group. |
| `prevent_forking_outside_group` **(PREMIUM)** | boolean | no | When enabled, users can **not** fork projects from this group to external namespaces. |
| `shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
diff --git a/doc/api/index.md b/doc/api/index.md
index c29e43d3f8e..26447a2223d 100644
--- a/doc/api/index.md
+++ b/doc/api/index.md
@@ -441,7 +441,7 @@ GitLab also returns the following additional pagination headers:
| `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-prev-page` | The index of the previous page. |
| `x-total` | The total number of items. |
| `x-total-pages` | The total number of pages. |
@@ -453,12 +453,14 @@ 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:
+This method is controlled by the following parameters. `order_by` and `sort` are both mandatory.
-| Parameter | Description |
-|--------------| ------------|
-| `pagination` | `keyset` (to enable keyset pagination). |
-| `per_page` | Number of items to list per page (default: `20`, max: `100`). |
+| Parameter | Required | Description |
+|--------------| ------------ | --------- |
+| `pagination` | yes | `keyset` (to enable keyset pagination). |
+| `per_page` | no | Number of items to list per page (default: `20`, max: `100`). |
+| `order_by` | yes | Column by which to order by. |
+| `sort` | yes | Sort order (`asc` or `desc`) |
In the following example, we list 50 [projects](projects.md) per page, ordered
by `id` ascending.
@@ -520,10 +522,20 @@ pagination headers.
Keyset-based pagination is supported only for selected resources and ordering
options:
-| Resource | Options | Availability |
-|:-------------------------|:---------------------------------|:----------------------------------------|
-| [Projects](projects.md) | `order_by=id` only | Authenticated and unauthenticated users |
-| [Groups](groups.md) | `order_by=name`, `sort=asc` only | Unauthenticated users only |
+| Resource | Options | Availability |
+|:---------------------------------------------------------|:---------------------------------|:------------------------------------------------------------------------------------------------------------|
+| [Projects](projects.md) | `order_by=id` only | Authenticated and unauthenticated users |
+| [Groups](groups.md) | `order_by=name`, `sort=asc` only | Unauthenticated users only |
+| [Group audit events](audit_events.md#group-audit-events) | `order_by=id`, `sort=desc` only | Authenticated users only ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333968) in GitLab 15.2 |
+
+### Pagination response headers
+
+For performance reasons, if a query returns more than 10,000 records, GitLab
+doesn't return the following headers:
+
+- `x-total`.
+- `x-total-pages`.
+- `rel="last"` `link`
## Path parameters
diff --git a/doc/api/integrations.md b/doc/api/integrations.md
index eaa826b3686..fca1d02161b 100644
--- a/doc/api/integrations.md
+++ b/doc/api/integrations.md
@@ -1033,7 +1033,6 @@ Parameters:
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `recipients` | string | yes | Comma-separated list of recipient email addresses |
-| `add_pusher` | boolean | no | Add pusher to recipients list |
| `notify_only_broken_pipelines` | boolean | no | Notify only broken pipelines |
| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected. The default value is "default" |
| `notify_only_default_branch` | boolean | no | Send notifications only for the default branch ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/28271)) |
diff --git a/doc/api/invitations.md b/doc/api/invitations.md
index 5a39a86d039..96c820536de 100644
--- a/doc/api/invitations.md
+++ b/doc/api/invitations.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Expansion
+group: Acquisition
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
---
@@ -20,7 +20,7 @@ levels are defined in the `Gitlab::Access` module. Currently, these levels are v
- Reporter (`20`)
- Developer (`30`)
- Maintainer (`40`)
-- Owner (`50`) - Only valid to set for groups
+- Owner (`50`). Valid for projects in [GitLab 14.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/21432).
NOTE:
From [GitLab 14.9](https://gitlab.com/gitlab-org/gitlab/-/issues/351211) and later, projects have a maximum role of Owner.
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index 85cdf7d892a..b23c33ddc0d 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -692,7 +692,7 @@ Example of response
"finished_at": null,
"duration": 8,
"queued_duration": 0.010,
- "id": 42,
+ "id": 1,
"name": "rubocop",
"ref": "main",
"artifacts": [],
@@ -742,7 +742,7 @@ Example of response
"finished_at": null,
"duration": null,
"queued_duration": 0.010,
- "id": 42,
+ "id": 1,
"name": "rubocop",
"ref": "main",
"artifacts": [],
@@ -792,7 +792,7 @@ Example of response
"coverage": null,
"allow_failure": false,
"download_url": null,
- "id": 42,
+ "id": 1,
"name": "rubocop",
"ref": "main",
"artifacts": [],
@@ -873,7 +873,7 @@ Example response:
"finished_at": null,
"duration": null,
"queued_duration": 0.010,
- "id": 42,
+ "id": 1,
"name": "rubocop",
"ref": "main",
"artifacts": [],
diff --git a/doc/api/members.md b/doc/api/members.md
index 5002e1003e3..a9817918d0b 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -18,7 +18,7 @@ The access levels are defined in the `Gitlab::Access` module. Currently, these l
- Reporter (`20`)
- Developer (`30`)
- Maintainer (`40`)
-- Owner (`50`) - Only valid to set for groups
+- Owner (`50`). Valid for projects in [GitLab 14.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/21432).
NOTE:
In [GitLab 14.9](https://gitlab.com/gitlab-org/gitlab/-/issues/351211) and later, projects in personal namespaces have an `access_level` of `50`(Owner).
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index eb4b7a3dd7e..c6714459643 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -450,6 +450,7 @@ Parameters:
| `assignee_id` | integer | no | Returns merge requests assigned to the given user `id`. `None` returns unassigned merge requests. `Any` returns merge requests with an assignee. |
| `approver_ids` **(PREMIUM)** | integer array | no | Returns merge requests which have specified all the users with the given `id`s as individual approvers. `None` returns merge requests without approvers. `Any` returns merge requests with an approver. |
| `approved_by_ids` **(PREMIUM)** | integer array | no | Returns merge requests which have been approved by all the users with the given `id`s (Max: 5). `None` returns merge requests with no approvals. `Any` returns merge requests with an approval. |
+| `approved_by_usernames` **(PREMIUM)** | string array | no | Returns merge requests which have been approved by all the users with the given `username`s (Max: 5). `None` returns merge requests with no approvals. `Any` returns merge requests with an approval. |
| `reviewer_id` | integer | no | Returns merge requests which have the user as a [reviewer](../user/project/merge_requests/getting_started.md#reviewer) with the given user `id`. `None` returns merge requests with no reviewers. `Any` returns merge requests with any reviewer. Mutually exclusive with `reviewer_username`. |
| `reviewer_username` | string | no | Returns merge requests which have the user as a [reviewer](../user/project/merge_requests/getting_started.md#reviewer) with the given `username`. `None` returns merge requests with no reviewers. `Any` returns merge requests with any reviewer. Mutually exclusive with `reviewer_id`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8. |
| `my_reaction_emoji` | string | no | Return merge requests reacted by the authenticated user by the given `emoji`. `None` returns issues not given a reaction. `Any` returns issues given at least one reaction. |
@@ -785,6 +786,8 @@ the `approvals_before_merge` parameter:
field `merge_user` can be either user who merged this merge request,
user who set it to merge when pipeline succeeds or `null`.
Field `merged_by` (user who merged this merge request or `null`) has been deprecated.
+- `pipeline` is an old parameter and should not be used. Use `head_pipeline` instead,
+ as it is faster and returns more information.
## Get single MR participants
diff --git a/doc/api/metadata.md b/doc/api/metadata.md
new file mode 100644
index 00000000000..70c29ef5748
--- /dev/null
+++ b/doc/api/metadata.md
@@ -0,0 +1,46 @@
+---
+stage: Ecosystem
+group: Integrations
+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
+---
+
+# Metadata API **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357032) in GitLab 15.2.
+
+Retrieve metadata information for this GitLab instance.
+
+```plaintext
+GET /metadata
+```
+
+Response body attributes:
+
+| Attribute | Type | Description |
+|:------------------|:---------------|:-----------------------------------------------------------------------------------------|
+| `version` | string | Version of the GitLab instance. |
+| `revision` | string | Revision of the GitLab instance. |
+| `kas` | object | Metadata about the GitLab agent server for Kubernetes (KAS). |
+| `kas.enabled` | boolean | Indicates whether KAS is enabled. |
+| `kas.externalUrl` | string or null | URL used by the agents to communicate with KAS. It's `null` if `kas.enabled` is `false`. |
+| `kas.version` | string or null | Version of KAS. It's `null` if `kas.enabled` is `false`. |
+
+Example request:
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/metadata"
+```
+
+Example response:
+
+```json
+{
+ "version": "15.2-pre",
+ "revision": "c401a659d0c",
+ "kas": {
+ "enabled": true,
+ "externalUrl": "grpc://gitlab.example.com:8150",
+ "version": "15.0.0"
+ }
+}
+```
diff --git a/doc/api/metrics_user_starred_dashboards.md b/doc/api/metrics_user_starred_dashboards.md
index 3e54ec74b24..4f5fe1c909a 100644
--- a/doc/api/metrics_user_starred_dashboards.md
+++ b/doc/api/metrics_user_starred_dashboards.md
@@ -12,7 +12,7 @@ by displaying favorited dashboards at the top of the select list.
## Add a star to a dashboard
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31316) in GitLab 13.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31316) in GitLab 13.0.
```plaintext
POST /projects/:id/metrics/user_starred_dashboards
diff --git a/doc/api/notes.md b/doc/api/notes.md
index fbcf5e28f79..f7caae59b4d 100644
--- a/doc/api/notes.md
+++ b/doc/api/notes.md
@@ -146,7 +146,7 @@ Parameters:
| `issue_iid` | integer | yes | The IID of an issue. |
| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
| `confidential` | boolean | no | The confidential flag of a note. Default is false. |
-| `created_at` | string | no | Date time string, ISO 8601 formatted. Example: `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
+| `created_at` | string | no | Date time string, ISO 8601 formatted. It must be after 1970-01-01. Example: `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/issues/11/notes?body=note"
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index be58d75333d..35c6eb4a982 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -15,16 +15,21 @@ To configure GitLab for this, see
This functionality is based on the [doorkeeper Ruby gem](https://github.com/doorkeeper-gem/doorkeeper).
-## CORS preflight requests
+## Cross-origin resource sharing
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/364680) in GitLab 15.1.
+> CORS preflight request support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/364680) in GitLab 15.1.
-The following endpoints support [CORS preflight requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS):
+Many `/oauth` endpoints support cross-origin resource sharing (CORS). From GitLab 15.1, the following endpoints also
+support [CORS preflight requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS):
- `/oauth/revoke`
- `/oauth/token`
- `/oauth/userinfo`
+In addition to the headers listed for [simple requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests),
+only the `Authorization` header can be used for preflight requests. For example, the `X-Requested-With` header
+can't be used for preflight requests.
+
## Supported OAuth 2.0 flows
GitLab supports the following authorization flows:
diff --git a/doc/api/openapi/openapi.yaml b/doc/api/openapi/openapi.yaml
index cc6a161c783..a3a0485428d 100644
--- a/doc/api/openapi/openapi.yaml
+++ b/doc/api/openapi/openapi.yaml
@@ -1,5 +1,7 @@
openapi: 3.0.0
tags:
+ - name: metadata
+ description: Metadata of the GitLab instance
- name: version
description: Version
- name: access_requests
@@ -39,6 +41,10 @@ components:
name: Private-Token
paths:
+ # METADATA
+ /v4/metadata:
+ $ref: 'v4/metadata.yaml'
+
# VERSION
/v4/version:
$ref: 'v4/version.yaml'
@@ -49,7 +55,7 @@ paths:
/v4/projects/{id}/access_requests/{user_id}/approve:
$ref: 'v4/access_requests.yaml#/accessRequestsProjectsApprove'
-
+
/v4/projects/{id}/access_requests/{user_id}:
$ref: 'v4/access_requests.yaml#/accessRequestsProjectsDeny'
@@ -59,7 +65,7 @@ paths:
/v4/groups/{id}/access_requests/{user_id}/approve:
$ref: 'v4/access_requests.yaml#/accessRequestsGroupsApprove'
-
+
/v4/groups/{id}/access_requests/{user_id}:
$ref: 'v4/access_requests.yaml#/accessRequestsGroupsDeny'
@@ -68,4 +74,4 @@ paths:
$ref: 'v4/access_tokens.yaml#/accessTokens'
/v4/projects/{id}/access_tokens/{token_id}:
- $ref: 'v4/access_tokens.yaml#/accessTokensRevoke' \ No newline at end of file
+ $ref: 'v4/access_tokens.yaml#/accessTokensRevoke'
diff --git a/doc/api/openapi/v4/metadata.yaml b/doc/api/openapi/v4/metadata.yaml
new file mode 100644
index 00000000000..6a5ef9f3355
--- /dev/null
+++ b/doc/api/openapi/v4/metadata.yaml
@@ -0,0 +1,43 @@
+# Markdown documentation: https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/api/metadata.md
+
+get:
+ tags:
+ - metadata
+ summary: "Retrieve metadata information for this GitLab instance."
+ operationId: "getMetadata"
+ responses:
+ "401":
+ description: "unauthorized operation"
+ "200":
+ description: "successful operation"
+ content:
+ "application/json":
+ schema:
+ title: "MetadataResponse"
+ type: "object"
+ properties:
+ version:
+ type: "string"
+ revision:
+ type: "string"
+ kas:
+ type: "object"
+ properties:
+ enabled:
+ type: "boolean"
+ externalUrl:
+ type: "string"
+ nullable: true
+ version:
+ type: "string"
+ nullable: true
+ examples:
+ Example:
+ value:
+ version: "15.0-pre"
+ revision: "c401a659d0c"
+ kas:
+ enabled: true
+ externalUrl: "grpc://gitlab.example.com:8150"
+ version: "15.0.0"
+
diff --git a/doc/api/packages/conan.md b/doc/api/packages/conan.md
index 546a472ea53..1590893d006 100644
--- a/doc/api/packages/conan.md
+++ b/doc/api/packages/conan.md
@@ -19,6 +19,10 @@ NOTE:
These endpoints do not adhere to the standard API authentication methods.
See each route for details on how credentials are expected to be passed.
+NOTE:
+The Conan registry is not FIPS compliant and is disabled when [FIPS mode](../../development/fips_compliance.md) is enabled.
+These endpoints will all return 404 Not Found.
+
## Route prefix
There are two sets of identical routes that each make requests in different scopes:
diff --git a/doc/api/packages/debian.md b/doc/api/packages/debian.md
index 66377850c49..4abb7bc7112 100644
--- a/doc/api/packages/debian.md
+++ b/doc/api/packages/debian.md
@@ -22,6 +22,10 @@ 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:
+The Debian registry is not FIPS compliant and is disabled when [FIPS mode](../../development/fips_compliance.md) is enabled.
+These endpoints will all return `404 Not Found`.
+
+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.
diff --git a/doc/api/packages/debian_group_distributions.md b/doc/api/packages/debian_group_distributions.md
index 0a1b7b4571e..0d0a4cb2cde 100644
--- a/doc/api/packages/debian_group_distributions.md
+++ b/doc/api/packages/debian_group_distributions.md
@@ -18,6 +18,10 @@ This API is under development and is not meant for production use.
For more information about working with Debian packages, see the
[Debian package registry documentation](../../user/packages/debian_repository/index.md).
+NOTE:
+The Debian registry is not FIPS compliant and is disabled when [FIPS mode](../../development/fips_compliance.md) is enabled.
+These endpoints will all return `404 Not Found`.
+
## Enable the Debian group API
Debian group repository support is still a work in progress. It's gated behind a feature flag that's
diff --git a/doc/api/packages/debian_project_distributions.md b/doc/api/packages/debian_project_distributions.md
index 533742642fd..4f3ac62f576 100644
--- a/doc/api/packages/debian_project_distributions.md
+++ b/doc/api/packages/debian_project_distributions.md
@@ -18,6 +18,10 @@ This API is under development and is not meant for production use.
For more information about working with Debian packages, see the
[Debian package registry documentation](../../user/packages/debian_repository/index.md).
+NOTE:
+The Debian registry is not FIPS compliant and is disabled when [FIPS mode](../../development/fips_compliance.md) is enabled.
+These endpoints will all return `404 Not Found`.
+
## Enable the Debian API
The Debian API is behind a feature flag that is disabled by default.
diff --git a/doc/api/packages/pypi.md b/doc/api/packages/pypi.md
index 3e23ded61f4..e6204d87e1f 100644
--- a/doc/api/packages/pypi.md
+++ b/doc/api/packages/pypi.md
@@ -20,6 +20,10 @@ These endpoints do not adhere to the standard API authentication methods.
See the [PyPI package registry documentation](../../user/packages/pypi_repository/index.md)
for details on which headers and token types are supported.
+NOTE:
+[Twine 3.4.2](https://twine.readthedocs.io/en/stable/changelog.html?highlight=FIPS#id28) or greater
+is recommended when [FIPS mode](../../development/fips_compliance.md) is enabled.
+
## Download a package file from a group
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225545) in GitLab 13.12.
diff --git a/doc/api/project_level_variables.md b/doc/api/project_level_variables.md
index 4205e6699fe..81bb4a26614 100644
--- a/doc/api/project_level_variables.md
+++ b/doc/api/project_level_variables.md
@@ -170,5 +170,5 @@ This parameter is used for filtering by attributes, such as `environment_scope`.
Example usage:
```shell
-curl --request DELETE --globoff --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/VARIABLE_1?filter[environment_scope]=production"
+curl --globoff --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/VARIABLE_1?filter[environment_scope]=production"
```
diff --git a/doc/api/project_repository_storage_moves.md b/doc/api/project_repository_storage_moves.md
index ebb15e1c1d6..48c22ff2d93 100644
--- a/doc/api/project_repository_storage_moves.md
+++ b/doc/api/project_repository_storage_moves.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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
---
# Project repository storage moves API **(FREE SELF)**
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 3cb75c39980..8a8fe522b63 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -15,7 +15,7 @@ The visibility level is determined by the `visibility` field in the project.
Values for the project visibility level are:
-- `private`: project access must be granted explicitly for each user.
+- `private`: project access must be granted explicitly to each user.
- `internal`: the project can be cloned by any signed-in user except [external users](../user/permissions.md#external-users).
- `public`: the project can be accessed without any authentication.
@@ -28,11 +28,10 @@ There are three options for `merge_method` to choose from:
- `merge`: a merge commit is created for every merge, and merging is allowed if
there are no conflicts.
- `rebase_merge`: a merge commit is created for every merge, but merging is only
- allowed if fast-forward merge is possible. This way you could make sure that
- if this merge request would build, after merging to target branch it would
- also build.
-- `ff`: no merge commits are created and all merges are fast-forwarded, which
- means that merging is only allowed if the branch could be fast-forwarded.
+ allowed if fast-forward merge is possible. You can make sure that the target
+ branch would build after this merge request builds and merges.
+- `ff`: no merge commits are created and all merges are fast-forwarded. Merging
+ is only allowed if the branch could be fast-forwarded.
## List all projects
@@ -68,6 +67,7 @@ GET /projects
| `starred` | boolean | **{dotted-circle}** No | Limit by projects starred by the current user. |
| `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. |
+| `topic_id` | integer | **{dotted-circle}** No | Limit results to projects with the assigned topic given by the topic ID. |
| `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. |
| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(administrator only)_ |
@@ -80,17 +80,26 @@ for selected `order_by` options.
When `simple=true` or the user is unauthenticated this returns something like:
+Example request:
+
+```shell
+curl --request GET "https://gitlab.example.com/api/v4/projects"
+```
+
+Example response:
+
```json
[
{
"id": 4,
"description": null,
- "default_branch": "master",
- "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
- "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
- "web_url": "http://example.com/diaspora/diaspora-client",
- "readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",
- "tag_list": [ //deprecated, use `topics` instead
+ "name": "Diaspora Client",
+ "name_with_namespace": "Diaspora / Diaspora Client",
+ "path": "diaspora-client",
+ "path_with_namespace": "diaspora/diaspora-client",
+ "created_at": "2013-09-30T13:46:02Z",
+ "default_branch": "main",
+ "tag_list": [
"example",
"disapora client"
],
@@ -98,21 +107,28 @@ When `simple=true` or the user is unauthenticated this returns something like:
"example",
"disapora client"
],
- "name": "Diaspora Client",
- "name_with_namespace": "Diaspora / Diaspora Client",
- "path": "diaspora-client",
- "path_with_namespace": "diaspora/diaspora-client",
- "created_at": "2013-09-30T13:46:02Z",
- "last_activity_at": "2013-09-30T13:46:02Z",
+ "ssh_url_to_repo": "git@gitlab.example.com:diaspora/diaspora-client.git",
+ "http_url_to_repo": "https://gitlab.example.com/diaspora/diaspora-client.git",
+ "web_url": "https://gitlab.example.com/diaspora/diaspora-client",
+ "readme_url": "https://gitlab.example.com/diaspora/diaspora-client/blob/master/README.md",
+ "avatar_url": "https://gitlab.example.com/uploads/project/avatar/4/uploads/avatar.png",
"forks_count": 0,
- "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",
- "star_count": 0
+ "star_count": 0,
+ "last_activity_at": "2013-09-30T13:46:02Z",
+ "namespace": {
+ "id": 2,
+ "name": "Diaspora",
+ "path": "diaspora",
+ "kind": "group",
+ "full_path": "diaspora",
+ "parent_id": null,
+ "avatar_url": null,
+ "web_url": "https://gitlab.example.com/diaspora"
+ }
},
{
- "id": 6,
- "description": null,
- "default_branch": "master",
-...
+ ...
+ }
```
When the user is authenticated and `simple` is not set this returns something like:
@@ -122,12 +138,12 @@ When the user is authenticated and `simple` is not set this returns something li
{
"id": 4,
"description": null,
- "default_branch": "master",
- "visibility": "private",
- "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
- "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
- "web_url": "http://example.com/diaspora/diaspora-client",
- "readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",
+ "name": "Diaspora Client",
+ "name_with_namespace": "Diaspora / Diaspora Client",
+ "path": "diaspora-client",
+ "path_with_namespace": "diaspora/diaspora-client",
+ "created_at": "2013-09-30T13:46:02Z",
+ "default_branch": "main",
"tag_list": [ //deprecated, use `topics` instead
"example",
"disapora client"
@@ -136,202 +152,115 @@ When the user is authenticated and `simple` is not set this returns something li
"example",
"disapora client"
],
- "owner": {
- "id": 3,
- "name": "Diaspora",
- "created_at": "2013-09-30T13:46:02Z"
- },
- "name": "Diaspora Client",
- "name_with_namespace": "Diaspora / Diaspora Client",
- "path": "diaspora-client",
- "path_with_namespace": "diaspora/diaspora-client",
- "issues_enabled": true,
- "open_issues_count": 1,
- "merge_requests_enabled": true,
- "jobs_enabled": true,
- "wiki_enabled": true,
- "snippets_enabled": false,
- "can_create_merge_request_in": true,
- "resolve_outdated_diff_discussions": false,
- "container_registry_enabled": false, // deprecated, use container_registry_access_level instead
- "container_registry_access_level": "disabled",
- "security_and_compliance_access_level": "disabled",
- "created_at": "2013-09-30T13:46:02Z",
- "last_activity_at": "2013-09-30T13:46:02Z",
- "creator_id": 3,
+ "ssh_url_to_repo": "git@gitlab.example.com:diaspora/diaspora-client.git",
+ "http_url_to_repo": "https://gitlab.example.com/diaspora/diaspora-client.git",
+ "web_url": "https://gitlab.example.com/diaspora/diaspora-client",
+ "readme_url": "https://gitlab.example.com/diaspora/diaspora-client/blob/master/README.md",
+ "avatar_url": "https://gitlab.example.com/uploads/project/avatar/4/uploads/avatar.png",
+ "forks_count": 0,
+ "star_count": 0,
+ "last_activity_at": "2022-06-24T17:11:26.841Z",
"namespace": {
"id": 3,
"name": "Diaspora",
"path": "diaspora",
"kind": "group",
- "full_path": "diaspora"
- },
- "import_status": "none",
- "archived": false,
- "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",
- "shared_runners_enabled": true,
- "forks_count": 0,
- "star_count": 0,
- "runners_token": "b8547b1dc37721d05889db52fa2f02",
- "ci_default_git_depth": 50,
- "ci_forward_deployment_enabled": true,
- "public_jobs": true,
- "shared_with_groups": [],
- "only_allow_merge_if_pipeline_succeeds": false,
- "allow_merge_on_skipped_pipeline": false,
- "restrict_user_defined_variables": false,
- "only_allow_merge_if_all_discussions_are_resolved": false,
- "remove_source_branch_after_merge": false,
- "request_access_enabled": false,
- "merge_method": "merge",
- "squash_option": "default_on",
- "autoclose_referenced_issues": true,
- "suggestion_commit_message": null,
- "merge_commit_template": null,
- "squash_commit_template": null,
- "marked_for_deletion_at": "2020-04-03", // Deprecated and will be removed in API v5 in favor of marked_for_deletion_on
- "marked_for_deletion_on": "2020-04-03",
- "statistics": {
- "commit_count": 37,
- "storage_size": 1038090,
- "repository_size": 1038090,
- "wiki_size" : 0,
- "lfs_objects_size": 0,
- "job_artifacts_size": 0,
- "pipeline_artifacts_size": 0,
- "packages_size": 0,
- "snippets_size": 0,
- "uploads_size": 0
+ "full_path": "diaspora",
+ "parent_id": null,
+ "avatar_url": "https://gitlab.example.com/uploads/project/avatar/6/uploads/avatar.png",
+ "web_url": "https://gitlab.example.com/diaspora"
},
- "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
+ "container_registry_image_prefix": "registry.gitlab.example.com/diaspora/diaspora-client",
"_links": {
- "self": "http://example.com/api/v4/projects",
- "issues": "http://example.com/api/v4/projects/1/issues",
- "merge_requests": "http://example.com/api/v4/projects/1/merge_requests",
- "repo_branches": "http://example.com/api/v4/projects/1/repository_branches",
- "labels": "http://example.com/api/v4/projects/1/labels",
- "events": "http://example.com/api/v4/projects/1/events",
- "members": "http://example.com/api/v4/projects/1/members",
- "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
- }
- },
- {
- "id": 6,
- "description": null,
- "default_branch": "master",
- "visibility": "private",
- "ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
- "http_url_to_repo": "http://example.com/brightbox/puppet.git",
- "web_url": "http://example.com/brightbox/puppet",
- "readme_url": "http://example.com/brightbox/puppet/blob/master/README.md",
- "tag_list": [ //deprecated, use `topics` instead
- "example",
- "puppet"
- ],
- "topics": [
- "example",
- "puppet"
- ],
- "owner": {
- "id": 4,
- "name": "Brightbox",
- "created_at": "2013-09-30T13:46:02Z"
+ "self": "https://gitlab.example.com/api/v4/projects/4",
+ "issues": "https://gitlab.example.com/api/v4/projects/4/issues",
+ "merge_requests": "https://gitlab.example.com/api/v4/projects/4/merge_requests",
+ "repo_branches": "https://gitlab.example.com/api/v4/projects/4/repository/branches",
+ "labels": "https://gitlab.example.com/api/v4/projects/4/labels",
+ "events": "https://gitlab.example.com/api/v4/projects/4/events",
+ "members": "https://gitlab.example.com/api/v4/projects/4/members",
+ "cluster_agents": "https://gitlab.example.com/api/v4/projects/4/cluster_agents"
+ },
+ "packages_enabled": true,
+ "empty_repo": false,
+ "archived": false,
+ "visibility": "public",
+ "resolve_outdated_diff_discussions": false,
+ "container_expiration_policy": {
+ "cadence": "1month",
+ "enabled": true,
+ "keep_n": 1,
+ "older_than": "14d",
+ "name_regex": "",
+ "name_regex_keep": ".*-main",
+ "next_run_at": "2022-06-25T17:11:26.865Z"
},
- "name": "Puppet",
- "name_with_namespace": "Brightbox / Puppet",
- "path": "puppet",
- "path_with_namespace": "brightbox/puppet",
"issues_enabled": true,
- "open_issues_count": 1,
"merge_requests_enabled": true,
- "jobs_enabled": true,
"wiki_enabled": true,
- "snippets_enabled": false,
+ "jobs_enabled": true,
+ "snippets_enabled": true,
+ "container_registry_enabled": true,
+ "service_desk_enabled": true,
"can_create_merge_request_in": true,
- "resolve_outdated_diff_discussions": false,
- "container_registry_enabled": false, // deprecated, use container_registry_access_level instead
- "container_registry_access_level": "disabled",
- "security_and_compliance_access_level": "disabled",
- "created_at": "2013-09-30T13:46:02Z",
- "last_activity_at": "2013-09-30T13:46:02Z",
- "creator_id": 3,
- "namespace": {
- "id": 4,
- "name": "Brightbox",
- "path": "brightbox",
- "kind": "group",
- "full_path": "brightbox"
- },
- "import_status": "none",
- "import_error": null,
- "permissions": {
- "project_access": {
- "access_level": 10,
- "notification_level": 3
- },
- "group_access": {
- "access_level": 50,
- "notification_level": 3
- }
- },
- "archived": false,
- "avatar_url": null,
+ "issues_access_level": "enabled",
+ "repository_access_level": "enabled",
+ "merge_requests_access_level": "enabled",
+ "forking_access_level": "enabled",
+ "wiki_access_level": "enabled",
+ "builds_access_level": "enabled",
+ "snippets_access_level": "enabled",
+ "pages_access_level": "enabled",
+ "operations_access_level": "enabled",
+ "analytics_access_level": "enabled",
+ "container_registry_access_level": "enabled",
+ "security_and_compliance_access_level": "private",
+ "emails_disabled": null,
"shared_runners_enabled": true,
- "forks_count": 0,
- "star_count": 0,
- "runners_token": "b8547b1dc37721d05889db52fa2f02",
- "ci_default_git_depth": 0,
+ "lfs_enabled": true,
+ "creator_id": 1,
+ "import_status": "none",
+ "open_issues_count": 0,
+ "ci_default_git_depth": 20,
"ci_forward_deployment_enabled": true,
+ "ci_job_token_scope_enabled": false,
+ "ci_separated_caches": true,
"public_jobs": true,
+ "build_timeout": 3600,
+ "auto_cancel_pending_pipelines": "enabled",
+ "build_coverage_regex": null,
+ "ci_config_path": "",
"shared_with_groups": [],
"only_allow_merge_if_pipeline_succeeds": false,
- "allow_merge_on_skipped_pipeline": false,
+ "allow_merge_on_skipped_pipeline": null,
"restrict_user_defined_variables": false,
+ "request_access_enabled": true,
"only_allow_merge_if_all_discussions_are_resolved": false,
- "remove_source_branch_after_merge": false,
- "request_access_enabled": false,
+ "remove_source_branch_after_merge": true,
+ "printing_merge_request_link_enabled": true,
"merge_method": "merge",
- "squash_option": "default_on",
- "auto_devops_enabled": true,
- "auto_devops_deploy_strategy": "continuous",
- "repository_storage": "default",
- "approvals_before_merge": 0,
- "mirror": false,
- "mirror_user_id": 45,
- "mirror_trigger_builds": false,
- "only_mirror_protected_branches": false,
- "mirror_overwrites_diverged_branches": false,
- "external_authorization_classification_label": null,
- "packages_enabled": true,
- "service_desk_enabled": false,
- "service_desk_address": null,
- "autoclose_referenced_issues": true,
+ "squash_option": "default_off",
+ "enforce_auth_checks_on_uploads": true,
"suggestion_commit_message": null,
"merge_commit_template": null,
"squash_commit_template": null,
- "statistics": {
- "commit_count": 12,
- "storage_size": 2066080,
- "repository_size": 2066080,
- "wiki_size" : 0,
- "lfs_objects_size": 0,
- "job_artifacts_size": 0,
- "pipeline_artifacts_size": 0,
- "packages_size": 0,
- "snippets_size": 0,
- "uploads_size": 0
- },
- "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
- "_links": {
- "self": "http://example.com/api/v4/projects",
- "issues": "http://example.com/api/v4/projects/1/issues",
- "merge_requests": "http://example.com/api/v4/projects/1/merge_requests",
- "repo_branches": "http://example.com/api/v4/projects/1/repository_branches",
- "labels": "http://example.com/api/v4/projects/1/labels",
- "events": "http://example.com/api/v4/projects/1/events",
- "members": "http://example.com/api/v4/projects/1/members",
- "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
+ "auto_devops_enabled": false,
+ "auto_devops_deploy_strategy": "continuous",
+ "autoclose_referenced_issues": true,
+ "keep_latest_artifact": true,
+ "runner_token_expiration_interval": null,
+ "external_authorization_classification_label": "",
+ "requirements_enabled": false,
+ "requirements_access_level": "enabled",
+ "security_and_compliance_enabled": false,
+ "compliance_frameworks": [],
+ "permissions": {
+ "project_access": null,
+ "group_access": null
}
+ },
+ {
+ ...
}
]
```
@@ -365,6 +294,12 @@ You can filter by [custom attributes](custom_attributes.md) with:
GET /projects?custom_attributes[key]=value&custom_attributes[other_key]=other_value
```
+Example request:
+
+```shell
+curl --globoff --request GET "https://gitlab.example.com/api/v4/projects?custom_attributes[location]=Antarctica&custom_attributes[role]=Developer"
+```
+
### Pagination limits
In GitLab 13.0 and later, [offset-based pagination](index.md#offset-based-pagination)
@@ -470,6 +405,7 @@ GET /users/:user_id/projects
"runners_token": "b8547b1dc37721d05889db52fa2f02",
"ci_default_git_depth": 50,
"ci_forward_deployment_enabled": true,
+ "ci_separated_caches": true,
"public_jobs": true,
"shared_with_groups": [],
"only_allow_merge_if_pipeline_succeeds": false,
@@ -577,6 +513,7 @@ GET /users/:user_id/projects
"runners_token": "b8547b1dc37721d05889db52fa2f02",
"ci_default_git_depth": 0,
"ci_forward_deployment_enabled": true,
+ "ci_separated_caches": true,
"public_jobs": true,
"shared_with_groups": [],
"only_allow_merge_if_pipeline_succeeds": false,
@@ -983,6 +920,7 @@ GET /projects/:id
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
"ci_default_git_depth": 50,
"ci_forward_deployment_enabled": true,
+ "ci_separated_caches": true,
"public_jobs": true,
"shared_with_groups": [
{
@@ -1422,6 +1360,7 @@ Supported attributes:
| `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#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 |
+| `ci_separated_caches` | boolean | **{dotted-circle}** No | Set whether or not caches should be [separated](../ci/caching/index.md#cache-key-names) by branch protection status. |
| `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_access_level` | string | **{dotted-circle}** No | Set visibility of container registry, for this project, to one of `disabled`, `private` or `enabled`. |
| `container_registry_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable container registry for this project. Use `container_registry_access_level` instead. |
@@ -1997,6 +1936,7 @@ Example response:
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
"ci_default_git_depth": 50,
"ci_forward_deployment_enabled": true,
+ "ci_separated_caches": true,
"public_jobs": true,
"shared_with_groups": [],
"only_allow_merge_if_pipeline_succeeds": false,
@@ -2122,6 +2062,7 @@ Example response:
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
"ci_default_git_depth": 50,
"ci_forward_deployment_enabled": true,
+ "ci_separated_caches": true,
"public_jobs": true,
"shared_with_groups": [],
"only_allow_merge_if_pipeline_succeeds": false,
@@ -2637,7 +2578,7 @@ PUT /projects/:id/push_rule
### Delete project push rule
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
Removes a push rule from a project. This is an idempotent method and can be
called multiple times. Either the push rule is available or not.
@@ -2654,7 +2595,7 @@ DELETE /projects/:id/push_rule
> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
-See the [Project documentation](../user/project/settings/index.md#transferring-an-existing-project-into-another-namespace)
+See the [Project documentation](../user/project/settings/index.md#transfer-a-project-to-another-namespace)
for prerequisites to transfer a project.
```plaintext
@@ -2820,7 +2761,7 @@ with the API scope enabled.
## Start the pull mirroring process for a Project **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
```plaintext
POST /projects/:id/mirror/pull
diff --git a/doc/api/protected_tags.md b/doc/api/protected_tags.md
index e2b27692373..b2ab3227a7e 100644
--- a/doc/api/protected_tags.md
+++ b/doc/api/protected_tags.md
@@ -100,6 +100,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
| `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) |
+| `allowed_to_create` | array | no | Array of access levels allowed to create tags, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}` |
Example response:
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index 1a1eee175f7..34b86902271 100644
--- a/doc/api/repositories.md
+++ b/doc/api/repositories.md
@@ -319,6 +319,7 @@ Supported attributes:
| `date` | datetime | no | The date and time of the release, defaults to the current time. |
| `branch` | string | no | The branch to commit the changelog changes to, defaults to the project's default branch. |
| `trailer` | string | no | The Git trailer to use for including commits, defaults to `Changelog`. |
+| `config_file` | string | no | The path of changelog configuration file in the project's Git repository, defaults to `.gitlab/changelog_config.yml`. |
| `file` | string | no | The file to commit the changes to, defaults to `CHANGELOG.md`. |
| `message` | string | no | The commit message to produce when committing the changes, defaults to `Add changelog for version X` where X is the value of the `version` argument. |
@@ -453,7 +454,7 @@ If a revert commit includes the trailer used for generating changelogs
### Customize the changelog output
The output is customized using a YAML configuration file stored in your
-project's Git repository. This file must reside in
+project's Git repository. This default configuration file path is
`.gitlab/changelog_config.yml`.
You can set the following variables in this file:
@@ -736,6 +737,7 @@ Supported attributes:
| `to` | string | no | The end of the range of commits (as a SHA) to use for the changelog. This commit _is_ included in the list. Defaults to the branch specified in the `branch` attribute. |
| `date` | datetime | no | The date and time of the release, ISO 8601 formatted. Example: `2016-03-11T03:45:40Z`. Defaults to the current time. |
| `trailer` | string | no | The Git trailer to use for including commits, defaults to `Changelog`. |
+| `config_file` | string | no | The path of changelog configuration file in the project's Git repository, defaults to `.gitlab/changelog_config.yml`. |
```shell
curl --header "PRIVATE-TOKEN: token" "https://gitlab.com/api/v4/projects/42/repository/changelog?version=1.0.0"
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 805797792de..28a33e4deb4 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -175,6 +175,7 @@ Example response:
"container_registry_expiration_policies_caching": true,
"container_registry_expiration_policies_worker_capacity": 4,
"container_registry_token_expire_delay": 5,
+ "package_registry_cleanup_policies_worker_capacity": 2,
"repository_storages": ["default"],
"plantuml_enabled": false,
"plantuml_url": null,
@@ -271,6 +272,7 @@ listed in the descriptions of the relevant settings.
| `container_registry_expiration_policies_caching` | boolean | no | Caching during the execution of [cleanup policies](../user/packages/container_registry/reduce_container_registry_storage.md#set-cleanup-limits-to-conserve-resources). |
| `container_registry_expiration_policies_worker_capacity` | integer | no | Number of workers for [cleanup policies](../user/packages/container_registry/reduce_container_registry_storage.md#set-cleanup-limits-to-conserve-resources). |
| `container_registry_token_expire_delay` | integer | no | Container Registry token duration in minutes. |
+| `package_registry_cleanup_policies_worker_capacity` | integer | no | Number of workers assigned to the packages cleanup policies. |
| `deactivate_dormant_users` | boolean | no | Enable [automatic deactivation of dormant users](../user/admin_area/moderate_users.md#automatically-deactivate-dormant-users). |
| `default_artifacts_expire_in` | string | no | Set the default expiration time for each job's artifacts. |
| `default_branch_name` | string | no | [Instance-level custom initial branch name](../user/project/repository/branches/default.md#instance-level-custom-initial-branch-name) ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225258) in GitLab 13.2). |
@@ -379,6 +381,9 @@ listed in the descriptions of the relevant settings.
| `max_personal_access_token_lifetime` **(ULTIMATE SELF)** | integer | no | Maximum allowable lifetime for access tokens in days. |
| `max_ssh_key_lifetime` **(ULTIMATE SELF)** | integer | no | Maximum allowable lifetime for SSH keys in days. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1007) in GitLab 14.6. |
| `metrics_method_call_threshold` | integer | no | A method call is only tracked when it takes longer than the given amount of milliseconds. |
+| `max_number_of_repository_downloads` **(ULTIMATE SELF)** | integer | no | Maximum number of unique repositories a user can download in the specified time period before they are banned. Default: 0, Maximum: 10,000 repositories. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980) in GitLab 15.1. |
+| `max_number_of_repository_downloads_within_time_period` **(ULTIMATE SELF)** | integer | no | Reporting time period (in seconds). Default: 0, Maximum: 864000 seconds (10 days). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980) in GitLab 15.1. |
+| `git_rate_limit_users_allowlist` **(ULTIMATE SELF)** | array of strings | no | List of usernames excluded from Git anti-abuse rate limits. Default: `[]`, Maximum: 100 usernames. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90815) in GitLab 15.2. |
| `mirror_available` | boolean | no | Allow repository mirroring to configured by project Maintainers. If disabled, only Administrators can configure repository mirroring. |
| `mirror_capacity_threshold` **(PREMIUM)** | integer | no | Minimum capacity to be available before scheduling more mirrors preemptively. |
| `mirror_max_capacity` **(PREMIUM)** | integer | no | Maximum number of mirrors that can be synchronizing at the same time. |
diff --git a/doc/api/snippets.md b/doc/api/snippets.md
index 52bcd072de9..e3bc3573ed7 100644
--- a/doc/api/snippets.md
+++ b/doc/api/snippets.md
@@ -31,6 +31,15 @@ Get a list of the current user's snippets.
GET /snippets
```
+Parameters:
+
+| Attribute | Type | Required | Description |
+|------------------|----------|----------|-----------------------------------------------------------------------------------------------------|
+| `per_page` | integer | no | Number of snippets to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `created_after` | datetime | no | Return snippets created after the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
+| `created_before` | datetime | no | Return snippets created before the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
+
Example request:
```shell
@@ -389,10 +398,12 @@ GET /snippets/public
Parameters:
-| Attribute | Type | Required | Description |
-|:-----------|:--------|:---------|:---------------------------------------|
-| `per_page` | integer | no | Number of snippets to return per page. |
-| `page` | integer | no | Page to retrieve. |
+| Attribute | Type | Required | Description |
+|------------------|----------|----------|-----------------------------------------------------------------------------------------------------|
+| `per_page` | integer | no | Number of snippets to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `created_after` | datetime | no | Return snippets created after the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
+| `created_before` | datetime | no | Return snippets created before the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
Example request:
diff --git a/doc/api/usage_data.md b/doc/api/usage_data.md
index be816a0f864..a01ed3e83a5 100644
--- a/doc/api/usage_data.md
+++ b/doc/api/usage_data.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
type: reference, api
@@ -34,7 +34,7 @@ Example response:
by month
product_section: enablement
product_stage: enablement
- product_group: group::global search
+ product_group: global_search
product_category: global_search
value_type: number
status: active
@@ -79,6 +79,7 @@ Example response:
"active_user_count": "SELECT COUNT(\"users\".\"id\") FROM \"users\" WHERE (\"users\".\"state\" IN ('active')) AND (\"users\".\"user_type\" IS NULL OR \"users\".\"user_type\" IN (NULL, 6, 4))",
"edition": "EE",
"license_md5": "c701acc03844c45366dd175ef7a4e19c",
+ "license_sha256": "366dd175ef7a4e19cc701acc03844c45366dd175ef7a4e19cc701acc03844c45",
"license_id": null,
"historical_max_users": 0,
"licensee": {
@@ -138,6 +139,7 @@ Sample response:
"active_user_count": -3,
"edition": "EE",
"license_md5": "bb8cd0d8a6d9569ff3f70b8927a1f949",
+ "license_sha256": "366dd175ef7a4e19cc701acc03844c45366dd175ef7a4e19cc701acc03844c45",
"license_id": null,
"historical_max_users": 0,
"licensee": {
diff --git a/doc/api/users.md b/doc/api/users.md
index 5e41a0f6258..06c0fadbbbf 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -57,8 +57,7 @@ NOTE:
Username search is case insensitive.
In addition, you can filter users based on the states `blocked` and `active`.
-It does not support `active=false` or `blocked=false`. The list of billable users
-is the total number of users minus the blocked users.
+It does not support `active=false` or `blocked=false`.
```plaintext
GET /users?active=true
@@ -105,7 +104,7 @@ parameter `without_project_bots=true`.
GET /users?without_project_bots=true
```
-### For administrators
+### For administrators **(FREE SELF)**
> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
@@ -284,7 +283,7 @@ Parameters:
| Attribute | Type | Required | Description |
|-----------|---------|----------|------------------|
-| `id` | integer | yes | The ID of a user |
+| `id` | integer | yes | ID of a user |
```json
{
@@ -314,7 +313,7 @@ Parameters:
}
```
-### For administrator
+### For administrators **(FREE SELF)**
> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
@@ -326,7 +325,7 @@ Parameters:
| Attribute | Type | Required | Description |
|-----------|---------|----------|------------------|
-| `id` | integer | yes | The ID of a user |
+| `id` | integer | yes | ID of a user |
Example Responses:
@@ -477,7 +476,7 @@ Parameters:
| `shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this user. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
| `skip_confirmation` | No | Skip confirmation - true or false (default) |
| `skype` | No | Skype ID |
-| `theme_id` | No | The GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
+| `theme_id` | No | GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | Yes | Username |
| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
@@ -507,7 +506,7 @@ Parameters:
| `external` | No | Flags the user as external - true or false (default) |
| `extra_shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Additional CI/CD minutes for this user. |
| `group_id_for_saml` | No | ID of group where SAML has been configured |
-| `id` | Yes | The ID of the user |
+| `id` | Yes | ID of the user |
| `linkedin` | No | LinkedIn |
| `location` | No | User's location |
| `name` | No | Name |
@@ -517,11 +516,11 @@ Parameters:
| `private_profile` | No | User's profile is private - true, false (default), or null (is converted to false) |
| `projects_limit` | No | Limit projects each user can create |
| `provider` | No | External provider name |
-| `public_email` | No | The public email of the user (must be already verified) |
+| `public_email` | No | Public email of the user (must be already verified) |
| `shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this user. Can be `nil` (default; inherit system default), `0` (unlimited) or `> 0`. |
| `skip_reconfirmation` | No | Skip reconfirmation - true or false (default) |
| `skype` | No | Skype ID |
-| `theme_id` | No | The GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
+| `theme_id` | No | GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | No | Username |
| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
@@ -544,7 +543,7 @@ Parameters:
| Attribute | Type | Required | Description |
|------------|---------|----------|------------------------|
-| `id` | integer | yes | The ID of a user |
+| `id` | integer | yes | ID of a user |
| `provider` | string | yes | External provider name |
## User deletion
@@ -560,10 +559,14 @@ Parameters:
| Attribute | Type | Required | Description |
|---------------|---------|----------|----------------------------------------------|
-| `id` | integer | yes | The ID of a user |
+| `id` | integer | yes | ID of a user |
| `hard_delete` | boolean | no | If true, contributions that would usually be [moved to Ghost User](../user/profile/account/delete_account.md#associated-records) are deleted instead, as well as groups owned solely by this user. |
-## List current user (for normal users)
+## List current user
+
+Get current user.
+
+### For normal users
Gets currently authenticated user.
@@ -619,7 +622,7 @@ GET /user
Users on [GitLab Premium or higher](https://about.gitlab.com/pricing/) also see the `shared_runners_minutes_limit`, `extra_shared_runners_minutes_limit` parameters.
-## List current user (for administrators)
+### For administrators **(FREE SELF)**
> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
@@ -631,7 +634,7 @@ Parameters:
| Attribute | Type | Required | Description |
|-----------|---------|----------|--------------------------------------------------|
-| `sudo` | integer | no | the ID of a user to make the call in their place |
+| `sudo` | integer | no | ID of a user to make the call in their place |
```json
{
@@ -696,7 +699,7 @@ GET /user/status
```
```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/user/status"
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/user/status"
```
Example response:
@@ -721,7 +724,7 @@ GET /users/:id_or_username/status
| Attribute | Type | Required | Description |
| ---------------- | ------ | -------- | ------------------------------------------------- |
-| `id_or_username` | string | yes | The ID or username of the user to get a status of |
+| `id_or_username` | string | yes | ID or username of the user to get a status of |
```shell
curl "https://gitlab.example.com/users/janedoe/status"
@@ -749,8 +752,8 @@ PUT /user/status
| Attribute | Type | Required | Description |
| -------------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `emoji` | string | no | The name of the emoji to use as status. If omitted `speech_balloon` is used. Emoji name can be one of the specified names in the [Gemojione index](https://github.com/bonusly/gemojione/blob/master/config/index.json). |
-| `message` | string | no | The message to set as a status. It can also contain emoji codes. |
+| `emoji` | string | no | Name of the emoji to use as status. If omitted `speech_balloon` is used. Emoji name can be one of the specified names in the [Gemojione index](https://github.com/bonusly/gemojione/blob/master/config/index.json). |
+| `message` | string | no | Message to set as a status. It can also contain emoji codes. |
| `clear_status_after` | string | no | Automatically clean up the status after a given time interval, allowed values: `30_minutes`, `3_hours`, `8_hours`, `1_day`, `3_days`, `7_days`, `30_days`
When both parameters `emoji` and `message` are empty, the status is cleared. When the `clear_status_after` parameter is missing from the request, the previously set value for `"clear_status_after` is cleared.
@@ -818,7 +821,7 @@ Parameters:
| `view_diffs_file_by_file` | Yes | Flag indicating the user sees only one file diff per page. |
| `show_whitespace_in_diffs` | Yes | Flag indicating the user sees whitespace changes in diffs. |
-## User Follow
+## User follow
### Follow and unfollow users
@@ -836,7 +839,7 @@ POST /users/:id/unfollow
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ---------------------------- |
-| `id` | integer | yes | The ID of the user to follow |
+| `id` | integer | yes | ID of the user to follow |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/users/3/follow"
@@ -871,7 +874,7 @@ GET /users/:id/following
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ---------------------------- |
-| `id` | integer | yes | The ID of the user to follow |
+| `id` | integer | yes | ID of the user to follow |
```shell
curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/users/3/followers"
@@ -975,7 +978,7 @@ GET /users/:id_or_username/keys
| Attribute | Type | Required | Description |
| ---------------- | ------ | -------- | ------------------------------------------------------- |
-| `id_or_username` | string | yes | The ID or username of the user to get the SSH keys for. |
+| `id_or_username` | string | yes | ID or username of the user to get the SSH keys for. |
## Single SSH key
@@ -989,7 +992,7 @@ Parameters:
| Attribute | Type | Required | Description |
|-----------|--------|----------|----------------------|
-| `key_id` | string | yes | The ID of an SSH key |
+| `key_id` | string | yes | ID of an SSH key |
```json
{
@@ -1038,9 +1041,9 @@ Parameters:
| Attribute | Type | Required | Description |
|--------------|--------|----------|--------------------------------------------------------------------------------|
-| `title` | string | yes | new SSH key's title |
-| `key` | string | yes | new SSH key |
-| `expires_at` | string | no | The expiration date of the SSH key in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`) |
+| `title` | string | yes | New SSH key's title |
+| `key` | string | yes | New SSH key |
+| `expires_at` | string | no | Expiration date of the SSH key in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`) |
```json
{
@@ -1079,9 +1082,9 @@ Parameters:
| Attribute | Type | Required | Description |
|--------------|---------|----------|--------------------------------------------------------------------------------|
| `id` | integer | yes | ID of specified user |
-| `title` | string | yes | new SSH key's title |
-| `key` | string | yes | new SSH key |
-| `expires_at` | string | no | The expiration date of the SSH key in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`) |
+| `title` | string | yes | New SSH key's title |
+| `key` | string | yes | New SSH key |
+| `expires_at` | string | no | Expiration date of the SSH key in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`) |
NOTE:
This also adds an audit event, as described in [audit instance events](../administration/audit_events.md#instance-events). **(PREMIUM)**
@@ -1152,7 +1155,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `key_id` | integer | yes | The ID of the GPG key |
+| `key_id` | integer | yes | ID of the GPG key |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/user/gpg_keys/1"
@@ -1180,7 +1183,7 @@ Parameters:
| Attribute | Type | Required | Description |
|-----------|--------|----------|-----------------|
-| `key` | string | yes | The new GPG key |
+| `key` | string | yes | New GPG key |
```shell
curl --data "key=-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n\r\nxsBNBFV..." \
@@ -1211,7 +1214,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `key_id` | integer | yes | The ID of the GPG key |
+| `key_id` | integer | yes | ID of the GPG key |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/user/gpg_keys/1"
@@ -1231,7 +1234,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ------------------ |
-| `id` | integer | yes | The ID of the user |
+| `id` | integer | yes | ID of the user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/2/gpg_keys"
@@ -1262,8 +1265,8 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer | yes | The ID of the user |
-| `key_id` | integer | yes | The ID of the GPG key |
+| `id` | integer | yes | ID of the user |
+| `key_id` | integer | yes | ID of the GPG key |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/2/gpg_keys/1"
@@ -1291,8 +1294,8 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer | yes | The ID of the user |
-| `key_id` | integer | yes | The ID of the GPG key |
+| `id` | integer | yes | ID of the user |
+| `key_id` | integer | yes | ID of the GPG key |
```shell
curl --data "key=-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n\r\nxsBNBFV..." \
@@ -1323,8 +1326,8 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer | yes | The ID of the user |
-| `key_id` | integer | yes | The ID of the GPG key |
+| `id` | integer | yes | ID of the user |
+| `key_id` | integer | yes | ID of the GPG key |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/2/gpg_keys/1"
@@ -1627,8 +1630,8 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ---------------------------------------------------------- |
-| `user_id` | integer | yes | The ID of the user |
-| `state` | string | no | filter tokens based on state (`all`, `active`, `inactive`) |
+| `user_id` | integer | yes | ID of the user |
+| `state` | string | no | Filter tokens based on state (`all`, `active`, `inactive`) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/42/impersonation_tokens"
@@ -1761,8 +1764,8 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------ | ------- | -------- | --------------------------------- |
-| `user_id` | integer | yes | The ID of the user |
-| `impersonation_token_id` | integer | yes | The ID of the impersonation token |
+| `user_id` | integer | yes | ID of the user |
+| `impersonation_token_id` | integer | yes | ID of the impersonation token |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/42/impersonation_tokens/2"
@@ -1802,10 +1805,10 @@ POST /users/:user_id/impersonation_tokens
| Attribute | Type | Required | Description |
| ------------ | ------- | -------- | --------------------------------------------------------------------------- |
-| `user_id` | integer | yes | The ID of the user |
-| `name` | string | yes | The name of the impersonation token |
-| `expires_at` | date | no | The expiration date of the impersonation token in ISO format (`YYYY-MM-DD`) |
-| `scopes` | array | yes | The array of scopes of the impersonation token (`api`, `read_user`) |
+| `user_id` | integer | yes | ID of the user |
+| `name` | string | yes | Name of the impersonation token |
+| `expires_at` | date | no | Expiration date of the impersonation token in ISO format (`YYYY-MM-DD`) |
+| `scopes` | array | yes | Array of scopes of the impersonation token (`api`, `read_user`) |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --data "name=mytoken" --data "expires_at=2017-04-04" \
@@ -1845,8 +1848,8 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------ | ------- | -------- | --------------------------------- |
-| `user_id` | integer | yes | The ID of the user |
-| `impersonation_token_id` | integer | yes | The ID of the impersonation token |
+| `user_id` | integer | yes | ID of the user |
+| `impersonation_token_id` | integer | yes | ID of the impersonation token |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/42/impersonation_tokens/1"
@@ -1867,10 +1870,10 @@ POST /users/:user_id/personal_access_tokens
| Attribute | Type | Required | Description |
| ------------ | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------ |
-| `user_id` | integer | yes | The ID of the user |
-| `name` | string | yes | The name of the personal access token |
-| `expires_at` | date | no | The expiration date of the personal access token in ISO format (`YYYY-MM-DD`) |
-| `scopes` | array | yes | The array of scopes of the personal access token. See [personal access token scopes](../user/profile/personal_access_tokens.md#personal-access-token-scopes) for possible values. |
+| `user_id` | integer | yes | ID of the user |
+| `name` | string | yes | Name of the personal access token |
+| `expires_at` | date | no | Expiration date of the personal access token in ISO format (`YYYY-MM-DD`) |
+| `scopes` | array | yes | Array of scopes of the personal access token. See [personal access token scopes](../user/profile/personal_access_tokens.md#personal-access-token-scopes) for possible values. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --data "name=mytoken" --data "expires_at=2017-04-04" \
@@ -1895,10 +1898,11 @@ Example response:
}
```
-## Get user activities (administrator only)
+## Get user activities
-NOTE:
-This API endpoint is only available on 8.15 (EE) and 9.1 (CE) and above.
+Pre-requisite:
+
+- You must be an administrator.
Get the last activity date for all users, sorted from oldest to newest.
@@ -1921,7 +1925,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ---------------------------------------------------------------------------------------------- |
-| `from` | string | no | Date string in the format YEAR-MONTH-DAY. For example, `2016-03-11`. Defaults to 6 months ago. |
+| `from` | string | no | Date string in the format `YEAR-MM-DD`. For example, `2016-03-11`. Defaults to 6 months ago. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/user/activities"
@@ -1951,11 +1955,15 @@ Example response:
`last_activity_at` is deprecated. Use `last_activity_on` instead.
-## User memberships (administrator only)
+## User memberships
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20532) in GitLab 12.8.
-Lists all projects and groups a user is a member of. This endpoint is available for administrators only.
+Pre-requisite:
+
+- You must be an administrator.
+
+Lists all projects and groups a user is a member of.
It returns the `source_id`, `source_name`, `source_type` and `access_level` of a membership.
Source can be of type `Namespace` (representing a group) or `Project`. The response represents only direct memberships. Inherited memberships, for example in subgroups, are not included.
Access levels are represented by an integer value. For more details, read about the meaning of [access level values](access_requests.md#valid-access-levels).
@@ -1968,7 +1976,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ------------------------------------------------------------------ |
-| `id` | integer | yes | The ID of a specified user |
+| `id` | integer | yes | ID of a specified user |
| `type` | string | no | Filter memberships by type. Can be either `Project` or `Namespace` |
Returns:
@@ -2000,3 +2008,37 @@ Example response:
}
]
```
+
+## Disable two factor authentication
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/295260) in GitLab 15.2.
+
+Pre-requisite:
+
+- You must be an administrator.
+
+Disables two factor authentication (2FA) for the specified user.
+
+Administrators cannot disable 2FA for their own user account or other administrators using the API. Instead, they can disable an
+administrator's 2FA [using the Rails console](../security/two_factor_authentication.md#for-a-single-user).
+
+```plaintext
+PATCH /users/:id/disable_two_factor
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+| --------- | ------- | -------- | --------------------- |
+| `id` | integer | yes | ID of the user |
+
+```shell
+curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/1/disable_two_factor"
+```
+
+Returns:
+
+- `204 No content` on success.
+- `400 Bad request` if two factor authentication is not enabled for the specified user.
+- `403 Forbidden` if not authenticated as an administrator.
+- `404 User Not Found` if user cannot be found.
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 40b29ebb6ea..c536ff59b84 100644
--- a/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
@@ -18,8 +18,13 @@ To use GitLab CI/CD with a Bitbucket Cloud repository:
1. On the top menu, select **Projects > Create new project**.
1. Select **Run CI/CD for external repository**.
1. Select **Repository by URL**.
+ 1. Fill in the fields with information from the repository in Bitbucket:
+ - For **Git repository URL**, use the URL from the **Clone this repository** panel in Bitbucket.
+ - Leave the username blank.
+ - You can generate and use a [Bitbucket App Password](https://support.atlassian.com/bitbucket-cloud/docs/app-passwords/) for the password field.
GitLab imports the repository and enables [Pull Mirroring](../../user/project/repository/mirror/pull.md).
+ You can check that mirroring is working in the project by going to **Settings > Repository > Mirroring repositories**.
1. In GitLab, create a
[Personal Access Token](../../user/profile/personal_access_tokens.md)
diff --git a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
index 9af5218e058..aea7b492d4e 100644
--- a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
+++ b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
@@ -223,7 +223,7 @@ These variables are injected into the pipeline jobs and can access the ECS API.
|`AWS_SECRET_ACCESS_KEY`|`<Secret access key of the deployer>`| For authenticating `aws` CLI. |
|`AWS_DEFAULT_REGION`|`us-east-2`| For authenticating `aws` CLI. |
|`CI_AWS_ECS_CLUSTER`|`ecs-demo`| The ECS cluster is accessed by `production_ecs` job. |
- |`CI_AWS_ECS_SERVICE`|`ecs_demo`| The ECS service of the cluster is updated by `production_ecs` job. |
+ |`CI_AWS_ECS_SERVICE`|`ecs_demo`| The ECS service of the cluster is updated by `production_ecs` job. Ensure that this variable is scoped to the appropriate environment (`production`, `staging`, `review/*`). |
|`CI_AWS_ECS_TASK_DEFINITION`|`ecs_demo`| The ECS task definition is updated by `production_ecs` job. |
### Make a change to the demo application
@@ -246,6 +246,55 @@ NOTE:
ECS deploy jobs wait for the rollout to complete before exiting. To disable this behavior,
set `CI_AWS_ECS_WAIT_FOR_ROLLOUT_COMPLETE_DISABLED` to a non-empty value.
+## Set up Review Apps
+
+To use [Review Apps](../../../development/testing_guide/review_apps.md) with ECS:
+
+1. Set up a new [service](#create-an-ecs-service).
+1. Use the `CI_AWS_ECS_SERVICE` variable to set the name.
+1. Set the environment scope to `review/*`.
+
+Only one Review App at a time can be deployed because this service is shared by all review apps.
+
+## Set up Security Testing
+
+### Configure SAST
+
+To use [SAST](../../../user/application_security/sast/index.md) with ECS, add the following to your `.gitlab-ci.yml` file:
+
+```yaml
+include:
+ - template: Security/SAST.gitlab-ci.yml
+```
+
+For more details and configuration options, see the [SAST documentation](../../../user/application_security/sast/index.md#configuration).
+
+### Configure DAST
+
+To use [DAST](../../../user/application_security/dast/index.md) on non-default branches, [set up review apps](#set-up-review-apps)
+and add the following to your `.gitlab-ci.yml` file:
+
+```yaml
+include:
+ - template: Security/DAST.gitlab-ci.yml
+```
+
+To use DAST on the default branch:
+
+1. Set up a new [service](#create-an-ecs-service). This service will be used to deploy a temporary
+DAST environment.
+1. Use the `CI_AWS_ECS_SERVICE` variable to set the name.
+1. Set the scope to the `dast-default` environment.
+1. Add the following to your `.gitlab-ci.yml` file:
+
+```yaml
+include:
+ - template: Security/DAST.gitlab-ci.yml
+ - template: Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
+```
+
+For more details and configuration options, see the [DAST documentation](../../../user/application_security/dast/index.md).
+
## Further reading
- If you're interested in more of the continuous deployments to clouds, see [cloud deployments](../index.md).
diff --git a/doc/ci/cloud_deployment/heroku.md b/doc/ci/cloud_deployment/heroku.md
new file mode 100644
index 00000000000..4e627675b01
--- /dev/null
+++ b/doc/ci/cloud_deployment/heroku.md
@@ -0,0 +1,32 @@
+---
+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
+---
+
+# Use GitLab CI/CD to deploy to Heroku
+
+You can deploy an application to Heroku by using GitLab CI/CD.
+
+## Prerequisites
+
+- A [Heroku](https://id.heroku.com/login) account.
+ Sign in with an existing Heroku account or create a new one.
+
+## Deploy to Heroku
+
+1. In Heroku:
+ 1. Create an application and copy the application name.
+ 1. Browse to **Account Settings** and copy the API key.
+1. In your GitLab project, create two [variables](../../ci/variables/index.md):
+ - `HEROKU_APP_NAME` for the application name.
+ - `HEROKU_PRODUCTION_KEY` for the API key
+1. Edit your `.gitlab-ci.yml` file to add the Heroku deployment command. This example uses the `dpl` gem for Ruby:
+
+ ```yaml
+ heroku_deploy:
+ stage: production
+ script:
+ - gem install dpl
+ - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_PRODUCTION_KEY
+ ```
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index c5be2328264..5df396e796e 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -93,7 +93,7 @@ To deploy to your ECS cluster:
| Environment variable name | Value |
|:-------------------------------|:------------------------|
| `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. |
+ | `CI_AWS_ECS_SERVICE` | The name of the targeted service tied to your AWS ECS cluster. Ensure that this variable is scoped to the appropriate environment (`production`, `staging`, `review/*`). |
| `CI_AWS_ECS_TASK_DEFINITION` | If the task definition is in ECS, the name of the task definition tied to the service. |
| `CI_AWS_ECS_TASK_DEFINITION_FILE` | If the task definition is a JSON file in GitLab, the filename, including the path. For example, `ci/aws/my_task_definition.json`. If the name of the task definition in your JSON file is the same name as an existing task definition in ECS, then a new revision is created when CI/CD runs. Otherwise, a brand new task definition is created, starting at revision 1. |
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index b13bd041d46..6ffa68e4873 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -406,8 +406,11 @@ When you stop an environment:
to the list of **Stopped** environments.
- An [`on_stop` action](../yaml/index.md#environmenton_stop), if defined, is executed.
-Dynamic environments stop automatically when their associated branch is
-deleted.
+There are multiple ways to clean up [dynamic environments](#create-a-dynamic-environment):
+
+- If you use [merge request pipelines](../pipelines/merge_request_pipelines.md), GitLab stops an environment [when a merge request is merged or closed](#stop-an-environment-when-a-merge-request-is-merged-or-closed).
+- If you do _NOT_ use [merge request pipelines](../pipelines/merge_request_pipelines.md), GitLab stops an environment [when the associated feature branch is deleted](#stop-an-environment-when-a-branch-is-deleted).
+- If you set [an expiry period to an environment](../yaml/index.md#environmentauto_stop_in), GitLab stops an environment [when it's expired](#stop-an-environment-after-a-certain-time-period).
#### Stop an environment when a branch is deleted
@@ -425,8 +428,6 @@ deploy_review:
name: review/$CI_COMMIT_REF_SLUG
url: https://$CI_ENVIRONMENT_SLUG.example.com
on_stop: stop_review
- rules:
- - if: $CI_MERGE_REQUEST_ID
stop_review:
stage: deploy
@@ -435,9 +436,7 @@ stop_review:
environment:
name: review/$CI_COMMIT_REF_SLUG
action: stop
- rules:
- - if: $CI_MERGE_REQUEST_ID
- when: manual
+ when: manual
```
Both jobs must have the same [`rules`](../yaml/index.md#rules)
@@ -455,6 +454,39 @@ try to check out the code after the branch is deleted.
Read more in the [`.gitlab-ci.yml` reference](../yaml/index.md#environmenton_stop).
+#### Stop an environment when a merge request is merged or closed
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/60885) in GitLab 11.10.
+
+You can configure environments to stop when a merge request is merged or closed.
+This stop trigger is automatically enabled when you use [merge request pipelines](../pipelines/merge_request_pipelines.md).
+
+The following example shows a `deploy_review` job that calls a `stop_review` job
+to clean up and stop the environment.
+
+```yaml
+deploy_review:
+ stage: deploy
+ script:
+ - echo "Deploy a review app"
+ environment:
+ name: review/$CI_COMMIT_REF_SLUG
+ on_stop: stop_review
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+
+stop_review:
+ stage: deploy
+ script:
+ - echo "Remove review app"
+ environment:
+ name: review/$CI_COMMIT_REF_SLUG
+ action: stop
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+ when: manual
+```
+
#### Stop an environment when another job is finished
You can set an environment to stop when another job is finished.
@@ -642,6 +674,18 @@ To delete a stopped environment in the GitLab UI:
1. Next to the environment you want to delete, select **Delete environment**.
1. On the confirmation dialog box, select **Delete environment**.
+#### Delete an active environment without running a stop job
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225794) in GitLab 15.1.
+
+You can delete an active environment without running a stop job.
+This is useful when you have an active environment, but the corresponding `action: stop` job can't run or succeed for some reason.
+
+To delete an active environment:
+
+1. Execute the [Stop an environment API](../../api/environments.md#stop-an-environment) while specifying `force=true`.
+1. Execute the [Delete an environment API](../../api/environments.md#delete-an-environment).
+
### Access an environment for preparation or verification purposes
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208655) in GitLab 13.2.
diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
index 389429f3f0f..90cbcb9e240 100644
--- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
+++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
@@ -33,29 +33,30 @@ Each job has JSON Web Token (JWT) provided as CI/CD variable named `CI_JOB_JWT`.
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) |
+| 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 specifies an environment | Environment this job specifies ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294440) in GitLab 13.9) |
+| `environment_protected` | Job specifies an environment | `true` if specified environment is protected, `false` otherwise ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294440) in GitLab 13.9) |
+| `deployment_tier` | Job specifies an environment | [Deployment tier](../../environments/index.md#deployment-tier-of-environments) of environment this job specifies ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363590) in GitLab 15.2) |
Example JWT payload:
diff --git a/doc/ci/examples/index.md b/doc/ci/examples/index.md
index 0fc7b06a584..77591ad2ca6 100644
--- a/doc/ci/examples/index.md
+++ b/doc/ci/examples/index.md
@@ -24,11 +24,11 @@ The following table lists examples with step-by-step tutorials that are containe
| Use case | Resource |
|-------------------------------|----------|
-| Browser performance testing | [Browser Performance Testing with the Sitespeed.io container](../../user/project/merge_requests/browser_performance_testing.md). |
+| Browser performance testing | [Browser Performance Testing with the Sitespeed.io container](../testing/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). |
+| Load performance testing | [Load Performance Testing with the k6 container](../testing/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). |
@@ -95,6 +95,7 @@ choose one of these templates:
- [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.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.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
diff --git a/doc/ci/index.md b/doc/ci/index.md
index 4fe2dee32bf..80752830b85 100644
--- a/doc/ci/index.md
+++ b/doc/ci/index.md
@@ -83,8 +83,8 @@ GitLab CI/CD features, grouped by DevOps stage, include:
| [ChatOps](chatops/index.md) | Trigger CI jobs from chat, with results sent back to the channel. |
| [Connect to cloud services](cloud_services/index.md) | Connect to cloud providers using OpenID Connect (OIDC) to retrieve temporary credentials to access services or secrets. |
| **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. |
+| [Browser Performance Testing](testing/browser_performance_testing.md) | Quickly determine the browser performance impact of pending code changes. |
+| [Load Performance Testing](testing/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. |
| [GitLab CI/CD for external repositories](ci_cd_for_external_repos/index.md) | Get the benefits of GitLab CI/CD combined with repositories in GitHub and Bitbucket Cloud. |
| [Interactive Web Terminals](interactive_web_terminal/index.md) | Open an interactive web terminal to debug the running jobs. |
@@ -101,7 +101,7 @@ GitLab CI/CD features, grouped by DevOps stage, include:
| [GitLab Releases](../user/project/releases/index.md) | Add release notes to Git tags. |
| [Cloud deployment](cloud_deployment/index.md) | Deploy your application to a main cloud provider. |
| **Secure** | |
-| [Code Quality](../user/project/merge_requests/code_quality.md) | Analyze your source code quality. |
+| [Code Quality](testing/code_quality.md) | Analyze your source code quality. |
| [Container Scanning](../user/application_security/container_scanning/index.md) | Check your Docker containers for known vulnerabilities. |
| [Dependency Scanning](../user/application_security/dependency_scanning/index.md) | Analyze your dependencies for known vulnerabilities. |
| [License Compliance](../user/compliance/license_compliance/index.md) | Search your project dependencies for their licenses. |
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index 1f7a7436c0a..fd6afb1a0ad 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -45,9 +45,6 @@ Clicking an individual job shows you its job log, and allows you to:
### View all jobs in a project
-> - An improved view was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293862) in GitLab 14.10, [with a flag](../../administration/feature_flags.md) named `jobs_table_vue`. Disabled by default.
-> - The job status filter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82539) in GitLab 14.10, [with a flag](../../administration/feature_flags.md) named `jobs_table_vue_search`. Disabled by default.
-
To view the full list of jobs that ran in a project:
1. On the top bar, select **Menu > Projects** and find the project.
@@ -136,9 +133,9 @@ jobs. Select to expand them.
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`.
-- A colon (`:`), for example, `test 1:3`, `test 2:3`, `test 3:3`.
-- A space, for example `test 0 3`, `test 1 3`, `test 2 3`.
+- A slash (`/`), for example, `slash-test 1/3`, `slash-test 2/3`, `slash-test 3/3`.
+- A colon (`:`), for example, `colon-test 1:3`, `colon-test 2:3`, `colon-test 3:3`.
+- A space, for example `space-test 0 3`, `space-test 1 3`, `space-test 2 3`.
You can use these symbols interchangeably.
@@ -358,7 +355,7 @@ Add `[collapsed=true]` after the section name and before the `\r`. The section e
remains unchanged:
- Section start marker with `[collapsed=true]`: `\e[0Ksection_start:UNIX_TIMESTAMP:SECTION_NAME[collapsed=true]\r\e[0K` + `TEXT_OF_SECTION_HEADER`
-- Section end marker: `section_end:UNIX_TIMESTAMP:SECTION_NAME\r\e[0K`
+- Section end marker: `\e[0Ksection_end:UNIX_TIMESTAMP:SECTION_NAME\r\e[0K`
Add the updated section start text to the CI configuration. For example,
using `echo`:
diff --git a/doc/ci/jobs/job_control.md b/doc/ci/jobs/job_control.md
index 83747f36597..24133fe9a9b 100644
--- a/doc/ci/jobs/job_control.md
+++ b/doc/ci/jobs/job_control.md
@@ -547,25 +547,29 @@ You can use [protected branches](../../user/project/protected_branches.md) to mo
### Types of manual jobs
-Manual jobs can be either optional or blocking:
-
-- **Optional**: The default setting for manual jobs.
- - They have [`allow_failure: true`](../yaml/index.md#allow_failure) by default.
- - The status does not contribute to the overall pipeline status. A pipeline can
- succeed even if all of its manual jobs fail.
-- **Blocking**: An optional setting for manual jobs.
- - Add `allow_failure: false` to the job configuration.
- - The pipeline stops at the stage where the job is defined. To let the pipeline
- continue running, [run the manual job](#run-a-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**.
+Manual jobs can be either optional or blocking.
-### Run a manual job
+In optional manual jobs:
+
+- [`allow_failure`](../yaml/index.md#allow_failure) is `true`, which is the default
+ setting for jobs that have `when: manual` and no [`rules`](../yaml/index.md#rules),
+ or `when: manual` defined outside of `rules`.
+- The status does not contribute to the overall pipeline status. A pipeline can
+ succeed even if all of its manual jobs fail.
+
+In blocking manual jobs:
-To run a manual job, you must have permission to merge to the assigned branch.
+- `allow_failure` is `false`, which is the default setting for jobs that have `when: manual`
+ defined inside [`rules`](../yaml/index.md#rules).
+- The pipeline stops at the stage where the job is defined. To let the pipeline
+ continue running, [run the manual job](#run-a-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.
+- The pipeline shows a status of **blocked**.
+
+### Run a manual job
-To run a manual job:
+To run a manual job, you must have permission to merge to the assigned branch:
1. Go to the pipeline, job, [environment](../environments/index.md#configure-manual-deployments),
or deployment view.
diff --git a/doc/ci/metrics_reports.md b/doc/ci/metrics_reports.md
index 03869a639f1..c3ab3392f36 100644
--- a/doc/ci/metrics_reports.md
+++ b/doc/ci/metrics_reports.md
@@ -1,68 +1,11 @@
---
-stage: Verify
-group: Pipeline Insights
-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: 'testing/metrics_reports.md'
+remove_date: '2022-08-31'
---
-# Metrics Reports **(PREMIUM)**
+This document was moved to [another location](testing/metrics_reports.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9788) in GitLab 11.10. Requires GitLab Runner 11.10 and above.
-
-GitLab provides a lot of great reporting tools for things like [merge requests](../user/project/merge_requests/index.md) - [Unit test reports](testing/unit_test_reports.md), [code quality](../user/project/merge_requests/code_quality.md), and performance tests. While JUnit is a great open framework for tests that "pass" or "fail", it is also important to see other types of metrics from a given change.
-
-You can configure your job to use custom Metrics Reports, and GitLab displays a report on the merge request so that it's easier and faster to identify changes without having to check the entire log.
-
-![Metrics Reports](img/metrics_reports_v13_0.png)
-
-## Use cases
-
-Consider the following examples of data that can use Metrics Reports:
-
-1. Memory usage
-1. Load testing results
-1. Code complexity
-1. Code coverage stats
-
-## How it works
-
-Metrics for a branch are read from the latest metrics report artifact (default filename: `metrics.txt`) as string values.
-
-For an MR, the values of these metrics from the feature branch are compared to the values from the target branch. Then they are displayed in the MR widget in this order:
-
-- Existing metrics with changed values.
-- Metrics that have been added by the MR. Marked with a **New** badge.
-- Metrics that have been removed by the MR. Marked with a **Removed** badge.
-- Existing metrics with unchanged values.
-
-## How to set it up
-
-Add a job that creates a [metrics report](yaml/artifacts_reports.md#artifactsreportsmetrics) (default filename: `metrics.txt`). The file should conform to the [OpenMetrics](https://openmetrics.io/) format.
-
-For example:
-
-```yaml
-metrics:
- script:
- - echo 'metric_name metric_value' > metrics.txt
- artifacts:
- reports:
- metrics: metrics.txt
-```
-
-## Advanced Example
-
-An advanced example of an OpenMetrics text file (from the [Prometheus documentation](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-format-example))
-renders in the merge request widget as:
-
-![Metrics Reports Advanced](img/metrics_reports_advanced_v13_0.png)
-
-## Troubleshooting
-
-### Metrics reports did not change
-
-You can see `Metrics reports did not change` when trying to view metrics reports in merge requests. Reasons for this are:
-
-- The target branch for the merge request doesn't have a baseline metrics report for comparison.
-- You don't have GitLab license at the Premium tier or above.
-
-There is [an issue open](https://gitlab.com/gitlab-org/gitlab/-/issues/343065) to improve this message.
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/ci/migration/circleci.md b/doc/ci/migration/circleci.md
index b1c4c62c465..3b890458e56 100644
--- a/doc/ci/migration/circleci.md
+++ b/doc/ci/migration/circleci.md
@@ -289,8 +289,8 @@ Self-managed runners:
GitLab.com shared runners:
- Linux
-- Windows
-- [Planned: macOS](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/5720)
+- [Windows](../runners/saas/windows_saas_runner.md) ([Beta](../../policy/alpha-beta-support.md#beta-features)).
+- [macOS](../runners/saas/macos_saas_runner.md) ([Beta](../../policy/alpha-beta-support.md#beta-features)).
### Machine and specific build environments
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md
index d87b336224c..4fb2ec94d60 100644
--- a/doc/ci/pipeline_editor/index.md
+++ b/doc/ci/pipeline_editor/index.md
@@ -98,7 +98,7 @@ where:
- [YAML `!reference` tags](../yaml/yaml_optimization.md#reference-tags) are also replaced
with the linked configuration.
-Using `!refence` tags can cause nested configuration that display with
+Using `!reference` tags can cause nested configuration that display with
multiple hyphens (`-`) in the expanded view. This behavior is expected, and the extra
hyphens do not affect the job's execution. For example, this configuration and
fully expanded version are both valid:
diff --git a/doc/ci/pipelines/cicd_minutes.md b/doc/ci/pipelines/cicd_minutes.md
index ff30d5701cc..1e862c87035 100644
--- a/doc/ci/pipelines/cicd_minutes.md
+++ b/doc/ci/pipelines/cicd_minutes.md
@@ -7,22 +7,33 @@ type: reference
# CI/CD minutes quota **(PREMIUM)**
-[Shared runners](../runners/runners_scope.md#shared-runners) are shared with every project and group in a GitLab instance.
-When jobs run on shared runners, CI/CD minutes are used.
+Administrators can limit the amount of time that projects can use to run jobs on
+[shared runners](../runners/runners_scope.md#shared-runners) each month. This limit
+is tracked with a quota of CI/CD minutes.
-You can set limits on the number of CI/CD minutes that are used each month.
+By default, one minute of execution time by a single job uses
+one CI/CD minute. The total amount of CI/CD minutes used by a pipeline is
+[the sum of all its jobs' durations](#how-cicd-minute-usage-is-calculated).
+Jobs can run concurrently, so the total CI/CD minute usage can be higher than the
+end-to-end duration of a pipeline.
-- On GitLab.com, the quota of CI/CD minutes is set for each [namespace](../../user/group/index.md#namespaces),
- and is determined by [your license tier](https://about.gitlab.com/pricing/).
-- On self-managed GitLab instances, the quota of CI/CD minutes for each namespace is set by administrators.
+On GitLab.com:
-In addition to the monthly quota, you can add more CI/CD minutes when needed.
+- CI/CD minutes quotas are enabled for both public and private projects, but public
+ projects [consume CI/CD minutes at a slower rate](#cost-factor).
+- The base monthly CI/CD minutes quota for a GitLab.com [namespace](../../user/group/index.md#namespaces)
+ is determined by its [license tier](https://about.gitlab.com/pricing/).
+- You can [purchase additional CI/CD minutes](#purchase-additional-cicd-minutes)
+ if you need more than the number of CI/CD minutes in your monthly quota.
-- On GitLab.com, you can [purchase additional CI/CD minutes](#purchase-additional-cicd-minutes).
-- On self-managed GitLab instances, administrators can [assign more CI/CD minutes](#set-the-quota-of-cicd-minutes-for-a-specific-namespace).
+On self-managed GitLab instances:
-[Specific runners](../runners/runners_scope.md#specific-runners)
-are not subject to a quota of CI/CD minutes.
+- CI/CD minutes quotas are disabled by default.
+- When enabled, CI/CD minutes quotas apply to private projects only.
+- Administrators can [assign more CI/CD minutes](#set-the-quota-of-cicd-minutes-for-a-specific-namespace)
+ if a namespace uses all the CI/CD minutes in its monthly quota.
+
+[Specific runners](../runners/runners_scope.md#specific-runners) are not subject to a quota of CI/CD minutes.
## Set the quota of CI/CD minutes for all namespaces
@@ -160,46 +171,43 @@ To purchase additional minutes for your personal namespace:
After your payment is processed, the additional CI/CD minutes are added to your personal
namespace.
-## How CI/CD minutes are calculated
-
-CI/CD minutes for individual jobs are calculated based on:
+## How CI/CD minute usage is calculated
-- The duration the job runs.
-- The visibility of the projects where the job runs.
-
-GitLab uses this formula to calculate CI/CD minutes consumed by a job:
+GitLab uses this formula to calculate the CI/CD minute usage of a job:
```plaintext
Job duration * Cost factor
```
-- **Job duration**: The time, in seconds, that a job took to run on a shared runner.
- It does not include time spent in `created` or `pending` status.
-- **Cost factor**: A number based on project visibility.
+- **Job duration**: The time, in seconds, that a job took to run on a shared runner,
+ not including time spent in the `created` or `pending` statuses.
+- [**Cost factor**](#cost-factor): A number based on project visibility.
-The number is transformed into minutes and added to the overall quota in the job's top-level namespace.
+The value is transformed into minutes and added to the count of used CI/CD minutes
+in the job's top-level namespace.
-For example:
+For example, if a user `alice` runs a pipeline:
-- A user, `alice`, runs a pipeline under the `gitlab-org` namespace.
-- The CI/CD minutes consumed by each job in the pipeline are added to the
- overall consumption for the `gitlab-org` namespace, not the `alice` namespace.
-- If a pipeline runs for one of the personal projects for `alice`, the CI/CD minutes
- are added to the overall consumption for the `alice` namespace.
+- Under the `gitlab-org` namespace, the CI/CD minutes used by each job in the pipeline are
+ added to the overall consumption for the `gitlab-org` namespace, not the `alice` namespace.
+- For one of the personal projects in their namespace, the CI/CD minutes are added
+ to the overall consumption for the `alice` namespace.
The CI/CD minutes used by one pipeline is the total CI/CD minutes used by all the jobs
-that ran in the pipeline. The CI/CD minute usage for a pipeline can be higher than
-the duration of the pipeline if many jobs ran at the same time.
+that ran in the pipeline. Jobs can run concurrently, so the total CI/CD minutes usage
+can be higher than the end-to-end duration of a pipeline.
### Cost factor
-The cost factor for a job running on a shared runner is:
+The cost factors for jobs running on shared runners on GitLab.com are:
+
+- `0.008` for public projects, and projects in the [GitLab for Open Source program](../../subscriptions/index.md#gitlab-for-open-source).
+ For every 125 minutes of job execution time, you use 1 CI/CD minute.
+- `1` for internal and private projects.
+
+The cost factors on self-managed instances are:
-- `0.008` for public projects on GitLab SaaS, if [created 2021-07-17 or later](https://gitlab.com/gitlab-org/gitlab/-/issues/332708).
- (For every 125 minutes of job time, you accrue 1 CI/CD minute.)
-- `0.008` for projects members of GitLab [Open Source program](../../subscriptions/index.md#gitlab-for-open-source).
- (For every 125 minutes of job time, you accrue 1 CI/CD minute.)
-- `0` for public projects on GitLab self-managed instances, and for GitLab SaaS public projects created before 2021-07-17.
+- `0` for public projects, so they do not consume CI/CD minutes.
- `1` for internal and private projects.
### Additional costs on GitLab SaaS
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index 76419e61661..08264170d52 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -40,7 +40,7 @@ A typical pipeline might consist of four stages, executed in the following order
NOTE:
If you have a [mirrored repository that GitLab pulls from](../../user/project/repository/mirror/pull.md),
you may need to enable pipeline triggering in your project's
-**Settings > Repository > Pull from a remote repository > Trigger pipelines for mirror updates**.
+**Settings > Repository > Mirroring repositories > Trigger pipelines for mirror updates**.
## Types of pipelines
@@ -374,7 +374,7 @@ GitLab capitalizes the stages' names in the pipeline graphs.
### View full pipeline graph
-> - Visualization improvements [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276949) in GitLab 13.11.
+> Visualization improvements [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276949) in GitLab 13.11.
The [pipeline details page](#view-pipelines) displays the full pipeline graph of
all the jobs in the pipeline.
diff --git a/doc/ci/pipelines/job_artifacts.md b/doc/ci/pipelines/job_artifacts.md
index b0336d0499f..c8babe3320d 100644
--- a/doc/ci/pipelines/job_artifacts.md
+++ b/doc/ci/pipelines/job_artifacts.md
@@ -430,3 +430,24 @@ successful_test_job:
paths:
- bin/results
```
+
+### Error message `FATAL: invalid argument` when uploading a dotenv artifact on a windows runner
+
+The PowerShell `echo` command writes files with UCS-2 LE BOM (Byte Order Mark) encoding,
+but only UTF-8 is supported. If you try create the dotenv artifact with `echo`, it causes a
+`FATAL: invalid argument` error.
+
+Use PowerShell `Add-Content` instead, which uses UTF-8:
+
+```yaml
+test-job:
+ stage: test
+ tags:
+ - windows
+ script:
+ - echo "test job"
+ - Add-Content -Path build.env -Value "MY_ENV_VAR=true"
+ artifacts:
+ reports:
+ dotenv: build.env
+```
diff --git a/doc/ci/pipelines/merge_trains.md b/doc/ci/pipelines/merge_trains.md
index e0fe59d1ab8..ac644628f3a 100644
--- a/doc/ci/pipelines/merge_trains.md
+++ b/doc/ci/pipelines/merge_trains.md
@@ -69,7 +69,6 @@ To enable merge trains:
- You must have the Maintainer role.
- 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).
diff --git a/doc/ci/pipelines/merged_results_pipelines.md b/doc/ci/pipelines/merged_results_pipelines.md
index 9661d2f5263..777871a7c5f 100644
--- a/doc/ci/pipelines/merged_results_pipelines.md
+++ b/doc/ci/pipelines/merged_results_pipelines.md
@@ -6,7 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Merged results pipelines **(PREMIUM)**
-> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/351192) from `pipelines for merged results` to `merged results pipelines` in GitLab 14.8.
+> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/351192) from `pipelines for merged results` to `merged results pipelines` in GitLab 14.8.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91849) in GitLab 15.1, merged results pipelines also run on [Draft merge requests](../../user/project/merge_requests/drafts.md).
A *merged results pipeline* is a type of [merge request pipeline](merge_request_pipelines.md). It is a pipeline that runs against the results of the source and target branches merged together.
@@ -19,10 +20,7 @@ The pipeline runs against the target branch as it exists at the moment you run t
Over time, while you're working in the source branch, the target branch might change.
Any time you want to be sure the merged results are accurate, you should re-run the pipeline.
-Merged results pipelines can't run 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).
+Merged results pipelines can't run when the target branch has changes that conflict with the changes in the source branch.
In these cases, the pipeline runs as a [merge request pipeline](merge_request_pipelines.md)
and [is labeled as `merge request`](merge_request_pipelines.md#types-of-merge-request-pipelines).
diff --git a/doc/ci/pipelines/multi_project_pipelines.md b/doc/ci/pipelines/multi_project_pipelines.md
index 20184635e4a..dfbd2708d8d 100644
--- a/doc/ci/pipelines/multi_project_pipelines.md
+++ b/doc/ci/pipelines/multi_project_pipelines.md
@@ -188,7 +188,7 @@ 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
+#### Pass CI/CD variables to a downstream pipeline by using variable inheritance **(PREMIUM)**
You can pass variables to a downstream pipeline with [`dotenv` variable inheritance](../variables/index.md#pass-an-environment-variable-to-another-job) and [`needs:project`](../yaml/index.md#needsproject).
diff --git a/doc/ci/pipelines/pipeline_artifacts.md b/doc/ci/pipelines/pipeline_artifacts.md
index 3a1367f4a8c..07e1c8a6d99 100644
--- a/doc/ci/pipelines/pipeline_artifacts.md
+++ b/doc/ci/pipelines/pipeline_artifacts.md
@@ -10,7 +10,7 @@ Pipeline artifacts are files created by GitLab after a pipeline finishes. Pipeli
different to [job artifacts](job_artifacts.md) because they are not explicitly managed by
`.gitlab-ci.yml` definitions.
-Pipeline artifacts are used by the [test coverage visualization feature](../../user/project/merge_requests/test_coverage_visualization.md)
+Pipeline artifacts are used by the [test coverage visualization feature](../testing/test_coverage_visualization.md)
to collect coverage information.
## Storage
diff --git a/doc/ci/pipelines/pipeline_efficiency.md b/doc/ci/pipelines/pipeline_efficiency.md
index 991b3aef76c..ad43895d7ef 100644
--- a/doc/ci/pipelines/pipeline_efficiency.md
+++ b/doc/ci/pipelines/pipeline_efficiency.md
@@ -75,7 +75,7 @@ The [Pipeline success and duration charts](index.md#pipeline-success-and-duratio
give information about pipeline runtime and failed job counts.
Tests like [unit tests](../testing/unit_test_reports.md), integration tests, end-to-end tests,
-[code quality](../../user/project/merge_requests/code_quality.md) tests, and others
+[code quality](../testing/code_quality.md) tests, and others
ensure that problems are automatically found by the CI/CD pipeline. There could be many
pipeline stages involved causing long runtimes.
@@ -174,7 +174,7 @@ to stop them from running:
Ensure that errors are detected early in the CI/CD pipeline. A job that takes a very long
time to complete keeps a pipeline from returning a failed status until the job completes.
-Design pipelines so that jobs that can [fail fast](../../user/project/merge_requests/fail_fast_testing.md)
+Design pipelines so that jobs that can [fail fast](../testing/fail_fast_testing.md)
run earlier. For example, add an early stage and move the syntax, style linting,
Git commit message verification, and similar jobs in there.
diff --git a/doc/ci/pipelines/pipelines_for_merged_results.md b/doc/ci/pipelines/pipelines_for_merged_results.md
deleted file mode 100644
index 0c3100a51f1..00000000000
--- a/doc/ci/pipelines/pipelines_for_merged_results.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'merged_results_pipelines.md'
-remove_date: '2022-04-27'
----
-
-This document was moved to [another location](merged_results_pipelines.md).
-
-<!-- This redirect file can be deleted after 2022-04-27. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 40daf154a5f..43f20bfa9ea 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -21,7 +21,7 @@ For public and internal projects, you can change who can see your:
- Pipelines
- Job output logs
- Job artifacts
-- [Pipeline security dashboard](../../user/application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline)
+- [Pipeline security dashboard](../../user/application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline)
To change the visibility of your pipelines and related features:
@@ -288,6 +288,9 @@ regular expression displayed in the settings. Available in GitLab 14.10 and earl
The regular expression you need is in the **Test coverage parsing** field.
+If you need to retrieve the project coverage setting from many projects, you can
+[use the API to programmatically retrieve the setting](https://gitlab.com/gitlab-org/gitlab/-/issues/17633#note_945941397).
+
<!-- end_remove -->
### Test coverage examples
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md
index 3ebd38df8db..6dd03033926 100644
--- a/doc/ci/review_apps/index.md
+++ b/doc/ci/review_apps/index.md
@@ -287,6 +287,9 @@ can supply the ID by either:
- Dynamically adding the `data-merge-request-id` value during the build of the app.
- Supplying it manually through the visual review form in the app.
+If the ID is missing from the `script`, the visual review tool prompts you to enter the
+merge request ID before you can provide feedback.
+
### Authentication for Visual Reviews
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/42750#note_317271120) in GitLab 12.10.
diff --git a/doc/ci/runners/index.md b/doc/ci/runners/index.md
index 729de4d99d3..038bda4ab09 100644
--- a/doc/ci/runners/index.md
+++ b/doc/ci/runners/index.md
@@ -12,7 +12,7 @@ No configuration is required. Your jobs can run on:
- [Linux runners](saas/linux_saas_runner.md).
- [Windows runners](saas/windows_saas_runner.md) ([Beta](../../policy/alpha-beta-support.md#beta-features)).
-- [macOS runners](saas/macos_saas_runner.md) ([Limited Availability](../../policy/alpha-beta-support.md#limited-availability-la)).
+- [macOS runners](saas/macos_saas_runner.md) ([Beta](../../policy/alpha-beta-support.md#beta-features)).
The number of minutes you can use on these runners depends on the
[maximum number of CI/CD minutes](../pipelines/cicd_minutes.md)
diff --git a/doc/ci/runners/saas/macos_saas_runner.md b/doc/ci/runners/saas/macos_saas_runner.md
index 65404c89f9a..5a2d84b6996 100644
--- a/doc/ci/runners/saas/macos_saas_runner.md
+++ b/doc/ci/runners/saas/macos_saas_runner.md
@@ -4,9 +4,9 @@ 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
---
-# SaaS runners on macOS (Limited Availability) **(PREMIUM SAAS)**
+# SaaS runners on macOS (Beta) **(PREMIUM SAAS)**
-SaaS runners on macOS are in [Limited Availability](../../../policy/alpha-beta-support.md#limited-availability-la) for approved open source programs and customers in Premium and Ultimate plans.
+SaaS runners on macOS are in [Beta](../../../policy/alpha-beta-support.md#beta-features) for approved open source programs and customers in Premium and Ultimate plans.
SaaS runners on macOS provide an on-demand macOS build environment integrated with
GitLab SaaS [CI/CD](../../../ci/index.md).
@@ -18,13 +18,15 @@ CI/CD minutes used on GitLab SaaS macOS runners are included in your CI/CD minut
Refer to the CI/CD minutes [cost factor](../../../ci/pipelines/cicd_minutes.md#cost-factor) for the cost factor applied to the GitLab SaaS macOS runners.
+Jobs handled by macOS shared runners on GitLab.com **time out after 2 hours**, regardless of the timeout configured in a project.
+
## Access request process
-While in limited availability, to run CI jobs on the macOS runners, GitLab SaaS customer namespaces must be explicitly added to the macOS `allow-list`. Customers who participated in the beta have already been added.
+While in beta, to run CI jobs on the macOS runners, GitLab SaaS customer namespaces must be explicitly added to the macOS `allow-list`.
After you have been added, you can use the macOS runners for any projects in your namespace.
-To request access, open a [limited availability access request](https://gitlab.com/gitlab-com/runner-saas-macos-limited-availability/-/issues/new).
+To request access, open an [access request](https://gitlab.com/gitlab-com/runner-saas-macos-limited-availability/-/issues/new).
The expected turnaround for activation is two business days.
## Quickstart
diff --git a/doc/ci/services/index.md b/doc/ci/services/index.md
index 3ab814200fb..ba3f806c96e 100644
--- a/doc/ci/services/index.md
+++ b/doc/ci/services/index.md
@@ -353,7 +353,7 @@ while only booting up the tested service once.
```yaml
access-service:
stage: build
- image: docker:19.03.1
+ image: docker:20.10.16
services:
- docker:dind # necessary for docker run
- tutum/wordpress:latest
diff --git a/doc/ci/testing/accessibility_testing.md b/doc/ci/testing/accessibility_testing.md
new file mode 100644
index 00000000000..7940b27acf7
--- /dev/null
+++ b/doc/ci/testing/accessibility_testing.md
@@ -0,0 +1,76 @@
+---
+stage: Verify
+group: Pipeline Insights
+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
+---
+
+# Accessibility testing **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25144) in GitLab 12.8.
+
+If your application offers a web interface, you can use
+[GitLab CI/CD](../index.md) to determine the accessibility
+impact of pending code changes.
+
+[Pa11y](https://pa11y.org/) is a free and open source tool for
+measuring the accessibility of web sites. GitLab integrates Pa11y into a
+[CI job template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml).
+The `a11y` job analyzes a defined set of web pages and reports
+accessibility violations, warnings, and notices in a file named
+`accessibility`.
+
+As of [GitLab 14.5](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73309), Pa11y uses
+[WCAG 2.1 rules](https://www.w3.org/TR/WCAG21/#new-features-in-wcag-2-1).
+
+## Accessibility merge request widget
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39425) in GitLab 13.0 behind the disabled [feature flag](../../administration/feature_flags.md) `:accessibility_report_view`.
+> - [Feature Flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/217372) in GitLab 13.1.
+
+GitLab displays an **Accessibility Report** in the merge request widget area:
+
+![Accessibility merge request widget](img/accessibility_mr_widget_v13_0.png)
+
+## Configure accessibility testing
+
+You can run Pa11y with GitLab CI/CD using the
+[GitLab Accessibility Docker image](https://gitlab.com/gitlab-org/ci-cd/accessibility).
+
+To define the `a11y` job for GitLab 12.9 and later:
+
+1. [Include](../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)
+ from your GitLab installation.
+1. Add the following configuration to your `.gitlab-ci.yml` file.
+
+ ```yaml
+ stages:
+ - accessibility
+
+ variables:
+ a11y_urls: "https://about.gitlab.com https://gitlab.com/users/sign_in"
+
+ include:
+ - template: "Verify/Accessibility.gitlab-ci.yml"
+ ```
+
+1. Customize the `a11y_urls` variable to list the URLs of the web pages to test with Pa11y.
+
+The `a11y` job in your CI/CD pipeline generates these files:
+
+- One HTML report per URL listed in the `a11y_urls` variable.
+- One file containing the collected report data. In GitLab versions 12.11 and later, this
+ file is named `gl-accessibility.json`. In GitLab versions 12.10 and earlier, this file
+ is named [`accessibility.json`](https://gitlab.com/gitlab-org/ci-cd/accessibility/-/merge_requests/9).
+
+You can [view job artifacts in your browser](../pipelines/job_artifacts.md#download-job-artifacts).
+
+NOTE:
+For GitLab versions earlier than 12.9, use `include:remote` and
+link to the [current template in the default branch](https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml)
+
+NOTE:
+The job definition provided by the template does not support Kubernetes.
+
+You cannot pass configurations into Pa11y via CI configuration.
+To change the configuration, edit a copy of the template in your CI file.
diff --git a/doc/ci/testing/browser_performance_testing.md b/doc/ci/testing/browser_performance_testing.md
new file mode 100644
index 00000000000..260ecf6108d
--- /dev/null
+++ b/doc/ci/testing/browser_performance_testing.md
@@ -0,0 +1,242 @@
+---
+stage: Verify
+group: Pipeline Insights
+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
+---
+
+# Browser Performance Testing **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3507) in GitLab 10.3.
+
+If your application offers a web interface and you're using
+[GitLab CI/CD](../index.md), you can quickly determine the rendering performance
+impact of pending code changes in the browser.
+
+NOTE:
+You can automate this feature in your applications by using [Auto DevOps](../../topics/autodevops/index.md).
+
+## Overview
+
+GitLab uses [Sitespeed.io](https://www.sitespeed.io), a free and open source
+tool, for measuring the rendering performance of web sites. The
+[Sitespeed plugin](https://gitlab.com/gitlab-org/gl-performance) that GitLab built outputs
+the performance score for each page analyzed in a file called `browser-performance.json`
+this data can be shown on Merge Requests.
+
+## Use cases
+
+Consider the following workflow:
+
+1. A member of the marketing team is attempting to track engagement by adding a new tool.
+1. With browser performance metrics, they see how their changes are impacting the usability
+ of the page for end users.
+1. The metrics show that after their changes, the performance score of the page has gone down.
+1. When looking at the detailed report, they see the new JavaScript library was
+ included in `<head>`, which affects loading page speed.
+1. They ask for help from a front end developer, who sets the library to load asynchronously.
+1. The frontend developer approves the merge request, and authorizes its deployment to production.
+
+## How browser performance testing works
+
+First, define a job in your `.gitlab-ci.yml` file that generates the
+[Browser Performance report artifact](../yaml/artifacts_reports.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.
+
+For an example Browser Performance job, see
+[Configuring Browser Performance Testing](#configuring-browser-performance-testing).
+
+NOTE:
+If the Browser Performance report has no data to compare, such as when you add the
+Browser Performance job in your `.gitlab-ci.yml` for the very first time,
+the Browser Performance report widget doesn't display. It must have run at least
+once on the target branch (`main`, for example), before it displays in a
+merge request targeting that branch.
+
+![Browser Performance Widget](img/browser_performance_testing.png)
+
+## Configuring Browser Performance Testing
+
+This example shows how to run the [sitespeed.io container](https://hub.docker.com/r/sitespeedio/sitespeed.io/)
+on your code by using GitLab CI/CD and [sitespeed.io](https://www.sitespeed.io)
+using Docker-in-Docker.
+
+1. First, set up GitLab Runner with a
+ [Docker-in-Docker build](../docker/using_docker_build.md#use-docker-in-docker).
+1. Configure the default Browser Performance Testing CI/CD job as follows in your `.gitlab-ci.yml` file:
+
+ ```yaml
+ include:
+ template: Verify/Browser-Performance.gitlab-ci.yml
+
+ browser_performance:
+ variables:
+ URL: https://example.com
+ ```
+
+WARNING:
+In GitLab 13.12 and earlier, the job [was named](https://gitlab.com/gitlab-org/gitlab/-/issues/225914) `performance`.
+
+The above example:
+
+- Creates a `browser_performance` job in your CI/CD pipeline and runs sitespeed.io against the webpage you
+ defined in `URL` to gather key metrics.
+- Uses a template that doesn't work with Kubernetes clusters. If you are using a Kubernetes cluster,
+ use [`template: Jobs/Browser-Performance-Testing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml)
+ instead.
+- Uses a CI/CD template that is included in all GitLab installations since 12.4. If you are using
+ 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](../yaml/artifacts_reports.md#artifactsreportsbrowser_performance)
+that you can later download and analyze. This implementation always takes the latest
+Browser Performance artifact available. If [GitLab Pages](../../user/project/pages/index.md) is enabled,
+you can view the report directly in your browser.
+
+You can also customize the jobs with CI/CD variables:
+
+- `SITESPEED_IMAGE`: Configure the Docker image to use for the job (default `sitespeedio/sitespeed.io`), but not the image version.
+- `SITESPEED_VERSION`: Configure the version of the Docker image to use for the job (default `14.1.0`).
+- `SITESPEED_OPTIONS`: Configure any additional sitespeed.io options as required (default `nil`). Refer to the [sitespeed.io documentation](https://www.sitespeed.io/documentation/sitespeed.io/configuration/) for more details.
+
+For example, you can override the number of runs sitespeed.io
+makes on the given URL, and change the version:
+
+```yaml
+include:
+ template: Verify/Browser-Performance.gitlab-ci.yml
+
+browser_performance:
+ variables:
+ URL: https://www.sitespeed.io/
+ SITESPEED_VERSION: 13.2.0
+ SITESPEED_OPTIONS: -n 5
+```
+
+### Configuring degradation threshold
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27599) in GitLab 13.0.
+
+You can configure the sensitivity of degradation alerts to avoid getting alerts for minor drops in metrics.
+This is done by setting the `DEGRADATION_THRESHOLD` CI/CD variable. In the example below, the alert only shows up
+if the `Total Score` metric degrades by 5 points or more:
+
+```yaml
+include:
+ template: Verify/Browser-Performance.gitlab-ci.yml
+
+browser_performance:
+ variables:
+ URL: https://example.com
+ DEGRADATION_THRESHOLD: 5
+```
+
+The `Total Score` metric is based on sitespeed.io's [coach performance score](https://www.sitespeed.io/documentation/sitespeed.io/metrics/#performance-score). There is more information in [the coach documentation](https://www.sitespeed.io/documentation/coach/how-to/#what-do-the-coach-do).
+
+### Performance testing on Review Apps
+
+The above CI YAML configuration is great for testing against static environments, and it can
+be extended for dynamic environments, but a few extra steps are required:
+
+1. The `browser_performance` job should run after the dynamic environment has started.
+1. In the `review` job:
+ 1. Generate a URL list file with the dynamic URL.
+ 1. Save the file as an artifact, for example with `echo $CI_ENVIRONMENT_URL > environment_url.txt`
+ in your job's `script`.
+ 1. Pass the list as the URL environment variable (which can be a URL or a file containing URLs)
+ to the `browser_performance` job.
+1. You can now run the sitespeed.io container against the desired hostname and
+ paths.
+
+Your `.gitlab-ci.yml` file would look like:
+
+```yaml
+stages:
+ - deploy
+ - performance
+
+include:
+ template: Verify/Browser-Performance.gitlab-ci.yml
+
+review:
+ stage: deploy
+ environment:
+ name: review/$CI_COMMIT_REF_SLUG
+ url: http://$CI_COMMIT_REF_SLUG.$APPS_DOMAIN
+ script:
+ - run_deploy_script
+ - echo $CI_ENVIRONMENT_URL > environment_url.txt
+ artifacts:
+ paths:
+ - environment_url.txt
+ only:
+ - branches
+ except:
+ - master
+
+browser_performance:
+ dependencies:
+ - review
+ variables:
+ URL: environment_url.txt
+```
+
+### GitLab versions 13.2 and earlier
+
+Browser Performance Testing has gone through several changes since its introduction.
+In this section we detail these changes and how you can run the test based on your
+GitLab version:
+
+- In 13.2 the feature was renamed from `Performance` to `Browser Performance` with additional
+ template CI/CD variables.
+- In GitLab 12.4 [a job template was made available](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml).
+- For 11.5 to 12.3 no template is available and the job has to be defined manually as follows:
+
+ ```yaml
+ performance:
+ stage: performance
+ image: docker:git
+ variables:
+ URL: https://example.com
+ SITESPEED_VERSION: 14.1.0
+ SITESPEED_OPTIONS: ''
+ services:
+ - docker:stable-dind
+ script:
+ - mkdir gitlab-exporter
+ - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
+ - mkdir sitespeed-results
+ - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL $SITESPEED_OPTIONS
+ - mv sitespeed-results/data/performance.json performance.json
+ artifacts:
+ paths:
+ - performance.json
+ - sitespeed-results/
+ reports:
+ performance: performance.json
+ ```
+
+- For 11.4 and earlier the job should be defined as follows:
+
+ ```yaml
+ performance:
+ stage: performance
+ image: docker:git
+ variables:
+ URL: https://example.com
+ services:
+ - docker:stable-dind
+ script:
+ - mkdir gitlab-exporter
+ - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
+ - mkdir sitespeed-results
+ - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:6.3.1 --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL
+ - mv sitespeed-results/data/performance.json performance.json
+ artifacts:
+ paths:
+ - performance.json
+ - sitespeed-results/
+ ```
+
+Upgrading to the latest version and using the templates is recommended, to ensure
+you receive the latest updates, including updates to the sitespeed.io versions.
diff --git a/doc/ci/testing/code_quality.md b/doc/ci/testing/code_quality.md
new file mode 100644
index 00000000000..401279b9601
--- /dev/null
+++ b/doc/ci/testing/code_quality.md
@@ -0,0 +1,636 @@
+---
+stage: Secure
+group: Static Analysis
+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
+---
+
+# Code Quality **(FREE)**
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
+
+To ensure your project's code stays simple, readable, and easy to contribute to,
+you can use [GitLab CI/CD](../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 [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](../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).
+
+## Summary of features per tier
+
+Different features are available in different [GitLab tiers](https://about.gitlab.com/pricing/),
+as shown in the following table:
+
+| Capability | In Free | In Premium | In Ultimate |
+|:----------------------------------------------------------------------|:--------------------|:--------------------|:-------------------|
+| [Configure scanners](#configuring-jobs-using-variables) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [Integrate custom scanners](#implementing-a-custom-tool) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [Generate JSON or HTML report artifacts](#generate-an-html-report) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [See findings in merge request widget](#code-quality-widget) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [See reports in CI pipelines](#code-quality-reports) | **{dotted-circle}** | **{check-circle}** | **{check-circle}** |
+| [See findings in merge request diff view](#code-quality-in-diff-view) | **{dotted-circle}** | **{dotted-circle}** | **{check-circle}** |
+
+## Code Quality Widget
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
+
+Going a step further, GitLab can show the Code Quality report right
+in the merge request widget area if a report from the target branch is available to compare to:
+
+![Code Quality Widget](img/code_quality_widget_13_11.png)
+
+Watch a quick walkthrough of Code Quality in action:
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=B32LxtJKo9M">Code Quality: Speed Run</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube.com/embed/B32LxtJKo9M" frameborder="0" allowfullscreen="true"> </iframe>
+</figure>
+
+NOTE:
+For one customer, the auditor found that having Code Quality, SAST, and Container Scanning all automated in GitLab CI/CD was almost better than a manual review! [Read more](https://about.gitlab.com/customers/bi_worldwide/).
+
+See also the Code Climate list of [Supported Languages for Maintainability](https://docs.codeclimate.com/docs/supported-languages-for-maintainability).
+
+## Code Quality in diff view **(ULTIMATE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267612) in GitLab 13.11, disabled by default behind the `codequality_mr_diff` [feature flag](../../administration/feature_flags.md).
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) in GitLab 13.12.
+> - [Disabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) in GitLab 14.0 due to [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/334116).
+> - [Inline annotation added](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) and [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) 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_2.png)
+
+## Example configuration
+
+This example shows how to run Code Quality on your code by using GitLab CI/CD and Docker.
+
+- Using shared runners, the job should be configured For the [Docker-in-Docker workflow](../docker/using_docker_build.md#use-docker-in-docker).
+- Using private runners, there is an [alternative configuration](#set-up-a-private-runner-for-code-quality-without-docker-in-docker) recommended for running Code Quality analysis more efficiently.
+
+In either configuration, the runner must have enough disk space to handle generated Code Quality files. For example on the [GitLab project](https://gitlab.com/gitlab-org/gitlab) the files are approximately 7 GB.
+
+Once you set up GitLab Runner, include the [Code Quality template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml) in your CI configuration:
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+```
+
+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](../yaml/artifacts_reports.md#artifactsreportscodequality)
+that you can later download and analyze.
+
+It's also possible to override the URL to the Code Quality image by
+setting the `CODE_QUALITY_IMAGE` CI/CD variable. This is particularly useful if you want
+to lock in a specific version of Code Quality, or use a fork of it:
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality:
+ variables:
+ CODE_QUALITY_IMAGE: "registry.example.com/codequality-fork:latest"
+```
+
+In [GitLab 13.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/11100), you can override the [Code Quality environment variables](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables):
+
+```yaml
+variables:
+ TIMEOUT_SECONDS: 1
+
+include:
+ - template: Code-Quality.gitlab-ci.yml
+```
+
+By default, report artifacts are not downloadable. If you need them downloadable on the
+job details page, you can add `gl-code-quality-report.json` to the artifact paths like so:
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality:
+ artifacts:
+ paths: [gl-code-quality-report.json]
+```
+
+The included `code_quality` job is running in the `test` stage, so it needs to be included in your CI configuration, like so:
+
+```yaml
+stages:
+ - test
+```
+
+NOTE:
+This information is automatically extracted and shown right in the merge request widget.
+
+WARNING:
+On self-managed instances, if a malicious actor compromises the Code Quality job
+definition they could execute privileged Docker commands on the runner
+host. Having proper access control policies mitigates this attack vector by
+allowing access only to trusted actors.
+
+### Set up a private runner for code quality without Docker-in-Docker
+
+It's possible to configure your own runners and avoid Docker-in-Docker. You can use a
+configuration that may greatly speed up job execution without requiring your runners
+to operate in privileged mode.
+
+This alternative configuration uses socket binding to share the Runner's Docker daemon
+with the job environment. Be aware that this configuration [has significant considerations](../docker/using_docker_build.md#use-docker-socket-binding)
+to be consider, but may be preferable depending on your use case.
+
+1. Register a new runner:
+
+ ```shell
+ $ gitlab-runner register --executor "docker" \
+ --docker-image="docker:stable" \
+ --url "https://gitlab.com/" \
+ --description "cq-sans-dind" \
+ --tag-list "cq-sans-dind" \
+ --locked="false" \
+ --access-level="not_protected" \
+ --docker-volumes "/cache"\
+ --docker-volumes "/builds:/builds"\
+ --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
+ --registration-token="<project_token>" \
+ --non-interactive
+ ```
+
+1. **Optional, but recommended:** Set the builds directory to `/tmp/builds`,
+ so job artifacts are periodically purged from the runner host. If you skip
+ this step, you must clean up the default builds directory (`/builds`) yourself.
+ You can do this by adding the following two flags to `gitlab-runner register`
+ in the previous step.
+
+ ```shell
+ --builds-dir "/tmp/builds"
+ --docker-volumes "/tmp/builds:/tmp/builds" # Use this instead of --docker-volumes "/builds:/builds"
+ ```
+
+ The resulting configuration:
+
+ ```toml
+ [[runners]]
+ name = "cq-sans-dind"
+ url = "https://gitlab.com/"
+ token = "<project_token>"
+ executor = "docker"
+ builds_dir = "/tmp/builds"
+ [runners.docker]
+ tls_verify = false
+ image = "docker:stable"
+ privileged = false
+ disable_entrypoint_overwrite = false
+ oom_kill_disable = false
+ disable_cache = false
+ volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock", "/tmp/builds:/tmp/builds"]
+ shm_size = 0
+ [runners.cache]
+ [runners.cache.s3]
+ [runners.cache.gcs]
+ ```
+
+1. Apply two overrides to the `code_quality` job created by the template:
+
+ ```yaml
+ include:
+ - template: Code-Quality.gitlab-ci.yml
+
+ code_quality:
+ services: # Shut off Docker-in-Docker
+ tags:
+ - cq-sans-dind # Set this job to only run on our new specialized runner
+ ```
+
+The end result is that:
+
+- Privileged mode is not used.
+- Docker-in-Docker is not used.
+- Docker images, including all CodeClimate images, are cached, and not re-fetched for subsequent jobs.
+
+With this configuration, the run time for a second pipeline is much shorter. For example
+this [small change](https://gitlab.com/drew/test-code-quality-template/-/merge_requests/4/diffs?commit_id=1e705607aef7236c1b20bb6f637965f3f3e53a46)
+to an [open merge request](https://gitlab.com/drew/test-code-quality-template/-/merge_requests/4/pipelines)
+running Code Quality analysis ran significantly faster the second time:
+
+![Code Quality sequential runs without DinD](img/code_quality_host_bound_sequential.png)
+
+This configuration is not possible on `gitlab.com` shared runners. Shared runners
+are configured with `privileged=true`, and they do not expose `docker.sock` into
+the job container. As a result, socket binding cannot be used to make `docker` available
+in the context of the job script.
+
+[Docker-in-Docker](../docker/using_docker_build.md#use-docker-in-docker)
+was chosen as an operational decision by the runner team, instead of exposing `docker.sock`.
+
+### 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](../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](../variables/index.md#custom-cicd-variables).
+- For a single pipeline run:
+
+ 1. Go to **CI/CD > Pipelines**
+ 1. Select **Run pipeline**
+ 1. Add `CODE_QUALITY_DISABLED` as the variable key, with any value.
+
+### Using with merge request pipelines
+
+The configuration provided by the Code Quality template does not let the `code_quality` job
+run on [merge request pipelines](../pipelines/merge_request_pipelines.md).
+
+If merge request pipelines is enabled, the `code_quality:rules` must be redefined.
+
+The template has these [`rules`](../yaml/index.md#rules) for the `code quality` job:
+
+```yaml
+code_quality:
+ rules:
+ - if: $CODE_QUALITY_DISABLED
+ when: never
+ - if: $CI_COMMIT_TAG || $CI_COMMIT_BRANCH
+```
+
+If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../yaml/index.md#workflow))
+might look like this example:
+
+```yaml
+job1:
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Run job1 in merge request pipelines
+ - if: $CI_COMMIT_BRANCH == "main" # Run job1 in pipelines on the main branch (but not in other branch pipelines)
+ - if: $CI_COMMIT_TAG # Run job1 in pipelines for tags
+```
+
+To make these work together, you need to overwrite the code quality `rules`
+so that they match your current `rules`. From the example above, it could look like:
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality:
+ rules:
+ - if: $CODE_QUALITY_DISABLED
+ when: never
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Run code quality job in merge request pipelines
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run code quality job in pipelines on the default branch (but not in other branch pipelines)
+ - if: $CI_COMMIT_TAG # Run code quality job in pipelines for tags
+```
+
+### Configure Code Quality to use a private container image registry
+
+> [Introduced](https://gitlab.com/gitlab-org/ci-cd/codequality/-/merge_requests/30) in 13.7.
+
+To reduce network time and external dependency, you can use your own
+container image registry to host the Code Quality Docker images. Because of
+the nested architecture of container execution, the registry prefix must
+be specifically configured to be passed down into CodeClimate's subsequent
+`docker pull` commands for individual engines.
+
+The following two variables can address all of the required image pulls:
+
+- `CODE_QUALITY_IMAGE`: A fully prefixed image name that can be located anywhere
+ accessible from your job environment. GitLab Container Registry can be used here
+ to host your own copy.
+- `CODECLIMATE_PREFIX`: The domain of your intended container image registry. This
+ is a configuration option supported by [CodeClimate CLI](https://github.com/codeclimate/codeclimate/pull/948). You must:
+ - Include a trailing slash (`/`).
+ - Not include a protocol prefix, such as `https://`.
+
+```yaml
+include:
+ - template: Jobs/Code-Quality.gitlab-ci.yml
+
+code_quality:
+ variables:
+ CODE_QUALITY_IMAGE: "my-private-registry.local:12345/codequality:0.85.24"
+ CODECLIMATE_PREFIX: "my-private-registry.local:12345/"
+```
+
+The images in the private container image registry must be available without authentication.
+Follow [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/355814) for more information.
+
+This example is specific to GitLab Code Quality. For more general
+instructions on how to configure DinD with a registry mirror, see the
+relevant [documentation](../docker/using_docker_build.md#enable-registry-mirror-for-dockerdind-service).
+
+## Configuring jobs using variables
+
+The Code Quality job supports environment variables that users can set to
+configure job execution at runtime.
+
+For a list of available environment variables, see
+[Environment variables](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables).
+
+## Implementing a custom tool
+
+It's possible to have a custom tool provide Code Quality reports in GitLab. To
+do this:
+
+1. Define a job in your `.gitlab-ci.yml` file that generates the
+ [Code Quality report artifact](../yaml/artifacts_reports.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).
+
+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` or `location.positions.begin.line` | The line on which the code quality violation occurred. |
+
+Example:
+
+```json
+[
+ {
+ "description": "'unused' is assigned a value but never used.",
+ "fingerprint": "7815696ecbf1c96e6894b779456d330e",
+ "severity": "minor",
+ "location": {
+ "path": "lib/index.js",
+ "lines": {
+ "begin": 42
+ }
+ }
+ }
+]
+```
+
+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)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21527) in GitLab 12.9.
+
+![Code Quality Report](img/code_quality_report_13_11.png)
+
+After the Code Quality job completes:
+
+- Potential changes to code quality are shown directly in the merge request.
+ The Code Quality widget in the merge request compares the reports from the base and head of the branch,
+ then lists any violations that are resolved or created when the branch is merged.
+- The full JSON report is available as a
+ [downloadable artifact](../pipelines/job_artifacts.md#download-job-artifacts)
+ for the `code_quality` job.
+- The full list of code quality violations generated by a pipeline is shown in the
+ Code Quality tab of the Pipeline Details page.
+
+## 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`
+CI/CD variable to `html`. This is useful if you just want to view the report in a more
+human-readable format or to publish this artifact on GitLab Pages for even
+easier reviewing.
+
+To generate both JSON and HTML report files, add another job to your template by using `extends: code_quality`:
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality_html:
+ extends: code_quality
+ variables:
+ REPORT_FORMAT: html
+ artifacts:
+ paths: [gl-code-quality-report.html]
+```
+
+NOTE:
+Adding a job means your code is scanned twice: once to generate a JSON report and once to generate an HTML report.
+
+You can also generate _only_ an HTML report instead of the standard JSON report. To do so, set `REPORT_FORMAT` to `html` in the existing job:
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality:
+ variables:
+ REPORT_FORMAT: html
+ artifacts:
+ paths: [gl-code-quality-report.html]
+```
+
+WARNING:
+If you only generate an HTML report, you can't see your results in the [merge request widget](#code-quality-widget), [pipeline report](#code-quality-reports), or [diff view](#code-quality-in-diff-view).
+These features require a JSON report.
+
+## Extending functionality
+
+### Using Analysis Plugins
+
+Should there be a need to extend the default functionality provided by Code Quality, as stated in [Code Quality](#code-quality), [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) are available.
+
+For example, to use the [SonarJava analyzer](https://docs.codeclimate.com/docs/sonar-java),
+add a file named `.codeclimate.yml` containing the [enablement code](https://docs.codeclimate.com/docs/sonar-java#enable-the-plugin)
+for the plugin to the root of your repository:
+
+```yaml
+version: "2"
+plugins:
+ sonar-java:
+ enabled: true
+```
+
+This adds SonarJava to the `plugins:` section of the [default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template)
+included in your project.
+
+Changes to the `plugins:` section do not affect the `exclude_patterns` section of the
+default `.codeclimate.yml`. See the Code Climate documentation for
+[excluding files and folders](https://docs.codeclimate.com/docs/excluding-files-and-folders)
+for more details.
+
+Here's [an example project](https://gitlab.com/jheimbuck_gl/jh_java_example_project) that uses Code Quality with a `.codeclimate.yml` file.
+
+## Use a Code Quality image hosted in a registry with untrusted certificates
+
+If you set the `CODE_QUALITY_IMAGE` to an image that is hosted in a
+Docker registry which uses a TLS certificate that is not trusted, such as
+a self-signed certificate, you can see errors like the one below:
+
+```shell
+$ docker pull --quiet "$CODE_QUALITY_IMAGE"
+Error response from daemon: Get https://gitlab.example.com/v2/: x509: certificate signed by unknown authority
+```
+
+To fix this, configure the Docker daemon to [trust certificates](https://docs.docker.com/registry/insecure/#use-self-signed-certificates)
+by putting the certificate inside of the `/etc/docker/certs.d`
+directory.
+
+This Docker daemon is exposed to the subsequent Code Quality Docker container in the
+[GitLab Code Quality template](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml#L41)
+and should be to exposed any other containers in which you want to have
+your certificate configuration apply.
+
+### Docker
+
+If you have access to GitLab Runner configuration, add the directory as a
+[volume mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section). For example:
+
+```toml
+[[runners]]
+ ...
+ executor = "docker"
+ [runners.docker]
+ ...
+ privileged = true
+ volumes = ["/cache", "/etc/gitlab-runner/certs/gitlab.example.com.crt:/etc/docker/certs.d/gitlab.example.com/ca.crt:ro"]
+```
+
+Replace `gitlab.example.com` with the actual domain of the registry.
+
+### Kubernetes
+
+If you have access to GitLab Runner configuration and the Kubernetes cluster,
+you can [mount a ConfigMap](https://docs.gitlab.com/runner/executors/kubernetes.html#configmap-volumes):
+
+1. Create a ConfigMap with the certificate:
+
+ ```shell
+ kubectl create configmap registry-crt --namespace gitlab-runner --from-file /etc/gitlab-runner/certs/gitlab.example.com.crt
+ ```
+
+1. Update GitLab Runner `config.toml` to specify the ConfigMap:
+
+ ```toml
+ [[runners]]
+ ...
+ executor = "kubernetes"
+ [runners.kubernetes]
+ image = "alpine:3.12"
+ privileged = true
+ [[runners.kubernetes.volumes.config_map]]
+ name = "registry-crt"
+ mount_path = "/etc/docker/certs.d/gitlab.example.com/ca.crt"
+ sub_path = "gitlab.example.com.crt"
+ ```
+
+Replace `gitlab.example.com` with the actual domain of the registry.
+
+## Troubleshooting
+
+### Changing the default configuration has no effect
+
+A common issue is that the terms `Code Quality` (GitLab specific) and `Code Climate`
+(Engine used by GitLab) are very similar. You must add a **`.codeclimate.yml`** file
+to change the default configuration, **not** a `.codequality.yml` file. If you use
+the wrong filename, the [default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template)
+is still used.
+
+### No Code Quality report is displayed in a merge request
+
+This can be due to multiple reasons:
+
+- You just added the Code Quality job in your `.gitlab-ci.yml`. The report does not
+ have anything to compare to yet, so no information can be displayed. It only displays
+ after future merge requests have something to compare to.
+- 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. In this situation you will see an error stating `Base pipeline codequality artifact not found`.
+- If no [degradation or error is detected](https://docs.codeclimate.com/docs/maintainability#section-checks),
+ nothing is displayed.
+- The [`artifacts:expire_in`](../yaml/index.md#artifactsexpire_in) CI/CD
+ setting can cause the Code Quality artifacts 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.
+- Large `gl-code-quality-report.json` files (esp. >10 MB) are [known to prevent the report from being displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/2737).
+ As a work-around, try removing [properties](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types)
+ that are [ignored by GitLab](#implementing-a-custom-tool). You can:
+ - Configure the Code Quality tool to not output those types.
+ - Use `sed`, `awk` or similar commands in the `.gitlab-ci.yml` script to
+ edit the `gl-code-quality-report.json` before the job completes.
+
+### Only a single Code Quality report is displayed, but more are defined
+
+GitLab only uses the Code Quality artifact from the latest created job (with the largest job ID).
+If multiple jobs in a pipeline generate a code quality artifact, those of earlier jobs are ignored.
+To avoid confusion, configure only one job to generate a `gl-code-quality-report.json`.
+
+### RuboCop errors
+
+When using Code Quality jobs on a Ruby project, you can encounter problems running RuboCop.
+For example, the following error can appear when using either a very recent or very old version
+of Ruby:
+
+```plaintext
+/usr/local/bundle/gems/rubocop-0.52.1/lib/rubocop/config.rb:510:in `check_target_ruby':
+Unknown Ruby version 2.7 found in `.ruby-version`. (RuboCop::ValidationError)
+Supported versions: 2.1, 2.2, 2.3, 2.4, 2.5
+```
+
+This is caused by the default version of RuboCop used by the check engine not covering
+support for the Ruby version in use.
+
+To use a custom version of RuboCop that
+[supports the version of Ruby used by the project](https://docs.rubocop.org/rubocop/compatibility.html#support-matrix),
+you can [override the configuration through a `.codeclimate.yml` file](https://docs.codeclimate.com/docs/rubocop#using-rubocops-newer-versions)
+created in the project repository.
+
+For example, to specify using RuboCop release **0.67**:
+
+```yaml
+version: "2"
+plugins:
+ rubocop:
+ enabled: true
+ channel: rubocop-0-67
+```
+
+### No Code Quality appears on merge requests when using custom tool
+
+If your merge requests do not show any code quality changes when using a custom tool,
+ensure that the line property is an `integer`.
+
+### Code Quality CI job with Code Climate plugins enabled fails with error
+
+If you enabled any of the Code Climate plugins, and the Code Quality CI job fails with the error
+below, it's likely the job takes longer than the default timeout of 900 seconds:
+
+```shell
+error: (CC::CLI::Analyze::EngineFailure) engine pmd ran for 900 seconds and was killed
+Could not analyze code quality for the repository at /code
+```
+
+To work around this problem, set `TIMEOUT_SECONDS` to a higher value in your `.gitlab.-ci.yml` file.
+
+For example:
+
+```yaml
+variables:
+ TIMEOUT_SECONDS: 3600
+```
diff --git a/doc/ci/testing/fail_fast_testing.md b/doc/ci/testing/fail_fast_testing.md
new file mode 100644
index 00000000000..7b95b1ac54a
--- /dev/null
+++ b/doc/ci/testing/fail_fast_testing.md
@@ -0,0 +1,97 @@
+---
+stage: Verify
+group: Pipeline Insights
+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
+---
+
+# Fail Fast Testing **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/198550) in GitLab 13.1.
+
+For applications that use RSpec for running tests, we've introduced the `Verify/Failfast`
+[template to run subsets of your test suite](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml),
+based on the changes in your merge request.
+
+The template uses the [test_file_finder (`tff`) gem](https://gitlab.com/gitlab-org/ci-cd/test_file_finder/)
+that accepts a list of files as input, and returns a list of spec (test) files
+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](../yaml/index.md#stage-pre) of a GitLab CI/CD pipeline,
+before all other stages.
+
+## Example use case
+
+Fail fast testing is useful when adding new functionality to a project and adding
+new automated tests.
+
+Your project could have hundreds of thousands of tests that take a long time to complete.
+You may be confident that a new test will pass, but you have to wait for all the tests
+to complete to verify it. This could take an hour or more, even when using parallelization.
+
+Fail fast testing gives you a faster feedback loop from the pipeline. It lets you
+know quickly that the new tests are passing and the new functionality did not break
+other tests.
+
+## Requirements
+
+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 [Merge request pipelines](../pipelines/merge_request_pipelines.md#prerequisites)
+- [Merged results pipelines](../pipelines/merged_results_pipelines.md#enable-merged-results-pipelines)
+ enabled in the project settings.
+- A Docker image with Ruby available. The template uses `image: ruby:2.6` by default, but you [can override](../yaml/includes.md#override-included-configuration-values) this.
+
+## Configuring Fast RSpec Failure
+
+We use the following plain RSpec configuration as a starting point. It installs all the
+project gems and executes `rspec`, on merge request pipelines only.
+
+```yaml
+rspec-complete:
+ stage: test
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ script:
+ - bundle install
+ - bundle exec rspec
+```
+
+To run the most relevant specs first instead of the whole suite, [`include`](../yaml/index.md#include)
+the template by adding the following to your CI/CD configuration:
+
+```yaml
+include:
+ - template: Verify/FailFast.gitlab-ci.yml
+```
+
+To customize the job, specific options may be set to override the template. For example, to override the default Docker image:
+
+```yaml
+include:
+ - template: Verify/FailFast.gitlab-ci.yml
+
+rspec-rails-modified-path-specs:
+ image: custom-docker-image-with-ruby
+```
+
+### Example test loads
+
+For illustrative purposes, let's say our Rails app spec suite consists of 100 specs per model for ten models.
+
+If no Ruby files are changed:
+
+- `rspec-rails-modified-paths-specs` does not run any tests.
+- `rspec-complete` runs the full suite of 1000 tests.
+
+If one Ruby model is changed, for example `app/models/example.rb`, then `rspec-rails-modified-paths-specs`
+runs the 100 tests for `example.rb`:
+
+- If all of these 100 tests pass, then the full `rspec-complete` suite of 1000 tests is allowed to run.
+- If any of these 100 tests fail, they fail quickly, and `rspec-complete` does not run any tests.
+
+The final case saves resources and time as the full 1000 test suite does not run.
diff --git a/doc/user/project/merge_requests/img/accessibility_mr_widget_v13_0.png b/doc/ci/testing/img/accessibility_mr_widget_v13_0.png
index 4ada7e25b65..4ada7e25b65 100644
--- a/doc/user/project/merge_requests/img/accessibility_mr_widget_v13_0.png
+++ b/doc/ci/testing/img/accessibility_mr_widget_v13_0.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/browser_performance_testing.png b/doc/ci/testing/img/browser_performance_testing.png
index a3d7022bcfc..a3d7022bcfc 100644
--- a/doc/user/project/merge_requests/img/browser_performance_testing.png
+++ b/doc/ci/testing/img/browser_performance_testing.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/code_quality_host_bound_sequential.png b/doc/ci/testing/img/code_quality_host_bound_sequential.png
index 2b31f3b42ee..2b31f3b42ee 100644
--- a/doc/user/project/merge_requests/img/code_quality_host_bound_sequential.png
+++ b/doc/ci/testing/img/code_quality_host_bound_sequential.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14_2.png b/doc/ci/testing/img/code_quality_mr_diff_report_v14_2.png
index c1e9aad24ac..c1e9aad24ac 100644
--- a/doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14_2.png
+++ b/doc/ci/testing/img/code_quality_mr_diff_report_v14_2.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/code_quality_report_13_11.png b/doc/ci/testing/img/code_quality_report_13_11.png
index 36341548328..36341548328 100644
--- a/doc/user/project/merge_requests/img/code_quality_report_13_11.png
+++ b/doc/ci/testing/img/code_quality_report_13_11.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/code_quality_widget_13_11.png b/doc/ci/testing/img/code_quality_widget_13_11.png
index 57978a0ed96..57978a0ed96 100644
--- a/doc/user/project/merge_requests/img/code_quality_widget_13_11.png
+++ b/doc/ci/testing/img/code_quality_widget_13_11.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/load_performance_testing.png b/doc/ci/testing/img/load_performance_testing.png
index d5623867ee7..d5623867ee7 100644
--- a/doc/user/project/merge_requests/img/load_performance_testing.png
+++ b/doc/ci/testing/img/load_performance_testing.png
Binary files differ
diff --git a/doc/ci/img/metrics_reports_advanced_v13_0.png b/doc/ci/testing/img/metrics_reports_advanced_v13_0.png
index e96fdcf620a..e96fdcf620a 100644
--- a/doc/ci/img/metrics_reports_advanced_v13_0.png
+++ b/doc/ci/testing/img/metrics_reports_advanced_v13_0.png
Binary files differ
diff --git a/doc/ci/img/metrics_reports_v13_0.png b/doc/ci/testing/img/metrics_reports_v13_0.png
index 1597031db0b..1597031db0b 100644
--- a/doc/ci/img/metrics_reports_v13_0.png
+++ b/doc/ci/testing/img/metrics_reports_v13_0.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/test_coverage_visualization_v12_9.png b/doc/ci/testing/img/test_coverage_visualization_v12_9.png
index 1922a566dd5..1922a566dd5 100644
--- a/doc/user/project/merge_requests/img/test_coverage_visualization_v12_9.png
+++ b/doc/ci/testing/img/test_coverage_visualization_v12_9.png
Binary files differ
diff --git a/doc/ci/testing/img/unit_test_report_screenshot_v13_12.png b/doc/ci/testing/img/unit_test_report_screenshot_v13_12.png
new file mode 100644
index 00000000000..d5b1775b4ca
--- /dev/null
+++ b/doc/ci/testing/img/unit_test_report_screenshot_v13_12.png
Binary files differ
diff --git a/doc/ci/testing/index.md b/doc/ci/testing/index.md
index 52af329873f..a8f06ec695c 100644
--- a/doc/ci/testing/index.md
+++ b/doc/ci/testing/index.md
@@ -9,18 +9,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Use GitLab CI/CD to test the changes included in a feature branch. You can also
display reports or link to important information directly from [merge requests](../../user/project/merge_requests/index.md).
-| Feature | Description |
-|-------------------------------------------------------------------------------------------------|-------------|
-| [Accessibility Testing](../../user/project/merge_requests/accessibility_testing.md) | Automatically report A11y violations for changed pages in merge requests. |
-| [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. |
-| [Code Quality](../../user/project/merge_requests/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](../yaml/index.md#artifactsexpose_as) | Configure CI pipelines with the `artifacts:expose_as` parameter to directly link to selected [artifacts](../pipelines/job_artifacts.md) in merge requests. |
-| [Unit test reports](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](../../user/compliance/license_compliance/index.md) | Manage the licenses of your dependencies. |
-| [Metrics Reports](../metrics_reports.md) | Display the Metrics Report on the merge request so that it's fast and easier to identify changes to important metrics. |
-| [Test Coverage visualization](../../user/project/merge_requests/test_coverage_visualization.md) | See test coverage results for merge requests, in the file diff. |
-| [Fail fast testing](../../user/project/merge_requests/fail_fast_testing.md#fail-fast-testing) | Run a subset of your RSpec test suite, so failed tests stop the pipeline before the full suite of tests run, saving resources. |
+| Feature | Description |
+|-------------------------------------------------------------------------|-------------|
+| [Accessibility Testing](accessibility_testing.md) | Automatically report A11y violations for changed pages in merge requests. |
+| [Browser Performance Testing](browser_performance_testing.md) | Quickly determine the browser performance impact of pending code changes. |
+| [Load Performance Testing](load_performance_testing.md) | 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](../yaml/index.md#artifactsexpose_as) | Configure CI pipelines with the `artifacts:expose_as` parameter to directly link to selected [artifacts](../pipelines/job_artifacts.md) in merge requests. |
+| [Unit test reports](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](../../user/compliance/license_compliance/index.md) | Manage the licenses of your dependencies. |
+| [Metrics Reports](metrics_reports.md) | Display the Metrics Report on the merge request so that it's fast and easier to identify changes to important metrics. |
+| [Test Coverage visualization](test_coverage_visualization.md) | See test coverage results for merge requests, in the file diff. |
+| [Fail fast testing](fail_fast_testing.md) | Run a subset of your RSpec test suite, so failed tests stop the pipeline before the full suite of tests run, saving resources. |
## Security Reports **(ULTIMATE)**
diff --git a/doc/ci/testing/load_performance_testing.md b/doc/ci/testing/load_performance_testing.md
new file mode 100644
index 00000000000..ae177958beb
--- /dev/null
+++ b/doc/ci/testing/load_performance_testing.md
@@ -0,0 +1,201 @@
+---
+stage: Verify
+group: Pipeline Insights
+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
+---
+
+# Load Performance Testing **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10683) in GitLab 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](../index.md).
+
+GitLab uses [k6](https://k6.io/), a free and open source
+tool, for measuring the system performance of applications under
+load.
+
+Unlike [Browser Performance Testing](browser_performance_testing.md), which is
+used to measure how web sites perform in client browsers, Load Performance Testing
+can be used to perform various types of [load tests](https://k6.io/docs/#use-cases)
+against application endpoints such as APIs, Web Controllers, and so on.
+This can be used to test how the backend or the server performs at scale.
+
+For example, you can use Load Performance Testing to perform many concurrent
+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](../yaml/artifacts_reports.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:
+
+![Load Performance Widget](img/load_performance_testing.png)
+
+Next, you need to configure the test environment and write the k6 test.
+
+The key performance metrics that the merge request widget shows after the test completes are:
+
+- Checks: The percentage pass rate of the [checks](https://k6.io/docs/using-k6/checks) configured in the k6 test.
+- TTFB P90: The 90th percentile of how long it took to start receiving responses, aka the [Time to First Byte](https://en.wikipedia.org/wiki/Time_to_first_byte) (TTFB).
+- TTFB P95: The 95th percentile for TTFB.
+- RPS: The average requests per second (RPS) rate the test was able to achieve.
+
+NOTE:
+If the Load Performance report has no data to compare, such as when you add the
+Load Performance job in your `.gitlab-ci.yml` for the very first time,
+the Load Performance report widget doesn't display. It must have run at least
+once on the target branch (`main`, for example), before it displays in a
+merge request targeting that branch.
+
+## Configure the Load Performance Testing job
+
+Configuring your Load Performance Testing job can be broken down into several distinct parts:
+
+- Determine the test parameters such as throughput, and so on.
+- Set up the target test environment for load performance testing.
+- Design and write the k6 test.
+
+### Determine the test parameters
+
+The first thing you need to do is determine the [type of load test](https://k6.io/docs/test-types/introduction)
+you want to run, and how it will run (for example, the number of users, throughput, and so on).
+
+Refer to the [k6 docs](https://k6.io/docs/), especially the [k6 testing guides](https://k6.io/docs/testing-guides),
+for guidance on the above and more.
+
+### Test Environment setup
+
+A large part of the effort around load performance testing is to prepare the target test environment
+for high loads. You should ensure it's able to handle the
+[throughput](https://k6.io/blog/monthly-visits-concurrent-users) it will be tested with.
+
+It's also typically required to have representative test data in the target environment
+for the load performance test to use.
+
+We strongly recommend [not running these tests against a production environment](https://k6.io/our-beliefs#load-test-in-a-pre-production-environment).
+
+### Write the load performance test
+
+After the environment is prepared, you can write the k6 test itself. k6 is a flexible
+tool and can be used to run [many kinds of performance tests](https://k6.io/docs/test-types/introduction).
+Refer to the [k6 documentation](https://k6.io/docs/) for detailed information on how to write tests.
+
+### Configure the test in GitLab CI/CD
+
+When your k6 test is ready, the next step is to configure the load performance
+testing job in GitLab CI/CD. The easiest way to do this is to use the
+[`Verify/Load-Performance-Testing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml)
+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](../runners/saas/linux_saas_runner.md)
+likely have insufficient specs to handle most large k6 tests.
+
+This template runs the
+[k6 Docker container](https://hub.docker.com/r/loadimpact/k6/) in the job and provides several ways to customize the
+job.
+
+An example configuration workflow:
+
+1. Set up GitLab Runner to run Docker containers, like the
+ [Docker-in-Docker workflow](../docker/using_docker_build.md#use-docker-in-docker).
+1. Configure the default Load Performance Testing CI/CD job in your `.gitlab-ci.yml` file.
+ You need to include the template and configure it with CI/CD variables:
+
+ ```yaml
+ include:
+ template: Verify/Load-Performance-Testing.gitlab-ci.yml
+
+ load_performance:
+ variables:
+ K6_TEST_FILE: <PATH TO K6 TEST FILE IN PROJECT>
+ ```
+
+The above example creates a `load_performance` job in your CI/CD pipeline that runs
+the k6 test.
+
+NOTE:
+For Kubernetes setups a different template should be used: [`Jobs/Load-Performance-Testing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Load-Performance-Testing.gitlab-ci.yml).
+
+k6 has [various options](https://k6.io/docs/using-k6/options) to configure how it will run tests, such as what throughput (RPS) to run with,
+how long the test should run, and so on. Almost all options can be configured in the test itself, but as
+you can also pass command line options via the `K6_OPTIONS` variable.
+
+For example, you can override the duration of the test with a CLI option:
+
+```yaml
+ include:
+ template: Verify/Load-Performance-Testing.gitlab-ci.yml
+
+ load_performance:
+ variables:
+ K6_TEST_FILE: <PATH TO K6 TEST FILE IN PROJECT>
+ K6_OPTIONS: '--duration 30s'
+```
+
+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](../yaml/artifacts_reports.md#artifactsreportsload_performance).
+The latest Load Performance artifact available is always used, using the
+summary values from the test.
+
+If [GitLab Pages](../../user/project/pages/index.md) is enabled, you can view the report directly in your browser.
+
+### Load Performance testing in Review Apps
+
+The CI/CD YAML configuration example above works for testing against static environments,
+but it can be extended to work with [review apps](../review_apps/index.md) or
+[dynamic environments](../environments/index.md) with a few extra steps.
+
+The best approach is to capture the dynamic URL in a [`.env` file](https://docs.docker.com/compose/env-file/)
+as a job artifact to be shared, then use a custom CI/CD variable we've provided named `K6_DOCKER_OPTIONS`
+to configure the k6 Docker container to use the file. With this, k6 can then use any
+environment variables from the `.env` file in scripts using standard JavaScript,
+such as: ``http.get(`${__ENV.ENVIRONMENT_URL}`)``.
+
+For example:
+
+1. In the `review` job:
+ 1. Capture the dynamic URL and save it into a `.env` file, for example, `echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env`.
+ 1. Set the `.env` file to be a [job artifact](../pipelines/job_artifacts.md).
+1. In the `load_performance` job:
+ 1. Set it to depend on the review job, so it inherits the environment file.
+ 1. Set the `K6_DOCKER_OPTIONS` variable with the [Docker CLI option for environment files](https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file), for example `--env-file review.env`.
+1. Configure the k6 test script to use the environment variable in it's steps.
+
+Your `.gitlab-ci.yml` file might be similar to:
+
+```yaml
+stages:
+ - deploy
+ - performance
+
+include:
+ template: Verify/Load-Performance-Testing.gitlab-ci.yml
+
+review:
+ stage: deploy
+ environment:
+ name: review/$CI_COMMIT_REF_SLUG
+ url: http://$CI_ENVIRONMENT_SLUG.example.com
+ script:
+ - run_deploy_script
+ - echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env
+ artifacts:
+ paths:
+ - review.env
+ rules:
+ - if: $CI_COMMIT_BRANCH # Modify to match your pipeline rules, or use `only/except` if needed.
+
+load_performance:
+ dependencies:
+ - review
+ variables:
+ K6_DOCKER_OPTIONS: '--env-file review.env'
+ rules:
+ - if: $CI_COMMIT_BRANCH # Modify to match your pipeline rules, or use `only/except` if needed.
+```
diff --git a/doc/ci/testing/metrics_reports.md b/doc/ci/testing/metrics_reports.md
new file mode 100644
index 00000000000..e855074ddea
--- /dev/null
+++ b/doc/ci/testing/metrics_reports.md
@@ -0,0 +1,68 @@
+---
+stage: Verify
+group: Pipeline Insights
+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 Reports **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9788) in GitLab 11.10. Requires GitLab Runner 11.10 and above.
+
+GitLab provides a lot of great reporting tools for things like [merge requests](../../user/project/merge_requests/index.md) - [Unit test reports](unit_test_reports.md), [code quality](code_quality.md), and performance tests. While JUnit is a great open framework for tests that "pass" or "fail", it is also important to see other types of metrics from a given change.
+
+You can configure your job to use custom Metrics Reports, and GitLab displays a report on the merge request so that it's easier and faster to identify changes without having to check the entire log.
+
+![Metrics Reports](img/metrics_reports_v13_0.png)
+
+## Use cases
+
+Consider the following examples of data that can use Metrics Reports:
+
+1. Memory usage
+1. Load testing results
+1. Code complexity
+1. Code coverage stats
+
+## How it works
+
+Metrics for a branch are read from the latest metrics report artifact (default filename: `metrics.txt`) as string values.
+
+For an MR, the values of these metrics from the feature branch are compared to the values from the target branch. Then they are displayed in the MR widget in this order:
+
+- Existing metrics with changed values.
+- Metrics that have been added by the MR. Marked with a **New** badge.
+- Metrics that have been removed by the MR. Marked with a **Removed** badge.
+- Existing metrics with unchanged values.
+
+## How to set it up
+
+Add a job that creates a [metrics report](../yaml/artifacts_reports.md#artifactsreportsmetrics) (default filename: `metrics.txt`). The file should conform to the [OpenMetrics](https://openmetrics.io/) format.
+
+For example:
+
+```yaml
+metrics:
+ script:
+ - echo 'metric_name metric_value' > metrics.txt
+ artifacts:
+ reports:
+ metrics: metrics.txt
+```
+
+## Advanced Example
+
+An advanced example of an OpenMetrics text file (from the [Prometheus documentation](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-format-example))
+renders in the merge request widget as:
+
+![Metrics Reports Advanced](img/metrics_reports_advanced_v13_0.png)
+
+## Troubleshooting
+
+### Metrics reports did not change
+
+You can see `Metrics reports did not change` when trying to view metrics reports in merge requests. Reasons for this are:
+
+- The target branch for the merge request doesn't have a baseline metrics report for comparison.
+- You don't have GitLab license at the Premium tier or above.
+
+There is [an issue open](https://gitlab.com/gitlab-org/gitlab/-/issues/343065) to improve this message.
diff --git a/doc/ci/testing/test_coverage_visualization.md b/doc/ci/testing/test_coverage_visualization.md
new file mode 100644
index 00000000000..472cfca99be
--- /dev/null
+++ b/doc/ci/testing/test_coverage_visualization.md
@@ -0,0 +1,435 @@
+---
+stage: Verify
+group: Pipeline Insights
+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
+---
+
+# Test coverage visualization **(FREE)**
+
+> - [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](../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
+MR is merged.
+
+![Test Coverage Visualization Diff View](img/test_coverage_visualization_v12_9.png)
+
+## How test coverage visualization works
+
+Collecting the coverage information is done via GitLab CI/CD's
+[artifacts reports feature](../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. Coverage files are parsed in a background job so there can be a delay
+between pipeline completion and the visualization loading on the page.
+
+For the coverage analysis to work, you have to provide a properly formatted
+[Cobertura XML](https://cobertura.github.io/cobertura/) report to
+[`artifacts:reports:coverage_report`](../yaml/artifacts_reports.md#artifactsreportscoverage_report).
+This format was originally developed for Java, but most coverage analysis frameworks
+for other languages have plugins to add support for it, like:
+
+- [simplecov-cobertura](https://rubygems.org/gems/simplecov-cobertura) (Ruby)
+- [gocover-cobertura](https://github.com/boumenot/gocover-cobertura) (Golang)
+
+Other coverage analysis frameworks support the format out of the box, for example:
+
+- [Istanbul](https://istanbul.js.org/docs/advanced/alternative-reporters/#cobertura) (JavaScript)
+- [Coverage.py](https://coverage.readthedocs.io/en/coverage-5.0.4/cmd.html#xml-reporting) (Python)
+- [PHPUnit](https://github.com/sebastianbergmann/phpunit-documentation-english/blob/master/src/textui.rst#command-line-options) (PHP)
+
+Once configured, if you create a merge request that triggers a pipeline which collects
+coverage reports, the coverage is shown in the diff view. This includes reports
+from any job in any stage in the pipeline. The coverage displays for each line:
+
+- `covered` (green): lines which have been checked at least once by tests
+- `no test coverage` (orange): lines which are loaded but never executed
+- no coverage information: lines which are non-instrumented or not loaded
+
+Hovering over the coverage bar provides further information, such as the number
+of times the line was checked by tests.
+
+Uploading a test coverage report does not enable:
+
+- [Test coverage results in merge requests](../pipelines/settings.md#merge-request-test-coverage-results).
+- [Code coverage history](../pipelines/settings.md#view-code-coverage-history).
+
+You must configure these separately.
+
+### Limits
+
+A limit of 100 `<source>` nodes for Cobertura format XML files applies. If your Cobertura report exceeds
+100 nodes, there can be mismatches or no matches in the merge request diff view.
+
+A single Cobertura XML file can be no more than 10MiB. For large projects, split the Cobertura XML into
+smaller files. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/328772) for more details.
+When submitting many files, it can take a few minutes for coverage to show on a merge request.
+
+The visualization only displays after the pipeline is complete. If the pipeline has
+a [blocking manual job](../jobs/job_control.md#types-of-manual-jobs), the
+pipeline waits for the manual job before continuing and is not considered complete.
+The visualization cannot be displayed if the blocking manual job did not run.
+
+### Artifact expiration
+
+By default, the [pipeline artifact](../pipelines/pipeline_artifacts.md#storage) used
+to draw the visualization on the merge request expires **one week** after creation.
+
+### Coverage report from child pipeline
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363301) in GitLab 15.1 [with a flag](../../administration/feature_flags.md) named `ci_child_pipeline_coverage_reports`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/363557) and feature flag `ci_child_pipeline_coverage_reports` removed in GitLab 15.2.
+
+If a job in a child pipeline creates a coverage report, the report is included in
+the parent pipeline's coverage report.
+
+```yaml
+child_test_pipeline:
+ trigger:
+ include:
+ - local: path/to/child_pipeline_with_coverage.yml
+```
+
+### Automatic class path correction
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217664) in GitLab 13.8.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284822) in GitLab 13.9.
+
+The coverage report properly matches changed files only if the `filename` of a `class` element
+contains the full path relative to the project root. However, in some coverage analysis frameworks,
+the generated Cobertura XML has the `filename` path relative to the class package directory instead.
+
+To make an intelligent guess on the project root relative `class` path, the Cobertura XML parser
+attempts to build the full path by:
+
+- Extracting a portion of the `source` paths from the `sources` element and combining them with the
+ class `filename` path.
+- Checking if the candidate path exists in the project.
+- Using the first candidate that matches as the class full path.
+
+#### Path correction example
+
+As an example, a project with:
+
+- A full path of `test-org/test-project`.
+- The following files relative to the project root:
+
+ ```shell
+ Auth/User.cs
+ Lib/Utils/User.cs
+ src/main/java
+ ```
+
+In the:
+
+- Cobertura XML, the `filename` attribute in the `class` element assumes the value is a relative
+ path to the project's root:
+
+ ```xml
+ <class name="packet.name" filename="src/main/java" line-rate="0.0" branch-rate="0.0" complexity="5">
+ ```
+
+- `sources` from Cobertura XML, the following paths in the format
+ `<CI_BUILDS_DIR>/<PROJECT_FULL_PATH>/...`:
+
+ ```xml
+ <sources>
+ <source>/builds/test-org/test-project/Auth</source>
+ <source>/builds/test-org/test-project/Lib/Utils</source>
+ </sources>
+ ```
+
+The parser:
+
+- Extracts `Auth` and `Lib/Utils` from the `sources` and uses these to determine the `class` path
+ relative to the project root.
+- Combines these extracted `sources` and the class filename. For example, if there is a `class`
+ element with the `filename` value of `User.cs`, the parser takes the first candidate path that
+ matches, which is `Auth/User.cs`.
+- For each `class` element, attempts to look for a match for each extracted `source` path up to
+ 100 iterations. If it reaches this limit without finding a matching path in the file tree, the
+ class is not included in the final coverage report.
+
+NOTE:
+Automatic class path correction only works on `source` paths in the format `<CI_BUILDS_DIR>/<PROJECT_FULL_PATH>/...`.
+The `source` is ignored if the path does not follow this pattern. The parser assumes that the
+`filename` of a `class` element contains the full path relative to the project root.
+
+## Example test coverage configurations
+
+This section provides test coverage configuration examples for different programming languages. You can also see a working example in
+the [`coverage-report`](https://gitlab.com/gitlab-org/ci-sample-projects/coverage-report/) demonstration project.
+
+### JavaScript example
+
+The following [`.gitlab-ci.yml`](../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:
+
+```yaml
+test:
+ script:
+ - npm install
+ - npx nyc --reporter cobertura mocha
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/cobertura-coverage.xml
+```
+
+### Java and Kotlin examples
+
+#### Maven example
+
+The following [`.gitlab-ci.yml`](../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.
+
+GitLab expects the artifact in the Cobertura format, so you have to execute a few
+scripts before uploading it. The `test-jdk11` job tests the code and generates an
+XML artifact. The `coverage-jdk-11` job converts the artifact into a Cobertura report:
+
+```yaml
+test-jdk11:
+ stage: test
+ image: maven:3.6.3-jdk-11
+ script:
+ - mvn $MAVEN_CLI_OPTS clean org.jacoco:jacoco-maven-plugin:prepare-agent test jacoco:report
+ artifacts:
+ paths:
+ - target/site/jacoco/jacoco.xml
+
+coverage-jdk11:
+ # Must be in a stage later than test-jdk11's stage.
+ # The `visualize` stage does not exist by default.
+ # Please define it first, or choose an existing stage like `deploy`.
+ stage: visualize
+ image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
+ script:
+ # convert report from jacoco to cobertura, using relative project path
+ - python /opt/cover2cover.py target/site/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/ > target/site/cobertura.xml
+ needs: ["test-jdk11"]
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: target/site/cobertura.xml
+```
+
+#### Gradle example
+
+The following [`.gitlab-ci.yml`](../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.
+
+GitLab expects the artifact in the Cobertura format, so you have to execute a few
+scripts before uploading it. The `test-jdk11` job tests the code and generates an
+XML artifact. The `coverage-jdk-11` job converts the artifact into a Cobertura report:
+
+```yaml
+test-jdk11:
+ stage: test
+ image: gradle:6.6.1-jdk11
+ script:
+ - 'gradle test jacocoTestReport' # jacoco must be configured to create an xml report
+ artifacts:
+ paths:
+ - build/jacoco/jacoco.xml
+
+coverage-jdk11:
+ # Must be in a stage later than test-jdk11's stage.
+ # The `visualize` stage does not exist by default.
+ # Please define it first, or chose an existing stage like `deploy`.
+ stage: visualize
+ image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
+ script:
+ # convert report from jacoco to cobertura, using relative project path
+ - python /opt/cover2cover.py build/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/ > build/cobertura.xml
+ needs: ["test-jdk11"]
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: build/cobertura.xml
+```
+
+### Python example
+
+The following [`.gitlab-ci.yml`](../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`:
+
+```yaml
+run tests:
+ stage: test
+ image: python:3
+ script:
+ - pip install pytest pytest-cov
+ - coverage run -m pytest
+ - coverage report
+ - coverage xml
+ coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage.xml
+```
+
+### PHP example
+
+The following [`.gitlab-ci.yml`](../yaml/index.md) example for PHP uses [PHPUnit](https://phpunit.readthedocs.io/)
+to collect test coverage data and generate the report.
+
+With a minimal [`phpunit.xml`](https://phpunit.readthedocs.io/en/9.5/configuration.html) file (you may reference
+[this example repository](https://gitlab.com/yookoala/code-coverage-visualization-with-php/)), you can run the test and
+generate the `coverage.xml`:
+
+```yaml
+run tests:
+ stage: test
+ image: php:latest
+ variables:
+ XDEBUG_MODE: coverage
+ before_script:
+ - apt-get update && apt-get -yq install git unzip zip libzip-dev zlib1g-dev
+ - docker-php-ext-install zip
+ - pecl install xdebug && docker-php-ext-enable xdebug
+ - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+ - php composer-setup.php --install-dir=/usr/local/bin --filename=composer
+ - composer install
+ - composer require --dev phpunit/phpunit phpunit/php-code-coverage
+ script:
+ - php ./vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage.cobertura.xml
+```
+
+[Codeception](https://codeception.com/), through PHPUnit, also supports generating Cobertura report with
+[`run`](https://codeception.com/docs/reference/Commands#run). The path for the generated file
+depends on the `--coverage-cobertura` option and [`paths`](https://codeception.com/docs/reference/Configuration#paths)
+configuration for the [unit test suite](https://codeception.com/docs/05-UnitTests). Configure `.gitlab-ci.yml`
+to find Cobertura in the appropriate path.
+
+### C/C++ example
+
+The following [`.gitlab-ci.yml`](../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.
+
+This example assumes:
+
+- That the `Makefile` is created by `cmake` in the `build` directory,
+ within another job in a previous stage.
+ (If you use `automake` to generate the `Makefile`,
+ then you need to call `make check` instead of `make test`.)
+- `cmake` (or `automake`) has set the compiler option `--coverage`.
+
+```yaml
+run tests:
+ stage: test
+ script:
+ - cd build
+ - make test
+ - gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o coverage.xml --root ${CI_PROJECT_DIR}
+ coverage: /^\s*lines:\s*\d+.\d+\%/
+ artifacts:
+ name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}
+ expire_in: 2 days
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: build/coverage.xml
+```
+
+### Go example
+
+The following [`.gitlab-ci.yml`](../yaml/index.md) example for Go uses:
+
+- [`go test`](https://go.dev/doc/tutorial/add-a-test) to run tests.
+- [`gocover-cobertura`](https://github.com/boumenot/gocover-cobertura) to convert Go's coverage profile into the Cobertura XML format.
+
+This example assumes that [Go modules](https://go.dev/ref/mod)
+are being used. Please note that the `-covermode count` option does not work with the `-race` flag.
+If you want to generate code coverage while also using the `-race` flag, you must switch to
+`-covermode atomic` which is slower than `-covermode count`. See [this blog post](https://go.dev/blog/cover)
+for more details.
+
+```yaml
+run tests:
+ stage: test
+ image: golang:1.17
+ script:
+ - go install
+ - go test ./... -coverprofile=coverage.txt -covermode count
+ - go get github.com/boumenot/gocover-cobertura
+ - go run github.com/boumenot/gocover-cobertura < coverage.txt > coverage.xml
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage.xml
+```
+
+### Ruby example
+
+The following [`.gitlab-ci.yml`](../yaml/index.md) example for Ruby uses
+
+- [`rspec`](https://rspec.info/) to run tests.
+- [`simplecov`](https://github.com/simplecov-ruby/simplecov) and [`simplecov-cobertura`](https://github.com/dashingrocket/simplecov-cobertura)
+ to record the coverage profile and create a report in the Cobertura XML format.
+
+This example assumes:
+
+- That [`bundler`](https://bundler.io/) is being used for dependency management.
+ The `rspec`, `simplecov` and `simplecov-cobertura` gems have been added to your `Gemfile`.
+- The `CoberturaFormatter` has been added to your `SimpleCov.formatters`
+ configuration within the `spec_helper.rb` file.
+
+```yaml
+run tests:
+ stage: test
+ image: ruby:3.1
+ script:
+ - bundle install
+ - bundle exec rspec
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/coverage.xml
+```
+
+## Troubleshooting
+
+### Test coverage visualization not displayed
+
+If the test coverage visualization is not displayed in the diff view, you can check
+the coverage report itself and verify that:
+
+- The file you are viewing in the diff view is mentioned in the coverage report.
+- The `source` and `filename` nodes in the report follows the [expected structure](#automatic-class-path-correction)
+ to match the files in your repository.
+
+Report artifacts are not downloadable by default. If you want the report to be downloadable
+from the job details page, add your coverage report to the artifact `paths`:
+
+```yaml
+artifacts:
+ paths:
+ - coverage/cobertura-coverage.xml
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/cobertura-coverage.xml
+```
diff --git a/doc/ci/testing/unit_test_reports.md b/doc/ci/testing/unit_test_reports.md
index 8aa41cd6fc0..c8e0d6135df 100644
--- a/doc/ci/testing/unit_test_reports.md
+++ b/doc/ci/testing/unit_test_reports.md
@@ -145,8 +145,9 @@ GitLab does not parse very [large nodes](https://nokogiri.org/tutorials/parsing_
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202114) in GitLab 13.0 behind the `:junit_pipeline_screenshots_view` feature flag, disabled by default.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/216979) in GitLab 13.12.
-Upload your screenshots as [artifacts](../yaml/artifacts_reports.md#artifactsreportsjunit) to GitLab. If JUnit
-report format XML files contain an `attachment` tag, GitLab parses the attachment. Note that:
+You can upload your screenshots as [artifacts](../yaml/artifacts_reports.md#artifactsreportsjunit) to GitLab.
+If JUnit report format XML files contain an `attachment` tag, GitLab parses the attachment.
+When uploading screenshot artifacts:
- The `attachment` tag **must** contain the relative path to `$CI_PROJECT_DIR` of the screenshots you uploaded. For
example:
@@ -161,5 +162,18 @@ report format XML files contain an `attachment` tag, GitLab parses the attachmen
[`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
-[the pipeline test report](#view-unit-test-reports-on-gitlab).
+After the attachment is uploaded, [the pipeline test report](#view-unit-test-reports-on-gitlab)
+contains a link to the screenshot, for example:
+
+![Unit test report screenshot example](img/unit_test_report_screenshot_v13_12.png)
+
+## Troubleshooting
+
+### Test report appears empty
+
+A unit test report can appear to be empty when [viewed in a merge request](#view-unit-test-reports-on-gitlab)
+if the artifact that contained the report [expires](../yaml/index.md#artifactsexpire_in).
+If the artifact frequently expires too early, set a longer `expire_in` value for
+the report artifact.
+
+Alternatively, you can run a new pipeline to generate a new report.
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index 8d8afbffab9..0230aaf7113 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -361,6 +361,29 @@ When you visit the job log page for a running job, there could be a delay of up
60 seconds before the log updates. The default refresh time is 60 seconds, but after
the log is viewed in the UI, the following log updates should occur every 3 seconds.
+## Disaster recovery
+
+You can disable some important but computationally expensive parts of the application
+to relieve stress on the database during ongoing downtime.
+
+### Disable fair scheduling on shared runners
+
+When clearing a large backlog of jobs, you can temporarily enable the `ci_queueing_disaster_recovery_disable_fair_scheduling`
+[feature flag](../administration/feature_flags.md). This flag disables fair scheduling
+on shared runners, which reduces system resource usage on the `jobs/request` endpoint.
+
+When enabled, jobs are processed in the order they were put in the system, instead of
+balanced across many projects.
+
+### Disable CI/CD minutes quota enforcement
+
+To disable the enforcement of CI/CD minutes quotas on shared runners, you can temporarily
+enable the `ci_queueing_disaster_recovery_disable_quota` [feature flag](../administration/feature_flags.md).
+This flag reduces system resource usage on the `jobs/request` endpoint.
+
+When enabled, jobs created in the last hour can run in projects which are out of quota.
+Earlier jobs are already canceled by a periodic background worker (`StuckCiJobsWorker`).
+
## How to get help
If you are unable to resolve pipeline issues, you can get help from:
diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md
index c53fad69376..72df8d56815 100644
--- a/doc/ci/variables/index.md
+++ b/doc/ci/variables/index.md
@@ -346,7 +346,7 @@ To mask a variable:
1. Select the **Mask variable** checkbox.
1. Select **Update variable**.
-The method used to mask variables [limits what can be included in a masked variable](](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784#note_106756757)).
+The method used to mask variables [limits what can be included in a masked variable](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784#note_106756757).
The value of the variable must:
- Be a single line.
@@ -401,6 +401,8 @@ Review all merge requests that introduce changes to the `.gitlab-ci.yml` file be
- [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).
- Merge the changes.
+Review the `.gitlab-ci.yml` file of imported projects before you add files or run pipelines against them.
+
The following example shows malicious code in a `.gitlab-ci.yml` file:
```yaml
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index e6d61ef342b..6df614c1cda 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -29,7 +29,7 @@ as it can cause the pipeline to behave unexpectedly.
| `CI_API_V4_URL` | 11.7 | all | The GitLab API v4 root URL. |
| `CI_BUILDS_DIR` | all | 11.10 | The top-level directory where builds are executed. |
| `CI_COMMIT_AUTHOR` | 13.11 | all | The author of the commit in `Name <email>` format. |
-| `CI_COMMIT_BEFORE_SHA` | 11.2 | all | The previous latest commit present on a branch. Is always `0000000000000000000000000000000000000000` in merge request pipelines. |
+| `CI_COMMIT_BEFORE_SHA` | 11.2 | all | The previous latest commit present on a branch or tag. Is always `0000000000000000000000000000000000000000` in merge request pipelines and for the first commit in pipelines for branches or tags. |
| `CI_COMMIT_BRANCH` | 12.6 | 0.5 | The commit branch name. Available in branch pipelines, including pipelines for the default branch. Not available in merge request pipelines or tag pipelines. |
| `CI_COMMIT_DESCRIPTION` | 10.8 | all | The description of the commit. If the title is shorter than 100 characters, the message without the first line. |
| `CI_COMMIT_MESSAGE` | 10.8 | all | The full commit message. |
@@ -139,29 +139,30 @@ These variables are available when:
- 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. |
-| `CI_MERGE_REQUEST_LABELS` | 11.9 | all | Comma-separated label names of the merge request. |
-| `CI_MERGE_REQUEST_MILESTONE` | 11.9 | all | The milestone title of the merge request. |
-| `CI_MERGE_REQUEST_PROJECT_ID` | 11.6 | all | The ID of the project of the merge request. |
-| `CI_MERGE_REQUEST_PROJECT_PATH` | 11.6 | all | The path of the project of the merge request. For example `namespace/awesome-project`. |
-| `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](../pipelines/merged_results_pipelines.md). |
-| `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](../pipelines/merged_results_pipelines.md). |
-| `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. |
-| `CI_MERGE_REQUEST_DIFF_BASE_SHA` | 13.7 | all | The base SHA of the merge request diff. |
+| 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. |
+| `CI_MERGE_REQUEST_LABELS` | 11.9 | all | Comma-separated label names of the merge request. |
+| `CI_MERGE_REQUEST_MILESTONE` | 11.9 | all | The milestone title of the merge request. |
+| `CI_MERGE_REQUEST_PROJECT_ID` | 11.6 | all | The ID of the project of the merge request. |
+| `CI_MERGE_REQUEST_PROJECT_PATH` | 11.6 | all | The path of the project of the merge request. For example `namespace/awesome-project`. |
+| `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](../pipelines/merged_results_pipelines.md). |
+| `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_PROTECTED` | 15.2 | all | The protection status for the target branch 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](../pipelines/merged_results_pipelines.md). |
+| `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. |
+| `CI_MERGE_REQUEST_DIFF_BASE_SHA` | 13.7 | all | The base SHA of the merge request diff. |
## Predefined variables for external pull request pipelines
diff --git a/doc/ci/yaml/artifacts_reports.md b/doc/ci/yaml/artifacts_reports.md
index e4324ab06e1..379a4b3224a 100644
--- a/doc/ci/yaml/artifacts_reports.md
+++ b/doc/ci/yaml/artifacts_reports.md
@@ -36,9 +36,9 @@ The `accessibility` report uses [pa11y](https://pa11y.org/) to report on the acc
of changes introduced in merge requests.
GitLab can display the results of one or more reports in the merge request
-[accessibility widget](../../user/project/merge_requests/accessibility_testing.md#accessibility-merge-request-widget).
+[accessibility widget](../testing/accessibility_testing.md#accessibility-merge-request-widget).
-For more information, see [Accessibility testing](../../user/project/merge_requests/accessibility_testing.md).
+For more information, see [Accessibility testing](../testing/accessibility_testing.md).
## `artifacts:reports:api_fuzzing` **(ULTIMATE)**
@@ -52,18 +52,18 @@ GitLab can display the results of one or more reports in:
- The merge request [security widget](../../user/application_security/api_fuzzing/index.md#view-details-of-an-api-fuzzing-vulnerability).
- The [Project Vulnerability report](../../user/application_security/vulnerability_report/index.md).
-- The pipeline [**Security** tab](../../user/application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline).
+- The pipeline [**Security** tab](../../user/application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline).
- The [security dashboard](../../user/application_security/api_fuzzing/index.md#security-dashboard).
## `artifacts:reports:browser_performance` **(PREMIUM)**
> [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)
+The `browser_performance` report collects [Browser Performance Testing metrics](../testing/browser_performance_testing.md)
as artifacts.
GitLab can display the results of one report in the merge request
-[browser performance testing widget](../../user/project/merge_requests/browser_performance_testing.md#how-browser-performance-testing-works).
+[browser performance testing widget](../testing/browser_performance_testing.md#how-browser-performance-testing-works).
GitLab cannot display the combined results of multiple `browser_performance` reports.
@@ -100,7 +100,7 @@ instead.
Use `coverage_report` to collect coverage report in Cobertura format.
-The `cobertura` report collects [Cobertura coverage XML files](../../user/project/merge_requests/test_coverage_visualization.md).
+The `cobertura` report collects [Cobertura coverage XML files](../testing/test_coverage_visualization.md).
Cobertura was originally developed for Java, but there are many third-party ports for other languages such as
JavaScript, Python, and Ruby.
@@ -116,22 +116,22 @@ artifacts:
The collected coverage report is uploaded to GitLab as an artifact.
GitLab can display the results of coverage report in the merge request
-[diff annotations](../../user/project/merge_requests/test_coverage_visualization.md).
+[diff annotations](../testing/test_coverage_visualization.md).
## `artifacts:reports:codequality`
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
-The `codequality` report collects [code quality issues](../../user/project/merge_requests/code_quality.md). The
+The `codequality` report collects [code quality issues](../testing/code_quality.md). The
collected code quality report uploads to GitLab as an artifact.
GitLab can display the results of:
-- One or more reports in the merge request [code quality widget](../../user/project/merge_requests/code_quality.md#code-quality-widget).
+- One or more reports in the merge request [code quality widget](../testing/code_quality.md#code-quality-widget).
- Only one report in:
- - The merge request [diff annotations](../../user/project/merge_requests/code_quality.md#code-quality-in-diff-view).
+ - The merge request [diff annotations](../testing/code_quality.md#code-quality-in-diff-view).
Track progress on adding support for multiple reports in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/328257).
- - The [full report](../metrics_reports.md). Track progress on adding support for multiple reports in
+ - The [full report](../testing/metrics_reports.md). Track progress on adding support for multiple reports in
[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/9014).
## `artifacts:reports:container_scanning` **(ULTIMATE)**
@@ -142,7 +142,7 @@ The collected Container Scanning report uploads to GitLab as an artifact.
GitLab can display the results of one or more reports in:
- The merge request [container scanning widget](../../user/application_security/container_scanning/index.md).
-- The pipeline [**Security** tab](../../user/application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline).
+- The pipeline [**Security** tab](../../user/application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline).
- The [security dashboard](../../user/application_security/security_dashboard/index.md).
- The [Project Vulnerability report](../../user/application_security/vulnerability_report/index.md).
@@ -156,7 +156,7 @@ The collected coverage fuzzing report uploads to GitLab as an artifact.
GitLab can display the results of one or more reports in:
- The merge request [coverage fuzzing widget](../../user/application_security/coverage_fuzzing/index.md#interacting-with-the-vulnerabilities).
-- The pipeline [**Security** tab](../../user/application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline).
+- The pipeline [**Security** tab](../../user/application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline).
- The [Project Vulnerability report](../../user/application_security/vulnerability_report/index.md).
- The [security dashboard](../../user/application_security/security_dashboard/index.md).
@@ -168,7 +168,7 @@ report uploads to GitLab as an artifact.
GitLab can display the results of one or more reports in:
- The merge request [security widget](../../user/application_security/dast/index.md#view-details-of-a-vulnerability-detected-by-dast).
-- The pipeline [**Security** tab](../../user/application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline).
+- The pipeline [**Security** tab](../../user/application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline).
- The [Project Vulnerability report](../../user/application_security/vulnerability_report/index.md).
- The [security dashboard](../../user/application_security/security_dashboard/index.md).
@@ -180,7 +180,7 @@ The collected Dependency Scanning report uploads to GitLab as an artifact.
GitLab can display the results of one or more reports in:
- The merge request [dependency scanning widget](../../user/application_security/dependency_scanning/index.md).
-- The pipeline [**Security** tab](../../user/application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline).
+- The pipeline [**Security** tab](../../user/application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline).
- The [security dashboard](../../user/application_security/security_dashboard/index.md).
- The [Project Vulnerability report](../../user/application_security/vulnerability_report/index.md).
- The [dependency list](../../user/application_security/dependency_list/).
@@ -213,6 +213,7 @@ The exceptions to the [original dotenv rules](https://github.com/motdotla/dotenv
- 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.
+- Only UTF-8 encoding is [supported](../pipelines/job_artifacts.md#error-message-fatal-invalid-argument-when-uploading-a-dotenv-artifact-on-a-windows-runner).
## `artifacts:reports:junit`
@@ -263,25 +264,25 @@ GitLab can display the results of one or more reports in:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35260) in GitLab 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).
+The `load_performance` report collects [Load Performance Testing metrics](../testing/load_performance_testing.md).
The report is uploaded to GitLab as an artifact.
GitLab can display the results of only one report in the merge request
-[load testing widget](../../user/project/merge_requests/load_performance_testing.md#how-load-performance-testing-works).
+[load testing widget](../testing/load_performance_testing.md#how-load-performance-testing-works).
GitLab cannot display the combined results of multiple `load_performance` reports.
## `artifacts:reports:metrics` **(PREMIUM)**
-The `metrics` report collects [Metrics](../metrics_reports.md). The collected Metrics report uploads to GitLab as an
+The `metrics` report collects [Metrics](../testing/metrics_reports.md). The collected Metrics report uploads to GitLab as an
artifact.
GitLab can display the results of one or more reports in the merge request
-[metrics reports widget](../../ci/metrics_reports.md#metrics-reports).
+[metrics reports widget](../testing/metrics_reports.md#metrics-reports).
## `artifacts:reports:requirements` **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2859) in GitLab 13.1.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2859) in GitLab 13.1.
The `requirements` report collects `requirements.json` files. The collected Requirements report uploads to GitLab as an
artifact and existing [requirements](../../user/project/requirements/index.md) are marked as Satisfied.
@@ -291,7 +292,7 @@ GitLab can display the results of one or more reports in the
## `artifacts:reports:sast`
-> - [Moved](https://gitlab.com/groups/gitlab-org/-/epics/2098) from GitLab Ultimate to GitLab Free in 13.3.
+> [Moved](https://gitlab.com/groups/gitlab-org/-/epics/2098) from GitLab Ultimate to GitLab Free in 13.3.
The `sast` report collects [SAST vulnerabilities](../../user/application_security/sast/index.md). The collected SAST
report uploads to GitLab as an artifact.
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index 912eca364c9..3bb2007d6e3 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -675,6 +675,45 @@ artifacts are restored after [caches](#cache).
[Read more about artifacts](../pipelines/job_artifacts.md).
+#### `artifacts:paths`
+
+Paths are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly
+link outside it.
+
+**Keyword type**: Job keyword. You can use it only as part of a job or in the
+[`default` section](#default).
+
+**Possible inputs**:
+
+- An array of file paths, relative to the project directory.
+- You can use Wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
+ patterns and:
+ - In [GitLab Runner 13.0 and later](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620),
+ [`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 `artifacts:paths`**:
+
+```yaml
+job:
+ artifacts:
+ paths:
+ - binaries/
+ - .config
+```
+
+This example creates an artifact with `.config` and all the files in the `binaries` directory.
+
+**Additional details**:
+
+- If not used with [`artifacts:name`](#artifactsname), the artifacts file
+ is named `artifacts`, which becomes `artifacts.zip` when downloaded.
+
+**Related topics**:
+
+- To restrict which jobs a specific job fetches artifacts from, see [`dependencies`](#dependencies).
+- [Create job artifacts](../pipelines/job_artifacts.md#create-job-artifacts).
+
#### `artifacts:exclude`
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15122) in GitLab 13.1
@@ -843,45 +882,6 @@ job:
- [Use CI/CD variables to define the artifacts name](../pipelines/job_artifacts.md#use-cicd-variables-to-define-the-artifacts-name).
-#### `artifacts:paths`
-
-Paths are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly
-link outside it.
-
-**Keyword type**: Job keyword. You can use it only as part of a job or in the
-[`default` section](#default).
-
-**Possible inputs**:
-
-- An array of file paths, relative to the project directory.
-- You can use Wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
- patterns and:
- - In [GitLab Runner 13.0 and later](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620),
- [`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 `artifacts:paths`**:
-
-```yaml
-job:
- artifacts:
- paths:
- - binaries/
- - .config
-```
-
-This example creates an artifact with `.config` and all the files in the `binaries` directory.
-
-**Additional details**:
-
-- If not used with [`artifacts:name`](#artifactsname) defined, the artifacts file
- is named `artifacts`, which becomes `artifacts.zip` when downloaded.
-
-**Related topics**:
-
-- To restrict which jobs a specific job fetches artifacts from, see [`dependencies`](#dependencies).
-- [Create job artifacts](../pipelines/job_artifacts.md#create-job-artifacts).
-
#### `artifacts:public`
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49775) in GitLab 13.8
@@ -910,7 +910,7 @@ pipelines, set `artifacts:public` to `false`:
- `true` (default if not defined) or `false`.
-**Example of `artifacts:paths`**:
+**Example of `artifacts:public`**:
```yaml
job:
@@ -1099,6 +1099,8 @@ 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.
+Must be used with `cache: path`, or nothing is cached.
+
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
@@ -1263,6 +1265,8 @@ rspec:
Use `cache:when` to define when to save the cache, based on the status of the job.
+Must be used with `cache: path`, or nothing is cached.
+
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
@@ -1301,6 +1305,8 @@ Use the `pull` policy when you have many jobs executing in parallel that use the
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.
+Must be used with `cache: path`, or nothing is cached.
+
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
@@ -2204,6 +2210,7 @@ In this example:
Use `needs:project` to download artifacts from up to five jobs in other pipelines.
The artifacts are downloaded from the latest successful pipeline for the specified ref.
+To specify multiple jobs, add each as separate array items under the `needs` keyword.
If there is a pipeline running for the specified ref, a job with `needs:project`
does not wait for the pipeline to complete. Instead, the job downloads the artifact
@@ -2232,10 +2239,14 @@ build_job:
job: build-1
ref: main
artifacts: true
+ - project: namespace/group/project-name-2
+ job: build-2
+ ref: main
+ artifacts: true
```
-In this example, `build_job` downloads the artifacts from the latest successful `build-1` job
-on the `main` branch in the `group/project-name` project.
+In this example, `build_job` downloads the artifacts from the latest successful `build-1` and `build-2` jobs
+on the `main` branches in the `group/project-name` and `group/project-name-2` projects.
In GitLab 13.3 and later, you can use [CI/CD variables](../variables/where_variables_can_be_used.md#gitlab-ciyml-file)
in `needs:project`, for example:
@@ -2428,13 +2439,6 @@ 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.
@@ -2443,6 +2447,10 @@ for more details and examples.
Use the `only:refs` and `except:refs` keywords to control when to add jobs to a
pipeline based on branch names or pipeline types.
+`only:refs` and `except:refs` are not being actively developed. [`rules:if`](#rulesif)
+is the preferred keyword when using refs, regular expressions, or variables to control
+when to add jobs to pipelines.
+
**Keyword type**: Job keyword. You can use it only as part of a job.
**Possible inputs**: An array including any number of:
@@ -2519,8 +2527,8 @@ job2:
job2:
script: echo "test"
only:
- - branches
- - tags
+ - branches
+ - tags
```
#### `only:variables` / `except:variables`
@@ -2528,6 +2536,10 @@ job2:
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).
+`only:variables` and `except:variables` are not being actively developed. [`rules:if`](#rulesif)
+is the preferred keyword when using refs, regular expressions, or variables to control
+when to add jobs to pipelines.
+
**Keyword type**: Job keyword. You can use it only as part of a job.
**Possible inputs**:
@@ -2560,6 +2572,9 @@ Use `changes` in pipelines with the following refs:
- `external_pull_requests`
- `merge_requests` (see additional details about [using `only:changes` with merge request pipelines](../jobs/job_control.md#use-onlychanges-with-merge-request-pipelines))
+`only:changes` and `except:changes` are not being actively developed. [`rules:changes`](#ruleschanges)
+is the preferred keyword when using changed files to control when to add jobs to pipelines.
+
**Keyword type**: Job keyword. You can use it only as part of a job.
**Possible inputs**: An array including any number of:
@@ -2610,6 +2625,10 @@ docker build:
Use `only:kubernetes` or `except:kubernetes` to control if jobs are added to the pipeline
when the Kubernetes service is active in the project.
+`only:refs` and `except:refs` are not being actively developed. Use [`rules:if`](#rulesif)
+with the [`CI_KUBERNETES_ACTIVE`](../variables/predefined_variables.md) predefined CI/CD variable
+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**:
@@ -3388,7 +3407,7 @@ This keyword must be used with `secrets:vault`.
#### `secrets:vault`
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28321) in GitLab 13.4 and GitLab Runner 13.4.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28321) in GitLab 13.4 and GitLab Runner 13.4.
Use `secrets:vault` to specify secrets provided by a [HashiCorp Vault](https://www.vaultproject.io/).
@@ -3519,6 +3538,52 @@ in that container.
- [Run your CI/CD jobs in Docker containers](../docker/using_docker_images.md).
- [Use Docker to build Docker images](../docker/using_docker_build.md).
+#### `service:pull_policy`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21619) in GitLab 15.1 [with a flag](../../administration/feature_flags.md) named `ci_docker_image_pull_policy`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/363186) in GitLab 15.2.
+> - Requires GitLab Runner 15.1 or later.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature,
+ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `ci_docker_image_pull_policy`.
+
+The pull policy that the runner uses to fetch the Docker image.
+
+**Keyword type**: Job keyword. You can use it only as part of a job or in the [`default` section](#default).
+
+**Possible inputs**:
+
+- A single pull policy, or multiple pull policies in an array.
+ Can be `always`, `if-not-present`, or `never`.
+
+**Examples of `service:pull_policy`**:
+
+```yaml
+job1:
+ script: echo "A single pull policy."
+ services:
+ - name: postgres:11.6
+ pull_policy: if-not-present
+
+job2:
+ script: echo "Multiple pull policies."
+ services:
+ - name: postgres:11.6
+ pull_policy: [always, if-not-present]
+```
+
+**Additional details**:
+
+- If the runner does not support the defined pull policy, the job fails with an error similar to:
+ `ERROR: Job failed (system failure): the configured PullPolicies ([always]) are not allowed by AllowedPullPolicies ([never])`.
+
+**Related topics**:
+
+- [Run your CI/CD jobs in Docker containers](../docker/using_docker_images.md).
+- [How runner pull policies work](https://docs.gitlab.com/runner/executors/docker.html#how-pull-policies-work).
+- [Using multiple pull policies](https://docs.gitlab.com/runner/executors/docker.html#using-multiple-pull-policies).
+
### `stage`
Use `stage` to define which [stage](#stages) a job runs in. Jobs in the same
diff --git a/doc/ci/yaml/workflow.md b/doc/ci/yaml/workflow.md
index a985db14d08..743a2639c0c 100644
--- a/doc/ci/yaml/workflow.md
+++ b/doc/ci/yaml/workflow.md
@@ -61,7 +61,7 @@ This example prevents pipelines for schedules or `push` (branches and tags) pipe
The final `when: always` rule runs all other pipeline types, **including** merge
request pipelines.
-## Switch between branch pipelines and merge request pipelines
+### Switch between branch pipelines and merge request pipelines
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) in GitLab 13.8.
@@ -115,6 +115,25 @@ set and could be blocked by a similar rule. Triggered pipelines have a pipeline
of `trigger` or `pipeline`, so `&& $CI_PIPELINE_SOURCE == "push"` ensures the rule
does not block triggered pipelines.
+### Git Flow with merge request pipelines
+
+You can use `workflow: rules` as part of [Git Flow or similar strategies](../../topics/gitlab_flow.md)
+with merge request pipelines. With these rules, you can use [merge request pipeline features](../pipelines/merge_request_pipelines.md)
+with feature branches, while keeping long-lived branches to support multiple versions
+of your software.
+
+For example, to only run pipelines for your merge requests, tags, and protected branches:
+
+```yaml
+workflow:
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ - if: $CI_COMMIT_TAG
+ - if: $CI_COMMIT_REF_PROTECTED
+```
+
+This example assumes that your long-lived branches are [protected](../../user/project/protected_branches.md).
+
## `workflow:rules` templates
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217732) in GitLab 13.0.
@@ -150,3 +169,23 @@ To [include](index.md#include) it:
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
```
+
+## Troubleshooting
+
+### Merge request stuck with `Checking pipeline status.` message
+
+If a merge request displays `Checking pipeline status.`, but the message never goes
+away (the "spinner" never stops spinning), it might be due to `workflow:rules`.
+This issue can happen if a project has [**Pipelines must succeed**](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds)
+enabled, but the `workflow:rules` prevent a pipeline from running for the merge request.
+
+For example, with this workflow, merge requests cannot be merged, because no
+pipeline can run:
+
+```yaml
+workflow:
+ rules:
+ - changes:
+ - .gitlab/**/**.md
+ when: never
+```
diff --git a/doc/development/adding_database_indexes.md b/doc/development/adding_database_indexes.md
index f524b04c6eb..e80bffe7c18 100644
--- a/doc/development/adding_database_indexes.md
+++ b/doc/development/adding_database_indexes.md
@@ -20,27 +20,24 @@ WHERE user_id = 2;
Here we are filtering by the `user_id` column and as such a developer may decide
to index this column.
-While in certain cases indexing columns using the above approach may make sense
-it can actually have a negative impact. Whenever you write data to a table any
-existing indexes need to be updated. The more indexes there are the slower this
-can potentially become. Indexes can also take up quite some disk space depending
+While in certain cases indexing columns using the above approach may make sense,
+it can actually have a negative impact. Whenever you write data to a table, any
+existing indexes must also be updated. The more indexes there are, the slower this
+can potentially become. Indexes can also take up significant disk space, depending
on the amount of data indexed and the index type. For example, PostgreSQL offers
-"GIN" indexes which can be used to index certain data types that can not be
-indexed by regular B-tree indexes. These indexes however generally take up more
+`GIN` indexes which can be used to index certain data types that cannot be
+indexed by regular B-tree indexes. These indexes, however, generally take up more
data and are slower to update compared to B-tree indexes.
-Because of all this one should not blindly add a new index for every column used
-to filter data by. Instead one should ask themselves the following questions:
+Because of all this, it's important make the following considerations
+when adding a new index:
-1. Can you write your query in such a way that it re-uses as many existing indexes
- as possible?
-1. Is the data large enough that using an index is actually
- faster than just iterating over the rows in the table?
+1. Do the new queries re-use as many existing indexes as possible?
+1. Is there enough data that using an index is faster than iterating over
+ rows in the table?
1. Is the overhead of maintaining the index worth the reduction in query
timings?
-We explore every question in detail below.
-
## Re-using Queries
The first step is to make sure your query re-uses as many existing indexes as
@@ -59,10 +56,8 @@ unindexed. In reality the query may perform just fine given the index on
`user_id` can filter out enough rows.
The best way to determine if indexes are re-used is to run your query using
-`EXPLAIN ANALYZE`. Depending on any extra tables that may be joined and
-other columns being used for filtering you may find an extra index is not going
-to make much (if any) difference. On the other hand you may determine that the
-index _may_ make a difference.
+`EXPLAIN ANALYZE`. Depending on the joined tables and the columns being used for filtering,
+you may find an extra index doesn't make much, if any, difference.
In short:
@@ -73,28 +68,24 @@ In short:
## Data Size
-A database may decide not to use an index despite it existing in case a regular
-sequence scan (= simply iterating over all existing rows) is faster. This is
-especially the case for small tables.
+A database may not use an index even when a regular sequence scan
+(iterating over all rows) is faster, especially for small tables.
-If a table is expected to grow in size and you expect your query has to filter
-out a lot of rows you may want to consider adding an index. If the table size is
-very small (for example, fewer than `1,000` records) or any existing indexes filter out
-enough rows you may _not_ want to add a new index.
+Consider adding an index if a table is expected to grow, and your query has to filter a lot of rows.
+You may _not_ want to add an index if the table size is small (<`1,000` records),
+or if existing indexes already filter out enough rows.
## Maintenance Overhead
-Indexes have to be updated on every table write. In case of PostgreSQL _all_
+Indexes have to be updated on every table write. In the case of PostgreSQL, _all_
existing indexes are updated whenever data is written to a table. As a
-result of this having many indexes on the same table slows down writes.
-
-Because of this one should ask themselves: is the reduction in query performance
-worth the overhead of maintaining an extra index?
+result, having many indexes on the same table slows down writes. It's therefore important
+to balance query performance with the overhead of maintaining an extra index.
-If adding an index reduces SELECT timings by 5 milliseconds but increases
-INSERT/UPDATE/DELETE timings by 10 milliseconds then the index may not be worth
-it. On the other hand, if SELECT timings are reduced but INSERT/UPDATE/DELETE
-timings are not affected you may want to add the index after all.
+Let's say that adding an index reduces SELECT timings by 5 milliseconds but increases
+INSERT/UPDATE/DELETE timings by 10 milliseconds. In this case, the new index may not be worth
+it. A new index is more valuable when SELECT timings are reduced and INSERT/UPDATE/DELETE
+timings are unaffected.
## Finding Unused Indexes
@@ -111,26 +102,32 @@ ORDER BY pg_relation_size(indexrelname::regclass) desc;
```
This query outputs a list containing all indexes that are never used and sorts
-them by indexes sizes in descending order. This query can be useful to
-determine if any previously indexes are useful after all. More information on
+them by indexes sizes in descending order. This query helps in
+determining whether existing indexes are still required. More information on
the meaning of the various columns can be found at
<https://www.postgresql.org/docs/current/monitoring-stats.html>.
-Because the output of this query relies on the actual usage of your database it
-may be affected by factors such as (but not limited to):
+To determine if an index is still being used on production, use the following
+Thanos query with your index name:
+
+```sql
+sum(rate(pg_stat_user_indexes_idx_tup_read{env="gprd", indexrelname="index_ci_name", type="patroni-ci"}[5m]))
+```
+
+Because the query output relies on the actual usage of your database, it
+may be affected by factors such as:
- Certain queries never being executed, thus not being able to use certain
indexes.
- Certain tables having little data, resulting in PostgreSQL using sequence
scans instead of index scans.
-In other words, this data is only reliable for a frequently used database with
-plenty of data and with as many GitLab features enabled (and being used) as
-possible.
+This data is only reliable for a frequently used database with
+plenty of data, and using as many GitLab features as possible.
## Requirements for naming indexes
-Indexes with complex definitions need to be explicitly named rather than
+Indexes with complex definitions must be explicitly named rather than
relying on the implicit naming behavior of migration methods. In short,
that means you **must** provide an explicit name argument for an index
created with one or more of the following options:
@@ -144,16 +141,7 @@ created with one or more of the following options:
### Considerations for index names
-Index names don't have any significance in the database, so they should
-attempt to communicate intent to others. The most important rule to
-remember is that generic names are more likely to conflict or be duplicated,
-and should not be used. Some other points to consider:
-
-- For general indexes, use a template, like: `index_{table}_{column}_{options}`.
-- For indexes added to solve a very specific problem, it may make sense
- for the name to reflect their use.
-- Identifiers in PostgreSQL have a maximum length of 63 bytes.
-- Check `db/structure.sql` for conflicts and ideas.
+Check our [Constraints naming conventions](database/constraint_naming_convention.md) page.
### Why explicit names are required
@@ -172,7 +160,7 @@ end
Creation of the second index would fail, because Rails would generate
the same name for both indexes.
-This is further complicated by the behavior of the `index_exists?` method.
+This naming issue is further complicated by the behavior of the `index_exists?` method.
It considers only the table name, column names, and uniqueness specification
of the index when making a comparison. Consider:
@@ -188,7 +176,7 @@ The call to `index_exists?` returns true if **any** index exists on
`:my_table` and `:my_column`, and index creation is bypassed.
The `add_concurrent_index` helper is a requirement for creating indexes
-on populated tables. Since it cannot be used inside a transactional
+on populated tables. Because it cannot be used inside a transactional
migration, it has a built-in check that detects if the index already
exists. In the event a match is found, index creation is skipped.
Without an explicit name argument, Rails can return a false positive
@@ -201,14 +189,14 @@ chance of error is greatly reduced.
There may be times when an index is only needed temporarily.
For example, in a migration, a column of a table might be conditionally
-updated. To query which columns need to be updated within the
-[query performance guidelines](query_performance.md), an index is needed that would otherwise
-not be used.
+updated. To query which columns must be updated in the
+[query performance guidelines](query_performance.md), an index is needed
+that would otherwise not be used.
-In these cases, a temporary index should be considered. To specify a
+In these cases, consider a temporary index. To specify a
temporary index:
-1. Prefix the index name with `tmp_` and follow the [naming conventions](database/constraint_naming_convention.md) and [requirements for naming indexes](#requirements-for-naming-indexes) for the rest of the name.
+1. Prefix the index name with `tmp_` and follow the [naming conventions](database/constraint_naming_convention.md).
1. Create a follow-up issue to remove the index in the next (or future) milestone.
1. Add a comment in the migration mentioning the removal issue.
@@ -237,10 +225,10 @@ on GitLab.com, the deployment process is blocked waiting for index
creation to finish.
To limit impact on GitLab.com, a process exists to create indexes
-asynchronously during weekend hours. Due to generally lower levels of
-traffic and lack of regular deployments, this process allows the
-creation of indexes to proceed with a lower level of risk. The below
-sections describe the steps required to use these features:
+asynchronously during weekend hours. Due to generally lower traffic and fewer deployments,
+index creation can proceed at a lower level of risk.
+
+### Schedule index creation for a low-impact time
1. [Schedule the index to be created](#schedule-the-index-to-be-created).
1. [Verify the MR was deployed and the index exists in production](#verify-the-mr-was-deployed-and-the-index-exists-in-production).
@@ -291,12 +279,10 @@ migration as expected for other installations. The below block
demonstrates how to create the second migration for the previous
asynchronous example.
-WARNING:
-The responsibility lies on the individual writing the migrations to verify
-the index exists in production before merging a second migration that
-adds the index using `add_concurrent_index`. If the second migration is
-deployed and the index has not yet been created, the index is created
-synchronously when the second migration executes.
+**WARNING:**
+Verify that the index exists in production before merging a second migration with `add_concurrent_index`.
+If the second migration is deployed before the index has been created,
+the index is created synchronously when the second migration executes.
```ruby
# in db/post_migrate/
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index de6840b2c6c..37de7044765 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -475,17 +475,18 @@ end
Developers can add [feature flags](../development/feature_flags/index.md) to GraphQL
fields in the following ways:
-- Add the `feature_flag` property to a field. This allows the field to be _hidden_
+- Add the [`feature_flag` property](#feature_flag-property) to a field. This allows the field to be _hidden_
from the GraphQL schema when the flag is disabled.
-- Toggle the return value when resolving the field.
+- [Toggle the return value](#toggle-the-value-of-a-field) when resolving the field.
You can refer to these guidelines to decide which approach to use:
- If your field is experimental, and its name or type is subject to
- change, use the `feature_flag` property.
+ change, use the [`feature_flag` property](#feature_flag-property).
- If your field is stable and its definition doesn't change, even after the flag is
- removed, toggle the return value of the field instead. Note that
+ removed, [toggle the return value](#toggle-the-value-of-a-field) of the field instead. Note that
[all fields should be nullable](#nullable-fields) anyway.
+- If your field will be accessed from frontend using the `@include` or `@skip` directive, [do not use the `feature_flag` property](#frontend-and-backend-feature-flag-strategies).
### `feature_flag` property
@@ -517,6 +518,20 @@ field :test_field, type: GraphQL::Types::String,
feature_flag: :my_feature_flag
```
+### Frontend and Backend feature flag strategies
+
+#### Directives
+
+When feature flags are used in the frontend to control the `@include` and `@skip` directives, do not use the `feature_flag`
+property on the server-side. For the accepted backend workaround, see [Toggle the value of a field](#toggle-the-value-of-a-field). It is recommended that the feature flag used in this approach be the same for frontend and backend.
+
+Even if the frontend directives evaluate to `@include:false` / `@skip:true`, the guarded entity is sent to the backend and matched
+against the GraphQL schema. We would then get an exception due to a schema mismatch. See the [frontend GraphQL guide](../development/fe_guide/graphql.md#the-include-directive) for more guidance.
+
+#### Different versions of a query
+
+See the guide frontend GraphQL guide for [different versions of a query](../development/fe_guide/graphql.md#different-versions-of-a-query), and [why it is not the preferred approach](../development/fe_guide/graphql.md#avoiding-multiple-query-versions)
+
### Toggle the value of a field
This method of using feature flags for fields is to toggle the
@@ -524,6 +539,12 @@ return value of the field. This can be done in the resolver, in the
type, or even in a model method, depending on your preference and
situation.
+Consider also [marking the field as Alpha](#marking-schema-items-as-alpha)
+while the value of the field can be toggled. You can
+[change or remove Alpha fields at any time](#breaking-change-exemptions) without needing to deprecate them.
+This also signals to consumers of the public GraphQL API that the field is not
+meant to be used yet.
+
When applying a feature flag to toggle the value of a field, the
`description` of the field must:
@@ -537,6 +558,7 @@ Example:
```ruby
field :foo, GraphQL::Types::String,
null: true,
+ deprecated: { reason: :alpha, milestone: '10.0' },
description: 'Some test field. Returns `null`' \
'if `my_feature_flag` feature flag is disabled.'
@@ -2007,13 +2029,13 @@ end
.to contain_exactly(a_graphql_entity_for(issue, :iid, :title, created_at: some_time))
```
-- Use `GraphqlHelpers#empty_schema` to create an empty schema, rather than creating
+- Use `GraphqlHelpers#empty_schema` to create an empty schema, rather than creating
one by hand. For example:
-
+
```ruby
# good
let(:schema) { empty_schema }
-
+
# bad
let(:query_type) { GraphQL::ObjectType.new }
let(:schema) { GraphQL::Schema.define(query: query_type, mutation: nil)}
@@ -2024,7 +2046,7 @@ end
```ruby
# good
let(:query) { query_double(schema: GitlabSchema) }
-
+
# bad
let(:query) { double('Query', schema: GitlabSchema) }
```
@@ -2092,9 +2114,9 @@ end
```ruby
type Types::IssueType.connection_type, null: true
```
-
+
However this might cause a cyclic definition, which can result in errors like:
-
+
```ruby
NameError: uninitialized constant Resolvers::GroupIssuesResolver
```
@@ -2109,7 +2131,7 @@ end
class IssueConnectionType < CountableConnectionType
end
end
-
+
Types::IssueConnectionType.prepend_mod_with('Types::IssueConnectionType')
```
@@ -2120,22 +2142,22 @@ end
```ruby
type "Types::IssueConnection", null: true
```
-
+
Only use this style if you are having spec failures. This is not intended to be a new
pattern that we use. This issue may disappear after we've upgraded to `2.x`.
-- There can be instances where a spec fails because the class is not loaded correctly.
- It relates to the
+- There can be instances where a spec fails because the class is not loaded correctly.
+ It relates to the
[circular dependencies problem](https://github.com/rmosolgo/graphql-ruby/issues/1929) and
[Adding field with resolver on a Type causes "Can't determine the return type " error on a different Type](https://github.com/rmosolgo/graphql-ruby/issues/3974).
Unfortunately, the errors generated don't really indicate what the problem is. For example,
- remove the quotes from the `Rspec.descrbe` in
+ remove the quotes from the `Rspec.descrbe` in
[ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb).
Then run `rspec ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb`.
-
+
This generates errors with the expectations. For example:
-
+
```ruby
1) Resolvers::ComplianceManagement::MergeRequests::ComplianceViolationResolver#resolve user is authorized filtering the results when given an array of project IDs finds the filtered compliance violations
Failure/Error: expect(subject).to contain_exactly(compliance_violation)
@@ -2145,10 +2167,10 @@ end
the extra elements were: [#<MergeRequests::ComplianceViolation id: 5, violating_user_id: 27, merge_request_id: 5, reason: "approved_by_merge_request_author", severity_level: "high">]
# ./ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb:55:in `block (6 levels) in <top (required)>'
```
-
+
However, this is not a case of the wrong result being generated, it's because of the loading order
of the `ComplianceViolationResolver` class.
-
+
The only way we've found to fix this is by quoting the class name in the spec. For example, changing
```ruby
@@ -2198,7 +2220,7 @@ end
[removed eventually](https://gitlab.com/gitlab-org/gitlab/-/issues/363121),
and writing unit tests for resolvers/mutations is
[already deprecated](#writing-unit-tests-deprecated)
-
+
## Notes about Query flow and GraphQL infrastructure
The GitLab GraphQL infrastructure can be found in `lib/gitlab/graphql`.
diff --git a/doc/development/application_limits.md b/doc/development/application_limits.md
index 6c7213ab235..2826b8a3bc4 100644
--- a/doc/development/application_limits.md
+++ b/doc/development/application_limits.md
@@ -12,8 +12,7 @@ limits to GitLab.
## Documentation
First of all, you have to gather information and decide which are the different
-limits that are set for the different GitLab tiers. You also need to
-coordinate with others to [document](../administration/instance_limits.md)
+limits that are set for the different GitLab tiers. Coordinate with others to [document](../administration/instance_limits.md)
and communicate those limits.
There is a guide about [introducing application
@@ -206,6 +205,6 @@ rate limiting architecture:
1. Making it possible to define and override limits per namespace / per plan.
1. Automatically generating documentation about what limits are implemented and
what the defaults are.
-1. Defining limits in a single place that is easy to find an explore.
+1. Defining limits in a single place that can be found and explored.
1. Soft and hard limits, with support for notifying users when a limit is
approaching.
diff --git a/doc/development/application_slis/rails_request_apdex.md b/doc/development/application_slis/rails_request_apdex.md
index f9613a14dd1..3e3cd100183 100644
--- a/doc/development/application_slis/rails_request_apdex.md
+++ b/doc/development/application_slis/rails_request_apdex.md
@@ -254,6 +254,6 @@ In the **Budget Attribution** row, the **Puma Apdex** log link shows you
how many requests are not meeting a 1s or 5s target.
Learn more about the content of the dashboard in the documentation for
-[Dashboards for stage groups](../stage_group_dashboards.md). For more information
+[Dashboards for stage groups](../stage_group_observability/index.md). For more information
on our exploration of the error budget itself, read the infrastructure issue
[Stage group error budget exploration dashboard](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1365).
diff --git a/doc/development/appsec/index.md b/doc/development/appsec/index.md
index 2ece3fdf4bf..8361170c3d2 100644
--- a/doc/development/appsec/index.md
+++ b/doc/development/appsec/index.md
@@ -1,32 +1,11 @@
---
-stage: Secure, Protect
-group: all
-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, dev, reference
+redirect_to: '../index.md'
+remove_date: '2022-09-23'
---
-# Application Security development documentation
+This document was moved to [another location](../index.md).
-Development guides that are specific to the stages that work on Application Security features are listed here.
-
-Please go to [Application Security](../../user/application_security/index.md) if you are looking for documentation on how to use those features.
-
-## Namespaces
-
-Application Security code in the Rails monolith is organized into the following namespaces, which generally follows
-the feature categories in the [Secure](https://about.gitlab.com/stages-devops-lifecycle/secure/) and [Protect](https://about.gitlab.com/stages-devops-lifecycle/protect/) stages.
-
-- `AppSec`: shared code.
- - `AppSec::ContainerScanning`: Container Scanning code.
- - `AppSec::Dast`: DAST code.
- - `AppSec::DependencyScanning`: Dependency Scanning code.
- - `AppSec::Fuzzing::API`: API Fuzzing code.
- - `AppSec::Fuzzing::Coverage`: Coverage Fuzzing code.
- - `AppSec::Fuzzing`: Shared fuzzing code.
- - `AppSec::LicenseCompliance`: License Compliance code.
- - `AppSec::Sast`: SAST code.
- - `AppSec::SecretDetection`: Secret Detection code.
- - `AppSec::VulnMgmt`: Vulnerability Management code.
-
-Most AppSec code does not conform to these namespace guidelines. When developing, make an effort
-to move existing code into the appropriate namespace whenever possible.
+<!-- This redirect file can be deleted after <2022-09-23>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/backend/ruby_style_guide.md b/doc/development/backend/ruby_style_guide.md
index eff6ae7f217..c86f21d4bac 100644
--- a/doc/development/backend/ruby_style_guide.md
+++ b/doc/development/backend/ruby_style_guide.md
@@ -16,7 +16,7 @@ document the new rule. For every new guideline, add it in a new section and link
[version history note](../documentation/versions.md#add-a-version-history-item)
to provide context and serve as a reference.
-Just because something is listed here does not mean it cannot be reopened for discussion.
+Everything listed here can be [reopened for discussion](https://about.gitlab.com/handbook/values/#disagree-commit-and-disagree).
## Instance variable access using `attr_reader`
diff --git a/doc/development/cicd/pipeline_wizard.md b/doc/development/cicd/pipeline_wizard.md
index 608c21778c0..7a0b70bd8e8 100644
--- a/doc/development/cicd/pipeline_wizard.md
+++ b/doc/development/cicd/pipeline_wizard.md
@@ -227,3 +227,21 @@ Use as `widget: list`. This inserts a `list` in the YAML file.
| `invalidFeedback` | **{dotted-circle}** No | string | Help text displayed when the pattern validation fails. |
| `default` | **{dotted-circle}** No | list | The default value for the list |
| `id` | **{dotted-circle}** No | string | The input field ID is usually autogenerated but can be overridden by providing this property. |
+
+#### Checklist
+
+Use as `widget: checklist`. This inserts a list of checkboxes that need to
+be checked before proceeding to the next step.
+
+| Name | Required | Type | Description |
+|---------|------------------------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `title` | **{dotted-circle}** No | string | A title above the checklist items. |
+| `items` | **{dotted-circle}** No | list | A list of items that need to be checked. Each item corresponds to one checkbox, and can be a string or [checklist item](#checklist-item). |
+
+##### Checklist Item
+
+| Name | Required | Type | Description |
+|--------|------------------------|---------|-----------------------------------------|
+| `text` | **{check-circle}** Yes | string | A title above the checklist items. |
+| `help` | **{dotted-circle}** No | string | Help text explaining the item. |
+| `id` | **{dotted-circle}** No | string | The input field ID is usually autogenerated but can be overridden by providing this property. |
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 8d88e7155a2..4ea7a9d960c 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -289,9 +289,32 @@ Please read [versioning](#versioning) section for introducing breaking change sa
## Versioning
-Versioning allows you to introduce a new template without modifying the existing
-one. This process is useful when we need to introduce a breaking change,
-but don't want to affect the existing projects that depends on the current template.
+To introduce a breaking change without affecting the existing projects that depend on
+the current template, use [stable](#stable-version) and [latest](#latest-version) versioning.
+
+Stable templates usually only receive breaking changes in major version releases, while
+latest templates can receive breaking changes in any release. In major release milestones,
+the latest template is made the new stable template (and the latest template might be deleted).
+
+Adding a latest template is safe, but comes with a maintenance burden:
+
+- GitLab has to choose a DRI to overwrite the stable template with the contents of the
+ latest template at the next major release of GitLab. The DRI is responsible for
+ supporting users who have trouble with the change.
+- When we make a new non-breaking change, both the stable and latest templates must be updated
+ to match, as must as possible.
+- A latest template could remain for longer than planned because many users could
+ directly depend on it continuing to exist.
+
+Before adding a new latest template, see if the change can be made to the stable
+template instead, even if it's a breaking change. If the template is intended for copy-paste
+usage only, it might be possible to directly change the stable version. Before changing
+the stable template with a breaking change in a minor milestone, make sure:
+
+- It's a [pipeline template](#template-types) and it has a [code comment](#explain-requirements-and-expectations)
+ explaining that it's not designed to be used with the `includes`.
+- The [CI/CD template usage metrics](#add-metrics) doesn't show any usage. If the metrics
+ show zero usage for the template, the template is not actively being used with `include`.
### Stable version
@@ -393,7 +416,9 @@ is updated in a major version GitLab release.
### Add metrics
-Every CI/CD template must also have metrics defined to track their use.
+Every CI/CD template must also have metrics defined to track their use. The CI/CD template monthly usage report
+can be found in [Sisense (GitLab team members only)](https://app.periscopedata.com/app/gitlab/785953/Pipeline-Authoring-Dashboard?widget=13440051&udv=0).
+Double click a template to see the graph for that single template.
To add a metric definition for a new template:
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index a6976271ddf..1225260e600 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -71,26 +71,34 @@ It picks reviewers and maintainers from the list at the
[engineering projects](https://about.gitlab.com/handbook/engineering/projects/)
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`.
- - GitLab user **Busy** indicator is set to `True`.
- - Emoji is from one of these categories:
- - **On leave** - 🌴 `:palm_tree:`, ðŸ–ï¸ `:beach:`, â›± `:beach_umbrella:`, 🖠`:beach_with_umbrella:`, 🌞 `:sun_with_face:`, 🎡 `:ferris_wheel:`
- - **Out sick** - ðŸŒ¡ï¸ `:thermometer:`, 🤒 `:face_with_thermometer:`
- - **At capacity** - 🔴 `:red_circle:`
- - **Focus mode** - 💡 `:bulb:` (focusing on their team's work)
-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
- is 🔵 `:large_blue_circle:` are more likely to be picked. This applies to both reviewers and trainee maintainers.
- - Reviewers with 🔵 `:large_blue_circle:` are two times as likely to be picked as other reviewers.
- - Trainee maintainers with 🔵 `:large_blue_circle:` are four times as likely to be picked as other reviewers.
-1. People whose [GitLab status](../user/profile/index.md#set-your-current-status) emoji
- is 🔶 `:large_orange_diamond:` or 🔸 `:small_orange_diamond:` are half as likely to be picked.
-1. It always picks the same reviewers and maintainers for the same
- branch name (unless their out-of-office (`OOO`) status changes, as in point 1). It
- removes leading `ce-` and `ee-`, and trailing `-ce` and `-ee`, so
- that it can be stable for backport branches.
+- 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`.
+ - GitLab user **Busy** indicator is set to `True`.
+ - Emoji is from one of these categories:
+ - **On leave** - 🌴 `:palm_tree:`, ðŸ–ï¸ `:beach:`, â›± `:beach_umbrella:`, 🖠`:beach_with_umbrella:`, 🌞 `:sun_with_face:`, 🎡 `:ferris_wheel:`
+ - **Out sick** - ðŸŒ¡ï¸ `:thermometer:`, 🤒 `:face_with_thermometer:`
+ - **At capacity** - 🔴 `:red_circle:`
+ - **Focus mode** - 💡 `:bulb:` (focusing on their team's work)
+- It doesn't pick people who are already assigned a number of reviews that is equal to
+ or greater than their chosen "review limit". The review limit is the maximum number of
+ reviews people are ready to handle at a time. Set a review limit by using one of the following
+ as a Slack or [GitLab status](../user/profile/index.md#set-your-current-status):
+ - 0ï¸âƒ£ - `:zero:` (similar to `:red_circle:`)
+ - 1ï¸âƒ£ - `:one:`
+ - 2ï¸âƒ£ - `:two:`
+ - 3ï¸âƒ£ - `:three:`
+ - 4ï¸âƒ£ - `:four:`
+ - 5ï¸âƒ£ - `:five:`
+- Team members whose Slack or [GitLab status](../user/profile/index.md#set-your-current-status) emoji
+ is 🔵 `:large_blue_circle:` are more likely to be picked. This applies to both reviewers and trainee maintainers.
+ - Reviewers with 🔵 `:large_blue_circle:` are two times as likely to be picked as other reviewers.
+ - [Trainee maintainers](https://about.gitlab.com/handbook/engineering/workflow/code-review/#trainee-maintainer) with 🔵 `:large_blue_circle:` are three times as likely to be picked as other reviewers.
+- People whose [GitLab status](../user/profile/index.md#set-your-current-status) emoji
+ is 🔶 `:large_orange_diamond:` or 🔸 `:small_orange_diamond:` are half as likely to be picked.
+- It always picks the same reviewers and maintainers for the same
+ branch name (unless their out-of-office (`OOO`) status changes, as in point 1). It
+ removes leading `ce-` and `ee-`, and trailing `-ce` and `-ee`, so
+ that it can be stable for backport branches.
The [Roulette dashboard](https://gitlab-org.gitlab.io/gitlab-roulette) contains:
@@ -131,7 +139,7 @@ with [domain expertise](#domain-experts).
1. If your merge request includes documentation changes, it must be **approved
by a [Technical writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments)**,
based on assignments in the appropriate [DevOps stage group](https://about.gitlab.com/handbook/product/categories/#devops-stages).
-1. If your merge request includes changes to development guidelines, follow the [review process](index.md#development-guidelines-review) and get the approvals accordingly.
+1. If your merge request includes changes to development guidelines, follow the [review process](development_processes.md#development-guidelines-review) and get the approvals accordingly.
1. If your merge request includes end-to-end **and** non-end-to-end changes (*4*), it must be **approved
by a [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors)**.
1. If your merge request only includes end-to-end changes (*4*) **or** if the MR author is a [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors), it must be **approved by a [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa)**
@@ -275,7 +283,7 @@ This saves reviewers time and helps authors catch mistakes earlier.
Verify that the merge request meets all [contribution acceptance criteria](contributing/merge_request_workflow.md#contribution-acceptance-criteria).
If a merge request is too large, fixes more than one issue, or implements more
-than one feature, you should guide the author towards spltting the merge request
+than one feature, you should guide the author towards splitting the merge request
into smaller merge requests.
When you are confident
@@ -300,11 +308,18 @@ Because a maintainer's job only depends on their knowledge of the overall GitLab
codebase, and not that of any specific domain, they can review, approve, and merge
merge requests from any team and in any product area.
-If a merge request is too large, fixes more than one issue, or implements more
-than one feature, the maintainer can ask the author to make the merge request
-smaller. Request the previous reviewer, or a merge request coach to help guide
-the author on how to split the merge request, and to review the resulting
-changes.
+A maintainer should ask the author to make a merge request smaller if it is:
+
+- Too large.
+- Fixes more than one issue.
+- Implements more than one feature.
+- Has a high complexity resulting in additional risk.
+
+The maintainer, any of the
+reviewers, or a merge request coach can step up to help the author to divide work
+into smaller iterations, and guide the author on how to split the merge request.
+The author may choose to request that the current maintainers and reviewers review the split MRs
+or request a new group of maintainers and reviewers.
Maintainers do their best to also review the specifics of the chosen solution
before merging, but as they are not necessarily [domain experts](#domain-experts), they may be poorly
diff --git a/doc/development/contributing/index.md b/doc/development/contributing/index.md
index 182d00d52ab..12fd7c3dc12 100644
--- a/doc/development/contributing/index.md
+++ b/doc/development/contributing/index.md
@@ -240,4 +240,4 @@ For information on how to contribute documentation, see GitLab
## Getting an Enterprise Edition License
If you need a license for contributing to an EE-feature, see
-[relevant information](https://about.gitlab.com/handbook/marketing/community-relations/code-contributor-program/#for-contributors-to-the-gitlab-enterprise-edition-ee).
+[relevant information](https://about.gitlab.com/handbook/marketing/community-relations/code-contributor-program/#contributing-to-the-gitlab-enterprise-edition-ee).
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index 97c8c179e09..c6d977cf5ad 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -68,7 +68,7 @@ labels, you can _always_ add the type, stage, group, and often the category/feat
Type labels are very important. They define what kind of issue this is. Every
issue should have one and only one.
-The current type labels are [available in the handbook](https://about.gitlab.com/handbook/engineering/metrics/#work-type-classification)
+The SSOT for type and subtype labels is [available in the handbook](https://about.gitlab.com/handbook/engineering/metrics/#work-type-classification).
A number of type labels have a priority assigned to them, which automatically
makes them float to the top, depending on their importance.
diff --git a/doc/development/dangerbot.md b/doc/development/dangerbot.md
index 003df4fe078..d2b231ebc7c 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](index.md#backend-guides)
+Danger code is Ruby code, so all our [usual backend guidelines](feature_development.md#backend-guides)
continue to apply. However, there are a few things that deserve special emphasis.
### When to use Danger
@@ -175,15 +175,7 @@ at GitLab so far:
- Database review
- Documentation review
- Merge request metrics
-- Reviewer roulette. Reviewers and maintainers are chosen based on:
- - Their roles (backend, frontend, database, etc).
- - Their availability:
- - No "OOO"/"PTO"/"Parental Leave" in their GitLab or Slack status.
- - No `:red_circle:`/`:palm_tree:`/`:beach:`/`:beach_umbrella:`/`:beach_with_umbrella:` emojis in GitLab or Slack status.
- - (Experimental) Their time zone: people for which the local hour is between
- 6 AM and 2 PM are eligible to be picked. This is to ensure they have a good
- chance to get to perform a review during their current work day. The experimentation is tracked in
- [this issue](https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/563)
+- [Reviewer roulette](code_review.md#reviewer-roulette)
- Single codebase effort
## Limitations
diff --git a/doc/development/database/add_foreign_key_to_existing_column.md b/doc/development/database/add_foreign_key_to_existing_column.md
index 9842814816f..7a18da2223f 100644
--- a/doc/development/database/add_foreign_key_to_existing_column.md
+++ b/doc/development/database/add_foreign_key_to_existing_column.md
@@ -64,18 +64,14 @@ emails = Email.where(user_id: 1) # returns emails for the deleted user
Add a `NOT VALID` foreign key constraint to the table, which enforces consistency on the record changes.
-[Using the `with_lock_retries` helper method is advised when performing operations on high-traffic tables](../migration_style_guide.md#when-to-use-the-helper-method),
-in this case, if the table or the foreign table is a high-traffic table, we should use the helper method.
-
In the example above, you'd be still able to update records in the `emails` table. However, when you'd try to update the `user_id` with non-existent value, the constraint causes a database error.
Migration file for adding `NOT VALID` foreign key:
```ruby
-class AddNotValidForeignKeyToEmailsUser < Gitlab::Database::Migration[1.0]
+class AddNotValidForeignKeyToEmailsUser < Gitlab::Database::Migration[2.0]
def up
- # safe to use: it requires short lock on the table since we don't validate the foreign key
- add_foreign_key :emails, :users, on_delete: :cascade, validate: false
+ add_concurrent_foreign_key :emails, :users, on_delete: :cascade, validate: false
end
def down
@@ -84,8 +80,14 @@ class AddNotValidForeignKeyToEmailsUser < Gitlab::Database::Migration[1.0]
end
```
+Adding a foreign key without validating it is a fast operation. It only requires a
+short lock on the table before being able to enforce the constraint on new data.
+We do still want to enable lock retries for high traffic and large tables.
+`add_concurrent_foreign_key` does this for us, and also checks if the foreign key already exists.
+
WARNING:
-Avoid using the `add_foreign_key` constraint more than once per migration file, unless the source and target tables are identical.
+Avoid using `add_foreign_key` or `add_concurrent_foreign_key` constraints more than
+once per migration file, unless the source and target tables are identical.
#### Data migration to fix existing records
@@ -98,7 +100,7 @@ In case the data volume is higher (>1000 records), it's better to create a backg
Example for cleaning up records in the `emails` table in a database migration:
```ruby
-class RemoveRecordsWithoutUserFromEmailsTable < Gitlab::Database::Migration[1.0]
+class RemoveRecordsWithoutUserFromEmailsTable < Gitlab::Database::Migration[2.0]
disable_ddl_transaction!
class Email < ActiveRecord::Base
@@ -121,6 +123,7 @@ end
### Validate the foreign key
Validating the foreign key scans the whole table and makes sure that each relation is correct.
+Fortunately, this does not lock the source table (`users`) while running.
NOTE:
When using [background migrations](background_migrations.md), foreign key validation should happen in the next GitLab release.
@@ -130,7 +133,7 @@ Migration file for validating the foreign key:
```ruby
# frozen_string_literal: true
-class ValidateForeignKeyOnEmailUsers < Gitlab::Database::Migration[1.0]
+class ValidateForeignKeyOnEmailUsers < Gitlab::Database::Migration[2.0]
def up
validate_foreign_key :emails, :user_id
end
diff --git a/doc/development/database/batched_background_migrations.md b/doc/development/database/batched_background_migrations.md
index 6d3d5fa7f92..f3ea82b5c61 100644
--- a/doc/development/database/batched_background_migrations.md
+++ b/doc/development/database/batched_background_migrations.md
@@ -244,8 +244,6 @@ background migration.
```ruby
class QueueBackfillRoutesNamespaceId < Gitlab::Database::Migration[2.0]
- disable_ddl_transaction!
-
MIGRATION = 'BackfillRouteNamespaceId'
DELAY_INTERVAL = 2.minutes
@@ -316,6 +314,137 @@ background migration.
After the batched migration is completed, you can safely depend on the
data in `routes.namespace_id` being populated.
+### Batching over non-distinct columns
+
+The default batching strategy provides an efficient way to iterate over primary key columns.
+However, if you need to iterate over columns where values are not unique, you must use a
+different batching strategy.
+
+The `LooseIndexScanBatchingStrategy` batching strategy uses a special version of [`EachBatch`](../iterating_tables_in_batches.md#loose-index-scan-with-distinct_each_batch)
+to provide efficient and stable iteration over the distinct column values.
+
+This example shows a batched background migration where the `issues.project_id` column is used as
+the batching column.
+
+Database post-migration:
+
+```ruby
+class ProjectsWithIssuesMigration < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'BatchProjectsWithIssues'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 5000
+ SUB_BATCH_SIZE = 500
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ disable_ddl_transaction!
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :issues,
+ :project_id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ batch_class_name: 'LooseIndexScanBatchingStrategy', # Override the default batching strategy
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :issues, :project_id, [])
+ end
+end
+```
+
+Implementing the background migration class:
+
+```ruby
+module Gitlab
+ module BackgroundMigration
+ class BatchProjectsWithIssues < Gitlab::BackgroundMigration::BatchedMigrationJob
+ include Gitlab::Database::DynamicModelHelpers
+
+ def perform
+ distinct_each_batch(operation_name: :backfill_issues) do |batch|
+ project_ids = batch.pluck(batch_column)
+ # do something with the distinct project_ids
+ end
+ end
+ end
+ end
+end
+```
+
+### Adding filters to the initial batching
+
+By default, when creating background jobs to perform the migration, batched background migrations will iterate over the full specified table. This is done using the [`PrimaryKeyBatchingStrategy`](https://gitlab.com/gitlab-org/gitlab/-/blob/c9dabd1f4b8058eece6d8cb4af95e9560da9a2ee/lib/gitlab/database/migrations/batched_background_migration_helpers.rb#L17). This means if there are 1000 records in the table and the batch size is 100, there will be 10 jobs. For illustrative purposes, `EachBatch` is used like this:
+
+```ruby
+# PrimaryKeyBatchingStrategy
+Projects.all.each_batch(of: 100) do |relation|
+ relation.where(foo: nil).update_all(foo: 'bar') # this happens in each background job
+end
+```
+
+There are cases where we only need to look at a subset of records. Perhaps we only need to update 1 out of every 10 of those 1000 records. It would be best if we could apply a filter to the initial relation when the jobs are created:
+
+```ruby
+Projects.where(foo: nil).each_batch(of: 100) do |relation|
+ relation.update_all(foo: 'bar')
+end
+```
+
+In the `PrimaryKeyBatchingStrategy` example, we do not know how many records will be updated in each batch. In the filtered example, we know exactly 100 will be updated with each batch.
+
+The `PrimaryKeyBatchingStrategy` contains [a method that can be overwritten](https://gitlab.com/gitlab-org/gitlab/-/blob/dd1e70d3676891025534dc4a1e89ca9383178fe7/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb#L38-52) to apply additional filtering on the initial `EachBatch`.
+
+We can accomplish this by:
+
+1. Create a new class that inherits from `PrimaryKeyBatchingStrategy` and overrides the method using the desired filter (this may be the same filter used in the sub-batch):
+
+ ```ruby
+ # frozen_string_literal: true
+
+ module GitLab
+ module BackgroundMigration
+ module BatchingStrategies
+ class FooStrategy < PrimaryKeyBatchingStrategy
+ def apply_additional_filters(relation, job_arguments: [], job_class: nil)
+ relation.where(foo: nil)
+ end
+ end
+ end
+ end
+ end
+ ```
+
+1. In the post-deployment migration that queues the batched background migration, specify the new batching strategy using the `batch_class_name` parameter:
+
+ ```ruby
+ class BackfillProjectsFoo < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'BackfillProjectsFoo'
+ DELAY_INTERVAL = 2.minutes
+ BATCH_CLASS_NAME = 'FooStrategy'
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :routes,
+ :id,
+ job_interval: DELAY_INTERVAL,
+ batch_class_name: BATCH_CLASS_NAME
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :routes, :id, [])
+ end
+ end
+ ```
+
+When applying a batching strategy, it is important to ensure the filter properly covered by an index to optimize `EachBatch` performance. See [the `EachBatch` docs for more information](../iterating_tables_in_batches.md).
+
## Testing
Writing tests is required for:
@@ -357,7 +486,7 @@ You can view failures in two ways:
- Via GitLab logs:
1. After running a batched background migration, if any jobs fail,
- view the logs in [Kibana](https://log.gprd.gitlab.net/goto/5f06a57f768c6025e1c65aefb4075694).
+ view the logs in [Kibana](https://log.gprd.gitlab.net/goto/4cb43f40-f861-11ec-b86b-d963a1a6788e).
View the production Sidekiq log and filter for:
- `json.new_state: failed`
diff --git a/doc/development/database/constraint_naming_convention.md b/doc/development/database/constraint_naming_convention.md
index 72f16c20559..2f0b8bf0463 100644
--- a/doc/development/database/constraint_naming_convention.md
+++ b/doc/development/database/constraint_naming_convention.md
@@ -25,5 +25,7 @@ The intent is not to retroactively change names in existing databases but rather
## Observations
+- Check `db/structure.sql` for conflicts.
- Prefixes are preferred over suffices because they make it easier to identify the type of a given constraint quickly, as well as group them alphabetically;
- The `_and_` that joins column names can be omitted to keep the identifiers under the 63 characters' length limit defined by PostgreSQL. Additionally, the notation may be abbreviated to the best of our ability if struggling to keep under this limit.
+- For indexes added to solve a very specific problem, it may make sense for the name to reflect their use.
diff --git a/doc/development/database/loose_foreign_keys.md b/doc/development/database/loose_foreign_keys.md
index dec51d484fd..6aa1b9c40ff 100644
--- a/doc/development/database/loose_foreign_keys.md
+++ b/doc/development/database/loose_foreign_keys.md
@@ -66,8 +66,6 @@ The tool ensures that all aspects of swapping a foreign key are covered. This in
- Updating `db/structure.sql` with the new migration.
- Updating `lib/gitlab/database/gitlab_loose_foreign_keys.yml` to add the new loose foreign key.
- Creating or updating a model's specs to ensure that the loose foreign key is properly supported.
-- Creating a new branch, commit, push, and creating a merge request on GitLab.com.
-- Creating a merge request template with all the necessary details to validate the safety of the foreign key removal.
The tool is located at `scripts/decomposition/generate-loose-foreign-key`:
@@ -77,9 +75,7 @@ $ scripts/decomposition/generate-loose-foreign-key -h
Usage: scripts/decomposition/generate-loose-foreign-key [options] <filters...>
-c, --cross-schema Show only cross-schema foreign keys
-n, --dry-run Do not execute any commands (dry run)
- -b, --[no-]branch Create or not a new branch
-r, --[no-]rspec Create or not a rspecs automatically
- -m, --milestone MILESTONE Specify custom milestone (current: 14.8)
-h, --help Prints this help
```
diff --git a/doc/development/database/multiple_databases.md b/doc/development/database/multiple_databases.md
index 7badd7f76fa..9641ea37002 100644
--- a/doc/development/database/multiple_databases.md
+++ b/doc/development/database/multiple_databases.md
@@ -6,8 +6,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Multiple Databases
-To scale GitLab, the we are
-[decomposing the GitLab application database into multiple databases](https://gitlab.com/groups/gitlab-org/-/epics/6168).
+To allow GitLab to scale further we
+[decomposed the GitLab application database into multiple
+databases](https://gitlab.com/groups/gitlab-org/-/epics/6168). The two databases
+are `main` and `ci`. GitLab supports being run with either one database or two databases.
+On GitLab.com we are using two separate databases.
## GitLab Schema
@@ -23,6 +26,7 @@ Each table of GitLab needs to have a `gitlab_schema` assigned:
- `gitlab_main`: describes all tables that are being stored in the `main:` database (for example, like `projects`, `users`).
- `gitlab_ci`: describes all CI tables that are being stored in the `ci:` database (for example, `ci_pipelines`, `ci_builds`).
+- `gitlab_geo`: describes all Geo tables that are being stored in the `geo:` database (for example, like `project_registry`, `secondary_usage_data`).
- `gitlab_shared`: describe all application tables that contain data across all decomposed databases (for example, `loose_foreign_keys_deleted_records`) for models that inherit from `Gitlab::Database::SharedModel`.
- `gitlab_internal`: describe all internal tables of Rails and PostgreSQL (for example, `ar_internal_metadata`, `schema_migrations`, `pg_*`).
- `...`: more schemas to be introduced with additional decomposed databases
@@ -31,6 +35,7 @@ The usage of schema enforces the base class to be used:
- `ApplicationRecord` for `gitlab_main`
- `Ci::ApplicationRecord` for `gitlab_ci`
+- `Geo::TrackingBase` for `gitlab_geo`
- `Gitlab::Database::SharedModel` for `gitlab_shared`
### The impact of `gitlab_schema`
@@ -40,7 +45,7 @@ The `gitlab_schema` primary purpose is to introduce a barrier between different
This is used as a primary source of classification for:
-- [Discovering cross-joins across tables from different schemas](#removing-joins-between-ci_-and-non-ci_-tables)
+- [Discovering cross-joins across tables from different schemas](#removing-joins-between-ci-and-non-ci-tables)
- [Discovering cross-database transactions across tables from different schemas](#removing-cross-database-transactions)
### The special purpose of `gitlab_shared`
@@ -72,10 +77,6 @@ Read [Migrations for Multiple Databases](migrations_for_multiple_databases.md).
## CI/CD Database
-> Support for configuring the GitLab Rails application to use a distinct
-database for CI/CD tables was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64289)
-in GitLab 14.1. This feature is still under development, and is not ready for production use.
-
### Configure single database
By default, GDK is configured to run with multiple databases.
@@ -107,32 +108,14 @@ NOTE: The `validate_cross_joins!` method in `spec/support/database/prevent_cross
the corresponding documentation URL used in `spec/support/database/prevent_cross_joins.rb`.
-->
-### Removing joins between `ci_*` and non `ci_*` tables
+### Removing joins between `ci` and non `ci` tables
Queries that join across databases raise an error. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68620)
in GitLab 14.3, for new queries only. Pre-existing queries do not raise an error.
-We are planning on moving all the `ci_*` tables to a separate database, so
-referencing `ci_*` tables with other tables will not be possible. This means,
-that using any kind of `JOIN` in SQL queries will not work. We have identified
-already many such examples that need to be fixed in
-<https://gitlab.com/groups/gitlab-org/-/epics/6289> .
-
-#### Path to removing cross-database joins
-
-The following steps are the process to remove cross-database joins between
-`ci_*` and non `ci_*` tables:
-
-1. **{check-circle}** Add all failing specs to the [`cross-join-allowlist.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/support/database/cross-join-allowlist.yml)
- file.
-1. **{check-circle}** Find the code that caused the spec failure and wrap the isolated code
- in [`allow_cross_joins_across_databases`](#allowlist-for-existing-cross-joins).
- Link to a new issue assigned to the correct team to remove the specs from the
- `cross-join-allowlist.yml` file.
-1. **{dotted-circle}** Remove the `cross-join-allowlist.yml` file and stop allowing
- whole test files.
-1. **{dotted-circle}** Fix the problem and remove the `allow_cross_joins_across_databases` call.
-1. **{dotted-circle}** Fix all the cross-joins and remove the `allow_cross_joins_across_databases` method.
+Because GitLab can be run with multiple separate databases, referencing `ci`
+tables with non `ci` tables in a single query is not possible. Therefore,
+using any kind of `JOIN` in SQL queries will not work.
#### Suggestions for removing cross-database joins
@@ -416,13 +399,10 @@ query or look at other patterns described above for removing cross-joins.
#### How to validate you have correctly removed a cross-join
-Using RSpec tests, you can validate all SQL queries within a code block to
-ensure that none of them are joining across the two databases. This is a useful
-tool to confirm you have correctly fixed an existing cross-join.
-
-At some point in the future we will have fixed all cross-joins and this tool
-will run by default in all tests. For now, the tool needs to be explicitly enabled
-for your test.
+RSpec is configured to automatically validate all SQL queries do not join
+across databases. If this validation is disabled in
+`spec/support/database/cross-join-allowlist.yml` then you can still validate an
+isolated code block using `with_cross_joins_prevented`.
You can use this method like so:
@@ -553,12 +533,11 @@ The `MyAsyncConsistencyJob` would also attempt to update the timestamp if they d
At this point, we don't have the tooling (we might not even need it) to ensure similar consistency
characteristics as we had with one database. If you think that the code you're working on requires
-these properties, then you can disable the cross-database modification check by wrapping to
-offending database queries with a block and create a follow-up issue mentioning the sharding group
-(`gitlab-org/sharding-group`).
+these properties, then you can disable the cross-database modification check in your tests by wrapping the
+offending test code with a block and create a follow-up issue.
```ruby
-Gitlab::Database.allow_cross_joins_across_databases(url: 'gitlab issue URL') do
+allow_cross_database_modification_within_transaction(url: 'gitlab issue URL') do
ApplicationRecord.transaction do
ci_build.update!(updated_at: Time.current) # UPDATE on CI DB
ci_build.project.update!(updated_at: Time.current) # UPDATE on Main DB
@@ -567,7 +546,7 @@ end
```
Don't hesitate to reach out to the
-[sharding group](https://about.gitlab.com/handbook/engineering/development/enablement/sharding/)
+[pods group](https://about.gitlab.com/handbook/engineering/development/enablement/data_stores/pods/)
for advice.
##### Avoid `dependent: :nullify` and `dependent: :destroy` across databases
diff --git a/doc/development/database/transaction_guidelines.md b/doc/development/database/transaction_guidelines.md
index d96d11f05a5..255de19a420 100644
--- a/doc/development/database/transaction_guidelines.md
+++ b/doc/development/database/transaction_guidelines.md
@@ -132,12 +132,12 @@ end
build_1 = Ci::Build.find(1)
build_2 = Ci::Build.find(2)
-ActiveRecord::Base.transaction do
+ApplicationRecord.transaction do
build_1.touch
build_2.touch
end
```
-The `ActiveRecord::Base` class uses a different database connection than the `Ci::Build` records.
+The `ApplicationRecord` class uses a different database connection than the `Ci::Build` records.
The two statements in the transaction block are not part of the transaction and are
rolled back in case something goes wrong. They act as 3rd part calls.
diff --git a/doc/development/deprecation_guidelines/img/deprecation_removal_process.png b/doc/development/deprecation_guidelines/img/deprecation_removal_process.png
index 99642ebbae0..594e15861b0 100644
--- a/doc/development/deprecation_guidelines/img/deprecation_removal_process.png
+++ b/doc/development/deprecation_guidelines/img/deprecation_removal_process.png
Binary files differ
diff --git a/doc/development/deprecation_guidelines/index.md b/doc/development/deprecation_guidelines/index.md
index 7fbe2261f4d..4e1d2e22e78 100644
--- a/doc/development/deprecation_guidelines/index.md
+++ b/doc/development/deprecation_guidelines/index.md
@@ -41,7 +41,9 @@ changes](../contributing/index.md#breaking-changes) to GitLab features.
Deprecations should be announced on the [Deprecated feature removal schedule](../../update/deprecations.md).
-For steps to create a deprecation entry, see [Deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations).
+Do not include the deprecation announcement in the merge request that introduces a code change for the deprecation.
+Use a separate MR to create a deprecation entry. For steps to create a deprecation entry, see
+[Deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations).
## When can a feature be removed/changed?
diff --git a/doc/development/development_processes.md b/doc/development/development_processes.md
new file mode 100644
index 00000000000..e199aedd3f5
--- /dev/null
+++ b/doc/development/development_processes.md
@@ -0,0 +1,124 @@
+---
+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"
+---
+
+# Development processes
+
+Consult these topics for information on development processes for contributing to GitLab.
+
+## 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)
+- [Patch release process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/patch/process.md#process-for-developers)
+- [Guidelines for implementing Enterprise Edition features](ee_features.md)
+- [Adding a new service component to GitLab](adding_service_component.md)
+- [Guidelines for changelogs](changelog.md)
+- [Dependencies](dependencies.md)
+- [Danger bot](dangerbot.md)
+- [Requesting access to ChatOps on GitLab.com](chatops_on_gitlabcom.md#requesting-access) (for GitLab team members)
+
+### 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 the page is not assigned to a specific group, follow the
+[Technical Writing review process for 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/)
+ - [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 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 the page is not assigned to a specific group, follow the
+ [Technical Writing review process for development guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines).
+ 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.
+
+## 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)
diff --git a/doc/development/documentation/restful_api_styleguide.md b/doc/development/documentation/restful_api_styleguide.md
index 1f270a2b5ee..92c34c01e5d 100644
--- a/doc/development/documentation/restful_api_styleguide.md
+++ b/doc/development/documentation/restful_api_styleguide.md
@@ -66,7 +66,8 @@ Supported attributes:
| `attribute` | datatype | **{dotted-circle}** No | Detailed description. |
| `attribute` | datatype | **{dotted-circle}** No | Detailed description. |
-Response body attributes:
+If successful, returns [`<status_code>`](../../api/index.md#status-codes) and the following
+response attributes:
| Attribute | Type | Description |
|:-------------------------|:---------|:----------------------|
@@ -103,7 +104,10 @@ for the section. For example:
> `widget_message` [introduced](<link-to-issue>) in GitLab 14.3.
```
-## Attribute deprecation
+## Deprecations
+
+To document the deprecation of an API endpoint, follow the steps to
+[deprecate a page or topic](versions.md#deprecate-a-page-or-topic).
To deprecate an attribute:
@@ -121,8 +125,8 @@ To deprecate an attribute:
| `widget_name` | string | **{dotted-circle}** No | [Deprecated](<link-to-issue>) in GitLab 14.7 and is planned for removal in 15.4. Use `widget_id` instead. The name of the widget. |
```
-1. Optional. To widely announce the change, or if it's a breaking change,
- [update the deprecations and removals documentation](../deprecation_guidelines/#update-the-deprecations-and-removals-documentation).
+To widely announce a deprecation, or if it's a breaking change,
+[update the deprecations and removals documentation](../deprecation_guidelines/#update-the-deprecations-and-removals-documentation).
## Method description
@@ -151,6 +155,14 @@ For information about writing attribute descriptions, see the [GraphQL API descr
## Response body description
+Start the description with the following sentence, replacing `status code` with the
+relevant [HTTP status code](../../api/index.md#status-codes), for example:
+
+```markdown
+If successful, returns [`200 OK`](../../api/index.md#status-codes) and the
+following response attributes:
+```
+
Use the following table headers to describe the response bodies. Attributes should
always be in code blocks using backticks (`` ` ``).
diff --git a/doc/development/documentation/site_architecture/folder_structure.md b/doc/development/documentation/site_architecture/folder_structure.md
index e960a6491c7..0e8065d794f 100644
--- a/doc/development/documentation/site_architecture/folder_structure.md
+++ b/doc/development/documentation/site_architecture/folder_structure.md
@@ -85,6 +85,15 @@ place for it.
Do not include the same information in multiple places.
[Link to a single source of truth instead.](../styleguide/index.md#link-instead-of-repeating-text)
+For example, if you have code in a repository other than the [primary repositories](index.md#architecture),
+and documentation in the same repository, you can keep the documentation in that repository.
+
+Then you can either:
+
+- Publish it to <https://docs.gitlab.com>.
+- Link to it from <https://docs.gitlab.com> by adding an entry in the global navigation.
+ View [an example](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/fedb6378a3c92274ba3b6031df0d34455594e4cc/content/_data/navigation.yaml#L2944).
+
## References across documents
- Give each folder an `index.md` page that introduces the topic, and both introduces
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index 05015fe7c5f..af24fbe303b 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -59,6 +59,19 @@ product, and all together are pulled to generate the docs website:
Learn more about [the docs folder structure](folder_structure.md).
+### Documentation in other repositories
+
+If you have code and documentation in a repository other than the [primary repositories](#architecture),
+you should keep the documentation with the code in that repository.
+
+Then you can either:
+
+- [Add the repository to the list of products](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/development.md#add-a-new-product)
+ published at <https://docs.gitlab.com>.
+- [Add an entry in the global navigation](global_nav.md#add-a-navigation-entry) for
+ <https://docs.gitlab.com> that links to the documentation in that repository.
+ View [an example](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/fedb6378a3c92274ba3b6031df0d34455594e4cc/content/_data/navigation.yaml#L2944-L2946).
+
## Assets
To provide an optimized site structure, design, and a search-engine friendly
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 700d64c30d1..1af0cb72055 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -49,7 +49,7 @@ GitLab adds all troubleshooting information to the documentation, no matter how
unlikely a user is to encounter a situation.
GitLab Support maintains their own
-[troubleshooting content](../../../administration/index.md#support-team-docs)
+[troubleshooting content](../../../administration/index.md#support-team-documentation)
in the GitLab documentation.
### The documentation includes all media types
@@ -1096,14 +1096,15 @@ copy of `https://gitlab.com/gitlab-org/gitlab`, run in a terminal:
### Animated images
-Sometimes an image with animation (such as an animated GIF)
-can help the reader understand a complicated interaction with the user interface.
+Avoid using animated images (such as animated GIFs). They can be distracting
+and annoying for users.
-However, you should use them sparingly and avoid them when you can.
-Do not use them to replace written descriptions of processes or the product.
+If you're describing a complicated interaction in the user interface and want to
+include a visual representation to help readers understand it, you can:
-If you include an animated image, follow the same size and naming conventions we use for images. If the animated image loops, add at least a three
-second pause to the end of the loop.
+- Use a static image (screenshot) and if necessary, add callouts to emphasize an
+ an area of the screen.
+- Create a short video of the interaction and link to it.
## Videos
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index feb10845aea..d55cbe28d9b 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -361,6 +361,7 @@ To configure Vale in your editor, install one of the following as appropriate:
- Sublime Text [`SublimeLinter-contrib-vale` package](https://packagecontrol.io/packages/SublimeLinter-contrib-vale).
- Visual Studio Code [`errata-ai.vale-server` extension](https://marketplace.visualstudio.com/items?itemName=errata-ai.vale-server).
You can configure the plugin to [display only a subset of alerts](#show-subset-of-vale-alerts).
+- Atom [`atomic-vale` package](https://atom.io/packages/atomic-vale).
- Vim [ALE plugin](https://github.com/dense-analysis/ale).
- JetBrains IDEs - No plugin exists, but
[this issue comment](https://github.com/errata-ai/vale-server/issues/39#issuecomment-751714451)
diff --git a/doc/development/event_store.md b/doc/development/event_store.md
index fa7208ead04..ffde51216cf 100644
--- a/doc/development/event_store.md
+++ b/doc/development/event_store.md
@@ -293,6 +293,8 @@ in the `handle_event` method of the subscriber worker.
## Testing
+### Testing the publisher
+
The publisher's responsibility is to ensure that the event is published correctly.
To test that an event has been published correctly, we can use the RSpec matcher `:publish_event`:
@@ -308,6 +310,25 @@ it 'publishes a ProjectDeleted event with project id and namespace id' do
end
```
+It is also possible to compose matchers inside the `:publish_event` matcher.
+This could be useful when we want to assert that an event is created with a certain kind of value,
+but we do not know the value in advance. An example of this is when publishing an event
+after creating a new record.
+
+```ruby
+it 'publishes a ProjectCreatedEvent with project id and namespace id' do
+ # The project ID will only be generated when the `create_project`
+ # is called in the expect block.
+ expected_data = { project_id: kind_of(Numeric), namespace_id: group_id }
+
+ expect { create_project(user, name: 'Project', path: 'project', namespace_id: group_id) }
+ .to publish_event(Projects::ProjectCreatedEvent)
+ .with(expected_data)
+end
+```
+
+### Testing the subscriber
+
The subscriber must ensure that a published event can be consumed correctly. For this purpose
we have added helpers and shared examples to standardize the way we test subscribers:
diff --git a/doc/development/experiment_guide/experiment_code_reviews.md b/doc/development/experiment_guide/experiment_code_reviews.md
index eda316db9d4..07bc0f59463 100644
--- a/doc/development/experiment_guide/experiment_code_reviews.md
+++ b/doc/development/experiment_guide/experiment_code_reviews.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Adoption
+group: Acquisition
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
---
diff --git a/doc/development/experiment_guide/experiment_rollout.md b/doc/development/experiment_guide/experiment_rollout.md
index ff0844f9d3c..e68520f7812 100644
--- a/doc/development/experiment_guide/experiment_rollout.md
+++ b/doc/development/experiment_guide/experiment_rollout.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Adoption
+group: Acquisition
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
---
diff --git a/doc/development/experiment_guide/implementing_experiments.md b/doc/development/experiment_guide/implementing_experiments.md
index c9e277873dc..19200d48637 100644
--- a/doc/development/experiment_guide/implementing_experiments.md
+++ b/doc/development/experiment_guide/implementing_experiments.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Adoption
+group: Acquisition
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
---
diff --git a/doc/development/experiment_guide/index.md b/doc/development/experiment_guide/index.md
index 163cd009c51..e11e516485a 100644
--- a/doc/development/experiment_guide/index.md
+++ b/doc/development/experiment_guide/index.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Activation
+group: Acquisition
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
---
diff --git a/doc/development/experiment_guide/testing_experiments.md b/doc/development/experiment_guide/testing_experiments.md
index a73896c8436..78a5d606490 100644
--- a/doc/development/experiment_guide/testing_experiments.md
+++ b/doc/development/experiment_guide/testing_experiments.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Activation
+group: Acquisition
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
---
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index 67b53fa0299..10db332d64c 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -597,7 +597,7 @@ export default {
Note that, even if the directive evaluates to `false`, the guarded entity is sent to the backend and
matched against the GraphQL schema. So this approach requires that the feature-flagged entity
exists in the schema, even if the feature flag is disabled. When the feature flag is turned off, it
-is recommended that the resolver returns `null` at the very least.
+is recommended that the resolver returns `null` at the very least using the same feature flag as the frontend. See the [API GraphQL guide](../api_graphql_styleguide.md#frontend-and-backend-feature-flag-strategies).
##### Different versions of a query
@@ -617,8 +617,10 @@ export default {
};
```
-This approach is not recommended as it results in bigger merge requests and requires maintaining
-two similar queries for as long as the feature flag exists. This can be used in cases where the new
+##### Avoiding multiple query versions
+
+The multiple version approach is not recommended as it results in bigger merge requests and requires maintaining
+two similar queries for as long as the feature flag exists. Multiple versions can be used in cases where the new
GraphQL entities are not yet part of the schema, or if they are feature-flagged at the schema level
(`new_entity: :feature_flag`).
diff --git a/doc/development/fe_guide/haml.md b/doc/development/fe_guide/haml.md
index 00096ce7fdc..7e72570454e 100644
--- a/doc/development/fe_guide/haml.md
+++ b/doc/development/fe_guide/haml.md
@@ -8,15 +8,20 @@ info: To determine the technical writer assigned to the Stage/Group associated w
[HAML](https://haml.info/) is the [Ruby on Rails](https://rubyonrails.org/) template language that GitLab uses.
-## GitLab UI form builder
+## HAML and our Pajamas Design System
[GitLab UI](https://gitlab-org.gitlab.io/gitlab-ui/) is a Vue component library that conforms
-to the [Pajamas design system](https://design.gitlab.com/). Most of these components
+to the [Pajamas design system](https://design.gitlab.com/). Many of these components
rely on JavaScript and therefore can only be used in Vue.
-However, some of the simpler components (checkboxes, radio buttons, form inputs) can be
-used in HAML by applying the correct CSS classes to the elements. A custom
-[Ruby on Rails form builder](https://gitlab.com/gitlab-org/gitlab/-/blob/7c108df101e86d8a27d69df2b5b1ff1fc24133c5/lib/gitlab/form_builders/gitlab_ui_form_builder.rb) exists to help use GitLab UI components in HAML.
+However, some of the simpler components (such as buttons, checkboxes, or form inputs) can be
+used in HAML:
+
+- Some of the Pajamas components are available as a [ViewComponent](view_component.md#pajamas-components). Use these when possible.
+- If no ViewComponent exists, why not go ahead and create it? Talk to the Foundations team if you need help.
+- As a fallback, this can be done by applying the correct CSS classes to the elements.
+- A custom
+[Ruby on Rails form builder](https://gitlab.com/gitlab-org/gitlab/-/blob/7c108df101e86d8a27d69df2b5b1ff1fc24133c5/lib/gitlab/form_builders/gitlab_ui_form_builder.rb) exists to help use GitLab UI components in HAML forms.
### Use the GitLab UI form builder
@@ -100,7 +105,7 @@ Currently only the listed components are available but more components are plann
This component supports [ViewComponent slots](https://viewcomponent.org/guide/slots.html).
-| Slot | Description
+| Slot | Description
|---|---|
| `label` | Checkbox label content. This slot can be used instead of the `label` argument. |
| `help_text` | Help text content displayed below the checkbox. This slot can be used instead of the `help_text` argument. |
@@ -128,7 +133,7 @@ This component supports [ViewComponent slots](https://viewcomponent.org/guide/sl
This component supports [ViewComponent slots](https://viewcomponent.org/guide/slots.html).
-| Slot | Description
+| Slot | Description
|---|---|
| `label` | Checkbox label content. This slot can be used instead of the `label` argument. |
| `help_text` | Help text content displayed below the radio button. This slot can be used instead of the `help_text` argument. |
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index 9ef4375d795..544985d7edc 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -89,6 +89,10 @@ How to use [GraphQL](graphql.md).
How to use [HAML](haml.md).
+## ViewComponent
+
+How we use [ViewComponent](view_component.md).
+
## Icons and Illustrations
How we use SVG for our [Icons and Illustrations](icons.md).
diff --git a/doc/development/fe_guide/style/scss.md b/doc/development/fe_guide/style/scss.md
index 5d5b250e9a9..451b0c8a4c6 100644
--- a/doc/development/fe_guide/style/scss.md
+++ b/doc/development/fe_guide/style/scss.md
@@ -153,7 +153,7 @@ Usage of the `extend` at-rule is prohibited due to [memory leaks](https://gitlab
}
// Good
-@mixing gl-pt-3 {
+@mixin gl-pt-3 {
padding-top: 12px;
}
diff --git a/doc/development/fe_guide/view_component.md b/doc/development/fe_guide/view_component.md
new file mode 100644
index 00000000000..f4bb7ac3a2e
--- /dev/null
+++ b/doc/development/fe_guide/view_component.md
@@ -0,0 +1,174 @@
+---
+stage: Ecosystem
+group: Foundations
+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
+---
+
+# ViewComponent
+
+ViewComponent is a framework for creating reusable, testable & encapsulated view
+components with Ruby on Rails, without the need for a JavaScript framework like Vue.
+They are rendered server-side and can be seamlessly used with template languages like [Haml](haml.md).
+
+Refer to the official [documentation](https://viewcomponent.org/) to learn more or
+watch this [introduction video](https://youtu.be/akRhUbvtnmo).
+
+## Pajamas components
+
+Some of the components of our [Pajamas](https://design.gitlab.com) design system are
+available as a ViewComponent in `app/components/pajamas`.
+
+NOTE:
+We have a small but growing number of Pajamas components. Reach out to the
+[Foundations team](https://about.gitlab.com/handbook/engineering/development/dev/ecosystem/foundations/)
+if the component you are looking for is not yet available.
+
+### Available components
+
+#### Alert
+
+The `Pajamas::AlertComponent` follows the [Pajamas Alert](https://design.gitlab.com/components/alert) specification.
+
+**Examples:**
+
+By default this creates a dismissible info alert with icon:
+
+```haml
+= render Pajamas::AlertComponent.new(title: "Almost done!")
+```
+
+You can set variant, hide the icons and more:
+
+```haml
+= render Pajamas::AlertComponent.new(title: "All done!",
+ variant: :success,
+ dismissible: :false,
+ show_icon: false)
+```
+
+For the full list of options, see its
+[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/components/pajamas/alert_component.rb).
+
+#### Banner
+
+The `Pajamas::BannerComponent` follows the [Pajamas Banner](https://design.gitlab.com/components/banner) specification.
+
+**Examples:**
+
+In its simplest form the banner component looks like this:
+
+```haml
+= render Pajamas::BannerComponent.new(button_text: 'Learn more', button_link: example_path,
+ svg_path: 'illustrations/example.svg') do |c|
+ - c.title { 'Hello world!' }
+ %p Content of your banner goes here...
+```
+
+If you have a need for more control, you can also use the `illustration` slot
+instead of `svg_path` and the `primary_action` slot instead of `button_text` and `button_link`:
+
+```haml
+= render Pajamas::BannerComponent.new do |c|
+ - c.illustration do
+ = custom_icon('my_inline_svg')
+ - c.title do
+ Hello world!
+ - c.primary_action do
+ = render 'my_button_in_a_partial'
+```
+
+For the full list of options, see its
+[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/components/pajamas/banner_component.rb).
+
+#### Button
+
+The `Pajamas::ButtonComponent` follows the [Pajamas Button](https://design.gitlab.com/components/button) specification.
+
+**Examples:**
+
+The button component has a lot of options but all of them have good defaults,
+so the simplest button looks like this:
+
+```haml
+= render Pajamas::ButtonComponent.new do |c|
+ = _('Button text goes here')
+```
+
+The following example shows most of the available options:
+
+```haml
+= render Pajamas::ButtonComponent.new(category: :secondary,
+ variant: :danger,
+ size: :small,
+ type: :submit,
+ disabled: true,
+ loading: false,
+ block: true) do |c|
+ Button text goes here
+```
+
+You can also create button-like looking `<a>` tags, like this:
+
+```haml
+= render Pajamas::ButtonComponent.new(href: root_path) do |c|
+ Go home
+```
+
+For the full list of options, see its
+[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/components/pajamas/button_component.rb).
+
+#### Card
+
+The `Pajamas::CardComponent` follows the [Pajamas Card](https://design.gitlab.com/components/card) specification.
+
+**Examples:**
+
+The card has one mandatory `body` slot and optional `header` and `footer` slots:
+
+```haml
+= render Pajamas::CardComponent.new do |c|
+ - c.header do
+ I'm the header.
+ - c.body do
+ %p Multiple line
+ %p body content.
+ - c.footer do
+ Footer goes here.
+```
+
+If you want to add custom attributes to any of these or the card itself, use the following options:
+
+```haml
+= render Pajamas::CardComponent.new(card_options: {id: "my-id"}, body_options: {data: { count: 1 }})
+```
+
+`header_options` and `footer_options` are available, too.
+
+For the full list of options, see its
+[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/components/pajamas/card_component.rb).
+
+#### Toggle
+
+The `Pajamas::ToggleComponent` follows the [Pajamas Toggle](https://design.gitlab.com/components/toggle) specification.
+
+```haml
+= render Pajamas::ToggleComponent.new(classes: 'js-force-push-toggle',
+ label: s_("ProtectedBranch|Toggle allowed to force push"),
+ is_checked: protected_branch.allow_force_push,
+ label_position: :hidden)
+ Leverage this block to render a rich help text. To render a plain text help text, prefer the `help` parameter.
+```
+
+NOTE:
+**The toggle ViewComponent is special as it depends on the Vue.js component.**
+To actually initialize this component, make sure to call the `initToggle` helper from `~/toggles`.
+
+For the full list of options, see its
+[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/components/pajamas/toggle_component.rb).
+
+### Best practices
+
+- If you are about to create a new view in Haml, use the available components
+ over creating plain Haml tags with CSS classes.
+- If you are making changes to an existing Haml view and see, for example, a
+ button that is still implemented with plain Haml, consider migrating it to use a ViewComponent.
diff --git a/doc/development/fe_guide/vue.md b/doc/development/fe_guide/vue.md
index ae13e3fc8c5..7943ae119be 100644
--- a/doc/development/fe_guide/vue.md
+++ b/doc/development/fe_guide/vue.md
@@ -19,8 +19,8 @@ What is described in the following sections can be found in these examples:
## Vue architecture
All new features built with Vue.js must follow a [Flux architecture](https://facebook.github.io/flux/).
-The main goal we are trying to achieve is to have only one data flow and only one data entry.
-In order to achieve this goal we use [Vuex](#vuex).
+The main goal we are trying to achieve is to have only one data flow, and only one data entry.
+To achieve this goal we use [Vuex](#vuex).
You can also read about this architecture in Vue documentation about
[state management](https://vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch)
@@ -48,8 +48,8 @@ Let's look into each of them:
### An `index.js` file
-This is the index file of your new feature. This is where the root Vue instance
-of the new feature should be.
+This file is the index file of your new feature. The root Vue instance
+of the new feature should be here.
The Store and the Service should be imported and initialized in this file and
provided as a prop to the main component.
@@ -62,17 +62,16 @@ Be sure to read about [page-specific JavaScript](performance.md#page-specific-ja
While mounting a Vue application, you might need to provide data from Rails to JavaScript.
To do that, you can use the `data` attributes in the HTML element and query them while mounting the application.
-
You should only do this while initializing the application, because the mounted element is replaced
with a Vue-generated DOM.
The advantage of providing data from the DOM to the Vue instance through `props` or
`provide` in the `render` function, instead of querying the DOM inside the main Vue
-component, is that you avoid the need to create a fixture or an HTML element in the unit test.
+component, is that you avoid creating a fixture or an HTML element in the unit test.
-##### provide/inject
+##### `provide` and `inject`
-Vue supports dependency injection through [provide/inject](https://vuejs.org/v2/api/#provide-inject).
+Vue supports dependency injection through [`provide` and `inject`](https://vuejs.org/v2/api/#provide-inject).
In the component the `inject` configuration accesses the values `provide` passes down.
This example of a Vue app initialization shows how the `provide` configuration passes a value from HAML to the component:
@@ -119,13 +118,16 @@ Using dependency injection to provide values from HAML is ideal when:
- The injected value doesn't need an explicit validation against its data type or contents.
- The value doesn't need to be reactive.
-- There are multiple components in the hierarchy that need access to this value where
+- Multiple components exist in the hierarchy that need access to this value where
prop-drilling becomes an inconvenience. Prop-drilling when the same prop is passed
through all components in the hierarchy until the component that is genuinely using it.
-Dependency injection can potentially break a child component (either an immediate child or multiple levels deep) if the value declared in the `inject` configuration doesn't have defaults defined and the parent component has not provided the value using the `provide` configuration.
+Dependency injection can potentially break a child component (either an immediate child or multiple levels deep) if both conditions are true:
+
+- The value declared in the `inject` configuration doesn't have defaults defined.
+- The parent component has not provided the value using the `provide` configuration.
-- A [default value](https://vuejs.org/guide/components/provide-inject.html#injection-default-values) might be useful in contexts where it makes sense.
+A [default value](https://vuejs.org/guide/components/provide-inject.html#injection-default-values) might be useful in contexts where it makes sense.
##### props
@@ -155,7 +157,8 @@ return new Vue({
});
```
-> When adding an `id` attribute to mount a Vue application, please make sure this `id` is unique
+NOTE:
+When adding an `id` attribute to mount a Vue application, make sure this `id` is unique
across the codebase.
For more information on why we explicitly declare the data being passed into the Vue app,
@@ -165,9 +168,9 @@ refer to our [Vue style guide](style/vue.md#basic-rules).
When composing a form with Rails, the `name`, `id`, and `value` attributes of form inputs are generated
to match the backend. It can be helpful to have access to these generated attributes when converting
-a Rails form to Vue, or when [integrating components (datepicker, project selector, etc)](https://gitlab.com/gitlab-org/gitlab/-/blob/8956ad767d522f37a96e03840595c767de030968/app/assets/javascripts/access_tokens/index.js#L15) into it.
+a Rails form to Vue, or when [integrating components](https://gitlab.com/gitlab-org/gitlab/-/blob/8956ad767d522f37a96e03840595c767de030968/app/assets/javascripts/access_tokens/index.js#L15) (such as a date picker or project selector) into it.
The [`parseRailsFormFields`](https://gitlab.com/gitlab-org/gitlab/-/blob/fe88797f682c7ff0b13f2c2223a3ff45ada751c1/app/assets/javascripts/lib/utils/forms.js#L107) utility can be used to parse the generated form input attributes so they can be passed to the Vue application.
-This allows us to easily integrate Vue components without changing how the form submits.
+This enables us to integrate Vue components without changing how the form submits.
```haml
-# form.html.haml
@@ -245,7 +248,7 @@ export default {
We query the `gl` object for data that doesn't change during the application's life
cycle in the same place we query the DOM. By following this practice, we can
-avoid the need to mock the `gl` object, which makes tests easier. It should be done while
+avoid mocking the `gl` object, which makes tests easier. It should be done while
initializing our Vue instance, and the data should be provided as `props` to the main component:
```javascript
@@ -263,8 +266,8 @@ return new Vue({
#### Accessing feature flags
-Use Vue's [provide/inject](https://vuejs.org/v2/api/#provide-inject) mechanism
-to make feature flags available to any descendant components in a Vue
+Use the [`provide` and `inject`](https://vuejs.org/v2/api/#provide-inject) mechanisms
+in Vue to make feature flags available to any descendant components in a Vue
application. The `glFeatures` object is already provided in `commons/vue.js`, so
only the mixin is required to use the flags:
@@ -303,14 +306,14 @@ This approach has a few benefits:
});
```
-- No need to access a global variable, except in the application's
+- Accessing a global variable is not required, except in the application's
[entry point](#accessing-the-gl-object).
### A folder for Components
This folder holds all components that are specific to this new feature.
-If you need to use or create a component that is likely to be used somewhere
-else, please refer to `vue_shared/components`.
+To use or create a component that is likely to be used somewhere
+else, refer to `vue_shared/components`.
A good guideline to know when you should create a component is to think if
it could be reusable elsewhere.
@@ -330,7 +333,7 @@ Check this [page](vuex.md) for more details.
### Mixing Vue and jQuery
- Mixing Vue and jQuery is not recommended.
-- If you need to use a specific jQuery plugin in Vue, [create a wrapper around it](https://vuejs.org/v2/examples/select2.html).
+- To use a specific jQuery plugin in Vue, [create a wrapper around it](https://vuejs.org/v2/examples/select2.html).
- It is acceptable for Vue to listen to existing jQuery events using jQuery event listeners.
- It is not recommended to add new jQuery events for Vue to interact with jQuery.
@@ -356,22 +359,171 @@ cannot use primitives or objects.
#### Why
-There are additional reasons why having a JavaScript class presents maintainability issues on a huge codebase:
+Additional reasons why having a JavaScript class presents maintainability issues on a huge codebase:
- After a class is created, it can be extended in a way that can infringe Vue reactivity and best practices.
- A class adds a layer of abstraction, which makes the component API and its inner workings less clear.
- It makes it harder to test. Because the class is instantiated by the component data function, it is
harder to 'manage' component and class separately.
-- Adding Object Oriented Principles (OOP) to a functional codebase adds yet another way of writing code, reducing consistency and clarity.
+- Adding Object Oriented Principles (OOP) to a functional codebase adds another way of writing code, reducing consistency and clarity.
## Style guide
-Please refer to the Vue section of our [style guide](style/vue.md)
+Refer to the Vue section of our [style guide](style/vue.md)
for best practices while writing and testing your Vue components and templates.
+## Composition API
+
+With Vue 2.7 it is possible to use [Composition API](https://vuejs.org/guide/introduction.html#api-styles) in Vue components and as standalone composables.
+
+### Prefer `<script>` over `<script setup>`
+
+Composition API allows you to place the logic in the `<script>` section of the component or to have a dedicated `<script setup>` section. We should use `<script>` and add Composition API to components using `setup()` property:
+
+```html
+<script>
+ import { computed } from 'vue';
+
+ export default {
+ name: 'MyComponent',
+ setup(props) {
+ const doubleCount = computed(() => props.count*2)
+ }
+ }
+</script>
+```
+
+### Aim to have one API style per component
+
+When adding `setup()` property to Vue component, consider refactoring it to Composition API entirely. It's not always feasible, especially for large components, but we should aim to have one API style per component for readability and maintainability.
+
+### Composables
+
+With Composition API, we have a new way of abstracting logic including reactive state to _composables_. Composable is the function that can accept parameters and return reactive properties and methods to be used in Vue component.
+
+```javascript
+// useCount.js
+import { ref } from 'vue';
+
+export function useCount(initialValue) {
+ const count = ref(initialValue)
+
+ function incrementCount() {
+ ref.value += 1
+ }
+
+ function decrementCount() {
+ ref.value -= 1
+ }
+
+ return { count, incrementCount, decrementCount }
+}
+```
+
+```javascript
+// MyComponent.vue
+import { useCount } from 'useCount'
+
+export default {
+ name: 'MyComponent',
+ setup() {
+ const { count, incrementCount, decrementCount } = useCount(5)
+
+ return { count, incrementCount, decrementCount }
+ }
+}
+```
+
+#### Prefix function and file names with `use`
+
+Common naming convention in Vue for composables is to prefix them with `use` and then refer to composable functionality briefly (`useBreakpoints`, `useGeolocation` etc). The same rule applies to the `.js` files containing composables - they should start with `use_` even if the file contains more than one composable.
+
+#### Avoid lifecycle pitfalls
+
+When building a composable, we should aim to keep it as simple as possible. Lifecycle hooks add complexity to composables and might lead to unexpected side effects. To avoid that we should follow these principles:
+
+- Minimize lifecycle hooks usage whenever possible, prefer accepting/returning callbacks instead.
+- If your composable needs lifecycle hooks, make sure it also performs a cleanup. If we add a listener on `onMounted`, we should remove it on `onUnmounted` within the same composable.
+- Always set up lifecycle hooks immediately:
+
+```javascript
+// bad
+const useAsyncLogic = () => {
+ const action = async () => {
+ await doSomething();
+ onMounted(doSomethingElse);
+ };
+ return { action };
+};
+
+// OK
+const useAsyncLogic = () => {
+ const done = ref(false);
+ onMounted(() => {
+ watch(
+ done,
+ () => done.value && doSomethingElse(),
+ { immediate: true },
+ );
+ });
+ const action = async () => {
+ await doSomething();
+ done.value = true;
+ };
+ return { action };
+};
+```
+
+#### Avoid escape hatches
+
+It might be tempting to write a composable that does everything as a black box, using some of the escape hatches that Vue provides. But for most of the cases this makes them too complex and hard to maintain. One escape hatch is the `getCurrentInstance` method. This method returns an instance of a current rendering component. Instead of using that method, you should prefer passing down the data or methods to a composable via arguments.
+
+```javascript
+const useSomeLogic = () => {
+ doSomeLogic();
+ getCurrentInstance().emit('done'); // bad
+};
+```
+
+```javascript
+const done = () => emit('done');
+
+const useSomeLogic = (done) => {
+ doSomeLogic();
+ done(); // good, composable doesn't try to be too smart
+}
+```
+
+#### Composables and Vuex
+
+We should always prefer to avoid using Vuex state in composables. In case it's not possible, we should use props to receive that state, and emit events from the `setup` to update the Vuex state. A parent component should be responsible to get that state from Vuex, and mutate it on events emitted from a child. You should **never mutate a state that's coming down from a prop**. If a composable must mutate a Vuex state, it should use a callback to emit an event.
+
+```javascript
+const useAsyncComposable = ({ state, update }) => {
+ const start = async () => {
+ const newState = await doSomething(state);
+ update(newState);
+ };
+ return { start };
+};
+
+const ComponentWithComposable = {
+ setup(props, { emit }) {
+ const update = (data) => emit('update', data);
+ const state = computed(() => props.state); // state from Vuex
+ const { start } = useAsyncComposable({ state, update });
+ start();
+ },
+};
+```
+
+#### Testing composables
+
+<!-- TBD -->
+
## Testing Vue Components
-Please refer to the [Vue testing style guide](style/vue.md#vue-testing)
+Refer to the [Vue testing style guide](style/vue.md#vue-testing)
for guidelines and best practices for testing your Vue components.
Each Vue component has a unique output. This output is always present in the render function.
@@ -500,8 +652,8 @@ component under test, with the `computed` property, for example). Remember to us
### Events
-We should test for events emitted in response to an action in our component. This is used to
-verify the correct events are being fired with the correct arguments.
+We should test for events emitted in response to an action in our component. This testing
+verifies the correct events are being fired with the correct arguments.
For any DOM events we should use [`trigger`](https://v1.test-utils.vuejs.org/api/wrapper/#trigger)
to fire out event.
@@ -519,8 +671,7 @@ it('should fire the click event', () => {
})
```
-When we need to fire a Vue event, we should use [`emit`](https://vuejs.org/v2/guide/components-custom-events.html)
-to fire our event.
+When firing a Vue event, use [`emit`](https://vuejs.org/v2/guide/components-custom-events.html).
```javascript
wrapper = shallowMount(DropdownItem);
diff --git a/doc/development/feature_development.md b/doc/development/feature_development.md
new file mode 100644
index 00000000000..a5d74a0bfd9
--- /dev/null
+++ b/doc/development/feature_development.md
@@ -0,0 +1,197 @@
+---
+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"
+---
+
+# Feature development
+
+Consult these topics for information on contributing to specific GitLab features.
+
+## 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 EventStore](event_store.md) to publish/subscribe to domain events
+- [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)
+- [Ruby upgrade guidelines](ruby_upgrade.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)
+- [Ruby 3 gotchas](ruby3_gotchas.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)
+- [Rails update guidelines](rails_update.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)
+ - [Adding a new Redis instance](redis/new_redis_instance.md)
+- [Sidekiq guidelines](sidekiq/index.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)
+- [Uploads development guide](uploads/index.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 and 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)
+
+## Performance guides
+
+- [Performance guidelines](performance.md) for writing code, benchmarks, and
+ certain patterns to avoid.
+- [Caching guidelines](caching.md) for using caching in Rails under a GitLab environment.
+- [Merge request performance guidelines](merge_request_performance_guidelines.md)
+ for ensuring merge requests do not negatively impact GitLab performance
+- [Profiling](profiling.md) a URL 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
+
+- [Integrations development guide](integrations/index.md)
+- [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)
+
+## Technical Reference by Group
+
+- [Create: Source Code BE](backend/create_source_code_be/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_observability/index.md)
+- [Preventing transient bugs](transient/prevention-patterns.md)
+- [GitLab Application SLIs](application_slis/index.md)
+- [Spam protection and CAPTCHA development guide](spam_protection_and_captcha/index.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/feature_flags/index.md b/doc/development/feature_flags/index.md
index d21a46142a2..140d5f826cf 100644
--- a/doc/development/feature_flags/index.md
+++ b/doc/development/feature_flags/index.md
@@ -236,6 +236,11 @@ command. For example:
/chatops run feature list --staging
```
+## Toggle a feature flag
+
+See [rolling out changes](controls.md#rolling-out-changes) for more information about toggling
+feature flags.
+
## Delete a feature flag
See [cleaning up feature flags](controls.md#cleaning-up) for more information about
@@ -520,6 +525,8 @@ Feature.remove(:feature_flag_name)
```
- Any change behind a feature flag that is **enabled** by default **should** have a changelog entry.
+- The changelog for a feature flag should describe the feature and not the
+ flag, unless a default on feature flag is removed keeping the new code (`other` in the flowchart above).
## Feature flags in tests
diff --git a/doc/development/fips_compliance.md b/doc/development/fips_compliance.md
index 5b6f6ba0d98..6261b2fda6f 100644
--- a/doc/development/fips_compliance.md
+++ b/doc/development/fips_compliance.md
@@ -25,26 +25,37 @@ mean FIPS 140-2.
## Current status
-GitLab Inc has not committed to making GitLab FIPS-compliant at this time. We are
-performing initial investigations to see how much work such an effort would be.
-
Read [Epic &5104](https://gitlab.com/groups/gitlab-org/-/epics/5104) for more
information on the status of the investigation.
-## FIPS compliance at GitLab
-
-In a FIPS context, compliance is a form of self-certification - if we say we are
-"FIPS compliant", we mean that we *believe* we are. There are no external
-certifications to acquire, but if we are aware of non-compliant areas
-in GitLab, we cannot self-certify in good faith.
+GitLab is actively working towards FIPS compliance.
-The known areas of non-compliance are tracked in [Epic &5104](https://gitlab.com/groups/gitlab-org/-/epics/5104).
+## FIPS compliance at GitLab
To be compliant, all components (GitLab itself, Gitaly, etc) must be compliant,
along with the communication between those components, and any storage used by
them. Where functionality cannot be brought into compliance, it must be disabled
when FIPS mode is enabled.
+### Leveraged Cryptographic modules
+
+| Cryptographic module name | CMVP number | Instance type | Software component used |
+|----------------------------------------------------------|-------------------------------------------------------------------------------------------------|---------------|-------------------------|
+| Ubuntu 20.04 AWS Kernel Crypto API Cryptographic Module | [4132](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4132) | EC2 | Linux kernel |
+| Ubuntu 20.04 OpenSSL Cryptographic Module | [3966](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/3966) | EC2 | Gitaly, Rails (Puma/Sidekiq) |
+| Ubuntu 20.04 Libgcrypt Cryptographic Module | [3902](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/3902) | EC2 instances | `gpg`, `sshd` |
+| Amazon Linux 2 Kernel Crypto API Cryptographic Module | [3709](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/3709) | EKS nodes | Linux kernel |
+| Amazon Linux 2 OpenSSL Cryptographic Module | [3553](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/3553) | EKS nodes | NGINX |
+| RedHat Enterprise Linux 8 OpenSSL Cryptographic Module | [3852](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/3852) | EKS nodes | UBI containers: Workhorse, Pages, Container Registry, Rails (Puma/Sidekiq), Security Analyzers |
+| RedHat Enterprise Linux 8 Libgcrypt Cryptographic Module | [3784](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/3784) | EKS nodes | UBI containers: GitLab Shell, `gpg` |
+
+### Supported Operating Systems
+
+The supported hybrid environments are:
+
+- Omnibus: Ubuntu 20.04 FIPS
+- EKS: Amazon Linux 2
+
## FIPS validation at GitLab
Unlike FIPS compliance, FIPS validation is a formal declaration of compliance by
@@ -55,81 +66,24 @@ A list of FIPS-validated modules can be found at the
NIST (National Institute of Standards and Technology)
[cryptographic module validation program](https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules).
-## Setting up a FIPS-enabled development environment
-
-The simplest approach is to set up a virtual machine running
-[Red Hat Enterprise Linux 8](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening#switching-the-system-to-fips-mode_using-the-system-wide-cryptographic-policies).
-
-Red Hat provide free licenses to developers, and permit the CD image to be
-downloaded from the [Red Hat developer's portal](https://developers.redhat.com).
-Registration is required.
-
-After the virtual machine is set up, you can follow the [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit)
-installation instructions, including the [advanced instructions for RHEL](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/advanced.md#red-hat-enterprise-linux).
-Note that `asdf` is not used for dependency management because it's essential to
-use the RedHat-provided Go compiler and other system dependencies.
-
-### Enable FIPS mode
-
-After GDK and its dependencies are installed, run this command (as
-root) and restart the virtual machine:
-
-```shell
-fips-mode-setup --enable
-```
-
-You can check whether it's taken effect by running:
-
-```shell
-fips-mode-setup --check
-```
-
-In this environment, OpenSSL refuses to perform cryptographic operations
-forbidden by the FIPS standards. This enables you to reproduce FIPS-related bugs,
-and validate fixes.
-
-You should be able to open a web browser inside the virtual machine and log in
-to the GitLab instance.
-
-You can disable FIPS mode again by running this command, then restarting the
-virtual machine:
-
-```shell
-fips-mode-setup --disable
-```
-
-#### Detect FIPS enablement in code
-
-You can query `Gitlab::FIPS` in Ruby code to determine if the instance is FIPS-enabled:
-
-```ruby
-def default_min_key_size(name)
- if Gitlab::FIPS.enabled?
- Gitlab::SSHPublicKey.supported_sizes(name).select(&:positive?).min || -1
- else
- 0
- end
-end
-```
+## Install GitLab with FIPS compliance
-## Nightly Omnibus FIPS builds
+This guide is specifically for public users or GitLab team members with a requirement
+to run a production instance of GitLab that is FIPS compliant. This guide outlines
+a hybrid deployment using elements from both Omnibus and our Cloud Native GitLab installations.
-The Distribution team has created [nightly FIPS Omnibus builds](https://packages.gitlab.com/gitlab/nightly-fips-builds). These
-GitLab builds are compiled to use the system OpenSSL instead of the Omnibus-embedded version of OpenSSL.
+### Prerequisites
-See [the section on how FIPS builds are created](#how-fips-builds-are-created).
+- Amazon Web Services account. Our first target environment is running on AWS, and uses other FIPS Compliant AWS resources.
+- Ability to run Ubuntu 20.04 machines for GitLab. Our first target environment uses the hybrid architecture.
-## Runner
-
-See the [documentation on installing a FIPS-compliant GitLab Runner](https://docs.gitlab.com/runner/install/#fips-compliant-gitlab-runner).
-
-## Set up a FIPS-enabled cluster
+### Set up a FIPS-enabled cluster
You can use the [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/gitlab-environment-toolkit) to spin
-up a FIPS-enabled cluster for development and testing. These instructions use Amazon Web Services (AWS)
-because that is the first target environment, but you can adapt them for other providers.
+up a FIPS-enabled cluster for development and testing. As mentioned in the prerequisites, these instructions use Amazon Web Services (AWS)
+because that is the first target environment.
-### Set up your environment
+#### Set up your environment
To get started, your AWS account must subscribe to a FIPS-enabled Amazon
Machine Image (AMI) in the [AWS Marketplace console](https://aws.amazon.com/premiumsupport/knowledge-center/launch-ec2-marketplace-subscription/).
@@ -138,13 +92,13 @@ This example assumes that the `Ubuntu Pro 20.04 FIPS LTS` AMI by
`Canonical Group Limited` has been added your account. This operating
system is used for virtual machines running in Amazon EC2.
-### Omnibus
+#### Omnibus
The simplest way to get a FIPS-enabled GitLab cluster is to use an Omnibus reference architecture.
See the [GET Quick Start Guide](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/docs/environment_quick_start_guide.md)
for more details. The following instructions build on the Quick Start and are also necessary for [Cloud Native Hybrid](#cloud-native-hybrid) installations.
-#### Terraform: Use a FIPS AMI
+##### Terraform: Use a FIPS AMI
1. Follow the guide to set up Terraform and Ansible.
1. After [step 2b](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/docs/environment_quick_start_guide.md#2b-setup-config),
@@ -189,7 +143,7 @@ an instance, this would result in data loss: not only would disks be
destroyed, but also GitLab secrets would be lost. There is a [Terraform lifecycle rule](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/blob/2aaeaff8ac8067f23cd7b6bb5bf131061649089d/terraform/modules/gitlab_aws_instance/main.tf#L40)
to ignore AMI changes.
-#### Ansible: Specify the FIPS Omnibus builds
+##### Ansible: Specify the FIPS Omnibus builds
The standard Omnibus GitLab releases build their own OpenSSL library, which is
not FIPS-validated. However, we have nightly builds that create Omnibus packages
@@ -203,11 +157,11 @@ in this way:
all:
vars:
...
- gitlab_repo_script_url: "https://packages.gitlab.com/install/repositories/gitlab/nightly-fips-builds/script.deb.sh"
+ gitlab_repo_script_url: "https://packages.gitlab.com/install/repositories/gitlab/gitlab-fips/script.deb.sh"
gitlab_edition: "gitlab-fips"
```
-### Cloud Native Hybrid
+#### Cloud Native Hybrid
A Cloud Native Hybrid install uses both Omnibus and Cloud Native GitLab
(CNG) images. The previous instructions cover the Omnibus part, but two
@@ -216,7 +170,7 @@ additional steps are needed to enable FIPS in CNG:
1. Use a custom Amazon Elastic Kubernetes Service (EKS) AMI.
1. Use GitLab containers built with RedHat's Universal Base Image (UBI).
-#### Build a custom EKS AMI
+##### Build a custom EKS AMI
Because Amazon does not yet publish a FIPS-enabled AMI, you have to
build one yourself with Packer.
@@ -259,7 +213,7 @@ be different.
Building a RHEL-based system with FIPS enabled should be possible, but
there is [an outstanding issue preventing the Packer build from completing](https://github.com/aws-samples/amazon-eks-custom-amis/issues/51).
-#### Terraform: Use a custom EKS AMI
+##### Terraform: Use a custom EKS AMI
Now you can set the custom EKS AMI.
@@ -286,7 +240,7 @@ Now you can set the custom EKS AMI.
}
```
-#### Ansible: Use UBI images
+##### Ansible: Use UBI images
CNG uses a Helm Chart to manage which container images to deploy. By default, GET
deploys the latest released versions that use Debian-based containers.
@@ -396,6 +350,107 @@ gitlab:
tag: v15.1.0-fips
```
+## FIPS Performance Benchmarking
+
+The Quality Engineering Enablement team assists these efforts by checking if FIPS-enabled environments perform well compared to non-FIPS environments.
+
+Testing shows an impact in some places, such as Gitaly SSL, but it's not large enough to impact customers.
+
+You can find more information on FIPS performance benchmarking in the following issue:
+
+- [Benchmark performance of FIPS reference architecture](https://gitlab.com/gitlab-org/gitlab/-/issues/364051#note_1010450415)
+
+## Setting up a FIPS-enabled development environment
+
+The simplest approach is to set up a virtual machine running
+[Red Hat Enterprise Linux 8](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening#switching-the-system-to-fips-mode_using-the-system-wide-cryptographic-policies).
+
+Red Hat provide free licenses to developers, and permit the CD image to be
+downloaded from the [Red Hat developer's portal](https://developers.redhat.com).
+Registration is required.
+
+After the virtual machine is set up, you can follow the [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit)
+installation instructions, including the [advanced instructions for RHEL](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/advanced.md#red-hat-enterprise-linux).
+Note that `asdf` is not used for dependency management because it's essential to
+use the RedHat-provided Go compiler and other system dependencies.
+
+### Enable FIPS mode
+
+After GDK and its dependencies are installed, run this command (as
+root) and restart the virtual machine:
+
+```shell
+fips-mode-setup --enable
+```
+
+You can check whether it's taken effect by running:
+
+```shell
+fips-mode-setup --check
+```
+
+In this environment, OpenSSL refuses to perform cryptographic operations
+forbidden by the FIPS standards. This enables you to reproduce FIPS-related bugs,
+and validate fixes.
+
+You should be able to open a web browser inside the virtual machine and log in
+to the GitLab instance.
+
+You can disable FIPS mode again by running this command, then restarting the
+virtual machine:
+
+```shell
+fips-mode-setup --disable
+```
+
+#### Detect FIPS enablement in code
+
+You can query `Gitlab::FIPS` in Ruby code to determine if the instance is FIPS-enabled:
+
+```ruby
+def default_min_key_size(name)
+ if Gitlab::FIPS.enabled?
+ Gitlab::SSHPublicKey.supported_sizes(name).select(&:positive?).min || -1
+ else
+ 0
+ end
+end
+```
+
+#### Unsupported features in FIPS mode
+
+Some GitLab features may not work when FIPS mode is enabled. The following features
+are known to not work in FIPS mode. However, there may be additional features not
+listed here that also do not work properly in FIPS mode:
+
+- [Container Scanning](../user/application_security/container_scanning/index.md) support for scanning images in repositories that require authentication.
+- [Code Quality](../ci/testing/code_quality.md) does not support operating in FIPS-compliant mode.
+- [Dependency scanning](../user/application_security/dependency_scanning/index.md) support for Gradle.
+- [Dynamic Application Security Testing (DAST)](../user/application_security/dast/index.md)
+ does not support operating in FIPS-compliant mode.
+- [License compliance](../user/compliance/license_compliance/index.md).
+- [Solutions for vulnerabilities](../user/application_security/vulnerabilities/index.md#resolve-a-vulnerability)
+ for yarn projects.
+- [Static Application Security Testing (SAST)](../user/application_security/sast/index.md)
+ supports a reduced set of [analyzers](../user/application_security/sast/#fips-enabled-images)
+ when operating in FIPS-compliant mode.
+
+Additionally, these package repositories are disabled in FIPS mode:
+
+- [Conan package repository](../user/packages/conan_repository/index.md).
+- [Debian package repository](../user/packages/debian_repository/index.md).
+
+## Nightly Omnibus FIPS builds
+
+The Distribution team has created [nightly FIPS Omnibus builds](https://packages.gitlab.com/gitlab/nightly-fips-builds). These
+GitLab builds are compiled to use the system OpenSSL instead of the Omnibus-embedded version of OpenSSL.
+
+See [the section on how FIPS builds are created](#how-fips-builds-are-created).
+
+## Runner
+
+See the [documentation on installing a FIPS-compliant GitLab Runner](https://docs.gitlab.com/runner/install/#fips-compliant-gitlab-runner).
+
## Verify FIPS
The following sections describe ways you can verify if FIPS is enabled.
diff --git a/doc/development/foreign_keys.md b/doc/development/foreign_keys.md
index 77df6fbfb0d..e0dd0fe8e7c 100644
--- a/doc/development/foreign_keys.md
+++ b/doc/development/foreign_keys.md
@@ -28,9 +28,80 @@ 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 need to do so manually. See
+does not take care of this so you must do so manually. See
[adding foreign key constraint to an existing column](database/add_foreign_key_to_existing_column.md).
+## Updating Foreign Keys In Migrations
+
+Sometimes a foreign key constraint must be changed, preserving the column
+but updating the constraint condition. For example, moving from
+`ON DELETE CASCADE` to `ON DELETE SET NULL` or vice-versa.
+
+PostgreSQL does not prevent you from adding overlapping foreign keys. It
+honors the most recently added constraint. This allows us to replace foreign keys without
+ever losing foreign key protection on a column.
+
+To replace a foreign key:
+
+1. [Add the new foreign key without validation](database/add_foreign_key_to_existing_column.md#prevent-invalid-records)
+
+ The name of the foreign key constraint must be changed to add a new
+ foreign key before removing the old one.
+
+ ```ruby
+ class ReplaceFkOnPackagesPackagesProjectId < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ NEW_CONSTRAINT_NAME = 'fk_new'
+
+ def up
+ add_concurrent_foreign_key(:packages_packages, :projects, column: :project_id, on_delete: :nullify, validate: false, name: NEW_CONSTRAINT_NAME)
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(:packages_packages, column: :project_id, on_delete: :nullify, name: NEW_CONSTRAINT_NAME)
+ end
+ end
+ end
+ ```
+
+1. [Validate the new foreign key](database/add_foreign_key_to_existing_column.md#validate-the-foreign-key)
+
+ ```ruby
+ class ValidateFkNew < Gitlab::Database::Migration[2.0]
+ NEW_CONSTRAINT_NAME = 'fk_new'
+
+ # foreign key added in <link to MR or path to migration adding new FK>
+ def up
+ validate_foreign_key(:packages_packages, name: NEW_CONSTRAINT_NAME)
+ end
+
+ def down
+ # no-op
+ end
+ end
+ ```
+
+1. Remove the old foreign key:
+
+ ```ruby
+ class RemoveFkOld < Gitlab::Database::Migration[2.0]
+ OLD_CONSTRAINT_NAME = 'fk_old'
+
+ # new foreign key added in <link to MR or path to migration adding new FK>
+ # and validated in <link to MR or path to migration validating new FK>
+ def up
+ remove_foreign_key_if_exists(:packages_packages, column: :project_id, on_delete: :cascade, name: OLD_CONSTRAINT_NAME)
+ end
+
+ def down
+ # Validation is skipped here, so if rolled back, this will need to be revalidated in a separate migration
+ add_concurrent_foreign_key(:packages_packages, :projects, column: :project_id, on_delete: :cascade, validate: false, name: OLD_CONSTRAINT_NAME)
+ end
+ end
+ ```
+
## Cascading Deletes
Every foreign key must define an `ON DELETE` clause, and in 99% of the cases
diff --git a/doc/development/geo.md b/doc/development/geo.md
index 18dffe42177..9e9bd85ecd8 100644
--- a/doc/development/geo.md
+++ b/doc/development/geo.md
@@ -19,11 +19,25 @@ Geo handles replication for different components:
- [Database](#database-replication): includes the entire application, except cache and jobs.
- [Git repositories](#repository-replication): includes both projects and wikis.
-- [Uploaded blobs](#uploads-replication): includes anything from images attached on issues
+- [Blobs](#blob-replication): includes anything from images attached on issues
to raw logs and assets from CI.
With the exception of the Database replication, on a *secondary* site, everything is coordinated
-by the [Geo Log Cursor](#geo-log-cursor).
+by the [Geo Log Cursor](#geo-log-cursor-daemon).
+
+### Replication states
+
+The following diagram illustrates how the replication works. Some allowed transitions are omitted for clarity.
+
+```mermaid
+stateDiagram-v2
+ Pending --> Started
+ Started --> Synced
+ Started --> Failed
+ Synced --> Pending: Mark for resync
+ Failed --> Pending: Mark for resync
+ Failed --> Started: Retry
+```
### Geo Log Cursor daemon
@@ -66,7 +80,7 @@ the state of every repository in the [tracking database](#tracking-database).
There are a few ways a repository gets replicated by the:
- [Repository Sync worker](#repository-sync-worker).
-- [Geo Log Cursor](#geo-log-cursor).
+- [Geo Log Cursor](#geo-log-cursor-daemon).
#### Project Registry
@@ -97,26 +111,211 @@ projects that need updating. Those projects can be:
timestamp that is more recent than the `last_repository_successful_sync_at`
timestamp in the `Geo::ProjectRegistry` model.
- Manual: The administrator can manually flag a repository to resync in the
- [Geo Admin Area](../user/admin_area/geo_nodes.md).
+ [Geo Admin Area](../user/admin_area/geo_sites.md).
When we fail to fetch a repository on the secondary `RETRIES_BEFORE_REDOWNLOAD`
times, Geo does a so-called _re-download_. It will do a clean clone
into the `@geo-temporary` directory in the root of the storage. When
it's successful, we replace the main repository with the newly cloned one.
-### Uploads replication
+### Blob replication
+
+Blobs such as [uploads](uploads/index.md), LFS objects, and CI job artifacts, are replicated to the **secondary** site with the [Self-Service Framework](geo/framework.md). To track the state of syncing, each model has a corresponding registry table, for example `Upload` has `Geo::UploadRegistry` in the [PostgreSQL Geo Tracking Database](#tracking-database).
-File uploads are also being replicated to the **secondary** site. To
-track the state of syncing, the `Geo::UploadRegistry` model is used.
+#### Blob replication happy path workflows between services
+
+Job artifacts are used in the diagrams below, as one example of a blob.
+
+##### Replicating a new job artifact
+
+Primary site:
+
+```mermaid
+sequenceDiagram
+ participant R as Runner
+ participant P as Puma
+ participant DB as PostgreSQL
+ participant SsP as Secondary site PostgreSQL
+ R->>P: Upload artifact
+ P->>DB: Insert `ci_job_artifacts` row
+ P->>DB: Insert `geo_events` row
+ P->>DB: Insert `geo_event_log` row
+ DB->>SsP: Replicate rows
+```
-#### Upload Registry
+- A [Runner](https://docs.gitlab.com/runner/) uploads an artifact
+- [Puma](architecture.md#puma) inserts `ci_job_artifacts` row
+- Puma inserts `geo_events` row with data like "Job Artifact with ID 123 was updated"
+- Puma inserts `geo_event_log` row pointing to the `geo_events` row (because we built SSF on top of some legacy logic)
+- [PostgreSQL](architecture.md#postgresql) streaming replication inserts the rows in the read replica
-Similar to the [Project Registry](#project-registry), there is a
-`Geo::UploadRegistry` model that tracks the synced uploads.
+Secondary site, after the PostgreSQL DB rows have been replicated:
+
+```mermaid
+sequenceDiagram
+ participant DB as PostgreSQL
+ participant GLC as Geo Log Cursor
+ participant R as Redis
+ participant S as Sidekiq
+ participant TDB as PostgreSQL Tracking DB
+ participant PP as Primary site Puma
+ GLC->>DB: Query `geo_event_log`
+ GLC->>DB: Query `geo_events`
+ GLC->>R: Enqueue `Geo::EventWorker`
+ S->>R: Pick up `Geo::EventWorker`
+ S->>TDB: Insert to `job_artifact_registry`, "starting sync"
+ S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
+ S->>TDB: Update `job_artifact_registry`, "synced"
+```
+
+- [Geo Log Cursor](#geo-log-cursor-daemon) loop finds the new `geo_event_log` row
+- Geo Log Cursor processes the `geo_events` row
+ - Geo Log Cursor enqueues `Geo::EventWorker` job passing through the `geo_events` row data
+- [Sidekiq](architecture.md#sidekiq) picks up `Geo::EventWorker` job
+ - Sidekiq inserts `job_artifact_registry` row in the [PostgreSQL Geo Tracking Database](#tracking-database) because it doesn't exist, and marks it "started sync"
+ - Sidekiq does a GET request on an API endpoint at the primary Geo site and downloads the file
+ - Sidekiq marks the `job_artifact_registry` row as "synced" and "pending verification"
+
+##### Backfilling existing job artifacts
+
+- Sysadmin has an existing GitLab site without Geo
+- There are existing CI jobs and job artifacts
+- Sysadmin sets up a new GitLab site and configures it to be a secondary Geo site
+
+Secondary site:
+
+There are two cronjobs running every minute: `Geo::Secondary::RegistryConsistencyWorker` and `Geo::RegistrySyncWorker`. The workflow below is split into two, along those lines.
+
+```mermaid
+sequenceDiagram
+ participant SC as Sidekiq-cron
+ participant R as Redis
+ participant S as Sidekiq
+ participant DB as PostgreSQL
+ participant TDB as PostgreSQL Tracking DB
+ SC->>R: Enqueue `Geo::Secondary::RegistryConsistencyWorker`
+ S->>R: Pick up `Geo::Secondary::RegistryConsistencyWorker`
+ S->>DB: Query `ci_job_artifacts`
+ S->>TDB: Query `job_artifact_registry`
+ S->>TDB: Insert to `job_artifact_registry`
+```
-CI Job Artifacts and LFS objects are synced in a similar way as uploads,
-but they are tracked by `Geo::JobArtifactRegistry`, and `Geo::LfsObjectRegistry`
-models respectively.
+- [Sidekiq-cron](https://github.com/ondrejbartas/sidekiq-cron) enqueues a `Geo::Secondary::RegistryConsistencyWorker` job every minute. As long as it is actively doing work (creating and deleting rows), this job immediately reenqueues itself. This job uses an exclusive lease to prevent multiple instances of itself from running simultaneously.
+- [Sidekiq](architecture.md#sidekiq) picks up `Geo::Secondary::RegistryConsistencyWorker` job
+ - Sidekiq queries `ci_job_artifacts` table for up to 10000 rows
+ - Sidekiq queries `job_artifact_registry` table for up to 10000 rows
+ - Sidekiq inserts a `job_artifact_registry` row in the [PostgreSQL Geo Tracking Database](#tracking-database) corresponding to the existing Job Artifact
+
+```mermaid
+sequenceDiagram
+ participant SC as Sidekiq-cron
+ participant R as Redis
+ participant S as Sidekiq
+ participant DB as PostgreSQL
+ participant TDB as PostgreSQL Tracking DB
+ participant PP as Primary site Puma
+ SC->>R: Enqueue `Geo::RegistrySyncWorker`
+ S->>R: Pick up `Geo::RegistrySyncWorker`
+ S->>TDB: Query `*_registry` tables
+ S->>R: Enqueue `Geo::EventWorker`s
+ S->>R: Pick up `Geo::EventWorker`
+ S->>TDB: Insert to `job_artifact_registry`, "starting sync"
+ S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
+ S->>TDB: Update `job_artifact_registry`, "synced"
+```
+
+- [Sidekiq-cron](https://github.com/ondrejbartas/sidekiq-cron) enqueues a `Geo::RegistrySyncWorker` job every minute. As long as it is actively doing work, this job loops for up to an hour scheduling sync jobs. This job uses an exclusive lease to prevent multiple instances of itself from running simultaneously.
+- [Sidekiq](architecture.md#sidekiq) picks up `Geo::RegistrySyncWorker` job
+ - Sidekiq queries all `registry` tables in the [PostgreSQL Geo Tracking Database](#tracking-database) for "never attempted sync" rows. It interleaves rows from each table and adds them to an in-memory queue.
+ - If the previous step yielded less than 1000 rows, then Sidekiq queries all `registry` tables for "failed sync and ready to retry" rows and interleaves those and adds them to the in-memory queue.
+ - Sidekiq enqueues `Geo::EventWorker` jobs with arguments like "Job Artifact with ID 123 was updated" for each item in the queue, and tracks the enqueued Sidekiq job IDs.
+ - Sidekiq stops enqueuing `Geo::EventWorker` jobs when "maximum concurrency limit" settings are reached
+ - Sidekiq loops doing this kind of work until it has no more to do
+- Sidekiq picks up `Geo::EventWorker` job
+ - Sidekiq marks the `job_artifact_registry` row as "started sync"
+ - Sidekiq does a GET request on an API endpoint at the primary Geo site and downloads the file
+ - Sidekiq marks the `job_artifact_registry` row as "synced" and "pending verification"
+
+##### Verifying a new job artifact
+
+Primary site:
+
+```mermaid
+sequenceDiagram
+ participant Ru as Runner
+ participant P as Puma
+ participant DB as PostgreSQL
+ participant SC as Sidekiq-cron
+ participant Rd as Redis
+ participant S as Sidekiq
+ participant F as Filesystem
+ Ru->>P: Upload artifact
+ P->>DB: Insert `ci_job_artifacts`
+ P->>DB: Insert `ci_job_artifact_states`
+ SC->>Rd: Enqueue `Geo::VerificationCronWorker`
+ S->>Rd: Pick up `Geo::VerificationCronWorker`
+ S->>DB: Query `ci_job_artifact_states`
+ S->>Rd: Enqueue `Geo::VerificationBatchWorker`
+ S->>Rd: Pick up `Geo::VerificationBatchWorker`
+ S->>DB: Query `ci_job_artifact_states`
+ S->>DB: Update `ci_job_artifact_states` row, "started"
+ S->>F: Checksum file
+ S->>DB: Update `ci_job_artifact_states` row, "succeeded"
+```
+
+- A [Runner](https://docs.gitlab.com/runner/) uploads an artifact
+- [Puma](architecture.md#puma) creates a `ci_job_artifacts` row
+- Puma creates a `ci_job_artifact_states` row to store verification state.
+ - The row is marked "pending verification"
+- [Sidekiq-cron](https://github.com/ondrejbartas/sidekiq-cron) enqueues a `Geo::VerificationCronWorker` job every minute
+- [Sidekiq](architecture.md#sidekiq) picks up the `Geo::VerificationCronWorker` job
+ - Sidekiq queries `ci_job_artifact_states` for the number of rows marked "pending verification" or "failed verification and ready to retry"
+ - Sidekiq enqueues one or more `Geo::VerificationBatchWorker` jobs, limited by the "maximum verification concurrency" setting
+- Sidekiq picks up `Geo::VerificationBatchWorker` job
+ - Sidekiq queries `ci_job_artifact_states` for rows marked "pending verification"
+ - If the previous step yielded less than 10 rows, then Sidekiq queries `ci_job_artifact_states` for rows marked "failed verification and ready to retry"
+ - For each row
+ - Sidekiq marks it "started verification"
+ - Sidekiq gets the SHA256 checksum of the file
+ - Sidekiq saves the checksum in the row and marks it "succeeded verification"
+ - Now secondary Geo sites can compare against this checksum
+
+Secondary site:
+
+```mermaid
+sequenceDiagram
+ participant SC as Sidekiq-cron
+ participant R as Redis
+ participant S as Sidekiq
+ participant TDB as PostgreSQL Tracking DB
+ participant F as Filesystem
+ participant DB as PostgreSQL
+ SC->>R: Enqueue `Geo::VerificationCronWorker`
+ S->>R: Pick up `Geo::VerificationCronWorker`
+ S->>TDB: Query `job_artifact_registry`
+ S->>R: Enqueue `Geo::VerificationBatchWorker`
+ S->>R: Pick up `Geo::VerificationBatchWorker`
+ S->>TDB: Query `job_artifact_registry`
+ S->>TDB: Update `job_artifact_registry` row, "started"
+ S->>F: Checksum file
+ S->>DB: Query `ci_job_artifact_states`
+ S->>TDB: Update `job_artifact_registry` row, "succeeded"
+```
+
+- After the artifact is successfully synced, it becomes "pending verification"
+- [Sidekiq-cron](https://github.com/ondrejbartas/sidekiq-cron) enqueues a `Geo::VerificationCronWorker` job every minute
+- [Sidekiq](architecture.md#sidekiq) picks up the `Geo::VerificationCronWorker` job
+ - Sidekiq queries `job_artifact_registry` in the [PostgreSQL Geo Tracking Database](#tracking-database) for the number of rows marked "pending verification" or "failed verification and ready to retry"
+ - Sidekiq enqueues one or more `Geo::VerificationBatchWorker` jobs, limited by the "maximum verification concurrency" setting
+- Sidekiq picks up `Geo::VerificationBatchWorker` job
+ - Sidekiq queries `job_artifact_registry` in the PostgreSQL Geo Tracking Databasef for rows marked "pending verification"
+ - If the previous step yielded less than 10 rows, then Sidekiq queries `job_artifact_registry` for rows marked "failed verification and ready to retry"
+ - For each row
+ - Sidekiq marks it "started verification"
+ - Sidekiq gets the SHA256 checksum of the file
+ - Sidekiq saves the checksum in the row
+ - Sidekiq compares the checksum against the checksum in the `ci_job_artifact_states` row which was replicated by PostgreSQL
+ - If the checksum matches, then Sidekiq marks the `job_artifact_registry` row "succeeded verification"
## Authentication
@@ -241,6 +440,22 @@ ignores items in object storage. Either:
## Verification
+### Verification states
+
+The following diagram illustrates how the verification works. Some allowed transitions are omitted for clarity.
+
+```mermaid
+stateDiagram-v2
+ Pending --> Started
+ Pending --> Disabled: No primary checksum
+ Disabled --> Started: Primary checksum succeeded
+ Started --> Succeeded
+ Started --> Failed
+ Succeeded --> Pending: Mark for reverify
+ Failed --> Pending: Mark for reverify
+ Failed --> Started: Retry
+```
+
### Repository verification
Repositories are verified with a checksum.
@@ -252,7 +467,12 @@ basically hashes all Git refs together and stores that hash in the
The **secondary** site does the same to calculate the hash of its
clone, and compares the hash with the value the **primary** site
calculated. If there is a mismatch, Geo will mark this as a mismatch
-and the administrator can see this in the [Geo Admin Area](../user/admin_area/geo_nodes.md).
+and the administrator can see this in the [Geo Admin Area](../user/admin_area/geo_sites.md).
+
+## Geo proxying
+
+Geo secondaries can proxy web requests to the primary.
+Read more on the [Geo proxying (development) page](geo/proxying.md).
## Glossary
@@ -303,10 +523,7 @@ events include:
- Job Artifact Deleted event
- Upload Deleted event
-### Geo Log Cursor
-
-The process running on the **secondary** site that looks for new
-`Geo::EventLog` rows.
+See [Geo Log Cursor daemon](#geo-log-cursor-daemon).
## Code features
@@ -415,7 +632,7 @@ We switch and filter from each event by the `event_name` field.
### Geo Log Cursor (GitLab 10.0 and up)
In GitLab 10.0 and later, [System Webhooks](#system-hooks-gitlab-87-to-95) are no longer
-used and Geo Log Cursor is used instead. The Log Cursor traverses the
+used and [Geo Log Cursor](#geo-log-cursor-daemon) is used instead. The Log Cursor traverses the
`Geo::EventLog` rows to see if there are changes since the last time
the log was checked and will handle repository updates, deletes,
changes, and renames.
diff --git a/doc/development/geo/proxying.md b/doc/development/geo/proxying.md
new file mode 100644
index 00000000000..41c7f426c6f
--- /dev/null
+++ b/doc/development/geo/proxying.md
@@ -0,0 +1,356 @@
+---
+stage: Systems
+group: Geo
+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
+---
+
+# Geo proxying
+
+With Geo proxying, secondaries now proxy web requests through Workhorse to the primary, so users navigating to the
+secondary see a read-write UI, and are able to do all operations that they can do on the primary.
+
+## Request life cycle
+
+### Top-level view
+
+The proxying interaction can be explained at a high level through the following diagram:
+
+```mermaid
+sequenceDiagram
+actor client
+participant secondary
+participant primary
+
+client->>secondary: GET /explore
+secondary-->>primary: GET /explore (proxied)
+primary-->>secondary: HTTP/1.1 200 OK [..]
+secondary->>client: HTTP/1.1 200 OK [..]
+```
+
+### Proxy detection mechanism
+
+To know whether or not it should proxy requests to the primary, and the URL of the primary (as it is stored in
+the database), Workhorse polls the internal API when Geo is enabled. When proxying should be enabled, the internal
+API responds with the primary URL and JWT-signed data that is passed on to the primary for every request.
+
+```mermaid
+sequenceDiagram
+ participant W as Workhorse (secondary)
+ participant API as Internal Rails API
+ W->API: GET /api/v4/geo/proxy (internal)
+ loop Poll every 10 seconds
+ API-->W: {geo_proxy_primary_url, geo_proxy_extra_data}, update config
+ end
+```
+
+### In-depth request flow and local data acceleration compared with proxying
+
+Detailing implementation, Workhorse on the secondary (requested) site decides whether to proxy the data or not. If it
+can "accelerate" the data type (that is, can serve locally to save a roundtrip request), it returns the data
+immediately. Otherwise, traffic is sent to the primary's internal URL, served by Workhorse on the primary exactly
+as a direct request would. The response is then be proxied back to the user through the secondary Workhorse in the
+same connection.
+
+```mermaid
+flowchart LR
+ A[Client]--->W1["Workhorse (secondary)"]
+ W1 --> W1C[Serve data locally?]
+ W1C -- "Yes" ----> W1
+ W1C -- "No (proxy)" ----> W2["Workhorse (primary)"]
+ W2 --> W1 ----> A
+```
+
+## Sign-in
+
+### Requests proxied to the primary requiring authorization
+
+```mermaid
+sequenceDiagram
+autoNumber
+participant Client
+participant Secondary
+participant Primary
+
+Client->>Secondary: `/group/project` request
+Secondary->>Primary: proxy /group/project
+opt primary not signed in
+Primary-->>Secondary: 302 redirect
+Secondary-->>Client: proxy 302 redirect
+Client->>Secondary: /users/sign_in
+Secondary->>Primary: proxy /users/sign_in
+Note right of Primary: authentication happens, POST to same URL etc
+Primary-->>Secondary: 302 redirect
+Secondary-->>Client: proxy 302 redirect
+Client->>Secondary: /group/project
+Secondary->>Primary: proxy /group/project
+end
+Primary-->>Secondary: /group/project logged in response (session on primary created)
+Secondary-->>Client: proxy full response
+```
+
+### Requests requiring a user session on the secondary
+
+At the moment, this flow only applies to Project Replication Details and Design Replication Details in the Geo Admin
+Area. For more context, see
+[View replication data on the primary site](../../administration/geo/index.md#view-replication-data-on-the-primary-site).
+
+```mermaid
+sequenceDiagram
+autoNumber
+participant Client
+participant Secondary
+participant Primary
+
+Client->>Secondary: `admin/geo/replication/projects` request
+opt secondary not signed in
+Secondary-->>Client: 302 redirect
+Client->>Secondary: /users/auth/geo/sign_in
+Secondary-->>Client: 302 redirect
+Client->>Secondary: /oauth/geo/auth/geo/sign_in
+Secondary-->>Client: 302 redirect
+Client->>Secondary: /oauth/authorize
+Secondary->>Primary: proxy /oauth/authorize
+opt primary not signed in
+Primary-->>Secondary: 302 redirect
+Secondary-->>Client: proxy 302 redirect
+Client->>Secondary: /users/sign_in
+Secondary->>Primary: proxy /users/sign_in
+Note right of Primary: authentication happens, POST to same URL etc
+end
+Primary-->>Secondary: 302 redirect
+Secondary-->>Client: proxy 302 redirect
+Client->>Secondary: /oauth/geo/callback
+Secondary-->>Client: 302 redirect
+Client->>Secondary: admin/geo/replication/projects
+end
+Secondary-->>Client: admin/geo/replication/projects logged in response (session on both primary and secondary)
+```
+
+## Git pull
+
+For historical reasons, the `push_from_secondary` path is used to forward a Git pull. There is [an issue proposing to
+rename this route](https://gitlab.com/gitlab-org/gitlab/-/issues/292690) to avoid confusion.
+
+### Git pull over HTTP(s)
+
+#### Accelerated repositories
+
+When a repository exists on the secondary and we detect is up to date with the primary, we serve it directly instead of
+proxying.
+
+```mermaid
+sequenceDiagram
+participant C as Git client
+participant Wsec as "Workhorse (secondary)"
+participant Rsec as "Rails (secondary)"
+participant Gsec as "Gitaly (secondary)"
+C->>Wsec: GET /foo/bar.git/info/refs/?service=git-upload-pack
+Wsec->>Rsec: <internal API check>
+note over Rsec: decide that the repo is synced and up to date
+Rsec-->>Wsec: 401 Unauthorized
+Wsec-->>C: <response>
+C->>Wsec: GET /foo/bar.git/info/refs/?service=git-upload-pack
+Wsec->>Rsec: <internal API check>
+Rsec-->>Wsec: Render Workhorse OK
+Wsec-->>C: 200 OK
+C->>Wsec: POST /foo/bar.git/git-upload-pack
+Wsec->>Rsec: GitHttpController#git_receive_pack
+Rsec-->>Wsec: Render Workhorse OK
+Wsec->>Gsec: Workhorse gets the connection details from Rails, connects to Gitaly: SmartHTTP Service, UploadPack RPC (check the proto for details)
+Gsec-->>Wsec: Return a stream of Proto messages
+Wsec-->>C: Pipe messages to the Git client
+```
+
+#### Proxied repositories
+
+If a requested repository isn't synced, or we detect is not up to date, the request will be proxied to the primary, in
+order to get the latest version of the changes.
+
+```mermaid
+sequenceDiagram
+participant C as Git client
+participant Wsec as "Workhorse (secondary)"
+participant Rsec as "Rails (secondary)"
+participant W as "Workhorse (primary)"
+participant R as "Rails (primary)"
+participant G as "Gitaly (primary)"
+C->>Wsec: GET /foo/bar.git/info/refs/?service=git-upload-pack
+Wsec->>Rsec: <response>
+note over Rsec: decide that the repo is out of date
+Rsec-->>Wsec: 302 Redirect to /-/push_from_secondary/2/foo/bar.git/info/refs?service=git-upload-pack
+Wsec-->>C: <response>
+C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-upload-pack
+Wsec->>W: <proxied request>
+W->>R: <data>
+R-->>W: 401 Unauthorized
+W-->>Wsec: <proxied response>
+Wsec-->>C: <response>
+C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-upload-pack
+note over W: proxied
+Wsec->>W: <proxied request>
+W->>R: <data>
+R-->>W: Render Workhorse OK
+W-->>Wsec: <proxied response>
+Wsec-->>C: <response>
+C->>Wsec: POST /-/push_from_secondary/2/foo/bar.git/git-upload-pack
+Wsec->>W: <proxied request>
+W->>R: GitHttpController#git_receive_pack
+R-->>W: Render Workhorse OK
+W->>G: Workhorse gets the connection details from Rails, connects to Gitaly: SmartHTTP Service, UploadPack RPC (check the proto for details)
+G-->>W: Return a stream of Proto messages
+W-->>Wsec: Pipe messages to the Git client
+Wsec-->>C: Return piped messages from Git
+```
+
+### Git pull over SSH
+
+As SSH operations go through GitLab Shell instead of Workhorse, they are not proxied through the mechanism used for
+Workhorse requests. With SSH operations, they are proxied as Git HTTP requests to the primary site by the secondary
+Rails internal API.
+
+#### Accelerated repositories
+
+When a repository exists on the secondary and we detect is up to date with the primary, we serve it directly instead of
+proxying.
+
+```mermaid
+sequenceDiagram
+participant C as Git client
+participant S as GitLab Shell (secondary)
+participant I as Internal API (secondary Rails)
+participant G as Gitaly (secondary)
+C->>S: git pull
+S->>I: SSH key validation (api/v4/internal/authorized_keys?key=..)
+I-->>S: HTTP/1.1 200 OK
+S->>G: InfoRefs:UploadPack RPC
+G-->>S: stream Git response back
+S-->>C: stream Git response back
+C-->>S: stream Git data to push
+S->>G: UploadPack RPC
+G-->>S: stream Git response back
+S-->>C: stream Git response back
+```
+
+#### Proxied repositories
+
+If a requested repository isn't synced, or we detect is not up to date, the request will be proxied to the primary, in
+order to get the latest version of the changes.
+
+```mermaid
+sequenceDiagram
+participant C as Git client
+participant S as GitLab Shell (secondary)
+participant I as Internal API (secondary Rails)
+participant P as Primary API
+C->>S: git pull
+S->>I: SSH key validation (api/v4/internal/authorized_keys?key=..)
+I-->>S: HTTP/1.1 300 (custom action status) with {endpoint, msg, primary_repo}
+S->>I: POST /api/v4/geo/proxy_git_ssh/info_refs_upload_pack
+I->>P: POST $PRIMARY/foo/bar.git/info/refs/?service=git-upload-pack
+P-->>I: HTTP/1.1 200 OK
+I-->>S: <response>
+S-->>C: return Git response from primary
+C-->>S: stream Git data to push
+S->>I: POST /api/v4/geo/proxy_git_ssh/upload_pack
+I->>P: POST $PRIMARY/foo/bar.git/git-upload-pack
+P-->>I: HTTP/1.1 200 OK
+I-->>S: <response>
+S-->>C: return Git response from primary
+```
+
+## Git push
+
+### Unified URLs
+
+With unified URLs, a push will redirect to a local path formatted as `/-/push_from_secondary/$SECONDARY_ID/*`. Further
+requests through this path will be proxied to the primary, which will handle the push.
+
+#### Git push over SSH
+
+As SSH operations go through GitLab Shell instead of Workhorse, they are not proxied through the mechanism used for
+Workhorse requests. With SSH operations, they are proxied as Git HTTP requests to the primary site by the secondary
+Rails internal API.
+
+```mermaid
+sequenceDiagram
+participant C as Git client
+participant S as GitLab Shell (secondary)
+participant I as Internal API (secondary Rails)
+participant P as Primary API
+C->>S: git push
+S->>I: SSH key validation (api/v4/internal/authorized_keys?key=..)
+I-->>S: HTTP/1.1 300 (custom action status) with {endpoint, msg, primary_repo}
+S->>I: POST /api/v4/geo/proxy_git_ssh/info_refs_receive_pack
+I->>P: POST $PRIMARY/foo/bar.git/info/refs/?service=git-receive-pack
+P-->>I: HTTP/1.1 200 OK
+I-->>S: <response>
+S-->>C: return Git response from primary
+C-->>S: stream Git data to push
+S->>I: POST /api/v4/geo/proxy_git_ssh/receive_pack
+I->>P: POST $PRIMARY/foo/bar.git/git-receive-pack
+P-->>I: HTTP/1.1 200 OK
+I-->>S: <response>
+S-->>C: return Git response from primary
+```
+
+#### Git push over HTTP(s)
+
+```mermaid
+sequenceDiagram
+participant C as Git client
+participant Wsec as Workhorse (secondary)
+participant W as Workhorse (primary)
+participant R as Rails (primary)
+participant G as Gitaly (primary)
+C->>Wsec: GET /foo/bar.git/info/refs/?service=git-receive-pack
+Wsec->>C: 302 Redirect to /-/push_from_secondary/2/foo/bar.git/info/refs?service=git-receive-pack
+C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack
+Wsec->>W: <proxied request>
+W->>R: <data>
+R-->>W: 401 Unauthorized
+W-->>Wsec: <proxied response>
+Wsec-->>C: <response>
+C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack
+Wsec->>W: <proxied request>
+W->>R: <data>
+R-->>W: Render Workhorse OK
+W-->>Wsec: <proxied response>
+Wsec-->>C: <response>
+C->>Wsec: POST /-/push_from_secondary/2/foo/bar.git/git-receive-pack
+Wsec->>W: <proxied request>
+W->>R: GitHttpController:git_receive_pack
+R-->>W: Render Workhorse OK
+W->>G: Get connection details from Rails and connects to SmartHTTP Service, ReceivePack RPC
+G-->>W: Return a stream of Proto messages
+W-->>Wsec: Pipe messages to the Git client
+Wsec-->>C: Return piped messages from Git
+```
+
+### Git push over HTTP with Separate URLs
+
+With separate URLs, the secondary will redirect to a URL formatted like `$PRIMARY/-/push_from_secondary/$SECONDARY_ID/*`.
+
+```mermaid
+sequenceDiagram
+participant Wsec as Workhorse (secondary)
+participant C as Git client
+participant W as Workhorse (primary)
+participant R as Rails (primary)
+participant G as Gitaly (primary)
+C->>Wsec: GET $SECONDARY/foo/bar.git/info/refs/?service=git-receive-pack
+Wsec->>C: 302 Redirect to $PRIMARY/-/push_from_secondary/2/foo/bar.git/info/refs?service=git-receive-pack
+C->>W: GET $PRIMARY/-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack
+W->>R: <data>
+R-->>W: 401 Unauthorized
+W-->>C: <response>
+C->>W: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack
+W->>R: <data>
+R-->>W: Render Workhorse OK
+W-->>C: <response>
+C->>W: POST /-/push_from_secondary/2/foo/bar.git/git-receive-pack
+W->>R: GitHttpController:git_receive_pack
+R-->>W: Render Workhorse OK
+W->>G: Get connection details from Rails and connects to SmartHTTP Service, ReceivePack RPC
+G-->>W: Return a stream of Proto messages
+W-->>C: Pipe messages to the Git client
+```
diff --git a/doc/development/git_object_deduplication.md b/doc/development/git_object_deduplication.md
index 3ac24b19fc2..1a864ef81f0 100644
--- a/doc/development/git_object_deduplication.md
+++ b/doc/development/git_object_deduplication.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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
---
# How Git object deduplication works in GitLab
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md
index 0743a03ddac..8a0cf8e7717 100644
--- a/doc/development/gitaly.md
+++ b/doc/development/gitaly.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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
---
# Gitaly developers guide
@@ -388,3 +387,28 @@ When you are using GDK, you can set it up with:
1. Start the database: `gdk start db`
1. Load the environment from GDK: `eval $(cd ../gitaly && gdk env)`
1. Create the database: `createdb --encoding=UTF8 --locale=C --echo praefect_test`
+
+## Git references used by Gitaly
+
+Gitaly uses many Git references ([refs](https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefrefaref)) to provide Git services to GitLab.
+
+### Standard Git references
+
+These standard Git references are used by GitLab (through Gitaly) in any Git repository:
+
+- `refs/heads/`. Used for branches. See the [`git branch`](https://git-scm.com/docs/git-branch) documentation.
+- `refs/tags/`. Used for tags. See the [`git tag`](https://git-scm.com/docs/git-tag) documentation.
+
+### GitLab-specific references
+
+These GitLab-specific references are used exclusively by GitLab (through Gitaly):
+
+- `refs/keep-around/<object-id>`. References to commits that have pipeline jobs or merge requests. The `object-id` points to the commit the pipeline was run on.
+- `refs/merge-requests/<merge-request-iid>/`. [Merges](https://git-scm.com/docs/git-merge) merge two histories together. This ref namespace tracks information about a
+ merge using the following refs under it:
+ - `head`. Current `HEAD` of the merge request.
+ - `merge`. Commit for the merge request. Every merge request creates a commit object under `refs/keep-around`.
+ - If [merge trains are enabled](../ci/pipelines/merge_trains.md): `train`. Commit for the merge train.
+- `refs/pipelines/<pipeline-iid>`. References to pipelines. Temporarily used to store the pipeline commit object ID.
+- `refs/environments/<environment-slug>`. References to commits where deployments to environments were performed.
+- `refs/heads/revert-<source-commit-short-object-id>`. References to the commit's object ID created when [reverting changes](../user/project/merge_requests/revert_changes.md).
diff --git a/doc/development/gitlab_flavored_markdown/specification_guide/index.md b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
index cedf44cf1fc..80837506037 100644
--- a/doc/development/gitlab_flavored_markdown/specification_guide/index.md
+++ b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
@@ -69,11 +69,11 @@ serve as input to automated conformance tests. It is
> This document attempts to specify Markdown syntax unambiguously. It contains many
> examples with side-by-side Markdown and HTML. These examples are intended to double as conformance tests.
-The HTML-rendered versions of the specifications:
+Here are the HTML-rendered versions of the specifications:
- [GitLab Flavored Markdown (GLFM) specification](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/output/spec.html), which extends the:
-- [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/), which extends the:
-- [CommonMark specification](https://spec.commonmark.org/0.30/)
+- [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/) (rendered from the [source `spec.txt` for GFM specification](https://github.com/github/cmark-gfm/blob/master/test/spec.txt)), which extends the:
+- [CommonMark specification](https://spec.commonmark.org/0.30/) (rendered from the [source `spec.txt` for CommonMark specification](https://github.com/commonmark/commonmark-spec/blob/master/spec.txt))
NOTE:
The creation of the
@@ -136,10 +136,10 @@ NOTE:
#### Markdown snapshot testing
_Markdown snapshot testing_ refers to the automated testing performed in
-the GitLab codebase, which is driven by snapshot fixture data derived from the
-GLFM specification. It consists of both backend RSpec tests and frontend Jest tests
-which use the fixture data. This fixture data is contained in YAML files. These files
-can be generated and updated based on the Markdown examples in the specification,
+the GitLab codebase, which is driven by "example_snapshots" fixture data derived from all of
+the examples in the GLFM specification. It consists of both backend RSpec tests and frontend Jest
+tests which use the fixture data. This fixture data is contained in YAML files. These files
+are generated and updated based on the Markdown examples in the specification,
and the existing GLFM parser and render implementations. They may also be
manually updated as necessary to test-drive incomplete implementations.
Regarding the terminology used here:
@@ -159,7 +159,7 @@ Regarding the terminology used here:
[Jest snapshot testing](https://jestjs.io/docs/snapshot-testing), as used elsewhere
in the GitLab frontend testing suite. However, the Markdown snapshot testing does
follow the same philosophy and patterns as Jest snapshot testing:
- 1. Snapshot fixture data is represented as files which are checked into source control.
+ 1. Snapshot example fixture data is represented as files which are checked into source control.
1. The files can be automatically generated and updated based on the implementation
of the code under tests.
1. The files can also be manually updated when necessary, for example, to test-drive
@@ -168,9 +168,15 @@ Regarding the terminology used here:
[Rails database fixture files](https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html).
It instead refers to _test fixtures_ in the
[more generic definition](https://en.wikipedia.org/wiki/Test_fixture#Software),
- as input data to support automated testing. However, fixture files still exist, so
- they are colocated under the `spec/fixtures` directory with the rest of
- the fixture data for the GitLab Rails application.
+ as input data to support automated testing.
+1. These example snapshots fixture files are generated from and closely related to the rest of the
+ GLFM specification. Therefore, the `example_snapshots` directory is colocated under the
+ `glfm_specification` directory with the rest of the
+ GLFM [specification files](#specification-files). They are intentionally _not_
+ located under the `spec/fixtures` directory with the rest of
+ the fixture data for the GitLab Rails application. In practice, developers have found
+ it simpler and more understandable to have everything under the `glfm_specification` directory
+ rather than splitting these files into the `spec/fixtures` directory.
<!-- vale gitlab.InclusionCultural = YES -->
@@ -395,9 +401,10 @@ The documentation on the implementation is split into three sections:
1. [Scripts](#scripts).
1. [Specification files](#specification-files).
-1. Example snapshot files: These YAML files are used as input data
+1. [Example snapshot files](#example-snapshot-files):
+ These YAML files are used as input data
or fixtures to drive the various tests, and are located under
- `spec/fixtures/glfm/example_snapshots`. All example snapshot files are automatically
+ `glfm_specification/example_snapshots`. All example snapshot files are automatically
generated based on the specification files and the implementation of the parsers and renderers.
However, they can also be directly edited if necessary, such as to
test-drive an incomplete implementation.
@@ -662,16 +669,16 @@ controls the behavior of the [scripts](#scripts) and [tests](#types-of-markdown-
The following optional entries are supported for each example. They all default to `false`:
- `skip_update_example_snapshots`: When true, skips any addition or update of any this example's entries
- in the [`spec/fixtures/glfm/example_snapshots/html.yml`](#specfixturesglfmexample_snapshotshtmlyml) file
- or the [`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`](#specfixturesglfmexample_snapshotsprosemirror_jsonyml) file.
+ in the [`glfm_specification/example_snapshots/html.yml`](#glfm_specificationexample_snapshotshtmlyml) file
+ or the [`glfm_specification/example_snapshots/prosemirror_json.yml`](#glfm_specificationexample_snapshotsprosemirror_jsonyml) file.
If this value is truthy, then no other `skip_update_example_snapshot_*` entries can be truthy,
and an error is raised if any of them are.
- `skip_update_example_snapshot_html_static`: When true, skips addition or update of this example's [static HTML](#static-html)
- entry in the [`spec/fixtures/glfm/example_snapshots/html.yml`](#specfixturesglfmexample_snapshotshtmlyml) file.
+ entry in the [`glfm_specification/example_snapshots/html.yml`](#glfm_specificationexample_snapshotshtmlyml) file.
- `skip_update_example_snapshot_html_wysiwyg`: When true, skips addition or update of this example's [WYSIWYG HTML](#wysiwyg-html)
- entry in the [`spec/fixtures/glfm/example_snapshots/html.yml`](#specfixturesglfmexample_snapshotshtmlyml) file.
+ entry in the [`glfm_specification/example_snapshots/html.yml`](#glfm_specificationexample_snapshotshtmlyml) file.
- `skip_update_example_snapshot_prosemirror_json`: When true, skips addition or update of this example's
- entry in the [`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`](#specfixturesglfmexample_snapshotsprosemirror_jsonyml) file.
+ entry in the [`glfm_specification/example_snapshots/prosemirror_json.yml`](#glfm_specificationexample_snapshotsprosemirror_jsonyml) file.
- `skip_running_conformance_static_tests`: When true, skips running the [Markdown conformance tests](#markdown-conformance-testing)
of the [static HTML](#static-html) for this example.
- `skip_running_conformance_wysiwyg_tests`: When true, skips running the [Markdown conformance tests](#markdown-conformance-testing)
@@ -681,7 +688,7 @@ The following optional entries are supported for each example. They all default
- `skip_running_snapshot_wysiwyg_html_tests`: When true, skips running the [Markdown snapshot tests](#markdown-snapshot-testing)
of the [WYSIWYG HTML](#wysiwyg-html) for this example.
- `skip_running_snapshot_prosemirror_json_tests`: When true, skips running the [Markdown snapshot tests](#markdown-snapshot-testing)
- of the [ProseMirror JSON](#specfixturesglfmexample_snapshotsprosemirror_jsonyml) for this example.
+ of the [ProseMirror JSON](#glfm_specificationexample_snapshotsprosemirror_jsonyml) for this example.
`glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml` sample entry:
@@ -808,9 +815,9 @@ key in `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.ym
can be used to disable automatic generation of some examples. They can instead
be manually edited as necessary to help drive the implementations.
-#### `spec/fixtures/glfm/example_snapshots/examples_index.yml`
+#### `glfm_specification/example_snapshots/examples_index.yml`
-[`spec/fixtures/glfm/example_snapshots/examples_index.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/examples_index.yml)
+[`glfm_specification/example_snapshots/examples_index.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/examples_index.yml)
is the main list of all
CommonMark, GFM, and GLFM example names, each with a unique canonical name.
@@ -836,7 +843,7 @@ CommonMark, GFM, and GLFM example names, each with a unique canonical name.
examples where multiple examples exist for the same Section 7 subsection are
added to the end of the sub-section.
-`spec/fixtures/glfm/example_snapshots/examples_index.yml` sample entries:
+`glfm_specification/example_snapshots/examples_index.yml` sample entries:
```yaml
02_01_preliminaries_characters_and_lines_1:
@@ -856,10 +863,10 @@ CommonMark, GFM, and GLFM example names, each with a unique canonical name.
source_specification: gitlab
```
-#### `spec/fixtures/glfm/example_snapshots/markdown.yml`
+#### `glfm_specification/example_snapshots/markdown.yml`
-[`spec/fixtures/glfm/example_snapshots/markdown.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/markdown.yml) contains the original Markdown
-for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
+[`glfm_specification/example_snapshots/markdown.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/markdown.yml) contains the original Markdown
+for each entry in `glfm_specification/example_snapshots/examples_index.yml`
- For CommonMark and GFM Markdown,
it is generated (or updated) from the standard GFM
@@ -868,17 +875,17 @@ for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
`glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`
input specification file.
-`spec/fixtures/glfm/example_snapshots/markdown.yml` sample entry:
+`glfm_specification/example_snapshots/markdown.yml` sample entry:
```yaml
06_04_inlines_emphasis_and_strong_emphasis_1: |
*foo bar*
```
-#### `spec/fixtures/glfm/example_snapshots/html.yml`
+#### `glfm_specification/example_snapshots/html.yml`
-[`spec/fixtures/glfm/example_snapshots/html.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/html.yml)
-contains the HTML for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
+[`glfm_specification/example_snapshots/html.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/html.yml)
+contains the HTML for each entry in `glfm_specification/example_snapshots/examples_index.yml`
Three types of entries exist, with different HTML for each:
@@ -889,13 +896,13 @@ Three types of entries exist, with different HTML for each:
`glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`.
- **Static**
- This is the static (backend (Ruby)-generated) HTML for each entry in
- `spec/fixtures/glfm/example_snapshots/examples_index.yml`.
+ `glfm_specification/example_snapshots/examples_index.yml`.
- It is generated/updated from backend [Markdown API](../../../api/markdown.md)
(or the underlying internal classes) via the `update-example-snapshots.rb` script,
but can be manually updated for static examples with incomplete implementations.
- **WYSIWYG**
- The WYSIWYG (frontend, JavaScript-generated) HTML for each entry in
- `spec/fixtures/glfm/example_snapshots/examples_index.yml`.
+ `glfm_specification/example_snapshots/examples_index.yml`.
- It is generated (or updated) from the frontend Content Editor implementation via the
`update-example-snapshots.rb` script. It can be manually updated for WYSIWYG
examples with incomplete implementations.
@@ -903,7 +910,7 @@ Three types of entries exist, with different HTML for each:
Any exceptions or failures which occur when generating HTML are replaced with an
`Error - check implementation` value.
-`spec/fixtures/glfm/example_snapshots/html.yml` sample entry:
+`glfm_specification/example_snapshots/html.yml` sample entry:
```yaml
06_04_inlines_emphasis_and_strong_emphasis_1:
@@ -919,16 +926,16 @@ NOTE:
The actual `static` or `WYSIWYG` entries may differ from the example `html.yml`,
depending on how the implementations evolve.
-#### `spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`
+#### `glfm_specification/example_snapshots/prosemirror_json.yml`
-[`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml)
-contains the ProseMirror JSON for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
+[`glfm_specification/example_snapshots/prosemirror_json.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/prosemirror_json.yml)
+contains the ProseMirror JSON for each entry in `glfm_specification/example_snapshots/examples_index.yml`
- It is generated (or updated) from the frontend code via the `update-example-snapshots.rb`
script, but can be manually updated for examples with incomplete implementations.
- Any exceptions or failures when generating are replaced with a `Error - check implementation` value.
-`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml` sample entry:
+`glfm_specification/example_snapshots/prosemirror_json.yml` sample entry:
```yaml
06_04_inlines_emphasis_and_strong_emphasis_1: |-
diff --git a/doc/development/go_guide/index.md b/doc/development/go_guide/index.md
index f5b0da2f162..1a11321b70f 100644
--- a/doc/development/go_guide/index.md
+++ b/doc/development/go_guide/index.md
@@ -443,6 +443,43 @@ of the Code Review Comments page on the Go wiki for more details.
Most editors/IDEs allow you to run commands before/after saving a file, you can set it
up to run `goimports -local gitlab.com/gitlab-org` so that it's applied to every file when saving.
+### Initializing slices
+
+If initializing a slice, provide a capacity where possible to avoid extra
+allocations.
+
+<table>
+<tr><th>:white_check_mark: Do</th><th>:x: Don't</th></tr>
+<tr>
+ <td>
+
+ ```golang
+ s2 := make([]string, 0, size)
+ for _, val := range s1 {
+ s2 = append(s2, val)
+ }
+ ```
+
+ </td>
+ <td>
+
+ ```golang
+ var s2 []string
+ for _, val := range s1 {
+ s2 = append(s2, val)
+ }
+ ```
+
+ </td>
+</tr>
+</table>
+
+If no capacity is passed to `make` when creating a new slice, `append`
+will continuously resize the slice's backing array if it cannot hold
+the values. Providing the capacity ensures that allocations are kept
+to a minimum. It is recommended that the [`prealloc`](https://github.com/alexkohler/prealloc)
+golanci-lint rule automatically check for this.
+
### Analyzer Tests
The conventional Secure [analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/) has a [`convert` function](https://gitlab.com/gitlab-org/security-products/analyzers/command/-/blob/main/convert.go#L15-17) that converts SAST/DAST scanner reports into [GitLab Security Reports](https://gitlab.com/gitlab-org/security-products/security-report-schemas). When writing tests for the `convert` function, we should make use of [test fixtures](https://dave.cheney.net/2016/05/10/test-fixtures-in-go) using a `testdata` directory at the root of the analyzer's repository. The `testdata` directory should contain two subdirectories: `expect` and `reports`. The `reports` directory should contain sample SAST/DAST scanner reports which are passed into the `convert` function during the test setup. The `expect` directory should contain the expected GitLab Security Report that the `convert` returns. See Secret Detection for an [example](https://gitlab.com/gitlab-org/security-products/analyzers/secrets/-/blob/160424589ef1eed7b91b59484e019095bc7233bd/convert_test.go#L13-66).
diff --git a/doc/development/i18n/externalization.md b/doc/development/i18n/externalization.md
index 2aea15de443..18704fc2b60 100644
--- a/doc/development/i18n/externalization.md
+++ b/doc/development/i18n/externalization.md
@@ -411,6 +411,56 @@ use `%{created_at}` in Ruby but `%{createdAt}` in JavaScript. Make sure to
// => When x == 2: 'Last 2 days'
```
+- In Vue:
+
+ One of [the recommended ways to organize translated strings for Vue files](#vue-files) is to extract them into a `constants.js` file.
+ That can be difficult to do when there are pluralized strings because the `count` variable won't be known inside the constants file.
+ To overcome this, we recommend creating a function which takes a `count` argument:
+
+ ```javascript
+ // .../feature/constants.js
+ import { n__ } from '~/locale';
+
+ export const I18N = {
+ // Strings that are only singular don't need to be a function
+ someDaysRemain: __('Some days remain'),
+ daysRemaining(count) { return n__('%d day remaining', '%d days remaining', count); },
+ };
+ ```
+
+ Then within a Vue component the function can be used to retrieve the correct pluralization form of the string:
+
+ ```javascript
+ // .../feature/components/days_remaining.vue
+ import { sprintf } from '~/locale';
+ import { I18N } from '../constants';
+
+ <script>
+ export default {
+ props: {
+ days: {
+ type: Number,
+ required: true,
+ },
+ },
+ i18n: I18N,
+ };
+ </script>
+
+ <template>
+ <div>
+ <span>
+ A singular string:
+ {{ $options.i18n.someDaysRemain }}
+ </span>
+ <span>
+ A plural string:
+ {{ $options.i18n.daysRemaining(days) }}
+ </span>
+ </div>
+ </template>
+ ```
+
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.
diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md
index 8231cf4316b..cee078ca891 100644
--- a/doc/development/i18n/proofreader.md
+++ b/doc/development/i18n/proofreader.md
@@ -46,6 +46,8 @@ are very appreciative of the work done by translators and proofreaders!
- scootergrisen - [GitLab](https://gitlab.com/scootergrisen), [Crowdin](https://crowdin.com/profile/scootergrisen)
- Dutch
- Emily Hendle - [GitLab](https://gitlab.com/pundachan), [Crowdin](https://crowdin.com/profile/pandachan)
+- English (UK)
+ - Andrew Smith - [GitLab](https://gitlab.com/espadav8), [Crowdin](https://crowdin.com/profile/espadav8)
- Esperanto
- Lyubomir Vasilev - [Crowdin](https://crowdin.com/profile/lyubomirv)
- Estonian
@@ -54,6 +56,7 @@ are very appreciative of the work done by translators and proofreaders!
- Andrei Jiroh Halili - [GitLab](https://gitlab.com/ajhalili2006), [Crowdin](https://crowdin.com/profile/AndreiJirohHaliliDev2006)
- French
- Davy Defaud - [GitLab](https://gitlab.com/DevDef), [Crowdin](https://crowdin.com/profile/DevDef)
+ - Germain Gorisse - [GitLab](https://gitlab.com/ggorisse), [Crowdin](https://crowdin.com/profile/germaingorisse)
- Galician
- Antón Méixome - [Crowdin](https://crowdin.com/profile/meixome)
- Pedro Garcia - [GitLab](https://gitlab.com/pedgarrod), [Crowdin](https://crowdin.com/profile/breaking_pitt)
@@ -61,6 +64,7 @@ are very appreciative of the work done by translators and proofreaders!
- Michael Hahnle - [GitLab](https://gitlab.com/mhah), [Crowdin](https://crowdin.com/profile/mhah)
- Katrin Leinweber - [GitLab](https://gitlab.com/katrinleinweber), [Crowdin](https://crowdin.com/profile/katrinleinweber)
- Justman10000 - [GitLab](https://gitlab.com/Justman10000), [Crowdin](https://crowdin.com/profile/Justman10000)
+ - Vladislav Wanner - [GitLab](https://gitlab.com/RumBugen), [Crowdin](https://crowdin.com/profile/RumBugen)
- Greek
- Proofreaders needed.
- Hebrew
diff --git a/doc/development/import_project.md b/doc/development/import_project.md
index e910983997c..c63ba229921 100644
--- a/doc/development/import_project.md
+++ b/doc/development/import_project.md
@@ -80,6 +80,14 @@ If you're running Omnibus, run the following Rake task:
gitlab-rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file.tar.gz]"
```
+#### Enable verbose output
+
+To make the import Rake task more verbose, use the `IMPORT_DEBUG` environment variable:
+
+```shell
+IMPORT_DEBUG=true gitlab-rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file.tar.gz]"
+```
+
#### Troubleshooting
Check the common errors listed below, what they mean, and how to fix them.
@@ -133,6 +141,51 @@ During import, the tarball is cached in your configured `shared_path` directory.
disk has enough free space to accommodate both the cached tarball and the unpacked
project files on disk.
+##### Import is successful, but with a `Total number of not imported relations: XX` message, and issues are not created during the import
+
+If you receive a `Total number of not imported relations: XX` message, and issues
+aren't created during the import, check [exceptions_json.log](../administration/logs.md#exceptions_jsonlog).
+You might see an error like `N is out of range for ActiveModel::Type::Integer with limit 4 bytes`,
+where `N` is the integer exceeding the 4-byte integer limit. If that's the case, you
+are likely hitting the issue with rebalancing of `relative_position` field of the issues.
+
+The feature flag to enable the rebalance automatically was enabled on GitLab.com.
+We intend to enable it by default on self-managed instances when the issue
+[Rebalance issues FF rollout](https://gitlab.com/gitlab-org/gitlab/-/issues/343368)
+is implemented.
+
+If the feature is not enabled by default on your GitLab version, run the following
+commands in the [Rails console](../administration/operations/rails_console.md) as
+a workaround. Replace the ID with the ID of your project you were trying to import:
+
+```ruby
+# Check if the feature is enabled on your instance. If it is, rebalance should work automatically on your instance
+Feature.enabled?(:rebalance_issues,Project.find(ID).root_namespace)
+
+# Check the current maximum value of relative_position
+Issue.where(project_id: Project.find(ID).root_namespace.all_projects).maximum(:relative_position)
+
+# Enable `rebalance_issues` feauture and check that it was successfully enabled
+Feature.enable(:rebalance_issues,Project.find(ID).root_namespace)
+Feature.enabled?(:rebalance_issues,Project.find(ID).root_namespace)
+
+# Run the rebalancing process and check if the maximum value of relative_position has changed
+Issues::RelativePositionRebalancingService.new(Project.find(ID).root_namespace.all_projects).execute
+Issue.where(project_id: Project.find(ID).root_namespace.all_projects).maximum(:relative_position)
+```
+
+Repeat the import attempt after that and check if the issues are imported successfully.
+
+##### Gitaly calls error when importing
+
+If you're attempting to import a large project into a development environment, you may see Gitaly throw an error about too many calls or invocations, for example:
+
+```plaintext
+Error importing repository into qa-perf-testing/gitlabhq - GitalyClient#call called 31 times from single request. Potential n+1?
+```
+
+This is due to a [n+1 calls limit being set for development setups](gitaly.md#toomanyinvocationserror-errors). You can work around this by setting `GITALY_DISABLE_REQUEST_LIMITS=1` as an environment variable, restarting your development environment and importing again.
+
### Importing via the Rails console
The last option is to import a project using a Rails console:
@@ -206,20 +259,6 @@ You can execute the script from the `gdk/gitlab` directory like this:
bundle exec rails r /path_to_script/script.rb project_name /path_to_extracted_project request_store_enabled
```
-## Troubleshooting
-
-This section details known issues we've seen when trying to import a project and how to manage them.
-
-### Gitaly calls error when importing
-
-If you're attempting to import a large project into a development environment, you may see Gitaly throw an error about too many calls or invocations, for example:
-
-```plaintext
-Error importing repository into qa-perf-testing/gitlabhq - GitalyClient#call called 31 times from single request. Potential n+1?
-```
-
-This is due to a [n+1 calls limit being set for development setups](gitaly.md#toomanyinvocationserror-errors). You can work around this by setting `GITALY_DISABLE_REQUEST_LIMITS=1` as an environment variable, restarting your development environment and importing again.
-
## Access token setup
Many of the tests also require a GitLab Personal Access Token. This is due to numerous endpoints themselves requiring authentication.
diff --git a/doc/development/index.md b/doc/development/index.md
index 3d5ec24d3e2..1b897db5097 100644
--- a/doc/development/index.md
+++ b/doc/development/index.md
@@ -46,307 +46,3 @@ GitLab instance, see the [Administrator documentation](../administration/index.m
- [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)
-- [Patch release process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/patch/process.md#process-for-developers)
-- [Guidelines for implementing Enterprise Edition features](ee_features.md)
-- [Adding a new service component to GitLab](adding_service_component.md)
-- [Guidelines for changelogs](changelog.md)
-- [Dependencies](dependencies.md)
-- [Danger bot](dangerbot.md)
-- [Requesting access to ChatOps on GitLab.com](chatops_on_gitlabcom.md#requesting-access) (for GitLab team members)
-
-### 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 the page is not assigned to a specific group, follow the
-[Technical Writing review process for 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/)
- - [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 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 the page is not assigned to a specific group, follow the
- [Technical Writing review process for development guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines).
- 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 EventStore](event_store.md) to publish/subscribe to domain events
-- [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)
-- [Ruby upgrade guidelines](ruby_upgrade.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)
-- [Ruby 3 gotchas](ruby3_gotchas.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)
-- [Rails update guidelines](rails_update.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)
- - [Adding a new Redis instance](redis/new_redis_instance.md)
-- [Sidekiq guidelines](sidekiq/index.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)
-- [Uploads development guide](uploads/index.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
-
-- [Performance guidelines](performance.md) for writing code, benchmarks, and
- certain patterns to avoid.
-- [Caching guidelines](caching.md) for using caching in Rails under a GitLab environment.
-- [Merge request performance guidelines](merge_request_performance_guidelines.md)
- for ensuring merge requests do not negatively impact GitLab performance
-- [Profiling](profiling.md) a URL 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
-
-- [Integrations development guide](integrations/index.md)
-- [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)
-
-## Technical Reference by Group
-
-- [Create: Source Code BE](backend/create_source_code_be/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)
-- [GitLab Application SLIs](application_slis/index.md)
-- [Spam protection and CAPTCHA development guide](spam_protection_and_captcha/index.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/index.md b/doc/development/integrations/index.md
index 604e481a809..5d1bd5ad61c 100644
--- a/doc/development/integrations/index.md
+++ b/doc/development/integrations/index.md
@@ -148,6 +148,7 @@ This method should return an array of hashes for each field, where the keys can
| `title:` | string | false | Capitalized value of `name:` | The label for the form field.
| `placeholder:` | string | false | | A placeholder for the form field.
| `help:` | string | false | | A help text that displays below the form field.
+| `api_only:` | boolean | false | `false` | Specify if the field should only be available through the API, and excluded from the frontend form.
#### Additional keys for `type: 'checkbox'`
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 1a51ee88c58..0a0c5e4d2a6 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -316,11 +316,12 @@ and [Container Scanning](../../user/application_security/container_scanning/inde
You can find the schemas for these scanners here:
-- [SAST](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/sast-report-format.json)
-- [DAST](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/dast-report-format.json)
-- [Dependency Scanning](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/dependency-scanning-report-format.json)
+- [Cluster Image Scanning](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/cluster-image-scanning-report-format.json)
- [Container Scanning](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/container-scanning-report-format.json)
- [Coverage Fuzzing](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/coverage-fuzzing-report-format.json)
+- [DAST](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/dast-report-format.json)
+- [Dependency Scanning](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/dependency-scanning-report-format.json)
+- [SAST](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/sast-report-format.json)
- [Secret Detection](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/secret-detection-report-format.json)
### Retention period for vulnerabilities
@@ -360,6 +361,41 @@ Ongoing improvements to report validation are tracked [in this epic](https://git
In the meantime, you can see which versions are supported in the
[source code](https://gitlab.com/gitlab-org/gitlab/-/blob/08dd756429731a0cca1e27ca9d59eea226398a7d/lib/gitlab/ci/parsers/security/validators/schema_validator.rb#L9-27).
+#### Validate locally
+
+Before running your analyzer in GitLab, you should validate the report produced by your analyzer to
+ensure it complies with the declared schema version.
+
+Use the script below to validate JSON files against a given schema.
+
+```ruby
+require 'bundler/inline'
+
+gemfile do
+ source 'https://rubygems.org'
+ gem 'json_schemer'
+end
+
+require 'json'
+require 'pathname'
+
+raise 'Usage: ruby script.rb <security schema file name> <report file name>' unless ARGV.size == 2
+
+schema = JSONSchemer.schema(Pathname.new(ARGV[0]))
+report = JSON.parse(File.open(ARGV[1]).read)
+schema_validation_errors = schema.validate(report).map { |error| JSONSchemer::Errors.pretty(error) }
+puts(schema_validation_errors)
+```
+
+1. Download the appropriate schema that matches your report type and declared version. For
+ example, you can find version `14.0.6` of the `container_scanning` report schema at
+ `https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/v14.0.6/dist/container-scanning-report-format.json?inline=false`.
+1. Save the Ruby script above in a file, for example, `validate.rb`.
+1. Run the script, passing the schema and report file names as arguments in order. For example:
+ 1. Using your local Ruby interpreter: `ruby validate.rb container-scanning-format_14-0-6.json gl-container-scanning-report.json`.
+ 1. Using Docker: `docker run -it --rm -v $(pwd):/ci ruby:3-slim ruby /ci/validate.rb /ci/container-scanning-format_14-0-6.json /ci/gl-container-scanning-report.json`
+1. Validation errors are shown on the screen. You must resolve these errors before GitLab can ingest your report.
+
### Report Fields
#### Version
@@ -451,7 +487,7 @@ The `identifiers` array describes the detected vulnerability. An identifier obje
`value` fields are used to tell if two identifiers are the same. The user interface uses the
object's `name` and `url` fields to display the identifier.
-It is recommended to reuse the identifiers the GitLab scanners already define:
+We recommend that you use the identifiers the GitLab scanners already define:
| Identifier | Type | Example value |
|------------|------|---------------|
@@ -479,7 +515,7 @@ Not all vulnerabilities have CVEs, and a CVE can be identified multiple times. A
isn't a stable identifier and you shouldn't assume it as such when tracking vulnerabilities.
The maximum number of identifiers for a vulnerability is set as 20. If a vulnerability has more than 20 identifiers,
-the system saves only the first 20 of them. Note that vulnerabilities in the [Pipeline Security](../../user/application_security/security_dashboard/#view-vulnerabilities-in-a-pipeline)
+the system saves only the first 20 of them. Note that vulnerabilities in the [Pipeline Security](../../user/application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline)
tab do not enforce this limit and all identifiers present in the report artifact are displayed.
#### Details
diff --git a/doc/development/internal_api/index.md b/doc/development/internal_api/index.md
index 288c0056821..13e095b4a83 100644
--- a/doc/development/internal_api/index.md
+++ b/doc/development/internal_api/index.md
@@ -334,14 +334,15 @@ Example response:
## Authenticate Error Tracking requests
This endpoint is called by the error tracking Go REST API application to authenticate a project.
+> [Introduced](https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1693) in GitLab 15.1.
| Attribute | Type | Required | Description |
|:-------------|:--------|:---------|:-------------------------------------------------------------------|
| `project_id` | integer | yes | The ID of the project which has the associated key. |
-| `public_key` | string | yes | The public key generated by the integrated error tracking feature. |
+| `public_key` | string | yes | The [public key](../../api/error_tracking.md#error-tracking-client-keys) generated by the integrated Error Tracking feature. |
```plaintext
-POST /internal/error_tracking_allowed
+POST /internal/error_tracking/allowed
```
Example request:
@@ -349,7 +350,7 @@ Example request:
```shell
curl --request POST --header "Gitlab-Shared-Secret: <Base64 encoded secret>" \
--data "project_id=111&public_key=generated-error-tracking-key" \
- "http://localhost:3001/api/v4/internal/error_tracking_allowed"
+ "http://localhost:3001/api/v4/internal/error_tracking/allowed"
```
Example response:
diff --git a/doc/development/iterating_tables_in_batches.md b/doc/development/iterating_tables_in_batches.md
index b4459b53efa..1159e3755e5 100644
--- a/doc/development/iterating_tables_in_batches.md
+++ b/doc/development/iterating_tables_in_batches.md
@@ -42,20 +42,20 @@ The API of this method is similar to `in_batches`, though it doesn't support
all of the arguments that `in_batches` supports. You should always use
`each_batch` _unless_ you have a specific need for `in_batches`.
-## Avoid iterating over non-unique columns
+## 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 do 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.
+One should proceed with extra caution. 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 do 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 the following query
+This happens because the built relation is translated into the following query:
```ruby
[ gstg ] production> puts Ci::Build.where(user_id: (1..10_000)).to_sql
@@ -69,6 +69,27 @@ threshold does not translate to the size of the returned dataset. That happens b
`n` possible values of attributes, one can't tell for sure that the number of records that contains
them is less than `n`.
+### Loose-index scan with `distinct_each_batch`
+
+When iterating over a non-unique column is necessary, use the `distinct_each_batch` helper
+method. The helper uses the [loose-index scan technique](https://wiki.postgresql.org/wiki/Loose_indexscan)
+(skip-index scan) to skip duplicated values within a database index.
+
+Example: iterating over distinct `author_id` in the Issue model
+
+```ruby
+Issue.distinct_each_batch(column: :author_id, of: 1000) do |relation|
+ users = User.where(id: relation.select(:author_id)).to_a
+end
+```
+
+The technique provides stable performance between the batches regardless of the data distribution.
+The `relation` object returns an ActiveRecord scope where only the given `column` is available.
+Other columns are not loaded.
+
+The underlying database queries use recursive CTEs, which adds extra overhead. We therefore advise to use
+smaller batch sizes than those used for a standard `each_batch` iteration.
+
## Column definition
`EachBatch` uses the primary key of the model by default for the iteration. This works most of the
diff --git a/doc/development/licensed_feature_availability.md b/doc/development/licensed_feature_availability.md
index 09c32fc4244..21b07ae89b5 100644
--- a/doc/development/licensed_feature_availability.md
+++ b/doc/development/licensed_feature_availability.md
@@ -61,3 +61,12 @@ before_action do
push_licensed_feature(:feature_symbol, project)
end
```
+
+## Allow use of licensed EE features
+
+To enable plans per namespace turn on the `Allow use of licensed EE features` option from the settings page.
+This will make licensed EE features available to projects only if the project namespace's plan includes the feature
+or if the project is public. To enable it:
+
+1. If you are developing locally, follow the steps in [simulate SaaS](ee_features.md#act-as-saas) to make the option available.
+1. Select Admin > Settings > General > "Account and limit" and enable "Allow use of licensed EE features".
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index c9b59ba66b5..e0e21319f47 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -90,6 +90,14 @@ Keep in mind that all durations should be measured against GitLab.com.
| Post-deployment migrations | `<= 10 minutes` | A valid exception are schema changes, since they must not happen in background migrations. |
| Background migrations | `> 10 minutes` | Since these are suitable for larger tables, it's not possible to set a precise timing guideline, however, any single query must stay below [`1 second` execution time](query_performance.md#timing-guidelines-for-queries) with cold caches. |
+## Decide which database to target
+
+GitLab connects to two different Postgres databases: `main` and `ci`. This split can affect migrations
+as they may run on either or both of these databases.
+
+Read [Migrations for Multiple databases](database/migrations_for_multiple_databases.md) to understand if or how
+a migration you add should account for this.
+
## Create a regular schema migration
To create a migration you can use the following Rails generator:
@@ -569,6 +577,12 @@ class MyMigration < Gitlab::Database::Migration[2.0]
end
```
+Verify the index is not being used anymore with this Thanos query:
+
+```sql
+sum(rate(pg_stat_user_indexes_idx_tup_read{env="gprd", indexrelname="index_ci_name", type="patroni-ci"}[5m]))
+```
+
Note that it is not necessary to check if the index exists prior to
removing it, however it is required to specify the name of the
index that is being removed. This can be done either by passing the name
diff --git a/doc/development/omnibus.md b/doc/development/omnibus.md
index b62574e34e5..4e2f2b0c763 100644
--- a/doc/development/omnibus.md
+++ b/doc/development/omnibus.md
@@ -21,7 +21,7 @@ For example, the `git` user is allowed to write in the `log/` directory, in
`public/uploads`, and they are allowed to rewrite the `db/structure.sql` file.
In other cases, the reconfigure script tricks GitLab into not trying to write a
-file. For instance, GitLab will generate a `.secret` file if it cannot find one
+file. For instance, GitLab generates a `.secret` file if it cannot find one
and write it to the Rails root. In the Omnibus packages, reconfigure writes the
`.secret` file first, so that GitLab never tries to write it.
diff --git a/doc/development/packages/debian_repository.md b/doc/development/packages/debian_repository.md
new file mode 100644
index 00000000000..a417ced2e65
--- /dev/null
+++ b/doc/development/packages/debian_repository.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 Repository
+
+This guide explains:
+
+1. A basic overview of how Debian packages are structured
+1. What package managers, clients, and tools are used to manage Debian packages
+1. How the GitLab Debian repository functions
+
+## Debian package basics
+
+There are two types of [Debian packages](https://www.debian.org/doc/manuals/debian-faq/pkg-basics.en.html): binary and source.
+
+- **Binary** - These are usually `.deb` files and contain executables, config files, and other data. A binary package must match your OS or architecture since it is already compiled. These are usually installed using `dpkg`. Dependencies must already exist on the system when installing a binary package.
+- **Source** - These are usual made up of `.dsc` files and `.gz` files. A source package is compiled on your system. These are fetched and installed with [`apt`](https://manpages.debian.org/bullseye/apt/apt.8.en.html), which then uses `dpkg` after the package is compiled. When you use `apt`, it will fetch and install the necessary dependencies.
+
+The `.deb` file follows the naming convention `<PackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb`
+
+It includes a `control file` that contains metadata about the package. You can view the control file by using `dpkg --info <deb_file>`
+
+The [`.changes` file](https://www.debian.org/doc/debian-policy/ch-controlfields.html#debian-changes-files-changes) is used to tell the Debian repository how to process updates to packages. It contains a variety of metadata for the package, including architecture, distribution, and version. In addition to the metadata, they contain three lists of checksums: `sha1`, `sha256`, and `md5` in the `Files` section. Refer to [sample_1.2.3~alpha2_amd64.changes](https://gitlab.com/gitlab-org/gitlab/-/blob/dd1e70d3676891025534dc4a1e89ca9383178fe7/spec/fixtures/packages/debian/sample_1.2.3~alpha2_amd64.changes) for an example of how these files are structured.
+
+## How do people get Debian packages?
+
+While you can download a single `.deb` file and install it with [`dpkg`](https://manpages.debian.org/bullseye/dpkg/dpkg.1.en.html), most users consume Debian packages with [`apt`](https://manpages.debian.org/bullseye/apt/apt.8.en.html) using `apt-get`. `apt` wraps `dpkg`, adding dependency management and compilation.
+
+## How do people publish Debian packages?
+
+It is not uncommon to use `curl` to publish packages depending on the type of Debian repository you are working with. However, `dput-ng` is the best tool to use as it will upload the relevant files based on the `.changes` file.
+
+## What is all this distribution business?
+
+When it comes to Debian, packages don't exist on their own. They belong to a _distribution_. This can mean many things, but the main thing to note is users are used to having to specify the distribution.
+
+## What does a Debian Repository look like?
+
+- A [Debian repository](https://wiki.debian.org/DebianRepository) is made up of many releases.
+- Each release is given a **codename**. For the public Debian repository, these are things like "bullseye" and "jesse".
+ - There is also the concept of **suites** which are essentially aliases of codenames synonymous with release channels like "stable" and "edge".
+- Each release has many **components**. In the public repository, these are "main", "contrib", and "non-free".
+- Each release has many **architectures** such as "amd64", "arm64", or "i386".
+- Each release has a signed **Release** file (see below about [GPG signing](#what-are-gpg-keys-and-what-are-signed-releases))
+
+A standard directory-based Debian repository would be organized as:
+
+```plaintext
+dists\
+ |--jessie/
+ |--bullseye\
+ |Changelog
+ |Release
+ |InRelease
+ |Release.gpg
+ |--main\
+ |--amd64\
+ |--arm64\
+ |--contrib\
+ |--non-free\
+pool\
+ |--this is where the .deb files for all releases live
+```
+
+You can explore a mirror of the public Debian repository here: <http://ftp.us.debian.org/debian/>
+
+In the public Debian repository, the entire directory structure, release files, GPG keys, and other files are all generated by a series of scripts called the [Debian Archive Kit, or dak](https://salsa.debian.org/ftp-team/dak).
+
+In the GitLab Debian repository, we don't deal with specific file directories. Instead, we use code and an underlying [PostgreSQL database to organize the relationships](structure.md#debian-packages) between these different pieces.
+
+## What does a Debian Repository do?
+
+The Debian community created many package repository systems before things like object storage existed, and they used FTP to upload artifacts to a remote server. Most current package repositories and registries are just directories on a server somewhere. Packages added to the [official Debian distribution](https://www.debian.org/distrib/packages) exist in a central public repository that a group of open source maintainers curates. The package maintainers use the [Debian Archive Kit, or dak](https://salsa.debian.org/ftp-team/dak) scripts to generate release files and do other maintenance tasks. So, in addition to storing and serving files, a complete Debian repository needs to accomplish the same behavior that dak provides. This behavior is what the GitLab Debian registry aims to do.
+
+## What are GPG keys, and what are signed releases
+
+A [GPG key](https://www.gnupg.org/) is a public/private key pair for secure data transmission. Similar to an SSH key, there is a private and public key. Whoever has the _public key can encrypt data_, and whoever has the _private key can decrypt data_ that was encrypted using the public key. You can also use GPG keys to sign data. Whoever has the private key can sign data or a file, and whoever has the public key can then check the signature and trust it came from the person with the matching private key.
+
+We use GPG to sign the release file for the Debian packages. The release file is an index of all packages within a given distribution and their respective digests.
+
+In the GitLab Debian registry, a background process generates a new release file whenever a user publishes a new package to their Debian repository. A GPG key is created for each distribution. If a user requests a release for that distribution, they can request the signed version and the public GPG key to verify the authenticity of that release file.
+
+## GitLab repository internals
+
+When a [file upload](../../api/packages/debian.md#upload-a-package-file) occurs:
+
+1. A new "incoming" package record is found or created. All new files are assigned to the "incoming" package. It is a holding area used until we know what package the file is actually associated with.
+1. A new "unknown" file is stored. It is unknown because we do not yet know if this file belongs to an existing package or not.
+
+Once we know which package the file belongs to, it is associated with that package, and the "incoming" package is removed if no more files remain. The "unknown" status of the file is updated to the correct file type.
+
+Next, if the file is a `.changes` format:
+
+1. The `.changes` file is parsed and any files listed within it are updated. All uploaded non-`.changes` files are correctly associated with various distributions and packages.
+1. The `::Packages::Debian::GenerateDistributionWorker` and thus `::Packages::Debian::GenerateDistributionService` are run.
+ 1. Component files are created or updated. Since we just updated package files that were listed in the `.changes` file, we now check the component/architecture files based on the changed checksum values.
+ 1. A new release is generated:
+ 1. A new GPG key is generated if one does not already exist for the distribution
+ 1. A [Release file](https://wiki.debian.org/DebianRepository/Format#A.22Release.22_files) is written, signed by the GPG key, and then stored.
+ 1. Old component files are destroyed.
+
+This diagram shows the path taken after a file is uploaded to the Debian API:
+
+```mermaid
+sequenceDiagram
+ Client->>+DebianProjectPackages: PUT projects/:id/packages/debian/:file_name
+ DebianProjectPackages->>+FindOrCreateIncomingService: Create "incoming" package
+ DebianProjectPackages->>+CreatePackageFileService: Create "unknown" file
+ Note over DebianProjectPackages: If `.changes` file
+ DebianProjectPackages->>+ProcessChangesWorker: Schedule worker to process the file
+ DebianProjectPackages->>+Client: 202 Created
+ ProcessChangesWorker->>+ProcessChangesService: Start service
+ ProcessChangesService->>+ExtractChangesMetadataService: Extract changesmetadata
+ ExtractChangesMetadataService->>+ExtractMetadataService: Extract file metadata
+ ExtractMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file
+ ExtractMetadataService->>+ExtractDebMetadataService: If .deb or .udeb
+ ExtractDebMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file
+ ParseDebian822Service-->>-ExtractDebMetadataService: Parse String as Debian RFC822 control data format
+ ExtractDebMetadataService-->>-ExtractMetadataService: Return the parsed control file
+ ExtractMetadataService->>+ParseDebian822Service: if .dsc, .changes, or buildinfo
+ ParseDebian822Service-->>-ExtractMetadataService: Parse String as Debian RFC822 control data format
+ ExtractMetadataService-->>-ExtractChangesMetadataService: Parse Metadata file
+ ExtractChangesMetadataService-->>-ProcessChangesService: Return list of files and hashes from the .changes file
+ loop process files listed in .changes
+ ProcessChangesService->>+ExtractMetadataService: Process file
+ ExtractMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file
+ ExtractMetadataService->>+ExtractDebMetadataService: If .deb or .udeb
+ ExtractDebMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file
+ ParseDebian822Service-->>-ExtractDebMetadataService: Parse String as Debian RFC822 control data format
+ ExtractDebMetadataService-->>-ExtractMetadataService: Return the parsed control file
+ ExtractMetadataService->>+ParseDebian822Service: if .dsc, .changes, or buildinfo
+ ParseDebian822Service-->>-ExtractMetadataService: Parse String as Debian RFC822 control data format
+ ExtractMetadataService-->>-ProcessChangesService: Use parsed metadata to update "unknown" (or known) file
+ end
+ ProcessChangesService->>+GenerateDistributionWorker: Find distribution and start service
+ GenerateDistributionWorker->>+GenerateDistributionService: Generate distribution
+ GenerateDistributionService->>+GenerateDistributionService: generate component files based on new archs and updates from .changes
+ GenerateDistributionService->>+GenerateDistributionKeyService: generate GPG key for distribution
+ GenerateDistributionKeyService-->>-GenerateDistributionService: GPG key
+ GenerateDistributionService-->>-GenerateDistributionService: Generate distribution file
+ GenerateDistributionService->>+SignDistributionService: Sign release file with GPG key
+ SignDistributionService-->>-GenerateDistributionService: Save the signed release file
+ GenerateDistributionWorker->>+GenerateDistributionService: destroy no longer used component files
+```
+
+### Distributions
+
+You must create a distribution before publishing a package to it. When you create or update a distribution using the project or group distribution API, in addition to creating the initial backing records in the database, the `GenerateDistributionService` run as shown in the above sequence diagram.
diff --git a/doc/development/packages/structure.md b/doc/development/packages/structure.md
index a2716232b11..f8d9da2cc73 100644
--- a/doc/development/packages/structure.md
+++ b/doc/development/packages/structure.md
@@ -39,7 +39,6 @@ erDiagram
projects }|--|| namespaces : ""
packages_packages }|--|| projects : ""
packages_package_files }o--|| packages_packages : ""
- package_debian_file_metadatum |o--|| packages_package_files : ""
packages_debian_group_architectures }|--|| packages_debian_group_distributions : ""
packages_debian_group_component_files }|--|| packages_debian_group_components : ""
packages_debian_group_component_files }|--|| packages_debian_group_architectures : ""
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 6d0b833a2da..d7cbef0a211 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -26,10 +26,10 @@ consistent performance of GitLab. Refer to the [Index](#performance-documentatio
- Frontend:
- [Performance guidelines](../development/fe_guide/performance.md)
- [Performance dashboards and monitoring guidelines](../development/new_fe_guide/development/performance.md)
- - [Browser performance testing guidelines](../user/project/merge_requests/browser_performance_testing.md)
+ - [Browser performance testing guidelines](../ci/testing/browser_performance_testing.md)
- [`gdk measure` and `gdk measure-workflow`](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/gdk_commands.md#measure-performance)
- QA:
- - [Load performance testing](../user/project/merge_requests/load_performance_testing.md)
+ - [Load performance testing](../ci/testing/load_performance_testing.md)
- [GitLab Performance Tool project](https://gitlab.com/gitlab-org/quality/performance)
- [Review apps performance metrics](../development/testing_guide/review_apps.md#performance-metrics)
- Monitoring & Overview:
@@ -581,7 +581,7 @@ called `memory-on-boot`. ([Read an example job.](https://gitlab.com/gitlab-org/g
You may find the results:
- On the merge request **Overview** tab, in the merge request reports area, in the
- **Metrics Reports** [dropdown list](../ci/metrics_reports.md).
+ **Metrics Reports** [dropdown list](../ci/testing/metrics_reports.md).
- In the `memory-on-boot` artifacts for a full report and a dependency breakdown.
`derailed_benchmarks` also provides other methods to investigate memory. To learn more,
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index 436977a7f38..2bf1e5a315a 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -37,7 +37,7 @@ flowchart LR
subgraph backend
be["Backend code"]--tested with-->rspec
end
-
+
be--generates-->fixtures["frontend fixtures"]
fixtures--used in-->jest
```
@@ -171,7 +171,7 @@ Our current RSpec tests parallelization setup is as follows:
1. The `retrieve-tests-metadata` job in the `prepare` stage ensures we have a
`knapsack/report-master.json` file:
- The `knapsack/report-master.json` file is fetched from the latest `main` pipeline which runs `update-tests-metadata`
- (for now it's the 2-hourly scheduled master pipeline), if it's not here we initialize the file with `{}`.
+ (for now it's the 2-hourly `maintenance` scheduled master pipeline), if it's not here we initialize the file with `{}`.
1. Each `[rspec|rspec-ee] [migration|unit|integration|system|geo] n m` job are run with
`knapsack rspec` and should have an evenly distributed share of tests:
- It works because the jobs have access to the `knapsack/report-master.json`
@@ -275,6 +275,19 @@ rather than from the default branch `main-jh`.
NOTE:
For now, CI will try to fetch the branch on the [GitLab JH mirror](https://gitlab.com/gitlab-org/gitlab-jh-mirrors/gitlab), so it might take some time for the new JH branch to propagate to the mirror.
+## Ruby 3.0 jobs
+
+You can add the `pipeline:run-in-ruby3` label to the merge request to switch
+the Ruby version used for running the whole test suite to 3.0. When you do
+this, the test suite will no longer run in Ruby 2.7 (default), and an
+additional job `verify-ruby-2.7` will also run and always fail to remind us to
+remove the label and run in Ruby 2.7 before merging the merge request.
+
+This should let us:
+
+- Test changes for Ruby 3.0
+- Make sure it will not break anything when it's merged into the default branch
+
## `undercover` RSpec test
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74859) in GitLab 14.6.
@@ -292,20 +305,20 @@ fail.
### Troubleshooting `rspec:undercoverage` failures
The `rspec:undercoverage` job has [known bugs](https://gitlab.com/groups/gitlab-org/-/epics/8254)
-that can cause false positive failures. You can locally test coverage locally to determine if it's
+that can cause false positive failures. You can test coverage locally to determine if it's
safe to apply `~"pipeline:skip-undercoverage"`. For example, using `<spec>` as the name of the
test causing the failure:
1. Run `SIMPLECOV=1 bundle exec rspec <spec>`.
1. Run `scripts/undercoverage`.
-If these commands return `undercover: ✅ No coverage is missing in latest changes` then you can apply `~"pipeline:skip-undercoverage"` to bypass pipeline failures.
+If these commands return `undercover: ✅ No coverage is missing in latest changes` then you can apply `~"pipeline:skip-undercoverage"` to bypass pipeline failures.
## Ruby versions testing
Our test suite runs against Ruby 2 in merge requests and default branch pipelines.
-We do run our test suite against Ruby 3 on 2-hourly scheduled pipelines, as GitLab.com will soon run on Ruby 3.
+We also run our test suite against Ruby 3 on another 2-hourly scheduled pipelines, as GitLab.com will soon run on Ruby 3.
## PostgreSQL versions testing
@@ -318,12 +331,13 @@ We also run our test suite against PG11 upon specific database library changes i
### Current versions testing
-| Where? | PostgreSQL version |
-| ------ | ------------------ |
-| MRs | 12, 11 for DB library changes |
-| `main` (non-scheduled pipelines) | 12, 11 for DB library changes |
-| 2-hourly scheduled pipelines | 12, 11 for DB library changes |
-| `nightly` scheduled pipelines | 12, 11, 13 |
+| Where? | PostgreSQL version | Ruby version |
+| ------ | ------------------ | ------------ |
+| Merge requests | 12 (default version), 11 for DB library changes | 2.7 (default version) |
+| `master` branch commits | 12 (default version), 11 for DB library changes | 2.7 (default version) |
+| `maintenance` scheduled pipelines (every 2 hours at even hour) | 12 (default version), 11 for DB library changes | 2.7 (default version) |
+| `maintenance` scheduled pipelines (every 2 hours at odd hour) | 12 (default version), 11 for DB library changes | 3.0 (set in the schedule variables) |
+| `nightly` scheduled pipelines | 12 (default version), 11, 13 | 2.7 (default version) |
### Long-term plan
@@ -618,7 +632,7 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/yaml_optimizat
| `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`. | |
-| `if-master-schedule-2-hourly` | Matches if the current branch is `master` or `main` and pipeline runs on a 2-hourly schedule. | |
+| `if-master-schedule-maintenance` | Matches if the current branch is `master` or `main` and pipeline runs on a 2-hourly schedule. | |
| `if-master-schedule-nightly` | Matches if the current branch is `master` or `main` and pipeline runs on a nightly schedule. | |
| `if-auto-deploy-branches` | Matches if the current branch is an auto-deploy one. | |
| `if-master-or-tag` | Matches if the pipeline is for the `master` or `main` branch or for a tag. | |
@@ -660,6 +674,7 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/yaml_optimizat
| `code-backstage-patterns` | Combination of `code-patterns` and `backstage-patterns`. |
| `code-qa-patterns` | Combination of `code-patterns` and `qa-patterns`. |
| `code-backstage-qa-patterns` | Combination of `code-patterns`, `backstage-patterns`, and `qa-patterns`. |
+| `static-analysis-patterns` | Only create jobs for Static Analytics configuration-related changes. |
## Performance
@@ -704,7 +719,7 @@ This works well for the following reasons:
- `.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/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:
+1. Only the following jobs, running in 2-hourly `maintenance` 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-rubocop-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
diff --git a/doc/development/product_qualified_lead_guide/index.md b/doc/development/product_qualified_lead_guide/index.md
index 25634876aef..90b8d905264 100644
--- a/doc/development/product_qualified_lead_guide/index.md
+++ b/doc/development/product_qualified_lead_guide/index.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Conversion
+group: Acquisition
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
---
diff --git a/doc/development/rails_initializers.md b/doc/development/rails_initializers.md
index 68f3c07e45a..fca24cf8c01 100644
--- a/doc/development/rails_initializers.md
+++ b/doc/development/rails_initializers.md
@@ -29,12 +29,18 @@ query) from an initializer means that tasks like `db:drop`, and
`db:test:prepare` will fail because an active session prevents the database from
being dropped.
-To help detect when database connections are opened from initializers, we now
-warn in `STDERR`. For example:
+To prevent this, we stop database connections from being opened during
+routes loading. Doing will result in an error:
```shell
-DEPRECATION WARNING: Database connection should not be called during initializers (called from block in <module:HasVariable> at app/models/concerns/ci/has_variable.rb:22)
+RuntimeError:
+ Database connection should not be called during initializers.
+# ./config/initializers/00_connection_logger.rb:15:in `new_client'
+# ./lib/gitlab/database/load_balancing/load_balancer.rb:112:in `block in read_write'
+# ./lib/gitlab/database/load_balancing/load_balancer.rb:184:in `retry_with_backoff'
+# ./lib/gitlab/database/load_balancing/load_balancer.rb:111:in `read_write'
+# ./lib/gitlab/database/load_balancing/connection_proxy.rb:119:in `write_using_load_balancer'
+# ./lib/gitlab/database/load_balancing/connection_proxy.rb:89:in `method_missing'
+# ./config/routes.rb:10:in `block in <main>'
+# ./config/routes.rb:9:in `<main>'
```
-
-If you wish to print out the full backtrace, set the
-`DEBUG_INITIALIZER_CONNECTIONS` environment variable.
diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md
index 13c4bdaedca..c13f1195df3 100644
--- a/doc/development/rake_tasks.md
+++ b/doc/development/rake_tasks.md
@@ -313,11 +313,11 @@ run:
```shell
# Validate all queries
-bundle exec rake gitlab::graphql:validate
+bundle exec rake gitlab:graphql:validate
# Validate one query
-bundle exec rake gitlab::graphql:validate[path/to/query.graphql]
+bundle exec rake gitlab:graphql:validate[path/to/query.graphql]
# Validate a directory
-bundle exec rake gitlab::graphql:validate[path/to/queries]
+bundle exec rake gitlab:graphql:validate[path/to/queries]
```
This prints out a report with an entry for each query, explaining why
@@ -335,11 +335,11 @@ Usage:
```shell
# Analyze all queries
-bundle exec rake gitlab::graphql:analyze
+bundle exec rake gitlab:graphql:analyze
# Analyze one query
-bundle exec rake gitlab::graphql:analyze[path/to/query.graphql]
+bundle exec rake gitlab:graphql:analyze[path/to/query.graphql]
# Analyze a directory
-bundle exec rake gitlab::graphql:analyze[path/to/queries]
+bundle exec rake gitlab:graphql:analyze[path/to/queries]
```
This prints out a report for each query, including the complexity
@@ -393,3 +393,21 @@ The following command combines the intent of [Update GraphQL documentation and s
```shell
bundle exec rake gitlab:graphql:update_all
```
+
+## Update OpenAPI client for Error Tracking feature
+
+NOTE:
+This Rake task needs `docker` to be installed.
+
+To update generated code for OpenAPI client located in
+`vendor/gems/error_tracking_open_api` run the following commands:
+
+```shell
+# Run rake task
+bundle exec rake gems:error_tracking_open_api:generate
+
+# Review and test the changes
+
+# Commit the changes
+git commit -m 'Update ErrorTrackingOpenAPI from OpenAPI definition' vendor/gems/error_tracking_open_api
+```
diff --git a/doc/development/reusing_abstractions.md b/doc/development/reusing_abstractions.md
index ccf82dc6c77..f3eb1ebcc0c 100644
--- a/doc/development/reusing_abstractions.md
+++ b/doc/development/reusing_abstractions.md
@@ -190,6 +190,10 @@ Everything in `app/finders`, typically used for retrieving data from a database.
Finders can not reuse other finders in an attempt to better control the SQL
queries they produce.
+Finders' `execute` method should return `ActiveRecord::Relation`. Exceptions
+can be added to `spec/support/finder_collection_allowlist.yml`.
+See [`#298771`](https://gitlab.com/gitlab-org/gitlab/-/issues/298771) for more details.
+
### Presenters
Everything in `app/presenters`, used for exposing complex data to a Rails view,
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index d8e2352bd93..9048da77071 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -1278,3 +1278,31 @@ This sensitive data must be handled carefully to avoid leaks which could lead to
- Avoid sending credentials in URL parameters, as these can be more easily logged inadvertently during transit.
In the event of credential leak through an MR, issue, or any other medium, [reach out to SIRT team](https://about.gitlab.com/handbook/engineering/security/security-operations/sirt/#-engaging-sirt).
+
+## Serialization
+
+Serialization of active record models can leak sensitive attributes if they are not protected.
+
+Using the [`prevent_from_serialization`](https://gitlab.com/gitlab-org/gitlab/-/blob/d7b85128c56cc3e669f72527d9f9acc36a1da95c/app/models/concerns/sensitive_serializable_hash.rb#L11)
+method protects the attributes when the object is serialized with `serializable_hash`.
+When an attribute is protected with `prevent_from_serialization`, it is not included with
+`serializable_hash`, `to_json`, or `as_json`.
+
+For more guidance on serialization:
+
+- [Why using a serializer is important](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/serializers/README.md#why-using-a-serializer-is-important).
+- Always use [Grape entities](../../ee/development/api_styleguide.md#entities) for the API.
+
+To `serialize` an `ActiveRecord` column:
+
+- You can use `app/serializers`.
+- You cannot use `to_json / as_json`.
+- You cannot use `serialize :some_colum`.
+
+### Serialization example
+
+The following is an example used for the [`TokenAuthenticatable`](https://gitlab.com/gitlab-org/gitlab/-/blob/9b15c6621588fce7a80e0438a39eeea2500fa8cd/app/models/concerns/token_authenticatable.rb#L30) class:
+
+```ruby
+prevent_from_serialization(*strategy.token_fields) if respond_to?(:prevent_from_serialization)
+```
diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md
index 6948eb20e00..3263ba6458e 100644
--- a/doc/development/service_ping/implement.md
+++ b/doc/development/service_ping/implement.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
@@ -830,7 +830,7 @@ However, it has the following limitations:
## Aggregated metrics
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
WARNING:
This feature is intended solely for internal GitLab use.
diff --git a/doc/development/service_ping/index.md b/doc/development/service_ping/index.md
index e776b78b710..cd8af3e9152 100644
--- a/doc/development/service_ping/index.md
+++ b/doc/development/service_ping/index.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
@@ -113,15 +113,15 @@ sequenceDiagram
1. Finally, the timing metadata information that is used for diagnostic purposes is submitted to the Versions application. It consists of a list of metric identifiers and the time it took to calculate the metrics:
- > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37911) in GitLab 15.0 [with a flag(../../user/feature_flags.md), enabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `measure_service_ping_metric_collection`.
-On GitLab.com, this feature is available.
+ > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37911) in GitLab 15.0 [with a flag(../../user/feature_flags.md), enabled by default.
+ > - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/295289) in GitLab 15.2. [Feature flag `measure_service_ping_metric_collection`](https://gitlab.com/gitlab-org/gitlab/-/issues/358128) removed.
```ruby
- {"metadata"=>
- {"metrics"=>
+ {
+ "metadata"=>
+ {
+ "uuid"=>"0000000-0000-0000-0000-000000000000",
+ "metrics"=>
[{"name"=>"version", "time_elapsed"=>1.1811964213848114e-05},
{"name"=>"installation_type", "time_elapsed"=>0.00017242692410945892},
{"name"=>"license_billable_users", "time_elapsed"=>0.009520471096038818},
@@ -133,9 +133,7 @@ On GitLab.com, this feature is available.
{"name"=>"counts.clusters_platforms_user",
"time_elapsed"=>0.06410990096628666},
{"name"=>"counts.clusters_management_project",
- "time_elapsed"=>0.24020783510059118},
- {"name"=>"counts.clusters_integrations_elastic_stack",
- "time_elapsed"=>0.03484998410567641}
+ "time_elapsed"=>0.24020783510059118}
]
}
}
@@ -163,25 +161,6 @@ We also collect metrics specific to [Geo](../../administration/geo/index.md) sec
]
```
-### Enable or disable service ping metadata reporting
-
-Service Ping timing metadata reporting 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(:measure_service_ping_metric_collection)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:measure_service_ping_metric_collection)
-```
-
## Implementing Service Ping
See the [implement Service Ping](implement.md) guide.
@@ -200,6 +179,7 @@ The following is example content of the Service Ping payload.
"recorded_at": "2020-04-17T07:43:54.162+00:00",
"edition": "EEU",
"license_md5": "00000000000000000000000000000000",
+ "license_sha256: "0000000000000000000000000000000000000000000000000000000000000000",
"license_id": null,
"historical_max_users": 999,
"licensee": {
diff --git a/doc/development/service_ping/metrics_dictionary.md b/doc/development/service_ping/metrics_dictionary.md
index fee3bb571c2..2adba5d8095 100644
--- a/doc/development/service_ping/metrics_dictionary.md
+++ b/doc/development/service_ping/metrics_dictionary.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
@@ -207,7 +207,7 @@ description: GitLab instance unique identifier
product_category: collection
product_section: growth
product_stage: growth
-product_group: group::product intelligence
+product_group: product_intelligence
value_type: string
status: active
milestone: 9.1
@@ -240,15 +240,17 @@ The generator takes a list of key paths and 3 options as arguments. It creates m
```shell
bundle exec rails generate gitlab:usage_metric_definition counts.issues --dir=7d --class_name=CountIssues
-create config/metrics/counts_7d/issues.yml
+// Creates 1 file
+// create config/metrics/counts_7d/issues.yml
```
**Multiple metrics example**
```shell
bundle exec rails generate gitlab:usage_metric_definition counts.issues counts.users --dir=7d --class_name=CountUsersCreatingIssues
-create config/metrics/counts_7d/issues.yml
-create config/metrics/counts_7d/users.yml
+// Creates 2 files
+// create config/metrics/counts_7d/issues.yml
+// create config/metrics/counts_7d/users.yml
```
NOTE:
@@ -256,7 +258,8 @@ 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 --class_name=CountUsersCreatingIssues
-create ee/config/metrics/counts_7d/issues.yml
+// Creates 1 file
+// create ee/config/metrics/counts_7d/issues.yml
```
### Metrics added dynamic to Service Ping payload
@@ -265,20 +268,35 @@ The [Redis HLL metrics](implement.md#known-events-are-added-automatically-in-ser
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 is `redis_hll_counters`, and creates two metric definitions for weekly and monthly time frames:
+The generator takes `category` and `events` arguments, as the root key is `redis_hll_counters`, and creates two metric definitions for each of the events (for weekly and monthly time frames):
+
+**Single metric example**
```shell
bundle exec rails generate gitlab:usage_metric_definition:redis_hll issues count_users_closing_issues
-create config/metrics/counts_7d/count_users_closing_issues_weekly.yml
-create config/metrics/counts_28d/count_users_closing_issues_monthly.yml
+// Creates 2 files
+// create config/metrics/counts_7d/count_users_closing_issues_weekly.yml
+// create config/metrics/counts_28d/count_users_closing_issues_monthly.yml
+```
+
+**Multiple metrics example**
+
+```shell
+bundle exec rails generate gitlab:usage_metric_definition:redis_hll issues count_users_closing_issues count_users_reopening_issues
+// Creates 4 files
+// create config/metrics/counts_7d/count_users_closing_issues_weekly.yml
+// create config/metrics/counts_28d/count_users_closing_issues_monthly.yml
+// create config/metrics/counts_7d/count_users_reopening_issues_weekly.yml
+// create config/metrics/counts_28d/count_users_reopening_issues_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
+// Creates 2 files
+// create config/metrics/counts_7d/i_closed_weekly.yml
+// create config/metrics/counts_28d/i_closed_monthly.yml
```
## Metrics Dictionary
diff --git a/doc/development/service_ping/metrics_instrumentation.md b/doc/development/service_ping/metrics_instrumentation.md
index 4fd03eea84f..e1c51713f3c 100644
--- a/doc/development/service_ping/metrics_instrumentation.md
+++ b/doc/development/service_ping/metrics_instrumentation.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/service_ping/metrics_lifecycle.md b/doc/development/service_ping/metrics_lifecycle.md
index c9cc9a4f2d2..28f77b6f587 100644
--- a/doc/development/service_ping/metrics_lifecycle.md
+++ b/doc/development/service_ping/metrics_lifecycle.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/service_ping/performance_indicator_metrics.md b/doc/development/service_ping/performance_indicator_metrics.md
index 48c123171fa..bdd4c319d41 100644
--- a/doc/development/service_ping/performance_indicator_metrics.md
+++ b/doc/development/service_ping/performance_indicator_metrics.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/service_ping/review_guidelines.md b/doc/development/service_ping/review_guidelines.md
index ee2d8f4f4a1..4ce5b2d577c 100644
--- a/doc/development/service_ping/review_guidelines.md
+++ b/doc/development/service_ping/review_guidelines.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/service_ping/troubleshooting.md b/doc/development/service_ping/troubleshooting.md
index 2764ef41f98..29ab334f867 100644
--- a/doc/development/service_ping/troubleshooting.md
+++ b/doc/development/service_ping/troubleshooting.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
@@ -26,6 +26,16 @@ You can use [this query](https://gitlab.com/gitlab-org/gitlab/-/issues/347298#no
For results about an investigation conducted into an unexpected drop in Service ping Payload events volume, see [this issue](https://gitlab.com/gitlab-data/analytics/-/issues/11071).
+### Troubleshoot VersionApp layer
+
+Check if the [export jobs](https://gitlab.com/gitlab-services/version-gitlab-com#data-export-using-pipeline-schedules) are successful.
+
+Check [Service Ping errors](https://app.periscopedata.com/app/gitlab/968489/Product-Intelligence---Service-Ping-Health?widget=14609989&udv=0) in the [Service Ping Health Dahsboard](https://app.periscopedata.com/app/gitlab/968489/Product-Intelligence---Service-Ping-Health).
+
+### Troubleshoot Google Storage layer
+
+Check if the files are present in [Google Storage](https://console.cloud.google.com/storage/browser/cloudsql-gs-production-efd5e8-cloudsql-exports;tab=objects?project=gs-production-efd5e8&prefix=&forceOnObjectsSortingFiltering=false).
+
### Troubleshoot the data warehouse layer
Reach out to the [Data team](https://about.gitlab.com/handbook/business-technology/data-team/) to ask about current state of data warehouse. On their handbook page there is a [section with contact details](https://about.gitlab.com/handbook/business-technology/data-team/#how-to-connect-with-us).
diff --git a/doc/development/service_ping/usage_data.md b/doc/development/service_ping/usage_data.md
index a25ad5f62be..a659bbf2265 100644
--- a/doc/development/service_ping/usage_data.md
+++ b/doc/development/service_ping/usage_data.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/sidekiq/compatibility_across_updates.md b/doc/development/sidekiq/compatibility_across_updates.md
index 35f4b88351e..96a3573d11a 100644
--- a/doc/development/sidekiq/compatibility_across_updates.md
+++ b/doc/development/sidekiq/compatibility_across_updates.md
@@ -142,7 +142,10 @@ When renaming queues, use the `sidekiq_queue_migrate` helper migration method
in a **post-deployment migration**:
```ruby
-class MigrateTheRenamedSidekiqQueue < Gitlab::Database::Migration[1.0]
+class MigrateTheRenamedSidekiqQueue < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+ disable_ddl_transaction!
+
def up
sidekiq_queue_migrate 'old_queue_name', to: 'new_queue_name'
end
diff --git a/doc/development/snowplow/event_dictionary_guide.md b/doc/development/snowplow/event_dictionary_guide.md
index 5ae81c3426d..7980395b1a9 100644
--- a/doc/development/snowplow/event_dictionary_guide.md
+++ b/doc/development/snowplow/event_dictionary_guide.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/snowplow/implementation.md b/doc/development/snowplow/implementation.md
index 88fb1d5cfe4..f8e37aee1e0 100644
--- a/doc/development/snowplow/implementation.md
+++ b/doc/development/snowplow/implementation.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
@@ -464,7 +464,7 @@ Page titles are hardcoded as `GitLab` for the same reason.
#### Snowplow Inspector Chrome Extension
-Snowplow Inspector Chrome Extension is a browser extension for testing frontend events. This works in production, staging, and local development environments.
+Snowplow Inspector Chrome Extension is a browser extension for testing frontend events. This works in production, staging, and local development environments.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For a video tutorial, see the [Snowplow plugin walk through](https://www.youtube.com/watch?v=g4rqnIZ1Mb4).
@@ -505,16 +505,22 @@ To install and run Snowplow Micro, complete these steps to modify the
1. Set the environment variable to tell the GDK to use Snowplow Micro in development. This overrides two `application_settings` options:
- `snowplow_enabled` setting will instead return `true` from `Gitlab::Tracking.enabled?`
- - `snowplow_collector_hostname` setting will instead always return `localhost:9090` (or whatever is set for `SNOWPLOW_MICRO_URI`) from `Gitlab::Tracking.collector_hostname`.
+ - `snowplow_collector_hostname` setting will instead always return `localhost:9090` (or whatever port is set for `snowplow_micro.port` GDK setting) from `Gitlab::Tracking.collector_hostname`.
```shell
- export SNOWPLOW_MICRO_ENABLE=1
+ gdk config set snowplow_micro.enabled true
```
- Optionally, you can set the URI for you Snowplow Micro instance as well (the default value is `http://localhost:9090`):
+ Optionally, you can set the port for you Snowplow Micro instance as well (the default value is `9090`):
```shell
- export SNOWPLOW_MICRO_URI=https://127.0.0.1:8080
+ gdk config set snowplow_micro.port 8080
+ ```
+
+1. Regenerate the project YAML config:
+
+ ```shell
+ gdk reconfigure
```
1. Restart GDK:
diff --git a/doc/development/snowplow/index.md b/doc/development/snowplow/index.md
index d6a7b900629..155ce87b8d9 100644
--- a/doc/development/snowplow/index.md
+++ b/doc/development/snowplow/index.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/snowplow/infrastructure.md b/doc/development/snowplow/infrastructure.md
index 28541874e98..758c850e89f 100644
--- a/doc/development/snowplow/infrastructure.md
+++ b/doc/development/snowplow/infrastructure.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/snowplow/review_guidelines.md b/doc/development/snowplow/review_guidelines.md
index 0359636380b..673166452b7 100644
--- a/doc/development/snowplow/review_guidelines.md
+++ b/doc/development/snowplow/review_guidelines.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/snowplow/schemas.md b/doc/development/snowplow/schemas.md
index 4066151600d..799f8335000 100644
--- a/doc/development/snowplow/schemas.md
+++ b/doc/development/snowplow/schemas.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/snowplow/troubleshooting.md b/doc/development/snowplow/troubleshooting.md
index 2a6db80a6f2..42a433e6a94 100644
--- a/doc/development/snowplow/troubleshooting.md
+++ b/doc/development/snowplow/troubleshooting.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/development/stage_group_dashboards.md b/doc/development/stage_group_dashboards.md
deleted file mode 100644
index 8e3e6982430..00000000000
--- a/doc/development/stage_group_dashboards.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'stage_group_observability/index.md'
-remove_date: '2022-06-15'
----
-
-This document was moved to [another location](stage_group_observability/index.md).
-
-<!-- This redirect file can be deleted after <2022-06-15>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index eda1c8c3d10..ea36214f6b7 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -155,16 +155,6 @@ FPROF=1 bin/rspec spec/[path]/[to]/[spec].rb
FPROF=flamegraph bin/rspec spec/[path]/[to]/[spec].rb
```
-A common change is to use [`let_it_be`](#common-test-setup):
-
-```ruby
-# Old
-let(:project) { create(:project) }
-
-# New
-let_it_be(:project) { create(:project) }
-```
-
A common cause of a large number of created factories is [factory cascades](https://github.com/test-prof/test-prof/blob/master/docs/profilers/factory_prof.md#factory-flamegraph), which result when factories create and recreate associations.
They can be identified by a noticeable difference between `total time` and `top-level time` numbers:
@@ -215,6 +205,56 @@ In this case, the `total time` and `top-level time` numbers match more closely:
8 8 0.0477s 0.0477s 0.0477s namespace
```
+##### Let's talk about `let`
+
+There are various ways to create objects and store them in variables in your tests. They are, from least efficient to most efficient:
+
+- `let!` creates the object before each example runs. It also creates a new object for every example. You should only use this option if you need to create a clean object before each example without explicitly referring to it.
+- `let` lazily creates the object. It isn't created until the object is called. `let` is generally inefficient as it creates a new object for every example. `let` is fine for simple values. However, more efficient variants of `let` are best when dealing with database models such as factories.
+- `let_it_be_with_refind` works similar to `let_it_be_with_reload`, but the [former calls `ActiveRecord::Base#find`](https://github.com/test-prof/test-prof/blob/936b29f87b36f88a134e064aa6d8ade143ae7a13/lib/test_prof/ext/active_record_refind.rb#L15) instead of `ActiveRecord::Base#reload`. `reload` is usually faster than `refind`.
+- `let_it_be_with_reload` creates an object one time for all examples in the same context, but after each example, the database changes are rolled back, and `object.reload` will be called to restore the object to its original state. This means you can make changes to the object before or during an example. However, there are cases where [state leaks across other models](https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#state-leakage-detection) can occur. In these cases, `let` may be an easier option, especially if only a few examples exist.
+- `let_it_be` creates an immutable object one time for all of the examples in the same context. This is a great alternative to `let` and `let!` for objects that do not need to change from one example to another. Using `let_it_be` can dramatically speed up tests that create database models. See <https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#let-it-be> for more details and examples.
+
+`let_it_be` is the most optimized option since it instantiates an object once and does not change it. If you find yourself needing `let` instead of `let_it_be`, try `let_it_be_with_reload`.
+
+```ruby
+# Old
+let(:project) { create(:project) }
+
+# New
+let_it_be(:project) { create(:project) }
+
+# If you need to expect changes to the object in the test
+let_it_be_with_reload(:project) { create(:project) }
+```
+
+Here is an example of when `let_it_be` cannot be used, but `let_it_be_with_reload` allows for more efficiency than `let`:
+
+```ruby
+let_it_be(:user) { create(:user) }
+let_it_be_with_reload(:project) { create(:project) } # The test will fail if `let_it_be` is used
+
+context 'with a developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'project has an owner and a developer' do
+ expect(project.members.map(&:access_level)).to match_array([Gitlab::Access::OWNER, Gitlab::Access::DEVELOPER])
+ end
+end
+
+context 'with a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'project has an owner and a maintainer' do
+ expect(project.members.map(&:access_level)).to match_array([Gitlab::Access::OWNER, Gitlab::Access::MAINTAINER])
+ end
+end
+```
+
#### Stubbing methods within factories
You should avoid using `allow(object).to receive(:method)` in factories, as this makes the factory unable to be used with `let_it_be`.
diff --git a/doc/development/testing_guide/contract/consumer_tests.md b/doc/development/testing_guide/contract/consumer_tests.md
index b4d6882a655..df7c9ee0abd 100644
--- a/doc/development/testing_guide/contract/consumer_tests.md
+++ b/doc/development/testing_guide/contract/consumer_tests.md
@@ -10,13 +10,15 @@ This tutorial guides you through writing a consumer test from scratch. To start,
## Create the skeleton
-Start by creating the skeleton of a consumer test. Create a file under `spec/contracts/consumer/specs` called `discussions.spec.js`.
+Start by creating the skeleton of a consumer test. Create a file under `spec/contracts/consumer/specs/project/merge_request` called `discussions.spec.js`.
Then, populate it with the following function and parameters:
- [`pactWith`](#the-pactwith-function)
- [`PactOptions`](#the-pactoptions-parameter)
- [`PactFn`](#the-pactfn-parameter)
+To learn more about how the contract test directory is structured, see the contract testing [test suite folder structure](index.md#test-suite-folder-structure).
+
### The `pactWith` function
The Pact consumer test is defined through the `pactWith` function that takes `PactOptions` and the `PactFn`.
@@ -36,15 +38,17 @@ const { pactWith } = require('jest-pact');
pactWith(
{
- consumer: 'Merge Request Page',
+ consumer: 'MergeRequest#show',
provider: 'Merge Request Discussions Endpoint',
log: '../logs/consumer.log',
- dir: '../contracts',
+ dir: '../contracts/project/merge_request/show',
},
PactFn
);
```
+To learn more about how to name the consumers and providers, see contract testing [naming conventions](index.md#naming-conventions).
+
### The `PactFn` parameter
The `PactFn` is where your tests are defined. This is where you set up the mock provider and where you can use the standard Jest methods like [`Jest.describe`](https://jestjs.io/docs/api#describename-fn), [`Jest.beforeEach`](https://jestjs.io/docs/api#beforeeachfn-timeout), and [`Jest.it`](https://jestjs.io/docs/api#testname-fn-timeout). For more information, see [https://jestjs.io/docs/api](https://jestjs.io/docs/api).
@@ -54,20 +58,20 @@ const { pactWith } = require('jest-pact');
pactWith(
{
- consumer: 'Merge Request Page',
+ consumer: 'MergeRequest#show',
provider: 'Merge Request Discussions Endpoint',
log: '../logs/consumer.log',
dir: '../contracts',
},
(provider) => {
- describe('Discussions Endpoint', () => {
+ describe('Merge Request Discussions Endpoint', () => {
beforeEach(() => {
-
+
});
it('return a successful body', () => {
-
+
});
});
},
@@ -93,14 +97,14 @@ const { Matchers } = require('@pact-foundation/pact');
pactWith(
{
- consumer: 'Merge Request Page',
+ consumer: 'MergeRequest#show',
provider: 'Merge Request Discussions Endpoint',
log: '../logs/consumer.log',
- dir: '../contracts',
+ dir: '../contracts/project/merge_request/show',
},
(provider) => {
- describe('Discussions Endpoint', () => {
+ describe('Merge Request Discussions Endpoint', () => {
beforeEach(() => {
const interaction = {
state: 'a merge request with discussions exists',
@@ -144,7 +148,7 @@ Notice how we use `Matchers` in the `body` of the expected response. This allows
After the mock provider is set up, you can write the test. For this test, you make a request and expect a particular response.
-First, set up the client that makes the API request. To do that, either create or find an existing file under `spec/contracts/consumer/endpoints` and add the following API request.
+First, set up the client that makes the API request. To do that, create `spec/contracts/consumer/endpoints/project/merge_requests.js` and add the following API request.
```javascript
const axios = require('axios');
@@ -169,18 +173,18 @@ After that's set up, import it to the test file and call it to make the request.
const { pactWith } = require('jest-pact');
const { Matchers } = require('@pact-foundation/pact');
-const { getDiscussions } = require('../endpoints/merge_requests');
+const { getDiscussions } = require('../endpoints/project/merge_requests');
pactWith(
{
- consumer: 'Merge Request Page',
+ consumer: 'MergeRequest#show',
provider: 'Merge Request Discussions Endpoint',
log: '../logs/consumer.log',
- dir: '../contracts',
+ dir: '../contracts/project/merge_request/show',
},
(provider) => {
- describe('Discussions Endpoint', () => {
+ describe('Merge Request Discussions Endpoint', () => {
beforeEach(() => {
const interaction = {
state: 'a merge request with discussions exists',
@@ -230,7 +234,7 @@ There we have it! The consumer test is now set up. You can now try [running this
As you may have noticed, the request and response definitions can get large. This results in the test being difficult to read, with a lot of scrolling to find what you want. You can make the test easier to read by extracting these out to a `fixture`.
-Create a file under `spec/contracts/consumer/fixtures` called `discussions.fixture.js`. You place the `request` and `response` definitions here.
+Create a file under `spec/contracts/consumer/fixtures/project/merge_request` called `discussions.fixture.js` where you will place the `request` and `response` definitions.
```javascript
const { Matchers } = require('@pact-foundation/pact');
@@ -274,18 +278,18 @@ With all of that moved to the `fixture`, you can simplify the test to the follow
const { pactWith } = require('jest-pact');
const { Discussions } = require('../fixtures/discussions.fixture');
-const { getDiscussions } = require('../endpoints/merge_requests');
+const { getDiscussions } = require('../endpoints/project/merge_requests');
pactWith(
{
- consumer: 'Merge Request Page',
+ consumer: 'MergeRequest#show',
provider: 'Merge Request Discussions Endpoint',
log: '../logs/consumer.log',
- dir: '../contracts',
+ dir: '../contracts/project/merge_request/show',
},
(provider) => {
- describe('Discussions Endpoint', () => {
+ describe('Merge Request Discussions Endpoint', () => {
beforeEach(() => {
const interaction = {
state: 'a merge request with discussions exists',
diff --git a/doc/development/testing_guide/contract/index.md b/doc/development/testing_guide/contract/index.md
index 6556bd85624..8e12eea2874 100644
--- a/doc/development/testing_guide/contract/index.md
+++ b/doc/development/testing_guide/contract/index.md
@@ -37,3 +37,42 @@ rake contracts:mr:pact:verify:discussions # Verify provider against the
rake contracts:mr:pact:verify:metadata # Verify provider against the consumer pacts for metadata
rake contracts:mr:test:merge_request[contract_mr] # Run all merge request contract tests
```
+
+## Test suite folder structure and naming conventions
+
+To keep the consumer and provider test suite organized and maintainable, it's important that tests are organized, also that consumers and providers are named consistently. Therefore, it's important to adhere to the following conventions.
+
+### Test suite folder structure
+
+Having an organized and sensible folder structure for the test suite makes it easier to find relevant files when reviewing, debugging, or introducing tests.
+
+#### Consumer tests
+
+The consumer tests are grouped according to the different pages in the application. Each file contains various types of requests found in a page. As such, the consumer test files are named using the Rails standards of how pages are referenced. For example, the project pipelines page would be the `Project::Pipeline#index` page so the equivalent consumer test would be located in `consumer/specs/project/pipelines/index.spec.js`.
+
+When defining the location to output the contract generated by the test, we want to follow the same file structure which would be `contracts/project/pipelines/` for this example. This is the structure in `consumer/endpoints` and `consumer/fixtures` as well.
+
+#### Provider tests
+
+The provider tests are grouped similarly to our controllers. Each of these tests contains various tests for an API endpoint. For example, the API endpoint to get a list of pipelines for a project would be located in `provider/pact_helpers/project/pipelines/get_list_project_pipelines_helper.rb`. The provider states are structured the same way.
+
+### Naming conventions
+
+When writing the consumer and provider tests, there are parts where a name is required for the consumer and provider. Since there are no restrictions imposed by Pact on how these should be named, a naming convention is important to keep it easy for us to figure out which consumer and provider tests are involved during debugging. Pact also uses the consumer and provider names to generate the generated contracts in the `#{consumer_name}-#{provider_name}` format.
+
+#### Consumer naming
+
+As mentioned in the [folder structure section](#consumer-tests), consumer tests are grouped according to the different pages in the application. As such, consumer names should follow the same naming format using the Rails standard. For example, the consumer test for `Project::Pipeline#index` would be `ProjectPipeline#index` as the consumer name. Since Pact uses this name to name the contracts it generates, the colons (`::`) are dropped as colons are not valid characters in file names.
+
+#### Provider naming
+
+These are the API endpoints that provides the data to the consumer so they are simply named according to the API endpoint they pertain to. Be mindful that this name is as descriptive as possible. For example, if we're writing a test for the `GET /groups/:id/projects` endpoint, we don't want to simply name it "Projects endpoint" as there is a `GET /projects` endpoint as well that also fetches a list of projects the user has access to across all of GitLab. An easy way to name them is by checking out our [API documentation](../../../api/api_resources.md) and naming it the same way it is named in there. So the [`GET /groups/:id/projects`](../../../api/groups.md#list-a-groups-projects) would be called `List a group’s projects` and [`GET /projects`](../../../api/projects.md#list-all-projects) would be called `List all projects`. Subsequently, the test files are named `list_a_groups_projects_helper.rb` and `list_all_projects_helper.rb` respectively.
+
+There are some cases where the provider being tested may not be documented so, in those cases, fall back to choosing a name that is as descriptive as possible to ensure it's easy to tell what the provider is for.
+
+#### Conventions summary
+
+| Tests | Folder structure | Naming convention |
+| ----- | ---------------- | ----------------- |
+| Consumer Test | Follows the Rails reference standards. For example, `Project::Pipeline#index` would be `consumer/specs/project/pipelines/index.spec.js` | Follows the Rails naming standard. For example, `Project::Pipeline#index` would be `ProjectPipeline#index` |
+| Provider Test | Grouped like the Rails controllers. For example, [`List project pipelines` API endpoint](../../../api/pipelines.md#list-project-pipelines) would be `provider/pact_helpers/project/pipelines/provider/pact_helpers/project/pipelines/get_list_project_pipelines_helper.rb` | Follows the API documentation naming scheme. For example, [`GET /projects/:id/pipelines`](../../../api/pipelines.md#list-project-pipelines) would be called `List project pipelines`. |
diff --git a/doc/development/testing_guide/contract/provider_tests.md b/doc/development/testing_guide/contract/provider_tests.md
index 0da5bcb4aef..92ac4c4ed71 100644
--- a/doc/development/testing_guide/contract/provider_tests.md
+++ b/doc/development/testing_guide/contract/provider_tests.md
@@ -6,23 +6,25 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Writing provider tests
-This tutorial guides you through writing a provider test from scratch. It is a continuation of the [consumer test tutorial](consumer_tests.md). To start, the provider tests are written using [`pact-ruby`](https://github.com/pact-foundation/pact-ruby). In this tutorial, you write a provider test that addresses the contract generated by `discussions.spec.js`.
+This tutorial guides you through writing a provider test from scratch. It is a continuation of the [consumer test tutorial](consumer_tests.md). To start, the provider tests are written using [`pact-ruby`](https://github.com/pact-foundation/pact-ruby). In this tutorial, you write a provider test that addresses the contract generated by `discussions.spec.js`. As Pact is a consumer-driven testing tool, this tutorial assumes that there is an existing consumer test that had already generated a contract for us to work with.
## Create the skeleton
-Provider tests are quite simple. The goal is to set up the test data and then link that with the corresponding contract. Start by creating a file called `discussions_helper.rb` under `spec/contracts/provider/specs`. Note that the files are called `helpers` to match how they are called by Pact in the Rake tasks, which are set up at the end of this tutorial.
+Provider tests are quite simple. The goal is to set up the test data and then link that with the corresponding contract. Start by creating a file called `discussions_helper.rb` under `spec/contracts/provider/pact_helpers/project/merge_request`. Note that the files are called `helpers` to match how they are called by Pact in the Rake tasks, which are set up at the end of this tutorial.
+
+To learn more about how the contract test directory is structured, see the contract testing [test suite folder structure](index.md#test-suite-folder-structure).
### The `service_provider` block
The `service_provider` block is where the provider test is defined. For this block, put in a description of the service provider. Name it exactly as it is called in the contracts that are derived from the consumer tests.
```ruby
-require_relative '../spec_helper'
+require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
Pact.service_provider 'Merge Request Discussions Endpoint' do
-
+
end
end
end
@@ -33,33 +35,35 @@ end
The `honours_pact_with` block describes which consumer this provider test is addressing. Similar to the `service_provider` block, name this exactly the same as it's called in the contracts that are derived from the consumer tests.
```ruby
-require_relative '../spec_helper'
+require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
Pact.service_provider 'Merge Request Discussions Endpoint' do
- honours_pact_with 'Merge Request Page' do
-
+ honours_pact_with 'MergeRequest#show' do
+
end
end
end
end
```
+To learn more about how to name the consumers and providers, see contract testing [naming conventions](index.md#naming-conventions).
+
## Configure the test app
For the provider tests to verify the contracts, you must hook it up to a test app that makes the actual request and return a response to verify against the contract. To do this, configure the `app` the test uses as `Environment::Test.app`, which is defined in [`spec/contracts/provider/environments/test.rb`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/contracts/provider/environments/test.rb).
```ruby
-require_relative '../spec_helper'
+require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
Pact.service_provider 'Merge Request Discussions Endpoint' do
app { Environment::Test.app }
-
- honours_pact_with 'Merge Request Page' do
-
+
+ honours_pact_with 'MergeRequest#show' do
+
end
end
end
@@ -71,15 +75,15 @@ end
Now that the test app is configured, all that is left is to define which contract this provider test is verifying. To do this, set the `pact_uri`.
```ruby
-require_relative '../spec_helper'
+require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
Pact.service_provider 'Merge Request Discussions Endpoint' do
app { Environment::Test.app }
-
- honours_pact_with 'Merge Request Page' do
- pact_uri '../contracts/merge_request_page-merge_request_discussions_endpoint.json'
+
+ honours_pact_with 'MergeRequest#show' do
+ pact_uri '../contracts/project/merge_request/show/mergerequest#show-merge_request_discussions_endpoint.json'
end
end
end
@@ -95,8 +99,8 @@ Under the `contracts:mr` namespace, introduce the Rake task to run this new test
```ruby
Pact::VerificationTask.new(:discussions) do |pact|
pact.uri(
- "#{contracts}/contracts/merge_request_page-merge_request_discussions_endpoint.json",
- pact_helper: "#{provider}/specs/discussions_helper.rb"
+ "#{contracts}/contracts/project/merge_request/show/merge_request#show-merge_request_discussions_endpoint.json",
+ pact_helper: "#{provider}/pact_helpers/project/merge_request/discussions_helper.rb"
)
end
```
@@ -109,7 +113,7 @@ As the last step, create the test data that allows the provider test to return t
You can read more about [provider states](https://docs.pact.io/implementation_guides/ruby/provider_states). We can do global provider states but for this tutorial, the provider state is for one specific `state`.
-To create the test data, create `discussions_state.rb` under `spec/contracts/provider/states`. As a quick aside, make sure to also import this state file in the `discussions_helper.rb` file.
+To create the test data, create `discussions_state.rb` under `spec/contracts/provider/states/project/merge_request`. Be sure to also import this state file in the `discussions_helper.rb` file.
### Default user in `spec/contracts/provider/spec_helper.rb`
@@ -118,10 +122,13 @@ Before you create the test data, note that a default user is created in the [`sp
```ruby
RSpec.configure do |config|
config.include Devise::Test::IntegrationHelpers
+ config.include FactoryBot::Syntax::Methods
+
config.before do
- user = FactoryBot.create(:user, name: "Contract Test").tap do |user|
+ user = create(:user, name: Provider::UsersHelper::CONTRACT_USER_NAME).tap do |user|
user.current_sign_in_at = Time.current
end
+
sign_in user
end
end
@@ -134,7 +141,7 @@ Any further modifications to the user that's needed can be done through the indi
In the state file, you must define which consumer this provider state is for. You can do that with `provider_states_for`. Make sure that the `name` provided matches the name defined for the consumer.
```ruby
-Pact.provider_states_for 'Merge Request Page' do
+Pact.provider_states_for 'MergeRequest#show' do
end
```
@@ -143,7 +150,7 @@ end
In the `provider_states_for` block, you then define the state the test data is for. These states are also defined in the consumer test. In this case, there is a `'a merge request with discussions exists'` state.
```ruby
-Pact.provider_states_for "Merge Request Page" do
+Pact.provider_states_for "MergeRequest#show" do
provider_state "a merge request with discussions exists" do
end
@@ -155,7 +162,7 @@ end
This is where you define the test data creation steps. Use `FactoryBot` to create the data. As you create the test data, you can keep [running the provider test](index.md#run-the-provider-tests) to check on the status of the test and figure out what else is missing in your data setup.
```ruby
-Pact.provider_states_for "Merge Request Page" do
+Pact.provider_states_for "MergeRequest#show" do
provider_state "a merge request with discussions exists" do
set_up do
user = User.find_by(name: Provider::UsersHelper::CONTRACT_USER_NAME)
@@ -172,6 +179,28 @@ Pact.provider_states_for "Merge Request Page" do
end
```
-Note the `Provider::UsersHelper::CONTRACT_USER_NAME` here to fetch a user is a user that is from the [`spec_helper`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/contracts/provider/spec_helper.rb) that sets up a user before any of these tests run.
+## Using the test data
+
+Now that the provider state file is created, you need to import the state file to the provider test.
+
+```ruby
+# frozen_string_literal: true
+
+require_relative '../../../spec_helper'
+require_relative '../../../states/project/merge_request/discussions_state'
+
+module Provider
+ module DiscussionsHelper
+ Pact.service_provider "/merge_request/discussions" do
+ app { Environments::Test.app }
+
+ honours_pact_with 'Merge Request#show' do
+ pact_uri '../contracts/project/merge_request/show/merge_request#show-merge_request_discussions_endpoint.json'
+ end
+ end
+ end
+end
+
+```
-And with that, the provider tests for `discussion_helper.rb` should now pass with this.
+And there we have it. The provider test for `discussions_helper.rb` should now pass with this.
diff --git a/doc/development/testing_guide/end_to_end/best_practices.md b/doc/development/testing_guide/end_to_end/best_practices.md
index 85f8beeacad..00b843ffdbe 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -220,7 +220,7 @@ For example, if you encapsulate some actions and expectations in a private metho
it "has Owner role with Owner permissions" do
Page::Dashboard::Projects.perform do |projects|
projects.filter_by_name(project.name)
-
+
expect(projects).to have_project_with_access_role(project.name, 'Owner')
end
diff --git a/doc/development/testing_guide/end_to_end/index.md b/doc/development/testing_guide/end_to_end/index.md
index 9730115fd9f..06359d612ad 100644
--- a/doc/development/testing_guide/end_to_end/index.md
+++ b/doc/development/testing_guide/end_to_end/index.md
@@ -174,7 +174,7 @@ See [Review Apps](../review_apps.md) for more details about Review Apps.
To run tests in parallel on CI, the [Knapsack](https://github.com/KnapsackPro/knapsack)
gem is used. Knapsack reports are generated automatically and stored in the `GCS` bucket
-`knapsack-reports` in the `gitlab-qa-resources` project. The [`KnapsackReport`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/qa/qa/tools/knapsack_report.rb)
+`knapsack-reports` in the `gitlab-qa-resources` project. The [`KnapsackReport`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/qa/qa/support/knapsack_report.rb)
helper handles automated report generation and upload.
## Test metrics
diff --git a/doc/development/testing_guide/end_to_end/resources.md b/doc/development/testing_guide/end_to_end/resources.md
index dacc428aec6..a519d1ecb47 100644
--- a/doc/development/testing_guide/end_to_end/resources.md
+++ b/doc/development/testing_guide/end_to_end/resources.md
@@ -568,6 +568,16 @@ def unique_identifiers
end
```
+### Resources cleanup
+
+We have a mechanism to [collect](https://gitlab.com/gitlab-org/gitlab/-/blob/44345381e89d6bbd440f7b4c680d03e8b75b86de/qa/qa/tools/test_resource_data_processor.rb#L32)
+all resources created during test executions, and another to [handle](https://gitlab.com/gitlab-org/gitlab/-/blob/44345381e89d6bbd440f7b4c680d03e8b75b86de/qa/qa/tools/test_resources_handler.rb#L44)
+these resources. On [dotcom environments](https://about.gitlab.com/handbook/engineering/infrastructure/environments/#environments), after a test suite finishes in the [QA pipelines](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#scheduled-qa-test-pipelines), resources from all passing test are
+automatically deleted in the same pipeline run. Resources from all failed tests are reserved for investigation,
+and won't be deleted until the following Saturday by a scheduled pipeline. When introducing new resources, please
+also make sure to add any resource that cannot be deleted to the [IGNORED_RESOURCES](https://gitlab.com/gitlab-org/gitlab/-/blob/44345381e89d6bbd440f7b4c680d03e8b75b86de/qa/qa/tools/test_resources_handler.rb#L29)
+list.
+
## Where to ask for help?
If you need more information, ask for help on `#quality` channel on Slack
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index f1083c23406..532bb9fcdef 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -45,7 +45,7 @@ Maintainers can elect to use the [process for merging during broken `master`](ht
On every [pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/125315730) in the `qa` stage, the
`review-performance` job is automatically started: this job does basic
browser performance testing using a
-[Sitespeed.io Container](../../user/project/merge_requests/browser_performance_testing.md).
+[Sitespeed.io Container](../../ci/testing/browser_performance_testing.md).
## Sample Data for Review Apps
diff --git a/doc/development/uploads.md b/doc/development/uploads.md
deleted file mode 100644
index 1860f898a26..00000000000
--- a/doc/development/uploads.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'uploads/index.md'
-remove_date: '2022-04-30'
----
-
-This document was moved to [another location](uploads/index.md).
-
-<!-- This redirect file can be deleted after 2022-04-30. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md b/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md
index aef85107cd9..79262e2d0dc 100644
--- a/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md
+++ b/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Aggregated Value Stream Analytics
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335391) in GitLab 14.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335391) in GitLab 14.7.
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
diff --git a/doc/development/workhorse/new_features.md b/doc/development/workhorse/new_features.md
index 3ad15c1de16..5c00903497a 100644
--- a/doc/development/workhorse/new_features.md
+++ b/doc/development/workhorse/new_features.md
@@ -74,5 +74,5 @@ The Workhorse maintainers can help you assess the situation.
- In 2020, `@nolith` presented the talk
["Speed up the monolith. Building a smart reverse proxy in Go"](https://archive.fosdem.org/2020/schedule/event/speedupmonolith/)
at FOSDEM. The talk includes more details on the history of Workhorse and the NFS removal.
-- The [uploads development documentation](../uploads.md) contains the most common
+- The [uploads development documentation](../uploads/index.md) contains the most common
use cases for adding a new type of upload.
diff --git a/doc/gitlab-basics/add-file.md b/doc/gitlab-basics/add-file.md
index 6dd0c608983..af736c11d59 100644
--- a/doc/gitlab-basics/add-file.md
+++ b/doc/gitlab-basics/add-file.md
@@ -29,7 +29,7 @@ to the desired destination:
cd <destination folder>
```
-[Create a new branch](create-branch.md) to add your file into. Submitting changes directly
+[Create a new branch](../tutorials/make_your_first_git_commit.md#create-a-branch-and-make-changes) to add your file into. Submitting changes directly
to the default branch should be avoided unless your project is very small and you're the
only person working on it.
diff --git a/doc/gitlab-basics/create-branch.md b/doc/gitlab-basics/create-branch.md
deleted file mode 100644
index d22ce12f9cd..00000000000
--- a/doc/gitlab-basics/create-branch.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../tutorials/make_your_first_git_commit.md'
-remove_date: '2022-06-26'
----
-
-This document was moved to [another location](../tutorials/make_your_first_git_commit.md).
-
-<!-- This redirect file can be deleted after <YYYY-MM-DD>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/install/aws/eks_clusters_aws.md b/doc/install/aws/eks_clusters_aws.md
index 342740994a1..c939bac888c 100644
--- a/doc/install/aws/eks_clusters_aws.md
+++ b/doc/install/aws/eks_clusters_aws.md
@@ -48,4 +48,4 @@ Read how to [use the GitLab Runner Helm Chart](https://docs.gitlab.com/runner/in
## Runner Cache
-Since the EKS Quick Start provides for EFS provisioning, the best approach is to use EFS for runner caching. Eventually we will publish information on using an S3 bucket for runner caching here.
+Because the EKS Quick Start provides for EFS provisioning, the best approach is to use EFS for runner caching. Eventually we will publish information on using an S3 bucket for runner caching here.
diff --git a/doc/install/aws/gitlab_sre_for_aws.md b/doc/install/aws/gitlab_sre_for_aws.md
index cb7703835fa..2e7de6cf2d4 100644
--- a/doc/install/aws/gitlab_sre_for_aws.md
+++ b/doc/install/aws/gitlab_sre_for_aws.md
@@ -23,15 +23,15 @@ If you would like to understand the underlying rationale on why GitLab had to in
### Gitaly and Praefect elections
-As part of Gitaly cluster consistency, Praefect nodes will occasionally need to vote on what data copy is the most accurate. This requires an uneven number of Praefect nodes to avoid stalemates. This means that for HA, Gitaly and Praefect require a minimum of three nodes.
+As part of Gitaly cluster consistency, Praefect nodes must occasionally vote on what data copy is the most accurate. This requires an uneven number of Praefect nodes to avoid stalemates. This means that for HA, Gitaly and Praefect require a minimum of three nodes.
### Gitaly performance monitoring
-Complete performance metrics should be collected for Gitaly instances for identification of bottlenecks, as they could have to do with disk IO, network IO or memory.
+Complete performance metrics should be collected for Gitaly instances for identification of bottlenecks, as they could have to do with disk IO, network IO, or memory.
### Gitaly performance guidelines
-Gitaly functions as the primary Git Repository Storage in GitLab. However, it's not simply a streaming file server. It also does a lot of demanding computing work, such as preparing and caching Git pack files which informs some of the performance recommendations below.
+Gitaly functions as the primary Git Repository Storage in GitLab. However, it's not a streaming file server. It also does a lot of demanding computing work, such as preparing and caching Git pack files which informs some of the performance recommendations below.
NOTE:
All recommendations are for production configurations, including performance testing. For test configurations, like training or functional testing, you can use less expensive options. However, you should adjust or rebuild if performance is an issue.
@@ -45,7 +45,7 @@ All recommendations are for production configurations, including performance tes
#### CPU and memory recommendations
-- The general GitLab Gitaly node recommendations for CPU and Memory assume relatively even loading across repositories. GPT testing of any non-characteristic repositories and/or SRE monitoring of Gitaly metrics may inform when to choose memory and/or CPU higher than general recommendations.
+- The general GitLab Gitaly node recommendations for CPU and Memory assume relatively even loading across repositories. GitLab Performance Tool (GPT) testing of any non-characteristic repositories and/or SRE monitoring of Gitaly metrics may inform when to choose memory and/or CPU higher than general recommendations.
**To accommodate:**
@@ -54,9 +54,9 @@ All recommendations are for production configurations, including performance tes
#### Disk I/O recommendations
-- Use only SSD storage and the [class of EBS storage](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html) that suites your durability and speed requirements.
+- Use only SSD storage and the [class of Elastic Block Store (EBS) storage](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html) that suites your durability and speed requirements.
- When not using provisioned EBS IO, EBS volume size determines the I/O level, so provisioning volumes that are much larger than needed can be the least expensive way to improve EBS IO.
-- If Gitaly performance monitoring shows signs of disk stress then one of the provisioned IOPs levels can be chosen. Note that EBS IOPs levels also have enhanced durability which may be appealing for some implementations aside from performance considerations.
+- If Gitaly performance monitoring shows signs of disk stress then one of the provisioned IOPs levels can be chosen. EBS IOPs levels also have enhanced durability which may be appealing for some implementations aside from performance considerations.
**To accommodate:**
@@ -66,7 +66,7 @@ All recommendations are for production configurations, including performance tes
#### Network I/O recommendations
-- Use only instance types [from the list of ones that support ENA advanced networking]( https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#instance-type-summary-table) to ensure that cluster replication latency is not due to instance level network I/O bottlenecks.
+- Use only instance types [from the list of ones that support Elastic Network Adapter (ENA) advanced networking](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#instance-type-summary-table) to ensure that cluster replication latency is not due to instance level network I/O bottlenecks.
- Choose instances with sizes with more than 10 Gbps - but only if needed and only when having proven a node level network bottleneck with monitoring and/or stress testing.
**To accommodate:**
@@ -93,4 +93,4 @@ The [AWS GitLab Cloud Native Hybrid on EKS Quick Start](gitlab_hybrid_on_aws.md#
### Gitaly long term management
-Gitaly node disk sizes will need to be monitored and increased to accommodate Git repository growth and Gitaly temporary and caching storage needs. The storage configuration on all nodes should be kept identical.
+Gitaly node disk sizes must be monitored and increased to accommodate Git repository growth and Gitaly temporary and caching storage needs. The storage configuration on all nodes should be kept identical.
diff --git a/doc/install/aws/index.md b/doc/install/aws/index.md
index f54bc979152..1227dd43369 100644
--- a/doc/install/aws/index.md
+++ b/doc/install/aws/index.md
@@ -11,7 +11,7 @@ type: index
GitLab [Reference Architectures](../../administration/reference_architectures/index.md) give qualified and tested guidance on the recommended ways GitLab can be configured to meet the performance requirements of various workloads. Reference Architectures are purpose-designed to be non-implementation specific so they can be extrapolated to as many environments as possible. This generally means they have a highly-granular "machine" to "server role" specification and focus on system elements that impact performance. This is what enables Reference Architectures to be adaptable to the broadest number of supported implementations.
-Implementation patterns are built on the foundational information and testing done for Reference Architectures and allow architects and implementers at GitLab, GitLab Customers, and GitLab Partners to build out deployments with less experimentation and a higher degree of confidence that the results will perform as expected. A more thorough discussion of implementation patterns is below in [Additional details on implementation patterns](#additional-details-on-implementation-patterns).
+Implementation patterns are built on the foundational information and testing done for Reference Architectures and allow architects and implementers at GitLab, GitLab Customers, and GitLab Partners to build out deployments with less experimentation and a higher degree of confidence that the results perform as expected. A more thorough discussion of implementation patterns is below in [Additional details on implementation patterns](#additional-details-on-implementation-patterns).
## AWS Implementation patterns information
@@ -19,7 +19,7 @@ The following are the currently available implementation patterns for GitLab whe
### GitLab Site Reliability Engineering (SRE) for AWS
-[GitLab Site Reliability Engineering (SRE) for AWS](gitlab_sre_for_aws.md) - information for planning, implementing, upgrading and long term management of GitLab instances and runners on AWS.
+[GitLab Site Reliability Engineering (SRE) for AWS](gitlab_sre_for_aws.md) - information for planning, implementing, upgrading, and long term management of GitLab instances and runners on AWS.
### Patterns to Install GitLab Cloud Native Hybrid on AWS EKS (HA)
@@ -33,7 +33,7 @@ The following are the currently available implementation patterns for GitLab whe
[EKS Cluster Provisioning Patterns](eks_clusters_aws.md) - considerations for setting up EKS cluster for runners and for integrating.
-### Patterns for Scaling HA GitLab Runner on AWS EC2 ASG
+### Patterns for Scaling HA GitLab Runner on AWS EC2 Auto Scaling group (ASG)
The following repository is self-contained in regard to enabling this pattern: [GitLab HA Scaling Runner Vending Machine for AWS EC2 ASG](https://gitlab.com/guided-explorations/aws/gitlab-runner-autoscaling-aws-asg/). The [feature list for this implementation pattern](https://gitlab.com/guided-explorations/aws/gitlab-runner-autoscaling-aws-asg/-/blob/main/FEATURES.md) is good to review to understand the complete value it can deliver.
@@ -47,23 +47,23 @@ The following repository is self-contained in regard to enabling this pattern: [
## AWS known issues list
-Known issues are gathered from within GitLab and from customer reported issues. Customers successfully implement GitLab with a variety of "as a Service" components that GitLab has not specifically been designed for, nor has ongoing testing for. While GitLab does take partner technologies very seriously, the highlighting of known issues here is a convenience for implementers and it does not imply that GitLab has targeted compatibility with, nor carries any type of guarantee of running on the partner technology where the issues occur. Please consult individual issues to understand GitLabs stance and plans on any given known issue.
+Known issues are gathered from within GitLab and from customer reported issues. Customers successfully implement GitLab with a variety of "as a Service" components that GitLab has not specifically been designed for, nor has ongoing testing for. While GitLab does take partner technologies very seriously, the highlighting of known issues here is a convenience for implementers and it does not imply that GitLab has targeted compatibility with, nor carries any type of guarantee of running on the partner technology where the issues occur. Consult individual issues to understand the GitLab stance and plans on any given known issue.
See the [GitLab AWS known issues list](https://gitlab.com/gitlab-com/alliances/aws/public-tracker/-/issues?label_name%5B%5D=AWS+Known+Issue) for a complete list.
## Official GitLab releases as AMIs
-GitLab produces AMI images during the regular release process. The AMIs can be used for single instance GitLab installation or, by configuring `/etc/gitlab/gitlab.rb`, can be specialized for specific GitLab service roles (for example a Gitaly server). Older releases remain available and can be used to migrate an older GitLab server to AWS.
+GitLab produces Amazon Machine Images (AMI) during the regular release process. The AMIs can be used for single instance GitLab installation or, by configuring `/etc/gitlab/gitlab.rb`, can be specialized for specific GitLab service roles (for example a Gitaly server). Older releases remain available and can be used to migrate an older GitLab server to AWS.
Currently the Amazon AMI uses the Amazon prepared Ubuntu AMI (x86 and ARM are available) as its starting point.
NOTE:
-When deploying a GitLab instance using the official AMI, the root password to the instance will be the EC2 **Instance** ID (NOT the AMI ID). This way of setting the root account password is specific to official GitLab published AMIs ONLY.
+When deploying a GitLab instance using the official AMI, the root password to the instance is the EC2 **Instance** ID (not the AMI ID). This way of setting the root account password is specific to official GitLab published AMIs ONLY.
-Instances running on Community Edition (CE) require a migration to Enterprise Edition (EE) in order to subscribe to the GitLab Premium or Ultimate plan. If you want to pursue a subscription, using the Free-forever plan of Enterprise Edition is the least disruptive method.
+Instances running on Community Edition (CE) require a migration to Enterprise Edition (EE) to subscribe to the GitLab Premium or Ultimate plan. If you want to pursue a subscription, using the Free-forever plan of Enterprise Edition is the least disruptive method.
NOTE:
-Since any given GitLab upgrade might involve data disk updates or database schema upgrades, simply swapping out the AMI is not sufficient for taking upgrades.
+Because any given GitLab upgrade might involve data disk updates or database schema upgrades, swapping out the AMI is not sufficient for taking upgrades.
1. Log in to the AWS Web Console, so that clicking the links in the following step take you directly to the AMI list.
1. Pick the edition you want:
@@ -72,9 +72,9 @@ Since any given GitLab upgrade might involve data disk updates or database schem
- [GitLab Community Edition](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;ownerAlias=782774275127;search=GitLab%20CE;sort=desc:name): The open source version of GitLab.
- [GitLab Premium or Ultimate Marketplace (Prelicensed)](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;source=Marketplace;search=GitLab%20EE;sort=desc:name): 5 user license built into per-minute billing.
-1. AMI IDs are unique per region, so once you've loaded one of the above, select the desired target region in the upper right of the console to see the appropriate AMIs.
+1. AMI IDs are unique per region, so after you've loaded one of the above, select the desired target region in the upper right of the console to see the appropriate AMIs.
1. After the console is loaded, you can add additional search criteria to narrow further. For instance, type `13.` to find only 13.x versions.
-1. To launch an EC2 Machine with one of the listed AMIs, check the box at the start of the relevant row, and select the "Launch" button near the top of left of the page.
+1. To launch an EC2 Machine with one of the listed AMIs, check the box at the start of the relevant row, and select **Launch** near the top of left of the page.
NOTE:
If you are trying to restore from an older version of GitLab while moving to AWS, find the
@@ -88,7 +88,7 @@ GitLab implementation patterns build upon [GitLab Reference Architectures](../..
Testing-backed architectural qualification is a fundamental concept behind implementation patterns:
-- Implementation patterns maintain GitLab Reference Architecture compliance and provide [GitLab Performance Tool](https://gitlab.com/gitlab-org/quality/performance) (gpt) reports to demonstrate adherence to them.
+- Implementation patterns maintain GitLab Reference Architecture compliance and provide [GitLab Performance Tool](https://gitlab.com/gitlab-org/quality/performance) (GPT) reports to demonstrate adherence to them.
- Implementation patterns may be qualified by and/or contributed to by the technology vendor. For instance, an implementation pattern for AWS may be officially reviewed by AWS.
- Implementation patterns may specify and test Cloud Platform PaaS services for suitability for GitLab. This testing can be coordinated and help qualify these technologies for Reference Architectures. For instance, qualifying compatibility with and availability of runtime versions of top level PaaS such as those for PostgreSQL and Redis.
- Implementation patterns can provided qualified testing for platform limitations, for example, ensuring Gitaly Cluster can work correctly on specific Cloud Platform availability zone latency and throughput characteristics or qualifying what levels of available platform partner local disk performance is workable for Gitaly server to operate with integrity.
diff --git a/doc/install/aws/manual_install_aws.md b/doc/install/aws/manual_install_aws.md
index 25973220170..7494dc1e95e 100644
--- a/doc/install/aws/manual_install_aws.md
+++ b/doc/install/aws/manual_install_aws.md
@@ -32,23 +32,23 @@ For the Cloud Native Hybrid architectures there are two Infrastructure as Code o
## Introduction
-For the most part, we'll make use of Omnibus GitLab in our setup, but we'll also leverage native AWS services. Instead of using the Omnibus bundled PostgreSQL and Redis, we will use Amazon RDS and ElastiCache.
+For the most part, we make use of Omnibus GitLab in our setup, but we also leverage native AWS services. Instead of using the Omnibus bundled PostgreSQL and Redis, we use Amazon RDS and ElastiCache.
-In this guide, we'll go through a multi-node setup where we'll start by
+In this guide, we go through a multi-node setup where we start by
configuring our Virtual Private Cloud and subnets to later integrate
services such as RDS for our database server and ElastiCache as a Redis
-cluster to finally manage them within an auto scaling group with custom
+cluster to finally manage them in an auto scaling group with custom
scaling policies.
## Requirements
-In addition to having a basic familiarity with [AWS](https://docs.aws.amazon.com/) and [Amazon EC2](https://docs.aws.amazon.com/ec2/), you will need:
+In addition to having a basic familiarity with [AWS](https://docs.aws.amazon.com/) and [Amazon EC2](https://docs.aws.amazon.com/ec2/), you need:
- [An AWS account](https://console.aws.amazon.com/console/home)
- [To create or upload an SSH key](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
to connect to the instance via SSH
- A domain name for the GitLab instance
-- An SSL/TLS certificate to secure your domain. If you do not already own one, you can provision a free public SSL/TLS certificate through [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/)(ACM) for use with the [Elastic Load Balancer](#load-balancer) we'll create.
+- An SSL/TLS certificate to secure your domain. If you do not already own one, you can provision a free public SSL/TLS certificate through [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/)(ACM) for use with the [Elastic Load Balancer](#load-balancer) we create.
NOTE:
It can take a few hours to validate a certificate provisioned through ACM. To avoid delays later, request your certificate as soon as possible.
@@ -79,11 +79,11 @@ GitLab uses the following AWS services, with links to pricing information:
## Create an IAM EC2 instance role and profile
-As we'll be using [Amazon S3 object storage](#amazon-s3-object-storage), our EC2 instances need to have read, write, and list permissions for our S3 buckets. To avoid embedding AWS keys in our GitLab configuration, we'll make use of an [IAM Role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) to allow our GitLab instance with this access. We'll need to create an IAM policy to attach to our IAM role:
+As we are using [Amazon S3 object storage](#amazon-s3-object-storage), our EC2 instances must have read, write, and list permissions for our S3 buckets. To avoid embedding AWS keys in our GitLab configuration, we make use of an [IAM Role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) to allow our GitLab instance with this access. We must create an IAM policy to attach to our IAM role:
### Create an IAM Policy
-1. Navigate to the IAM dashboard and select **Policies** in the left menu.
+1. Go to the IAM dashboard and select **Policies** in the left menu.
1. Select **Create policy**, select the `JSON` tab, and add a policy. We want to [follow security best practices and grant _least privilege_](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege), giving our role only the permissions needed to perform the required actions.
1. Assuming you prefix the S3 bucket names with `gl-` as shown in the diagram, add the following policy:
@@ -114,7 +114,7 @@ As we'll be using [Amazon S3 object storage](#amazon-s3-object-storage), our EC2
}
```
-1. Select **Review policy**, give your policy a name (we'll use `gl-s3-policy`), and select **Create policy**.
+1. Select **Review policy**, give your policy a name (we use `gl-s3-policy`), and select **Create policy**.
### Create an IAM Role
@@ -124,20 +124,20 @@ As we'll be using [Amazon S3 object storage](#amazon-s3-object-storage), our EC2
**Next: Permissions**.
1. In the policy filter, search for the `gl-s3-policy` we created above, select it, and select **Tags**.
1. Add tags if needed and select **Review**.
-1. Give the role a name (we'll use `GitLabS3Access`) and select **Create Role**.
+1. Give the role a name (we use `GitLabS3Access`) and select **Create Role**.
-We'll use this role when we [create a launch configuration](#create-a-launch-configuration) later on.
+We use this role when we [create a launch configuration](#create-a-launch-configuration) later on.
## Configuring the network
-We'll start by creating a VPC for our GitLab cloud infrastructure, then
+We start by creating a VPC for our GitLab cloud infrastructure, then
we can create subnets to have public and private instances in at least
-two [Availability Zones (AZs)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html). Public subnets will require a Route Table keep and an associated
+two [Availability Zones (AZs)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html). Public subnets require a Route Table keep and an associated
Internet Gateway.
### Creating the Virtual Private Cloud (VPC)
-We'll now create a VPC, a virtual networking environment that you'll control:
+We now create a VPC, a virtual networking environment that you control:
1. Sign in to [Amazon Web Services](https://console.aws.amazon.com/vpc/home).
1. Select **Your VPCs** from the left menu and then select **Create VPC**.
@@ -153,15 +153,15 @@ We'll now create a VPC, a virtual networking environment that you'll control:
Now, let's create some subnets in different Availability Zones. Make sure
that each subnet is associated to the VPC we just created and
-that CIDR blocks don't overlap. This will also
-allow us to enable multi AZ for redundancy.
+that CIDR blocks don't overlap. This also
+allows us to enable multi AZ for redundancy.
-We will create private and public subnets to match load balancers and
+We create private and public subnets to match load balancers and
RDS instances as well:
1. Select **Subnets** from the left menu.
1. Select **Create subnet**. Give it a descriptive name tag based on the IP,
- for example `gitlab-public-10.0.0.0`, select the VPC we created previously, select an availability zone (we'll use `us-west-2a`),
+ for example `gitlab-public-10.0.0.0`, select the VPC we created previously, select an availability zone (we use `us-west-2a`),
and at the IPv4 CIDR block let's give it a 24 subnet `10.0.0.0/24`:
![Create subnet](img/create_subnet.png)
@@ -186,7 +186,7 @@ create a new one:
1. Select **Internet Gateways** from the left menu.
1. Select **Create internet gateway**, give it the name `gitlab-gateway` and
select **Create**.
-1. Select it from the table, and then under the **Actions** dropdown choose
+1. Select it from the table, and then under the **Actions** dropdown list choose
"Attach to VPC".
![Create gateway](img/create_gateway.png)
@@ -195,11 +195,11 @@ create a new one:
### Create NAT Gateways
-Instances deployed in our private subnets need to connect to the internet for updates, but should not be reachable from the public internet. To achieve this, we'll make use of [NAT Gateways](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) deployed in each of our public subnets:
+Instances deployed in our private subnets must connect to the internet for updates, but should not be reachable from the public internet. To achieve this, we make use of [NAT Gateways](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) deployed in each of our public subnets:
-1. Navigate to the VPC dashboard and select **NAT Gateways** in the left menu bar.
+1. Go to the VPC dashboard and select **NAT Gateways** in the left menu bar.
1. Select **Create NAT Gateway** and complete the following:
- 1. **Subnet**: Select `gitlab-public-10.0.0.0` from the dropdown.
+ 1. **Subnet**: Select `gitlab-public-10.0.0.0` from the dropdown list.
1. **Elastic IP Allocation ID**: Enter an existing Elastic IP or select **Allocate Elastic IP address** to allocate a new IP to your NAT gateway.
1. Add tags if needed.
1. Select **Create NAT Gateway**.
@@ -210,7 +210,7 @@ Create a second NAT gateway but this time place it in the second public subnet,
#### Public Route Table
-We need to create a route table for our public subnets to reach the internet via the internet gateway we created in the previous step.
+We must create a route table for our public subnets to reach the internet via the internet gateway we created in the previous step.
On the VPC dashboard:
@@ -219,7 +219,7 @@ On the VPC dashboard:
1. At the "Name tag" enter `gitlab-public` and choose `gitlab-vpc` under "VPC".
1. Select **Create**.
-We now need to add our internet gateway as a new target and have
+We now must add our internet gateway as a new target and have
it receive traffic from any destination.
1. Select **Route Tables** from the left menu and select the `gitlab-public`
@@ -235,7 +235,7 @@ Next, we must associate the **public** subnets to the route table:
#### Private Route Tables
-We also need to create two private route tables so that instances in each private subnet can reach the internet via the NAT gateway in the corresponding public subnet in the same availability zone.
+We also must create two private route tables so that instances in each private subnet can reach the internet via the NAT gateway in the corresponding public subnet in the same availability zone.
1. Follow the same steps as above to create two private route tables. Name them `gitlab-private-a` and `gitlab-private-b` respectively.
1. Next, add a new route to each of the private route tables where the destination is `0.0.0.0/0` and the target is one of the NAT gateways we created earlier.
@@ -247,30 +247,30 @@ We also need to create two private route tables so that instances in each privat
## Load Balancer
-We'll create a load balancer to evenly distribute inbound traffic on ports `80` and `443` across our GitLab application servers. Based the on the [scaling policies](#create-an-auto-scaling-group) we'll create later, instances will be added to or removed from our load balancer as needed. Additionally, the load balance will perform health checks on our instances.
+We create a load balancer to evenly distribute inbound traffic on ports `80` and `443` across our GitLab application servers. Based on the [scaling policies](#create-an-auto-scaling-group) we create later, instances are added to or removed from our load balancer as needed. Additionally, the load balancer performs health checks on our instances.
On the EC2 dashboard, look for Load Balancer in the left navigation bar:
1. Select **Create Load Balancer**.
1. Choose the **Classic Load Balancer**.
- 1. Give it a name (we'll use `gitlab-loadbalancer`) and for the **Create LB Inside** option, select `gitlab-vpc` from the dropdown menu.
+ 1. Give it a name (we use `gitlab-loadbalancer`) and for the **Create LB Inside** option, select `gitlab-vpc` from the dropdown list.
1. In the **Listeners** section, set the following listeners:
- HTTP port 80 for both load balancer and instance protocol and ports
- TCP port 22 for both load balancer and instance protocols and ports
- - HTTPS port 443 for load balancer protocol and ports, forwarding to HTTP port 80 on the instance (we will configure GitLab to listen on port 80 [later in the guide](#add-support-for-proxied-ssl))
+ - HTTPS port 443 for load balancer protocol and ports, forwarding to HTTP port 80 on the instance (we configure GitLab to listen on port 80 [later in the guide](#add-support-for-proxied-ssl))
1. In the **Select Subnets** section, select both public subnets from the list so that the load balancer can route traffic to both availability zones.
-1. We'll add a security group for our load balancer to act as a firewall to control what traffic is allowed through. Select **Assign Security Groups** and select **Create a new security group**, give it a name
- (we'll use `gitlab-loadbalancer-sec-group`) and description, and allow both HTTP and HTTPS traffic
- from anywhere (`0.0.0.0/0, ::/0`). Also allow SSH traffic, select a custom source, and add a single trusted IP address or an IP address range in CIDR notation. This will allow users to perform Git actions over SSH.
+1. We add a security group for our load balancer to act as a firewall to control what traffic is allowed through. Select **Assign Security Groups** and select **Create a new security group**, give it a name
+ (we use `gitlab-loadbalancer-sec-group`) and description, and allow both HTTP and HTTPS traffic
+ from anywhere (`0.0.0.0/0, ::/0`). Also allow SSH traffic, select a custom source, and add a single trusted IP address or an IP address range in CIDR notation. This allows users to perform Git actions over SSH.
1. Select **Configure Security Settings** and set the following:
1. Select an SSL/TLS certificate from ACM or upload a certificate to IAM.
- 1. Under **Select a Cipher**, pick a predefined security policy from the dropdown. You can see a breakdown of [Predefined SSL Security Policies for Classic Load Balancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-policy-table.html) in the AWS docs. Check the GitLab codebase for a list of [supported SSL ciphers and protocols](https://gitlab.com/gitlab-org/gitlab/-/blob/9ee7ad433269b37251e0dd5b5e00a0f00d8126b4/lib/support/nginx/gitlab-ssl#L97-99).
+ 1. Under **Select a Cipher**, pick a predefined security policy from the dropdown list. You can see a breakdown of [Predefined SSL Security Policies for Classic Load Balancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-policy-table.html) in the AWS documentation. Check the GitLab codebase for a list of [supported SSL ciphers and protocols](https://gitlab.com/gitlab-org/gitlab/-/blob/9ee7ad433269b37251e0dd5b5e00a0f00d8126b4/lib/support/nginx/gitlab-ssl#L97-99).
1. Select **Configure Health Check** and set up a health check for your EC2 instances.
1. For **Ping Protocol**, select HTTP.
1. For **Ping Port**, enter 80.
- 1. For **Ping Path** - we recommend that you [use the Readiness check endpoint](../../administration/load_balancer.md#readiness-check). You'll need to add [the VPC IP Address Range (CIDR)](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-groups.html#elb-vpc-nacl) to the [IP allowlist](../../administration/monitoring/ip_whitelist.md) for the [Health Check endpoints](../../user/admin_area/monitoring/health_check.md)
+ 1. For **Ping Path** - we recommend that you [use the Readiness check endpoint](../../administration/load_balancer.md#readiness-check). You must add [the VPC IP Address Range (CIDR)](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-groups.html#elb-vpc-nacl) to the [IP allowlist](../../administration/monitoring/ip_whitelist.md) for the [Health Check endpoints](../../user/admin_area/monitoring/health_check.md)
1. Keep the default **Advanced Details** or adjust them according to your needs.
-1. Select **Add EC2 Instances** - don't add anything as we will create an Auto Scaling Group later to manage instances for us.
+1. Select **Add EC2 Instances** - don't add anything as we create an Auto Scaling Group later to manage instances for us.
1. Select **Add Tags** and add any tags you need.
1. Select **Review and Create**, review all your settings, and select **Create** if you're happy.
@@ -288,28 +288,28 @@ On the Route 53 dashboard, select **Hosted zones** in the left navigation bar:
1. **Type:** Select **A - IPv4 address**.
1. **Alias:** Defaults to **No**. Select **Yes**.
1. **Alias Target:** Find the **ELB Classic Load Balancers** section and select the classic load balancer we created earlier.
- 1. **Routing Policy:** We'll use **Simple** but you can choose a different policy based on your use case.
- 1. **Evaluate Target Health:** We'll set this to **No** but you can choose to have the load balancer route traffic based on target health.
+ 1. **Routing Policy:** We use **Simple** but you can choose a different policy based on your use case.
+ 1. **Evaluate Target Health:** We set this to **No** but you can choose to have the load balancer route traffic based on target health.
1. Select **Create**.
-1. If you registered your domain through Route 53, you're done. If you used a different domain registrar, you need to update your DNS records with your domain registrar. You'll need to:
+1. If you registered your domain through Route 53, you're done. If you used a different domain registrar, you must update your DNS records with your domain registrar. You must:
1. Select **Hosted zones** and select the domain you added above.
- 1. You'll see a list of `NS` records. From your domain registrar's administrator panel, add each of these as `NS` records to your domain's DNS records. These steps may vary between domain registrars. If you're stuck, Google **"name of your registrar" add DNS records** and you should find a help article specific to your domain registrar.
+ 1. You see a list of `NS` records. From your domain registrar's administrator panel, add each of these as `NS` records to your domain's DNS records. These steps may vary between domain registrars. If you're stuck, Google **"name of your registrar" add DNS records** and you should find a help article specific to your domain registrar.
The steps for doing this vary depending on which registrar you use and is beyond the scope of this guide.
## PostgreSQL with RDS
-For our database server we will use Amazon RDS for PostgreSQL which offers Multi AZ
-for redundancy (Aurora is **not** supported). First we'll create a security group and subnet group, then we'll
+For our database server we use Amazon RDS for PostgreSQL which offers Multi AZ
+for redundancy (Aurora is **not** supported). First we create a security group and subnet group, then we
create the actual RDS instance.
### RDS Security Group
-We need a security group for our database that will allow inbound traffic from the instances we'll deploy in our `gitlab-loadbalancer-sec-group` later on:
+We need a security group for our database that allows inbound traffic from the instances we deploy in our `gitlab-loadbalancer-sec-group` later on:
1. From the EC2 dashboard, select **Security Groups** from the left menu bar.
1. Select **Create security group**.
-1. Give it a name (we'll use `gitlab-rds-sec-group`), a description, and select the `gitlab-vpc` from the **VPC** dropdown.
+1. Give it a name (we use `gitlab-rds-sec-group`), a description, and select the `gitlab-vpc` from the **VPC** dropdown list.
1. In the **Inbound rules** section, select **Add rule** and set the following:
1. **Type:** search for and select the **PostgreSQL** rule.
1. **Source type:** set as "Custom".
@@ -318,11 +318,11 @@ We need a security group for our database that will allow inbound traffic from t
### RDS Subnet Group
-1. Navigate to the RDS dashboard and select **Subnet Groups** from the left menu.
+1. Go to the RDS dashboard and select **Subnet Groups** from the left menu.
1. Select **Create DB Subnet Group**.
-1. Under **Subnet group details**, enter a name (we'll use `gitlab-rds-group`), a description, and choose the `gitlab-vpc` from the VPC dropdown.
-1. From the **Availability Zones** dropdown, select the Availability Zones that include the subnets you've configured. In our case, we'll add `eu-west-2a` and `eu-west-2b`.
-1. From the **Subnets** dropdown, select the two private subnets (`10.0.1.0/24` and `10.0.3.0/24`) as we defined them in the [subnets section](#subnets).
+1. Under **Subnet group details**, enter a name (we use `gitlab-rds-group`), a description, and choose the `gitlab-vpc` from the VPC dropdown list.
+1. From the **Availability Zones** dropdown list, select the Availability Zones that include the subnets you've configured. In our case, we add `eu-west-2a` and `eu-west-2b`.
+1. From the **Subnets** dropdown list, select the two private subnets (`10.0.1.0/24` and `10.0.3.0/24`) as we defined them in the [subnets section](#subnets).
1. Select **Create** when ready.
### Create the database
@@ -332,30 +332,30 @@ Avoid using burstable instances (t class instances) for the database as this cou
Now, it's time to create the database:
-1. Navigate to the RDS dashboard, select **Databases** from the left menu, and select **Create database**.
+1. Go to the RDS dashboard, select **Databases** from the left menu, and select **Create database**.
1. Select **Standard Create** for the database creation method.
1. Select **PostgreSQL** as the database engine and select the minimum PostgreSQL version as defined for your GitLab version in our [database requirements](../../install/requirements.md#postgresql-requirements).
-1. Since this is a production server, let's choose **Production** from the **Templates** section.
-1. Under **Settings**, set a DB instance identifier, a master username, and a master password. We'll use `gitlab-db-ha`, `gitlab`, and a very secure password respectively. Make a note of these as we'll need them later.
-1. For the DB instance size, select **Standard classes** and select an instance size that meets your requirements from the dropdown menu. We'll use a `db.m4.large` instance.
+1. Because this is a production server, let's choose **Production** from the **Templates** section.
+1. Under **Settings**, set a DB instance identifier, a master username, and a master password. We use `gitlab-db-ha`, `gitlab`, and a very secure password respectively. Make a note of these as we need them later.
+1. For the DB instance size, select **Standard classes** and select an instance size that meets your requirements from the dropdown list. We use a `db.m4.large` instance.
1. Under **Storage**, configure the following:
- 1. Select **Provisioned IOPS (SSD)** from the storage type dropdown menu. Provisioned IOPS (SSD) storage is best suited for this use (though you can choose General Purpose (SSD) to reduce the costs). Read more about it at [Storage for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html).
- 1. Allocate storage and set provisioned IOPS. We'll use the minimum values, `100` and `1000`, respectively.
+ 1. Select **Provisioned IOPS (SSD)** from the storage type dropdown list. Provisioned IOPS (SSD) storage is best suited for this use (though you can choose General Purpose (SSD) to reduce the costs). Read more about it at [Storage for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html).
+ 1. Allocate storage and set provisioned IOPS. We use the minimum values, `100` and `1000`, respectively.
1. Enable storage autoscaling (optional) and set a maximum storage threshold.
1. Under **Availability & durability**, select **Create a standby instance** to have a standby RDS instance provisioned in a different [Availability Zone](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html).
1. Under **Connectivity**, configure the following:
- 1. Select the VPC we created earlier (`gitlab-vpc`) from the **Virtual Private Cloud (VPC)** dropdown menu.
+ 1. Select the VPC we created earlier (`gitlab-vpc`) from the **Virtual Private Cloud (VPC)** dropdown list.
1. Expand the **Additional connectivity configuration** section and select the subnet group (`gitlab-rds-group`) we created earlier.
1. Set public accessibility to **No**.
- 1. Under **VPC security group**, select **Choose existing** and select the `gitlab-rds-sec-group` we create above from the dropdown.
+ 1. Under **VPC security group**, select **Choose existing** and select the `gitlab-rds-sec-group` we create above from the dropdown list.
1. Leave the database port as the default `5432`.
1. For **Database authentication**, select **Password authentication**.
1. Expand the **Additional configuration** section and complete the following:
- 1. The initial database name. We'll use `gitlabhq_production`.
+ 1. The initial database name. We use `gitlabhq_production`.
1. Configure your preferred backup settings.
- 1. The only other change we'll make here is to disable auto minor version updates under **Maintenance**.
+ 1. The only other change we make here is to disable auto minor version updates under **Maintenance**.
1. Leave all the other settings as is or tweak according to your needs.
- 1. Once you're happy, select **Create database**.
+ 1. If you're happy, select **Create database**.
Now that the database is created, let's move on to setting up Redis with ElastiCache.
@@ -366,17 +366,17 @@ persistence and is used to store session data, temporary cache information, and
### Create a Redis Security Group
-1. Navigate to the EC2 dashboard.
+1. Go to the EC2 dashboard.
1. Select **Security Groups** from the left menu.
-1. Select **Create security group** and fill in the details. Give it a name (we'll use `gitlab-redis-sec-group`),
+1. Select **Create security group** and fill in the details. Give it a name (we use `gitlab-redis-sec-group`),
add a description, and choose the VPC we created previously
1. In the **Inbound rules** section, select **Add rule** and add a **Custom TCP** rule, set port `6379`, and set the "Custom" source as the `gitlab-loadbalancer-sec-group` we created earlier.
1. When done, select **Create security group**.
### Redis Subnet Group
-1. Navigate to the ElastiCache dashboard from your AWS console.
-1. Go to **Subnet Groups** in the left menu, and create a new subnet group (we'll name ours `gitlab-redis-group`).
+1. Go to the ElastiCache dashboard from your AWS console.
+1. Go to **Subnet Groups** in the left menu, and create a new subnet group (we name ours `gitlab-redis-group`).
Make sure to select our VPC and its [private subnets](#subnets).
1. Select **Create** when ready.
@@ -384,14 +384,14 @@ persistence and is used to store session data, temporary cache information, and
### Create the Redis Cluster
-1. Navigate back to the ElastiCache dashboard.
+1. Go back to the ElastiCache dashboard.
1. Select **Redis** on the left menu and select **Create** to create a new
Redis cluster. Do not enable **Cluster Mode** as it is [not supported](../../administration/redis/replication_and_failover_external.md#requirements). Even without cluster mode on, you still get the
chance to deploy Redis in multiple availability zones.
1. In the settings section:
1. Give the cluster a name (`gitlab-redis`) and a description.
1. For the version, select the latest.
- 1. Leave the port as `6379` since this is what we used in our Redis security group above.
+ 1. Leave the port as `6379` because this is what we used in our Redis security group above.
1. Select the node type (at least `cache.t3.medium`, but adjust to your needs) and the number of replicas.
1. In the advanced settings section:
1. Select the multi-AZ auto-failover option.
@@ -418,20 +418,20 @@ If you do not want to maintain bastion hosts, you can set up [AWS Systems Manage
### Create Bastion Host A
-1. Navigate to the EC2 Dashboard and select **Launch instance**.
+1. Go to the EC2 Dashboard and select **Launch instance**.
1. Select the **Ubuntu Server 18.04 LTS (HVM)** AMI.
-1. Choose an instance type. We'll use a `t2.micro` as we'll only use the bastion host to SSH into our other instances.
+1. Choose an instance type. We use a `t2.micro` as we only use the bastion host to SSH into our other instances.
1. Select **Configure Instance Details**.
- 1. Under **Network**, select the `gitlab-vpc` from the dropdown menu.
+ 1. Under **Network**, select the `gitlab-vpc` from the dropdown list.
1. Under **Subnet**, select the public subnet we created earlier (`gitlab-public-10.0.0.0`).
1. Double check that under **Auto-assign Public IP** you have **Use subnet setting (Enable)** selected.
1. Leave everything else as default and select **Add Storage**.
-1. For storage, we'll leave everything as default and only add an 8GB root volume. We won't store anything on this instance.
+1. For storage, we leave everything as default and only add an 8GB root volume. We do not store anything on this instance.
1. Select **Add Tags** and on the next screen select **Add Tag**.
- 1. We'll only set `Key: Name` and `Value: Bastion Host A`.
+ 1. We only set `Key: Name` and `Value: Bastion Host A`.
1. Select **Configure Security Group**.
- 1. Select **Create a new security group**, enter a **Security group name** (we'll use `bastion-sec-group`), and add a description.
- 1. We'll enable SSH access from anywhere (`0.0.0.0/0`). If you want stricter security, specify a single IP address or an IP address range in CIDR notation.
+ 1. Select **Create a new security group**, enter a **Security group name** (we use `bastion-sec-group`), and add a description.
+ 1. We enable SSH access from anywhere (`0.0.0.0/0`). If you want stricter security, specify a single IP address or an IP address range in CIDR notation.
1. Select **Review and Launch**
1. Review all your settings and, if you're happy, select **Launch**.
1. Acknowledge that you have access to an existing key pair or create a new one. Select **Launch Instance**.
@@ -447,18 +447,18 @@ Confirm that you can SSH into the instance:
1. Create an EC2 instance following the same steps as above with the following changes:
1. For the **Subnet**, select the second public subnet we created earlier (`gitlab-public-10.0.2.0`).
- 1. Under the **Add Tags** section, we'll set `Key: Name` and `Value: Bastion Host B` so that we can easily identify our two instances.
+ 1. Under the **Add Tags** section, we set `Key: Name` and `Value: Bastion Host B` so that we can easily identify our two instances.
1. For the security group, select the existing `bastion-sec-group` we created above.
### Use SSH Agent Forwarding
-EC2 instances running Linux use private key files for SSH authentication. You'll connect to your bastion host using an SSH client and the private key file stored on your client. Since the private key file is not present on the bastion host, you will not be able to connect to your instances in private subnets.
+EC2 instances running Linux use private key files for SSH authentication. You connect to your bastion host using an SSH client and the private key file stored on your client. Because the private key file is not present on the bastion host, you are not able to connect to your instances in private subnets.
Storing private key files on your bastion host is a bad idea. To get around this, use SSH agent forwarding on your client. See [Securely Connect to Linux Instances Running in a Private Amazon VPC](https://aws.amazon.com/blogs/security/securely-connect-to-linux-instances-running-in-a-private-amazon-vpc/) for a step-by-step guide on how to use SSH agent forwarding.
## Install GitLab and create custom AMI
-We will need a preconfigured, custom GitLab AMI to use in our launch configuration later. As a starting point, we will use the official GitLab AMI to create a GitLab instance. Then, we'll add our custom configuration for PostgreSQL, Redis, and Gitaly. If you prefer, instead of using the official GitLab AMI, you can also spin up an EC2 instance of your choosing and [manually install GitLab](https://about.gitlab.com/install/).
+We need a preconfigured, custom GitLab AMI to use in our launch configuration later. As a starting point, we use the official GitLab AMI to create a GitLab instance. Then, we add our custom configuration for PostgreSQL, Redis, and Gitaly. If you prefer, instead of using the official GitLab AMI, you can also spin up an EC2 instance of your choosing and [manually install GitLab](https://about.gitlab.com/install/).
### Install GitLab
@@ -467,12 +467,12 @@ From the EC2 dashboard:
1. Use the section below titled "[Find official GitLab-created AMI IDs on AWS](#find-official-gitlab-created-ami-ids-on-aws)" to find the correct AMI to launch.
1. After clicking **Launch** on the desired AMI, select an instance type based on your workload. Consult the [hardware requirements](../../install/requirements.md#hardware-requirements) to choose one that fits your needs (at least `c5.xlarge`, which is sufficient to accommodate 100 users).
1. Select **Configure Instance Details**:
- 1. In the **Network** dropdown, select `gitlab-vpc`, the VPC we created earlier.
- 1. In the **Subnet** dropdown, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier.
+ 1. In the **Network** dropdown list, select `gitlab-vpc`, the VPC we created earlier.
+ 1. In the **Subnet** dropdown list, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier.
1. Double check that **Auto-assign Public IP** is set to `Use subnet setting (Disable)`.
1. Select **Add Storage**.
- 1. The root volume is 8GiB by default and should be enough given that we won't store any data there.
-1. Select **Add Tags** and add any tags you may need. In our case, we'll only set `Key: Name` and `Value: GitLab`.
+ 1. The root volume is 8GiB by default and should be enough given that we do not store any data there.
+1. Select **Add Tags** and add any tags you may need. In our case, we only set `Key: Name` and `Value: GitLab`.
1. Select **Configure Security Group**. Check **Select an existing security group** and select the `gitlab-loadbalancer-sec-group` we created earlier.
1. Select **Review and launch** followed by **Launch** if you're happy with your settings.
1. Finally, acknowledge that you have access to the selected private key file or create a new one. Select **Launch Instances**.
@@ -483,7 +483,7 @@ Connect to your GitLab instance via **Bastion Host A** using [SSH Agent Forwardi
#### Disable Let's Encrypt
-Since we're adding our SSL certificate at the load balancer, we do not need the GitLab built-in support for Let's Encrypt. Let's Encrypt [is enabled by default](https://docs.gitlab.com/omnibus/settings/ssl.html#lets-encrypt-integration) when using an `https` domain in GitLab 10.7 and later, so we need to explicitly disable it:
+Because we're adding our SSL certificate at the load balancer, we do not need the GitLab built-in support for Let's Encrypt. Let's Encrypt [is enabled by default](https://docs.gitlab.com/omnibus/settings/ssl.html#lets-encrypt-integration) when using an `https` domain in GitLab 10.7 and later, so we must explicitly disable it:
1. Open `/etc/gitlab/gitlab.rb` and disable it:
@@ -501,7 +501,7 @@ Since we're adding our SSL certificate at the load balancer, we do not need the
From your GitLab instance, connect to the RDS instance to verify access and to install the required `pg_trgm` and `btree_gist` extensions.
-To find the host or endpoint, navigate to **Amazon RDS > Databases** and select the database you created earlier. Look for the endpoint under the **Connectivity & security** tab.
+To find the host or endpoint, go to **Amazon RDS > Databases** and select the database you created earlier. Look for the endpoint under the **Connectivity & security** tab.
Do not to include the colon and port number:
@@ -523,10 +523,10 @@ gitlab=# \q
#### Configure GitLab to connect to PostgreSQL and Redis
1. Edit `/etc/gitlab/gitlab.rb`, find the `external_url 'http://<domain>'` option
- and change it to the `https` domain you will be using.
+ and change it to the `https` domain you are using.
1. Look for the GitLab database settings and uncomment as necessary. In
- our current case we'll specify the database adapter, encoding, host, name,
+ our current case we specify the database adapter, encoding, host, name,
username, and password:
```ruby
@@ -542,7 +542,7 @@ gitlab=# \q
gitlab_rails['db_host'] = "<rds-endpoint>"
```
-1. Next, we need to configure the Redis section by adding the host and
+1. Next, we must configure the Redis section by adding the host and
uncommenting the port:
```ruby
@@ -560,7 +560,7 @@ gitlab=# \q
sudo gitlab-ctl reconfigure
```
-1. You might also find it useful to run a check and a service status to make sure
+1. You can also run a check and a service status to make sure
everything has been setup correctly:
```shell
@@ -578,21 +578,21 @@ Gitaly is a service that provides high-level RPC access to Git repositories.
It should be enabled and configured on a separate EC2 instance in one of the
[private subnets](#subnets) we configured previously.
-Let's create an EC2 instance where we'll install Gitaly:
+Let's create an EC2 instance where we install Gitaly:
1. From the EC2 dashboard, select **Launch instance**.
-1. Choose an AMI. In this example, we'll select the **Ubuntu Server 18.04 LTS (HVM), SSD Volume Type**.
-1. Choose an instance type. We'll pick a `c5.xlarge`.
+1. Choose an AMI. In this example, we select the **Ubuntu Server 18.04 LTS (HVM), SSD Volume Type**.
+1. Choose an instance type. We pick a `c5.xlarge`.
1. Select **Configure Instance Details**.
- 1. In the **Network** dropdown, select `gitlab-vpc`, the VPC we created earlier.
- 1. In the **Subnet** dropdown, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier.
+ 1. In the **Network** dropdown list, select `gitlab-vpc`, the VPC we created earlier.
+ 1. In the **Subnet** dropdown list, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier.
1. Double check that **Auto-assign Public IP** is set to `Use subnet setting (Disable)`.
1. Select **Add Storage**.
1. Increase the Root volume size to `20 GiB` and change the **Volume Type** to `Provisioned IOPS SSD (io1)`. (This is an arbitrary size. Create a volume big enough for your repository storage requirements.)
1. For **IOPS** set `1000` (20 GiB x 50 IOPS). You can provision up to 50 IOPS per GiB. If you select a larger volume, increase the IOPS accordingly. Workloads where many small files are written in a serialized manner, like `git`, requires performant storage, hence the choice of `Provisioned IOPS SSD (io1)`.
-1. Select **Add Tags** and add your tags. In our case, we'll only set `Key: Name` and `Value: Gitaly`.
+1. Select **Add Tags** and add your tags. In our case, we only set `Key: Name` and `Value: Gitaly`.
1. Select **Configure Security Group** and let's **Create a new security group**.
- 1. Give your security group a name and description. We'll use `gitlab-gitaly-sec-group` for both.
+ 1. Give your security group a name and description. We use `gitlab-gitaly-sec-group` for both.
1. Create a **Custom TCP** rule and add port `8075` to the **Port Range**. For the **Source**, select the `gitlab-loadbalancer-sec-group`.
1. Also add an inbound rule for SSH from the `bastion-sec-group` so that we can connect using [SSH Agent Forwarding](#use-ssh-agent-forwarding) from the Bastion hosts.
1. Select **Review and launch** followed by **Launch** if you're happy with your settings.
@@ -611,11 +611,11 @@ Remember to run `sudo gitlab-ctl reconfigure` after saving the changes to the `g
#### Fast lookup of authorized SSH keys
-The public SSH keys for users allowed to access GitLab are stored in `/var/opt/gitlab/.ssh/authorized_keys`. Typically we'd use shared storage so that all the instances are able to access this file when a user performs a Git action over SSH. Since we do not have shared storage in our setup, we'll update our configuration to authorize SSH users via indexed lookup in the GitLab database.
+The public SSH keys for users allowed to access GitLab are stored in `/var/opt/gitlab/.ssh/authorized_keys`. Typically we'd use shared storage so that all the instances are able to access this file when a user performs a Git action over SSH. Because we do not have shared storage in our setup, we update our configuration to authorize SSH users via indexed lookup in the GitLab database.
Follow the instructions at [Setting up fast lookup via GitLab Shell](../../administration/operations/fast_ssh_key_lookup.md#setting-up-fast-lookup-via-gitlab-shell) to switch from using the `authorized_keys` file to the database.
-If you do not configure fast lookup, Git actions over SSH will result in the following error:
+If you do not configure fast lookup, Git actions over SSH results in the following error:
```shell
Permission denied (publickey).
@@ -629,7 +629,7 @@ and the repository exists.
Ordinarily we would manually copy the contents (primary and public keys) of `/etc/ssh/` on the primary application server to `/etc/ssh` on all secondary servers. This prevents false man-in-the-middle-attack alerts when accessing servers in your cluster behind a load balancer.
-We'll automate this by creating static host keys as part of our custom AMI. As these host keys are also rotated every time an EC2 instance boots up, "hard coding" them into our custom AMI serves as a handy workaround.
+We automate this by creating static host keys as part of our custom AMI. As these host keys are also rotated every time an EC2 instance boots up, "hard coding" them into our custom AMI serves as a workaround.
On your GitLab instance run the following:
@@ -650,16 +650,16 @@ HostKey /etc/ssh_static/ssh_host_ed25519_key
#### Amazon S3 object storage
-Since we're not using NFS for shared storage, we will use [Amazon S3](https://aws.amazon.com/s3/) buckets to store backups, artifacts, LFS objects, uploads, merge request diffs, container registry images, and more. Our documentation includes [instructions on how to configure object storage](../../administration/object_storage.md) for each of these data types, and other information about using object storage with GitLab.
+Because we're not using NFS for shared storage, we use [Amazon S3](https://aws.amazon.com/s3/) buckets to store backups, artifacts, LFS objects, uploads, merge request diffs, container registry images, and more. Our documentation includes [instructions on how to configure object storage](../../administration/object_storage.md) for each of these data types, and other information about using object storage with GitLab.
NOTE:
-Since we are using the [AWS IAM profile](#create-an-iam-role) we created earlier, be sure to omit the AWS access key and secret access key/value pairs when configuring object storage. Instead, use `'use_iam_profile' => true` in your configuration as shown in the object storage documentation linked above.
+Because we are using the [AWS IAM profile](#create-an-iam-role) we created earlier, be sure to omit the AWS access key and secret access key/value pairs when configuring object storage. Instead, use `'use_iam_profile' => true` in your configuration as shown in the object storage documentation linked above.
Remember to run `sudo gitlab-ctl reconfigure` after saving the changes to the `gitlab.rb` file.
---
-That concludes the configuration changes for our GitLab instance. Next, we'll create a custom AMI based on this instance to use for our launch configuration and auto scaling group.
+That concludes the configuration changes for our GitLab instance. Next, we create a custom AMI based on this instance to use for our launch configuration and auto scaling group.
### Log in for the first time
@@ -672,7 +672,7 @@ Depending on how you installed GitLab and if you did not change the password by
To change the default password, log in as the `root` user with the default password and [change it in the user profile](../../user/profile#change-your-password).
-When our [auto scaling group](#create-an-auto-scaling-group) spins up new instances, we'll be able to log in with username `root` and the newly created password.
+When our [auto scaling group](#create-an-auto-scaling-group) spins up new instances, we are able to log in with username `root` and the newly created password.
### Create custom AMI
@@ -680,10 +680,10 @@ On the EC2 dashboard:
1. Select the `GitLab` instance we [created earlier](#install-gitlab).
1. Select **Actions**, scroll down to **Image** and select **Create Image**.
-1. Give your image a name and description (we'll use `GitLab-Source` for both).
+1. Give your image a name and description (we use `GitLab-Source` for both).
1. Leave everything else as default and select **Create Image**
-Now we have a custom AMI that we'll use to create our launch configuration the next step.
+Now we have a custom AMI that we use to create our launch configuration the next step.
## Deploy GitLab inside an auto scaling group
@@ -694,11 +694,11 @@ From the EC2 dashboard:
1. Select **Launch Configurations** from the left menu and select **Create launch configuration**.
1. Select **My AMIs** from the left menu and select the `GitLab` custom AMI we created above.
1. Select an instance type best suited for your needs (at least a `c5.xlarge`) and select **Configure details**.
-1. Enter a name for your launch configuration (we'll use `gitlab-ha-launch-config`).
+1. Enter a name for your launch configuration (we use `gitlab-ha-launch-config`).
1. **Do not** check **Request Spot Instance**.
-1. From the **IAM Role** dropdown, pick the `GitLabAdmin` instance role we [created earlier](#create-an-iam-ec2-instance-role-and-profile).
+1. From the **IAM Role** dropdown list, pick the `GitLabAdmin` instance role we [created earlier](#create-an-iam-ec2-instance-role-and-profile).
1. Leave the rest as defaults and select **Add Storage**.
-1. The root volume is 8GiB by default and should be enough given that we won't store any data there. Select **Configure Security Group**.
+1. The root volume is 8GiB by default and should be enough given that we do not store any data there. Select **Configure Security Group**.
1. Check **Select and existing security group** and select the `gitlab-loadbalancer-sec-group` we created earlier.
1. Select **Review**, review your changes, and select **Create launch configuration**.
1. Acknowledge that you have access to the private key or create a new one. Select **Create launch configuration**.
@@ -706,16 +706,16 @@ From the EC2 dashboard:
### Create an auto scaling group
1. After the launch configuration is created, select **Create an Auto Scaling group using this launch configuration** to start creating the auto scaling group.
-1. Enter a **Group name** (we'll use `gitlab-auto-scaling-group`).
-1. For **Group size**, enter the number of instances you want to start with (we'll enter `2`).
-1. Select the `gitlab-vpc` from the **Network** dropdown.
+1. Enter a **Group name** (we use `gitlab-auto-scaling-group`).
+1. For **Group size**, enter the number of instances you want to start with (we enter `2`).
+1. Select the `gitlab-vpc` from the **Network** dropdown list.
1. Add both the private [subnets we created earlier](#subnets).
1. Expand the **Advanced Details** section and check the **Receive traffic from one or more load balancers** option.
-1. From the **Classic Load Balancers** dropdown, select the load balancer we created earlier.
+1. From the **Classic Load Balancers** dropdown list, select the load balancer we created earlier.
1. For **Health Check Type**, select **ELB**.
-1. We'll leave our **Health Check Grace Period** as the default `300` seconds. Select **Configure scaling policies**.
+1. We leave our **Health Check Grace Period** as the default `300` seconds. Select **Configure scaling policies**.
1. Check **Use scaling policies to adjust the capacity of this group**.
-1. For this group we'll scale between 2 and 4 instances where one instance will be added if CPU
+1. For this group we scale between 2 and 4 instances where one instance is added if CPU
utilization is greater than 60% and one instance is removed if it falls
to less than 45%.
@@ -724,9 +724,9 @@ to less than 45%.
1. Finally, configure notifications and tags as you see fit, review your changes, and create the
auto scaling group.
-As the auto scaling group is created, you'll see your new instances spinning up in your EC2 dashboard. You'll also see the new instances added to your load balancer. Once the instances pass the heath check, they are ready to start receiving traffic from the load balancer.
+As the auto scaling group is created, you see your new instances spinning up in your EC2 dashboard. You also see the new instances added to your load balancer. After the instances pass the heath check, they are ready to start receiving traffic from the load balancer.
-Since our instances are created by the auto scaling group, go back to your instances and terminate the [instance we created manually above](#install-gitlab). We only needed this instance to create our custom AMI.
+Because our instances are created by the auto scaling group, go back to your instances and terminate the [instance we created manually above](#install-gitlab). We only needed this instance to create our custom AMI.
## Health check and monitoring with Prometheus
@@ -753,11 +753,11 @@ and restore its Git data, database, attachments, LFS objects, and so on.
Some important things to know:
-- The backup/restore tool **does not** store some configuration files, like secrets; you'll
- need to [configure this yourself](../../raketasks/backup_restore.md#storing-configuration-files).
+- The backup/restore tool **does not** store some configuration files, like secrets; you
+ must [configure this yourself](../../raketasks/backup_gitlab.md#storing-configuration-files).
- By default, the backup files are stored locally, but you can
- [backup GitLab using S3](../../raketasks/backup_restore.md#using-amazon-s3).
-- You can [exclude specific directories form the backup](../../raketasks/backup_restore.md#excluding-specific-directories-from-the-backup).
+ [backup GitLab using S3](../../raketasks/backup_gitlab.md#using-amazon-s3).
+- You can [exclude specific directories form the backup](../../raketasks/backup_gitlab.md#excluding-specific-directories-from-the-backup).
### Backing up GitLab
@@ -777,7 +777,7 @@ For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
To restore GitLab, first review the [restore documentation](../../raketasks/backup_restore.md#restore-gitlab),
and primarily the restore prerequisites. Then, follow the steps under the
-[Omnibus installations section](../../raketasks/backup_restore.md#restore-for-omnibus-gitlab-installations).
+[Omnibus installations section](../../raketasks/restore_gitlab.md#restore-for-omnibus-gitlab-installations).
## Updating GitLab
@@ -825,7 +825,7 @@ to request additional material:
GitLab supports several different types of clustering.
- [Geo replication](../../administration/geo/index.md):
Geo is the solution for widely distributed development teams.
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/) - Everything you need to know
+- [Omnibus GitLab](https://docs.gitlab.com/omnibus/) - Everything you must know
about administering your GitLab instance.
- [Add a license](../../user/admin_area/license.md):
Activate all GitLab Enterprise Edition functionality with a license.
@@ -835,9 +835,9 @@ to request additional material:
### Instances are failing health checks
-If your instances are failing the load balancer's health checks, verify that they are returning a status `200` from the health check endpoint we configured earlier. Any other status, including redirects like status `302`, will cause the health check to fail.
+If your instances are failing the load balancer's health checks, verify that they are returning a status `200` from the health check endpoint we configured earlier. Any other status, including redirects like status `302`, causes the health check to fail.
-You may have to set a password on the `root` user to prevent automatic redirects on the sign-in endpoint before health checks will pass.
+You may have to set a password on the `root` user to prevent automatic redirects on the sign-in endpoint before health checks pass.
### "The change you requested was rejected (422)"
diff --git a/doc/install/docker.md b/doc/install/docker.md
index 058233520ca..356c025e168 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -272,6 +272,10 @@ Here's an example that deploys GitLab with four runners as a [stack](https://doc
docker stack deploy --compose-file docker-compose.yml mystack
```
+### Install the product documentation
+
+This is an optional step. See how to [self-host the product documentation](../administration/docs_self_host.md#self-host-the-product-documentation-with-docker).
+
## Configuration
This container uses the official Omnibus GitLab package, so all configuration
@@ -529,6 +533,11 @@ The following steps assume that you are upgrading the same version.
replace `ce` with `ee` in your `docker run` command or `docker-compose.yml` file.
However, reuse the CE container name, port and file mappings, and version.
+### Upgrade the product documentation
+
+This is an optional step. If you [installed the documentation site](#install-the-product-documentation),
+see how to [upgrade to another version](../administration/docs_self_host.md#upgrade-using-docker).
+
## Back up GitLab
You can create a GitLab backup with:
diff --git a/doc/install/installation.md b/doc/install/installation.md
index cc2e57aac96..2f2ae016edd 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -27,20 +27,20 @@ following the
## Consider the Omnibus package installation
-Since an installation from source is a lot of work and error prone we strongly recommend the fast and reliable [Omnibus package installation](https://about.gitlab.com/install/) (deb/rpm).
+Because an installation from source is a lot of work and error prone we strongly recommend the fast and reliable [Omnibus package installation](https://about.gitlab.com/install/) (deb/rpm).
One reason the Omnibus package is more reliable is its use of runit to restart any of the GitLab processes in case one crashes.
On heavily used GitLab instances the memory usage of the Sidekiq background worker grows over time.
Omnibus packages solve this by [letting the Sidekiq terminate gracefully](../administration/operations/sidekiq_memory_killer.md) if it uses too much memory.
After this termination runit detects Sidekiq is not running and starts it.
-Since installations from source don't use runit for process supervision, Sidekiq
+Because installations from source don't use runit for process supervision, Sidekiq
can't be terminated and its memory usage grows over time.
## Select a version to install
Make sure you view [this installation guide](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/install/installation.md) from the branch (version) of GitLab you would like to install (for example, `11-7-stable`).
-You can select the branch in the version dropdown in the top left corner of GitLab (below the menu bar).
+You can select the branch in the version dropdown list in the top left corner of GitLab (below the menu bar).
If the highest number stable branch is unclear, check the [GitLab blog](https://about.gitlab.com/blog/) for installation guide links by version.
@@ -51,7 +51,7 @@ If the highest number stable branch is unclear, check the [GitLab blog](https://
| [Ruby](#2-ruby) | `2.7` | From GitLab 13.6, Ruby 2.7 is required. Ruby 3.0 is not supported yet (see [the relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/5149) for the current status). You must use the standard MRI implementation of Ruby. We love [JRuby](https://www.jruby.org/) and [Rubinius](https://github.com/rubinius/rubinius#the-rubinius-language-platform), but GitLab needs several Gems that have native extensions. |
| [Go](#3-go) | `1.16` | |
| [Git](#git) | `2.33.x` | From GitLab 14.4, Git 2.33.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). |
-| [Node.js](#4-node) | `14.15.0` | GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets. Node.js 16.x is recommended, as it's faster. You can check which version you're running with `node -v`. You need to update it to a newer version if needed. |
+| [Node.js](#4-node) | `14.15.0` | GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets. Node.js 16.x is recommended, as it's faster. You can check which version you're running with `node -v`. You must update it to a newer version if needed. |
## GitLab directory structure
@@ -179,7 +179,7 @@ the Git path:
### GraphicsMagick
For the [Custom Favicon](../user/admin_area/appearance.md#favicon) to work, GraphicsMagick
-needs to be installed.
+must be installed.
```shell
sudo apt-get install -y graphicsmagick
@@ -187,7 +187,7 @@ sudo apt-get install -y graphicsmagick
### Mail server
-In order to receive mail notifications, make sure to install a mail server.
+To receive mail notifications, make sure to install a mail server.
By default, Debian is shipped with `exim4` but this
[has problems](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/12754) while
Ubuntu does not ship with one. The recommended mail server is `postfix` and you
@@ -264,7 +264,7 @@ requirements for these are:
In many distributions,
the versions provided by the official package repositories are out of date, so
-we need to install through the following commands:
+we must install through the following commands:
```shell
# install node v16.x
@@ -298,7 +298,7 @@ In GitLab 12.1 and later, only PostgreSQL is supported. In GitLab 14.0 and later
```
For Ubuntu 18.04 and earlier, the available PostgreSQL doesn't meet the minimum
- version requirement. You need to add PostgreSQL's repository:
+ version requirement. You must add PostgreSQL's repository:
```shell
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
@@ -426,7 +426,7 @@ sudo usermod -aG redis git
### Supervise Redis with systemd
If your distribution uses systemd init and the output of the following command is `notify`,
-you do not need to make any changes:
+you must not make any changes:
```shell
systemctl show --value --property=Type redis-server.service
@@ -678,7 +678,7 @@ sudo -u git -H bundle exec rake "gitlab:indexer:install[/home/git/gitlab-elastic
```
The source code first is fetched to the path specified by the first parameter. Then a binary is built under its `bin` directory.
-You then need to update `gitlab.yml`'s `production -> elasticsearch -> indexer_path` setting to point to that binary.
+You must then update `gitlab.yml`'s `production -> elasticsearch -> indexer_path` setting to point to that binary.
### Install GitLab Pages
@@ -740,7 +740,7 @@ sudo systemctl daemon-reload
The units provided by GitLab make very little assumptions about where you are running Redis and PostgreSQL.
-If you installed GitLab in another directory or as a user other than the default, you need to change these values in the units as well.
+If you installed GitLab in another directory or as a user other than the default, you must change these values in the units as well.
For example, if you're running Redis and PostgreSQL on the same machine as GitLab, you should:
@@ -853,7 +853,7 @@ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production force=yes
# When done, you see 'Administrator account created:'
```
-You can set the Administrator/root password and email by supplying them in environmental variables, `GITLAB_ROOT_PASSWORD` and `GITLAB_ROOT_EMAIL` respectively, as seen below. If you don't set the password (and it is set to the default one), wait to expose GitLab to the public internet until the installation is done and you've logged into the server the first time. During the first login, you'll be forced to change the default password. An Enterprise Edition license may also be installed at this time by supplying a full path in the `GITLAB_LICENSE_FILE` environment variable.
+You can set the Administrator/root password and email by supplying them in environmental variables, `GITLAB_ROOT_PASSWORD` and `GITLAB_ROOT_EMAIL` respectively, as seen below. If you don't set the password (and it is set to the default one), wait to expose GitLab to the public internet until the installation is done and you've logged into the server the first time. During the first login, you are forced to change the default password. An Enterprise Edition license may also be installed at this time by supplying a full path in the `GITLAB_LICENSE_FILE` environment variable.
```shell
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword GITLAB_ROOT_EMAIL=youremail GITLAB_LICENSE_FILE="/path/to/license"
@@ -942,7 +942,7 @@ to use. Read all about the needed configuration at the
If you want to use HTTPS, replace the `gitlab` NGINX configuration with `gitlab-ssl`. See [Using HTTPS](#using-https) for HTTPS configuration details.
-For the NGINX to be able to read the GitLab-Workhorse socket, you need to make sure, that the `www-data` user can read the socket, which will be owned by the GitLab user. This is most easily achieved, if it is world-readable, for example that it has permissions `0755`, which is the default. `www-data` also needs to be able to list the parent directories.
+For the NGINX to be able to read the GitLab-Workhorse socket, you must make sure, that the `www-data` user can read the socket, which is owned by the GitLab user. This is achieved, if it is world-readable, for example that it has permissions `0755`, which is the default. `www-data` also must be able to list the parent directories.
### Test Configuration
@@ -999,8 +999,8 @@ Supply the `SANITIZE=true` environment variable to `gitlab:check` to omit projec
Visit YOUR_SERVER in your web browser for your first GitLab login.
If you didn't [provide a root password during setup](#initialize-database-and-activate-advanced-features),
-you'll be redirected to a password reset screen to provide the password for the
-initial administrator account. Enter your desired password and you'll be
+you are redirected to a password reset screen to provide the password for the
+initial administrator account. Enter your desired password and you are
redirected back to the login screen.
The default account's username is **root**. Provide the password you created
@@ -1013,6 +1013,10 @@ To start and stop GitLab when using:
- systemd units: use `sudo systemctl start gitlab.target` or `sudo systemctl stop gitlab.target`.
- The SysV init script: use `sudo service gitlab start` or `sudo service gitlab stop`.
+### Install the product documentation
+
+This is an optional step. See how to [self-host the product documentation](../administration/docs_self_host.md).
+
## Advanced Setup Tips
### Relative URL support
@@ -1110,7 +1114,7 @@ host localhost # Give your setup a name (here: override localhost)
hostname 127.0.0.1; # Your server name or IP
```
-You also need to change the corresponding options (for example, `ssh_user`, `ssh_host`, `admin_uri`) in the `config/gitlab.yml` file.
+You must also change the corresponding options (for example, `ssh_user`, `ssh_host`, `admin_uri`) in the `config/gitlab.yml` file.
### Additional Markup Styles
@@ -1119,7 +1123,7 @@ Apart from the always supported Markdown style, there are other rich text files
### Using Sidekiq instead of Sidekiq Cluster
As of GitLab 12.10, Source installations are using `bin/sidekiq-cluster` for managing Sidekiq processes.
-Using Sidekiq directly is still supported until 14.0. So if you're experiencing issues, please:
+Using Sidekiq directly is still supported until 14.0. So if you're experiencing issues:
1. Edit the system `init.d` script to remove the `SIDEKIQ_WORKERS` flag. If you have `/etc/default/gitlab`, then you should edit it instead.
1. Restart GitLab.
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index d01860cb24f..27148e06ccb 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -26,22 +26,22 @@ For the installation options, see [the main installation page](index.md).
- macOS
Installation of GitLab on these operating systems is possible, but not supported.
-Please see the [installation from source guide](installation.md) and the [installation guides](https://about.gitlab.com/install/) for more information.
+See the [installation from source guide](installation.md) and the [installation guides](https://about.gitlab.com/install/) for more information.
-Please see [OS versions that are no longer supported](../administration/package_information/supported_os.md#os-versions-that-are-no-longer-supported) for Omnibus installs page
+See [OS versions that are no longer supported](../administration/package_information/supported_os.md#os-versions-that-are-no-longer-supported) for Omnibus installs page
for a list of supported and unsupported OS versions as well as the last support GitLab version for that OS.
### Microsoft Windows
GitLab is developed for Linux-based operating systems.
It does **not** run on Microsoft Windows, and we have no plans to support it in the near future. For the latest development status view this [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/22337).
-Please consider using a virtual machine to run GitLab.
+Consider using a virtual machine to run GitLab.
## Software requirements
### Redis versions
-GitLab 13.0 and later requires Redis version 4.0 or higher.
+GitLab 13.0 and later requires Redis version 5.0 or higher.
Redis version 6.0 or higher is recommended, as this is what ships with
[Omnibus GitLab](https://docs.gitlab.com/omnibus/) packages starting with GitLab 13.9.
@@ -61,7 +61,7 @@ Apart from a local hard drive you can also mount a volume that supports the netw
If you have enough RAM and a recent CPU the speed of GitLab is mainly limited by hard drive seek times. Having a fast drive (7200 RPM and up) or a solid state drive (SSD) improves the responsiveness of GitLab.
NOTE:
-Since file system performance may affect the overall performance of GitLab,
+Because 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:
@@ -94,6 +94,14 @@ if your available memory changes. We also recommend configuring the kernel's swa
to a low value like `10` to make the most of your RAM while still having the swap
available when needed.
+NOTE:
+Although excessive swapping is undesired and degrades performance, it is an
+extremely important last resort against out-of-memory conditions. During
+unexpected system load, such as OS updates or other services on the same host,
+peak memory load spikes could be much higher than average. Having plenty of swap
+helps avoid the Linux OOM killer unsafely terminating a potentially critical
+process, such as PostgreSQL, which can have disastrous consequences.
+
## Database
PostgreSQL is the only supported database, which is bundled with the Omnibus GitLab package.
@@ -112,7 +120,7 @@ the following table) as these were used for development and testing:
| GitLab version | Minimum PostgreSQL version |
|----------------|----------------------------|
| 13.0 | 11 |
-| 14.0 | 12.10 |
+| 14.0 | 12.7 |
| 15.0 | 12.10 |
| 16.0 (planned) | 13.6 |
@@ -125,6 +133,12 @@ GitLab database. [Read more about this requirement, and troubleshooting](postgre
| `btree_gist` | 13.1 |
| `plpgsql` | 11.7 |
+The following managed PostgreSQL services are known to be incompatible and should not be used:
+
+| GitLab version | Managed service |
+|----------------|-------------------------------------------------------|
+| 14.4+ | Amazon Aurora (see [14.4.0](../update/index.md#1440)) |
+
NOTE:
Support for [PostgreSQL 9.6 and 10 was removed in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#postgresql-11-is-now-the-minimum-required-version-to-install-gitlab) so that GitLab can benefit from PostgreSQL 11 improvements, such as partitioning.
@@ -251,9 +265,9 @@ works.
### Puma per worker maximum memory
-By default, each Puma worker will be limited to 1024 MB of memory.
+By default, each Puma worker is limited to 1024 MB of memory.
This setting [can be adjusted](../administration/operations/puma.md#change-the-memory-limit-setting) and should be considered
-if you need to increase the number of Puma workers.
+if you must increase the number of Puma workers.
## Redis and Sidekiq
@@ -279,7 +293,7 @@ to install GitLab on. Depending on how you decide to configure GitLab Runner and
what tools you use to exercise your application in the CI environment, GitLab
Runner can consume significant amount of available memory.
-Memory consumption calculations, that are available above, won't be valid if
+Memory consumption calculations, that are available above, are not valid if
you decide to run GitLab Runner and the GitLab Rails application on the same
machine.
@@ -295,7 +309,7 @@ The GitLab Runner server requirements depend on:
- Resources required to run build jobs.
- Job concurrency settings.
-Since the nature of the jobs varies for each use case, you need to experiment by adjusting the job concurrency to get the optimum setting.
+Because the nature of the jobs varies for each use case, you must experiment by adjusting the job concurrency to get the optimum setting.
For reference, the [SaaS runners on Linux](../ci/runners/saas/linux_saas_runner.md)
are configured so that a **single job** runs in a **single instance** with:
diff --git a/doc/integration/advanced_search/elasticsearch.md b/doc/integration/advanced_search/elasticsearch.md
index c123611fa44..5eac6ab7c84 100644
--- a/doc/integration/advanced_search/elasticsearch.md
+++ b/doc/integration/advanced_search/elasticsearch.md
@@ -95,11 +95,13 @@ The former Ruby-based indexer was removed in [GitLab 12.3](https://gitlab.com/gi
First, we need to install some dependencies, then we build and install
the indexer itself.
+#### Install dependencies
+
This project relies on [International Components for Unicode](https://icu.unicode.org/) (ICU) for text encoding,
therefore we must ensure the development packages for your platform are
installed before running `make`.
-#### Debian / Ubuntu
+##### Debian / Ubuntu
To install on Debian or Ubuntu, run:
@@ -107,7 +109,7 @@ To install on Debian or Ubuntu, run:
sudo apt install libicu-dev
```
-#### CentOS / RHEL
+##### CentOS / RHEL
To install on CentOS or RHEL, run:
@@ -115,7 +117,7 @@ To install on CentOS or RHEL, run:
sudo yum install libicu-devel
```
-#### macOS
+##### macOS
NOTE:
You must first [install Homebrew](https://brew.sh/).
@@ -127,7 +129,7 @@ brew install icu4c
export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
```
-### Build and install
+#### Build and install
To build and install the indexer, run:
@@ -294,7 +296,7 @@ To disable the Elasticsearch integration:
bundle exec rake gitlab:elastic:delete_index RAILS_ENV=production
```
-## Unpause Indexing
+## Unpause Indexing
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Advanced Search**.
@@ -475,6 +477,7 @@ The following are some available Rake tasks:
| Task | Description |
|:--------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [`sudo gitlab-rake gitlab:elastic:info`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Outputs debugging information for the Advanced Search intergation. |
| [`sudo gitlab-rake gitlab:elastic:index`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Enables Elasticsearch indexing and run `gitlab:elastic:create_empty_index`, `gitlab:elastic:clear_index_status`, `gitlab:elastic:index_projects`, and `gitlab:elastic:index_snippets`. |
| [`sudo gitlab-rake gitlab:elastic:pause_indexing`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Pauses Elasticsearch indexing. Changes are still tracked. Useful for cluster/index migrations. |
| [`sudo gitlab-rake gitlab:elastic:resume_indexing`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Resumes Elasticsearch indexing. |
diff --git a/doc/integration/github.md b/doc/integration/github.md
index 3c14e8db4de..3011155f825 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -218,4 +218,4 @@ To fix this issue, you must activate GitHub sign-in in GitLab:
1. On the top bar, in the top right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Account**.
-1. In the **Social sign-in** section, select **Connect to GitHub**.
+1. In the **Service sign-in** section, select **Connect to GitHub**.
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 68ba676b539..02705d9dec3 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -117,10 +117,9 @@ signed in.
## Reduce access privileges on sign in
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/337663) in GitLab 14.8 [with a flag](../administration/feature_flags.md) named `omniauth_login_minimal_scopes`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `omniauth_login_minimal_scopes`. On GitLab.com, this feature is not available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/337663) in GitLab 14.8 [with a flag](../administration/feature_flags.md) named `omniauth_login_minimal_scopes`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/351331) in GitLab 14.9.
+> - [Feature flag `omniauth_login_minimal_scopes`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83453) removed in GitLab 15.2
If you use a GitLab instance for authentication, you can reduce access rights when an OAuth application is used for sign in.
diff --git a/doc/integration/jira/development_panel.md b/doc/integration/jira/development_panel.md
index 2f0ebea165a..4d5a9f92257 100644
--- a/doc/integration/jira/development_panel.md
+++ b/doc/integration/jira/development_panel.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab Jira development panel integration **(FREE)**
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/233149) from GitLab Premium to GitLab Free in 13.4.
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/233149) from GitLab Premium to GitLab Free in 13.4.
With the Jira development panel integration, you can reference Jira issues in GitLab.
When configured, activity (such as pipeline, deployment, and feature flags) displays in the Jira issue's
diff --git a/doc/integration/jira/index.md b/doc/integration/jira/index.md
index 4e8b5ca8927..2f694094940 100644
--- a/doc/integration/jira/index.md
+++ b/doc/integration/jira/index.md
@@ -119,6 +119,6 @@ and complete the CAPTCHA.
### Jira integration does not work for imported project
-There is a [known bug](https://gitlab.com/gitlab-org/gitlab/-/issues/341571)
-where the Jira integration sometimes does not work for a project that has been imported.
+There is a [known bug](https://gitlab.com/gitlab-org/gitlab/-/issues/341571)
+where the Jira integration sometimes does not work for a project that has been imported.
As a workaround, disable the integration and then re-enable it.
diff --git a/doc/integration/kerberos.md b/doc/integration/kerberos.md
index 78c92631e4f..257ba4e6708 100644
--- a/doc/integration/kerberos.md
+++ b/doc/integration/kerberos.md
@@ -125,8 +125,8 @@ If you're not an administrator:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Account**.
-1. In the **Social sign-in** section, select **Connect Kerberos SPNEGO**.
- If you don't see a **Social sign-in** Kerberos option, follow the
+1. In the **Service sign-in** section, select **Connect Kerberos SPNEGO**.
+ If you don't see a **Service sign-in** Kerberos option, follow the
requirements in [Enable single sign-on](#enable-single-sign-on).
In either case, you should now be able to sign in to your GitLab account
diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md
index e33f874d35a..962f5c4e5fb 100644
--- a/doc/integration/oauth_provider.md
+++ b/doc/integration/oauth_provider.md
@@ -86,7 +86,7 @@ To create an application for your GitLab instance:
When creating application in the **Admin Area** , you can mark it as _trusted_.
The user authorization step is automatically skipped for this application.
-## Expiring access tokens
+## Access token expiration
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21745) in GitLab 14.3, with the ability to opt out.
> - Ability to opt-out of expiring access token [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/340848) in GitLab 15.0.
@@ -96,13 +96,8 @@ The ability to opt-out of expiring access tokens was [deprecated](https://gitlab
in GitLab 14.3 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/340848) in 15.0. All
existing integrations must be updated to support access token refresh.
-Access tokens expire in two hours which means that integrations that use them must support generating new access
-tokens at least every two hours. Existing:
-
-- Applications can have expiring access tokens:
- 1. Edit the application.
- 1. Select **Expire access tokens**.
-- Tokens must be [revoked](../api/oauth2.md#revoke-a-token) or they don't expire.
+Access tokens expire after two hours. Integrations that use access tokens must generate new ones at least every
+two hours.
When applications are deleted, all grants and tokens associated with the application are also deleted.
diff --git a/doc/integration/slash_commands.md b/doc/integration/slash_commands.md
index f5916b72d9d..db1d5a8cce4 100644
--- a/doc/integration/slash_commands.md
+++ b/doc/integration/slash_commands.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Slash commands in Mattermost and Slack **(FREE)**
-> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) from GitLab Ultimate to GitLab Free in 11.9.
+> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) from GitLab Ultimate to GitLab Free in 11.9.
If you want to control and view GitLab content while you're
working in Slack and Mattermost, you can use slash commands.
diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md
index 19eb31ec588..f3b66f8c12d 100644
--- a/doc/integration/twitter.md
+++ b/doc/integration/twitter.md
@@ -4,7 +4,10 @@ group: Authentication and Authorization
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
---
-# Twitter OAuth 2.0 OmniAuth Provider **(FREE SELF)**
+# Twitter OAuth 1.0a OmniAuth Provider **(FREE SELF)**
+
+NOTE:
+Twitter OAuth 2.0 support is [not yet supported](https://gitlab.com/gitlab-org/gitlab/-/issues/366213).
To enable the Twitter OmniAuth provider you must register your application with
Twitter. Twitter generates a client ID and secret key for you to use.
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index 71248adc777..9e7d452c259 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -297,7 +297,6 @@ For API content, see:
- [Feature Flags API](../api/feature_flags.md)
- [Feature Flag Specs API](../api/feature_flag_specs.md) (Deprecated and [scheduled for removal](https://gitlab.com/gitlab-org/gitlab/-/issues/213369) in GitLab 14.0.)
- [Feature Flag User Lists API](../api/feature_flag_user_lists.md)
-- [Legacy Feature Flags API](../api/feature_flags_legacy.md)
### Golang application example
diff --git a/doc/operations/incident_management/alerts.md b/doc/operations/incident_management/alerts.md
index af42571f82f..a4b34807094 100644
--- a/doc/operations/incident_management/alerts.md
+++ b/doc/operations/incident_management/alerts.md
@@ -168,8 +168,9 @@ by changing the status. Setting the status to:
- **Acknowledged** limits on-call pages based on the project's [escalation policy](escalation_policies.md).
- **Triggered** from **Resolved** restarts the alert escalating from the beginning.
-For [alerts with an associated incident](alerts.md#create-an-incident-from-an-alert),
-updating the alert status also updates the incident status.
+In GitLab 15.1 and earlier, updating the status of an [alert with an associated incident](alerts.md#create-an-incident-from-an-alert)
+also updates the incident status. In [GitLab 15.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/356057),
+the incident status is independent and does not update when the alert status changes.
### Create an incident from an alert
diff --git a/doc/operations/incident_management/img/timeline_events_v15_1.png b/doc/operations/incident_management/img/timeline_events_v15_1.png
new file mode 100644
index 00000000000..3241f35764c
--- /dev/null
+++ b/doc/operations/incident_management/img/timeline_events_v15_1.png
Binary files differ
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index e48127b3415..f1628cb64ca 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -53,7 +53,8 @@ GitLab to create incident automatically whenever an alert is triggered:
1. Navigate to **Settings > Monitor > Incidents** and expand **Incidents**.
1. Check the **Create an incident** checkbox.
1. To customize the incident, select an
- [issue template](../../user/project/description_templates.md#create-an-issue-template).
+ [issue template](../../user/project/description_templates.md#create-an-issue-template),
+ to include in the [incident summary](#summary).
1. To send [an email notification](paging.md#email-notifications-for-alerts) to users
with the Developer role, select
**Send a separate email notification to Developers**. Email notifications are
@@ -153,9 +154,9 @@ Select any incident in the list to display its incident details page.
### Summary
-The summary section for incidents provides both critical details about and the
-contents of the issue template (if one was used). The highlighted bar at the top
-of the incident displays from left to right:
+The summary section for incidents provides both critical details about the
+incident and the contents of the issue template (if applicable). The highlighted
+bar at the top of the incident displays from left to right:
- The link to the original alert.
- The alert start time.
@@ -168,6 +169,13 @@ Beneath the highlight bar, GitLab displays a summary that includes the following
- `full_query`
- Monitoring tool
+The incident summary can be further customized using
+[GitLab Flavored Markdown](../../user/markdown.md). If the corresponding alert
+[provided Markdown for the incident](../metrics/alerts.md#trigger-actions-from-alerts),
+then the Markdown is appended to the summary after the above alert fields. If an
+[incident template](#create-incidents-automatically) is configured for the
+project, then the template content is appended at the end.
+
Comments are displayed in threads, but can be displayed chronologically
[by toggling on the recent updates view](#recent-updates-view).
@@ -195,6 +203,67 @@ field populated.
![Incident alert details](img/incident_alert_details_v13_4.png)
+### Timeline events
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344059) in GitLab 15.2 [with a flag](../../administration/feature_flags.md) named `incident_timeline`. Enabled on GitLab.com. Disabled on self-managed.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `incident_timeline`.
+On GitLab.com, this feature is available.
+
+Incident timelines are an important part of record keeping for incidents.
+They give a high-level overview, to executives and external viewers, of what happened during the incident,
+and the steps that were taken for it to be resolved.
+
+#### View the event timeline
+
+Incident timeline events are listed in ascending order of the date and time.
+They are grouped with dates and are listed in ascending order of the time when they occured:
+
+![Incident timeline events list](img/timeline_events_v15_1.png)
+
+To view the event timeline of an incident:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Monitor > Incidents**.
+1. Select an incident.
+1. Select the **Timeline** tab.
+
+#### Create a timeline event
+
+Create a timeline event manually using the form.
+
+Prerequisites:
+
+- You must have at least the Developer role for the project.
+
+To create a timeline event:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Monitor > Incidents**.
+1. Select an incident.
+1. Select the **Timeline** tab.
+1. Select **Add new timeline event**.
+1. Complete the required fields.
+1. Select **Save** or **Save and add another event**.
+
+#### Delete a timeline event
+
+You can also delete timeline events.
+
+Prerequisites:
+
+- You must have at least the Developer role for the project.
+
+To delete a timeline event:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Monitor > Incidents**.
+1. Select an incident.
+1. Select the **Timeline** tab.
+1. On the right of a timeline event, select **More actions** (**{ellipsis_v}**) and then select **Delete**.
+1. To confirm, select **Delete Event**.
+
### Recent updates view **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227836) in GitLab 13.5.
@@ -270,8 +339,9 @@ by changing the status. Setting the status to:
- **Acknowledged** limits on-call pages based on the selected [escalation policy](#change-escalation-policy).
- **Triggered** from **Resolved** restarts the incident escalating from the beginning.
-For [incidents created from alerts](alerts.md#create-an-incident-from-an-alert),
-updating the incident status also updates the alert status.
+In GitLab 15.1 and earlier, updating the status of an [incident created from an alert](alerts.md#create-an-incident-from-an-alert)
+also updates the alert status. In [GitLab 15.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/356057),
+the alert status is independent and does not update when the incident status changes.
### Change escalation policy **(PREMIUM)**
@@ -288,8 +358,9 @@ Selecting an escalation policy updates the incident status to **Triggered** and
Deselecting an escalation policy halts escalation. Refer to the [incident status](#change-incident-status)
to manage on-call paging once escalation has begun.
-For [incidents created from alerts](alerts.md#create-an-incident-from-an-alert),
-the incident's escalation policy reflects the alert's escalation policy and cannot be changed.
+In GitLab 15.1 and earlier, the escalation policy for [incidents created from alerts](alerts.md#create-an-incident-from-an-alert)
+reflects the alert's escalation policy and cannot be changed. In [GitLab 15.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/356057),
+the incident escalation policy is independent and can be changed.
### Manage incidents from Slack
diff --git a/doc/operations/incident_management/paging.md b/doc/operations/incident_management/paging.md
index 936c297e555..3eeeb67bf51 100644
--- a/doc/operations/incident_management/paging.md
+++ b/doc/operations/incident_management/paging.md
@@ -61,5 +61,6 @@ the rule fires. You can respond to a page or stop incident escalations by
[updating the incident's status](incidents.md#change-incident-status) or, if applicable,
[unsetting the incident's escalation policy](incidents.md#change-escalation-policy).
-To avoid duplicate pages, [incidents created from alerts](alerts.md#create-an-incident-from-an-alert) do not support independent escalation.
-Instead, the status and escalation policy fields are synced between the alert and the incident.
+In GitLab 15.1 and earlier, [incidents created from alerts](alerts.md#create-an-incident-from-an-alert)
+do not support independent escalation. In [GitLab 15.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/356057),
+all incidents can be escalated independently.
diff --git a/doc/operations/index.md b/doc/operations/index.md
index 88687c2faf1..05ce1c5d876 100644
--- a/doc/operations/index.md
+++ b/doc/operations/index.md
@@ -77,29 +77,14 @@ microservices-based distributed systems - and displays results within GitLab.
- [Trace the performance and health](tracing.md) of a deployed application.
-## Aggregate and store logs (DEPRECATED) **(FREE SELF)**
+<!--- start_remove The following content will be removed on remove_date: '2022-10-18'--->
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485) in GitLab 14.7.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/360182) behind a [feature flag](../administration/feature_flags.md) named `monitor_logging` in GitLab 15.0. Disabled by default.
+## Aggregate and store logs (removed) **(FREE SELF)**
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485)
-in GitLab 14.7.
-It will be removed completely in GitLab 15.2.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `monitor_logging`.
-On GitLab.com, this feature is not available.
-This feature is not recommended for production use.
-
-Developers need to troubleshoot application changes in development, and incident
-responders need aggregated, real-time logs when troubleshooting problems with
-production services. GitLab provides centralized, aggregated log storage for your
-distributed application, enabling you to collect logs across multiple services and
-infrastructure.
-
-- [View logs of pods](../user/project/clusters/kubernetes_pod_logs.md)
- in connected Kubernetes clusters.
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485) in GitLab 14.7
+and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/360193) in GitLab 15.2.
+
+<!--- end_remove -->
## Manage your infrastructure in code
diff --git a/doc/operations/metrics/dashboards/index.md b/doc/operations/metrics/dashboards/index.md
index 152e3dca27d..bd1f75b7b42 100644
--- a/doc/operations/metrics/dashboards/index.md
+++ b/doc/operations/metrics/dashboards/index.md
@@ -135,9 +135,6 @@ The options are:
- **Expand panel** - Displays a larger version of a visualization. To return to
the dashboard, select the **Back** button in your browser, or press the <kbd>Escape</kbd> key.
([Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3100) in GitLab 13.0.)
-- **View logs** **(ULTIMATE)** - Displays [Logs](../../../user/project/clusters/kubernetes_pod_logs.md),
- if they are enabled. If used in conjunction with the [timeline zoom](#timeline-zoom-and-url-sharing)
- 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)
diff --git a/doc/operations/metrics/embed_grafana.md b/doc/operations/metrics/embed_grafana.md
index 700bf821a49..2229ba22be7 100644
--- a/doc/operations/metrics/embed_grafana.md
+++ b/doc/operations/metrics/embed_grafana.md
@@ -54,6 +54,11 @@ To set up the Grafana API in Grafana:
1. For **API Token**, enter the Administrator API token you just generated.
1. Select **Save Changes**.
+NOTE:
+If the Grafana integration is enabled, any user with read access to the GitLab
+project can query metrics from the Prometheus instance. All requests proxied
+through GitLab are authenticated with the same Grafana Administrator API token.
+
### Generate a link to a panel
To generate a link to a panel:
diff --git a/doc/operations/metrics/img/prometheus_integration_alerts.png b/doc/operations/metrics/img/prometheus_integration_alerts.png
deleted file mode 100644
index 609c5e5196c..00000000000
--- a/doc/operations/metrics/img/prometheus_integration_alerts.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/metrics/index.md b/doc/operations/metrics/index.md
index 916fe6b0ea9..82f093cf432 100644
--- a/doc/operations/metrics/index.md
+++ b/doc/operations/metrics/index.md
@@ -117,7 +117,7 @@ dashboard is visible to authenticated and non-authenticated users.
## Adding custom metrics
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28527) from GitLab Premium to GitLab Free in 12.10.
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28527) from GitLab Premium to GitLab Free in 12.10.
Custom metrics can be monitored by adding them on the monitoring dashboard page.
After saving them, they display on the environment metrics dashboard provided that either:
diff --git a/doc/operations/product_analytics.md b/doc/operations/product_analytics.md
index a55cbe906a0..98ba6a9203c 100644
--- a/doc/operations/product_analytics.md
+++ b/doc/operations/product_analytics.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/policy/alpha-beta-support.md b/doc/policy/alpha-beta-support.md
index a2612e2bac7..45f14e4f9a2 100644
--- a/doc/policy/alpha-beta-support.md
+++ b/doc/policy/alpha-beta-support.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Support for Alpha, Beta, Limited Availability, and Generally Available Features **(PREMIUM)**
-Some GitLab features are released as [Alpha or Beta versions](https://about.gitlab.com/support/statement-of-support.html#alpha--beta-features) which are not fully supported. All other features are considered to be Generally Available (GA).
+Some GitLab features are released as [Alpha or Beta versions](https://about.gitlab.com/support/statement-of-support/#alpha-beta-features) which are not fully supported. All other features are considered to be Generally Available (GA).
## Alpha Features
@@ -32,7 +32,7 @@ Characteristics of beta features:
- Features and functions are not likely to change.
- Data loss is not likely.
-Your Support Contract provides **commercially-reasonable effort** support for Beta features, with the expectation that issues will require extra time and assistance from development to troubleshoot.
+Your Support Contract provides **commercially-reasonable effort** support for Beta features, with the expectation that issues require extra time and assistance from development to troubleshoot.
## Limited Availability (LA)
diff --git a/doc/policy/maintenance.md b/doc/policy/maintenance.md
index e3910115657..e831303988b 100644
--- a/doc/policy/maintenance.md
+++ b/doc/policy/maintenance.md
@@ -43,12 +43,12 @@ The following table describes the version types and their release cadence:
## Upgrade recommendations
We encourage everyone to run the [latest stable release](https://about.gitlab.com/releases/categories/releases/)
-to ensure that you can easily upgrade to the most secure and feature-rich GitLab experience.
-To make sure you can easily run the most recent stable release, we are working
+to ensure that you can upgrade to the most secure and feature-rich GitLab experience.
+To make sure you can run the most recent stable release, we are working
hard to keep the update process simple and reliable.
If you are unable to follow our monthly release cycle, there are a couple of
-cases you need to consider. Follow the
+cases you must consider. Follow the
[upgrade paths guide](../update/index.md#upgrade-paths) to safely upgrade
between versions.
@@ -106,7 +106,7 @@ Backporting to more than one stable release is normally reserved for [security r
In some cases, however, we may need to backport *a bug fix* to more than one stable
release, depending on the severity of the bug.
-The decision on whether backporting a change will be performed is done at the discretion of the
+The decision on whether backporting a change is performed is done at the discretion of the
[current release managers](https://about.gitlab.com/community/release-managers/), similar to what is
described in the [managing bugs](https://gitlab.com/gitlab-org/gitlab/-/blob/master/PROCESS.md#managing-bugs) process,
based on *all* of the following:
@@ -124,7 +124,7 @@ For instance, if we release `13.2.1` with a fix for a severe bug introduced in
`13.0.0`, we could backport the fix to a new `13.0.x`, and `13.1.x` patch release.
Note that [severity](../development/contributing/issue_workflow.md#severity-labels) 3 and lower
-requests will be automatically turned down.
+requests are automatically turned down.
To request backporting to more than one stable release for consideration, raise an issue in the
[release/tasks](https://gitlab.com/gitlab-org/release/tasks/-/issues/new?issuable_template=Backporting-request) issue tracker.
diff --git a/doc/public_access/public_access.md b/doc/public_access/public_access.md
deleted file mode 100644
index 8b665972918..00000000000
--- a/doc/public_access/public_access.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../user/public_access.md'
-remove_date: '2022-06-18'
----
-
-This document was moved to [another location](../user/public_access.md).
-
-<!-- This redirect file can be deleted after <2022-06-18>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/raketasks/backup_gitlab.md b/doc/raketasks/backup_gitlab.md
new file mode 100644
index 00000000000..8d5ae14a043
--- /dev/null
+++ b/doc/raketasks/backup_gitlab.md
@@ -0,0 +1,908 @@
+---
+stage: Systems
+group: Geo
+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
+---
+
+# Back up GitLab
+
+GitLab provides a command line interface to back up your entire instance,
+including:
+
+- Database
+- Attachments
+- Git repositories data
+- CI/CD job output logs
+- CI/CD job artifacts
+- LFS objects
+- Terraform states ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331806) in GitLab 14.7)
+- Container Registry images
+- GitLab Pages content
+- Packages ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332006) in GitLab 14.7)
+- Snippets
+- [Group wikis](../user/project/wiki/group.md)
+
+Backups do not include:
+
+- [Mattermost data](https://docs.mattermost.com/administration/config-settings.html#file-storage)
+- Redis (and thus Sidekiq jobs)
+
+WARNING:
+GitLab does not back up any configuration files (`/etc/gitlab`), TLS keys and 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_restore.md#back-up-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:
+
+- GitLab 12.2 or later:
+
+ ```shell
+ sudo gitlab-backup create
+ ```
+
+- GitLab 12.1 and earlier:
+
+ ```shell
+ gitlab-rake gitlab:backup:create
+ ```
+
+If you installed GitLab from source, use the following command:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
+```
+
+If you're running GitLab from within a Docker container, run the backup from
+the host, based on your installed version of GitLab:
+
+- GitLab 12.2 or later:
+
+ ```shell
+ docker exec -t <container name> gitlab-backup create
+ ```
+
+- GitLab 12.1 and earlier:
+
+ ```shell
+ docker exec -t <container name> gitlab-rake gitlab:backup:create
+ ```
+
+If you're using the [GitLab Helm chart](https://gitlab.com/gitlab-org/charts/gitlab)
+on a Kubernetes cluster, you can run the backup task by using `kubectl` to run the `backup-utility`
+script on the GitLab toolbox pod. For more details, see the
+[charts backup documentation](https://docs.gitlab.com/charts/backup-restore/backup.html).
+
+Similar to the Kubernetes case, if you have scaled out your GitLab cluster to
+use multiple application servers, you should pick a designated node (that isn't
+auto-scaled away) for running the backup Rake task. Because the backup Rake
+task is tightly coupled to the main Rails application, this is typically a node
+on which you're also running Puma or Sidekiq.
+
+Example output:
+
+```plaintext
+Dumping database tables:
+- Dumping table events... [DONE]
+- Dumping table issues... [DONE]
+- Dumping table keys... [DONE]
+- Dumping table merge_requests... [DONE]
+- Dumping table milestones... [DONE]
+- Dumping table namespaces... [DONE]
+- Dumping table notes... [DONE]
+- Dumping table projects... [DONE]
+- Dumping table protected_branches... [DONE]
+- Dumping table schema_migrations... [DONE]
+- Dumping table services... [DONE]
+- Dumping table snippets... [DONE]
+- Dumping table taggings... [DONE]
+- Dumping table tags... [DONE]
+- Dumping table users... [DONE]
+- Dumping table users_projects... [DONE]
+- Dumping table web_hooks... [DONE]
+- Dumping table wikis... [DONE]
+Dumping repositories:
+- Dumping repository abcd... [DONE]
+Creating backup archive: $TIMESTAMP_gitlab_backup.tar [DONE]
+Deleting tmp directories...[DONE]
+Deleting old backups... [SKIPPING]
+```
+
+## Storing configuration files
+
+The [backup Rake task](#back-up-gitlab) GitLab provides does _not_ store your
+configuration files. The primary reason for this is that your database contains
+items including encrypted information for two-factor authentication and the
+CI/CD _secure variables_. Storing encrypted information in the same location
+as its key defeats the purpose of using encryption in the first place.
+
+WARNING:
+The secrets file is essential to preserve your database encryption key.
+
+At the very **minimum**, you must back up:
+
+For Omnibus:
+
+- `/etc/gitlab/gitlab-secrets.json`
+- `/etc/gitlab/gitlab.rb`
+
+For installation from source:
+
+- `/home/git/gitlab/config/secrets.yml`
+- `/home/git/gitlab/config/gitlab.yml`
+
+For [Docker installations](https://docs.gitlab.com/omnibus/docker/), you must
+back up the volume where the configuration files are stored. If you created
+the GitLab container according to the documentation, it should be in the
+`/srv/gitlab/config` directory.
+
+For [GitLab Helm chart installations](https://gitlab.com/gitlab-org/charts/gitlab)
+on a Kubernetes cluster, you must follow the
+[Back up the secrets](https://docs.gitlab.com/charts/backup-restore/backup.html#backup-the-secrets)
+instructions.
+
+You may also want to back up any TLS keys and certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), and your
+[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
+to avoid man-in-the-middle attack warnings if you have to perform a full machine restore.
+
+If you use Omnibus GitLab, review additional information to
+[backup your configuration](https://docs.gitlab.com/omnibus/settings/backups.html).
+
+In the unlikely event that the secrets file is lost, see the
+[troubleshooting section](backup_restore.md#when-the-secrets-file-is-lost).
+
+## Backup options
+
+The command line tool GitLab provides to backup your instance can accept more
+options.
+
+### Backup strategy option
+
+The default backup strategy is to essentially stream data from the respective
+data locations to the backup using the Linux command `tar` and `gzip`. This works
+fine in most cases, but can cause problems when data is rapidly changing.
+
+When data changes while `tar` is reading it, the error `file changed as we read
+it` may occur, and causes the backup process to fail. To combat this, 8.17
+introduces a new backup strategy called `copy`. The strategy copies data files
+to a temporary location before calling `tar` and `gzip`, avoiding the error.
+
+A side-effect is that the backup process takes up to an additional 1X disk
+space. The process does its best to clean up the temporary files at each stage
+so the problem doesn't compound, but it could be a considerable change for large
+installations. This is why the `copy` strategy is not the default in 8.17.
+
+To use the `copy` strategy instead of the default streaming strategy, specify
+`STRATEGY=copy` in the Rake task command. For example:
+
+```shell
+sudo gitlab-backup create STRATEGY=copy
+```
+
+Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+
+### Backup filename
+
+WARNING:
+If you use a custom backup filename, you can't
+[limit the lifetime of the backups](#limit-backup-lifetime-for-local-files-prune-old-backups).
+
+By default, a backup file is created according to the specification in the
+previous [Backup timestamp](backup_restore.md#backup-timestamp) section. You can, however,
+override the `[TIMESTAMP]` portion of the filename by setting the `BACKUP`
+environment variable. For example:
+
+```shell
+sudo gitlab-backup create BACKUP=dump
+```
+
+Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+
+The resulting file is named `dump_gitlab_backup.tar`. This is useful for
+systems that make use of rsync and incremental backups, and results in
+considerably faster transfer speeds.
+
+### Confirm archive can be transferred
+
+To ensure the generated archive is transferable by rsync, you can set the `GZIP_RSYNCABLE=yes`
+option. This sets the `--rsyncable` option to `gzip`, which is useful only in
+combination with setting [the Backup filename option](#backup-filename).
+
+Note that the `--rsyncable` option in `gzip` isn't guaranteed to be available
+on all distributions. To verify that it's available in your distribution, run
+`gzip --help` or consult the man pages.
+
+```shell
+sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes
+```
+
+Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+
+### Excluding specific directories from the backup
+
+You can exclude specific directories from the backup by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
+
+- `db` (database)
+- `uploads` (attachments)
+- `builds` (CI job output logs)
+- `artifacts` (CI job artifacts)
+- `lfs` (LFS objects)
+- `terraform_state` (Terraform states)
+- `registry` (Container Registry images)
+- `pages` (Pages content)
+- `repositories` (Git repositories data)
+- `packages` (Packages)
+
+All wikis are backed up as part of the `repositories` group. Non-existent wikis are skipped during a backup.
+
+NOTE:
+When [backing up and restoring Helm Charts](https://docs.gitlab.com/charts/architecture/backup-restore.html), there is an additional option `packages`, which refers to any packages managed by the GitLab [package registry](../user/packages/package_registry/index.md).
+For more information see [command line arguments](https://docs.gitlab.com/charts/architecture/backup-restore.html#command-line-arguments).
+
+All wikis are backed up as part of the `repositories` group. Non-existent
+wikis are skipped during a backup.
+
+For Omnibus GitLab packages:
+
+```shell
+sudo gitlab-backup create SKIP=db,uploads
+```
+
+Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+
+For installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=db,uploads RAILS_ENV=production
+```
+
+### Skipping tar creation
+
+NOTE:
+It is not possible to skip the tar creation when using [object storage](#uploading-backups-to-a-remote-cloud-storage) for backups.
+
+The last part of creating a backup is generation of a `.tar` file containing
+all the parts. In some cases (for example, if the backup is picked up by other
+backup software) creating a `.tar` file might be wasted effort or even directly
+harmful, so you can skip this step by adding `tar` to the `SKIP` environment
+variable.
+
+Adding `tar` to the `SKIP` variable leaves the files and directories containing the
+backup in the directory used for the intermediate files. These files are
+overwritten when a new backup is created, so you should make sure they are copied
+elsewhere, because you can only have one backup on the system.
+
+For Omnibus GitLab packages:
+
+```shell
+sudo gitlab-backup create SKIP=tar
+```
+
+For installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=tar RAILS_ENV=production
+```
+
+### Back up Git repositories concurrently
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37158) in GitLab 13.3.
+> - [Concurrent restore introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69330) in GitLab 14.3
+
+When using [multiple repository storages](../administration/repository_storage_paths.md),
+repositories can be backed up or restored concurrently to help fully use CPU time. The
+following variables are available to modify the default behavior of the Rake
+task:
+
+- `GITLAB_BACKUP_MAX_CONCURRENCY`: The maximum number of projects to back up at
+ the same time. Defaults to the number of logical CPUs (in GitLab 14.1 and
+ earlier, defaults to `1`).
+- `GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY`: The maximum number of projects to
+ back up at the same time on each storage. This allows the repository backups
+ to be spread across storages. Defaults to `2` (in GitLab 14.1 and earlier,
+ defaults to `1`).
+
+For example, for Omnibus GitLab installations with 4 repository storages:
+
+```shell
+sudo gitlab-backup create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
+```
+
+For example, for installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
+```
+
+### Incremental repository backups
+
+> - Introduced in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `incremental_repository_backup`. Disabled by default.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/355945) in GitLab 14.10.
+> - `PREVIOUS_BACKUP` option [introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/4184) in GitLab 15.0.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
+On GitLab.com, this feature is not available.
+
+Incremental backups can be faster than full backups because they only pack changes since the last backup into the backup
+bundle for each repository. There must be an existing backup to create an incremental backup from:
+
+- In GitLab 14.9 and 14.10, use the `BACKUP=<timestamp_of_backup>` option to choose the backup to use. The chosen previous backup is overwritten.
+- In GitLab 15.0 and later, use the `PREVIOUS_BACKUP=<timestamp_of_backup>` option to choose the backup to use. By default, a backup file is created
+ as documented in the [Backup timestamp](backup_restore.md#backup-timestamp) section. You can override the `[TIMESTAMP]` portion of the filename by setting the
+ [`BACKUP` environment variable](#backup-filename).
+
+To create an incremental backup, run:
+
+```shell
+sudo gitlab-backup create INCREMENTAL=yes PREVIOUS_BACKUP=<timestamp_of_backup>
+```
+
+Incremental backups can also be created from [an untarred backup](#skipping-tar-creation) by using `SKIP=tar`:
+
+```shell
+sudo gitlab-backup create INCREMENTAL=yes SKIP=tar
+```
+
+### Back up specific repository storages
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
+
+When using [multiple repository storages](../administration/repository_storage_paths.md),
+repositories from specific repository storages can be backed up separately
+using the `REPOSITORIES_STORAGES` option. The option accepts a comma-separated list of
+storage names.
+
+For example, for Omnibus GitLab installations:
+
+```shell
+sudo gitlab-backup create REPOSITORIES_STORAGES=storage1,storage2
+```
+
+For example, for installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_STORAGES=storage1,storage2
+```
+
+### Back up specific repositories
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
+
+You can back up a specific repositories using the `REPOSITORIES_PATHS` option.
+The option accepts a comma-separated list of project and group paths. If you
+specify a group path, all repositories in all projects in the group and
+descendent groups are included.
+
+For example, to back up all repositories for all projects in **Group A** (`group-a`), and the repository for **Project C** in **Group B** (`group-b/project-c`):
+
+- Omnibus GitLab installations:
+
+ ```shell
+ sudo gitlab-backup create REPOSITORIES_PATHS=group-a,group-b/project-c
+ ```
+
+- Installations from source:
+
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_PATHS=group-a,group-b/project-c
+ ```
+
+### Uploading backups to a remote (cloud) storage
+
+NOTE:
+It is not possible to [skip the tar creation](#skipping-tar-creation) when using object storage for backups.
+
+You can let the backup script upload (using the [Fog library](https://fog.io/))
+the `.tar` file it creates. In the following example, we use Amazon S3 for
+storage, but Fog also lets you use [other storage providers](https://fog.io/storage/).
+GitLab also [imports cloud drivers](https://gitlab.com/gitlab-org/gitlab/-/blob/da46c9655962df7d49caef0e2b9f6bbe88462a02/Gemfile#L113)
+for AWS, Google, OpenStack Swift, Rackspace, and Aliyun. A local driver is
+[also available](#uploading-to-locally-mounted-shares).
+
+[Read more about using object storage with GitLab](../administration/object_storage.md).
+
+#### Using Amazon S3
+
+For Omnibus GitLab packages:
+
+1. Add the following to `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'AWS',
+ 'region' => 'eu-west-1',
+ 'aws_access_key_id' => 'AKIAKIAKI',
+ 'aws_secret_access_key' => 'secret123'
+ # If using an IAM Profile, don't configure aws_access_key_id & aws_secret_access_key
+ # 'use_iam_profile' => true
+ }
+ gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
+ ```
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect
+
+#### S3 Encrypted Buckets
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64765) in GitLab 14.3.
+
+AWS supports these [modes for server side encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html):
+
+- Amazon S3-Managed Keys (SSE-S3)
+- Customer Master Keys (CMKs) Stored in AWS Key Management Service (SSE-KMS)
+- Customer-Provided Keys (SSE-C)
+
+Use your mode of choice with GitLab. Each mode has similar, but slightly
+different, configuration methods.
+
+##### SSE-S3
+
+To enable SSE-S3, in the backup storage options set the `server_side_encryption`
+field to `AES256`. For example, in Omnibus GitLab:
+
+```ruby
+gitlab_rails['backup_upload_storage_options'] = {
+ 'server_side_encryption' => 'AES256'
+}
+```
+
+##### SSE-KMS
+
+To enable SSE-KMS, you'll need the [KMS key via its Amazon Resource Name (ARN)
+in the `arn:aws:kms:region:acct-id:key/key-id` format](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html). Under the `backup_upload_storage_options` configuration setting, set:
+
+- `server_side_encryption` to `aws:kms`.
+- `server_side_encryption_kms_key_id` to the ARN of the key.
+
+For example, in Omnibus GitLab:
+
+```ruby
+gitlab_rails['backup_upload_storage_options'] = {
+ 'server_side_encryption' => 'aws:kms',
+ 'server_side_encryption_kms_key_id' => 'arn:aws:<YOUR KMS KEY ID>:'
+}
+```
+
+##### SSE-C
+
+SSE-C requires you to set these encryption options:
+
+- `backup_encryption`: AES256.
+- `backup_encryption_key`: Unencoded, 32-byte (256 bits) key. The upload fails if this isn't exactly 32 bytes.
+
+For example, in Omnibus GitLab:
+
+```ruby
+gitlab_rails['backup_encryption'] = 'AES256'
+gitlab_rails['backup_encryption_key'] = '<YOUR 32-BYTE KEY HERE>'
+```
+
+If the key contains binary characters and cannot be encoded in UTF-8,
+instead, specify the key with the `GITLAB_BACKUP_ENCRYPTION_KEY` environment variable.
+For example:
+
+```ruby
+gitlab_rails['env'] = { 'GITLAB_BACKUP_ENCRYPTION_KEY' => "\xDE\xAD\xBE\xEF" * 8 }
+```
+
+#### Digital Ocean Spaces
+
+This example can be used for a bucket in Amsterdam (AMS3):
+
+1. Add the following to `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'AWS',
+ 'region' => 'ams3',
+ 'aws_access_key_id' => 'AKIAKIAKI',
+ 'aws_secret_access_key' => 'secret123',
+ 'endpoint' => 'https://ams3.digitaloceanspaces.com'
+ }
+ gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
+ ```
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect
+
+If you see a `400 Bad Request` error message when using Digital Ocean Spaces,
+the cause may be the use of backup encryption. Because Digital Ocean Spaces
+doesn't support encryption, remove or comment the line that contains
+`gitlab_rails['backup_encryption']`.
+
+#### Other S3 Providers
+
+Not all S3 providers are fully compatible with the Fog library. For example,
+if you see a `411 Length Required` error message after attempting to upload,
+you may need to downgrade the `aws_signature_version` value from the default
+value to `2`, [due to this issue](https://github.com/fog/fog-aws/issues/428).
+
+For installations from source:
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ # snip
+ upload:
+ # Fog storage connection settings, see https://fog.io/storage/ .
+ connection:
+ provider: AWS
+ region: eu-west-1
+ aws_access_key_id: AKIAKIAKI
+ aws_secret_access_key: 'secret123'
+ # If using an IAM Profile, leave aws_access_key_id & aws_secret_access_key empty
+ # ie. aws_access_key_id: ''
+ # use_iam_profile: 'true'
+ # The remote 'directory' to store your backups. For S3, this would be the bucket name.
+ remote_directory: 'my.s3.bucket'
+ # Specifies Amazon S3 storage class to use for backups, this is optional
+ # storage_class: 'STANDARD'
+ #
+ # Turns on AWS Server-Side Encryption with Amazon Customer-Provided Encryption Keys for backups, this is optional
+ # 'encryption' must be set in order for this to have any effect.
+ # 'encryption_key' should be set to the 256-bit encryption key for Amazon S3 to use to encrypt or decrypt.
+ # To avoid storing the key on disk, the key can also be specified via the `GITLAB_BACKUP_ENCRYPTION_KEY` your data.
+ # encryption: 'AES256'
+ # encryption_key: '<key>'
+ #
+ #
+ # Turns on AWS Server-Side Encryption with Amazon S3-Managed keys (optional)
+ # https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html
+ # For SSE-S3, set 'server_side_encryption' to 'AES256'.
+ # For SS3-KMS, set 'server_side_encryption' to 'aws:kms'. Set
+ # 'server_side_encryption_kms_key_id' to the ARN of customer master key.
+ # storage_options:
+ # server_side_encryption: 'aws:kms'
+ # server_side_encryption_kms_key_id: 'arn:aws:kms:YOUR-KEY-ID-HERE'
+ ```
+
+1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
+ for the changes to take effect
+
+If you're uploading your backups to S3, you should create a new
+IAM user with restricted access rights. To give the upload user access only for
+uploading backups create the following IAM profile, replacing `my.s3.bucket`
+with the name of your bucket:
+
+```json
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Sid": "Stmt1412062044000",
+ "Effect": "Allow",
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:ListBucketMultipartUploads",
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Resource": [
+ "arn:aws:s3:::my.s3.bucket/*"
+ ]
+ },
+ {
+ "Sid": "Stmt1412062097000",
+ "Effect": "Allow",
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Sid": "Stmt1412062128000",
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": [
+ "arn:aws:s3:::my.s3.bucket"
+ ]
+ }
+ ]
+}
+```
+
+#### Using Google Cloud Storage
+
+To use Google Cloud Storage to save backups, you must first create an
+access key from the Google console:
+
+1. Go to the [Google storage settings page](https://console.cloud.google.com/storage/settings).
+1. Select **Interoperability**, and then create an access key.
+1. Make note of the **Access Key** and **Secret** and replace them in the
+ following configurations.
+1. In the buckets advanced settings ensure the Access Control option
+ **Set object-level and bucket-level permissions** is selected.
+1. Ensure you have already created a bucket.
+
+For Omnibus GitLab packages:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'Google',
+ 'google_storage_access_key_id' => 'Access Key',
+ 'google_storage_secret_access_key' => 'Secret',
+
+ ## If you have CNAME buckets (foo.example.com), you might run into SSL issues
+ ## when uploading backups ("hostname foo.example.com.storage.googleapis.com
+ ## does not match the server certificate"). In that case, uncomnent the following
+ ## setting. See: https://github.com/fog/fog/issues/2834
+ #'path_style' => true
+ }
+ gitlab_rails['backup_upload_remote_directory'] = 'my.google.bucket'
+ ```
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect
+
+For installations from source:
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ upload:
+ connection:
+ provider: 'Google'
+ google_storage_access_key_id: 'Access Key'
+ google_storage_secret_access_key: 'Secret'
+ remote_directory: 'my.google.bucket'
+ ```
+
+1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
+ for the changes to take effect
+
+#### Using Azure Blob storage
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25877) in GitLab 13.4.
+
+For Omnibus GitLab packages:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'AzureRM',
+ 'azure_storage_account_name' => '<AZURE STORAGE ACCOUNT NAME>',
+ 'azure_storage_access_key' => '<AZURE STORAGE ACCESS KEY>',
+ 'azure_storage_domain' => 'blob.core.windows.net', # Optional
+ }
+ gitlab_rails['backup_upload_remote_directory'] = '<AZURE BLOB CONTAINER>'
+ ```
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect
+
+For installations from source:
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ upload:
+ connection:
+ provider: 'AzureRM'
+ azure_storage_account_name: '<AZURE STORAGE ACCOUNT NAME>'
+ azure_storage_access_key: '<AZURE STORAGE ACCESS KEY>'
+ remote_directory: '<AZURE BLOB CONTAINER>'
+ ```
+
+1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
+ for the changes to take effect
+
+For more details, see the [table of Azure parameters](../administration/object_storage.md#azure-blob-storage).
+
+#### Specifying a custom directory for backups
+
+This option works only for remote storage. If you want to group your backups,
+you can pass a `DIRECTORY` environment variable:
+
+```shell
+sudo gitlab-backup create DIRECTORY=daily
+sudo gitlab-backup create DIRECTORY=weekly
+```
+
+Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+
+### Skip uploading backups to remote storage
+
+If you have configured GitLab to [upload backups in a remote storage](#uploading-backups-to-a-remote-cloud-storage),
+you can use the `SKIP=remote` option to skip uploading your backups to the remote storage.
+
+For Omnibus GitLab packages:
+
+```shell
+sudo gitlab-backup create SKIP=remote
+```
+
+For installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=remote RAILS_ENV=production
+```
+
+### Uploading to locally mounted shares
+
+You may also send backups to a mounted share (for example, `NFS`,`CIFS`, or
+`SMB`) by using the Fog [`Local`](https://github.com/fog/fog-local#usage)
+storage provider. The directory pointed to by the `local_root` key _must_ be
+owned by the `git` user _when mounted_ (mounting with the `uid=` of the `git`
+user for `CIFS` and `SMB`) or the user that you are executing the backup tasks
+as (for Omnibus packages, this is the `git` user).
+
+The `backup_upload_remote_directory` _must_ be set in addition to the
+`local_root` key. This is the sub directory inside the mounted directory that
+backups are copied to, and is created if it does not exist. If the
+directory that you want to copy the tarballs to is the root of your mounted
+directory, use `.` instead.
+
+Because file system performance may affect overall GitLab performance,
+[GitLab doesn't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
+
+For Omnibus GitLab packages:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ :provider => 'Local',
+ :local_root => '/mnt/backups'
+ }
+
+ # The directory inside the mounted folder to copy backups to
+ # Use '.' to store them in the root directory
+ gitlab_rails['backup_upload_remote_directory'] = 'gitlab_backups'
+ ```
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect.
+
+For installations from source:
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ upload:
+ # Fog storage connection settings, see https://fog.io/storage/ .
+ connection:
+ provider: Local
+ local_root: '/mnt/backups'
+ # The directory inside the mounted folder to copy backups to
+ # Use '.' to store them in the root directory
+ remote_directory: 'gitlab_backups'
+ ```
+
+1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
+ for the changes to take effect.
+
+### Backup archive permissions
+
+The backup archives created by GitLab (`1393513186_2014_02_27_gitlab_backup.tar`)
+have the owner/group `git`/`git` and 0600 permissions by default. This is
+meant to avoid other system users reading GitLab data. If you need the backup
+archives to have different permissions, you can use the `archive_permissions`
+setting.
+
+For Omnibus GitLab packages:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_archive_permissions'] = 0644 # Makes the backup archives world-readable
+ ```
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect.
+
+For installations from source:
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ archive_permissions: 0644 # Makes the backup archives world-readable
+ ```
+
+1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
+ for the changes to take effect.
+
+### Configuring cron to make daily backups
+
+WARNING:
+The following cron jobs do not [back up your GitLab configuration files](#storing-configuration-files)
+or [SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
+
+You can schedule a cron job that backs up your repositories and GitLab metadata.
+
+For Omnibus GitLab packages:
+
+1. Edit the crontab for the `root` user:
+
+ ```shell
+ sudo su -
+ crontab -e
+ ```
+
+1. There, add the following line to schedule the backup for everyday at 2 AM:
+
+ ```plaintext
+ 0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
+ ```
+
+ Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+
+For installations from source:
+
+1. Edit the crontab for the `git` user:
+
+ ```shell
+ sudo -u git crontab -e
+ ```
+
+1. Add the following lines at the bottom:
+
+ ```plaintext
+ # Create a full backup of the GitLab repositories and SQL database every day at 2am
+ 0 2 * * * cd /home/git/gitlab && PATH=/usr/local/bin:/usr/bin:/bin bundle exec rake gitlab:backup:create RAILS_ENV=production CRON=1
+ ```
+
+The `CRON=1` environment setting directs the backup script to hide all progress
+output if there aren't any errors. This is recommended to reduce cron spam.
+When troubleshooting backup problems, however, replace `CRON=1` with `--trace` to log verbosely.
+
+## Limit backup lifetime for local files (prune old backups)
+
+WARNING:
+The process described in this section don't work if you used a [custom filename](#backup-filename)
+for your backups.
+
+To prevent regular backups from using all your disk space, you may want to set a limited lifetime
+for backups. The next time the backup task runs, backups older than the `backup_keep_time` are
+pruned.
+
+This configuration option manages only local files. GitLab doesn't prune old
+files stored in a third-party [object storage](#uploading-backups-to-a-remote-cloud-storage)
+because the user may not have permission to list and delete files. It's
+recommended that you configure the appropriate retention policy for your object
+storage (for example, [AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)).
+
+For Omnibus GitLab packages:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ ## Limit backup lifetime to 7 days - 604800 seconds
+ gitlab_rails['backup_keep_time'] = 604800
+ ```
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect.
+
+For installations from source:
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ ## Limit backup lifetime to 7 days - 604800 seconds
+ keep_time: 604800
+ ```
+
+1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
+ for the changes to take effect.
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index d14263f660a..33917ca9410 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -25,8 +25,8 @@ backups with your object storage provider, if desired.
To be able to back up and restore, ensure that Rsync is installed on your
system. If you installed GitLab:
-- _Using the Omnibus package_, you're all set.
-- _From source_, you need to determine if `rsync` is installed. For example:
+- _Using the Omnibus package_, Rsync is already installed.
+- _From source_, check if `rsync` is installed. If Rsync is not installed, install it. For example:
```shell
# Debian/Ubuntu
@@ -36,1281 +36,46 @@ system. If you installed GitLab:
sudo yum install rsync
```
-## Backup timestamp
-
-The backup archive is saved in `backup_path`, which is specified in the
-`config/gitlab.yml` file. The filename is `[TIMESTAMP]_gitlab_backup.tar`,
-where `TIMESTAMP` identifies the time at which each backup was created, plus
-the GitLab version. The timestamp is needed if you need to restore GitLab and
-multiple backups are available.
-
-For example, if the backup name is `1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar`,
-the timestamp is `1493107454_2018_04_25_10.6.4-ce`.
-
-## Back up GitLab
-
-GitLab provides a command line interface to back up your entire instance,
-including:
-
-- Database
-- Attachments
-- Git repositories data
-- CI/CD job output logs
-- CI/CD job artifacts
-- LFS objects
-- Terraform states ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331806) in GitLab 14.7)
-- Container Registry images
-- GitLab Pages content
-- Packages ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332006) in GitLab 14.7)
-- Snippets
-- [Group wikis](../user/project/wiki/group.md)
-
-Backups do not include:
-
-- [Mattermost data](https://docs.mattermost.com/administration/config-settings.html#file-storage)
-- Redis (and thus Sidekiq jobs)
-
-WARNING:
-GitLab does not back up any configuration files (`/etc/gitlab`), TLS keys and certificates, or system
-files. You are highly advised to read about [storing configuration files](#storing-configuration-files).
-
-WARNING:
-The backup command requires [additional parameters](#back-up-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:
-
-- GitLab 12.2 or later:
-
- ```shell
- sudo gitlab-backup create
- ```
-
-- GitLab 12.1 and earlier:
-
- ```shell
- gitlab-rake gitlab:backup:create
- ```
-
-If you installed GitLab from source, use the following command:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
-```
-
-If you're running GitLab from within a Docker container, run the backup from
-the host, based on your installed version of GitLab:
-
-- GitLab 12.2 or later:
-
- ```shell
- docker exec -t <container name> gitlab-backup create
- ```
-
-- GitLab 12.1 and earlier:
-
- ```shell
- docker exec -t <container name> gitlab-rake gitlab:backup:create
- ```
-
-If you're using the [GitLab Helm chart](https://gitlab.com/gitlab-org/charts/gitlab)
-on a Kubernetes cluster, you can run the backup task by using `kubectl` to run the `backup-utility`
-script on the GitLab toolbox pod. For more details, see the
-[charts backup documentation](https://docs.gitlab.com/charts/backup-restore/backup.html).
-
-Similar to the Kubernetes case, if you have scaled out your GitLab cluster to
-use multiple application servers, you should pick a designated node (that isn't
-auto-scaled away) for running the backup Rake task. Because the backup Rake
-task is tightly coupled to the main Rails application, this is typically a node
-on which you're also running Puma or Sidekiq.
-
-Example output:
-
-```plaintext
-Dumping database tables:
-- Dumping table events... [DONE]
-- Dumping table issues... [DONE]
-- Dumping table keys... [DONE]
-- Dumping table merge_requests... [DONE]
-- Dumping table milestones... [DONE]
-- Dumping table namespaces... [DONE]
-- Dumping table notes... [DONE]
-- Dumping table projects... [DONE]
-- Dumping table protected_branches... [DONE]
-- Dumping table schema_migrations... [DONE]
-- Dumping table services... [DONE]
-- Dumping table snippets... [DONE]
-- Dumping table taggings... [DONE]
-- Dumping table tags... [DONE]
-- Dumping table users... [DONE]
-- Dumping table users_projects... [DONE]
-- Dumping table web_hooks... [DONE]
-- Dumping table wikis... [DONE]
-Dumping repositories:
-- Dumping repository abcd... [DONE]
-Creating backup archive: $TIMESTAMP_gitlab_backup.tar [DONE]
-Deleting tmp directories...[DONE]
-Deleting old backups... [SKIPPING]
-```
-
-### Storing configuration files
-
-The [backup Rake task](#back-up-gitlab) GitLab provides does _not_ store your
-configuration files. The primary reason for this is that your database contains
-items including encrypted information for two-factor authentication and the
-CI/CD _secure variables_. Storing encrypted information in the same location
-as its key defeats the purpose of using encryption in the first place.
-
-WARNING:
-The secrets file is essential to preserve your database encryption key.
-
-At the very **minimum**, you must back up:
-
-For Omnibus:
-
-- `/etc/gitlab/gitlab-secrets.json`
-- `/etc/gitlab/gitlab.rb`
-
-For installation from source:
-
-- `/home/git/gitlab/config/secrets.yml`
-- `/home/git/gitlab/config/gitlab.yml`
-
-For [Docker installations](https://docs.gitlab.com/omnibus/docker/), you must
-back up the volume where the configuration files are stored. If you created
-the GitLab container according to the documentation, it should be in the
-`/srv/gitlab/config` directory.
-
-For [GitLab Helm chart installations](https://gitlab.com/gitlab-org/charts/gitlab)
-on a Kubernetes cluster, you must follow the
-[Back up the secrets](https://docs.gitlab.com/charts/backup-restore/backup.html#backup-the-secrets)
-instructions.
-
-You may also want to back up any TLS keys and certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), and your
-[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
-to avoid man-in-the-middle attack warnings if you have to perform a full machine restore.
-
-If you use Omnibus GitLab, review additional information to
-[backup your configuration](https://docs.gitlab.com/omnibus/settings/backups.html).
-
-In the unlikely event that the secrets file is lost, see the
-[troubleshooting section](#when-the-secrets-file-is-lost).
-
-### Backup options
-
-The command line tool GitLab provides to backup your instance can accept more
-options.
-
-#### Backup strategy option
-
-The default backup strategy is to essentially stream data from the respective
-data locations to the backup using the Linux command `tar` and `gzip`. This works
-fine in most cases, but can cause problems when data is rapidly changing.
-
-When data changes while `tar` is reading it, the error `file changed as we read
-it` may occur, and causes the backup process to fail. To combat this, 8.17
-introduces a new backup strategy called `copy`. The strategy copies data files
-to a temporary location before calling `tar` and `gzip`, avoiding the error.
-
-A side-effect is that the backup process takes up to an additional 1X disk
-space. The process does its best to clean up the temporary files at each stage
-so the problem doesn't compound, but it could be a considerable change for large
-installations. This is why the `copy` strategy is not the default in 8.17.
-
-To use the `copy` strategy instead of the default streaming strategy, specify
-`STRATEGY=copy` in the Rake task command. For example:
-
-```shell
-sudo gitlab-backup create STRATEGY=copy
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-#### Backup filename
-
-WARNING:
-If you use a custom backup filename, you can't
-[limit the lifetime of the backups](#limit-backup-lifetime-for-local-files-prune-old-backups).
-
-By default, a backup file is created according to the specification in the
-previous [Backup timestamp](#backup-timestamp) section. You can, however,
-override the `[TIMESTAMP]` portion of the filename by setting the `BACKUP`
-environment variable. For example:
-
-```shell
-sudo gitlab-backup create BACKUP=dump
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-The resulting file is named `dump_gitlab_backup.tar`. This is useful for
-systems that make use of rsync and incremental backups, and results in
-considerably faster transfer speeds.
-
-#### Confirm archive can be transferred
-
-To ensure the generated archive is transferable by rsync, you can set the `GZIP_RSYNCABLE=yes`
-option. This sets the `--rsyncable` option to `gzip`, which is useful only in
-combination with setting [the Backup filename option](#backup-filename).
-
-Note that the `--rsyncable` option in `gzip` isn't guaranteed to be available
-on all distributions. To verify that it's available in your distribution, run
-`gzip --help` or consult the man pages.
-
-```shell
-sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-#### Excluding specific directories from the backup
-
-You can exclude specific directories from the backup by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
-
-- `db` (database)
-- `uploads` (attachments)
-- `builds` (CI job output logs)
-- `artifacts` (CI job artifacts)
-- `lfs` (LFS objects)
-- `terraform_state` (Terraform states)
-- `registry` (Container Registry images)
-- `pages` (Pages content)
-- `repositories` (Git repositories data)
-- `packages` (Packages)
-
-All wikis are backed up as part of the `repositories` group. Non-existent wikis are skipped during a backup.
-
-NOTE:
-When [backing up and restoring Helm Charts](https://docs.gitlab.com/charts/architecture/backup-restore.html), there is an additional option `packages`, which refers to any packages managed by the GitLab [package registry](../user/packages/package_registry/index.md).
-For more information see [command line arguments](https://docs.gitlab.com/charts/architecture/backup-restore.html#command-line-arguments).
-
-All wikis are backed up as part of the `repositories` group. Non-existent
-wikis are skipped during a backup.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup create SKIP=db,uploads
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create SKIP=db,uploads RAILS_ENV=production
-```
-
-#### Skipping tar creation
-
-NOTE:
-It is not possible to skip the tar creation when using [object storage](#uploading-backups-to-a-remote-cloud-storage) for backups.
-
-The last part of creating a backup is generation of a `.tar` file containing
-all the parts. In some cases (for example, if the backup is picked up by other
-backup software) creating a `.tar` file might be wasted effort or even directly
-harmful, so you can skip this step by adding `tar` to the `SKIP` environment
-variable.
-
-Adding `tar` to the `SKIP` variable leaves the files and directories containing the
-backup in the directory used for the intermediate files. These files are
-overwritten when a new backup is created, so you should make sure they are copied
-elsewhere, because you can only have one backup on the system.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup create SKIP=tar
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create SKIP=tar RAILS_ENV=production
-```
-
-#### Disabling prompts during restore
-
-During a restore from backup, the restore script may ask for confirmation before
-proceeding. If you wish to disable these prompts, you can set the `GITLAB_ASSUME_YES`
-environment variable to `1`.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo GITLAB_ASSUME_YES=1 gitlab-backup restore
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H GITLAB_ASSUME_YES=1 bundle exec rake gitlab:backup:restore RAILS_ENV=production
-```
-
-#### Back up Git repositories concurrently
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37158) in GitLab 13.3.
-> - [Concurrent restore introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69330) in GitLab 14.3
-
-When using [multiple repository storages](../administration/repository_storage_paths.md),
-repositories can be backed up or restored concurrently to help fully use CPU time. The
-following variables are available to modify the default behavior of the Rake
-task:
-
-- `GITLAB_BACKUP_MAX_CONCURRENCY`: The maximum number of projects to back up at
- the same time. Defaults to the number of logical CPUs (in GitLab 14.1 and
- earlier, defaults to `1`).
-- `GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY`: The maximum number of projects to
- back up at the same time on each storage. This allows the repository backups
- to be spread across storages. Defaults to `2` (in GitLab 14.1 and earlier,
- defaults to `1`).
-
-For example, for Omnibus GitLab installations with 4 repository storages:
-
-```shell
-sudo gitlab-backup create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
-```
-
-For example, for installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
-```
-
-#### Incremental repository backups
-
-> - Introduced in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `incremental_repository_backup`. Disabled by default.
-> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/355945) in GitLab 14.10.
-> - `PREVIOUS_BACKUP` option [introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/4184) in GitLab 15.0.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
-On GitLab.com, this feature is not available.
-
-Incremental backups can be faster than full backups because they only pack changes since the last backup into the backup
-bundle for each repository. There must be an existing backup to create an incremental backup from:
-
-- In GitLab 14.9 and 14.10, use the `BACKUP=<timestamp_of_backup>` option to choose the backup to use. The chosen previous backup is overwritten.
-- In GitLab 15.0 and later, use the `PREVIOUS_BACKUP=<timestamp_of_backup>` option to choose the backup to use. By default, a backup file is created
- as documented in the [Backup timestamp](#backup-timestamp) section. You can override the `[TIMESTAMP]` portion of the filename by setting the
- [`BACKUP` environment variable](#backup-filename).
-
-To create an incremental backup, run:
-
-```shell
-sudo gitlab-backup create INCREMENTAL=yes PREVIOUS_BACKUP=<timestamp_of_backup>
-```
-
-Incremental backups can also be created from [an untarred backup](#skipping-tar-creation) by using `SKIP=tar`:
-
-```shell
-sudo gitlab-backup create INCREMENTAL=yes SKIP=tar
-```
-
-#### Back up specific repository storages
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
-
-When using [multiple repository storages](../administration/repository_storage_paths.md),
-repositories from specific repository storages can be backed up separately
-using the `REPOSITORIES_STORAGES` option. The option accepts a comma-separated list of
-storage names.
-
-For example, for Omnibus GitLab installations:
-
-```shell
-sudo gitlab-backup create REPOSITORIES_STORAGES=storage1,storage2
-```
-
-For example, for installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_STORAGES=storage1,storage2
-```
-
-#### Back up specific repositories
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
-
-You can back up a specific repositories using the `REPOSITORIES_PATHS` option.
-The option accepts a comma-separated list of project and group paths. If you
-specify a group path, all repositories in all projects in the group and
-descendent groups are included.
-
-For example, to back up all repositories for all projects in **Group A** (`group-a`), and the repository for **Project C** in **Group B** (`group-b/project-c`):
-
-- Omnibus GitLab installations:
-
- ```shell
- sudo gitlab-backup create REPOSITORIES_PATHS=group-a,group-b/project-c
- ```
-
-- Installations from source:
-
- ```shell
- sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_PATHS=group-a,group-b/project-c
- ```
-
-#### Uploading backups to a remote (cloud) storage
-
-NOTE:
-It is not possible to [skip the tar creation](#skipping-tar-creation) when using object storage for backups.
-
-You can let the backup script upload (using the [Fog library](https://fog.io/))
-the `.tar` file it creates. In the following example, we use Amazon S3 for
-storage, but Fog also lets you use [other storage providers](https://fog.io/storage/).
-GitLab also [imports cloud drivers](https://gitlab.com/gitlab-org/gitlab/-/blob/da46c9655962df7d49caef0e2b9f6bbe88462a02/Gemfile#L113)
-for AWS, Google, OpenStack Swift, Rackspace, and Aliyun. A local driver is
-[also available](#uploading-to-locally-mounted-shares).
-
-[Read more about using object storage with GitLab](../administration/object_storage.md).
-
-##### Using Amazon S3
-
-For Omnibus GitLab packages:
-
-1. Add the following to `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'eu-west-1',
- 'aws_access_key_id' => 'AKIAKIAKI',
- 'aws_secret_access_key' => 'secret123'
- # If using an IAM Profile, don't configure aws_access_key_id & aws_secret_access_key
- # 'use_iam_profile' => true
- }
- gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect
-
-##### S3 Encrypted Buckets
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64765) in GitLab 14.3.
-
-AWS supports these [modes for server side encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html):
-
-- Amazon S3-Managed Keys (SSE-S3)
-- Customer Master Keys (CMKs) Stored in AWS Key Management Service (SSE-KMS)
-- Customer-Provided Keys (SSE-C)
-
-Use your mode of choice with GitLab. Each mode has similar, but slightly
-different, configuration methods.
-
-###### SSE-S3
-
-To enable SSE-S3, in the backup storage options set the `server_side_encryption`
-field to `AES256`. For example, in Omnibus GitLab:
-
-```ruby
-gitlab_rails['backup_upload_storage_options'] = {
- 'server_side_encryption' => 'AES256'
-}
-```
-
-###### SSE-KMS
-
-To enable SSE-KMS, you'll need the [KMS key via its Amazon Resource Name (ARN)
-in the `arn:aws:kms:region:acct-id:key/key-id` format](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html). Under the `backup_upload_storage_options` configuration setting, set:
-
-- `server_side_encryption` to `aws:kms`.
-- `server_side_encryption_kms_key_id` to the ARN of the key.
-
-For example, in Omnibus GitLab:
-
-```ruby
-gitlab_rails['backup_upload_storage_options'] = {
- 'server_side_encryption' => 'aws:kms',
- 'server_side_encryption_kms_key_id' => 'arn:aws:<YOUR KMS KEY ID>:'
-}
-```
-
-###### SSE-C
-
-SSE-C requires you to set these encryption options:
-
-- `backup_encryption`: AES256.
-- `backup_encryption_key`: Unencoded, 32-byte (256 bits) key. The upload fails if this isn't exactly 32 bytes.
-
-For example, in Omnibus GitLab:
-
-```ruby
-gitlab_rails['backup_encryption'] = 'AES256'
-gitlab_rails['backup_encryption_key'] = '<YOUR 32-BYTE KEY HERE>'
-```
-
-If the key contains binary characters and cannot be encoded in UTF-8,
-instead, specify the key with the `GITLAB_BACKUP_ENCRYPTION_KEY` environment variable.
-For example:
+### `gitaly-backup` for repository backup and restore
-```ruby
-gitlab_rails['env'] = { 'GITLAB_BACKUP_ENCRYPTION_KEY' => "\xDE\xAD\xBE\xEF" * 8 }
-```
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.2.
+> - [Deployed behind a feature flag](../user/feature_flags.md), enabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.10. [Feature flag `gitaly_backup`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83254) removed.
-##### Digital Ocean Spaces
+The `gitaly-backup` binary is used by the backup Rake task to create and restore repository backups from Gitaly.
+`gitaly-backup` replaces the previous backup method that directly calls RPCs on Gitaly from GitLab.
-This example can be used for a bucket in Amsterdam (AMS3):
+The backup Rake task must be able to find this executable. In most cases, you don't need to change
+the path to the binary as it should work fine with the default path `/opt/gitlab/embedded/bin/gitaly-backup`.
+If you have a specific reason to change the path, it can be configured in Omnibus GitLab packages:
1. Add the following to `/etc/gitlab/gitlab.rb`:
```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'ams3',
- 'aws_access_key_id' => 'AKIAKIAKI',
- 'aws_secret_access_key' => 'secret123',
- 'endpoint' => 'https://ams3.digitaloceanspaces.com'
- }
- gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect
-
-If you see a `400 Bad Request` error message when using Digital Ocean Spaces,
-the cause may be the use of backup encryption. Because Digital Ocean Spaces
-doesn't support encryption, remove or comment the line that contains
-`gitlab_rails['backup_encryption']`.
-
-##### Other S3 Providers
-
-Not all S3 providers are fully compatible with the Fog library. For example,
-if you see a `411 Length Required` error message after attempting to upload,
-you may need to downgrade the `aws_signature_version` value from the default
-value to `2`, [due to this issue](https://github.com/fog/fog-aws/issues/428).
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- # snip
- upload:
- # Fog storage connection settings, see https://fog.io/storage/ .
- connection:
- provider: AWS
- region: eu-west-1
- aws_access_key_id: AKIAKIAKI
- aws_secret_access_key: 'secret123'
- # If using an IAM Profile, leave aws_access_key_id & aws_secret_access_key empty
- # ie. aws_access_key_id: ''
- # use_iam_profile: 'true'
- # The remote 'directory' to store your backups. For S3, this would be the bucket name.
- remote_directory: 'my.s3.bucket'
- # Specifies Amazon S3 storage class to use for backups, this is optional
- # storage_class: 'STANDARD'
- #
- # Turns on AWS Server-Side Encryption with Amazon Customer-Provided Encryption Keys for backups, this is optional
- # 'encryption' must be set in order for this to have any effect.
- # 'encryption_key' should be set to the 256-bit encryption key for Amazon S3 to use to encrypt or decrypt.
- # To avoid storing the key on disk, the key can also be specified via the `GITLAB_BACKUP_ENCRYPTION_KEY` your data.
- # encryption: 'AES256'
- # encryption_key: '<key>'
- #
- #
- # Turns on AWS Server-Side Encryption with Amazon S3-Managed keys (optional)
- # https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html
- # For SSE-S3, set 'server_side_encryption' to 'AES256'.
- # For SS3-KMS, set 'server_side_encryption' to 'aws:kms'. Set
- # 'server_side_encryption_kms_key_id' to the ARN of customer master key.
- # storage_options:
- # server_side_encryption: 'aws:kms'
- # server_side_encryption_kms_key_id: 'arn:aws:kms:YOUR-KEY-ID-HERE'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect
-
-If you're uploading your backups to S3, you should create a new
-IAM user with restricted access rights. To give the upload user access only for
-uploading backups create the following IAM profile, replacing `my.s3.bucket`
-with the name of your bucket:
-
-```json
-{
- "Version": "2012-10-17",
- "Statement": [
- {
- "Sid": "Stmt1412062044000",
- "Effect": "Allow",
- "Action": [
- "s3:AbortMultipartUpload",
- "s3:GetBucketAcl",
- "s3:GetBucketLocation",
- "s3:GetObject",
- "s3:GetObjectAcl",
- "s3:ListBucketMultipartUploads",
- "s3:PutObject",
- "s3:PutObjectAcl"
- ],
- "Resource": [
- "arn:aws:s3:::my.s3.bucket/*"
- ]
- },
- {
- "Sid": "Stmt1412062097000",
- "Effect": "Allow",
- "Action": [
- "s3:GetBucketLocation",
- "s3:ListAllMyBuckets"
- ],
- "Resource": [
- "*"
- ]
- },
- {
- "Sid": "Stmt1412062128000",
- "Effect": "Allow",
- "Action": [
- "s3:ListBucket"
- ],
- "Resource": [
- "arn:aws:s3:::my.s3.bucket"
- ]
- }
- ]
-}
-```
-
-##### Using Google Cloud Storage
-
-To use Google Cloud Storage to save backups, you must first create an
-access key from the Google console:
-
-1. Go to the [Google storage settings page](https://console.cloud.google.com/storage/settings).
-1. Select **Interoperability**, and then create an access key.
-1. Make note of the **Access Key** and **Secret** and replace them in the
- following configurations.
-1. In the buckets advanced settings ensure the Access Control option
- **Set object-level and bucket-level permissions** is selected.
-1. Ensure you have already created a bucket.
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'Google',
- 'google_storage_access_key_id' => 'Access Key',
- 'google_storage_secret_access_key' => 'Secret',
-
- ## If you have CNAME buckets (foo.example.com), you might run into SSL issues
- ## when uploading backups ("hostname foo.example.com.storage.googleapis.com
- ## does not match the server certificate"). In that case, uncomnent the following
- ## setting. See: https://github.com/fog/fog/issues/2834
- #'path_style' => true
- }
- gitlab_rails['backup_upload_remote_directory'] = 'my.google.bucket'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- upload:
- connection:
- provider: 'Google'
- google_storage_access_key_id: 'Access Key'
- google_storage_secret_access_key: 'Secret'
- remote_directory: 'my.google.bucket'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect
-
-##### Using Azure Blob storage
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25877) in GitLab 13.4.
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'AzureRM',
- 'azure_storage_account_name' => '<AZURE STORAGE ACCOUNT NAME>',
- 'azure_storage_access_key' => '<AZURE STORAGE ACCESS KEY>',
- 'azure_storage_domain' => 'blob.core.windows.net', # Optional
- }
- gitlab_rails['backup_upload_remote_directory'] = '<AZURE BLOB CONTAINER>'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- upload:
- connection:
- provider: 'AzureRM'
- azure_storage_account_name: '<AZURE STORAGE ACCOUNT NAME>'
- azure_storage_access_key: '<AZURE STORAGE ACCESS KEY>'
- remote_directory: '<AZURE BLOB CONTAINER>'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect
-
-For more details, see the [table of Azure parameters](../administration/object_storage.md#azure-blob-storage).
-
-##### Specifying a custom directory for backups
-
-This option works only for remote storage. If you want to group your backups,
-you can pass a `DIRECTORY` environment variable:
-
-```shell
-sudo gitlab-backup create DIRECTORY=daily
-sudo gitlab-backup create DIRECTORY=weekly
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-#### Skip uploading backups to remote storage
-
-If you have configured GitLab to [upload backups in a remote storage](#uploading-backups-to-a-remote-cloud-storage),
-you can use the `SKIP=remote` option to skip uploading your backups to the remote storage.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup create SKIP=remote
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create SKIP=remote RAILS_ENV=production
-```
-
-#### Uploading to locally mounted shares
-
-You may also send backups to a mounted share (for example, `NFS`,`CIFS`, or
-`SMB`) by using the Fog [`Local`](https://github.com/fog/fog-local#usage)
-storage provider. The directory pointed to by the `local_root` key _must_ be
-owned by the `git` user _when mounted_ (mounting with the `uid=` of the `git`
-user for `CIFS` and `SMB`) or the user that you are executing the backup tasks
-as (for Omnibus packages, this is the `git` user).
-
-The `backup_upload_remote_directory` _must_ be set in addition to the
-`local_root` key. This is the sub directory inside the mounted directory that
-backups are copied to, and is created if it does not exist. If the
-directory that you want to copy the tarballs to is the root of your mounted
-directory, use `.` instead.
-
-Because file system performance may affect overall GitLab performance,
-[GitLab doesn't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- :provider => 'Local',
- :local_root => '/mnt/backups'
- }
-
- # The directory inside the mounted folder to copy backups to
- # Use '.' to store them in the root directory
- gitlab_rails['backup_upload_remote_directory'] = 'gitlab_backups'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect.
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- upload:
- # Fog storage connection settings, see https://fog.io/storage/ .
- connection:
- provider: Local
- local_root: '/mnt/backups'
- # The directory inside the mounted folder to copy backups to
- # Use '.' to store them in the root directory
- remote_directory: 'gitlab_backups'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect.
-
-#### Backup archive permissions
-
-The backup archives created by GitLab (`1393513186_2014_02_27_gitlab_backup.tar`)
-have the owner/group `git`/`git` and 0600 permissions by default. This is
-meant to avoid other system users reading GitLab data. If you need the backup
-archives to have different permissions, you can use the `archive_permissions`
-setting.
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_archive_permissions'] = 0644 # Makes the backup archives world-readable
+ gitlab_rails['backup_gitaly_backup_path'] = '/path/to/gitaly-backup'
```
1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
for the changes to take effect.
-For installations from source:
-
-1. Edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- archive_permissions: 0644 # Makes the backup archives world-readable
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect.
-
-#### Configuring cron to make daily backups
-
-WARNING:
-The following cron jobs do not [back up your GitLab configuration files](#storing-configuration-files)
-or [SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
-
-You can schedule a cron job that backs up your repositories and GitLab metadata.
-
-For Omnibus GitLab packages:
-
-1. Edit the crontab for the `root` user:
-
- ```shell
- sudo su -
- crontab -e
- ```
-
-1. There, add the following line to schedule the backup for everyday at 2 AM:
-
- ```plaintext
- 0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
- ```
-
- Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-For installations from source:
-
-1. Edit the crontab for the `git` user:
-
- ```shell
- sudo -u git crontab -e
- ```
-
-1. Add the following lines at the bottom:
-
- ```plaintext
- # Create a full backup of the GitLab repositories and SQL database every day at 2am
- 0 2 * * * cd /home/git/gitlab && PATH=/usr/local/bin:/usr/bin:/bin bundle exec rake gitlab:backup:create RAILS_ENV=production CRON=1
- ```
-
-The `CRON=1` environment setting directs the backup script to hide all progress
-output if there aren't any errors. This is recommended to reduce cron spam.
-When troubleshooting backup problems, however, replace `CRON=1` with `--trace` to log verbosely.
-
-### Limit backup lifetime for local files (prune old backups)
-
-WARNING:
-The process described in this section don't work if you used a [custom filename](#backup-filename)
-for your backups.
-
-To prevent regular backups from using all your disk space, you may want to set a limited lifetime
-for backups. The next time the backup task runs, backups older than the `backup_keep_time` are
-pruned.
-
-This configuration option manages only local files. GitLab doesn't prune old
-files stored in a third-party [object storage](#uploading-backups-to-a-remote-cloud-storage)
-because the user may not have permission to list and delete files. It's
-recommended that you configure the appropriate retention policy for your object
-storage (for example, [AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)).
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- ## Limit backup lifetime to 7 days - 604800 seconds
- gitlab_rails['backup_keep_time'] = 604800
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect.
+## Backup timestamp
-For installations from source:
+The backup archive is saved in `backup_path`, which is specified in the
+`config/gitlab.yml` file. The filename is `[TIMESTAMP]_gitlab_backup.tar`,
+where `TIMESTAMP` identifies the time at which each backup was created, plus
+the GitLab version. The timestamp is needed if you need to restore GitLab and
+multiple backups are available.
-1. Edit `/home/git/gitlab/config/gitlab.yml`:
+For example, if the backup name is `1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar`,
+the timestamp is `1493107454_2018_04_25_10.6.4-ce`.
- ```yaml
- backup:
- ## Limit backup lifetime to 7 days - 604800 seconds
- keep_time: 604800
- ```
+## Back up GitLab
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect.
+For detailed information on backing up GitLab, see [Backup GitLab](backup_gitlab.md).
## Restore GitLab
-GitLab provides a command line interface to restore your entire installation,
-and is flexible enough to fit your needs.
-
-The [restore prerequisites section](#restore-prerequisites) includes crucial
-information. Be sure to read and test the complete restore process at least
-once before attempting to perform it in a production environment.
-
-You can restore a backup only to _the exact same version and type (CE/EE)_ of
-GitLab that you created it on (for example CE 9.1.0).
-
-If your backup is a different version than the current installation, you must
-[downgrade your GitLab installation](../update/package/downgrade.md)
-before restoring the backup.
-
-### Restore prerequisites
-
-You need to have a working GitLab installation before you can perform a
-restore. This is because the system user performing the restore actions (`git`)
-is usually not allowed to create or delete the SQL database needed to import
-data into (`gitlabhq_production`). All existing data is either erased
-(SQL) or moved to a separate directory (such as repositories and uploads).
-
-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/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
-loses access to your GitLab server.
-
-You may also want to restore your previous `/etc/gitlab/gitlab.rb` (for Omnibus packages)
-or `/home/git/gitlab/config/gitlab.yml` (for installations from source) and
-any TLS keys, certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), or
-[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
-
-Starting with GitLab 12.9, if an untarred backup (like the ones made with
-`SKIP=tar`) is found, and no backup is chosen with `BACKUP=<timestamp>`, the
-untarred backup is used.
-
-Depending on your case, you might want to run the restore command with one or
-more of the following options:
-
-- `BACKUP=timestamp_of_backup`: Required if more than one backup exists.
- Read what the [backup timestamp is about](#backup-timestamp).
-- `force=yes`: Doesn't ask if the `authorized_keys` file should get regenerated,
- and assumes 'yes' for warning about database tables being removed,
- enabling the `Write to authorized_keys file` setting, and updating LDAP
- providers.
-
-If you're restoring into directories that are mount points, you must ensure these directories are
-empty before attempting a restore. Otherwise, GitLab attempts to move these directories before
-restoring the new data, which causes an error.
-
-Read more about [configuring NFS mounts](../administration/nfs.md)
-
-### Restore for Omnibus GitLab installations
-
-This procedure assumes that:
-
-- You have installed the **exact same version and type (CE/EE)** of GitLab
- Omnibus with which the backup was created.
-- You have run `sudo gitlab-ctl reconfigure` at least once.
-- GitLab is running. If not, start it using `sudo gitlab-ctl start`.
-
-First ensure your backup tar file is in the backup directory described in the
-`gitlab.rb` configuration `gitlab_rails['backup_path']`. The default is
-`/var/opt/gitlab/backups`. The backup file needs to be owned by the `git` user.
-
-```shell
-sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /var/opt/gitlab/backups/
-sudo chown git:git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
-```
-
-Stop the processes that are connected to the database. Leave the rest of GitLab
-running:
-
-```shell
-sudo gitlab-ctl stop puma
-sudo gitlab-ctl stop sidekiq
-# Verify
-sudo gitlab-ctl status
-```
-
-Next, restore the backup, specifying the timestamp of the backup you wish to
-restore:
-
-```shell
-# This command will overwrite the contents of your GitLab database!
-sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:restore` instead.
-Some [known non-blocking error messages may appear](#restoring-database-backup-using-omnibus-packages-outputs-warnings).
-
-WARNING:
-`gitlab-rake gitlab:backup:restore` doesn't set the correct file system
-permissions on your Registry directory. This is a [known issue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759).
-In GitLab 12.2 or later, you can use `gitlab-backup restore` to avoid this
-issue.
-
-If there's a GitLab version mismatch between your backup tar file and the
-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.
-
-WARNING:
-The restore command requires [additional parameters](#back-up-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).
-
-Reconfigure, restart and [check](../administration/raketasks/maintenance.md#check-gitlab-configuration) GitLab:
-
-```shell
-sudo gitlab-ctl reconfigure
-sudo gitlab-ctl restart
-sudo gitlab-rake gitlab:check SANITIZE=true
-```
-
-In GitLab 13.1 and later, check [database values can be decrypted](../administration/raketasks/check.md#verify-database-values-can-be-decrypted-using-the-current-secrets)
-especially if `/etc/gitlab/gitlab-secrets.json` was restored, or if a different server is
-the target for the restore.
-
-```shell
-sudo gitlab-rake gitlab:doctor:secrets
-```
-
-For added assurance, you can perform [an integrity check on the uploaded files](../administration/raketasks/check.md#uploaded-files-integrity):
-
-```shell
-sudo gitlab-rake gitlab:artifacts:check
-sudo gitlab-rake gitlab:lfs:check
-sudo gitlab-rake gitlab:uploads:check
-```
-
-### Restore for Docker image and GitLab Helm chart installations
-
-For GitLab installations using the Docker image or the GitLab Helm chart on a
-Kubernetes cluster, the restore task expects the restore directories to be
-empty. However, with Docker and Kubernetes volume mounts, some system level
-directories may be created at the volume roots, such as the `lost+found`
-directory found in Linux operating systems. These directories are usually owned
-by `root`, which can cause access permission errors since the restore Rake task
-runs as the `git` user. To restore a GitLab installation, users have to confirm
-the restore target directories are empty.
-
-For both these installation types, the backup tarball has to be available in
-the backup location (default location is `/var/opt/gitlab/backups`).
-
-For Docker installations, the restore task can be run from host:
-
-```shell
-# Stop the processes that are connected to the database
-docker exec -it <name of container> gitlab-ctl stop puma
-docker exec -it <name of container> gitlab-ctl stop sidekiq
-
-# Verify that the processes are all down before continuing
-docker exec -it <name of container> gitlab-ctl status
-
-# Run the restore. NOTE: "_gitlab_backup.tar" is omitted from the name
-docker exec -it <name of container> gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
-
-# Restart the GitLab container
-docker restart <name of container>
-
-# Check GitLab
-docker exec -it <name of container> gitlab-rake gitlab:check SANITIZE=true
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-WARNING:
-`gitlab-rake gitlab:backup:restore` doesn't set the correct file system
-permissions on your Registry directory. This is a [known issue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759).
-In GitLab 12.2 or later, you can use `gitlab-backup restore` to avoid this
-issue.
-
-The GitLab Helm chart uses a different process, documented in
-[restoring a GitLab Helm chart installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/restore.md).
-
-### Restore for installation from source
-
-First, ensure your backup tar file is in the backup directory described in the
-`gitlab.yml` configuration:
-
-```yaml
-## Backup settings
-backup:
- path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/)
-```
-
-The default is `/home/git/gitlab/tmp/backups`, and it needs to be owned by the `git` user. Now, you can begin the backup procedure:
-
-```shell
-# Stop processes that are connected to the database
-sudo service gitlab stop
-
-sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production
-```
-
-Example output:
-
-```plaintext
-Unpacking backup... [DONE]
-Restoring database tables:
--- create_table("events", {:force=>true})
- -> 0.2231s
-[...]
-- Loading fixture events...[DONE]
-- Loading fixture issues...[DONE]
-- Loading fixture keys...[SKIPPING]
-- Loading fixture merge_requests...[DONE]
-- Loading fixture milestones...[DONE]
-- Loading fixture namespaces...[DONE]
-- Loading fixture notes...[DONE]
-- Loading fixture projects...[DONE]
-- Loading fixture protected_branches...[SKIPPING]
-- Loading fixture schema_migrations...[DONE]
-- Loading fixture services...[SKIPPING]
-- Loading fixture snippets...[SKIPPING]
-- Loading fixture taggings...[SKIPPING]
-- Loading fixture tags...[SKIPPING]
-- Loading fixture users...[DONE]
-- Loading fixture users_projects...[DONE]
-- Loading fixture web_hooks...[SKIPPING]
-- Loading fixture wikis...[SKIPPING]
-Restoring repositories:
-- Restoring repository abcd... [DONE]
-- Object pool 1 ...
-Deleting tmp directories...[DONE]
-```
-
-Next, restore `/home/git/gitlab/.secret` if necessary, [as previously mentioned](#restore-prerequisites).
-
-Restart GitLab:
-
-```shell
-sudo service gitlab restart
-```
-
-### Restoring only one or a few projects or groups from a backup
-
-Although the Rake task used to restore a GitLab instance doesn't support
-restoring a single project or group, you can use a workaround by restoring
-your backup to a separate, temporary GitLab instance, and then export your
-project or group from there:
-
-1. [Install a new GitLab](../install/index.md) instance at the same version as
- the backed-up instance from which you want to restore.
-1. [Restore the backup](#restore-gitlab) into this new instance, then
- export your [project](../user/project/settings/import_export.md)
- or [group](../user/group/settings/import_export.md). Be sure to read the
- **Important Notes** on either export feature's documentation to understand
- what is and isn't exported.
-1. After the export is complete, go to the old instance and then import it.
-1. After importing the projects or groups that you wanted is complete, you may
- delete the new, temporary GitLab instance.
-
-A feature request to provide direct restore of individual projects or groups
-is being discussed in [issue #17517](https://gitlab.com/gitlab-org/gitlab/-/issues/17517).
-
-### Restore options
-
-The command line tool GitLab provides to restore from backup can accept more
-options.
-
-#### Excluding tasks on restore
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19347) in GitLab 14.10.
-
-You can exclude specific tasks on restore by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
-
-- `db` (database)
-- `uploads` (attachments)
-- `builds` (CI job output logs)
-- `artifacts` (CI job artifacts)
-- `lfs` (LFS objects)
-- `terraform_state` (Terraform states)
-- `registry` (Container Registry images)
-- `pages` (Pages content)
-- `repositories` (Git repositories data)
-- `packages` (Packages)
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup restore BACKUP=timestamp_of_backup SKIP=db,uploads
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup SKIP=db,uploads RAILS_ENV=production
-```
-
-#### Restore specific repository storages
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
-
-When using [multiple repository storages](../administration/repository_storage_paths.md),
-repositories from specific repository storages can be restored separately
-using the `REPOSITORIES_STORAGES` option. The option accepts a comma-separated list of
-storage names.
-
-For example, for Omnibus GitLab installations:
-
-```shell
-sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
-```
-
-For example, for installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
-```
-
-#### Restore specific repositories
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
-
-You can restore specific repositories using the `REPOSITORIES_PATHS` option.
-The option accepts a comma-separated list of project and group paths. If you
-specify a group path, all repositories in all projects in the group and
-descendent groups are included. The project and group repositories must exist
-within the specified backup.
-
-For example, to restore all repositories for all projects in **Group A** (`group-a`), and the repository for **Project C** in **Group B** (`group-b/project-c`):
-
-- Omnibus GitLab installations:
-
- ```shell
- sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c
- ```
-
-- Installations from source:
-
- ```shell
- sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c
- ```
+For detailed information on restoring GitLab, see [Restore GitLab](restore_gitlab.md).
## Alternative backup strategies
@@ -1341,7 +106,7 @@ practical use.
### Back up repository data separately
-First, ensure you back up existing GitLab data while [skipping repositories](#excluding-specific-directories-from-the-backup):
+First, ensure you back up existing GitLab data while [skipping repositories](backup_gitlab.md#excluding-specific-directories-from-the-backup):
```shell
# for Omnibus GitLab package installations
@@ -1710,7 +475,7 @@ For more information, see:
### When the secrets file is lost
-If you didn't [back up the secrets file](#storing-configuration-files), you
+If you didn't [back up the secrets file](backup_gitlab.md#storing-configuration-files), you
must complete several steps to get GitLab working properly again.
The secrets file is responsible for storing the encryption key for the columns
@@ -1754,7 +519,7 @@ Be sure to create a full database backup before attempting any changes.
#### Disable user two-factor authentication (2FA)
Users with 2FA enabled can't sign in to GitLab. In that case, you must
-[disable 2FA for everyone](../security/two_factor_authentication.md#disable-2fa-for-everyone),
+[disable 2FA for everyone](../security/two_factor_authentication.md#for-all-users),
after which users must reactivate 2FA.
#### Reset CI/CD variables
@@ -1989,24 +754,222 @@ If this happens, examine the following:
- If NFS is being used, check if the mount option `timeout` is set. The
default is `600`, and changing this to smaller values results in this error.
-### `gitaly-backup` for repository backup and restore
+### Backup fails with `File name too long` error
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.2.
-> - [Deployed behind a feature flag](../user/feature_flags.md), enabled by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.10. [Feature flag `gitaly_backup`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83254) removed.
+During backup, you can get the `File name too long` error ([issue #354984](https://gitlab.com/gitlab-org/gitlab/-/issues/354984)). For example:
-The `gitaly-backup` binary is used by the backup Rake task to create and restore repository backups from Gitaly.
-`gitaly-backup` replaces the previous backup method that directly calls RPCs on Gitaly from GitLab.
+```plaintext
+Problem: <class 'OSError: [Errno 36] File name too long:
+```
-The backup Rake task must be able to find this executable. In most cases, you don't need to change
-the path to the binary as it should work fine with the default path `/opt/gitlab/embedded/bin/gitaly-backup`.
-If you have a specific reason to change the path, it can be configured in Omnibus GitLab packages:
+This problem stops the backup script from completing. To fix this problem, you must truncate the filenames causing the problem. A maximum of 246 characters, including the file extension, is permitted.
-1. Add the following to `/etc/gitlab/gitlab.rb`:
+WARNING:
+The steps in this section can potentially lead to **data loss**. All steps must be followed strictly in the order given.
- ```ruby
- gitlab_rails['backup_gitaly_backup_path'] = '/path/to/gitaly-backup'
+Truncating filenames to resolve the error involves:
+
+- Cleaning up remote uploaded files that aren't tracked in the database.
+- Truncating the filenames in the database.
+- Rerunning the backup task.
+
+#### Clean up remote uploaded files
+
+A [known issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/45425) caused object store uploads to remain after a parent resource was deleted. This issue was [resolved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18698).
+
+To fix these files, you must clean up all remote uploaded files that are in the storage but not tracked in the `uploads` database table.
+
+1. List all the object store upload files that can be moved to a lost and found directory if they don't exist in the GitLab database:
+
+ ```shell
+ bundle exec rake gitlab:cleanup:remote_upload_files RAILS_ENV=production
```
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect
+1. If you are sure you want to delete these files and remove all non-referenced uploaded files, run:
+
+ WARNING:
+ The following action is **irreversible**.
+
+ ```shell
+ bundle exec rake gitlab:cleanup:remote_upload_files RAILS_ENV=production DRY_RUN=false
+ ```
+
+#### Truncate the filenames referenced by the database
+
+You must truncate the files referenced by the database that are causing the problem. The filenames referenced by the database are stored:
+
+- In the `uploads` table.
+- In the references found. Any reference found from other database tables and columns.
+- On the filesystem.
+
+Truncate the filenames in the `uploads` table:
+
+1. Enter the database console:
+
+ For Omnibus GitLab 14.2 and later:
+
+ ```shell
+ sudo gitlab-rails dbconsole --database main
+ ```
+
+ For Omnibus GitLab 14.1 and earlier:
+
+ ```shell
+ sudo gitlab-rails dbconsole
+ ```
+
+ For installations from source, GitLab 14.2 and later:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production --database main
+ ```
+
+ For installations from source, GitLab 14.1 and earlier:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production
+ ```
+
+1. Search the `uploads` table for filenames longer than 246 characters:
+
+ The following query selects the `uploads` records with filenames longer than 246 characters in batches of 0 to 10000. This improves the performance on large GitLab instances with tables having thousand of records.
+
+ ```sql
+ CREATE TEMP TABLE uploads_with_long_filenames AS
+ SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, id, path
+ FROM uploads AS u
+ WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
+
+ CREATE INDEX ON uploads_with_long_filenames(row_id);
+
+ SELECT
+ u.id,
+ u.path,
+ -- Current filename
+ (regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] AS current_filename,
+ -- New filename
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ ) AS new_filename,
+ -- New path
+ CONCAT(
+ COALESCE((regexp_match(u.path, '(.*\/).*'))[1], ''),
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ )
+ ) AS new_path
+ FROM uploads_with_long_filenames AS u
+ WHERE u.row_id > 0 AND u.row_id <= 10000;
+ ```
+
+ Output example:
+
+ ```postgresql
+ -[ RECORD 1 ]----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ id | 34
+ path | public/@hashed/loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisit.txt
+ current_filename | loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisit.txt
+ new_filename | loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelits.txt
+ new_path | public/@hashed/loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelits.txt
+ ```
+
+ Where:
+
+ - `current_filename`: a filename that is currently more than 246 characters long.
+ - `new_filename`: a filename that has been truncated to 246 characters maximum.
+ - `new_path`: new path considering the new_filename (truncated).
+
+ Once you validate the batch results, you must change the batch size (`row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
+
+1. Rename the files found in the `uploads` table from long filenames to new truncated filenames. The following query rolls back the update so you can check the results safely within a transaction wrapper:
+
+ ```sql
+ CREATE TEMP TABLE uploads_with_long_filenames AS
+ SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, path, id
+ FROM uploads AS u
+ WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
+
+ CREATE INDEX ON uploads_with_long_filenames(row_id);
+
+ BEGIN;
+ WITH updated_uploads AS (
+ UPDATE uploads
+ SET
+ path =
+ CONCAT(
+ COALESCE((regexp_match(updatable_uploads.path, '(.*\/).*'))[1], ''),
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ )
+ )
+ FROM
+ uploads_with_long_filenames AS updatable_uploads
+ WHERE
+ uploads.id = updatable_uploads.id
+ AND updatable_uploads.row_id > 0 AND updatable_uploads.row_id <= 10000
+ RETURNING uploads.*
+ )
+ SELECT id, path FROM updated_uploads;
+ ROLLBACK;
+ ```
+
+ Once you validate the batch update results, you must change the batch size (`row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
+
+1. Validate that the new filenames from the previous query are the expected ones. If you are sure you want to truncate the records found in the previous step to 246 characters, run the following:
+
+ WARNING:
+ The following action is **irreversible**.
+
+ ```sql
+ CREATE TEMP TABLE uploads_with_long_filenames AS
+ SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, path, id
+ FROM uploads AS u
+ WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
+
+ CREATE INDEX ON uploads_with_long_filenames(row_id);
+
+ UPDATE uploads
+ SET
+ path =
+ CONCAT(
+ COALESCE((regexp_match(updatable_uploads.path, '(.*\/).*'))[1], ''),
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ )
+ )
+ FROM
+ uploads_with_long_filenames AS updatable_uploads
+ WHERE
+ uploads.id = updatable_uploads.id
+ AND updatable_uploads.row_id > 0 AND updatable_uploads.row_id <= 10000;
+ ```
+
+ Once you finish the batch update, you must change the batch size (`updatable_uploads.row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
+
+Truncate the filenames in the references found:
+
+1. Check if those records are referenced somewhere. One way to do this is to dump the database and search for the parent directory name and filename:
+
+ 1. To dump your database, you can use the following command as an example:
+
+ ```shell
+ pg_dump -h /var/opt/gitlab/postgresql/ -d gitlabhq_production > gitlab-dump.tmp
+ ```
+
+ 1. Then you can search for the references using the `grep` command. Combining the parent directory and the filename can be a good idea. For example:
+
+ ```shell
+ grep public/alongfilenamehere.txt gitlab-dump.tmp
+ ```
+
+1. Replace those long filenames using the new filenames obtained from querying the `uploads` table.
+
+Truncate the filenames on the filesystem. You must manually rename the files in your filesystem to the new filenames obtained from querying the `uploads` table.
+
+#### Re-run the backup task
+
+After following all the previous steps, re-run the backup task.
diff --git a/doc/raketasks/features.md b/doc/raketasks/features.md
deleted file mode 100644
index e2554c1c18d..00000000000
--- a/doc/raketasks/features.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2022-05-24'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after <2022-05-24>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/raketasks/import.md b/doc/raketasks/import.md
index e3acefb5520..5c95fe2eca1 100644
--- a/doc/raketasks/import.md
+++ b/doc/raketasks/import.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Rake tasks are available to import bare repositories into a GitLab instance.
When migrating from an existing GitLab instance,
and to preserve ownership by users and their namespaces,
-please use [our project-based import/export](../user/project/settings/import_export.md).
+use [our project-based import/export](../user/project/settings/import_export.md).
Note that:
@@ -39,7 +39,7 @@ To import bare repositories into a GitLab instance:
- Groups are created as needed, these could be nested folders.
For example, if we copy the repositories to `/var/opt/gitlab/git-data/repository-import-2020-08-22`,
- and repository `A` needs to be under the groups `G1` and `G2`, it must be created under those folders:
+ and repository `A` must be under the groups `G1` and `G2`, it must be created under those folders:
`/var/opt/gitlab/git-data/repository-import-2020-08-22/G1/G2/A.git`.
```shell
@@ -49,7 +49,7 @@ To import bare repositories into a GitLab instance:
sudo chown -R git:git /var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")
```
- `foo.git` needs to be owned by the `git` user and `git` users group.
+ `foo.git` must be owned by the `git` user and `git` users group.
If you are using an installation from source, replace `/var/opt/gitlab/` with `/home/git`.
@@ -61,7 +61,7 @@ To import bare repositories into a GitLab instance:
sudo gitlab-rake gitlab:import:repos["/var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")"]
```
- - Installation from source. Before running this command you need to change to the directory where
+ - Installation from source. Before running this command you must change to the directory where
your GitLab installation is located:
```shell
diff --git a/doc/raketasks/index.md b/doc/raketasks/index.md
index 38b57fab8ca..c2580e26ff0 100644
--- a/doc/raketasks/index.md
+++ b/doc/raketasks/index.md
@@ -27,7 +27,6 @@ The following Rake tasks are available for use with GitLab:
| [Clean up](cleanup.md) | Clean up unneeded items from GitLab instances. |
| [Development](../development/rake_tasks.md) | Tasks for GitLab contributors. |
| [Elasticsearch](../integration/advanced_search/elasticsearch.md#gitlab-advanced-search-rake-tasks) | Maintain Elasticsearch in a GitLab instance. |
-| [Enable namespaces](features.md) | Enable usernames and namespaces for user projects. |
| [General maintenance](../administration/raketasks/maintenance.md) | General maintenance and self-check tasks. |
| [Geo maintenance](../administration/raketasks/geo.md) | [Geo](../administration/geo/index.md)-related maintenance. |
| [GitHub import](../administration/raketasks/github_import.md) | Retrieve and import repositories from GitHub. |
diff --git a/doc/raketasks/restore_gitlab.md b/doc/raketasks/restore_gitlab.md
new file mode 100644
index 00000000000..9d9a4d7b8c8
--- /dev/null
+++ b/doc/raketasks/restore_gitlab.md
@@ -0,0 +1,367 @@
+---
+stage: Systems
+group: Geo
+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
+---
+
+# Restore GitLab
+
+GitLab provides a command line interface to restore your entire installation,
+and is flexible enough to fit your needs.
+
+The [restore prerequisites section](#restore-prerequisites) includes crucial
+information. Be sure to read and test the complete restore process at least
+once before attempting to perform it in a production environment.
+
+You can restore a backup only to _the exact same version and type (CE/EE)_ of
+GitLab that you created it on (for example CE 9.1.0).
+
+If your backup is a different version than the current installation, you must
+[downgrade your GitLab installation](../update/package/downgrade.md)
+before restoring the backup.
+
+## Restore prerequisites
+
+You need to have a working GitLab installation before you can perform a
+restore. This is because the system user performing the restore actions (`git`)
+is usually not allowed to create or delete the SQL database needed to import
+data into (`gitlabhq_production`). All existing data is either erased
+(SQL) or moved to a separate directory (such as repositories and uploads).
+
+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/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
+loses access to your GitLab server.
+
+You may also want to restore your previous `/etc/gitlab/gitlab.rb` (for Omnibus packages)
+or `/home/git/gitlab/config/gitlab.yml` (for installations from source) and
+any TLS keys, certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), or
+[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
+
+Starting with GitLab 12.9, if an untarred backup (like the ones made with
+`SKIP=tar`) is found, and no backup is chosen with `BACKUP=<timestamp>`, the
+untarred backup is used.
+
+Depending on your case, you might want to run the restore command with one or
+more of the following options:
+
+- `BACKUP=timestamp_of_backup`: Required if more than one backup exists.
+ Read what the [backup timestamp is about](backup_restore.md#backup-timestamp).
+- `force=yes`: Doesn't ask if the `authorized_keys` file should get regenerated,
+ and assumes 'yes' for warning about database tables being removed,
+ enabling the `Write to authorized_keys file` setting, and updating LDAP
+ providers.
+
+If you're restoring into directories that are mount points, you must ensure these directories are
+empty before attempting a restore. Otherwise, GitLab attempts to move these directories before
+restoring the new data, which causes an error.
+
+Read more about [configuring NFS mounts](../administration/nfs.md)
+
+## Restore for Omnibus GitLab installations
+
+This procedure assumes that:
+
+- You have installed the **exact same version and type (CE/EE)** of GitLab
+ Omnibus with which the backup was created.
+- You have run `sudo gitlab-ctl reconfigure` at least once.
+- GitLab is running. If not, start it using `sudo gitlab-ctl start`.
+
+First ensure your backup tar file is in the backup directory described in the
+`gitlab.rb` configuration `gitlab_rails['backup_path']`. The default is
+`/var/opt/gitlab/backups`. The backup file needs to be owned by the `git` user.
+
+```shell
+sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /var/opt/gitlab/backups/
+sudo chown git:git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
+```
+
+Stop the processes that are connected to the database. Leave the rest of GitLab
+running:
+
+```shell
+sudo gitlab-ctl stop puma
+sudo gitlab-ctl stop sidekiq
+# Verify
+sudo gitlab-ctl status
+```
+
+Next, restore the backup, specifying the timestamp of the backup you wish to
+restore:
+
+```shell
+# This command will overwrite the contents of your GitLab database!
+sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
+```
+
+Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:restore` instead.
+Some [known non-blocking error messages may appear](backup_restore.md#restoring-database-backup-using-omnibus-packages-outputs-warnings).
+
+WARNING:
+`gitlab-rake gitlab:backup:restore` doesn't set the correct file system
+permissions on your Registry directory. This is a [known issue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759).
+In GitLab 12.2 or later, you can use `gitlab-backup restore` to avoid this
+issue.
+
+If there's a GitLab version mismatch between your backup tar file and the
+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.
+
+WARNING:
+The restore command requires [additional parameters](backup_restore.md#back-up-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).
+
+Reconfigure, restart and [check](../administration/raketasks/maintenance.md#check-gitlab-configuration) GitLab:
+
+```shell
+sudo gitlab-ctl reconfigure
+sudo gitlab-ctl restart
+sudo gitlab-rake gitlab:check SANITIZE=true
+```
+
+In GitLab 13.1 and later, check [database values can be decrypted](../administration/raketasks/check.md#verify-database-values-can-be-decrypted-using-the-current-secrets)
+especially if `/etc/gitlab/gitlab-secrets.json` was restored, or if a different server is
+the target for the restore.
+
+```shell
+sudo gitlab-rake gitlab:doctor:secrets
+```
+
+For added assurance, you can perform [an integrity check on the uploaded files](../administration/raketasks/check.md#uploaded-files-integrity):
+
+```shell
+sudo gitlab-rake gitlab:artifacts:check
+sudo gitlab-rake gitlab:lfs:check
+sudo gitlab-rake gitlab:uploads:check
+```
+
+## Restore for Docker image and GitLab Helm chart installations
+
+For GitLab installations using the Docker image or the GitLab Helm chart on a
+Kubernetes cluster, the restore task expects the restore directories to be
+empty. However, with Docker and Kubernetes volume mounts, some system level
+directories may be created at the volume roots, such as the `lost+found`
+directory found in Linux operating systems. These directories are usually owned
+by `root`, which can cause access permission errors since the restore Rake task
+runs as the `git` user. To restore a GitLab installation, users have to confirm
+the restore target directories are empty.
+
+For both these installation types, the backup tarball has to be available in
+the backup location (default location is `/var/opt/gitlab/backups`).
+
+For Docker installations, the restore task can be run from host:
+
+```shell
+# Stop the processes that are connected to the database
+docker exec -it <name of container> gitlab-ctl stop puma
+docker exec -it <name of container> gitlab-ctl stop sidekiq
+
+# Verify that the processes are all down before continuing
+docker exec -it <name of container> gitlab-ctl status
+
+# Run the restore. NOTE: "_gitlab_backup.tar" is omitted from the name
+docker exec -it <name of container> gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
+
+# Restart the GitLab container
+docker restart <name of container>
+
+# Check GitLab
+docker exec -it <name of container> gitlab-rake gitlab:check SANITIZE=true
+```
+
+Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+
+WARNING:
+`gitlab-rake gitlab:backup:restore` doesn't set the correct file system
+permissions on your Registry directory. This is a [known issue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759).
+In GitLab 12.2 or later, you can use `gitlab-backup restore` to avoid this
+issue.
+
+The GitLab Helm chart uses a different process, documented in
+[restoring a GitLab Helm chart installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/restore.md).
+
+## Restore for installation from source
+
+First, ensure your backup tar file is in the backup directory described in the
+`gitlab.yml` configuration:
+
+```yaml
+## Backup settings
+backup:
+ path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/)
+```
+
+The default is `/home/git/gitlab/tmp/backups`, and it needs to be owned by the `git` user. Now, you can begin the backup procedure:
+
+```shell
+# Stop processes that are connected to the database
+sudo service gitlab stop
+
+sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production
+```
+
+Example output:
+
+```plaintext
+Unpacking backup... [DONE]
+Restoring database tables:
+-- create_table("events", {:force=>true})
+ -> 0.2231s
+[...]
+- Loading fixture events...[DONE]
+- Loading fixture issues...[DONE]
+- Loading fixture keys...[SKIPPING]
+- Loading fixture merge_requests...[DONE]
+- Loading fixture milestones...[DONE]
+- Loading fixture namespaces...[DONE]
+- Loading fixture notes...[DONE]
+- Loading fixture projects...[DONE]
+- Loading fixture protected_branches...[SKIPPING]
+- Loading fixture schema_migrations...[DONE]
+- Loading fixture services...[SKIPPING]
+- Loading fixture snippets...[SKIPPING]
+- Loading fixture taggings...[SKIPPING]
+- Loading fixture tags...[SKIPPING]
+- Loading fixture users...[DONE]
+- Loading fixture users_projects...[DONE]
+- Loading fixture web_hooks...[SKIPPING]
+- Loading fixture wikis...[SKIPPING]
+Restoring repositories:
+- Restoring repository abcd... [DONE]
+- Object pool 1 ...
+Deleting tmp directories...[DONE]
+```
+
+Next, restore `/home/git/gitlab/.secret` if necessary, [as previously mentioned](#restore-prerequisites).
+
+Restart GitLab:
+
+```shell
+sudo service gitlab restart
+```
+
+## Restoring only one or a few projects or groups from a backup
+
+Although the Rake task used to restore a GitLab instance doesn't support
+restoring a single project or group, you can use a workaround by restoring
+your backup to a separate, temporary GitLab instance, and then export your
+project or group from there:
+
+1. [Install a new GitLab](../install/index.md) instance at the same version as
+ the backed-up instance from which you want to restore.
+1. [Restore the backup](#restore-gitlab) into this new instance, then
+ export your [project](../user/project/settings/import_export.md)
+ or [group](../user/group/settings/import_export.md). Be sure to read the
+ **Important Notes** on either export feature's documentation to understand
+ what is and isn't exported.
+1. After the export is complete, go to the old instance and then import it.
+1. After importing the projects or groups that you wanted is complete, you may
+ delete the new, temporary GitLab instance.
+
+A feature request to provide direct restore of individual projects or groups
+is being discussed in [issue #17517](https://gitlab.com/gitlab-org/gitlab/-/issues/17517).
+
+## Restore options
+
+The command line tool GitLab provides to restore from backup can accept more
+options.
+
+### Disabling prompts during restore
+
+During a restore from backup, the restore script may ask for confirmation before
+proceeding. If you wish to disable these prompts, you can set the `GITLAB_ASSUME_YES`
+environment variable to `1`.
+
+For Omnibus GitLab packages:
+
+```shell
+sudo GITLAB_ASSUME_YES=1 gitlab-backup restore
+```
+
+For installations from source:
+
+```shell
+sudo -u git -H GITLAB_ASSUME_YES=1 bundle exec rake gitlab:backup:restore RAILS_ENV=production
+```
+
+### Excluding tasks on restore
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19347) in GitLab 14.10.
+
+You can exclude specific tasks on restore by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
+
+- `db` (database)
+- `uploads` (attachments)
+- `builds` (CI job output logs)
+- `artifacts` (CI job artifacts)
+- `lfs` (LFS objects)
+- `terraform_state` (Terraform states)
+- `registry` (Container Registry images)
+- `pages` (Pages content)
+- `repositories` (Git repositories data)
+- `packages` (Packages)
+
+For Omnibus GitLab packages:
+
+```shell
+sudo gitlab-backup restore BACKUP=timestamp_of_backup SKIP=db,uploads
+```
+
+For installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup SKIP=db,uploads RAILS_ENV=production
+```
+
+### Restore specific repository storages
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
+
+When using [multiple repository storages](../administration/repository_storage_paths.md),
+repositories from specific repository storages can be restored separately
+using the `REPOSITORIES_STORAGES` option. The option accepts a comma-separated list of
+storage names.
+
+For example, for Omnibus GitLab installations:
+
+```shell
+sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
+```
+
+For example, for installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
+```
+
+### Restore specific repositories
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
+
+You can restore specific repositories using the `REPOSITORIES_PATHS` option.
+The option accepts a comma-separated list of project and group paths. If you
+specify a group path, all repositories in all projects in the group and
+descendent groups are included. The project and group repositories must exist
+within the specified backup.
+
+For example, to restore all repositories for all projects in **Group A** (`group-a`), and the repository for **Project C** in **Group B** (`group-b/project-c`):
+
+- Omnibus GitLab installations:
+
+ ```shell
+ sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c
+ ```
+
+- Installations from source:
+
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c
+ ```
diff --git a/doc/raketasks/user_management.md b/doc/raketasks/user_management.md
index b47afef7145..02c76af1e69 100644
--- a/doc/raketasks/user_management.md
+++ b/doc/raketasks/user_management.md
@@ -111,7 +111,7 @@ the leaked key without forcing all users to change their 2FA details.
To rotate the two-factor authentication encryption key:
-1. Look up the old key. This is in the `config/secrets.yml` file, but **make sure you're working
+1. Look up the old key in the `config/secrets.yml` file, but **make sure you're working
with the production section**. The line you're interested in looks like this:
```yaml
diff --git a/doc/security/password_storage.md b/doc/security/password_storage.md
index b4c2e27c952..d3db8cbe4f6 100644
--- a/doc/security/password_storage.md
+++ b/doc/security/password_storage.md
@@ -7,18 +7,32 @@ type: reference
# Password storage **(FREE)**
+> PBKDF2 and SHA512 [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/360658) in GitLab 15.2 [with flags](../administration/feature_flags.md) named `pbkdf2_password_encryption` and `pbkdf2_password_encryption_write`. Disabled by default.
+
GitLab stores user passwords in a hashed format to prevent passwords from being
stored as plain text.
GitLab uses the [Devise](https://github.com/heartcombo/devise) authentication
library to hash user passwords. Created password hashes have these attributes:
-- **Hashing**: The [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt) hashing
- function is used to generate the hash of the provided password. This is a
- strong, industry-standard cryptographic hashing function.
+- **Hashing**:
+ - **BCrypt**: By default, the [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt) hashing
+ function is used to generate the hash of the provided password. This is a
+ strong, industry-standard cryptographic hashing function.
+ - **PBKDF2 and SHA512**: Starting in GitLab 15.2, PBKDF2 and SHA512 are supported
+ behind the following feature flags (disabled by default):
+ - `pbkdf2_password_encryption` - Enables reading and comparison of PBKDF2 + SHA512
+ hashed passwords and supports fallback for BCrypt hashed passwords.
+ - `pbkdf2_password_encryption_write` - Enables new passwords to be saved
+ using PBKDF2 and SHA512, and existing BCrypt passwords to be migrated when users sign in.
+
+ FLAG:
+ On self-managed GitLab, by default this feature is not available. To make it available,
+ ask an administrator to [enable the feature flags](../administration/feature_flags.md) named `pbkdf2_password_encryption` and `pbkdf2_password_encryption_write`.
+
- **Stretching**: Password hashes are [stretched](https://en.wikipedia.org/wiki/Key_stretching)
to harden against brute-force attacks. By default, GitLab uses a stretching
- factor of 10.
+ factor of 10 for BCrypt and 20,000 for PBKDF2 + SHA512.
- **Salting**: A [cryptographic salt](https://en.wikipedia.org/wiki/Salt_(cryptography))
is added to each password to harden against pre-computed hash and dictionary
attacks. To increase security, each salt is randomly generated for each
diff --git a/doc/security/rate_limits.md b/doc/security/rate_limits.md
index 695a0d52af6..e48a9999a06 100644
--- a/doc/security/rate_limits.md
+++ b/doc/security/rate_limits.md
@@ -43,6 +43,7 @@ You can set these rate limits in the Admin Area of your instance:
- [Deprecated API rate limits](../user/admin_area/settings/deprecated_api_rate_limits.md)
- [GitLab Pages rate limits](../administration/pages/index.md#rate-limits)
- [Pipeline rate limits](../user/admin_area/settings/rate_limit_on_pipelines_creation.md)
+- [Incident management rate limits](../user/admin_area/settings/incident_management_rate_limits.md)
You can set these rate limits using the Rails console:
diff --git a/doc/security/ssh_keys_restrictions.md b/doc/security/ssh_keys_restrictions.md
index eb92694d236..eca52c41e4f 100644
--- a/doc/security/ssh_keys_restrictions.md
+++ b/doc/security/ssh_keys_restrictions.md
@@ -48,14 +48,10 @@ By default, the GitLab.com and self-managed settings for the
- ECDSA_SK SSH keys are allowed (GitLab 14.8 and later).
- ED25519_SK SSH keys are allowed (GitLab 14.8 and later).
-### Block banned or compromised keys **(FREE)**
+## Block banned or compromised keys **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24614) in GitLab 15.1 [with a flag](../administration/feature_flags.md) named `ssh_banned_key`. Enabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature per user,
-ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `ssh_banned_key`.
-On GitLab.com, this feature is available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24614) in GitLab 15.1 [with a flag](../administration/feature_flags.md) named `ssh_banned_key`. Enabled by default.
+> - Generally available in GitLab 15.2. [Feature flag `ssh_banned_key`](https://gitlab.com/gitlab-org/gitlab/-/issues/363410) removed.
When users attempt to [add a new SSH key](../user/ssh.md#add-an-ssh-key-to-your-gitlab-account)
to GitLab accounts, the key is checked against a list of SSH keys which are known
diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md
index ae13881fe6f..5907860f5cc 100644
--- a/doc/security/two_factor_authentication.md
+++ b/doc/security/two_factor_authentication.md
@@ -5,7 +5,7 @@ group: Authentication and Authorization
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
---
-# Enforce two-factor authentication **(FREE SELF)**
+# Enforce two-factor authentication **(FREE)**
Two-factor authentication (2FA) provides an additional level of security to your
users' GitLab account. When enabled, users are prompted for a code generated by an application in
@@ -13,7 +13,7 @@ addition to supplying their username and password to sign in.
Read more about [two-factor authentication (2FA)](../user/profile/account/two_factor_authentication.md)
-## Enforce 2FA for all users
+## Enforce 2FA for all users **(FREE SELF)**
Users on GitLab can enable it without any administrator's intervention. If you
want to enforce everyone to set up 2FA, you can choose from two different ways:
@@ -33,7 +33,7 @@ To enable 2FA for all users:
If you want 2FA enforcement to take effect during the next sign-in attempt,
change the grace period to `0`.
-## Disable 2FA enforcement through Rails console
+### Disable 2FA enforcement through Rails console
Using the [Rails console](../administration/operations/rails_console.md), enforcing 2FA for
all user can be disabled. Connect to the Rails console and run:
@@ -46,19 +46,22 @@ Gitlab::CurrentSettings.update!('require_two_factor_authentication': false)
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24965) in GitLab 12.0, 2FA settings for a group are also applied to subgroups.
-To enforce 2FA only for certain groups:
+Prerequisites:
+
+- You must have the Maintainer or Owner role for the group.
-1. Go to the group's **Settings > General** page.
-1. Expand the **Permissions and group features** section.
-1. Select the **Require all users in this group to set up two-factor authentication** option.
+To enforce 2FA only for certain groups:
-You can also specify a grace period in the **Time before enforced** option.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Permissions and group features**.
+1. Select **All users in this group must set up two-factor authentication**.
+1. Select **Save changes**.
-To change this setting, you must be an administrator or owner of the group.
+You can also specify a grace period in the **Delay 2FA enforcement** option.
If you want to enforce 2FA only for certain groups, you can enable it in the
-group settings and specify a grace period as above. To change this setting you
-must be administrator or owner of the group.
+group settings and specify a grace period as above.
The following are important notes about 2FA:
@@ -80,15 +83,36 @@ The following are important notes about 2FA:
1. Uncheck the **Allow subgroups to set up their own two-factor authentication rule** field.
This action causes all subgroups with 2FA requirements to stop requiring that from their members.
+- Access tokens are not required to provide a second factor for authentication because they are API-based.
+ Tokens generated before 2FA is enforced remain valid.
-## Disable 2FA for everyone
+## Disable 2FA **(FREE SELF)**
WARNING:
-Disabling 2FA for everyone does not disable the [enforce 2FA for all users](#enforce-2fa-for-all-users)
+Disabling 2FA for users does not disable the [enforce 2FA for all users](#enforce-2fa-for-all-users)
or [enforce 2FA for all users in a group](#enforce-2fa-for-all-users-in-a-group)
settings. You must also disable any enforced 2FA settings so users aren't asked to set up 2FA again
when they next sign in to GitLab.
+WARNING:
+This is a permanent and irreversible action. Users must reactivate 2FA to use it again.
+
+### For a single user
+
+To disable 2FA for non-administrator users, we recommend using the [API endpoint](../api/users.md#disable-two-factor-authentication)
+instead of the Rails console.
+Using the [Rails console](../administration/operations/rails_console.md), 2FA for a single user can be disabled.
+Connect to the Rails console and run:
+
+```ruby
+admin = User.find_by_username('<USERNAME>')
+user_to_disable = User.find_by_username('<USERNAME>')
+
+TwoFactor::DestroyService.new(admin, user: user_to_disable).execute
+```
+
+### For all users
+
There may be some special situations where you want to disable 2FA for everyone
even when forced 2FA is disabled. There is a Rake task for that:
@@ -100,10 +124,6 @@ sudo gitlab-rake gitlab:two_factor:disable_for_all_users
sudo -u git -H bundle exec rake gitlab:two_factor:disable_for_all_users RAILS_ENV=production
```
-WARNING:
-This is a permanent and irreversible action. Users have to
-reactivate 2FA from scratch if they want to use it again.
-
## 2FA for Git over SSH operations **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/270554) in GitLab 13.7.
diff --git a/doc/ssh/index.md b/doc/ssh/index.md
deleted file mode 100644
index 10184a63a7a..00000000000
--- a/doc/ssh/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../user/ssh.md'
-remove_date: '2022-06-18'
----
-
-This document was moved to [another location](../user/ssh.md).
-
-<!-- This redirect file can be deleted after <2022-06-18>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 6d88b61dd05..f936e230a3d 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -63,7 +63,7 @@ the tiers are no longer mentioned in GitLab documentation:
- [`audit_json.log`](../administration/logs.md#audit_jsonlog) (specific entries)
- [`elasticsearch.log`](../administration/logs.md#elasticsearchlog)
- Merge requests:
- - [Full code quality reports in the code quality tab](../user/project/merge_requests/code_quality.md#code-quality-reports)
+ - [Full code quality reports in the code quality tab](../ci/testing/code_quality.md#code-quality-reports)
- [Merge request approvals](../user/project/merge_requests/approvals/index.md)
- [Multiple assignees](../user/project/merge_requests/index.md#assign-multiple-users)
- [Approval Rule information for Reviewers](../user/project/merge_requests/reviews/index.md#approval-rule-information-for-reviewers)
diff --git a/doc/subscriptions/gitlab_dedicated/index.md b/doc/subscriptions/gitlab_dedicated/index.md
index 0b3b44d74e1..218f6b7f824 100644
--- a/doc/subscriptions/gitlab_dedicated/index.md
+++ b/doc/subscriptions/gitlab_dedicated/index.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab Dedicated
NOTE:
-GitLab Dedicated is currently in limited availability. Please [contact us](#contact-us) if you are interested.
+GitLab Dedicated is currently in limited availability. [Contact us](#contact-us) if you are interested.
GitLab Dedicated is a fully isolated, single-tenant SaaS service that is:
@@ -18,7 +18,7 @@ GitLab Dedicated enables you to offload the operational overhead of managing the
## Available features
-- Authentication: Support for instance-level [SAML OmniAuth](../../integration/saml.md) functionality. GitLab Dedicated acts as the service provider, and you will need to provide the necessary [configuration](../../integration/saml.md#general-setup) in order for GitLab to communicate with your IdP. This will be provided during onboarding. SAML [request signing](../../integration/saml.md#request-signing-optional) is supported.
+- Authentication: Support for instance-level [SAML OmniAuth](../../integration/saml.md) functionality. GitLab Dedicated acts as the service provider, and you must provide the necessary [configuration](../../integration/saml.md#general-setup) in order for GitLab to communicate with your IdP. This is provided during onboarding. SAML [request signing](../../integration/saml.md#request-signing-optional) is supported.
- Networking:
- Public connectivity
- Optional. Private connectivity via [AWS PrivateLink](https://aws.amazon.com/privatelink/).
@@ -42,7 +42,7 @@ Features that are not available but we plan to support in the future:
- GitLab-managed runners
- FortiAuthenticator/FortiToken 2FA
- Reply-by email
-- Service desk
+- Service Desk
Features that we do not plan to offer at all:
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index d592c87d2a8..c1a11ce7d12 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -117,36 +117,34 @@ GitLab has several features which can help you manage the number of users:
users manually.
- View a breakdown of users by role in the [Users statistics](../../user/admin_area/index.md#users-statistics) page.
-## Cloud licensing
+## Sync your subscription data with GitLab
> Introduced in GitLab 14.1.
-Cloud licensing manages licenses for self-managed GitLab subscription plans. Cloud licensing includes:
+Prerequisites:
-- Activation: Unlock plan features and activate your self-managed instance by using an activation code.
-- License sync: Sync subscription data between your self-managed instance and GitLab.
+- You must be running GitLab Enterprise Edition (EE).
+- You must have GitLab 14.1 or later.
+- Your instance must be connected to the internet, and not be in an offline environment.
-### How cloud licensing works
+To sync subscription data between your self-managed instance and GitLab, you must [activate your instance](../../user/admin_area/license.md) with an
+activation code.
-#### Add your license
+After you activate your instance, the following processes are automated:
-1. When you purchase a GitLab self-managed plan, an activation code is generated.
- This activation code is sent to the email address associated with the Customers Portal account.
-1. In GitLab, on the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Subscription** and paste the activation code in the text field.
-1. Select **Add license**.
+- [Quarterly subscription reconciliation](../quarterly_reconciliation.md).
+- Subscription renewals.
+- Subscription updates, such as adding more seats or upgrading a GitLab tier.
-The page displays the details of the subscription.
+At approximately 03:00 UTC, a daily sync job sends subscription data to the Customers Portal. For this reason, updates and renewals may not
+apply immediately.
-#### License sync
+The data is sent securely through an encrypted HTTPS connection to `customers.gitlab.com` on port `443`.
+If the job fails, it retries up to 12 times over approximately 17 hours.
-Once a day, a job sends license data to the Customers Portal. This information automates activation,
-provisioning, co-terms, and renewals. The data is sent securely through an encrypted HTTPS connection
-to `customers.gitlab.com` on port `443`.
+### Subscription data that GitLab receives
-This sync job runs daily around 3AM UTC. If the job fails, it is retried up to 12 times over approximately 17 hours.
-
-The daily job provides **only** the following information to the Customers Portal:
+The daily sync job sends **only** the following information to the Customers Portal:
- Date
- Timestamp
@@ -159,9 +157,8 @@ The daily job provides **only** the following information to the Customers Porta
- GitLab version
- Hostname
- Instance ID
-- MD5 hash of license
-Example of a cloud licensing sync request:
+Example of a license sync request:
```json
{
@@ -208,12 +205,16 @@ Example of a cloud licensing sync request:
"max_historical_user_count": 75,
"billable_users_count": 75,
"hostname": "gitlab.example.com",
- "instance_id": "9367590b-82ad-48cb-9da7-938134c29088",
- "license_md5": "002f02470fe45ef6a333a4282aca6222"
+ "instance_id": "9367590b-82ad-48cb-9da7-938134c29088"
}
```
-#### Sync subscription details
+### Troubleshoot automatic subscription sync
+
+If the sync job is not working, ensure you allow network traffic from your GitLab instance
+to IP address `104.18.26.123:443` (`customers.gitlab.com`).
+
+## Manually sync your subscription details
You can manually sync your subscription details at any time.
@@ -223,11 +224,6 @@ You can manually sync your subscription details at any time.
A job is queued. When the job finishes, the subscription details are updated.
-#### Troubleshooting cloud licensing sync
-
-If the sync job is not working, ensure you allow network traffic from your GitLab instance
-to IP address `104.18.26.123:443` (`customers.gitlab.com`).
-
## Obtain a subscription
To subscribe to GitLab through a GitLab self-managed installation:
@@ -273,7 +269,7 @@ If you are an administrator, you can export your license usage into a CSV:
1. On the left sidebar, select **Subscription**.
1. In the top right, select **Export license usage file**.
-This file contains the information GitLab uses to manually process quarterly reconciliations or renewals. If your instance is firewalled or in an offline environment, you must provide GitLab with this information.
+This file contains the information GitLab uses to manually process quarterly reconciliations or renewals. If your instance is firewalled or an offline environment, you must provide GitLab with this information.
The **License Usage** CSV includes the following details:
@@ -294,6 +290,8 @@ NOTES:
## Renew your subscription
+You can renew your subscription starting from 15 days before your subscription expires.
+
To renew your subscription,
[prepare for renewal by reviewing your account](#prepare-for-renewal-by-reviewing-your-account),
then [renew your GitLab self-managed subscription](#renew-a-subscription).
@@ -364,7 +362,8 @@ to your instance.
### Renew a subscription
-Starting 30 days before a subscription expires, GitLab notifies administrators of the date of expiry with a banner in the GitLab user interface.
+Starting 30 days before a subscription expires, a banner with the expiry date displays for administrators in the GitLab user interface.
+You can renew your subscription starting from 15 days before your subscription expires.
We recommend following these steps during renewal:
@@ -375,7 +374,7 @@ The **Renew** button remains disabled (grayed-out) until 15 days before a subscr
You can hover your mouse on the **Renew** button to see the date when it will become active.
NOTE:
- If you need to change your [GitLab tier](https://about.gitlab.com/pricing/), contact our sales team via [the sales contact form](https://about.gitlab.com/sales/) for assistance as this can't be done in the Customers Portal.
+ If you need to change your [GitLab tier](https://about.gitlab.com/pricing/), contact our sales team with [the sales contact form](https://about.gitlab.com/sales/) for assistance as this can't be done in the Customers Portal.
1. In the first box, enter the total number of user licenses you'll need for the upcoming year. Be sure this number is at least **equal to, or greater than** the number of billable users in the system at the time of performing the renewal.
1. Enter the number of [users over license](#users-over-license) in the second box for the user overage incurred in your previous subscription term.
diff --git a/doc/system_hooks/system_hooks.md b/doc/system_hooks/system_hooks.md
deleted file mode 100644
index c30e2703a29..00000000000
--- a/doc/system_hooks/system_hooks.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../administration/system_hooks.md'
-remove_date: '2022-06-18'
----
-
-This document was moved to [another location](../administration/system_hooks.md).
-
-<!-- This redirect file can be deleted after <2022-06-18>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/tools/email.md b/doc/tools/email.md
deleted file mode 100644
index 1d46a63bae4..00000000000
--- a/doc/tools/email.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../user/admin_area/email_from_gitlab.md'
-remove_date: '2022-06-18'
----
-
-This document was moved to [another location](../user/admin_area/email_from_gitlab.md).
-
-<!-- This redirect file can be deleted after <2022-06-18>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/topics/application_development_platform/index.md b/doc/topics/application_development_platform/index.md
index 1560ceeed26..fac9f963a98 100644
--- a/doc/topics/application_development_platform/index.md
+++ b/doc/topics/application_development_platform/index.md
@@ -65,4 +65,3 @@ responsibility. The Application Development Platform integrates key performance
into GitLab, automatically. The following features are included:
- [Auto Monitoring](../autodevops/stages.md#auto-monitoring)
-- [In-app Kubernetes Logs](../../user/project/clusters/kubernetes_pod_logs.md)
diff --git a/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md b/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
index aceb1ed8910..b3ce2aa1683 100644
--- a/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
+++ b/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
@@ -20,11 +20,12 @@ Ensure your own [runners are configured](../../../ci/runners/index.md) and
To deploy a project to Google Kubernetes Engine, follow the steps below:
1. [Configure your Google account](#configure-your-google-account)
-1. [Create a new project from a template](#create-a-new-project-from-a-template)
-1. [Create a Kubernetes cluster from GitLab](#create-a-kubernetes-cluster-from-gitlab)
+1. [Create a Kubernetes cluster and deploy the agent](#create-a-kubernetes-cluster)
+1. [Create a new project from a template](#create-an-application-project-from-a-template)
+1. [Configure the agent](#configure-the-agent)
1. [Install Ingress](#install-ingress)
-1. [Configure your base domain](#configure-your-base-domain)
-1. [Enable Auto DevOps](#enable-auto-devops-optional)
+1. [Configure Auto DevOps](#configure-auto-devops)
+1. [Enable Auto DevOps and run the pipeline](#enable-auto-devops-and-run-the-pipeline)
1. [Deploy the application](#deploy-the-application)
## Configure your Google account
@@ -46,70 +47,45 @@ GCP accounts to get started with the GitLab integration with Google Kubernetes E
[Follow this link](https://cloud.google.com/partners/partnercredit/?pcn_code=0014M00001h35gDQAQ#contact-form)
and apply for credit.
-## Create a new project from a template
+## Create a Kubernetes cluster
+
+To create a new cluster on Google Kubernetes Engine (GKE), use Infrastructure as Code (IaC) approach
+by following steps in [Create a Google GKE cluster](../../../user/infrastructure/clusters/connect/new_gke_cluster.md) guide.
+The guide requires you to create a new project that uses [Terraform](https://www.terraform.io/) to create a GKE cluster and install a GitLab agent for Kubernetes.
+This project is where configuration for GitLab agent resides.
+
+## Create an application project from a template
Use a GitLab project template to get started. As the name suggests,
those projects provide a bare-bones application built on some well-known frameworks.
+WARNING:
+Create the application project in the group hierarchy at the same level or below the project for cluster management. Otherwise, it fails to [authorize the agent](../../../user/clusters/agent/ci_cd_workflow.md#authorize-the-agent).
+
1. On the top bar in GitLab, select the plus icon (**{plus-square}**), and select
**New project/repository**.
-1. Go to the **Create from template** tab, where you can choose a Ruby on
- Rails, Spring, or NodeJS Express project.
- For this tutorial, use the Ruby on Rails template.
-
- ![Select project template](img/guide_project_template_v12_3.png)
-
+1. Select **Create from template**.
+1. Select the **Ruby on Rails** template.
1. Give your project a name, optionally a description, and make it public so that
you can take advantage of the features available in the
[GitLab Ultimate plan](https://about.gitlab.com/pricing/).
-
- ![Create project](img/guide_create_project_v12_3.png)
-
1. Select **Create project**.
-Now that you've created a project, create the Kubernetes cluster
-to deploy this project to.
-
-## Create a Kubernetes cluster from GitLab
-
-1. On your project's landing page, select the button **Add Kubernetes cluster**.
-
- ![Project landing page](img/guide_project_landing_page_v12_10.png)
+Now you have an application project you are going to deploy to the GKE cluster.
-1. On the **Kubernetes clusters** page, select the **Create a new cluster** option from the **Actions** dropdown menu.
+## Configure the agent
-1. On the **Connect a Kubernetes cluster** page, select **Google GKE**.
+Now we need to configure the GitLab agent for Kubernetes for us to be able to use it to deploy the application project.
-1. Connect with your Google account, and select **Allow** to allow access to your
- Google account. (This authorization request is only displayed the first time
- you connect GitLab with your Google account.)
+1. Go to the project [we created to manage the cluster](#create-a-kubernetes-cluster).
+1. Navigate to the [agent configuration file](../../../user/clusters/agent/install/index.md#create-an-agent-configuration-file) (`.gitlab/agents/gke-agent/config.yaml`) and edit it.
+1. Configure `ci_access:projects` attribute. Use application's project path as `id`:
- After authorizing access, the **Connect a Kubernetes cluster** page
- is displayed.
-
-1. In the **Enter your Kubernetes cluster certificate details** section, provide
- details about your cluster:
-
- - **Kubernetes cluster name**
- - **Environment scope** - Leave this field unchanged.
- - **Google Cloud Platform project** - Select a project. When you
- [configured your Google account](#configure-your-google-account), a project
- should have already been created for you.
- - **Zone** - The [region/zone](https://cloud.google.com/compute/docs/regions-zones/) to
- create the cluster in.
- - **Number of nodes**
- - **Machine type** - For more information about
- [machine types](https://cloud.google.com/compute/docs/machine-types), see Google's documentation.
- - **Enable Cloud Run for Anthos** - Select this checkbox to use the
- [Cloud Run](../../../user/project/clusters/add_gke_clusters.md#cloud-run-for-anthos),
- Istio, and HTTP Load Balancing add-ons for this cluster.
- - **GitLab-managed cluster** - Select this checkbox to
- [allow GitLab to manage namespace and service accounts](../../../user/project/clusters/gitlab_managed_clusters.md) for this cluster.
-
-1. Select **Create Kubernetes cluster**.
-
-After a couple of minutes, the cluster is created. You can also see its
-status on your [GCP dashboard](https://console.cloud.google.com/kubernetes).
+```yaml
+ci_access:
+ projects:
+ - id: path/to/application-project
+```
## Install Ingress
@@ -134,9 +110,9 @@ or manually with Google Cloud Shell:
kubectl get service ingress-nginx-ingress-controller -n gitlab-managed-apps
```
-## Configure your base domain
+## Configure Auto DevOps
-Follow these steps to configure the base domain where you access your apps.
+Follow these steps to configure the base domain and other settings required for Auto DevOps.
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:
@@ -149,30 +125,34 @@ Follow these steps to configure the base domain where you access your apps.
Copy this IP address, as you need it in the next step.
-1. Go back to the cluster page on GitLab, and go to the **Details** tab.
- - Add your **Base domain**. For this example, use the domain `<IP address>.nip.io`.
+1. Go back to the application project.
+1. On the left sidebar, select **Settings > CI/CD** and expand **Variables**.
+ - Add a key called `KUBE_INGRESS_BASE_DOMAIN` with the application deployment domain as the value. For this example, use the domain `<IP address>.nip.io`.
+ - Add a key called `KUBE_NAMESPACE` with a value of the Kubernetes namespace for your deployments to target. You can use different namespaces per environment. Configure the environment, use the environment scope.
+ - Add a key called `KUBE_CONTEXT` with a value like `path/to/agent/project:gke-agent`. Select the environment scope of your choice.
- Select **Save changes**.
- ![Cluster Base Domain](img/guide_base_domain_v12_3.png)
-
-## Enable Auto DevOps (optional)
+## Enable Auto DevOps and run the pipeline
While Auto DevOps is enabled by default, Auto DevOps can be disabled at both
the instance level (for self-managed instances) and the group level. Complete
these steps to enable Auto DevOps if it's disabled:
-1. Go to **Settings > CI/CD > Auto DevOps**, and select **Expand**.
+1. On the top bar, select **Menu > Projects** and find the application project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **Auto DevOps**.
1. Select **Default to Auto DevOps pipeline** to display more options.
1. In **Deployment strategy**, select your desired [continuous deployment strategy](../requirements.md#auto-devops-deployment-strategy)
to deploy the application to production after the pipeline successfully runs on the default branch.
1. Select **Save changes**.
+1. Edit `.gitlab-ci.yml` file to include Auto DevOps template and commit the change to `master` branch:
- ![Auto DevOps settings](img/guide_enable_autodevops_v12_3.png)
-
-After you save your changes, GitLab creates a new pipeline. To view it, go to
-**{rocket}** **CI/CD > Pipelines**.
+ ```yaml
+ include:
+ - template: Auto-DevOps.gitlab-ci.yml
+ ```
-In the next section, we explain what each job does in the pipeline.
+The commit should trigger a pipeline. In the next section, we explain what each job does in the pipeline.
## Deploy the application
@@ -278,8 +258,6 @@ 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 the default branch.
-![Merge request](img/guide_merge_request_v12_3.png)
-
After a few minutes a test fails, which means a test was
'broken' by your change. Select the failed `test` job to see more information
about it:
@@ -311,8 +289,6 @@ see the test passing, but also the application deployed as a
[review application](../stages.md#auto-review-apps). You can visit it by selecting
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 default branch,
and then deploys the application to production.
diff --git a/doc/topics/autodevops/cloud_deployments/img/guide_base_domain_v12_3.png b/doc/topics/autodevops/cloud_deployments/img/guide_base_domain_v12_3.png
deleted file mode 100644
index 7d3b6a2f905..00000000000
--- a/doc/topics/autodevops/cloud_deployments/img/guide_base_domain_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/cloud_deployments/img/guide_create_project_v12_3.png b/doc/topics/autodevops/cloud_deployments/img/guide_create_project_v12_3.png
deleted file mode 100644
index a22730520ef..00000000000
--- a/doc/topics/autodevops/cloud_deployments/img/guide_create_project_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/cloud_deployments/img/guide_enable_autodevops_v12_3.png b/doc/topics/autodevops/cloud_deployments/img/guide_enable_autodevops_v12_3.png
deleted file mode 100644
index a3bcaeb99ae..00000000000
--- a/doc/topics/autodevops/cloud_deployments/img/guide_enable_autodevops_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/cloud_deployments/img/guide_merge_request_review_app_v12_3.png b/doc/topics/autodevops/cloud_deployments/img/guide_merge_request_review_app_v12_3.png
deleted file mode 100644
index e94654f4e50..00000000000
--- a/doc/topics/autodevops/cloud_deployments/img/guide_merge_request_review_app_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/cloud_deployments/img/guide_merge_request_v12_3.png b/doc/topics/autodevops/cloud_deployments/img/guide_merge_request_v12_3.png
deleted file mode 100644
index 5565be701cd..00000000000
--- a/doc/topics/autodevops/cloud_deployments/img/guide_merge_request_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/cloud_deployments/img/guide_project_landing_page_v12_10.png b/doc/topics/autodevops/cloud_deployments/img/guide_project_landing_page_v12_10.png
deleted file mode 100644
index 54e7141dad2..00000000000
--- a/doc/topics/autodevops/cloud_deployments/img/guide_project_landing_page_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/cloud_deployments/img/guide_project_template_v12_3.png b/doc/topics/autodevops/cloud_deployments/img/guide_project_template_v12_3.png
deleted file mode 100644
index 2b8d7224747..00000000000
--- a/doc/topics/autodevops/cloud_deployments/img/guide_project_template_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index dfc2828e383..d8734ab5b13 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -243,29 +243,13 @@ See [Multiple Kubernetes clusters for Auto DevOps](multiple_clusters_auto_devops
## Customizing the Kubernetes namespace
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
+In GitLab 14.5 and earlier, you could use `environment:kubernetes:namespace`
+to specify a namespace for the environment.
+However, this feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8),
+along with certificate-based integration.
-For clusters not managed by GitLab, you can customize the namespace in
-`.gitlab-ci.yml` by specifying
-[`environment:kubernetes:namespace`](../../ci/environments/index.md#configure-kubernetes-deployments-deprecated).
-For example, the following configuration overrides the namespace used for
-`production` deployments:
-
-```yaml
-include:
- - template: Auto-DevOps.gitlab-ci.yml
-
-production:
- environment:
- kubernetes:
- namespace: production
-```
-
-When deploying to a custom namespace with Auto DevOps, the service account
-provided with the cluster needs at least the `edit` role within the namespace.
-
-- If the service account can create namespaces, then the namespace can be created on-demand.
-- Otherwise, the namespace must exist prior to deployment.
+You should now use the `KUBE_NAMESPACE` environment variable and
+[limit the environments it is available for](../../ci/environments/index.md#scope-environments-with-specs).
## Using components of Auto DevOps
@@ -315,7 +299,7 @@ You can configure many Auto DevOps jobs to run in an [offline environment](../..
build:
image: "$REGISTRY_URL/docker/auto-build-image:v0.6.0"
services:
- - name: "$REGISTRY_URL/greg/docker/docker:20.10.6-dind"
+ - name: "$REGISTRY_URL/greg/docker/docker:20.10.16-dind"
command: ['--tls=false', '--host=tcp://0.0.0.0:2375']
```
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 02485ebafff..f3ea13ad1ce 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -27,7 +27,7 @@ To prepare the deployment:
## Auto DevOps deployment strategy
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
When using Auto DevOps to deploy your applications, choose the
[continuous deployment strategy](../../ci/introduction/index.md)
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index a677787b980..8d35fd245d5 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -171,14 +171,14 @@ might want to use a [custom buildpack](customize.md#custom-buildpacks).
## Auto Code Quality
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) from GitLab Starter to GitLab Free in 13.2.
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) from GitLab Starter to GitLab Free in 13.2.
Auto Code Quality uses the
[Code Quality image](https://gitlab.com/gitlab-org/ci-cd/codequality) to run
static analysis and other code checks on the current code. After creating the
report, it's uploaded as an artifact which you can later download and check
out. The merge request widget also displays any
-[differences between the source and target branches](../../user/project/merge_requests/code_quality.md).
+[differences between the source and target branches](../../ci/testing/code_quality.md).
## Auto SAST
@@ -336,7 +336,7 @@ You can disable DAST:
> Introduced in GitLab 10.4.
-Auto [Browser Performance Testing](../../user/project/merge_requests/browser_performance_testing.md)
+Auto [Browser Performance Testing](../../ci/testing/browser_performance_testing.md)
measures the browser performance of a web page with the
[Sitespeed.io container](https://hub.docker.com/r/sitespeedio/sitespeed.io/),
creates a JSON report including the overall performance score for each page, and
@@ -351,13 +351,13 @@ file named `.gitlab-urls.txt` in the root directory, one file per line. For exam
```
Any browser performance differences between the source and target branches are also
-[shown in the merge request widget](../../user/project/merge_requests/browser_performance_testing.md).
+[shown in the merge request widget](../../ci/testing/browser_performance_testing.md).
## Auto Load Performance Testing **(PREMIUM)**
> Introduced in GitLab 13.2.
-Auto [Load Performance Testing](../../user/project/merge_requests/load_performance_testing.md)
+Auto [Load Performance Testing](../../ci/testing/load_performance_testing.md)
measures the server performance of an application with the
[k6 container](https://hub.docker.com/r/loadimpact/k6/),
creates a JSON report including several key result metrics, and
@@ -368,7 +368,7 @@ written that's tailored to your specific application. The test also needs to be
configured so it can pick up the environment's dynamic URL via a CI/CD variable.
Any load performance test result differences between the source and target branches are also
-[shown in the merge request widget](../../user/project/merge_requests/load_performance_testing.md).
+[shown in the merge request widget](../../user/project/merge_requests/widgets.md).
## Auto Deploy
diff --git a/doc/topics/offline/quick_start_guide.md b/doc/topics/offline/quick_start_guide.md
index 901a2dc750c..aa923eb6dc6 100644
--- a/doc/topics/offline/quick_start_guide.md
+++ b/doc/topics/offline/quick_start_guide.md
@@ -23,7 +23,7 @@ For a video walkthrough of this process, see [Offline GitLab Installation: Downl
You should [manually download the GitLab package](../../update/package/index.md#upgrade-using-a-manually-downloaded-package) and relevant dependencies using a server of the same operating system type that has access to the Internet.
-If your offline environment has no local network access, you must manually transport across the relevant package files through physical media, such as a USB drive or writable DVD.
+If your offline environment has no local network access, you must manually transport across the relevant package files through physical media, such as a USB drive, or writable DVD.
In Ubuntu, this can be performed on a server with Internet access using the following commands:
@@ -70,7 +70,7 @@ sudo EXTERNAL_URL="http://my-host.internal" dpkg -i <gitlab_package_name>.deb
## Enabling SSL
-Follow these steps to enable SSL for your fresh instance. Note that these steps reflect those for
+Follow these steps to enable SSL for your fresh instance. These steps reflect those for
[manually configuring SSL in Omnibus's NGINX configuration](https://docs.gitlab.com/omnibus/settings/nginx.html#manually-configuring-https):
1. Make the following changes to `/etc/gitlab/gitlab.rb`:
@@ -100,7 +100,7 @@ Follow these steps to enable SSL for your fresh instance. Note that these steps
## Enabling the GitLab Container Registry
-Follow these steps to enable the container registry. Note that these steps reflect those for
+Follow these steps to enable the container registry. These steps reflect those for
[configuring the container registry under an existing domain](../../administration/packages/container_registry.md#configure-container-registry-under-an-existing-gitlab-domain):
1. Make the following changes to `/etc/gitlab/gitlab.rb`:
@@ -180,7 +180,7 @@ sudo docker run -d --restart always --name gitlab-runner -v /etc/gitlab-runner:/
### Authenticating the registry against the host OS
-As noted in [Docker's registry authentication documentation](https://docs.docker.com/registry/insecure/#docker-still-complains-about-the-certificate-when-using-authentication),
+As noted in [Docker registry authentication documentation](https://docs.docker.com/registry/insecure/#docker-still-complains-about-the-certificate-when-using-authentication),
certain versions of Docker require trusting the certificate chain at the OS level.
In the case of Ubuntu, this involves using `update-ca-certificates`:
diff --git a/doc/topics/use_gitlab.md b/doc/topics/use_gitlab.md
deleted file mode 100644
index 6c6c5f71fc2..00000000000
--- a/doc/topics/use_gitlab.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../user/index.md'
-remove_date: '2022-06-17'
----
-
-This document was moved to [another location](../user/index.md).
-
-<!-- This redirect file can be deleted after <2022-06-17>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/tutorials/make_your_first_git_commit.md b/doc/tutorials/make_your_first_git_commit.md
index fd153b51a2c..a35137e158b 100644
--- a/doc/tutorials/make_your_first_git_commit.md
+++ b/doc/tutorials/make_your_first_git_commit.md
@@ -19,7 +19,7 @@ Before you begin:
- [Install Git on your local machine](../topics/git/how_to_install_git/index.md).
- Ensure you can sign in to an instance of GitLab. If your organization doesn't
have GitLab, create an account on GitLab.com.
-- [Create SSH keys and add them to GitLab](../ssh/index.md). SSH keys are how you
+- [Create SSH keys and add them to GitLab](../user/ssh.md). SSH keys are how you
securely communicate between your computer and GitLab.
## What is Git?
diff --git a/doc/tutorials/move_personal_project_to_a_group.md b/doc/tutorials/move_personal_project_to_a_group.md
index f8b91792780..fdda42be3fa 100644
--- a/doc/tutorials/move_personal_project_to_a_group.md
+++ b/doc/tutorials/move_personal_project_to_a_group.md
@@ -77,7 +77,7 @@ project.
NOTE:
For more information about these migration steps,
-see [Transferring your project into another namespace](../user/project/settings/index.md#transferring-an-existing-project-into-another-namespace).
+see [Transferring your project into another namespace](../user/project/settings/index.md#transfer-a-project-to-another-namespace).
A migration might result in follow-up work to update the project path in
your related resources and tools, such as websites and package managers.
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index d726f96f646..81b98b95068 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -45,6 +45,27 @@ sole discretion of GitLab Inc.
<div class="announcement-milestone">
+## Announced in 15.2
+
+<div class="deprecation removal-160 breaking-change">
+
+### Remove `job_age` parameter from `POST /jobs/request` Runner endpoint
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Review the details carefully before upgrading.
+
+The `job_age` parameter, returned from the `POST /jobs/request` API endpoint used in communication with GitLab Runner, was never used by any GitLab or Runner feature. This parameter will be removed in GitLab 16.0.
+
+This could be a breaking change for anyone that developed their own runner that relies on this parameter being returned by the endpoint. This is not a breaking change for anyone using an officially released version of GitLab Runner, including public shared runners on GitLab.com.
+
+</div>
+</div>
+
+<div class="announcement-milestone">
+
## Announced in 15.1
<div class="deprecation removal-160 breaking-change">
@@ -892,11 +913,11 @@ If you have explicitly excluded retire.js using DS_EXCLUDED_ANALYZERS you will n
</div>
-<div class="deprecation removal-152 breaking-change">
+<div class="deprecation removal-154 breaking-change">
### SAST analyzer consolidation and CI/CD template changes
-Planned removal: GitLab <span class="removal-milestone">15.2</span> (2022-07-22)
+Planned removal: GitLab <span class="removal-milestone">15.4</span> (2022-09-22)
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
@@ -905,9 +926,9 @@ Review the details carefully before upgrading.
GitLab SAST uses various [analyzers](https://docs.gitlab.com/ee/user/application_security/sast/analyzers/) to scan code for vulnerabilities.
We are reducing the number of analyzers used in GitLab SAST as part of our long-term strategy to deliver a better and more consistent user experience.
-Streamlining the set of analyzers will also enable faster [iteration](https://about.gitlab.com/handbook/values/#iteration), better [results](https://about.gitlab.com/handbook/values/#results), and greater [efficiency](https://about.gitlab.com/handbook/values/#results) (including a reduction in CI runner usage in most cases).
+Streamlining the set of analyzers will also enable faster [iteration](https://about.gitlab.com/handbook/values/#iteration), better [results](https://about.gitlab.com/handbook/values/#results), and greater [efficiency](https://about.gitlab.com/handbook/values/#efficiency) (including a reduction in CI runner usage in most cases).
-In GitLab 15.2, GitLab SAST will no longer use the following analyzers:
+In GitLab 15.4, GitLab SAST will no longer use the following analyzers:
- [ESLint](https://gitlab.com/gitlab-org/security-products/analyzers/eslint) (JavaScript, TypeScript, React)
- [Gosec](https://gitlab.com/gitlab-org/security-products/analyzers/gosec) (Go)
@@ -922,7 +943,14 @@ We will not delete container images previously published for these analyzers; an
We will also remove Java from the scope of the [SpotBugs](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) analyzer and replace it with the [Semgrep-based analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep).
This change will make it simpler to scan Java code; compilation will no longer be required.
-This change will be reflected in the automatic language detection portion of the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml).
+This change will be reflected in the automatic language detection portion of the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml). Note that the SpotBugs-based analyzer will continue to cover Groovy, Kotlin, and Scala.
+
+If you've already dismissed a vulnerability finding from one of the deprecated analyzers, the replacement attempts to respect your previous dismissal. The system behavior depends on:
+
+- whether you’ve excluded the Semgrep-based analyzer from running in the past.
+- which analyzer first discovered the vulnerabilities shown in the project’s Vulnerability Report.
+
+See [Vulnerability translation documentation](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#vulnerability-translation) for further details.
If you applied customizations to any of the affected analyzers or if you currently disable the Semgrep analyzer in your pipelines, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352554#breaking-change).
@@ -1453,12 +1481,12 @@ Tracing in GitLab is an integration with Jaeger, an open-source end-to-end distr
<div class="deprecation removal-150">
-### `artifacts:report:cobertura` keyword
+### `artifacts:reports:cobertura` keyword
Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
Currently, test coverage visualizations in GitLab only support Cobertura reports. Starting 15.0, the
-`artifacts:report:cobertura` keyword will be replaced by
+`artifacts:reports:cobertura` keyword will be replaced by
[`artifacts:reports:coverage_report`](https://gitlab.com/gitlab-org/gitlab/-/issues/344533). Cobertura will be the
only supported report file in 15.0, but this is the first step towards GitLab supporting other report types.
diff --git a/doc/update/index.md b/doc/update/index.md
index dcdcf8f01ae..e9fa2321450 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -54,7 +54,7 @@ There are also instructions when you want to
Editions.
In the past we used separate documents for the upgrading instructions, but we
-have since switched to using a single document. The old upgrading guidelines
+have switched to using a single document. The old upgrading guidelines
can still be found in the Git repository:
- [Old upgrading guidelines for Community Edition](https://gitlab.com/gitlab-org/gitlab-foss/tree/11-8-stable/doc/update)
@@ -63,8 +63,8 @@ can still be found in the Git repository:
### Installation using Docker
GitLab provides official Docker images for both Community and Enterprise
-editions. They are based on the Omnibus package and instructions on how to
-update them are in [a separate document](https://docs.gitlab.com/omnibus/docker/README.html).
+editions, and they are based on the Omnibus package. See how to
+[install GitLab using Docker](../install/docker.md).
### Installation using Helm
@@ -179,7 +179,7 @@ Expected batched background migration for the given configuration to be marked a
If you get this error, [check the batched background migration options](../user/admin_area/monitoring/background_migrations.md#database-migrations-failing-because-of-batched-background-migration-not-finished) to complete the upgrade.
-### What do I do if my background migrations are stuck?
+### What do you do if your background migrations are stuck?
WARNING:
The following operations can disrupt your GitLab performance. They run a number of Sidekiq jobs that perform various database or file updates.
@@ -331,11 +331,11 @@ cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:elastic:list_pending_migrations
```
-### What do I do if my Advanced Search migrations are stuck?
+### What do you do if your Advanced Search migrations are stuck?
See [how to retry a halted migration](../integration/advanced_search/elasticsearch.md#retry-a-halted-migration).
-### What do I do for the error `Elasticsearch version not compatible`
+### What do you do for the error `Elasticsearch version not compatible`
Confirm that your version of Elasticsearch or OpenSearch is [compatible with your version of GitLab](../integration/advanced_search/elasticsearch.md#version-requirements).
@@ -361,7 +361,7 @@ It's also important to ensure that any [background migrations have been fully co
before upgrading to a new major version.
If you have enabled the [Elasticsearch integration](../integration/advanced_search/elasticsearch.md) **(PREMIUM SELF)**, then
-[ensure all Advanced Search migrations are completed](#checking-for-pending-advanced-search-migrations) in the last minor version within
+[ensure all Advanced Search migrations are completed](#checking-for-pending-advanced-search-migrations) in the last minor version in
your current version
before proceeding with the major version upgrade.
@@ -379,7 +379,7 @@ 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`](#1200) -> `12.0.12` -> [`12.1.17`](#1210) -> [`12.10.14`](#12100) -> `13.0.14` -> [`13.1.11`](#1310) -> [`13.8.8`](#1388) -> [`13.12.15`](#13120) -> [`14.0.12`](#1400) -> [`14.3.6`](#1430) -> [`14.9.5`](#1490) -> [`14.10.Z`](#1410) -> [`15.0.Z`](#1500) -> [latest `15.Y.Z`](https://gitlab.com/gitlab-org/gitlab/-/releases)
+`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> [`11.11.8`](#1200) -> `12.0.12` -> [`12.1.17`](#1210) -> [`12.10.14`](#12100) -> `13.0.14` -> [`13.1.11`](#1310) -> [`13.8.8`](#1388) -> [`13.12.15`](#13120) -> [`14.0.12`](#1400) -> [`14.3.6`](#1430) -> [`14.9.5`](#1490) -> [`14.10.Z`](#14100) -> [`15.0.Z`](#1500) -> [latest `15.Y.Z`](https://gitlab.com/gitlab-org/gitlab/-/releases)
The following table, while not exhaustive, shows some examples of the supported
upgrade paths.
@@ -387,8 +387,8 @@ Additional steps between the mentioned versions are possible. We list the minima
| Target version | Your version | Supported upgrade path | Note |
| -------------- | ------------ | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
-| `15.1.0` | `14.6.2` | `14.6.2` -> `14.9.5` -> `14.10.4` -> `15.0.2` -> `15.1.0` | Three intermediate versions are required: `14.9` and `14.10`, `15.0`, then `15.1.0`. |
-| `15.0.0` | `14.6.2` | `14.6.2` -> `14.9.5` -> `14.10.4` -> `15.0.2` | Two intermediate versions are required: `14.9` and `14.10`, then `15.0.0`. |
+| `15.1.0` | `14.6.2` | `14.6.2` -> `14.9.5` -> `14.10.5` -> `15.0.2` -> `15.1.0` | Three intermediate versions are required: `14.9` and `14.10`, `15.0`, then `15.1.0`. |
+| `15.0.0` | `14.6.2` | `14.6.2` -> `14.9.5` -> `14.10.5` -> `15.0.2` | Two intermediate versions are required: `14.9` and `14.10`, then `15.0.0`. |
| `14.6.2` | `13.10.2` | `13.10.2` -> `13.12.15` -> `14.0.12` -> `14.3.6` => `14.6.2` | Three intermediate versions are required: `13.12` and `14.0`, `14.3`, then `14.6.2`. |
| `14.1.8` | `13.9.2` | `13.9.2` -> `13.12.15` -> `14.0.12` -> `14.1.8` | Two intermediate versions are required: `13.12` and `14.0`, then `14.1.8`. |
| `13.12.15` | `12.9.2` | `12.9.2` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.8.8` -> `13.12.15` | Four intermediate versions are required: `12.10`, `13.0`, `13.1` and `13.8.8`, then `13.12.15`. |
@@ -425,7 +425,7 @@ Edition, follow the guides below based on the installation method:
### Enterprise to Community Edition
-If you need to downgrade your Enterprise Edition installation back to Community
+To downgrade your Enterprise Edition installation back to Community
Edition, you can follow [this guide](../downgrade_ee_to_ce/index.md) to make the process as smooth as
possible.
@@ -442,7 +442,7 @@ At the end of major and minor release posts, there are three sections to look fo
These include:
-- Steps you need to perform as part of an upgrade.
+- Steps you must perform as part of an upgrade.
For example [8.12](https://about.gitlab.com/releases/2016/09/22/gitlab-8-12-released/#upgrade-barometer)
required the Elasticsearch index to be recreated. Any older version of GitLab upgrading to 8.12 or later would require this.
- Changes to the versions of software we support such as
@@ -458,11 +458,28 @@ 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.
+### 15.2.0 (unreleased)
+
+- GitLab installations that have multiple web nodes should be
+ [upgraded to 15.1](#1510) before upgrading to 15.2 (and later) due to a
+ configuration change in Rails that can result in inconsistent ETag key
+ generation.
+- Some Sidekiq workers were renamed in this release. To avoid any disruption, [run the Rake tasks to migrate any pending jobs](../raketasks/sidekiq_job_migration.md#future-jobs) before starting the upgrade to GitLab 15.2.0.
+
### 15.1.0
- If you run external PostgreSQL, particularly AWS RDS,
[check you have a PostgreSQL bug fix](#postgresql-segmentation-fault-issue)
to avoid the database crashing.
+- In GitLab 15.1.0, we are switching Rails `ActiveSupport::Digest` to use SHA256 instead of MD5.
+ This affects ETag key generation for resources such as raw Snippet file
+ downloads. To ensure consistent ETag key generation across multiple
+ web nodes when upgrading, all servers must first be upgraded to 15.1.Z before
+ upgrading to 15.2.0 or later:
+
+ 1. Ensure all GitLab web nodes are running GitLab 15.1.Z.
+ 1. [Enable the `active_support_hash_digest_sha256` feature flag](../administration/feature_flags.md#how-to-enable-and-disable-features-behind-flags) to switch `ActiveSupport::Digest` to use SHA256:
+ 1. Only then, continue to upgrade to later versions of GitLab.
- Unauthenticated requests to the [`ciConfig` GraphQL field](../api/graphql/reference/index.md#queryciconfig) are no longer supported.
Before you upgrade to GitLab 15.1, add an [access token](../api/index.md#authentication) to your requests.
The user creating the token must have [permission](../user/permissions.md) to create pipelines in the project.
@@ -473,6 +490,9 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
- If you run external PostgreSQL, particularly AWS RDS,
[check you have a PostgreSQL bug fix](#postgresql-segmentation-fault-issue)
to avoid the database crashing.
+- The use of encrypted S3 buckets with storage-specific configuration is no longer supported after [removing support for using `background_upload`](removals.md#background-upload-for-object-storage).
+- The [certificate-based Kubernetes integration (DEPRECATED)](../user/infrastructure/clusters/index.md#certificate-based-kubernetes-integration-deprecated) is disabled by default, but you can be re-enable it through the [`certificate_based_clusters` feature flag](../administration/feature_flags.md#how-to-enable-and-disable-features-behind-flags) until GitLab 16.0.
+- When you use the GitLab Helm Chart project with a custom `serviceAccount`, ensure it has `get` and `list` permissions for the `serviceAccount` and `secret` resources.
### 14.10.0
@@ -634,7 +654,7 @@ or [init scripts](upgrading_from_source.md#configure-sysv-init-script) by [follo
All merge request diff commits automatically incorporate these changes, and there are no
additional requirements to perform the upgrade.
Existing data in the `merge_request_diff_commits` table remains unpacked until you run `VACUUM FULL merge_request_diff_commits`.
- But note that the `VACUUM FULL` operation locks and rewrites the entire `merge_request_diff_commits` table,
+ However, the `VACUUM FULL` operation locks and rewrites the entire `merge_request_diff_commits` table,
so the operation takes some time to complete and it blocks access to this table until the end of the process.
We advise you to only run this command while GitLab is not actively used or it is taken offline for the duration of the process.
The time it takes to complete depends on the size of the table, which can be obtained by using `select pg_size_pretty(pg_total_relation_size('merge_request_diff_commits'));`.
@@ -684,6 +704,10 @@ or [init scripts](upgrading_from_source.md#configure-sysv-init-script) by [follo
as Sidekiq would continue using a bad connection. Geo and other features that rely on
cron jobs running regularly do not work until Sidekiq is restarted. We recommend
upgrading to GitLab 14.4.3 and later if this issue affects you.
+- After enabling database load balancing by default in 14.4.0, we found an issue where
+ [Database load balancing does not work with an AWS Aurora cluster](https://gitlab.com/gitlab-org/gitlab/-/issues/220617).
+ We recommend moving your databases from Aurora to RDS for PostgreSQL before
+ upgrading. Refer to [Moving GitLab databases to a different PostgreSQL instance](../administration/postgresql/moving.md).
- GitLab 14.4.0 includes a
[background migration `PopulateTopicsTotalProjectsCountCache`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71033)
that may remain stuck permanently in a **pending** state when the instance lacks records that match the migration's target.
@@ -750,7 +774,7 @@ for how to proceed.
- [`geo_job_artifact_deleted_events`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66763)
- [`push_event_payloads`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67299)
- `ci_job_artifacts`:
- - [Finalize job_id conversion to `bigint` for `ci_job_artifacts`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67774)
+ - [Finalize `job_id` conversion to `bigint` for `ci_job_artifacts`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67774)
- [Finalize `ci_job_artifacts` conversion to `bigint`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65601)
If the migrations are executed as part of a no-downtime deployment, there's a risk of failure due to lock conflicts with the application logic, resulting in lock timeout or deadlocks. In each case, these migrations are safe to re-run until successful:
@@ -992,10 +1016,10 @@ GitLab 13.2.0 [remediates](https://gitlab.com/gitlab-org/gitlab/-/merge_requests
After upgrading, if some of your users are unexpectedly encountering 404 or 422 errors when signing in,
or "blocked" messages when using the command line,
their accounts may have been un-confirmed.
-In that case, please ask them to check their email for a re-confirmation link.
+In that case, ask them to check their email for a re-confirmation link.
For more information, see our discussion of [Email confirmation issues](../user/upgrade_email_bypass.md).
-GitLab 13.2.0 relies on the `btree_gist` extension for PostgreSQL. For installations with an externally managed PostgreSQL setup, please make sure to
+GitLab 13.2.0 relies on the `btree_gist` extension for PostgreSQL. For installations with an externally managed PostgreSQL setup, make sure to
[install the extension manually](https://www.postgresql.org/docs/11/sql-createextension.html) before upgrading GitLab if the database user for GitLab
is not a superuser. This is not necessary for installations using a GitLab managed PostgreSQL database.
@@ -1042,7 +1066,7 @@ If you persist your own Rack Attack initializers between upgrades, you might
- The final patch release (12.10.14)
[has a regression affecting maven package uploads](https://about.gitlab.com/releases/2020/07/06/critical-security-release-gitlab-13-1-3-released/#maven-package-upload-broken-in-121014).
- If you use this feature and need to stay on 12.10 while preparing to upgrade to 13.0:
+ If you use this feature and must stay on 12.10 while preparing to upgrade to 13.0:
- Upgrade to 12.10.13 instead.
- Upgrade to 13.0.14 as soon as possible.
@@ -1103,7 +1127,7 @@ When Geo is enabled, LFS objects fail to be saved for imported or mirrored proje
### PostgreSQL segmentation fault issue
If you run GitLab with external PostgreSQL, particularly AWS RDS, ensure you upgrade PostgreSQL
-to patch levels to a minimum of 12.10 or 13.3 before upgrading to GitLab 14.8 or later.
+to patch levels to a minimum of 12.7 or 13.3 before upgrading to GitLab 14.8 or later.
[In 14.8](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75511)
for GitLab Enterprise Edition and [in 15.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87983)
diff --git a/doc/update/package/convert_to_ee.md b/doc/update/package/convert_to_ee.md
index 34bd8e61107..9f8e56c460c 100644
--- a/doc/update/package/convert_to_ee.md
+++ b/doc/update/package/convert_to_ee.md
@@ -15,7 +15,7 @@ Converting from the same version of CE to EE is not explicitly necessary, and an
you are upgrading the same version (for example, CE 12.1 to EE 12.1), which is **recommended**.
WARNING:
-When updating to EE from CE, avoid reverting back to CE if you plan on going to EE again in the
+When updating to EE from CE, avoid reverting back to CE if you plan to go to EE again in the
future. Reverting back to CE can cause
[database issues](index.md#500-error-when-accessing-project--settings--repository)
that may require Support intervention.
@@ -31,7 +31,7 @@ The steps can be summed up to:
```
The output should be similar to: `Installed: 13.0.4-ce.0`. In that case,
- the equivalent Enterprise Edition version will be: `13.0.4-ee.0`. Write this
+ the equivalent Enterprise Edition version is: `13.0.4-ee.0`. Write this
value down.
**For CentOS/RHEL**
@@ -41,7 +41,7 @@ The steps can be summed up to:
```
The output should be similar to: `gitlab-ce-13.0.4-ce.0.el8.x86_64`. In that
- case, the equivalent Enterprise Edition version will be:
+ case, the equivalent Enterprise Edition version is:
`gitlab-ee-13.0.4-ee.0.el8.x86_64`. Write this value down.
1. Add the `gitlab-ee` [Apt or Yum repository](https://packages.gitlab.com/gitlab/gitlab-ee/install):
@@ -58,13 +58,19 @@ The steps can be summed up to:
curl --silent "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh" | sudo bash
```
- The above command will find your OS version and automatically set up the
+ The above command finds your OS version and automatically set up the
repository. If you are not comfortable installing the repository through a
piped script, you can first
[check its contents](https://packages.gitlab.com/gitlab/gitlab-ee/install).
-1. Next, install the `gitlab-ee` package. Note that this will automatically
- uninstall the `gitlab-ce` package on your GitLab server. `reconfigure`
+ NOTE:
+ If you want to use `dpkg`/`rpm` instead of `apt-get`/`yum`, go through the first
+ step to find the current GitLab version, then follow
+ [Update using a manually-downloaded package](index.md#upgrade-using-a-manually-downloaded-package),
+ and then [add your license](../../user/admin_area/license.md).
+
+1. Install the `gitlab-ee` package. The install automatically
+ uninstalls the `gitlab-ce` package on your GitLab server. `reconfigure`
Omnibus right after the `gitlab-ee` package is installed. **Make sure that you
install the exact same GitLab version**:
@@ -91,8 +97,7 @@ The steps can be summed up to:
sudo gitlab-ctl reconfigure
```
-1. Now go to the GitLab Admin Area of your server (`/admin/subscription`) and
- [add your license](../../user/admin_area/license.md).
+1. Now activate GitLab Enterprise Edition by [adding your license](../../user/admin_area/license.md).
1. After you confirm that GitLab is working as expected, you may remove the old
Community Edition repository:
@@ -111,8 +116,3 @@ The steps can be summed up to:
That's it! You can now use GitLab Enterprise Edition! To update to a newer
version, follow [Update using the official repositories](index.md#upgrade-using-the-official-repositories).
-
-NOTE:
-If you want to use `dpkg`/`rpm` instead of `apt-get`/`yum`, go through the first
-step to find the current GitLab version and then follow
-[Update using a manually-downloaded package](index.md#upgrade-using-a-manually-downloaded-package).
diff --git a/doc/update/package/downgrade.md b/doc/update/package/downgrade.md
index 7b8b4da0383..f48ba31568f 100644
--- a/doc/update/package/downgrade.md
+++ b/doc/update/package/downgrade.md
@@ -79,5 +79,5 @@ Steps:
sudo gitlab-ctl reconfigure
```
-1. [Restore GitLab](../../raketasks/backup_restore.md#restore-for-omnibus-gitlab-installations)
+1. [Restore GitLab](../../raketasks/restore_gitlab.md#restore-for-omnibus-gitlab-installations)
to complete the downgrade.
diff --git a/doc/update/package/index.md b/doc/update/package/index.md
index 15f43f59425..bf1154d1cf5 100644
--- a/doc/update/package/index.md
+++ b/doc/update/package/index.md
@@ -189,6 +189,11 @@ NOTE:
For the GitLab Community Edition, replace `gitlab-ee` with
`gitlab-ce`.
+## Upgrade the product documentation
+
+This is an optional step. If you [installed the product documentation](../../administration/docs_self_host.md),
+see how to [upgrade to a later version](../../administration/docs_self_host.md#upgrade-using-docker).
+
## Troubleshooting
### GitLab 13.7 and later unavailable on Amazon Linux 2
@@ -300,7 +305,7 @@ To fix this issue:
### Error `Failed to connect to the internal GitLab API` on a separate GitLab Pages server
-Please see [GitLab Pages troubleshooting](../../administration/pages/index.md#failed-to-connect-to-the-internal-gitlab-api).
+See [GitLab Pages troubleshooting](../../administration/pages/index.md#failed-to-connect-to-the-internal-gitlab-api).
### Error `An error occurred during the signature verification` when running `apt-get update`
diff --git a/doc/update/patch_versions.md b/doc/update/patch_versions.md
index dc09f6063c8..b7c148045bd 100644
--- a/doc/update/patch_versions.md
+++ b/doc/update/patch_versions.md
@@ -11,11 +11,11 @@ comments: false
Make sure you view [this update guide](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/update/patch_versions.md) from the tag (version) of GitLab you would like to install.
In most cases this should be the highest numbered production tag (without `rc` in it).
-You can select the tag in the version dropdown in the top left corner of GitLab (below the menu bar).
+You can select the tag in the version dropdown list in the top left corner of GitLab (below the menu bar).
### 0. Backup
-It's useful to make a backup just in case things go south. Depending on the installation method, backup commands vary. See the [backing up and restoring GitLab](../raketasks/backup_restore.md) documentation.
+Make a backup just in case things go south. Depending on the installation method, backup commands vary. See the [backing up and restoring GitLab](../raketasks/backup_restore.md) documentation.
### 1. Stop server
@@ -107,7 +107,7 @@ sudo -u git -H make
### 8. Install/Update `gitlab-elasticsearch-indexer` **(PREMIUM SELF)**
-Please follow the [install instruction](../integration/advanced_search/elasticsearch.md#install-elasticsearch).
+Follow the [install instruction](../integration/advanced_search/elasticsearch.md#install-elasticsearch).
### 9. Start application
diff --git a/doc/update/plan_your_upgrade.md b/doc/update/plan_your_upgrade.md
index cdc3ec39f9a..2374856ff0c 100644
--- a/doc/update/plan_your_upgrade.md
+++ b/doc/update/plan_your_upgrade.md
@@ -87,7 +87,7 @@ to roll back GitLab to a working state if there's a problem with the upgrade:
- Create a [GitLab backup](../raketasks/backup_restore.md).
Make sure to follow the instructions based on your installation method.
- Don't forget to back up the [secrets and configuration files](../raketasks/backup_restore.md#storing-configuration-files).
+ Don't forget to back up the [secrets and configuration files](../raketasks/backup_gitlab.md#storing-configuration-files).
- Alternatively, create a snapshot of your instance. If this is a multi-node
installation, you must snapshot every node.
**This process is out of scope for GitLab Support.**
@@ -103,7 +103,7 @@ To restore your GitLab backup:
the versions of the backed up and the new GitLab instance must be the same.
- [Restore GitLab](../raketasks/backup_restore.md#restore-gitlab).
Make sure to follow the instructions based on your installation method.
- Confirm that the [secrets and configuration files](../raketasks/backup_restore.md#storing-configuration-files) are also restored.
+ Confirm that the [secrets and configuration files](../raketasks/backup_gitlab.md#storing-configuration-files) are also restored.
- If restoring from a snapshot, know the steps to do this.
**This process is out of scope for GitLab Support.**
diff --git a/doc/update/removals.md b/doc/update/removals.md
index 299d1b4c341..fa5c016d3ab 100644
--- a/doc/update/removals.md
+++ b/doc/update/removals.md
@@ -31,6 +31,25 @@ For removal reviewers (Technical Writers only):
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-removals-doc
-->
+## Removed in 15.2
+
+### Support for older browsers
+
+In GitLab 15.2, we are cleaning up and [removing old code](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86003) that was specific for browsers that we no longer support. This has no impact on users if they use one of our [supported web browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers).
+
+Most notably, support for the following browsers has been removed:
+
+- Apple Safari 14 and older.
+- Mozilla Firefox 78.
+
+The minimum supported browser versions are:
+
+- Apple Safari 14.1.
+- Mozilla Firefox 91.
+- Google Chrome 92.
+- Chromium 92.
+- Microsoft Edge 92.
+
## Removed in 15.0
### API: `stale` status returned instead of `offline` or `not_connected`
@@ -66,14 +85,45 @@ This is a [breaking change](https://docs.gitlab.com/ee/development/contributing/
Review the details carefully before upgrading.
To reduce the overall complexity and maintenance burden of GitLab's [object storage feature](https://docs.gitlab.com/ee/administration/object_storage.html), support for using `background_upload` has been removed in GitLab 15.0.
+By default [direct upload](https://docs.gitlab.com/ee/development/uploads/index.html#direct-upload) will be used.
-This impacts a small subset of object storage providers, including but not limited to:
+This impacts a subset of object storage providers, including but not limited to:
- **OpenStack** Customers using OpenStack need to change their configuration to use the S3 API instead of Swift.
- **RackSpace** Customers using RackSpace-based object storage need to migrate data to a different provider.
If your object storage provider does not support `background_upload`, please [migrate objects to a supported object storage provider](https://docs.gitlab.com/ee/administration/object_storage.html#migrate-objects-to-a-different-object-storage-provider).
+#### Encrypted S3 buckets
+
+Additionally, this also breaks the use of [encrypted S3 buckets](https://docs.gitlab.com/ee/administration/object_storage.html#encrypted-s3-buckets) with [storage-specific configuration form](https://docs.gitlab.com/ee/administration/object_storage.html#storage-specific-configuration).
+
+If your S3 buckets have [SSE-S3 or SSE-KMS encryption enabled](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html), please [migrate your configuration to use consolidated object storage form](https://docs.gitlab.com/ee/administration/object_storage.html#transition-to-consolidated-form) before upgrading to GitLab 15.0. Otherwise, you may start getting `ETag mismatch` errors during objects upload.
+
+#### 403 errors
+
+If you see 403 errors when uploading to object storage after
+upgrading to GitLab 15.0, check that the [correct permissions](https://docs.gitlab.com/ee/administration/object_storage.html#iam-permissions)
+are assigned to the bucket. Direct upload needs the ability to delete an
+object (example: `s3:DeleteObject`), but background uploads do not.
+
+#### `remote_directory` with a path prefix
+
+If the object storage `remote_directory` configuration contains a slash (`/`) after the bucket (example: `gitlab/uploads`), be aware that this [was never officially supported](https://gitlab.com/gitlab-org/gitlab/-/issues/292958).
+Some users found that they could specify a path prefix to the bucket. In direct upload mode, object storage uploads will fail if a slash is present in GitLab 15.0.
+
+If you have set a prefix, you can use a workaround to revert to background uploads:
+
+1. Continue to use [storage-specific configuration](https://docs.gitlab.com/ee/administration/object_storage.html#storage-specific-configuration).
+1. In Omnibus GitLab, set the `GITLAB_LEGACY_BACKGROUND_UPLOADS` to re-enable background uploads:
+
+ ```ruby
+ gitlab_rails['env'] = { 'GITLAB_LEGACY_BACKGROUND_UPLOADS' => 'artifacts,external_diffs,lfs,uploads,packages,dependency_proxy,terraform_state,pages' }
+ ```
+
+Prefixes will be supported officially in [GitLab 15.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91307).
+This workaround will be dropped, so we encourage migrating to consolidated object storage.
+
### Container Network and Host Security
WARNING:
@@ -443,6 +493,22 @@ You can still customize the behavior of the Secret Detection analyzer using the
For further details, see [the deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352565).
+### Self-managed certificate-based integration with Kubernetes feature flagged
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Review the details carefully before upgrading.
+
+In 15.0 the certificate-based integration with Kubernetes will be disabled by default.
+
+After 15.0, you should use the [agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. The agent for Kubernetes is a more robust, secure, and reliable integration with Kubernetes. [How do I migrate to the agent?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
+
+If you need more time to migrate, you can enable the `certificate_based_clusters` [feature flag](https://docs.gitlab.com/ee/administration/feature_flags.html), which re-enables the certificate-based integration.
+
+In GitLab 16.0, we will [remove the feature, its related code, and the feature flag](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). GitLab will continue to fix any security or critical issues until 16.0.
+
+For updates and details, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+
### Sidekiq configuration for metrics and health checks
WARNING:
@@ -553,9 +619,9 @@ Review the details carefully before upgrading.
The `Managed-Cluster-Applications.gitlab-ci.yml` CI/CD template is being removed. If you need an alternative, try the [Cluster Management project template](https://gitlab.com/gitlab-org/gitlab/-/issues/333610) instead. If your are not ready to move, you can copy the [last released version](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/v14.10.1/lib/gitlab/ci/templates/Managed-Cluster-Applications.gitlab-ci.yml) of the template into your project.
-### `artifacts:report:cobertura` keyword
+### `artifacts:reports:cobertura` keyword
-As of GitLab 15.0, the [`artifacts:report:cobertura`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscobertura-removed)
+As of GitLab 15.0, the [`artifacts:reports:cobertura`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscobertura-removed)
keyword has been [replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/344533) by
[`artifacts:reports:coverage_report`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscoverage_report).
Cobertura is the only supported report file, but this is the first step towards GitLab supporting other report types.
diff --git a/doc/update/upgrading_from_ce_to_ee.md b/doc/update/upgrading_from_ce_to_ee.md
index d6548620356..b953194b4cf 100644
--- a/doc/update/upgrading_from_ce_to_ee.md
+++ b/doc/update/upgrading_from_ce_to_ee.md
@@ -21,7 +21,7 @@ GitLab edition you are using (Community or Enterprise), see the
This guide assumes you have a correctly configured and tested installation of
GitLab Community Edition. If you run into any trouble or if you have any
-questions please contact us at `support@gitlab.com`.
+questions contact us at `support@gitlab.com`.
In all examples, replace `EE_BRANCH` with the Enterprise Edition branch for the
version you are using, and `CE_BRANCH` with the Community Edition branch.
@@ -41,7 +41,7 @@ cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
```
-For installations using MySQL, this may require granting "LOCK TABLES"
+For installations using MySQL, this may require granting `LOCK TABLES`
privileges to the GitLab user on the database version.
### 1. Stop server
@@ -88,7 +88,7 @@ sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
### 4. Install `gitlab-elasticsearch-indexer` **(PREMIUM SELF)**
-Please follow the [install instruction](../integration/advanced_search/elasticsearch.md#install-elasticsearch).
+Follow the [install instruction](../integration/advanced_search/elasticsearch.md#install-elasticsearch).
### 5. Start application
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index 29bb956cb54..8b921f6d0ce 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -8,12 +8,12 @@ comments: false
# Upgrading Community Edition and Enterprise Edition from source **(FREE SELF)**
Make sure you view this update guide from the branch (version) of GitLab you
-would like to install (for example, `11.8`). You can select the required version of documentation in the dropdown at the top right corner of GitLab documentation page.
+would like to install (for example, `11.8`). You can select the required version of documentation in the dropdown list at the top right corner of GitLab documentation page.
In each of the following examples, replace `BRANCH` with the branch of the version you upgrading to (for example, `11-8-stable` for `11.8`). Replace `PREVIOUS_BRANCH` with the
branch for the version you are upgrading from (for example, `11-7-stable` for `11.7`).
-If the highest number stable branch is unclear please check the
+If the highest number stable branch is unclear check the
[GitLab Blog](https://about.gitlab.com/blog/archives.html) for installation
guide links by version.
@@ -24,7 +24,7 @@ the [Upgrading from CE to EE](upgrading_from_ce_to_ee.md) documentation.
Major versions are reserved for backwards incompatible changes. We recommend that
you first upgrade to the latest available minor version of your current major version.
-Please follow the [Upgrade Recommendations](../policy/maintenance.md#upgrade-recommendations)
+Follow the [Upgrade Recommendations](../policy/maintenance.md#upgrade-recommendations)
to identify the ideal upgrade path.
Before upgrading to a new major version, you should ensure that any background
@@ -225,7 +225,7 @@ NGINX configuration to continue using it. This is because the GitLab application
sets it.
If you are using Apache instead of NGINX see the updated [Apache templates](https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/apache).
-Also note that because Apache does not support upstreams behind Unix sockets you
+Also because Apache does not support upstreams behind Unix sockets you
must let GitLab Workhorse listen on a TCP port. You can do this
via [`/etc/default/gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/support/init.d/gitlab.default.example#L38).
@@ -406,6 +406,11 @@ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
If all items are green, then congratulations, the upgrade is complete!
+### 17. Upgrade the product documentation
+
+This is an optional step. If you [installed the product documentation](../install/installation.md#install-the-product-documentation),
+see how to [upgrade to a later version](../administration/docs_self_host.md#upgrade-the-product-documentation-to-a-later-version).
+
## Version specific upgrading instructions
This section contains upgrading instructions for specific versions. When
@@ -423,7 +428,7 @@ Additional instructions here.
### 15.0.0
Support for more than one database has been added to GitLab. [As part of this](https://gitlab.com/gitlab-org/gitlab/-/issues/338182),
-`config/database.yml` needs to include a database name in the database configuration.
+`config/database.yml` must include a database name in the database configuration.
The `main: database` must be first. If an invalid or deprecated syntax is used, an error is generated
during application start:
@@ -442,7 +447,7 @@ production:
...
```
-Starting with GitLab 15.0, it needs to define a `main` database first:
+Starting with GitLab 15.0, it must define a `main` database first:
```yaml
production:
@@ -487,7 +492,7 @@ for the previous version.
For example, if you have upgraded to GitLab 12.6 and want to revert back to
12.5, follow the guides for upgrading from 12.4 to 12.5. You can
-use the version dropdown at the top of the page to select the right version.
+use the version dropdown list at the top of the page to select the right version.
When reverting, you should **not** follow the database migration guides, as the
backup has already been migrated to the previous version.
diff --git a/doc/update/with_downtime.md b/doc/update/with_downtime.md
index 9357f70e44a..c6ad854fd0f 100644
--- a/doc/update/with_downtime.md
+++ b/doc/update/with_downtime.md
@@ -15,12 +15,12 @@ there are a number of constraints. In particular, you can upgrade to only one mi
at a time, for example, from 14.6 to 14.7, then to 14.8, etc.
If you want to upgrade to more than one minor release at a time (for example, from 14.6 to 14.9),
-you need to take your GitLab instance offline, which implies downtime.
+you must take your GitLab instance offline, which implies downtime.
Before starting this process, verify the
[version specific upgrading instructions](index.md#version-specific-upgrading-instructions)
relevant to your [upgrade path](index.md#upgrade-paths).
-For a single node installation, you only need to [uprgade the GitLab package](package/index.md).
+For a single node installation, you must only [upgrade the GitLab package](package/index.md).
The process for upgrading a number of components of a multi-node GitLab
installation is the same as for zero downtime upgrades.
@@ -86,11 +86,11 @@ for Gitaly cluster.
If you are using Amazon Machine Images (AMIs) on AWS, the Gitaly nodes
**should not be upgraded via the AMI process**. Gitaly nodes should **only**
-be upgraded using the package upgrade. This is because:
+be upgraded using the package upgrade because:
- Praefect tracks replicas of Git repositories by server hostname.
-- Redeployment using AMIs will issue the nodes with new hostnames.
-- Even though the storage will be the same, Gitaly cluster will not work after this.
+- Redeployment using AMIs issues the nodes with new hostnames.
+- Even though the storage is the same, Gitaly cluster does not work after this.
The Praefect nodes, however, can be upgraded via an AMI redeployment process:
@@ -100,7 +100,7 @@ The Praefect nodes, however, can be upgraded via an AMI redeployment process:
1. The first node to be redeployed with the upgraded image should be your
deploy node.
1. After it's deployed, set `praefect['auto_migrate'] = true` in `gitlab.rb`
- and apply with `gitlab-ctl reconfigure`. This will run the database
+ and apply with `gitlab-ctl reconfigure`. This runs the database
migrations.
1. Redeploy your other Praefect nodes.
@@ -142,7 +142,7 @@ For unclustered PostgreSQL servers:
## Upgrade the Patroni node
-Patroni is used to achiece high availabilty with PostgreSQL.
+Patroni is used to achieve high availability with PostgreSQL.
If a PostgreSQL major version upgrade is required,
[follow the major version process](../administration/postgresql/replication_and_failover.md#upgrading-postgresql-major-version-in-a-patroni-cluster).
@@ -150,7 +150,7 @@ If a PostgreSQL major version upgrade is required,
The upgrade process for all other versions is performed on all replicas first.
After they're upgraded, a cluster failover occurs from the leader to one of the upgraded
replicas. This ensures that only one failover is needed, and once complete the new
-leader will be upgraded.
+leader is upgraded.
Follow the following process:
@@ -218,7 +218,7 @@ sudo yum install gitlab-ee
## Upgrade Redis HA (using Sentinel) **(PREMIUM SELF)**
-Follow [the zero downtime instructions](zero_downtime.md#use-redis-ha-using-sentinel)
+Follow [the zero downtime instructions](zero_downtime.md#redis-ha-using-sentinel)
for upgrading your Redis HA cluster.
## Upgrade the Rails nodes (Puma / Sidekiq)
@@ -232,7 +232,7 @@ All the Puma and Sidekiq processes were previously shut down. On each node:
ps -ef | egrep 'puma: | puma | sidekiq '
```
-Select one node that runs Puma. This will be your deploy node, and is responsible for
+Select one node that runs Puma. This is your deploy node, and is responsible for
running all database migrations. On the deploy node:
1. Ensure the server is configured to permit regular migrations. Check that
diff --git a/doc/update/zero_downtime.md b/doc/update/zero_downtime.md
index a3f9886ed0b..3cdc6177a4d 100644
--- a/doc/update/zero_downtime.md
+++ b/doc/update/zero_downtime.md
@@ -27,14 +27,14 @@ If you meet all the requirements above, follow these instructions in order. Ther
| Deployment type | Description |
| --------------------------------------------------------------- | ------------------------------------------------ |
| [Gitaly or Gitaly Cluster](#gitaly-or-gitaly-cluster) | GitLab CE/EE using HA architecture for Gitaly or Gitaly Cluster |
-| [Multi-node / PostgreSQL HA](#use-postgresql-ha) | GitLab CE/EE using HA architecture for PostgreSQL |
-| [Multi-node / Redis HA](#use-redis-ha-using-sentinel) | GitLab CE/EE using HA architecture for Redis |
+| [Multi-node / PostgreSQL HA](#postgresql) | GitLab CE/EE using HA architecture for PostgreSQL |
+| [Multi-node / Redis HA](#redis-ha-using-sentinel) | GitLab CE/EE using HA architecture for Redis |
| [Geo](#geo-deployment) | GitLab EE with Geo enabled |
| [Multi-node / HA with Geo](#multi-node--ha-deployment-with-geo) | GitLab CE/EE on multiple nodes |
Each type of deployment requires that you hot reload the `puma` and `sidekiq` processes on all nodes running these
services after you've upgraded. The reason for this is that those processes each load the GitLab Rails application which reads and loads
-the database schema into memory when starting up. Each of these processes needs to be reloaded (or restarted in the case of `sidekiq`)
+the database schema into memory when starting up. Each of these processes must be reloaded (or restarted in the case of `sidekiq`)
to re-read any database changes that have been made by post-deployment migrations.
Most of the time you can safely upgrade from a patch release to the next minor
@@ -260,7 +260,7 @@ node first and run database migrations.
sudo gitlab-ctl reconfigure
```
-### Use PostgreSQL HA
+### PostgreSQL
Pick a node to be the `Deploy Node`. It can be any application node, but it must be the same
node throughout the process.
@@ -277,7 +277,7 @@ node throughout the process.
- To prevent `reconfigure` from automatically running database migrations, ensure that `gitlab_rails['auto_migrate'] = false` is set in `/etc/gitlab/gitlab.rb`.
-**Gitaly only nodes**
+**PostgreSQL only nodes**
- Update the GitLab package
@@ -313,7 +313,7 @@ node throughout the process.
- If you're using PgBouncer:
- You need to bypass PgBouncer and connect directly to the database leader
+ You must bypass PgBouncer and connect directly to the database leader
before running migrations.
Rails uses an advisory lock when attempting to run a migration to prevent
@@ -385,7 +385,7 @@ sure you remove `/etc/gitlab/skip-auto-reconfigure` and revert
setting `gitlab_rails['auto_migrate'] = false` in
`/etc/gitlab/gitlab.rb` after you've completed these steps.
-### Use Redis HA (using Sentinel) **(PREMIUM SELF)**
+### Redis HA (using Sentinel) **(PREMIUM SELF)**
Package upgrades may involve version updates to the bundled Redis service. On
instances using [Redis for scaling](../administration/redis/index.md),
@@ -395,11 +395,11 @@ HA.
#### In the application node
-According to [official Redis docs](https://redis.io/topics/admin#upgrading-or-restarting-a-redis-instance-without-downtime),
+According to [official Redis documentation](https://redis.io/topics/admin#upgrading-or-restarting-a-redis-instance-without-downtime),
the easiest way to update an HA instance using Sentinel is to upgrade the
secondaries one after the other, perform a manual failover from current
primary (running old version) to a recently upgraded secondary (running a new
-version), and then upgrade the original primary. For this, we need to know
+version), and then upgrade the original primary. For this, we must know
the address of the current Redis primary.
- If your application node is running GitLab 12.7.0 or later, you can use the
@@ -416,7 +416,7 @@ following command to get address of current Redis primary
1. Get the address of one of the sentinel nodes specified as
`gitlab_rails['redis_sentinels']` in `/etc/gitlab/gitlab.rb`
- 1. Get the Redis master name specified as `redis['master_name']` in
+ 1. Get the Redis main name specified as `redis['master_name']` in
`/etc/gitlab/gitlab.rb`
1. Run the following command
@@ -427,6 +427,8 @@ following command to get address of current Redis primary
#### In the Redis secondary nodes
+1. Set `gitlab_rails['rake_cache_clear'] = false` in `gitlab.rb` if you haven't already. If not, you might receive the error `Redis::CommandError: READONLY You can't write against a read only replica.` during the reconfigure post installation of new package.
+
1. Install package for new version.
1. Run `sudo gitlab-ctl reconfigure`, if a reconfigure is not run as part of
@@ -442,8 +444,8 @@ following command to get address of current Redis primary
#### In the Redis primary node
-Before upgrading the Redis primary node, we need to perform a failover so that
-one of the recently upgraded secondary nodes becomes the new primary. Once the
+Before upgrading the Redis primary node, we must perform a failover so that
+one of the recently upgraded secondary nodes becomes the new primary. After the
failover is complete, we can go ahead and upgrade the original primary node.
1. Stop Redis service in Redis primary node so that it fails over to a secondary
@@ -623,7 +625,7 @@ Updates must be performed in the following order:
### Step 1: Choose a "deploy node" for each deployment
-You now need to choose:
+You now must choose:
- One instance for use as the **primary** "deploy node" on the Geo **primary** multi-node deployment.
- One instance for use as the **secondary** "deploy node" on each Geo **secondary** multi-node deployment.
@@ -696,7 +698,7 @@ sudo touch /etc/gitlab/skip-auto-reconfigure
1. If you're using PgBouncer:
- You need to bypass PgBouncer and connect directly to the database leader
+ You must bypass PgBouncer and connect directly to the database leader
before running migrations.
Rails uses an advisory lock when attempting to run a migration to prevent
diff --git a/doc/user/admin_area/analytics/dev_ops_report.md b/doc/user/admin_area/analytics/dev_ops_report.md
deleted file mode 100644
index 077718863e7..00000000000
--- a/doc/user/admin_area/analytics/dev_ops_report.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'dev_ops_reports.md'
-remove_date: '2022-06-16'
----
-
-This document was moved to [another location](dev_ops_reports.md).
-
-<!-- This redirect file can be deleted after <2022-06-16>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/admin_area/broadcast_messages.md b/doc/user/admin_area/broadcast_messages.md
index 9d4c1ffe375..959331c16de 100644
--- a/doc/user/admin_area/broadcast_messages.md
+++ b/doc/user/admin_area/broadcast_messages.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Activation
+group: Acquisition
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, howto
---
diff --git a/doc/user/admin_area/geo_nodes.md b/doc/user/admin_area/geo_nodes.md
index 3c33578b88f..710f37bb344 100644
--- a/doc/user/admin_area/geo_nodes.md
+++ b/doc/user/admin_area/geo_nodes.md
@@ -1,117 +1,11 @@
---
-stage: Systems
-group: Geo
-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: 'geo_sites.md'
+remove_date: '2022-10-05'
---
-# Geo sites Admin Area **(PREMIUM SELF)**
+This document was moved to [another location](geo_sites.md).
-You can configure various settings for GitLab Geo sites. For more information, see
-[Geo documentation](../../administration/geo/index.md).
-
-On either the primary or secondary site:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Geo > Sites**.
-
-## Common settings
-
-All Geo sites have the following settings:
-
-| Setting | Description |
-| --------| ----------- |
-| Primary | This marks a Geo site as **primary** site. There can be only one **primary** site. |
-| Name | The unique identifier for the Geo site. It's highly recommended to use a physical location as a name. Good examples are "London Office" or "us-east-1". Avoid words like "primary", "secondary", "Geo", or "DR". This makes the failover process easier because the physical location does not change, but the Geo site role can. All nodes in a single Geo site use the same site name. Nodes use the `gitlab_rails['geo_node_name']` setting in `/etc/gitlab/gitlab.rb` to lookup their Geo site record in the PostgreSQL database. If `gitlab_rails['geo_node_name']` is not set, the node's `external_url` with trailing slash is used as fallback. The value of `Name` is case-sensitive, and most characters are allowed. |
-| URL | The instance's user-facing URL. |
-
-The site you're currently browsing is indicated with a blue `Current` label, and
-the **primary** node is listed first as `Primary site`.
-
-## Secondary site settings
-
-**Secondary** sites have a number of additional settings available:
-
-| Setting | Description |
-|---------------------------|-------------|
-| Selective synchronization | Enable Geo [selective sync](../../administration/geo/replication/configuration.md#selective-synchronization) for this **secondary** site. |
-| Repository sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling repositories. |
-| File sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling files. |
-
-## Geo backfill
-
-**Secondary** sites are notified of changes to repositories and files by the **primary** site,
-and always attempt to synchronize those changes as quickly as possible.
-
-Backfill is the act of populating the **secondary** site with repositories and files that
-existed *before* the **secondary** site was added to the database. Because there may be
-extremely large numbers of repositories and files, it's not feasible to attempt to
-download them all at once; so, GitLab places an upper limit on the concurrency of
-these operations.
-
-How long the backfill takes is dependent on the maximum concurrency, but higher
-values place more strain on the **primary** site. The limits are configurable.
-If your **primary** site has lots of surplus capacity,
-you can increase the values to complete backfill in a shorter time. If it's
-under heavy load and backfill reduces its availability for normal requests,
-you can decrease them.
-
-## Set up the internal URLs
-
-> Setting up internal URLs in secondary sites was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77179) in GitLab 14.7.
-
-You can set up a different URL for synchronization between the primary and secondary site.
-
-The **primary** site's Internal URL is used by **secondary** sites to contact it
-(to sync repositories, for example). The name Internal URL distinguishes it from
-[External URL](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab),
-which is used by users. Internal URL does not need to be a private address.
-
-When [Geo secondary proxying](../../administration/geo/secondary_proxy/index.md) is enabled,
-the primary uses the secondary's internal URL to contact it directly.
-
-The internal URL defaults to external URL. To change it:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Geo > Nodes**.
-1. Select **Edit** on the site you want to customize.
-1. Edit the internal URL.
-1. Select **Save changes**.
-
-When enabled, the Admin Area for Geo shows replication details for each site directly
-from the primary site's UI, and through the Geo secondary proxy, if enabled.
-
-WARNING:
-We recommend using an HTTPS connection while configuring the Geo sites. To avoid
-breaking communication between **primary** and **secondary** sites when using
-HTTPS, customize your Internal URL to point to a load balancer with TLS
-terminated at the load balancer.
-
-WARNING:
-Starting with GitLab 13.3 and [until 13.11](https://gitlab.com/gitlab-org/gitlab/-/issues/325522),
-if you use an internal URL that is not accessible to the users, the
-OAuth authorization flow does not work properly, because users are redirected
-to the internal URL instead of the external one.
-
-## Multiple secondary sites behind a load balancer
-
-**Secondary** sites can use identical external URLs if
-a unique `name` is set for each Geo site. The `gitlab.rb` setting
-`gitlab_rails['geo_node_name']` must:
-
-- Be set for each GitLab instance that runs `puma`, `sidekiq`, or `geo_logcursor`.
-- Match a Geo site name.
-
-The load balancer must use sticky sessions to avoid authentication
-failures and cross-site request errors.
-
-<!-- ## 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 <2022-10-05>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/geo_sites.md b/doc/user/admin_area/geo_sites.md
new file mode 100644
index 00000000000..e577fdf60f1
--- /dev/null
+++ b/doc/user/admin_area/geo_sites.md
@@ -0,0 +1,117 @@
+---
+stage: Systems
+group: Geo
+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
+---
+
+# Geo sites Admin Area **(PREMIUM SELF)**
+
+You can configure various settings for GitLab Geo sites. For more information, see
+[Geo documentation](../../administration/geo/index.md).
+
+On either the primary or secondary site:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Geo > Sites**.
+
+## Common settings
+
+All Geo sites have the following settings:
+
+| Setting | Description |
+| --------| ----------- |
+| Primary | This marks a Geo site as **primary** site. There can be only one **primary** site. |
+| Name | The unique identifier for the Geo site. It's highly recommended to use a physical location as a name. Good examples are "London Office" or "us-east-1". Avoid words like "primary", "secondary", "Geo", or "DR". This makes the failover process easier because the physical location does not change, but the Geo site role can. All nodes in a single Geo site use the same site name. Nodes use the `gitlab_rails['geo_node_name']` setting in `/etc/gitlab/gitlab.rb` to lookup their Geo site record in the PostgreSQL database. If `gitlab_rails['geo_node_name']` is not set, the node's `external_url` with trailing slash is used as fallback. The value of `Name` is case-sensitive, and most characters are allowed. |
+| URL | The instance's user-facing URL. |
+
+The site you're currently browsing is indicated with a blue `Current` label, and
+the **primary** node is listed first as `Primary site`.
+
+## Secondary site settings
+
+**Secondary** sites have a number of additional settings available:
+
+| Setting | Description |
+|---------------------------|-------------|
+| Selective synchronization | Enable Geo [selective sync](../../administration/geo/replication/configuration.md#selective-synchronization) for this **secondary** site. |
+| Repository sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling repositories. |
+| File sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling files. |
+
+## Geo backfill
+
+**Secondary** sites are notified of changes to repositories and files by the **primary** site,
+and always attempt to synchronize those changes as quickly as possible.
+
+Backfill is the act of populating the **secondary** site with repositories and files that
+existed *before* the **secondary** site was added to the database. Because there may be
+extremely large numbers of repositories and files, it's not feasible to attempt to
+download them all at once; so, GitLab places an upper limit on the concurrency of
+these operations.
+
+How long the backfill takes is dependent on the maximum concurrency, but higher
+values place more strain on the **primary** site. The limits are configurable.
+If your **primary** site has lots of surplus capacity,
+you can increase the values to complete backfill in a shorter time. If it's
+under heavy load and backfill reduces its availability for normal requests,
+you can decrease them.
+
+## Set up the internal URLs
+
+> Setting up internal URLs in secondary sites was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77179) in GitLab 14.7.
+
+You can set up a different URL for synchronization between the primary and secondary site.
+
+The **primary** site's Internal URL is used by **secondary** sites to contact it
+(to sync repositories, for example). The name Internal URL distinguishes it from
+[External URL](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab),
+which is used by users. Internal URL does not need to be a private address.
+
+When [Geo secondary proxying](../../administration/geo/secondary_proxy/index.md) is enabled,
+the primary uses the secondary's internal URL to contact it directly.
+
+The internal URL defaults to external URL. To change it:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Geo > Sites**.
+1. Select **Edit** on the site you want to customize.
+1. Edit the internal URL.
+1. Select **Save changes**.
+
+When enabled, the Admin Area for Geo shows replication details for each site directly
+from the primary site's UI, and through the Geo secondary proxy, if enabled.
+
+WARNING:
+We recommend using an HTTPS connection while configuring the Geo sites. To avoid
+breaking communication between **primary** and **secondary** sites when using
+HTTPS, customize your Internal URL to point to a load balancer with TLS
+terminated at the load balancer.
+
+WARNING:
+Starting with GitLab 13.3 and [until 13.11](https://gitlab.com/gitlab-org/gitlab/-/issues/325522),
+if you use an internal URL that is not accessible to the users, the
+OAuth authorization flow does not work properly, because users are redirected
+to the internal URL instead of the external one.
+
+## Multiple secondary sites behind a load balancer
+
+**Secondary** sites can use identical external URLs if
+a unique `name` is set for each Geo site. The `gitlab.rb` setting
+`gitlab_rails['geo_node_name']` must:
+
+- Be set for each GitLab instance that runs `puma`, `sidekiq`, or `geo_logcursor`.
+- Match a Geo site name.
+
+The load balancer must use sticky sessions to avoid authentication
+failures and cross-site request errors.
+
+<!-- ## 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/user/admin_area/index.md b/doc/user/admin_area/index.md
index 8f36021084e..5fd44cf8697 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -33,7 +33,7 @@ The Admin Area is made up of the following sections:
| **{license}** License | Add, display, and remove [licenses](license.md). |
| **{cloud-gear}** Kubernetes | Create and manage instance-level [Kubernetes clusters](../instance/clusters/index.md). |
| **{push-rules}** Push rules | Configure pre-defined Git [push rules](../project/repository/push_rules.md) for projects. Also, configure [merge requests approvers rules](merge_requests_approvals.md). |
-| **{location-dot}** Geo | Configure and maintain [Geo nodes](geo_nodes.md). |
+| **{location-dot}** Geo | Configure and maintain [Geo sites](geo_sites.md). |
| **{key}** Deploy keys | Create instance-wide [SSH deploy keys](../project/deploy_keys/index.md). |
| **{lock}** Credentials | View [credentials](credentials_inventory.md) that can be used to access your instance. |
| **{template}** Integrations | Manage [instance-level default settings](settings/project_integration_management.md) for a project integration. |
@@ -184,7 +184,7 @@ The following data is included in the export:
- Type
- Path
- Access level ([Project](../permissions.md#project-members-permissions) and [Group](../permissions.md#group-members-permissions))
-- Date of last activity ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345388) in GitLab 14.6). For a list of activities that populate this column, see the [Users API documentation](../../api/users.md#get-user-activities-administrator-only).
+- Date of last activity ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345388) in GitLab 14.6). For a list of activities that populate this column, see the [Users API documentation](../../api/users.md#get-user-activities).
Only the first 100,000 user accounts are exported.
@@ -270,6 +270,8 @@ To create a new topic, select **New topic**.
To edit a topic, select **Edit** in that topic's row.
+To remove a topic, select **Remove** in that topic's row.
+
To search for topics by name, enter your criteria in the search box. The topic search is case
insensitive and applies partial matching.
@@ -370,14 +372,16 @@ The following topics document the **Monitoring** section of the Admin Area.
### System Information
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/341248) in GitLab 15.2, support for relative time. "Uptime" statistic was renamed to "System started".
+
The **System Info** page provides the following statistics:
-| Field | Description |
-|:-------------|:------------|
-| CPU | Number of CPU cores available |
-| Memory Usage | Memory in use, and total memory available |
-| Disk Usage | Disk space in use, and total disk space available |
-| Uptime | Approximate uptime of the GitLab instance |
+| Field | Description |
+|:---------------|:--------------------------------------------------|
+| CPU | Number of CPU cores available |
+| Memory Usage | Memory in use, and total memory available |
+| Disk Usage | Disk space in use, and total disk space available |
+| System started | When the system hosting GitLab was started. In GitLab 15.1 and earlier, this was an uptime statistic. |
These statistics are updated only when you navigate to the **System Info** page, or you refresh the page in your browser.
diff --git a/doc/user/admin_area/license_file.md b/doc/user/admin_area/license_file.md
index be1b1a16e29..99669b2a4d3 100644
--- a/doc/user/admin_area/license_file.md
+++ b/doc/user/admin_area/license_file.md
@@ -56,9 +56,10 @@ usage data monthly.
To submit the data, [export your license usage](../../subscriptions/self_managed/index.md#export-your-license-usage)
and send it by email to the renewals service, `renewals-service@customers.gitlab.com`.
-If you don't submit your data each month after your subscription start date, a banner displays to remind you to
-submit your data. The banner displays in the **Admin Area** on the **Dashboard** and on the **Subscription**
-pages. You can only dismiss it until the following month after you submit your license usage data.
+If you don't submit your data each month after your subscription start date, an email is sent to the address
+associated with your subscription and a banner displays to remind you to submit your data. The banner displays
+in the **Admin Area** on the **Dashboard** and on the **Subscription** pages. You can only dismiss it until the
+following month after you submit your license usage data.
## What happens when your license expires
diff --git a/doc/user/admin_area/moderate_users.md b/doc/user/admin_area/moderate_users.md
index dc6ff96c31f..ab581cd3aa8 100644
--- a/doc/user/admin_area/moderate_users.md
+++ b/doc/user/admin_area/moderate_users.md
@@ -265,7 +265,7 @@ Use the Admin Area to delete users.
1. Select **Delete user**.
NOTE:
-You can only delete a user if there are inherited or direct owners of a group. You cannot delete a user if they are the only group owner.
+You can only delete a user if there are inherited or direct owners of a group. You cannot delete a user if they are the only group owner.
You can also delete a user and their contributions, such as merge requests, issues, and groups of which they are the only group owner.
diff --git a/doc/user/admin_area/monitoring/background_migrations.md b/doc/user/admin_area/monitoring/background_migrations.md
index 53d5056bb65..02d32099c63 100644
--- a/doc/user/admin_area/monitoring/background_migrations.md
+++ b/doc/user/admin_area/monitoring/background_migrations.md
@@ -28,6 +28,9 @@ You can [check the status of existing migrations](../../../update/index.md#batch
## Enable or disable batched background migrations
+WARNING:
+If you disable this feature flag, GitLab upgrades may fail.
+
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)
diff --git a/doc/user/admin_area/reporting/git_abuse_rate_limit.md b/doc/user/admin_area/reporting/git_abuse_rate_limit.md
new file mode 100644
index 00000000000..ad3ecfa3a5a
--- /dev/null
+++ b/doc/user/admin_area/reporting/git_abuse_rate_limit.md
@@ -0,0 +1,29 @@
+---
+stage: Anti-Abuse
+group: Anti-Abuse
+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
+---
+
+# Git abuse rate limit **(ULTIMATE SELF)**
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8066) in GitLab 15.2 [with flags](../../../administration/feature_flags.md) named `git_abuse_rate_limit_feature_flag` and `auto_ban_user_on_excessive_projects_download`. Both flags are disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flags](../../../administration/feature_flags.md) named `git_abuse_rate_limit_feature_flag` and `auto_ban_user_on_excessive_projects_download`.
+
+Git abuse rate limiting is a feature to automatically [ban users](../moderate_users.md#ban-and-unban-users) who download more than a specified number of repositories in a given time. When the `git_abuse_rate_limit_feature_flag` feature flag is enabled, the administrator receives an email when a user is about to be banned.
+
+When the `auto_ban_user_on_excessive_projects_download` is not enabled, the user is not banned automatically. You can use this setup to determine the correct values of the rate limit settings.
+
+When both flags are enabled, the administrator receives an email when a user is about to be banned, and the user is automatically banned from the GitLab instance.
+
+## Configure Git abuse rate limiting
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Reporting**.
+1. Expand **Git abuse rate limit**.
+1. Update the Git abuse rate limit settings:
+ 1. Enter a number in the **Number of repositories** field, greater than or equal to `0` and less than or equal to `10,000`. This number specifies the maximum amount of unique repositories a user can download in the specified time period before they're banned. When set to `0`, Git abuse rate limiting is disabled.
+ 1. Enter a number in the **Reporting time period (seconds)** field, greater than or equal to `0` and less than or equal to `86,400`. This number specifies the time in seconds a user can download the maximum amount of repositories before they're banned. When set to `0`, Git abuse rate limiting is disabled.
+ 1. Optional. Exclude users by adding them to the **Excluded users** field. Excluded users are not automatically banned.
+1. Select **Save changes**.
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 7f37c99259a..638b61f6197 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -91,20 +91,20 @@ The value is in MB and the default is 100MB per job. To change it at the:
- Instance level:
1. On the top bar, select **Menu > Admin**.
- 1. On the left sidebar, select **Settings > CI/CD**.
- 1. Change the value of maximum artifacts size (in MB).
+ 1. On the left sidebar, select **Settings > CI/CD > Continuous Integration and Deployment**.
+ 1. Change the value of **Maximum artifacts size (MB)**.
1. Select **Save changes** for the changes to take effect.
- Group level (this overrides the instance setting):
1. Go to the group's **Settings > CI/CD > General Pipelines**.
- 1. Change the value of **maximum artifacts size (in MB)**.
+ 1. Change the value of **Maximum artifacts size** (in MB).
1. Select **Save changes** for the changes to take effect.
- Project level (this overrides the instance and group settings):
1. Go to the project's **Settings > CI/CD > General Pipelines**.
- 1. Change the value of **maximum artifacts size (in MB)**.
+ 1. Change the value of **maximum artifacts size** (in MB).
1. Select **Save changes** for the changes to take effect.
NOTE:
diff --git a/doc/user/admin_area/settings/external_authorization.md b/doc/user/admin_area/settings/external_authorization.md
index ef980981fec..d6e6deb0274 100644
--- a/doc/user/admin_area/settings/external_authorization.md
+++ b/doc/user/admin_area/settings/external_authorization.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# External authorization control **(FREE SELF)**
-> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/27056) from GitLab Premium to GitLab Free in 11.10.
+> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/27056) from GitLab Premium to GitLab Free in 11.10.
In highly controlled environments, it may be necessary for access policy to be
controlled by an external service that permits access based on project
diff --git a/doc/user/admin_area/settings/gitaly_timeouts.md b/doc/user/admin_area/settings/gitaly_timeouts.md
index 42e0c9faf9f..8866a044241 100644
--- a/doc/user/admin_area/settings/gitaly_timeouts.md
+++ b/doc/user/admin_area/settings/gitaly_timeouts.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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
+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
---
# Gitaly timeouts **(FREE SELF)**
diff --git a/doc/user/admin_area/settings/incident_management_rate_limits.md b/doc/user/admin_area/settings/incident_management_rate_limits.md
new file mode 100644
index 00000000000..ed2d707af0a
--- /dev/null
+++ b/doc/user/admin_area/settings/incident_management_rate_limits.md
@@ -0,0 +1,38 @@
+---
+type: reference
+stage: Monitor
+group: Respond
+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
+---
+
+# Incident management rate limits **(ULTIMATE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17859) in GitLab 12.5.
+
+You can limit the number of inbound alerts for [incidents](../../../operations/incident_management/incidents.md)
+that can be created in a period of time. The inbound [incident management](../../../operations/incident_management/index.md)
+alert limit can help prevent overloading your incident responders by reducing the
+number of alerts or duplicate issues.
+
+As an example, if you set a limit of `10` requests every `60` seconds,
+and `11` requests are sent to an [alert integration endpoint](../../../operations/incident_management/integrations.md) within one minute,
+the eleventh request is blocked. Access to the endpoint is allowed again after one minute.
+
+This limit is:
+
+- Applied independently per project.
+- Not applied per IP address.
+- Disabled by default.
+
+Requests that exceed the limit are logged into `auth.log`.
+
+## Set a limit on inbound alerts
+
+To set inbound incident management alert limits:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Network**.
+1. Expand **Incident Management Limits**.
+1. Select the **Enable Incident Management inbound alert limit** checkbox.
+1. Optional. Input a custom value for **Maximum requests per project per rate limit period**. Default is 3600.
+1. Optional. Input a custom value for **Rate limit period**. Default is 3600 seconds.
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index 034a432c570..2e27b213f16 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -162,6 +162,7 @@ The **Reporting** settings contain:
- [Spam and Anti-bot Protection](../../../integration/recaptcha.md) -
Enable anti-spam services, like reCAPTCHA, Akismet, or [Spamcheck](../reporting/spamcheck.md), and set IP limits.
- [Abuse reports](../review_abuse_reports.md) - Set notification email for abuse reports.
+- [Git abuse rate limit](../reporting/git_abuse_rate_limit.md) - Configure Git abuse rate limit settings. **(ULTIMATE SELF)**
### Repository
diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index c74906c2762..65712a9a85c 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -1,5 +1,5 @@
---
-stage: Growth
+stage: Analytics
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
---
diff --git a/doc/user/analytics/ci_cd_analytics.md b/doc/user/analytics/ci_cd_analytics.md
index 920b651c094..f4075c3420b 100644
--- a/doc/user/analytics/ci_cd_analytics.md
+++ b/doc/user/analytics/ci_cd_analytics.md
@@ -78,7 +78,7 @@ To view the lead time for changes chart:
![Lead time](img/lead_time_chart_v13_11.png)
-## View time to restore service chart **(PREMIUM)**
+## View time to restore service chart **(ULTIMATE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/356959) in GitLab 15.1
@@ -93,3 +93,17 @@ To view the time to restore service chart:
1. Select the **Time to restore service** tab.
![Lead time](img/time_to_restore_service_charts_v15_1.png)
+
+## View change failure rate chart **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357072) in GitLab 15.2
+
+The change failure rate chart shows information about the percentage of deployments that cause an incident in a production environment. This chart is available for groups and projects.
+
+Change failure rate is one of the four [DORA metrics](index.md#devops-research-and-assessment-dora-key-metrics) that DevOps teams use for measuring excellence in software delivery.
+
+To view the change failure rate chart:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Analytics > CI/CD Analytics**.
+1. Select the **Change failure rate** tab.
diff --git a/doc/user/analytics/img/time_to_restore_service_charts_v15_1.png b/doc/user/analytics/img/time_to_restore_service_charts_v15_1.png
index 25aac385750..fbc59f72e72 100644
--- a/doc/user/analytics/img/time_to_restore_service_charts_v15_1.png
+++ b/doc/user/analytics/img/time_to_restore_service_charts_v15_1.png
Binary files differ
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index 91d9bd918b6..f699fa6d0fb 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -76,6 +76,8 @@ Deployment frequency displays in several charts:
- [Project-level value stream analytics](value_stream_analytics.md)
- [CI/CD analytics](ci_cd_analytics.md)
+To retrieve metrics for deployment frequency, use the [GraphQL](../../api/graphql/reference/index.md) or the [REST](../../api/dora/metrics.md) APIs.
+
### Lead time for changes
Lead time for changes measures the time to deliver a feature once it has been developed,
@@ -87,6 +89,8 @@ Lead time for changes displays in several charts:
- [Project-level value stream analytics](value_stream_analytics.md)
- [CI/CD analytics](ci_cd_analytics.md)
+To retrieve metrics for lead time for changes, use the [GraphQL](../../api/graphql/reference/index.md) or the [REST](../../api/dora/metrics.md) APIs.
+
### Time to restore service
Time to restore service measures how long it takes an organization to recover from a failure in production.
@@ -122,12 +126,12 @@ To retrieve metrics for change failure rate, use the [GraphQL](../../api/graphql
| Metric | Level | API | UI chart | Comments |
|---------------------------|-------------------------|-------------------------------------|---------------------------------------|-------------------------------|
-| `deployment_frequency` | Project | [GitLab 13.7 and later](../../api/dora/metrics.md) | GitLab 14.8 and later | The [previous API endpoint](../../api/dora4_project_analytics.md) was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/323713) in 13.10. |
+| `deployment_frequency` | Project | [GitLab 13.7 and later](../../api/dora/metrics.md) | GitLab 14.8 and later | The previous API endpoint was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/323713) in 13.10. |
| `deployment_frequency` | Group | [GitLab 13.10 and later](../../api/dora/metrics.md) | GitLab 13.12 and later | |
| `lead_time_for_changes` | Project | [GitLab 13.10 and later](../../api/dora/metrics.md) | GitLab 13.11 and later | Unit in seconds. Aggregation method is median. |
| `lead_time_for_changes` | Group | [GitLab 13.10 and later](../../api/dora/metrics.md) | GitLab 14.0 and later | Unit in seconds. Aggregation method is median. |
-| `time_to_restore_service` | Project and group | [GitLab 14.9 and later](../../api/dora/metrics.md) | Not supported | |
-| `change_failure_rate` | Project and group | [GitLab 14.10 and later](../../api/dora/metrics.md) | Not supported | |
+| `time_to_restore_service` | Project and group | [GitLab 14.9 and later](../../api/dora/metrics.md) | GitLab 15.1 and later | Unit in days. Aggregation method is median. |
+| `change_failure_rate` | Project and group | [GitLab 14.10 and later](../../api/dora/metrics.md) | GitLab 15.2 and later | Percentage of deployments. | |
## Definitions
diff --git a/doc/user/analytics/value_stream_analytics.md b/doc/user/analytics/value_stream_analytics.md
index c0f97369740..a71136628cf 100644
--- a/doc/user/analytics/value_stream_analytics.md
+++ b/doc/user/analytics/value_stream_analytics.md
@@ -34,7 +34,7 @@ To view value stream analytics for your project:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Analytics > Value stream**.
-1. To view metrics for each stage, above the **Filter results** text box, select a stage.
+1. To view metrics for a particular stage, select a stage below the **Filter results** text box.
1. Optional. Filter the results:
1. Select the **Filter results** text box.
1. Select a parameter.
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index cbe20ecde30..96236f60417 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -407,6 +407,11 @@ The API fuzzing behavior can be changed through CI/CD variables.
From GitLab 13.12 and later, the default API fuzzing configuration file is `.gitlab/gitlab-api-fuzzing-config.yml`. In GitLab 14.0 and later, API fuzzing configuration files must be in your repository's
`.gitlab` directory instead of your repository's root.
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results,
+including a large number of false positives.
+
### Authentication
Authentication is handled by providing the authentication token as a header or cookie. You can
@@ -854,6 +859,9 @@ Optionally:
- `FUZZAPI_PRE_SCRIPT`: Script to install runtimes or dependencies before the analyzer starts.
+WARNING:
+To execute scripts in Alpine Linux you must first use the command [`chmod`](https://www.gnu.org/software/coreutils/manual/html_node/chmod-invocation.html) to set the [execution permission](https://www.gnu.org/software/coreutils/manual/html_node/Setting-Permissions.html). For example, to set the execution permission of `script.py` for everyone, use the command: `chmod a+x script.py`. If needed, you can version your `script.py` with the execution permission already set.
+
```yaml
stages:
- fuzz
@@ -902,7 +910,9 @@ import requests
import backoff
# [1] Store log file in directory indicated by env var CI_PROJECT_DIR
-working_directory = os.environ['CI_PROJECT_DIR']
+working_directory = os.environ.get( 'CI_PROJECT_DIR')
+overrides_file_name = os.environ.get('FUZZAPI_OVERRIDES_FILE', 'api-fuzzing-overrides.json')
+overrides_file_path = os.path.join(working_directory, overrides_file_name)
# [2] File name should match the pattern: gl-*.log
log_file_path = os.path.join(working_directory, 'gl-user-overrides.log')
@@ -916,8 +926,11 @@ logging.basicConfig(filename=log_file_path, level=logging.DEBUG)
requests.exceptions.ConnectionError),
max_time=30)
def get_auth_response():
- return requests.get('https://authorization.service/api/get_api_token', auth=(os.environ['AUTH_USER'], os.environ['AUTH_PWD']))
-
+ authorization_url = 'https://authorization.service/api/get_api_token'
+ return requests.get(
+ f'{authorization_url}',
+ auth=(os.environ.get('AUTH_USER'), os.environ.get('AUTH_PWD'))
+ )
# In our example, access token is retrieved from a given endpoint
try:
@@ -939,14 +952,14 @@ try:
# requests.ReadTimeout : The server did not send any data in the allotted amount of time.
# requests.TooManyRedirects : The request exceeds the configured number of maximum redirections
# requests.exceptions.RequestException : All exceptions that related to Requests
+except json.JSONDecodeError as json_decode_error:
+ # logs errors related decoding JSON response
+ logging.error(f'Error, failed while decoding JSON response. Error message: {json_decode_error}')
+ raise
except requests.exceptions.RequestException as requests_error:
# logs exceptions related to `Requests`
logging.error(f'Error, failed while performing HTTP request. Error message: {requests_error}')
raise
-except requests.exceptions.JSONDecodeError as json_decode_error:
- # logs errors related decoding JSON response
- logging.error(f'Error, failed while decoding JSON response. Error message: {json_decode_error}')
- raise
except Exception as e:
# logs any other error
logging.error(f'Error, unknown error while retrieving access token. Error message: {e}')
@@ -961,8 +974,6 @@ overrides_data = {
}
# log entry informing about the file override computation
-overrides_file_path = os.path.join(
- working_directory, "api-fuzzing-overrides.json")
logging.info("Creating overrides file: %s" % overrides_file_path)
# attempts to overwrite the file
@@ -975,7 +986,7 @@ try:
fd.write(json.dumps(overrides_data).encode('utf-8'))
except Exception as e:
# logs any other error
- logging.error(f'Error, unkown error when overwritng file {overrides_file_path}. Error message: {e}')
+ logging.error(f'Error, unknown error when overwriting file {overrides_file_path}. Error message: {e}')
raise
# logs informing override has finished successfully
@@ -998,6 +1009,7 @@ echo "**** install python dependencies ****"
python3 -m ensurepip
pip3 install --no-cache --upgrade \
pip \
+ requests \
backoff
echo "**** python dependencies installed ****"
@@ -1028,7 +1040,7 @@ In the previous sample, you could use the script `user-pre-scan-set-up.sh` to al
### Exclude Paths
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211892) in GitLab 14.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211892) in GitLab 14.0.
When testing an API it can be useful to exclude certain paths. For example, you might exclude testing of an authentication service or an older version of the API. To exclude paths, use the `FUZZAPI_EXCLUDE_PATHS` CI/CD variable . This variable is specified in your `.gitlab-ci.yml` file. To exclude multiple paths, separate entries using the `;` character. In the provided paths you can use a single character wildcard `?` and `*` for a multiple character wildcard.
diff --git a/doc/user/application_security/configuration/index.md b/doc/user/application_security/configuration/index.md
index 09292dcb92b..9ca1a6f125f 100644
--- a/doc/user/application_security/configuration/index.md
+++ b/doc/user/application_security/configuration/index.md
@@ -53,7 +53,7 @@ You can configure the following security controls:
enable Container Scanning. For more details, see
[Enable Container Scanning through an automatic merge request](../container_scanning/index.md#enable-container-scanning-through-an-automatic-merge-request).
- [Operational Container Scanning](../../clusters/agent/vulnerabilities.md)
- - Can be configured by adding a configuration block to your agent configuration. For more details, read [Operational Container Scanning](../../clusters/agent/vulnerabilities.md#enable-cluster-vulnerability-scanning).
+ - Can be configured by adding a configuration block to your agent configuration. For more details, read [Operational Container Scanning](../../clusters/agent/vulnerabilities.md#enable-operational-container-scanning).
- [Secret Detection](../secret_detection/index.md)
- Select **Configure with a merge request** to create a merge request with the changes required to
enable Secret Detection. For more details, read [Enable Secret Detection via an automatic merge request](../secret_detection/index.md#enable-secret-detection-via-an-automatic-merge-request).
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index c41385a3569..cf864068e44 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -178,6 +178,8 @@ include:
DOCKER_PASSWORD: "$AWS_ECR_PASSWORD"
```
+Authenticating to a remote registry is not supported when [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode) is enabled.
+
#### Dependency list
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345434) in GitLab 14.6.
@@ -231,7 +233,12 @@ between GitLab Dependency Scanning and Container Scanning for more details on wh
#### Available CI/CD variables
-You can [configure](#customizing-the-container-scanning-settings) analyzers by using the following CI/CD variables:
+You can [configure](#customizing-the-container-scanning-settings) analyzers by using the following CI/CD variables.
+
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results,
+including a large number of false positives.
| CI/CD Variable | Default | Description | Scanner |
| ------------------------------ | ------------- | ----------- | ------------ |
@@ -248,8 +255,8 @@ You can [configure](#customizing-the-container-scanning-settings) analyzers by u
| `CS_REGISTRY_INSECURE` | `"false"` | Allow access to insecure registries (HTTP only). Should only be set to `true` when testing the image locally. Works with all scanners, but the registry must listen on port `80/tcp` for Trivy to work. | All |
| `CS_SEVERITY_THRESHOLD` | `UNKNOWN` | Severity level threshold. The scanner outputs vulnerabilities with severity level higher than or equal to this threshold. Supported levels are Unknown, Low, Medium, High, and Critical. | Trivy |
| `DOCKER_IMAGE` | `$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG` | The Docker image to be scanned. If set, this variable overrides the `$CI_APPLICATION_REPOSITORY` and `$CI_APPLICATION_TAG` variables. | All |
-| `DOCKER_PASSWORD` | `$CI_REGISTRY_PASSWORD` | Password for accessing a Docker registry requiring authentication. The default is only set if `$DOCKER_IMAGE` resides at [`$CI_REGISTRY`](../../../ci/variables/predefined_variables.md). | All |
-| `DOCKER_USER` | `$CI_REGISTRY_USER` | Username for accessing a Docker registry requiring authentication. The default is only set if `$DOCKER_IMAGE` resides at [`$CI_REGISTRY`](../../../ci/variables/predefined_variables.md). | All |
+| `DOCKER_PASSWORD` | `$CI_REGISTRY_PASSWORD` | Password for accessing a Docker registry requiring authentication. The default is only set if `$DOCKER_IMAGE` resides at [`$CI_REGISTRY`](../../../ci/variables/predefined_variables.md). Not supported when [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode) is enabled. | All |
+| `DOCKER_USER` | `$CI_REGISTRY_USER` | Username for accessing a Docker registry requiring authentication. The default is only set if `$DOCKER_IMAGE` resides at [`$CI_REGISTRY`](../../../ci/variables/predefined_variables.md). Not supported when [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode) is enabled. | All |
| `DOCKERFILE_PATH` | `Dockerfile` | The path to the `Dockerfile` to use for generating remediations. By default, the scanner looks for a file named `Dockerfile` in the root directory of the project. You should configure this variable only if your `Dockerfile` is in a non-standard location, such as a subdirectory. See [Solutions for vulnerabilities](#solutions-for-vulnerabilities-auto-remediation) for more details. | All |
| `SECURE_LOG_LEVEL` | `info` | Set the minimum logging level. Messages of this logging level or higher are output. From highest to lowest severity, the logging levels are: `fatal`, `error`, `warn`, `info`, `debug`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10880) in GitLab 13.1. | All |
@@ -296,6 +303,10 @@ support `-fips`.
Starting with GitLab 14.10, `-fips` is automatically added to `CS_ANALYZER_IMAGE` when FIPS mode is
enabled in the GitLab instance.
+Container scanning of images in authenticated registries is not supported when [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode)
+is enabled. When `CI_GITLAB_FIPS_MODE` is `"true"`, and `DOCKER_USER` or `DOCKER_PASSWORD` is set,
+the analyzer exits with an error and does not perform the scan.
+
### Enable Container Scanning through an automatic merge request
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6334) in GitLab 14.9.
@@ -661,6 +672,8 @@ Also:
- Consider creating credentials with read-only permissions and rotating them regularly if the
options aren't selected.
+Scanning images in external private registries is not supported when [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode) is enabled.
+
## Running the standalone container scanning tool
It's possible to run the [GitLab container scanning tool](https://gitlab.com/gitlab-org/security-products/analyzers/container-scanning)
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index b2b7dd85468..ac3b266ad48 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -113,6 +113,11 @@ job. If you include these keys in your own job, you must copy their original con
Use the following variables to configure coverage-guided fuzz testing in your CI/CD pipeline.
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results, including
+a large number of false positives.
+
| CI/CD variable | Description |
|---------------------------|---------------------------------------------------------------------------------|
| `COVFUZZ_ADDITIONAL_ARGS` | Arguments passed to `gitlab-cov-fuzz`. Used to customize the behavior of the underlying fuzzing engine. Read the fuzzing engine's documentation for a complete list of arguments. |
diff --git a/doc/user/application_security/dast/checks/1004.1.md b/doc/user/application_security/dast/checks/1004.1.md
index 72af1156b95..40139f2aa8a 100644
--- a/doc/user/application_security/dast/checks/1004.1.md
+++ b/doc/user/application_security/dast/checks/1004.1.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
-The {cookie_name} cookie was transmitted in a `Set-Cookie` header without the `HttpOnly` attribute set.
+The cookie was transmitted in a `Set-Cookie` header without the `HttpOnly` attribute set.
To prevent JavaScript being able to access the cookie value - usually via `document.cookies` - all
cookies that are used for authorization should have the `HttpOnly` attribute
set.
diff --git a/doc/user/application_security/dast/checks/16.10.md b/doc/user/application_security/dast/checks/16.10.md
new file mode 100644
index 00000000000..67368d80022
--- /dev/null
+++ b/doc/user/application_security/dast/checks/16.10.md
@@ -0,0 +1,30 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Content-Security-Policy violations
+
+## Description
+
+A `Content-Security-Policy` (CSP) was identified on the target site that is reporting violations when
+attempting to load the page in a browser. This may cause disruption to your users when attempting to visit the page.
+
+## Remediation
+
+Review the violations to determine if any action is necessary.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 16.10 | true | 16 | Passive | Info |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/16.html)
+- [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html)
+- [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)
+- [Content Security Policy Level 3](https://www.w3.org/TR/CSP3/)
+- [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
diff --git a/doc/user/application_security/dast/checks/16.3.md b/doc/user/application_security/dast/checks/16.3.md
index 6f80a2a32c6..e4fc2468dae 100644
--- a/doc/user/application_security/dast/checks/16.3.md
+++ b/doc/user/application_security/dast/checks/16.3.md
@@ -32,4 +32,4 @@ information from the `X-Powered-By` header.
## Links
- [CWE](https://cwe.mitre.org/data/definitions/16.html)
-- [PHP `expose_php`](https://www.php.net/manual/en/ini.core.php#ini.expose-php)
+- [PHP expose_php](https://www.php.net/manual/en/ini.core.php#ini.expose-php)
diff --git a/doc/user/application_security/dast/checks/16.5.md b/doc/user/application_security/dast/checks/16.5.md
index e03da3043ef..28bb9f7ee4b 100644
--- a/doc/user/application_security/dast/checks/16.5.md
+++ b/doc/user/application_security/dast/checks/16.5.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
-The target website returns AspNet headers and version information of this website. By
+The target website returns AspNet header(s) and version information of this website. By
exposing these values attackers may attempt to identify if the target software is vulnerable to known
vulnerabilities, or catalog known sites running particular versions to exploit in the future when a
vulnerability is identified in the particular version.
diff --git a/doc/user/application_security/dast/checks/16.6.md b/doc/user/application_security/dast/checks/16.6.md
index 9cbcde669a0..ddd3a10c5f8 100644
--- a/doc/user/application_security/dast/checks/16.6.md
+++ b/doc/user/application_security/dast/checks/16.6.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
-The target website returns AspNet headers along with version information of this website. By
+The target website returns AspNet header(s) along with version information of this website. By
exposing these values attackers may attempt to identify if the target software is vulnerable to known
vulnerabilities. Or catalog known sites running particular versions to exploit in the future when a
vulnerability is identified in the particular version.
diff --git a/doc/user/application_security/dast/checks/16.8.md b/doc/user/application_security/dast/checks/16.8.md
new file mode 100644
index 00000000000..c9beba4544e
--- /dev/null
+++ b/doc/user/application_security/dast/checks/16.8.md
@@ -0,0 +1,30 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Content-Security-Policy analysis
+
+## Description
+
+A `Content-Security-Policy` (CSP) was identified on the target site. CSP can aid in hardening
+a website against various client side attacks such as Cross-Site Scripting (XSS).
+
+## Remediation
+
+Follow the recommendations to determine if any actions are necessary to harden this `Content-Security-Policy`.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 16.8 | true | 16 | Passive | Info |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/16.html)
+- [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html)
+- [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)
+- [Content Security Policy Level 3](https://www.w3.org/TR/CSP3/)
+- [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
diff --git a/doc/user/application_security/dast/checks/16.9.md b/doc/user/application_security/dast/checks/16.9.md
new file mode 100644
index 00000000000..c3e4431e415
--- /dev/null
+++ b/doc/user/application_security/dast/checks/16.9.md
@@ -0,0 +1,32 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Content-Security-Policy-Report-Only analysis
+
+## Description
+
+A `Content-Security-Policy-Report-Only` (CSPRO) was identified on the target site. CSP-Report-Only headers
+aid in determining how to implement a `Content-Security-Policy` that does not disrupt normal use of the target
+site.
+
+## Remediation
+
+Follow the recommendations to determine if any actions are necessary to harden this `Content-Security-Policy-Report-Only`.
+After all alerts have been resolved, we recommend that this header be changed to `Content-Security-Policy`.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 16.9 | true | 16 | Passive | Info |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/16.html)
+- [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html)
+- [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)
+- [Content Security Policy Level 3](https://www.w3.org/TR/CSP3/)
+- [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
diff --git a/doc/user/application_security/dast/checks/209.2.md b/doc/user/application_security/dast/checks/209.2.md
new file mode 100644
index 00000000000..2060bb1802b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/209.2.md
@@ -0,0 +1,43 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Generation of database error message containing sensitive information
+
+## Description
+
+The application was found to return database error messages. Determining the type of database may assist attackers in exploiting
+SQL Injection attacks against the system. While debug messages are helpful during development and debugging, they should not be
+presented to users when an error occurs.
+
+## Remediation
+
+Applications should handle database error conditions internally and map known failure types to error codes that can be displayed
+to a user. These error codes should be customized to the application and returned along with the relevant HTTP error code.
+
+When an error occurs, the application identifies the error type or class, and displays a numerical value to the
+user. Requests should also be tracked so when a user is presented with an error code, it has a corresponding request ID.
+Support teams can then correlate the HTTP error, the customized error code, and the request ID in the log files to
+determine the root cause of the error without leaking details to the end user.
+
+Example of returning customized errors:
+
+```plaintext
+HTTP/1.1 500 Internal Server Error
+...
+Error [0004] Occurred, please contact support or re-try your request again shortly.
+Request ID [a4bc91def12]
+...
+```
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 209.2 | false | 209 | Passive | Low |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/209.html)
diff --git a/doc/user/application_security/dast/checks/287.1.md b/doc/user/application_security/dast/checks/287.1.md
new file mode 100644
index 00000000000..06b7e7b4b2e
--- /dev/null
+++ b/doc/user/application_security/dast/checks/287.1.md
@@ -0,0 +1,33 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Insecure authentication over HTTP (Basic Authentication)
+
+## Description
+
+The target application was found to authenticate users using the Basic Authentication scheme over HTTP.
+Basic Authentication base64 encodes the username and password and sends it in the `Authentication` header.
+Attackers who are in between the communication path (or on the same local network) of the client and server
+could use packet sniffers to read and decode the username and password.
+
+## Remediation
+
+If possible, switch to a more robust method to authenticate users such as OAuth 2.0, or storing usernames
+and passwords in a data store protected by the Argon2id algorithm. If Basic Authentication must be used,
+ensure credentials are only transmitted over secure channels such as HTTPS/TLS.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 287.1 | false | 287 | Passive | Medium |
+
+## Links
+
+- [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)
+- [OAuth 2.0](https://oauth.net/2/)
+- [CWE-287](https://cwe.mitre.org/data/definitions/287.html)
+- [RFC](https://datatracker.ietf.org/doc/html/rfc7617)
diff --git a/doc/user/application_security/dast/checks/287.2.md b/doc/user/application_security/dast/checks/287.2.md
new file mode 100644
index 00000000000..2215b72f47a
--- /dev/null
+++ b/doc/user/application_security/dast/checks/287.2.md
@@ -0,0 +1,35 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Insecure authentication over HTTP (Digest Authentication)
+
+## Description
+
+The target application was found to authenticate users using the Digest Authentication scheme over HTTP.
+Digest Authentication uses an insecure hashing algorithm (MD5) to hash the username and password and sends
+it in the `Authentication` header. Attackers who are in between the communication path (or on the same
+local network) of the client and server could use packet sniffers to modify the server's response parameters
+to downgrade the security of the digest access authentication mode. Additionally, the server stores the
+hashed credentials, usually in a file called `.htpasswd`. Tools are readily available to crack these passwords.
+
+## Remediation
+
+If possible, switch to a more robust method to authenticate users such as OAuth 2.0, or storing usernames
+and passwords in a data store protected by the Argon2id algorithm. If Digest Authentication must be used,
+ensure credentials are only transmitted over secure channels such as HTTPS/TLS.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 287.2 | false | 287 | Passive | Low |
+
+## Links
+
+- [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)
+- [OAuth 2.0](https://oauth.net/2/)
+- [CWE-287](https://cwe.mitre.org/data/definitions/287.html)
+- [RFC](https://datatracker.ietf.org/doc/html/rfc2069)
diff --git a/doc/user/application_security/dast/checks/601.1.md b/doc/user/application_security/dast/checks/601.1.md
index 26ccd877104..60249c2562d 100644
--- a/doc/user/application_security/dast/checks/601.1.md
+++ b/doc/user/application_security/dast/checks/601.1.md
@@ -8,17 +8,17 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
-This site was found to allow open redirects from user supplied input. Open redirects are commonly
-abused in phishing attacks where the original domain or URL looks like a legitimate link, but then
-redirects a user to a malicious site. An example would be
-`https://example.com/redirect?url=https://%62%61%64%2e%63%6f%6d%2f%66%61%6b%65%6c%6f%67%69%6e` which,
+This site was found to allow open redirects from user supplied input. Open redirects are commonly
+abused in phishing attacks where the original domain or URL looks like a legitimate link, but then
+redirects a user to a malicious site. An example would be
+`https://example.com/redirect?url=https://%62%61%64%2e%63%6f%6d%2f%66%61%6b%65%6c%6f%67%69%6e` which,
when decoded turns into `bad.com/fakelogin`.
## Remediation
-Never redirect a client based on user input found in a `GET` request. It is recommended that the list
-of target links to redirect a user to are contained server side, and retrieved using a numerical value
-as an index to return the link to be redirected to. For example, `/redirect?id=1` would cause the
+Never redirect a client based on user input found in a `GET` request. It is recommended that the list
+of target links to redirect a user to are contained server side, and retrieved using a numerical value
+as an index to return the link to be redirected to. For example, `/redirect?id=1` would cause the
application to look up the `1` index and return a URL such as `https://example.com`. This URL would
then be used to redirect the user, using the 301 response code and `Location` header.
diff --git a/doc/user/application_security/dast/checks/614.1.md b/doc/user/application_security/dast/checks/614.1.md
index ec68ce33529..d5c7476716f 100644
--- a/doc/user/application_security/dast/checks/614.1.md
+++ b/doc/user/application_security/dast/checks/614.1.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
-The {cookie_name} cookie was transmitted in a `Set-Cookie` response without the `Secure` attribute set.
+The cookie was transmitted in a `Set-Cookie` response without the `Secure` attribute set.
To prevent sensitive cookie values being accidentally transmitted over clear-text HTTP we
recommended that cookies are declared with the `Secure` attribute.
diff --git a/doc/user/application_security/dast/checks/798.1.md b/doc/user/application_security/dast/checks/798.1.md
new file mode 100644
index 00000000000..819ae92cfdc
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.1.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Adafruit API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Adafruit API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.1 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.10.md b/doc/user/application_security/dast/checks/798.10.md
new file mode 100644
index 00000000000..14723c81f17
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.10.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Asana Client Secret
+
+## Description
+
+The response body contains content that matches the pattern of a Asana Client Secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.10 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.100.md b/doc/user/application_security/dast/checks/798.100.md
new file mode 100644
index 00000000000..07bd24211c7
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.100.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Sendbird Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Sendbird Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.100 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.101.md b/doc/user/application_security/dast/checks/798.101.md
new file mode 100644
index 00000000000..ea102147100
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.101.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token SendGrid API token
+
+## Description
+
+The response body contains content that matches the pattern of a SendGrid API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.101 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.102.md b/doc/user/application_security/dast/checks/798.102.md
new file mode 100644
index 00000000000..8a40475190a
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.102.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Sendinblue API token
+
+## Description
+
+The response body contains content that matches the pattern of a Sendinblue API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.102 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.103.md b/doc/user/application_security/dast/checks/798.103.md
new file mode 100644
index 00000000000..3d91f7f3b80
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.103.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Sentry Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Sentry Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.103 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.104.md b/doc/user/application_security/dast/checks/798.104.md
new file mode 100644
index 00000000000..316998615ff
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.104.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Shippo API token
+
+## Description
+
+The response body contains content that matches the pattern of a Shippo API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.104 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.105.md b/doc/user/application_security/dast/checks/798.105.md
new file mode 100644
index 00000000000..20618a9d555
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.105.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Shopify access token
+
+## Description
+
+The response body contains content that matches the pattern of a Shopify access token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.105 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.106.md b/doc/user/application_security/dast/checks/798.106.md
new file mode 100644
index 00000000000..4f552302e85
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.106.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Shopify custom access token
+
+## Description
+
+The response body contains content that matches the pattern of a Shopify custom access token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.106 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.107.md b/doc/user/application_security/dast/checks/798.107.md
new file mode 100644
index 00000000000..2a5961b3905
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.107.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Shopify private app access token
+
+## Description
+
+The response body contains content that matches the pattern of a Shopify private app access token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.107 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.108.md b/doc/user/application_security/dast/checks/798.108.md
new file mode 100644
index 00000000000..23968bcf660
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.108.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Shopify shared secret
+
+## Description
+
+The response body contains content that matches the pattern of a Shopify shared secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.108 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.109.md b/doc/user/application_security/dast/checks/798.109.md
new file mode 100644
index 00000000000..57d6823d8a9
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.109.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Slack token
+
+## Description
+
+The response body contains content that matches the pattern of a Slack token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.109 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.11.md b/doc/user/application_security/dast/checks/798.11.md
new file mode 100644
index 00000000000..b12f86ba800
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.11.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Atlassian API token
+
+## Description
+
+The response body contains content that matches the pattern of a Atlassian API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.11 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.110.md b/doc/user/application_security/dast/checks/798.110.md
new file mode 100644
index 00000000000..8ac7a8a4be2
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.110.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Slack Webhook
+
+## Description
+
+The response body contains content that matches the pattern of a Slack Webhook.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.110 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.111.md b/doc/user/application_security/dast/checks/798.111.md
new file mode 100644
index 00000000000..ff05dcfe55b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.111.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Stripe
+
+## Description
+
+The response body contains content that matches the pattern of a Stripe.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.111 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.112.md b/doc/user/application_security/dast/checks/798.112.md
new file mode 100644
index 00000000000..4f5f89dab9c
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.112.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Square Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Square Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.112 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.113.md b/doc/user/application_security/dast/checks/798.113.md
new file mode 100644
index 00000000000..3f8d1a88ec0
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.113.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Squarespace Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Squarespace Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.113 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.114.md b/doc/user/application_security/dast/checks/798.114.md
new file mode 100644
index 00000000000..0b8235af8c7
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.114.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token SumoLogic Access ID
+
+## Description
+
+The response body contains content that matches the pattern of a SumoLogic Access ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.114 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.115.md b/doc/user/application_security/dast/checks/798.115.md
new file mode 100644
index 00000000000..052502ea962
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.115.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token SumoLogic Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a SumoLogic Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.115 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.116.md b/doc/user/application_security/dast/checks/798.116.md
new file mode 100644
index 00000000000..7b1f0eb907d
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.116.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Travis CI Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Travis CI Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.116 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.117.md b/doc/user/application_security/dast/checks/798.117.md
new file mode 100644
index 00000000000..5cd9817795a
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.117.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Twilio API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Twilio API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.117 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.118.md b/doc/user/application_security/dast/checks/798.118.md
new file mode 100644
index 00000000000..a74233429df
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.118.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Twitch API token
+
+## Description
+
+The response body contains content that matches the pattern of a Twitch API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.118 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.119.md b/doc/user/application_security/dast/checks/798.119.md
new file mode 100644
index 00000000000..80fada87b1c
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.119.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Twitter API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Twitter API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.119 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.12.md b/doc/user/application_security/dast/checks/798.12.md
new file mode 100644
index 00000000000..6f8d0c83a94
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.12.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token AWS
+
+## Description
+
+The response body contains content that matches the pattern of a AWS.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.12 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.120.md b/doc/user/application_security/dast/checks/798.120.md
new file mode 100644
index 00000000000..639b5c6ffc2
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.120.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Twitter API Secret
+
+## Description
+
+The response body contains content that matches the pattern of a Twitter API Secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.120 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.121.md b/doc/user/application_security/dast/checks/798.121.md
new file mode 100644
index 00000000000..e574760baa2
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.121.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Twitter Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Twitter Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.121 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.122.md b/doc/user/application_security/dast/checks/798.122.md
new file mode 100644
index 00000000000..9acb82a6062
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.122.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Twitter Access Secret
+
+## Description
+
+The response body contains content that matches the pattern of a Twitter Access Secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.122 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.123.md b/doc/user/application_security/dast/checks/798.123.md
new file mode 100644
index 00000000000..5d5c9df5f40
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.123.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Twitter Bearer Token
+
+## Description
+
+The response body contains content that matches the pattern of a Twitter Bearer Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.123 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.124.md b/doc/user/application_security/dast/checks/798.124.md
new file mode 100644
index 00000000000..4900ca44ba4
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.124.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Typeform API token
+
+## Description
+
+The response body contains content that matches the pattern of a Typeform API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.124 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.125.md b/doc/user/application_security/dast/checks/798.125.md
new file mode 100644
index 00000000000..1111ef91491
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.125.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Yandex API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Yandex API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.125 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.126.md b/doc/user/application_security/dast/checks/798.126.md
new file mode 100644
index 00000000000..6253f9a4a92
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.126.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Yandex AWS Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Yandex AWS Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.126 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.127.md b/doc/user/application_security/dast/checks/798.127.md
new file mode 100644
index 00000000000..86bb9613f16
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.127.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Yandex Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Yandex Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.127 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.128.md b/doc/user/application_security/dast/checks/798.128.md
new file mode 100644
index 00000000000..0db8cdd8005
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.128.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Zendesk Secret Key
+
+## Description
+
+The response body contains content that matches the pattern of a Zendesk Secret Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.128 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.13.md b/doc/user/application_security/dast/checks/798.13.md
new file mode 100644
index 00000000000..8cf2f7c2895
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.13.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Bitbucket Client ID
+
+## Description
+
+The response body contains content that matches the pattern of a Bitbucket Client ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.13 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.14.md b/doc/user/application_security/dast/checks/798.14.md
new file mode 100644
index 00000000000..85b88660b5a
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.14.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Bitbucket Client Secret
+
+## Description
+
+The response body contains content that matches the pattern of a Bitbucket Client Secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.14 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.15.md b/doc/user/application_security/dast/checks/798.15.md
new file mode 100644
index 00000000000..51f2fae0021
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.15.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Bittrex Access Key
+
+## Description
+
+The response body contains content that matches the pattern of a Bittrex Access Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.15 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.16.md b/doc/user/application_security/dast/checks/798.16.md
new file mode 100644
index 00000000000..872a97e70ea
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.16.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Bittrex Secret Key
+
+## Description
+
+The response body contains content that matches the pattern of a Bittrex Secret Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.16 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.17.md b/doc/user/application_security/dast/checks/798.17.md
new file mode 100644
index 00000000000..9e11af3bfe8
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.17.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Beamer API token
+
+## Description
+
+The response body contains content that matches the pattern of a Beamer API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.17 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.18.md b/doc/user/application_security/dast/checks/798.18.md
new file mode 100644
index 00000000000..71caa0a53ba
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.18.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Codecov Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Codecov Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.18 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.19.md b/doc/user/application_security/dast/checks/798.19.md
new file mode 100644
index 00000000000..6cfbab0e9d1
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.19.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Coinbase Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Coinbase Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.19 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.2.md b/doc/user/application_security/dast/checks/798.2.md
new file mode 100644
index 00000000000..766f4c75973
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.2.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Adobe Client ID (OAuth Web)
+
+## Description
+
+The response body contains content that matches the pattern of a Adobe Client ID (OAuth Web).
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.2 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.20.md b/doc/user/application_security/dast/checks/798.20.md
new file mode 100644
index 00000000000..83651142912
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.20.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Clojars API token
+
+## Description
+
+The response body contains content that matches the pattern of a Clojars API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.20 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.21.md b/doc/user/application_security/dast/checks/798.21.md
new file mode 100644
index 00000000000..93bf588c84b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.21.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Confluent Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Confluent Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.21 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.22.md b/doc/user/application_security/dast/checks/798.22.md
new file mode 100644
index 00000000000..7a8abbce7ba
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.22.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Confluent Secret Key
+
+## Description
+
+The response body contains content that matches the pattern of a Confluent Secret Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.22 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.23.md b/doc/user/application_security/dast/checks/798.23.md
new file mode 100644
index 00000000000..f5460e98079
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.23.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Contentful delivery API token
+
+## Description
+
+The response body contains content that matches the pattern of a Contentful delivery API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.23 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.24.md b/doc/user/application_security/dast/checks/798.24.md
new file mode 100644
index 00000000000..7a01197a6b8
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.24.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Databricks API token
+
+## Description
+
+The response body contains content that matches the pattern of a Databricks API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.24 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.25.md b/doc/user/application_security/dast/checks/798.25.md
new file mode 100644
index 00000000000..c5dcee20f61
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.25.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Datadog Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Datadog Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.25 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.26.md b/doc/user/application_security/dast/checks/798.26.md
new file mode 100644
index 00000000000..bfa5cb0588e
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.26.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Discord API key
+
+## Description
+
+The response body contains content that matches the pattern of a Discord API key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.26 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.27.md b/doc/user/application_security/dast/checks/798.27.md
new file mode 100644
index 00000000000..1210d91e741
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.27.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Discord client ID
+
+## Description
+
+The response body contains content that matches the pattern of a Discord client ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.27 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.28.md b/doc/user/application_security/dast/checks/798.28.md
new file mode 100644
index 00000000000..5f4718d8eb7
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.28.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Discord client secret
+
+## Description
+
+The response body contains content that matches the pattern of a Discord client secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.28 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.29.md b/doc/user/application_security/dast/checks/798.29.md
new file mode 100644
index 00000000000..90371a157a0
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.29.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Doppler API token
+
+## Description
+
+The response body contains content that matches the pattern of a Doppler API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.29 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.3.md b/doc/user/application_security/dast/checks/798.3.md
new file mode 100644
index 00000000000..43d69b77337
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.3.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Adobe Client Secret
+
+## Description
+
+The response body contains content that matches the pattern of a Adobe Client Secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.3 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.30.md b/doc/user/application_security/dast/checks/798.30.md
new file mode 100644
index 00000000000..db62b30b84b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.30.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Dropbox API secret
+
+## Description
+
+The response body contains content that matches the pattern of a Dropbox API secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.30 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.31.md b/doc/user/application_security/dast/checks/798.31.md
new file mode 100644
index 00000000000..8f03ba780e4
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.31.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Dropbox long lived API token
+
+## Description
+
+The response body contains content that matches the pattern of a Dropbox long lived API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.31 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.32.md b/doc/user/application_security/dast/checks/798.32.md
new file mode 100644
index 00000000000..d2ed4af9177
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.32.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Dropbox short lived API token
+
+## Description
+
+The response body contains content that matches the pattern of a Dropbox short lived API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.32 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.33.md b/doc/user/application_security/dast/checks/798.33.md
new file mode 100644
index 00000000000..5a264cf4286
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.33.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Droneci Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Droneci Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.33 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.34.md b/doc/user/application_security/dast/checks/798.34.md
new file mode 100644
index 00000000000..a9b02b75230
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.34.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Duffel API token
+
+## Description
+
+The response body contains content that matches the pattern of a Duffel API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.34 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.35.md b/doc/user/application_security/dast/checks/798.35.md
new file mode 100644
index 00000000000..5d35baec9bb
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.35.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Dynatrace API token
+
+## Description
+
+The response body contains content that matches the pattern of a Dynatrace API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.35 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.36.md b/doc/user/application_security/dast/checks/798.36.md
new file mode 100644
index 00000000000..e2e0f10f842
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.36.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token EasyPost API token
+
+## Description
+
+The response body contains content that matches the pattern of a EasyPost API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.36 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.37.md b/doc/user/application_security/dast/checks/798.37.md
new file mode 100644
index 00000000000..089dc8b3ecc
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.37.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token EasyPost test API token
+
+## Description
+
+The response body contains content that matches the pattern of a EasyPost test API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.37 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.38.md b/doc/user/application_security/dast/checks/798.38.md
new file mode 100644
index 00000000000..886cfcc701b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.38.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Etsy Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Etsy Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.38 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.39.md b/doc/user/application_security/dast/checks/798.39.md
new file mode 100644
index 00000000000..78a66d15b89
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.39.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Facebook
+
+## Description
+
+The response body contains content that matches the pattern of a Facebook.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.39 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.4.md b/doc/user/application_security/dast/checks/798.4.md
new file mode 100644
index 00000000000..2ff5db46d83
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.4.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Age secret key
+
+## Description
+
+The response body contains content that matches the pattern of a Age secret key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.4 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.40.md b/doc/user/application_security/dast/checks/798.40.md
new file mode 100644
index 00000000000..e6691bb7b3a
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.40.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Fastly API key
+
+## Description
+
+The response body contains content that matches the pattern of a Fastly API key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.40 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.41.md b/doc/user/application_security/dast/checks/798.41.md
new file mode 100644
index 00000000000..b4d097a9014
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.41.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Finicity Client Secret
+
+## Description
+
+The response body contains content that matches the pattern of a Finicity Client Secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.41 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.42.md b/doc/user/application_security/dast/checks/798.42.md
new file mode 100644
index 00000000000..30c380d13a5
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.42.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Finicity API token
+
+## Description
+
+The response body contains content that matches the pattern of a Finicity API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.42 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.43.md b/doc/user/application_security/dast/checks/798.43.md
new file mode 100644
index 00000000000..be984f7119a
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.43.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Flickr Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Flickr Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.43 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.44.md b/doc/user/application_security/dast/checks/798.44.md
new file mode 100644
index 00000000000..183cb49b2e7
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.44.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Finnhub Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Finnhub Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.44 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.45.md b/doc/user/application_security/dast/checks/798.45.md
new file mode 100644
index 00000000000..a800063f15d
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.45.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Finicity Public Key
+
+## Description
+
+The response body contains content that matches the pattern of a Finicity Public Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.45 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.46.md b/doc/user/application_security/dast/checks/798.46.md
new file mode 100644
index 00000000000..5bf658ff610
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.46.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Flutterwave Secret Key
+
+## Description
+
+The response body contains content that matches the pattern of a Flutterwave Secret Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.46 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.47.md b/doc/user/application_security/dast/checks/798.47.md
new file mode 100644
index 00000000000..a6c7b974b7f
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.47.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Flutterwave Encryption Key
+
+## Description
+
+The response body contains content that matches the pattern of a Flutterwave Encryption Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.47 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.48.md b/doc/user/application_security/dast/checks/798.48.md
new file mode 100644
index 00000000000..523232cb00c
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.48.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Frame.io API token
+
+## Description
+
+The response body contains content that matches the pattern of a Frame.io API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.48 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.49.md b/doc/user/application_security/dast/checks/798.49.md
new file mode 100644
index 00000000000..ab7f39c2376
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.49.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Freshbooks Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Freshbooks Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.49 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.5.md b/doc/user/application_security/dast/checks/798.5.md
new file mode 100644
index 00000000000..6d55dcf54df
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.5.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Airtable API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Airtable API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.5 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.50.md b/doc/user/application_security/dast/checks/798.50.md
new file mode 100644
index 00000000000..f0d864db119
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.50.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token GoCardless API token
+
+## Description
+
+The response body contains content that matches the pattern of a GoCardless API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.50 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.51.md b/doc/user/application_security/dast/checks/798.51.md
new file mode 100644
index 00000000000..f131d31ae65
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.51.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token GCP API key
+
+## Description
+
+The response body contains content that matches the pattern of a GCP API key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.51 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.52.md b/doc/user/application_security/dast/checks/798.52.md
new file mode 100644
index 00000000000..0c4ea4a540b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.52.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token GitHub Personal Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a GitHub Personal Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.52 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.53.md b/doc/user/application_security/dast/checks/798.53.md
new file mode 100644
index 00000000000..62a548be627
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.53.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token GitHub OAuth Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a GitHub OAuth Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.53 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.54.md b/doc/user/application_security/dast/checks/798.54.md
new file mode 100644
index 00000000000..d29677899a5
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.54.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token GitHub App Token
+
+## Description
+
+The response body contains content that matches the pattern of a GitHub App Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.54 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.55.md b/doc/user/application_security/dast/checks/798.55.md
new file mode 100644
index 00000000000..4c3bd9147c0
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.55.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token GitHub Refresh Token
+
+## Description
+
+The response body contains content that matches the pattern of a GitHub Refresh Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.55 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.56.md b/doc/user/application_security/dast/checks/798.56.md
new file mode 100644
index 00000000000..563ea1f91a8
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.56.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token GitLab Personal Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a GitLab Personal Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.56 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.57.md b/doc/user/application_security/dast/checks/798.57.md
new file mode 100644
index 00000000000..25b32953ebd
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.57.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Gitter Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Gitter Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.57 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.58.md b/doc/user/application_security/dast/checks/798.58.md
new file mode 100644
index 00000000000..056bcb0820a
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.58.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token HashiCorp Terraform user/org API token
+
+## Description
+
+The response body contains content that matches the pattern of a HashiCorp Terraform user/org API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.58 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.59.md b/doc/user/application_security/dast/checks/798.59.md
new file mode 100644
index 00000000000..b7e6b4fa32b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.59.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Heroku API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Heroku API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.59 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.6.md b/doc/user/application_security/dast/checks/798.6.md
new file mode 100644
index 00000000000..ce6ee95bede
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.6.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Algolia API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Algolia API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.6 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.60.md b/doc/user/application_security/dast/checks/798.60.md
new file mode 100644
index 00000000000..f471411440b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.60.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token HubSpot API Token
+
+## Description
+
+The response body contains content that matches the pattern of a HubSpot API Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.60 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.61.md b/doc/user/application_security/dast/checks/798.61.md
new file mode 100644
index 00000000000..061bf8f7360
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.61.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Intercom API Token
+
+## Description
+
+The response body contains content that matches the pattern of a Intercom API Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.61 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.62.md b/doc/user/application_security/dast/checks/798.62.md
new file mode 100644
index 00000000000..9c0f312b161
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.62.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Kraken Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Kraken Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.62 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.63.md b/doc/user/application_security/dast/checks/798.63.md
new file mode 100644
index 00000000000..51668619025
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.63.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Kucoin Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Kucoin Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.63 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.64.md b/doc/user/application_security/dast/checks/798.64.md
new file mode 100644
index 00000000000..12d20f96a42
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.64.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Kucoin Secret Key
+
+## Description
+
+The response body contains content that matches the pattern of a Kucoin Secret Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.64 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.65.md b/doc/user/application_security/dast/checks/798.65.md
new file mode 100644
index 00000000000..eb1dac62037
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.65.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Launchdarkly Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Launchdarkly Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.65 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.66.md b/doc/user/application_security/dast/checks/798.66.md
new file mode 100644
index 00000000000..8f20f9fa339
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.66.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Linear API Token
+
+## Description
+
+The response body contains content that matches the pattern of a Linear API Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.66 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.67.md b/doc/user/application_security/dast/checks/798.67.md
new file mode 100644
index 00000000000..7554c077376
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.67.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Linear Client Secret
+
+## Description
+
+The response body contains content that matches the pattern of a Linear Client Secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.67 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.68.md b/doc/user/application_security/dast/checks/798.68.md
new file mode 100644
index 00000000000..c633b949185
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.68.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token LinkedIn Client ID
+
+## Description
+
+The response body contains content that matches the pattern of a LinkedIn Client ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.68 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.69.md b/doc/user/application_security/dast/checks/798.69.md
new file mode 100644
index 00000000000..b34c2f01be6
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.69.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token LinkedIn Client secret
+
+## Description
+
+The response body contains content that matches the pattern of a LinkedIn Client secret.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.69 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.7.md b/doc/user/application_security/dast/checks/798.7.md
new file mode 100644
index 00000000000..43aba566471
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.7.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Alibaba AccessKey ID
+
+## Description
+
+The response body contains content that matches the pattern of a Alibaba AccessKey ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.7 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.70.md b/doc/user/application_security/dast/checks/798.70.md
new file mode 100644
index 00000000000..b7c1816481b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.70.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Lob API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Lob API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.70 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.71.md b/doc/user/application_security/dast/checks/798.71.md
new file mode 100644
index 00000000000..f0bcc43940d
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.71.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Lob Publishable API Key
+
+## Description
+
+The response body contains content that matches the pattern of a Lob Publishable API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.71 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.72.md b/doc/user/application_security/dast/checks/798.72.md
new file mode 100644
index 00000000000..48b2cffbbda
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.72.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Mailchimp API key
+
+## Description
+
+The response body contains content that matches the pattern of a Mailchimp API key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.72 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.73.md b/doc/user/application_security/dast/checks/798.73.md
new file mode 100644
index 00000000000..eae41a49782
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.73.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Mailgun public validation key
+
+## Description
+
+The response body contains content that matches the pattern of a Mailgun public validation key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.73 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.74.md b/doc/user/application_security/dast/checks/798.74.md
new file mode 100644
index 00000000000..9a4b909bf4b
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.74.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Mailgun private API token
+
+## Description
+
+The response body contains content that matches the pattern of a Mailgun private API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.74 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.75.md b/doc/user/application_security/dast/checks/798.75.md
new file mode 100644
index 00000000000..4c1cfd78003
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.75.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Mailgun webhook signing key
+
+## Description
+
+The response body contains content that matches the pattern of a Mailgun webhook signing key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.75 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.76.md b/doc/user/application_security/dast/checks/798.76.md
new file mode 100644
index 00000000000..87e6364184f
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.76.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token MapBox API token
+
+## Description
+
+The response body contains content that matches the pattern of a MapBox API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.76 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.77.md b/doc/user/application_security/dast/checks/798.77.md
new file mode 100644
index 00000000000..7b1becf4c19
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.77.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Mattermost Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Mattermost Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.77 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.78.md b/doc/user/application_security/dast/checks/798.78.md
new file mode 100644
index 00000000000..8d366d44c9d
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.78.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token MessageBird API token
+
+## Description
+
+The response body contains content that matches the pattern of a MessageBird API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.78 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.79.md b/doc/user/application_security/dast/checks/798.79.md
new file mode 100644
index 00000000000..9a580658a72
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.79.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token MessageBird client ID
+
+## Description
+
+The response body contains content that matches the pattern of a MessageBird client ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.79 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.8.md b/doc/user/application_security/dast/checks/798.8.md
new file mode 100644
index 00000000000..e6dfe1aa1cc
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.8.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Alibaba Secret Key
+
+## Description
+
+The response body contains content that matches the pattern of a Alibaba Secret Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.8 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.80.md b/doc/user/application_security/dast/checks/798.80.md
new file mode 100644
index 00000000000..c0a893264b0
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.80.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Netlify Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Netlify Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.80 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.81.md b/doc/user/application_security/dast/checks/798.81.md
new file mode 100644
index 00000000000..abf40705e7f
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.81.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token New Relic user API Key
+
+## Description
+
+The response body contains content that matches the pattern of a New Relic user API Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.81 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.82.md b/doc/user/application_security/dast/checks/798.82.md
new file mode 100644
index 00000000000..519555546b6
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.82.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token New Relic user API ID
+
+## Description
+
+The response body contains content that matches the pattern of a New Relic user API ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.82 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.83.md b/doc/user/application_security/dast/checks/798.83.md
new file mode 100644
index 00000000000..85bdd534390
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.83.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token New Relic ingest browser API token
+
+## Description
+
+The response body contains content that matches the pattern of a New Relic ingest browser API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.83 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.84.md b/doc/user/application_security/dast/checks/798.84.md
new file mode 100644
index 00000000000..74ebb4fcaf1
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.84.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token npm access token
+
+## Description
+
+The response body contains content that matches the pattern of a npm access token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.84 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.85.md b/doc/user/application_security/dast/checks/798.85.md
new file mode 100644
index 00000000000..0726bdc7fd8
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.85.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Nytimes Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Nytimes Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.85 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.86.md b/doc/user/application_security/dast/checks/798.86.md
new file mode 100644
index 00000000000..940a46b7658
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.86.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Okta Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a Okta Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.86 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.87.md b/doc/user/application_security/dast/checks/798.87.md
new file mode 100644
index 00000000000..8246bafc993
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.87.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Plaid Client ID
+
+## Description
+
+The response body contains content that matches the pattern of a Plaid Client ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.87 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.88.md b/doc/user/application_security/dast/checks/798.88.md
new file mode 100644
index 00000000000..57b029857ba
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.88.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Plaid Secret key
+
+## Description
+
+The response body contains content that matches the pattern of a Plaid Secret key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.88 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.89.md b/doc/user/application_security/dast/checks/798.89.md
new file mode 100644
index 00000000000..466044834dd
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.89.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Plaid API Token
+
+## Description
+
+The response body contains content that matches the pattern of a Plaid API Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.89 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.9.md b/doc/user/application_security/dast/checks/798.9.md
new file mode 100644
index 00000000000..12c725cfd08
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.9.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Asana Client ID
+
+## Description
+
+The response body contains content that matches the pattern of a Asana Client ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.9 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.90.md b/doc/user/application_security/dast/checks/798.90.md
new file mode 100644
index 00000000000..e0008af4918
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.90.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token PlanetScale password
+
+## Description
+
+The response body contains content that matches the pattern of a PlanetScale password.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.90 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.91.md b/doc/user/application_security/dast/checks/798.91.md
new file mode 100644
index 00000000000..be54e99360f
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.91.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token PlanetScale API token
+
+## Description
+
+The response body contains content that matches the pattern of a PlanetScale API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.91 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.92.md b/doc/user/application_security/dast/checks/798.92.md
new file mode 100644
index 00000000000..07ae24151f5
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.92.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token PlanetScale OAuth token
+
+## Description
+
+The response body contains content that matches the pattern of a PlanetScale OAuth token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.92 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.93.md b/doc/user/application_security/dast/checks/798.93.md
new file mode 100644
index 00000000000..661f460bf27
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.93.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Postman API token
+
+## Description
+
+The response body contains content that matches the pattern of a Postman API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.93 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.94.md b/doc/user/application_security/dast/checks/798.94.md
new file mode 100644
index 00000000000..4aeb15fee23
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.94.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Private Key
+
+## Description
+
+The response body contains content that matches the pattern of a Private Key.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.94 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.95.md b/doc/user/application_security/dast/checks/798.95.md
new file mode 100644
index 00000000000..13374aa67e0
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.95.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Pulumi API token
+
+## Description
+
+The response body contains content that matches the pattern of a Pulumi API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.95 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.96.md b/doc/user/application_security/dast/checks/798.96.md
new file mode 100644
index 00000000000..cb61bd38950
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.96.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token PyPI upload token
+
+## Description
+
+The response body contains content that matches the pattern of a PyPI upload token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.96 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.97.md b/doc/user/application_security/dast/checks/798.97.md
new file mode 100644
index 00000000000..93f03a692d7
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.97.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Rubygem API token
+
+## Description
+
+The response body contains content that matches the pattern of a Rubygem API token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.97 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.98.md b/doc/user/application_security/dast/checks/798.98.md
new file mode 100644
index 00000000000..aab4cb9c5ed
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.98.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token RapidAPI Access Token
+
+## Description
+
+The response body contains content that matches the pattern of a RapidAPI Access Token.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.98 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/798.99.md b/doc/user/application_security/dast/checks/798.99.md
new file mode 100644
index 00000000000..90c8aeda7ab
--- /dev/null
+++ b/doc/user/application_security/dast/checks/798.99.md
@@ -0,0 +1,26 @@
+---
+stage: Secure
+group: Dynamic Analysis
+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
+---
+
+# Exposure of confidential secret or token Sendbird Access ID
+
+## Description
+
+The response body contains content that matches the pattern of a Sendbird Access ID.
+Exposing this value could allow attackers to gain access to all resources granted by this token.
+
+## Remediation
+
+Review the response body content and remove any exposed values.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 798.99 | false | 798 | Passive | High |
+
+## Links
+
+- [CWE](https://cwe.mitre.org/data/definitions/798.html)
diff --git a/doc/user/application_security/dast/checks/index.md b/doc/user/application_security/dast/checks/index.md
index e2947d5b120..cdfebc07ef2 100644
--- a/doc/user/application_security/dast/checks/index.md
+++ b/doc/user/application_security/dast/checks/index.md
@@ -12,14 +12,20 @@ The [DAST browser-based crawler](../browser_based.md) provides a number of vulne
|:---|:------|:---------|:-----|
| [1004.1](1004.1.md) | Sensitive cookie without HttpOnly attribute | Low | Passive |
| [16.1](16.1.md) | Missing Content-Type header | Low | Passive |
+| [16.10](16.10.md) | Content-Security-Policy violations | Info | Passive |
| [16.2](16.2.md) | Server header exposes version information | Low | Passive |
| [16.3](16.3.md) | X-Powered-By header exposes version information | Low | Passive |
| [16.4](16.4.md) | X-Backend-Server header exposes server information | Info | Passive |
| [16.5](16.5.md) | AspNet header exposes version information | Low | Passive |
| [16.6](16.6.md) | AspNetMvc header exposes version information | Low | Passive |
| [16.7](16.7.md) | Strict-Transport-Security header missing or invalid | Low | Passive |
+| [16.8](16.8.md) | Content-Security-Policy analysis | Info | Passive |
+| [16.9](16.9.md) | Content-Security-Policy-Report-Only analysis | Info | Passive |
| [200.1](200.1.md) | Exposure of sensitive information to an unauthorized actor (private IP address) | Low | Passive |
| [209.1](209.1.md) | Generation of error message containing sensitive information | Low | Passive |
+| [209.2](209.2.md) | Generation of database error message containing sensitive information | Low | Passive |
+| [287.1](287.1.md) | Insecure authentication over HTTP (Basic Authentication) | Medium | Passive |
+| [287.2](287.2.md) | Insecure authentication over HTTP (Digest Authentication) | Low | Passive |
| [319.1](319.1.md) | Mixed Content | Info | Passive |
| [352.1](352.1.md) | Absence of anti-CSRF tokens | Medium | Passive |
| [359.1](359.1.md) | Exposure of Private Personal Information (PII) to an unauthorized actor (credit card) | Medium | Passive |
@@ -31,5 +37,133 @@ The [DAST browser-based crawler](../browser_based.md) provides a number of vulne
| [601.1](601.1.md) | URL redirection to untrusted site ('open redirect') | Low | Passive |
| [614.1](614.1.md) | Sensitive cookie without Secure attribute | Low | Passive |
| [693.1](693.1.md) | Missing X-Content-Type-Options: nosniff | Low | Passive |
+| [798.1](798.1.md) | Exposure of confidential secret or token Adafruit API Key | High | Passive |
+| [798.2](798.2.md) | Exposure of confidential secret or token Adobe Client ID (OAuth Web) | High | Passive |
+| [798.3](798.3.md) | Exposure of confidential secret or token Adobe Client Secret | High | Passive |
+| [798.4](798.4.md) | Exposure of confidential secret or token Age secret key | High | Passive |
+| [798.5](798.5.md) | Exposure of confidential secret or token Airtable API Key | High | Passive |
+| [798.6](798.6.md) | Exposure of confidential secret or token Algolia API Key | High | Passive |
+| [798.7](798.7.md) | Exposure of confidential secret or token Alibaba AccessKey ID | High | Passive |
+| [798.8](798.8.md) | Exposure of confidential secret or token Alibaba Secret Key | High | Passive |
+| [798.9](798.9.md) | Exposure of confidential secret or token Asana Client ID | High | Passive |
+| [798.10](798.10.md) | Exposure of confidential secret or token Asana Client Secret | High | Passive |
+| [798.11](798.11.md) | Exposure of confidential secret or token Atlassian API token | High | Passive |
+| [798.12](798.12.md) | Exposure of confidential secret or token AWS | High | Passive |
+| [798.13](798.13.md) | Exposure of confidential secret or token Bitbucket Client ID | High | Passive |
+| [798.14](798.14.md) | Exposure of confidential secret or token Bitbucket Client Secret | High | Passive |
+| [798.15](798.15.md) | Exposure of confidential secret or token Bittrex Access Key | High | Passive |
+| [798.16](798.16.md) | Exposure of confidential secret or token Bittrex Secret Key | High | Passive |
+| [798.17](798.17.md) | Exposure of confidential secret or token Beamer API token | High | Passive |
+| [798.18](798.18.md) | Exposure of confidential secret or token Codecov Access Token | High | Passive |
+| [798.19](798.19.md) | Exposure of confidential secret or token Coinbase Access Token | High | Passive |
+| [798.20](798.20.md) | Exposure of confidential secret or token Clojars API token | High | Passive |
+| [798.21](798.21.md) | Exposure of confidential secret or token Confluent Access Token | High | Passive |
+| [798.22](798.22.md) | Exposure of confidential secret or token Confluent Secret Key | High | Passive |
+| [798.23](798.23.md) | Exposure of confidential secret or token Contentful delivery API token | High | Passive |
+| [798.24](798.24.md) | Exposure of confidential secret or token Databricks API token | High | Passive |
+| [798.25](798.25.md) | Exposure of confidential secret or token Datadog Access Token | High | Passive |
+| [798.26](798.26.md) | Exposure of confidential secret or token Discord API key | High | Passive |
+| [798.27](798.27.md) | Exposure of confidential secret or token Discord client ID | High | Passive |
+| [798.28](798.28.md) | Exposure of confidential secret or token Discord client secret | High | Passive |
+| [798.29](798.29.md) | Exposure of confidential secret or token Doppler API token | High | Passive |
+| [798.30](798.30.md) | Exposure of confidential secret or token Dropbox API secret | High | Passive |
+| [798.31](798.31.md) | Exposure of confidential secret or token Dropbox long lived API token | High | Passive |
+| [798.32](798.32.md) | Exposure of confidential secret or token Dropbox short lived API token | High | Passive |
+| [798.33](798.33.md) | Exposure of confidential secret or token Droneci Access Token | High | Passive |
+| [798.34](798.34.md) | Exposure of confidential secret or token Duffel API token | High | Passive |
+| [798.35](798.35.md) | Exposure of confidential secret or token Dynatrace API token | High | Passive |
+| [798.36](798.36.md) | Exposure of confidential secret or token EasyPost API token | High | Passive |
+| [798.37](798.37.md) | Exposure of confidential secret or token EasyPost test API token | High | Passive |
+| [798.38](798.38.md) | Exposure of confidential secret or token Etsy Access Token | High | Passive |
+| [798.39](798.39.md) | Exposure of confidential secret or token Facebook | High | Passive |
+| [798.40](798.40.md) | Exposure of confidential secret or token Fastly API key | High | Passive |
+| [798.41](798.41.md) | Exposure of confidential secret or token Finicity Client Secret | High | Passive |
+| [798.42](798.42.md) | Exposure of confidential secret or token Finicity API token | High | Passive |
+| [798.43](798.43.md) | Exposure of confidential secret or token Flickr Access Token | High | Passive |
+| [798.44](798.44.md) | Exposure of confidential secret or token Finnhub Access Token | High | Passive |
+| [798.45](798.45.md) | Exposure of confidential secret or token Finicity Public Key | High | Passive |
+| [798.46](798.46.md) | Exposure of confidential secret or token Flutterwave Secret Key | High | Passive |
+| [798.47](798.47.md) | Exposure of confidential secret or token Flutterwave Encryption Key | High | Passive |
+| [798.48](798.48.md) | Exposure of confidential secret or token Frame.io API token | High | Passive |
+| [798.49](798.49.md) | Exposure of confidential secret or token Freshbooks Access Token | High | Passive |
+| [798.50](798.50.md) | Exposure of confidential secret or token GoCardless API token | High | Passive |
+| [798.51](798.51.md) | Exposure of confidential secret or token GCP API key | High | Passive |
+| [798.52](798.52.md) | Exposure of confidential secret or token GitHub Personal Access Token | High | Passive |
+| [798.53](798.53.md) | Exposure of confidential secret or token GitHub OAuth Access Token | High | Passive |
+| [798.54](798.54.md) | Exposure of confidential secret or token GitHub App Token | High | Passive |
+| [798.55](798.55.md) | Exposure of confidential secret or token GitHub Refresh Token | High | Passive |
+| [798.56](798.56.md) | Exposure of confidential secret or token GitLab Personal Access Token | High | Passive |
+| [798.57](798.57.md) | Exposure of confidential secret or token Gitter Access Token | High | Passive |
+| [798.58](798.58.md) | Exposure of confidential secret or token HashiCorp Terraform user/org API token | High | Passive |
+| [798.59](798.59.md) | Exposure of confidential secret or token Heroku API Key | High | Passive |
+| [798.60](798.60.md) | Exposure of confidential secret or token HubSpot API Token | High | Passive |
+| [798.61](798.61.md) | Exposure of confidential secret or token Intercom API Token | High | Passive |
+| [798.62](798.62.md) | Exposure of confidential secret or token Kraken Access Token | High | Passive |
+| [798.63](798.63.md) | Exposure of confidential secret or token Kucoin Access Token | High | Passive |
+| [798.64](798.64.md) | Exposure of confidential secret or token Kucoin Secret Key | High | Passive |
+| [798.65](798.65.md) | Exposure of confidential secret or token Launchdarkly Access Token | High | Passive |
+| [798.66](798.66.md) | Exposure of confidential secret or token Linear API Token | High | Passive |
+| [798.67](798.67.md) | Exposure of confidential secret or token Linear Client Secret | High | Passive |
+| [798.68](798.68.md) | Exposure of confidential secret or token LinkedIn Client ID | High | Passive |
+| [798.69](798.69.md) | Exposure of confidential secret or token LinkedIn Client secret | High | Passive |
+| [798.70](798.70.md) | Exposure of confidential secret or token Lob API Key | High | Passive |
+| [798.71](798.71.md) | Exposure of confidential secret or token Lob Publishable API Key | High | Passive |
+| [798.72](798.72.md) | Exposure of confidential secret or token Mailchimp API key | High | Passive |
+| [798.73](798.73.md) | Exposure of confidential secret or token Mailgun public validation key | High | Passive |
+| [798.74](798.74.md) | Exposure of confidential secret or token Mailgun private API token | High | Passive |
+| [798.75](798.75.md) | Exposure of confidential secret or token Mailgun webhook signing key | High | Passive |
+| [798.76](798.76.md) | Exposure of confidential secret or token MapBox API token | High | Passive |
+| [798.77](798.77.md) | Exposure of confidential secret or token Mattermost Access Token | High | Passive |
+| [798.78](798.78.md) | Exposure of confidential secret or token MessageBird API token | High | Passive |
+| [798.79](798.79.md) | Exposure of confidential secret or token MessageBird client ID | High | Passive |
+| [798.80](798.80.md) | Exposure of confidential secret or token Netlify Access Token | High | Passive |
+| [798.81](798.81.md) | Exposure of confidential secret or token New Relic user API Key | High | Passive |
+| [798.82](798.82.md) | Exposure of confidential secret or token New Relic user API ID | High | Passive |
+| [798.83](798.83.md) | Exposure of confidential secret or token New Relic ingest browser API token | High | Passive |
+| [798.84](798.84.md) | Exposure of confidential secret or token npm access token | High | Passive |
+| [798.85](798.85.md) | Exposure of confidential secret or token Nytimes Access Token | High | Passive |
+| [798.86](798.86.md) | Exposure of confidential secret or token Okta Access Token | High | Passive |
+| [798.87](798.87.md) | Exposure of confidential secret or token Plaid Client ID | High | Passive |
+| [798.88](798.88.md) | Exposure of confidential secret or token Plaid Secret key | High | Passive |
+| [798.89](798.89.md) | Exposure of confidential secret or token Plaid API Token | High | Passive |
+| [798.90](798.90.md) | Exposure of confidential secret or token PlanetScale password | High | Passive |
+| [798.91](798.91.md) | Exposure of confidential secret or token PlanetScale API token | High | Passive |
+| [798.92](798.92.md) | Exposure of confidential secret or token PlanetScale OAuth token | High | Passive |
+| [798.93](798.93.md) | Exposure of confidential secret or token Postman API token | High | Passive |
+| [798.94](798.94.md) | Exposure of confidential secret or token Private Key | High | Passive |
+| [798.95](798.95.md) | Exposure of confidential secret or token Pulumi API token | High | Passive |
+| [798.96](798.96.md) | Exposure of confidential secret or token PyPI upload token | High | Passive |
+| [798.97](798.97.md) | Exposure of confidential secret or token Rubygem API token | High | Passive |
+| [798.98](798.98.md) | Exposure of confidential secret or token RapidAPI Access Token | High | Passive |
+| [798.99](798.99.md) | Exposure of confidential secret or token Sendbird Access ID | High | Passive |
+| [798.100](798.100.md) | Exposure of confidential secret or token Sendbird Access Token | High | Passive |
+| [798.101](798.101.md) | Exposure of confidential secret or token SendGrid API token | High | Passive |
+| [798.102](798.102.md) | Exposure of confidential secret or token Sendinblue API token | High | Passive |
+| [798.103](798.103.md) | Exposure of confidential secret or token Sentry Access Token | High | Passive |
+| [798.104](798.104.md) | Exposure of confidential secret or token Shippo API token | High | Passive |
+| [798.105](798.105.md) | Exposure of confidential secret or token Shopify access token | High | Passive |
+| [798.106](798.106.md) | Exposure of confidential secret or token Shopify custom access token | High | Passive |
+| [798.107](798.107.md) | Exposure of confidential secret or token Shopify private app access token | High | Passive |
+| [798.108](798.108.md) | Exposure of confidential secret or token Shopify shared secret | High | Passive |
+| [798.109](798.109.md) | Exposure of confidential secret or token Slack token | High | Passive |
+| [798.110](798.110.md) | Exposure of confidential secret or token Slack Webhook | High | Passive |
+| [798.111](798.111.md) | Exposure of confidential secret or token Stripe | High | Passive |
+| [798.112](798.112.md) | Exposure of confidential secret or token Square Access Token | High | Passive |
+| [798.113](798.113.md) | Exposure of confidential secret or token Squarespace Access Token | High | Passive |
+| [798.114](798.114.md) | Exposure of confidential secret or token SumoLogic Access ID | High | Passive |
+| [798.115](798.115.md) | Exposure of confidential secret or token SumoLogic Access Token | High | Passive |
+| [798.116](798.116.md) | Exposure of confidential secret or token Travis CI Access Token | High | Passive |
+| [798.117](798.117.md) | Exposure of confidential secret or token Twilio API Key | High | Passive |
+| [798.118](798.118.md) | Exposure of confidential secret or token Twitch API token | High | Passive |
+| [798.119](798.119.md) | Exposure of confidential secret or token Twitter API Key | High | Passive |
+| [798.120](798.120.md) | Exposure of confidential secret or token Twitter API Secret | High | Passive |
+| [798.121](798.121.md) | Exposure of confidential secret or token Twitter Access Token | High | Passive |
+| [798.122](798.122.md) | Exposure of confidential secret or token Twitter Access Secret | High | Passive |
+| [798.123](798.123.md) | Exposure of confidential secret or token Twitter Bearer Token | High | Passive |
+| [798.124](798.124.md) | Exposure of confidential secret or token Typeform API token | High | Passive |
+| [798.125](798.125.md) | Exposure of confidential secret or token Yandex API Key | High | Passive |
+| [798.126](798.126.md) | Exposure of confidential secret or token Yandex AWS Access Token | High | Passive |
+| [798.127](798.127.md) | Exposure of confidential secret or token Yandex Access Token | High | Passive |
+| [798.128](798.128.md) | Exposure of confidential secret or token Zendesk Secret Key | High | Passive |
| [829.1](829.1.md) | Inclusion of Functionality from Untrusted Control Sphere | Low | Passive |
| [829.2](829.2.md) | Invalid Sub-Resource Integrity values detected | Medium | Passive |
diff --git a/doc/user/application_security/dast/dast_troubleshooting.md b/doc/user/application_security/dast/dast_troubleshooting.md
index 50570b89920..0c7a9806c72 100644
--- a/doc/user/application_security/dast/dast_troubleshooting.md
+++ b/doc/user/application_security/dast/dast_troubleshooting.md
@@ -102,3 +102,8 @@ To avoid this error, make sure you are using the latest stable version of Docker
## Lack of IPv6 support
Due to the underlying [ZAProxy engine not supporting IPv6](https://github.com/zaproxy/zaproxy/issues/3705), DAST is unable to scan or crawl IPv6-based applications.
+
+## Additional insight into DAST scan activity
+
+For additional insight into what a DAST scan is doing at a given time, you may find it helpful to review
+the web server access logs for a DAST target endpoint during or following a scan.
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 25b4b705025..f8aa2e3d1c6 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -90,7 +90,7 @@ deploy:
services:
- name: docker:dind
alias: dind
- image: docker:19.03.5
+ image: docker:20.10.16
stage: build
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
@@ -99,9 +99,10 @@ deploy:
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
-services: # use services to link your app container to the dast job
- - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- alias: yourapp
+dast:
+ services: # use services to link your app container to the dast job
+ - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ alias: yourapp
variables:
DAST_FULL_SCAN_ENABLED: "true" # do a full scan
@@ -622,6 +623,11 @@ To enable Mutual TLS:
These CI/CD variables are specific to DAST. They can be used to customize the behavior of DAST to your requirements.
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results,
+including a large number of false positives.
+
| CI/CD variable | Type | Description |
|:-------------------------------------------------|:--------------|:------------------------------|
| `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. |
diff --git a/doc/user/application_security/dast_api/index.md b/doc/user/application_security/dast_api/index.md
index 9128576bf29..fdca02267e4 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -808,6 +808,9 @@ Optionally:
- `DAST_API_PRE_SCRIPT`: Script to install runtimes or dependencies before the scan starts.
+WARNING:
+To execute scripts in Alpine Linux you must first use the command [`chmod`](https://www.gnu.org/software/coreutils/manual/html_node/chmod-invocation.html) to set the [execution permission](https://www.gnu.org/software/coreutils/manual/html_node/Setting-Permissions.html). For example, to set the execution permission of `script.py` for everyone, use the command: `chmod a+x script.py`. If needed, you can version your `script.py` with the execution permission already set.
+
```yaml
stages:
- dast
@@ -856,7 +859,9 @@ import requests
import backoff
# [1] Store log file in directory indicated by env var CI_PROJECT_DIR
-working_directory = os.environ['CI_PROJECT_DIR']
+working_directory = os.environ.get( 'CI_PROJECT_DIR')
+overrides_file_name = os.environ.get('DAST_API_OVERRIDES_FILE', 'dast-api-overrides.json')
+overrides_file_path = os.path.join(working_directory, overrides_file_name)
# [2] File name should match the pattern: gl-*.log
log_file_path = os.path.join(working_directory, 'gl-user-overrides.log')
@@ -870,7 +875,11 @@ logging.basicConfig(filename=log_file_path, level=logging.DEBUG)
requests.exceptions.ConnectionError),
max_time=30)
def get_auth_response():
- return requests.get('https://authorization.service/api/get_api_token', auth=(os.environ['AUTH_USER'], os.environ['AUTH_PWD']))
+ authorization_url = 'https://authorization.service/api/get_api_token'
+ return requests.get(
+ f'{authorization_url}',
+ auth=(os.environ.get('AUTH_USER'), os.environ.get('AUTH_PWD'))
+ )
# In our example, access token is retrieved from a given endpoint
try:
@@ -892,14 +901,14 @@ try:
# requests.ReadTimeout : The server did not send any data in the allotted amount of time.
# requests.TooManyRedirects : The request exceeds the configured number of maximum redirections
# requests.exceptions.RequestException : All exceptions that related to Requests
+except json.JSONDecodeError as json_decode_error:
+ # logs errors related decoding JSON response
+ logging.error(f'Error, failed while decoding JSON response. Error message: {json_decode_error}')
+ raise
except requests.exceptions.RequestException as requests_error:
# logs exceptions related to `Requests`
logging.error(f'Error, failed while performing HTTP request. Error message: {requests_error}')
raise
-except requests.exceptions.JSONDecodeError as json_decode_error:
- # logs errors related decoding JSON response
- logging.error(f'Error, failed while decoding JSON response. Error message: {json_decode_error}')
- raise
except Exception as e:
# logs any other error
logging.error(f'Error, unknown error while retrieving access token. Error message: {e}')
@@ -914,9 +923,6 @@ overrides_data = {
}
# log entry informing about the file override computation
-# the location of the overrides json file is also CI_PROJECT_DIR
-overrides_file_path = os.path.join(
- working_directory, "dast-api-overrides.json")
logging.info("Creating overrides file: %s" % overrides_file_path)
# attempts to overwrite the file
@@ -929,7 +935,7 @@ try:
fd.write(json.dumps(overrides_data).encode('utf-8'))
except Exception as e:
# logs any other error
- logging.error(f'Error, unkown error when overwritng file {overrides_file_path}. Error message: {e}')
+ logging.error(f'Error, unknown error when overwriting file {overrides_file_path}. Error message: {e}')
raise
# logs informing override has finished successfully
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index 08e2dcd2e7e..d0a91ab664e 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -63,18 +63,19 @@ possible, we encourage you to use all of our security scanning tools:
The following table summarizes which types of dependencies each scanning tool can detect:
-| Feature | Dependency Scanning | Container Scanning |
-| ----------------------------------------------------------- | ------------------- | ------------------ |
-| Identify the manifest, lock file, or static file that introduced the dependency | **{check-circle}** | **{dotted-circle}** |
-| Development dependencies | **{check-circle}** | **{dotted-circle}** |
-| Dependencies in a lock file committed to your repository | **{check-circle}** | **{check-circle}** <sup>1</sup> |
-| Binaries built by Go | **{dotted-circle}** | **{check-circle}** <sup>2</sup> |
-| Dynamically-linked language-specific dependencies installed by the Operating System | **{dotted-circle}** | **{check-circle}** |
-| Operating system dependencies | **{dotted-circle}** | **{check-circle}** |
-| Language-specific dependencies installed on the operating system (not built by your project) | **{dotted-circle}** | **{check-circle}** |
+| Feature | Dependency Scanning | Container Scanning |
+| ----------------------------------------------------------- | ------------------- | ------------------- |
+| Identify the manifest, lock file, or static file that introduced the dependency | **{check-circle}** | **{dotted-circle}** |
+| Development dependencies | **{check-circle}** | **{dotted-circle}** |
+| Dependencies in a lock file committed to your repository | **{check-circle}** | **{check-circle}** <sup>1</sup> |
+| Binaries built by Go | **{dotted-circle}** | **{check-circle}** <sup>2</sup> <sup>3</sup> |
+| Dynamically-linked language-specific dependencies installed by the Operating System | **{dotted-circle}** | **{check-circle}** <sup>3</sup> |
+| Operating system dependencies | **{dotted-circle}** | **{check-circle}** |
+| Language-specific dependencies installed on the operating system (not built by your project) | **{dotted-circle}** | **{check-circle}** |
1. Lock file must be present in the image to be detected.
1. Binary file must be present in the image to be detected.
+1. Only when using Trivy
## Requirements
@@ -310,7 +311,7 @@ table.supported-languages ul {
<p>
Although Gradle with Java 8 is supported, there are other issues such that Android project builds are not supported at this time.
Please see the backlog issue <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/336866">Android support for Dependency
- Scanning (gemnasium-maven)</a> for more details.
+ Scanning (gemnasium-maven)</a> for more details. Also, Gradle is not supported when [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode) is enabled.
</p>
</li>
<li>
@@ -396,11 +397,10 @@ To support the following package managers, the GitLab analyzers proceed in two s
If your project <i>does not use</i> a <code>gradlew</code> file, then the analyzer automatically switches to one of the
pre-installed Gradle versions, based on the version of Java specified by the
<a href="#configuring-specific-analyzers-used-by-dependency-scanning"><code>DS_JAVA_VERSION</code></a> variable.
+ By default, the analyzer uses Java 17 and Gradle 7.3.3.
</p>
- <p>You can view the
- <a href="https://docs.gradle.org/current/userguide/compatibility.html#java">Gradle Java compatibility matrix</a> to see which version
- of Gradle is selected for each Java version. Note that we only support switching to one of these pre-installed Gradle versions
- for Java versions 13 to 17.
+ <p>
+ For Java versions <code>8</code> and <code>11</code>, Gradle <code>6.7.1</code> is automatically selected, and for Java versions <code>13</code> to <code>17</code>, Gradle <code>7.3.3</code> is automatically selected.
</p>
</li>
<li>
@@ -587,6 +587,11 @@ gemnasium-dependency_scanning:
Dependency scanning can be [configured](#customizing-the-dependency-scanning-settings)
using environment variables.
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results,
+including a large number of false positives.
+
#### Configuring dependency scanning
The following variables allow configuration of global dependency scanning settings.
@@ -611,7 +616,7 @@ The following variables are used for configuring specific analyzers (used for a
| `GEMNASIUM_DB_UPDATE_DISABLED` | `gemnasium` | `"false"` | Disable automatic updates for the `gemnasium-db` advisory database (For usage see: [examples](#hosting-a-copy-of-the-gemnasium_db-advisory-database))|
| `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_REMEDIATE` | `gemnasium` | `"true"`, `"false"` in FIPS mode | Enable automatic remediation of vulnerable dependencies. Not supported in FIPS mode. |
| `GEMNASIUM_LIBRARY_SCAN_ENABLED` | `gemnasium` | `"true"` | Enable detecting vulnerabilities in vendored JavaScript libraries. For now, `gemnasium` leverages [`Retire.js`](https://github.com/RetireJS/retire.js) to do this job. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/350512) in GitLab 14.8. |
| `DS_JAVA_VERSION` | `gemnasium-maven` | `17` | Version of Java. Available versions: `8`, `11`, `13`, `14`, `15`, `16`, `17`. Available versions in FIPS-enabled image: `8`, `11`, `17`. |
| `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). |
@@ -622,7 +627,7 @@ The following variables are used for configuring specific analyzers (used for a
| `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) |
-| `DS_INCLUDE_DEV_DEPENDENCIES` | `gemnasium` | `"true"` | When set to `"false"`, development dependencies and their vulnerabilities are not reported. Only NPM projects are supported. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227861) in GitLab 15.1. |
+| `DS_INCLUDE_DEV_DEPENDENCIES` | `gemnasium` | `"true"` | When set to `"false"`, development dependencies and their vulnerabilities are not reported. Only NPM and Poetry projects are supported. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227861) in GitLab 15.1. |
#### Other variables
@@ -688,6 +693,8 @@ To manually switch to FIPS-enabled images, set the variable `DS_IMAGE_SUFFIX` to
To ensure compliance with FIPS, the FIPS-enabled image of `gemnasium-maven` uses the OpenJDK packages for RedHat UBI.
As a result, it only supports Java 8, 11, and 17.
+Dependency scanning for Gradle projects and auto-remediation for Yarn projects are not supported in FIPS mode.
+
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
@@ -834,10 +841,16 @@ Here's an example dependency scanning report:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/350509) in GitLab 14.8 in [Beta](../../../policy/alpha-beta-support.md#beta-features).
+NOTE:
+CycloneDX SBOMs are a [Beta](../../../policy/alpha-beta-support.md#beta-features) feature,
+and the reports are subject to change during the beta period. Do not build integrations
+that rely on the format of these SBOMs staying consistent, as the format might change
+before the feature is made generally available.
+
In addition to the [JSON report file](#reports-json-format), the [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium)
Dependency Scanning tool outputs a [CycloneDX](https://cyclonedx.org/) Software Bill of Materials (SBOM) for
each supported lock or build file it detects. These CycloneDX SBOMs are named
-`cyclonedx-<package-type>-<package-manager>.json`, and are saved in the same directory
+`gl-sbom-<package-type>-<package-manager>.cdx.json`, and are saved in the same directory
as the detected lock or build files.
For example, if your project has the following structure:
@@ -860,16 +873,16 @@ Then the Gemnasium scanner generates the following CycloneDX SBOMs:
.
├── ruby-project/
│ ├── Gemfile.lock
-│ └── cyclonedx-gem-bundler.json
+│ └── gl-sbom-gem-bundler.cdx.json
├── ruby-project-2/
│ ├── Gemfile.lock
-│ └── cyclonedx-gem-bundler.json
+│ └── gl-sbom-gem-bundler.cdx.json
├── php-project/
│ ├── composer.lock
-│ └── cyclonedx-packagist-composer.json
+│ └── gl-sbom-packagist-composer.cdx.json
└── go-project/
├── go.sum
- └── cyclonedx-go-go.json
+ └── gl-sbom-go-go.cdx.json
```
The CycloneDX SBOMs can be downloaded [the same way as other job artifacts](../../../ci/pipelines/job_artifacts.md#download-job-artifacts).
@@ -894,10 +907,10 @@ merge cyclonedx sboms:
- wget https://github.com/CycloneDX/cyclonedx-cli/releases/download/v0.22.0/cyclonedx-linux-musl-x64 -O /usr/local/bin/cyclonedx-cli
- chmod 755 /usr/local/bin/cyclonedx-cli
- apk --update add --no-cache icu-dev libstdc++
- - find * -name "cyclonedx-*.json" -exec cyclonedx-cli merge --input-files {} --output-file cyclonedx-all.json +
+ - find * -name "gl-sbom-*.cdx.json" -exec cyclonedx-cli merge --input-files {} --output-file gl-sbom-all.cdx.json +
artifacts:
paths:
- - cyclonedx-all.json
+ - gl-sbom-all.cdx.json
```
GitLab uses [CycloneDX Properties](https://cyclonedx.org/use-cases/#properties--name-value-store)
@@ -905,12 +918,6 @@ to store implementation-specific details in the metadata of each CycloneDX SBOM,
such as the location of build and lock files. If multiple CycloneDX SBOMs are merged together,
this information is removed from the resulting merged file.
-NOTE:
-CycloneDX SBOMs are a [Beta](../../../policy/alpha-beta-support.md#beta-features) feature,
-and the reports are subject to change during the beta period. Do not build integrations
-that rely on the format of these SBOMs staying consistent, as the format might change
-before the feature is made generally available.
-
## Versioning and release process
Please check the [Release Process documentation](https://gitlab.com/gitlab-org/security-products/release/blob/master/docs/release_process.md).
diff --git a/doc/user/application_security/generate_test_vulnerabilities/index.md b/doc/user/application_security/generate_test_vulnerabilities/index.md
new file mode 100644
index 00000000000..aafbebb91cd
--- /dev/null
+++ b/doc/user/application_security/generate_test_vulnerabilities/index.md
@@ -0,0 +1,28 @@
+---
+type: reference, howto
+stage: Secure
+group: Threat Insights
+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
+---
+
+# Generate test vulnerabilities
+
+You can generate test vulnerabilities when you work on the [Vulnerability Report](../vulnerability_report/index.md).
+
+1. Go to `/-/profile/personal_access_tokens` and generate a personal access token with `api` permissions.
+1. Go to your project page and find the project ID. You can find the project ID below the project title.
+1. Open a terminal and go to the `gitlab/qa` directory.
+1. Run the following command:
+
+```shell
+GITLAB_QA_ACCESS_TOKEN=<your_personal_access_token> GITLAB_URL="http://localhost:3000" bundle exec rake vulnerabilities:setup\[<your_project_id>,<vulnerability_count>\] --trace
+```
+
+Make sure you do the following:
+
+- Replace `<your_personal_access_token>` with the token you generated in step one.
+- Double check the `GITLAB_URL`. It should point to the running local instance.
+- Replace `<your_project_id>` with the ID you obtained in step two.
+- Replace `<vulnerability_count>` with the number of vulnerabilities you'd like to generate.
+
+The script creates the specified amount of vulnerabilities in the project.
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index d449fbb9a6c..e3a419ea771 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -114,6 +114,11 @@ While you cannot directly customize Auto DevOps, you can [include the Auto DevOp
To enable all GitLab security scanning tools, with the option of customizing settings, add the
GitLab CI/CD templates to your `.gitlab-ci.yml` file.
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results,
+including a large number of false positives.
+
To enable Static Application Security Testing, Dependency Scanning, License Scanning, and Secret
Detection, add:
@@ -217,9 +222,9 @@ From the merge request security widget, select **Expand** to unfold the widget,
## View security scan information in the pipeline Security tab
-A pipeline's security tab lists all findings in the current branch. It includes new findings introduced by this branch and existing vulnerabilities that were already present when the branch was created. These results likely do not match the findings displayed in the Merge Request security widget as those do not include the existing vulnerabilities (with the exception of showing any existing vulnerabilities that are no longer detected in the feature branch).
-
-For more details, see [security tab](security_dashboard/index.md#view-vulnerabilities-in-a-pipeline).
+A pipeline's security tab lists all findings in the current branch. It includes new findings introduced by this branch
+and existing vulnerabilities already present when you created the branch. These results likely do not match the findings
+displayed in the Merge Request security widget, as those do not include the existing vulnerabilities. Refer to [View vulnerabilities in a pipeline](vulnerability_report/pipeline.md) for more information.
## View security scan information in the Security Dashboard
@@ -247,15 +252,6 @@ security issues:
- A software license compliance violation. For more details, read
[Enabling license approvals within a project](../compliance/license_compliance/index.md#enabling-license-approvals-within-a-project).
-### Migration of existing Vulnerability-Check rules
-
-If your projects have rules that have a security orchestration project, a new MR with
-the existing rule's content is created automatically against the default branch belonging
-to the security orchestration project. To maintain the same security approval rules you
-had before GitLab 15.0, we recommend merging this new MR.
-
-If your projects have rules without a security orchestration project, a new security orchestration project is created automatically with the content of the existing rule. No additional action is required.
-
## Using private Maven repositories
If you have a private Apache Maven repository that requires login credentials,
@@ -393,48 +389,31 @@ Self managed installations can also run the security scanners on a GitLab Runner
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321918) in GitLab 13.11.
> - Schema validation message [added](https://gitlab.com/gitlab-org/gitlab/-/issues/321730) in GitLab 14.0.
-You can enforce validation of the security report artifacts before ingesting the vulnerabilities.
+GitLab 15.0 enforces validation of the security report artifacts before ingesting the vulnerabilities.
This prevents ingestion of broken vulnerability data into the database. GitLab validates the
-artifacts based on the [report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/tree/master/dist).
-When artifact validation is enabled, the pipeline's **Security** tab lists
-any report artifacts that failed validation.
+artifacts against the [report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/tree/master/dist),
+according to the schema version declared in the report.
-Validation depends on the schema:
+The pipeline's **Security** tab lists any report artifacts that failed validation, and the
+validation error message.
-- If your security report does not specify which schema version it uses, GitLab attempts to verify it against the earliest supported schema version for that report type. Validation fails but it's attempted anyway because it may identify other problems present in the report.
-- If your security report uses a version that is not supported, GitLab attempts to validate it against the earliest supported schema version for that report type. Validation fails but will identify the differences between the schema version used and the earliest supported version.
-- If your security report uses a deprecated version, GitLab attempts validation against that version and adds a warning to the validation result.
+Validation depends on the schema version declared in the security report artifact:
-You can always find supported and deprecated schema versions in the [source code](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/parsers/security/validators/schema_validator.rb#L9).
+- If your security report specifies a supported schema version, GitLab uses this version to validate.
+- If your security report uses a deprecated version, GitLab attempts validation against that version and adds a deprecation warning to the validation result.
+- If your security report uses a version that is not supported, GitLab attempts to validate it against the latest schema version available in GitLab.
+- If your security report does not specify a schema version, GitLab attempts to validate it against the lastest schema version available in GitLab. Since the `version` property is required, validation always fails in this case, but other validation errors may also be present.
-### Enable security report validation
+You can always find supported and deprecated schema versions in the [source code](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/parsers/security/validators/schema_validator.rb).
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/354928) in GitLab 14.9, and planned for removal in GitLab 15.0.
+<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
-To enable report artifacts validation, set the `VALIDATE_SCHEMA` environment variable to `"true"`
-for the desired jobs in the `.gitlab-ci.yml` file.
+### Enable security report validation (removed)
-For example, to enable validation for only the `sast` job:
+ This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/354928) in GitLab 14.9
+ and [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85400) in GitLab 15.0.
-```yaml
-include:
- - template: Security/Dependency-Scanning.gitlab-ci.yml
- - template: Security/License-Scanning.gitlab-ci.yml
- - template: Security/SAST.gitlab-ci.yml
- - template: Security/Secret-Detection.gitlab-ci.yml
-stages:
- - security-scan
-dependency_scanning:
- stage: security-scan
-license_scanning:
- stage: security-scan
-sast:
- stage: security-scan
- variables:
- VALIDATE_SCHEMA: "true"
-.secret-analyzer:
- stage: security-scan
-```
+ <!--- end_remove -->
## Interact with findings and vulnerabilities
@@ -488,17 +467,16 @@ GitLab provides two methods of accomplishing this, each with advantages and disa
- [Compliance framework pipelines](../project/settings/#compliance-pipeline-configuration)
are recommended when:
- - Scan execution enforcement is required for SAST or Secret Detection scans that use custom rulesets.
- - Scan execution enforcement is required for SAST IaC, Dependency Scanning,
+ - Scan execution enforcement is required for any scanner that uses a GitLab template, such as SAST IaC, DAST, Dependency Scanning,
License Compliance, API Fuzzing, or Coverage-guided Fuzzing.
- Scan execution enforcement is required for scanners external to GitLab.
- - Enforced execution is required for custom jobs other than security scans.
+ - Scan execution enforcement is required for custom jobs other than security scans.
- [Scan execution policies](policies/scan-execution-policies.md)
are recommended when:
- - Scan execution enforcement is required for DAST.
- - Scan execution enforcement is required for Container Scanning with project-specific variable
+ - Scan execution enforcement is required for DAST which uses a DAST site or scan profile.
+ - Scan execution enforcement is required for SAST, Secret Detection, or Container Scanning with project-specific variable
customizations. To accomplish this, users must create a separate security policy per project.
- Scans are required to run on a regular, scheduled cadence.
@@ -524,6 +502,8 @@ Feedback is welcome on our vision for [unifying the user experience for these tw
## Troubleshooting
+<!-- NOTE: The below subsection(`### Secure job failing with exit code 1`) documentation URL is referred in the [/gitlab-org/security-products/analyzers/command](https://gitlab.com/gitlab-org/security-products/analyzers/command/-/blob/main/command.go#L19) repository. If this section/subsection changes, please ensure to update the corresponding URL in the mentioned repository.
+-->
### Secure job failing with exit code 1
If a Secure job is failing and it's unclear why, add `SECURE_LOG_LEVEL: "debug"` as a global CI/CD variable for
diff --git a/doc/user/application_security/policies/img/policies_list_v15_0.png b/doc/user/application_security/policies/img/policies_list_v15_0.png
deleted file mode 100644
index 4089c311fe4..00000000000
--- a/doc/user/application_security/policies/img/policies_list_v15_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/policies/img/policies_list_v15_1.png b/doc/user/application_security/policies/img/policies_list_v15_1.png
new file mode 100644
index 00000000000..23c79a867ec
--- /dev/null
+++ b/doc/user/application_security/policies/img/policies_list_v15_1.png
Binary files differ
diff --git a/doc/user/application_security/policies/index.md b/doc/user/application_security/policies/index.md
index 27a6f867ae2..81a9cef885d 100644
--- a/doc/user/application_security/policies/index.md
+++ b/doc/user/application_security/policies/index.md
@@ -81,7 +81,7 @@ status), and create and edit deployed policies:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Security & Compliance > Policies**.
-![Policies List Page](img/policies_list_v15_0.png)
+![Policies List Page](img/policies_list_v15_1.png)
## Policy editor
diff --git a/doc/user/application_security/policies/scan-execution-policies.md b/doc/user/application_security/policies/scan-execution-policies.md
index 5beb6912877..eb1f9a7c7b8 100644
--- a/doc/user/application_security/policies/scan-execution-policies.md
+++ b/doc/user/application_security/policies/scan-execution-policies.md
@@ -6,10 +6,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Scan execution policies **(ULTIMATE)**
-Project owners can use scan execution policies to require that security scans run on a specified
-schedule or with the project pipeline. Required scans are injected into the CI pipeline as new jobs
+> Group-level security policies were [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4425) in GitLab 15.2 [with a flag](../../../administration/feature_flags.md) named `group_level_security_policies`. Enabled by default.
+
+Group, sub-group, or project owners can use scan execution policies to require that security scans run on a specified
+schedule or with the project (or multiple projects if the policy is defined at a group or sub-group level) pipeline. Required scans are injected into the CI pipeline as new jobs
with a long, random job name. In the unlikely event of a job name collision, the security policy job overwrites
-any pre-existing job in the pipeline.
+any pre-existing job in the pipeline. If a policy is created at the group-level, it will apply to every child
+project or sub-group. A group-level policy cannot be edited from a child project or sub-group.
This feature has some overlap with [compliance framework pipelines](../../project/settings/#compliance-pipeline-configuration),
as we have not [unified the user experience for these two features](https://gitlab.com/groups/gitlab-org/-/epics/7312).
@@ -25,7 +28,7 @@ an error appears that states `chosen stage does not exist`.
## Scan execution policy editor
NOTE:
-Only project Owners have the [permissions](../../permissions.md#project-members-permissions)
+Only group, sub-group, or project Owners have the [permissions](../../permissions.md#project-members-permissions)
to select Security Policy Project.
Once your policy is complete, save it by selecting **Create via merge request**
@@ -62,7 +65,7 @@ the following sections and tables provide an alternative.
| Field | Type | Possible values | Description |
|-------|------|-----------------|-------------|
-| `name` | `string` | | Name of the policy. |
+| `name` | `string` | | Name of the policy. Maximum of 255 characters.|
| `description` (optional) | `string` | | Description of the policy. |
| `enabled` | `boolean` | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. |
| `rules` | `array` of rules | | List of rules that the policy applies. |
@@ -85,9 +88,8 @@ This rule enforces the defined actions and schedules a scan on the provided date
|------------|------|-----------------|-------------|
| `type` | `string` | `schedule` | The rule's type. |
| `branches` | `array` of `string` | `*` or the branch's name | The branch the given policy applies to (supports wildcard). |
-| `cadence` | `string` | CRON expression (for example, `0 0 * * *`) | A whitespace-separated string containing five fields that represents the scheduled time. |
-| `agents` | `object` | | The name of the [GitLab agents](../../clusters/agent/index.md) where [cluster image scanning](../../clusters/agent/vulnerabilities.md) will run. The key of the object is the name of the Kubernetes cluster configured for your project in GitLab. In the optionally provided value of the object, you can precisely select Kubernetes resources that are scanned. <!--- start_remove The following content will be removed on remove_date: '2022-08-22' --> |
-| `clusters` (removed) | `object` | | This field was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/356465) in 15.0. Use the `agents` field instead. The cluster where the given policy enforces running selected scans (only for `container_scanning`/`cluster_image_scanning` scans). The key of the object is the name of the Kubernetes cluster configured for your project in GitLab. In the optionally provided value of the object, you can precisely select Kubernetes resources that are scanned. <!--- end_remove --> |
+| `cadence` | `string` | CRON expression (for example, `0 0 * * *`) | A whitespace-separated string containing five fields that represents the scheduled time. <!--- start_remove The following content will be removed on remove_date: '2022-08-22' --> |
+| `clusters` (removed) | `object` | | This field was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/356465) in 15.0. The cluster where the given policy enforces running selected scans (only for `container_scanning`/`cluster_image_scanning` scans). The key of the object is the name of the Kubernetes cluster configured for your project in GitLab. In the optionally provided value of the object, you can precisely select Kubernetes resources that are scanned. <!--- end_remove --> |
GitLab supports the following types of CRON syntax for the `cadence` field:
@@ -96,20 +98,11 @@ GitLab supports the following types of CRON syntax for the `cadence` field:
It is possible that other elements of the CRON syntax will work in the cadence field, however, GitLab does not officially test or support them.
-### `agent` schema
-
-Use this schema to define `agents` objects in the [`schedule` rule type](#schedule-rule-type).
-
-| Field | Type | Possible values | Description |
-|--------------|---------------------|--------------------------|-------------|
-| `namespaces` | `array` of `string` | | The namespace that is scanned. If empty, all namespaces will be scanned. |
-
<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
### `cluster` schema (removed)
This schema was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/356465) in 15.0.
-Use the [`agent` schema](#agent-schema) instead.
Use this schema to define `clusters` objects in the [`schedule` rule type](#schedule-rule-type).
@@ -200,24 +193,6 @@ scan_execution_policy:
variables:
SAST_EXCLUDED_ANALYZERS: brakeman
- scan: container_scanning
-- name: Enforce Cluster Image Scanning on production-cluster every 24h
- description: This policy enforces Cluster Image Scanning scan to run every 24 hours
- enabled: true
- rules:
- - type: schedule
- cadence: "15 3 * * *"
- clusters:
- production-cluster:
- containers:
- - database
- resources:
- - production-application
- namespaces:
- - production-namespace
- kinds:
- - deployment
- actions:
- - scan: cluster_image_scanning
```
In this example:
diff --git a/doc/user/application_security/policies/scan-result-policies.md b/doc/user/application_security/policies/scan-result-policies.md
index 3da884aca6a..3eee4957e2f 100644
--- a/doc/user/application_security/policies/scan-result-policies.md
+++ b/doc/user/application_security/policies/scan-result-policies.md
@@ -56,7 +56,7 @@ the following sections and tables provide an alternative.
| Field | Type | Possible values | Description |
|-------|------|-----------------|-------------|
-| `name` | `string` | | Name of the policy. |
+| `name` | `string` | | Name of the policy. Maximum of 255 characters.|
| `description` (optional) | `string` | | Description of the policy. |
| `enabled` | `boolean` | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. |
| `rules` | `array` of rules | | List of rules that the policy applies. |
@@ -69,7 +69,7 @@ This rule enforces the defined actions based on the information provided.
| Field | Type | Possible values | Description |
|------------|------|-----------------|-------------|
| `type` | `string` | `scan_finding` | The rule's type. |
-| `branches` | `array` of `string` | `[]` or the branch's name | Protected branches for this rule to consider. |
+| `branches` | `array` of `string` | `[]` or the branch's name | Applicable only to protected target branches. An empty array, `[]`, applies the rule to all protected target branches. |
| `scanners` | `array` of `string` | `sast`, `secret_detection`, `dependency_scanning`, `container_scanning`, `dast`, `coverage_fuzzing`, `api_fuzzing` | The security scanners for this rule to consider. |
| `vulnerabilities_allowed` | `integer` | Greater than or equal to zero | Number of vulnerabilities allowed before this rule is considered. |
| `severity_levels` | `array` of `string` | `info`, `unknown`, `low`, `medium`, `high`, `critical`| The severity levels for this rule to consider. |
@@ -84,10 +84,10 @@ the defined policy.
|-------|------|-----------------|-------------|
| `type` | `string` | `require_approval` | The action's type. |
| `approvals_required` | `integer` | Greater than or equal to zero | The number of MR approvals required. |
-| `user_approvers` | `array` of `string` | Username of one of more users | The users to consider as approvers. |
-| `user_approvers_ids` | `array` of `integer` | ID of one of more users | The IDs of users to consider as approvers. |
-| `group_approvers` | `array` of `string` | Path of one of more groups | The groups to consider as approvers. |
-| `group_approvers_ids` | `array` of `integer` | ID of one of more groups | The IDs of groups to consider as approvers. |
+| `user_approvers` | `array` of `string` | Username of one of more users | The users to consider as approvers. Users must have access to the project to be eligible to approve. |
+| `user_approvers_ids` | `array` of `integer` | ID of one of more users | The IDs of users to consider as approvers. Users must have access to the project to be eligible to approve. |
+| `group_approvers` | `array` of `string` | Path of one of more groups | The groups to consider as approvers. Users with [direct membership in the group](../../project/merge_requests/approvals/rules.md#group-approvers) are eligible to approve. |
+| `group_approvers_ids` | `array` of `integer` | ID of one of more groups | The IDs of groups to consider as approvers. Users with [direct membership in the group](../../project/merge_requests/approvals/rules.md#group-approvers) are eligible to approve. |
Requirements and limitations:
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index d4dd8059c6a..92dc795afe5 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -74,41 +74,42 @@ GitLab SAST supports a variety of languages, package managers, and frameworks. O
You can also [view our language roadmap](https://about.gitlab.com/direction/secure/static-analysis/sast/#language-support) and [request other language support by opening an issue](https://gitlab.com/groups/gitlab-org/-/epics/297).
-| Language (package managers) / framework | Scan tool | Introduced in GitLab Version |
-|---------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|
-| .NET Core | [Security Code Scan](https://security-code-scan.github.io) | 11.0 |
-| .NET Framework | [Security Code Scan](https://security-code-scan.github.io) | 13.0 |
-| Apex (Salesforce) | [PMD](https://pmd.github.io/pmd/index.html) | 12.1 |
-| C | [Semgrep](https://semgrep.dev) | 14.2 |
-| C/C++ | [Flawfinder](https://github.com/david-a-wheeler/flawfinder) | 10.7 |
-| Elixir (Phoenix) | [Sobelow](https://github.com/nccgroup/sobelow) | 11.1 |
-| Go | [Gosec](https://github.com/securego/gosec) | 10.7 |
-| Go | [Semgrep](https://semgrep.dev) | 14.4 |
-| Groovy ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.3 (Gradle) & 11.9 (Ant, Maven, SBT) |
-| Helm Charts | [Kubesec](https://github.com/controlplaneio/kubesec) | 13.1 |
-| Java (any build system) | [Semgrep](https://semgrep.dev) | 14.10 |
-| Java ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 10.6 (Maven), 10.8 (Gradle) & 11.9 (Ant, SBT) |
-| Java (Android) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
-| JavaScript | [ESLint security plugin](https://github.com/nodesecurity/eslint-plugin-security) | 11.8 |
-| JavaScript | [Semgrep](https://semgrep.dev) | 13.10 |
-| Kotlin (Android) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
-| Kotlin (General) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 13.11 |
-| Kubernetes manifests | [Kubesec](https://github.com/controlplaneio/kubesec) | 12.6 |
-| Node.js | [NodeJsScan](https://github.com/ajinabraham/NodeJsScan) | 11.1 |
-| Objective-C (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
-| PHP | [phpcs-security-audit](https://github.com/FloeDesignTechnologies/phpcs-security-audit) | 10.8 |
-| Python ([pip](https://pip.pypa.io/en/stable/)) | [bandit](https://github.com/PyCQA/bandit) | 10.3 |
-| Python | [Semgrep](https://semgrep.dev) | 13.9 |
-| React | [ESLint react plugin](https://github.com/yannickcr/eslint-plugin-react) | 12.5 |
-| React | [Semgrep](https://semgrep.dev) | 13.10 |
-| Ruby | [brakeman](https://brakemanscanner.org) | 13.9 |
-| Ruby on Rails | [brakeman](https://brakemanscanner.org) | 10.3 |
-| Scala ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.0 (SBT) & 11.9 (Ant, Gradle, Maven) |
-| Swift (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
-| TypeScript | [ESLint security plugin](https://github.com/nodesecurity/eslint-plugin-security) | 11.9, [merged](https://gitlab.com/gitlab-org/gitlab/-/issues/36059) with ESLint in 13.2 |
-| TypeScript | [Semgrep](https://semgrep.dev) | 13.10 |
-
-Note that the Java analyzers can also be used for variants like the
+| Language (package managers) / framework | Scan tool | Introduced in GitLab Version |
+|------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|
+| .NET Core | [Security Code Scan](https://security-code-scan.github.io) | 11.0 |
+| .NET Framework<sup>1</sup> | [Security Code Scan](https://security-code-scan.github.io) | 13.0 |
+| Apex (Salesforce) | [PMD](https://pmd.github.io/pmd/index.html) | 12.1 |
+| C | [Semgrep](https://semgrep.dev) | 14.2 |
+| C/C++ | [Flawfinder](https://github.com/david-a-wheeler/flawfinder) | 10.7 |
+| Elixir (Phoenix) | [Sobelow](https://github.com/nccgroup/sobelow) | 11.1 |
+| Go | [Gosec](https://github.com/securego/gosec) | 10.7 |
+| Go | [Semgrep](https://semgrep.dev) | 14.4 |
+| Groovy<sup>2</sup> | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.3 (Gradle) & 11.9 (Ant, Maven, SBT) |
+| Helm Charts | [Kubesec](https://github.com/controlplaneio/kubesec) | 13.1 |
+| Java (any build system) | [Semgrep](https://semgrep.dev) | 14.10 |
+| Java<sup>2</sup> | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 10.6 (Maven), 10.8 (Gradle) & 11.9 (Ant, SBT) |
+| Java (Android) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
+| JavaScript | [ESLint security plugin](https://github.com/nodesecurity/eslint-plugin-security) | 11.8 |
+| JavaScript | [Semgrep](https://semgrep.dev) | 13.10 |
+| Kotlin (Android) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
+| Kotlin (General)<sup>2</sup> | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 13.11 |
+| Kubernetes manifests | [Kubesec](https://github.com/controlplaneio/kubesec) | 12.6 |
+| Node.js | [NodeJsScan](https://github.com/ajinabraham/NodeJsScan) | 11.1 |
+| Objective-C (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
+| PHP | [phpcs-security-audit](https://github.com/FloeDesignTechnologies/phpcs-security-audit) | 10.8 |
+| Python ([pip](https://pip.pypa.io/en/stable/)) | [bandit](https://github.com/PyCQA/bandit) | 10.3 |
+| Python | [Semgrep](https://semgrep.dev) | 13.9 |
+| React | [ESLint react plugin](https://github.com/yannickcr/eslint-plugin-react) | 12.5 |
+| React | [Semgrep](https://semgrep.dev) | 13.10 |
+| Ruby | [brakeman](https://brakemanscanner.org) | 13.9 |
+| Ruby on Rails | [brakeman](https://brakemanscanner.org) | 10.3 |
+| Scala<sup>2</sup> | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.0 (SBT) & 11.9 (Ant, Gradle, Maven) |
+| Swift (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
+| TypeScript | [ESLint security plugin](https://github.com/nodesecurity/eslint-plugin-security) | 11.9, [merged](https://gitlab.com/gitlab-org/gitlab/-/issues/36059) with ESLint in 13.2 |
+| TypeScript | [Semgrep](https://semgrep.dev) | 13.10 |
+
+1. .NET 4 support is limited. The analyzer runs in a Linux container and does not have access to Windows-specific libraries or features. We currently plan to [migrate C# coverage to Semgrep-based scanning](https://gitlab.com/gitlab-org/gitlab/-/issues/347258) to make it easier to scan C# projects.
+1. The SpotBugs-based analyzer supports [Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/). It can also be used with variants like the
[Gradle wrapper](https://docs.gradle.org/current/userguide/gradle_wrapper.html),
[Grails](https://grails.org/),
and the [Maven wrapper](https://github.com/takari/maven-wrapper).
@@ -146,8 +147,8 @@ The default scanner images are build off a base Alpine image for size and mainta
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6479) in GitLab 14.10.
-GitLab offers [Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
-versions of the images that are FIPS-enabled. To use the FIPS-enabled images, you can either:
+GitLab offers an image version, based on the [Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image) base image,
+that uses a FIPS 140-validated cryptographic module. To use the FIPS-enabled image, you can either:
- Set the `SAST_IMAGE_SUFFIX` to `-fips`.
- Add the `-fips` extension to the default image name.
@@ -162,6 +163,10 @@ include:
- template: Security/SAST.gitlab-ci.yml
```
+A FIPS-compliant image is only available for the Semgrep-based analyzer.
+
+To use SAST in a FIPS-compliant manner, you must [exclude other analyzers from running](analyzers.md#customize-analyzers).
+
### Making SAST analyzers available to all GitLab tiers
All open source (OSS) analyzers have been moved to the GitLab Free tier as of GitLab 13.3.
@@ -836,6 +841,11 @@ spotbugs-sast:
SAST can be configured using the [`variables`](../../../ci/yaml/index.md#variables) parameter in
`.gitlab-ci.yml`.
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results,
+including a large number of false positives.
+
The following example includes the SAST template to override the `SAST_GOSEC_LEVEL`
variable to `2`. The template is [evaluated before](../../../ci/yaml/index.md#include) the pipeline
configuration, so the last mention of the variable takes precedence.
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index 9805fb3b67c..02d50b0a857 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -157,6 +157,11 @@ The Secret Detection scan settings can be changed through [CI/CD variables](#ava
by using the
[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
+WARNING:
+All customization of GitLab security scanning tools should be tested in a merge request before
+merging these changes to the default branch. Failure to do so can give unexpected results,
+including a large number of false positives.
+
To override a job definition, (for example, change properties like `variables` or `dependencies`),
declare a job with the same name as the secret detection job to override. Place this new job after the template
inclusion and specify any additional keys under it.
diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md
index 3cb4bd4a02d..f3c834e06c7 100644
--- a/doc/user/application_security/security_dashboard/index.md
+++ b/doc/user/application_security/security_dashboard/index.md
@@ -42,57 +42,6 @@ To reduce false negatives in [dependency scans](../../../user/application_securi
- Python projects can have lock files, but GitLab Secure tools don't support them.
- Configure your project for [Continuous Delivery](../../../ci/introduction/index.md).
-## View vulnerabilities in a pipeline
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13496) in GitLab 12.3.
-
-To view vulnerabilities in a pipeline:
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **CI/CD > Pipelines**.
-1. From the list, select the pipeline you want to check for vulnerabilities.
-1. Select the **Security** tab.
-
-**Scan details** shows vulnerabilities introduced by the merge request, in addition to existing vulnerabilities
-from the latest successful pipeline in your project's default branch.
-
-A pipeline consists of multiple jobs, such as SAST and DAST scans. If a job fails to finish,
-the security dashboard doesn't show SAST scanner output. For example, if the SAST
-job finishes but the DAST job fails, the security dashboard doesn't show SAST results. On failure,
-the analyzer outputs an [exit code](../../../development/integrations/secure.md#exit-code).
-
-## View total number of vulnerabilities per scan
-
-To view the total number of vulnerabilities per scan:
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **CI/CD > Pipelines**.
-1. Select the **Status** of a branch.
-1. Select the **Security** tab.
-
-**Scan details** shows vulnerabilities introduced by the merge request, in addition to existing vulnerabilities
-from the latest successful pipeline in your project's default branch.
-
-### Download security scan outputs
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3728) in GitLab 13.10.
-> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/333660) in GitLab 14.2.
-
-Depending on the type of security scanner, you can download:
-
-- A JSON artifact that contains the security scanner [report](../../../development/integrations/secure.md#report).
-- A CSV file that contains URLs and endpoints scanned by the security scanner.
-
-To download a security scan output:
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **CI/CD > Pipelines**.
-1. Select the **Status** of a branch.
-1. Select the **Security** tab.
-1. In **Scan details**, select **Download results**:
- - To download a JSON file, select the JSON artifact.
- - To download a CSV file, select **Download scanned resources**.
-
## View vulnerabilities over time for a project
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235558) in GitLab 13.6.
diff --git a/doc/user/application_security/terminology/index.md b/doc/user/application_security/terminology/index.md
index 392bfa1dde2..d50cce3b4e8 100644
--- a/doc/user/application_security/terminology/index.md
+++ b/doc/user/application_security/terminology/index.md
@@ -220,11 +220,12 @@ once it's imported into the database.
The type of scan. This must be one of the following:
+- `cluster_image_scanning`
- `container_scanning`
-- `dependency_scanning`
- `dast`
+- `dependency_scanning`
- `sast`
-- `cluster_image_scanning`
+- `secret_detection`
### Scanner
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index f5b1192269d..f0ac01000ef 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -153,7 +153,7 @@ The following scanners are supported by this feature:
- [Dependency Scanning](../dependency_scanning/index.md).
Automatic Patch creation is only available for Node.js projects managed with
- `yarn`.
+ `yarn` when [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode) is disabled.
- [Container Scanning](../container_scanning/index.md).
To resolve a vulnerability, you can either:
@@ -206,7 +206,12 @@ To enable security training for vulnerabilities in your project:
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6176) in GitLab 14.9.
-If security training is enabled, the vulnerability page includes a training link relevant to the detected vulnerability.
+The vulnerability page may include a training link relevant to the detected vulnerability if security training is enabled.
+The availability of training depends on whether the enabled training vendor has content matching the particular vulnerability.
+Training content is requested based on the [vulnerability identifiers](../../../development/integrations/secure.md#identifiers).
+The identifier given to a vulnerability will vary from one vulnerability to the next. The available training
+content varies between vendors. This means some vulnerabilities will display no training content.
+Vulnerabilities with a CWE are most likely to return a training result.
To view the security training for a vulnerability:
diff --git a/doc/user/application_security/vulnerability_report/pipeline.md b/doc/user/application_security/vulnerability_report/pipeline.md
new file mode 100644
index 00000000000..14c13f74a5e
--- /dev/null
+++ b/doc/user/application_security/vulnerability_report/pipeline.md
@@ -0,0 +1,141 @@
+---
+type: reference, howto
+stage: Secure
+group: Threat Insights
+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
+---
+
+# View vulnerabilities in a pipeline
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13496) in GitLab 12.3.
+
+To view vulnerabilities in a pipeline:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **CI/CD > Pipelines**.
+1. From the list, select the pipeline you want to check for vulnerabilities.
+1. Select the **Security** tab.
+
+A pipeline consists of multiple jobs, which may include security scans. When a job declares and produces security scan
+reports using [`artifacts:reports`](../../../ci/yaml/artifacts_reports.md), GitLab parses and ingests the contents of
+these reports to create vulnerabilities associated with the project the pipeline belongs to.
+
+If a job fails to finish, the pipeline vulnerability report doesn't show vulnerability findings detected by this job.
+For example, if a pipeline contains DAST and SAST jobs, but the DAST job fails by returning a non-zero
+[exit code](../../../development/integrations/secure.md#exit-code), the report doesn't show DAST results.
+
+The pipeline vulnerability report only shows results contained in the security report artifacts. This report differs from
+the [Vulnerability Report](index.md), which contains cumulative results of all successful jobs, and from the merge request
+[security widget](../#view-security-scan-information-in-merge-requests), which combines the branch results with
+cumulative results.
+
+Before GitLab displays results, the vulnerability findings in all pipeline reports are [deduplicated](#deduplication-process).
+
+## Scan details
+
+**Scan details** shows a summary of vulnerability findings in the pipeline and the source reports.
+
+GitLab displays one row of information for each [scan type](../terminology/#scan-type-report-type) artifact present in
+the pipeline.
+
+Note that each scan type's total number of vulnerabilities includes dismissed findings. If the number of findings
+in the report doesn't match the number in **Scan details**, ensure that **Hide dismissed** is disabled.
+
+### Download security scan outputs
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3728) in GitLab 13.10.
+> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/333660) in GitLab 14.2.
+
+Depending on the type of security scanner, you can download:
+
+- A JSON artifact that contains the security scanner [report](../../../development/integrations/secure.md#report).
+- A CSV file that contains URLs and endpoints scanned by the security scanner.
+
+To download a security scan output:
+
+1. In **Scan details**, select **Download results**:
+ - To download a JSON file, select the JSON artifact.
+ - To download a CSV file, select **Download scanned resources**.
+
+## Scan results
+
+This shows a list of the combined results for all security report artifacts. The filters work like the
+[Vulnerability Report filters](index.md#vulnerability-report-filters), but they are limited to **Severity** and **Tool**, with
+the addition of a **Hide dismissed** toggle.
+
+When you review the vulnerability findings reported in the pipeline, you can select one or more entries for dismissal,
+similar to [Dismissing a vulnerability](index.md#dismissing-a-vulnerability) in the Vulnerability Report.
+
+When you merge the branch corresponding to the pipeline into the default branch, all reported findings are combined into
+the [Vulnerability Report](index.md). Scan results in pipelines executed on the default branch are
+incorporated once the pipeline finishes.
+
+| Existing vulnerability status | Dismissed in pipeline? | New vulnerability status |
+|:------------------------------|:-----------------------|:-------------------------|
+| any | Yes | Dismissed |
+| Dismissed | any | Dismissed |
+| Confirmed | No | Confirmed |
+| Needs triage (Detected) | No | Needs triage (Detected) |
+| Resolved | No | Needs triage (Detected) |
+| N/A (i.e.: new vulnerability) | No | Needs triage (Detected) |
+
+## Deduplication process
+
+When a pipeline contains jobs that produce multiple security reports of the same type, it is possible that the same
+vulnerability finding is present in multiple reports. This duplication is common when different scanners are used to
+increase coverage. The deduplication process allows you to maximize the vulnerability scanning coverage while reducing
+the number of findings you need to manage.
+
+A finding is considered a duplicate of another finding when their [scan type](../terminology/#scan-type-report-type),
+[location](../terminology/#location-fingerprint) and
+[identifiers](../../../development/integrations/secure.md#identifiers) are the same.
+
+The scan type must match because each can have its own definition for the location of a vulnerability. For example,
+static analyzers are able to locate a file path and line number, whereas a container scanning analyzer uses the image
+name instead.
+
+When comparing identifiers, GitLab does not compare `CWE` and `WASC` during deduplication because they are
+"type identifiers" and are used to classify groups of vulnerabilities. Including these identifiers results in
+many findings being incorrectly considered duplicates.
+
+In a set of duplicated findings, the first occurrence of a finding is kept and the remaining are skipped. Security
+reports are processed in alphabetical file path order, and findings are processed sequentially in the order they
+appear in a report.
+
+### Deduplication examples
+
+- Example 1: matching identifiers and location, mismatching scan type.
+ - Finding
+ - Scan type: `sast`
+ - Location fingerprint: `adc83b19e793491b1c6ea0fd8b46cd9f32e592fc`
+ - Identifiers: CVE-2022-25510
+ - Other Finding
+ - Scan type: `secret_detection`
+ - Location fingerprint: `adc83b19e793491b1c6ea0fd8b46cd9f32e592fc`
+ - Identifiers: CVE-2022-25510
+ - Deduplication result: not duplicates because the scan type is different.
+- Example 2: matching location and scan type, mismatching type identifiers.
+ - Finding
+ - Scan type: `sast`
+ - Location fingerprint: `adc83b19e793491b1c6ea0fd8b46cd9f32e592fc`
+ - Identifiers: CWE-259
+ - Other Finding
+ - Scan type: `sast`
+ - Location fingerprint: `adc83b19e793491b1c6ea0fd8b46cd9f32e592fc`
+ - Identifiers: CWE-798
+ - Deduplication result: duplicates because `CWE` identifiers are ignored.
+- Example 3: matching scan type, location and identifiers.
+ - Finding
+ - Scan type: `container_scanning`
+ - Location fingerprint: `adc83b19e793491b1c6ea0fd8b46cd9f32e592fc`
+ - Identifiers: CVE-2022-25510, CWE-259
+ - Other Finding
+ - Scan type: `container_scanning`
+ - Location fingerprint: `adc83b19e793491b1c6ea0fd8b46cd9f32e592fc`
+ - Identifiers: CVE-2022-25510, CWE-798
+ - Deduplication result: duplicates because all criteria match, and type identifiers are ignored.
+
+The examples above don't include the raw location values. Each scan type defines its own
+`fingerprint_data`, which is used to generate a `SHA1` hash that is used as the `location_fingerprint`.
+You can find definitions for each scan type [`gitlab/lib/gitlab/ci/reports/security/locations`](https://gitlab.com/gitlab-org/gitlab/-/tree/01c69e97340b7c1c7e30c0caec8506910b6503c8/lib/gitlab/ci/reports/security/locations)
+and [`gitlab/ee/lib/gitlab/ci/reports/security/locations`](https://gitlab.com/gitlab-org/gitlab/-/tree/01c69e97340b7c1c7e30c0caec8506910b6503c8/ee/lib/gitlab/ci/reports/security/locations).
diff --git a/doc/user/clusters/agent/ci_cd_workflow.md b/doc/user/clusters/agent/ci_cd_workflow.md
index c04c5a1f7ec..dce02a72300 100644
--- a/doc/user/clusters/agent/ci_cd_workflow.md
+++ b/doc/user/clusters/agent/ci_cd_workflow.md
@@ -42,17 +42,19 @@ If you have multiple GitLab projects that contain Kubernetes manifests:
1. [Install the GitLab agent](install/index.md) in its own project, or in one of the
GitLab projects where you keep Kubernetes manifests.
1. [Authorize the agent](#authorize-the-agent) to access your GitLab projects.
-1. Optional. For added security, [use impersonation](#use-impersonation-to-restrict-project-and-group-access).
+1. Optional. For added security, [use impersonation](#restrict-project-and-group-access-by-using-impersonation).
1. [Update your `.gitlab-ci.yml` file](#update-your-gitlab-ciyml-file-to-run-kubectl-commands) to
select the agent's Kubernetes context and run the Kubernetes API commands.
1. Run your pipeline to deploy to or update the cluster.
## Authorize the agent
-You must authorize the agent to access the project where you keep your Kubernetes manifests.
+If you have multiple GitLab projects, you must authorize the agent to access the project where you keep your Kubernetes manifests.
You can authorize the agent to access individual projects, or authorize a group or subgroup,
so all projects within have access. For added security, you can also
-[use impersonation](#use-impersonation-to-restrict-project-and-group-access).
+[use impersonation](#restrict-project-and-group-access-by-using-impersonation).
+
+Authorization configuration can take one or two minutes to propagate.
### Authorize the agent to access your projects
@@ -60,7 +62,7 @@ so all projects within have access. For added security, you can also
To authorize the agent to access the GitLab project where you keep Kubernetes manifests:
-1. On the top bar, select **Menu > Projects** and find the project that contains the agent configuration file (`config.yaml`).
+1. On the top bar, select **Menu > Projects** and find the project that contains the [agent configuration file](install/index.md#create-an-agent-configuration-file) (`config.yaml`).
1. Edit the `config.yaml` file. Under the `ci_access` keyword, add the `projects` attribute.
1. For the `id`, add the path:
@@ -83,7 +85,7 @@ Choose the context to run `kubectl` commands from your CI/CD scripts.
To authorize the agent to access all of the GitLab projects in a group or subgroup:
-1. On the top bar, select **Menu > Projects** and find the project that contains the agent configuration file (`config.yaml`).
+1. On the top bar, select **Menu > Projects** and find the project that contains the [agent configuration file](install/index.md#create-an-agent-configuration-file) (`config.yaml`).
1. Edit the `config.yaml` file. Under the `ci_access` keyword, add the `groups` attribute.
1. For the `id`, add the path:
@@ -154,7 +156,7 @@ deploy:
# ... rest of your job configuration
```
-## Use impersonation to restrict project and group access **(PREMIUM)**
+## Restrict project and group access by using impersonation **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345014) in GitLab 14.5.
@@ -170,6 +172,8 @@ You can impersonate:
- The CI/CD job that accesses the cluster.
- A specific user or system account defined within the cluster.
+Authorization configuration can take one or two minutes to propagate.
+
### Impersonate the agent
The agent is impersonated by default. You don't need to do anything to impersonate it.
@@ -220,6 +224,24 @@ ci_access:
ci_job: {}
```
+#### Example RBAC to restrict CI/CD jobs
+
+The following `RoleBinding` resource restricts all CI/CD jobs to view rights only.
+
+```yaml
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ name: ci-job-view
+roleRef:
+ name: view
+ kind: ClusterRole
+ apiGroup: rbac.authorization.k8s.io
+subjects:
+ - name: gitlab:ci_job
+ kind: Group
+```
+
### Impersonate a static identity
For a given connection, you can use a static identity for the impersonation.
diff --git a/doc/user/clusters/agent/gitops.md b/doc/user/clusters/agent/gitops.md
index 64eae308bec..73a35ffbc64 100644
--- a/doc/user/clusters/agent/gitops.md
+++ b/doc/user/clusters/agent/gitops.md
@@ -57,7 +57,7 @@ Any time you commit updates to your Kubernetes manifests, the agent updates the
## GitOps configuration reference
-The following snippet shows an example of the possible keys and values for the GitOps section of an agent configuration file.
+The following snippet shows an example of the possible keys and values for the GitOps section of an [agent configuration file](install/index.md#create-an-agent-configuration-file) (`config.yaml`).
```yaml
gitops:
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index 5a69da28632..0d2b68e154d 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -43,21 +43,17 @@ This workflow is considered push-based, because GitLab is pushing requests from
GitLab supports the following Kubernetes versions. You can upgrade your
Kubernetes version to a supported version at any time:
-- 1.22 (support ends on March 22, 2023)
-- 1.21 (support ends on November 22, 2022)
-- 1.20 (support ends on July 22, 2022)
+- 1.24 (support ends on September 22, 2023 or when 1.27 becomes supported)
+- 1.23 (support ends on February 22, 2023 or when 1.26 becomes supported)
+- 1.22 (support ends on October 22, 2022)
+- 1.21 (support ends on August 22, 2022)
-GitLab supports at least two production-ready Kubernetes minor
-versions at any given time. GitLab regularly reviews the supported versions and
-provides a three-month deprecation period before removing support for a specific
-version. The list of supported versions is based on:
+GitLab aims to support a new minor Kubernetes version three months after its initial release. GitLab supports at least three production-ready Kubernetes minor
+versions at any given time.
-- The versions supported by major managed Kubernetes providers.
-- The versions [supported by the Kubernetes community](https://kubernetes.io/releases/version-skew-policy/#supported-versions).
+Support for deprecated APIs can be removed from the GitLab codebase when we drop support for the Kubernetes version that only supports the deprecated API.
-[This epic](https://gitlab.com/groups/gitlab-org/-/epics/4827) tracks support for other Kubernetes versions.
-
-Some GitLab features might work on versions not listed here.
+Some GitLab features might work on versions not listed here. [This epic](https://gitlab.com/groups/gitlab-org/-/epics/4827) tracks support for Kubernetes versions.
## Migrate to the agent from the legacy certificate-based integration
diff --git a/doc/user/clusters/agent/install/index.md b/doc/user/clusters/agent/install/index.md
index 6c839f5ffc6..9282ac7fb40 100644
--- a/doc/user/clusters/agent/install/index.md
+++ b/doc/user/clusters/agent/install/index.md
@@ -89,8 +89,12 @@ You must register an agent before you can install the agent in your cluster. To
- If you want to create a configuration with CI/CD defaults, type a name.
- If you already have an [agent configuration file](#create-an-agent-configuration-file), select it from the list.
1. Select **Register an agent**.
-1. GitLab generates an access token for the agent. Securely store this token. You need it to install the agent
+1. GitLab generates an access token for the agent. You need this token to install the agent
in your cluster and to [update the agent](#update-the-agent-version) to another version.
+
+ WARNING:
+ Securely store the agent access token. A bad actor can use this token to access source code in the agent's configuration project, access source code in any public project on the GitLab instance, or even, under very specific conditions, obtain a Kubernetes manifest.
+
1. Copy the command under **Recommended installation method**. You need it when you use
the one-liner installation method to install the agent in your cluster.
@@ -154,8 +158,9 @@ GitLab also provides a [KPT package for the agent](https://gitlab.com/gitlab-org
To configure your agent, add content to the `config.yaml` file:
-- [View the configuration reference](../gitops.md#gitops-configuration-reference) for a GitOps workflow.
-- [View the configuration reference](../ci_cd_workflow.md) for a GitLab CI/CD workflow.
+- For a GitOps workflow, [view the configuration reference](../gitops.md#gitops-configuration-reference).
+- For a GitLab CI/CD workflow, [authorize the agent to access your projects](../ci_cd_workflow.md#authorize-the-agent). Then
+ [add `kubectl` commands to your `.gitlab-ci.yml` file](../ci_cd_workflow.md#update-your-gitlab-ciyml-file-to-run-kubectl-commands).
## Install multiple agents in your cluster
diff --git a/doc/user/clusters/agent/troubleshooting.md b/doc/user/clusters/agent/troubleshooting.md
index 0932e9179f9..0596755ec74 100644
--- a/doc/user/clusters/agent/troubleshooting.md
+++ b/doc/user/clusters/agent/troubleshooting.md
@@ -186,3 +186,25 @@ Alternatively, you can mount the certificate file at a different location and sp
This error occurs when the project where you keep your manifests is not public. To fix it, make sure your project is public or your manifest files
are stored in the repository where the agent is configured.
+
+## Failed to perform vulnerability scan on workload: jobs.batch already exists
+
+```json
+{
+ "level": "error",
+ "time": "2022-06-22T21:03:04.769Z",
+ "msg": "Failed to perform vulnerability scan on workload",
+ "mod_name": "starboard_vulnerability",
+ "error": "running scan job: creating job: jobs.batch \"scan-vulnerabilityreport-b8d497769\" already exists"
+}
+```
+
+The GitLab agent performs vulnerability scans by creating a job to scan each workload. If a scan
+is interrupted, these jobs may be left behind and will need to be cleaned up before more jobs can
+be run. You can clean up these jobs by running:
+
+```shell
+kubectl delete jobs -l app.kubernetes.io/managed-by=starboard -n gitlab-agent
+```
+
+[We're working on making the cleanup of these jobs more robust.](https://gitlab.com/gitlab-org/gitlab/-/issues/362016)
diff --git a/doc/user/clusters/agent/vulnerabilities.md b/doc/user/clusters/agent/vulnerabilities.md
index 706ed122f7b..3b80a7a0f81 100644
--- a/doc/user/clusters/agent/vulnerabilities.md
+++ b/doc/user/clusters/agent/vulnerabilities.md
@@ -11,26 +11,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
To view cluster vulnerabilities, you can view the [vulnerability report](../../application_security/vulnerabilities/index.md).
You can also configure your agent so the vulnerabilities are displayed with other agent information in GitLab.
-## View cluster vulnerabilities
-
-Prerequisite:
-
-- You must have at least the Developer role.
-
-To view vulnerability information in GitLab:
-
-1. On the top bar, select **Menu > Projects** and find the project that contains the agent configuration file.
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
-1. Select the **Agent** tab.
-1. Select the agent you want to see the vulnerabilities for.
-
-![Cluster agent security tab UI](../img/cluster_agent_security_tab_v14_8.png)
-
-This information can also be found under [operational vulnerabilities](../../../user/application_security/vulnerability_report/index.md#operational-vulnerabilities).
-
-## Enable cluster vulnerability scanning **(ULTIMATE)**
+## Enable operational container scanning **(ULTIMATE)**
-You can use [cluster image scanning](../../application_security/cluster_image_scanning/index.md)
+You can use operational container scanning
to scan container images in your cluster for security vulnerabilities.
To begin scanning all resources in your cluster, add a `starboard`
@@ -49,7 +32,7 @@ The `cadence` field is required. GitLab supports the following types of CRON syn
It is possible that other elements of the CRON syntax will work in the cadence field, however, GitLab does not officially test or support them.
-By default, cluster image scanning will attempt to scan the workloads in all
+By default, operational container scanning will attempt to scan the workloads in all
namespaces for vulnerabilities. The `vulnerability_report` block has a `namespaces`
field which can be used to restrict which namespaces are scanned. For example,
if you would like to scan only the `development`, `staging`, and `production`
@@ -64,3 +47,20 @@ starboard:
- staging
- production
```
+
+## View cluster vulnerabilities
+
+Prerequisite:
+
+- You must have at least the Developer role.
+
+To view vulnerability information in GitLab:
+
+1. On the top bar, select **Menu > Projects** and find the project that contains the agent configuration file.
+1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. Select the **Agent** tab.
+1. Select an agent to view the cluster vulnerabilities.
+
+![Cluster agent security tab UI](../img/cluster_agent_security_tab_v14_8.png)
+
+This information can also be found under [operational vulnerabilities](../../../user/application_security/vulnerability_report/index.md#operational-vulnerabilities).
diff --git a/doc/user/clusters/agent/work_with_agent.md b/doc/user/clusters/agent/work_with_agent.md
index 8872ecf7ce5..058243ec218 100644
--- a/doc/user/clusters/agent/work_with_agent.md
+++ b/doc/user/clusters/agent/work_with_agent.md
@@ -53,24 +53,40 @@ View and provide feedback about the UI in [this epic](https://gitlab.com/groups/
## Debug the agent
+> The `grpc_level` was [introduced](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/merge_requests/669) in GitLab 15.1.
+
To debug the cluster-side component (`agentk`) of the agent, set the log
level according to the available options:
-- `off`
-- `warning`
- `error`
+- `warning`
- `info`
- `debug`
-The log level defaults to `info`. You can change it by using a top-level `observability`
-section in the configuration file, for example:
+The agent has two loggers:
+
+- A general purpose logger, which defaults to `info`.
+- A gRPC logger, which defaults to `error`.
+
+One can change their log levels by using a top-level `observability` section in the [agent configuration file](install/index.md#configure-your-agent), for example setting the levels to `debug` and `warning`:
```yaml
observability:
logging:
level: debug
+ grpc_level: warning
```
+When `grpc_level` is set to `info` or below, there will be a lot of gRPC logs.
+
+Commit the configuration changes and inspect the agent service logs:
+
+```shell
+kubectl logs -f -l=app=gitlab-agent -n gitlab-agent
+```
+
+For more information about debugging, see [troubleshooting documentation](troubleshooting.md).
+
## Reset the agent token
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327152) in GitLab 14.9.
diff --git a/doc/user/clusters/integrations.md b/doc/user/clusters/integrations.md
index 94fb443e0fb..c7597896575 100644
--- a/doc/user/clusters/integrations.md
+++ b/doc/user/clusters/integrations.md
@@ -28,13 +28,11 @@ You can install your applications manually as shown in the following sections, o
installation.
Although, the [Cluster management project template](management_project_template.md) still
-requires that you manually do the last steps of these sections,
-[Enable Prometheus integration for your cluster](#enable-prometheus-integration-for-your-cluster)
-or [Enable Elastic Stack integration for your cluster](#enable-elastic-stack-integration-for-your-cluster)
-depending on which application you are installing. [An issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/326565)
+requires that you manually do the last steps of this section,
+[Enable Prometheus integration for your cluster](#enable-prometheus-integration-for-your-cluster). [An issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/326565)
to automate this step.
-Prometheus and Elastic Stack cluster integrations can only be enabled for clusters [connected through cluster certificates](../project/clusters/add_existing_cluster.md).
+Prometheus cluster integrations can only be enabled for clusters [connected through cluster certificates](../project/clusters/add_existing_cluster.md).
To enable Prometheus for your cluster connected through the [GitLab agent](agent/index.md), you can [integrate it manually](../project/integrations/prometheus.md#manual-configuration-of-prometheus).
@@ -100,70 +98,3 @@ To enable the Prometheus integration for your cluster:
1. Check the **Enable Prometheus integration** checkbox.
1. Select **Save changes**.
1. Go to the **Health** tab to see your cluster's metrics.
-
-## Elastic Stack cluster integration **(FREE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61077) in GitLab 13.12.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485) in GitLab 14.7.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/360182) behind a [feature flag](../../administration/feature_flags.md) named `monitor_logging` in GitLab 15.0. Disabled by default.
-
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485)
-in GitLab 14.7.
-It will be removed completely in GitLab 15.2.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `monitor_logging`.
-On GitLab.com, this feature is not available.
-This feature is not recommended for production use.
-
-You can integrate your cluster with [Elastic
-Stack](https://www.elastic.co/elastic-stack/) to index and [query your pod
-logs](../project/clusters/kubernetes_pod_logs.md).
-
-### Elastic Stack Prerequisites
-
-To use this integration:
-
-1. Elasticsearch 7.x or must be installed in your cluster in the
- `gitlab-managed-apps` namespace.
-1. The `Service` resource must be called `elastic-stack-elasticsearch-master`
- and expose the Elasticsearch API on port `9200`.
-1. The logs are expected to be [Filebeat container logs](https://www.elastic.co/guide/en/beats/filebeat/7.16/filebeat-input-container.html)
- following the [7.x log structure](https://www.elastic.co/guide/en/beats/filebeat/7.16/exported-fields-log.html)
- and include [Kubernetes metadata](https://www.elastic.co/guide/en/beats/filebeat/7.16/add-kubernetes-metadata.html).
-
-You can manage your Elastic Stack however you like, but as an example, you can
-use [this Elastic Stack chart](https://gitlab.com/gitlab-org/charts/elastic-stack) to get up and
-running:
-
-```shell
-# Create the required Kubernetes namespace
-kubectl create namespace gitlab-managed-apps
-
-# Download Helm chart values that is compatible with the requirements above.
-# These are included in the Cluster Management project template.
-wget https://gitlab.com/gitlab-org/project-templates/cluster-management/-/raw/master/applications/elastic-stack/values.yaml
-
-# Add the GitLab Helm chart repository
-helm repo add gitlab https://charts.gitlab.io
-
-# Install Elastic Stack
-helm install elastic-stack gitlab/elastic-stack -n gitlab-managed-apps --values values.yaml
-```
-
-### Enable Elastic Stack integration for your cluster
-
-To enable the Elastic Stack integration for your cluster:
-
-1. Go to the cluster's page:
- - For a [project-level cluster](../project/clusters/index.md), navigate to your project's
- **Infrastructure > Kubernetes clusters**.
- - For a [group-level cluster](../group/clusters/index.md), navigate to your group's
- **Kubernetes** page.
- - 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 Elastic Stack integration** checkbox.
-1. Select **Save changes**.
-1. Go to the **Health** tab to see your cluster's metrics.
diff --git a/doc/user/compliance/compliance_report/index.md b/doc/user/compliance/compliance_report/index.md
index 0006ae02752..f547e5f146f 100644
--- a/doc/user/compliance/compliance_report/index.md
+++ b/doc/user/compliance/compliance_report/index.md
@@ -96,7 +96,7 @@ Our criteria for the separation of duties is as follows:
The Chain of Custody report allows customers to export a list of merge commits within the group.
The data provides a comprehensive view with respect to merge commits. It includes the merge commit SHA,
-merge request author, merge request ID, merge user, pipeline ID, group name, project name, and merge request approvers.
+merge request author, merge request ID, merge user, date merged, pipeline ID, group name, project name, and merge request approvers.
Depending on the merge strategy, the merge commit SHA can be a merge commit, squash commit, or a diff head commit.
To download the Chain of Custody report:
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index 659c0326728..8c57220068b 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -35,8 +35,7 @@ compliance report is shown properly.
The results are saved as a
[License Compliance report artifact](../../../ci/yaml/artifacts_reports.md#artifactsreportslicense_scanning)
-that you can later download and analyze. Due to implementation limitations, we
-always take the latest License Compliance artifact available.
+that you can later download and analyze.
WARNING:
License Compliance Scanning does not support run-time installation of compilers and interpreters.
@@ -72,11 +71,13 @@ Gradle 1.x projects are not supported. The minimum supported version of Maven is
|------------|----------------------------------------------------------------------------------------------|-------|
| JavaScript | [Bower](https://bower.io/), [npm](https://www.npmjs.com/) (7 and earlier) | |
| Go | [Godep](https://github.com/tools/godep) ([deprecated](../../../update/deprecations.md#godep-support-in-license-compliance)), [go mod](https://github.com/golang/go/wiki/Modules) | |
-| Java | [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/) | |
+| Java | [Gradle](https://gradle.org/) <sup>1</sup>, [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`. |
| Python | [pip](https://pip.pypa.io/en/stable/) | Python is supported through [requirements.txt](https://pip.pypa.io/en/stable/user_guide/#requirements-files) and [Pipfile.lock](https://github.com/pypa/pipfile#pipfilelock). |
| Ruby | [gem](https://rubygems.org/) | |
+1. Gradle 7 and later is not supported as dependencies are not discovered when included with the `implementation` directive. Please see [GitLab#341222](https://gitlab.com/gitlab-org/gitlab/-/issues/341222) for more details.
+
### Experimental support
The following languages and package managers are [supported experimentally](https://github.com/pivotal/LicenseFinder#experimental-project-types).
@@ -101,6 +102,8 @@ To enable License Compliance in your project's pipeline, either:
(provided by [Auto DevOps](../../../topics/autodevops/index.md)).
- Include 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) in your `.gitlab-ci.yml` file.
+Please note that License Compliance is not supported when GitLab is run with FIPS mode enabled.
+
### Include the License Scanning template
Prerequisites:
@@ -110,6 +113,7 @@ Prerequisites:
shared runners on GitLab.com, this is enabled by default.
- License Scanning runs in the `test` stage, which is available by default. If you redefine the stages in the
`.gitlab-ci.yml` file, the `test` stage is required.
+- [FIPS mode](../../../development/fips_compliance.md#enable-fips-mode) must be disabled.
To [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), add it to your `.gitlab-ci.yml` file:
diff --git a/doc/user/crm/index.md b/doc/user/crm/index.md
index b5287816052..a2cfdf61a8d 100644
--- a/doc/user/crm/index.md
+++ b/doc/user/crm/index.md
@@ -39,7 +39,7 @@ To enable customer relations management in a group or subgroup:
1. On the top bar, select **Menu > Groups** and find your group or subgroup.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Permissions and group features** section.
-1. Select **Enable customer relations**.
+1. Select **Customer relations is enabled**.
1. Select **Save changes**.
## Contacts
@@ -118,6 +118,9 @@ organizations using the GraphQL API.
## Issues
+If you use [Service Desk](../project/service_desk.md) and create issues from emails,
+issues are linked to contacts matching the email addresses in the sender and CC of the email.
+
### View issues linked to a contact
To view a contact's issues, select a contact from the issue sidebar, or:
@@ -170,10 +173,7 @@ API.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2256) in GitLab 14.8 [with a flag](../../administration/feature_flags.md) named `contacts_autocomplete`. Disabled by default.
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/352123) in GitLab 15.0.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `contacts_autocomplete`.
-On GitLab.com, this feature is available.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/352123) in GitLab 15.2. [Feature flag `contacts_autocomplete`](https://gitlab.com/gitlab-org/gitlab/-/issues/352123) removed.
When you use the `/add_contacts` or `/remove_contacts` quick actions, follow them with `[contact:` and an autocomplete list appears:
diff --git a/doc/user/discussions/img/start_image_discussion.gif b/doc/user/discussions/img/start_image_discussion.gif
deleted file mode 100644
index 18b2a4701cc..00000000000
--- a/doc/user/discussions/img/start_image_discussion.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index a0649a61905..1f34d182718 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -98,8 +98,6 @@ This comment can also be a thread.
An icon is displayed on the image and a comment field is displayed.
-![Start image thread](img/start_image_discussion.gif)
-
## Reply to a comment by sending email
If you have ["reply by email"](../../administration/reply_by_email.md) configured,
@@ -156,11 +154,7 @@ If an issue or merge request is locked and closed, you cannot reopen it.
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/351143) in GitLab 14.10: you can only mark comments in issues and epics as confidential. Previously, it was also possible for comments in merge requests and snippets.
> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87403) from "confidential comments" to "internal notes" in GitLab 15.0.
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87383) in GitLab 15.0.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature,
-ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `confidential_notes`.
-On GitLab.com, this feature is available.
+> - [Feature flag `confidential_notes`](https://gitlab.com/gitlab-org/gitlab/-/issues/362712) removed in GitLab 15.2.
You can add an internal note **to an issue or an epic**. It's then visible only to the following people:
@@ -229,7 +223,7 @@ To change the activity sort order:
## Assign an issue to the commenting user
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
You can assign an issue to a user who made a comment.
diff --git a/doc/user/free_user_limit.md b/doc/user/free_user_limit.md
index 868e322cac9..b848128b160 100644
--- a/doc/user/free_user_limit.md
+++ b/doc/user/free_user_limit.md
@@ -1,6 +1,6 @@
---
stage: Growth
-group: Conversion
+group: Acquisition
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
---
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index d515f9f4558..529b81e2645 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -230,11 +230,23 @@ also load certain page content directly from common public CDN hostnames.
## Webhooks
-The following limits apply for [webhooks](../project/integrations/webhooks.md):
+The following limits apply for [webhooks](../project/integrations/webhooks.md).
+
+### Rate limits
+
+The number of times a webhook can be called per minute, per top-level namespace.
+The limit varies depending on your plan and the number of seats in your subscription.
+
+| Plan | Default for GitLab.com |
+|----------------------|-------------------------|
+| Free | `500` |
+| Premium | `99` seats or fewer: `1,600`<br>`100-399` seats: `2,800`<br>`400` seats or more: `4,000` |
+| Ultimate and open source |`999` seats or fewer: `6,000`<br>`1,000-4,999` seats: `9,000`<br>`5,000` seats or more: `13,000` |
+
+### Other limits
| Setting | Default for GitLab.com |
|----------------------|-------------------------|
-| Webhook rate limit | `500` calls per minute for GitLab Free, unlimited for GitLab Premium and GitLab Ultimate. Webhook rate limits are applied per top-level namespace. |
| Number of webhooks | `100` per project, `50` per group |
| Maximum payload size | 25 MB |
@@ -344,6 +356,7 @@ after the limits change in January, 2021:
| **GitLab Pages** requests (for a given **IP address**) | | **1000** requests per **50 seconds** |
| **GitLab Pages** requests (for a given **GitLab Pages domain**) | | **5000** requests per **10 seconds** |
| **Pipeline creation** requests (for a given **project, user, and commit**) | | **25** requests per minute |
+| **Alert integration endpoint** requests (for a given **project**) | | **3600** requests per hour |
More details are available on the rate limits for [protected
paths](#protected-paths-throttle) and [raw
@@ -407,12 +420,7 @@ No response headers are provided.
### Pagination response headers
-For performance reasons, if a query returns more than 10,000 records, GitLab
-doesn't return the following headers:
-
-- `x-total`.
-- `x-total-pages`.
-- `rel="last"` `link`.
+For performance reasons, if a query returns more than 10,000 records, [GitLab excludes some headers](../../api/index.md#pagination-response-headers).
### Visibility settings
diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md
index e0334eda875..71d7b7fbb0c 100644
--- a/doc/user/group/epics/manage_epics.md
+++ b/doc/user/group/epics/manage_epics.md
@@ -34,6 +34,7 @@ To create an epic in the group you're in:
- To [make the epic confidential](#make-an-epic-confidential), select the checkbox under **Confidentiality**.
- Choose labels.
- Select a start and due date, or [inherit](#start-and-due-date-inheritance) them.
+ - Select a [color](#epic-color).
1. Select **Create epic**.
The newly created epic opens.
@@ -62,6 +63,18 @@ Because the epic's dates can inherit dates from its children, the start date and
If the start date of a child epic on the lowest level changes, that becomes the earliest possible start date for its parent epic.
The parent epic's start date then reflects this change and propagates upwards to the top epic.
+### Epic color
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79940) in GitLab 14.9 [with a flag](../../../administration/feature_flags.md) named `epic_color_highlight`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available per group, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `epic_color_highlight`.
+On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.
+The feature is not ready for production use.
+
+When you create or edit an epic, you can select its color.
+An epic's color is shown in [roadmaps](../roadmap/index.md), and [epic boards](epic_boards.md).
+
## Edit an epic
After you create an epic, you can edit the following details:
@@ -71,6 +84,7 @@ After you create an epic, you can edit the following details:
- Start date
- Due date
- Labels
+- [Color](#epic-color)
Prerequisites:
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index ae1465d0b1b..edf4d7677df 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -86,7 +86,7 @@ migrated:
- Badges ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292431) in 13.11)
- Board Lists
-- Boards
+- Boards
- Epics ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250281) in 13.7)
- Finisher
- Group Labels ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292429) in 13.9)
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 6ba8251ba05..56d1569c908 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -45,16 +45,19 @@ the immediate parent group.
### Namespaces
-In GitLab, a namespace is a unique name for a user, a group, or subgroup under
-which a project can be created.
+In GitLab, a *namespace* organizes related projects together.
+GitLab has two types of namespaces:
-For example, consider a user named Alex:
+- A *personal* namespace, which is based on your username. Projects under a personal namespace must be configured one at a time.
+- A *group* or *subgroup* namespace. In these namespaces, you can manage multiple projects at once.
-| GitLab URL | Namespace |
-| ---------- | --------- |
-| Alex creates an account with the username `alex`: `https://gitlab.example.com/alex`. | The namespace in this case is `alex`. |
-| Alex creates a group for their team with the group name `alex-team`. The group and its projects are available at: `https://gitlab.example.com/alex-team`. | The namespace in this case is `alex-team`. |
-| Alex creates a subgroup of `alex-team` with the subgroup name `marketing`. The subgroup and its projects are available at: `https://gitlab.example.com/alex-team/marketing`. | The namespace in this case is `alex-team/marketing`. |
+To determine whether you're viewing a group or personal namespace, you can view the URL. For example:
+
+| Namespace for | URL | Namespace |
+| ------------- | --- | --------- |
+| A user named `alex`. | `https://gitlab.example.com/alex` | `alex` |
+| A group named `alex-team`. | `https://gitlab.example.com/alex-team` | `alex-team` |
+| A group named `alex-team` with a subgroup named `marketing`. | `https://gitlab.example.com/alex-team/marketing` | `alex-team/marketing` |
## Create a group
@@ -240,7 +243,7 @@ To change this setting for a specific group:
1. Find the group and select it.
1. From the left menu, select **Settings > General**.
1. Expand the **Permissions and group features** section.
-1. Select the desired option in the **Allowed to create projects** dropdown list.
+1. Select the desired option in the **Roles allowed to create projects** dropdown list.
1. Select **Save changes**.
To change this setting globally, see [Default project creation protection](../admin_area/settings/visibility_and_access_controls.md#define-which-roles-can-create-projects).
@@ -478,7 +481,7 @@ To prevent sharing outside of the group's hierarchy:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Settings > General**.
1. Expand **Permissions and group features**.
-1. Select **Prevent members from sending invitations to groups outside of `<group_name>` and its subgroups**.
+1. Select **Members cannot invite groups outside of `<group_name>` and its subgroups**.
1. Select **Save changes**.
## Prevent a project from being shared with groups
@@ -490,7 +493,7 @@ To prevent a project from being shared with other groups:
1. Go to the group's **Settings > General** page.
1. Expand the **Permissions and group features** section.
-1. Select **Prevent sharing a project in `<group_name>` with other groups**.
+1. Select **Projects in `<group_name>` cannot be shared with other groups**.
1. Select **Save changes**.
This setting applies to all subgroups unless overridden by a group owner. Groups already
@@ -582,7 +585,7 @@ To prevent members from being added to projects in a group:
1. Go to the group's **Settings > General** page.
1. Expand the **Permissions and group features** section.
-1. Under **Membership**, select **Prevent adding new members to projects within this group**.
+1. Under **Membership**, select **Users cannot be added to projects in this group**.
1. Select **Save changes**.
All users who previously had permissions can no longer add members to a group.
@@ -608,15 +611,14 @@ To ensure only people from your organization can access particular
resources, you can restrict access to groups by IP address. This group-level setting
applies to:
-- The GitLab UI, including subgroups, projects, and issues.
+- The GitLab UI, including subgroups, projects, issues, and pages.
- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/12874), the API.
+- Using Git over SSH on GitLab.com.
### Security implications
You should consider some security implications before configuring IP address restrictions.
-- Restricting HTTP traffic on GitLab.com with IP address restrictions causes SSH requests (including Git operations over
- SSH) to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/271673).
- Administrators and group owners can access group settings from any IP address, regardless of IP restriction. However:
- Groups owners cannot access projects belonging to the group when accessing from a disallowed IP address.
- Administrators can access projects belonging to the group when accessing from a disallowed IP address.
@@ -629,6 +631,8 @@ You should consider some security implications before configuring IP address res
restricted IP address, the IP restriction prevents code from being cloned.
- Users may still see some events from the IP restricted groups and projects on their dashboard. Activity may include
push, merge, issue, or comment events.
+- IP access restrictions for Git operations via SSH are supported only on GitLab SaaS.
+ IP access restrictions applied to self-managed instances block SSH completely.
### Restrict group access by IP address
@@ -636,7 +640,7 @@ To restrict group access by IP address:
1. Go to the group's **Settings > General** page.
1. Expand the **Permissions and group features** section.
-1. In the **Allow access to the following IP addresses** field, enter IPv4 or IPv6 address ranges in CIDR notation.
+1. In the **Restrict access by IP address** field, enter IPv4 or IPv6 address ranges in CIDR notation.
1. Select **Save changes**.
In self-managed installations of GitLab 15.1 and later, you can also configure
@@ -671,6 +675,26 @@ The most popular public email domains cannot be restricted, such as:
When you share a group, both the source and target namespaces must allow the domains of the members' email addresses.
+## Restrict Git access protocols
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/365601) in GitLab 15.1 [with a flag](../../administration/feature_flags.md) named `group_level_git_protocol_control`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to
+[enable the feature flag](../../administration/feature_flags.md) named `group_level_git_protocol_control`. On GitLab.com,
+this feature is available.
+
+You can set the permitted protocols used to access a group's repositories to either SSH, HTTPS, or both. This setting
+is disabled when the [instance setting](../admin_area/settings/visibility_and_access_controls.md#configure-enabled-git-access-protocols) is
+configured by an administrator.
+
+To change the permitted Git access protocols for a group:
+
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions and group features** section.
+1. Choose the permitted protocols from **Enabled Git access protocols**.
+1. Select **Save changes**.
+
## Group file templates **(PREMIUM)**
Use group file templates to share a set of templates for common file
@@ -712,7 +736,7 @@ To disable email notifications:
1. Go to the group's **Settings > General** page.
1. Expand the **Permissions and group features** section.
-1. Select **Disable email notifications**.
+1. Select **Email notifications are disabled**.
1. Select **Save changes**.
## Disable group mentions
@@ -731,7 +755,7 @@ To disable group mentions:
1. Go to the group's **Settings > General** page.
1. Expand the **Permissions and group features** section.
-1. Select **Disable group mentions**.
+1. Select **Group mentions are disabled**.
1. Select **Save changes**.
## Enable delayed project deletion **(PREMIUM)**
@@ -743,7 +767,7 @@ To disable group mentions:
> - [User interface changed](https://gitlab.com/gitlab-org/gitlab/-/issues/352961) in GitLab 15.1.
[Delayed project deletion](../project/settings/index.md#delayed-project-deletion) is locked and disabled unless the instance-level settings for
-[deletion protection](../admin_area/settings/visibility_and_access_controls.md#deletion-protection) is enabled for either groups only or groups and projects.
+[deletion protection](../admin_area/settings/visibility_and_access_controls.md#deletion-protection) are enabled for either groups only or groups and projects.
When enabled on groups, projects in the group are deleted after a period of delay. During this period, projects are in a read-only state and can be restored.
The default period is seven days but [is configurable at the instance level](../admin_area/settings/visibility_and_access_controls.md#retention-period).
@@ -848,12 +872,12 @@ Support for group-level settings for merge request approval rules is tracked in
- [Audit Events](../../administration/audit_events.md#group-events).
- [CI/CD minutes quota](../../ci/pipelines/cicd_minutes.md): Keep track of the CI/CD minute quota for the group.
- [Integrations](../admin_area/settings/project_integration_management.md).
-- [Transfer a project into a group](../project/settings/index.md#transferring-an-existing-project-into-another-namespace).
+- [Transfer a project into a group](../project/settings/index.md#transfer-a-project-to-another-namespace).
- [Share a project with a group](../project/members/share_project_with_groups.md): Give all group members access to the project at once.
- [Lock the sharing with group feature](#prevent-a-project-from-being-shared-with-groups).
- [Enforce two-factor authentication (2FA)](../../security/two_factor_authentication.md#enforce-2fa-for-all-users-in-a-group): Enforce 2FA
for all group members.
-- Namespaces [API](../../api/namespaces.md) and [Rake tasks](../../raketasks/features.md).
+- Namespaces [API](../../api/namespaces.md) and [Rake tasks](../../raketasks/index.md).
- [Control access and visibility](../admin_area/settings/visibility_and_access_controls.md).
## Troubleshooting
diff --git a/doc/user/group/saml_sso/group_managed_accounts.md b/doc/user/group/saml_sso/group_managed_accounts.md
deleted file mode 100644
index 0a00d0c1c1c..00000000000
--- a/doc/user/group/saml_sso/group_managed_accounts.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-type: reference, howto
-stage: Manage
-group: Authentication and Authorization
-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
-remove_date: '2022-06-13'
-redirect_to: 'index.md'
----
-
-# Group Managed Accounts **(PREMIUM)**
-
-This [closed beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#sts=Closed%20Beta) feature was never enabled globally. See
-[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/296544) for progress on removing the feature.
-Use [SAML SSO](index.md) instead.
diff --git a/doc/user/group/saml_sso/group_sync.md b/doc/user/group/saml_sso/group_sync.md
index 2239562b831..b8b7a16b31b 100644
--- a/doc/user/group/saml_sso/group_sync.md
+++ b/doc/user/group/saml_sso/group_sync.md
@@ -23,10 +23,12 @@ For a demo of Group Sync using Azure, see [Demo: SAML Group Sync](https://youtu.
To configure SAML Group Sync:
-1. Configure SAML authentication:
- - For GitLab self-managed, see [SAML OmniAuth Provider](../../../integration/saml.md).
- - For GitLab.com, see [SAML SSO for GitLab.com groups](index.md).
-1. Ensure your SAML identity provider sends an attribute statement named `Groups` or `groups`.
+- For GitLab self-managed:
+ 1. Configure the [SAML OmniAuth Provider](../../../integration/saml.md).
+ 1. Ensure your SAML identity provider sends an attribute statement with the same name as the value of the `groups_attribute` setting.
+- For GitLab.com:
+ 1. See [SAML SSO for GitLab.com groups](index.md).
+ 1. Ensure your SAML identity provider sends an attribute statement named `Groups` or `groups`.
NOTE:
The value for `Groups` or `groups` in the SAML response can be either the group name or the group ID.
diff --git a/doc/user/group/saml_sso/img/unlink_group_saml.png b/doc/user/group/saml_sso/img/unlink_group_saml.png
deleted file mode 100644
index 9d53a9bf407..00000000000
--- a/doc/user/group/saml_sso/img/unlink_group_saml.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index c05e847e2c9..80e7a5903fa 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -189,7 +189,9 @@ with the notes below for consideration.
| GitLab single sign-on URL | Start URL |
| Identity provider single sign-on URL | SSO URL |
-You must download the certificate to get the SHA1 certificate fingerprint.
+NOTE:
+Google Workspace displays a SHA256 fingerprint. To retrieve the SHA1 fingerprint required by GitLab for [configuring SAML](#configure-gitlab), download the certificate and calculate
+the SHA1 certificate fingerprint.
The recommended attributes and claims settings are:
@@ -396,9 +398,7 @@ For example, to unlink the `MyOrg` account:
1. On the top bar, in the top right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Account**.
-1. In the **Social sign-in** section, select **Disconnect** next to the connected account.
-
-![Unlink Group SAML](img/unlink_group_saml.png)
+1. In the **Service sign-in** section, select **Disconnect** next to the connected account.
## Group Sync
@@ -511,7 +511,7 @@ Alternatively, the SAML response may be missing the `InResponseTo` attribute in
The identity provider administrator should ensure that the login is
initiated by the service provider and not the identity provider.
-### Message: "Login to a GitLab account to link with your SAML identity"
+### Message: "Sign in to GitLab to connect your organization's account"
A user can see this message when they are trying to [manually link SAML to their existing GitLab.com account](#linking-saml-to-your-existing-gitlabcom-account).
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index cc154b96ed0..04aa99e08af 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -71,8 +71,10 @@ Follow [Azure documentation to configure the attribute mapping](https://docs.mic
The following table below provides an attribute mapping known to work with GitLab. If
your SAML configuration differs from [the recommended SAML settings](index.md#azure-setup-notes),
-modify the corresponding `customappsso` settings accordingly. If a mapping is not listed in the
-table, use the Azure defaults. For a list of required attributes, refer to the [SCIM API documentation](../../../api/scim.md).
+modify the corresponding `customappsso` settings accordingly. In particular, the `externalId` must
+match the [SAML NameID](index.md#nameid).
+If a mapping is not listed in the table, use the Azure defaults.
+For a list of required attributes, refer to the [SCIM API documentation](../../../api/scim.md).
| Azure Active Directory Attribute | `customappsso` Attribute | Matching precedence |
| -------------------------------- | ------------------------------ | ------------------- |
@@ -169,7 +171,7 @@ If [Group SAML](index.md) has been configured and you have an existing GitLab.co
We recommend users do this prior to turning on sync, because while synchronization is active, there may be provisioning errors for existing users.
-New users and existing users on subsequent visits can access the group through the identify provider's dashboard or by visiting links directly.
+New users and existing users on subsequent visits can access the group through the identity provider's dashboard or by visiting links directly.
[In GitLab 14.0 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/325712), GitLab users created by [SAML SSO](index.md#user-access-and-management) or SCIM provisioning display with an **Enterprise** badge in the **Members** view.
@@ -257,7 +259,19 @@ Changing the SAML or SCIM configuration or provider can cause the following prob
| Problem | Solution |
| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SAML and SCIM identity mismatch. | First [verify that the user's SAML NameId matches the SCIM externalId](#how-do-i-verify-users-saml-nameid-matches-the-scim-externalid) and then [update or fix the mismatched SCIM externalId and SAML NameId](#update-or-fix-mismatched-scim-externalid-and-saml-nameid). |
-| SCIM identity mismatch between GitLab and the Identify Provider SCIM app. | You can confirm whether you're hitting the error because of your SCIM identity mismatch between your SCIM app and GitLab.com by using [SCIM API](../../../api/scim.md#update-a-single-scim-provisioned-user) which shows up in the `id` key and compares it with the user `externalId` in the SCIM app. You can use the same [SCIM API](../../../api/scim.md#update-a-single-scim-provisioned-user) to update the SCIM `id` for the user on GitLab.com. |
+| SCIM identity mismatch between GitLab and the identity provider SCIM app. | You can confirm whether you're hitting the error because of your SCIM identity mismatch between your SCIM app and GitLab.com by using [SCIM API](../../../api/scim.md#update-a-single-scim-provisioned-user) which shows up in the `id` key and compares it with the user `externalId` in the SCIM app. You can use the same [SCIM API](../../../api/scim.md#update-a-single-scim-provisioned-user) to update the SCIM `id` for the user on GitLab.com. |
+
+### Search Rails logs for SCIM requests
+
+GitLab.com administrators can search for SCIM requests in the `api_json.log` using the `pubsub-rails-inf-gprd-*` index in [Kibana](https://about.gitlab.com/handbook/support/workflows/kibana.html#using-kibana). Use the following filters based on the [SCIM API](../../../api/scim.md):
+
+- `json.path`: `/scim/v2/groups/<group-path>`
+- `json.params.value`: `<externalId>`
+
+In a relevant log entry, the `json.params.value` shows the values of SCIM parameters GitLab receives. These values can be used to verify if SCIM parameters configured in an
+identity provider's SCIM app are communicated to GitLab as intended. For example, we can use these values as a definitive source on why an account was provisioned with a certain
+set of details. This information can help where an account was SCIM provisioned with details that appear to be incongruent with what might have been configured within an identity
+provider's SCIM app.
### Azure
diff --git a/doc/user/group/settings/group_access_tokens.md b/doc/user/group/settings/group_access_tokens.md
index 649e7f2c264..9e8fc120731 100644
--- a/doc/user/group/settings/group_access_tokens.md
+++ b/doc/user/group/settings/group_access_tokens.md
@@ -78,7 +78,7 @@ or API. However, administrators can use a workaround:
bot.confirm
# Add the bot to the group with the required role.
- group.add_user(bot, :maintainer)
+ group.add_member(bot, :maintainer)
# Give the bot a personal access token.
token = bot.personal_access_tokens.create(scopes:[:api, :write_repository], name: 'group_token')
@@ -141,7 +141,7 @@ To enable or disable group access token creation for all sub-groups in a top-lev
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Settings > General**.
1. Expand **Permissions and group features**.
-1. Under **Permissions**, turn on or off **Allow project and group access token creation**.
+1. Under **Permissions**, turn on or off **Users can create project access tokens and group access tokens in this group**.
Even when creation is disabled, you can still use and revoke existing group access tokens.
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index 5f3c859d15a..bf4e13779fd 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -73,21 +73,20 @@ To create a subgroup:
To create a subgroup, you must have at least the Maintainer role on the group, depending on the group's setting. By
default:
-- In GitLab 12.2 or later, users with at least the Maintainer role can create subgroups.
-- In GitLab 12.1 or earlier, only users with the Owner role can create subgroups.
-
To change who can create subgroups on a group:
- As a user with the Owner role on the group:
- 1. On the top bar, select **Menu > Groups** and find the group.
+ 1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Settings > General**.
1. Expand **Permissions and group features**.
- 1. Select a role from the **Allowed to create subgroups** dropdown.
+ 1. Select a role from **Roles allowed to create subgroups**.
+ 1. Select **Save changes**.
- As an administrator:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Overview > Groups**.
- 1. Select the group, and select **Edit**.
- 1. Select a role from the **Allowed to create subgroups** dropdown.
+ 1. In the group's row select **Edit**.
+ 1. Select a role from **Allowed to create subgroups**.
+ 1. Select **Save changes**.
For more information, view the [permissions table](../../permissions.md#group-members-permissions).
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 72d42a8081f..3e41b7b63cc 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -7,8 +7,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Value stream analytics for groups **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/196455) in GitLab 12.9 for groups.
-
Value stream analytics provides metrics about each stage of your software development process.
A **value stream** is the entire work process that delivers value to customers. For example,
@@ -20,14 +18,13 @@ Use value stream analytics to identify:
- The amount of time it takes to go from an idea to production.
- The velocity of a given project.
- Bottlenecks in the development process.
-- Detecting long-running issues or merge requests.
+- Long-running issues or merge requests.
- Factors that cause your software development lifecycle to slow down.
Value stream analytics is also available for [projects](../../analytics/value_stream_analytics.md).
## View value stream analytics
-> - Date range filter [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13216) in GitLab 12.4
> - Filtering [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13216) in GitLab 13.3
> - Horizontal stage path [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12196) in 13.0 and [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323982) in 13.12
@@ -40,7 +37,7 @@ To view value stream analytics for your group:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Analytics > Value stream**.
-1. To view metrics for each stage, above the **Filter results** text box, select a stage.
+1. To view metrics for a particular stage, select a stage below the **Filter results** text box.
1. Optional. Filter the results:
1. Select the **Filter results** text box.
1. Select a parameter.
@@ -63,57 +60,18 @@ The table shows a list of related workflow items for the selected stage. Based o
- Merge requests
- Pipelines
-## View metrics for each development stage
+## View DORA metrics and key metrics for a group
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/210315) in GitLab 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323982) in GitLab 13.12.
-Value stream analytics shows the median time spent by issues or merge requests in each development stage.
-
-To view the median time spent in each stage by a group:
-
-1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Analytics > Value stream**.
-1. Optional. Filter the results:
- 1. Select the **Filter results** text box.
- 1. Select a parameter.
- 1. Select a value or enter text to refine the results.
- 1. To adjust the date range:
- - In the **From** field, select a start date.
- - In the **To** field, select an end date.
-1. To view the metrics for each stage, above the **Filter results** text box, hover over a stage.
-
-## View the lead time and cycle time for issues
-
-Value stream analytics shows the lead time and cycle time for issues in your groups:
-
-- Lead time: Median time from when the issue was created to when it was closed.
-- Cycle time: Median time from first commit to issue closed. GitLab measures cycle time from the earliest
-commit of a [linked issue's merge request](../../project/issues/crosslinking_issues.md#from-commit-messages)
-to when that issue is closed. The cycle time approach underestimates the lead time because merge request creation
-is always later than commit time.
-
-To view the lead time and cycle time for issues:
-
-1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Analytics > Value stream**.
-1. Optional. Filter the results:
- 1. Select the **Filter results** text box.
- 1. Select a parameter.
- 1. Select a value or enter text to refine the results.
- 1. To adjust the date range:
- - In the **From** field, select a start date.
- - In the **To** field, select an end date.
-
-The **Lead Time** and **Cycle Time** metrics display below the **Filter results** text box.
-
-## View lead time for changes for merge requests **(ULTIMATE)**
+The **Overview** dashboard in value stream analytics shows key metrics and DORA metrics of group performance. Based on the filter you select,
+the dashboard automatically aggregates DORA metrics and displays the current status of the value stream. Select a DORA metric to view its chart.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340150) in GitLab 14.5.
-
-Lead time for changes is the median duration between when a merge request is merged and when it's deployed to production.
+To view deployment metrics, you must have a
+[production environment configured](../../../ci/environments/index.md#deployment-tier-of-environments).
-To view the lead time for changes for merge requests in your group:
+To view the DORA metrics and key metrics:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Analytics > Value stream**.
@@ -124,45 +82,46 @@ To view the lead time for changes for merge requests in your group:
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
+Key metrics and DORA metrics display below the **Filter results** text box.
-The **Lead Time for Changes** metrics display below the **Filter results** text box.
-
-## View number of successful deployments **(PREMIUM)**
-
-> DORA API-based deployment metrics for value stream analytics for groups were [moved](https://gitlab.com/gitlab-org/gitlab/-/issues/337256) from GitLab Ultimate to GitLab Premium in 14.3.
+### Key metrics in the value stream
-To view deployment metrics, you must have a
-[production environment configured](../../../ci/environments/index.md#deployment-tier-of-environments).
+The **Overview** dashboard shows the following key metrics that measure team performance:
-Value stream analytics shows the following deployment metrics for your group:
-
-- Deploys: The number of successful deployments in the date range.
-- Deployment Frequency: The average number of successful deployments per day in the date range.
+- Lead time: Median time from when the issue was created to when it was closed.
+- Cycle time: Median time from first commit to issue closed. GitLab measures cycle time from the earliest commit of a
+ [linked issue's merge request](../../project/issues/crosslinking_issues.md#from-commit-messages) to when that issue is closed.
+ The cycle time approach underestimates the lead time because merge request creation is always later than commit time.
+- New issues: Number of new issues created.
+- Deploys: Total number of deployments to production.
-To view deployment metrics for your group:
+### DORA metrics **(ULTIMATE)**
-1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Analytics > Value stream**.
-1. Optional. Filter the results:
- 1. Select the **Filter results** text box.
- 1. Select a parameter.
- 1. Select a value or enter text to refine the results.
- 1. To adjust the date range:
- - In the **From** field, select a start date.
- - In the **To** field, select an end date.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340150) lead time for changes DORA metric in GitLab 14.5.
+> - DORA API-based deployment metrics for value stream analytics for groups were [moved](https://gitlab.com/gitlab-org/gitlab/-/issues/337256) from GitLab Ultimate to GitLab Premium in GitLab 14.3.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355304) time to restore service tile in GitLab 15.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357071) change failure rate tile in GitLab 15.0.
-NOTE:
-The date range selector filters items by the event time. This is the time when the currently
-selected stage finished for the given item.
+The value stream analytics **Overview** dashboard displays the following [DORA](../../../user/analytics/index.md) metrics:
-The **Deploys** and **Deployment Frequency** metrics display below the **Filter results** text box.
+- Deployment Frequency.
+- Lead time for changes.
+- Time to restore service.
+- Change failure rate.
-Deployment metrics are calculated based on data from the
+DORA metrics are calculated based on data from the
[DORA API](../../../api/dora/metrics.md#devops-research-and-assessment-dora-key-metrics-api).
NOTE:
-In GitLab 13.9 and later, metrics are calculated based on when the deployment was finished.
-In GitLab 13.8 and earlier, metrics are calculated based on when the deployment was created.
+In GitLab 13.9 and later, deployment frequency metrics are calculated based on when the deployment was finished.
+In GitLab 13.8 and earlier, deployment frequency metrics are calculated based on when the deployment was created.
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/embed/wQU-mWvNSiI">DORA metrics and value stream analytics</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube.com/embed/wQU-mWvNSiI" frameborder="0" allowfullscreen="true"> </iframe>
+</figure>
### How value stream analytics aggregates data
@@ -186,6 +145,30 @@ longer than 10 minutes in the following cases:
To view when the data was most recently updated, in the right corner next to **Edit**, hover over the **Last updated** badge.
+## View metrics for each development stage
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/210315) in GitLab 13.0.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323982) in GitLab 13.12.
+
+Value stream analytics shows the median time spent by issues or merge requests in each development stage.
+
+To view the median time spent in each stage by a group:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Value stream**.
+1. Optional. Filter the results:
+ 1. Select the **Filter results** text box.
+ 1. Select a parameter.
+ 1. Select a value or enter text to refine the results.
+ 1. To adjust the date range:
+ - In the **From** field, select a start date.
+ - In the **To** field, select an end date.
+1. To view the metrics for each stage, above the **Filter results** text box, hover over a stage.
+
+NOTE:
+The date range selector filters items by the event time. The event time is when the
+selected stage finished for the given item.
+
## How value stream analytics measures stages
Value stream analytics measures each stage from its start event to its end event.
@@ -207,6 +190,8 @@ Each pre-defined stages of value stream analytics is further described in the ta
| Review | The median time taken to review a merge request that has a closing issue pattern, between its creation and until it's merged. |
| Staging | The median time between merging a merge request that has a closing issue pattern until the very first deployment to a [production environment](#how-value-stream-analytics-identifies-the-production-environment). If there isn't a production environment, this is not tracked. |
+For information about how value stream analytics calculates each stage, see the [Value stream analytics development guide](../../../development/value_stream_analytics.md).
+
### Example workflow
This example shows a workflow through all seven stages in one day.
@@ -345,7 +330,6 @@ To delete a custom value stream:
## View number of days for a cycle to complete
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21631) in GitLab 12.6.
> - Chart median line [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/235455) in GitLab 13.4.
> - Totals [replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/262070) with averages in GitLab 13.12.
@@ -367,8 +351,6 @@ The chart shows data for the last 500 workflow items.
## Tasks by type chart
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32421) in GitLab 12.10.
-
This chart shows a cumulative count of issues and merge requests per day.
This chart uses the global page filters for displaying data based on the selected
diff --git a/doc/user/infrastructure/clusters/connect/img/variables_civo.png b/doc/user/infrastructure/clusters/connect/img/variables_civo.png
index 5a20478b13c..a668c3dd53c 100644
--- a/doc/user/infrastructure/clusters/connect/img/variables_civo.png
+++ b/doc/user/infrastructure/clusters/connect/img/variables_civo.png
Binary files differ
diff --git a/doc/user/infrastructure/clusters/connect/new_civo_cluster.md b/doc/user/infrastructure/clusters/connect/new_civo_cluster.md
index d8401d5a286..fad75ca6cab 100644
--- a/doc/user/infrastructure/clusters/connect/new_civo_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_civo_cluster.md
@@ -64,7 +64,7 @@ Use CI/CD environment variables to configure your project.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **Variables**.
-1. Set the variable `BASE64_CIVO_CREDENTIALS` to the [token](https://www.civo.com/account/security) from your Civo account.
+1. Set the variable `BASE64_CIVO_TOKEN` to the [token](https://www.civo.com/account/security) from your Civo account.
1. Set the variable `TF_VAR_agent_token` to the agent token you received in the previous task.
1. Set the variable `TF_VAR_kas_address` to the agent server address in the previous task.
@@ -78,8 +78,8 @@ contains other variables that you can override according to your needs:
- `TF_VAR_civo_region`: Set your cluster's region.
- `TF_VAR_cluster_name`: Set your cluster's name.
- `TF_VAR_cluster_description`: Set a description for the cluster. To create a reference to your GitLab project on your Civo cluster detail page, set this value to `$CI_PROJECT_URL`. This value helps you determine which project was responsible for provisioning the cluster you see on the Civo dashboard.
-- `TF_VAR_machine_type`: Set the machine type for the Kubernetes nodes.
-- `TF_VAR_node_count`: Set the number of Kubernetes nodes.
+- `TF_VAR_target_nodes_size`: Set the size of the nodes to use for the cluster
+- `TF_VAR_num_target_nodes`: Set the number of Kubernetes nodes.
- `TF_VAR_agent_version`: Set the version of the GitLab agent.
- `TF_VAR_agent_namespace`: Set the Kubernetes namespace for the GitLab agent.
diff --git a/doc/user/infrastructure/clusters/index.md b/doc/user/infrastructure/clusters/index.md
index 933b310ff3f..9c8bcd9289c 100644
--- a/doc/user/infrastructure/clusters/index.md
+++ b/doc/user/infrastructure/clusters/index.md
@@ -13,7 +13,10 @@ To connect clusters to GitLab, use the [GitLab agent](../../clusters/agent/index
WARNING:
In GitLab 14.5, the certificate-based method to connect Kubernetes clusters
to GitLab was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8),
-as well as its related [features](#deprecated-features).
+as well as its related [features](#deprecated-features). In self-managed GitLab 15.0 and later,
+this feature is disabled by default. For GitLab SaaS users, this feature is available until
+GitLab 15.6 for users who have at least one certificate-based cluster enabled in their namespace hierarchy.
+For GitLab SaaS users that never used this feature previously, it is no longer available.
The certificate-based Kubernetes integration with GitLab is deprecated.
It had the following issues:
@@ -40,6 +43,10 @@ for updates.
You can find technical information about why we moved away from cluster certificates into
the GitLab agent model on the [agent's blueprint documentation](../../../architecture/blueprints/gitlab_to_kubernetes_communication/index.md).
+If you need more time to migrate to GitLab agent, you can [enable the feature flag](../../../administration/feature_flags.md)
+named `certificate_based_clusters`, which was [introduced in GitLab 15.0](../../../update/deprecations.md#self-managed-certificate-based-integration-with-kubernetes).
+This feature flag re-enables the certificate-based Kubernetes integration.
+
## Deprecated features
- [Connect an existing cluster through cluster certificates](../../project/clusters/add_existing_cluster.md)
@@ -52,7 +59,6 @@ the GitLab agent model on the [agent's blueprint documentation](../../../archite
- [Cluster environments](../../clusters/environments.md)
- [Show Canary Ingress deployments on deploy boards](../../project/canary_deployments.md#show-canary-ingress-deployments-on-deploy-boards-deprecated)
- [Deploy Boards](../../project/deploy_boards.md)
-- [Pod logs](../../project/clusters/kubernetes_pod_logs.md)
- [Clusters health](manage/clusters_health.md)
- [Web terminals](../../../administration/integration/terminal.md)
diff --git a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
index aa07a23db18..abdb7c58d82 100644
--- a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
+++ b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
@@ -40,7 +40,7 @@ Some features are currently available only when using certificate-based integrat
With GitLab-managed clusters, GitLab creates separate service accounts and namespaces
for every branch and deploys by using these resources.
-The GitLab agent uses [impersonation](../../clusters/agent/ci_cd_workflow.md#use-impersonation-to-restrict-project-and-group-access)
+The GitLab agent uses [impersonation](../../clusters/agent/ci_cd_workflow.md#restrict-project-and-group-access-by-using-impersonation)
strategies to deploy to your cluster with restricted account access. To do so:
1. Choose the impersonation strategy that suits your needs.
diff --git a/doc/user/infrastructure/iac/terraform_state.md b/doc/user/infrastructure/iac/terraform_state.md
index e8637abce91..24203e8d922 100644
--- a/doc/user/infrastructure/iac/terraform_state.md
+++ b/doc/user/infrastructure/iac/terraform_state.md
@@ -22,6 +22,16 @@ In GitLab, you can:
- Lock and unlock states.
- Remotely execute `terraform plan` and `terraform apply` commands.
+WARNING:
+**Disaster recovery planning**
+Terraform state files are encrypted with the lockbox Ruby gem when they are at rest on disk and in object storage.
+[To decrypt a state file, GitLab must be available](https://gitlab.com/gitlab-org/gitlab/-/issues/335739).
+If it is offline, and you use GitLab to deploy infrastructure that GitLab requires (like virtual machines,
+Kubernetes clusters, or network components), you cannot access the state file easily or decrypt it.
+Additionally, if GitLab serves up Terraform modules or other dependencies that are required to bootstrap GitLab,
+these will be inaccessible. To work around this issue, make other arrangements to host or back up these dependencies,
+or consider using a separate GitLab instance with no shared points of failure.
+
## Prerequisites
For self-managed GitLab, before you can use GitLab for your Terraform state files:
@@ -151,7 +161,8 @@ You can use a GitLab-managed Terraform state backend as a
a [Personal Access Token](../../profile/personal_access_tokens.md) for
authentication, this value is your GitLab username. If you are using GitLab CI/CD, this value is `'gitlab-ci-token'`.
- **password**: The password to authenticate with the data source. If you are using a Personal Access Token for
- authentication, this value is the token value. If you are using GitLab CI/CD, this value is the contents of the `${CI_JOB_TOKEN}` CI/CD variable.
+ authentication, this value is the token value (the token must have the **API** scope).
+ If you are using GitLab CI/CD, this value is the contents of the `${CI_JOB_TOKEN}` CI/CD variable.
Outputs from the data source can now be referenced in your Terraform resources
using `data.terraform_remote_state.example.outputs.<OUTPUT-NAME>`.
diff --git a/doc/user/infrastructure/iac/troubleshooting.md b/doc/user/infrastructure/iac/troubleshooting.md
index 881bcb32aed..5817337223f 100644
--- a/doc/user/infrastructure/iac/troubleshooting.md
+++ b/doc/user/infrastructure/iac/troubleshooting.md
@@ -112,3 +112,12 @@ job that returned the error:
1. Configure the [CI/CD environment scope](../../../ci/variables/#add-a-cicd-variable-to-a-project) for the job.
1. Set the job's [environment](../../../ci/yaml/#environment), matching the environment scope from the previous step.
+
+### Error refreshing state: HTTP remote state endpoint requires auth
+
+To resolve this, ensure that:
+
+- The access token you use has `api` scope.
+- If you have set the `TF_HTTP_PASSWORD` CI/CD variable, make sure that you either:
+ - Set the same value as `TF_PASSWORD`
+ - Remove `TF_HTTP_PASSWORD` variable if your CI/CD job does not explicitly use it.
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index b3eadc13772..7260dbb616c 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -14,6 +14,9 @@ The Conan package registry for GitLab is under development and isn't ready for p
limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/6816) details the remaining
work and timelines to make it production ready.
+NOTE:
+The Conan registry is not FIPS compliant and is disabled when [FIPS mode](../../../development/fips_compliance.md) is enabled.
+
Publish Conan packages in your project's Package Registry. Then install the
packages whenever you need to use them as a dependency.
@@ -105,7 +108,7 @@ For more details about creating and managing Conan packages, see the
#### Package without a username and a channel
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345055) in GitLab 14.6.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345055) in GitLab 14.6.
Even though they are [recommended](https://docs.conan.io/en/latest/reference/conanfile/attributes.html#user-channel)
to distinguish your package from a similarly named existing package,
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index ae64c419632..d0c771ecc41 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -208,10 +208,10 @@ should look:
```yaml
build:
- image: docker:19.03.12
+ image: docker:20.10.16
stage: build
services:
- - docker:19.03.12-dind
+ - docker:20.10.16-dind
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY/group/project/image:latest .
@@ -222,10 +222,10 @@ You can also make use of [other CI/CD variables](../../../ci/variables/index.md)
```yaml
build:
- image: docker:19.03.12
+ image: docker:20.10.16
stage: build
services:
- - docker:19.03.12-dind
+ - docker:20.10.16-dind
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
script:
@@ -248,9 +248,9 @@ when needed. Changes to `main` also get tagged as `latest` and deployed using
an application-specific deploy script:
```yaml
-image: docker:19.03.12
+image: docker:20.10.16
services:
- - docker:19.03.12-dind
+ - docker:20.10.16-dind
stages:
- build
@@ -323,9 +323,9 @@ Below is an example of what your `.gitlab-ci.yml` should look like:
```yaml
build:
- image: $CI_REGISTRY/group/project/docker:19.03.12
+ image: $CI_REGISTRY/group/project/docker:20.10.16
services:
- - name: $CI_REGISTRY/group/project/docker:19.03.12-dind
+ - name: $CI_REGISTRY/group/project/docker:20.10.16-dind
alias: docker
stage: build
script:
@@ -333,7 +333,7 @@ build:
- 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
+If you forget to set the service alias, the `docker:20.10.16` image is unable to find the
`dind` service, and an error like the following is thrown:
```plaintext
@@ -353,7 +353,7 @@ 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
+ image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:20.10.16
services:
- name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:18.09.7-dind
alias: docker
@@ -363,7 +363,7 @@ build:
- 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
+If you forget to set the service alias, the `docker:20.10.16` image is unable to find the
`dind` service, and an error like the following is thrown:
```plaintext
@@ -438,10 +438,10 @@ stages:
- clean
build_image:
- image: docker:19.03.12
+ image: docker:20.10.16
stage: build
services:
- - docker:19.03.12-dind
+ - docker:20.10.16-dind
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
script:
@@ -454,10 +454,10 @@ build_image:
- main
delete_image:
- image: docker:19.03.12
+ image: docker:20.10.16
stage: clean
services:
- - docker:19.03.12-dind
+ - docker:20.10.16-dind
variables:
IMAGE_TAG: $CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG
REG_SHA256: ade837fc5224acd8c34732bf54a94f579b47851cc6a7fd5899a98386b782e228
@@ -564,7 +564,7 @@ project or branch name. Special characters can include:
- Trailing hyphen/dash
To get around this, you can [change the group path](../../group/index.md#change-a-groups-path),
-[change the project path](../../project/settings/index.md#renaming-a-repository) or change the branch
+[change the project path](../../project/settings/index.md#rename-a-repository) or change the branch
name.
You may also get a `404 Not Found` or `Unknown Manifest` message if you are using
diff --git a/doc/user/packages/debian_repository/index.md b/doc/user/packages/debian_repository/index.md
index a8f0672e376..1d846a60281 100644
--- a/doc/user/packages/debian_repository/index.md
+++ b/doc/user/packages/debian_repository/index.md
@@ -15,6 +15,9 @@ The Debian package registry for GitLab is under development and isn't ready for
limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/6057) details the remaining
work and timelines to make it production ready.
+NOTE:
+The Debian registry is not FIPS compliant and is disabled when [FIPS mode](../../../development/fips_compliance.md) is enabled.
+
Publish Debian packages in your project's Package Registry. Then install the
packages whenever you need to use them as a dependency.
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index af54d928bec..4770057e4ea 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -152,17 +152,17 @@ FROM gitlab.example.com:443/my-group/dependency_proxy/containers/alpine:latest
```yaml
# .gitlab-ci.yml
-image: docker:19.03.12
+image: docker:20.10.16
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
services:
- - docker:19.03.12-dind
+ - docker:20.10.16-dind
build:
- image: docker:19.03.12
+ image: docker:20.10.16
before_script:
- docker login -u $CI_DEPENDENCY_PROXY_USER -p $CI_DEPENDENCY_PROXY_PASSWORD $CI_DEPENDENCY_PROXY_SERVER
script:
@@ -301,7 +301,7 @@ hub_docker_quota_check:
### Dependency Proxy Connection Failure
-If a service alias is not set the `docker:19.03.12` image is unable to find the
+If a service alias is not set the `docker:20.10.16` image is unable to find the
`dind` service, and an error like the following is thrown:
```plaintext
diff --git a/doc/user/packages/generic_packages/index.md b/doc/user/packages/generic_packages/index.md
index 22b792e443f..8d5fc73ad4e 100644
--- a/doc/user/packages/generic_packages/index.md
+++ b/doc/user/packages/generic_packages/index.md
@@ -209,3 +209,25 @@ upload:
The [Write CI-CD Variables in Pipeline](https://gitlab.com/guided-explorations/cfg-data/write-ci-cd-variables-in-pipeline) project contains a working example you can use to create, upload, and download generic packages in GitLab CI/CD.
It also demonstrates how to manage a semantic version for the generic package: storing it in a CI/CD variable, retrieving it, incrementing it, and writing it back to the CI/CD variable when tests for the download work correctly.
+
+## Troubleshooting
+
+### Internal Server error on large file uploads to S3
+
+S3-compatible object storage [limits the size of a single PUT request to 5GB](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html). If the `aws_signature_version` is set to `2` in the [object storage connection settings](../../../administration/object_storage.md), attempting to publish a package file larger than the 5GB limit can result in a `HTTP 500: Internal Server Error` response.
+
+If you are receiving `HTTP 500: Internal Server Error` responses when publishing large files to S3, set the `aws_signature_version` to `4`:
+
+```ruby
+# Consolidated Object Storage settings
+gitlab_rails['object_store']['connection'] = {
+ # Other connection settings
+ `aws_signature_version` => '4'
+}
+# OR
+# Storage-specific form settings
+gitlab_rails['packages_object_store_connection'] = {
+ # Other connection settings
+ `aws_signature_version` => '4'
+}
+```
diff --git a/doc/user/packages/helm_repository/index.md b/doc/user/packages/helm_repository/index.md
index 88ea5afad3c..07e853fa18c 100644
--- a/doc/user/packages/helm_repository/index.md
+++ b/doc/user/packages/helm_repository/index.md
@@ -69,6 +69,11 @@ Once built, a chart can be uploaded to the desired channel with `curl` or `helm
- `<project_id>`: the project ID (like `42`).
- `<channel>`: the name of the channel (like `stable`).
+### Release channels
+
+You can publish Helm charts to channels in GitLab. Channels are a method you can use to differentiate Helm chart repositories.
+For example, you can use `stable` and `devel` as channels to allow users to add the `stable` repo while `devel` charts are isolated.
+
## Use CI/CD to publish a Helm package
To publish a Helm package automated through [GitLab CI/CD](../../../ci/index.md), you can use
diff --git a/doc/user/packages/infrastructure_registry/index.md b/doc/user/packages/infrastructure_registry/index.md
index 551289a575a..e6a179c9d12 100644
--- a/doc/user/packages/infrastructure_registry/index.md
+++ b/doc/user/packages/infrastructure_registry/index.md
@@ -85,3 +85,19 @@ You can also remove the Infrastructure Registry for a specific project:
1. Select **Save changes**.
To enable it back, follow the same steps above and toggle it on (in blue).
+
+## How module resolution works
+
+When you upload a new module, GitLab generates a path for the module, for example, `https://gitlab.example.com/parent-group/my-infra-package`.
+
+- This path conforms with [the Terraform spec](https://www.terraform.io/internals/module-registry-protocol).
+- The name of the path must be unique within the namespace.
+
+For projects in subgroups, GitLab checks that the module name does not already exist anywhere in the namespace, including all subgroups and the parent group.
+
+For example, if:
+
+- The project is `gitlab.example.com/parent-group/sub-group/my-project`.
+- The infrastructure package is `my-infra-package`.
+
+The project name must be unique in all projects in all groups under `parent-group`.
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index bdcbea68568..7ea3c1aa0c8 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -145,6 +145,9 @@ If you encounter an error with [Yarn](https://classic.yarnpkg.com/en/), view
#### Instance-level npm endpoint
+NOTE:
+Note: Using `CI_JOB_TOKEN` to install npm packages with dependencies in another project will give you 404 errors. You can use a [personal access token](../../profile/personal_access_tokens.md) as a workaround. [GitLab-#352962](https://gitlab.com/gitlab-org/gitlab/-/issues/352962) proposes a fix to this bug.
+
To use the [instance-level](#use-the-gitlab-endpoint-for-npm-packages) npm endpoint, set your npm configuration:
```shell
@@ -232,6 +235,12 @@ When you use the [instance-level endpoint](#use-the-gitlab-endpoint-for-npm-pack
example, a package `@MyScope/package-name` in GitLab becomes `@myscope/package-name` for npm.
- The `package-name` can be whatever you want.
+NOTE:
+The value used for the `@scope` is the root of the project that will end up hosting the packages and not the root
+of the project with the source code of the package itself. For example, assume your package source code is located
+at `source-code-group/package-code` and deployed to a package registry inside `registries-group/registry-project`.
+In this case, the `@scope` needs to be `@registries-group` and not `@source-code-group`.
+
For example, if your project is `https://gitlab.example.com/my-org/engineering-group/team-amazing/analytics`,
the root namespace is `my-org`. When you publish a package, it must have `my-org` as the scope.
diff --git a/doc/user/packages/package_registry/reduce_package_registry_storage.md b/doc/user/packages/package_registry/reduce_package_registry_storage.md
index ed4ef1665bc..4a03bd9e8a0 100644
--- a/doc/user/packages/package_registry/reduce_package_registry_storage.md
+++ b/doc/user/packages/package_registry/reduce_package_registry_storage.md
@@ -50,3 +50,39 @@ To delete package files in the UI, from your group or project:
1. Expand the ellipsis and select **Delete file**.
The package files are permanently deleted.
+
+## Cleanup policy
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/346153) in GitLab 15.2.
+
+Depending on the number of packages to remove, the process of manually deleting the packages can take a long time to finish.
+A cleanup policy defines a set of rules that, applied to a project, defines which package files you can automatically delete.
+
+### Enable the cleanup policy
+
+By default, the packages cleanup policy is disabled. To enable it:
+
+1. Go to your project **Settings > Packages & Registries**.
+1. Expand **Manage storage used by package assets**.
+1. Set the rules appropriately.
+
+NOTE:
+To access these project settings, you must be at least a maintainer on the related project.
+
+### Available rules
+
+- `Number of duplicated assets to keep`. The number of duplicated assets to keep. Some package formats allow you
+ to upload more than one copy of an asset. You can limit the number of duplicated assets to keep and automatically
+ delete the oldest files once the limit is reached.
+
+### Set cleanup limits to conserve resources
+
+A background process executes the package-cleanup policies. This process can take a long time to finish and consumes
+server resources while it is running.
+
+You can use the following setting to limit the number of cleanup workers:
+
+- `package_registry_cleanup_policies_worker_capacity`: the maximum number of cleanup workers running concurrently.
+ This number must be greater than or equal to `0`.
+ We recommend starting with a low number and increasing it after monitoring the resources used by the background workers.
+ To remove all workers and not execute the cleanup policies, set this to `0`. The default value is `2`.
diff --git a/doc/user/packages/pypi_repository/index.md b/doc/user/packages/pypi_repository/index.md
index eee6d55a3ce..b8996dc2963 100644
--- a/doc/user/packages/pypi_repository/index.md
+++ b/doc/user/packages/pypi_repository/index.md
@@ -99,45 +99,54 @@ Hello from MyPyPiPackage
After you create a project, you can create a package.
1. In your terminal, go to the `MyPyPiPackage` directory.
-1. Create a `setup.py` file:
+1. Create a `pyproject.toml` file:
```shell
- touch setup.py
+ touch pyproject.toml
```
This file contains all the information about the package. For more information
- about this file, see [creating setup.py](https://packaging.python.org/tutorials/packaging-projects/#creating-setup-py).
+ about this file, see [creating `pyproject.toml`](https://packaging.python.org/en/latest/tutorials/packaging-projects/#creating-pyproject-toml).
Because GitLab identifies packages based on
[Python normalized names (PEP-503)](https://www.python.org/dev/peps/pep-0503/#normalized-names),
ensure your package name meets these requirements. See the [installation section](#authenticate-with-a-ci-job-token)
for details.
-1. Open the `setup.py` file, and then add basic information:
-
- ```python
- import setuptools
-
- setuptools.setup(
- name="mypypipackage",
- version="0.0.1",
- author="Example Author",
- author_email="author@example.com",
- description="A small example package",
- packages=setuptools.find_packages(),
- classifiers=[
- "Programming Language :: Python :: 3",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- ],
- python_requires='>=3.6',
- )
+1. Open the `pyproject.toml` file, and then add basic information:
+
+ ```toml
+ [build-system]
+ requires = ["setuptools>=61.0"]
+ build-backend = "setuptools.build_meta"
+
+ [project]
+ name = "mypypipackage"
+ version = "0.0.1"
+ authors = [
+ { name="Example Author", email="author@example.com" },
+ ]
+ description = "A small example package"
+ requires-python = ">=3.7"
+ classifiers = [
+ "Programming Language :: Python :: 3",
+ "Operating System :: OS Independent",
+ ]
+
+ [tool.setuptools.packages]
+ find = {}
```
1. Save the file.
-1. Execute the setup:
+1. Install the package build library:
+
+ ```shell
+ pip install build
+ ```
+
+1. Build the package:
```shell
- python3 setup.py sdist bdist_wheel
+ python -m build
```
The output should be visible in a newly-created `dist` folder:
@@ -218,8 +227,8 @@ image: python:latest
run:
script:
- - pip install twine
- - python setup.py sdist bdist_wheel
+ - pip install build twine
+ - python -m build
- TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
```
diff --git a/doc/user/packages/terraform_module_registry/index.md b/doc/user/packages/terraform_module_registry/index.md
index 42c85ae9d41..2668b8b35ac 100644
--- a/doc/user/packages/terraform_module_registry/index.md
+++ b/doc/user/packages/terraform_module_registry/index.md
@@ -108,7 +108,7 @@ Where `<namespace>` is the [namespace](../../../user/group/index.md#namespaces)
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:
+For example, this job uploads a new module for the `local` [system provider](https://registry.terraform.io/browse/providers) and uses the module version from the Git commit tag:
```yaml
stages:
@@ -121,15 +121,18 @@ upload:
TERRAFORM_MODULE_DIR: ${CI_PROJECT_DIR} # The path to your Terraform module
TERRAFORM_MODULE_NAME: ${CI_PROJECT_NAME} # The name of your Terraform module
TERRAFORM_MODULE_SYSTEM: local # The system or provider your Terraform module targets (ex. local, aws, google)
- TERRAFORM_MODULE_VERSION: ${CI_COMMIT_TAG} # The version of your Terraform module to be published to your project's registry
+ TERRAFORM_MODULE_VERSION: ${CI_COMMIT_TAG} # Tag commits with SemVer for the version of your Terraform module to be published
script:
- - tar -cvzf ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz -C ${TERRAFORM_MODULE_DIR} --exclude=./.git .
- - 'curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/terraform/modules/${TERRAFORM_MODULE_NAME}/${TERRAFORM_MODULE_SYSTEM}/${TERRAFORM_MODULE_VERSION}/file'
+ - TERRAFORM_MODULE_NAME=$(echo "${TERRAFORM_MODULE_NAME}" | tr " _" -) # module-name must not have spaces or underscores, so translate them to hyphens
+ - tar -vczf ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz -C ${TERRAFORM_MODULE_DIR} --exclude=./.git .
+ - 'curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}"
+ --upload-file ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz
+ ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/terraform/modules/${TERRAFORM_MODULE_NAME}/${TERRAFORM_MODULE_SYSTEM}/${TERRAFORM_MODULE_VERSION}/file'
rules:
- if: $CI_COMMIT_TAG
```
-To trigger this upload job, add a Git tag to your commit. The `rules:if: $CI_COMMIT_TAG` defines this so that not every commit to your repo triggers the upload.
+To trigger this upload job, add a Git tag to your commit. Ensure the tag follows the [Semantic Versioning Specification](https://semver.org/) that Terraform requires. The `rules:if: $CI_COMMIT_TAG` ensures that only tagged commits to your repo trigger the module upload job.
For other ways to control jobs in your CI/CD pipeline, refer to the [`.gitlab-ci.yml`](../../../ci/yaml/index.md) keyword reference.
## Example projects
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 801c107e371..b01bfbef3aa 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -63,13 +63,12 @@ The following table lists project permissions available for each role:
| [Analytics](analytics/index.md):<br>View [CI/CD analytics](analytics/ci_cd_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
| [Analytics](analytics/index.md):<br>View [code review analytics](analytics/code_review_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
| [Analytics](analytics/index.md):<br>View [repository analytics](analytics/repository_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>View licenses in [dependency list](application_security/dependency_list/index.md) | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>View licenses in [dependency list](application_security/dependency_list/index.md) | | | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create and run [on-demand DAST scans](application_security/dast/index.md#on-demand-scans) | | | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Manage [security policy](application_security/policies/index.md) | | | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>View [dependency list](application_security/dependency_list/index.md) | | | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create a [CVE ID Request](application_security/cve_id_request.md) | | | | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create or assign [security policy project](application_security/policies/index.md) | | | | | ✓ |
-| [Clusters](infrastructure/clusters/index.md):<br>View [pod logs](project/clusters/kubernetes_pod_logs.md) | | | ✓ | ✓ | ✓ |
| [Clusters](infrastructure/clusters/index.md):<br>View clusters | | | ✓ | ✓ | ✓ |
| [Clusters](infrastructure/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete [cleanup policies](packages/container_registry/index.md#delete-images-by-using-a-cleanup-policy) | | | | ✓ | ✓ |
@@ -265,7 +264,7 @@ More details about the permissions for some project-level features follow.
| View pipeline details page | ✓ (*1*) | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
| View pipelines page | ✓ (*1*) | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
| View pipelines tab in MR | ✓ (*3*) | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
-| [View vulnerabilities in a pipeline](application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline) | | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
+| [View vulnerabilities in a pipeline](application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline) | | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
| View and download project-level [Secure Files](../api/secure_files.md) | | | | ✓ | ✓ | ✓ |
| Cancel and retry jobs | | | | ✓ | ✓ | ✓ |
| Create new [environments](../ci/environments/index.md) | | | | ✓ | ✓ | ✓ |
@@ -432,6 +431,7 @@ The following table lists group permissions available for each role:
| View group [Usage Quotas](usage_quotas.md) page | | | | | ✓ (4) |
| Manage group runners | | | | | ✓ |
| [Migrate groups](group/import/index.md) | | | | | ✓ |
+| Manage [subscriptions, and purchase CI/CD minutes and storage](../subscriptions/gitlab_com/index.md) | | | | | ✓ |
<!-- markdownlint-disable MD029 -->
diff --git a/doc/user/profile/account/create_accounts.md b/doc/user/profile/account/create_accounts.md
index 7e1074aa50f..694ed02a694 100644
--- a/doc/user/profile/account/create_accounts.md
+++ b/doc/user/profile/account/create_accounts.md
@@ -9,32 +9,35 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can create users:
-- Manually through the sign in page or Administrator Area.
-- Automatically through user authentication integrations.
+- [Manually through the sign-in page](#create-users-on-sign-in-page).
+- [Manually in the Admin Area](#create-users-in-admin-area).
+- [Manually using the API](../../../api/users.md).
+- [Automatically through user authentication integrations](#create-users-through-authentication-integrations).
-## Create users on sign in page
+## Create users on sign-in page
-If you have [sign-up enabled](../../admin_area/settings/sign_up_restrictions.md), users can create
-their own accounts by either:
+Prerequisites:
-- Selecting the **Register now** link on the sign-in page.
-- Navigating to `https://gitlab.example.com/users/sign_up`.
+- [Sign-up enabled](../../admin_area/settings/sign_up_restrictions.md)
+
+Users can create their own accounts by either:
-![Register Tab](img/register_v13_6.png)
+- Selecting the **Register now** link on the sign-in page.
+- Navigating to your GitLab instance's sign-up link. For example: `https://gitlab.example.com/users/sign_up`.
## Create users in Admin Area
-As an Administrator user, you can manually create users:
+Prerequisites:
+
+- You must have administrator access for the instance.
+
+To create a user manually:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Overview > Users** (`/admin/users`).
1. Select **New user**.
-
-You can also [create users through the API](../../../api/users.md) as an administrator.
-
-![Administrator User Button](img/admin_user_button.png)
-
-![Administrator User Form](img/admin_user_form.png)
+1. Complete the fields.
+1. Select **Create user**.
## Create users through authentication integrations
diff --git a/doc/user/profile/account/img/admin_user_button.png b/doc/user/profile/account/img/admin_user_button.png
deleted file mode 100644
index 506e16bb8ca..00000000000
--- a/doc/user/profile/account/img/admin_user_button.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/profile/account/img/admin_user_form.png b/doc/user/profile/account/img/admin_user_form.png
deleted file mode 100644
index aebc31ee3ff..00000000000
--- a/doc/user/profile/account/img/admin_user_form.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/profile/account/img/register_v13_6.png b/doc/user/profile/account/img/register_v13_6.png
deleted file mode 100644
index ce4adc0f55b..00000000000
--- a/doc/user/profile/account/img/register_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index 2dbeaae2267..4563cfe5648 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -59,11 +59,12 @@ To enable 2FA with a one-time password:
1. Select **Enable Two-factor Authentication**.
1. **On your device (usually your phone):**
1. Install a compatible application. For example:
+ - [Aegis](https://getaegis.app/)
+ - [Raivo OTP](https://apps.apple.com/us/app/raivo-otp/id1459042137#platform=iphone)
- [Authy](https://authy.com/)
- [Duo Mobile](https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app)
- [LastPass Authenticator](https://lastpass.com/auth/)
- [Authenticator](https://mattrubin.me/authenticator/)
- - [andOTP](https://github.com/andOTP/andOTP)
- [Google Authenticator](https://support.google.com/accounts/answer/1066447?hl=en)
- [Microsoft Authenticator](https://www.microsoft.com/en-us/security/mobile-authenticator-app)
- [SailOTP](https://openrepos.net/content/seiichiro0185/sailotp)
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index 07f21da3099..bf696310158 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -130,7 +130,7 @@ GitLab displays the contents of your README below your contribution graph.
### From an existing project
To add the README from an existing project to your profile,
-[update the path](../project/settings/index.md#renaming-a-repository) of the project
+[update the path](../project/settings/index.md#rename-a-repository) of the project
to match your username.
## Add external accounts to your user profile page
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index af84b746280..427c412219a 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -145,7 +145,7 @@ To create a personal access token programmatically:
```
This code can be shortened into a single-line shell command by using the
-[Rails runner](../../administration/troubleshooting/debug.md#using-the-rails-runner):
+[Rails runner](../../administration/operations/rails_console.md#using-the-rails-runner):
```shell
sudo gitlab-rails runner "token = User.find_by_username('automation-bot').personal_access_tokens.create(scopes: [:read_user, :read_repository], name: 'Automation token'); token.set_token('token-string-here123'); token.save!"
@@ -177,7 +177,7 @@ To revoke a token programmatically:
```
This code can be shortened into a single-line shell command using the
-[Rails runner](../../administration/troubleshooting/debug.md#using-the-rails-runner):
+[Rails runner](../../administration/operations/rails_console.md#using-the-rails-runner):
```shell
sudo gitlab-rails runner "PersonalAccessToken.find_by_token('token-string-here123').revoke!"
diff --git a/doc/user/project/clusters/img/kubernetes_pod_logs_v12_10.png b/doc/user/project/clusters/img/kubernetes_pod_logs_v12_10.png
deleted file mode 100644
index abac22e3f1f..00000000000
--- a/doc/user/project/clusters/img/kubernetes_pod_logs_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/img/pod_logs_deploy_board.png b/doc/user/project/clusters/img/pod_logs_deploy_board.png
deleted file mode 100644
index 7f83382968b..00000000000
--- a/doc/user/project/clusters/img/pod_logs_deploy_board.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/kubernetes_pod_logs.md b/doc/user/project/clusters/kubernetes_pod_logs.md
index 58006c29057..bd87ab1024d 100644
--- a/doc/user/project/clusters/kubernetes_pod_logs.md
+++ b/doc/user/project/clusters/kubernetes_pod_logs.md
@@ -2,120 +2,11 @@
stage: Monitor
group: Respond
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
+remove_date: '2022-18-10'
+redirect_to: '../../clusters/agent/index.md'
---
-# Kubernetes Logs (DEPRECATED) **(FREE SELF)**
+# Kubernetes Logs (removed) **(FREE SELF)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4752) in GitLab 11.0.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26383) from GitLab Ultimate to GitLab Free 12.9.
-> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/360182) behind a [feature flag](../../../administration/feature_flags.md) named `monitor_logging` in GitLab 15.0. Disabled by default.
-> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
-
-WARNING:
-This feature is in its end-of-life process.
-This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
-It will be [removed completely](https://gitlab.com/gitlab-org/gitlab/-/issues/346485) in GitLab 15.2.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `monitor_logging` and the one named `certificate_based_clusters`.
-On GitLab.com, this feature is not available.
-This feature is not recommended for production use.
-
-GitLab makes it easy to view the logs of running pods in
-[connected Kubernetes clusters](index.md). By displaying the logs directly in GitLab
-in the **Log Explorer**, developers can avoid managing console tools or jumping
-to a different interface. The **Log Explorer** interface provides a set of filters
-above the log file data, depending on your configuration:
-
-![Pod logs](img/kubernetes_pod_logs_v12_10.png)
-
-- **Namespace** - Select the environment to display. Users with Maintainer or
- greater [permissions](../../permissions.md) can also see pods in the
- `gitlab-managed-apps` namespace.
-- **Search** - Only available if the [Elastic Stack integration](../../clusters/integrations.md#elastic-stack-cluster-integration) is enabled.
-- **Select time range** - Select the range of time to display.
- Only available if the [Elastic Stack integration](../../clusters/integrations.md#elastic-stack-cluster-integration) is enabled.
-- **Scroll to bottom** **{scroll_down}** - Scroll to the end of the displayed logs.
-- **Refresh** **{retry}** - Reload the displayed logs.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-To learn more about the Log Explorer, see [APM - Log Explorer](https://www.youtube.com/watch?v=hWclZHA7Dgw).
-
-[Learn more about Kubernetes + GitLab](https://about.gitlab.com/solutions/kubernetes/).
-Everything you need to build, test, deploy, and run your application at scale.
-
-## Requirements
-
-[Deploying to a Kubernetes environment](../deploy_boards.md#enabling-deploy-boards)
-is required to use Logs.
-
-## Accessing the log explorer
-
-To access the **Log explorer**, select the **More actions** **{ellipsis_v}** menu on
-a [metrics dashboard](../../../operations/metrics/index.md) and select **View logs**, or:
-
-1. Sign in as a user with the _View pod logs_
- [permissions](../../permissions.md#project-members-permissions) in the project.
-1. To navigate to the **Log Explorer** from the sidebar menu, go to **Monitor > Logs**
- ([Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22011) in GitLab 12.5.).
-1. To navigate to the **Log Explorer** from a specific pod on a [deploy board](../deploy_boards.md):
-
- 1. Go to **Deployments > Environments** and find the environment
- which contains the desired pod, like `production`.
- 1. On the **Environments** page, you should see the status of the environment's
- pods with [deploy boards](../deploy_boards.md).
- 1. When mousing over the list of pods, GitLab displays a tooltip with the exact pod name
- and status.
- ![deploy boards pod list](img/pod_logs_deploy_board.png)
- 1. Select the desired pod to display the **Log Explorer**.
-
-### Logs view
-
-The **Log Explorer** lets you filter the logs by:
-
-- Pods.
-- [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/5769), environments.
-- [From GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21656),
- [full text search](#full-text-search).
-- [From GitLab 12.8](https://gitlab.com/gitlab-org/gitlab/-/issues/197879), dates.
-- [From GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/208790), managed apps.
-
-Loading more than 500 log lines is possible from
-[GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/198050) onward.
-
-Support for pods with multiple containers is coming
-[in a future release](https://gitlab.com/gitlab-org/gitlab/-/issues/13404).
-
-Support for historical data is coming
-[in a future release](https://gitlab.com/gitlab-org/gitlab/-/issues/196191).
-
-### Filter by date
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/197879) in GitLab 12.8.
-
-When you enable [Elastic Stack](../../clusters/integrations.md#elastic-stack-cluster-integration)
-on your cluster, you can filter logs displayed in the **Log Explorer** by date.
-
-Select **Show last** in the **Log Explorer** to see the available options.
-
-### Full text search
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21656) in GitLab 12.7.
-
-When you enable [Elastic Stack](../../clusters/integrations.md#elastic-stack-cluster-integration) on your cluster,
-you can search the content of your logs through a search bar. The search is passed
-to Elasticsearch using the
-[simple_query_string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html)
-Elasticsearch function, which supports the following operators:
-
-| Operator | Description |
-|----------------------------|-------------------------------------------------------------|
-| `\|` | An `OR` operation. |
-| `-` | Negates a single token. |
-| `+` | An `AND` operation. |
-| `"` | Wraps a number of tokens to signify a phrase for searching. |
-| `*` (at the end of a term) | A prefix query. |
-| `(` and `)` | Precedence. |
-| `~N` (after a word) | Edit distance (fuzziness). |
-| `~N` (after a phrase) | Slop amount. |
+This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5
+and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/360193) in GitLab 15.2.
diff --git a/doc/user/project/code_owners.md b/doc/user/project/code_owners.md
index 197a995952a..adea5dad7b8 100644
--- a/doc/user/project/code_owners.md
+++ b/doc/user/project/code_owners.md
@@ -85,6 +85,12 @@ Inviting **Subgroup Y** to a parent group of **Project A**
[is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/288851). To set **Subgroup Y** as
Code Owners, add this group directly to the project itself.
+NOTE:
+For approval to be required, groups as Code Owners must have a direct membership
+(not inherited membership) in the project. Approval can only be optional for groups
+that inherit membership. Members in the Code Owners group also must be direct members,
+and not inherit membership from any parent groups.
+
### Add a group as a Code Owner
To set a group as a Code Owner:
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index 8f1da4b278a..c64afd95d8d 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -82,7 +82,7 @@ Prerequisites:
A project deploy key is enabled when it is created. You can modify only a project deploy key's
name and permissions.
-## Create a public deploy key
+## Create a public deploy key **(FREE SELF)**
Prerequisites:
diff --git a/doc/user/project/highlighting.md b/doc/user/project/highlighting.md
index 37ec7c8e8d3..1d62cd00b31 100644
--- a/doc/user/project/highlighting.md
+++ b/doc/user/project/highlighting.md
@@ -7,7 +7,7 @@ type: reference
# Syntax Highlighting **(FREE)**
-GitLab provides syntax highlighting on all files through the
+GitLab provides syntax highlighting on all files through [Highlight.js](https://github.com/highlightjs/highlight.js/) and the
[Rouge](https://rubygems.org/gems/rouge) Ruby gem. It attempts to guess what language
to use based on the file extension, which most of the time is sufficient.
diff --git a/doc/user/project/img/labels_drag_priority_v12_1.gif b/doc/user/project/img/labels_drag_priority_v12_1.gif
deleted file mode 100644
index a568490da5f..00000000000
--- a/doc/user/project/img/labels_drag_priority_v12_1.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/time_tracking_report_v15_1.png b/doc/user/project/img/time_tracking_report_v15_1.png
index a9ddefebb2f..4eeccf8a684 100644
--- a/doc/user/project/img/time_tracking_report_v15_1.png
+++ b/doc/user/project/img/time_tracking_report_v15_1.png
Binary files differ
diff --git a/doc/user/project/import/bitbucket.md b/doc/user/project/import/bitbucket.md
index b2425686024..dff5a602e8a 100644
--- a/doc/user/project/import/bitbucket.md
+++ b/doc/user/project/import/bitbucket.md
@@ -58,7 +58,7 @@ For user contributions to be mapped, each user must complete the following befor
If they don't match, modify the public name in the Atlassian account settings to match the
username in the Bitbucket account settings.
-1. Connect your Bitbucket account in [GitLab profile social sign-in](https://gitlab.com/-/profile/account).
+1. Connect your Bitbucket account in [GitLab profile service sign-in](https://gitlab.com/-/profile/account).
1. [Set your public email](../../profile/index.md#set-your-public-email).
@@ -97,16 +97,16 @@ If you've accidentally started the import process with the wrong account, follow
the username in the Bitbucket account settings must match the public name in the Atlassian account
settings. If these names match but user mapping still fails, the user may have modified their
Bitbucket username after connecting their Bitbucket account in the
-[GitLab profile social sign-in](https://gitlab.com/-/profile/account).
+[GitLab profile service sign-in](https://gitlab.com/-/profile/account).
To fix this, the user must verify that their Bitbucket external UID in the GitLab database matches their
current Bitbucket public name, and reconnect if there's a mismatch:
-1. [Use the API to get the currently authenticated user](../../../api/users.md#list-current-user-for-normal-users).
+1. [Use the API to get the currently authenticated user](../../../api/users.md#for-normal-users-1).
1. In the API's response, the `identities` attribute contains the Bitbucket account that exists in
the GitLab database. If the `extern_uid` doesn't match the current Bitbucket public name, the
- user should reconnect their Bitbucket account in the [GitLab profile social sign-in](https://gitlab.com/-/profile/account).
+ user should reconnect their Bitbucket account in the [GitLab profile service sign-in](https://gitlab.com/-/profile/account).
1. Following reconnection, the user should use the API again to verify that their `extern_uid` in
the GitLab database now matches their current Bitbucket public name.
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index 60a4ca5c0ea..e4ae0c4b29b 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -150,7 +150,7 @@ There are numerous [APIs](../../api/index.md) to use with your projects:
- [Traffic](../../api/project_statistics.md)
- [Variables](../../api/project_level_variables.md)
- [Aliases](../../api/project_aliases.md)
-- [DORA4 Analytics](../../api/dora4_project_analytics.md)
+- [DORA4 Analytics](../../api/dora/metrics.md)
## DORA4 analytics overview
@@ -158,4 +158,4 @@ Project details include the following analytics:
- Deployment Frequency
-For more information, see [DORA4 Project Analytics API](../../api/dora4_project_analytics.md).
+For more information, see [DORA4 Project Analytics API](../../api/dora/metrics.md).
diff --git a/doc/user/project/integrations/bamboo.md b/doc/user/project/integrations/bamboo.md
index 22e6d45dd96..75f099268cb 100644
--- a/doc/user/project/integrations/bamboo.md
+++ b/doc/user/project/integrations/bamboo.md
@@ -9,11 +9,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can automatically trigger builds in Atlassian Bamboo when you push changes
to your project in GitLab.
-When this integration is configured, merge requests also display the following information:
-
-- A CI/CD status that shows if the build is pending, failed, or has completed successfully.
-- A link to the Bamboo build page for more information.
-
Bamboo doesn't provide the same features as a traditional build system when
accepting webhooks and commit data. You must configure a Bamboo
build plan before you configure the integration in GitLab.
@@ -66,6 +61,65 @@ for example `PROJ-PLAN`.
The build key is included in the browser URL when you view a plan in
Bamboo. For example, `https://bamboo.example.com/browse/PROJ-PLAN`.
+## Update Bamboo build status in GitLab
+
+You can use a script that uses the [commit status API](../../../api/commits.md#post-the-build-status-to-a-commit)
+and Bamboo build variables to:
+
+- Update the commit with the build status.
+- Add the Bamboo build plan URL as the commit's `target_url`.
+
+For example:
+
+1. Create an [access token](../../../api/index.md#personalprojectgroup-access-tokens) in GitLab with `:api` permissions.
+1. Save the token as a `$GITLAB_TOKEN` variable in Bamboo.
+1. Add the following script as a final task to the Bamboo plan's jobs:
+
+ ```shell
+ #!/bin/bash
+
+ # Script to update CI status on GitLab.
+ # Add this script as final inline script task in a Bamboo job.
+ #
+ # General documentation: https://docs.gitlab.com/ee/user/project/integrations/bamboo.html
+ # Fix inspired from https://gitlab.com/gitlab-org/gitlab/-/issues/34744
+
+ # Stop at first error
+ set -e
+
+ # Access token. Set this as a CI variable in Bamboo.
+ #GITLAB_TOKEN=
+
+ # Status
+ cistatus="failed"
+ if [ "${bamboo_buildFailed}" = "false" ]; then
+ cistatus="success"
+ fi
+
+ repo_url="${bamboo_planRepository_repositoryUrl}"
+
+ # Check if we use SSH or HTTPS
+ protocol=${repo_url::4}
+ if [ "$protocol" == "git@" ]; then
+ repo=${repo_url:${#protocol}};
+ gitlab_url=${repo%%:*};
+ else
+ protocol="https://"
+ repo=${repo_url:${#protocol}};
+ gitlab_url=${repo%%/*};
+ fi
+
+ start=$((${#gitlab_url} + 1)) # +1 for the / (https) or : (ssh)
+ end=$((${#repo} - $start -4)) # -4 for the .git
+ repo=${repo:$start:$end}
+ repo=$(echo "$repo" | sed "s/\//%2F/g")
+
+ # Send request
+ url="https://${gitlab_url}/api/v4/projects/${repo}/statuses/${bamboo_planRepository_revision}?state=${cistatus}&target_url=${bamboo_buildResultsUrl}"
+ echo "Sending request to $url"
+ curl --fail --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$url"
+ ```
+
## Troubleshooting
### Builds not triggered
diff --git a/doc/user/project/integrations/mock_ci.md b/doc/user/project/integrations/mock_ci.md
index 631c53dcc44..5cde17dbd83 100644
--- a/doc/user/project/integrations/mock_ci.md
+++ b/doc/user/project/integrations/mock_ci.md
@@ -6,7 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Mock CI Service **(FREE)**
-**NB: This service is only listed if you are in a development environment!**
+NOTE:
+This service is only listed if you are in a [development environment](https://gitlab.com/gitlab-org/gitlab-mock-ci-service#setup-mockci-integration)!
To set up the mock CI service server, respond to the following endpoints
diff --git a/doc/user/project/integrations/webhook_events.md b/doc/user/project/integrations/webhook_events.md
index ed62a34f6a3..32e5f949c15 100644
--- a/doc/user/project/integrations/webhook_events.md
+++ b/doc/user/project/integrations/webhook_events.md
@@ -824,6 +824,11 @@ The available values for `object_attributes.action` in the payload are:
- `unapproval`
- `merge`
+The field `object_attributes.oldrev` is only available when there are actual code changes, like:
+
+- New code is pushed.
+- A [suggestion](../merge_requests/reviews/suggestions.md) is applied.
+
Request header:
```plaintext
@@ -868,6 +873,7 @@ Payload example:
},
"object_attributes": {
"id": 99,
+ "iid": 1,
"target_branch": "master",
"source_branch": "ms-viewport",
"source_project_id": 14,
@@ -879,10 +885,12 @@ Payload example:
"milestone_id": null,
"state": "opened",
"blocking_discussions_resolved": true,
+ "work_in_progress": false,
+ "first_contribution": true,
"merge_status": "unchecked",
"target_project_id": 14,
- "iid": 1,
"description": "",
+ "url": "http://example.com/diaspora/merge_requests/1",
"source": {
"name":"Awesome Project",
"description":"Aut reprehenderit ut est.",
@@ -925,8 +933,18 @@ Payload example:
"email": "gitlabdev@dv6700.(none)"
}
},
- "work_in_progress": false,
- "url": "http://example.com/diaspora/merge_requests/1",
+ "labels": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }],
"action": "open",
"assignee": {
"name": "User1",
@@ -985,6 +1003,9 @@ Payload example:
}
```
+NOTE:
+The fields `assignee_id`, and `state` are deprecated.
+
## Wiki page events
Wiki page events are triggered when a wiki page is created, updated, or deleted.
@@ -1147,6 +1168,9 @@ Payload example:
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": null,
"finished_at": null,
+ "duration": null,
+ "queued_duration": null,
+ "failure_reason": null,
"when": "manual",
"manual": true,
"allow_failure": false,
@@ -1175,7 +1199,10 @@ Payload example:
"status": "success",
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": "2016-08-12 15:26:12 UTC",
- "finished_at": null,
+ "finished_at": "2016-08-12 15:26:29 UTC",
+ "duration": 17.0,
+ "queued_duration": 196.0,
+ "failure_reason": null,
"when": "on_success",
"manual": false,
"allow_failure": false,
@@ -1208,10 +1235,13 @@ Payload example:
"id": 378,
"stage": "test",
"name": "test-build",
- "status": "success",
+ "status": "failed",
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": "2016-08-12 15:26:12 UTC",
"finished_at": "2016-08-12 15:26:29 UTC",
+ "duration": 17.0,
+ "queued_duration": 196.0,
+ "failure_reason": "script_failure",
"when": "on_success",
"manual": false,
"allow_failure": false,
@@ -1247,6 +1277,9 @@ Payload example:
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": "2016-08-12 15:24:56 UTC",
"finished_at": "2016-08-12 15:25:26 UTC",
+ "duration": 17.0,
+ "queued_duration": 196.0,
+ "failure_reason": null,
"when": "on_success",
"manual": false,
"allow_failure": false,
@@ -1282,6 +1315,9 @@ Payload example:
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": null,
"finished_at": null,
+ "duration": null,
+ "queued_duration": null,
+ "failure_reason": null,
"when": "on_success",
"manual": false,
"allow_failure": false,
diff --git a/doc/user/project/issues/csv_import.md b/doc/user/project/issues/csv_import.md
index 2fe3d78194c..1ae57c9a883 100644
--- a/doc/user/project/issues/csv_import.md
+++ b/doc/user/project/issues/csv_import.md
@@ -6,9 +6,20 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Importing issues from CSV **(FREE)**
-Issues can be imported to a project by uploading a CSV file with the columns
-`title` and `description`. Other columns are **not** imported. If you want to
-retain columns such as labels and milestones, consider the [Move Issue feature](managing_issues.md#move-an-issue).
+You can import issues to a project by uploading a CSV file with the following columns:
+
+| Name | Required? | Description |
+|:--------------|:-----------------------|:-------------------------------------------------|
+| `title` | **{check-circle}** Yes | Issue title. |
+| `description` | **{check-circle}** Yes | Issue description. |
+| `due_date` | **{dotted-circle}** No | Issue due date in `YYYY-MM-DD` format. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91317) in GitLab 15.2. |
+
+Data in other columns is not imported.
+
+You can use the `description` field to embed [quick actions](../quick_actions.md) to add other data to the issue.
+For example, labels, assignees, and milestones.
+
+Alternatively, you can [move an issue](managing_issues.md#move-an-issue). Moving issues preserves more data.
The user uploading the CSV file is set as the author of the imported issues.
@@ -44,16 +55,22 @@ To import issues, GitLab requires CSV files have a specific format:
| double-quote character | The double-quote (`"`) character is used to quote fields, enabling the use of the column separator in a field (see the third line in the sample CSV data below). To insert a double-quote (`"`) in a quoted field use two double-quote characters in succession (`""`). |
| data rows | After the header row, following rows must use the same column order. The issue title is required, but the description is optional. |
-If you have special characters in a field, (such as `\n` or `,`), surround the
-characters with double quotes (`"`).
+If you have special characters (for example, `,` or `\n`) or multiple lines in a field (for example,
+when using [quick actions](../quick_actions.md)), surround the characters with double quotes (`"`).
+
+When using [quick actions](../quick_actions.md), each action must be on a separate line.
Sample CSV data:
```plaintext
-title,description
-My Issue Title,My Issue Description
-Another Title,"A description, with a comma"
-"One More Title","One More Description"
+title,description,due date
+My Issue Title,My Issue Description,2022-06-28
+Another Title,"A description, with a comma",
+"One More Title","One More Description",
+An Issue with Quick Actions,"Hey can we change the frontend?
+
+/assign @sjones
+/label ~frontend ~documentation",
```
### File size
diff --git a/doc/user/project/issues/img/close_issue_from_board.gif b/doc/user/project/issues/img/close_issue_from_board.gif
deleted file mode 100644
index 4814b42687b..00000000000
--- a/doc/user/project/issues/img/close_issue_from_board.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/multiple_assignees.gif b/doc/user/project/issues/img/multiple_assignees.gif
deleted file mode 100644
index 055a0efd9ae..00000000000
--- a/doc/user/project/issues/img/multiple_assignees.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/turn_off_confidentiality_v15_0.png b/doc/user/project/issues/img/turn_off_confidentiality_v15_0.png
deleted file mode 100644
index 37cbe0f4fd9..00000000000
--- a/doc/user/project/issues/img/turn_off_confidentiality_v15_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/turn_on_confidentiality_v15_0.png b/doc/user/project/issues/img/turn_on_confidentiality_v15_0.png
deleted file mode 100644
index 498867d1933..00000000000
--- a/doc/user/project/issues/img/turn_on_confidentiality_v15_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/turn_on_confidentiality_v15_1.png b/doc/user/project/issues/img/turn_on_confidentiality_v15_1.png
index 24a7ad554f8..c81ac85ab13 100644
--- a/doc/user/project/issues/img/turn_on_confidentiality_v15_1.png
+++ b/doc/user/project/issues/img/turn_on_confidentiality_v15_1.png
Binary files differ
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index fbdce211295..15d8da7f544 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -385,8 +385,6 @@ To close an issue, you can do the following:
- At the top of the issue, select **Close issue**.
- In an [issue board](../issue_board.md), drag an issue card from its list into the **Closed** list.
- ![close issue from the issue board](img/close_issue_from_board.gif)
-
### Reopen a closed issue
Prerequisites:
diff --git a/doc/user/project/issues/multiple_assignees_for_issues.md b/doc/user/project/issues/multiple_assignees_for_issues.md
index 105dcd529c8..db160b6cfe8 100644
--- a/doc/user/project/issues/multiple_assignees_for_issues.md
+++ b/doc/user/project/issues/multiple_assignees_for_issues.md
@@ -4,39 +4,22 @@ 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
---
-# Multiple Assignees for Issues **(PREMIUM)**
+# Multiple assignees for issues **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> Moved from Starter to Premium in GitLab 13.9.
-In large teams, where there is shared ownership of an issue, it can be difficult
-to track who is working on it, who already completed their contributions, who
-didn't even start yet.
+In large teams with shared ownership, it can be difficult
+to track who is working on an issue, who's already done, or who hasn't started yet.
-You can also select multiple [assignees](managing_issues.md#assignee) for an issue, making it easier to
+You can add multiple [assignees](managing_issues.md#assignee) to an issue, making it easier to
track, and making clearer who is accountable for it.
-![multiple assignees for issues](img/multiple_assignees_for_issues.png)
-
-## Use cases
-
-Consider a team formed by frontend developers, backend developers,
-UX designers, QA testers, and a product manager working together to bring an idea to
-market.
-
-Multiple Assignees for Issues makes collaboration smoother,
+Multiple assignees for issues makes collaboration smoother,
and allows shared responsibilities to be clearly displayed.
All assignees are shown across your team's workflows and receive notifications (as they
would as single assignees), simplifying communication and ownership.
-Once an assignee had their work completed, they would remove themselves as assignees, making
-it clear that their role is complete.
+After an assignee completes their work, they remove themselves as an assignee, making
+it clear that their task is complete.
-## How it works
-
-From an opened issue, expand the right sidebar, locate the assignees entry,
-and select **Edit**. From the dropdown menu, select as many users as you want
-to assign the issue to.
-
-![adding multiple assignees](img/multiple_assignees.gif)
-
-To remove an assignee, clear them from the same dropdown menu.
+![multiple assignees for issues](img/multiple_assignees_for_issues.png)
diff --git a/doc/user/project/labels.md b/doc/user/project/labels.md
index 160dade87bb..333b073ee40 100644
--- a/doc/user/project/labels.md
+++ b/doc/user/project/labels.md
@@ -441,8 +441,6 @@ This label now appears at the top of the label list, under **Prioritized Labels*
To change the relative priority of these labels, drag them up and down the list.
The labels higher in the list get higher priority.
-![Drag to change label priority](img/labels_drag_priority_v12_1.gif)
-
To learn what happens when you sort by priority or label priority, see
[Sorting and ordering issue lists](issues/sorting_issue_lists.md).
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index 7bea57d180b..ff5f2ac8cb6 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -158,7 +158,7 @@ group itself.
Prerequisites:
-- You must have the Owner role.
+- You must have the Maintainer or Owner role.
- Optional. Unassign the member from all issues and merge requests that
are assigned to them.
diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md
index 02a9b76ce38..c4ae00f3c6c 100644
--- a/doc/user/project/members/share_project_with_groups.md
+++ b/doc/user/project/members/share_project_with_groups.md
@@ -24,6 +24,13 @@ members.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/352526) in GitLab 14.9.
[Feature flag `invite_members_group_modal`](https://gitlab.com/gitlab-org/gitlab/-/issues/352526) removed.
+You can share a project only with:
+
+- Groups for which you have an explicitly defined [membership](index.md).
+- Groups that contain a nested subgroup or project for which you have an explicitly defined role.
+
+Administrators can share projects with any group in the namespace.
+
The primary mechanism to give a group of users, say 'Engineering', access to a project,
say 'Project Acme', in GitLab is to make the 'Engineering' group the owner of 'Project
Acme'. But what if 'Project Acme' already belongs to another group, say 'Open Source'?
@@ -42,12 +49,11 @@ After sharing 'Project Acme' with 'Engineering':
- The group is listed in the **Groups** tab.
- The project is listed on the group dashboard.
-You can share a project only with:
-
-- Groups for which you have an explicitly defined membership.
-- Groups that contain a nested subgroup or project for which you have an explicitly defined role.
+When you share a project, be aware of the following restrictions and outcomes:
-Administrators can share projects with any group in the system.
+- [Maximum access level](#maximum-access-level)
+- [Sharing a public project with a private group](#share-a-public-project-with-private-group)
+- [Sharing project with group lock](#share-project-with-group-lock)
## Maximum access level
@@ -61,9 +67,13 @@ in. That means you can only share down the hierarchy. For example, `group/subgro
- Can not be shared with `group`.
- Can be shared with `group/subgroup02` or `group/subgroup01/subgroup03`.
-## Share public project with private group
+## Share a public project with private group
+
+When you share a public project with a private group, be aware of the following outcomes:
-When sharing a public project with a private group, owners and maintainers of the project see the name of the group in the `members` page. Owners also have the possibility to see members of the private group they don't have access to when mentioning them in the issue or merge request.
+- The name of the group is no longer private and is visible to all users in the project members page.
+- Owners of the project have access to members of the private group when they mention them in issues or merge requests.
+- Project members who are direct or indirect members of the private group can see private group members listed in addition to members of the project.
## Share project with group lock
diff --git a/doc/user/project/merge_requests/accessibility_testing.md b/doc/user/project/merge_requests/accessibility_testing.md
index b8907532066..c1a87f7a5d4 100644
--- a/doc/user/project/merge_requests/accessibility_testing.md
+++ b/doc/user/project/merge_requests/accessibility_testing.md
@@ -1,76 +1,11 @@
---
-stage: Verify
-group: Pipeline Insights
-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: '../../../ci/testing/accessibility_testing.md'
+remove_date: '2022-08-31'
---
-# Accessibility testing **(FREE)**
+This document was moved to [another location](../../../ci/testing/accessibility_testing.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25144) in GitLab 12.8.
-
-If your application offers a web interface, you can use
-[GitLab CI/CD](../../../ci/index.md) to determine the accessibility
-impact of pending code changes.
-
-[Pa11y](https://pa11y.org/) is a free and open source tool for
-measuring the accessibility of web sites. GitLab integrates Pa11y into a
-[CI job template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml).
-The `a11y` job analyzes a defined set of web pages and reports
-accessibility violations, warnings, and notices in a file named
-`accessibility`.
-
-As of [GitLab 14.5](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73309), Pa11y uses
-[WCAG 2.1 rules](https://www.w3.org/TR/WCAG21/#new-features-in-wcag-2-1).
-
-## Accessibility merge request widget
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39425) in GitLab 13.0 behind the disabled [feature flag](../../../administration/feature_flags.md) `:accessibility_report_view`.
-> - [Feature Flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/217372) in GitLab 13.1.
-
-GitLab displays an **Accessibility Report** in the merge request widget area:
-
-![Accessibility merge request widget](img/accessibility_mr_widget_v13_0.png)
-
-## Configure accessibility testing
-
-You can run Pa11y with GitLab CI/CD using the
-[GitLab Accessibility Docker image](https://gitlab.com/gitlab-org/ci-cd/accessibility).
-
-To define the `a11y` job for GitLab 12.9 and later:
-
-1. [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)
- from your GitLab installation.
-1. Add the following configuration to your `.gitlab-ci.yml` file.
-
- ```yaml
- stages:
- - accessibility
-
- variables:
- a11y_urls: "https://about.gitlab.com https://gitlab.com/users/sign_in"
-
- include:
- - template: "Verify/Accessibility.gitlab-ci.yml"
- ```
-
-1. Customize the `a11y_urls` variable to list the URLs of the web pages to test with Pa11y.
-
-The `a11y` job in your CI/CD pipeline generates these files:
-
-- One HTML report per URL listed in the `a11y_urls` variable.
-- One file containing the collected report data. In GitLab versions 12.11 and later, this
- file is named `gl-accessibility.json`. In GitLab versions 12.10 and earlier, this file
- is named [`accessibility.json`](https://gitlab.com/gitlab-org/ci-cd/accessibility/-/merge_requests/9).
-
-You can [view job artifacts in your browser](../../../ci/pipelines/job_artifacts.md#download-job-artifacts).
-
-NOTE:
-For GitLab versions earlier than 12.9, use `include:remote` and
-link to the [current template in the default branch](https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml)
-
-NOTE:
-The job definition provided by the template does not support Kubernetes.
-
-You cannot pass configurations into Pa11y via CI configuration.
-To change the configuration, edit a copy of the template in your CI file.
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v12_7.png b/doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v12_7.png
deleted file mode 100644
index 669148a41d8..00000000000
--- a/doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v12_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v15_2.png b/doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v15_2.png
new file mode 100644
index 00000000000..37dad4e5ae8
--- /dev/null
+++ b/doc/user/project/merge_requests/approvals/img/mr_approvals_by_code_owners_v15_2.png
Binary files differ
diff --git a/doc/user/project/merge_requests/approvals/rules.md b/doc/user/project/merge_requests/approvals/rules.md
index 21cf5cca4d1..b79c8ee867f 100644
--- a/doc/user/project/merge_requests/approvals/rules.md
+++ b/doc/user/project/merge_requests/approvals/rules.md
@@ -152,9 +152,9 @@ become eligible approvers in the project. To enable this merge request approval
1. Go to your project and select **Settings > General**.
1. Expand **Merge request (MR) approvals**.
-1. Locate **Eligible users** and select the number of approvals required:
+1. Locate **All eligible users** and select the number of approvals required:
- ![MR approvals by Code Owners](img/mr_approvals_by_code_owners_v12_7.png)
+![MR approvals by Code Owners](img/mr_approvals_by_code_owners_v15_2.png)
You can also
[require code owner approval](../../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 9295ea4c310..7b865a91106 100644
--- a/doc/user/project/merge_requests/approvals/settings.md
+++ b/doc/user/project/merge_requests/approvals/settings.md
@@ -55,7 +55,7 @@ this setting, unless you configure one of these options:
> Moved to GitLab Premium in 13.9.
By default, users who commit to a merge request can still approve it. At both
-the project level or [instance level](../../../admin_area/merge_requests_approvals.md)
+the project level or [instance level](../../../admin_area/merge_requests_approvals.md),
you can prevent committers from approving merge requests that are partially
their own. To do this:
@@ -82,7 +82,7 @@ read the official Git documentation for an explanation.
## Prevent editing approval rules in merge requests
By default, users can override the approval rules you [create for a project](rules.md)
-on a per-merge request basis. If you don't want users to change approval rules
+on a per-merge-request basis. If you don't want users to change approval rules
on merge requests, you can disable this setting:
1. Go to your project and select **Settings > General**.
@@ -119,7 +119,7 @@ when more changes are added to it:
1. Select the **Remove all approvals when commits are added to the source branch** checkbox.
1. Select **Save changes**.
-Approvals aren't reset when a merge request is [rebased from the UI](../methods/index.md#rebasing-in-semi-linear-merge-methods)
+Approvals aren't reset when a merge request is [rebased from the UI](../methods/index.md#rebasing-in-semi-linear-merge-methods).
However, approvals are reset if the target branch is changed.
## Code coverage check approvals
diff --git a/doc/user/project/merge_requests/browser_performance_testing.md b/doc/user/project/merge_requests/browser_performance_testing.md
index 9c7d9e2bf19..95f749210c4 100644
--- a/doc/user/project/merge_requests/browser_performance_testing.md
+++ b/doc/user/project/merge_requests/browser_performance_testing.md
@@ -1,242 +1,11 @@
---
-stage: Verify
-group: Pipeline Insights
-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: '../../../ci/testing/browser_performance_testing.md'
+remove_date: '2022-08-31'
---
-# Browser Performance Testing **(PREMIUM)**
+This document was moved to [another location](../../../ci/testing/browser_performance_testing.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3507) in GitLab 10.3.
-
-If your application offers a web interface and you're using
-[GitLab CI/CD](../../../ci/index.md), you can quickly determine the rendering performance
-impact of pending code changes in the browser.
-
-NOTE:
-You can automate this feature in your applications by using [Auto DevOps](../../../topics/autodevops/index.md).
-
-## Overview
-
-GitLab uses [Sitespeed.io](https://www.sitespeed.io), a free and open source
-tool, for measuring the rendering performance of web sites. The
-[Sitespeed plugin](https://gitlab.com/gitlab-org/gl-performance) that GitLab built outputs
-the performance score for each page analyzed in a file called `browser-performance.json`
-this data can be shown on Merge Requests.
-
-## Use cases
-
-Consider the following workflow:
-
-1. A member of the marketing team is attempting to track engagement by adding a new tool.
-1. With browser performance metrics, they see how their changes are impacting the usability
- of the page for end users.
-1. The metrics show that after their changes, the performance score of the page has gone down.
-1. When looking at the detailed report, they see the new JavaScript library was
- included in `<head>`, which affects loading page speed.
-1. They ask for help from a front end developer, who sets the library to load asynchronously.
-1. The frontend developer approves the merge request, and authorizes its deployment to production.
-
-## How browser performance testing works
-
-First, define a job in your `.gitlab-ci.yml` file that generates the
-[Browser Performance report artifact](../../../ci/yaml/artifacts_reports.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.
-
-For an example Browser Performance job, see
-[Configuring Browser Performance Testing](#configuring-browser-performance-testing).
-
-NOTE:
-If the Browser Performance report has no data to compare, such as when you add the
-Browser Performance job in your `.gitlab-ci.yml` for the very first time,
-the Browser Performance report widget doesn't display. It must have run at least
-once on the target branch (`main`, for example), before it displays in a
-merge request targeting that branch.
-
-![Browser Performance Widget](img/browser_performance_testing.png)
-
-## Configuring Browser Performance Testing
-
-This example shows how to run the [sitespeed.io container](https://hub.docker.com/r/sitespeedio/sitespeed.io/)
-on your code by using GitLab CI/CD and [sitespeed.io](https://www.sitespeed.io)
-using Docker-in-Docker.
-
-1. First, set up GitLab Runner with a
- [Docker-in-Docker build](../../../ci/docker/using_docker_build.md#use-docker-in-docker).
-1. Configure the default Browser Performance Testing CI/CD job as follows in your `.gitlab-ci.yml` file:
-
- ```yaml
- include:
- template: Verify/Browser-Performance.gitlab-ci.yml
-
- browser_performance:
- variables:
- URL: https://example.com
- ```
-
-WARNING:
-In GitLab 13.12 and earlier, the job [was named](https://gitlab.com/gitlab-org/gitlab/-/issues/225914) `performance`.
-
-The above example:
-
-- Creates a `browser_performance` job in your CI/CD pipeline and runs sitespeed.io against the webpage you
- defined in `URL` to gather key metrics.
-- Uses a template that doesn't work with Kubernetes clusters. If you are using a Kubernetes cluster,
- use [`template: Jobs/Browser-Performance-Testing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml)
- instead.
-- Uses a CI/CD template that is included in all GitLab installations since 12.4. If you are using
- 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/artifacts_reports.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.
-
-You can also customize the jobs with CI/CD variables:
-
-- `SITESPEED_IMAGE`: Configure the Docker image to use for the job (default `sitespeedio/sitespeed.io`), but not the image version.
-- `SITESPEED_VERSION`: Configure the version of the Docker image to use for the job (default `14.1.0`).
-- `SITESPEED_OPTIONS`: Configure any additional sitespeed.io options as required (default `nil`). Refer to the [sitespeed.io documentation](https://www.sitespeed.io/documentation/sitespeed.io/configuration/) for more details.
-
-For example, you can override the number of runs sitespeed.io
-makes on the given URL, and change the version:
-
-```yaml
-include:
- template: Verify/Browser-Performance.gitlab-ci.yml
-
-browser_performance:
- variables:
- URL: https://www.sitespeed.io/
- SITESPEED_VERSION: 13.2.0
- SITESPEED_OPTIONS: -n 5
-```
-
-### Configuring degradation threshold
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27599) in GitLab 13.0.
-
-You can configure the sensitivity of degradation alerts to avoid getting alerts for minor drops in metrics.
-This is done by setting the `DEGRADATION_THRESHOLD` CI/CD variable. In the example below, the alert only shows up
-if the `Total Score` metric degrades by 5 points or more:
-
-```yaml
-include:
- template: Verify/Browser-Performance.gitlab-ci.yml
-
-browser_performance:
- variables:
- URL: https://example.com
- DEGRADATION_THRESHOLD: 5
-```
-
-The `Total Score` metric is based on sitespeed.io's [coach performance score](https://www.sitespeed.io/documentation/sitespeed.io/metrics/#performance-score). There is more information in [the coach documentation](https://www.sitespeed.io/documentation/coach/how-to/#what-do-the-coach-do).
-
-### Performance testing on Review Apps
-
-The above CI YAML configuration is great for testing against static environments, and it can
-be extended for dynamic environments, but a few extra steps are required:
-
-1. The `browser_performance` job should run after the dynamic environment has started.
-1. In the `review` job:
- 1. Generate a URL list file with the dynamic URL.
- 1. Save the file as an artifact, for example with `echo $CI_ENVIRONMENT_URL > environment_url.txt`
- in your job's `script`.
- 1. Pass the list as the URL environment variable (which can be a URL or a file containing URLs)
- to the `browser_performance` job.
-1. You can now run the sitespeed.io container against the desired hostname and
- paths.
-
-Your `.gitlab-ci.yml` file would look like:
-
-```yaml
-stages:
- - deploy
- - performance
-
-include:
- template: Verify/Browser-Performance.gitlab-ci.yml
-
-review:
- stage: deploy
- environment:
- name: review/$CI_COMMIT_REF_SLUG
- url: http://$CI_COMMIT_REF_SLUG.$APPS_DOMAIN
- script:
- - run_deploy_script
- - echo $CI_ENVIRONMENT_URL > environment_url.txt
- artifacts:
- paths:
- - environment_url.txt
- only:
- - branches
- except:
- - master
-
-browser_performance:
- dependencies:
- - review
- variables:
- URL: environment_url.txt
-```
-
-### GitLab versions 13.2 and earlier
-
-Browser Performance Testing has gone through several changes since its introduction.
-In this section we detail these changes and how you can run the test based on your
-GitLab version:
-
-- In 13.2 the feature was renamed from `Performance` to `Browser Performance` with additional
- template CI/CD variables.
-- In GitLab 12.4 [a job template was made available](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml).
-- For 11.5 to 12.3 no template is available and the job has to be defined manually as follows:
-
- ```yaml
- performance:
- stage: performance
- image: docker:git
- variables:
- URL: https://example.com
- SITESPEED_VERSION: 14.1.0
- SITESPEED_OPTIONS: ''
- services:
- - docker:stable-dind
- script:
- - mkdir gitlab-exporter
- - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
- - mkdir sitespeed-results
- - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL $SITESPEED_OPTIONS
- - mv sitespeed-results/data/performance.json performance.json
- artifacts:
- paths:
- - performance.json
- - sitespeed-results/
- reports:
- performance: performance.json
- ```
-
-- For 11.4 and earlier the job should be defined as follows:
-
- ```yaml
- performance:
- stage: performance
- image: docker:git
- variables:
- URL: https://example.com
- services:
- - docker:stable-dind
- script:
- - mkdir gitlab-exporter
- - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
- - mkdir sitespeed-results
- - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:6.3.1 --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL
- - mv sitespeed-results/data/performance.json performance.json
- artifacts:
- paths:
- - performance.json
- - sitespeed-results/
- ```
-
-Upgrading to the latest version and using the templates is recommended, to ensure
-you receive the latest updates, including updates to the sitespeed.io versions.
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/merge_requests/code_quality.md b/doc/user/project/merge_requests/code_quality.md
index 623af914692..79e590cb905 100644
--- a/doc/user/project/merge_requests/code_quality.md
+++ b/doc/user/project/merge_requests/code_quality.md
@@ -1,634 +1,11 @@
---
-stage: Secure
-group: Static Analysis
-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: '../../../ci/testing/code_quality.md'
+remove_date: '2022-08-31'
---
-# Code Quality **(FREE)**
+This document was moved to [another location](../../../ci/testing/code_quality.md).
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
-
-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 [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) 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).
-
-## Summary of features per tier
-
-Different features are available in different [GitLab tiers](https://about.gitlab.com/pricing/),
-as shown in the following table:
-
-| Capability | In Free | In Premium | In Ultimate |
-|:----------------------------------------------------------------------|:--------------------|:--------------------|:-------------------|
-| [Configure scanners](#configuring-jobs-using-variables) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [Integrate custom scanners](#implementing-a-custom-tool) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [Generate JSON or HTML report artifacts](#generate-an-html-report) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [See findings in merge request widget](#code-quality-widget) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [See reports in CI pipelines](#code-quality-reports) | **{dotted-circle}** | **{check-circle}** | **{check-circle}** |
-| [See findings in merge request diff view](#code-quality-in-diff-view) | **{dotted-circle}** | **{dotted-circle}** | **{check-circle}** |
-
-## Code Quality Widget
-
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
-
-Going a step further, GitLab can show the Code Quality report right
-in the merge request widget area if a report from the target branch is available to compare to:
-
-![Code Quality Widget](img/code_quality_widget_13_11.png)
-
-Watch a quick walkthrough of Code Quality in action:
-
-<div class="video-fallback">
- See the video: <a href="https://www.youtube.com/watch?v=B32LxtJKo9M">Code Quality: Speed Run</a>.
-</div>
-<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/B32LxtJKo9M" frameborder="0" allowfullscreen="true"> </iframe>
-</figure>
-
-NOTE:
-For one customer, the auditor found that having Code Quality, SAST, and Container Scanning all automated in GitLab CI/CD was almost better than a manual review! [Read more](https://about.gitlab.com/customers/bi_worldwide/).
-
-See also the Code Climate list of [Supported Languages for Maintainability](https://docs.codeclimate.com/docs/supported-languages-for-maintainability).
-
-## Code Quality in diff view **(ULTIMATE)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267612) in GitLab 13.11, disabled by default behind the `codequality_mr_diff` [feature flag](../../../administration/feature_flags.md).
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) in GitLab 13.12.
-> - [Disabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) in GitLab 14.0 due to [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/334116).
-> - [Inline annotation added](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) and [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) 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_2.png)
-
-## Example configuration
-
-This example shows how to run Code Quality on your code by using GitLab CI/CD and Docker.
-
-- Using shared runners, the job should be configured For the [Docker-in-Docker workflow](../../../ci/docker/using_docker_build.md#use-docker-in-docker).
-- Using private runners, there is an [alternative configuration](#set-up-a-private-runner-for-code-quality-without-docker-in-docker) recommended for running Code Quality analysis more efficiently.
-
-In either configuration, the runner must have enough disk space to handle generated Code Quality files. For example on the [GitLab project](https://gitlab.com/gitlab-org/gitlab) the files are approximately 7 GB.
-
-Once you set up GitLab Runner, include the [Code Quality template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml) in your CI configuration:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-```
-
-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/artifacts_reports.md#artifactsreportscodequality)
-that you can later download and analyze.
-
-It's also possible to override the URL to the Code Quality image by
-setting the `CODE_QUALITY_IMAGE` CI/CD variable. This is particularly useful if you want
-to lock in a specific version of Code Quality, or use a fork of it:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-
-code_quality:
- variables:
- CODE_QUALITY_IMAGE: "registry.example.com/codequality-fork:latest"
-```
-
-In [GitLab 13.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/11100), you can override the [Code Quality environment variables](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables):
-
-```yaml
-variables:
- TIMEOUT_SECONDS: 1
-
-include:
- - template: Code-Quality.gitlab-ci.yml
-```
-
-By default, report artifacts are not downloadable. If you need them downloadable on the
-job details page, you can add `gl-code-quality-report.json` to the artifact paths like so:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-
-code_quality:
- artifacts:
- paths: [gl-code-quality-report.json]
-```
-
-The included `code_quality` job is running in the `test` stage, so it needs to be included in your CI configuration, like so:
-
-```yaml
-stages:
- - test
-```
-
-NOTE:
-This information is automatically extracted and shown right in the merge request widget.
-
-WARNING:
-On self-managed instances, if a malicious actor compromises the Code Quality job
-definition they could execute privileged Docker commands on the runner
-host. Having proper access control policies mitigates this attack vector by
-allowing access only to trusted actors.
-
-### Set up a private runner for code quality without Docker-in-Docker
-
-It's possible to configure your own runners and avoid Docker-in-Docker. You can use a
-configuration that may greatly speed up job execution without requiring your runners
-to operate in privileged mode.
-
-This alternative configuration uses socket binding to share the Runner's Docker daemon
-with the job environment. Be aware that this configuration [has significant considerations](../../../ci/docker/using_docker_build.md#use-docker-socket-binding)
-to be consider, but may be preferable depending on your use case.
-
-1. Register a new runner:
-
- ```shell
- $ gitlab-runner register --executor "docker" \
- --docker-image="docker:stable" \
- --url "https://gitlab.com/" \
- --description "cq-sans-dind" \
- --tag-list "cq-sans-dind" \
- --locked="false" \
- --access-level="not_protected" \
- --docker-volumes "/cache"\
- --docker-volumes "/builds:/builds"\
- --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
- --registration-token="<project_token>" \
- --non-interactive
- ```
-
-1. **Optional, but recommended:** Set the builds directory to `/tmp/builds`,
- so job artifacts are periodically purged from the runner host. If you skip
- this step, you must clean up the default builds directory (`/builds`) yourself.
- You can do this by adding the following two flags to `gitlab-runner register`
- in the previous step.
-
- ```shell
- --builds-dir "/tmp/builds"
- --docker-volumes "/tmp/builds:/tmp/builds" # Use this instead of --docker-volumes "/builds:/builds"
- ```
-
- The resulting configuration:
-
- ```toml
- [[runners]]
- name = "cq-sans-dind"
- url = "https://gitlab.com/"
- token = "<project_token>"
- executor = "docker"
- builds_dir = "/tmp/builds"
- [runners.docker]
- tls_verify = false
- image = "docker:stable"
- privileged = false
- disable_entrypoint_overwrite = false
- oom_kill_disable = false
- disable_cache = false
- volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock", "/tmp/builds:/tmp/builds"]
- shm_size = 0
- [runners.cache]
- [runners.cache.s3]
- [runners.cache.gcs]
- ```
-
-1. Apply two overrides to the `code_quality` job created by the template:
-
- ```yaml
- include:
- - template: Code-Quality.gitlab-ci.yml
-
- code_quality:
- services: # Shut off Docker-in-Docker
- tags:
- - cq-sans-dind # Set this job to only run on our new specialized runner
- ```
-
-The end result is that:
-
-- Privileged mode is not used.
-- Docker-in-Docker is not used.
-- Docker images, including all CodeClimate images, are cached, and not re-fetched for subsequent jobs.
-
-With this configuration, the run time for a second pipeline is much shorter. For example
-this [small change](https://gitlab.com/drew/test-code-quality-template/-/merge_requests/4/diffs?commit_id=1e705607aef7236c1b20bb6f637965f3f3e53a46)
-to an [open merge request](https://gitlab.com/drew/test-code-quality-template/-/merge_requests/4/pipelines)
-running Code Quality analysis ran significantly faster the second time:
-
-![Code Quality sequential runs without DinD](img/code_quality_host_bound_sequential.png)
-
-This configuration is not possible on `gitlab.com` shared runners. Shared runners
-are configured with `privileged=true`, and they do not expose `docker.sock` into
-the job container. As a result, socket binding cannot be used to make `docker` available
-in the context of the job script.
-
-[Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-docker-in-docker)
-was chosen as an operational decision by the runner team, instead of exposing `docker.sock`.
-
-### 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/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/index.md#custom-cicd-variables).
-- For a single pipeline run:
-
- 1. Go to **CI/CD > Pipelines**
- 1. Select **Run pipeline**
- 1. Add `CODE_QUALITY_DISABLED` as the variable key, with any value.
-
-### Using with merge request pipelines
-
-The configuration provided by the Code Quality template does not let the `code_quality` job
-run on [merge request pipelines](../../../ci/pipelines/merge_request_pipelines.md).
-
-If merge request pipelines is enabled, the `code_quality:rules` must be redefined.
-
-The template has these [`rules`](../../../ci/yaml/index.md#rules) for the `code quality` job:
-
-```yaml
-code_quality:
- rules:
- - if: $CODE_QUALITY_DISABLED
- when: never
- - if: $CI_COMMIT_TAG || $CI_COMMIT_BRANCH
-```
-
-If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/index.md#workflow))
-might look like this example:
-
-```yaml
-job1:
- rules:
- - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Run job1 in merge request pipelines
- - if: $CI_COMMIT_BRANCH == "main" # Run job1 in pipelines on the main branch (but not in other branch pipelines)
- - if: $CI_COMMIT_TAG # Run job1 in pipelines for tags
-```
-
-To make these work together, you need to overwrite the code quality `rules`
-so that they match your current `rules`. From the example above, it could look like:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-
-code_quality:
- rules:
- - if: $CODE_QUALITY_DISABLED
- when: never
- - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Run code quality job in merge request pipelines
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run code quality job in pipelines on the default branch (but not in other branch pipelines)
- - if: $CI_COMMIT_TAG # Run code quality job in pipelines for tags
-```
-
-### Configure Code Quality to use a private container image registry
-
-> [Introduced](https://gitlab.com/gitlab-org/ci-cd/codequality/-/merge_requests/30) in 13.7.
-
-To reduce network time and external dependency, you can use your own
-container image registry to host the Code Quality Docker images. Because of
-the nested architecture of container execution, the registry prefix must
-be specifically configured to be passed down into CodeClimate's subsequent
-`docker pull` commands for individual engines.
-
-The following two variables can address all of the required image pulls:
-
-- `CODE_QUALITY_IMAGE`: A fully prefixed image name that can be located anywhere
- accessible from your job environment. GitLab Container Registry can be used here
- to host your own copy.
-- `CODECLIMATE_PREFIX`: The domain of your intended container image registry. This
- is a configuration option supported by [CodeClimate CLI](https://github.com/codeclimate/codeclimate/pull/948). You must:
- - Include a trailing slash (`/`).
- - Not include a protocol prefix, such as `https://`.
-
-```yaml
-include:
- - template: Jobs/Code-Quality.gitlab-ci.yml
-
-code_quality:
- variables:
- CODE_QUALITY_IMAGE: "my-private-registry.local:12345/codequality:0.85.24"
- CODECLIMATE_PREFIX: "my-private-registry.local:12345/"
-```
-
-This example is specific to GitLab Code Quality. For more general
-instructions on how to configure DinD with a registry mirror, see the
-relevant [documentation](../../../ci/docker/using_docker_build.md#enable-registry-mirror-for-dockerdind-service).
-
-## Configuring jobs using variables
-
-The Code Quality job supports environment variables that users can set to
-configure job execution at runtime.
-
-For a list of available environment variables, see
-[Environment variables](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables).
-
-## Implementing a custom tool
-
-It's possible to have a custom tool provide Code Quality reports in GitLab. To
-do this:
-
-1. Define a job in your `.gitlab-ci.yml` file that generates the
- [Code Quality report artifact](../../../ci/yaml/artifacts_reports.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).
-
-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` or `location.positions.begin.line` | The line on which the code quality violation occurred. |
-
-Example:
-
-```json
-[
- {
- "description": "'unused' is assigned a value but never used.",
- "fingerprint": "7815696ecbf1c96e6894b779456d330e",
- "severity": "minor",
- "location": {
- "path": "lib/index.js",
- "lines": {
- "begin": 42
- }
- }
- }
-]
-```
-
-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)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21527) in GitLab 12.9.
-
-![Code Quality Report](img/code_quality_report_13_11.png)
-
-After the Code Quality job completes:
-
-- Potential changes to code quality are shown directly in the merge request.
- The Code Quality widget in the merge request compares the reports from the base and head of the branch,
- then lists any violations that are resolved or created when the branch is merged.
-- The full JSON report is available as a
- [downloadable artifact](../../../ci/pipelines/job_artifacts.md#download-job-artifacts)
- for the `code_quality` job.
-- The full list of code quality violations generated by a pipeline is shown in the
- Code Quality tab of the Pipeline Details page.
-
-## 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`
-CI/CD variable to `html`. This is useful if you just want to view the report in a more
-human-readable format or to publish this artifact on GitLab Pages for even
-easier reviewing.
-
-To generate both JSON and HTML report files, add another job to your template by using `extends: code_quality`:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-
-code_quality_html:
- extends: code_quality
- variables:
- REPORT_FORMAT: html
- artifacts:
- paths: [gl-code-quality-report.html]
-```
-
-NOTE:
-Adding a job means your code is scanned twice: once to generate a JSON report and once to generate an HTML report.
-
-You can also generate _only_ an HTML report instead of the standard JSON report. To do so, set `REPORT_FORMAT` to `html` in the existing job:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-
-code_quality:
- variables:
- REPORT_FORMAT: html
- artifacts:
- paths: [gl-code-quality-report.html]
-```
-
-WARNING:
-If you only generate an HTML report, you can't see your results in the [merge request widget](#code-quality-widget), [pipeline report](#code-quality-reports), or [diff view](#code-quality-in-diff-view).
-These features require a JSON report.
-
-## Extending functionality
-
-### Using Analysis Plugins
-
-Should there be a need to extend the default functionality provided by Code Quality, as stated in [Code Quality](#code-quality), [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) are available.
-
-For example, to use the [SonarJava analyzer](https://docs.codeclimate.com/docs/sonar-java),
-add a file named `.codeclimate.yml` containing the [enablement code](https://docs.codeclimate.com/docs/sonar-java#enable-the-plugin)
-for the plugin to the root of your repository:
-
-```yaml
-version: "2"
-plugins:
- sonar-java:
- enabled: true
-```
-
-This adds SonarJava to the `plugins:` section of the [default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template)
-included in your project.
-
-Changes to the `plugins:` section do not affect the `exclude_patterns` section of the
-default `.codeclimate.yml`. See the Code Climate documentation for
-[excluding files and folders](https://docs.codeclimate.com/docs/excluding-files-and-folders)
-for more details.
-
-Here's [an example project](https://gitlab.com/jheimbuck_gl/jh_java_example_project) that uses Code Quality with a `.codeclimate.yml` file.
-
-## Use a Code Quality image hosted in a registry with untrusted certificates
-
-If you set the `CODE_QUALITY_IMAGE` to an image that is hosted in a
-Docker registry which uses a TLS certificate that is not trusted, such as
-a self-signed certificate, you can see errors like the one below:
-
-```shell
-$ docker pull --quiet "$CODE_QUALITY_IMAGE"
-Error response from daemon: Get https://gitlab.example.com/v2/: x509: certificate signed by unknown authority
-```
-
-To fix this, configure the Docker daemon to [trust certificates](https://docs.docker.com/registry/insecure/#use-self-signed-certificates)
-by putting the certificate inside of the `/etc/docker/certs.d`
-directory.
-
-This Docker daemon is exposed to the subsequent Code Quality Docker container in the
-[GitLab Code Quality template](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml#L41)
-and should be to exposed any other containers in which you want to have
-your certificate configuration apply.
-
-### Docker
-
-If you have access to GitLab Runner configuration, add the directory as a
-[volume mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section). For example:
-
-```toml
-[[runners]]
- ...
- executor = "docker"
- [runners.docker]
- ...
- privileged = true
- volumes = ["/cache", "/etc/gitlab-runner/certs/gitlab.example.com.crt:/etc/docker/certs.d/gitlab.example.com/ca.crt:ro"]
-```
-
-Replace `gitlab.example.com` with the actual domain of the registry.
-
-### Kubernetes
-
-If you have access to GitLab Runner configuration and the Kubernetes cluster,
-you can [mount a ConfigMap](https://docs.gitlab.com/runner/executors/kubernetes.html#configmap-volumes):
-
-1. Create a ConfigMap with the certificate:
-
- ```shell
- kubectl create configmap registry-crt --namespace gitlab-runner --from-file /etc/gitlab-runner/certs/gitlab.example.com.crt
- ```
-
-1. Update GitLab Runner `config.toml` to specify the ConfigMap:
-
- ```toml
- [[runners]]
- ...
- executor = "kubernetes"
- [runners.kubernetes]
- image = "alpine:3.12"
- privileged = true
- [[runners.kubernetes.volumes.config_map]]
- name = "registry-crt"
- mount_path = "/etc/docker/certs.d/gitlab.example.com/ca.crt"
- sub_path = "gitlab.example.com.crt"
- ```
-
-Replace `gitlab.example.com` with the actual domain of the registry.
-
-## Troubleshooting
-
-### Changing the default configuration has no effect
-
-A common issue is that the terms `Code Quality` (GitLab specific) and `Code Climate`
-(Engine used by GitLab) are very similar. You must add a **`.codeclimate.yml`** file
-to change the default configuration, **not** a `.codequality.yml` file. If you use
-the wrong filename, the [default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template)
-is still used.
-
-### No Code Quality report is displayed in a merge request
-
-This can be due to multiple reasons:
-
-- You just added the Code Quality job in your `.gitlab-ci.yml`. The report does not
- have anything to compare to yet, so no information can be displayed. It only displays
- after future merge requests have something to compare to.
-- 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. In this situation you will see an error stating `Base pipeline codequality artifact not found`.
-- If no [degradation or error is detected](https://docs.codeclimate.com/docs/maintainability#section-checks),
- nothing is displayed.
-- The [`artifacts:expire_in`](../../../ci/yaml/index.md#artifactsexpire_in) CI/CD
- setting can cause the Code Quality artifacts 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.
-- Large `gl-code-quality-report.json` files (esp. >10 MB) are [known to prevent the report from being displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/2737).
- As a work-around, try removing [properties](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types)
- that are [ignored by GitLab](#implementing-a-custom-tool). You can:
- - Configure the Code Quality tool to not output those types.
- - Use `sed`, `awk` or similar commands in the `.gitlab-ci.yml` script to
- edit the `gl-code-quality-report.json` before the job completes.
-
-### Only a single Code Quality report is displayed, but more are defined
-
-GitLab only uses the Code Quality artifact from the latest created job (with the largest job ID).
-If multiple jobs in a pipeline generate a code quality artifact, those of earlier jobs are ignored.
-To avoid confusion, configure only one job to generate a `gl-code-quality-report.json`.
-
-### RuboCop errors
-
-When using Code Quality jobs on a Ruby project, you can encounter problems running RuboCop.
-For example, the following error can appear when using either a very recent or very old version
-of Ruby:
-
-```plaintext
-/usr/local/bundle/gems/rubocop-0.52.1/lib/rubocop/config.rb:510:in `check_target_ruby':
-Unknown Ruby version 2.7 found in `.ruby-version`. (RuboCop::ValidationError)
-Supported versions: 2.1, 2.2, 2.3, 2.4, 2.5
-```
-
-This is caused by the default version of RuboCop used by the check engine not covering
-support for the Ruby version in use.
-
-To use a custom version of RuboCop that
-[supports the version of Ruby used by the project](https://docs.rubocop.org/rubocop/compatibility.html#support-matrix),
-you can [override the configuration through a `.codeclimate.yml` file](https://docs.codeclimate.com/docs/rubocop#using-rubocops-newer-versions)
-created in the project repository.
-
-For example, to specify using RuboCop release **0.67**:
-
-```yaml
-version: "2"
-plugins:
- rubocop:
- enabled: true
- channel: rubocop-0-67
-```
-
-### No Code Quality appears on merge requests when using custom tool
-
-If your merge requests do not show any code quality changes when using a custom tool,
-ensure that the line property is an `integer`.
-
-### Code Quality CI job with Code Climate plugins enabled fails with error
-
-If you enabled any of the Code Climate plugins, and the Code Quality CI job fails with the error
-below, it's likely the job takes longer than the default timeout of 900 seconds:
-
-```shell
-error: (CC::CLI::Analyze::EngineFailure) engine pmd ran for 900 seconds and was killed
-Could not analyze code quality for the repository at /code
-```
-
-To work around this problem, set `TIMEOUT_SECONDS` to a higher value in your `.gitlab.-ci.yml` file.
-
-For example:
-
-```yaml
-variables:
- TIMEOUT_SECONDS: 3600
-```
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md
index 6ee02238a22..f30b20e9d34 100644
--- a/doc/user/project/merge_requests/creating_merge_requests.md
+++ b/doc/user/project/merge_requests/creating_merge_requests.md
@@ -104,7 +104,7 @@ You can create a merge request from your fork to contribute back to the main pro
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).
+[remove the forking relationship](../settings/index.md#remove-a-fork-relationship).
For more information, [see the forking workflow documentation](../repository/forking_workflow.md).
diff --git a/doc/user/project/merge_requests/csv_export.md b/doc/user/project/merge_requests/csv_export.md
index aaa9bec945f..2adcc4d4575 100644
--- a/doc/user/project/merge_requests/csv_export.md
+++ b/doc/user/project/merge_requests/csv_export.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Exporting merge requests CSV enables you and your team to export all the data collected from merge requests into a comma-separated values (CSV) file, which stores tabular data in plain text.
-To export merge requests to CSV, navigate to your **Merge requests** from the sidebar of a project and select **Export to CSV**.
+To export merge requests to CSV, navigate to your **Merge requests** from the sidebar of a project and select **Export as CSV**.
## CSV Output
diff --git a/doc/user/project/merge_requests/drafts.md b/doc/user/project/merge_requests/drafts.md
index 13cc68f02dd..4bb6034c0bd 100644
--- a/doc/user/project/merge_requests/drafts.md
+++ b/doc/user/project/merge_requests/drafts.md
@@ -75,12 +75,10 @@ draft merge requests:
## Pipelines for drafts
-When the [merged results pipelines](../../../ci/pipelines/merged_results_pipelines.md)
-feature is enabled, draft merge requests run
-[merge request pipelines](../../../ci/pipelines/merge_request_pipelines.md) only.
+Draft merge requests run the same pipelines as merge request that are marked as ready.
-To run merged results pipelines, you must
-[mark the merge request as ready](#mark-merge-requests-as-ready).
+In GitLab 15.0 and older, you must [mark the merge request as ready](#mark-merge-requests-as-ready)
+if you want to run [merged results pipelines](../../../ci/pipelines/merged_results_pipelines.md).
<!-- ## Troubleshooting
diff --git a/doc/user/project/merge_requests/fail_fast_testing.md b/doc/user/project/merge_requests/fail_fast_testing.md
index 355661516a7..c09a7c14c06 100644
--- a/doc/user/project/merge_requests/fail_fast_testing.md
+++ b/doc/user/project/merge_requests/fail_fast_testing.md
@@ -1,97 +1,11 @@
---
-stage: Verify
-group: Pipeline Insights
-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: '../../../ci/testing/fail_fast_testing.md'
+remove_date: '2022-08-31'
---
-# Fail Fast Testing **(PREMIUM)**
+This document was moved to [another location](../../../ci/testing/fail_fast_testing.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/198550) in GitLab 13.1.
-
-For applications that use RSpec for running tests, we've introduced the `Verify/Failfast`
-[template to run subsets of your test suite](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml),
-based on the changes in your merge request.
-
-The template uses the [test_file_finder (`tff`) gem](https://gitlab.com/gitlab-org/ci-cd/test_file_finder/)
-that accepts a list of files as input, and returns a list of spec (test) files
-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/index.md#stage-pre) of a GitLab CI/CD pipeline,
-before all other stages.
-
-## Example use case
-
-Fail fast testing is useful when adding new functionality to a project and adding
-new automated tests.
-
-Your project could have hundreds of thousands of tests that take a long time to complete.
-You may be confident that a new test will pass, but you have to wait for all the tests
-to complete to verify it. This could take an hour or more, even when using parallelization.
-
-Fail fast testing gives you a faster feedback loop from the pipeline. It lets you
-know quickly that the new tests are passing and the new functionality did not break
-other tests.
-
-## Requirements
-
-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 [Merge request pipelines](../../../ci/pipelines/merge_request_pipelines.md#prerequisites)
-- [Merged results pipelines](../../../ci/pipelines/merged_results_pipelines.md#enable-merged-results-pipelines)
- 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#override-included-configuration-values) this.
-
-## Configuring Fast RSpec Failure
-
-We use the following plain RSpec configuration as a starting point. It installs all the
-project gems and executes `rspec`, on merge request pipelines only.
-
-```yaml
-rspec-complete:
- stage: test
- rules:
- - if: $CI_PIPELINE_SOURCE == "merge_request_event"
- script:
- - bundle install
- - bundle exec rspec
-```
-
-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
-include:
- - template: Verify/FailFast.gitlab-ci.yml
-```
-
-To customize the job, specific options may be set to override the template. For example, to override the default Docker image:
-
-```yaml
-include:
- - template: Verify/FailFast.gitlab-ci.yml
-
-rspec-rails-modified-path-specs:
- image: custom-docker-image-with-ruby
-```
-
-### Example test loads
-
-For illustrative purposes, let's say our Rails app spec suite consists of 100 specs per model for ten models.
-
-If no Ruby files are changed:
-
-- `rspec-rails-modified-paths-specs` does not run any tests.
-- `rspec-complete` runs the full suite of 1000 tests.
-
-If one Ruby model is changed, for example `app/models/example.rb`, then `rspec-rails-modified-paths-specs`
-runs the 100 tests for `example.rb`:
-
-- If all of these 100 tests pass, then the full `rspec-complete` suite of 1000 tests is allowed to run.
-- If any of these 100 tests fail, they fail quickly, and `rspec-complete` does not run any tests.
-
-The final case saves resources and time as the full 1000 test suite does not run.
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/merge_requests/img/attention_request_list_v14_10.png b/doc/user/project/merge_requests/img/attention_request_list_v14_10.png
deleted file mode 100644
index 00427a0aa40..00000000000
--- a/doc/user/project/merge_requests/img/attention_request_list_v14_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.png b/doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.png
deleted file mode 100644
index 174cf01dbb0..00000000000
--- a/doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/merge_method_ff_v15_0.png b/doc/user/project/merge_requests/img/merge_method_ff_v15_0.png
deleted file mode 100644
index 323fd03ffa2..00000000000
--- a/doc/user/project/merge_requests/img/merge_method_ff_v15_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/merge_method_merge_commit_v15_0.png b/doc/user/project/merge_requests/img/merge_method_merge_commit_v15_0.png
deleted file mode 100644
index b880c2c0e04..00000000000
--- a/doc/user/project/merge_requests/img/merge_method_merge_commit_v15_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/merge_method_merge_commit_with_semi_linear_history_v15_0.png b/doc/user/project/merge_requests/img/merge_method_merge_commit_with_semi_linear_history_v15_0.png
deleted file mode 100644
index 9eab71e9d3c..00000000000
--- a/doc/user/project/merge_requests/img/merge_method_merge_commit_with_semi_linear_history_v15_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 30b69c2fff5..a7a669d3b75 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -251,60 +251,13 @@ This feature works only when a merge request is merged. Selecting **Remove sourc
after merging does not retarget open merge requests. This improvement is
[proposed as a follow-up](https://gitlab.com/gitlab-org/gitlab/-/issues/321559).
-## Request attention to a merge request
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/343528) in GitLab 14.10 [with a flag](../../../administration/feature_flags.md) named `mr_attention_requests`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `mr_attention_requests`.
-On GitLab.com, this feature is dependent on the enablement status of the feature flag. Refer to the [enablement issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343528) for details.
-
-To tell a merge request's assignee or reviewer that their attention is
-needed on a merge request, you can request their attention. If an assignee or a
-reviewer has their attention requested on a merge request, the **Attention request**
-icon (**{attention}**) is displayed as a solid icon (**{attention-solid}**) on
-the merge request list page:
-
-![Attention request icon](img/attention_request_list_v14_10.png)
-
-To view a list of merge requests that need your attention:
-
-1. On the top bar, select **Merge requests** (**{merge-request}**).
-1. Select **Attention requests**.
-
-To request attention from another user, use the `/attention @user`
-[quick action](../quick_actions.md) or:
-
-1. Go to the merge request.
-1. On the right sidebar, identify the user you want to request attention from.
-1. Next to the user's name, select **Request attention** (**{attention}**), and the appearance
- of the icon changes:
-
- ![Attention request toggle](img/attention_request_sidebar_v14_10.png)
-
-### Remove an attention request
-
-If your attention was requested as an assignee or reviewer, it's removed when you:
-
-- Manually remove the attention request by selecting **Remove attention request** (**{attention-solid}**).
-- Approve the merge request.
-- Add a new user as an assignee or reviewer.
-- Request the attention of a different assignee or reviewer.
-- Remove yourself (or are removed by someone else) as an assignee or reviewer.
-- Merge or close the merge request.
-
-If you are both the assignee and a reviewer on a merge request, you receive
-only one attention request, which is synced across both duties. If the
-attention request is removed from you, either as an assignee or a reviewer,
-it is removed from both your duties.
-
## Merge request workflows
For a software developer working in a team:
1. You checkout a new branch, and submit your changes through a merge request.
1. You gather feedback from your team.
-1. You work on the implementation optimizing code with [Code Quality reports](code_quality.md).
+1. You work on the implementation optimizing code with [Code Quality reports](../../../ci/testing/code_quality.md).
1. You verify your changes with [Unit test reports](../../../ci/testing/unit_test_reports.md) in GitLab CI/CD.
1. You avoid using dependencies whose license is not compatible with your project with [License Compliance reports](../../compliance/license_compliance/index.md).
1. You request the [approval](approvals/index.md) from your manager.
diff --git a/doc/user/project/merge_requests/load_performance_testing.md b/doc/user/project/merge_requests/load_performance_testing.md
index a5fff4a38be..04b62c5d8fe 100644
--- a/doc/user/project/merge_requests/load_performance_testing.md
+++ b/doc/user/project/merge_requests/load_performance_testing.md
@@ -1,201 +1,11 @@
---
-stage: Verify
-group: Pipeline Insights
-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: '../../../ci/testing/load_performance_testing.md'
+remove_date: '2022-08-31'
---
-# Load Performance Testing **(PREMIUM)**
+This document was moved to [another location](../../../ci/testing/load_performance_testing.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10683) in GitLab 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/index.md).
-
-GitLab uses [k6](https://k6.io/), a free and open source
-tool, for measuring the system performance of applications under
-load.
-
-Unlike [Browser Performance Testing](browser_performance_testing.md), which is
-used to measure how web sites perform in client browsers, Load Performance Testing
-can be used to perform various types of [load tests](https://k6.io/docs/#use-cases)
-against application endpoints such as APIs, Web Controllers, and so on.
-This can be used to test how the backend or the server performs at scale.
-
-For example, you can use Load Performance Testing to perform many concurrent
-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/artifacts_reports.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:
-
-![Load Performance Widget](img/load_performance_testing.png)
-
-Next, you need to configure the test environment and write the k6 test.
-
-The key performance metrics that the merge request widget shows after the test completes are:
-
-- Checks: The percentage pass rate of the [checks](https://k6.io/docs/using-k6/checks) configured in the k6 test.
-- TTFB P90: The 90th percentile of how long it took to start receiving responses, aka the [Time to First Byte](https://en.wikipedia.org/wiki/Time_to_first_byte) (TTFB).
-- TTFB P95: The 95th percentile for TTFB.
-- RPS: The average requests per second (RPS) rate the test was able to achieve.
-
-NOTE:
-If the Load Performance report has no data to compare, such as when you add the
-Load Performance job in your `.gitlab-ci.yml` for the very first time,
-the Load Performance report widget doesn't display. It must have run at least
-once on the target branch (`main`, for example), before it displays in a
-merge request targeting that branch.
-
-## Configure the Load Performance Testing job
-
-Configuring your Load Performance Testing job can be broken down into several distinct parts:
-
-- Determine the test parameters such as throughput, and so on.
-- Set up the target test environment for load performance testing.
-- Design and write the k6 test.
-
-### Determine the test parameters
-
-The first thing you need to do is determine the [type of load test](https://k6.io/docs/test-types/introduction)
-you want to run, and how it will run (for example, the number of users, throughput, and so on).
-
-Refer to the [k6 docs](https://k6.io/docs/), especially the [k6 testing guides](https://k6.io/docs/testing-guides),
-for guidance on the above and more.
-
-### Test Environment setup
-
-A large part of the effort around load performance testing is to prepare the target test environment
-for high loads. You should ensure it's able to handle the
-[throughput](https://k6.io/blog/monthly-visits-concurrent-users) it will be tested with.
-
-It's also typically required to have representative test data in the target environment
-for the load performance test to use.
-
-We strongly recommend [not running these tests against a production environment](https://k6.io/our-beliefs#load-test-in-a-pre-production-environment).
-
-### Write the load performance test
-
-After the environment is prepared, you can write the k6 test itself. k6 is a flexible
-tool and can be used to run [many kinds of performance tests](https://k6.io/docs/test-types/introduction).
-Refer to the [k6 documentation](https://k6.io/docs/) for detailed information on how to write tests.
-
-### Configure the test in GitLab CI/CD
-
-When your k6 test is ready, the next step is to configure the load performance
-testing job in GitLab CI/CD. The easiest way to do this is to use the
-[`Verify/Load-Performance-Testing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml)
-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/saas/linux_saas_runner.md)
-likely have insufficient specs to handle most large k6 tests.
-
-This template runs the
-[k6 Docker container](https://hub.docker.com/r/loadimpact/k6/) in the job and provides several ways to customize the
-job.
-
-An example configuration workflow:
-
-1. Set up GitLab Runner to run Docker containers, like the
- [Docker-in-Docker workflow](../../../ci/docker/using_docker_build.md#use-docker-in-docker).
-1. Configure the default Load Performance Testing CI/CD job in your `.gitlab-ci.yml` file.
- You need to include the template and configure it with CI/CD variables:
-
- ```yaml
- include:
- template: Verify/Load-Performance-Testing.gitlab-ci.yml
-
- load_performance:
- variables:
- K6_TEST_FILE: <PATH TO K6 TEST FILE IN PROJECT>
- ```
-
-The above example creates a `load_performance` job in your CI/CD pipeline that runs
-the k6 test.
-
-NOTE:
-For Kubernetes setups a different template should be used: [`Jobs/Load-Performance-Testing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Load-Performance-Testing.gitlab-ci.yml).
-
-k6 has [various options](https://k6.io/docs/using-k6/options) to configure how it will run tests, such as what throughput (RPS) to run with,
-how long the test should run, and so on. Almost all options can be configured in the test itself, but as
-you can also pass command line options via the `K6_OPTIONS` variable.
-
-For example, you can override the duration of the test with a CLI option:
-
-```yaml
- include:
- template: Verify/Load-Performance-Testing.gitlab-ci.yml
-
- load_performance:
- variables:
- K6_TEST_FILE: <PATH TO K6 TEST FILE IN PROJECT>
- K6_OPTIONS: '--duration 30s'
-```
-
-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/artifacts_reports.md#artifactsreportsload_performance).
-The latest Load Performance artifact available is always used, using the
-summary values from the test.
-
-If [GitLab Pages](../pages/index.md) is enabled, you can view the report directly in your browser.
-
-### Load Performance testing in Review Apps
-
-The CI/CD YAML configuration example above works for testing against static environments,
-but it can be extended to work with [review apps](../../../ci/review_apps) or
-[dynamic environments](../../../ci/environments) with a few extra steps.
-
-The best approach is to capture the dynamic URL in a [`.env` file](https://docs.docker.com/compose/env-file/)
-as a job artifact to be shared, then use a custom CI/CD variable we've provided named `K6_DOCKER_OPTIONS`
-to configure the k6 Docker container to use the file. With this, k6 can then use any
-environment variables from the `.env` file in scripts using standard JavaScript,
-such as: ``http.get(`${__ENV.ENVIRONMENT_URL}`)``.
-
-For example:
-
-1. In the `review` job:
- 1. Capture the dynamic URL and save it into a `.env` file, for example, `echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env`.
- 1. Set the `.env` file to be a [job artifact](../../../ci/pipelines/job_artifacts.md#job-artifacts).
-1. In the `load_performance` job:
- 1. Set it to depend on the review job, so it inherits the environment file.
- 1. Set the `K6_DOCKER_OPTIONS` variable with the [Docker CLI option for environment files](https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file), for example `--env-file review.env`.
-1. Configure the k6 test script to use the environment variable in it's steps.
-
-Your `.gitlab-ci.yml` file might be similar to:
-
-```yaml
-stages:
- - deploy
- - performance
-
-include:
- template: Verify/Load-Performance-Testing.gitlab-ci.yml
-
-review:
- stage: deploy
- environment:
- name: review/$CI_COMMIT_REF_SLUG
- url: http://$CI_ENVIRONMENT_SLUG.example.com
- script:
- - run_deploy_script
- - echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env
- artifacts:
- paths:
- - review.env
- rules:
- - if: $CI_COMMIT_BRANCH # Modify to match your pipeline rules, or use `only/except` if needed.
-
-load_performance:
- dependencies:
- - review
- variables:
- K6_DOCKER_OPTIONS: '--env-file review.env'
- rules:
- - if: $CI_COMMIT_BRANCH # Modify to match your pipeline rules, or use `only/except` if needed.
-```
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/merge_requests/methods/index.md b/doc/user/project/merge_requests/methods/index.md
index d3221162cfd..63b464e5ff4 100644
--- a/doc/user/project/merge_requests/methods/index.md
+++ b/doc/user/project/merge_requests/methods/index.md
@@ -23,7 +23,26 @@ merge requests are merged into an existing branch.
This setting is the default. It always creates a separate merge commit,
even when using [squash](../squash_and_merge.md). An example commit graph generated using this merge method:
-![Commit graph for merge commits](../img/merge_method_merge_commit_v15_0.png)
+```mermaid
+gitGraph
+ commit id: "Init"
+ branch mr-branch-1
+ commit
+ checkout main
+ commit
+ branch mr-branch-2
+ commit
+ checkout mr-branch-1
+ commit
+ checkout main
+ branch squash-mr
+ commit id: "Squashed commits"
+ checkout main
+ merge squash-mr
+ merge mr-branch-1
+ commit
+ merge mr-branch-2
+```
- For regular merges, it is equivalent to the command `git merge --no-ff <source-branch>`.
- For squash merges, it squashes all commits in the source branch before merging it normally. It performs actions similar to:
@@ -42,7 +61,25 @@ A merge commit is created for every merge, but the branch is only merged if
a fast-forward merge is possible. This ensures that if the merge request build
succeeded, the target branch build also succeeds after the merge. An example commit graph generated using this merge method:
-![Commit graph for merge commit with semi-linear history](../img/merge_method_merge_commit_with_semi_linear_history_v15_0.png)
+```mermaid
+gitGraph
+ commit id: "Init"
+ branch mr-branch-1
+ commit
+ commit
+ checkout main
+ merge mr-branch-1
+ branch mr-branch-2
+ commit
+ commit
+ checkout main
+ merge mr-branch-2
+ commit
+ branch squash-mr
+ commit id: "Squashed commits"
+ checkout main
+ merge squash-mr
+```
When you visit the merge request page with `Merge commit with semi-linear history`
method selected, you can accept it **only if a fast-forward merge is possible**.
@@ -63,7 +100,14 @@ fast-forward merge requests, you can retain a linear Git history and a way
to accept merge requests without creating merge commits. An example commit graph
generated using this merge method:
-![Commit graph for fast-forward merge](../img/merge_method_ff_v15_0.png)
+```mermaid
+gitGraph
+ commit id: "Init"
+ commit id: "Merge mr-branch-1"
+ commit id: "Merge mr-branch-2"
+ commit id: "Commit on main"
+ commit id: "Merge squash-mr"
+```
This method is equivalent to `git merge --ff <source-branch>` for regular merges, and to
`git merge -squash <source-branch>` for squash merges.
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index 8f77ce90436..a8f43dd9c02 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -112,13 +112,7 @@ This example shows reviewers and approval rules in a merge request sidebar:
### Request a new review
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293933) in GitLab 13.9.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/357271) in GitLab 14.10.
-
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/357271)
-in GitLab 14.10, and is planned for [removal](https://gitlab.com/gitlab-org/gitlab/-/issues/357271) in GitLab 15.0.
-Use [attention requests](../index.md#request-attention-to-a-merge-request) instead.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293933) in GitLab 13.9.
After a reviewer completes their [merge request reviews](../../../discussions/index.md),
the author of the merge request can request a new review from the reviewer:
diff --git a/doc/user/project/merge_requests/reviews/suggestions.md b/doc/user/project/merge_requests/reviews/suggestions.md
index 7360b57103b..2ff65571c8b 100644
--- a/doc/user/project/merge_requests/reviews/suggestions.md
+++ b/doc/user/project/merge_requests/reviews/suggestions.md
@@ -77,7 +77,7 @@ in four backticks instead of three:
## Configure the commit message for applied suggestions
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13086) in GitLab 12.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13086) in GitLab 12.7.
GitLab uses a default commit message
when applying suggestions: `Apply %{suggestions_count} suggestion(s) to %{files_count} file(s)`
diff --git a/doc/user/project/merge_requests/status_checks.md b/doc/user/project/merge_requests/status_checks.md
index 76a67487881..423179325d3 100644
--- a/doc/user/project/merge_requests/status_checks.md
+++ b/doc/user/project/merge_requests/status_checks.md
@@ -138,7 +138,7 @@ 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.
+> [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:
diff --git a/doc/user/project/merge_requests/test_coverage_visualization.md b/doc/user/project/merge_requests/test_coverage_visualization.md
index fcbd732f8ee..53d45e6940d 100644
--- a/doc/user/project/merge_requests/test_coverage_visualization.md
+++ b/doc/user/project/merge_requests/test_coverage_visualization.md
@@ -1,441 +1,11 @@
---
-stage: Verify
-group: Pipeline Insights
-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: '../../../ci/testing/test_coverage_visualization.md'
+remove_date: '2022-08-31'
---
-# Test coverage visualization **(FREE)**
+This document was moved to [another location](../../../ci/testing/test_coverage_visualization.md).
-> - [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/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
-MR is merged.
-
-![Test Coverage Visualization Diff View](img/test_coverage_visualization_v12_9.png)
-
-## How test coverage visualization works
-
-Collecting the coverage information is done via GitLab CI/CD's
-[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. Coverage files are parsed in a background job so there can be a delay
-between pipeline completion and the visualization loading on the page.
-
-For the coverage analysis to work, you have to provide a properly formatted
-[Cobertura XML](https://cobertura.github.io/cobertura/) report to
-[`artifacts:reports:coverage_report`](../../../ci/yaml/artifacts_reports.md#artifactsreportscoverage_report).
-This format was originally developed for Java, but most coverage analysis frameworks
-for other languages have plugins to add support for it, like:
-
-- [simplecov-cobertura](https://rubygems.org/gems/simplecov-cobertura) (Ruby)
-- [gocover-cobertura](https://github.com/boumenot/gocover-cobertura) (Golang)
-
-Other coverage analysis frameworks support the format out of the box, for example:
-
-- [Istanbul](https://istanbul.js.org/docs/advanced/alternative-reporters/#cobertura) (JavaScript)
-- [Coverage.py](https://coverage.readthedocs.io/en/coverage-5.0.4/cmd.html#xml-reporting) (Python)
-- [PHPUnit](https://github.com/sebastianbergmann/phpunit-documentation-english/blob/master/src/textui.rst#command-line-options) (PHP)
-
-Once configured, if you create a merge request that triggers a pipeline which collects
-coverage reports, the coverage is shown in the diff view. This includes reports
-from any job in any stage in the pipeline. The coverage displays for each line:
-
-- `covered` (green): lines which have been checked at least once by tests
-- `no test coverage` (orange): lines which are loaded but never executed
-- no coverage information: lines which are non-instrumented or not loaded
-
-Hovering over the coverage bar provides further information, such as the number
-of times the line was checked by tests.
-
-Uploading a test coverage report does not enable:
-
-- [Test coverage results in merge requests](../../../ci/pipelines/settings.md#merge-request-test-coverage-results).
-- [Code coverage history](../../../ci/pipelines/settings.md#view-code-coverage-history).
-
-You must configure these separately.
-
-### Limits
-
-A limit of 100 `<source>` nodes for Cobertura format XML files applies. If your Cobertura report exceeds
-100 nodes, there can be mismatches or no matches in the merge request diff view.
-
-A single Cobertura XML file can be no more than 10MiB. For large projects, split the Cobertura XML into
-smaller files. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/328772) for more details.
-When submitting many files, it can take a few minutes for coverage to show on a merge request.
-
-The visualization only displays after the pipeline is complete. If the pipeline has
-a [blocking manual job](../../../ci/jobs/job_control.md#types-of-manual-jobs), the
-pipeline waits for the manual job before continuing and is not considered complete.
-The visualization cannot be displayed if the blocking manual job did not run.
-
-### Artifact expiration
-
-By default, the [pipeline artifact](../../../ci/pipelines/pipeline_artifacts.md#storage) used
-to draw the visualization on the merge request expires **one week** after creation.
-
-### Coverage report from child pipeline
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363301) in GitLab 15.1 [with a flag](../../../administration/feature_flags.md). Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `ci_child_pipeline_coverage_reports`.
-On GitLab.com, this feature is not available.
-The feature is not ready for production use.
-
-If the test coverage is created in jobs that are in a child pipeline, the parent pipeline must use
-`strategy: depend`.
-
-```yaml
-child_test_pipeline:
- trigger:
- include:
- - local: path/to/child_pipeline.yml
- - template: Security/SAST.gitlab-ci.yml
- strategy: depend
-```
-
-### Automatic class path correction
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217664) in GitLab 13.8.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284822) in GitLab 13.9.
-
-The coverage report properly matches changed files only if the `filename` of a `class` element
-contains the full path relative to the project root. However, in some coverage analysis frameworks,
-the generated Cobertura XML has the `filename` path relative to the class package directory instead.
-
-To make an intelligent guess on the project root relative `class` path, the Cobertura XML parser
-attempts to build the full path by:
-
-- Extracting a portion of the `source` paths from the `sources` element and combining them with the
- class `filename` path.
-- Checking if the candidate path exists in the project.
-- Using the first candidate that matches as the class full path.
-
-#### Path correction example
-
-As an example, a project with:
-
-- A full path of `test-org/test-project`.
-- The following files relative to the project root:
-
- ```shell
- Auth/User.cs
- Lib/Utils/User.cs
- src/main/java
- ```
-
-In the:
-
-- Cobertura XML, the `filename` attribute in the `class` element assumes the value is a relative
- path to the project's root:
-
- ```xml
- <class name="packet.name" filename="src/main/java" line-rate="0.0" branch-rate="0.0" complexity="5">
- ```
-
-- `sources` from Cobertura XML, the following paths in the format
- `<CI_BUILDS_DIR>/<PROJECT_FULL_PATH>/...`:
-
- ```xml
- <sources>
- <source>/builds/test-org/test-project/Auth</source>
- <source>/builds/test-org/test-project/Lib/Utils</source>
- </sources>
- ```
-
-The parser:
-
-- Extracts `Auth` and `Lib/Utils` from the `sources` and uses these to determine the `class` path
- relative to the project root.
-- Combines these extracted `sources` and the class filename. For example, if there is a `class`
- element with the `filename` value of `User.cs`, the parser takes the first candidate path that
- matches, which is `Auth/User.cs`.
-- For each `class` element, attempts to look for a match for each extracted `source` path up to
- 100 iterations. If it reaches this limit without finding a matching path in the file tree, the
- class is not included in the final coverage report.
-
-NOTE:
-Automatic class path correction only works on `source` paths in the format `<CI_BUILDS_DIR>/<PROJECT_FULL_PATH>/...`.
-The `source` is ignored if the path does not follow this pattern. The parser assumes that the
-`filename` of a `class` element contains the full path relative to the project root.
-
-## Example test coverage configurations
-
-This section provides test coverage configuration examples for different programming languages. You can also see a working example in
-the [`coverage-report`](https://gitlab.com/gitlab-org/ci-sample-projects/coverage-report/) demonstration project.
-
-### JavaScript example
-
-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:
-
-```yaml
-test:
- script:
- - npm install
- - npx nyc --reporter cobertura mocha
- artifacts:
- reports:
- coverage_report:
- coverage_format: cobertura
- path: coverage/cobertura-coverage.xml
-```
-
-### Java and Kotlin examples
-
-#### Maven example
-
-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.
-
-GitLab expects the artifact in the Cobertura format, so you have to execute a few
-scripts before uploading it. The `test-jdk11` job tests the code and generates an
-XML artifact. The `coverage-jdk-11` job converts the artifact into a Cobertura report:
-
-```yaml
-test-jdk11:
- stage: test
- image: maven:3.6.3-jdk-11
- script:
- - mvn $MAVEN_CLI_OPTS clean org.jacoco:jacoco-maven-plugin:prepare-agent test jacoco:report
- artifacts:
- paths:
- - target/site/jacoco/jacoco.xml
-
-coverage-jdk11:
- # Must be in a stage later than test-jdk11's stage.
- # The `visualize` stage does not exist by default.
- # Please define it first, or choose an existing stage like `deploy`.
- stage: visualize
- image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
- script:
- # convert report from jacoco to cobertura, using relative project path
- - python /opt/cover2cover.py target/site/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/ > target/site/cobertura.xml
- needs: ["test-jdk11"]
- artifacts:
- reports:
- coverage_report:
- coverage_format: cobertura
- path: target/site/cobertura.xml
-```
-
-#### Gradle example
-
-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.
-
-GitLab expects the artifact in the Cobertura format, so you have to execute a few
-scripts before uploading it. The `test-jdk11` job tests the code and generates an
-XML artifact. The `coverage-jdk-11` job converts the artifact into a Cobertura report:
-
-```yaml
-test-jdk11:
- stage: test
- image: gradle:6.6.1-jdk11
- script:
- - 'gradle test jacocoTestReport' # jacoco must be configured to create an xml report
- artifacts:
- paths:
- - build/jacoco/jacoco.xml
-
-coverage-jdk11:
- # Must be in a stage later than test-jdk11's stage.
- # The `visualize` stage does not exist by default.
- # Please define it first, or chose an existing stage like `deploy`.
- stage: visualize
- image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
- script:
- # convert report from jacoco to cobertura, using relative project path
- - python /opt/cover2cover.py build/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/ > build/cobertura.xml
- needs: ["test-jdk11"]
- artifacts:
- reports:
- coverage_report:
- coverage_format: cobertura
- path: build/cobertura.xml
-```
-
-### Python example
-
-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`:
-
-```yaml
-run tests:
- stage: test
- image: python:3
- script:
- - pip install pytest pytest-cov
- - coverage run -m pytest
- - coverage report
- - coverage xml
- coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
- artifacts:
- reports:
- coverage_report:
- coverage_format: cobertura
- path: coverage.xml
-```
-
-### PHP example
-
-The following [`.gitlab-ci.yml`](../../../ci/yaml/index.md) example for PHP uses [PHPUnit](https://phpunit.readthedocs.io/)
-to collect test coverage data and generate the report.
-
-With a minimal [`phpunit.xml`](https://phpunit.readthedocs.io/en/9.5/configuration.html) file (you may reference
-[this example repository](https://gitlab.com/yookoala/code-coverage-visualization-with-php/)), you can run the test and
-generate the `coverage.xml`:
-
-```yaml
-run tests:
- stage: test
- image: php:latest
- variables:
- XDEBUG_MODE: coverage
- before_script:
- - apt-get update && apt-get -yq install git unzip zip libzip-dev zlib1g-dev
- - docker-php-ext-install zip
- - pecl install xdebug && docker-php-ext-enable xdebug
- - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- - php composer-setup.php --install-dir=/usr/local/bin --filename=composer
- - composer install
- - composer require --dev phpunit/phpunit phpunit/php-code-coverage
- script:
- - php ./vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml
- artifacts:
- reports:
- coverage_report:
- coverage_format: cobertura
- path: coverage.cobertura.xml
-```
-
-[Codeception](https://codeception.com/), through PHPUnit, also supports generating Cobertura report with
-[`run`](https://codeception.com/docs/reference/Commands#run). The path for the generated file
-depends on the `--coverage-cobertura` option and [`paths`](https://codeception.com/docs/reference/Configuration#paths)
-configuration for the [unit test suite](https://codeception.com/docs/05-UnitTests). Configure `.gitlab-ci.yml`
-to find Cobertura in the appropriate path.
-
-### C/C++ example
-
-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.
-
-This example assumes:
-
-- That the `Makefile` is created by `cmake` in the `build` directory,
- within another job in a previous stage.
- (If you use `automake` to generate the `Makefile`,
- then you need to call `make check` instead of `make test`.)
-- `cmake` (or `automake`) has set the compiler option `--coverage`.
-
-```yaml
-run tests:
- stage: test
- script:
- - cd build
- - make test
- - gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o coverage.xml --root ${CI_PROJECT_DIR}
- coverage: /^\s*lines:\s*\d+.\d+\%/
- artifacts:
- name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}
- expire_in: 2 days
- reports:
- coverage_report:
- coverage_format: cobertura
- path: build/coverage.xml
-```
-
-### Go example
-
-The following [`.gitlab-ci.yml`](../../../ci/yaml/index.md) example for Go uses:
-
-- [`go test`](https://go.dev/doc/tutorial/add-a-test) to run tests.
-- [`gocover-cobertura`](https://github.com/boumenot/gocover-cobertura) to convert Go's coverage profile into the Cobertura XML format.
-
-This example assumes that [Go modules](https://go.dev/ref/mod)
-are being used. Please note that the `-covermode count` option does not work with the `-race` flag.
-If you want to generate code coverage while also using the `-race` flag, you must switch to
-`-covermode atomic` which is slower than `-covermode count`. See [this blog post](https://go.dev/blog/cover)
-for more details.
-
-```yaml
-run tests:
- stage: test
- image: golang:1.17
- script:
- - go install
- - go test ./... -coverprofile=coverage.txt -covermode count
- - go get github.com/boumenot/gocover-cobertura
- - go run github.com/boumenot/gocover-cobertura < coverage.txt > coverage.xml
- artifacts:
- reports:
- coverage_report:
- coverage_format: cobertura
- path: coverage.xml
-```
-
-### Ruby example
-
-The following [`.gitlab-ci.yml`](../../../ci/yaml/index.md) example for Ruby uses
-
-- [`rspec`](https://rspec.info/) to run tests.
-- [`simplecov`](https://github.com/simplecov-ruby/simplecov) and [`simplecov-cobertura`](https://github.com/dashingrocket/simplecov-cobertura)
- to record the coverage profile and create a report in the Cobertura XML format.
-
-This example assumes:
-
-- That [`bundler`](https://bundler.io/) is being used for dependency management.
- The `rspec`, `simplecov` and `simplecov-cobertura` gems have been added to your `Gemfile`.
-- The `CoberturaFormatter` has been added to your `SimpleCov.formatters`
- configuration within the `spec_helper.rb` file.
-
-```yaml
-run tests:
- stage: test
- image: ruby:3.1
- script:
- - bundle install
- - bundle exec rspec
- artifacts:
- reports:
- coverage_report:
- coverage_format: cobertura
- path: coverage/coverage.xml
-```
-
-## Troubleshooting
-
-### Test coverage visualization not displayed
-
-If the test coverage visualization is not displayed in the diff view, you can check
-the coverage report itself and verify that:
-
-- The file you are viewing in the diff view is mentioned in the coverage report.
-- The `source` and `filename` nodes in the report follows the [expected structure](#automatic-class-path-correction)
- to match the files in your repository.
-
-Report artifacts are not downloadable by default. If you want the report to be downloadable
-from the job details page, add your coverage report to the artifact `paths`:
-
-```yaml
-artifacts:
- paths:
- - coverage/cobertura-coverage.xml
- reports:
- coverage_report:
- coverage_format: cobertura
- path: coverage/cobertura-coverage.xml
-```
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/milestones/burndown_and_burnup_charts.md b/doc/user/project/milestones/burndown_and_burnup_charts.md
index d6fcd9fbb16..0f36747a547 100644
--- a/doc/user/project/milestones/burndown_and_burnup_charts.md
+++ b/doc/user/project/milestones/burndown_and_burnup_charts.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
[Burndown](#burndown-charts) and [burnup](#burnup-charts) charts show the progress of completing a milestone.
-![burndown and burnup chart](img/burndown_and_burnup_charts_v15_1.png)
+![burndown and burnup chart](img/burndown_and_burnup_charts_v15_3.png)
## Burndown charts
@@ -19,7 +19,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Burndown charts show the number of issues over the course of a milestone.
-![burndown chart](img/burndown_chart_v15_1.png)
+![burndown chart](img/burndown_chart_v15_3.png)
At a glance, you see the current state for the completion a given milestone.
Without them, you would have to organize the data from the milestone and plot it
@@ -66,7 +66,7 @@ A burndown chart is available for every project or group milestone that has been
date** and a **due date**.
NOTE:
-You're able to [promote project](index.md#promoting-project-milestones-to-group-milestones) to group milestones and still see the **burndown chart** for them, respecting license limitations.
+You're able to [promote project](index.md#promote-a-project-milestone-to-a-group-milestone) to group milestones and still see the **burndown chart** for them, respecting license limitations.
The chart indicates the project's progress throughout that milestone (for issues assigned to it).
@@ -106,7 +106,7 @@ Reopened issues are considered as having been opened on the day after they were
Burnup charts show the assigned and completed work for a milestone.
-![burnup chart](img/burnup_chart_v15_1.png)
+![burnup chart](img/burnup_chart_v15_3.png)
To view a project's burnup chart:
diff --git a/doc/user/project/milestones/img/burndown_and_burnup_charts_v15_1.png b/doc/user/project/milestones/img/burndown_and_burnup_charts_v15_1.png
deleted file mode 100644
index 58c0ddf892f..00000000000
--- a/doc/user/project/milestones/img/burndown_and_burnup_charts_v15_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/milestones/img/burndown_and_burnup_charts_v15_3.png b/doc/user/project/milestones/img/burndown_and_burnup_charts_v15_3.png
new file mode 100644
index 00000000000..1420123500c
--- /dev/null
+++ b/doc/user/project/milestones/img/burndown_and_burnup_charts_v15_3.png
Binary files differ
diff --git a/doc/user/project/milestones/img/burndown_chart_v15_1.png b/doc/user/project/milestones/img/burndown_chart_v15_1.png
deleted file mode 100644
index 2953380292d..00000000000
--- a/doc/user/project/milestones/img/burndown_chart_v15_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/milestones/img/burndown_chart_v15_3.png b/doc/user/project/milestones/img/burndown_chart_v15_3.png
new file mode 100644
index 00000000000..9e1c7ccd4dd
--- /dev/null
+++ b/doc/user/project/milestones/img/burndown_chart_v15_3.png
Binary files differ
diff --git a/doc/user/project/milestones/img/burnup_chart_v15_1.png b/doc/user/project/milestones/img/burnup_chart_v15_1.png
deleted file mode 100644
index e89b76344ed..00000000000
--- a/doc/user/project/milestones/img/burnup_chart_v15_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/milestones/img/burnup_chart_v15_3.png b/doc/user/project/milestones/img/burnup_chart_v15_3.png
new file mode 100644
index 00000000000..2e85c0abe87
--- /dev/null
+++ b/doc/user/project/milestones/img/burnup_chart_v15_3.png
Binary files differ
diff --git a/doc/user/project/milestones/img/milestones_promote_milestone.png b/doc/user/project/milestones/img/milestones_promote_milestone.png
deleted file mode 100644
index 2ef85c5951d..00000000000
--- a/doc/user/project/milestones/img/milestones_promote_milestone.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/milestones/index.md b/doc/user/project/milestones/index.md
index b0f3179961d..ba48876d4fd 100644
--- a/doc/user/project/milestones/index.md
+++ b/doc/user/project/milestones/index.md
@@ -23,87 +23,127 @@ Additionally, you can integrate milestones with the [Releases feature](../releas
## Project milestones and group milestones
-You can assign **project milestones** to issues or merge requests in that project only.
-To view the project milestone list, in a project, go to **{issues}** **Issues > Milestones**.
+A milestone can belong to [project](../index.md) or [group](../../group/index.md).
+You can assign **project milestones** to issues or merge requests in that project only.
You can assign **group milestones** to any issue or merge request of any project in that group.
-To view the group milestone list, in a group, go to **{issues}** **Issues > Milestones**.
-
-You can also view all milestones you have access to in the dashboard milestones list.
-To view both project milestones and group milestones you have access to, select **Menu > Milestones**
-on the top bar.
For information about project and group milestones API, see:
- [Project Milestones API](../../../api/milestones.md)
- [Group Milestones API](../../../api/group_milestones.md)
-NOTE:
-If you're in a group and select **Issues > Milestones**, GitLab displays group milestones
-and the milestones of projects in this group.
-If you're in a project and select **Issues > Milestones**, GitLab displays only this project's milestones.
+### View project or group milestones
+
+To view the milestone list:
+
+1. On the top bar, select **Menu > Projects** and find your project or
+ **Menu > Groups** and find your group.
+1. Select **Issues > Milestones**.
+
+In a project, GitLab displays milestones that belong to the project.
+In a group, GitLab displays milestones that belong to the group and all projects in the group.
+
+### View all milestones
-## Creating milestones
+You can view all the milestones you have access to in the entire GitLab namespace.
+You might not see some milestones because they're in projects or groups you're not a member of.
+
+To do so, on the top bar select **Menu > Milestones**.
+
+## Create a milestone
> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
-Milestones can be created either at project or group level.
+You can create a milestone either in a project or a group.
Prerequisites:
-- You must have at least the Reporter role for a group.
+- You must have at least the Reporter role for the project or group the milestone belongs to.
To create a milestone:
1. On the top bar, select **Menu > Projects** and find your project or **Menu > Groups** and find your group.
1. On the left sidebar, select **Issues > Milestones**.
1. Select **New milestone**.
-1. Enter the title, an optional description, an optional start date, and an optional due date.
+1. Enter the title.
+1. Optional. Enter description, start date, and due date.
1. Select **New milestone**.
![New milestone](img/milestones_new_project_milestone.png)
-## Editing milestones
+## Edit a milestone
> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
-Users with at least the Reporter role can edit milestones.
-
Prerequisites:
-- You must have at least the Reporter role for a group.
+- You must have at least the Reporter role for the project or group the milestone belongs to.
To edit a milestone:
-1. In a project or group, go to **{issues}** **Issues > Milestones**.
+1. On the top bar, select **Menu > Projects** and find your project or **Menu > Groups** and find your group.
1. Select a milestone's title.
1. Select **Edit**.
+1. Edit the title, start date, due date, or description.
+1. Select **Save changes**.
+
+## Delete a milestone
+
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
-You can delete a milestone by selecting the **Delete** button.
+Prerequisites:
+
+- You must have at least the Reporter role for the project or group the milestone belongs to.
+
+To edit a milestone:
+
+1. On the top bar, select **Menu > Projects** and find your project or **Menu > Groups** and find your group.
+1. Select a milestone's title.
+1. Select **Delete**.
+1. Select **Delete milestone**.
-### Promoting project milestones to group milestones
+## Promote a project milestone to a group milestone
If you are expanding the number of projects in a group, you might want to share the same milestones
-among this group's projects. You can also promote project milestones to group milestones in order to
+among this group's projects. You can also promote project milestones to group milestones to
make them available to other projects in the same group.
-From the project milestone list page, you can promote a project milestone to a group milestone.
-This merges all project milestones across all projects in this group with the same name into a single
-group milestones. All issues and merge requests that were previously assigned to one of these project
-milestones is assigned the new group milestones. This action cannot be reversed and the changes are
-permanent.
+Promoting a milestone merges all project milestones across all projects in this group with the same
+name into a single group milestone.
+All issues and merge requests that were previously assigned to one of these project
+milestones become assigned to the new group milestone.
WARNING:
-From GitLab 12.4 and earlier, some information is lost when you promote a project milestone to a
-group milestone. Not all features on the project milestone view are available on the group milestone
-view. If you promote a project milestone to a group milestone, you lose these features. Visit
-[Milestone view](#milestone-view) to learn which features are missing from the group milestone view.
+This action cannot be reversed and the changes are permanent.
+
+Prerequisites:
+
+- You must have at least the Reporter role for the group.
+
+To promote a project milestone:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. Either:
+ - Select **Promote to Group Milestone** (**{level-up}**).
+ - Select the milestone title, and then select **Promote**.
+1. Select **Promote Milestone**.
+
+## Assign a milestone to an issue or merge request
+
+Every issue and merge request can be assigned one milestone.
+The milestones are visible on every issue and merge request page, on the right sidebar.
+They are also visible in the issue board.
-![Promote milestone](img/milestones_promote_milestone.png)
+To assign or unassign a milestone:
-## Assigning milestones from the sidebar
+1. View an issue or a merge request.
+1. On the right sidebar, next to **Milestones**, select **Edit**.
+1. In the **Assign milestone** list, search for a milestone by typing its name.
+ You can select from both project and group milestones.
+1. Select the milestone you want to assign.
-Every issue and merge request can be assigned a milestone. The milestones are visible on every issue and merge request page, in the sidebar. They are also visible in the issue board. From the sidebar, you can assign or unassign a milestones to the object. You can also perform this as a [quick action](../quick_actions.md) in a comment. [As mentioned](#project-milestones-and-group-milestones), for a given issue or merge request, both project milestones and group milestones can be selected and assigned to the object.
+You can also use the `/assign` [quick action](../quick_actions.md) in a comment.
## Filtering issues and merge requests by milestone
@@ -156,7 +196,7 @@ There are also tabs below these that show the following:
The milestone view contains a [burndown and burnup chart](burndown_and_burnup_charts.md),
showing the progress of completing a milestone.
-![burndown chart](img/burndown_and_burnup_charts_v15_1.png)
+![burndown chart](img/burndown_and_burnup_charts_v15_3.png)
### Milestone sidebar
diff --git a/doc/user/project/pages/redirects.md b/doc/user/project/pages/redirects.md
index 791b6a1550a..5d03db4bf00 100644
--- a/doc/user/project/pages/redirects.md
+++ b/doc/user/project/pages/redirects.md
@@ -45,8 +45,9 @@ Note that:
- All paths must start with a forward slash `/`.
- A default status code of `301` is applied if no [status code](#http-status-codes) is provided.
-- The `_redirects` file has a file size limit of 64KB and a maximum of 1,000 rules per project.
- Only the first 1,000 rules are processed.
+- The `_redirects` file has a file size limit and a maximum number of rules per project,
+ configured at the instance level. Only the first matching rules within the configured maximum are processed.
+ The default file size limit is 64KB, and the default maximum number of rules is 1,000.
- If your GitLab Pages site uses the default domain name (such as
`namespace.gitlab.io/projectname`) you must prefix every rule with the project name:
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index d5a7058d3d2..96e51b061ee 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -55,7 +55,6 @@ threads. Some quick actions might not be available to all subscription tiers.
| `/assign me` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign yourself. |
| `/assign_reviewer @user1 @user2` or `/reviewer @user1 @user2` or `/request_review @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign one or more users as reviewers. |
| `/assign_reviewer me` or `/reviewer me` or `/request_review me` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign yourself as a reviewer. |
-| `/attention @user1` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | [Request attention](merge_requests/index.md#request-attention-to-a-merge-request) to a merge request from a user. |
| `/award :emoji:` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Toggle emoji award. |
| `/child_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Add child epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7330) in GitLab 12.0). |
| `/clear_health_status` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Clear [health status](issues/managing_issues.md#health-status) ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213814) in GitLab 14.7). |
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index d5ddc0468e1..1d448ca5c94 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -210,7 +210,7 @@ In the second workflow, the `release` job runs in multiple pipelines. To prevent
```yaml
release_job:
rules:
- - if: $CI_COMMIT_TAG
+ - if: $CI_COMMIT_TAG
when: never # Do not run this job in a tag pipeline
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
script:
@@ -317,6 +317,25 @@ You can edit the release title, notes, associated milestones, and asset links.
To change the release date use the
[Releases API](../../../api/releases/index.md#update-a-release).
+## Delete a release
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213862) in GitLab 15.2
+
+When you delete a release, its assets are also deleted. However, the associated
+Git tag is not deleted.
+
+Prerequisites:
+
+- You must have at least the Developer role. Read more about [Release permissions](#release-permissions).
+
+To delete a release in the UI:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Deployments > Releases**.
+1. In the top-right corner of the release you want to delete, select **Edit this release** (**{pencil}**).
+1. On the **Edit Release** page, select **Delete**.
+1. Select **Delete release**.
+
## Associate milestones with a release
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29020) in GitLab 12.5.
diff --git a/doc/user/project/repository/branches/default.md b/doc/user/project/repository/branches/default.md
index e087ed6c439..747da817195 100644
--- a/doc/user/project/repository/branches/default.md
+++ b/doc/user/project/repository/branches/default.md
@@ -76,7 +76,7 @@ overrides it.
### Group-level custom initial branch name
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221014) in GitLab 13.6.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221014) in GitLab 13.6.
Users with at least the Owner role of groups and subgroups can configure the default branch name for a group:
diff --git a/doc/user/project/repository/forking_workflow.md b/doc/user/project/repository/forking_workflow.md
index 0e6c98457c7..85bea80f777 100644
--- a/doc/user/project/repository/forking_workflow.md
+++ b/doc/user/project/repository/forking_workflow.md
@@ -68,4 +68,4 @@ changes are added to the repository and branch you're merging into.
## Removing a fork relationship
-You can unlink your fork from its upstream project in the [advanced settings](../settings/index.md#removing-a-fork-relationship).
+You can unlink your fork from its upstream project in the [advanced settings](../settings/index.md#remove-a-fork-relationship).
diff --git a/doc/user/project/repository/img/repository_languages_v12_2.gif b/doc/user/project/repository/img/repository_languages_v12_2.gif
deleted file mode 100644
index d0a0e57c919..00000000000
--- a/doc/user/project/repository/img/repository_languages_v12_2.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/repository_languages_v15_2.png b/doc/user/project/repository/img/repository_languages_v15_2.png
new file mode 100644
index 00000000000..94cfa1cc161
--- /dev/null
+++ b/doc/user/project/repository/img/repository_languages_v15_2.png
Binary files differ
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 02b5639cae8..a8937d4f705 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -116,7 +116,7 @@ You can download the source code that's stored in a repository.
For the default branch of each repository, GitLab determines which programming languages
are used. This information is displayed on the **Project information** page.
-![Repository Languages bar](img/repository_languages_v12_2.gif)
+![Repository Languages bar](img/repository_languages_v15_2.png)
When new files are added, this information can take up to five minutes to update.
@@ -232,7 +232,7 @@ When a repository path changes, GitLab handles the transition from the
old location to the new one with a redirect.
When you [rename a user](../../profile/index.md#change-your-username),
-[change a group path](../../group/index.md#change-a-groups-path), or [rename a repository](../settings/index.md#renaming-a-repository):
+[change a group path](../../group/index.md#change-a-groups-path), or [rename a repository](../settings/index.md#rename-a-repository):
- URLs for the namespace and everything under it, like projects, are
redirected to the new URLs.
diff --git a/doc/user/project/repository/managing_large_repositories.md b/doc/user/project/repository/managing_large_repositories.md
index 76f66f41297..93b94ac0641 100644
--- a/doc/user/project/repository/managing_large_repositories.md
+++ b/doc/user/project/repository/managing_large_repositories.md
@@ -16,7 +16,7 @@ On this page we detail several best practices to improve performance with these
It's *strongly* recommended in any Git system that binary or blob files (for example, packages, audio, video, graphics, etc.) are stored as Large File Storage (LFS) objects. In such setup, the Objects are stored elsewhere, such as in Object Storage, and this can reduce the repository size significantly, thus improving performance.
-Refer to the [Git LFS docs for more information](../../../topics/git/lfs/index.md).
+Refer to the [Git LFS documentation for more information](../../../topics/git/lfs/index.md).
## Gitaly Pack Objects Cache
@@ -34,7 +34,7 @@ In these types of setups it's recommended that the GitLab environment used match
Gitaly Cluster can notably improve large repository performance as it holds multiple replicas of the repository across several nodes. As a result, Gitaly Cluster can load balance read requests against those repositories and is also fault tolerant.
-It's recommended for large repositories, however, Gitaly Cluster is a large solution with additional complexity of setup and management. Refer to the [Gitaly Cluster docs for more information](../../../administration/gitaly/index.md), specifically the [Before deploying Gitaly Cluster](../../../administration/gitaly/index.md#before-deploying-gitaly-cluster) section.
+It's recommended for large repositories, however, Gitaly Cluster is a large solution with additional complexity of setup, and management. Refer to the [Gitaly Cluster documentation for more information](../../../administration/gitaly/index.md), specifically the [Before deploying Gitaly Cluster](../../../administration/gitaly/index.md#before-deploying-gitaly-cluster) section.
## Keep GitLab up to date
@@ -46,6 +46,6 @@ Large repositories tend to be monorepos. This in turn typically means that these
CI/CD loads tend to be concurrent as pipelines are scheduled during set times. As a result, the Git requests against the repositories can spike notably during these times and lead to reduced performance for both CI and users alike.
-When designing CI/CD pipelines, it's advisable to reduce their concurrency by staggering them to run at different times, for example, a set running at one time and then another set running several minutes later.
+When designing CI/CD pipelines, it's advisable to reduce their concurrency by staggering them to run at different times, for example, a set running at one time, and another set running several minutes later.
-There's several other actions that can be explored to improve CI/CD performance with large repositories. Refer to the [Runner docs for more information](../../../ci/large_repositories/index.md).
+There's several other actions that can be explored to improve CI/CD performance with large repositories. Refer to the [Runner documentation for more information](../../../ci/large_repositories/index.md).
diff --git a/doc/user/project/repository/mirror/index.md b/doc/user/project/repository/mirror/index.md
index fe1c9653cfe..4537f8520cd 100644
--- a/doc/user/project/repository/mirror/index.md
+++ b/doc/user/project/repository/mirror/index.md
@@ -8,7 +8,7 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.htm
# Repository mirroring **(FREE)**
You can _mirror_ a repository to and from external sources. You can select which repository
-serves as the source. Branches, tags, and commits can be mirrored.
+serves as the source. Branches, tags, and commits are synced automatically.
NOTE:
SCP-style URLs are **not** supported. However, the work for implementing SCP-style URLs is tracked
@@ -302,3 +302,12 @@ fail nor succeed. They also do not leave a clear log. To check for this problem:
1. After you run the command, the [background jobs page](../../../admin_area/index.md#background-jobs)
should show new mirroring jobs being scheduled, especially when
[triggered manually](#update-a-mirror).
+
+### Invalid URL
+
+If you receive this error while setting up mirroring over [SSH](#ssh-authentication), make sure the URL is in a valid format.
+
+Mirroring does not support the short version of SSH clone URLs (`git@gitlab.com:gitlab-org/gitlab.git`)
+and requires the full version including the protocol (`ssh://git@gitlab.com/gitlab-org/gitlab.git`).
+
+Make sure that host and project path are separated using `/` instead of `:`.
diff --git a/doc/user/project/repository/mirror/pull.md b/doc/user/project/repository/mirror/pull.md
index 3599faf4de6..88104e34eb4 100644
--- a/doc/user/project/repository/mirror/pull.md
+++ b/doc/user/project/repository/mirror/pull.md
@@ -97,7 +97,7 @@ assigned when you set up pull mirroring.
Pull mirroring uses polling to detect new branches and commits added upstream,
often minutes afterwards. You can notify GitLab using an
-[API call](../../../../api/projects.md#start-the-pull-mirroring-process-for-a-project),
+[API call](../../../../api/projects.md#start-the-pull-mirroring-process-for-a-project),
but the [minimum interval for pull mirroring limits](index.md#force-an-update) is still enforced.
For more information, read
diff --git a/doc/user/project/repository/reducing_the_repo_size_using_git.md b/doc/user/project/repository/reducing_the_repo_size_using_git.md
index 83fafd409e8..b0ae1b7d1e0 100644
--- a/doc/user/project/repository/reducing_the_repo_size_using_git.md
+++ b/doc/user/project/repository/reducing_the_repo_size_using_git.md
@@ -1,8 +1,7 @@
---
-stage: Create
+stage: Systems
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: howto
---
# Reduce repository size **(FREE)**
@@ -20,7 +19,7 @@ over [`git filter-branch`](https://git-scm.com/docs/git-filter-branch) and
WARNING:
Rewriting repository history is a destructive operation. Make sure to back up your repository before
-you begin. The best way back up a repository is to
+you begin. The best way to back up a repository is to
[export the project](../settings/import_export.md#export-a-project-and-its-data).
## Purge files from repository history
@@ -36,6 +35,11 @@ other internal references (refs) that are automatically created by GitLab. These
These refs are not automatically downloaded and hidden refs are not advertised, but we can remove these refs using a project export.
+WARNING:
+This process is not suitable for removing sensitive data like password or keys from your repository.
+Information about commits, including file content, is cached in the database, and remain
+visible even after they have been removed from the repository.
+
To purge files from a GitLab repository:
1. Install either [`git filter-repo`](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md) or
@@ -248,11 +252,6 @@ increased, your only option is to:
1. Prune all the unneeded stuff locally.
1. Create a new project on GitLab and start using that instead.
-WARNING:
-This process is not suitable for removing sensitive data like password or keys from your repository.
-Information about commits, including file content, is cached in the database, and remain
-visible even after they have been removed from the repository.
-
## Troubleshooting
### Incorrect repository statistics shown in the GUI
diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index 370a349b982..4ca341f0535 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -137,7 +137,7 @@ The **Create merge request** button doesn't display if:
- Your project has an active fork relationship.
To make this button appear, one possible workaround is to
-[remove your project's fork relationship](../settings/index.md#removing-a-fork-relationship).
+[remove your project's fork relationship](../settings/index.md#remove-a-fork-relationship).
After removal, the fork relationship cannot be restored. This project can no longer
be able to receive or send merge requests to the source project, or other forks.
diff --git a/doc/user/project/settings/img/cve_id_request_toggle.png b/doc/user/project/settings/img/cve_id_request_toggle.png
deleted file mode 100644
index 53ec804922c..00000000000
--- a/doc/user/project/settings/img/cve_id_request_toggle.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 46a6c1a049e..7d1bfcaab59 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -278,24 +278,34 @@ When you disable a feature, the following additional features are also disabled:
- Metrics dashboard access requires reading project environments and deployments.
Users with access to the metrics dashboard can also access environments and deployments.
-## Disabling the CVE ID request button **(FREE SAAS)**
+## Disable CVE identifier request in issues **(FREE SAAS)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41203) in GitLab 13.4, only for public projects on GitLab.com.
-In applicable environments, a [**Create CVE ID Request** button](../../application_security/cve_id_request.md)
-is present in the issue sidebar. The button may be disabled on a per-project basis by toggling the
-setting **Enable CVE ID requests in the issue sidebar**.
+In some environments, users can submit a [CVE identifier request](../../application_security/cve_id_request.md) in an issue.
-![CVE ID Request toggle](img/cve_id_request_toggle.png)
+To disable the CVE identifier request option in issues in your project:
-## Disabling email notifications
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand the **Visibility, project features, permissions** section.
+1. Under **Issues**, turn off the **CVE ID requests in the issue sidebar** toggle.
+1. Select **Save changes**.
+
+## Disable project email notifications
-Project owners can disable all [email notifications](../../profile/notifications.md)
-related to the project by selecting the **Disable email notifications** checkbox.
+Prerequisites:
+
+- You must be an Owner of the project to disable email notifications related to the project.
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand the **Visibility, project features, permissions** section.
+1. Clear the **Disable email notifications** checkbox.
## Configure merge request settings for a project
-Set up your project's merge request settings:
+Configure your project's merge request settings:
- Set up the [merge request method](../merge_requests/methods/index.md) (merge commit, fast-forward merge).
- Add merge request [description templates](../description_templates.md#description-templates).
@@ -317,91 +327,74 @@ Enable [Service Desk](../service_desk.md) for your project to offer customer sup
Learn how to [export a project](import_export.md#import-a-project-and-its-data) in GitLab.
-## Advanced settings
+## Advanced project settings
-Here you can run housekeeping, archive, rename, transfer,
-[remove a fork relationship](#removing-a-fork-relationship), or delete a project.
+Use the advanced settings to archive, rename, transfer,
+remove a fork relationship, or delete a project.
-## Archiving a project
+### Archive a project
-Archiving a project makes it read-only for all users and indicates that it's
-no longer actively maintained. Projects that have been archived can also be
-unarchived. Only project owners and administrators have the
-[permissions](../../permissions.md#project-members-permissions) to archive a project.
-
-When a project is archived, the repository, packages, issues, merge requests, and all
-other features are read-only. Archived projects are also hidden
-in project listings.
+When you archive a project, the repository, packages, issues, merge requests, and all
+other features are read-only. Archived projects are also hidden from project listings.
To archive a project:
-1. Navigate to your project's **Settings > General**.
-1. Under **Advanced**, select **Expand**.
+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 **Archive project** section, select **Archive project**.
-1. Confirm the action when asked to.
-
-## Unarchiving a project
+1. To confirm, select **OK**.
-Unarchiving a project removes the read-only restriction on a project, and makes it
-available in project listings. Only project owners and administrators have the
-[permissions](../../permissions.md#project-members-permissions) to unarchive a project.
+### Unarchive a project
-To find an archived project:
+When you unarchive a project, you remove the read-only restriction and make it
+available in project lists.
-1. Sign in to GitLab as the project owner or a user with administrator access.
-1. If you:
- - Have the project's URL, open the project's page in your browser.
- - Don't have the project's URL:
- 1. On the top bar, select **Menu > Project**.
- 1. Select **Explore projects**.
- 1. In the **Sort projects** dropdown box, select **Show archived projects**.
- 1. In the **Filter by name** field, provide the project's name.
- 1. Select the link to the project to open its **Details** page.
+Prerequisites:
-Next, to unarchive the project:
+- To unarchive a project, you must be an administrator or a project Owner.
-1. Navigate to your project's **Settings > General**.
+1. Find the archived project.
+ 1. On the top bar, select **Menu > Project**.
+ 1. Select **Explore projects**.
+ 1. In the **Sort projects** dropdown list, select **Show archived projects**.
+ 1. In the **Filter by name** field, enter the project name.
+ 1. Select the project link.
+1. On the left sidebar, select **Settings > General**.
1. Under **Advanced**, select **Expand**.
1. In the **Unarchive project** section, select **Unarchive project**.
-1. Confirm the action when asked to.
+1. To confirm, select **OK**.
-## Renaming a repository
+### Rename a repository
-NOTE:
-Only project maintainers and administrators have the [permissions](../../permissions.md#project-members-permissions) to rename a
-repository. Not to be confused with a project's name where it can also be
-changed from the [general project settings](#edit-project-name-and-description).
-
-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.
+A project's repository name defines its URL and its place on the file disk
+where GitLab is installed.
-To rename a repository:
+Prerequisites:
-1. Navigate to your project's **Settings > General**.
-1. Under **Advanced**, select **Expand**.
-1. Under **Change path**, update the repository's path.
-1. Select **Change path**.
+You must be a project maintainer or administrator to rename a repository.
-Remember that this can have unintended side effects since everyone with the
-old URL can't push or pull. Read more about what happens with the
+NOTE:
+When you change the repository path, users may experience issues if they push to, or pull from, the old URL. For more information, see
[redirects when renaming repositories](../repository/index.md#what-happens-when-a-repository-path-changes).
-## Transferring an existing project into another namespace
+To rename a repository:
-NOTE:
-Only project owners and administrators have the [permissions](../../permissions.md#project-members-permissions)
-to transfer a project.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand the **Advanced** section.
+1. In the **Change path** text box, edit the path.
+1. Select **Change path**.
+
+## Transfer a project to another namespace
-You can transfer an existing project to another [group](../../group/index.md),
-or you can transfer a [personal project](../working_with_projects.md#view-personal-projects) to a group.
+When you transfer a project to another namespace, you move the project to a different group.
Prerequisites:
-- A group for your project. You can [view your existing groups](../../group/index.md#view-groups)
- to find a suitable group. If you don't have a group, [create one](../../group/index.md#create-a-group).
-- You must have at least the Maintainer role in that group.
-- You must be the Owner of that project.
-- The group to which the project is being transferred to must allow creation of new projects.
+- You must have at least the Maintainer role for the [group](../../group/index.md#create-a-group) to which you are transferring.
+- You must be the Owner of the project you transfer.
+- The group must allow creation of new projects.
- The project must not contain any [container images](../../packages/container_registry/index.md#limitations).
- If you transfer a project to a different root namespace,
the project must not contain any
@@ -416,19 +409,18 @@ To transfer a project:
1. Select **Transfer project**.
1. Enter the project's name and select **Confirm**.
-You are redirected to the project's new URL. Read what happens with the
-[redirects from the old URL to the new one](../repository/index.md#what-happens-when-a-repository-path-changes).
+You are redirected to the project's new page and GitLab applies a redirect. For more information about repository redirects, see [What happens when a repository path changes](../repository/index.md#what-happens-when-a-repository-path-changes).
NOTE:
-GitLab administrators can use the [administration interface](../../admin_area/index.md#administering-projects)
-to move any project to any namespace if needed.
+If you are an administrator, you can also use the [administration interface](../../admin_area/index.md#administering-projects)
+to move any project to any namespace.
-## Transferring a GitLab.com project to a different subscription tier
+### Transferring a GitLab SaaS project to a different subscription tier
-When you transfer a project from a namespace that's licensed for GitLab SaaS Premium or Ultimate to Free, some data related to the paid features is deleted.
+When you transfer a project from a namespace licensed for GitLab SaaS Premium or Ultimate to GitLab Free, the following paid feature data is deleted:
-For example, [project access tokens](../../../user/project/settings/project_access_tokens.md) are revoked, and
-[pipeline subscriptions](../../../ci/pipelines/multi_project_pipelines.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt)
+- [Project access tokens](../../../user/project/settings/project_access_tokens.md) are revoked
+- [Pipeline subscriptions](../../../ci/pipelines/multi_project_pipelines.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt)
and [test cases](../../../ci/test_cases/index.md) are deleted.
## Delete a project
@@ -460,7 +452,7 @@ in GitLab 12.6, and then to [immediate deletion](https://gitlab.com/gitlab-org/g
Projects can be deleted after a delay period. Multiple settings can affect whether
delayed project deletion is enabled for a particular project:
-- Self-managed instance [settings](../../admin_area/settings/visibility_and_access_controls.md#deletion-protection).
+- Self-managed instance [settings](../../admin_area/settings/visibility_and_access_controls.md#delayed-project-deletion).
You can enable delayed project deletion as the default setting for new groups, and configure the number of days for the
delay. For GitLab.com, see the [GitLab.com settings](../../gitlab_com/index.md#delayed-project-deletion).
- Group [settings](../../group/index.md#enable-delayed-project-deletion) to enabled delayed project deletion for all
@@ -499,27 +491,23 @@ To restore a project marked for deletion:
1. Navigate to your project, and select **Settings > General > Advanced**.
1. In the Restore project section, select **Restore project**.
-## Removing a fork relationship
+## Remove a fork relationship
+
+Prerequisites:
-Forking is a great way to [contribute to a project](../repository/forking_workflow.md)
-of which you're not a member.
-If you want to use the fork for yourself and don't need to send
-[merge requests](../merge_requests/index.md) to the upstream project,
-you can safely remove the fork relationship.
+- You must be a project owner to remove a fork relationship.
WARNING:
-Once removed, you can't send merge requests to the source, and if anyone has forked your project, their fork also loses the relationship.
+If you remove a fork relationship, you can't send merge requests to the source. If anyone has forked your project, their fork also loses the relationship.
To restore the fork relationship, [use the API](../../../api/projects.md#create-a-forked-fromto-relation-between-existing-projects).
-To do so:
+To remove a fork relationship:
-1. Navigate to your project's **Settings > General > Advanced**.
-1. Under **Remove fork relationship**, select the likewise-labeled button.
-1. Confirm the action by typing the project's path as instructed.
-
-NOTE:
-Only project owners have the [permissions](../../permissions.md#project-members-permissions)
-to remove a fork relationship.
+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 **Remove fork relationship** section, select **Remove fork relationship**.
+1. To confirm, enter the project path and select **Confirm**.
## Monitor settings
diff --git a/doc/user/project/wiki/img/content_editor_v14.6.png b/doc/user/project/wiki/img/content_editor_v14.6.png
deleted file mode 100644
index 55fca0ace1e..00000000000
--- a/doc/user/project/wiki/img/content_editor_v14.6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/wiki/img/use_new_editor_button_v14.6.png b/doc/user/project/wiki/img/use_new_editor_button_v14.6.png
deleted file mode 100644
index 078fed8a1e9..00000000000
--- a/doc/user/project/wiki/img/use_new_editor_button_v14.6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index 5ae0cf46d9b..6e320923496 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -329,16 +329,15 @@ to disable the wiki but toggle it on (in blue).
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345398) switching between editing experiences in GitLab 14.7 [with a flag](../../../administration/feature_flags.md) named `wiki_switch_between_content_editor_raw_markdown`. Enabled by default.
> - Switching between editing experiences generally available in GitLab 14.10. [Feature flag `wiki_switch_between_content_editor_raw_markdown`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83760) removed.
-GitLab version 14.0 introduces a WYSIWYG editing experience for GitLab Flavored Markdown
-in Wikis through the [Content Editor](../../../development/fe_guide/content_editor.md).
-The Content Editor is under active development, and is not yet the default editing
-experience in the Wiki. To opt in for the new editor:
+GitLab provides a WYSIWYG editing experience for GitLab Flavored Markdown in wikis.
-1. Create a new wiki page, or edit an existing one.
-1. Ensure the wiki page uses the Markdown format. Other formats are not yet supported.
-1. Above the content field, select **Edit rich text**:
+Support includes:
- ![Use new editor button image](img/use_new_editor_button_v14.6.png)
+- Text formatting options, including bold, italics, block quotes, headings, and inline code.
+- List formatting for unordered, numbered, and checklists.
+- Creating and editing the structure of tables.
+- Inserting and formatting code blocks with syntax highlighting.
+- Live preview of Mermaid, PlantUML, and Kroki diagrams ([Introduced]<https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86701> in GitLab 15.2).
### Use the Content Editor
@@ -346,9 +345,10 @@ experience in the Wiki. To opt in for the new editor:
1. Select **Markdown** as your format.
1. Above **Content**, select **Edit rich text**.
1. Customize your page's content using the various formatting options available in the content editor.
-1. Select **Create page** for a new page, or **Save changes** for an existing page:
+1. Select **Create page** for a new page, or **Save changes** for an existing page.
- ![Content Editor in Wikis image](img/content_editor_v14.6.png)
+The rich text editing mode remains the default until you switch back to
+[edit the raw source](#switch-back-to-the-old-editor).
### Switch back to the old editor
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 83cab819f54..9572bc241fc 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -198,7 +198,7 @@ GitLab creates your project in your chosen namespace.
You cannot use `git push` to create projects with project paths that:
- Have previously been used.
-- Have been [renamed](settings/index.md#renaming-a-repository).
+- Have been [renamed](settings/index.md#rename-a-repository).
Previously used project paths have a redirect. The redirect causes push attempts to redirect requests
to the renamed project location, instead of creating a new project. To create a new project for a previously
@@ -391,7 +391,7 @@ To use a project as a Go package, use the `go get` and `godoc.org` discovery req
Prerequisites:
- Your GitLab instance must be accessible with HTTPS.
-- You must have a [personal access token](../profile/personal_access_tokens.md).
+- You must have a [personal access token](../profile/personal_access_tokens.md) with `read_api` scope.
To authenticate Go requests, create a [`.netrc`](https://everything.curl.dev/usingcurl/netrc) file with the following information:
@@ -423,7 +423,7 @@ Configure Git to either:
- Use SSH instead of HTTPS:
```shell
- git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com"
+ git config --global url."git@gitlab.example.com:".insteadOf "https://gitlab.example.com/"
```
### Disable Go module fetching for private projects
diff --git a/doc/user/public_access.md b/doc/user/public_access.md
index cca753a2830..d821c1abe47 100644
--- a/doc/user/public_access.md
+++ b/doc/user/public_access.md
@@ -70,6 +70,8 @@ Prerequisite:
Prerequisite:
- You must have the Owner role for a group.
+- Subgroups and projects must already have visibility settings that are at least as
+ restrictive as the new setting for the group.
1. On the top bar, select **Menu > Groups** and find your project.
1. On the left sidebar, select **Settings > General**.
diff --git a/doc/user/search/advanced_search.md b/doc/user/search/advanced_search.md
index 075c9b6154b..90d6a15901a 100644
--- a/doc/user/search/advanced_search.md
+++ b/doc/user/search/advanced_search.md
@@ -84,15 +84,8 @@ its performance:
## Global Search validation
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/346263) in GitLab 14.6 [with a flag](../../administration/feature_flags.md) named `prevent_abusive_searches`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available,
-ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `prevent_abusive_searches`.
-The feature is not ready for production use.
-
To prevent abusive searches, such as searches that may result in a Distributed Denial of Service (DDoS), Global Search ignores, logs, and
-doesn't return any results for searches considered abusive according to the following criteria, if `prevent_abusive_searches` feature flag is enabled:
+doesn't return any results for searches considered abusive according to the following criteria:
- Searches with less than 2 characters.
- Searches with any term greater than 100 characters. URL search terms have a maximum of 200 characters.
@@ -101,8 +94,7 @@ doesn't return any results for searches considered abusive according to the foll
- Searches with a `repository_ref` or `project_ref` parameter that has special characters not allowed by [Git refname](https://git-scm.com/docs/git-check-ref-format).
- Searches with a `scope` that is unknown.
-Regardless of the status of the `prevent_abusive_searches` feature flag, searches that don't
-comply with the criteria described below aren't logged as abusive but are flagged with an error:
+Searches that don't comply with the criteria described below aren't logged as abusive but are flagged with an error:
- Searches with more than 4096 characters.
- Searches with more than 64 terms.
diff --git a/doc/user/search/img/basic_search_results_v15_1.png b/doc/user/search/img/basic_search_results_v15_1.png
index b85627c9b95..0de0b976d7d 100644
--- a/doc/user/search/img/basic_search_results_v15_1.png
+++ b/doc/user/search/img/basic_search_results_v15_1.png
Binary files differ
diff --git a/doc/user/search/img/code_search_git_blame_v15_1.png b/doc/user/search/img/code_search_git_blame_v15_1.png
index e61ee5993c2..426f829b186 100644
--- a/doc/user/search/img/code_search_git_blame_v15_1.png
+++ b/doc/user/search/img/code_search_git_blame_v15_1.png
Binary files differ
diff --git a/doc/user/ssh.md b/doc/user/ssh.md
index 27bb7124afe..e884d762379 100644
--- a/doc/user/ssh.md
+++ b/doc/user/ssh.md
@@ -354,7 +354,7 @@ can do this by using the command in the [previous topic](#use-different-keys-for
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.
+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
diff --git a/doc/user/tasks.md b/doc/user/tasks.md
index fc49661c61c..36236f2969e 100644
--- a/doc/user/tasks.md
+++ b/doc/user/tasks.md
@@ -6,7 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Tasks **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334812) in GitLab 14.5 [with a flag](../administration/feature_flags.md) named `work_items`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334812) in GitLab 14.5 [with a flag](../administration/feature_flags.md) named `work_items`. Disabled by default.
+> - [Creating, editing, and deleting tasks](https://gitlab.com/groups/gitlab-org/-/epics/7169) introduced in GitLab 15.0.
FLAG:
On self-managed GitLab, by default this feature is not available. To make it available,
@@ -32,8 +33,7 @@ to work items and adding custom work item types, visit
To create a task:
1. In an issue description, create a [task list](markdown.md#task-lists).
-1. Hover over a task item and select **Convert to work item** (**{doc-new}**).
-1. Confirm or edit the title, and select **Create work item**.
+1. Hover over a task item and select **Create task** (**{doc-new}**).
## Edit a task
@@ -42,11 +42,11 @@ To edit a task:
1. In the issue description, view the task links.
1. Select a link. The task is displayed.
- To edit the description, select **Edit**, then select **Save**.
- - To edit the title or state, make your changes, then click outside the field. The changes are saved automatically.
+ - To edit the title or state, make your changes, then select any area outside the field. The changes are saved automatically.
## Delete a task
To delete a task:
1. In the issue description, select the task.
-1. From the options menu (**{ellipsis_v}**), select **Delete work item**.
+1. From the options menu (**{ellipsis_v}**), select **Delete task**.
diff --git a/doc/user/usage_quotas.md b/doc/user/usage_quotas.md
index 84c98a60917..c863a9d8270 100644
--- a/doc/user/usage_quotas.md
+++ b/doc/user/usage_quotas.md
@@ -10,11 +10,57 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/13294) in GitLab 12.0.
> - Moved to GitLab Free.
-NOTE:
-Free tier namespaces on GitLab SaaS have a 5GB storage limit. This limit is not visible on the storage quota page nor currently enforced for users who exceed the limit. To learn more, visit our [pricing page](https://about.gitlab.com/pricing/).
+## Namespace storage limit
-A project's repository has a free storage quota of 10 GB. When a project's repository reaches
-the quota it is locked. You cannot push changes to a locked project. To monitor the size of each
+Namespaces on a GitLab SaaS Free tier have a 5 GB storage limit. For more information, see our [pricing page](https://about.gitlab.com/pricing/).
+This limit is not visible on the storage quota page, but we plan to make it visible and enforced starting October 19, 2022.
+
+Storage types that add to the total namespace storage are:
+
+- Git repository
+- Git LFS
+- Artifacts
+- Container registry
+- Package registry
+- Dependecy proxy
+- Wiki
+- Snippets
+
+If your total namespace storage exceeds the available namespace storage quota, all projects under the namespace are locked. A locked project will not be able to push to the repository, run pipelines and jobs, or build and push packages.
+
+To prevent exceeding the namespace storage quota, you can:
+
+1. [Purchase more storage](../subscriptions/gitlab_com/index.md#purchase-more-storage-and-transfer).
+1. [Upgrade to a paid tier](../subscriptions/gitlab_com/#upgrade-your-gitlab-saas-subscription-tier).
+1. [Reduce storage usage](#manage-your-storage-usage).
+
+### Namespace storage limit enforcement schedule
+
+Starting October 19, 2022, a storage limit will be enforced on all GitLab Free namespaces.
+We will start with a large limit enforcement and eventually reduce it to 5 GB.
+
+The following table describes the enforcement schedule, which is subject to change.
+
+| Target enforcement date | Limit | Expected Impact | Status |
+| ------ | ------ | ------ | ------ |
+| October 19, 2022 | 45,000 GB | LOW | Pending (**{hourglass}**)|
+| October 20, 2022 | 7,500 GB | LOW | Pending (**{hourglass}**)|
+| October 24, 2022 | 500 GB | MEDIUM | Pending (**{hourglass}**)|
+| October 27, 2022 | 75 GB | MEDIUM HIGH | Pending (**{hourglass}**)|
+| November 2, 2022 | 10 GB | HIGH | Pending (**{hourglass}**)|
+| November 9, 2022 | 5 GB | VERY HIGH | Pending (**{hourglass}**)|
+
+Namespaces that reach the enforced limit will have their projects locked. To unlock your project, you will have to [manage its storage](#manage-your-storage-usage).
+
+### Project storage limit
+
+Namespaces on a GitLab SaaS **paid** tier (Premium and Ultimate) have a storage limit on their project repositories.
+A project's repository has a storage quota of 10 GB. A namespace has either a namespace-level storage limit or a project-level storage limit, but not both.
+
+- Paid tier namespaces have project-level storage limits enforced.
+- Free tier namespaces have namespace-level storage limits.
+
+When a project's repository reaches the quota, the project is locked. You cannot push changes to a locked project. To monitor the size of each
repository in a namespace, including a breakdown for each project, you can
[view storage usage](#view-storage-usage). To allow a project's repository to exceed the free quota
you must purchase additional storage. For more details, see [Excess storage usage](#excess-storage-usage).
diff --git a/glfm_specification/example_snapshots/examples_index.yml b/glfm_specification/example_snapshots/examples_index.yml
new file mode 100644
index 00000000000..9b601460b1d
--- /dev/null
+++ b/glfm_specification/example_snapshots/examples_index.yml
@@ -0,0 +1,2017 @@
+---
+02_01__preliminaries__tabs__001:
+ spec_txt_example_position: 1
+ source_specification: commonmark
+02_01__preliminaries__tabs__002:
+ spec_txt_example_position: 2
+ source_specification: commonmark
+02_01__preliminaries__tabs__003:
+ spec_txt_example_position: 3
+ source_specification: commonmark
+02_01__preliminaries__tabs__004:
+ spec_txt_example_position: 4
+ source_specification: commonmark
+02_01__preliminaries__tabs__005:
+ spec_txt_example_position: 5
+ source_specification: commonmark
+02_01__preliminaries__tabs__006:
+ spec_txt_example_position: 6
+ source_specification: commonmark
+02_01__preliminaries__tabs__007:
+ spec_txt_example_position: 7
+ source_specification: commonmark
+02_01__preliminaries__tabs__008:
+ spec_txt_example_position: 8
+ source_specification: commonmark
+02_01__preliminaries__tabs__009:
+ spec_txt_example_position: 9
+ source_specification: commonmark
+02_01__preliminaries__tabs__010:
+ spec_txt_example_position: 10
+ source_specification: commonmark
+02_01__preliminaries__tabs__011:
+ spec_txt_example_position: 11
+ source_specification: commonmark
+03_01__blocks_and_inlines__precedence__001:
+ spec_txt_example_position: 12
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__001:
+ spec_txt_example_position: 13
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__002:
+ spec_txt_example_position: 14
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__003:
+ spec_txt_example_position: 15
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__004:
+ spec_txt_example_position: 16
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__005:
+ spec_txt_example_position: 17
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__006:
+ spec_txt_example_position: 18
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__007:
+ spec_txt_example_position: 19
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__008:
+ spec_txt_example_position: 20
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__009:
+ spec_txt_example_position: 21
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__010:
+ spec_txt_example_position: 22
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__011:
+ spec_txt_example_position: 23
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__012:
+ spec_txt_example_position: 24
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__013:
+ spec_txt_example_position: 25
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__014:
+ spec_txt_example_position: 26
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__015:
+ spec_txt_example_position: 27
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__016:
+ spec_txt_example_position: 28
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__017:
+ spec_txt_example_position: 29
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__018:
+ spec_txt_example_position: 30
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__019:
+ spec_txt_example_position: 31
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__001:
+ spec_txt_example_position: 32
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__002:
+ spec_txt_example_position: 33
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__003:
+ spec_txt_example_position: 34
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__004:
+ spec_txt_example_position: 35
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__005:
+ spec_txt_example_position: 36
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__006:
+ spec_txt_example_position: 37
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__007:
+ spec_txt_example_position: 38
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__008:
+ spec_txt_example_position: 39
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__009:
+ spec_txt_example_position: 40
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__010:
+ spec_txt_example_position: 41
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__011:
+ spec_txt_example_position: 42
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__012:
+ spec_txt_example_position: 43
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__013:
+ spec_txt_example_position: 44
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__014:
+ spec_txt_example_position: 45
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__015:
+ spec_txt_example_position: 46
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__016:
+ spec_txt_example_position: 47
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__017:
+ spec_txt_example_position: 48
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__018:
+ spec_txt_example_position: 49
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__001:
+ spec_txt_example_position: 50
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__002:
+ spec_txt_example_position: 51
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__003:
+ spec_txt_example_position: 52
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__004:
+ spec_txt_example_position: 53
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__005:
+ spec_txt_example_position: 54
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__006:
+ spec_txt_example_position: 55
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__007:
+ spec_txt_example_position: 56
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__008:
+ spec_txt_example_position: 57
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__009:
+ spec_txt_example_position: 58
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__010:
+ spec_txt_example_position: 59
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__011:
+ spec_txt_example_position: 60
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__012:
+ spec_txt_example_position: 61
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__013:
+ spec_txt_example_position: 62
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__014:
+ spec_txt_example_position: 63
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__015:
+ spec_txt_example_position: 64
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__016:
+ spec_txt_example_position: 65
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__017:
+ spec_txt_example_position: 66
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__018:
+ spec_txt_example_position: 67
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__019:
+ spec_txt_example_position: 68
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__020:
+ spec_txt_example_position: 69
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__021:
+ spec_txt_example_position: 70
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__022:
+ spec_txt_example_position: 71
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__023:
+ spec_txt_example_position: 72
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__024:
+ spec_txt_example_position: 73
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__025:
+ spec_txt_example_position: 74
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__026:
+ spec_txt_example_position: 75
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__027:
+ spec_txt_example_position: 76
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__001:
+ spec_txt_example_position: 77
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__002:
+ spec_txt_example_position: 78
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__003:
+ spec_txt_example_position: 79
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__004:
+ spec_txt_example_position: 80
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__005:
+ spec_txt_example_position: 81
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__006:
+ spec_txt_example_position: 82
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__007:
+ spec_txt_example_position: 83
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__008:
+ spec_txt_example_position: 84
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__009:
+ spec_txt_example_position: 85
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__010:
+ spec_txt_example_position: 86
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__011:
+ spec_txt_example_position: 87
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__012:
+ spec_txt_example_position: 88
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__001:
+ spec_txt_example_position: 89
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__002:
+ spec_txt_example_position: 90
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__003:
+ spec_txt_example_position: 91
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__004:
+ spec_txt_example_position: 92
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__005:
+ spec_txt_example_position: 93
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__006:
+ spec_txt_example_position: 94
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__007:
+ spec_txt_example_position: 95
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__008:
+ spec_txt_example_position: 96
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__009:
+ spec_txt_example_position: 97
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__010:
+ spec_txt_example_position: 98
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__011:
+ spec_txt_example_position: 99
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__012:
+ spec_txt_example_position: 100
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__013:
+ spec_txt_example_position: 101
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__014:
+ spec_txt_example_position: 102
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__015:
+ spec_txt_example_position: 103
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__016:
+ spec_txt_example_position: 104
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__017:
+ spec_txt_example_position: 105
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__018:
+ spec_txt_example_position: 106
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__019:
+ spec_txt_example_position: 107
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__020:
+ spec_txt_example_position: 108
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__021:
+ spec_txt_example_position: 109
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__022:
+ spec_txt_example_position: 110
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__023:
+ spec_txt_example_position: 111
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__024:
+ spec_txt_example_position: 112
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__025:
+ spec_txt_example_position: 113
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__026:
+ spec_txt_example_position: 114
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__027:
+ spec_txt_example_position: 115
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__028:
+ spec_txt_example_position: 116
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__029:
+ spec_txt_example_position: 117
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__001:
+ spec_txt_example_position: 118
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__002:
+ spec_txt_example_position: 119
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__003:
+ spec_txt_example_position: 120
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__004:
+ spec_txt_example_position: 121
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__005:
+ spec_txt_example_position: 122
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__006:
+ spec_txt_example_position: 123
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__007:
+ spec_txt_example_position: 124
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__008:
+ spec_txt_example_position: 125
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__009:
+ spec_txt_example_position: 126
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__010:
+ spec_txt_example_position: 127
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__011:
+ spec_txt_example_position: 128
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__012:
+ spec_txt_example_position: 129
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__013:
+ spec_txt_example_position: 130
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__014:
+ spec_txt_example_position: 131
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__015:
+ spec_txt_example_position: 132
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__016:
+ spec_txt_example_position: 133
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__017:
+ spec_txt_example_position: 134
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__018:
+ spec_txt_example_position: 135
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__019:
+ spec_txt_example_position: 136
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__020:
+ spec_txt_example_position: 137
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__021:
+ spec_txt_example_position: 138
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__022:
+ spec_txt_example_position: 139
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__023:
+ spec_txt_example_position: 140
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__024:
+ spec_txt_example_position: 141
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__025:
+ spec_txt_example_position: 142
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__026:
+ spec_txt_example_position: 143
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__027:
+ spec_txt_example_position: 144
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__028:
+ spec_txt_example_position: 145
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__029:
+ spec_txt_example_position: 146
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__030:
+ spec_txt_example_position: 147
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__031:
+ spec_txt_example_position: 148
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__032:
+ spec_txt_example_position: 149
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__033:
+ spec_txt_example_position: 150
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__034:
+ spec_txt_example_position: 151
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__035:
+ spec_txt_example_position: 152
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__036:
+ spec_txt_example_position: 153
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__037:
+ spec_txt_example_position: 154
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__038:
+ spec_txt_example_position: 155
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__039:
+ spec_txt_example_position: 156
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__040:
+ spec_txt_example_position: 157
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__041:
+ spec_txt_example_position: 158
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__042:
+ spec_txt_example_position: 159
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__043:
+ spec_txt_example_position: 160
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__001:
+ spec_txt_example_position: 161
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__002:
+ spec_txt_example_position: 162
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__003:
+ spec_txt_example_position: 163
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__004:
+ spec_txt_example_position: 164
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__005:
+ spec_txt_example_position: 165
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__006:
+ spec_txt_example_position: 166
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__007:
+ spec_txt_example_position: 167
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__008:
+ spec_txt_example_position: 168
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__009:
+ spec_txt_example_position: 169
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__010:
+ spec_txt_example_position: 170
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__011:
+ spec_txt_example_position: 171
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__012:
+ spec_txt_example_position: 172
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__013:
+ spec_txt_example_position: 173
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__014:
+ spec_txt_example_position: 174
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__015:
+ spec_txt_example_position: 175
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__016:
+ spec_txt_example_position: 176
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__017:
+ spec_txt_example_position: 177
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__018:
+ spec_txt_example_position: 178
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__019:
+ spec_txt_example_position: 179
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__020:
+ spec_txt_example_position: 180
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__021:
+ spec_txt_example_position: 181
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__022:
+ spec_txt_example_position: 182
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__023:
+ spec_txt_example_position: 183
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__024:
+ spec_txt_example_position: 184
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__025:
+ spec_txt_example_position: 185
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__026:
+ spec_txt_example_position: 186
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__027:
+ spec_txt_example_position: 187
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__028:
+ spec_txt_example_position: 188
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__001:
+ spec_txt_example_position: 189
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__002:
+ spec_txt_example_position: 190
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__003:
+ spec_txt_example_position: 191
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__004:
+ spec_txt_example_position: 192
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__005:
+ spec_txt_example_position: 193
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__006:
+ spec_txt_example_position: 194
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__007:
+ spec_txt_example_position: 195
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__008:
+ spec_txt_example_position: 196
+ source_specification: commonmark
+04_09__leaf_blocks__blank_lines__001:
+ spec_txt_example_position: 197
+ source_specification: commonmark
+04_10__leaf_blocks__tables_extension__001:
+ spec_txt_example_position: 198
+ source_specification: github
+04_10__leaf_blocks__tables_extension__002:
+ spec_txt_example_position: 199
+ source_specification: github
+04_10__leaf_blocks__tables_extension__003:
+ spec_txt_example_position: 200
+ source_specification: github
+04_10__leaf_blocks__tables_extension__004:
+ spec_txt_example_position: 201
+ source_specification: github
+04_10__leaf_blocks__tables_extension__005:
+ spec_txt_example_position: 202
+ source_specification: github
+04_10__leaf_blocks__tables_extension__006:
+ spec_txt_example_position: 203
+ source_specification: github
+04_10__leaf_blocks__tables_extension__007:
+ spec_txt_example_position: 204
+ source_specification: github
+04_10__leaf_blocks__tables_extension__008:
+ spec_txt_example_position: 205
+ source_specification: github
+05_01__container_blocks__block_quotes__001:
+ spec_txt_example_position: 206
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__002:
+ spec_txt_example_position: 207
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__003:
+ spec_txt_example_position: 208
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__004:
+ spec_txt_example_position: 209
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__005:
+ spec_txt_example_position: 210
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__006:
+ spec_txt_example_position: 211
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__007:
+ spec_txt_example_position: 212
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__008:
+ spec_txt_example_position: 213
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__009:
+ spec_txt_example_position: 214
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__010:
+ spec_txt_example_position: 215
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__011:
+ spec_txt_example_position: 216
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__012:
+ spec_txt_example_position: 217
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__013:
+ spec_txt_example_position: 218
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__014:
+ spec_txt_example_position: 219
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__015:
+ spec_txt_example_position: 220
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__016:
+ spec_txt_example_position: 221
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__017:
+ spec_txt_example_position: 222
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__018:
+ spec_txt_example_position: 223
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__019:
+ spec_txt_example_position: 224
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__020:
+ spec_txt_example_position: 225
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__021:
+ spec_txt_example_position: 226
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__022:
+ spec_txt_example_position: 227
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__023:
+ spec_txt_example_position: 228
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__024:
+ spec_txt_example_position: 229
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__025:
+ spec_txt_example_position: 230
+ source_specification: commonmark
+05_02__container_blocks__list_items__001:
+ spec_txt_example_position: 231
+ source_specification: commonmark
+05_02__container_blocks__list_items__002:
+ spec_txt_example_position: 232
+ source_specification: commonmark
+05_02__container_blocks__list_items__003:
+ spec_txt_example_position: 233
+ source_specification: commonmark
+05_02__container_blocks__list_items__004:
+ spec_txt_example_position: 234
+ source_specification: commonmark
+05_02__container_blocks__list_items__005:
+ spec_txt_example_position: 235
+ source_specification: commonmark
+05_02__container_blocks__list_items__006:
+ spec_txt_example_position: 236
+ source_specification: commonmark
+05_02__container_blocks__list_items__007:
+ spec_txt_example_position: 237
+ source_specification: commonmark
+05_02__container_blocks__list_items__008:
+ spec_txt_example_position: 238
+ source_specification: commonmark
+05_02__container_blocks__list_items__009:
+ spec_txt_example_position: 239
+ source_specification: commonmark
+05_02__container_blocks__list_items__010:
+ spec_txt_example_position: 240
+ source_specification: commonmark
+05_02__container_blocks__list_items__011:
+ spec_txt_example_position: 241
+ source_specification: commonmark
+05_02__container_blocks__list_items__012:
+ spec_txt_example_position: 242
+ source_specification: commonmark
+05_02__container_blocks__list_items__013:
+ spec_txt_example_position: 243
+ source_specification: commonmark
+05_02__container_blocks__list_items__014:
+ spec_txt_example_position: 244
+ source_specification: commonmark
+05_02__container_blocks__list_items__015:
+ spec_txt_example_position: 245
+ source_specification: commonmark
+05_02__container_blocks__list_items__016:
+ spec_txt_example_position: 246
+ source_specification: commonmark
+05_02__container_blocks__list_items__017:
+ spec_txt_example_position: 247
+ source_specification: commonmark
+05_02__container_blocks__list_items__018:
+ spec_txt_example_position: 248
+ source_specification: commonmark
+05_02__container_blocks__list_items__019:
+ spec_txt_example_position: 249
+ source_specification: commonmark
+05_02__container_blocks__list_items__020:
+ spec_txt_example_position: 250
+ source_specification: commonmark
+05_02__container_blocks__list_items__021:
+ spec_txt_example_position: 251
+ source_specification: commonmark
+05_02__container_blocks__list_items__022:
+ spec_txt_example_position: 252
+ source_specification: commonmark
+05_02__container_blocks__list_items__023:
+ spec_txt_example_position: 253
+ source_specification: commonmark
+05_02__container_blocks__list_items__024:
+ spec_txt_example_position: 254
+ source_specification: commonmark
+05_02__container_blocks__list_items__025:
+ spec_txt_example_position: 255
+ source_specification: commonmark
+05_02__container_blocks__list_items__026:
+ spec_txt_example_position: 256
+ source_specification: commonmark
+05_02__container_blocks__list_items__027:
+ spec_txt_example_position: 257
+ source_specification: commonmark
+05_02__container_blocks__list_items__028:
+ spec_txt_example_position: 258
+ source_specification: commonmark
+05_02__container_blocks__list_items__029:
+ spec_txt_example_position: 259
+ source_specification: commonmark
+05_02__container_blocks__list_items__030:
+ spec_txt_example_position: 260
+ source_specification: commonmark
+05_02__container_blocks__list_items__031:
+ spec_txt_example_position: 261
+ source_specification: commonmark
+05_02__container_blocks__list_items__032:
+ spec_txt_example_position: 262
+ source_specification: commonmark
+05_02__container_blocks__list_items__033:
+ spec_txt_example_position: 263
+ source_specification: commonmark
+05_02__container_blocks__list_items__034:
+ spec_txt_example_position: 264
+ source_specification: commonmark
+05_02__container_blocks__list_items__035:
+ spec_txt_example_position: 265
+ source_specification: commonmark
+05_02__container_blocks__list_items__036:
+ spec_txt_example_position: 266
+ source_specification: commonmark
+05_02__container_blocks__list_items__037:
+ spec_txt_example_position: 267
+ source_specification: commonmark
+05_02__container_blocks__list_items__038:
+ spec_txt_example_position: 268
+ source_specification: commonmark
+05_02__container_blocks__list_items__039:
+ spec_txt_example_position: 269
+ source_specification: commonmark
+05_02__container_blocks__list_items__040:
+ spec_txt_example_position: 270
+ source_specification: commonmark
+05_02__container_blocks__list_items__041:
+ spec_txt_example_position: 271
+ source_specification: commonmark
+05_02__container_blocks__list_items__042:
+ spec_txt_example_position: 272
+ source_specification: commonmark
+05_02__container_blocks__list_items__043:
+ spec_txt_example_position: 273
+ source_specification: commonmark
+05_02__container_blocks__list_items__044:
+ spec_txt_example_position: 274
+ source_specification: commonmark
+05_02__container_blocks__list_items__045:
+ spec_txt_example_position: 275
+ source_specification: commonmark
+05_02__container_blocks__list_items__046:
+ spec_txt_example_position: 276
+ source_specification: commonmark
+05_02__container_blocks__list_items__047:
+ spec_txt_example_position: 277
+ source_specification: commonmark
+05_02__container_blocks__list_items__048:
+ spec_txt_example_position: 278
+ source_specification: commonmark
+05_04__container_blocks__lists__001:
+ spec_txt_example_position: 281
+ source_specification: commonmark
+05_04__container_blocks__lists__002:
+ spec_txt_example_position: 282
+ source_specification: commonmark
+05_04__container_blocks__lists__003:
+ spec_txt_example_position: 283
+ source_specification: commonmark
+05_04__container_blocks__lists__004:
+ spec_txt_example_position: 284
+ source_specification: commonmark
+05_04__container_blocks__lists__005:
+ spec_txt_example_position: 285
+ source_specification: commonmark
+05_04__container_blocks__lists__006:
+ spec_txt_example_position: 286
+ source_specification: commonmark
+05_04__container_blocks__lists__007:
+ spec_txt_example_position: 287
+ source_specification: commonmark
+05_04__container_blocks__lists__008:
+ spec_txt_example_position: 288
+ source_specification: commonmark
+05_04__container_blocks__lists__009:
+ spec_txt_example_position: 289
+ source_specification: commonmark
+05_04__container_blocks__lists__010:
+ spec_txt_example_position: 290
+ source_specification: commonmark
+05_04__container_blocks__lists__011:
+ spec_txt_example_position: 291
+ source_specification: commonmark
+05_04__container_blocks__lists__012:
+ spec_txt_example_position: 292
+ source_specification: commonmark
+05_04__container_blocks__lists__013:
+ spec_txt_example_position: 293
+ source_specification: commonmark
+05_04__container_blocks__lists__014:
+ spec_txt_example_position: 294
+ source_specification: commonmark
+05_04__container_blocks__lists__015:
+ spec_txt_example_position: 295
+ source_specification: commonmark
+05_04__container_blocks__lists__016:
+ spec_txt_example_position: 296
+ source_specification: commonmark
+05_04__container_blocks__lists__017:
+ spec_txt_example_position: 297
+ source_specification: commonmark
+05_04__container_blocks__lists__018:
+ spec_txt_example_position: 298
+ source_specification: commonmark
+05_04__container_blocks__lists__019:
+ spec_txt_example_position: 299
+ source_specification: commonmark
+05_04__container_blocks__lists__020:
+ spec_txt_example_position: 300
+ source_specification: commonmark
+05_04__container_blocks__lists__021:
+ spec_txt_example_position: 301
+ source_specification: commonmark
+05_04__container_blocks__lists__022:
+ spec_txt_example_position: 302
+ source_specification: commonmark
+05_04__container_blocks__lists__023:
+ spec_txt_example_position: 303
+ source_specification: commonmark
+05_04__container_blocks__lists__024:
+ spec_txt_example_position: 304
+ source_specification: commonmark
+05_04__container_blocks__lists__025:
+ spec_txt_example_position: 305
+ source_specification: commonmark
+05_04__container_blocks__lists__026:
+ spec_txt_example_position: 306
+ source_specification: commonmark
+06_01__inlines__001:
+ spec_txt_example_position: 307
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__001:
+ spec_txt_example_position: 308
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__002:
+ spec_txt_example_position: 309
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__003:
+ spec_txt_example_position: 310
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__004:
+ spec_txt_example_position: 311
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__005:
+ spec_txt_example_position: 312
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__006:
+ spec_txt_example_position: 313
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__007:
+ spec_txt_example_position: 314
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__008:
+ spec_txt_example_position: 315
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__009:
+ spec_txt_example_position: 316
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__010:
+ spec_txt_example_position: 317
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__011:
+ spec_txt_example_position: 318
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__012:
+ spec_txt_example_position: 319
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__013:
+ spec_txt_example_position: 320
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__001:
+ spec_txt_example_position: 321
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__002:
+ spec_txt_example_position: 322
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__003:
+ spec_txt_example_position: 323
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__004:
+ spec_txt_example_position: 324
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__005:
+ spec_txt_example_position: 325
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__006:
+ spec_txt_example_position: 326
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__007:
+ spec_txt_example_position: 327
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__008:
+ spec_txt_example_position: 328
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__009:
+ spec_txt_example_position: 329
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__010:
+ spec_txt_example_position: 330
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__011:
+ spec_txt_example_position: 331
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__012:
+ spec_txt_example_position: 332
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__013:
+ spec_txt_example_position: 333
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__014:
+ spec_txt_example_position: 334
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__015:
+ spec_txt_example_position: 335
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__016:
+ spec_txt_example_position: 336
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__017:
+ spec_txt_example_position: 337
+ source_specification: commonmark
+06_04__inlines__code_spans__001:
+ spec_txt_example_position: 338
+ source_specification: commonmark
+06_04__inlines__code_spans__002:
+ spec_txt_example_position: 339
+ source_specification: commonmark
+06_04__inlines__code_spans__003:
+ spec_txt_example_position: 340
+ source_specification: commonmark
+06_04__inlines__code_spans__004:
+ spec_txt_example_position: 341
+ source_specification: commonmark
+06_04__inlines__code_spans__005:
+ spec_txt_example_position: 342
+ source_specification: commonmark
+06_04__inlines__code_spans__006:
+ spec_txt_example_position: 343
+ source_specification: commonmark
+06_04__inlines__code_spans__007:
+ spec_txt_example_position: 344
+ source_specification: commonmark
+06_04__inlines__code_spans__008:
+ spec_txt_example_position: 345
+ source_specification: commonmark
+06_04__inlines__code_spans__009:
+ spec_txt_example_position: 346
+ source_specification: commonmark
+06_04__inlines__code_spans__010:
+ spec_txt_example_position: 347
+ source_specification: commonmark
+06_04__inlines__code_spans__011:
+ spec_txt_example_position: 348
+ source_specification: commonmark
+06_04__inlines__code_spans__012:
+ spec_txt_example_position: 349
+ source_specification: commonmark
+06_04__inlines__code_spans__013:
+ spec_txt_example_position: 350
+ source_specification: commonmark
+06_04__inlines__code_spans__014:
+ spec_txt_example_position: 351
+ source_specification: commonmark
+06_04__inlines__code_spans__015:
+ spec_txt_example_position: 352
+ source_specification: commonmark
+06_04__inlines__code_spans__016:
+ spec_txt_example_position: 353
+ source_specification: commonmark
+06_04__inlines__code_spans__017:
+ spec_txt_example_position: 354
+ source_specification: commonmark
+06_04__inlines__code_spans__018:
+ spec_txt_example_position: 355
+ source_specification: commonmark
+06_04__inlines__code_spans__019:
+ spec_txt_example_position: 356
+ source_specification: commonmark
+06_04__inlines__code_spans__020:
+ spec_txt_example_position: 357
+ source_specification: commonmark
+06_04__inlines__code_spans__021:
+ spec_txt_example_position: 358
+ source_specification: commonmark
+06_04__inlines__code_spans__022:
+ spec_txt_example_position: 359
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__001:
+ spec_txt_example_position: 360
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__002:
+ spec_txt_example_position: 361
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__003:
+ spec_txt_example_position: 362
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__004:
+ spec_txt_example_position: 363
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__005:
+ spec_txt_example_position: 364
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__006:
+ spec_txt_example_position: 365
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__007:
+ spec_txt_example_position: 366
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__008:
+ spec_txt_example_position: 367
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__009:
+ spec_txt_example_position: 368
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__010:
+ spec_txt_example_position: 369
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__011:
+ spec_txt_example_position: 370
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__012:
+ spec_txt_example_position: 371
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__013:
+ spec_txt_example_position: 372
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__014:
+ spec_txt_example_position: 373
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__015:
+ spec_txt_example_position: 374
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__016:
+ spec_txt_example_position: 375
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__017:
+ spec_txt_example_position: 376
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__018:
+ spec_txt_example_position: 377
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__019:
+ spec_txt_example_position: 378
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__020:
+ spec_txt_example_position: 379
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__021:
+ spec_txt_example_position: 380
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__022:
+ spec_txt_example_position: 381
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__023:
+ spec_txt_example_position: 382
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__024:
+ spec_txt_example_position: 383
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__025:
+ spec_txt_example_position: 384
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__026:
+ spec_txt_example_position: 385
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__027:
+ spec_txt_example_position: 386
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__028:
+ spec_txt_example_position: 387
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__029:
+ spec_txt_example_position: 388
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__030:
+ spec_txt_example_position: 389
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__031:
+ spec_txt_example_position: 390
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__032:
+ spec_txt_example_position: 391
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__033:
+ spec_txt_example_position: 392
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__034:
+ spec_txt_example_position: 393
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__035:
+ spec_txt_example_position: 394
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__036:
+ spec_txt_example_position: 395
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__037:
+ spec_txt_example_position: 396
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__038:
+ spec_txt_example_position: 397
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__039:
+ spec_txt_example_position: 398
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__040:
+ spec_txt_example_position: 399
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__041:
+ spec_txt_example_position: 400
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__042:
+ spec_txt_example_position: 401
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__043:
+ spec_txt_example_position: 402
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__044:
+ spec_txt_example_position: 403
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__045:
+ spec_txt_example_position: 404
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__046:
+ spec_txt_example_position: 405
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__047:
+ spec_txt_example_position: 406
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__048:
+ spec_txt_example_position: 407
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__049:
+ spec_txt_example_position: 408
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__050:
+ spec_txt_example_position: 409
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__051:
+ spec_txt_example_position: 410
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__052:
+ spec_txt_example_position: 411
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__053:
+ spec_txt_example_position: 412
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__054:
+ spec_txt_example_position: 413
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__055:
+ spec_txt_example_position: 414
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__056:
+ spec_txt_example_position: 415
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__057:
+ spec_txt_example_position: 416
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__058:
+ spec_txt_example_position: 417
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__059:
+ spec_txt_example_position: 418
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__060:
+ spec_txt_example_position: 419
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__061:
+ spec_txt_example_position: 420
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__062:
+ spec_txt_example_position: 421
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__063:
+ spec_txt_example_position: 422
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__064:
+ spec_txt_example_position: 423
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__065:
+ spec_txt_example_position: 424
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__066:
+ spec_txt_example_position: 425
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__067:
+ spec_txt_example_position: 426
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__068:
+ spec_txt_example_position: 427
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__069:
+ spec_txt_example_position: 428
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__070:
+ spec_txt_example_position: 429
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__071:
+ spec_txt_example_position: 430
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__072:
+ spec_txt_example_position: 431
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__073:
+ spec_txt_example_position: 432
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__074:
+ spec_txt_example_position: 433
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__075:
+ spec_txt_example_position: 434
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__076:
+ spec_txt_example_position: 435
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__077:
+ spec_txt_example_position: 436
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__078:
+ spec_txt_example_position: 437
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__079:
+ spec_txt_example_position: 438
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__080:
+ spec_txt_example_position: 439
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__081:
+ spec_txt_example_position: 440
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__082:
+ spec_txt_example_position: 441
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__083:
+ spec_txt_example_position: 442
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__084:
+ spec_txt_example_position: 443
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__085:
+ spec_txt_example_position: 444
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__086:
+ spec_txt_example_position: 445
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__087:
+ spec_txt_example_position: 446
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__088:
+ spec_txt_example_position: 447
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__089:
+ spec_txt_example_position: 448
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__090:
+ spec_txt_example_position: 449
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__091:
+ spec_txt_example_position: 450
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__092:
+ spec_txt_example_position: 451
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__093:
+ spec_txt_example_position: 452
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__094:
+ spec_txt_example_position: 453
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__095:
+ spec_txt_example_position: 454
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__096:
+ spec_txt_example_position: 455
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__097:
+ spec_txt_example_position: 456
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__098:
+ spec_txt_example_position: 457
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__099:
+ spec_txt_example_position: 458
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__100:
+ spec_txt_example_position: 459
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__101:
+ spec_txt_example_position: 460
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__102:
+ spec_txt_example_position: 461
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__103:
+ spec_txt_example_position: 462
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__104:
+ spec_txt_example_position: 463
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__105:
+ spec_txt_example_position: 464
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__106:
+ spec_txt_example_position: 465
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__107:
+ spec_txt_example_position: 466
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__108:
+ spec_txt_example_position: 467
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__109:
+ spec_txt_example_position: 468
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__110:
+ spec_txt_example_position: 469
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__111:
+ spec_txt_example_position: 470
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__112:
+ spec_txt_example_position: 471
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__113:
+ spec_txt_example_position: 472
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__114:
+ spec_txt_example_position: 473
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__115:
+ spec_txt_example_position: 474
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__116:
+ spec_txt_example_position: 475
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__117:
+ spec_txt_example_position: 476
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__118:
+ spec_txt_example_position: 477
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__119:
+ spec_txt_example_position: 478
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__120:
+ spec_txt_example_position: 479
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__121:
+ spec_txt_example_position: 480
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__122:
+ spec_txt_example_position: 481
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__123:
+ spec_txt_example_position: 482
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__124:
+ spec_txt_example_position: 483
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__125:
+ spec_txt_example_position: 484
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__126:
+ spec_txt_example_position: 485
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__127:
+ spec_txt_example_position: 486
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__128:
+ spec_txt_example_position: 487
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__129:
+ spec_txt_example_position: 488
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__130:
+ spec_txt_example_position: 489
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__131:
+ spec_txt_example_position: 490
+ source_specification: commonmark
+06_06__inlines__strikethrough_extension__001:
+ spec_txt_example_position: 491
+ source_specification: github
+06_06__inlines__strikethrough_extension__002:
+ spec_txt_example_position: 492
+ source_specification: github
+06_07__inlines__links__001:
+ spec_txt_example_position: 493
+ source_specification: commonmark
+06_07__inlines__links__002:
+ spec_txt_example_position: 494
+ source_specification: commonmark
+06_07__inlines__links__003:
+ spec_txt_example_position: 495
+ source_specification: commonmark
+06_07__inlines__links__004:
+ spec_txt_example_position: 496
+ source_specification: commonmark
+06_07__inlines__links__005:
+ spec_txt_example_position: 497
+ source_specification: commonmark
+06_07__inlines__links__006:
+ spec_txt_example_position: 498
+ source_specification: commonmark
+06_07__inlines__links__007:
+ spec_txt_example_position: 499
+ source_specification: commonmark
+06_07__inlines__links__008:
+ spec_txt_example_position: 500
+ source_specification: commonmark
+06_07__inlines__links__009:
+ spec_txt_example_position: 501
+ source_specification: commonmark
+06_07__inlines__links__010:
+ spec_txt_example_position: 502
+ source_specification: commonmark
+06_07__inlines__links__011:
+ spec_txt_example_position: 503
+ source_specification: commonmark
+06_07__inlines__links__012:
+ spec_txt_example_position: 504
+ source_specification: commonmark
+06_07__inlines__links__013:
+ spec_txt_example_position: 505
+ source_specification: commonmark
+06_07__inlines__links__014:
+ spec_txt_example_position: 506
+ source_specification: commonmark
+06_07__inlines__links__015:
+ spec_txt_example_position: 507
+ source_specification: commonmark
+06_07__inlines__links__016:
+ spec_txt_example_position: 508
+ source_specification: commonmark
+06_07__inlines__links__017:
+ spec_txt_example_position: 509
+ source_specification: commonmark
+06_07__inlines__links__018:
+ spec_txt_example_position: 510
+ source_specification: commonmark
+06_07__inlines__links__019:
+ spec_txt_example_position: 511
+ source_specification: commonmark
+06_07__inlines__links__020:
+ spec_txt_example_position: 512
+ source_specification: commonmark
+06_07__inlines__links__021:
+ spec_txt_example_position: 513
+ source_specification: commonmark
+06_07__inlines__links__022:
+ spec_txt_example_position: 514
+ source_specification: commonmark
+06_07__inlines__links__023:
+ spec_txt_example_position: 515
+ source_specification: commonmark
+06_07__inlines__links__024:
+ spec_txt_example_position: 516
+ source_specification: commonmark
+06_07__inlines__links__025:
+ spec_txt_example_position: 517
+ source_specification: commonmark
+06_07__inlines__links__026:
+ spec_txt_example_position: 518
+ source_specification: commonmark
+06_07__inlines__links__027:
+ spec_txt_example_position: 519
+ source_specification: commonmark
+06_07__inlines__links__028:
+ spec_txt_example_position: 520
+ source_specification: commonmark
+06_07__inlines__links__029:
+ spec_txt_example_position: 521
+ source_specification: commonmark
+06_07__inlines__links__030:
+ spec_txt_example_position: 522
+ source_specification: commonmark
+06_07__inlines__links__031:
+ spec_txt_example_position: 523
+ source_specification: commonmark
+06_07__inlines__links__032:
+ spec_txt_example_position: 524
+ source_specification: commonmark
+06_07__inlines__links__033:
+ spec_txt_example_position: 525
+ source_specification: commonmark
+06_07__inlines__links__034:
+ spec_txt_example_position: 526
+ source_specification: commonmark
+06_07__inlines__links__035:
+ spec_txt_example_position: 527
+ source_specification: commonmark
+06_07__inlines__links__036:
+ spec_txt_example_position: 528
+ source_specification: commonmark
+06_07__inlines__links__037:
+ spec_txt_example_position: 529
+ source_specification: commonmark
+06_07__inlines__links__038:
+ spec_txt_example_position: 530
+ source_specification: commonmark
+06_07__inlines__links__039:
+ spec_txt_example_position: 531
+ source_specification: commonmark
+06_07__inlines__links__040:
+ spec_txt_example_position: 532
+ source_specification: commonmark
+06_07__inlines__links__041:
+ spec_txt_example_position: 533
+ source_specification: commonmark
+06_07__inlines__links__042:
+ spec_txt_example_position: 534
+ source_specification: commonmark
+06_07__inlines__links__043:
+ spec_txt_example_position: 535
+ source_specification: commonmark
+06_07__inlines__links__044:
+ spec_txt_example_position: 536
+ source_specification: commonmark
+06_07__inlines__links__045:
+ spec_txt_example_position: 537
+ source_specification: commonmark
+06_07__inlines__links__046:
+ spec_txt_example_position: 538
+ source_specification: commonmark
+06_07__inlines__links__047:
+ spec_txt_example_position: 539
+ source_specification: commonmark
+06_07__inlines__links__048:
+ spec_txt_example_position: 540
+ source_specification: commonmark
+06_07__inlines__links__049:
+ spec_txt_example_position: 541
+ source_specification: commonmark
+06_07__inlines__links__050:
+ spec_txt_example_position: 542
+ source_specification: commonmark
+06_07__inlines__links__051:
+ spec_txt_example_position: 543
+ source_specification: commonmark
+06_07__inlines__links__052:
+ spec_txt_example_position: 544
+ source_specification: commonmark
+06_07__inlines__links__053:
+ spec_txt_example_position: 545
+ source_specification: commonmark
+06_07__inlines__links__054:
+ spec_txt_example_position: 546
+ source_specification: commonmark
+06_07__inlines__links__055:
+ spec_txt_example_position: 547
+ source_specification: commonmark
+06_07__inlines__links__056:
+ spec_txt_example_position: 548
+ source_specification: commonmark
+06_07__inlines__links__057:
+ spec_txt_example_position: 549
+ source_specification: commonmark
+06_07__inlines__links__058:
+ spec_txt_example_position: 550
+ source_specification: commonmark
+06_07__inlines__links__059:
+ spec_txt_example_position: 551
+ source_specification: commonmark
+06_07__inlines__links__060:
+ spec_txt_example_position: 552
+ source_specification: commonmark
+06_07__inlines__links__061:
+ spec_txt_example_position: 553
+ source_specification: commonmark
+06_07__inlines__links__062:
+ spec_txt_example_position: 554
+ source_specification: commonmark
+06_07__inlines__links__063:
+ spec_txt_example_position: 555
+ source_specification: commonmark
+06_07__inlines__links__064:
+ spec_txt_example_position: 556
+ source_specification: commonmark
+06_07__inlines__links__065:
+ spec_txt_example_position: 557
+ source_specification: commonmark
+06_07__inlines__links__066:
+ spec_txt_example_position: 558
+ source_specification: commonmark
+06_07__inlines__links__067:
+ spec_txt_example_position: 559
+ source_specification: commonmark
+06_07__inlines__links__068:
+ spec_txt_example_position: 560
+ source_specification: commonmark
+06_07__inlines__links__069:
+ spec_txt_example_position: 561
+ source_specification: commonmark
+06_07__inlines__links__070:
+ spec_txt_example_position: 562
+ source_specification: commonmark
+06_07__inlines__links__071:
+ spec_txt_example_position: 563
+ source_specification: commonmark
+06_07__inlines__links__072:
+ spec_txt_example_position: 564
+ source_specification: commonmark
+06_07__inlines__links__073:
+ spec_txt_example_position: 565
+ source_specification: commonmark
+06_07__inlines__links__074:
+ spec_txt_example_position: 566
+ source_specification: commonmark
+06_07__inlines__links__075:
+ spec_txt_example_position: 567
+ source_specification: commonmark
+06_07__inlines__links__076:
+ spec_txt_example_position: 568
+ source_specification: commonmark
+06_07__inlines__links__077:
+ spec_txt_example_position: 569
+ source_specification: commonmark
+06_07__inlines__links__078:
+ spec_txt_example_position: 570
+ source_specification: commonmark
+06_07__inlines__links__079:
+ spec_txt_example_position: 571
+ source_specification: commonmark
+06_07__inlines__links__080:
+ spec_txt_example_position: 572
+ source_specification: commonmark
+06_07__inlines__links__081:
+ spec_txt_example_position: 573
+ source_specification: commonmark
+06_07__inlines__links__082:
+ spec_txt_example_position: 574
+ source_specification: commonmark
+06_07__inlines__links__083:
+ spec_txt_example_position: 575
+ source_specification: commonmark
+06_07__inlines__links__084:
+ spec_txt_example_position: 576
+ source_specification: commonmark
+06_07__inlines__links__085:
+ spec_txt_example_position: 577
+ source_specification: commonmark
+06_07__inlines__links__086:
+ spec_txt_example_position: 578
+ source_specification: commonmark
+06_07__inlines__links__087:
+ spec_txt_example_position: 579
+ source_specification: commonmark
+06_08__inlines__images__001:
+ spec_txt_example_position: 580
+ source_specification: commonmark
+06_08__inlines__images__002:
+ spec_txt_example_position: 581
+ source_specification: commonmark
+06_08__inlines__images__003:
+ spec_txt_example_position: 582
+ source_specification: commonmark
+06_08__inlines__images__004:
+ spec_txt_example_position: 583
+ source_specification: commonmark
+06_08__inlines__images__005:
+ spec_txt_example_position: 584
+ source_specification: commonmark
+06_08__inlines__images__006:
+ spec_txt_example_position: 585
+ source_specification: commonmark
+06_08__inlines__images__007:
+ spec_txt_example_position: 586
+ source_specification: commonmark
+06_08__inlines__images__008:
+ spec_txt_example_position: 587
+ source_specification: commonmark
+06_08__inlines__images__009:
+ spec_txt_example_position: 588
+ source_specification: commonmark
+06_08__inlines__images__010:
+ spec_txt_example_position: 589
+ source_specification: commonmark
+06_08__inlines__images__011:
+ spec_txt_example_position: 590
+ source_specification: commonmark
+06_08__inlines__images__012:
+ spec_txt_example_position: 591
+ source_specification: commonmark
+06_08__inlines__images__013:
+ spec_txt_example_position: 592
+ source_specification: commonmark
+06_08__inlines__images__014:
+ spec_txt_example_position: 593
+ source_specification: commonmark
+06_08__inlines__images__015:
+ spec_txt_example_position: 594
+ source_specification: commonmark
+06_08__inlines__images__016:
+ spec_txt_example_position: 595
+ source_specification: commonmark
+06_08__inlines__images__017:
+ spec_txt_example_position: 596
+ source_specification: commonmark
+06_08__inlines__images__018:
+ spec_txt_example_position: 597
+ source_specification: commonmark
+06_08__inlines__images__019:
+ spec_txt_example_position: 598
+ source_specification: commonmark
+06_08__inlines__images__020:
+ spec_txt_example_position: 599
+ source_specification: commonmark
+06_08__inlines__images__021:
+ spec_txt_example_position: 600
+ source_specification: commonmark
+06_08__inlines__images__022:
+ spec_txt_example_position: 601
+ source_specification: commonmark
+06_09__inlines__autolinks__001:
+ spec_txt_example_position: 602
+ source_specification: commonmark
+06_09__inlines__autolinks__002:
+ spec_txt_example_position: 603
+ source_specification: commonmark
+06_09__inlines__autolinks__003:
+ spec_txt_example_position: 604
+ source_specification: commonmark
+06_09__inlines__autolinks__004:
+ spec_txt_example_position: 605
+ source_specification: commonmark
+06_09__inlines__autolinks__005:
+ spec_txt_example_position: 606
+ source_specification: commonmark
+06_09__inlines__autolinks__006:
+ spec_txt_example_position: 607
+ source_specification: commonmark
+06_09__inlines__autolinks__007:
+ spec_txt_example_position: 608
+ source_specification: commonmark
+06_09__inlines__autolinks__008:
+ spec_txt_example_position: 609
+ source_specification: commonmark
+06_09__inlines__autolinks__009:
+ spec_txt_example_position: 610
+ source_specification: commonmark
+06_09__inlines__autolinks__010:
+ spec_txt_example_position: 611
+ source_specification: commonmark
+06_09__inlines__autolinks__011:
+ spec_txt_example_position: 612
+ source_specification: commonmark
+06_09__inlines__autolinks__012:
+ spec_txt_example_position: 613
+ source_specification: commonmark
+06_09__inlines__autolinks__013:
+ spec_txt_example_position: 614
+ source_specification: commonmark
+06_09__inlines__autolinks__014:
+ spec_txt_example_position: 615
+ source_specification: commonmark
+06_09__inlines__autolinks__015:
+ spec_txt_example_position: 616
+ source_specification: commonmark
+06_09__inlines__autolinks__016:
+ spec_txt_example_position: 617
+ source_specification: commonmark
+06_09__inlines__autolinks__017:
+ spec_txt_example_position: 618
+ source_specification: commonmark
+06_09__inlines__autolinks__018:
+ spec_txt_example_position: 619
+ source_specification: commonmark
+06_09__inlines__autolinks__019:
+ spec_txt_example_position: 620
+ source_specification: commonmark
+06_10__inlines__autolinks_extension__001:
+ spec_txt_example_position: 621
+ source_specification: github
+06_10__inlines__autolinks_extension__002:
+ spec_txt_example_position: 622
+ source_specification: github
+06_10__inlines__autolinks_extension__003:
+ spec_txt_example_position: 623
+ source_specification: github
+06_10__inlines__autolinks_extension__004:
+ spec_txt_example_position: 624
+ source_specification: github
+06_10__inlines__autolinks_extension__005:
+ spec_txt_example_position: 625
+ source_specification: github
+06_10__inlines__autolinks_extension__006:
+ spec_txt_example_position: 626
+ source_specification: github
+06_10__inlines__autolinks_extension__007:
+ spec_txt_example_position: 627
+ source_specification: github
+06_10__inlines__autolinks_extension__008:
+ spec_txt_example_position: 628
+ source_specification: github
+06_10__inlines__autolinks_extension__009:
+ spec_txt_example_position: 629
+ source_specification: github
+06_10__inlines__autolinks_extension__010:
+ spec_txt_example_position: 630
+ source_specification: github
+06_10__inlines__autolinks_extension__011:
+ spec_txt_example_position: 631
+ source_specification: github
+06_11__inlines__raw_html__001:
+ spec_txt_example_position: 632
+ source_specification: commonmark
+06_11__inlines__raw_html__002:
+ spec_txt_example_position: 633
+ source_specification: commonmark
+06_11__inlines__raw_html__003:
+ spec_txt_example_position: 634
+ source_specification: commonmark
+06_11__inlines__raw_html__004:
+ spec_txt_example_position: 635
+ source_specification: commonmark
+06_11__inlines__raw_html__005:
+ spec_txt_example_position: 636
+ source_specification: commonmark
+06_11__inlines__raw_html__006:
+ spec_txt_example_position: 637
+ source_specification: commonmark
+06_11__inlines__raw_html__007:
+ spec_txt_example_position: 638
+ source_specification: commonmark
+06_11__inlines__raw_html__008:
+ spec_txt_example_position: 639
+ source_specification: commonmark
+06_11__inlines__raw_html__009:
+ spec_txt_example_position: 640
+ source_specification: commonmark
+06_11__inlines__raw_html__010:
+ spec_txt_example_position: 641
+ source_specification: commonmark
+06_11__inlines__raw_html__011:
+ spec_txt_example_position: 642
+ source_specification: commonmark
+06_11__inlines__raw_html__012:
+ spec_txt_example_position: 643
+ source_specification: commonmark
+06_11__inlines__raw_html__013:
+ spec_txt_example_position: 644
+ source_specification: commonmark
+06_11__inlines__raw_html__014:
+ spec_txt_example_position: 645
+ source_specification: commonmark
+06_11__inlines__raw_html__015:
+ spec_txt_example_position: 646
+ source_specification: commonmark
+06_11__inlines__raw_html__016:
+ spec_txt_example_position: 647
+ source_specification: commonmark
+06_11__inlines__raw_html__017:
+ spec_txt_example_position: 648
+ source_specification: commonmark
+06_11__inlines__raw_html__018:
+ spec_txt_example_position: 649
+ source_specification: commonmark
+06_11__inlines__raw_html__019:
+ spec_txt_example_position: 650
+ source_specification: commonmark
+06_11__inlines__raw_html__020:
+ spec_txt_example_position: 651
+ source_specification: commonmark
+06_11__inlines__raw_html__021:
+ spec_txt_example_position: 652
+ source_specification: commonmark
+06_12__inlines__disallowed_raw_html_extension__001:
+ spec_txt_example_position: 653
+ source_specification: github
+06_13__inlines__hard_line_breaks__001:
+ spec_txt_example_position: 654
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__002:
+ spec_txt_example_position: 655
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__003:
+ spec_txt_example_position: 656
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__004:
+ spec_txt_example_position: 657
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__005:
+ spec_txt_example_position: 658
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__006:
+ spec_txt_example_position: 659
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__007:
+ spec_txt_example_position: 660
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__008:
+ spec_txt_example_position: 661
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__009:
+ spec_txt_example_position: 662
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__010:
+ spec_txt_example_position: 663
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__011:
+ spec_txt_example_position: 664
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__012:
+ spec_txt_example_position: 665
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__013:
+ spec_txt_example_position: 666
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__014:
+ spec_txt_example_position: 667
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__015:
+ spec_txt_example_position: 668
+ source_specification: commonmark
+06_14__inlines__soft_line_breaks__001:
+ spec_txt_example_position: 669
+ source_specification: commonmark
+06_14__inlines__soft_line_breaks__002:
+ spec_txt_example_position: 670
+ source_specification: commonmark
+06_15__inlines__textual_content__001:
+ spec_txt_example_position: 671
+ source_specification: commonmark
+06_15__inlines__textual_content__002:
+ spec_txt_example_position: 672
+ source_specification: commonmark
+06_15__inlines__textual_content__003:
+ spec_txt_example_position: 673
+ source_specification: commonmark
+07_01__gitlab_specific_markdown__footnotes__001:
+ spec_txt_example_position: 674
+ source_specification: gitlab
diff --git a/glfm_specification/example_snapshots/html.yml b/glfm_specification/example_snapshots/html.yml
new file mode 100644
index 00000000000..6c05fbe744b
--- /dev/null
+++ b/glfm_specification/example_snapshots/html.yml
@@ -0,0 +1,7571 @@
+---
+02_01__preliminaries__tabs__001:
+ canonical: "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n"
+ static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
+ data-sourcepos=\"1:2-1:13\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
+ class=\"line\" lang=\"plaintext\">foo\tbaz\t\tbim</span></code></pre>\n<copy-code></copy-code>\n</div>"
+ wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>foo\tbaz\t\tbim</code></pre>"
+02_01__preliminaries__tabs__002:
+ canonical: "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n"
+ static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
+ data-sourcepos=\"1:4-1:15\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
+ class=\"line\" lang=\"plaintext\">foo\tbaz\t\tbim</span></code></pre>\n<copy-code></copy-code>\n</div>"
+ wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>foo\tbaz\t\tbim</code></pre>"
+02_01__preliminaries__tabs__003:
+ canonical: "<pre><code>a\ta\ná½\ta\n</code></pre>\n"
+ static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
+ data-sourcepos=\"1:5-2:9\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
+ class=\"line\" lang=\"plaintext\">a\ta</span>\n<span id=\"LC2\" class=\"line\"
+ lang=\"plaintext\">á½\ta</span></code></pre>\n<copy-code></copy-code>\n</div>"
+ wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>a\ta\ná½\ta</code></pre>"
+02_01__preliminaries__tabs__004:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:3-3:4" dir="auto">
+ <li data-sourcepos="1:3-3:4">
+ <p data-sourcepos="1:5-1:7">foo</p>
+ <p data-sourcepos="3:2-3:4">bar</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+02_01__preliminaries__tabs__005:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <pre><code> bar
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">
+ <li data-sourcepos="1:1-3:5">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:2-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code> bar</code></pre></li></ul>
+02_01__preliminaries__tabs__006:
+ canonical: |
+ <blockquote>
+ <pre><code> foo
+ </code></pre>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:6" dir="auto">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:3-1:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code> foo</code></pre></blockquote>
+02_01__preliminaries__tabs__007:
+ canonical: |
+ <ul>
+ <li>
+ <pre><code> foo
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:6" dir="auto">
+ <li data-sourcepos="1:1-1:6">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:3-1:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code> foo</code></pre></li></ul>
+02_01__preliminaries__tabs__008:
+ canonical: |
+ <pre><code>foo
+ bar
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-2:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span>
+ <span id="LC2" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo
+ bar</code></pre>
+02_01__preliminaries__tabs__009:
+ canonical: |
+ <ul>
+ <li>foo
+ <ul>
+ <li>bar
+ <ul>
+ <li>baz</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:2-3:7" dir="auto">
+ <li data-sourcepos="1:2-3:7">foo
+ <ul data-sourcepos="2:4-3:7">
+ <li data-sourcepos="2:4-3:7">bar
+ <ul data-sourcepos="3:3-3:7">
+ <li data-sourcepos="3:3-3:7">baz</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p><ul bullet="*"><li><p>baz</p></li></ul></li></ul></li></ul>
+02_01__preliminaries__tabs__010:
+ canonical: |
+ <h1>Foo</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:5" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
+ wysiwyg: |-
+ <h1>Foo</h1>
+02_01__preliminaries__tabs__011:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:6">
+ wysiwyg: |-
+ <hr>
+03_01__blocks_and_inlines__precedence__001:
+ canonical: |
+ <ul>
+ <li>`one</li>
+ <li>two`</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:6" dir="auto">
+ <li data-sourcepos="1:1-1:6">`one</li>
+ <li data-sourcepos="2:1-2:6">two`</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>`one</p></li><li><p>two`</p></li></ul>
+04_01__leaf_blocks__thematic_breaks__001:
+ canonical: |
+ <hr />
+ <hr />
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:3">
+ <hr data-sourcepos="2:1-2:3">
+ <hr data-sourcepos="3:1-3:3">
+ wysiwyg: |-
+ <hr>
+ <hr>
+ <hr>
+04_01__leaf_blocks__thematic_breaks__002:
+ canonical: |
+ <p>+++</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">+++</p>
+ wysiwyg: |-
+ <p>+++</p>
+04_01__leaf_blocks__thematic_breaks__003:
+ canonical: |
+ <p>===</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">===</p>
+ wysiwyg: |-
+ <p>===</p>
+04_01__leaf_blocks__thematic_breaks__004:
+ canonical: |
+ <p>--
+ **
+ __</p>
+ static: |-
+ <p data-sourcepos="1:1-3:2" dir="auto">--
+ **
+ __</p>
+ wysiwyg: |-
+ <p>--
+ **
+ __</p>
+04_01__leaf_blocks__thematic_breaks__005:
+ canonical: |
+ <hr />
+ <hr />
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:2-1:4">
+ <hr data-sourcepos="2:3-2:5">
+ <hr data-sourcepos="3:4-3:6">
+ wysiwyg: |-
+ <hr>
+ <hr>
+ <hr>
+04_01__leaf_blocks__thematic_breaks__006:
+ canonical: |
+ <pre><code>***
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>***</code></pre>
+04_01__leaf_blocks__thematic_breaks__007:
+ canonical: |
+ <p>Foo
+ ***</p>
+ static: |-
+ <p data-sourcepos="1:1-2:7" dir="auto">Foo
+ ***</p>
+ wysiwyg: |-
+ <p>Foo
+ ***</p>
+04_01__leaf_blocks__thematic_breaks__008:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:37">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__009:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:2-1:6">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__010:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:2-1:19">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__011:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:21">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__012:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:11">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__013:
+ canonical: |
+ <p>_ _ _ _ a</p>
+ <p>a------</p>
+ <p>---a---</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">_ _ _ _ a</p>
+ <p data-sourcepos="3:1-3:7" dir="auto">a------</p>
+ <p data-sourcepos="5:1-5:7" dir="auto">---a---</p>
+ wysiwyg: |-
+ <p>_ _ _ _ a</p>
+ <p>a------</p>
+ <p>---a---</p>
+04_01__leaf_blocks__thematic_breaks__014:
+ canonical: |
+ <p><em>-</em></p>
+ static: |-
+ <p data-sourcepos="1:2-1:4" dir="auto"><em>-</em></p>
+ wysiwyg: |-
+ <p><em>-</em></p>
+04_01__leaf_blocks__thematic_breaks__015:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ <hr />
+ <ul>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">foo</li>
+ </ul>
+ <hr data-sourcepos="2:1-2:3">
+ <ul data-sourcepos="3:1-3:5" dir="auto">
+ <li data-sourcepos="3:1-3:5">bar</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li></ul>
+ <hr>
+ <ul bullet="*"><li><p>bar</p></li></ul>
+04_01__leaf_blocks__thematic_breaks__016:
+ canonical: |
+ <p>Foo</p>
+ <hr />
+ <p>bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
+ <hr data-sourcepos="2:1-2:3">
+ <p data-sourcepos="3:1-3:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <p>Foo</p>
+ <hr>
+ <p>bar</p>
+04_01__leaf_blocks__thematic_breaks__017:
+ canonical: |
+ <h2>Foo</h2>
+ <p>bar</p>
+ static: |-
+ <h2 data-sourcepos="1:1-3:3" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
+ <p data-sourcepos="3:1-3:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <h2>Foo</h2>
+ <p>bar</p>
+04_01__leaf_blocks__thematic_breaks__018:
+ canonical: |
+ <ul>
+ <li>Foo</li>
+ </ul>
+ <hr />
+ <ul>
+ <li>Bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">Foo</li>
+ </ul>
+ <hr data-sourcepos="2:1-2:5">
+ <ul data-sourcepos="3:1-3:5" dir="auto">
+ <li data-sourcepos="3:1-3:5">Bar</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>Foo</p></li></ul>
+ <hr>
+ <ul bullet="*"><li><p>Bar</p></li></ul>
+04_01__leaf_blocks__thematic_breaks__019:
+ canonical: |
+ <ul>
+ <li>Foo</li>
+ <li>
+ <hr />
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:7" dir="auto">
+ <li data-sourcepos="1:1-1:5">Foo</li>
+ <li data-sourcepos="2:1-2:7">
+ <hr data-sourcepos="2:3-2:7">
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>Foo</p></li><li><p></p><hr></li></ul>
+04_02__leaf_blocks__atx_headings__001:
+ canonical: |
+ <h1>foo</h1>
+ <h2>foo</h2>
+ <h3>foo</h3>
+ <h4>foo</h4>
+ <h5>foo</h5>
+ <h6>foo</h6>
+ static: |-
+ <h1 data-sourcepos="1:1-1:5" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>
+ <h2 data-sourcepos="2:1-2:6" dir="auto">
+ <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h2>
+ <h3 data-sourcepos="3:1-3:7" dir="auto">
+ <a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>foo</h3>
+ <h4 data-sourcepos="4:1-4:8" dir="auto">
+ <a id="user-content-foo-3" class="anchor" href="#foo-3" aria-hidden="true"></a>foo</h4>
+ <h5 data-sourcepos="5:1-5:9" dir="auto">
+ <a id="user-content-foo-4" class="anchor" href="#foo-4" aria-hidden="true"></a>foo</h5>
+ <h6 data-sourcepos="6:1-6:10" dir="auto">
+ <a id="user-content-foo-5" class="anchor" href="#foo-5" aria-hidden="true"></a>foo</h6>
+ wysiwyg: |-
+ <h1>foo</h1>
+ <h2>foo</h2>
+ <h3>foo</h3>
+ <h4>foo</h4>
+ <h5>foo</h5>
+ <h6>foo</h6>
+04_02__leaf_blocks__atx_headings__002:
+ canonical: |
+ <p>####### foo</p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto">####### foo</p>
+ wysiwyg: |-
+ <p>####### foo</p>
+04_02__leaf_blocks__atx_headings__003:
+ canonical: |
+ <p>#5 bolt</p>
+ <p>#hashtag</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">#5 bolt</p>
+ <p data-sourcepos="3:1-3:8" dir="auto">#hashtag</p>
+ wysiwyg: |-
+ <p>#5 bolt</p>
+ <p>#hashtag</p>
+04_02__leaf_blocks__atx_headings__004:
+ canonical: |
+ <p>## foo</p>
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto"><span>#</span># foo</p>
+ wysiwyg: |-
+ <p>## foo</p>
+04_02__leaf_blocks__atx_headings__005:
+ canonical: |
+ <h1>foo <em>bar</em> *baz*</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:19" dir="auto">
+ <a id="user-content-foo-bar-baz" class="anchor" href="#foo-bar-baz" aria-hidden="true"></a>foo <em>bar</em> *baz*</h1>
+ wysiwyg: |-
+ <h1>foo <em>bar</em> *baz*</h1>
+04_02__leaf_blocks__atx_headings__006:
+ canonical: |
+ <h1>foo</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:22" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>
+ wysiwyg: |-
+ <h1>foo</h1>
+04_02__leaf_blocks__atx_headings__007:
+ canonical: |
+ <h3>foo</h3>
+ <h2>foo</h2>
+ <h1>foo</h1>
+ static: |-
+ <h3 data-sourcepos="1:2-1:8" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h3>
+ <h2 data-sourcepos="2:3-2:8" dir="auto">
+ <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h2>
+ <h1 data-sourcepos="3:4-3:8" dir="auto">
+ <a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>foo</h1>
+ wysiwyg: |-
+ <h3>foo</h3>
+ <h2>foo</h2>
+ <h1>foo</h1>
+04_02__leaf_blocks__atx_headings__008:
+ canonical: |
+ <pre><code># foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code># foo</code></pre>
+04_02__leaf_blocks__atx_headings__009:
+ canonical: |
+ <p>foo
+ # bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:9" dir="auto">foo
+ # bar</p>
+ wysiwyg: |-
+ <p>foo
+ # bar</p>
+04_02__leaf_blocks__atx_headings__010:
+ canonical: |
+ <h2>foo</h2>
+ <h3>bar</h3>
+ static: |-
+ <h2 data-sourcepos="1:1-1:6" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>
+ <h3 data-sourcepos="2:3-2:11" dir="auto">
+ <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h3>
+ wysiwyg: |-
+ <h2>foo</h2>
+ <h3>bar</h3>
+04_02__leaf_blocks__atx_headings__011:
+ canonical: |
+ <h1>foo</h1>
+ <h5>foo</h5>
+ static: |-
+ <h1 data-sourcepos="1:1-1:5" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>
+ <h5 data-sourcepos="2:1-2:9" dir="auto">
+ <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h5>
+ wysiwyg: |-
+ <h1>foo</h1>
+ <h5>foo</h5>
+04_02__leaf_blocks__atx_headings__012:
+ canonical: |
+ <h3>foo</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:7" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h3>
+ wysiwyg: |-
+ <h3>foo</h3>
+04_02__leaf_blocks__atx_headings__013:
+ canonical: |
+ <h3>foo ### b</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:13" dir="auto">
+ <a id="user-content-foo-b" class="anchor" href="#foo-b" aria-hidden="true"></a>foo ### b</h3>
+ wysiwyg: |-
+ <h3>foo ### b</h3>
+04_02__leaf_blocks__atx_headings__014:
+ canonical: |
+ <h1>foo#</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:6" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo#</h1>
+ wysiwyg: |-
+ <h1>foo#</h1>
+04_02__leaf_blocks__atx_headings__015:
+ canonical: |
+ <h3>foo ###</h3>
+ <h2>foo ###</h2>
+ <h1>foo #</h1>
+ static: |-
+ <h3 data-sourcepos="1:1-1:32" dir="auto">
+ <a id="user-content-foo-" class="anchor" href="#foo-" aria-hidden="true"></a>foo <span>#</span>##</h3>
+ <h2 data-sourcepos="2:1-2:31" dir="auto">
+ <a id="user-content-foo--1" class="anchor" href="#foo--1" aria-hidden="true"></a>foo #<span>#</span>#</h2>
+ <h1 data-sourcepos="3:1-3:28" dir="auto">
+ <a id="user-content-foo--2" class="anchor" href="#foo--2" aria-hidden="true"></a>foo <span>#</span>
+ </h1>
+ wysiwyg: |-
+ <h3>foo ###</h3>
+ <h2>foo ###</h2>
+ <h1>foo #</h1>
+04_02__leaf_blocks__atx_headings__016:
+ canonical: |
+ <hr />
+ <h2>foo</h2>
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:4">
+ <h2 data-sourcepos="2:1-2:6" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>
+ <hr data-sourcepos="3:1-3:4">
+ wysiwyg: |-
+ <hr>
+ <h2>foo</h2>
+ <hr>
+04_02__leaf_blocks__atx_headings__017:
+ canonical: |
+ <p>Foo bar</p>
+ <h1>baz</h1>
+ <p>Bar foo</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">Foo bar</p>
+ <h1 data-sourcepos="2:1-2:5" dir="auto">
+ <a id="user-content-baz" class="anchor" href="#baz" aria-hidden="true"></a>baz</h1>
+ <p data-sourcepos="3:1-3:7" dir="auto">Bar foo</p>
+ wysiwyg: |-
+ <p>Foo bar</p>
+ <h1>baz</h1>
+ <p>Bar foo</p>
+04_02__leaf_blocks__atx_headings__018:
+ canonical: |
+ <h2></h2>
+ <h1></h1>
+ <h3></h3>
+ static: |-
+ <h2 data-sourcepos="1:1-1:3" dir="auto"></h2>
+ <h1 data-sourcepos="2:1-2:1" dir="auto"></h1>
+ <h3 data-sourcepos="3:1-3:3" dir="auto"></h3>
+ wysiwyg: |-
+ <h2></h2>
+ <h1></h1>
+ <h3></h3>
+04_03__leaf_blocks__setext_headings__001:
+ canonical: |
+ <h1>Foo <em>bar</em></h1>
+ <h2>Foo <em>bar</em></h2>
+ static: |-
+ <h1 data-sourcepos="1:1-3:0" dir="auto">
+ <a id="user-content-foo-bar" class="anchor" href="#foo-bar" aria-hidden="true"></a>Foo <em>bar</em>
+ </h1>
+ <h2 data-sourcepos="4:1-5:9" dir="auto">
+ <a id="user-content-foo-bar-1" class="anchor" href="#foo-bar-1" aria-hidden="true"></a>Foo <em>bar</em>
+ </h2>
+ wysiwyg: |-
+ <h1>Foo <em>bar</em></h1>
+ <h2>Foo <em>bar</em></h2>
+04_03__leaf_blocks__setext_headings__002:
+ canonical: |
+ <h1>Foo <em>bar
+ baz</em></h1>
+ static: |-
+ <h1 data-sourcepos="1:1-3:4" dir="auto">
+ <a id="user-content-foo-barbaz" class="anchor" href="#foo-barbaz" aria-hidden="true"></a>Foo <em>bar
+ baz</em>
+ </h1>
+ wysiwyg: |-
+ <h1>Foo <em>bar
+ baz</em></h1>
+04_03__leaf_blocks__setext_headings__003:
+ canonical: |
+ <h1>Foo <em>bar
+ baz</em></h1>
+ static: |-
+ <h1 data-sourcepos="1:3-3:4" dir="auto">
+ <a id="user-content-foo-barbaz" class="anchor" href="#foo-barbaz" aria-hidden="true"></a>Foo <em>bar
+ baz</em>
+ </h1>
+ wysiwyg: |-
+ <h1>Foo <em>bar
+ baz</em></h1>
+04_03__leaf_blocks__setext_headings__004:
+ canonical: |
+ <h2>Foo</h2>
+ <h1>Foo</h1>
+ static: |-
+ <h2 data-sourcepos="1:1-3:0" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
+ <h1 data-sourcepos="4:1-5:1" dir="auto">
+ <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>Foo</h1>
+ wysiwyg: |-
+ <h2>Foo</h2>
+ <h1>Foo</h1>
+04_03__leaf_blocks__setext_headings__005:
+ canonical: |
+ <h2>Foo</h2>
+ <h2>Foo</h2>
+ <h1>Foo</h1>
+ static: |-
+ <h2 data-sourcepos="1:4-3:0" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
+ <h2 data-sourcepos="4:3-6:0" dir="auto">
+ <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>Foo</h2>
+ <h1 data-sourcepos="7:3-8:5" dir="auto">
+ <a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>Foo</h1>
+ wysiwyg: |-
+ <h2>Foo</h2>
+ <h2>Foo</h2>
+ <h1>Foo</h1>
+04_03__leaf_blocks__setext_headings__006:
+ canonical: |
+ <pre><code>Foo
+ ---
+
+ Foo
+ </code></pre>
+ <hr />
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-4:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span>
+ <span id="LC2" class="line" lang="plaintext">---</span>
+ <span id="LC3" class="line" lang="plaintext"></span>
+ <span id="LC4" class="line" lang="plaintext">Foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <hr data-sourcepos="5:1-5:3">
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>Foo
+ ---
+
+ Foo</code></pre>
+ <hr>
+04_03__leaf_blocks__setext_headings__007:
+ canonical: |
+ <h2>Foo</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:13" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
+ wysiwyg: |-
+ <h2>Foo</h2>
+04_03__leaf_blocks__setext_headings__008:
+ canonical: |
+ <p>Foo
+ ---</p>
+ static: |-
+ <p data-sourcepos="1:1-2:7" dir="auto">Foo
+ ---</p>
+ wysiwyg: |-
+ <p>Foo
+ ---</p>
+04_03__leaf_blocks__setext_headings__009:
+ canonical: |
+ <p>Foo
+ = =</p>
+ <p>Foo</p>
+ <hr />
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">Foo
+ = =</p>
+ <p data-sourcepos="4:1-4:3" dir="auto">Foo</p>
+ <hr data-sourcepos="5:1-5:5">
+ wysiwyg: |-
+ <p>Foo
+ = =</p>
+ <p>Foo</p>
+ <hr>
+04_03__leaf_blocks__setext_headings__010:
+ canonical: |
+ <h2>Foo</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:5" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
+ wysiwyg: |-
+ <h2>Foo</h2>
+04_03__leaf_blocks__setext_headings__011:
+ canonical: |
+ <h2>Foo\</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:4" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo\</h2>
+ wysiwyg: |-
+ <h2>Foo\</h2>
+04_03__leaf_blocks__setext_headings__012:
+ canonical: |
+ <h2>`Foo</h2>
+ <p>`</p>
+ <h2>&lt;a title=&quot;a lot</h2>
+ <p>of dashes&quot;/&gt;</p>
+ static: |-
+ <h2 data-sourcepos="1:1-3:1" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>`Foo</h2>
+ <p data-sourcepos="3:1-3:1" dir="auto">`</p>
+ <h2 data-sourcepos="5:1-7:12" dir="auto">
+ <a id="user-content-a-titlea-lot" class="anchor" href="#a-titlea-lot" aria-hidden="true"></a>&lt;a title="a lot</h2>
+ <p data-sourcepos="7:1-7:12" dir="auto">of dashes"/&gt;</p>
+ wysiwyg: |-
+ <h2>`Foo</h2>
+ <p>`</p>
+ <h2>&lt;a title="a lot</h2>
+ <p>of dashes"/&gt;</p>
+04_03__leaf_blocks__setext_headings__013:
+ canonical: |
+ <blockquote>
+ <p>Foo</p>
+ </blockquote>
+ <hr />
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">
+ <p data-sourcepos="1:3-1:5">Foo</p>
+ </blockquote>
+ <hr data-sourcepos="2:1-2:3">
+ wysiwyg: |-
+ <blockquote multiline="false"><p>Foo</p></blockquote>
+ <hr>
+04_03__leaf_blocks__setext_headings__014:
+ canonical: |
+ <blockquote>
+ <p>foo
+ bar
+ ===</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:3" dir="auto">
+ <p data-sourcepos="1:3-3:3">foo
+ bar
+ ===</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo
+ bar
+ ===</p></blockquote>
+04_03__leaf_blocks__setext_headings__015:
+ canonical: |
+ <ul>
+ <li>Foo</li>
+ </ul>
+ <hr />
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">Foo</li>
+ </ul>
+ <hr data-sourcepos="2:1-2:3">
+ wysiwyg: |-
+ <ul bullet="*"><li><p>Foo</p></li></ul>
+ <hr>
+04_03__leaf_blocks__setext_headings__016:
+ canonical: |
+ <h2>Foo
+ Bar</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-3:3" dir="auto">
+ <a id="user-content-foobar" class="anchor" href="#foobar" aria-hidden="true"></a>Foo
+ Bar</h2>
+ wysiwyg: |-
+ <h2>Foo
+ Bar</h2>
+04_03__leaf_blocks__setext_headings__017:
+ canonical: |
+ <hr />
+ <h2>Foo</h2>
+ <h2>Bar</h2>
+ <p>Baz</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-yaml" lang="yaml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="yaml"><span class="s">Foo</span></span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <h2 data-sourcepos="4:1-6:3" dir="auto">
+ <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>Bar</h2>
+ <p data-sourcepos="6:1-6:3" dir="auto">Baz</p>
+ wysiwyg: |-
+ <hr>
+ <h2>Foo</h2>
+ <h2>Bar</h2>
+ <p>Baz</p>
+04_03__leaf_blocks__setext_headings__018:
+ canonical: |
+ <p>====</p>
+ static: |-
+ <p data-sourcepos="2:1-2:4" dir="auto">====</p>
+ wysiwyg: |-
+ <p>====</p>
+04_03__leaf_blocks__setext_headings__019:
+ canonical: |
+ <hr />
+ <hr />
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-2:3" class="code highlight js-syntax-highlight language-yaml" lang="yaml" data-lang-params="frontmatter" v-pre="true"><code></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <hr>
+ <hr>
+04_03__leaf_blocks__setext_headings__020:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ <hr />
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">foo</li>
+ </ul>
+ <hr data-sourcepos="2:1-2:5">
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li></ul>
+ <hr>
+04_03__leaf_blocks__setext_headings__021:
+ canonical: |
+ <pre><code>foo
+ </code></pre>
+ <hr />
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <hr data-sourcepos="2:1-2:3">
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+ <hr>
+04_03__leaf_blocks__setext_headings__022:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ <hr />
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ </blockquote>
+ <hr data-sourcepos="2:1-2:5">
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+ <hr>
+04_03__leaf_blocks__setext_headings__023:
+ canonical: |
+ <h2>&gt; foo</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:6" dir="auto">
+ <a id="user-content--foo" class="anchor" href="#-foo" aria-hidden="true"></a>&gt; foo</h2>
+ wysiwyg: |-
+ <h2>&gt; foo</h2>
+04_03__leaf_blocks__setext_headings__024:
+ canonical: |
+ <p>Foo</p>
+ <h2>bar</h2>
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
+ <h2 data-sourcepos="3:1-5:3" dir="auto">
+ <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h2>
+ <p data-sourcepos="5:1-5:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>Foo</p>
+ <h2>bar</h2>
+ <p>baz</p>
+04_03__leaf_blocks__setext_headings__025:
+ canonical: |
+ <p>Foo
+ bar</p>
+ <hr />
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">Foo
+ bar</p>
+ <hr data-sourcepos="4:1-5:0">
+ <p data-sourcepos="6:1-6:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>Foo
+ bar</p>
+ <hr>
+ <p>baz</p>
+04_03__leaf_blocks__setext_headings__026:
+ canonical: |
+ <p>Foo
+ bar</p>
+ <hr />
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">Foo
+ bar</p>
+ <hr data-sourcepos="3:1-3:5">
+ <p data-sourcepos="4:1-4:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>Foo
+ bar</p>
+ <hr>
+ <p>baz</p>
+04_03__leaf_blocks__setext_headings__027:
+ canonical: |
+ <p>Foo
+ bar
+ ---
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-4:3" dir="auto">Foo
+ bar
+ ---
+ baz</p>
+ wysiwyg: |-
+ <p>Foo
+ bar
+ ---
+ baz</p>
+04_04__leaf_blocks__indented_code_blocks__001:
+ canonical: |
+ <pre><code>a simple
+ indented code block
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-2:25" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a simple</span>
+ <span id="LC2" class="line" lang="plaintext"> indented code block</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>a simple
+ indented code block</code></pre>
+04_04__leaf_blocks__indented_code_blocks__002:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:3-3:7" dir="auto">
+ <li data-sourcepos="1:3-3:7">
+ <p data-sourcepos="1:5-1:7">foo</p>
+ <p data-sourcepos="3:5-3:7">bar</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+04_04__leaf_blocks__indented_code_blocks__003:
+ canonical: |
+ <ol>
+ <li>
+ <p>foo</p>
+ <ul>
+ <li>bar</li>
+ </ul>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-3:9" dir="auto">
+ <li data-sourcepos="1:1-3:9">
+ <p data-sourcepos="1:5-1:7">foo</p>
+ <ul data-sourcepos="3:5-3:9">
+ <li data-sourcepos="3:5-3:9">bar</li>
+ </ul>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p><ul bullet="*"><li><p>bar</p></li></ul></li></ol>
+04_04__leaf_blocks__indented_code_blocks__004:
+ canonical: |
+ <pre><code>&lt;a/&gt;
+ *hi*
+
+ - one
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-4:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;a/&gt;</span>
+ <span id="LC2" class="line" lang="plaintext">*hi*</span>
+ <span id="LC3" class="line" lang="plaintext"></span>
+ <span id="LC4" class="line" lang="plaintext">- one</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&lt;a/&gt;
+ *hi*
+
+ - one</code></pre>
+04_04__leaf_blocks__indented_code_blocks__005:
+ canonical: |
+ <pre><code>chunk1
+
+ chunk2
+
+
+
+ chunk3
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-7:10" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">chunk1</span>
+ <span id="LC2" class="line" lang="plaintext"></span>
+ <span id="LC3" class="line" lang="plaintext">chunk2</span>
+ <span id="LC4" class="line" lang="plaintext"></span>
+ <span id="LC5" class="line" lang="plaintext"></span>
+ <span id="LC6" class="line" lang="plaintext"></span>
+ <span id="LC7" class="line" lang="plaintext">chunk3</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>chunk1
+
+ chunk2
+
+
+
+ chunk3</code></pre>
+04_04__leaf_blocks__indented_code_blocks__006:
+ canonical: "<pre><code>chunk1\n \n chunk2\n</code></pre>\n"
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-3:12" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">chunk1</span>
+ <span id="LC2" class="line" lang="plaintext"> </span>
+ <span id="LC3" class="line" lang="plaintext"> chunk2</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>chunk1\n
+ \ \n chunk2</code></pre>"
+04_04__leaf_blocks__indented_code_blocks__007:
+ canonical: |
+ <p>Foo
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:7" dir="auto">Foo
+ bar</p>
+ wysiwyg: |-
+ <p>Foo
+ bar</p>
+04_04__leaf_blocks__indented_code_blocks__008:
+ canonical: |
+ <pre><code>foo
+ </code></pre>
+ <p>bar</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="2:1-2:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+ <p>bar</p>
+04_04__leaf_blocks__indented_code_blocks__009:
+ canonical: |
+ <h1>Heading</h1>
+ <pre><code>foo
+ </code></pre>
+ <h2>Heading</h2>
+ <pre><code>foo
+ </code></pre>
+ <hr />
+ static: |-
+ <h1 data-sourcepos="1:1-1:9" dir="auto">
+ <a id="user-content-heading" class="anchor" href="#heading" aria-hidden="true"></a>Heading</h1>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="2:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <h2 data-sourcepos="3:1-5:7" dir="auto">
+ <a id="user-content-heading-1" class="anchor" href="#heading-1" aria-hidden="true"></a>Heading</h2>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="5:5-5:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <hr data-sourcepos="6:1-6:4">
+ wysiwyg: |-
+ <h1>Heading</h1>
+ <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+ <h2>Heading</h2>
+ <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+ <hr>
+04_04__leaf_blocks__indented_code_blocks__010:
+ canonical: |
+ <pre><code> foo
+ bar
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span>
+ <span id="LC2" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code> foo
+ bar</code></pre>
+04_04__leaf_blocks__indented_code_blocks__011:
+ canonical: |
+ <pre><code>foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:5-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+04_04__leaf_blocks__indented_code_blocks__012:
+ canonical: "<pre><code>foo \n</code></pre>\n"
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo </code></pre>
+04_05__leaf_blocks__fenced_code_blocks__001:
+ canonical: |
+ <pre><code>&lt;
+ &gt;
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;</span>
+ <span id="LC2" class="line" lang="plaintext"> &gt;</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&lt;
+ &gt;</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__002:
+ canonical: |
+ <pre><code>&lt;
+ &gt;
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;</span>
+ <span id="LC2" class="line" lang="plaintext"> &gt;</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&lt;
+ &gt;</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__003:
+ canonical: |
+ <p><code>foo</code></p>
+ static: |-
+ <p data-sourcepos="1:1-3:2" dir="auto"><code>foo</code></p>
+ wysiwyg: |-
+ <p><code>foo</code></p>
+04_05__leaf_blocks__fenced_code_blocks__004:
+ canonical: |
+ <pre><code>aaa
+ ~~~
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext">~~~</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ~~~</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__005:
+ canonical: |
+ <pre><code>aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext">```</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__006:
+ canonical: |
+ <pre><code>aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext">```</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__007:
+ canonical: |
+ <pre><code>aaa
+ ~~~
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext">~~~</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ~~~</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__008:
+ canonical: |
+ <pre><code></code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-1:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
+04_05__leaf_blocks__fenced_code_blocks__009:
+ canonical: |
+ <pre><code>
+ ```
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>
+ <span id="LC2" class="line" lang="plaintext">```</span>
+ <span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>
+ ```
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__010:
+ canonical: |
+ <blockquote>
+ <pre><code>aaa
+ </code></pre>
+ </blockquote>
+ <p>bbb</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:5" dir="auto">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:3-3:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </blockquote>
+ <p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
+ wysiwyg: |-
+ <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre></blockquote>
+ <p>bbb</p>
+04_05__leaf_blocks__fenced_code_blocks__011:
+ canonical: "<pre><code>\n \n</code></pre>\n"
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>
+ <span id="LC2" class="line" lang="plaintext"> </span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
+04_05__leaf_blocks__fenced_code_blocks__012:
+ canonical: |
+ <pre><code></code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-2:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
+04_05__leaf_blocks__fenced_code_blocks__013:
+ canonical: |
+ <pre><code>aaa
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:2-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__014:
+ canonical: |
+ <pre><code>aaa
+ aaa
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:3-5:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext">aaa</span>
+ <span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ aaa
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__015:
+ canonical: |
+ <pre><code>aaa
+ aaa
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:4-5:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext"> aaa</span>
+ <span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ aaa
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__016:
+ canonical: |
+ <pre><code>```
+ aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-3:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span>
+ <span id="LC2" class="line" lang="plaintext">aaa</span>
+ <span id="LC3" class="line" lang="plaintext">```</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>```
+ aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__017:
+ canonical: |
+ <pre><code>aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__018:
+ canonical: |
+ <pre><code>aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:4-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__019:
+ canonical: |
+ <pre><code>aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext"> ```</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__020:
+ canonical: |
+ <p><code> </code>
+ aaa</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto"><code> </code>
+ aaa</p>
+ wysiwyg: |-
+ <p>
+ aaa</p>
+04_05__leaf_blocks__fenced_code_blocks__021:
+ canonical: |
+ <pre><code>aaa
+ ~~~ ~~
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
+ <span id="LC2" class="line" lang="plaintext">~~~ ~~</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ~~~ ~~</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__022:
+ canonical: |
+ <p>foo</p>
+ <pre><code>bar
+ </code></pre>
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">foo</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="2:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="5:1-5:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>foo</p>
+ <pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre>
+ <p>baz</p>
+04_05__leaf_blocks__fenced_code_blocks__023:
+ canonical: |
+ <h2>foo</h2>
+ <pre><code>bar
+ </code></pre>
+ <h1>baz</h1>
+ static: |-
+ <h2 data-sourcepos="1:1-3:3" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:1-5:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <h1 data-sourcepos="6:1-6:5" dir="auto">
+ <a id="user-content-baz" class="anchor" href="#baz" aria-hidden="true"></a>baz</h1>
+ wysiwyg: |-
+ <h2>foo</h2>
+ <pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre>
+ <h1>baz</h1>
+04_05__leaf_blocks__fenced_code_blocks__024:
+ canonical: |
+ <pre><code class="language-ruby">def foo(x)
+ return 3
+ end
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-5:3" class="code highlight js-syntax-highlight language-ruby" lang="ruby" v-pre="true"><code><span id="LC1" class="line" lang="ruby"><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></span>
+ <span id="LC2" class="line" lang="ruby"> <span class="k">return</span> <span class="mi">3</span></span>
+ <span id="LC3" class="line" lang="ruby"><span class="k">end</span></span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre language="ruby" class="content-editor-code-block undefined code highlight"><code>def foo(x)
+ return 3
+ end</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__025:
+ canonical: |
+ <pre><code class="language-ruby">def foo(x)
+ return 3
+ end
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-5:7" class="code highlight js-syntax-highlight language-ruby" lang="ruby" v-pre="true"><code><span id="LC1" class="line" lang="ruby"><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></span>
+ <span id="LC2" class="line" lang="ruby"> <span class="k">return</span> <span class="mi">3</span></span>
+ <span id="LC3" class="line" lang="ruby"><span class="k">end</span></span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre language="ruby" class="content-editor-code-block undefined code highlight"><code>def foo(x)
+ return 3
+ end</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__026:
+ canonical: |
+ <pre><code class="language-;"></code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-2:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang=";" v-pre="true"><code></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre language=";" class="content-editor-code-block undefined code highlight"><code></code></pre>
+04_05__leaf_blocks__fenced_code_blocks__027:
+ canonical: |
+ <p><code>aa</code>
+ foo</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto"><code>aa</code>
+ foo</p>
+ wysiwyg: |-
+ <p><code>aa</code>
+ foo</p>
+04_05__leaf_blocks__fenced_code_blocks__028:
+ canonical: |
+ <pre><code class="language-aa">foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="aa" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre language="aa" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__029:
+ canonical: |
+ <pre><code>``` aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``` aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>``` aaa</code></pre>
+04_06__leaf_blocks__html_blocks__001:
+ canonical: |
+ <table><tr><td>
+ <pre>
+ **Hello**,
+ <p><em>world</em>.
+ </pre></p>
+ </td></tr></table>
+ static: |-
+ <table dir="auto"><tr><td>
+ <pre>
+ **Hello**,
+ <p data-sourcepos="5:1-6:6"><em>world</em>.
+ </p></pre>
+ </td></tr></table>
+ wysiwyg: |-
+ <table><tbody><tr><td colspan="1" rowspan="1"><pre><p>**Hello**,
+ </p><p><em>world</em>.
+ </p></pre><p></p></td></tr></tbody></table>
+04_06__leaf_blocks__html_blocks__002:
+ canonical: |
+ <table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+ </table>
+ <p>okay.</p>
+ static: |-
+ <table dir="auto">
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+ </table>
+ <p data-sourcepos="9:1-9:5" dir="auto">okay.</p>
+ wysiwyg: |-
+ <table><tbody><tr><td colspan="1" rowspan="1"><p>
+ hi
+ </p></td></tr></tbody></table>
+ <p>okay.</p>
+04_06__leaf_blocks__html_blocks__003:
+ canonical: |2
+ <div>
+ *hello*
+ <foo><a>
+ static: |2-
+ <div>
+ *hello*
+ <a></a>
+ </div>
+ wysiwyg: |-
+ <div><p>
+ *hello*
+ </p></div>
+04_06__leaf_blocks__html_blocks__004:
+ canonical: |
+ </div>
+ *foo*
+ static: |2-
+
+ *foo*
+ wysiwyg: |-
+ <p>
+ *foo*</p>
+04_06__leaf_blocks__html_blocks__005:
+ canonical: |
+ <DIV CLASS="foo">
+ <p><em>Markdown</em></p>
+ </DIV>
+ static: |-
+ <div>
+ <p data-sourcepos="3:1-3:10"><em>Markdown</em></p>
+ </div>
+ wysiwyg: |-
+ <div><p><em>Markdown</em></p></div>
+04_06__leaf_blocks__html_blocks__006:
+ canonical: |
+ <div id="foo"
+ class="bar">
+ </div>
+ static: |-
+ <div>
+ </div>
+ wysiwyg: |-
+ <div></div>
+04_06__leaf_blocks__html_blocks__007:
+ canonical: |
+ <div id="foo" class="bar
+ baz">
+ </div>
+ static: |-
+ <div>
+ </div>
+ wysiwyg: |-
+ <div></div>
+04_06__leaf_blocks__html_blocks__008:
+ canonical: |
+ <div>
+ *foo*
+ <p><em>bar</em></p>
+ static: |-
+ <div>
+ *foo*
+ <p data-sourcepos="4:1-4:5"><em>bar</em></p>
+ </div>
+ wysiwyg: |-
+ <div><p>
+ *foo*
+ </p><p><em>bar</em></p></div>
+04_06__leaf_blocks__html_blocks__009:
+ canonical: |
+ <div id="foo"
+ *hi*
+ static: |-
+ <div></div>
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__010:
+ canonical: |
+ <div class
+ foo
+ static: |-
+ <div></div>
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__011:
+ canonical: |
+ <div *???-&&&-<---
+ *foo*
+ static: |-
+ <div></div>
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__012:
+ canonical: |
+ <div><a href="bar">*foo*</a></div>
+ static: |-
+ <div><a href="bar">*foo*</a></div>
+ wysiwyg: |-
+ <div><p><a target="_blank" rel="noopener noreferrer nofollow" href="bar">*foo*</a></p></div>
+04_06__leaf_blocks__html_blocks__013:
+ canonical: |
+ <table><tr><td>
+ foo
+ </td></tr></table>
+ static: |-
+ <table dir="auto"><tr><td>
+ foo
+ </td></tr></table>
+ wysiwyg: |-
+ <table><tbody><tr><td colspan="1" rowspan="1"><p>
+ foo
+ </p></td></tr></tbody></table>
+04_06__leaf_blocks__html_blocks__014:
+ canonical: |
+ <div></div>
+ ``` c
+ int x = 33;
+ ```
+ static: |-
+ <div></div>
+ ``` c
+ int x = 33;
+ ```
+ wysiwyg: |-
+ <div></div>
+ <p>
+ ``` c
+ int x = 33;
+ ```</p>
+04_06__leaf_blocks__html_blocks__015:
+ canonical: |
+ <a href="foo">
+ *bar*
+ </a>
+ static: |-
+ <a href="foo">
+ *bar*
+ </a>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo">
+ *bar*
+ </a></p>
+04_06__leaf_blocks__html_blocks__016:
+ canonical: |
+ <Warning>
+ *bar*
+ </Warning>
+ static: |2
+
+ *bar*
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__017:
+ canonical: |
+ <i class="foo">
+ *bar*
+ </i>
+ static: |-
+ <i>
+ *bar*
+ </i>
+ wysiwyg: |-
+ <p><em>
+ *bar*
+ </em></p>
+04_06__leaf_blocks__html_blocks__018:
+ canonical: |
+ </ins>
+ *bar*
+ static: |2-
+
+ *bar*
+ wysiwyg: |-
+ <p>
+ *bar*</p>
+04_06__leaf_blocks__html_blocks__019:
+ canonical: |
+ <del>
+ *foo*
+ </del>
+ static: |-
+ <del>
+ *foo*
+ </del>
+ wysiwyg: |-
+ <p><s>
+ *foo*
+ </s></p>
+04_06__leaf_blocks__html_blocks__020:
+ canonical: |
+ <del>
+ <p><em>foo</em></p>
+ </del>
+ static: |-
+ <del>
+ <p data-sourcepos="3:1-3:5"><em>foo</em></p>
+ </del>
+ wysiwyg: |-
+ <p><em><s>foo</s></em></p>
+04_06__leaf_blocks__html_blocks__021:
+ canonical: |
+ <p><del><em>foo</em></del></p>
+ static: |-
+ <p data-sourcepos="1:1-1:16" dir="auto"><del><em>foo</em></del></p>
+ wysiwyg: |-
+ <p><em><s>foo</s></em></p>
+04_06__leaf_blocks__html_blocks__022:
+ canonical: |
+ <pre language="haskell"><code>
+ import Text.HTML.TagSoup
+
+ main :: IO ()
+ main = print $ parseTags tags
+ </code></pre>
+ <p>okay</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>
+ <span id="LC2" class="line" lang="plaintext">import Text.HTML.TagSoup</span>
+ <span id="LC3" class="line" lang="plaintext"></span>
+ <span id="LC4" class="line" lang="plaintext">main :: IO ()</span>
+ <span id="LC5" class="line" lang="plaintext">main = print $ parseTags tags</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="7:1-7:4" dir="auto">okay</p>
+ wysiwyg: |-
+ <pre><p><code>
+ import Text.HTML.TagSoup
+
+ main :: IO ()
+ main = print $ parseTags tags
+ </code></p></pre>
+ <p>okay</p>
+04_06__leaf_blocks__html_blocks__023:
+ canonical: |
+ <script type="text/javascript">
+ // JavaScript example
+
+ document.getElementById("demo").innerHTML = "Hello JavaScript!";
+ </script>
+ <p>okay</p>
+ static: |2-
+
+ <p data-sourcepos="6:1-6:4" dir="auto">okay</p>
+ wysiwyg: |-
+ <p>okay</p>
+04_06__leaf_blocks__html_blocks__024:
+ canonical: |
+ <style
+ type="text/css">
+ h1 {color:red;}
+
+ p {color:blue;}
+ </style>
+ <p>okay</p>
+ static: |2-
+
+ h1 {color:red;}
+
+ p {color:blue;}
+
+ <p data-sourcepos="7:1-7:4" dir="auto">okay</p>
+ wysiwyg: |-
+ <p>okay</p>
+04_06__leaf_blocks__html_blocks__025:
+ canonical: |
+ <style
+ type="text/css">
+
+ foo
+ static: |2-
+
+
+ foo
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__026:
+ canonical: |
+ <blockquote>
+ <div>
+ foo
+ </blockquote>
+ <p>bar</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:5" dir="auto">
+ <div>
+ foo
+
+ <p data-sourcepos="4:1-4:3">bar</p>
+ </div>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><div><p>
+ foo
+ </p></div></blockquote>
+ <p>bar</p>
+04_06__leaf_blocks__html_blocks__027:
+ canonical: |
+ <ul>
+ <li>
+ <div>
+ </li>
+ <li>foo</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:5" dir="auto">
+ <li data-sourcepos="1:1-1:7">
+ <div>
+
+ <li data-sourcepos="2:1-2:5">foo</li>
+ </div>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p><div></div></li><li><p>foo</p></li></ul>
+04_06__leaf_blocks__html_blocks__028:
+ canonical: |
+ <style>p{color:red;}</style>
+ <p><em>foo</em></p>
+ static: |-
+ p{color:red;}
+ <p data-sourcepos="2:1-2:5" dir="auto"><em>foo</em></p>
+ wysiwyg: |-
+ <p><em>foo</em></p>
+04_06__leaf_blocks__html_blocks__029:
+ canonical: |
+ <!-- foo -->*bar*
+ <p><em>baz</em></p>
+ static: |-
+ *bar*
+ <p data-sourcepos="2:1-2:5" dir="auto"><em>baz</em></p>
+ wysiwyg: |-
+ <p>*bar*
+ </p>
+ <p><em>baz</em></p>
+04_06__leaf_blocks__html_blocks__030:
+ canonical: |
+ <script>
+ foo
+ </script>1. *bar*
+ static: |-
+ 1. *bar*
+ wysiwyg: |-
+ <p>1. *bar*</p>
+04_06__leaf_blocks__html_blocks__031:
+ canonical: |
+ <!-- Foo
+
+ bar
+ baz -->
+ <p>okay</p>
+ static: |2-
+
+ <p data-sourcepos="5:1-5:4" dir="auto">okay</p>
+ wysiwyg: |-
+ <p>okay</p>
+04_06__leaf_blocks__html_blocks__032:
+ canonical: |
+ <?php
+
+ echo '>';
+
+ ?>
+ <p>okay</p>
+ static: |-
+ <?php echo '>';
+
+ ?&gt;
+ <p data-sourcepos="6:1-6:4" dir="auto">okay</p>
+ wysiwyg: |-
+ <p>';
+
+ ?&gt;
+ </p>
+ <p>okay</p>
+04_06__leaf_blocks__html_blocks__033:
+ canonical: |
+ <!DOCTYPE html>
+ static: ""
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__034:
+ canonical: |
+ <![CDATA[
+ function matchwo(a,b)
+ {
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+ }
+ ]]>
+ <p>okay</p>
+ static: |-
+ &lt;![CDATA[
+ function matchwo(a,b)
+ {
+ if (a &lt; b &amp;&amp; a &lt; 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+ }
+ ]]&gt;
+ <p data-sourcepos="13:1-13:4" dir="auto">okay</p>
+ wysiwyg: |-
+ <p>okay</p>
+04_06__leaf_blocks__html_blocks__035:
+ canonical: |2
+ <!-- foo -->
+ <pre><code>&lt;!-- foo --&gt;
+ </code></pre>
+ static: " \n<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
+ data-sourcepos=\"3:5-3:16\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
+ class=\"line\" lang=\"plaintext\">&lt;!-- foo --&gt;</span></code></pre>\n<copy-code></copy-code>\n</div>"
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&lt;!-- foo --&gt;</code></pre>
+04_06__leaf_blocks__html_blocks__036:
+ canonical: |2
+ <div>
+ <pre><code>&lt;div&gt;
+ </code></pre>
+ static: |2-
+ <div>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:5-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;div&gt;</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </div>
+ wysiwyg: |-
+ <div><pre class="content-editor-code-block undefined code highlight"><code>&lt;div&gt;</code></pre></div>
+04_06__leaf_blocks__html_blocks__037:
+ canonical: |
+ <p>Foo</p>
+ <div>
+ bar
+ </div>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
+ <div>
+ bar
+ </div>
+ wysiwyg: |-
+ <p>Foo</p>
+ <div><p>
+ bar
+ </p></div>
+04_06__leaf_blocks__html_blocks__038:
+ canonical: |
+ <div>
+ bar
+ </div>
+ *foo*
+ static: |-
+ <div>
+ bar
+ </div>
+ *foo*
+ wysiwyg: |-
+ <div><p>
+ bar
+ </p></div>
+ <p>
+ *foo*</p>
+04_06__leaf_blocks__html_blocks__039:
+ canonical: |
+ <p>Foo
+ <a href="bar">
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-3:3" dir="auto">Foo
+ <a href="bar">
+ baz</a></p>
+ wysiwyg: |-
+ <p>Foo
+ <a target="_blank" rel="noopener noreferrer nofollow" href="bar">
+ baz</a></p>
+04_06__leaf_blocks__html_blocks__040:
+ canonical: |
+ <div>
+ <p><em>Emphasized</em> text.</p>
+ </div>
+ static: |-
+ <div>
+ <p data-sourcepos="3:1-3:18"><em>Emphasized</em> text.</p>
+ </div>
+ wysiwyg: |-
+ <div><p><em>Emphasized</em> text.</p></div>
+04_06__leaf_blocks__html_blocks__041:
+ canonical: |
+ <div>
+ *Emphasized* text.
+ </div>
+ static: |-
+ <div>
+ *Emphasized* text.
+ </div>
+ wysiwyg: |-
+ <div><p>
+ *Emphasized* text.
+ </p></div>
+04_06__leaf_blocks__html_blocks__042:
+ canonical: |
+ <table>
+ <tr>
+ <td>
+ Hi
+ </td>
+ </tr>
+ </table>
+ static: |-
+ <table dir="auto">
+ <tr>
+ <td>
+ Hi
+ </td>
+ </tr>
+ </table>
+ wysiwyg: |-
+ <table><tbody><tr><td colspan="1" rowspan="1"><p>
+ Hi
+ </p></td></tr></tbody></table>
+04_06__leaf_blocks__html_blocks__043:
+ canonical: |
+ <table>
+ <tr>
+ <pre><code>&lt;td&gt;
+ Hi
+ &lt;/td&gt;
+ </code></pre>
+ </tr>
+ </table>
+ static: |-
+ <table dir="auto">
+ <tr>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="5:5-8:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;td&gt;</span>
+ <span id="LC2" class="line" lang="plaintext"> Hi</span>
+ <span id="LC3" class="line" lang="plaintext">&lt;/td&gt;</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </tr>
+ </table>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&lt;td&gt;
+ Hi
+ &lt;/td&gt;</code></pre>
+ <table><tbody><tr></tr></tbody></table>
+04_07__leaf_blocks__link_reference_definitions__001:
+ canonical: |
+ <p><a href="/url" title="title">foo</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:5" dir="auto"><a href="/url" title="title">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__002:
+ canonical: |
+ <p><a href="/url" title="the title">foo</a></p>
+ static: |-
+ <p data-sourcepos="5:1-5:5" dir="auto"><a href="/url" title="the title">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="the title">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__003:
+ canonical: |
+ <p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:11" dir="auto"><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
+04_07__leaf_blocks__link_reference_definitions__004:
+ canonical: |
+ <p><a href="my%20url" title="title">Foo bar</a></p>
+ static: |-
+ <p data-sourcepos="5:1-5:9" dir="auto"><a href="my%20url" title="title">Foo bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="my%20url" title="title">Foo bar</a></p>
+04_07__leaf_blocks__link_reference_definitions__005:
+ canonical: |
+ <p><a href="/url" title="
+ title
+ line1
+ line2
+ ">foo</a></p>
+ static: |-
+ <p data-sourcepos="7:1-7:5" dir="auto"><a href="/url" title="
+ title
+ line1
+ line2
+ ">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="
+ title
+ line1
+ line2
+ ">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__006:
+ canonical: |
+ <p>[foo]: /url 'title</p>
+ <p>with blank line'</p>
+ <p>[foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:18" dir="auto">[foo]: /url 'title</p>
+ <p data-sourcepos="3:1-3:16" dir="auto">with blank line'</p>
+ <p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <p>[foo]: /url 'title</p>
+ <p>with blank line'</p>
+ <p>[foo]</p>
+04_07__leaf_blocks__link_reference_definitions__007:
+ canonical: |
+ <p><a href="/url">foo</a></p>
+ static: |-
+ <p data-sourcepos="4:1-4:5" dir="auto"><a href="/url">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__008:
+ canonical: |
+ <p>[foo]:</p>
+ <p>[foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">[foo]:</p>
+ <p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <p>[foo]:</p>
+ <p>[foo]</p>
+04_07__leaf_blocks__link_reference_definitions__009:
+ canonical: |
+ <p><a href="">foo</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:5" dir="auto"><a href="">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__010:
+ canonical: |
+ <p>[foo]: <bar>(baz)</p>
+ <p>[foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">[foo]: (baz)</p>
+ <p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <p>[foo]: </p>
+ <p>[foo]</p>
+04_07__leaf_blocks__link_reference_definitions__011:
+ canonical: |
+ <p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:5" dir="auto"><a href="/url%5Cbar*baz" title='foo"bar\baz'>foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__012:
+ canonical: |
+ <p><a href="url">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><a href="url">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="url">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__013:
+ canonical: |
+ <p><a href="first">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><a href="first">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="first">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__014:
+ canonical: |
+ <p><a href="/url">Foo</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:5" dir="auto"><a href="/url">Foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__015:
+ canonical: |
+ <p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:8" dir="auto"><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/%CF%86%CE%BF%CF%85">αγω</a></p>
+04_07__leaf_blocks__link_reference_definitions__016:
+ canonical: ""
+ static: ""
+ wysiwyg: |-
+ <p></p>
+04_07__leaf_blocks__link_reference_definitions__017:
+ canonical: |
+ <p>bar</p>
+ static: |-
+ <p data-sourcepos="1:1-4:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <p>bar</p>
+04_07__leaf_blocks__link_reference_definitions__018:
+ canonical: |
+ <p>[foo]: /url &quot;title&quot; ok</p>
+ static: |-
+ <p data-sourcepos="1:1-1:22" dir="auto">[foo]: /url "title" ok</p>
+ wysiwyg: |-
+ <p>[foo]: /url "title" ok</p>
+04_07__leaf_blocks__link_reference_definitions__019:
+ canonical: |
+ <p>&quot;title&quot; ok</p>
+ static: |-
+ <p data-sourcepos="1:1-2:10" dir="auto">"title" ok</p>
+ wysiwyg: |-
+ <p>"title" ok</p>
+04_07__leaf_blocks__link_reference_definitions__020:
+ canonical: |
+ <pre><code>[foo]: /url &quot;title&quot;
+ </code></pre>
+ <p>[foo]</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url "title"</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>[foo]: /url "title"</code></pre>
+ <p>[foo]</p>
+04_07__leaf_blocks__link_reference_definitions__021:
+ canonical: |
+ <pre><code>[foo]: /url
+ </code></pre>
+ <p>[foo]</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>[foo]: /url</code></pre>
+ <p>[foo]</p>
+04_07__leaf_blocks__link_reference_definitions__022:
+ canonical: |
+ <p>Foo
+ [bar]: /baz</p>
+ <p>[bar]</p>
+ static: |-
+ <p data-sourcepos="1:1-2:11" dir="auto">Foo
+ [bar]: /baz</p>
+ <p data-sourcepos="4:1-4:5" dir="auto">[bar]</p>
+ wysiwyg: |-
+ <p>Foo
+ [bar]: /baz</p>
+ <p>[bar]</p>
+04_07__leaf_blocks__link_reference_definitions__023:
+ canonical: |
+ <h1><a href="/url">Foo</a></h1>
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <h1 data-sourcepos="1:1-1:7" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a><a href="/url">Foo</a>
+ </h1>
+ <blockquote data-sourcepos="3:1-3:5" dir="auto">
+ <p data-sourcepos="3:3-3:5">bar</p>
+ </blockquote>
+ wysiwyg: |-
+ <h1><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></h1>
+ <blockquote multiline="false"><p>bar</p></blockquote>
+04_07__leaf_blocks__link_reference_definitions__024:
+ canonical: |
+ <h1>bar</h1>
+ <p><a href="/url">foo</a></p>
+ static: |-
+ <h1 data-sourcepos="1:1-4:5" dir="auto">
+ <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h1>
+ <p data-sourcepos="4:1-4:5" dir="auto"><a href="/url">foo</a></p>
+ wysiwyg: |-
+ <h1>bar</h1>
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__025:
+ canonical: |
+ <p>===
+ <a href="/url">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-3:5" dir="auto">===
+ <a href="/url">foo</a></p>
+ wysiwyg: |-
+ <p>===
+ <a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__026:
+ canonical: |
+ <p><a href="/foo-url" title="foo">foo</a>,
+ <a href="/bar-url" title="bar">bar</a>,
+ <a href="/baz-url">baz</a></p>
+ static: |-
+ <p data-sourcepos="6:1-8:5" dir="auto"><a href="/foo-url" title="foo">foo</a>,
+ <a href="/bar-url" title="bar">bar</a>,
+ <a href="/baz-url">baz</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/foo-url" title="foo">foo</a>,
+ <a target="_blank" rel="noopener noreferrer nofollow" href="/bar-url" title="bar">bar</a>,
+ <a target="_blank" rel="noopener noreferrer nofollow" href="/baz-url">baz</a></p>
+04_07__leaf_blocks__link_reference_definitions__027:
+ canonical: |
+ <p><a href="/url">foo</a></p>
+ <blockquote>
+ </blockquote>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><a href="/url">foo</a></p>
+ <blockquote data-sourcepos="3:1-3:13" dir="auto">
+ </blockquote>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+ <blockquote multiline="false"><p></p></blockquote>
+04_07__leaf_blocks__link_reference_definitions__028:
+ canonical: ""
+ static: ""
+ wysiwyg: |-
+ <p></p>
+04_08__leaf_blocks__paragraphs__001:
+ canonical: |
+ <p>aaa</p>
+ <p>bbb</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">aaa</p>
+ <p data-sourcepos="3:1-3:3" dir="auto">bbb</p>
+ wysiwyg: |-
+ <p>aaa</p>
+ <p>bbb</p>
+04_08__leaf_blocks__paragraphs__002:
+ canonical: |
+ <p>aaa
+ bbb</p>
+ <p>ccc
+ ddd</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">aaa
+ bbb</p>
+ <p data-sourcepos="4:1-5:3" dir="auto">ccc
+ ddd</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb</p>
+ <p>ccc
+ ddd</p>
+04_08__leaf_blocks__paragraphs__003:
+ canonical: |
+ <p>aaa</p>
+ <p>bbb</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">aaa</p>
+ <p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
+ wysiwyg: |-
+ <p>aaa</p>
+ <p>bbb</p>
+04_08__leaf_blocks__paragraphs__004:
+ canonical: |
+ <p>aaa
+ bbb</p>
+ static: |-
+ <p data-sourcepos="1:3-2:4" dir="auto">aaa
+ bbb</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb</p>
+04_08__leaf_blocks__paragraphs__005:
+ canonical: |
+ <p>aaa
+ bbb
+ ccc</p>
+ static: |-
+ <p data-sourcepos="1:1-3:42" dir="auto">aaa
+ bbb
+ ccc</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb
+ ccc</p>
+04_08__leaf_blocks__paragraphs__006:
+ canonical: |
+ <p>aaa
+ bbb</p>
+ static: |-
+ <p data-sourcepos="1:4-2:3" dir="auto">aaa
+ bbb</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb</p>
+04_08__leaf_blocks__paragraphs__007:
+ canonical: |
+ <pre><code>aaa
+ </code></pre>
+ <p>bbb</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="2:1-2:3" dir="auto">bbb</p>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
+ <p>bbb</p>
+04_08__leaf_blocks__paragraphs__008:
+ canonical: |
+ <p>aaa<br />
+ bbb</p>
+ static: |-
+ <p data-sourcepos="1:1-2:8" dir="auto">aaa<br>
+ bbb</p>
+ wysiwyg: |-
+ <p>aaa<br>
+ bbb</p>
+04_09__leaf_blocks__blank_lines__001:
+ canonical: |
+ <p>aaa</p>
+ <h1>aaa</h1>
+ static: |-
+ <p data-sourcepos="3:1-3:3" dir="auto">aaa</p>
+ <h1 data-sourcepos="6:1-6:5" dir="auto">
+ <a id="user-content-aaa" class="anchor" href="#aaa" aria-hidden="true"></a>aaa</h1>
+ wysiwyg: |-
+ <p>aaa</p>
+ <h1>aaa</h1>
+04_10__leaf_blocks__tables_extension__001:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th>foo</th>
+ <th>bar</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>baz</td>
+ <td>bim</td>
+ </tr>
+ </tbody>
+ </table>
+ static: |-
+ <table data-sourcepos="1:1-3:13" dir="auto">
+ <thead>
+ <tr data-sourcepos="1:1-1:13">
+ <th data-sourcepos="1:2-1:6">foo</th>
+ <th data-sourcepos="1:8-1:12">bar</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr data-sourcepos="3:1-3:13">
+ <td data-sourcepos="3:2-3:6">baz</td>
+ <td data-sourcepos="3:8-3:12">bim</td>
+ </tr>
+ </tbody>
+ </table>
+ wysiwyg: |-
+ <table><tbody><tr><th colspan="1" rowspan="1"><p>foo</p></th><th colspan="1" rowspan="1"><p>bar</p></th></tr><tr><td colspan="1" rowspan="1"><p>baz</p></td><td colspan="1" rowspan="1"><p>bim</p></td></tr></tbody></table>
+04_10__leaf_blocks__tables_extension__002:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th align="center">abc</th>
+ <th align="right">defghi</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td align="center">bar</td>
+ <td align="right">baz</td>
+ </tr>
+ </tbody>
+ </table>
+ static: |-
+ <table data-sourcepos="1:1-3:9" dir="auto">
+ <thead>
+ <tr data-sourcepos="1:1-1:16">
+ <th align="center" data-sourcepos="1:2-1:6">abc</th>
+ <th align="right" data-sourcepos="1:8-1:15">defghi</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr data-sourcepos="3:1-3:9">
+ <td align="center" data-sourcepos="3:1-3:4">bar</td>
+ <td align="right" data-sourcepos="3:6-3:9">baz</td>
+ </tr>
+ </tbody>
+ </table>
+ wysiwyg: |-
+ <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>defghi</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr></tbody></table>
+04_10__leaf_blocks__tables_extension__003:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th>f|oo</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>b <code>|</code> az</td>
+ </tr>
+ <tr>
+ <td>b <strong>|</strong> im</td>
+ </tr>
+ </tbody>
+ </table>
+ static: |-
+ <table data-sourcepos="1:1-4:15" dir="auto">
+ <thead>
+ <tr data-sourcepos="1:1-1:10">
+ <th data-sourcepos="1:2-1:9">f|oo</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr data-sourcepos="3:1-3:13">
+ <td data-sourcepos="3:2-3:12">b <code>|</code> az</td>
+ </tr>
+ <tr data-sourcepos="4:1-4:15">
+ <td data-sourcepos="4:2-4:14">b <strong>|</strong> im</td>
+ </tr>
+ </tbody>
+ </table>
+ wysiwyg: |-
+ <table><tbody><tr><th colspan="1" rowspan="1"><p>f|oo</p></th></tr><tr><td colspan="1" rowspan="1"><p>b <code>|</code> az</p></td></tr><tr><td colspan="1" rowspan="1"><p>b <strong>|</strong> im</p></td></tr></tbody></table>
+04_10__leaf_blocks__tables_extension__004:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th>abc</th>
+ <th>def</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>bar</td>
+ <td>baz</td>
+ </tr>
+ </tbody>
+ </table>
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <table data-sourcepos="1:1-3:13" dir="auto">
+ <thead>
+ <tr data-sourcepos="1:1-1:13">
+ <th data-sourcepos="1:2-1:6">abc</th>
+ <th data-sourcepos="1:8-1:12">def</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr data-sourcepos="3:1-3:13">
+ <td data-sourcepos="3:2-3:6">bar</td>
+ <td data-sourcepos="3:8-3:12">baz</td>
+ </tr>
+ </tbody>
+ </table>
+ <blockquote data-sourcepos="4:1-4:5" dir="auto">
+ <p data-sourcepos="4:3-4:5">bar</p>
+ </blockquote>
+ wysiwyg: |-
+ <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr></tbody></table>
+ <blockquote multiline="false"><p>bar</p></blockquote>
+04_10__leaf_blocks__tables_extension__005:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th>abc</th>
+ <th>def</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>bar</td>
+ <td>baz</td>
+ </tr>
+ <tr>
+ <td>bar</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ <p>bar</p>
+ static: |-
+ <table data-sourcepos="1:1-4:3" dir="auto">
+ <thead>
+ <tr data-sourcepos="1:1-1:13">
+ <th data-sourcepos="1:2-1:6">abc</th>
+ <th data-sourcepos="1:8-1:12">def</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr data-sourcepos="3:1-3:13">
+ <td data-sourcepos="3:2-3:6">bar</td>
+ <td data-sourcepos="3:8-3:12">baz</td>
+ </tr>
+ <tr data-sourcepos="4:1-4:3">
+ <td data-sourcepos="4:1-4:3">bar</td>
+ <td data-sourcepos="4:0-4:0"></td>
+ </tr>
+ </tbody>
+ </table>
+ <p data-sourcepos="6:1-6:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p></p></td></tr></tbody></table>
+ <p>bar</p>
+04_10__leaf_blocks__tables_extension__006:
+ canonical: |
+ <p>| abc | def |
+ | --- |
+ | bar |</p>
+ static: |-
+ <p data-sourcepos="1:1-3:7" dir="auto">| abc | def |
+ | --- |
+ | bar |</p>
+ wysiwyg: |-
+ <p>| abc | def |
+ | --- |
+ | bar |</p>
+04_10__leaf_blocks__tables_extension__007:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th>abc</th>
+ <th>def</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>bar</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>bar</td>
+ <td>baz</td>
+ </tr>
+ </tbody>
+ </table>
+ static: |-
+ <table data-sourcepos="1:1-4:19" dir="auto">
+ <thead>
+ <tr data-sourcepos="1:1-1:13">
+ <th data-sourcepos="1:2-1:6">abc</th>
+ <th data-sourcepos="1:8-1:12">def</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr data-sourcepos="3:1-3:7">
+ <td data-sourcepos="3:2-3:6">bar</td>
+ <td data-sourcepos="3:0-3:0"></td>
+ </tr>
+ <tr data-sourcepos="4:1-4:19">
+ <td data-sourcepos="4:2-4:6">bar</td>
+ <td data-sourcepos="4:8-4:12">baz</td>
+ </tr>
+ </tbody>
+ </table>
+ wysiwyg: |-
+ <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p></p></td></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr></tbody></table>
+04_10__leaf_blocks__tables_extension__008:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th>abc</th>
+ <th>def</th>
+ </tr>
+ </thead>
+ </table>
+ static: |-
+ <table data-sourcepos="1:1-2:13" dir="auto">
+ <thead>
+ <tr data-sourcepos="1:1-1:13">
+ <th data-sourcepos="1:2-1:6">abc</th>
+ <th data-sourcepos="1:8-1:12">def</th>
+ </tr>
+ </thead>
+ </table>
+ wysiwyg: |-
+ <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr></tbody></table>
+05_01__container_blocks__block_quotes__001:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">
+ <h1 data-sourcepos="1:3-1:7">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
+ <p data-sourcepos="2:3-3:5">bar
+ baz</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__002:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">
+ <h1 data-sourcepos="1:2-1:6">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
+ <p data-sourcepos="2:2-3:5">bar
+ baz</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__003:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:4-3:6" dir="auto">
+ <h1 data-sourcepos="1:6-1:10">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
+ <p data-sourcepos="2:6-3:6">bar
+ baz</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__004:
+ canonical: |
+ <pre><code>&gt; # Foo
+ &gt; bar
+ &gt; baz
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&gt; # Foo</span>
+ <span id="LC2" class="line" lang="plaintext">&gt; bar</span>
+ <span id="LC3" class="line" lang="plaintext">&gt; baz</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&gt; # Foo
+ &gt; bar
+ &gt; baz</code></pre>
+05_01__container_blocks__block_quotes__005:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:3" dir="auto">
+ <h1 data-sourcepos="1:3-1:7">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
+ <p data-sourcepos="2:3-3:3">bar
+ baz</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__006:
+ canonical: |
+ <blockquote>
+ <p>bar
+ baz
+ foo</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">
+ <p data-sourcepos="1:3-3:5">bar
+ baz
+ foo</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>bar
+ baz
+ foo</p></blockquote>
+05_01__container_blocks__block_quotes__007:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ <hr />
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ </blockquote>
+ <hr data-sourcepos="2:1-2:3">
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+ <hr>
+05_01__container_blocks__block_quotes__008:
+ canonical: |
+ <blockquote>
+ <ul>
+ <li>foo</li>
+ </ul>
+ </blockquote>
+ <ul>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:7" dir="auto">
+ <ul data-sourcepos="1:3-1:7">
+ <li data-sourcepos="1:3-1:7">foo</li>
+ </ul>
+ </blockquote>
+ <ul data-sourcepos="2:1-2:5" dir="auto">
+ <li data-sourcepos="2:1-2:5">bar</li>
+ </ul>
+ wysiwyg: |-
+ <blockquote multiline="false"><ul bullet="*"><li><p>foo</p></li></ul></blockquote>
+ <ul bullet="*"><li><p>bar</p></li></ul>
+05_01__container_blocks__block_quotes__009:
+ canonical: |
+ <blockquote>
+ <pre><code>foo
+ </code></pre>
+ </blockquote>
+ <pre><code>bar
+ </code></pre>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:9" dir="auto">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:7-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </blockquote>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="2:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre></blockquote>
+ <pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre>
+05_01__container_blocks__block_quotes__010:
+ canonical: |
+ <blockquote>
+ <pre><code></code></pre>
+ </blockquote>
+ <p>foo</p>
+ <pre><code></code></pre>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:3-2:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </blockquote>
+ <p data-sourcepos="2:1-2:3" dir="auto">foo</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code></code></pre></blockquote>
+ <p>foo</p>
+ <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
+05_01__container_blocks__block_quotes__011:
+ canonical: |
+ <blockquote>
+ <p>foo
+ - bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:9" dir="auto">
+ <p data-sourcepos="1:3-2:9">foo
+ - bar</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo
+ - bar</p></blockquote>
+05_01__container_blocks__block_quotes__012:
+ canonical: |
+ <blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:1" dir="auto">
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p></p></blockquote>
+05_01__container_blocks__block_quotes__013:
+ canonical: |
+ <blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:2" dir="auto">
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p></p></blockquote>
+05_01__container_blocks__block_quotes__014:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:3" dir="auto">
+ <p data-sourcepos="2:3-2:5">foo</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+05_01__container_blocks__block_quotes__015:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ </blockquote>
+ <blockquote data-sourcepos="3:1-3:5" dir="auto">
+ <p data-sourcepos="3:3-3:5">bar</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+ <blockquote multiline="false"><p>bar</p></blockquote>
+05_01__container_blocks__block_quotes__016:
+ canonical: |
+ <blockquote>
+ <p>foo
+ bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:5" dir="auto">
+ <p data-sourcepos="1:3-2:5">foo
+ bar</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo
+ bar</p></blockquote>
+05_01__container_blocks__block_quotes__017:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ <p data-sourcepos="3:3-3:5">bar</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p><p>bar</p></blockquote>
+05_01__container_blocks__block_quotes__018:
+ canonical: |
+ <p>foo</p>
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">foo</p>
+ <blockquote data-sourcepos="2:1-2:5" dir="auto">
+ <p data-sourcepos="2:3-2:5">bar</p>
+ </blockquote>
+ wysiwyg: |-
+ <p>foo</p>
+ <blockquote multiline="false"><p>bar</p></blockquote>
+05_01__container_blocks__block_quotes__019:
+ canonical: |
+ <blockquote>
+ <p>aaa</p>
+ </blockquote>
+ <hr />
+ <blockquote>
+ <p>bbb</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">
+ <p data-sourcepos="1:3-1:5">aaa</p>
+ </blockquote>
+ <hr data-sourcepos="2:1-2:3">
+ <blockquote data-sourcepos="3:1-3:5" dir="auto">
+ <p data-sourcepos="3:3-3:5">bbb</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>aaa</p></blockquote>
+ <hr>
+ <blockquote multiline="false"><p>bbb</p></blockquote>
+05_01__container_blocks__block_quotes__020:
+ canonical: |
+ <blockquote>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:3" dir="auto">
+ <p data-sourcepos="1:3-2:3">bar
+ baz</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__021:
+ canonical: |
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ <p>baz</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">
+ <p data-sourcepos="1:3-1:5">bar</p>
+ </blockquote>
+ <p data-sourcepos="3:1-3:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>bar</p></blockquote>
+ <p>baz</p>
+05_01__container_blocks__block_quotes__022:
+ canonical: |
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ <p>baz</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:1" dir="auto">
+ <p data-sourcepos="1:3-1:5">bar</p>
+ </blockquote>
+ <p data-sourcepos="3:1-3:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>bar</p></blockquote>
+ <p>baz</p>
+05_01__container_blocks__block_quotes__023:
+ canonical: |
+ <blockquote>
+ <blockquote>
+ <blockquote>
+ <p>foo
+ bar</p>
+ </blockquote>
+ </blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:3" dir="auto">
+ <blockquote data-sourcepos="1:3-2:3">
+ <blockquote data-sourcepos="1:5-2:3">
+ <p data-sourcepos="1:7-2:3">foo
+ bar</p>
+ </blockquote>
+ </blockquote>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><blockquote multiline="false"><blockquote multiline="false"><p>foo
+ bar</p></blockquote></blockquote></blockquote>
+05_01__container_blocks__block_quotes__024:
+ canonical: |
+ <blockquote>
+ <blockquote>
+ <blockquote>
+ <p>foo
+ bar
+ baz</p>
+ </blockquote>
+ </blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">
+ <blockquote data-sourcepos="1:2-3:5">
+ <blockquote data-sourcepos="1:3-3:5">
+ <p data-sourcepos="1:5-3:5">foo
+ bar
+ baz</p>
+ </blockquote>
+ </blockquote>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><blockquote multiline="false"><blockquote multiline="false"><p>foo
+ bar
+ baz</p></blockquote></blockquote></blockquote>
+05_01__container_blocks__block_quotes__025:
+ canonical: |
+ <blockquote>
+ <pre><code>code
+ </code></pre>
+ </blockquote>
+ <blockquote>
+ <p>not code</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:10" dir="auto">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:7-1:10" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </blockquote>
+ <blockquote data-sourcepos="3:1-3:13" dir="auto">
+ <p data-sourcepos="3:6-3:13">not code</p>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>code</code></pre></blockquote>
+ <blockquote multiline="false"><p>not code</p></blockquote>
+05_02__container_blocks__list_items__001:
+ canonical: |
+ <p>A paragraph
+ with two lines.</p>
+ <pre><code>indented code
+ </code></pre>
+ <blockquote>
+ <p>A block quote.</p>
+ </blockquote>
+ static: |-
+ <p data-sourcepos="1:1-2:15" dir="auto">A paragraph
+ with two lines.</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="4:5-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <blockquote data-sourcepos="6:1-6:16" dir="auto">
+ <p data-sourcepos="6:3-6:16">A block quote.</p>
+ </blockquote>
+ wysiwyg: |-
+ <p>A paragraph
+ with two lines.</p>
+ <pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
+ <blockquote multiline="false"><p>A block quote.</p></blockquote>
+05_02__container_blocks__list_items__002:
+ canonical: |
+ <ol>
+ <li>
+ <p>A paragraph
+ with two lines.</p>
+ <pre><code>indented code
+ </code></pre>
+ <blockquote>
+ <p>A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-6:20" dir="auto">
+ <li data-sourcepos="1:1-6:20">
+ <p data-sourcepos="1:5-2:19">A paragraph
+ with two lines.</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="4:9-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <blockquote data-sourcepos="6:5-6:20">
+ <p data-sourcepos="6:7-6:20">A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>A paragraph
+ with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
+05_02__container_blocks__list_items__003:
+ canonical: |
+ <ul>
+ <li>one</li>
+ </ul>
+ <p>two</p>
+ static: |-
+ <ul data-sourcepos="1:1-2:0" dir="auto">
+ <li data-sourcepos="1:1-2:0">one</li>
+ </ul>
+ <p data-sourcepos="3:2-3:4" dir="auto">two</p>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>one</p></li></ul>
+ <p>two</p>
+05_02__container_blocks__list_items__004:
+ canonical: |
+ <ul>
+ <li>
+ <p>one</p>
+ <p>two</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">
+ <li data-sourcepos="1:1-3:5">
+ <p data-sourcepos="1:3-1:5">one</p>
+ <p data-sourcepos="3:3-3:5">two</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>one</p><p>two</p></li></ul>
+05_02__container_blocks__list_items__005:
+ canonical: |
+ <ul>
+ <li>one</li>
+ </ul>
+ <pre><code> two
+ </code></pre>
+ static: |-
+ <ul data-sourcepos="1:2-2:0" dir="auto">
+ <li data-sourcepos="1:2-2:0">one</li>
+ </ul>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:5-3:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> two</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>one</p></li></ul>
+ <pre class="content-editor-code-block undefined code highlight"><code> two</code></pre>
+05_02__container_blocks__list_items__006:
+ canonical: |
+ <ul>
+ <li>
+ <p>one</p>
+ <p>two</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:2-3:9" dir="auto">
+ <li data-sourcepos="1:2-3:9">
+ <p data-sourcepos="1:7-1:9">one</p>
+ <p data-sourcepos="3:7-3:9">two</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>one</p><p>two</p></li></ul>
+05_02__container_blocks__list_items__007:
+ canonical: |
+ <blockquote>
+ <blockquote>
+ <ol>
+ <li>
+ <p>one</p>
+ <p>two</p>
+ </li>
+ </ol>
+ </blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:4-3:10" dir="auto">
+ <blockquote data-sourcepos="1:6-3:10">
+ <ol data-sourcepos="1:8-3:10">
+ <li data-sourcepos="1:8-3:10">
+ <p data-sourcepos="1:12-1:14">one</p>
+ <p data-sourcepos="3:8-3:10">two</p>
+ </li>
+ </ol>
+ </blockquote>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><blockquote multiline="false"><ol parens="false"><li><p>one</p><p>two</p></li></ol></blockquote></blockquote>
+05_02__container_blocks__list_items__008:
+ canonical: |
+ <blockquote>
+ <blockquote>
+ <ul>
+ <li>one</li>
+ </ul>
+ <p>two</p>
+ </blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:10" dir="auto">
+ <blockquote data-sourcepos="1:2-3:10">
+ <ul data-sourcepos="1:3-2:2">
+ <li data-sourcepos="1:3-2:2">one</li>
+ </ul>
+ <p data-sourcepos="3:8-3:10">two</p>
+ </blockquote>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><blockquote multiline="false"><ul bullet="*"><li><p>one</p></li></ul><p>two</p></blockquote></blockquote>
+05_02__container_blocks__list_items__009:
+ canonical: |
+ <p>-one</p>
+ <p>2.two</p>
+ static: |-
+ <p data-sourcepos="1:1-1:4" dir="auto">-one</p>
+ <p data-sourcepos="3:1-3:5" dir="auto">2.two</p>
+ wysiwyg: |-
+ <p>-one</p>
+ <p>2.two</p>
+05_02__container_blocks__list_items__010:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:5" dir="auto">
+ <li data-sourcepos="1:1-4:5">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ <p data-sourcepos="4:3-4:5">bar</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+05_02__container_blocks__list_items__011:
+ canonical: |
+ <ol>
+ <li>
+ <p>foo</p>
+ <pre><code>bar
+ </code></pre>
+ <p>baz</p>
+ <blockquote>
+ <p>bam</p>
+ </blockquote>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-9:9" dir="auto">
+ <li data-sourcepos="1:1-9:9">
+ <p data-sourcepos="1:5-1:7">foo</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:5-5:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="7:5-7:7">baz</p>
+ <blockquote data-sourcepos="9:5-9:9">
+ <p data-sourcepos="9:7-9:9">bam</p>
+ </blockquote>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre><p>baz</p><blockquote multiline="false"><p>bam</p></blockquote></li></ol>
+05_02__container_blocks__list_items__012:
+ canonical: |
+ <ul>
+ <li>
+ <p>Foo</p>
+ <pre><code>bar
+
+
+ baz
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-6:9" dir="auto">
+ <li data-sourcepos="1:1-6:9">
+ <p data-sourcepos="1:3-1:5">Foo</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:7-6:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span>
+ <span id="LC2" class="line" lang="plaintext"></span>
+ <span id="LC3" class="line" lang="plaintext"></span>
+ <span id="LC4" class="line" lang="plaintext">baz</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>Foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar
+
+
+ baz</code></pre></li></ul>
+05_02__container_blocks__list_items__013:
+ canonical: |
+ <ol start="123456789">
+ <li>ok</li>
+ </ol>
+ static: |-
+ <ol start="123456789" data-sourcepos="1:1-1:13" dir="auto">
+ <li data-sourcepos="1:1-1:13">ok</li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>ok</p></li></ol>
+05_02__container_blocks__list_items__014:
+ canonical: |
+ <p>1234567890. not ok</p>
+ static: |-
+ <p data-sourcepos="1:1-1:18" dir="auto">1234567890. not ok</p>
+ wysiwyg: |-
+ <p>1234567890. not ok</p>
+05_02__container_blocks__list_items__015:
+ canonical: |
+ <ol start="0">
+ <li>ok</li>
+ </ol>
+ static: |-
+ <ol start="0" data-sourcepos="1:1-1:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">ok</li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>ok</p></li></ol>
+05_02__container_blocks__list_items__016:
+ canonical: |
+ <ol start="3">
+ <li>ok</li>
+ </ol>
+ static: |-
+ <ol start="3" data-sourcepos="1:1-1:7" dir="auto">
+ <li data-sourcepos="1:1-1:7">ok</li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>ok</p></li></ol>
+05_02__container_blocks__list_items__017:
+ canonical: |
+ <p>-1. not ok</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">-1. not ok</p>
+ wysiwyg: |-
+ <p>-1. not ok</p>
+05_02__container_blocks__list_items__018:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <pre><code>bar
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:9" dir="auto">
+ <li data-sourcepos="1:1-3:9">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:7-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ul>
+05_02__container_blocks__list_items__019:
+ canonical: |
+ <ol start="10">
+ <li>
+ <p>foo</p>
+ <pre><code>bar
+ </code></pre>
+ </li>
+ </ol>
+ static: |-
+ <ol start="10" data-sourcepos="1:3-3:14" dir="auto">
+ <li data-sourcepos="1:3-3:14">
+ <p data-sourcepos="1:8-1:10">foo</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:12-3:14" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ol>
+05_02__container_blocks__list_items__020:
+ canonical: |
+ <pre><code>indented code
+ </code></pre>
+ <p>paragraph</p>
+ <pre><code>more code
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="3:1-3:9" dir="auto">paragraph</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="5:5-5:13" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
+ <p>paragraph</p>
+ <pre class="content-editor-code-block undefined code highlight"><code>more code</code></pre>
+05_02__container_blocks__list_items__021:
+ canonical: |
+ <ol>
+ <li>
+ <pre><code>indented code
+ </code></pre>
+ <p>paragraph</p>
+ <pre><code>more code
+ </code></pre>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-5:16" dir="auto">
+ <li data-sourcepos="1:1-5:16">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:8-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="3:4-3:12">paragraph</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="5:8-5:16" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><p>paragraph</p><pre class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
+05_02__container_blocks__list_items__022:
+ canonical: |
+ <ol>
+ <li>
+ <pre><code> indented code
+ </code></pre>
+ <p>paragraph</p>
+ <pre><code>more code
+ </code></pre>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-5:16" dir="auto">
+ <li data-sourcepos="1:1-5:16">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:8-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="3:4-3:12">paragraph</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="5:8-5:16" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code> indented code</code></pre><p>paragraph</p><pre class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
+05_02__container_blocks__list_items__023:
+ canonical: |
+ <p>foo</p>
+ <p>bar</p>
+ static: |-
+ <p data-sourcepos="1:4-1:6" dir="auto">foo</p>
+ <p data-sourcepos="3:1-3:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <p>foo</p>
+ <p>bar</p>
+05_02__container_blocks__list_items__024:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ <p>bar</p>
+ static: |-
+ <ul data-sourcepos="1:1-2:0" dir="auto">
+ <li data-sourcepos="1:1-2:0">foo</li>
+ </ul>
+ <p data-sourcepos="3:3-3:5" dir="auto">bar</p>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li></ul>
+ <p>bar</p>
+05_02__container_blocks__list_items__025:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:6" dir="auto">
+ <li data-sourcepos="1:1-3:6">
+ <p data-sourcepos="1:4-1:6">foo</p>
+ <p data-sourcepos="3:4-3:6">bar</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+05_02__container_blocks__list_items__026:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li>
+ <pre><code>bar
+ </code></pre>
+ </li>
+ <li>
+ <pre><code>baz
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-8:9" dir="auto">
+ <li data-sourcepos="1:1-2:5">foo</li>
+ <li data-sourcepos="3:1-6:5">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="4:3-6:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ <li data-sourcepos="7:1-8:9">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="8:7-8:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">baz</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>baz</code></pre></li></ul>
+05_02__container_blocks__list_items__027:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:5" dir="auto">
+ <li data-sourcepos="1:1-2:5">foo</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li></ul>
+05_02__container_blocks__list_items__028:
+ canonical: |
+ <ul>
+ <li></li>
+ </ul>
+ <p>foo</p>
+ static: |-
+ <ul data-sourcepos="1:1-2:0" dir="auto">
+ <li data-sourcepos="1:1-1:1">
+ </li>
+ </ul>
+ <p data-sourcepos="3:3-3:5" dir="auto">foo</p>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p></li></ul>
+ <p>foo</p>
+05_02__container_blocks__list_items__029:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li></li>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">foo</li>
+ <li data-sourcepos="2:1-2:1">
+ </li>
+ <li data-sourcepos="3:1-3:5">bar</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li><li><p></p></li><li><p>bar</p></li></ul>
+05_02__container_blocks__list_items__030:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li></li>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">foo</li>
+ <li data-sourcepos="2:1-2:4">
+ </li>
+ <li data-sourcepos="3:1-3:5">bar</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li><li><p></p></li><li><p>bar</p></li></ul>
+05_02__container_blocks__list_items__031:
+ canonical: |
+ <ol>
+ <li>foo</li>
+ <li></li>
+ <li>bar</li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-3:6" dir="auto">
+ <li data-sourcepos="1:1-1:6">foo</li>
+ <li data-sourcepos="2:1-2:2">
+ </li>
+ <li data-sourcepos="3:1-3:6">bar</li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p></li><li><p></p></li><li><p>bar</p></li></ol>
+05_02__container_blocks__list_items__032:
+ canonical: |
+ <ul>
+ <li></li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:1" dir="auto">
+ <li data-sourcepos="1:1-1:1">
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p></li></ul>
+05_02__container_blocks__list_items__033:
+ canonical: |
+ <p>foo
+ *</p>
+ <p>foo
+ 1.</p>
+ static: |-
+ <p data-sourcepos="1:1-2:1" dir="auto">foo
+ *</p>
+ <p data-sourcepos="4:1-5:2" dir="auto">foo
+ 1.</p>
+ wysiwyg: |-
+ <p>foo
+ *</p>
+ <p>foo
+ 1.</p>
+05_02__container_blocks__list_items__034:
+ canonical: |
+ <ol>
+ <li>
+ <p>A paragraph
+ with two lines.</p>
+ <pre><code>indented code
+ </code></pre>
+ <blockquote>
+ <p>A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:2-6:21" dir="auto">
+ <li data-sourcepos="1:2-6:21">
+ <p data-sourcepos="1:6-2:20">A paragraph
+ with two lines.</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="4:10-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <blockquote data-sourcepos="6:6-6:21">
+ <p data-sourcepos="6:8-6:21">A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>A paragraph
+ with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
+05_02__container_blocks__list_items__035:
+ canonical: |
+ <ol>
+ <li>
+ <p>A paragraph
+ with two lines.</p>
+ <pre><code>indented code
+ </code></pre>
+ <blockquote>
+ <p>A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:3-6:22" dir="auto">
+ <li data-sourcepos="1:3-6:22">
+ <p data-sourcepos="1:7-2:21">A paragraph
+ with two lines.</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="4:11-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <blockquote data-sourcepos="6:7-6:22">
+ <p data-sourcepos="6:9-6:22">A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>A paragraph
+ with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
+05_02__container_blocks__list_items__036:
+ canonical: |
+ <ol>
+ <li>
+ <p>A paragraph
+ with two lines.</p>
+ <pre><code>indented code
+ </code></pre>
+ <blockquote>
+ <p>A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:4-6:23" dir="auto">
+ <li data-sourcepos="1:4-6:23">
+ <p data-sourcepos="1:8-2:22">A paragraph
+ with two lines.</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="4:12-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <blockquote data-sourcepos="6:8-6:23">
+ <p data-sourcepos="6:10-6:23">A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>A paragraph
+ with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
+05_02__container_blocks__list_items__037:
+ canonical: |
+ <pre><code>1. A paragraph
+ with two lines.
+
+ indented code
+
+ &gt; A block quote.
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-6:24" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. A paragraph</span>
+ <span id="LC2" class="line" lang="plaintext"> with two lines.</span>
+ <span id="LC3" class="line" lang="plaintext"></span>
+ <span id="LC4" class="line" lang="plaintext"> indented code</span>
+ <span id="LC5" class="line" lang="plaintext"></span>
+ <span id="LC6" class="line" lang="plaintext"> &gt; A block quote.</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>1. A paragraph
+ with two lines.
+
+ indented code
+
+ &gt; A block quote.</code></pre>
+05_02__container_blocks__list_items__038:
+ canonical: |
+ <ol>
+ <li>
+ <p>A paragraph
+ with two lines.</p>
+ <pre><code>indented code
+ </code></pre>
+ <blockquote>
+ <p>A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:3-6:22" dir="auto">
+ <li data-sourcepos="1:3-6:22">
+ <p data-sourcepos="1:7-2:15">A paragraph
+ with two lines.</p>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="4:11-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <blockquote data-sourcepos="6:7-6:22">
+ <p data-sourcepos="6:9-6:22">A block quote.</p>
+ </blockquote>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>A paragraph
+ with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
+05_02__container_blocks__list_items__039:
+ canonical: |
+ <ol>
+ <li>A paragraph
+ with two lines.</li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:3-2:19" dir="auto">
+ <li data-sourcepos="1:3-2:19">A paragraph
+ with two lines.</li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>A paragraph
+ with two lines.</p></li></ol>
+05_02__container_blocks__list_items__040:
+ canonical: |
+ <blockquote>
+ <ol>
+ <li>
+ <blockquote>
+ <p>Blockquote
+ continued here.</p>
+ </blockquote>
+ </li>
+ </ol>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:15" dir="auto">
+ <ol data-sourcepos="1:3-2:15">
+ <li data-sourcepos="1:3-2:15">
+ <blockquote data-sourcepos="1:6-2:15">
+ <p data-sourcepos="1:8-2:15">Blockquote
+ continued here.</p>
+ </blockquote>
+ </li>
+ </ol>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><ol parens="false"><li><p></p><blockquote multiline="false"><p>Blockquote
+ continued here.</p></blockquote></li></ol></blockquote>
+05_02__container_blocks__list_items__041:
+ canonical: |
+ <blockquote>
+ <ol>
+ <li>
+ <blockquote>
+ <p>Blockquote
+ continued here.</p>
+ </blockquote>
+ </li>
+ </ol>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:17" dir="auto">
+ <ol data-sourcepos="1:3-2:17">
+ <li data-sourcepos="1:3-2:17">
+ <blockquote data-sourcepos="1:6-2:17">
+ <p data-sourcepos="1:8-2:17">Blockquote
+ continued here.</p>
+ </blockquote>
+ </li>
+ </ol>
+ </blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><ol parens="false"><li><p></p><blockquote multiline="false"><p>Blockquote
+ continued here.</p></blockquote></li></ol></blockquote>
+05_02__container_blocks__list_items__042:
+ canonical: |
+ <ul>
+ <li>foo
+ <ul>
+ <li>bar
+ <ul>
+ <li>baz
+ <ul>
+ <li>boo</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:11" dir="auto">
+ <li data-sourcepos="1:1-4:11">foo
+ <ul data-sourcepos="2:3-4:11">
+ <li data-sourcepos="2:3-4:11">bar
+ <ul data-sourcepos="3:5-4:11">
+ <li data-sourcepos="3:5-4:11">baz
+ <ul data-sourcepos="4:7-4:11">
+ <li data-sourcepos="4:7-4:11">boo</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p><ul bullet="*"><li><p>baz</p><ul bullet="*"><li><p>boo</p></li></ul></li></ul></li></ul></li></ul>
+05_02__container_blocks__list_items__043:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li>bar</li>
+ <li>baz</li>
+ <li>boo</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:8" dir="auto">
+ <li data-sourcepos="1:1-1:5">foo</li>
+ <li data-sourcepos="2:2-2:6">bar</li>
+ <li data-sourcepos="3:3-3:7">baz</li>
+ <li data-sourcepos="4:4-4:8">boo</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li><li><p>baz</p></li><li><p>boo</p></li></ul>
+05_02__container_blocks__list_items__044:
+ canonical: |
+ <ol start="10">
+ <li>foo
+ <ul>
+ <li>bar</li>
+ </ul>
+ </li>
+ </ol>
+ static: |-
+ <ol start="10" data-sourcepos="1:1-2:9" dir="auto">
+ <li data-sourcepos="1:1-2:9">foo
+ <ul data-sourcepos="2:5-2:9">
+ <li data-sourcepos="2:5-2:9">bar</li>
+ </ul>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p><ul bullet="*"><li><p>bar</p></li></ul></li></ol>
+05_02__container_blocks__list_items__045:
+ canonical: |
+ <ol start="10">
+ <li>foo</li>
+ </ol>
+ <ul>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <ol start="10" data-sourcepos="1:1-1:7" dir="auto">
+ <li data-sourcepos="1:1-1:7">foo</li>
+ </ol>
+ <ul data-sourcepos="2:4-2:8" dir="auto">
+ <li data-sourcepos="2:4-2:8">bar</li>
+ </ul>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p></li></ol>
+ <ul bullet="*"><li><p>bar</p></li></ul>
+05_02__container_blocks__list_items__046:
+ canonical: |
+ <ul>
+ <li>
+ <ul>
+ <li>foo</li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:7" dir="auto">
+ <li data-sourcepos="1:1-1:7">
+ <ul data-sourcepos="1:3-1:7">
+ <li data-sourcepos="1:3-1:7">foo</li>
+ </ul>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p><ul bullet="*"><li><p>foo</p></li></ul></li></ul>
+05_02__container_blocks__list_items__047:
+ canonical: |
+ <ol>
+ <li>
+ <ul>
+ <li>
+ <ol start="2">
+ <li>foo</li>
+ </ol>
+ </li>
+ </ul>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-1:11" dir="auto">
+ <li data-sourcepos="1:1-1:11">
+ <ul data-sourcepos="1:4-1:11">
+ <li data-sourcepos="1:4-1:11">
+ <ol start="2" data-sourcepos="1:6-1:11">
+ <li data-sourcepos="1:6-1:11">foo</li>
+ </ol>
+ </li>
+ </ul>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p></p><ul bullet="*"><li><p></p><ol parens="false"><li><p>foo</p></li></ol></li></ul></li></ol>
+05_02__container_blocks__list_items__048:
+ canonical: |
+ <ul>
+ <li>
+ <h1>Foo</h1>
+ </li>
+ <li>
+ <h2>Bar</h2>
+ baz</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:5" dir="auto">
+ <li data-sourcepos="1:1-1:7">
+ <h1 data-sourcepos="1:3-1:7">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
+ </li>
+ <li data-sourcepos="2:1-4:5">
+ <h2 data-sourcepos="2:3-4:5">
+ <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>Bar</h2>
+ baz</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p><h1>Foo</h1></li><li><p></p><h2>Bar</h2><p>
+ baz</p></li></ul>
+05_04__container_blocks__lists__001:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li>bar</li>
+ </ul>
+ <ul>
+ <li>baz</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:5" dir="auto">
+ <li data-sourcepos="1:1-1:5">foo</li>
+ <li data-sourcepos="2:1-2:5">bar</li>
+ </ul>
+ <ul data-sourcepos="3:1-3:5" dir="auto">
+ <li data-sourcepos="3:1-3:5">baz</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li></ul>
+ <ul bullet="*"><li><p>baz</p></li></ul>
+05_04__container_blocks__lists__002:
+ canonical: |
+ <ol>
+ <li>foo</li>
+ <li>bar</li>
+ </ol>
+ <ol start="3">
+ <li>baz</li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-2:6" dir="auto">
+ <li data-sourcepos="1:1-1:6">foo</li>
+ <li data-sourcepos="2:1-2:6">bar</li>
+ </ol>
+ <ol start="3" data-sourcepos="3:1-3:6" dir="auto">
+ <li data-sourcepos="3:1-3:6">baz</li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p></li><li><p>bar</p></li></ol>
+ <ol parens="false"><li><p>baz</p></li></ol>
+05_04__container_blocks__lists__003:
+ canonical: |
+ <p>Foo</p>
+ <ul>
+ <li>bar</li>
+ <li>baz</li>
+ </ul>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
+ <ul data-sourcepos="2:1-3:5" dir="auto">
+ <li data-sourcepos="2:1-2:5">bar</li>
+ <li data-sourcepos="3:1-3:5">baz</li>
+ </ul>
+ wysiwyg: |-
+ <p>Foo</p>
+ <ul bullet="*"><li><p>bar</p></li><li><p>baz</p></li></ul>
+05_04__container_blocks__lists__004:
+ canonical: |
+ <p>The number of windows in my house is
+ 14. The number of doors is 6.</p>
+ static: |-
+ <p data-sourcepos="1:1-2:30" dir="auto">The number of windows in my house is
+ 14. The number of doors is 6.</p>
+ wysiwyg: |-
+ <p>The number of windows in my house is
+ 14. The number of doors is 6.</p>
+05_04__container_blocks__lists__005:
+ canonical: |
+ <p>The number of windows in my house is</p>
+ <ol>
+ <li>The number of doors is 6.</li>
+ </ol>
+ static: |-
+ <p data-sourcepos="1:1-1:36" dir="auto">The number of windows in my house is</p>
+ <ol data-sourcepos="2:1-2:29" dir="auto">
+ <li data-sourcepos="2:1-2:29">The number of doors is 6.</li>
+ </ol>
+ wysiwyg: |-
+ <p>The number of windows in my house is</p>
+ <ol parens="false"><li><p>The number of doors is 6.</p></li></ol>
+05_04__container_blocks__lists__006:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ </li>
+ <li>
+ <p>bar</p>
+ </li>
+ <li>
+ <p>baz</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-6:5" dir="auto">
+ <li data-sourcepos="1:1-2:0">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ </li>
+ <li data-sourcepos="3:1-5:0">
+ <p data-sourcepos="3:3-3:5">bar</p>
+ </li>
+ <li data-sourcepos="6:1-6:5">
+ <p data-sourcepos="6:3-6:5">baz</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li><li><p>baz</p></li></ul>
+05_04__container_blocks__lists__007:
+ canonical: |
+ <ul>
+ <li>foo
+ <ul>
+ <li>bar
+ <ul>
+ <li>
+ <p>baz</p>
+ <p>bim</p>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-6:9" dir="auto">
+ <li data-sourcepos="1:1-6:9">foo
+ <ul data-sourcepos="2:3-6:9">
+ <li data-sourcepos="2:3-6:9">bar
+ <ul data-sourcepos="3:5-6:9">
+ <li data-sourcepos="3:5-6:9">
+ <p data-sourcepos="3:7-3:9">baz</p>
+ <p data-sourcepos="6:7-6:9">bim</p>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p><ul bullet="*"><li><p>baz</p><p>bim</p></li></ul></li></ul></li></ul>
+05_04__container_blocks__lists__008:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li>bar</li>
+ </ul>
+ <!-- -->
+ <ul>
+ <li>baz</li>
+ <li>bim</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:0" dir="auto">
+ <li data-sourcepos="1:1-1:5">foo</li>
+ <li data-sourcepos="2:1-3:0">bar</li>
+ </ul>
+
+ <ul data-sourcepos="6:1-7:5" dir="auto">
+ <li data-sourcepos="6:1-6:5">baz</li>
+ <li data-sourcepos="7:1-7:5">bim</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li></ul>
+ <ul bullet="*"><li><p>baz</p></li><li><p>bim</p></li></ul>
+05_04__container_blocks__lists__009:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>notcode</p>
+ </li>
+ <li>
+ <p>foo</p>
+ </li>
+ </ul>
+ <!-- -->
+ <pre><code>code
+ </code></pre>
+ static: |-
+ <ul data-sourcepos="1:1-6:0" dir="auto">
+ <li data-sourcepos="1:1-4:0">
+ <p data-sourcepos="1:5-1:7">foo</p>
+ <p data-sourcepos="3:5-3:11">notcode</p>
+ </li>
+ <li data-sourcepos="5:1-6:0">
+ <p data-sourcepos="5:5-5:7">foo</p>
+ </li>
+ </ul>
+
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="9:5-9:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>notcode</p></li><li><p>foo</p></li></ul>
+ <pre class="content-editor-code-block undefined code highlight"><code>code</code></pre>
+05_04__container_blocks__lists__010:
+ canonical: |
+ <ul>
+ <li>a</li>
+ <li>b</li>
+ <li>c</li>
+ <li>d</li>
+ <li>e</li>
+ <li>f</li>
+ <li>g</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-7:3" dir="auto">
+ <li data-sourcepos="1:1-1:3">a</li>
+ <li data-sourcepos="2:2-2:4">b</li>
+ <li data-sourcepos="3:3-3:5">c</li>
+ <li data-sourcepos="4:4-4:6">d</li>
+ <li data-sourcepos="5:3-5:5">e</li>
+ <li data-sourcepos="6:2-6:4">f</li>
+ <li data-sourcepos="7:1-7:3">g</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li><li><p>d</p></li><li><p>e</p></li><li><p>f</p></li><li><p>g</p></li></ul>
+05_04__container_blocks__lists__011:
+ canonical: |
+ <ol>
+ <li>
+ <p>a</p>
+ </li>
+ <li>
+ <p>b</p>
+ </li>
+ <li>
+ <p>c</p>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-5:7" dir="auto">
+ <li data-sourcepos="1:1-2:0">
+ <p data-sourcepos="1:4-1:4">a</p>
+ </li>
+ <li data-sourcepos="3:3-4:0">
+ <p data-sourcepos="3:6-3:6">b</p>
+ </li>
+ <li data-sourcepos="5:4-5:7">
+ <p data-sourcepos="5:7-5:7">c</p>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li></ol>
+05_04__container_blocks__lists__012:
+ canonical: |
+ <ul>
+ <li>a</li>
+ <li>b</li>
+ <li>c</li>
+ <li>d
+ - e</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-5:7" dir="auto">
+ <li data-sourcepos="1:1-1:3">a</li>
+ <li data-sourcepos="2:2-2:4">b</li>
+ <li data-sourcepos="3:3-3:5">c</li>
+ <li data-sourcepos="4:4-5:7">d
+ - e</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li><li><p>d
+ - e</p></li></ul>
+05_04__container_blocks__lists__013:
+ canonical: |
+ <ol>
+ <li>
+ <p>a</p>
+ </li>
+ <li>
+ <p>b</p>
+ </li>
+ </ol>
+ <pre><code>3. c
+ </code></pre>
+ static: |-
+ <ol data-sourcepos="1:1-4:0" dir="auto">
+ <li data-sourcepos="1:1-2:0">
+ <p data-sourcepos="1:4-1:4">a</p>
+ </li>
+ <li data-sourcepos="3:3-4:0">
+ <p data-sourcepos="3:6-3:6">b</p>
+ </li>
+ </ol>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="5:5-5:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">3. c</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <ol parens="false"><li><p>a</p></li><li><p>b</p></li></ol>
+ <pre class="content-editor-code-block undefined code highlight"><code>3. c</code></pre>
+05_04__container_blocks__lists__014:
+ canonical: |
+ <ul>
+ <li>
+ <p>a</p>
+ </li>
+ <li>
+ <p>b</p>
+ </li>
+ <li>
+ <p>c</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:3" dir="auto">
+ <li data-sourcepos="1:1-1:3">
+ <p data-sourcepos="1:3-1:3">a</p>
+ </li>
+ <li data-sourcepos="2:1-3:0">
+ <p data-sourcepos="2:3-2:3">b</p>
+ </li>
+ <li data-sourcepos="4:1-4:3">
+ <p data-sourcepos="4:3-4:3">c</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li></ul>
+05_04__container_blocks__lists__015:
+ canonical: |
+ <ul>
+ <li>
+ <p>a</p>
+ </li>
+ <li></li>
+ <li>
+ <p>c</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:3" dir="auto">
+ <li data-sourcepos="1:1-1:3">
+ <p data-sourcepos="1:3-1:3">a</p>
+ </li>
+ <li data-sourcepos="2:1-2:1">
+ </li>
+ <li data-sourcepos="4:1-4:3">
+ <p data-sourcepos="4:3-4:3">c</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li><li><p></p></li><li><p>c</p></li></ul>
+05_04__container_blocks__lists__016:
+ canonical: |
+ <ul>
+ <li>
+ <p>a</p>
+ </li>
+ <li>
+ <p>b</p>
+ <p>c</p>
+ </li>
+ <li>
+ <p>d</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-5:3" dir="auto">
+ <li data-sourcepos="1:1-1:3">
+ <p data-sourcepos="1:3-1:3">a</p>
+ </li>
+ <li data-sourcepos="2:1-4:3">
+ <p data-sourcepos="2:3-2:3">b</p>
+ <p data-sourcepos="4:3-4:3">c</p>
+ </li>
+ <li data-sourcepos="5:1-5:3">
+ <p data-sourcepos="5:3-5:3">d</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li><li><p>b</p><p>c</p></li><li><p>d</p></li></ul>
+05_04__container_blocks__lists__017:
+ canonical: |
+ <ul>
+ <li>
+ <p>a</p>
+ </li>
+ <li>
+ <p>b</p>
+ </li>
+ <li>
+ <p>d</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-5:3" dir="auto">
+ <li data-sourcepos="1:1-1:3">
+ <p data-sourcepos="1:3-1:3">a</p>
+ </li>
+ <li data-sourcepos="2:1-4:13">
+ <p data-sourcepos="2:3-2:3">b</p>
+ </li>
+ <li data-sourcepos="5:1-5:3">
+ <p data-sourcepos="5:3-5:3">d</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>d</p></li></ul>
+05_04__container_blocks__lists__018:
+ canonical: |
+ <ul>
+ <li>a</li>
+ <li>
+ <pre><code>b
+
+
+ </code></pre>
+ </li>
+ <li>c</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-7:3" dir="auto">
+ <li data-sourcepos="1:1-1:3">a</li>
+ <li data-sourcepos="2:1-6:5">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="2:3-6:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">b</span>
+ <span id="LC2" class="line" lang="plaintext"></span>
+ <span id="LC3" class="line" lang="plaintext"></span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ <li data-sourcepos="7:1-7:3">c</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>b</code></pre></li><li><p>c</p></li></ul>
+05_04__container_blocks__lists__019:
+ canonical: |
+ <ul>
+ <li>a
+ <ul>
+ <li>
+ <p>b</p>
+ <p>c</p>
+ </li>
+ </ul>
+ </li>
+ <li>d</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-5:3" dir="auto">
+ <li data-sourcepos="1:1-4:5">a
+ <ul data-sourcepos="2:3-4:5">
+ <li data-sourcepos="2:3-4:5">
+ <p data-sourcepos="2:5-2:5">b</p>
+ <p data-sourcepos="4:5-4:5">c</p>
+ </li>
+ </ul>
+ </li>
+ <li data-sourcepos="5:1-5:3">d</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p><ul bullet="*"><li><p>b</p><p>c</p></li></ul></li><li><p>d</p></li></ul>
+05_04__container_blocks__lists__020:
+ canonical: |
+ <ul>
+ <li>a
+ <blockquote>
+ <p>b</p>
+ </blockquote>
+ </li>
+ <li>c</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:3" dir="auto">
+ <li data-sourcepos="1:1-3:3">a
+ <blockquote data-sourcepos="2:3-3:3">
+ <p data-sourcepos="2:5-2:5">b</p>
+ </blockquote>
+ </li>
+ <li data-sourcepos="4:1-4:3">c</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p><blockquote multiline="false"><p>b</p></blockquote></li><li><p>c</p></li></ul>
+05_04__container_blocks__lists__021:
+ canonical: |
+ <ul>
+ <li>a
+ <blockquote>
+ <p>b</p>
+ </blockquote>
+ <pre><code>c
+ </code></pre>
+ </li>
+ <li>d</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-6:3" dir="auto">
+ <li data-sourcepos="1:1-5:5">a
+ <blockquote data-sourcepos="2:3-2:5">
+ <p data-sourcepos="2:5-2:5">b</p>
+ </blockquote>
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="3:3-5:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">c</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ </li>
+ <li data-sourcepos="6:1-6:3">d</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p><blockquote multiline="false"><p>b</p></blockquote><pre class="content-editor-code-block undefined code highlight"><code>c</code></pre></li><li><p>d</p></li></ul>
+05_04__container_blocks__lists__022:
+ canonical: |
+ <ul>
+ <li>a</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:3" dir="auto">
+ <li data-sourcepos="1:1-1:3">a</li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li></ul>
+05_04__container_blocks__lists__023:
+ canonical: |
+ <ul>
+ <li>a
+ <ul>
+ <li>b</li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:5" dir="auto">
+ <li data-sourcepos="1:1-2:5">a
+ <ul data-sourcepos="2:3-2:5">
+ <li data-sourcepos="2:3-2:5">b</li>
+ </ul>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p><ul bullet="*"><li><p>b</p></li></ul></li></ul>
+05_04__container_blocks__lists__024:
+ canonical: |
+ <ol>
+ <li>
+ <pre><code>foo
+ </code></pre>
+ <p>bar</p>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-5:6" dir="auto">
+ <li data-sourcepos="1:1-5:6">
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:4-3:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ <p data-sourcepos="5:4-5:6">bar</p>
+ </li>
+ </ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre><p>bar</p></li></ol>
+05_04__container_blocks__lists__025:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <ul>
+ <li>bar</li>
+ </ul>
+ <p>baz</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:5" dir="auto">
+ <li data-sourcepos="1:1-4:5">
+ <p data-sourcepos="1:3-1:5">foo</p>
+ <ul data-sourcepos="2:3-3:0">
+ <li data-sourcepos="2:3-3:0">bar</li>
+ </ul>
+ <p data-sourcepos="4:3-4:5">baz</p>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p></li></ul><p>baz</p></li></ul>
+05_04__container_blocks__lists__026:
+ canonical: |
+ <ul>
+ <li>
+ <p>a</p>
+ <ul>
+ <li>b</li>
+ <li>c</li>
+ </ul>
+ </li>
+ <li>
+ <p>d</p>
+ <ul>
+ <li>e</li>
+ <li>f</li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-7:5" dir="auto">
+ <li data-sourcepos="1:1-4:0">
+ <p data-sourcepos="1:3-1:3">a</p>
+ <ul data-sourcepos="2:3-4:0">
+ <li data-sourcepos="2:3-2:5">b</li>
+ <li data-sourcepos="3:3-4:0">c</li>
+ </ul>
+ </li>
+ <li data-sourcepos="5:1-7:5">
+ <p data-sourcepos="5:3-5:3">d</p>
+ <ul data-sourcepos="6:3-7:5">
+ <li data-sourcepos="6:3-6:5">e</li>
+ <li data-sourcepos="7:3-7:5">f</li>
+ </ul>
+ </li>
+ </ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p><ul bullet="*"><li><p>b</p></li><li><p>c</p></li></ul></li><li><p>d</p><ul bullet="*"><li><p>e</p></li><li><p>f</p></li></ul></li></ul>
+06_01__inlines__001:
+ canonical: |
+ <p><code>hi</code>lo`</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><code>hi</code>lo`</p>
+ wysiwyg: |-
+ <p><code>hi</code>lo`</p>
+06_02__inlines__backslash_escapes__001:
+ canonical: |
+ <p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
+ static: |-
+ <p data-sourcepos="1:1-1:224" dir="auto"><span>!</span>"<span>#</span><span>$</span><span>%</span><span>&amp;</span>'()*+,-./:;&lt;=&gt;?<span>@</span>[\]<span>^</span>_`{|}<span>~</span></p>
+ wysiwyg: |-
+ <p>!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
+06_02__inlines__backslash_escapes__002:
+ canonical: "<p>\\\t\\A\\a\\ \\3\\φ\\«</p>\n"
+ static: "<p data-sourcepos=\"1:1-1:16\" dir=\"auto\">\\\t\\A\\a\\ \\3\\φ\\«</p>"
+ wysiwyg: "<p>\\\t\\A\\a\\ \\3\\φ\\«</p>"
+06_02__inlines__backslash_escapes__003:
+ canonical: |
+ <p>*not emphasized*
+ &lt;br/&gt; not a tag
+ [not a link](/foo)
+ `not code`
+ 1. not a list
+ * not a list
+ # not a heading
+ [foo]: /url &quot;not a reference&quot;
+ &amp;ouml; not a character entity</p>
+ static: |-
+ <p data-sourcepos="1:1-9:50" dir="auto">*not emphasized*
+ &lt;br/&gt; not a tag
+ <a href="/foo">not a link</a>
+ `not code`
+ 1. not a list
+ * not a list
+ <span>#</span> not a heading
+ [foo]: /url "not a reference"
+ <span>&amp;</span>ouml; not a character entity</p>
+ wysiwyg: |-
+ <p>*not emphasized*
+ &lt;br/&gt; not a tag
+ [not a link](/foo)
+ `not code`
+ 1. not a list
+ * not a list
+ # not a heading
+ [foo]: /url "not a reference"
+ &amp;ouml; not a character entity</p>
+06_02__inlines__backslash_escapes__004:
+ canonical: |
+ <p>\<em>emphasis</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">\<em>emphasis</em></p>
+ wysiwyg: |-
+ <p>\<em>emphasis</em></p>
+06_02__inlines__backslash_escapes__005:
+ canonical: |
+ <p>foo<br />
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
+ bar</p>
+ wysiwyg: |-
+ <p>foo<br>
+ bar</p>
+06_02__inlines__backslash_escapes__006:
+ canonical: |
+ <p><code>\[\`</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><code>\[\`</code></p>
+ wysiwyg: |-
+ <p><code>\[\`</code></p>
+06_02__inlines__backslash_escapes__007:
+ canonical: |
+ <pre><code>\[\]
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\[\]</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>\[\]</code></pre>
+06_02__inlines__backslash_escapes__008:
+ canonical: |
+ <pre><code>\[\]
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\[\]</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>\[\]</code></pre>
+06_02__inlines__backslash_escapes__009:
+ canonical: |
+ <p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:28" dir="auto"><a href="http://example.com?find=%5C*" rel="nofollow noreferrer noopener" target="_blank">http://example.com?find=\*</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
+06_02__inlines__backslash_escapes__010:
+ canonical: |
+ <a href="/bar\/)">
+ static: |-
+ <a href="/bar%5C/)" rel="nofollow noreferrer noopener" target="_blank"></a>
+ wysiwyg: |-
+ <p></p>
+06_02__inlines__backslash_escapes__011:
+ canonical: |
+ <p><a href="/bar*" title="ti*tle">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto"><a href="/bar*" title="ti*tle">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
+06_02__inlines__backslash_escapes__012:
+ canonical: |
+ <p><a href="/bar*" title="ti*tle">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><a href="/bar*" title="ti*tle">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
+06_02__inlines__backslash_escapes__013:
+ canonical: |
+ <pre><code class="language-foo+bar">foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="foo+bar" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre language="foo+bar" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+06_03__inlines__entity_and_numeric_character_references__001:
+ canonical: |
+ <p>  &amp; © Æ Ď
+ ¾ ℋ ⅆ
+ ∲ ≧̸</p>
+ static: |-
+ <p data-sourcepos="1:1-3:32" dir="auto">  &amp; © Æ Ď
+ ¾ ℋ ⅆ
+ ∲ ≧̸</p>
+ wysiwyg: |-
+ <p>&nbsp; &amp; © Æ Ď
+ ¾ ℋ ⅆ
+ ∲ ≧̸</p>
+06_03__inlines__entity_and_numeric_character_references__002:
+ canonical: |
+ <p># Ӓ Ϡ �</p>
+ static: |-
+ <p data-sourcepos="1:1-1:25" dir="auto"># Ӓ Ϡ �</p>
+ wysiwyg: |-
+ <p># Ӓ Ϡ �</p>
+06_03__inlines__entity_and_numeric_character_references__003:
+ canonical: |
+ <p>&quot; ആ ಫ</p>
+ static: |-
+ <p data-sourcepos="1:1-1:22" dir="auto">" ആ ಫ</p>
+ wysiwyg: |-
+ <p>" ആ ಫ</p>
+06_03__inlines__entity_and_numeric_character_references__004:
+ canonical: |
+ <p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
+ &amp;#987654321;
+ &amp;#abcdef0;
+ &amp;ThisIsNotDefined; &amp;hi?;</p>
+ static: |-
+ <p data-sourcepos="1:1-4:24" dir="auto">&amp;nbsp &amp;x; &amp;#; &amp;#x;
+ &amp;#987654321;
+ &amp;#abcdef0;
+ &amp;ThisIsNotDefined; &amp;hi?;</p>
+ wysiwyg: |-
+ <p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
+ &amp;#987654321;
+ &amp;#abcdef0;
+ &amp;ThisIsNotDefined; &amp;hi?;</p>
+06_03__inlines__entity_and_numeric_character_references__005:
+ canonical: |
+ <p>&amp;copy</p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto">&amp;copy</p>
+ wysiwyg: |-
+ <p>&amp;copy</p>
+06_03__inlines__entity_and_numeric_character_references__006:
+ canonical: |
+ <p>&amp;MadeUpEntity;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:14" dir="auto">&amp;MadeUpEntity;</p>
+ wysiwyg: |-
+ <p>&amp;MadeUpEntity;</p>
+06_03__inlines__entity_and_numeric_character_references__007:
+ canonical: |
+ <a href="&ouml;&ouml;.html">
+ static: |-
+ <a href="%C3%B6%C3%B6.html" rel="nofollow noreferrer noopener" target="_blank"></a>
+ wysiwyg: |-
+ <p></p>
+06_03__inlines__entity_and_numeric_character_references__008:
+ canonical: |
+ <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:37" dir="auto"><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+06_03__inlines__entity_and_numeric_character_references__009:
+ canonical: |
+ <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+06_03__inlines__entity_and_numeric_character_references__010:
+ canonical: |
+ <pre><code class="language-föö">foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="föö" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre language="föö" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+06_03__inlines__entity_and_numeric_character_references__011:
+ canonical: |
+ <p><code>f&amp;ouml;&amp;ouml;</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><code>f&amp;ouml;&amp;ouml;</code></p>
+ wysiwyg: |-
+ <p><code>f&amp;ouml;&amp;ouml;</code></p>
+06_03__inlines__entity_and_numeric_character_references__012:
+ canonical: |
+ <pre><code>f&amp;ouml;f&amp;ouml;
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:5-1:18" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">f&amp;ouml;f&amp;ouml;</span></code></pre>
+ <copy-code></copy-code>
+ </div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>f&amp;ouml;f&amp;ouml;</code></pre>
+06_03__inlines__entity_and_numeric_character_references__013:
+ canonical: |
+ <p>*foo*
+ <em>foo</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto">*foo*
+ <em>foo</em></p>
+ wysiwyg: |-
+ <p>*foo*
+ <em>foo</em></p>
+06_03__inlines__entity_and_numeric_character_references__014:
+ canonical: |
+ <p>* foo</p>
+ <ul>
+ <li>foo</li>
+ </ul>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">* foo</p>
+ <ul data-sourcepos="3:1-3:5" dir="auto">
+ <li data-sourcepos="3:1-3:5">foo</li>
+ </ul>
+ wysiwyg: |-
+ <p>* foo</p>
+ <ul bullet="*"><li><p>foo</p></li></ul>
+06_03__inlines__entity_and_numeric_character_references__015:
+ canonical: |
+ <p>foo
+
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:16" dir="auto">foo
+
+ bar</p>
+ wysiwyg: |-
+ <p>foo
+
+ bar</p>
+06_03__inlines__entity_and_numeric_character_references__016:
+ canonical: "<p>\tfoo</p>\n"
+ static: "<p data-sourcepos=\"1:1-1:7\" dir=\"auto\">\tfoo</p>"
+ wysiwyg: "<p>\tfoo</p>"
+06_03__inlines__entity_and_numeric_character_references__017:
+ canonical: |
+ <p>[a](url &quot;tit&quot;)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto"><a href="url" title="tit">a</a></p>
+ wysiwyg: |-
+ <p>[a](url "tit")</p>
+06_04__inlines__code_spans__001:
+ canonical: |
+ <p><code>foo</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><code>foo</code></p>
+ wysiwyg: |-
+ <p><code>foo</code></p>
+06_04__inlines__code_spans__002:
+ canonical: |
+ <p><code>foo ` bar</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><code>foo ` bar</code></p>
+ wysiwyg: |-
+ <p><code>foo ` bar</code></p>
+06_04__inlines__code_spans__003:
+ canonical: |
+ <p><code>``</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto"><code>``</code></p>
+ wysiwyg: |-
+ <p><code>``</code></p>
+06_04__inlines__code_spans__004:
+ canonical: |
+ <p><code> `` </code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><code> `` </code></p>
+ wysiwyg: |-
+ <p><code> `` </code></p>
+06_04__inlines__code_spans__005:
+ canonical: |
+ <p><code> a</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:4" dir="auto"><code> a</code></p>
+ wysiwyg: |-
+ <p><code> a</code></p>
+06_04__inlines__code_spans__006:
+ canonical: |
+ <p><code> b </code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><code> b </code></p>
+ wysiwyg: |-
+ <p><code>&nbsp;b&nbsp;</code></p>
+06_04__inlines__code_spans__007:
+ canonical: |
+ <p><code> </code>
+ <code> </code></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><code> </code>
+ <code> </code></p>
+ wysiwyg: |-
+ <p></p>
+06_04__inlines__code_spans__008:
+ canonical: |
+ <p><code>foo bar baz</code></p>
+ static: |-
+ <p data-sourcepos="1:1-5:2" dir="auto"><code>foo bar baz</code></p>
+ wysiwyg: |-
+ <p><code>foo bar baz</code></p>
+06_04__inlines__code_spans__009:
+ canonical: |
+ <p><code>foo </code></p>
+ static: |-
+ <p data-sourcepos="1:1-3:2" dir="auto"><code>foo </code></p>
+ wysiwyg: |-
+ <p><code>foo </code></p>
+06_04__inlines__code_spans__010:
+ canonical: |
+ <p><code>foo bar baz</code></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><code>foo bar baz</code></p>
+ wysiwyg: |-
+ <p><code>foo bar baz</code></p>
+06_04__inlines__code_spans__011:
+ canonical: |
+ <p><code>foo\</code>bar`</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><code>foo\</code>bar`</p>
+ wysiwyg: |-
+ <p><code>foo\</code>bar`</p>
+06_04__inlines__code_spans__012:
+ canonical: |
+ <p><code>foo`bar</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><code>foo`bar</code></p>
+ wysiwyg: |-
+ <p><code>foo`bar</code></p>
+06_04__inlines__code_spans__013:
+ canonical: |
+ <p><code>foo `` bar</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:14" dir="auto"><code>foo `` bar</code></p>
+ wysiwyg: |-
+ <p><code>foo `` bar</code></p>
+06_04__inlines__code_spans__014:
+ canonical: |
+ <p>*foo<code>*</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">*foo<code>*</code></p>
+ wysiwyg: |-
+ <p>*foo<code>*</code></p>
+06_04__inlines__code_spans__015:
+ canonical: |
+ <p>[not a <code>link](/foo</code>)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto">[not a <code>link](/foo</code>)</p>
+ wysiwyg: |-
+ <p>[not a <code>link](/foo</code>)</p>
+06_04__inlines__code_spans__016:
+ canonical: |
+ <p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>
+ static: |-
+ <p data-sourcepos="1:1-1:14" dir="auto"><code>&lt;a href="</code>"&gt;`</p>
+ wysiwyg: |-
+ <p><code>&lt;a href="</code>"&gt;`</p>
+06_04__inlines__code_spans__017:
+ canonical: |
+ <p><a href="`">`</p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><a href="%60" rel="nofollow noreferrer noopener" target="_blank">`</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="`">`</a></p>
+06_04__inlines__code_spans__018:
+ canonical: |
+ <p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto"><code>&lt;http://foo.bar.</code>baz&gt;`</p>
+ wysiwyg: |-
+ <p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
+06_04__inlines__code_spans__019:
+ canonical: |
+ <p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
+ static: |-
+ <p data-sourcepos="1:1-1:22" dir="auto"><a href="http://foo.bar.%60baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.`baz</a>`</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
+06_04__inlines__code_spans__020:
+ canonical: |
+ <p>```foo``</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">```foo``</p>
+ wysiwyg: |-
+ <p>```foo``</p>
+06_04__inlines__code_spans__021:
+ canonical: |
+ <p>`foo</p>
+ static: |-
+ <p data-sourcepos="1:1-1:4" dir="auto">`foo</p>
+ wysiwyg: |-
+ <p>`foo</p>
+06_04__inlines__code_spans__022:
+ canonical: |
+ <p>`foo<code>bar</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto">`foo<code>bar</code></p>
+ wysiwyg: |-
+ <p>`foo<code>bar</code></p>
+06_05__inlines__emphasis_and_strong_emphasis__001:
+ canonical: |
+ <p><em>foo bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><em>foo bar</em></p>
+ wysiwyg: |-
+ <p><em>foo bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__002:
+ canonical: |
+ <p>a * foo bar*</p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">a * foo bar*</p>
+ wysiwyg: |-
+ <p>a * foo bar*</p>
+06_05__inlines__emphasis_and_strong_emphasis__003:
+ canonical: |
+ <p>a*&quot;foo&quot;*</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">a*"foo"*</p>
+ wysiwyg: |-
+ <p>a*"foo"*</p>
+06_05__inlines__emphasis_and_strong_emphasis__004:
+ canonical: |
+ <p>* a *</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">* a *</p>
+ wysiwyg: |-
+ <p>*&nbsp;a&nbsp;*</p>
+06_05__inlines__emphasis_and_strong_emphasis__005:
+ canonical: |
+ <p>foo<em>bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">foo<em>bar</em></p>
+ wysiwyg: |-
+ <p>foo<em>bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__006:
+ canonical: |
+ <p>5<em>6</em>78</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">5<em>6</em>78</p>
+ wysiwyg: |-
+ <p>5<em>6</em>78</p>
+06_05__inlines__emphasis_and_strong_emphasis__007:
+ canonical: |
+ <p><em>foo bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><em>foo bar</em></p>
+ wysiwyg: |-
+ <p><em>foo bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__008:
+ canonical: |
+ <p>_ foo bar_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">_ foo bar_</p>
+ wysiwyg: |-
+ <p>_ foo bar_</p>
+06_05__inlines__emphasis_and_strong_emphasis__009:
+ canonical: |
+ <p>a_&quot;foo&quot;_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">a_"foo"_</p>
+ wysiwyg: |-
+ <p>a_"foo"_</p>
+06_05__inlines__emphasis_and_strong_emphasis__010:
+ canonical: |
+ <p>foo_bar_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">foo_bar_</p>
+ wysiwyg: |-
+ <p>foo_bar_</p>
+06_05__inlines__emphasis_and_strong_emphasis__011:
+ canonical: |
+ <p>5_6_78</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">5_6_78</p>
+ wysiwyg: |-
+ <p>5_6_78</p>
+06_05__inlines__emphasis_and_strong_emphasis__012:
+ canonical: |
+ <p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:38" dir="auto">приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+ wysiwyg: |-
+ <p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+06_05__inlines__emphasis_and_strong_emphasis__013:
+ canonical: |
+ <p>aa_&quot;bb&quot;_cc</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">aa_"bb"_cc</p>
+ wysiwyg: |-
+ <p>aa_"bb"_cc</p>
+06_05__inlines__emphasis_and_strong_emphasis__014:
+ canonical: |
+ <p>foo-<em>(bar)</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto">foo-<em>(bar)</em></p>
+ wysiwyg: |-
+ <p>foo-<em>(bar)</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__015:
+ canonical: |
+ <p>_foo*</p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto">_foo*</p>
+ wysiwyg: |-
+ <p>_foo*</p>
+06_05__inlines__emphasis_and_strong_emphasis__016:
+ canonical: |
+ <p>*foo bar *</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">*foo bar *</p>
+ wysiwyg: |-
+ <p>*foo bar *</p>
+06_05__inlines__emphasis_and_strong_emphasis__017:
+ canonical: |
+ <p>*foo bar
+ *</p>
+ static: |-
+ <p data-sourcepos="1:1-2:1" dir="auto">*foo bar
+ *</p>
+ wysiwyg: |-
+ <p>*foo bar
+ *</p>
+06_05__inlines__emphasis_and_strong_emphasis__018:
+ canonical: |
+ <p>*(*foo)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">*(*foo)</p>
+ wysiwyg: |-
+ <p>*(*foo)</p>
+06_05__inlines__emphasis_and_strong_emphasis__019:
+ canonical: |
+ <p><em>(<em>foo</em>)</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><em>(<em>foo</em>)</em></p>
+ wysiwyg: |-
+ <p><em>(foo</em>)</p>
+06_05__inlines__emphasis_and_strong_emphasis__020:
+ canonical: |
+ <p><em>foo</em>bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>bar</p>
+ wysiwyg: |-
+ <p><em>foo</em>bar</p>
+06_05__inlines__emphasis_and_strong_emphasis__021:
+ canonical: |
+ <p>_foo bar _</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">_foo bar _</p>
+ wysiwyg: |-
+ <p>_foo bar _</p>
+06_05__inlines__emphasis_and_strong_emphasis__022:
+ canonical: |
+ <p>_(_foo)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">_(_foo)</p>
+ wysiwyg: |-
+ <p>_(_foo)</p>
+06_05__inlines__emphasis_and_strong_emphasis__023:
+ canonical: |
+ <p><em>(<em>foo</em>)</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><em>(<em>foo</em>)</em></p>
+ wysiwyg: |-
+ <p><em>(foo</em>)</p>
+06_05__inlines__emphasis_and_strong_emphasis__024:
+ canonical: |
+ <p>_foo_bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">_foo_bar</p>
+ wysiwyg: |-
+ <p>_foo_bar</p>
+06_05__inlines__emphasis_and_strong_emphasis__025:
+ canonical: |
+ <p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+ static: |-
+ <p data-sourcepos="1:1-1:38" dir="auto">_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+ wysiwyg: |-
+ <p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+06_05__inlines__emphasis_and_strong_emphasis__026:
+ canonical: |
+ <p><em>foo_bar_baz</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><em>foo_bar_baz</em></p>
+ wysiwyg: |-
+ <p><em>foo_bar_baz</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__027:
+ canonical: |
+ <p><em>(bar)</em>.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><em>(bar)</em>.</p>
+ wysiwyg: |-
+ <p><em>(bar)</em>.</p>
+06_05__inlines__emphasis_and_strong_emphasis__028:
+ canonical: |
+ <p><strong>foo bar</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><strong>foo bar</strong></p>
+ wysiwyg: |-
+ <p><strong>foo bar</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__029:
+ canonical: |
+ <p>** foo bar**</p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">** foo bar**</p>
+ wysiwyg: |-
+ <p>** foo bar**</p>
+06_05__inlines__emphasis_and_strong_emphasis__030:
+ canonical: |
+ <p>a**&quot;foo&quot;**</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">a**"foo"**</p>
+ wysiwyg: |-
+ <p>a**"foo"**</p>
+06_05__inlines__emphasis_and_strong_emphasis__031:
+ canonical: |
+ <p>foo<strong>bar</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">foo<strong>bar</strong></p>
+ wysiwyg: |-
+ <p>foo<strong>bar</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__032:
+ canonical: |
+ <p><strong>foo bar</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><strong>foo bar</strong></p>
+ wysiwyg: |-
+ <p><strong>foo bar</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__033:
+ canonical: |
+ <p>__ foo bar__</p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">__ foo bar__</p>
+ wysiwyg: |-
+ <p>__ foo bar__</p>
+06_05__inlines__emphasis_and_strong_emphasis__034:
+ canonical: |
+ <p>__
+ foo bar__</p>
+ static: |-
+ <p data-sourcepos="1:1-2:9" dir="auto">__
+ foo bar__</p>
+ wysiwyg: |-
+ <p>__
+ foo bar__</p>
+06_05__inlines__emphasis_and_strong_emphasis__035:
+ canonical: |
+ <p>a__&quot;foo&quot;__</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">a__"foo"__</p>
+ wysiwyg: |-
+ <p>a__"foo"__</p>
+06_05__inlines__emphasis_and_strong_emphasis__036:
+ canonical: |
+ <p>foo__bar__</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">foo__bar__</p>
+ wysiwyg: |-
+ <p>foo__bar__</p>
+06_05__inlines__emphasis_and_strong_emphasis__037:
+ canonical: |
+ <p>5__6__78</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">5__6__78</p>
+ wysiwyg: |-
+ <p>5__6__78</p>
+06_05__inlines__emphasis_and_strong_emphasis__038:
+ canonical: |
+ <p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+ static: |-
+ <p data-sourcepos="1:1-1:40" dir="auto">приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+ wysiwyg: |-
+ <p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+06_05__inlines__emphasis_and_strong_emphasis__039:
+ canonical: |
+ <p><strong>foo, <strong>bar</strong>, baz</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto"><strong>foo, <strong>bar</strong>, baz</strong></p>
+ wysiwyg: |-
+ <p><strong>foo, bar</strong>, baz</p>
+06_05__inlines__emphasis_and_strong_emphasis__040:
+ canonical: |
+ <p>foo-<strong>(bar)</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">foo-<strong>(bar)</strong></p>
+ wysiwyg: |-
+ <p>foo-<strong>(bar)</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__041:
+ canonical: |
+ <p>**foo bar **</p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">**foo bar **</p>
+ wysiwyg: |-
+ <p>**foo bar **</p>
+06_05__inlines__emphasis_and_strong_emphasis__042:
+ canonical: |
+ <p>**(**foo)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">**(**foo)</p>
+ wysiwyg: |-
+ <p>**(**foo)</p>
+06_05__inlines__emphasis_and_strong_emphasis__043:
+ canonical: |
+ <p><em>(<strong>foo</strong>)</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><em>(<strong>foo</strong>)</em></p>
+ wysiwyg: |-
+ <p><em>(</em><strong><em>foo</em></strong><em>)</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__044:
+ canonical: |
+ <p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
+ <em>Asclepias physocarpa</em>)</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-2:25" dir="auto"><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
+ <em>Asclepias physocarpa</em>)</strong></p>
+ wysiwyg: |-
+ <p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
+ <em>Asclepias physocarpa</em>)</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__045:
+ canonical: |
+ <p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto"><strong>foo "<em>bar</em>" foo</strong></p>
+ wysiwyg: |-
+ <p><strong>foo "<em>bar</em>" foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__046:
+ canonical: |
+ <p><strong>foo</strong>bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><strong>foo</strong>bar</p>
+ wysiwyg: |-
+ <p><strong>foo</strong>bar</p>
+06_05__inlines__emphasis_and_strong_emphasis__047:
+ canonical: |
+ <p>__foo bar __</p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">__foo bar __</p>
+ wysiwyg: |-
+ <p>__foo bar __</p>
+06_05__inlines__emphasis_and_strong_emphasis__048:
+ canonical: |
+ <p>__(__foo)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">__(__foo)</p>
+ wysiwyg: |-
+ <p>__(__foo)</p>
+06_05__inlines__emphasis_and_strong_emphasis__049:
+ canonical: |
+ <p><em>(<strong>foo</strong>)</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><em>(<strong>foo</strong>)</em></p>
+ wysiwyg: |-
+ <p><em>(</em><strong><em>foo</em></strong><em>)</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__050:
+ canonical: |
+ <p>__foo__bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">__foo__bar</p>
+ wysiwyg: |-
+ <p>__foo__bar</p>
+06_05__inlines__emphasis_and_strong_emphasis__051:
+ canonical: |
+ <p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+ static: |-
+ <p data-sourcepos="1:1-1:40" dir="auto">__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+ wysiwyg: |-
+ <p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+06_05__inlines__emphasis_and_strong_emphasis__052:
+ canonical: |
+ <p><strong>foo__bar__baz</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><strong>foo__bar__baz</strong></p>
+ wysiwyg: |-
+ <p><strong>foo__bar__baz</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__053:
+ canonical: |
+ <p><strong>(bar)</strong>.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><strong>(bar)</strong>.</p>
+ wysiwyg: |-
+ <p><strong>(bar)</strong>.</p>
+06_05__inlines__emphasis_and_strong_emphasis__054:
+ canonical: |
+ <p><em>foo <a href="/url">bar</a></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><em>foo <a href="/url">bar</a></em></p>
+ wysiwyg: |-
+ <p><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
+06_05__inlines__emphasis_and_strong_emphasis__055:
+ canonical: |
+ <p><em>foo
+ bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><em>foo
+ bar</em></p>
+ wysiwyg: |-
+ <p><em>foo
+ bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__056:
+ canonical: |
+ <p><em>foo <strong>bar</strong> baz</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><em>foo <strong>bar</strong> baz</em></p>
+ wysiwyg: |-
+ <p><em>foo </em><strong><em>bar</em></strong><em> baz</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__057:
+ canonical: |
+ <p><em>foo <em>bar</em> baz</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><em>foo <em>bar</em> baz</em></p>
+ wysiwyg: |-
+ <p><em>foo bar</em> baz</p>
+06_05__inlines__emphasis_and_strong_emphasis__058:
+ canonical: |
+ <p><em><em>foo</em> bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><em><em>foo</em> bar</em></p>
+ wysiwyg: |-
+ <p><em>foo</em> bar</p>
+06_05__inlines__emphasis_and_strong_emphasis__059:
+ canonical: |
+ <p><em>foo <em>bar</em></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><em>foo <em>bar</em></em></p>
+ wysiwyg: |-
+ <p><em>foo bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__060:
+ canonical: |
+ <p><em>foo <strong>bar</strong> baz</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><em>foo <strong>bar</strong> baz</em></p>
+ wysiwyg: |-
+ <p><em>foo </em><strong><em>bar</em></strong><em> baz</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__061:
+ canonical: |
+ <p><em>foo<strong>bar</strong>baz</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><em>foo<strong>bar</strong>baz</em></p>
+ wysiwyg: |-
+ <p><em>foo</em><strong><em>bar</em></strong><em>baz</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__062:
+ canonical: |
+ <p><em>foo**bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><em>foo**bar</em></p>
+ wysiwyg: |-
+ <p><em>foo**bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__063:
+ canonical: |
+ <p><em><strong>foo</strong> bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><em><strong>foo</strong> bar</em></p>
+ wysiwyg: |-
+ <p><strong><em>foo</em></strong><em> bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__064:
+ canonical: |
+ <p><em>foo <strong>bar</strong></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><em>foo <strong>bar</strong></em></p>
+ wysiwyg: |-
+ <p><em>foo </em><strong><em>bar</em></strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__065:
+ canonical: |
+ <p><em>foo<strong>bar</strong></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto"><em>foo<strong>bar</strong></em></p>
+ wysiwyg: |-
+ <p><em>foo</em><strong><em>bar</em></strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__066:
+ canonical: |
+ <p>foo<em><strong>bar</strong></em>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">foo<em><strong>bar</strong></em>baz</p>
+ wysiwyg: |-
+ <p>foo<strong><em>bar</em></strong>baz</p>
+06_05__inlines__emphasis_and_strong_emphasis__067:
+ canonical: |
+ <p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto">foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
+ wysiwyg: |-
+ <p>foo<strong>bar</strong>***baz</p>
+06_05__inlines__emphasis_and_strong_emphasis__068:
+ canonical: |
+ <p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto"><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
+ wysiwyg: |-
+ <p><em>foo </em><strong><em>bar baz</em> bim</strong> bop</p>
+06_05__inlines__emphasis_and_strong_emphasis__069:
+ canonical: |
+ <p><em>foo <a href="/url"><em>bar</em></a></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto"><em>foo <a href="/url"><em>bar</em></a></em></p>
+ wysiwyg: |-
+ <p><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
+06_05__inlines__emphasis_and_strong_emphasis__070:
+ canonical: |
+ <p>** is not an empty emphasis</p>
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto">** is not an empty emphasis</p>
+ wysiwyg: |-
+ <p>** is not an empty emphasis</p>
+06_05__inlines__emphasis_and_strong_emphasis__071:
+ canonical: |
+ <p>**** is not an empty strong emphasis</p>
+ static: |-
+ <p data-sourcepos="1:1-1:36" dir="auto">**** is not an empty strong emphasis</p>
+ wysiwyg: |-
+ <p>**** is not an empty strong emphasis</p>
+06_05__inlines__emphasis_and_strong_emphasis__072:
+ canonical: |
+ <p><strong>foo <a href="/url">bar</a></strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto"><strong>foo <a href="/url">bar</a></strong></p>
+ wysiwyg: |-
+ <p><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><strong>bar</strong></a></p>
+06_05__inlines__emphasis_and_strong_emphasis__073:
+ canonical: |
+ <p><strong>foo
+ bar</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto"><strong>foo
+ bar</strong></p>
+ wysiwyg: |-
+ <p><strong>foo
+ bar</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__074:
+ canonical: |
+ <p><strong>foo <em>bar</em> baz</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><strong>foo <em>bar</em> baz</strong></p>
+ wysiwyg: |-
+ <p><strong>foo <em>bar</em> baz</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__075:
+ canonical: |
+ <p><strong>foo <strong>bar</strong> baz</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto"><strong>foo <strong>bar</strong> baz</strong></p>
+ wysiwyg: |-
+ <p><strong>foo bar</strong> baz</p>
+06_05__inlines__emphasis_and_strong_emphasis__076:
+ canonical: |
+ <p><strong><strong>foo</strong> bar</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><strong><strong>foo</strong> bar</strong></p>
+ wysiwyg: |-
+ <p><strong>foo</strong> bar</p>
+06_05__inlines__emphasis_and_strong_emphasis__077:
+ canonical: |
+ <p><strong>foo <strong>bar</strong></strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><strong>foo <strong>bar</strong></strong></p>
+ wysiwyg: |-
+ <p><strong>foo bar</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__078:
+ canonical: |
+ <p><strong>foo <em>bar</em> baz</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><strong>foo <em>bar</em> baz</strong></p>
+ wysiwyg: |-
+ <p><strong>foo <em>bar</em> baz</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__079:
+ canonical: |
+ <p><strong>foo<em>bar</em>baz</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><strong>foo<em>bar</em>baz</strong></p>
+ wysiwyg: |-
+ <p><strong>foo<em>bar</em>baz</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__080:
+ canonical: |
+ <p><strong><em>foo</em> bar</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><strong><em>foo</em> bar</strong></p>
+ wysiwyg: |-
+ <p><strong><em>foo</em> bar</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__081:
+ canonical: |
+ <p><strong>foo <em>bar</em></strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><strong>foo <em>bar</em></strong></p>
+ wysiwyg: |-
+ <p><strong>foo <em>bar</em></strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__082:
+ canonical: |
+ <p><strong>foo <em>bar <strong>baz</strong>
+ bim</em> bop</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-2:10" dir="auto"><strong>foo <em>bar <strong>baz</strong>
+ bim</em> bop</strong></p>
+ wysiwyg: |-
+ <p><strong>foo <em>bar baz</em></strong><em>
+ bim</em> bop</p>
+06_05__inlines__emphasis_and_strong_emphasis__083:
+ canonical: |
+ <p><strong>foo <a href="/url"><em>bar</em></a></strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto"><strong>foo <a href="/url"><em>bar</em></a></strong></p>
+ wysiwyg: |-
+ <p><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><strong><em>bar</em></strong></a></p>
+06_05__inlines__emphasis_and_strong_emphasis__084:
+ canonical: |
+ <p>__ is not an empty emphasis</p>
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto">__ is not an empty emphasis</p>
+ wysiwyg: |-
+ <p>__ is not an empty emphasis</p>
+06_05__inlines__emphasis_and_strong_emphasis__085:
+ canonical: |
+ <p>____ is not an empty strong emphasis</p>
+ static: |-
+ <p data-sourcepos="1:1-1:36" dir="auto">____ is not an empty strong emphasis</p>
+ wysiwyg: |-
+ <p>____ is not an empty strong emphasis</p>
+06_05__inlines__emphasis_and_strong_emphasis__086:
+ canonical: |
+ <p>foo ***</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">foo ***</p>
+ wysiwyg: |-
+ <p>foo ***</p>
+06_05__inlines__emphasis_and_strong_emphasis__087:
+ canonical: |
+ <p>foo <em>*</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">foo <em>*</em></p>
+ wysiwyg: |-
+ <p>foo <em>*</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__088:
+ canonical: |
+ <p>foo <em>_</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">foo <em>_</em></p>
+ wysiwyg: |-
+ <p>foo <em>_</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__089:
+ canonical: |
+ <p>foo *****</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">foo *****</p>
+ wysiwyg: |-
+ <p>foo *****</p>
+06_05__inlines__emphasis_and_strong_emphasis__090:
+ canonical: |
+ <p>foo <strong>*</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">foo <strong>*</strong></p>
+ wysiwyg: |-
+ <p>foo <strong>*</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__091:
+ canonical: |
+ <p>foo <strong>_</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">foo <strong>_</strong></p>
+ wysiwyg: |-
+ <p>foo <strong>_</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__092:
+ canonical: |
+ <p>*<em>foo</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">*<em>foo</em></p>
+ wysiwyg: |-
+ <p>*<em>foo</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__093:
+ canonical: |
+ <p><em>foo</em>*</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto"><em>foo</em>*</p>
+ wysiwyg: |-
+ <p><em>foo</em>*</p>
+06_05__inlines__emphasis_and_strong_emphasis__094:
+ canonical: |
+ <p>*<strong>foo</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">*<strong>foo</strong></p>
+ wysiwyg: |-
+ <p>*<strong>foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__095:
+ canonical: |
+ <p>***<em>foo</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">***<em>foo</em></p>
+ wysiwyg: |-
+ <p>***<em>foo</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__096:
+ canonical: |
+ <p><strong>foo</strong>*</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><strong>foo</strong>*</p>
+ wysiwyg: |-
+ <p><strong>foo</strong>*</p>
+06_05__inlines__emphasis_and_strong_emphasis__097:
+ canonical: |
+ <p><em>foo</em>***</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>***</p>
+ wysiwyg: |-
+ <p><em>foo</em>***</p>
+06_05__inlines__emphasis_and_strong_emphasis__098:
+ canonical: |
+ <p>foo ___</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">foo ___</p>
+ wysiwyg: |-
+ <p>foo ___</p>
+06_05__inlines__emphasis_and_strong_emphasis__099:
+ canonical: |
+ <p>foo <em>_</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">foo <em>_</em></p>
+ wysiwyg: |-
+ <p>foo <em>_</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__100:
+ canonical: |
+ <p>foo <em>*</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">foo <em>*</em></p>
+ wysiwyg: |-
+ <p>foo <em>*</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__101:
+ canonical: |
+ <p>foo _____</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">foo _____</p>
+ wysiwyg: |-
+ <p>foo _____</p>
+06_05__inlines__emphasis_and_strong_emphasis__102:
+ canonical: |
+ <p>foo <strong>_</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto">foo <strong>_</strong></p>
+ wysiwyg: |-
+ <p>foo <strong>_</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__103:
+ canonical: |
+ <p>foo <strong>*</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">foo <strong>*</strong></p>
+ wysiwyg: |-
+ <p>foo <strong>*</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__104:
+ canonical: |
+ <p>_<em>foo</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">_<em>foo</em></p>
+ wysiwyg: |-
+ <p>_<em>foo</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__105:
+ canonical: |
+ <p><em>foo</em>_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto"><em>foo</em>_</p>
+ wysiwyg: |-
+ <p><em>foo</em>_</p>
+06_05__inlines__emphasis_and_strong_emphasis__106:
+ canonical: |
+ <p>_<strong>foo</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">_<strong>foo</strong></p>
+ wysiwyg: |-
+ <p>_<strong>foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__107:
+ canonical: |
+ <p>___<em>foo</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">___<em>foo</em></p>
+ wysiwyg: |-
+ <p>___<em>foo</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__108:
+ canonical: |
+ <p><strong>foo</strong>_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><strong>foo</strong>_</p>
+ wysiwyg: |-
+ <p><strong>foo</strong>_</p>
+06_05__inlines__emphasis_and_strong_emphasis__109:
+ canonical: |
+ <p><em>foo</em>___</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>___</p>
+ wysiwyg: |-
+ <p><em>foo</em>___</p>
+06_05__inlines__emphasis_and_strong_emphasis__110:
+ canonical: |
+ <p><strong>foo</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><strong>foo</strong></p>
+ wysiwyg: |-
+ <p><strong>foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__111:
+ canonical: |
+ <p><em><em>foo</em></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><em><em>foo</em></em></p>
+ wysiwyg: |-
+ <p><em>foo</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__112:
+ canonical: |
+ <p><strong>foo</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><strong>foo</strong></p>
+ wysiwyg: |-
+ <p><strong>foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__113:
+ canonical: |
+ <p><em><em>foo</em></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><em><em>foo</em></em></p>
+ wysiwyg: |-
+ <p><em>foo</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__114:
+ canonical: |
+ <p><strong><strong>foo</strong></strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><strong><strong>foo</strong></strong></p>
+ wysiwyg: |-
+ <p><strong>foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__115:
+ canonical: |
+ <p><strong><strong>foo</strong></strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><strong><strong>foo</strong></strong></p>
+ wysiwyg: |-
+ <p><strong>foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__116:
+ canonical: |
+ <p><strong><strong><strong>foo</strong></strong></strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><strong><strong><strong>foo</strong></strong></strong></p>
+ wysiwyg: |-
+ <p><strong>foo</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__117:
+ canonical: |
+ <p><em><strong>foo</strong></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><em><strong>foo</strong></em></p>
+ wysiwyg: |-
+ <p><strong><em>foo</em></strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__118:
+ canonical: |
+ <p><em><strong><strong>foo</strong></strong></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><em><strong><strong>foo</strong></strong></em></p>
+ wysiwyg: |-
+ <p><strong><em>foo</em></strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__119:
+ canonical: |
+ <p><em>foo _bar</em> baz_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><em>foo _bar</em> baz_</p>
+ wysiwyg: |-
+ <p><em>foo _bar</em> baz_</p>
+06_05__inlines__emphasis_and_strong_emphasis__120:
+ canonical: |
+ <p><em>foo <strong>bar *baz bim</strong> bam</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:26" dir="auto"><em>foo <strong>bar *baz bim</strong> bam</em></p>
+ wysiwyg: |-
+ <p><em>foo </em><strong><em>bar *baz bim</em></strong><em> bam</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__121:
+ canonical: |
+ <p>**foo <strong>bar baz</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">**foo <strong>bar baz</strong></p>
+ wysiwyg: |-
+ <p>**foo <strong>bar baz</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__122:
+ canonical: |
+ <p>*foo <em>bar baz</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:14" dir="auto">*foo <em>bar baz</em></p>
+ wysiwyg: |-
+ <p>*foo <em>bar baz</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__123:
+ canonical: |
+ <p>*<a href="/url">bar*</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">*<a href="/url">bar*</a></p>
+ wysiwyg: |-
+ <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar*</a></p>
+06_05__inlines__emphasis_and_strong_emphasis__124:
+ canonical: |
+ <p>_foo <a href="/url">bar_</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">_foo <a href="/url">bar_</a></p>
+ wysiwyg: |-
+ <p>_foo <a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar_</a></p>
+06_05__inlines__emphasis_and_strong_emphasis__125:
+ canonical: |
+ <p>*<img src="foo" title="*"/></p>
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto">*<a class="no-attachment-icon" href="foo" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" title="*" decoding="async" class="lazy" data-src="foo"></a></p>
+ wysiwyg: |-
+ <p>*<img src="foo" title="*"></p>
+06_05__inlines__emphasis_and_strong_emphasis__126:
+ canonical: |
+ <p>**<a href="**"></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">**<a href="**"></a></p>
+ wysiwyg: |-
+ <p>**</p>
+06_05__inlines__emphasis_and_strong_emphasis__127:
+ canonical: |
+ <p>__<a href="__"></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">__<a href="__"></a></p>
+ wysiwyg: |-
+ <p>__</p>
+06_05__inlines__emphasis_and_strong_emphasis__128:
+ canonical: |
+ <p><em>a <code>*</code></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><em>a <code>*</code></em></p>
+ wysiwyg: |-
+ <p><em>a <code>*</code></em></p>
+06_05__inlines__emphasis_and_strong_emphasis__129:
+ canonical: |
+ <p><em>a <code>_</code></em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><em>a <code>_</code></em></p>
+ wysiwyg: |-
+ <p><em>a <code>_</code></em></p>
+06_05__inlines__emphasis_and_strong_emphasis__130:
+ canonical: |
+ <p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:25" dir="auto">**a<a href="http://foo.bar/?q=**" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar/?q=**</a></p>
+ wysiwyg: |-
+ <p>**a<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
+06_05__inlines__emphasis_and_strong_emphasis__131:
+ canonical: |
+ <p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:25" dir="auto">__a<a href="http://foo.bar/?q=__" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar/?q=__</a></p>
+ wysiwyg: |-
+ <p>__a<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
+06_06__inlines__strikethrough_extension__001:
+ canonical: |
+ <p><del>Hi</del> Hello, world!</p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto"><del>Hi</del> Hello, world!</p>
+ wysiwyg: |-
+ <p><s>Hi</s> Hello, world!</p>
+06_06__inlines__strikethrough_extension__002:
+ canonical: |
+ <p>This ~~has a</p>
+ <p>new paragraph~~.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">This ~~has a</p>
+ <p data-sourcepos="3:1-3:16" dir="auto">new paragraph~~.</p>
+ wysiwyg: |-
+ <p>This ~~has a</p>
+ <p>new paragraph~~.</p>
+06_07__inlines__links__001:
+ canonical: |
+ <p><a href="/uri" title="title">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto"><a href="/uri" title="title">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
+06_07__inlines__links__002:
+ canonical: |
+ <p><a href="/uri">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto"><a href="/uri">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link</a></p>
+06_07__inlines__links__003:
+ canonical: |
+ <p><a href="">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><a href="">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
+06_07__inlines__links__004:
+ canonical: |
+ <p><a href="">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><a href="">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
+06_07__inlines__links__005:
+ canonical: |
+ <p>[link](/my uri)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><a href="/my%20uri">link</a></p>
+ wysiwyg: |-
+ <p>[link](/my uri)</p>
+06_07__inlines__links__006:
+ canonical: |
+ <p><a href="/my%20uri">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><a href="/my%20uri">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/my%20uri">link</a></p>
+06_07__inlines__links__007:
+ canonical: |
+ <p>[link](foo
+ bar)</p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto">[link](foo
+ bar)</p>
+ wysiwyg: |-
+ <p>[link](foo
+ bar)</p>
+06_07__inlines__links__008:
+ canonical: |
+ <p>[link](<foo
+ bar>)</p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto">[link]()</p>
+ wysiwyg: |-
+ <p>[link](</p>
+06_07__inlines__links__009:
+ canonical: |
+ <p><a href="b)c">a</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><a href="b)c">a</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="b)c">a</a></p>
+06_07__inlines__links__010:
+ canonical: |
+ <p>[link](&lt;foo&gt;)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:14" dir="auto"><a href="%3Cfoo%3E">link</a></p>
+ wysiwyg: |-
+ <p>[link](&lt;foo&gt;)</p>
+06_07__inlines__links__011:
+ canonical: |
+ <p>[a](&lt;b)c
+ [a](&lt;b)c&gt;
+ [a](<b>c)</p>
+ static: |-
+ <p data-sourcepos="1:1-3:9" dir="auto"><a href="%3Cb">a</a>c
+ <a href="%3Cb">a</a>c&gt;
+ [a](<b>c)</b></p>
+ wysiwyg: |-
+ <p>[a](&lt;b)c
+ [a](&lt;b)c&gt;
+ [a](<strong>c)</strong></p>
+06_07__inlines__links__012:
+ canonical: |
+ <p><a href="(foo)">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><a href="(foo)">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="(foo)">link</a></p>
+06_07__inlines__links__013:
+ canonical: |
+ <p><a href="foo(and(bar))">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto"><a href="foo(and(bar))">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar))">link</a></p>
+06_07__inlines__links__014:
+ canonical: |
+ <p><a href="foo(and(bar)">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto"><a href="foo(and(bar)">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
+06_07__inlines__links__015:
+ canonical: |
+ <p><a href="foo(and(bar)">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:22" dir="auto"><a href="foo(and(bar)">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
+06_07__inlines__links__016:
+ canonical: |
+ <p><a href="foo):">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><a>link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo):">link</a></p>
+06_07__inlines__links__017:
+ canonical: |
+ <p><a href="#fragment">link</a></p>
+ <p><a href="http://example.com#fragment">link</a></p>
+ <p><a href="http://example.com?foo=3#frag">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><a href="#fragment">link</a></p>
+ <p data-sourcepos="3:1-3:35" dir="auto"><a href="http://example.com#fragment" rel="nofollow noreferrer noopener" target="_blank">link</a></p>
+ <p data-sourcepos="5:1-5:37" dir="auto"><a href="http://example.com?foo=3#frag" rel="nofollow noreferrer noopener" target="_blank">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="#fragment">link</a></p>
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com#fragment">link</a></p>
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com?foo=3#frag">link</a></p>
+06_07__inlines__links__018:
+ canonical: |
+ <p><a href="foo%5Cbar">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><a href="foo%5Cbar">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo%5Cbar">link</a></p>
+06_07__inlines__links__019:
+ canonical: |
+ <p><a href="foo%20b%C3%A4">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto"><a href="foo%20b%C3%A4">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo%20b%C3%A4">link</a></p>
+06_07__inlines__links__020:
+ canonical: |
+ <p><a href="%22title%22">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><a href="%22title%22">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="%22title%22">link</a></p>
+06_07__inlines__links__021:
+ canonical: |
+ <p><a href="/url" title="title">link</a>
+ <a href="/url" title="title">link</a>
+ <a href="/url" title="title">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-3:20" dir="auto"><a href="/url" title="title">link</a>
+ <a href="/url" title="title">link</a>
+ <a href="/url" title="title">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">linklinklink</a></p>
+06_07__inlines__links__022:
+ canonical: |
+ <p><a href="/url" title="title &quot;&quot;">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:29" dir="auto"><a href="/url" title='title ""'>link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;&quot;">link</a></p>
+06_07__inlines__links__023:
+ canonical: |
+ <p><a href="/url%C2%A0%22title%22">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto"><a href="/url%C2%A0%22title%22">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url%C2%A0%22title%22">link</a></p>
+06_07__inlines__links__024:
+ canonical: |
+ <p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:32" dir="auto">[link](/url "title "and" title")</p>
+ wysiwyg: |-
+ <p>[link](/url "title "and" title")</p>
+06_07__inlines__links__025:
+ canonical: |
+ <p><a href="/url" title="title &quot;and&quot; title">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:32" dir="auto"><a href="/url" title='title "and" title'>link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;and&quot; title">link</a></p>
+06_07__inlines__links__026:
+ canonical: |
+ <p><a href="/uri" title="title">link</a></p>
+ static: |-
+ <p data-sourcepos="1:1-2:12" dir="auto"><a href="/uri" title="title">link</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
+06_07__inlines__links__027:
+ canonical: |
+ <p>[link] (/uri)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">[link] (/uri)</p>
+ wysiwyg: |-
+ <p>[link] (/uri)</p>
+06_07__inlines__links__028:
+ canonical: |
+ <p><a href="/uri">link [foo [bar]]</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto"><a href="/uri">link [foo [bar]]</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [foo [bar]]</a></p>
+06_07__inlines__links__029:
+ canonical: |
+ <p>[link] bar](/uri)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">[link] bar](/uri)</p>
+ wysiwyg: |-
+ <p>[link] bar](/uri)</p>
+06_07__inlines__links__030:
+ canonical: |
+ <p>[link <a href="/uri">bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">[link <a href="/uri">bar</a></p>
+ wysiwyg: |-
+ <p>[link <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a></p>
+06_07__inlines__links__031:
+ canonical: |
+ <p><a href="/uri">link [bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:18" dir="auto"><a href="/uri">link [bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [bar</a></p>
+06_07__inlines__links__032:
+ canonical: |
+ <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:30" dir="auto"><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link <em>foo </em><strong><em>bar<code>#</code></em></strong></a></p>
+06_07__inlines__links__033:
+ canonical: |
+ <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:25" dir="auto"><a href="/uri"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="moon" decoding="async" class="lazy" data-src="moon.jpg"></a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><img src="moon.jpg" alt="moon"></a></p>
+06_07__inlines__links__034:
+ canonical: |
+ <p>[foo <a href="/uri">bar</a>](/uri)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto">[foo <a href="/uri">bar</a>](/uri)</p>
+ wysiwyg: |-
+ <p>[foo <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a>](/uri)</p>
+06_07__inlines__links__035:
+ canonical: |
+ <p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:37" dir="auto">[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
+ wysiwyg: |-
+ <p>[foo <em>[bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><em>baz</em></a><em>](/uri)</em>](/uri)</p>
+06_07__inlines__links__036:
+ canonical: |
+ <p><img src="uri3" alt="[foo](uri2)" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:28" dir="auto"><a class="no-attachment-icon" href="uri3" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="[foo](uri2)" decoding="async" class="lazy" data-src="uri3"></a></p>
+ wysiwyg: |-
+ <p><img src="uri3" alt="[foo](uri2)"></p>
+06_07__inlines__links__037:
+ canonical: |
+ <p>*<a href="/uri">foo*</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">*<a href="/uri">foo*</a></p>
+ wysiwyg: |-
+ <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo*</a></p>
+06_07__inlines__links__038:
+ canonical: |
+ <p><a href="baz*">foo *bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:16" dir="auto"><a href="baz*">foo *bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="baz*">foo *bar</a></p>
+06_07__inlines__links__039:
+ canonical: |
+ <p><em>foo [bar</em> baz]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><em>foo [bar</em> baz]</p>
+ wysiwyg: |-
+ <p><em>foo [bar</em> baz]</p>
+06_07__inlines__links__040:
+ canonical: |
+ <p>[foo <bar attr="](baz)"></p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto">[foo </p>
+ wysiwyg: |-
+ <p>[foo </p>
+06_07__inlines__links__041:
+ canonical: |
+ <p>[foo<code>](/uri)</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">[foo<code>](/uri)</code></p>
+ wysiwyg: |-
+ <p>[foo<code>](/uri)</code></p>
+06_07__inlines__links__042:
+ canonical: |
+ <p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:39" dir="auto">[foo<a href="http://example.com/?search=%5D(uri)" rel="nofollow noreferrer noopener" target="_blank">http://example.com/?search=](uri)</a></p>
+ wysiwyg: |-
+ <p>[foo<a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
+06_07__inlines__links__043:
+ canonical: |
+ <p><a href="/url" title="title">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><a href="/url" title="title">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+06_07__inlines__links__044:
+ canonical: |
+ <p><a href="/uri">link [foo [bar]]</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto"><a href="/uri">link [foo [bar]]</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [foo [bar]]</a></p>
+06_07__inlines__links__045:
+ canonical: |
+ <p><a href="/uri">link [bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><a href="/uri">link [bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [bar</a></p>
+06_07__inlines__links__046:
+ canonical: |
+ <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:29" dir="auto"><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link <em>foo </em><strong><em>bar<code>#</code></em></strong></a></p>
+06_07__inlines__links__047:
+ canonical: |
+ <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto"><a href="/uri"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="moon" decoding="async" class="lazy" data-src="moon.jpg"></a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><img src="moon.jpg" alt="moon"></a></p>
+06_07__inlines__links__048:
+ canonical: |
+ <p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:22" dir="auto">[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
+ wysiwyg: |-
+ <p>[foo <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a>]<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">ref</a></p>
+06_07__inlines__links__049:
+ canonical: |
+ <p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto">[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
+ wysiwyg: |-
+ <p>[foo <em>bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><em>baz</em></a>]<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">ref</a></p>
+06_07__inlines__links__050:
+ canonical: |
+ <p>*<a href="/uri">foo*</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">*<a href="/uri">foo*</a></p>
+ wysiwyg: |-
+ <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo*</a></p>
+06_07__inlines__links__051:
+ canonical: |
+ <p><a href="/uri">foo *bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><a href="/uri">foo *bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo *bar</a></p>
+06_07__inlines__links__052:
+ canonical: |
+ <p>[foo <bar attr="][ref]"></p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto">[foo </p>
+ wysiwyg: |-
+ <p>[foo </p>
+06_07__inlines__links__053:
+ canonical: |
+ <p>[foo<code>][ref]</code></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">[foo<code>][ref]</code></p>
+ wysiwyg: |-
+ <p>[foo<code>][ref]</code></p>
+06_07__inlines__links__054:
+ canonical: |
+ <p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:39" dir="auto">[foo<a href="http://example.com/?search=%5D%5Bref%5D" rel="nofollow noreferrer noopener" target="_blank">http://example.com/?search=][ref]</a></p>
+ wysiwyg: |-
+ <p>[foo<a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
+06_07__inlines__links__055:
+ canonical: |
+ <p><a href="/url" title="title">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><a href="/url" title="title">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+06_07__inlines__links__056:
+ canonical: |
+ <p><a href="/url">Толпой</a> is a Russian word.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:47" dir="auto"><a href="/url">Толпой</a> is a Russian word.</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Толпой</a> is a Russian word.</p>
+06_07__inlines__links__057:
+ canonical: |
+ <p><a href="/url">Baz</a></p>
+ static: |-
+ <p data-sourcepos="4:1-4:14" dir="auto"><a href="/url">Baz</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Baz</a></p>
+06_07__inlines__links__058:
+ canonical: |
+ <p>[foo] <a href="/url" title="title">bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto">[foo] <a href="/url" title="title">bar</a></p>
+ wysiwyg: |-
+ <p>[foo] <a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">bar</a></p>
+06_07__inlines__links__059:
+ canonical: |
+ <p>[foo]
+ <a href="/url" title="title">bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto">[foo]
+ <a href="/url" title="title">bar</a></p>
+ wysiwyg: |-
+ <p>[foo]
+ <a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">bar</a></p>
+06_07__inlines__links__060:
+ canonical: |
+ <p><a href="/url1">bar</a></p>
+ static: |-
+ <p data-sourcepos="5:1-5:10" dir="auto"><a href="/url1">bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">bar</a></p>
+06_07__inlines__links__061:
+ canonical: |
+ <p>[bar][foo!]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:32" dir="auto">[bar][foo<span>!</span>]</p>
+ wysiwyg: |-
+ <p>[bar][foo!]</p>
+06_07__inlines__links__062:
+ canonical: |
+ <p>[foo][ref[]</p>
+ <p>[ref[]: /uri</p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto">[foo][ref[]</p>
+ <p data-sourcepos="3:1-3:12" dir="auto">[ref[]: /uri</p>
+ wysiwyg: |-
+ <p>[foo][ref[]</p>
+ <p>[ref[]: /uri</p>
+06_07__inlines__links__063:
+ canonical: |
+ <p>[foo][ref[bar]]</p>
+ <p>[ref[bar]]: /uri</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">[foo][ref[bar]]</p>
+ <p data-sourcepos="3:1-3:16" dir="auto">[ref[bar]]: /uri</p>
+ wysiwyg: |-
+ <p>[foo][ref[bar]]</p>
+ <p>[ref[bar]]: /uri</p>
+06_07__inlines__links__064:
+ canonical: |
+ <p>[[[foo]]]</p>
+ <p>[[[foo]]]: /url</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">[[[foo]]]</p>
+ <p data-sourcepos="3:1-3:15" dir="auto">[[[foo]]]: /url</p>
+ wysiwyg: |-
+ <p>[[[foo]]]</p>
+ <p>[[[foo]]]: /url</p>
+06_07__inlines__links__065:
+ canonical: |
+ <p><a href="/uri">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto"><a href="/uri">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo</a></p>
+06_07__inlines__links__066:
+ canonical: |
+ <p><a href="/uri">bar\</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:7" dir="auto"><a href="/uri">bar\</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar\</a></p>
+06_07__inlines__links__067:
+ canonical: |
+ <p>[]</p>
+ <p>[]: /uri</p>
+ static: |-
+ <p data-sourcepos="1:1-1:2" dir="auto">[]</p>
+ <p data-sourcepos="3:1-3:8" dir="auto">[]: /uri</p>
+ wysiwyg: |-
+ <p>[]</p>
+ <p>[]: /uri</p>
+06_07__inlines__links__068:
+ canonical: |
+ <p>[
+ ]</p>
+ <p>[
+ ]: /uri</p>
+ static: |-
+ <p data-sourcepos="1:1-2:2" dir="auto">[
+ ]</p>
+ <p data-sourcepos="4:1-5:8" dir="auto">[
+ ]: /uri</p>
+ wysiwyg: |-
+ <p>[
+ ]</p>
+ <p>[
+ ]: /uri</p>
+06_07__inlines__links__069:
+ canonical: |
+ <p><a href="/url" title="title">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><a href="/url" title="title">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+06_07__inlines__links__070:
+ canonical: |
+ <p><a href="/url" title="title"><em>foo</em> bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><a href="/url" title="title"><em>foo</em> bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a></p>
+06_07__inlines__links__071:
+ canonical: |
+ <p><a href="/url" title="title">Foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><a href="/url" title="title">Foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">Foo</a></p>
+06_07__inlines__links__072:
+ canonical: |
+ <p><a href="/url" title="title">foo</a>
+ []</p>
+ static: |-
+ <p data-sourcepos="1:1-2:2" dir="auto"><a href="/url" title="title">foo</a>
+ []</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a>
+ []</p>
+06_07__inlines__links__073:
+ canonical: |
+ <p><a href="/url" title="title">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><a href="/url" title="title">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+06_07__inlines__links__074:
+ canonical: |
+ <p><a href="/url" title="title"><em>foo</em> bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><a href="/url" title="title"><em>foo</em> bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a></p>
+06_07__inlines__links__075:
+ canonical: |
+ <p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
+ wysiwyg: |-
+ <p>[<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a>]</p>
+06_07__inlines__links__076:
+ canonical: |
+ <p>[[bar <a href="/url">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto">[[bar <a href="/url">foo</a></p>
+ wysiwyg: |-
+ <p>[[bar <a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+06_07__inlines__links__077:
+ canonical: |
+ <p><a href="/url" title="title">Foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto"><a href="/url" title="title">Foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">Foo</a></p>
+06_07__inlines__links__078:
+ canonical: |
+ <p><a href="/url">foo</a> bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><a href="/url">foo</a> bar</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a> bar</p>
+06_07__inlines__links__079:
+ canonical: |
+ <p>[foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <p>[foo]</p>
+06_07__inlines__links__080:
+ canonical: |
+ <p>*<a href="/url">foo*</a></p>
+ static: |-
+ <p data-sourcepos="3:1-3:7" dir="auto">*<a href="/url">foo*</a></p>
+ wysiwyg: |-
+ <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo*</a></p>
+06_07__inlines__links__081:
+ canonical: |
+ <p><a href="/url2">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:10" dir="auto"><a href="/url2">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url2">foo</a></p>
+06_07__inlines__links__082:
+ canonical: |
+ <p><a href="/url1">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><a href="/url1">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">foo</a></p>
+06_07__inlines__links__083:
+ canonical: |
+ <p><a href="">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto"><a href="">foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="">foo</a></p>
+06_07__inlines__links__084:
+ canonical: |
+ <p><a href="/url1">foo</a>(not a link)</p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><a href="/url1">foo</a>(not a link)</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">foo</a>(not a link)</p>
+06_07__inlines__links__085:
+ canonical: |
+ <p>[foo]<a href="/url">bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">[foo]<a href="/url">bar</a></p>
+ wysiwyg: |-
+ <p>[foo]<a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar</a></p>
+06_07__inlines__links__086:
+ canonical: |
+ <p><a href="/url2">foo</a><a href="/url1">baz</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto"><a href="/url2">foo</a><a href="/url1">baz</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url2">foo</a><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">baz</a></p>
+06_07__inlines__links__087:
+ canonical: |
+ <p>[foo]<a href="/url1">bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">[foo]<a href="/url1">bar</a></p>
+ wysiwyg: |-
+ <p>[foo]<a target="_blank" rel="noopener noreferrer nofollow" href="/url1">bar</a></p>
+06_08__inlines__images__001:
+ canonical: |
+ <p><img src="/url" alt="foo" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo" title="title"></p>
+06_08__inlines__images__002:
+ canonical: |
+ <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
+ wysiwyg: |-
+ <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
+06_08__inlines__images__003:
+ canonical: |
+ <p><img src="/url2" alt="foo bar" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:26" dir="auto"><a class="no-attachment-icon" href="/url2" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" decoding="async" class="lazy" data-src="/url2"></a></p>
+ wysiwyg: |-
+ <p><img src="/url2" alt="foo bar"></p>
+06_08__inlines__images__004:
+ canonical: |
+ <p><img src="/url2" alt="foo bar" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:25" dir="auto"><a class="no-attachment-icon" href="/url2" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" decoding="async" class="lazy" data-src="/url2"></a></p>
+ wysiwyg: |-
+ <p><img src="/url2" alt="foo bar"></p>
+06_08__inlines__images__005:
+ canonical: |
+ <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:14" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
+ wysiwyg: |-
+ <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
+06_08__inlines__images__006:
+ canonical: |
+ <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
+ wysiwyg: |-
+ <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
+06_08__inlines__images__007:
+ canonical: |
+ <p><img src="train.jpg" alt="foo" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="train.jpg"></a></p>
+ wysiwyg: |-
+ <p><img src="train.jpg" alt="foo"></p>
+06_08__inlines__images__008:
+ canonical: |
+ <p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:45" dir="auto">My <a class="no-attachment-icon" href="/path/to/train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="title" decoding="async" class="lazy" data-src="/path/to/train.jpg"></a></p>
+ wysiwyg: |-
+ <p>My <img src="/path/to/train.jpg" alt="foo bar" title="title"></p>
+06_08__inlines__images__009:
+ canonical: |
+ <p><img src="url" alt="foo" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><a class="no-attachment-icon" href="url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="url"></a></p>
+ wysiwyg: |-
+ <p><img src="url" alt="foo"></p>
+06_08__inlines__images__010:
+ canonical: |
+ <p><img src="/url" alt="" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt=""></p>
+06_08__inlines__images__011:
+ canonical: |
+ <p><img src="/url" alt="foo" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo"></p>
+06_08__inlines__images__012:
+ canonical: |
+ <p><img src="/url" alt="foo" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo"></p>
+06_08__inlines__images__013:
+ canonical: |
+ <p><img src="/url" alt="foo" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo" title="title"></p>
+06_08__inlines__images__014:
+ canonical: |
+ <p><img src="/url" alt="foo bar" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:14" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo bar" title="title"></p>
+06_08__inlines__images__015:
+ canonical: |
+ <p><img src="/url" alt="Foo" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="Foo" title="title"></p>
+06_08__inlines__images__016:
+ canonical: |
+ <p><img src="/url" alt="foo" title="title" />
+ []</p>
+ static: |-
+ <p data-sourcepos="1:1-2:2" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a>
+ []</p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo" title="title">
+ []</p>
+06_08__inlines__images__017:
+ canonical: |
+ <p><img src="/url" alt="foo" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo" title="title"></p>
+06_08__inlines__images__018:
+ canonical: |
+ <p><img src="/url" alt="foo bar" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo bar" title="title"></p>
+06_08__inlines__images__019:
+ canonical: |
+ <p>![[foo]]</p>
+ <p>[[foo]]: /url &quot;title&quot;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">![[foo]]</p>
+ <p data-sourcepos="3:1-3:21" dir="auto">[[foo]]: /url "title"</p>
+ wysiwyg: |-
+ <p>![[foo]]</p>
+ <p>[[foo]]: /url "title"</p>
+06_08__inlines__images__020:
+ canonical: |
+ <p><img src="/url" alt="Foo" title="title" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
+ wysiwyg: |-
+ <p><img src="/url" alt="Foo" title="title"></p>
+06_08__inlines__images__021:
+ canonical: |
+ <p>![foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">![foo]</p>
+ wysiwyg: |-
+ <p>![foo]</p>
+06_08__inlines__images__022:
+ canonical: |
+ <p>!<a href="/url" title="title">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto"><span>!</span><a href="/url" title="title">foo</a></p>
+ wysiwyg: |-
+ <p>!<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+06_09__inlines__autolinks__001:
+ canonical: |
+ <p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto"><a href="http://foo.bar.baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.baz</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.baz">http://foo.bar.baz</a></p>
+06_09__inlines__autolinks__002:
+ canonical: |
+ <p><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:47" dir="auto"><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
+06_09__inlines__autolinks__003:
+ canonical: |
+ <p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto"><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
+06_09__inlines__autolinks__004:
+ canonical: |
+ <p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto"><a href="mailto:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
+06_09__inlines__autolinks__005:
+ canonical: |
+ <p><a href="a+b+c:d">a+b+c:d</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><a href="a+b+c:d">a+b+c:d</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="a+b+c:d">a+b+c:d</a></p>
+06_09__inlines__autolinks__006:
+ canonical: |
+ <p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:26" dir="auto"><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
+06_09__inlines__autolinks__007:
+ canonical: |
+ <p><a href="http://../">http://../</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto"><a href="http://../" rel="nofollow noreferrer noopener" target="_blank">http://../</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://../">http://../</a></p>
+06_09__inlines__autolinks__008:
+ canonical: |
+ <p><a href="localhost:5001/foo">localhost:5001/foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:20" dir="auto"><a href="localhost:5001/foo">localhost:5001/foo</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="localhost:5001/foo">localhost:5001/foo</a></p>
+06_09__inlines__autolinks__009:
+ canonical: |
+ <p>&lt;http://foo.bar/baz bim&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto">&lt;<a href="http://foo.bar/baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar/baz</a> bim&gt;</p>
+ wysiwyg: |-
+ <p>&lt;<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/baz">http://foo.bar/baz</a> bim&gt;</p>
+06_09__inlines__autolinks__010:
+ canonical: |
+ <p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto"><a href="http://example.com/%5C%5B%5C" rel="nofollow noreferrer noopener" target="_blank">http://example.com/\[\</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
+06_09__inlines__autolinks__011:
+ canonical: |
+ <p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto"><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+06_09__inlines__autolinks__012:
+ canonical: |
+ <p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:30" dir="auto"><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
+06_09__inlines__autolinks__013:
+ canonical: |
+ <p>&lt;foo+@bar.example.com&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto">&lt;<a href="mailto:foo+@bar.example.com">foo+@bar.example.com</a>&gt;</p>
+ wysiwyg: |-
+ <p>&lt;<a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo+@bar.example.com">foo+@bar.example.com</a>&gt;</p>
+06_09__inlines__autolinks__014:
+ canonical: |
+ <p>&lt;&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:2" dir="auto">&lt;&gt;</p>
+ wysiwyg: |-
+ <p>&lt;&gt;</p>
+06_09__inlines__autolinks__015:
+ canonical: |
+ <p>&lt; http://foo.bar &gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:18" dir="auto">&lt; <a href="http://foo.bar" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar</a> &gt;</p>
+ wysiwyg: |-
+ <p>&lt; <a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar">http://foo.bar</a> &gt;</p>
+06_09__inlines__autolinks__016:
+ canonical: |
+ <p>&lt;m:abc&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">&lt;m:abc&gt;</p>
+ wysiwyg: |-
+ <p>&lt;m:abc&gt;</p>
+06_09__inlines__autolinks__017:
+ canonical: |
+ <p>&lt;foo.bar.baz&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">&lt;foo.bar.baz&gt;</p>
+ wysiwyg: |-
+ <p>&lt;foo.bar.baz&gt;</p>
+06_09__inlines__autolinks__018:
+ canonical: |
+ <p>http://example.com</p>
+ static: |-
+ <p data-sourcepos="1:1-1:18" dir="auto"><a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com">http://example.com</a></p>
+06_09__inlines__autolinks__019:
+ canonical: |
+ <p>foo@bar.example.com</p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto"><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+06_10__inlines__autolinks_extension__001:
+ canonical: |
+ <p><a href="http://www.commonmark.org">www.commonmark.org</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:18" dir="auto"><a href="http://www.commonmark.org" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a></p>
+06_10__inlines__autolinks_extension__002:
+ canonical: |
+ <p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:51" dir="auto">Visit <a href="http://www.commonmark.org/help" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/help</a> for more information.</p>
+ wysiwyg: |-
+ <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
+06_10__inlines__autolinks_extension__003:
+ canonical: |
+ <p>Visit <a href="http://www.commonmark.org">www.commonmark.org</a>.</p>
+ <p>Visit <a href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:25" dir="auto">Visit <a href="http://www.commonmark.org" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org</a>.</p>
+ <p data-sourcepos="3:1-3:29" dir="auto">Visit <a href="http://www.commonmark.org/a.b" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/a.b</a>.</p>
+ wysiwyg: |-
+ <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a>.</p>
+ <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p>
+06_10__inlines__autolinks_extension__004:
+ canonical: |
+ <p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
+ <p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p>
+ <p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p>
+ <p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:41" dir="auto"><a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a></p>
+ <p data-sourcepos="3:1-3:43" dir="auto"><a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a>))</p>
+ <p data-sourcepos="5:1-5:43" dir="auto">(<a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a>)</p>
+ <p data-sourcepos="7:1-7:42" dir="auto">(<a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p>
+ <p>(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p>
+ <p>(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
+06_10__inlines__autolinks_extension__005:
+ canonical: |
+ <p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:38" dir="auto"><a href="http://www.google.com/search?q=(business))+ok" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=(business))+ok</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
+06_10__inlines__autolinks_extension__006:
+ canonical: |
+ <p><a href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
+ <p><a href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&amp;hl;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:40" dir="auto"><a href="http://www.google.com/search?q=commonmark&amp;hl=en" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=commonmark&amp;hl=en</a></p>
+ <p data-sourcepos="3:1-3:38" dir="auto"><a href="http://www.google.com/search?q=commonmark" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=commonmark</a>&amp;hl;</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&amp;hl;</p>
+06_10__inlines__autolinks_extension__007:
+ canonical: |
+ <p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
+ static: |-
+ <p data-sourcepos="1:1-1:24" dir="auto"><a href="http://www.commonmark.org/he" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/he</a>&lt;lp</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
+06_10__inlines__autolinks_extension__008:
+ canonical: |
+ <p><a href="http://commonmark.org">http://commonmark.org</a></p>
+ <p>(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
+ <p>Anonymous FTP is available at <a href="ftp://foo.bar.baz">ftp://foo.bar.baz</a>.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto"><a href="http://commonmark.org" rel="nofollow noreferrer noopener" target="_blank">http://commonmark.org</a></p>
+ <p data-sourcepos="3:1-3:63" dir="auto">(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
+ <p data-sourcepos="5:1-5:48" dir="auto">Anonymous FTP is available at <a href="ftp://foo.bar.baz/">ftp://foo.bar.baz</a>.</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://commonmark.org">http://commonmark.org</a></p>
+ <p>(Visit <a target="_blank" rel="noopener noreferrer nofollow" href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
+ <p>Anonymous FTP is available at ftp://foo.bar.baz.</p>
+06_10__inlines__autolinks_extension__009:
+ canonical: |
+ <p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.baz">foo@bar.baz</a></p>
+06_10__inlines__autolinks_extension__010:
+ canonical: |
+ <p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:66" dir="auto">hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
+ wysiwyg: |-
+ <p>hello@mail+xyz.example isn't valid, but <a target="_blank" rel="noopener noreferrer nofollow" href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
+06_10__inlines__autolinks_extension__011:
+ canonical: |
+ <p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
+ <p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
+ <p>a.b-c_d@a.b-</p>
+ <p>a.b-c_d@a.b_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
+ <p data-sourcepos="3:1-3:12" dir="auto"><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
+ <p data-sourcepos="5:1-5:12" dir="auto">a.b-c_d@a.b-</p>
+ <p data-sourcepos="7:1-7:12" dir="auto">a.b-c_d@a.b_</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
+ <p>a.b-c_d@a.b-</p>
+ <p>a.b-c_d@a.b_</p>
+06_11__inlines__raw_html__001:
+ canonical: |
+ <p><a><bab><c2c></p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto"><a></a></p>
+ wysiwyg: |-
+ <p></p>
+06_11__inlines__raw_html__002:
+ canonical: |
+ <p><a/><b2/></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><a></a></p>
+ wysiwyg: |-
+ <p></p>
+06_11__inlines__raw_html__003:
+ canonical: |
+ <p><a /><b2
+ data="foo" ></p>
+ static: |-
+ <p data-sourcepos="1:1-2:12" dir="auto"><a></a></p>
+ wysiwyg: |-
+ <p></p>
+06_11__inlines__raw_html__004:
+ canonical: |
+ <p><a foo="bar" bam = 'baz <em>"</em>'
+ _boolean zoop:33=zoop:33 /></p>
+ static: |-
+ <p data-sourcepos="1:1-2:27" dir="auto"><a></a></p>
+ wysiwyg: |-
+ <p></p>
+06_11__inlines__raw_html__005:
+ canonical: |
+ <p>Foo <responsive-image src="foo.jpg" /></p>
+ static: |-
+ <p data-sourcepos="1:1-1:38" dir="auto">Foo </p>
+ wysiwyg: |-
+ <p>Foo </p>
+06_11__inlines__raw_html__006:
+ canonical: |
+ <p>&lt;33&gt; &lt;__&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">&lt;33&gt; &lt;__&gt;</p>
+ wysiwyg: |-
+ <p>&lt;33&gt; &lt;__&gt;</p>
+06_11__inlines__raw_html__007:
+ canonical: |
+ <p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">&lt;a h*#ref="hi"&gt;</p>
+ wysiwyg: |-
+ <p>&lt;a h*#ref="hi"&gt;</p>
+06_11__inlines__raw_html__008:
+ canonical: |
+ <p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:26" dir="auto">&lt;a href="hi'&gt; &lt;a href=hi'&gt;</p>
+ wysiwyg: |-
+ <p>&lt;a href="hi'&gt; &lt;a href=hi'&gt;</p>
+06_11__inlines__raw_html__009:
+ canonical: |
+ <p>&lt; a&gt;&lt;
+ foo&gt;&lt;bar/ &gt;
+ &lt;foo bar=baz
+ bim!bop /&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-4:10" dir="auto">&lt; a&gt;&lt;
+ foo&gt;&lt;bar/ &gt;
+ &lt;foo bar=baz
+ bim!bop /&gt;</p>
+ wysiwyg: |-
+ <p>&lt; a&gt;&lt;
+ foo&gt;&lt;bar/ &gt;
+ &lt;foo bar=baz
+ bim!bop /&gt;</p>
+06_11__inlines__raw_html__010:
+ canonical: |
+ <p>&lt;a href='bar'title=title&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:25" dir="auto">&lt;a href='bar'title=title&gt;</p>
+ wysiwyg: |-
+ <p>&lt;a href='bar'title=title&gt;</p>
+06_11__inlines__raw_html__011:
+ canonical: |
+ <p></a></foo ></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"></p>
+ wysiwyg: |-
+ <p></p>
+06_11__inlines__raw_html__012:
+ canonical: |
+ <p>&lt;/a href=&quot;foo&quot;&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">&lt;/a href="foo"&gt;</p>
+ wysiwyg: |-
+ <p>&lt;/a href="foo"&gt;</p>
+06_11__inlines__raw_html__013:
+ canonical: |
+ <p>foo <!-- this is a
+ comment - with hyphen --></p>
+ static: |-
+ <p data-sourcepos="1:1-2:25" dir="auto">foo </p>
+ wysiwyg: |-
+ <p>foo </p>
+06_11__inlines__raw_html__014:
+ canonical: |
+ <p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:41" dir="auto">foo &lt;!-- not a comment -- two hyphens --&gt;</p>
+ wysiwyg: |-
+ <p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
+06_11__inlines__raw_html__015:
+ canonical: |
+ <p>foo &lt;!--&gt; foo --&gt;</p>
+ <p>foo &lt;!-- foo---&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">foo &lt;!--&gt; foo --&gt;</p>
+ <p data-sourcepos="3:1-3:16" dir="auto">foo &lt;!-- foo---&gt;</p>
+ wysiwyg: |-
+ <p>foo &lt;!--&gt; foo --&gt;</p>
+ <p>foo &lt;!-- foo---&gt;</p>
+06_11__inlines__raw_html__016:
+ canonical: |
+ <p>foo <?php echo $a; ?></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto">foo <?php echo $a; ?></p>
+ wysiwyg: |-
+ <p>foo </p>
+06_11__inlines__raw_html__017:
+ canonical: |
+ <p>foo <!ELEMENT br EMPTY></p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto">foo &lt;!ELEMENT br EMPTY&gt;</p>
+ wysiwyg: |-
+ <p>foo </p>
+06_11__inlines__raw_html__018:
+ canonical: |
+ <p>foo <![CDATA[>&<]]></p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto">foo &lt;![CDATA[&gt;&amp;&lt;]]&gt;</p>
+ wysiwyg: |-
+ <p>foo &amp;&lt;]]&gt;</p>
+06_11__inlines__raw_html__019:
+ canonical: |
+ <p>foo <a href="&ouml;"></p>
+ static: |-
+ <p data-sourcepos="1:1-1:21" dir="auto">foo <a href="%C3%B6" rel="nofollow noreferrer noopener" target="_blank"></a></p>
+ wysiwyg: |-
+ <p>foo </p>
+06_11__inlines__raw_html__020:
+ canonical: |
+ <p>foo <a href="\*"></p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">foo <a href="%5C*" rel="nofollow noreferrer noopener" target="_blank"></a></p>
+ wysiwyg: |-
+ <p>foo </p>
+06_11__inlines__raw_html__021:
+ canonical: |
+ <p>&lt;a href=&quot;&quot;&quot;&gt;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">&lt;a href="""&gt;</p>
+ wysiwyg: |-
+ <p>&lt;a href="""&gt;</p>
+06_12__inlines__disallowed_raw_html_extension__001:
+ canonical: |
+ <p><strong> &lt;title> &lt;style> <em></p>
+ <blockquote>
+ &lt;xmp> is disallowed. &lt;XMP> is also disallowed.
+ </blockquote>
+ static: |-
+ <p data-sourcepos="1:1-1:29" dir="auto"><strong> &lt;em&gt;&lt;/p&gt;
+ &lt;blockquote&gt;
+ &lt;xmp&gt; is disallowed. &lt;XMP&gt; is also disallowed.
+ &lt;/blockquote&gt;</strong></p>
+ wysiwyg: |-
+ <p></p>
+ <blockquote multiline="false"><p></p></blockquote>
+06_13__inlines__hard_line_breaks__001:
+ canonical: |
+ <p>foo<br />
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
+ baz</p>
+ wysiwyg: |-
+ <p>foo<br>
+ baz</p>
+06_13__inlines__hard_line_breaks__002:
+ canonical: |
+ <p>foo<br />
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
+ baz</p>
+ wysiwyg: |-
+ <p>foo<br>
+ baz</p>
+06_13__inlines__hard_line_breaks__003:
+ canonical: |
+ <p>foo<br />
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
+ baz</p>
+ wysiwyg: |-
+ <p>foo<br>
+ baz</p>
+06_13__inlines__hard_line_breaks__004:
+ canonical: |
+ <p>foo<br />
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:8" dir="auto">foo<br>
+ bar</p>
+ wysiwyg: |-
+ <p>foo<br>
+ bar</p>
+06_13__inlines__hard_line_breaks__005:
+ canonical: |
+ <p>foo<br />
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:8" dir="auto">foo<br>
+ bar</p>
+ wysiwyg: |-
+ <p>foo<br>
+ bar</p>
+06_13__inlines__hard_line_breaks__006:
+ canonical: |
+ <p><em>foo<br />
+ bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>
+ bar</em></p>
+ wysiwyg: |-
+ <p><em>foo<br>
+ bar</em></p>
+06_13__inlines__hard_line_breaks__007:
+ canonical: |
+ <p><em>foo<br />
+ bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>
+ bar</em></p>
+ wysiwyg: |-
+ <p><em>foo<br>
+ bar</em></p>
+06_13__inlines__hard_line_breaks__008:
+ canonical: |
+ <p><code>code span</code></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto"><code>code span</code></p>
+ wysiwyg: |-
+ <p><code>code span</code></p>
+06_13__inlines__hard_line_breaks__009:
+ canonical: |
+ <p><code>code\ span</code></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto"><code>code\ span</code></p>
+ wysiwyg: |-
+ <p><code>code\ span</code></p>
+06_13__inlines__hard_line_breaks__010:
+ canonical: "<p><a href=\"foo \nbar\"></p>\n"
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto"><a href="foo%20%20%0Abar" rel="nofollow noreferrer noopener" target="_blank"></a></p>
+ wysiwyg: |-
+ <p></p>
+06_13__inlines__hard_line_breaks__011:
+ canonical: |
+ <p><a href="foo\
+ bar"></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto"><a href="foo%5C%0Abar" rel="nofollow noreferrer noopener" target="_blank"></a></p>
+ wysiwyg: |-
+ <p></p>
+06_13__inlines__hard_line_breaks__012:
+ canonical: |
+ <p>foo\</p>
+ static: |-
+ <p data-sourcepos="1:1-1:4" dir="auto">foo\</p>
+ wysiwyg: |-
+ <p>foo\</p>
+06_13__inlines__hard_line_breaks__013:
+ canonical: |
+ <p>foo</p>
+ static: |-
+ <p data-sourcepos="1:1-1:5" dir="auto">foo</p>
+ wysiwyg: |-
+ <p>foo</p>
+06_13__inlines__hard_line_breaks__014:
+ canonical: |
+ <h3>foo\</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:8" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo\</h3>
+ wysiwyg: |-
+ <h3>foo\</h3>
+06_13__inlines__hard_line_breaks__015:
+ canonical: |
+ <h3>foo</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:7" dir="auto">
+ <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h3>
+ wysiwyg: |-
+ <h3>foo</h3>
+06_14__inlines__soft_line_breaks__001:
+ canonical: |
+ <p>foo
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo
+ baz</p>
+ wysiwyg: |-
+ <p>foo
+ baz</p>
+06_14__inlines__soft_line_breaks__002:
+ canonical: |
+ <p>foo
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto">foo
+ baz</p>
+ wysiwyg: |-
+ <p>foo
+ baz</p>
+06_15__inlines__textual_content__001:
+ canonical: |
+ <p>hello $.;'there</p>
+ static: |-
+ <p data-sourcepos="1:1-1:15" dir="auto">hello $.;'there</p>
+ wysiwyg: |-
+ <p>hello $.;'there</p>
+06_15__inlines__textual_content__002:
+ canonical: |
+ <p>Foo χÏῆν</p>
+ static: |-
+ <p data-sourcepos="1:1-1:13" dir="auto">Foo χÏῆν</p>
+ wysiwyg: |-
+ <p>Foo χÏῆν</p>
+06_15__inlines__textual_content__003:
+ canonical: |
+ <p>Multiple spaces</p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto">Multiple spaces</p>
+ wysiwyg: |-
+ <p>Multiple spaces</p>
+07_01__gitlab_specific_markdown__footnotes__001:
+ canonical: ""
+ static: |-
+ <p data-sourcepos="1:1-1:27" dir="auto">footnote reference tag <sup class="footnote-ref"><a href="#fn-1-9034" id="fnref-1-9034" data-footnote-ref>1</a></sup></p>
+ <section data-footnotes class="footnotes">
+ <ol>
+ <li id="fn-1-9034">
+ <p data-sourcepos="3:7-3:19">footnote text <a href="#fnref-1-9034" data-footnote-backref aria-label="Back to content" class="footnote-backref"><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
+ </li>
+ </ol>
+ </section>
+ wysiwyg: |-
+ <p>footnote reference tag <sup identifier="1">1</sup></p>
+ <div node="footnoteDefinition(paragraph(&quot;footnote text&quot;))" htmlattributes="[object Object]"><p>footnote text</p></div>
diff --git a/glfm_specification/example_snapshots/markdown.yml b/glfm_specification/example_snapshots/markdown.yml
new file mode 100644
index 00000000000..de0e66f7e08
--- /dev/null
+++ b/glfm_specification/example_snapshots/markdown.yml
@@ -0,0 +1,2195 @@
+---
+02_01__preliminaries__tabs__001: "\tfoo\tbaz\t\tbim\n"
+02_01__preliminaries__tabs__002: " \tfoo\tbaz\t\tbim\n"
+02_01__preliminaries__tabs__003: " a\ta\n á½\ta\n"
+02_01__preliminaries__tabs__004: " - foo\n\n\tbar\n"
+02_01__preliminaries__tabs__005: "- foo\n\n\t\tbar\n"
+02_01__preliminaries__tabs__006: ">\t\tfoo\n"
+02_01__preliminaries__tabs__007: "-\t\tfoo\n"
+02_01__preliminaries__tabs__008: " foo\n\tbar\n"
+02_01__preliminaries__tabs__009: " - foo\n - bar\n\t - baz\n"
+02_01__preliminaries__tabs__010: "#\tFoo\n"
+02_01__preliminaries__tabs__011: "*\t*\t*\t\n"
+03_01__blocks_and_inlines__precedence__001: |
+ - `one
+ - two`
+04_01__leaf_blocks__thematic_breaks__001: |
+ ***
+ ---
+ ___
+04_01__leaf_blocks__thematic_breaks__002: |
+ +++
+04_01__leaf_blocks__thematic_breaks__003: |
+ ===
+04_01__leaf_blocks__thematic_breaks__004: |
+ --
+ **
+ __
+04_01__leaf_blocks__thematic_breaks__005: |2
+ ***
+ ***
+ ***
+04_01__leaf_blocks__thematic_breaks__006: |2
+ ***
+04_01__leaf_blocks__thematic_breaks__007: |
+ Foo
+ ***
+04_01__leaf_blocks__thematic_breaks__008: |
+ _____________________________________
+04_01__leaf_blocks__thematic_breaks__009: |2
+ - - -
+04_01__leaf_blocks__thematic_breaks__010: |2
+ ** * ** * ** * **
+04_01__leaf_blocks__thematic_breaks__011: |
+ - - - -
+04_01__leaf_blocks__thematic_breaks__012: "- - - - \n"
+04_01__leaf_blocks__thematic_breaks__013: |
+ _ _ _ _ a
+
+ a------
+
+ ---a---
+04_01__leaf_blocks__thematic_breaks__014: |2
+ *-*
+04_01__leaf_blocks__thematic_breaks__015: |
+ - foo
+ ***
+ - bar
+04_01__leaf_blocks__thematic_breaks__016: |
+ Foo
+ ***
+ bar
+04_01__leaf_blocks__thematic_breaks__017: |
+ Foo
+ ---
+ bar
+04_01__leaf_blocks__thematic_breaks__018: |
+ * Foo
+ * * *
+ * Bar
+04_01__leaf_blocks__thematic_breaks__019: |
+ - Foo
+ - * * *
+04_02__leaf_blocks__atx_headings__001: |
+ # foo
+ ## foo
+ ### foo
+ #### foo
+ ##### foo
+ ###### foo
+04_02__leaf_blocks__atx_headings__002: |
+ ####### foo
+04_02__leaf_blocks__atx_headings__003: |
+ #5 bolt
+
+ #hashtag
+04_02__leaf_blocks__atx_headings__004: |
+ \## foo
+04_02__leaf_blocks__atx_headings__005: |
+ # foo *bar* \*baz\*
+04_02__leaf_blocks__atx_headings__006: "# foo \n"
+04_02__leaf_blocks__atx_headings__007: |2
+ ### foo
+ ## foo
+ # foo
+04_02__leaf_blocks__atx_headings__008: |2
+ # foo
+04_02__leaf_blocks__atx_headings__009: |
+ foo
+ # bar
+04_02__leaf_blocks__atx_headings__010: |
+ ## foo ##
+ ### bar ###
+04_02__leaf_blocks__atx_headings__011: |
+ # foo ##################################
+ ##### foo ##
+04_02__leaf_blocks__atx_headings__012: "### foo ### \n"
+04_02__leaf_blocks__atx_headings__013: |
+ ### foo ### b
+04_02__leaf_blocks__atx_headings__014: |
+ # foo#
+04_02__leaf_blocks__atx_headings__015: |
+ ### foo \###
+ ## foo #\##
+ # foo \#
+04_02__leaf_blocks__atx_headings__016: |
+ ****
+ ## foo
+ ****
+04_02__leaf_blocks__atx_headings__017: |
+ Foo bar
+ # baz
+ Bar foo
+04_02__leaf_blocks__atx_headings__018: "## \n#\n### ###\n"
+04_03__leaf_blocks__setext_headings__001: |
+ Foo *bar*
+ =========
+
+ Foo *bar*
+ ---------
+04_03__leaf_blocks__setext_headings__002: |
+ Foo *bar
+ baz*
+ ====
+04_03__leaf_blocks__setext_headings__003: " Foo *bar\nbaz*\t\n====\n"
+04_03__leaf_blocks__setext_headings__004: |
+ Foo
+ -------------------------
+
+ Foo
+ =
+04_03__leaf_blocks__setext_headings__005: |2
+ Foo
+ ---
+
+ Foo
+ -----
+
+ Foo
+ ===
+04_03__leaf_blocks__setext_headings__006: |2
+ Foo
+ ---
+
+ Foo
+ ---
+04_03__leaf_blocks__setext_headings__007: "Foo\n ---- \n"
+04_03__leaf_blocks__setext_headings__008: |
+ Foo
+ ---
+04_03__leaf_blocks__setext_headings__009: |
+ Foo
+ = =
+
+ Foo
+ --- -
+04_03__leaf_blocks__setext_headings__010: "Foo \n-----\n"
+04_03__leaf_blocks__setext_headings__011: |
+ Foo\
+ ----
+04_03__leaf_blocks__setext_headings__012: |
+ `Foo
+ ----
+ `
+
+ <a title="a lot
+ ---
+ of dashes"/>
+04_03__leaf_blocks__setext_headings__013: |
+ > Foo
+ ---
+04_03__leaf_blocks__setext_headings__014: |
+ > foo
+ bar
+ ===
+04_03__leaf_blocks__setext_headings__015: |
+ - Foo
+ ---
+04_03__leaf_blocks__setext_headings__016: |
+ Foo
+ Bar
+ ---
+04_03__leaf_blocks__setext_headings__017: |
+ ---
+ Foo
+ ---
+ Bar
+ ---
+ Baz
+04_03__leaf_blocks__setext_headings__018: |2
+
+ ====
+04_03__leaf_blocks__setext_headings__019: |
+ ---
+ ---
+04_03__leaf_blocks__setext_headings__020: |
+ - foo
+ -----
+04_03__leaf_blocks__setext_headings__021: |2
+ foo
+ ---
+04_03__leaf_blocks__setext_headings__022: |
+ > foo
+ -----
+04_03__leaf_blocks__setext_headings__023: |
+ \> foo
+ ------
+04_03__leaf_blocks__setext_headings__024: |
+ Foo
+
+ bar
+ ---
+ baz
+04_03__leaf_blocks__setext_headings__025: |
+ Foo
+ bar
+
+ ---
+
+ baz
+04_03__leaf_blocks__setext_headings__026: |
+ Foo
+ bar
+ * * *
+ baz
+04_03__leaf_blocks__setext_headings__027: |
+ Foo
+ bar
+ \---
+ baz
+04_04__leaf_blocks__indented_code_blocks__001: |2
+ a simple
+ indented code block
+04_04__leaf_blocks__indented_code_blocks__002: |2
+ - foo
+
+ bar
+04_04__leaf_blocks__indented_code_blocks__003: |
+ 1. foo
+
+ - bar
+04_04__leaf_blocks__indented_code_blocks__004: |2
+ <a/>
+ *hi*
+
+ - one
+04_04__leaf_blocks__indented_code_blocks__005: " chunk1\n\n chunk2\n \n \n
+ \n chunk3\n"
+04_04__leaf_blocks__indented_code_blocks__006: " chunk1\n \n chunk2\n"
+04_04__leaf_blocks__indented_code_blocks__007: |+
+ Foo
+ bar
+
+04_04__leaf_blocks__indented_code_blocks__008: |2
+ foo
+ bar
+04_04__leaf_blocks__indented_code_blocks__009: |
+ # Heading
+ foo
+ Heading
+ ------
+ foo
+ ----
+04_04__leaf_blocks__indented_code_blocks__010: |2
+ foo
+ bar
+04_04__leaf_blocks__indented_code_blocks__011: "\n \n foo\n \n\n"
+04_04__leaf_blocks__indented_code_blocks__012: " foo \n"
+04_05__leaf_blocks__fenced_code_blocks__001: |
+ ```
+ <
+ >
+ ```
+04_05__leaf_blocks__fenced_code_blocks__002: |
+ ~~~
+ <
+ >
+ ~~~
+04_05__leaf_blocks__fenced_code_blocks__003: |
+ ``
+ foo
+ ``
+04_05__leaf_blocks__fenced_code_blocks__004: |
+ ```
+ aaa
+ ~~~
+ ```
+04_05__leaf_blocks__fenced_code_blocks__005: |
+ ~~~
+ aaa
+ ```
+ ~~~
+04_05__leaf_blocks__fenced_code_blocks__006: |
+ ````
+ aaa
+ ```
+ ``````
+04_05__leaf_blocks__fenced_code_blocks__007: |
+ ~~~~
+ aaa
+ ~~~
+ ~~~~
+04_05__leaf_blocks__fenced_code_blocks__008: |
+ ```
+04_05__leaf_blocks__fenced_code_blocks__009: |
+ `````
+
+ ```
+ aaa
+04_05__leaf_blocks__fenced_code_blocks__010: |
+ > ```
+ > aaa
+
+ bbb
+04_05__leaf_blocks__fenced_code_blocks__011: "```\n\n \n```\n"
+04_05__leaf_blocks__fenced_code_blocks__012: |
+ ```
+ ```
+04_05__leaf_blocks__fenced_code_blocks__013: |2
+ ```
+ aaa
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__014: |2
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__015: |2
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__016: |2
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__017: |
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__018: |2
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__019: |
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__020: |
+ ``` ```
+ aaa
+04_05__leaf_blocks__fenced_code_blocks__021: |
+ ~~~~~~
+ aaa
+ ~~~ ~~
+04_05__leaf_blocks__fenced_code_blocks__022: |
+ foo
+ ```
+ bar
+ ```
+ baz
+04_05__leaf_blocks__fenced_code_blocks__023: |
+ foo
+ ---
+ ~~~
+ bar
+ ~~~
+ # baz
+04_05__leaf_blocks__fenced_code_blocks__024: |
+ ```ruby
+ def foo(x)
+ return 3
+ end
+ ```
+04_05__leaf_blocks__fenced_code_blocks__025: |
+ ~~~~ ruby startline=3 $%@#$
+ def foo(x)
+ return 3
+ end
+ ~~~~~~~
+04_05__leaf_blocks__fenced_code_blocks__026: |
+ ````;
+ ````
+04_05__leaf_blocks__fenced_code_blocks__027: |
+ ``` aa ```
+ foo
+04_05__leaf_blocks__fenced_code_blocks__028: |
+ ~~~ aa ``` ~~~
+ foo
+ ~~~
+04_05__leaf_blocks__fenced_code_blocks__029: |
+ ```
+ ``` aaa
+ ```
+04_06__leaf_blocks__html_blocks__001: |
+ <table><tr><td>
+ <pre>
+ **Hello**,
+
+ _world_.
+ </pre>
+ </td></tr></table>
+04_06__leaf_blocks__html_blocks__002: |
+ <table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+ </table>
+
+ okay.
+04_06__leaf_blocks__html_blocks__003: |2
+ <div>
+ *hello*
+ <foo><a>
+04_06__leaf_blocks__html_blocks__004: |
+ </div>
+ *foo*
+04_06__leaf_blocks__html_blocks__005: |
+ <DIV CLASS="foo">
+
+ *Markdown*
+
+ </DIV>
+04_06__leaf_blocks__html_blocks__006: |
+ <div id="foo"
+ class="bar">
+ </div>
+04_06__leaf_blocks__html_blocks__007: |
+ <div id="foo" class="bar
+ baz">
+ </div>
+04_06__leaf_blocks__html_blocks__008: |
+ <div>
+ *foo*
+
+ *bar*
+04_06__leaf_blocks__html_blocks__009: |
+ <div id="foo"
+ *hi*
+04_06__leaf_blocks__html_blocks__010: |
+ <div class
+ foo
+04_06__leaf_blocks__html_blocks__011: |
+ <div *???-&&&-<---
+ *foo*
+04_06__leaf_blocks__html_blocks__012: |
+ <div><a href="bar">*foo*</a></div>
+04_06__leaf_blocks__html_blocks__013: |
+ <table><tr><td>
+ foo
+ </td></tr></table>
+04_06__leaf_blocks__html_blocks__014: |
+ <div></div>
+ ``` c
+ int x = 33;
+ ```
+04_06__leaf_blocks__html_blocks__015: |
+ <a href="foo">
+ *bar*
+ </a>
+04_06__leaf_blocks__html_blocks__016: |
+ <Warning>
+ *bar*
+ </Warning>
+04_06__leaf_blocks__html_blocks__017: |
+ <i class="foo">
+ *bar*
+ </i>
+04_06__leaf_blocks__html_blocks__018: |
+ </ins>
+ *bar*
+04_06__leaf_blocks__html_blocks__019: |
+ <del>
+ *foo*
+ </del>
+04_06__leaf_blocks__html_blocks__020: |
+ <del>
+
+ *foo*
+
+ </del>
+04_06__leaf_blocks__html_blocks__021: |
+ <del>*foo*</del>
+04_06__leaf_blocks__html_blocks__022: |
+ <pre language="haskell"><code>
+ import Text.HTML.TagSoup
+
+ main :: IO ()
+ main = print $ parseTags tags
+ </code></pre>
+ okay
+04_06__leaf_blocks__html_blocks__023: |
+ <script type="text/javascript">
+ // JavaScript example
+
+ document.getElementById("demo").innerHTML = "Hello JavaScript!";
+ </script>
+ okay
+04_06__leaf_blocks__html_blocks__024: |
+ <style
+ type="text/css">
+ h1 {color:red;}
+
+ p {color:blue;}
+ </style>
+ okay
+04_06__leaf_blocks__html_blocks__025: |
+ <style
+ type="text/css">
+
+ foo
+04_06__leaf_blocks__html_blocks__026: |
+ > <div>
+ > foo
+
+ bar
+04_06__leaf_blocks__html_blocks__027: |
+ - <div>
+ - foo
+04_06__leaf_blocks__html_blocks__028: |
+ <style>p{color:red;}</style>
+ *foo*
+04_06__leaf_blocks__html_blocks__029: |
+ <!-- foo -->*bar*
+ *baz*
+04_06__leaf_blocks__html_blocks__030: |
+ <script>
+ foo
+ </script>1. *bar*
+04_06__leaf_blocks__html_blocks__031: |
+ <!-- Foo
+
+ bar
+ baz -->
+ okay
+04_06__leaf_blocks__html_blocks__032: |
+ <?php
+
+ echo '>';
+
+ ?>
+ okay
+04_06__leaf_blocks__html_blocks__033: |
+ <!DOCTYPE html>
+04_06__leaf_blocks__html_blocks__034: |
+ <![CDATA[
+ function matchwo(a,b)
+ {
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+ }
+ ]]>
+ okay
+04_06__leaf_blocks__html_blocks__035: |2
+ <!-- foo -->
+
+ <!-- foo -->
+04_06__leaf_blocks__html_blocks__036: |2
+ <div>
+
+ <div>
+04_06__leaf_blocks__html_blocks__037: |
+ Foo
+ <div>
+ bar
+ </div>
+04_06__leaf_blocks__html_blocks__038: |
+ <div>
+ bar
+ </div>
+ *foo*
+04_06__leaf_blocks__html_blocks__039: |
+ Foo
+ <a href="bar">
+ baz
+04_06__leaf_blocks__html_blocks__040: |
+ <div>
+
+ *Emphasized* text.
+
+ </div>
+04_06__leaf_blocks__html_blocks__041: |
+ <div>
+ *Emphasized* text.
+ </div>
+04_06__leaf_blocks__html_blocks__042: |
+ <table>
+
+ <tr>
+
+ <td>
+ Hi
+ </td>
+
+ </tr>
+
+ </table>
+04_06__leaf_blocks__html_blocks__043: |
+ <table>
+
+ <tr>
+
+ <td>
+ Hi
+ </td>
+
+ </tr>
+
+ </table>
+04_07__leaf_blocks__link_reference_definitions__001: |
+ [foo]: /url "title"
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__002: " [foo]: \n /url \n 'the
+ title' \n\n[foo]\n"
+04_07__leaf_blocks__link_reference_definitions__003: |
+ [Foo*bar\]]:my_(url) 'title (with parens)'
+
+ [Foo*bar\]]
+04_07__leaf_blocks__link_reference_definitions__004: |
+ [Foo bar]:
+ <my url>
+ 'title'
+
+ [Foo bar]
+04_07__leaf_blocks__link_reference_definitions__005: |
+ [foo]: /url '
+ title
+ line1
+ line2
+ '
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__006: |
+ [foo]: /url 'title
+
+ with blank line'
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__007: |
+ [foo]:
+ /url
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__008: |
+ [foo]:
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__009: |
+ [foo]: <>
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__010: |
+ [foo]: <bar>(baz)
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__011: |
+ [foo]: /url\bar\*baz "foo\"bar\baz"
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__012: |
+ [foo]
+
+ [foo]: url
+04_07__leaf_blocks__link_reference_definitions__013: |
+ [foo]
+
+ [foo]: first
+ [foo]: second
+04_07__leaf_blocks__link_reference_definitions__014: |
+ [FOO]: /url
+
+ [Foo]
+04_07__leaf_blocks__link_reference_definitions__015: |
+ [ΑΓΩ]: /φου
+
+ [αγω]
+04_07__leaf_blocks__link_reference_definitions__016: |
+ [foo]: /url
+04_07__leaf_blocks__link_reference_definitions__017: |
+ [
+ foo
+ ]: /url
+ bar
+04_07__leaf_blocks__link_reference_definitions__018: |
+ [foo]: /url "title" ok
+04_07__leaf_blocks__link_reference_definitions__019: |
+ [foo]: /url
+ "title" ok
+04_07__leaf_blocks__link_reference_definitions__020: |2
+ [foo]: /url "title"
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__021: |
+ ```
+ [foo]: /url
+ ```
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__022: |
+ Foo
+ [bar]: /baz
+
+ [bar]
+04_07__leaf_blocks__link_reference_definitions__023: |
+ # [Foo]
+ [foo]: /url
+ > bar
+04_07__leaf_blocks__link_reference_definitions__024: |
+ [foo]: /url
+ bar
+ ===
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__025: |
+ [foo]: /url
+ ===
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__026: |
+ [foo]: /foo-url "foo"
+ [bar]: /bar-url
+ "bar"
+ [baz]: /baz-url
+
+ [foo],
+ [bar],
+ [baz]
+04_07__leaf_blocks__link_reference_definitions__027: |
+ [foo]
+
+ > [foo]: /url
+04_07__leaf_blocks__link_reference_definitions__028: |
+ [foo]: /url
+04_08__leaf_blocks__paragraphs__001: |
+ aaa
+
+ bbb
+04_08__leaf_blocks__paragraphs__002: |
+ aaa
+ bbb
+
+ ccc
+ ddd
+04_08__leaf_blocks__paragraphs__003: |
+ aaa
+
+
+ bbb
+04_08__leaf_blocks__paragraphs__004: |2
+ aaa
+ bbb
+04_08__leaf_blocks__paragraphs__005: |
+ aaa
+ bbb
+ ccc
+04_08__leaf_blocks__paragraphs__006: |2
+ aaa
+ bbb
+04_08__leaf_blocks__paragraphs__007: |2
+ aaa
+ bbb
+04_08__leaf_blocks__paragraphs__008: "aaa \nbbb \n"
+04_09__leaf_blocks__blank_lines__001: " \n\naaa\n \n\n# aaa\n\n \n"
+04_10__leaf_blocks__tables_extension__001: |
+ | foo | bar |
+ | --- | --- |
+ | baz | bim |
+04_10__leaf_blocks__tables_extension__002: |
+ | abc | defghi |
+ :-: | -----------:
+ bar | baz
+04_10__leaf_blocks__tables_extension__003: |
+ | f\|oo |
+ | ------ |
+ | b `\|` az |
+ | b **\|** im |
+04_10__leaf_blocks__tables_extension__004: |
+ | abc | def |
+ | --- | --- |
+ | bar | baz |
+ > bar
+04_10__leaf_blocks__tables_extension__005: |
+ | abc | def |
+ | --- | --- |
+ | bar | baz |
+ bar
+
+ bar
+04_10__leaf_blocks__tables_extension__006: |
+ | abc | def |
+ | --- |
+ | bar |
+04_10__leaf_blocks__tables_extension__007: |
+ | abc | def |
+ | --- | --- |
+ | bar |
+ | bar | baz | boo |
+04_10__leaf_blocks__tables_extension__008: |
+ | abc | def |
+ | --- | --- |
+05_01__container_blocks__block_quotes__001: |
+ > # Foo
+ > bar
+ > baz
+05_01__container_blocks__block_quotes__002: |
+ ># Foo
+ >bar
+ > baz
+05_01__container_blocks__block_quotes__003: |2
+ > # Foo
+ > bar
+ > baz
+05_01__container_blocks__block_quotes__004: |2
+ > # Foo
+ > bar
+ > baz
+05_01__container_blocks__block_quotes__005: |
+ > # Foo
+ > bar
+ baz
+05_01__container_blocks__block_quotes__006: |
+ > bar
+ baz
+ > foo
+05_01__container_blocks__block_quotes__007: |
+ > foo
+ ---
+05_01__container_blocks__block_quotes__008: |
+ > - foo
+ - bar
+05_01__container_blocks__block_quotes__009: |
+ > foo
+ bar
+05_01__container_blocks__block_quotes__010: |
+ > ```
+ foo
+ ```
+05_01__container_blocks__block_quotes__011: |
+ > foo
+ - bar
+05_01__container_blocks__block_quotes__012: |
+ >
+05_01__container_blocks__block_quotes__013: ">\n> \n> \n"
+05_01__container_blocks__block_quotes__014: ">\n> foo\n> \n"
+05_01__container_blocks__block_quotes__015: |
+ > foo
+
+ > bar
+05_01__container_blocks__block_quotes__016: |
+ > foo
+ > bar
+05_01__container_blocks__block_quotes__017: |
+ > foo
+ >
+ > bar
+05_01__container_blocks__block_quotes__018: |
+ foo
+ > bar
+05_01__container_blocks__block_quotes__019: |
+ > aaa
+ ***
+ > bbb
+05_01__container_blocks__block_quotes__020: |
+ > bar
+ baz
+05_01__container_blocks__block_quotes__021: |
+ > bar
+
+ baz
+05_01__container_blocks__block_quotes__022: |
+ > bar
+ >
+ baz
+05_01__container_blocks__block_quotes__023: |
+ > > > foo
+ bar
+05_01__container_blocks__block_quotes__024: |
+ >>> foo
+ > bar
+ >>baz
+05_01__container_blocks__block_quotes__025: |
+ > code
+
+ > not code
+05_02__container_blocks__list_items__001: |
+ A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__002: |
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__003: |
+ - one
+
+ two
+05_02__container_blocks__list_items__004: |
+ - one
+
+ two
+05_02__container_blocks__list_items__005: |2
+ - one
+
+ two
+05_02__container_blocks__list_items__006: |2
+ - one
+
+ two
+05_02__container_blocks__list_items__007: |2
+ > > 1. one
+ >>
+ >> two
+05_02__container_blocks__list_items__008: |
+ >>- one
+ >>
+ > > two
+05_02__container_blocks__list_items__009: |
+ -one
+
+ 2.two
+05_02__container_blocks__list_items__010: |
+ - foo
+
+
+ bar
+05_02__container_blocks__list_items__011: |
+ 1. foo
+
+ ```
+ bar
+ ```
+
+ baz
+
+ > bam
+05_02__container_blocks__list_items__012: |
+ - Foo
+
+ bar
+
+
+ baz
+05_02__container_blocks__list_items__013: |
+ 123456789. ok
+05_02__container_blocks__list_items__014: |
+ 1234567890. not ok
+05_02__container_blocks__list_items__015: |
+ 0. ok
+05_02__container_blocks__list_items__016: |
+ 003. ok
+05_02__container_blocks__list_items__017: |
+ -1. not ok
+05_02__container_blocks__list_items__018: |
+ - foo
+
+ bar
+05_02__container_blocks__list_items__019: |2
+ 10. foo
+
+ bar
+05_02__container_blocks__list_items__020: |2
+ indented code
+
+ paragraph
+
+ more code
+05_02__container_blocks__list_items__021: |
+ 1. indented code
+
+ paragraph
+
+ more code
+05_02__container_blocks__list_items__022: |
+ 1. indented code
+
+ paragraph
+
+ more code
+05_02__container_blocks__list_items__023: |2
+ foo
+
+ bar
+05_02__container_blocks__list_items__024: |
+ - foo
+
+ bar
+05_02__container_blocks__list_items__025: |
+ - foo
+
+ bar
+05_02__container_blocks__list_items__026: |
+ -
+ foo
+ -
+ ```
+ bar
+ ```
+ -
+ baz
+05_02__container_blocks__list_items__027: "- \n foo\n"
+05_02__container_blocks__list_items__028: |
+ -
+
+ foo
+05_02__container_blocks__list_items__029: |
+ - foo
+ -
+ - bar
+05_02__container_blocks__list_items__030: "- foo\n- \n- bar\n"
+05_02__container_blocks__list_items__031: |
+ 1. foo
+ 2.
+ 3. bar
+05_02__container_blocks__list_items__032: |
+ *
+05_02__container_blocks__list_items__033: |
+ foo
+ *
+
+ foo
+ 1.
+05_02__container_blocks__list_items__034: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__035: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__036: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__037: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__038: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__039: |2
+ 1. A paragraph
+ with two lines.
+05_02__container_blocks__list_items__040: |
+ > 1. > Blockquote
+ continued here.
+05_02__container_blocks__list_items__041: |
+ > 1. > Blockquote
+ > continued here.
+05_02__container_blocks__list_items__042: |
+ - foo
+ - bar
+ - baz
+ - boo
+05_02__container_blocks__list_items__043: |
+ - foo
+ - bar
+ - baz
+ - boo
+05_02__container_blocks__list_items__044: |
+ 10) foo
+ - bar
+05_02__container_blocks__list_items__045: |
+ 10) foo
+ - bar
+05_02__container_blocks__list_items__046: |
+ - - foo
+05_02__container_blocks__list_items__047: |
+ 1. - 2. foo
+05_02__container_blocks__list_items__048: |
+ - # Foo
+ - Bar
+ ---
+ baz
+05_04__container_blocks__lists__001: |
+ - foo
+ - bar
+ + baz
+05_04__container_blocks__lists__002: |
+ 1. foo
+ 2. bar
+ 3) baz
+05_04__container_blocks__lists__003: |
+ Foo
+ - bar
+ - baz
+05_04__container_blocks__lists__004: |
+ The number of windows in my house is
+ 14. The number of doors is 6.
+05_04__container_blocks__lists__005: |
+ The number of windows in my house is
+ 1. The number of doors is 6.
+05_04__container_blocks__lists__006: |
+ - foo
+
+ - bar
+
+
+ - baz
+05_04__container_blocks__lists__007: |
+ - foo
+ - bar
+ - baz
+
+
+ bim
+05_04__container_blocks__lists__008: |
+ - foo
+ - bar
+
+ <!-- -->
+
+ - baz
+ - bim
+05_04__container_blocks__lists__009: |
+ - foo
+
+ notcode
+
+ - foo
+
+ <!-- -->
+
+ code
+05_04__container_blocks__lists__010: |
+ - a
+ - b
+ - c
+ - d
+ - e
+ - f
+ - g
+05_04__container_blocks__lists__011: |
+ 1. a
+
+ 2. b
+
+ 3. c
+05_04__container_blocks__lists__012: |
+ - a
+ - b
+ - c
+ - d
+ - e
+05_04__container_blocks__lists__013: |
+ 1. a
+
+ 2. b
+
+ 3. c
+05_04__container_blocks__lists__014: |
+ - a
+ - b
+
+ - c
+05_04__container_blocks__lists__015: |
+ * a
+ *
+
+ * c
+05_04__container_blocks__lists__016: |
+ - a
+ - b
+
+ c
+ - d
+05_04__container_blocks__lists__017: |
+ - a
+ - b
+
+ [ref]: /url
+ - d
+05_04__container_blocks__lists__018: |
+ - a
+ - ```
+ b
+
+
+ ```
+ - c
+05_04__container_blocks__lists__019: |
+ - a
+ - b
+
+ c
+ - d
+05_04__container_blocks__lists__020: |
+ * a
+ > b
+ >
+ * c
+05_04__container_blocks__lists__021: |
+ - a
+ > b
+ ```
+ c
+ ```
+ - d
+05_04__container_blocks__lists__022: |
+ - a
+05_04__container_blocks__lists__023: |
+ - a
+ - b
+05_04__container_blocks__lists__024: |
+ 1. ```
+ foo
+ ```
+
+ bar
+05_04__container_blocks__lists__025: |
+ * foo
+ * bar
+
+ baz
+05_04__container_blocks__lists__026: |
+ - a
+ - b
+ - c
+
+ - d
+ - e
+ - f
+06_01__inlines__001: |
+ `hi`lo`
+06_02__inlines__backslash_escapes__001: |
+ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
+06_02__inlines__backslash_escapes__002: "\\\t\\A\\a\\ \\3\\φ\\«\n"
+06_02__inlines__backslash_escapes__003: |
+ \*not emphasized*
+ \<br/> not a tag
+ \[not a link](/foo)
+ \`not code`
+ 1\. not a list
+ \* not a list
+ \# not a heading
+ \[foo]: /url "not a reference"
+ \&ouml; not a character entity
+06_02__inlines__backslash_escapes__004: |
+ \\*emphasis*
+06_02__inlines__backslash_escapes__005: |
+ foo\
+ bar
+06_02__inlines__backslash_escapes__006: |
+ `` \[\` ``
+06_02__inlines__backslash_escapes__007: |2
+ \[\]
+06_02__inlines__backslash_escapes__008: |
+ ~~~
+ \[\]
+ ~~~
+06_02__inlines__backslash_escapes__009: |
+ <http://example.com?find=\*>
+06_02__inlines__backslash_escapes__010: |
+ <a href="/bar\/)">
+06_02__inlines__backslash_escapes__011: |
+ [foo](/bar\* "ti\*tle")
+06_02__inlines__backslash_escapes__012: |
+ [foo]
+
+ [foo]: /bar\* "ti\*tle"
+06_02__inlines__backslash_escapes__013: |
+ ``` foo\+bar
+ foo
+ ```
+06_03__inlines__entity_and_numeric_character_references__001: |
+ &nbsp; &amp; &copy; &AElig; &Dcaron;
+ &frac34; &HilbertSpace; &DifferentialD;
+ &ClockwiseContourIntegral; &ngE;
+06_03__inlines__entity_and_numeric_character_references__002: |
+ &#35; &#1234; &#992; &#0;
+06_03__inlines__entity_and_numeric_character_references__003: |
+ &#X22; &#XD06; &#xcab;
+06_03__inlines__entity_and_numeric_character_references__004: |
+ &nbsp &x; &#; &#x;
+ &#987654321;
+ &#abcdef0;
+ &ThisIsNotDefined; &hi?;
+06_03__inlines__entity_and_numeric_character_references__005: |
+ &copy
+06_03__inlines__entity_and_numeric_character_references__006: |
+ &MadeUpEntity;
+06_03__inlines__entity_and_numeric_character_references__007: |
+ <a href="&ouml;&ouml;.html">
+06_03__inlines__entity_and_numeric_character_references__008: |
+ [foo](/f&ouml;&ouml; "f&ouml;&ouml;")
+06_03__inlines__entity_and_numeric_character_references__009: |
+ [foo]
+
+ [foo]: /f&ouml;&ouml; "f&ouml;&ouml;"
+06_03__inlines__entity_and_numeric_character_references__010: |
+ ``` f&ouml;&ouml;
+ foo
+ ```
+06_03__inlines__entity_and_numeric_character_references__011: |
+ `f&ouml;&ouml;`
+06_03__inlines__entity_and_numeric_character_references__012: |2
+ f&ouml;f&ouml;
+06_03__inlines__entity_and_numeric_character_references__013: |
+ &#42;foo&#42;
+ *foo*
+06_03__inlines__entity_and_numeric_character_references__014: |
+ &#42; foo
+
+ * foo
+06_03__inlines__entity_and_numeric_character_references__015: |
+ foo&#10;&#10;bar
+06_03__inlines__entity_and_numeric_character_references__016: |
+ &#9;foo
+06_03__inlines__entity_and_numeric_character_references__017: |
+ [a](url &quot;tit&quot;)
+06_04__inlines__code_spans__001: |
+ `foo`
+06_04__inlines__code_spans__002: |
+ `` foo ` bar ``
+06_04__inlines__code_spans__003: |
+ ` `` `
+06_04__inlines__code_spans__004: |
+ ` `` `
+06_04__inlines__code_spans__005: |
+ ` a`
+06_04__inlines__code_spans__006: |
+ ` b `
+06_04__inlines__code_spans__007: |
+ ` `
+ ` `
+06_04__inlines__code_spans__008: "``\nfoo\nbar \nbaz\n``\n"
+06_04__inlines__code_spans__009: "``\nfoo \n``\n"
+06_04__inlines__code_spans__010: "`foo bar \nbaz`\n"
+06_04__inlines__code_spans__011: |
+ `foo\`bar`
+06_04__inlines__code_spans__012: |
+ ``foo`bar``
+06_04__inlines__code_spans__013: |
+ ` foo `` bar `
+06_04__inlines__code_spans__014: |
+ *foo`*`
+06_04__inlines__code_spans__015: |
+ [not a `link](/foo`)
+06_04__inlines__code_spans__016: |
+ `<a href="`">`
+06_04__inlines__code_spans__017: |
+ <a href="`">`
+06_04__inlines__code_spans__018: |
+ `<http://foo.bar.`baz>`
+06_04__inlines__code_spans__019: |
+ <http://foo.bar.`baz>`
+06_04__inlines__code_spans__020: |
+ ```foo``
+06_04__inlines__code_spans__021: |
+ `foo
+06_04__inlines__code_spans__022: |
+ `foo``bar``
+06_05__inlines__emphasis_and_strong_emphasis__001: |
+ *foo bar*
+06_05__inlines__emphasis_and_strong_emphasis__002: |
+ a * foo bar*
+06_05__inlines__emphasis_and_strong_emphasis__003: |
+ a*"foo"*
+06_05__inlines__emphasis_and_strong_emphasis__004: |
+ * a *
+06_05__inlines__emphasis_and_strong_emphasis__005: |
+ foo*bar*
+06_05__inlines__emphasis_and_strong_emphasis__006: |
+ 5*6*78
+06_05__inlines__emphasis_and_strong_emphasis__007: |
+ _foo bar_
+06_05__inlines__emphasis_and_strong_emphasis__008: |
+ _ foo bar_
+06_05__inlines__emphasis_and_strong_emphasis__009: |
+ a_"foo"_
+06_05__inlines__emphasis_and_strong_emphasis__010: |
+ foo_bar_
+06_05__inlines__emphasis_and_strong_emphasis__011: |
+ 5_6_78
+06_05__inlines__emphasis_and_strong_emphasis__012: |
+ приÑтанÑм_ÑтремÑÑ‚ÑÑ_
+06_05__inlines__emphasis_and_strong_emphasis__013: |
+ aa_"bb"_cc
+06_05__inlines__emphasis_and_strong_emphasis__014: |
+ foo-_(bar)_
+06_05__inlines__emphasis_and_strong_emphasis__015: |
+ _foo*
+06_05__inlines__emphasis_and_strong_emphasis__016: |
+ *foo bar *
+06_05__inlines__emphasis_and_strong_emphasis__017: |
+ *foo bar
+ *
+06_05__inlines__emphasis_and_strong_emphasis__018: |
+ *(*foo)
+06_05__inlines__emphasis_and_strong_emphasis__019: |
+ *(*foo*)*
+06_05__inlines__emphasis_and_strong_emphasis__020: |
+ *foo*bar
+06_05__inlines__emphasis_and_strong_emphasis__021: |
+ _foo bar _
+06_05__inlines__emphasis_and_strong_emphasis__022: |
+ _(_foo)
+06_05__inlines__emphasis_and_strong_emphasis__023: |
+ _(_foo_)_
+06_05__inlines__emphasis_and_strong_emphasis__024: |
+ _foo_bar
+06_05__inlines__emphasis_and_strong_emphasis__025: |
+ _приÑтанÑм_ÑтремÑÑ‚ÑÑ
+06_05__inlines__emphasis_and_strong_emphasis__026: |
+ _foo_bar_baz_
+06_05__inlines__emphasis_and_strong_emphasis__027: |
+ _(bar)_.
+06_05__inlines__emphasis_and_strong_emphasis__028: |
+ **foo bar**
+06_05__inlines__emphasis_and_strong_emphasis__029: |
+ ** foo bar**
+06_05__inlines__emphasis_and_strong_emphasis__030: |
+ a**"foo"**
+06_05__inlines__emphasis_and_strong_emphasis__031: |
+ foo**bar**
+06_05__inlines__emphasis_and_strong_emphasis__032: |
+ __foo bar__
+06_05__inlines__emphasis_and_strong_emphasis__033: |
+ __ foo bar__
+06_05__inlines__emphasis_and_strong_emphasis__034: |
+ __
+ foo bar__
+06_05__inlines__emphasis_and_strong_emphasis__035: |
+ a__"foo"__
+06_05__inlines__emphasis_and_strong_emphasis__036: |
+ foo__bar__
+06_05__inlines__emphasis_and_strong_emphasis__037: |
+ 5__6__78
+06_05__inlines__emphasis_and_strong_emphasis__038: |
+ приÑтанÑм__ÑтремÑÑ‚ÑÑ__
+06_05__inlines__emphasis_and_strong_emphasis__039: |
+ __foo, __bar__, baz__
+06_05__inlines__emphasis_and_strong_emphasis__040: |
+ foo-__(bar)__
+06_05__inlines__emphasis_and_strong_emphasis__041: |
+ **foo bar **
+06_05__inlines__emphasis_and_strong_emphasis__042: |
+ **(**foo)
+06_05__inlines__emphasis_and_strong_emphasis__043: |
+ *(**foo**)*
+06_05__inlines__emphasis_and_strong_emphasis__044: |
+ **Gomphocarpus (*Gomphocarpus physocarpus*, syn.
+ *Asclepias physocarpa*)**
+06_05__inlines__emphasis_and_strong_emphasis__045: |
+ **foo "*bar*" foo**
+06_05__inlines__emphasis_and_strong_emphasis__046: |
+ **foo**bar
+06_05__inlines__emphasis_and_strong_emphasis__047: |
+ __foo bar __
+06_05__inlines__emphasis_and_strong_emphasis__048: |
+ __(__foo)
+06_05__inlines__emphasis_and_strong_emphasis__049: |
+ _(__foo__)_
+06_05__inlines__emphasis_and_strong_emphasis__050: |
+ __foo__bar
+06_05__inlines__emphasis_and_strong_emphasis__051: |
+ __приÑтанÑм__ÑтремÑÑ‚ÑÑ
+06_05__inlines__emphasis_and_strong_emphasis__052: |
+ __foo__bar__baz__
+06_05__inlines__emphasis_and_strong_emphasis__053: |
+ __(bar)__.
+06_05__inlines__emphasis_and_strong_emphasis__054: |
+ *foo [bar](/url)*
+06_05__inlines__emphasis_and_strong_emphasis__055: |
+ *foo
+ bar*
+06_05__inlines__emphasis_and_strong_emphasis__056: |
+ _foo __bar__ baz_
+06_05__inlines__emphasis_and_strong_emphasis__057: |
+ _foo _bar_ baz_
+06_05__inlines__emphasis_and_strong_emphasis__058: |
+ __foo_ bar_
+06_05__inlines__emphasis_and_strong_emphasis__059: |
+ *foo *bar**
+06_05__inlines__emphasis_and_strong_emphasis__060: |
+ *foo **bar** baz*
+06_05__inlines__emphasis_and_strong_emphasis__061: |
+ *foo**bar**baz*
+06_05__inlines__emphasis_and_strong_emphasis__062: |
+ *foo**bar*
+06_05__inlines__emphasis_and_strong_emphasis__063: |
+ ***foo** bar*
+06_05__inlines__emphasis_and_strong_emphasis__064: |
+ *foo **bar***
+06_05__inlines__emphasis_and_strong_emphasis__065: |
+ *foo**bar***
+06_05__inlines__emphasis_and_strong_emphasis__066: |
+ foo***bar***baz
+06_05__inlines__emphasis_and_strong_emphasis__067: |
+ foo******bar*********baz
+06_05__inlines__emphasis_and_strong_emphasis__068: |
+ *foo **bar *baz* bim** bop*
+06_05__inlines__emphasis_and_strong_emphasis__069: |
+ *foo [*bar*](/url)*
+06_05__inlines__emphasis_and_strong_emphasis__070: |
+ ** is not an empty emphasis
+06_05__inlines__emphasis_and_strong_emphasis__071: |
+ **** is not an empty strong emphasis
+06_05__inlines__emphasis_and_strong_emphasis__072: |
+ **foo [bar](/url)**
+06_05__inlines__emphasis_and_strong_emphasis__073: |
+ **foo
+ bar**
+06_05__inlines__emphasis_and_strong_emphasis__074: |
+ __foo _bar_ baz__
+06_05__inlines__emphasis_and_strong_emphasis__075: |
+ __foo __bar__ baz__
+06_05__inlines__emphasis_and_strong_emphasis__076: |
+ ____foo__ bar__
+06_05__inlines__emphasis_and_strong_emphasis__077: |
+ **foo **bar****
+06_05__inlines__emphasis_and_strong_emphasis__078: |
+ **foo *bar* baz**
+06_05__inlines__emphasis_and_strong_emphasis__079: |
+ **foo*bar*baz**
+06_05__inlines__emphasis_and_strong_emphasis__080: |
+ ***foo* bar**
+06_05__inlines__emphasis_and_strong_emphasis__081: |
+ **foo *bar***
+06_05__inlines__emphasis_and_strong_emphasis__082: |
+ **foo *bar **baz**
+ bim* bop**
+06_05__inlines__emphasis_and_strong_emphasis__083: |
+ **foo [*bar*](/url)**
+06_05__inlines__emphasis_and_strong_emphasis__084: |
+ __ is not an empty emphasis
+06_05__inlines__emphasis_and_strong_emphasis__085: |
+ ____ is not an empty strong emphasis
+06_05__inlines__emphasis_and_strong_emphasis__086: |
+ foo ***
+06_05__inlines__emphasis_and_strong_emphasis__087: |
+ foo *\**
+06_05__inlines__emphasis_and_strong_emphasis__088: |
+ foo *_*
+06_05__inlines__emphasis_and_strong_emphasis__089: |
+ foo *****
+06_05__inlines__emphasis_and_strong_emphasis__090: |
+ foo **\***
+06_05__inlines__emphasis_and_strong_emphasis__091: |
+ foo **_**
+06_05__inlines__emphasis_and_strong_emphasis__092: |
+ **foo*
+06_05__inlines__emphasis_and_strong_emphasis__093: |
+ *foo**
+06_05__inlines__emphasis_and_strong_emphasis__094: |
+ ***foo**
+06_05__inlines__emphasis_and_strong_emphasis__095: |
+ ****foo*
+06_05__inlines__emphasis_and_strong_emphasis__096: |
+ **foo***
+06_05__inlines__emphasis_and_strong_emphasis__097: |
+ *foo****
+06_05__inlines__emphasis_and_strong_emphasis__098: |
+ foo ___
+06_05__inlines__emphasis_and_strong_emphasis__099: |
+ foo _\__
+06_05__inlines__emphasis_and_strong_emphasis__100: |
+ foo _*_
+06_05__inlines__emphasis_and_strong_emphasis__101: |
+ foo _____
+06_05__inlines__emphasis_and_strong_emphasis__102: |
+ foo __\___
+06_05__inlines__emphasis_and_strong_emphasis__103: |
+ foo __*__
+06_05__inlines__emphasis_and_strong_emphasis__104: |
+ __foo_
+06_05__inlines__emphasis_and_strong_emphasis__105: |
+ _foo__
+06_05__inlines__emphasis_and_strong_emphasis__106: |
+ ___foo__
+06_05__inlines__emphasis_and_strong_emphasis__107: |
+ ____foo_
+06_05__inlines__emphasis_and_strong_emphasis__108: |
+ __foo___
+06_05__inlines__emphasis_and_strong_emphasis__109: |
+ _foo____
+06_05__inlines__emphasis_and_strong_emphasis__110: |
+ **foo**
+06_05__inlines__emphasis_and_strong_emphasis__111: |
+ *_foo_*
+06_05__inlines__emphasis_and_strong_emphasis__112: |
+ __foo__
+06_05__inlines__emphasis_and_strong_emphasis__113: |
+ _*foo*_
+06_05__inlines__emphasis_and_strong_emphasis__114: |
+ ****foo****
+06_05__inlines__emphasis_and_strong_emphasis__115: |
+ ____foo____
+06_05__inlines__emphasis_and_strong_emphasis__116: |
+ ******foo******
+06_05__inlines__emphasis_and_strong_emphasis__117: |
+ ***foo***
+06_05__inlines__emphasis_and_strong_emphasis__118: |
+ _____foo_____
+06_05__inlines__emphasis_and_strong_emphasis__119: |
+ *foo _bar* baz_
+06_05__inlines__emphasis_and_strong_emphasis__120: |
+ *foo __bar *baz bim__ bam*
+06_05__inlines__emphasis_and_strong_emphasis__121: |
+ **foo **bar baz**
+06_05__inlines__emphasis_and_strong_emphasis__122: |
+ *foo *bar baz*
+06_05__inlines__emphasis_and_strong_emphasis__123: |
+ *[bar*](/url)
+06_05__inlines__emphasis_and_strong_emphasis__124: |
+ _foo [bar_](/url)
+06_05__inlines__emphasis_and_strong_emphasis__125: |
+ *<img src="foo" title="*"/>
+06_05__inlines__emphasis_and_strong_emphasis__126: |
+ **<a href="**">
+06_05__inlines__emphasis_and_strong_emphasis__127: |
+ __<a href="__">
+06_05__inlines__emphasis_and_strong_emphasis__128: |
+ *a `*`*
+06_05__inlines__emphasis_and_strong_emphasis__129: |
+ _a `_`_
+06_05__inlines__emphasis_and_strong_emphasis__130: |
+ **a<http://foo.bar/?q=**>
+06_05__inlines__emphasis_and_strong_emphasis__131: |
+ __a<http://foo.bar/?q=__>
+06_06__inlines__strikethrough_extension__001: |
+ ~~Hi~~ Hello, world!
+06_06__inlines__strikethrough_extension__002: |
+ This ~~has a
+
+ new paragraph~~.
+06_07__inlines__links__001: |
+ [link](/uri "title")
+06_07__inlines__links__002: |
+ [link](/uri)
+06_07__inlines__links__003: |
+ [link]()
+06_07__inlines__links__004: |
+ [link](<>)
+06_07__inlines__links__005: |
+ [link](/my uri)
+06_07__inlines__links__006: |
+ [link](</my uri>)
+06_07__inlines__links__007: |
+ [link](foo
+ bar)
+06_07__inlines__links__008: |
+ [link](<foo
+ bar>)
+06_07__inlines__links__009: |
+ [a](<b)c>)
+06_07__inlines__links__010: |
+ [link](<foo\>)
+06_07__inlines__links__011: |
+ [a](<b)c
+ [a](<b)c>
+ [a](<b>c)
+06_07__inlines__links__012: |
+ [link](\(foo\))
+06_07__inlines__links__013: |
+ [link](foo(and(bar)))
+06_07__inlines__links__014: |
+ [link](foo\(and\(bar\))
+06_07__inlines__links__015: |
+ [link](<foo(and(bar)>)
+06_07__inlines__links__016: |
+ [link](foo\)\:)
+06_07__inlines__links__017: |
+ [link](#fragment)
+
+ [link](http://example.com#fragment)
+
+ [link](http://example.com?foo=3#frag)
+06_07__inlines__links__018: |
+ [link](foo\bar)
+06_07__inlines__links__019: |
+ [link](foo%20b&auml;)
+06_07__inlines__links__020: |
+ [link]("title")
+06_07__inlines__links__021: |
+ [link](/url "title")
+ [link](/url 'title')
+ [link](/url (title))
+06_07__inlines__links__022: |
+ [link](/url "title \"&quot;")
+06_07__inlines__links__023: |
+ [link](/url "title")
+06_07__inlines__links__024: |
+ [link](/url "title "and" title")
+06_07__inlines__links__025: |
+ [link](/url 'title "and" title')
+06_07__inlines__links__026: |
+ [link]( /uri
+ "title" )
+06_07__inlines__links__027: |
+ [link] (/uri)
+06_07__inlines__links__028: |
+ [link [foo [bar]]](/uri)
+06_07__inlines__links__029: |
+ [link] bar](/uri)
+06_07__inlines__links__030: |
+ [link [bar](/uri)
+06_07__inlines__links__031: |
+ [link \[bar](/uri)
+06_07__inlines__links__032: |
+ [link *foo **bar** `#`*](/uri)
+06_07__inlines__links__033: |
+ [![moon](moon.jpg)](/uri)
+06_07__inlines__links__034: |
+ [foo [bar](/uri)](/uri)
+06_07__inlines__links__035: |
+ [foo *[bar [baz](/uri)](/uri)*](/uri)
+06_07__inlines__links__036: |
+ ![[[foo](uri1)](uri2)](uri3)
+06_07__inlines__links__037: |
+ *[foo*](/uri)
+06_07__inlines__links__038: |
+ [foo *bar](baz*)
+06_07__inlines__links__039: |
+ *foo [bar* baz]
+06_07__inlines__links__040: |
+ [foo <bar attr="](baz)">
+06_07__inlines__links__041: |
+ [foo`](/uri)`
+06_07__inlines__links__042: |
+ [foo<http://example.com/?search=](uri)>
+06_07__inlines__links__043: |
+ [foo][bar]
+
+ [bar]: /url "title"
+06_07__inlines__links__044: |
+ [link [foo [bar]]][ref]
+
+ [ref]: /uri
+06_07__inlines__links__045: |
+ [link \[bar][ref]
+
+ [ref]: /uri
+06_07__inlines__links__046: |
+ [link *foo **bar** `#`*][ref]
+
+ [ref]: /uri
+06_07__inlines__links__047: |
+ [![moon](moon.jpg)][ref]
+
+ [ref]: /uri
+06_07__inlines__links__048: |
+ [foo [bar](/uri)][ref]
+
+ [ref]: /uri
+06_07__inlines__links__049: |
+ [foo *bar [baz][ref]*][ref]
+
+ [ref]: /uri
+06_07__inlines__links__050: |
+ *[foo*][ref]
+
+ [ref]: /uri
+06_07__inlines__links__051: |
+ [foo *bar][ref]
+
+ [ref]: /uri
+06_07__inlines__links__052: |
+ [foo <bar attr="][ref]">
+
+ [ref]: /uri
+06_07__inlines__links__053: |
+ [foo`][ref]`
+
+ [ref]: /uri
+06_07__inlines__links__054: |
+ [foo<http://example.com/?search=][ref]>
+
+ [ref]: /uri
+06_07__inlines__links__055: |
+ [foo][BaR]
+
+ [bar]: /url "title"
+06_07__inlines__links__056: |
+ [Толпой][Толпой] is a Russian word.
+
+ [ТОЛПОЙ]: /url
+06_07__inlines__links__057: |
+ [Foo
+ bar]: /url
+
+ [Baz][Foo bar]
+06_07__inlines__links__058: |
+ [foo] [bar]
+
+ [bar]: /url "title"
+06_07__inlines__links__059: |
+ [foo]
+ [bar]
+
+ [bar]: /url "title"
+06_07__inlines__links__060: |
+ [foo]: /url1
+
+ [foo]: /url2
+
+ [bar][foo]
+06_07__inlines__links__061: |
+ [bar][foo\!]
+
+ [foo!]: /url
+06_07__inlines__links__062: |
+ [foo][ref[]
+
+ [ref[]: /uri
+06_07__inlines__links__063: |
+ [foo][ref[bar]]
+
+ [ref[bar]]: /uri
+06_07__inlines__links__064: |
+ [[[foo]]]
+
+ [[[foo]]]: /url
+06_07__inlines__links__065: |
+ [foo][ref\[]
+
+ [ref\[]: /uri
+06_07__inlines__links__066: |
+ [bar\\]: /uri
+
+ [bar\\]
+06_07__inlines__links__067: |
+ []
+
+ []: /uri
+06_07__inlines__links__068: |
+ [
+ ]
+
+ [
+ ]: /uri
+06_07__inlines__links__069: |
+ [foo][]
+
+ [foo]: /url "title"
+06_07__inlines__links__070: |
+ [*foo* bar][]
+
+ [*foo* bar]: /url "title"
+06_07__inlines__links__071: |
+ [Foo][]
+
+ [foo]: /url "title"
+06_07__inlines__links__072: "[foo] \n[]\n\n[foo]: /url \"title\"\n"
+06_07__inlines__links__073: |
+ [foo]
+
+ [foo]: /url "title"
+06_07__inlines__links__074: |
+ [*foo* bar]
+
+ [*foo* bar]: /url "title"
+06_07__inlines__links__075: |
+ [[*foo* bar]]
+
+ [*foo* bar]: /url "title"
+06_07__inlines__links__076: |
+ [[bar [foo]
+
+ [foo]: /url
+06_07__inlines__links__077: |
+ [Foo]
+
+ [foo]: /url "title"
+06_07__inlines__links__078: |
+ [foo] bar
+
+ [foo]: /url
+06_07__inlines__links__079: |
+ \[foo]
+
+ [foo]: /url "title"
+06_07__inlines__links__080: |
+ [foo*]: /url
+
+ *[foo*]
+06_07__inlines__links__081: |
+ [foo][bar]
+
+ [foo]: /url1
+ [bar]: /url2
+06_07__inlines__links__082: |
+ [foo][]
+
+ [foo]: /url1
+06_07__inlines__links__083: |
+ [foo]()
+
+ [foo]: /url1
+06_07__inlines__links__084: |
+ [foo](not a link)
+
+ [foo]: /url1
+06_07__inlines__links__085: |
+ [foo][bar][baz]
+
+ [baz]: /url
+06_07__inlines__links__086: |
+ [foo][bar][baz]
+
+ [baz]: /url1
+ [bar]: /url2
+06_07__inlines__links__087: |
+ [foo][bar][baz]
+
+ [baz]: /url1
+ [foo]: /url2
+06_08__inlines__images__001: |
+ ![foo](/url "title")
+06_08__inlines__images__002: |
+ ![foo *bar*]
+
+ [foo *bar*]: train.jpg "train & tracks"
+06_08__inlines__images__003: |
+ ![foo ![bar](/url)](/url2)
+06_08__inlines__images__004: |
+ ![foo [bar](/url)](/url2)
+06_08__inlines__images__005: |
+ ![foo *bar*][]
+
+ [foo *bar*]: train.jpg "train & tracks"
+06_08__inlines__images__006: |
+ ![foo *bar*][foobar]
+
+ [FOOBAR]: train.jpg "train & tracks"
+06_08__inlines__images__007: |
+ ![foo](train.jpg)
+06_08__inlines__images__008: |
+ My ![foo bar](/path/to/train.jpg "title" )
+06_08__inlines__images__009: |
+ ![foo](<url>)
+06_08__inlines__images__010: |
+ ![](/url)
+06_08__inlines__images__011: |
+ ![foo][bar]
+
+ [bar]: /url
+06_08__inlines__images__012: |
+ ![foo][bar]
+
+ [BAR]: /url
+06_08__inlines__images__013: |
+ ![foo][]
+
+ [foo]: /url "title"
+06_08__inlines__images__014: |
+ ![*foo* bar][]
+
+ [*foo* bar]: /url "title"
+06_08__inlines__images__015: |
+ ![Foo][]
+
+ [foo]: /url "title"
+06_08__inlines__images__016: "![foo] \n[]\n\n[foo]: /url \"title\"\n"
+06_08__inlines__images__017: |
+ ![foo]
+
+ [foo]: /url "title"
+06_08__inlines__images__018: |
+ ![*foo* bar]
+
+ [*foo* bar]: /url "title"
+06_08__inlines__images__019: |
+ ![[foo]]
+
+ [[foo]]: /url "title"
+06_08__inlines__images__020: |
+ ![Foo]
+
+ [foo]: /url "title"
+06_08__inlines__images__021: |
+ !\[foo]
+
+ [foo]: /url "title"
+06_08__inlines__images__022: |
+ \![foo]
+
+ [foo]: /url "title"
+06_09__inlines__autolinks__001: |
+ <http://foo.bar.baz>
+06_09__inlines__autolinks__002: |
+ <http://foo.bar.baz/test?q=hello&id=22&boolean>
+06_09__inlines__autolinks__003: |
+ <irc://foo.bar:2233/baz>
+06_09__inlines__autolinks__004: |
+ <MAILTO:FOO@BAR.BAZ>
+06_09__inlines__autolinks__005: |
+ <a+b+c:d>
+06_09__inlines__autolinks__006: |
+ <made-up-scheme://foo,bar>
+06_09__inlines__autolinks__007: |
+ <http://../>
+06_09__inlines__autolinks__008: |
+ <localhost:5001/foo>
+06_09__inlines__autolinks__009: |
+ <http://foo.bar/baz bim>
+06_09__inlines__autolinks__010: |
+ <http://example.com/\[\>
+06_09__inlines__autolinks__011: |
+ <foo@bar.example.com>
+06_09__inlines__autolinks__012: |
+ <foo+special@Bar.baz-bar0.com>
+06_09__inlines__autolinks__013: |
+ <foo\+@bar.example.com>
+06_09__inlines__autolinks__014: |
+ <>
+06_09__inlines__autolinks__015: |
+ < http://foo.bar >
+06_09__inlines__autolinks__016: |
+ <m:abc>
+06_09__inlines__autolinks__017: |
+ <foo.bar.baz>
+06_09__inlines__autolinks__018: |
+ http://example.com
+06_09__inlines__autolinks__019: |
+ foo@bar.example.com
+06_10__inlines__autolinks_extension__001: |
+ www.commonmark.org
+06_10__inlines__autolinks_extension__002: |
+ Visit www.commonmark.org/help for more information.
+06_10__inlines__autolinks_extension__003: |
+ Visit www.commonmark.org.
+
+ Visit www.commonmark.org/a.b.
+06_10__inlines__autolinks_extension__004: |
+ www.google.com/search?q=Markup+(business)
+
+ www.google.com/search?q=Markup+(business)))
+
+ (www.google.com/search?q=Markup+(business))
+
+ (www.google.com/search?q=Markup+(business)
+06_10__inlines__autolinks_extension__005: |
+ www.google.com/search?q=(business))+ok
+06_10__inlines__autolinks_extension__006: |
+ www.google.com/search?q=commonmark&hl=en
+
+ www.google.com/search?q=commonmark&hl;
+06_10__inlines__autolinks_extension__007: |
+ www.commonmark.org/he<lp
+06_10__inlines__autolinks_extension__008: |
+ http://commonmark.org
+
+ (Visit https://encrypted.google.com/search?q=Markup+(business))
+
+ Anonymous FTP is available at ftp://foo.bar.baz.
+06_10__inlines__autolinks_extension__009: |
+ foo@bar.baz
+06_10__inlines__autolinks_extension__010: |
+ hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.
+06_10__inlines__autolinks_extension__011: |
+ a.b-c_d@a.b
+
+ a.b-c_d@a.b.
+
+ a.b-c_d@a.b-
+
+ a.b-c_d@a.b_
+06_11__inlines__raw_html__001: |
+ <a><bab><c2c>
+06_11__inlines__raw_html__002: |
+ <a/><b2/>
+06_11__inlines__raw_html__003: |
+ <a /><b2
+ data="foo" >
+06_11__inlines__raw_html__004: |
+ <a foo="bar" bam = 'baz <em>"</em>'
+ _boolean zoop:33=zoop:33 />
+06_11__inlines__raw_html__005: |
+ Foo <responsive-image src="foo.jpg" />
+06_11__inlines__raw_html__006: |
+ <33> <__>
+06_11__inlines__raw_html__007: |
+ <a h*#ref="hi">
+06_11__inlines__raw_html__008: |
+ <a href="hi'> <a href=hi'>
+06_11__inlines__raw_html__009: |
+ < a><
+ foo><bar/ >
+ <foo bar=baz
+ bim!bop />
+06_11__inlines__raw_html__010: |
+ <a href='bar'title=title>
+06_11__inlines__raw_html__011: |
+ </a></foo >
+06_11__inlines__raw_html__012: |
+ </a href="foo">
+06_11__inlines__raw_html__013: |
+ foo <!-- this is a
+ comment - with hyphen -->
+06_11__inlines__raw_html__014: |
+ foo <!-- not a comment -- two hyphens -->
+06_11__inlines__raw_html__015: |
+ foo <!--> foo -->
+
+ foo <!-- foo--->
+06_11__inlines__raw_html__016: |
+ foo <?php echo $a; ?>
+06_11__inlines__raw_html__017: |
+ foo <!ELEMENT br EMPTY>
+06_11__inlines__raw_html__018: |
+ foo <![CDATA[>&<]]>
+06_11__inlines__raw_html__019: |
+ foo <a href="&ouml;">
+06_11__inlines__raw_html__020: |
+ foo <a href="\*">
+06_11__inlines__raw_html__021: |
+ <a href="\"">
+06_12__inlines__disallowed_raw_html_extension__001: |
+ <strong> <title> <style> <em>
+
+ <blockquote>
+ <xmp> is disallowed. <XMP> is also disallowed.
+ </blockquote>
+06_13__inlines__hard_line_breaks__001: "foo \nbaz\n"
+06_13__inlines__hard_line_breaks__002: |
+ foo\
+ baz
+06_13__inlines__hard_line_breaks__003: "foo \nbaz\n"
+06_13__inlines__hard_line_breaks__004: "foo \n bar\n"
+06_13__inlines__hard_line_breaks__005: |
+ foo\
+ bar
+06_13__inlines__hard_line_breaks__006: "*foo \nbar*\n"
+06_13__inlines__hard_line_breaks__007: |
+ *foo\
+ bar*
+06_13__inlines__hard_line_breaks__008: "`code \nspan`\n"
+06_13__inlines__hard_line_breaks__009: |
+ `code\
+ span`
+06_13__inlines__hard_line_breaks__010: "<a href=\"foo \nbar\">\n"
+06_13__inlines__hard_line_breaks__011: |
+ <a href="foo\
+ bar">
+06_13__inlines__hard_line_breaks__012: |
+ foo\
+06_13__inlines__hard_line_breaks__013: "foo \n"
+06_13__inlines__hard_line_breaks__014: |
+ ### foo\
+06_13__inlines__hard_line_breaks__015: "### foo \n"
+06_14__inlines__soft_line_breaks__001: |
+ foo
+ baz
+06_14__inlines__soft_line_breaks__002: "foo \n baz\n"
+06_15__inlines__textual_content__001: |
+ hello $.;'there
+06_15__inlines__textual_content__002: |
+ Foo χÏῆν
+06_15__inlines__textual_content__003: |
+ Multiple spaces
+07_01__gitlab_specific_markdown__footnotes__001: |
+ footnote reference tag [^1]
+
+ [^1]: footnote text
diff --git a/glfm_specification/example_snapshots/prosemirror_json.yml b/glfm_specification/example_snapshots/prosemirror_json.yml
new file mode 100644
index 00000000000..0a8c15e9650
--- /dev/null
+++ b/glfm_specification/example_snapshots/prosemirror_json.yml
@@ -0,0 +1,19246 @@
+---
+02_01__preliminaries__tabs__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\tbaz\t\tbim"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\tbaz\t\tbim"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "a\ta\ná½\ta"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": " foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": " foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+03_01__blocks_and_inlines__precedence__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "`one"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "two`"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "+++"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "==="
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "--\n**\n__"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "***"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n***"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_ _ _ _ a"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a------"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "---a---"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "-"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 4
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 5
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 6
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "####### foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "#5 bolt"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "#hashtag"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "## foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": " *baz*"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "# foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n# bar"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 5
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ### b"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo#"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ###"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ###"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo #"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo bar"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Bar foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ }
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ }
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ }
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n---\n\nFoo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n---"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n= ="
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\\"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "`Foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "`"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<a title=\"a lot"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "of dashes\"/>"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar\n==="
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nBar"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Bar"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Baz"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "===="
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "> foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nbar"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nbar"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__027: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nbar\n---\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "a simple\n indented code block"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<a/>\n*hi*\n\n- one"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "chunk1\n\nchunk2\n\n\n\nchunk3"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "chunk1\n \n chunk2"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Heading"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Heading"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": " foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<\n >"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<\n >"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n~~~"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n~~~"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "\n```\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bbb"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\naaa\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n aaa\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "```\naaa\n```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n ```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n~~~ ~~"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "ruby",
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "def foo(x)\n return 3\nend"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "ruby",
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "def foo(x)\n return 3\nend"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": ";",
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__027: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "aa"
+ },
+ {
+ "type": "text",
+ "text": "\nfoo"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__028: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "aa",
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__029: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "``` aaa"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "pre",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**Hello**,\n"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "world"
+ },
+ {
+ "type": "text",
+ "text": ".\n"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n hi\n "
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "okay."
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n *hello*\n "
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n*foo*"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "Markdown"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n*foo*\n"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "bar",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "*foo*"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\nfoo\n"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div"
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n``` c\nint x = 33;\n```"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "\n*bar*\n"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "\n*bar*\n"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n*bar*"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "strike"
+ }
+ ],
+ "text": "\n*foo*\n"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ },
+ {
+ "type": "strike"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ },
+ {
+ "type": "strike"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "pre",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "\nimport Text.HTML.TagSoup\n\nmain :: IO ()\nmain = print $ parseTags tags\n"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "okay"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "okay"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "okay"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\nfoo\n"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__027: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "div"
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__028: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__029: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*bar*\n"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__030: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "1. *bar*"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__031: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "okay"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__032: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "';\n\n?>\n"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "okay"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__033: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__034: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "okay"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__035: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<!-- foo -->"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__036: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<div>"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__037: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\nbar\n"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__038: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\nbar\n"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n*foo*"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__039: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "bar",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__040: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "Emphasized"
+ },
+ {
+ "type": "text",
+ "text": " text."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__041: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "div",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\n*Emphasized* text.\n"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__042: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\nHi\n"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__043: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<td>\n Hi\n</td>"
+ }
+ ]
+ },
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "the title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "my_(url)",
+ "target": "_blank",
+ "class": null,
+ "title": "title (with parens)",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo*bar]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "my%20url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo bar"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "\ntitle\nline1\nline2\n",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]: /url 'title"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "with blank line'"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]:"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]: "
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url%5Cbar*baz",
+ "target": "_blank",
+ "class": null,
+ "title": "foo\"bar\\baz",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "first",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/%CF%86%CE%BF%CF%85",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "αγω"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]: /url \"title\" ok"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\"title\" ok"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]: /url \"title\""
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]: /url"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n[bar]: /baz"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[bar]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "===\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/foo-url",
+ "target": "_blank",
+ "class": null,
+ "title": "foo",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": ",\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/bar-url",
+ "target": "_blank",
+ "class": null,
+ "title": "bar",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": ",\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/baz-url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__027: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__028: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "ccc\nddd"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb\nccc"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbbb"
+ }
+ ]
+ }
+ ]
+ }
+04_09__leaf_blocks__blank_lines__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bim"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "abc"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "defghi"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "f|oo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "|"
+ },
+ {
+ "type": "text",
+ "text": " az"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "|"
+ },
+ {
+ "type": "text",
+ "text": " im"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "abc"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "def"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "abc"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "def"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| abc | def |\n| --- |\n| bar |"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "abc"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "def"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isMarkdown": null
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "abc"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {
+ "colspan": 1,
+ "rowspan": 1,
+ "colwidth": null
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "def"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "> # Foo\n> bar\n> baz"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz\nfoo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ }
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n- bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bbb"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "code"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "not code"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A paragraph\nwith two lines."
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A block quote."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A paragraph\nwith two lines."
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A block quote."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "one"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "two"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "one"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "two"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "one"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": " two"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "one"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "two"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "one"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "two"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "one"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "two"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "-one"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "2.two"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bam"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\n\n\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "ok"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "1234567890. not ok"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "ok"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "ok"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "-1. not ok"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "paragraph"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "more code"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "paragraph"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "more code"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": " indented code"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "paragraph"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "more code"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__027: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__028: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__029: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__030: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__031: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__032: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__033: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n*"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n1."
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__034: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A paragraph\nwith two lines."
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A block quote."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__035: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A paragraph\nwith two lines."
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A block quote."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__036: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A paragraph\nwith two lines."
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A block quote."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__037: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "1. A paragraph\n with two lines.\n\n indented code\n\n > A block quote."
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__038: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A paragraph\nwith two lines."
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "indented code"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A block quote."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__039: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "A paragraph\nwith two lines."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__040: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Blockquote\ncontinued here."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__041: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Blockquote\ncontinued here."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__042: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "boo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__043: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "boo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__044: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__045: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__046: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__047: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__048: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Bar"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "The number of windows in my house is\n14. The number of doors is 6."
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "The number of windows in my house is"
+ }
+ ]
+ },
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "The number of doors is 6."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bim"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bim"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "notcode"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "code"
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "d"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "e"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "f"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "g"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "d\n- e"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "3. c"
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "d"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "d"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "d"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "d"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_04__container_blocks__lists__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "c"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "d"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "e"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "f"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+06_01__inlines__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "hi"
+ },
+ {
+ "type": "text",
+ "text": "lo`"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\\\t\\A\\a\\ \\3\\φ\\«"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*not emphasized*\n<br/> not a tag\n[not a link](/foo)\n`not code`\n1. not a list\n* not a list\n# not a heading\n[foo]: /url \"not a reference\"\n&ouml; not a character entity"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\\"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "\\[\\`"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "\\[\\]"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "\\[\\]"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com?find=%5C*",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com?find=\\*"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/bar*",
+ "target": "_blank",
+ "class": null,
+ "title": "ti*tle",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/bar*",
+ "target": "_blank",
+ "class": null,
+ "title": "ti*tle",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "foo+bar",
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "  & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "# Ӓ Ϡ �"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\" ആ ಫ"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "&nbsp &x; &#; &#x;\n&#987654321;\n&#abcdef0;\n&ThisIsNotDefined; &hi?;"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "&copy"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "&MadeUpEntity;"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/f%C3%B6%C3%B6",
+ "target": "_blank",
+ "class": null,
+ "title": "föö",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/f%C3%B6%C3%B6",
+ "target": "_blank",
+ "class": null,
+ "title": "föö",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "föö",
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "f&ouml;&ouml;"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "f&ouml;f&ouml;"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo*\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "* foo"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\tfoo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[a](url \"tit\")"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo ` bar"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "``"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": " `` "
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": " a"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": " b "
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_04__inlines__code_spans__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo bar baz"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo bar baz"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo\\"
+ },
+ {
+ "type": "text",
+ "text": "bar`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo`bar"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo `` bar"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[not a "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "link](/foo"
+ },
+ {
+ "type": "text",
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "<a href=\""
+ },
+ {
+ "type": "text",
+ "text": "\">`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "`",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "<http://foo.bar."
+ },
+ {
+ "type": "text",
+ "text": "baz>`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar.%60baz",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar.`baz"
+ },
+ {
+ "type": "text",
+ "text": "`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "```foo``"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "`foo"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "`foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a * foo bar*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a*\"foo\"*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "* a *"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "5"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "6"
+ },
+ {
+ "type": "text",
+ "text": "78"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_ foo bar_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a_\"foo\"_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo_bar_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "5_6_78"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "приÑтанÑм_ÑтремÑÑ‚ÑÑ_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aa_\"bb\"_cc"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo-"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(bar)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo bar *"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo bar\n*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*(*foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(foo"
+ },
+ {
+ "type": "text",
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_foo bar _"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_(_foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(foo"
+ },
+ {
+ "type": "text",
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_foo_bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_приÑтанÑм_ÑтремÑÑ‚ÑÑ"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo_bar_baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__027: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(bar)"
+ },
+ {
+ "type": "text",
+ "text": "."
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__028: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__029: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "** foo bar**"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__030: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a**\"foo\"**"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__031: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__032: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__033: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__ foo bar__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__034: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__\nfoo bar__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__035: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a__\"foo\"__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__036: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo__bar__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__037: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "5__6__78"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__038: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "приÑтанÑм__ÑтремÑÑ‚ÑÑ__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__039: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo, bar"
+ },
+ {
+ "type": "text",
+ "text": ", baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__040: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo-"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "(bar)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__041: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**foo bar **"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__042: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**(**foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__043: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "("
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__044: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "Gomphocarpus ("
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "Gomphocarpus physocarpus"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": ", syn.\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "Asclepias physocarpa"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__045: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo \""
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "\" foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__046: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__047: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__foo bar __"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__048: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__(__foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__049: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "("
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__050: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__foo__bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__051: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__приÑтанÑм__ÑтремÑÑ‚ÑÑ"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__052: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo__bar__baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__053: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "(bar)"
+ },
+ {
+ "type": "text",
+ "text": "."
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__054: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__055: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__056: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": " baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__057: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo bar"
+ },
+ {
+ "type": "text",
+ "text": " baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__058: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__059: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__060: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": " baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__061: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__062: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo**bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__063: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__064: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__065: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__066: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__067: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": "***baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__068: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar baz"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": " bim"
+ },
+ {
+ "type": "text",
+ "text": " bop"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__069: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__070: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "** is not an empty emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__071: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**** is not an empty strong emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__072: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__073: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__074: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": " baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__075: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ },
+ {
+ "type": "text",
+ "text": " baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__076: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__077: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__078: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": " baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__079: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__080: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__081: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__082: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar baz"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "\nbim"
+ },
+ {
+ "type": "text",
+ "text": " bop"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__083: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__084: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__ is not an empty emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__085: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "____ is not an empty strong emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__086: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ***"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__087: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__088: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__089: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo *****"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__090: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__091: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__092: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__093: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__094: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__095: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "***"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__096: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__097: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "***"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__098: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ___"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__099: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__100: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__101: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo _____"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__102: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__103: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__104: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__105: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__106: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__107: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "___"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__108: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__109: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "___"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__110: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__111: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__112: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__113: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__114: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__115: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__116: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__117: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__118: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__119: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo _bar"
+ },
+ {
+ "type": "text",
+ "text": " baz_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__120: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar *baz bim"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": " bam"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__121: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "bar baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__122: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__123: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__124: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__125: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "image",
+ "attrs": {
+ "src": "foo",
+ "alt": null,
+ "title": "*",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__126: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__127: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__128: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "a "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ },
+ {
+ "type": "code"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__129: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "a "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ },
+ {
+ "type": "code"
+ }
+ ],
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__130: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**a"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar/?q=**",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar/?q=**"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__131: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__a"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar/?q=__",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar/?q=__"
+ }
+ ]
+ }
+ ]
+ }
+06_06__inlines__strikethrough_extension__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "strike"
+ }
+ ],
+ "text": "Hi"
+ },
+ {
+ "type": "text",
+ "text": " Hello, world!"
+ }
+ ]
+ }
+ ]
+ }
+06_06__inlines__strikethrough_extension__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This ~~has a"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "new paragraph~~."
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](/my uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/my%20uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](foo\nbar)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link]("
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "b)c",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](<foo>)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[a](<b)c\n[a](<b)c>\n[a]("
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "c)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "(foo)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo(and(bar))",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo(and(bar)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo(and(bar)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo):",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "#fragment",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com#fragment",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com?foo=3#frag",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo%5Cbar",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo%20b%C3%A4",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "%22title%22",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "linklinklink"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title \"\"",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__023: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url%C2%A0%22title%22",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__024: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](/url \"title \"and\" title\")"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__025: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title \"and\" title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__026: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__027: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link] (/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__028: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [foo [bar]]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__029: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link] bar](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__030: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__031: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__032: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ },
+ {
+ "type": "code"
+ }
+ ],
+ "text": "#"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__033: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "moon.jpg",
+ "alt": "moon",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ },
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__034: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": "](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__035: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "[bar "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "baz"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "](/uri)"
+ },
+ {
+ "type": "text",
+ "text": "](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__036: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "uri3",
+ "alt": "[foo](uri2)",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__037: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__038: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "baz*",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo *bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__039: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo [bar"
+ },
+ {
+ "type": "text",
+ "text": " baz]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__040: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__041: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__042: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com/?search=%5D(uri)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com/?search=](uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__043: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__044: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [foo [bar]]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__045: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__046: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "bold"
+ },
+ {
+ "type": "italic"
+ },
+ {
+ "type": "code"
+ }
+ ],
+ "text": "#"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__047: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "moon.jpg",
+ "alt": "moon",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ },
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__048: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": "]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "ref"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__049: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "baz"
+ },
+ {
+ "type": "text",
+ "text": "]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "ref"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__050: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__051: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo *bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__052: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__053: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "][ref]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__054: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com/?search=%5D%5Bref%5D",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com/?search=][ref]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__055: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__056: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Толпой"
+ },
+ {
+ "type": "text",
+ "text": " is a Russian word."
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__057: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Baz"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__058: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo] "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__059: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__060: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__061: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[bar][foo!]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__062: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo][ref[]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[ref[]: /uri"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__063: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo][ref[bar]]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[ref[bar]]: /uri"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__064: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[[foo]]]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[[foo]]]: /url"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__065: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__066: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar\\"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__067: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[]: /uri"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__068: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[\n]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[\n]: /uri"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__069: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__070: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__071: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__072: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "\n[]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__073: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__074: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__075: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "["
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": " bar"
+ },
+ {
+ "type": "text",
+ "text": "]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__076: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[bar "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__077: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__078: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__079: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__080: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__081: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url2",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__082: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__083: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__084: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "(not a link)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__085: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__086: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url2",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__087: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "train.jpg",
+ "alt": "foo bar",
+ "title": "train & tracks",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url2",
+ "alt": "foo bar",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url2",
+ "alt": "foo bar",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "train.jpg",
+ "alt": "foo bar",
+ "title": "train & tracks",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "train.jpg",
+ "alt": "foo bar",
+ "title": "train & tracks",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "train.jpg",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "My "
+ },
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/path/to/train.jpg",
+ "alt": "foo bar",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "url",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo bar",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "Foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "text",
+ "text": "\n[]"
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo bar",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "![[foo]]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[foo]]: /url \"title\""
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "Foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "![foo]"
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__022: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "!"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "class": null,
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar.baz",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar.baz"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar.baz/test?q=hello&id=22&boolean",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar.baz/test?q=hello&id=22&boolean"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "irc://foo.bar:2233/baz",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "irc://foo.bar:2233/baz"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "MAILTO:FOO@BAR.BAZ",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "MAILTO:FOO@BAR.BAZ"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "a+b+c:d",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "a+b+c:d"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "made-up-scheme://foo,bar",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "made-up-scheme://foo,bar"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://../",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://../"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "localhost:5001/foo",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "localhost:5001/foo"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar/baz",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar/baz"
+ },
+ {
+ "type": "text",
+ "text": " bim>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com/%5C%5B%5C",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com/\\[\\"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:foo@bar.example.com",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo@bar.example.com"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:foo+special@Bar.baz-bar0.com",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo+special@Bar.baz-bar0.com"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:foo+@bar.example.com",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo+@bar.example.com"
+ },
+ {
+ "type": "text",
+ "text": ">"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "< "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar"
+ },
+ {
+ "type": "text",
+ "text": " >"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<m:abc>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<foo.bar.baz>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:foo@bar.example.com",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo@bar.example.com"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.commonmark.org",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.commonmark.org"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Visit "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.commonmark.org/help",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.commonmark.org/help"
+ },
+ {
+ "type": "text",
+ "text": " for more information."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Visit "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.commonmark.org",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.commonmark.org"
+ },
+ {
+ "type": "text",
+ "text": "."
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Visit "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.commonmark.org/a.b",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.commonmark.org/a.b"
+ },
+ {
+ "type": "text",
+ "text": "."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.google.com/search?q=Markup+(business)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.google.com/search?q=Markup+(business)"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.google.com/search?q=Markup+(business)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.google.com/search?q=Markup+(business)"
+ },
+ {
+ "type": "text",
+ "text": "))"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "("
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.google.com/search?q=Markup+(business)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.google.com/search?q=Markup+(business)"
+ },
+ {
+ "type": "text",
+ "text": ")"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "("
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.google.com/search?q=Markup+(business)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.google.com/search?q=Markup+(business)"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.google.com/search?q=(business))+ok",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.google.com/search?q=(business))+ok"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.google.com/search?q=commonmark&hl=en",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.google.com/search?q=commonmark&hl=en"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.google.com/search?q=commonmark",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.google.com/search?q=commonmark"
+ },
+ {
+ "type": "text",
+ "text": "&hl;"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://www.commonmark.org/he",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "www.commonmark.org/he"
+ },
+ {
+ "type": "text",
+ "text": "<lp"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://commonmark.org",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://commonmark.org"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "(Visit "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "https://encrypted.google.com/search?q=Markup+(business)",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "https://encrypted.google.com/search?q=Markup+(business)"
+ },
+ {
+ "type": "text",
+ "text": ")"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Anonymous FTP is available at ftp://foo.bar.baz."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:foo@bar.baz",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo@bar.baz"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "hello@mail+xyz.example isn't valid, but "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:hello+xyz@mail.example",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "hello+xyz@mail.example"
+ },
+ {
+ "type": "text",
+ "text": " is."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:a.b-c_d@a.b",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "a.b-c_d@a.b"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:a.b-c_d@a.b",
+ "target": "_blank",
+ "class": null,
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "a.b-c_d@a.b"
+ },
+ {
+ "type": "text",
+ "text": "."
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a.b-c_d@a.b-"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a.b-c_d@a.b_"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_11__inlines__raw_html__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_11__inlines__raw_html__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_11__inlines__raw_html__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_11__inlines__raw_html__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<33> <__>"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a h*#ref=\"hi\">"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a href=\"hi'> <a href=hi'>"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "< a><\nfoo><bar/ >\n<foo bar=baz\nbim!bop />"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a href='bar'title=title>"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_11__inlines__raw_html__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "</a href=\"foo\">"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo <!-- not a comment -- two hyphens -->"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo <!--> foo -->"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo <!-- foo--->"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__016: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__017: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__018: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo &<]]>"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__019: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__020: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__021: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a href=\"\"\">"
+ }
+ ]
+ }
+ ]
+ }
+06_12__inlines__disallowed_raw_html_extension__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__004: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__005: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__006: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__007: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__008: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "code span"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__009: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "code\\ span"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__010: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__011: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__012: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\\"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__013: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__014: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\\"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__015: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_14__inlines__soft_line_breaks__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_14__inlines__soft_line_breaks__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_15__inlines__textual_content__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "hello $.;'there"
+ }
+ ]
+ }
+ ]
+ }
+06_15__inlines__textual_content__002: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo χÏῆν"
+ }
+ ]
+ }
+ ]
+ }
+06_15__inlines__textual_content__003: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Multiple spaces"
+ }
+ ]
+ }
+ ]
+ }
+07_01__gitlab_specific_markdown__footnotes__001: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "footnote reference tag "
+ },
+ {
+ "type": "footnoteReference",
+ "attrs": {
+ "identifier": "1",
+ "label": "1"
+ }
+ }
+ ]
+ },
+ {
+ "type": "footnoteDefinition",
+ "attrs": {
+ "identifier": "1",
+ "label": "1"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "footnote text"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml
index 591148b41dd..b09a092c02a 100644
--- a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml
+++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml
@@ -10,5 +10,5 @@
skip_running_conformance_static_tests: false # NOT YET SUPPORTED
skip_running_conformance_wysiwyg_tests: false # NOT YET SUPPORTED
skip_running_snapshot_static_html_tests: false # NOT YET SUPPORTED
- skip_running_snapshot_wysiwyg_html_tests: false # NOT YET SUPPORTED
- skip_running_snapshot_prosemirror_json_tests: false # NOT YET SUPPORTED
+ skip_running_snapshot_wysiwyg_html_tests: false
+ skip_running_snapshot_prosemirror_json_tests: false
diff --git a/jest.config.base.js b/jest.config.base.js
index 452d58a185a..d4b1ace3b2c 100644
--- a/jest.config.base.js
+++ b/jest.config.base.js
@@ -57,6 +57,7 @@ module.exports = (path, options = {}) => {
[TEST_FIXTURES_PATTERN]: '<rootDir>/tmp/tests/frontend/fixtures$1',
'^test_fixtures_static(/.*)$': '<rootDir>/spec/frontend/fixtures/static$1',
'\\.(jpg|jpeg|png|svg|css)$': '<rootDir>/spec/frontend/__mocks__/file_mock.js',
+ '^public(/.*)$': '<rootDir>/public$1',
'emojis(/.*).json': '<rootDir>/fixtures/emojis$1.json',
'^spec/test_constants$': '<rootDir>/spec/frontend/__helpers__/test_constants',
'^jest/(.*)$': '<rootDir>/spec/frontend/$1',
@@ -172,8 +173,9 @@ module.exports = (path, options = {}) => {
'^.+_worker\\.js$': './spec/frontend/__helpers__/web_worker_transformer.js',
'^.+\\.js$': 'babel-jest',
'^.+\\.vue$': 'vue-jest',
- '^.+\\.yml$': './spec/frontend/__helpers__/yaml_transformer.js',
- '^.+\\.(md|zip|png)$': 'jest-raw-loader',
+ 'spec/frontend/editor/schema/ci/yaml_tests/.+\\.(yml|yaml)$':
+ './spec/frontend/__helpers__/yaml_transformer.js',
+ '^.+\\.(md|zip|png|yml|yaml)$': 'jest-raw-loader',
},
transformIgnorePatterns: [`node_modules/(?!(${transformIgnoreNodeModules.join('|')}))`],
timers: 'fake',
diff --git a/lefthook.yml b/lefthook.yml
index 161ce0b5155..8a3a0d8c2cb 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -59,6 +59,11 @@ pre-push:
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: 'doc/*.md'
run: scripts/lint-docs-metadata.sh {files}
+ docs-trailing_spaces: # Not enforced in CI/CD pipelines, but reduces the amount of required cleanup: https://gitlab.com/gitlab-org/technical-writing/-/blob/main/.gitlab/issue_templates/tw-monthly-tasks.md#remote-tasks
+ tags: documentation style
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
+ glob: 'doc/*.md'
+ run: yarn markdownlint:no-trailing-spaces {files}
docs-deprecations:
tags: documentation
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
@@ -67,5 +72,5 @@ pre-push:
docs-removals:
tags: documentation
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
- glob: 'data/removals/**/*.yml'
+ glob: 'data/removals/*.yml'
run: echo "Changes to removals files detected. Checking removals..\n"; bundle exec rake gitlab:docs:check_removals
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 8cafde4fedb..8827371546c 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -28,7 +28,8 @@ module API
Gitlab::GrapeLogging::Loggers::CorrelationIdLogger.new,
Gitlab::GrapeLogging::Loggers::ContextLogger.new,
Gitlab::GrapeLogging::Loggers::ContentLogger.new,
- Gitlab::GrapeLogging::Loggers::UrgencyLogger.new
+ Gitlab::GrapeLogging::Loggers::UrgencyLogger.new,
+ Gitlab::GrapeLogging::Loggers::ResponseLogger.new
]
allow_access_with_scope :api
@@ -242,6 +243,7 @@ module API
mount ::API::MergeRequestApprovals
mount ::API::MergeRequestDiffs
mount ::API::MergeRequests
+ mount ::API::Metadata
mount ::API::Metrics::Dashboard::Annotations
mount ::API::Metrics::UserStarredDashboards
mount ::API::Namespaces
@@ -313,6 +315,7 @@ module API
mount ::API::Internal::Lfs
mount ::API::Internal::Pages
mount ::API::Internal::Kubernetes
+ mount ::API::Internal::ErrorTracking
mount ::API::Internal::MailRoom
mount ::API::Internal::ContainerRegistry::Migration
mount ::API::Internal::Workhorse
diff --git a/lib/api/award_emoji.rb b/lib/api/award_emoji.rb
index c8485054377..fd36b364d56 100644
--- a/lib/api/award_emoji.rb
+++ b/lib/api/award_emoji.rb
@@ -6,8 +6,6 @@ module API
helpers ::API::Helpers::AwardEmoji
- before { authenticate! }
-
Helpers::AwardEmoji.awardables.each do |awardable_params|
resource awardable_params[:resource], requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
awardable_string = awardable_params[:type].pluralize
@@ -82,7 +80,7 @@ module API
delete "#{endpoint}/:award_id", feature_category: awardable_params[:feature_category] do
award = awardable.award_emoji.find(params[:award_id])
- unauthorized! unless award.user == current_user || current_user.admin?
+ unauthorized! unless award.user == current_user || current_user&.admin?
destroy_conditionally!(award)
end
diff --git a/lib/api/broadcast_messages.rb b/lib/api/broadcast_messages.rb
index b5d68ca5de2..e818cad0d03 100644
--- a/lib/api/broadcast_messages.rb
+++ b/lib/api/broadcast_messages.rb
@@ -4,7 +4,7 @@ module API
class BroadcastMessages < ::API::Base
include PaginationParams
- feature_category :navigation
+ feature_category :onboarding
urgency :low
resource :broadcast_messages do
diff --git a/lib/api/ci/helpers/runner.rb b/lib/api/ci/helpers/runner.rb
index 72e36d95dc5..fe49074afed 100644
--- a/lib/api/ci/helpers/runner.rb
+++ b/lib/api/ci/helpers/runner.rb
@@ -12,6 +12,7 @@ module API
JOB_TOKEN_PARAM = :token
def authenticate_runner!
+ track_runner_authentication
forbidden! unless current_runner
current_runner
@@ -42,6 +43,14 @@ module API
end
end
+ def track_runner_authentication
+ if current_runner
+ metrics.increment_runner_authentication_success_counter(runner_type: current_runner.runner_type)
+ else
+ metrics.increment_runner_authentication_failure_counter
+ end
+ end
+
# HTTP status codes to terminate the job on GitLab Runner:
# - 403
def authenticate_job!(require_running: true, heartbeat_runner: false)
@@ -149,6 +158,10 @@ module API
def request_using_running_job_token?
current_job.present? && current_authenticated_job.present? && current_job != current_authenticated_job
end
+
+ def metrics
+ strong_memoize(:metrics) { ::Gitlab::Ci::Runner::Metrics.new }
+ end
end
end
end
diff --git a/lib/api/commits.rb b/lib/api/commits.rb
index dedda82091f..5fd9a8e3278 100644
--- a/lib/api/commits.rb
+++ b/lib/api/commits.rb
@@ -139,7 +139,7 @@ module API
if find_user_from_warden
Gitlab::UsageDataCounters::WebIdeCounter.increment_commits_count
- Gitlab::UsageDataCounters::EditorUniqueCounter.track_web_ide_edit_action(author: current_user)
+ Gitlab::UsageDataCounters::EditorUniqueCounter.track_web_ide_edit_action(author: current_user, project: user_project)
end
present commit_detail, with: Entities::CommitDetail, stats: params[:stats]
diff --git a/lib/api/concerns/packages/conan_endpoints.rb b/lib/api/concerns/packages/conan_endpoints.rb
index d1cc35b16d8..a90269b565c 100644
--- a/lib/api/concerns/packages/conan_endpoints.rb
+++ b/lib/api/concerns/packages/conan_endpoints.rb
@@ -43,6 +43,7 @@ module API
end
before do
+ not_found! if Gitlab::FIPS.enabled?
require_packages_enabled!
# Personal access token will be extracted from Bearer or Basic authorization
diff --git a/lib/api/debian_group_packages.rb b/lib/api/debian_group_packages.rb
index 1f640cc17d0..8bf4ac22802 100644
--- a/lib/api/debian_group_packages.rb
+++ b/lib/api/debian_group_packages.rb
@@ -6,6 +6,10 @@ module API
project_id: %r{[0-9]+}.freeze
).freeze
+ before do
+ not_found! if Gitlab::FIPS.enabled?
+ end
+
resource :groups, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
helpers do
def user_project
diff --git a/lib/api/debian_project_packages.rb b/lib/api/debian_project_packages.rb
index 5fb11db8938..ca576254c3d 100644
--- a/lib/api/debian_project_packages.rb
+++ b/lib/api/debian_project_packages.rb
@@ -14,6 +14,10 @@ module API
file_name: API::NO_SLASH_URL_PART_REGEX
}.freeze
+ before do
+ not_found! if Gitlab::FIPS.enabled?
+ end
+
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
helpers do
def project_or_group
diff --git a/lib/api/entities/ci/job_request/service.rb b/lib/api/entities/ci/job_request/service.rb
index d9da2c92ec7..7d494c7e516 100644
--- a/lib/api/entities/ci/job_request/service.rb
+++ b/lib/api/entities/ci/job_request/service.rb
@@ -8,6 +8,7 @@ module API
expose :name, :entrypoint
expose :ports, using: Entities::Ci::JobRequest::Port
+ expose :pull_policy, if: ->(_) { ::Feature.enabled?(:ci_docker_image_pull_policy) }
expose :alias, :command
expose :variables
end
diff --git a/lib/api/entities/deploy_key.rb b/lib/api/entities/deploy_key.rb
index e8537c4c677..2c9c33549a1 100644
--- a/lib/api/entities/deploy_key.rb
+++ b/lib/api/entities/deploy_key.rb
@@ -4,7 +4,8 @@ module API
module Entities
class DeployKey < Entities::SSHKey
expose :key
- expose :fingerprint
+ expose :fingerprint, if: ->(key, _) { key.fingerprint.present? }
+ expose :fingerprint_sha256
expose :projects_with_write_access, using: Entities::ProjectIdentity, if: -> (_, options) { options[:include_projects_with_write_access] }
end
diff --git a/lib/api/entities/environment.rb b/lib/api/entities/environment.rb
index b1a720ac6bb..3b6ed94c3f1 100644
--- a/lib/api/entities/environment.rb
+++ b/lib/api/entities/environment.rb
@@ -4,48 +4,11 @@ module API
module Entities
class Environment < Entities::EnvironmentBasic
include RequestAwareEntity
- include Gitlab::Utils::StrongMemoize
expose :tier
expose :project, using: Entities::BasicProjectDetails
expose :last_deployment, using: Entities::Deployment, if: { last_deployment: true }
expose :state
-
- expose :enable_advanced_logs_querying, if: -> (*) { can_read_pod_logs? } do |environment|
- environment.elastic_stack_available?
- end
-
- expose :logs_api_path, if: -> (*) { can_read_pod_logs? } do |environment|
- if environment.elastic_stack_available?
- elasticsearch_project_logs_path(environment.project, environment_name: environment.name, format: :json)
- else
- k8s_project_logs_path(environment.project, environment_name: environment.name, format: :json)
- end
- end
-
- expose :gitlab_managed_apps_logs_path, if: -> (*) { can_read_pod_logs? && cluster } do |environment|
- ::Clusters::ClusterPresenter.new(cluster, current_user: current_user).gitlab_managed_apps_logs_path # rubocop: disable CodeReuse/Presenter
- end
-
- private
-
- alias_method :environment, :object
-
- def can_read_pod_logs?
- strong_memoize(:can_read_pod_logs) do
- current_user&.can?(:read_pod_logs, environment.project)
- end
- end
-
- def cluster
- strong_memoize(:cluster) do
- environment&.last_deployment&.cluster
- end
- end
-
- def current_user
- options[:current_user]
- end
end
end
end
diff --git a/lib/api/entities/group_detail.rb b/lib/api/entities/group_detail.rb
index e6872709432..e521de0d572 100644
--- a/lib/api/entities/group_detail.rb
+++ b/lib/api/entities/group_detail.rb
@@ -6,10 +6,12 @@ module API
expose :shared_with_groups do |group, options|
SharedGroupWithGroup.represent(group.shared_with_group_links_visible_to_user(options[:current_user]))
end
- expose :runners_token, if: lambda { |group, options| options[:user_can_admin_group] }
+ expose :runners_token, if: ->(_, options) { options[:user_can_admin_group] }
expose :prevent_sharing_groups_outside_hierarchy, if: ->(group) { group.root? }
- expose :projects, using: Entities::Project do |group, options|
+ expose :projects,
+ if: ->(_, options) { options[:with_projects] },
+ using: Entities::Project do |group, options|
projects = GroupProjectsFinder.new(
group: group,
current_user: options[:current_user],
@@ -19,7 +21,9 @@ module API
Entities::Project.prepare_relation(projects, options)
end
- expose :shared_projects, using: Entities::Project do |group, options|
+ expose :shared_projects,
+ if: ->(_, options) { options[:with_projects] },
+ using: Entities::Project do |group, options|
projects = GroupProjectsFinder.new(
group: group,
current_user: options[:current_user],
diff --git a/lib/api/entities/hook.rb b/lib/api/entities/hook.rb
index d176e76b321..95924321221 100644
--- a/lib/api/entities/hook.rb
+++ b/lib/api/entities/hook.rb
@@ -8,6 +8,11 @@ module API
expose :alert_status
expose :disabled_until
+ expose :url_variables
+
+ def url_variables
+ object.url_variables.keys.map { { key: _1 } }
+ end
end
end
end
diff --git a/lib/api/entities/issue.rb b/lib/api/entities/issue.rb
index 1060b2c517a..7630fd1e94e 100644
--- a/lib/api/entities/issue.rb
+++ b/lib/api/entities/issue.rb
@@ -31,9 +31,7 @@ module API
end
expose :closed_as_duplicate_of do |issue|
- if ::Feature.enabled?(:closed_as_duplicate_of_issues_api, issue.project) &&
- issue.duplicated? &&
- options[:current_user]&.can?(:read_issue, issue.duplicated_to)
+ if issue.duplicated? && options[:current_user]&.can?(:read_issue, issue.duplicated_to)
expose_url(
api_v4_project_issue_path(id: issue.duplicated_to.project_id, issue_iid: issue.duplicated_to.iid)
)
diff --git a/lib/api/entities/project.rb b/lib/api/entities/project.rb
index 9e216b0aed5..906c252d7f9 100644
--- a/lib/api/entities/project.rb
+++ b/lib/api/entities/project.rb
@@ -104,6 +104,7 @@ module API
expose :ci_forward_deployment_enabled
expose :ci_job_token_scope_enabled
expose :ci_separated_caches
+ expose :ci_opt_in_jwt
expose :public_builds, as: :public_jobs
expose :build_git_strategy, if: lambda { |project, options| options[:user_can_admin_project] } do |project, options|
project.build_allow_git_fetch ? 'fetch' : 'clone'
diff --git a/lib/api/entities/terraform/module_version.rb b/lib/api/entities/terraform/module_version.rb
new file mode 100644
index 00000000000..411fa09465e
--- /dev/null
+++ b/lib/api/entities/terraform/module_version.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Terraform
+ class ModuleVersion < Grape::Entity
+ expose :name
+ expose :provider
+ expose :providers
+ expose :root
+ expose :source
+ expose :submodules
+ expose :version
+ expose :versions
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/unleash/client_feature_flags.rb b/lib/api/entities/unleash/client_feature_flags.rb
new file mode 100644
index 00000000000..8c96d0610a4
--- /dev/null
+++ b/lib/api/entities/unleash/client_feature_flags.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Unleash
+ class ClientFeatureFlags < Grape::Entity
+ expose :unleash_api_version, as: :version
+ expose :unleash_api_features, as: :features, using: ::API::Entities::UnleashFeature
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/user.rb b/lib/api/entities/user.rb
index 2366d137cc2..a86039b856a 100644
--- a/lib/api/entities/user.rb
+++ b/lib/api/entities/user.rb
@@ -19,7 +19,7 @@ module API
user.followees.size
end
expose :is_followed, if: ->(user, opts) { Ability.allowed?(opts[:current_user], :read_user_profile, user) && opts[:current_user] } do |user, opts|
- opts[:current_user].following?(user)
+ user.followed_by?(opts[:current_user])
end
expose :local_time do |user|
local_time(user.timezone)
diff --git a/lib/api/feature_flags_user_lists.rb b/lib/api/feature_flags_user_lists.rb
index 854719db4a1..f4771c07260 100644
--- a/lib/api/feature_flags_user_lists.rb
+++ b/lib/api/feature_flags_user_lists.rb
@@ -44,9 +44,13 @@ module API
requires :user_xids, type: String, desc: 'A comma separated list of external user ids'
end
post do
+ # TODO: Move the business logic to a service class in app/services/feature_flags.
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/367021
list = user_project.operations_feature_flags_user_lists.create(declared_params)
if list.save
+ update_last_feature_flag_updated_at!
+
present list, with: ::API::Entities::FeatureFlag::UserList
else
render_api_error!(list.errors.full_messages, :bad_request)
@@ -76,9 +80,13 @@ module API
optional :user_xids, type: String, desc: 'A comma separated list of external user ids'
end
put do
+ # TODO: Move the business logic to a service class in app/services/feature_flags.
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/367021
list = user_project.operations_feature_flags_user_lists.find_by_iid!(params[:iid])
if list.update(declared_params(include_missing: false))
+ update_last_feature_flag_updated_at!
+
present list, with: ::API::Entities::FeatureFlag::UserList
else
render_api_error!(list.errors.full_messages, :bad_request)
@@ -89,8 +97,14 @@ module API
detail 'This feature was introduced in GitLab 12.10'
end
delete do
+ # TODO: Move the business logic to a service class in app/services/feature_flags.
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/367021
list = user_project.operations_feature_flags_user_lists.find_by_iid!(params[:iid])
- unless list.destroy
+ if list.destroy
+ update_last_feature_flag_updated_at!
+
+ nil
+ else
render_api_error!(list.errors.full_messages, :conflict)
end
end
@@ -101,6 +115,10 @@ module API
def authorize_admin_feature_flags_user_lists!
authorize! :admin_feature_flags_user_lists, user_project
end
+
+ def update_last_feature_flag_updated_at!
+ Operations::FeatureFlagsClient.update_last_feature_flag_updated_at!(user_project)
+ end
end
end
end
diff --git a/lib/api/geo.rb b/lib/api/geo.rb
index 85f242cd135..cb04d2a4e1e 100644
--- a/lib/api/geo.rb
+++ b/lib/api/geo.rb
@@ -8,7 +8,7 @@ module API
helpers do
# Overridden in EE
def geo_proxy_response
- {}
+ { geo_enabled: false }
end
end
diff --git a/lib/api/group_debian_distributions.rb b/lib/api/group_debian_distributions.rb
index f0376fe2c9c..1f43bb0e2b3 100644
--- a/lib/api/group_debian_distributions.rb
+++ b/lib/api/group_debian_distributions.rb
@@ -6,6 +6,10 @@ module API
requires :id, type: String, desc: 'The ID of a group'
end
+ before do
+ not_found! if Gitlab::FIPS.enabled?
+ end
+
resource :groups, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
after_validation do
require_packages_enabled!
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index c17bc432404..b63396ed073 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -109,6 +109,19 @@ module API
present paginate(groups), options
end
+ def present_group_details(params, group, with_projects: true)
+ options = {
+ with: Entities::GroupDetail,
+ with_projects: with_projects,
+ current_user: current_user,
+ user_can_admin_group: can?(current_user, :admin_group, group)
+ }
+
+ group, options = with_custom_attributes(group, options) if params[:with_custom_attributes]
+
+ present group, options
+ end
+
def present_groups_with_pagination_strategies(params, groups)
return present_groups(params, groups) if current_user.present?
@@ -236,7 +249,7 @@ module API
authorize! :admin_group, group
if update_group(group)
- present group, with: Entities::GroupDetail, current_user: current_user
+ present_group_details(params, group, with_projects: true)
else
render_validation_error!(group)
end
@@ -254,15 +267,7 @@ module API
group = find_group!(params[:id])
group.preload_shared_group_links
- options = {
- with: params[:with_projects] ? Entities::GroupDetail : Entities::Group,
- current_user: current_user,
- user_can_admin_group: can?(current_user, :admin_group, group)
- }
-
- group, options = with_custom_attributes(group, options)
-
- present group, options
+ present_group_details(params, group, with_projects: params[:with_projects])
end
desc 'Remove a group.'
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index fc1037131d8..e462ca19ba6 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -225,7 +225,11 @@ module API
def find_project_issue(iid, project_id = nil)
project = project_id ? find_project!(project_id) : user_project
- ::IssuesFinder.new(current_user, project_id: project.id).find_by!(iid: iid)
+ ::IssuesFinder.new(
+ current_user,
+ project_id: project.id,
+ issue_types: WorkItems::Type.allowed_types_for_issues
+ ).find_by!(iid: iid)
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -476,9 +480,9 @@ module API
render_api_error!('202 Accepted', 202)
end
- def render_validation_error!(model)
+ def render_validation_error!(model, status = 400)
if model.errors.any?
- render_api_error!(model_error_messages(model) || '400 Bad Request', 400)
+ render_api_error!(model_error_messages(model) || '400 Bad Request', status)
end
end
@@ -637,6 +641,7 @@ module API
:last_activity_after,
:last_activity_before,
:topic,
+ :topic_id,
:repository_storage)
.symbolize_keys
.compact
diff --git a/lib/api/helpers/integrations_helpers.rb b/lib/api/helpers/integrations_helpers.rb
index 0fbd0e6be44..0b0100c7d7f 100644
--- a/lib/api/helpers/integrations_helpers.rb
+++ b/lib/api/helpers/integrations_helpers.rb
@@ -633,6 +633,12 @@ module API
},
{
required: false,
+ name: :notify_only_default_branch,
+ type: Boolean,
+ desc: 'Send notifications only for the default branch'
+ },
+ {
+ required: false,
name: :branches_to_be_notified,
type: String,
desc: 'Branches for which notifications are to be sent'
diff --git a/lib/api/helpers/issues_helpers.rb b/lib/api/helpers/issues_helpers.rb
index 185a10a250c..47ea9c9fe2c 100644
--- a/lib/api/helpers/issues_helpers.rb
+++ b/lib/api/helpers/issues_helpers.rb
@@ -60,7 +60,7 @@ module API
args[:not][:label_name] ||= args[:not].delete(:labels)
args[:scope] = args[:scope].underscore if args[:scope]
args[:sort] = "#{args[:order_by]}_#{args[:sort]}"
- args[:issue_types] ||= args.delete(:issue_type)
+ args[:issue_types] ||= args.delete(:issue_type) || WorkItems::Type.allowed_types_for_issues
IssuesFinder.new(current_user, args)
end
diff --git a/lib/api/helpers/pagination_strategies.rb b/lib/api/helpers/pagination_strategies.rb
index 8c2186768ea..4e244ea589e 100644
--- a/lib/api/helpers/pagination_strategies.rb
+++ b/lib/api/helpers/pagination_strategies.rb
@@ -49,6 +49,7 @@ module API
offset_limit = limit_for_scope(request_scope)
if (Gitlab::Pagination::Keyset.available_for_type?(relation) ||
cursor_based_keyset_pagination_supported?(relation)) &&
+ cursor_based_keyset_pagination_enforced?(relation) &&
offset_limit_exceeded?(offset_limit)
return error!("Offset pagination has a maximum allowed offset of #{offset_limit} " \
@@ -63,6 +64,10 @@ module API
Gitlab::Pagination::CursorBasedKeyset.available_for_type?(relation)
end
+ def cursor_based_keyset_pagination_enforced?(relation)
+ Gitlab::Pagination::CursorBasedKeyset.enforced_for_type?(relation)
+ end
+
def keyset_pagination_enabled?
params[:pagination] == 'keyset'
end
diff --git a/lib/api/helpers/projects_helpers.rb b/lib/api/helpers/projects_helpers.rb
index 52cb398d6bf..3a518959b2c 100644
--- a/lib/api/helpers/projects_helpers.rb
+++ b/lib/api/helpers/projects_helpers.rb
@@ -96,6 +96,7 @@ module API
params :optional_update_params_ce do
optional :ci_forward_deployment_enabled, type: Boolean, desc: 'Skip older deployment jobs that are still pending'
+ optional :ci_separated_caches, type: Boolean, desc: 'Enable or disable separated caches based on branch protection.'
optional :restrict_user_defined_variables, type: Boolean, desc: 'Restrict use of user-defined variables when triggering a pipeline'
end
@@ -130,6 +131,7 @@ module API
:ci_config_path,
:ci_default_git_depth,
:ci_forward_deployment_enabled,
+ :ci_separated_caches,
:container_registry_access_level,
:container_expiration_policy_attributes,
:default_branch,
diff --git a/lib/api/helpers/protected_tags_helpers.rb b/lib/api/helpers/protected_tags_helpers.rb
new file mode 100644
index 00000000000..cad4ec8d5bd
--- /dev/null
+++ b/lib/api/helpers/protected_tags_helpers.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ module ProtectedTagsHelpers
+ extend ActiveSupport::Concern
+ extend Grape::API::Helpers
+
+ params :optional_params_ee do
+ end
+ end
+ end
+end
+
+API::Helpers::ProtectedTagsHelpers.prepend_mod_with('API::Helpers::ProtectedTagsHelpers')
diff --git a/lib/api/helpers/web_hooks_helpers.rb b/lib/api/helpers/web_hooks_helpers.rb
new file mode 100644
index 00000000000..a71e56af4c3
--- /dev/null
+++ b/lib/api/helpers/web_hooks_helpers.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ module WebHooksHelpers
+ extend Grape::API::Helpers
+
+ params :requires_url do
+ requires :url, type: String, desc: "The URL to send the request to"
+ end
+
+ params :optional_url do
+ optional :url, type: String, desc: "The URL to send the request to"
+ end
+
+ params :url_variables do
+ optional :url_variables, type: Array, desc: 'URL variables for interpolation' do
+ requires :key, type: String, desc: 'Name of the variable'
+ requires :value, type: String, desc: 'Value of the variable'
+ end
+ end
+
+ def find_hook
+ hook_scope.find(params.delete(:hook_id))
+ end
+
+ def create_hook_params
+ hook_params = declared_params(include_missing: false)
+ url_variables = hook_params.delete(:url_variables)
+
+ if url_variables.present?
+ hook_params[:url_variables] = url_variables.to_h { [_1[:key], _1[:value]] }
+ end
+
+ hook_params
+ end
+
+ def update_hook(entity:)
+ hook = find_hook
+ update_params = update_hook_params(hook)
+
+ hook.assign_attributes(update_params)
+
+ save_hook(hook, entity)
+ end
+
+ def update_hook_params(hook)
+ update_params = declared_params(include_missing: false)
+ url_variables = update_params.delete(:url_variables) || []
+ url_variables = url_variables.to_h { [_1[:key], _1[:value]] }
+ update_params[:url_variables] = hook.url_variables.merge(url_variables) if url_variables.present?
+
+ error!('No parameters provided', :bad_request) if update_params.empty?
+
+ update_params
+ end
+
+ def save_hook(hook, entity)
+ if hook.save
+ present hook, with: entity
+ else
+ error!("Invalid url given", 422) if hook.errors[:url].present?
+ error!("Invalid branch filter given", 422) if hook.errors[:push_events_branch_filter].present?
+
+ render_validation_error!(hook, 422)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/hooks/test.rb b/lib/api/hooks/test.rb
new file mode 100644
index 00000000000..4871955c6e0
--- /dev/null
+++ b/lib/api/hooks/test.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module API
+ module Hooks
+ # It is important that this re-usable module is not a Grape Instance,
+ # since it will be re-mounted.
+ # rubocop: disable API/Base
+ class Test < ::Grape::API
+ params do
+ requires :hook_id, type: Integer, desc: 'The ID of the hook'
+ end
+ post ":hook_id" do
+ hook = find_hook
+ data = configuration[:data].dup
+ hook.execute(data, configuration[:kind])
+ data
+ end
+ end
+ # rubocop: enable API/Base
+ end
+end
diff --git a/lib/api/hooks/url_variables.rb b/lib/api/hooks/url_variables.rb
new file mode 100644
index 00000000000..708b78134e5
--- /dev/null
+++ b/lib/api/hooks/url_variables.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module API
+ module Hooks
+ # It is important that this re-usable module is not a Grape Instance,
+ # since it will be re-mounted.
+ # rubocop: disable API/Base
+ class UrlVariables < ::Grape::API
+ params do
+ requires :hook_id, type: Integer, desc: 'The ID of the hook'
+ requires :key, type: String, desc: 'The key of the variable'
+ end
+ namespace ':hook_id/url_variables' do
+ desc 'Set a url variable'
+ params do
+ requires :value, type: String, desc: 'The value of the variable'
+ end
+ put ":key" do
+ hook = find_hook
+ key = params.delete(:key)
+ value = params.delete(:value)
+ vars = hook.url_variables.merge(key => value)
+
+ error!('Illegal key or value', 422) unless hook.update(url_variables: vars)
+
+ status :no_content
+ end
+
+ desc 'Un-Set a url variable'
+ delete ":key" do
+ hook = find_hook
+ key = params.delete(:key)
+ not_found!('URL variable') unless hook.url_variables.key?(key)
+
+ vars = hook.url_variables.reject { _1 == key }
+
+ error!('Could not unset variable', 422) unless hook.update(url_variables: vars)
+
+ status :no_content
+ end
+ end
+ end
+ # rubocop: enable API/Base
+ end
+end
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index 3edd38a0108..b53f855c3a2 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -164,18 +164,6 @@ module API
check_allowed(params)
end
- post '/error_tracking_allowed', feature_category: :error_tracking do
- public_key = params[:public_key]
- project_id = params[:project_id]
-
- unprocessable_entity! if public_key.blank? || project_id.blank?
-
- enabled = ::ErrorTracking::ClientKey.enabled_key_for(project_id, public_key).exists?
-
- status 200
- { enabled: enabled }
- end
-
post "/lfs_authenticate", feature_category: :source_code_management, urgency: :high do
not_found! unless container&.lfs_enabled?
diff --git a/lib/api/internal/error_tracking.rb b/lib/api/internal/error_tracking.rb
new file mode 100644
index 00000000000..bad790b0e43
--- /dev/null
+++ b/lib/api/internal/error_tracking.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module API
+ module Internal
+ class ErrorTracking < ::API::Base
+ GITLAB_ERROR_TRACKING_TOKEN_HEADER = "Gitlab-Error-Tracking-Token"
+
+ feature_category :error_tracking
+
+ helpers do
+ def verify_error_tracking_token!
+ input = params['error_tracking_token']
+
+ if headers.key?(GITLAB_ERROR_TRACKING_TOKEN_HEADER)
+ input ||= Base64.decode64(headers[GITLAB_ERROR_TRACKING_TOKEN_HEADER])
+ end
+
+ input&.chomp!
+
+ unauthorized! unless Devise.secure_compare(error_tracking_token, input)
+ end
+
+ def error_tracking_token
+ Gitlab::CurrentSettings.error_tracking_access_token
+ end
+
+ def error_tracking_enabled?
+ Gitlab::CurrentSettings.error_tracking_enabled
+ end
+ end
+
+ namespace 'internal' do
+ namespace 'error_tracking' do
+ before do
+ verify_error_tracking_token!
+ end
+
+ post '/allowed', urgency: :high do
+ public_key = params[:public_key]
+ project_id = params[:project_id]
+
+ unprocessable_entity! if public_key.blank? || project_id.blank?
+
+ project = Project.find(project_id)
+ enabled = error_tracking_enabled? &&
+ Feature.enabled?(:use_click_house_database_for_error_tracking, project) &&
+ ::ErrorTracking::ClientKey.enabled_key_for(project_id, public_key).exists?
+
+ status 200
+ { enabled: enabled }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/internal/kubernetes.rb b/lib/api/internal/kubernetes.rb
index 34acfac4cb1..f7c6e48e54f 100644
--- a/lib/api/internal/kubernetes.rb
+++ b/lib/api/internal/kubernetes.rb
@@ -38,7 +38,6 @@ module API
def gitaly_repository(project)
{
- default_branch: project.default_branch_or_main,
storage_name: project.repository_storage,
relative_path: project.disk_path + '.git',
gl_repository: repo_type.identifier_for_container(project),
@@ -76,7 +75,8 @@ module API
agent_id: agent.id,
agent_name: agent.name,
gitaly_info: gitaly_info(project),
- gitaly_repository: gitaly_repository(project)
+ gitaly_repository: gitaly_repository(project),
+ default_branch: project.default_branch_or_main
}
end
end
diff --git a/lib/api/internal/pages.rb b/lib/api/internal/pages.rb
index 8eaeeae26c2..20ca7038471 100644
--- a/lib/api/internal/pages.rb
+++ b/lib/api/internal/pages.rb
@@ -54,7 +54,15 @@ module API
virtual_domain = host.pages_virtual_domain
no_content! unless virtual_domain
- present virtual_domain, with: Entities::Internal::Pages::VirtualDomain
+ if virtual_domain.cache_key.present?
+ # Cache context is not added to make it easier to expire the cache with
+ # Gitlab::Pages::CacheControl
+ present_cached virtual_domain,
+ cache_context: nil,
+ with: Entities::Internal::Pages::VirtualDomain
+ else
+ present virtual_domain, with: Entities::Internal::Pages::VirtualDomain
+ end
end
end
end
diff --git a/lib/api/maven_packages.rb b/lib/api/maven_packages.rb
index 2fed724f947..e2481dcb8c1 100644
--- a/lib/api/maven_packages.rb
+++ b/lib/api/maven_packages.rb
@@ -35,6 +35,8 @@ module API
name, _, format = file_name.rpartition('.')
if %w(md5 sha1).include?(format)
+ unprocessable_entity! if Gitlab::FIPS.enabled? && format == 'md5'
+
[name, format]
else
[file_name, format]
@@ -109,6 +111,7 @@ module API
route_setting :authentication, job_token_allowed: true, deploy_token_allowed: true
get 'packages/maven/*path/:file_name', requirements: MAVEN_ENDPOINT_REQUIREMENTS do
# return a similar failure to authorize_read_package!(project)
+
forbidden! unless path_exists?(params[:path])
file_name, format = extract_format(params[:file_name])
@@ -241,6 +244,7 @@ module API
end
route_setting :authentication, job_token_allowed: true, deploy_token_allowed: true
put ':id/packages/maven/*path/:file_name', requirements: MAVEN_ENDPOINT_REQUIREMENTS do
+ unprocessable_entity! if Gitlab::FIPS.enabled? && params['file.md5']
authorize_upload!
bad_request!('File is too large') if user_project.actual_limits.exceeded?(:maven_max_file_size, params[:file].size)
diff --git a/lib/api/metadata.rb b/lib/api/metadata.rb
new file mode 100644
index 00000000000..c4984f0e7f0
--- /dev/null
+++ b/lib/api/metadata.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module API
+ class Metadata < ::API::Base
+ helpers ::API::Helpers::GraphqlHelpers
+ include APIGuard
+
+ allow_access_with_scope :read_user, if: -> (request) { request.get? || request.head? }
+
+ before { authenticate! }
+
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
+
+ METADATA_QUERY = <<~EOF
+ {
+ metadata {
+ version
+ revision
+ kas {
+ enabled
+ externalUrl
+ version
+ }
+ }
+ }
+ EOF
+
+ desc 'Get the metadata information of the GitLab instance.' do
+ detail 'This feature was introduced in GitLab 15.2.'
+ end
+ get '/metadata' do
+ run_graphql!(
+ query: METADATA_QUERY,
+ context: { current_user: current_user },
+ transform: ->(result) { result.dig('data', 'metadata') }
+ )
+ end
+ end
+end
diff --git a/lib/api/project_debian_distributions.rb b/lib/api/project_debian_distributions.rb
index 2ba1ff85adb..b8ca9428fa3 100644
--- a/lib/api/project_debian_distributions.rb
+++ b/lib/api/project_debian_distributions.rb
@@ -6,6 +6,10 @@ module API
requires :id, type: String, desc: 'The ID of a project'
end
+ before do
+ not_found! if Gitlab::FIPS.enabled?
+ end
+
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
after_validation do
require_packages_enabled!
diff --git a/lib/api/project_hooks.rb b/lib/api/project_hooks.rb
index 431ba199131..466e80d68c8 100644
--- a/lib/api/project_hooks.rb
+++ b/lib/api/project_hooks.rb
@@ -9,16 +9,21 @@ module API
feature_category :integrations
+ helpers ::API::Helpers::WebHooksHelpers
+
helpers do
- params :project_hook_properties do
- requires :url, type: String, desc: "The URL to send the request to"
+ def hook_scope
+ user_project.hooks
+ end
+
+ params :common_hook_parameters do
optional :push_events, type: Boolean, desc: "Trigger hook on push events"
optional :issues_events, type: Boolean, desc: "Trigger hook on issues events"
optional :confidential_issues_events, type: Boolean, desc: "Trigger hook on confidential issues events"
optional :merge_requests_events, type: Boolean, desc: "Trigger hook on merge request events"
optional :tag_push_events, type: Boolean, desc: "Trigger hook on tag push events"
- optional :note_events, type: Boolean, desc: "Trigger hook on note(comment) events"
- optional :confidential_note_events, type: Boolean, desc: "Trigger hook on confidential note(comment) events"
+ optional :note_events, type: Boolean, desc: "Trigger hook on note (comment) events"
+ optional :confidential_note_events, type: Boolean, desc: "Trigger hook on confidential note (comment) events"
optional :job_events, type: Boolean, desc: "Trigger hook on job events"
optional :pipeline_events, type: Boolean, desc: "Trigger hook on pipeline events"
optional :wiki_page_events, type: Boolean, desc: "Trigger hook on wiki events"
@@ -27,6 +32,7 @@ module API
optional :enable_ssl_verification, type: Boolean, desc: "Do SSL verification when triggering the hook"
optional :token, type: String, desc: "Secret token to validate received payloads; this will not be returned in the response"
optional :push_events_branch_filter, type: String, desc: "Trigger hook on specified branch only"
+ use :url_variables
end
end
@@ -34,6 +40,10 @@ module API
requires :id, type: String, desc: 'The ID of a project'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ namespace ':id/hooks' do
+ mount ::API::Hooks::UrlVariables
+ end
+
desc 'Get project hooks' do
success Entities::ProjectHook
end
@@ -59,43 +69,26 @@ module API
success Entities::ProjectHook
end
params do
- use :project_hook_properties
+ use :requires_url
+ use :common_hook_parameters
end
post ":id/hooks" do
- hook_params = declared_params(include_missing: false)
-
+ hook_params = create_hook_params
hook = user_project.hooks.new(hook_params)
- if hook.save
- present hook, with: Entities::ProjectHook
- else
- error!("Invalid url given", 422) if hook.errors[:url].present?
- error!("Invalid branch filter given", 422) if hook.errors[:push_events_branch_filter].present?
-
- not_found!("Project hook #{hook.errors.messages}")
- end
+ save_hook(hook, Entities::ProjectHook)
end
- desc 'Update an existing project hook' do
+ desc 'Update an existing hook' do
success Entities::ProjectHook
end
params do
requires :hook_id, type: Integer, desc: "The ID of the hook to update"
- use :project_hook_properties
+ use :optional_url
+ use :common_hook_parameters
end
put ":id/hooks/:hook_id" do
- hook = user_project.hooks.find(params.delete(:hook_id))
-
- update_params = declared_params(include_missing: false)
-
- if hook.update(update_params)
- present hook, with: Entities::ProjectHook
- else
- error!("Invalid url given", 422) if hook.errors[:url].present?
- error!("Invalid branch filter given", 422) if hook.errors[:push_events_branch_filter].present?
-
- not_found!("Project hook #{hook.errors.messages}")
- end
+ update_hook(entity: Entities::ProjectHook)
end
desc 'Deletes project hook' do
@@ -105,7 +98,7 @@ module API
requires :hook_id, type: Integer, desc: 'The ID of the hook to delete'
end
delete ":id/hooks/:hook_id" do
- hook = user_project.hooks.find(params.delete(:hook_id))
+ hook = find_hook
destroy_conditionally!(hook) do
WebHooks::DestroyService.new(current_user).execute(hook)
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 44b1acaca88..6530887c1c3 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -134,6 +134,7 @@ module API
optional :last_activity_before, type: DateTime, desc: 'Limit results to projects with last_activity before specified time. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ'
optional :repository_storage, type: String, desc: 'Which storage shard the repository is on. Available only to admins'
optional :topic, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, desc: 'Comma-separated list of topics. Limit results to projects having all topics'
+ optional :topic_id, type: Integer, desc: 'Limit results to projects with the assigned topic given by the topic ID'
use :optional_filter_params_ee
end
diff --git a/lib/api/protected_tags.rb b/lib/api/protected_tags.rb
index b9385df1f8d..4611ee58479 100644
--- a/lib/api/protected_tags.rb
+++ b/lib/api/protected_tags.rb
@@ -10,6 +10,8 @@ module API
feature_category :source_code_management
+ helpers Helpers::ProtectedTagsHelpers
+
params do
requires :id, type: String, desc: 'The ID of a project'
end
@@ -50,14 +52,15 @@ module API
end
params do
requires :name, type: String, desc: 'The name of the protected tag'
- optional :create_access_level, type: Integer, default: Gitlab::Access::MAINTAINER,
+ optional :create_access_level, type: Integer,
values: ProtectedTag::CreateAccessLevel.allowed_access_levels,
desc: 'Access levels allowed to create (defaults: `40`, maintainer access level)'
+ use :optional_params_ee
end
post ':id/protected_tags' do
protected_tags_params = {
name: params[:name],
- create_access_levels_attributes: [{ access_level: params[:create_access_level] }]
+ create_access_levels_attributes: ::ProtectedRefs::AccessLevelParams.new(:create, params).access_levels
}
protected_tag = ::ProtectedTags::CreateService.new(user_project,
diff --git a/lib/api/pypi_packages.rb b/lib/api/pypi_packages.rb
index 5bf3c3b8aac..ae53f08fb1d 100644
--- a/lib/api/pypi_packages.rb
+++ b/lib/api/pypi_packages.rb
@@ -217,6 +217,8 @@ module API
track_package_event('push_package', :pypi, project: authorized_user_project, user: current_user, namespace: authorized_user_project.namespace)
+ unprocessable_entity! if Gitlab::FIPS.enabled? && declared_params[:md5_digest].present?
+
::Packages::Pypi::CreatePackageService
.new(authorized_user_project, current_user, declared_params.merge(build: current_authenticated_job))
.execute
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index 2e21f591667..4c7cc6be8b6 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -238,6 +238,10 @@ module API
end
params do
use :release_params
+
+ optional :config_file,
+ type: String,
+ desc: "The file path to the configuration file as stored in the project's Git repository. Defaults to '.gitlab/changelog_config.yml'"
end
get ':id/repository/changelog' do
service = ::Repositories::ChangelogService.new(
@@ -262,6 +266,10 @@ module API
type: String,
desc: 'The branch to commit the changelog changes to'
+ optional :config_file,
+ type: String,
+ desc: "The file path to the configuration file as stored in the project's Git repository. Defaults to '.gitlab/changelog_config.yml'"
+
optional :file,
type: String,
desc: 'The file to commit the changelog changes to',
diff --git a/lib/api/snippets.rb b/lib/api/snippets.rb
index 496532a15b2..4e70ebddf94 100644
--- a/lib/api/snippets.rb
+++ b/lib/api/snippets.rb
@@ -29,12 +29,16 @@ module API
success Entities::Snippet
end
params do
+ optional :created_after, type: DateTime, desc: 'Return snippets created after the specified time'
+ optional :created_before, type: DateTime, desc: 'Return snippets created before the specified time'
+
use :pagination
end
get do
authenticate!
- present paginate(snippets_for_current_user), with: Entities::Snippet, current_user: current_user
+ filter_params = declared_params(include_missing: false).merge(author: current_user)
+ present paginate(SnippetsFinder.new(current_user, filter_params).execute), with: Entities::Snippet, current_user: current_user
end
desc 'List all public personal snippets current_user has access to' do
@@ -42,12 +46,16 @@ module API
success Entities::PersonalSnippet
end
params do
+ optional :created_after, type: DateTime, desc: 'Return snippets created after the specified time'
+ optional :created_before, type: DateTime, desc: 'Return snippets created before the specified time'
+
use :pagination
end
get 'public', urgency: :low do
authenticate!
- present paginate(public_snippets), with: Entities::PersonalSnippet, current_user: current_user
+ filter_params = declared_params(include_missing: false).merge(only_personal: true)
+ present paginate(SnippetsFinder.new(nil, filter_params).execute), with: Entities::PersonalSnippet, current_user: current_user
end
desc 'Get a single snippet' do
diff --git a/lib/api/system_hooks.rb b/lib/api/system_hooks.rb
index 7c91fbd36d9..804cedfefe9 100644
--- a/lib/api/system_hooks.rb
+++ b/lib/api/system_hooks.rb
@@ -11,7 +11,27 @@ module API
authenticated_as_admin!
end
+ helpers ::API::Helpers::WebHooksHelpers
+
+ helpers do
+ def hook_scope
+ SystemHook
+ end
+
+ params :hook_parameters do
+ optional :token, type: String, desc: 'The token used to validate payloads'
+ 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"
+ use :url_variables
+ end
+ end
+
resource :hooks do
+ mount ::API::Hooks::UrlVariables
+
desc 'Get the list of system hooks' do
success Entities::Hook
end
@@ -26,70 +46,63 @@ module API
success Entities::Hook
end
params do
- requires :id, type: Integer, desc: 'The ID of the system hook'
+ requires :hook_id, type: Integer, desc: 'The ID of the system hook'
end
- get ":id" do
- hook = SystemHook.find(params[:id])
-
- present hook, with: Entities::Hook
+ get ":hook_id" do
+ present find_hook, with: Entities::Hook
end
desc 'Create a new system hook' do
success Entities::Hook
end
params do
- requires :url, type: String, desc: "The URL to send the request to"
- optional :token, type: String, desc: 'The token used to validate payloads'
- 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"
+ use :requires_url
+ use :hook_parameters
end
post do
- hook = SystemHook.new(declared_params(include_missing: false))
+ hook_params = create_hook_params
+ hook = SystemHook.new(hook_params)
- if hook.save
- present hook, with: Entities::Hook
- else
- render_validation_error!(hook)
- end
+ save_hook(hook, Entities::Hook)
end
- desc 'Test a hook'
+ desc 'Update an existing system hook' do
+ success Entities::Hook
+ end
params do
- requires :id, type: Integer, desc: 'The ID of the system hook'
+ requires :hook_id, type: Integer, desc: "The ID of the hook to update"
+ use :optional_url
+ use :hook_parameters
end
- post ":id" do
- hook = SystemHook.find(params[:id])
- data = {
+ put ":hook_id" do
+ update_hook(entity: Entities::Hook)
+ end
+
+ mount ::API::Hooks::Test, with: {
+ data: {
event_name: "project_create",
name: "Ruby",
path: "ruby",
project_id: 1,
owner_name: "Someone",
owner_email: "example@gitlabhq.com"
- }
- hook.execute(data, 'system_hooks')
- data
- end
+ },
+ kind: 'system_hooks'
+ }
desc 'Delete a hook' do
success Entities::Hook
end
params do
- requires :id, type: Integer, desc: 'The ID of the system hook'
+ requires :hook_id, type: Integer, desc: 'The ID of the system hook'
end
- # rubocop: disable CodeReuse/ActiveRecord
- delete ":id" do
- hook = SystemHook.find_by(id: params[:id])
- not_found!('System hook') unless hook
+ delete ":hook_id" do
+ hook = find_hook
destroy_conditionally!(hook) do
WebHooks::DestroyService.new(current_user).execute(hook)
end
end
- # rubocop: enable CodeReuse/ActiveRecord
end
end
end
diff --git a/lib/api/tags.rb b/lib/api/tags.rb
index 0fa8c21f8d7..97a2aebf53b 100644
--- a/lib/api/tags.rb
+++ b/lib/api/tags.rb
@@ -6,7 +6,11 @@ module API
TAG_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(tag_name: API::NO_SLASH_URL_PART_REGEX)
- before { authorize! :download_code, user_project }
+ before do
+ authorize! :download_code, user_project
+
+ not_found! unless user_project.repo_exists?
+ end
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/terraform/modules/v1/packages.rb b/lib/api/terraform/modules/v1/packages.rb
index f96cffb008c..267d41e5fb9 100644
--- a/lib/api/terraform/modules/v1/packages.rb
+++ b/lib/api/terraform/modules/v1/packages.rb
@@ -97,6 +97,33 @@ module API
present presenter, with: ::API::Entities::Terraform::ModuleVersions
end
+ get 'download' do
+ latest_version = packages.order_version.last&.version
+
+ render_api_error!({ error: "No version found for #{params[:module_name]} module" }, :not_found) if latest_version.nil?
+
+ download_path = api_v4_packages_terraform_modules_v1_module_version_download_path(
+ {
+ module_namespace: params[:module_namespace],
+ module_name: params[:module_name],
+ module_system: params[:module_system],
+ module_version: latest_version
+ },
+ true
+ )
+
+ redirect(download_path)
+ end
+
+ get do
+ latest_package = packages.order_version.last
+
+ render_api_error!({ error: "No version found for #{params[:module_name]} module" }, :not_found) if latest_package&.version.nil?
+
+ presenter = ::Terraform::ModuleVersionPresenter.new(latest_package, params[:module_system])
+ present presenter, with: ::API::Entities::Terraform::ModuleVersion
+ end
+
params do
includes :module_version
end
@@ -133,6 +160,16 @@ module API
present_carrierwave_file!(package_file.file)
end
end
+
+ # This endpoint has to be the last within namespace '*module_version' block
+ # due to how the route matching works in grape
+ # format: false is required, otherwise grape splits the semver version into 2 params:
+ # params[:module_version] and params[:format],
+ # thus leading to an invalid/not found module version
+ get format: false do
+ presenter = ::Terraform::ModuleVersionPresenter.new(package, params[:module_system])
+ present presenter, with: ::API::Entities::Terraform::ModuleVersion
+ end
end
end
diff --git a/lib/api/terraform/state.rb b/lib/api/terraform/state.rb
index b727fbd9f65..a19919b5e76 100644
--- a/lib/api/terraform/state.rb
+++ b/lib/api/terraform/state.rb
@@ -81,7 +81,7 @@ module API
delete do
authorize! :admin_terraform_state, user_project
- remote_state_handler.handle_with_lock do |state|
+ remote_state_handler.find_with_lock do |state|
::Terraform::States::TriggerDestroyService.new(state, current_user: current_user).execute
end
diff --git a/lib/api/unleash.rb b/lib/api/unleash.rb
index 37fe540cde1..2d528ad47a2 100644
--- a/lib/api/unleash.rb
+++ b/lib/api/unleash.rb
@@ -25,14 +25,22 @@ module API
desc 'Get a list of features (deprecated, v2 client support)'
get 'features' do
- present :version, 1
- present :features, feature_flags, with: ::API::Entities::UnleashFeature
+ if ::Feature.enabled?(:cache_unleash_client_api, project)
+ present_feature_flags
+ else
+ present :version, 1
+ present :features, feature_flags, with: ::API::Entities::UnleashFeature
+ end
end
desc 'Get a list of features'
get 'client/features' do
- present :version, 1
- present :features, feature_flags, with: ::API::Entities::UnleashFeature
+ if ::Feature.enabled?(:cache_unleash_client_api, project)
+ present_feature_flags
+ else
+ present :version, 1
+ present :features, feature_flags, with: ::API::Entities::UnleashFeature
+ end
end
post 'client/register' do
@@ -49,10 +57,24 @@ module API
end
helpers do
+ def present_feature_flags
+ present_cached feature_flags_client,
+ with: ::API::Entities::Unleash::ClientFeatureFlags,
+ cache_context: -> (client) { client.unleash_api_cache_key }
+ end
+
def project
@project ||= find_project(params[:project_id])
end
+ def feature_flags_client
+ strong_memoize(:feature_flags_client) do
+ client = Operations::FeatureFlagsClient.find_for_project_and_token(project, unleash_instance_id)
+ client.unleash_app_name = unleash_app_name if client
+ client
+ end
+ end
+
def unleash_instance_id
env['HTTP_UNLEASH_INSTANCEID'] || params[:instance_id]
end
@@ -62,8 +84,7 @@ module API
end
def authorize_by_unleash_instance_id!
- unauthorized! unless Operations::FeatureFlagsClient
- .find_for_project_and_token(project, unleash_instance_id)
+ unauthorized! unless feature_flags_client
end
def feature_flags
diff --git a/lib/api/usage_data.rb b/lib/api/usage_data.rb
index 6e81a578d4a..9e446aff605 100644
--- a/lib/api/usage_data.rb
+++ b/lib/api/usage_data.rb
@@ -29,7 +29,7 @@ module API
params do
requires :event, type: String, desc: 'The event name that should be tracked'
end
- post 'increment_unique_users' do
+ post 'increment_unique_users', urgency: :low do
event_name = params[:event]
increment_unique_values(event_name, current_user.id)
diff --git a/lib/api/users.rb b/lib/api/users.rb
index 93df9413119..d66d86a9055 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -125,7 +125,7 @@ module API
entity = current_user&.admin? ? Entities::UserWithAdmin : Entities::UserBasic
if entity == Entities::UserWithAdmin
- users = users.preload(:identities, :u2f_registrations, :webauthn_registrations, :namespace)
+ users = users.preload(:identities, :u2f_registrations, :webauthn_registrations, :namespace, :followers, :followees, :user_preference)
end
users, options = with_custom_attributes(users, { with: entity, current_user: current_user })
@@ -325,6 +325,30 @@ module API
end
# rubocop: enable CodeReuse/ActiveRecord
+ desc "Disable two factor authentication for a user. Available only for admins" do
+ detail 'This feature was added in GitLab 15.2'
+ success Entities::UserWithAdmin
+ end
+ params do
+ requires :id, type: Integer, desc: 'The ID of the user'
+ end
+ patch ":id/disable_two_factor", feature_category: :authentication_and_authorization do
+ authenticated_as_admin!
+
+ user = User.find_by_id(params[:id])
+ not_found!('User') unless user
+
+ forbidden!('Two-factor authentication for admins cannot be disabled via the API. Use the Rails console') if user.admin?
+
+ result = TwoFactor::DestroyService.new(current_user, user: user).execute
+
+ if result[:status] == :success
+ no_content!
+ else
+ bad_request!(result[:message])
+ end
+ end
+
desc "Delete a user's identity. Available only for admins" do
success Entities::UserWithAdmin
end
@@ -1260,3 +1284,5 @@ module API
end
end
end
+
+API::Users.prepend_mod
diff --git a/lib/backup/gitaly_backup.rb b/lib/backup/gitaly_backup.rb
index 077eabdd131..a995f308c2b 100644
--- a/lib/backup/gitaly_backup.rb
+++ b/lib/backup/gitaly_backup.rb
@@ -96,8 +96,8 @@ module Backup
def build_env
{
- 'SSL_CERT_FILE' => OpenSSL::X509::DEFAULT_CERT_FILE,
- 'SSL_CERT_DIR' => OpenSSL::X509::DEFAULT_CERT_DIR
+ 'SSL_CERT_FILE' => Gitlab::X509::Certificate.default_cert_file,
+ 'SSL_CERT_DIR' => Gitlab::X509::Certificate.default_cert_dir
}.merge(ENV)
end
diff --git a/lib/banzai/filter/footnote_filter.rb b/lib/banzai/filter/footnote_filter.rb
index 537b7c80d91..f5c4b788ad8 100644
--- a/lib/banzai/filter/footnote_filter.rb
+++ b/lib/banzai/filter/footnote_filter.rb
@@ -71,7 +71,12 @@ module Banzai
private
def random_number
- @random_number ||= rand(10000)
+ # We allow overriding the randomness with a static value from GITLAB_TEST_FOOTNOTE_ID.
+ # This allows stable generation of example HTML during GLFM Snapshot Testing
+ # (https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing),
+ # and reduces the need for normalization of the example HTML
+ # (https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#normalization)
+ @random_number ||= ENV.fetch('GITLAB_TEST_FOOTNOTE_ID', rand(10000))
end
def fn_id(num)
diff --git a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
index df27275b664..3067e0997c2 100644
--- a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
@@ -7,10 +7,15 @@ module BulkImports
def transform(context, data)
import_entity = context.entity
+ if import_entity.destination_namespace.present?
+ namespace = Namespace.find_by_full_path(import_entity.destination_namespace)
+ end
+
data
+ .then { |data| transform_name(import_entity, namespace, data) }
.then { |data| transform_path(import_entity, data) }
.then { |data| transform_full_path(data) }
- .then { |data| transform_parent(context, import_entity, data) }
+ .then { |data| transform_parent(context, import_entity, namespace, data) }
.then { |data| transform_visibility_level(data) }
.then { |data| transform_project_creation_level(data) }
.then { |data| transform_subgroup_creation_level(data) }
@@ -18,6 +23,20 @@ module BulkImports
private
+ def transform_name(import_entity, namespace, data)
+ if namespace.present?
+ namespace_children_names = namespace.children.pluck(:name) # rubocop: disable CodeReuse/ActiveRecord
+
+ if namespace_children_names.include?(data['name'])
+ data['name'] = Uniquify.new(1).string(-> (counter) { "#{data['name']}(#{counter})" }) do |base|
+ namespace_children_names.include?(base)
+ end
+ end
+ end
+
+ data
+ end
+
def transform_path(import_entity, data)
data['path'] = import_entity.destination_name.parameterize
data
@@ -28,11 +47,8 @@ module BulkImports
data
end
- def transform_parent(context, import_entity, data)
- unless import_entity.destination_namespace.blank?
- namespace = Namespace.find_by_full_path(import_entity.destination_namespace)
- data['parent_id'] = namespace.id
- end
+ def transform_parent(context, import_entity, namespace, data)
+ data['parent_id'] = namespace.id if namespace.present?
data
end
diff --git a/lib/bulk_imports/network_error.rb b/lib/bulk_imports/network_error.rb
index d69b0172f6c..3514291a75d 100644
--- a/lib/bulk_imports/network_error.rb
+++ b/lib/bulk_imports/network_error.rb
@@ -7,9 +7,9 @@ module BulkImports
RETRIABLE_EXCEPTIONS = Gitlab::HTTP::HTTP_TIMEOUT_ERRORS
RETRIABLE_HTTP_CODES = [429].freeze
- DEFAULT_RETRY_DELAY_SECONDS = 60
+ DEFAULT_RETRY_DELAY_SECONDS = 30
- MAX_RETRIABLE_COUNT = 3
+ MAX_RETRIABLE_COUNT = 10
def initialize(message = nil, response: nil)
raise ArgumentError, 'message or response required' if message.blank? && response.blank?
diff --git a/lib/bulk_imports/pipeline/runner.rb b/lib/bulk_imports/pipeline/runner.rb
index 8f515b571a6..c03da7d8d01 100644
--- a/lib/bulk_imports/pipeline/runner.rb
+++ b/lib/bulk_imports/pipeline/runner.rb
@@ -56,12 +56,16 @@ module BulkImports
pipeline_step: step,
step_class: class_name
)
+ rescue BulkImports::NetworkError => e
+ if e.retriable?(context.tracker)
+ raise BulkImports::RetryPipelineError.new(e.message, e.retry_delay)
+ else
+ log_and_fail(e, step)
+ end
+ rescue BulkImports::RetryPipelineError
+ raise
rescue StandardError => e
- log_import_failure(e, step)
-
- mark_as_failed if abort_on_failure?
-
- nil
+ log_and_fail(e, step)
end
def extracted_data_from
@@ -74,11 +78,17 @@ module BulkImports
run if extracted_data.has_next_page?
end
- def mark_as_failed
- warn(message: 'Pipeline failed')
+ def log_and_fail(exception, step)
+ log_import_failure(exception, step)
- context.entity.fail_op!
tracker.fail_op!
+
+ if abort_on_failure?
+ warn(message: 'Aborting entity migration due to pipeline failure')
+ context.entity.fail_op!
+ end
+
+ nil
end
def skip!(message, extra = {})
diff --git a/lib/bulk_imports/retry_pipeline_error.rb b/lib/bulk_imports/retry_pipeline_error.rb
new file mode 100644
index 00000000000..a1b02addf45
--- /dev/null
+++ b/lib/bulk_imports/retry_pipeline_error.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class RetryPipelineError < Error
+ attr_reader :retry_delay
+
+ def initialize(message, retry_delay)
+ super(message)
+
+ @retry_delay = retry_delay
+ end
+ end
+end
diff --git a/lib/container_registry/gitlab_api_client.rb b/lib/container_registry/gitlab_api_client.rb
index 0cd8f8509f6..c68b222af97 100644
--- a/lib/container_registry/gitlab_api_client.rb
+++ b/lib/container_registry/gitlab_api_client.rb
@@ -28,7 +28,7 @@ module ContainerRegistry
end
def self.deduplicated_size(path)
- with_dummy_client(token_config: { type: :nested_repositories_token, path: path }) do |client|
+ with_dummy_client(token_config: { type: :nested_repositories_token, path: path&.downcase }) do |client|
client.repository_details(path, sizing: :self_with_descendants)['size_bytes']
end
end
diff --git a/lib/error_tracking/collector/dsn.rb b/lib/error_tracking/collector/dsn.rb
deleted file mode 100644
index 665181328f3..00000000000
--- a/lib/error_tracking/collector/dsn.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-module ErrorTracking
- module Collector
- class Dsn
- # Build a sentry compatible DSN URL for GitLab collector.
- #
- # The expected URL looks like that:
- # https://PUBLIC_KEY@gitlab.example.com/api/v4/error_tracking/collector/PROJECT_ID
- #
- def self.build_url(public_key, project_id)
- gitlab = Settings.gitlab
-
- custom_port = Settings.gitlab_on_standard_port? ? nil : ":#{gitlab.port}"
-
- base_url = [
- gitlab.protocol,
- "://",
- public_key,
- '@',
- gitlab.host,
- custom_port,
- gitlab.relative_url_root
- ].join('')
-
- "#{base_url}/api/v4/error_tracking/collector/#{project_id}"
- end
- end
- end
-end
diff --git a/lib/error_tracking/stacktrace_builder.rb b/lib/error_tracking/stacktrace_builder.rb
index 4f331bc4e06..024587e8683 100644
--- a/lib/error_tracking/stacktrace_builder.rb
+++ b/lib/error_tracking/stacktrace_builder.rb
@@ -29,6 +29,10 @@ module ErrorTracking
exception_entry = payload['exception']
return unless exception_entry
+ # Some SDK send exception payload as Array. For exmple Go lang SDK.
+ # We need to convert it to hash format we expect.
+ exception_entry = { 'values' => exception_entry } if exception_entry.is_a?(Array)
+
exception_values = exception_entry['values']
stack_trace_entry = exception_values&.detect { |h| h['stacktrace'].present? }
stack_trace_entry&.dig('stacktrace', 'frames')
diff --git a/lib/feature.rb b/lib/feature.rb
index 3bba4be7514..ca91d86c199 100644
--- a/lib/feature.rb
+++ b/lib/feature.rb
@@ -3,7 +3,7 @@
require 'flipper/adapters/active_record'
require 'flipper/adapters/active_support_cache_store'
-class Feature
+module Feature
# Classes to override flipper table names
class FlipperFeature < Flipper::Adapters::ActiveRecord::Feature
include DatabaseReflection
@@ -104,7 +104,14 @@ class Feature
def enable(key, thing = true)
log(key: key, action: __method__, thing: thing)
- with_feature(key) { _1.enable(thing) }
+ return_value = with_feature(key) { _1.enable(thing) }
+
+ # rubocop:disable Gitlab/RailsLogger
+ Rails.logger.warn('WARNING: Understand the stability and security risks of enabling in-development features with feature flags.')
+ Rails.logger.warn('See https://docs.gitlab.com/ee/administration/feature_flags.html#risks-when-enabling-features-still-in-development for more information.')
+ # rubocop:enable Gitlab/RailsLogger
+
+ return_value
end
def disable(key, thing = false)
diff --git a/lib/feature/definition.rb b/lib/feature/definition.rb
index 1551af730db..270bf46221d 100644
--- a/lib/feature/definition.rb
+++ b/lib/feature/definition.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-class Feature
+module Feature
class Definition
include ::Feature::Shared
diff --git a/lib/feature/gitaly.rb b/lib/feature/gitaly.rb
index 04ed78b8a51..0c6b9dfde7a 100644
--- a/lib/feature/gitaly.rb
+++ b/lib/feature/gitaly.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-class Feature
+module Feature
class Gitaly
PREFIX = "gitaly_"
diff --git a/lib/feature/logger.rb b/lib/feature/logger.rb
index 784a619e182..95e160273b6 100644
--- a/lib/feature/logger.rb
+++ b/lib/feature/logger.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-class Feature
+module Feature
class Logger < ::Gitlab::JsonLogger
def self.file_name_noext
'features_json'
diff --git a/lib/feature/shared.rb b/lib/feature/shared.rb
index 40f21fc4f50..edfc39aea0c 100644
--- a/lib/feature/shared.rb
+++ b/lib/feature/shared.rb
@@ -4,7 +4,7 @@
# 1. `Pure Ruby`: `bin/feature-flag`
# 2. `GitLab Rails`: `lib/feature/definition.rb`
-class Feature
+module Feature
module Shared
# optional: defines if a on-disk definition is required for this feature flag type
# rollout_issue: defines if `bin/feature-flag` asks for rollout issue
diff --git a/lib/generators/gitlab/usage_metric_definition/redis_hll_generator.rb b/lib/generators/gitlab/usage_metric_definition/redis_hll_generator.rb
index 58d3257d07e..8cd03978f27 100644
--- a/lib/generators/gitlab/usage_metric_definition/redis_hll_generator.rb
+++ b/lib/generators/gitlab/usage_metric_definition/redis_hll_generator.rb
@@ -8,15 +8,17 @@ module Gitlab
desc 'Generates a metric definition .yml file with defaults for Redis HLL.'
argument :category, type: :string, desc: "Category name"
- argument :event, type: :string, desc: "Event name"
+ argument :events, type: :array, desc: "Unique event names", banner: 'event_one event_two event_three'
class_option :ee, type: :boolean, optional: true, default: false, desc: 'Indicates if metric is for ee'
def create_metrics
- weekly_params = ["#{key_path}_weekly", '--dir', '7d', '--class_name', 'RedisHLLMetric']
+ weekly_key_paths = key_paths.map { |key_path| "#{key_path}_weekly" }
+ weekly_params = [*weekly_key_paths, '--dir', '7d', '--class_name', 'RedisHLLMetric']
weekly_params << '--ee' if ee?
Gitlab::UsageMetricDefinitionGenerator.start(weekly_params)
- monthly_params = ["#{key_path}_monthly", '--dir', '28d', '--class_name', 'RedisHLLMetric']
+ monthly_key_paths = key_paths.map { |key_path| "#{key_path}_monthly" }
+ monthly_params = [*monthly_key_paths, '--dir', '28d', '--class_name', 'RedisHLLMetric']
monthly_params << '--ee' if ee?
Gitlab::UsageMetricDefinitionGenerator.start(monthly_params)
end
@@ -27,8 +29,8 @@ module Gitlab
options[:ee]
end
- def key_path
- "redis_hll_counters.#{category}.#{event}"
+ def key_paths
+ events.map { |event| "redis_hll_counters.#{category}.#{event}" }
end
end
end
diff --git a/lib/generators/model/model_generator.rb b/lib/generators/model/model_generator.rb
new file mode 100644
index 00000000000..533b2ce679d
--- /dev/null
+++ b/lib/generators/model/model_generator.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'rails/generators'
+require 'rails/generators/active_record/model/model_generator'
+
+module Model
+ class ModelGenerator < ActiveRecord::Generators::ModelGenerator
+ source_root File.expand_path('../../../generator_templates/active_record/migration/', __dir__)
+
+ def create_migration_file
+ return if skip_migration_creation?
+
+ if options[:indexes] == false
+ attributes.each { |a| a.attr_options.delete(:index) if a.reference? && !a.has_index? }
+ end
+
+ migration_template "create_table_migration.rb", File.join(db_migrate_path, "create_#{table_name}.rb")
+ end
+
+ # Override to find templates from superclass as well
+ def source_paths
+ super + [self.class.superclass.default_source_root]
+ end
+ end
+end
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index 722ee061eba..0c52ce8aba4 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -37,6 +37,7 @@ module Gitlab
users_get_by_id: { threshold: -> { application_settings.users_get_by_id_limit }, interval: 10.minutes },
username_exists: { threshold: 20, interval: 1.minute },
user_sign_up: { threshold: 20, interval: 1.minute },
+ user_sign_in: { threshold: 5, interval: 10.minutes },
profile_resend_email_confirmation: { threshold: 5, interval: 1.minute },
profile_update_username: { threshold: 10, interval: 1.minute },
update_environment_canary_ingress: { threshold: 1, interval: 1.minute },
@@ -45,7 +46,10 @@ module Gitlab
search_rate_limit_unauthenticated: { threshold: -> { application_settings.search_rate_limit_unauthenticated }, interval: 1.minute },
gitlab_shell_operation: { threshold: 600, interval: 1.minute },
pipelines_create: { threshold: -> { application_settings.pipeline_limit_per_project_user_sha }, interval: 1.minute },
- temporary_email_failure: { threshold: 50, interval: 1.day }
+ temporary_email_failure: { threshold: 50, interval: 1.day },
+ project_testing_integration: { threshold: 5, interval: 1.minute },
+ email_verification: { threshold: 10, interval: 10.minutes },
+ email_verification_code_send: { threshold: 10, interval: 1.hour }
}.freeze
end
@@ -53,15 +57,26 @@ module Gitlab
# be throttled.
#
# @param key [Symbol] Key attribute registered in `.rate_limits`
- # @param scope [Array<ActiveRecord>] Array of ActiveRecord models, Strings or Symbols to scope throttling to a specific request (e.g. per user per project)
- # @param threshold [Integer] Optional threshold value to override default one registered in `.rate_limits`
- # @param users_allowlist [Array<String>] Optional list of usernames to exclude from the limit. This param will only be functional if Scope includes a current user.
- # @param peek [Boolean] Optional. When true the key will not be incremented but the current throttled state will be returned.
+ # @param scope [Array<ActiveRecord>] Array of ActiveRecord models, Strings
+ # or Symbols to scope throttling to a specific request (e.g. per user
+ # per project)
+ # @param resource [ActiveRecord] An ActiveRecord model to count an action
+ # for (e.g. limit unique project (resource) downloads (action) to five
+ # per user (scope))
+ # @param threshold [Integer] Optional threshold value to override default
+ # one registered in `.rate_limits`
+ # @param users_allowlist [Array<String>] Optional list of usernames to
+ # exclude from the limit. This param will only be functional if Scope
+ # includes a current user.
+ # @param peek [Boolean] Optional. When true the key will not be
+ # incremented but the current throttled state will be returned.
#
# @return [Boolean] Whether or not a request should be throttled
- def throttled?(key, scope:, threshold: nil, users_allowlist: nil, peek: false)
+ def throttled?(key, scope:, resource: nil, threshold: nil, users_allowlist: nil, peek: false)
raise InvalidKeyError unless rate_limits[key]
+ strategy = resource.present? ? IncrementPerActionedResource.new(resource.id) : IncrementPerAction.new
+
::Gitlab::Instrumentation::RateLimitingGates.track(key)
return false if scoped_user_in_allowlist?(scope, users_allowlist)
@@ -71,6 +86,9 @@ module Gitlab
return false if threshold_value == 0
interval_value = interval(key)
+
+ return false if interval_value == 0
+
# `period_key` is based on the current time and interval so when time passes to the next interval
# the key changes and the rate limit count starts again from 0.
# Based on https://github.com/rack/rack-attack/blob/886ba3a18d13c6484cd511a4dc9b76c0d14e5e96/lib/rack/attack/cache.rb#L63-L68
@@ -78,9 +96,12 @@ module Gitlab
cache_key = cache_key(key, scope, period_key)
value = if peek
- read(cache_key)
+ strategy.read(cache_key)
else
- increment(cache_key, interval_value, time_elapsed_in_period)
+ # We add a 1 second buffer to avoid timing issues when we're at the end of a period
+ expiry = interval_value - time_elapsed_in_period + 1
+
+ strategy.increment(cache_key, expiry)
end
value > threshold_value
@@ -128,40 +149,25 @@ module Gitlab
def threshold(key)
value = rate_limit_value_by_key(key, :threshold)
- return value.call if value.is_a?(Proc)
-
- value.to_i
+ rate_limit_value(value)
end
def interval(key)
- rate_limit_value_by_key(key, :interval).to_i
- end
-
- def rate_limit_value_by_key(key, setting)
- action = rate_limits[key]
+ value = rate_limit_value_by_key(key, :interval)
- action[setting] if action
+ rate_limit_value(value)
end
- # Increments the rate limit count and returns the new count value.
- def increment(cache_key, interval_value, time_elapsed_in_period)
- # We add a 1 second buffer to avoid timing issues when we're at the end of a period
- expiry = interval_value - time_elapsed_in_period + 1
+ def rate_limit_value(value)
+ value = value.call if value.is_a?(Proc)
- ::Gitlab::Redis::RateLimiting.with do |redis|
- redis.pipelined do
- redis.incr(cache_key)
- redis.expire(cache_key, expiry)
- end.first
- end
+ value.to_i
end
- # Returns the rate limit count.
- # Will be 0 if there is no data in the cache.
- def read(cache_key)
- ::Gitlab::Redis::RateLimiting.with do |redis|
- redis.get(cache_key).to_i
- end
+ def rate_limit_value_by_key(key, setting)
+ action = rate_limits[key]
+
+ action[setting] if action
end
def cache_key(key, scope, period_key)
diff --git a/lib/gitlab/application_rate_limiter/base_strategy.rb b/lib/gitlab/application_rate_limiter/base_strategy.rb
new file mode 100644
index 00000000000..b97770c0524
--- /dev/null
+++ b/lib/gitlab/application_rate_limiter/base_strategy.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ApplicationRateLimiter
+ class BaseStrategy
+ # Increment the rate limit count and return the new count value
+ def increment(cache_key, expiry)
+ raise NotImplementedError
+ end
+
+ # Return the rate limit count.
+ # Should be 0 if there is no data in the cache.
+ def read(cache_key)
+ raise NotImplementedError
+ end
+
+ private
+
+ def with_redis(&block)
+ ::Gitlab::Redis::RateLimiting.with(&block) # rubocop: disable CodeReuse/ActiveRecord
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/application_rate_limiter/increment_per_action.rb b/lib/gitlab/application_rate_limiter/increment_per_action.rb
new file mode 100644
index 00000000000..c99d03f1344
--- /dev/null
+++ b/lib/gitlab/application_rate_limiter/increment_per_action.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ApplicationRateLimiter
+ class IncrementPerAction < BaseStrategy
+ def increment(cache_key, expiry)
+ with_redis do |redis|
+ redis.pipelined do
+ redis.incr(cache_key)
+ redis.expire(cache_key, expiry)
+ end.first
+ end
+ end
+
+ def read(cache_key)
+ with_redis do |redis|
+ redis.get(cache_key).to_i
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/application_rate_limiter/increment_per_actioned_resource.rb b/lib/gitlab/application_rate_limiter/increment_per_actioned_resource.rb
new file mode 100644
index 00000000000..8b4197cfff9
--- /dev/null
+++ b/lib/gitlab/application_rate_limiter/increment_per_actioned_resource.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ApplicationRateLimiter
+ class IncrementPerActionedResource < BaseStrategy
+ def initialize(resource_key)
+ @resource_key = resource_key
+ end
+
+ def increment(cache_key, expiry)
+ with_redis do |redis|
+ redis.pipelined do
+ redis.sadd(cache_key, resource_key)
+ redis.expire(cache_key, expiry)
+ redis.scard(cache_key)
+ end.last
+ end
+ end
+
+ def read(cache_key)
+ with_redis do |redis|
+ redis.scard(cache_key)
+ end
+ end
+
+ private
+
+ attr_accessor :resource_key
+ end
+ end
+end
diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb
index 5d5a431f206..6c3487c28ea 100644
--- a/lib/gitlab/auth.rb
+++ b/lib/gitlab/auth.rb
@@ -217,7 +217,7 @@ module Gitlab
return unless valid_scoped_token?(token, all_available_scopes)
if project && token.user.project_bot?
- return unless token_bot_in_resource?(token.user, project)
+ return unless can_read_project?(token.user, project)
end
if token.user.can_log_in_with_non_expired_password? || token.user.project_bot?
@@ -225,22 +225,8 @@ module Gitlab
end
end
- def token_bot_in_project?(user, project)
- project.bots.include?(user)
- end
-
- # rubocop: disable CodeReuse/ActiveRecord
-
- # A workaround for adding group-level automation is to add the bot user of a project access token as a group member.
- # In order to make project access tokens work this way during git authentication, we need to add an additional check for group membership.
- # This is a temporary workaround until service accounts are implemented.
- def token_bot_in_group?(user, project)
- project.group && project.group.members_with_parents.where(user_id: user.id).exists?
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- def token_bot_in_resource?(user, project)
- token_bot_in_project?(user, project) || token_bot_in_group?(user, project)
+ def can_read_project?(user, project)
+ user.can?(:read_project, project)
end
def valid_oauth_token?(token)
@@ -323,7 +309,7 @@ module Gitlab
return unless build.project.builds_enabled?
if build.user
- return unless build.user.can_log_in_with_non_expired_password? || (build.user.project_bot? && token_bot_in_resource?(build.user, build.project))
+ return unless build.user.can_log_in_with_non_expired_password? || (build.user.project_bot? && can_read_project?(build.user, build.project))
# If user is assigned to build, use restricted credentials of user
Gitlab::Auth::Result.new(build.user, build.project, :build, build_authentication_abilities)
diff --git a/lib/gitlab/auth/ldap/user.rb b/lib/gitlab/auth/ldap/user.rb
index 56c2af1910e..957ec5fa479 100644
--- a/lib/gitlab/auth/ldap/user.rb
+++ b/lib/gitlab/auth/ldap/user.rb
@@ -31,7 +31,11 @@ module Gitlab
end
def valid_sign_in?
- allowed? && super
+ # The order is important here: we need to ensure the
+ # associated GitLab user entry is valid and persisted in the
+ # database. Otherwise, the LDAP access check will fail since
+ # the user doesn't have an associated LDAP identity.
+ super && allowed?
end
def ldap_config
diff --git a/lib/gitlab/background_migration/backfill_ci_runner_semver.rb b/lib/gitlab/background_migration/backfill_ci_runner_semver.rb
new file mode 100644
index 00000000000..0901649f789
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_ci_runner_semver.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # A job to update semver column in ci_runners in batches based on existing version values
+ class BackfillCiRunnerSemver < Gitlab::BackgroundMigration::BatchedMigrationJob
+ def perform
+ each_sub_batch(
+ operation_name: :backfill_ci_runner_semver,
+ batching_scope: ->(relation) { relation.where('semver::cidr IS NULL') }
+ ) do |sub_batch|
+ ranged_query = sub_batch.select(
+ %q(id AS r_id,
+ substring(ci_runners.version FROM 'v?(\d+\.\d+\.\d+)') AS extracted_semver)
+ )
+
+ update_sql = <<~SQL
+ UPDATE
+ ci_runners
+ SET semver = extracted_semver
+ FROM (#{ranged_query.to_sql}) v
+ WHERE id = v.r_id
+ AND v.extracted_semver IS NOT NULL
+ SQL
+
+ connection.execute(update_sql)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_imported_issue_search_data.rb b/lib/gitlab/background_migration/backfill_imported_issue_search_data.rb
new file mode 100644
index 00000000000..b2d38ce6aa4
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_imported_issue_search_data.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+# rubocop:disable Style/Documentation
+
+module Gitlab
+ module BackgroundMigration
+ # Rechedules the backfill for the `issue_search_data` table for issues imported prior
+ # to the fix for the imported issues search data bug:
+
+ class BackfillImportedIssueSearchData < BatchedMigrationJob
+ SUB_BATCH_SIZE = 1_000
+
+ def perform
+ each_sub_batch(
+ operation_name: :update_search_data
+ ) do |sub_batch|
+ update_search_data(sub_batch)
+ rescue ActiveRecord::StatementInvalid => e
+ raise unless e.cause.is_a?(PG::ProgramLimitExceeded) && e.message.include?('string is too long for tsvector')
+
+ update_search_data_individually(sub_batch)
+ end
+ end
+
+ private
+
+ def update_search_data(relation)
+ ApplicationRecord.connection.execute(
+ <<~SQL
+ INSERT INTO issue_search_data
+ SELECT
+ project_id,
+ id,
+ NOW(),
+ NOW(),
+ setweight(to_tsvector('english', LEFT(title, 255)), 'A') || setweight(to_tsvector('english', LEFT(REGEXP_REPLACE(description, '[A-Za-z0-9+/@]{50,}', ' ', 'g'), 1048576)), 'B')
+ FROM (#{relation.limit(SUB_BATCH_SIZE).to_sql}) issues
+ ON CONFLICT DO NOTHING
+ SQL
+ )
+ end
+
+ def update_search_data_individually(relation)
+ relation.pluck(:id).each do |issue_id|
+ update_search_data(relation.klass.where(id: issue_id))
+ sleep(pause_ms * 0.001)
+ rescue ActiveRecord::StatementInvalid => e
+ raise unless e.cause.is_a?(PG::ProgramLimitExceeded) && e.message.include?('string is too long for tsvector')
+
+ logger.error(
+ message: "Error updating search data: #{e.message}",
+ class: relation.klass.name,
+ model_id: issue_id
+ )
+ end
+ end
+
+ def logger
+ @logger ||= Gitlab::BackgroundMigration::Logger.build
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb b/lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb
new file mode 100644
index 00000000000..ec813022b8f
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Back-fill container_registry_size for project_statistics
+ class BackfillProjectStatisticsContainerRepositorySize < Gitlab::BackgroundMigration::BatchedMigrationJob
+ def perform
+ # no-op
+ end
+ end
+ end
+end
+
+Gitlab::BackgroundMigration::BackfillProjectStatisticsContainerRepositorySize.prepend_mod_with('Gitlab::BackgroundMigration::BackfillProjectStatisticsContainerRepositorySize') # rubocop:disable Layout/LineLength
diff --git a/lib/gitlab/background_migration/batched_migration_job.rb b/lib/gitlab/background_migration/batched_migration_job.rb
index 442eab0673e..c47b1735ccf 100644
--- a/lib/gitlab/background_migration/batched_migration_job.rb
+++ b/lib/gitlab/background_migration/batched_migration_job.rb
@@ -44,7 +44,19 @@ module Gitlab
end
end
- def parent_batch_relation(batching_scope)
+ def distinct_each_batch(operation_name: :default, batching_arguments: {})
+ all_batching_arguments = { column: batch_column, of: sub_batch_size }.merge(batching_arguments)
+
+ parent_batch_relation.distinct_each_batch(**all_batching_arguments) do |relation|
+ batch_metrics.instrument_operation(operation_name) do
+ yield relation
+ end
+
+ sleep([pause_ms, 0].max * 0.001)
+ end
+ end
+
+ def parent_batch_relation(batching_scope = nil)
parent_relation = define_batchable_model(batch_table, connection: connection)
.where(batch_column => start_id..end_id)
diff --git a/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb b/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb
index 06036eebcb9..7d5fef67c25 100644
--- a/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb
+++ b/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb
@@ -8,7 +8,7 @@ module Gitlab
#
# If no more batches exist in the table, returns nil.
class BackfillIssueWorkItemTypeBatchingStrategy < PrimaryKeyBatchingStrategy
- def apply_additional_filters(relation, job_arguments:)
+ def apply_additional_filters(relation, job_arguments:, job_class: nil)
issue_type = job_arguments.first
relation.where(issue_type: issue_type)
diff --git a/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb b/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb
index f352c527b54..68be42dc0a0 100644
--- a/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb
+++ b/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb
@@ -16,7 +16,7 @@ module Gitlab
# batch_min_value - The minimum value which the next batch will start at
# batch_size - The size of the next batch
# job_arguments - The migration job arguments
- def next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:)
+ def next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:, job_class: nil)
next_batch_bounds = nil
model_class = ::Gitlab::BackgroundMigration::ProjectNamespaces::Models::Project
quoted_column_name = model_class.connection.quote_column_name(column_name)
diff --git a/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy.rb b/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy.rb
new file mode 100644
index 00000000000..9ad119310f7
--- /dev/null
+++ b/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ module BatchingStrategies
+ # Batching class to use for back-filling project_statistic's container_registry_size.
+ # Batches will be scoped to records where the project_ids are migrated
+ #
+ # If no more batches exist in the table, returns nil.
+ class BackfillProjectStatisticsWithContainerRegistrySizeBatchingStrategy < PrimaryKeyBatchingStrategy
+ MIGRATION_PHASE_1_ENDED_AT = Date.new(2022, 01, 23).freeze
+
+ def apply_additional_filters(relation, job_arguments: [], job_class: nil)
+ relation.where(created_at: MIGRATION_PHASE_1_ENDED_AT..).or(
+ relation.where(migration_state: 'import_done')
+ ).select(:project_id).distinct
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy.rb b/lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy.rb
new file mode 100644
index 00000000000..e1855b6cfee
--- /dev/null
+++ b/lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ module BatchingStrategies
+ # Batching class to use for setting state in vulnerabilitites table.
+ # Batches will be scoped to records where the dismissed_at is set.
+ #
+ # If no more batches exist in the table, returns nil.
+ class DismissedVulnerabilitiesStrategy < PrimaryKeyBatchingStrategy
+ def apply_additional_filters(relation, job_arguments: [], job_class: nil)
+ relation.where.not(dismissed_at: nil)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb b/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb
new file mode 100644
index 00000000000..5cad9d2e3c4
--- /dev/null
+++ b/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ module BatchingStrategies
+ # This strategy provides an efficient way to iterate over columns with non-distinct values.
+ # A common use case would be iterating over a foreign key columns, for example issues.project_id
+ class LooseIndexScanBatchingStrategy < BaseStrategy
+ include Gitlab::Database::DynamicModelHelpers
+
+ # Finds and returns the next batch in the table.
+ #
+ # table_name - The table to batch over
+ # column_name - The column to batch over
+ # batch_min_value - The minimum value which the next batch will start at
+ # batch_size - The size of the next batch
+ # job_arguments - The migration job arguments
+ # job_class - The migration job class
+ def next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:, job_class: nil)
+ model_class = define_batchable_model(table_name, connection: connection)
+
+ quoted_column_name = model_class.connection.quote_column_name(column_name)
+ relation = model_class.where("#{quoted_column_name} >= ?", batch_min_value)
+ next_batch_bounds = nil
+
+ relation.distinct_each_batch(of: batch_size, column: column_name) do |batch| # rubocop:disable Lint/UnreachableLoop
+ next_batch_bounds = batch.pluck(Arel.sql("MIN(#{quoted_column_name}), MAX(#{quoted_column_name})")).first
+
+ break
+ end
+
+ next_batch_bounds
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb b/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb
index e7a68b183b8..c2f59bf9c76 100644
--- a/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb
+++ b/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb
@@ -18,12 +18,13 @@ module Gitlab
# batch_min_value - The minimum value which the next batch will start at
# batch_size - The size of the next batch
# job_arguments - The migration job arguments
- def next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:)
+ # job_class - The migration job class
+ def next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:, job_class: nil)
model_class = define_batchable_model(table_name, connection: connection)
quoted_column_name = model_class.connection.quote_column_name(column_name)
relation = model_class.where("#{quoted_column_name} >= ?", batch_min_value)
- relation = apply_additional_filters(relation, job_arguments: job_arguments)
+ relation = apply_additional_filters(relation, job_arguments: job_arguments, job_class: job_class)
next_batch_bounds = nil
relation.each_batch(of: batch_size, column: column_name) do |batch| # rubocop:disable Lint/UnreachableLoop
@@ -35,19 +36,11 @@ module Gitlab
next_batch_bounds
end
- # Strategies based on PrimaryKeyBatchingStrategy can use
- # this method to easily apply additional filters.
- #
- # Example:
- #
- # class MatchingType < PrimaryKeyBatchingStrategy
- # def apply_additional_filters(relation, job_arguments:)
- # type = job_arguments.first
- #
- # relation.where(type: type)
- # end
- # end
- def apply_additional_filters(relation, job_arguments: [])
+ def apply_additional_filters(relation, job_arguments: [], job_class: nil)
+ if job_class.respond_to?(:batching_scope)
+ return job_class.batching_scope(relation, job_arguments: job_arguments)
+ end
+
relation
end
end
diff --git a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb
new file mode 100644
index 00000000000..e759d504f8d
--- /dev/null
+++ b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Set `project_settings.legacy_open_source_license_available` to false for inactive, public projects
+ class DisableLegacyOpenSourceLicenseForInactivePublicProjects <
+ ::Gitlab::BackgroundMigration::BatchedMigrationJob
+ PUBLIC = 20
+ LAST_ACTIVITY_DATE = '2021-07-01'
+
+ # Migration only version of `project_settings` table
+ class ProjectSetting < ApplicationRecord
+ self.table_name = 'project_settings'
+ end
+
+ def perform
+ each_sub_batch(
+ operation_name: :disable_legacy_open_source_license_available,
+ batching_scope: ->(relation) {
+ relation.where(visibility_level: PUBLIC).where('last_activity_at < ?', LAST_ACTIVITY_DATE)
+ }
+ ) do |sub_batch|
+ ProjectSetting.where(project_id: sub_batch).update_all(legacy_open_source_license_available: false)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb b/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb
index a34e923545c..914ababa5c2 100644
--- a/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb
+++ b/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb
@@ -68,7 +68,7 @@ module Gitlab
def valid_json?(metadata)
Oj.load(metadata)
true
- rescue Oj::ParseError, Encoding::UndefinedConversionError
+ rescue Oj::ParseError, EncodingError, JSON::ParserError, Encoding::UndefinedConversionError
false
end
diff --git a/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb b/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb
new file mode 100644
index 00000000000..3f04e04fc4d
--- /dev/null
+++ b/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Migrates the value operations_access_level to the new colums
+ # monitor_access_level, deployments_access_level, infrastructure_access_level.
+ # The operations_access_level setting is being split into three seperate toggles.
+ class PopulateOperationVisibilityPermissionsFromOperations < BatchedMigrationJob
+ def perform
+ each_sub_batch(operation_name: :populate_operations_visibility) do |batch|
+ batch.update_all('monitor_access_level=operations_access_level,' \
+ 'infrastructure_access_level=operations_access_level,' \
+ ' feature_flags_access_level=operations_access_level,'\
+ ' environments_access_level=operations_access_level')
+ end
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ 'PopulateOperationVisibilityPermissionsFromOperations',
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
index db7afd59f4d..72380af2c53 100644
--- a/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
+++ b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
@@ -79,10 +79,6 @@ class Gitlab::BackgroundMigration::RecalculateVulnerabilitiesOccurrencesUuid # r
# rubocop: disable Metrics/AbcSize,Metrics/MethodLength,Metrics/BlockLength
def perform(start_id, end_id)
- unless Feature.enabled?(:migrate_vulnerability_finding_uuids)
- return log_info('Migration is disabled by the feature flag', start_id: start_id, end_id: end_id)
- end
-
log_info('Migration started', start_id: start_id, end_id: end_id)
VulnerabilitiesFinding
diff --git a/lib/gitlab/background_migration/set_correct_vulnerability_state.rb b/lib/gitlab/background_migration/set_correct_vulnerability_state.rb
new file mode 100644
index 00000000000..fd6cbcb8d05
--- /dev/null
+++ b/lib/gitlab/background_migration/set_correct_vulnerability_state.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Change the vulnerability state to `dismissed` if `dismissed_at` field is not null
+ class SetCorrectVulnerabilityState < BatchedMigrationJob
+ DISMISSED_STATE = 2
+
+ def perform
+ each_sub_batch(
+ operation_name: :update_vulnerabilities_state,
+ batching_scope: -> (relation) { relation.where.not(dismissed_at: nil) }
+ ) do |sub_batch|
+ sub_batch.update_all(state: DISMISSED_STATE)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb b/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb
new file mode 100644
index 00000000000..04a2ceebef8
--- /dev/null
+++ b/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # This class is used to update the delayed_project_removal column
+ # for user namespaces of the namespace_settings table.
+ class UpdateDelayedProjectRemovalToNullForUserNamespaces < Gitlab::BackgroundMigration::BatchedMigrationJob
+ # Migration only version of `namespace_settings` table
+ class NamespaceSetting < ::ApplicationRecord
+ self.table_name = 'namespace_settings'
+ end
+
+ def perform
+ each_sub_batch(
+ operation_name: :set_delayed_project_removal_to_null_for_user_namespace
+ ) do |sub_batch|
+ set_delayed_project_removal_to_null_for_user_namespace(sub_batch)
+ end
+ end
+
+ private
+
+ def set_delayed_project_removal_to_null_for_user_namespace(relation)
+ NamespaceSetting.connection.execute(
+ <<~SQL
+ UPDATE namespace_settings
+ SET delayed_project_removal = NULL
+ WHERE
+ namespace_settings.namespace_id IN (
+ SELECT
+ namespace_settings.namespace_id
+ FROM
+ namespace_settings
+ INNER JOIN namespaces ON namespaces.id = namespace_settings.namespace_id
+ WHERE
+ namespaces.id IN (#{relation.select(:namespace_id).to_sql})
+ AND namespaces.type = 'User'
+ AND namespace_settings.delayed_project_removal = FALSE)
+ SQL
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb
index f79baadb8ea..d58de7eb211 100644
--- a/lib/gitlab/bitbucket_import/importer.rb
+++ b/lib/gitlab/bitbucket_import/importer.rb
@@ -86,13 +86,15 @@ module Gitlab
create_labels
+ issue_type_id = WorkItems::Type.default_issue_type.id
+
client.issues(repo).each do |issue|
- import_issue(issue)
+ import_issue(issue, issue_type_id)
end
end
# rubocop: disable CodeReuse/ActiveRecord
- def import_issue(issue)
+ def import_issue(issue, issue_type_id)
description = ''
description += @formatter.author_line(issue.author) unless find_user_id(issue.author)
description += issue.description
@@ -106,7 +108,9 @@ module Gitlab
description: description,
state_id: Issue.available_states[issue.state],
author_id: gitlab_user_id(project, issue.author),
+ namespace_id: project.project_namespace_id,
milestone: milestone,
+ work_item_type_id: issue_type_id,
created_at: issue.created_at,
updated_at: issue.updated_at
)
diff --git a/lib/gitlab/changelog/config.rb b/lib/gitlab/changelog/config.rb
index 9cb3d71f5c3..8fcc03ec437 100644
--- a/lib/gitlab/changelog/config.rb
+++ b/lib/gitlab/changelog/config.rb
@@ -7,9 +7,9 @@ module Gitlab
# When rendering changelog entries, authors are not included.
AUTHORS_NONE = 'none'
- # The path to the configuration file as stored in the project's Git
+ # The default path to the configuration file as stored in the project's Git
# repository.
- FILE_PATH = '.gitlab/changelog_config.yml'
+ DEFAULT_FILE_PATH = '.gitlab/changelog_config.yml'
# The default date format to use for formatting release dates.
DEFAULT_DATE_FORMAT = '%Y-%m-%d'
@@ -36,8 +36,9 @@ module Gitlab
attr_accessor :date_format, :categories, :template, :tag_regex, :always_credit_user_ids
- def self.from_git(project, user = nil)
- if (yaml = project.repository.changelog_config.presence)
+ def self.from_git(project, user = nil, path = nil)
+ yaml = project.repository.changelog_config('HEAD', path.presence || DEFAULT_FILE_PATH)
+ if yaml.present?
from_hash(project, YAML.safe_load(yaml), user)
else
new(project)
diff --git a/lib/gitlab/ci/build/artifacts/expire_in_parser.rb b/lib/gitlab/ci/build/artifacts/expire_in_parser.rb
deleted file mode 100644
index 848208c5cdd..00000000000
--- a/lib/gitlab/ci/build/artifacts/expire_in_parser.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Ci
- module Build
- module Artifacts
- class ExpireInParser
- def self.validate_duration(value)
- new(value).validate_duration
- end
-
- def initialize(value)
- @value = value
- end
-
- def validate_duration
- return true if never?
-
- cached_parse
- end
-
- def seconds_from_now
- parse&.seconds&.from_now
- end
-
- private
-
- attr_reader :value
-
- def cached_parse
- return validation_cache[value] if validation_cache.key?(value)
-
- validation_cache[value] = safe_parse
- end
-
- def safe_parse
- parse
- rescue ChronicDuration::DurationParseError
- false
- end
-
- def parse
- return if never?
-
- ChronicDuration.parse(value)
- end
-
- def validation_cache
- Gitlab::SafeRequestStore[:ci_expire_in_parser_cache] ||= {}
- end
-
- def never?
- value.to_s.casecmp('never') == 0
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/ci/build/duration_parser.rb b/lib/gitlab/ci/build/duration_parser.rb
new file mode 100644
index 00000000000..9385dccd5f3
--- /dev/null
+++ b/lib/gitlab/ci/build/duration_parser.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Build
+ class DurationParser
+ def self.validate_duration(value)
+ new(value).validate_duration
+ end
+
+ def initialize(value)
+ @value = value
+ end
+
+ def validate_duration
+ return true if never?
+
+ cached_parse
+ end
+
+ def seconds_from_now
+ parse&.seconds&.from_now
+ end
+
+ private
+
+ attr_reader :value
+
+ def cached_parse
+ return validation_cache[value] if validation_cache.key?(value)
+
+ validation_cache[value] = safe_parse
+ end
+
+ def safe_parse
+ parse
+ rescue ChronicDuration::DurationParseError
+ false
+ end
+
+ def parse
+ return if never?
+
+ ChronicDuration.parse(value)
+ end
+
+ def validation_cache
+ Gitlab::SafeRequestStore[:ci_expire_in_parser_cache] ||= {}
+ end
+
+ def never?
+ value.to_s.casecmp('never') == 0
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/build/rules/rule/clause/changes.rb b/lib/gitlab/ci/build/rules/rule/clause/changes.rb
index 4c5f02b4f7b..1bcd87c9d93 100644
--- a/lib/gitlab/ci/build/rules/rule/clause/changes.rb
+++ b/lib/gitlab/ci/build/rules/rule/clause/changes.rb
@@ -4,8 +4,10 @@ module Gitlab
module Ci
module Build
class Rules::Rule::Clause::Changes < Rules::Rule::Clause
+ include Gitlab::Utils::StrongMemoize
+
def initialize(globs)
- @globs = Array(globs)
+ @globs = globs
end
def satisfied_by?(pipeline, context)
@@ -19,13 +21,25 @@ module Gitlab
end
end
+ private
+
def expand_globs(context)
- return @globs unless context
+ return paths unless context
- @globs.map do |glob|
+ paths.map do |glob|
ExpandVariables.expand_existing(glob, -> { context.variables_hash })
end
end
+
+ def paths
+ strong_memoize(:paths) do
+ if @globs.is_a?(Array)
+ @globs
+ else
+ Array(@globs[:paths])
+ end
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/entry/artifacts.rb b/lib/gitlab/ci/config/entry/artifacts.rb
index 56eeb5eeb06..3b0cbc6b69e 100644
--- a/lib/gitlab/ci/config/entry/artifacts.rb
+++ b/lib/gitlab/ci/config/entry/artifacts.rb
@@ -42,7 +42,7 @@ module Gitlab
inclusion: { in: %w[on_success on_failure always],
message: 'should be on_success, on_failure ' \
'or always' }
- validates :expire_in, duration: { parser: ::Gitlab::Ci::Build::Artifacts::ExpireInParser }
+ validates :expire_in, duration: { parser: ::Gitlab::Ci::Build::DurationParser }
end
end
diff --git a/lib/gitlab/ci/config/entry/environment.rb b/lib/gitlab/ci/config/entry/environment.rb
index bc39abfe977..96ba3553b46 100644
--- a/lib/gitlab/ci/config/entry/environment.rb
+++ b/lib/gitlab/ci/config/entry/environment.rb
@@ -54,7 +54,7 @@ module Gitlab
validates :on_stop, type: String, allow_nil: true
validates :kubernetes, type: Hash, allow_nil: true
- validates :auto_stop_in, duration: true, allow_nil: true
+ validates :auto_stop_in, duration: { parser: ::Gitlab::Ci::Build::DurationParser }, allow_nil: true
end
end
diff --git a/lib/gitlab/ci/config/entry/image.rb b/lib/gitlab/ci/config/entry/image.rb
index 79443f69b03..96ac959a3f4 100644
--- a/lib/gitlab/ci/config/entry/image.rb
+++ b/lib/gitlab/ci/config/entry/image.rb
@@ -48,7 +48,7 @@ module Gitlab
{
name: @config[:name],
entrypoint: @config[:entrypoint],
- ports: ports_value,
+ ports: (ports_value if ports_defined?),
pull_policy: (ci_docker_image_pull_policy_enabled? ? pull_policy_value : nil)
}.compact
else
diff --git a/lib/gitlab/ci/config/entry/processable.rb b/lib/gitlab/ci/config/entry/processable.rb
index 46afedbcc3a..78794f524f4 100644
--- a/lib/gitlab/ci/config/entry/processable.rb
+++ b/lib/gitlab/ci/config/entry/processable.rb
@@ -71,9 +71,9 @@ module Gitlab
end
def compose!(deps = nil)
- super do
- has_workflow_rules = deps&.workflow_entry&.has_rules?
+ has_workflow_rules = deps&.workflow_entry&.has_rules?
+ super do
# If workflow:rules: or rules: are used
# they are considered not compatible
# with `only/except` defaults
@@ -86,12 +86,10 @@ module Gitlab
@entries.delete(:except) unless except_defined? # rubocop:disable Gitlab/ModuleWithInstanceVariables
end
- unless has_workflow_rules
- validate_against_warnings
- end
-
yield if block_given?
end
+
+ validate_against_warnings unless has_workflow_rules
end
def validate_against_warnings
diff --git a/lib/gitlab/ci/config/entry/rules.rb b/lib/gitlab/ci/config/entry/rules.rb
index 53e52981471..91be1bb3ee4 100644
--- a/lib/gitlab/ci/config/entry/rules.rb
+++ b/lib/gitlab/ci/config/entry/rules.rb
@@ -13,7 +13,7 @@ module Gitlab
end
def value
- [@config].flatten
+ [super].flatten
end
def composable_class
diff --git a/lib/gitlab/ci/config/entry/rules/rule/changes.rb b/lib/gitlab/ci/config/entry/rules/rule/changes.rb
index be57e089f34..a56b928450a 100644
--- a/lib/gitlab/ci/config/entry/rules/rule/changes.rb
+++ b/lib/gitlab/ci/config/entry/rules/rule/changes.rb
@@ -6,13 +6,51 @@ module Gitlab
module Entry
class Rules
class Rule
- class Changes < ::Gitlab::Config::Entry::Node
- include ::Gitlab::Config::Entry::Validatable
+ class Changes < ::Gitlab::Config::Entry::Simplifiable
+ strategy :SimpleChanges, if: -> (config) { config.is_a?(Array) }
+ strategy :ComplexChanges, if: -> (config) { config.is_a?(Hash) }
- validations do
- validates :config,
- array_of_strings: true,
- length: { maximum: 50, too_long: "has too many entries (maximum %{count})" }
+ class SimpleChanges < ::Gitlab::Config::Entry::Node
+ include ::Gitlab::Config::Entry::Validatable
+
+ validations do
+ validates :config,
+ array_of_strings: true,
+ length: { maximum: 50, too_long: "has too many entries (maximum %{count})" }
+ end
+
+ def value
+ {
+ paths: config
+ }.compact
+ end
+ end
+
+ class ComplexChanges < ::Gitlab::Config::Entry::Node
+ include ::Gitlab::Config::Entry::Validatable
+ include ::Gitlab::Config::Entry::Attributable
+
+ ALLOWED_KEYS = %i[paths].freeze
+ REQUIRED_KEYS = %i[paths].freeze
+
+ attributes ALLOWED_KEYS
+
+ validations do
+ validates :config, allowed_keys: ALLOWED_KEYS
+ validates :config, required_keys: REQUIRED_KEYS
+
+ with_options allow_nil: false do
+ validates :paths,
+ array_of_strings: true,
+ length: { maximum: 50, too_long: "has too many entries (maximum %{count})" }
+ end
+ end
+ end
+
+ class UnknownStrategy < ::Gitlab::Config::Entry::Node
+ def errors
+ ["#{location} should be an array or a hash"]
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/entry/service.rb b/lib/gitlab/ci/config/entry/service.rb
index f27dca4986e..1a35f7de6cf 100644
--- a/lib/gitlab/ci/config/entry/service.rb
+++ b/lib/gitlab/ci/config/entry/service.rb
@@ -15,11 +15,13 @@ module Gitlab
include ::Gitlab::Config::Entry::Attributable
include ::Gitlab::Config::Entry::Configurable
- ALLOWED_KEYS = %i[name entrypoint command alias ports variables].freeze
+ ALLOWED_KEYS = %i[name entrypoint command alias ports variables pull_policy].freeze
+ LEGACY_ALLOWED_KEYS = %i[name entrypoint command alias ports variables].freeze
validations do
validates :config, hash_or_string: true
- validates :config, allowed_keys: ALLOWED_KEYS
+ validates :config, allowed_keys: ALLOWED_KEYS, if: :ci_docker_image_pull_policy_enabled?
+ validates :config, allowed_keys: LEGACY_ALLOWED_KEYS, unless: :ci_docker_image_pull_policy_enabled?
validates :config, disallowed_keys: %i[ports], unless: :with_image_ports?
validates :name, type: String, presence: true
validates :entrypoint, array_of_strings: true, allow_nil: true
@@ -32,11 +34,14 @@ module Gitlab
entry :ports, Entry::Ports,
description: 'Ports used to expose the service'
+ entry :pull_policy, Entry::PullPolicy,
+ description: 'Pull policy for the service'
+
entry :variables, ::Gitlab::Ci::Config::Entry::Variables,
description: 'Environment variables available for this service.',
inherit: false
- attributes :ports
+ attributes :ports, :pull_policy, :variables
def alias
value[:alias]
@@ -55,16 +60,25 @@ module Gitlab
end
def value
- return { name: @config } if string?
- return @config if hash?
-
- {}
+ if string?
+ { name: @config }
+ elsif hash?
+ @config.merge(
+ pull_policy: (pull_policy_value if ci_docker_image_pull_policy_enabled?)
+ ).compact
+ else
+ {}
+ end
end
def with_image_ports?
opt(:with_image_ports)
end
+ def ci_docker_image_pull_policy_enabled?
+ ::Feature.enabled?(:ci_docker_image_pull_policy)
+ end
+
def skip_config_hash_validation?
true
end
diff --git a/lib/gitlab/ci/config/external/context.rb b/lib/gitlab/ci/config/external/context.rb
index 2def565bc19..ec628399785 100644
--- a/lib/gitlab/ci/config/external/context.rb
+++ b/lib/gitlab/ci/config/external/context.rb
@@ -9,14 +9,20 @@ module Gitlab
TimeoutError = Class.new(StandardError)
+ MAX_INCLUDES = 100
+ TRIAL_MAX_INCLUDES = 250
+
include ::Gitlab::Utils::StrongMemoize
attr_reader :project, :sha, :user, :parent_pipeline, :variables
- attr_reader :expandset, :execution_deadline, :logger
+ attr_reader :expandset, :execution_deadline, :logger, :max_includes
delegate :instrument, to: :logger
- def initialize(project: nil, sha: nil, user: nil, parent_pipeline: nil, variables: nil, logger: nil)
+ def initialize(
+ project: nil, sha: nil, user: nil, parent_pipeline: nil, variables: nil,
+ logger: nil
+ )
@project = project
@sha = sha
@user = user
@@ -25,7 +31,7 @@ module Gitlab
@expandset = Set.new
@execution_deadline = 0
@logger = logger || Gitlab::Ci::Pipeline::Logger.new(project: project)
-
+ @max_includes = Feature.enabled?(:ci_increase_includes_to_250, project) ? TRIAL_MAX_INCLUDES : MAX_INCLUDES
yield self if block_given?
end
@@ -52,6 +58,7 @@ module Gitlab
ctx.expandset = expandset
ctx.execution_deadline = execution_deadline
ctx.logger = logger
+ ctx.max_includes = max_includes
end
end
@@ -86,7 +93,7 @@ module Gitlab
protected
- attr_writer :expandset, :execution_deadline, :logger
+ attr_writer :expandset, :execution_deadline, :logger, :max_includes
private
diff --git a/lib/gitlab/ci/config/external/file/project.rb b/lib/gitlab/ci/config/external/file/project.rb
index b7fef081269..89418bd6a21 100644
--- a/lib/gitlab/ci/config/external/file/project.rb
+++ b/lib/gitlab/ci/config/external/file/project.rb
@@ -13,7 +13,7 @@ module Gitlab
def initialize(params, context)
@location = params[:file]
- @project_name = params[:project]
+ @project_name = get_project_name(params[:project])
@ref_name = params[:ref] || 'HEAD'
super
@@ -122,6 +122,16 @@ module Gitlab
)
end
end
+
+ # TODO: To be removed after we deprecate usage of array in `project` keyword.
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/365975
+ def get_project_name(project_name)
+ if project_name.is_a?(Array)
+ project_name.first
+ else
+ project_name
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/mapper.rb b/lib/gitlab/ci/config/external/mapper.rb
index c1250c82750..2a1060a6059 100644
--- a/lib/gitlab/ci/config/external/mapper.rb
+++ b/lib/gitlab/ci/config/external/mapper.rb
@@ -7,8 +7,6 @@ module Gitlab
class Mapper
include Gitlab::Utils::StrongMemoize
- MAX_INCLUDES = 100
-
FILE_CLASSES = [
External::File::Remote,
External::File::Template,
@@ -134,8 +132,8 @@ module Gitlab
end
def verify_max_includes!
- if expandset.count >= MAX_INCLUDES
- raise TooManyIncludesError, "Maximum of #{MAX_INCLUDES} nested includes are allowed!"
+ if expandset.count >= context.max_includes
+ raise TooManyIncludesError, "Maximum of #{context.max_includes} nested includes are allowed!"
end
end
diff --git a/lib/gitlab/ci/jwt.rb b/lib/gitlab/ci/jwt.rb
index 19678def666..c294291e538 100644
--- a/lib/gitlab/ci/jwt.rb
+++ b/lib/gitlab/ci/jwt.rb
@@ -64,7 +64,8 @@ module Gitlab
if environment.present?
fields.merge!(
environment: environment.name,
- environment_protected: environment_protected?.to_s
+ environment_protected: environment_protected?.to_s,
+ deployment_tier: build.environment_deployment_tier || environment.tier
)
end
diff --git a/lib/gitlab/ci/pipeline/chain/create.rb b/lib/gitlab/ci/pipeline/chain/create.rb
index 71dfc1a676c..207b4b5ff8b 100644
--- a/lib/gitlab/ci/pipeline/chain/create.rb
+++ b/lib/gitlab/ci/pipeline/chain/create.rb
@@ -11,10 +11,10 @@ module Gitlab
def perform!
logger.instrument_with_sql(:pipeline_save) do
BulkInsertableAssociations.with_bulk_insert do
- with_bulk_insert_tags do
+ ::Ci::BulkInsertableTags.with_bulk_insert_tags do
pipeline.transaction do
pipeline.save!
- CommitStatus.bulk_insert_tags!(statuses)
+ Gitlab::Ci::Tags::BulkInsert.bulk_insert_tags!(statuses)
end
end
end
@@ -29,14 +29,6 @@ module Gitlab
private
- def with_bulk_insert_tags
- previous = Thread.current['ci_bulk_insert_tags']
- Thread.current['ci_bulk_insert_tags'] = true
- yield
- ensure
- Thread.current['ci_bulk_insert_tags'] = previous
- end
-
def statuses
strong_memoize(:statuses) do
pipeline
diff --git a/lib/gitlab/ci/pipeline/metrics.rb b/lib/gitlab/ci/pipeline/metrics.rb
index 33b9ac9b641..c3e0f043b44 100644
--- a/lib/gitlab/ci/pipeline/metrics.rb
+++ b/lib/gitlab/ci/pipeline/metrics.rb
@@ -42,6 +42,15 @@ module Gitlab
::Gitlab::Metrics.histogram(name, comment, labels, buckets)
end
+ def self.pipeline_age_histogram
+ name = :gitlab_ci_pipeline_age_minutes
+ comment = 'Pipeline age histogram'
+ buckets = [5, 30, 120, 720, 1440, 7200, 21600, 43200, 86400, 172800, 518400, 1036800]
+ # 5m 30m 2h 12h 24h 5d 15d 30d 60d 180d 360d 2y
+
+ ::Gitlab::Metrics.histogram(name, comment, {}, buckets)
+ end
+
def self.active_jobs_histogram
name = :gitlab_ci_active_jobs
comment = 'Total amount of active jobs'
diff --git a/lib/gitlab/ci/queue/metrics.rb b/lib/gitlab/ci/queue/metrics.rb
index 7d8303214a5..5cee73238ca 100644
--- a/lib/gitlab/ci/queue/metrics.rb
+++ b/lib/gitlab/ci/queue/metrics.rb
@@ -250,11 +250,7 @@ module Gitlab
end
def running_jobs_relation(job)
- if ::Feature.enabled?(:ci_pending_builds_maintain_denormalized_data)
- ::Ci::RunningBuild.instance_type.where(project_id: job.project_id)
- else
- job.project.builds.running.where(runner: ::Ci::Runner.instance_type)
- end
+ ::Ci::RunningBuild.instance_type.where(project_id: job.project_id)
end
# rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/lib/gitlab/ci/reports/coverage_report_generator.rb b/lib/gitlab/ci/reports/coverage_report_generator.rb
index fd73ed6fd25..76992a48b0a 100644
--- a/lib/gitlab/ci/reports/coverage_report_generator.rb
+++ b/lib/gitlab/ci/reports/coverage_report_generator.rb
@@ -35,17 +35,7 @@ module Gitlab
private
def report_builds
- if child_pipeline_feature_enabled?
- @pipeline.latest_report_builds_in_self_and_descendants(::Ci::JobArtifact.coverage_reports)
- else
- @pipeline.latest_report_builds(::Ci::JobArtifact.coverage_reports)
- end
- end
-
- def child_pipeline_feature_enabled?
- strong_memoize(:feature_enabled) do
- Feature.enabled?(:ci_child_pipeline_coverage_reports, @pipeline.project)
- end
+ @pipeline.latest_report_builds_in_self_and_descendants(::Ci::JobArtifact.coverage_reports)
end
end
end
diff --git a/lib/gitlab/ci/reports/test_report.rb b/lib/gitlab/ci/reports/test_report.rb
new file mode 100644
index 00000000000..4fc10dd736e
--- /dev/null
+++ b/lib/gitlab/ci/reports/test_report.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ class TestReport
+ attr_reader :test_suites
+
+ def initialize
+ @test_suites = {}
+ end
+
+ def get_suite(suite_name)
+ test_suites[suite_name] ||= TestSuite.new(suite_name)
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def total_time
+ test_suites.values.sum(&:total_time)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def total_count
+ test_suites.values.sum(&:total_count)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def total_status
+ if failed_count > 0 || error_count > 0
+ TestCase::STATUS_FAILED
+ else
+ TestCase::STATUS_SUCCESS
+ end
+ end
+
+ def with_attachment!
+ @test_suites.keep_if do |_job_name, test_suite|
+ test_suite.with_attachment!.present?
+ end
+
+ self
+ end
+
+ def suite_errors
+ test_suites.transform_values(&:suite_error).compact
+ end
+
+ TestCase::STATUS_TYPES.each do |status_type|
+ define_method("#{status_type}_count") do
+ # rubocop: disable CodeReuse/ActiveRecord
+ test_suites.values.sum { |suite| suite.public_send("#{status_type}_count") } # rubocop:disable GitlabSecurity/PublicSend
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/test_reports.rb b/lib/gitlab/ci/reports/test_reports.rb
deleted file mode 100644
index a5a630642e5..00000000000
--- a/lib/gitlab/ci/reports/test_reports.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Ci
- module Reports
- class TestReports
- attr_reader :test_suites
-
- def initialize
- @test_suites = {}
- end
-
- def get_suite(suite_name)
- test_suites[suite_name] ||= TestSuite.new(suite_name)
- end
-
- # rubocop: disable CodeReuse/ActiveRecord
- def total_time
- test_suites.values.sum(&:total_time)
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # rubocop: disable CodeReuse/ActiveRecord
- def total_count
- test_suites.values.sum(&:total_count)
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- def total_status
- if failed_count > 0 || error_count > 0
- TestCase::STATUS_FAILED
- else
- TestCase::STATUS_SUCCESS
- end
- end
-
- def with_attachment!
- @test_suites.keep_if do |_job_name, test_suite|
- test_suite.with_attachment!.present?
- end
-
- self
- end
-
- def suite_errors
- test_suites.transform_values(&:suite_error).compact
- end
-
- TestCase::STATUS_TYPES.each do |status_type|
- define_method("#{status_type}_count") do
- # rubocop: disable CodeReuse/ActiveRecord
- test_suites.values.sum { |suite| suite.public_send("#{status_type}_count") } # rubocop:disable GitlabSecurity/PublicSend
- # rubocop: enable CodeReuse/ActiveRecord
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/ci/reports/test_reports_comparer.rb b/lib/gitlab/ci/reports/test_reports_comparer.rb
index c6f17f0764f..497831ae5a7 100644
--- a/lib/gitlab/ci/reports/test_reports_comparer.rb
+++ b/lib/gitlab/ci/reports/test_reports_comparer.rb
@@ -9,7 +9,7 @@ module Gitlab
attr_reader :base_reports, :head_reports
def initialize(base_reports, head_reports)
- @base_reports = base_reports || TestReports.new
+ @base_reports = base_reports || TestReport.new
@head_reports = head_reports
end
diff --git a/lib/gitlab/ci/runner/metrics.rb b/lib/gitlab/ci/runner/metrics.rb
new file mode 100644
index 00000000000..8df126decff
--- /dev/null
+++ b/lib/gitlab/ci/runner/metrics.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Runner
+ class Metrics
+ extend Gitlab::Utils::StrongMemoize
+
+ def increment_runner_authentication_success_counter(runner_type: 'unknown_type')
+ raise ArgumentError, "unknown runner type: #{runner_type}" unless
+ ::Ci::Runner.runner_types.include? runner_type
+
+ self.class.runner_authentication_success_counter.increment(runner_type: runner_type)
+ end
+
+ def increment_runner_authentication_failure_counter
+ self.class.runner_authentication_failure_counter.increment
+ end
+
+ def self.runner_authentication_success_counter
+ strong_memoize(:runner_authentication_success) do
+ name = :gitlab_ci_runner_authentication_success_total
+ comment = 'Runner authentication success'
+ labels = { runner_type: nil }
+
+ ::Gitlab::Metrics.counter(name, comment, labels)
+ end
+ end
+
+ def self.runner_authentication_failure_counter
+ strong_memoize(:runner_authentication_failure) do
+ name = :gitlab_ci_runner_authentication_failure_total
+ comment = 'Runner authentication failure'
+
+ ::Gitlab::Metrics.counter(name, comment)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/runner_releases.rb b/lib/gitlab/ci/runner_releases.rb
index 944c24ca128..8773ecbf09e 100644
--- a/lib/gitlab/ci/runner_releases.rb
+++ b/lib/gitlab/ci/runner_releases.rb
@@ -6,48 +6,83 @@ module Gitlab
include Singleton
RELEASES_VALIDITY_PERIOD = 1.day
- RELEASES_VALIDITY_AFTER_ERROR_PERIOD = 5.seconds
INITIAL_BACKOFF = 5.seconds
MAX_BACKOFF = 1.hour
BACKOFF_GROWTH_FACTOR = 2.0
def initialize
- reset!
+ reset_backoff!
end
# Returns a sorted list of the publicly available GitLab Runner releases
#
def releases
- return @releases unless Time.now.utc >= @expire_time
+ return if backoff_active?
+
+ Rails.cache.fetch(
+ cache_key,
+ skip_nil: true,
+ expires_in: RELEASES_VALIDITY_PERIOD,
+ race_condition_ttl: 10.seconds
+ ) do
+ response = Gitlab::HTTP.try_get(runner_releases_url)
+ @releases_by_minor = nil
+
+ unless response&.success?
+ @backoff_expire_time = next_backoff.from_now
+ break nil
+ end
+
+ reset_backoff!
+ extract_releases(response)
+ end
+ end
+
+ # Returns a hash with the latest runner version per minor release
+ #
+ def releases_by_minor
+ return unless releases
- @releases = fetch_new_releases
+ @releases_by_minor ||= releases.group_by(&:without_patch).transform_values(&:max)
end
- def reset!
- @expire_time = Time.now.utc
- @releases = nil
+ def reset_backoff!
+ @backoff_expire_time = nil
@backoff_count = 0
end
- public_class_method :instance
-
private
- def fetch_new_releases
- response = Gitlab::HTTP.try_get(::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url)
+ def runner_releases_url
+ @runner_releases_url ||= ::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url
+ end
- releases = response.success? ? extract_releases(response) : nil
- ensure
- @expire_time = (releases ? RELEASES_VALIDITY_PERIOD : next_backoff).from_now
+ def cache_key
+ runner_releases_url
+ end
+
+ def backoff_active?
+ return false unless @backoff_expire_time
+
+ Time.now.utc < @backoff_expire_time
end
def extract_releases(response)
- response.parsed_response.map { |release| parse_runner_release(release) }.sort!
+ return unless response.parsed_response.is_a?(Array)
+
+ releases = response.parsed_response
+ .map { |release| parse_runner_release(release) }
+ .select(&:valid?)
+ .sort!
+
+ return if releases.empty? && response.parsed_response.present?
+
+ releases
end
def parse_runner_release(release)
- ::Gitlab::VersionInfo.parse(release['name'].delete_prefix('v'))
+ ::Gitlab::VersionInfo.parse(release['name'], parse_suffix: true)
end
def next_backoff
diff --git a/lib/gitlab/ci/runner_upgrade_check.rb b/lib/gitlab/ci/runner_upgrade_check.rb
index 0808290fe5b..10a89bb15d4 100644
--- a/lib/gitlab/ci/runner_upgrade_check.rb
+++ b/lib/gitlab/ci/runner_upgrade_check.rb
@@ -5,76 +5,71 @@ module Gitlab
class RunnerUpgradeCheck
include Singleton
- STATUSES = {
- invalid: 'Runner version is not valid.',
- not_available: 'Upgrade is not available for the runner.',
- available: 'Upgrade is available for the runner.',
- recommended: 'Upgrade is available and recommended for the runner.'
- }.freeze
-
- def initialize
- reset!
- end
-
def check_runner_upgrade_status(runner_version)
- return :invalid unless runner_version
+ runner_version = ::Gitlab::VersionInfo.parse(runner_version, parse_suffix: true)
- releases = RunnerReleases.instance.releases
- orig_runner_version = runner_version
- runner_version = ::Gitlab::VersionInfo.parse(runner_version) unless runner_version.is_a?(::Gitlab::VersionInfo)
+ return { invalid_version: runner_version } unless runner_version.valid?
+ return { error: runner_version } unless runner_releases_store.releases
- raise ArgumentError, "'#{orig_runner_version}' is not a valid version" unless runner_version.valid?
+ # Recommend update if outside of backport window
+ recommended_version = recommendation_if_outside_backport_window(runner_version)
+ return { recommended: recommended_version } if recommended_version
- gitlab_minor_version = version_without_patch(@gitlab_version)
+ # Recommend patch update if there's a newer release in a same minor branch as runner
+ recommended_version = recommended_runner_release_update(runner_version)
+ return { recommended: recommended_version } if recommended_version
- available_releases = releases
- .reject { |release| release.major > @gitlab_version.major }
- .reject do |release|
- release_minor_version = version_without_patch(release)
+ # Consider update if there's a newer release within the currently deployed GitLab version
+ available_version = available_runner_release(runner_version)
+ return { available: available_version } if available_version
- # Do not reject a patch update, even if the runner is ahead of the instance version
- next false if version_without_patch(runner_version) == release_minor_version
+ { not_available: runner_version }
+ end
- release_minor_version > gitlab_minor_version
- end
+ private
- return :recommended if available_releases.any? { |available_rel| patch_update?(available_rel, runner_version) }
- return :recommended if outside_backport_window?(runner_version, releases)
- return :available if available_releases.any? { |available_rel| available_rel > runner_version }
+ def recommended_runner_release_update(runner_version)
+ recommended_release = runner_releases_store.releases_by_minor[runner_version.without_patch]
+ return recommended_release if recommended_release && recommended_release > runner_version
- :not_available
+ # Consider the edge case of pre-release runner versions that get registered, but are never published.
+ # In this case, suggest the latest compatible runner version
+ latest_release = runner_releases_store.releases_by_minor.values.select { |v| v < gitlab_version }.max
+ latest_release if latest_release && latest_release > runner_version
end
- def reset!
- @gitlab_version = ::Gitlab::VersionInfo.parse(::Gitlab::VERSION)
+ def available_runner_release(runner_version)
+ available_release = runner_releases_store.releases_by_minor[gitlab_version.without_patch]
+ available_release if available_release && available_release > runner_version
end
- public_class_method :instance
-
- private
-
- def patch_update?(available_release, runner_version)
- # https://docs.gitlab.com/ee/policy/maintenance.html#patch-releases
- available_release.major == runner_version.major &&
- available_release.minor == runner_version.minor &&
- available_release.patch > runner_version.patch
+ def gitlab_version
+ @gitlab_version ||= ::Gitlab::VersionInfo.parse(::Gitlab::VERSION, parse_suffix: true)
end
- def outside_backport_window?(runner_version, releases)
- return false if runner_version >= releases.last # return early if runner version is too new
-
- latest_minor_releases = releases.map { |r| version_without_patch(r) }.uniq { |v| v.to_s }
- latest_version_position = latest_minor_releases.count - 1
- runner_version_position = latest_minor_releases.index(version_without_patch(runner_version))
-
- return true if runner_version_position.nil? # consider outside if version is too old
-
- # https://docs.gitlab.com/ee/policy/maintenance.html#backporting-to-older-releases
- latest_version_position - runner_version_position > 2
+ def runner_releases_store
+ RunnerReleases.instance
end
- def version_without_patch(version)
- ::Gitlab::VersionInfo.new(version.major, version.minor, 0)
+ def recommendation_if_outside_backport_window(runner_version)
+ return if runner_releases_store.releases.empty?
+ return if runner_version >= runner_releases_store.releases.last # return early if runner version is too new
+
+ minor_releases_with_index = runner_releases_store.releases_by_minor.keys.each_with_index.to_h
+ runner_minor_version_index = minor_releases_with_index[runner_version.without_patch]
+ if runner_minor_version_index
+ # https://docs.gitlab.com/ee/policy/maintenance.html#backporting-to-older-releases
+ outside_window = minor_releases_with_index.count - runner_minor_version_index > 3
+
+ if outside_window
+ recommended_release = runner_releases_store.releases_by_minor[gitlab_version.without_patch]
+
+ recommended_release if recommended_release && recommended_release > runner_version
+ end
+ else
+ # If unknown runner version, then recommend the latest version for the GitLab instance
+ recommended_runner_release_update(gitlab_version)
+ end
end
end
end
diff --git a/lib/gitlab/ci/status/build/failed.rb b/lib/gitlab/ci/status/build/failed.rb
index 1a074c1af53..5d60aa8f540 100644
--- a/lib/gitlab/ci/status/build/failed.rb
+++ b/lib/gitlab/ci/status/build/failed.rb
@@ -20,10 +20,13 @@ module Gitlab
scheduler_failure: 'scheduler failure',
data_integrity_failure: 'data integrity failure',
forward_deployment_failure: 'forward deployment failure',
+ protected_environment_failure: 'protected environment failure',
pipeline_loop_detected: 'job would create infinitely looping pipelines',
invalid_bridge_trigger: 'downstream pipeline trigger definition is invalid',
downstream_bridge_project_not_found: 'downstream project could not be found',
+ upstream_bridge_project_not_found: 'upstream project could not be found',
insufficient_bridge_permissions: 'no permissions to trigger downstream pipeline',
+ insufficient_upstream_permissions: 'no permissions to read upstream project',
bridge_pipeline_is_child_pipeline: 'creation of child pipeline not allowed from another child pipeline',
downstream_pipeline_creation_failed: 'downstream pipeline can not be created',
secrets_provider_not_found: 'secrets provider can not be found',
@@ -75,5 +78,3 @@ module Gitlab
end
end
end
-
-Gitlab::Ci::Status::Build::Failed.prepend_mod_with('Gitlab::Ci::Status::Build::Failed')
diff --git a/lib/gitlab/ci/status/composite.rb b/lib/gitlab/ci/status/composite.rb
index 3b2da773102..e854164d377 100644
--- a/lib/gitlab/ci/status/composite.rb
+++ b/lib/gitlab/ci/status/composite.rb
@@ -7,10 +7,7 @@ module Gitlab
include Gitlab::Utils::StrongMemoize
# This class accepts an array of arrays/hashes/or objects
- #
- # The parameter `project` is only used for the feature flag check, and will be removed with
- # https://gitlab.com/gitlab-org/gitlab/-/issues/321972
- def initialize(all_statuses, with_allow_failure: true, dag: false, project: nil)
+ def initialize(all_statuses, with_allow_failure: true, dag: false)
unless all_statuses.respond_to?(:pluck)
raise ArgumentError, "all_statuses needs to respond to `.pluck`"
end
@@ -19,7 +16,6 @@ module Gitlab
@status_key = 0
@allow_failure_key = 1 if with_allow_failure
@dag = dag
- @project = project
consume_all_statuses(all_statuses)
end
diff --git a/lib/gitlab/ci/tags/bulk_insert.rb b/lib/gitlab/ci/tags/bulk_insert.rb
index 29f3731a9b4..2e56e47f5b8 100644
--- a/lib/gitlab/ci/tags/bulk_insert.rb
+++ b/lib/gitlab/ci/tags/bulk_insert.rb
@@ -9,40 +9,44 @@ module Gitlab
TAGGINGS_BATCH_SIZE = 1000
TAGS_BATCH_SIZE = 500
- def initialize(statuses)
- @statuses = statuses
+ def self.bulk_insert_tags!(taggables)
+ Gitlab::Ci::Tags::BulkInsert.new(taggables).insert!
+ end
+
+ def initialize(taggables)
+ @taggables = taggables
end
def insert!
- return false if tag_list_by_status.empty?
+ return false if tag_list_by_taggable.empty?
persist_build_tags!
end
private
- attr_reader :statuses
+ attr_reader :taggables
- def tag_list_by_status
- strong_memoize(:tag_list_by_status) do
- statuses.each.with_object({}) do |status, acc|
- tag_list = status.tag_list
+ def tag_list_by_taggable
+ strong_memoize(:tag_list_by_taggable) do
+ taggables.each.with_object({}) do |taggable, acc|
+ tag_list = taggable.tag_list
next unless tag_list
- acc[status] = tag_list
+ acc[taggable] = tag_list
end
end
end
def persist_build_tags!
- all_tags = tag_list_by_status.values.flatten.uniq.reject(&:blank?)
+ all_tags = tag_list_by_taggable.values.flatten.uniq.reject(&:blank?)
tag_records_by_name = create_tags(all_tags).index_by(&:name)
taggings = build_taggings_attributes(tag_records_by_name)
return false if taggings.empty?
taggings.each_slice(TAGGINGS_BATCH_SIZE) do |taggings_slice|
- ActsAsTaggableOn::Tagging.insert_all!(taggings)
+ ActsAsTaggableOn::Tagging.insert_all!(taggings_slice)
end
true
@@ -65,24 +69,24 @@ module Gitlab
# rubocop: enable CodeReuse/ActiveRecord
def build_taggings_attributes(tag_records_by_name)
- taggings = statuses.flat_map do |status|
- tag_list = tag_list_by_status[status]
+ taggings = taggables.flat_map do |taggable|
+ tag_list = tag_list_by_taggable[taggable]
next unless tag_list
tags = tag_records_by_name.values_at(*tag_list)
- taggings_for(tags, status)
+ taggings_for(tags, taggable)
end
taggings.compact!
taggings
end
- def taggings_for(tags, status)
+ def taggings_for(tags, taggable)
tags.map do |tag|
{
tag_id: tag.id,
- taggable_type: CommitStatus.name,
- taggable_id: status.id,
+ taggable_type: taggable.class.base_class.name,
+ taggable_id: taggable.id,
created_at: Time.current,
context: 'tags'
}
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 17e49440784..1ac9c319429 100644
--- a/lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml
@@ -7,6 +7,7 @@ stages:
- build
- test
- review
+ - dast
- deploy
- production
- cleanup
diff --git a/lib/gitlab/ci/templates/Android.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Android.latest.gitlab-ci.yml
index 9f0e9bcc1f2..ee52bc91ab3 100644
--- a/lib/gitlab/ci/templates/Android.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Android.latest.gitlab-ci.yml
@@ -30,24 +30,24 @@ before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- # Setup path as ANDROID_SDK_ROOT for moving/exporting the downloaded sdk into it
- - export ANDROID_SDK_ROOT="${PWD}/android-home"
+ # Setup path as ANDROID_HOME for moving/exporting the downloaded sdk into it
+ - export ANDROID_HOME="${PWD}/android-home"
# Create a new directory at specified location
- - install -d $ANDROID_SDK_ROOT
+ - install -d $ANDROID_HOME
# Here we are installing androidSDK tools from official source,
# (the key thing here is the url from where you are downloading these sdk tool for command line, so please do note this url pattern there and here as well)
# after that unzipping those tools and
# then running a series of SDK manager commands to install necessary android SDK packages that'll allow the app to build
- - wget --output-document=$ANDROID_SDK_ROOT/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
- # move to the archive at ANDROID_SDK_ROOT
- - pushd $ANDROID_SDK_ROOT
+ - wget --output-document=$ANDROID_HOME/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
+ # move to the archive at ANDROID_HOME
+ - pushd $ANDROID_HOME
- unzip -d cmdline-tools cmdline-tools.zip
- pushd cmdline-tools
# since commandline tools version 7583922 the root folder is named "cmdline-tools" so we rename it if necessary
- mv cmdline-tools tools || true
- popd
- popd
- - export PATH=$PATH:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/
+ - export PATH=$PATH:${ANDROID_HOME}/cmdline-tools/tools/bin/
# Nothing fancy here, just checking sdkManager version
- sdkmanager --version
diff --git a/lib/gitlab/ci/templates/Bash.gitlab-ci.yml b/lib/gitlab/ci/templates/Bash.gitlab-ci.yml
index f39a84bceec..004c2897b60 100644
--- a/lib/gitlab/ci/templates/Bash.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Bash.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/C++.gitlab-ci.yml b/lib/gitlab/ci/templates/C++.gitlab-ci.yml
index c078c99f352..3096af1b173 100644
--- a/lib/gitlab/ci/templates/C++.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/C++.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Chef.gitlab-ci.yml b/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
index f166da9bdd6..a64f87193a9 100644
--- a/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
@@ -1,14 +1,17 @@
-# 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
# for help configuring your runner properly, or, if you want to switch
# to a different driver, see http://kitchen.ci/docs/drivers
+#
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
+# 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
image: "chef/chefdk"
services:
diff --git a/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml b/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml
index 0f9e28c9a8e..4fe37ceaeaa 100644
--- a/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml b/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml
index 8886929646d..68b55b782cd 100644
--- a/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Dart.gitlab-ci.yml b/lib/gitlab/ci/templates/Dart.gitlab-ci.yml
index 6354db38f58..35401e62fe2 100644
--- a/lib/gitlab/ci/templates/Dart.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Dart.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml b/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml
index 1eb920c7747..83ddce936e6 100644
--- a/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml b/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml
index a5c261e367a..021662ab416 100644
--- a/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml b/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
index 21a599fc78d..464b81965f2 100644
--- a/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
@@ -1,8 +1,3 @@
-# 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.
@@ -11,6 +6,14 @@
# Stages run in sequential order, but jobs within stages run in parallel.
#
# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages
+#
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
+# 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
stages: # List of stages for jobs, and their order of execution
- build
diff --git a/lib/gitlab/ci/templates/Go.gitlab-ci.yml b/lib/gitlab/ci/templates/Go.gitlab-ci.yml
index bd8e1020c4e..603aede4d46 100644
--- a/lib/gitlab/ci/templates/Go.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Go.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Grails.gitlab-ci.yml b/lib/gitlab/ci/templates/Grails.gitlab-ci.yml
index 7e59354c4a1..03c8941169f 100644
--- a/lib/gitlab/ci/templates/Grails.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Grails.gitlab-ci.yml
@@ -1,8 +1,3 @@
-# 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
#
@@ -12,6 +7,14 @@
# Feel free to change GRAILS_VERSION version with your project version (3.0.1, 3.1.1,...)
# Feel free to change GRADLE_VERSION version with your gradle project version (2.13, 2.14,...)
# If you use Angular profile, this yml it's prepared to work with it
+#
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
+# 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
image: java:8
diff --git a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
index 6a95d042842..86e3ace84c5 100644
--- a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
@@ -8,7 +8,7 @@ code_quality:
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
- CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.26"
+ CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.29"
needs: []
script:
- export SOURCE_CODE=$PWD
diff --git a/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
index 8f1124373c4..b41e92e3a56 100644
--- a/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
@@ -4,6 +4,14 @@ variables:
.dast-auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"
+.common_rules: &common_rules
+ - if: $CI_DEFAULT_BRANCH != $CI_COMMIT_REF_NAME
+ when: never
+ - if: $DAST_DISABLED || $DAST_DISABLED_FOR_DEFAULT_BRANCH
+ when: never
+ - if: $DAST_WEBSITE # we don't need to create a review app if a URL is already given
+ when: never
+
dast_environment_deploy:
extends: .dast-auto-deploy
stage: review
@@ -23,12 +31,7 @@ dast_environment_deploy:
artifacts:
paths: [environment_url.txt]
rules:
- - if: $CI_DEFAULT_BRANCH != $CI_COMMIT_REF_NAME
- when: never
- - if: $DAST_DISABLED || $DAST_DISABLED_FOR_DEFAULT_BRANCH
- when: never
- - if: $DAST_WEBSITE # we don't need to create a review app if a URL is already given
- when: never
+ - *common_rules
- if: $CI_COMMIT_BRANCH &&
($CI_KUBERNETES_ACTIVE || $KUBECONFIG) &&
$GITLAB_FEATURES =~ /\bdast\b/
@@ -47,13 +50,53 @@ stop_dast_environment:
action: stop
needs: ["dast"]
rules:
- - if: $CI_DEFAULT_BRANCH != $CI_COMMIT_REF_NAME
- when: never
- - if: $DAST_DISABLED || $DAST_DISABLED_FOR_DEFAULT_BRANCH
- when: never
- - if: $DAST_WEBSITE # we don't need to create a review app if a URL is already given
- when: never
+ - *common_rules
- if: $CI_COMMIT_BRANCH &&
($CI_KUBERNETES_ACTIVE || $KUBECONFIG) &&
$GITLAB_FEATURES =~ /\bdast\b/
when: always
+
+.ecs_image:
+ image: 'registry.gitlab.com/gitlab-org/cloud-deploy/aws-ecs:latest'
+
+.ecs_rules: &ecs_rules
+ - if: $AUTO_DEVOPS_PLATFORM_TARGET != "ECS"
+ when: never
+ - if: $CI_KUBERNETES_ACTIVE || $KUBECONFIG
+ when: never
+
+dast_ecs_environment_deploy:
+ extends: .ecs_image
+ stage: review
+ script:
+ - ecs update-task-definition
+ - echo "http://$(ecs get-task-hostname)" > environment_url.txt
+ environment:
+ name: dast-default
+ on_stop: stop_dast_ecs_environment
+ artifacts:
+ paths:
+ - environment_url.txt
+ rules:
+ - *common_rules
+ - *ecs_rules
+ - if: $CI_COMMIT_BRANCH && $GITLAB_FEATURES =~ /\bdast\b/
+
+stop_dast_ecs_environment:
+ extends: .ecs_image
+ stage: cleanup
+ variables:
+ GIT_STRATEGY: none
+ script:
+ - ecs stop-task
+ allow_failure: true
+ environment:
+ name: dast-default
+ action: stop
+ needs:
+ - dast
+ rules:
+ - *common_rules
+ - *ecs_rules
+ - if: $CI_COMMIT_BRANCH && $GITLAB_FEATURES =~ /\bdast\b/
+ when: always
diff --git a/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
index b95b36fd555..a9d9c400a34 100644
--- a/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
@@ -46,10 +46,10 @@ dependency_scanning:
script:
- /analyzer run
-.cyclone-dx-reports:
+.cyclonedx-reports:
artifacts:
paths:
- - "**/cyclonedx-*.json"
+ - "**/gl-sbom-*.cdx.json"
.gemnasium-shared-rule:
exists:
@@ -66,7 +66,7 @@ dependency_scanning:
gemnasium-dependency_scanning:
extends:
- .ds-analyzer
- - .cyclone-dx-reports
+ - .cyclonedx-reports
variables:
DS_ANALYZER_NAME: "gemnasium"
GEMNASIUM_LIBRARY_SCAN_ENABLED: "true"
@@ -81,6 +81,7 @@ gemnasium-dependency_scanning:
exists: !reference [.gemnasium-shared-rule, exists]
variables:
DS_IMAGE_SUFFIX: "-fips"
+ DS_REMEDIATE: "false"
- if: $CI_COMMIT_BRANCH &&
$GITLAB_FEATURES =~ /\bdependency_scanning\b/
exists: !reference [.gemnasium-shared-rule, exists]
@@ -95,7 +96,7 @@ gemnasium-dependency_scanning:
gemnasium-maven-dependency_scanning:
extends:
- .ds-analyzer
- - .cyclone-dx-reports
+ - .cyclonedx-reports
variables:
DS_ANALYZER_NAME: "gemnasium-maven"
rules:
@@ -125,7 +126,7 @@ gemnasium-maven-dependency_scanning:
gemnasium-python-dependency_scanning:
extends:
- .ds-analyzer
- - .cyclone-dx-reports
+ - .cyclonedx-reports
variables:
DS_ANALYZER_NAME: "gemnasium-python"
rules:
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml
index 9bb2ba69d84..c2d31fd9669 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml
@@ -20,6 +20,11 @@
.review_ecs_base:
stage: review
extends: .deploy_to_ecs
+ after_script:
+ - echo "http://$(ecs get-task-hostname)" > environment_url.txt
+ artifacts:
+ paths:
+ - environment_url.txt
.production_ecs_base:
stage: production
diff --git a/lib/gitlab/ci/templates/Julia.gitlab-ci.yml b/lib/gitlab/ci/templates/Julia.gitlab-ci.yml
index 4687a07d05b..34084272b29 100644
--- a/lib/gitlab/ci/templates/Julia.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Julia.gitlab-ci.yml
@@ -1,8 +1,3 @@
-# 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.
@@ -12,6 +7,14 @@
#
# [1]: http://julialang.org/
# [2]: https://docs.julialang.org/en/v1/manual/documentation/index.html
+#
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
+# 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
# Below is the template to run your tests in Julia
.test_template: &test_definition
diff --git a/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml b/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml
index 0ec67526234..3a490012f3d 100644
--- a/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Mono.gitlab-ci.yml b/lib/gitlab/ci/templates/Mono.gitlab-ci.yml
index 2f214347ec3..65db649e22f 100644
--- a/lib/gitlab/ci/templates/Mono.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Mono.gitlab-ci.yml
@@ -1,8 +1,3 @@
-# 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.
#
@@ -15,6 +10,14 @@
#
# Please find the full example project here:
# https://gitlab.com/tobiaskoch/gitlab-ci-example-mono
+#
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
+# 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
# see https://hub.docker.com/_/mono/
image: mono:latest
diff --git a/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml b/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
index 44370f896a7..7a4f7ed628b 100644
--- a/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml b/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml
index 7c8bbe464af..0eb3b483067 100644
--- a/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/PHP.gitlab-ci.yml b/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
index 4edc003a638..12640d28d29 100644
--- a/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml b/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
index 690a5a291e1..aab408aa830 100644
--- a/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Rust.gitlab-ci.yml b/lib/gitlab/ci/templates/Rust.gitlab-ci.yml
index 390f0bb8061..a83f84da818 100644
--- a/lib/gitlab/ci/templates/Rust.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Rust.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
@@ -26,3 +29,14 @@ test:cargo:
script:
- rustc --version && cargo --version # Print version info for debugging
- cargo test --workspace --verbose
+
+# Optional: Use a third party library to generate gitlab junit reports
+# test:junit-report:
+# script:
+# Should be specified in Cargo.toml
+# - cargo install junitify
+# - cargo test -- --format=json -Z unstable-options --report-time | junitify --out $CI_PROJECT_DIR/tests/
+# artifacts:
+# when: always
+# reports:
+# junit: $CI_PROJECT_DIR/tests/*.xml
diff --git a/lib/gitlab/ci/templates/Scala.gitlab-ci.yml b/lib/gitlab/ci/templates/Scala.gitlab-ci.yml
index de54d64dc42..26efe7a8908 100644
--- a/lib/gitlab/ci/templates/Scala.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Scala.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/Swift.gitlab-ci.yml b/lib/gitlab/ci/templates/Swift.gitlab-ci.yml
index eedb3b7a310..3c4533d603e 100644
--- a/lib/gitlab/ci/templates/Swift.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Swift.gitlab-ci.yml
@@ -1,3 +1,6 @@
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
# 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:
diff --git a/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml b/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml
index 841f17767eb..50ce181095e 100644
--- a/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml
@@ -23,6 +23,9 @@
# You need to have the network drive mapped as Local System user for gitlab-runner service to see it
# The best way to persist the mapping is via a scheduled task
# running the following batch command: net use P: \\x.x.x.x\Projects /u:your_user your_pass /persistent:yes
+#
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
# place project specific paths in variables to make the rest of the script more generic
variables:
diff --git a/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml b/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
index 0b75c298167..58e840da713 100644
--- a/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
@@ -1,8 +1,3 @@
-# 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.
@@ -15,6 +10,14 @@
# https://docs.gitlab.com/runner/security/#usage-of-shell-executor for additional
# detail on what to keep in mind in this scenario.
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+
+# 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
+
stages:
- build
- test
diff --git a/lib/gitlab/ci/variables/builder.rb b/lib/gitlab/ci/variables/builder.rb
index a452cb197ae..95dff83506d 100644
--- a/lib/gitlab/ci/variables/builder.rb
+++ b/lib/gitlab/ci/variables/builder.rb
@@ -26,7 +26,6 @@ module Gitlab
variables.concat(secret_instance_variables)
variables.concat(secret_group_variables(environment: environment))
variables.concat(secret_project_variables(environment: environment))
- variables.concat(job.trigger_request.user_variables) if job.trigger_request
variables.concat(pipeline.variables)
variables.concat(pipeline_schedule_variables)
end
@@ -52,7 +51,7 @@ module Gitlab
# https://gitlab.com/groups/gitlab-org/configure/-/epics/8
# Until then, we need to make both the old and the new KUBECONFIG contexts available
collection.concat(deployment_variables(environment: environment, job: job))
- template = ::Ci::GenerateKubeconfigService.new(pipeline, token: job.token).execute
+ template = ::Ci::GenerateKubeconfigService.new(pipeline, token: job.try(:token)).execute
kubeconfig_yaml = collection['KUBECONFIG']&.value
template.merge_yaml(kubeconfig_yaml) if kubeconfig_yaml.present?
diff --git a/lib/gitlab/ci/yaml_processor.rb b/lib/gitlab/ci/yaml_processor.rb
index 15ebd506055..59acfa80258 100644
--- a/lib/gitlab/ci/yaml_processor.rb
+++ b/lib/gitlab/ci/yaml_processor.rb
@@ -16,6 +16,14 @@ module Gitlab
end
def execute
+ Gitlab::Ci::YamlProcessor::FeatureFlags.with_actor(project) do
+ parse_config
+ end
+ end
+
+ private
+
+ def parse_config
if @config_content.blank?
return Result.new(errors: ['Please provide content of .gitlab-ci.yml'])
end
@@ -35,7 +43,9 @@ module Gitlab
Result.new(ci_config: @ci_config, errors: [e.message], warnings: @ci_config&.warnings)
end
- private
+ def project
+ @opts[:project]
+ end
def run_logical_validations!
@stages = @ci_config.stages
diff --git a/lib/gitlab/ci/yaml_processor/feature_flags.rb b/lib/gitlab/ci/yaml_processor/feature_flags.rb
new file mode 100644
index 00000000000..f03db9d0e6b
--- /dev/null
+++ b/lib/gitlab/ci/yaml_processor/feature_flags.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ class YamlProcessor
+ module FeatureFlags
+ ACTOR_KEY = 'ci_yaml_processor_feature_flag_actor'
+ NO_ACTOR_VALUE = :no_actor
+
+ NoActorError = Class.new(StandardError)
+ NO_ACTOR_MESSAGE = "Actor not set. Ensure to call `enabled?` inside `with_actor` block"
+
+ class << self
+ # Cache a feature flag actor as thread local variable so
+ # we can have it available later with #enabled?
+ def with_actor(actor)
+ previous = Thread.current[ACTOR_KEY]
+
+ # When actor is `nil` the method `Thread.current[]=` does not
+ # create the ACTOR_KEY. Instead, we want to still save an explicit
+ # value to know that we are within the `with_actor` block.
+ Thread.current[ACTOR_KEY] = actor || NO_ACTOR_VALUE
+
+ yield
+ ensure
+ Thread.current[ACTOR_KEY] = previous
+ end
+
+ # Use this to check if a feature flag is enabled
+ def enabled?(feature_flag)
+ ::Feature.enabled?(feature_flag, current_actor)
+ end
+
+ private
+
+ def current_actor
+ value = Thread.current[ACTOR_KEY] || (raise NoActorError, NO_ACTOR_MESSAGE)
+ return if value == NO_ACTOR_VALUE
+
+ value
+ rescue NoActorError => e
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
+
+ nil
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cluster/puma_worker_killer_initializer.rb b/lib/gitlab/cluster/puma_worker_killer_initializer.rb
index e634291f894..5908de68687 100644
--- a/lib/gitlab/cluster/puma_worker_killer_initializer.rb
+++ b/lib/gitlab/cluster/puma_worker_killer_initializer.rb
@@ -5,10 +5,10 @@ module Gitlab
class PumaWorkerKillerInitializer
def self.start(
puma_options,
- puma_per_worker_max_memory_mb: 1024,
- puma_master_max_memory_mb: 800,
- additional_puma_dev_max_memory_mb: 200
- )
+ puma_per_worker_max_memory_mb: 1200,
+ puma_master_max_memory_mb: 950,
+ additional_puma_dev_max_memory_mb: 200)
+
require 'puma_worker_killer'
PumaWorkerKiller.config do |config|
diff --git a/lib/gitlab/content_security_policy/config_loader.rb b/lib/gitlab/content_security_policy/config_loader.rb
index 574a7dceaa4..8648ffe5f49 100644
--- a/lib/gitlab/content_security_policy/config_loader.rb
+++ b/lib/gitlab/content_security_policy/config_loader.rb
@@ -7,6 +7,8 @@ module Gitlab
form_action frame_ancestors frame_src img_src manifest_src
media_src object_src report_uri script_src style_src worker_src).freeze
+ DEFAULT_FALLBACK_VALUE = '<default_value>'
+
def self.default_enabled
Rails.env.development? || Rails.env.test?
end
@@ -62,8 +64,10 @@ module Gitlab
end
def initialize(csp_directives)
+ # Using <default_value> falls back to the default values.
+ directives = csp_directives.reject { |_, value| value == DEFAULT_FALLBACK_VALUE }
@merged_csp_directives =
- HashWithIndifferentAccess.new(csp_directives)
+ HashWithIndifferentAccess.new(directives)
.reverse_merge(::Gitlab::ContentSecurityPolicy::ConfigLoader.default_directives)
end
@@ -134,9 +138,8 @@ module Gitlab
def self.allow_sentry(directives)
sentry_dsn = Gitlab.config.sentry.clientside_dsn
sentry_uri = URI(sentry_dsn)
- sentry_uri.user = nil
- append_to_directive(directives, 'connect_src', sentry_uri.to_s)
+ append_to_directive(directives, 'connect_src', "#{sentry_uri.scheme}://#{sentry_uri.host}")
end
def self.allow_letter_opener(directives)
diff --git a/lib/gitlab/contributions_calendar.rb b/lib/gitlab/contributions_calendar.rb
index f48ba27888c..4d289a59a6a 100644
--- a/lib/gitlab/contributions_calendar.rb
+++ b/lib/gitlab/contributions_calendar.rb
@@ -12,11 +12,8 @@ module Gitlab
@contributor = contributor
@contributor_time_instance = local_timezone_instance(contributor.timezone).now
@current_user = current_user
- @projects = if @contributor.include_private_contributions?
- ContributedProjectsFinder.new(@contributor).execute(@contributor)
- else
- ContributedProjectsFinder.new(contributor).execute(current_user)
- end
+ @projects = ContributedProjectsFinder.new(contributor)
+ .execute(current_user, ignore_visibility: @contributor.include_private_contributions?)
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/data_builder/deployment.rb b/lib/gitlab/data_builder/deployment.rb
index 0e6841e10a7..a9c69e3f997 100644
--- a/lib/gitlab/data_builder/deployment.rb
+++ b/lib/gitlab/data_builder/deployment.rb
@@ -5,7 +5,8 @@ module Gitlab
module Deployment
extend self
- def build(deployment, status_changed_at)
+ # NOTE: Time-sensitive attributes should be explicitly passed as argument instead of reading from database.
+ def build(deployment, status, status_changed_at)
# Deployments will not have a deployable when created using the API.
deployable_url =
if deployment.deployable
@@ -22,9 +23,13 @@ module Gitlab
Gitlab::UrlBuilder.build(deployment.deployed_by)
end
+ # `status` argument could be `nil` during the upgrade. We can remove `deployment.status` in GitLab 15.5.
+ # See https://docs.gitlab.com/ee/development/multi_version_compatibility.html for more info.
+ deployment_status = status || deployment.status
+
{
object_kind: 'deployment',
- status: deployment.status,
+ status: deployment_status,
status_changed_at: status_changed_at,
deployment_id: deployment.id,
deployable_id: deployment.deployable_id,
diff --git a/lib/gitlab/data_builder/issuable.rb b/lib/gitlab/data_builder/issuable.rb
index 9a0b964915c..d12537c4874 100644
--- a/lib/gitlab/data_builder/issuable.rb
+++ b/lib/gitlab/data_builder/issuable.rb
@@ -18,7 +18,7 @@ module Gitlab
user: user.hook_attrs,
project: issuable.project.hook_attrs,
object_attributes: issuable_builder.new(issuable).build,
- labels: issuable.labels.map(&:hook_attrs),
+ labels: issuable.labels_hook_attrs,
changes: final_changes(changes.slice(*safe_keys)),
# DEPRECATED
repository: issuable.project.hook_attrs.slice(:name, :url, :description, :homepage)
diff --git a/lib/gitlab/data_builder/pipeline.rb b/lib/gitlab/data_builder/pipeline.rb
index c13bb1d6a9a..2c124b07006 100644
--- a/lib/gitlab/data_builder/pipeline.rb
+++ b/lib/gitlab/data_builder/pipeline.rb
@@ -118,6 +118,7 @@ module Gitlab
finished_at: build.finished_at,
duration: build.duration,
queued_duration: build.queued_duration,
+ failure_reason: (build.failure_reason if build.failed?),
when: build.when,
manual: build.action?,
allow_failure: build.allow_failure,
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index b42d164d9c4..8703365b678 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -63,13 +63,45 @@ module Gitlab
}.compact.with_indifferent_access.freeze
end
+ # This returns a list of databases that contains all the gitlab_shared schema
+ # tables. We can't reuse database_base_models because Geo does not support
+ # the gitlab_shared tables yet.
+ def self.database_base_models_with_gitlab_shared
+ @database_base_models_with_gitlab_shared ||= {
+ # Note that we use ActiveRecord::Base here and not ApplicationRecord.
+ # This is deliberate, as we also use these classes to apply load
+ # balancing to, and the load balancer must be enabled for _all_ models
+ # that inher from ActiveRecord::Base; not just our own models that
+ # inherit from ApplicationRecord.
+ main: ::ActiveRecord::Base,
+ ci: ::Ci::ApplicationRecord.connection_class? ? ::Ci::ApplicationRecord : nil
+ }.compact.with_indifferent_access.freeze
+ end
+
+ # This returns a list of databases whose connection supports database load
+ # balancing. We can't reuse the database_base_models method because the Geo
+ # database does not support load balancing yet.
+ #
+ # TODO: https://gitlab.com/gitlab-org/geo-team/discussions/-/issues/5032
+ def self.database_base_models_using_load_balancing
+ @database_base_models_with_gitlab_shared ||= {
+ # Note that we use ActiveRecord::Base here and not ApplicationRecord.
+ # This is deliberate, as we also use these classes to apply load
+ # balancing to, and the load balancer must be enabled for _all_ models
+ # that inher from ActiveRecord::Base; not just our own models that
+ # inherit from ApplicationRecord.
+ main: ::ActiveRecord::Base,
+ ci: ::Ci::ApplicationRecord.connection_class? ? ::Ci::ApplicationRecord : nil
+ }.compact.with_indifferent_access.freeze
+ end
+
# This returns a list of base models with connection associated for a given gitlab_schema
def self.schemas_to_base_models
@schemas_to_base_models ||= {
gitlab_main: [self.database_base_models.fetch(:main)],
gitlab_ci: [self.database_base_models[:ci] || self.database_base_models.fetch(:main)], # use CI or fallback to main
- gitlab_shared: self.database_base_models.values, # all models
- gitlab_internal: self.database_base_models.values # all models
+ gitlab_shared: database_base_models_with_gitlab_shared.values, # all models
+ gitlab_internal: database_base_models.values # all models
}.with_indifferent_access.freeze
end
@@ -168,7 +200,7 @@ module Gitlab
# can potentially upgrade from read to read-write mode (using a different connection), we specify
# up-front that we'll explicitly use the primary for the duration of the operation.
Gitlab::Database::LoadBalancing::Session.current.use_primary do
- base_models = database_base_models.values
+ base_models = database_base_models_using_load_balancing.values
base_models.reduce(block) { |blk, model| -> { model.uncached(&blk) } }.call
end
end
@@ -286,7 +318,7 @@ module Gitlab
extend ActiveSupport::Concern
class_methods do
- # A patch over ActiveRecord::Base.transaction that provides
+ # A patch over ApplicationRecord.transaction that provides
# observability into transactional methods.
def transaction(**options, &block)
transaction_type = get_transaction_type(connection.transaction_open?, options[:requires_new])
diff --git a/lib/gitlab/database/background_migration/batched_job.rb b/lib/gitlab/database/background_migration/batched_job.rb
index ebc3ee240bd..72aa1cfe00b 100644
--- a/lib/gitlab/database/background_migration/batched_job.rb
+++ b/lib/gitlab/database/background_migration/batched_job.rb
@@ -26,6 +26,7 @@ module Gitlab
scope :successful_in_execution_order, -> { where.not(finished_at: nil).with_status(:succeeded).order(:finished_at) }
scope :with_preloads, -> { preload(:batched_migration) }
scope :created_since, ->(date_time) { where('created_at >= ?', date_time) }
+ scope :blocked_by_max_attempts, -> { where('attempts >= ?', MAX_ATTEMPTS) }
state_machine :status, initial: :pending do
state :pending, value: 0
@@ -128,7 +129,8 @@ module Gitlab
batched_migration.column_name,
batch_min_value: min_value,
batch_size: new_batch_size,
- job_arguments: batched_migration.job_arguments
+ job_arguments: batched_migration.job_arguments,
+ job_class: batched_migration.job_class
)
midpoint = next_batch_bounds.last
diff --git a/lib/gitlab/database/background_migration/batched_migration.rb b/lib/gitlab/database/background_migration/batched_migration.rb
index d052d5adc4c..9c8db2243f9 100644
--- a/lib/gitlab/database/background_migration/batched_migration.rb
+++ b/lib/gitlab/database/background_migration/batched_migration.rb
@@ -104,6 +104,12 @@ module Gitlab
.sum(:batch_size)
end
+ def reset_attempts_of_blocked_jobs!
+ batched_jobs.blocked_by_max_attempts.each_batch(of: 100) do |batch|
+ batch.update_all(attempts: 0)
+ end
+ end
+
def interval_elapsed?(variance: 0)
return true unless last_job
@@ -199,10 +205,32 @@ module Gitlab
BatchOptimizer.new(self).optimize!
end
+ def health_context
+ HealthStatus::Context.new([table_name])
+ end
+
def hold!(until_time: 10.minutes.from_now)
+ duration_s = (until_time - Time.current).round
+ Gitlab::AppLogger.info(
+ message: "#{self} put on hold until #{until_time}",
+ migration_id: id,
+ job_class_name: job_class_name,
+ duration_s: duration_s
+ )
+
update!(on_hold_until: until_time)
end
+ def on_hold?
+ return false unless on_hold_until
+
+ on_hold_until > Time.zone.now
+ end
+
+ def to_s
+ "BatchedMigration[id: #{id}]"
+ end
+
private
def validate_batched_jobs_status
diff --git a/lib/gitlab/database/background_migration/batched_migration_runner.rb b/lib/gitlab/database/background_migration/batched_migration_runner.rb
index 388eb596ce2..1bc2e931391 100644
--- a/lib/gitlab/database/background_migration/batched_migration_runner.rb
+++ b/lib/gitlab/database/background_migration/batched_migration_runner.rb
@@ -29,7 +29,8 @@ module Gitlab
if next_batched_job = find_or_create_next_batched_job(active_migration)
migration_wrapper.perform(next_batched_job)
- active_migration.optimize!
+ adjust_migration(active_migration)
+
active_migration.failure! if next_batched_job.failed? && active_migration.should_stop?
else
finish_active_migration(active_migration)
@@ -71,12 +72,17 @@ module Gitlab
elsif migration.finished?
Gitlab::AppLogger.warn "Batched background migration for the given configuration is already finished: #{configuration}"
else
+ migration.reset_attempts_of_blocked_jobs!
+
migration.finalize!
migration.batched_jobs.with_status(:pending).each { |job| migration_wrapper.perform(job) }
run_migration_while(migration, :finalizing)
- raise FailedToFinalize unless migration.finished?
+ error_message = "Batched migration #{migration.job_class_name} could not be completed and a manual action is required."\
+ "Check the admin panel at (`/admin/background_migrations`) for more details."
+
+ raise FailedToFinalize, error_message unless migration.finished?
end
end
@@ -101,7 +107,8 @@ module Gitlab
active_migration.column_name,
batch_min_value: batch_min_value,
batch_size: active_migration.batch_size,
- job_arguments: active_migration.job_arguments)
+ job_arguments: active_migration.job_arguments,
+ job_class: active_migration.job_class)
return if next_batch_bounds.nil?
@@ -135,6 +142,16 @@ module Gitlab
migration.reload_last_job
end
end
+
+ def adjust_migration(active_migration)
+ signal = HealthStatus.evaluate(active_migration)
+
+ if signal.is_a?(HealthStatus::Signals::Stop)
+ active_migration.hold!
+ else
+ active_migration.optimize!
+ end
+ end
end
end
end
diff --git a/lib/gitlab/database/background_migration/health_status.rb b/lib/gitlab/database/background_migration/health_status.rb
new file mode 100644
index 00000000000..01f9c5eb5fd
--- /dev/null
+++ b/lib/gitlab/database/background_migration/health_status.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ module HealthStatus
+ # Rather than passing along the migration, we use a more explicitly defined context
+ Context = Struct.new(:tables)
+
+ def self.evaluate(migration, indicator = Indicators::AutovacuumActiveOnTable)
+ signal = begin
+ indicator.new(migration.health_context).evaluate
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_exception(e, migration_id: migration.id,
+ job_class_name: migration.job_class_name)
+ Signals::Unknown.new(indicator, reason: "unexpected error: #{e.message} (#{e.class})")
+ end
+
+ log_signal(signal, migration) if signal.log_info?
+
+ signal
+ end
+
+ def self.log_signal(signal, migration)
+ Gitlab::AppLogger.info(
+ message: "#{migration} signaled: #{signal}",
+ migration_id: migration.id
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/background_migration/health_status/indicators.rb b/lib/gitlab/database/background_migration/health_status/indicators.rb
new file mode 100644
index 00000000000..69503e5b61f
--- /dev/null
+++ b/lib/gitlab/database/background_migration/health_status/indicators.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ module HealthStatus
+ module Indicators
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table.rb b/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table.rb
new file mode 100644
index 00000000000..48e12609a13
--- /dev/null
+++ b/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ module HealthStatus
+ module Indicators
+ class AutovacuumActiveOnTable
+ def initialize(context)
+ @context = context
+ end
+
+ def evaluate
+ return Signals::NotAvailable.new(self.class, reason: 'indicator disabled') unless enabled?
+
+ autovacuum_active_on = active_autovacuums_for(context.tables)
+
+ if autovacuum_active_on.empty?
+ Signals::Normal.new(self.class, reason: 'no autovacuum running on any relevant tables')
+ else
+ Signals::Stop.new(self.class, reason: "autovacuum running on: #{autovacuum_active_on.join(', ')}")
+ end
+ end
+
+ private
+
+ attr_reader :context
+
+ def enabled?
+ Feature.enabled?(:batched_migrations_health_status_autovacuum, type: :ops)
+ end
+
+ def active_autovacuums_for(tables)
+ Gitlab::Database::PostgresAutovacuumActivity.for_tables(tables)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/background_migration/health_status/signals.rb b/lib/gitlab/database/background_migration/health_status/signals.rb
new file mode 100644
index 00000000000..6cd0ebd1bd0
--- /dev/null
+++ b/lib/gitlab/database/background_migration/health_status/signals.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ module HealthStatus
+ module Signals
+ # Base class for a signal
+ class Base
+ attr_reader :indicator_class, :reason
+
+ def initialize(indicator_class, reason:)
+ @indicator_class = indicator_class
+ @reason = reason
+ end
+
+ def to_s
+ "#{short_name} (indicator: #{indicator_class}; reason: #{reason})"
+ end
+
+ # :nocov:
+ def log_info?
+ false
+ end
+ # :nocov:
+
+ private
+
+ def short_name
+ self.class.name.demodulize
+ end
+ end
+
+ # A Signals::Stop is an indication to put a migration on hold or stop it entirely:
+ # In general, we want to slow down or pause the migration.
+ class Stop < Base
+ # :nocov:
+ def log_info?
+ true
+ end
+ # :nocov:
+ end
+
+ # A Signals::Normal indicates normal system state: We carry on with the migration
+ # and may even attempt to optimize its throughput etc.
+ class Normal < Base; end
+
+ # When given an Signals::Unknown, something unexpected happened while
+ # we evaluated system indicators.
+ class Unknown < Base
+ # :nocov:
+ def log_info?
+ true
+ end
+ # :nocov:
+ end
+
+ # No signal could be determined, e.g. because the indicator
+ # was disabled.
+ class NotAvailable < Base; end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/each_database.rb b/lib/gitlab/database/each_database.rb
index 0d876f5124f..02f008abf85 100644
--- a/lib/gitlab/database/each_database.rb
+++ b/lib/gitlab/database/each_database.rb
@@ -36,8 +36,7 @@ module Gitlab
private
def select_base_models(names)
- base_models = Gitlab::Database.database_base_models
-
+ base_models = Gitlab::Database.database_base_models_with_gitlab_shared
return base_models if names.empty?
names.each_with_object(HashWithIndifferentAccess.new) do |name, hash|
@@ -48,7 +47,7 @@ module Gitlab
end
def with_shared_model_connections(shared_model, selected_databases, &blk)
- Gitlab::Database.database_base_models.each_pair do |connection_name, connection_model|
+ Gitlab::Database.database_base_models_with_gitlab_shared.each_pair do |connection_name, connection_model|
if shared_model.limit_connection_names
next unless shared_model.limit_connection_names.include?(connection_name.to_sym)
end
diff --git a/lib/gitlab/database/gitlab_schema.rb b/lib/gitlab/database/gitlab_schema.rb
index baf4cc48424..365a4283d4c 100644
--- a/lib/gitlab/database/gitlab_schema.rb
+++ b/lib/gitlab/database/gitlab_schema.rb
@@ -13,6 +13,8 @@
module Gitlab
module Database
module GitlabSchema
+ GITLAB_SCHEMAS_FILE = 'lib/gitlab/database/gitlab_schemas.yml'
+
# These tables are deleted/renamed, but still referenced by migrations.
# This is needed for now, but should be removed in the future
DELETED_TABLES = {
@@ -93,7 +95,7 @@ module Gitlab
end
def self.tables_to_schema
- @tables_to_schema ||= YAML.load_file(Rails.root.join('lib/gitlab/database/gitlab_schemas.yml'))
+ @tables_to_schema ||= YAML.load_file(Rails.root.join(GITLAB_SCHEMAS_FILE))
end
def self.schema_names
@@ -102,3 +104,5 @@ module Gitlab
end
end
end
+
+Gitlab::Database::GitlabSchema.prepend_mod
diff --git a/lib/gitlab/database/gitlab_schemas.yml b/lib/gitlab/database/gitlab_schemas.yml
index 71c323cb393..4a467d18f0a 100644
--- a/lib/gitlab/database/gitlab_schemas.yml
+++ b/lib/gitlab/database/gitlab_schemas.yml
@@ -108,10 +108,12 @@ ci_resource_groups: :gitlab_ci
ci_resources: :gitlab_ci
ci_runner_namespaces: :gitlab_ci
ci_runner_projects: :gitlab_ci
+ci_runner_versions: :gitlab_ci
ci_runners: :gitlab_ci
ci_running_builds: :gitlab_ci
ci_sources_pipelines: :gitlab_ci
ci_secure_files: :gitlab_ci
+ci_secure_file_states: :gitlab_ci
ci_sources_projects: :gitlab_ci
ci_stages: :gitlab_ci
ci_subscriptions_projects: :gitlab_ci
@@ -131,7 +133,6 @@ cluster_providers_gcp: :gitlab_main
clusters_applications_cert_managers: :gitlab_main
clusters_applications_cilium: :gitlab_main
clusters_applications_crossplane: :gitlab_main
-clusters_applications_elastic_stacks: :gitlab_main
clusters_applications_helm: :gitlab_main
clusters_applications_ingress: :gitlab_main
clusters_applications_jupyter: :gitlab_main
@@ -139,7 +140,6 @@ clusters_applications_knative: :gitlab_main
clusters_applications_prometheus: :gitlab_main
clusters_applications_runners: :gitlab_main
clusters: :gitlab_main
-clusters_integration_elasticstack: :gitlab_main
clusters_integration_prometheus: :gitlab_main
clusters_kubernetes_namespaces: :gitlab_main
commit_user_mentions: :gitlab_main
@@ -325,6 +325,7 @@ milestone_releases: :gitlab_main
milestones: :gitlab_main
namespace_admin_notes: :gitlab_main
namespace_aggregation_schedules: :gitlab_main
+namespace_bans: :gitlab_main
namespace_limits: :gitlab_main
namespace_package_settings: :gitlab_main
namespace_root_storage_statistics: :gitlab_main
@@ -423,6 +424,8 @@ project_incident_management_settings: :gitlab_main
project_metrics_settings: :gitlab_main
project_mirror_data: :gitlab_main
project_pages_metadata: :gitlab_main
+project_relation_export_uploads: :gitlab_main
+project_relation_exports: :gitlab_main
project_repositories: :gitlab_main
project_repository_states: :gitlab_main
project_repository_storage_moves: :gitlab_main
@@ -432,7 +435,6 @@ projects: :gitlab_main
projects_sync_events: :gitlab_main
project_statistics: :gitlab_main
project_topics: :gitlab_main
-project_tracing_settings: :gitlab_main
prometheus_alert_events: :gitlab_main
prometheus_alerts: :gitlab_main
prometheus_metrics: :gitlab_main
@@ -467,6 +469,10 @@ routes: :gitlab_main
saml_group_links: :gitlab_main
saml_providers: :gitlab_main
saved_replies: :gitlab_main
+sbom_components: :gitlab_main
+sbom_occurrences: :gitlab_main
+sbom_component_versions: :gitlab_main
+sbom_sources: :gitlab_main
schema_migrations: :gitlab_internal
scim_identities: :gitlab_main
scim_oauth_access_tokens: :gitlab_main
@@ -547,6 +553,7 @@ vulnerability_flags: :gitlab_main
vulnerability_historical_statistics: :gitlab_main
vulnerability_identifiers: :gitlab_main
vulnerability_issue_links: :gitlab_main
+vulnerability_merge_request_links: :gitlab_main
vulnerability_occurrence_identifiers: :gitlab_main
vulnerability_occurrence_pipelines: :gitlab_main
vulnerability_occurrences: :gitlab_main
@@ -571,3 +578,4 @@ zentao_tracker_data: :gitlab_main
dingtalk_tracker_data: :gitlab_main
zoom_meetings: :gitlab_main
batched_background_migration_job_transition_logs: :gitlab_shared
+user_namespace_callouts: :gitlab_main
diff --git a/lib/gitlab/database/load_balancing.rb b/lib/gitlab/database/load_balancing.rb
index 6517923d23e..5f9416fb4db 100644
--- a/lib/gitlab/database/load_balancing.rb
+++ b/lib/gitlab/database/load_balancing.rb
@@ -19,7 +19,7 @@ module Gitlab
].freeze
def self.base_models
- @base_models ||= ::Gitlab::Database.database_base_models.values.freeze
+ @base_models ||= ::Gitlab::Database.database_base_models_using_load_balancing.values.freeze
end
def self.each_load_balancer
diff --git a/lib/gitlab/database/migrations/batched_background_migration_helpers.rb b/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
index 4aaeaa7b365..936b986ea07 100644
--- a/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
@@ -72,12 +72,6 @@ module Gitlab
)
Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.require_dml_mode!
- if transaction_open?
- raise 'The `queue_batched_background_migration` cannot be run inside a transaction. ' \
- 'You can disable transactions by calling `disable_ddl_transaction!` in the body of ' \
- 'your migration class.'
- end
-
gitlab_schema ||= gitlab_schema_from_context
Gitlab::Database::BackgroundMigration::BatchedMigration.reset_column_information
@@ -182,12 +176,6 @@ module Gitlab
def delete_batched_background_migration(job_class_name, table_name, column_name, job_arguments)
Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.require_dml_mode!
- if transaction_open?
- raise 'The `#delete_batched_background_migration` cannot be run inside a transaction. ' \
- 'You can disable transactions by calling `disable_ddl_transaction!` in the body of ' \
- 'your migration class.'
- end
-
Gitlab::Database::BackgroundMigration::BatchedMigration.reset_column_information
Gitlab::Database::BackgroundMigration::BatchedMigration
diff --git a/lib/gitlab/database/migrations/test_batched_background_runner.rb b/lib/gitlab/database/migrations/test_batched_background_runner.rb
index 0c6a8d3d856..f38d847b0e8 100644
--- a/lib/gitlab/database/migrations/test_batched_background_runner.rb
+++ b/lib/gitlab/database/migrations/test_batched_background_runner.rb
@@ -14,7 +14,7 @@ module Gitlab
def jobs_by_migration_name
Gitlab::Database::BackgroundMigration::BatchedMigration
.executable
- .created_after(2.days.ago) # Simple way to exclude migrations already running before migration testing
+ .created_after(3.hours.ago) # Simple way to exclude migrations already running before migration testing
.to_h do |migration|
batching_strategy = migration.batch_class.new(connection: connection)
diff --git a/lib/gitlab/database/postgres_autovacuum_activity.rb b/lib/gitlab/database/postgres_autovacuum_activity.rb
new file mode 100644
index 00000000000..a4dc199c259
--- /dev/null
+++ b/lib/gitlab/database/postgres_autovacuum_activity.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ class PostgresAutovacuumActivity < SharedModel
+ self.table_name = 'postgres_autovacuum_activity'
+ self.primary_key = 'table_identifier'
+
+ def self.for_tables(tables)
+ Gitlab::Database::LoadBalancing::Session.current.use_primary do
+ where('schema = current_schema()').where(table: tables)
+ end
+ end
+
+ def to_s
+ "table #{table_identifier} (started: #{vacuum_start})"
+ 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 79244120776..bb489ced3d2 100644
--- a/lib/gitlab/database_importers/instance_administrators/create_group.rb
+++ b/lib/gitlab/database_importers/instance_administrators/create_group.rb
@@ -77,7 +77,7 @@ module Gitlab
def add_group_members(result)
group = result[:group]
- members = group.add_users(members_to_add(group), Gitlab::Access::MAINTAINER)
+ members = group.add_members(members_to_add(group), Gitlab::Access::MAINTAINER)
errors = members.flat_map { |member| member.errors.full_messages }
if errors.any?
@@ -112,7 +112,7 @@ module Gitlab
def members_to_add(group)
# Exclude admins who are already members of group because
- # `group.add_users(users)` returns an error if the users parameter contains
+ # `group.add_members(users)` returns an error if the users parameter contains
# users who are already members of the group.
instance_admins - group.members.collect(&:user)
end
diff --git a/lib/gitlab/dependency_linker/base_linker.rb b/lib/gitlab/dependency_linker/base_linker.rb
index 36a840372c5..76855f2950d 100644
--- a/lib/gitlab/dependency_linker/base_linker.rb
+++ b/lib/gitlab/dependency_linker/base_linker.rb
@@ -6,9 +6,6 @@ module Gitlab
URL_REGEX = %r{https?://[^'" ]+}.freeze
GIT_INVALID_URL_REGEX = /^git\+#{URL_REGEX}/.freeze
REPO_REGEX = %r{[^/'" ]+/[^/'" ]+}.freeze
- VALID_LINK_ATTRIBUTES = %w[href rel target].freeze
-
- include ActionView::Helpers::SanitizeHelper
class_attribute :file_type
@@ -65,10 +62,9 @@ module Gitlab
end
def link_tag(name, url)
- sanitize(
- %{<a href="#{ERB::Util.html_escape_once(url)}" rel="nofollow noreferrer noopener" target="_blank">#{ERB::Util.html_escape_once(name)}</a>},
- attributes: VALID_LINK_ATTRIBUTES
- )
+ href_attribute = %{href="#{ERB::Util.html_escape_once(url)}" } if Gitlab::UrlSanitizer.valid_web?(url)
+
+ %{<a #{href_attribute}rel="nofollow noreferrer noopener" target="_blank">#{ERB::Util.html_escape_once(name)}</a>}.html_safe
end
# Links package names based on regex.
diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb
index 8e039d32ef5..8c55652da43 100644
--- a/lib/gitlab/diff/file.rb
+++ b/lib/gitlab/diff/file.rb
@@ -373,7 +373,7 @@ module Gitlab
end
def rendered
- return unless use_semantic_ipynb_diff? && ipynb? && modified_file? && !too_large?
+ return unless use_semantic_ipynb_diff? && ipynb? && modified_file? && !collapsed? && !too_large?
strong_memoize(:rendered) { Rendered::Notebook::DiffFile.new(self) }
end
diff --git a/lib/gitlab/diff/file_collection/base.rb b/lib/gitlab/diff/file_collection/base.rb
index 7fa1bd6b5ec..924de132840 100644
--- a/lib/gitlab/diff/file_collection/base.rb
+++ b/lib/gitlab/diff/file_collection/base.rb
@@ -68,20 +68,12 @@ module Gitlab
end
end
- def diff_file_with_old_path(old_path, a_mode = nil)
- if Feature.enabled?(:file_identifier_hash) && a_mode.present?
- diff_files.find { |diff_file| diff_file.old_path == old_path && diff_file.a_mode == a_mode }
- else
- diff_files.find { |diff_file| diff_file.old_path == old_path }
- end
+ def diff_file_with_old_path(old_path)
+ diff_files.find { |diff_file| diff_file.old_path == old_path }
end
- def diff_file_with_new_path(new_path, b_mode = nil)
- if Feature.enabled?(:file_identifier_hash) && b_mode.present?
- diff_files.find { |diff_file| diff_file.new_path == new_path && diff_file.b_mode == b_mode }
- else
- diff_files.find { |diff_file| diff_file.new_path == new_path }
- end
+ def diff_file_with_new_path(new_path)
+ diff_files.find { |diff_file| diff_file.new_path == new_path }
end
def clear_cache
diff --git a/lib/gitlab/diff/formatters/base_formatter.rb b/lib/gitlab/diff/formatters/base_formatter.rb
index e24150a2330..19fc028594c 100644
--- a/lib/gitlab/diff/formatters/base_formatter.rb
+++ b/lib/gitlab/diff/formatters/base_formatter.rb
@@ -6,7 +6,6 @@ module Gitlab
class BaseFormatter
attr_reader :old_path
attr_reader :new_path
- attr_reader :file_identifier_hash
attr_reader :base_sha
attr_reader :start_sha
attr_reader :head_sha
@@ -16,7 +15,6 @@ module Gitlab
attrs[:diff_refs] = diff_file.diff_refs
attrs[:old_path] = diff_file.old_path
attrs[:new_path] = diff_file.new_path
- attrs[:file_identifier_hash] = diff_file.file_identifier_hash
end
if diff_refs = attrs[:diff_refs]
@@ -27,7 +25,6 @@ module Gitlab
@old_path = attrs[:old_path]
@new_path = attrs[:new_path]
- @file_identifier_hash = attrs[:file_identifier_hash]
@base_sha = attrs[:base_sha]
@start_sha = attrs[:start_sha]
@head_sha = attrs[:head_sha]
@@ -38,7 +35,7 @@ module Gitlab
end
def to_h
- out = {
+ {
base_sha: base_sha,
start_sha: start_sha,
head_sha: head_sha,
@@ -46,12 +43,6 @@ module Gitlab
new_path: new_path,
position_type: position_type
}
-
- if Feature.enabled?(:file_identifier_hash)
- out[:file_identifier_hash] = file_identifier_hash
- end
-
- out
end
def position_type
diff --git a/lib/gitlab/diff/highlight_cache.rb b/lib/gitlab/diff/highlight_cache.rb
index f950d01fdf0..8e9dc3a305f 100644
--- a/lib/gitlab/diff/highlight_cache.rb
+++ b/lib/gitlab/diff/highlight_cache.rb
@@ -193,6 +193,8 @@ module Gitlab
results = redis.hmget(key, file_paths)
end
+ record_hit_ratio(results)
+
results.map! do |result|
Gitlab::Json.parse(gzip_decompress(result), symbolize_names: true) unless result.nil?
end
@@ -215,6 +217,11 @@ module Gitlab
def current_transaction
::Gitlab::Metrics::WebTransaction.current
end
+
+ def record_hit_ratio(results)
+ current_transaction&.increment(:gitlab_redis_diff_caching_requests_total)
+ current_transaction&.increment(:gitlab_redis_diff_caching_hits_total) if results.any?(&:present?)
+ end
end
end
end
diff --git a/lib/gitlab/diff/position.rb b/lib/gitlab/diff/position.rb
index 74c33c46598..40b6ae2f14e 100644
--- a/lib/gitlab/diff/position.rb
+++ b/lib/gitlab/diff/position.rb
@@ -9,7 +9,6 @@ module Gitlab
delegate :old_path,
:new_path,
- :file_identifier_hash,
:base_sha,
:start_sha,
:head_sha,
@@ -161,11 +160,7 @@ module Gitlab
def find_diff_file_from(diffable)
diff_files = diffable.diffs(diff_options).diff_files
- if Feature.enabled?(:file_identifier_hash) && file_identifier_hash.present?
- diff_files.find { |df| df.file_identifier_hash == file_identifier_hash }
- else
- diff_files.first
- end
+ diff_files.first
end
def multiline?
diff --git a/lib/gitlab/diff/position_tracer/image_strategy.rb b/lib/gitlab/diff/position_tracer/image_strategy.rb
index 046a6782dda..aac52b536f7 100644
--- a/lib/gitlab/diff/position_tracer/image_strategy.rb
+++ b/lib/gitlab/diff/position_tracer/image_strategy.rb
@@ -7,24 +7,21 @@ module Gitlab
def trace(position)
a_path = position.old_path
b_path = position.new_path
- diff_file = diff_file(position)
- a_mode = diff_file&.a_mode
- b_mode = diff_file&.b_mode
# If file exists in B->D (e.g. updated, renamed, removed), let the
# note become outdated.
- bd_diff = bd_diffs.diff_file_with_old_path(b_path, b_mode)
+ bd_diff = bd_diffs.diff_file_with_old_path(b_path)
return { position: new_position(position, bd_diff), outdated: true } if bd_diff
# If file still exists in the new diff, update the position.
- cd_diff = cd_diffs.diff_file_with_new_path(b_path, b_mode)
+ cd_diff = cd_diffs.diff_file_with_new_path(b_path)
return { position: new_position(position, cd_diff), outdated: false } if cd_diff
# If file exists in A->C (e.g. rebased and same changes were present
# in target branch), let the note become outdated.
- ac_diff = ac_diffs.diff_file_with_old_path(a_path, a_mode)
+ ac_diff = ac_diffs.diff_file_with_old_path(a_path)
return { position: new_position(position, ac_diff), outdated: true } if ac_diff
diff --git a/lib/gitlab/diff/position_tracer/line_strategy.rb b/lib/gitlab/diff/position_tracer/line_strategy.rb
index 0f0b8f0c4f3..d7a7e3f5425 100644
--- a/lib/gitlab/diff/position_tracer/line_strategy.rb
+++ b/lib/gitlab/diff/position_tracer/line_strategy.rb
@@ -76,20 +76,16 @@ module Gitlab
def trace_added_line(position)
b_path = position.new_path
b_line = position.new_line
- diff_file = diff_file(position)
- b_mode = diff_file&.b_mode
- bd_diff = bd_diffs.diff_file_with_old_path(b_path, b_mode)
+ bd_diff = bd_diffs.diff_file_with_old_path(b_path)
d_path = bd_diff&.new_path || b_path
- d_mode = bd_diff&.b_mode || b_mode
d_line = LineMapper.new(bd_diff).old_to_new(b_line)
if d_line
- cd_diff = cd_diffs.diff_file_with_new_path(d_path, d_mode)
+ cd_diff = cd_diffs.diff_file_with_new_path(d_path)
c_path = cd_diff&.old_path || d_path
- c_mode = cd_diff&.a_mode || d_mode
c_line = LineMapper.new(cd_diff).new_to_old(d_line)
if c_line
@@ -102,7 +98,7 @@ module Gitlab
else
# If the line is no longer in the MR, we unfortunately cannot show
# the current state on the CD diff, so we treat it as outdated.
- ac_diff = ac_diffs.diff_file_with_new_path(c_path, c_mode)
+ ac_diff = ac_diffs.diff_file_with_new_path(c_path)
{ position: new_position(ac_diff, nil, c_line, position.line_range), outdated: true }
end
@@ -119,26 +115,22 @@ module Gitlab
def trace_removed_line(position)
a_path = position.old_path
a_line = position.old_line
- diff_file = diff_file(position)
- a_mode = diff_file&.a_mode
- ac_diff = ac_diffs.diff_file_with_old_path(a_path, a_mode)
+ ac_diff = ac_diffs.diff_file_with_old_path(a_path)
c_path = ac_diff&.new_path || a_path
- c_mode = ac_diff&.b_mode || a_mode
c_line = LineMapper.new(ac_diff).old_to_new(a_line)
if c_line
- cd_diff = cd_diffs.diff_file_with_old_path(c_path, c_mode)
+ cd_diff = cd_diffs.diff_file_with_old_path(c_path)
d_path = cd_diff&.new_path || c_path
- d_mode = cd_diff&.b_mode || c_mode
d_line = LineMapper.new(cd_diff).old_to_new(c_line)
if d_line
# If the line is still in C but also in D, it has turned from a
# removed line into an unchanged one.
- bd_diff = bd_diffs.diff_file_with_new_path(d_path, d_mode)
+ bd_diff = bd_diffs.diff_file_with_new_path(d_path)
{ position: new_position(bd_diff, nil, d_line, position.line_range), outdated: true }
else
@@ -156,21 +148,17 @@ module Gitlab
a_line = position.old_line
b_path = position.new_path
b_line = position.new_line
- diff_file = diff_file(position)
- a_mode = diff_file&.a_mode
- b_mode = diff_file&.b_mode
- ac_diff = ac_diffs.diff_file_with_old_path(a_path, a_mode)
+ ac_diff = ac_diffs.diff_file_with_old_path(a_path)
c_path = ac_diff&.new_path || a_path
- c_mode = ac_diff&.b_mode || a_mode
c_line = LineMapper.new(ac_diff).old_to_new(a_line)
- bd_diff = bd_diffs.diff_file_with_old_path(b_path, b_mode)
+ bd_diff = bd_diffs.diff_file_with_old_path(b_path)
d_line = LineMapper.new(bd_diff).old_to_new(b_line)
- cd_diff = cd_diffs.diff_file_with_old_path(c_path, c_mode)
+ cd_diff = cd_diffs.diff_file_with_old_path(c_path)
if c_line && d_line
# If the line is still in C and D, it is still unchanged.
diff --git a/lib/gitlab/diff/rendered/notebook/diff_file.rb b/lib/gitlab/diff/rendered/notebook/diff_file.rb
index 0a5b2ec3890..3e1652bd318 100644
--- a/lib/gitlab/diff/rendered/notebook/diff_file.rb
+++ b/lib/gitlab/diff/rendered/notebook/diff_file.rb
@@ -79,7 +79,7 @@ module Gitlab
rescue Timeout::Error => e
rendered_timeout.increment(source: Gitlab::Runtime.sidekiq? ? BACKGROUND_EXECUTION : FOREGROUND_EXECUTION)
log_event(LOG_IPYNBDIFF_TIMEOUT, e)
- rescue IpynbDiff::InvalidNotebookError, IpynbDiff::InvalidTokenError => e
+ rescue IpynbDiff::InvalidNotebookError => e
log_event(LOG_IPYNBDIFF_INVALID, e)
end
end
diff --git a/lib/gitlab/diff/rendered/notebook/diff_file_helper.rb b/lib/gitlab/diff/rendered/notebook/diff_file_helper.rb
index 2e1b5ea301d..f381792953e 100644
--- a/lib/gitlab/diff/rendered/notebook/diff_file_helper.rb
+++ b/lib/gitlab/diff/rendered/notebook/diff_file_helper.rb
@@ -91,7 +91,7 @@ module Gitlab
return 0 unless line_in_source.present?
- line_in_source + 1
+ line_in_source
end
def image_as_rich_text(line_text)
diff --git a/lib/gitlab/elasticsearch/logs/lines.rb b/lib/gitlab/elasticsearch/logs/lines.rb
deleted file mode 100644
index ff9185dd331..00000000000
--- a/lib/gitlab/elasticsearch/logs/lines.rb
+++ /dev/null
@@ -1,157 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Elasticsearch
- module Logs
- class Lines
- InvalidCursor = Class.new(RuntimeError)
-
- # How many log lines to fetch in a query
- LOGS_LIMIT = 500
-
- def initialize(client)
- @client = client
- end
-
- def pod_logs(namespace, pod_name: nil, container_name: nil, search: nil, start_time: nil, end_time: nil, cursor: nil, chart_above_v2: true)
- query = { bool: { must: [] } }.tap do |q|
- filter_pod_name(q, pod_name)
- filter_namespace(q, namespace)
- filter_container_name(q, container_name)
- filter_search(q, search)
- filter_times(q, start_time, end_time)
- end
-
- body = build_body(query, cursor, chart_above_v2)
- response = @client.search body: body
-
- format_response(response)
- end
-
- private
-
- def build_body(query, cursor = nil, chart_above_v2 = true)
- offset_field = chart_above_v2 ? "log.offset" : "offset"
- body = {
- query: query,
- # reverse order so we can query N-most recent records
- sort: [
- { "@timestamp": { order: :desc } },
- { "#{offset_field}": { order: :desc } }
- ],
- # only return these fields in the response
- _source: ["@timestamp", "message", "kubernetes.pod.name"],
- # fixed limit for now, we should support paginated queries
- size: ::Gitlab::Elasticsearch::Logs::Lines::LOGS_LIMIT
- }
-
- unless cursor.nil?
- body[:search_after] = decode_cursor(cursor)
- end
-
- body
- end
-
- def filter_pod_name(query, pod_name)
- # We can filter by "all pods" with a null pod_name
- return if pod_name.nil?
-
- query[:bool][:must] << {
- match_phrase: {
- "kubernetes.pod.name" => {
- query: pod_name
- }
- }
- }
- end
-
- def filter_namespace(query, namespace)
- query[:bool][:must] << {
- match_phrase: {
- "kubernetes.namespace" => {
- query: namespace
- }
- }
- }
- end
-
- def filter_container_name(query, container_name)
- # A pod can contain multiple containers.
- # By default we return logs from every container
- return if container_name.nil?
-
- query[:bool][:must] << {
- match_phrase: {
- "kubernetes.container.name" => {
- query: container_name
- }
- }
- }
- end
-
- def filter_search(query, search)
- return if search.nil?
-
- query[:bool][:must] << {
- simple_query_string: {
- query: search,
- fields: [:message],
- default_operator: :and
- }
- }
- end
-
- def filter_times(query, start_time, end_time)
- return unless start_time || end_time
-
- time_range = { range: { :@timestamp => {} } }.tap do |tr|
- tr[:range][:@timestamp][:gte] = start_time if start_time
- tr[:range][:@timestamp][:lt] = end_time if end_time
- end
-
- query[:bool][:filter] = [time_range]
- end
-
- def format_response(response)
- results = response.fetch("hits", {}).fetch("hits", [])
- last_result = results.last
- results = results.map do |hit|
- {
- timestamp: hit["_source"]["@timestamp"],
- message: hit["_source"]["message"],
- pod: hit["_source"]["kubernetes"]["pod"]["name"]
- }
- end
-
- # we queried for the N-most recent records but we want them ordered oldest to newest
- {
- logs: results.reverse,
- cursor: last_result.nil? ? nil : encode_cursor(last_result["sort"])
- }
- end
-
- # we want to hide the implementation details of the search_after parameter from the frontend
- # behind a single easily transmitted value
- def encode_cursor(obj)
- obj.join(',')
- end
-
- def decode_cursor(obj)
- cursor = obj.split(',').map(&:to_i)
-
- unless valid_cursor(cursor)
- raise InvalidCursor, "invalid cursor format"
- end
-
- cursor
- end
-
- def valid_cursor(cursor)
- cursor.instance_of?(Array) &&
- cursor.length == 2 &&
- cursor.map {|i| i.instance_of?(Integer)}.reduce(:&)
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/elasticsearch/logs/pods.rb b/lib/gitlab/elasticsearch/logs/pods.rb
deleted file mode 100644
index 66499ae956a..00000000000
--- a/lib/gitlab/elasticsearch/logs/pods.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Elasticsearch
- module Logs
- class Pods
- # How many items to fetch in a query
- PODS_LIMIT = 500
- CONTAINERS_LIMIT = 500
-
- def initialize(client)
- @client = client
- end
-
- def pods(namespace)
- body = build_body(namespace)
- response = @client.search body: body
-
- format_response(response)
- end
-
- private
-
- def build_body(namespace)
- {
- aggs: {
- pods: {
- aggs: {
- containers: {
- terms: {
- field: 'kubernetes.container.name',
- size: ::Gitlab::Elasticsearch::Logs::Pods::CONTAINERS_LIMIT
- }
- }
- },
- terms: {
- field: 'kubernetes.pod.name',
- size: ::Gitlab::Elasticsearch::Logs::Pods::PODS_LIMIT
- }
- }
- },
- query: {
- bool: {
- must: {
- match_phrase: {
- "kubernetes.namespace": namespace
- }
- }
- }
- },
- # don't populate hits, only the aggregation is needed
- size: 0
- }
- end
-
- def format_response(response)
- results = response.dig("aggregations", "pods", "buckets") || []
- results.map do |bucket|
- {
- name: bucket["key"],
- container_names: (bucket.dig("containers", "buckets") || []).map do |cbucket|
- cbucket["key"]
- end
- }
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/email/handler/service_desk_handler.rb b/lib/gitlab/email/handler/service_desk_handler.rb
index 71b1d4ed8f9..8e2c7559bc1 100644
--- a/lib/gitlab/email/handler/service_desk_handler.rb
+++ b/lib/gitlab/email/handler/service_desk_handler.rb
@@ -98,7 +98,10 @@ module Gitlab
title: mail.subject,
description: message_including_template,
confidential: true,
- external_author: from_address
+ external_author: from_address,
+ extra_params: {
+ cc: mail.cc
+ }
},
spam_params: nil
).execute
diff --git a/lib/gitlab/email/message/in_product_marketing/experience.rb b/lib/gitlab/email/message/in_product_marketing/experience.rb
deleted file mode 100644
index 7520de6d2a3..00000000000
--- a/lib/gitlab/email/message/in_product_marketing/experience.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Email
- module Message
- module InProductMarketing
- class Experience < Base
- include Gitlab::Utils::StrongMemoize
-
- EASE_SCORE_SURVEY_ID = 1
-
- def subject_line
- s_('InProductMarketing|Do you have a minute?')
- end
-
- def tagline
- end
-
- def title
- s_('InProductMarketing|We want your GitLab experience to be great')
- end
-
- def subtitle
- s_('InProductMarketing|Take this 1-question survey!')
- end
-
- def body_line1
- s_('InProductMarketing|%{strong_start}Overall, how difficult or easy was it to get started with GitLab?%{strong_end}').html_safe % strong_options
- end
-
- def body_line2
- s_('InProductMarketing|Click on the number below that corresponds with your answer — 1 being very difficult, 5 being very easy.')
- end
-
- def cta_text
- end
-
- def feedback_link(rating)
- params = {
- onboarding_progress: onboarding_progress,
- response: rating,
- show_invite_link: show_invite_link,
- survey_id: EASE_SCORE_SURVEY_ID
- }
-
- params[:show_incentive] = true if show_incentive?
-
- "#{gitlab_com_root_url}/-/survey_responses?#{params.to_query}"
- end
-
- def feedback_ratings(rating)
- [
- s_('InProductMarketing|Very difficult'),
- s_('InProductMarketing|Difficult'),
- s_('InProductMarketing|Neutral'),
- s_('InProductMarketing|Easy'),
- s_('InProductMarketing|Very easy')
- ][rating - 1]
- end
-
- def feedback_thanks
- s_('InProductMarketing|Feedback from users like you really improves our product. Thanks for your help!')
- end
-
- private
-
- def onboarding_progress
- strong_memoize(:onboarding_progress) do
- group.onboarding_progress.number_of_completed_actions
- end
- end
-
- def show_invite_link
- strong_memoize(:show_invite_link) do
- group.max_member_access_for_user(user) >= GroupMember::DEVELOPER && user.preferred_language == 'en'
- end
- end
-
- def show_incentive?
- show_invite_link && group.member_count > 1
- end
-
- def gitlab_com_root_url
- return root_url.chomp('/') if Rails.env.development?
-
- Gitlab::Saas.com_url
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/error_tracking.rb b/lib/gitlab/error_tracking.rb
index 35c1a1e73cf..83920182da4 100644
--- a/lib/gitlab/error_tracking.rb
+++ b/lib/gitlab/error_tracking.rb
@@ -20,7 +20,10 @@ module Gitlab
::Gitlab::ErrorTracking::Processor::SidekiqProcessor,
::Gitlab::ErrorTracking::Processor::GrpcErrorProcessor,
::Gitlab::ErrorTracking::Processor::ContextPayloadProcessor,
- ::Gitlab::ErrorTracking::Processor::SanitizeErrorMessageProcessor
+ ::Gitlab::ErrorTracking::Processor::SanitizeErrorMessageProcessor,
+ # IMPORTANT: this processor must stay at the bottom, right before
+ # sending the event to Sentry.
+ ::Gitlab::ErrorTracking::Processor::SanitizerProcessor
].freeze
class << self
diff --git a/lib/gitlab/error_tracking/error_repository.rb b/lib/gitlab/error_tracking/error_repository.rb
index 4ec636703d9..fd2467add20 100644
--- a/lib/gitlab/error_tracking/error_repository.rb
+++ b/lib/gitlab/error_tracking/error_repository.rb
@@ -15,7 +15,12 @@ module Gitlab
#
# @return [self]
def self.build(project)
- strategy = ActiveRecordStrategy.new(project)
+ strategy =
+ if Feature.enabled?(:use_click_house_database_for_error_tracking, project)
+ OpenApiStrategy.new(project)
+ else
+ ActiveRecordStrategy.new(project)
+ end
new(strategy)
end
@@ -72,14 +77,15 @@ module Gitlab
# @param sort [String] order list by 'first_seen', 'last_seen', or 'frequency'
# @param filters [Hash<Symbol, String>] filter list by
# @option filters [String] :status error status
+ # @params query [String, nil] free text search
# @param limit [Integer, String] limit result
# @param cursor [Hash] pagination information
#
# @return [Array<Array<Gitlab::ErrorTracking::Error>, Pagination>]
- def list_errors(sort: 'last_seen', filters: {}, limit: 20, cursor: {})
+ def list_errors(sort: 'last_seen', filters: {}, query: nil, limit: 20, cursor: {})
limit = [limit.to_i, 100].min
- strategy.list_errors(filters: filters, sort: sort, limit: limit, cursor: cursor)
+ strategy.list_errors(filters: filters, query: query, sort: sort, limit: limit, cursor: cursor)
end
# Fetches last event for error +id+.
@@ -105,6 +111,10 @@ module Gitlab
strategy.update_error(id, status: status)
end
+ def dsn_url(public_key)
+ strategy.dsn_url(public_key)
+ end
+
private
attr_reader :strategy
diff --git a/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb b/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb
index e5b532ee0f0..01e7fbda384 100644
--- a/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb
+++ b/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb
@@ -39,11 +39,12 @@ module Gitlab
handle_exceptions(e)
end
- def list_errors(filters:, sort:, limit:, cursor:)
+ def list_errors(filters:, query:, sort:, limit:, cursor:)
errors = project_errors
errors = filter_by_status(errors, filters[:status])
errors = sort(errors, sort)
errors = errors.keyset_paginate(cursor: cursor, per_page: limit)
+ # query is not supported
pagination = ErrorRepository::Pagination.new(errors.cursor_for_next_page, errors.cursor_for_previous_page)
@@ -60,6 +61,24 @@ module Gitlab
project_error(id).update(attributes)
end
+ def dsn_url(public_key)
+ gitlab = Settings.gitlab
+
+ custom_port = Settings.gitlab_on_standard_port? ? nil : ":#{gitlab.port}"
+
+ base_url = [
+ gitlab.protocol,
+ "://",
+ public_key,
+ '@',
+ gitlab.host,
+ custom_port,
+ gitlab.relative_url_root
+ ].join('')
+
+ "#{base_url}/api/v4/error_tracking/collector/#{project.id}"
+ end
+
private
attr_reader :project
diff --git a/lib/gitlab/error_tracking/error_repository/open_api_strategy.rb b/lib/gitlab/error_tracking/error_repository/open_api_strategy.rb
new file mode 100644
index 00000000000..e3eae20c520
--- /dev/null
+++ b/lib/gitlab/error_tracking/error_repository/open_api_strategy.rb
@@ -0,0 +1,248 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ class ErrorRepository
+ class OpenApiStrategy
+ def initialize(project)
+ @project = project
+
+ api_url = configured_api_url
+
+ open_api.configure do |config|
+ config.scheme = api_url.scheme
+ config.host = [api_url.host, api_url.port].compact.join(':')
+ config.server_index = nil
+ config.logger = Gitlab::AppLogger
+ end
+ end
+
+ def report_error(
+ name:, description:, actor:, platform:,
+ environment:, level:, occurred_at:, payload:
+ )
+ raise NotImplementedError, 'Use ingestion endpoint'
+ end
+
+ def find_error(id)
+ api = open_api::ErrorsApi.new
+ error = api.get_error(project_id, id)
+
+ to_sentry_detailed_error(error)
+ rescue ErrorTrackingOpenAPI::ApiError => e
+ log_exception(e)
+ nil
+ end
+
+ def list_errors(filters:, query:, sort:, limit:, cursor:)
+ opts = {
+ sort: "#{sort}_desc",
+ status: filters[:status],
+ query: query,
+ cursor: cursor,
+ limit: limit
+ }.compact
+
+ api = open_api::ErrorsApi.new
+ errors, _status, headers = api.list_errors_with_http_info(project_id, opts)
+ pagination = pagination_from_headers(headers)
+
+ if errors.size < limit
+ # Don't show next link if amount of errors is less then requested.
+ # This a workaround until the Golang backend returns link cursor
+ # only if there is a next page.
+ pagination.next = nil
+ end
+
+ [errors.map { to_sentry_error(_1) }, pagination]
+ rescue ErrorTrackingOpenAPI::ApiError => e
+ log_exception(e)
+ [[], ErrorRepository::Pagination.new]
+ end
+
+ def last_event_for(id)
+ event = newest_event_for(id)
+ return unless event
+
+ api = open_api::ErrorsApi.new
+ error = api.get_error(project_id, id)
+ return unless error
+
+ to_sentry_error_event(event, error)
+ rescue ErrorTrackingOpenAPI::ApiError => e
+ log_exception(e)
+ nil
+ end
+
+ def update_error(id, **attributes)
+ opts = attributes.slice(:status)
+
+ body = open_api::ErrorUpdatePayload.new(opts)
+
+ api = open_api::ErrorsApi.new
+ api.update_error(project_id, id, body)
+
+ true
+ rescue ErrorTrackingOpenAPI::ApiError => e
+ log_exception(e)
+ false
+ end
+
+ def dsn_url(public_key)
+ config = open_api::Configuration.default
+
+ base_url = [
+ config.scheme,
+ "://",
+ public_key,
+ '@',
+ config.host,
+ config.base_path
+ ].join('')
+
+ "#{base_url}/projects/api/#{project_id}"
+ end
+
+ private
+
+ def event_for(id, sort:)
+ opts = { sort: sort, limit: 1 }
+
+ api = open_api::ErrorsApi.new
+ api.list_events(project_id, id, opts).first
+ rescue ErrorTrackingOpenAPI::ApiError => e
+ log_exception(e)
+ nil
+ end
+
+ def newest_event_for(id)
+ event_for(id, sort: 'occurred_at_desc')
+ end
+
+ def oldest_event_for(id)
+ event_for(id, sort: 'occurred_at_asc')
+ end
+
+ def to_sentry_error(error)
+ Gitlab::ErrorTracking::Error.new(
+ id: error.fingerprint.to_s,
+ title: error.name,
+ message: error.description,
+ culprit: error.actor,
+ first_seen: error.first_seen_at,
+ last_seen: error.last_seen_at,
+ status: error.status,
+ count: error.event_count,
+ user_count: error.approximated_user_count
+ )
+ end
+
+ def to_sentry_detailed_error(error)
+ Gitlab::ErrorTracking::DetailedError.new(
+ id: error.fingerprint.to_s,
+ title: error.name,
+ message: error.description,
+ culprit: error.actor,
+ first_seen: error.first_seen_at.to_s,
+ last_seen: error.last_seen_at.to_s,
+ count: error.event_count,
+ user_count: error.approximated_user_count,
+ project_id: error.project_id,
+ status: error.status,
+ tags: { level: nil, logger: nil },
+ external_url: external_url(error.fingerprint),
+ external_base_url: external_base_url,
+ integrated: true,
+ first_release_version: release_from(oldest_event_for(error.fingerprint)),
+ last_release_version: release_from(newest_event_for(error.fingerprint))
+ )
+ end
+
+ def to_sentry_error_event(event, error)
+ Gitlab::ErrorTracking::ErrorEvent.new(
+ issue_id: event.fingerprint.to_s,
+ date_received: error.last_seen_at,
+ stack_trace_entries: build_stacktrace(event)
+ )
+ end
+
+ def pagination_from_headers(headers)
+ links = headers['link'].to_s.split(', ')
+
+ pagination_hash = links.map { parse_pagination_link(_1) }.compact.to_h
+
+ ErrorRepository::Pagination.new(pagination_hash['next'], pagination_hash['prev'])
+ end
+
+ LINK_PATTERN = %r{cursor=(?<cursor>[^&]+).*; rel="(?<direction>\w+)"}.freeze
+
+ def parse_pagination_link(content)
+ match = LINK_PATTERN.match(content)
+ return unless match
+
+ [match['direction'], CGI.unescape(match['cursor'])]
+ end
+
+ def build_stacktrace(event)
+ payload = parse_json(event.payload)
+ return [] unless payload
+
+ ::ErrorTracking::StacktraceBuilder.new(payload).stacktrace
+ end
+
+ def parse_json(payload)
+ Gitlab::Json.parse(payload)
+ rescue JSON::ParserError
+ end
+
+ def release_from(event)
+ return unless event
+
+ payload = parse_json(event.payload)
+ return unless payload
+
+ payload['release']
+ end
+
+ def project_id
+ @project.id
+ end
+
+ def open_api
+ ErrorTrackingOpenAPI
+ end
+
+ # For compatibility with sentry integration
+ def external_url(id)
+ Gitlab::Routing.url_helpers.details_namespace_project_error_tracking_index_url(
+ namespace_id: @project.namespace,
+ project_id: @project,
+ issue_id: id)
+ end
+
+ # For compatibility with sentry integration
+ def external_base_url
+ Gitlab::Routing.url_helpers.project_url(@project)
+ end
+
+ def configured_api_url
+ url = Gitlab::CurrentSettings.current_application_settings.error_tracking_api_url ||
+ 'http://localhost:8080'
+
+ Gitlab::UrlBlocker.validate!(url, schemes: %w[http https], allow_localhost: true)
+
+ URI(url)
+ end
+
+ def log_exception(exception)
+ params = {
+ http_code: exception.code,
+ response_body: exception.response_body&.truncate(100)
+ }
+
+ Gitlab::AppLogger.error(Gitlab::Utils::InlineHash.merge_keys(params, prefix: 'open_api'))
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/error_tracking/processor/sanitizer_processor.rb b/lib/gitlab/error_tracking/processor/sanitizer_processor.rb
new file mode 100644
index 00000000000..e6114f8e206
--- /dev/null
+++ b/lib/gitlab/error_tracking/processor/sanitizer_processor.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ module Processor
+ module SanitizerProcessor
+ SANITIZED_HTTP_HEADERS = %w[Authorization Private-Token Job-Token].freeze
+ SANITIZED_ATTRIBUTES = %i[user contexts extra tags].freeze
+
+ # This processor removes sensitive fields or headers from the event
+ # before sending. Sentry versions above 4.0 don't support
+ # sanitized_fields and sanitized_http_headers anymore. The official
+ # document recommends using before_send instead.
+ #
+ # For more information, please visit:
+ # https://docs.sentry.io/platforms/ruby/guides/rails/configuration/filtering/#using-beforesend
+ def self.call(event)
+ # Raven::Event instances don't need this processing.
+ return event unless event.is_a?(Sentry::Event)
+
+ if event.request.present?
+ event.request.cookies = {}
+ event.request.data = {}
+ end
+
+ if event.request.present? && event.request.headers.is_a?(Hash)
+ header_filter = ActiveSupport::ParameterFilter.new(SANITIZED_HTTP_HEADERS)
+ event.request.headers = header_filter.filter(event.request.headers)
+ end
+
+ attribute_filter = ActiveSupport::ParameterFilter.new(Rails.application.config.filter_parameters)
+ SANITIZED_ATTRIBUTES.each do |attribute|
+ event.send("#{attribute}=", attribute_filter.filter(event.send(attribute))) # rubocop:disable GitlabSecurity/PublicSend
+ end
+
+ if event.request.present? && event.request.query_string.present?
+ query = Rack::Utils.parse_nested_query(event.request.query_string)
+ query = attribute_filter.filter(query)
+ query = Rack::Utils.build_nested_query(query)
+ event.request.query_string = query
+ end
+
+ event
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/event_store.rb b/lib/gitlab/event_store.rb
index e20ea1c7365..4955e873688 100644
--- a/lib/gitlab/event_store.rb
+++ b/lib/gitlab/event_store.rb
@@ -35,6 +35,11 @@ module Gitlab
store.subscribe ::MergeRequests::UpdateHeadPipelineWorker, to: ::Ci::PipelineCreatedEvent
store.subscribe ::Namespaces::UpdateRootStatisticsWorker, to: ::Projects::ProjectDeletedEvent
+
+ store.subscribe ::Pages::InvalidateDomainCacheWorker, to: ::Pages::PageDeployedEvent
+ store.subscribe ::Pages::InvalidateDomainCacheWorker, to: ::Pages::PageDeletedEvent
+ store.subscribe ::Pages::InvalidateDomainCacheWorker, to: ::Projects::ProjectDeletedEvent
+ store.subscribe ::Pages::InvalidateDomainCacheWorker, to: ::Projects::ProjectCreatedEvent
end
private_class_method :configure!
end
diff --git a/lib/gitlab/git.rb b/lib/gitlab/git.rb
index 505d0b8d728..882bd57eb1d 100644
--- a/lib/gitlab/git.rb
+++ b/lib/gitlab/git.rb
@@ -18,6 +18,8 @@ module Gitlab
UnknownRef = Class.new(BaseError)
CommandTimedOut = Class.new(CommandError)
InvalidPageToken = Class.new(BaseError)
+ InvalidRefFormatError = Class.new(BaseError)
+ ReferencesLockedError = Class.new(BaseError)
class << self
include Gitlab::EncodingHelper
diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb
index f72217dedde..bb5bbeeb27e 100644
--- a/lib/gitlab/git/blob.rb
+++ b/lib/gitlab/git/blob.rb
@@ -128,6 +128,9 @@ module Gitlab
@loaded_size = @data.bytesize if @data
@loaded_all_data = @loaded_size == size
+ # Recalculate binary status if we loaded all data
+ @binary = nil if @loaded_all_data
+
record_metric_blob_size
record_metric_truncated(truncated?)
end
diff --git a/lib/gitlab/git/conflict/parser.rb b/lib/gitlab/git/conflict/parser.rb
index 20de8ebde4e..670305de95b 100644
--- a/lib/gitlab/git/conflict/parser.rb
+++ b/lib/gitlab/git/conflict/parser.rb
@@ -27,7 +27,7 @@ module Gitlab
conflict_end = ">>>>>>> #{their_path}"
text.each_line.map do |line|
- full_line = line.delete("\n")
+ full_line = line.chomp
if full_line == conflict_start
validate_delimiter!(type.nil?)
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index df744bd60b4..d7f892ae9d9 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -800,9 +800,9 @@ module Gitlab
end
end
- def list_refs
+ def list_refs(patterns = [Gitlab::Git::BRANCH_REF_PREFIX])
wrapped_gitaly_errors do
- gitaly_ref_client.list_refs
+ gitaly_ref_client.list_refs(patterns)
end
end
diff --git a/lib/gitlab/git/rugged_impl/tree.rb b/lib/gitlab/git/rugged_impl/tree.rb
index 40c003821b9..bc0af12d7e3 100644
--- a/lib/gitlab/git/rugged_impl/tree.rb
+++ b/lib/gitlab/git/rugged_impl/tree.rb
@@ -63,10 +63,7 @@ module Gitlab
def tree_entries_with_flat_path_from_rugged(repository, sha, path, recursive)
tree_entries_from_rugged(repository, sha, path, recursive).tap do |entries|
# This was an optimization to reduce N+1 queries for Gitaly
- # (https://gitlab.com/gitlab-org/gitaly/issues/530). It
- # used to be done lazily in the view via
- # TreeHelper#flatten_tree, so it's possible there's a
- # performance impact by loading this eagerly.
+ # (https://gitlab.com/gitlab-org/gitaly/issues/530).
rugged_populate_flat_path(repository, sha, path, entries)
end
end
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index f376dbce177..996534f4194 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -285,6 +285,8 @@ module Gitlab
end
def self.enforce_gitaly_request_limits?
+ return false if ENV["GITALY_DISABLE_REQUEST_LIMITS"]
+
# We typically don't want to enforce request limits in production
# However, we have some production-like test environments, i.e., ones
# where `Rails.env.production?` returns `true`. We do want to be able to
@@ -293,7 +295,7 @@ module Gitlab
# enforce request limits.
return true if Feature::Gitaly.enabled?('enforce_requests_limits')
- !(Rails.env.production? || ENV["GITALY_DISABLE_REQUEST_LIMITS"])
+ !Rails.env.production?
end
private_class_method :enforce_gitaly_request_limits?
@@ -483,6 +485,22 @@ module Gitlab
stack_counter.select { |_, v| v == max }.keys
end
+
+ def self.decode_detailed_error(err)
+ # details could have more than one in theory, but we only have one to worry about for now.
+ detailed_error = err.to_rpc_status&.details&.first
+
+ return unless detailed_error.present?
+
+ prefix = %r{type\.googleapis\.com\/gitaly\.(?<error_type>.+)}
+ error_type = prefix.match(detailed_error.type_url)[:error_type]
+
+ Gitaly.const_get(error_type, false).decode(detailed_error.value)
+ rescue NameError, NoMethodError
+ # Error Class might not be known to ruby yet
+ nil
+ end
+
private_class_method :max_stacks
end
end
diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb
index d575c0f470d..35d3ddf5d7f 100644
--- a/lib/gitlab/gitaly_client/operation_service.rb
+++ b/lib/gitlab/gitaly_client/operation_service.rb
@@ -102,7 +102,7 @@ module Gitlab
raise Gitlab::Git::PreReceiveError, pre_receive_error
end
rescue GRPC::BadStatus => e
- detailed_error = decode_detailed_error(e)
+ detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error&.error
when :custom_hook
@@ -166,7 +166,7 @@ module Gitlab
Gitlab::Git::OperationService::BranchUpdate.from_gitaly(branch_update)
rescue GRPC::BadStatus => e
- detailed_error = decode_detailed_error(e)
+ detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error&.error
when :access_check
@@ -277,7 +277,7 @@ module Gitlab
rebase_sha
rescue GRPC::BadStatus => e
- detailed_error = decode_detailed_error(e)
+ detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error&.error
when :access_check
@@ -314,7 +314,7 @@ module Gitlab
response.squash_sha
rescue GRPC::BadStatus => e
- detailed_error = decode_detailed_error(e)
+ detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error&.error
when :resolve_revision, :rebase_conflict
@@ -474,7 +474,7 @@ module Gitlab
handle_cherry_pick_or_revert_response(response)
rescue GRPC::BadStatus => e
- detailed_error = decode_detailed_error(e)
+ detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error&.error
when :access_check
@@ -483,6 +483,8 @@ module Gitlab
raise Gitlab::Git::PreReceiveError.new(fallback_message: access_check_error.error_message)
when :cherry_pick_conflict
raise Gitlab::Git::Repository::CreateTreeError, 'CONFLICT'
+ when :changes_already_applied
+ raise Gitlab::Git::Repository::CreateTreeError, 'EMPTY'
when :target_branch_diverged
raise Gitlab::Git::CommitError, 'branch diverged'
else
@@ -536,21 +538,6 @@ module Gitlab
raise ArgumentError, "Unknown action '#{action[:action]}'"
end
- def decode_detailed_error(err)
- # details could have more than one in theory, but we only have one to worry about for now.
- detailed_error = err.to_rpc_status&.details&.first
-
- return unless detailed_error.present?
-
- prefix = %r{type\.googleapis\.com\/gitaly\.(?<error_type>.+)}
- error_type = prefix.match(detailed_error.type_url)[:error_type]
-
- Gitaly.const_get(error_type, false).decode(detailed_error.value)
- rescue NameError, NoMethodError
- # Error Class might not be known to ruby yet
- nil
- end
-
def custom_hook_error_message(custom_hook_error)
# Custom hooks may return messages via either stdout or stderr which have a specific prefix. If
# that prefix is present we'll want to print the hook's output, otherwise we'll want to print the
diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb
index c064811b1e7..31e1406356f 100644
--- a/lib/gitlab/gitaly_client/ref_service.rb
+++ b/lib/gitlab/gitaly_client/ref_service.rb
@@ -132,6 +132,17 @@ module Gitlab
response = GitalyClient.call(@repository.storage, :ref_service, :delete_refs, request, timeout: GitalyClient.medium_timeout)
raise Gitlab::Git::Repository::GitError, response.git_error if response.git_error.present?
+ rescue GRPC::BadStatus => e
+ detailed_error = GitalyClient.decode_detailed_error(e)
+
+ case detailed_error&.error
+ when :invalid_format
+ raise Gitlab::Git::InvalidRefFormatError, "references have an invalid format: #{detailed_error.invalid_format.refs.join(",")}"
+ when :references_locked
+ raise Gitlab::Git::ReferencesLockedError
+ else
+ raise e
+ end
end
# Limit: 0 implies no limit, thus all tag names will be returned
diff --git a/lib/gitlab/github_import/importer/events/changed_label.rb b/lib/gitlab/github_import/importer/events/changed_label.rb
new file mode 100644
index 00000000000..6c408158b02
--- /dev/null
+++ b/lib/gitlab/github_import/importer/events/changed_label.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Importer
+ module Events
+ class ChangedLabel
+ def initialize(project, user_id)
+ @project = project
+ @user_id = user_id
+ end
+
+ # issue_event - An instance of `Gitlab::GithubImport::Representation::IssueEvent`.
+ def execute(issue_event)
+ create_event(issue_event)
+ end
+
+ private
+
+ attr_reader :project, :user_id
+
+ def create_event(issue_event)
+ ResourceLabelEvent.create!(
+ issue_id: issue_event.issue_db_id,
+ user_id: user_id,
+ label_id: label_finder.id_for(issue_event.label_title),
+ action: action(issue_event.event),
+ created_at: issue_event.created_at
+ )
+ end
+
+ def label_finder
+ Gitlab::GithubImport::LabelFinder.new(project)
+ end
+
+ def action(event_type)
+ event_type == 'unlabeled' ? 'remove' : 'add'
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/events/closed.rb b/lib/gitlab/github_import/importer/events/closed.rb
new file mode 100644
index 00000000000..8b2136c9b24
--- /dev/null
+++ b/lib/gitlab/github_import/importer/events/closed.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Importer
+ module Events
+ class Closed
+ attr_reader :project, :user_id
+
+ def initialize(project, user_id)
+ @project = project
+ @user_id = user_id
+ end
+
+ # issue_event - An instance of `Gitlab::GithubImport::Representation::IssueEvent`.
+ def execute(issue_event)
+ create_event(issue_event)
+ create_state_event(issue_event)
+ end
+
+ private
+
+ def create_event(issue_event)
+ Event.create!(
+ project_id: project.id,
+ author_id: user_id,
+ action: 'closed',
+ target_type: Issue.name,
+ target_id: issue_event.issue_db_id,
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at
+ )
+ end
+
+ def create_state_event(issue_event)
+ ResourceStateEvent.create!(
+ user_id: user_id,
+ issue_id: issue_event.issue_db_id,
+ source_commit: issue_event.commit_id,
+ state: 'closed',
+ close_after_error_tracking_resolve: false,
+ close_auto_resolve_prometheus_alert: false,
+ created_at: issue_event.created_at
+ )
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/events/cross_referenced.rb b/lib/gitlab/github_import/importer/events/cross_referenced.rb
new file mode 100644
index 00000000000..20b902cfe50
--- /dev/null
+++ b/lib/gitlab/github_import/importer/events/cross_referenced.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Importer
+ module Events
+ class CrossReferenced
+ attr_reader :project, :user_id
+
+ def initialize(project, user_id)
+ @project = project
+ @user_id = user_id
+ end
+
+ # issue_event - An instance of `Gitlab::GithubImport::Representation::IssueEvent`.
+ def execute(issue_event)
+ mentioned_in_record_class = mentioned_in_type(issue_event)
+ mentioned_in_number = issue_event.source.dig(:issue, :number)
+ mentioned_in_record = init_mentioned_in(
+ mentioned_in_record_class, mentioned_in_number
+ )
+ return if mentioned_in_record.nil?
+
+ note_body = cross_reference_note_content(mentioned_in_record.gfm_reference(project))
+ track_activity(mentioned_in_record_class)
+ create_note(issue_event, note_body)
+ end
+
+ private
+
+ def track_activity(mentioned_in_class)
+ return if mentioned_in_class != Issue
+
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(
+ Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CROSS_REFERENCED,
+ values: user_id
+ )
+ end
+
+ def create_note(issue_event, note_body)
+ Note.create!(
+ system: true,
+ noteable_type: Issue.name,
+ noteable_id: issue_event.issue_db_id,
+ project: project,
+ author_id: user_id,
+ note: note_body,
+ system_note_metadata: SystemNoteMetadata.new(action: 'cross_reference'),
+ created_at: issue_event.created_at
+ )
+ end
+
+ def mentioned_in_type(issue_event)
+ is_pull_request = issue_event.source.dig(:issue, :pull_request).present?
+ is_pull_request ? MergeRequest : Issue
+ end
+
+ # record_class - Issue/MergeRequest
+ def init_mentioned_in(record_class, iid)
+ db_id = fetch_mentioned_in_db_id(record_class, iid)
+ return if db_id.nil?
+
+ record = record_class.new(id: db_id, iid: iid)
+ record.project = project
+ record.readonly!
+ record
+ end
+
+ # record_class - Issue/MergeRequest
+ def fetch_mentioned_in_db_id(record_class, number)
+ sawyer_mentioned_in_adapter = Struct.new(:iid, :issuable_type, keyword_init: true)
+ mentioned_in_adapter = sawyer_mentioned_in_adapter.new(
+ iid: number, issuable_type: record_class.name
+ )
+
+ Gitlab::GithubImport::IssuableFinder.new(project, mentioned_in_adapter).database_id
+ end
+
+ def cross_reference_note_content(gfm_reference)
+ "#{::SystemNotes::IssuablesService.cross_reference_note_prefix}#{gfm_reference}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/events/renamed.rb b/lib/gitlab/github_import/importer/events/renamed.rb
new file mode 100644
index 00000000000..6a11c492210
--- /dev/null
+++ b/lib/gitlab/github_import/importer/events/renamed.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Importer
+ module Events
+ class Renamed
+ def initialize(project, user_id)
+ @project = project
+ @user_id = user_id
+ end
+
+ # issue_event - An instance of `Gitlab::GithubImport::Representation::IssueEvent`
+ def execute(issue_event)
+ Note.create!(note_params(issue_event))
+ end
+
+ private
+
+ attr_reader :project, :user_id
+
+ def note_params(issue_event)
+ {
+ noteable_id: issue_event.issue_db_id,
+ noteable_type: Issue.name,
+ project_id: project.id,
+ author_id: user_id,
+ note: parse_body(issue_event),
+ system: true,
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at,
+ system_note_metadata: SystemNoteMetadata.new(
+ {
+ action: "title",
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at
+ }
+ )
+ }
+ end
+
+ def parse_body(issue_event)
+ old_diffs, new_diffs = Gitlab::Diff::InlineDiff.new(
+ issue_event.old_title, issue_event.new_title
+ ).inline_diffs
+
+ marked_old_title = Gitlab::Diff::InlineDiffMarkdownMarker.new(issue_event.old_title).mark(old_diffs)
+ marked_new_title = Gitlab::Diff::InlineDiffMarkdownMarker.new(issue_event.new_title).mark(new_diffs)
+
+ "changed title from **#{marked_old_title}** to **#{marked_new_title}**"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/events/reopened.rb b/lib/gitlab/github_import/importer/events/reopened.rb
new file mode 100644
index 00000000000..c0f3802bc46
--- /dev/null
+++ b/lib/gitlab/github_import/importer/events/reopened.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Importer
+ module Events
+ class Reopened
+ attr_reader :project, :user_id
+
+ def initialize(project, user_id)
+ @project = project
+ @user_id = user_id
+ end
+
+ # issue_event - An instance of `Gitlab::GithubImport::Representation::IssueEvent`.
+ def execute(issue_event)
+ create_event(issue_event)
+ create_state_event(issue_event)
+ end
+
+ private
+
+ def create_event(issue_event)
+ Event.create!(
+ project_id: project.id,
+ author_id: user_id,
+ action: 'reopened',
+ target_type: Issue.name,
+ target_id: issue_event.issue_db_id,
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at
+ )
+ end
+
+ def create_state_event(issue_event)
+ ResourceStateEvent.create!(
+ user_id: user_id,
+ issue_id: issue_event.issue_db_id,
+ state: 'reopened',
+ created_at: issue_event.created_at
+ )
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/issue_event_importer.rb b/lib/gitlab/github_import/importer/issue_event_importer.rb
new file mode 100644
index 00000000000..e451af61ec3
--- /dev/null
+++ b/lib/gitlab/github_import/importer/issue_event_importer.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Importer
+ class IssueEventImporter
+ attr_reader :issue_event, :project, :client, :user_finder
+
+ # issue_event - An instance of `Gitlab::GithubImport::Representation::IssueEvent`.
+ # project - An instance of `Project`.
+ # client - An instance of `Gitlab::GithubImport::Client`.
+ def initialize(issue_event, project, client)
+ @issue_event = issue_event
+ @project = project
+ @client = client
+ @user_finder = UserFinder.new(project, client)
+ end
+
+ def execute
+ case issue_event.event
+ when 'closed'
+ Gitlab::GithubImport::Importer::Events::Closed.new(project, author_id)
+ .execute(issue_event)
+ when 'reopened'
+ Gitlab::GithubImport::Importer::Events::Reopened.new(project, author_id)
+ .execute(issue_event)
+ when 'labeled', 'unlabeled'
+ Gitlab::GithubImport::Importer::Events::ChangedLabel.new(project, author_id)
+ .execute(issue_event)
+ when 'renamed'
+ Gitlab::GithubImport::Importer::Events::Renamed.new(project, author_id)
+ .execute(issue_event)
+ when 'cross-referenced'
+ Gitlab::GithubImport::Importer::Events::CrossReferenced.new(project, author_id)
+ .execute(issue_event)
+ else
+ Gitlab::GithubImport::Logger.debug(
+ message: 'UNSUPPORTED_EVENT_TYPE',
+ event_type: issue_event.event, event_github_id: issue_event.id
+ )
+ end
+ end
+
+ private
+
+ def author_id
+ id, _status = user_finder.author_id_for(issue_event, author_key: :actor)
+ id
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/issue_importer.rb b/lib/gitlab/github_import/importer/issue_importer.rb
index 35fd4bd88a0..e7d41856b04 100644
--- a/lib/gitlab/github_import/importer/issue_importer.rb
+++ b/lib/gitlab/github_import/importer/issue_importer.rb
@@ -51,6 +51,7 @@ module Gitlab
title: issue.truncated_title,
author_id: author_id,
project_id: project.id,
+ namespace_id: project.project_namespace_id,
description: description,
milestone_id: milestone_finder.id_for(issue),
state_id: ::Issue.available_states[issue.state],
diff --git a/lib/gitlab/github_import/importer/note_importer.rb b/lib/gitlab/github_import/importer/note_importer.rb
index 673f56b5753..1410006af26 100644
--- a/lib/gitlab/github_import/importer/note_importer.rb
+++ b/lib/gitlab/github_import/importer/note_importer.rb
@@ -21,14 +21,12 @@ module Gitlab
author_id, author_found = user_finder.author_id_for(note)
- note_body = MarkdownText.format(note.note, note.author, author_found)
-
attributes = {
noteable_type: note.noteable_type,
noteable_id: noteable_id,
project_id: project.id,
author_id: author_id,
- note: note_body,
+ note: note_body(author_found),
discussion_id: note.discussion_id,
system: false,
created_at: note.created_at,
@@ -48,6 +46,13 @@ module Gitlab
def find_noteable_id
GithubImport::IssuableFinder.new(project, note).database_id
end
+
+ private
+
+ def note_body(author_found)
+ text = MarkdownText.convert_ref_links(note.note, project)
+ MarkdownText.format(text, note.author, author_found)
+ end
end
end
end
diff --git a/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer.rb b/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer.rb
index a2c3d1bd057..e1d9ae44065 100644
--- a/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer.rb
+++ b/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer.rb
@@ -37,15 +37,15 @@ module Gitlab
private
- def noteables
- project.merge_requests.where.not(iid: already_imported_noteables) # rubocop: disable CodeReuse/ActiveRecord
+ def parent_collection
+ project.merge_requests.where.not(iid: already_imported_parents) # rubocop: disable CodeReuse/ActiveRecord
end
def page_counter_id(merge_request)
"merge_request/#{merge_request.id}/#{collection_method}"
end
- def notes_imported_cache_key
+ def parent_imported_cache_key
"github-importer/merge_request/diff_notes/already-imported/#{project.id}"
end
end
diff --git a/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer.rb b/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer.rb
new file mode 100644
index 00000000000..45bbc25e637
--- /dev/null
+++ b/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Importer
+ class SingleEndpointIssueEventsImporter
+ include ParallelScheduling
+ include SingleEndpointNotesImporting
+
+ PROCESSED_PAGE_CACHE_KEY = 'issues/%{issue_iid}/%{collection}'
+ BATCH_SIZE = 100
+
+ def initialize(project, client, parallel: true)
+ @project = project
+ @client = client
+ @parallel = parallel
+ @already_imported_cache_key = ALREADY_IMPORTED_CACHE_KEY %
+ { project: project.id, collection: collection_method }
+ end
+
+ def each_associated(parent_record, associated)
+ compose_associated_id!(parent_record, associated)
+ return if already_imported?(associated)
+
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+
+ associated.issue_db_id = parent_record.id
+ yield(associated)
+
+ mark_as_imported(associated)
+ end
+
+ def importer_class
+ IssueEventImporter
+ end
+
+ def representation_class
+ Representation::IssueEvent
+ end
+
+ def sidekiq_worker_class
+ ImportIssueEventWorker
+ end
+
+ def object_type
+ :issue_event
+ end
+
+ def collection_method
+ :issue_timeline
+ end
+
+ def parent_collection
+ project.issues.where.not(iid: already_imported_parents).select(:id, :iid) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
+ def parent_imported_cache_key
+ "github-importer/issues/#{collection_method}/already-imported/#{project.id}"
+ end
+
+ def page_counter_id(issue)
+ PROCESSED_PAGE_CACHE_KEY % { issue_iid: issue.iid, collection: collection_method }
+ end
+
+ def id_for_already_imported_cache(event)
+ event.id
+ end
+
+ def collection_options
+ { state: 'all', sort: 'created', direction: 'asc' }
+ end
+
+ # Cross-referenced events on Github doesn't have id.
+ def compose_associated_id!(issue, event)
+ return if event.event != 'cross-referenced'
+
+ event.id = "cross-reference##{issue.id}-in-#{event.source.issue.id}"
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer.rb b/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer.rb
index 49569ed52d8..fe64df45700 100644
--- a/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer.rb
+++ b/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer.rb
@@ -37,15 +37,15 @@ module Gitlab
private
- def noteables
- project.issues.where.not(iid: already_imported_noteables) # rubocop: disable CodeReuse/ActiveRecord
+ def parent_collection
+ project.issues.where.not(iid: already_imported_parents) # rubocop: disable CodeReuse/ActiveRecord
end
def page_counter_id(issue)
"issue/#{issue.id}/#{collection_method}"
end
- def notes_imported_cache_key
+ def parent_imported_cache_key
"github-importer/issue/notes/already-imported/#{project.id}"
end
end
diff --git a/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer.rb b/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer.rb
index d837639c14d..3b1991d2b88 100644
--- a/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer.rb
+++ b/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer.rb
@@ -37,15 +37,15 @@ module Gitlab
private
- def noteables
- project.merge_requests.where.not(iid: already_imported_noteables) # rubocop: disable CodeReuse/ActiveRecord
+ def parent_collection
+ project.merge_requests.where.not(iid: already_imported_parents) # rubocop: disable CodeReuse/ActiveRecord
end
def page_counter_id(merge_request)
"merge_request/#{merge_request.id}/#{collection_method}"
end
- def notes_imported_cache_key
+ def parent_imported_cache_key
"github-importer/merge_request/notes/already-imported/#{project.id}"
end
end
diff --git a/lib/gitlab/github_import/markdown_text.rb b/lib/gitlab/github_import/markdown_text.rb
index 0b1c221bbec..692016bd005 100644
--- a/lib/gitlab/github_import/markdown_text.rb
+++ b/lib/gitlab/github_import/markdown_text.rb
@@ -5,8 +5,34 @@ module Gitlab
class MarkdownText
include Gitlab::EncodingHelper
- def self.format(*args)
- new(*args).to_s
+ ISSUE_REF_MATCHER = '%{github_url}/%{import_source}/issues'
+ PULL_REF_MATCHER = '%{github_url}/%{import_source}/pull'
+
+ class << self
+ def format(*args)
+ new(*args).to_s
+ end
+
+ # Links like `https://domain.github.com/<namespace>/<project>/pull/<iid>` needs to be converted
+ def convert_ref_links(text, project)
+ matcher_options = { github_url: github_url, import_source: project.import_source }
+ issue_ref_matcher = ISSUE_REF_MATCHER % matcher_options
+ pull_ref_matcher = PULL_REF_MATCHER % matcher_options
+
+ url_helpers = Rails.application.routes.url_helpers
+ text.gsub(issue_ref_matcher, url_helpers.project_issues_url(project))
+ .gsub(pull_ref_matcher, url_helpers.project_merge_requests_url(project))
+ end
+
+ private
+
+ # Returns github domain without slash in the end
+ def github_url
+ oauth_config = Gitlab::Auth::OAuth::Provider.config_for('github') || {}
+ url = oauth_config['url'].presence || 'https://github.com'
+ url = url.chop if url.end_with?('/')
+ url
+ end
end
# text - The Markdown text as a String.
diff --git a/lib/gitlab/github_import/representation/issue_event.rb b/lib/gitlab/github_import/representation/issue_event.rb
new file mode 100644
index 00000000000..9016338db3b
--- /dev/null
+++ b/lib/gitlab/github_import/representation/issue_event.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ module Representation
+ class IssueEvent
+ include ToHash
+ include ExposeAttribute
+
+ attr_reader :attributes
+
+ expose_attribute :id, :actor, :event, :commit_id, :label_title, :old_title, :new_title,
+ :source, :created_at
+ expose_attribute :issue_db_id # set in SingleEndpointIssueEventsImporter#each_associated
+
+ # Builds a event from a GitHub API response.
+ #
+ # event - An instance of `Sawyer::Resource` containing the event details.
+ def self.from_api_response(event)
+ new(
+ id: event.id,
+ actor: event.actor && Representation::User.from_api_response(event.actor),
+ event: event.event,
+ commit_id: event.commit_id,
+ label_title: event.label && event.label[:name],
+ old_title: event.rename && event.rename[:from],
+ new_title: event.rename && event.rename[:to],
+ source: event.source,
+ issue_db_id: event.issue_db_id,
+ created_at: event.created_at
+ )
+ end
+
+ # Builds a event using a Hash that was built from a JSON payload.
+ def self.from_json_hash(raw_hash)
+ hash = Representation.symbolize_hash(raw_hash)
+ hash[:actor] &&= Representation::User.from_json_hash(hash[:actor])
+
+ new(hash)
+ end
+
+ # attributes - A Hash containing the event details. The keys of this
+ # Hash (and any nested hashes) must be symbols.
+ def initialize(attributes)
+ @attributes = attributes
+ end
+
+ def github_identifiers
+ { id: id }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/single_endpoint_notes_importing.rb b/lib/gitlab/github_import/single_endpoint_notes_importing.rb
index 43402ecd165..0a3559adde3 100644
--- a/lib/gitlab/github_import/single_endpoint_notes_importing.rb
+++ b/lib/gitlab/github_import/single_endpoint_notes_importing.rb
@@ -4,9 +4,14 @@
# - SingleEndpointDiffNotesImporter
# - SingleEndpointIssueNotesImporter
# - SingleEndpointMergeRequestNotesImporter
+# if `github_importer_single_endpoint_notes_import` feature flag is on.
#
-# `github_importer_single_endpoint_notes_import`
-# feature flag is on.
+# - SingleEndpointIssueEventsImporter
+# if `github_importer_issue_events_import` feature flag is on.
+#
+# Fetches associated objects page by page to each item of parent collection.
+# Currently `associated` is note or event.
+# Currently `parent` is MergeRequest or Issue record.
#
# It fetches 1 PR's associated objects at a time using `issue_comments` or
# `pull_request_comments` endpoint, which is slower than `NotesImporter`
@@ -18,67 +23,75 @@ module Gitlab
module SingleEndpointNotesImporting
BATCH_SIZE = 100
- def each_object_to_import
- each_notes_page do |page|
- page.objects.each do |note|
- next if already_imported?(note)
+ def each_object_to_import(&block)
+ each_associated_page do |parent_record, associated_page|
+ associated_page.objects.each do |associated|
+ each_associated(parent_record, associated, &block)
+ end
+ end
+ end
- Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+ def id_for_already_imported_cache(associated)
+ associated.id
+ end
- yield(note)
+ def parent_collection
+ raise NotImplementedError
+ end
- mark_as_imported(note)
- end
- end
+ def parent_imported_cache_key
+ raise NotImplementedError
end
- def id_for_already_imported_cache(note)
- note.id
+ def page_counter_id(parent)
+ raise NotImplementedError
end
private
- def each_notes_page
- noteables.each_batch(of: BATCH_SIZE, column: :iid) do |batch|
- batch.each do |noteable|
- # The page counter needs to be scoped by noteable to avoid skipping
- # pages of notes from already imported noteables.
- page_counter = PageCounter.new(project, page_counter_id(noteable))
+ # Sometimes we need to add some extra info from parent
+ # to associated record that is not available by default
+ # in Github API response object. For example:
+ # lib/gitlab/github_import/importer/single_endpoint_issue_events_importer.rb:26
+ def each_associated(_parent_record, associated)
+ return if already_imported?(associated)
+
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+
+ yield(associated)
+
+ mark_as_imported(associated)
+ end
+
+ def each_associated_page
+ parent_collection.each_batch(of: BATCH_SIZE, column: :iid) do |batch|
+ batch.each do |parent_record|
+ # The page counter needs to be scoped by parent_record to avoid skipping
+ # pages of notes from already imported parent_record.
+ page_counter = PageCounter.new(project, page_counter_id(parent_record))
repo = project.import_source
options = collection_options.merge(page: page_counter.current)
- client.each_page(collection_method, repo, noteable.iid, options) do |page|
+ client.each_page(collection_method, repo, parent_record.iid, options) do |page|
next unless page_counter.set(page.number)
- yield page
+ yield parent_record, page
end
- mark_notes_imported(noteable)
+ mark_parent_imported(parent_record)
end
end
end
- def mark_notes_imported(noteable)
+ def mark_parent_imported(parent)
Gitlab::Cache::Import::Caching.set_add(
- notes_imported_cache_key,
- noteable.iid
+ parent_imported_cache_key,
+ parent.iid
)
end
- def already_imported_noteables
- Gitlab::Cache::Import::Caching.values_from_set(notes_imported_cache_key)
- end
-
- def noteables
- NotImplementedError
- end
-
- def notes_imported_cache_key
- NotImplementedError
- end
-
- def page_counter_id(noteable)
- NotImplementedError
+ def already_imported_parents
+ Gitlab::Cache::Import::Caching.values_from_set(parent_imported_cache_key)
end
end
end
diff --git a/lib/gitlab/github_import/user_finder.rb b/lib/gitlab/github_import/user_finder.rb
index 93483ee697a..efaa2ce3002 100644
--- a/lib/gitlab/github_import/user_finder.rb
+++ b/lib/gitlab/github_import/user_finder.rb
@@ -39,13 +39,9 @@ module Gitlab
#
# If the object has no author ID we'll use the ID of the GitLab ghost
# user.
- def author_id_for(object)
- id =
- if object&.author
- user_id_for(object.author)
- else
- GithubImport.ghost_user_id
- end
+ def author_id_for(object, author_key: :author)
+ user_info = author_key == :actor ? object&.actor : object&.author
+ id = user_info ? user_id_for(user_info) : GithubImport.ghost_user_id
if id
[id, true]
diff --git a/lib/gitlab/gpg/commit.rb b/lib/gitlab/gpg/commit.rb
index ab7de14b07a..a03aeb9c293 100644
--- a/lib/gitlab/gpg/commit.rb
+++ b/lib/gitlab/gpg/commit.rb
@@ -3,17 +3,6 @@
module Gitlab
module Gpg
class Commit < Gitlab::SignedCommit
- def signature
- super
-
- return @signature if @signature
-
- cached_signature = lazy_signature&.itself
- return @signature = cached_signature if cached_signature.present?
-
- @signature = create_cached_signature!
- end
-
def update_signature!(cached_signature)
using_keychain do |gpg_key|
cached_signature.update!(attributes(gpg_key))
@@ -23,12 +12,8 @@ module Gitlab
private
- def lazy_signature
- BatchLoader.for(@commit.sha).batch do |shas, loader|
- CommitSignatures::GpgSignature.by_commit_sha(shas).each do |signature|
- loader.call(signature.commit_sha, signature)
- end
- end
+ def signature_class
+ CommitSignatures::GpgSignature
end
def using_keychain
diff --git a/lib/gitlab/grape_logging/loggers/response_logger.rb b/lib/gitlab/grape_logging/loggers/response_logger.rb
new file mode 100644
index 00000000000..0465f01f7f5
--- /dev/null
+++ b/lib/gitlab/grape_logging/loggers/response_logger.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GrapeLogging
+ module Loggers
+ class ResponseLogger < ::GrapeLogging::Loggers::Base
+ def parameters(_, response)
+ return {} unless Feature.enabled?(:log_response_length)
+
+ response_bytes = 0
+ response.each { |resp| response_bytes += resp.to_s.bytesize }
+ {
+ response_bytes: response_bytes
+ }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/pagination/keyset/connection.rb b/lib/gitlab/graphql/pagination/keyset/connection.rb
index c284160e539..3e119a39e6d 100644
--- a/lib/gitlab/graphql/pagination/keyset/connection.rb
+++ b/lib/gitlab/graphql/pagination/keyset/connection.rb
@@ -199,7 +199,7 @@ module Gitlab
field_name = field.try(:attribute_name) || field
field_value = node[field_name]
ordering[field_name] = if field_value.is_a?(Time)
- field_value.strftime('%Y-%m-%d %H:%M:%S.%N %Z')
+ field_value.to_s(:inspect)
else
field_value.to_s
end
diff --git a/lib/gitlab/harbor/client.rb b/lib/gitlab/harbor/client.rb
index 06142ae2b40..ee40725ba95 100644
--- a/lib/gitlab/harbor/client.rb
+++ b/lib/gitlab/harbor/client.rb
@@ -21,14 +21,44 @@ module Gitlab
{ success: response.success? }
end
+ def get_repositories(params)
+ get(url("projects/#{integration.project_name}/repositories"), params)
+ end
+
+ def get_artifacts(params)
+ repository_name = params.delete(:repository_name)
+ get(url("projects/#{integration.project_name}/repositories/#{repository_name}/artifacts"), params)
+ end
+
+ def get_tags(params)
+ repository_name = params.delete(:repository_name)
+ artifact_name = params.delete(:artifact_name)
+ get(
+ url("projects/#{integration.project_name}/repositories/#{repository_name}/artifacts/#{artifact_name}/tags"),
+ params
+ )
+ end
+
private
- def url(path)
- Gitlab::Utils.append_path(base_url, path)
+ def get(path, params = {})
+ options = { headers: headers, query: params }
+ response = Gitlab::HTTP.get(path, options)
+
+ raise Gitlab::Harbor::Client::Error, 'request error' unless response.success?
+
+ {
+ body: Gitlab::Json.parse(response.body),
+ total_count: response.headers['x-total-count'].to_i
+ }
+ rescue JSON::ParserError
+ raise Gitlab::Harbor::Client::Error, 'invalid response format'
end
- def base_url
- Gitlab::Utils.append_path(integration.url, '/api/v2.0/')
+ # url must be used within get method otherwise this would avoid validation by GitLab::HTTP
+ def url(path)
+ base_url = Gitlab::Utils.append_path(integration.url, '/api/v2.0/')
+ Gitlab::Utils.append_path(base_url, path)
end
def headers
diff --git a/lib/gitlab/harbor/query.rb b/lib/gitlab/harbor/query.rb
new file mode 100644
index 00000000000..c120810ecf1
--- /dev/null
+++ b/lib/gitlab/harbor/query.rb
@@ -0,0 +1,126 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Harbor
+ class Query
+ include ActiveModel::Validations
+
+ attr_reader :client, :repository_id, :artifact_id, :search, :limit, :sort, :page
+
+ DEFAULT_LIMIT = 10
+ SORT_REGEX = %r{\A(creation_time|update_time|name) (asc|desc)\z}.freeze
+
+ validates :page, numericality: { greater_than: 0, integer: true }, allow_blank: true
+ validates :limit, numericality: { greater_than: 0, less_than_or_equal_to: 25, integer: true }, allow_blank: true
+ validates :repository_id, format: {
+ with: /\A[a-zA-Z0-9\_\.\-$]+\z/,
+ message: 'Id invalid'
+ }, allow_blank: true
+ validates :artifact_id, format: {
+ with: /\A[a-zA-Z0-9\_\.\-$]+\z/,
+ message: 'Id invalid'
+ }, allow_blank: true
+ validates :sort, format: {
+ with: SORT_REGEX,
+ message: 'params invalid'
+ }, allow_blank: true
+ validates :search, format: {
+ with: /\A([a-z\_]*=[a-zA-Z0-9\- :]*,*)*\z/,
+ message: 'params invalid'
+ }, allow_blank: true
+
+ def initialize(integration, params)
+ @client = Client.new(integration)
+ @repository_id = params[:repository_id]
+ @artifact_id = params[:artifact_id]
+ @search = params[:search]
+ @limit = params[:limit]
+ @sort = params[:sort]
+ @page = params[:page]
+ validate
+ end
+
+ def repositories
+ result = @client.get_repositories(query_options)
+ return [] if result[:total_count] == 0
+
+ Kaminari.paginate_array(
+ result[:body],
+ limit: query_page_size,
+ total_count: result[:total_count]
+ )
+ end
+
+ def artifacts
+ result = @client.get_artifacts(query_artifacts_options)
+ return [] if result[:total_count] == 0
+
+ Kaminari.paginate_array(
+ result[:body],
+ limit: query_page_size,
+ total_count: result[:total_count]
+ )
+ end
+
+ def tags
+ result = @client.get_tags(query_tags_options)
+ return [] if result[:total_count] == 0
+
+ Kaminari.paginate_array(
+ result[:body],
+ limit: query_page_size,
+ total_count: result[:total_count]
+ )
+ end
+
+ private
+
+ def query_artifacts_options
+ options = query_options
+ options[:repository_name] = repository_id
+ options[:with_tag] = true
+
+ options
+ end
+
+ def query_options
+ options = {
+ page: query_page,
+ page_size: query_page_size
+ }
+
+ options[:q] = query_search if search.present?
+ options[:sort] = query_sort if sort.present?
+
+ options
+ end
+
+ def query_tags_options
+ options = query_options
+ options[:repository_name] = repository_id
+ options[:artifact_name] = artifact_id
+
+ options
+ end
+
+ def query_page
+ page.presence || 1
+ end
+
+ def query_page_size
+ (limit.presence || DEFAULT_LIMIT).to_i
+ end
+
+ def query_search
+ search.gsub('=', '=~')
+ end
+
+ def query_sort
+ match = sort.match(SORT_REGEX)
+ order = (match[2] == 'asc' ? '' : '-')
+
+ "#{order}#{match[1]}"
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/hash_digest/facade.rb b/lib/gitlab/hash_digest/facade.rb
deleted file mode 100644
index d8efef02893..00000000000
--- a/lib/gitlab/hash_digest/facade.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module HashDigest
- # Used for rolling out to use OpenSSL::Digest::SHA256
- # for ActiveSupport::Digest
- class Facade
- class << self
- def hexdigest(...)
- hash_digest_class.hexdigest(...)
- end
-
- def hash_digest_class
- if use_sha256?
- ::OpenSSL::Digest::SHA256
- else
- ::Digest::MD5 # rubocop:disable Fips/MD5
- end
- end
-
- def use_sha256?
- return false unless Feature.feature_flags_available?
-
- Feature.enabled?(:active_support_hash_digest_sha256)
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/hook_data/merge_request_builder.rb b/lib/gitlab/hook_data/merge_request_builder.rb
index 2b4bdbd48bd..b4f90715293 100644
--- a/lib/gitlab/hook_data/merge_request_builder.rb
+++ b/lib/gitlab/hook_data/merge_request_builder.rb
@@ -62,7 +62,8 @@ module Gitlab
assignee_id: merge_request.assignee_ids.first, # This key is deprecated
labels: merge_request.labels_hook_attrs,
state: merge_request.state, # This key is deprecated
- blocking_discussions_resolved: merge_request.mergeable_discussions_state?
+ blocking_discussions_resolved: merge_request.mergeable_discussions_state?,
+ first_contribution: merge_request.first_contribution?
}
merge_request.attributes.with_indifferent_access.slice(*self.class.safe_hook_attributes)
diff --git a/lib/gitlab/http.rb b/lib/gitlab/http.rb
index 7bb16e071b0..567c4dc899f 100644
--- a/lib/gitlab/http.rb
+++ b/lib/gitlab/http.rb
@@ -44,29 +44,19 @@ module Gitlab
options
end
- options[:skip_read_total_timeout] = true if options[:skip_read_total_timeout].nil? && options[:stream_body]
-
- if options[:skip_read_total_timeout]
+ if options[:stream_body]
return httparty_perform_request(http_method, path, options_with_timeouts, &block)
end
start_time = nil
read_total_timeout = options.fetch(:timeout, DEFAULT_READ_TOTAL_TIMEOUT)
- tracked_timeout_error = false
httparty_perform_request(http_method, path, options_with_timeouts) do |fragment|
start_time ||= Gitlab::Metrics::System.monotonic_time
elapsed = Gitlab::Metrics::System.monotonic_time - start_time
if elapsed > read_total_timeout
- error = ReadTotalTimeout.new("Request timed out after #{elapsed} seconds")
-
- raise error if options[:use_read_total_timeout]
-
- unless tracked_timeout_error
- Gitlab::ErrorTracking.track_exception(error)
- tracked_timeout_error = true
- end
+ raise ReadTotalTimeout, "Request timed out after #{elapsed} seconds"
end
block.call fragment if block
diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb
index 8d9f86d3232..cad0e773b05 100644
--- a/lib/gitlab/i18n.rb
+++ b/lib/gitlab/i18n.rb
@@ -25,6 +25,7 @@ module Gitlab
'pt_BR' => 'Portuguese (Brazil) - português (Brasil)',
'ro_RO' => 'Romanian - română',
'ru' => 'Russian - руÑÑкий',
+ 'si_LK' => 'Sinhalese - සිංහල',
'tr_TR' => 'Turkish - Türkçe',
'uk' => 'Ukrainian - українÑька',
'zh_CN' => 'Chinese, Simplified - 简体中文',
@@ -43,29 +44,30 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 0,
'cs_CZ' => 0,
- 'da_DK' => 41,
- 'de' => 14,
+ 'da_DK' => 40,
+ 'de' => 15,
'en' => 100,
'eo' => 0,
- 'es' => 36,
+ 'es' => 37,
'fil_PH' => 0,
- 'fr' => 10,
+ 'fr' => 11,
'gl_ES' => 0,
'id_ID' => 0,
'it' => 1,
'ja' => 33,
- 'ko' => 12,
- 'nb_NO' => 27,
+ 'ko' => 11,
+ 'nb_NO' => 26,
'nl_NL' => 0,
'pl_PL' => 4,
- 'pt_BR' => 54,
- 'ro_RO' => 79,
- 'ru' => 29,
+ 'pt_BR' => 55,
+ 'ro_RO' => 100,
+ 'ru' => 28,
+ 'si_LK' => 11,
'tr_TR' => 12,
- 'uk' => 44,
- 'zh_CN' => 94,
+ 'uk' => 49,
+ 'zh_CN' => 99,
'zh_HK' => 2,
- 'zh_TW' => 2
+ 'zh_TW' => 4
}.freeze
private_constant :TRANSLATION_LEVELS
diff --git a/lib/gitlab/import_export/json/streaming_serializer.rb b/lib/gitlab/import_export/json/streaming_serializer.rb
index ebabf537ce5..59396c6bad2 100644
--- a/lib/gitlab/import_export/json/streaming_serializer.rb
+++ b/lib/gitlab/import_export/json/streaming_serializer.rb
@@ -70,7 +70,11 @@ module Gitlab
batch = batch.preload(key_preloads) if key_preloads
batch.each do |record|
+ before_read_callback(record)
+
items << Raw.new(record.to_json(options))
+
+ after_read_callback(record)
end
end
end
@@ -168,6 +172,20 @@ module Gitlab
def read_from_replica_if_available(&block)
::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&block)
end
+
+ def before_read_callback(record)
+ remove_cached_external_diff(record)
+ end
+
+ def after_read_callback(record)
+ remove_cached_external_diff(record)
+ end
+
+ def remove_cached_external_diff(record)
+ return unless record.is_a?(MergeRequest)
+
+ record.merge_request_diff&.remove_cached_external_diff
+ end
end
end
end
diff --git a/lib/gitlab/import_export/project/import_export.yml b/lib/gitlab/import_export/project/import_export.yml
index 5a1787218f5..50ff6146174 100644
--- a/lib/gitlab/import_export/project/import_export.yml
+++ b/lib/gitlab/import_export/project/import_export.yml
@@ -761,6 +761,7 @@ excluded_attributes:
- :exported_protected_branches
- :repository_size_limit
- :external_webhook_token
+ - :incident_management_issuable_escalation_statuses
namespaces:
- :runners_token
- :runners_token_encrypted
@@ -819,6 +820,7 @@ excluded_attributes:
- :upvotes_count
- :work_item_type_id
- :email_message_id
+ - :incident_management_issuable_escalation_status
merge_request: &merge_request_excluded_definition
- :milestone_id
- :sprint_id
diff --git a/lib/gitlab/import_export/project/relation_factory.rb b/lib/gitlab/import_export/project/relation_factory.rb
index 8110720fb46..c4b0e24e34a 100644
--- a/lib/gitlab/import_export/project/relation_factory.rb
+++ b/lib/gitlab/import_export/project/relation_factory.rb
@@ -89,6 +89,7 @@ module Gitlab
when :'Ci::PipelineSchedule' then setup_pipeline_schedule
when :'ProtectedBranch::MergeAccessLevel' then setup_protected_branch_access_level
when :'ProtectedBranch::PushAccessLevel' then setup_protected_branch_access_level
+ when :releases then setup_release
end
update_project_references
@@ -133,7 +134,7 @@ module Gitlab
end
def setup_diff
- diff = @relation_hash.delete('utf8_diff')
+ diff = @relation_hash.delete('diff_export') || @relation_hash.delete('utf8_diff')
parsed_relation_hash['diff'] = diff
end
@@ -150,6 +151,14 @@ module Gitlab
@relation_hash['relative_position'] = compute_relative_position
end
+ def setup_release
+ # When author is not present for source release set the author as ghost user.
+
+ if @relation_hash['author_id'].blank?
+ @relation_hash['author_id'] = User.select(:id).ghost.id
+ end
+ end
+
def setup_pipeline_schedule
@relation_hash['active'] = false
end
diff --git a/lib/gitlab/issuable/clone/attributes_rewriter.rb b/lib/gitlab/issuable/clone/attributes_rewriter.rb
new file mode 100644
index 00000000000..fd9b2f086fc
--- /dev/null
+++ b/lib/gitlab/issuable/clone/attributes_rewriter.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Issuable
+ module Clone
+ class AttributesRewriter
+ attr_reader :current_user, :original_entity, :target_parent
+
+ def initialize(current_user, original_entity, target_parent)
+ raise ArgumentError, 'target_parent cannot be nil' if target_parent.nil?
+
+ @current_user = current_user
+ @original_entity = original_entity
+ @target_parent = target_parent
+ end
+
+ def execute(include_milestone: true)
+ attributes = { label_ids: cloneable_labels.pluck_primary_key }
+
+ if include_milestone
+ milestone = matching_milestone(original_entity.milestone&.title)
+ attributes[:milestone_id] = milestone.id if milestone.present?
+ end
+
+ attributes
+ end
+
+ private
+
+ def cloneable_labels
+ params = {
+ project_id: project&.id,
+ group_id: group&.id,
+ title: original_entity.labels.select(:title),
+ include_ancestor_groups: true
+ }
+
+ params[:only_group_labels] = true if target_parent.is_a?(Group)
+
+ LabelsFinder.new(current_user, params).execute
+ end
+
+ def matching_milestone(title)
+ return if title.blank?
+
+ params = { title: title, project_ids: project&.id, group_ids: group&.id }
+
+ milestones = MilestonesFinder.new(params).execute
+ milestones.first
+ end
+
+ def project
+ target_parent if target_parent.is_a?(Project)
+ end
+
+ def group
+ if target_parent.is_a?(Group)
+ target_parent
+ elsif target_parent&.group && current_user.can?(:read_group, target_parent.group)
+ target_parent.group
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/issuable/clone/copy_resource_events_service.rb b/lib/gitlab/issuable/clone/copy_resource_events_service.rb
new file mode 100644
index 00000000000..563805fcb01
--- /dev/null
+++ b/lib/gitlab/issuable/clone/copy_resource_events_service.rb
@@ -0,0 +1,116 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Issuable
+ module Clone
+ class CopyResourceEventsService
+ attr_reader :current_user, :original_entity, :new_entity
+
+ def initialize(current_user, original_entity, new_entity)
+ @current_user = current_user
+ @original_entity = original_entity
+ @new_entity = new_entity
+ end
+
+ def execute
+ copy_resource_label_events
+ copy_resource_milestone_events
+ copy_resource_state_events
+ end
+
+ private
+
+ def copy_resource_label_events
+ copy_events(ResourceLabelEvent.table_name, original_entity.resource_label_events) do |event|
+ event.attributes
+ .except('id', 'reference', 'reference_html')
+ .merge(entity_key => new_entity.id, 'action' => ResourceLabelEvent.actions[event.action])
+ end
+ end
+
+ def copy_resource_milestone_events
+ return unless milestone_events_supported?
+
+ copy_events(ResourceMilestoneEvent.table_name, original_entity.resource_milestone_events) do |event|
+ if event.remove?
+ event_attributes_with_milestone(event, nil)
+ else
+ destination_milestone = matching_milestone(event.milestone_title)
+
+ event_attributes_with_milestone(event, destination_milestone) if destination_milestone.present?
+ end
+ end
+ end
+
+ def copy_resource_state_events
+ return unless state_events_supported?
+
+ copy_events(ResourceStateEvent.table_name, original_entity.resource_state_events) do |event|
+ event.attributes
+ .except(*blocked_state_event_attributes)
+ .merge(entity_key => new_entity.id,
+ 'state' => ResourceStateEvent.states[event.state])
+ end
+ end
+
+ # Overriden on EE::Gitlab::Issuable::Clone::CopyResourceEventsService
+ def blocked_state_event_attributes
+ ['id']
+ end
+
+ def event_attributes_with_milestone(event, milestone)
+ event.attributes
+ .except('id')
+ .merge(entity_key => new_entity.id,
+ 'milestone_id' => milestone&.id,
+ 'action' => ResourceMilestoneEvent.actions[event.action],
+ 'state' => ResourceMilestoneEvent.states[event.state])
+ end
+
+ def copy_events(table_name, events_to_copy)
+ events_to_copy.find_in_batches do |batch|
+ events = batch.map do |event|
+ yield(event)
+ end.compact
+
+ ApplicationRecord.legacy_bulk_insert(table_name, events) # rubocop:disable Gitlab/BulkInsert
+ end
+ end
+
+ def entity_key
+ new_entity.class.name.underscore.foreign_key
+ end
+
+ def milestone_events_supported?
+ both_respond_to?(:resource_milestone_events)
+ end
+
+ def state_events_supported?
+ both_respond_to?(:resource_state_events)
+ end
+
+ def both_respond_to?(method)
+ original_entity.respond_to?(method) &&
+ new_entity.respond_to?(method)
+ end
+
+ def matching_milestone(title)
+ return if title.blank? || !new_entity.supports_milestone?
+
+ params = { title: title, project_ids: new_entity.project&.id, group_ids: group&.id }
+
+ milestones = MilestonesFinder.new(params).execute
+ milestones.first
+ end
+
+ def group
+ if new_entity.project&.group && current_user.can?(:read_group, new_entity.project.group)
+ new_entity.project.group
+ end
+ end
+ end
+ end
+ end
+end
+
+Gitlab::Issuable::Clone::CopyResourceEventsService.prepend_mod
diff --git a/lib/gitlab/jira_import/issue_serializer.rb b/lib/gitlab/jira_import/issue_serializer.rb
index ab748d67fbf..70ec6f08fcd 100644
--- a/lib/gitlab/jira_import/issue_serializer.rb
+++ b/lib/gitlab/jira_import/issue_serializer.rb
@@ -5,10 +5,11 @@ module Gitlab
class IssueSerializer
attr_reader :jira_issue, :project, :import_owner_id, :params, :formatter
- def initialize(project, jira_issue, import_owner_id, params = {})
+ def initialize(project, jira_issue, import_owner_id, work_item_type_id, params = {})
@jira_issue = jira_issue
@project = project
@import_owner_id = import_owner_id
+ @work_item_type_id = work_item_type_id
@params = params
@formatter = Gitlab::ImportFormatter.new
end
@@ -17,6 +18,7 @@ module Gitlab
{
iid: params[:iid],
project_id: project.id,
+ namespace_id: project.project_namespace_id,
description: description,
title: title,
state_id: map_status(jira_issue.status.statusCategory),
@@ -24,7 +26,8 @@ module Gitlab
created_at: jira_issue.created,
author_id: reporter,
assignee_ids: assignees,
- label_ids: label_ids
+ label_ids: label_ids,
+ work_item_type_id: @work_item_type_id
}
end
@@ -45,9 +48,9 @@ module Gitlab
def map_status(jira_status_category)
case jira_status_category["key"].downcase
when 'done'
- Issuable::STATE_ID_MAP[:closed]
+ ::Issuable::STATE_ID_MAP[:closed]
else
- Issuable::STATE_ID_MAP[:opened]
+ ::Issuable::STATE_ID_MAP[:opened]
end
end
diff --git a/lib/gitlab/jira_import/issues_importer.rb b/lib/gitlab/jira_import/issues_importer.rb
index 8a03162f111..f1ead57c911 100644
--- a/lib/gitlab/jira_import/issues_importer.rb
+++ b/lib/gitlab/jira_import/issues_importer.rb
@@ -16,6 +16,7 @@ module Gitlab
@start_at = Gitlab::JiraImport.get_issues_next_start_at(project.id)
@imported_items_cache_key = JiraImport.already_imported_cache_key(:issues, project.id)
@job_waiter = JobWaiter.new
+ @issue_type_id = WorkItems::Type.default_issue_type.id
end
def execute
@@ -58,8 +59,13 @@ module Gitlab
next if already_imported?(jira_issue.id)
begin
- issue_attrs = IssueSerializer.new(project, jira_issue, running_import.user_id, { iid: next_iid }).execute
-
+ issue_attrs = IssueSerializer.new(
+ project,
+ jira_issue,
+ running_import.user_id,
+ @issue_type_id,
+ { iid: next_iid }
+ ).execute
Gitlab::JiraImport::ImportIssueWorker.perform_async(project.id, jira_issue.id, issue_attrs, job_waiter.key)
job_waiter.jobs_remaining += 1
diff --git a/lib/gitlab/json.rb b/lib/gitlab/json.rb
index 512936bb4f4..ce07752f88c 100644
--- a/lib/gitlab/json.rb
+++ b/lib/gitlab/json.rb
@@ -95,7 +95,7 @@ module Gitlab
opts = standardize_opts(opts)
Oj.load(string, opts)
- rescue Oj::ParseError, Encoding::UndefinedConversionError => ex
+ rescue Oj::ParseError, EncodingError, Encoding::UndefinedConversionError => ex
raise parser_error, ex
end
diff --git a/lib/gitlab/lograge/custom_options.rb b/lib/gitlab/lograge/custom_options.rb
index 84ead5119d5..f8ec58cf217 100644
--- a/lib/gitlab/lograge/custom_options.rb
+++ b/lib/gitlab/lograge/custom_options.rb
@@ -7,7 +7,7 @@ module Gitlab
LIMITED_ARRAY_SENTINEL = { key: 'truncated', value: '...' }.freeze
IGNORE_PARAMS = Set.new(%w(controller action format)).freeze
- KNOWN_PAYLOAD_PARAMS = [:remote_ip, :user_id, :username, :ua, :queue_duration_s,
+ KNOWN_PAYLOAD_PARAMS = [:remote_ip, :user_id, :username, :ua, :queue_duration_s, :response_bytes,
:etag_route, :request_urgency, :target_duration_s] + CLOUDFLARE_CUSTOM_HEADERS.values
def self.call(event)
@@ -36,6 +36,10 @@ module Gitlab
payload[:feature_flag_states] = Feature.logged_states.map { |key, state| "#{key}:#{state ? 1 : 0}" }
end
+ if Feature.disabled?(:log_response_length)
+ payload.delete(:response_bytes)
+ end
+
payload
end
end
diff --git a/lib/gitlab/memory/watchdog.rb b/lib/gitlab/memory/watchdog.rb
new file mode 100644
index 00000000000..db75ba8a47d
--- /dev/null
+++ b/lib/gitlab/memory/watchdog.rb
@@ -0,0 +1,192 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Memory
+ # A background thread that observes Ruby heap fragmentation and calls
+ # into a handler when the Ruby heap has been fragmented for an extended
+ # period of time.
+ #
+ # See Gitlab::Metrics::Memory for how heap fragmentation is defined.
+ #
+ # To decide whether a given fragmentation level is being exceeded,
+ # the watchdog regularly polls the GC. Whenever a violation occurs
+ # a strike is issued. If the maximum number of strikes are reached,
+ # a handler is invoked to deal with the situation.
+ #
+ # The duration for which a process may be above a given fragmentation
+ # threshold is computed as `max_strikes * sleep_time_seconds`.
+ class Watchdog < Daemon
+ DEFAULT_SLEEP_TIME_SECONDS = 60
+ DEFAULT_HEAP_FRAG_THRESHOLD = 0.5
+ DEFAULT_MAX_STRIKES = 5
+
+ # This handler does nothing. It returns `false` to indicate to the
+ # caller that the situation has not been dealt with so it will
+ # receive calls repeatedly if fragmentation remains high.
+ #
+ # This is useful for "dress rehearsals" in production since it allows
+ # us to observe how frequently the handler is invoked before taking action.
+ class NullHandler
+ include Singleton
+
+ def on_high_heap_fragmentation(value)
+ # NOP
+ false
+ end
+ end
+
+ # This handler sends SIGTERM and considers the situation handled.
+ class TermProcessHandler
+ def initialize(pid = $$)
+ @pid = pid
+ end
+
+ def on_high_heap_fragmentation(value)
+ Process.kill(:TERM, @pid)
+ true
+ end
+ end
+
+ # This handler invokes Puma's graceful termination handler, which takes
+ # into account a configurable grace period during which a process may
+ # remain unresponsive to a SIGTERM.
+ class PumaHandler
+ def initialize(puma_options = ::Puma.cli_config.options)
+ @worker = ::Puma::Cluster::WorkerHandle.new(0, $$, 0, puma_options)
+ end
+
+ def on_high_heap_fragmentation(value)
+ @worker.term
+ true
+ end
+ end
+
+ # max_heap_fragmentation:
+ # The degree to which the Ruby heap is allowed to be fragmented. Range [0,1].
+ # max_strikes:
+ # How many times the process is allowed to be above max_heap_fragmentation before
+ # a handler is invoked.
+ # sleep_time_seconds:
+ # Used to control the frequency with which the watchdog will wake up and poll the GC.
+ def initialize(
+ handler: NullHandler.instance,
+ logger: Logger.new($stdout),
+ max_heap_fragmentation: ENV['GITLAB_MEMWD_MAX_HEAP_FRAG']&.to_f || DEFAULT_HEAP_FRAG_THRESHOLD,
+ max_strikes: ENV['GITLAB_MEMWD_MAX_STRIKES']&.to_i || DEFAULT_MAX_STRIKES,
+ sleep_time_seconds: ENV['GITLAB_MEMWD_SLEEP_TIME_SEC']&.to_i || DEFAULT_SLEEP_TIME_SECONDS,
+ **options)
+ super(**options)
+
+ @handler = handler
+ @logger = logger
+ @max_heap_fragmentation = max_heap_fragmentation
+ @sleep_time_seconds = sleep_time_seconds
+ @max_strikes = max_strikes
+
+ @alive = true
+ @strikes = 0
+
+ init_prometheus_metrics(max_heap_fragmentation)
+ end
+
+ attr_reader :strikes, :max_heap_fragmentation, :max_strikes, :sleep_time_seconds
+
+ def run_thread
+ @logger.info(log_labels.merge(message: 'started'))
+
+ while @alive
+ sleep(@sleep_time_seconds)
+
+ monitor_heap_fragmentation if Feature.enabled?(:gitlab_memory_watchdog, type: :ops)
+ end
+
+ @logger.info(log_labels.merge(message: 'stopped'))
+ end
+
+ private
+
+ def monitor_heap_fragmentation
+ heap_fragmentation = Gitlab::Metrics::Memory.gc_heap_fragmentation
+
+ if heap_fragmentation > @max_heap_fragmentation
+ @strikes += 1
+ @heap_frag_violations.increment
+ else
+ @strikes = 0
+ end
+
+ if @strikes > @max_strikes
+ # If the handler returns true, it means the event is handled and we can shut down.
+ @alive = !handle_heap_fragmentation_limit_exceeded(heap_fragmentation)
+ @strikes = 0
+ end
+ end
+
+ def handle_heap_fragmentation_limit_exceeded(value)
+ @logger.warn(
+ log_labels.merge(
+ message: 'heap fragmentation limit exceeded',
+ memwd_cur_heap_frag: value
+ ))
+ @heap_frag_violations_handled.increment
+
+ handler.on_high_heap_fragmentation(value)
+ end
+
+ def handler
+ # This allows us to keep the watchdog running but turn it into "friendly mode" where
+ # all that happens is we collect logs and Prometheus events for fragmentation violations.
+ return NullHandler.instance unless Feature.enabled?(:enforce_memory_watchdog, type: :ops)
+
+ @handler
+ end
+
+ def stop_working
+ @alive = false
+ end
+
+ def log_labels
+ {
+ pid: $$,
+ worker_id: worker_id,
+ memwd_handler_class: handler.class.name,
+ memwd_sleep_time_s: @sleep_time_seconds,
+ memwd_max_heap_frag: @max_heap_fragmentation,
+ memwd_max_strikes: @max_strikes,
+ memwd_cur_strikes: @strikes,
+ memwd_rss_bytes: process_rss_bytes
+ }
+ end
+
+ def worker_id
+ ::Prometheus::PidProvider.worker_id
+ end
+
+ def process_rss_bytes
+ Gitlab::Metrics::System.memory_usage_rss
+ end
+
+ def init_prometheus_metrics(max_heap_fragmentation)
+ default_labels = { pid: worker_id }
+
+ @heap_frag_limit = Gitlab::Metrics.gauge(
+ :gitlab_memwd_heap_frag_limit,
+ 'The configured limit for how fragmented the Ruby heap is allowed to be',
+ default_labels
+ )
+ @heap_frag_limit.set({}, max_heap_fragmentation)
+
+ @heap_frag_violations = Gitlab::Metrics.counter(
+ :gitlab_memwd_heap_frag_violations_total,
+ 'Total number of times heap fragmentation in a Ruby process exceeded its allowed maximum',
+ default_labels
+ )
+ @heap_frag_violations_handled = Gitlab::Metrics.counter(
+ :gitlab_memwd_heap_frag_violations_handled_total,
+ 'Total number of times heap fragmentation violations in a Ruby process were handled',
+ default_labels
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/exporter/base_exporter.rb b/lib/gitlab/metrics/exporter/base_exporter.rb
index ba2eb729d7b..858a0a120cc 100644
--- a/lib/gitlab/metrics/exporter/base_exporter.rb
+++ b/lib/gitlab/metrics/exporter/base_exporter.rb
@@ -7,6 +7,8 @@ module Gitlab
module Metrics
module Exporter
class BaseExporter < Daemon
+ CERT_REGEX = /-----BEGIN CERTIFICATE-----(?:.|\n)+?-----END CERTIFICATE-----/.freeze
+
attr_reader :server
# @param settings [Hash] SettingsLogic hash containing the `*_exporter` config
@@ -38,10 +40,16 @@ module Gitlab
[logger, WEBrick::AccessLog::COMBINED_LOG_FORMAT]
]
- @server = ::WEBrick::HTTPServer.new(
- Port: settings.port, BindAddress: settings.address,
- Logger: logger, AccessLog: access_log
- )
+ server_config = {
+ Port: settings.port,
+ BindAddress: settings.address,
+ Logger: logger,
+ AccessLog: access_log
+ }
+
+ server_config.merge!(ssl_config) if settings['tls_enabled']
+
+ @server = ::WEBrick::HTTPServer.new(server_config)
server.mount '/', Rack::Handler::WEBrick, rack_app
true
@@ -82,6 +90,33 @@ module Gitlab
run -> (env) { [404, {}, ['']] }
end
end
+
+ def ssl_config
+ # This monkey-patches WEBrick::GenericServer, so never require this unless TLS is enabled.
+ require 'webrick/ssl'
+
+ certs = load_ca_certs_bundle(File.binread(settings['tls_cert_path']))
+
+ {
+ SSLEnable: true,
+ SSLCertificate: certs.shift,
+ SSLPrivateKey: OpenSSL::PKey.read(File.binread(settings['tls_key_path'])),
+ # SSLStartImmediately is true by default according to the docs, but when WEBrick creates the
+ # SSLServer internally, the switch was always nil for some reason. Setting this explicitly fixes this.
+ SSLStartImmediately: true,
+ SSLExtraChainCert: certs
+ }
+ end
+
+ # In Ruby OpenSSL v3.0.0, this can be replaced by OpenSSL::X509::Certificate.load
+ # https://github.com/ruby/openssl/issues/254
+ def load_ca_certs_bundle(ca_certs_string)
+ return [] unless ca_certs_string
+
+ ca_certs_string.scan(CERT_REGEX).map do |ca_cert_string|
+ OpenSSL::X509::Certificate.new(ca_cert_string)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/metrics/memory.rb b/lib/gitlab/metrics/memory.rb
new file mode 100644
index 00000000000..c165cdec7a3
--- /dev/null
+++ b/lib/gitlab/metrics/memory.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Metrics
+ module Memory
+ extend self
+
+ HEAP_SLOTS_PER_PAGE = GC::INTERNAL_CONSTANTS[:HEAP_PAGE_OBJ_LIMIT]
+
+ def gc_heap_fragmentation(gc_stat = GC.stat)
+ 1 - (gc_stat[:heap_live_slots] / (HEAP_SLOTS_PER_PAGE * gc_stat[:heap_eden_pages].to_f))
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/prometheus.rb b/lib/gitlab/metrics/prometheus.rb
index 848b73792cb..0b513f5521e 100644
--- a/lib/gitlab/metrics/prometheus.rb
+++ b/lib/gitlab/metrics/prometheus.rb
@@ -29,6 +29,7 @@ module Gitlab
clear_memoization(:registry)
REGISTRY_MUTEX.synchronize do
+ ::Prometheus::Client.cleanup!
::Prometheus::Client.reset!
end
end
diff --git a/lib/gitlab/metrics/samplers/ruby_sampler.rb b/lib/gitlab/metrics/samplers/ruby_sampler.rb
index 4a3ef3711a5..8e002293347 100644
--- a/lib/gitlab/metrics/samplers/ruby_sampler.rb
+++ b/lib/gitlab/metrics/samplers/ruby_sampler.rb
@@ -39,7 +39,8 @@ module Gitlab
process_proportional_memory_bytes: ::Gitlab::Metrics.gauge(metric_name(:process, :proportional_memory_bytes), 'Memory used (PSS)', labels),
process_start_time_seconds: ::Gitlab::Metrics.gauge(metric_name(:process, :start_time_seconds), 'Process start time seconds'),
sampler_duration: ::Gitlab::Metrics.counter(metric_name(:sampler, :duration_seconds_total), 'Sampler time', labels),
- gc_duration_seconds: ::Gitlab::Metrics.histogram(metric_name(:gc, :duration_seconds), 'GC time', labels, GC_REPORT_BUCKETS)
+ gc_duration_seconds: ::Gitlab::Metrics.histogram(metric_name(:gc, :duration_seconds), 'GC time', labels, GC_REPORT_BUCKETS),
+ heap_fragmentation: ::Gitlab::Metrics.gauge(metric_name(:gc_stat_ext, :heap_fragmentation), 'Ruby heap fragmentation', labels)
}
GC.stat.keys.each do |key|
@@ -76,8 +77,13 @@ module Gitlab
end
# Collect generic GC stats
- GC.stat.each do |key, value|
- metrics[key].set(labels, value)
+ GC.stat.then do |gc_stat|
+ gc_stat.each do |key, value|
+ metrics[key].set(labels, value)
+ end
+
+ # Collect custom GC stats
+ metrics[:heap_fragmentation].set(labels, Memory.gc_heap_fragmentation(gc_stat))
end
end
diff --git a/lib/gitlab/metrics/sli.rb b/lib/gitlab/metrics/sli.rb
index 2de19514354..15cfe777f4d 100644
--- a/lib/gitlab/metrics/sli.rb
+++ b/lib/gitlab/metrics/sli.rb
@@ -82,7 +82,7 @@ module Gitlab
private
def counter_name(suffix)
- :"#{COUNTER_PREFIX}:#{name}_apdex:#{suffix}"
+ [COUNTER_PREFIX, "#{name}_apdex", suffix].join('_').to_sym
end
def numerator_counter
@@ -100,7 +100,7 @@ module Gitlab
private
def counter_name(suffix)
- :"#{COUNTER_PREFIX}:#{name}:#{suffix}"
+ [COUNTER_PREFIX, name, suffix].join('_').to_sym
end
def numerator_counter
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index 7c22ce64ea2..e3756a8c9f6 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -24,7 +24,7 @@ module Gitlab
# This event is published from ActiveRecordBaseTransactionMetrics and
# used to record a database transaction duration when calling
- # ActiveRecord::Base.transaction {} block.
+ # ApplicationRecord.transaction {} block.
def transaction(event)
observe(:gitlab_database_transaction_seconds, event) do
buckets TRANSACTION_DURATION_BUCKET
@@ -186,7 +186,10 @@ module Gitlab
end
::Gitlab::Database.database_base_models.keys.each do |config_name|
- counters << compose_metric_key(metric, nil, config_name) # main / ci
+ counters << compose_metric_key(metric, nil, config_name) # main / ci / geo
+ end
+
+ ::Gitlab::Database.database_base_models_using_load_balancing.keys.each do |config_name|
counters << compose_metric_key(metric, nil, config_name + ::Gitlab::Database::LoadBalancing::LoadBalancer::REPLICA_SUFFIX) # main_replica / ci_replica
end
end
diff --git a/lib/gitlab/pages/cache_control.rb b/lib/gitlab/pages/cache_control.rb
new file mode 100644
index 00000000000..991a1297d03
--- /dev/null
+++ b/lib/gitlab/pages/cache_control.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pages
+ class CacheControl
+ CACHE_KEY_FORMAT = 'pages_domain_for_%{type}_%{id}'
+
+ attr_reader :cache_key
+
+ class << self
+ def for_project(project_id)
+ new(type: :project, id: project_id)
+ end
+
+ def for_namespace(namespace_id)
+ new(type: :namespace, id: namespace_id)
+ end
+ end
+
+ def initialize(type:, id:)
+ raise(ArgumentError, "type must be :namespace or :project") unless %i[namespace project].include?(type)
+
+ @cache_key = CACHE_KEY_FORMAT % { type: type, id: id }
+ end
+
+ def clear_cache
+ Rails.cache.delete(cache_key)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/pages/deployment_update.rb b/lib/gitlab/pages/deployment_update.rb
new file mode 100644
index 00000000000..2f5c6938e2a
--- /dev/null
+++ b/lib/gitlab/pages/deployment_update.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pages
+ class DeploymentUpdate
+ include ActiveModel::Validations
+
+ PUBLIC_DIR = 'public'
+
+ validate :validate_state, unless: -> { errors.any? }
+ validate :validate_outdated_sha, unless: -> { errors.any? }
+ validate :validate_max_size, unless: -> { errors.any? }
+ validate :validate_public_folder, unless: -> { errors.any? }
+ validate :validate_max_entries, unless: -> { errors.any? }
+
+ def initialize(project, build)
+ @project = project
+ @build = build
+ end
+
+ def latest?
+ # check if sha for the ref is still the most recent one
+ # this helps in case when multiple deployments happens
+ sha == latest_sha
+ end
+
+ def entries_count
+ # we're using the full archive and pages daemon needs to read it
+ # so we want the total count from entries, not only "public/" directory
+ # because it better approximates work we need to do before we can serve the site
+ @entries_count = build.artifacts_metadata_entry("", recursive: true).entries.count
+ end
+
+ private
+
+ attr_reader :build, :project
+
+ def validate_state
+ errors.add(:base, 'missing pages artifacts') unless build.artifacts?
+ errors.add(:base, 'missing artifacts metadata') unless build.artifacts_metadata?
+ end
+
+ def validate_max_size
+ if total_size > max_size
+ errors.add(:base, "artifacts for pages are too large: #{total_size}")
+ end
+ end
+
+ # Calculate page size after extract
+ def total_size
+ @total_size ||= build.artifacts_metadata_entry(PUBLIC_DIR + '/', recursive: true).total_size
+ end
+
+ def max_size_from_settings
+ Gitlab::CurrentSettings.max_pages_size.megabytes
+ end
+
+ def max_size
+ max_pages_size = max_size_from_settings
+
+ return ::Gitlab::Pages::MAX_SIZE if max_pages_size == 0
+
+ max_pages_size
+ end
+
+ def validate_max_entries
+ if pages_file_entries_limit > 0 && entries_count > pages_file_entries_limit
+ errors.add(
+ :base,
+ "pages site contains #{entries_count} file entries, while limit is set to #{pages_file_entries_limit}"
+ )
+ end
+ end
+
+ def validate_public_folder
+ if total_size <= 0
+ errors.add(:base, 'Error: The `public/` folder is missing, or not declared in `.gitlab-ci.yml`.')
+ end
+ end
+
+ def pages_file_entries_limit
+ project.actual_limits.pages_file_entries
+ end
+
+ def validate_outdated_sha
+ return if latest?
+
+ # use pipeline_id in case the build is retried
+ last_deployed_pipeline_id = project.pages_metadatum&.pages_deployment&.ci_build&.pipeline_id
+
+ return unless last_deployed_pipeline_id
+ return if last_deployed_pipeline_id <= build.pipeline_id
+
+ errors.add(:base, 'build SHA is outdated for this ref')
+ end
+
+ def latest_sha
+ project.commit(build.ref).try(:sha).to_s
+ ensure
+ # Close any file descriptors that were opened and free libgit2 buffers
+ project.cleanup
+ end
+
+ def sha
+ build.sha
+ end
+ end
+ end
+end
+
+Gitlab::Pages::DeploymentUpdate.prepend_mod_with('Gitlab::Pages::DeploymentUpdate')
diff --git a/lib/gitlab/pagination/cursor_based_keyset.rb b/lib/gitlab/pagination/cursor_based_keyset.rb
index f19cdf06d9a..2d9fb0a50fc 100644
--- a/lib/gitlab/pagination/cursor_based_keyset.rb
+++ b/lib/gitlab/pagination/cursor_based_keyset.rb
@@ -4,9 +4,18 @@ module Gitlab
module Pagination
module CursorBasedKeyset
SUPPORTED_ORDERING = {
- Group => { name: :asc }
+ Group => { name: :asc },
+ AuditEvent => { id: :desc }
}.freeze
+ # Relation types that are enforced in this list
+ # enforce the use of keyset pagination, thus erroring out requests
+ # made with offset pagination above a certain limit.
+ #
+ # In many cases this could introduce a breaking change
+ # so enforcement is optional.
+ ENFORCED_TYPES = [Group].freeze
+
def self.available_for_type?(relation)
SUPPORTED_ORDERING.key?(relation.klass)
end
@@ -16,6 +25,10 @@ module Gitlab
order_satisfied?(relation, cursor_based_request_context)
end
+ def self.enforced_for_type?(relation)
+ ENFORCED_TYPES.include?(relation.klass)
+ end
+
def self.order_satisfied?(relation, cursor_based_request_context)
order_by_from_request = cursor_based_request_context.order_by
diff --git a/lib/gitlab/pagination/keyset/cursor_based_request_context.rb b/lib/gitlab/pagination/keyset/cursor_based_request_context.rb
index e06d7e48ca3..41b90846345 100644
--- a/lib/gitlab/pagination/keyset/cursor_based_request_context.rb
+++ b/lib/gitlab/pagination/keyset/cursor_based_request_context.rb
@@ -5,6 +5,8 @@ module Gitlab
module Keyset
class CursorBasedRequestContext
DEFAULT_SORT_DIRECTION = :desc
+ DEFAULT_SORT_COLUMN = :id
+
attr_reader :request_context
delegate :params, to: :request_context
@@ -28,7 +30,7 @@ module Gitlab
end
def order_by
- { params[:order_by].to_sym => params[:sort]&.to_sym || DEFAULT_SORT_DIRECTION }
+ { (params[:order_by]&.to_sym || DEFAULT_SORT_COLUMN) => (params[:sort]&.to_sym || DEFAULT_SORT_DIRECTION) }
end
end
end
diff --git a/lib/gitlab/pagination/keyset/order.rb b/lib/gitlab/pagination/keyset/order.rb
index 290e94401b8..0d8e4ea6fee 100644
--- a/lib/gitlab/pagination/keyset/order.rb
+++ b/lib/gitlab/pagination/keyset/order.rb
@@ -96,7 +96,9 @@ module Gitlab
column_definitions.each_with_object({}.with_indifferent_access) do |column_definition, hash|
field_value = node[column_definition.attribute_name]
hash[column_definition.attribute_name] = if field_value.is_a?(Time)
- field_value.strftime('%Y-%m-%d %H:%M:%S.%N %Z')
+ # use :inspect formatter to provide specific timezone info
+ # eg 2022-07-05 21:57:56.041499000 +0800
+ field_value.to_s(:inspect)
elsif field_value.nil?
nil
elsif lower_named_function?(column_definition)
@@ -107,6 +109,10 @@ module Gitlab
end
end
+ def attribute_names
+ column_definitions.map(&:attribute_name)
+ end
+
# This methods builds the conditions for the keyset pagination
#
# Example:
diff --git a/lib/gitlab/quick_actions/issuable_actions.rb b/lib/gitlab/quick_actions/issuable_actions.rb
index 259d9e38d65..3b85d6952a1 100644
--- a/lib/gitlab/quick_actions/issuable_actions.rb
+++ b/lib/gitlab/quick_actions/issuable_actions.rb
@@ -23,7 +23,7 @@ module Gitlab
_('Closed this %{quick_action_target}.') %
{ quick_action_target: quick_action_target.to_ability_name.humanize(capitalize: false) }
end
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
quick_action_target.open? &&
@@ -45,7 +45,7 @@ module Gitlab
_('Reopened this %{quick_action_target}.') %
{ quick_action_target: quick_action_target.to_ability_name.humanize(capitalize: false) }
end
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
quick_action_target.closed? &&
@@ -63,7 +63,7 @@ module Gitlab
_('Changed the title to "%{title_param}".') % { title_param: title_param }
end
params '<New title>'
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
current_user.can?(:"update_#{quick_action_target.to_ability_name}", quick_action_target)
@@ -82,7 +82,7 @@ module Gitlab
end
end
params '~label1 ~"label 2"'
- types Issuable
+ types ::Issuable
condition do
current_user.can?(:"set_#{quick_action_target.to_ability_name}_metadata", quick_action_target) &&
find_labels.any?
@@ -102,7 +102,7 @@ module Gitlab
end
end
params '~label1 ~"label 2"'
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
quick_action_target.labels.any? &&
@@ -134,7 +134,7 @@ module Gitlab
"Replaces all labels with #{labels.join(' ')} #{'label'.pluralize(labels.count)}." if labels.any?
end
params '~label1 ~"label 2"'
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
quick_action_target.labels.any? &&
@@ -147,7 +147,7 @@ module Gitlab
desc { _('Add a to do') }
explanation { _('Adds a to do.') }
execution_message { _('Added a to do.') }
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
!TodoService.new.todo_exist?(quick_action_target, current_user)
@@ -159,7 +159,7 @@ module Gitlab
desc { _('Mark to do as done') }
explanation { _('Marks to do as done.') }
execution_message { _('Marked to do as done.') }
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
TodoService.new.todo_exist?(quick_action_target, current_user)
@@ -177,7 +177,7 @@ module Gitlab
_('Subscribed to this %{quick_action_target}.') %
{ quick_action_target: quick_action_target.to_ability_name.humanize(capitalize: false) }
end
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
!quick_action_target.subscribed?(current_user, project)
@@ -195,7 +195,7 @@ module Gitlab
_('Unsubscribed from this %{quick_action_target}.') %
{ quick_action_target: quick_action_target.to_ability_name.humanize(capitalize: false) }
end
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted? &&
quick_action_target.subscribed?(current_user, project)
@@ -212,7 +212,7 @@ module Gitlab
_("Toggled :%{name}: emoji award.") % { name: name } if name
end
params ':emoji:'
- types Issuable
+ types ::Issuable
condition do
quick_action_target.persisted?
end
@@ -228,14 +228,14 @@ module Gitlab
desc { _("Append the comment with %{shrug}") % { shrug: SHRUG } }
params '<Comment>'
- types Issuable
+ types ::Issuable
substitution :shrug do |comment|
"#{comment} #{SHRUG}"
end
desc { _("Append the comment with %{tableflip}") % { tableflip: TABLEFLIP } }
params '<Comment>'
- types Issuable
+ types ::Issuable
substitution :tableflip do |comment|
"#{comment} #{TABLEFLIP}"
end
diff --git a/lib/gitlab/quick_actions/users_extractor.rb b/lib/gitlab/quick_actions/users_extractor.rb
new file mode 100644
index 00000000000..06e04c74312
--- /dev/null
+++ b/lib/gitlab/quick_actions/users_extractor.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module QuickActions
+ class UsersExtractor
+ MAX_QUICK_ACTION_USERS = 100
+
+ Error = Class.new(ArgumentError)
+ TooManyError = Class.new(Error) do
+ def limit
+ MAX_QUICK_ACTION_USERS
+ end
+ end
+
+ MissingError = Class.new(Error)
+ TooManyFoundError = Class.new(TooManyError)
+ TooManyRefsError = Class.new(TooManyError)
+
+ attr_reader :text, :current_user, :project, :group, :target
+
+ def initialize(current_user, project:, group:, target:, text:)
+ @current_user = current_user
+ @project = project
+ @group = group
+ @target = target
+ @text = text
+ end
+
+ def execute
+ return [] unless text.present?
+
+ users = collect_users
+
+ check_users!(users)
+
+ users
+ end
+
+ private
+
+ def collect_users
+ users = []
+ users << current_user if me?
+ users += find_referenced_users if references.any?
+
+ users
+ end
+
+ def check_users!(users)
+ raise TooManyFoundError if users.size > MAX_QUICK_ACTION_USERS
+
+ found = found_names(users)
+ missing = references.filter_map do
+ "'#{_1}'" unless found.include?(_1.downcase.delete_prefix('@'))
+ end
+
+ raise MissingError, missing.to_sentence if missing.present?
+ end
+
+ def found_names(users)
+ users.map(&:username).map(&:downcase).to_set
+ end
+
+ def find_referenced_users
+ raise TooManyRefsError if references.size > MAX_QUICK_ACTION_USERS
+
+ User.by_username(usernames).limit(MAX_QUICK_ACTION_USERS)
+ end
+
+ def usernames
+ references.map { _1.delete_prefix('@') }
+ end
+
+ def references
+ @references ||= begin
+ refs = args - ['me']
+ # nb: underscores may be passed in escaped to protect them from markdown rendering
+ refs.map! { _1.gsub(/\\_/, '_') }
+ refs
+ end
+ end
+
+ def args
+ @args ||= text.split(/\s|,/).map(&:strip).select(&:present?).uniq - ['and']
+ end
+
+ def me?
+ args&.include?('me')
+ end
+ end
+ end
+end
+
+Gitlab::QuickActions::UsersExtractor.prepend_mod_with('Gitlab::QuickActions::UsersExtractor')
diff --git a/lib/gitlab/redis/multi_store.rb b/lib/gitlab/redis/multi_store.rb
index 24c540eea47..94f06e957cf 100644
--- a/lib/gitlab/redis/multi_store.rb
+++ b/lib/gitlab/redis/multi_store.rb
@@ -11,8 +11,15 @@ module Gitlab
end
end
class PipelinedDiffError < StandardError
+ def initialize(result_primary, result_secondary)
+ @result_primary = result_primary
+ @result_secondary = result_secondary
+ end
+
def message
- 'Pipelined command executed on both stores successfully but results differ between them.'
+ "Pipelined command executed on both stores successfully but results differ between them. " \
+ "Result from the primary: #{@result_primary.inspect}. " \
+ "Result from the secondary: #{@result_secondary.inspect}."
end
end
class MethodMissingError < StandardError
@@ -246,10 +253,12 @@ module Gitlab
result_secondary = send_command(secondary_store, command_name, *args, **kwargs, &block)
- # Pipelined commands return an array with all results. If they differ,
- # log an error
- if result_primary != result_secondary
- log_error(PipelinedDiffError.new, command_name)
+ # Pipelined commands return an array with all results. If they differ, log an error
+ if result_primary && result_primary != result_secondary
+ error = PipelinedDiffError.new(result_primary, result_secondary)
+ error.set_backtrace(Thread.current.backtrace[1..]) # Manually set backtrace, since the error is not `raise`d
+
+ log_error(error, command_name)
increment_pipelined_command_error_count(command_name)
end
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index b0f4194b7a0..0534f890152 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -486,6 +486,10 @@ module Gitlab
def sep_by_1(separator, part)
%r(#{part} (#{separator} #{part})*)x
end
+
+ def x509_subject_key_identifier_regex
+ @x509_subject_key_identifier_regex ||= /\A(?:\h{2}:)*\h{2}\z/.freeze
+ end
end
end
diff --git a/lib/gitlab/saas.rb b/lib/gitlab/saas.rb
index 0a4f2ba64a8..4683f611444 100644
--- a/lib/gitlab/saas.rb
+++ b/lib/gitlab/saas.rb
@@ -48,6 +48,10 @@ module Gitlab
def self.about_pricing_faq_url
"https://about.gitlab.com/pricing#faq"
end
+
+ def self.doc_url
+ 'https://docs.gitlab.com'
+ end
end
end
diff --git a/lib/gitlab/security/scan_configuration.rb b/lib/gitlab/security/scan_configuration.rb
index 14883a34950..9b09ccdeb8e 100644
--- a/lib/gitlab/security/scan_configuration.rb
+++ b/lib/gitlab/security/scan_configuration.rb
@@ -18,7 +18,7 @@ module Gitlab
# SAST and Secret Detection are always available, but this isn't
# reflected by our license model yet.
# TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/333113
- %i[sast sast_iac secret_detection].include?(type)
+ %i[sast sast_iac secret_detection container_scanning].include?(type)
end
def can_enable_by_merge_request?
diff --git a/lib/gitlab/sidekiq_daemon/memory_killer.rb b/lib/gitlab/sidekiq_daemon/memory_killer.rb
index 113076a6a75..cb7d9c6f8a7 100644
--- a/lib/gitlab/sidekiq_daemon/memory_killer.rb
+++ b/lib/gitlab/sidekiq_daemon/memory_killer.rb
@@ -145,6 +145,8 @@ module Gitlab
sleep(CHECK_INTERVAL_SECONDS)
refresh_state(:above_soft_limit)
+
+ log_rss_out_of_range(false)
end
# There are two chances to break from loop:
@@ -153,28 +155,49 @@ module Gitlab
# When `above hard limit`, it immediately go to `stop_fetching_new_jobs`
# So ignore `above hard limit` and always set `above_soft_limit` here
refresh_state(:above_soft_limit)
- log_rss_out_of_range(@current_rss, @hard_limit_rss, @soft_limit_rss)
+ log_rss_out_of_range
false
end
- def log_rss_out_of_range(current_rss, hard_limit_rss, soft_limit_rss)
+ def log_rss_out_of_range(deadline_exceeded = true)
+ reason = out_of_range_description(@current_rss,
+ @hard_limit_rss,
+ @soft_limit_rss,
+ deadline_exceeded)
+
Sidekiq.logger.warn(
class: self.class.to_s,
pid: pid,
message: 'Sidekiq worker RSS out of range',
- current_rss: current_rss,
- hard_limit_rss: hard_limit_rss,
- soft_limit_rss: soft_limit_rss,
- reason: out_of_range_description(current_rss, hard_limit_rss, soft_limit_rss)
- )
+ current_rss: @current_rss,
+ soft_limit_rss: @soft_limit_rss,
+ hard_limit_rss: @hard_limit_rss,
+ reason: reason,
+ running_jobs: running_jobs)
end
- def out_of_range_description(rss, hard_limit, soft_limit)
+ def running_jobs
+ jobs = []
+ Gitlab::SidekiqDaemon::Monitor.instance.jobs_mutex.synchronize do
+ jobs = Gitlab::SidekiqDaemon::Monitor.instance.jobs.map do |jid, job|
+ {
+ jid: jid,
+ worker_class: job[:worker_class].name
+ }
+ end
+ end
+
+ jobs
+ end
+
+ def out_of_range_description(rss, hard_limit, soft_limit, deadline_exceeded)
if rss > hard_limit
"current_rss(#{rss}) > hard_limit_rss(#{hard_limit})"
- else
+ elsif deadline_exceeded
"current_rss(#{rss}) > soft_limit_rss(#{soft_limit}) longer than GRACE_BALLOON_SECONDS(#{GRACE_BALLOON_SECONDS})"
+ else
+ "current_rss(#{rss}) > soft_limit_rss(#{soft_limit})"
end
end
diff --git a/lib/gitlab/sidekiq_logging/structured_logger.rb b/lib/gitlab/sidekiq_logging/structured_logger.rb
index 6eb39981ef4..7ce3f6b5ccb 100644
--- a/lib/gitlab/sidekiq_logging/structured_logger.rb
+++ b/lib/gitlab/sidekiq_logging/structured_logger.rb
@@ -81,12 +81,6 @@ module Gitlab
payload['job_status'] = 'fail'
Gitlab::ExceptionLogFormatter.format!(job_exception, payload)
-
- # Deprecated fields for compatibility
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/364241
- payload['error_class'] = payload['exception.class']
- payload['error_message'] = payload['exception.message']
- payload['error_backtrace'] = payload['exception.backtrace']
else
payload['message'] = "#{message}: done: #{payload['duration_s']} sec"
payload['job_status'] = 'done'
diff --git a/lib/gitlab/sidekiq_middleware/server_metrics.rb b/lib/gitlab/sidekiq_middleware/server_metrics.rb
index dc5481289da..ea2b405c934 100644
--- a/lib/gitlab/sidekiq_middleware/server_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/server_metrics.rb
@@ -31,6 +31,7 @@ module Gitlab
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_jobs_interrupted_total: ::Gitlab::Metrics.counter(:sidekiq_jobs_interrupted_total, 'Sidekiq jobs interrupted'),
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),
@@ -89,6 +90,10 @@ module Gitlab
@metrics[:sidekiq_jobs_retried_total].increment(labels, 1)
end
+ if job['interrupted_count'].present?
+ @metrics[:sidekiq_jobs_interrupted_total].increment(labels, 1)
+ end
+
job_succeeded = false
monotonic_time_start = Gitlab::Metrics::System.monotonic_time
job_thread_cputime_start = get_thread_cputime
diff --git a/lib/gitlab/signed_commit.rb b/lib/gitlab/signed_commit.rb
index 7a154978938..410e71f51a1 100644
--- a/lib/gitlab/signed_commit.rb
+++ b/lib/gitlab/signed_commit.rb
@@ -18,7 +18,18 @@ module Gitlab
end
def signature
- return unless @commit.has_signature?
+ return @signature if @signature
+
+ cached_signature = lazy_signature&.itself
+
+ return @signature = cached_signature if cached_signature.present?
+
+ @signature = create_cached_signature!
+ end
+
+ def update_signature!(cached_signature)
+ cached_signature.update!(attributes)
+ @signature = cached_signature
end
def signature_text
@@ -32,5 +43,27 @@ module Gitlab
@signature_data.itself ? @signature_data[1] : nil
end
end
+
+ private
+
+ def signature_class
+ raise NotImplementedError, '`signature_class` must be implmented by subclass`'
+ end
+
+ def lazy_signature
+ BatchLoader.for(@commit.sha).batch do |shas, loader|
+ signature_class.by_commit_sha(shas).each do |signature|
+ loader.call(signature.commit_sha, signature)
+ end
+ end
+ end
+
+ def create_cached_signature!
+ return if attributes.nil?
+
+ return signature_class.new(attributes) if Gitlab::Database.read_only?
+
+ signature_class.safe_create!(attributes)
+ end
end
end
diff --git a/lib/gitlab/tracking.rb b/lib/gitlab/tracking.rb
index 0e7812d08b8..04745bafe7c 100644
--- a/lib/gitlab/tracking.rb
+++ b/lib/gitlab/tracking.rb
@@ -4,13 +4,13 @@ module Gitlab
module Tracking
class << self
def enabled?
- snowplow.enabled?
+ tracker.enabled?
end
def event(category, action, label: nil, property: nil, value: nil, context: [], project: nil, user: nil, namespace: nil, **extra) # rubocop:disable Metrics/ParameterLists
contexts = [Tracking::StandardContext.new(project: project, user: user, namespace: namespace, **extra).to_context, *context]
- snowplow.event(category, action, label: label, property: property, value: value, context: contexts)
+ tracker.event(category, action, label: label, property: property, value: value, context: contexts)
rescue StandardError => error
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error, snowplow_category: category, snowplow_action: action)
end
@@ -31,25 +31,27 @@ module Gitlab
end
def options(group)
- snowplow.options(group)
+ tracker.options(group)
end
def collector_hostname
- snowplow.hostname
+ tracker.hostname
end
def snowplow_micro_enabled?
- Rails.env.development? && Gitlab::Utils.to_boolean(ENV['SNOWPLOW_MICRO_ENABLE'])
+ Rails.env.development? && Gitlab.config.snowplow_micro.enabled
+ rescue Settingslogic::MissingSetting
+ Gitlab::Utils.to_boolean(ENV['SNOWPLOW_MICRO_ENABLE'])
end
private
- def snowplow
- @snowplow ||= if snowplow_micro_enabled?
- Gitlab::Tracking::Destinations::SnowplowMicro.new
- else
- Gitlab::Tracking::Destinations::Snowplow.new
- end
+ def tracker
+ @tracker ||= if snowplow_micro_enabled?
+ Gitlab::Tracking::Destinations::SnowplowMicro.new
+ else
+ Gitlab::Tracking::Destinations::Snowplow.new
+ end
end
end
end
diff --git a/lib/gitlab/tracking/destinations/snowplow_micro.rb b/lib/gitlab/tracking/destinations/snowplow_micro.rb
index 3553efba1e1..c7a95e88d0b 100644
--- a/lib/gitlab/tracking/destinations/snowplow_micro.rb
+++ b/lib/gitlab/tracking/destinations/snowplow_micro.rb
@@ -30,8 +30,9 @@ module Gitlab
def uri
strong_memoize(:snowplow_uri) do
- uri = URI(ENV['SNOWPLOW_MICRO_URI'] || DEFAULT_URI)
- uri = URI("http://#{ENV['SNOWPLOW_MICRO_URI']}") unless %w[http https].include?(uri.scheme)
+ base = base_uri
+ uri = URI(base)
+ uri = URI("http://#{base}") unless %w[http https].include?(uri.scheme)
uri
end
end
@@ -47,6 +48,14 @@ module Gitlab
def protocol
uri.scheme
end
+
+ def base_uri
+ url = Gitlab.config.snowplow_micro.address
+ scheme = Gitlab.config.gitlab.https ? 'https' : 'http'
+ "#{scheme}://#{url}"
+ rescue Settingslogic::MissingSetting
+ ENV['SNOWPLOW_MICRO_URI'] || DEFAULT_URI
+ end
end
end
end
diff --git a/lib/gitlab/tracking/standard_context.rb b/lib/gitlab/tracking/standard_context.rb
index 05ddc7e26cc..50467de44b8 100644
--- a/lib/gitlab/tracking/standard_context.rb
+++ b/lib/gitlab/tracking/standard_context.rb
@@ -7,11 +7,9 @@ module Gitlab
GITLAB_RAILS_SOURCE = 'gitlab-rails'
def initialize(namespace: nil, project: nil, user: nil, **extra)
- if Feature.enabled?(:standard_context_type_check)
- check_argument_type(:namespace, namespace, [Namespace])
- check_argument_type(:project, project, [Project, Integer])
- check_argument_type(:user, user, [User, DeployToken])
- end
+ check_argument_type(:namespace, namespace, [Namespace])
+ check_argument_type(:project, project, [Project, Integer])
+ check_argument_type(:user, user, [User, DeployToken])
@namespace = namespace
@plan = namespace&.actual_plan_name
diff --git a/lib/gitlab/tree_summary.rb b/lib/gitlab/tree_summary.rb
index 85f0ba1fd25..72df8b423df 100644
--- a/lib/gitlab/tree_summary.rb
+++ b/lib/gitlab/tree_summary.rb
@@ -8,10 +8,7 @@ module Gitlab
CACHE_EXPIRE_IN = 1.hour
MAX_OFFSET = 2**31
- attr_reader :commit, :project, :path, :offset, :limit, :user
-
- attr_reader :resolved_commits
- private :resolved_commits
+ attr_reader :commit, :project, :path, :offset, :limit, :user, :resolved_commits
def initialize(commit, project, user, params = {})
@commit = commit
@@ -34,44 +31,37 @@ module Gitlab
#
# - An Array of Hashes containing the following keys:
# - file_name: The full path of the tree entry
- # - type: One of :blob, :tree, or :submodule
# - commit: The last ::Commit to touch this entry in the tree
# - commit_path: URI of the commit in the web interface
- # - An Array of the unique ::Commit objects in the first value
+ # - commit_title_html: Rendered commit title
def summarize
- summary = contents
- .tap { |summary| fill_last_commits!(summary) }
-
- [summary, commits]
- end
-
- def fetch_logs
- logs, _ = summarize
+ commits_hsh = fetch_last_cached_commits_list
+ prerender_commit_full_titles!(commits_hsh.values)
- new_offset = next_offset if more?
+ commits_hsh.map do |path_key, commit|
+ commit = cache_commit(commit)
- [logs.as_json, new_offset]
+ {
+ file_name: File.basename(path_key).force_encoding(Encoding::UTF_8),
+ commit: commit,
+ commit_path: commit_path(commit),
+ commit_title_html: markdown_field(commit, :full_title)
+ }
+ end
end
- # Does the tree contain more entries after the given offset + limit?
- def more?
- all_contents[next_offset].present?
- end
+ def fetch_logs
+ logs = summarize
- # The offset of the next batch of tree entries. If more? returns false, this
- # batch will be empty
- def next_offset
- [all_contents.size + 1, offset + limit].min
+ [logs.first(limit).as_json, next_offset(logs.size)]
end
private
- def contents
- all_contents[offset, limit] || []
- end
+ def next_offset(entries_count)
+ return if entries_count <= limit
- def commits
- resolved_commits.values
+ offset + limit
end
def repository
@@ -83,32 +73,12 @@ module Gitlab
File.join(*[path, ""]) if path
end
- def entry_path(entry)
- File.join(*[path, entry[:file_name]].compact).force_encoding(Encoding::ASCII_8BIT)
- end
-
- def fill_last_commits!(entries)
- commits_hsh = fetch_last_cached_commits_list
- prerender_commit_full_titles!(commits_hsh.values)
-
- entries.each do |entry|
- path_key = entry_path(entry)
- commit = cache_commit(commits_hsh[path_key])
-
- if commit
- entry[:commit] = commit
- entry[:commit_path] = commit_path(commit)
- entry[:commit_title_html] = markdown_field(commit, :full_title)
- end
- end
- end
-
def fetch_last_cached_commits_list
- cache_key = ['projects', project.id, 'last_commits', commit.id, ensured_path, offset, limit]
+ cache_key = ['projects', project.id, 'last_commits', commit.id, ensured_path, offset, limit + 1]
commits = Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRE_IN) do
repository
- .list_last_commits_for_tree(commit.id, ensured_path, offset: offset, limit: limit, literal_pathspec: true)
+ .list_last_commits_for_tree(commit.id, ensured_path, offset: offset, limit: limit + 1, literal_pathspec: true)
.transform_values! { |commit| commit_to_hash(commit) }
end
@@ -131,26 +101,6 @@ module Gitlab
Gitlab::Routing.url_helpers.project_commit_path(project, commit)
end
- def all_contents
- strong_memoize(:all_contents) { cached_contents }
- end
-
- def cached_contents
- cache_key = ['projects', project.id, 'content', commit.id, path]
-
- Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRE_IN) do
- [
- *tree.trees,
- *tree.blobs,
- *tree.submodules
- ].map { |entry| { file_name: entry.name, type: entry.type } }
- end
- end
-
- def tree
- strong_memoize(:tree) { repository.tree(commit.id, path) }
- end
-
def prerender_commit_full_titles!(commits)
# Preload commit authors as they are used in rendering
commits.each(&:lazy_author)
diff --git a/lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric.rb b/lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric.rb
deleted file mode 100644
index 9da30db05dd..00000000000
--- a/lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Usage
- module Metrics
- module Instrumentations
- class UniqueActiveUsersMetric < DatabaseMetric
- operation :count
- relation { ::User.active }
-
- metric_options do
- {
- batch_size: 10_000
- }
- end
-
- def time_constraints
- case time_frame
- when '28d'
- monthly_time_range_db_params(column: :last_activity_on)
- else
- super
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/usage/service_ping/instrumented_payload.rb b/lib/gitlab/usage/service_ping/instrumented_payload.rb
index 6cc67321ba1..3aa6789a010 100644
--- a/lib/gitlab/usage/service_ping/instrumented_payload.rb
+++ b/lib/gitlab/usage/service_ping/instrumented_payload.rb
@@ -34,6 +34,13 @@ module Gitlab
return {} unless definition.present?
Gitlab::Usage::Metric.new(definition).method(output_method).call
+ rescue StandardError => error
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ metric_fallback(key_path)
+ end
+
+ def metric_fallback(key_path)
+ ::Gitlab::Usage::Metrics::KeyPathProcessor.process(key_path, ::Gitlab::Utils::UsageData::FALLBACK)
end
end
end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 604fa364aa2..6f36a09fe48 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -105,7 +105,6 @@ module Gitlab
clusters_platforms_gke: count(::Clusters::Cluster.gcp_installed.enabled),
clusters_platforms_user: count(::Clusters::Cluster.user_provided.enabled),
clusters_management_project: count(::Clusters::Cluster.with_management_project),
- clusters_integrations_elastic_stack: count(::Clusters::Integrations::ElasticStack.enabled),
clusters_integrations_prometheus: count(::Clusters::Integrations::Prometheus.enabled),
kubernetes_agents: count(::Clusters::Agent),
kubernetes_agents_with_token: distinct_count(::Clusters::AgentToken, :agent_id),
@@ -135,7 +134,6 @@ module Gitlab
projects_creating_incidents: distinct_count(Issue.incident, :project_id),
projects_imported_from_github: count(Project.where(import_type: 'github')),
projects_with_repositories_enabled: count(ProjectFeature.where('repository_access_level > ?', ProjectFeature::DISABLED)),
- projects_with_tracing_enabled: count(ProjectTracingSetting),
projects_with_error_tracking_enabled: count(::ErrorTracking::ProjectErrorTrackingSetting.where(enabled: true)),
projects_with_alerts_created: distinct_count(::AlertManagement::Alert, :project_id),
projects_with_enabled_alert_integrations: distinct_count(::AlertManagement::HttpIntegration.active, :project_id),
@@ -558,7 +556,6 @@ module Gitlab
operations_dashboard_default_dashboard: count(::User.active.with_dashboard('operations').where(time_period),
start: minimum_id(User),
finish: maximum_id(User)),
- projects_with_tracing_enabled: distinct_count(::Project.with_tracing_enabled.where(time_period), :creator_id),
projects_with_error_tracking_enabled: distinct_count(::Project.with_enabled_error_tracking.where(time_period), :creator_id),
projects_with_incidents: distinct_count(::Issue.incident.where(time_period), :project_id),
projects_with_alert_incidents: distinct_count(::Issue.incident.with_alert_management_alerts.where(time_period), :project_id),
@@ -654,8 +651,6 @@ module Gitlab
end
def with_duration
- return yield unless Feature.enabled?(:measure_service_ping_metric_collection)
-
result = nil
duration = Benchmark.realtime do
result = yield
diff --git a/lib/gitlab/usage_data_counters/editor_unique_counter.rb b/lib/gitlab/usage_data_counters/editor_unique_counter.rb
index 8feb24e49ac..5ede840661a 100644
--- a/lib/gitlab/usage_data_counters/editor_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/editor_unique_counter.rb
@@ -10,24 +10,24 @@ module Gitlab
EDIT_BY_LIVE_PREVIEW = 'g_edit_by_live_preview'
class << self
- def track_web_ide_edit_action(author:, time: Time.zone.now)
- track_unique_action(EDIT_BY_WEB_IDE, author, time)
+ def track_web_ide_edit_action(author:, time: Time.zone.now, project:)
+ track_unique_action(EDIT_BY_WEB_IDE, author, time, project)
end
def count_web_ide_edit_actions(date_from:, date_to:)
count_unique(EDIT_BY_WEB_IDE, date_from, date_to)
end
- def track_sfe_edit_action(author:, time: Time.zone.now)
- track_unique_action(EDIT_BY_SFE, author, time)
+ def track_sfe_edit_action(author:, time: Time.zone.now, project:)
+ track_unique_action(EDIT_BY_SFE, author, time, project)
end
def count_sfe_edit_actions(date_from:, date_to:)
count_unique(EDIT_BY_SFE, date_from, date_to)
end
- def track_snippet_editor_edit_action(author:, time: Time.zone.now)
- track_unique_action(EDIT_BY_SNIPPET_EDITOR, author, time)
+ def track_snippet_editor_edit_action(author:, time: Time.zone.now, project:)
+ track_unique_action(EDIT_BY_SNIPPET_EDITOR, author, time, project)
end
def count_snippet_editor_edit_actions(date_from:, date_to:)
@@ -39,15 +39,25 @@ module Gitlab
count_unique(events, date_from, date_to)
end
- def track_live_preview_edit_action(author:, time: Time.zone.now)
- track_unique_action(EDIT_BY_LIVE_PREVIEW, author, time)
+ def track_live_preview_edit_action(author:, time: Time.zone.now, project:)
+ track_unique_action(EDIT_BY_LIVE_PREVIEW, author, time, project)
end
private
- def track_unique_action(action, author, time)
+ def track_unique_action(action, author, time, project = nil)
return unless author
+ if Feature.enabled?(:route_hll_to_snowplow_phase2)
+ Gitlab::Tracking.event(
+ 'ide_edit',
+ action.to_s,
+ project: project,
+ namespace: project&.namespace,
+ user: author
+ )
+ end
+
Gitlab::UsageDataCounters::HLLRedisCounter.track_event(action, values: author.id, time: time)
end
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
index 0ace6e99c59..40581bda81b 100644
--- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
@@ -33,10 +33,24 @@ module Gitlab
pipeline_authoring
quickactions
search
- testing
user_packages
].freeze
+ CATEGORIES_COLLECTED_FROM_METRICS_DEFINITIONS = %w[
+ ci_users
+ error_tracking
+ ide_edit
+ importer
+ incident_management_alerts
+ pipeline_authoring
+ secure
+ snippets
+ source_code
+ terraform
+ testing
+ work_items
+ ].freeze
+
# Track event on entity_id
# Increment a Redis HLL counter for unique event_name and entity_id
#
@@ -114,7 +128,7 @@ module Gitlab
# - Most of the metrics have weekly aggregation. We recommend this as it generates fewer keys in Redis to store.
# - The aggregation used doesn't affect data granulation.
def unique_events_data
- categories.each_with_object({}) do |category, category_results|
+ categories_pending_migration.each_with_object({}) do |category, category_results|
events_names = events_for_category(category)
event_results = events_names.each_with_object({}) do |event, hash|
@@ -148,6 +162,14 @@ module Gitlab
private
+ def categories_pending_migration
+ if ::Feature.enabled?(:use_redis_hll_instrumentation_classes)
+ (categories - CATEGORIES_COLLECTED_FROM_METRICS_DEFINITIONS)
+ else
+ categories
+ end
+ end
+
def track(values, event_name, context: '', time: Time.zone.now)
return unless ::ServicePing::ServicePingSettings.enabled?
diff --git a/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
index 083de402175..9d463e11772 100644
--- a/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
@@ -149,6 +149,19 @@ module Gitlab
Gitlab::UsageDataCounters::HLLRedisCounter.track_event(action, values: author.id)
end
+
+ def track_snowplow_action(action, author, project)
+ return unless Feature.enabled?(:route_hll_to_snowplow_phase2, project&.namespace)
+ return unless author
+
+ Gitlab::Tracking.event(
+ ISSUE_CATEGORY,
+ action.to_s,
+ project: project,
+ namespace: project&.namespace,
+ user: author
+ )
+ end
end
end
end
diff --git a/lib/gitlab/usage_data_counters/known_events/analytics.yml b/lib/gitlab/usage_data_counters/known_events/analytics.yml
index 5a1e7f03278..76c97a974d7 100644
--- a/lib/gitlab/usage_data_counters/known_events/analytics.yml
+++ b/lib/gitlab/usage_data_counters/known_events/analytics.yml
@@ -78,3 +78,31 @@
category: analytics
redis_slot: analytics
aggregation: weekly
+- name: p_analytics_ci_cd_time_to_restore_service
+ category: analytics
+ redis_slot: analytics
+ aggregation: weekly
+- name: p_analytics_ci_cd_change_failure_rate
+ category: analytics
+ redis_slot: analytics
+ aggregation: weekly
+- name: g_analytics_ci_cd_release_statistics
+ category: analytics
+ redis_slot: analytics
+ aggregation: weekly
+- name: g_analytics_ci_cd_deployment_frequency
+ category: analytics
+ redis_slot: analytics
+ aggregation: weekly
+- name: g_analytics_ci_cd_lead_time
+ category: analytics
+ redis_slot: analytics
+ aggregation: weekly
+- name: g_analytics_ci_cd_time_to_restore_service
+ category: analytics
+ redis_slot: analytics
+ aggregation: weekly
+- name: g_analytics_ci_cd_change_failure_rate
+ category: analytics
+ redis_slot: analytics
+ aggregation: weekly
diff --git a/lib/gitlab/usage_data_counters/known_events/ci_users.yml b/lib/gitlab/usage_data_counters/known_events/ci_users.yml
index 5159dcf62ab..b012d61eef5 100644
--- a/lib/gitlab/usage_data_counters/known_events/ci_users.yml
+++ b/lib/gitlab/usage_data_counters/known_events/ci_users.yml
@@ -3,3 +3,8 @@
redis_slot: ci_users
aggregation: weekly
feature_flag:
+- name: ci_users_executing_verify_environment_job
+ category: ci_users
+ redis_slot: ci_users
+ aggregation: weekly
+ feature_flag:
diff --git a/lib/gitlab/usage_data_counters/known_events/common.yml b/lib/gitlab/usage_data_counters/known_events/common.yml
index 0dcbaf59c9c..88c9f44c165 100644
--- a/lib/gitlab/usage_data_counters/known_events/common.yml
+++ b/lib/gitlab/usage_data_counters/known_events/common.yml
@@ -157,34 +157,6 @@
category: testing
redis_slot: testing
aggregation: weekly
-- name: i_testing_metrics_report_widget_total
- category: testing
- redis_slot: testing
- aggregation: weekly
-- name: i_testing_group_code_coverage_visit_total
- category: testing
- redis_slot: testing
- aggregation: weekly
-- name: i_testing_full_code_quality_report_total
- category: testing
- redis_slot: testing
- aggregation: weekly
-- name: i_testing_web_performance_widget_total
- category: testing
- redis_slot: testing
- aggregation: weekly
-- name: i_testing_group_code_coverage_project_click_total
- category: testing
- redis_slot: testing
- aggregation: weekly
-- name: i_testing_load_performance_widget_total
- category: testing
- redis_slot: testing
- aggregation: weekly
-- name: i_testing_metrics_report_artifact_uploaders
- category: testing
- redis_slot: testing
- aggregation: weekly
- name: i_testing_summary_widget_total
category: testing
redis_slot: testing
@@ -390,3 +362,8 @@
category: growth
redis_slot: users
aggregation: weekly
+# Manage
+- name: unique_active_user
+ category: manage
+ aggregation: weekly
+ expiry: 42
diff --git a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
index 9c0f8fe9a80..fbb03a31a6f 100644
--- a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
@@ -76,8 +76,19 @@ module Gitlab
track_unique_action_by_user(MR_REOPEN_ACTION, user)
end
- def track_approve_mr_action(user:)
+ def track_approve_mr_action(user:, merge_request:)
track_unique_action_by_user(MR_APPROVE_ACTION, user)
+
+ project = merge_request.target_project
+ return unless Feature.enabled?(:route_hll_to_snowplow_phase2, project.namespace)
+
+ Gitlab::Tracking.event(
+ 'merge_requests',
+ MR_APPROVE_ACTION,
+ project: project,
+ namespace: project.namespace,
+ user: user
+ )
end
def track_unapprove_mr_action(user:)
diff --git a/lib/gitlab/usage_data_counters/work_item_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/work_item_activity_unique_counter.rb
index 6f5300405c7..51bca8b51fe 100644
--- a/lib/gitlab/usage_data_counters/work_item_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/work_item_activity_unique_counter.rb
@@ -26,3 +26,7 @@ module Gitlab
end
end
end
+
+# rubocop:disable Layout/LineLength
+Gitlab::UsageDataCounters::WorkItemActivityUniqueCounter.prepend_mod_with('Gitlab::UsageDataCounters::WorkItemActivityUniqueCounter')
+# rubocop:enable Layout/LineLength
diff --git a/lib/gitlab/version_info.rb b/lib/gitlab/version_info.rb
index aa6d5310161..f967a12b959 100644
--- a/lib/gitlab/version_info.rb
+++ b/lib/gitlab/version_info.rb
@@ -6,20 +6,27 @@ module Gitlab
attr_reader :major, :minor, :patch
- def self.parse(str)
- if str && m = str.match(/(\d+)\.(\d+)\.(\d+)/)
- VersionInfo.new(m[1].to_i, m[2].to_i, m[3].to_i)
+ VERSION_REGEX = /(\d+)\.(\d+)\.(\d+)/.freeze
+
+ def self.parse(str, parse_suffix: false)
+ if str.is_a?(self.class)
+ str
+ elsif str && m = str.match(VERSION_REGEX)
+ VersionInfo.new(m[1].to_i, m[2].to_i, m[3].to_i, parse_suffix ? m.post_match : nil)
else
VersionInfo.new
end
end
- def initialize(major = 0, minor = 0, patch = 0)
+ def initialize(major = 0, minor = 0, patch = 0, suffix = nil)
@major = major
@minor = minor
@patch = patch
+ @suffix_s = suffix.to_s
end
+ # rubocop:disable Metrics/CyclomaticComplexity
+ # rubocop:disable Metrics/PerceivedComplexity
def <=>(other)
return unless other.is_a? VersionInfo
return unless valid? && other.valid?
@@ -36,21 +43,49 @@ module Gitlab
1
elsif @patch < other.patch
-1
+ elsif @suffix_s.empty? && other.suffix.present?
+ 1
+ elsif other.suffix.empty? && @suffix_s.present?
+ -1
else
- 0
+ suffix <=> other.suffix
end
end
+ # rubocop:enable Metrics/CyclomaticComplexity
+ # rubocop:enable Metrics/PerceivedComplexity
def to_s
if valid?
- "%d.%d.%d" % [@major, @minor, @patch]
+ "%d.%d.%d%s" % [@major, @minor, @patch, @suffix_s]
else
- "Unknown"
+ 'Unknown'
end
end
+ def suffix
+ @suffix ||= @suffix_s.strip.gsub('-', '.pre.').scan(/\d+|[a-z]+/i).map do |s|
+ /^\d+$/ =~ s ? s.to_i : s
+ end.freeze
+ end
+
def valid?
@major >= 0 && @minor >= 0 && @patch >= 0 && @major + @minor + @patch > 0
end
+
+ def hash
+ [self.class, to_s].hash
+ end
+
+ def eql?(other)
+ (self <=> other) == 0
+ end
+
+ def same_minor_version?(other)
+ @major == other.major && @minor == other.minor
+ end
+
+ def without_patch
+ self.class.new(@major, @minor, 0)
+ end
end
end
diff --git a/lib/gitlab/wiki_pages/front_matter_parser.rb b/lib/gitlab/wiki_pages/front_matter_parser.rb
index ee30fa907f4..071b0dde619 100644
--- a/lib/gitlab/wiki_pages/front_matter_parser.rb
+++ b/lib/gitlab/wiki_pages/front_matter_parser.rb
@@ -3,6 +3,8 @@
module Gitlab
module WikiPages
class FrontMatterParser
+ FEATURE_FLAG = :wiki_front_matter
+
# We limit the maximum length of text we are prepared to parse as YAML, to
# avoid exploitations and attempts to consume memory and CPU. We allow for:
# - a title line
@@ -28,12 +30,18 @@ module Gitlab
end
# @param [String] wiki_content
- def initialize(wiki_content)
+ # @param [FeatureGate] feature_gate The scope for feature availability
+ def initialize(wiki_content, feature_gate)
@wiki_content = wiki_content
+ @feature_gate = feature_gate
+ end
+
+ def self.enabled?(gate = nil)
+ Feature.enabled?(FEATURE_FLAG, gate)
end
def parse
- return empty_result unless wiki_content.present?
+ return empty_result unless enabled? && wiki_content.present?
return empty_result(block.error) unless block.valid?
Result.new(front_matter: block.data, content: strip_front_matter_block)
@@ -86,12 +94,16 @@ module Gitlab
private
- attr_reader :wiki_content
+ attr_reader :wiki_content, :feature_gate
def empty_result(reason = nil, error = nil)
Result.new(content: wiki_content, reason: reason, error: error)
end
+ def enabled?
+ self.class.enabled?(feature_gate)
+ end
+
def block
@block ||= parse_front_matter_block
end
diff --git a/lib/gitlab/x509/certificate.rb b/lib/gitlab/x509/certificate.rb
index 752f3c6b004..98688f504eb 100644
--- a/lib/gitlab/x509/certificate.rb
+++ b/lib/gitlab/x509/certificate.rb
@@ -23,6 +23,18 @@ module Gitlab
include ::Gitlab::Utils::StrongMemoize
end
+ def self.default_cert_dir
+ strong_memoize(:default_cert_dir) do
+ ENV.fetch('SSL_CERT_DIR', OpenSSL::X509::DEFAULT_CERT_DIR)
+ end
+ end
+
+ def self.default_cert_file
+ strong_memoize(:default_cert_file) do
+ ENV.fetch('SSL_CERT_FILE', OpenSSL::X509::DEFAULT_CERT_FILE)
+ end
+ end
+
def self.from_strings(key_string, cert_string, ca_certs_string = nil)
key = OpenSSL::PKey::RSA.new(key_string)
cert = OpenSSL::X509::Certificate.new(cert_string)
@@ -39,10 +51,10 @@ module Gitlab
# Returns all top-level, readable files in the default CA cert directory
def self.ca_certs_paths
- cert_paths = Dir["#{OpenSSL::X509::DEFAULT_CERT_DIR}/*"].select do |path|
+ cert_paths = Dir["#{default_cert_dir}/*"].select do |path|
!File.directory?(path) && File.readable?(path)
end
- cert_paths << OpenSSL::X509::DEFAULT_CERT_FILE if File.exist? OpenSSL::X509::DEFAULT_CERT_FILE
+ cert_paths << default_cert_file if File.exist? default_cert_file
cert_paths
end
@@ -61,6 +73,11 @@ module Gitlab
clear_memoization(:ca_certs_bundle)
end
+ def self.reset_default_cert_paths
+ clear_memoization(:default_cert_dir)
+ clear_memoization(:default_cert_file)
+ end
+
# Returns an array of OpenSSL::X509::Certificate objects, empty array if none found
#
# Ruby OpenSSL::X509::Certificate.new will only load the first
diff --git a/lib/gitlab/x509/commit.rb b/lib/gitlab/x509/commit.rb
index c7f4b7cbdf5..3636e776a44 100644
--- a/lib/gitlab/x509/commit.rb
+++ b/lib/gitlab/x509/commit.rb
@@ -5,30 +5,10 @@ require 'digest'
module Gitlab
module X509
class Commit < Gitlab::SignedCommit
- def signature
- super
-
- return @signature if @signature
-
- cached_signature = lazy_signature&.itself
- return @signature = cached_signature if cached_signature.present?
-
- @signature = create_cached_signature!
- end
-
- def update_signature!(cached_signature)
- cached_signature.update!(attributes)
- @signature = cached_signature
- end
-
private
- def lazy_signature
- BatchLoader.for(@commit.sha).batch do |shas, loader|
- CommitSignatures::X509CommitSignature.by_commit_sha(shas).each do |signature|
- loader.call(signature.commit_sha, signature)
- end
- end
+ def signature_class
+ CommitSignatures::X509CommitSignature
end
def attributes
@@ -45,14 +25,6 @@ module Gitlab
verification_status: signature.verification_status
}
end
-
- def create_cached_signature!
- return if attributes.nil?
-
- return CommitSignatures::X509CommitSignature.new(attributes) if Gitlab::Database.read_only?
-
- CommitSignatures::X509CommitSignature.safe_create!(attributes)
- end
end
end
end
diff --git a/lib/gitlab/x509/signature.rb b/lib/gitlab/x509/signature.rb
index a6761e211fa..8acbfc144e9 100644
--- a/lib/gitlab/x509/signature.rb
+++ b/lib/gitlab/x509/signature.rb
@@ -59,7 +59,7 @@ module Gitlab
if Feature.enabled?(:x509_forced_cert_loading, type: :ops)
# Forcibly load the default cert file because the OpenSSL library seemingly ignores it
- store.add_file(OpenSSL::X509::DEFAULT_CERT_FILE) if File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE)
+ store.add_file(Gitlab::X509::Certificate.default_cert_file) if File.exist?(Gitlab::X509::Certificate.default_cert_file) # rubocop:disable Layout/LineLength
end
# valid_signing_time? checks the time attributes already
diff --git a/lib/google_api/cloud_platform/client.rb b/lib/google_api/cloud_platform/client.rb
index 360c9a6c52f..c46ca2783bf 100644
--- a/lib/google_api/cloud_platform/client.rb
+++ b/lib/google_api/cloud_platform/client.rb
@@ -8,6 +8,7 @@ require 'google/apis/cloudbilling_v1'
require 'google/apis/cloudresourcemanager_v1'
require 'google/apis/iam_v1'
require 'google/apis/serviceusage_v1'
+require 'google/apis/sqladmin_v1beta4'
module GoogleApi
module CloudPlatform
@@ -152,6 +153,22 @@ module GoogleApi
Gitlab::HTTP.post(uri, body: { 'token' => access_token })
end
+ def create_cloudsql_database(gcp_project_id, instance_name, database_name)
+ database = Google::Apis::SqladminV1beta4::Database.new(name: database_name)
+ sql_admin_service.insert_database(gcp_project_id, instance_name, database)
+ end
+
+ def create_cloudsql_user(gcp_project_id, instance_name, username, password)
+ user = Google::Apis::SqladminV1beta4::User.new
+ user.name = username
+ user.password = password
+ sql_admin_service.insert_user(gcp_project_id, instance_name, user)
+ end
+
+ def get_cloudsql_instance(gcp_project_id, instance_name)
+ sql_admin_service.get_instance(gcp_project_id, instance_name)
+ end
+
private
def enable_service(gcp_project_id, service_name)
@@ -219,6 +236,10 @@ module GoogleApi
def cloud_resource_manager_service
@gpc_service ||= Google::Apis::CloudresourcemanagerV1::CloudResourceManagerService.new.tap { |s| s.authorization = access_token }
end
+
+ def sql_admin_service
+ @sql_admin_service ||= Google::Apis::SqladminV1beta4::SQLAdminService.new.tap { |s| s.authorization = access_token }
+ end
end
end
end
diff --git a/lib/initializer_connections.rb b/lib/initializer_connections.rb
new file mode 100644
index 00000000000..c8a6bb6c511
--- /dev/null
+++ b/lib/initializer_connections.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module InitializerConnections
+ # Prevents any database connections within the block
+ # by using an empty connection handler
+ # rubocop:disable Database/MultipleDatabases
+ def self.with_disabled_database_connections
+ return yield if Gitlab::Utils.to_boolean(ENV['SKIP_RAISE_ON_INITIALIZE_CONNECTIONS'])
+
+ original_handler = ActiveRecord::Base.connection_handler
+
+ dummy_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
+ ActiveRecord::Base.connection_handler = dummy_handler
+
+ yield
+
+ if dummy_handler&.connection_pool_names&.present?
+ raise "Unxpected connection_pools (#{dummy_handler.connection_pool_names}) ! Call `connects_to` before this block"
+ end
+ rescue ActiveRecord::ConnectionNotEstablished
+ message = "Database connection should not be called during initializers. Read more at https://docs.gitlab.com/ee/development/rails_initializers.html#database-connections-in-initializers"
+
+ raise message
+ ensure
+ ActiveRecord::Base.connection_handler = original_handler
+ dummy_handler&.clear_all_connections!
+ end
+ # rubocop:enable Database/MultipleDatabases
+end
diff --git a/lib/learn_gitlab/onboarding.rb b/lib/learn_gitlab/onboarding.rb
index 42415aacbee..54af01a21fe 100644
--- a/lib/learn_gitlab/onboarding.rb
+++ b/lib/learn_gitlab/onboarding.rb
@@ -3,6 +3,7 @@
module LearnGitlab
class Onboarding
include Gitlab::Utils::StrongMemoize
+ include Gitlab::Experiment::Dsl
ACTION_ISSUE_IDS = {
pipeline_created: 7,
@@ -15,12 +16,12 @@ module LearnGitlab
:issue_created,
:git_write,
:merge_request_created,
- :user_added,
- :security_scan_enabled
+ :user_added
].freeze
- def initialize(namespace)
+ def initialize(namespace, current_user = nil)
@namespace = namespace
+ @current_user = current_user
end
def completed_percentage
@@ -49,9 +50,20 @@ module LearnGitlab
end
def tracked_actions
- ACTION_ISSUE_IDS.keys + ACTION_PATHS
+ ACTION_ISSUE_IDS.keys + ACTION_PATHS + deploy_section_tracked_actions
end
- attr_reader :namespace
+ def deploy_section_tracked_actions
+ experiment(:security_actions_continuous_onboarding,
+ namespace: namespace,
+ user: current_user,
+ sticky_to: current_user
+ ) do |e|
+ e.control { [:security_scan_enabled] }
+ e.candidate { [:license_scanning_run, :secure_dependency_scanning_run, :secure_dast_run] }
+ end.run
+ end
+
+ attr_reader :namespace, :current_user
end
end
diff --git a/lib/sidebars/groups/menus/packages_registries_menu.rb b/lib/sidebars/groups/menus/packages_registries_menu.rb
index 4c21845ef18..fda90406e0a 100644
--- a/lib/sidebars/groups/menus/packages_registries_menu.rb
+++ b/lib/sidebars/groups/menus/packages_registries_menu.rb
@@ -54,7 +54,7 @@ module Sidebars
::Sidebars::MenuItem.new(
title: _('Harbor Registry'),
- link: group_harbor_registries_path(context.group),
+ link: group_harbor_repositories_path(context.group),
active_routes: { controller: 'groups/harbor/repositories' },
item_id: :harbor_registry
)
diff --git a/lib/sidebars/projects/menus/infrastructure_menu.rb b/lib/sidebars/projects/menus/infrastructure_menu.rb
index a98cc20d51a..1c04a7b117d 100644
--- a/lib/sidebars/projects/menus/infrastructure_menu.rb
+++ b/lib/sidebars/projects/menus/infrastructure_menu.rb
@@ -88,8 +88,14 @@ module Sidebars
::Sidebars::MenuItem.new(
title: _('Google Cloud'),
- link: project_google_cloud_index_path(context.project),
- active_routes: { controller: [:google_cloud, :service_accounts, :deployments, :gcp_regions] },
+ link: project_google_cloud_configuration_path(context.project),
+ active_routes: { controller: [
+ :configuration,
+ :service_accounts,
+ :databases,
+ :deployments,
+ :gcp_regions
+ ] },
item_id: :google_cloud
)
end
diff --git a/lib/sidebars/projects/menus/learn_gitlab_menu.rb b/lib/sidebars/projects/menus/learn_gitlab_menu.rb
index 5de70ea7d7f..d2bc2fa0681 100644
--- a/lib/sidebars/projects/menus/learn_gitlab_menu.rb
+++ b/lib/sidebars/projects/menus/learn_gitlab_menu.rb
@@ -29,7 +29,10 @@ module Sidebars
override :pill_count
def pill_count
strong_memoize(:pill_count) do
- percentage = LearnGitlab::Onboarding.new(context.project.namespace).completed_percentage
+ percentage = LearnGitlab::Onboarding.new(
+ context.project.namespace,
+ context.current_user
+ ).completed_percentage
"#{percentage}%"
end
diff --git a/lib/sidebars/projects/menus/monitor_menu.rb b/lib/sidebars/projects/menus/monitor_menu.rb
index c35bc1f5481..23e1a95c401 100644
--- a/lib/sidebars/projects/menus/monitor_menu.rb
+++ b/lib/sidebars/projects/menus/monitor_menu.rb
@@ -9,8 +9,6 @@ module Sidebars
return false unless context.project.feature_available?(:operations, context.current_user)
add_item(metrics_dashboard_menu_item)
- add_item(logs_menu_item)
- add_item(tracing_menu_item)
add_item(error_tracking_menu_item)
add_item(alert_management_menu_item)
add_item(incidents_menu_item)
@@ -57,36 +55,6 @@ module Sidebars
)
end
- def logs_menu_item
- if !Feature.enabled?(:monitor_logging, context.project) ||
- !can?(context.current_user, :read_environment, context.project) ||
- !can?(context.current_user, :read_pod_logs, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :logs)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Logs'),
- link: project_logs_path(context.project),
- active_routes: { path: 'logs#index' },
- item_id: :logs
- )
- end
-
- def tracing_menu_item
- if !Feature.enabled?(:monitor_tracing, context.project) ||
- !can?(context.current_user, :read_environment, context.project) ||
- !can?(context.current_user, :admin_project, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :tracing)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Tracing'),
- link: project_tracing_path(context.project),
- active_routes: { path: 'tracings#show' },
- item_id: :tracing
- )
- end
-
def error_tracking_menu_item
unless can?(context.current_user, :read_sentry_issue, context.project)
return ::Sidebars::NilMenuItem.new(item_id: :error_tracking)
diff --git a/lib/sidebars/projects/menus/packages_registries_menu.rb b/lib/sidebars/projects/menus/packages_registries_menu.rb
index d82a02a342f..914368e6fec 100644
--- a/lib/sidebars/projects/menus/packages_registries_menu.rb
+++ b/lib/sidebars/projects/menus/packages_registries_menu.rb
@@ -70,8 +70,8 @@ module Sidebars
::Sidebars::MenuItem.new(
title: _('Harbor Registry'),
- link: project_harbor_registry_index_path(context.project),
- active_routes: { controller: 'projects/harbor/repositories' },
+ link: project_harbor_repositories_path(context.project),
+ active_routes: { controller: :harbor_registry },
item_id: :harbor_registry
)
end
diff --git a/lib/system_check/app/redis_version_check.rb b/lib/system_check/app/redis_version_check.rb
index d907c041ad8..a6ff2405390 100644
--- a/lib/system_check/app/redis_version_check.rb
+++ b/lib/system_check/app/redis_version_check.rb
@@ -8,7 +8,7 @@ module SystemCheck
# Redis 5.x will be deprecated
# https://gitlab.com/gitlab-org/gitlab/-/issues/331468
MIN_REDIS_VERSION = '5.0.0'
- RECOMMENDED_REDIS_VERSION = '5.0.0'
+ RECOMMENDED_REDIS_VERSION = "6.0.0"
set_name "Redis version >= #{RECOMMENDED_REDIS_VERSION}?"
@custom_error_message = ''
diff --git a/lib/tasks/contracts.rake b/lib/tasks/contracts.rake
deleted file mode 100644
index 6bb7f30ad57..00000000000
--- a/lib/tasks/contracts.rake
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-return if Rails.env.production?
-
-require 'pact/tasks/verification_task'
-
-contracts = File.expand_path('../../spec/contracts', __dir__)
-provider = File.expand_path('provider', contracts)
-
-# rubocop:disable Rails/RakeEnvironment
-namespace :contracts do
- namespace :mr do
- Pact::VerificationTask.new(:diffs_batch) do |pact|
- pact.uri(
- "#{contracts}/contracts/project/merge_request/show/mergerequest#show-merge_request_diffs_batch_endpoint.json",
- pact_helper: "#{provider}/pact_helpers/project/merge_request/diffs_batch_helper.rb"
- )
- end
-
- Pact::VerificationTask.new(:diffs_metadata) do |pact|
- pact.uri(
- "#{contracts}/contracts/project/merge_request/show/" \
- "mergerequest#show-merge_request_diffs_metadata_endpoint.json",
- pact_helper: "#{provider}/pact_helpers/project/merge_request/diffs_metadata_helper.rb"
- )
- end
-
- Pact::VerificationTask.new(:discussions) do |pact|
- pact.uri(
- "#{contracts}/contracts/project/merge_request/show/mergerequest#show-merge_request_discussions_endpoint.json",
- pact_helper: "#{provider}/pact_helpers/project/merge_request/discussions_helper.rb"
- )
- end
-
- desc 'Run all merge request contract tests'
- task 'test:merge_request', :contract_mr do |_t, arg|
- raise(ArgumentError, 'Merge request contract tests require contract_mr to be set') unless arg[:contract_mr]
-
- ENV['CONTRACT_MR'] = arg[:contract_mr]
- errors = %w[metadata discussions diffs].each_with_object([]) do |task, err|
- Rake::Task["contracts:mr:pact:verify:#{task}"].execute
- rescue StandardError, SystemExit
- err << "contracts:mr:pact:verify:#{task}"
- end
-
- raise StandardError, "Errors in tasks #{errors.join(', ')}" unless errors.empty?
- end
- end
-end
-# rubocop:enable Rails/RakeEnvironment
diff --git a/lib/tasks/contracts/merge_requests.rake b/lib/tasks/contracts/merge_requests.rake
new file mode 100644
index 00000000000..05ed9c30495
--- /dev/null
+++ b/lib/tasks/contracts/merge_requests.rake
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+return if Rails.env.production?
+
+require 'pact/tasks/verification_task'
+
+contracts = File.expand_path('../../../spec/contracts', __dir__)
+provider = File.expand_path('provider', contracts)
+
+# rubocop:disable Rails/RakeEnvironment
+namespace :contracts do
+ namespace :merge_requests do
+ Pact::VerificationTask.new(:diffs_batch) do |pact|
+ pact.uri(
+ "#{contracts}/contracts/project/merge_request/show/mergerequest#show-merge_request_diffs_batch_endpoint.json",
+ pact_helper: "#{provider}/pact_helpers/project/merge_request/diffs_batch_helper.rb"
+ )
+ end
+
+ Pact::VerificationTask.new(:diffs_metadata) do |pact|
+ pact.uri(
+ "#{contracts}/contracts/project/merge_request/show/" \
+ "mergerequest#show-merge_request_diffs_metadata_endpoint.json",
+ pact_helper: "#{provider}/pact_helpers/project/merge_request/diffs_metadata_helper.rb"
+ )
+ end
+
+ Pact::VerificationTask.new(:discussions) do |pact|
+ pact.uri(
+ "#{contracts}/contracts/project/merge_request/show/mergerequest#show-merge_request_discussions_endpoint.json",
+ pact_helper: "#{provider}/pact_helpers/project/merge_request/discussions_helper.rb"
+ )
+ end
+
+ desc 'Run all merge request contract tests'
+ task 'test:merge_requests', :contract_mr do |_t, arg|
+ errors = %w[diffs_batch diffs_metadata discussions].each_with_object([]) do |task, err|
+ Rake::Task["contracts:mr:pact:verify:#{task}"].execute
+ rescue StandardError, SystemExit
+ err << "contracts:merge_requests:pact:verify:#{task}"
+ end
+
+ raise StandardError, "Errors in tasks #{errors.join(', ')}" unless errors.empty?
+ end
+ end
+end
+# rubocop:enable Rails/RakeEnvironment
diff --git a/lib/tasks/contracts/pipelines.rake b/lib/tasks/contracts/pipelines.rake
new file mode 100644
index 00000000000..c018645722e
--- /dev/null
+++ b/lib/tasks/contracts/pipelines.rake
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+return if Rails.env.production?
+
+require 'pact/tasks/verification_task'
+
+contracts = File.expand_path('../../../spec/contracts', __dir__)
+provider = File.expand_path('provider', contracts)
+
+# rubocop:disable Rails/RakeEnvironment
+namespace :contracts do
+ namespace :pipelines do
+ Pact::VerificationTask.new(:get_list_project_pipelines) do |pact|
+ pact.uri(
+ "#{contracts}/contracts/project/pipeline/index/pipelines#index-get_list_project_pipelines.json",
+ pact_helper: "#{provider}/pact_helpers/project/pipeline/get_list_project_pipelines_helper.rb"
+ )
+ end
+
+ Pact::VerificationTask.new(:get_pipeline_header_data) do |pact|
+ pact.uri(
+ "#{contracts}/contracts/project/pipeline/show/pipelines#show-get_pipeline_header_data.json",
+ pact_helper: "#{provider}/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb"
+ )
+ end
+
+ desc 'Run all pipeline contract tests'
+ task 'test:pipelines', :contract_mr do |_t, arg|
+ errors = %w[get_list_project_pipelines get_pipeline_header_data].each_with_object([]) do |task, err|
+ Rake::Task["contracts:pipelines:pact:verify:#{task}"].execute
+ rescue StandardError, SystemExit
+ err << "contracts:pipelines:pact:verify:#{task}"
+ end
+
+ raise StandardError, "Errors in tasks #{errors.join(', ')}" unless errors.empty?
+ end
+ end
+end
+# rubocop:enable Rails/RakeEnvironment
diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake
index 08a11100431..48bf49ff284 100644
--- a/lib/tasks/dev.rake
+++ b/lib/tasks/dev.rake
@@ -50,6 +50,9 @@ namespace :dev do
connection.execute(cmd)
rescue ActiveRecord::NoDatabaseError
end
+
+ # Clear connections opened by this rake task too
+ ActiveRecord::Base.clear_all_connections! # rubocop:disable Database/MultipleDatabases
end
end
diff --git a/lib/tasks/gems.rake b/lib/tasks/gems.rake
new file mode 100644
index 00000000000..c6be6d9eead
--- /dev/null
+++ b/lib/tasks/gems.rake
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+namespace :gems do
+ # :nocov:
+ namespace :error_tracking_open_api do
+ desc 'Generate OpenAPI client for Error Tracking'
+ # rubocop:disable Rails/RakeEnvironment
+ task :generate do |task|
+ # Configuration
+ api_url = 'https://gitlab.com/gitlab-org/opstrace/opstrace/-/raw/main/go/pkg/errortracking/swagger.yaml'
+ gem_name = 'error_tracking_open_api'
+ module_name = 'ErrorTrackingOpenAPI' # Namespacing is not supported like `ErrorTracking::OpenAPI`
+ docker_image = 'openapitools/openapi-generator-cli:v6.0.0'
+
+ vendor_gem_dir = Pathname.new(root_directory)
+ gem_dir = vendor_gem_dir / gem_name
+
+ # Always start with a clean state.
+ rm_rf(gem_dir)
+
+ generate_gem(
+ vendor_gem_dir: vendor_gem_dir,
+ api_url: api_url,
+ gem_name: gem_name,
+ module_name: module_name,
+ docker_image: docker_image
+ )
+
+ post_process(gem_dir: gem_dir, gem_name: gem_name, task: task)
+ end
+ # rubocop:enable Rails/RakeEnvironment
+
+ def root_directory
+ File.expand_path('../../vendor/gems', __dir__)
+ end
+
+ def generate_gem(vendor_gem_dir:, api_url:, gem_name:, module_name:, docker_image:)
+ user_id = File.stat(vendor_gem_dir).uid
+
+ Kernel.system('docker', 'run',
+ "--user=#{user_id}", '--rm', "--volume=#{vendor_gem_dir}:/code", docker_image,
+ 'generate',
+ '--input-spec', api_url,
+ '--generator-name', 'ruby',
+ '--output', "/code/#{gem_name}",
+ "--additional-properties=moduleName=#{module_name}"
+ )
+ end
+
+ def post_process(gem_dir:, gem_name:, task:)
+ write_file(gem_dir / 'README.md') do |content|
+ readme_banner(task) + content
+ end
+
+ write_file(gem_dir / 'LICENSE', license)
+ write_file(gem_dir / "#{gem_name}.gemspec") do |content|
+ replace_string(content, 'Unlicense', 'MIT')
+ replace_string(content, /(\.files\s*=).*/, '\1 Dir.glob("lib/**/*")')
+ replace_string(content, /(\.test_files\s*=).*/, '\1 []')
+ end
+
+ remove_entry_secure(gem_dir / 'Gemfile')
+ remove_entry_secure(gem_dir / '.rubocop.yml')
+ remove_entry_secure(gem_dir / '.travis.yml')
+ remove_entry_secure(gem_dir / 'git_push.sh')
+ remove_entry_secure(gem_dir / 'spec')
+ remove_entry_secure(gem_dir / '.rspec')
+ end
+
+ def write_file(full_path, content = nil, &block)
+ content ||= yield(File.read(full_path))
+
+ File.write(full_path, content)
+ end
+
+ def replace_string(content, from, to)
+ raise "#{from.inspect} not found" unless content.gsub!(from, to)
+
+ content
+ end
+
+ def readme_banner(task)
+ # rubocop:disable Rails/TimeZone
+ <<~BANNER
+ # Generated by `rake #{task.name}` on #{Time.now.strftime('%Y-%m-%d')}
+
+ See https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/rake_tasks.md#update-openapi-client-for-error-tracking-feature
+
+ BANNER
+ # rubocop:enable Rails/TimeZone
+ end
+
+ def license
+ year = [2022, Date.today.year].uniq.join('-')
+
+ <<~LICENSE
+ Copyright #{year} GitLab B.V.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ LICENSE
+ end
+ end
+ # :nocov:
+end
diff --git a/lib/tasks/gitlab/bulk_add_permission.rake b/lib/tasks/gitlab/bulk_add_permission.rake
index df0c6a260a2..a903c743ea2 100644
--- a/lib/tasks/gitlab/bulk_add_permission.rake
+++ b/lib/tasks/gitlab/bulk_add_permission.rake
@@ -9,10 +9,10 @@ namespace :gitlab do
project_ids = Project.pluck(:id)
puts "Importing #{user_ids.size} users into #{project_ids.size} projects"
- ProjectMember.add_users_to_projects(project_ids, user_ids, ProjectMember::DEVELOPER)
+ ProjectMember.add_members_to_projects(project_ids, user_ids, ProjectMember::DEVELOPER)
puts "Importing #{admin_ids.size} admins into #{project_ids.size} projects"
- ProjectMember.add_users_to_projects(project_ids, admin_ids, ProjectMember::MAINTAINER)
+ ProjectMember.add_members_to_projects(project_ids, admin_ids, ProjectMember::MAINTAINER)
end
desc "GitLab | Import | Add a specific user to all projects (as a developer)"
@@ -20,7 +20,7 @@ namespace :gitlab do
user = User.find_by(email: args.email)
project_ids = Project.pluck(:id)
puts "Importing #{user.email} users into #{project_ids.size} projects"
- ProjectMember.add_users_to_projects(project_ids, Array.wrap(user.id), ProjectMember::DEVELOPER)
+ ProjectMember.add_members_to_projects(project_ids, Array.wrap(user.id), ProjectMember::DEVELOPER)
end
desc "GitLab | Import | Add all users to all groups (admin users are added as owners)"
@@ -32,8 +32,8 @@ namespace :gitlab do
puts "Importing #{user_ids.size} users into #{groups.size} groups"
puts "Importing #{admin_ids.size} admins into #{groups.size} groups"
groups.each do |group|
- group.add_users(user_ids, GroupMember::DEVELOPER)
- group.add_users(admin_ids, GroupMember::OWNER)
+ group.add_members(user_ids, GroupMember::DEVELOPER)
+ group.add_members(admin_ids, GroupMember::OWNER)
end
end
@@ -43,7 +43,7 @@ namespace :gitlab do
groups = Group.all
puts "Importing #{user.email} users into #{groups.size} groups"
groups.each do |group|
- group.add_users(Array.wrap(user.id), GroupMember::DEVELOPER)
+ group.add_members(Array.wrap(user.id), GroupMember::DEVELOPER)
end
end
end
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index a446a17dfc3..5ed54bb6921 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -94,7 +94,7 @@ namespace :gitlab do
connection = Gitlab::Database.database_base_models['main'].connection
databases_loaded << configure_database(connection)
else
- Gitlab::Database.database_base_models.each do |name, model|
+ Gitlab::Database.database_base_models_with_gitlab_shared.each do |name, model|
next unless databases_with_tasks.any? { |db_with_tasks| db_with_tasks.name == name }
databases_loaded << configure_database(model.connection, database_name: name)
@@ -367,5 +367,69 @@ namespace :gitlab do
Rake::Task['gitlab:db:execute_batched_migrations'].invoke
end
end
+
+ namespace :dictionary do
+ DB_DOCS_PATH = File.join(Rails.root, 'db', 'docs')
+
+ desc 'Generate database docs yaml'
+ task generate: :environment do
+ FileUtils.mkdir_p(DB_DOCS_PATH) unless Dir.exist?(DB_DOCS_PATH)
+
+ Rails.application.eager_load!
+
+ tables = Gitlab::Database.database_base_models.flat_map { |_, m| m.connection.tables }
+ classes = tables.to_h { |t| [t, []] }
+
+ Gitlab::Database.database_base_models.each do |_, model_class|
+ model_class
+ .descendants
+ .reject(&:abstract_class)
+ .reject { |c| c.name =~ /^(?:EE::)?Gitlab::(?:BackgroundMigration|DatabaseImporters)::/ }
+ .reject { |c| c.name =~ /^HABTM_/ }
+ .each { |c| classes[c.table_name] << c.name if classes.has_key?(c.table_name) }
+ end
+
+ version = Gem::Version.new(File.read('VERSION'))
+ milestone = version.release.segments[0..1].join('.')
+
+ tables.each do |table_name|
+ file = File.join(DB_DOCS_PATH, "#{table_name}.yml")
+
+ table_metadata = {
+ 'table_name' => table_name,
+ 'classes' => classes[table_name]&.sort&.uniq,
+ 'feature_categories' => [],
+ 'description' => nil,
+ 'introduced_by_url' => nil,
+ 'milestone' => milestone
+ }
+
+ if File.exist?(file)
+ outdated = false
+
+ existing_metadata = YAML.safe_load(File.read(file))
+
+ if existing_metadata['table_name'] != table_metadata['table_name']
+ existing_metadata['table_name'] = table_metadata['table_name']
+ outdated = true
+ end
+
+ if existing_metadata['classes'].difference(table_metadata['classes']).any?
+ existing_metadata['classes'] = table_metadata['classes']
+ outdated = true
+ end
+
+ File.write(file, existing_metadata.to_yaml) if outdated
+ else
+ File.write(file, table_metadata.to_yaml)
+ end
+ end
+ end
+
+ # Temporary disable this, see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85760#note_998452069
+ # Rake::Task['db:migrate'].enhance do
+ # Rake::Task['gitlab:db:dictionary:generate'].invoke if Rails.env.development?
+ # end
+ end
end
end
diff --git a/lib/tasks/gitlab/db/lock_writes.rake b/lib/tasks/gitlab/db/lock_writes.rake
index b57c2860fe3..3a083036781 100644
--- a/lib/tasks/gitlab/db/lock_writes.rake
+++ b/lib/tasks/gitlab/db/lock_writes.rake
@@ -11,6 +11,9 @@ namespace :gitlab do
schemas_for_connection = Gitlab::Database.gitlab_schemas_for_connection(connection)
Gitlab::Database::GitlabSchema.tables_to_schema.each do |table_name, schema_name|
+ # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/366834
+ next if schema_name == :gitlab_geo
+
if schemas_for_connection.include?(schema_name.to_sym)
drop_write_trigger(database_name, connection, table_name)
else
@@ -24,6 +27,9 @@ namespace :gitlab do
task unlock_writes: :environment do
Gitlab::Database::EachDatabase.each_database_connection do |connection, database_name|
Gitlab::Database::GitlabSchema.tables_to_schema.each do |table_name, schema_name|
+ # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/366834
+ next if schema_name == :gitlab_geo
+
drop_write_trigger(database_name, connection, table_name)
end
drop_write_trigger_function(connection)
diff --git a/lib/tasks/gitlab/graphql.rake b/lib/tasks/gitlab/graphql.rake
index b9137aa0d4c..a05b749a60e 100644
--- a/lib/tasks/gitlab/graphql.rake
+++ b/lib/tasks/gitlab/graphql.rake
@@ -15,10 +15,8 @@ namespace :gitlab do
# Also avoids pipeline failures in case developer
# dumps schema with flags disabled locally before pushing
task enable_feature_flags: :environment do
- class Feature
- def self.enabled?(*args)
- true
- end
+ def Feature.enabled?(*args)
+ true
end
end
diff --git a/lib/tasks/gitlab/web_hook.rake b/lib/tasks/gitlab/web_hook.rake
index 091743485c9..fc17c7d0177 100644
--- a/lib/tasks/gitlab/web_hook.rake
+++ b/lib/tasks/gitlab/web_hook.rake
@@ -39,7 +39,8 @@ namespace :gitlab do
web_hooks.find_each do |hook|
next unless hook.url == web_hook_url
- result = WebHooks::DestroyService.new(nil).sync_destroy(hook)
+ user = hook.parent.owners.first
+ result = WebHooks::DestroyService.new(user).execute(hook)
raise "Unable to destroy Web hook" unless result[:status] == :success
diff --git a/lib/unnested_in_filters/dsl.rb b/lib/unnested_in_filters/dsl.rb
new file mode 100644
index 00000000000..f5f358c729e
--- /dev/null
+++ b/lib/unnested_in_filters/dsl.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+# Including the `UnnestedInFilters::Dsl` module to an ActiveRecord
+# model extends the interface of the following class instances to be
+# able to use the `use_unnested_filters` method;
+#
+# - Model relation;
+# `Model.where(...).use_unnested_filters`
+# - All the association proxies
+# `project.model_association.use_unnested_filters`
+# - All the relation instances of the association
+# `project.model_association.where(...).use_unnested_filters
+#
+# Note: The interface of the model itself won't be extended as we don't
+# have a use-case for now(`Model.use_unnested_filters` won't work).
+#
+# Example usage of the API;
+#
+# relation = Vulnerabilities::Read.where(state: [1, 4])
+# .use_unnested_filters
+# .order(severity: :desc, vulnerability_id: :desc)
+#
+# relation.to_a # => Will load records by using the optimized query
+#
+# See `UnnestedInFilters::Rewriter` for the details about the optimizations applied.
+#
+# rubocop:disable Gitlab/ModuleWithInstanceVariables
+module UnnestedInFilters
+ module Dsl
+ extend ActiveSupport::Concern
+
+ MODULES_TO_EXTEND = [
+ ActiveRecord::Relation,
+ ActiveRecord::Associations::CollectionProxy,
+ ActiveRecord::AssociationRelation
+ ].freeze
+
+ included do
+ MODULES_TO_EXTEND.each do |mod|
+ delegate_mod = relation_delegate_class(mod)
+ delegate_mod.prepend(UnnestedInFilters::Dsl::Relation)
+ end
+ end
+
+ module Relation
+ def use_unnested_filters
+ spawn.use_unnested_filters!
+ end
+
+ def use_unnested_filters!
+ assert_mutability!
+ @values[:unnested_filters] = true
+
+ self
+ end
+
+ def use_unnested_filters?
+ @values.fetch(:unnested_filters, false)
+ end
+
+ def load(*)
+ return super if loaded? || !rewrite_query?
+
+ @records = unnested_filter_rewriter.rewrite.to_a
+ @loaded = true
+
+ self
+ end
+
+ def exists?(*)
+ return super unless rewrite_query?
+
+ unnested_filter_rewriter.rewrite.exists?
+ end
+
+ private
+
+ def rewrite_query?
+ use_unnested_filters? && unnested_filter_rewriter.rewrite?
+ end
+
+ def unnested_filter_rewriter
+ @unnested_filter_rewriter ||= UnnestedInFilters::Rewriter.new(self)
+ end
+ end
+ end
+end
diff --git a/lib/unnested_in_filters/rewriter.rb b/lib/unnested_in_filters/rewriter.rb
new file mode 100644
index 00000000000..cba002a5632
--- /dev/null
+++ b/lib/unnested_in_filters/rewriter.rb
@@ -0,0 +1,191 @@
+# frozen_string_literal: true
+
+# rubocop:disable CodeReuse/ActiveRecord (This module is generating ActiveRecord relations therefore using AR methods is necessary)
+module UnnestedInFilters
+ class Rewriter
+ include Gitlab::Utils::StrongMemoize
+
+ class ValueTable
+ def initialize(model, attribute, values)
+ @model = model
+ @attribute = attribute.to_s
+ @values = values
+ end
+
+ def to_sql
+ "unnest(#{serialized_values}::#{sql_type}[]) AS #{table_name}(#{column_name})"
+ end
+
+ def as_predicate
+ "#{model.table_name}.#{column_name} = #{table_name}.#{column_name}"
+ end
+
+ private
+
+ attr_reader :model, :attribute, :values
+
+ delegate :connection, :columns, :attribute_types, to: :model, private: true
+ delegate :quote, :quote_table_name, :quote_column_name, to: :connection
+
+ def table_name
+ quote_table_name(attribute.pluralize)
+ end
+
+ def column_name
+ quote_column_name(attribute)
+ end
+
+ def serialized_values
+ array_type.serialize(values)
+ .then { |array| quote(array) }
+ end
+
+ def array_type
+ ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array.new(attribute_types[attribute])
+ end
+
+ def sql_type
+ column.sql_type_metadata.sql_type
+ end
+
+ def column
+ columns.find { _1.name == attribute }
+ end
+ end
+
+ def initialize(relation)
+ @relation = relation
+ end
+
+ # Rewrites the given ActiveRecord::Relation object to
+ # utilize the DB indices efficiently.
+ #
+ # Example usage;
+ #
+ # relation = Vulnerabilities::Read.where(state: [1, 4])
+ # relation = relation.order(severity: :desc, vulnerability_id: :desc)
+ #
+ # rewriter = UnnestedInFilters::Rewriter.new(relation)
+ # optimized_relation = rewriter.rewrite
+ #
+ # In the above example. the `relation` object would produce the following SQL query;
+ #
+ # SELECT
+ # "vulnerability_reads".*
+ # FROM
+ # "vulnerability_reads"
+ # WHERE
+ # "vulnerability_reads"."state" IN (1, 4)
+ # ORDER BY
+ # "vulnerability_reads"."severity" DESC,
+ # "vulnerability_reads"."vulnerability_id" DESC
+ # LIMIT 20;
+ #
+ # And the `optimized_relation` object would would produce the following query to
+ # utilize the index on (state, severity, vulnerability_id);
+ #
+ # SELECT
+ # "vulnerability_reads".*
+ # FROM
+ # unnest('{1, 4}'::smallint[]) AS "states" ("state"),
+ # LATERAL (
+ # SELECT
+ # "vulnerability_reads".*
+ # FROM
+ # "vulnerability_reads"
+ # WHERE
+ # (vulnerability_reads."state" = "states"."state")
+ # ORDER BY
+ # "vulnerability_reads"."severity" DESC,
+ # "vulnerability_reads"."vulnerability_id" DESC
+ # LIMIT 20) AS vulnerability_reads
+ # ORDER BY
+ # "vulnerability_reads"."severity" DESC,
+ # "vulnerability_reads"."vulnerability_id" DESC
+ # LIMIT 20
+ #
+ def rewrite
+ log_rewrite
+
+ model.from(from)
+ .limit(limit_value)
+ .order(order_values)
+ .includes(relation.includes_values)
+ .preload(relation.preload_values)
+ .eager_load(relation.eager_load_values)
+ end
+
+ def rewrite?
+ strong_memoize(:rewrite) do
+ in_filters.present? && has_index_coverage?
+ end
+ end
+
+ private
+
+ attr_reader :relation
+
+ delegate :model, :order_values, :limit_value, :where_values_hash, to: :relation, private: true
+
+ def log_rewrite
+ ::Gitlab::AppLogger.info(message: 'Query is being rewritten by `UnnestedInFilters`', model: model.name)
+ end
+
+ def from
+ [value_tables.map(&:to_sql) + [lateral]].join(', ')
+ end
+
+ def lateral
+ "LATERAL (#{join_relation.to_sql}) AS #{model.table_name}"
+ end
+
+ def join_relation
+ value_tables.reduce(unscoped_relation) do |memo, tmp_table|
+ memo.where(tmp_table.as_predicate)
+ end
+ end
+
+ def unscoped_relation
+ relation.unscope(where: in_filters.keys)
+ end
+
+ def in_filters
+ @in_filters ||= where_values_hash.select { _2.is_a?(Array) }
+ end
+
+ def has_index_coverage?
+ indices.any? do |index|
+ (filter_attributes - Array(index.columns)).empty? && # all the filter attributes are indexed
+ index.columns.last(order_attributes.length) == order_attributes && # index can be used in sorting
+ (index.columns - (filter_attributes + order_attributes)).empty? # there is no other columns in the index
+ end
+ end
+
+ def filter_attributes
+ @filter_attributes ||= where_values_hash.keys
+ end
+
+ def order_attributes
+ @order_attributes ||= order_values.flat_map(&method(:extract_column_name))
+ end
+
+ def extract_column_name(order_value)
+ case order_value
+ when Arel::Nodes::Ordering
+ order_value.expr.name
+ when ::Gitlab::Pagination::Keyset::Order
+ order_value.attribute_names
+ end
+ end
+
+ def indices
+ model.connection.schema_cache.indexes(model.table_name)
+ end
+
+ def value_tables
+ @value_tables ||= in_filters.map do |attribute, values|
+ ValueTable.new(model, attribute, values)
+ end
+ end
+ end
+end
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 528d2d5a9dc..c4e606170ca 100644
--- a/locale/am_ET/gitlab.po
+++ b/locale/am_ET/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: am\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d ንብርብር"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d ሰከንድ"
msgstr[1] "%d ሰከንዶች"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index 13bba89f9f3..037bf20daa7 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -460,6 +460,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -595,6 +604,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -604,6 +622,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -1027,9 +1054,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1252,9 +1285,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1372,6 +1402,9 @@ msgstr[5] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1417,6 +1450,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1723,6 +1759,15 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -2026,6 +2071,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2314,6 +2362,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2431,6 +2482,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2521,9 +2578,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2554,9 +2608,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2584,9 +2635,6 @@ 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 new issue"
msgstr ""
@@ -2836,9 +2884,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -3088,6 +3133,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3160,6 +3208,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3385,7 +3436,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3394,6 +3445,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3436,6 +3490,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3463,6 +3520,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3538,6 +3598,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3565,6 +3631,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3583,6 +3652,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3595,9 +3667,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3646,9 +3724,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3667,6 +3742,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3733,6 +3811,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -4213,6 +4294,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -4225,12 +4309,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4273,9 +4351,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4288,9 +4363,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4303,12 +4375,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4468,6 +4546,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4687,6 +4768,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4699,6 +4783,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4906,6 +4993,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5320,7 +5410,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5428,6 +5518,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5446,6 +5539,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5563,6 +5659,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5662,9 +5761,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5740,6 +5836,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5764,6 +5863,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5773,6 +5875,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5788,6 +5896,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6280,9 +6391,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6685,6 +6793,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6991,6 +7105,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7312,6 +7429,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7408,6 +7528,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7453,6 +7576,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7780,6 +7906,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7951,9 +8080,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -8209,6 +8335,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -8260,9 +8392,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8326,6 +8455,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8704,6 +8836,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8722,6 +8857,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8731,9 +8983,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -9103,9 +9352,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -9145,6 +9391,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -9190,9 +9439,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9370,10 +9616,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9469,6 +9721,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9550,6 +9808,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9943,6 +10204,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9979,10 +10243,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -10174,9 +10438,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10408,9 +10669,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10420,6 +10678,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -11146,6 +11407,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11842,6 +12106,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11875,6 +12142,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11923,13 +12199,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -12061,6 +12337,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -12271,6 +12550,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12478,12 +12760,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12496,9 +12772,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12556,6 +12829,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12592,9 +12868,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12640,6 +12913,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12751,6 +13027,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12898,13 +13201,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13339,12 +13642,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13438,9 +13735,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13483,9 +13777,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13543,6 +13834,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13744,6 +14038,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13858,9 +14155,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -14032,9 +14326,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -14251,10 +14542,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -14284,9 +14575,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14437,9 +14725,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14578,9 +14863,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14596,6 +14878,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14662,9 +14947,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14779,9 +15061,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14902,9 +15181,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -15004,12 +15280,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -15046,9 +15316,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -15058,9 +15325,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -15070,12 +15334,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -15085,10 +15343,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -15097,18 +15352,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -15124,13 +15373,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -15265,6 +15511,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15493,6 +15742,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15760,6 +16012,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15898,7 +16153,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -16063,6 +16318,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -16084,6 +16342,15 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Failed on"
msgstr ""
@@ -16771,7 +17038,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16780,6 +17050,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16912,9 +17185,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16981,7 +17251,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -17227,9 +17497,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17434,15 +17701,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17539,9 +17800,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17590,9 +17848,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17785,6 +18040,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17812,6 +18103,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17902,9 +18196,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -18001,6 +18292,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -18106,9 +18400,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -18124,6 +18424,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -18145,16 +18448,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18430,6 +18739,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18583,6 +18895,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18592,7 +18907,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18859,18 +19174,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18901,25 +19213,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18928,37 +19240,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18967,7 +19282,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18976,9 +19294,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -19000,7 +19324,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -19132,9 +19456,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19630,10 +19951,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19645,9 +19966,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19807,15 +20125,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20938,9 +21307,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20953,12 +21328,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20971,6 +21364,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -21100,9 +21499,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -21247,6 +21643,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -21259,10 +21658,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21355,6 +21757,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21370,6 +21775,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21415,6 +21823,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21496,6 +21907,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21508,15 +21922,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21559,9 +21964,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21571,15 +21973,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21715,6 +22114,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21730,6 +22132,15 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21841,6 +22252,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -22024,15 +22438,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22351,9 +22759,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22390,9 +22795,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22411,6 +22822,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22714,6 +23128,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22753,12 +23170,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22783,6 +23206,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22819,6 +23248,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22936,9 +23368,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -23014,6 +23443,15 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Label priority"
msgstr ""
@@ -23242,9 +23680,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -23260,9 +23695,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -23323,19 +23755,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23380,22 +23812,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23413,6 +23848,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23422,9 +23860,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23944,9 +24379,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -24034,9 +24466,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -24046,9 +24475,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -24187,6 +24613,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -24199,6 +24628,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24778,12 +25210,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24949,7 +25387,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24976,6 +25414,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -25330,9 +25771,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25774,6 +26212,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25786,9 +26239,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25810,6 +26260,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25834,9 +26287,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25927,10 +26377,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25939,10 +26389,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -26101,16 +26551,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -26206,9 +26653,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -26263,6 +26707,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -26293,6 +26740,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -26317,9 +26767,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26410,6 +26857,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26455,9 +26905,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26494,6 +26941,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26677,9 +27127,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26839,21 +27295,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26866,18 +27349,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -27355,6 +27862,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -27379,7 +27889,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27388,22 +27898,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27412,12 +27922,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27439,10 +27952,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27538,6 +28051,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27556,6 +28072,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27646,6 +28165,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27730,12 +28252,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27754,7 +28270,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27862,6 +28381,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27982,6 +28504,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -28024,6 +28549,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -28063,9 +28591,6 @@ 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 ""
@@ -28156,18 +28681,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28600,6 +29119,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28612,6 +29149,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28978,6 +29524,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -29215,6 +29764,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29422,12 +29974,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29503,13 +30049,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29551,9 +30100,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29605,9 +30151,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29638,6 +30181,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29803,9 +30349,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29818,7 +30361,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29845,7 +30388,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29860,6 +30403,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29887,7 +30433,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29896,16 +30442,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29938,7 +30484,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -30025,13 +30571,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -30040,7 +30586,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -30049,16 +30595,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -30067,7 +30613,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -30103,7 +30649,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -30145,6 +30691,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -30223,7 +30772,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -30346,6 +30895,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30457,6 +31009,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30475,9 +31030,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30937,6 +31489,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -31075,6 +31630,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -31141,7 +31699,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -31201,7 +31759,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -31360,6 +31918,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -31372,6 +31933,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31693,6 +32257,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -32005,6 +32572,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -32092,9 +32662,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -32263,6 +32830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32656,9 +33226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32686,6 +33253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32788,6 +33358,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -33151,9 +33727,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -33238,6 +33811,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -33247,9 +33823,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -33343,6 +33916,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -33376,12 +33952,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33718,6 +34288,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33847,9 +34420,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33994,6 +34564,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -34084,6 +34663,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34780,6 +35374,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34795,7 +35392,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34840,6 +35437,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34864,9 +35464,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34963,9 +35569,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -35065,6 +35668,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -35089,18 +35695,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -35110,12 +35704,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -35155,6 +35743,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -35380,9 +35971,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35461,6 +36049,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35575,6 +36169,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35596,6 +36193,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35827,9 +36427,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35884,6 +36481,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35947,6 +36547,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -36214,6 +36817,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -36241,9 +36901,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -36259,6 +36916,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36580,6 +37240,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36775,9 +37438,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -37105,7 +37765,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37450,6 +38110,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37471,7 +38134,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37489,6 +38152,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37552,6 +38218,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37858,7 +38527,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -38032,6 +38704,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -38044,6 +38719,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -38119,9 +38809,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -38320,6 +39007,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38692,6 +39385,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38770,9 +39466,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38899,6 +39592,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38923,7 +39619,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -39085,6 +39781,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -39127,9 +39826,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -39160,21 +39856,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -39388,6 +40075,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -39433,6 +40123,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -40057,9 +40753,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -40177,7 +40870,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -40201,6 +40894,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -40252,9 +40948,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -40285,9 +40978,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -40297,9 +40987,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -40351,6 +41038,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40693,9 +41386,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40846,6 +41536,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40885,12 +41578,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40945,9 +41647,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -41104,9 +41803,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -41173,9 +41869,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -41263,6 +41956,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -41353,9 +42049,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -41365,9 +42058,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -41380,9 +42070,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -41410,6 +42097,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -41452,7 +42142,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41506,9 +42196,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41560,12 +42247,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41761,10 +42442,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41809,9 +42487,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41932,6 +42607,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42559,6 +43237,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42826,9 +43510,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42877,9 +43558,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43501,7 +44179,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -44101,6 +44779,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -44125,19 +44806,40 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -44149,10 +44851,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -44308,7 +45010,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44506,9 +45208,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44518,9 +45217,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44548,9 +45244,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44560,6 +45253,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44716,6 +45412,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44728,6 +45427,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44797,9 +45499,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44899,18 +45598,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44932,12 +45649,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -45169,12 +45880,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -45190,6 +45895,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -45247,9 +45955,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -45259,6 +45964,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -45331,6 +46042,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -45364,6 +46078,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -45409,6 +46126,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -45466,6 +46189,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45508,6 +46234,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45583,10 +46312,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45598,6 +46327,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45889,6 +46621,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45916,12 +46651,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45979,6 +46708,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -46099,6 +46831,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -46150,6 +46885,21 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -46483,6 +47233,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46594,6 +47350,9 @@ msgstr[5] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46612,9 +47371,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46660,6 +47416,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46858,6 +47617,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46897,6 +47662,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46933,12 +47704,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -47101,6 +47866,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -47326,6 +48094,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index b89a9356199..b73d600d2cb 100644
--- a/locale/as_IN/gitlab.po
+++ b/locale/as_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: as\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index 25f52dd4766..124d05a99f5 100644
--- a/locale/az_AZ/gitlab.po
+++ b/locale/az_AZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: az\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index b0018945114..7b12881f384 100644
--- a/locale/ba_RU/gitlab.po
+++ b/locale/ba_RU/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ba\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -622,9 +634,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -917,6 +932,9 @@ msgstr[0] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -952,6 +970,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1233,6 +1254,10 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1421,6 +1446,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1709,6 +1737,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1826,6 +1857,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -1916,9 +1953,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -1949,9 +1983,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ 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 new issue"
msgstr ""
@@ -2231,9 +2259,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -2990,9 +3042,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -4913,6 +4989,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8769,6 +9001,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,10 +9518,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9469,9 +9713,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,10 +13732,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13494,9 +13765,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14280,12 +14524,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14295,10 +14533,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14334,13 +14563,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,37 +18400,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,7 +18442,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22159,6 +22558,10 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,16 +25596,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25490,6 +25902,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28548,13 +29059,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28596,9 +29110,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -28863,7 +29371,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,7 +29398,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -28905,6 +29413,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,7 +29494,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29070,13 +29581,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29085,7 +29596,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29094,16 +29605,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29112,7 +29623,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29148,7 +29659,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29268,7 +29782,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36340,6 +36965,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -36929,6 +37569,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39191,6 +39843,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index a0139d7fa7e..a148084e806 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Прикачете файл чрез влачене и пуÑкане или %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr "Редактиране"
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr "ТърÑене по път"
msgid "Find file"
msgstr "ТърÑене на файл"
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr ""
-
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,18 +25787,15 @@ msgstr ""
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Ðов файл"
msgid "New group"
msgstr ""
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "ÐÑма хранилище"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr "Опции"
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr "СобÑтвеник"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Име"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr "Изберете целеви клон"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr "Ð’Ñеки може да има доÑтъп до проекта, без нужда от удоÑтоверÑване."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr "Време преди един проблем да бъде планир
msgid "Time before an issue starts implementation"
msgstr "Време преди работата по проблем да започне"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "Време между Ñъздаване на заÑвка за Ñливане и прилагането/отхвърлÑнето Ñ"
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "щракнете за качване"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "родител"
msgstr[1] "родители"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 6ec67f349b5..5444939edc8 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index 482f0eba47f..2548033e4d5 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
index b4826e3db34..d9c3f3163ac 100644
--- a/locale/br_FR/gitlab.po
+++ b/locale/br_FR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: br-FR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -417,6 +417,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -537,6 +545,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -545,6 +561,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -946,9 +970,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1169,9 +1199,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1281,6 +1308,9 @@ msgstr[4] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1324,6 +1354,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1625,6 +1658,14 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1905,6 +1946,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2193,6 +2237,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2310,6 +2357,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2400,9 +2453,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2433,9 +2483,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2463,9 +2510,6 @@ 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 new issue"
msgstr ""
@@ -2715,9 +2759,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2967,6 +3008,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3039,6 +3083,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3264,7 +3311,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3273,6 +3320,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3315,6 +3365,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3342,6 +3395,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3417,6 +3473,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3444,6 +3506,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3462,6 +3527,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3474,9 +3542,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3525,9 +3599,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3546,6 +3617,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3612,6 +3686,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -4092,6 +4169,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -4104,12 +4184,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4152,9 +4226,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4167,9 +4238,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4182,12 +4250,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4347,6 +4421,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4566,6 +4643,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4577,6 +4657,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4784,6 +4867,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5191,7 +5277,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5298,6 +5384,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5316,6 +5405,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5433,6 +5525,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5531,9 +5626,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5608,6 +5700,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5632,6 +5727,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5641,6 +5739,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5656,6 +5760,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6148,9 +6255,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6553,6 +6657,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6856,6 +6966,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7177,6 +7290,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7273,6 +7389,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7317,6 +7436,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7644,6 +7766,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7815,9 +7940,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -8071,6 +8193,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -8122,9 +8250,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8188,6 +8313,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8565,6 +8693,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8583,6 +8714,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8592,9 +8840,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8963,9 +9208,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -9005,6 +9247,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -9050,9 +9295,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9230,10 +9472,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9329,6 +9577,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9410,6 +9664,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9802,6 +10059,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9838,10 +10098,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -10033,9 +10293,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10264,9 +10521,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10276,6 +10530,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -11002,6 +11259,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11697,6 +11957,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11730,6 +11993,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11778,13 +12050,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11916,6 +12188,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -12126,6 +12401,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12332,12 +12610,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12350,9 +12622,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12410,6 +12679,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12446,9 +12718,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12494,6 +12763,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12605,6 +12877,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12749,13 +13048,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13186,12 +13485,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13284,9 +13577,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13329,9 +13619,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13389,6 +13676,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13590,6 +13880,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13701,9 +13994,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13874,9 +14164,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -14093,10 +14380,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -14126,9 +14413,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14279,9 +14563,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14420,9 +14701,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14438,6 +14716,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14504,9 +14785,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14621,9 +14899,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14744,9 +15019,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14846,12 +15118,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14888,9 +15154,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14900,9 +15163,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14912,12 +15172,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14927,10 +15181,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14939,18 +15190,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14966,13 +15211,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -15107,6 +15349,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15335,6 +15580,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15601,6 +15849,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15739,7 +15990,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15904,6 +16155,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15925,6 +16179,14 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Failed on"
msgstr ""
@@ -16610,7 +16872,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16619,6 +16884,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16751,9 +17019,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16820,7 +17085,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -17064,9 +17329,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17271,15 +17533,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17376,9 +17632,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17427,9 +17680,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17622,6 +17872,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17649,6 +17935,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17739,9 +18028,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17838,6 +18124,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17943,9 +18232,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17961,6 +18256,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17982,16 +18280,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18267,6 +18571,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18420,6 +18727,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18429,7 +18739,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18696,18 +19006,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18738,25 +19045,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18765,37 +19072,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgstr ""
+
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18804,7 +19114,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18813,9 +19126,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18837,7 +19156,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18969,9 +19288,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19463,10 +19779,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19478,9 +19794,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19640,15 +19953,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20768,9 +21132,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20783,12 +21153,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20801,6 +21189,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20930,9 +21324,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -21076,6 +21467,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -21088,10 +21482,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21184,6 +21581,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21199,6 +21599,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21244,6 +21647,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21325,6 +21731,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21337,15 +21746,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21388,9 +21788,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21400,15 +21797,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21544,6 +21938,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21559,6 +21956,14 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21670,6 +22075,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21853,15 +22261,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22180,9 +22582,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22219,9 +22618,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22240,6 +22645,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22543,6 +22951,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22582,12 +22993,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22612,6 +23029,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22648,6 +23071,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22765,9 +23191,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22843,6 +23266,14 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Label priority"
msgstr ""
@@ -23070,9 +23501,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -23088,9 +23516,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -23151,19 +23576,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23208,22 +23633,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23241,6 +23669,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23250,9 +23681,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23766,9 +24194,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23856,9 +24281,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23868,9 +24290,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -24009,6 +24428,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -24021,6 +24443,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24598,12 +25023,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24769,7 +25200,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24796,6 +25227,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -25149,9 +25583,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25592,6 +26023,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25604,9 +26050,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25628,6 +26071,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25652,9 +26098,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25744,10 +26187,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25756,10 +26199,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25917,16 +26360,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -26022,9 +26462,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -26079,6 +26516,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -26109,6 +26549,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -26133,9 +26576,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26226,6 +26666,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26271,9 +26714,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26310,6 +26750,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26492,9 +26935,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26650,21 +27099,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26677,18 +27153,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -27165,6 +27665,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -27189,7 +27692,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27198,22 +27701,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27222,12 +27725,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27249,10 +27755,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27348,6 +27854,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27366,6 +27875,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27456,6 +27968,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27540,12 +28055,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27564,7 +28073,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27672,6 +28184,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27791,6 +28306,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27833,6 +28351,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27872,9 +28393,6 @@ 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 ""
@@ -27965,18 +28483,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28409,6 +28921,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28421,6 +28951,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28787,6 +29326,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -29024,6 +29566,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29231,12 +29776,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29312,13 +29851,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29360,9 +29902,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29414,9 +29953,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29447,6 +29983,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29612,9 +30151,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29627,7 +30163,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29654,7 +30190,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29669,6 +30205,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29696,7 +30235,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29705,16 +30244,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29747,7 +30286,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29834,13 +30373,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29849,7 +30388,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29858,16 +30397,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29876,7 +30415,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29912,7 +30451,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29954,6 +30493,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -30032,7 +30574,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -30155,6 +30697,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30266,6 +30811,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30284,9 +30832,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30746,6 +31291,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30884,6 +31432,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30950,7 +31501,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -31010,7 +31561,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -31169,6 +31720,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -31181,6 +31735,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31502,6 +32059,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31814,6 +32374,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31901,9 +32464,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -32070,6 +32630,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32463,9 +33026,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32493,6 +33053,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32592,6 +33155,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32951,9 +33520,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -33036,6 +33602,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -33045,9 +33614,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -33141,6 +33707,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -33174,12 +33743,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33511,6 +34074,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33639,9 +34205,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33785,6 +34348,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33875,6 +34447,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34560,6 +35147,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34575,7 +35165,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34620,6 +35210,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34644,9 +35237,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34743,9 +35342,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34845,6 +35441,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34869,18 +35468,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34890,12 +35477,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34935,6 +35516,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -35160,9 +35744,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35241,6 +35822,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35355,6 +35942,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35376,6 +35966,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35607,9 +36200,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35664,6 +36254,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35727,6 +36320,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35993,6 +36589,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -36019,9 +36672,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -36037,6 +36687,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36358,6 +37011,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36553,9 +37209,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36883,7 +37536,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37228,6 +37881,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37249,7 +37905,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37267,6 +37923,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37330,6 +37989,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37636,7 +38298,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37809,6 +38474,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37821,6 +38489,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37896,9 +38579,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -38097,6 +38777,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38463,6 +39149,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38541,9 +39230,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38669,6 +39355,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38693,7 +39382,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38853,6 +39542,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38895,9 +39587,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38928,21 +39617,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -39156,6 +39836,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -39201,6 +39884,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39825,9 +40514,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39945,7 +40631,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39969,6 +40655,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -40020,9 +40709,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -40053,9 +40739,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -40065,9 +40748,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -40119,6 +40799,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40459,9 +41145,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40612,6 +41295,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40651,12 +41337,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40711,9 +41406,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40870,9 +41562,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40939,9 +41628,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -41029,6 +41715,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -41119,9 +41808,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -41131,9 +41817,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -41146,9 +41829,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -41176,6 +41856,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -41218,7 +41901,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41272,9 +41955,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41326,12 +42006,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41527,10 +42201,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41575,9 +42246,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41698,6 +42366,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42325,6 +42996,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42591,9 +43268,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42641,9 +43315,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43263,7 +43934,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43862,6 +44533,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43886,19 +44560,39 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43910,10 +44604,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -44068,7 +44762,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44266,9 +44960,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44278,9 +44969,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44308,9 +44996,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44320,6 +45005,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44475,6 +45163,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44487,6 +45178,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44556,9 +45250,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44658,18 +45349,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44691,12 +45400,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44928,12 +45631,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44949,6 +45646,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -45005,9 +45705,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -45016,6 +45713,12 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -45088,6 +45791,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -45120,6 +45826,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -45164,6 +45873,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -45220,6 +45935,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45262,6 +45980,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45336,10 +46057,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45351,6 +46072,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45637,6 +46361,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45664,12 +46391,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45726,6 +46447,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45844,6 +46568,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45894,6 +46621,20 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -46224,6 +46965,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46333,6 +47080,9 @@ msgstr[4] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46351,9 +47101,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46399,6 +47146,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46597,6 +47347,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46634,6 +47390,12 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46670,12 +47432,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46835,6 +47591,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -47059,6 +47818,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index e075be25a7b..ac1909adac0 100644
--- a/locale/bs_BA/gitlab.po
+++ b/locale/bs_BA/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -331,6 +331,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,12 +427,24 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekunda"
msgstr[1] "%d sekunde"
msgstr[2] "%d sekundi"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -784,9 +802,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1003,9 +1027,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1099,6 +1120,9 @@ msgstr[2] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1138,6 +1162,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1429,6 +1456,12 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 dan"
@@ -1663,6 +1696,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1951,6 +1987,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2068,6 +2107,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2158,9 +2203,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2191,9 +2233,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2221,9 +2260,6 @@ 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 new issue"
msgstr ""
@@ -2473,9 +2509,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "Dodatne minute"
@@ -2725,6 +2758,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2797,6 +2833,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3022,7 +3061,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3031,6 +3070,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3073,6 +3115,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3100,6 +3145,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3175,6 +3223,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3202,6 +3256,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3220,6 +3277,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3232,9 +3292,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3283,9 +3349,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3304,6 +3367,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3370,6 +3436,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3850,6 +3919,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3862,12 +3934,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3910,9 +3976,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3925,9 +3988,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3940,12 +4000,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4105,6 +4171,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4324,6 +4393,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4333,6 +4405,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4540,6 +4615,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4933,7 +5011,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5038,6 +5116,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5056,6 +5137,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5173,6 +5257,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5269,9 +5356,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5344,6 +5428,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5368,6 +5455,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5377,6 +5467,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5392,6 +5488,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5884,9 +5983,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6289,6 +6385,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6586,6 +6688,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6907,6 +7012,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7003,6 +7111,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7045,6 +7156,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7372,6 +7486,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7543,9 +7660,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7795,6 +7909,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7846,9 +7966,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7912,6 +8029,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8287,6 +8407,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Zatvoreni zadaci"
@@ -8305,6 +8428,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8314,9 +8554,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8683,9 +8920,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8725,6 +8959,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8770,9 +9007,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8950,10 +9184,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9049,6 +9289,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9130,6 +9376,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9520,6 +9769,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9556,10 +9808,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9751,9 +10003,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9976,9 +10225,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9988,6 +10234,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10714,6 +10963,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11407,6 +11659,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11440,6 +11695,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11488,13 +11752,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11626,6 +11890,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11836,6 +12103,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12040,12 +12310,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12058,9 +12322,6 @@ msgstr "Standardni prvi dan sedmice"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Standardni prvi dan sedmice u kalendarima i izbornicima datuma."
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12118,6 +12379,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12154,9 +12418,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12202,6 +12463,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12313,6 +12577,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12451,13 +12742,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12880,12 +13171,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12976,9 +13261,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13021,9 +13303,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13081,6 +13360,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13282,6 +13564,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13387,9 +13672,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13558,9 +13840,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13777,10 +14056,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13810,9 +14089,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13963,9 +14239,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14104,9 +14377,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14122,6 +14392,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14188,9 +14461,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14305,9 +14575,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14428,9 +14695,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14530,12 +14794,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14572,9 +14830,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14584,9 +14839,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14596,12 +14848,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14611,10 +14857,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14623,18 +14866,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14650,13 +14887,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14791,6 +15025,9 @@ msgstr "Problem pri uklanjanju zadatka iz epika."
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15019,6 +15256,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15283,6 +15523,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15421,7 +15664,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15586,6 +15829,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15607,6 +15853,12 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Failed on"
msgstr ""
@@ -16288,7 +16540,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16297,6 +16552,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16429,9 +16687,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16498,7 +16753,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16738,9 +16993,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16945,15 +17197,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17050,9 +17296,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17101,9 +17344,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17296,6 +17536,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17323,6 +17599,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17413,9 +17692,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17512,6 +17788,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17617,9 +17896,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17635,6 +17920,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17656,16 +17944,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17941,6 +18235,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18094,6 +18391,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18103,7 +18403,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18370,18 +18670,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18412,25 +18709,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18439,37 +18736,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18478,7 +18778,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18487,9 +18790,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18511,7 +18820,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18643,9 +18952,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19129,10 +19435,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19144,9 +19450,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19306,15 +19609,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20428,9 +20782,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20443,12 +20803,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20461,6 +20839,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20590,9 +20974,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20734,6 +21115,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20746,10 +21130,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20842,6 +21229,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20857,6 +21247,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20902,6 +21295,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20983,6 +21379,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20995,15 +21394,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21046,9 +21436,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21058,15 +21445,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21202,6 +21586,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21217,6 +21604,12 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21328,6 +21721,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21511,15 +21907,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21838,9 +22228,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21877,9 +22264,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21898,6 +22291,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22201,6 +22597,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22240,12 +22639,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22270,6 +22675,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22306,6 +22717,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22423,9 +22837,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22501,6 +22912,12 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Label priority"
msgstr ""
@@ -22726,9 +23143,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22744,9 +23158,6 @@ msgstr ""
msgid "Learn more"
msgstr "Saznaj više"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22807,19 +23218,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22864,22 +23275,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22897,6 +23311,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22906,9 +23323,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23410,9 +23824,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23500,9 +23911,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr "OznaÄava ovaj zadatak kao povjerljiv."
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23512,9 +23920,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23653,6 +24058,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23665,6 +24073,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24238,12 +24649,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24409,7 +24826,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24436,6 +24853,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24787,9 +25207,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25228,6 +25645,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25240,9 +25672,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25264,6 +25693,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25288,9 +25720,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25378,10 +25807,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25390,10 +25819,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25549,16 +25978,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25654,9 +26080,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25711,6 +26134,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25741,6 +26167,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25765,9 +26194,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25858,6 +26284,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25903,9 +26332,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25942,6 +26368,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26122,9 +26551,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26272,21 +26707,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26299,18 +26761,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26785,6 +27271,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26809,7 +27298,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26818,22 +27307,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26842,12 +27331,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26869,10 +27361,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26968,6 +27460,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26986,6 +27481,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27076,6 +27574,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27160,12 +27661,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27184,7 +27679,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27292,6 +27790,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27409,6 +27910,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27451,6 +27955,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27490,9 +27997,6 @@ 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 ""
@@ -27583,18 +28087,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28027,6 +28525,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28039,6 +28555,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28405,6 +28930,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28642,6 +29170,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28849,12 +29380,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28930,13 +29455,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28978,9 +29506,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29032,9 +29557,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29065,6 +29587,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29230,9 +29755,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29245,7 +29767,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29272,7 +29794,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29287,6 +29809,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29314,7 +29839,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29323,16 +29848,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29365,7 +29890,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29452,13 +29977,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29467,7 +29992,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29476,16 +30001,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29494,7 +30019,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29530,7 +30055,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29572,6 +30097,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29650,7 +30178,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29773,6 +30301,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29884,6 +30415,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29902,9 +30436,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30364,6 +30895,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30502,6 +31036,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30568,7 +31105,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30628,7 +31165,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30787,6 +31324,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30799,6 +31339,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31120,6 +31663,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31432,6 +31978,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31519,9 +32068,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31684,6 +32230,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32077,9 +32626,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32107,6 +32653,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32200,6 +32749,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32551,9 +33106,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32632,6 +33184,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32641,9 +33196,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32737,6 +33289,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32770,12 +33325,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33097,6 +33646,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33223,9 +33775,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33367,6 +33916,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33457,6 +34015,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34120,6 +34693,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34135,7 +34711,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34180,6 +34756,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34204,9 +34783,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34303,9 +34888,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34405,6 +34987,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34429,18 +35014,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34450,12 +35023,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34495,6 +35062,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34720,9 +35290,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34801,6 +35368,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34915,6 +35488,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34936,6 +35512,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35167,9 +35746,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35224,6 +35800,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35287,6 +35866,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35551,6 +36133,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35575,9 +36214,6 @@ msgstr ""
msgid "Showing all issues"
msgstr "Svi zadaci prikazani"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35593,6 +36229,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35914,6 +36553,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36109,9 +36751,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36439,7 +37078,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36784,6 +37423,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36805,7 +37447,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36823,6 +37465,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36886,6 +37531,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37192,7 +37840,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37363,6 +38014,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37375,6 +38029,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37450,9 +38119,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37651,6 +38317,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38005,6 +38677,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38083,9 +38758,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38209,6 +38881,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38233,7 +38908,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38389,6 +39064,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38431,9 +39109,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38464,21 +39139,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38692,6 +39358,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38737,6 +39406,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39361,9 +40036,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39481,7 +40153,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39505,6 +40177,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39556,9 +40231,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39589,9 +40261,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39601,9 +40270,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39655,6 +40321,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39991,9 +40663,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40144,6 +40813,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40183,12 +40855,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40243,9 +40924,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40402,9 +41080,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40471,9 +41146,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40561,6 +41233,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40651,9 +41326,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40663,9 +41335,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40678,9 +41347,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40708,6 +41374,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40750,7 +41419,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40804,9 +41473,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40858,12 +41524,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41059,10 +41719,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41107,9 +41764,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41230,6 +41884,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41857,6 +42514,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42121,9 +42784,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42169,9 +42829,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42787,7 +43444,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43384,6 +44041,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43408,19 +44068,37 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43432,10 +44110,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43588,7 +44266,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43786,9 +44464,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43798,9 +44473,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43828,9 +44500,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43840,6 +44509,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43993,6 +44665,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44005,6 +44680,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44074,9 +44752,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44176,18 +44851,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44209,12 +44902,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44446,12 +45133,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44467,6 +45148,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44521,15 +45205,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44602,6 +45289,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44632,6 +45322,9 @@ msgstr "upozorenje"
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44674,6 +45367,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44728,6 +45427,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44770,6 +45472,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44842,10 +45547,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44857,6 +45562,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45133,6 +45841,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45160,12 +45871,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45220,6 +45925,9 @@ msgstr ""
msgid "deleted"
msgstr "izbrisano"
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr "postavi"
@@ -45334,6 +46042,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45382,6 +46093,18 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45706,6 +46429,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45811,6 +46540,9 @@ msgstr[2] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45829,9 +46561,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45877,6 +46606,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46075,6 +46807,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46108,6 +46846,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "lozinka"
@@ -46144,12 +46888,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46303,6 +47041,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46525,6 +47266,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index b0f9d47774f..664b4999869 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr " Des de %{start} fins %{end}"
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d capa"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "No es pot obtenir un certificat SSL de Let's Encrypt fins que no s'hagi verificat el vostre domini."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Compte"
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr "Projectes arxivats"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "ag."
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Incidències tancades"
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr "Registre de contenidors"
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr "Crea una etiqueta nova"
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr "Detalls"
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr "Desactiva per a aquest projecte"
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr "Edita"
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Tasca"
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr "Mostra-ho tot"
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "Sincronitzat"
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr "Versió del Git"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr "Grup"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr "Nom"
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index 303fbcc03b1..322a9695608 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -374,6 +374,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -486,6 +500,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -865,9 +886,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1086,9 +1113,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1190,6 +1214,9 @@ msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1231,6 +1258,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1527,6 +1557,13 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1784,6 +1821,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2072,6 +2112,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2189,6 +2232,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2279,9 +2328,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2312,9 +2358,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2342,9 +2385,6 @@ 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 new issue"
msgstr ""
@@ -2594,9 +2634,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2846,6 +2883,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2918,6 +2958,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3143,7 +3186,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3152,6 +3195,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3194,6 +3240,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3221,6 +3270,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3296,6 +3348,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3323,6 +3381,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3341,6 +3402,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3353,9 +3417,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3404,9 +3474,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3425,6 +3492,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3491,6 +3561,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3971,6 +4044,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3983,12 +4059,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4031,9 +4101,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4046,9 +4113,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4061,12 +4125,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4226,6 +4296,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4445,6 +4518,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4455,6 +4531,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4662,6 +4741,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5062,7 +5144,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5168,6 +5250,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5186,6 +5271,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5303,6 +5391,9 @@ msgstr "Přiřadit štítky"
msgid "Assign milestone"
msgstr "Přiřadit milník"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5400,9 +5491,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5476,6 +5564,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5500,6 +5591,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5509,6 +5603,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5524,6 +5624,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "Srp"
@@ -6016,9 +6119,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6421,6 +6521,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6721,6 +6827,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7042,6 +7151,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7138,6 +7250,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7181,6 +7296,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7508,6 +7626,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7679,9 +7800,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7933,6 +8051,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8050,6 +8171,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8426,6 +8550,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8444,6 +8571,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8453,9 +8697,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8823,9 +9064,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8865,6 +9103,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8910,9 +9151,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9090,10 +9328,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9270,6 +9520,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9661,6 +9914,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9697,10 +9953,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9892,9 +10148,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10120,9 +10373,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10858,6 +11111,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11552,6 +11808,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11585,6 +11844,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11633,13 +11901,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11771,6 +12039,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11981,6 +12252,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12186,12 +12460,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12204,9 +12472,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12300,9 +12568,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12348,6 +12613,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12459,6 +12727,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12600,13 +12895,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13235,6 +13518,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13716,9 +14002,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13935,10 +14218,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13968,9 +14251,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14121,9 +14401,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14262,9 +14539,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14280,6 +14554,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14463,9 +14737,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14586,9 +14857,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14688,12 +14956,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14730,9 +14992,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14742,9 +15001,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14754,12 +15010,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14769,10 +15019,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14781,18 +15028,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14808,13 +15049,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14949,6 +15187,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15580,7 +15827,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15766,6 +16016,13 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr ""
@@ -16449,7 +16706,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16458,6 +16718,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16659,7 +16919,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16901,9 +17161,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17213,9 +17464,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17459,6 +17704,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17576,9 +17860,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17675,6 +17956,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17780,9 +18064,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17798,6 +18088,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,16 +18112,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18104,6 +18403,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18257,6 +18559,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18266,7 +18571,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18533,18 +18838,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18575,25 +18877,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18602,37 +18904,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,9 +18958,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18674,7 +18988,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18806,9 +19120,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19296,10 +19607,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19473,15 +19781,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20760,9 +21149,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21013,6 +21405,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21154,6 +21555,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21166,15 +21570,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21217,9 +21612,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21388,6 +21780,13 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21499,6 +21898,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21682,15 +22084,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22048,9 +22441,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22411,12 +22816,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22672,6 +23089,13 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr ""
@@ -22898,9 +23322,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22916,9 +23337,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22979,19 +23397,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23036,22 +23454,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23078,9 +23502,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23678,9 +24096,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23690,9 +24105,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24418,12 +24836,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24589,7 +25013,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25446,6 +25882,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25470,9 +25909,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25561,10 +25997,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25573,10 +26009,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25733,16 +26169,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25838,9 +26271,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25895,6 +26325,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25925,6 +26358,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26042,6 +26475,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26461,21 +26903,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26975,6 +27468,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26999,7 +27495,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,22 +27504,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27059,10 +27558,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27158,6 +27657,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27176,6 +27678,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27482,6 +27987,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27642,6 +28153,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27681,9 +28195,6 @@ 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 ""
@@ -27774,18 +28285,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28833,6 +29368,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29040,12 +29578,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29121,13 +29653,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29169,9 +29704,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29436,7 +29965,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,7 +29992,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29478,6 +30007,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29505,7 +30037,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29514,16 +30046,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,7 +30088,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29643,13 +30175,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29658,7 +30190,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29667,16 +30199,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29685,7 +30217,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29721,7 +30253,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29763,6 +30295,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29841,7 +30376,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29964,6 +30499,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30759,7 +31303,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30819,7 +31363,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31710,9 +32266,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31877,6 +32430,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32270,9 +32826,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32300,6 +32853,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33304,6 +33860,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34355,7 +34938,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,6 +34983,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35021,6 +35595,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35135,6 +35715,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35156,6 +35739,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35444,6 +36027,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35772,6 +36361,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37006,6 +37652,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37027,7 +37676,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37045,6 +37694,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,6 +37760,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37414,7 +38069,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37598,6 +38259,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38312,9 +38994,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38924,6 +39597,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39833,9 +40509,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39887,6 +40560,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40477,9 +41165,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40795,6 +41474,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40885,9 +41567,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40897,9 +41576,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40942,6 +41615,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41038,9 +41714,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41092,12 +41765,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41293,10 +41960,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42356,9 +43026,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,10 +44357,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44417,18 +45100,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44708,6 +45397,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44876,6 +45574,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45589,6 +46305,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45965,6 +46697,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46072,6 +46810,9 @@ msgstr[3] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46569,6 +47316,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46792,6 +47542,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index 098a58217f5..7cbfa52bc81 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:15\n"
msgid " %{start} to %{end}"
msgstr " %{start} i %{end}"
@@ -460,6 +460,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -595,6 +604,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -604,6 +622,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -1027,9 +1054,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1252,9 +1285,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1372,6 +1402,9 @@ msgstr[5] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1417,6 +1450,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1723,6 +1759,15 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -2026,6 +2071,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2314,6 +2362,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2431,6 +2482,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2521,9 +2578,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2554,9 +2608,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2584,9 +2635,6 @@ 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 new issue"
msgstr ""
@@ -2836,9 +2884,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -3088,6 +3133,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3160,6 +3208,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3385,7 +3436,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3394,6 +3445,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3436,6 +3490,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3463,6 +3520,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3538,6 +3598,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3565,6 +3631,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3583,6 +3652,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3595,9 +3667,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3646,9 +3724,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3667,6 +3742,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3733,6 +3811,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -4213,6 +4294,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -4225,12 +4309,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4273,9 +4351,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4288,9 +4363,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4303,12 +4375,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4468,6 +4546,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4687,6 +4768,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4699,6 +4783,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4906,6 +4993,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5320,7 +5410,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5428,6 +5518,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5446,6 +5539,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5563,6 +5659,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5662,9 +5761,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5740,6 +5836,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5764,6 +5863,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5773,6 +5875,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5788,6 +5896,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6280,9 +6391,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6685,6 +6793,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6991,6 +7105,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7312,6 +7429,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7408,6 +7528,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7453,6 +7576,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7780,6 +7906,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7951,9 +8080,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -8209,6 +8335,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -8260,9 +8392,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8326,6 +8455,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8704,6 +8836,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8722,6 +8857,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8731,9 +8983,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -9103,9 +9352,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -9145,6 +9391,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -9190,9 +9439,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9370,10 +9616,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9469,6 +9721,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9550,6 +9808,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9943,6 +10204,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9979,10 +10243,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -10174,9 +10438,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10408,9 +10669,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10420,6 +10678,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -11146,6 +11407,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11842,6 +12106,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11875,6 +12142,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11923,13 +12199,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -12061,6 +12337,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -12271,6 +12550,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12478,12 +12760,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12496,9 +12772,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12556,6 +12829,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12592,9 +12868,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12640,6 +12913,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12751,6 +13027,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12898,13 +13201,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13339,12 +13642,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13438,9 +13735,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13483,9 +13777,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13543,6 +13834,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13744,6 +14038,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13858,9 +14155,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -14032,9 +14326,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -14251,10 +14542,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -14284,9 +14575,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14437,9 +14725,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14578,9 +14863,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14596,6 +14878,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14662,9 +14947,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14779,9 +15061,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14902,9 +15181,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -15004,12 +15280,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -15046,9 +15316,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -15058,9 +15325,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -15070,12 +15334,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -15085,10 +15343,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -15097,18 +15352,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -15124,13 +15373,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -15265,6 +15511,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15493,6 +15742,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15760,6 +16012,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15898,7 +16153,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -16063,6 +16318,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -16084,6 +16342,15 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Failed on"
msgstr ""
@@ -16771,7 +17038,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16780,6 +17050,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16912,9 +17185,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16981,7 +17251,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -17227,9 +17497,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17434,15 +17701,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17539,9 +17800,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17590,9 +17848,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17785,6 +18040,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17812,6 +18103,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17902,9 +18196,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -18001,6 +18292,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -18106,9 +18400,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -18124,6 +18424,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -18145,16 +18448,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18430,6 +18739,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18583,6 +18895,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18592,7 +18907,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18859,18 +19174,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18901,25 +19213,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18928,37 +19240,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18967,7 +19282,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18976,9 +19294,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -19000,7 +19324,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -19132,9 +19456,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19630,10 +19951,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19645,9 +19966,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19807,15 +20125,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20938,9 +21307,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20953,12 +21328,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20971,6 +21364,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -21100,9 +21499,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -21247,6 +21643,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -21259,10 +21658,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21355,6 +21757,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21370,6 +21775,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21415,6 +21823,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21496,6 +21907,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21508,15 +21922,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21559,9 +21964,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21571,15 +21973,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21715,6 +22114,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21730,6 +22132,15 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21841,6 +22252,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -22024,15 +22438,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22351,9 +22759,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22390,9 +22795,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22411,6 +22822,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22714,6 +23128,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22753,12 +23170,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22783,6 +23206,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22819,6 +23248,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22936,9 +23368,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -23014,6 +23443,15 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Label priority"
msgstr ""
@@ -23242,9 +23680,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -23260,9 +23695,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -23323,19 +23755,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23380,22 +23812,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23413,6 +23848,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23422,9 +23860,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23944,9 +24379,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -24034,9 +24466,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -24046,9 +24475,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -24187,6 +24613,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -24199,6 +24628,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24778,12 +25210,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24949,7 +25387,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24976,6 +25414,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -25330,9 +25771,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25774,6 +26212,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25786,9 +26239,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25810,6 +26260,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25834,9 +26287,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25927,10 +26377,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25939,10 +26389,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -26101,16 +26551,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -26206,9 +26653,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -26263,6 +26707,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -26293,6 +26740,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -26317,9 +26767,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26410,6 +26857,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26455,9 +26905,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26494,6 +26941,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26677,9 +27127,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26839,21 +27295,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26866,18 +27349,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -27355,6 +27862,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -27379,7 +27889,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27388,22 +27898,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27412,12 +27922,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27439,10 +27952,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27538,6 +28051,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27556,6 +28072,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27646,6 +28165,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27730,12 +28252,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27754,7 +28270,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27862,6 +28381,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27982,6 +28504,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -28024,6 +28549,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -28063,9 +28591,6 @@ 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 ""
@@ -28156,18 +28681,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28600,6 +29119,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28612,6 +29149,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28978,6 +29524,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -29215,6 +29764,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29422,12 +29974,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29503,13 +30049,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29551,9 +30100,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29605,9 +30151,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29638,6 +30181,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29803,9 +30349,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29818,7 +30361,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29845,7 +30388,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29860,6 +30403,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29887,7 +30433,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29896,16 +30442,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29938,7 +30484,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -30025,13 +30571,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -30040,7 +30586,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -30049,16 +30595,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -30067,7 +30613,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -30103,7 +30649,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -30145,6 +30691,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -30223,7 +30772,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -30346,6 +30895,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30457,6 +31009,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30475,9 +31030,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30937,6 +31489,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -31075,6 +31630,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -31141,7 +31699,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -31201,7 +31759,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -31360,6 +31918,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -31372,6 +31933,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31693,6 +32257,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -32005,6 +32572,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -32092,9 +32662,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -32263,6 +32830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32656,9 +33226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32686,6 +33253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32788,6 +33358,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -33151,9 +33727,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -33238,6 +33811,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -33247,9 +33823,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -33343,6 +33916,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -33376,12 +33952,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33718,6 +34288,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33847,9 +34420,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33994,6 +34564,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -34084,6 +34663,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34780,6 +35374,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34795,7 +35392,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34840,6 +35437,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34864,9 +35464,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34963,9 +35569,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -35065,6 +35668,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -35089,18 +35695,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -35110,12 +35704,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -35155,6 +35743,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -35380,9 +35971,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35461,6 +36049,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35575,6 +36169,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35596,6 +36193,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35827,9 +36427,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35884,6 +36481,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35947,6 +36547,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -36214,6 +36817,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -36241,9 +36901,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -36259,6 +36916,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36580,6 +37240,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36775,9 +37438,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -37105,7 +37765,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37450,6 +38110,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37471,7 +38134,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37489,6 +38152,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37552,6 +38218,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37858,7 +38527,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -38032,6 +38704,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -38044,6 +38719,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -38119,9 +38809,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -38320,6 +39007,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38692,6 +39385,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38770,9 +39466,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38899,6 +39592,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38923,7 +39619,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -39085,6 +39781,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -39127,9 +39826,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -39160,21 +39856,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -39388,6 +40075,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -39433,6 +40123,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -40057,9 +40753,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -40177,7 +40870,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -40201,6 +40894,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -40252,9 +40948,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -40285,9 +40978,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -40297,9 +40987,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -40351,6 +41038,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40693,9 +41386,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40846,6 +41536,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40885,12 +41578,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40945,9 +41647,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -41104,9 +41803,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -41173,9 +41869,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -41263,6 +41956,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -41353,9 +42049,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -41365,9 +42058,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -41380,9 +42070,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -41410,6 +42097,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -41452,7 +42142,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41506,9 +42196,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41560,12 +42247,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41761,10 +42442,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41809,9 +42487,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41932,6 +42607,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42559,6 +43237,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42826,9 +43510,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42877,9 +43558,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43501,7 +44179,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -44101,6 +44779,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -44125,19 +44806,40 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -44149,10 +44851,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -44308,7 +45010,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44506,9 +45208,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44518,9 +45217,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44548,9 +45244,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44560,6 +45253,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44716,6 +45412,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44728,6 +45427,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44797,9 +45499,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44899,18 +45598,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44932,12 +45649,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -45169,12 +45880,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -45190,6 +45895,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -45247,9 +45955,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -45259,6 +45964,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -45331,6 +46042,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -45364,6 +46078,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -45409,6 +46126,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -45466,6 +46189,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45508,6 +46234,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45583,10 +46312,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45598,6 +46327,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45889,6 +46621,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45916,12 +46651,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45979,6 +46708,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -46099,6 +46831,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -46150,6 +46885,21 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -46483,6 +47233,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46594,6 +47350,9 @@ msgstr[5] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46612,9 +47371,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46660,6 +47416,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46858,6 +47617,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46897,6 +47662,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46933,12 +47704,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -47101,6 +47866,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -47326,6 +48094,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index 668affb677f..cb14bce855e 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d problemstilling importeret med etiketten"
msgstr[1] "%d problemstillinger importeret med etiketten"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d lag"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekund"
msgstr[1] "%d sekunder"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr "%{labelStart}Klasse:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Nedbrudsadresse:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Nedbrudstilstand:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Bevis:%{labelEnd} %{evidence}"
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr "%{scope} resultater for udtrykket '%{term}'"
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr "%{seconds} s"
@@ -1008,6 +1026,9 @@ msgstr[1] "%{strong_start}%{count} medlemmer%{strong_end} skal godkende for at s
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} udgivelse"
@@ -1045,6 +1066,9 @@ msgstr "%{timebox_type} understøtter ikke burnupdiagrammer"
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} skal have en start- og forfaldsdato"
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr "0 byte"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 dag"
@@ -1542,6 +1571,9 @@ msgstr "Et Jekyll-websted som bruger Netlify til CI/CD frem for GitLab, men stad
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Et Let's Encrypt SSL-certifikat kan ikke indhentes før dit domæne er bekræftet."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "En grundlæggende side og serverfri funktion der bruger AWS Lambda, AWS API Gateway og GitLab Pages"
@@ -1830,6 +1862,9 @@ msgstr "Acceptabelt til brug i projektet"
msgid "Access Git repositories or the API."
msgstr "Tilgå Git-depoter eller API'et."
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Adgangstokens"
@@ -1947,6 +1982,12 @@ msgstr "Ny"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "Tilgængeligsskanningen fandt en fejl med følgende type: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Konto"
@@ -2037,9 +2078,6 @@ msgstr "Tilføj CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Tilføj CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Tilføj Jaeger-URL"
-
msgid "Add Kubernetes cluster"
msgstr "Tilføj Kubernetes-klynge"
@@ -2070,9 +2108,6 @@ msgstr "Tilføj en GPG-nøgle"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 "Tilføj en Jaeger-URL for at erstatte siden med et link til din Jaeger-server. Du skal først %{link_start_tag}installere Jaeger%{link_end_tag}."
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr "Tilføj en aftale om vilkår for tjeneste og privatlivspolitik til brugere af GitLab-instansen."
@@ -2100,9 +2135,6 @@ msgstr "Tilføj en generel kommentar til denne %{noteableDisplayName}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Tilføj en startside til din wiki med information om dit projekt, så viser GitLab den her i stedet for denne meddelelse."
-msgid "Add a horizontal rule"
-msgstr "Tilføj en vandret streg"
-
msgid "Add a new issue"
msgstr "Tilføj en ny problemstilling"
@@ -2352,9 +2384,6 @@ msgstr "Tilføjet i denne version"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Tilføjelse af nye programmer er deaktiveret i din GitLab-instans. Kontakt din GitLab-administrator for at få tilladelsen"
-msgid "Additional Metadata"
-msgstr "Yderligere metadata"
-
msgid "Additional minutes"
msgstr "Yderligere minutter"
@@ -2604,6 +2633,9 @@ msgstr "Alle nye projekter kan bruge instansens delte runnere som standard."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domæne"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr "Feedtoken"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "Jeg har læst og accepteret Let's Encrypts %{link_start}Vilkår for tjeneste%{link_end} (PDF)."
@@ -2901,8 +2936,8 @@ msgstr "2FA deaktiveret"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA aktiveret"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "En bruger kan validere sig selv ved at indtaste et kredit-/debetkort eller en administrator kan validere en bruger manuelt."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr ""
msgid "AdminUsers|Access"
msgstr "Adgang"
@@ -2910,6 +2945,9 @@ msgstr "Adgang"
msgid "AdminUsers|Access Git repositories"
msgstr "Tilgå Git-depoter"
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr "Tilgå API'et"
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "Automatisk mærket som standard intern bruger"
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr "Udeluk bruger"
@@ -2979,6 +3020,9 @@ msgstr "Blokeret"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Blokering af brugeren har følgende indvirkninger:"
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "Kan ikke logge ind eller tilgå instansinformation"
@@ -3054,6 +3098,12 @@ msgstr "Det er dig!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr "Lær mere om %{link_start}udelukkede brugere%{link_end}."
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr "Personlige projekter efterlades"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Personlige projekter, grupper og brugerhistorik efterlades intakte"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Genaktivering af en bruger vil:"
@@ -3099,6 +3152,9 @@ msgstr "Afvis brugeren %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "Afviste brugere:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Gendan brugeradgang til kontoen, herunder web, Git og API."
@@ -3111,9 +3167,15 @@ msgstr "Søg efter brugere"
msgid "AdminUsers|Send email to users"
msgstr "Send e-mail til brugere"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "Sortér efter"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr "Brugeren kan ikke tilgå git-depoter."
@@ -3162,9 +3224,6 @@ msgstr "Oplås brugeren %{username}?"
msgid "AdminUsers|User administration"
msgstr "Brugeradministration"
-msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr "Brugeren er valideret og kan bruge gratis CI-minutter på delte runnere."
-
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Brugeren vil ikke være i stand til at tilgå git-depoter"
@@ -3183,6 +3242,9 @@ msgstr "Validér brugerkonto"
msgid "AdminUsers|View pending member requests"
msgstr "Vis afventende medlemsanmodninger"
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr "Hvad kan jeg gøre?"
@@ -3249,6 +3311,9 @@ msgstr "brugerloft"
msgid "Administration"
msgstr "Administration"
+msgid "Administrators"
+msgstr ""
+
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 "Yderligere brugere skal kontrolleres og godkendes af en systemadministrator. Lær mere om %{help_link_start}forbrugsloft%{help_link_end}."
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr "Alle brugere skal acceptere vilkår for tjeneste og privatlivspolitik for at tilgå GitLab"
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Tillad \"%{group_name}\" at logge dig ind"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr "Tillad adgang for medlemmer af følgende gruppe"
@@ -3789,9 +3851,6 @@ msgstr "Tillad projekter i gruppen at bruge Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr "Tillad offentlig adgang til pipelines og jobdetaljer, herunder outputlogge og artefakter."
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "Tillad undergrupper at indstille deres egne regler for totrinsgodkendelse"
-
msgid "Allow this key to push to this repository"
msgstr "Tillad nøglen at bruge push til depotet"
@@ -3804,9 +3863,6 @@ msgstr "Tillad brugere at afskedig broadcastmeddelelsen"
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr "Tilladt"
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr "MÃ¥ oprette:"
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "MÃ¥ mislykkes"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr "Tillader projekter eller undergrupper i gruppen at tilsidesætte den globale indstilling."
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Giver dig mulighed for at tilføje eller håndtere Kubernetes-klynger."
@@ -3984,6 +4046,9 @@ msgstr "Der opstod en fejl under hentning af Markdown-forhåndsvisning"
msgid "An error occurred while fetching ancestors"
msgstr "Der opstod en fejl under hentning af forfædre"
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr "Der opstod en fejl under indhentning af diff-filer"
msgid "An error occurred while retrieving projects."
msgstr "Der opstod en fejl under indhentning af projekter."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr "Der opstod en fejl under gemning af ændringer: %{error}"
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Der opstod en fejl under abonnering på underretninger."
@@ -4418,6 +4489,9 @@ msgstr "Programgrænser gemt"
msgid "Application settings saved successfully"
msgstr "Programindstillinger gemt"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "Opdatering af programindstillinger mislykkedes"
@@ -4804,8 +4878,8 @@ msgstr "Arkiveret projekt! Depotet og andre projektressourcer er skrivebeskyttet
msgid "Archived projects"
msgstr "Arkiverede projekter"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "Arkivering af projektet vil gøre det fuldstændigt skrivebeskyttet. Det skjules fra betjeningspanelet og vises ikke i søgninger. %{strong_start}Der kan ikke commites til depotet og der kan ikke oprettes problemstillinger, kommentarer og andre indslag.%{strong_end} %{link_start}Lær mere%{link_end}."
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr "Er du HELT SIKKER på, at du vil fjerne gruppen?"
@@ -4908,6 +4982,9 @@ msgstr "Er du sikker på, at du vil fjerne %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Er du sikker på, at du vil fjerne %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Er du sikker på, at du vil fjerne vedhæftningen?"
@@ -4926,6 +5003,9 @@ msgstr "Er du sikker på, at du vil fjerne listen?"
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Er du sikker på, at du vil nulstille tokenen til sundhedstjek?"
@@ -5043,6 +5123,9 @@ msgstr "Tildel etiketter"
msgid "Assign milestone"
msgstr "Tildel milepæl"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr "Tildel kontrollant"
@@ -5138,9 +5221,6 @@ msgstr "I fare"
msgid "Attach a file"
msgstr "Vedhæft en fil"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Vedhæft en fil ved at trække og slippe, eller %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr "Vedhæfter fil - %{progress}"
@@ -5212,6 +5292,9 @@ msgstr "Denne måned"
msgid "AuditLogs|User Events"
msgstr "Brugerbegivenheder"
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "Aug."
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Vær forsigtig. Omdøbning af et projekts depot kan have utilsigtede bivirkninger."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr "Indlæser epics"
msgid "Bold text"
msgstr "Fed tekst"
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr "forventede et tilknyttet projekt men har en tilknyttet gruppe"
msgid "BulkImport|must be a group"
msgstr "skal være en gruppe"
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr "Burndowndiagram"
@@ -6868,6 +6972,9 @@ msgstr "%{percent} %{percentSymbol}"
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr "Udsendelseshyppighed"
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr "Noget gik galt under hentning af udgivelsesstatistik"
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr "Ændrer titlen til \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr "GitLab-plan"
msgid "Checkout|Group"
msgstr "Gruppe"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Navn på virksomhed eller organisation som bruger GitLab"
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr "Afgift"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr "I alt"
@@ -7774,6 +7887,9 @@ msgstr "Underepicen findes ikke."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr "Understøttelse af kinesisk sprog med"
@@ -8148,6 +8264,9 @@ msgstr "Lukket %{epicTimeagoDate}"
msgid "Closed MRs"
msgstr "Lukkede sammenlægningsanmodninger"
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Lukkede problemstillinger"
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr "Klynge"
@@ -8175,9 +8411,6 @@ msgstr "Klyngehelbred"
msgid "Cluster cache cleared."
msgstr "Klyngemellemlager ryddet."
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr "Klynge kræves for Stages::ClusterEndpointInserter"
@@ -8543,9 +8776,6 @@ msgstr "Avancerede valgmuligheder på Kubernetes-klyngens integrering"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr "Tjek din token"
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "Ryd klyngemellemlager"
@@ -8630,9 +8863,6 @@ msgstr "Vidste du det?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr "Kodekontrol"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr "Kodekontrolanalyse viser en tabel over åbne sammenlægningsanmodninger, som anses for at være under kodekontrol. Der er i øjeblikket ingen sammenlægningsanmodninger under kontrol for projektet og/eller filtrene."
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr "Konfigurer afhængighedsskanning i `.gitlab-ci.yml` med den GitLab-hånd
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,12 +9663,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-msgstr "Konfigurer tracing"
-
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 "Konfigurer en %{codeStart}.gitlab-webide.yml%{codeEnd}-fil i mappen %{codeStart}.gitlab%{codeEnd} for at komme i gang med webterminal. %{helpStart}Lær mere%{helpEnd}."
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr ""
@@ -9610,9 +9858,6 @@ msgstr "Beholderregister"
msgid "Container Scanning"
msgstr "Beholderskanning"
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr "Beholder skal være et projekt eller en gruppe."
@@ -9832,9 +10077,6 @@ msgstr "Fjern mærkater som er ældre end:"
msgid "ContainerRegistry|Remove these tags"
msgstr "Fjern disse mærkater"
-msgid "ContainerRegistry|Root image"
-msgstr "Rodaftryk"
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr "Opret ny etiket"
msgid "Create new project"
msgstr "Opret nyt projekt"
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr "Dato"
@@ -11295,6 +11546,15 @@ msgstr "Ingen sammenlægningsanmodninger blev udsendt i perioden"
msgid "DORA4Metrics|Number of deployments"
msgstr "Antal udsendelser"
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr "Noget gik galt under hentning af udsendelseshyppighedsdata."
@@ -11343,15 +11603,15 @@ 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 "DAST-indstillinger"
+msgid "DastConfig|DAST CI/CD configuration"
+msgstr ""
+
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
+msgstr ""
msgid "DastConfig|Generate code snippet"
msgstr "Generer kodeudklip"
-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 ""
@@ -11481,6 +11741,9 @@ msgstr "Skjul fejlfindingsmeddelelser"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr "Medtag fejlfindingsmeddelelser i DAST-konsoloutputtet."
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr "HÃ¥ndter profiler"
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr "Standardgren"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr "Standardbeskrivelsesskabelon for problemstillinger"
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr "Definition"
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr "Er du sikker på, at du vil køre %{jobName} straks? Ellers kører jobbet automatisk når dets timer er færdig."
@@ -12008,9 +12268,6 @@ msgstr "Slet kommentar"
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr "Slet nøgle"
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr "Slet aftryksdepot"
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr "Slet etiket"
@@ -12167,6 +12427,33 @@ msgstr "Sletning af projektet vil slette dets depot og alle relaterede ressource
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr "Afventer sletning. Projektet vil blive slettet %{date}. Depotet og andre projektressourcer er skrivebeskyttet."
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr "Afvist"
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "Kunne ikke tilføje en ny kommentar. Prøv venligst igen."
@@ -12867,9 +13145,6 @@ msgstr "Behold ændringer"
msgid "DesignManagement|Keep comment"
msgstr "Behold kommentar"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr "Lær mere om at løse kommentarer"
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr "Detaljer"
msgid "Details (default)"
msgstr "Detaljer (standard)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "Registrer værtsnøgler"
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr "Deaktivér for projektet"
msgid "Disable group runners"
msgstr "Deaktivér grupperunnere"
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr "URL for dokumentationssider"
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr "Dokumenter genindekseret: %{processed_documents} (%{percentage} %%)"
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,12 +13894,12 @@ msgstr "Hvert projekt kan også have en problemstillingsporing og en wiki."
msgid "Edit"
msgstr "Rediger"
-msgid "Edit %{issuable}"
-msgstr "Rediger %{issuable}"
-
msgid "Edit %{name}"
msgstr "Rediger %{name}"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "Rediger kommentar"
@@ -13652,9 +13927,6 @@ msgstr "Rediger adgangskode"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "Rediger udgivelse"
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr "Indlejr"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr "Indlejr et aftryk af din eksisterende Jaeger-server i GitLab."
-
msgid "Empty file"
msgstr "Tom fil"
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "Aktivér Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr "Aktivér Gitpod"
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr "Aktivér forsinket projektsletning som standard for nyligt oprettede grupper."
-
msgid "Enable email notification"
msgstr "Aktivér e-mail-underretning"
@@ -14147,9 +14413,6 @@ msgstr "Aktivér Git-adgangsprotokoller"
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr "Stødte på en fejl under gengivelse: %{err}"
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr "Miljø kræves for Stages::MetricEndpointInserter"
@@ -14372,12 +14632,6 @@ msgstr "Stopper automatisk %{autoStopAt}"
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr "Viser i øjeblikket alle resultater."
-
msgid "Environments|Delete"
msgstr "Slet"
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Job"
@@ -14426,9 +14677,6 @@ msgstr "Lær om miljøer"
msgid "Environments|Learn more about stopping environments"
msgstr "Lær mere om at stoppe miljøer"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Nyt miljø"
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr "Ingen pod valgt"
-
-msgid "Environments|No pods to display"
-msgstr "Ingen pods at vise"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,11 +14695,8 @@ msgstr "Ã…bne"
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr "Podnavn"
-
-msgid "Environments|Re-deploy"
-msgstr "Genudsend"
+msgid "Environments|Re-deploy environment"
+msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
msgstr "Genudsend miljøet %{name}?"
@@ -14465,18 +14704,12 @@ msgstr "Genudsend miljøet %{name}?"
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr "Tilbagerul"
-
msgid "Environments|Rollback environment"
msgstr "Tilbagerul miljø"
msgid "Environments|Rollback environment %{name}?"
msgstr "Tilbagerul miljøet %{name}?"
-msgid "Environments|Select pod"
-msgstr "Vælg pod"
-
msgid "Environments|Show all"
msgstr "Vis alle"
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr "Der opstod en fejl ved hentning af loggene. Prøv venligst igen."
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr "Noget gik galt under fjernelse af problemstilling fra epic."
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr "Fejl: kan ikke slette udsendelsesfrysning"
msgid "Error: Unable to find AWS role for current user"
msgstr "Fejl: kan ikke finde AWS-rolle for nuværende bruger"
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "Aktiv"
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr "Alle med adgang"
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "Alle kan bidrage"
@@ -15262,8 +15501,8 @@ msgstr "Udløbet:"
msgid "Expires"
msgstr "Udløber"
-msgid "Expires in %{expires_at}"
-msgstr "Udløber om %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr ""
msgid "Expires on"
msgstr "Udløber"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr "Ekstern wiki"
@@ -15448,6 +15690,11 @@ msgstr "Mislykket"
msgid "Failed Jobs"
msgstr "Mislykkede job"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr "Mislykket"
@@ -16127,8 +16374,11 @@ msgstr "Find efter sti"
msgid "Find file"
msgstr "Find fil"
-msgid "Fingerprint"
-msgstr "Fingeraftryk"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
+msgstr ""
msgid "Fingerprints"
msgstr "Fingeraftryk"
@@ -16136,6 +16386,9 @@ msgstr "Fingeraftryk"
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "For mere information, gå til "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr "Synlighedsniveau"
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr "Afventer verificering"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr "Primære knudepunkt"
-
msgid "Geo|Primary site"
msgstr "Primære websted"
-msgid "Geo|Project"
-msgstr "Projekt"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr "Sekundære knudepunkt"
-
msgid "Geo|Secondary site"
msgstr "Sekundært websted"
@@ -16938,9 +17176,6 @@ msgstr "Lagerkonfiguration"
msgid "Geo|Synced"
msgstr "Synkroniseret"
-msgid "Geo|Synced at"
-msgstr "Synkroniseret kl."
-
msgid "Geo|Synchronization"
msgstr "Synkronisering"
@@ -17133,6 +17368,42 @@ msgstr "Igangværende Git-overførsel"
msgid "Git version"
msgstr "Git-version"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr "GitLab-opkrævningsteam."
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr "GitLab-brugernavn"
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr "GitLab bruger %{jaeger_link} til at overvåge distribuerede systemer."
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr "GitLab bruger %{linkStart}Sidekiq%{linkEnd} til at behandle baggrundsjob"
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr "Ubekræftet"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr "Verificeret"
@@ -17454,9 +17728,15 @@ msgstr "Globale genveje"
msgid "Global notification settings"
msgstr "Globale underretningsindstillinger"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr "Gravatar aktiveret"
msgid "Group"
msgstr "Gruppe"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr "Gruppen %{group_name} kunne ikke eksporteres."
@@ -17931,6 +18223,9 @@ msgstr "Gruppen blev opdateret."
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "Gruppe: %{group_name}"
@@ -17940,8 +18235,8 @@ msgstr "Gruppe: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
-msgstr "Sidste 90 dage"
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr ""
msgid "GroupActivityMetrics|Members added"
msgstr "Medlemmer tilføjet"
@@ -18207,18 +18502,15 @@ msgstr "Søg efter grupper"
msgid "GroupSelect|Select a group"
msgstr "Vælg en gruppe"
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,33 +18541,45 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr "Tilpassede projektskabeloner"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr "Tilpas gruppens badges."
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
-msgstr "Deaktivér e-mail-underretninger"
-
-msgid "GroupSettings|Disable group mentions"
-msgstr ""
-
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr "Aktivér forsinket sletning af projekt"
-
msgid "GroupSettings|Export group"
msgstr "Eksportér gruppe"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
+msgstr ""
+
+msgid "GroupSettings|Group mentions are disabled"
+msgstr ""
+
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|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18291,22 +18595,13 @@ msgstr "Forhindr forgrening uden for gruppen"
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr "Indstillingen forhindr forgrening blev ikke gemt"
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "Forhindr deling af et projekt i %{group} med andre grupper"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr "Forhindrer gruppemedlemmer i at blive underrettet hvis gruppen nævnes."
-
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
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 ""
-
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr "Vælg en undergruppe som skal bruges som kilden til tilpassede projektsk
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr "Auto DevOps-pipelinen kører hvis ingen alternativ CI-konfigurationsfil bliver fundet."
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr "Indstillingen anvendes på %{ancestor_group}. Du kan tilsidesætte indst
msgid "GroupSettings|Transfer group"
msgstr "Overfør gruppe"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr "Importér gruppe"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr "Min fantastiske gruppe"
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,12 +19263,12 @@ msgstr "Startside"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
-msgstr "Hook blev oprettet."
-
msgid "Hook was successfully updated."
msgstr "Hook blev opdateret."
+msgid "Horizontal rule"
+msgstr ""
+
msgid "Hostname"
msgstr "Værtsnavn"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "Time (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "Husarbejde"
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr "Alertbeskeddetaljer"
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr "Er du sikker på, at du vil slette billedet?"
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr "MÃ¥linger"
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Opsummering"
@@ -20291,6 +20664,12 @@ msgstr "Der opstod et problem ved indlæsning af hændelsesdata. Prøv venligst
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr "Indsæt"
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr "Indsæt et citat"
@@ -20563,6 +20939,9 @@ msgstr "Alle projekter som nedarver indstillingerne nulstilles også."
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr "Der opstod en fejl under indlæsning af projekter med tilpassede indstillinger."
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,11 +20954,14 @@ msgstr "Kommentardetalje:"
msgid "Integrations|Comment settings:"
msgstr "Kommentarindstillinger:"
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
-msgstr "Forbindelse mislykkedes. Tjek venligst dine indstillinger."
+msgid "Integrations|Connection failed. Check your integration settings."
+msgstr ""
msgid "Integrations|Connection successful."
msgstr ""
@@ -20671,6 +21053,9 @@ msgstr "Ingen tilgængelige navnerum."
msgid "Integrations|No linked namespaces"
msgstr "Ingen linkede navnerum"
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr "Projekter som bruger tilpassede indstillinger"
@@ -20686,6 +21071,9 @@ msgstr "Nulstil integrering?"
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr "Nulstilling af integreringen rydder indstillingerne og deaktiverer integreringen."
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr "Vend tilbage til GitLab for Jira"
@@ -20731,6 +21119,9 @@ msgstr "Integreringen og nedarvede projekter blev nulstillet."
msgid "Integrations|To keep this project going, create a new issue."
msgstr "Opret en ny problemstilling for at holde projektet i gang."
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr "Brug tilpassede indstillinger"
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr "Ugyldig URL"
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr "Ugyldig container_name"
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr "Ugyldig dato"
@@ -20875,9 +21260,6 @@ msgstr "Ugyldig periode"
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr "Ugyldig pod_name"
-
msgid "Invalid policy type"
msgstr "Ugyldig regelsættype"
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr "Ugyldig depotsti"
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr "Ugyldigt serversvar"
-msgid "Invalid start or end time format"
-msgstr "Ugyldigt format for start- og sluttidspunkt"
-
msgid "Invalid status"
msgstr "Ugyldig status"
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Søg efter en grupper som skal inviteres"
@@ -21046,6 +21428,11 @@ msgstr "Vælg medlemmer eller skriv e-mailadresser"
msgid "InviteMembersModal|Something went wrong"
msgstr "Noget gik galt"
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr "Inviteret"
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr "URL for ny problemstilling"
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr "URL'en til at oprette en problemstilling i den eksterne problemstillingsporing."
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr "URL'en til projektet i YouTrack."
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr "URL'en til projektet i den eksterne problemstillingsporing."
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr "URL'en til at vise en problemstilling i YouTrack-projektet. Skal indeholde %{colon_id}."
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr "URL'en til at vise en problemstilling i den eksterne problemstillingsporing. Skal indeholde %{colon_id}."
@@ -21667,9 +22051,6 @@ msgstr "Datoer kan ikke overlappe andre eksisterende gennemløb i gennemløbskad
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "må ikke være mere end 500 år ud i fremtiden"
-msgid "Jaeger URL"
-msgstr "Jaeger-URL"
-
msgid "Jan"
msgstr "Jan."
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr "Opret gren til Jira-problemstillingen %{jiraIssue}"
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "Du kan nu lukke vinduet og vende tilbage til Jira."
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "Behold"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr "Rul nederst"
msgid "Job|Scroll to top"
msgstr "Rul øverst"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "må mislykkes"
@@ -22252,9 +22660,6 @@ msgstr "Kroki"
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr "Kubernetes-klynge"
@@ -22330,6 +22735,11 @@ msgstr "Etiket"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr "Etiketprioritet"
@@ -22554,9 +22964,6 @@ msgstr "Lær GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr "Lær GitLab - Ultimate-prøveperiode"
-msgid "Learn GitLab|Trial only"
-msgstr "Kun prøveperiode"
-
msgid "Learn More"
msgstr "Lær mere"
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr "Lær mere"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr "Lær mere om %{link_start_tag}Jaeger-konfiguration%{link_end_tag}."
-
msgid "Learn more about %{username}"
msgstr "Lær mere om %{username}"
@@ -22635,21 +23039,21 @@ msgstr "%{percentage} %{percentSymbol} fuldført"
msgid "LearnGitLab|Add code owners"
msgstr "Tilføj kodeejere"
-msgid "LearnGitLab|Add merge request approval"
-msgstr "Tilføj sammenlægningsanmodningsgodkendelse"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
+msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
+msgid "LearnGitLab|Create a repository"
+msgstr ""
+
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
msgid "LearnGitLab|Create an issue"
msgstr "Opret en problemstilling"
-msgid "LearnGitLab|Create or import a repository"
-msgstr ""
-
msgid "LearnGitLab|Create or import your first repository into your new project."
msgstr "Opret eller importér dit første depot i dit nye projekt."
@@ -22692,23 +23096,26 @@ msgstr "Kør en sikkerhedsskanning med CI/CD"
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr ""
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr ""
+
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
msgid "LearnGitLab|Set up CI/CD"
msgstr "Opsæt CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
+msgstr ""
+
msgid "LearnGitLab|Set up your workspace"
msgstr "Opsæt dit arbejdsområde"
-msgid "LearnGitLab|Set-up CI/CD"
-msgstr "Opsæt CI/CD"
-
-msgid "LearnGitLab|Start a free Ultimate trial"
-msgstr "Start en gratis Ultimate-prøveperiode"
-
-msgid "LearnGitLab|Submit a merge request"
-msgstr "Indsend en sammenlægningsanmodning"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
+msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
msgstr ""
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr "Kun prøveperiode"
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr "Logo fjernes. Er du sikker?"
msgid "Logs"
msgstr "Logge"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr "Gør problemstillingen fortrolig."
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr "HÃ¥ndter web-IDE-funktioner."
msgid "Manage access"
msgstr "HÃ¥ndter adgang"
-msgid "Manage all notifications"
-msgstr "HÃ¥ndter alle underretninger"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr "Mærkede problemstillingen som et duplikat af %{duplicate_param}."
@@ -23487,6 +23888,9 @@ msgstr "Mærkede gøremål som færdig."
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr "Mærker problemstillingen som et duplikat af %{duplicate_reference}."
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,8 +24639,8 @@ msgstr "Fejl ved indlæsning af hele diff'en. Prøv venligst igen."
msgid "MergeRequest|No files found"
msgstr "Ingen filer fundet"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
-msgstr "Søg efter filer (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgstr ""
msgid "Merged"
msgstr "Sammenlagt"
@@ -24256,6 +24666,9 @@ msgstr "Sammenlægger straks sammenlægningsanmodningen."
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr "Meddelelse"
@@ -24606,9 +25019,6 @@ msgstr "Værdier"
msgid "Metrics|View documentation"
msgstr "Vis dokumentation"
-msgid "Metrics|View logs"
-msgstr "Vis logge"
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr "Multiprojekt"
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr "Mit emne"
msgid "My-Reaction"
msgstr "Min-reaktion"
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr "Navn"
@@ -25106,9 +25531,6 @@ msgstr "Navnerum"
msgid "Namespace ID:"
msgstr "Navnerums-id:"
-msgid "Namespace is empty"
-msgstr "Navnerummet er tomt"
-
msgid "Namespace:"
msgstr "Navnerum:"
@@ -25195,10 +25617,10 @@ msgstr "Navigationslinje"
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,18 +25787,15 @@ msgstr "Ny epic"
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Ny fil"
msgid "New group"
msgstr "Ny gruppe"
-msgid "New group URL"
-msgstr "URL for ny gruppe"
-
-msgid "New group name"
-msgstr "Nyt gruppenavn"
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr "Ny(t) ..."
-
msgid "Newest first"
msgstr "Nyeste først"
@@ -25527,6 +25943,9 @@ msgstr "Ingen milepæl"
msgid "No Scopes"
msgstr "Ingen omfang"
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr "Ingen tilgængelige grene"
msgid "No branches found"
msgstr "Ingen grene fundet"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Ingen ændringer"
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Der kunne ikke oprettes forbindelse til a Gitaly-server. Tjek venligst dine logge!"
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr "Ingen bidrag"
@@ -25674,6 +26093,9 @@ msgstr "Ingen licens. Alle rettigheder forbeholdt"
msgid "No matches found"
msgstr "Ingen match fundet"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr "Ingen forældergruppe"
msgid "No plan"
msgstr "Ingen plan"
-msgid "No pods available"
-msgstr "Ingen pods tilgængelige"
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr "Ingen relaterede sammenlægningsanmodninger fundet."
msgid "No repository"
msgstr "Intet depot"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr "Er du sikker på, at du vil annullere oprettelse af kommentaren?"
msgid "Notes|Collapse replies"
msgstr "Sammenfold svar"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr "Underretninger fra"
msgid "Notifications on"
msgstr "Underretninger til"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr "Underret brugere med e-mail når indlogningsplacering ikke genkendes."
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "Nov."
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] "Et element mere"
msgstr[1] "%d elementer mere"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,23 +27110,23 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr "Kun projektmedlemmer"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
-msgstr "Kun administratorer kan slette projektet"
+msgid "Only active projects show up in the search and on the dashboard."
+msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr ""
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr "Kun regelsæt:"
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "Driftbetjeningspanelet giver en opsummering over hvert projekts driftssundhed, herunder pipeline- og alertbeskedstatusser."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimer dit workflow med CI-/CD-pipelines"
@@ -26796,6 +27284,9 @@ msgstr "Valgmuligheder"
msgid "Or you can choose one of the suggested colors below"
msgstr "Eller du kan vælge en af de foreslåede farver nedenunder"
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr "Ejet af:"
msgid "Owner"
msgstr "Ejer"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr "Pakketype skal være PyPi"
msgid "Package type must be RubyGems"
msgstr "Pakketype skal være RubyGems"
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr "Tilføj NuGet-kilde"
msgid "PackageRegistry|Add composer registry"
msgstr "Tilføj composer-register"
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr "Slet pakke"
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr "Fjern pakke"
@@ -27260,6 +27757,9 @@ msgstr "Noget gik galt under sletning af pakken."
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Beklager, dit filter gav ingen resultater"
@@ -27299,9 +27799,6 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr "Kan ikke indlæse 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 "Du er ved at slette %{filename}. Det er en destruktiv handling der kan gøre din pakke ubrugelig. Er du sikker?"
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr "Forælder"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr "Forælderepic findes ikke."
msgid "Parent epic is not present."
msgstr "Forælderepic er ikke tilstede."
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr "Brug skabelon"
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr "URL for PlantUML"
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Afspil"
@@ -28658,12 +29182,6 @@ msgstr "Vent venligst mens vi opretter forbindelse til dit depot. Opdater efter
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Vent venligst mens vi importerer depotet for dig. Opdater efter ønske."
-msgid "Pod does not exist"
-msgstr "Pod findes ikke"
-
-msgid "Pod not found"
-msgstr "Pod ikke fundet"
-
msgid "Pods in use"
msgstr "Pods i brug"
@@ -28739,14 +29257,17 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Konfigurer hvordan datoer og klokkeslæt vises for dig."
msgid "Preferences|Customize integrations with third party services."
msgstr "Tilpas integreringer med tjenester fra tredjepart."
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "Tilpas udseendet på programheaderen og navigationssidebjælken."
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr ""
@@ -28787,9 +29308,6 @@ msgstr "Bredde på layout"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Skal være et tal fra %{min} til %{max}"
-msgid "Preferences|Navigation theme"
-msgstr "Tema for navigation"
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr "Forrige"
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr "Forhindr automatisk stop"
@@ -28874,6 +29389,9 @@ msgstr "Forhåndsvis Markdown"
msgid "Preview changes"
msgstr "Forhåndsvis ændringer"
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr "Kontoen kunne ikke slettes. GitLab var ikke i stand til at bekræfte din
msgid "Profiles|Account scheduled for removal."
msgstr "Kontoen er planlagt til fjernelse."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Aktivér indlogning med en af følgende tjenester"
-
msgid "Profiles|Active"
msgstr "Aktiv"
@@ -29054,8 +29569,8 @@ msgstr "Tilføj statusemoji"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr "Der opstod en fejl under opdatering af dit brugernavn. Prøv venligst igen."
-msgid "Profiles|An indicator appears next to your name and avatar"
-msgstr "Der vises en indikator ved siden af dit navn og din avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
+msgstr ""
msgid "Profiles|Avatar cropper"
msgstr "Beskæring af avatar"
@@ -29081,7 +29596,7 @@ msgstr "Ændring af dit brugernavn kan have utilsigtede bivirkninger."
msgid "Profiles|Choose file..."
msgstr "Vælg fil ..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "Forbundne kontoer"
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr "Vis ikke i profil"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr "Rediger profil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "Indtast dit navn, så dem du kender kan genkende dig"
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,8 +29692,8 @@ msgstr "Medtag private bidrag på min profil"
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "Forbedr sikkerheden på din konto ved at aktivere totrinsgodkendelse (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
msgid "Profiles|Invalid password"
msgstr "Ugyldig adgangskode"
@@ -29261,14 +29779,14 @@ msgstr "Fjern avatar"
msgid "Profiles|Select a service to sign in with."
msgstr ""
+msgid "Profiles|Service sign-in"
+msgstr ""
+
msgid "Profiles|Set new profile picture"
msgstr "Indstil nyt profilbillede"
-msgid "Profiles|Set your local time zone"
-msgstr "Indstil din lokale tidszone"
-
-msgid "Profiles|Social sign-in"
-msgstr "Socialt indlogning"
+msgid "Profiles|Set your local time zone."
+msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "Nogle valgmuligheder er utilgængelige for LDAP-kontoer"
@@ -29276,8 +29794,8 @@ msgstr "Nogle valgmuligheder er utilgængelige for LDAP-kontoer"
msgid "Profiles|Static object token was successfully reset"
msgstr "Statisk objekttoken blev nulstillet"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "Fortæl os om dig selv med færre end 250 tegn"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
@@ -29285,17 +29803,17 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "Den maksimale tilladte filstørrelse er 200 KB."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "E-mailen vises på din offentlige profil"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Emojien og meddelelsen vises i din profil og overalt i brugerfladen."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Informationen vises i din profil"
+msgid "Profiles|This information will appear on your profile."
+msgstr ""
msgid "Profiles|Time settings"
msgstr "Tidsindstillinger"
@@ -29303,8 +29821,8 @@ msgstr "Tidsindstillinger"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
-msgstr "Totrinsgodkendelse"
+msgid "Profiles|Two-factor authentication"
+msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Skriv din %{confirmationValue} for at bekræfte:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "Hvad er din status?"
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr "Din placering blev automatisk indstillet baseret på din %{provider_labe
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "Din status"
@@ -29459,7 +29980,7 @@ msgstr "Projektskabeloner"
msgid "Project URL"
msgstr "Projekt-URL"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr "Vedligeholdere"
msgid "ProjectCreationLevel|No one"
msgstr "Ingen"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Navn"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr "Vælg et projekt"
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr "Indtast ny adgangskode."
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr "Hvad er badges?"
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projekter delt med %{group_name}"
@@ -30377,8 +30907,8 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr "Opret"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
-msgstr "Opret et tomt projekt til blandt andet at opbevare dine filer, planlægge dit arbejde og samarbejde om kode."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
+msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
msgstr ""
@@ -30437,7 +30967,7 @@ msgstr "Kør CI/CD for eksternt depot"
msgid "ProjectsNew|Visibility Level"
msgstr "Synlighedsniveau"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr "Køb EE"
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr "Køb GitLab Enterprise Edition"
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr "Kontakt en ejer af gruppen %{namespace_name} for at opgradere planen."
@@ -30608,6 +31141,9 @@ msgstr "Kontakt din administrator for at opgradere din licens."
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr "Protip: %{linkStart}Auto DevOps%{linkEnd} bruger Kubernetes-klynger til at udsende din kode!"
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr "Rebase"
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr "Rebase i gang"
@@ -31328,9 +31870,6 @@ msgstr "Referencer"
msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
msgstr ""
-msgid "Refresh"
-msgstr "Opdater"
-
msgid "Refresh the page and try again."
msgstr "Opdater siden og prøv igen."
@@ -31491,6 +32030,9 @@ msgstr "Udgivelsesmaterialer"
msgid "Release assets documentation"
msgstr "Dokumentation for udgivelsesmaterialer"
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr "Genåbner denne %{quick_action_target}."
msgid "Replace"
msgstr "Erstat"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr "Erstat %{name}"
@@ -31914,6 +32453,9 @@ msgstr "Erstatter roden af klonings-URL."
msgid "Replication"
msgstr "Replikation"
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr "Besvar via e-mail"
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr "Klassenavn"
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr "Anmodninger pr. periode"
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr "Krævede godkendelser (%{approvals_given} givet)"
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr "Nulstil"
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr "Nulstil filtre"
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr "Nulstil adgangskode"
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr "Prøv job igen"
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Prøv jobbet igen"
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr "IP-adresse"
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr "Revision"
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr "Runner"
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr "SAML-opdagelsestokens"
msgid "SAML for %{group_name}"
msgstr "SAML for %{group_name}"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr "SAST-konfiguration"
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr "Tilføj regel"
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr "Beskrivelse"
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr "Ændr status"
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Kommentar tilføjet til '%{vulnerabilityName}'"
@@ -34500,9 +35063,6 @@ msgstr "Værktøj"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr "Vælg en gren"
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr "Vælg kilde"
msgid "Select source branch"
msgstr "Vælg kildegren"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr "Vælg startdato"
@@ -34716,6 +35285,9 @@ msgstr "Vælg målgren"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr "Vælg tidszone"
@@ -34947,9 +35519,6 @@ msgstr "Indstil adgangstilladelser for tokenen."
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr "Indstil forfaldsdato"
@@ -35004,6 +35573,9 @@ msgstr "Indstil målgren"
msgid "Set target branch to %{branch_name}."
msgstr "Indstil målgren til %{branch_name}."
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr "Opsæt ny adgangskode"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Opsæt dit projekt til automatisk at bruge push og/eller pull på ændringer til/fra et andet depot. Grene, mærkater og commits synkroniseres automatisk."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr "Indstil vægt"
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr "Viser alle epics"
msgid "Showing all issues"
msgstr "Viser alle problemstillinger"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr "Viser seneste version"
msgid "Showing version #%{versionNumber}"
msgstr "Viser version #%{versionNumber}"
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "Side om side"
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr "Snowplow"
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr "Løsning"
@@ -35887,9 +36522,6 @@ msgstr "Noget fik galt under fornyelse af dit automatiske abonnement."
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Noget gik galt, kan ikke tilføje %{project} til betjeningspanel"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr "Noget gik galt, kan ikke tilføje projekter til betjeningspanel"
-
msgid "Something went wrong, unable to delete project"
msgstr "Noget gik galt, kan ikke slette projekt"
@@ -36217,8 +36849,8 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr "Gør dine pipelines hurtigere med behovrelationer"
-msgid "Spent At"
-msgstr "Brugt kl."
+msgid "Spent at"
+msgstr ""
msgid "Squash commit message"
msgstr "Squash commit-meddelelse"
@@ -36562,6 +37194,9 @@ msgstr "Lager:"
msgid "StorageSize|Unknown"
msgstr "Ukendt"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr "Gennemstreget"
@@ -36583,8 +37218,8 @@ msgstr "Undergruppemilepæl"
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr "MÃ¥ oprette undergrupper"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
msgstr "MÃ¥ oprette undergrupper"
@@ -36601,6 +37236,9 @@ msgstr "Undergrupper"
msgid "Subgroups and projects"
msgstr "Undergrupper og projekter"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr "Abonnerer til denne %{quick_action_target}."
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr "Abonnement"
@@ -36970,8 +37611,11 @@ msgstr "Suite"
msgid "Summary"
msgstr "Opsummering"
-msgid "Summary / Note"
-msgstr "Opsummering/bemærkning"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
+msgstr ""
msgid "Sunday"
msgstr "Søndag"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr "Support"
@@ -37152,6 +37799,21 @@ msgstr "URL for supportside"
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr "Systemstandard (%{default})"
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr "Systemhooken blev opdateret."
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr "Opgave-id: %{elastic_task}"
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr "Vedhæftning"
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr "Det var det, godt gået!"
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "Datakilden er tilsluttet men der er ingen data at vise. %{documentationLink}"
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr "Det domæne du indtastede er ikke tilladt."
msgid "The download link will expire in 24 hours."
msgstr "Downloadlinket vil udløbe om 24 timer."
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "Den maksimale tilladte filstørrelse er %{size}."
@@ -38199,9 +38870,6 @@ msgstr "Navnet på Jenkins-projektet. Kopiér navnet fra slutningen af URL'en ti
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr "Antal sammenlægningsanmodninger som er blevet sammenlagt pr. måned."
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr "Projektet kan tilgås af alle brugere som er logget ind undtagen eksterne brugere."
-msgid "The project can be accessed by any user who is logged in."
-msgstr "Projektet kan tilgås af alle brugere som er logget ind."
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr "Projektet er stadigvæk ved at blive slettet. Prøv venligst igen senere."
@@ -38460,6 +39119,9 @@ msgstr "Der er endnu ingen pakker"
msgid "There are no projects shared with this group yet"
msgstr "Der er ingen projekter som er delt med gruppen endnu"
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr "Der er for meget data at udregne. Ændr venligst din markering."
msgid "There was a problem communicating with your device."
msgstr "Der var problemer med at kommunikere med din enhed."
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr "Der var problemer med at hente grene."
@@ -39129,9 +39797,6 @@ msgstr "Jobbet kræver en manuel handling"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr "Projektet slettes %{date}"
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
msgstr "Projektet vil blive slettet %{date} eftersom dets forældergruppe '%{parent_group_name}' er blevet planlagt til sletning."
-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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr "Runneren vil kun køre på pipelines som er udløst på beskyttede grene
msgid "This setting can be overridden in each project."
msgstr "Indstillingen kan tilsidesættes i hvert projekt."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr "Det vil omdirigere dig til en ekstern indlogningsside."
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr "Det vil fjerne forgreningsrelationen mellem projektet og %{fork_source}."
@@ -39357,9 +40022,6 @@ msgstr "Tidspunkt"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr "Tid brugt"
-
msgid "Time based: Yes"
msgstr "Tidsbaseret: Ja"
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "Tid mellem oprettelse af sammenlægningsanmodning og sammenlægning/lukning"
@@ -39423,6 +40082,12 @@ msgstr "Est."
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Estimatet:"
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr "Log ind på GitLab på %{gitlab_url} for at genaktivere din konto."
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr "Genveje til/fra"
msgid "Toggle sidebar"
msgstr "Sidebjælke til/fra"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr "Ydelseslinje til/fra"
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr "GÃ¥ tilbage"
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr "1000+"
-msgid "Tracing"
-msgstr "Tracing"
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr "Antal ansatte"
msgid "Trial|Please select a country"
msgstr "Vælg venligst et land"
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr "Telefonnummer"
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "Fejlsøg og overvåg dit program med tracing"
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr "Totrinsgodkendelse er blevet deaktiveret for brugeren"
@@ -40417,9 +41085,6 @@ msgstr "Kan ikke indsamle information om CPU"
msgid "Unable to collect memory info"
msgstr "Kan ikke indsamle information om hukommelse"
-msgid "Unable to connect to Elasticsearch"
-msgstr "Kan ikke oprette forbindelse til Elasticsearch"
-
msgid "Unable to connect to Prometheus server"
msgstr "Kan ikke oprette forbindelse til Prometheus-server"
@@ -40429,9 +41094,6 @@ msgstr "Kan ikke oprette forbindelse til server: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr "Kan ikke oprette forbindelse til Jira-instansen. Tjek venligst din konfiguration af Jira-integrering."
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr "Kan ikke konvertere kodning af Kubernetes-logge til UTF-8"
-
msgid "Unable to create link to vulnerability"
msgstr "Kan ikke oprette link til sårbarhed"
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr "Kan ikke indlæse diff'en. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr "Kan ikke gemme gennemløb. Prøv venligst igen"
@@ -40516,8 +41178,8 @@ msgstr ""
msgid "Unarchive project"
msgstr "Afarkivér projekt"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "Afarkivering af projektet vil igen give dets medlemmer mulighed for at foretage ændringer i det. Der kan commites til depotet og der kan oprettes problemstillinger, kommentarer og andre indslag. %{strong_start}Når det er aktiveret vises projektet i søgninger og på betjeningspanelet.%{strong_end} %{link_start}Lær mere%{link_end}."
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr ""
msgid "Unassign from commenting user"
msgstr ""
@@ -40570,9 +41232,6 @@ msgstr "Ukendt"
msgid "Unknown Error"
msgstr "Ukendt fejl"
-msgid "Unknown cache key"
-msgstr "Ukendt mellemlagernøgle"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr "Ukendt krypteringsstrategi: %{encrypted_strategy}!"
@@ -40624,12 +41283,6 @@ msgstr "Oplåste debatten."
msgid "Unlocks the discussion."
msgstr "Oplåser debatten."
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "klik for at uploade"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Køb yderligere minutter"
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr "Noget fik galt under hentning af projektlagerstatistik"
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "Lager"
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr "Brugerne kan gengive diagrammer i AsciiDoc-, Markdown-, reStructuredText- og Textile-dokumenter med Kroki."
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr "Brugere i licens"
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr "Vis dokumentation"
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr "Vis detaljer: %{details_url}"
msgid "View documentation"
msgstr "Vis dokumentation"
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "Vis kvalificerede godkendere"
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Vi vil være sikker på, at det er dig. Bekræft venligst at du ikke er en robot."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr "Vil udsende til"
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr "Du er ved at overføre %{project_full_name} til et andet navnerum. Er du
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr "Du kan kun %{action} filer når du er på en gren"
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr "Du kan kun overføre projektet til navnerum du håndterer."
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Du kan ikke tilgå den rå fil. Vent venligst et øjeblik."
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr "Du kan ikke efterligne en blokeret bruger"
@@ -43752,6 +44416,9 @@ msgstr "Du har ikke tilstrækkelige tilladelser til at oprette en HTTP-integreri
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr "Du har ikke tilstrækkelige tilladelser til at oprette en vagtplan for projektet"
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr "Du har ikke tilstrækkelige tilladelser til at fjerne en vagtplan fra pr
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr "Du har ikke tilstrækkelige tilladelser til at fjerne HTTP-integreringen"
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr "Du skal logge ind for at søge efter bestemte udtryk."
msgid "You must solve the CAPTCHA in order to submit"
msgstr "Du skal løse CAPTCHA'en for at indsende"
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr "Du skal uploade en fil med det samme filnavn når der slippes på et eksisterende design."
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr "Du har ikke tilladelse til at foretage ændringer direkte i projektet. E
msgid "You're receiving this email because of your account on %{host}."
msgstr "Du modtager e-mailen pga. din konto på %{host}."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Du modtager e-mailen pga. din konto på %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr "Du modtager e-mailen pga. din aktivitet på %{host}."
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr "Der blev logget ind på din %{host}-konto fra en ny placering"
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr "Din nye kommentar"
-msgid "Your new personal access token has been created."
-msgstr "Din nye personlige adgangstoken er blevet oprettet."
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr "Din primære e-mail bruges til registrering af avatar. Du kan ændre den
msgid "Your profile"
msgstr "Din profil"
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "Din projektgrænse er %{limit} projekter! Kontakt venligst din administrator for at øge den"
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] "Dit abonnement vil udløbe om %{remaining_days} dag."
msgstr[1] "Dit abonnement vil udløbe om %{remaining_days} dage."
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr "Dit brugernavn er %{username}."
@@ -44359,6 +45038,9 @@ msgstr "`end_time` skal ikke være mere end en måned efter `start_time`"
msgid "`start_time` should precede `end_time`"
msgstr "`start_time` skal være før `end_time`"
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "en slettet bruger"
@@ -44388,6 +45070,9 @@ msgstr "alertbesked"
msgid "allowed to fail"
msgstr "må mislykkes"
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr "tildel dig selv"
msgid "at"
msgstr "kl."
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr "kan kun ændres af en gruppeadministrator."
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr "kan ikke aktiveres medmindre alle domæner har TLS-certifikater"
msgid "cannot be enabled until a valid credit card is on file"
msgstr "kan ikke aktiveres indtil et gyldigt kreditkort er blevet registreret"
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr "API-fuzzing"
msgid "ciReport|API fuzzing"
msgstr "API-fuzzing"
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr "Alle projekter"
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr "lukket"
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr "lukket problemstilling"
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr "container_name må ikke være længere end %{max_length} tegn"
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr "standardgren"
msgid "deleted"
msgstr "slettet"
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr "udsend"
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr "følger"
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "for %{link_to_merge_request} med %{link_to_merge_request_source_branch}"
@@ -45126,6 +45829,17 @@ msgstr "gruppens CI-/CD-indstillinger."
msgid "groups"
msgstr "grupper"
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr "Godkendelse er valgfrit"
msgid "mrWidget|Approval password is invalid."
msgstr "Godkendelsesadgangskode er ugyldig."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Godkend"
@@ -45550,6 +46270,9 @@ msgstr[1] "Nævner problemstillinger"
msgid "mrWidget|Merge"
msgstr "Sammenlæg"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr "Sammenlægning blokeret: alle tråde skal være løst."
@@ -45568,9 +46291,6 @@ msgstr "Sammenlægning blokeret: pipeline skal lykkes. Den venter på en manuel
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr "Sammenlægger! Vi er der næsten …"
msgid "mrWidget|More information"
msgstr "Mere information"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr "%{item} og %{lastItem}"
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr "kun tilgængelig på topniveaugrupper."
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "forælder"
msgstr[1] "forældre"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "adgangskode"
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "pod_name må ikke være længere end %{max_length} tegn"
-
msgid "point"
msgid_plural "points"
msgstr[0] "punkt"
@@ -46037,6 +46766,9 @@ msgstr "Ukendt"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "yaml ugyldig"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr "dine indstillinger"
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index 08a30272c9a..9fb864b9dee 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 19:57\n"
msgid " %{start} to %{end}"
msgstr " %{start} bis %{end}"
@@ -26,10 +26,10 @@ msgid " Collected %{time}"
msgstr " Gesammelt %{time}"
msgid " Please sign in."
-msgstr " Bitte melde dich an."
+msgstr " Bitte anmelden."
msgid " Try to %{action} this file again."
-msgstr " Versuche die Datei erneut zu %{action}."
+msgstr " Versuchen die Datei erneut zu %{action}."
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Das musst du vor %{grace_period_deadline} tun."
@@ -47,7 +47,7 @@ msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr " oder %{emphasisStart}!merge request id%{emphasisEnd}"
msgid " or %{emphasisStart}#id%{emphasisEnd}"
-msgstr ""
+msgstr " oder %{emphasisStart}#id%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr " oder %{emphasisStart}#issue id%{emphasisEnd}"
@@ -95,8 +95,8 @@ msgstr[1] "%d Module"
msgid "%d Other"
msgid_plural "%d Others"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Andere/r"
+msgstr[1] "%d Andere"
msgid "%d Package"
msgid_plural "%d Packages"
@@ -115,23 +115,23 @@ msgstr[1] "%d URLs gescannt"
msgid "%d additional approver"
msgid_plural "%d additional approvers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d zusätzlicher Genehmigungsberechtigte(r)"
+msgstr[1] "%d zusätzliche Genehmigungsberechtigten"
msgid "%d additional assignee"
msgid_plural "%d additional assignees"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d zusätzlicher Beauftragte(r)"
+msgstr[1] "%d zusätzliche Beauftragte"
msgid "%d additional commenter"
msgid_plural "%d additional commenters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d zusätzlicher Kommentator"
+msgstr[1] "%d zusätzliche Kommentatoren"
msgid "%d additional committer"
msgid_plural "%d additional committers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d zusätzlicher Verfasser"
+msgstr[1] "%d zusätzliche Verfasser"
msgid "%d approver"
msgid_plural "%d approvers"
@@ -145,8 +145,8 @@ msgstr[1] "%d Genehmigende (von dir genehmigt)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d zugewiesenes Ticket"
+msgstr[1] "%d zugewiesene Tickets"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -160,8 +160,8 @@ msgstr[1] "%d Zeichen übrig"
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d untergeordnetes Epic"
+msgstr[1] "%d untergeordnete Epics"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
@@ -195,8 +195,8 @@ msgstr[1] "%d Commit-Autor(inn)en"
msgid "%d commit behind"
msgid_plural "%d commits behind"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Commit hinterher"
+msgstr[1] "%d Commits hinterher"
msgid "%d commit,"
msgid_plural "%d commits,"
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d Ticket erfolgreich mit dem Label importiert"
msgstr[1] "%d Tickets erfolgreich mit dem Label importiert"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] "%d Job"
+msgstr[1] "%d Jobs"
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d Ebene"
@@ -305,8 +310,8 @@ msgstr[1] "%d Merge Requests auf die du keinen Zugriff hast."
msgid "%d merge requests"
msgid_plural "%d merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Merge-Requests"
+msgstr[1] "%d Merge-Requests"
msgid "%d metric"
msgid_plural "%d metrics"
@@ -340,8 +345,8 @@ msgstr[1] "%d persönliche Projekte werden entfernt und können nicht wiederherg
msgid "%d point"
msgid_plural "%d points"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Punkt"
+msgstr[1] "%d Punkte"
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
@@ -360,19 +365,29 @@ msgstr[1] "%d Projekte ausgewählt"
msgid "%d remaining"
msgid_plural "%d remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d verbleibend"
+msgstr[1] "%d verbleibend"
+
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] "%d Antwort"
+msgstr[1] "%d Antworten"
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d Sekunde"
msgstr[1] "%d Sekunden"
-msgid "%d star"
-msgid_plural "%d stars"
+msgid "%d stage"
+msgid_plural "%d stages"
msgstr[0] ""
msgstr[1] ""
+msgid "%d star"
+msgid_plural "%d stars"
+msgstr[0] "%d Stern"
+msgstr[1] "%d Sterne"
+
msgid "%d tag"
msgid_plural "%d tags"
msgstr[0] "%d Tag"
@@ -405,23 +420,23 @@ msgstr[1] "%d Sicherheitslücken verworfen"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Sicherheitslücke bestätigt"
+msgstr[1] "%d Sicherheitslücken bestätigt"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Sicherheitslücke verworfen"
+msgstr[1] "%d Sicherheitslücken verworfen"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Sicherheitslücke, die eine Triage benötigt."
+msgstr[1] "%d Sicherheitslücken, für die eine Triage erforderlich ist"
msgid "%d vulnerability set to resolved"
msgid_plural "%d vulnerabilities set to resolved"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Sicherheitslücke behoben"
+msgstr[1] "%d Sicherheitslücken behoben"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
@@ -482,7 +497,7 @@ msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking r
msgstr "%{code_open}Maskiert:%{code_close} In Job-Logs versteckt. Muss Maskier-Bedingungen erfüllen."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
-msgstr ""
+msgstr "%{code_open}Geschützt:%{code_close} Nur geschützte Branches oder geschützte Tags sichtbar."
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} verfasste %{commit_authored_timeago}"
@@ -502,7 +517,7 @@ msgid "%{completedWeight} of %{totalWeight} weight completed"
msgstr "%{completedWeight} von %{totalWeight} Gewichtung abgeschlossen"
msgid "%{completed} of %{total} issues closed"
-msgstr ""
+msgstr "%{completed} von %{total} Problemen geschlossen"
msgid "%{completed} of %{total} weight completed"
msgstr ""
@@ -620,10 +635,10 @@ msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Versuche erneut, eine Datei hochzuladen."
msgid "%{emailPrefix}@company.com"
-msgstr ""
+msgstr "%{emailPrefix}@firma.com"
msgid "%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload."
-msgstr ""
+msgstr "%{enable_service_ping_link_start}Aktiviere%{link_end} oder %{generate_manually_link_start}generiere%{link_end} ein Service Ping, um die Nutzdaten des Dienstes in der Vorschau anzuzeigen und herunterzuladen."
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} weitere Downstream-Pipelines"
@@ -653,7 +668,7 @@ msgid "%{group_name} group members"
msgstr "%{group_name} Gruppenmitglieder"
msgid "%{group_name} is approaching the limit of available seats"
-msgstr ""
+msgstr "%{group_name} nähert sich dem Limit an verfügbaren Plätzen."
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
msgstr "%{group_name} nutzt Accounts, die von einer Gruppe verwaltet werden. Du musst dir einen neuen GitLab-Account erstellen, welcher von %{group_name} verwaltet wird."
@@ -703,9 +718,15 @@ msgstr "%{labelStart}Klasse:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Absturzadresse:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr "%{labelStart}Absturzstatus:%{labelEnd} %{crash_state}"
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Absturzzustand:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Beweis:%{labelEnd} %{evidence}"
@@ -791,7 +812,7 @@ msgid "%{model_name} not found"
msgstr "%{model_name} nicht gefunden"
msgid "%{mrText}, this issue will be closed automatically."
-msgstr "%{mrText}, dieses Ticket wird automatisch geschlossen werden."
+msgstr "%{mrText}, dieses Problem wird automatisch geschlossen werden."
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 "%{name_with_link} Namespace hat %{percent} oder weniger Pipeline-Minuten auf geteilten Runnern übrig. Sind diese abgelaufen, werden keine Jobs oder Pipelines mehr in den Projekten ausgeführt."
@@ -830,7 +851,7 @@ msgid "%{name}, confirm your email address now!"
msgstr "%{name}, bestätige jetzt deine E-Mail-Adresse!"
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name}: %{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -859,7 +880,7 @@ msgid "%{percentageUsed}%% used"
msgstr ""
msgid "%{percentage}%% issues closed"
-msgstr ""
+msgstr "%{percentage}%% Probleme geschlossen"
msgid "%{percentage}%% weight completed"
msgstr "%{percentage}%% Gewichtung abgeschlossen"
@@ -920,11 +941,8 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr "%{scope} Ergebnisse für Suchwort '%{term}'"
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search} %{description} %{scope}"
-
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}"
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} Veröffentlichung"
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr "%{time} UTC"
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1070,7 +1094,7 @@ msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} Warnungen gefunden: Zeige erste %{warningsDisplayed}"
msgid "%{type} only supports %{name} name"
-msgstr ""
+msgstr "%{type} unterstützt nur den Namen %{name}"
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (kann nicht mergen)"
@@ -1192,7 +1216,7 @@ msgid "(check progress)"
msgstr "(Fortschritt überprüfen)"
msgid "(deleted)"
-msgstr ""
+msgstr "(gelöscht)"
msgid "(expired)"
msgstr ""
@@ -1227,7 +1251,7 @@ msgid "* All times are in UTC unless specified"
msgstr "* Alle Zeiten sind in UTC, sofern nicht anders angegeben"
msgid "*Required"
-msgstr ""
+msgstr "*Benötigt"
msgid "+ %{amount} more"
msgstr "+ %{amount} weitere"
@@ -1304,8 +1328,8 @@ msgstr ""
msgid "- User"
msgid_plural "- Users"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "- Benutzer"
+msgstr[1] "- Benutzer"
msgid "- View the last_activity_at attribute for %{project_name} using the Project API %{projects_api_link}."
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 Tag"
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Ein SSL-Zertifikat von Let's Encrypt kann erst nach Domainbestätigung abgerufen werden."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr "Ein Arbeitselement kann ein übergeordnetes oder ein untergeordnetes Element sein, jedoch nicht beides."
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "Eine grundlegende Seite und serverlose Funktion, die AWS Lambda, AWS API Gateway und GitLab Pages verwendet"
@@ -1830,6 +1862,9 @@ msgstr "Akzeptabel für die Verwendung in diesem Projekt"
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Zugangs-Token"
@@ -1947,6 +1982,12 @@ msgstr "Neu"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr "Zugänglich für jeden angemeldeten Benutzer."
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr "Für jeden zugänglich, unabhängig von der Authentifizierung."
+
msgid "Account"
msgstr "Konto"
@@ -2037,9 +2078,6 @@ msgstr "CHANGELOG hinzufügen"
msgid "Add CONTRIBUTING"
msgstr "CONTRIBUTING hinzufügen"
-msgid "Add Jaeger URL"
-msgstr "Jaeger URL hinzufügen"
-
msgid "Add Kubernetes cluster"
msgstr "Kubernetes-Cluster hinzufügen"
@@ -2070,9 +2108,6 @@ msgstr "GPG-Schlüssel hinzufügen"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2080,7 +2115,7 @@ msgid "Add a bullet list"
msgstr "Aufzählungsliste hinzufügen"
msgid "Add a collapsible section"
-msgstr ""
+msgstr "Einen zusammenklappbaren Abschnitt hinzufügen"
msgid "Add a comment to this line"
msgstr ""
@@ -2100,9 +2135,6 @@ msgstr "Füge einen allgemeinen Kommentar zu %{noteableDisplayName} hinzu."
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 new issue"
msgstr ""
@@ -2128,7 +2160,7 @@ msgid "Add a title..."
msgstr ""
msgid "Add a to do"
-msgstr ""
+msgstr "Eine Aufgabe hinzufügen"
msgid "Add an SSH key"
msgstr "SSH-Schlüssel hinzufügen"
@@ -2194,7 +2226,7 @@ msgid "Add email participant(s)"
msgstr ""
msgid "Add environment"
-msgstr ""
+msgstr "Umgebung hinzufügen"
msgid "Add existing confidential %{issuableType}"
msgstr "Bestehende vertrauliche %{issuableType} hinzufügen"
@@ -2206,7 +2238,7 @@ msgid "Add image comment"
msgstr "Bildkommentar hinzufügen"
msgid "Add internal note"
-msgstr ""
+msgstr "Interne Notiz hinzufügen"
msgid "Add key"
msgstr "Schlüssel hinzufügen"
@@ -2233,7 +2265,7 @@ msgid "Add or subtract spent time"
msgstr "Addiere oder subtrahiere verbrachte Zeit"
msgid "Add people"
-msgstr ""
+msgstr "Personen hinzufügen"
msgid "Add previously merged commits"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr "In dieser Version hinzugefügt"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Das Hinzufügen neuer Anwendungen ist in deiner GitLab-Instanz deaktiviert. Bitte kontaktiere deine(n) GitLab-Administrator(in), um die Berechtigung zu erhalten"
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "Zusätzliche Minuten"
@@ -2521,7 +2550,7 @@ msgid "AdminArea|Projects"
msgstr ""
msgid "AdminArea|Reporter"
-msgstr ""
+msgstr "AdminArea|Reporter"
msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto-DevOps-Domain"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr "AdminSettings|Automatisches Sperren von Benutzern, die mehr als eine festgelegte Anzahl von Repositories in einem bestimmten Zeitraum herunterladen."
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,8 +2936,8 @@ msgstr "2FA deaktiviert"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA aktiviert"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr ""
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr "AdminUsers|Ein Benutzer kann sich selbst validieren, indem er eine Kredit-/Debitkarte eingibt, oder ein Administrator kann einen Benutzer manuell validieren. Validierte Benutzer können kostenlose CI-Minuten für gemeinsam genutzte Läufer verwenden."
msgid "AdminUsers|Access"
msgstr ""
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr "AdminUsers|Zugriffslevel"
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr "AdminUsers|Avatar"
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2959,7 +3000,7 @@ msgid "AdminUsers|Ban user %{username}?"
msgstr ""
msgid "AdminUsers|Banned"
-msgstr ""
+msgstr "Gesperrt"
msgid "AdminUsers|Be added to groups and projects"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr "Blockiert"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Benutzer(in) zu blockieren hat folgende Auswirkungen:"
+msgid "AdminUsers|Can create group"
+msgstr "AdminUsers|Kann Gruppe erstellen"
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr "Das bist du!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr "AdminBenutzer|Grenzen"
+
+msgid "AdminUsers|Linkedin"
+msgstr "AdminUsers|Linkedin"
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr "Persönliche Projekte werden verlassen"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Persönliche Projekte, Gruppen- und Benutzerhistorie werden intakt gelassen"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr "AdminUsers|Quote der CI/CD-Minuten"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Benutzer(in) zu reaktivieren, wird:"
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr "AdminUsers|Reset-Link wird generiert und an den Benutzer gesendet. Der Benutzer wird gezwungen, das Passwort bei der ersten Anmeldung festzulegen."
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Zugriff auf das Konto wiederherstellen, einschließlich Web, Git und API."
@@ -3111,9 +3167,15 @@ msgstr "Benutzer(innen) suchen"
msgid "AdminUsers|Send email to users"
msgstr "E-Mail an Benutzer(innen) senden"
+msgid "AdminUsers|Skype"
+msgstr "AdminUsers|Skype"
+
msgid "AdminUsers|Sort by"
msgstr "Sortiert nach"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr "AdminUsers|Die maximale Anzahl von CI/CD-Minuten auf gemeinsam genutzten Läufern, die eine Gruppe jeden Monat verwenden kann. 0 für unbegrenzt setzen. Leer setzen, um die globale Einstellung von %{minutes} zu übernehmen"
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr "Diese(r) Benutzer(in) kann nicht auf Git-Repositories zugreifen"
@@ -3183,8 +3242,11 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr "AdminUsers|Website-URL"
+
msgid "AdminUsers|What can I do?"
-msgstr ""
+msgstr "Was kann ich tun?"
msgid "AdminUsers|What does this mean?"
msgstr ""
@@ -3196,7 +3258,7 @@ msgid "AdminUsers|When the user logs back in, their account will reactivate as a
msgstr "Wenn diese(r) Benutzer(in) sich wieder anmeldet, wird das Konto vollständig reaktiviert"
msgid "AdminUsers|Will be deleted"
-msgstr ""
+msgstr "Wird gelöscht"
msgid "AdminUsers|Without projects"
msgstr "Ohne Projekte"
@@ -3247,7 +3309,10 @@ msgid "AdminUsers|user cap"
msgstr ""
msgid "Administration"
-msgstr ""
+msgstr "Verwaltung"
+
+msgid "Administrators"
+msgstr "Administratoren"
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 ""
@@ -3280,10 +3345,10 @@ msgid "Advanced"
msgstr "Erweitert"
msgid "Advanced Search"
-msgstr ""
+msgstr "Erweiterte Suche"
msgid "Advanced Settings"
-msgstr ""
+msgstr "Erweiterte Einstellungen"
msgid "Advanced export options"
msgstr ""
@@ -3316,16 +3381,16 @@ msgid "After you've reviewed these contribution guidelines, you'll be all set to
msgstr ""
msgid "Akismet"
-msgstr ""
+msgstr "Akismet"
msgid "Akismet API Key"
-msgstr ""
+msgstr "Akismet API-Schlüssel"
msgid "Akismet helps prevent the creation of spam issues in public projects."
msgstr ""
msgid "Alert"
-msgstr ""
+msgstr "Alarm"
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3334,10 +3399,10 @@ msgid "AlertManagement|Activity feed"
msgstr ""
msgid "AlertManagement|Alert"
-msgstr ""
+msgstr "Alarm"
msgid "AlertManagement|Alert assignee(s): %{assignees}"
-msgstr "Alarm-Beauftragte(r): %{assignees}"
+msgstr "AlertManagement|Alarm-Beauftragte(r): %{assignees}"
msgid "AlertManagement|Alert detail"
msgstr "Alarm-Details"
@@ -3676,7 +3741,7 @@ msgid "All %{replicableType} are being scheduled for %{action}"
msgstr ""
msgid "All (default)"
-msgstr ""
+msgstr "Alle (Standard)"
msgid "All GitLab"
msgstr ""
@@ -3694,7 +3759,7 @@ msgid "All email addresses will be used to identify your commits."
msgstr "Alle E-Mail-Adressen werden verwendet, um deine Commits zu identifizieren."
msgid "All environments"
-msgstr ""
+msgstr "Alle Umgebungen"
msgid "All groups and projects"
msgstr "Alle Gruppen und Projekte"
@@ -3724,11 +3789,14 @@ msgid "All projects selected"
msgstr "Alle Projekte ausgewählt"
msgid "All protected branches"
-msgstr ""
+msgstr "Alle geschützten Branches"
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr "Alle Benutzer in dieser Gruppe müssen die Zwei-Faktor-Authentifizierung einrichten"
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Erlaube \"%{group_name}\" dich anzumelden"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr "Erlaube es Projekten in dieser Gruppe Git LFS zu verwenden"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,11 +3863,8 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Erlaube Benutzer(innen), jede Anwendung zur Nutzung von GitLab als OAuth-Anbieter zu registrieren"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
-msgstr ""
+msgstr "Erlaubt"
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr "Berechtigt, Projekte zu löschen"
+
msgid "Allowed to fail"
msgstr "Scheitern erlaubt"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Ermöglicht dir das Hinzufügen und Verwalten von Kubernetes-Clustern."
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr "Beim Abrufen von Branches ist ein Fehler aufgetreten."
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr "Beim Abrufen deiner Einstellungen ist ein Fehler aufgetreten. Lade die Seite neu, um es erneut zu versuchen."
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr "Beim Speichern deiner Einstellungen ist ein Fehler aufgetreten. Versuche erneut, sie zu speichern."
+
msgid "An error occurred while subscribing to notifications."
msgstr "Beim Abonnieren von Benachrichtigungen ist ein Fehler aufgetreten."
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "Anwendungseinstellungen erfolgreich gespeichert"
+msgid "Application settings saved successfully."
+msgstr "Anwendungseinstellungen erfolgreich gespeichert."
+
msgid "Application settings update failed"
msgstr ""
@@ -4437,7 +4511,7 @@ msgid "ApplicationSettings|A Metrics Dashboard menu item appears in the Monitori
msgstr ""
msgid "ApplicationSettings|Add a link to Grafana"
-msgstr ""
+msgstr "ApplicationSettings|Link zu Grafana hinzufügen"
msgid "ApplicationSettings|After sign-up text"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr "Archiviertes Projekt! Repository und andere Projektressourcen sind schre
msgid "Archived projects"
msgstr "Archivierte Projekte"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Bist du sicher, dass du %{group_name} wirklich entfernen willst?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Möchtest du den Anhang wirklich entfernen?"
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Bist du sicher, dass du den Health-Check-Token zurücksetzen willst?"
@@ -5043,6 +5123,9 @@ msgstr "Label zuweisen"
msgid "Assign milestone"
msgstr "Meilenstein zuweisen"
+msgid "Assign myself"
+msgstr "Selbst zuweisen"
+
msgid "Assign reviewer"
msgstr ""
@@ -5109,10 +5192,10 @@ msgid "Assignee(s)"
msgstr "Zugewiesene Personen"
msgid "Assignees"
-msgstr ""
+msgstr "Beauftragte"
msgid "Assigns %{assignee_users_sentence}."
-msgstr "Weise %{assignee_users_sentence} zu."
+msgstr "%{assignee_users_sentence} zuweisen."
msgid "Assigns %{reviewer_users_sentence} as %{reviewer_text}."
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr "Datei anhängen"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Datei mittels Drag &amp; Drop oder %{upload_link} hinzufügen"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "Aug"
@@ -5333,7 +5428,7 @@ msgid "Author: %{author_name}"
msgstr ""
msgid "Authored %{timeago}"
-msgstr ""
+msgstr "Verfasst %{timeago}"
msgid "Authored %{timeago} by %{author}"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr "Vorsicht. Änderungen am Projektnamensraum können unbeabsichtigte Neben
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Vorsicht. Das Umbenennen des Projekt-Repositorys kann unbeabsichtigte Nebenwirkungen haben."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6155,7 +6247,13 @@ msgid "Billing|You are about to remove user %{username} from your subscription.
msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
-msgstr ""
+msgstr "Billing|Du kannst jetzt damit beginnen, Mitglieder in %{namespaceName} zu verschieben. Ein Mitglied verliert den Zugriff auf die Gruppe, wenn du %{strongStart}In a seat%{strongEnd} deaktivierst. Wenn nach dem 22. Juni 2022 mehr als 5 Mitglieder %{strongStart}In a seat%{strongEnd} aktiviert haben, wählen wir die 5 Mitglieder aus, die weiterhin Zugriff haben. Wir zählen zuerst Mitglieder mit Eigentümer- und Betreuerrollen, dann die zuletzt aktiven Mitglieder, bis wir 5 Mitglieder erreicht haben. Die verbleibenden Mitglieder erhalten den Status Limit überschritten und verlieren den Zugriff auf die Gruppe."
+
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr "Billing|Deine kostenlose Gruppe ist jetzt auf %{free_user_limit} Mitglieder beschränkt"
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr "Billing|Deine Gruppe hat kürzlich auf den kostenlosen Plan umgestellt. Kostenlose Gruppen sind auf %{free_user_limit} Mitglieder beschränkt und die verbleibenden Mitglieder erhalten den Status „Überschreitung“ und verlieren den Zugriff auf die Gruppe. Du kannst Speicherplatz für neue Mitglieder freigeben, indem du diejenigen entfernst, die keinen Zugriff mehr benötigen, oder sie auf Überlimit umschalten. Um eine unbegrenzte Anzahl von Mitgliedern zu erhalten, kannst du ein %{link_start}Upgrade%{link_end} auf eine kostenpflichtige Stufe durchführen."
msgid "Bitbucket Server Import"
msgstr "Bitbucket-Server-Import"
@@ -6184,10 +6282,10 @@ msgstr[0] ""
msgstr[1] ""
msgid "Blocked issue"
-msgstr ""
+msgstr "Blockiertes Ticket"
msgid "Blocking"
-msgstr ""
+msgstr "Blockieren"
msgid "Blocking issues"
msgstr ""
@@ -6253,7 +6351,7 @@ msgid "BoardScope|Any assignee"
msgstr ""
msgid "BoardScope|Any iteration"
-msgstr ""
+msgstr "BoardScope|Beliebige Iteration"
msgid "BoardScope|Any label"
msgstr ""
@@ -6268,7 +6366,7 @@ msgid "BoardScope|Current iteration"
msgstr ""
msgid "BoardScope|Don't filter milestone"
-msgstr ""
+msgstr "BoardScope|Meilenstein nicht filtern"
msgid "BoardScope|Edit"
msgstr ""
@@ -6280,7 +6378,7 @@ msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
-msgstr ""
+msgstr "BoardScope|Meilenstein"
msgid "BoardScope|No iteration"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr "Sowohl SSH als auch HTTP(S)"
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr "Aufzählung"
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7138,7 +7248,7 @@ msgid "Cancel downstream pipeline"
msgstr ""
msgid "Cancel editing"
-msgstr ""
+msgstr "Bearbeitung abbrechen"
msgid "Cancel index deletion"
msgstr ""
@@ -7159,7 +7269,7 @@ msgid "Canceled deployment to"
msgstr ""
msgid "Cancelled"
-msgstr ""
+msgstr "Abgebrochen"
msgid "Cancelling Preview"
msgstr "Schließe Vorschau"
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7267,7 +7380,7 @@ msgid "Certificate (PEM)"
msgstr "Zertifikat (PEM)"
msgid "Certificate Issuer"
-msgstr ""
+msgstr "Aussteller des Zertifikats"
msgid "Certificate Subject"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr "Änderungen unterdrückt. Zum Anzeigen klicken."
msgid "Changes the title to \"%{title_param}\"."
msgstr "Ändert den Titel in \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Name des Unternehmens oder der Organisation, die GitLab verwendet"
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr "Untergeordnetes Epic existiert nicht."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8101,7 +8217,7 @@ msgid "CloneIssue|Cannot clone issue due to insufficient permissions!"
msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
-msgstr ""
+msgstr "CloneIssue|Das Problem kann nicht in das Zielprojekt kopiert werden, da es zur Löschung ansteht."
msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr "Geschlossen am"
+
msgid "Closed issues"
msgstr "Geschlossene Tickets"
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ 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."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr "Wusstest du schon?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr "Code kann während der Projekterstellung aus aktivierten Quellen importiert werden. OmniAuth muss für GitHub konfiguriert werden"
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8961,7 +9203,7 @@ msgid "Collapse"
msgstr "Reduzieren"
msgid "Collapse all threads"
-msgstr ""
+msgstr "Alle Threads einklappen"
msgid "Collapse approvers"
msgstr "Genehmigungsberechtigte ausblenden"
@@ -8990,14 +9232,17 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
-msgid "ColorWidget|An error occurred while updating color."
+msgid "Color"
msgstr ""
+msgid "ColorWidget|An error occurred while updating color."
+msgstr "Es gab einen Fehler beim Aktualisieren der Farbe."
+
msgid "ColorWidget|Assign epic color"
msgstr ""
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "Farbe"
msgid "ColorWidget|Error fetching epic color."
msgstr ""
@@ -9134,7 +9379,7 @@ msgid "Committed by"
msgstr "Committed von"
msgid "Community forum"
-msgstr ""
+msgstr "Community-Forum"
msgid "Company"
msgstr ""
@@ -9341,7 +9586,7 @@ msgid "Confidential"
msgstr "Vertraulich"
msgid "Confidential issue"
-msgstr ""
+msgstr "Vertrauliches Ticket"
msgid "Confidential note"
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,12 +9663,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-msgstr "Tracing konfigurieren"
-
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 advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr "Konfiguriere erweiterte Berechtigungen, Large File Storage, Zwei-Faktor-Authentifizierung und CI/CD-Einstellungen."
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr ""
@@ -9473,7 +9721,7 @@ msgid "Configure via Merge Request"
msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
-msgstr ""
+msgstr "Konfigurieren, welche Listen für jeden Besucher dieses Boards angezeigt werden sollen"
msgid "Configure with a merge request"
msgstr ""
@@ -9610,9 +9858,6 @@ msgstr "Container-Registry"
msgid "Container Scanning"
msgstr "Container Scanning"
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr "ContainerRegistry|Vollständigen Pfad anzeigen"
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9875,7 +10120,7 @@ msgid "ContainerRegistry|Something went wrong while updating the cleanup policy.
msgstr ""
msgid "ContainerRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "ContainerRegistry|Dein Filter hat leider keine Ergebnisse geliefert."
msgid "ContainerRegistry|Tag successfully marked for deletion."
msgstr ""
@@ -9944,7 +10189,7 @@ msgid "ContainerRegistry|This project's cleanup policy for tags is not enabled."
msgstr ""
msgid "ContainerRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "ContainerRegistry|Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
msgid "ContainerRegistry|We are having trouble connecting to the Container Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
msgstr ""
@@ -9992,7 +10237,7 @@ msgid "Continue"
msgstr "Fortsetzen"
msgid "Continue editing"
-msgstr ""
+msgstr "Bearbeitung fortsetzen"
msgid "Continue to the next step"
msgstr "Fahre mit dem nächsten Schritt fort"
@@ -10001,7 +10246,7 @@ msgid "Continuous Integration and Deployment"
msgstr "Kontinuierliche Integration und Bereitstellung"
msgid "Contribute to GitLab"
-msgstr "Trage etwas zu GitLab bei"
+msgstr "Zu GitLab beitragen"
msgid "Contribution"
msgstr "Beitrag"
@@ -10052,7 +10297,7 @@ msgid "Contributions per group member"
msgstr "Beiträge pro Gruppenmitglied"
msgid "Contributor"
-msgstr ""
+msgstr "Mitwirkender"
msgid "Contributors"
msgstr "Mitwirkende"
@@ -10514,10 +10759,10 @@ msgid "Create group label"
msgstr "Gruppen-Label erstellen"
msgid "Create issue"
-msgstr ""
+msgstr "Ticket erstellen"
msgid "Create issue to resolve all threads"
-msgstr ""
+msgstr "Problem erstellen, um alle Diskussionen zu lösen."
msgid "Create iteration"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr "Neues Label erstellen"
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr "Neu erstellen"
+
msgid "Create one"
msgstr ""
@@ -10607,7 +10855,7 @@ msgid "Create user"
msgstr ""
msgid "Create wildcard: %{searchTerm}"
-msgstr ""
+msgstr "Wildcard erstellen: %{searchTerm}"
msgid "Create your first page"
msgstr "Erstelle deine erste Seite"
@@ -11129,7 +11377,7 @@ msgid "CycleAnalyticsStage|Code"
msgstr "Code"
msgid "CycleAnalyticsStage|Issue"
-msgstr "Ticket"
+msgstr "CycleAnalyticsStage|Probleme"
msgid "CycleAnalyticsStage|Plan"
msgstr "Planung"
@@ -11262,11 +11510,14 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr "DORA4Metrics|Fehlerrate ändern"
+
msgid "DORA4Metrics|Date"
msgstr ""
msgid "DORA4Metrics|Days for an open incident"
-msgstr ""
+msgstr "DORA4Metrics|Tage für einen offenen Vorfall"
msgid "DORA4Metrics|Days from merge to deploy"
msgstr ""
@@ -11284,10 +11535,10 @@ msgid "DORA4Metrics|Median time (last %{days}d)"
msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
-msgstr ""
+msgstr "DORA4Metrics|Mediane Zeit, in der ein Incident in einer Produktionsumgebung im angegebenen Zeitraum offen war."
msgid "DORA4Metrics|No incidents during this period"
-msgstr ""
+msgstr "Keine Vorfälle in diesem Zeitraum"
msgid "DORA4Metrics|No merge requests were deployed during this period"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr "DORA4Metrics|Anzahl der Vorfälle geteilt durch die Anzahl der Bereitstellungen in einer Produktionsumgebung im angegebenen Zeitraum."
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr "DORA4Metrics|Prozentsatz fehlgeschlagener Bereitstellungen"
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr "DORA4Metrics|Beim Abrufen der Daten zur Änderungsfehlerrate ist etwas schief gelaufen."
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11886,7 +12152,7 @@ msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default artifacts expiration"
-msgstr ""
+msgstr "Standardablauf von Artefakten"
msgid "Default branch"
msgstr "Standard-Branch"
@@ -11894,12 +12160,6 @@ msgstr "Standard-Branch"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr "Standard Beschreibungsvorlage für Tickets"
@@ -11912,9 +12172,6 @@ msgstr "Standardwert für den ersten Wochentag"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Standardwert für den ersten Wochentag im Kalender und in der Datumsauswahl."
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11928,16 +12185,16 @@ msgid "DefaultBranchLabel|default"
msgstr ""
msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, but cannot force push."
-msgstr ""
+msgstr "DefaultBranchProtection|Sowohl Entwickler als auch Betreuer können neue Commits pushen, aber Pushen nicht erzwingen."
msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, force push, or delete the branch."
-msgstr ""
+msgstr "DefaultBranchProtection|Sowohl Entwickler als auch Betreuer können neue Commits pushen, Push erzwingen oder den Branch löschen."
msgid "DefaultBranchProtection|Developers cannot push new commits, but are allowed to accept merge requests to the branch. Maintainers can push to the branch."
-msgstr ""
+msgstr "DefaultBranchProtection|Entwickler können keine neuen Commits pushen, dürfen aber Merge-Anfragen an den Branch annehmen. Betreuer können auf den Zweig pushen."
msgid "DefaultBranchProtection|Developers cannot push new commits, but maintainers can. No one can force push."
-msgstr ""
+msgstr "DefaultBranchProtection|Entwickler können keine neuen Commits pushen, Betreuer hingegen schon. Push kann niemand erzwingen."
msgid "DefaultBranchProtection|Fully protected"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12033,7 +12290,7 @@ msgid "Delete badge"
msgstr ""
msgid "Delete code block"
-msgstr ""
+msgstr "Codeblock löschen"
msgid "Delete column"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12630,7 +12917,7 @@ msgid "DeploymentTarget|No deployment planned"
msgstr ""
msgid "DeploymentTarget|Other hosting service"
-msgstr ""
+msgstr "Anderer Hosting-Dienst"
msgid "DeploymentTarget|Registry (package or container)"
msgstr ""
@@ -12645,7 +12932,7 @@ msgid "DeploymentTarget|Virtual machine (for example, EC2)"
msgstr ""
msgid "Deployments"
-msgstr ""
+msgstr "Bereitstellungen"
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr "Details"
msgid "Details (default)"
msgstr "Details (Standard)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "Hostschlüssel erkennen"
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13222,7 +13503,7 @@ msgid "Disable Two-factor Authentication"
msgstr ""
msgid "Disable What's new"
-msgstr ""
+msgstr "Was ist neu deaktivieren"
msgid "Disable for this project"
msgstr "Für dieses Projekt deaktivieren"
@@ -13230,9 +13511,6 @@ msgstr "Für dieses Projekt deaktivieren"
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr "Zwei-Faktor-Authentifizierung deaktivieren"
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13506,7 +13781,7 @@ msgid "Draft: %{filename}"
msgstr ""
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
-msgstr ""
+msgstr "Designs hierherziehen oder %{linkStart}zum Hochladen klicken%{linkEnd}."
msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
msgstr ""
@@ -13619,12 +13894,12 @@ msgstr ""
msgid "Edit"
msgstr "Bearbeiten"
-msgid "Edit %{issuable}"
-msgstr "%{issuable} bearbeiten"
-
msgid "Edit %{name}"
msgstr "%{name} bearbeiten"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "Kommentar bearbeiten"
@@ -13652,9 +13927,6 @@ msgstr "Passwort ändern"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "Release bearbeiten"
@@ -13743,13 +14015,13 @@ msgid "Edit table"
msgstr ""
msgid "Edit this file only."
-msgstr ""
+msgstr "Nur diese Datei bearbeiten."
msgid "Edit this release"
msgstr "Dieses Release bearbeiten"
msgid "Edit title and description"
-msgstr ""
+msgstr "Titel und Beschreibung bearbeiten"
msgid "Edit topic: %{topic_name}"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr "Einbetten"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "Auto-DevOps aktivieren"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13995,10 +14264,10 @@ msgid "Enable Spam Check via external API endpoint"
msgstr ""
msgid "Enable What's new: All tiers"
-msgstr ""
+msgstr "Was ist neu aktivieren: Alle Ebenen"
msgid "Enable What's new: Current tier only"
-msgstr ""
+msgstr "Was ist neu aktivieren: Nur aktuelle Stufe"
msgid "Enable access to the performance bar for non-administrators in a given group."
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr "Umgebung hat keine Bereitstellungen"
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr "Derzeit werden alle Ergebnisse angezeigt."
-
msgid "Environments|Delete"
msgstr ""
@@ -14394,7 +14648,7 @@ msgid "Environments|Deploy to..."
msgstr "Bereitstellen für..."
msgid "Environments|Deployment"
-msgstr "Bereitstellung"
+msgstr "Environments|Bereitstellung"
msgid "Environments|Deployment %{status}"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr "Umgebungen sind Orte, an denen Code bereitgestellt wird, z. B. Staging o
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Job"
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr "Erfahre mehr über das Stoppen von Umgebungen"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Neue Umgebung"
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr "Noch keine Bereitstellungen"
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Beachte, dass diese Aktion die Umgebung stoppen wird, es aber %{emphasisStart}keine%{emphasisEnd} Auswirkungen auf bestehende Bereitstellung haben wird, da keine \"stop environment action\" in der Datei %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} definiert ist."
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr "Öffne Live-Umgebung"
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr "Erneute Bereitstellung in der Umgebung"
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr "Umgebung wiederherstellen"
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr "Alle anzeigen"
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14592,7 +14822,7 @@ msgid "Epics|Remove epic"
msgstr ""
msgid "Epics|Remove issue"
-msgstr ""
+msgstr "Ticket löschen"
msgid "Epics|Search epics"
msgstr ""
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr "Epics|Die Farbe für das Epic, wenn es visualisiert wird, z. B. auf Roadmap-Zeitleisten."
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15033,7 +15269,7 @@ msgid "Even if you reach the number of seats in your subscription, you can conti
msgstr ""
msgid "EventFilterBy|Filter by all"
-msgstr "Filtere alle"
+msgstr "EventFilterBy|Nach allem filtern"
msgid "EventFilterBy|Filter by comments"
msgstr "Filtere nach Kommentaren"
@@ -15124,8 +15360,11 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
-msgstr "Jeder kann beitragen"
+msgstr "Jede(r) kann beitragen"
msgid "Everything on your to-do list is marked as done."
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15302,7 +15541,7 @@ msgid "Explore snippets"
msgstr ""
msgid "Explore topics"
-msgstr ""
+msgstr "Themen erkunden"
msgid "Export"
msgstr ""
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr "Fehlgeschlagen"
msgid "Failed Jobs"
msgstr "Fehlgeschlagene Jobs"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -15496,7 +15743,7 @@ msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
-msgstr ""
+msgstr "Framework konnte nicht erstellt werden"
msgid "Failed to create import label for jira import."
msgstr ""
@@ -15508,7 +15755,7 @@ msgid "Failed to create repository"
msgstr ""
msgid "Failed to create resources"
-msgstr ""
+msgstr "Fehler beim Erstellen der Ressourcen"
msgid "Failed to create wiki"
msgstr "Wiki konnte nicht erstellt werden"
@@ -15541,7 +15788,7 @@ msgid "Failed to get ref."
msgstr ""
msgid "Failed to install."
-msgstr ""
+msgstr "Installation fehlgeschlagen."
msgid "Failed to load"
msgstr ""
@@ -15550,7 +15797,7 @@ msgid "Failed to load Roadmap"
msgstr ""
msgid "Failed to load assignees."
-msgstr ""
+msgstr "Fehler beim Laden der Beauftragten."
msgid "Failed to load assignees. Please try again."
msgstr ""
@@ -15580,7 +15827,7 @@ msgid "Failed to load groups, users and deploy keys."
msgstr ""
msgid "Failed to load groups."
-msgstr ""
+msgstr "Fehler beim Laden der Gruppen."
msgid "Failed to load iteration cadences."
msgstr ""
@@ -15667,13 +15914,13 @@ msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
msgid "Failed to save new settings"
-msgstr ""
+msgstr "Speichern der neuen Einstellungen fehlgeschlagen"
msgid "Failed to save preferences (%{error_message})."
msgstr "Speichern der Einstellungen fehlgeschlagen (%{error_message})."
msgid "Failed to save preferences."
-msgstr ""
+msgstr "Speichern der Einstellungen fehlgeschlagen."
msgid "Failed to set due date because the date format is invalid."
msgstr "Konnte Fälligkeitsdatum wegen ungültigen Formats nicht festlegen."
@@ -15688,7 +15935,7 @@ msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
-msgstr ""
+msgstr "Aktualisieren des Branches fehlgeschlagen!"
msgid "Failed to update environment!"
msgstr ""
@@ -15703,10 +15950,10 @@ msgid "Failed to update the Canary Ingress."
msgstr ""
msgid "Failed to update."
-msgstr ""
+msgstr "Aktualisierung fehlgeschlagen."
msgid "Failed to upgrade."
-msgstr ""
+msgstr "Upgrade fehlgeschlagen."
msgid "Failed to upload object map file"
msgstr ""
@@ -16125,10 +16372,13 @@ msgid "Find by path"
msgstr "Finde über den Pfad"
msgid "Find file"
-msgstr "Finde Datei"
+msgstr "Datei finden"
-msgid "Fingerprint"
-msgstr ""
+msgid "Fingerprint (MD5)"
+msgstr "Fingerabdruck (MD5)"
+
+msgid "Fingerprint (SHA256)"
+msgstr "Fingerabdruck (SHA256)"
msgid "Fingerprints"
msgstr "Fingerabdrücke"
@@ -16136,6 +16386,9 @@ msgstr "Fingerabdrücke"
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "Für mehr Informationen, gehe zu "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr "Ausstehende Überprüfung"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "Projekt (ID: %{project_id}) existiert nicht mehr in der Primärdatenbank. Es ist sicher, diesen Eintrag zu entfernen, da dadurch keine Daten auf der Festplatte gelöscht werden."
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "Synchronisiert"
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr "Git-Version"
+msgid "GitAbuse|Excluded users"
+msgstr "GitAbuse|Ausgeschlossene Benutzer"
+
+msgid "GitAbuse|Number of repositories"
+msgstr "GitAbuse|Anzahl der Repositories"
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr "GitAbuse|Anzahl der Repositories darf nicht leer sein. Auf 0 setzen für keine Begrenzung."
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr "GitAbuse|Anzahl der Repositories muss eine Zahl sein."
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr "GitAbuse|Anzahl der Repositories sollte zwischen %{minNumRepos}-%{maxNumRepos} liegen"
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr "GitAbuse|Berichtszeitraum (Sekunden)"
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr "GitAbuse|Berichtszeitraum darf nicht leer sein. Auf 0 setzen für keine Begrenzung."
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr "GitAbuse|Berichtszeitraum muss eine Zahl sein."
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr "GitAbuse|Berichtszeitraum sollte zwischen %{minTimePeriod}-%{maxTimePeriod} Sekunden liegen."
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr "GitAbuse|Die maximale Anzahl eindeutiger Repositories, die ein Benutzer in einem bestimmten Zeitraum herunterladen kann, bevor er gesperrt wird."
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr "GitAbuse|Benutzer, die von der Begrenzung der Git-Missbrauchsrate ausgeschlossen sind."
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr "GitAbuse|Du kannst nicht mehr als %{maxExcludedUsers} ausgeschlossene Benutzer angeben."
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "GitLab-Import"
@@ -17233,7 +17507,7 @@ msgid "GitLab is open source software to collaborate on code."
msgstr ""
msgid "GitLab is undergoing maintenance"
-msgstr ""
+msgstr "GitLab wird gewartet"
msgid "GitLab logo"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr "GitLab verwendet %{jaeger_link} um verteilte Systeme zu überwachen."
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17311,7 +17582,7 @@ msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable th
msgstr ""
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "Maximale Seitengröße (MB)"
msgid "GitLabPages|New Domain"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr "GitLabPages|Deine Pages-Konfiguration wird aktualisiert..."
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,11 +17752,14 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
msgid "GlobalSearch|Search GitLab"
-msgstr ""
+msgstr "GlobalSearch|GitLab durchsuchen"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17524,7 +17813,7 @@ msgid "Go back to configuration"
msgstr ""
msgid "Go full screen"
-msgstr ""
+msgstr "Zum Vollbildmodus wechseln"
msgid "Go to %{source_name}"
msgstr ""
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr "Gruppe"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17824,7 +18116,7 @@ msgid "Group avatar"
msgstr "Gruppenavatar"
msgid "Group by"
-msgstr ""
+msgstr "Gruppieren nach"
msgid "Group description (optional)"
msgstr "Gruppenbeschreibung (optional)"
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "Gruppe: %{group_name}"
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,33 +18541,45 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
-msgstr ""
+msgid "GroupSettings|Export group"
+msgstr "Gruppe exportieren"
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
-msgid "GroupSettings|Export group"
-msgstr "Gruppe exportieren"
-
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|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18291,22 +18595,13 @@ 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"
+msgid "GroupSettings|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "Freigabe eines Projekts innerhalb %{group} mit anderen Gruppen verhindern"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-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. Inherited by subgroups."
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,18 +18610,27 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
msgstr ""
-msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
+msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
+msgstr "Lege eine Größenbeschränkung für alle Inhalte in jeder Pages-Seite in dieser Gruppe fest. %{link_start}Erfahre mehr.%{link_end}"
+
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr "Diese Einstellung wird auf %{ancestor_group} angewendet. Du kannst die E
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18388,7 +18692,7 @@ msgid "Groups and projects"
msgstr ""
msgid "Groups are a great way to organize projects and people."
-msgstr ""
+msgstr "Gruppen sind eine großartige Möglichkeit, Projekte und Personen zu organisieren."
msgid "Groups are the best way to manage projects and members."
msgstr ""
@@ -18418,13 +18722,13 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Eine Gruppe ist eine Ansammlung mehrerer Projekte."
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "Neues Projekt erstellen"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "Neue Untergruppe erstellen"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
-msgstr ""
+msgstr "Gruppen sind die beste Möglichkeit, mehrere Projekte und Mitglieder zu verwalten."
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Wenn du deine Projekte in einer Gruppe organisierst, funktioniert dies wie ein Ordner."
@@ -18433,7 +18737,7 @@ msgid "GroupsEmptyState|No groups found"
msgstr "Keine Gruppen gefunden"
msgid "GroupsEmptyState|No subgroups or projects."
-msgstr ""
+msgstr "Keine Untergruppen oder Projekte."
msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
msgstr ""
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18683,7 +18984,7 @@ msgid "HarborRegistry|Root image"
msgstr ""
msgid "HarborRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "HarborRegistry|Entschuldigung, dein Filter hat keine Ergebnisse geliefert."
msgid "HarborRegistry|The filter returned no results"
msgstr ""
@@ -18701,7 +19002,7 @@ msgid "HarborRegistry|This image has no active tags"
msgstr ""
msgid "HarborRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "HarborRegistry|Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
msgstr ""
@@ -18812,7 +19113,7 @@ msgid "Help"
msgstr "Hilfe"
msgid "Help translate GitLab into your language"
-msgstr ""
+msgstr "Helfe mit, GitLab in deine Sprache zu übersetzen"
msgid "Helps prevent bots from brute-force attacks."
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19089,7 +19387,7 @@ msgid "IDE|Review"
msgstr "Review"
msgid "IDE|Start a new merge request"
-msgstr ""
+msgstr "Neuen Merge Request erstellen"
msgid "IDE|Successful commit"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr "Incident|Dieses Ereignis wirklich löschen?"
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr "Incident|Ereignis löschen"
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr "Incident|Fehler beim Erstellen des Ereignisses auf der Zeitachse des Vorfalls: %{error}"
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr "Incident|Fehler beim Löschen des Ereignisses auf der Zeitachse des Vorfalls: %{error}"
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr "Incident|Speichern und ein weiteres Ereignis hinzufügen"
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr "Incident|Beim Erstellen des Vorfall-Zeitachsenereignisses ist ein Fehler aufgetreten."
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr "Incident|Beim Löschen des Vorfall-Zeitachsenereignisses ist ein Fehler aufgetreten."
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr "Incident|Zeitleistentext"
+
+msgid "Incident|Timeline text..."
+msgstr "Incident|Zeitleistentext..."
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,14 +20799,11 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
-msgstr ""
+msgstr "Zitat einfügen"
msgid "Insert code"
-msgstr ""
+msgstr "Code einfügen"
msgid "Insert column after"
msgstr ""
@@ -20451,7 +20827,7 @@ msgid "Insert suggestion"
msgstr ""
msgid "Insights"
-msgstr ""
+msgstr "Einblicke"
msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20747,7 +21138,7 @@ msgid "Integrations|You haven't activated any integrations yet."
msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
-msgstr ""
+msgstr "Integrationen|Du musst Inhaber sein oder Betreuerberechtigungen haben, um Namespaces zu verknüpfen."
msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
msgstr ""
@@ -20777,7 +21168,7 @@ msgid "Interactive mode"
msgstr ""
msgid "Interested parties can even contribute by pushing commits if they want to."
-msgstr "Interessierte können auch etwas beitragen wenn sie möchten, indem sie Commits pushen."
+msgstr "Interessierte können auch etwas beitragen, wenn sie möchten, indem sie Commits pushen."
msgid "Internal"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20927,7 +21306,7 @@ msgid "Invite \"%{trimmed}\" by email"
msgstr ""
msgid "Invite Members"
-msgstr ""
+msgstr "Mitglieder einladen"
msgid "Invite a group"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr "InviteMembersModal|Einladungsfehler überprüfen und erneut versuchen:"
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] "InviteMembersModal|Das folgende Mitglied konnte nicht eingeladen werden"
+msgstr[1] "InviteMembersModal|Das folgenden %d Mitglieder konnten nicht eingeladen werden"
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21155,6 +21542,9 @@ msgid "InviteReminderEmail|This is a friendly reminder that %{inviter} invited y
msgstr ""
msgid "Invited"
+msgstr "Eingeladen"
+
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
msgstr ""
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
@@ -21218,7 +21608,7 @@ msgid "IssuableStatus|promoted"
msgstr "hochgestuft"
msgid "Issue"
-msgstr "Ticket"
+msgstr "Problem"
msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}."
msgstr ""
@@ -21308,7 +21698,7 @@ msgid "IssueBoards|Board"
msgstr "Board"
msgid "IssueBoards|Boards"
-msgstr "Boards"
+msgstr "IssueBoards|Boards"
msgid "IssueBoards|Create new board"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21383,7 +21767,7 @@ msgid "IssueTracker|Use a custom issue tracker that is not in the integration li
msgstr ""
msgid "Issues"
-msgstr "Tickets"
+msgstr "Probleme"
msgid "Issues Rate Limits"
msgstr ""
@@ -21434,7 +21818,7 @@ msgid "IssuesAnalytics|Last 12 months"
msgstr "Letzten 12 Monate"
msgid "IssuesAnalytics|Sorry, your filter produced no results"
-msgstr "Entschuldigung, leider gibt es für deinen Filter keine Ergebnisse"
+msgstr "IssuesAnalytics|Dein Filter hat leider keine Ergebnisse geliefert"
msgid "IssuesAnalytics|There are no issues for the projects in your group"
msgstr "Es gibt keine Tickets für die Projekte in deiner Gruppe"
@@ -21488,10 +21872,10 @@ msgid "Iteration removed"
msgstr ""
msgid "Iteration updated"
-msgstr ""
+msgstr "Iteration aktualisiert"
msgid "Iterations"
-msgstr ""
+msgstr "Iterationen"
msgid "Iterations|Add iteration"
msgstr ""
@@ -21635,7 +22019,7 @@ msgid "Iterations|This will delete the cadence as well as all of the iterations
msgstr ""
msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
-msgstr ""
+msgstr "Iterations|Dies entfernt die Iteration von allen Problemen, die ihr zugewiesen sind."
msgid "Iterations|Title"
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr "Jaeger-URL"
-
msgid "Jan"
msgstr "Jan"
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21914,7 +22304,7 @@ msgid "JiraService|What version of GitLab are you using?"
msgstr ""
msgid "JiraService|When a Jira issue is mentioned in a commit or merge request, a remote link and comment (if enabled) will be created."
-msgstr ""
+msgstr "JiraService|Wenn ein Jira-Problem in einer Commit- oder Merge-Anfrage erwähnt wird, werden ein Remote-Link und ein Kommentar (falls aktiviert) erstellt."
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr "Job|%{searchLength} Ergebnisse gefunden für %{searchTerm}"
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr "Job wurde gelöscht"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr "Job|Job-Log-Suche"
+
msgid "Job|Keep"
msgstr "Behalten"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr "Job|Keine Suchergebnisse gefunden"
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr "Zum Seitenende scrollen"
msgid "Job|Scroll to top"
msgstr "Scrolle nach oben"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr "Job|Suche in deiner Auftragsprotokollausgabe nach Teilzeichenfolgen. Derzeit wird die Suche nur für die sichtbare Auftragsprotokollausgabe unterstützt, nicht für Protokollausgaben, die aufgrund ihrer Größe abgeschnitten werden."
+
+msgid "Job|Search job log"
+msgstr "Job|Jobprotokoll durchsuchen"
+
msgid "Job|Show complete raw"
msgstr "Zeige komplette Rohdaten"
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr "Job|Wir konnten dieses Element nicht finden"
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22157,7 +22565,7 @@ msgid "Join a project"
msgstr ""
msgid "Join your team on GitLab and contribute to an existing project"
-msgstr ""
+msgstr "Trete deinem Team auf GitLab bei und trage zu einem bestehenden Projekt bei"
msgid "Joined %{time_ago}"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr "Kubernetes-Cluster"
@@ -22330,6 +22735,11 @@ msgstr "Label"
msgid "Label actions dropdown"
msgstr "Dropdown-Menü für die Label-Aktionen"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22441,7 +22851,7 @@ msgid "Last edited %{date}"
msgstr "Zuletzt bearbeitet %{date}"
msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
-msgstr ""
+msgstr "Zuletzt bearbeitet von %{link_start}%{avatar} %{name}%{link_end}"
msgid "Last event"
msgstr ""
@@ -22531,7 +22941,7 @@ msgid "Latest pipeline for the most recent commit on this branch"
msgstr ""
msgid "Launch a ready-to-code development environment for your project."
-msgstr ""
+msgstr "Eine schlüsselfertige Entwicklungsumgebung für dein Projekt starten."
msgid "Layout|Fixed"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22564,7 +22971,7 @@ msgid "Learn More."
msgstr ""
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
-msgstr ""
+msgstr "Erfahre, wie du %{link_start} zu den integrierten Vorlagen %{link_end} beiträgst"
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr "Mehr Informationen"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23044,7 +23451,7 @@ msgid "Linked epics"
msgstr ""
msgid "Linked issues"
-msgstr ""
+msgstr "Verknüpfte Probleme"
msgid "LinkedIn"
msgstr "LinkedIn"
@@ -23077,7 +23484,7 @@ msgid "List of users who are allowed to exceed the rate limit. Example: username
msgstr ""
msgid "List options"
-msgstr ""
+msgstr "Optionen auflisten"
msgid "List settings"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr "Protokolle"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr "Zugriff verwalten"
-msgid "Manage all notifications"
-msgstr "Alle Benachrichtigungen verwalten"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "Verwalte Anwendungen, die GitLab als OAuth-Anbieter verwenden können, und Anwendungen, die du zur Verwendung deines Kontos autorisiert hast."
@@ -23413,10 +23811,10 @@ msgid "Mark as done"
msgstr ""
msgid "Mark as draft"
-msgstr ""
+msgstr "Als Entwurf markieren"
msgid "Mark as ready"
-msgstr ""
+msgstr "Als bereit markieren"
msgid "Mark this issue as a duplicate of another issue"
msgstr ""
@@ -23437,31 +23835,31 @@ msgid "Markdown supported."
msgstr ""
msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
-msgstr ""
+msgstr "MarkdownEditor|Link hinzufügen (%{modifierKey}K)"
msgid "MarkdownEditor|Add a link (%{modifier_key}K)"
-msgstr ""
+msgstr "Link hinzufügen (%{modifier_key}K)"
msgid "MarkdownEditor|Add bold text (%{modifierKey}B)"
-msgstr ""
+msgstr "MarkdownEditor|Fetten Text hinzufügen (%{modifierKey}B)"
msgid "MarkdownEditor|Add bold text (%{modifier_key}B)"
-msgstr ""
+msgstr "MarkdownEditor|Fetten Text hinzufügen (%{modifier_key}B)"
msgid "MarkdownEditor|Add italic text (%{modifierKey}I)"
-msgstr ""
+msgstr "MarkdownEditor|Kursiven Text hinzufügen (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
-msgstr ""
+msgstr "MarkdownEditor|Kursiven Text hinzufügen (%{modifier_key}I)"
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
-msgstr ""
+msgstr "MarkdownEditor|Durchgestrichenen Text hinzufügen (%{modifierKey}⇧X)"
msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
-msgstr ""
+msgstr "Durchgestrichenen Text hinzufügen (%{modifier_key}⇧X)"
msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
+msgstr "MarkdownToolbar|Unterstützt %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr "Keine Dateien gefunden"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "Y-Achsen-Bezeichnung"
@@ -24653,8 +25063,8 @@ msgstr "Migration erfolgreich."
msgid "Milestone"
msgid_plural "Milestones"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Meilenstein"
+msgstr[1] "Meilensteine"
msgid "Milestone due date"
msgstr ""
@@ -24822,7 +25232,7 @@ msgid "Minimum capacity to be available before we schedule more mirrors preempti
msgstr ""
msgid "Minutes"
-msgstr ""
+msgstr "Minuten"
msgid "Mirror direction"
msgstr "Richtung der Spiegelung"
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr "Name"
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr "Namensraum ist leer"
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25309,7 +25731,7 @@ msgid "New Pages Domain"
msgstr ""
msgid "New Password"
-msgstr ""
+msgstr "Neues Passwort"
msgid "New Pipeline Schedule"
msgstr "Neuer Pipeline Zeitplan"
@@ -25365,18 +25787,15 @@ msgstr "Neuer Epic"
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Neue Datei"
msgid "New group"
msgstr "Neue Gruppe"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25411,7 +25830,7 @@ msgid "New name"
msgstr ""
msgid "New password"
-msgstr ""
+msgstr "Neues Passwort"
msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
@@ -25426,13 +25845,13 @@ msgid "New project pages"
msgstr ""
msgid "New project/repository"
-msgstr ""
+msgstr "Neues Projekt/Repository"
msgid "New public deploy key"
msgstr ""
msgid "New related %{issueType}"
-msgstr ""
+msgstr "Neues zugehöriges %{issueType}"
msgid "New release"
msgstr "Neues Release"
@@ -25470,17 +25889,14 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr "Neu..."
-
msgid "Newest first"
-msgstr ""
+msgstr "Neueste zuerst"
msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
-msgstr ""
+msgstr "Weiter"
msgid "Next commit"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr "Kein Workitem-Link gefunden"
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr "Keine Branches gefunden"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Keine Änderungen"
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Es konnte keine Verbindung zu einem Gitaly-Server hergestellt werden. Bitte überprüfe deine Protokolle!"
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr "Keine Lizenz. Alle Rechte vorbehalten"
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr "Kein passendes %{issuable} gefunden. Stelle sicher, dass du eine gültige %{issuable}-ID hinzufügst."
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "Kein Repository"
+msgid "No results"
+msgstr "Keine Ergebnisse"
+
msgid "No runner executable"
msgstr ""
@@ -25789,7 +26211,7 @@ msgid "No tag selected"
msgstr ""
msgid "No template"
-msgstr ""
+msgstr "Keine Vorlage"
msgid "No template selected"
msgstr ""
@@ -25920,7 +26342,7 @@ msgid "NoteForm|Note"
msgstr ""
msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
+msgstr "NoteToolbar|Unterstützt %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Gebe für %{quickActionsDocsLinkStart}Schnellaktionen%{quickActionsDocsLinkEnd} %{keyboardStart}/%{keyboardEnd} ein."
msgid "Notes"
msgstr ""
@@ -25937,11 +26359,17 @@ msgstr "Bist du sicher, dass du die Erstellung dieses Kommentars abbrechen möch
msgid "Notes|Collapse replies"
msgstr "Antworten reduzieren"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
+msgstr "Notes|Interne Notizen sind nur für den Autor, Beauftragte und Mitglieder mit der Rolle Reporter oder höher sichtbar"
+
+msgid "Notes|Last reply by %{name}"
msgstr ""
msgid "Notes|Make this an internal note"
-msgstr ""
+msgstr "Notes|Dies zu einer internen Notiz festlegen"
msgid "Notes|Show all activity"
msgstr "Alle Aktivitäten anzeigen"
@@ -26000,7 +26428,7 @@ msgid "NotificationEvent|Close issue"
msgstr "Ticket schließen"
msgid "NotificationEvent|Close merge request"
-msgstr "Merge-Request schließen"
+msgstr "Merge-Anfrage schließen"
msgid "NotificationEvent|Failed pipeline"
msgstr "Fehlgeschlagene Pipeline"
@@ -26083,21 +26511,48 @@ msgstr "Benachrichtigungen aus"
msgid "Notifications on"
msgstr "Benachrichtigungen ein"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr "Notify|Die automatische DevOps-Pipeline wurde für %{project} deaktiviert"
+
+msgid "Notify|CI/CD project settings"
+msgstr "Notify|CI/CD-Projekteinstellungen"
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr "Notify|Mehr über Auto-DevOps erfahren"
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr "Notify|Die Auto DevOps-Pipeline ist für die Pipeline %{pipeline_link} fehlgeschlagen und wurde für %{project_link} deaktiviert. Um die Auto-DevOps-Pipeline mit deinem Projekt zu verwenden, überprüfe bitte %{supported_langs_link}, passe dein Projekt entsprechend an und aktiviere die Auto-DevOps-Pipeline in deinen %{settings_link}."
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr "Notify|Deine Anfrage, dem %{target_to_join} %{target_type} beizutreten, wurde %{denied_tag}."
+
+msgid "Notify|currently supported languages"
+msgstr "Notify|Aktuell unterstützte Sprachen"
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -26204,7 +26683,7 @@ msgid "Okay"
msgstr ""
msgid "Oldest first"
-msgstr ""
+msgstr "Älteste zuerst"
msgid "OmniAuth"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] "Ein weiteres Element"
msgstr[1] "%d weitere Elemente"
+msgid "One or more arguments are invalid: %{args}."
+msgstr "Ein oder mehrere Argumente sind ungültig: %{args}."
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
-msgstr ""
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
+msgstr "Nur zugänglich für %{membersPageLinkStart}Projektmitglieder%{membersPageLinkEnd}. Die Mitgliedschaft muss jedem Benutzer explizit gewährt werden."
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26701,16 +27186,16 @@ msgid "Open errors"
msgstr ""
msgid "Open in Gitpod"
-msgstr ""
+msgstr "I Gitpod öffnen"
msgid "Open in Web IDE"
-msgstr ""
+msgstr "In Web IDE öffnen"
msgid "Open in file view"
-msgstr ""
+msgstr "In Dateiansicht öffnen"
msgid "Open in your IDE"
-msgstr ""
+msgstr "In deiner IDE öffnen"
msgid "Open new window"
msgstr ""
@@ -26758,7 +27243,7 @@ msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
msgstr ""
msgid "Operations"
-msgstr ""
+msgstr "Vorgänge"
msgid "Operations Dashboard"
msgstr "Operations Dashboard"
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr "Optionen"
msgid "Or you can choose one of the suggested colors below"
msgstr "Oder du wählst eine der unten vorgeschlagenen Farben"
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26884,7 +27375,10 @@ msgid "Owned by:"
msgstr ""
msgid "Owner"
-msgstr "Besitzer(in)"
+msgstr "Eigentümer(in)"
+
+msgid "Owners and administrators"
+msgstr ""
msgid "Owners can modify this selection."
msgstr ""
@@ -26920,7 +27414,7 @@ msgid "PQL|Thank you for reaching out! Our sales team will get back to you soon.
msgstr ""
msgid "Package Registry"
-msgstr ""
+msgstr "Paketregistry"
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,9 +27757,12 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
-msgid "PackageRegistry|Sorry, your filter produced no results"
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
msgstr ""
+msgid "PackageRegistry|Sorry, your filter produced no results"
+msgstr "PackageRegistry|Leider hat dein Filter keine Ergebnisse geliefert"
+
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
@@ -27273,7 +27773,7 @@ msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
msgid "PackageRegistry|There are no packages yet"
-msgstr ""
+msgstr "Es gibt noch keine Pakete"
msgid "PackageRegistry|There was a problem fetching the details for this package."
msgstr ""
@@ -27288,7 +27788,7 @@ msgid "PackageRegistry|This NuGet package has no dependencies."
msgstr ""
msgid "PackageRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "PackageRegistry|Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
msgid "PackageRegistry|Type"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27321,7 +27818,7 @@ msgid "PackageRegistry|published by %{author}"
msgstr ""
msgid "Packages & Registries"
-msgstr ""
+msgstr "Pakete & Registrierungen"
msgid "Page not found"
msgstr "Seite nicht gefunden"
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr "Ãœbergeordnet"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr "Ãœbergeordnetes Epic ist nicht vorhanden."
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27492,7 +27983,7 @@ msgid "Paste issue link"
msgstr ""
msgid "Paste link"
-msgstr ""
+msgstr "Link einfügen"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
@@ -27537,13 +28028,13 @@ msgid "Pending"
msgstr "Wartend"
msgid "Pending Deletion"
-msgstr ""
+msgstr "Ausstehende Löschung"
msgid "Pending comments"
msgstr ""
msgid "Pending deletion"
-msgstr ""
+msgstr "Ausstehende Löschung"
msgid "Pending owner action"
msgstr ""
@@ -27555,7 +28046,7 @@ msgid "People without permission will never get a notification and won't be able
msgstr "Personen ohne Berechtigung werden nie eine Benachrichtigung bekommen und können auch nicht kommentieren."
msgid "People without permission will never get a notification."
-msgstr ""
+msgstr "Personen ohne Berechnung erhalten niemals eine Benachrichtigung."
msgid "Per your subscription agreement with GitLab, you must report your license usage data on a monthly basis. GitLab uses this data to keep your subscription up to date. To report your license usage data, export your license usage file and email it to %{renewal_service_email}. If you need an updated license, GitLab will send the license to the email address registered in the %{customers_dot}, and you can upload this license to your instance."
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28287,7 +28808,7 @@ msgid "Pipeline|Date"
msgstr ""
msgid "Pipeline|Detached merge request pipeline"
-msgstr ""
+msgstr "Pipeline|Getrennte Pipeline für Zusammenführungsanforderungen"
msgid "Pipeline|Failed"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Ausführen"
@@ -28658,12 +29182,6 @@ msgstr "Bitte warte, während wir uns mit deinem Repository verbinden. Aktualisi
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Warte bitte, während wir das Repository für dich importieren. Aktualisiere nach Belieben."
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr "Pods im Einsatz"
@@ -28719,10 +29237,10 @@ msgid "Preferences"
msgstr "Einstellungen"
msgid "Preferences saved."
-msgstr ""
+msgstr "Einstellungen gespeichert."
msgid "Preferences|Behavior"
-msgstr ""
+msgstr "Verhalten"
msgid "Preferences|Choose between fixed (max. 1280px) and fluid (%{percentage}) application layout."
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28767,7 +29288,7 @@ msgid "Preferences|Failed to save preferences."
msgstr ""
msgid "Preferences|For example: 30 minutes ago."
-msgstr ""
+msgstr "Preferences|Beispiel: Vor 30 Minuten."
msgid "Preferences|Gitpod"
msgstr ""
@@ -28787,9 +29308,6 @@ msgstr "Layoutbreite"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr "Navigationsthema"
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr "Vorschau der Nutzdaten"
@@ -29039,11 +29557,8 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "Konto zur Löschung vorgemerkt."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
-msgstr ""
+msgstr "Aktiv"
msgid "Profiles|Add key"
msgstr "Schlüssel hinzufügen"
@@ -29054,7 +29569,7 @@ msgstr "Füge Status-Emoji hinzu"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,21 +29596,24 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr "Datei auswählen..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
-msgstr ""
+msgstr "Stadt, Land"
msgid "Profiles|Clear status"
msgstr "Status löschen"
msgid "Profiles|Commit email"
-msgstr ""
+msgstr "Commit-E-Mail"
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr "Profiles|Einen Dienst für die Anmeldung verbinden."
+
msgid "Profiles|Connected Accounts"
msgstr "Verbundene Konten"
@@ -29115,7 +29633,7 @@ msgid "Profiles|Deleting an account has the following effects:"
msgstr "Löschen eines Kontos hat folgende Auswirkungen:"
msgid "Profiles|Disconnect"
-msgstr ""
+msgstr "Verbindung trennen"
msgid "Profiles|Disconnect %{provider}"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr "Nicht im Profil zeigen"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr "Profil bearbeiten"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29154,7 +29672,7 @@ msgid "Profiles|Expired:"
msgstr ""
msgid "Profiles|Expires:"
-msgstr ""
+msgstr "Läuft ab:"
msgid "Profiles|Feed token was successfully reset"
msgstr ""
@@ -29174,8 +29692,8 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr ""
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr "Profiles|Die Sicherheit deines Kontos erhöhen, indem du die Zwei-Faktor-Authentifizierung (2FA) aktivierst."
msgid "Profiles|Invalid password"
msgstr "Ungültiges Kennwort"
@@ -29187,7 +29705,7 @@ msgid "Profiles|Job title"
msgstr ""
msgid "Profiles|Key"
-msgstr ""
+msgstr "Schlüssel"
msgid "Profiles|Key becomes invalid on this date."
msgstr ""
@@ -29199,13 +29717,13 @@ msgid "Profiles|Key titles are publicly visible."
msgstr ""
msgid "Profiles|Last used:"
-msgstr ""
+msgstr "Zuletzt verwendet:"
msgid "Profiles|Learn more"
msgstr "Erfahre mehr"
msgid "Profiles|Location"
-msgstr ""
+msgstr "Standort"
msgid "Profiles|Made a private contribution"
msgstr "Hat einen privaten Beitrag geleistet"
@@ -29223,7 +29741,7 @@ msgid "Profiles|Notification email"
msgstr "Benachrichtigungs-E-Mail"
msgid "Profiles|Organization"
-msgstr ""
+msgstr "Organisation"
msgid "Profiles|Path"
msgstr "Pfad"
@@ -29250,7 +29768,7 @@ msgid "Profiles|Public avatar"
msgstr ""
msgid "Profiles|Public email"
-msgstr ""
+msgstr "Öffentliche E-Mail"
msgid "Profiles|Publicly visible private SSH keys can compromise your system."
msgstr ""
@@ -29261,13 +29779,13 @@ msgstr "Avatar entfernen"
msgid "Profiles|Select a service to sign in with."
msgstr ""
+msgid "Profiles|Service sign-in"
+msgstr "Profiles|Dienstanmeldung"
+
msgid "Profiles|Set new profile picture"
msgstr "Neues Profilbild festlegen"
-msgid "Profiles|Set your local time zone"
-msgstr ""
-
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr "Einige Optionen sind für LDAP-Accounts nicht verfügbar"
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,26 +29803,26 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "Die maximal zulässige Dateigröße beträgt 200KB."
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Dieses Emoji und diese Nachricht werden in deinem Profil und auf der gesamten Benutzeroberfläche angezeigt."
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
-msgstr ""
+msgstr "Zeiteinstellungen"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
-msgstr "Zwei-Faktor-Authentifizierung"
+msgid "Profiles|Two-factor authentication"
+msgstr "Profiles|Zwei-Faktor-Authentifizierung"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Gib deinen %{confirmationValue} zur Bestätigung ein:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "Was ist dein Status?"
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "Dein Status"
@@ -29459,8 +29980,8 @@ msgstr ""
msgid "Project URL"
msgstr "Projekt-URL"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
-msgstr ""
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr "Der Projektzugriff muss jedem Benutzer explizit gewährt werden. Wenn dieses Projekt Teil einer Gruppe ist, wird den Mitgliedern der Gruppe Zugriff gewährt."
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -29520,7 +30041,7 @@ msgid "Project info:"
msgstr ""
msgid "Project information"
-msgstr ""
+msgstr "Projektinformation"
msgid "Project is required when cluster_type is :project"
msgstr ""
@@ -29582,6 +30103,9 @@ msgstr "Betreuer(innen)"
msgid "ProjectCreationLevel|No one"
msgstr "Niemand"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Name"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29859,7 +30383,7 @@ msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontaktiere eine(n) Administrator(in), um diese Einstellung zu ändern."
msgid "ProjectSettings|Container registry"
-msgstr ""
+msgstr "Container-Registry"
msgid "ProjectSettings|Customize this project's badges."
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30306,11 +30833,14 @@ msgid "Projects are where you store your code, access issues, wiki and other fea
msgstr ""
msgid "Projects contributed to"
-msgstr ""
+msgstr "Projekte, zu denen beigetragen wurde"
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Geteilte Projekte mit %{group_name}"
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30645,7 +31181,7 @@ msgid "Promotions|Merge request approvals"
msgstr ""
msgid "Promotions|Not now, thanks!"
-msgstr ""
+msgstr "Nicht jetzt, danke!"
msgid "Promotions|Push Rules"
msgstr ""
@@ -30711,7 +31247,7 @@ msgid "Promotions|When you have a lot of issues, it can be hard to get an overvi
msgstr ""
msgid "Promotions|You can restrict access to protected branches by choosing a role (Maintainers, Developers) as well as certain users."
-msgstr ""
+msgstr "Promotions|Du kannst den Zugriff auf geschützte Branches einschränken, indem du eine Rolle (Betreuer, Entwickler) sowie bestimmte Benutzer auswählst."
msgid "Promotions|description templates"
msgstr ""
@@ -30756,7 +31292,7 @@ msgid "Protected branches"
msgstr ""
msgid "Protected environments"
-msgstr ""
+msgstr "Geschützte Umgebungen"
msgid "Protected paths"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31155,7 +31694,7 @@ msgid "Quick range"
msgstr ""
msgid "Quickly and easily edit multiple files in your project."
-msgstr ""
+msgstr "Schnell und einfach mehrere Dateien in deinem Projekt bearbeiten."
msgid "Quota of CI/CD minutes"
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 "Aktualisieren"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31469,7 +32008,7 @@ msgid "Related feature flags"
msgstr ""
msgid "Related incidents or issues"
-msgstr ""
+msgstr "Ähnliche Vorfälle oder Probleme"
msgid "Related issues"
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31882,10 +32424,7 @@ msgid "Reopens this %{quick_action_target}."
msgstr ""
msgid "Replace"
-msgstr ""
-
-msgid "Replace %{blob_name}"
-msgstr ""
+msgstr "Ersetzen"
msgid "Replace %{name}"
msgstr ""
@@ -31914,26 +32453,29 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Reply by email"
+msgid "Reply"
msgstr ""
+msgid "Reply by email"
+msgstr "Antworten per E-Mail"
+
msgid "Reply internally"
msgstr ""
msgid "Reply to comment"
-msgstr ""
+msgstr "Auf Kommentar antworten"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "Antworte direkt auf diese E-Mail oder %{view_it_on_gitlab}."
msgid "Reply…"
-msgstr ""
+msgstr "Antworten…"
msgid "Report abuse"
msgstr ""
msgid "Report abuse to admin"
-msgstr ""
+msgstr "Missbrauch an Admins melden"
msgid "Report couldn't be prepared."
msgstr ""
@@ -31942,7 +32484,7 @@ msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Report your license usage data to GitLab"
-msgstr ""
+msgstr "Melde deine Lizenznutzungsdaten an GitLab"
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr "Reports|Namen fehlgeschlagener Tests kopieren, um sie lokal auszuführen"
+
+msgid "Reports|Copy failed tests"
+msgstr "Reports|Fehlgeschlagene Tests kopieren"
+
msgid "Reports|Execution time"
msgstr "Ausführungszeit"
@@ -32289,10 +32837,10 @@ msgid "Request attention from %{users_sentence}."
msgstr ""
msgid "Request attention from assignee or reviewer"
-msgstr ""
+msgstr "Aufmerksamkeit des Zuständigen oder Prüfers anfordern"
msgid "Request attention from assignee(s) or reviewer(s)"
-msgstr ""
+msgstr "Aufmerksamkeit von Beauftragten oder Prüfern anfordern"
msgid "Request data is too large"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "Zugriffstoken für den Health-Check zurücksetzen"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32533,6 +33078,9 @@ msgid "Restoring the group will prevent the group, its subgroups and projects fr
msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
+msgstr "Durch die Wiederherstellung des Projekts wird verhindert, dass das Projekt an diesem Datum entfernt wird, und es wird den Benutzern wieder ermöglicht, Änderungen daran vorzunehmen."
+
+msgid "Restrict access by IP address"
msgstr ""
msgid "Restrict membership by email domain"
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Wiederhole diese Aufgabe"
@@ -32607,7 +33149,7 @@ msgid "Review App|View latest app"
msgstr ""
msgid "Review changes"
-msgstr ""
+msgstr "Änderungen prüfen"
msgid "Review requests for you"
msgstr ""
@@ -32766,7 +33308,7 @@ msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spa
msgstr ""
msgid "Runners|A new version is available"
-msgstr ""
+msgstr "Eine neue Version ist verfügbar"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
msgstr ""
@@ -32870,7 +33412,7 @@ msgid "Runners|Download latest binary"
msgstr ""
msgid "Runners|Edit your search and try again"
-msgstr ""
+msgstr "Bearbeite deine Suche und versuche es erneut"
msgid "Runners|Enable stale runner cleanup"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32936,7 +33481,7 @@ msgid "Runners|New registration token generated!"
msgstr ""
msgid "Runners|No results found"
-msgstr ""
+msgstr "Keine Ergebnisse gefunden"
msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33150,7 +33692,7 @@ msgid "Runners|This runner is available to all projects and subgroups in a group
msgstr ""
msgid "Runners|This runner is outdated, an upgrade is recommended"
-msgstr ""
+msgstr "Dieser Runner ist veraltet, ein Upgrade wird empfohlen"
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33222,10 +33773,10 @@ msgid "Runners|stale"
msgstr ""
msgid "Runners|upgrade available"
-msgstr ""
+msgstr "Upgrade verfügbar"
msgid "Runners|upgrade recommended"
-msgstr ""
+msgstr "Upgrade empfohlen"
msgid "Running"
msgstr "Laufend"
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33435,10 +34001,10 @@ msgid "Scroll up"
msgstr ""
msgid "Search"
-msgstr "Suche"
+msgstr "Suchen"
msgid "Search GitLab"
-msgstr ""
+msgstr "GitLab durchsuchen"
msgid "Search a group"
msgstr ""
@@ -33712,7 +34278,7 @@ msgid "Security"
msgstr "Sicherheit"
msgid "Security & Compliance"
-msgstr ""
+msgstr "Sicherheit & Compliance"
msgid "Security Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr "SecurityOrchestration|, und %{count} mehr"
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr "SecurityOrchestration|Direkt"
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr "SecurityOrchestration|Vererbt"
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34126,7 +34701,7 @@ msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
msgstr ""
msgid "SecurityOrchestration|Sorry, your filter produced no results."
-msgstr ""
+msgstr "SecurityOrchestration|Dein Filter hat leider keine Ergebnisse geliefert."
msgid "SecurityOrchestration|Source"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34441,7 +35004,7 @@ msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity.
msgstr ""
msgid "SecurityReports|Sorry, your filter produced no results"
-msgstr ""
+msgstr "SecurityReports|Leider hat dein Filter keine Ergebnisse geliefert"
msgid "SecurityReports|Status"
msgstr ""
@@ -34492,7 +35055,7 @@ msgid "SecurityReports|These vulnerabilities were detected in external sources.
msgstr ""
msgid "SecurityReports|To widen your search, change or remove filters above"
-msgstr ""
+msgstr "SecurityReports|Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
msgid "SecurityReports|Tool"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34630,10 +35196,10 @@ msgid "Select an iteration"
msgstr ""
msgid "Select assignee"
-msgstr ""
+msgstr "Beauftragte(n) auswählen"
msgid "Select assignee(s)"
-msgstr ""
+msgstr "Beauftragte(n)"
msgid "Select branch"
msgstr ""
@@ -34681,7 +35247,7 @@ msgid "Select project to create %{type}"
msgstr ""
msgid "Select project to create issue"
-msgstr ""
+msgstr "Projekt auswählen, um ein Problem zu erstellen"
msgid "Select projects"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr "Quellbranch auswählen"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr "Zielbranch auswählen"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34789,7 +35361,7 @@ msgid "Send"
msgstr ""
msgid "Send a single email notification to Owners and Maintainers for new alerts."
-msgstr ""
+msgstr "Eine einzelne E-Mail-Benachrichtigung an Eigentümer und Betreuer für neue Benachrichtigungen senden."
msgid "Send confirmation email"
msgstr ""
@@ -34858,7 +35430,7 @@ msgid "Server version"
msgstr "Serverversion"
msgid "Service"
-msgstr ""
+msgstr "Dienst"
msgid "Service Account"
msgstr ""
@@ -34924,7 +35496,7 @@ msgid "ServicePing|Turn on service ping to review instance-level analytics."
msgstr ""
msgid "Services"
-msgstr ""
+msgstr "Dienste"
msgid "Session ID"
msgstr ""
@@ -34947,11 +35519,8 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "Lege die Standardeinstellungen fest und beschränke die Sichtbarkeitsstufen. Konfiguriere die Importquellen und das Git-Zugriffsprotokoll."
-
msgid "Set due date"
-msgstr ""
+msgstr "Fälligkeitsdatum setzen"
msgid "Set health status"
msgstr ""
@@ -34969,10 +35538,10 @@ msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
-msgstr ""
+msgstr "Meilenstein setzen"
msgid "Set new password"
-msgstr ""
+msgstr "Lege neues Passwort fest"
msgid "Set parent epic to an epic"
msgstr ""
@@ -34990,7 +35559,7 @@ msgid "Set rate limits for searches performed by web or API requests."
msgstr ""
msgid "Set severity"
-msgstr ""
+msgstr "Schweregrad festlegen"
msgid "Set sign-in restrictions for all users."
msgstr ""
@@ -34999,11 +35568,14 @@ msgid "Set size limits for displaying diffs in the browser."
msgstr ""
msgid "Set target branch"
-msgstr ""
+msgstr "Ziel-Branch setzen"
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35035,7 +35607,7 @@ msgid "Set this number to 0 to disable the limit."
msgstr ""
msgid "Set time estimate"
-msgstr ""
+msgstr "Zeitschätzung festlegen"
msgid "Set time estimate to %{time_estimate}."
msgstr ""
@@ -35059,14 +35631,17 @@ msgid "Set up assertions/attributes/claims (email, first_name, last_name) and Na
msgstr "Richte notwendige Angaben (E-Mail, Vorname, Nachname) und NameID gemäß %{docsLinkStart}der Dokumentation %{icon}%{docsLinkEnd} ein"
msgid "Set up new device"
-msgstr ""
+msgstr "Neues Gerät einrichten"
msgid "Set up new password"
-msgstr ""
+msgstr "Lege neues Passwort fest"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Richte dein Projekt so ein, dass Änderungen automatisch an ein anderes Repository gesendet bzw. von diesem abgerufen werden. Branches, Tags und Commits werden automatisch synchronisiert."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr "Sichtbarkeit von Projektinhalten festlegen. Konfiguriere Importquellen und Git-Zugriffsprotokolle."
+
msgid "Set weight"
msgstr ""
@@ -35128,7 +35703,7 @@ msgid "Sets the milestone to %{milestone_reference}."
msgstr ""
msgid "Sets the severity"
-msgstr ""
+msgstr "Legt den Schweregrad fest"
msgid "Sets time estimate to %{time_estimate}."
msgstr ""
@@ -35235,10 +35810,10 @@ msgid "Should you ever lose your phone or access to your one time password secre
msgstr ""
msgid "Show Pipeline ID"
-msgstr ""
+msgstr "Pipeline-ID anzeigen"
msgid "Show Pipeline IID"
-msgstr ""
+msgstr "Pipeline-IID anzeigen"
msgid "Show all %{issuable_type}."
msgstr ""
@@ -35274,22 +35849,22 @@ msgid "Show command"
msgstr "Befehl anzeigen"
msgid "Show comments"
-msgstr ""
+msgstr "Kommentare anzeigen"
msgid "Show comments on this file"
msgstr ""
msgid "Show comments only"
-msgstr ""
+msgstr "Nur Kommentare anzeigen"
msgid "Show complete raw log"
msgstr "Zeige komplettes Rohprotokoll"
msgid "Show details"
-msgstr ""
+msgstr "Details anzeigen"
msgid "Show file browser"
-msgstr ""
+msgstr "Dateibrowser anzeigen"
msgid "Show file contents"
msgstr ""
@@ -35298,7 +35873,7 @@ msgid "Show group milestones"
msgstr ""
msgid "Show labels"
-msgstr ""
+msgstr "Labels anzeigen"
msgid "Show latest version"
msgstr "Neuste Version zeigen"
@@ -35319,10 +35894,10 @@ msgid "Show sub-group milestones"
msgstr ""
msgid "Show the Closed list"
-msgstr ""
+msgstr "Liste \"Geschlossen\" anzeigen"
msgid "Show the Open list"
-msgstr ""
+msgstr "Liste \"Geöffnet\" anzeigen"
msgid "Show thread"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Leerzeichenänderungen anzeigen"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "Nebeneinander"
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Etwas lief schief, %{project} konnte nicht zum Dashboard hinzugefügt werden"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35915,7 +36547,7 @@ msgid "Sorry, you have exceeded the maximum browsable page number. Please use th
msgstr ""
msgid "Sorry, your filter produced no results"
-msgstr ""
+msgstr "Entschuldigung, dein Filter ergab keine Ergebnisse"
msgid "Sort by"
msgstr "Sortieren nach"
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr "Speicher:"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr "Untergruppen"
msgid "Subgroups and projects"
msgstr "Untergruppen und Projekte"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36620,7 +37258,7 @@ msgid "Submit as spam"
msgstr "Als Spam einreichen"
msgid "Submit feedback"
-msgstr ""
+msgstr "Feedback senden"
msgid "Submit review"
msgstr "Review senden"
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr "Suite"
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr "Systemstandard (%{default})"
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37348,7 +38007,7 @@ msgid "TagsPage|New tag"
msgstr "Neuer Tag"
msgid "TagsPage|Only a project maintainer or owner can delete a protected tag"
-msgstr ""
+msgstr "TagsPage|Nur ein Projektbetreuer oder -besitzer kann ein geschütztes Tag löschen"
msgid "TagsPage|Optionally, add a message to the tag. Leaving this blank creates a %{link_start}lightweight tag.%{link_end}"
msgstr ""
@@ -37366,7 +38025,7 @@ msgid "TagsPage|Repository has no tags yet."
msgstr "Repository hat noch keine Tags."
msgid "TagsPage|Sorry, your filter produced no results."
-msgstr ""
+msgstr "TagsPage|Dein Filter hat leider keine Ergebnisse geliefert."
msgid "TagsPage|Tags"
msgstr "Tags"
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr "Aufgabe mit ID: %{id} konnte nicht gefunden werden."
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr "TestReports|Testnamen kopieren, um ihn lokal erneut auszuführen"
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37965,7 +38630,7 @@ msgid "The current epic"
msgstr ""
msgid "The current incident"
-msgstr ""
+msgstr "Der aktuelle Vorfall"
msgid "The current issue"
msgstr "Das aktuelle Ticket"
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr "Die Pipelinezeitplan startet in Zukunft wiederholt Pipelines für bestim
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr "Auf das Projekt kann ohne Authentifizierung zugegriffen werden."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38455,11 +39114,14 @@ msgid "There are no open test cases"
msgstr ""
msgid "There are no packages yet"
-msgstr ""
+msgstr "Es gibt noch keine Pakete"
msgid "There are no projects shared with this group yet"
msgstr "Es gibt noch keine geteilten Projekte mit dieser Gruppe"
+msgid "There are no secure files yet."
+msgstr "Hier sind noch keine sicheren Dateien."
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39025,7 +39693,7 @@ msgid "This issue cannot be made public because it belongs to a confidential epi
msgstr ""
msgid "This issue is confidential and should only be visible to team members with at least Reporter access."
-msgstr ""
+msgstr "Dieses Problem ist vertraulich und sollte nur für Teammitglieder mit mindestens Reporter-Zugriff sichtbar sein."
msgid "This issue is currently blocked by the following issues:"
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr "Dieser Job erfordert eine manuelle Aktion"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr "Dieser Runner wird nur Pipelines von geschützen Branches ausführen"
msgid "This setting can be overridden in each project."
msgstr "Diese Einstellung kann in jedem Projekt überschrieben werden."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39334,7 +39999,7 @@ msgid "This will remove the fork relationship between this project and other pro
msgstr ""
msgid "Thread to reply to cannot be found"
-msgstr ""
+msgstr "Thread zum Antworten kann nicht gefunden werden"
msgid "Threshold in bytes at which to compress Sidekiq job arguments."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr "Zeit bis ein Ticket geplant wird"
msgid "Time before an issue starts implementation"
msgstr "Zeit bis die Implementierung für ein Ticket beginnt"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "Zeit zwischen Anlegen und Mergen/Schließen eines Merge-Requests"
@@ -39423,6 +40082,12 @@ msgstr "Geschätzt"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Geschätzt:"
@@ -39448,7 +40113,7 @@ msgid "Timeago|%s hours remaining"
msgstr "%s Stunden verbleibend"
msgid "Timeago|%s minutes ago"
-msgstr ""
+msgstr "Timeago|vor %s Minuten"
msgid "Timeago|%s minutes remaining"
msgstr "%s Minuten verbleibend"
@@ -39481,7 +40146,7 @@ msgid "Timeago|1 day remaining"
msgstr "1 Tag verbleibend"
msgid "Timeago|1 hour ago"
-msgstr "vor 1 Stunde"
+msgstr "Timeago|vor 1 Stunde"
msgid "Timeago|1 hour remaining"
msgstr "1 Stunde verbleibend"
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39809,10 +40471,10 @@ msgid "To view usage, refresh this page in a few minutes."
msgstr ""
msgid "To widen your search, change or remove filters above"
-msgstr ""
+msgstr "Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
msgid "To widen your search, change or remove filters above."
-msgstr ""
+msgstr "Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
msgid "To-Do"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "Seitenleiste ein-/ausblenden"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-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"
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40277,7 +40942,7 @@ msgid "Try to keep the first line under 52 characters and the others under 72."
msgstr ""
msgid "Try using a different search term to find the file you are looking for."
-msgstr ""
+msgstr "Versuche, einen anderen Suchbegriff zu verwenden, um die gewünschte Datei zu finden."
msgid "Trying to communicate with your device. Plug it in (if needed) and press the button on the device now."
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr "Zwei-Faktor-Authentifizierung"
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr "CPU-Informationen können nicht erfasst werden"
msgid "Unable to collect memory info"
msgstr "Speicherinformationen können nicht erfasst werden"
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr "Der Diff konnten nicht geladen werden. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "Das Merge-Request-Widget konnte nicht geladen werden. Versuchen Sie die Seite neu zu laden."
+msgid "Unable to parse the vulnerability report's options."
+msgstr "Die Optionen des Schwachstellenberichts können nicht analysiert werden."
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr "Unbekannt"
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40778,7 +41431,7 @@ msgid "Updated %{updated_at} by %{updated_by}"
msgstr "Aktualisiert %{updated_at} von %{updated_by}"
msgid "Updated date"
-msgstr ""
+msgstr "Aktualisiert am"
msgid "Updating"
msgstr "Aktualisiere"
@@ -40825,11 +41478,8 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "Zum Upload klicken"
-
-msgid "Uploaded"
-msgstr ""
+msgid "Uploaded date"
+msgstr "Hochladedatum"
msgid "Uploading changes to terminal"
msgstr ""
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41282,7 +41932,7 @@ msgid "Used by more than 100,000 organizations, GitLab is the most popular solut
msgstr ""
msgid "Used programming language"
-msgstr ""
+msgstr "Verwendete Programmiersprache"
msgid "Used to help configure your identity provider"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41672,7 +42328,7 @@ msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their
msgstr ""
msgid "Valid From"
-msgstr ""
+msgstr "Gültig ab"
msgid "Validate"
msgstr ""
@@ -41812,7 +42468,7 @@ msgid "Values that contain the %{codeStart}$%{codeEnd} character can be consider
msgstr ""
msgid "Variable"
-msgstr ""
+msgstr "Variable"
msgid "Variable will be masked in job logs."
msgstr ""
@@ -41821,7 +42477,7 @@ msgid "Variables"
msgstr ""
msgid "Variables can be:"
-msgstr ""
+msgstr "Variablen können sein:"
msgid "Variables store information, like passwords and secret keys, that you can use in job scripts."
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "Geeignete Genehmigungsberechtigte anzeigen"
@@ -41972,7 +42622,7 @@ msgid "View incident details at"
msgstr ""
msgid "View incident details."
-msgstr ""
+msgstr "Einzelheiten zum Vorfall anzeigen."
msgid "View incident issues."
msgstr ""
@@ -42346,7 +42996,7 @@ msgid "Vulnerability|Detection method"
msgstr ""
msgid "Vulnerability|Download"
-msgstr ""
+msgstr "Herunterladen"
msgid "Vulnerability|Enter the associated CVE or CWE entries for this vulnerability."
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Wir wollen sicher gehen, dass du es bist. Bitte bestätige, dass du kein Roboter bist."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42862,10 +43512,10 @@ msgid "What will you use this group for?"
msgstr ""
msgid "What would you like to do?"
-msgstr ""
+msgstr "Was möchtest du gerne tun?"
msgid "What's new"
-msgstr ""
+msgstr "Was ist neu?"
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr "WorkItem|Beauftragte(n) hinzufügen"
+
+msgid "WorkItem|Add assignees"
+msgstr "WorkItem|Beauftragte hinzufügen"
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43248,7 +43918,7 @@ msgid "Write a description…"
msgstr ""
msgid "Write an internal note or drag your files here…"
-msgstr ""
+msgstr "Eine interne Notiz schreiben oder Dateien hierher ziehen…"
msgid "Write milestone description..."
msgstr ""
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43397,7 +44067,7 @@ msgid "You are receiving this message because you are a GitLab administrator for
msgstr ""
msgid "You are signed in to GitLab as:"
-msgstr ""
+msgstr "Du bist bei GitLab angemeldet als:"
msgid "You are trying to upload something other than an image. Please upload a .png, .jpg, .jpeg, .gif, .bmp, .tiff or .ico."
msgstr ""
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "Du kannst Dateien nur bearbeiten, wenn du dich auf einem Branch befindest"
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr "Du kannst das Projekt nur in deine Namensräume übertragen."
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Du kannst den Merge-Konflikt lösen, indem du entweder den interaktiven Modus verwendest, indem du die Schaltflächen %{use_ours} oder %{use_theirs} wählst, oder indem du die Dateien direkt bearbeitest. Übernimm diese Änderungen mittels Commit in %{branch_name}"
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr "Du hast nicht genügend Berechtigungen, um diese Namespace Sperre zu entfernen"
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr "Du benötigst eine andere Lizenz, um die FileLocks-Funktion zu aktivieren"
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr "Du erhältst diese E-Mail aufgrund deines Accounts auf %{host}."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Du erhältst diese E-Mail aufgrund deines Kontos auf %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43954,7 +44639,7 @@ msgid "You've reached your %{free_limit} member limit across all of your persona
msgstr ""
msgid "You've rejected %{user}"
-msgstr ""
+msgstr "Du hast %{user} abgelehnt"
msgid "YouTube"
msgstr "YouTube"
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44257,10 +44933,10 @@ msgid "Your response has been recorded."
msgstr ""
msgid "Your search didn't match any commits."
-msgstr ""
+msgstr "Deine Suche hat keine Commits gefunden."
msgid "Your search didn't match any commits. Try a different query."
-msgstr ""
+msgstr "Deine Suche hat keine Commits gefunden. Versuche es mit einer anderen Abfrage."
msgid "Your search timed out"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr "Deine Aktualisierung ist fehlgeschlagen. Du kannst nur ein Design hochladen, wenn du es auf ein vorhandenes Design ziehst."
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr "Deine Aktualisierung ist fehlgeschlagen. Du musst eine Datei mit demselben Dateinamen hochladen, wenn du sie auf ein vorhandenes Design ziehst."
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr "Das Feature-Flag `work_items_hierarchy` ist für dieses Projekt deaktiviert"
+
msgid "a deleted user"
msgstr "ein(e) gelöschte(r) Benutzer(in)"
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr "%{reportType}: Beim Laden trat ein Fehler auf"
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44927,7 +45624,7 @@ msgid "could not read private key, is the passphrase correct?"
msgstr "konnte den privaten Schlüssel nicht lesen, ist die Passphrase korrekt?"
msgid "created"
-msgstr ""
+msgstr "erstellt"
msgid "created %{issuable_created} by %{author}"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr "abgelehnt"
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr "Gruppen"
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45270,7 +45984,7 @@ msgid "is too long (maximum is 1000 entries)"
msgstr "ist zu lang (mehr als 1000 Einträge)"
msgid "issue"
-msgstr "Ticket"
+msgstr "Problem"
msgid "issues at risk"
msgstr ""
@@ -45349,8 +46063,8 @@ msgstr ""
msgid "member"
msgid_plural "members"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Mitglied"
+msgstr[1] "Mitglieder"
msgid "merge request"
msgid_plural "merge requests"
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr "Falsches Zustimmungspasswort."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Genehmigen"
@@ -45492,7 +46212,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "mrWidget|Create issue to resolve all threads"
-msgstr ""
+msgstr "mrWidget|Problem erstellen, um alle Threads zu lösen"
msgid "mrWidget|Delete source branch"
msgstr "Quellbranch löschen"
@@ -45540,7 +46260,7 @@ msgid "mrWidget|Mark as ready"
msgstr ""
msgid "mrWidget|Members who can merge are allowed to add commits."
-msgstr ""
+msgstr "Mitglieder die zusammenführen können, dürfen Commits hinzufügen."
msgid "mrWidget|Mentions issue"
msgid_plural "mrWidget|Mentions issues"
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr "Merge"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr "Weitere Informationen"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr "%{item}, und %{lastItem}"
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "Ãœbergeordneter"
msgstr[1] "Ãœbergeordnete"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "Passwort"
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "pod_name darf nicht mehr als %{max_length} Zeichen enthalten"
-
msgid "point"
msgid_plural "points"
msgstr[0] "Punkt"
@@ -45984,7 +46713,7 @@ msgstr[0] "Antwort"
msgstr[1] "Antworten"
msgid "reply should have same confidentiality as top-level note"
-msgstr ""
+msgstr "Die Antwort sollte die gleiche Vertraulichkeit haben wie die Notiz der obersten Ebene"
msgid "repositories"
msgstr ""
@@ -46037,6 +46766,9 @@ msgstr "Unbekannt"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "yaml ungültig"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index 1fe7bcf8092..3cedef347ad 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/en_GB/gitlab.po b/locale/en_GB/gitlab.po
new file mode 100644
index 00000000000..c3cef09f041
--- /dev/null
+++ b/locale/en_GB/gitlab.po
@@ -0,0 +1,47010 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: gitlab-ee\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: English, United Kingdom\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Crowdin-Project: gitlab-ee\n"
+"X-Crowdin-Project-ID: 288872\n"
+"X-Crowdin-Language: en-GB\n"
+"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File-ID: 16\n"
+"PO-Revision-Date: 2022-07-14 17:14\n"
+
+msgid " %{start} to %{end}"
+msgstr ""
+
+msgid " (from %{timeoutSource})"
+msgstr ""
+
+msgid " Collected %{time}"
+msgstr ""
+
+msgid " Please sign in."
+msgstr ""
+
+msgid " Try to %{action} this file again."
+msgstr ""
+
+msgid " You need to do this before %{grace_period_deadline}."
+msgstr ""
+
+msgid " and "
+msgstr ""
+
+msgid " and %{sliced}"
+msgstr ""
+
+msgid " or "
+msgstr ""
+
+msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
+msgstr ""
+
+msgid " or %{emphasisStart}#id%{emphasisEnd}"
+msgstr ""
+
+msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
+msgstr ""
+
+msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
+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 ""
+
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
+msgid "#%{issueIid} (closed)"
+msgstr ""
+
+msgid "#general, #development"
+msgstr ""
+
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Approval"
+msgid_plural "%d Approvals"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Module"
+msgid_plural "%d Modules"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Other"
+msgid_plural "%d Others"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Package"
+msgid_plural "%d Packages"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Scanned URL"
+msgid_plural "%d Scanned URLs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d URL scanned"
+msgid_plural "%d URLs scanned"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional approver"
+msgid_plural "%d additional approvers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional assignee"
+msgid_plural "%d additional assignees"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional commenter"
+msgid_plural "%d additional commenters"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional committer"
+msgid_plural "%d additional committers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d approver"
+msgid_plural "%d approvers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d approver (you've approved)"
+msgid_plural "%d approvers (you've approved)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d assigned issue"
+msgid_plural "%d assigned issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d changed file"
+msgid_plural "%d changed files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d character remaining"
+msgid_plural "%d characters remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d child epic"
+msgid_plural "%d child epics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d code quality issue"
+msgid_plural "%d code quality issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d comment on this commit"
+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] ""
+msgstr[1] ""
+
+msgid "%d commit,"
+msgid_plural "%d commits,"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d completed issue"
+msgid_plural "%d completed issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d contribution"
+msgid_plural "%d contributions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d exporter"
+msgid_plural "%d exporters"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d failed"
+msgid_plural "%d failed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d failed security job"
+msgid_plural "%d failed security jobs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d file"
+msgid_plural "%d files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d fixed test result"
+msgid_plural "%d fixed test results"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d fork"
+msgid_plural "%d forks"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d group"
+msgid_plural "%d groups"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d inaccessible merge request"
+msgid_plural "%d inaccessible merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d issue"
+msgid_plural "%d issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d issue in this group"
+msgid_plural "%d issues in this group"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d issue successfully imported with the label"
+msgid_plural "%d issues successfully imported with the label"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d layer"
+msgid_plural "%d layers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d merge request"
+msgid_plural "%d merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "%d merge requests"
+msgid_plural "%d merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d metric"
+msgid_plural "%d metrics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d milestone"
+msgid_plural "%d milestones"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d more comment"
+msgid_plural "%d more comments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d pending comment"
+msgid_plural "%d pending comments"
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d previously merged commit"
+msgid_plural "%d previously merged commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d project"
+msgid_plural "%d projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d project selected"
+msgid_plural "%d projects selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d remaining"
+msgid_plural "%d remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d star"
+msgid_plural "%d stars"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d tag"
+msgid_plural "%d tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d tag per image name"
+msgid_plural "%d tags per image name"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d unassigned issue"
+msgid_plural "%d unassigned issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d unresolved thread"
+msgid_plural "%d unresolved threads"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability dismissed"
+msgid_plural "%d vulnerabilities dismissed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to confirmed"
+msgid_plural "%d vulnerabilities set to confirmed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to dismissed"
+msgid_plural "%d vulnerabilities set to dismissed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to needs triage"
+msgid_plural "%d vulnerabilities set to needs triage"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to resolved"
+msgid_plural "%d vulnerabilities set to resolved"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d warning found:"
+msgid_plural "%d warnings found:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%s additional commit has been omitted to prevent performance issues."
+msgid_plural "%s additional commits have been omitted to prevent performance issues."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{actionText} & %{openOrClose} %{noteable}"
+msgstr ""
+
+msgid "%{actionText} & close %{noteable}"
+msgstr ""
+
+msgid "%{actionText} & reopen %{noteable}"
+msgstr ""
+
+msgid "%{address} is an invalid IP address range"
+msgstr ""
+
+msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
+msgstr ""
+
+msgid "%{author_link} cloned %{original_issue}. You don't have access to the new project."
+msgstr ""
+
+msgid "%{author_link} wrote:"
+msgstr ""
+
+msgid "%{authorsName}'s thread"
+msgstr ""
+
+msgid "%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}"
+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 "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
+msgstr ""
+
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
+
+msgid "%{completedCount} completed weight"
+msgstr ""
+
+msgid "%{completedCount} of %{count} task completed"
+msgid_plural "%{completedCount} of %{count} tasks completed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{completedWeight} of %{totalWeight} weight completed"
+msgstr ""
+
+msgid "%{completed} of %{total} issues closed"
+msgstr ""
+
+msgid "%{completed} of %{total} weight completed"
+msgstr ""
+
+msgid "%{cores} cores"
+msgstr ""
+
+msgid "%{count} %{scope} for term '%{term}'"
+msgstr ""
+
+msgid "%{count} LOC/commit"
+msgstr ""
+
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} contact"
+msgid_plural "%{count} contacts"
+msgstr[0] ""
+msgstr[1] ""
+
+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 ""
+
+msgid "%{count} more assignees"
+msgstr ""
+
+msgid "%{count} more release"
+msgid_plural "%{count} more releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} related %{pluralized_subject}: %{links}"
+msgstr ""
+
+msgid "%{count} selected"
+msgstr ""
+
+msgid "%{count} total weight"
+msgstr ""
+
+msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
+msgstr ""
+
+msgid "%{dashboard_path} could not be found."
+msgstr ""
+
+msgid "%{days} days until tags are automatically removed"
+msgstr ""
+
+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 ""
+
+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. %{docs_link}"
+msgstr ""
+
+msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
+msgstr ""
+
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
+msgid "%{due_date} (Past due)"
+msgstr ""
+
+msgid "%{duration}ms"
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to cherry-pick this commit again."
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to create a new directory again."
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to revert this commit again."
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to upload a file again."
+msgstr ""
+
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
+msgid "%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload."
+msgstr ""
+
+msgid "%{extra} more downstream pipelines"
+msgstr ""
+
+msgid "%{filePath} deleted"
+msgstr ""
+
+msgid "%{firstLabel} +%{labelCount} more"
+msgstr ""
+
+msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
+msgstr ""
+
+msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
+msgstr ""
+
+msgid "%{gitlab_experience_text}. We won't share this information with anyone."
+msgstr ""
+
+msgid "%{global_id} is not a valid ID for %{expected_types}."
+msgstr ""
+
+msgid "%{group_name} activity"
+msgstr ""
+
+msgid "%{group_name} group members"
+msgstr ""
+
+msgid "%{group_name} is approaching the limit of available seats"
+msgstr ""
+
+msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
+msgstr ""
+
+msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
+msgstr ""
+
+msgid "%{hook_type} was deleted"
+msgstr ""
+
+msgid "%{hook_type} was scheduled for deletion"
+msgstr ""
+
+msgid "%{host} sign-in from new location"
+msgstr ""
+
+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 ""
+
+msgid "%{issuableType} will be removed! Are you sure?"
+msgstr ""
+
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
+msgid "%{issueType} actions"
+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 ""
+
+msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
+msgstr ""
+
+msgid "%{labelStart}Class:%{labelEnd} %{class}"
+msgstr ""
+
+msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
+msgstr ""
+
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
+msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
+msgstr ""
+
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
+msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
+msgstr ""
+
+msgid "%{labelStart}File:%{labelEnd} %{file}"
+msgstr ""
+
+msgid "%{labelStart}Image:%{labelEnd} %{image}"
+msgstr ""
+
+msgid "%{labelStart}Method:%{labelEnd} %{method}"
+msgstr ""
+
+msgid "%{labelStart}Namespace:%{labelEnd} %{namespace}"
+msgstr ""
+
+msgid "%{labelStart}Scanner:%{labelEnd} %{scanner}"
+msgstr ""
+
+msgid "%{labelStart}Sent request:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
+msgstr ""
+
+msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
+msgstr ""
+
+msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
+msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
+msgstr ""
+
+msgid "%{level_name} is not allowed in a %{group_level_name} group."
+msgstr ""
+
+msgid "%{level_name} is not allowed since the fork source project has lower visibility."
+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 ""
+
+msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
+msgstr ""
+
+msgid "%{listToShow}, and %{awardsListLength} more"
+msgstr ""
+
+msgid "%{location} is missing required keys: %{keys}"
+msgstr ""
+
+msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
+msgstr ""
+
+msgid "%{mergeLength}/%{usersLength} can merge"
+msgstr ""
+
+msgid "%{message} showing first %{warnings_displayed}"
+msgstr ""
+
+msgid "%{message}. Your attention request was removed."
+msgstr ""
+
+msgid "%{milestone} (expired)"
+msgstr ""
+
+msgid "%{milliseconds}ms"
+msgstr ""
+
+msgid "%{minutesUsed} minutes"
+msgstr ""
+
+msgid "%{model_name} not found"
+msgstr ""
+
+msgid "%{mrText}, this issue will be closed automatically."
+msgstr ""
+
+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} namespace has run out of Shared Runner Pipeline minutes. No new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
+msgid "%{name} contained %{resultsString}"
+msgstr ""
+
+msgid "%{name} found %{resultsString}"
+msgstr ""
+
+msgid "%{name} is already being used for another emoji"
+msgstr ""
+
+msgid "%{name} is reserved for %{type} report type"
+msgstr ""
+
+msgid "%{name} is scheduled for %{action}"
+msgstr ""
+
+msgid "%{name}'s avatar"
+msgstr ""
+
+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}) 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!"
+msgstr ""
+
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
+msgid "%{no_of_days} day"
+msgid_plural "%{no_of_days} days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
+msgstr ""
+
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
+msgid "%{openedEpics} open, %{closedEpics} closed"
+msgstr ""
+
+msgid "%{openedIssues} open, %{closedIssues} closed"
+msgstr ""
+
+msgid "%{percentageUsed}%% used"
+msgstr ""
+
+msgid "%{percentage}%% issues closed"
+msgstr ""
+
+msgid "%{percentage}%% weight completed"
+msgstr ""
+
+msgid "%{percent}%% complete"
+msgstr ""
+
+msgid "%{percent}%{percentSymbol} complete"
+msgstr ""
+
+msgid "%{placeholder} is not a valid color scheme"
+msgstr ""
+
+msgid "%{placeholder} is not a valid theme"
+msgstr ""
+
+msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})"
+msgstr ""
+
+msgid "%{project_name}"
+msgstr ""
+
+msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}"
+msgstr ""
+
+msgid "%{ref} cannot be added: %{error}"
+msgstr ""
+
+msgid "%{releases} release"
+msgid_plural "%{releases} releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{remaining_approvals} left"
+msgstr ""
+
+msgid "%{reportType} %{status}"
+msgstr ""
+
+msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
+msgstr ""
+
+msgid "%{reportType} detected no %{totalStart}new%{totalEnd} vulnerabilities."
+msgstr ""
+
+msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
+msgstr ""
+
+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 ""
+
+msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
+msgstr ""
+
+msgid "%{runner} created %{timeago}"
+msgstr ""
+
+msgid "%{scope} results for term '%{term}'"
+msgstr ""
+
+msgid "%{seconds}s"
+msgstr ""
+
+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] ""
+
+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] ""
+
+msgid "%{size} %{unit}"
+msgstr ""
+
+msgid "%{size} GiB"
+msgstr ""
+
+msgid "%{size} KiB"
+msgstr ""
+
+msgid "%{size} MiB"
+msgstr ""
+
+msgid "%{size} bytes"
+msgstr ""
+
+msgid "%{sourceBranch} into %{targetBranch}"
+msgstr ""
+
+msgid "%{spammable_titlecase} was submitted to Akismet successfully."
+msgstr ""
+
+msgid "%{spanStart}at line%{spanEnd} %{errorLine}%{errorColumn}"
+msgstr ""
+
+msgid "%{spanStart}in%{spanEnd} %{errorFn}"
+msgstr ""
+
+msgid "%{start} to %{end}"
+msgstr ""
+
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
+msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
+msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{count} approval rule%{strong_end} requires eligible members to approve before merging."
+msgid_plural "%{strong_start}%{count} approval rules%{strong_end} require eligible members to approve before merging."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{count} eligible member%{strong_end} must approve to merge."
+msgid_plural "%{strong_start}%{count} eligible members%{strong_end} must approve to merge."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{count} member%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
+msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
+msgstr ""
+
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
+msgid "%{strong_start}%{release_count}%{strong_end} Release"
+msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
+msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{tabname} changed"
+msgstr ""
+
+msgid "%{tags} tag per image name"
+msgstr ""
+
+msgid "%{tags} tags per image name"
+msgstr ""
+
+msgid "%{tag}-%{evidence}-%{filename}"
+msgstr ""
+
+msgid "%{template_project_id} is unknown or invalid"
+msgstr ""
+
+msgid "%{text} is available"
+msgstr ""
+
+msgid "%{timebox_name} should belong either to a project or a group."
+msgstr ""
+
+msgid "%{timebox_type} does not support burnup charts"
+msgstr ""
+
+msgid "%{timebox_type} must have a start and due date"
+msgstr ""
+
+msgid "%{time} UTC"
+msgstr ""
+
+msgid "%{title} %{operator} %{threshold}"
+msgstr ""
+
+msgid "%{title} changes"
+msgstr ""
+
+msgid "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} free)"
+msgstr ""
+
+msgid "%{totalMemory} (%{freeSpacePercentage}%{percentSymbol} free)"
+msgstr ""
+
+msgid "%{totalWeight} total weight"
+msgstr ""
+
+msgid "%{total_warnings} warning(s) found:"
+msgstr ""
+
+msgid "%{total} remaining issue weight"
+msgstr ""
+
+msgid "%{total} warnings found: showing first %{warningsDisplayed}"
+msgstr ""
+
+msgid "%{type} only supports %{name} name"
+msgstr ""
+
+msgid "%{userName} (cannot merge)"
+msgstr ""
+
+msgid "%{userName}'s avatar"
+msgstr ""
+
+msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedule} in %{project}. "
+msgstr ""
+
+msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project_link}: "
+msgstr ""
+
+msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project}:"
+msgstr ""
+
+msgid "%{user_name} profile page"
+msgstr ""
+
+msgid "%{username} changed the draft status of merge request %{mr_link}"
+msgstr ""
+
+msgid "%{username} has asked for a GitLab account on your instance %{host}:"
+msgstr ""
+
+msgid "%{username}'s avatar"
+msgstr ""
+
+msgid "%{user} created a merge request: %{mr_link}"
+msgstr ""
+
+msgid "%{user} created an epic: %{epic_link}"
+msgstr ""
+
+msgid "%{user} created an issue: %{issue_link}"
+msgstr ""
+
+msgid "%{value} is not included in the list"
+msgstr ""
+
+msgid "%{value} s"
+msgstr ""
+
+msgid "%{verb} %{time_spent_value} spent time."
+msgstr ""
+
+msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project."
+msgstr ""
+
+msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
+msgstr ""
+
+msgid "%{widget} options"
+msgstr ""
+
+msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
+msgstr ""
+
+msgid "'%{data}' at %{location} does not match format: %{format}"
+msgstr ""
+
+msgid "'%{data}' at %{location} does not match pattern: %{pattern}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is invalid: error_type=%{type}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is not of type: %{type}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is not one of: %{enum}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is not: %{const}"
+msgstr ""
+
+msgid "'%{level}' is not a valid visibility level"
+msgstr ""
+
+msgid "'%{name}' Value Stream created"
+msgstr ""
+
+msgid "'%{name}' Value Stream deleted"
+msgstr ""
+
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
+msgid "'%{source}' is not a import source"
+msgstr ""
+
+msgid "'%{template_name}' is unknown or invalid"
+msgstr ""
+
+msgid "(%d closed)"
+msgid_plural "(%d closed)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "(%{mrCount} merged)"
+msgstr ""
+
+msgid "(%{value}) has already been taken"
+msgstr ""
+
+msgid "(+%{count}&nbsp;rules)"
+msgstr ""
+
+msgid "(Group Managed Account)"
+msgstr ""
+
+msgid "(No changes)"
+msgstr ""
+
+msgid "(UTC %{offset}) %{timezone}"
+msgstr ""
+
+msgid "(check progress)"
+msgstr ""
+
+msgid "(deleted)"
+msgstr ""
+
+msgid "(expired)"
+msgstr ""
+
+msgid "(leave blank if you don't want to change it)"
+msgstr ""
+
+msgid "(max size 15 MB)"
+msgstr ""
+
+msgid "(optional)"
+msgstr ""
+
+msgid "(removed)"
+msgstr ""
+
+msgid "(revoked)"
+msgstr ""
+
+msgid "(squashes %d commit)"
+msgid_plural "(squashes %d commits)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "(this user)"
+msgstr ""
+
+msgid "(we need your current password to confirm your changes)"
+msgstr ""
+
+msgid "* All times are in UTC unless specified"
+msgstr ""
+
+msgid "*Required"
+msgstr ""
+
+msgid "+ %{amount} more"
+msgstr ""
+
+msgid "+ %{count} more"
+msgstr ""
+
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "+ %{numberOfHiddenAssignees} more"
+msgstr ""
+
+msgid "+%d more"
+msgid_plural "+%d more"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "+%{more_assignees_count}"
+msgstr ""
+
+msgid "+%{more_assignees_count} more assignees"
+msgstr ""
+
+msgid "+%{more_reviewers_count}"
+msgstr ""
+
+msgid "+%{more_reviewers_count} more reviewers"
+msgstr ""
+
+msgid "+%{tags} more"
+msgstr ""
+
+msgid ", "
+msgstr ""
+
+msgid ", or "
+msgstr ""
+
+msgid "- %{policy_name} (notifying after %{elapsed_time} minutes unless %{status})"
+msgstr ""
+
+msgid "- Add or remove a user."
+msgstr ""
+
+msgid "- Available to run jobs."
+msgstr ""
+
+msgid "- Create or close an issue."
+msgstr ""
+
+msgid "- Create, update, or delete a merge request."
+msgstr ""
+
+msgid "- Event"
+msgid_plural "- Events"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "- Go to the Activity page for %{project_name}."
+msgstr ""
+
+msgid "- List the visible events for %{project_name} using the Events API %{events_api_link}."
+msgstr ""
+
+msgid "- Not available to run jobs."
+msgstr ""
+
+msgid "- Push code to the repository."
+msgstr ""
+
+msgid "- Select -"
+msgstr ""
+
+msgid "- User"
+msgid_plural "- Users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "- View the last_activity_at attribute for %{project_name} using the Project API %{projects_api_link}."
+msgstr ""
+
+msgid "- of - issues closed"
+msgstr ""
+
+msgid "- of - weight completed"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
+msgid "."
+msgstr ""
+
+msgid "/"
+msgstr ""
+
+msgid "/day"
+msgstr ""
+
+msgid "0 bytes"
+msgstr ""
+
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 closed issue"
+msgid_plural "%{issues} closed issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 closed merge request"
+msgid_plural "%{merge_requests} closed merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 day remaining"
+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] ""
+msgstr[1] ""
+
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 group"
+msgid_plural "%d groups"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 issue selected"
+msgid_plural "%d issues selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 merge request selected"
+msgid_plural "%d merge requests selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 merged merge request"
+msgid_plural "%{merge_requests} merged merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 month remaining"
+msgid_plural "%d months remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 open issue"
+msgid_plural "%{issues} open issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 open merge request"
+msgid_plural "%{merge_requests} open merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 pipeline"
+msgid_plural "%d pipelines"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 role"
+msgid_plural "%d roles"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 user"
+msgid_plural "%{num} users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 week remaining"
+msgid_plural "%d weeks remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 year remaining"
+msgid_plural "%d years remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1-9 contributions"
+msgstr ""
+
+msgid "10-19 contributions"
+msgstr ""
+
+msgid "1000+"
+msgstr ""
+
+msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
+msgstr ""
+
+msgid "1st contribution!"
+msgstr ""
+
+msgid "20-29 contributions"
+msgstr ""
+
+msgid "2FA"
+msgstr ""
+
+msgid "2FADevice|Registered On"
+msgstr ""
+
+msgid "3 days"
+msgstr ""
+
+msgid "3 hours"
+msgstr ""
+
+msgid "30 days"
+msgstr ""
+
+msgid "30 minutes"
+msgstr ""
+
+msgid "30+ contributions"
+msgstr ""
+
+msgid "403|Please contact your GitLab administrator to get permission."
+msgstr ""
+
+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 ""
+
+msgid "404|Page Not Found"
+msgstr ""
+
+msgid "404|Please contact your GitLab administrator if you think this is a mistake."
+msgstr ""
+
+msgid "409|Please contact your GitLab administrator if you think this is a mistake."
+msgstr ""
+
+msgid "409|There was a conflict with your request."
+msgstr ""
+
+msgid "7 days"
+msgstr ""
+
+msgid "8 hours"
+msgstr ""
+
+msgid ":%{startLine} to %{endLine}"
+msgstr ""
+
+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 ""
+
+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 ""
+
+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 ""
+
+msgid "A Hugo site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A Jekyll site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
+msgstr ""
+
+msgid "A Work Item can be a parent or a child, but not both."
+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 complete DevOps platform"
+msgstr ""
+
+msgid "A default branch cannot be chosen for an empty project."
+msgstr ""
+
+msgid "A deleted user"
+msgstr ""
+
+msgid "A different reason"
+msgstr ""
+
+msgid "A file has been changed."
+msgstr ""
+
+msgid "A file was not found."
+msgstr ""
+
+msgid "A file with '%{file_name}' already exists in %{branch} branch"
+msgstr ""
+
+msgid "A file with this name already exists."
+msgstr ""
+
+msgid "A group is a collection of several projects"
+msgstr ""
+
+msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
+msgstr ""
+
+msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
+msgstr ""
+
+msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
+msgstr ""
+
+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 ""
+
+msgid "A member of the abuse team will review your report as soon as possible."
+msgstr ""
+
+msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
+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 ""
+
+msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
+msgstr ""
+
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
+msgid "A new impersonation token has been created."
+msgstr ""
+
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
+msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
+msgstr ""
+
+msgid "A page with that title already exists"
+msgstr ""
+
+msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A platform value can be web, mob or app."
+msgstr ""
+
+msgid "A project boilerplate for Salesforce App development with Salesforce Developer tools"
+msgstr ""
+
+msgid "A project boilerplate for Tencent Serverless Framework that uses Next.js SSR"
+msgstr ""
+
+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 ""
+
+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 ""
+
+msgid "A quarterly reconciliation is due on %{date}"
+msgstr ""
+
+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 ""
+
+msgid "A rebase is already in progress."
+msgstr ""
+
+msgid "A sign-in to your account has been made from the following IP address: %{ip}"
+msgstr ""
+
+msgid "A title is required"
+msgstr ""
+
+msgid "A user with write access to the source branch selected this option"
+msgstr ""
+
+msgid "ACTION REQUIRED: Something went wrong while obtaining the Let's Encrypt certificate for GitLab Pages domain '%{domain}'"
+msgstr ""
+
+msgid "API"
+msgstr ""
+
+msgid "API Fuzzing"
+msgstr ""
+
+msgid "API Fuzzing Configuration"
+msgstr ""
+
+msgid "API Help"
+msgstr ""
+
+msgid "API Token"
+msgstr ""
+
+msgid "API key"
+msgstr ""
+
+msgid "API?"
+msgstr ""
+
+msgid "APIFuzzing|$VARIABLE_WITH_PASSWORD"
+msgstr ""
+
+msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
+msgstr ""
+
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API testing target. For example, http://www.example.com."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Enter the name of the CI variable containing the password. For example, $VARIABLE_WITH_PASSWORD."
+msgstr ""
+
+msgid "APIFuzzing|Enter the name of the CI variable containing the username. For example, $VARIABLE_WITH_USERNAME."
+msgstr ""
+
+msgid "APIFuzzing|File path or URL to APIs to be tested. For example, folder/example_fuzz.har. HAR files may contain sensitive information such as authentication tokens, API keys, and session cookies. We recommend that you review the HAR files' contents before adding them to a repository."
+msgstr ""
+
+msgid "APIFuzzing|File path or URL to OpenAPI specification. For example, folder/openapi.json or http://www.example.com/openapi.json."
+msgstr ""
+
+msgid "APIFuzzing|File path or URL to requests to be tested. For example, folder/example.postman_collection.json."
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|Predefined profiles"
+msgstr ""
+
+msgid "APIFuzzing|Scan mode"
+msgstr ""
+
+msgid "APIFuzzing|Scan profile"
+msgstr ""
+
+msgid "APIFuzzing|Show code snippet for the profile"
+msgstr ""
+
+msgid "APIFuzzing|Target URL"
+msgstr ""
+
+msgid "APIFuzzing|There are three ways to perform scans."
+msgstr ""
+
+msgid "APIFuzzing|Tip: Insert the following variables anywhere below stages and include"
+msgstr ""
+
+msgid "APIFuzzing|Tip: Insert this part below all include"
+msgstr ""
+
+msgid "APIFuzzing|Tip: Insert this part below all stages"
+msgstr ""
+
+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 ""
+
+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 ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
+msgid "APIFuzzing|folder/example.postman_collection.json"
+msgstr ""
+
+msgid "APIFuzzing|folder/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|folder/openapi.json"
+msgstr ""
+
+msgid "AWS Access Key"
+msgstr ""
+
+msgid "AWS Secret Access Key"
+msgstr ""
+
+msgid "AWS access key ID (Optional)"
+msgstr ""
+
+msgid "AWS secret access key (Optional)"
+msgstr ""
+
+msgid "AWS service error: %{error}"
+msgstr ""
+
+msgid "Abort"
+msgstr ""
+
+msgid "About GitLab"
+msgstr ""
+
+msgid "About auto deploy"
+msgstr ""
+
+msgid "About this feature"
+msgstr ""
+
+msgid "About your company"
+msgstr ""
+
+msgid "Abuse Reports"
+msgstr ""
+
+msgid "Abuse reports"
+msgstr ""
+
+msgid "Abuse reports notification email"
+msgstr ""
+
+msgid "Accept invitation"
+msgstr ""
+
+msgid "Accept terms"
+msgstr ""
+
+msgid "Acceptable for use in this project"
+msgstr ""
+
+msgid "Access Git repositories or the API."
+msgstr ""
+
+msgid "Access Token"
+msgstr ""
+
+msgid "Access Tokens"
+msgstr ""
+
+msgid "Access denied for your LDAP account."
+msgstr ""
+
+msgid "Access denied: %{error}"
+msgstr ""
+
+msgid "Access expires"
+msgstr ""
+
+msgid "Access forbidden. Check your access level."
+msgstr ""
+
+msgid "Access granted"
+msgstr ""
+
+msgid "Access requests"
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
+msgid "AccessDropdown|Deploy Keys"
+msgstr ""
+
+msgid "AccessDropdown|Groups"
+msgstr ""
+
+msgid "AccessDropdown|Roles"
+msgstr ""
+
+msgid "AccessDropdown|Users"
+msgstr ""
+
+msgid "AccessTokens|Access Tokens"
+msgstr ""
+
+msgid "AccessTokens|Are you sure?"
+msgstr ""
+
+msgid "AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working."
+msgstr ""
+
+msgid "AccessTokens|Are you sure? Any issue email addresses currently in use will stop working."
+msgstr ""
+
+msgid "AccessTokens|Copy feed token"
+msgstr ""
+
+msgid "AccessTokens|Copy incoming email token"
+msgstr ""
+
+msgid "AccessTokens|Copy static object token"
+msgstr ""
+
+msgid "AccessTokens|Created"
+msgstr ""
+
+msgid "AccessTokens|Feed token"
+msgstr ""
+
+msgid "AccessTokens|Incoming email token"
+msgstr ""
+
+msgid "AccessTokens|It cannot be used to access any other data."
+msgstr ""
+
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{linkStart}reset this token%{linkEnd}."
+msgstr ""
+
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{linkStart}reset this token%{linkEnd}."
+msgstr ""
+
+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, %{linkStart}reset this token%{linkEnd}."
+msgstr ""
+
+msgid "AccessTokens|Personal Access Tokens"
+msgstr ""
+
+msgid "AccessTokens|Static object token"
+msgstr ""
+
+msgid "AccessTokens|The last time a token was used"
+msgstr ""
+
+msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
+msgstr ""
+
+msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
+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 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 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 authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
+
+msgid "AccessibilityReport|Learn more"
+msgstr ""
+
+msgid "AccessibilityReport|Message: %{message}"
+msgstr ""
+
+msgid "AccessibilityReport|New"
+msgstr ""
+
+msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
+msgstr ""
+
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
+msgid "Account"
+msgstr ""
+
+msgid "Account ID"
+msgstr ""
+
+msgid "Account and limit"
+msgstr ""
+
+msgid "Account:"
+msgstr ""
+
+msgid "Account: %{account}"
+msgstr ""
+
+msgid "AccountValidation|Fix your pipelines by validating your account"
+msgstr ""
+
+msgid "AccountValidation|I'll bring my own runners"
+msgstr ""
+
+msgid "AccountValidation|In order to use free CI/CD minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
+msgstr ""
+
+msgid "AccountValidation|Learn more."
+msgstr ""
+
+msgid "AccountValidation|Looks like you’ll need to validate your account to use free CI/CD minutes"
+msgstr ""
+
+msgid "AccountValidation|Validate your account"
+msgstr ""
+
+msgid "AccountValidation|Verification is required to discourage and reduce the abuse on GitLab infrastructure. If you verify with a credit or debit card, %{strong_start}GitLab will not charge your card, it will only be used for validation.%{strong_end} %{learn_more_link}"
+msgstr ""
+
+msgid "Acknowledge"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid "Action to take when receiving an alert. %{docsLink}"
+msgstr ""
+
+msgid "Actions"
+msgstr ""
+
+msgid "Activate Service Desk"
+msgstr ""
+
+msgid "Activated on"
+msgstr ""
+
+msgid "Active"
+msgstr ""
+
+msgid "Active %{accessTokenTypePlural} (%{totalAccessTokens})"
+msgstr ""
+
+msgid "Active %{type} (%{token_length})"
+msgstr ""
+
+msgid "Active Sessions"
+msgstr ""
+
+msgid "Active chat names (%{count})"
+msgstr ""
+
+msgid "Activity"
+msgstr ""
+
+msgid "Activity|An error occurred while retrieving activity. Reload the page to try again."
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Add \"%{value}\""
+msgstr ""
+
+msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically includes read-only assets, like source code and release evidence."
+msgstr ""
+
+msgid "Add CHANGELOG"
+msgstr ""
+
+msgid "Add CONTRIBUTING"
+msgstr ""
+
+msgid "Add Kubernetes cluster"
+msgstr ""
+
+msgid "Add LICENSE"
+msgstr ""
+
+msgid "Add License"
+msgstr ""
+
+msgid "Add New Site"
+msgstr ""
+
+msgid "Add README"
+msgstr ""
+
+msgid "Add Zoom meeting"
+msgstr ""
+
+msgid "Add a %{type}"
+msgstr ""
+
+msgid "Add a GCP region"
+msgstr ""
+
+msgid "Add a GPG key"
+msgstr ""
+
+msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
+msgstr ""
+
+msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
+msgstr ""
+
+msgid "Add a bullet list"
+msgstr ""
+
+msgid "Add a collapsible section"
+msgstr ""
+
+msgid "Add a comment to this line"
+msgstr ""
+
+msgid "Add a comment to this line or drag for multiple lines"
+msgstr ""
+
+msgid "Add a confidential internal note to this %{noteableDisplayName}."
+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 ""
+
+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 new issue"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
+msgid "Add a related epic"
+msgstr ""
+
+msgid "Add a related issue"
+msgstr ""
+
+msgid "Add a suffix to Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "Add a table"
+msgstr ""
+
+msgid "Add a task list"
+msgstr ""
+
+msgid "Add a title..."
+msgstr ""
+
+msgid "Add a to do"
+msgstr ""
+
+msgid "Add an SSH key"
+msgstr ""
+
+msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
+msgstr ""
+
+msgid "Add an existing issue"
+msgstr ""
+
+msgid "Add an impersonation token"
+msgstr ""
+
+msgid "Add another link"
+msgstr ""
+
+msgid "Add approval rule"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add attention request"
+msgstr ""
+
+msgid "Add broadcast message"
+msgstr ""
+
+msgid "Add child epic to an epic"
+msgstr ""
+
+msgid "Add comment now"
+msgstr ""
+
+msgid "Add comment to design"
+msgstr ""
+
+msgid "Add comment..."
+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 customer relation contact(s)."
+msgstr ""
+
+msgid "Add customer relation contacts"
+msgstr ""
+
+msgid "Add deploy freeze"
+msgstr ""
+
+msgid "Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"
+msgstr ""
+
+msgid "Add email address"
+msgstr ""
+
+msgid "Add email participant(s)"
+msgstr ""
+
+msgid "Add environment"
+msgstr ""
+
+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 ""
+
+msgid "Add image comment"
+msgstr ""
+
+msgid "Add internal note"
+msgstr ""
+
+msgid "Add key"
+msgstr ""
+
+msgid "Add label(s)"
+msgstr ""
+
+msgid "Add list"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
+msgid "Add new directory"
+msgstr ""
+
+msgid "Add or remove a user."
+msgstr ""
+
+msgid "Add or remove previously merged commits"
+msgstr ""
+
+msgid "Add or subtract spent time"
+msgstr ""
+
+msgid "Add people"
+msgstr ""
+
+msgid "Add previously merged commits"
+msgstr ""
+
+msgid "Add project"
+msgstr ""
+
+msgid "Add projects"
+msgstr ""
+
+msgid "Add reaction"
+msgstr ""
+
+msgid "Add request manually"
+msgstr ""
+
+msgid "Add suggestion to batch"
+msgstr ""
+
+msgid "Add system hook"
+msgstr ""
+
+msgid "Add text to the sign-in page. Markdown enabled."
+msgstr ""
+
+msgid "Add to board"
+msgstr ""
+
+msgid "Add to epic"
+msgstr ""
+
+msgid "Add to merge train"
+msgstr ""
+
+msgid "Add to merge train when pipeline succeeds"
+msgstr ""
+
+msgid "Add to review"
+msgstr ""
+
+msgid "Add to tree"
+msgstr ""
+
+msgid "Add topics to projects to help users find them."
+msgstr ""
+
+msgid "Add trigger"
+msgstr ""
+
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Add variable"
+msgstr ""
+
+msgid "Add vulnerability finding"
+msgstr ""
+
+msgid "Add webhook"
+msgstr ""
+
+msgid "Add your team members and others to GitLab."
+msgstr ""
+
+msgid "Add/remove"
+msgstr ""
+
+msgid "AddContextCommits|Add previously merged commits"
+msgstr ""
+
+msgid "AddContextCommits|Add/remove"
+msgstr ""
+
+msgid "AddMember|Invite email is invalid"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
+msgid "AddMember|No invite source provided."
+msgstr ""
+
+msgid "AddMember|No users specified."
+msgstr ""
+
+msgid "AddMember|Too many users specified (limit is %{user_limit})"
+msgstr ""
+
+msgid "Added"
+msgstr ""
+
+msgid "Added %{epic_ref} as a child epic."
+msgstr ""
+
+msgid "Added %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Added a to do."
+msgstr ""
+
+msgid "Added an issue to an epic."
+msgstr ""
+
+msgid "Added for this merge request"
+msgstr ""
+
+msgid "Added in this version"
+msgstr ""
+
+msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
+msgstr ""
+
+msgid "Additional minutes"
+msgstr ""
+
+msgid "Additional minutes:"
+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 ""
+
+msgid "Adds"
+msgstr ""
+
+msgid "Adds %{epic_ref} as child epic."
+msgstr ""
+
+msgid "Adds %{labels} %{label_text}."
+msgstr ""
+
+msgid "Adds a Zoom meeting."
+msgstr ""
+
+msgid "Adds a to do."
+msgstr ""
+
+msgid "Adds an issue to an epic."
+msgstr ""
+
+msgid "Adds email participant(s)."
+msgstr ""
+
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
+msgid "Adjust how frequently the GitLab UI polls for updates."
+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 ""
+
+msgid "Admin"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Mode"
+msgstr ""
+
+msgid "Admin Note"
+msgstr ""
+
+msgid "Admin Notifications"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin Section"
+msgstr ""
+
+msgid "Admin mode already enabled"
+msgstr ""
+
+msgid "Admin mode disabled"
+msgstr ""
+
+msgid "Admin mode enabled"
+msgstr ""
+
+msgid "Admin navigation"
+msgstr ""
+
+msgid "Admin notes"
+msgstr ""
+
+msgid "AdminArea|%{billable_users_link_start}Learn more%{billable_users_link_end} about what defines a billable user"
+msgstr ""
+
+msgid "AdminArea|Active users"
+msgstr ""
+
+msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
+msgstr ""
+
+msgid "AdminArea|Billable users"
+msgstr ""
+
+msgid "AdminArea|Blocked users"
+msgstr ""
+
+msgid "AdminArea|Bots"
+msgstr ""
+
+msgid "AdminArea|Components"
+msgstr ""
+
+msgid "AdminArea|Developer"
+msgstr ""
+
+msgid "AdminArea|Features"
+msgstr ""
+
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
+msgid "AdminArea|Groups"
+msgstr ""
+
+msgid "AdminArea|Guest"
+msgstr ""
+
+msgid "AdminArea|Included Free in license"
+msgstr ""
+
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
+msgid "AdminArea|Latest groups"
+msgstr ""
+
+msgid "AdminArea|Latest projects"
+msgstr ""
+
+msgid "AdminArea|Latest users"
+msgstr ""
+
+msgid "AdminArea|Maintainer"
+msgstr ""
+
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
+msgid "AdminArea|Minimal access"
+msgstr ""
+
+msgid "AdminArea|New group"
+msgstr ""
+
+msgid "AdminArea|New project"
+msgstr ""
+
+msgid "AdminArea|New user"
+msgstr ""
+
+msgid "AdminArea|No applications found"
+msgstr ""
+
+msgid "AdminArea|Owner"
+msgstr ""
+
+msgid "AdminArea|Projects"
+msgstr ""
+
+msgid "AdminArea|Reporter"
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
+msgid "AdminArea|Stop all jobs"
+msgstr ""
+
+msgid "AdminArea|Stop all jobs?"
+msgstr ""
+
+msgid "AdminArea|Stop jobs"
+msgstr ""
+
+msgid "AdminArea|Stopping jobs failed"
+msgstr ""
+
+msgid "AdminArea|Total users"
+msgstr ""
+
+msgid "AdminArea|Users"
+msgstr ""
+
+msgid "AdminArea|Users statistics"
+msgstr ""
+
+msgid "AdminArea|Users with highest role"
+msgstr ""
+
+msgid "AdminArea|Users without a Group and Project"
+msgstr ""
+
+msgid "AdminArea|View latest groups"
+msgstr ""
+
+msgid "AdminArea|View latest projects"
+msgstr ""
+
+msgid "AdminArea|View latest users"
+msgstr ""
+
+msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
+msgstr ""
+
+msgid "AdminDashboard|Error loading the statistics. Please try again"
+msgstr ""
+
+msgid "AdminLabels|Define your default set of project labels"
+msgstr ""
+
+msgid "AdminLabels|Labels created here will be automatically added to new projects."
+msgstr ""
+
+msgid "AdminLabels|They can be used to categorize issues and merge requests."
+msgstr ""
+
+msgid "AdminProjects| You’re about to permanently delete the project %{projectName}, its repository, and all related resources, including issues and merge requests. After you confirm and press %{strong_start}Delete project%{strong_end}, it cannot be undone or recovered."
+msgstr ""
+
+msgid "AdminProjects|Delete"
+msgstr ""
+
+msgid "AdminProjects|Delete Project %{projectName}?"
+msgstr ""
+
+msgid "AdminSettings|%{strongStart}WARNING:%{strongEnd} Environment variable %{environment_variable} does not exist or is not pointing to a valid directory. %{icon_link}"
+msgstr ""
+
+msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
+msgid "AdminSettings|All new projects can use the instance's shared runners by default."
+msgstr ""
+
+msgid "AdminSettings|Auto DevOps domain"
+msgstr ""
+
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
+msgid "AdminSettings|Configure Let's Encrypt"
+msgstr ""
+
+msgid "AdminSettings|Configure when inactive projects should be automatically deleted. %{linkStart}What are inactive projects?%{linkEnd}"
+msgstr ""
+
+msgid "AdminSettings|Delete inactive projects"
+msgstr ""
+
+msgid "AdminSettings|Delete inactive projects that exceed"
+msgstr ""
+
+msgid "AdminSettings|Delete project after"
+msgstr ""
+
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
+msgid "AdminSettings|Disable feed token"
+msgstr ""
+
+msgid "AdminSettings|Disable public access to Pages sites"
+msgstr ""
+
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
+msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Elasticsearch indexing"
+msgstr ""
+
+msgid "AdminSettings|Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "AdminSettings|Enable Registration Features"
+msgstr ""
+
+msgid "AdminSettings|Enable Service Ping"
+msgstr ""
+
+msgid "AdminSettings|Enable a Prometheus endpoint that exposes health and performance statistics. The Health Check menu item appears in the Monitoring section of the Admin Area. Restart required. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Enable kuromoji custom analyzer: Indexing"
+msgstr ""
+
+msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
+msgstr ""
+
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
+msgid "AdminSettings|Enable shared runners for new projects"
+msgstr ""
+
+msgid "AdminSettings|Enable smartcn custom analyzer: Indexing"
+msgstr ""
+
+msgid "AdminSettings|Enable smartcn custom analyzer: Search"
+msgstr ""
+
+msgid "AdminSettings|Enabled"
+msgstr ""
+
+msgid "AdminSettings|Feed token"
+msgstr ""
+
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
+msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
+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|If there isn't any existing index, GitLab creates one."
+msgstr ""
+
+msgid "AdminSettings|Import sources"
+msgstr ""
+
+msgid "AdminSettings|Inactive project deletion"
+msgstr ""
+
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Let's Encrypt email"
+msgstr ""
+
+msgid "AdminSettings|Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "AdminSettings|Limit the number of namespaces and projects that can be indexed."
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
+msgid "AdminSettings|Minimum size must be at least 0."
+msgstr ""
+
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
+msgid "AdminSettings|No required pipeline"
+msgstr ""
+
+msgid "AdminSettings|Only enable search after installing the plugin, enabling indexing, and recreating the index."
+msgstr ""
+
+msgid "AdminSettings|Pause Elasticsearch indexing"
+msgstr ""
+
+msgid "AdminSettings|Preview payload"
+msgstr ""
+
+msgid "AdminSettings|Project export"
+msgstr ""
+
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
+msgid "AdminSettings|Registration Features include:"
+msgstr ""
+
+msgid "AdminSettings|Require users to prove ownership of custom domains"
+msgstr ""
+
+msgid "AdminSettings|Required pipeline configuration"
+msgstr ""
+
+msgid "AdminSettings|Requires %{linkStart}email notifications%{linkEnd}"
+msgstr ""
+
+msgid "AdminSettings|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
+msgid "AdminSettings|Search with Elasticsearch enabled"
+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|Select to disable public access for Pages sites, which requires users to sign in for access to the Pages sites in your instance. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Send email to maintainers after project is inactive for"
+msgstr ""
+
+msgid "AdminSettings|Send warning email"
+msgstr ""
+
+msgid "AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}."
+msgstr ""
+
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
+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|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
+msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Setting must be greater than 0."
+msgstr ""
+
+msgid "AdminSettings|Size and domain settings for Pages static sites."
+msgstr ""
+
+msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
+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 ""
+
+msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgstr ""
+
+msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
+msgstr ""
+
+msgid "AdminSettings|To help improve GitLab and its user experience, GitLab periodically collects usage information. %{link_start}What information is shared with GitLab Inc.?%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
+msgid "AdminSettings|Use AWS hosted Elasticsearch with IAM credentials"
+msgstr ""
+
+msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
+msgstr ""
+
+msgid "AdminSettings|When to delete inactive projects"
+msgstr ""
+
+msgid "AdminSettings|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 "AdminSettings|You can't delete projects before the warning email is sent."
+msgstr ""
+
+msgid "AdminStatistics|Active Users"
+msgstr ""
+
+msgid "AdminStatistics|Forks"
+msgstr ""
+
+msgid "AdminStatistics|Issues"
+msgstr ""
+
+msgid "AdminStatistics|Merge requests"
+msgstr ""
+
+msgid "AdminStatistics|Milestones"
+msgstr ""
+
+msgid "AdminStatistics|Notes"
+msgstr ""
+
+msgid "AdminStatistics|SSH Keys"
+msgstr ""
+
+msgid "AdminStatistics|Snippets"
+msgstr ""
+
+msgid "AdminUsers|(Admin)"
+msgstr ""
+
+msgid "AdminUsers|(Banned)"
+msgstr ""
+
+msgid "AdminUsers|(Blocked)"
+msgstr ""
+
+msgid "AdminUsers|(Deactivated)"
+msgstr ""
+
+msgid "AdminUsers|(Internal)"
+msgstr ""
+
+msgid "AdminUsers|(Locked)"
+msgstr ""
+
+msgid "AdminUsers|(Pending approval)"
+msgstr ""
+
+msgid "AdminUsers|2FA Disabled"
+msgstr ""
+
+msgid "AdminUsers|2FA Enabled"
+msgstr ""
+
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr ""
+
+msgid "AdminUsers|Access"
+msgstr ""
+
+msgid "AdminUsers|Access Git repositories"
+msgstr ""
+
+msgid "AdminUsers|Access level"
+msgstr ""
+
+msgid "AdminUsers|Access the API"
+msgstr ""
+
+msgid "AdminUsers|Activate"
+msgstr ""
+
+msgid "AdminUsers|Activate user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Active"
+msgstr ""
+
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
+msgid "AdminUsers|Admin"
+msgstr ""
+
+msgid "AdminUsers|Administrator"
+msgstr ""
+
+msgid "AdminUsers|Admins"
+msgstr ""
+
+msgid "AdminUsers|Approve"
+msgstr ""
+
+msgid "AdminUsers|Approve user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Approved users can:"
+msgstr ""
+
+msgid "AdminUsers|Auditor"
+msgstr ""
+
+msgid "AdminUsers|Auditors have read-only access to all groups, projects, and users."
+msgstr ""
+
+msgid "AdminUsers|Automatically marked as default internal user"
+msgstr ""
+
+msgid "AdminUsers|Avatar"
+msgstr ""
+
+msgid "AdminUsers|Ban user"
+msgstr ""
+
+msgid "AdminUsers|Ban user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Banned"
+msgstr ""
+
+msgid "AdminUsers|Be added to groups and projects"
+msgstr ""
+
+msgid "AdminUsers|Block"
+msgstr ""
+
+msgid "AdminUsers|Block user"
+msgstr ""
+
+msgid "AdminUsers|Block user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Blocked"
+msgstr ""
+
+msgid "AdminUsers|Blocking user has the following effects:"
+msgstr ""
+
+msgid "AdminUsers|Can create group"
+msgstr ""
+
+msgid "AdminUsers|Cannot sign in or access instance information"
+msgstr ""
+
+msgid "AdminUsers|Cannot unblock LDAP blocked users"
+msgstr ""
+
+msgid "AdminUsers|Cohorts"
+msgstr ""
+
+msgid "AdminUsers|Confirm user"
+msgstr ""
+
+msgid "AdminUsers|Confirm user %{username}?"
+msgstr ""
+
+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}?"
+msgstr ""
+
+msgid "AdminUsers|Deactivated"
+msgstr ""
+
+msgid "AdminUsers|Deactivating a user has the following effects:"
+msgstr ""
+
+msgid "AdminUsers|Delete User %{username} and contributions?"
+msgstr ""
+
+msgid "AdminUsers|Delete User %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Delete user"
+msgstr ""
+
+msgid "AdminUsers|Delete user and contributions"
+msgstr ""
+
+msgid "AdminUsers|Export permissions as CSV (max 100,000 users)"
+msgstr ""
+
+msgid "AdminUsers|External"
+msgstr ""
+
+msgid "AdminUsers|External users cannot see internal or private projects unless access is explicitly granted. Also, external users cannot create projects, groups, or personal snippets."
+msgstr ""
+
+msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
+msgstr ""
+
+msgid "AdminUsers|Here are some helpful links to help you manage your instance:"
+msgstr ""
+
+msgid "AdminUsers|If you have any questions about this process please consult our %{doc_link} or %{support_link}."
+msgstr ""
+
+msgid "AdminUsers|Important information about usage on your GitLab instance"
+msgstr ""
+
+msgid "AdminUsers|Is using seat"
+msgstr ""
+
+msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgstr ""
+
+msgid "AdminUsers|It's you!"
+msgstr ""
+
+msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
+msgstr ""
+
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
+msgid "AdminUsers|Locked"
+msgstr ""
+
+msgid "AdminUsers|Log in"
+msgstr ""
+
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
+msgid "AdminUsers|New user"
+msgstr ""
+
+msgid "AdminUsers|No users found"
+msgstr ""
+
+msgid "AdminUsers|Owned groups will be left"
+msgstr ""
+
+msgid "AdminUsers|Pending approval"
+msgstr ""
+
+msgid "AdminUsers|Personal projects will be left"
+msgstr ""
+
+msgid "AdminUsers|Personal projects, group and user history will be left intact"
+msgstr ""
+
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
+msgid "AdminUsers|Reactivating a user will:"
+msgstr ""
+
+msgid "AdminUsers|Regular"
+msgstr ""
+
+msgid "AdminUsers|Regular users have access to their groups and projects."
+msgstr ""
+
+msgid "AdminUsers|Reject"
+msgstr ""
+
+msgid "AdminUsers|Reject user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Rejected users:"
+msgstr ""
+
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
+msgid "AdminUsers|Restore user access to the account, including web, Git and API."
+msgstr ""
+
+msgid "AdminUsers|Search by name, email or username"
+msgstr ""
+
+msgid "AdminUsers|Search users"
+msgstr ""
+
+msgid "AdminUsers|Send email to users"
+msgstr ""
+
+msgid "AdminUsers|Skype"
+msgstr ""
+
+msgid "AdminUsers|Sort by"
+msgstr ""
+
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
+msgid "AdminUsers|The user can't access git repositories."
+msgstr ""
+
+msgid "AdminUsers|The user can't log in."
+msgstr ""
+
+msgid "AdminUsers|The user has unlimited access to all groups, projects, users, and features."
+msgstr ""
+
+msgid "AdminUsers|The user will be logged out"
+msgstr ""
+
+msgid "AdminUsers|The user will not be able to access git repositories"
+msgstr ""
+
+msgid "AdminUsers|The user will not be able to access the API"
+msgstr ""
+
+msgid "AdminUsers|The user will not be able to use slash commands"
+msgstr ""
+
+msgid "AdminUsers|The user will not receive any notifications"
+msgstr ""
+
+msgid "AdminUsers|To confirm, type %{projectName}"
+msgstr ""
+
+msgid "AdminUsers|To confirm, type %{username}"
+msgstr ""
+
+msgid "AdminUsers|Unban user"
+msgstr ""
+
+msgid "AdminUsers|Unban user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Unblock"
+msgstr ""
+
+msgid "AdminUsers|Unblock user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|User administration"
+msgstr ""
+
+msgid "AdminUsers|User will not be able to access git repositories"
+msgstr ""
+
+msgid "AdminUsers|User will not be able to login"
+msgstr ""
+
+msgid "AdminUsers|Users"
+msgstr ""
+
+msgid "AdminUsers|Users can still be invited to your instance and/or add themselves if permitted based on your settings. They will not have access to your instance, nor count towards your subscribed seat count until you %{approve_link}."
+msgstr ""
+
+msgid "AdminUsers|Validate user account"
+msgstr ""
+
+msgid "AdminUsers|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|Website URL"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
+msgid "AdminUsers|When banned:"
+msgstr ""
+
+msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
+msgstr ""
+
+msgid "AdminUsers|Will be deleted"
+msgstr ""
+
+msgid "AdminUsers|Without projects"
+msgstr ""
+
+msgid "AdminUsers|You are about to permanently delete the user %{username}. Issues, merge requests, and groups linked to them will be transferred to a system-wide \"Ghost-user\". 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 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 can always block their account again if needed."
+msgstr ""
+
+msgid "AdminUsers|You can always deactivate their account again if needed."
+msgstr ""
+
+msgid "AdminUsers|You can always re-activate their account, their data will remain intact."
+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 ""
+
+msgid "AdminUsers|You cannot remove your own administrator access."
+msgstr ""
+
+msgid "AdminUsers|You must transfer ownership or delete the groups owned by this user before you can delete their account"
+msgstr ""
+
+msgid "AdminUsers|Your GitLab instance has reached the maximum allowed %{user_doc_link} set by an instance admin."
+msgstr ""
+
+msgid "AdminUsers|approve them"
+msgstr ""
+
+msgid "AdminUsers|contact our support team"
+msgstr ""
+
+msgid "AdminUsers|docs"
+msgstr ""
+
+msgid "AdminUsers|user cap"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "Administrators"
+msgstr ""
+
+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 ""
+
+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 in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
+
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
+
+msgid "Admin|View pending user approvals"
+msgstr ""
+
+msgid "Admin|Your instance has reached its user cap"
+msgstr ""
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Advanced Search"
+msgstr ""
+
+msgid "Advanced Settings"
+msgstr ""
+
+msgid "Advanced export options"
+msgstr ""
+
+msgid "AdvancedSearch|Elasticsearch version not compatible"
+msgstr ""
+
+msgid "AdvancedSearch|Reindex required"
+msgstr ""
+
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
+msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
+msgstr ""
+
+msgid "After it expires, you can't use merge approvals, code quality, or many other features."
+msgstr ""
+
+msgid "After it expires, you can't use merge approvals, epics, or many other features."
+msgstr ""
+
+msgid "After it expires, you can't use merge approvals, epics, or many security features."
+msgstr ""
+
+msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
+msgstr ""
+
+msgid "After you've reviewed these contribution guidelines, you'll be all set to"
+msgstr ""
+
+msgid "Akismet"
+msgstr ""
+
+msgid "Akismet API Key"
+msgstr ""
+
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
+
+msgid "Alert"
+msgstr ""
+
+msgid "AlertManagement|Acknowledged"
+msgstr ""
+
+msgid "AlertManagement|Activity feed"
+msgstr ""
+
+msgid "AlertManagement|Alert"
+msgstr ""
+
+msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgstr ""
+
+msgid "AlertManagement|Alert detail"
+msgstr ""
+
+msgid "AlertManagement|Alert details"
+msgstr ""
+
+msgid "AlertManagement|Alert status: %{status}"
+msgstr ""
+
+msgid "AlertManagement|Alerts"
+msgstr ""
+
+msgid "AlertManagement|All alerts"
+msgstr ""
+
+msgid "AlertManagement|Assign status"
+msgstr ""
+
+msgid "AlertManagement|Assignees"
+msgstr ""
+
+msgid "AlertManagement|Authorize external service"
+msgstr ""
+
+msgid "AlertManagement|Create incident"
+msgstr ""
+
+msgid "AlertManagement|Display alerts from all your monitoring tools directly within GitLab. Streamline the investigation of your alerts and the escalation of alerts to incidents."
+msgstr ""
+
+msgid "AlertManagement|Edit"
+msgstr ""
+
+msgid "AlertManagement|Environment"
+msgstr ""
+
+msgid "AlertManagement|Events"
+msgstr ""
+
+msgid "AlertManagement|Incident"
+msgstr ""
+
+msgid "AlertManagement|Key"
+msgstr ""
+
+msgid "AlertManagement|Metrics"
+msgstr ""
+
+msgid "AlertManagement|Metrics weren't available in the alerts payload."
+msgstr ""
+
+msgid "AlertManagement|More information"
+msgstr ""
+
+msgid "AlertManagement|No alert data to display."
+msgstr ""
+
+msgid "AlertManagement|No alerts available to display. See %{linkStart}enabling alert management%{linkEnd} for more information on adding alerts to the list."
+msgstr ""
+
+msgid "AlertManagement|No alerts to display."
+msgstr ""
+
+msgid "AlertManagement|None"
+msgstr ""
+
+msgid "AlertManagement|Open"
+msgstr ""
+
+msgid "AlertManagement|Please try again."
+msgstr ""
+
+msgid "AlertManagement|Reported %{when}"
+msgstr ""
+
+msgid "AlertManagement|Reported %{when} by %{tool}"
+msgstr ""
+
+msgid "AlertManagement|Resolved"
+msgstr ""
+
+msgid "AlertManagement|Runbook"
+msgstr ""
+
+msgid "AlertManagement|Service"
+msgstr ""
+
+msgid "AlertManagement|Severity"
+msgstr ""
+
+msgid "AlertManagement|Start time"
+msgstr ""
+
+msgid "AlertManagement|Status"
+msgstr ""
+
+msgid "AlertManagement|Surface alerts in GitLab"
+msgstr ""
+
+msgid "AlertManagement|There was an error displaying the alert. Please refresh the page to try again."
+msgstr ""
+
+msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the status of the alert."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the to-do item of the alert."
+msgstr ""
+
+msgid "AlertManagement|This assignee cannot be assigned to this alert."
+msgstr ""
+
+msgid "AlertManagement|Tool"
+msgstr ""
+
+msgid "AlertManagement|Triggered"
+msgstr ""
+
+msgid "AlertManagement|Value"
+msgstr ""
+
+msgid "AlertManagement|View incident"
+msgstr ""
+
+msgid "AlertMappingBuilder|Define fallback"
+msgstr ""
+
+msgid "AlertMappingBuilder|GitLab alert key"
+msgstr ""
+
+msgid "AlertMappingBuilder|Make selection"
+msgstr ""
+
+msgid "AlertMappingBuilder|Payload alert key"
+msgstr ""
+
+msgid "AlertMappingBuilder|Select key"
+msgstr ""
+
+msgid "AlertMappingBuilder|Title is a required field for alerts in GitLab. Should the payload field you specified not be available, specifiy which field we should use instead. "
+msgstr ""
+
+msgid "AlertSettings|A webhook URL and authorization key is generated for the integration. After you save the integration, both are visible under the “View credentials†tab."
+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 ""
+
+msgid "AlertSettings|Delete integration"
+msgstr ""
+
+msgid "AlertSettings|Edit integration"
+msgstr ""
+
+msgid "AlertSettings|Edit payload"
+msgstr ""
+
+msgid "AlertSettings|Enable integration"
+msgstr ""
+
+msgid "AlertSettings|Enter an example payload from your selected monitoring tool. This supports sending alerts to a GitLab endpoint."
+msgstr ""
+
+msgid "AlertSettings|Enter integration name"
+msgstr ""
+
+msgid "AlertSettings|Free versions of GitLab are limited to one integration per type. To add more, %{linkStart}upgrade your subscription%{linkEnd}."
+msgstr ""
+
+msgid "AlertSettings|GitLab has created a URL and authorization key for your integration. You can use them to set up a webhook and authorize your endpoint to send alerts to GitLab."
+msgstr ""
+
+msgid "AlertSettings|HTTP Endpoint"
+msgstr ""
+
+msgid "AlertSettings|If you edit the payload, you must re-map the fields again."
+msgstr ""
+
+msgid "AlertSettings|If you reset the authorization key for this project, you must update the key in every enabled alert source."
+msgstr ""
+
+msgid "AlertSettings|Integration successfully saved"
+msgstr ""
+
+msgid "AlertSettings|Name integration"
+msgstr ""
+
+msgid "AlertSettings|Parse payload fields"
+msgstr ""
+
+msgid "AlertSettings|Proceed with editing"
+msgstr ""
+
+msgid "AlertSettings|Prometheus"
+msgstr ""
+
+msgid "AlertSettings|Prometheus API base URL"
+msgstr ""
+
+msgid "AlertSettings|Reset Key"
+msgstr ""
+
+msgid "AlertSettings|Reset the mapping"
+msgstr ""
+
+msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
+msgstr ""
+
+msgid "AlertSettings|Save & create test alert"
+msgstr ""
+
+msgid "AlertSettings|Save integration"
+msgstr ""
+
+msgid "AlertSettings|Save integration & send"
+msgstr ""
+
+msgid "AlertSettings|Select integration type"
+msgstr ""
+
+msgid "AlertSettings|Send test alert"
+msgstr ""
+
+msgid "AlertSettings|Send without saving"
+msgstr ""
+
+msgid "AlertSettings|The form has unsaved changes"
+msgstr ""
+
+msgid "AlertSettings|The form has unsaved changes. How would you like to proceed?"
+msgstr ""
+
+msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
+msgstr ""
+
+msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
+msgstr ""
+
+msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
+msgstr ""
+
+msgid "AlertSettings|Use the URL and authorization key below to configure how an external service sends alerts to GitLab. %{linkStart}How do I configure the endpoint?%{linkEnd}"
+msgstr ""
+
+msgid "AlertSettings|View URL and authorization key"
+msgstr ""
+
+msgid "AlertSettings|View credentials"
+msgstr ""
+
+msgid "AlertSettings|Webhook URL"
+msgstr ""
+
+msgid "AlertSettings|You can map default GitLab alert fields to your payload keys in the dropdowns below."
+msgstr ""
+
+msgid "AlertSettings|{ \"events\": [{ \"application\": \"Name of application\" }] }"
+msgstr ""
+
+msgid "Alerts"
+msgstr ""
+
+msgid "AlertsIntegrations|Alerts will be created through this integration"
+msgstr ""
+
+msgid "AlertsIntegrations|Alerts will not be created through this integration"
+msgstr ""
+
+msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
+msgstr ""
+
+msgid "AlertsIntegrations|Integration Name"
+msgstr ""
+
+msgid "AlertsIntegrations|Integration payload is invalid."
+msgstr ""
+
+msgid "AlertsIntegrations|No integrations have been added yet."
+msgstr ""
+
+msgid "AlertsIntegrations|The current integration could not be updated. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration could not be added. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration could not be deleted. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration is currently inactive. Enable the integration to send the test alert."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration is deleted."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration is saved."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration token could not be reset. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The test alert should now be visible in your alerts list."
+msgstr ""
+
+msgid "Algorithm"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "All %{replicableType} are being scheduled for %{action}"
+msgstr ""
+
+msgid "All (default)"
+msgstr ""
+
+msgid "All GitLab"
+msgstr ""
+
+msgid "All Members"
+msgstr ""
+
+msgid "All branches"
+msgstr ""
+
+msgid "All changes are committed"
+msgstr ""
+
+msgid "All email addresses will be used to identify your commits."
+msgstr ""
+
+msgid "All environments"
+msgstr ""
+
+msgid "All groups and projects"
+msgstr ""
+
+msgid "All issues"
+msgstr ""
+
+msgid "All issues for this milestone are closed."
+msgstr ""
+
+msgid "All issues for this milestone are closed. You may close this milestone now."
+msgstr ""
+
+msgid "All merge conflicts were resolved. The merge request can now be merged."
+msgstr ""
+
+msgid "All merge request dependencies have been merged"
+msgstr ""
+
+msgid "All paths are relative to the GitLab URL. Do not include %{relative_url_link_start}relative URLs%{relative_url_link_end}."
+msgstr ""
+
+msgid "All projects"
+msgstr ""
+
+msgid "All projects selected"
+msgstr ""
+
+msgid "All protected branches"
+msgstr ""
+
+msgid "All threads resolved!"
+msgstr ""
+
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
+msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
+msgstr ""
+
+msgid "All users must have a name."
+msgstr ""
+
+msgid "All users with matching cards"
+msgstr ""
+
+msgid "Allow \"%{group_name}\" to sign you in"
+msgstr ""
+
+msgid "Allow access to members of the following group"
+msgstr ""
+
+msgid "Allow access to the following IP addresses"
+msgstr ""
+
+msgid "Allow commits from members who can merge to the target branch. %{link_start}About this feature.%{link_end}"
+msgstr ""
+
+msgid "Allow group owners to manage LDAP-related settings"
+msgstr ""
+
+msgid "Allow non-administrators access to the performance bar"
+msgstr ""
+
+msgid "Allow only the selected protocols to be used for Git access."
+msgstr ""
+
+msgid "Allow owners to manage default branch protection per group."
+msgstr ""
+
+msgid "Allow owners to manually add users outside of LDAP"
+msgstr ""
+
+msgid "Allow password authentication for Git over HTTP(S)"
+msgstr ""
+
+msgid "Allow password authentication for the web interface"
+msgstr ""
+
+msgid "Allow project maintainers to configure repository mirroring"
+msgstr ""
+
+msgid "Allow projects and subgroups to override the group setting"
+msgstr ""
+
+msgid "Allow projects within this group to use Git LFS"
+msgstr ""
+
+msgid "Allow public access to pipelines and job details, including output logs and artifacts."
+msgstr ""
+
+msgid "Allow this key to push to this repository"
+msgstr ""
+
+msgid "Allow use of licensed EE features"
+msgstr ""
+
+msgid "Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "Allow users to register any application to use GitLab as an OAuth provider"
+msgstr ""
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Allowed characters: +, 0-9, -, and spaces."
+msgstr ""
+
+msgid "Allowed email domain restriction only permitted for top-level groups"
+msgstr ""
+
+msgid "Allowed to create:"
+msgstr ""
+
+msgid "Allowed to delete projects"
+msgstr ""
+
+msgid "Allowed to fail"
+msgstr ""
+
+msgid "Allows projects or subgroups in this group to override the global setting."
+msgstr ""
+
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
+msgid "Allows you to add and manage Kubernetes clusters."
+msgstr ""
+
+msgid "Almost there"
+msgstr ""
+
+msgid "Almost there..."
+msgstr ""
+
+msgid "Already blocked"
+msgstr ""
+
+msgid "Already have login and password?"
+msgstr ""
+
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Also remove direct user membership from subgroups and projects"
+msgstr ""
+
+msgid "Also unassign this user from related issues and merge requests"
+msgstr ""
+
+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 ""
+
+msgid "Amazon EKS"
+msgstr ""
+
+msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
+msgstr ""
+
+msgid "Amazon Web Services Logo"
+msgstr ""
+
+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 Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
+msgid "An Enterprise User GitLab account has been created for you by your organization:"
+msgstr ""
+
+msgid "An administrator changed the password for your GitLab account on %{link_to}."
+msgstr ""
+
+msgid "An alert has been resolved in %{project_path}."
+msgstr ""
+
+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 ""
+
+msgid "An email notification was recently sent from the admin panel. Please wait %{wait_time_in_words} before attempting to send another message."
+msgstr ""
+
+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 ""
+
+msgid "An error has occurred"
+msgstr ""
+
+msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
+msgstr ""
+
+msgid "An error occurred adding a draft to the thread."
+msgstr ""
+
+msgid "An error occurred adding a new draft."
+msgstr ""
+
+msgid "An error occurred creating the new branch."
+msgstr ""
+
+msgid "An error occurred fetching the approval rules."
+msgstr ""
+
+msgid "An error occurred fetching the approvers for the new rule."
+msgstr ""
+
+msgid "An error occurred fetching the dropdown data."
+msgstr ""
+
+msgid "An error occurred fetching the project authors."
+msgstr ""
+
+msgid "An error occurred fetching the public deploy keys. Please try again."
+msgstr ""
+
+msgid "An error occurred previewing the blob"
+msgstr ""
+
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
+msgid "An error occurred when updating the title"
+msgstr ""
+
+msgid "An error occurred while acknowledging the notification. Refresh the page and try again."
+msgstr ""
+
+msgid "An error occurred while adding approvers"
+msgstr ""
+
+msgid "An error occurred while adding formatted title for epic"
+msgstr ""
+
+msgid "An error occurred while authorizing your role"
+msgstr ""
+
+msgid "An error occurred while checking group path. Please refresh and try again."
+msgstr ""
+
+msgid "An error occurred while decoding the file."
+msgstr ""
+
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
+msgid "An error occurred while deleting the comment"
+msgstr ""
+
+msgid "An error occurred while deleting the pipeline."
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
+msgid "An error occurred while disabling Service Desk."
+msgstr ""
+
+msgid "An error occurred while dismissing the alert. Refresh the page and try again."
+msgstr ""
+
+msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
+msgstr ""
+
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
+msgid "An error occurred while enabling Service Desk."
+msgstr ""
+
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
+msgid "An error occurred while fetching branches."
+msgstr ""
+
+msgid "An error occurred while fetching branches. Retry the search."
+msgstr ""
+
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
+msgid "An error occurred while fetching commit data."
+msgstr ""
+
+msgid "An error occurred while fetching commits. Retry the search."
+msgstr ""
+
+msgid "An error occurred while fetching coverage reports."
+msgstr ""
+
+msgid "An error occurred while fetching environments."
+msgstr ""
+
+msgid "An error occurred while fetching exposed artifacts."
+msgstr ""
+
+msgid "An error occurred while fetching folder content."
+msgstr ""
+
+msgid "An error occurred while fetching issues."
+msgstr ""
+
+msgid "An error occurred while fetching label colors."
+msgstr ""
+
+msgid "An error occurred while fetching participants"
+msgstr ""
+
+msgid "An error occurred while fetching participants."
+msgstr ""
+
+msgid "An error occurred while fetching pending comments"
+msgstr ""
+
+msgid "An error occurred while fetching projects autocomplete."
+msgstr ""
+
+msgid "An error occurred while fetching reference"
+msgstr ""
+
+msgid "An error occurred while fetching tags. Retry the search."
+msgstr ""
+
+msgid "An error occurred while fetching terraform reports."
+msgstr ""
+
+msgid "An error occurred while fetching the job log."
+msgstr ""
+
+msgid "An error occurred while fetching the job logs."
+msgstr ""
+
+msgid "An error occurred while fetching the job."
+msgstr ""
+
+msgid "An error occurred while fetching the jobs."
+msgstr ""
+
+msgid "An error occurred while fetching the latest pipeline."
+msgstr ""
+
+msgid "An error occurred while fetching the pipelines jobs."
+msgstr ""
+
+msgid "An error occurred while fetching the releases. Please try again."
+msgstr ""
+
+msgid "An error occurred while fetching this tab."
+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 ""
+
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading a section of this page."
+msgstr ""
+
+msgid "An error occurred while loading all the files."
+msgstr ""
+
+msgid "An error occurred while loading chart data"
+msgstr ""
+
+msgid "An error occurred while loading code owners."
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
+
+msgid "An error occurred while loading designs. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading diff"
+msgstr ""
+
+msgid "An error occurred while loading filenames"
+msgstr ""
+
+msgid "An error occurred while loading group members."
+msgstr ""
+
+msgid "An error occurred while loading issues"
+msgstr ""
+
+msgid "An error occurred while loading merge requests."
+msgstr ""
+
+msgid "An error occurred while loading projects."
+msgstr ""
+
+msgid "An error occurred while loading the Jobs tab."
+msgstr ""
+
+msgid "An error occurred while loading the Needs tab."
+msgstr ""
+
+msgid "An error occurred while loading the Test Reports tab."
+msgstr ""
+
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
+msgid "An error occurred while loading the blob controls."
+msgstr ""
+
+msgid "An error occurred while loading the data. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading the file"
+msgstr ""
+
+msgid "An error occurred while loading the file content."
+msgstr ""
+
+msgid "An error occurred while loading the file."
+msgstr ""
+
+msgid "An error occurred while loading the file. Please try again later."
+msgstr ""
+
+msgid "An error occurred while loading the file. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading the merge request changes."
+msgstr ""
+
+msgid "An error occurred while loading the merge request version data."
+msgstr ""
+
+msgid "An error occurred while loading the merge request."
+msgstr ""
+
+msgid "An error occurred while loading the notification settings. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading the pipeline."
+msgstr ""
+
+msgid "An error occurred while loading the pipelines jobs."
+msgstr ""
+
+msgid "An error occurred while making the request."
+msgstr ""
+
+msgid "An error occurred while moving the issue."
+msgstr ""
+
+msgid "An error occurred while parsing recent searches"
+msgstr ""
+
+msgid "An error occurred while parsing the file."
+msgstr ""
+
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
+msgid "An error occurred while performing this action."
+msgstr ""
+
+msgid "An error occurred while removing epics."
+msgstr ""
+
+msgid "An error occurred while removing issues."
+msgstr ""
+
+msgid "An error occurred while rendering preview broadcast message"
+msgstr ""
+
+msgid "An error occurred while rendering the editor"
+msgstr ""
+
+msgid "An error occurred while reordering issues."
+msgstr ""
+
+msgid "An error occurred while retrieving calendar activity"
+msgstr ""
+
+msgid "An error occurred while retrieving diff"
+msgstr ""
+
+msgid "An error occurred while retrieving diff files"
+msgstr ""
+
+msgid "An error occurred while retrieving projects."
+msgstr ""
+
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while saving the setting"
+msgid_plural "An error occurred while saving the settings"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while triggering the job."
+msgstr ""
+
+msgid "An error occurred while trying to follow this user, please try again."
+msgstr ""
+
+msgid "An error occurred while trying to generate the report. Please try again later."
+msgstr ""
+
+msgid "An error occurred while trying to run a new pipeline for this merge request."
+msgstr ""
+
+msgid "An error occurred while trying to unfollow this user, please try again."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while updating approvers"
+msgstr ""
+
+msgid "An error occurred while updating assignees."
+msgstr ""
+
+msgid "An error occurred while updating configuration."
+msgstr ""
+
+msgid "An error occurred while updating labels."
+msgstr ""
+
+msgid "An error occurred while updating the comment"
+msgstr ""
+
+msgid "An error occurred while updating the configuration."
+msgstr ""
+
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
+msgid "An error occurred while uploading the file. Please try again."
+msgstr ""
+
+msgid "An error occurred while validating group path"
+msgstr ""
+
+msgid "An error occurred while validating username"
+msgstr ""
+
+msgid "An error occurred. Please sign in again."
+msgstr ""
+
+msgid "An error occurred. Please try again."
+msgstr ""
+
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
+msgstr ""
+
+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 ""
+
+msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
+msgstr ""
+
+msgid "An incident has been resolved in %{project_path}."
+msgstr ""
+
+msgid "An incident has been triggered in %{project_path}."
+msgstr ""
+
+msgid "An integer value is required for seconds"
+msgstr ""
+
+msgid "An issue already exists"
+msgstr ""
+
+msgid "An unauthenticated user"
+msgstr ""
+
+msgid "An unexpected error occurred"
+msgstr ""
+
+msgid "An unexpected error occurred while checking the project environment."
+msgstr ""
+
+msgid "An unexpected error occurred while checking the project runners."
+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 ""
+
+msgid "An unexpected error occurred while stopping the Web Terminal."
+msgstr ""
+
+msgid "An unknown error occurred while loading this graph."
+msgstr ""
+
+msgid "An unknown error occurred."
+msgstr ""
+
+msgid "Analytics"
+msgstr ""
+
+msgid "Analyze your dependencies for known vulnerabilities."
+msgstr ""
+
+msgid "Analyze your infrastructure as code configuration files for known vulnerabilities."
+msgstr ""
+
+msgid "Analyze your source code and git history for secrets."
+msgstr ""
+
+msgid "Analyze your source code for known vulnerabilities."
+msgstr ""
+
+msgid "Analyzing file…"
+msgstr ""
+
+msgid "Ancestors"
+msgstr ""
+
+msgid "And this registration token:"
+msgstr ""
+
+msgid "Anonymous"
+msgstr ""
+
+msgid "Another action is currently in progress"
+msgstr ""
+
+msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
+msgstr ""
+
+msgid "Another third-party wiki is already in use. Only one third-party wiki integration can be active at a time"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any %{header}"
+msgstr ""
+
+msgid "Any Author"
+msgstr ""
+
+msgid "Any Milestone"
+msgstr ""
+
+msgid "Any encrypted tokens"
+msgstr ""
+
+msgid "Any label"
+msgstr ""
+
+msgid "Any member with at least Developer permissions on the project."
+msgstr ""
+
+msgid "Any milestone"
+msgstr ""
+
+msgid "Any namespace"
+msgstr ""
+
+msgid "Anyone can register for an account."
+msgstr ""
+
+msgid "App ID"
+msgstr ""
+
+msgid "Appearance"
+msgstr ""
+
+msgid "Appearance was successfully created."
+msgstr ""
+
+msgid "Appearance was successfully updated."
+msgstr ""
+
+msgid "Append the comment with %{shrug}"
+msgstr ""
+
+msgid "Append the comment with %{tableflip}"
+msgstr ""
+
+msgid "Application"
+msgstr ""
+
+msgid "Application ID"
+msgstr ""
+
+msgid "Application limits saved successfully"
+msgstr ""
+
+msgid "Application settings saved successfully"
+msgstr ""
+
+msgid "Application settings saved successfully."
+msgstr ""
+
+msgid "Application settings update failed"
+msgstr ""
+
+msgid "Application uninstalled but failed to destroy: %{error_message}"
+msgstr ""
+
+msgid "Application was successfully destroyed."
+msgstr ""
+
+msgid "Application was successfully updated."
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
+msgid "ApplicationSettings|A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
+msgstr ""
+
+msgid "ApplicationSettings|Add a link to Grafana"
+msgstr ""
+
+msgid "ApplicationSettings|After sign-up text"
+msgstr ""
+
+msgid "ApplicationSettings|After the instance reaches the user cap, any user who is added or requests access must be approved by an administrator. Leave blank for unlimited."
+msgstr ""
+
+msgid "ApplicationSettings|Allowed domains for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Any user that visits %{host} and creates an account must be explicitly approved by an administrator before they can sign in. Only effective if sign-ups are enabled."
+msgstr ""
+
+msgid "ApplicationSettings|Any user that visits %{host} can create an account."
+msgstr ""
+
+msgid "ApplicationSettings|Approve %d user"
+msgid_plural "ApplicationSettings|Approve %d users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApplicationSettings|Approve users"
+msgstr ""
+
+msgid "ApplicationSettings|Approve users in the pending approval status?"
+msgstr ""
+
+msgid "ApplicationSettings|Approve users who are pending approval?"
+msgstr ""
+
+msgid "ApplicationSettings|By making this change, you will automatically approve %d user who is pending approval."
+msgid_plural "ApplicationSettings|By making this change, you will automatically approve %d users who are pending approval."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApplicationSettings|By making this change, you will automatically approve all users who are pending approval."
+msgstr ""
+
+msgid "ApplicationSettings|Denied domains for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Denylist file"
+msgstr ""
+
+msgid "ApplicationSettings|Domain denylist"
+msgstr ""
+
+msgid "ApplicationSettings|Email restrictions"
+msgstr ""
+
+msgid "ApplicationSettings|Email restrictions for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Enable Slack application"
+msgstr ""
+
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Enter denylist manually"
+msgstr ""
+
+msgid "ApplicationSettings|Minimum password length (number of characters)"
+msgstr ""
+
+msgid "ApplicationSettings|Only users with e-mail addresses that match these domain(s) can sign up. Wildcards allowed. Use separate lines for multiple entries. Example: domain.com, *.domain.com"
+msgstr ""
+
+msgid "ApplicationSettings|Require admin approval for new sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. %{linkStart}What is the supported syntax?%{linkEnd}"
+msgstr ""
+
+msgid "ApplicationSettings|Save changes"
+msgstr ""
+
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
+msgstr ""
+
+msgid "ApplicationSettings|Send confirmation email on sign-up"
+msgstr ""
+
+msgid "ApplicationSettings|Sign-up enabled"
+msgstr ""
+
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
+msgstr ""
+
+msgid "ApplicationSettings|This option is only available on GitLab.com"
+msgstr ""
+
+msgid "ApplicationSettings|Upload denylist file"
+msgstr ""
+
+msgid "ApplicationSettings|User cap"
+msgstr ""
+
+msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) cannot sign up. Wildcards allowed. Use separate lines for multiple entries. Example: domain.com, *.domain.com"
+msgstr ""
+
+msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) cannot sign up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgstr ""
+
+msgid "ApplicationSettings|domain.com"
+msgstr ""
+
+msgid "Applications"
+msgstr ""
+
+msgid "Applied"
+msgstr ""
+
+msgid "Apply"
+msgstr ""
+
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Apply a label"
+msgstr ""
+
+msgid "Apply a template"
+msgstr ""
+
+msgid "Apply suggestion"
+msgstr ""
+
+msgid "Apply template"
+msgstr ""
+
+msgid "Apply this approval rule to all branches or a specific protected branch."
+msgstr ""
+
+msgid "Applying"
+msgstr ""
+
+msgid "Applying a template will replace the existing issue description. Any changes you have made will be lost."
+msgstr ""
+
+msgid "Applying command"
+msgstr ""
+
+msgid "Applying command to %{commandDescription}"
+msgstr ""
+
+msgid "Applying multiple commands"
+msgstr ""
+
+msgid "Applying suggestion..."
+msgstr ""
+
+msgid "Applying suggestions..."
+msgstr ""
+
+msgid "Approval rules"
+msgstr ""
+
+msgid "Approval rules reset to project defaults"
+msgstr ""
+
+msgid "Approval settings"
+msgstr ""
+
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} member%{strongEnd}. Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} members%{strongEnd}. Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|A merge request author collaborating with a merge request approver"
+msgstr ""
+
+msgid "ApprovalRule|Add approvers"
+msgstr ""
+
+msgid "ApprovalRule|Approval rules"
+msgstr ""
+
+msgid "ApprovalRule|Approvals required"
+msgstr ""
+
+msgid "ApprovalRule|Approver Type"
+msgstr ""
+
+msgid "ApprovalRule|Approvers"
+msgstr ""
+
+msgid "ApprovalRule|Confirmed"
+msgstr ""
+
+msgid "ApprovalRule|Dismissed"
+msgstr ""
+
+msgid "ApprovalRule|Examples: QA, Security."
+msgstr ""
+
+msgid "ApprovalRule|Improve your organization's code review with required approvals."
+msgstr ""
+
+msgid "ApprovalRule|Increase quality and maintain standards."
+msgstr ""
+
+msgid "ApprovalRule|Learn more about merge request approval rules."
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|Newly detected"
+msgstr ""
+
+msgid "ApprovalRule|Previously detected"
+msgstr ""
+
+msgid "ApprovalRule|Reduce your time to merge."
+msgstr ""
+
+msgid "ApprovalRule|Resolved"
+msgstr ""
+
+msgid "ApprovalRule|Rule name"
+msgstr ""
+
+msgid "ApprovalRule|Select eligible approvers by expertise or files changed."
+msgstr ""
+
+msgid "ApprovalRule|Target branch"
+msgstr ""
+
+msgid "ApprovalRule|Try for free"
+msgstr ""
+
+msgid "ApprovalSettings|Merge request approval settings have been updated."
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approval by author"
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approval by author."
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approvals by users who add commits"
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approvals by users who add commits."
+msgstr ""
+
+msgid "ApprovalSettings|Prevent editing approval rules in merge requests"
+msgstr ""
+
+msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
+msgstr ""
+
+msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch"
+msgstr ""
+
+msgid "ApprovalSettings|Require user password to approve"
+msgstr ""
+
+msgid "ApprovalSettings|There was an error loading merge request approval settings."
+msgstr ""
+
+msgid "ApprovalSettings|There was an error updating merge request approval settings."
+msgstr ""
+
+msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
+msgstr ""
+
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed in the group settings by an administrator or group owner."
+msgstr ""
+
+msgid "Approvals are optional."
+msgstr ""
+
+msgid "Approvals|Section: %section"
+msgstr ""
+
+msgid "Approve"
+msgstr ""
+
+msgid "Approve a merge request"
+msgstr ""
+
+msgid "Approve the current merge request."
+msgstr ""
+
+msgid "Approved"
+msgstr ""
+
+msgid "Approved MRs"
+msgstr ""
+
+msgid "Approved the current merge request."
+msgstr ""
+
+msgid "Approved-By"
+msgstr ""
+
+msgid "Approved. Your attention request was removed."
+msgstr ""
+
+msgid "Approver"
+msgstr ""
+
+msgid "Approvers"
+msgstr ""
+
+msgid "Approvers from private group(s) not shown"
+msgstr ""
+
+msgid "Apr"
+msgstr ""
+
+msgid "April"
+msgstr ""
+
+msgid "Architecture not found for OS"
+msgstr ""
+
+msgid "Archive"
+msgstr ""
+
+msgid "Archive jobs"
+msgstr ""
+
+msgid "Archive project"
+msgstr ""
+
+msgid "Archive test case"
+msgstr ""
+
+msgid "Archived"
+msgstr ""
+
+msgid "Archived (%{movedToStart}moved%{movedToEnd})"
+msgstr ""
+
+msgid "Archived in this version"
+msgstr ""
+
+msgid "Archived project! Repository and other project resources are read-only"
+msgstr ""
+
+msgid "Archived projects"
+msgstr ""
+
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
+msgstr ""
+
+msgid "Are you absolutely sure?"
+msgstr ""
+
+msgid "Are you sure that you want to archive this project?"
+msgstr ""
+
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
+msgid "Are you sure that you want to unarchive this project?"
+msgstr ""
+
+msgid "Are you sure you want to %{action} %{name}?"
+msgstr ""
+
+msgid "Are you sure you want to approve %{user}?"
+msgstr ""
+
+msgid "Are you sure you want to attempt to merge?"
+msgstr ""
+
+msgid "Are you sure you want to cancel editing this %{commentType}?"
+msgstr ""
+
+msgid "Are you sure you want to close this blocked issue?"
+msgstr ""
+
+msgid "Are you sure you want to delete %{name}?"
+msgstr ""
+
+msgid "Are you sure you want to delete these artifacts?"
+msgstr ""
+
+msgid "Are you sure you want to delete this %{commentType}?"
+msgstr ""
+
+msgid "Are you sure you want to delete this SSH key?"
+msgstr ""
+
+msgid "Are you sure you want to delete this comment?"
+msgstr ""
+
+msgid "Are you sure you want to delete this deploy key?"
+msgstr ""
+
+msgid "Are you sure you want to delete this device? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to delete this label?"
+msgstr ""
+
+msgid "Are you sure you want to delete this pipeline schedule?"
+msgstr ""
+
+msgid "Are you sure you want to delete this pipeline? Doing so will expire all pipeline caches and delete all related objects, such as builds, logs, artifacts, and triggers. This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to deploy this environment?"
+msgstr ""
+
+msgid "Are you sure you want to discard this comment?"
+msgstr ""
+
+msgid "Are you sure you want to discard your changes?"
+msgstr ""
+
+msgid "Are you sure you want to import %d repository?"
+msgid_plural "Are you sure you want to import %d repositories?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Are you sure you want to lock %{path}?"
+msgstr ""
+
+msgid "Are you sure you want to lock this directory?"
+msgstr ""
+
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to lose your issue information?"
+msgstr ""
+
+msgid "Are you sure you want to merge immediately?"
+msgstr ""
+
+msgid "Are you sure you want to re-deploy this environment?"
+msgstr ""
+
+msgid "Are you sure you want to reindex?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{email}?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
+msgid "Are you sure you want to remove the attachment?"
+msgstr ""
+
+msgid "Are you sure you want to remove the license?"
+msgstr ""
+
+msgid "Are you sure you want to remove this deploy key? If anything is still using this key, it will stop working."
+msgstr ""
+
+msgid "Are you sure you want to remove this identity?"
+msgstr ""
+
+msgid "Are you sure you want to remove this list?"
+msgstr ""
+
+msgid "Are you sure you want to remove this nickname?"
+msgstr ""
+
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
+msgid "Are you sure you want to reset the health check token?"
+msgstr ""
+
+msgid "Are you sure you want to reset the registration token?"
+msgstr ""
+
+msgid "Are you sure you want to retry this migration?"
+msgstr ""
+
+msgid "Are you sure you want to revoke this %{accessTokenType}? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to revoke this %{type}? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to revoke this personal access token? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to revoke this project access token? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to stop this environment?"
+msgstr ""
+
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
+msgid "Are you sure you want to unlock %{path}?"
+msgstr ""
+
+msgid "Are you sure you want to unlock this directory?"
+msgstr ""
+
+msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+msgid "Are you sure? All commits that were signed with this GPG key will be unverified."
+msgstr ""
+
+msgid "Are you sure? Removing this GPG key does not affect already signed commits."
+msgstr ""
+
+msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
+msgstr ""
+
+msgid "Arrange charts"
+msgstr ""
+
+msgid "Artifact"
+msgstr ""
+
+msgid "Artifact could not be deleted."
+msgstr ""
+
+msgid "Artifact was successfully deleted."
+msgstr ""
+
+msgid "Artifacts"
+msgstr ""
+
+msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
+msgstr ""
+
+msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ):"
+msgstr ""
+
+msgid "AsanaService|Add commit messages as comments to Asana tasks."
+msgstr ""
+
+msgid "AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches."
+msgstr ""
+
+msgid "AsanaService|User Personal Access Token. User must have access to the task. All comments are attributed to this user."
+msgstr ""
+
+msgid "Ascending"
+msgstr ""
+
+msgid "Ask again later"
+msgstr ""
+
+msgid "Ask someone with write access to resolve it."
+msgstr ""
+
+msgid "Ask your group owner to set up a group runner."
+msgstr ""
+
+msgid "Assertion consumer service URL"
+msgstr ""
+
+msgid "Assets"
+msgstr ""
+
+msgid "Assets:"
+msgstr ""
+
+msgid "Assign"
+msgstr ""
+
+msgid "Assign Iteration"
+msgstr ""
+
+msgid "Assign To"
+msgstr ""
+
+msgid "Assign custom color like #FF0000"
+msgstr ""
+
+msgid "Assign labels"
+msgstr ""
+
+msgid "Assign milestone"
+msgstr ""
+
+msgid "Assign myself"
+msgstr ""
+
+msgid "Assign reviewer"
+msgstr ""
+
+msgid "Assign reviewer(s)"
+msgstr ""
+
+msgid "Assign severity"
+msgstr ""
+
+msgid "Assign some issues to this milestone."
+msgstr ""
+
+msgid "Assign to"
+msgstr ""
+
+msgid "Assign to commenting user"
+msgstr ""
+
+msgid "Assign to me"
+msgstr ""
+
+msgid "Assigned %{assignee_users_sentence}."
+msgstr ""
+
+msgid "Assigned %{reviewer_users_sentence} as %{reviewer_text}."
+msgstr ""
+
+msgid "Assigned Issues"
+msgstr ""
+
+msgid "Assigned merge requests"
+msgstr ""
+
+msgid "Assigned projects"
+msgstr ""
+
+msgid "Assigned to %{assigneeName}"
+msgstr ""
+
+msgid "Assigned to %{assignee_name}"
+msgstr ""
+
+msgid "Assigned to me"
+msgstr ""
+
+msgid "Assigned to you"
+msgstr ""
+
+msgid "Assigned user(s). Your attention request was removed."
+msgstr ""
+
+msgid "Assignee"
+msgid_plural "%d Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Assignee has no permissions"
+msgstr ""
+
+msgid "Assignee lists not available with your current license"
+msgstr ""
+
+msgid "Assignee(s)"
+msgstr ""
+
+msgid "Assignees"
+msgstr ""
+
+msgid "Assigns %{assignee_users_sentence}."
+msgstr ""
+
+msgid "Assigns %{reviewer_users_sentence} as %{reviewer_text}."
+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 ""
+
+msgid "At least one of your Personal Access Tokens is expired. %{generate_new}"
+msgstr ""
+
+msgid "At least one of your Personal Access Tokens will expire soon. %{generate_new}"
+msgstr ""
+
+msgid "At risk"
+msgstr ""
+
+msgid "Attach a file"
+msgstr ""
+
+msgid "Attaching File - %{progress}"
+msgstr ""
+
+msgid "Attaching a file"
+msgid_plural "Attaching %d files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Attaching the file failed."
+msgstr ""
+
+msgid "Attention"
+msgstr ""
+
+msgid "Attention requested"
+msgstr ""
+
+msgid "Audit Events"
+msgstr ""
+
+msgid "Audit events"
+msgstr ""
+
+msgid "AuditLogs|(removed)"
+msgstr ""
+
+msgid "AuditLogs|Action"
+msgstr ""
+
+msgid "AuditLogs|Author"
+msgstr ""
+
+msgid "AuditLogs|Date"
+msgstr ""
+
+msgid "AuditLogs|Failed to find %{type}. Please search for another %{type}."
+msgstr ""
+
+msgid "AuditLogs|Failed to find %{type}. Please try again."
+msgstr ""
+
+msgid "AuditLogs|Group Events"
+msgstr ""
+
+msgid "AuditLogs|IP Address"
+msgstr ""
+
+msgid "AuditLogs|Log"
+msgstr ""
+
+msgid "AuditLogs|Member Events"
+msgstr ""
+
+msgid "AuditLogs|No matching %{type} found."
+msgstr ""
+
+msgid "AuditLogs|Object"
+msgstr ""
+
+msgid "AuditLogs|Project Events"
+msgstr ""
+
+msgid "AuditLogs|Target"
+msgstr ""
+
+msgid "AuditLogs|This month"
+msgstr ""
+
+msgid "AuditLogs|User Events"
+msgstr ""
+
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
+msgid "AuditStreams|Value"
+msgstr ""
+
+msgid "Aug"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "Authenticate"
+msgstr ""
+
+msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead. %{link_start}How do I configure authentication using the GitLab database? %{link_end}"
+msgstr ""
+
+msgid "Authenticate with GitHub"
+msgstr ""
+
+msgid "Authenticated API rate limit period in seconds"
+msgstr ""
+
+msgid "Authenticated API requests"
+msgstr ""
+
+msgid "Authenticated Git LFS rate limit period in seconds"
+msgstr ""
+
+msgid "Authenticated Git LFS request rate limit"
+msgstr ""
+
+msgid "Authenticated Git LFS requests"
+msgstr ""
+
+msgid "Authenticated web rate limit period in seconds"
+msgstr ""
+
+msgid "Authenticated web requests"
+msgstr ""
+
+msgid "Authentication"
+msgstr ""
+
+msgid "Authentication Failure"
+msgstr ""
+
+msgid "Authentication Log"
+msgstr ""
+
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
+msgid "Authentication failed: %{error_message}"
+msgstr ""
+
+msgid "Authentication log"
+msgstr ""
+
+msgid "Authentication method"
+msgstr ""
+
+msgid "Authentication method updated"
+msgstr ""
+
+msgid "Authentication via U2F device failed."
+msgstr ""
+
+msgid "Authentication via WebAuthn device failed."
+msgstr ""
+
+msgid "Author"
+msgstr ""
+
+msgid "Author: %{author_name}"
+msgstr ""
+
+msgid "Authored %{timeago}"
+msgstr ""
+
+msgid "Authored %{timeago} by %{author}"
+msgstr ""
+
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization required"
+msgstr ""
+
+msgid "Authorization token duration (minutes)"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorize %{user} to use your account?"
+msgstr ""
+
+msgid "Authorized %{new_chat_name}"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
+msgid "AuthorizedApplication|Are you sure you want to revoke this application?"
+msgstr ""
+
+msgid "AuthorizedApplication|Revoke application"
+msgstr ""
+
+msgid "Authors: %{authors}"
+msgstr ""
+
+msgid "Auto DevOps"
+msgstr ""
+
+msgid "Auto DevOps enabled"
+msgstr ""
+
+msgid "Auto stop successfully canceled."
+msgstr ""
+
+msgid "Auto-cancel redundant pipelines"
+msgstr ""
+
+msgid "Auto-close referenced issues on default branch"
+msgstr ""
+
+msgid "AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}"
+msgstr ""
+
+msgid "AutoDevOps|Auto DevOps"
+msgstr ""
+
+msgid "AutoDevOps|Auto DevOps documentation"
+msgstr ""
+
+msgid "AutoDevOps|Dismiss Auto DevOps box"
+msgstr ""
+
+msgid "AutoDevOps|Enable in settings"
+msgstr ""
+
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
+msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
+msgstr ""
+
+msgid "AutoDevOps|The Auto DevOps pipeline has been enabled and will be used if no alternative CI configuration file is found."
+msgstr ""
+
+msgid "AutoDevopsAlert|Security testing tools enabled with %{linkStart}Auto DevOps%{linkEnd}"
+msgstr ""
+
+msgid "AutoRemediation| 1 Merge Request"
+msgstr ""
+
+msgid "AutoRemediation|%{mrsCount} ready for review"
+msgstr ""
+
+msgid "AutoRemediation|Auto-fix"
+msgstr ""
+
+msgid "AutoRemediation|Auto-fix solutions"
+msgstr ""
+
+msgid "AutoRemediation|If you're using dependency and/or container scanning, and auto-fix is enabled, auto-fix automatically creates merge requests with fixes to vulnerabilities."
+msgstr ""
+
+msgid "AutoRemediation|Introducing GitLab auto-fix"
+msgstr ""
+
+msgid "AutoRollback|Automatic rollbacks start when a critical alert is triggered. If the last successful deployment fails to roll back automatically, it can still be done manually."
+msgstr ""
+
+msgid "AutoRollback|Automatically roll back to the last successful deployment when a critical problem is detected."
+msgstr ""
+
+msgid "AutoRollback|Enable automatic rollbacks"
+msgstr ""
+
+msgid "Autocomplete"
+msgstr ""
+
+msgid "Autocomplete description"
+msgstr ""
+
+msgid "Autocomplete hint"
+msgstr ""
+
+msgid "Autocomplete usage hint"
+msgstr ""
+
+msgid "Automatic certificate management using %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}"
+msgstr ""
+
+msgid "Automatic certificate management using Let's Encrypt"
+msgstr ""
+
+msgid "Automatic deployment rollbacks"
+msgstr ""
+
+msgid "Automatic event tracking provides a traceable history for audits."
+msgstr ""
+
+msgid "Automatically close associated incident when a recovery alert notification resolves an alert"
+msgstr ""
+
+msgid "Automatically resolved"
+msgstr ""
+
+msgid "Automatically update this project's branches and tags from the upstream repository every hour."
+msgstr ""
+
+msgid "Autosave|Note"
+msgstr ""
+
+msgid "Available"
+msgstr ""
+
+msgid "Available ID"
+msgstr ""
+
+msgid "Available group runners: %{runners}"
+msgstr ""
+
+msgid "Available on-demand"
+msgstr ""
+
+msgid "Available shared runners:"
+msgstr ""
+
+msgid "Available specific runners"
+msgstr ""
+
+msgid "Avatar for %{assigneeName}"
+msgstr ""
+
+msgid "Avatar will be removed. Are you sure?"
+msgstr ""
+
+msgid "Average per day: %{average}"
+msgstr ""
+
+msgid "Awaiting user signup"
+msgstr ""
+
+msgid "Award added"
+msgstr ""
+
+msgid "Award removed"
+msgstr ""
+
+msgid "AwardEmoji|No emojis found."
+msgstr ""
+
+msgid "Back"
+msgstr ""
+
+msgid "Back to page %{number}"
+msgstr ""
+
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
+msgid "Background Migrations"
+msgstr ""
+
+msgid "Background color"
+msgstr ""
+
+msgid "BackgroundMigrations|Background Migrations"
+msgstr ""
+
+msgid "BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "BackgroundMigrations|Batch size"
+msgstr ""
+
+msgid "BackgroundMigrations|Database"
+msgstr ""
+
+msgid "BackgroundMigrations|Failed jobs:"
+msgstr ""
+
+msgid "BackgroundMigrations|Finished at"
+msgstr ""
+
+msgid "BackgroundMigrations|Started at"
+msgstr ""
+
+msgid "Badges"
+msgstr ""
+
+msgid "Badges|Add badge"
+msgstr ""
+
+msgid "Badges|Adding the badge failed, please check the entered URLs and try again."
+msgstr ""
+
+msgid "Badges|Badge image URL"
+msgstr ""
+
+msgid "Badges|Badge image preview"
+msgstr ""
+
+msgid "Badges|Badge saved."
+msgstr ""
+
+msgid "Badges|Delete badge?"
+msgstr ""
+
+msgid "Badges|Deleting the badge failed, please try again."
+msgstr ""
+
+msgid "Badges|Enter a valid URL"
+msgstr ""
+
+msgid "Badges|Example: %{exampleUrl}"
+msgstr ""
+
+msgid "Badges|Group Badge"
+msgstr ""
+
+msgid "Badges|Link"
+msgstr ""
+
+msgid "Badges|Name"
+msgstr ""
+
+msgid "Badges|New badge added."
+msgstr ""
+
+msgid "Badges|No badge image"
+msgstr ""
+
+msgid "Badges|No image to preview"
+msgstr ""
+
+msgid "Badges|Project Badge"
+msgstr ""
+
+msgid "Badges|Reload badge image"
+msgstr ""
+
+msgid "Badges|Save changes"
+msgstr ""
+
+msgid "Badges|Saving the badge failed, please check the entered URLs and try again."
+msgstr ""
+
+msgid "Badges|Supported %{docsLinkStart}variables%{docsLinkEnd}: %{placeholders}"
+msgstr ""
+
+msgid "Badges|The badge was deleted."
+msgstr ""
+
+msgid "Badges|This group has no badges"
+msgstr ""
+
+msgid "Badges|This project has no badges"
+msgstr ""
+
+msgid "Badges|You are going to delete this badge. Deleted badges %{strongStart}cannot%{strongEnd} be restored."
+msgstr ""
+
+msgid "Badges|Your badges"
+msgstr ""
+
+msgid "BambooService|Atlassian Bamboo"
+msgstr ""
+
+msgid "BambooService|Bamboo URL"
+msgstr ""
+
+msgid "BambooService|Bamboo build plan key."
+msgstr ""
+
+msgid "BambooService|Bamboo service root URL."
+msgstr ""
+
+msgid "BambooService|Enter new build key"
+msgstr ""
+
+msgid "BambooService|Leave blank to use your current build key."
+msgstr ""
+
+msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo."
+msgstr ""
+
+msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo. You must set up automatic revision labeling and a repository trigger in Bamboo. %{docs_link}"
+msgstr ""
+
+msgid "BambooService|The user with API access to the Bamboo server."
+msgstr ""
+
+msgid "Banner message"
+msgstr ""
+
+msgid "Based on"
+msgstr ""
+
+msgid "Batch size"
+msgstr ""
+
+msgid "Batched Job|Background Migrations"
+msgstr ""
+
+msgid "Batched Job|Batched Job (Id: %{id})"
+msgstr ""
+
+msgid "BatchedJob|Attempts"
+msgstr ""
+
+msgid "BatchedJob|Batch size"
+msgstr ""
+
+msgid "BatchedJob|Batched Jobs"
+msgstr ""
+
+msgid "BatchedJob|Created At"
+msgstr ""
+
+msgid "BatchedJob|Created at"
+msgstr ""
+
+msgid "BatchedJob|Exception Class"
+msgstr ""
+
+msgid "BatchedJob|Exception Message"
+msgstr ""
+
+msgid "BatchedJob|Exception class"
+msgstr ""
+
+msgid "BatchedJob|Exception message"
+msgstr ""
+
+msgid "BatchedJob|Finished at"
+msgstr ""
+
+msgid "BatchedJob|Max Value"
+msgstr ""
+
+msgid "BatchedJob|Max value"
+msgstr ""
+
+msgid "BatchedJob|Min Value"
+msgstr ""
+
+msgid "BatchedJob|Min value"
+msgstr ""
+
+msgid "BatchedJob|Next Status"
+msgstr ""
+
+msgid "BatchedJob|Next status"
+msgstr ""
+
+msgid "BatchedJob|Pause ms"
+msgstr ""
+
+msgid "BatchedJob|Pause time (ms)"
+msgstr ""
+
+msgid "BatchedJob|Previous Status"
+msgstr ""
+
+msgid "BatchedJob|Previous status"
+msgstr ""
+
+msgid "BatchedJob|Started at"
+msgstr ""
+
+msgid "BatchedJob|Transition logs:"
+msgstr ""
+
+msgid "Be careful. Changing the project's namespace can have unintended side effects."
+msgstr ""
+
+msgid "Be careful. Renaming a project's repository can have unintended side effects."
+msgstr ""
+
+msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
+msgstr ""
+
+msgid "Before inserting code, be sure to read the comment that separated each code group."
+msgstr ""
+
+msgid "Before this can be merged, a Jira issue must be linked in the title or description"
+msgstr ""
+
+msgid "Begin with the selected commit"
+msgstr ""
+
+msgid "Below are the fingerprints for the current instance SSH host keys."
+msgstr ""
+
+msgid "Below are the settings for %{link_to_gitlab_pages}."
+msgstr ""
+
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Bi-weekly code coverage"
+msgstr ""
+
+msgid "Billable Users"
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
+msgstr ""
+
+msgid "BillingPlans|10,000 CI/CD minutes per month"
+msgstr ""
+
+msgid "BillingPlans|10GB transfer per month"
+msgstr ""
+
+msgid "BillingPlans|400 CI/CD minutes per month"
+msgstr ""
+
+msgid "BillingPlans|5 users per namespace"
+msgstr ""
+
+msgid "BillingPlans|50,000 CI/CD minutes per month"
+msgstr ""
+
+msgid "BillingPlans|5GB storage"
+msgstr ""
+
+msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
+msgstr ""
+
+msgid "BillingPlans|Advanced CI/CD"
+msgstr ""
+
+msgid "BillingPlans|All plans have unlimited (private) repositories."
+msgstr ""
+
+msgid "BillingPlans|All the features from Free"
+msgstr ""
+
+msgid "BillingPlans|All the features from Premium"
+msgstr ""
+
+msgid "BillingPlans|Billed annually at %{price_per_year} USD"
+msgstr ""
+
+msgid "BillingPlans|Check out all groups"
+msgstr ""
+
+msgid "BillingPlans|Compliance"
+msgstr ""
+
+msgid "BillingPlans|Congratulations, your free trial is activated."
+msgstr ""
+
+msgid "BillingPlans|End of availability for the Bronze Plan"
+msgstr ""
+
+msgid "BillingPlans|Enhance team productivity and collaboration"
+msgstr ""
+
+msgid "BillingPlans|Enterprise agile planning"
+msgstr ""
+
+msgid "BillingPlans|Faster code reviews"
+msgstr ""
+
+msgid "BillingPlans|Free forever features for individual users"
+msgstr ""
+
+msgid "BillingPlans|Free guest users"
+msgstr ""
+
+msgid "BillingPlans|Free upgrade!"
+msgstr ""
+
+msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
+msgstr ""
+
+msgid "BillingPlans|Includes free static websites"
+msgstr ""
+
+msgid "BillingPlans|Learn more"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}"
+msgstr ""
+
+msgid "BillingPlans|Loved and trusted by our customers"
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Not the group you're looking for? %{all_groups_link}."
+msgstr ""
+
+msgid "BillingPlans|Open Source - MIT License"
+msgstr ""
+
+msgid "BillingPlans|Organization wide security, compliance and planning"
+msgstr ""
+
+msgid "BillingPlans|Portfolio management"
+msgstr ""
+
+msgid "BillingPlans|Premium"
+msgstr ""
+
+msgid "BillingPlans|Pricing page"
+msgstr ""
+
+msgid "BillingPlans|Ready to explore the value of the paid features today? Start a trial, no credit card required."
+msgstr ""
+
+msgid "BillingPlans|Recommended"
+msgstr ""
+
+msgid "BillingPlans|Release controls"
+msgstr ""
+
+msgid "BillingPlans|Security risk mitigation"
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|Self-managed reliability"
+msgstr ""
+
+msgid "BillingPlans|Spans the DevOps lifecycle"
+msgstr ""
+
+msgid "BillingPlans|Start a free Ultimate trial"
+msgstr ""
+
+msgid "BillingPlans|Still have questions?"
+msgstr ""
+
+msgid "BillingPlans|Support"
+msgstr ""
+
+msgid "BillingPlans|Talk to an expert today."
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Ultimate"
+msgstr ""
+
+msgid "BillingPlans|Upgrade to Premium"
+msgstr ""
+
+msgid "BillingPlans|Upgrade to Ultimate"
+msgstr ""
+
+msgid "BillingPlans|Value stream management"
+msgstr ""
+
+msgid "BillingPlans|We're here to help."
+msgstr ""
+
+msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
+msgstr ""
+
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
+msgstr ""
+
+msgid "BillingPlans|Your current plan"
+msgstr ""
+
+msgid "BillingPlans|billed annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|for the remainder of your subscription"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|group"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "BillingPlans|per user/month"
+msgstr ""
+
+msgid "BillingPlan|Upgrade"
+msgstr ""
+
+msgid "BillingPlan|Upgrade for free"
+msgstr ""
+
+msgid "Billings|%{planName} plan"
+msgstr ""
+
+msgid "Billings|An error occurred while extending your trial."
+msgstr ""
+
+msgid "Billings|An error occurred while reactivating your trial."
+msgstr ""
+
+msgid "Billings|By extending your trial, you will receive an additional 30 days of %{planName}. Your trial can be only extended once."
+msgstr ""
+
+msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
+msgstr ""
+
+msgid "Billings|Error validating card details"
+msgstr ""
+
+msgid "Billings|Extend trial"
+msgstr ""
+
+msgid "Billings|Free groups are limited to %{number} seats."
+msgstr ""
+
+msgid "Billings|In a seat"
+msgstr ""
+
+msgid "Billings|Reactivate trial"
+msgstr ""
+
+msgid "Billings|Seats in use / Seats available"
+msgstr ""
+
+msgid "Billings|Seats in use / Seats in subscription"
+msgstr ""
+
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
+msgid "Billings|The last owner cannot be removed from a seat."
+msgstr ""
+
+msgid "Billings|To make this member active, you must first remove an existing active member, or toggle them to over limit."
+msgstr ""
+
+msgid "Billings|To use free CI/CD minutes on shared runners, you’ll need to validate your account with a credit 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 your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "Billings|To use free CI/CD minutes on shared runners, you’ll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
+msgstr ""
+
+msgid "Billings|User validation required"
+msgstr ""
+
+msgid "Billings|Validate account"
+msgstr ""
+
+msgid "Billings|Validate user account"
+msgstr ""
+
+msgid "Billings|You can't change the seat status of a user who was invited via a group or project."
+msgstr ""
+
+msgid "Billings|You can't remove yourself from a seat, but you can leave the group."
+msgstr ""
+
+msgid "Billings|You'll now be able to take advantage of free CI/CD minutes on shared runners."
+msgstr ""
+
+msgid "Billings|Your account has been validated"
+msgstr ""
+
+msgid "Billing|%{user} was successfully approved"
+msgstr ""
+
+msgid "Billing|Add seats"
+msgstr ""
+
+msgid "Billing|An email address is only visible for users with public emails."
+msgstr ""
+
+msgid "Billing|An error occurred while approving %{user}"
+msgstr ""
+
+msgid "Billing|An error occurred while getting a billable member details."
+msgstr ""
+
+msgid "Billing|An error occurred while loading GitLab subscription details."
+msgstr ""
+
+msgid "Billing|An error occurred while loading billable members list."
+msgstr ""
+
+msgid "Billing|An error occurred while loading pending members list"
+msgstr ""
+
+msgid "Billing|An error occurred while removing a billable member."
+msgstr ""
+
+msgid "Billing|Awaiting member signup"
+msgstr ""
+
+msgid "Billing|Cannot remove user"
+msgstr ""
+
+msgid "Billing|Direct memberships"
+msgstr ""
+
+msgid "Billing|Enter at least three characters to search."
+msgstr ""
+
+msgid "Billing|Explore all plans"
+msgstr ""
+
+msgid "Billing|Export list"
+msgstr ""
+
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+msgstr ""
+
+msgid "Billing|From June 22, 2022 (GitLab 15.1), free groups will be limited to 5 members"
+msgstr ""
+
+msgid "Billing|Group invite"
+msgstr ""
+
+msgid "Billing|If the group has over %{maxNamespaceSeats} members, only those occupying a seat can access the namespace. To ensure all members (active and %{linkStart}over limit%{linkEnd}) can access the namespace, you can start a trial or upgrade to a paid tier."
+msgstr ""
+
+msgid "Billing|Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member."
+msgstr ""
+
+msgid "Billing|No users to display."
+msgstr ""
+
+msgid "Billing|Private"
+msgstr ""
+
+msgid "Billing|Project invite"
+msgstr ""
+
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Toggle seat details"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
+msgid "Billing|User was successfully removed"
+msgstr ""
+
+msgid "Billing|View pending approvals"
+msgstr ""
+
+msgid "Billing|You are about to remove user %{username} from your subscription. If you continue, the user will be removed from the %{namespace} group and all its subgroups and projects. This action can't be undone."
+msgstr ""
+
+msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
+msgstr ""
+
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
+msgid "Bitbucket Server Import"
+msgstr ""
+
+msgid "Bitbucket Server import"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blame"
+msgstr ""
+
+msgid "BlobViewer|View on %{environmentName}"
+msgstr ""
+
+msgid "Block user"
+msgstr ""
+
+msgid "Blocked"
+msgstr ""
+
+msgid "Blocked by %d issue"
+msgid_plural "Blocked by %d issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Blocked issue"
+msgstr ""
+
+msgid "Blocking"
+msgstr ""
+
+msgid "Blocking issues"
+msgstr ""
+
+msgid "Blocks"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
+msgid "Board scope affects which epics are displayed for anyone who visits this board"
+msgstr ""
+
+msgid "Board scope affects which issues are displayed for anyone who visits this board"
+msgstr ""
+
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
+msgid "BoardNewIssue|No matching results"
+msgstr ""
+
+msgid "BoardNewIssue|Projects"
+msgstr ""
+
+msgid "BoardNewIssue|Search projects"
+msgstr ""
+
+msgid "BoardNewIssue|Select a project"
+msgstr ""
+
+msgid "BoardScope|%{iterationTitle} iteration in %{iterationCadence}"
+msgstr ""
+
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
+msgid "BoardScope|An error occurred while getting milestones, please try again."
+msgstr ""
+
+msgid "BoardScope|An error occurred while searching for labels, please try again."
+msgstr ""
+
+msgid "BoardScope|An error occurred while searching for users, please try again."
+msgstr ""
+
+msgid "BoardScope|Any Milestone"
+msgstr ""
+
+msgid "BoardScope|Any assignee"
+msgstr ""
+
+msgid "BoardScope|Any iteration"
+msgstr ""
+
+msgid "BoardScope|Any label"
+msgstr ""
+
+msgid "BoardScope|Assignee"
+msgstr ""
+
+msgid "BoardScope|Choose labels"
+msgstr ""
+
+msgid "BoardScope|Current iteration"
+msgstr ""
+
+msgid "BoardScope|Don't filter milestone"
+msgstr ""
+
+msgid "BoardScope|Edit"
+msgstr ""
+
+msgid "BoardScope|Iteration"
+msgstr ""
+
+msgid "BoardScope|Labels"
+msgstr ""
+
+msgid "BoardScope|Milestone"
+msgstr ""
+
+msgid "BoardScope|No iteration"
+msgstr ""
+
+msgid "BoardScope|No milestone"
+msgstr ""
+
+msgid "BoardScope|Search iterations"
+msgstr ""
+
+msgid "BoardScope|Search milestones"
+msgstr ""
+
+msgid "BoardScope|Select assignee"
+msgstr ""
+
+msgid "BoardScope|Select iteration"
+msgstr ""
+
+msgid "BoardScope|Select labels"
+msgstr ""
+
+msgid "BoardScope|Select milestone"
+msgstr ""
+
+msgid "BoardScope|Select weight"
+msgstr ""
+
+msgid "BoardScope|Started"
+msgstr ""
+
+msgid "BoardScope|Upcoming"
+msgstr ""
+
+msgid "BoardScope|Weight"
+msgstr ""
+
+msgid "Boards"
+msgstr ""
+
+msgid "Boards and board lists"
+msgstr ""
+
+msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
+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 ""
+
+msgid "Boards|An error occurred while creating the list. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+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 ""
+
+msgid "Boards|An error occurred while fetching the board epics. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board issues. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board lists. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while generating lists. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while moving the epic. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while moving the issue. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while removing the list. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while updating the board list. Please try again."
+msgstr ""
+
+msgid "Boards|Blocked by %{blockedByCount} %{issuableType}"
+msgid_plural "Boards|Blocked by %{blockedByCount} %{issuableType}s"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Boards|Collapse"
+msgstr ""
+
+msgid "Boards|Edit board"
+msgstr ""
+
+msgid "Boards|Expand"
+msgstr ""
+
+msgid "Boards|Failed to fetch blocking %{issuableType}s"
+msgstr ""
+
+msgid "Boards|New board"
+msgstr ""
+
+msgid "Boards|New epic"
+msgstr ""
+
+msgid "Boards|Retrieving blocking %{issuableType}s"
+msgstr ""
+
+msgid "Boards|View all blocking %{issuableType}s"
+msgstr ""
+
+msgid "Boards|View scope"
+msgstr ""
+
+msgid "Board|An error occurred while fetching the board, please try again."
+msgstr ""
+
+msgid "Board|Are you sure you want to delete this board?"
+msgstr ""
+
+msgid "Board|Board scope"
+msgstr ""
+
+msgid "Board|Create board"
+msgstr ""
+
+msgid "Board|Create new board"
+msgstr ""
+
+msgid "Board|Delete board"
+msgstr ""
+
+msgid "Board|Edit board"
+msgstr ""
+
+msgid "Board|Enter board name"
+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 ""
+
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
+msgid "Both project and dashboard_path are required"
+msgstr ""
+
+msgid "Branch"
+msgstr ""
+
+msgid "Branch %{branchName} was not found in this project's repository."
+msgstr ""
+
+msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
+msgstr ""
+
+msgid "Branch already exists"
+msgstr ""
+
+msgid "Branch changed"
+msgstr ""
+
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
+msgid "Branch is already taken"
+msgstr ""
+
+msgid "Branch name"
+msgstr ""
+
+msgid "Branch not loaded - %{branchId}"
+msgstr ""
+
+msgid "Branch rules"
+msgstr ""
+
+msgid "Branches"
+msgstr ""
+
+msgid "Branches|Active"
+msgstr ""
+
+msgid "Branches|Active branches"
+msgstr ""
+
+msgid "Branches|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this branch."
+msgstr ""
+
+msgid "Branches|All"
+msgstr ""
+
+msgid "Branches|Cancel, keep branch"
+msgstr ""
+
+msgid "Branches|Can’t find HEAD commit for this branch"
+msgstr ""
+
+msgid "Branches|Compare"
+msgstr ""
+
+msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
+msgstr ""
+
+msgid "Branches|Delete branch"
+msgstr ""
+
+msgid "Branches|Delete branch. Are you ABSOLUTELY SURE?"
+msgstr ""
+
+msgid "Branches|Delete merged branches"
+msgstr ""
+
+msgid "Branches|Delete protected branch"
+msgstr ""
+
+msgid "Branches|Delete protected branch. Are you ABSOLUTELY SURE?"
+msgstr ""
+
+msgid "Branches|Deleting the %{strongStart}%{branchName}%{strongEnd} branch cannot be undone. Are you sure?"
+msgstr ""
+
+msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?"
+msgstr ""
+
+msgid "Branches|Filter by branch name"
+msgstr ""
+
+msgid "Branches|Merged into %{default_branch}"
+msgstr ""
+
+msgid "Branches|New branch"
+msgstr ""
+
+msgid "Branches|No branches to show"
+msgstr ""
+
+msgid "Branches|Only a project maintainer or owner can delete a protected branch"
+msgstr ""
+
+msgid "Branches|Overview"
+msgstr ""
+
+msgid "Branches|Please type the following to confirm:"
+msgstr ""
+
+msgid "Branches|Show active branches"
+msgstr ""
+
+msgid "Branches|Show all branches"
+msgstr ""
+
+msgid "Branches|Show more active branches"
+msgstr ""
+
+msgid "Branches|Show more stale branches"
+msgstr ""
+
+msgid "Branches|Show overview of the branches"
+msgstr ""
+
+msgid "Branches|Show stale branches"
+msgstr ""
+
+msgid "Branches|Stale"
+msgstr ""
+
+msgid "Branches|Stale branches"
+msgstr ""
+
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
+msgid "Branches|The default branch cannot be deleted"
+msgstr ""
+
+msgid "Branches|This branch hasn't been merged into %{defaultBranchName}. To avoid data loss, consider merging this branch before deleting it."
+msgstr ""
+
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
+msgid "Branches|Unable to load branches"
+msgstr ""
+
+msgid "Branches|Yes, delete branch"
+msgstr ""
+
+msgid "Branches|Yes, delete protected branch"
+msgstr ""
+
+msgid "Branches|You're about to permanently delete the branch %{branchName}."
+msgstr ""
+
+msgid "Branches|You're about to permanently delete the protected branch %{branchName}."
+msgstr ""
+
+msgid "Branches|diverged from upstream"
+msgstr ""
+
+msgid "Branches|merged"
+msgstr ""
+
+msgid "Branches|protected"
+msgstr ""
+
+msgid "Breadcrumbs"
+msgstr ""
+
+msgid "Broadcast Message was successfully created."
+msgstr ""
+
+msgid "Broadcast Message was successfully updated."
+msgstr ""
+
+msgid "Broadcast Messages"
+msgstr ""
+
+msgid "Browse Directory"
+msgstr ""
+
+msgid "Browse File"
+msgstr ""
+
+msgid "Browse Files"
+msgstr ""
+
+msgid "Browse artifacts"
+msgstr ""
+
+msgid "Browse files"
+msgstr ""
+
+msgid "Browse templates"
+msgstr ""
+
+msgid "BuildArtifacts|An error occurred while fetching the artifacts"
+msgstr ""
+
+msgid "BuildArtifacts|Loading artifacts"
+msgstr ""
+
+msgid "Built-in"
+msgstr ""
+
+msgid "Bulk request concurrency"
+msgstr ""
+
+msgid "Bulk update"
+msgstr ""
+
+msgid "BulkImport| %{host} is running outdated GitLab version (v%{version})"
+msgstr ""
+
+msgid "BulkImport|%{feature} (require v%{version})"
+msgstr ""
+
+msgid "BulkImport|Destination"
+msgstr ""
+
+msgid "BulkImport|Destination group"
+msgstr ""
+
+msgid "BulkImport|Existing groups"
+msgstr ""
+
+msgid "BulkImport|Filter by source group"
+msgstr ""
+
+msgid "BulkImport|Following data will not be migrated: %{bullets} Contact system administrator of %{host} to upgrade GitLab if you need this data in your migration"
+msgstr ""
+
+msgid "BulkImport|From source group"
+msgstr ""
+
+msgid "BulkImport|Group import history"
+msgstr ""
+
+msgid "BulkImport|History"
+msgstr ""
+
+msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
+msgstr ""
+
+msgid "BulkImport|Import groups from GitLab"
+msgstr ""
+
+msgid "BulkImport|Import is finished. Pick another name for re-import"
+msgstr ""
+
+msgid "BulkImport|Import selected"
+msgstr ""
+
+msgid "BulkImport|Importing the group failed."
+msgstr ""
+
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|Name already used as a target for another group."
+msgstr ""
+
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
+msgid "BulkImport|No groups found"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Only groups that you have the %{role} role for are listed as groups you can import."
+msgstr ""
+
+msgid "BulkImport|Project import history"
+msgstr ""
+
+msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own from %{link}"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own matching filter \"%{filter}\" from %{link}"
+msgstr ""
+
+msgid "BulkImport|Source"
+msgstr ""
+
+msgid "BulkImport|Source group"
+msgstr ""
+
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
+msgid "BulkImport|To new group"
+msgstr ""
+
+msgid "BulkImport|Update of import statuses with realtime changes failed"
+msgstr ""
+
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
+msgid "BulkImport|expected an associated Group but has an associated Project"
+msgstr ""
+
+msgid "BulkImport|expected an associated Project but has an associated Group"
+msgstr ""
+
+msgid "BulkImport|must be a group"
+msgstr ""
+
+msgid "Bullet list"
+msgstr ""
+
+msgid "Burndown chart"
+msgstr ""
+
+msgid "BurndownChartLabel|Remaining"
+msgstr ""
+
+msgid "Burnup chart"
+msgstr ""
+
+msgid "Burnup chart could not be generated due to too many events"
+msgstr ""
+
+msgid "Business"
+msgstr ""
+
+msgid "Business metrics (Custom)"
+msgstr ""
+
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
+msgid "Buy Storage"
+msgstr ""
+
+msgid "Buy more Pipeline minutes"
+msgstr ""
+
+msgid "By %{user_name}"
+msgstr ""
+
+msgid "By authenticating with an account tied to an Enterprise e-mail address, it is understood that this account is an Enterprise User. "
+msgstr ""
+
+msgid "By default, all projects and groups will use the global notifications setting."
+msgstr ""
+
+msgid "By month"
+msgstr ""
+
+msgid "By quarter"
+msgstr ""
+
+msgid "By week"
+msgstr ""
+
+msgid "ByAuthor|by"
+msgstr ""
+
+msgid "CHANGELOG"
+msgstr ""
+
+msgid "CI Lint"
+msgstr ""
+
+msgid "CI configuration validated, including all configuration added with the %{codeStart}include%{codeEnd} keyword. %{link}"
+msgstr ""
+
+msgid "CI settings"
+msgstr ""
+
+msgid "CI variables"
+msgstr ""
+
+msgid "CI/CD"
+msgstr ""
+
+msgid "CI/CD Analytics"
+msgstr ""
+
+msgid "CI/CD Settings"
+msgstr ""
+
+msgid "CI/CD configuration"
+msgstr ""
+
+msgid "CI/CD configuration file"
+msgstr ""
+
+msgid "CI/CD limits"
+msgstr ""
+
+msgid "CI/CD minutes"
+msgstr ""
+
+msgid "CI/CD|No projects have been added to the scope"
+msgstr ""
+
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
+msgid "CICDAnalytics|Deployment frequency"
+msgstr ""
+
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Release statistics"
+msgstr ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Shared Runners Usage"
+msgstr ""
+
+msgid "CICDAnalytics|Shared runner duration is the total runtime of all jobs that ran on shared runners"
+msgstr ""
+
+msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
+msgstr ""
+
+msgid "CICDAnalytics|Shared runner usage"
+msgstr ""
+
+msgid "CICDAnalytics|Shared runner usage is the total runtime of all jobs that ran on shared runners"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+msgstr ""
+
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
+msgid "CICDAnalytics|What is shared runner duration?"
+msgstr ""
+
+msgid "CICDAnalytics|What is shared runner usage?"
+msgstr ""
+
+msgid "CICD|Add a %{base_domain_link_start}base domain%{link_end} to your %{kubernetes_cluster_link_start}Kubernetes cluster%{link_end} for your deployment strategy to work."
+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 ""
+
+msgid "CICD|Automatic deployment to staging, manual deployment to production"
+msgstr ""
+
+msgid "CICD|Continuous deployment to production"
+msgstr ""
+
+msgid "CICD|Continuous deployment to production using timed incremental rollout"
+msgstr ""
+
+msgid "CICD|Default to Auto DevOps pipeline"
+msgstr ""
+
+msgid "CICD|Default to Auto DevOps pipeline for all projects"
+msgstr ""
+
+msgid "CICD|Deployment strategy"
+msgstr ""
+
+msgid "CICD|Jobs"
+msgstr ""
+
+msgid "CICD|Limit"
+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. %{link_start}What is Auto DevOps?%{link_end}"
+msgstr ""
+
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
+
+msgid "CICD|There are several CI/CD limits in place."
+msgstr ""
+
+msgid "CICD|Unprotected branches will not have access to the cache from protected branches."
+msgstr ""
+
+msgid "CICD|Use separate caches for protected branches"
+msgstr ""
+
+msgid "CICD|group enabled"
+msgstr ""
+
+msgid "CICD|instance enabled"
+msgstr ""
+
+msgid "CLOSED"
+msgstr ""
+
+msgid "CLOSED (MOVED)"
+msgstr ""
+
+msgid "CODEOWNERS rule violation"
+msgstr ""
+
+msgid "CONTRIBUTING"
+msgstr ""
+
+msgid "CPU"
+msgstr ""
+
+msgid "CSV is being generated and will be emailed to you upon completion."
+msgstr ""
+
+msgid "CVE|As a maintainer, requesting a CVE for a vulnerability in your project will help your users stay secure and informed."
+msgstr ""
+
+msgid "CVE|CVE ID Request"
+msgstr ""
+
+msgid "CVE|Common Vulnerability Enumeration (CVE) identifiers are used to track distinct vulnerabilities in specific versions of code."
+msgstr ""
+
+msgid "CVE|Create CVE ID Request"
+msgstr ""
+
+msgid "CVE|Enable CVE ID requests in the issue sidebar"
+msgstr ""
+
+msgid "CVE|Request CVE ID"
+msgstr ""
+
+msgid "CVE|Why Request a CVE ID?"
+msgstr ""
+
+msgid "Cadence is not automated"
+msgstr ""
+
+msgid "Calculate the number of slices during reindexing. The multiplier is applied to the number of shards per index. Learn more about %{slice_multiplier_link_start}slice multiplier configuration%{slice_multiplier_link_end}."
+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 ""
+
+msgid "Can be overridden in each project."
+msgstr ""
+
+msgid "Can create groups:"
+msgstr ""
+
+msgid "Can not delete primary training"
+msgstr ""
+
+msgid "Can't apply as the source branch was deleted."
+msgstr ""
+
+msgid "Can't apply as these lines were changed in a more recent version."
+msgstr ""
+
+msgid "Can't apply as this line was changed in a more recent version."
+msgstr ""
+
+msgid "Can't apply this suggestion."
+msgstr ""
+
+msgid "Can't be empty"
+msgstr ""
+
+msgid "Can't create snippet: %{err}"
+msgstr ""
+
+msgid "Can't fetch content for the blob: %{err}"
+msgstr ""
+
+msgid "Can't find HEAD commit for this branch"
+msgstr ""
+
+msgid "Can't find variable: ZiteReader"
+msgstr ""
+
+msgid "Can't load mermaid module: %{err}"
+msgstr ""
+
+msgid "Can't scan the code?"
+msgstr ""
+
+msgid "Can't update snippet: %{err}"
+msgstr ""
+
+msgid "Canary"
+msgstr ""
+
+msgid "Canary Ingress does not exist in the environment."
+msgstr ""
+
+msgid "Canary weight must be specified and valid range (0..100)."
+msgstr ""
+
+msgid "CanaryIngress|%{boldStart}Canary:%{boldEnd} %{canary}"
+msgstr ""
+
+msgid "CanaryIngress|%{boldStart}Stable:%{boldEnd} %{stable}"
+msgstr ""
+
+msgid "CanaryIngress|Canary"
+msgstr ""
+
+msgid "CanaryIngress|Change ratio"
+msgstr ""
+
+msgid "CanaryIngress|Change the ratio of canary deployments?"
+msgstr ""
+
+msgid "CanaryIngress|Doing so will set a deployment change in progress. This temporarily blocks any further configuration until the deployment is finished."
+msgstr ""
+
+msgid "CanaryIngress|Stable"
+msgstr ""
+
+msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{environment} compared to the stable deployment to:"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Cancel and close"
+msgstr ""
+
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
+msgid "Cancel index deletion"
+msgstr ""
+
+msgid "Cancel running"
+msgstr ""
+
+msgid "Cancel this job"
+msgstr ""
+
+msgid "Cancel your account"
+msgstr ""
+
+msgid "Cancel, keep project"
+msgstr ""
+
+msgid "Canceled deployment to"
+msgstr ""
+
+msgid "Cancelled"
+msgstr ""
+
+msgid "Cancelling Preview"
+msgstr ""
+
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
+msgid "Cannot assign an issue that does not belong under the same group (or descendant) as the epic."
+msgstr ""
+
+msgid "Cannot be merged automatically"
+msgstr ""
+
+msgid "Cannot create the abuse report. The reported user was invalid. Please try again or contact support."
+msgstr ""
+
+msgid "Cannot create the abuse report. The user has been deleted."
+msgstr ""
+
+msgid "Cannot create the abuse report. This user has been blocked."
+msgstr ""
+
+msgid "Cannot delete %{profile_name} referenced in security policy"
+msgstr ""
+
+msgid "Cannot have multiple Jira imports running at the same time"
+msgstr ""
+
+msgid "Cannot have multiple unresolved alerts"
+msgstr ""
+
+msgid "Cannot import because issues are not available in this project."
+msgstr ""
+
+msgid "Cannot make the epic confidential if it contains non-confidential child epics"
+msgstr ""
+
+msgid "Cannot make the epic confidential if it contains non-confidential issues"
+msgstr ""
+
+msgid "Cannot merge"
+msgstr ""
+
+msgid "Cannot modify %{profile_name} referenced in security policy"
+msgstr ""
+
+msgid "Cannot modify managed Kubernetes cluster"
+msgstr ""
+
+msgid "Cannot modify provider during creation"
+msgstr ""
+
+msgid "Cannot promote issue because it does not belong to a group."
+msgstr ""
+
+msgid "Cannot promote issue due to insufficient permissions."
+msgstr ""
+
+msgid "Cannot refer to a group %{timebox_type} by an internal id!"
+msgstr ""
+
+msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
+msgstr ""
+
+msgid "Cannot skip two factor authentication setup"
+msgstr ""
+
+msgid "Capacity threshold"
+msgstr ""
+
+msgid "Card holder name"
+msgstr ""
+
+msgid "Card number:"
+msgstr ""
+
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
+msgid "CascadingSettings|Enforce for all subgroups"
+msgstr ""
+
+msgid "CascadingSettings|Setting enforced"
+msgstr ""
+
+msgid "CascadingSettings|Subgroups cannot change this setting."
+msgstr ""
+
+msgid "CascadingSettings|This setting has been enforced by an instance admin."
+msgstr ""
+
+msgid "CascadingSettings|This setting has been enforced by an owner of %{link}."
+msgstr ""
+
+msgid "CascadingSettings|cannot be changed because it is locked by an ancestor"
+msgstr ""
+
+msgid "CascadingSettings|cannot be nil when locking the attribute"
+msgstr ""
+
+msgid "Certain user content will be moved to a system-wide \"Ghost User\" in order to maintain content for posterity. For further information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
+msgstr ""
+
+msgid "Certificate"
+msgstr ""
+
+msgid "Certificate (PEM)"
+msgstr ""
+
+msgid "Certificate Issuer"
+msgstr ""
+
+msgid "Certificate Subject"
+msgstr ""
+
+msgid "Change Failure Rate"
+msgstr ""
+
+msgid "Change assignee"
+msgstr ""
+
+msgid "Change assignee(s)"
+msgstr ""
+
+msgid "Change assignee(s)."
+msgstr ""
+
+msgid "Change branches"
+msgstr ""
+
+msgid "Change label"
+msgstr ""
+
+msgid "Change made by"
+msgstr ""
+
+msgid "Change milestone"
+msgstr ""
+
+msgid "Change path"
+msgstr ""
+
+msgid "Change reviewer(s)"
+msgstr ""
+
+msgid "Change reviewer(s)."
+msgstr ""
+
+msgid "Change role"
+msgstr ""
+
+msgid "Change status"
+msgstr ""
+
+msgid "Change subscription"
+msgstr ""
+
+msgid "Change template"
+msgstr ""
+
+msgid "Change title"
+msgstr ""
+
+msgid "Change your password"
+msgstr ""
+
+msgid "Change your password or recover your current one"
+msgstr ""
+
+msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgstr ""
+
+msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgstr ""
+
+msgid "ChangeReviewer|Unassigned"
+msgstr ""
+
+msgid "ChangeTypeAction|Cherry-pick"
+msgstr ""
+
+msgid "ChangeTypeAction|GitLab will create a branch in your fork and start a merge request."
+msgstr ""
+
+msgid "ChangeTypeAction|Pick into branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Pick into project"
+msgstr ""
+
+msgid "ChangeTypeAction|Revert"
+msgstr ""
+
+msgid "ChangeTypeAction|Revert in branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Search branches"
+msgstr ""
+
+msgid "ChangeTypeAction|Search projects"
+msgstr ""
+
+msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
+msgstr ""
+
+msgid "ChangeTypeAction|Switch branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Switch project"
+msgstr ""
+
+msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
+msgstr ""
+
+msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
+msgstr ""
+
+msgid "Changed"
+msgstr ""
+
+msgid "Changed assignee(s)."
+msgstr ""
+
+msgid "Changed merge method to %{merge_method}"
+msgstr ""
+
+msgid "Changed reviewer(s)."
+msgstr ""
+
+msgid "Changed squash option to %{squash_option}"
+msgstr ""
+
+msgid "Changed the title to \"%{title_param}\"."
+msgstr ""
+
+msgid "Changes"
+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 ""
+
+msgid "Changes saved."
+msgstr ""
+
+msgid "Changes suppressed. Click to show."
+msgstr ""
+
+msgid "Changes the title to \"%{title_param}\"."
+msgstr ""
+
+msgid "Changes to the title have not been saved"
+msgstr ""
+
+msgid "Changing any setting here requires an application restart"
+msgstr ""
+
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
+msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
+msgstr ""
+
+msgid "Chat"
+msgstr ""
+
+msgid "ChatMessage|%{project_link}: Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status} in %{duration}"
+msgstr ""
+
+msgid "ChatMessage|Branch"
+msgstr ""
+
+msgid "ChatMessage|Commit"
+msgstr ""
+
+msgid "ChatMessage|Failed job"
+msgstr ""
+
+msgid "ChatMessage|Failed stage"
+msgstr ""
+
+msgid "ChatMessage|Invalid CI config YAML file"
+msgstr ""
+
+msgid "ChatMessage|Pipeline #%{pipeline_id} %{humanized_status} in %{duration}"
+msgstr ""
+
+msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status}"
+msgstr ""
+
+msgid "ChatMessage|Tag"
+msgstr ""
+
+msgid "ChatMessage|and [%{count} more](%{pipeline_failed_jobs_url})"
+msgstr ""
+
+msgid "ChatMessage|has failed"
+msgstr ""
+
+msgid "ChatMessage|has passed"
+msgstr ""
+
+msgid "ChatMessage|has passed with warnings"
+msgstr ""
+
+msgid "ChatMessage|in %{duration}"
+msgstr ""
+
+msgid "ChatMessage|in %{project_link}"
+msgstr ""
+
+msgid "Check again"
+msgstr ""
+
+msgid "Check feature availability on namespace plan"
+msgstr ""
+
+msgid "Check out branch"
+msgstr ""
+
+msgid "Check out, review, and merge locally"
+msgstr ""
+
+msgid "Check the %{code_open}elasticsearch.log%{code_close} file to debug why the migration halted and make any changes before retrying the migration. When you fix the cause of the failure, select %{strong_open}Retry migration%{strong_close}, and the migration is scheduled to retry in the background."
+msgstr ""
+
+msgid "Check the current instance configuration "
+msgstr ""
+
+msgid "Check with your administrator."
+msgstr ""
+
+msgid "Check your Docker images for known vulnerabilities."
+msgstr ""
+
+msgid "Check your Kubernetes cluster images for known vulnerabilities."
+msgstr ""
+
+msgid "Checking %{text} availability…"
+msgstr ""
+
+msgid "Checking approval status"
+msgstr ""
+
+msgid "Checking branch availability..."
+msgstr ""
+
+msgid "Checking group path availability..."
+msgstr ""
+
+msgid "Checking username availability..."
+msgstr ""
+
+msgid "Checkout"
+msgstr ""
+
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
+msgstr ""
+
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgstr ""
+
+msgid "Checkout|$%{selectedPlanPrice} per user per year"
+msgstr ""
+
+msgid "Checkout|%d CI minute pack"
+msgid_plural "Checkout|%d CI minute packs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
+msgstr ""
+
+msgid "Checkout|%{name}'s CI minutes"
+msgstr ""
+
+msgid "Checkout|%{name}'s GitLab subscription"
+msgstr ""
+
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} CI minutes"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
+msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
+msgstr ""
+
+msgid "Checkout|(x%{numberOfUsers})"
+msgstr ""
+
+msgid "Checkout|(x%{quantity})"
+msgstr ""
+
+msgid "Checkout|An unknown error has occurred. Please try again by refreshing this page."
+msgstr ""
+
+msgid "Checkout|Billing address"
+msgstr ""
+
+msgid "Checkout|CI minute pack"
+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|CI minutes"
+msgstr ""
+
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
+msgid "Checkout|Checkout"
+msgstr ""
+
+msgid "Checkout|City"
+msgstr ""
+
+msgid "Checkout|Confirm purchase"
+msgstr ""
+
+msgid "Checkout|Confirming..."
+msgstr ""
+
+msgid "Checkout|Continue to billing"
+msgstr ""
+
+msgid "Checkout|Continue to payment"
+msgstr ""
+
+msgid "Checkout|Country"
+msgstr ""
+
+msgid "Checkout|Create a new group"
+msgstr ""
+
+msgid "Checkout|Credit card form failed to load. Please try again."
+msgstr ""
+
+msgid "Checkout|Credit card form failed to load: %{message}"
+msgstr ""
+
+msgid "Checkout|Edit"
+msgstr ""
+
+msgid "Checkout|Enter a number greater than 0"
+msgstr ""
+
+msgid "Checkout|Exp %{expirationMonth}/%{expirationYear}"
+msgstr ""
+
+msgid "Checkout|Failed to confirm your order! Please try again."
+msgstr ""
+
+msgid "Checkout|Failed to confirm your order: %{message}. Please try again."
+msgstr ""
+
+msgid "Checkout|Failed to load countries. Please try again."
+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 ""
+
+msgid "Checkout|GB"
+msgstr ""
+
+msgid "Checkout|GitLab group"
+msgstr ""
+
+msgid "Checkout|GitLab plan"
+msgstr ""
+
+msgid "Checkout|Group"
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
+msgid "Checkout|Name of company or organization using GitLab"
+msgstr ""
+
+msgid "Checkout|Name: %{errors}"
+msgstr ""
+
+msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
+msgstr ""
+
+msgid "Checkout|Number of users"
+msgstr ""
+
+msgid "Checkout|Payment method"
+msgstr ""
+
+msgid "Checkout|Please select a country"
+msgstr ""
+
+msgid "Checkout|Please select a state"
+msgstr ""
+
+msgid "Checkout|Purchase details"
+msgstr ""
+
+msgid "Checkout|Select"
+msgstr ""
+
+msgid "Checkout|State"
+msgstr ""
+
+msgid "Checkout|Storage packs"
+msgstr ""
+
+msgid "Checkout|Street address"
+msgstr ""
+
+msgid "Checkout|Submitting the credit card form failed with code %{errorCode}: %{errorMessage}"
+msgstr ""
+
+msgid "Checkout|Subscription details"
+msgstr ""
+
+msgid "Checkout|Subtotal"
+msgstr ""
+
+msgid "Checkout|Success: subscription"
+msgstr ""
+
+msgid "Checkout|Tax"
+msgstr ""
+
+msgid "Checkout|Total"
+msgstr ""
+
+msgid "Checkout|Total minutes: %{quantity}"
+msgstr ""
+
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
+msgid "Checkout|Users"
+msgstr ""
+
+msgid "Checkout|You'll create your new group after checkout"
+msgstr ""
+
+msgid "Checkout|Your organization"
+msgstr ""
+
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
+msgid "Checkout|Your subscription will be applied to this group"
+msgstr ""
+
+msgid "Checkout|Zip code"
+msgstr ""
+
+msgid "Checkout|a storage subscription"
+msgstr ""
+
+msgid "Checkout|company or team"
+msgstr ""
+
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
+msgstr ""
+
+msgid "Cherry-pick this commit"
+msgstr ""
+
+msgid "Cherry-pick this merge request"
+msgstr ""
+
+msgid "Child"
+msgstr ""
+
+msgid "Child epic"
+msgstr ""
+
+msgid "Child epic does not exist."
+msgstr ""
+
+msgid "Child epic doesn't exist."
+msgstr ""
+
+msgid "Child issues and epics"
+msgstr ""
+
+msgid "Children"
+msgstr ""
+
+msgid "Chinese language support using"
+msgstr ""
+
+msgid "Choose File..."
+msgstr ""
+
+msgid "Choose a file"
+msgstr ""
+
+msgid "Choose a group"
+msgstr ""
+
+msgid "Choose a template"
+msgstr ""
+
+msgid "Choose a template..."
+msgstr ""
+
+msgid "Choose a type..."
+msgstr ""
+
+msgid "Choose any color."
+msgstr ""
+
+msgid "Choose file…"
+msgstr ""
+
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose visibility level, enable/disable project features and their permissions, disable email notifications, and show default award emoji."
+msgstr ""
+
+msgid "Choose what content you want to see on a group’s overview page."
+msgstr ""
+
+msgid "Choose which Git strategy to use when fetching the project."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
+msgid "Choose your framework"
+msgstr ""
+
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
+msgid "CiStatusLabel|canceled"
+msgstr ""
+
+msgid "CiStatusLabel|created"
+msgstr ""
+
+msgid "CiStatusLabel|delayed"
+msgstr ""
+
+msgid "CiStatusLabel|failed"
+msgstr ""
+
+msgid "CiStatusLabel|manual action"
+msgstr ""
+
+msgid "CiStatusLabel|passed"
+msgstr ""
+
+msgid "CiStatusLabel|passed with warnings"
+msgstr ""
+
+msgid "CiStatusLabel|pending"
+msgstr ""
+
+msgid "CiStatusLabel|preparing"
+msgstr ""
+
+msgid "CiStatusLabel|skipped"
+msgstr ""
+
+msgid "CiStatusLabel|waiting for delayed job"
+msgstr ""
+
+msgid "CiStatusLabel|waiting for manual action"
+msgstr ""
+
+msgid "CiStatusLabel|waiting for resource"
+msgstr ""
+
+msgid "CiStatusText|blocked"
+msgstr ""
+
+msgid "CiStatusText|canceled"
+msgstr ""
+
+msgid "CiStatusText|created"
+msgstr ""
+
+msgid "CiStatusText|delayed"
+msgstr ""
+
+msgid "CiStatusText|failed"
+msgstr ""
+
+msgid "CiStatusText|manual"
+msgstr ""
+
+msgid "CiStatusText|passed"
+msgstr ""
+
+msgid "CiStatusText|pending"
+msgstr ""
+
+msgid "CiStatusText|preparing"
+msgstr ""
+
+msgid "CiStatusText|skipped"
+msgstr ""
+
+msgid "CiStatusText|waiting"
+msgstr ""
+
+msgid "CiStatus|running"
+msgstr ""
+
+msgid "CiVariables|Cannot use Masked Variable with current value"
+msgstr ""
+
+msgid "CiVariables|Environments"
+msgstr ""
+
+msgid "CiVariables|Input variable key"
+msgstr ""
+
+msgid "CiVariables|Input variable value"
+msgstr ""
+
+msgid "CiVariables|Key"
+msgstr ""
+
+msgid "CiVariables|Masked"
+msgstr ""
+
+msgid "CiVariables|Protected"
+msgstr ""
+
+msgid "CiVariables|Remove variable"
+msgstr ""
+
+msgid "CiVariables|Remove variable row"
+msgstr ""
+
+msgid "CiVariables|Scope"
+msgstr ""
+
+msgid "CiVariables|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used as default"
+msgstr ""
+
+msgid "CiVariables|State"
+msgstr ""
+
+msgid "CiVariables|Type"
+msgstr ""
+
+msgid "CiVariables|Value"
+msgstr ""
+
+msgid "CiVariables|Variables"
+msgstr ""
+
+msgid "CiVariable|* (All environments)"
+msgstr ""
+
+msgid "CiVariable|All environments"
+msgstr ""
+
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
+msgid "CiVariable|New environment"
+msgstr ""
+
+msgid "CiVariable|Search environments"
+msgstr ""
+
+msgid "Classification Label (optional)"
+msgstr ""
+
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
+msgid "Clean up after running %{link_start}git filter-repo%{link_end} on the repository."
+msgstr ""
+
+msgid "Cleanup policies are executed by background workers. This setting defines the maximum number of workers that can run concurrently. Set it to 0 to remove all workers and not execute the cleanup policies."
+msgstr ""
+
+msgid "Cleanup policy maximum number of tags to be deleted"
+msgstr ""
+
+msgid "Cleanup policy maximum processing time (seconds)"
+msgstr ""
+
+msgid "Cleanup policy maximum workers running concurrently"
+msgstr ""
+
+msgid "Clear"
+msgstr ""
+
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Clear all repository checks"
+msgstr ""
+
+msgid "Clear chart filters"
+msgstr ""
+
+msgid "Clear due date"
+msgstr ""
+
+msgid "Clear health status"
+msgstr ""
+
+msgid "Clear recent searches"
+msgstr ""
+
+msgid "Clear repository checks"
+msgstr ""
+
+msgid "Clear search"
+msgstr ""
+
+msgid "Clear search input"
+msgstr ""
+
+msgid "Clear start date"
+msgstr ""
+
+msgid "Clear templates search input"
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
+msgid "Clear weight"
+msgstr ""
+
+msgid "Cleared health status."
+msgstr ""
+
+msgid "Cleared weight."
+msgstr ""
+
+msgid "Clears health status."
+msgstr ""
+
+msgid "Clears weight."
+msgstr ""
+
+msgid "Click %{link_start}here%{link_end} to view the request."
+msgstr ""
+
+msgid "Click %{link_to} to view the request."
+msgstr ""
+
+msgid "Click the link below to confirm your email address (%{email})"
+msgstr ""
+
+msgid "Click the link below to confirm your email address."
+msgstr ""
+
+msgid "Click to expand it."
+msgstr ""
+
+msgid "Click to expand text"
+msgstr ""
+
+msgid "Click to hide"
+msgstr ""
+
+msgid "Click to reveal"
+msgstr ""
+
+msgid "Client request timeout"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
+msgid "Clientside DSN"
+msgstr ""
+
+msgid "Clone"
+msgstr ""
+
+msgid "Clone repository"
+msgstr ""
+
+msgid "Clone this issue"
+msgstr ""
+
+msgid "Clone with %{http_label}"
+msgstr ""
+
+msgid "Clone with %{protocol}"
+msgstr ""
+
+msgid "Clone with KRB5"
+msgstr ""
+
+msgid "Clone with SSH"
+msgstr ""
+
+msgid "CloneIssue|Cannot clone issue due to insufficient permissions!"
+msgstr ""
+
+msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
+msgstr ""
+
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
+msgid "Cloned this issue to %{path_to_project}."
+msgstr ""
+
+msgid "Clones this issue, without comments, to %{project}."
+msgstr ""
+
+msgid "Close"
+msgstr ""
+
+msgid "Close %{issueType}"
+msgstr ""
+
+msgid "Close %{noteable}"
+msgstr ""
+
+msgid "Close %{tabname}"
+msgstr ""
+
+msgid "Close design"
+msgstr ""
+
+msgid "Close epic"
+msgstr ""
+
+msgid "Close milestone"
+msgstr ""
+
+msgid "Close sidebar"
+msgstr ""
+
+msgid "Close this %{quick_action_target}"
+msgstr ""
+
+msgid "Closed"
+msgstr ""
+
+msgid "Closed %{epicTimeagoDate}"
+msgstr ""
+
+msgid "Closed MRs"
+msgstr ""
+
+msgid "Closed date"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
+msgid "Closed this %{quick_action_target}."
+msgstr ""
+
+msgid "Closed: %{closed}"
+msgstr ""
+
+msgid "Closes this %{quick_action_target}."
+msgstr ""
+
+msgid "Cloud Run"
+msgstr ""
+
+msgid "Cloud Storage"
+msgstr ""
+
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
+msgid "Cluster"
+msgstr ""
+
+msgid "Cluster Health"
+msgstr ""
+
+msgid "Cluster cache cleared."
+msgstr ""
+
+msgid "Cluster is required for Stages::ClusterEndpointInserter"
+msgstr ""
+
+msgid "Cluster level"
+msgstr ""
+
+msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
+msgstr ""
+
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
+msgid "ClusterAgents|%{name} successfully deleted"
+msgstr ""
+
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
+msgid "ClusterAgents|%{number} of %{total} agents"
+msgstr ""
+
+msgid "ClusterAgents|%{number} of %{total} clusters connected through cluster certificates"
+msgstr ""
+
+msgid "ClusterAgents|%{titleIcon}Connected"
+msgstr ""
+
+msgid "ClusterAgents|%{titleIcon}Not connected"
+msgstr ""
+
+msgid "ClusterAgents|%{tokenName} created"
+msgstr ""
+
+msgid "ClusterAgents|%{tokenName} revoked"
+msgstr ""
+
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
+msgstr ""
+
+msgid "ClusterAgents|Advanced installation methods"
+msgstr ""
+
+msgid "ClusterAgents|Agent"
+msgstr ""
+
+msgid "ClusterAgents|Agent %{strongStart}connected%{strongEnd}"
+msgstr ""
+
+msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
+msgstr ""
+
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent version mismatch"
+msgstr ""
+
+msgid "ClusterAgents|Agent version mismatch and update"
+msgstr ""
+
+msgid "ClusterAgents|Agent version update required"
+msgstr ""
+
+msgid "ClusterAgents|All"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while loading your agents"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while retrieving agent activity. Reload the page to try again."
+msgstr ""
+
+msgid "ClusterAgents|An unknown error occurred. Please try again."
+msgstr ""
+
+msgid "ClusterAgents|Are you sure you want to delete this agent? You cannot undo this."
+msgstr ""
+
+msgid "ClusterAgents|Are you sure you want to revoke this token? You cannot undo this action."
+msgstr ""
+
+msgid "ClusterAgents|Certificate"
+msgstr ""
+
+msgid "ClusterAgents|Configuration"
+msgstr ""
+
+msgid "ClusterAgents|Connect a Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (agent)"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
+msgid "ClusterAgents|Copy token"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
+msgstr ""
+
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
+msgid "ClusterAgents|Delete"
+msgstr ""
+
+msgid "ClusterAgents|Delete agent"
+msgstr ""
+
+msgid "ClusterAgents|Deprecated"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
+msgid "ClusterAgents|Event occurred"
+msgstr ""
+
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
+msgid "ClusterAgents|Failed to register an agent"
+msgstr ""
+
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included in the command."
+msgstr ""
+
+msgid "ClusterAgents|GitLab agent"
+msgstr ""
+
+msgid "ClusterAgents|GitLab agent for Kubernetes"
+msgstr ""
+
+msgid "ClusterAgents|Give feedback"
+msgstr ""
+
+msgid "ClusterAgents|How do I register an agent?"
+msgstr ""
+
+msgid "ClusterAgents|How to update an agent?"
+msgstr ""
+
+msgid "ClusterAgents|Install using Helm (recommended)"
+msgstr ""
+
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
+msgstr ""
+
+msgid "ClusterAgents|Learn how to troubleshoot"
+msgstr ""
+
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
+msgid "ClusterAgents|Name"
+msgstr ""
+
+msgid "ClusterAgents|Never"
+msgstr ""
+
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|No activity occurred in the past day"
+msgid_plural "ClusterAgents|No activity occurred in the past %d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ClusterAgents|No agents"
+msgstr ""
+
+msgid "ClusterAgents|No clusters connected through cluster certificates"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
+msgid "ClusterAgents|Recommended"
+msgstr ""
+
+msgid "ClusterAgents|Register"
+msgstr ""
+
+msgid "ClusterAgents|Registering agent"
+msgstr ""
+
+msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
+msgstr ""
+
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgstr ""
+
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
+msgstr ""
+
+msgid "ClusterAgents|Security"
+msgstr ""
+
+msgid "ClusterAgents|See agent activity updates, like tokens created or revoked and clusters connected or not connected."
+msgstr ""
+
+msgid "ClusterAgents|Select an agent or enter a name to create new"
+msgstr ""
+
+msgid "ClusterAgents|Tell us what you think"
+msgstr ""
+
+msgid "ClusterAgents|The GitLab agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab agent.%{linkEnd}"
+msgstr ""
+
+msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
+msgstr ""
+
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgstr ""
+
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
+msgstr ""
+
+msgid "ClusterAgents|To revoke the token, type %{name} to confirm:"
+msgstr ""
+
+msgid "ClusterAgents|Token created by %{userName}"
+msgstr ""
+
+msgid "ClusterAgents|Token revoked by %{userName}"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|View all %{number} agents"
+msgstr ""
+
+msgid "ClusterAgents|View all %{number} clusters"
+msgstr ""
+
+msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
+msgstr ""
+
+msgid "ClusterAgents|What is agent activity?"
+msgstr ""
+
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
+msgid "ClusterAgents|You cannot see this token again after you close this window."
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
+msgid "ClusterAgents|Your agent version is out of sync with your GitLab version (v%{version}), which might cause compatibility problems. Update the agent installed on your cluster to the most recent version."
+msgstr ""
+
+msgid "ClusterAgents|Your instance doesn't have the %{linkStart}GitLab Agent Server (KAS)%{linkEnd} set up. Ask a GitLab Administrator to install it."
+msgstr ""
+
+msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
+msgstr ""
+
+msgid "ClusterAgent|You have insufficient permissions to create a cluster agent for this project"
+msgstr ""
+
+msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
+msgstr ""
+
+msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
+msgstr ""
+
+msgid "ClusterIntegration|A service token scoped to %{code}kube-system%{end_code} with %{code}cluster-admin%{end_code} privileges."
+msgstr ""
+
+msgid "ClusterIntegration|API URL"
+msgstr ""
+
+msgid "ClusterIntegration|API URL should be a valid http/https url."
+msgstr ""
+
+msgid "ClusterIntegration|Add Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Adding a Kubernetes cluster will automatically share the cluster across all projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Adding an integration to your group will share the cluster across all your projects."
+msgstr ""
+
+msgid "ClusterIntegration|Adding an integration will share the cluster across all projects."
+msgstr ""
+
+msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
+msgstr ""
+
+msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
+msgstr ""
+
+msgid "ClusterIntegration|Amazon EKS"
+msgstr ""
+
+msgid "ClusterIntegration|An unknown error occurred while attempting to connect to Kubernetes."
+msgstr ""
+
+msgid "ClusterIntegration|Any project namespaces"
+msgstr ""
+
+msgid "ClusterIntegration|Apply for credit"
+msgstr ""
+
+msgid "ClusterIntegration|Authentication Error"
+msgstr ""
+
+msgid "ClusterIntegration|Base domain"
+msgstr ""
+
+msgid "ClusterIntegration|CA Certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
+msgstr ""
+
+msgid "ClusterIntegration|Check your CA certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Check your cluster status"
+msgstr ""
+
+msgid "ClusterIntegration|Check your token"
+msgstr ""
+
+msgid "ClusterIntegration|Choose which of your environments will use this cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
+msgid "ClusterIntegration|Clear cluster cache"
+msgstr ""
+
+msgid "ClusterIntegration|Clear the local cache of namespace and service accounts."
+msgstr ""
+
+msgid "ClusterIntegration|Cluster management project"
+msgstr ""
+
+msgid "ClusterIntegration|Cluster name is required."
+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 ""
+
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Connection Error"
+msgstr ""
+
+msgid "ClusterIntegration|Copy API URL"
+msgstr ""
+
+msgid "ClusterIntegration|Copy CA Certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Copy Kubernetes cluster name"
+msgstr ""
+
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
+
+msgid "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."
+msgstr ""
+
+msgid "ClusterIntegration|Did you know?"
+msgstr ""
+
+msgid "ClusterIntegration|Elastic Kubernetes Service"
+msgstr ""
+
+msgid "ClusterIntegration|Enable Prometheus integration"
+msgstr ""
+
+msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
+msgstr ""
+
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|Enter new Service Token"
+msgstr ""
+
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
+msgid "ClusterIntegration|Environment scope"
+msgstr ""
+
+msgid "ClusterIntegration|Environment scope is required."
+msgstr ""
+
+msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
+msgstr ""
+
+msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab Integration"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab failed to authenticate."
+msgstr ""
+
+msgid "ClusterIntegration|GitLab failed to connect to the cluster."
+msgstr ""
+
+msgid "ClusterIntegration|GitLab-managed cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Google GKE"
+msgstr ""
+
+msgid "ClusterIntegration|Google Kubernetes Engine"
+msgstr ""
+
+msgid "ClusterIntegration|Group cluster"
+msgstr ""
+
+msgid "ClusterIntegration|HTTP Error"
+msgstr ""
+
+msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
+msgstr ""
+
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
+msgstr ""
+
+msgid "ClusterIntegration|Instance cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Integration disabled"
+msgstr ""
+
+msgid "ClusterIntegration|Integration enabled"
+msgstr ""
+
+msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes cluster is being created..."
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes cluster name"
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes cluster was successfully created."
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
+msgstr ""
+
+msgid "ClusterIntegration|Make sure your API endpoint is correct"
+msgstr ""
+
+msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}"
+msgstr ""
+
+msgid "ClusterIntegration|Namespace per environment"
+msgstr ""
+
+msgid "ClusterIntegration|Node calculations use the Kubernetes Metrics API. Make sure your cluster has metrics installed"
+msgstr ""
+
+msgid "ClusterIntegration|Project cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr ""
+
+msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
+msgstr ""
+
+msgid "ClusterIntegration|Provider details"
+msgstr ""
+
+msgid "ClusterIntegration|RBAC-enabled cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Remove Kubernetes cluster integration"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration and resources"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration and resources?"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration?"
+msgstr ""
+
+msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Save changes"
+msgstr ""
+
+msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Service Token"
+msgstr ""
+
+msgid "ClusterIntegration|Service token is required."
+msgstr ""
+
+msgid "ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
+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|The Kubernetes certificate used to authenticate to the cluster."
+msgstr ""
+
+msgid "ClusterIntegration|The URL used to access the Kubernetes API."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
+msgstr ""
+
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
+msgstr ""
+
+msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
+msgstr ""
+
+msgid "ClusterIntegration|There was an HTTP error when connecting to your cluster."
+msgstr ""
+
+msgid "ClusterIntegration|This is necessary if your integration has become out of sync. The cache is repopulated during the next CI job that requires namespace and service accounts."
+msgstr ""
+
+msgid "ClusterIntegration|This is necessary to clear existing environment-namespace associations from clusters previously managed by GitLab."
+msgstr ""
+
+msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
+msgstr ""
+
+msgid "ClusterIntegration|This process is %{issue_link_start}deprecated%{issue_link_end}. Use the %{docs_link_start}the GitLab agent for Kubernetes%{docs_link_end} instead."
+msgstr ""
+
+msgid "ClusterIntegration|This will permanently delete the following resources:"
+msgstr ""
+
+msgid "ClusterIntegration|To remove your integration and resources, type %{clusterName} to confirm:"
+msgstr ""
+
+msgid "ClusterIntegration|To remove your integration, type %{clusterName} to confirm:"
+msgstr ""
+
+msgid "ClusterIntegration|Troubleshooting tips:"
+msgstr ""
+
+msgid "ClusterIntegration|Unable to Authenticate"
+msgstr ""
+
+msgid "ClusterIntegration|Unable to Connect"
+msgstr ""
+
+msgid "ClusterIntegration|Unknown Error"
+msgstr ""
+
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
+msgid "ClusterIntegration|Use the %{linkStart}GitLab agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
+msgstr ""
+
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
+
+msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
+msgstr ""
+
+msgid "ClusterIntegration|You are about to remove your cluster integration."
+msgstr ""
+
+msgid "ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct."
+msgstr ""
+
+msgid "ClusterIntegration|sign up"
+msgstr ""
+
+msgid "Clusters|An error occurred while loading clusters"
+msgstr ""
+
+msgid "Code"
+msgstr ""
+
+msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
+msgstr ""
+
+msgid "Code Coverage| Empty code coverage data"
+msgstr ""
+
+msgid "Code Coverage|Couldn't fetch the code coverage data"
+msgstr ""
+
+msgid "Code Owner"
+msgstr ""
+
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code Quality"
+msgstr ""
+
+msgid "Code Review"
+msgstr ""
+
+msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
+msgstr ""
+
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
+msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
+msgid "Code owners"
+msgstr ""
+
+msgid "Code review"
+msgstr ""
+
+msgid "Code snippet"
+msgstr ""
+
+msgid "Code snippet copied. Insert it in the correct location in the YAML file."
+msgstr ""
+
+msgid "CodeIntelligence|This is the definition"
+msgstr ""
+
+msgid "CodeNavigation|No references found"
+msgstr ""
+
+msgid "CodeOwner|Pattern"
+msgstr ""
+
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
+msgid "Cohorts|Inactive users"
+msgstr ""
+
+msgid "Cohorts|Month %{month_index}"
+msgstr ""
+
+msgid "Cohorts|New users"
+msgstr ""
+
+msgid "Cohorts|Registration month"
+msgstr ""
+
+msgid "Cohorts|Returning users"
+msgstr ""
+
+msgid "Cohorts|User cohorts are shown for the last %{months_included} months. Only users with activity are counted in the 'New users' column; inactive users are counted separately."
+msgstr ""
+
+msgid "Collapse"
+msgstr ""
+
+msgid "Collapse all threads"
+msgstr ""
+
+msgid "Collapse approvers"
+msgstr ""
+
+msgid "Collapse issues"
+msgstr ""
+
+msgid "Collapse jobs"
+msgstr ""
+
+msgid "Collapse milestones"
+msgstr ""
+
+msgid "Collapse replies"
+msgstr ""
+
+msgid "Collapse settings section"
+msgstr ""
+
+msgid "Collapse sidebar"
+msgstr ""
+
+msgid "Collapses this file (only for you) until it’s changed again."
+msgstr ""
+
+msgid "Collector hostname"
+msgstr ""
+
+msgid "Color"
+msgstr ""
+
+msgid "ColorWidget|An error occurred while updating color."
+msgstr ""
+
+msgid "ColorWidget|Assign epic color"
+msgstr ""
+
+msgid "ColorWidget|Color"
+msgstr ""
+
+msgid "ColorWidget|Error fetching epic color."
+msgstr ""
+
+msgid "Colorize messages"
+msgstr ""
+
+msgid "ComboSearch is not defined"
+msgstr ""
+
+msgid "Comma-separated list of email addresses."
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Command line instructions"
+msgstr ""
+
+msgid "Commands applied"
+msgstr ""
+
+msgid "Commands did not apply"
+msgstr ""
+
+msgid "Comment"
+msgstr ""
+
+msgid "Comment & resolve thread"
+msgstr ""
+
+msgid "Comment & unresolve thread"
+msgstr ""
+
+msgid "Comment '%{label}' position"
+msgstr ""
+
+msgid "Comment form position"
+msgstr ""
+
+msgid "Comment is being updated"
+msgstr ""
+
+msgid "Comment on lines %{startLine} to %{endLine}"
+msgstr ""
+
+msgid "Comment/Reply (quoting selected text)"
+msgstr ""
+
+msgid "Commenting on files that replace or are replaced by symbolic links is currently not supported."
+msgstr ""
+
+msgid "Commenting on symbolic links that replace or are replaced by files is currently not supported."
+msgstr ""
+
+msgid "Comments"
+msgstr ""
+
+msgid "Commit"
+msgid_plural "Commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Commit %{commit_id}"
+msgstr ""
+
+msgid "Commit (when editing commit message)"
+msgstr ""
+
+msgid "Commit Message"
+msgstr ""
+
+msgid "Commit SHA"
+msgstr ""
+
+msgid "Commit changes"
+msgstr ""
+
+msgid "Commit deleted"
+msgstr ""
+
+msgid "Commit message"
+msgstr ""
+
+msgid "Commit message (optional)"
+msgstr ""
+
+msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
+msgstr ""
+
+msgid "Commit to %{branchName} branch"
+msgstr ""
+
+msgid "CommitBoxTitle|Commit"
+msgstr ""
+
+msgid "CommitMessage|Add %{file_name}"
+msgstr ""
+
+msgid "CommitWidget|authored"
+msgstr ""
+
+msgid "Commits"
+msgstr ""
+
+msgid "Commits feed"
+msgstr ""
+
+msgid "Commits per day hour (UTC)"
+msgstr ""
+
+msgid "Commits per day of month"
+msgstr ""
+
+msgid "Commits per weekday"
+msgstr ""
+
+msgid "Commits to"
+msgstr ""
+
+msgid "Commits you select appear here. Go to the first tab and select commits to add to this merge request."
+msgstr ""
+
+msgid "Commits|An error occurred while fetching merge requests data."
+msgstr ""
+
+msgid "Commits|History"
+msgstr ""
+
+msgid "Commits|No related merge requests found"
+msgstr ""
+
+msgid "Committed by"
+msgstr ""
+
+msgid "Community forum"
+msgstr ""
+
+msgid "Company"
+msgstr ""
+
+msgid "Company Name"
+msgstr ""
+
+msgid "Compare"
+msgstr ""
+
+msgid "Compare %{oldCommitId}...%{newCommitId}"
+msgstr ""
+
+msgid "Compare Git revisions"
+msgstr ""
+
+msgid "Compare GitLab editions"
+msgstr ""
+
+msgid "Compare Revisions"
+msgstr ""
+
+msgid "Compare changes"
+msgstr ""
+
+msgid "Compare changes with the last commit"
+msgstr ""
+
+msgid "Compare changes with the merge request target branch"
+msgstr ""
+
+msgid "Compare submodule commit revisions"
+msgstr ""
+
+msgid "Compare with previous version"
+msgstr ""
+
+msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
+msgstr ""
+
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
+msgstr ""
+
+msgid "CompareRevisions|Compare"
+msgstr ""
+
+msgid "CompareRevisions|Create merge request"
+msgstr ""
+
+msgid "CompareRevisions|Filter by Git revision"
+msgstr ""
+
+msgid "CompareRevisions|Select Git revision"
+msgstr ""
+
+msgid "CompareRevisions|Select branch/tag"
+msgstr ""
+
+msgid "CompareRevisions|Select target project"
+msgstr ""
+
+msgid "CompareRevisions|Swap revisions"
+msgstr ""
+
+msgid "CompareRevisions|Tags"
+msgstr ""
+
+msgid "CompareRevisions|There was an error while loading the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|There was an error while searching the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|There was an error while updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
+
+msgid "Complete"
+msgstr ""
+
+msgid "Complete verification to sign in."
+msgstr ""
+
+msgid "Completed"
+msgstr ""
+
+msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
+msgstr ""
+
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance report"
+msgstr ""
+
+msgid "ComplianceFrameworks|Add framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Background color"
+msgstr ""
+
+msgid "ComplianceFrameworks|Cancel"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Configuration not found"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Description"
+msgstr ""
+
+msgid "ComplianceFrameworks|Description is required"
+msgstr ""
+
+msgid "ComplianceFrameworks|Edit framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Error deleting the compliance framework. Please try again"
+msgstr ""
+
+msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page"
+msgstr ""
+
+msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
+msgid "ComplianceFrameworks|Invalid format"
+msgstr ""
+
+msgid "ComplianceFrameworks|Name"
+msgstr ""
+
+msgid "ComplianceFrameworks|Name is required"
+msgstr ""
+
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
+msgstr ""
+
+msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
+msgstr ""
+
+msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
+msgstr ""
+
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Edit compliance framework"
+msgstr ""
+
+msgid "ComplianceFramework|New compliance framework"
+msgstr ""
+
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
+msgid "ComplianceReport|Approved by author"
+msgstr ""
+
+msgid "ComplianceReport|Approved by committer"
+msgstr ""
+
+msgid "ComplianceReport|Less than 2 approvers"
+msgstr ""
+
+msgid "ComplianceReport|No violations found"
+msgstr ""
+
+msgid "Component"
+msgstr ""
+
+msgid "Confidence"
+msgstr ""
+
+msgid "Confidential"
+msgstr ""
+
+msgid "Confidential issue"
+msgstr ""
+
+msgid "Confidential note"
+msgstr ""
+
+msgid "Confidentiality"
+msgstr ""
+
+msgid "Configuration"
+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 CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
+msgid "Configure Container Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings) to customize Container Scanning settings."
+msgstr ""
+
+msgid "Configure Container Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
+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 Error Tracking"
+msgstr ""
+
+msgid "Configure GitLab"
+msgstr ""
+
+msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgstr ""
+
+msgid "Configure Gitaly timeouts."
+msgstr ""
+
+msgid "Configure Integrations"
+msgstr ""
+
+msgid "Configure Prometheus"
+msgstr ""
+
+msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
+msgstr ""
+
+msgid "Configure SAST IaC in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST settings."
+msgstr ""
+
+msgid "Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure Secret Detection in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) to customize Secret Detection settings."
+msgstr ""
+
+msgid "Configure Secret Detection in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure Sentry integration for error tracking"
+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 advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
+msgstr ""
+
+msgid "Configure existing installation"
+msgstr ""
+
+msgid "Configure pipeline"
+msgstr ""
+
+msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
+msgstr ""
+
+msgid "Configure region"
+msgstr ""
+
+msgid "Configure region for environment"
+msgstr ""
+
+msgid "Configure regions"
+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 Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Configure the %{link} integration."
+msgstr ""
+
+msgid "Configure the default first day of the week and time tracking units."
+msgstr ""
+
+msgid "Configure the way a user creates a new account."
+msgstr ""
+
+msgid "Configure via Merge Request"
+msgstr ""
+
+msgid "Configure which lists are shown for anyone who visits this board"
+msgstr ""
+
+msgid "Configure with a merge request"
+msgstr ""
+
+msgid "Configure your environments to be deployed to specific geographical regions"
+msgstr ""
+
+msgid "Confirm"
+msgstr ""
+
+msgid "Confirm approval"
+msgstr ""
+
+msgid "Confirm destroy application"
+msgstr ""
+
+msgid "Confirm new password"
+msgstr ""
+
+msgid "Confirm user"
+msgstr ""
+
+msgid "Confirm your account"
+msgstr ""
+
+msgid "Confirm your email address"
+msgstr ""
+
+msgid "Confirmation email sent to %{email}"
+msgstr ""
+
+msgid "Confirmation required"
+msgstr ""
+
+msgid "Confirmed at:"
+msgstr ""
+
+msgid "Confirmed:"
+msgstr ""
+
+msgid "Conflict: This file was added both in the source and target branches, but with different contents."
+msgstr ""
+
+msgid "Conflict: This file was modified in both the source and target branches."
+msgstr ""
+
+msgid "Conflict: This file was modified in the source branch, but removed in the target branch."
+msgstr ""
+
+msgid "Conflict: This file was removed in the source branch, but modified in the target branch."
+msgstr ""
+
+msgid "Conflict: This file was removed in the source branch, but renamed in the target branch."
+msgstr ""
+
+msgid "Conflict: This file was renamed differently in the source and target branches."
+msgstr ""
+
+msgid "Conflict: This file was renamed in the source branch, but removed in the target branch."
+msgstr ""
+
+msgid "Confluence"
+msgstr ""
+
+msgid "Confluence Cloud Workspace URL"
+msgstr ""
+
+msgid "ConfluenceService|Confluence Workspace"
+msgstr ""
+
+msgid "ConfluenceService|Link to a Confluence Workspace from the sidebar."
+msgstr ""
+
+msgid "ConfluenceService|Link to a Confluence Workspace from the sidebar. Enabling this integration replaces the \"Wiki\" sidebar link with a link to the Confluence Workspace. The GitLab wiki is still available at the original URL."
+msgstr ""
+
+msgid "ConfluenceService|Your GitLab wiki is still available at %{wiki_link}. To re-enable the link to the GitLab wiki, disable this integration."
+msgstr ""
+
+msgid "Congratulations, your free trial is activated."
+msgstr ""
+
+msgid "Connect"
+msgstr ""
+
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
+msgid "Connect all repositories"
+msgstr ""
+
+msgid "Connect repositories from GitHub"
+msgstr ""
+
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connected"
+msgstr ""
+
+msgid "Connecting"
+msgstr ""
+
+msgid "Connecting to terminal sync service"
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
+msgid "Connection failed"
+msgstr ""
+
+msgid "Connection failure"
+msgstr ""
+
+msgid "Connection timed out"
+msgstr ""
+
+msgid "Consistency guarantee method"
+msgstr ""
+
+msgid "Contact support"
+msgstr ""
+
+msgid "Contacts"
+msgstr ""
+
+msgid "Container Registry"
+msgstr ""
+
+msgid "Container Scanning"
+msgstr ""
+
+msgid "Container must be a project or a group."
+msgstr ""
+
+msgid "Container registry images"
+msgstr ""
+
+msgid "Container registry is not enabled on this GitLab instance. Ask an administrator to enable it in order for Auto DevOps to work."
+msgstr ""
+
+msgid "Container repositories"
+msgstr ""
+
+msgid "Container repository"
+msgstr ""
+
+msgid "ContainerRegistry| Please visit the %{linkStart}administration settings%{linkEnd} to enable this feature."
+msgstr ""
+
+msgid "ContainerRegistry|%{count} Image repository"
+msgid_plural "ContainerRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ContainerRegistry|%{count} Tag"
+msgid_plural "ContainerRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ContainerRegistry|%{strongStart}Disabled%{strongEnd} - Tags will not be automatically deleted."
+msgstr ""
+
+msgid "ContainerRegistry|%{strongStart}Enabled%{strongEnd} - Tags that match the rules on this page are automatically scheduled for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|%{title} was successfully scheduled for deletion"
+msgstr ""
+
+msgid "ContainerRegistry|-- tags"
+msgstr ""
+
+msgid "ContainerRegistry|Build an image"
+msgstr ""
+
+msgid "ContainerRegistry|CLI Commands"
+msgstr ""
+
+msgid "ContainerRegistry|Clean up image tags"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup disabled"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup in progress"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup incomplete"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup is currently removing tags"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup is disabled for this project"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup is ongoing"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup pending"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup policy for tags is disabled"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup policy successfully saved."
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup ran but some tags were not removed"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup will run %{time}"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup will run soon"
+msgstr ""
+
+msgid "ContainerRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "ContainerRegistry|Container Registry"
+msgstr ""
+
+msgid "ContainerRegistry|Copy build command"
+msgstr ""
+
+msgid "ContainerRegistry|Copy image path"
+msgstr ""
+
+msgid "ContainerRegistry|Copy login command"
+msgstr ""
+
+msgid "ContainerRegistry|Copy push command"
+msgstr ""
+
+msgid "ContainerRegistry|Delete image repository?"
+msgstr ""
+
+msgid "ContainerRegistry|Delete selected tags"
+msgstr ""
+
+msgid "ContainerRegistry|Delete tag"
+msgstr ""
+
+msgid "ContainerRegistry|Deleting the image repository will delete all images and tags inside. This action cannot be undone. Please type the following to confirm: %{code}"
+msgstr ""
+
+msgid "ContainerRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "ContainerRegistry|Docker connection error"
+msgstr ""
+
+msgid "ContainerRegistry|Enable expiration policy"
+msgstr ""
+
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
+
+msgid "ContainerRegistry|Expiration policy will run in %{time}"
+msgstr ""
+
+msgid "ContainerRegistry|If you are not already logged in, you need to authenticate to the Container Registry by using your GitLab username and password. If you have %{twofaDocLinkStart}Two-Factor Authentication%{twofaDocLinkEnd} enabled, use a %{personalAccessTokensDocLinkStart}Personal Access Token%{personalAccessTokensDocLinkEnd} instead of a password."
+msgstr ""
+
+msgid "ContainerRegistry|Image repository deletion failed"
+msgstr ""
+
+msgid "ContainerRegistry|Image repository not found"
+msgstr ""
+
+msgid "ContainerRegistry|Image repository temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|Image repository will be deleted"
+msgstr ""
+
+msgid "ContainerRegistry|Image repository with no name located at the project URL."
+msgstr ""
+
+msgid "ContainerRegistry|Image tags"
+msgstr ""
+
+msgid "ContainerRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "ContainerRegistry|Keep tags matching:"
+msgstr ""
+
+msgid "ContainerRegistry|Keep the most recent:"
+msgstr ""
+
+msgid "ContainerRegistry|Keep these tags"
+msgstr ""
+
+msgid "ContainerRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "ContainerRegistry|Login"
+msgstr ""
+
+msgid "ContainerRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "ContainerRegistry|Missing or insufficient permission, delete button disabled"
+msgstr ""
+
+msgid "ContainerRegistry|Next cleanup scheduled to run on:"
+msgstr ""
+
+msgid "ContainerRegistry|Not yet scheduled"
+msgstr ""
+
+msgid "ContainerRegistry|Note: Any policy update will result in a change to the scheduled run date and time"
+msgstr ""
+
+msgid "ContainerRegistry|Partial cleanup complete"
+msgstr ""
+
+msgid "ContainerRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "ContainerRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "ContainerRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "ContainerRegistry|Push an image"
+msgstr ""
+
+msgid "ContainerRegistry|Remember to run %{docLinkStart}garbage collection%{docLinkEnd} to remove the stale data from storage."
+msgstr ""
+
+msgid "ContainerRegistry|Remove repository"
+msgstr ""
+
+msgid "ContainerRegistry|Remove tag"
+msgid_plural "ContainerRegistry|Remove tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ContainerRegistry|Remove tags matching:"
+msgstr ""
+
+msgid "ContainerRegistry|Remove tags older than:"
+msgstr ""
+
+msgid "ContainerRegistry|Remove these tags"
+msgstr ""
+
+msgid "ContainerRegistry|Run cleanup:"
+msgstr ""
+
+msgid "ContainerRegistry|Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
+msgid "ContainerRegistry|Some tags were not deleted"
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the cleanup policy."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the image details."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the repository list."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the tags list."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while marking the tag for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while marking the tags for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while scheduling %{title} for deletion. Please try again."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while scheduling the image for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while updating the cleanup policy."
+msgstr ""
+
+msgid "ContainerRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "ContainerRegistry|Tag successfully marked for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Tags successfully marked for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
+msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
+msgstr ""
+
+msgid "ContainerRegistry|Tags that match these rules are %{strongStart}removed%{strongEnd}, unless a rule above says to keep them."
+msgstr ""
+
+msgid "ContainerRegistry|Tags with names that match this regex pattern are kept. %{linkStart}View regex examples.%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|Tags with names that match this regex pattern are removed. %{linkStart}View regex examples.%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|The cleanup policy timed out before it could delete all tags. An administrator can %{adminLinkStart}manually run cleanup now%{adminLinkEnd} or you can wait for the cleanup policy to automatically run again. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|The cleanup will continue within %{time}. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|The filter returned no results"
+msgstr ""
+
+msgid "ContainerRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "ContainerRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "ContainerRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "ContainerRegistry|The value of this input should be less than 256 characters"
+msgstr ""
+
+msgid "ContainerRegistry|There are no container images available in this group"
+msgstr ""
+
+msgid "ContainerRegistry|There are no container images stored for this project"
+msgstr ""
+
+msgid "ContainerRegistry|There was an error during the deletion of this image repository, please try again."
+msgstr ""
+
+msgid "ContainerRegistry|This image has no active tags"
+msgstr ""
+
+msgid "ContainerRegistry|This image repository has failed to be deleted"
+msgstr ""
+
+msgid "ContainerRegistry|This image repository is scheduled for deletion"
+msgstr ""
+
+msgid "ContainerRegistry|This image repository will be deleted. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|This project's cleanup policy for tags is not enabled."
+msgstr ""
+
+msgid "ContainerRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "ContainerRegistry|We are having trouble connecting to the Container Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. %{docLinkStart}More Information%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. Push at least one Docker image in one of this group's projects in order to show up here. %{docLinkStart}More Information%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
+msgstr ""
+
+msgid "ContainerRegistry|You are about to remove %{item}. Are you sure?"
+msgstr ""
+
+msgid "ContainerRegistry|You are about to remove repository %{title}. Once you confirm, this repository will be permanently deleted."
+msgstr ""
+
+msgid "ContainerRegistry|You can add an image to this registry with the following commands:"
+msgstr ""
+
+msgid "Content parsed with %{link}."
+msgstr ""
+
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
+msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
+msgstr ""
+
+msgid "Contents of .gitlab-ci.yml"
+msgstr ""
+
+msgid "ContextCommits|Failed to create context commits. Please try again."
+msgstr ""
+
+msgid "ContextCommits|Failed to create/remove context commits. Please try again."
+msgstr ""
+
+msgid "ContextCommits|Failed to delete context commits. Please try again."
+msgstr ""
+
+msgid "Continue"
+msgstr ""
+
+msgid "Continue editing"
+msgstr ""
+
+msgid "Continue to the next step"
+msgstr ""
+
+msgid "Continuous Integration and Deployment"
+msgstr ""
+
+msgid "Contribute to GitLab"
+msgstr ""
+
+msgid "Contribution"
+msgstr ""
+
+msgid "Contribution Analytics"
+msgstr ""
+
+msgid "ContributionAnalytics|%{created_count} created, %{closed_count} closed."
+msgstr ""
+
+msgid "ContributionAnalytics|%{created_count} created, %{merged_count} merged, %{closed_count} closed."
+msgstr ""
+
+msgid "ContributionAnalytics|%{pushes} pushes, more than %{commits} commits by %{people} contributors."
+msgstr ""
+
+msgid "ContributionAnalytics|Contribution analytics for issues, merge requests and push events since %{start_date}"
+msgstr ""
+
+msgid "ContributionAnalytics|Issues"
+msgstr ""
+
+msgid "ContributionAnalytics|Last 3 months"
+msgstr ""
+
+msgid "ContributionAnalytics|Last month"
+msgstr ""
+
+msgid "ContributionAnalytics|Last week"
+msgstr ""
+
+msgid "ContributionAnalytics|Merge requests"
+msgstr ""
+
+msgid "ContributionAnalytics|No issues for the selected time period."
+msgstr ""
+
+msgid "ContributionAnalytics|No merge requests for the selected time period."
+msgstr ""
+
+msgid "ContributionAnalytics|No pushes for the selected time period."
+msgstr ""
+
+msgid "Contributions for %{calendar_date}"
+msgstr ""
+
+msgid "Contributions per group member"
+msgstr ""
+
+msgid "Contributor"
+msgstr ""
+
+msgid "Contributors"
+msgstr ""
+
+msgid "Control emails linked to your account"
+msgstr ""
+
+msgid "Control how the GitLab Package Registry functions."
+msgstr ""
+
+msgid "Control whether to display customer experience improvement content and 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"
+msgstr ""
+
+msgid "Copied"
+msgstr ""
+
+msgid "Copied labels and milestone from %{source_issuable_reference}."
+msgstr ""
+
+msgid "Copy"
+msgstr ""
+
+msgid "Copy %{accessTokenType}"
+msgstr ""
+
+msgid "Copy %{http_label} clone URL"
+msgstr ""
+
+msgid "Copy %{name}"
+msgstr ""
+
+msgid "Copy %{protocol} clone URL"
+msgstr ""
+
+msgid "Copy %{type}"
+msgstr ""
+
+msgid "Copy ID"
+msgstr ""
+
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
+msgid "Copy SSH clone URL"
+msgstr ""
+
+msgid "Copy SSH public key"
+msgstr ""
+
+msgid "Copy URL"
+msgstr ""
+
+msgid "Copy audio URL"
+msgstr ""
+
+msgid "Copy branch name"
+msgstr ""
+
+msgid "Copy code"
+msgstr ""
+
+msgid "Copy codes"
+msgstr ""
+
+msgid "Copy command"
+msgstr ""
+
+msgid "Copy commands"
+msgstr ""
+
+msgid "Copy commit SHA"
+msgstr ""
+
+msgid "Copy environment"
+msgstr ""
+
+msgid "Copy evidence SHA"
+msgstr ""
+
+msgid "Copy failed. Please manually copy the value."
+msgstr ""
+
+msgid "Copy file contents"
+msgstr ""
+
+msgid "Copy file path"
+msgstr ""
+
+msgid "Copy image URL"
+msgstr ""
+
+msgid "Copy issue URL to clipboard"
+msgstr ""
+
+msgid "Copy key"
+msgstr ""
+
+msgid "Copy labels and milestone from %{source_issuable_reference}."
+msgstr ""
+
+msgid "Copy labels and milestone from other issue or merge request in this project"
+msgstr ""
+
+msgid "Copy link"
+msgstr ""
+
+msgid "Copy link URL"
+msgstr ""
+
+msgid "Copy link to chart"
+msgstr ""
+
+msgid "Copy reference"
+msgstr ""
+
+msgid "Copy secret"
+msgstr ""
+
+msgid "Copy source branch name"
+msgstr ""
+
+msgid "Copy the code below to implement tracking in your application:"
+msgstr ""
+
+msgid "Copy this registration token."
+msgstr ""
+
+msgid "Copy to clipboard"
+msgstr ""
+
+msgid "Copy token"
+msgstr ""
+
+msgid "Copy trigger token"
+msgstr ""
+
+msgid "Copy value"
+msgstr ""
+
+msgid "Copy video URL"
+msgstr ""
+
+msgid "Corpus Management"
+msgstr ""
+
+msgid "Corpus Management|Are you sure you want to delete the corpus?"
+msgstr ""
+
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "CorpusManagement|Actions"
+msgstr ""
+
+msgid "CorpusManagement|Corpus file"
+msgstr ""
+
+msgid "CorpusManagement|Corpus files are used in coverage-guided fuzz testing as seed inputs to improve testing."
+msgstr ""
+
+msgid "CorpusManagement|Corpus files must be in *.zip format. Maximum 5 GB"
+msgstr ""
+
+msgid "CorpusManagement|Corpus name"
+msgstr ""
+
+msgid "CorpusManagement|Currently, there are no uploaded or generated corpuses."
+msgstr ""
+
+msgid "CorpusManagement|File too large, Maximum 5 GB"
+msgstr ""
+
+msgid "CorpusManagement|Filename can contain only lowercase letters (a-z), uppercase letter (A-Z), numbers (0-9), dots (.), hyphens (-), or underscores (_)."
+msgstr ""
+
+msgid "CorpusManagement|Fuzz testing corpus management"
+msgstr ""
+
+msgid "CorpusManagement|Last updated"
+msgstr ""
+
+msgid "CorpusManagement|Last used"
+msgstr ""
+
+msgid "CorpusManagement|Latest Job:"
+msgstr ""
+
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
+msgid "CorpusManagement|New upload"
+msgstr ""
+
+msgid "CorpusManagement|Not Set"
+msgstr ""
+
+msgid "CorpusManagement|Target"
+msgstr ""
+
+msgid "CorpusManagement|To use this corpus, edit the corresponding YAML file"
+msgstr ""
+
+msgid "CorpusManagement|Total Size: %{totalSize}"
+msgstr ""
+
+msgid "Could not add admins as members"
+msgstr ""
+
+msgid "Could not apply %{name} command."
+msgstr ""
+
+msgid "Could not apply %{name} command. %{message}."
+msgstr ""
+
+msgid "Could not authorize chat nickname. Try again!"
+msgstr ""
+
+msgid "Could not change HEAD: branch '%{branch}' does not exist"
+msgstr ""
+
+msgid "Could not commit. An unexpected error occurred."
+msgstr ""
+
+msgid "Could not connect to FogBugz, check your URL"
+msgstr ""
+
+msgid "Could not connect to Sentry. Refresh the page to try again."
+msgstr ""
+
+msgid "Could not connect to Web IDE file mirror service."
+msgstr ""
+
+msgid "Could not create Wiki Repository at this time. Please try again later."
+msgstr ""
+
+msgid "Could not create environment"
+msgstr ""
+
+msgid "Could not create group"
+msgstr ""
+
+msgid "Could not create issue"
+msgstr ""
+
+msgid "Could not create project"
+msgstr ""
+
+msgid "Could not create wiki page"
+msgstr ""
+
+msgid "Could not delete chat nickname %{chat_name}."
+msgstr ""
+
+msgid "Could not delete wiki page"
+msgstr ""
+
+msgid "Could not draw the lines for job relationships"
+msgstr ""
+
+msgid "Could not fetch policy because existing policy YAML is invalid"
+msgstr ""
+
+msgid "Could not fetch training providers. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "Could not find design."
+msgstr ""
+
+msgid "Could not find iteration"
+msgstr ""
+
+msgid "Could not get the data properly"
+msgstr ""
+
+msgid "Could not load the user chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "Could not load usage counts. Please refresh the page to try again."
+msgstr ""
+
+msgid "Could not remove %{user} from %{group}. Cannot remove last group owner."
+msgstr ""
+
+msgid "Could not remove %{user} from %{group}. User is not a group member."
+msgstr ""
+
+msgid "Could not remove the trigger."
+msgstr ""
+
+msgid "Could not restore the group"
+msgstr ""
+
+msgid "Could not revoke access token %{access_token_name}."
+msgstr ""
+
+msgid "Could not revoke impersonation token %{token_name}."
+msgstr ""
+
+msgid "Could not revoke personal access token %{personal_access_token_name}."
+msgstr ""
+
+msgid "Could not save configuration. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "Could not save group ID"
+msgstr ""
+
+msgid "Could not save project ID"
+msgstr ""
+
+msgid "Could not save prometheus manual configuration"
+msgstr ""
+
+msgid "Could not update the LDAP settings"
+msgstr ""
+
+msgid "Could not update wiki page"
+msgstr ""
+
+msgid "Could not upload your designs as one or more files uploaded are not supported."
+msgstr ""
+
+msgid "Couldn't assign policy to project or group"
+msgstr ""
+
+msgid "Country"
+msgstr ""
+
+msgid "Coverage"
+msgstr ""
+
+msgid "Coverage Fuzzing"
+msgstr ""
+
+msgid "Create"
+msgstr ""
+
+msgid "Create %{environment}"
+msgstr ""
+
+msgid "Create %{humanized_resource_name}"
+msgstr ""
+
+msgid "Create %{type}"
+msgstr ""
+
+msgid "Create %{workspace} label"
+msgstr ""
+
+msgid "Create Google Cloud project"
+msgstr ""
+
+msgid "Create New Directory"
+msgstr ""
+
+msgid "Create New Domain"
+msgstr ""
+
+msgid "Create a GitLab account first, and then connect it to your %{label} account."
+msgstr ""
+
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
+msgid "Create a Mattermost team for this group"
+msgstr ""
+
+msgid "Create a cluster"
+msgstr ""
+
+msgid "Create a group"
+msgstr ""
+
+msgid "Create a merge request"
+msgstr ""
+
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
+msgstr ""
+
+msgid "Create a new branch"
+msgstr ""
+
+msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
+msgstr ""
+
+msgid "Create a new issue"
+msgstr ""
+
+msgid "Create a new project"
+msgstr ""
+
+msgid "Create a new repository"
+msgstr ""
+
+msgid "Create a personal access token on your account to pull or push via %{protocol}."
+msgstr ""
+
+msgid "Create a project"
+msgstr ""
+
+msgid "Create an account using:"
+msgstr ""
+
+msgid "Create an incident. Incidents are created for each alert triggered."
+msgstr ""
+
+msgid "Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to import."
+msgstr ""
+
+msgid "Create branch"
+msgstr ""
+
+msgid "Create commit"
+msgstr ""
+
+msgid "Create commit..."
+msgstr ""
+
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
+msgid "Create confidential merge request"
+msgstr ""
+
+msgid "Create confidential merge request and branch"
+msgstr ""
+
+msgid "Create custom type"
+msgstr ""
+
+msgid "Create directory"
+msgstr ""
+
+msgid "Create empty repository"
+msgstr ""
+
+msgid "Create epic"
+msgstr ""
+
+msgid "Create file"
+msgstr ""
+
+msgid "Create from"
+msgstr ""
+
+msgid "Create group"
+msgstr ""
+
+msgid "Create group label"
+msgstr ""
+
+msgid "Create issue"
+msgstr ""
+
+msgid "Create issue to resolve all threads"
+msgstr ""
+
+msgid "Create iteration"
+msgstr ""
+
+msgid "Create label"
+msgstr ""
+
+msgid "Create list"
+msgstr ""
+
+msgid "Create lists from labels. Issues with that label appear in that list."
+msgstr ""
+
+msgid "Create merge request"
+msgstr ""
+
+msgid "Create merge request and branch"
+msgstr ""
+
+msgid "Create milestone"
+msgstr ""
+
+msgid "Create new"
+msgstr ""
+
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new Value Stream"
+msgstr ""
+
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new confidential %{issuableType}"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
+msgid "Create new file or directory"
+msgstr ""
+
+msgid "Create new label"
+msgstr ""
+
+msgid "Create new project"
+msgstr ""
+
+msgid "Create new..."
+msgstr ""
+
+msgid "Create one"
+msgstr ""
+
+msgid "Create or close an issue."
+msgstr ""
+
+msgid "Create or import your first project"
+msgstr ""
+
+msgid "Create project"
+msgstr ""
+
+msgid "Create project label"
+msgstr ""
+
+msgid "Create release"
+msgstr ""
+
+msgid "Create requirement"
+msgstr ""
+
+msgid "Create service account"
+msgstr ""
+
+msgid "Create snippet"
+msgstr ""
+
+msgid "Create tag %{tagName}"
+msgstr ""
+
+msgid "Create topic"
+msgstr ""
+
+msgid "Create user"
+msgstr ""
+
+msgid "Create wildcard: %{searchTerm}"
+msgstr ""
+
+msgid "Create your first page"
+msgstr ""
+
+msgid "Create your group"
+msgstr ""
+
+msgid "Create, update, or delete a merge request."
+msgstr ""
+
+msgid "Create/import your first project"
+msgstr ""
+
+msgid "CreateGroup|You don’t have permission to create a subgroup in this group."
+msgstr ""
+
+msgid "CreateGroup|You don’t have permission to create groups."
+msgstr ""
+
+msgid "CreateTag|Tag"
+msgstr ""
+
+msgid "CreateValueStreamForm|%{name} (default)"
+msgstr ""
+
+msgid "CreateValueStreamForm|'%{name}' Value Stream created"
+msgstr ""
+
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
+msgid "CreateValueStreamForm|Add another stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Add stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|All default stages are currently visible"
+msgstr ""
+
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create from default template"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create from no template"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create new Value Stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create value stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Default stages"
+msgstr ""
+
+msgid "CreateValueStreamForm|Default stages can only be hidden or re-ordered"
+msgstr ""
+
+msgid "CreateValueStreamForm|Edit value stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Editing stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event label"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event: "
+msgstr ""
+
+msgid "CreateValueStreamForm|Enter stage name"
+msgstr ""
+
+msgid "CreateValueStreamForm|Enter value stream name"
+msgstr ""
+
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
+msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
+msgstr ""
+
+msgid "CreateValueStreamForm|Name is required"
+msgstr ""
+
+msgid "CreateValueStreamForm|New stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Please select a start event first"
+msgstr ""
+
+msgid "CreateValueStreamForm|Please select an end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Recover hidden stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Restore defaults"
+msgstr ""
+
+msgid "CreateValueStreamForm|Restore stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Save value stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Select end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Select start event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage %{index}"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage name already exists"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage name is required"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event changed, please select a valid end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event label"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event: "
+msgstr ""
+
+msgid "CreateValueStreamForm|Update stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Value Stream name"
+msgstr ""
+
+msgid "Created"
+msgstr ""
+
+msgid "Created %{epicTimeagoDate}"
+msgstr ""
+
+msgid "Created %{timestamp}"
+msgstr ""
+
+msgid "Created At"
+msgstr ""
+
+msgid "Created On"
+msgstr ""
+
+msgid "Created a branch and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Created branch '%{branch_name}' and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Created by %{job}"
+msgstr ""
+
+msgid "Created by me"
+msgstr ""
+
+msgid "Created by:"
+msgstr ""
+
+msgid "Created compliance violations if any were found"
+msgstr ""
+
+msgid "Created date"
+msgstr ""
+
+msgid "Created issue %{issueLink}"
+msgstr ""
+
+msgid "Created issue %{issueLink} at %{projectLink}"
+msgstr ""
+
+msgid "Created merge request %{mergeRequestLink}"
+msgstr ""
+
+msgid "Created merge request %{mergeRequestLink} at %{projectLink}"
+msgstr ""
+
+msgid "Created on"
+msgstr ""
+
+msgid "Created on %{created_at}"
+msgstr ""
+
+msgid "Created on:"
+msgstr ""
+
+msgid "Creates a branch and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Creates branch '%{branch_name}' and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Creating"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
+msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
+msgstr ""
+
+msgid "Creation date"
+msgstr ""
+
+msgid "Creator"
+msgstr ""
+
+msgid "Credentials"
+msgstr ""
+
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
+msgid "CredentialsInventory|No credentials found"
+msgstr ""
+
+msgid "CredentialsInventory|Personal Access Tokens"
+msgstr ""
+
+msgid "CredentialsInventory|Project Access Tokens"
+msgstr ""
+
+msgid "CredentialsInventory|SSH Keys"
+msgstr ""
+
+msgid "Credit card required to be on file in order to create a pipeline"
+msgstr ""
+
+msgid "Credit card:"
+msgstr ""
+
+msgid "Critical vulnerabilities present"
+msgstr ""
+
+msgid "Crm|Contact"
+msgstr ""
+
+msgid "Crm|Contact has been added."
+msgstr ""
+
+msgid "Crm|Contact has been updated."
+msgstr ""
+
+msgid "Crm|Customer relations contacts"
+msgstr ""
+
+msgid "Crm|Customer relations organizations"
+msgstr ""
+
+msgid "Crm|Default rate"
+msgstr ""
+
+msgid "Crm|Edit contact"
+msgstr ""
+
+msgid "Crm|Edit organization"
+msgstr ""
+
+msgid "Crm|New contact"
+msgstr ""
+
+msgid "Crm|New organization"
+msgstr ""
+
+msgid "Crm|No contacts found"
+msgstr ""
+
+msgid "Crm|No organization"
+msgstr ""
+
+msgid "Crm|No organizations found"
+msgstr ""
+
+msgid "Crm|Organization"
+msgstr ""
+
+msgid "Crm|Organization has been added."
+msgstr ""
+
+msgid "Crm|Organization has been updated."
+msgstr ""
+
+msgid "Cron Timezone"
+msgstr ""
+
+msgid "Cron time zone"
+msgstr ""
+
+msgid "Crowd"
+msgstr ""
+
+msgid "CsvParser|Failed to render the CSV file for the following reasons:"
+msgstr ""
+
+msgid "CsvParser|Quoted field unterminated"
+msgstr ""
+
+msgid "CsvParser|Too few fields"
+msgstr ""
+
+msgid "CsvParser|Too many fields"
+msgstr ""
+
+msgid "CsvParser|Trailing quote on quoted field is malformed"
+msgstr ""
+
+msgid "CsvParser|Unable to auto-detect delimiter; defaulted to \",\""
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Current Branch"
+msgstr ""
+
+msgid "Current Project"
+msgstr ""
+
+msgid "Current forks will keep their visibility level."
+msgstr ""
+
+msgid "Current node must be the primary node or you will be locking yourself out"
+msgstr ""
+
+msgid "Current password"
+msgstr ""
+
+msgid "Current sign-in IP:"
+msgstr ""
+
+msgid "Current sign-in at:"
+msgstr ""
+
+msgid "Current sign-in ip"
+msgstr ""
+
+msgid "Current vulnerabilities count"
+msgstr ""
+
+msgid "CurrentUser|Buy Pipeline minutes"
+msgstr ""
+
+msgid "CurrentUser|Edit profile"
+msgstr ""
+
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
+
+msgid "CurrentUser|Preferences"
+msgstr ""
+
+msgid "CurrentUser|Start an Ultimate trial"
+msgstr ""
+
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
+
+msgid "Custom Attributes"
+msgstr ""
+
+msgid "Custom Git clone URL for HTTP(S)"
+msgstr ""
+
+msgid "Custom analyzers: language support"
+msgstr ""
+
+msgid "Custom hostname (for private commit emails)"
+msgstr ""
+
+msgid "Custom metrics"
+msgstr ""
+
+msgid "Custom notification events"
+msgstr ""
+
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
+msgstr ""
+
+msgid "Custom project templates"
+msgstr ""
+
+msgid "Custom project templates have not been set up for groups that you are a member of. They are enabled from a group’s settings page. Contact your group’s Owner or Maintainer to setup custom project templates."
+msgstr ""
+
+msgid "Custom range"
+msgstr ""
+
+msgid "Custom range (UTC)"
+msgstr ""
+
+msgid "Customer experience improvement and third-party offers"
+msgstr ""
+
+msgid "Customer relations"
+msgstr ""
+
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
+msgstr ""
+
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize icon"
+msgstr ""
+
+msgid "Customize language and region related settings."
+msgstr ""
+
+msgid "Customize name"
+msgstr ""
+
+msgid "Customize your pipeline configuration."
+msgstr ""
+
+msgid "Cycle Time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was added to the issue"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was added to the merge request"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the issue"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the merge request"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue closed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue created"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first added to a board"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first associated with a milestone"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first associated with a milestone or issue first added to a board"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first mentioned in a commit"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue label was added"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue label was removed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue last edited"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request closed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request created"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request first commit time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request first deployed to production"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request label was added"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request label was removed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request last build finish time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request last build start time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request last edited"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request merged"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Code"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Issue"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Plan"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Review"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Staging"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Test"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Total"
+msgstr ""
+
+msgid "CycleAnalyticsStage|is not available for the selected group"
+msgstr ""
+
+msgid "CycleAnalyticsStage|should be under a group"
+msgstr ""
+
+msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
+msgstr ""
+
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
+msgid "CycleAnalytics|Average time to completion"
+msgstr ""
+
+msgid "CycleAnalytics|Change Failure Rate"
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
+msgid "CycleAnalytics|Date"
+msgstr ""
+
+msgid "CycleAnalytics|Display chart filters"
+msgstr ""
+
+msgid "CycleAnalytics|If you have recently upgraded to GitLab Premium, it can take up to 30 minutes for data to collect and display."
+msgstr ""
+
+msgid "CycleAnalytics|Lead Time for Changes"
+msgstr ""
+
+msgid "CycleAnalytics|Number of tasks"
+msgstr ""
+
+msgid "CycleAnalytics|Only %{maxLabels} labels can be selected at this time"
+msgstr ""
+
+msgid "CycleAnalytics|Project selected"
+msgid_plural "CycleAnalytics|%d projects selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CycleAnalytics|Select labels"
+msgstr ""
+
+msgid "CycleAnalytics|Show"
+msgstr ""
+
+msgid "CycleAnalytics|Stage time: %{title}"
+msgstr ""
+
+msgid "CycleAnalytics|Tasks by type"
+msgstr ""
+
+msgid "CycleAnalytics|The average time items spent in this stage. Data limited to items completed within this date range."
+msgstr ""
+
+msgid "CycleAnalytics|The given date range is larger than 180 days"
+msgstr ""
+
+msgid "CycleAnalytics|The total time items spent across each value stream stage. Data limited to items completed within this date range."
+msgstr ""
+
+msgid "CycleAnalytics|There is no data for 'Stage time' available. Adjust the current filters."
+msgstr ""
+
+msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
+msgstr ""
+
+msgid "CycleAnalytics|Time to Restore Service"
+msgstr ""
+
+msgid "CycleAnalytics|Total time"
+msgstr ""
+
+msgid "CycleAnalytics|group dropdown filter"
+msgstr ""
+
+msgid "CycleAnalytics|not allowed for the given start event"
+msgstr ""
+
+msgid "CycleAnalytics|project dropdown filter"
+msgstr ""
+
+msgid "DAG visualization requires at least 3 dependent jobs."
+msgstr ""
+
+msgid "DAST Configuration"
+msgstr ""
+
+msgid "DAST profile not found: %{name}"
+msgstr ""
+
+msgid "DAST profiles"
+msgstr ""
+
+msgid "DNS"
+msgstr ""
+
+msgid "DORA4Metrics|%{startDate} - %{endDate}"
+msgstr ""
+
+msgid "DORA4Metrics|Average (last %{days}d)"
+msgstr ""
+
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
+msgid "DORA4Metrics|Date"
+msgstr ""
+
+msgid "DORA4Metrics|Days for an open incident"
+msgstr ""
+
+msgid "DORA4Metrics|Days from merge to deploy"
+msgstr ""
+
+msgid "DORA4Metrics|Deployment frequency"
+msgstr ""
+
+msgid "DORA4Metrics|Lead time for changes"
+msgstr ""
+
+msgid "DORA4Metrics|Median (last %{days}d)"
+msgstr ""
+
+msgid "DORA4Metrics|Median time (last %{days}d)"
+msgstr ""
+
+msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|No incidents during this period"
+msgstr ""
+
+msgid "DORA4Metrics|No merge requests were deployed during this period"
+msgstr ""
+
+msgid "DORA4Metrics|Number of deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting lead time data."
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting time to restore service data."
+msgstr ""
+
+msgid "DORA4Metrics|The chart displays the frequency of deployments to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
+msgstr ""
+
+msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
+msgstr ""
+
+msgid "DORA4Metrics|Time to restore service"
+msgstr ""
+
+msgid "DSN"
+msgstr ""
+
+msgid "Dashboard"
+msgstr ""
+
+msgid "Dashboard uid not found"
+msgstr ""
+
+msgid "DashboardProjects|All"
+msgstr ""
+
+msgid "DashboardProjects|Personal"
+msgstr ""
+
+msgid "DashboardProjects|Trending"
+msgstr ""
+
+msgid "Dashboard|%{firstProject} and %{secondProject}"
+msgstr ""
+
+msgid "Dashboard|%{firstProject}, %{rest}, and %{secondProject}"
+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 CI/CD configuration"
+msgstr ""
+
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+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 ""
+
+msgid "DastProfiles|AJAX spider"
+msgstr ""
+
+msgid "DastProfiles|API"
+msgstr ""
+
+msgid "DastProfiles|API endpoint URL"
+msgstr ""
+
+msgid "DastProfiles|Active"
+msgstr ""
+
+msgid "DastProfiles|Additional request headers (optional)"
+msgstr ""
+
+msgid "DastProfiles|Are you sure you want to delete this profile?"
+msgstr ""
+
+msgid "DastProfiles|Attacks the target to find potential vulnerabilities. Active scans are potentially harmful to the site being scanned."
+msgstr ""
+
+msgid "DastProfiles|Authentication"
+msgstr ""
+
+msgid "DastProfiles|Authentication URL"
+msgstr ""
+
+msgid "DastProfiles|Branch missing"
+msgstr ""
+
+msgid "DastProfiles|Change scanner profile"
+msgstr ""
+
+msgid "DastProfiles|Change site profile"
+msgstr ""
+
+msgid "DastProfiles|Choose a scan method"
+msgstr ""
+
+msgid "DastProfiles|Could not create the scanner profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|Could not create the site profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|Could not delete scanner profile. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not delete scanner profiles:"
+msgstr ""
+
+msgid "DastProfiles|Could not delete site profile. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not delete site profiles:"
+msgstr ""
+
+msgid "DastProfiles|Could not fetch scanner profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not fetch site profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not update the scanner profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|Could not update the site profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
+msgid "DastProfiles|Debug messages"
+msgstr ""
+
+msgid "DastProfiles|Delete profile"
+msgstr ""
+
+msgid "DastProfiles|Do you want to discard this scanner profile?"
+msgstr ""
+
+msgid "DastProfiles|Do you want to discard this site profile?"
+msgstr ""
+
+msgid "DastProfiles|Do you want to discard your changes?"
+msgstr ""
+
+msgid "DastProfiles|Edit profile"
+msgstr ""
+
+msgid "DastProfiles|Edit scanner profile"
+msgstr ""
+
+msgid "DastProfiles|Edit site profile"
+msgstr ""
+
+msgid "DastProfiles|Enable Authentication"
+msgstr ""
+
+msgid "DastProfiles|Enter URLs in a comma-separated list."
+msgstr ""
+
+msgid "DastProfiles|Enter headers in a comma-separated list."
+msgstr ""
+
+msgid "DastProfiles|Error Details"
+msgstr ""
+
+msgid "DastProfiles|Excluded URLs"
+msgstr ""
+
+msgid "DastProfiles|Excluded URLs (optional)"
+msgstr ""
+
+msgid "DastProfiles|Excluded paths"
+msgstr ""
+
+msgid "DastProfiles|Excluded paths (optional)"
+msgstr ""
+
+msgid "DastProfiles|Hide debug messages"
+msgstr ""
+
+msgid "DastProfiles|Include debug messages in the DAST console output."
+msgstr ""
+
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
+msgid "DastProfiles|Manage profiles"
+msgstr ""
+
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
+msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
+msgstr ""
+
+msgid "DastProfiles|Minimum = 1 second, Maximum = 3600 seconds"
+msgstr ""
+
+msgid "DastProfiles|Monitors all HTTP requests sent to the target to find potential vulnerabilities."
+msgstr ""
+
+msgid "DastProfiles|New scanner profile"
+msgstr ""
+
+msgid "DastProfiles|New site profile"
+msgstr ""
+
+msgid "DastProfiles|No scanner profile selected"
+msgstr ""
+
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No site profile selected"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|Not Validated"
+msgstr ""
+
+msgid "DastProfiles|Passive"
+msgstr ""
+
+msgid "DastProfiles|Password"
+msgstr ""
+
+msgid "DastProfiles|Password form field"
+msgstr ""
+
+msgid "DastProfiles|Profile is being used by this on-demand scan"
+msgstr ""
+
+msgid "DastProfiles|Profile name"
+msgstr ""
+
+msgid "DastProfiles|Request header names and values. Headers are added to every request made by DAST."
+msgstr ""
+
+msgid "DastProfiles|Request headers"
+msgstr ""
+
+msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
+msgstr ""
+
+msgid "DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan."
+msgstr ""
+
+msgid "DastProfiles|Save profile"
+msgstr ""
+
+msgid "DastProfiles|Scan method"
+msgstr ""
+
+msgid "DastProfiles|Scan mode"
+msgstr ""
+
+msgid "DastProfiles|Scanner Profile"
+msgstr ""
+
+msgid "DastProfiles|Scanner Profiles"
+msgstr ""
+
+msgid "DastProfiles|Scanner name"
+msgstr ""
+
+msgid "DastProfiles|Scanner profiles define the configuration details of a security scanner. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "DastProfiles|Select a scanner profile to run a DAST scan"
+msgstr ""
+
+msgid "DastProfiles|Select a site profile to run a DAST scan"
+msgstr ""
+
+msgid "DastProfiles|Select branch"
+msgstr ""
+
+msgid "DastProfiles|Select scanner profile"
+msgstr ""
+
+msgid "DastProfiles|Select site profile"
+msgstr ""
+
+msgid "DastProfiles|Show debug messages"
+msgstr ""
+
+msgid "DastProfiles|Site Profile"
+msgstr ""
+
+msgid "DastProfiles|Site Profiles"
+msgstr ""
+
+msgid "DastProfiles|Site name"
+msgstr ""
+
+msgid "DastProfiles|Site profiles define the attributes and configuration details of your deployed application, website, or API. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "DastProfiles|Site type"
+msgstr ""
+
+msgid "DastProfiles|Spider timeout"
+msgstr ""
+
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
+msgid "DastProfiles|Target URL"
+msgstr ""
+
+msgid "DastProfiles|Target timeout"
+msgstr ""
+
+msgid "DastProfiles|The maximum number of minutes allowed for the spider to traverse the site."
+msgstr ""
+
+msgid "DastProfiles|The maximum number of seconds allowed for the site under test to respond to a request."
+msgstr ""
+
+msgid "DastProfiles|This profile is currently being used in a policy."
+msgstr ""
+
+msgid "DastProfiles|This scanner profile is currently being used by a policy. To make edits you must remove it from the active policy."
+msgstr ""
+
+msgid "DastProfiles|This site profile is currently being used by a policy. To make edits you must remove it from the active policy."
+msgstr ""
+
+msgid "DastProfiles|Turn on AJAX spider"
+msgstr ""
+
+msgid "DastProfiles|URL"
+msgstr ""
+
+msgid "DastProfiles|URLs to skip during the authenticated scan."
+msgstr ""
+
+msgid "DastProfiles|Username"
+msgstr ""
+
+msgid "DastProfiles|Username form field"
+msgstr ""
+
+msgid "DastProfiles|Validated"
+msgstr ""
+
+msgid "DastProfiles|Validation status"
+msgstr ""
+
+msgid "DastProfiles|Website"
+msgstr ""
+
+msgid "DastProfiles|What does each method do?"
+msgstr ""
+
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgstr ""
+
+msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
+msgstr ""
+
+msgid "DastProfiles|folder/dast_example.har or https://example.com/dast_example.har"
+msgstr ""
+
+msgid "DastProfiles|folder/example.postman_collection.json or https://example.com/"
+msgstr ""
+
+msgid "DastProfiles|folder/openapi.json or https://example.com/openapi.json"
+msgstr ""
+
+msgid "DastSiteValidation|Copy HTTP header to clipboard"
+msgstr ""
+
+msgid "DastSiteValidation|Copy Meta tag to clipboard"
+msgstr ""
+
+msgid "DastSiteValidation|Could not create validation token. Please try again."
+msgstr ""
+
+msgid "DastSiteValidation|Could not revoke validation. Please try again."
+msgstr ""
+
+msgid "DastSiteValidation|Download validation text file"
+msgstr ""
+
+msgid "DastSiteValidation|Header validation"
+msgstr ""
+
+msgid "DastSiteValidation|Meta tag validation"
+msgstr ""
+
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
+msgid "DastSiteValidation|Retry validation"
+msgstr ""
+
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
+msgstr ""
+
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
+msgstr ""
+
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
+msgstr ""
+
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
+msgstr ""
+
+msgid "DastSiteValidation|Step 3 - Confirm header location."
+msgstr ""
+
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
+msgstr ""
+
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
+msgstr ""
+
+msgid "DastSiteValidation|Text file validation"
+msgstr ""
+
+msgid "DastSiteValidation|The validation has failed. Please try again."
+msgstr ""
+
+msgid "DastSiteValidation|The validation is in progress. Please wait..."
+msgstr ""
+
+msgid "DastSiteValidation|This will affect %d other profile targeting the same URL."
+msgid_plural "DastSiteValidation|This will affect %d other profiles targeting the same URL."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "DastSiteValidation|To run an active scan, validate your site. Site profile validation reduces the risk of running an active scan against the wrong website. All site profiles that share the same base URL share the same validation status."
+msgstr ""
+
+msgid "DastSiteValidation|Validate"
+msgstr ""
+
+msgid "DastSiteValidation|Validate site"
+msgstr ""
+
+msgid "DastSiteValidation|Validated"
+msgstr ""
+
+msgid "DastSiteValidation|Validating..."
+msgstr ""
+
+msgid "DastSiteValidation|Validation failed"
+msgstr ""
+
+msgid "DastSiteValidation|Validation failed for %{url}. %{retryButtonStart}Retry validation%{retryButtonEnd}."
+msgstr ""
+
+msgid "DastSiteValidation|Validation succeeded. Both active and passive scans can be run against the target site."
+msgstr ""
+
+msgid "DastSiteValidation|You will not be able to run active scans against %{url}."
+msgstr ""
+
+msgid "Data is still calculating..."
+msgstr ""
+
+msgid "Data refresh"
+msgstr ""
+
+msgid "Data type"
+msgstr ""
+
+msgid "Database update failed"
+msgstr ""
+
+msgid "DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog."
+msgstr ""
+
+msgid "DatadogIntegration|(Advanced) The full URL for your Datadog site."
+msgstr ""
+
+msgid "DatadogIntegration|API URL"
+msgstr ""
+
+msgid "DatadogIntegration|Custom tags in Datadog. Enter one tag per line in the %{codeOpen}key:value%{codeClose} format. %{linkOpen}How do I use tags?%{linkClose}"
+msgstr ""
+
+msgid "DatadogIntegration|Environment"
+msgstr ""
+
+msgid "DatadogIntegration|For self-managed deployments, set the %{codeOpen}env%{codeClose} tag for all the data sent to Datadog. %{linkOpen}How do I use tags?%{linkClose}"
+msgstr ""
+
+msgid "DatadogIntegration|How do I set up this integration?"
+msgstr ""
+
+msgid "DatadogIntegration|Send CI/CD pipeline information to Datadog to monitor for job failures and troubleshoot performance issues. %{docs_link}"
+msgstr ""
+
+msgid "DatadogIntegration|Service"
+msgstr ""
+
+msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments."
+msgstr ""
+
+msgid "DatadogIntegration|Tags"
+msgstr ""
+
+msgid "DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}."
+msgstr ""
+
+msgid "DatadogIntegration|Trace your GitLab pipelines with Datadog."
+msgstr ""
+
+msgid "DatadogIntegration|have an invalid format"
+msgstr ""
+
+msgid "Datasource name not found"
+msgstr ""
+
+msgid "Date"
+msgstr ""
+
+msgid "Date merged"
+msgstr ""
+
+msgid "Date range"
+msgstr ""
+
+msgid "Date range limited to %{number} days"
+msgstr ""
+
+msgid "Date range must be shorter than %{max_range} days."
+msgstr ""
+
+msgid "Day of month"
+msgstr ""
+
+msgid "DayTitle|F"
+msgstr ""
+
+msgid "DayTitle|M"
+msgstr ""
+
+msgid "DayTitle|S"
+msgstr ""
+
+msgid "DayTitle|W"
+msgstr ""
+
+msgid "Days"
+msgstr ""
+
+msgid "Days to merge"
+msgstr ""
+
+msgid "Deactivate dormant users after 90 days of inactivity"
+msgstr ""
+
+msgid "Dear Administrator,"
+msgstr ""
+
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
+msgid "Debug"
+msgstr ""
+
+msgid "Dec"
+msgstr ""
+
+msgid "December"
+msgstr ""
+
+msgid "Decline"
+msgstr ""
+
+msgid "Decline and sign out"
+msgstr ""
+
+msgid "Decompressed archive size validation failed."
+msgstr ""
+
+msgid "Decrease"
+msgstr ""
+
+msgid "Default CI/CD configuration file"
+msgstr ""
+
+msgid "Default artifacts expiration"
+msgstr ""
+
+msgid "Default branch"
+msgstr ""
+
+msgid "Default branch and protected branches"
+msgstr ""
+
+msgid "Default description template for issues"
+msgstr ""
+
+msgid "Default description template for merge requests"
+msgstr ""
+
+msgid "Default first day of the week"
+msgstr ""
+
+msgid "Default first day of the week in calendars and date pickers."
+msgstr ""
+
+msgid "Default projects limit"
+msgstr ""
+
+msgid "Default timeout"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
+msgid "DefaultBranchLabel|default"
+msgstr ""
+
+msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, but cannot force push."
+msgstr ""
+
+msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, force push, or delete the branch."
+msgstr ""
+
+msgid "DefaultBranchProtection|Developers cannot push new commits, but are allowed to accept merge requests to the branch. Maintainers can push to the branch."
+msgstr ""
+
+msgid "DefaultBranchProtection|Developers cannot push new commits, but maintainers can. No one can force push."
+msgstr ""
+
+msgid "DefaultBranchProtection|Fully protected"
+msgstr ""
+
+msgid "DefaultBranchProtection|Not protected"
+msgstr ""
+
+msgid "DefaultBranchProtection|Partially protected"
+msgstr ""
+
+msgid "DefaultBranchProtection|Protected against pushes"
+msgstr ""
+
+msgid "Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}"
+msgstr ""
+
+msgid "Define a custom pattern with cron syntax"
+msgstr ""
+
+msgid "Define custom rules for what constitutes spam, independent of Akismet"
+msgstr ""
+
+msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Define how approval rules are applied to merge requests."
+msgstr ""
+
+msgid "Define rules for who can push, merge, and the required approvals for each branch."
+msgstr ""
+
+msgid "Definition"
+msgstr ""
+
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
+msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
+msgid "DelayedJobs|Start now"
+msgstr ""
+
+msgid "DelayedJobs|Unschedule"
+msgstr ""
+
+msgid "DelayedJobs|delayed"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+msgid "Delete %{issuableType}"
+msgstr ""
+
+msgid "Delete %{name}"
+msgstr ""
+
+msgid "Delete Comment"
+msgstr ""
+
+msgid "Delete File"
+msgstr ""
+
+msgid "Delete Key"
+msgstr ""
+
+msgid "Delete Selected"
+msgstr ""
+
+msgid "Delete Value Stream"
+msgstr ""
+
+msgid "Delete account"
+msgstr ""
+
+msgid "Delete artifacts"
+msgstr ""
+
+msgid "Delete audio"
+msgstr ""
+
+msgid "Delete badge"
+msgstr ""
+
+msgid "Delete code block"
+msgstr ""
+
+msgid "Delete column"
+msgstr ""
+
+msgid "Delete comment"
+msgstr ""
+
+msgid "Delete corpus"
+msgstr ""
+
+msgid "Delete deploy key"
+msgstr ""
+
+msgid "Delete file"
+msgstr ""
+
+msgid "Delete image"
+msgstr ""
+
+msgid "Delete image repository"
+msgstr ""
+
+msgid "Delete internal note"
+msgstr ""
+
+msgid "Delete label"
+msgstr ""
+
+msgid "Delete label: %{labelName}"
+msgstr ""
+
+msgid "Delete pipeline"
+msgstr ""
+
+msgid "Delete pipeline schedule"
+msgstr ""
+
+msgid "Delete project"
+msgstr ""
+
+msgid "Delete row"
+msgstr ""
+
+msgid "Delete self monitoring project"
+msgstr ""
+
+msgid "Delete snippet"
+msgstr ""
+
+msgid "Delete snippet?"
+msgstr ""
+
+msgid "Delete source branch"
+msgstr ""
+
+msgid "Delete subscription"
+msgstr ""
+
+msgid "Delete table"
+msgstr ""
+
+msgid "Delete this attachment"
+msgstr ""
+
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
+msgid "Delete this project"
+msgstr ""
+
+msgid "Delete user list"
+msgstr ""
+
+msgid "Delete variable"
+msgstr ""
+
+msgid "Delete video"
+msgstr ""
+
+msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove project repository. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove project snippets. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove some tags in project container registry. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove webhooks. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove wiki repository. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteValueStream|'%{name}' Value Stream deleted"
+msgstr ""
+
+msgid "DeleteValueStream|Are you sure you want to delete the \"%{name}\" Value Stream?"
+msgstr ""
+
+msgid "DeleteValueStream|Delete %{name}"
+msgstr ""
+
+msgid "Deleted"
+msgstr ""
+
+msgid "Deleted chat nickname: %{chat_name}!"
+msgstr ""
+
+msgid "Deleted projects cannot be restored!"
+msgstr ""
+
+msgid "Deleted the source branch."
+msgstr ""
+
+msgid "Deletes the source branch"
+msgstr ""
+
+msgid "Deletes the source branch."
+msgstr ""
+
+msgid "Deleting"
+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 the project will delete its repository and all related resources, including issues and merge requests."
+msgstr ""
+
+msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
+msgstr ""
+
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Denied authorization of chat nickname %{user_name}."
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Deny access request"
+msgstr ""
+
+msgid "Dependencies"
+msgstr ""
+
+msgid "Dependencies help page link"
+msgstr ""
+
+msgid "Dependencies|%d additional vulnerability not shown"
+msgid_plural "Dependencies|%d additional vulnerabilities not shown"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dependencies|%d more"
+msgid_plural "Dependencies|%d more"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dependencies|%d vulnerability detected"
+msgid_plural "Dependencies|%d vulnerabilities detected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dependencies|%{remainingLicensesCount} more"
+msgstr ""
+
+msgid "Dependencies|(top level)"
+msgstr ""
+
+msgid "Dependencies|All"
+msgstr ""
+
+msgid "Dependencies|Component"
+msgstr ""
+
+msgid "Dependencies|Component name"
+msgstr ""
+
+msgid "Dependencies|Dependency path"
+msgstr ""
+
+msgid "Dependencies|Export as JSON"
+msgstr ""
+
+msgid "Dependencies|Job failed to generate the dependency list"
+msgstr ""
+
+msgid "Dependencies|Learn more about dependency paths"
+msgstr ""
+
+msgid "Dependencies|License"
+msgstr ""
+
+msgid "Dependencies|Location"
+msgstr ""
+
+msgid "Dependencies|Location and dependency path"
+msgstr ""
+
+msgid "Dependencies|Packager"
+msgstr ""
+
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
+msgstr ""
+
+msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
+msgstr ""
+
+msgid "Dependencies|The component dependency path is based on the lock file. There may be several paths. In these cases, the longest path is displayed."
+msgstr ""
+
+msgid "Dependencies|There may be multiple paths"
+msgstr ""
+
+msgid "Dependencies|Toggle vulnerability list"
+msgstr ""
+
+msgid "Dependencies|Unsupported file(s) detected"
+msgstr ""
+
+msgid "Dependencies|Vulnerable components"
+msgstr ""
+
+msgid "Dependency List"
+msgstr ""
+
+msgid "Dependency List has no entries"
+msgstr ""
+
+msgid "Dependency Proxy"
+msgstr ""
+
+msgid "Dependency Scanning"
+msgstr ""
+
+msgid "Dependency list"
+msgstr ""
+
+msgid "DependencyProxy|All items in the cache are scheduled for removal."
+msgstr ""
+
+msgid "DependencyProxy|Cached %{time}"
+msgstr ""
+
+msgid "DependencyProxy|Clear cache"
+msgstr ""
+
+msgid "DependencyProxy|Clear the Dependency Proxy cache automatically"
+msgstr ""
+
+msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
+msgstr ""
+
+msgid "DependencyProxy|Copy prefix"
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy image prefix"
+msgstr ""
+
+msgid "DependencyProxy|Enable Dependency Proxy"
+msgstr ""
+
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
+msgstr ""
+
+msgid "DependencyProxy|Image list"
+msgstr ""
+
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
+msgid "DependencyProxy|There are no images in the cache"
+msgstr ""
+
+msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
+msgstr ""
+
+msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
+msgstr ""
+
+msgid "Depends on %d merge request being merged"
+msgid_plural "Depends on %d merge requests being merged"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge request."
+msgid_plural "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge requests."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Deploy"
+msgid_plural "Deploys"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Deploy Keys"
+msgstr ""
+
+msgid "Deploy Token"
+msgstr ""
+
+msgid "Deploy container based web apps on Google managed clusters"
+msgstr ""
+
+msgid "Deploy freezes"
+msgstr ""
+
+msgid "Deploy key was successfully updated."
+msgstr ""
+
+msgid "Deploy keys"
+msgstr ""
+
+msgid "Deploy keys grant read/write access to all repositories in your instance"
+msgstr ""
+
+msgid "Deploy progress not found. To see pods, ensure your environment matches %{linkStart}deploy board criteria%{linkEnd}."
+msgstr ""
+
+msgid "Deploy static assets and resources to Google managed CDN"
+msgstr ""
+
+msgid "Deploy to..."
+msgstr ""
+
+msgid "DeployBoards|To see deployment progress for your environments, make sure you are deploying to %{codeStart}$KUBE_NAMESPACE%{codeEnd} and annotating with %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} and %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
+msgstr ""
+
+msgid "DeployBoard|Kubernetes Pods"
+msgstr ""
+
+msgid "DeployFreeze|Add a freeze period to prevent unintended releases during a period of time for a given environment. You must update the deployment jobs in %{filename} according to the deploy freezes added here. %{freeze_period_link_start}Learn more.%{freeze_period_link_end}"
+msgstr ""
+
+msgid "DeployFreeze|Add deploy freeze"
+msgstr ""
+
+msgid "DeployFreeze|Delete"
+msgstr ""
+
+msgid "DeployFreeze|Delete deploy freeze?"
+msgstr ""
+
+msgid "DeployFreeze|Delete freeze period"
+msgstr ""
+
+msgid "DeployFreeze|Deploy freeze from %{start} to %{end} in %{timezone} will be removed. Are you sure?"
+msgstr ""
+
+msgid "DeployFreeze|Edit"
+msgstr ""
+
+msgid "DeployFreeze|Freeze end"
+msgstr ""
+
+msgid "DeployFreeze|Freeze start"
+msgstr ""
+
+msgid "DeployFreeze|No deploy freezes exist for this project. To add one, select %{strongStart}Add deploy freeze%{strongEnd}"
+msgstr ""
+
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
+msgstr ""
+
+msgid "DeployFreeze|Time zone"
+msgstr ""
+
+msgid "DeployKeys|+%{count} others"
+msgstr ""
+
+msgid "DeployKeys|Current project"
+msgstr ""
+
+msgid "DeployKeys|Deploy key"
+msgstr ""
+
+msgid "DeployKeys|Enabled deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Error enabling deploy key"
+msgstr ""
+
+msgid "DeployKeys|Error getting deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Error removing deploy key"
+msgstr ""
+
+msgid "DeployKeys|Expand %{count} other projects"
+msgstr ""
+
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
+msgid "DeployKeys|Loading deploy keys"
+msgstr ""
+
+msgid "DeployKeys|No deploy keys found. Create one with the form above."
+msgstr ""
+
+msgid "DeployKeys|Privately accessible deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Project usage"
+msgstr ""
+
+msgid "DeployKeys|Publicly accessible deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Read access only"
+msgstr ""
+
+msgid "DeployTokens|Active Deploy Tokens (%{active_tokens})"
+msgstr ""
+
+msgid "DeployTokens|Allows read and write access to the package registry."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to the package registry."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
+
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
+
+msgid "DeployTokens|Copy deploy token"
+msgstr ""
+
+msgid "DeployTokens|Copy username"
+msgstr ""
+
+msgid "DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Create deploy token"
+msgstr ""
+
+msgid "DeployTokens|Created"
+msgstr ""
+
+msgid "DeployTokens|Deploy tokens"
+msgstr ""
+
+msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
+msgstr ""
+
+msgid "DeployTokens|Enter a unique name for your deploy token."
+msgstr ""
+
+msgid "DeployTokens|Enter a username for your token. Defaults to %{code_start}gitlab+deploy-token-{n}%{code_end}."
+msgstr ""
+
+msgid "DeployTokens|Enter an expiration date for your token. Defaults to never expire."
+msgstr ""
+
+msgid "DeployTokens|Expires"
+msgstr ""
+
+msgid "DeployTokens|Group deploy tokens allow access to the packages, repositories, and registry images within the group."
+msgstr ""
+
+msgid "DeployTokens|Name"
+msgstr ""
+
+msgid "DeployTokens|New deploy token"
+msgstr ""
+
+msgid "DeployTokens|Revoke"
+msgstr ""
+
+msgid "DeployTokens|Revoke %{name}"
+msgstr ""
+
+msgid "DeployTokens|Scopes"
+msgstr ""
+
+msgid "DeployTokens|This %{entity_type} has no active Deploy Tokens."
+msgstr ""
+
+msgid "DeployTokens|This action cannot be undone."
+msgstr ""
+
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
+msgstr ""
+
+msgid "DeployTokens|Username"
+msgstr ""
+
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
+
+msgid "DeployTokens|Your new group deploy token has been created."
+msgstr ""
+
+msgid "DeployTokens|Your new project deploy token has been created."
+msgstr ""
+
+msgid "Deployed"
+msgstr ""
+
+msgid "Deployed to"
+msgstr ""
+
+msgid "Deployed-after"
+msgstr ""
+
+msgid "Deployed-before"
+msgstr ""
+
+msgid "Deploying to"
+msgstr ""
+
+msgid "Deploying to AWS is easy with GitLab"
+msgstr ""
+
+msgid "Deployment"
+msgstr ""
+
+msgid "Deployment Frequency"
+msgstr ""
+
+msgid "Deployment Target|%{linkStart}How to provision or deploy to Kubernetes clusters from GitLab?%{linkEnd}"
+msgstr ""
+
+msgid "Deployment Target|Project deployment target (optional)"
+msgstr ""
+
+msgid "Deployment Target|Select the deployment target"
+msgstr ""
+
+msgid "Deployment frequency"
+msgstr ""
+
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
+msgid "DeploymentTarget|GitLab Pages"
+msgstr ""
+
+msgid "DeploymentTarget|Heroku"
+msgstr ""
+
+msgid "DeploymentTarget|Infrastructure provider (Terraform, Cloudformation, and so on)"
+msgstr ""
+
+msgid "DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)"
+msgstr ""
+
+msgid "DeploymentTarget|Managed container runtime (Fargate, Cloud Run, DigitalOcean App)"
+msgstr ""
+
+msgid "DeploymentTarget|Mobile app store"
+msgstr ""
+
+msgid "DeploymentTarget|No deployment planned"
+msgstr ""
+
+msgid "DeploymentTarget|Other hosting service"
+msgstr ""
+
+msgid "DeploymentTarget|Registry (package or container)"
+msgstr ""
+
+msgid "DeploymentTarget|Self-managed container runtime (Podman, Docker Swarm, Docker Compose)"
+msgstr ""
+
+msgid "DeploymentTarget|Serverless backend (Lambda, Cloud functions)"
+msgstr ""
+
+msgid "DeploymentTarget|Virtual machine (for example, EC2)"
+msgstr ""
+
+msgid "Deployments"
+msgstr ""
+
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Deployment|API"
+msgstr ""
+
+msgid "Deployment|Cancelled"
+msgstr ""
+
+msgid "Deployment|Created"
+msgstr ""
+
+msgid "Deployment|Deployment ID"
+msgstr ""
+
+msgid "Deployment|Failed"
+msgstr ""
+
+msgid "Deployment|Latest Deployed"
+msgstr ""
+
+msgid "Deployment|Needs Approval"
+msgstr ""
+
+msgid "Deployment|Running"
+msgstr ""
+
+msgid "Deployment|Skipped"
+msgstr ""
+
+msgid "Deployment|Success"
+msgstr ""
+
+msgid "Deployment|This deployment was created using the API"
+msgstr ""
+
+msgid "Deployment|Triggerer"
+msgstr ""
+
+msgid "Deployment|Waiting"
+msgstr ""
+
+msgid "Deployment|blocked"
+msgstr ""
+
+msgid "Deployment|canceled"
+msgstr ""
+
+msgid "Deployment|created"
+msgstr ""
+
+msgid "Deployment|failed"
+msgstr ""
+
+msgid "Deployment|running"
+msgstr ""
+
+msgid "Deployment|skipped"
+msgstr ""
+
+msgid "Deployment|success"
+msgstr ""
+
+msgid "Deprecated API rate limits"
+msgstr ""
+
+msgid "Deprecations|Feature deprecation and removal"
+msgstr ""
+
+msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
+msgstr ""
+
+msgid "Deprecations|For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
+msgstr ""
+
+msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprioritize label"
+msgstr ""
+
+msgid "Descending"
+msgstr ""
+
+msgid "Describe the goal of the changes and what reviewers should be aware of."
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgid "Description (alt text)"
+msgstr ""
+
+msgid "Description (optional)"
+msgstr ""
+
+msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}"
+msgstr ""
+
+msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Descriptive label"
+msgstr ""
+
+msgid "Design Management files and data"
+msgstr ""
+
+msgid "Design repositories"
+msgstr ""
+
+msgid "Design repository"
+msgstr ""
+
+msgid "DesignManagement|%{current_design} of %{designs_count}"
+msgstr ""
+
+msgid "DesignManagement|%{filename} did not change."
+msgid_plural "DesignManagement|The designs you tried uploading did not change."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "DesignManagement|Adding a design with the same filename replaces the file in a new version."
+msgstr ""
+
+msgid "DesignManagement|Archive design"
+msgstr ""
+
+msgid "DesignManagement|Archive designs"
+msgstr ""
+
+msgid "DesignManagement|Archive selected"
+msgstr ""
+
+msgid "DesignManagement|Archived designs will still be available in previous versions of the design collection."
+msgstr ""
+
+msgid "DesignManagement|Are you sure you want to archive the selected designs?"
+msgstr ""
+
+msgid "DesignManagement|Are you sure you want to cancel changes to this comment?"
+msgstr ""
+
+msgid "DesignManagement|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
+msgid "DesignManagement|Cancel changes"
+msgstr ""
+
+msgid "DesignManagement|Cancel comment confirmation"
+msgstr ""
+
+msgid "DesignManagement|Cancel comment update confirmation"
+msgstr ""
+
+msgid "DesignManagement|Click the image where you'd like to start a new discussion"
+msgstr ""
+
+msgid "DesignManagement|Comment"
+msgstr ""
+
+msgid "DesignManagement|Could not add a new comment. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Could not create new discussion. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Could not update discussion. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Could not update note. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Deselect all"
+msgstr ""
+
+msgid "DesignManagement|Designs"
+msgstr ""
+
+msgid "DesignManagement|Discard comment"
+msgstr ""
+
+msgid "DesignManagement|Download design"
+msgstr ""
+
+msgid "DesignManagement|Error uploading a new design. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Go back to designs"
+msgstr ""
+
+msgid "DesignManagement|Go to next design"
+msgstr ""
+
+msgid "DesignManagement|Go to previous design"
+msgstr ""
+
+msgid "DesignManagement|Keep changes"
+msgstr ""
+
+msgid "DesignManagement|Keep comment"
+msgstr ""
+
+msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
+msgstr ""
+
+msgid "DesignManagement|Resolve thread"
+msgstr ""
+
+msgid "DesignManagement|Resolved Comments"
+msgstr ""
+
+msgid "DesignManagement|Save comment"
+msgstr ""
+
+msgid "DesignManagement|Select all"
+msgstr ""
+
+msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles} and %{moreCount} more."
+msgstr ""
+
+msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles}."
+msgstr ""
+
+msgid "DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again."
+msgstr ""
+
+msgid "DesignManagement|There was an error moving your designs. Please upload your designs below."
+msgstr ""
+
+msgid "DesignManagement|To upload designs, you'll need to enable LFS and have an admin enable hashed storage. %{requirements_link_start}More information%{requirements_link_end}"
+msgstr ""
+
+msgid "DesignManagement|Unresolve thread"
+msgstr ""
+
+msgid "DesignManagement|Upload designs"
+msgstr ""
+
+msgid "DesignManagement|Upload skipped. %{reason}"
+msgstr ""
+
+msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
+msgstr ""
+
+msgid "Designs"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
+msgid "Detail"
+msgstr ""
+
+msgid "Details"
+msgstr ""
+
+msgid "Details (default)"
+msgstr ""
+
+msgid "Details block"
+msgstr ""
+
+msgid "Detect host keys"
+msgstr ""
+
+msgid "DevOps Adoption"
+msgstr ""
+
+msgid "DevOps Reports"
+msgstr ""
+
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "Devices (optional)"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
+msgid "DevopsAdoption|Add a group to get started"
+msgstr ""
+
+msgid "DevopsAdoption|Add or remove groups"
+msgstr ""
+
+msgid "DevopsAdoption|Add or remove subgroups"
+msgstr ""
+
+msgid "DevopsAdoption|Adopted"
+msgstr ""
+
+msgid "DevopsAdoption|Adoption by group"
+msgstr ""
+
+msgid "DevopsAdoption|Adoption by subgroup"
+msgstr ""
+
+msgid "DevopsAdoption|Adoption over time"
+msgstr ""
+
+msgid "DevopsAdoption|An error occurred while removing the group. 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 approval on a merge request"
+msgstr ""
+
+msgid "DevopsAdoption|At least one deploy"
+msgstr ""
+
+msgid "DevopsAdoption|At least one issue created"
+msgstr ""
+
+msgid "DevopsAdoption|At least one merge request created"
+msgstr ""
+
+msgid "DevopsAdoption|At least one pipeline successfully run"
+msgstr ""
+
+msgid "DevopsAdoption|Code owners"
+msgstr ""
+
+msgid "DevopsAdoption|Code owners enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Confirm remove Group"
+msgstr ""
+
+msgid "DevopsAdoption|DAST"
+msgstr ""
+
+msgid "DevopsAdoption|DAST enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Dependency Scanning"
+msgstr ""
+
+msgid "DevopsAdoption|Dependency Scanning enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Deploys"
+msgstr ""
+
+msgid "DevopsAdoption|Dev"
+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|Edit groups"
+msgstr ""
+
+msgid "DevopsAdoption|Edit subgroups"
+msgstr ""
+
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Data is updated at the beginning of each month. Last updated: %{timestamp}."
+msgstr ""
+
+msgid "DevopsAdoption|Fuzz Testing"
+msgstr ""
+
+msgid "DevopsAdoption|Fuzz Testing enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Issues"
+msgstr ""
+
+msgid "DevopsAdoption|MRs"
+msgstr ""
+
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
+msgid "DevopsAdoption|No tracked features"
+msgstr ""
+
+msgid "DevopsAdoption|Not adopted"
+msgstr ""
+
+msgid "DevopsAdoption|Ops"
+msgstr ""
+
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
+msgid "DevopsAdoption|Pipelines"
+msgstr ""
+
+msgid "DevopsAdoption|Remove Group"
+msgstr ""
+
+msgid "DevopsAdoption|Remove Group from the table."
+msgstr ""
+
+msgid "DevopsAdoption|Runner configured for project/group"
+msgstr ""
+
+msgid "DevopsAdoption|Runners"
+msgstr ""
+
+msgid "DevopsAdoption|SAST"
+msgstr ""
+
+msgid "DevopsAdoption|SAST enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Sec"
+msgstr ""
+
+msgid "DevopsAdoption|There was an error enabling the current group. Please refresh the page."
+msgstr ""
+
+msgid "DevopsAdoption|There was an error fetching Group adoption data. Please refresh the page."
+msgstr ""
+
+msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
+msgstr ""
+
+msgid "DevopsAdoption|This group has no subgroups"
+msgstr ""
+
+msgid "DevopsAdoption|Total number of features adopted"
+msgstr ""
+
+msgid "DevopsAdoption|You cannot remove the group you are currently in."
+msgstr ""
+
+msgid "DevopsReport|DevOps Score"
+msgstr ""
+
+msgid "DevopsReport|DevOps score metrics are based on usage over the last 30 days. Last updated: %{timestamp}."
+msgstr ""
+
+msgid "DevopsReport|High"
+msgstr ""
+
+msgid "DevopsReport|Leader usage"
+msgstr ""
+
+msgid "DevopsReport|Low"
+msgstr ""
+
+msgid "DevopsReport|Moderate"
+msgstr ""
+
+msgid "DevopsReport|Overview"
+msgstr ""
+
+msgid "DevopsReport|Score"
+msgstr ""
+
+msgid "DevopsReport|Your score"
+msgstr ""
+
+msgid "DevopsReport|Your usage"
+msgstr ""
+
+msgid "Diagram (%{language})"
+msgstr ""
+
+msgid "Did not delete the source branch."
+msgstr ""
+
+msgid "Didn't receive a confirmation email?"
+msgstr ""
+
+msgid "Didn't receive confirmation instructions?"
+msgstr ""
+
+msgid "Didn't receive unlock instructions?"
+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 notes"
+msgstr ""
+
+msgid "Difference between start date and now"
+msgstr ""
+
+msgid "DiffsCompareBaseBranch|(HEAD)"
+msgstr ""
+
+msgid "DiffsCompareBaseBranch|(base)"
+msgstr ""
+
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|Expand all lines"
+msgstr ""
+
+msgid "Diffs|Next 20 lines"
+msgstr ""
+
+msgid "Diffs|No file name available"
+msgstr ""
+
+msgid "Diffs|Previous 20 lines"
+msgstr ""
+
+msgid "Diffs|Show %{unfoldCount} lines"
+msgstr ""
+
+msgid "Diffs|Show all unchanged lines"
+msgstr ""
+
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|Something went wrong while fetching diff lines."
+msgstr ""
+
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
+msgid "Direct member"
+msgstr ""
+
+msgid "Direct members"
+msgstr ""
+
+msgid "Direct non-authenticated users to this page."
+msgstr ""
+
+msgid "Direct users to this page after they sign out."
+msgstr ""
+
+msgid "Direction"
+msgstr ""
+
+msgid "Directory name"
+msgstr ""
+
+msgid "Disable"
+msgstr ""
+
+msgid "Disable Two-factor Authentication"
+msgstr ""
+
+msgid "Disable What's new"
+msgstr ""
+
+msgid "Disable for this project"
+msgstr ""
+
+msgid "Disable group runners"
+msgstr ""
+
+msgid "Disable two-factor authentication"
+msgstr ""
+
+msgid "Disabled"
+msgstr ""
+
+msgid "Disabled by %{parent} owner"
+msgstr ""
+
+msgid "Disabled mirrors can only be enabled by instance owners. It is recommended that you delete them."
+msgstr ""
+
+msgid "Discard"
+msgstr ""
+
+msgid "Discard all changes"
+msgstr ""
+
+msgid "Discard all changes?"
+msgstr ""
+
+msgid "Discard changes"
+msgstr ""
+
+msgid "Discard changes to %{path}?"
+msgstr ""
+
+msgid "Discard draft"
+msgstr ""
+
+msgid "DiscordService|Discord Notifications"
+msgstr ""
+
+msgid "DiscordService|Send notifications about project events to a Discord channel."
+msgstr ""
+
+msgid "Discover"
+msgstr ""
+
+msgid "Discover GitLab Geo"
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Discover|Check your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of services."
+msgstr ""
+
+msgid "Discover|For code that's already live in production, our dashboards give you an easy way to prioritize any issues that are found, empowering your team to ship quickly and securely."
+msgstr ""
+
+msgid "Discover|GitLab will perform static and dynamic tests on the code of your application, looking for known flaws and report them in the merge request so you can fix them before merging."
+msgstr ""
+
+msgid "Discover|Security capabilities, integrated into your development lifecycle"
+msgstr ""
+
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
+msgstr ""
+
+msgid "Discover|Start a free trial"
+msgstr ""
+
+msgid "Discover|Upgrade now"
+msgstr ""
+
+msgid "Discuss a specific suggestion or question internally that needs to be resolved."
+msgstr ""
+
+msgid "Discuss a specific suggestion or question internally."
+msgstr ""
+
+msgid "Discuss a specific suggestion or question that needs to be resolved."
+msgstr ""
+
+msgid "Discuss a specific suggestion or question."
+msgstr ""
+
+msgid "Discussion to reply to cannot be found"
+msgstr ""
+
+msgid "Disk Usage"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
+msgid "Dismiss %d selected vulnerability as"
+msgid_plural "Dismiss %d selected vulnerabilities as"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dismiss Alert"
+msgstr ""
+
+msgid "Dismiss merge request promotion"
+msgstr ""
+
+msgid "Dismiss selected"
+msgstr ""
+
+msgid "Dismiss trial promotion"
+msgstr ""
+
+msgid "Dismissable"
+msgstr ""
+
+msgid "Dismissed"
+msgstr ""
+
+msgid "Dismissed at %{projectLink}"
+msgstr ""
+
+msgid "Dismissed on pipeline %{pipelineLink}"
+msgstr ""
+
+msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
+msgstr ""
+
+msgid "Display"
+msgstr ""
+
+msgid "Display alerts from all configured monitoring tools."
+msgstr ""
+
+msgid "Display milestones"
+msgstr ""
+
+msgid "Display name"
+msgstr ""
+
+msgid "Display progress of child issues"
+msgstr ""
+
+msgid "Display rendered file"
+msgstr ""
+
+msgid "Display source"
+msgstr ""
+
+msgid "Display time tracking in issues in total hours only. %{link_start}What is time tracking?%{link_end}"
+msgstr ""
+
+msgid "Do not display content for customer experience improvement and offers from third parties"
+msgstr ""
+
+msgid "Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}"
+msgstr ""
+
+msgid "Do you want to remove this deploy key?"
+msgstr ""
+
+msgid "Dockerfile"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
+msgid "Documentation pages URL"
+msgstr ""
+
+msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
+msgstr ""
+
+msgid "Does not delete the source branch."
+msgstr ""
+
+msgid "Domain"
+msgstr ""
+
+msgid "Domain Name"
+msgstr ""
+
+msgid "Don't have a group?"
+msgstr ""
+
+msgid "Don't have an account yet?"
+msgstr ""
+
+msgid "Don't include description in commit message"
+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 service data"
+msgstr ""
+
+msgid "Don't show again"
+msgstr ""
+
+msgid "Done"
+msgstr ""
+
+msgid "Dormant users"
+msgstr ""
+
+msgid "Download"
+msgstr ""
+
+msgid "Download %{format}"
+msgstr ""
+
+msgid "Download %{format}:"
+msgstr ""
+
+msgid "Download (%{fileSizeReadable})"
+msgstr ""
+
+msgid "Download (%{size})"
+msgstr ""
+
+msgid "Download CSV"
+msgstr ""
+
+msgid "Download PDF"
+msgstr ""
+
+msgid "Download artifacts"
+msgstr ""
+
+msgid "Download codes"
+msgstr ""
+
+msgid "Download evidence JSON"
+msgstr ""
+
+msgid "Download export"
+msgstr ""
+
+msgid "Download image"
+msgstr ""
+
+msgid "Download payload"
+msgstr ""
+
+msgid "Download raw data (.csv)"
+msgstr ""
+
+msgid "Download source code"
+msgstr ""
+
+msgid "Download this directory"
+msgstr ""
+
+msgid "DownloadCommit|Email Patches"
+msgstr ""
+
+msgid "DownloadCommit|Plain Diff"
+msgstr ""
+
+msgid "DownloadSource|Download"
+msgstr ""
+
+msgid "Downstream"
+msgstr ""
+
+msgid "Downvotes"
+msgstr ""
+
+msgid "Draft"
+msgstr ""
+
+msgid "Draft: %{filename}"
+msgstr ""
+
+msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
+msgstr ""
+
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
+msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
+msgstr ""
+
+msgid "Drop your designs to start your upload."
+msgstr ""
+
+msgid "Drop your files to start your upload."
+msgstr ""
+
+msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
+msgstr ""
+
+msgid "DropdownWidget|Assign %{issuableAttribute}"
+msgstr ""
+
+msgid "DropdownWidget|Failed to fetch the %{issuableAttribute} for this %{issuableType}. Please try again."
+msgstr ""
+
+msgid "DropdownWidget|Failed to set %{issuableAttribute} on this %{issuableType}. Please try again."
+msgstr ""
+
+msgid "DropdownWidget|No %{issuableAttribute}"
+msgstr ""
+
+msgid "DropdownWidget|No %{issuableAttribute} found"
+msgstr ""
+
+msgid "DropdownWidget|No open %{issuableAttribute} found"
+msgstr ""
+
+msgid "Due Date"
+msgstr ""
+
+msgid "Due date"
+msgstr ""
+
+msgid "Due to inactivity, the %{project_link} project is scheduled to be deleted on %{b_open}%{deletion_date}%{b_close}. To unschedule the deletion of %{project_link}, perform some activity on it. For example:"
+msgstr ""
+
+msgid "Due to inactivity, the %{project_name} (%{project_link}) project is scheduled to be deleted on %{deletion_date}. To unschedule the deletion of %{project_name}, perform some activity on it. For example:"
+msgstr ""
+
+msgid "Due to inactivity, this project is scheduled to be deleted on %{deletion_date}. %{link_start}Why is this scheduled?%{link_end}"
+msgstr ""
+
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Duration (min)"
+msgstr ""
+
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
+msgid "Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "E-mail:"
+msgstr ""
+
+msgid "Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "Edit %{name}"
+msgstr ""
+
+msgid "Edit %{profileType} profile"
+msgstr ""
+
+msgid "Edit Comment"
+msgstr ""
+
+msgid "Edit Deploy Key"
+msgstr ""
+
+msgid "Edit Geo Site"
+msgstr ""
+
+msgid "Edit Group Hook"
+msgstr ""
+
+msgid "Edit Identity"
+msgstr ""
+
+msgid "Edit Label"
+msgstr ""
+
+msgid "Edit Milestone"
+msgstr ""
+
+msgid "Edit Password"
+msgstr ""
+
+msgid "Edit Pipeline Schedule"
+msgstr ""
+
+msgid "Edit Release"
+msgstr ""
+
+msgid "Edit Requirement"
+msgstr ""
+
+msgid "Edit Slack integration"
+msgstr ""
+
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit System Hook"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
+msgid "Edit audio description"
+msgstr ""
+
+msgid "Edit comment"
+msgstr ""
+
+msgid "Edit commit message"
+msgstr ""
+
+msgid "Edit deploy freeze"
+msgstr ""
+
+msgid "Edit deploy key"
+msgstr ""
+
+msgid "Edit description"
+msgstr ""
+
+msgid "Edit environment"
+msgstr ""
+
+msgid "Edit epics"
+msgstr ""
+
+msgid "Edit files in the editor and commit changes here"
+msgstr ""
+
+msgid "Edit fork in Web IDE"
+msgstr ""
+
+msgid "Edit group application"
+msgstr ""
+
+msgid "Edit group: %{group_name}"
+msgstr ""
+
+msgid "Edit identity for %{user_name}"
+msgstr ""
+
+msgid "Edit image description"
+msgstr ""
+
+msgid "Edit in pipeline editor"
+msgstr ""
+
+msgid "Edit in single-file editor"
+msgstr ""
+
+msgid "Edit inline"
+msgstr ""
+
+msgid "Edit issues"
+msgstr ""
+
+msgid "Edit link"
+msgstr ""
+
+msgid "Edit merge requests"
+msgstr ""
+
+msgid "Edit public deploy key"
+msgstr ""
+
+msgid "Edit sidebar"
+msgstr ""
+
+msgid "Edit table"
+msgstr ""
+
+msgid "Edit this file only."
+msgstr ""
+
+msgid "Edit this release"
+msgstr ""
+
+msgid "Edit title and description"
+msgstr ""
+
+msgid "Edit topic: %{topic_name}"
+msgstr ""
+
+msgid "Edit user: %{user_name}"
+msgstr ""
+
+msgid "Edit video description"
+msgstr ""
+
+msgid "Edit wiki page"
+msgstr ""
+
+msgid "Edit your most recent comment in a thread (from an empty textarea)"
+msgstr ""
+
+msgid "Edit, lint, and visualize your pipeline."
+msgstr ""
+
+msgid "Edited"
+msgstr ""
+
+msgid "Edited %{timeago}"
+msgstr ""
+
+msgid "Editing"
+msgstr ""
+
+msgid "Elapsed time"
+msgstr ""
+
+msgid "Elasticsearch AWS IAM credentials"
+msgstr ""
+
+msgid "Elasticsearch HTTP client timeout value in seconds."
+msgstr ""
+
+msgid "Elasticsearch indexing restrictions"
+msgstr ""
+
+msgid "Elasticsearch indexing started"
+msgstr ""
+
+msgid "Elasticsearch migration halted"
+msgstr ""
+
+msgid "Elasticsearch reindexing is already in progress"
+msgstr ""
+
+msgid "Elasticsearch reindexing triggered"
+msgstr ""
+
+msgid "Elasticsearch reindexing was not started: %{errors}"
+msgstr ""
+
+msgid "Elasticsearch zero-downtime reindexing"
+msgstr ""
+
+msgid "Elasticsearch's region."
+msgstr ""
+
+msgid "Elastic|None. Select namespaces to index."
+msgstr ""
+
+msgid "Elastic|None. Select projects to index."
+msgstr ""
+
+msgid "Eligible users"
+msgstr ""
+
+msgid "Email"
+msgstr ""
+
+msgid "Email %{number}"
+msgstr ""
+
+msgid "Email Notification"
+msgstr ""
+
+msgid "Email a new %{name} to this project"
+msgstr ""
+
+msgid "Email address suffix"
+msgstr ""
+
+msgid "Email address to use for Support Desk"
+msgstr ""
+
+msgid "Email could not be sent"
+msgstr ""
+
+msgid "Email display name"
+msgstr ""
+
+msgid "Email not verified. Please verify your email in Salesforce."
+msgstr ""
+
+msgid "Email notification for unknown sign-ins"
+msgstr ""
+
+msgid "Email patch"
+msgstr ""
+
+msgid "Email patches"
+msgstr ""
+
+msgid "Email sent"
+msgstr ""
+
+msgid "Email the pipeline status to a list of recipients."
+msgstr ""
+
+msgid "Email updates (optional)"
+msgstr ""
+
+msgid "Email:"
+msgstr ""
+
+msgid "Email: %{email}"
+msgstr ""
+
+msgid "EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies."
+msgstr ""
+
+msgid "EmailError|The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member."
+msgstr ""
+
+msgid "EmailError|We couldn't figure out what the email is for. Please create your issue or comment through the web interface."
+msgstr ""
+
+msgid "EmailError|We couldn't figure out what the email is in reply to. Please create your comment through the web interface."
+msgstr ""
+
+msgid "EmailError|We couldn't figure out what user corresponds to the email. Please create your comment through the web interface."
+msgstr ""
+
+msgid "EmailError|We couldn't find the project. Please check if there's any typo."
+msgstr ""
+
+msgid "EmailError|We couldn't process your email because it is too large. Please create your issue or comment through the web interface."
+msgstr ""
+
+msgid "EmailError|You are not allowed to perform this action. If you believe this is in error, contact a staff member."
+msgstr ""
+
+msgid "EmailError|Your account has been blocked. If you believe this is in error, contact a staff member."
+msgstr ""
+
+msgid "EmailParticipantsWarning|%{emails} will be notified of your comment."
+msgstr ""
+
+msgid "EmailParticipantsWarning|%{emails}, %{andMore} will be notified of your comment."
+msgstr ""
+
+msgid "EmailParticipantsWarning|and %{moreCount} more"
+msgstr ""
+
+msgid "Emails"
+msgstr ""
+
+msgid "Emails sent from Service Desk have this name."
+msgstr ""
+
+msgid "Emails sent to %{email} are also supported."
+msgstr ""
+
+msgid "EmailsOnPushService|Disable code diffs"
+msgstr ""
+
+msgid "EmailsOnPushService|Don't include possibly sensitive code diffs in notification body."
+msgstr ""
+
+msgid "EmailsOnPushService|Email the commits and diff of each push to a list of recipients."
+msgstr ""
+
+msgid "EmailsOnPushService|Emails on push"
+msgstr ""
+
+msgid "EmailsOnPushService|Emails separated by whitespace."
+msgstr ""
+
+msgid "EmailsOnPushService|Send from committer"
+msgstr ""
+
+msgid "EmailsOnPushService|Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as %{domains})."
+msgstr ""
+
+msgid "EmailsOnPushService|tanuki@example.com gitlab@example.com"
+msgstr ""
+
+msgid "Embed"
+msgstr ""
+
+msgid "Empty file"
+msgstr ""
+
+msgid "Enable"
+msgstr ""
+
+msgid "Enable Akismet"
+msgstr ""
+
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
+msgid "Enable Auto DevOps"
+msgstr ""
+
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
+msgid "Enable Gitpod"
+msgstr ""
+
+msgid "Enable Gitpod?"
+msgstr ""
+
+msgid "Enable Invisible Captcha during sign up"
+msgstr ""
+
+msgid "Enable Kroki"
+msgstr ""
+
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
+msgid "Enable PlantUML"
+msgstr ""
+
+msgid "Enable SSL verification"
+msgstr ""
+
+msgid "Enable Sentry error tracking"
+msgstr ""
+
+msgid "Enable Snowplow tracking"
+msgstr ""
+
+msgid "Enable Spam Check via external API endpoint"
+msgstr ""
+
+msgid "Enable What's new: All tiers"
+msgstr ""
+
+msgid "Enable What's new: Current tier only"
+msgstr ""
+
+msgid "Enable access to the performance bar for non-administrators in a given group."
+msgstr ""
+
+msgid "Enable admin mode"
+msgstr ""
+
+msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Enable authenticated API request rate limit"
+msgstr ""
+
+msgid "Enable authenticated Git LFS request rate limit"
+msgstr ""
+
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
+msgid "Enable authentication"
+msgstr ""
+
+msgid "Enable automatic repository housekeeping"
+msgstr ""
+
+msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
+msgstr ""
+
+msgid "Enable container expiration caching."
+msgstr ""
+
+msgid "Enable email notification"
+msgstr ""
+
+msgid "Enable error tracking"
+msgstr ""
+
+msgid "Enable feature to choose access level"
+msgstr ""
+
+msgid "Enable for this project"
+msgstr ""
+
+msgid "Enable group runners"
+msgstr ""
+
+msgid "Enable header and footer in emails"
+msgstr ""
+
+msgid "Enable health and performance metrics endpoint"
+msgstr ""
+
+msgid "Enable in-product marketing emails"
+msgstr ""
+
+msgid "Enable incident management inbound alert limit"
+msgstr ""
+
+msgid "Enable integration"
+msgstr ""
+
+msgid "Enable logs collection"
+msgstr ""
+
+msgid "Enable maintenance mode"
+msgstr ""
+
+msgid "Enable multipart emails"
+msgstr ""
+
+msgid "Enable only for confidential applications exclusively used by a trusted backend server that can securely store the client secret. Do not enable for native-mobile, single-page, or other JavaScript applications because they cannot keep the client secret confidential."
+msgstr ""
+
+msgid "Enable or disable version check and Service Ping."
+msgstr ""
+
+msgid "Enable rate limiting for POST requests to the specified paths"
+msgstr ""
+
+msgid "Enable reCAPTCHA"
+msgstr ""
+
+msgid "Enable reCAPTCHA for login."
+msgstr ""
+
+msgid "Enable repository checks"
+msgstr ""
+
+msgid "Enable security training"
+msgstr ""
+
+msgid "Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
+msgstr ""
+
+msgid "Enable shared runners for all projects and subgroups in this group."
+msgstr ""
+
+msgid "Enable shared runners for this group"
+msgstr ""
+
+msgid "Enable shared runners for this project"
+msgstr ""
+
+msgid "Enable two-factor authentication"
+msgstr ""
+
+msgid "Enable unauthenticated API request rate limit"
+msgstr ""
+
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
+msgstr ""
+
+msgid "Enable version check"
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 1%{stepEnd}. Ensure you have Kubernetes set up and have a base domain for your %{linkStart}cluster%{linkEnd}."
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 2%{stepEnd}. Copy the following snippet:"
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 3%{stepEnd}. Add it to the project %{linkStart}gitlab-ci.yml%{linkEnd} file."
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 4 (optional)%{stepEnd}. Enable Visual Reviews by following the %{linkStart}setup instructions%{linkEnd}."
+msgstr ""
+
+msgid "EnableReviewApp|Close"
+msgstr ""
+
+msgid "EnableReviewApp|Copy snippet text"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "Enabled Git access protocols"
+msgstr ""
+
+msgid "Enabled OAuth authentication sources"
+msgstr ""
+
+msgid "Encountered an error while rendering: %{err}"
+msgstr ""
+
+msgid "End Time"
+msgstr ""
+
+msgid "Ends"
+msgstr ""
+
+msgid "Ends at (UTC)"
+msgstr ""
+
+msgid "Ends on"
+msgstr ""
+
+msgid "Ends: %{endsAt}"
+msgstr ""
+
+msgid "Enforce two-factor authentication"
+msgstr ""
+
+msgid "Enforce two-factor authentication for all user sign-ins."
+msgstr ""
+
+msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
+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 ""
+
+msgid "Enter Admin Mode"
+msgstr ""
+
+msgid "Enter a number"
+msgstr ""
+
+msgid "Enter an integer number between 0 and 100"
+msgstr ""
+
+msgid "Enter any color or choose one of the suggested colors below."
+msgstr ""
+
+msgid "Enter any color."
+msgstr ""
+
+msgid "Enter at least three characters to search"
+msgstr ""
+
+msgid "Enter in your Bitbucket Server URL and personal access token below"
+msgstr ""
+
+msgid "Enter in your Phabricator Server URL and personal access token below"
+msgstr ""
+
+msgid "Enter license key"
+msgstr ""
+
+msgid "Enter merge request URLs"
+msgstr ""
+
+msgid "Enter new AWS Secret Access Key"
+msgstr ""
+
+msgid "Enter number of issues"
+msgstr ""
+
+msgid "Enter one or more user ID separated by commas"
+msgstr ""
+
+msgid "Enter the %{name} description"
+msgstr ""
+
+msgid "Enter the %{name} title"
+msgstr ""
+
+msgid "Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes."
+msgstr ""
+
+msgid "Enter the following to confirm:"
+msgstr ""
+
+msgid "Enter the name of your application, and we'll return a unique %{type}."
+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 the password for password-protected Elasticsearch servers."
+msgstr ""
+
+msgid "Enter the username for password-protected Elasticsearch servers."
+msgstr ""
+
+msgid "Enter your Packagist server. Defaults to https://packagist.org."
+msgstr ""
+
+msgid "Enter your Packagist token."
+msgstr ""
+
+msgid "Enter your Packagist username."
+msgstr ""
+
+msgid "Enter your password to approve"
+msgstr ""
+
+msgid "Enterprise"
+msgstr ""
+
+msgid "Environment"
+msgstr ""
+
+msgid "Environment is required for Stages::MetricEndpointInserter"
+msgstr ""
+
+msgid "Environment is required for Stages::VariableEndpointInserter"
+msgstr ""
+
+msgid "Environment scope"
+msgstr ""
+
+msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
+msgstr ""
+
+msgid "Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default."
+msgstr ""
+
+msgid "Environment:"
+msgstr ""
+
+msgid "EnvironmentDashboard|API"
+msgstr ""
+
+msgid "EnvironmentDashboard|Created through the Deployment API"
+msgstr ""
+
+msgid "EnvironmentDashboard|You are looking at the last updated environment"
+msgstr ""
+
+msgid "Environments"
+msgstr ""
+
+msgid "Environments Dashboard"
+msgstr ""
+
+msgid "Environments allow you to track deployments of your application. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "Environments in %{name}"
+msgstr ""
+
+msgid "EnvironmentsAlert|%{severity} • %{title} %{text}. %{linkStart}View Details%{linkEnd} · %{startedAt} "
+msgstr ""
+
+msgid "EnvironmentsDashboard|Add a project to the dashboard"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Add projects"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Environments Dashboard"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Job: %{job}"
+msgstr ""
+
+msgid "EnvironmentsDashboard|More actions"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Remove"
+msgstr ""
+
+msgid "EnvironmentsDashboard|The environments dashboard provides a summary of each project's environments' status, including pipeline and alert statuses."
+msgstr ""
+
+msgid "EnvironmentsDashboard|This dashboard displays 3 environments per project, and is linked to the Operations Dashboard. When you add or remove a project from one dashboard, GitLab adds or removes the project from the other. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "Environments|An error occurred while canceling the auto stop, please try again"
+msgstr ""
+
+msgid "Environments|An error occurred while deleting the environment. Check if the environment stopped; if not, stop it and try again."
+msgstr ""
+
+msgid "Environments|An error occurred while fetching the environments."
+msgstr ""
+
+msgid "Environments|An error occurred while making the request."
+msgstr ""
+
+msgid "Environments|An error occurred while re-deploying the environment, please try again"
+msgstr ""
+
+msgid "Environments|An error occurred while rolling back the environment, please try again"
+msgstr ""
+
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
+msgid "Environments|Auto stop"
+msgstr ""
+
+msgid "Environments|Auto stops %{autoStopAt}"
+msgstr ""
+
+msgid "Environments|Commit"
+msgstr ""
+
+msgid "Environments|Delete"
+msgstr ""
+
+msgid "Environments|Delete '%{environmentName}'?"
+msgstr ""
+
+msgid "Environments|Delete environment"
+msgstr ""
+
+msgid "Environments|Deleting the '%{environmentName}' environment cannot be undone. Do you want to delete it anyway?"
+msgstr ""
+
+msgid "Environments|Deploy to..."
+msgstr ""
+
+msgid "Environments|Deployment"
+msgstr ""
+
+msgid "Environments|Deployment %{status}"
+msgstr ""
+
+msgid "Environments|Enable review app"
+msgstr ""
+
+msgid "Environments|Environment"
+msgstr ""
+
+msgid "Environments|Environments"
+msgstr ""
+
+msgid "Environments|Environments are places where code gets deployed, such as staging or production."
+msgstr ""
+
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
+msgid "Environments|Job"
+msgstr ""
+
+msgid "Environments|Learn about environments"
+msgstr ""
+
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
+msgid "Environments|New environment"
+msgstr ""
+
+msgid "Environments|No deployed environments"
+msgstr ""
+
+msgid "Environments|No deployments yet"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
+msgstr ""
+
+msgid "Environments|Open"
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Re-deploy environment"
+msgstr ""
+
+msgid "Environments|Re-deploy environment %{name}?"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
+msgstr ""
+
+msgid "Environments|Rollback environment"
+msgstr ""
+
+msgid "Environments|Rollback environment %{name}?"
+msgstr ""
+
+msgid "Environments|Show all"
+msgstr ""
+
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
+msgid "Environments|Stopping %{environmentName}"
+msgstr ""
+
+msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
+msgstr ""
+
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Environments|Upcoming"
+msgstr ""
+
+msgid "Environments|Upcoming deployment"
+msgstr ""
+
+msgid "Environments|Updated"
+msgstr ""
+
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
+
+msgid "Environments|by %{avatar}"
+msgstr ""
+
+msgid "Environments|protected"
+msgstr ""
+
+msgid "Environment|Auto stop %{time}"
+msgstr ""
+
+msgid "Environment|Deployment tier"
+msgstr ""
+
+msgid "Epic"
+msgstr ""
+
+msgid "Epic Boards"
+msgstr ""
+
+msgid "Epic cannot be found."
+msgstr ""
+
+msgid "Epic details"
+msgstr ""
+
+msgid "Epic events"
+msgstr ""
+
+msgid "Epic not found for given params"
+msgstr ""
+
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Epics, issues, and merge requests"
+msgstr ""
+
+msgid "Epics|%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "Epics|%{startDate} – No due date"
+msgstr ""
+
+msgid "Epics|Add a new epic"
+msgstr ""
+
+msgid "Epics|Add an existing epic"
+msgstr ""
+
+msgid "Epics|An error occurred while saving the %{epicDateType} date"
+msgstr ""
+
+msgid "Epics|An error occurred while updating labels."
+msgstr ""
+
+msgid "Epics|Are you sure you want to remove %{bStart}%{targetIssueTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}?"
+msgstr ""
+
+msgid "Epics|Assign Epic"
+msgstr ""
+
+msgid "Epics|Leave empty to inherit from milestone dates"
+msgstr ""
+
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
+msgid "Epics|Remove epic"
+msgstr ""
+
+msgid "Epics|Remove issue"
+msgstr ""
+
+msgid "Epics|Search epics"
+msgstr ""
+
+msgid "Epics|Select epic"
+msgstr ""
+
+msgid "Epics|Show more"
+msgstr ""
+
+msgid "Epics|Something went wrong while assigning issue to epic."
+msgstr ""
+
+msgid "Epics|Something went wrong while creating child epics."
+msgstr ""
+
+msgid "Epics|Something went wrong while creating issue."
+msgstr ""
+
+msgid "Epics|Something went wrong while fetching child epics."
+msgstr ""
+
+msgid "Epics|Something went wrong while fetching epics list."
+msgstr ""
+
+msgid "Epics|Something went wrong while fetching group epics."
+msgstr ""
+
+msgid "Epics|Something went wrong while moving item."
+msgstr ""
+
+msgid "Epics|Something went wrong while ordering item."
+msgstr ""
+
+msgid "Epics|Something went wrong while removing issue from epic."
+msgstr ""
+
+msgid "Epics|Something went wrong while updating epics."
+msgstr ""
+
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
+msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
+msgstr ""
+
+msgid "Epics|This will also remove any descendents of %{bStart}%{targetEpicTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}. Are you sure?"
+msgstr ""
+
+msgid "Epics|To schedule your epic's %{epicDateType} date based on milestones, assign a milestone with a %{epicDateType} date to any issue in the epic."
+msgstr ""
+
+msgid "Epics|Unable to save epic. Please try again"
+msgstr ""
+
+msgid "Epics|due"
+msgstr ""
+
+msgid "Epics|start"
+msgstr ""
+
+msgid "Erased"
+msgstr ""
+
+msgid "Error"
+msgstr ""
+
+msgid "Error Details"
+msgstr ""
+
+msgid "Error Tracking"
+msgstr ""
+
+msgid "Error creating epic"
+msgstr ""
+
+msgid "Error creating label."
+msgstr ""
+
+msgid "Error creating new directory. Please try again."
+msgstr ""
+
+msgid "Error creating new iteration"
+msgstr ""
+
+msgid "Error creating repository for snippet with id %{snippet_id}"
+msgstr ""
+
+msgid "Error creating the snippet"
+msgstr ""
+
+msgid "Error deleting project. Check logs for error details."
+msgstr ""
+
+msgid "Error fetching burnup chart data"
+msgstr ""
+
+msgid "Error fetching diverging counts for branches. Please try again."
+msgstr ""
+
+msgid "Error fetching forked projects. Please try again."
+msgstr ""
+
+msgid "Error fetching labels."
+msgstr ""
+
+msgid "Error fetching network graph."
+msgstr ""
+
+msgid "Error fetching payload data."
+msgstr ""
+
+msgid "Error fetching refs"
+msgstr ""
+
+msgid "Error fetching the dependency list. Please check your network connection and try again."
+msgstr ""
+
+msgid "Error loading branch data. Please try again."
+msgstr ""
+
+msgid "Error loading branches."
+msgstr ""
+
+msgid "Error loading burndown chart data"
+msgstr ""
+
+msgid "Error loading countries data."
+msgstr ""
+
+msgid "Error loading file viewer."
+msgstr ""
+
+msgid "Error loading issues"
+msgstr ""
+
+msgid "Error loading iterations"
+msgstr ""
+
+msgid "Error loading last commit."
+msgstr ""
+
+msgid "Error loading markdown preview"
+msgstr ""
+
+msgid "Error loading merge requests."
+msgstr ""
+
+msgid "Error loading milestone tab"
+msgstr ""
+
+msgid "Error loading project data. Please try again."
+msgstr ""
+
+msgid "Error loading template types."
+msgstr ""
+
+msgid "Error loading template."
+msgstr ""
+
+msgid "Error loading viewer"
+msgstr ""
+
+msgid "Error occurred when fetching sidebar data"
+msgstr ""
+
+msgid "Error occurred when saving assignees"
+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 ""
+
+msgid "Error occurred. A blocked user cannot be deactivated"
+msgstr ""
+
+msgid "Error occurred. A blocked user must be unblocked to be activated"
+msgstr ""
+
+msgid "Error occurred. User was not banned"
+msgstr ""
+
+msgid "Error occurred. User was not blocked"
+msgstr ""
+
+msgid "Error occurred. User was not confirmed"
+msgstr ""
+
+msgid "Error occurred. User was not unbanned"
+msgstr ""
+
+msgid "Error occurred. User was not unblocked"
+msgstr ""
+
+msgid "Error occurred. User was not unlocked"
+msgstr ""
+
+msgid "Error parsing CSV file. Please make sure it has"
+msgstr ""
+
+msgid "Error rendering Markdown preview"
+msgstr ""
+
+msgid "Error saving label update."
+msgstr ""
+
+msgid "Error setting up editor. Please try again."
+msgstr ""
+
+msgid "Error tracking"
+msgstr ""
+
+msgid "Error updating %{issuableType}"
+msgstr ""
+
+msgid "Error updating status for all to-do items."
+msgstr ""
+
+msgid "Error updating status of to-do item."
+msgstr ""
+
+msgid "Error updating the snippet"
+msgstr ""
+
+msgid "Error uploading file"
+msgstr ""
+
+msgid "Error uploading file. Please try again."
+msgstr ""
+
+msgid "Error uploading file: %{stripped}"
+msgstr ""
+
+msgid "Error while loading the merge request. Please try again."
+msgstr ""
+
+msgid "Error while migrating %{upload_id}: %{error_message}"
+msgstr ""
+
+msgid "Error with Akismet. Please check the logs for more info."
+msgstr ""
+
+msgid "Error: %{error_message}"
+msgstr ""
+
+msgid "Error: %{error}"
+msgstr ""
+
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
+msgid "Error: No AWS credentials were supplied"
+msgstr ""
+
+msgid "Error: No AWS provision role found for user"
+msgstr ""
+
+msgid "Error: Unable to create deploy freeze"
+msgstr ""
+
+msgid "Error: Unable to delete deploy freeze"
+msgstr ""
+
+msgid "Error: Unable to find AWS role for current user"
+msgstr ""
+
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
+msgid "ErrorTracking|Active"
+msgstr ""
+
+msgid "ErrorTracking|After adding your Auth Token, select the Connect button to load projects."
+msgstr ""
+
+msgid "ErrorTracking|Auth Token"
+msgstr ""
+
+msgid "ErrorTracking|Click Connect to reestablish the connection to Sentry and activate the dropdown."
+msgstr ""
+
+msgid "ErrorTracking|Connection failed. Check Auth Token and try again."
+msgstr ""
+
+msgid "ErrorTracking|Enable error tracking"
+msgstr ""
+
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
+msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|No projects available"
+msgstr ""
+
+msgid "ErrorTracking|Select project"
+msgstr ""
+
+msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
+msgstr ""
+
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
+msgid "Errors"
+msgstr ""
+
+msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
+msgstr ""
+
+msgid "Escalate this incident"
+msgstr ""
+
+msgid "Escalation Policies"
+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 ""
+
+msgid "Escalation policy"
+msgstr ""
+
+msgid "Escalation policy:"
+msgstr ""
+
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
+msgid "EscalationPolicies|+ Add an additional rule"
+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|A user is required for adding an escalation policy."
+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|Email on-call user in schedule"
+msgstr ""
+
+msgid "EscalationPolicies|Email user"
+msgstr ""
+
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
+msgid "EscalationPolicies|Escalation policy %{obstacle} in project %{project}"
+msgstr ""
+
+msgid "EscalationPolicies|Escalation rules"
+msgstr ""
+
+msgid "EscalationPolicies|Failed to load oncall-schedules"
+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 ""
+
+msgid "EscalationPolicies|Search for user"
+msgstr ""
+
+msgid "EscalationPolicies|Select schedule"
+msgstr ""
+
+msgid "EscalationPolicies|Set up escalation policies to define who is paged, and when, in the event the first users paged don't respond."
+msgstr ""
+
+msgid "EscalationPolicies|THEN %{doAction} %{scheduleOrUser}"
+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 ""
+
+msgid "Estimate"
+msgstr ""
+
+msgid "Estimated"
+msgstr ""
+
+msgid "Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
+msgstr ""
+
+msgid "EventFilterBy|Filter by all"
+msgstr ""
+
+msgid "EventFilterBy|Filter by comments"
+msgstr ""
+
+msgid "EventFilterBy|Filter by designs"
+msgstr ""
+
+msgid "EventFilterBy|Filter by epic events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by issue events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by merge events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by push events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by team"
+msgstr ""
+
+msgid "EventFilterBy|Filter by wiki"
+msgstr ""
+
+msgid "Events"
+msgstr ""
+
+msgid "Events API"
+msgstr ""
+
+msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
+msgstr ""
+
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every day"
+msgstr ""
+
+msgid "Every day (at %{time})"
+msgstr ""
+
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every month"
+msgstr ""
+
+msgid "Every month (Day %{day} at %{time})"
+msgstr ""
+
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every three months"
+msgstr ""
+
+msgid "Every two weeks"
+msgstr ""
+
+msgid "Every week"
+msgid_plural "Every %d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Every week (%{weekday} at %{time})"
+msgstr ""
+
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Everyone With Access"
+msgstr ""
+
+msgid "Everyone can access the wiki."
+msgstr ""
+
+msgid "Everyone can contribute"
+msgstr ""
+
+msgid "Everything on your to-do list is marked as done."
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Gatsby"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using GitBook"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Hexo"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Hugo"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Jekyll"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Pelican"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using plain HTML"
+msgstr ""
+
+msgid "Evidence collection"
+msgstr ""
+
+msgid "Exactly one of %{attributes} is required"
+msgstr ""
+
+msgid "Example: @sub\\.company\\.com$"
+msgstr ""
+
+msgid "Examples"
+msgstr ""
+
+msgid "Except policy:"
+msgstr ""
+
+msgid "Exceptions"
+msgstr ""
+
+msgid "Excluding merge commits. Limited to %{limit} commits."
+msgstr ""
+
+msgid "Excluding merge commits. Limited to 6,000 commits."
+msgstr ""
+
+msgid "Execution time"
+msgstr ""
+
+msgid "Existing branch name, tag, or commit SHA"
+msgstr ""
+
+msgid "Existing projects may be moved into a group"
+msgstr ""
+
+msgid "Existing projects will be able to use expiration policies. Avoid enabling this if an external Container Registry is being used, as there is a performance risk if many images exist on one project."
+msgstr ""
+
+msgid "Existing sign in methods may be removed"
+msgstr ""
+
+msgid "Exit."
+msgstr ""
+
+msgid "Expand"
+msgstr ""
+
+msgid "Expand all"
+msgstr ""
+
+msgid "Expand all files"
+msgstr ""
+
+msgid "Expand all threads"
+msgstr ""
+
+msgid "Expand approvers"
+msgstr ""
+
+msgid "Expand file"
+msgstr ""
+
+msgid "Expand issues"
+msgstr ""
+
+msgid "Expand jobs"
+msgstr ""
+
+msgid "Expand milestones"
+msgstr ""
+
+msgid "Expand panel"
+msgstr ""
+
+msgid "Expand settings section"
+msgstr ""
+
+msgid "Expand sidebar"
+msgstr ""
+
+msgid "Expected documents: %{expected_documents}"
+msgstr ""
+
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
+msgstr ""
+
+msgid "Expiration"
+msgstr ""
+
+msgid "Expiration date"
+msgstr ""
+
+msgid "Expiration date (optional)"
+msgstr ""
+
+msgid "Expiration date:"
+msgstr ""
+
+msgid "Expired"
+msgstr ""
+
+msgid "Expired %{expiredOn}"
+msgstr ""
+
+msgid "Expired:"
+msgstr ""
+
+msgid "Expires"
+msgstr ""
+
+msgid "Expires %{preposition} %{expires_at}"
+msgstr ""
+
+msgid "Expires on"
+msgstr ""
+
+msgid "Expires:"
+msgstr ""
+
+msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
+msgstr ""
+
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
+msgid "Explore paid plans"
+msgstr ""
+
+msgid "Explore projects"
+msgstr ""
+
+msgid "Explore public groups"
+msgstr ""
+
+msgid "Explore public projects"
+msgstr ""
+
+msgid "Explore snippets"
+msgstr ""
+
+msgid "Explore topics"
+msgstr ""
+
+msgid "Export"
+msgstr ""
+
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
+msgid "Export as CSV"
+msgstr ""
+
+msgid "Export commit custody report"
+msgstr ""
+
+msgid "Export group"
+msgstr ""
+
+msgid "Export issues"
+msgstr ""
+
+msgid "Export merge requests"
+msgstr ""
+
+msgid "Export project"
+msgstr ""
+
+msgid "Export requirements"
+msgstr ""
+
+msgid "Export this group with all related data."
+msgstr ""
+
+msgid "Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Export variable to pipelines running on protected branches and tags only."
+msgstr ""
+
+msgid "Exported requirements"
+msgstr ""
+
+msgid "External URL"
+msgstr ""
+
+msgid "External User:"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External storage URL"
+msgstr ""
+
+msgid "External storage authentication token"
+msgstr ""
+
+msgid "External storage for repository static objects"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "ExternalAuthorization|Access to projects is validated on an external service using their classification label."
+msgstr ""
+
+msgid "ExternalAuthorization|Certificate used to authenticate with the external authorization service. If blank, the server certificate is validated when accessing over HTTPS."
+msgstr ""
+
+msgid "ExternalAuthorization|Classification label to use when requesting authorization if no specific label is defined on the project."
+msgstr ""
+
+msgid "ExternalAuthorization|Client authorization certificate"
+msgstr ""
+
+msgid "ExternalAuthorization|Client authorization key"
+msgstr ""
+
+msgid "ExternalAuthorization|Client authorization key password (optional)"
+msgstr ""
+
+msgid "ExternalAuthorization|Default classification label"
+msgstr ""
+
+msgid "ExternalAuthorization|Enable classification control using an external service"
+msgstr ""
+
+msgid "ExternalAuthorization|External authorization"
+msgstr ""
+
+msgid "ExternalAuthorization|External authorization request timeout (seconds)"
+msgstr ""
+
+msgid "ExternalAuthorization|External classification policy authorization."
+msgstr ""
+
+msgid "ExternalAuthorization|Passphrase required to decrypt the private key. Encrypted when stored."
+msgstr ""
+
+msgid "ExternalAuthorization|Period GitLab waits for a response from the external service. If there is no response, access is denied. Default: 0.5 seconds."
+msgstr ""
+
+msgid "ExternalAuthorization|Private key of client authentication certificate. Encrypted when stored."
+msgstr ""
+
+msgid "ExternalAuthorization|Service URL"
+msgstr ""
+
+msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
+msgstr ""
+
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
+msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
+msgstr ""
+
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
+msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
+msgstr ""
+
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
+msgid "ExternalWikiService|External wiki"
+msgstr ""
+
+msgid "ExternalWikiService|External wiki URL"
+msgstr ""
+
+msgid "ExternalWikiService|Link to an external wiki from the sidebar."
+msgstr ""
+
+msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
+msgid "Failed"
+msgstr ""
+
+msgid "Failed Jobs"
+msgstr ""
+
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Failed on"
+msgstr ""
+
+msgid "Failed to add a Zoom meeting"
+msgstr ""
+
+msgid "Failed to apply commands."
+msgstr ""
+
+msgid "Failed to archive a design. Please try again."
+msgid_plural "Failed to archive designs. Please try again."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Failed to assign a reviewer because no user was specified."
+msgstr ""
+
+msgid "Failed to assign a user because no user was found."
+msgstr ""
+
+msgid "Failed to cancel auto stop because failed to update the environment."
+msgstr ""
+
+msgid "Failed to cancel auto stop because the environment is not set as auto stop."
+msgstr ""
+
+msgid "Failed to cancel auto stop because you do not have permission to update the environment."
+msgstr ""
+
+msgid "Failed to change the owner"
+msgstr ""
+
+msgid "Failed to check related branches."
+msgstr ""
+
+msgid "Failed to clone this issue because target project doesn't exist."
+msgstr ""
+
+msgid "Failed to clone this issue: wrong parameters."
+msgstr ""
+
+msgid "Failed to create a branch for this issue. Please try again."
+msgstr ""
+
+msgid "Failed to create a to-do item for the design."
+msgstr ""
+
+msgid "Failed to create framework"
+msgstr ""
+
+msgid "Failed to create import label for jira import."
+msgstr ""
+
+msgid "Failed to create new access token: %{token_response_message}"
+msgstr ""
+
+msgid "Failed to create repository"
+msgstr ""
+
+msgid "Failed to create resources"
+msgstr ""
+
+msgid "Failed to create wiki"
+msgstr ""
+
+msgid "Failed to deploy to"
+msgstr ""
+
+msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
+msgstr ""
+
+msgid "Failed to fetch the iteration for this issue. Please try again."
+msgstr ""
+
+msgid "Failed to fetch the iterations for the group. Please try again."
+msgstr ""
+
+msgid "Failed to find import label for Jira import."
+msgstr ""
+
+msgid "Failed to find users for %{missing}"
+msgstr ""
+
+msgid "Failed to generate export, please try again later."
+msgstr ""
+
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
+msgid "Failed to get ref."
+msgstr ""
+
+msgid "Failed to install."
+msgstr ""
+
+msgid "Failed to load"
+msgstr ""
+
+msgid "Failed to load Roadmap"
+msgstr ""
+
+msgid "Failed to load assignees."
+msgstr ""
+
+msgid "Failed to load assignees. Please try again."
+msgstr ""
+
+msgid "Failed to load authors. Please try again."
+msgstr ""
+
+msgid "Failed to load branches. Please try again."
+msgstr ""
+
+msgid "Failed to load deploy keys."
+msgstr ""
+
+msgid "Failed to load emoji list."
+msgstr ""
+
+msgid "Failed to load error details from Sentry."
+msgstr ""
+
+msgid "Failed to load errors from Sentry."
+msgstr ""
+
+msgid "Failed to load group activity metrics. Please try again."
+msgstr ""
+
+msgid "Failed to load groups, users and deploy keys."
+msgstr ""
+
+msgid "Failed to load groups."
+msgstr ""
+
+msgid "Failed to load iteration cadences."
+msgstr ""
+
+msgid "Failed to load iterations."
+msgstr ""
+
+msgid "Failed to load labels. Please try again."
+msgstr ""
+
+msgid "Failed to load milestones."
+msgstr ""
+
+msgid "Failed to load milestones. Please try again."
+msgstr ""
+
+msgid "Failed to load projects"
+msgstr ""
+
+msgid "Failed to load related branches"
+msgstr ""
+
+msgid "Failed to load stacktrace."
+msgstr ""
+
+msgid "Failed to make repository read-only. %{reason}"
+msgstr ""
+
+msgid "Failed to mark this issue as a duplicate because referenced issue was not found."
+msgstr ""
+
+msgid "Failed to move this issue because label was not found."
+msgstr ""
+
+msgid "Failed to move this issue because only a single label can be provided."
+msgstr ""
+
+msgid "Failed to move this issue because target project doesn't exist."
+msgstr ""
+
+msgid "Failed to promote issue to incident"
+msgstr ""
+
+msgid "Failed to promote label due to internal error. Please contact administrators."
+msgstr ""
+
+msgid "Failed to protect the branch"
+msgstr ""
+
+msgid "Failed to protect the environment"
+msgstr ""
+
+msgid "Failed to publish issue on status page."
+msgstr ""
+
+msgid "Failed to remove a Zoom meeting"
+msgstr ""
+
+msgid "Failed to remove a to-do item for the design."
+msgstr ""
+
+msgid "Failed to remove attention because no user was found."
+msgstr ""
+
+msgid "Failed to remove mirror."
+msgstr ""
+
+msgid "Failed to remove the pipeline schedule"
+msgstr ""
+
+msgid "Failed to remove user identity."
+msgstr ""
+
+msgid "Failed to remove user key."
+msgstr ""
+
+msgid "Failed to request attention because no user was found."
+msgstr ""
+
+msgid "Failed to retrieve page"
+msgstr ""
+
+msgid "Failed to save merge conflicts resolutions. Please try again!"
+msgstr ""
+
+msgid "Failed to save new settings"
+msgstr ""
+
+msgid "Failed to save preferences (%{error_message})."
+msgstr ""
+
+msgid "Failed to save preferences."
+msgstr ""
+
+msgid "Failed to set due date because the date format is invalid."
+msgstr ""
+
+msgid "Failed to set iteration on this issue. Please try again."
+msgstr ""
+
+msgid "Failed to signing using smartcard authentication"
+msgstr ""
+
+msgid "Failed to toggle the to-do status for the design."
+msgstr ""
+
+msgid "Failed to update branch!"
+msgstr ""
+
+msgid "Failed to update environment!"
+msgstr ""
+
+msgid "Failed to update framework"
+msgstr ""
+
+msgid "Failed to update issue status"
+msgstr ""
+
+msgid "Failed to update the Canary Ingress."
+msgstr ""
+
+msgid "Failed to update."
+msgstr ""
+
+msgid "Failed to upgrade."
+msgstr ""
+
+msgid "Failed to upload object map file"
+msgstr ""
+
+msgid "Failure"
+msgstr ""
+
+msgid "False positive"
+msgstr ""
+
+msgid "Fast timeout"
+msgstr ""
+
+msgid "Fast-forward merge without a merge commit"
+msgstr ""
+
+msgid "Faster releases. Better code. Less pain."
+msgstr ""
+
+msgid "Favicon"
+msgstr ""
+
+msgid "Favicon was successfully removed."
+msgstr ""
+
+msgid "Favicon will be removed. Are you sure?"
+msgstr ""
+
+msgid "Feature Flags"
+msgstr ""
+
+msgid "Feature deprecation"
+msgstr ""
+
+msgid "Feature flag status"
+msgstr ""
+
+msgid "Feature flag was not removed."
+msgstr ""
+
+msgid "Feature flag was successfully removed."
+msgstr ""
+
+msgid "FeatureFlags|%d user"
+msgid_plural "FeatureFlags|%d users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "FeatureFlags|%{percent} by available ID"
+msgstr ""
+
+msgid "FeatureFlags|%{percent} by session ID"
+msgstr ""
+
+msgid "FeatureFlags|%{percent} by user ID"
+msgstr ""
+
+msgid "FeatureFlags|%{percent} randomly"
+msgstr ""
+
+msgid "FeatureFlags|* (All Environments)"
+msgstr ""
+
+msgid "FeatureFlags|API URL"
+msgstr ""
+
+msgid "FeatureFlags|Active"
+msgstr ""
+
+msgid "FeatureFlags|Add strategy"
+msgstr ""
+
+msgid "FeatureFlags|All Environments"
+msgstr ""
+
+msgid "FeatureFlags|All Users"
+msgstr ""
+
+msgid "FeatureFlags|All users"
+msgstr ""
+
+msgid "FeatureFlags|Configure"
+msgstr ""
+
+msgid "FeatureFlags|Configure feature flags"
+msgstr ""
+
+msgid "FeatureFlags|Consider using the more flexible \"Percent rollout\" strategy instead."
+msgstr ""
+
+msgid "FeatureFlags|Create feature flag"
+msgstr ""
+
+msgid "FeatureFlags|Delete %{name}?"
+msgstr ""
+
+msgid "FeatureFlags|Delete feature flag"
+msgstr ""
+
+msgid "FeatureFlags|Description"
+msgstr ""
+
+msgid "FeatureFlags|Edit Feature Flag"
+msgstr ""
+
+msgid "FeatureFlags|Edit User List"
+msgstr ""
+
+msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
+msgstr ""
+
+msgid "FeatureFlags|Environment Specs"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag User List Details"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag User Lists"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules to define the status of target environments. A default wildcard rule %{codeStart}*%{codeEnd} for %{boldStart}All Environments%{boldEnd} is set, and you are able to add as many rules as you need by choosing environment specs below. You can toggle the behavior for each of your rules to set them %{boldStart}Active%{boldEnd} or %{boldStart}Inactive%{boldEnd}."
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag has no strategies"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flags"
+msgstr ""
+
+msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?"
+msgstr ""
+
+msgid "FeatureFlags|Feature flags allow you to configure your code into different flavors by dynamically toggling certain functionality."
+msgstr ""
+
+msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
+msgstr ""
+
+msgid "FeatureFlags|Get started with feature flags"
+msgstr ""
+
+msgid "FeatureFlags|ID"
+msgstr ""
+
+msgid "FeatureFlags|Inactive"
+msgstr ""
+
+msgid "FeatureFlags|Inactive flag for %{scope}"
+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 ""
+
+msgid "FeatureFlags|Instance ID"
+msgstr ""
+
+msgid "FeatureFlags|List details"
+msgstr ""
+
+msgid "FeatureFlags|Loading feature flags"
+msgstr ""
+
+msgid "FeatureFlags|More information"
+msgstr ""
+
+msgid "FeatureFlags|Name"
+msgstr ""
+
+msgid "FeatureFlags|New"
+msgstr ""
+
+msgid "FeatureFlags|New Feature Flag"
+msgstr ""
+
+msgid "FeatureFlags|New User List"
+msgstr ""
+
+msgid "FeatureFlags|New feature flag"
+msgstr ""
+
+msgid "FeatureFlags|No user list selected"
+msgstr ""
+
+msgid "FeatureFlags|Percent of users"
+msgstr ""
+
+msgid "FeatureFlags|Percent rollout"
+msgstr ""
+
+msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
+msgstr ""
+
+msgid "FeatureFlags|Remove"
+msgstr ""
+
+msgid "FeatureFlags|Search code references"
+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 ""
+
+msgid "FeatureFlags|Status"
+msgstr ""
+
+msgid "FeatureFlags|Strategies"
+msgstr ""
+
+msgid "FeatureFlags|There was an error fetching the feature flags."
+msgstr ""
+
+msgid "FeatureFlags|To prevent accidental actions we ask you to confirm your intention. Please type %{projectName} to proceed or close this modal to cancel."
+msgstr ""
+
+msgid "FeatureFlags|Try again in a few moments or contact your support team."
+msgstr ""
+
+msgid "FeatureFlags|User IDs"
+msgstr ""
+
+msgid "FeatureFlags|User List"
+msgstr ""
+
+msgid "FeatureFlags|User Lists"
+msgstr ""
+
+msgid "FeatureFlags|View user lists"
+msgstr ""
+
+msgid "FeatureFlag|Percentage"
+msgstr ""
+
+msgid "FeatureFlag|Select a user list"
+msgstr ""
+
+msgid "FeatureFlag|Select the environment scope for this feature flag"
+msgstr ""
+
+msgid "FeatureFlag|There are no configured user lists"
+msgstr ""
+
+msgid "FeatureFlag|Type"
+msgstr ""
+
+msgid "FeatureFlag|User IDs"
+msgstr ""
+
+msgid "FeatureFlag|User List"
+msgstr ""
+
+msgid "Feb"
+msgstr ""
+
+msgid "February"
+msgstr ""
+
+msgid "Fetch and check out this merge request's feature branch:"
+msgstr ""
+
+msgid "Fetching incoming email"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "File %{current} of %{total}"
+msgstr ""
+
+msgid "File Hooks"
+msgstr ""
+
+msgid "File Hooks (%{count})"
+msgstr ""
+
+msgid "File Tree"
+msgstr ""
+
+msgid "File added"
+msgstr ""
+
+msgid "File browser"
+msgstr ""
+
+msgid "File deleted"
+msgstr ""
+
+msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
+msgstr ""
+
+msgid "File mode changed from %{a_mode} to %{b_mode}"
+msgstr ""
+
+msgid "File moved"
+msgstr ""
+
+msgid "File name"
+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 templates"
+msgstr ""
+
+msgid "File too large. Secure Files must be less than %{limit} MB."
+msgstr ""
+
+msgid "File upload error."
+msgstr ""
+
+msgid "Filename"
+msgstr ""
+
+msgid "Files"
+msgstr ""
+
+msgid "Files API Rate Limits"
+msgstr ""
+
+msgid "Files breadcrumb"
+msgstr ""
+
+msgid "Files with large changes are collapsed by default."
+msgstr ""
+
+msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
+msgstr ""
+
+msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Filter by"
+msgstr ""
+
+msgid "Filter by %{page_context_word} that are currently open."
+msgstr ""
+
+msgid "Filter by Git revision"
+msgstr ""
+
+msgid "Filter by issues that are currently closed."
+msgstr ""
+
+msgid "Filter by issues that are currently opened."
+msgstr ""
+
+msgid "Filter by label"
+msgstr ""
+
+msgid "Filter by merge requests that are currently closed and unmerged."
+msgstr ""
+
+msgid "Filter by merge requests that are currently merged."
+msgstr ""
+
+msgid "Filter by milestone"
+msgstr ""
+
+msgid "Filter by milestone name"
+msgstr ""
+
+msgid "Filter by name"
+msgstr ""
+
+msgid "Filter by test cases that are currently archived."
+msgstr ""
+
+msgid "Filter by test cases that are currently open."
+msgstr ""
+
+msgid "Filter by user"
+msgstr ""
+
+msgid "Filter parameters are not valid. Make sure that the end date is after the start date."
+msgstr ""
+
+msgid "Filter pipelines"
+msgstr ""
+
+msgid "Filter results"
+msgstr ""
+
+msgid "Filter results by group"
+msgstr ""
+
+msgid "Filter results by project"
+msgstr ""
+
+msgid "Filter results..."
+msgstr ""
+
+msgid "Filter users"
+msgstr ""
+
+msgid "Filter..."
+msgstr ""
+
+msgid "Find File"
+msgstr ""
+
+msgid "Find bugs in your code with API fuzzing."
+msgstr ""
+
+msgid "Find bugs in your code with coverage-guided fuzzing."
+msgstr ""
+
+msgid "Find by path"
+msgstr ""
+
+msgid "Find file"
+msgstr ""
+
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
+msgstr ""
+
+msgid "Fingerprints"
+msgstr ""
+
+msgid "Finish editing this message first!"
+msgstr ""
+
+msgid "Finish review"
+msgstr ""
+
+msgid "Finish setting up your dedicated account for %{group_name}."
+msgstr ""
+
+msgid "Finished"
+msgstr ""
+
+msgid "First Name"
+msgstr ""
+
+msgid "First Seen"
+msgstr ""
+
+msgid "First day of the week"
+msgstr ""
+
+msgid "First name"
+msgstr ""
+
+msgid "First seen"
+msgstr ""
+
+msgid "Fixed"
+msgstr ""
+
+msgid "Fixed burndown chart"
+msgstr ""
+
+msgid "Fixed:"
+msgstr ""
+
+msgid "Flags"
+msgstr ""
+
+msgid "FloC|Configure whether you want to participate in FloC."
+msgstr ""
+
+msgid "FloC|Enable FloC (Federated Learning of Cohorts)"
+msgstr ""
+
+msgid "FloC|Federated Learning of Cohorts"
+msgstr ""
+
+msgid "FlowdockService|Enter your Flowdock token."
+msgstr ""
+
+msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows."
+msgstr ""
+
+msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows. %{docs_link}"
+msgstr ""
+
+msgid "Focus filter bar"
+msgstr ""
+
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Fogbugz|Fogbugz import failed due to an error: %{error}"
+msgstr ""
+
+msgid "Fogbugz|Project %{repo} could not be found"
+msgstr ""
+
+msgid "Folder/%{name}"
+msgstr ""
+
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
+msgid "For a faster browsing experience, some files are collapsed by default."
+msgstr ""
+
+msgid "For additional information, review your %{link_to} or contact your group owner."
+msgstr ""
+
+msgid "For additional information, review your group membership: %{link_to} or contact your group owner."
+msgstr ""
+
+msgid "For each job, clone the repository."
+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. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
+msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
+msgstr ""
+
+msgid "For general work"
+msgstr ""
+
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
+msgstr ""
+
+msgid "For investigating IT service disruptions or outages"
+msgstr ""
+
+msgid "For more info, read the documentation."
+msgstr ""
+
+msgid "For more information on how the number of active users is calculated, see the %{self_managed_subscriptions_doc_link} documentation."
+msgstr ""
+
+msgid "For more information, go to the "
+msgstr ""
+
+msgid "For more information, see the File Hooks documentation."
+msgstr ""
+
+msgid "Forgot your password?"
+msgstr ""
+
+msgid "Fork"
+msgstr ""
+
+msgid "Fork Error!"
+msgstr ""
+
+msgid "Fork project"
+msgstr ""
+
+msgid "Fork project?"
+msgstr ""
+
+msgid "ForkProject|A fork is a copy of a project."
+msgstr ""
+
+msgid "ForkProject|An error occurred while forking the project. Please try again."
+msgstr ""
+
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Forking a repository allows you to make changes without affecting the original project."
+msgstr ""
+
+msgid "ForkProject|Internal"
+msgstr ""
+
+msgid "ForkProject|Please select a namespace"
+msgstr ""
+
+msgid "ForkProject|Please select a visibility level"
+msgstr ""
+
+msgid "ForkProject|Private"
+msgstr ""
+
+msgid "ForkProject|Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgstr ""
+
+msgid "ForkProject|Public"
+msgstr ""
+
+msgid "ForkProject|Select a namespace"
+msgstr ""
+
+msgid "ForkProject|The project can be accessed by any logged in user."
+msgstr ""
+
+msgid "ForkProject|The project can be accessed without any authentication."
+msgstr ""
+
+msgid "ForkProject|Visibility level"
+msgstr ""
+
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
+msgstr ""
+
+msgid "ForkSuggestion|Cancel"
+msgstr ""
+
+msgid "ForkSuggestion|Fork"
+msgstr ""
+
+msgid "ForkSuggestion|You can’t %{edit_start}edit%{edit_end} files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
+msgid "ForkedFromProjectPath|Forked from"
+msgstr ""
+
+msgid "ForkedFromProjectPath|Forked from an inaccessible project"
+msgstr ""
+
+msgid "Forking in progress"
+msgstr ""
+
+msgid "Forks"
+msgstr ""
+
+msgid "Format: %{dateFormat}"
+msgstr ""
+
+msgid "Forward %{package_type} package requests to the %{registry_type} Registry if the packages are not found in the GitLab Package Registry"
+msgstr ""
+
+msgid "Found errors in your %{gitlab_ci_yml}:"
+msgstr ""
+
+msgid "Found errors in your .gitlab-ci.yml:"
+msgstr ""
+
+msgid "Framework successfully deleted"
+msgstr ""
+
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
+
+msgid "Freeze end"
+msgstr ""
+
+msgid "Freeze start"
+msgstr ""
+
+msgid "Frequency"
+msgstr ""
+
+msgid "Frequently searched"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "From %{code_open}%{source_title}%{code_close} into"
+msgstr ""
+
+msgid "From %{providerTitle}"
+msgstr ""
+
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
+msgid "From June 22, 2022 (GitLab 15.1), you can have a maximum of %{free_limit} unique members across all of your personal projects"
+msgstr ""
+
+msgid "From issue creation until deploy to production"
+msgstr ""
+
+msgid "From merge request merge until deploy to production"
+msgstr ""
+
+msgid "Full"
+msgstr ""
+
+msgid "Full log"
+msgstr ""
+
+msgid "Full name"
+msgstr ""
+
+msgid "GCP region configured"
+msgstr ""
+
+msgid "GPG Key ID:"
+msgstr ""
+
+msgid "GPG Keys"
+msgstr ""
+
+msgid "GPG keys allow you to verify signed commits."
+msgstr ""
+
+msgid "GPG signature (loading...)"
+msgstr ""
+
+msgid "General"
+msgstr ""
+
+msgid "General Settings"
+msgstr ""
+
+msgid "General pipelines"
+msgstr ""
+
+msgid "General settings"
+msgstr ""
+
+msgid "Generate a default set of labels"
+msgstr ""
+
+msgid "Generate group access tokens scoped to this group for your applications that need access to the GitLab API."
+msgstr ""
+
+msgid "Generate new export"
+msgstr ""
+
+msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
+msgstr ""
+
+msgid "Generate site and private keys at"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Generic package file size in bytes"
+msgstr ""
+
+msgid "GenericReport|After"
+msgstr ""
+
+msgid "GenericReport|Before"
+msgstr ""
+
+msgid "GenericReport|Diff"
+msgstr ""
+
+msgid "Geo"
+msgstr ""
+
+msgid "Geo Replication"
+msgstr ""
+
+msgid "Geo Settings"
+msgstr ""
+
+msgid "Geo Sites"
+msgstr ""
+
+msgid "Geo sites"
+msgstr ""
+
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Geo|%{boldStart}Not applicable%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
+msgstr ""
+
+msgid "Geo|%{component} synced"
+msgstr ""
+
+msgid "Geo|%{component} verified"
+msgstr ""
+
+msgid "Geo|%{label} can't be blank"
+msgstr ""
+
+msgid "Geo|%{label} should be between 1-999"
+msgstr ""
+
+msgid "Geo|%{name} is scheduled for forced re-download"
+msgstr ""
+
+msgid "Geo|%{name} is scheduled for re-sync"
+msgstr ""
+
+msgid "Geo|%{name} is scheduled for re-verify"
+msgstr ""
+
+msgid "Geo|%{timeAgoStr} (%{pendingEvents} events)"
+msgstr ""
+
+msgid "Geo|%{title} checksum progress"
+msgstr ""
+
+msgid "Geo|Add New Site"
+msgstr ""
+
+msgid "Geo|Add site"
+msgstr ""
+
+msgid "Geo|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 ""
+
+msgid "Geo|All"
+msgstr ""
+
+msgid "Geo|All %{replicable_name}"
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|All projects are being scheduled for resync"
+msgstr ""
+
+msgid "Geo|All projects are being scheduled for reverify"
+msgstr ""
+
+msgid "Geo|Allow this secondary site to replicate content on Object Storage"
+msgstr ""
+
+msgid "Geo|Allowed Geo IP"
+msgstr ""
+
+msgid "Geo|Allowed Geo IP can't be blank"
+msgstr ""
+
+msgid "Geo|Allowed Geo IP should be between 1 and 255 characters"
+msgstr ""
+
+msgid "Geo|Allowed Geo IP should contain valid IP addresses"
+msgstr ""
+
+msgid "Geo|Checksummed"
+msgstr ""
+
+msgid "Geo|Choose specific groups or storage shards"
+msgstr ""
+
+msgid "Geo|Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
+msgstr ""
+
+msgid "Geo|Configure various settings for your %{siteType} site. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "Geo|Connection timeout"
+msgstr ""
+
+msgid "Geo|Connection timeout can't be blank"
+msgstr ""
+
+msgid "Geo|Connection timeout must be a number"
+msgstr ""
+
+msgid "Geo|Connection timeout should be between 1-120"
+msgstr ""
+
+msgid "Geo|Consult Geo troubleshooting information"
+msgstr ""
+
+msgid "Geo|Container repositories synchronization concurrency limit"
+msgstr ""
+
+msgid "Geo|Could not remove tracking entry for an existing project."
+msgstr ""
+
+msgid "Geo|Data replication lag"
+msgstr ""
+
+msgid "Geo|Data type"
+msgstr ""
+
+msgid "Geo|Disabled"
+msgstr ""
+
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
+msgid "Geo|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "Geo|Edit %{nodeType} site"
+msgstr ""
+
+msgid "Geo|Edit Geo Site"
+msgstr ""
+
+msgid "Geo|Edit your search and try again."
+msgstr ""
+
+msgid "Geo|Errors:"
+msgstr ""
+
+msgid "Geo|Failed"
+msgstr ""
+
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
+msgid "Geo|Filter Geo sites"
+msgstr ""
+
+msgid "Geo|Filter by name"
+msgstr ""
+
+msgid "Geo|Filter by status"
+msgstr ""
+
+msgid "Geo|Full details"
+msgstr ""
+
+msgid "Geo|Geo Settings"
+msgstr ""
+
+msgid "Geo|Geo Status"
+msgstr ""
+
+msgid "Geo|Geo allows you to choose specific groups or storage shards to replicate."
+msgstr ""
+
+msgid "Geo|Geo can replicate objects stored in Object Storage (AWS S3, or other compatible object storage)."
+msgstr ""
+
+msgid "Geo|Geo sites"
+msgstr ""
+
+msgid "Geo|Geo sites are paused using a command run on the site"
+msgstr ""
+
+msgid "Geo|Go to the primary site"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Healthy"
+msgstr ""
+
+msgid "Geo|If enabled, GitLab will handle Object Storage replication using Geo."
+msgstr ""
+
+msgid "Geo|If you want to make changes, you must visit the primary site."
+msgstr ""
+
+msgid "Geo|In progress"
+msgstr ""
+
+msgid "Geo|In sync"
+msgstr ""
+
+msgid "Geo|Internal URL"
+msgstr ""
+
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
+msgid "Geo|Last event ID from primary"
+msgstr ""
+
+msgid "Geo|Last event ID processed by cursor"
+msgstr ""
+
+msgid "Geo|Last repository check run"
+msgstr ""
+
+msgid "Geo|Last successful sync"
+msgstr ""
+
+msgid "Geo|Last sync attempt"
+msgstr ""
+
+msgid "Geo|Last time verified"
+msgstr ""
+
+msgid "Geo|Learn more about Geo"
+msgstr ""
+
+msgid "Geo|Learn more about Geo site statuses"
+msgstr ""
+
+msgid "Geo|Limit the number of concurrent operations this secondary site can run in the background."
+msgstr ""
+
+msgid "Geo|Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Geo|Minimum interval in days"
+msgstr ""
+
+msgid "Geo|Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
+msgstr ""
+
+msgid "Geo|Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
+msgstr ""
+
+msgid "Geo|Never"
+msgstr ""
+
+msgid "Geo|Next sync scheduled at"
+msgstr ""
+
+msgid "Geo|No Geo site found"
+msgstr ""
+
+msgid "Geo|No available replication slots"
+msgstr ""
+
+msgid "Geo|Not synced yet"
+msgstr ""
+
+msgid "Geo|Nothing found…"
+msgstr ""
+
+msgid "Geo|Nothing to checksum"
+msgstr ""
+
+msgid "Geo|Nothing to synchronize"
+msgstr ""
+
+msgid "Geo|Nothing to verify"
+msgstr ""
+
+msgid "Geo|Object Storage replication"
+msgstr ""
+
+msgid "Geo|Offline"
+msgstr ""
+
+msgid "Geo|Pending synchronization"
+msgstr ""
+
+msgid "Geo|Pending verification"
+msgstr ""
+
+msgid "Geo|Primary"
+msgstr ""
+
+msgid "Geo|Primary site"
+msgstr ""
+
+msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Queued"
+msgstr ""
+
+msgid "Geo|Re-verification interval"
+msgstr ""
+
+msgid "Geo|Redownload"
+msgstr ""
+
+msgid "Geo|Remove"
+msgstr ""
+
+msgid "Geo|Remove %{nodeType} site"
+msgstr ""
+
+msgid "Geo|Remove entry"
+msgstr ""
+
+msgid "Geo|Remove site"
+msgstr ""
+
+msgid "Geo|Remove tracking database entry"
+msgstr ""
+
+msgid "Geo|Removing a Geo site stops the synchronization to and from that site. Are you sure?"
+msgstr ""
+
+msgid "Geo|Replicated data is verified with the secondary site(s) using checksums"
+msgstr ""
+
+msgid "Geo|Replicated data is verified with the secondary site(s) using checksums."
+msgstr ""
+
+msgid "Geo|Replication Details"
+msgstr ""
+
+msgid "Geo|Replication slot WAL"
+msgstr ""
+
+msgid "Geo|Replication slots"
+msgstr ""
+
+msgid "Geo|Replication status"
+msgstr ""
+
+msgid "Geo|Replication summary"
+msgstr ""
+
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
+msgid "Geo|Resync"
+msgstr ""
+
+msgid "Geo|Resync all"
+msgstr ""
+
+msgid "Geo|Resync all %{projects_count} projects"
+msgstr ""
+
+msgid "Geo|Resync all %{total}%{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync project"
+msgstr ""
+
+msgid "Geo|Retry count"
+msgstr ""
+
+msgid "Geo|Reverify"
+msgstr ""
+
+msgid "Geo|Reverify all"
+msgstr ""
+
+msgid "Geo|Reverify all %{projects_count} projects"
+msgstr ""
+
+msgid "Geo|Reverify project"
+msgstr ""
+
+msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
+msgstr ""
+
+msgid "Geo|Secondary"
+msgstr ""
+
+msgid "Geo|Secondary site"
+msgstr ""
+
+msgid "Geo|Select groups to replicate"
+msgstr ""
+
+msgid "Geo|Select shards to replicate"
+msgstr ""
+
+msgid "Geo|Selective (%{syncLabel})"
+msgstr ""
+
+msgid "Geo|Selective synchronization"
+msgstr ""
+
+msgid "Geo|Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
+msgstr ""
+
+msgid "Geo|Set verification limit and frequency."
+msgstr ""
+
+msgid "Geo|Set what should be replicated by this secondary site."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Show more"
+msgstr ""
+
+msgid "Geo|Site name can't be blank"
+msgstr ""
+
+msgid "Geo|Site name should be between 1 and 255 characters"
+msgstr ""
+
+msgid "Geo|Site's status was updated %{timeAgo}."
+msgstr ""
+
+msgid "Geo|Status"
+msgstr ""
+
+msgid "Geo|Storage config"
+msgstr ""
+
+msgid "Geo|Synced"
+msgstr ""
+
+msgid "Geo|Synchronization"
+msgstr ""
+
+msgid "Geo|Synchronization failed - %{error}"
+msgstr ""
+
+msgid "Geo|Synchronization settings"
+msgstr ""
+
+msgid "Geo|Synchronization status"
+msgstr ""
+
+msgid "Geo|The URL of the primary site that is used internally by the secondary sites."
+msgstr ""
+
+msgid "Geo|The URL of the secondary site that is used internally by the primary site."
+msgstr ""
+
+msgid "Geo|The database is currently %{db_lag} behind the primary site."
+msgstr ""
+
+msgid "Geo|The site is currently %{minutes_behind} behind the primary site."
+msgstr ""
+
+msgid "Geo|There are no %{replicable_type} to show"
+msgstr ""
+
+msgid "Geo|There was an error deleting the Geo Site"
+msgstr ""
+
+msgid "Geo|There was an error fetching the Geo Settings"
+msgstr ""
+
+msgid "Geo|There was an error fetching the Geo Sites"
+msgstr ""
+
+msgid "Geo|There was an error fetching the Sites's Groups"
+msgstr ""
+
+msgid "Geo|There was an error saving this Geo Site"
+msgstr ""
+
+msgid "Geo|There was an error updating the Geo Settings"
+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|Time in seconds"
+msgstr ""
+
+msgid "Geo|Tracking database entry will be removed. Are you sure?"
+msgstr ""
+
+msgid "Geo|Tracking entry for project (%{project_id}) was successfully removed."
+msgstr ""
+
+msgid "Geo|Tuning settings"
+msgstr ""
+
+msgid "Geo|URL can't be blank"
+msgstr ""
+
+msgid "Geo|URL must be a valid url (ex: https://gitlab.com)"
+msgstr ""
+
+msgid "Geo|Undefined"
+msgstr ""
+
+msgid "Geo|Unhealthy"
+msgstr ""
+
+msgid "Geo|Unknown"
+msgstr ""
+
+msgid "Geo|Unknown state"
+msgstr ""
+
+msgid "Geo|Updated %{timeAgo}"
+msgstr ""
+
+msgid "Geo|Verification"
+msgstr ""
+
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
+msgid "Geo|Verification failed - %{error}"
+msgstr ""
+
+msgid "Geo|Verification information"
+msgstr ""
+
+msgid "Geo|Verification status"
+msgstr ""
+
+msgid "Geo|Verified"
+msgstr ""
+
+msgid "Geo|Waiting for scheduler"
+msgstr ""
+
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
+msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo site."
+msgstr ""
+
+msgid "Geo|You may be able to make a limited amount of changes or perform a limited amount of actions on this page."
+msgstr ""
+
+msgid "Geo|misconfigured"
+msgstr ""
+
+msgid "Geo|primary"
+msgstr ""
+
+msgid "Geo|secondary"
+msgstr ""
+
+msgid "Get a free instance review"
+msgstr ""
+
+msgid "Get a free trial"
+msgstr ""
+
+msgid "Get a support subscription"
+msgstr ""
+
+msgid "Get started"
+msgstr ""
+
+msgid "Get started with GitLab"
+msgstr ""
+
+msgid "Get started with error tracking"
+msgstr ""
+
+msgid "Get started with performance monitoring"
+msgstr ""
+
+msgid "Get started!"
+msgstr ""
+
+msgid "Getting started with releases"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
+msgid "Git GC period"
+msgstr ""
+
+msgid "Git LFS Rate Limits"
+msgstr ""
+
+msgid "Git LFS is not enabled on this GitLab server, contact your admin."
+msgstr ""
+
+msgid "Git LFS objects will be synced if LFS is %{docs_link_start}enabled for the project%{docs_link_end}. Push mirrors will %{strong_open}not%{strong_close} sync LFS objects over SSH."
+msgstr ""
+
+msgid "Git LFS status:"
+msgstr ""
+
+msgid "Git global setup"
+msgstr ""
+
+msgid "Git repository URL"
+msgstr ""
+
+msgid "Git revision"
+msgstr ""
+
+msgid "Git shallow clone"
+msgstr ""
+
+msgid "Git strategy"
+msgstr ""
+
+msgid "Git transfer in progress"
+msgstr ""
+
+msgid "Git version"
+msgstr ""
+
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
+msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
+msgstr ""
+
+msgid "GitHub import"
+msgstr ""
+
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
+msgid "GitLab"
+msgstr ""
+
+msgid "GitLab (self-managed)"
+msgstr ""
+
+msgid "GitLab / Unsubscribe"
+msgstr ""
+
+msgid "GitLab API"
+msgstr ""
+
+msgid "GitLab Account Request"
+msgstr ""
+
+msgid "GitLab Billing Team."
+msgstr ""
+
+msgid "GitLab Error Tracking"
+msgstr ""
+
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab Issue"
+msgstr ""
+
+msgid "GitLab KAS"
+msgstr ""
+
+msgid "GitLab Pages"
+msgstr ""
+
+msgid "GitLab Shell"
+msgstr ""
+
+msgid "GitLab Support Bot"
+msgstr ""
+
+msgid "GitLab Team Member"
+msgstr ""
+
+msgid "GitLab Ultimate trial"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab Workhorse"
+msgstr ""
+
+msgid "GitLab account request rejected"
+msgstr ""
+
+msgid "GitLab and Google Cloud configuration seems to be incomplete. This probably can be fixed by your GitLab administration team. You may share these logs with them:"
+msgstr ""
+
+msgid "GitLab commit"
+msgstr ""
+
+msgid "GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}"
+msgstr ""
+
+msgid "GitLab export"
+msgstr ""
+
+msgid "GitLab for Jira Cloud"
+msgstr ""
+
+msgid "GitLab group: %{source_link}"
+msgstr ""
+
+msgid "GitLab informs you if a new version is available. %{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
+msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
+msgstr ""
+
+msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way%{br_tag}Development, Security, and Ops teams collaborate"
+msgstr ""
+
+msgid "GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security."
+msgstr ""
+
+msgid "GitLab is free to use. Many features for larger teams are part of our %{link_start}paid products%{link_end}. You can try Ultimate for free without any obligation or payment details."
+msgstr ""
+
+msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
+msgstr ""
+
+msgid "GitLab is open source software to collaborate on code."
+msgstr ""
+
+msgid "GitLab is undergoing maintenance"
+msgstr ""
+
+msgid "GitLab logo"
+msgstr ""
+
+msgid "GitLab metadata URL"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign-on URL"
+msgstr ""
+
+msgid "GitLab username"
+msgstr ""
+
+msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
+msgstr ""
+
+msgid "GitLab version"
+msgstr ""
+
+msgid "GitLab will create a branch in your fork and start a merge request."
+msgstr ""
+
+msgid "GitLab.com"
+msgstr ""
+
+msgid "GitLab.com (SaaS)"
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
+
+msgid "GitLabPagesDomains|Retry"
+msgstr ""
+
+msgid "GitLabPages|%{domain} is not verified. To learn how to verify ownership, visit your %{link_start}domain details%{link_end}."
+msgstr ""
+
+msgid "GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information."
+msgstr ""
+
+msgid "GitLabPages|Access pages"
+msgstr ""
+
+msgid "GitLabPages|Are you sure?"
+msgstr ""
+
+msgid "GitLabPages|Can be overridden per project. For no limit, enter 0. To inherit the value, leave empty."
+msgstr ""
+
+msgid "GitLabPages|Certificate: %{subject}"
+msgstr ""
+
+msgid "GitLabPages|Configure pages"
+msgstr ""
+
+msgid "GitLabPages|Domains"
+msgstr ""
+
+msgid "GitLabPages|Edit"
+msgstr ""
+
+msgid "GitLabPages|Expired"
+msgstr ""
+
+msgid "GitLabPages|Force HTTPS (requires valid certificates)"
+msgstr ""
+
+msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable them on your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} page."
+msgstr ""
+
+msgid "GitLabPages|Maximum size (MB)"
+msgstr ""
+
+msgid "GitLabPages|New Domain"
+msgstr ""
+
+msgid "GitLabPages|Only project maintainers can remove pages"
+msgstr ""
+
+msgid "GitLabPages|Pages"
+msgstr ""
+
+msgid "GitLabPages|Remove"
+msgstr ""
+
+msgid "GitLabPages|Remove certificate"
+msgstr ""
+
+msgid "GitLabPages|Remove domain"
+msgstr ""
+
+msgid "GitLabPages|Remove pages"
+msgstr ""
+
+msgid "GitLabPages|Removing pages will prevent them from being exposed to the outside world."
+msgstr ""
+
+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}."
+msgstr ""
+
+msgid "GitLabPages|Support for domains and certificates is disabled. Ask your system's administrator to enable it."
+msgstr ""
+
+msgid "GitLabPages|Unverified"
+msgstr ""
+
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
+msgid "GitLabPages|Verified"
+msgstr ""
+
+msgid "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}"
+msgstr ""
+
+msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "GitLabPages|Your Pages site is not configured yet. See the %{docs_link_start}GitLab Pages documentation%{link_end} to learn how to upload your static site and have GitLab serve it. You can also take some inspiration from the %{samples_link_start}sample Pages projects%{link_end}."
+msgstr ""
+
+msgid "GitLabPages|Your pages are served under:"
+msgstr ""
+
+msgid "Gitaly Servers"
+msgstr ""
+
+msgid "Gitaly relative path:"
+msgstr ""
+
+msgid "Gitaly storage name:"
+msgstr ""
+
+msgid "Gitaly timeouts"
+msgstr ""
+
+msgid "Gitaly|Address"
+msgstr ""
+
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
+msgid "GithubImporter|PR mergers"
+msgstr ""
+
+msgid "GithubImporter|PR reviews"
+msgstr ""
+
+msgid "GithubImporter|Pull requests"
+msgstr ""
+
+msgid "GithubIntegration|Create a %{token_link_start}personal access token%{token_link_end} with %{status_html} access granted and paste it here."
+msgstr ""
+
+msgid "GithubIntegration|Enable static status check names"
+msgstr ""
+
+msgid "GithubIntegration|Obtain statuses for commits and pull requests."
+msgstr ""
+
+msgid "GithubIntegration|Repository URL"
+msgstr ""
+
+msgid "GithubIntegration|Select this if you want GitHub to mark status checks as \"Required\". %{learn_more_link_start}Learn more%{learn_more_link_end}."
+msgstr ""
+
+msgid "GithubIntegration|Static status check names (optional)"
+msgstr ""
+
+msgid "GithubIntegration|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
+msgid "Gitpod"
+msgstr ""
+
+msgid "Gitpod|Enable Gitpod integration"
+msgstr ""
+
+msgid "Gitpod|Gitpod URL"
+msgstr ""
+
+msgid "Gitpod|The URL to your Gitpod instance configured to read your GitLab projects, such as https://gitpod.example.com."
+msgstr ""
+
+msgid "Gitpod|To use Gitpod you must first enable the feature in the integrations section of your %{linkStart}user preferences%{linkEnd}."
+msgstr ""
+
+msgid "Gitpod|To use the integration, each user must also enable Gitpod on their GitLab account. %{link_start}How do I enable it?%{link_end} "
+msgstr ""
+
+msgid "Gitpod|https://gitpod.example.com"
+msgstr ""
+
+msgid "Given access %{time_ago}"
+msgstr ""
+
+msgid "Given epic is already related to this epic."
+msgstr ""
+
+msgid "Global Search is disabled for this scope"
+msgstr ""
+
+msgid "Global Shortcuts"
+msgstr ""
+
+msgid "Global notification settings"
+msgstr ""
+
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
+msgstr ""
+
+msgid "GlobalSearch|Groups"
+msgstr ""
+
+msgid "GlobalSearch|Issues I've created"
+msgstr ""
+
+msgid "GlobalSearch|Issues assigned to me"
+msgstr ""
+
+msgid "GlobalSearch|Merge requests I've created"
+msgstr ""
+
+msgid "GlobalSearch|Merge requests assigned to me"
+msgstr ""
+
+msgid "GlobalSearch|Merge requests that I'm a reviewer"
+msgstr ""
+
+msgid "GlobalSearch|Projects"
+msgstr ""
+
+msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
+msgstr ""
+
+msgid "GlobalSearch|Search GitLab"
+msgstr ""
+
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
+msgid "GlobalSearch|Search results are loading"
+msgstr ""
+
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
+msgid "GlobalSearch|Type and press the enter key to submit search."
+msgstr ""
+
+msgid "GlobalSearch|Type for new suggestions to appear below."
+msgstr ""
+
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
+msgstr ""
+
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
+msgstr ""
+
+msgid "Globally-allowed IP ranges"
+msgstr ""
+
+msgid "Go Back"
+msgstr ""
+
+msgid "Go Micro is a framework for micro service development"
+msgstr ""
+
+msgid "Go back"
+msgstr ""
+
+msgid "Go back (while searching for files)"
+msgstr ""
+
+msgid "Go back to configuration"
+msgstr ""
+
+msgid "Go full screen"
+msgstr ""
+
+msgid "Go to %{source_name}"
+msgstr ""
+
+msgid "Go to commits"
+msgstr ""
+
+msgid "Go to definition"
+msgstr ""
+
+msgid "Go to environments"
+msgstr ""
+
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
+msgid "Go to epic"
+msgstr ""
+
+msgid "Go to file"
+msgstr ""
+
+msgid "Go to file permalink (while viewing a file)"
+msgstr ""
+
+msgid "Go to files"
+msgstr ""
+
+msgid "Go to find file"
+msgstr ""
+
+msgid "Go to issue boards"
+msgstr ""
+
+msgid "Go to issues"
+msgstr ""
+
+msgid "Go to jobs"
+msgstr ""
+
+msgid "Go to kubernetes"
+msgstr ""
+
+msgid "Go to merge requests"
+msgstr ""
+
+msgid "Go to metrics"
+msgstr ""
+
+msgid "Go to next page"
+msgstr ""
+
+msgid "Go to next unresolved thread"
+msgstr ""
+
+msgid "Go to page %{page}"
+msgstr ""
+
+msgid "Go to parent"
+msgstr ""
+
+msgid "Go to parent directory"
+msgstr ""
+
+msgid "Go to previous page"
+msgstr ""
+
+msgid "Go to previous unresolved thread"
+msgstr ""
+
+msgid "Go to primary site"
+msgstr ""
+
+msgid "Go to project"
+msgstr ""
+
+msgid "Go to releases"
+msgstr ""
+
+msgid "Go to repository charts"
+msgstr ""
+
+msgid "Go to repository graph"
+msgstr ""
+
+msgid "Go to snippets"
+msgstr ""
+
+msgid "Go to the %{b_open}Activity%{b_close} page for %{project_link}."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
+msgid "Go to the activity feed"
+msgstr ""
+
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
+msgid "Go to the milestone list"
+msgstr ""
+
+msgid "Go to the project's activity feed"
+msgstr ""
+
+msgid "Go to the project's overview page"
+msgstr ""
+
+msgid "Go to wiki"
+msgstr ""
+
+msgid "Go to your To-Do list"
+msgstr ""
+
+msgid "Go to your fork"
+msgstr ""
+
+msgid "Go to your groups"
+msgstr ""
+
+msgid "Go to your issues"
+msgstr ""
+
+msgid "Go to your merge requests"
+msgstr ""
+
+msgid "Go to your projects"
+msgstr ""
+
+msgid "Go to your snippets"
+msgstr ""
+
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud Project"
+msgstr ""
+
+msgid "Google Cloud authorizations required"
+msgstr ""
+
+msgid "Google Cloud project misconfigured"
+msgstr ""
+
+msgid "Google Cloud project required"
+msgstr ""
+
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
+msgid "Got it"
+msgstr ""
+
+msgid "Got it!"
+msgstr ""
+
+msgid "Grafana URL"
+msgstr ""
+
+msgid "Grafana response contains invalid json"
+msgstr ""
+
+msgid "GrafanaIntegration|API token"
+msgstr ""
+
+msgid "GrafanaIntegration|Active"
+msgstr ""
+
+msgid "GrafanaIntegration|Enter the %{docLinkStart}Grafana API token%{docLinkEnd}."
+msgstr ""
+
+msgid "GrafanaIntegration|Enter the base URL of the Grafana instance."
+msgstr ""
+
+msgid "GrafanaIntegration|Grafana URL"
+msgstr ""
+
+msgid "GrafanaIntegration|Grafana authentication"
+msgstr ""
+
+msgid "GrafanaIntegration|Set up Grafana authentication to embed Grafana panels in GitLab Flavored Markdown."
+msgstr ""
+
+msgid "Grant access"
+msgstr ""
+
+msgid "Grant write permissions to this key"
+msgstr ""
+
+msgid "Graph"
+msgstr ""
+
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
+msgid "Graphs"
+msgstr ""
+
+msgid "Gravatar"
+msgstr ""
+
+msgid "Gravatar enabled"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
+msgid "Group %{group_name} couldn't be exported."
+msgstr ""
+
+msgid "Group %{group_name} was exported successfully."
+msgstr ""
+
+msgid "Group %{group_name} was scheduled for deletion."
+msgstr ""
+
+msgid "Group %{group_name} was successfully created."
+msgstr ""
+
+msgid "Group Access Tokens"
+msgstr ""
+
+msgid "Group Git LFS status:"
+msgstr ""
+
+msgid "Group Hooks"
+msgstr ""
+
+msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
+msgstr ""
+
+msgid "Group SAML must be enabled to test"
+msgstr ""
+
+msgid "Group URL"
+msgstr ""
+
+msgid "Group access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Group application: %{name}"
+msgstr ""
+
+msgid "Group applications"
+msgstr ""
+
+msgid "Group audit events"
+msgstr ""
+
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group by"
+msgstr ""
+
+msgid "Group description (optional)"
+msgstr ""
+
+msgid "Group export could not be started."
+msgstr ""
+
+msgid "Group export download requests"
+msgstr ""
+
+msgid "Group export error"
+msgstr ""
+
+msgid "Group export link has expired. Please generate a new export from your group settings."
+msgstr ""
+
+msgid "Group export requests"
+msgstr ""
+
+msgid "Group export started. A download link will be sent by email and made available on this page."
+msgstr ""
+
+msgid "Group has been already marked for deletion"
+msgstr ""
+
+msgid "Group has not been marked for deletion"
+msgstr ""
+
+msgid "Group import could not be scheduled"
+msgstr ""
+
+msgid "Group import requests"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
+msgid "Group information"
+msgstr ""
+
+msgid "Group is required when cluster_type is :group"
+msgstr ""
+
+msgid "Group jobs by"
+msgstr ""
+
+msgid "Group members"
+msgstr ""
+
+msgid "Group membership expiration date changed"
+msgstr ""
+
+msgid "Group membership expiration date removed"
+msgstr ""
+
+msgid "Group milestone"
+msgstr ""
+
+msgid "Group name"
+msgstr ""
+
+msgid "Group name (your organization)"
+msgstr ""
+
+msgid "Group navigation"
+msgstr ""
+
+msgid "Group overview content"
+msgstr ""
+
+msgid "Group owners can register group runners in the %{link}"
+msgstr ""
+
+msgid "Group path is already taken. We've suggested one that is available."
+msgstr ""
+
+msgid "Group path is available."
+msgstr ""
+
+msgid "Group pipeline minutes were successfully reset."
+msgstr ""
+
+msgid "Group project URLs are prefixed with the group namespace"
+msgstr ""
+
+msgid "Group requires separate account"
+msgstr ""
+
+msgid "Group runners"
+msgstr ""
+
+msgid "Group runners can be managed with the %{link}."
+msgstr ""
+
+msgid "Group variables (inherited)"
+msgstr ""
+
+msgid "Group was exported"
+msgstr ""
+
+msgid "Group was successfully updated."
+msgstr ""
+
+msgid "Group wikis"
+msgstr ""
+
+msgid "Group-level wiki is disabled."
+msgstr ""
+
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "Group: %{name}"
+msgstr ""
+
+msgid "GroupActivityMetrics|Issues created"
+msgstr ""
+
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr ""
+
+msgid "GroupActivityMetrics|Members added"
+msgstr ""
+
+msgid "GroupActivityMetrics|Merge Requests created"
+msgstr ""
+
+msgid "GroupActivityMetrics|Recent activity"
+msgstr ""
+
+msgid "GroupImport|Failed to import group."
+msgstr ""
+
+msgid "GroupImport|Group '%{group_name}' is being imported."
+msgstr ""
+
+msgid "GroupImport|Group could not be imported: %{errors}"
+msgstr ""
+
+msgid "GroupImport|Please wait while we import the group for you. Refresh at will."
+msgstr ""
+
+msgid "GroupImport|The group was successfully imported."
+msgstr ""
+
+msgid "GroupImport|Unable to process group import file"
+msgstr ""
+
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
+msgid "GroupRoadmap|%{dateWord} – No end date"
+msgstr ""
+
+msgid "GroupRoadmap|%{startDateInWords} – %{endDateInWords}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading epics"
+msgstr ""
+
+msgid "GroupRoadmap|No start and end date"
+msgstr ""
+
+msgid "GroupRoadmap|No start date – %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching milestones"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|This quarter"
+msgstr ""
+
+msgid "GroupRoadmap|This year"
+msgstr ""
+
+msgid "GroupRoadmap|To make your epics appear in the roadmap, add start or due dates to them."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a start or due date to one of the %{linkStart}child epics%{linkEnd}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a start or due date to one of your epics in this group or its subgroups; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Within 3 years"
+msgstr ""
+
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
+msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enable %{linkStart}SSO enforcement%{linkEnd} to reduce security risks."
+msgstr ""
+
+msgid "GroupSAML|Active SAML Group Links (%{count})"
+msgstr ""
+
+msgid "GroupSAML|An error occurred generating your SCIM token. Please try again."
+msgstr ""
+
+msgid "GroupSAML|An error occurred resetting your SCIM token. Please try again."
+msgstr ""
+
+msgid "GroupSAML|Are you sure you want to remove the SAML group link?"
+msgstr ""
+
+msgid "GroupSAML|Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
+msgstr ""
+
+msgid "GroupSAML|Before enforcing SSO, enable SAML authentication."
+msgstr ""
+
+msgid "GroupSAML|Before enforcing SSO-only authentication for Git activity, enable SSO-only authentication for web activity."
+msgstr ""
+
+msgid "GroupSAML|Certificate fingerprint"
+msgstr ""
+
+msgid "GroupSAML|Configuration"
+msgstr ""
+
+msgid "GroupSAML|Copy SAML Response XML"
+msgstr ""
+
+msgid "GroupSAML|Could not create SAML group link: %{errors}."
+msgstr ""
+
+msgid "GroupSAML|Default membership role"
+msgstr ""
+
+msgid "GroupSAML|Enable SAML authentication for this group"
+msgstr ""
+
+msgid "GroupSAML|Enforce SSO-only authentication for Git and Dependency Proxy activity for this group"
+msgstr ""
+
+msgid "GroupSAML|Enforce SSO-only authentication for web activity for this group"
+msgstr ""
+
+msgid "GroupSAML|Enforce users to have dedicated group-managed accounts for this group"
+msgstr ""
+
+msgid "GroupSAML|Generate a SCIM token"
+msgstr ""
+
+msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Identity Management."
+msgstr ""
+
+msgid "GroupSAML|Identifier"
+msgstr ""
+
+msgid "GroupSAML|Identity provider single sign-on URL"
+msgstr ""
+
+msgid "GroupSAML|Make sure you save this token — you won't be able to access it again."
+msgstr ""
+
+msgid "GroupSAML|Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "GroupSAML|Members"
+msgstr ""
+
+msgid "GroupSAML|Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "GroupSAML|NameID"
+msgstr ""
+
+msgid "GroupSAML|NameID Format"
+msgstr ""
+
+msgid "GroupSAML|New SAML group link saved."
+msgstr ""
+
+msgid "GroupSAML|No active SAML group links"
+msgstr ""
+
+msgid "GroupSAML|Prohibit outer forks for this group"
+msgstr ""
+
+msgid "GroupSAML|Reset SCIM token"
+msgstr ""
+
+msgid "GroupSAML|Role to assign members of this SAML group."
+msgstr ""
+
+msgid "GroupSAML|SAML Group Links"
+msgstr ""
+
+msgid "GroupSAML|SAML Group Name"
+msgstr ""
+
+msgid "GroupSAML|SAML Group Name: %{saml_group_name}"
+msgstr ""
+
+msgid "GroupSAML|SAML Response Output"
+msgstr ""
+
+msgid "GroupSAML|SAML Response XML"
+msgstr ""
+
+msgid "GroupSAML|SAML Single Sign On"
+msgstr ""
+
+msgid "GroupSAML|SAML Single Sign On Settings"
+msgstr ""
+
+msgid "GroupSAML|SAML group link was successfully removed."
+msgstr ""
+
+msgid "GroupSAML|SCIM Token"
+msgstr ""
+
+msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
+msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token again, you need to %{linkStart}reset it%{linkEnd}."
+msgstr ""
+
+msgid "GroupSAML|The case-sensitive group name that will be sent by the SAML identity provider."
+msgstr ""
+
+msgid "GroupSAML|This will be set as the access level of users added to the group."
+msgstr ""
+
+msgid "GroupSAML|To be able to enable group-managed accounts, you first need to enable enforced SSO."
+msgstr ""
+
+msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
+msgstr ""
+
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
+msgid "GroupSAML|Valid SAML Response"
+msgstr ""
+
+msgid "GroupSAML|With prohibit outer forks flag enabled group members will be able to fork project only inside your group."
+msgstr ""
+
+msgid "GroupSAML|as %{access_level}"
+msgstr ""
+
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
+msgstr ""
+
+msgid "GroupSAML|recommend persistent ID instead of email"
+msgstr ""
+
+msgid "GroupSaml|Copy SCIM API endpoint URL"
+msgstr ""
+
+msgid "GroupSaml|Copy SCIM token"
+msgstr ""
+
+msgid "GroupSaml|SCIM API endpoint URL"
+msgstr ""
+
+msgid "GroupSaml|Your SCIM token"
+msgstr ""
+
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
+msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
+msgstr ""
+
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
+msgid "GroupSettings|Badges"
+msgstr ""
+
+msgid "GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}"
+msgstr ""
+
+msgid "GroupSettings|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
+msgstr ""
+
+msgid "GroupSettings|Change group URL"
+msgstr ""
+
+msgid "GroupSettings|Changing a group's URL can have unintended side effects."
+msgstr ""
+
+msgid "GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores."
+msgstr ""
+
+msgid "GroupSettings|Compliance frameworks"
+msgstr ""
+
+msgid "GroupSettings|Configure compliance frameworks to make them available to projects in this group. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "GroupSettings|Custom project templates"
+msgstr ""
+
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
+msgid "GroupSettings|Customize this group's badges."
+msgstr ""
+
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgstr ""
+
+msgid "GroupSettings|Email notifications are disabled"
+msgstr ""
+
+msgid "GroupSettings|Export group"
+msgstr ""
+
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
+msgstr ""
+
+msgid "GroupSettings|Group mentions are disabled"
+msgstr ""
+
+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|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
+msgstr ""
+
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
+msgstr ""
+
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgstr ""
+
+msgid "GroupSettings|Prevent forking outside of the group"
+msgstr ""
+
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|Project download rate limit"
+msgstr ""
+
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
+msgstr ""
+
+msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
+msgstr ""
+
+msgid "GroupSettings|Select parent group"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
+msgstr ""
+
+msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
+msgstr ""
+
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
+
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
+
+msgid "GroupSettings|There was a problem updating the pipeline settings: %{error_messages}."
+msgstr ""
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
+msgstr ""
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
+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|Transfer group"
+msgstr ""
+
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
+msgstr ""
+
+msgid "GroupSettings|What are badges?"
+msgstr ""
+
+msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals."
+msgstr ""
+
+msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals. Increasing the user cap will not automatically approve pending users."
+msgstr ""
+
+msgid "GroupSettings|You can only transfer the group to a group you manage."
+msgstr ""
+
+msgid "GroupSettings|You will need to update your local repositories to point to the new location."
+msgstr ""
+
+msgid "GroupSettings|cannot be changed by you"
+msgstr ""
+
+msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
+msgstr ""
+
+msgid "GroupSettings|cannot change when group contains projects with NPM packages"
+msgstr ""
+
+msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Groups (%{count})"
+msgstr ""
+
+msgid "Groups and projects"
+msgstr ""
+
+msgid "Groups are a great way to organize projects and people."
+msgstr ""
+
+msgid "Groups are the best way to manage projects and members."
+msgstr ""
+
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|Create new project"
+msgstr ""
+
+msgid "GroupsEmptyState|Create new subgroup"
+msgstr ""
+
+msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|No subgroups or projects."
+msgstr ""
+
+msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsEmptyState|You do not have necessary permissions to create a subgroup or project in this group. Please contact an owner of this group to create a new subgroup or project."
+msgstr ""
+
+msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
+msgstr ""
+
+msgid "GroupsNew|Assemble related projects together and grant members access to several projects at once."
+msgstr ""
+
+msgid "GroupsNew|Connect instance"
+msgstr ""
+
+msgid "GroupsNew|Contact an administrator to enable options for importing your group."
+msgstr ""
+
+msgid "GroupsNew|Create group"
+msgstr ""
+
+msgid "GroupsNew|Create new group"
+msgstr ""
+
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
+msgid "GroupsNew|GitLab source URL"
+msgstr ""
+
+msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{linkEnd}."
+msgstr ""
+
+msgid "GroupsNew|Import a group and related data from another GitLab instance."
+msgstr ""
+
+msgid "GroupsNew|Import group"
+msgstr ""
+
+msgid "GroupsNew|Import groups from another instance of GitLab"
+msgstr ""
+
+msgid "GroupsNew|No import options available"
+msgstr ""
+
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Personal access token"
+msgstr ""
+
+msgid "GroupsNew|Please fill in GitLab source URL."
+msgstr ""
+
+msgid "GroupsNew|Please fill in your personal access token."
+msgstr ""
+
+msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
+msgstr ""
+
+msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
+msgstr ""
+
+msgid "GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here."
+msgstr ""
+
+msgid "GroupsNew|Upload file"
+msgstr ""
+
+msgid "GroupsNew|e.g. h8d3f016698e..."
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Delete"
+msgstr ""
+
+msgid "GroupsTree|Edit"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Leave group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|No groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|No groups or projects matched your search"
+msgstr ""
+
+msgid "GroupsTree|Options"
+msgstr ""
+
+msgid "GroupsTree|Search by name"
+msgstr ""
+
+msgid "Groups|Avatar will be removed. Are you sure?"
+msgstr ""
+
+msgid "Groups|Changing group URL can have unintended side effects."
+msgstr ""
+
+msgid "Groups|Checking group URL availability..."
+msgstr ""
+
+msgid "Groups|Enter a descriptive name for your group."
+msgstr ""
+
+msgid "Groups|Group ID"
+msgstr ""
+
+msgid "Groups|Group URL"
+msgstr ""
+
+msgid "Groups|Group avatar"
+msgstr ""
+
+msgid "Groups|Group description (optional)"
+msgstr ""
+
+msgid "Groups|Group name"
+msgstr ""
+
+msgid "Groups|Group path is available."
+msgstr ""
+
+msgid "Groups|Group path is unavailable. Path has been replaced with a suggested available path."
+msgstr ""
+
+msgid "Groups|Learn more"
+msgstr ""
+
+msgid "Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses."
+msgstr ""
+
+msgid "Groups|Remove avatar"
+msgstr ""
+
+msgid "Groups|Save changes"
+msgstr ""
+
+msgid "Guideline"
+msgstr ""
+
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path or URL"
+msgstr ""
+
+msgid "HTTP Archive (HAR)"
+msgstr ""
+
+msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
+msgstr ""
+
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter new Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Leave blank to use your current password."
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "Hashed Storage must be enabled to use Geo"
+msgstr ""
+
+msgid "Hashed repository storage paths"
+msgstr ""
+
+msgid "Hashed storage can't be disabled anymore for new projects"
+msgstr ""
+
+msgid "Have a quick chat with us about your experience."
+msgstr ""
+
+msgid "Have more to say about GitLab?"
+msgstr ""
+
+msgid "Header logo"
+msgstr ""
+
+msgid "Header logo was successfully removed."
+msgstr ""
+
+msgid "Header logo will be removed. Are you sure?"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
+msgid "HeaderAction|incident"
+msgstr ""
+
+msgid "HeaderAction|issue"
+msgstr ""
+
+msgid "Headers"
+msgstr ""
+
+msgid "Heading 1"
+msgstr ""
+
+msgid "Heading 2"
+msgstr ""
+
+msgid "Heading 3"
+msgstr ""
+
+msgid "Heading 4"
+msgstr ""
+
+msgid "Health"
+msgstr ""
+
+msgid "Health Check"
+msgstr ""
+
+msgid "Health information can be retrieved from the following endpoints. More information is available"
+msgstr ""
+
+msgid "Health status"
+msgstr ""
+
+msgid "Health status cannot be edited because this issue is closed"
+msgstr ""
+
+msgid "HealthCheck|Access token is"
+msgstr ""
+
+msgid "HealthCheck|Healthy"
+msgstr ""
+
+msgid "HealthCheck|No Health Problems Detected"
+msgstr ""
+
+msgid "HealthCheck|Unhealthy"
+msgstr ""
+
+msgid "Hello %{name},"
+msgstr ""
+
+msgid "Hello, %{name}!"
+msgstr ""
+
+msgid "Hello, %{username}!"
+msgstr ""
+
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
+msgid "Help"
+msgstr ""
+
+msgid "Help translate GitLab into your language"
+msgstr ""
+
+msgid "Helps prevent bots from brute-force attacks."
+msgstr ""
+
+msgid "Helps prevent bots from creating accounts."
+msgstr ""
+
+msgid "Helps prevent bots from creating accounts. %{link_start}How do I configure it?%{link_end}"
+msgstr ""
+
+msgid "Helps prevent bots from creating issues."
+msgstr ""
+
+msgid "Helps prevent malicious users hide their activity."
+msgstr ""
+
+msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
+msgstr ""
+
+msgid "Helps reduce request volume for protected paths."
+msgstr ""
+
+msgid "Hi %{username}!"
+msgstr ""
+
+msgid "Hi %{username},"
+msgstr ""
+
+msgid "Hidden"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "Hide Live Preview"
+msgstr ""
+
+msgid "Hide archived projects"
+msgstr ""
+
+msgid "Hide chart"
+msgid_plural "Hide charts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Hide comments on this file"
+msgstr ""
+
+msgid "Hide details"
+msgstr ""
+
+msgid "Hide file browser"
+msgstr ""
+
+msgid "Hide group projects"
+msgstr ""
+
+msgid "Hide host keys manual input"
+msgstr ""
+
+msgid "Hide list"
+msgstr ""
+
+msgid "Hide marketing-related entries from the Help page"
+msgstr ""
+
+msgid "Hide payload"
+msgstr ""
+
+msgid "Hide shared projects"
+msgstr ""
+
+msgid "Hide thread"
+msgstr ""
+
+msgid "Hide tooltips or popovers"
+msgstr ""
+
+msgid "Hide value"
+msgid_plural "Hide values"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Hide values"
+msgstr ""
+
+msgid "Hierarchy|Current structure"
+msgstr ""
+
+msgid "Hierarchy|Deliver value more efficiently by breaking down necessary work into a hierarchical structure. This structure helps teams understand scope, priorities, and how work cascades up toward larger goals."
+msgstr ""
+
+msgid "Hierarchy|Help us improve work items in GitLab!"
+msgstr ""
+
+msgid "Hierarchy|Is there a framework or type of work item you wish you had access to in GitLab? Give us your feedback and help us build the experiences valuable to you."
+msgstr ""
+
+msgid "Hierarchy|Planning hierarchy"
+msgstr ""
+
+msgid "Hierarchy|Take the work items survey"
+msgstr ""
+
+msgid "Hierarchy|These items are unavailable in the current structure."
+msgstr ""
+
+msgid "Hierarchy|Unavailable structure"
+msgstr ""
+
+msgid "Hierarchy|You can start using these items now."
+msgstr ""
+
+msgid "High or unknown vulnerabilities present"
+msgstr ""
+
+msgid "Highest role:"
+msgstr ""
+
+msgid "HighlightBar|Alert events:"
+msgstr ""
+
+msgid "HighlightBar|Alert start time:"
+msgstr ""
+
+msgid "HighlightBar|Original alert:"
+msgstr ""
+
+msgid "HighlightBar|Time to SLA:"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "History of authentications"
+msgstr ""
+
+msgid "Holder name:"
+msgstr ""
+
+msgid "Home page URL"
+msgstr ""
+
+msgid "Homepage"
+msgstr ""
+
+msgid "Hook execution failed. Ensure the group has a project with commits."
+msgstr ""
+
+msgid "Hook was successfully updated."
+msgstr ""
+
+msgid "Horizontal rule"
+msgstr ""
+
+msgid "Hostname"
+msgstr ""
+
+msgid "Hostname used in private commit emails. %{learn_more}"
+msgstr ""
+
+msgid "Hour (UTC)"
+msgstr ""
+
+msgid "Housekeeping"
+msgstr ""
+
+msgid "Housekeeping successfully started"
+msgstr ""
+
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure runners?"
+msgstr ""
+
+msgid "How do I configure this integration?"
+msgstr ""
+
+msgid "How do I generate it?"
+msgstr ""
+
+msgid "How do I mirror repositories?"
+msgstr ""
+
+msgid "How do I rename an environment?"
+msgstr ""
+
+msgid "How do I set up a Google Chat webhook?"
+msgstr ""
+
+msgid "How do I set up this service?"
+msgstr ""
+
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
+msgstr ""
+
+msgid "I accept the %{terms_link}"
+msgstr ""
+
+msgid "I forgot my password"
+msgstr ""
+
+msgid "I want to explore GitLab to see if it’s worth switching to"
+msgstr ""
+
+msgid "I want to learn the basics of Git"
+msgstr ""
+
+msgid "I want to move my repository to GitLab from somewhere else"
+msgstr ""
+
+msgid "I want to store my code"
+msgstr ""
+
+msgid "I want to use GitLab CI with my existing repository"
+msgstr ""
+
+msgid "I'd like to receive updates about GitLab via email"
+msgstr ""
+
+msgid "I'm signing up for GitLab because:"
+msgstr ""
+
+msgid "ID"
+msgstr ""
+
+msgid "ID:"
+msgstr ""
+
+msgid "IDE"
+msgstr ""
+
+msgid "IDE|Back"
+msgstr ""
+
+msgid "IDE|Commit"
+msgstr ""
+
+msgid "IDE|Commit to %{branchName} branch"
+msgstr ""
+
+msgid "IDE|Edit"
+msgstr ""
+
+msgid "IDE|Get started with Live Preview"
+msgstr ""
+
+msgid "IDE|Go to project"
+msgstr ""
+
+msgid "IDE|Live Preview"
+msgstr ""
+
+msgid "IDE|Preview your web application using Web IDE client-side evaluation."
+msgstr ""
+
+msgid "IDE|Refresh preview"
+msgstr ""
+
+msgid "IDE|Review"
+msgstr ""
+
+msgid "IDE|Start a new merge request"
+msgstr ""
+
+msgid "IDE|Successful commit"
+msgstr ""
+
+msgid "IDE|This option is disabled because you are not allowed to create merge requests in this project."
+msgstr ""
+
+msgid "IDE|This option is disabled because you don't have write permissions for the current branch."
+msgstr ""
+
+msgid "INFO: Your SSH key has expired. Please generate a new key."
+msgstr ""
+
+msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
+msgstr ""
+
+msgid "IP Address"
+msgstr ""
+
+msgid "IP address expiration time"
+msgstr ""
+
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr ""
+
+msgid "Id"
+msgstr ""
+
+msgid "Identifier"
+msgstr ""
+
+msgid "Identifiers"
+msgstr ""
+
+msgid "Identities"
+msgstr ""
+
+msgid "IdentityVerification|Before you create your first project, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
+msgstr ""
+
+msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
+msgstr ""
+
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
+msgid "IdentityVerification|Create a project"
+msgstr ""
+
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
+msgid "IdentityVerification|Verify your identity"
+msgstr ""
+
+msgid "IdentityVerification|You can always verify your account at a later time to create a group."
+msgstr ""
+
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
+msgstr ""
+
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
+msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
+msgstr ""
+
+msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
+msgstr ""
+
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+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. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "If disabled, only administrators can configure repository mirroring."
+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 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:"
+msgstr ""
+
+msgid "If this email was added in error, you can remove it here: %{profile_emails_url}"
+msgstr ""
+
+msgid "If this is a mistake, you can %{link_start}unban them%{link_end}."
+msgstr ""
+
+msgid "If this is a mistake, you can unban them: %{url}."
+msgstr ""
+
+msgid "If this was a mistake you can %{leave_link_start}leave the %{source_type}%{link_end}."
+msgstr ""
+
+msgid "If this was a mistake you can leave the %{source_type}."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
+msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
+msgstr ""
+
+msgid "If you are added to a project, it will be displayed here."
+msgstr ""
+
+msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
+msgid "If you did not initiate this change, please contact your administrator immediately."
+msgstr ""
+
+msgid "If you did not perform this request, you can safely ignore this email."
+msgstr ""
+
+msgid "If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}."
+msgstr ""
+
+msgid "If you did not recently sign in, you should immediately change your password: %{password_link}."
+msgstr ""
+
+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."
+msgstr ""
+
+msgid "If you recently signed in and recognize the IP address, you may disregard this email."
+msgstr ""
+
+msgid "If you want to re-enable two-factor authentication, visit %{two_factor_link}"
+msgstr ""
+
+msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
+msgstr ""
+
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
+msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
+msgstr ""
+
+msgid "If your HTTP repository is not publicly accessible, add your credentials."
+msgstr ""
+
+msgid "Ignore"
+msgstr ""
+
+msgid "Ignored"
+msgstr ""
+
+msgid "Image URL"
+msgstr ""
+
+msgid "ImageDiffViewer|2-up"
+msgstr ""
+
+msgid "ImageDiffViewer|Onion skin"
+msgstr ""
+
+msgid "ImageDiffViewer|Swipe"
+msgstr ""
+
+msgid "ImageViewerDimensions|H"
+msgstr ""
+
+msgid "ImageViewerDimensions|W"
+msgstr ""
+
+msgid "Images with incorrect dimensions are not resized automatically, and may result in unexpected behavior."
+msgstr ""
+
+msgid "Impersonate"
+msgstr ""
+
+msgid "Impersonation Tokens"
+msgstr ""
+
+msgid "Impersonation has been disabled"
+msgstr ""
+
+msgid "Import"
+msgstr ""
+
+msgid "Import %d compatible repository"
+msgid_plural "Import %d compatible repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Import %d repository"
+msgid_plural "Import %d repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Import CSV"
+msgstr ""
+
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import an exported GitLab project"
+msgstr ""
+
+msgid "Import and export rate limits"
+msgstr ""
+
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
+msgstr ""
+
+msgid "Import from"
+msgstr ""
+
+msgid "Import from Jira"
+msgstr ""
+
+msgid "Import group"
+msgstr ""
+
+msgid "Import group from file"
+msgstr ""
+
+msgid "Import groups"
+msgstr ""
+
+msgid "Import history"
+msgstr ""
+
+msgid "Import in progress"
+msgstr ""
+
+msgid "Import in progress. Refresh page to see newly added issues."
+msgstr ""
+
+msgid "Import issues"
+msgstr ""
+
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import project from"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from Bitbucket Server"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import repositories from Bitbucket Server"
+msgstr ""
+
+msgid "Import repositories from GitHub"
+msgstr ""
+
+msgid "Import repository"
+msgstr ""
+
+msgid "Import requirements"
+msgstr ""
+
+msgid "Import started by: %{importInitiator}"
+msgstr ""
+
+msgid "Import tasks"
+msgstr ""
+
+msgid "Import tasks from Phabricator into issues"
+msgstr ""
+
+msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
+msgstr ""
+
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
+msgstr ""
+
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "ImportProjects|%{provider} rate limit exceeded. Try again later"
+msgstr ""
+
+msgid "ImportProjects|Blocked import URL: %{message}"
+msgstr ""
+
+msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
+msgstr ""
+
+msgid "ImportProjects|Import repositories"
+msgstr ""
+
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Importing the project failed: %{reason}"
+msgstr ""
+
+msgid "ImportProjects|Requesting namespaces failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the repositories you want to import"
+msgstr ""
+
+msgid "ImportProjects|The remote data could not be imported."
+msgstr ""
+
+msgid "ImportProjects|The repository could not be created."
+msgstr ""
+
+msgid "ImportProjects|Update of imported projects with realtime changes failed"
+msgstr ""
+
+msgid "Imported requirements"
+msgstr ""
+
+msgid "Importing %d repository"
+msgid_plural "Importing %d repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Importing..."
+msgstr ""
+
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
+msgstr ""
+
+msgid "Improve customer support with Service Desk"
+msgstr ""
+
+msgid "In a seat"
+msgstr ""
+
+msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
+msgstr ""
+
+msgid "In each example, replace %{code_start}TOKEN%{code_end} with the trigger token you generated and replace %{code_start}REF_NAME%{code_end} with the branch or tag name."
+msgstr ""
+
+msgid "In progress"
+msgstr ""
+
+msgid "In the background, we're attempting to connect you again."
+msgstr ""
+
+msgid "In this page you will find information about the settings that are used in your current instance."
+msgstr ""
+
+msgid "In use"
+msgstr ""
+
+msgid "InProductMarketing|%{organization_name} logo"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Advanced application security%{strong_end} — including SAST, DAST scanning, FUZZ testing, dependency scanning, license compliance, secrete detection"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Company wide portfolio management%{strong_end} — including multi-level epics, scoped labels"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Executive level insights%{strong_end} — including reporting on productivity, tasks by type, days to completion, value stream"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Overall, how difficult or easy was it to get started with GitLab?%{strong_end}"
+msgstr ""
+
+msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
+msgstr ""
+
+msgid "InProductMarketing|...and you can get a free trial of GitLab Ultimate"
+msgstr ""
+
+msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|A single application eliminates complex integrations, data chokepoints, and toolchain maintenance, resulting in greater productivity and lower cost."
+msgstr ""
+
+msgid "InProductMarketing|Access advanced features, build more efficiently, strengthen security and compliance."
+msgstr ""
+
+msgid "InProductMarketing|Access advanced features."
+msgstr ""
+
+msgid "InProductMarketing|Actually, GitLab makes the team work (better)"
+msgstr ""
+
+msgid "InProductMarketing|And finally %{deploy_link} a Python application."
+msgstr ""
+
+msgid "InProductMarketing|And many more..."
+msgstr ""
+
+msgid "InProductMarketing|Are your runners ready?"
+msgstr ""
+
+msgid "InProductMarketing|Automated security scans directly within GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Be a DevOps hero"
+msgstr ""
+
+msgid "InProductMarketing|Beef up your security"
+msgstr ""
+
+msgid "InProductMarketing|Better code in less time"
+msgstr ""
+
+msgid "InProductMarketing|Blog"
+msgstr ""
+
+msgid "InProductMarketing|Break down silos to coordinate seamlessly across development, operations, and security with a consistent experience across the development lifecycle."
+msgstr ""
+
+msgid "InProductMarketing|Building for iOS? We've got you covered."
+msgstr ""
+
+msgid "InProductMarketing|Burn up/down charts"
+msgstr ""
+
+msgid "InProductMarketing|By enabling code owners and required merge approvals the right person will review the right MR. This is a win-win: cleaner code and a more efficient review process."
+msgstr ""
+
+msgid "InProductMarketing|Click on the number below that corresponds with your answer — 1 being very difficult, 5 being very easy."
+msgstr ""
+
+msgid "InProductMarketing|Code owners"
+msgstr ""
+
+msgid "InProductMarketing|Code owners and required merge approvals are part of the paid tiers of GitLab. You can start a free 30-day trial of GitLab Ultimate and enable these features in less than 5 minutes with no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Code review analytics"
+msgstr ""
+
+msgid "InProductMarketing|Collaboration across stages in GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Collaboration made easy"
+msgstr ""
+
+msgid "InProductMarketing|Create a custom CI runner with just a few clicks"
+msgstr ""
+
+msgid "InProductMarketing|Create a custom runner"
+msgstr ""
+
+msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
+msgstr ""
+
+msgid "InProductMarketing|Create well-defined workflows by using scoped labels on issues, merge requests, and epics. Labels with the same scope cannot be used together, which prevents conflicts."
+msgstr ""
+
+msgid "InProductMarketing|Create your first project!"
+msgstr ""
+
+msgid "InProductMarketing|Define who owns specific files or directories, so the right reviewers are suggested when a merge request introduces changes to those files."
+msgstr ""
+
+msgid "InProductMarketing|Deliver Better Products Faster"
+msgstr ""
+
+msgid "InProductMarketing|Dependency scanning"
+msgstr ""
+
+msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
+msgstr ""
+
+msgid "InProductMarketing|Difficult"
+msgstr ""
+
+msgid "InProductMarketing|Dig in and create a project and a repo"
+msgstr ""
+
+msgid "InProductMarketing|Discover Premium & Ultimate"
+msgstr ""
+
+msgid "InProductMarketing|Discover Premium & Ultimate."
+msgstr ""
+
+msgid "InProductMarketing|Do you have a minute?"
+msgstr ""
+
+msgid "InProductMarketing|Do you have a teammate who would be perfect for this task?"
+msgstr ""
+
+msgid "InProductMarketing|Dynamic application security testing"
+msgstr ""
+
+msgid "InProductMarketing|Easy"
+msgstr ""
+
+msgid "InProductMarketing|Epics"
+msgstr ""
+
+msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
+msgstr ""
+
+msgid "InProductMarketing|Explore GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Explore the options"
+msgstr ""
+
+msgid "InProductMarketing|Explore the power of GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Facebook"
+msgstr ""
+
+msgid "InProductMarketing|Feedback from users like you really improves our product. Thanks for your help!"
+msgstr ""
+
+msgid "InProductMarketing|Feel the need for speed?"
+msgstr ""
+
+msgid "InProductMarketing|Find and fix bottlenecks in your code review process by understanding how long open merge requests have been in review."
+msgstr ""
+
+msgid "InProductMarketing|Find out how your teams are really doing"
+msgstr ""
+
+msgid "InProductMarketing|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+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 ""
+
+msgid "InProductMarketing|Get our import guides"
+msgstr ""
+
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
+msgid "InProductMarketing|Get started today"
+msgstr ""
+
+msgid "InProductMarketing|Get started today with a 30-day GitLab Ultimate trial, no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Get started with GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Get to know GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Get your team set up on GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Git basics"
+msgstr ""
+
+msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
+msgstr ""
+
+msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
+msgstr ""
+
+msgid "InProductMarketing|GitLab provides static application security testing (SAST), dynamic application security testing (DAST), container scanning, and dependency scanning to help you deliver secure applications along with license compliance."
+msgstr ""
+
+msgid "InProductMarketing|GitLab's CI/CD makes software development easier. Don't believe us? Here are three ways you can take it for a fast (and satisfying) test drive:"
+msgstr ""
+
+msgid "InProductMarketing|GitLab's premium tiers are designed to make you, your team and your application more efficient and more secure with features including but not limited to:"
+msgstr ""
+
+msgid "InProductMarketing|Give us one minute..."
+msgstr ""
+
+msgid "InProductMarketing|Go farther with GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Goldman Sachs went from 1 build every two weeks to thousands of builds a day"
+msgstr ""
+
+msgid "InProductMarketing|Have a different instance you'd like to import? Here's our %{import_link}."
+msgstr ""
+
+msgid "InProductMarketing|Here's what you need to know"
+msgstr ""
+
+msgid "InProductMarketing|How (and why) mirroring makes sense"
+msgstr ""
+
+msgid "InProductMarketing|How long does it take us to close issues/MRs by types like feature requests, bugs, tech debt, security?"
+msgstr ""
+
+msgid "InProductMarketing|How many days does it take our team to complete various tasks?"
+msgstr ""
+
+msgid "InProductMarketing|How to build and test faster"
+msgstr ""
+
+msgid "InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}."
+msgstr ""
+
+msgid "InProductMarketing|If you no longer wish to receive marketing emails from us,"
+msgstr ""
+
+msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket and others"
+msgstr ""
+
+msgid "InProductMarketing|Improve app security with a 30-day trial"
+msgstr ""
+
+msgid "InProductMarketing|Improve code quality and streamline reviews"
+msgstr ""
+
+msgid "InProductMarketing|Increase Operational Efficiencies"
+msgstr ""
+
+msgid "InProductMarketing|Invite them to help out."
+msgstr ""
+
+msgid "InProductMarketing|Invite your colleagues and start shipping code faster."
+msgstr ""
+
+msgid "InProductMarketing|Invite your colleagues to join in less than one minute"
+msgstr ""
+
+msgid "InProductMarketing|Invite your colleagues today"
+msgstr ""
+
+msgid "InProductMarketing|Invite your team in less than 60 seconds"
+msgstr ""
+
+msgid "InProductMarketing|Invite your team now"
+msgstr ""
+
+msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
+msgstr ""
+
+msgid "InProductMarketing|It's all in the stats"
+msgstr ""
+
+msgid "InProductMarketing|It's also possible to simply %{external_repo_link} in order to take advantage of GitLab's CI/CD."
+msgstr ""
+
+msgid "InProductMarketing|Keep your code quality high by defining who should approve merge requests and how many approvals are required."
+msgstr ""
+
+msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
+msgstr ""
+
+msgid "InProductMarketing|Learn how to build for iOS"
+msgstr ""
+
+msgid "InProductMarketing|Lower cost of development"
+msgstr ""
+
+msgid "InProductMarketing|Make it easier to collaborate on high-level ideas by grouping related issues in an epic."
+msgstr ""
+
+msgid "InProductMarketing|Making the switch? It's easier than you think to import your projects into GitLab. Move %{github_link}, or import something %{bitbucket_link}."
+msgstr ""
+
+msgid "InProductMarketing|Master the art of importing!"
+msgstr ""
+
+msgid "InProductMarketing|Merge request approval rule"
+msgstr ""
+
+msgid "InProductMarketing|Move on to easily creating a Pages website %{ci_template_link}"
+msgstr ""
+
+msgid "InProductMarketing|Multiple owners, confusing workstreams? We've got you covered"
+msgstr ""
+
+msgid "InProductMarketing|Multiple required approvers"
+msgstr ""
+
+msgid "InProductMarketing|Need an alternative to importing?"
+msgstr ""
+
+msgid "InProductMarketing|Neutral"
+msgstr ""
+
+msgid "InProductMarketing|No credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Our tool brings all the things together"
+msgstr ""
+
+msgid "InProductMarketing|Protect your web application by using DAST to examine for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "InProductMarketing|Rapid development, simplified"
+msgstr ""
+
+msgid "InProductMarketing|Reduce Security & Compliance Risk"
+msgstr ""
+
+msgid "InProductMarketing|Require multiple approvers on a merge request, so you know it's in good shape before it's merged."
+msgstr ""
+
+msgid "InProductMarketing|Roadmaps"
+msgstr ""
+
+msgid "InProductMarketing|Scoped labels"
+msgstr ""
+
+msgid "InProductMarketing|Security that's integrated into your development lifecycle"
+msgstr ""
+
+msgid "InProductMarketing|Sometimes you're not ready to make a full transition to a new tool. If you're not ready to fully commit, %{mirroring_link} gives you a safe way to try out GitLab in parallel with your current tool."
+msgstr ""
+
+msgid "InProductMarketing|Speed. Efficiency. Trust."
+msgstr ""
+
+msgid "InProductMarketing|Spin up an autoscaling runner in GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Start a Self-Managed trial"
+msgstr ""
+
+msgid "InProductMarketing|Start a free trial"
+msgstr ""
+
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
+msgstr ""
+
+msgid "InProductMarketing|Start a trial"
+msgstr ""
+
+msgid "InProductMarketing|Start by %{performance_link}"
+msgstr ""
+
+msgid "InProductMarketing|Start by importing your projects"
+msgstr ""
+
+msgid "InProductMarketing|Start with a GitLab Ultimate free trial"
+msgstr ""
+
+msgid "InProductMarketing|Start your trial now!"
+msgstr ""
+
+msgid "InProductMarketing|Start your trial today to experience single application success and discover all the features of GitLab Ultimate for free!"
+msgstr ""
+
+msgid "InProductMarketing|Stop wondering and use GitLab to answer questions like:"
+msgstr ""
+
+msgid "InProductMarketing|Streamline code review, know at a glance who's unavailable, communicate in comments or in email and integrate with Slack so everyone's on the same page."
+msgstr ""
+
+msgid "InProductMarketing|Take this 1-question survey!"
+msgstr ""
+
+msgid "InProductMarketing|Take your first steps with GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Take your source code management to the next level"
+msgstr ""
+
+msgid "InProductMarketing|Team members collaborating"
+msgstr ""
+
+msgid "InProductMarketing|Team up in GitLab for greater efficiency"
+msgstr ""
+
+msgid "InProductMarketing|Team work makes the dream work"
+msgstr ""
+
+msgid "InProductMarketing|Test, create, deploy"
+msgstr ""
+
+msgid "InProductMarketing|That's all it takes to get going with GitLab, but if you're new to working with Git, check out our %{basics_link} for helpful tips and tricks for getting started."
+msgstr ""
+
+msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series."
+msgstr ""
+
+msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series. To disable notification emails sent by your local GitLab instance, either contact your administrator or %{unsubscribe_link}."
+msgstr ""
+
+msgid "InProductMarketing|Ticketmaster decreased their CI build time by 15X"
+msgstr ""
+
+msgid "InProductMarketing|Tired of wrestling with disparate tool chains, information silos and inefficient processes? GitLab's CI/CD is built on a DevOps platform with source code management, planning, monitoring and more ready to go. Find out %{ci_link}."
+msgstr ""
+
+msgid "InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}."
+msgstr ""
+
+msgid "InProductMarketing|To understand and get the most out of GitLab, start at the beginning and %{project_link}. In GitLab, repositories are part of a project, so after you've created your project you can go ahead and %{repo_link}."
+msgstr ""
+
+msgid "InProductMarketing|Track completed issues in a chart, so you can see how a milestone is progressing at a glance."
+msgstr ""
+
+msgid "InProductMarketing|Try GitLab Ultimate for free"
+msgstr ""
+
+msgid "InProductMarketing|Try it out"
+msgstr ""
+
+msgid "InProductMarketing|Try it yourself"
+msgstr ""
+
+msgid "InProductMarketing|Turn coworkers into collaborators"
+msgstr ""
+
+msgid "InProductMarketing|Twitter"
+msgstr ""
+
+msgid "InProductMarketing|Understand repository mirroring"
+msgstr ""
+
+msgid "InProductMarketing|Understand your project options"
+msgstr ""
+
+msgid "InProductMarketing|Use GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Use our AWS cloudformation template to spin up your runners in just a few clicks!"
+msgstr ""
+
+msgid "InProductMarketing|Used by more than 100,000 organizations from around the globe:"
+msgstr ""
+
+msgid "InProductMarketing|Very difficult"
+msgstr ""
+
+msgid "InProductMarketing|Very easy"
+msgstr ""
+
+msgid "InProductMarketing|Visualize your epics and milestones in a timeline."
+msgstr ""
+
+msgid "InProductMarketing|Want to get your iOS app up and running, including publishing all the way to TestFlight? Follow our guide to set up GitLab and fastlane to publish iOS apps to the App Store."
+msgstr ""
+
+msgid "InProductMarketing|Want to host GitLab on your servers?"
+msgstr ""
+
+msgid "InProductMarketing|Watch iOS building in action."
+msgstr ""
+
+msgid "InProductMarketing|We know a thing or two about efficiency and we don't want to keep that to ourselves. Sign up for a free trial of GitLab Ultimate and your teams will be on it from day one."
+msgstr ""
+
+msgid "InProductMarketing|We want your GitLab experience to be great"
+msgstr ""
+
+msgid "InProductMarketing|What does our value stream timeline look like from product to development to review and production?"
+msgstr ""
+
+msgid "InProductMarketing|When your team is on GitLab these answers are a click away."
+msgstr ""
+
+msgid "InProductMarketing|Working in GitLab = more efficient"
+msgstr ""
+
+msgid "InProductMarketing|YouTube"
+msgstr ""
+
+msgid "InProductMarketing|Your software, deployed your way"
+msgstr ""
+
+msgid "InProductMarketing|Your teams can be more efficient"
+msgstr ""
+
+msgid "InProductMarketing|comprehensive guide"
+msgstr ""
+
+msgid "InProductMarketing|connect an external repository"
+msgstr ""
+
+msgid "InProductMarketing|create a project"
+msgstr ""
+
+msgid "InProductMarketing|from Bitbucket"
+msgstr ""
+
+msgid "InProductMarketing|go to about.gitlab.com"
+msgstr ""
+
+msgid "InProductMarketing|how easy it is to get started"
+msgstr ""
+
+msgid "InProductMarketing|quick start guide"
+msgstr ""
+
+msgid "InProductMarketing|repository mirroring"
+msgstr ""
+
+msgid "InProductMarketing|set up a repo"
+msgstr ""
+
+msgid "InProductMarketing|test and deploy"
+msgstr ""
+
+msgid "InProductMarketing|testing browser performance"
+msgstr ""
+
+msgid "InProductMarketing|unsubscribe"
+msgstr ""
+
+msgid "InProductMarketing|update your preferences"
+msgstr ""
+
+msgid "InProductMarketing|using a CI/CD template"
+msgstr ""
+
+msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
+msgstr ""
+
+msgid "Inactive"
+msgstr ""
+
+msgid "Incident"
+msgstr ""
+
+msgid "Incident Management Limits"
+msgstr ""
+
+msgid "Incident details"
+msgstr ""
+
+msgid "Incident template (optional)."
+msgstr ""
+
+msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
+msgstr ""
+
+msgid "IncidentManagement|%{minutes} minutes remaining"
+msgstr ""
+
+msgid "IncidentManagement|Achieved SLA"
+msgstr ""
+
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
+msgid "IncidentManagement|All"
+msgstr ""
+
+msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list."
+msgstr ""
+
+msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
+msgid "IncidentManagement|Assignees"
+msgstr ""
+
+msgid "IncidentManagement|Closed"
+msgstr ""
+
+msgid "IncidentManagement|Create incident"
+msgstr ""
+
+msgid "IncidentManagement|Critical - S1"
+msgstr ""
+
+msgid "IncidentManagement|Date created"
+msgstr ""
+
+msgid "IncidentManagement|Display your incidents in a dedicated view"
+msgstr ""
+
+msgid "IncidentManagement|High - S2"
+msgstr ""
+
+msgid "IncidentManagement|Incident"
+msgstr ""
+
+msgid "IncidentManagement|Incidents"
+msgstr ""
+
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
+msgid "IncidentManagement|Low - S4"
+msgstr ""
+
+msgid "IncidentManagement|Medium - S3"
+msgstr ""
+
+msgid "IncidentManagement|Missed SLA"
+msgstr ""
+
+msgid "IncidentManagement|No incidents to display."
+msgstr ""
+
+msgid "IncidentManagement|None"
+msgstr ""
+
+msgid "IncidentManagement|Open"
+msgstr ""
+
+msgid "IncidentManagement|Page your team with escalation policies"
+msgstr ""
+
+msgid "IncidentManagement|Paged"
+msgstr ""
+
+msgid "IncidentManagement|Published"
+msgstr ""
+
+msgid "IncidentManagement|Published to status page"
+msgstr ""
+
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
+msgid "IncidentManagement|Severity"
+msgstr ""
+
+msgid "IncidentManagement|Status"
+msgstr ""
+
+msgid "IncidentManagement|There are no closed incidents"
+msgstr ""
+
+msgid "IncidentManagement|There was an error displaying the incidents."
+msgstr ""
+
+msgid "IncidentManagement|Time to SLA"
+msgstr ""
+
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
+msgid "IncidentManagement|Unassigned"
+msgstr ""
+
+msgid "IncidentManagement|Unknown"
+msgstr ""
+
+msgid "IncidentManagement|Unpublished"
+msgstr ""
+
+msgid "IncidentManagement|Use escalation policies to automatically page your team when incidents are created."
+msgstr ""
+
+msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
+msgstr ""
+
+msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
+msgstr ""
+
+msgid "IncidentSettings|Grafana integration"
+msgstr ""
+
+msgid "IncidentSettings|Incident settings"
+msgstr ""
+
+msgid "IncidentSettings|Incidents"
+msgstr ""
+
+msgid "IncidentSettings|Introduce a countdown timer in incident issues to better track Service Level Agreements (SLAs). The timer starts automatically when the incident is created, and sets a time limit for resolving the incident. When activated, the time to SLA countdown appears on all new incidents."
+msgstr ""
+
+msgid "IncidentSettings|PagerDuty integration"
+msgstr ""
+
+msgid "IncidentSettings|Time limit"
+msgstr ""
+
+msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
+msgstr ""
+
+msgid "IncidentSettings|Time limit must be a valid number."
+msgstr ""
+
+msgid "IncidentSettings|Time limit must be greater than 0."
+msgstr ""
+
+msgid "IncidentSettings|When activated, this applies to all new incidents in the project."
+msgstr ""
+
+msgid "IncidentSettings|hours"
+msgstr ""
+
+msgid "IncidentSettings|minutes"
+msgstr ""
+
+msgid "Incidents"
+msgstr ""
+
+msgid "Incidents|Add image details"
+msgstr ""
+
+msgid "Incidents|Add text or a link to display with your image. If you don't add either, the file name displays instead."
+msgstr ""
+
+msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
+msgstr ""
+
+msgid "Incidents|Must start with http or https"
+msgstr ""
+
+msgid "Incident|Add new timeline event"
+msgstr ""
+
+msgid "Incident|Alert details"
+msgstr ""
+
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
+msgid "Incident|Are you sure you wish to delete this image?"
+msgstr ""
+
+msgid "Incident|Delete event"
+msgstr ""
+
+msgid "Incident|Delete image"
+msgstr ""
+
+msgid "Incident|Deleting %{filename}"
+msgstr ""
+
+msgid "Incident|Edit image text or link"
+msgstr ""
+
+msgid "Incident|Editing %{filename}"
+msgstr ""
+
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Metrics"
+msgstr ""
+
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
+msgid "Incident|Summary"
+msgstr ""
+
+msgid "Incident|There was an issue loading alert data. Please try again."
+msgstr ""
+
+msgid "Incident|There was an issue loading incident data. Please try again."
+msgstr ""
+
+msgid "Incident|Timeline"
+msgstr ""
+
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
+msgid "Include author name in notification email body"
+msgstr ""
+
+msgid "Include description in commit message"
+msgstr ""
+
+msgid "Include new features from all tiers."
+msgstr ""
+
+msgid "Include the name of the author of the issue, merge request or comment in the email body. By default, GitLab overrides the email sender's name. Some email servers don't support that option."
+msgstr ""
+
+msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
+msgstr ""
+
+msgid "Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited."
+msgstr ""
+
+msgid "Includes an MVC structure to help you get started"
+msgstr ""
+
+msgid "Includes an MVC structure, Gemfile, Rakefile, along with many others, to help you get started"
+msgstr ""
+
+msgid "Includes an MVC structure, mvnw and pom.xml to help you get started"
+msgstr ""
+
+msgid "Incoming email"
+msgstr ""
+
+msgid "Incoming!"
+msgstr ""
+
+msgid "Incompatible options set!"
+msgstr ""
+
+msgid "Incompatible project"
+msgstr ""
+
+msgid "Incomplete"
+msgstr ""
+
+msgid "Increase"
+msgstr ""
+
+msgid "Index"
+msgstr ""
+
+msgid "Index all projects"
+msgstr ""
+
+msgid "Index deletion is canceled"
+msgstr ""
+
+msgid "Indicates whether this runner can pick jobs without tags"
+msgstr ""
+
+msgid "Inform users without uploaded SSH keys that they can't push over SSH until one is added"
+msgstr ""
+
+msgid "Infrastructure"
+msgstr ""
+
+msgid "Infrastructure Registry"
+msgstr ""
+
+msgid "Infrastructure as Code (IaC) Scanning"
+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 ""
+
+msgid "InfrastructureRegistry|Publish and share your modules. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "InfrastructureRegistry|Terraform"
+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 ""
+
+msgid "Inherited"
+msgstr ""
+
+msgid "Inherited:"
+msgstr ""
+
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
+msgid "Inline"
+msgstr ""
+
+msgid "Inline math"
+msgstr ""
+
+msgid "Input host keys manually"
+msgstr ""
+
+msgid "Input the remote repository URL"
+msgstr ""
+
+msgid "Insert"
+msgstr ""
+
+msgid "Insert a %{rows}x%{cols} table."
+msgstr ""
+
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
+msgid "Insert column after"
+msgstr ""
+
+msgid "Insert column before"
+msgstr ""
+
+msgid "Insert image"
+msgstr ""
+
+msgid "Insert link"
+msgstr ""
+
+msgid "Insert row after"
+msgstr ""
+
+msgid "Insert row before"
+msgstr ""
+
+msgid "Insert suggestion"
+msgstr ""
+
+msgid "Insights"
+msgstr ""
+
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgstr ""
+
+msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
+msgstr ""
+
+msgid "Install GitLab Runner and ensure it's running."
+msgstr ""
+
+msgid "Install on clusters"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Instance Configuration"
+msgstr ""
+
+msgid "Instance access request"
+msgstr ""
+
+msgid "Instance access request approved"
+msgstr ""
+
+msgid "Instance access request rejected"
+msgstr ""
+
+msgid "Instance administrators group already exists"
+msgstr ""
+
+msgid "Instance audit events"
+msgstr ""
+
+msgid "Instance overview"
+msgstr ""
+
+msgid "Insufficient permissions"
+msgstr ""
+
+msgid "Insufficient permissions for dast_configuration keyword"
+msgstr ""
+
+msgid "Integration"
+msgstr ""
+
+msgid "Integration Settings"
+msgstr ""
+
+msgid "IntegrationEvents|A comment is added on a confidential issue"
+msgstr ""
+
+msgid "IntegrationEvents|A comment is added on an issue"
+msgstr ""
+
+msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
+msgstr ""
+
+msgid "IntegrationEvents|A merge request is created, updated, or merged"
+msgstr ""
+
+msgid "IntegrationEvents|A pipeline status changes"
+msgstr ""
+
+msgid "IntegrationEvents|A push is made to the repository"
+msgstr ""
+
+msgid "IntegrationEvents|A tag is pushed to the repository"
+msgstr ""
+
+msgid "IntegrationEvents|A wiki page is created or updated"
+msgstr ""
+
+msgid "IntegrationEvents|An issue is created, updated, or closed"
+msgstr ""
+
+msgid "Integrations"
+msgstr ""
+
+msgid "Integrations|%{integrationTitle}: active"
+msgstr ""
+
+msgid "Integrations|%{integration} settings saved and active."
+msgstr ""
+
+msgid "Integrations|%{integration} settings saved, but not active."
+msgstr ""
+
+msgid "Integrations|Active integrations"
+msgstr ""
+
+msgid "Integrations|Add an integration"
+msgstr ""
+
+msgid "Integrations|Add namespace"
+msgstr ""
+
+msgid "Integrations|All details"
+msgstr ""
+
+msgid "Integrations|All projects inheriting these settings will also be reset."
+msgstr ""
+
+msgid "Integrations|An error occurred while loading projects using custom settings."
+msgstr ""
+
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
+msgid "Integrations|Branches for which notifications are to be sent"
+msgstr ""
+
+msgid "Integrations|Clear if using a self-signed certificate."
+msgstr ""
+
+msgid "Integrations|Comment detail:"
+msgstr ""
+
+msgid "Integrations|Comment settings:"
+msgstr ""
+
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
+msgid "Integrations|Connection details"
+msgstr ""
+
+msgid "Integrations|Connection failed. Check your integration settings."
+msgstr ""
+
+msgid "Integrations|Connection successful."
+msgstr ""
+
+msgid "Integrations|Create new issue in Jira"
+msgstr ""
+
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
+msgid "Integrations|Default settings are inherited from the group level."
+msgstr ""
+
+msgid "Integrations|Default settings are inherited from the instance level."
+msgstr ""
+
+msgid "Integrations|Edit project alias"
+msgstr ""
+
+msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
+msgstr ""
+
+msgid "Integrations|Enable SSL verification"
+msgstr ""
+
+msgid "Integrations|Enable comments"
+msgstr ""
+
+msgid "Integrations|Enter your alias"
+msgstr ""
+
+msgid "Integrations|Failed to link namespace. Please try again."
+msgstr ""
+
+msgid "Integrations|Failed to load namespaces. Please try again."
+msgstr ""
+
+msgid "Integrations|Failed to load subscriptions."
+msgstr ""
+
+msgid "Integrations|Failed to sign in to GitLab."
+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 ""
+
+msgid "Integrations|Keep your PHP dependencies updated on Packagist."
+msgstr ""
+
+msgid "Integrations|Known limitations"
+msgstr ""
+
+msgid "Integrations|Link namespaces"
+msgstr ""
+
+msgid "Integrations|Linked namespaces"
+msgstr ""
+
+msgid "Integrations|Namespace successfully linked"
+msgstr ""
+
+msgid "Integrations|Namespaces are the GitLab groups and subgroups you link to this Jira instance."
+msgstr ""
+
+msgid "Integrations|No available namespaces."
+msgstr ""
+
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Notification settings"
+msgstr ""
+
+msgid "Integrations|Projects using custom settings"
+msgstr ""
+
+msgid "Integrations|Projects using custom settings will not be affected."
+msgstr ""
+
+msgid "Integrations|Projects using custom settings will not be impacted unless the project owner chooses to use parent level defaults."
+msgstr ""
+
+msgid "Integrations|Reset integration?"
+msgstr ""
+
+msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
+msgstr ""
+
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
+msgid "Integrations|Return to GitLab for Jira"
+msgstr ""
+
+msgid "Integrations|SSL verification"
+msgstr ""
+
+msgid "Integrations|Save settings?"
+msgstr ""
+
+msgid "Integrations|Saving will update the default settings for all projects that are not using custom settings."
+msgstr ""
+
+msgid "Integrations|Search Jira issues"
+msgstr ""
+
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
+msgid "Integrations|Send notifications about project events to Unify Circuit."
+msgstr ""
+
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
+msgid "Integrations|Sign in to GitLab"
+msgstr ""
+
+msgid "Integrations|Sign in to add namespaces"
+msgstr ""
+
+msgid "Integrations|Standard"
+msgstr ""
+
+msgid "Integrations|There are no projects using custom settings"
+msgstr ""
+
+msgid "Integrations|This integration only works with GitLab.com. Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "Integrations|This integration, and inheriting projects were reset."
+msgstr ""
+
+msgid "Integrations|To keep this project going, create a new issue."
+msgstr ""
+
+msgid "Integrations|Trigger"
+msgstr ""
+
+msgid "Integrations|Use custom settings"
+msgstr ""
+
+msgid "Integrations|Use default settings"
+msgstr ""
+
+msgid "Integrations|You can close this window."
+msgstr ""
+
+msgid "Integrations|You can use this alias in your Slack commands"
+msgstr ""
+
+msgid "Integrations|You haven't activated any integrations yet."
+msgstr ""
+
+msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
+msgstr ""
+
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
+msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "Integrations|You've activated every integration 🎉"
+msgstr ""
+
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
+msgid "Integrations|can't exceed %{recipients_limit}"
+msgstr ""
+
+msgid "IntelliJ IDEA (HTTPS)"
+msgstr ""
+
+msgid "IntelliJ IDEA (SSH)"
+msgstr ""
+
+msgid "Interactive mode"
+msgstr ""
+
+msgid "Interested parties can even contribute by pushing commits if they want to."
+msgstr ""
+
+msgid "Internal"
+msgstr ""
+
+msgid "Internal - The group and any internal projects can be viewed by any logged in user except external users."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user except external users."
+msgstr ""
+
+msgid "Internal error occurred while delivering this webhook."
+msgstr ""
+
+msgid "Internal note"
+msgstr ""
+
+msgid "Internal users"
+msgstr ""
+
+msgid "Internal users cannot be deactivated"
+msgstr ""
+
+msgid "Interval"
+msgstr ""
+
+msgid "Interval Pattern"
+msgstr ""
+
+msgid "Introduced in GitLab 13.1, before using %{reindexing_link_start}zero-downtime reindexing%{link_end} and %{migrations_link_start}Advanced Search migrations%{link_end}, you need to %{recreate_link_start}recreate your index%{link_end}."
+msgstr ""
+
+msgid "Introducing Your DevOps Reports"
+msgstr ""
+
+msgid "Invalid"
+msgstr ""
+
+msgid "Invalid Insights config file detected"
+msgstr ""
+
+msgid "Invalid OS"
+msgstr ""
+
+msgid "Invalid URL"
+msgstr ""
+
+msgid "Invalid URL: %{url}"
+msgstr ""
+
+msgid "Invalid date"
+msgstr ""
+
+msgid "Invalid date format. Please use UTC format as YYYY-MM-DD"
+msgstr ""
+
+msgid "Invalid date range"
+msgstr ""
+
+msgid "Invalid feature"
+msgstr ""
+
+msgid "Invalid field"
+msgstr ""
+
+msgid "Invalid file format with specified file type"
+msgstr ""
+
+msgid "Invalid file."
+msgstr ""
+
+msgid "Invalid format selected"
+msgstr ""
+
+msgid "Invalid hash"
+msgstr ""
+
+msgid "Invalid import params"
+msgstr ""
+
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
+msgid "Invalid login or password"
+msgstr ""
+
+msgid "Invalid period"
+msgstr ""
+
+msgid "Invalid pin code."
+msgstr ""
+
+msgid "Invalid policy type"
+msgstr ""
+
+msgid "Invalid repository bundle for snippet with id %{snippet_id}"
+msgstr ""
+
+msgid "Invalid repository path"
+msgstr ""
+
+msgid "Invalid rule"
+msgstr ""
+
+msgid "Invalid server response"
+msgstr ""
+
+msgid "Invalid status"
+msgstr ""
+
+msgid "Invalid two-factor code."
+msgstr ""
+
+msgid "Invalid yaml"
+msgstr ""
+
+msgid "Investigate vulnerability: %{title}"
+msgstr ""
+
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
+msgid "Invitation"
+msgstr ""
+
+msgid "Invitation declined"
+msgstr ""
+
+msgid "Invite \"%{email}\" by email"
+msgstr ""
+
+msgid "Invite \"%{trimmed}\" by email"
+msgstr ""
+
+msgid "Invite Members"
+msgstr ""
+
+msgid "Invite a group"
+msgstr ""
+
+msgid "Invite members"
+msgstr ""
+
+msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{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} as a %{role}"
+msgstr ""
+
+msgid "InviteEmail|%{project_or_group} details"
+msgstr ""
+
+msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
+msgstr ""
+
+msgid "InviteEmail|Join now"
+msgstr ""
+
+msgid "InviteEmail|Join your team on GitLab! %{inviter} invited you to %{project_or_group_name}"
+msgstr ""
+
+msgid "InviteEmail|Join your team on GitLab! You are invited to %{project_or_group_name}"
+msgstr ""
+
+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'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}"
+msgstr ""
+
+msgid "InviteEmail|You have been invited to join the %{project_or_group_name} %{project_or_group} as a %{role}"
+msgstr ""
+
+msgid "InviteEmail|You were assigned the following tasks:"
+msgstr ""
+
+msgid "InviteEmail|and has assigned you the following tasks:"
+msgstr ""
+
+msgid "InviteMembersBanner|Collaborate with your team"
+msgstr ""
+
+msgid "InviteMembersBanner|Invite your colleagues"
+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| To get more members and access to additional paid features, an owner of this namespace can start a trial or upgrade to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgstr ""
+
+msgid "InviteMembersModal|Access expiration date (optional)"
+msgstr ""
+
+msgid "InviteMembersModal|Cancel"
+msgstr ""
+
+msgid "InviteMembersModal|Choose a project for the issues"
+msgstr ""
+
+msgid "InviteMembersModal|Close invite team members"
+msgstr ""
+
+msgid "InviteMembersModal|Congratulations on creating your project, you're almost there!"
+msgstr ""
+
+msgid "InviteMembersModal|Create issues for your new team member to work on (optional)"
+msgstr ""
+
+msgid "InviteMembersModal|Explore paid plans"
+msgstr ""
+
+msgid "InviteMembersModal|GitLab is better with colleagues!"
+msgstr ""
+
+msgid "InviteMembersModal|How about inviting a colleague or two to join you?"
+msgstr ""
+
+msgid "InviteMembersModal|Invite"
+msgstr ""
+
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
+msgid "InviteMembersModal|Invite members"
+msgstr ""
+
+msgid "InviteMembersModal|Manage members"
+msgstr ""
+
+msgid "InviteMembersModal|Members were successfully added"
+msgstr ""
+
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
+msgid "InviteMembersModal|Select members or type email addresses"
+msgstr ""
+
+msgid "InviteMembersModal|Something went wrong"
+msgstr ""
+
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
+msgstr ""
+
+msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
+msgstr ""
+
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|To make more space, you can remove members who no longer need access."
+msgstr ""
+
+msgid "InviteMembersModal|Username or email address"
+msgstr ""
+
+msgid "InviteMembersModal|You cannot add more members, but you can remove members who no longer need access."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in your personal projects"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} project."
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} group."
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
+msgstr ""
+
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for your personal projects"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
+msgstr ""
+
+msgid "InviteMembers|Invite team members"
+msgstr ""
+
+msgid "InviteMember|Add members to this project and start collaborating with your team."
+msgstr ""
+
+msgid "InviteMember|Invite Members (optional)"
+msgstr ""
+
+msgid "InviteMember|Invite another member"
+msgstr ""
+
+msgid "InviteMember|Invite members"
+msgstr ""
+
+msgid "InviteMember|Invite your team"
+msgstr ""
+
+msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter} is still waiting for you to join GitLab"
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter} is waiting for you to join GitLab"
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter} is waiting for you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter}'s invitation to GitLab is pending"
+msgstr ""
+
+msgid "InviteReminderEmail|Accept invitation"
+msgstr ""
+
+msgid "InviteReminderEmail|Accept invitation: %{invite_url}"
+msgstr ""
+
+msgid "InviteReminderEmail|Decline invitation"
+msgstr ""
+
+msgid "InviteReminderEmail|Decline invitation: %{decline_url}"
+msgstr ""
+
+msgid "InviteReminderEmail|Hey there %{wave_emoji}"
+msgstr ""
+
+msgid "InviteReminderEmail|Hey there!"
+msgstr ""
+
+msgid "InviteReminderEmail|In case you missed it..."
+msgstr ""
+
+msgid "InviteReminderEmail|Invitation pending"
+msgstr ""
+
+msgid "InviteReminderEmail|It's been %{invitation_age} days since %{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}. What would you like to do?"
+msgstr ""
+
+msgid "InviteReminderEmail|This is a friendly reminder that %{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
+msgstr ""
+
+msgid "Invited"
+msgstr ""
+
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
+msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
+msgstr ""
+
+msgid "IrkerService|Default IRC URI (optional)"
+msgstr ""
+
+msgid "IrkerService|How to enter channels or users?"
+msgstr ""
+
+msgid "IrkerService|Recipients"
+msgstr ""
+
+msgid "IrkerService|Send update messages to an irker server."
+msgstr ""
+
+msgid "IrkerService|Send update messages to an irker server. Before you can use this, you need to set up the irker daemon. %{docs_link}"
+msgstr ""
+
+msgid "IrkerService|Server host (optional)"
+msgstr ""
+
+msgid "IrkerService|Server port (optional)"
+msgstr ""
+
+msgid "IrkerService|URI to add before each recipient."
+msgstr ""
+
+msgid "IrkerService|irker (IRC gateway)"
+msgstr ""
+
+msgid "IrkerService|irker daemon hostname (defaults to localhost)."
+msgstr ""
+
+msgid "IrkerService|irker daemon port (defaults to 6659)."
+msgstr ""
+
+msgid "Is blocked by"
+msgstr ""
+
+msgid "Is using license seat:"
+msgstr ""
+
+msgid "Is using seat"
+msgstr ""
+
+msgid "IssuableStatus|Closed"
+msgstr ""
+
+msgid "IssuableStatus|Closed (%{link})"
+msgstr ""
+
+msgid "IssuableStatus|duplicated"
+msgstr ""
+
+msgid "IssuableStatus|moved"
+msgstr ""
+
+msgid "IssuableStatus|promoted"
+msgstr ""
+
+msgid "Issue"
+msgstr ""
+
+msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}."
+msgstr ""
+
+msgid "Issue Analytics"
+msgstr ""
+
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue Type"
+msgstr ""
+
+msgid "Issue already promoted to epic."
+msgstr ""
+
+msgid "Issue cannot be found."
+msgstr ""
+
+msgid "Issue created from vulnerability %{vulnerability_link}"
+msgstr ""
+
+msgid "Issue creation requests"
+msgstr ""
+
+msgid "Issue details"
+msgstr ""
+
+msgid "Issue events"
+msgstr ""
+
+msgid "Issue first deployed to production"
+msgstr ""
+
+msgid "Issue has been promoted to incident"
+msgstr ""
+
+msgid "Issue label"
+msgstr ""
+
+msgid "Issue or merge request ID is required"
+msgstr ""
+
+msgid "Issue published on status page."
+msgstr ""
+
+msgid "Issue types"
+msgstr ""
+
+msgid "Issue update failed"
+msgstr ""
+
+msgid "Issue was closed by %{name} %{reason}"
+msgstr ""
+
+msgid "Issue weight"
+msgstr ""
+
+msgid "IssueAnalytics|Age"
+msgstr ""
+
+msgid "IssueAnalytics|Assignees"
+msgstr ""
+
+msgid "IssueAnalytics|Created by"
+msgstr ""
+
+msgid "IssueAnalytics|Due date"
+msgstr ""
+
+msgid "IssueAnalytics|Failed to load issues. Please try again."
+msgstr ""
+
+msgid "IssueAnalytics|Issue"
+msgstr ""
+
+msgid "IssueAnalytics|Milestone"
+msgstr ""
+
+msgid "IssueAnalytics|Status"
+msgstr ""
+
+msgid "IssueAnalytics|Weight"
+msgstr ""
+
+msgid "IssueBoards|Board"
+msgstr ""
+
+msgid "IssueBoards|Boards"
+msgstr ""
+
+msgid "IssueBoards|Create new board"
+msgstr ""
+
+msgid "IssueBoards|Delete board"
+msgstr ""
+
+msgid "IssueBoards|No matching boards found"
+msgstr ""
+
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
+
+msgid "IssueBoards|Switch board"
+msgstr ""
+
+msgid "IssueList|created %{timeAgoString} by %{user}"
+msgstr ""
+
+msgid "IssueTracker|Custom issue tracker"
+msgstr ""
+
+msgid "IssueTracker|Issue URL"
+msgstr ""
+
+msgid "IssueTracker|New issue URL"
+msgstr ""
+
+msgid "IssueTracker|The URL to create an issue in the external issue tracker."
+msgstr ""
+
+msgid "IssueTracker|The URL to the project in the external issue tracker."
+msgstr ""
+
+msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
+msgstr ""
+
+msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use Redmine as the issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use Redmine as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use YouTrack as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use YouTrack as this project's issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use a custom issue tracker as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use a custom issue tracker that is not in the integration list. %{docs_link}"
+msgstr ""
+
+msgid "Issues"
+msgstr ""
+
+msgid "Issues Rate Limits"
+msgstr ""
+
+msgid "Issues and merge requests"
+msgstr ""
+
+msgid "Issues are being rebalanced at the moment, so manual reordering is disabled."
+msgstr ""
+
+msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
+msgstr ""
+
+msgid "Issues closed"
+msgstr ""
+
+msgid "Issues exist in projects, so to create an issue, first create a project."
+msgstr ""
+
+msgid "Issues must match this scope to appear in this list."
+msgstr ""
+
+msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
+msgstr ""
+
+msgid "Issues with label %{label}"
+msgstr ""
+
+msgid "Issues with no epic assigned"
+msgstr ""
+
+msgid "Issues, merge requests, pushes, and comments."
+msgstr ""
+
+msgid "IssuesAnalytics|After you begin creating issues for your projects, we can start tracking and displaying metrics for them"
+msgstr ""
+
+msgid "IssuesAnalytics|Avg/Month:"
+msgstr ""
+
+msgid "IssuesAnalytics|Issues created"
+msgstr ""
+
+msgid "IssuesAnalytics|Issues created per month"
+msgstr ""
+
+msgid "IssuesAnalytics|Last 12 months"
+msgstr ""
+
+msgid "IssuesAnalytics|Sorry, your filter produced no results"
+msgstr ""
+
+msgid "IssuesAnalytics|There are no issues for the projects in your group"
+msgstr ""
+
+msgid "IssuesAnalytics|To widen your search, change or remove filters in the filter bar above"
+msgstr ""
+
+msgid "IssuesAnalytics|Total:"
+msgstr ""
+
+msgid "Issue|Title"
+msgstr ""
+
+msgid "It is not possible to %{action} files that are stored in LFS using the web interface"
+msgstr ""
+
+msgid "It looks like you have some draft commits in this branch."
+msgstr ""
+
+msgid "It looks like you're attempting to activate your subscription. Use %{a_start}the Subscription page%{a_end} instead."
+msgstr ""
+
+msgid "It may be several days before you see feature usage data."
+msgstr ""
+
+msgid "It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected."
+msgstr ""
+
+msgid "It seems like the Dependency Scanning job ran successfully, but no dependencies have been detected in your project."
+msgstr ""
+
+msgid "It seems that there is currently no available data for code coverage"
+msgstr ""
+
+msgid "It's you"
+msgstr ""
+
+msgid "Italic text"
+msgstr ""
+
+msgid "Iteration"
+msgstr ""
+
+msgid "Iteration changed to"
+msgstr ""
+
+msgid "Iteration lists not available with your current license"
+msgstr ""
+
+msgid "Iteration removed"
+msgstr ""
+
+msgid "Iteration updated"
+msgstr ""
+
+msgid "Iterations"
+msgstr ""
+
+msgid "Iterations|Add iteration"
+msgstr ""
+
+msgid "Iterations|All"
+msgstr ""
+
+msgid "Iterations|Cadence configuration is invalid."
+msgstr ""
+
+msgid "Iterations|Cadence name"
+msgstr ""
+
+msgid "Iterations|Can be converted"
+msgstr ""
+
+msgid "Iterations|Cancel"
+msgstr ""
+
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
+msgid "Iterations|Create cadence"
+msgstr ""
+
+msgid "Iterations|Create iteration"
+msgstr ""
+
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
+msgid "Iterations|Description"
+msgstr ""
+
+msgid "Iterations|Done"
+msgstr ""
+
+msgid "Iterations|Due date"
+msgstr ""
+
+msgid "Iterations|Duration"
+msgstr ""
+
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
+msgid "Iterations|Error loading iteration cadences."
+msgstr ""
+
+msgid "Iterations|First iteration start date"
+msgstr ""
+
+msgid "Iterations|Iteration cadences"
+msgstr ""
+
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
+msgstr ""
+
+msgid "Iterations|Manual management of iterations will be deprecated in GitLab 15.6. Convert your manual cadence to use automated scheduling when you are ready."
+msgstr ""
+
+msgid "Iterations|Move incomplete issues to the next iteration."
+msgstr ""
+
+msgid "Iterations|New iteration"
+msgstr ""
+
+msgid "Iterations|New iteration cadence"
+msgstr ""
+
+msgid "Iterations|No closed iterations."
+msgstr ""
+
+msgid "Iterations|No iteration cadences to show."
+msgstr ""
+
+msgid "Iterations|No iterations found"
+msgstr ""
+
+msgid "Iterations|No iterations in cadence."
+msgstr ""
+
+msgid "Iterations|No one can change this date after the cadence has begun."
+msgstr ""
+
+msgid "Iterations|No open iterations."
+msgstr ""
+
+msgid "Iterations|Number of upcoming iterations that should be scheduled at a time."
+msgstr ""
+
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save changes"
+msgstr ""
+
+msgid "Iterations|Select duration"
+msgstr ""
+
+msgid "Iterations|Select number"
+msgstr ""
+
+msgid "Iterations|Select start date"
+msgstr ""
+
+msgid "Iterations|Start date"
+msgstr ""
+
+msgid "Iterations|The duration of each iteration (in weeks)."
+msgstr ""
+
+msgid "Iterations|The iteration has been deleted."
+msgstr ""
+
+msgid "Iterations|The start date of the first iteration determines when your cadence begins."
+msgstr ""
+
+msgid "Iterations|This cadence can be converted to use automated scheduling"
+msgstr ""
+
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
+msgid "Iterations|Title"
+msgstr ""
+
+msgid "Iterations|To convert this cadence to automatic scheduling, add a duration and number of upcoming iterations. The upgrade is irreversible."
+msgstr ""
+
+msgid "Iterations|Unable to find iteration cadence."
+msgstr ""
+
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
+msgid "Iterations|Unable to save cadence. Please try again."
+msgstr ""
+
+msgid "Iterations|Upcoming iterations"
+msgstr ""
+
+msgid "Iterations|Your manual cadence can be converted to use automated scheduling"
+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 ""
+
+msgid "Jan"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "Japanese language support using"
+msgstr ""
+
+msgid "Jira display name"
+msgstr ""
+
+msgid "Jira import is already running."
+msgstr ""
+
+msgid "Jira integration not configured."
+msgstr ""
+
+msgid "Jira project key is not configured."
+msgstr ""
+
+msgid "Jira project: %{importProject}"
+msgstr ""
+
+msgid "Jira service not configured."
+msgstr ""
+
+msgid "Jira user"
+msgstr ""
+
+msgid "Jira users have been imported from the configured Jira instance. They can be mapped by selecting a GitLab user from the dropdown in the \"GitLab username\" column. When the form appears, the dropdown defaults to the user conducting the import."
+msgstr ""
+
+msgid "Jira-GitLab user mapping template"
+msgstr ""
+
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
+msgid "JiraConnect|Configure your Jira Connect Application ID."
+msgstr ""
+
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
+msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
+msgstr ""
+
+msgid "JiraConnect|Failed to create branch."
+msgstr ""
+
+msgid "JiraConnect|Failed to create branch. Please try again."
+msgstr ""
+
+msgid "JiraConnect|GitLab for Jira App"
+msgstr ""
+
+msgid "JiraConnect|Jira Connect Application ID"
+msgstr ""
+
+msgid "JiraConnect|New branch was successfully created."
+msgstr ""
+
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
+msgid "JiraConnect|You can now close this window and return to Jira."
+msgstr ""
+
+msgid "JiraConnect|You don't have permission to create branches for this project. Select a different project or contact the project owner for access. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
+msgstr ""
+
+msgid "JiraRequest|A timeout error occurred while connecting to Jira. Try your request again."
+msgstr ""
+
+msgid "JiraRequest|An SSL error occurred while connecting to Jira: %{message}. Try your request again."
+msgstr ""
+
+msgid "JiraRequest|An error occurred while requesting data from Jira. Check your %{docs_link_start}Jira integration configuration%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraRequest|An error occurred while requesting data from Jira: %{messages}. Check your %{docs_link_start}Jira integration configuration%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraRequest|The Jira API URL for connecting to Jira is not valid. Check your Jira integration API URL and try again."
+msgstr ""
+
+msgid "JiraRequest|The credentials for accessing Jira are not allowed to access the data. Check your %{docs_link_start}Jira integration credentials%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraRequest|The credentials for accessing Jira are not valid. Check your %{docs_link_start}Jira integration credentials%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraService| on branch %{branch_link}"
+msgstr ""
+
+msgid "JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab."
+msgstr ""
+
+msgid "JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs_link_end} to view your Jira issues in GitLab."
+msgstr ""
+
+msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
+msgstr ""
+
+msgid "JiraService|An error occurred while fetching issue list"
+msgstr ""
+
+msgid "JiraService|Automatically transitions Jira issues to the \"Done\" category. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "JiraService|Base URL of the Jira instance."
+msgstr ""
+
+msgid "JiraService|Change GitLab version"
+msgstr ""
+
+msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
+msgstr ""
+
+msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{gitlab_issues_link_start}disabling GitLab issues%{link_end} if they won't otherwise be used."
+msgstr ""
+
+msgid "JiraService|Enable Jira issue creation from vulnerabilities"
+msgstr ""
+
+msgid "JiraService|Enable Jira issues"
+msgstr ""
+
+msgid "JiraService|Enable Jira transitions"
+msgstr ""
+
+msgid "JiraService|Enter new password or API token"
+msgstr ""
+
+msgid "JiraService|Events for %{noteable_model_name} are disabled."
+msgstr ""
+
+msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
+msgstr ""
+
+msgid "JiraService|Fetch issue types for this Jira project"
+msgstr ""
+
+msgid "JiraService|For example, 12, 24"
+msgstr ""
+
+msgid "JiraService|For example, AB"
+msgstr ""
+
+msgid "JiraService|For example: https://gitlab.example.com"
+msgstr ""
+
+msgid "JiraService|GitLab for Jira Configuration"
+msgstr ""
+
+msgid "JiraService|GitLab instance URL"
+msgstr ""
+
+msgid "JiraService|IDs must be a list of numbers that can be split with , or ;"
+msgstr ""
+
+msgid "JiraService|If different from Web URL."
+msgstr ""
+
+msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
+msgstr ""
+
+msgid "JiraService|Jira API URL"
+msgstr ""
+
+msgid "JiraService|Jira comments are created when an issue is referenced in a commit."
+msgstr ""
+
+msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
+msgstr ""
+
+msgid "JiraService|Jira issues"
+msgstr ""
+
+msgid "JiraService|Jira project key"
+msgstr ""
+
+msgid "JiraService|Leave blank to use your current password or API token."
+msgstr ""
+
+msgid "JiraService|Move to Done"
+msgstr ""
+
+msgid "JiraService|Open Jira"
+msgstr ""
+
+msgid "JiraService|Password or API token"
+msgstr ""
+
+msgid "JiraService|Project key changed, refresh list"
+msgstr ""
+
+msgid "JiraService|Project key is required to generate issue types"
+msgstr ""
+
+msgid "JiraService|Select issue type"
+msgstr ""
+
+msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart}Learn about transition IDs%{linkEnd}"
+msgstr ""
+
+msgid "JiraService|Sign in to GitLab to link namespaces."
+msgstr ""
+
+msgid "JiraService|Sign in to GitLab.com to get started."
+msgstr ""
+
+msgid "JiraService|This feature requires a Premium plan."
+msgstr ""
+
+msgid "JiraService|Transition Jira issues to their final state:"
+msgstr ""
+
+msgid "JiraService|Use Jira as this project's issue tracker."
+msgstr ""
+
+msgid "JiraService|Use a password for server version and an API token for cloud version."
+msgstr ""
+
+msgid "JiraService|Use a username for server version and an email for cloud version."
+msgstr ""
+
+msgid "JiraService|Use custom transitions"
+msgstr ""
+
+msgid "JiraService|Username or Email"
+msgstr ""
+
+msgid "JiraService|Using Jira for issue tracking?"
+msgstr ""
+
+msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
+msgstr ""
+
+msgid "JiraService|Web URL"
+msgstr ""
+
+msgid "JiraService|Welcome to GitLab for Jira"
+msgstr ""
+
+msgid "JiraService|What version of GitLab are you using?"
+msgstr ""
+
+msgid "JiraService|When a Jira issue is mentioned in a commit or merge request, a remote link and comment (if enabled) will be created."
+msgstr ""
+
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
+msgstr ""
+
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "JiraService|You can now close this window and%{br}return to the GitLab for Jira application."
+msgstr ""
+
+msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Job %{jobName}"
+msgstr ""
+
+msgid "Job Failed #%{build_id}"
+msgstr ""
+
+msgid "Job has been erased"
+msgstr ""
+
+msgid "Job has been successfully erased!"
+msgstr ""
+
+msgid "Job has wrong arguments format."
+msgstr ""
+
+msgid "Job is missing the `model_type` argument."
+msgstr ""
+
+msgid "Job is stuck. Check runners."
+msgstr ""
+
+msgid "Job logs and artifacts"
+msgstr ""
+
+msgid "Job to create self-monitoring project is in progress"
+msgstr ""
+
+msgid "Job to delete self-monitoring project is in progress"
+msgstr ""
+
+msgid "Job was retried"
+msgstr ""
+
+msgid "Jobs"
+msgstr ""
+
+msgid "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}."
+msgstr ""
+
+msgid "Jobs older than the configured time are considered expired and are archived. Archived jobs can no longer be retried. Leave empty to never archive jobs automatically. The default unit is in days, but you can use other units, for example %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}. Minimum value is 1 day."
+msgstr ""
+
+msgid "Jobs|All"
+msgstr ""
+
+msgid "Jobs|An error occurred while loading the Failed Jobs tab."
+msgstr ""
+
+msgid "Jobs|Are you sure you want to proceed?"
+msgstr ""
+
+msgid "Jobs|Are you sure you want to retry this job?"
+msgstr ""
+
+msgid "Jobs|Create CI/CD configuration file"
+msgstr ""
+
+msgid "Jobs|Filter jobs"
+msgstr ""
+
+msgid "Jobs|Finished"
+msgstr ""
+
+msgid "Jobs|Job is stuck. Check runners."
+msgstr ""
+
+msgid "Jobs|Jobs are the building blocks of a GitLab CI/CD pipeline. Each job has a specific task, like testing code. To set up jobs in a CI/CD pipeline, add a CI/CD configuration file to your project."
+msgstr ""
+
+msgid "Jobs|No jobs to show"
+msgstr ""
+
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
+msgid "Jobs|There was a problem fetching the failed jobs."
+msgstr ""
+
+msgid "Jobs|Use jobs to automate your tasks"
+msgstr ""
+
+msgid "Jobs|You're about to retry a job that failed because it attempted to deploy code that is older than the latest deployment. Retrying this job could result in overwriting the environment with the older source code."
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id}"
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source}"
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source} into %{target}"
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
+msgstr ""
+
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
+msgid "Job|Are you sure you want to erase this job log and artifacts?"
+msgstr ""
+
+msgid "Job|Browse"
+msgstr ""
+
+msgid "Job|Cancel"
+msgstr ""
+
+msgid "Job|Canceled"
+msgstr ""
+
+msgid "Job|Complete Raw"
+msgstr ""
+
+msgid "Job|Created"
+msgstr ""
+
+msgid "Job|Download"
+msgstr ""
+
+msgid "Job|Erase job log and artifacts"
+msgstr ""
+
+msgid "Job|Failed"
+msgstr ""
+
+msgid "Job|Finished at"
+msgstr ""
+
+msgid "Job|Job artifacts"
+msgstr ""
+
+msgid "Job|Job has been erased"
+msgstr ""
+
+msgid "Job|Job has been erased by %{userLink}"
+msgstr ""
+
+msgid "Job|Job log search"
+msgstr ""
+
+msgid "Job|Keep"
+msgstr ""
+
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|No search results found"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
+msgid "Job|Retry"
+msgstr ""
+
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
+msgid "Job|Scroll to bottom"
+msgstr ""
+
+msgid "Job|Scroll to top"
+msgstr ""
+
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
+msgid "Job|Show complete raw"
+msgstr ""
+
+msgid "Job|Skipped"
+msgstr ""
+
+msgid "Job|Status"
+msgstr ""
+
+msgid "Job|The artifacts were removed"
+msgstr ""
+
+msgid "Job|The artifacts will be removed"
+msgstr ""
+
+msgid "Job|There was a problem retrying the failed job."
+msgstr ""
+
+msgid "Job|These artifacts are the latest. They will not be deleted (even if expired) until newer artifacts are available."
+msgstr ""
+
+msgid "Job|This job failed because the necessary resources were not successfully created."
+msgstr ""
+
+msgid "Job|This job is stuck because of one of the following problems. There are no active runners online, no runners for the %{linkStart}protected branch%{linkEnd}, or no runners that match all of the job's tags:"
+msgstr ""
+
+msgid "Job|This job is stuck because the project doesn't have any runners online assigned to it."
+msgstr ""
+
+msgid "Job|This job is stuck because you don't have any active runners that can run this job."
+msgstr ""
+
+msgid "Job|Waiting for resource"
+msgstr ""
+
+msgid "Job|We could not find this element"
+msgstr ""
+
+msgid "Job|allowed to fail"
+msgstr ""
+
+msgid "Job|delayed"
+msgstr ""
+
+msgid "Job|manual"
+msgstr ""
+
+msgid "Job|triggered"
+msgstr ""
+
+msgid "Join GitLab today! You and your team can plan, build, and ship secure code all in one application. Get started here for free!"
+msgstr ""
+
+msgid "Join Zoom meeting"
+msgstr ""
+
+msgid "Join a project"
+msgstr ""
+
+msgid "Join your team on GitLab and contribute to an existing project"
+msgstr ""
+
+msgid "Joined %{time_ago}"
+msgstr ""
+
+msgid "Joined %{user_created_time}"
+msgstr ""
+
+msgid "Joined projects (%{projects_count})"
+msgstr ""
+
+msgid "Jul"
+msgstr ""
+
+msgid "July"
+msgstr ""
+
+msgid "Jun"
+msgstr ""
+
+msgid "June"
+msgstr ""
+
+msgid "Just me"
+msgstr ""
+
+msgid "K8s pod health"
+msgstr ""
+
+msgid "KEY"
+msgstr ""
+
+msgid "Keep"
+msgstr ""
+
+msgid "Keep artifacts from most recent successful jobs"
+msgstr ""
+
+msgid "Keep divergent refs"
+msgstr ""
+
+msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
+msgstr ""
+
+msgid "Kerberos access denied"
+msgstr ""
+
+msgid "Key"
+msgstr ""
+
+msgid "Key (PEM)"
+msgstr ""
+
+msgid "Key: %{key}"
+msgstr ""
+
+msgid "Keyboard shortcuts"
+msgstr ""
+
+msgid "KeyboardKey|Alt"
+msgstr ""
+
+msgid "KeyboardKey|Ctrl"
+msgstr ""
+
+msgid "KeyboardKey|Ctrl+"
+msgstr ""
+
+msgid "KeyboardKey|Enter"
+msgstr ""
+
+msgid "KeyboardKey|Esc"
+msgstr ""
+
+msgid "KeyboardKey|Shift"
+msgstr ""
+
+msgid "KeyboardShortcuts|No shortcuts matched your search"
+msgstr ""
+
+msgid "KeyboardShortcuts|Search keyboard shortcuts"
+msgstr ""
+
+msgid "Keys"
+msgstr ""
+
+msgid "Ki"
+msgstr ""
+
+msgid "Kroki"
+msgstr ""
+
+msgid "Kubernetes"
+msgstr ""
+
+msgid "Kubernetes Cluster"
+msgstr ""
+
+msgid "Kubernetes Clusters"
+msgstr ""
+
+msgid "Kubernetes cluster"
+msgstr ""
+
+msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
+msgstr ""
+
+msgid "Kubernetes cluster integration and resources are being removed."
+msgstr ""
+
+msgid "Kubernetes cluster integration was successfully removed."
+msgstr ""
+
+msgid "Kubernetes cluster was successfully updated."
+msgstr ""
+
+msgid "Kubernetes clusters"
+msgstr ""
+
+msgid "Kubernetes deployment not found"
+msgstr ""
+
+msgid "Kubernetes error: %{error_code}"
+msgstr ""
+
+msgid "LDAP"
+msgstr ""
+
+msgid "LDAP Synchronization"
+msgstr ""
+
+msgid "LDAP group settings"
+msgstr ""
+
+msgid "LDAP settings"
+msgstr ""
+
+msgid "LDAP settings updated"
+msgstr ""
+
+msgid "LDAP sync in progress. This could take a few minutes. Refresh the page to see the changes."
+msgstr ""
+
+msgid "LDAP synchronizations"
+msgstr ""
+
+msgid "LDAP uid:"
+msgstr ""
+
+msgid "LFS"
+msgstr ""
+
+msgid "LFS objects"
+msgstr ""
+
+msgid "LFSStatus|Disabled"
+msgstr ""
+
+msgid "LFSStatus|Enabled"
+msgstr ""
+
+msgid "LICENSE"
+msgstr ""
+
+msgid "Label"
+msgstr ""
+
+msgid "Label actions dropdown"
+msgstr ""
+
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Label priority"
+msgstr ""
+
+msgid "Label was created"
+msgstr ""
+
+msgid "Label was removed"
+msgstr ""
+
+msgid "Label was successfully updated."
+msgstr ""
+
+msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
+msgstr ""
+
+msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
+msgstr ""
+
+msgid "LabelSelect|Labels"
+msgstr ""
+
+msgid "Labels"
+msgstr ""
+
+msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
+msgstr ""
+
+msgid "Labels can be applied to issues and merge requests to categorize them."
+msgstr ""
+
+msgid "Labels can be applied to issues and merge requests."
+msgstr ""
+
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
+msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
+msgstr ""
+
+msgid "Labels|Promote Label"
+msgstr ""
+
+msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. If a group label with the same title exists, it will also be merged. This action cannot be reversed."
+msgstr ""
+
+msgid "Language"
+msgstr ""
+
+msgid "Language type"
+msgstr ""
+
+msgid "Large File Storage"
+msgstr ""
+
+msgid "Last %d day"
+msgid_plural "Last %d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Last %{days} days"
+msgstr ""
+
+msgid "Last 2 weeks"
+msgstr ""
+
+msgid "Last 30 days"
+msgstr ""
+
+msgid "Last 60 days"
+msgstr ""
+
+msgid "Last 90 days"
+msgstr ""
+
+msgid "Last Accessed On"
+msgstr ""
+
+msgid "Last Activity"
+msgstr ""
+
+msgid "Last Name"
+msgstr ""
+
+msgid "Last Pipeline"
+msgstr ""
+
+msgid "Last Seen"
+msgstr ""
+
+msgid "Last Sync"
+msgstr ""
+
+msgid "Last Used"
+msgstr ""
+
+msgid "Last accessed on"
+msgstr ""
+
+msgid "Last activity"
+msgstr ""
+
+msgid "Last commit"
+msgstr ""
+
+msgid "Last contact"
+msgstr ""
+
+msgid "Last edited %{date}"
+msgstr ""
+
+msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
+msgstr ""
+
+msgid "Last event"
+msgstr ""
+
+msgid "Last item before this page loaded in your browser:"
+msgstr ""
+
+msgid "Last modified"
+msgstr ""
+
+msgid "Last month"
+msgstr ""
+
+msgid "Last name"
+msgstr ""
+
+msgid "Last reply by"
+msgstr ""
+
+msgid "Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages."
+msgstr ""
+
+msgid "Last seen"
+msgstr ""
+
+msgid "Last sign-in"
+msgstr ""
+
+msgid "Last sign-in IP:"
+msgstr ""
+
+msgid "Last sign-in at:"
+msgstr ""
+
+msgid "Last successful sync"
+msgstr ""
+
+msgid "Last successful update"
+msgstr ""
+
+msgid "Last time checked"
+msgstr ""
+
+msgid "Last time verified"
+msgstr ""
+
+msgid "Last update"
+msgstr ""
+
+msgid "Last update attempt"
+msgstr ""
+
+msgid "Last updated"
+msgstr ""
+
+msgid "Last updated %{time} ago"
+msgstr ""
+
+msgid "Last used"
+msgstr ""
+
+msgid "Last used %{last_used_at} ago"
+msgstr ""
+
+msgid "Last used on:"
+msgstr ""
+
+msgid "Last week"
+msgstr ""
+
+msgid "Last year"
+msgstr ""
+
+msgid "LastCommit|authored"
+msgstr ""
+
+msgid "LastPushEvent|You pushed to"
+msgstr ""
+
+msgid "LastPushEvent|at"
+msgstr ""
+
+msgid "Latest changes"
+msgstr ""
+
+msgid "Latest pipeline for the most recent commit on this branch"
+msgstr ""
+
+msgid "Launch a ready-to-code development environment for your project."
+msgstr ""
+
+msgid "Layout|Fixed"
+msgstr ""
+
+msgid "Layout|Fluid"
+msgstr ""
+
+msgid "Lead Time"
+msgstr ""
+
+msgid "Lead Time for Changes"
+msgstr ""
+
+msgid "Lead time"
+msgstr ""
+
+msgid "Learn GitLab"
+msgstr ""
+
+msgid "Learn GitLab - Ultimate trial"
+msgstr ""
+
+msgid "Learn More"
+msgstr ""
+
+msgid "Learn More."
+msgstr ""
+
+msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
+msgstr ""
+
+msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
+msgstr ""
+
+msgid "Learn more"
+msgstr ""
+
+msgid "Learn more about %{username}"
+msgstr ""
+
+msgid "Learn more about Auto DevOps"
+msgstr ""
+
+msgid "Learn more about GitLab"
+msgstr ""
+
+msgid "Learn more about Needs relationships"
+msgstr ""
+
+msgid "Learn more about Web Terminal"
+msgstr ""
+
+msgid "Learn more about X.509 signed commits"
+msgstr ""
+
+msgid "Learn more about adding certificates to your project by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
+msgstr ""
+
+msgid "Learn more about custom project templates"
+msgstr ""
+
+msgid "Learn more about deploying to AWS"
+msgstr ""
+
+msgid "Learn more about deploying to a cluster"
+msgstr ""
+
+msgid "Learn more about group-level project templates"
+msgstr ""
+
+msgid "Learn more about groups."
+msgstr ""
+
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
+msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
+msgstr ""
+
+msgid "Learn more about signing commits"
+msgstr ""
+
+msgid "Learn more in the"
+msgstr ""
+
+msgid "Learn more."
+msgstr ""
+
+msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
+msgstr ""
+
+msgid "LearnGitLab|Add code owners"
+msgstr ""
+
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
+msgstr ""
+
+msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
+msgstr ""
+
+msgid "LearnGitLab|Create a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgstr ""
+
+msgid "LearnGitLab|Create an issue"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+msgstr ""
+
+msgid "LearnGitLab|Create/import issues (tickets) to collaborate on ideas and plan work."
+msgstr ""
+
+msgid "LearnGitLab|Deploy"
+msgstr ""
+
+msgid "LearnGitLab|Enable require merge approvals"
+msgstr ""
+
+msgid "LearnGitLab|GitLab works best as a team. Invite your colleague to enjoy all features."
+msgstr ""
+
+msgid "LearnGitLab|Invite your colleagues"
+msgstr ""
+
+msgid "LearnGitLab|Learn GitLab"
+msgstr ""
+
+msgid "LearnGitLab|Plan and execute"
+msgstr ""
+
+msgid "LearnGitLab|Prevent unexpected changes to important assets by assigning ownership of files and paths."
+msgstr ""
+
+msgid "LearnGitLab|Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
+msgstr ""
+
+msgid "LearnGitLab|Review and edit proposed changes to source code."
+msgstr ""
+
+msgid "LearnGitLab|Route code reviews to the right reviewers, every time."
+msgstr ""
+
+msgid "LearnGitLab|Run a Security scan using CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
+msgstr ""
+
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr ""
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr ""
+
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your first project's CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
+msgstr ""
+
+msgid "LearnGitLab|Submit a merge request (MR)"
+msgstr ""
+
+msgid "LearnGitLab|Try GitLab Ultimate for free"
+msgstr ""
+
+msgid "LearnGitLab|Try all GitLab features for 30 days, no credit card required."
+msgstr ""
+
+msgid "LearnGitLab|Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:"
+msgstr ""
+
+msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
+msgstr ""
+
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
+msgid "LearnGitlab|Creating your onboarding experience..."
+msgstr ""
+
+msgid "LearnGitlab|Ok, let's go"
+msgstr ""
+
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
+msgid "Leave"
+msgstr ""
+
+msgid "Leave Admin Mode"
+msgstr ""
+
+msgid "Leave edit mode? All unsaved changes will be lost."
+msgstr ""
+
+msgid "Leave group"
+msgstr ""
+
+msgid "Leave project"
+msgstr ""
+
+msgid "Leave zen mode"
+msgstr ""
+
+msgid "Leaving this setting enabled is recommended."
+msgstr ""
+
+msgid "Legacy burndown chart"
+msgstr ""
+
+msgid "Legacy license"
+msgstr ""
+
+msgid "Less Details"
+msgstr ""
+
+msgid "Let's Encrypt does not accept emails on example.com"
+msgstr ""
+
+msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
+msgstr ""
+
+msgid "Let's talk!"
+msgstr ""
+
+msgid "License Compliance"
+msgstr ""
+
+msgid "License Compliance| Used by"
+msgstr ""
+
+msgid "License compliance"
+msgstr ""
+
+msgid "License key"
+msgstr ""
+
+msgid "License overview"
+msgstr ""
+
+msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are active"
+msgstr ""
+
+msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
+msgstr ""
+
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
+msgid "LicenseCompliance|Acceptable license to be used in the project"
+msgstr ""
+
+msgid "LicenseCompliance|Add license and related policy"
+msgstr ""
+
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
+msgid "LicenseCompliance|Allow"
+msgstr ""
+
+msgid "LicenseCompliance|Allowed"
+msgstr ""
+
+msgid "LicenseCompliance|Denied"
+msgstr ""
+
+msgid "LicenseCompliance|Deny"
+msgstr ""
+
+msgid "LicenseCompliance|Disallow merge request if detected and will instruct developer to remove"
+msgstr ""
+
+msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
+msgstr ""
+
+msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only; approval required"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only; approval required"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d license for the source branch only"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license and policy violation"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license and policy violation; approval required"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
+msgstr ""
+
+msgid "LicenseCompliance|License Compliance detected no new licenses"
+msgstr ""
+
+msgid "LicenseCompliance|License name"
+msgstr ""
+
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
+msgid "LicenseCompliance|Remove license"
+msgstr ""
+
+msgid "LicenseCompliance|Remove license?"
+msgstr ""
+
+msgid "LicenseCompliance|There are currently no policies in this project."
+msgstr ""
+
+msgid "LicenseCompliance|There are currently no policies that match in this project."
+msgstr ""
+
+msgid "LicenseCompliance|This license already exists in this project."
+msgstr ""
+
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
+msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
+msgstr ""
+
+msgid "LicenseManagement|Allowed"
+msgstr ""
+
+msgid "LicenseManagement|Denied"
+msgstr ""
+
+msgid "LicenseManagement|Uncategorized"
+msgstr ""
+
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
+msgid "Licensed Features"
+msgstr ""
+
+msgid "Licensed to:"
+msgstr ""
+
+msgid "Licenses"
+msgstr ""
+
+msgid "Licenses|%{remainingComponentsCount} more"
+msgstr ""
+
+msgid "Licenses|Acceptable license to be used in the project"
+msgstr ""
+
+msgid "Licenses|Component"
+msgstr ""
+
+msgid "Licenses|Components"
+msgstr ""
+
+msgid "Licenses|Detected in Project"
+msgstr ""
+
+msgid "Licenses|Displays licenses detected in the project that are out of compliance with the project's policies, based on the %{linkStart}latest successful%{linkEnd} scan"
+msgstr ""
+
+msgid "Licenses|Drag your license file here or %{linkStart}click to upload%{linkEnd}."
+msgstr ""
+
+msgid "Licenses|Drop your license file to start the upload."
+msgstr ""
+
+msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
+msgstr ""
+
+msgid "Licenses|Error: You are trying to upload something other than a file"
+msgstr ""
+
+msgid "Licenses|License Compliance"
+msgstr ""
+
+msgid "Licenses|Name"
+msgstr ""
+
+msgid "Licenses|Policies"
+msgstr ""
+
+msgid "Licenses|Policy"
+msgstr ""
+
+msgid "Licenses|Policy violation: denied"
+msgstr ""
+
+msgid "Licenses|Specified policies in this project"
+msgstr ""
+
+msgid "Licenses|The file could not be uploaded."
+msgstr ""
+
+msgid "Licenses|The license list details information about the licenses used within your project."
+msgstr ""
+
+msgid "Licenses|Unacceptable license, if detected it will disallow a merge request until it's removed"
+msgstr ""
+
+msgid "Licenses|View license details for your project"
+msgstr ""
+
+msgid "Limit display of time tracking units to hours."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
+msgstr ""
+
+msgid "Limit the number of inbound incident management alerts that can be sent to a project."
+msgstr ""
+
+msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
+msgstr ""
+
+msgid "Limit the number of pipeline creation requests per minute. This limit includes pipelines created through the UI, the API, and by background processing."
+msgstr ""
+
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
+msgid "Limiting mode"
+msgstr ""
+
+msgid "Line changes"
+msgstr ""
+
+msgid "Link"
+msgstr ""
+
+msgid "Link (optional)"
+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 ""
+
+msgid "Link copied"
+msgstr ""
+
+msgid "Link text"
+msgstr ""
+
+msgid "Link title"
+msgstr ""
+
+msgid "Link title is required"
+msgstr ""
+
+msgid "Link to go to GitLab pipeline documentation"
+msgstr ""
+
+msgid "Link to your Grafana instance."
+msgstr ""
+
+msgid "Linked emails (%{email_count})"
+msgstr ""
+
+msgid "Linked epics"
+msgstr ""
+
+msgid "Linked issues"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
+msgid "LinkedIn:"
+msgstr ""
+
+msgid "LinkedPipelines|%{counterLabel} more downstream pipelines"
+msgstr ""
+
+msgid "Links"
+msgstr ""
+
+msgid "List"
+msgstr ""
+
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
+msgid "List of all merge commits"
+msgstr ""
+
+msgid "List of suitable GCP locations"
+msgstr ""
+
+msgid "List of users who are allowed to exceed the rate limit. Example: username1, username2"
+msgstr ""
+
+msgid "List options"
+msgstr ""
+
+msgid "List settings"
+msgstr ""
+
+msgid "List the merge requests that must be merged before this one."
+msgstr ""
+
+msgid "List the visible events for %{project_link} using the %{events_api_link}."
+msgstr ""
+
+msgid "List view"
+msgstr ""
+
+msgid "List your Bitbucket Server repositories"
+msgstr ""
+
+msgid "Live preview"
+msgstr ""
+
+msgid "Load more"
+msgstr ""
+
+msgid "Load more users"
+msgstr ""
+
+msgid "Loading"
+msgstr ""
+
+msgid "Loading %{name}"
+msgstr ""
+
+msgid "Loading contribution stats for group members"
+msgstr ""
+
+msgid "Loading files, directories, and submodules in the path %{path} for commit reference %{ref}"
+msgstr ""
+
+msgid "Loading more"
+msgstr ""
+
+msgid "Loading snippet"
+msgstr ""
+
+msgid "Loading the GitLab IDE..."
+msgstr ""
+
+msgid "Loading, please wait."
+msgstr ""
+
+msgid "Loading..."
+msgstr ""
+
+msgid "Loading…"
+msgstr ""
+
+msgid "Localization"
+msgstr ""
+
+msgid "Location"
+msgstr ""
+
+msgid "Location:"
+msgstr ""
+
+msgid "Lock"
+msgstr ""
+
+msgid "Lock %{issuableDisplayName}"
+msgstr ""
+
+msgid "Lock File?"
+msgstr ""
+
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
+msgid "Lock merge request"
+msgstr ""
+
+msgid "Lock not found"
+msgstr ""
+
+msgid "Lock the discussion"
+msgstr ""
+
+msgid "Lock this %{issuableDisplayName}? Only %{strongStart}project members%{strongEnd} will be able to comment."
+msgstr ""
+
+msgid "Lock to current projects"
+msgstr ""
+
+msgid "Locked"
+msgstr ""
+
+msgid "Locked Files"
+msgstr ""
+
+msgid "Locked by %{fileLockUserName}"
+msgstr ""
+
+msgid "Locked the discussion."
+msgstr ""
+
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Locks the discussion."
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|About GitLab"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Explore GitLab"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Get started"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|GitLab Learn"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|GitLab docs"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|GitLab: the DevOps platform"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|How GitLab compares"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Install GitLab"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Pricing"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Talk to an expert"
+msgstr ""
+
+msgid "Login"
+msgstr ""
+
+msgid "Login with smartcard"
+msgstr ""
+
+msgid "Logo was successfully removed."
+msgstr ""
+
+msgid "Logo will be removed. Are you sure?"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
+msgstr ""
+
+msgid "Low vulnerabilities present"
+msgstr ""
+
+msgid "MB"
+msgstr ""
+
+msgid "MD5"
+msgstr ""
+
+msgid "MERGED"
+msgstr ""
+
+msgid "MR widget|Back to the merge request"
+msgstr ""
+
+msgid "MR widget|See your pipeline in action"
+msgstr ""
+
+msgid "MR widget|Take a look at our %{beginnerLinkStart}Beginner's Guide to Continuous Integration%{beginnerLinkEnd} and our %{exampleLinkStart}examples of GitLab CI/CD%{exampleLinkEnd} to learn more."
+msgstr ""
+
+msgid "MR widget|The pipeline will test your code on every commit. A %{codeQualityLinkStart}code quality report%{codeQualityLinkEnd} will appear in your merge requests to warn you about potential code degradations."
+msgstr ""
+
+msgid "MRApprovals|Approvals"
+msgstr ""
+
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Commented by"
+msgstr ""
+
+msgid "MRDiffFile|Changes are too large to be shown."
+msgstr ""
+
+msgid "MRDiffFile|View file @ %{commitSha}"
+msgstr ""
+
+msgid "MRDiff|Show changes only"
+msgstr ""
+
+msgid "MRDiff|Show full file"
+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 ""
+
+msgid "Make adjustments to how your GitLab instance is set up."
+msgstr ""
+
+msgid "Make and review changes in the browser with the Web IDE"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make issue confidential"
+msgstr ""
+
+msgid "Make sure you have the correct permissions to link your project."
+msgstr ""
+
+msgid "Make sure you save it - you won't be able to access it again."
+msgstr ""
+
+msgid "Makes this issue confidential."
+msgstr ""
+
+msgid "Manage %{workspace} labels"
+msgstr ""
+
+msgid "Manage Web IDE features."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
+
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that use GitLab as an OAuth provider."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage git repositories with fine-grained access controls that keep your code secure."
+msgstr ""
+
+msgid "Manage group labels"
+msgstr ""
+
+msgid "Manage labels"
+msgstr ""
+
+msgid "Manage members"
+msgstr ""
+
+msgid "Manage milestones"
+msgstr ""
+
+msgid "Manage project labels"
+msgstr ""
+
+msgid "Manage projects."
+msgstr ""
+
+msgid "Manage two-factor authentication"
+msgstr ""
+
+msgid "Manage your license"
+msgstr ""
+
+msgid "Manage your project's triggers"
+msgstr ""
+
+msgid "Managed Account"
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Manifest import"
+msgstr ""
+
+msgid "Manual"
+msgstr ""
+
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
+msgid "ManualOrdering|Couldn't save the order of the issues"
+msgstr ""
+
+msgid "Manually link this issue by adding it to the linked issue section of the %{linkStart}originating vulnerability%{linkEnd}."
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Mar"
+msgstr ""
+
+msgid "March"
+msgstr ""
+
+msgid "Mark as done"
+msgstr ""
+
+msgid "Mark as draft"
+msgstr ""
+
+msgid "Mark as ready"
+msgstr ""
+
+msgid "Mark this issue as a duplicate of another issue"
+msgstr ""
+
+msgid "Mark this issue as related to another issue"
+msgstr ""
+
+msgid "Mark to do as done"
+msgstr ""
+
+msgid "Markdown Help"
+msgstr ""
+
+msgid "Markdown enabled."
+msgstr ""
+
+msgid "Markdown supported."
+msgstr ""
+
+msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
+msgstr ""
+
+msgid "MarkdownEditor|Add a link (%{modifier_key}K)"
+msgstr ""
+
+msgid "MarkdownEditor|Add bold text (%{modifierKey}B)"
+msgstr ""
+
+msgid "MarkdownEditor|Add bold text (%{modifier_key}B)"
+msgstr ""
+
+msgid "MarkdownEditor|Add italic text (%{modifierKey}I)"
+msgstr ""
+
+msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
+msgstr ""
+
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
+msgstr ""
+
+msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
+msgstr ""
+
+msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
+msgstr ""
+
+msgid "Marked For Deletion At - %{deletion_time}"
+msgstr ""
+
+msgid "Marked as draft. Can only be merged when marked as ready."
+msgstr ""
+
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
+msgid "Marked this %{noun} as a draft."
+msgstr ""
+
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
+msgid "Marked this issue as a duplicate of %{duplicate_param}."
+msgstr ""
+
+msgid "Marked this issue as related to %{issue_ref}."
+msgstr ""
+
+msgid "Marked to do as done."
+msgstr ""
+
+msgid "Marks this %{noun} as a draft."
+msgstr ""
+
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
+msgid "Marks this issue as a duplicate of %{duplicate_reference}."
+msgstr ""
+
+msgid "Marks this issue as related to %{issue_ref}."
+msgstr ""
+
+msgid "Marks to do as done."
+msgstr ""
+
+msgid "Mask variable"
+msgstr ""
+
+msgid "Match not found; try refining your search query."
+msgstr ""
+
+msgid "Mattermost"
+msgstr ""
+
+msgid "Mattermost URL:"
+msgstr ""
+
+msgid "Mattermost notifications"
+msgstr ""
+
+msgid "MattermostService|Add to Mattermost"
+msgstr ""
+
+msgid "MattermostService|After you configure the integration, view your new Mattermost commands by entering"
+msgstr ""
+
+msgid "MattermostService|Command trigger word"
+msgstr ""
+
+msgid "MattermostService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "MattermostService|Request URL"
+msgstr ""
+
+msgid "MattermostService|Request method"
+msgstr ""
+
+msgid "MattermostService|Response icon"
+msgstr ""
+
+msgid "MattermostService|Response username"
+msgstr ""
+
+msgid "MattermostService|Suggestions:"
+msgstr ""
+
+msgid "MattermostService|Use this service to perform common tasks in your project by entering slash commands in Mattermost."
+msgstr ""
+
+msgid "Max 100,000 events"
+msgstr ""
+
+msgid "Max Value"
+msgstr ""
+
+msgid "Max authenticated Git LFS requests per period per user"
+msgstr ""
+
+msgid "Max file size is 200 KB."
+msgstr ""
+
+msgid "Max role"
+msgstr ""
+
+msgid "Max seats used"
+msgstr ""
+
+msgid "Max session time"
+msgstr ""
+
+msgid "Maximum 20 characters"
+msgstr ""
+
+msgid "Maximum Conan package file size in bytes"
+msgstr ""
+
+msgid "Maximum Helm chart file size in bytes"
+msgstr ""
+
+msgid "Maximum Maven package file size in bytes"
+msgstr ""
+
+msgid "Maximum NuGet package file size in bytes"
+msgstr ""
+
+msgid "Maximum PyPI package file size in bytes"
+msgstr ""
+
+msgid "Maximum Terraform Module package file size in bytes"
+msgstr ""
+
+msgid "Maximum Users"
+msgstr ""
+
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
+msgid "Maximum allowable lifetime for personal access token (days)"
+msgstr ""
+
+msgid "Maximum allowed lifetime for SSH keys (in days)"
+msgstr ""
+
+msgid "Maximum artifacts size"
+msgstr ""
+
+msgid "Maximum artifacts size (MB)"
+msgstr ""
+
+msgid "Maximum attachment size"
+msgstr ""
+
+msgid "Maximum attachment size (MB)"
+msgstr ""
+
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum bulk request size (MiB)"
+msgstr ""
+
+msgid "Maximum capacity"
+msgstr ""
+
+msgid "Maximum character limit - %{limit}"
+msgstr ""
+
+msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation."
+msgstr ""
+
+msgid "Maximum delay (Minutes)"
+msgstr ""
+
+msgid "Maximum diff patch size"
+msgstr ""
+
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
+msgid "Maximum duration of a session."
+msgstr ""
+
+msgid "Maximum export size"
+msgstr ""
+
+msgid "Maximum export size (MB)"
+msgstr ""
+
+msgid "Maximum field length"
+msgstr ""
+
+msgid "Maximum file size indexed (KiB)"
+msgstr ""
+
+msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
+msgstr ""
+
+msgid "Maximum file size is 1MB. Pages are optimized for a 24px tall header logo"
+msgstr ""
+
+msgid "Maximum file size is 1MB. Pages are optimized for a 640x360 px logo."
+msgstr ""
+
+msgid "Maximum files in a diff"
+msgstr ""
+
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
+msgid "Maximum import size"
+msgstr ""
+
+msgid "Maximum import size (MB)"
+msgstr ""
+
+msgid "Maximum job artifact size"
+msgstr ""
+
+msgid "Maximum job timeout"
+msgstr ""
+
+msgid "Maximum job timeout has a value which could not be accepted"
+msgstr ""
+
+msgid "Maximum lines in a diff"
+msgstr ""
+
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
+msgid "Maximum number of %{name} (%{count}) exceeded"
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgstr ""
+
+msgid "Maximum number of comments exceeded"
+msgstr ""
+
+msgid "Maximum number of mirrors that can be synchronizing at the same time."
+msgstr ""
+
+msgid "Maximum number of projects."
+msgstr ""
+
+msgid "Maximum number of requests per minute"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
+msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgstr ""
+
+msgid "Maximum number of unique IP addresses per user."
+msgstr ""
+
+msgid "Maximum of 255 characters"
+msgstr ""
+
+msgid "Maximum page reached"
+msgstr ""
+
+msgid "Maximum page size"
+msgstr ""
+
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
+msgid "Maximum push size"
+msgstr ""
+
+msgid "Maximum push size (MB)"
+msgstr ""
+
+msgid "Maximum requests per 10 minutes per user"
+msgstr ""
+
+msgid "Maximum requests per minute"
+msgstr ""
+
+msgid "Maximum running slices"
+msgstr ""
+
+msgid "Maximum size limit for a single commit."
+msgstr ""
+
+msgid "Maximum size limit for each repository."
+msgstr ""
+
+msgid "Maximum size of Elasticsearch bulk indexing requests."
+msgstr ""
+
+msgid "Maximum size of export files."
+msgstr ""
+
+msgid "Maximum size of import files."
+msgstr ""
+
+msgid "Maximum size of individual attachments in comments."
+msgstr ""
+
+msgid "Maximum size of pages (MB)"
+msgstr ""
+
+msgid "Maximum snippet size"
+msgstr ""
+
+msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
+msgstr ""
+
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "Mean time to merge"
+msgstr ""
+
+msgid "Measured in bytes of code. Excludes generated and vendored code."
+msgstr ""
+
+msgid "Medium timeout"
+msgstr ""
+
+msgid "Medium vulnerabilities present"
+msgstr ""
+
+msgid "Member since"
+msgstr ""
+
+msgid "Member since %{date}"
+msgstr ""
+
+msgid "Member since:"
+msgstr ""
+
+msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
+msgstr ""
+
+msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or_group_name}"
+msgstr ""
+
+msgid "Members"
+msgstr ""
+
+msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}"
+msgstr ""
+
+msgid "Members listed as CODEOWNERS of affected files."
+msgstr ""
+
+msgid "Members of %{group} can also merge into this branch: %{branch}"
+msgstr ""
+
+msgid "Members of %{group} can also push to this branch: %{branch}"
+msgstr ""
+
+msgid "Members of a group may only view projects they have permission to access"
+msgstr ""
+
+msgid "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seat in use and will be billed for the overage."
+msgid_plural "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seats in use and will be billed for the overage."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "MembersOverage|You are about to incur additional charges"
+msgstr ""
+
+msgid "MembersOverage|Your subscription includes %d seat."
+msgid_plural "MembersOverage|Your subscription includes %d seats."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Membership"
+msgstr ""
+
+msgid "Members|%{time} by %{user}"
+msgstr ""
+
+msgid "Members|%{userName} is currently an LDAP user. Editing their permissions will override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "Members|2FA"
+msgstr ""
+
+msgid "Members|An error occurred while trying to enable LDAP override, please try again."
+msgstr ""
+
+msgid "Members|An error occurred while trying to revert to LDAP group sync settings, please try again."
+msgstr ""
+
+msgid "Members|An error occurred while updating the member's expiration date, please try again."
+msgstr ""
+
+msgid "Members|An error occurred while updating the member's role, please try again."
+msgstr ""
+
+msgid "Members|Are you sure you want to deny %{usersName}'s request to join \"%{source}\""
+msgstr ""
+
+msgid "Members|Are you sure you want to leave \"%{source}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
+msgstr ""
+
+msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
+msgstr ""
+
+msgid "Members|Direct"
+msgstr ""
+
+msgid "Members|Disabled"
+msgstr ""
+
+msgid "Members|Edit permissions"
+msgstr ""
+
+msgid "Members|Enabled"
+msgstr ""
+
+msgid "Members|Expiration date removed successfully."
+msgstr ""
+
+msgid "Members|Expiration date updated successfully."
+msgstr ""
+
+msgid "Members|Filter groups"
+msgstr ""
+
+msgid "Members|Filter members"
+msgstr ""
+
+msgid "Members|Inherited"
+msgstr ""
+
+msgid "Members|LDAP override enabled."
+msgstr ""
+
+msgid "Members|Leave \"%{source}\""
+msgstr ""
+
+msgid "Members|Membership"
+msgstr ""
+
+msgid "Members|Remove \"%{groupName}\""
+msgstr ""
+
+msgid "Members|Remove group"
+msgstr ""
+
+msgid "Members|Revert to LDAP group sync settings"
+msgstr ""
+
+msgid "Members|Reverted to LDAP group sync settings."
+msgstr ""
+
+msgid "Members|Role updated successfully."
+msgstr ""
+
+msgid "Members|Search groups"
+msgstr ""
+
+msgid "Members|Search invited"
+msgstr ""
+
+msgid "Member|Deny access"
+msgstr ""
+
+msgid "Member|Revoke invite"
+msgstr ""
+
+msgid "Memory Usage"
+msgstr ""
+
+msgid "Menu"
+msgstr ""
+
+msgid "Merge"
+msgstr ""
+
+msgid "Merge Conflicts"
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
+msgid "Merge Request Analytics"
+msgstr ""
+
+msgid "Merge Requests"
+msgstr ""
+
+msgid "Merge Requests created"
+msgstr ""
+
+msgid "Merge Requests in Review"
+msgstr ""
+
+msgid "Merge Requests merged"
+msgstr ""
+
+msgid "Merge automatically (%{strategy})"
+msgstr ""
+
+msgid "Merge blocked: all merge request dependencies must be merged."
+msgstr ""
+
+msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
+msgstr ""
+
+msgid "Merge blocked: new changes were just added."
+msgstr ""
+
+msgid "Merge blocked: pipeline must succeed. It's waiting for a manual job to continue."
+msgstr ""
+
+msgid "Merge blocked: the source branch must be rebased onto the target branch."
+msgstr ""
+
+msgid "Merge commit SHA"
+msgstr ""
+
+msgid "Merge commit message"
+msgstr ""
+
+msgid "Merge details"
+msgstr ""
+
+msgid "Merge events"
+msgstr ""
+
+msgid "Merge immediately"
+msgstr ""
+
+msgid "Merge in progress"
+msgstr ""
+
+msgid "Merge locally"
+msgstr ""
+
+msgid "Merge options"
+msgstr ""
+
+msgid "Merge request"
+msgstr ""
+
+msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
+msgstr ""
+
+msgid "Merge request actions"
+msgstr ""
+
+msgid "Merge request analytics"
+msgstr ""
+
+msgid "Merge request approvals"
+msgstr ""
+
+msgid "Merge request commits"
+msgstr ""
+
+msgid "Merge request dependencies"
+msgstr ""
+
+msgid "Merge request events"
+msgstr ""
+
+msgid "Merge request locked."
+msgstr ""
+
+msgid "Merge request not merged"
+msgstr ""
+
+msgid "Merge request reports"
+msgstr ""
+
+msgid "Merge request unlocked."
+msgstr ""
+
+msgid "Merge request was scheduled to merge after pipeline succeeds"
+msgstr ""
+
+msgid "Merge requests"
+msgstr ""
+
+msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
+msgstr ""
+
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
+msgstr ""
+
+msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
+msgstr ""
+
+msgid "Merge unverified changes"
+msgstr ""
+
+msgid "Merge unverified changes?"
+msgstr ""
+
+msgid "Merge when pipeline succeeds"
+msgstr ""
+
+msgid "Merge..."
+msgstr ""
+
+msgid "MergeConflict|Commit to source branch"
+msgstr ""
+
+msgid "MergeConflict|Committing..."
+msgstr ""
+
+msgid "MergeConflict|HEAD//our changes"
+msgstr ""
+
+msgid "MergeConflict|Use ours"
+msgstr ""
+
+msgid "MergeConflict|Use theirs"
+msgstr ""
+
+msgid "MergeConflict|conflict"
+msgstr ""
+
+msgid "MergeConflict|conflicts"
+msgstr ""
+
+msgid "MergeConflict|origin//their changes"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Assignees"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Date Merged"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Line changes"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Merge Request"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Milestone"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Pipelines"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Time to merge"
+msgstr ""
+
+msgid "MergeRequestApprovals|Define approval rules and settings to ensure %{link_start}separation of duties%{link_end} for new merge requests."
+msgstr ""
+
+msgid "MergeRequestApprovals|Enforce %{link_start}separation of duties%{link_end} for all projects."
+msgstr ""
+
+msgid "MergeRequestApprovals|Enforce %{separationLinkStart}separation of duties%{separationLinkEnd} for all projects. %{learnLinkStart}Learn more.%{learnLinkEnd}"
+msgstr ""
+
+msgid "MergeRequestDiffs|Commenting on lines %{selectStart}start%{selectEnd} to %{end}"
+msgstr ""
+
+msgid "MergeRequestDiffs|Select comment starting line"
+msgstr ""
+
+msgid "MergeRequests|An error occurred while saving the draft comment."
+msgstr ""
+
+msgid "MergeRequests|Create issue to resolve thread"
+msgstr ""
+
+msgid "MergeRequests|Saving the comment failed"
+msgstr ""
+
+msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
+msgstr ""
+
+msgid "MergeRequests|Squashing not allowed: This project doesn't allow you to squash commits when merging."
+msgstr ""
+
+msgid "MergeRequests|Thread stays resolved"
+msgstr ""
+
+msgid "MergeRequests|Thread stays unresolved"
+msgstr ""
+
+msgid "MergeRequests|Thread will be resolved"
+msgstr ""
+
+msgid "MergeRequests|Thread will be unresolved"
+msgstr ""
+
+msgid "MergeRequests|View file @ %{commitId}"
+msgstr ""
+
+msgid "MergeRequests|View replaced file @ %{commitId}"
+msgstr ""
+
+msgid "MergeRequests|commented on commit %{commitLink}"
+msgstr ""
+
+msgid "MergeRequests|started a thread"
+msgstr ""
+
+msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequests|started a thread on %{linkStart}the diff%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequests|started a thread on an outdated change in commit %{linkStart}%{commitDisplay}%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because of an internal error. Contact your administrator."
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because the fork project was deleted."
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because the source branch %{branch_badge} is missing from project %{path_badge}. Close this merge request or update the source branch."
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because the target branch %{branch_badge} is missing from project %{path_badge}. Close this merge request or update the target branch."
+msgstr ""
+
+msgid "MergeRequest|Compare %{target} and %{source}"
+msgstr ""
+
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
+msgid "MergeRequest|Error loading full diff. Please try again."
+msgstr ""
+
+msgid "MergeRequest|No files found"
+msgstr ""
+
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgstr ""
+
+msgid "Merged"
+msgstr ""
+
+msgid "Merged MRs"
+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 ""
+
+msgid "Merged: %{merged}"
+msgstr ""
+
+msgid "Merges this merge request immediately."
+msgstr ""
+
+msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
+msgstr ""
+
+msgid "Mermaid diagram"
+msgstr ""
+
+msgid "Message"
+msgstr ""
+
+msgid "Messages"
+msgstr ""
+
+msgid "Method"
+msgstr ""
+
+msgid "Method call threshold (ms)"
+msgstr ""
+
+msgid "Metric was successfully added."
+msgstr ""
+
+msgid "Metric was successfully updated."
+msgstr ""
+
+msgid "Metric:"
+msgstr ""
+
+msgid "MetricChart|Please select a metric"
+msgstr ""
+
+msgid "MetricChart|Selected"
+msgstr ""
+
+msgid "MetricChart|There is no data available. Please change your selection."
+msgstr ""
+
+msgid "MetricChart|There is too much data to calculate. Please change your selection."
+msgstr ""
+
+msgid "MetricImages|There was an issue deleting the image."
+msgstr ""
+
+msgid "MetricImages|There was an issue loading metric images."
+msgstr ""
+
+msgid "MetricImages|There was an issue updating your image."
+msgstr ""
+
+msgid "MetricImages|There was an issue uploading your image."
+msgstr ""
+
+msgid "Metrics"
+msgstr ""
+
+msgid "Metrics - Grafana"
+msgstr ""
+
+msgid "Metrics - Prometheus"
+msgstr ""
+
+msgid "Metrics Dashboard"
+msgstr ""
+
+msgid "Metrics Dashboard YAML definition"
+msgstr ""
+
+msgid "Metrics Dashboard YAML definition is invalid:"
+msgstr ""
+
+msgid "Metrics Dashboard YAML definition is valid."
+msgstr ""
+
+msgid "Metrics and profiling"
+msgstr ""
+
+msgid "Metrics:"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Annotation can't belong to both a cluster and an environment at the same time"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Annotation has not been deleted"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Annotation must belong to a cluster or an environment"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Dashboard with requested path can not be found"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected cluster"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected environment"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|You are not authorized to delete this annotation"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|can't be before starting_at time"
+msgstr ""
+
+msgid "MetricsSettings|Add a button to the metrics dashboard linking directly to your existing external dashboard."
+msgstr ""
+
+msgid "MetricsSettings|Choose whether to display dashboard metrics in UTC or the user's local timezone."
+msgstr ""
+
+msgid "MetricsSettings|Dashboard timezone"
+msgstr ""
+
+msgid "MetricsSettings|External dashboard URL"
+msgstr ""
+
+msgid "MetricsSettings|Manage metrics dashboard settings."
+msgstr ""
+
+msgid "MetricsSettings|Metrics"
+msgstr ""
+
+msgid "MetricsSettings|UTC (Coordinated Universal Time)"
+msgstr ""
+
+msgid "MetricsSettings|User's local timezone"
+msgstr ""
+
+msgid "MetricsUsersStarredDashboards|Dashboard with requested path can not be found"
+msgstr ""
+
+msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
+msgstr ""
+
+msgid "Metrics|1. Define and preview panel"
+msgstr ""
+
+msgid "Metrics|2. Paste panel YAML into dashboard"
+msgstr ""
+
+msgid "Metrics|Add metric"
+msgstr ""
+
+msgid "Metrics|Add panel"
+msgstr ""
+
+msgid "Metrics|Avg"
+msgstr ""
+
+msgid "Metrics|Back to dashboard"
+msgstr ""
+
+msgid "Metrics|Cancel"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Collapse panel"
+msgstr ""
+
+msgid "Metrics|Collapse panel (Esc)"
+msgstr ""
+
+msgid "Metrics|Copy YAML"
+msgstr ""
+
+msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
+msgstr ""
+
+msgid "Metrics|Create custom dashboard %{fileName}"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Create new dashboard"
+msgstr ""
+
+msgid "Metrics|Create your dashboard configuration file"
+msgstr ""
+
+msgid "Metrics|Current"
+msgstr ""
+
+msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
+msgstr ""
+
+msgid "Metrics|Define panel YAML below to preview panel."
+msgstr ""
+
+msgid "Metrics|Delete metric"
+msgstr ""
+
+msgid "Metrics|Delete metric?"
+msgstr ""
+
+msgid "Metrics|Duplicate"
+msgstr ""
+
+msgid "Metrics|Duplicate current dashboard"
+msgstr ""
+
+msgid "Metrics|Duplicate dashboard"
+msgstr ""
+
+msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
+msgstr ""
+
+msgid "Metrics|Duplicating..."
+msgstr ""
+
+msgid "Metrics|Edit dashboard YAML"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgid_plural "Metrics|Edit metrics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Metrics|Expand panel"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Invalid time range, please verify."
+msgstr ""
+
+msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
+msgstr ""
+
+msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
+msgstr ""
+
+msgid "Metrics|Manage chart links"
+msgstr ""
+
+msgid "Metrics|Max"
+msgstr ""
+
+msgid "Metrics|Metrics Settings"
+msgstr ""
+
+msgid "Metrics|Min"
+msgstr ""
+
+msgid "Metrics|More actions"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|Open repository"
+msgstr ""
+
+msgid "Metrics|Panel YAML"
+msgstr ""
+
+msgid "Metrics|Panel YAML copied"
+msgstr ""
+
+msgid "Metrics|Preview panel"
+msgstr ""
+
+msgid "Metrics|PromQL query is valid"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Refresh Prometheus data"
+msgstr ""
+
+msgid "Metrics|Refresh dashboard"
+msgstr ""
+
+msgid "Metrics|Select a value"
+msgstr ""
+
+msgid "Metrics|Set refresh rate"
+msgstr ""
+
+msgid "Metrics|Star dashboard"
+msgstr ""
+
+msgid "Metrics|There was an error creating the dashboard."
+msgstr ""
+
+msgid "Metrics|There was an error creating the dashboard. %{error}"
+msgstr ""
+
+msgid "Metrics|There was an error fetching annotations. Please try again."
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting annotations information."
+msgstr ""
+
+msgid "Metrics|There was an error getting dashboard validation warnings information."
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error getting options for variable \"%{name}\"."
+msgstr ""
+
+msgid "Metrics|There was an error trying to validate your query"
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics. %{message}"
+msgstr ""
+
+msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Unstar dashboard"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Validating query"
+msgstr ""
+
+msgid "Metrics|Values"
+msgstr ""
+
+msgid "Metrics|View documentation"
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
+msgstr ""
+
+msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
+msgstr ""
+
+msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
+msgid "Mi"
+msgstr ""
+
+msgid "Migrated %{success_count}/%{total_count} files."
+msgstr ""
+
+msgid "Migration"
+msgstr ""
+
+msgid "Migration has been scheduled to be retried"
+msgstr ""
+
+msgid "Migration successful."
+msgstr ""
+
+msgid "Milestone"
+msgid_plural "Milestones"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Milestone due date"
+msgstr ""
+
+msgid "Milestone lists not available with your current license"
+msgstr ""
+
+msgid "MilestoneCombobox|An error occurred while searching for milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Group milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Milestone"
+msgstr ""
+
+msgid "MilestoneCombobox|No matching results"
+msgstr ""
+
+msgid "MilestoneCombobox|No milestone"
+msgstr ""
+
+msgid "MilestoneCombobox|Project milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Search Milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Select milestone"
+msgstr ""
+
+msgid "MilestoneSidebar|Closed:"
+msgstr ""
+
+msgid "MilestoneSidebar|Copy reference"
+msgstr ""
+
+msgid "MilestoneSidebar|Due date"
+msgstr ""
+
+msgid "MilestoneSidebar|Edit"
+msgstr ""
+
+msgid "MilestoneSidebar|From"
+msgstr ""
+
+msgid "MilestoneSidebar|Issues"
+msgstr ""
+
+msgid "MilestoneSidebar|Merge requests"
+msgstr ""
+
+msgid "MilestoneSidebar|Merged:"
+msgstr ""
+
+msgid "MilestoneSidebar|New Issue"
+msgstr ""
+
+msgid "MilestoneSidebar|New issue"
+msgstr ""
+
+msgid "MilestoneSidebar|No due date"
+msgstr ""
+
+msgid "MilestoneSidebar|No start date"
+msgstr ""
+
+msgid "MilestoneSidebar|None"
+msgstr ""
+
+msgid "MilestoneSidebar|Open:"
+msgstr ""
+
+msgid "MilestoneSidebar|Reference:"
+msgstr ""
+
+msgid "MilestoneSidebar|Start date"
+msgstr ""
+
+msgid "MilestoneSidebar|Toggle sidebar"
+msgstr ""
+
+msgid "MilestoneSidebar|Until"
+msgstr ""
+
+msgid "MilestoneSidebar|complete"
+msgstr ""
+
+msgid "Milestones"
+msgstr ""
+
+msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle} and remove it from %{issuesWithCount} and %{mergeRequestsWithCount}. Once deleted, it cannot be undone or recovered."
+msgstr ""
+
+msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle}. This milestone is not currently used in any issues or merge requests."
+msgstr ""
+
+msgid "Milestones|Close Milestone"
+msgstr ""
+
+msgid "Milestones|Completed Issues (closed)"
+msgstr ""
+
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
+msgid "Milestones|Delete milestone"
+msgstr ""
+
+msgid "Milestones|Delete milestone %{milestoneTitle}?"
+msgstr ""
+
+msgid "Milestones|Failed to delete milestone %{milestoneTitle}"
+msgstr ""
+
+msgid "Milestones|Group Milestone"
+msgstr ""
+
+msgid "Milestones|Milestone %{milestoneTitle} was not found"
+msgstr ""
+
+msgid "Milestones|Ongoing Issues (open and assigned)"
+msgstr ""
+
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
+msgid "Milestones|Project Milestone"
+msgstr ""
+
+msgid "Milestones|Promote %{milestoneTitle} to group milestone?"
+msgstr ""
+
+msgid "Milestones|Promote Milestone"
+msgstr ""
+
+msgid "Milestones|Promote to Group Milestone"
+msgstr ""
+
+msgid "Milestones|Promoting %{milestoneTitle} will make it available for all projects inside %{groupName}. Existing project milestones with the same title will be merged."
+msgstr ""
+
+msgid "Milestones|Reopen Milestone"
+msgstr ""
+
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
+msgid "Milestones|Unstarted Issues (open and unassigned)"
+msgstr ""
+
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
+msgid "Min Value"
+msgstr ""
+
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgstr ""
+
+msgid "Minutes"
+msgstr ""
+
+msgid "Mirror direction"
+msgstr ""
+
+msgid "Mirror only protected branches"
+msgstr ""
+
+msgid "Mirror repository"
+msgstr ""
+
+msgid "Mirror settings are only available to GitLab administrators."
+msgstr ""
+
+msgid "Mirror user"
+msgstr ""
+
+msgid "Mirrored repositories"
+msgstr ""
+
+msgid "Mirroring repositories"
+msgstr ""
+
+msgid "Mirroring settings were successfully updated."
+msgstr ""
+
+msgid "Mirroring settings were successfully updated. The project is being updated."
+msgstr ""
+
+msgid "Mirroring was successfully disabled."
+msgstr ""
+
+msgid "Mirroring will only be available if the feature is included in the plan of the selected group or user."
+msgstr ""
+
+msgid "Miscellaneous"
+msgstr ""
+
+msgid "Missing"
+msgstr ""
+
+msgid "Missing OAuth configuration for GitHub."
+msgstr ""
+
+msgid "Missing OS"
+msgstr ""
+
+msgid "Missing arch"
+msgstr ""
+
+msgid "Missing commit signatures endpoint!"
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|Add SSH key"
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|Don't show again"
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|You can't push or pull repositories using SSH until you add an SSH key to your profile."
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|You won't be able to pull or push repositories via SSH until you add an SSH key to your profile"
+msgstr ""
+
+msgid "ModalButton|Add projects"
+msgstr ""
+
+msgid "Modal|Close"
+msgstr ""
+
+msgid "Modified"
+msgstr ""
+
+msgid "Modified in this version"
+msgstr ""
+
+msgid "Modify commit message"
+msgstr ""
+
+msgid "Modify commit messages"
+msgstr ""
+
+msgid "Modify merge commit"
+msgstr ""
+
+msgid "Monday"
+msgstr ""
+
+msgid "Monitor"
+msgstr ""
+
+msgid "Monitor Settings"
+msgstr ""
+
+msgid "Monitor the health and performance of GitLab with Prometheus."
+msgstr ""
+
+msgid "Monitor your errors by integrating with Sentry."
+msgstr ""
+
+msgid "Monitoring"
+msgstr ""
+
+msgid "Month"
+msgstr ""
+
+msgid "Months"
+msgstr ""
+
+msgid "More Details"
+msgstr ""
+
+msgid "More Information"
+msgstr ""
+
+msgid "More actions"
+msgstr ""
+
+msgid "More details"
+msgstr ""
+
+msgid "More info"
+msgstr ""
+
+msgid "More information"
+msgstr ""
+
+msgid "More information and share feedback"
+msgstr ""
+
+msgid "More information is available|here"
+msgstr ""
+
+msgid "More information."
+msgstr ""
+
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
+msgid "More topics"
+msgstr ""
+
+msgid "Most common"
+msgstr ""
+
+msgid "Most relevant"
+msgstr ""
+
+msgid "Most stars"
+msgstr ""
+
+msgid "Mount point %{mounted_as} not found in %{model_class}."
+msgstr ""
+
+msgid "Move"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Move issue"
+msgstr ""
+
+msgid "Move issue from one column of the board to another"
+msgstr ""
+
+msgid "Move selection down"
+msgstr ""
+
+msgid "Move selection up"
+msgstr ""
+
+msgid "Move test case"
+msgstr ""
+
+msgid "Move this issue to another project."
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
+msgstr ""
+
+msgid "MoveIssue|Cannot move issue to project it originates from!"
+msgstr ""
+
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
+msgid "Moved issue to %{label} column in the board."
+msgstr ""
+
+msgid "Moved this issue to %{path_to_project}."
+msgstr ""
+
+msgid "Moves issue to %{label} column in the board."
+msgstr ""
+
+msgid "Moves this issue to %{path_to_project}."
+msgstr ""
+
+msgid "MrDeploymentActions|Deploy"
+msgstr ""
+
+msgid "MrDeploymentActions|Re-deploy"
+msgstr ""
+
+msgid "MrDeploymentActions|Stop environment"
+msgstr ""
+
+msgid "MrList|Assigned to %{name}"
+msgstr ""
+
+msgid "MrList|Attention requested from assignee %{name}"
+msgstr ""
+
+msgid "MrList|Attention requested from reviewer %{name}"
+msgstr ""
+
+msgid "MrList|Review requested from %{name}"
+msgstr ""
+
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
+msgid "Multi-project"
+msgstr ""
+
+msgid "Multiple HTTP integrations are not supported for this project"
+msgstr ""
+
+msgid "Multiple IP address ranges are supported."
+msgstr ""
+
+msgid "Multiple Prometheus integrations are not supported"
+msgstr ""
+
+msgid "Multiple model types found: %{model_types}"
+msgstr ""
+
+msgid "Multiple uploaders found: %{uploader_types}"
+msgstr ""
+
+msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
+msgstr ""
+
+msgid "My awesome group"
+msgstr ""
+
+msgid "My company or team"
+msgstr ""
+
+msgid "My topic"
+msgstr ""
+
+msgid "My-Reaction"
+msgstr ""
+
+msgid "NEW"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Name can't be blank"
+msgstr ""
+
+msgid "Name has already been taken"
+msgstr ""
+
+msgid "Name is already taken."
+msgstr ""
+
+msgid "Name new label"
+msgstr ""
+
+msgid "Name:"
+msgstr ""
+
+msgid "Namespace"
+msgstr ""
+
+msgid "Namespace ID:"
+msgstr ""
+
+msgid "Namespace:"
+msgstr ""
+
+msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked project"
+msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
+msgstr ""
+
+msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has approximately %{percent} (%{size}) namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has approximately %{percent} (%{size}) namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Approximately %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
+msgid "Namespaces"
+msgstr ""
+
+msgid "Namespaces to index"
+msgstr ""
+
+msgid "Naming, topics, avatar"
+msgstr ""
+
+msgid "Naming, visibility"
+msgstr ""
+
+msgid "Navigate to the project to close the milestone."
+msgstr ""
+
+msgid "Navigation bar"
+msgstr ""
+
+msgid "NavigationTheme|Blue"
+msgstr ""
+
+msgid "NavigationTheme|Dark Mode (alpha)"
+msgstr ""
+
+msgid "NavigationTheme|Gray"
+msgstr ""
+
+msgid "NavigationTheme|Green"
+msgstr ""
+
+msgid "NavigationTheme|Indigo"
+msgstr ""
+
+msgid "NavigationTheme|Light Blue"
+msgstr ""
+
+msgid "NavigationTheme|Light Gray"
+msgstr ""
+
+msgid "NavigationTheme|Light Green"
+msgstr ""
+
+msgid "NavigationTheme|Light Indigo"
+msgstr ""
+
+msgid "NavigationTheme|Light Red"
+msgstr ""
+
+msgid "NavigationTheme|Red"
+msgstr ""
+
+msgid "Nav|Help"
+msgstr ""
+
+msgid "Nav|Home"
+msgstr ""
+
+msgid "Nav|Sign In / Register"
+msgstr ""
+
+msgid "Nav|Sign out and sign in with a different account"
+msgstr ""
+
+msgid "Need help?"
+msgstr ""
+
+msgid "Need your attention"
+msgstr ""
+
+msgid "Needs"
+msgstr ""
+
+msgid "Needs attention"
+msgstr ""
+
+msgid "Network"
+msgstr ""
+
+msgid "Network:"
+msgstr ""
+
+msgid "Never"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New %{type} in %{project}"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Branch"
+msgstr ""
+
+msgid "New Deploy Key"
+msgstr ""
+
+msgid "New Environment"
+msgstr ""
+
+msgid "New Epic"
+msgstr ""
+
+msgid "New File"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
+msgid "New Group Name"
+msgstr ""
+
+msgid "New Identity"
+msgstr ""
+
+msgid "New Issue"
+msgid_plural "New Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "New Jira import"
+msgstr ""
+
+msgid "New Label"
+msgstr ""
+
+msgid "New Milestone"
+msgstr ""
+
+msgid "New Pages Domain"
+msgstr ""
+
+msgid "New Password"
+msgstr ""
+
+msgid "New Pipeline Schedule"
+msgstr ""
+
+msgid "New Project"
+msgstr ""
+
+msgid "New Requirement"
+msgstr ""
+
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Test Case"
+msgstr ""
+
+msgid "New User"
+msgstr ""
+
+msgid "New application"
+msgstr ""
+
+msgid "New branch"
+msgstr ""
+
+msgid "New branch unavailable"
+msgstr ""
+
+msgid "New confidential epic title "
+msgstr ""
+
+msgid "New confidential issue title"
+msgstr ""
+
+msgid "New deploy key"
+msgstr ""
+
+msgid "New directory"
+msgstr ""
+
+msgid "New discussion"
+msgstr ""
+
+msgid "New email address added"
+msgstr ""
+
+msgid "New environment"
+msgstr ""
+
+msgid "New epic"
+msgstr ""
+
+msgid "New epic title"
+msgstr ""
+
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
+msgid "New file"
+msgstr ""
+
+msgid "New group"
+msgstr ""
+
+msgid "New health check access token has been generated!"
+msgstr ""
+
+msgid "New identity"
+msgstr ""
+
+msgid "New issue"
+msgstr ""
+
+msgid "New issue in %{project}"
+msgstr ""
+
+msgid "New issue title"
+msgstr ""
+
+msgid "New iteration created"
+msgstr ""
+
+msgid "New label"
+msgstr ""
+
+msgid "New list"
+msgstr ""
+
+msgid "New merge request"
+msgstr ""
+
+msgid "New milestone"
+msgstr ""
+
+msgid "New name"
+msgstr ""
+
+msgid "New password"
+msgstr ""
+
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
+msgstr ""
+
+msgid "New project"
+msgstr ""
+
+msgid "New project page"
+msgstr ""
+
+msgid "New project pages"
+msgstr ""
+
+msgid "New project/repository"
+msgstr ""
+
+msgid "New public deploy key"
+msgstr ""
+
+msgid "New related %{issueType}"
+msgstr ""
+
+msgid "New release"
+msgstr ""
+
+msgid "New requirement"
+msgstr ""
+
+msgid "New response for issue #%{issue_iid}:"
+msgstr ""
+
+msgid "New runners registration token has been generated!"
+msgstr ""
+
+msgid "New schedule"
+msgstr ""
+
+msgid "New snippet"
+msgstr ""
+
+msgid "New subgroup"
+msgstr ""
+
+msgid "New tag"
+msgstr ""
+
+msgid "New test case"
+msgstr ""
+
+msgid "New topic"
+msgstr ""
+
+msgid "New users set to external"
+msgstr ""
+
+msgid "New! Suggest changes directly"
+msgstr ""
+
+msgid "Newest first"
+msgstr ""
+
+msgid "Newly-registered users are external by default"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Next commit"
+msgstr ""
+
+msgid "Next design"
+msgstr ""
+
+msgid "Next file in diff"
+msgstr ""
+
+msgid "Next scan"
+msgstr ""
+
+msgid "Next unresolved discussion"
+msgstr ""
+
+msgid "Next update"
+msgstr ""
+
+msgid "Nickname"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "No %{header} for this request."
+msgstr ""
+
+msgid "No %{providerTitle} repositories found"
+msgstr ""
+
+msgid "No CSV data to display."
+msgstr ""
+
+msgid "No Epic"
+msgstr ""
+
+msgid "No Matching Results"
+msgstr ""
+
+msgid "No Milestone"
+msgstr ""
+
+msgid "No Scopes"
+msgstr ""
+
+msgid "No Work Item Link found"
+msgstr ""
+
+msgid "No active admin user found"
+msgstr ""
+
+msgid "No activities found"
+msgstr ""
+
+msgid "No application_settings found"
+msgstr ""
+
+msgid "No approvers"
+msgstr ""
+
+msgid "No artifacts found"
+msgstr ""
+
+msgid "No assignee"
+msgstr ""
+
+msgid "No attention request"
+msgstr ""
+
+msgid "No authentication methods configured."
+msgstr ""
+
+msgid "No available branches"
+msgstr ""
+
+msgid "No branches found"
+msgstr ""
+
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
+msgid "No changes"
+msgstr ""
+
+msgid "No changes between %{source} and %{target}"
+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 confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
+msgstr ""
+
+msgid "No connection could be made to a Gitaly Server, please check your logs!"
+msgstr ""
+
+msgid "No contributions"
+msgstr ""
+
+msgid "No contributions were found"
+msgstr ""
+
+msgid "No credit card data for matching"
+msgstr ""
+
+msgid "No credit card required."
+msgstr ""
+
+msgid "No data found"
+msgstr ""
+
+msgid "No data to display"
+msgstr ""
+
+msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
+msgstr ""
+
+msgid "No deployments found"
+msgstr ""
+
+msgid "No due date"
+msgstr ""
+
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
+msgid "No endpoint provided"
+msgstr ""
+
+msgid "No errors to display."
+msgstr ""
+
+msgid "No estimate or time spent"
+msgstr ""
+
+msgid "No file chosen."
+msgstr ""
+
+msgid "No file hooks found."
+msgstr ""
+
+msgid "No file selected"
+msgstr ""
+
+msgid "No files"
+msgstr ""
+
+msgid "No files found."
+msgstr ""
+
+msgid "No forks are available to you."
+msgstr ""
+
+msgid "No group provided"
+msgstr ""
+
+msgid "No grouping"
+msgstr ""
+
+msgid "No issues found"
+msgstr ""
+
+msgid "No iteration"
+msgstr ""
+
+msgid "No iterations to show"
+msgstr ""
+
+msgid "No job log"
+msgstr ""
+
+msgid "No jobs to show"
+msgstr ""
+
+msgid "No label"
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No license. All rights reserved"
+msgstr ""
+
+msgid "No matches found"
+msgstr ""
+
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
+msgstr ""
+
+msgid "No matching labels"
+msgstr ""
+
+msgid "No matching results"
+msgstr ""
+
+msgid "No matching results for \"%{query}\""
+msgstr ""
+
+msgid "No matching results..."
+msgstr ""
+
+msgid "No members found"
+msgstr ""
+
+msgid "No memberships found"
+msgstr ""
+
+msgid "No merge requests found"
+msgstr ""
+
+msgid "No messages were logged"
+msgstr ""
+
+msgid "No milestone"
+msgstr ""
+
+msgid "No namespace"
+msgstr ""
+
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No panels matching properties %{opts}"
+msgstr ""
+
+msgid "No parent group"
+msgstr ""
+
+msgid "No plan"
+msgstr ""
+
+msgid "No policy matches this license"
+msgstr ""
+
+msgid "No preview for this file type"
+msgstr ""
+
+msgid "No prioritized labels with such name or description"
+msgstr ""
+
+msgid "No project subscribes to the pipelines in this project."
+msgstr ""
+
+msgid "No projects available."
+msgstr ""
+
+msgid "No projects found"
+msgstr ""
+
+msgid "No public deploy keys"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No ref selected"
+msgstr ""
+
+msgid "No regions configured"
+msgstr ""
+
+msgid "No related merge requests found."
+msgstr ""
+
+msgid "No repository"
+msgstr ""
+
+msgid "No results"
+msgstr ""
+
+msgid "No runner executable"
+msgstr ""
+
+msgid "No schedules"
+msgstr ""
+
+msgid "No service accounts"
+msgstr ""
+
+msgid "No severity matches the provided parameter"
+msgstr ""
+
+msgid "No source selected"
+msgstr ""
+
+msgid "No stack trace for this error"
+msgstr ""
+
+msgid "No starrers matched your search"
+msgstr ""
+
+msgid "No start date"
+msgstr ""
+
+msgid "No suggestions found"
+msgstr ""
+
+msgid "No tag selected"
+msgstr ""
+
+msgid "No template"
+msgstr ""
+
+msgid "No template selected"
+msgstr ""
+
+msgid "No test coverage"
+msgstr ""
+
+msgid "No triggers exist yet. Use the form above to create one."
+msgstr ""
+
+msgid "No user provided"
+msgstr ""
+
+msgid "No vulnerabilities present"
+msgstr ""
+
+msgid "No webhook events"
+msgstr ""
+
+msgid "No webhooks enabled. Select trigger events above."
+msgstr ""
+
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "No. of commits"
+msgstr ""
+
+msgid "Nobody has starred this repository yet"
+msgstr ""
+
+msgid "Node was successfully created."
+msgstr ""
+
+msgid "Node was successfully updated."
+msgstr ""
+
+msgid "Nodes"
+msgstr ""
+
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid "None of the group milestones have the same project as the release"
+msgstr ""
+
+msgid "Normal text"
+msgstr ""
+
+msgid "Not Implemented"
+msgstr ""
+
+msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
+msgstr ""
+
+msgid "Not all browsers support WebAuthn. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even from an unsupported browser."
+msgstr ""
+
+msgid "Not all data has been processed yet, the accuracy of the chart for the selected timeframe is limited."
+msgstr ""
+
+msgid "Not applicable."
+msgstr ""
+
+msgid "Not available"
+msgstr ""
+
+msgid "Not available for private projects"
+msgstr ""
+
+msgid "Not available for protected branches"
+msgstr ""
+
+msgid "Not confidential"
+msgstr ""
+
+msgid "Not found"
+msgstr ""
+
+msgid "Not found."
+msgstr ""
+
+msgid "Not permitted to destroy framework"
+msgstr ""
+
+msgid "Not ready yet. Try again later."
+msgstr ""
+
+msgid "Not started"
+msgstr ""
+
+msgid "Not supported"
+msgstr ""
+
+msgid "Note"
+msgstr ""
+
+msgid "Note creation requests"
+msgstr ""
+
+msgid "Note parameters are invalid: %{errors}"
+msgstr ""
+
+msgid "Note that pushing to GitLab requires write access to this repository."
+msgstr ""
+
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: current forks will keep their visibility level."
+msgstr ""
+
+msgid "NoteForm|Note"
+msgstr ""
+
+msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
+msgstr ""
+
+msgid "Notes"
+msgstr ""
+
+msgid "Notes rate limit"
+msgstr ""
+
+msgid "Notes|Are you sure you want to cancel creating this %{commentType}?"
+msgstr ""
+
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
+msgid "Notes|Collapse replies"
+msgstr ""
+
+msgid "Notes|Expand replies"
+msgstr ""
+
+msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
+msgstr ""
+
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
+msgid "Notes|Make this an internal note"
+msgstr ""
+
+msgid "Notes|Show all activity"
+msgstr ""
+
+msgid "Notes|Show comments only"
+msgstr ""
+
+msgid "Notes|Show history only"
+msgstr ""
+
+msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
+msgstr ""
+
+msgid "Notes|This internal note will always remain confidential"
+msgstr ""
+
+msgid "Notes|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
+msgid "Nothing to preview."
+msgstr ""
+
+msgid "Notification events"
+msgstr ""
+
+msgid "Notification setting - %{notification_title}"
+msgstr ""
+
+msgid "Notification settings saved"
+msgstr ""
+
+msgid "NotificationEmail|Assignee"
+msgid_plural "NotificationEmail|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEmail|Assignee: %{users}"
+msgid_plural "NotificationEmail|Assignees: %{users}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEmail|Reviewer"
+msgid_plural "NotificationEmail|Reviewers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEmail|Reviewer: %{users}"
+msgid_plural "NotificationEmail|Reviewers: %{users}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEvent|Change reviewer merge request"
+msgstr ""
+
+msgid "NotificationEvent|Close issue"
+msgstr ""
+
+msgid "NotificationEvent|Close merge request"
+msgstr ""
+
+msgid "NotificationEvent|Failed pipeline"
+msgstr ""
+
+msgid "NotificationEvent|Fixed pipeline"
+msgstr ""
+
+msgid "NotificationEvent|Issue due"
+msgstr ""
+
+msgid "NotificationEvent|Merge merge request"
+msgstr ""
+
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
+msgid "NotificationEvent|Moved project"
+msgstr ""
+
+msgid "NotificationEvent|New epic"
+msgstr ""
+
+msgid "NotificationEvent|New issue"
+msgstr ""
+
+msgid "NotificationEvent|New merge request"
+msgstr ""
+
+msgid "NotificationEvent|New note"
+msgstr ""
+
+msgid "NotificationEvent|New release"
+msgstr ""
+
+msgid "NotificationEvent|Push to merge request"
+msgstr ""
+
+msgid "NotificationEvent|Reassign issue"
+msgstr ""
+
+msgid "NotificationEvent|Reassign merge request"
+msgstr ""
+
+msgid "NotificationEvent|Reopen issue"
+msgstr ""
+
+msgid "NotificationEvent|Reopen merge request"
+msgstr ""
+
+msgid "NotificationEvent|Successful pipeline"
+msgstr ""
+
+msgid "NotificationLevel|Custom"
+msgstr ""
+
+msgid "NotificationLevel|Disabled"
+msgstr ""
+
+msgid "NotificationLevel|Global"
+msgstr ""
+
+msgid "NotificationLevel|On mention"
+msgstr ""
+
+msgid "NotificationLevel|Participate"
+msgstr ""
+
+msgid "NotificationLevel|Watch"
+msgstr ""
+
+msgid "Notifications"
+msgstr ""
+
+msgid "Notifications have been disabled by the project or group owner"
+msgstr ""
+
+msgid "Notifications off"
+msgstr ""
+
+msgid "Notifications on"
+msgstr ""
+
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
+msgid "Notify users by email when sign-in location is not recognized."
+msgstr ""
+
+msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
+msgstr ""
+
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
+msgid "Notify|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+msgstr ""
+
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} was %{mr_status}"
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} was %{mr_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} was merged"
+msgstr ""
+
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
+msgid "Notify|Merge request URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
+msgid "Nov"
+msgstr ""
+
+msgid "November"
+msgstr ""
+
+msgid "Now, personalize your GitLab experience"
+msgstr ""
+
+msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
+msgstr ""
+
+msgid "Number of Elasticsearch shards and replicas per index:"
+msgstr ""
+
+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 %{code_start}git repack%{code_end} is run."
+msgstr ""
+
+msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgstr ""
+
+msgid "Number of LOCs per commit"
+msgstr ""
+
+msgid "Number of commits"
+msgstr ""
+
+msgid "Number of commits per MR"
+msgstr ""
+
+msgid "Number of employees"
+msgstr ""
+
+msgid "Number of events"
+msgstr ""
+
+msgid "Number of events for this project: %{total_count}."
+msgstr ""
+
+msgid "Number of files touched"
+msgstr ""
+
+msgid "Number of replicas"
+msgstr ""
+
+msgid "Number of shards"
+msgstr ""
+
+msgid "OK"
+msgstr ""
+
+msgid "Object does not exist on the server or you don't have permissions to access it"
+msgstr ""
+
+msgid "Oct"
+msgstr ""
+
+msgid "October"
+msgstr ""
+
+msgid "OfSearchInADropdown|Filter"
+msgstr ""
+
+msgid "Off"
+msgstr ""
+
+msgid "Offline"
+msgstr ""
+
+msgid "Oh no!"
+msgstr ""
+
+msgid "Ok, let's go"
+msgstr ""
+
+msgid "Okay"
+msgstr ""
+
+msgid "Oldest first"
+msgstr ""
+
+msgid "OmniAuth"
+msgstr ""
+
+msgid "On"
+msgstr ""
+
+msgid "On track"
+msgstr ""
+
+msgid "On-call Schedules"
+msgstr ""
+
+msgid "On-call schedules"
+msgstr ""
+
+msgid "On-demand scans run outside of the DevOps cycle and find vulnerabilities in your projects"
+msgstr ""
+
+msgid "OnCallScheduless|Any escalation rules that are using this schedule will also be deleted."
+msgstr ""
+
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
+msgid "OnCallSchedules|Add a rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Add a schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Add an additional schedule to your project"
+msgstr ""
+
+msgid "OnCallSchedules|Add rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Add schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteRotation}\" rotation? This action cannot be undone."
+msgstr ""
+
+msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteSchedule}\" schedule? This action cannot be undone."
+msgstr ""
+
+msgid "OnCallSchedules|Collapse schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Create on-call schedules in GitLab"
+msgstr ""
+
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
+msgid "OnCallSchedules|Delete rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Delete schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Edit rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Edit schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Enable end date"
+msgstr ""
+
+msgid "OnCallSchedules|Expand schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Failed to add rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Failed to add schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Failed to edit schedule"
+msgstr ""
+
+msgid "OnCallSchedules|For this rotation, on-call will be:"
+msgstr ""
+
+msgid "OnCallSchedules|On-call schedule %{obstacle} in project %{project}"
+msgstr ""
+
+msgid "OnCallSchedules|On-call schedules"
+msgstr ""
+
+msgid "OnCallSchedules|Please note, rotations with shifts that are less than four hours are currently not supported in the weekly view."
+msgstr ""
+
+msgid "OnCallSchedules|Removing this user may put their on-call team at risk of missing a notification."
+msgstr ""
+
+msgid "OnCallSchedules|Removing yourself may put your on-call team at risk of missing a notification."
+msgstr ""
+
+msgid "OnCallSchedules|Restrict to time intervals"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation length"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation name cannot be empty"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation participants cannot be empty"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation start date cannot be empty"
+msgstr ""
+
+msgid "OnCallSchedules|Rotations"
+msgstr ""
+
+msgid "OnCallSchedules|Route alerts directly to specific members of your team"
+msgstr ""
+
+msgid "OnCallSchedules|Select participant"
+msgstr ""
+
+msgid "OnCallSchedules|Select timezone"
+msgstr ""
+
+msgid "OnCallSchedules|Sets the default timezone for the schedule, for all participants"
+msgstr ""
+
+msgid "OnCallSchedules|Successfully created a new rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Successfully edited your rotation"
+msgstr ""
+
+msgid "OnCallSchedules|The rotation could not be deleted. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|The rotation could not be updated. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|The schedule could not be deleted. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|The schedule could not be updated. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|Try adding a rotation"
+msgstr ""
+
+msgid "OnCallSchedules|User %{name} is currently part of:"
+msgstr ""
+
+msgid "OnCallSchedules|View next timeframe"
+msgstr ""
+
+msgid "OnCallSchedules|View previous timeframe"
+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. To enable notifications for this schedule, you must also create an %{linkStart}escalation policy%{linkEnd}."
+msgstr ""
+
+msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
+msgstr ""
+
+msgid "OnDemandScans|%{profileType} profile library"
+msgstr ""
+
+msgid "OnDemandScans|Add a schedule to run this scan at a specified date and time or on a recurring basis. Scheduled scans are automatically saved to scan library."
+msgstr ""
+
+msgid "OnDemandScans|Analyze a deployed version of your web application for known vulnerabilities by examining it from the outside in. DAST works by simulating external attacks on your application while it is running."
+msgstr ""
+
+msgid "OnDemandScans|Are you sure you want to delete this scan?"
+msgstr ""
+
+msgid "OnDemandScans|Cancel"
+msgstr ""
+
+msgid "OnDemandScans|Could not delete saved scan. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not fetch on-demand scans. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not fetch scanner profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not fetch site profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not run the scan. Please try again."
+msgstr ""
+
+msgid "OnDemandScans|Create new scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Create new site profile"
+msgstr ""
+
+msgid "OnDemandScans|DAST configuration"
+msgstr ""
+
+msgid "OnDemandScans|DAST scans for vulnerabilities in your project's running application, website, or API. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
+msgstr ""
+
+msgid "OnDemandScans|Define the fundamental configuration options for your on-demand scan."
+msgstr ""
+
+msgid "OnDemandScans|Delete profile"
+msgstr ""
+
+msgid "OnDemandScans|Description (optional)"
+msgstr ""
+
+msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "OnDemandScans|Edit %{profileType} profile"
+msgstr ""
+
+msgid "OnDemandScans|Edit on-demand DAST scan"
+msgstr ""
+
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
+msgid "OnDemandScans|Edit profile"
+msgstr ""
+
+msgid "OnDemandScans|Enable scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgstr ""
+
+msgid "OnDemandScans|Manage scanner profiles"
+msgstr ""
+
+msgid "OnDemandScans|Manage site profiles"
+msgstr ""
+
+msgid "OnDemandScans|My daily scan"
+msgstr ""
+
+msgid "OnDemandScans|New %{profileType} profile"
+msgstr ""
+
+msgid "OnDemandScans|New on-demand DAST scan"
+msgstr ""
+
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
+msgid "OnDemandScans|New profile"
+msgstr ""
+
+msgid "OnDemandScans|New scan"
+msgstr ""
+
+msgid "OnDemandScans|No %{profileType} profiles found for DAST"
+msgstr ""
+
+msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
+msgstr ""
+
+msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed site profile."
+msgstr ""
+
+msgid "OnDemandScans|On-demand Scans"
+msgstr ""
+
+msgid "OnDemandScans|On-demand scans"
+msgstr ""
+
+msgid "OnDemandScans|On-demand scans run outside of DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}."
+msgstr ""
+
+msgid "OnDemandScans|On-demand scans run outside the DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}"
+msgstr ""
+
+msgid "OnDemandScans|Repeats"
+msgstr ""
+
+msgid "OnDemandScans|Run scan"
+msgstr ""
+
+msgid "OnDemandScans|Save and run scan"
+msgstr ""
+
+msgid "OnDemandScans|Save scan"
+msgstr ""
+
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
+msgid "OnDemandScans|Scan library"
+msgstr ""
+
+msgid "OnDemandScans|Scan name"
+msgstr ""
+
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
+msgstr ""
+
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Select one of the existing profiles"
+msgstr ""
+
+msgid "OnDemandScans|Site profile"
+msgstr ""
+
+msgid "OnDemandScans|Start by creating a new profile. Profiles make it easy to save and reuse configuration details for GitLab’s security tools."
+msgstr ""
+
+msgid "OnDemandScans|Start time"
+msgstr ""
+
+msgid "OnDemandScans|Target"
+msgstr ""
+
+msgid "OnDemandScans|The scan could not be canceled."
+msgstr ""
+
+msgid "OnDemandScans|The scan could not be retried."
+msgstr ""
+
+msgid "OnDemandScans|There are no finished scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no running scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no saved scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no scheduled scans."
+msgstr ""
+
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
+msgid "OnDemandScans|Use existing scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Use existing site profile"
+msgstr ""
+
+msgid "OnDemandScans|View results"
+msgstr ""
+
+msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
+msgstr ""
+
+msgid "OnDemandScans|at"
+msgstr ""
+
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}."
+msgstr ""
+
+msgid "Once removed, the fork relationship cannot be restored. This project will no longer be able to receive or send merge requests to the source project or other forks."
+msgstr ""
+
+msgid "Once you confirm and press \"Reduce project visibility\":"
+msgstr ""
+
+msgid "One more item"
+msgid_plural "%d more items"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
+msgid "One or more contacts were successfully added."
+msgstr ""
+
+msgid "One or more contacts were successfully removed."
+msgstr ""
+
+msgid "One or more groups that you don't have access to."
+msgstr ""
+
+msgid "One or more of you personal access tokens were revoked"
+msgstr ""
+
+msgid "One or more of your %{provider} projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your dependency files are not supported, and the dependency list may be incomplete. Below is a list of supported file types."
+msgstr ""
+
+msgid "One or more of your personal access tokens has expired."
+msgstr ""
+
+msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
+msgstr ""
+
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
+msgstr ""
+
+msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
+msgstr ""
+
+msgid "Only 1 appearances row can exist"
+msgstr ""
+
+msgid "Only HTTP(S)"
+msgstr ""
+
+msgid "Only Issue ID or merge request ID is required"
+msgstr ""
+
+msgid "Only Project Members"
+msgstr ""
+
+msgid "Only SSH"
+msgstr ""
+
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
+msgstr ""
+
+msgid "Only active projects show up in the search and on the dashboard."
+msgstr ""
+
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
+msgstr ""
+
+msgid "Only include features new to your current subscription tier."
+msgstr ""
+
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
+msgid "Only policy:"
+msgstr ""
+
+msgid "Only proceed if you trust %{idp_url} to control your GitLab account sign in."
+msgstr ""
+
+msgid "Only project members can comment."
+msgstr ""
+
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
+msgstr ""
+
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only required if not using role instance credentials."
+msgstr ""
+
+msgid "Only use lowercase letters, numbers, and underscores."
+msgstr ""
+
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
+msgstr ""
+
+msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
+msgstr ""
+
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
+msgid "Open Selection"
+msgstr ""
+
+msgid "Open errors"
+msgstr ""
+
+msgid "Open in Gitpod"
+msgstr ""
+
+msgid "Open in Web IDE"
+msgstr ""
+
+msgid "Open in file view"
+msgstr ""
+
+msgid "Open in your IDE"
+msgstr ""
+
+msgid "Open new window"
+msgstr ""
+
+msgid "Open raw"
+msgstr ""
+
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open: %{open}"
+msgstr ""
+
+msgid "OpenAPI"
+msgstr ""
+
+msgid "OpenAPI Specification file path or URL"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MRs"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
+msgid "OpenedNDaysAgo|Created"
+msgstr ""
+
+msgid "Opens in a new window"
+msgstr ""
+
+msgid "Opens new window"
+msgstr ""
+
+msgid "Operation failed. Check pod logs for %{pod_name} for more details."
+msgstr ""
+
+msgid "Operation not allowed"
+msgstr ""
+
+msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
+msgstr ""
+
+msgid "Operations"
+msgstr ""
+
+msgid "Operations Dashboard"
+msgstr ""
+
+msgid "OperationsDashboard|Add a project to the dashboard"
+msgstr ""
+
+msgid "OperationsDashboard|Add projects"
+msgstr ""
+
+msgid "OperationsDashboard|More information"
+msgstr ""
+
+msgid "OperationsDashboard|Operations Dashboard"
+msgstr ""
+
+msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
+msgstr ""
+
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
+msgid "Optimize your workflow with CI/CD Pipelines"
+msgstr ""
+
+msgid "Optional"
+msgstr ""
+
+msgid "Optional parameter \"variables\" must be a Hash. Ex: variables[key1]=value1"
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Or you can choose one of the suggested colors below"
+msgstr ""
+
+msgid "Ordered list"
+msgstr ""
+
+msgid "Organizations"
+msgstr ""
+
+msgid "Orphaned member"
+msgstr ""
+
+msgid "Other Labels"
+msgstr ""
+
+msgid "Other available runners"
+msgstr ""
+
+msgid "Other information"
+msgstr ""
+
+msgid "Other merge requests block this MR"
+msgstr ""
+
+msgid "Other versions"
+msgstr ""
+
+msgid "Other visibility settings have been disabled by the administrator."
+msgstr ""
+
+msgid "Otherwise, click the link below to complete the process."
+msgstr ""
+
+msgid "Otherwise, click the link below to complete the process:"
+msgstr ""
+
+msgid "Our team has been notified. Please try again."
+msgstr ""
+
+msgid "Out-of-compliance with this project's policies and should be removed"
+msgstr ""
+
+msgid "OutboundRequests|Allow requests to the local network from hooks and services."
+msgstr ""
+
+msgid "OutboundRequests|Allow requests to the local network from system hooks"
+msgstr ""
+
+msgid "OutboundRequests|Allow requests to the local network from web hooks and services"
+msgstr ""
+
+msgid "OutboundRequests|Enforce DNS rebinding attack protection"
+msgstr ""
+
+msgid "OutboundRequests|Local IP addresses and domain names that hooks and services may access"
+msgstr ""
+
+msgid "OutboundRequests|Outbound requests"
+msgstr ""
+
+msgid "OutboundRequests|Requests to these domains and IP addresses are accessible to both system hooks and web hooks even when local requests are not allowed. IP ranges such as 1:0:0:0:0:0:0:0/124 and 127.0.0.0/28 are supported. Domain wildcards are not supported. To separate entries use commas, semicolons, or newlines. The allowlist can hold a maximum of 1000 entries. Domains must be IDNA encoded."
+msgstr ""
+
+msgid "OutboundRequests|Resolve IP addresses once and uses them to submit requests."
+msgstr ""
+
+msgid "OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser."
+msgstr ""
+
+msgid "OutdatedBrowser|Please install a %{browser_link_start}supported web browser%{browser_link_end} for a better experience."
+msgstr ""
+
+msgid "Overridden"
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid "Overwrite diverged branches"
+msgstr ""
+
+msgid "Owned by %{image_tag}"
+msgstr ""
+
+msgid "Owned by anyone"
+msgstr ""
+
+msgid "Owned by me"
+msgstr ""
+
+msgid "Owned by:"
+msgstr ""
+
+msgid "Owner"
+msgstr ""
+
+msgid "Owners and administrators"
+msgstr ""
+
+msgid "Owners can modify this selection."
+msgstr ""
+
+msgid "PQL|An error occurred while sending hand raise lead."
+msgstr ""
+
+msgid "PQL|By providing my contact information, I agree GitLab may contact me via email about its product, services and events. You may opt-out at any time by unsubscribing in emails or visiting our communication preference center."
+msgstr ""
+
+msgid "PQL|Cancel"
+msgstr ""
+
+msgid "PQL|Contact our Sales team"
+msgstr ""
+
+msgid "PQL|Contact sales"
+msgstr ""
+
+msgid "PQL|Hello %{userName}. Before putting you in touch with our sales team, we would like you to verify and complete the information below."
+msgstr ""
+
+msgid "PQL|Message for the Sales team (optional)"
+msgstr ""
+
+msgid "PQL|Please select a city or state"
+msgstr ""
+
+msgid "PQL|Submit information"
+msgstr ""
+
+msgid "PQL|Thank you for reaching out! Our sales team will get back to you soon."
+msgstr ""
+
+msgid "Package Registry"
+msgstr ""
+
+msgid "Package Registry: authenticated API requests"
+msgstr ""
+
+msgid "Package Registry: unauthenticated API requests"
+msgstr ""
+
+msgid "Package already exists"
+msgstr ""
+
+msgid "Package deleted successfully"
+msgstr ""
+
+msgid "Package file size limits"
+msgstr ""
+
+msgid "Package recipe already exists"
+msgstr ""
+
+msgid "Package registry rate limits"
+msgstr ""
+
+msgid "Package type"
+msgstr ""
+
+msgid "Package type must be Conan"
+msgstr ""
+
+msgid "Package type must be Debian"
+msgstr ""
+
+msgid "Package type must be Helm"
+msgstr ""
+
+msgid "Package type must be Maven"
+msgstr ""
+
+msgid "Package type must be NPM"
+msgstr ""
+
+msgid "Package type must be NuGet"
+msgstr ""
+
+msgid "Package type must be PyPi"
+msgstr ""
+
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|Add Conan Remote"
+msgstr ""
+
+msgid "PackageRegistry|Add Gradle Groovy DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Add Gradle Kotlin DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Add NuGet Source"
+msgstr ""
+
+msgid "PackageRegistry|Add composer registry"
+msgstr ""
+
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
+msgstr ""
+
+msgid "PackageRegistry|App group: %{group}"
+msgstr ""
+
+msgid "PackageRegistry|App name: %{name}"
+msgstr ""
+
+msgid "PackageRegistry|Built by pipeline %{link} triggered %{datetime} by %{author}"
+msgstr ""
+
+msgid "PackageRegistry|Composer"
+msgstr ""
+
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
+msgid "PackageRegistry|Conan"
+msgstr ""
+
+msgid "PackageRegistry|Conan Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy .pypirc content"
+msgstr ""
+
+msgid "PackageRegistry|Copy Conan Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Conan Setup Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Gradle Groovy DSL install command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Gradle Kotlin DSL install command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Maven XML"
+msgstr ""
+
+msgid "PackageRegistry|Copy Maven command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Maven registry XML"
+msgstr ""
+
+msgid "PackageRegistry|Copy NuGet Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy NuGet Setup Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Pip command"
+msgstr ""
+
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
+msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Copy add Gradle Kotlin DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Copy and paste this inside your %{codeStart}pom.xml%{codeEnd} %{codeStart}dependencies%{codeEnd} block."
+msgstr ""
+
+msgid "PackageRegistry|Copy npm command"
+msgstr ""
+
+msgid "PackageRegistry|Copy npm setup command"
+msgstr ""
+
+msgid "PackageRegistry|Copy registry include"
+msgstr ""
+
+msgid "PackageRegistry|Copy require package include"
+msgstr ""
+
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
+msgid "PackageRegistry|Copy yarn command"
+msgstr ""
+
+msgid "PackageRegistry|Copy yarn setup command"
+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 ""
+
+msgid "PackageRegistry|Delete package"
+msgstr ""
+
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
+msgid "PackageRegistry|Failed to load the package data"
+msgstr ""
+
+msgid "PackageRegistry|For more information on Composer packages in GitLab, %{linkStart}see the documentation.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|For more information on the Maven registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|For more information on the NuGet registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|For more information on the PyPi registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|Generic"
+msgstr ""
+
+msgid "PackageRegistry|Gradle Groovy DSL"
+msgstr ""
+
+msgid "PackageRegistry|Gradle Groovy DSL install command"
+msgstr ""
+
+msgid "PackageRegistry|Gradle Kotlin DSL"
+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 ""
+
+msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}pom.xml%{codeEnd} file."
+msgstr ""
+
+msgid "PackageRegistry|Install package version"
+msgstr ""
+
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
+msgid "PackageRegistry|Invalid Package: failed metadata extraction"
+msgstr ""
+
+msgid "PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab."
+msgstr ""
+
+msgid "PackageRegistry|License information located at %{link}"
+msgstr ""
+
+msgid "PackageRegistry|Manually Published"
+msgstr ""
+
+msgid "PackageRegistry|Maven"
+msgstr ""
+
+msgid "PackageRegistry|Maven Command"
+msgstr ""
+
+msgid "PackageRegistry|Maven XML"
+msgstr ""
+
+msgid "PackageRegistry|NuGet"
+msgstr ""
+
+msgid "PackageRegistry|NuGet Command"
+msgstr ""
+
+msgid "PackageRegistry|Package Registry"
+msgstr ""
+
+msgid "PackageRegistry|Package deleted successfully"
+msgstr ""
+
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
+msgid "PackageRegistry|Package has %{updatesCount} archived update"
+msgid_plural "PackageRegistry|Package has %{updatesCount} archived updates"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|Pip Command"
+msgstr ""
+
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
+msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|PyPI"
+msgstr ""
+
+msgid "PackageRegistry|Recipe: %{recipe}"
+msgstr ""
+
+msgid "PackageRegistry|Registry setup"
+msgstr ""
+
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
+msgid "PackageRegistry|Remove package"
+msgstr ""
+
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
+msgid "PackageRegistry|RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|Settings for Generic packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Show Composer commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Conan commands"
+msgstr ""
+
+msgid "PackageRegistry|Show NPM commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Nuget commands"
+msgstr ""
+
+msgid "PackageRegistry|Show PyPi commands"
+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|Something went wrong while fetching the package history."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
+msgid "PackageRegistry|Sorry, your filter produced no results"
+msgstr ""
+
+msgid "PackageRegistry|Source project located at %{link}"
+msgstr ""
+
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
+msgid "PackageRegistry|There are no other versions of this package."
+msgstr ""
+
+msgid "PackageRegistry|There are no packages yet"
+msgstr ""
+
+msgid "PackageRegistry|There was a problem fetching the details for this package."
+msgstr ""
+
+msgid "PackageRegistry|There was a timeout and the package was not published. Delete this package and try again."
+msgstr ""
+
+msgid "PackageRegistry|There was an error publishing a %{packageName} package"
+msgstr ""
+
+msgid "PackageRegistry|This NuGet package has no dependencies."
+msgstr ""
+
+msgid "PackageRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "PackageRegistry|Type"
+msgstr ""
+
+msgid "PackageRegistry|Unable to fetch package version information."
+msgstr ""
+
+msgid "PackageRegistry|Unable to load package"
+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 ""
+
+msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?"
+msgstr ""
+
+msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
+msgstr ""
+
+msgid "PackageRegistry|npm"
+msgstr ""
+
+msgid "PackageRegistry|published by %{author}"
+msgstr ""
+
+msgid "Packages & Registries"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "PagerDutySettings|Active"
+msgstr ""
+
+msgid "PagerDutySettings|Create a GitLab incident for each PagerDuty incident by %{linkStart}configuring a webhook in PagerDuty%{linkEnd}"
+msgstr ""
+
+msgid "PagerDutySettings|Failed to update Webhook URL"
+msgstr ""
+
+msgid "PagerDutySettings|Reset webhook URL"
+msgstr ""
+
+msgid "PagerDutySettings|Resetting the webhook URL for this project will require updating this integration's settings in PagerDuty."
+msgstr ""
+
+msgid "PagerDutySettings|Webhook URL"
+msgstr ""
+
+msgid "PagerDutySettings|Webhook URL update was successful"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Pages Domain"
+msgstr ""
+
+msgid "Pagination|First"
+msgstr ""
+
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
+msgid "Pagination|Last"
+msgstr ""
+
+msgid "Pagination|Last »"
+msgstr ""
+
+msgid "Pagination|Next"
+msgstr ""
+
+msgid "Pagination|Prev"
+msgstr ""
+
+msgid "Pagination|« First"
+msgstr ""
+
+msgid "Parameter"
+msgstr ""
+
+msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
+msgstr ""
+
+msgid "Parent"
+msgstr ""
+
+msgid "Parent epic doesn't exist."
+msgstr ""
+
+msgid "Parent epic is not present."
+msgstr ""
+
+msgid "Parsing error for param :embed_json. %{message}"
+msgstr ""
+
+msgid "Part of merge request changes"
+msgstr ""
+
+msgid "Partial import"
+msgstr ""
+
+msgid "Participants"
+msgstr ""
+
+msgid "Pass job variables"
+msgstr ""
+
+msgid "Passed"
+msgstr ""
+
+msgid "Passed on"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Password (optional)"
+msgstr ""
+
+msgid "Password authentication is unavailable."
+msgstr ""
+
+msgid "Password confirmation"
+msgstr ""
+
+msgid "Password successfully changed"
+msgstr ""
+
+msgid "Password was successfully updated. Please sign in again."
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
+msgid "Passwords should be unique and not used for any other sites or services."
+msgstr ""
+
+msgid "Password|requires at least one lowercase letter"
+msgstr ""
+
+msgid "Password|requires at least one number"
+msgstr ""
+
+msgid "Password|requires at least one symbol character"
+msgstr ""
+
+msgid "Password|requires at least one uppercase letter"
+msgstr ""
+
+msgid "Past due"
+msgstr ""
+
+msgid "Paste a public key here."
+msgstr ""
+
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
+msgstr ""
+
+msgid "Paste confidential epic link"
+msgstr ""
+
+msgid "Paste confidential issue link"
+msgstr ""
+
+msgid "Paste epic link"
+msgstr ""
+
+msgid "Paste issue link"
+msgstr ""
+
+msgid "Paste link"
+msgstr ""
+
+msgid "Paste project path (i.e. gitlab-org/gitlab)"
+msgstr ""
+
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
+msgid "Patch to apply"
+msgstr ""
+
+msgid "Path"
+msgstr ""
+
+msgid "Path:"
+msgstr ""
+
+msgid "Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "Paths to protect with rate limiting"
+msgstr ""
+
+msgid "Pause"
+msgstr ""
+
+msgid "Pause indexing and upgrade Elasticsearch to a supported version."
+msgstr ""
+
+msgid "Pause time (ms)"
+msgstr ""
+
+msgid "Paused"
+msgstr ""
+
+msgid "Paused runners don't accept new jobs"
+msgstr ""
+
+msgid "Peer review by"
+msgstr ""
+
+msgid "Pending"
+msgstr ""
+
+msgid "Pending Deletion"
+msgstr ""
+
+msgid "Pending comments"
+msgstr ""
+
+msgid "Pending deletion"
+msgstr ""
+
+msgid "Pending owner action"
+msgstr ""
+
+msgid "Pending sync…"
+msgstr ""
+
+msgid "People without permission will never get a notification and won't be able to comment."
+msgstr ""
+
+msgid "People without permission will never get a notification."
+msgstr ""
+
+msgid "Per your subscription agreement with GitLab, you must report your license usage data on a monthly basis. GitLab uses this data to keep your subscription up to date. To report your license usage data, export your license usage file and email it to %{renewal_service_email}. If you need an updated license, GitLab will send the license to the email address registered in the %{customers_dot}, and you can upload this license to your instance."
+msgstr ""
+
+msgid "Percent rollout must be an integer number between 0 and 100"
+msgstr ""
+
+msgid "Percentage"
+msgstr ""
+
+msgid "Perform advanced options such as changing path, transferring, exporting, or removing the group."
+msgstr ""
+
+msgid "Perform code reviews and enhance collaboration with merge requests."
+msgstr ""
+
+msgid "Perform common operations on GitLab project"
+msgstr ""
+
+msgid "Performance optimization"
+msgstr ""
+
+msgid "PerformanceBar|Backend"
+msgstr ""
+
+msgid "PerformanceBar|Bullet notifications"
+msgstr ""
+
+msgid "PerformanceBar|DOM Content Loaded"
+msgstr ""
+
+msgid "PerformanceBar|Download"
+msgstr ""
+
+msgid "PerformanceBar|Elasticsearch calls"
+msgstr ""
+
+msgid "PerformanceBar|External Http calls"
+msgstr ""
+
+msgid "PerformanceBar|First Contentful Paint"
+msgstr ""
+
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
+msgid "PerformanceBar|Frontend resources"
+msgstr ""
+
+msgid "PerformanceBar|Gitaly calls"
+msgstr ""
+
+msgid "PerformanceBar|Memory"
+msgstr ""
+
+msgid "PerformanceBar|Memory report"
+msgstr ""
+
+msgid "PerformanceBar|Redis calls"
+msgstr ""
+
+msgid "PerformanceBar|Rugged calls"
+msgstr ""
+
+msgid "PerformanceBar|SQL queries"
+msgstr ""
+
+msgid "PerformanceBar|Sort by duration"
+msgstr ""
+
+msgid "PerformanceBar|Sort chronologically"
+msgstr ""
+
+msgid "PerformanceBar|Stats"
+msgstr ""
+
+msgid "PerformanceBar|Total duration"
+msgstr ""
+
+msgid "PerformanceBar|Trace"
+msgstr ""
+
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
+msgid "Period in seconds"
+msgstr ""
+
+msgid "Permalink"
+msgstr ""
+
+msgid "Permanently remove group"
+msgstr ""
+
+msgid "Permissions"
+msgstr ""
+
+msgid "Permissions Help"
+msgstr ""
+
+msgid "Permissions and group features"
+msgstr ""
+
+msgid "Personal Access Token"
+msgstr ""
+
+msgid "Personal Access Token prefix"
+msgstr ""
+
+msgid "Personal project creation is not allowed. Please contact your administrator with questions"
+msgstr ""
+
+msgid "Personal projects"
+msgstr ""
+
+msgid "Personal projects limit:"
+msgstr ""
+
+msgid "Phabricator Server Import"
+msgstr ""
+
+msgid "Phabricator Server URL"
+msgstr ""
+
+msgid "Phabricator Tasks"
+msgstr ""
+
+msgid "Phone"
+msgstr ""
+
+msgid "Pick a name"
+msgstr ""
+
+msgid "Pin code"
+msgstr ""
+
+msgid "Pipeline"
+msgstr ""
+
+msgid "Pipeline %{label}"
+msgstr ""
+
+msgid "Pipeline %{label} for \"%{dataTitle}\""
+msgstr ""
+
+msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
+msgstr ""
+
+msgid "Pipeline ID"
+msgstr ""
+
+msgid "Pipeline IID"
+msgstr ""
+
+msgid "Pipeline Schedule"
+msgstr ""
+
+msgid "Pipeline Schedules"
+msgstr ""
+
+msgid "Pipeline URL"
+msgstr ""
+
+msgid "Pipeline creation rate limits"
+msgstr ""
+
+msgid "Pipeline durations for the last 30 commits"
+msgstr ""
+
+msgid "Pipeline ran in fork of project"
+msgstr ""
+
+msgid "Pipeline status emails"
+msgstr ""
+
+msgid "Pipeline subscriptions"
+msgstr ""
+
+msgid "Pipeline subscriptions trigger a new pipeline on the default branch of this project when a pipeline successfully completes for a new tag on the %{default_branch_docs} of the subscribed project."
+msgstr ""
+
+msgid "Pipeline triggers"
+msgstr ""
+
+msgid "Pipeline: %{status}"
+msgstr ""
+
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
+msgstr ""
+
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
+msgstr ""
+
+msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
+msgstr ""
+
+msgid "PipelineCharts|CI/CD Analytics"
+msgstr ""
+
+msgid "PipelineCharts|Failed:"
+msgstr ""
+
+msgid "PipelineCharts|Overall statistics"
+msgstr ""
+
+msgid "PipelineCharts|Success ratio:"
+msgstr ""
+
+msgid "PipelineCharts|Successful:"
+msgstr ""
+
+msgid "PipelineCharts|There was an error parsing the data for the charts."
+msgstr ""
+
+msgid "PipelineCharts|Total:"
+msgstr ""
+
+msgid "PipelineEditorFileTree|Configuration files added with the include keyword"
+msgstr ""
+
+msgid "PipelineEditorFileTree|When you use the include keyword to add pipeline configuration from files in the project, those files will be listed here."
+msgstr ""
+
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
+msgstr ""
+
+msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
+msgstr ""
+
+msgid "PipelineEditorTutorial|GitLab CI/CD can automatically build, test, and deploy your application."
+msgstr ""
+
+msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Make your pipeline more efficient with the %{linkStart}Needs keyword%{linkEnd}"
+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|The pipeline status is at the top of the page."
+msgstr ""
+
+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|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
+msgstr ""
+
+msgid "PipelineEditorTutorial|💡 Tip: Visualize and validate your pipeline"
+msgstr ""
+
+msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
+msgstr ""
+
+msgid "PipelineEditor|The merged YAML view is displayed when the CI/CD configuration file has valid syntax."
+msgstr ""
+
+msgid "PipelineEditor|The pipeline visualization is displayed when the CI/CD configuration file has valid syntax."
+msgstr ""
+
+msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgstr ""
+
+msgid "PipelineSchedules|Activated"
+msgstr ""
+
+msgid "PipelineSchedules|Active"
+msgstr ""
+
+msgid "PipelineSchedules|All"
+msgstr ""
+
+msgid "PipelineSchedules|Inactive"
+msgstr ""
+
+msgid "PipelineSchedules|Next Run"
+msgstr ""
+
+msgid "PipelineSchedules|None"
+msgstr ""
+
+msgid "PipelineSchedules|Provide a short description for this pipeline"
+msgstr ""
+
+msgid "PipelineSchedules|Take ownership"
+msgstr ""
+
+msgid "PipelineSchedules|Target"
+msgstr ""
+
+msgid "PipelineSchedules|Variables"
+msgstr ""
+
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
+msgid "PipelineWizardDefaultCommitMessage|Add %{filename}"
+msgstr ""
+
+msgid "PipelineWizardDefaultCommitMessage|Update %{filename}"
+msgstr ""
+
+msgid "PipelineWizardInputValidation|At least one entry is required"
+msgstr ""
+
+msgid "PipelineWizardInputValidation|This field is required"
+msgstr ""
+
+msgid "PipelineWizardInputValidation|This value is not valid"
+msgstr ""
+
+msgid "PipelineWizardListWidget|add another step"
+msgstr ""
+
+msgid "PipelineWizardListWidget|remove step"
+msgstr ""
+
+msgid "PipelineWizard|Commit"
+msgstr ""
+
+msgid "PipelineWizard|Commit Message"
+msgstr ""
+
+msgid "PipelineWizard|Commit changes to your file"
+msgstr ""
+
+msgid "PipelineWizard|Commit file to Branch"
+msgstr ""
+
+msgid "PipelineWizard|Commit your new file"
+msgstr ""
+
+msgid "PipelineWizard|The file has been committed."
+msgstr ""
+
+msgid "PipelineWizard|There was a problem committing the changes."
+msgstr ""
+
+msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
+msgstr ""
+
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
+msgid "Pipelines"
+msgstr ""
+
+msgid "Pipelines charts"
+msgstr ""
+
+msgid "Pipelines settings for '%{project_name}' were successfully updated."
+msgstr ""
+
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|1. Set up a runner"
+msgstr ""
+
+msgid "Pipelines|2. Configure deployment pipeline"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
+msgstr ""
+
+msgid "Pipelines|Are you sure you want to run this pipeline?"
+msgstr ""
+
+msgid "Pipelines|Auto DevOps"
+msgstr ""
+
+msgid "Pipelines|Based on your project, we recommend this template:"
+msgstr ""
+
+msgid "Pipelines|Build with confidence"
+msgstr ""
+
+msgid "Pipelines|Building for iOS?"
+msgstr ""
+
+msgid "Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?"
+msgstr ""
+
+msgid "Pipelines|CI lint"
+msgstr ""
+
+msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
+msgstr ""
+
+msgid "Pipelines|Clear runner caches"
+msgstr ""
+
+msgid "Pipelines|Configuration validation currently not available."
+msgstr ""
+
+msgid "Pipelines|Configure pipeline"
+msgstr ""
+
+msgid "Pipelines|Continuous integration and deployment template to test and deploy your %{name} project."
+msgstr ""
+
+msgid "Pipelines|Copy trigger token"
+msgstr ""
+
+msgid "Pipelines|Could not load artifacts."
+msgstr ""
+
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
+msgid "Pipelines|Description"
+msgstr ""
+
+msgid "Pipelines|Don't need a guide? Jump in right away with a template."
+msgstr ""
+
+msgid "Pipelines|Edit"
+msgstr ""
+
+msgid "Pipelines|Editor"
+msgstr ""
+
+msgid "Pipelines|Follow these instructions to install GitLab Runner on macOS."
+msgstr ""
+
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
+msgstr ""
+
+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|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline."
+msgstr ""
+
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
+msgstr ""
+
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgstr ""
+
+msgid "Pipelines|Install GitLab Runner"
+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 the basics of pipelines and .yml files"
+msgstr ""
+
+msgid "Pipelines|Let's get that runner set up! %{emojiStart}tada%{emojiEnd}"
+msgstr ""
+
+msgid "Pipelines|Lint"
+msgstr ""
+
+msgid "Pipelines|Loading Pipelines"
+msgstr ""
+
+msgid "Pipelines|Loading pipelines"
+msgstr ""
+
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
+msgid "Pipelines|More Information"
+msgstr ""
+
+msgid "Pipelines|Need more information to set up your runner? %{linkStart}Check out our documentation%{linkEnd}."
+msgstr ""
+
+msgid "Pipelines|No runners detected"
+msgstr ""
+
+msgid "Pipelines|No triggers have been created yet. Add one using the form above."
+msgstr ""
+
+msgid "Pipelines|Not building for iOS or not what you're looking for? %{linkStart}See what else%{linkEnd} GitLab CI/CD has to offer."
+msgstr ""
+
+msgid "Pipelines|Owner"
+msgstr ""
+
+msgid "Pipelines|Pipeline Editor"
+msgstr ""
+
+msgid "Pipelines|Project cache successfully reset."
+msgstr ""
+
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
+msgid "Pipelines|Revoke trigger"
+msgstr ""
+
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
+msgid "Pipelines|Set up a runner"
+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 ""
+
+msgid "Pipelines|The GitLab CI configuration could not be updated."
+msgstr ""
+
+msgid "Pipelines|There are currently no finished pipelines."
+msgstr ""
+
+msgid "Pipelines|There are currently no pipelines."
+msgstr ""
+
+msgid "Pipelines|There was a problem with loading the pipeline data."
+msgstr ""
+
+msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is invalid."
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is invalid:"
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is invalid: %{reason}."
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is valid."
+msgstr ""
+
+msgid "Pipelines|This is a child pipeline within the parent pipeline"
+msgstr ""
+
+msgid "Pipelines|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
+msgstr ""
+
+msgid "Pipelines|This pipeline ran on the contents of this merge request's source branch, not the target branch."
+msgstr ""
+
+msgid "Pipelines|This pipeline will run code originating from a forked project merge request. This means that the code can potentially have security considerations like exposing CI variables."
+msgstr ""
+
+msgid "Pipelines|This project is not currently set up to run pipelines."
+msgstr ""
+
+msgid "Pipelines|Token"
+msgstr ""
+
+msgid "Pipelines|Trigger user has insufficient permissions to project"
+msgstr ""
+
+msgid "Pipelines|Try test template"
+msgstr ""
+
+msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
+msgstr ""
+
+msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
+msgstr ""
+
+msgid "Pipelines|Use template"
+msgstr ""
+
+msgid "Pipelines|Validate"
+msgstr ""
+
+msgid "Pipelines|Validating GitLab CI configuration…"
+msgstr ""
+
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
+msgid "Pipelines|Visualize"
+msgstr ""
+
+msgid "Pipelines|We'll guide you through a simple pipeline set-up."
+msgstr ""
+
+msgid "Pipelines|We'll walk you through how to deploy to iOS in two easy steps."
+msgstr ""
+
+msgid "Pipelines|You have runners available to run your job now. No need to do anything else."
+msgstr ""
+
+msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
+msgstr ""
+
+msgid "Pipelines|error"
+msgstr ""
+
+msgid "Pipelines|invalid"
+msgstr ""
+
+msgid "Pipelines|latest"
+msgstr ""
+
+msgid "Pipelines|merge request"
+msgstr ""
+
+msgid "Pipelines|merge train"
+msgstr ""
+
+msgid "Pipelines|stuck"
+msgstr ""
+
+msgid "Pipelines|yaml invalid"
+msgstr ""
+
+msgid "Pipeline|Actions"
+msgstr ""
+
+msgid "Pipeline|Branch name"
+msgstr ""
+
+msgid "Pipeline|Branches or tags could not be loaded."
+msgstr ""
+
+msgid "Pipeline|Canceled"
+msgstr ""
+
+msgid "Pipeline|Checking pipeline status"
+msgstr ""
+
+msgid "Pipeline|Checking pipeline status."
+msgstr ""
+
+msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
+msgstr ""
+
+msgid "Pipeline|Created"
+msgstr ""
+
+msgid "Pipeline|Creating pipeline."
+msgstr ""
+
+msgid "Pipeline|Date"
+msgstr ""
+
+msgid "Pipeline|Detached merge request pipeline"
+msgstr ""
+
+msgid "Pipeline|Failed"
+msgstr ""
+
+msgid "Pipeline|In progress"
+msgstr ""
+
+msgid "Pipeline|Manual"
+msgstr ""
+
+msgid "Pipeline|Merge train pipeline"
+msgstr ""
+
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
+msgid "Pipeline|Merged result pipeline"
+msgstr ""
+
+msgid "Pipeline|Passed"
+msgstr ""
+
+msgid "Pipeline|Pending"
+msgstr ""
+
+msgid "Pipeline|Pipeline"
+msgstr ""
+
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
+msgid "Pipeline|Pipeline cannot be run."
+msgstr ""
+
+msgid "Pipeline|Pipelines"
+msgstr ""
+
+msgid "Pipeline|Raw text search is not currently supported. Please use the available search tokens."
+msgstr ""
+
+msgid "Pipeline|Run for branch name or tag"
+msgstr ""
+
+msgid "Pipeline|Run pipeline"
+msgstr ""
+
+msgid "Pipeline|Running"
+msgstr ""
+
+msgid "Pipeline|Skipped"
+msgstr ""
+
+msgid "Pipeline|Source"
+msgstr ""
+
+msgid "Pipeline|Source|Security Policy"
+msgstr ""
+
+msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
+msgstr ""
+
+msgid "Pipeline|Stages"
+msgstr ""
+
+msgid "Pipeline|Status"
+msgstr ""
+
+msgid "Pipeline|Stop pipeline"
+msgstr ""
+
+msgid "Pipeline|Stop pipeline #%{pipelineId}?"
+msgstr ""
+
+msgid "Pipeline|Tag name"
+msgstr ""
+
+msgid "Pipeline|Test coverage"
+msgstr ""
+
+msgid "Pipeline|This change will decrease the overall test coverage if merged."
+msgstr ""
+
+msgid "Pipeline|This change will increase the overall test coverage if merged."
+msgstr ""
+
+msgid "Pipeline|This change will not change the overall test coverage if merged."
+msgstr ""
+
+msgid "Pipeline|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
+msgstr ""
+
+msgid "Pipeline|This pipeline ran on the contents of this merge request's source branch, not the target branch."
+msgstr ""
+
+msgid "Pipeline|Trigger author"
+msgstr ""
+
+msgid "Pipeline|Triggerer"
+msgstr ""
+
+msgid "Pipeline|Variables"
+msgstr ""
+
+msgid "Pipeline|View commit"
+msgstr ""
+
+msgid "Pipeline|View pipeline"
+msgstr ""
+
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
+
+msgid "Pipeline|for"
+msgstr ""
+
+msgid "Pipeline|merge request"
+msgstr ""
+
+msgid "Pipeline|merge train"
+msgstr ""
+
+msgid "Pipeline|on"
+msgstr ""
+
+msgid "Pipeline|with stage"
+msgstr ""
+
+msgid "Pipeline|with stages"
+msgstr ""
+
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
+msgstr ""
+
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
+msgstr ""
+
+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 "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
+msgid "Plan"
+msgstr ""
+
+msgid "Plan:"
+msgstr ""
+
+msgid "Planning hierarchy"
+msgstr ""
+
+msgid "PlantUML"
+msgstr ""
+
+msgid "PlantUML URL"
+msgstr ""
+
+msgid "PlantUML diagram"
+msgstr ""
+
+msgid "Play"
+msgstr ""
+
+msgid "Play all manual"
+msgstr ""
+
+msgid "Please %{link_to_register} or %{link_to_sign_in} to comment"
+msgstr ""
+
+msgid "Please %{registerLinkStart}register%{registerLinkEnd} or %{signInLinkStart}sign in%{signInLinkEnd} to reply."
+msgstr ""
+
+msgid "Please %{registerLinkStart}register%{registerLinkEnd} or %{signInLinkStart}sign in%{signInLinkEnd} to start a new discussion."
+msgstr ""
+
+msgid "Please %{startTagRegister}register%{endRegisterTag} or %{startTagSignIn}sign in%{endSignInTag} to reply"
+msgstr ""
+
+msgid "Please accept the Terms of Service before continuing."
+msgstr ""
+
+msgid "Please add a comment in the text area above"
+msgstr ""
+
+msgid "Please check the configuration file for this chart"
+msgstr ""
+
+msgid "Please check the configuration file to ensure that a collection of charts has been declared."
+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 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 ""
+
+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 ""
+
+msgid "Please contact your administrator with any questions."
+msgstr ""
+
+msgid "Please contact your administrator."
+msgstr ""
+
+msgid "Please convert %{linkStart}them to Git%{linkEnd}, and go through the %{linkToImportFlow} again."
+msgstr ""
+
+msgid "Please copy, download, or print your recovery codes before proceeding."
+msgstr ""
+
+msgid "Please create a password for your new account."
+msgstr ""
+
+msgid "Please create a username with only alphanumeric characters."
+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 ""
+
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid URL format, ex: http://www.example.com/home"
+msgstr ""
+
+msgid "Please enter a valid hex (#RRGGBB or #RGB) color value"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
+msgid "Please enter a valid time interval"
+msgstr ""
+
+msgid "Please enter your current password."
+msgstr ""
+
+msgid "Please fill in a descriptive name for your group."
+msgstr ""
+
+msgid "Please fill in a name for your topic."
+msgstr ""
+
+msgid "Please fill in a title for your topic."
+msgstr ""
+
+msgid "Please fill out this field."
+msgstr ""
+
+msgid "Please follow the %{link_start}Let's Encrypt troubleshooting instructions%{link_end} to re-obtain your Let's Encrypt certificate."
+msgstr ""
+
+msgid "Please follow the Let's Encrypt troubleshooting instructions to re-obtain your Let's Encrypt certificate: %{docs_url}."
+msgstr ""
+
+msgid "Please migrate all existing projects to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please provide a name."
+msgstr ""
+
+msgid "Please provide a valid URL."
+msgstr ""
+
+msgid "Please provide a valid email address."
+msgstr ""
+
+msgid "Please provide attributes to update"
+msgstr ""
+
+msgid "Please reach out if you have any questions and we'll be happy to assist."
+msgstr ""
+
+msgid "Please review the updated escalation policies for %{project_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
+msgstr ""
+
+msgid "Please review the updated escalation policies for %{project}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
+msgstr ""
+
+msgid "Please select"
+msgstr ""
+
+msgid "Please select a Jira project"
+msgstr ""
+
+msgid "Please select a country"
+msgstr ""
+
+msgid "Please select a file"
+msgstr ""
+
+msgid "Please select a group"
+msgstr ""
+
+msgid "Please select a valid target branch"
+msgstr ""
+
+msgid "Please select a valid target branch."
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
+msgid "Please select at least one filter to see results"
+msgstr ""
+
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
+msgid "Please select..."
+msgstr ""
+
+msgid "Please set a new password before proceeding."
+msgstr ""
+
+msgid "Please solve the captcha"
+msgstr ""
+
+msgid "Please try again"
+msgstr ""
+
+msgid "Please try and refresh the page. If the problem persists please contact support."
+msgstr ""
+
+msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgstr ""
+
+msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
+msgstr ""
+
+msgid "Please wait a moment, this page will automatically refresh when ready."
+msgstr ""
+
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
+msgid "Please wait while we import the repository for you. Refresh at will."
+msgstr ""
+
+msgid "Pods in use"
+msgstr ""
+
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
+msgstr ""
+
+msgid "Policies"
+msgstr ""
+
+msgid "Policy '%{escalation_policy_name}' does not exist."
+msgstr ""
+
+msgid "Policy management project does not have any policies in %{policy_path}"
+msgstr ""
+
+msgid "Policy project doesn't exist"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|%{firstLabel} +%{numberOfAdditionalLabels} more"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|All %{itemTypeName}"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|Select %{itemTypeName}"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|Select all"
+msgstr ""
+
+msgid "Polling interval multiplier"
+msgstr ""
+
+msgid "Popularity"
+msgstr ""
+
+msgid "Port"
+msgstr ""
+
+msgid "Postman collection"
+msgstr ""
+
+msgid "Postman collection file path or URL"
+msgstr ""
+
+msgid "Potentially unwanted character detected: Unicode BiDi Control"
+msgstr ""
+
+msgid "Pre-defined push rules"
+msgstr ""
+
+msgid "Preferences"
+msgstr ""
+
+msgid "Preferences saved."
+msgstr ""
+
+msgid "Preferences|Behavior"
+msgstr ""
+
+msgid "Preferences|Choose between fixed (max. 1280px) and fluid (%{percentage}) application layout."
+msgstr ""
+
+msgid "Preferences|Choose what content you want to see on a project’s overview page."
+msgstr ""
+
+msgid "Preferences|Choose what content you want to see on your homepage."
+msgstr ""
+
+msgid "Preferences|Color for added lines"
+msgstr ""
+
+msgid "Preferences|Color for removed lines"
+msgstr ""
+
+msgid "Preferences|Color theme"
+msgstr ""
+
+msgid "Preferences|Configure how dates and times display for you."
+msgstr ""
+
+msgid "Preferences|Customize integrations with third party services."
+msgstr ""
+
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
+
+msgid "Preferences|Customize the colors of removed and added lines in diffs."
+msgstr ""
+
+msgid "Preferences|Diff colors"
+msgstr ""
+
+msgid "Preferences|Display time in 24-hour format"
+msgstr ""
+
+msgid "Preferences|Enable Gitpod integration"
+msgstr ""
+
+msgid "Preferences|Enable integrated code intelligence on code views"
+msgstr ""
+
+msgid "Preferences|Failed to save preferences."
+msgstr ""
+
+msgid "Preferences|For example: 30 minutes ago."
+msgstr ""
+
+msgid "Preferences|Gitpod"
+msgstr ""
+
+msgid "Preferences|Homepage content"
+msgstr ""
+
+msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
+msgstr ""
+
+msgid "Preferences|Integrations"
+msgstr ""
+
+msgid "Preferences|Layout width"
+msgstr ""
+
+msgid "Preferences|Must be a number between %{min} and %{max}"
+msgstr ""
+
+msgid "Preferences|Preview"
+msgstr ""
+
+msgid "Preferences|Project overview content"
+msgstr ""
+
+msgid "Preferences|Render whitespace characters in the Web IDE"
+msgstr ""
+
+msgid "Preferences|Show one file at a time on merge request's Changes tab"
+msgstr ""
+
+msgid "Preferences|Show whitespace changes in diffs"
+msgstr ""
+
+msgid "Preferences|Sourcegraph"
+msgstr ""
+
+msgid "Preferences|Surround text selection when typing quotes or brackets"
+msgstr ""
+
+msgid "Preferences|Syntax highlighting theme"
+msgstr ""
+
+msgid "Preferences|Tab width"
+msgstr ""
+
+msgid "Preferences|This feature is experimental and translations are not yet complete."
+msgstr ""
+
+msgid "Preferences|This setting allows you to customize the appearance of the syntax."
+msgstr ""
+
+msgid "Preferences|This setting allows you to customize the behavior of the system layout and default views."
+msgstr ""
+
+msgid "Preferences|Time preferences"
+msgstr ""
+
+msgid "Preferences|Use relative times"
+msgstr ""
+
+msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
+msgstr ""
+
+msgid "Preparing the report for the scan."
+msgstr ""
+
+msgid "Prev"
+msgstr ""
+
+msgid "Prevent auto-stopping"
+msgstr ""
+
+msgid "Prevent editing approval rules in projects and merge requests."
+msgstr ""
+
+msgid "Prevent environment from auto-stopping"
+msgstr ""
+
+msgid "Prevent project forking outside current group"
+msgstr ""
+
+msgid "Prevent users from changing their profile name"
+msgstr ""
+
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
+msgstr ""
+
+msgid "Preview"
+msgstr ""
+
+msgid "Preview JavaScript projects in the Web IDE with CodeSandbox Live Preview. %{link_start}Learn more.%{link_end} "
+msgstr ""
+
+msgid "Preview Markdown"
+msgstr ""
+
+msgid "Preview changes"
+msgstr ""
+
+msgid "Preview diagram"
+msgstr ""
+
+msgid "Preview payload"
+msgstr ""
+
+msgid "Previous Artifacts"
+msgstr ""
+
+msgid "Previous commit"
+msgstr ""
+
+msgid "Previous design"
+msgstr ""
+
+msgid "Previous file in diff"
+msgstr ""
+
+msgid "Previous unresolved discussion"
+msgstr ""
+
+msgid "Primary Action"
+msgstr ""
+
+msgid "Print codes"
+msgstr ""
+
+msgid "Prioritize"
+msgstr ""
+
+msgid "Prioritize label"
+msgstr ""
+
+msgid "Prioritized Labels"
+msgstr ""
+
+msgid "Prioritized label"
+msgstr ""
+
+msgid "Priority"
+msgstr ""
+
+msgid "Private"
+msgstr ""
+
+msgid "Private - Guest users are not allowed to view detailed release information like title and source code."
+msgstr ""
+
+msgid "Private - Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
+msgid "Private group(s)"
+msgstr ""
+
+msgid "Private profile"
+msgstr ""
+
+msgid "Private projects Minutes cost factor"
+msgstr ""
+
+msgid "Private projects can be created in your personal namespace with:"
+msgstr ""
+
+msgid "Problem with %{name} command: %{message}."
+msgstr ""
+
+msgid "Proceed"
+msgstr ""
+
+msgid "Product Analytics"
+msgstr ""
+
+msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
+msgstr ""
+
+msgid "Productivity"
+msgstr ""
+
+msgid "Productivity Analytics"
+msgstr ""
+
+msgid "Productivity analytics can help identify the problems that are delaying your team"
+msgstr ""
+
+msgid "ProductivityAanalytics|Merge requests"
+msgstr ""
+
+msgid "ProductivityAanalytics|is earlier than the allowed minimum date"
+msgstr ""
+
+msgid "ProductivityAnalytics|Ascending"
+msgstr ""
+
+msgid "ProductivityAnalytics|Days"
+msgstr ""
+
+msgid "ProductivityAnalytics|Days to merge"
+msgstr ""
+
+msgid "ProductivityAnalytics|Descending"
+msgstr ""
+
+msgid "ProductivityAnalytics|Hours"
+msgstr ""
+
+msgid "ProductivityAnalytics|List"
+msgstr ""
+
+msgid "ProductivityAnalytics|Merge Requests"
+msgstr ""
+
+msgid "ProductivityAnalytics|Merge date"
+msgstr ""
+
+msgid "ProductivityAnalytics|Merge requests"
+msgstr ""
+
+msgid "ProductivityAnalytics|Time to merge"
+msgstr ""
+
+msgid "ProductivityAnalytics|Trendline"
+msgstr ""
+
+msgid "ProductivityAnalytics|is earlier than the given merged at after date"
+msgstr ""
+
+msgid "Profile"
+msgstr ""
+
+msgid "Profile Settings"
+msgstr ""
+
+msgid "Profile failed to delete"
+msgstr ""
+
+msgid "Profile image guideline"
+msgstr ""
+
+msgid "Profile page:"
+msgstr ""
+
+msgid "Profile parameter missing"
+msgstr ""
+
+msgid "ProfileSession|on"
+msgstr ""
+
+msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
+msgstr ""
+
+msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
+msgstr ""
+
+msgid "Profiles|%{provider} Active"
+msgstr ""
+
+msgid "Profiles|@username"
+msgstr ""
+
+msgid "Profiles|Account could not be deleted. GitLab was unable to verify your identity."
+msgstr ""
+
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Active"
+msgstr ""
+
+msgid "Profiles|Add key"
+msgstr ""
+
+msgid "Profiles|Add status emoji"
+msgstr ""
+
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
+msgid "Profiles|An indicator appears next to your name and avatar."
+msgstr ""
+
+msgid "Profiles|Avatar cropper"
+msgstr ""
+
+msgid "Profiles|Avatar will be removed. Are you sure?"
+msgstr ""
+
+msgid "Profiles|Begins with %{ssh_key_algorithms}."
+msgstr ""
+
+msgid "Profiles|Bio"
+msgstr ""
+
+msgid "Profiles|Busy"
+msgstr ""
+
+msgid "Profiles|Change username"
+msgstr ""
+
+msgid "Profiles|Changing your username can have unintended side effects."
+msgstr ""
+
+msgid "Profiles|Choose file..."
+msgstr ""
+
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr ""
+
+msgid "Profiles|City, country"
+msgstr ""
+
+msgid "Profiles|Clear status"
+msgstr ""
+
+msgid "Profiles|Commit email"
+msgstr ""
+
+msgid "Profiles|Connect %{provider}"
+msgstr ""
+
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
+msgid "Profiles|Connected Accounts"
+msgstr ""
+
+msgid "Profiles|Current path: %{path}"
+msgstr ""
+
+msgid "Profiles|Current status"
+msgstr ""
+
+msgid "Profiles|Default notification email"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Disconnect"
+msgstr ""
+
+msgid "Profiles|Disconnect %{provider}"
+msgstr ""
+
+msgid "Profiles|Do not show on profile"
+msgstr ""
+
+msgid "Profiles|Don't display activity-related personal information on your profile."
+msgstr ""
+
+msgid "Profiles|Edit Profile"
+msgstr ""
+
+msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
+msgstr ""
+
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
+msgstr ""
+
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr ""
+
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
+msgstr ""
+
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
+msgid "Profiles|Expiration date"
+msgstr ""
+
+msgid "Profiles|Expired:"
+msgstr ""
+
+msgid "Profiles|Expires:"
+msgstr ""
+
+msgid "Profiles|Feed token was successfully reset"
+msgstr ""
+
+msgid "Profiles|Full name"
+msgstr ""
+
+msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
+msgstr ""
+
+msgid "Profiles|If after setting a password, the option to delete your account is still not available, please %{link_start}submit a request%{link_end} to begin the account deletion process."
+msgstr ""
+
+msgid "Profiles|Include private contributions on my profile"
+msgstr ""
+
+msgid "Profiles|Incoming email token was successfully reset"
+msgstr ""
+
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Job title"
+msgstr ""
+
+msgid "Profiles|Key"
+msgstr ""
+
+msgid "Profiles|Key becomes invalid on this date."
+msgstr ""
+
+msgid "Profiles|Key becomes invalid on this date. Maximum lifetime for SSH keys is %{max_ssh_key_lifetime} days"
+msgstr ""
+
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
+msgid "Profiles|Last used:"
+msgstr ""
+
+msgid "Profiles|Learn more"
+msgstr ""
+
+msgid "Profiles|Location"
+msgstr ""
+
+msgid "Profiles|Made a private contribution"
+msgstr ""
+
+msgid "Profiles|Main settings"
+msgstr ""
+
+msgid "Profiles|Manage two-factor authentication"
+msgstr ""
+
+msgid "Profiles|No file chosen."
+msgstr ""
+
+msgid "Profiles|Notification email"
+msgstr ""
+
+msgid "Profiles|Organization"
+msgstr ""
+
+msgid "Profiles|Path"
+msgstr ""
+
+msgid "Profiles|Position and size your new avatar"
+msgstr ""
+
+msgid "Profiles|Primary email"
+msgstr ""
+
+msgid "Profiles|Private contributions"
+msgstr ""
+
+msgid "Profiles|Profile was successfully updated"
+msgstr ""
+
+msgid "Profiles|Pronouns"
+msgstr ""
+
+msgid "Profiles|Pronunciation"
+msgstr ""
+
+msgid "Profiles|Public avatar"
+msgstr ""
+
+msgid "Profiles|Public email"
+msgstr ""
+
+msgid "Profiles|Publicly visible private SSH keys can compromise your system."
+msgstr ""
+
+msgid "Profiles|Remove avatar"
+msgstr ""
+
+msgid "Profiles|Select a service to sign in with."
+msgstr ""
+
+msgid "Profiles|Service sign-in"
+msgstr ""
+
+msgid "Profiles|Set new profile picture"
+msgstr ""
+
+msgid "Profiles|Set your local time zone."
+msgstr ""
+
+msgid "Profiles|Some options are unavailable for LDAP accounts"
+msgstr ""
+
+msgid "Profiles|Static object token was successfully reset"
+msgstr ""
+
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr ""
+
+msgid "Profiles|The ability to update your name has been disabled by your administrator."
+msgstr ""
+
+msgid "Profiles|The maximum file size allowed is 200KB."
+msgstr ""
+
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
+
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr ""
+
+msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
+msgstr ""
+
+msgid "Profiles|This information will appear on your profile."
+msgstr ""
+
+msgid "Profiles|Time settings"
+msgstr ""
+
+msgid "Profiles|Title"
+msgstr ""
+
+msgid "Profiles|Two-factor authentication"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|Update profile settings"
+msgstr ""
+
+msgid "Profiles|Update username"
+msgstr ""
+
+msgid "Profiles|Upload new avatar"
+msgstr ""
+
+msgid "Profiles|Use a private email - %{email}"
+msgstr ""
+
+msgid "Profiles|User ID"
+msgstr ""
+
+msgid "Profiles|Username change failed - %{message}"
+msgstr ""
+
+msgid "Profiles|Username successfully changed"
+msgstr ""
+
+msgid "Profiles|Using emojis in names seems fun, but please try to set a status message instead"
+msgstr ""
+
+msgid "Profiles|Website url"
+msgstr ""
+
+msgid "Profiles|What's your status?"
+msgstr ""
+
+msgid "Profiles|Who you represent or work for."
+msgstr ""
+
+msgid "Profiles|You can change your avatar here"
+msgstr ""
+
+msgid "Profiles|You can change your avatar here or remove the current avatar to revert to %{gravatar_link}"
+msgstr ""
+
+msgid "Profiles|You can upload your avatar here"
+msgstr ""
+
+msgid "Profiles|You can upload your avatar here or change it at %{gravatar_link}"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must accept the Terms of Service in order to perform this action."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete groups you are an owner of before you can delete your account"
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your LinkedIn profile name from linkedin.com/in/profilename"
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|Your email address was automatically set based on your %{provider_label} account"
+msgstr ""
+
+msgid "Profiles|Your location was automatically set based on your %{provider_label} account"
+msgstr ""
+
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
+msgstr ""
+
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
+msgid "Profiles|Your status"
+msgstr ""
+
+msgid "Profiles|https://website.com"
+msgstr ""
+
+msgid "Profiles|username"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Profile|%{job_title} at %{organization}"
+msgstr ""
+
+msgid "Profiling - Performance bar"
+msgstr ""
+
+msgid "Programming languages used in this repository"
+msgstr ""
+
+msgid "Progress"
+msgstr ""
+
+msgid "Progress tracking"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
+msgid "Project %{project_repo} could not be found"
+msgstr ""
+
+msgid "Project & Group can not be assigned at the same time"
+msgstr ""
+
+msgid "Project '%{project_name}' is being imported."
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
+msgid "Project '%{project_name}' is restored."
+msgstr ""
+
+msgid "Project '%{project_name}' queued for deletion."
+msgstr ""
+
+msgid "Project '%{project_name}' was successfully created."
+msgstr ""
+
+msgid "Project '%{project_name}' was successfully updated."
+msgstr ""
+
+msgid "Project '%{project_name}' will be deleted on %{date}"
+msgstr ""
+
+msgid "Project Access Tokens"
+msgstr ""
+
+msgid "Project Badges"
+msgstr ""
+
+msgid "Project Files"
+msgstr ""
+
+msgid "Project ID"
+msgstr ""
+
+msgid "Project Templates"
+msgstr ""
+
+msgid "Project URL"
+msgstr ""
+
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr ""
+
+msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Project already deleted"
+msgstr ""
+
+msgid "Project and wiki repositories"
+msgstr ""
+
+msgid "Project audit events"
+msgstr ""
+
+msgid "Project avatar"
+msgstr ""
+
+msgid "Project cannot be shared with the group it is in or one of its ancestors."
+msgstr ""
+
+msgid "Project configuration, excluding integrations"
+msgstr ""
+
+msgid "Project description (optional)"
+msgstr ""
+
+msgid "Project does not exist or you don't have permission to perform this action"
+msgstr ""
+
+msgid "Project does not have a policy configuration"
+msgstr ""
+
+msgid "Project export could not be deleted."
+msgstr ""
+
+msgid "Project export download requests"
+msgstr ""
+
+msgid "Project export has been deleted."
+msgstr ""
+
+msgid "Project export link has expired. Please generate a new export from your project settings."
+msgstr ""
+
+msgid "Project export requests"
+msgstr ""
+
+msgid "Project export started. A download link will be sent by email and made available on this page."
+msgstr ""
+
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
+msgid "Project import requests"
+msgstr ""
+
+msgid "Project info:"
+msgstr ""
+
+msgid "Project information"
+msgstr ""
+
+msgid "Project is required when cluster_type is :project"
+msgstr ""
+
+msgid "Project members"
+msgstr ""
+
+msgid "Project milestone"
+msgstr ""
+
+msgid "Project name"
+msgstr ""
+
+msgid "Project navigation"
+msgstr ""
+
+msgid "Project order will not be saved as local storage is not available."
+msgstr ""
+
+msgid "Project path"
+msgstr ""
+
+msgid "Project security status"
+msgstr ""
+
+msgid "Project security status help page"
+msgstr ""
+
+msgid "Project slug"
+msgstr ""
+
+msgid "Project uploads"
+msgstr ""
+
+msgid "Project visibility level will be changed to match namespace rules when transferring to a group."
+msgstr ""
+
+msgid "Project was not found or you do not have permission to add this project to Security Dashboards."
+msgstr ""
+
+msgid "Project: %{name}"
+msgstr ""
+
+msgid "ProjectActivityRSS|Subscribe"
+msgstr ""
+
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
+msgid "ProjectFileTree|Name"
+msgstr ""
+
+msgid "ProjectFileTree|Show more"
+msgstr ""
+
+msgid "ProjectLastActivity|Never"
+msgstr ""
+
+msgid "ProjectOverview|Fork"
+msgstr ""
+
+msgid "ProjectOverview|Forks"
+msgstr ""
+
+msgid "ProjectOverview|Go to your fork"
+msgstr ""
+
+msgid "ProjectOverview|Star"
+msgstr ""
+
+msgid "ProjectOverview|Starrer"
+msgstr ""
+
+msgid "ProjectOverview|Starrers"
+msgstr ""
+
+msgid "ProjectOverview|Unstar"
+msgstr ""
+
+msgid "ProjectOverview|You don't have permission to fork this project"
+msgstr ""
+
+msgid "ProjectOverview|You have reached your project limit"
+msgstr ""
+
+msgid "ProjectOverview|You must sign in to star a project"
+msgstr ""
+
+msgid "ProjectPage|Copy project ID"
+msgstr ""
+
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectQualitySummary|An error occurred while trying to fetch project quality statistics"
+msgstr ""
+
+msgid "ProjectQualitySummary|Coverage"
+msgstr ""
+
+msgid "ProjectQualitySummary|Failure"
+msgstr ""
+
+msgid "ProjectQualitySummary|Get insight into the overall percentage of tests in your project that succeed, fail and are skipped."
+msgstr ""
+
+msgid "ProjectQualitySummary|Latest pipeline results"
+msgstr ""
+
+msgid "ProjectQualitySummary|Learn more about test coverage"
+msgstr ""
+
+msgid "ProjectQualitySummary|Learn more about test reports"
+msgstr ""
+
+msgid "ProjectQualitySummary|Measure of how much of your code is covered by tests."
+msgstr ""
+
+msgid "ProjectQualitySummary|See full report"
+msgstr ""
+
+msgid "ProjectQualitySummary|See project Code Coverage Statistics"
+msgstr ""
+
+msgid "ProjectQualitySummary|Set up test runs"
+msgstr ""
+
+msgid "ProjectQualitySummary|Set up test runs (opens in a new tab)"
+msgstr ""
+
+msgid "ProjectQualitySummary|Skipped"
+msgstr ""
+
+msgid "ProjectQualitySummary|Success"
+msgstr ""
+
+msgid "ProjectQualitySummary|Test coverage"
+msgstr ""
+
+msgid "ProjectQualitySummary|Test runs"
+msgstr ""
+
+msgid "ProjectQualitySummary|The percentage of tests that succeed, fail, or are skipped."
+msgstr ""
+
+msgid "ProjectSelect| or group"
+msgstr ""
+
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
+msgid "ProjectSelect|Search for project"
+msgstr ""
+
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
+msgid "ProjectService|Drone server URL"
+msgstr ""
+
+msgid "ProjectService|Enter new API key"
+msgstr ""
+
+msgid "ProjectService|Enter new password"
+msgstr ""
+
+msgid "ProjectService|Enter new password."
+msgstr ""
+
+msgid "ProjectService|Enter new token"
+msgstr ""
+
+msgid "ProjectService|Jenkins server URL"
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current API key"
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current API key."
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current password"
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current password."
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current token."
+msgstr ""
+
+msgid "ProjectService|Mock service URL"
+msgstr ""
+
+msgid "ProjectService|Must have permission to trigger a manual build in TeamCity."
+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 ""
+
+msgid "ProjectService|Run CI/CD pipelines with JetBrains TeamCity."
+msgstr ""
+
+msgid "ProjectService|TeamCity server URL"
+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 ""
+
+msgid "ProjectService|Token for the Drone project."
+msgstr ""
+
+msgid "ProjectService|Trigger event for new comments on confidential issues."
+msgstr ""
+
+msgid "ProjectService|Trigger event for new comments."
+msgstr ""
+
+msgid "ProjectService|Trigger event for new tags pushed to the repository."
+msgstr ""
+
+msgid "ProjectService|Trigger event for pushes to the repository."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a commit is created or updated."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a confidential issue is created, updated, or closed."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a deployment starts or finishes."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a merge request is created, updated, or merged."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a new, unique alert is recorded."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
+msgid "ProjectService|Trigger event when a pipeline status changes."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a wiki page is created or updated."
+msgstr ""
+
+msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
+msgstr ""
+
+msgid "ProjectSettings|%{link_start}What are description templates?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|%{link_start}What variables can I use?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|Additional options"
+msgstr ""
+
+msgid "ProjectSettings|Additional settings that influence how and when merges are done."
+msgstr ""
+
+msgid "ProjectSettings|All threads must be resolved"
+msgstr ""
+
+msgid "ProjectSettings|Allow"
+msgstr ""
+
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
+msgstr ""
+
+msgid "ProjectSettings|Analytics"
+msgstr ""
+
+msgid "ProjectSettings|Automatically resolve merge request diff threads when they become outdated"
+msgstr ""
+
+msgid "ProjectSettings|Badges"
+msgstr ""
+
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
+
+msgid "ProjectSettings|Checkbox is visible and selected by default."
+msgstr ""
+
+msgid "ProjectSettings|Checkbox is visible and unselected by default."
+msgstr ""
+
+msgid "ProjectSettings|Choose the method, options, checks, and squash options for merge requests. You can also set up merge request templates for different actions."
+msgstr ""
+
+msgid "ProjectSettings|Choose your merge method, merge options, merge checks, and merge suggestions."
+msgstr ""
+
+msgid "ProjectSettings|Choose your merge method, options, checks, and squash options."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Container registry"
+msgstr ""
+
+msgid "ProjectSettings|Customize this project's badges."
+msgstr ""
+
+msgid "ProjectSettings|Determine what happens to the commit history when you merge a merge request."
+msgstr ""
+
+msgid "ProjectSettings|Disable email notifications"
+msgstr ""
+
+msgid "ProjectSettings|Do not allow"
+msgstr ""
+
+msgid "ProjectSettings|Enable \"Delete source branch\" option by default"
+msgstr ""
+
+msgid "ProjectSettings|Enable merge trains"
+msgstr ""
+
+msgid "ProjectSettings|Enable merged results pipelines"
+msgstr ""
+
+msgid "ProjectSettings|Encourage"
+msgstr ""
+
+msgid "ProjectSettings|Every merge creates a merge commit."
+msgstr ""
+
+msgid "ProjectSettings|Every project can have its own space to store its Docker images"
+msgstr ""
+
+msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgstr ""
+
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
+msgstr ""
+
+msgid "ProjectSettings|Everyone"
+msgstr ""
+
+msgid "ProjectSettings|Existing merge requests and protected branches are not affected."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Fast-forward merge"
+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 ""
+
+msgid "ProjectSettings|Git Large File Storage (LFS)"
+msgstr ""
+
+msgid "ProjectSettings|Global"
+msgstr ""
+
+msgid "ProjectSettings|Highlight the usage of hidden unicode characters. These have innocent uses for right-to-left languages, but can also be used in potential exploits."
+msgstr ""
+
+msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and delete."
+msgstr ""
+
+msgid "ProjectSettings|How do they differ?"
+msgstr ""
+
+msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
+msgstr ""
+
+msgid "ProjectSettings|Internal"
+msgstr ""
+
+msgid "ProjectSettings|Introduces the risk of merging changes that do not pass the pipeline."
+msgstr ""
+
+msgid "ProjectSettings|Issues"
+msgstr ""
+
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgstr ""
+
+msgid "ProjectSettings|Leave empty to use default template."
+msgstr ""
+
+msgid "ProjectSettings|Manage who can see the project in the public access directory."
+msgstr ""
+
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
+
+msgid "ProjectSettings|Maximum %{maxLength} characters."
+msgstr ""
+
+msgid "ProjectSettings|Merge checks"
+msgstr ""
+
+msgid "ProjectSettings|Merge commit"
+msgstr ""
+
+msgid "ProjectSettings|Merge commit message template"
+msgstr ""
+
+msgid "ProjectSettings|Merge commit with semi-linear history"
+msgstr ""
+
+msgid "ProjectSettings|Merge method"
+msgstr ""
+
+msgid "ProjectSettings|Merge options"
+msgstr ""
+
+msgid "ProjectSettings|Merge requests"
+msgstr ""
+
+msgid "ProjectSettings|Merge requests approved for merge are queued, and pipelines validate the combined results of the source and target branches before merge. %{link_start}What are merge trains?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|Merge requests can't be merged if the latest pipeline did not succeed or is still running."
+msgstr ""
+
+msgid "ProjectSettings|Merge suggestions"
+msgstr ""
+
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
+msgid "ProjectSettings|No merge commits are created."
+msgstr ""
+
+msgid "ProjectSettings|Note: The container registry is always visible when a project is public and the container registry is set to '%{access_level_description}'"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|Operations"
+msgstr ""
+
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
+msgid "ProjectSettings|Package registry"
+msgstr ""
+
+msgid "ProjectSettings|Packages"
+msgstr ""
+
+msgid "ProjectSettings|Pages"
+msgstr ""
+
+msgid "ProjectSettings|Pages for project documentation."
+msgstr ""
+
+msgid "ProjectSettings|Pipelines must succeed"
+msgstr ""
+
+msgid "ProjectSettings|Prevents direct linking to potentially sensitive media files"
+msgstr ""
+
+msgid "ProjectSettings|Private"
+msgstr ""
+
+msgid "ProjectSettings|Project visibility"
+msgstr ""
+
+msgid "ProjectSettings|Public"
+msgstr ""
+
+msgid "ProjectSettings|Repository"
+msgstr ""
+
+msgid "ProjectSettings|Require"
+msgstr ""
+
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
+msgid "ProjectSettings|Require authentication to view media files"
+msgstr ""
+
+msgid "ProjectSettings|Requirements"
+msgstr ""
+
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Search for topic"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
+msgstr ""
+
+msgid "ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests."
+msgstr ""
+
+msgid "ProjectSettings|Share code with others outside the project."
+msgstr ""
+
+msgid "ProjectSettings|Show default award emojis"
+msgstr ""
+
+msgid "ProjectSettings|Show link to create or view a merge request when pushing from the command line"
+msgstr ""
+
+msgid "ProjectSettings|Skipped pipelines are considered successful"
+msgstr ""
+
+msgid "ProjectSettings|Snippets"
+msgstr ""
+
+msgid "ProjectSettings|Squash commit message template"
+msgstr ""
+
+msgid "ProjectSettings|Squash commits when merging"
+msgstr ""
+
+msgid "ProjectSettings|Squashing is always performed. Checkbox is visible and selected, and users cannot change it."
+msgstr ""
+
+msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
+msgstr ""
+
+msgid "ProjectSettings|Submit changes to be merged upstream."
+msgstr ""
+
+msgid "ProjectSettings|Target project"
+msgstr ""
+
+msgid "ProjectSettings|The commit message used when applying merge request suggestions."
+msgstr ""
+
+msgid "ProjectSettings|The commit message used when merging, if the merge method creates a merge commit."
+msgstr ""
+
+msgid "ProjectSettings|The commit message used when squashing commits."
+msgstr ""
+
+msgid "ProjectSettings|The default target project for merge requests created in this fork project."
+msgstr ""
+
+msgid "ProjectSettings|The default template will be applied on save."
+msgstr ""
+
+msgid "ProjectSettings|These checks must pass before merge requests can be merged."
+msgstr ""
+
+msgid "ProjectSettings|This project"
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Transfer project"
+msgstr ""
+
+msgid "ProjectSettings|Upstream project"
+msgstr ""
+
+msgid "ProjectSettings|Used for every new merge request."
+msgstr ""
+
+msgid "ProjectSettings|Users can copy the repository to a new project."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgstr ""
+
+msgid "ProjectSettings|Users can request access"
+msgstr ""
+
+msgid "ProjectSettings|View and edit files in this project."
+msgstr ""
+
+msgid "ProjectSettings|View and edit files in this project. Non-project members have only read access."
+msgstr ""
+
+msgid "ProjectSettings|View project analytics."
+msgstr ""
+
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgstr ""
+
+msgid "ProjectSettings|Visualize the project's performance metrics."
+msgstr ""
+
+msgid "ProjectSettings|Warn about Potentially Unwanted Characters"
+msgstr ""
+
+msgid "ProjectSettings|What are badges?"
+msgstr ""
+
+msgid "ProjectSettings|What are merge trains?"
+msgstr ""
+
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
+msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
+msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
+msgstr ""
+
+msgid "ProjectSettings|Wiki"
+msgstr ""
+
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
+msgstr ""
+
+msgid "ProjectTemplates|.NET Core"
+msgstr ""
+
+msgid "ProjectTemplates|Android"
+msgstr ""
+
+msgid "ProjectTemplates|GitLab Cluster Management"
+msgstr ""
+
+msgid "ProjectTemplates|Gitpod/Spring Petclinic"
+msgstr ""
+
+msgid "ProjectTemplates|Go Micro"
+msgstr ""
+
+msgid "ProjectTemplates|HIPAA Audit Protocol"
+msgstr ""
+
+msgid "ProjectTemplates|Jsonnet for Dynamic Child Pipelines"
+msgstr ""
+
+msgid "ProjectTemplates|Kotlin Native for Linux"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/GitBook"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Hexo"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Hugo"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Jekyll"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Plain HTML"
+msgstr ""
+
+msgid "ProjectTemplates|NodeJS Express"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Gatsby"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/GitBook"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Hexo"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Hugo"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Jekyll"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Pelican"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Plain HTML"
+msgstr ""
+
+msgid "ProjectTemplates|Ruby on Rails"
+msgstr ""
+
+msgid "ProjectTemplates|SalesforceDX"
+msgstr ""
+
+msgid "ProjectTemplates|Sample GitLab Project"
+msgstr ""
+
+msgid "ProjectTemplates|Serverless Framework/JS"
+msgstr ""
+
+msgid "ProjectTemplates|Spring"
+msgstr ""
+
+msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
+msgstr ""
+
+msgid "ProjectTemplates|iOS (Swift)"
+msgstr ""
+
+msgid "ProjectView|Activity"
+msgstr ""
+
+msgid "ProjectView|Files and Readme (default)"
+msgstr ""
+
+msgid "ProjectView|Readme"
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
+msgid "Projects (%{count})"
+msgstr ""
+
+msgid "Projects API"
+msgstr ""
+
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
+msgid "Projects are graded based on the highest severity vulnerability present"
+msgstr ""
+
+msgid "Projects are organized into groups"
+msgstr ""
+
+msgid "Projects are where you store your code, access issues, wiki and other features of GitLab."
+msgstr ""
+
+msgid "Projects contributed to"
+msgstr ""
+
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
+msgid "Projects that can be accessed"
+msgstr ""
+
+msgid "Projects to index"
+msgstr ""
+
+msgid "Projects with critical vulnerabilities"
+msgstr ""
+
+msgid "Projects with high or unknown vulnerabilities"
+msgstr ""
+
+msgid "Projects with low vulnerabilities"
+msgstr ""
+
+msgid "Projects with medium vulnerabilities"
+msgstr ""
+
+msgid "Projects with no vulnerabilities and security scanning enabled"
+msgstr ""
+
+msgid "Projects with this topic"
+msgstr ""
+
+msgid "Projects with write access"
+msgstr ""
+
+msgid "ProjectsDropdown|Frequently visited"
+msgstr ""
+
+msgid "ProjectsDropdown|Loading projects"
+msgstr ""
+
+msgid "ProjectsDropdown|Projects you visit often will appear here"
+msgstr ""
+
+msgid "ProjectsDropdown|Search your projects"
+msgstr ""
+
+msgid "ProjectsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "ProjectsDropdown|Sorry, no projects matched your search"
+msgstr ""
+
+msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
+msgid "ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository."
+msgstr ""
+
+msgid "ProjectsNew|Analyze your source code for known security vulnerabilities."
+msgstr ""
+
+msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
+msgstr ""
+
+msgid "ProjectsNew|Contact an administrator to enable options for importing your project."
+msgstr ""
+
+msgid "ProjectsNew|Create"
+msgstr ""
+
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
+msgstr ""
+
+msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
+msgstr ""
+
+msgid "ProjectsNew|Create blank project"
+msgstr ""
+
+msgid "ProjectsNew|Create from template"
+msgstr ""
+
+msgid "ProjectsNew|Create new project"
+msgstr ""
+
+msgid "ProjectsNew|Description format"
+msgstr ""
+
+msgid "ProjectsNew|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ProjectsNew|Import"
+msgstr ""
+
+msgid "ProjectsNew|Import project"
+msgstr ""
+
+msgid "ProjectsNew|Include a Getting Started README"
+msgstr ""
+
+msgid "ProjectsNew|Initialize repository with a README"
+msgstr ""
+
+msgid "ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
+msgstr ""
+
+msgid "ProjectsNew|No import options available"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
+msgid "ProjectsNew|Project Configuration"
+msgstr ""
+
+msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
+msgstr ""
+
+msgid "ProjectsNew|Recommended if you're new to GitLab"
+msgstr ""
+
+msgid "ProjectsNew|Run CI/CD for external repository"
+msgstr ""
+
+msgid "ProjectsNew|Visibility Level"
+msgstr ""
+
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
+
+msgid "PrometheusAlerts|exceeded"
+msgstr ""
+
+msgid "PrometheusAlerts|is equal to"
+msgstr ""
+
+msgid "PrometheusAlerts|is less than"
+msgstr ""
+
+msgid "PrometheusService|%{exporters} with %{metrics} were found"
+msgstr ""
+
+msgid "PrometheusService|Active"
+msgstr ""
+
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+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 ""
+
+msgid "PrometheusService|Custom metrics require Prometheus installed on a cluster with environment scope \"*\" OR a manually configured Prometheus to be available."
+msgstr ""
+
+msgid "PrometheusService|Enable Prometheus to define custom metrics, using either option above"
+msgstr ""
+
+msgid "PrometheusService|Finding and configuring metrics..."
+msgstr ""
+
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
+msgid "PrometheusService|Manage clusters"
+msgstr ""
+
+msgid "PrometheusService|Manual configuration"
+msgstr ""
+
+msgid "PrometheusService|Metrics"
+msgstr ""
+
+msgid "PrometheusService|Missing environment variable"
+msgstr ""
+
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|More information"
+msgstr ""
+
+msgid "PrometheusService|New metric"
+msgstr ""
+
+msgid "PrometheusService|No %{docsUrlStart}common metrics%{docsUrlEnd} were found"
+msgstr ""
+
+msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
+msgstr ""
+
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
+
+msgid "PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
+
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
+msgstr ""
+
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
+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"
+msgstr ""
+
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
+msgid "Promote"
+msgstr ""
+
+msgid "Promote issue to an epic"
+msgstr ""
+
+msgid "Promote issue to incident"
+msgstr ""
+
+msgid "Promote to epic"
+msgstr ""
+
+msgid "Promote to group label"
+msgstr ""
+
+msgid "PromoteMilestone|Only project milestones can be promoted."
+msgstr ""
+
+msgid "PromoteMilestone|Project does not belong to a group."
+msgstr ""
+
+msgid "PromoteMilestone|Promotion failed - %{message}"
+msgstr ""
+
+msgid "Promoted issue to an epic."
+msgstr ""
+
+msgid "Promotes issue to incident"
+msgstr ""
+
+msgid "Promotion is not supported."
+msgstr ""
+
+msgid "Promotions|Add %{link_start} description templates %{link_end} to help your contributors to communicate effectively!"
+msgstr ""
+
+msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Better Protected Branches"
+msgstr ""
+
+msgid "Promotions|Burndown Charts are visual representations of the progress of completing a milestone. At a glance, you see the current state for the completion a given milestone. Without them, you would have to organize the data from the milestone and plot it yourself to have the same sense of progress."
+msgstr ""
+
+msgid "Promotions|Buy EE"
+msgstr ""
+
+msgid "Promotions|Buy GitLab Enterprise Edition"
+msgstr ""
+
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
+msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
+msgstr ""
+
+msgid "Promotions|Contact owner %{link_start}%{owner_name}%{link_end} to upgrade the plan."
+msgstr ""
+
+msgid "Promotions|Contact your Administrator to upgrade your license."
+msgstr ""
+
+msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
+msgid "Promotions|Dismiss burndown charts promotion"
+msgstr ""
+
+msgid "Promotions|Dismiss repository features promotion"
+msgstr ""
+
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Improve merge requests and customer support with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Improve milestones with Burndown Charts."
+msgstr ""
+
+msgid "Promotions|Improve repositories with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Improve search with Advanced Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Keep track of events in your project"
+msgstr ""
+
+msgid "Promotions|Learn more"
+msgstr ""
+
+msgid "Promotions|Merge request approvals"
+msgstr ""
+
+msgid "Promotions|Not now, thanks!"
+msgstr ""
+
+msgid "Promotions|Push Rules"
+msgstr ""
+
+msgid "Promotions|Push Rules are defined per project so you can have different rules applied to different projects depends on your needs."
+msgstr ""
+
+msgid "Promotions|Repository Mirroring"
+msgstr ""
+
+msgid "Promotions|Repository Mirroring is a way to mirror repositories from external sources. It can be used to mirror all branches, tags, and commits that you have in your repository."
+msgstr ""
+
+msgid "Promotions|See the other features in the %{subscription_link_start}Premium plan%{subscription_link_end}"
+msgstr ""
+
+msgid "Promotions|Set the number of necessary approvals and define a list of approvers needed for every merge request in a project."
+msgstr ""
+
+msgid "Promotions|Start GitLab Ultimate trial"
+msgstr ""
+
+msgid "Promotions|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 "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Try it for free"
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to activate Advanced Search."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to activate Audit Events."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to improve merge requests."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to improve milestones with Burndown Charts."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to improve repositories."
+msgstr ""
+
+msgid "Promotions|Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Promotions|Weight"
+msgstr ""
+
+msgid "Promotions|Weighting your issue"
+msgstr ""
+
+msgid "Promotions|When you have a lot of issues, it can be hard to get an overview. By adding a weight to your issues, you can get a better idea of the effort, cost, required time, or value of each, and so better manage them."
+msgstr ""
+
+msgid "Promotions|You can restrict access to protected branches by choosing a role (Maintainers, Developers) as well as certain users."
+msgstr ""
+
+msgid "Promotions|description templates"
+msgstr ""
+
+msgid "Promotions|to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "Prompt users to upload SSH keys"
+msgstr ""
+
+msgid "Protect"
+msgstr ""
+
+msgid "Protect a tag"
+msgstr ""
+
+msgid "Protect variable"
+msgstr ""
+
+msgid "Protected"
+msgstr ""
+
+msgid "Protected Branch"
+msgstr ""
+
+msgid "Protected Branches"
+msgstr ""
+
+msgid "Protected Environment"
+msgstr ""
+
+msgid "Protected Paths: requests"
+msgstr ""
+
+msgid "Protected Tag"
+msgstr ""
+
+msgid "Protected Tags"
+msgstr ""
+
+msgid "Protected branches"
+msgstr ""
+
+msgid "Protected environments"
+msgstr ""
+
+msgid "Protected paths"
+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 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|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to merge"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to merge:"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to push:"
+msgstr ""
+
+msgid "ProtectedBranch|Branch"
+msgstr ""
+
+msgid "ProtectedBranch|Branch will be writable for developers. Are you sure?"
+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 ""
+
+msgid "ProtectedBranch|Protect a branch"
+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 ""
+
+msgid "ProtectedBranch|Require approval from code owners:"
+msgstr ""
+
+msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
+msgstr ""
+
+msgid "ProtectedBranch|Toggle allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Toggle code owner approval"
+msgstr ""
+
+msgid "ProtectedBranch|Unprotect"
+msgstr ""
+
+msgid "ProtectedBranch|Unprotect branch"
+msgstr ""
+
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
+msgid "ProtectedBranch|default"
+msgstr ""
+
+msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
+msgstr ""
+
+msgid "ProtectedEnvironment|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironment|Environment"
+msgstr ""
+
+msgid "ProtectedEnvironment|Only specified groups can execute deployments in protected environments."
+msgstr ""
+
+msgid "ProtectedEnvironment|Only specified users can execute deployments in a protected environment."
+msgstr ""
+
+msgid "ProtectedEnvironment|Protect"
+msgstr ""
+
+msgid "ProtectedEnvironment|Protect an environment"
+msgstr ""
+
+msgid "ProtectedEnvironment|Protected Environment (%{protected_environments_count})"
+msgstr ""
+
+msgid "ProtectedEnvironment|Required approvals"
+msgstr ""
+
+msgid "ProtectedEnvironment|Select an environment"
+msgstr ""
+
+msgid "ProtectedEnvironment|Select groups"
+msgstr ""
+
+msgid "ProtectedEnvironment|Select users"
+msgstr ""
+
+msgid "ProtectedEnvironment|There are currently no protected environments. Protect an environment with this form."
+msgstr ""
+
+msgid "ProtectedEnvironment|Unprotect"
+msgstr ""
+
+msgid "ProtectedEnvironment|Your environment can't be unprotected"
+msgstr ""
+
+msgid "ProtectedEnvironment|Your environment has been protected."
+msgstr ""
+
+msgid "ProtectedEnvironment|Your environment has been unprotected"
+msgstr ""
+
+msgid "ProtectedTags|Unprotect tag"
+msgstr ""
+
+msgid "ProtectedTags|default"
+msgstr ""
+
+msgid "ProtectedTag|By default, protected tags 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 "ProtectedTag|default"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
+
+msgid "Provide Feedback"
+msgstr ""
+
+msgid "Provide a number our sales team can use to call you."
+msgstr ""
+
+msgid "Provider"
+msgstr ""
+
+msgid "Provision instructions"
+msgstr ""
+
+msgid "Provisioned by:"
+msgstr ""
+
+msgid "Proxy support for this API is not available currently"
+msgstr ""
+
+msgid "Public"
+msgstr ""
+
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
+msgid "Public Access Help"
+msgstr ""
+
+msgid "Public deploy keys"
+msgstr ""
+
+msgid "Public pipelines"
+msgstr ""
+
+msgid "Public projects Minutes cost factor"
+msgstr ""
+
+msgid "Public projects are an easy way to allow everyone to have read-only access."
+msgstr ""
+
+msgid "Publish to status page"
+msgstr ""
+
+msgid "Published"
+msgstr ""
+
+msgid "Published on status page"
+msgstr ""
+
+msgid "Publishes this issue to the associated status page."
+msgstr ""
+
+msgid "Pull"
+msgstr ""
+
+msgid "Pull requests from fork are not supported"
+msgstr ""
+
+msgid "Puma is running with a thread count above 1 and the Rugged service is enabled. This may decrease performance in some environments. See our %{link_start}documentation%{link_end} for details of this issue."
+msgstr ""
+
+msgid "Purchase more minutes"
+msgstr ""
+
+msgid "Purchase more storage"
+msgstr ""
+
+msgid "PurchaseStep|An error occurred in the purchase step. If the problem persists please contact support at https://support.gitlab.com."
+msgstr ""
+
+msgid "Push"
+msgstr ""
+
+msgid "Push Rule updated successfully."
+msgstr ""
+
+msgid "Push Rules"
+msgstr ""
+
+msgid "Push Rules updated successfully."
+msgstr ""
+
+msgid "Push an existing Git repository"
+msgstr ""
+
+msgid "Push an existing folder"
+msgstr ""
+
+msgid "Push code to the repository."
+msgstr ""
+
+msgid "Push commits to the source branch or add previously merged commits to review them."
+msgstr ""
+
+msgid "Push events"
+msgstr ""
+
+msgid "Push project from command line"
+msgstr ""
+
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
+msgstr ""
+
+msgid "Push to create a project"
+msgstr ""
+
+msgid "PushRules|All branch names must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any branch name is allowed."
+msgstr ""
+
+msgid "PushRules|All commit author's email must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any email is allowed."
+msgstr ""
+
+msgid "PushRules|All commit messages must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not required to match any expression."
+msgstr ""
+
+msgid "PushRules|All committed filenames cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any filename is allowed."
+msgstr ""
+
+msgid "PushRules|Commit messages cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not rejected based on any expression."
+msgstr ""
+
+msgid "PushRules|Do not allow users to remove Git tags with %{code_block_start}git push%{code_block_end}"
+msgstr ""
+
+msgid "PushRules|Reject any files likely to contain secrets. %{secret_files_link_start}What secret files are rejected?%{secret_files_link_end}"
+msgstr ""
+
+msgid "PushRules|Reject file sizes equal to or greater than this size. If set to 0, files of any size are allowed. This rule does not apply to files tracked by Git LFS."
+msgstr ""
+
+msgid "PushRules|Restrict commits to existing GitLab users."
+msgstr ""
+
+msgid "PushRules|Restrict push operations for this project."
+msgstr ""
+
+msgid "PushRules|Save push rules"
+msgstr ""
+
+msgid "PushRules|Select push rules"
+msgstr ""
+
+msgid "PushRules|Users can still delete tags through the GitLab UI."
+msgstr ""
+
+msgid "PushRule|Push rules"
+msgstr ""
+
+msgid "PushRule|Reject unverified users"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "PushoverService|%{user_name} deleted branch \"%{ref}\"."
+msgstr ""
+
+msgid "PushoverService|%{user_name} push to branch \"%{ref}\"."
+msgstr ""
+
+msgid "PushoverService|%{user_name} pushed new branch \"%{ref}\"."
+msgstr ""
+
+msgid "PushoverService|Enter new user key"
+msgstr ""
+
+msgid "PushoverService|Enter your application key."
+msgstr ""
+
+msgid "PushoverService|Enter your user key."
+msgstr ""
+
+msgid "PushoverService|Get real-time notifications on your device."
+msgstr ""
+
+msgid "PushoverService|High priority"
+msgstr ""
+
+msgid "PushoverService|Leave blank for all active devices."
+msgstr ""
+
+msgid "PushoverService|Leave blank to use your current user key."
+msgstr ""
+
+msgid "PushoverService|Low priority"
+msgstr ""
+
+msgid "PushoverService|Lowest priority"
+msgstr ""
+
+msgid "PushoverService|Normal priority"
+msgstr ""
+
+msgid "PushoverService|See project %{project_full_name}"
+msgstr ""
+
+msgid "PushoverService|Total commits count: %{total_commits_count}"
+msgstr ""
+
+msgid "QualitySummary|Project quality"
+msgstr ""
+
+msgid "Query"
+msgstr ""
+
+msgid "Query cannot be processed"
+msgstr ""
+
+msgid "Queued"
+msgstr ""
+
+msgid "Quick actions can be used in description and comment boxes."
+msgstr ""
+
+msgid "Quick help"
+msgstr ""
+
+msgid "Quick range"
+msgstr ""
+
+msgid "Quickly and easily edit multiple files in your project."
+msgstr ""
+
+msgid "Quota of CI/CD minutes"
+msgstr ""
+
+msgid "Quota of CI/CD minutes:"
+msgstr ""
+
+msgid "README"
+msgstr ""
+
+msgid "Rails"
+msgstr ""
+
+msgid "Rake Tasks Help"
+msgstr ""
+
+msgid "Random"
+msgstr ""
+
+msgid "Rate Limits"
+msgstr ""
+
+msgid "Rate limit"
+msgstr ""
+
+msgid "Rate limit access to specified paths."
+msgstr ""
+
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
+msgid "Raw blob request rate limit per minute"
+msgstr ""
+
+msgid "Raw blob requests"
+msgstr ""
+
+msgid "Re-authentication period expired or never requested. Please try again"
+msgstr ""
+
+msgid "Re-authentication required"
+msgstr ""
+
+msgid "Re-import"
+msgstr ""
+
+msgid "Re-request review"
+msgstr ""
+
+msgid "Read documentation"
+msgstr ""
+
+msgid "Read more"
+msgstr ""
+
+msgid "Read more about GitLab at %{link_to_promo}."
+msgstr ""
+
+msgid "Read more about project permissions %{help_link_open}here%{help_link_close}"
+msgstr ""
+
+msgid "Read more about related epics"
+msgstr ""
+
+msgid "Read more about related issues"
+msgstr ""
+
+msgid "Read their documentation."
+msgstr ""
+
+msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
+msgstr ""
+
+msgid "Ready to merge by members who can write to the target branch."
+msgstr ""
+
+msgid "Ready to merge!"
+msgstr ""
+
+msgid "Reauthenticating with SAML provider."
+msgstr ""
+
+msgid "Rebase"
+msgstr ""
+
+msgid "Rebase completed"
+msgstr ""
+
+msgid "Rebase in progress"
+msgstr ""
+
+msgid "Rebase source branch"
+msgstr ""
+
+msgid "Rebase source branch on the target branch."
+msgstr ""
+
+msgid "Rebase without pipeline"
+msgstr ""
+
+msgid "Recaptcha verified?"
+msgstr ""
+
+msgid "Receive a $50 gift card as a thank you for your time."
+msgstr ""
+
+msgid "Receive a %{strongOpen}$50 gift card%{strongClose} as a thank you for your time."
+msgstr ""
+
+msgid "Receive any notifications from GitLab."
+msgstr ""
+
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
+msgid "Receive notifications about your own activity"
+msgstr ""
+
+msgid "Receive product marketing emails"
+msgstr ""
+
+msgid "Recent"
+msgstr ""
+
+msgid "Recent Project Activity"
+msgstr ""
+
+msgid "Recent Searches Service is unavailable"
+msgstr ""
+
+msgid "Recent events"
+msgstr ""
+
+msgid "Recent searches"
+msgstr ""
+
+msgid "Recently used"
+msgstr ""
+
+msgid "Reconfigure"
+msgstr ""
+
+msgid "Recovery Codes"
+msgstr ""
+
+msgid "Redirect to SAML provider to test configuration"
+msgstr ""
+
+msgid "Redirecting"
+msgstr ""
+
+msgid "Redis"
+msgstr ""
+
+msgid "Reduce incident management alert volume (for example, if too many issues are being created)."
+msgstr ""
+
+msgid "Reduce project visibility"
+msgstr ""
+
+msgid "Reduce risk and triage fewer vulnerabilities with security training"
+msgstr ""
+
+msgid "Reduce this project’s visibility?"
+msgstr ""
+
+msgid "Reference"
+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 the page and try again."
+msgstr ""
+
+msgid "Refreshing in a second to show the updated status..."
+msgid_plural "Refreshing in %d seconds to show the updated status..."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Regenerate export"
+msgstr ""
+
+msgid "Regenerate instance ID"
+msgstr ""
+
+msgid "Regenerate recovery codes"
+msgstr ""
+
+msgid "Regenerating the instance ID can break integration depending on the client you are using."
+msgstr ""
+
+msgid "Regex pattern"
+msgstr ""
+
+msgid "Region"
+msgstr ""
+
+msgid "Regions"
+msgstr ""
+
+msgid "Register"
+msgstr ""
+
+msgid "Register / Sign In"
+msgstr ""
+
+msgid "Register Two-Factor Authenticator"
+msgstr ""
+
+msgid "Register Universal Two-Factor (U2F) Device"
+msgstr ""
+
+msgid "Register WebAuthn Device"
+msgstr ""
+
+msgid "Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine. Runners are either:"
+msgstr ""
+
+msgid "Register device"
+msgstr ""
+
+msgid "Register now"
+msgstr ""
+
+msgid "Register the runner with this URL:"
+msgstr ""
+
+msgid "Register with two-factor app"
+msgstr ""
+
+msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
+msgstr ""
+
+msgid "RegistrationFeatures|Read more about the %{link_start}Registration Features Program%{link_end}."
+msgstr ""
+
+msgid "RegistrationFeatures|Registration Features Program"
+msgstr ""
+
+msgid "RegistrationFeatures|Want to %{feature_title} for free?"
+msgstr ""
+
+msgid "RegistrationFeatures|send emails to users"
+msgstr ""
+
+msgid "RegistrationFeatures|use this feature"
+msgstr ""
+
+msgid "RegistrationVerification|Are you sure you want to skip this step?"
+msgstr ""
+
+msgid "RegistrationVerification|Enable free CI/CD minutes"
+msgstr ""
+
+msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
+msgstr ""
+
+msgid "RegistrationVerification|Pipelines using shared GitLab runners will fail until you validate your account."
+msgstr ""
+
+msgid "RegistrationVerification|Skip this for now"
+msgstr ""
+
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free CI/CD minutes to build your application."
+msgstr ""
+
+msgid "RegistrationVerification|Validate account"
+msgstr ""
+
+msgid "RegistrationVerification|Verify your identity"
+msgstr ""
+
+msgid "RegistrationVerification|Yes, I'd like to skip"
+msgstr ""
+
+msgid "RegistrationVerification|You can alway verify your account at a later time."
+msgstr ""
+
+msgid "Registration|Checkout"
+msgstr ""
+
+msgid "Registration|Your GitLab group"
+msgstr ""
+
+msgid "Registration|Your first project"
+msgstr ""
+
+msgid "Registration|Your profile"
+msgstr ""
+
+msgid "Registry setup"
+msgstr ""
+
+msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
+msgstr ""
+
+msgid "Reject"
+msgstr ""
+
+msgid "Rejected (closed)"
+msgstr ""
+
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
+msgid "Related feature flags"
+msgstr ""
+
+msgid "Related incidents or issues"
+msgstr ""
+
+msgid "Related issues"
+msgstr ""
+
+msgid "Related merge requests"
+msgstr ""
+
+msgid "Relates to"
+msgstr ""
+
+msgid "Release"
+msgid_plural "Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Release assets"
+msgstr ""
+
+msgid "Release assets documentation"
+msgstr ""
+
+msgid "Release date"
+msgstr ""
+
+msgid "Release does not have the same project as the milestone"
+msgstr ""
+
+msgid "Release notes"
+msgstr ""
+
+msgid "Release notes:"
+msgstr ""
+
+msgid "Release title"
+msgstr ""
+
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Image"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Images"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Other"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Package"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Packages"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Runbook"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Runbooks"
+msgstr ""
+
+msgid "Released date"
+msgstr ""
+
+msgid "Releases"
+msgstr ""
+
+msgid "Releases are based on Git tags and mark specific points in a project's development history. They can contain information about the type of changes and can also deliver binaries, like compiled versions of your software."
+msgstr ""
+
+msgid "Releases are based on Git tags. We recommend tags that use semantic versioning, for example %{codeStart}v1.0.0%{codeEnd}, %{codeStart}v2.1.0-pre%{codeEnd}."
+msgstr ""
+
+msgid "Releases documentation"
+msgstr ""
+
+msgid "Releases|New Release"
+msgstr ""
+
+msgid "Releases|Tag message"
+msgstr ""
+
+msgid "Release|Include message from the annotated tag."
+msgstr ""
+
+msgid "Release|Something went wrong while creating a new release."
+msgstr ""
+
+msgid "Release|Something went wrong while getting the release details."
+msgstr ""
+
+msgid "Release|Something went wrong while saving the release details."
+msgstr ""
+
+msgid "Release|Unable to fetch the tag notes."
+msgstr ""
+
+msgid "Release|You can edit the content later by editing the release. %{linkStart}How do I edit a release?%{linkEnd}"
+msgstr ""
+
+msgid "Reload page"
+msgstr ""
+
+msgid "Remediations"
+msgstr ""
+
+msgid "Remember me"
+msgstr ""
+
+msgid "Remind later"
+msgstr ""
+
+msgid "Remote object has no absolute path."
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+msgid "Remove %{displayReference}"
+msgstr ""
+
+msgid "Remove Zoom meeting"
+msgstr ""
+
+msgid "Remove Zoom meeting."
+msgstr ""
+
+msgid "Remove access"
+msgstr ""
+
+msgid "Remove all or specific assignee(s)"
+msgstr ""
+
+msgid "Remove all or specific label(s)"
+msgstr ""
+
+msgid "Remove all or specific reviewer(s)"
+msgstr ""
+
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
+msgid "Remove asset link"
+msgstr ""
+
+msgid "Remove assignee"
+msgstr ""
+
+msgid "Remove attention request"
+msgstr ""
+
+msgid "Remove attention request(s)"
+msgstr ""
+
+msgid "Remove avatar"
+msgstr ""
+
+msgid "Remove card"
+msgstr ""
+
+msgid "Remove child epic from an epic"
+msgstr ""
+
+msgid "Remove customer relation contact(s)."
+msgstr ""
+
+msgid "Remove customer relation contacts"
+msgstr ""
+
+msgid "Remove deploy key"
+msgstr ""
+
+msgid "Remove description history"
+msgstr ""
+
+msgid "Remove due date"
+msgstr ""
+
+msgid "Remove favicon"
+msgstr ""
+
+msgid "Remove file"
+msgstr ""
+
+msgid "Remove fork relationship"
+msgstr ""
+
+msgid "Remove from batch"
+msgstr ""
+
+msgid "Remove from epic"
+msgstr ""
+
+msgid "Remove group"
+msgstr ""
+
+msgid "Remove header logo"
+msgstr ""
+
+msgid "Remove iteration"
+msgstr ""
+
+msgid "Remove license"
+msgstr ""
+
+msgid "Remove limit"
+msgstr ""
+
+msgid "Remove link"
+msgstr ""
+
+msgid "Remove list"
+msgstr ""
+
+msgid "Remove log"
+msgstr ""
+
+msgid "Remove logo"
+msgstr ""
+
+msgid "Remove member"
+msgstr ""
+
+msgid "Remove milestone"
+msgstr ""
+
+msgid "Remove parent epic from an epic"
+msgstr ""
+
+msgid "Remove priority"
+msgstr ""
+
+msgid "Remove report"
+msgstr ""
+
+msgid "Remove reviewer"
+msgstr ""
+
+msgid "Remove runner"
+msgstr ""
+
+msgid "Remove secondary email"
+msgstr ""
+
+msgid "Remove spent time"
+msgstr ""
+
+msgid "Remove time estimate"
+msgstr ""
+
+msgid "Remove topic avatar"
+msgstr ""
+
+msgid "Remove user"
+msgstr ""
+
+msgid "Remove user & report"
+msgstr ""
+
+msgid "Remove user from group"
+msgstr ""
+
+msgid "Remove user from project"
+msgstr ""
+
+msgid "Remove..."
+msgstr ""
+
+msgid "Removed"
+msgstr ""
+
+msgid "Removed %{assignee_text} %{assignee_references}."
+msgstr ""
+
+msgid "Removed %{epic_ref} from child epics."
+msgstr ""
+
+msgid "Removed %{iteration_reference} iteration."
+msgstr ""
+
+msgid "Removed %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Removed %{milestone_reference} milestone."
+msgstr ""
+
+msgid "Removed %{reviewer_text} %{reviewer_references}."
+msgstr ""
+
+msgid "Removed all labels."
+msgstr ""
+
+msgid "Removed an issue from an epic."
+msgstr ""
+
+msgid "Removed attention from %{users_sentence}."
+msgstr ""
+
+msgid "Removed attention request from @%{username}"
+msgstr ""
+
+msgid "Removed group can not be restored!"
+msgstr ""
+
+msgid "Removed parent epic %{epic_ref}."
+msgstr ""
+
+msgid "Removed spent time."
+msgstr ""
+
+msgid "Removed the due date."
+msgstr ""
+
+msgid "Removed time estimate."
+msgstr ""
+
+msgid "Removed upload with id %{id}"
+msgstr ""
+
+msgid "RemovedProjects|No projects pending deletion found"
+msgstr ""
+
+msgid "RemovedProjects|Projects that are pending deletion that you have access to are listed here."
+msgstr ""
+
+msgid "Removes %{assignee_text} %{assignee_references}."
+msgstr ""
+
+msgid "Removes %{epic_ref} from child epics."
+msgstr ""
+
+msgid "Removes %{iteration_reference} iteration."
+msgstr ""
+
+msgid "Removes %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Removes %{milestone_reference} milestone."
+msgstr ""
+
+msgid "Removes %{reviewer_text} %{reviewer_references}."
+msgstr ""
+
+msgid "Removes all labels."
+msgstr ""
+
+msgid "Removes an issue from an epic."
+msgstr ""
+
+msgid "Removes attention from %{users_sentence}."
+msgstr ""
+
+msgid "Removes parent epic %{epic_ref}."
+msgstr ""
+
+msgid "Removes spent time."
+msgstr ""
+
+msgid "Removes the due date."
+msgstr ""
+
+msgid "Removes time estimate."
+msgstr ""
+
+msgid "Removing this group also removes all child projects, including archived projects, and their resources."
+msgstr ""
+
+msgid "Rename file"
+msgstr ""
+
+msgid "Rename folder"
+msgstr ""
+
+msgid "Rename/Move"
+msgstr ""
+
+msgid "Render diagrams in your documents using PlantUML."
+msgstr ""
+
+msgid "Renew subscription"
+msgstr ""
+
+msgid "Renews"
+msgstr ""
+
+msgid "Reopen"
+msgstr ""
+
+msgid "Reopen %{issueType}"
+msgstr ""
+
+msgid "Reopen %{noteable}"
+msgstr ""
+
+msgid "Reopen epic"
+msgstr ""
+
+msgid "Reopen milestone"
+msgstr ""
+
+msgid "Reopen test case"
+msgstr ""
+
+msgid "Reopen this %{quick_action_target}"
+msgstr ""
+
+msgid "Reopened this %{quick_action_target}."
+msgstr ""
+
+msgid "Reopens this %{quick_action_target}."
+msgstr ""
+
+msgid "Replace"
+msgstr ""
+
+msgid "Replace %{name}"
+msgstr ""
+
+msgid "Replace all label(s)"
+msgstr ""
+
+msgid "Replace audio"
+msgstr ""
+
+msgid "Replace file"
+msgstr ""
+
+msgid "Replace image"
+msgstr ""
+
+msgid "Replace video"
+msgstr ""
+
+msgid "Replaced all labels with %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Replaces the clone URL root."
+msgstr ""
+
+msgid "Replication"
+msgstr ""
+
+msgid "Reply"
+msgstr ""
+
+msgid "Reply by email"
+msgstr ""
+
+msgid "Reply internally"
+msgstr ""
+
+msgid "Reply to comment"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Reply…"
+msgstr ""
+
+msgid "Report abuse"
+msgstr ""
+
+msgid "Report abuse to admin"
+msgstr ""
+
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
+msgstr ""
+
+msgid "Report your license usage data to GitLab"
+msgstr ""
+
+msgid "Reported %{timeAgo} by %{reportedBy}"
+msgstr ""
+
+msgid "Reported by"
+msgstr ""
+
+msgid "Reported by %{reporter}"
+msgstr ""
+
+msgid "Reporting"
+msgstr ""
+
+msgid "Reports|%{combinedString} and %{resolvedString}"
+msgstr ""
+
+msgid "Reports|%{recentlyFailed} out of %{failed} failed test has failed more than once in the last 14 days"
+msgstr ""
+
+msgid "Reports|%{recentlyFailed} out of %{failed} failed tests has failed more than once in the last 14 days"
+msgid_plural "Reports|%{recentlyFailed} out of %{failed} failed tests have failed more than once in the last 14 days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Accessibility scanning detected %d issue for the source branch only"
+msgid_plural "Reports|Accessibility scanning detected %d issues for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issue for the source branch only"
+msgid_plural "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issues for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Accessibility scanning detected no issues for the source branch only"
+msgstr ""
+
+msgid "Reports|Accessibility scanning failed loading results"
+msgstr ""
+
+msgid "Reports|Accessibility scanning results are being parsed"
+msgstr ""
+
+msgid "Reports|Actions"
+msgstr ""
+
+msgid "Reports|Activity"
+msgstr ""
+
+msgid "Reports|An error occurred while loading %{name} results"
+msgstr ""
+
+msgid "Reports|An error occurred while loading report"
+msgstr ""
+
+msgid "Reports|Base report parsing error:"
+msgstr ""
+
+msgid "Reports|Classname"
+msgstr ""
+
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
+msgid "Reports|Execution time"
+msgstr ""
+
+msgid "Reports|Failed %{count} time in %{baseBranch} in the last 14 days"
+msgid_plural "Reports|Failed %{count} times in %{baseBranch} in the last 14 days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Failed %{count} time in %{base_branch} in the last 14 days"
+msgid_plural "Reports|Failed %{count} times in %{base_branch} in the last 14 days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Failure"
+msgstr ""
+
+msgid "Reports|Filename"
+msgstr ""
+
+msgid "Reports|Fixed"
+msgstr ""
+
+msgid "Reports|Full report"
+msgstr ""
+
+msgid "Reports|Head report parsing error:"
+msgstr ""
+
+msgid "Reports|Identifier"
+msgstr ""
+
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
+msgid "Reports|Metrics reports are loading"
+msgstr ""
+
+msgid "Reports|Metrics reports changed on %{numberOfChanges} %{pointsString}"
+msgstr ""
+
+msgid "Reports|Metrics reports did not change"
+msgstr ""
+
+msgid "Reports|Metrics reports failed loading results"
+msgstr ""
+
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
+msgid "Reports|New"
+msgstr ""
+
+msgid "Reports|Scanner"
+msgstr ""
+
+msgid "Reports|Severity"
+msgstr ""
+
+msgid "Reports|System output"
+msgstr ""
+
+msgid "Reports|Test summary"
+msgstr ""
+
+msgid "Reports|Test summary failed loading results"
+msgstr ""
+
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
+msgid "Reports|Test summary results are being parsed"
+msgstr ""
+
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
+msgid "Reports|Tool"
+msgstr ""
+
+msgid "Reports|Vulnerability"
+msgstr ""
+
+msgid "Reports|Vulnerability Name"
+msgstr ""
+
+msgid "Reports|no changed test results"
+msgstr ""
+
+msgid "Repositories"
+msgstr ""
+
+msgid "Repositories Analytics"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Analyze repositories for projects in %{groupName}. Data doesn't include projects in subgroups. %{learnMoreLink}."
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average Coverage by Job"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Code Coverage: %{averageCoverage}"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Coverage Jobs"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Download historic test coverage data"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Download historic test coverage data (.csv)"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Download test coverage data (.csv)"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Historic Test Coverage Data is available in raw format (.csv) for further analysis."
+msgstr ""
+
+msgid "RepositoriesAnalytics|In the last day, %{metricValue} job has code coverage."
+msgid_plural "RepositoriesAnalytics|In the last day, %{metricValue} jobs have code coverage."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "RepositoriesAnalytics|In the last day, %{metricValue} project in %{groupName} has code coverage enabled."
+msgid_plural "RepositoriesAnalytics|In the last day, %{metricValue} projects in %{groupName} have code coverage enabled."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "RepositoriesAnalytics|In the last day, on average, %{metricValue} of all jobs are covered."
+msgstr ""
+
+msgid "RepositoriesAnalytics|Jobs with Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Jobs with Coverage: %{coverageCount}"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Last 30 days"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Last Update"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Last updated %{timeAgo}"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Latest test coverage results"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Latest test coverage results for all projects in %{groupName} (excluding projects in subgroups)."
+msgstr ""
+
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
+msgstr ""
+
+msgid "RepositoriesAnalytics|Please select projects to display."
+msgstr ""
+
+msgid "RepositoriesAnalytics|Projects with Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Projects with Coverage: %{projectCount}"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Repositories Analytics"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Test Code Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|There was an error fetching the projects."
+msgstr ""
+
+msgid "Repository"
+msgstr ""
+
+msgid "Repository Analytics"
+msgstr ""
+
+msgid "Repository Graph"
+msgstr ""
+
+msgid "Repository Settings"
+msgstr ""
+
+msgid "Repository already read-only"
+msgstr ""
+
+msgid "Repository by URL"
+msgstr ""
+
+msgid "Repository check"
+msgstr ""
+
+msgid "Repository check was triggered."
+msgstr ""
+
+msgid "Repository checks"
+msgstr ""
+
+msgid "Repository cleanup"
+msgstr ""
+
+msgid "Repository cleanup has started. You will receive an email once the cleanup operation is complete."
+msgstr ""
+
+msgid "Repository clone URL"
+msgstr ""
+
+msgid "Repository files count over the limit"
+msgstr ""
+
+msgid "Repository has an invalid default branch name."
+msgstr ""
+
+msgid "Repository has more than one branch."
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
+msgid "Repository has tags."
+msgstr ""
+
+msgid "Repository maintenance"
+msgstr ""
+
+msgid "Repository mirroring"
+msgstr ""
+
+msgid "Repository mirroring configuration"
+msgstr ""
+
+msgid "Repository must contain at least 1 file."
+msgstr ""
+
+msgid "Repository size is above the limit."
+msgstr ""
+
+msgid "Repository size limit (MB)"
+msgstr ""
+
+msgid "Repository storage"
+msgstr ""
+
+msgid "Repository update events"
+msgstr ""
+
+msgid "Repository usage recalculation started"
+msgstr ""
+
+msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
+msgstr ""
+
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
+msgid "Request"
+msgstr ""
+
+msgid "Request Access"
+msgstr ""
+
+msgid "Request a new one"
+msgstr ""
+
+msgid "Request attention from %{users_sentence}."
+msgstr ""
+
+msgid "Request attention from assignee or reviewer"
+msgstr ""
+
+msgid "Request attention from assignee(s) or reviewer(s)"
+msgstr ""
+
+msgid "Request data is too large"
+msgstr ""
+
+msgid "Request details"
+msgstr ""
+
+msgid "Request parameter %{param} is missing."
+msgstr ""
+
+msgid "Request review from"
+msgstr ""
+
+msgid "Request time"
+msgstr ""
+
+msgid "Request to link SAML account must be authorized"
+msgstr ""
+
+msgid "Requested"
+msgstr ""
+
+msgid "Requested %{time_ago}"
+msgstr ""
+
+msgid "Requested attention from %{users_sentence}."
+msgstr ""
+
+msgid "Requested attention from @%{username}"
+msgstr ""
+
+msgid "Requested attention from @%{username}. Your own attention request was removed."
+msgstr ""
+
+msgid "Requested design version does not exist."
+msgstr ""
+
+msgid "Requested review"
+msgstr ""
+
+msgid "Requested review. Your attention request was removed."
+msgstr ""
+
+msgid "Requested states are invalid"
+msgstr ""
+
+msgid "Requests"
+msgstr ""
+
+msgid "Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}"
+msgstr ""
+
+msgid "Requests per period"
+msgstr ""
+
+msgid "Require additional authentication for administrative tasks."
+msgstr ""
+
+msgid "Required approvals (%{approvals_given} given)"
+msgstr ""
+
+msgid "Required approvals (%{approvals_given} given, you've approved)"
+msgstr ""
+
+msgid "Required in this project."
+msgstr ""
+
+msgid "Required only if you are not using role instance credentials."
+msgstr ""
+
+msgid "Requirement"
+msgstr ""
+
+msgid "Requirement %{reference} has been added"
+msgstr ""
+
+msgid "Requirement %{reference} has been archived"
+msgstr ""
+
+msgid "Requirement %{reference} has been reopened"
+msgstr ""
+
+msgid "Requirement %{reference} has been updated"
+msgstr ""
+
+msgid "Requirement title cannot have more than %{limit} characters."
+msgstr ""
+
+msgid "Requirements"
+msgstr ""
+
+msgid "Requirements can be based on users, stakeholders, system, software, or anything else you find important to capture."
+msgstr ""
+
+msgid "Requires %d approval from eligible users."
+msgid_plural "Requires %d approvals from eligible users."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires %{count} approval from %{names}."
+msgid_plural "Requires %{count} approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires values to meet regular expression requirements."
+msgstr ""
+
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
+msgid "Resend"
+msgstr ""
+
+msgid "Resend Request"
+msgstr ""
+
+msgid "Resend confirmation email"
+msgstr ""
+
+msgid "Resend invite"
+msgstr ""
+
+msgid "Resend it"
+msgstr ""
+
+msgid "Resend unlock instructions"
+msgstr ""
+
+msgid "Reset"
+msgstr ""
+
+msgid "Reset error tracking access token"
+msgstr ""
+
+msgid "Reset file"
+msgstr ""
+
+msgid "Reset filters"
+msgstr ""
+
+msgid "Reset health check access token"
+msgstr ""
+
+msgid "Reset password"
+msgstr ""
+
+msgid "Reset registration token"
+msgstr ""
+
+msgid "Reset template"
+msgstr ""
+
+msgid "Reset to project defaults"
+msgstr ""
+
+msgid "Resolve"
+msgstr ""
+
+msgid "Resolve conflicts"
+msgstr ""
+
+msgid "Resolve conflicts on source branch"
+msgstr ""
+
+msgid "Resolve these conflicts or ask someone with write access to this repository to merge it locally."
+msgstr ""
+
+msgid "Resolve thread"
+msgstr ""
+
+msgid "Resolved"
+msgstr ""
+
+msgid "Resolved 1 discussion."
+msgstr ""
+
+msgid "Resolved all discussions."
+msgstr ""
+
+msgid "Resolved by"
+msgstr ""
+
+msgid "Resolved by %{name}"
+msgstr ""
+
+msgid "Response"
+msgstr ""
+
+msgid "Response didn't include `service_desk_address`"
+msgstr ""
+
+msgid "Response metrics (AWS ELB)"
+msgstr ""
+
+msgid "Response metrics (Custom)"
+msgstr ""
+
+msgid "Response metrics (HA Proxy)"
+msgstr ""
+
+msgid "Response metrics (NGINX Ingress VTS)"
+msgstr ""
+
+msgid "Response metrics (NGINX Ingress)"
+msgstr ""
+
+msgid "Response metrics (NGINX)"
+msgstr ""
+
+msgid "Response text"
+msgstr ""
+
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
+msgid "Restart Terminal"
+msgstr ""
+
+msgid "Restore"
+msgstr ""
+
+msgid "Restore group"
+msgstr ""
+
+msgid "Restore project"
+msgstr ""
+
+msgid "Restoring projects"
+msgstr ""
+
+msgid "Restoring the group will prevent the group, its subgroups and projects from being removed on this date."
+msgstr ""
+
+msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
+msgstr ""
+
+msgid "Restrict access by IP address"
+msgstr ""
+
+msgid "Restrict membership by email domain"
+msgstr ""
+
+msgid "Restrict projects for this runner"
+msgstr ""
+
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
+msgid "Resume"
+msgstr ""
+
+msgid "Resync"
+msgstr ""
+
+msgid "Retrieving the compliance report failed. Refresh the page and try again."
+msgstr ""
+
+msgid "Retry"
+msgstr ""
+
+msgid "Retry downstream pipeline"
+msgstr ""
+
+msgid "Retry failed jobs"
+msgstr ""
+
+msgid "Retry job"
+msgstr ""
+
+msgid "Retry migration"
+msgstr ""
+
+msgid "Retry this job"
+msgstr ""
+
+msgid "Retry this job in order to create the necessary resources."
+msgstr ""
+
+msgid "Retry verification"
+msgstr ""
+
+msgid "Reveal value"
+msgid_plural "Reveal values"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reveal values"
+msgstr ""
+
+msgid "Revert this commit"
+msgstr ""
+
+msgid "Revert this merge request"
+msgstr ""
+
+msgid "Review"
+msgstr ""
+
+msgid "Review App|View app"
+msgstr ""
+
+msgid "Review App|View latest app"
+msgstr ""
+
+msgid "Review changes"
+msgstr ""
+
+msgid "Review requests for you"
+msgstr ""
+
+msgid "Review the changes locally."
+msgstr ""
+
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
+msgid "Review the target project before submitting to avoid exposing %{source} changes."
+msgstr ""
+
+msgid "Review time"
+msgstr ""
+
+msgid "Review time is defined as the time it takes from first comment until merged."
+msgstr ""
+
+msgid "ReviewApp|Enable Review App"
+msgstr ""
+
+msgid "Reviewer"
+msgid_plural "%d Reviewers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reviewer(s)"
+msgstr ""
+
+msgid "Reviewers"
+msgstr ""
+
+msgid "Reviewing"
+msgstr ""
+
+msgid "Reviewing (merge request !%{mergeRequestId})"
+msgstr ""
+
+msgid "Revoke"
+msgstr ""
+
+msgid "Revoked"
+msgstr ""
+
+msgid "Revoked access token %{access_token_name}!"
+msgstr ""
+
+msgid "Revoked impersonation token %{token_name}!"
+msgstr ""
+
+msgid "Revoked personal access token %{personal_access_token_name}!"
+msgstr ""
+
+msgid "RightSidebar|Copy email address"
+msgstr ""
+
+msgid "RightSidebar|Issue email"
+msgstr ""
+
+msgid "RightSidebar|adding a"
+msgstr ""
+
+msgid "RightSidebar|deleting the"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Roadmap settings"
+msgstr ""
+
+msgid "Roadmap view"
+msgstr ""
+
+msgid "Role"
+msgstr ""
+
+msgid "Rollback"
+msgstr ""
+
+msgid "Ruby"
+msgstr ""
+
+msgid "Rule name is already taken."
+msgstr ""
+
+msgid "Rules that define what git pushes are accepted for a project in this group. All newly created projects in this group will use these settings."
+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 ""
+
+msgid "Run CI/CD pipelines with Jenkins when you push to a repository, or when a merge request is created, updated, or merged. %{docs_link}"
+msgstr ""
+
+msgid "Run CI/CD pipelines with Jenkins."
+msgstr ""
+
+msgid "Run housekeeping"
+msgstr ""
+
+msgid "Run manual or delayed jobs"
+msgstr ""
+
+msgid "Run tests against your code live using the Web Terminal"
+msgstr ""
+
+msgid "Run untagged jobs"
+msgstr ""
+
+msgid "Runner"
+msgstr ""
+
+msgid "Runner API"
+msgstr ""
+
+msgid "Runner tokens"
+msgstr ""
+
+msgid "Runner was not updated."
+msgstr ""
+
+msgid "Runner was successfully updated."
+msgstr ""
+
+msgid "Runners"
+msgstr ""
+
+msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
+msgstr ""
+
+msgid "Runners page."
+msgstr ""
+
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
+msgid "Runners|A new version is available"
+msgstr ""
+
+msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
+msgstr ""
+
+msgid "Runners|Active"
+msgstr ""
+
+msgid "Runners|Add notes, like who owns the runner or what it should be used for."
+msgstr ""
+
+msgid "Runners|All"
+msgstr ""
+
+msgid "Runners|All group runners that have not contacted GitLab in more than %{elapsedTime} are deleted permanently. This task runs periodically in the background."
+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."
+msgstr ""
+
+msgid "Runners|An error has occurred fetching instructions"
+msgstr ""
+
+msgid "Runners|Architecture"
+msgstr ""
+
+msgid "Runners|Assigned Group"
+msgstr ""
+
+msgid "Runners|Assigned Projects (%{projectCount})"
+msgstr ""
+
+msgid "Runners|Associated with one or more projects"
+msgstr ""
+
+msgid "Runners|Available to all projects"
+msgstr ""
+
+msgid "Runners|Available to all projects and subgroups in the group"
+msgstr ""
+
+msgid "Runners|Can run untagged jobs"
+msgstr ""
+
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
+msgid "Runners|Command to register runner"
+msgstr ""
+
+msgid "Runners|Configuration"
+msgstr ""
+
+msgid "Runners|Copy instructions"
+msgstr ""
+
+msgid "Runners|Copy registration token"
+msgstr ""
+
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|Delete runner"
+msgstr ""
+
+msgid "Runners|Delete runner %{name}?"
+msgstr ""
+
+msgid "Runners|Delete selected"
+msgstr ""
+
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
+msgid "Runners|Description"
+msgstr ""
+
+msgid "Runners|Details"
+msgstr ""
+
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
+msgid "Runners|Download and install binary"
+msgstr ""
+
+msgid "Runners|Download latest binary"
+msgstr ""
+
+msgid "Runners|Edit your search and try again"
+msgstr ""
+
+msgid "Runners|Enable stale runner cleanup"
+msgstr ""
+
+msgid "Runners|Enable stale runner cleanup?"
+msgstr ""
+
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|Executor"
+msgstr ""
+
+msgid "Runners|Get started with runners"
+msgstr ""
+
+msgid "Runners|Group"
+msgstr ""
+
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
+msgid "Runners|IP Address"
+msgstr ""
+
+msgid "Runners|Install a runner"
+msgstr ""
+
+msgid "Runners|Instance"
+msgstr ""
+
+msgid "Runners|Jobs"
+msgstr ""
+
+msgid "Runners|Last contact"
+msgstr ""
+
+msgid "Runners|Locked to this project"
+msgstr ""
+
+msgid "Runners|Maintenance note"
+msgstr ""
+
+msgid "Runners|Maximum job timeout"
+msgstr ""
+
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
+msgid "Runners|Name"
+msgstr ""
+
+msgid "Runners|Never contacted"
+msgstr ""
+
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
+msgstr ""
+
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No results found"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
+msgstr ""
+
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
+msgstr ""
+
+msgid "Runners|Offline"
+msgstr ""
+
+msgid "Runners|Offline runners"
+msgstr ""
+
+msgid "Runners|Offline:"
+msgstr ""
+
+msgid "Runners|Online"
+msgstr ""
+
+msgid "Runners|Online runners"
+msgstr ""
+
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
+msgid "Runners|Paused"
+msgstr ""
+
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|Platform"
+msgstr ""
+
+msgid "Runners|Project"
+msgstr ""
+
+msgid "Runners|Property Name"
+msgstr ""
+
+msgid "Runners|Protected"
+msgstr ""
+
+msgid "Runners|Register a group runner"
+msgstr ""
+
+msgid "Runners|Register a project runner"
+msgstr ""
+
+msgid "Runners|Register a runner"
+msgstr ""
+
+msgid "Runners|Register an instance runner"
+msgstr ""
+
+msgid "Runners|Registration token"
+msgstr ""
+
+msgid "Runners|Registration token copied!"
+msgstr ""
+
+msgid "Runners|Reset token"
+msgstr ""
+
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
+msgid "Runners|Revision"
+msgstr ""
+
+msgid "Runners|Runner"
+msgstr ""
+
+msgid "Runners|Runner #%{runner_id}"
+msgstr ""
+
+msgid "Runners|Runner %{name} was deleted"
+msgstr ""
+
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner registration"
+msgstr ""
+
+msgid "Runners|Runner statuses"
+msgstr ""
+
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
+msgid "Runners|Runners"
+msgstr ""
+
+msgid "Runners|Runners are the agents that run your CI/CD jobs. Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
+msgstr ""
+
+msgid "Runners|Runs untagged jobs"
+msgstr ""
+
+msgid "Runners|Select projects to assign to this runner"
+msgstr ""
+
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
+msgstr ""
+
+msgid "Runners|Show runner installation and registration instructions"
+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|Stale"
+msgstr ""
+
+msgid "Runners|Stale runners"
+msgstr ""
+
+msgid "Runners|Stale:"
+msgstr ""
+
+msgid "Runners|Status"
+msgstr ""
+
+msgid "Runners|Stop the runner from accepting new jobs."
+msgstr ""
+
+msgid "Runners|Tags"
+msgstr ""
+
+msgid "Runners|Take me there!"
+msgstr ""
+
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
+msgstr ""
+
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This group currently has 1 stale runner."
+msgid_plural "Runners|This group currently has %d stale runners."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|This group currently has no stale runners."
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
+msgstr ""
+
+msgid "Runners|This runner is available to all projects and subgroups in a group."
+msgstr ""
+
+msgid "Runners|This runner is outdated, an upgrade is recommended"
+msgstr ""
+
+msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
+msgstr ""
+
+msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
+msgstr ""
+
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
+msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
+msgstr ""
+
+msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
+msgstr ""
+
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Use the runner on pipelines for protected branches only."
+msgstr ""
+
+msgid "Runners|Value"
+msgstr ""
+
+msgid "Runners|Version"
+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."
+msgstr ""
+
+msgid "Runners|Yes, start deleting stale runners"
+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 ""
+
+msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
+msgstr ""
+
+msgid "Runners|active"
+msgstr ""
+
+msgid "Runners|group"
+msgstr ""
+
+msgid "Runners|never contacted"
+msgstr ""
+
+msgid "Runners|offline"
+msgstr ""
+
+msgid "Runners|online"
+msgstr ""
+
+msgid "Runners|paused"
+msgstr ""
+
+msgid "Runners|shared"
+msgstr ""
+
+msgid "Runners|specific"
+msgstr ""
+
+msgid "Runners|stale"
+msgstr ""
+
+msgid "Runners|upgrade available"
+msgstr ""
+
+msgid "Runners|upgrade recommended"
+msgstr ""
+
+msgid "Running"
+msgstr ""
+
+msgid "Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects."
+msgstr ""
+
+msgid "SAML"
+msgstr ""
+
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML discovery tokens"
+msgstr ""
+
+msgid "SAML for %{group_name}"
+msgstr ""
+
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
+msgid "SAST Configuration"
+msgstr ""
+
+msgid "SHA256"
+msgstr ""
+
+msgid "SSH Key"
+msgstr ""
+
+msgid "SSH Keys"
+msgstr ""
+
+msgid "SSH Keys Help"
+msgstr ""
+
+msgid "SSH host key fingerprints"
+msgstr ""
+
+msgid "SSH host keys"
+msgstr ""
+
+msgid "SSH host keys are not available on this system. Please use %{ssh_keyscan} command or contact your GitLab administrator for more information."
+msgstr ""
+
+msgid "SSH key"
+msgstr ""
+
+msgid "SSH keys"
+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 ""
+
+msgid "SSL Verification:"
+msgstr ""
+
+msgid "SSL verification"
+msgstr ""
+
+msgid "Satisfied"
+msgstr ""
+
+msgid "Saturday"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Save %{name} size limits"
+msgstr ""
+
+msgid "Save Changes"
+msgstr ""
+
+msgid "Save application"
+msgstr ""
+
+msgid "Save changes"
+msgstr ""
+
+msgid "Save changes before testing"
+msgstr ""
+
+msgid "Save comment"
+msgstr ""
+
+msgid "Save deploy freeze"
+msgstr ""
+
+msgid "Save internal note"
+msgstr ""
+
+msgid "Save password"
+msgstr ""
+
+msgid "Save pipeline schedule"
+msgstr ""
+
+msgid "Saving"
+msgstr ""
+
+msgid "Saving project."
+msgstr ""
+
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
+msgstr ""
+
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
+msgstr ""
+
+msgid "ScanResultPolicy|add an approver"
+msgstr ""
+
+msgid "ScanResultPolicy|scanners"
+msgstr ""
+
+msgid "ScanResultPolicy|severity levels"
+msgstr ""
+
+msgid "ScanResultPolicy|vulnerability states"
+msgstr ""
+
+msgid "Scanner"
+msgstr ""
+
+msgid "Scanner profile failed to delete"
+msgstr ""
+
+msgid "Scanner profile not found for given parameters"
+msgstr ""
+
+msgid "Schedule a new pipeline"
+msgstr ""
+
+msgid "Schedule-based escalation rules must have a schedule in the same project as the policy"
+msgstr ""
+
+msgid "Scheduled"
+msgstr ""
+
+msgid "Scheduled Deletion At - %{permanent_deletion_time}"
+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 ""
+
+msgid "Schedules"
+msgstr ""
+
+msgid "Schedules to merge this merge request (%{strategy})."
+msgstr ""
+
+msgid "Scheduling Pipelines"
+msgstr ""
+
+msgid "Scope"
+msgstr ""
+
+msgid "Scope board to current iteration"
+msgstr ""
+
+msgid "Scopes"
+msgstr ""
+
+msgid "Scopes (select at least one)"
+msgstr ""
+
+msgid "Scopes can't be blank"
+msgstr ""
+
+msgid "Scopes: %{scope_list}"
+msgstr ""
+
+msgid "Scroll down"
+msgstr ""
+
+msgid "Scroll left"
+msgstr ""
+
+msgid "Scroll right"
+msgstr ""
+
+msgid "Scroll to bottom"
+msgstr ""
+
+msgid "Scroll to top"
+msgstr ""
+
+msgid "Scroll up"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+msgid "Search GitLab"
+msgstr ""
+
+msgid "Search a group"
+msgstr ""
+
+msgid "Search an environment spec"
+msgstr ""
+
+msgid "Search assignees"
+msgstr ""
+
+msgid "Search authors"
+msgstr ""
+
+msgid "Search branches"
+msgstr ""
+
+msgid "Search branches and tags"
+msgstr ""
+
+msgid "Search branches, tags, and commits"
+msgstr ""
+
+msgid "Search by Git revision"
+msgstr ""
+
+msgid "Search by author"
+msgstr ""
+
+msgid "Search by commit title or SHA"
+msgstr ""
+
+msgid "Search by message"
+msgstr ""
+
+msgid "Search by name"
+msgstr ""
+
+msgid "Search files"
+msgstr ""
+
+msgid "Search for Namespace"
+msgstr ""
+
+msgid "Search for a LDAP group"
+msgstr ""
+
+msgid "Search for a group"
+msgstr ""
+
+msgid "Search for a user"
+msgstr ""
+
+msgid "Search for an emoji"
+msgstr ""
+
+msgid "Search for projects, issues, etc."
+msgstr ""
+
+msgid "Search for this text"
+msgstr ""
+
+msgid "Search forks"
+msgstr ""
+
+msgid "Search groups"
+msgstr ""
+
+msgid "Search iterations"
+msgstr ""
+
+msgid "Search labels"
+msgstr ""
+
+msgid "Search merge requests"
+msgstr ""
+
+msgid "Search milestones"
+msgstr ""
+
+msgid "Search or create tag"
+msgstr ""
+
+msgid "Search or filter results..."
+msgstr ""
+
+msgid "Search or filter results…"
+msgstr ""
+
+msgid "Search page"
+msgstr ""
+
+msgid "Search project"
+msgstr ""
+
+msgid "Search projects"
+msgstr ""
+
+msgid "Search projects..."
+msgstr ""
+
+msgid "Search rate limits"
+msgstr ""
+
+msgid "Search refs"
+msgstr ""
+
+msgid "Search requirements"
+msgstr ""
+
+msgid "Search settings"
+msgstr ""
+
+msgid "Search users"
+msgstr ""
+
+msgid "Search users or groups"
+msgstr ""
+
+msgid "Search your project dependencies for their licenses and apply policies."
+msgstr ""
+
+msgid "Search your projects"
+msgstr ""
+
+msgid "SearchAutocomplete|All GitLab"
+msgstr ""
+
+msgid "SearchAutocomplete|Issues I've created"
+msgstr ""
+
+msgid "SearchAutocomplete|Issues assigned to me"
+msgstr ""
+
+msgid "SearchAutocomplete|Merge requests I've created"
+msgstr ""
+
+msgid "SearchAutocomplete|Merge requests assigned to me"
+msgstr ""
+
+msgid "SearchAutocomplete|Merge requests that I'm a reviewer"
+msgstr ""
+
+msgid "SearchAutocomplete|in all GitLab"
+msgstr ""
+
+msgid "SearchAutocomplete|in group %{groupName}"
+msgstr ""
+
+msgid "SearchAutocomplete|in project %{projectName}"
+msgstr ""
+
+msgid "SearchCodeResults|of %{link_to_project}"
+msgstr ""
+
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
+msgstr ""
+
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
+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 ""
+
+msgid "SearchResults|code result"
+msgid_plural "SearchResults|code results"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|comment"
+msgid_plural "SearchResults|comments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|commit"
+msgid_plural "SearchResults|commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|epic"
+msgid_plural "SearchResults|epics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|issue"
+msgid_plural "SearchResults|issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|merge request"
+msgid_plural "SearchResults|merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|milestone"
+msgid_plural "SearchResults|milestones"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|project"
+msgid_plural "SearchResults|projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|snippet"
+msgid_plural "SearchResults|snippets"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|user"
+msgid_plural "SearchResults|users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|wiki result"
+msgid_plural "SearchResults|wiki results"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Searching by both author and message is currently not supported."
+msgstr ""
+
+msgid "Seats"
+msgstr ""
+
+msgid "Seats owed"
+msgstr ""
+
+msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
+msgstr ""
+
+msgid "Seats usage data is updated every day at 12:00pm UTC"
+msgstr ""
+
+msgid "Secondary email:"
+msgstr ""
+
+msgid "Seconds"
+msgstr ""
+
+msgid "Secret"
+msgstr ""
+
+msgid "Secret Detection"
+msgstr ""
+
+msgid "Secret token"
+msgstr ""
+
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure token that identifies an external storage request."
+msgstr ""
+
+msgid "SecureFiles|Delete %{name}?"
+msgstr ""
+
+msgid "SecureFiles|Delete secure file"
+msgstr ""
+
+msgid "SecureFiles|Secure File %{name} will be permanently deleted. Are you sure?"
+msgstr ""
+
+msgid "Security"
+msgstr ""
+
+msgid "Security & Compliance"
+msgstr ""
+
+msgid "Security Configuration"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security dashboard"
+msgstr ""
+
+msgid "Security navigation"
+msgstr ""
+
+msgid "Security report is out of date. Please update your branch with the latest changes from the target branch (%{targetBranchName})"
+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 test coverage declines."
+msgstr ""
+
+msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
+msgstr ""
+
+msgid "SecurityApprovals|Coverage-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about Coverage-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about License-Check"
+msgstr ""
+
+msgid "SecurityApprovals|License-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+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 ""
+
+msgid "SecurityConfiguration|Available with Ultimate"
+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|Compliance"
+msgstr ""
+
+msgid "SecurityConfiguration|Configuration guide"
+msgstr ""
+
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
+msgid "SecurityConfiguration|Configure %{feature}"
+msgstr ""
+
+msgid "SecurityConfiguration|Configure with a 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 ""
+
+msgid "SecurityConfiguration|Create merge request"
+msgstr ""
+
+msgid "SecurityConfiguration|Customize common SAST 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 %{linkStart}GitLab SAST documentation%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Enable %{feature}"
+msgstr ""
+
+msgid "SecurityConfiguration|Enable Auto DevOps"
+msgstr ""
+
+msgid "SecurityConfiguration|Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
+msgstr ""
+
+msgid "SecurityConfiguration|Enabled"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups"
+msgstr ""
+
+msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
+msgstr ""
+
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
+msgstr ""
+
+msgid "SecurityConfiguration|Manage profiles"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
+msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
+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 ""
+
+msgid "SecurityConfiguration|SAST Analyzers"
+msgstr ""
+
+msgid "SecurityConfiguration|SAST Configuration"
+msgstr ""
+
+msgid "SecurityConfiguration|Secure your project"
+msgstr ""
+
+msgid "SecurityConfiguration|Security testing"
+msgstr ""
+
+msgid "SecurityConfiguration|Security training"
+msgstr ""
+
+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}"
+msgstr ""
+
+msgid "SecurityConfiguration|Vulnerability Management"
+msgstr ""
+
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
+msgstr ""
+
+msgid "SecurityOrchestration| and "
+msgstr ""
+
+msgid "SecurityOrchestration| or "
+msgstr ""
+
+msgid "SecurityOrchestration|%{branches} %{plural}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
+msgid "SecurityOrchestration|+%{count} more"
+msgstr ""
+
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
+msgid "SecurityOrchestration|.yaml preview"
+msgstr ""
+
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
+msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
+msgstr ""
+
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
+msgstr ""
+
+msgid "SecurityOrchestration|All policies"
+msgstr ""
+
+msgid "SecurityOrchestration|An error occurred assigning your security policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|An error occurred unassigning your security policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|An error occurred while fetching the scan result policies."
+msgstr ""
+
+msgid "SecurityOrchestration|Any scanner finds"
+msgstr ""
+
+msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
+msgstr ""
+
+msgid "SecurityOrchestration|Choose a project"
+msgstr ""
+
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
+msgstr ""
+
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Empty policy name"
+msgstr ""
+
+msgid "SecurityOrchestration|Enabled"
+msgstr ""
+
+msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
+msgid "SecurityOrchestration|Inherited from %{namespace}"
+msgstr ""
+
+msgid "SecurityOrchestration|Invalid policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Latest scan run against %{agent}"
+msgstr ""
+
+msgid "SecurityOrchestration|New policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
+msgid "SecurityOrchestration|No actions defined - policy will not run."
+msgstr ""
+
+msgid "SecurityOrchestration|No description"
+msgstr ""
+
+msgid "SecurityOrchestration|No rules defined - policy will not run."
+msgstr ""
+
+msgid "SecurityOrchestration|Not enabled"
+msgstr ""
+
+msgid "SecurityOrchestration|Only owners can update Security Policy Project"
+msgstr ""
+
+msgid "SecurityOrchestration|Policies"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy Type"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy cannot be enabled for non-existing branches (%{branches})"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy editor"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy status"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
+msgstr ""
+
+msgid "SecurityOrchestration|Rule mode"
+msgstr ""
+
+msgid "SecurityOrchestration|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
+msgstr ""
+
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
+msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
+msgstr ""
+
+msgid "SecurityOrchestration|Runs a %{action} scan"
+msgstr ""
+
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan Execution"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan Result"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan result"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
+msgstr ""
+
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan to be performed %{cadence}"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan to be performed %{cadence} on the %{branches}"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
+msgstr ""
+
+msgid "SecurityOrchestration|Security Approvals"
+msgstr ""
+
+msgid "SecurityOrchestration|Security policy project was linked successfully"
+msgstr ""
+
+msgid "SecurityOrchestration|Security policy project was unlinked successfully"
+msgstr ""
+
+msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Select security project"
+msgstr ""
+
+msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
+msgstr ""
+
+msgid "SecurityOrchestration|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "SecurityOrchestration|Source"
+msgstr ""
+
+msgid "SecurityOrchestration|Status"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
+msgstr ""
+
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgstr ""
+
+msgid "SecurityOrchestration|There was a problem creating the new security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|This group"
+msgstr ""
+
+msgid "SecurityOrchestration|This is a group-level policy"
+msgstr ""
+
+msgid "SecurityOrchestration|This is a project-level policy"
+msgstr ""
+
+msgid "SecurityOrchestration|This policy is inherited from %{namespace}"
+msgstr ""
+
+msgid "SecurityOrchestration|This policy is inherited from the %{linkStart}namespace%{linkEnd} and must be edited there"
+msgstr ""
+
+msgid "SecurityOrchestration|This project"
+msgstr ""
+
+msgid "SecurityOrchestration|This project does not contain any security policies."
+msgstr ""
+
+msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
+msgstr ""
+
+msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
+msgstr ""
+
+msgid "SecurityOrchestration|Unlink project"
+msgstr ""
+
+msgid "SecurityOrchestration|Unlinking a security project removes all policies stored in the linked security project. Save to confirm this action."
+msgstr ""
+
+msgid "SecurityOrchestration|Update scan policies"
+msgstr ""
+
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|You don't have any security policies yet"
+msgstr ""
+
+msgid "SecurityOrchestration|a"
+msgstr ""
+
+msgid "SecurityOrchestration|all branches"
+msgstr ""
+
+msgid "SecurityOrchestration|an"
+msgstr ""
+
+msgid "SecurityOrchestration|branch"
+msgstr ""
+
+msgid "SecurityOrchestration|branches"
+msgstr ""
+
+msgid "SecurityOrchestration|scanner finds"
+msgstr ""
+
+msgid "SecurityOrchestration|scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|the %{branches}"
+msgstr ""
+
+msgid "SecurityOrchestration|vulnerabilities"
+msgstr ""
+
+msgid "SecurityOrchestration|vulnerability"
+msgstr ""
+
+msgid "SecurityReports|%{count} Selected"
+msgstr ""
+
+msgid "SecurityReports|%{count}+ projects"
+msgstr ""
+
+msgid "SecurityReports|%{firstProject} and %{secondProject}"
+msgstr ""
+
+msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
+msgstr ""
+
+msgid "SecurityReports|Add or remove projects to monitor in the security area. Projects included in this list will have their results displayed in the security dashboard and vulnerability report."
+msgstr ""
+
+msgid "SecurityReports|Add projects"
+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 ""
+
+msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|Cluster"
+msgstr ""
+
+msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Comment deleted on '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Configure security testing"
+msgstr ""
+
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
+msgid "SecurityReports|Create issue"
+msgstr ""
+
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
+msgid "SecurityReports|Dismiss vulnerability"
+msgstr ""
+
+msgid "SecurityReports|Dismissed '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Dismissed '%{vulnerabilityName}'. Turn off the hide dismissed toggle to view."
+msgstr ""
+
+msgid "SecurityReports|Download %{artifactName}"
+msgstr ""
+
+msgid "SecurityReports|Download results"
+msgstr ""
+
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
+msgid "SecurityReports|Either you don't have permission to view this dashboard or the dashboard has not been setup. Please check your permission settings with your administrator or check your dashboard configurations to proceed."
+msgstr ""
+
+msgid "SecurityReports|Ensure that %{trackingStart}issue tracking%{trackingEnd} is enabled for this project and you have %{permissionsStart}permission to create new issues%{permissionsEnd}."
+msgstr ""
+
+msgid "SecurityReports|Error fetching the vulnerabilities over time. Please check your network connection and try again."
+msgstr ""
+
+msgid "SecurityReports|Error fetching the vulnerability counts. Please check your network connection and try again."
+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 ""
+
+msgid "SecurityReports|Hide dismissed"
+msgstr ""
+
+msgid "SecurityReports|Issue Created"
+msgstr ""
+
+msgid "SecurityReports|Issues created from a vulnerability cannot be removed."
+msgstr ""
+
+msgid "SecurityReports|Learn more about setting up your dashboard"
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in projects within your group. Vulnerabilities in projects are shown here when security testing is configured."
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in your project. Vulnerabilities are shown here when security testing is configured."
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in your selected projects. Vulnerabilities for selected projects with security testing configured are shown here."
+msgstr ""
+
+msgid "SecurityReports|Maximum selected projects limit reached"
+msgstr ""
+
+msgid "SecurityReports|Monitor vulnerabilities in all of your projects"
+msgstr ""
+
+msgid "SecurityReports|Monitor vulnerabilities in your group"
+msgstr ""
+
+msgid "SecurityReports|Monitor vulnerabilities in your project"
+msgstr ""
+
+msgid "SecurityReports|Monitored projects"
+msgstr ""
+
+msgid "SecurityReports|More info"
+msgstr ""
+
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
+msgid "SecurityReports|No vulnerabilities found"
+msgstr ""
+
+msgid "SecurityReports|No vulnerabilities found for this pipeline"
+msgstr ""
+
+msgid "SecurityReports|Oops, something doesn't seem right."
+msgstr ""
+
+msgid "SecurityReports|Operational vulnerabilities"
+msgstr ""
+
+msgid "SecurityReports|Project"
+msgstr ""
+
+msgid "SecurityReports|Project was not found or you do not have permission to add this project to Security Dashboards."
+msgstr ""
+
+msgid "SecurityReports|Projects added"
+msgstr ""
+
+msgid "SecurityReports|Remove project from dashboard"
+msgstr ""
+
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
+msgid "SecurityReports|Results show vulnerabilities introduced by the merge request, in addition to existing vulnerabilities from the latest successful pipeline in your project's default branch."
+msgstr ""
+
+msgid "SecurityReports|Scan details"
+msgstr ""
+
+msgid "SecurityReports|Security Dashboard"
+msgstr ""
+
+msgid "SecurityReports|Security reports can only be accessed by authorized users."
+msgstr ""
+
+msgid "SecurityReports|Security reports help page link"
+msgstr ""
+
+msgid "SecurityReports|Security scans have run"
+msgstr ""
+
+msgid "SecurityReports|Select a project to add by using the project search field above."
+msgstr ""
+
+msgid "SecurityReports|Set status"
+msgstr ""
+
+msgid "SecurityReports|Severity"
+msgstr ""
+
+msgid "SecurityReports|Show %{pageSize} items"
+msgstr ""
+
+msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
+msgstr ""
+
+msgid "SecurityReports|Sorry, your filter produced no results"
+msgstr ""
+
+msgid "SecurityReports|Status"
+msgstr ""
+
+msgid "SecurityReports|Submit vulnerability"
+msgstr ""
+
+msgid "SecurityReports|Take survey"
+msgstr ""
+
+msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
+msgstr ""
+
+msgid "SecurityReports|There was an error adding the comment."
+msgstr ""
+
+msgid "SecurityReports|There was an error creating the issue."
+msgstr ""
+
+msgid "SecurityReports|There was an error creating the merge request."
+msgstr ""
+
+msgid "SecurityReports|There was an error deleting the comment."
+msgstr ""
+
+msgid "SecurityReports|There was an error dismissing the vulnerabilities."
+msgstr ""
+
+msgid "SecurityReports|There was an error dismissing the vulnerability."
+msgstr ""
+
+msgid "SecurityReports|There was an error reverting the dismissal."
+msgstr ""
+
+msgid "SecurityReports|There was an error reverting this dismissal."
+msgstr ""
+
+msgid "SecurityReports|There was an error while generating the report."
+msgstr ""
+
+msgid "SecurityReports|These vulnerabilities were detected in external sources. They are not necessarily tied to your GitLab project. For example, running containers, URLs, and so on."
+msgstr ""
+
+msgid "SecurityReports|To widen your search, change or remove filters above"
+msgstr ""
+
+msgid "SecurityReports|Tool"
+msgstr ""
+
+msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
+msgstr ""
+
+msgid "SecurityReports|Undo dismiss"
+msgstr ""
+
+msgid "SecurityReports|Upgrade to interact, track and shift left with vulnerability management features in the UI."
+msgstr ""
+
+msgid "SecurityReports|Upgrade to manage vulnerabilities"
+msgstr ""
+
+msgid "SecurityReports|Vulnerability Management feature survey"
+msgstr ""
+
+msgid "SecurityReports|Vulnerability Report"
+msgstr ""
+
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
+msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
+msgstr ""
+
+msgid "SecurityReports|With issues"
+msgstr ""
+
+msgid "SecurityReports|You do not have sufficient permissions to access this report"
+msgstr ""
+
+msgid "SecurityReports|You must sign in as an authorized user to see this report"
+msgstr ""
+
+msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
+msgstr ""
+
+msgid "SecurityReports|scanned resources"
+msgstr ""
+
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
+msgid "See example DevOps Score page in our documentation."
+msgstr ""
+
+msgid "See metrics"
+msgstr ""
+
+msgid "See our website for help"
+msgstr ""
+
+msgid "See the affected projects in the GitLab admin panel"
+msgstr ""
+
+msgid "See vulnerability %{vulnerability_link} for any Remediation details."
+msgstr ""
+
+msgid "See vulnerability %{vulnerability_link} for any Solution details."
+msgstr ""
+
+msgid "Select"
+msgstr ""
+
+msgid "Select Archive Format"
+msgstr ""
+
+msgid "Select Git revision"
+msgstr ""
+
+msgid "Select Page"
+msgstr ""
+
+msgid "Select Profile"
+msgstr ""
+
+msgid "Select a branch"
+msgstr ""
+
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
+msgstr ""
+
+msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
+msgstr ""
+
+msgid "Select a label"
+msgstr ""
+
+msgid "Select a milestone"
+msgstr ""
+
+msgid "Select a new namespace"
+msgstr ""
+
+msgid "Select a project"
+msgstr ""
+
+msgid "Select a reason"
+msgstr ""
+
+msgid "Select a repository containing templates for common files."
+msgstr ""
+
+msgid "Select a role"
+msgstr ""
+
+msgid "Select a template repository"
+msgstr ""
+
+msgid "Select a template type"
+msgstr ""
+
+msgid "Select a time zone"
+msgstr ""
+
+msgid "Select a timezone"
+msgstr ""
+
+msgid "Select all"
+msgstr ""
+
+msgid "Select an assignee"
+msgstr ""
+
+msgid "Select an iteration"
+msgstr ""
+
+msgid "Select assignee"
+msgstr ""
+
+msgid "Select assignee(s)"
+msgstr ""
+
+msgid "Select branch"
+msgstr ""
+
+msgid "Select branches"
+msgstr ""
+
+msgid "Select due date"
+msgstr ""
+
+msgid "Select epic"
+msgstr ""
+
+msgid "Select group"
+msgstr ""
+
+msgid "Select group or project"
+msgstr ""
+
+msgid "Select health status"
+msgstr ""
+
+msgid "Select iteration"
+msgstr ""
+
+msgid "Select label"
+msgstr ""
+
+msgid "Select labels"
+msgstr ""
+
+msgid "Select merge moment"
+msgstr ""
+
+msgid "Select milestone"
+msgstr ""
+
+msgid "Select private project"
+msgstr ""
+
+msgid "Select project"
+msgstr ""
+
+msgid "Select project to create %{type}"
+msgstr ""
+
+msgid "Select project to create issue"
+msgstr ""
+
+msgid "Select projects"
+msgstr ""
+
+msgid "Select reviewer(s)"
+msgstr ""
+
+msgid "Select source"
+msgstr ""
+
+msgid "Select source branch"
+msgstr ""
+
+msgid "Select source project"
+msgstr ""
+
+msgid "Select start date"
+msgstr ""
+
+msgid "Select status"
+msgstr ""
+
+msgid "Select strategy activation method"
+msgstr ""
+
+msgid "Select subgroup"
+msgstr ""
+
+msgid "Select subscription"
+msgstr ""
+
+msgid "Select target branch"
+msgstr ""
+
+msgid "Select target branch or tag"
+msgstr ""
+
+msgid "Select target project"
+msgstr ""
+
+msgid "Select timezone"
+msgstr ""
+
+msgid "Select type"
+msgstr ""
+
+msgid "Selected"
+msgstr ""
+
+msgid "Selected commits"
+msgstr ""
+
+msgid "Selected for all items."
+msgstr ""
+
+msgid "Selected for some items."
+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 ""
+
+msgid "Selected projects"
+msgstr ""
+
+msgid "Selected tag is already in use. Choose another option."
+msgstr ""
+
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By %{link_open}@johnsmith%{link_close}\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Self monitoring"
+msgstr ""
+
+msgid "Self monitoring project does not exist"
+msgstr ""
+
+msgid "Self-monitoring project does not exist. Please check logs for any error messages"
+msgstr ""
+
+msgid "Self-monitoring project has been successfully deleted"
+msgstr ""
+
+msgid "Self-monitoring project was not deleted. Please check logs for any error messages"
+msgstr ""
+
+msgid "SelfMonitoring|Activate or deactivate instance self monitoring."
+msgstr ""
+
+msgid "SelfMonitoring|Activate self monitoring to create a project to use to monitor the health of your instance."
+msgstr ""
+
+msgid "SelfMonitoring|Deactivate self monitoring?"
+msgstr ""
+
+msgid "SelfMonitoring|Deactivating self monitoring deletes the self monitoring project. Are you sure you want to deactivate self monitoring and delete the project?"
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring"
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring is active. Use the %{projectLinkStart}self monitoring project%{projectLinkEnd} to monitor the health of your instance."
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring project successfully created."
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring project successfully deleted."
+msgstr ""
+
+msgid "Send"
+msgstr ""
+
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
+
+msgid "Send confirmation email"
+msgstr ""
+
+msgid "Send email"
+msgstr ""
+
+msgid "Send email in multipart format (HTML and plain text). Uncheck to send email messages in plain text only."
+msgstr ""
+
+msgid "Send email notification"
+msgstr ""
+
+msgid "Send emails to help guide new users through the onboarding process."
+msgstr ""
+
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
+msgid "Send message"
+msgstr ""
+
+msgid "Send notifications about project events to Mattermost channels."
+msgstr ""
+
+msgid "Send notifications about project events to Mattermost channels. %{docs_link}"
+msgstr ""
+
+msgid "Send notifications about project events to a Discord channel. %{docs_link}"
+msgstr ""
+
+msgid "Send report"
+msgstr ""
+
+msgid "Send service data"
+msgstr ""
+
+msgid "Sentry"
+msgstr ""
+
+msgid "Sentry API URL"
+msgstr ""
+
+msgid "Sentry event"
+msgstr ""
+
+msgid "Sep"
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "SeriesFinalConjunction|and"
+msgstr ""
+
+msgid "Serve repository static objects (for example, archives and blobs) from external storage."
+msgstr ""
+
+msgid "Server (optional)"
+msgstr ""
+
+msgid "Server supports batch API only, please update your Git LFS client to version 1.0.1 and up."
+msgstr ""
+
+msgid "Server version"
+msgstr ""
+
+msgid "Service"
+msgstr ""
+
+msgid "Service Account"
+msgstr ""
+
+msgid "Service Account Key"
+msgstr ""
+
+msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
+msgstr ""
+
+msgid "Service Desk"
+msgstr ""
+
+msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
+msgstr ""
+
+msgid "Service Ping payload not found in the application cache"
+msgstr ""
+
+msgid "Service account generated successfully"
+msgstr ""
+
+msgid "Service accounts"
+msgstr ""
+
+msgid "Service usage data"
+msgstr ""
+
+msgid "ServiceDesk|Enable Service Desk"
+msgstr ""
+
+msgid "ServiceDesk|For help setting up the Service Desk for your instance, please contact an administrator."
+msgstr ""
+
+msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
+msgstr ""
+
+msgid "ServiceDesk|Service Desk is not enabled"
+msgstr ""
+
+msgid "ServiceDesk|Service Desk is not supported"
+msgstr ""
+
+msgid "ServiceDesk|To enable Service Desk on this instance, an instance administrator must first set up incoming email."
+msgstr ""
+
+msgid "ServiceDesk|Use Service Desk to connect with your users and offer customer support through email right inside GitLab"
+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 "Services"
+msgstr ""
+
+msgid "Session ID"
+msgstr ""
+
+msgid "Session duration (minutes)"
+msgstr ""
+
+msgid "Set %{epic_ref} as the parent epic."
+msgstr ""
+
+msgid "Set a default description template to be used for new issues. %{link_start}What are description templates?%{link_end}"
+msgstr ""
+
+msgid "Set a password on your account to pull or push via %{protocol}."
+msgstr ""
+
+msgid "Set access permissions for this token."
+msgstr ""
+
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
+msgid "Set due date"
+msgstr ""
+
+msgid "Set health status"
+msgstr ""
+
+msgid "Set health status to %{health_status}."
+msgstr ""
+
+msgid "Set iteration"
+msgstr ""
+
+msgid "Set limit to 0 to allow any file size."
+msgstr ""
+
+msgid "Set limits for web and API requests."
+msgstr ""
+
+msgid "Set milestone"
+msgstr ""
+
+msgid "Set new password"
+msgstr ""
+
+msgid "Set parent epic to an epic"
+msgstr ""
+
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
+msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
+msgstr ""
+
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
+msgid "Set severity"
+msgstr ""
+
+msgid "Set sign-in restrictions for all users."
+msgstr ""
+
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
+msgid "Set target branch"
+msgstr ""
+
+msgid "Set target branch to %{branch_name}."
+msgstr ""
+
+msgid "Set the Ready status"
+msgstr ""
+
+msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
+msgstr ""
+
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
+msgid "Set the due date to %{due_date}."
+msgstr ""
+
+msgid "Set the iteration to %{iteration_reference}."
+msgstr ""
+
+msgid "Set the maximum number of slices allowed to run concurrently during Elasticsearch reindexing. Learn more about %{max_slices_running_link_start}maximum running slices configuration%{max_slices_link_end}."
+msgstr ""
+
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
+msgid "Set the milestone to %{milestone_reference}."
+msgstr ""
+
+msgid "Set the per-user rate limit for getting a user by ID via the API."
+msgstr ""
+
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
+msgid "Set time estimate"
+msgstr ""
+
+msgid "Set time estimate to %{time_estimate}."
+msgstr ""
+
+msgid "Set to 0 for no size limit."
+msgstr ""
+
+msgid "Set up CI/CD"
+msgstr ""
+
+msgid "Set up Jira Integration"
+msgstr ""
+
+msgid "Set up a %{type} runner for a project"
+msgstr ""
+
+msgid "Set up a hardware device as a second factor to sign in."
+msgstr ""
+
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
+msgid "Set up new device"
+msgstr ""
+
+msgid "Set up new password"
+msgstr ""
+
+msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
+msgstr ""
+
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
+msgid "Set weight"
+msgstr ""
+
+msgid "Set weight to %{weight}."
+msgstr ""
+
+msgid "SetStatusModal|An indicator appears next to your name and avatar"
+msgstr ""
+
+msgid "SetStatusModal|Busy"
+msgstr ""
+
+msgid "SetStatusModal|Clear status"
+msgstr ""
+
+msgid "SetStatusModal|Clear status after"
+msgstr ""
+
+msgid "SetStatusModal|Edit status"
+msgstr ""
+
+msgid "SetStatusModal|Remove status"
+msgstr ""
+
+msgid "SetStatusModal|Set a status"
+msgstr ""
+
+msgid "SetStatusModal|Set status"
+msgstr ""
+
+msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try again later."
+msgstr ""
+
+msgid "SetStatusModal|Status updated"
+msgstr ""
+
+msgid "SetStatusModal|What's your status?"
+msgstr ""
+
+msgid "SetStatusModal|Your status resets on %{date}."
+msgstr ""
+
+msgid "Sets %{epic_ref} as parent epic."
+msgstr ""
+
+msgid "Sets health status to %{health_status}."
+msgstr ""
+
+msgid "Sets target branch to %{branch_name}."
+msgstr ""
+
+msgid "Sets the due date to %{due_date}."
+msgstr ""
+
+msgid "Sets the iteration to %{iteration_reference}."
+msgstr ""
+
+msgid "Sets the milestone to %{milestone_reference}."
+msgstr ""
+
+msgid "Sets the severity"
+msgstr ""
+
+msgid "Sets time estimate to %{time_estimate}."
+msgstr ""
+
+msgid "Sets weight to %{weight}."
+msgstr ""
+
+msgid "Setting"
+msgstr ""
+
+msgid "Setting enforced"
+msgstr ""
+
+msgid "Setting saved successfully"
+msgid_plural "Settings saved successfully"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Settings"
+msgstr ""
+
+msgid "Settings|Unable to load the merge request options settings. Try reloading the page."
+msgstr ""
+
+msgid "Setup"
+msgstr ""
+
+msgid "Severity"
+msgstr ""
+
+msgid "Severity updated to %{severity}."
+msgstr ""
+
+msgid "SeverityWidget|Severity"
+msgstr ""
+
+msgid "SeverityWidget|Severity: %{severity}"
+msgstr ""
+
+msgid "SeverityWidget|There was an error while updating severity."
+msgstr ""
+
+msgid "Share"
+msgstr ""
+
+msgid "Share the %{strong_open}GitLab single sign-on URL%{strong_close} with members so they can sign in to your group through your identity provider"
+msgstr ""
+
+msgid "Shared Runners"
+msgstr ""
+
+msgid "Shared projects"
+msgstr ""
+
+msgid "Shared runners"
+msgstr ""
+
+msgid "Shared runners are disabled for the parent group"
+msgstr ""
+
+msgid "Shared runners are disabled on group level"
+msgstr ""
+
+msgid "Shared runners details"
+msgstr ""
+
+msgid "Shared runners enabled cannot be enabled until a valid credit card is on file"
+msgstr ""
+
+msgid "Shared runners help link"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Shimo|Go to Shimo Workspace"
+msgstr ""
+
+msgid "Shimo|Link to a Shimo Workspace from the sidebar."
+msgstr ""
+
+msgid "Shimo|Shimo"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace URL"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace integration is enabled"
+msgstr ""
+
+msgid "Shimo|You've enabled the Shimo Workspace integration. You can view your wiki directly in Shimo."
+msgstr ""
+
+msgid "Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{boldStart}will%{boldEnd} lose access to your account."
+msgstr ""
+
+msgid "Show Pipeline ID"
+msgstr ""
+
+msgid "Show Pipeline IID"
+msgstr ""
+
+msgid "Show all %{issuable_type}."
+msgstr ""
+
+msgid "Show all activity"
+msgstr ""
+
+msgid "Show all breadcrumbs"
+msgstr ""
+
+msgid "Show all epics"
+msgstr ""
+
+msgid "Show all issues."
+msgstr ""
+
+msgid "Show all milestones"
+msgstr ""
+
+msgid "Show all test cases."
+msgstr ""
+
+msgid "Show archived projects"
+msgstr ""
+
+msgid "Show archived projects only"
+msgstr ""
+
+msgid "Show closed epics"
+msgstr ""
+
+msgid "Show command"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Show comments on this file"
+msgstr ""
+
+msgid "Show comments only"
+msgstr ""
+
+msgid "Show complete raw log"
+msgstr ""
+
+msgid "Show details"
+msgstr ""
+
+msgid "Show file browser"
+msgstr ""
+
+msgid "Show file contents"
+msgstr ""
+
+msgid "Show group milestones"
+msgstr ""
+
+msgid "Show labels"
+msgstr ""
+
+msgid "Show latest version"
+msgstr ""
+
+msgid "Show list"
+msgstr ""
+
+msgid "Show one file at a time"
+msgstr ""
+
+msgid "Show open epics"
+msgstr ""
+
+msgid "Show project milestones"
+msgstr ""
+
+msgid "Show sub-group milestones"
+msgstr ""
+
+msgid "Show the Closed list"
+msgstr ""
+
+msgid "Show the Open list"
+msgstr ""
+
+msgid "Show thread"
+msgstr ""
+
+msgid "Show whitespace changes"
+msgstr ""
+
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
+msgid "Showing %{conflict}"
+msgstr ""
+
+msgid "Showing %{count} of %{total} projects"
+msgstr ""
+
+msgid "Showing %{count} project"
+msgid_plural "Showing %{count} projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Showing %{limit} of %{total_count} issues. "
+msgstr ""
+
+msgid "Showing %{pageSize} of %{total} %{issuableType}"
+msgstr ""
+
+msgid "Showing all epics"
+msgstr ""
+
+msgid "Showing all issues"
+msgstr ""
+
+msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
+msgstr ""
+
+msgid "Showing graphs based on events of the last %{timerange} days."
+msgstr ""
+
+msgid "Showing last %{size} of log -"
+msgstr ""
+
+msgid "Showing latest version"
+msgstr ""
+
+msgid "Showing version #%{versionNumber}"
+msgstr ""
+
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
+msgid "Side-by-side"
+msgstr ""
+
+msgid "Sidebar|%{name}: %{value}"
+msgstr ""
+
+msgid "Sidebar|Assign health status"
+msgstr ""
+
+msgid "Sidebar|Health status"
+msgstr ""
+
+msgid "Sidebar|No status"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in as a user with the matching email address, add the email to this account, or sign-up for a new account using the matching email."
+msgstr ""
+
+msgid "Sign in preview"
+msgstr ""
+
+msgid "Sign in to \"%{group_name}\""
+msgstr ""
+
+msgid "Sign in to GitLab"
+msgstr ""
+
+msgid "Sign in using smart card"
+msgstr ""
+
+msgid "Sign in via 2FA code"
+msgstr ""
+
+msgid "Sign in with"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
+msgid "Sign in with smart card"
+msgstr ""
+
+msgid "Sign in/Sign up pages"
+msgstr ""
+
+msgid "Sign out"
+msgstr ""
+
+msgid "Sign out & Register"
+msgstr ""
+
+msgid "Sign up"
+msgstr ""
+
+msgid "Sign up now"
+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 ""
+
+msgid "Sign-in page"
+msgstr ""
+
+msgid "Sign-in restrictions"
+msgstr ""
+
+msgid "Sign-in text"
+msgstr ""
+
+msgid "Sign-out page URL"
+msgstr ""
+
+msgid "Sign-up restrictions"
+msgstr ""
+
+msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted the %{link_start}Terms of Use and Privacy Policy%{link_end}"
+msgstr ""
+
+msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted the GitLab %{link_start}Terms of Use and Privacy Policy%{link_end}"
+msgstr ""
+
+msgid "SignUp|First name is too long (maximum is %{max_length} characters)."
+msgstr ""
+
+msgid "SignUp|Last name is too long (maximum is %{max_length} characters)."
+msgstr ""
+
+msgid "SignUp|Minimum length is %{minimum_password_length} characters."
+msgstr ""
+
+msgid "SignUp|Username is too long (maximum is %{max_length} characters)."
+msgstr ""
+
+msgid "SignUp|Username is too short (minimum is %{min_length} characters)."
+msgstr ""
+
+msgid "Signed in"
+msgstr ""
+
+msgid "Signed in to GitLab"
+msgstr ""
+
+msgid "Signed in to GitLab as %{user_link}"
+msgstr ""
+
+msgid "Signed in with %{authentication} authentication"
+msgstr ""
+
+msgid "Signing in using %{label} has been disabled"
+msgstr ""
+
+msgid "Signing in using your %{label} account without a pre-existing GitLab account is not allowed."
+msgstr ""
+
+msgid "Similar issues"
+msgstr ""
+
+msgid "Simulate a pipeline created for the default branch"
+msgstr ""
+
+msgid "Site profile failed to delete"
+msgstr ""
+
+msgid "Site profile not found for given parameters"
+msgstr ""
+
+msgid "Sites"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Size Limits"
+msgstr ""
+
+msgid "Size limit per repository (MB)"
+msgstr ""
+
+msgid "Skip outdated deployment jobs"
+msgstr ""
+
+msgid "Skipped"
+msgstr ""
+
+msgid "Skipped deployment to"
+msgstr ""
+
+msgid "Skype:"
+msgstr ""
+
+msgid "Slack application"
+msgstr ""
+
+msgid "Slack integration allows you to interact with GitLab via slash commands in a chat window."
+msgstr ""
+
+msgid "Slack logo"
+msgstr ""
+
+msgid "SlackIntegration|Are you sure you want to remove this project from the Slack application?"
+msgstr ""
+
+msgid "SlackIntegration|Client ID"
+msgstr ""
+
+msgid "SlackIntegration|Client secret"
+msgstr ""
+
+msgid "SlackIntegration|GitLab for Slack"
+msgstr ""
+
+msgid "SlackIntegration|GitLab for Slack was successfully installed."
+msgstr ""
+
+msgid "SlackIntegration|Install Slack app"
+msgstr ""
+
+msgid "SlackIntegration|Project alias"
+msgstr ""
+
+msgid "SlackIntegration|Reinstall Slack app"
+msgstr ""
+
+msgid "SlackIntegration|Remove project"
+msgstr ""
+
+msgid "SlackIntegration|See the list of available commands in Slack after setting up this integration by entering"
+msgstr ""
+
+msgid "SlackIntegration|Select a GitLab project to link with your Slack workspace."
+msgstr ""
+
+msgid "SlackIntegration|Sends notifications about project events to Slack channels."
+msgstr ""
+
+msgid "SlackIntegration|Signing secret"
+msgstr ""
+
+msgid "SlackIntegration|Team name"
+msgstr ""
+
+msgid "SlackIntegration|This integration allows users to perform common operations on this project by entering slash commands in Slack."
+msgstr ""
+
+msgid "SlackIntegration|Verification token"
+msgstr ""
+
+msgid "SlackIntegration|You can now close this window and go to your Slack workspace."
+msgstr ""
+
+msgid "SlackIntegration|You may need to reinstall the Slack application when we %{linkStart}make updates or change permissions%{linkEnd}."
+msgstr ""
+
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
+msgstr ""
+
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
+msgstr ""
+
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
+msgstr ""
+
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
+msgstr ""
+
+msgid "Slice multiplier"
+msgstr ""
+
+msgid "Smartcard"
+msgstr ""
+
+msgid "Smartcard authentication failed: client certificate header is missing."
+msgstr ""
+
+msgid "Snippet"
+msgstr ""
+
+msgid "Snippets"
+msgstr ""
+
+msgid "Snippets with non-text files can only be edited via Git."
+msgstr ""
+
+msgid "SnippetsEmptyState|Code snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|Documentation"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Store, share, and embed small pieces of code and text."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "Snippets|%{spammable_titlecase} was submitted to Akismet successfully."
+msgstr ""
+
+msgid "Snippets|Add another file %{num}/%{total}"
+msgstr ""
+
+msgid "Snippets|Delete file"
+msgstr ""
+
+msgid "Snippets|Description (optional)"
+msgstr ""
+
+msgid "Snippets|Error with Akismet. Please check the logs for more info."
+msgstr ""
+
+msgid "Snippets|Files"
+msgstr ""
+
+msgid "Snippets|Give your file a name to add code highlighting, e.g. example.rb for Ruby"
+msgstr ""
+
+msgid "Snippets|Optionally add a description about what your snippet does or how to use it…"
+msgstr ""
+
+msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
+msgstr ""
+
+msgid "Snowplow"
+msgstr ""
+
+msgid "Solid"
+msgstr ""
+
+msgid "Solution"
+msgstr ""
+
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
+msgid "Some changes are not shown"
+msgstr ""
+
+msgid "Some child epics may be hidden due to applied filters"
+msgstr ""
+
+msgid "Some common domains are not allowed. %{learn_more_link}."
+msgstr ""
+
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
+msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
+msgid "Someone edited this %{issueType} at the same time you did. The description has been updated and you will need to make your changes again."
+msgstr ""
+
+msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
+msgstr ""
+
+msgid "Someone edited this test case at the same time you did. The description has been updated and you will need to make your changes again."
+msgstr ""
+
+msgid "Someone, hopefully you, has requested to reset the password for your GitLab account on %{link_to_gitlab}."
+msgstr ""
+
+msgid "Something went wrong"
+msgstr ""
+
+msgid "Something went wrong on our end"
+msgstr ""
+
+msgid "Something went wrong on our end."
+msgstr ""
+
+msgid "Something went wrong on our end. Please try again!"
+msgstr ""
+
+msgid "Something went wrong on our end. Please try again."
+msgstr ""
+
+msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
+msgstr ""
+
+msgid "Something went wrong trying to load issue contacts."
+msgstr ""
+
+msgid "Something went wrong when reordering designs. Please try again"
+msgstr ""
+
+msgid "Something went wrong while adding your award. Please try again."
+msgstr ""
+
+msgid "Something went wrong while applying the batch of suggestions. Please try again."
+msgstr ""
+
+msgid "Something went wrong while applying the suggestion. Please try again."
+msgstr ""
+
+msgid "Something went wrong while archiving a requirement."
+msgstr ""
+
+msgid "Something went wrong while closing the epic. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while closing the merge request. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while creating a requirement."
+msgstr ""
+
+msgid "Something went wrong while deleting description changes. Please try again."
+msgstr ""
+
+msgid "Something went wrong while deleting the source branch. Please try again."
+msgstr ""
+
+msgid "Something went wrong while deleting your note. Please try again."
+msgstr ""
+
+msgid "Something went wrong while deploying this environment. Please try again."
+msgstr ""
+
+msgid "Something went wrong while editing your comment. Please try again."
+msgstr ""
+
+msgid "Something went wrong while exporting requirements"
+msgstr ""
+
+msgid "Something went wrong while fetching branches"
+msgstr ""
+
+msgid "Something went wrong while fetching comments. Please try again."
+msgstr ""
+
+msgid "Something went wrong while fetching description changes. Please try again."
+msgstr ""
+
+msgid "Something went wrong while fetching details"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
+msgid "Something went wrong while fetching latest comments."
+msgstr ""
+
+msgid "Something went wrong while fetching projects"
+msgstr ""
+
+msgid "Something went wrong while fetching projects."
+msgstr ""
+
+msgid "Something went wrong while fetching related merge requests."
+msgstr ""
+
+msgid "Something went wrong while fetching requirements count."
+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 ""
+
+msgid "Something went wrong while fetching the packages list."
+msgstr ""
+
+msgid "Something went wrong while initializing the OpenAPI viewer"
+msgstr ""
+
+msgid "Something went wrong while obtaining the Let's Encrypt certificate."
+msgstr ""
+
+msgid "Something went wrong while promoting the issue to an epic. Please try again."
+msgstr ""
+
+msgid "Something went wrong while reopening a requirement."
+msgstr ""
+
+msgid "Something went wrong while reopening the epic. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while reopening the merge request. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while resolving this discussion. Please try again."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} %{dateType} date."
+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 ""
+
+msgid "Something went wrong while updating a requirement."
+msgstr ""
+
+msgid "Something went wrong while updating assignees"
+msgstr ""
+
+msgid "Something went wrong while updating your list settings"
+msgstr ""
+
+msgid "Something went wrong with your automatic subscription renewal."
+msgstr ""
+
+msgid "Something went wrong, unable to add %{project} to dashboard"
+msgstr ""
+
+msgid "Something went wrong, unable to delete project"
+msgstr ""
+
+msgid "Something went wrong, unable to get projects"
+msgstr ""
+
+msgid "Something went wrong, unable to search projects"
+msgstr ""
+
+msgid "Something went wrong. Please try again later"
+msgstr ""
+
+msgid "Something went wrong. Please try again."
+msgstr ""
+
+msgid "Something went wrong. Try again later."
+msgstr ""
+
+msgid "Sorry, no projects matched your search"
+msgstr ""
+
+msgid "Sorry, you have exceeded the maximum browsable page number. Please use the API to explore further."
+msgstr ""
+
+msgid "Sorry, your filter produced no results"
+msgstr ""
+
+msgid "Sort by"
+msgstr ""
+
+msgid "Sort direction"
+msgstr ""
+
+msgid "Sort direction: Ascending"
+msgstr ""
+
+msgid "Sort direction: Descending"
+msgstr ""
+
+msgid "SortOptions|Blocking"
+msgstr ""
+
+msgid "SortOptions|Closed date"
+msgstr ""
+
+msgid "SortOptions|Closed earlier"
+msgstr ""
+
+msgid "SortOptions|Closed recently"
+msgstr ""
+
+msgid "SortOptions|Created date"
+msgstr ""
+
+msgid "SortOptions|Due date"
+msgstr ""
+
+msgid "SortOptions|Due later"
+msgstr ""
+
+msgid "SortOptions|Due soon"
+msgstr ""
+
+msgid "SortOptions|Expired date"
+msgstr ""
+
+msgid "SortOptions|Label priority"
+msgstr ""
+
+msgid "SortOptions|Largest group"
+msgstr ""
+
+msgid "SortOptions|Largest repository"
+msgstr ""
+
+msgid "SortOptions|Last Contact"
+msgstr ""
+
+msgid "SortOptions|Last created"
+msgstr ""
+
+msgid "SortOptions|Least popular"
+msgstr ""
+
+msgid "SortOptions|Less weight"
+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 ""
+
+msgid "SortOptions|Milestone due later"
+msgstr ""
+
+msgid "SortOptions|Milestone due soon"
+msgstr ""
+
+msgid "SortOptions|More weight"
+msgstr ""
+
+msgid "SortOptions|Most popular"
+msgstr ""
+
+msgid "SortOptions|Most stars"
+msgstr ""
+
+msgid "SortOptions|Name"
+msgstr ""
+
+msgid "SortOptions|Name, ascending"
+msgstr ""
+
+msgid "SortOptions|Name, descending"
+msgstr ""
+
+msgid "SortOptions|Oldest created"
+msgstr ""
+
+msgid "SortOptions|Oldest last activity"
+msgstr ""
+
+msgid "SortOptions|Oldest sign in"
+msgstr ""
+
+msgid "SortOptions|Oldest starred"
+msgstr ""
+
+msgid "SortOptions|Oldest updated"
+msgstr ""
+
+msgid "SortOptions|Popularity"
+msgstr ""
+
+msgid "SortOptions|Priority"
+msgstr ""
+
+msgid "SortOptions|Project"
+msgstr ""
+
+msgid "SortOptions|Recent last activity"
+msgstr ""
+
+msgid "SortOptions|Recent sign in"
+msgstr ""
+
+msgid "SortOptions|Recently starred"
+msgstr ""
+
+msgid "SortOptions|Size"
+msgstr ""
+
+msgid "SortOptions|Sort by:"
+msgstr ""
+
+msgid "SortOptions|Sort direction"
+msgstr ""
+
+msgid "SortOptions|Stars"
+msgstr ""
+
+msgid "SortOptions|Start date"
+msgstr ""
+
+msgid "SortOptions|Start later"
+msgstr ""
+
+msgid "SortOptions|Start soon"
+msgstr ""
+
+msgid "SortOptions|Title"
+msgstr ""
+
+msgid "SortOptions|Type"
+msgstr ""
+
+msgid "SortOptions|Version"
+msgstr ""
+
+msgid "SortOptions|Weight"
+msgstr ""
+
+msgid "Source"
+msgstr ""
+
+msgid "Source (branch or tag)"
+msgstr ""
+
+msgid "Source Branch"
+msgstr ""
+
+msgid "Source IP"
+msgstr ""
+
+msgid "Source branch"
+msgstr ""
+
+msgid "Source branch will be deleted."
+msgstr ""
+
+msgid "Source branch will not be deleted."
+msgstr ""
+
+msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}"
+msgstr ""
+
+msgid "Source code (%{fileExtension})"
+msgstr ""
+
+msgid "Source is not available"
+msgstr ""
+
+msgid "Source project cannot be found."
+msgstr ""
+
+msgid "SourceEditor|\"el\" parameter is required for createInstance()"
+msgstr ""
+
+msgid "SourceEditor|%{name} is not registered."
+msgstr ""
+
+msgid "SourceEditor|Extension definition should be either a class or a function"
+msgstr ""
+
+msgid "SourceEditor|Extension definition should be either class, function, or an Array of definitions."
+msgstr ""
+
+msgid "SourceEditor|Extensions Store is required to check for an extension."
+msgstr ""
+
+msgid "SourceEditor|Name conflict for \"%{prop}()\" method."
+msgstr ""
+
+msgid "SourceEditor|No extension for unuse has been specified."
+msgstr ""
+
+msgid "SourceEditor|Source Editor instance is required to set up an extension."
+msgstr ""
+
+msgid "SourceEditor|`definition` property is expected on the extension."
+msgstr ""
+
+msgid "Sourcegraph"
+msgstr ""
+
+msgid "SourcegraphAdmin|Block on private and internal projects"
+msgstr ""
+
+msgid "SourcegraphAdmin|Configure the URL to a Sourcegraph instance which can read your GitLab projects."
+msgstr ""
+
+msgid "SourcegraphAdmin|Enable Sourcegraph"
+msgstr ""
+
+msgid "SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourcegraph%{link_end} on your GitLab instance's code views and merge requests."
+msgstr ""
+
+msgid "SourcegraphAdmin|Learn more."
+msgstr ""
+
+msgid "SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph."
+msgstr ""
+
+msgid "SourcegraphAdmin|Save changes"
+msgstr ""
+
+msgid "SourcegraphAdmin|Sourcegraph URL"
+msgstr ""
+
+msgid "SourcegraphAdmin|https://sourcegraph.example.com"
+msgstr ""
+
+msgid "SourcegraphPreferences|This feature is experimental and currently limited to certain projects."
+msgstr ""
+
+msgid "SourcegraphPreferences|This feature is experimental and limited to public projects."
+msgstr ""
+
+msgid "SourcegraphPreferences|This feature is experimental."
+msgstr ""
+
+msgid "SourcegraphPreferences|Uses %{linkStart}Sourcegraph.com%{linkEnd}."
+msgstr ""
+
+msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
+msgstr ""
+
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
+msgstr ""
+
+msgid "Spam Logs"
+msgstr ""
+
+msgid "Spam and Anti-bot Protection"
+msgstr ""
+
+msgid "Spam log successfully submitted as ham."
+msgstr ""
+
+msgid "Specific runners"
+msgstr ""
+
+msgid "Specified URL cannot be used: \"%{reason}\""
+msgstr ""
+
+msgid "Specify IP ranges that are always allowed for inbound traffic, for use with group-level IP restrictions. Runner and Pages daemon internal IPs should be listed here so that they can access project artifacts."
+msgstr ""
+
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
+
+msgid "Speed up your pipelines with Needs relationships"
+msgstr ""
+
+msgid "Spent at"
+msgstr ""
+
+msgid "Squash commit message"
+msgstr ""
+
+msgid "Squash commits"
+msgstr ""
+
+msgid "Stack trace"
+msgstr ""
+
+msgid "Stacktrace snippet"
+msgstr ""
+
+msgid "Stage"
+msgstr ""
+
+msgid "Stage:"
+msgstr ""
+
+msgid "Standard"
+msgstr ""
+
+msgid "Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging."
+msgstr ""
+
+msgid "Star labels to start sorting by priority"
+msgstr ""
+
+msgid "Star toggle failed. Try again later."
+msgstr ""
+
+msgid "StarProject|Star"
+msgstr ""
+
+msgid "Starred Projects"
+msgstr ""
+
+msgid "Starred Projects' Activity"
+msgstr ""
+
+msgid "Starred projects"
+msgstr ""
+
+msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon. Then, you can find the project on this page."
+msgstr ""
+
+msgid "StarredProjectsEmptyState|You don't have starred projects yet."
+msgstr ""
+
+msgid "Starrers"
+msgstr ""
+
+msgid "Stars"
+msgstr ""
+
+msgid "Start Date"
+msgstr ""
+
+msgid "Start Time"
+msgstr ""
+
+msgid "Start Web Terminal"
+msgstr ""
+
+msgid "Start a %{new_merge_request} with these changes"
+msgstr ""
+
+msgid "Start a Free Ultimate Trial"
+msgstr ""
+
+msgid "Start a new discussion…"
+msgstr ""
+
+msgid "Start a new merge request with these changes"
+msgstr ""
+
+msgid "Start a review"
+msgstr ""
+
+msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
+msgstr ""
+
+msgid "Start cleanup"
+msgstr ""
+
+msgid "Start date"
+msgstr ""
+
+msgid "Start free trial"
+msgstr ""
+
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
+msgid "Start internal thread"
+msgstr ""
+
+msgid "Start merge train"
+msgstr ""
+
+msgid "Start merge train when pipeline succeeds"
+msgstr ""
+
+msgid "Start merge train..."
+msgstr ""
+
+msgid "Start search"
+msgstr ""
+
+msgid "Start thread"
+msgstr ""
+
+msgid "Start your Free Ultimate Trial"
+msgstr ""
+
+msgid "Start your free trial"
+msgstr ""
+
+msgid "Started"
+msgstr ""
+
+msgid "Started %{startsIn}"
+msgstr ""
+
+msgid "Started asynchronous removal of all repository check states."
+msgstr ""
+
+msgid "Started escalation for this incident."
+msgstr ""
+
+msgid "Starting..."
+msgstr ""
+
+msgid "Starts"
+msgstr ""
+
+msgid "Starts %{startsIn}"
+msgstr ""
+
+msgid "Starts at (UTC)"
+msgstr ""
+
+msgid "Starts escalations for this incident"
+msgstr ""
+
+msgid "Starts on"
+msgstr ""
+
+msgid "Starts: %{startsAt}"
+msgstr ""
+
+msgid "State your message to activate"
+msgstr ""
+
+msgid "State/Province"
+msgstr ""
+
+msgid "State/Province/City"
+msgstr ""
+
+msgid "Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "Statistics"
+msgstr ""
+
+msgid "Status"
+msgstr ""
+
+msgid "Status was retried."
+msgstr ""
+
+msgid "Status:"
+msgstr ""
+
+msgid "Status: %{title}"
+msgstr ""
+
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
+msgid "StatusCheck|%{failed} failed"
+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 ""
+
+msgid "StatusCheck|An error occurred fetching the status checks."
+msgstr ""
+
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
+msgstr ""
+
+msgid "StatusCheck|Check for a status response in merge requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "StatusCheck|Examples: QA, Security."
+msgstr ""
+
+msgid "StatusCheck|External API is already in use by another status check."
+msgstr ""
+
+msgid "StatusCheck|Failed to load status checks"
+msgstr ""
+
+msgid "StatusCheck|Failed to load status checks."
+msgstr ""
+
+msgid "StatusCheck|Invoke an external API as part of the pipeline process."
+msgstr ""
+
+msgid "StatusCheck|No status checks are defined yet."
+msgstr ""
+
+msgid "StatusCheck|Remove status check"
+msgstr ""
+
+msgid "StatusCheck|Remove status check?"
+msgstr ""
+
+msgid "StatusCheck|Service name"
+msgstr ""
+
+msgid "StatusCheck|Status checks"
+msgstr ""
+
+msgid "StatusCheck|Status checks all passed"
+msgstr ""
+
+msgid "StatusCheck|Status checks are being fetched"
+msgstr ""
+
+msgid "StatusCheck|Status to check"
+msgstr ""
+
+msgid "StatusCheck|Target branch"
+msgstr ""
+
+msgid "StatusCheck|Update status check"
+msgstr ""
+
+msgid "StatusCheck|You are about to remove the %{name} status check."
+msgstr ""
+
+msgid "StatusCheck|status checks"
+msgstr ""
+
+msgid "StatusPage|AWS %{docsLink}"
+msgstr ""
+
+msgid "StatusPage|AWS Secret access key"
+msgstr ""
+
+msgid "StatusPage|AWS access key ID"
+msgstr ""
+
+msgid "StatusPage|AWS region"
+msgstr ""
+
+msgid "StatusPage|Active"
+msgstr ""
+
+msgid "StatusPage|Bucket %{docsLink}"
+msgstr ""
+
+msgid "StatusPage|Configure file storage settings to link issues in this project to an external status page."
+msgstr ""
+
+msgid "StatusPage|S3 Bucket name"
+msgstr ""
+
+msgid "StatusPage|Status page"
+msgstr ""
+
+msgid "StatusPage|Status page URL"
+msgstr ""
+
+msgid "StatusPage|To publish incidents to an external status page, GitLab stores a JSON file in your Amazon S3 account at a location that your external status page service can access. Make sure to also set up %{docsLink}"
+msgstr ""
+
+msgid "StatusPage|configuration documentation"
+msgstr ""
+
+msgid "StatusPage|your status page frontend."
+msgstr ""
+
+msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
+msgstr ""
+
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
+msgid "Step 1."
+msgstr ""
+
+msgid "Step 2."
+msgstr ""
+
+msgid "Step 3."
+msgstr ""
+
+msgid "Step 4."
+msgstr ""
+
+msgid "Stop Terminal"
+msgstr ""
+
+msgid "Stop impersonation"
+msgstr ""
+
+msgid "Stop this environment"
+msgstr ""
+
+msgid "Stopped"
+msgstr ""
+
+msgid "Stopping..."
+msgstr ""
+
+msgid "Storage"
+msgstr ""
+
+msgid "Storage nodes for new repositories"
+msgstr ""
+
+msgid "Storage:"
+msgstr ""
+
+msgid "StorageSize|Unknown"
+msgstr ""
+
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
+msgid "Strikethrough"
+msgstr ""
+
+msgid "Strikethrough text"
+msgstr ""
+
+msgid "Sub-batch size"
+msgstr ""
+
+msgid "Subdomains of the Pages root domain %{root_domain} are reserved and cannot be used as custom Pages domains."
+msgstr ""
+
+msgid "Subgroup information"
+msgstr ""
+
+msgid "Subgroup milestone"
+msgstr ""
+
+msgid "Subgroup navigation"
+msgstr ""
+
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr ""
+
+msgid "SubgroupCreationlevel|Allowed to create subgroups"
+msgstr ""
+
+msgid "SubgroupCreationlevel|Maintainers"
+msgstr ""
+
+msgid "SubgroupCreationlevel|Owners"
+msgstr ""
+
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subgroups and projects"
+msgstr ""
+
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
+msgid "Subject Key Identifier:"
+msgstr ""
+
+msgid "Subkeys"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
+msgid "Submit a review"
+msgstr ""
+
+msgid "Submit as ham"
+msgstr ""
+
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit feedback"
+msgstr ""
+
+msgid "Submit review"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
+msgid "Submit the current review."
+msgstr ""
+
+msgid "Submitted as ham"
+msgstr ""
+
+msgid "Submitted the current review."
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Subscribe at group level"
+msgstr ""
+
+msgid "Subscribe at project level"
+msgstr ""
+
+msgid "Subscribe to RSS feed"
+msgstr ""
+
+msgid "Subscribe to calendar"
+msgstr ""
+
+msgid "Subscribed"
+msgstr ""
+
+msgid "Subscribed to this %{quick_action_target}."
+msgstr ""
+
+msgid "Subscribed to this project"
+msgstr ""
+
+msgid "Subscribes to this %{quick_action_target}."
+msgstr ""
+
+msgid "Subscript"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Subscription History"
+msgstr ""
+
+msgid "Subscription deletion failed."
+msgstr ""
+
+msgid "Subscription service outage"
+msgstr ""
+
+msgid "Subscription successfully applied to \"%{group_name}\""
+msgstr ""
+
+msgid "Subscription successfully created."
+msgstr ""
+
+msgid "Subscription successfully deleted."
+msgstr ""
+
+msgid "SubscriptionBanner|Add new license"
+msgstr ""
+
+msgid "SubscriptionBanner|Export license usage file"
+msgstr ""
+
+msgid "SubscriptionBanner|Upload new license"
+msgstr ""
+
+msgid "SubscriptionTable|Add seats"
+msgstr ""
+
+msgid "SubscriptionTable|An error occurred while loading the subscription details."
+msgstr ""
+
+msgid "SubscriptionTable|Billing"
+msgstr ""
+
+msgid "SubscriptionTable|Free"
+msgstr ""
+
+msgid "SubscriptionTable|GitLab allows you to continue using your subscription even if you exceed the number of seats you purchased. You will be required to pay for these seats upon renewal."
+msgstr ""
+
+msgid "SubscriptionTable|Last invoice"
+msgstr ""
+
+msgid "SubscriptionTable|Loading subscriptions"
+msgstr ""
+
+msgid "SubscriptionTable|Manage"
+msgstr ""
+
+msgid "SubscriptionTable|Max seats used"
+msgstr ""
+
+msgid "SubscriptionTable|Next invoice"
+msgstr ""
+
+msgid "SubscriptionTable|Refresh Seats"
+msgstr ""
+
+msgid "SubscriptionTable|Renew"
+msgstr ""
+
+msgid "SubscriptionTable|Seats currently in use"
+msgstr ""
+
+msgid "SubscriptionTable|Seats in subscription"
+msgstr ""
+
+msgid "SubscriptionTable|Seats owed"
+msgstr ""
+
+msgid "SubscriptionTable|See usage"
+msgstr ""
+
+msgid "SubscriptionTable|Something went wrong trying to refresh seats"
+msgstr ""
+
+msgid "SubscriptionTable|Subscription end date"
+msgstr ""
+
+msgid "SubscriptionTable|Subscription start date"
+msgstr ""
+
+msgid "SubscriptionTable|This is the last time the GitLab.com team was in contact with you to settle any outstanding balances."
+msgstr ""
+
+msgid "SubscriptionTable|This is the maximum number of users that have existed at the same time since this subscription started."
+msgstr ""
+
+msgid "SubscriptionTable|This is the next date when the GitLab.com team is scheduled to get in contact with you to settle any outstanding balances."
+msgstr ""
+
+msgid "SubscriptionTable|This is the number of seats you will be required to purchase if you update to a paid plan."
+msgstr ""
+
+msgid "SubscriptionTable|Trial"
+msgstr ""
+
+msgid "SubscriptionTable|Trial end date"
+msgstr ""
+
+msgid "SubscriptionTable|Trial start date"
+msgstr ""
+
+msgid "SubscriptionTable|Usage"
+msgstr ""
+
+msgid "SubscriptionTable|Usage count is performed once a day at 12:00 PM."
+msgstr ""
+
+msgid "Subscriptions"
+msgstr ""
+
+msgid "Subscriptions|Chat with sales"
+msgstr ""
+
+msgid "Subscriptions|Close"
+msgstr ""
+
+msgid "Subscriptions|Not ready to buy yet?"
+msgstr ""
+
+msgid "Subscriptions|Start a free trial"
+msgstr ""
+
+msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
+msgstr ""
+
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
+msgid "Subtracted"
+msgstr ""
+
+msgid "Subtracts"
+msgstr ""
+
+msgid "Succeeded"
+msgstr ""
+
+msgid "Successful purchase image"
+msgstr ""
+
+msgid "Successfully activated"
+msgstr ""
+
+msgid "Successfully approved"
+msgstr ""
+
+msgid "Successfully banned"
+msgstr ""
+
+msgid "Successfully blocked"
+msgstr ""
+
+msgid "Successfully confirmed"
+msgstr ""
+
+msgid "Successfully deactivated"
+msgstr ""
+
+msgid "Successfully deleted U2F device."
+msgstr ""
+
+msgid "Successfully deleted WebAuthn device."
+msgstr ""
+
+msgid "Successfully removed email."
+msgstr ""
+
+msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details."
+msgstr ""
+
+msgid "Successfully synced %{synced_timeago}."
+msgstr ""
+
+msgid "Successfully unbanned"
+msgstr ""
+
+msgid "Successfully unblocked"
+msgstr ""
+
+msgid "Successfully unlocked"
+msgstr ""
+
+msgid "Successfully updated %{last_updated_timeago}."
+msgstr ""
+
+msgid "Successfully updated the environment."
+msgstr ""
+
+msgid "Suggest code changes which can be immediately applied in one click. Try it out!"
+msgstr ""
+
+msgid "Suggested change"
+msgstr ""
+
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
+
+msgid "SuggestedColors|Blue"
+msgstr ""
+
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
+
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
+
+msgid "SuggestedColors|Champagne"
+msgstr ""
+
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
+
+msgid "SuggestedColors|Crimson"
+msgstr ""
+
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
+msgid "SuggestedColors|Dark coral"
+msgstr ""
+
+msgid "SuggestedColors|Dark green"
+msgstr ""
+
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
+
+msgid "SuggestedColors|Dark violet"
+msgstr ""
+
+msgid "SuggestedColors|Deep violet"
+msgstr ""
+
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
+msgid "SuggestedColors|Gray"
+msgstr ""
+
+msgid "SuggestedColors|Green"
+msgstr ""
+
+msgid "SuggestedColors|Green screen"
+msgstr ""
+
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
+
+msgid "SuggestedColors|Lavendar"
+msgstr ""
+
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
+
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
+
+msgid "SuggestedColors|Orange"
+msgstr ""
+
+msgid "SuggestedColors|Purple"
+msgstr ""
+
+msgid "SuggestedColors|Red"
+msgstr ""
+
+msgid "SuggestedColors|Rose red"
+msgstr ""
+
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
+
+msgid "Suggestion is not applicable as the suggestion was not found."
+msgstr ""
+
+msgid "Suggestions are not applicable as one or more suggestions were not found."
+msgstr ""
+
+msgid "Suggestions are not applicable as their lines cannot overlap."
+msgstr ""
+
+msgid "Suggestions must all be on the same branch."
+msgstr ""
+
+msgid "Suggestions:"
+msgstr ""
+
+msgid "Suite"
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
+msgstr ""
+
+msgid "Sunday"
+msgstr ""
+
+msgid "SuperSonics|Activate subscription"
+msgstr ""
+
+msgid "SuperSonics|Activation code"
+msgstr ""
+
+msgid "SuperSonics|An error occurred while adding your subscription."
+msgstr ""
+
+msgid "SuperSonics|Billable users"
+msgstr ""
+
+msgid "SuperSonics|Buy subscription"
+msgstr ""
+
+msgid "SuperSonics|Cannot activate instance due to a connectivity issue."
+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|Enter activation code"
+msgstr ""
+
+msgid "SuperSonics|Export license usage file"
+msgstr ""
+
+msgid "SuperSonics|Free trial"
+msgstr ""
+
+msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
+msgstr ""
+
+msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
+msgstr ""
+
+msgid "SuperSonics|Learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
+msgstr ""
+
+msgid "SuperSonics|Licensed to"
+msgstr ""
+
+msgid "SuperSonics|Manage"
+msgstr ""
+
+msgid "SuperSonics|Maximum users"
+msgstr ""
+
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
+msgstr ""
+
+msgid "SuperSonics|Paste your activation code"
+msgstr ""
+
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
+msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
+msgstr ""
+
+msgid "SuperSonics|Start free trial"
+msgstr ""
+
+msgid "SuperSonics|Subscription details"
+msgstr ""
+
+msgid "SuperSonics|Subscription unavailable"
+msgstr ""
+
+msgid "SuperSonics|Sync subscription details"
+msgstr ""
+
+msgid "SuperSonics|Sync subscription request."
+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}."
+msgstr ""
+
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
+msgid "SuperSonics|There is a connectivity issue."
+msgstr ""
+
+msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
+msgstr ""
+
+msgid "SuperSonics|This is the number of %{billableUsersLinkStart}billable users%{billableUsersLinkEnd} on your installation, and this is the minimum number you need to purchase when you renew your license."
+msgstr ""
+
+msgid "SuperSonics|To activate your subscription, your instance needs to connect to GitLab. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}."
+msgstr ""
+
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SuperSonics|Users in subscription"
+msgstr ""
+
+msgid "SuperSonics|Users over subscription"
+msgstr ""
+
+msgid "SuperSonics|Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
+msgstr ""
+
+msgid "SuperSonics|You can %{purchaseSubscriptionLinkStart}purchase a new subscription%{purchaseSubscriptionLinkEnd} and try again. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
+msgstr ""
+
+msgid "SuperSonics|You can no longer sync your subscription details with GitLab. Get help for the most common connectivity issues by %{connectivityHelpLinkStart}troubleshooting the activation code%{connectivityHelpLinkEnd}."
+msgstr ""
+
+msgid "SuperSonics|You can start a free trial of GitLab Ultimate without any obligation or payment details."
+msgstr ""
+
+msgid "SuperSonics|You do not have an active subscription"
+msgstr ""
+
+msgid "SuperSonics|You have a future dated license"
+msgstr ""
+
+msgid "SuperSonics|You have added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
+msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
+msgstr ""
+
+msgid "SuperSonics|Your %{subscriptionEntryName} cannot be displayed at the moment. Please refresh the page to try again."
+msgstr ""
+
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
+msgid "SuperSonics|Your subscription"
+msgstr ""
+
+msgid "SuperSonics|Your subscription details will sync shortly."
+msgstr ""
+
+msgid "SuperSonics|Your subscription is expired."
+msgstr ""
+
+msgid "SuperSonics|Your subscription was successfully activated. You can see the details below."
+msgstr ""
+
+msgid "SuperSonics|current subscription"
+msgstr ""
+
+msgid "SuperSonics|future subscriptions"
+msgstr ""
+
+msgid "SuperSonics|past subscriptions"
+msgstr ""
+
+msgid "Superscript"
+msgstr ""
+
+msgid "Support"
+msgstr ""
+
+msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
+msgstr ""
+
+msgid "Support page URL"
+msgstr ""
+
+msgid "Survey Response"
+msgstr ""
+
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
+msgid "Switch Branches"
+msgstr ""
+
+msgid "Switch branch"
+msgstr ""
+
+msgid "Switch branch/tag"
+msgstr ""
+
+msgid "Switch to GitLab Next"
+msgstr ""
+
+msgid "Switch to the source to copy the file contents"
+msgstr ""
+
+msgid "Symbolic link"
+msgstr ""
+
+msgid "Sync LDAP"
+msgstr ""
+
+msgid "Sync now"
+msgstr ""
+
+msgid "Synced"
+msgstr ""
+
+msgid "Synchronize LDAP"
+msgstr ""
+
+msgid "Syncing…"
+msgstr ""
+
+msgid "Syntax is correct."
+msgstr ""
+
+msgid "Syntax is incorrect."
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Dark"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Light"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Monokai"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|None"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Solarized Dark"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Solarized Light"
+msgstr ""
+
+msgid "System"
+msgstr ""
+
+msgid "System Hooks"
+msgstr ""
+
+msgid "System Hooks Help"
+msgstr ""
+
+msgid "System Info"
+msgstr ""
+
+msgid "System default (%{default})"
+msgstr ""
+
+msgid "System header and footer"
+msgstr ""
+
+msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
+msgid "System metrics (Kubernetes)"
+msgstr ""
+
+msgid "System output"
+msgstr ""
+
+msgid "Table of Contents"
+msgstr ""
+
+msgid "Table of contents"
+msgstr ""
+
+msgid "Tag"
+msgstr ""
+
+msgid "Tag list:"
+msgstr ""
+
+msgid "Tag name"
+msgstr ""
+
+msgid "Tag name is required."
+msgstr ""
+
+msgid "Tag push"
+msgstr ""
+
+msgid "Tag push events"
+msgstr ""
+
+msgid "Tag this commit."
+msgstr ""
+
+msgid "Tag:"
+msgstr ""
+
+msgid "Tagged this commit to %{tag_name} with \"%{message}\"."
+msgstr ""
+
+msgid "Tagged this commit to %{tag_name}."
+msgstr ""
+
+msgid "Tags"
+msgstr ""
+
+msgid "Tags are deleted until the timeout is reached. Any remaining tags are included the next time the policy runs. To remove the time limit, set it to 0."
+msgstr ""
+
+msgid "Tags feed"
+msgstr ""
+
+msgid "Tags this commit to %{tag_name} with \"%{message}\"."
+msgstr ""
+
+msgid "Tags this commit to %{tag_name}."
+msgstr ""
+
+msgid "Tags:"
+msgstr ""
+
+msgid "TagsPage|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this tag."
+msgstr ""
+
+msgid "TagsPage|Browse commits"
+msgstr ""
+
+msgid "TagsPage|Browse files"
+msgstr ""
+
+msgid "TagsPage|Can't find HEAD commit for this tag"
+msgstr ""
+
+msgid "TagsPage|Cancel"
+msgstr ""
+
+msgid "TagsPage|Cancel, keep tag"
+msgstr ""
+
+msgid "TagsPage|Create tag"
+msgstr ""
+
+msgid "TagsPage|Delete protected tag"
+msgstr ""
+
+msgid "TagsPage|Delete protected tag. Are you ABSOLUTELY SURE?"
+msgstr ""
+
+msgid "TagsPage|Delete tag"
+msgstr ""
+
+msgid "TagsPage|Delete tag. Are you ABSOLUTELY SURE?"
+msgstr ""
+
+msgid "TagsPage|Deleting the %{strongStart}%{tagName}%{strongEnd} tag cannot be undone. Are you sure?"
+msgstr ""
+
+msgid "TagsPage|Edit release notes"
+msgstr ""
+
+msgid "TagsPage|Existing branch name, tag, or commit SHA"
+msgstr ""
+
+msgid "TagsPage|Filter by tag name"
+msgstr ""
+
+msgid "TagsPage|New Tag"
+msgstr ""
+
+msgid "TagsPage|New tag"
+msgstr ""
+
+msgid "TagsPage|Only a project maintainer or owner can delete a protected tag"
+msgstr ""
+
+msgid "TagsPage|Optionally, add a message to the tag. Leaving this blank creates a %{link_start}lightweight tag.%{link_end}"
+msgstr ""
+
+msgid "TagsPage|Optionally, create a public Release of your project, based on this tag. Release notes are displayed on the %{releases_page_link_start}Releases%{link_end} page. %{docs_link_start}More information%{link_end}"
+msgstr ""
+
+msgid "TagsPage|Please type the following to confirm:"
+msgstr ""
+
+msgid "TagsPage|Release notes"
+msgstr ""
+
+msgid "TagsPage|Repository has no tags yet."
+msgstr ""
+
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "TagsPage|Tags"
+msgstr ""
+
+msgid "TagsPage|Tags give the ability to mark specific points in history as being important"
+msgstr ""
+
+msgid "TagsPage|This tag has no release notes."
+msgstr ""
+
+msgid "TagsPage|Unable to load tags"
+msgstr ""
+
+msgid "TagsPage|Use git tag command to add a new one:"
+msgstr ""
+
+msgid "TagsPage|Write your release notes or drag files here…"
+msgstr ""
+
+msgid "TagsPage|Yes, delete protected tag"
+msgstr ""
+
+msgid "TagsPage|Yes, delete tag"
+msgstr ""
+
+msgid "TagsPage|You're about to permanently delete the protected tag %{strongStart}%{tagName}.%{strongEnd}"
+msgstr ""
+
+msgid "TagsPage|You're about to permanently delete the tag %{strongStart}%{tagName}.%{strongEnd}"
+msgstr ""
+
+msgid "TagsPage|protected"
+msgstr ""
+
+msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
+msgstr ""
+
+msgid "Target Branch"
+msgstr ""
+
+msgid "Target Path"
+msgstr ""
+
+msgid "Target branch"
+msgstr ""
+
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
+msgid "Target-Branch"
+msgstr ""
+
+msgid "Task"
+msgstr ""
+
+msgid "Task ID: %{elastic_task}"
+msgstr ""
+
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
+msgid "TasksToBeDone|Create/import code into a project (repository)"
+msgstr ""
+
+msgid "TasksToBeDone|Create/import issues (tickets) to collaborate on ideas and plan work"
+msgstr ""
+
+msgid "TasksToBeDone|Set up CI/CD pipelines to build, test, deploy, and monitor code"
+msgstr ""
+
+msgid "Team"
+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 ""
+
+msgid "Template"
+msgstr ""
+
+msgid "Template to append to all Service Desk issues"
+msgstr ""
+
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
+msgstr ""
+
+msgid "Templates"
+msgstr ""
+
+msgid "TemporaryStorageIncrease|can only be set once"
+msgstr ""
+
+msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
+msgstr ""
+
+msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
+msgstr ""
+
+msgid "TemporaryStorage|Increase storage temporarily"
+msgstr ""
+
+msgid "TemporaryStorage|Temporarily increase storage now?"
+msgstr ""
+
+msgid "Terminal"
+msgstr ""
+
+msgid "Terminal for environment"
+msgstr ""
+
+msgid "Terminal sync service is running"
+msgstr ""
+
+msgid "Terms of Service Agreement and Privacy Policy"
+msgstr ""
+
+msgid "Terms of Service and Privacy Policy"
+msgstr ""
+
+msgid "Terms of service"
+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 ""
+
+msgid "Terraform|%{number} Terraform report failed to generate"
+msgid_plural "Terraform|%{number} Terraform reports failed to generate"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{number} Terraform report was generated in your pipelines"
+msgid_plural "Terraform|%{number} Terraform reports were generated in your pipelines"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{strong_start}%{number}%{strong_end} Terraform report failed to generate"
+msgid_plural "Terraform|%{strong_start}%{number}%{strong_end} Terraform reports failed to generate"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{strong_start}%{number}%{strong_end} Terraform report was generated in your pipelines"
+msgid_plural "Terraform|%{strong_start}%{number}%{strong_end} Terraform reports were generated in your pipelines"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{user} updated %{timeAgo}"
+msgstr ""
+
+msgid "Terraform|A Terraform report failed to generate."
+msgstr ""
+
+msgid "Terraform|A Terraform report was generated in your pipelines."
+msgstr ""
+
+msgid "Terraform|A report failed to generate."
+msgstr ""
+
+msgid "Terraform|A report was generated in your pipelines."
+msgstr ""
+
+msgid "Terraform|Actions"
+msgstr ""
+
+msgid "Terraform|An error occurred while changing the state file"
+msgstr ""
+
+msgid "Terraform|An error occurred while loading your Terraform States"
+msgstr ""
+
+msgid "Terraform|Are you sure you want to remove the Terraform State %{name}?"
+msgstr ""
+
+msgid "Terraform|Cancel"
+msgstr ""
+
+msgid "Terraform|Cannot remove a locked state"
+msgstr ""
+
+msgid "Terraform|Copy Terraform init command"
+msgstr ""
+
+msgid "Terraform|Deletion in progress"
+msgstr ""
+
+msgid "Terraform|Details"
+msgstr ""
+
+msgid "Terraform|Download JSON"
+msgstr ""
+
+msgid "Terraform|Failed to load Terraform reports"
+msgstr ""
+
+msgid "Terraform|Generating the report caused an error."
+msgstr ""
+
+msgid "Terraform|How to use GitLab-managed Terraform state?"
+msgstr ""
+
+msgid "Terraform|Job status"
+msgstr ""
+
+msgid "Terraform|Loading Terraform reports..."
+msgstr ""
+
+msgid "Terraform|Lock"
+msgstr ""
+
+msgid "Terraform|Locked"
+msgstr ""
+
+msgid "Terraform|Locked by %{user} %{timeAgo}"
+msgstr ""
+
+msgid "Terraform|Locking state"
+msgstr ""
+
+msgid "Terraform|Name"
+msgstr ""
+
+msgid "Terraform|Pipeline"
+msgstr ""
+
+msgid "Terraform|Remove"
+msgstr ""
+
+msgid "Terraform|Remove state file and versions"
+msgstr ""
+
+msgid "Terraform|Removed"
+msgstr ""
+
+msgid "Terraform|Removing"
+msgstr ""
+
+msgid "Terraform|Reported Resource Changes: %{addNum} to add, %{changeNum} to change, %{deleteNum} to delete"
+msgstr ""
+
+msgid "Terraform|States"
+msgstr ""
+
+msgid "Terraform|Terraform init command"
+msgstr ""
+
+msgid "Terraform|Terraform reports"
+msgstr ""
+
+msgid "Terraform|The job %{name} failed to generate a report."
+msgstr ""
+
+msgid "Terraform|The job %{name} generated a report."
+msgstr ""
+
+msgid "Terraform|The job %{strong_start}%{name}%{strong_end} failed to generate a report."
+msgstr ""
+
+msgid "Terraform|The job %{strong_start}%{name}%{strong_end} generated a report."
+msgstr ""
+
+msgid "Terraform|To get access to this terraform state from your local computer, run the following command at the command line. The first line requires a personal access token with API read and write access. %{linkStart}How do I create a personal access token?%{linkEnd}."
+msgstr ""
+
+msgid "Terraform|To remove the State file and its versions, type %{name} to confirm:"
+msgstr ""
+
+msgid "Terraform|Unknown User"
+msgstr ""
+
+msgid "Terraform|Unlock"
+msgstr ""
+
+msgid "Terraform|Unlocking state"
+msgstr ""
+
+msgid "Terraform|You are about to remove the state file %{name}. This will permanently delete all the State versions and history. The infrastructure provisioned previously will remain intact, and only the state file with all its versions will be removed. This action cannot be undone."
+msgstr ""
+
+msgid "Terraform|You have insufficient permissions to delete this state"
+msgstr ""
+
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
+msgid "Test"
+msgstr ""
+
+msgid "Test Cases"
+msgstr ""
+
+msgid "Test case"
+msgstr ""
+
+msgid "Test coverage value for this pipeline was calculated by the coverage value of %d job."
+msgid_plural "Test coverage value for this pipeline was calculated by averaging the resulting coverage values of %d jobs."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Test coverage: %d hit"
+msgid_plural "Test coverage: %d hits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Test settings"
+msgstr ""
+
+msgid "TestCases|Move test case"
+msgstr ""
+
+msgid "TestCases|Moving test case"
+msgstr ""
+
+msgid "TestCases|New Test Case"
+msgstr ""
+
+msgid "TestCases|New test case"
+msgstr ""
+
+msgid "TestCases|Search test cases"
+msgstr ""
+
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
+msgstr ""
+
+msgid "TestCases|Something went wrong while creating a test case."
+msgstr ""
+
+msgid "TestCases|Something went wrong while fetching test case."
+msgstr ""
+
+msgid "TestCases|Something went wrong while fetching test cases list."
+msgstr ""
+
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
+msgstr ""
+
+msgid "TestCases|Something went wrong while moving test case."
+msgstr ""
+
+msgid "TestCases|Something went wrong while updating the test case labels."
+msgstr ""
+
+msgid "TestCases|Something went wrong while updating the test case."
+msgstr ""
+
+msgid "TestCases|Submit test case"
+msgstr ""
+
+msgid "TestHooks|Ensure one of your projects has merge requests."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has CI jobs."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has CI pipelines."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has deployments."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has issues."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has merge requests."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has notes."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has releases."
+msgstr ""
+
+msgid "TestHooks|Ensure the wiki is enabled and has pages."
+msgstr ""
+
+msgid "TestReports|%{count} errors"
+msgstr ""
+
+msgid "TestReports|%{count} failures"
+msgstr ""
+
+msgid "TestReports|%{count} tests"
+msgstr ""
+
+msgid "TestReports|%{rate}%{sign} success rate"
+msgstr ""
+
+msgid "TestReports|Attachment"
+msgstr ""
+
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
+msgid "TestReports|Job artifacts are expired"
+msgstr ""
+
+msgid "TestReports|Jobs"
+msgstr ""
+
+msgid "TestReports|Learn how to upload pipeline test reports"
+msgstr ""
+
+msgid "TestReports|Learn more about pipeline test reports"
+msgstr ""
+
+msgid "TestReports|No test cases were found in the test report."
+msgstr ""
+
+msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "TestReports|Tests"
+msgstr ""
+
+msgid "TestReports|There are no test cases to display."
+msgstr ""
+
+msgid "TestReports|There are no test reports for this pipeline"
+msgstr ""
+
+msgid "TestReports|There are no test suites to show."
+msgstr ""
+
+msgid "TestReports|There are no tests to display"
+msgstr ""
+
+msgid "TestReports|There was an error fetching the summary."
+msgstr ""
+
+msgid "TestReports|There was an error fetching the test suite."
+msgstr ""
+
+msgid "TestReports|You can configure your job to use unit test reports, and GitLab displays a report here and in the related merge request."
+msgstr ""
+
+msgid "Tests"
+msgstr ""
+
+msgid "Text (optional)"
+msgstr ""
+
+msgid "Text added to the body of all email messages. %{character_limit} character limit"
+msgstr ""
+
+msgid "Text style"
+msgstr ""
+
+msgid "Thank you for your business."
+msgstr ""
+
+msgid "Thank you for your feedback!"
+msgstr ""
+
+msgid "Thank you for your report. A GitLab administrator will look into it shortly."
+msgstr ""
+
+msgid "Thank you for your support request! We are tracking your request as ticket #%{issue_iid}, and will respond as soon as we can."
+msgstr ""
+
+msgid "Thanks for signing up to GitLab!"
+msgstr ""
+
+msgid "Thanks for your purchase!"
+msgstr ""
+
+msgid "That's OK, I don't want to renew"
+msgstr ""
+
+msgid "That's it, well done!"
+msgstr ""
+
+msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
+msgstr ""
+
+msgid "The %{plan_name} is no longer available to purchase. For more information about how this will impact you, check our %{faq_link_start}frequently asked questions%{faq_link_end}."
+msgstr ""
+
+msgid "The %{type} contains the following error:"
+msgid_plural "The %{type} contains the following errors:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
+msgstr ""
+
+msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
+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}."
+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 ""
+
+msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
+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 of the Jenkins server."
+msgstr ""
+
+msgid "The URL should start with http:// or https://"
+msgstr ""
+
+msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
+msgstr ""
+
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
+msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
+msgstr ""
+
+msgid "The associated issue #%{issueId} has been closed as the error is now resolved."
+msgstr ""
+
+msgid "The branch for this project has no active pipeline configuration."
+msgstr ""
+
+msgid "The branch or tag does not exist"
+msgstr ""
+
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+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 comment you are editing has been changed by another user. Would you like to keep your changes and overwrite the new description or discard your changes?"
+msgstr ""
+
+msgid "The commit does not exist"
+msgstr ""
+
+msgid "The comparison view may be inaccurate due to merge conflicts."
+msgstr ""
+
+msgid "The complete DevOps platform. One application with endless possibilities. Organizations rely on GitLab’s source code management, CI/CD, security, and more to deliver software rapidly."
+msgstr ""
+
+msgid "The compliance report shows the merge request violations merged in protected environments."
+msgstr ""
+
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
+msgid "The contact does not belong to the issue group's root ancestor"
+msgstr ""
+
+msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
+msgstr ""
+
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
+msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
+msgstr ""
+
+msgid "The contents of this group, its subgroups and projects will be permanently removed after %{deletion_adjourned_period} days on %{date}. After this point, your data cannot be recovered."
+msgstr ""
+
+msgid "The current epic"
+msgstr ""
+
+msgid "The current incident"
+msgstr ""
+
+msgid "The current issue"
+msgstr ""
+
+msgid "The current user is not authorized to access the job log."
+msgstr ""
+
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgstr ""
+
+msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgstr ""
+
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+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 ""
+
+msgid "The deployment of this job to %{environmentLink} did not succeed."
+msgstr ""
+
+msgid "The directory has been successfully created."
+msgstr ""
+
+msgid "The domain you entered is misformatted."
+msgstr ""
+
+msgid "The domain you entered is not allowed."
+msgstr ""
+
+msgid "The download link will expire in 24 hours."
+msgstr ""
+
+msgid "The environment tiers must be from %{environment_tiers}."
+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 could not be displayed because it is empty or larger than the maximum file size indexed (%{size})."
+msgstr ""
+
+msgid "The file has been successfully created."
+msgstr ""
+
+msgid "The file has been successfully deleted."
+msgstr ""
+
+msgid "The file name should have a .yml extension"
+msgstr ""
+
+msgid "The finding is not a vulnerability because it is part of a test or is test data."
+msgstr ""
+
+msgid "The following %{user} can also merge into this branch: %{branch}"
+msgstr ""
+
+msgid "The following %{user} can also push to this branch: %{branch}"
+msgstr ""
+
+msgid "The following Personal Access Token was revoked by an administrator, %{username}."
+msgstr ""
+
+msgid "The following SSH key was deleted by an administrator, %{username}."
+msgstr ""
+
+msgid "The following items will NOT be exported:"
+msgstr ""
+
+msgid "The following items will be exported:"
+msgstr ""
+
+msgid "The following personal access token: %{token_names} was revoked, because a new policy to expire personal access tokens were set."
+msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "The fork relationship has been removed."
+msgstr ""
+
+msgid "The form contains the following error:"
+msgid_plural "The form contains the following errors:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "The form contains the following warning:"
+msgstr ""
+
+msgid "The git server, Gitaly, is not available at this time. Please contact your administrator."
+msgstr ""
+
+msgid "The global settings require you to enable Two-Factor Authentication for your account."
+msgstr ""
+
+msgid "The group and any internal projects can be viewed by any logged in user except external users."
+msgstr ""
+
+msgid "The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "The group and its projects can only be viewed by members."
+msgstr ""
+
+msgid "The group export can be downloaded from:"
+msgstr ""
+
+msgid "The group has already been shared with this group"
+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_project_ids parameter is only allowed for a group"
+msgstr ""
+
+msgid "The hostname of your PlantUML server."
+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 ""
+
+msgid "The interval must be one of %{intervals}."
+msgstr ""
+
+msgid "The invitation can not be found with the provided invite token."
+msgstr ""
+
+msgid "The invitation could not be accepted."
+msgstr ""
+
+msgid "The invitation could not be declined."
+msgstr ""
+
+msgid "The invitation has already been accepted."
+msgstr ""
+
+msgid "The invitation was successfully resent."
+msgstr ""
+
+msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
+msgstr ""
+
+msgid "The last owner cannot be set to awaiting"
+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 latest pipeline for this merge request did not succeed. The latest changes are unverified."
+msgstr ""
+
+msgid "The latest pipeline for this merge request has failed."
+msgstr ""
+
+msgid "The license key is invalid."
+msgstr ""
+
+msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
+msgstr ""
+
+msgid "The license was removed. GitLab has fallen back on the previous license."
+msgstr ""
+
+msgid "The license was removed. GitLab now no longer has a valid license."
+msgstr ""
+
+msgid "The license was successfully uploaded and is now active. You can see the details below."
+msgstr ""
+
+msgid "The license was successfully uploaded and will be active from %{starts_at}. You can see the details below."
+msgstr ""
+
+msgid "The license you uploaded is invalid. If the issue persists, contact support at %{link}."
+msgstr ""
+
+msgid "The list creation wizard is already open"
+msgstr ""
+
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
+msgid "The maximum file size allowed is %{size}."
+msgstr ""
+
+msgid "The maximum file size for job artifacts."
+msgstr ""
+
+msgid "The maximum file size in megabytes for individual job artifacts."
+msgstr ""
+
+msgid "The maximum file size is %{size}."
+msgstr ""
+
+msgid "The maximum number of CI/CD minutes on shared runners that a group can use each month. 0 for unlimited."
+msgstr ""
+
+msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
+msgstr ""
+
+msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
+msgstr ""
+
+msgid "The merge conflicts for this merge request have already been resolved."
+msgstr ""
+
+msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
+msgstr ""
+
+msgid "The metric must be one of %{metrics}."
+msgstr ""
+
+msgid "The name \"%{name}\" is already taken in this directory."
+msgstr ""
+
+msgid "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})."
+msgstr ""
+
+msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
+msgstr ""
+
+msgid "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"
+msgstr ""
+
+msgid "The number of merge requests merged by month."
+msgstr ""
+
+msgid "The number of times an upload record could not find its file"
+msgstr ""
+
+msgid "The page could not be displayed because it timed out."
+msgstr ""
+
+msgid "The parent epic is confidential and can only contain confidential epics and issues"
+msgstr ""
+
+msgid "The password for the Jenkins server."
+msgstr ""
+
+msgid "The password for your GitLab account on %{gitlab_url} has successfully been changed."
+msgstr ""
+
+msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
+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 project can be accessed by any logged in user except external users."
+msgstr ""
+
+msgid "The project can be accessed without any authentication."
+msgstr ""
+
+msgid "The project has already been added to your dashboard."
+msgstr ""
+
+msgid "The project is still being deleted. Please try again later."
+msgstr ""
+
+msgid "The project size exceeds the export limit."
+msgstr ""
+
+msgid "The project was successfully forked."
+msgstr ""
+
+msgid "The project was successfully imported."
+msgstr ""
+
+msgid "The related CI build failed."
+msgstr ""
+
+msgid "The remote mirror URL is invalid."
+msgstr ""
+
+msgid "The remote mirror took to long to complete."
+msgstr ""
+
+msgid "The remote repository is being updated..."
+msgstr ""
+
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
+msgid "The repository can be committed to, and issues, comments and other entities can be created."
+msgstr ""
+
+msgid "The repository for this project does not exist."
+msgstr ""
+
+msgid "The repository for this project is empty"
+msgstr ""
+
+msgid "The repository is being updated..."
+msgstr ""
+
+msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}."
+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 same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
+msgstr ""
+
+msgid "The scan has been created."
+msgstr ""
+
+msgid "The snippet can be accessed without any authentication."
+msgstr ""
+
+msgid "The snippet is visible only to me."
+msgstr ""
+
+msgid "The snippet is visible only to project members."
+msgstr ""
+
+msgid "The snippet is visible to any logged in user except external users."
+msgstr ""
+
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
+msgid "The specified tab is invalid, please select another"
+msgstr ""
+
+msgid "The start date must be ealier than the end date."
+msgstr ""
+
+msgid "The subject will be used as the title of the new issue, and the message will be the description. %{quickActionsLinkStart}Quick actions%{quickActionsLinkEnd} and styling with %{markdownLinkStart}Markdown%{markdownLinkEnd} are supported."
+msgstr ""
+
+msgid "The tag name can't be changed for an existing release."
+msgstr ""
+
+msgid "The time period in seconds that the maximum requests per project limit applies to."
+msgstr ""
+
+msgid "The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination."
+msgstr ""
+
+msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
+msgstr ""
+
+msgid "The user is being deleted."
+msgstr ""
+
+msgid "The user map has been saved. Continue by selecting the projects you want to import."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
+msgid "The user you are trying to approve is not pending approval"
+msgstr ""
+
+msgid "The user you are trying to deactivate has been active in the past %{minimum_inactive_days} days and cannot be deactivated"
+msgstr ""
+
+msgid "The username for the Jenkins server."
+msgstr ""
+
+msgid "The value of the provided variable exceeds the %{count} character limit"
+msgstr ""
+
+msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be an acceptable business risk."
+msgstr ""
+
+msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be in a part of the application that will not be updated."
+msgstr ""
+
+msgid "The vulnerability is no longer detected. Verify the vulnerability has been fixed or removed before changing its status."
+msgstr ""
+
+msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
+msgstr ""
+
+msgid "Theme"
+msgstr ""
+
+msgid "There are currently no events."
+msgstr ""
+
+msgid "There are merge conflicts"
+msgstr ""
+
+msgid "There are no %{replicableTypeName} to show"
+msgstr ""
+
+msgid "There are no GPG keys associated with this account."
+msgstr ""
+
+msgid "There are no GPG keys with access to your account."
+msgstr ""
+
+msgid "There are no SSH keys associated with this account."
+msgstr ""
+
+msgid "There are no SSH keys with access to your account."
+msgstr ""
+
+msgid "There are no Spam Logs"
+msgstr ""
+
+msgid "There are no abuse reports!"
+msgstr ""
+
+msgid "There are no archived projects yet"
+msgstr ""
+
+msgid "There are no archived requirements"
+msgstr ""
+
+msgid "There are no archived test cases"
+msgstr ""
+
+msgid "There are no changes"
+msgstr ""
+
+msgid "There are no charts configured for this page"
+msgstr ""
+
+msgid "There are no closed epics"
+msgstr ""
+
+msgid "There are no closed issues"
+msgstr ""
+
+msgid "There are no closed merge requests"
+msgstr ""
+
+msgid "There are no commits yet."
+msgstr ""
+
+msgid "There are no custom project templates set up for this GitLab instance. They are enabled from GitLab's Admin Area. Contact your GitLab instance administrator to setup custom project templates."
+msgstr ""
+
+msgid "There are no issues to show"
+msgstr ""
+
+msgid "There are no issues with the selected labels"
+msgstr ""
+
+msgid "There are no matching files"
+msgstr ""
+
+msgid "There are no open epics"
+msgstr ""
+
+msgid "There are no open issues"
+msgstr ""
+
+msgid "There are no open merge requests"
+msgstr ""
+
+msgid "There are no open requirements"
+msgstr ""
+
+msgid "There are no open test cases"
+msgstr ""
+
+msgid "There are no packages yet"
+msgstr ""
+
+msgid "There are no projects shared with this group yet"
+msgstr ""
+
+msgid "There are no secure files yet."
+msgstr ""
+
+msgid "There are no topics to show."
+msgstr ""
+
+msgid "There are no variables yet."
+msgstr ""
+
+msgid "There are running deployments on the environment. Please retry later."
+msgstr ""
+
+msgid "There are several file size limits in place for the Package Registry."
+msgstr ""
+
+msgid "There are several rate limits in place to protect the system."
+msgstr ""
+
+msgid "There are several size limits in place."
+msgstr ""
+
+msgid "There is already a repository with that name on disk"
+msgstr ""
+
+msgid "There is already a to-do item for this design."
+msgstr ""
+
+msgid "There is no chart data available."
+msgstr ""
+
+msgid "There is no data available."
+msgstr ""
+
+msgid "There is no data available. Please change your selection."
+msgstr ""
+
+msgid "There is no seat left to activate the member"
+msgstr ""
+
+msgid "There is no table data available."
+msgstr ""
+
+msgid "There is too much data to calculate. Please change your selection."
+msgstr ""
+
+msgid "There was a problem communicating with your device."
+msgstr ""
+
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
+msgid "There was a problem fetching branches."
+msgstr ""
+
+msgid "There was a problem fetching emojis."
+msgstr ""
+
+msgid "There was a problem fetching epics."
+msgstr ""
+
+msgid "There was a problem fetching groups."
+msgstr ""
+
+msgid "There was a problem fetching iterations."
+msgstr ""
+
+msgid "There was a problem fetching labels."
+msgstr ""
+
+msgid "There was a problem fetching linked pipelines."
+msgstr ""
+
+msgid "There was a problem fetching milestones."
+msgstr ""
+
+msgid "There was a problem fetching project branches."
+msgstr ""
+
+msgid "There was a problem fetching project tags."
+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 releases."
+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 latest pipeline status."
+msgstr ""
+
+msgid "There was a problem fetching the pipeline stages."
+msgstr ""
+
+msgid "There was a problem fetching the projects"
+msgstr ""
+
+msgid "There was a problem fetching users."
+msgstr ""
+
+msgid "There was a problem handling the pipeline data."
+msgstr ""
+
+msgid "There was a problem sending the confirmation email"
+msgstr ""
+
+msgid "There was a problem updating the keep latest artifacts setting."
+msgstr ""
+
+msgid "There was an error %{message} to-do item."
+msgstr ""
+
+msgid "There was an error adding a To Do."
+msgstr ""
+
+msgid "There was an error creating the dashboard, branch name is invalid."
+msgstr ""
+
+msgid "There was an error creating the dashboard, branch named: %{branch} already exists."
+msgstr ""
+
+msgid "There was an error creating the issue"
+msgstr ""
+
+msgid "There was an error deleting the To Do."
+msgstr ""
+
+msgid "There was an error fetching configuration for charts"
+msgstr ""
+
+msgid "There was an error fetching data for the selected stage"
+msgstr ""
+
+msgid "There was an error fetching data for the tasks by type chart"
+msgstr ""
+
+msgid "There was an error fetching label data for the selected group"
+msgstr ""
+
+msgid "There was an error fetching median data for stages"
+msgstr ""
+
+msgid "There was an error fetching projects"
+msgstr ""
+
+msgid "There was an error fetching stage total counts"
+msgstr ""
+
+msgid "There was an error fetching the %{replicableType}"
+msgstr ""
+
+msgid "There was an error fetching the deploy freezes."
+msgstr ""
+
+msgid "There was an error fetching the environments information."
+msgstr ""
+
+msgid "There was an error fetching the jobs for your project."
+msgstr ""
+
+msgid "There was an error fetching the top labels for the selected group"
+msgstr ""
+
+msgid "There was an error fetching the variables."
+msgstr ""
+
+msgid "There was an error fetching value stream analytics stages."
+msgstr ""
+
+msgid "There was an error gathering the chart data"
+msgstr ""
+
+msgid "There was an error getting the epic participants."
+msgstr ""
+
+msgid "There was an error importing the Jira project."
+msgstr ""
+
+msgid "There was an error loading related feature flags"
+msgstr ""
+
+msgid "There was an error loading users activity calendar."
+msgstr ""
+
+msgid "There was an error parsing the data for this graph."
+msgstr ""
+
+msgid "There was an error removing the e-mail."
+msgstr ""
+
+msgid "There was an error resetting group pipeline minutes."
+msgstr ""
+
+msgid "There was an error resetting user pipeline minutes."
+msgstr ""
+
+msgid "There was an error retrieving the Jira users."
+msgstr ""
+
+msgid "There was an error saving your changes."
+msgstr ""
+
+msgid "There was an error subscribing to this label."
+msgstr ""
+
+msgid "There was an error syncing project %{name}"
+msgstr ""
+
+msgid "There was an error syncing the %{replicableType}"
+msgstr ""
+
+msgid "There was an error trying to validate your query"
+msgstr ""
+
+msgid "There was an error updating the Maintenance Mode Settings"
+msgstr ""
+
+msgid "There was an error updating the dashboard, branch name is invalid."
+msgstr ""
+
+msgid "There was an error updating the dashboard, branch named: %{branch} already exists."
+msgstr ""
+
+msgid "There was an error when reseting email token."
+msgstr ""
+
+msgid "There was an error when subscribing to this label."
+msgstr ""
+
+msgid "There was an error when unsubscribing from this label."
+msgstr ""
+
+msgid "There was an error while fetching the chart data. Please refresh the page to try again."
+msgstr ""
+
+msgid "There was an error while fetching the table data. Please refresh the page to try again."
+msgstr ""
+
+msgid "There was an error while fetching value stream analytics data."
+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 ""
+
+msgid "These dates affect how your epics appear in the roadmap. Set a fixed date or one inherited from the milestones assigned to issues in this epic."
+msgstr ""
+
+msgid "These examples show how to trigger this project's pipeline for a branch or tag."
+msgstr ""
+
+msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
+msgstr ""
+
+msgid "These runners are shared across projects in this group."
+msgstr ""
+
+msgid "These runners are shared across this GitLab instance."
+msgstr ""
+
+msgid "These runners are specific to this project."
+msgstr ""
+
+msgid "These variables are inherited from the parent group."
+msgstr ""
+
+msgid "These will be sent to %{email} in an attachment once finished."
+msgstr ""
+
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
+msgid "Third Party Advisory Link"
+msgstr ""
+
+msgid "This %{issuableDisplayName} is locked. Only project members can comment."
+msgstr ""
+
+msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
+msgstr ""
+
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
+msgstr ""
+
+msgid "This %{noteableTypeText} is locked."
+msgstr ""
+
+msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead."
+msgstr ""
+
+msgid "This Cron pattern is invalid"
+msgstr ""
+
+msgid "This GitLab instance does not provide any shared runners yet. Instance administrators can register shared runners in the admin area."
+msgstr ""
+
+msgid "This GitLab instance is licensed at the %{insufficient_license} tier. Geo is only available for users who have at least a Premium license."
+msgstr ""
+
+msgid "This PDF is too large to display. Please download to view."
+msgstr ""
+
+msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
+msgstr ""
+
+msgid "This URL already exists."
+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 deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
+msgstr ""
+
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
+msgstr ""
+
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
+msgstr ""
+
+msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
+msgstr ""
+
+msgid "This also resolves all related threads"
+msgstr ""
+
+msgid "This also resolves this thread"
+msgstr ""
+
+msgid "This application was created by %{user_link}."
+msgstr ""
+
+msgid "This application was created for group %{group_link}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This archive has been requested too many times. Try again later."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{count} %{issuables} have been included. Consider re-exporting with a narrower selection of %{issuables}."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{issues_count} issues have been included. Consider re-exporting with a narrower selection of issues."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{merge_requests_count} merge requests have been included. Consider re-exporting with a narrower selection of merge requests."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{requirements_count} requirements have been included. Consider re-exporting with a narrower selection of requirements."
+msgstr ""
+
+msgid "This block is self-referential"
+msgstr ""
+
+msgid "This board's scope is reduced"
+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 ""
+
+msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
+msgstr ""
+
+msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
+msgstr ""
+
+msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
+msgstr ""
+
+msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with a different user's verified signature."
+msgstr ""
+
+msgid "This commit was signed with a verified signature, but the committer email is %{strong_open}not verified%{strong_close} to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
+msgstr ""
+
+msgid "This content could not be displayed because %{reason}. You can %{options} instead."
+msgstr ""
+
+msgid "This content could not be displayed because it is stored in LFS. You can %{linkStart}download it%{linkEnd} instead."
+msgstr ""
+
+msgid "This credential has expired"
+msgstr ""
+
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
+msgid "This device has already been registered with us."
+msgstr ""
+
+msgid "This device has not been registered with us."
+msgstr ""
+
+msgid "This diff is collapsed."
+msgstr ""
+
+msgid "This directory"
+msgstr ""
+
+msgid "This domain is not verified. You will need to verify ownership before access is enabled."
+msgstr ""
+
+msgid "This email supersedes any previous emails about scheduled deletion you may have received for %{project_link}."
+msgstr ""
+
+msgid "This email supersedes any previous emails about scheduled deletion you may have received for %{project_name}."
+msgstr ""
+
+msgid "This endpoint has been requested too many times. Try again later."
+msgstr ""
+
+msgid "This environment has no deployments yet."
+msgstr ""
+
+msgid "This environment is being deployed"
+msgstr ""
+
+msgid "This environment is being re-deployed"
+msgstr ""
+
+msgid "This environment is not protected."
+msgstr ""
+
+msgid "This environment's canary ingress has been updated recently. Please retry later."
+msgstr ""
+
+msgid "This epic already has the maximum number of child epics."
+msgstr ""
+
+msgid "This epic does not exist or you don't have sufficient permission."
+msgstr ""
+
+msgid "This epic would exceed maximum number of related epics."
+msgstr ""
+
+msgid "This feature requires local storage to be enabled"
+msgstr ""
+
+msgid "This field is required"
+msgstr ""
+
+msgid "This field is required."
+msgstr ""
+
+msgid "This file was modified for readability, and can't accept suggestions. Edit it directly."
+msgstr ""
+
+msgid "This form is disabled in preview"
+msgstr ""
+
+msgid "This group"
+msgstr ""
+
+msgid "This group and its subgroups and projects will be placed in a 'pending deletion' state for %{deletion_adjourned_period} days, then permanently deleted on %{date}. The group can be fully restored before that date."
+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 transferred 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 ""
+
+msgid "This group does not have any group runners yet."
+msgstr ""
+
+msgid "This group has been scheduled for permanent removal on %{date}"
+msgstr ""
+
+msgid "This group has no active access tokens."
+msgstr ""
+
+msgid "This group is linked to a subscription"
+msgstr ""
+
+msgid "This group is not permitted to create compliance violations"
+msgstr ""
+
+msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
+msgstr ""
+
+msgid "This group, its subgroups and projects will be removed on %{date} since its parent group '%{parent_group_name}' has been scheduled for removal."
+msgstr ""
+
+msgid "This incident is already escalated with '%{escalation_policy_name}'."
+msgstr ""
+
+msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
+msgstr ""
+
+msgid "This is a \"Ghost User\", created to hold all issues authored by users that have since been deleted. This user cannot be removed."
+msgstr ""
+
+msgid "This is a Jira user."
+msgstr ""
+
+msgid "This is a confidential %{noteableTypeText}."
+msgstr ""
+
+msgid "This is a delayed job to run in %{remainingTime}"
+msgstr ""
+
+msgid "This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize."
+msgstr ""
+
+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 authentication events involving your account."
+msgstr ""
+
+msgid "This is a self-managed instance of GitLab."
+msgstr ""
+
+msgid "This is an experimental feature developed by GitLab Incubation Engineering."
+msgstr ""
+
+msgid "This is the highest peak of users on your installation since the license started."
+msgstr ""
+
+msgid "This is the number of %{billable_users_link_start}billable users%{link_end} on your installation, and this is the minimum number you need to purchase when you renew your license."
+msgstr ""
+
+msgid "This is your current session"
+msgstr ""
+
+msgid "This issue cannot be assigned to a confidential epic because it is public."
+msgstr ""
+
+msgid "This issue cannot be made public because it belongs to a confidential epic."
+msgstr ""
+
+msgid "This issue is confidential and should only be visible to team members with at least Reporter access."
+msgstr ""
+
+msgid "This issue is currently blocked by the following issues:"
+msgstr ""
+
+msgid "This issue is hidden because its author has been banned"
+msgstr ""
+
+msgid "This issue is in a child epic of the filtered epic"
+msgstr ""
+
+msgid "This job could not start because it could not retrieve the needed artifacts%{punctuation}%{invalid_dependencies}"
+msgstr ""
+
+msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
+msgstr ""
+
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
+msgid "This job does not have a trace."
+msgstr ""
+
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
+msgid "This job has been canceled"
+msgstr ""
+
+msgid "This job has been skipped"
+msgstr ""
+
+msgid "This job has not been triggered yet"
+msgstr ""
+
+msgid "This job has not started yet"
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}. View the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink}. View the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink}. View the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is archived. Only the complete pipeline can be retried."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}. This will overwrite the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}. This will overwrite the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink}. This will overwrite the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
+msgstr ""
+
+msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink}."
+msgstr ""
+
+msgid "This job is deployed to %{environmentLink}."
+msgstr ""
+
+msgid "This job is in pending state and is waiting to be picked by a runner"
+msgstr ""
+
+msgid "This job is performing tasks that must complete before it can start"
+msgstr ""
+
+msgid "This job is preparing to start"
+msgstr ""
+
+msgid "This job is waiting for resource: "
+msgstr ""
+
+msgid "This job requires a manual action"
+msgstr ""
+
+msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
+msgstr ""
+
+msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
+msgstr ""
+
+msgid "This license has already expired."
+msgstr ""
+
+msgid "This link points to external content"
+msgstr ""
+
+msgid "This may expose confidential information as the selected fork is in another namespace that can have other members."
+msgstr ""
+
+msgid "This means you can not push code until you create an empty repository or import existing one."
+msgstr ""
+
+msgid "This merge request branch is protected from force push."
+msgstr ""
+
+msgid "This merge request cannot be rebased while there are conflicts."
+msgstr ""
+
+msgid "This merge request does not have accessibility reports"
+msgstr ""
+
+msgid "This merge request does not have codequality reports"
+msgstr ""
+
+msgid "This merge request is closed. To apply this suggestion, edit this file directly."
+msgstr ""
+
+msgid "This merge request is from a private project to a public project."
+msgstr ""
+
+msgid "This merge request is from a private project to an internal project."
+msgstr ""
+
+msgid "This merge request is from an internal project to a public project."
+msgstr ""
+
+msgid "This merge request is locked."
+msgstr ""
+
+msgid "This merge request was merged. To apply this suggestion, edit this file directly."
+msgstr ""
+
+msgid "This namespace has already been taken! Please choose another one."
+msgstr ""
+
+msgid "This only applies to repository indexing operations."
+msgstr ""
+
+msgid "This page is unavailable because you are not allowed to read information across multiple projects."
+msgstr ""
+
+msgid "This page sends a payload. Go back to the events page to see a newly created event."
+msgstr ""
+
+msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
+msgstr ""
+
+msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
+msgstr ""
+
+msgid "This pipeline was triggered by a schedule."
+msgstr ""
+
+msgid "This process deletes the project repository and all related resources."
+msgstr ""
+
+msgid "This project"
+msgstr ""
+
+msgid "This project can be restored until %{date}."
+msgstr ""
+
+msgid "This project cannot be %{visibilityLevel} because the visibility of %{openShowLink}%{name}%{closeShowLink} is %{visibility}. To make this project %{visibilityLevel}, you must first %{openEditLink}change the visibility%{closeEditLink} of the parent group."
+msgstr ""
+
+msgid "This project does not belong to a group and cannot make use of group runners."
+msgstr ""
+
+msgid "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."
+msgstr ""
+
+msgid "This project does not have a wiki homepage yet"
+msgstr ""
+
+msgid "This project has no active access tokens."
+msgstr ""
+
+msgid "This project is %{strongStart}NOT%{strongEnd} a fork, and has the following:"
+msgstr ""
+
+msgid "This project is %{strongStart}NOT%{strongEnd} a fork. This process deletes the project repository and all related resources."
+msgstr ""
+
+msgid "This project is archived and cannot be commented on."
+msgstr ""
+
+msgid "This project is licensed under the %{strong_start}%{license_name}%{strong_end}."
+msgstr ""
+
+msgid "This project is not subscribed to any project pipelines."
+msgstr ""
+
+msgid "This project manages its dependencies using %{strong_start}%{manager_name}%{strong_end}"
+msgstr ""
+
+msgid "This project path either does not exist or you do not have access."
+msgstr ""
+
+msgid "This project will be deleted on %{date}"
+msgstr ""
+
+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 store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
+msgstr ""
+
+msgid "This repository"
+msgstr ""
+
+msgid "This repository has never been checked."
+msgstr ""
+
+msgid "This repository is currently empty. A new Auto DevOps pipeline will be created after a new file has been pushed to a branch."
+msgstr ""
+
+msgid "This repository was last checked %{last_check_timestamp}. The check %{strong_start}failed.%{strong_end} See the 'repocheck.log' file for error messages."
+msgstr ""
+
+msgid "This repository was last checked %{last_check_timestamp}. The check passed."
+msgstr ""
+
+msgid "This runner will only run on pipelines triggered on protected branches"
+msgstr ""
+
+msgid "This setting can be overridden in each project."
+msgstr ""
+
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
+msgid "This setting is allowed for forked projects only"
+msgstr ""
+
+msgid "This subscription is for"
+msgstr ""
+
+msgid "This suggestion already matches its content."
+msgstr ""
+
+msgid "This title already exists."
+msgstr ""
+
+msgid "This user cannot be unlocked manually from GitLab"
+msgstr ""
+
+msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
+msgstr ""
+
+msgid "This user has an unconfirmed email address. You may force a confirmation."
+msgstr ""
+
+msgid "This user has no active %{accessTokenTypePlural}."
+msgstr ""
+
+msgid "This user has no active %{type}."
+msgstr ""
+
+msgid "This user has no identities"
+msgstr ""
+
+msgid "This user has no personal projects."
+msgstr ""
+
+msgid "This user has previously committed to the %{name} project."
+msgstr ""
+
+msgid "This user has the %{access} role in the %{name} project."
+msgstr ""
+
+msgid "This user is the author of this %{noteable}."
+msgstr ""
+
+msgid "This variable can not be masked."
+msgstr ""
+
+msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
+msgstr ""
+
+msgid "This will invalidate your registered applications and U2F devices."
+msgstr ""
+
+msgid "This will remove the fork relationship between this project and %{fork_source}."
+msgstr ""
+
+msgid "This will remove the fork relationship between this project and other projects in the fork network."
+msgstr ""
+
+msgid "Thread to reply to cannot be found"
+msgstr ""
+
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
+msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
+msgstr ""
+
+msgid "Throughput"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Time"
+msgstr ""
+
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
+msgid "Time based: Yes"
+msgstr ""
+
+msgid "Time before an issue gets scheduled"
+msgstr ""
+
+msgid "Time before an issue starts implementation"
+msgstr ""
+
+msgid "Time between merge request creation and merge/close"
+msgstr ""
+
+msgid "Time estimate"
+msgstr ""
+
+msgid "Time from first comment to last commit"
+msgstr ""
+
+msgid "Time from first commit until first comment"
+msgstr ""
+
+msgid "Time from last commit to merge"
+msgstr ""
+
+msgid "Time of import: %{importTime}"
+msgstr ""
+
+msgid "Time remaining"
+msgstr ""
+
+msgid "Time spent"
+msgstr ""
+
+msgid "Time to Restore Service"
+msgstr ""
+
+msgid "Time to merge"
+msgstr ""
+
+msgid "Time to subtract exceeds the total time spent"
+msgstr ""
+
+msgid "Time tracking"
+msgstr ""
+
+msgid "Time tracking report"
+msgstr ""
+
+msgid "Time until first merge request"
+msgstr ""
+
+msgid "Time zone"
+msgstr ""
+
+msgid "TimeTrackingEstimated|Est"
+msgstr ""
+
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
+msgstr ""
+
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
+msgid "TimeTracking|Estimated:"
+msgstr ""
+
+msgid "TimeTracking|Over by %{timeRemainingHumanReadable}"
+msgstr ""
+
+msgid "TimeTracking|Spent"
+msgstr ""
+
+msgid "TimeTracking|Time remaining: %{timeRemainingHumanReadable}"
+msgstr ""
+
+msgid "Timeago|%s days ago"
+msgstr ""
+
+msgid "Timeago|%s days remaining"
+msgstr ""
+
+msgid "Timeago|%s hours ago"
+msgstr ""
+
+msgid "Timeago|%s hours remaining"
+msgstr ""
+
+msgid "Timeago|%s minutes ago"
+msgstr ""
+
+msgid "Timeago|%s minutes remaining"
+msgstr ""
+
+msgid "Timeago|%s months ago"
+msgstr ""
+
+msgid "Timeago|%s months remaining"
+msgstr ""
+
+msgid "Timeago|%s seconds remaining"
+msgstr ""
+
+msgid "Timeago|%s weeks ago"
+msgstr ""
+
+msgid "Timeago|%s weeks remaining"
+msgstr ""
+
+msgid "Timeago|%s years ago"
+msgstr ""
+
+msgid "Timeago|%s years remaining"
+msgstr ""
+
+msgid "Timeago|1 day ago"
+msgstr ""
+
+msgid "Timeago|1 day remaining"
+msgstr ""
+
+msgid "Timeago|1 hour ago"
+msgstr ""
+
+msgid "Timeago|1 hour remaining"
+msgstr ""
+
+msgid "Timeago|1 minute ago"
+msgstr ""
+
+msgid "Timeago|1 minute remaining"
+msgstr ""
+
+msgid "Timeago|1 month ago"
+msgstr ""
+
+msgid "Timeago|1 month remaining"
+msgstr ""
+
+msgid "Timeago|1 week ago"
+msgstr ""
+
+msgid "Timeago|1 week remaining"
+msgstr ""
+
+msgid "Timeago|1 year ago"
+msgstr ""
+
+msgid "Timeago|1 year remaining"
+msgstr ""
+
+msgid "Timeago|Past due"
+msgstr ""
+
+msgid "Timeago|in %s days"
+msgstr ""
+
+msgid "Timeago|in %s hours"
+msgstr ""
+
+msgid "Timeago|in %s minutes"
+msgstr ""
+
+msgid "Timeago|in %s months"
+msgstr ""
+
+msgid "Timeago|in %s seconds"
+msgstr ""
+
+msgid "Timeago|in %s weeks"
+msgstr ""
+
+msgid "Timeago|in %s years"
+msgstr ""
+
+msgid "Timeago|in 1 day"
+msgstr ""
+
+msgid "Timeago|in 1 hour"
+msgstr ""
+
+msgid "Timeago|in 1 minute"
+msgstr ""
+
+msgid "Timeago|in 1 month"
+msgstr ""
+
+msgid "Timeago|in 1 week"
+msgstr ""
+
+msgid "Timeago|in 1 year"
+msgstr ""
+
+msgid "Timeago|just now"
+msgstr ""
+
+msgid "Timeago|right now"
+msgstr ""
+
+msgid "Timeline|Turn recent updates view off"
+msgstr ""
+
+msgid "Timeline|Turn recent updates view on"
+msgstr ""
+
+msgid "Timeout"
+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 ""
+
+msgid "Time|hr"
+msgid_plural "Time|hrs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Time|min"
+msgid_plural "Time|mins"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Time|s"
+msgstr ""
+
+msgid "Tip: Hover over a job to see the jobs it depends on to run."
+msgstr ""
+
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Title (required)"
+msgstr ""
+
+msgid "Title:"
+msgstr ""
+
+msgid "Titles and Descriptions"
+msgstr ""
+
+msgid "To"
+msgstr ""
+
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgstr ""
+
+msgid "To Do"
+msgstr ""
+
+msgid "To GitLab"
+msgstr ""
+
+msgid "To accept this invitation, create an account or sign in."
+msgstr ""
+
+msgid "To accept this invitation, sign in or create an account."
+msgstr ""
+
+msgid "To accept this invitation, sign in."
+msgstr ""
+
+msgid "To access this domain create a new DNS record"
+msgstr ""
+
+msgid "To activate your trial, we need additional details from you."
+msgstr ""
+
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "To add the entry manually, provide the following details to the application on your phone."
+msgstr ""
+
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
+msgid "To complete registration, we need additional details from you."
+msgstr ""
+
+msgid "To confirm, type %{phrase_code}"
+msgstr ""
+
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+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, first enable Service Ping."
+msgstr ""
+
+msgid "To ensure %{project_link} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
+msgstr ""
+
+msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
+msgstr ""
+
+msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
+msgstr ""
+
+msgid "To find the state of this project's repository at the time of any of these versions, check out %{link_start}the tags%{link_end}"
+msgstr ""
+
+msgid "To further protect your account, consider configuring a %{mfa_link_start}two-factor authentication%{mfa_link_end} method."
+msgstr ""
+
+msgid "To further protect your account, consider configuring a two-factor authentication method: %{mfa_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, click the link below to confirm your account."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
+msgid "To get started, use the link below to confirm your account."
+msgstr ""
+
+msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
+msgstr ""
+
+msgid "To import an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To keep this project going, create a new issue"
+msgstr ""
+
+msgid "To keep this project going, create a new merge request"
+msgstr ""
+
+msgid "To learn more about this project, read %{link_to_wiki}"
+msgstr ""
+
+msgid "To manage all members associated with this group and its subgroups and projects, visit the %{link_start}usage quotas page%{link_end}."
+msgstr ""
+
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose %{strong_open}CI/CD for external repo%{strong_close}."
+msgstr ""
+
+msgid "To pass variables to the triggered pipeline, add %{code_start}variables[VARIABLE]=VALUE%{code_end} to the API request."
+msgstr ""
+
+msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
+msgstr ""
+
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
+msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
+msgstr ""
+
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
+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 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 ""
+
+msgid "To see all the user's personal access tokens you must impersonate them first."
+msgstr ""
+
+msgid "To see this project's operational details, %{linkStart}upgrade its group plan to Premium%{linkEnd}. You can also remove the project from the dashboard."
+msgstr ""
+
+msgid "To see this project's operational details, contact an owner of group %{groupName} to upgrade the plan. You can also remove the project from the dashboard."
+msgstr ""
+
+msgid "To see what's changed or create a merge request, choose a branch or tag (like %{branch}), or enter a commit (like %{sha})."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
+msgid "To set up this integration:"
+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 ""
+
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
+msgid "To unsubscribe from this issue, please paste the following link into your browser:"
+msgstr ""
+
+msgid "To update Snippets with multiple files, you must use the `files` parameter"
+msgstr ""
+
+msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
+msgstr ""
+
+msgid "To use the system's default, set this value to 0."
+msgstr ""
+
+msgid "To view all %{scannedResourcesCount} scanned URLs, %{linkStart}please download the CSV file%{linkEnd}"
+msgstr ""
+
+msgid "To view usage, refresh this page in a few minutes."
+msgstr ""
+
+msgid "To widen your search, change or remove filters above"
+msgstr ""
+
+msgid "To widen your search, change or remove filters above."
+msgstr ""
+
+msgid "To-Do"
+msgstr ""
+
+msgid "To-Do List"
+msgstr ""
+
+msgid "To-do item successfully marked as done."
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Todos count"
+msgstr ""
+
+msgid "Todos|Are you looking for things to do? Take a look at %{strongStart}%{openIssuesLinkStart}open issues%{openIssuesLinkEnd}%{strongEnd}, contribute to %{strongStart}%{mergeRequestLinkStart}a merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}, or mention someone in a comment to automatically assign them a new to-do item."
+msgstr ""
+
+msgid "Todos|Filter by author"
+msgstr ""
+
+msgid "Todos|Filter by group"
+msgstr ""
+
+msgid "Todos|Filter by project"
+msgstr ""
+
+msgid "Todos|It's how you always know what to work on next."
+msgstr ""
+
+msgid "Todos|Mark all as done"
+msgstr ""
+
+msgid "Todos|Nothing is on your to-do list. Nice work!"
+msgstr ""
+
+msgid "Todos|Undo mark all as done"
+msgstr ""
+
+msgid "Todos|When an issue or merge request is assigned to you, or when you receive a %{strongStart}@mention%{strongEnd} in a comment, this automatically triggers a new item in your To-Do List."
+msgstr ""
+
+msgid "Todos|You're all done!"
+msgstr ""
+
+msgid "Todos|Your To-Do List shows what to work on next"
+msgstr ""
+
+msgid "Toggle GitLab Next"
+msgstr ""
+
+msgid "Toggle Markdown preview"
+msgstr ""
+
+msgid "Toggle Sidebar"
+msgstr ""
+
+msgid "Toggle backtrace"
+msgstr ""
+
+msgid "Toggle collapse"
+msgstr ""
+
+msgid "Toggle comments for this file"
+msgstr ""
+
+msgid "Toggle commit description"
+msgstr ""
+
+msgid "Toggle commit list"
+msgstr ""
+
+msgid "Toggle dropdown"
+msgstr ""
+
+msgid "Toggle emoji award"
+msgstr ""
+
+msgid "Toggle focus mode"
+msgstr ""
+
+msgid "Toggle keyboard shortcuts help dialog"
+msgstr ""
+
+msgid "Toggle navigation"
+msgstr ""
+
+msgid "Toggle project select"
+msgstr ""
+
+msgid "Toggle shortcuts"
+msgstr ""
+
+msgid "Toggle sidebar"
+msgstr ""
+
+msgid "Toggle the Draft status"
+msgstr ""
+
+msgid "Toggle the Performance Bar"
+msgstr ""
+
+msgid "Toggled :%{name}: emoji award."
+msgstr ""
+
+msgid "Toggles :%{name}: emoji award."
+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 ""
+
+msgid "Too many changes to show."
+msgstr ""
+
+msgid "Too many namespaces enabled. Manage them through the console or the API."
+msgstr ""
+
+msgid "Too many projects enabled. Manage them through the console or the API."
+msgstr ""
+
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
+msgid "TopNav|Go back"
+msgstr ""
+
+msgid "Topic %{topic_name} was successfully created."
+msgstr ""
+
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
+msgid "Topic avatar"
+msgstr ""
+
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
+msgstr ""
+
+msgid "Topic was successfully updated."
+msgstr ""
+
+msgid "Topics"
+msgstr ""
+
+msgid "Total"
+msgstr ""
+
+msgid "Total Contributions"
+msgstr ""
+
+msgid "Total Score"
+msgstr ""
+
+msgid "Total artifacts size: %{total_size}"
+msgstr ""
+
+msgid "Total cores (CPUs)"
+msgstr ""
+
+msgid "Total memory (GB)"
+msgstr ""
+
+msgid "Total test time for all commits/merges"
+msgstr ""
+
+msgid "Total users"
+msgstr ""
+
+msgid "Total weight"
+msgstr ""
+
+msgid "Total: %{total}"
+msgstr ""
+
+msgid "TotalMilestonesIndicator|1000+"
+msgstr ""
+
+msgid "TotalRefCountIndicator|1000+"
+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 ""
+
+msgid "Training mode"
+msgstr ""
+
+msgid "Transfer"
+msgstr ""
+
+msgid "Transfer group to another parent group."
+msgstr ""
+
+msgid "Transfer ownership"
+msgstr ""
+
+msgid "Transfer project"
+msgstr ""
+
+msgid "Transfer your project into another namespace. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "TransferGroup|Cannot transfer group to one of its subgroup."
+msgstr ""
+
+msgid "TransferGroup|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
+msgstr ""
+
+msgid "TransferGroup|Database is not supported."
+msgstr ""
+
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
+msgid "TransferGroup|Group contains projects with NPM packages."
+msgstr ""
+
+msgid "TransferGroup|Group is already a root group."
+msgstr ""
+
+msgid "TransferGroup|Group is already associated to the parent group."
+msgstr ""
+
+msgid "TransferGroup|The parent group already has a subgroup or a project with the same path."
+msgstr ""
+
+msgid "TransferGroup|Transfer failed: %{error_message}"
+msgstr ""
+
+msgid "TransferGroup|You don't have enough permissions."
+msgstr ""
+
+msgid "TransferProject|Cannot move project"
+msgstr ""
+
+msgid "TransferProject|Please select a new namespace for your project."
+msgstr ""
+
+msgid "TransferProject|Project cannot be transferred, because tags are present in its container registry"
+msgstr ""
+
+msgid "TransferProject|Project is already in this namespace."
+msgstr ""
+
+msgid "TransferProject|Project with same name or path in target namespace already exists"
+msgstr ""
+
+msgid "TransferProject|Root namespace can't be updated if project has NPM packages"
+msgstr ""
+
+msgid "TransferProject|You don't have permission to transfer projects into that namespace."
+msgstr ""
+
+msgid "TransferProject|You don't have permission to transfer this project."
+msgstr ""
+
+msgid "Tree view"
+msgstr ""
+
+msgid "Trending"
+msgstr ""
+
+msgid "Trials|%{planName} Trial"
+msgstr ""
+
+msgid "Trials|Compare all plans"
+msgstr ""
+
+msgid "Trials|Create a new group to start your GitLab Ultimate trial."
+msgstr ""
+
+msgid "Trials|Day %{daysUsed}/%{duration}"
+msgstr ""
+
+msgid "Trials|Go back to GitLab"
+msgstr ""
+
+msgid "Trials|Hey there"
+msgstr ""
+
+msgid "Trials|Skip Trial"
+msgstr ""
+
+msgid "Trials|Upgrade %{groupName} to %{planName}"
+msgstr ""
+
+msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
+msgstr ""
+
+msgid "Trials|You can apply your trial to a new group or an existing group."
+msgstr ""
+
+msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
+msgstr ""
+
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you’re enjoying the features of GitLab %{planName}. To keep those features after your trial ends, you’ll need to buy a subscription. (You can also choose GitLab Premium if it meets your needs.)"
+msgstr ""
+
+msgid "Trial|Allowed characters: +, 0-9, -, and spaces."
+msgstr ""
+
+msgid "Trial|Company name"
+msgstr ""
+
+msgid "Trial|Continue"
+msgstr ""
+
+msgid "Trial|Continue using the basic features of GitLab for free."
+msgstr ""
+
+msgid "Trial|Country"
+msgstr ""
+
+msgid "Trial|Dismiss"
+msgstr ""
+
+msgid "Trial|GitLab Ultimate trial (optional)"
+msgstr ""
+
+msgid "Trial|Number of employees"
+msgstr ""
+
+msgid "Trial|Please select a country"
+msgstr ""
+
+msgid "Trial|Telephone number"
+msgstr ""
+
+msgid "Trial|Upgrade to Ultimate to keep using GitLab with advanced features."
+msgstr ""
+
+msgid "Trial|We will activate your trial on your group after you complete this step. After 30 days, you can:"
+msgstr ""
+
+msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial."
+msgstr ""
+
+msgid "Trigger"
+msgstr ""
+
+msgid "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."
+msgstr ""
+
+msgid "Trigger cluster reindexing"
+msgstr ""
+
+msgid "Trigger cluster reindexing. Only use this with an index that was created in GitLab 13.0 or later."
+msgstr ""
+
+msgid "Trigger job"
+msgstr ""
+
+msgid "Trigger manual job"
+msgstr ""
+
+msgid "Trigger pipelines for mirror updates"
+msgstr ""
+
+msgid "Trigger pipelines when branches or tags are updated in the upstream repository. Depending on the activity of the upstream repository, this may greatly increase the load on your CI runners. Only enable this if you know they can handle the load. %{strong_start}CI will run using the credentials assigned above.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Trigger removed."
+msgstr ""
+
+msgid "Trigger repository check"
+msgstr ""
+
+msgid "Trigger this manual action"
+msgstr ""
+
+msgid "Trigger token:"
+msgstr ""
+
+msgid "Trigger variables:"
+msgstr ""
+
+msgid "Trigger was created successfully."
+msgstr ""
+
+msgid "Trigger was successfully updated."
+msgstr ""
+
+msgid "Triggerer"
+msgstr ""
+
+msgid "Trigger|Trigger user has insufficient permissions to project"
+msgstr ""
+
+msgid "Trigger|invalid"
+msgstr ""
+
+msgid "Trusted"
+msgstr ""
+
+msgid "Trusted applications are automatically authorized on GitLab OAuth flow. It's highly recommended for the security of users that trusted applications have the confidential setting set to true."
+msgstr ""
+
+msgid "Try again"
+msgstr ""
+
+msgid "Try again?"
+msgstr ""
+
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
+msgid "Try all GitLab has to offer for 30 days."
+msgstr ""
+
+msgid "Try changing or removing filters."
+msgstr ""
+
+msgid "Try grouping with different labels"
+msgstr ""
+
+msgid "Try out GitLab Pipelines"
+msgstr ""
+
+msgid "Try the troubleshooting steps here."
+msgstr ""
+
+msgid "Try to fork again"
+msgstr ""
+
+msgid "Try to keep the first line under 52 characters and the others under 72."
+msgstr ""
+
+msgid "Try using a different search term to find the file you are looking for."
+msgstr ""
+
+msgid "Trying to communicate with your device. Plug it in (if needed) and press the button on the device now."
+msgstr ""
+
+msgid "Trying to communicate with your device. Plug it in (if you haven't already) and press the button on the device now."
+msgstr ""
+
+msgid "Tuesday"
+msgstr ""
+
+msgid "Turn off"
+msgstr ""
+
+msgid "Turn off notifications"
+msgstr ""
+
+msgid "Turn on"
+msgstr ""
+
+msgid "Turn on notifications"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
+msgid "Twitter:"
+msgstr ""
+
+msgid "Two-Factor Authentication"
+msgstr ""
+
+msgid "Two-Factor Authentication code"
+msgstr ""
+
+msgid "Two-factor Authentication"
+msgstr ""
+
+msgid "Two-factor Authentication Recovery codes"
+msgstr ""
+
+msgid "Two-factor Authentication:"
+msgstr ""
+
+msgid "Two-factor authentication"
+msgstr ""
+
+msgid "Two-factor authentication disabled"
+msgstr ""
+
+msgid "Two-factor authentication grace period"
+msgstr ""
+
+msgid "Two-factor authentication has been disabled for this user"
+msgstr ""
+
+msgid "Two-factor authentication has been disabled for your GitLab account."
+msgstr ""
+
+msgid "Two-factor authentication has been disabled successfully!"
+msgstr ""
+
+msgid "Two-factor authentication is not enabled for this user"
+msgstr ""
+
+msgid "Two-factor grace period"
+msgstr ""
+
+msgid "Type"
+msgstr ""
+
+msgid "U2F Devices (%{length})"
+msgstr ""
+
+msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details."
+msgstr ""
+
+msgid "URL"
+msgstr ""
+
+msgid "URL cannot be blank"
+msgstr ""
+
+msgid "URL is invalid"
+msgstr ""
+
+msgid "URL is required"
+msgstr ""
+
+msgid "URL is triggered for each branch updated to the repository"
+msgstr ""
+
+msgid "URL is triggered when a merge request is created, updated, or merged"
+msgstr ""
+
+msgid "URL is triggered when a new tag is pushed to the repository"
+msgstr ""
+
+msgid "URL is triggered when repository is updated"
+msgstr ""
+
+msgid "URL must be percent-encoded if necessary."
+msgstr ""
+
+msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
+msgstr ""
+
+msgid "URL of the Grafana instance to link to from the Metrics Dashboard menu item."
+msgstr ""
+
+msgid "URL of the external Spam Check endpoint"
+msgstr ""
+
+msgid "URL of the external storage to serve the repository static objects."
+msgstr ""
+
+msgid "URL or request ID"
+msgstr ""
+
+msgid "USER %{user_name} WILL BE REMOVED! Are you sure?"
+msgstr ""
+
+msgid "USER %{user} WILL BE REMOVED! Are you sure?"
+msgstr ""
+
+msgid "USER WILL BE BLOCKED! Are you sure?"
+msgstr ""
+
+msgid "UTC"
+msgstr ""
+
+msgid "Unable to apply suggestions to a deleted line."
+msgstr ""
+
+msgid "Unable to build Slack link."
+msgstr ""
+
+msgid "Unable to collect CPU info"
+msgstr ""
+
+msgid "Unable to collect memory info"
+msgstr ""
+
+msgid "Unable to connect to Prometheus server"
+msgstr ""
+
+msgid "Unable to connect to server: %{error}"
+msgstr ""
+
+msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
+msgstr ""
+
+msgid "Unable to create link to vulnerability"
+msgstr ""
+
+msgid "Unable to fetch branch list for this project."
+msgstr ""
+
+msgid "Unable to fetch branches list, please close the form and try again"
+msgstr ""
+
+msgid "Unable to fetch upstream and downstream pipelines."
+msgstr ""
+
+msgid "Unable to find Jira project to import data from."
+msgstr ""
+
+msgid "Unable to fully load the default commit message. You can still apply this suggestion and the commit message will be correct."
+msgstr ""
+
+msgid "Unable to generate new instance ID"
+msgstr ""
+
+msgid "Unable to load commits. Try again later."
+msgstr ""
+
+msgid "Unable to load file contents. Try again later."
+msgstr ""
+
+msgid "Unable to load refs"
+msgstr ""
+
+msgid "Unable to load the diff"
+msgstr ""
+
+msgid "Unable to load the diff. %{button_try_again}"
+msgstr ""
+
+msgid "Unable to load the merge request widget. Try reloading the page."
+msgstr ""
+
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
+msgid "Unable to save iteration. Please try again"
+msgstr ""
+
+msgid "Unable to save your changes. Please try again."
+msgstr ""
+
+msgid "Unable to save your preference"
+msgstr ""
+
+msgid "Unable to schedule a pipeline to run immediately"
+msgstr ""
+
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unable to suggest a path. Please refresh and try again."
+msgstr ""
+
+msgid "Unable to update label prioritization at this time"
+msgstr ""
+
+msgid "Unable to update this epic at this time."
+msgstr ""
+
+msgid "Unable to update this issue at this time."
+msgstr ""
+
+msgid "Unable to verify the user"
+msgstr ""
+
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
+msgid "Unarchive project"
+msgstr ""
+
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Unassign from commenting user"
+msgstr ""
+
+msgid "Unassigned"
+msgstr ""
+
+msgid "Unauthenticated API rate limit period in seconds"
+msgstr ""
+
+msgid "Unauthenticated requests"
+msgstr ""
+
+msgid "Unauthenticated web rate limit period in seconds"
+msgstr ""
+
+msgid "Uncommitted changes will be lost if you change branches. Do you want to continue?"
+msgstr ""
+
+msgid "Undo"
+msgstr ""
+
+msgid "Undo Ignore"
+msgstr ""
+
+msgid "Undo ignore"
+msgstr ""
+
+msgid "Unexpected error"
+msgstr ""
+
+msgid "Unfollow"
+msgstr ""
+
+msgid "Unfortunately, your email message to GitLab could not be processed."
+msgstr ""
+
+msgid "Unhappy?"
+msgstr ""
+
+msgid "Units|ms"
+msgstr ""
+
+msgid "Units|s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Unknown Error"
+msgstr ""
+
+msgid "Unknown encryption strategy: %{encrypted_strategy}!"
+msgstr ""
+
+msgid "Unknown format"
+msgstr ""
+
+msgid "Unknown response text"
+msgstr ""
+
+msgid "Unknown screen"
+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 ""
+
+msgid "Unlimited"
+msgstr ""
+
+msgid "Unlink"
+msgstr ""
+
+msgid "Unlock"
+msgstr ""
+
+msgid "Unlock account"
+msgstr ""
+
+msgid "Unlock merge request"
+msgstr ""
+
+msgid "Unlock more features with GitLab Ultimate"
+msgstr ""
+
+msgid "Unlock the discussion"
+msgstr ""
+
+msgid "Unlock this %{issuableDisplayName}? %{strongStart}Everyone%{strongEnd} will be able to comment."
+msgstr ""
+
+msgid "Unlocked"
+msgstr ""
+
+msgid "Unlocked the discussion."
+msgstr ""
+
+msgid "Unlocks the discussion."
+msgstr ""
+
+msgid "Unreachable"
+msgstr ""
+
+msgid "Unrecognized approval status."
+msgstr ""
+
+msgid "Unrecognized cluster type"
+msgstr ""
+
+msgid "Unresolve"
+msgstr ""
+
+msgid "Unresolve thread"
+msgstr ""
+
+msgid "Unresolved"
+msgstr ""
+
+msgid "Unschedule job"
+msgstr ""
+
+msgid "Unstar"
+msgstr ""
+
+msgid "Unstarted"
+msgstr ""
+
+msgid "Unsubscribe"
+msgstr ""
+
+msgid "Unsubscribe at group level"
+msgstr ""
+
+msgid "Unsubscribe at project level"
+msgstr ""
+
+msgid "Unsubscribe from %{type}"
+msgstr ""
+
+msgid "Unsubscribed from this %{quick_action_target}."
+msgstr ""
+
+msgid "Unsubscribes from this %{quick_action_target}."
+msgstr ""
+
+msgid "Unsupported sort value."
+msgstr ""
+
+msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
+msgstr ""
+
+msgid "Unused"
+msgstr ""
+
+msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
+msgstr ""
+
+msgid "Unverified"
+msgstr ""
+
+msgid "Up to date"
+msgstr ""
+
+msgid "Upcoming"
+msgstr ""
+
+msgid "Upcoming Release"
+msgstr ""
+
+msgid "Update"
+msgstr ""
+
+msgid "Update %{sourcePath} file"
+msgstr ""
+
+msgid "Update Now"
+msgstr ""
+
+msgid "Update Scheduled…"
+msgstr ""
+
+msgid "Update all"
+msgstr ""
+
+msgid "Update appearance settings"
+msgstr ""
+
+msgid "Update approval rule"
+msgstr ""
+
+msgid "Update approvers"
+msgstr ""
+
+msgid "Update broadcast message"
+msgstr ""
+
+msgid "Update failed"
+msgstr ""
+
+msgid "Update it"
+msgstr ""
+
+msgid "Update milestone"
+msgstr ""
+
+msgid "Update now"
+msgstr ""
+
+msgid "Update username"
+msgstr ""
+
+msgid "Update variable"
+msgstr ""
+
+msgid "Update your bookmarked URLs as filtered/sorted branches URL has been changed."
+msgstr ""
+
+msgid "Update your group name, description, avatar, and visibility."
+msgstr ""
+
+msgid "Update your project name, topics, description, and avatar."
+msgstr ""
+
+msgid "UpdateProject|Cannot rename project because it contains container registry tags!"
+msgstr ""
+
+msgid "UpdateProject|Could not set the default branch"
+msgstr ""
+
+msgid "UpdateProject|New visibility level not allowed!"
+msgstr ""
+
+msgid "UpdateProject|Project could not be updated!"
+msgstr ""
+
+msgid "UpdateRepositoryStorage|Failed to verify %{type} repository checksum from %{old} to %{new}"
+msgstr ""
+
+msgid "UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes"
+msgstr ""
+
+msgid "Updated"
+msgstr ""
+
+msgid "Updated %{updated_at} by %{updated_by}"
+msgstr ""
+
+msgid "Updated date"
+msgstr ""
+
+msgid "Updating"
+msgstr ""
+
+msgid "Updating the attention request for %{username} failed."
+msgstr ""
+
+msgid "Updating…"
+msgstr ""
+
+msgid "Upgrade offers available!"
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "Upload %{file_name} file"
+msgstr ""
+
+msgid "Upload CSV file"
+msgstr ""
+
+msgid "Upload File"
+msgstr ""
+
+msgid "Upload New File"
+msgstr ""
+
+msgid "Upload a certificate for your domain with all intermediates"
+msgstr ""
+
+msgid "Upload a private key for your certificate"
+msgstr ""
+
+msgid "Upload file"
+msgstr ""
+
+msgid "Upload image"
+msgstr ""
+
+msgid "Upload new file"
+msgstr ""
+
+msgid "Upload object map"
+msgstr ""
+
+msgid "Uploaded date"
+msgstr ""
+
+msgid "Uploading changes to terminal"
+msgstr ""
+
+msgid "Uploading..."
+msgstr ""
+
+msgid "Upstream"
+msgstr ""
+
+msgid "Uptime"
+msgstr ""
+
+msgid "Upvotes"
+msgstr ""
+
+msgid "Usage Trends"
+msgstr ""
+
+msgid "Usage statistics"
+msgstr ""
+
+msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
+msgstr ""
+
+msgid "UsageQuota|%{linkStart}Shared runners%{linkEnd} are disabled, so there are no limits set on pipeline usage"
+msgstr ""
+
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
+msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
+msgstr ""
+
+msgid "UsageQuota|Artifacts"
+msgstr ""
+
+msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
+msgstr ""
+
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
+msgid "UsageQuota|Buy additional minutes"
+msgstr ""
+
+msgid "UsageQuota|Buy storage"
+msgstr ""
+
+msgid "UsageQuota|CI minutes usage by month"
+msgstr ""
+
+msgid "UsageQuota|CI minutes usage by project"
+msgstr ""
+
+msgid "UsageQuota|CI/CD minutes usage"
+msgstr ""
+
+msgid "UsageQuota|CI/CD minutes usage since %{timeElapsed}"
+msgstr ""
+
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
+msgid "UsageQuota|Container Registry"
+msgstr ""
+
+msgid "UsageQuota|Current period usage"
+msgstr ""
+
+msgid "UsageQuota|Dependency proxy"
+msgstr ""
+
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. You are currently using %{used_storage} of namespace storage. View and manage your usage from %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+msgstr ""
+
+msgid "UsageQuota|Git repository."
+msgstr ""
+
+msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images."
+msgstr ""
+
+msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
+msgstr ""
+
+msgid "UsageQuota|Increase storage temporarily"
+msgstr ""
+
+msgid "UsageQuota|LFS storage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas."
+msgstr ""
+
+msgid "UsageQuota|Local proxy used for frequently-accessed upstream Docker images. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "UsageQuota|Namespace storage used"
+msgstr ""
+
+msgid "UsageQuota|No CI minutes usage data available."
+msgstr ""
+
+msgid "UsageQuota|Packages"
+msgstr ""
+
+msgid "UsageQuota|Pending Members"
+msgstr ""
+
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
+msgid "UsageQuota|Pipelines"
+msgstr ""
+
+msgid "UsageQuota|Purchase more storage"
+msgstr ""
+
+msgid "UsageQuota|Purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Purchased storage available"
+msgstr ""
+
+msgid "UsageQuota|Purchased storage used"
+msgstr ""
+
+msgid "UsageQuota|Recalculate repository usage"
+msgstr ""
+
+msgid "UsageQuota|Repository"
+msgstr ""
+
+msgid "UsageQuota|Seats"
+msgstr ""
+
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
+msgid "UsageQuota|Shared runner duration"
+msgstr ""
+
+msgid "UsageQuota|Snippets"
+msgstr ""
+
+msgid "UsageQuota|Something went wrong while fetching pipeline statistics"
+msgstr ""
+
+msgid "UsageQuota|Something went wrong while fetching project storage statistics"
+msgstr ""
+
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
+msgid "UsageQuota|Storage"
+msgstr ""
+
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|Storage used"
+msgstr ""
+
+msgid "UsageQuota|The table below shows current period usage"
+msgstr ""
+
+msgid "UsageQuota|The table below shows usage since %{timeElapsed}"
+msgstr ""
+
+msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
+msgstr ""
+
+msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
+msgstr ""
+
+msgid "UsageQuota|This namespace contains locked projects"
+msgstr ""
+
+msgid "UsageQuota|This namespace has no projects which use shared runners"
+msgstr ""
+
+msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
+msgstr ""
+
+msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total excess storage used"
+msgstr ""
+
+msgid "UsageQuota|Total namespace storage used"
+msgstr ""
+
+msgid "UsageQuota|Unlimited"
+msgstr ""
+
+msgid "UsageQuota|Uploads"
+msgstr ""
+
+msgid "UsageQuota|Usage"
+msgstr ""
+
+msgid "UsageQuota|Usage Quotas"
+msgstr ""
+
+msgid "UsageQuota|Usage breakdown"
+msgstr ""
+
+msgid "UsageQuota|Usage by month"
+msgstr ""
+
+msgid "UsageQuota|Usage by project"
+msgstr ""
+
+msgid "UsageQuota|Usage of group resources across the projects in the %{strong_start}%{group_name}%{strong_end} group"
+msgstr ""
+
+msgid "UsageQuota|Usage of project resources across the %{strong_start}%{project_name}%{strong_end} project"
+msgstr ""
+
+msgid "UsageQuota|Usage of resources across your projects"
+msgstr ""
+
+msgid "UsageQuota|Usage quotas help link"
+msgstr ""
+
+msgid "UsageQuota|Usage since %{usageSince}"
+msgstr ""
+
+msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
+msgstr ""
+
+msgid "UsageQuota|Wiki"
+msgstr ""
+
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
+msgid "UsageQuota|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{actualRepositorySizeLimit} limit."
+msgstr ""
+
+msgid "UsageQuota|You have reached the free storage limit of %{actualRepositorySizeLimit} on %{projectsLockedText}. To unlock them, please purchase additional storage."
+msgstr ""
+
+msgid "UsageQuota|You used: %{usage} %{limit}"
+msgstr ""
+
+msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, please purchase more storage."
+msgstr ""
+
+msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
+msgstr ""
+
+msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Could not load the pipelines chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Could not load the projects and groups chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Groups"
+msgstr ""
+
+msgid "UsageTrends|Issues"
+msgstr ""
+
+msgid "UsageTrends|Issues & merge requests"
+msgstr ""
+
+msgid "UsageTrends|Items"
+msgstr ""
+
+msgid "UsageTrends|Merge requests"
+msgstr ""
+
+msgid "UsageTrends|Month"
+msgstr ""
+
+msgid "UsageTrends|No data available."
+msgstr ""
+
+msgid "UsageTrends|Pipelines"
+msgstr ""
+
+msgid "UsageTrends|Pipelines canceled"
+msgstr ""
+
+msgid "UsageTrends|Pipelines failed"
+msgstr ""
+
+msgid "UsageTrends|Pipelines skipped"
+msgstr ""
+
+msgid "UsageTrends|Pipelines succeeded"
+msgstr ""
+
+msgid "UsageTrends|Pipelines total"
+msgstr ""
+
+msgid "UsageTrends|Projects"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the cancelled pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the failed pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the groups. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the issues. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the merge requests. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the projects. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the skipped pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the successful pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the total pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|Total groups"
+msgstr ""
+
+msgid "UsageTrends|Total projects"
+msgstr ""
+
+msgid "UsageTrends|Total projects & groups"
+msgstr ""
+
+msgid "UsageTrends|Users"
+msgstr ""
+
+msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%{link_end} (eg. %{code_start}priority::1%{code_end})"
+msgstr ""
+
+msgid "Use .gitlab-ci.yml"
+msgstr ""
+
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+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 authorized_keys file to authenticate SSH keys"
+msgstr ""
+
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
+msgid "Use cURL"
+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. Always enabled since 13.0. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Use issue count"
+msgstr ""
+
+msgid "Use issue weight"
+msgstr ""
+
+msgid "Use one line per URI"
+msgstr ""
+
+msgid "Use primary email (%{email})"
+msgstr ""
+
+msgid "Use shortcuts"
+msgstr ""
+
+msgid "Use slash commands."
+msgstr ""
+
+msgid "Use template"
+msgstr ""
+
+msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
+msgstr ""
+
+msgid "Use the link below to confirm your email address (%{email})"
+msgstr ""
+
+msgid "Use the link below to confirm your email address."
+msgstr ""
+
+msgid "Use the public cloud instance URL (%{kroki_public_url}) or %{install_link_start}install Kroki%{install_link_end} on your own infrastructure and use your own instance URL."
+msgstr ""
+
+msgid "Use the search bar on the top of this page"
+msgstr ""
+
+msgid "Use this token to validate received payloads."
+msgstr ""
+
+msgid "Use webhook"
+msgstr ""
+
+msgid "Use your global notification setting"
+msgstr ""
+
+msgid "Use your smart card to authenticate with the LDAP server."
+msgstr ""
+
+msgid "Used"
+msgstr ""
+
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "Used by more than 100,000 organizations, GitLab is the most popular solution to manage git repositories on-premises."
+msgstr ""
+
+msgid "Used programming language"
+msgstr ""
+
+msgid "Used to help configure your identity provider"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "User %{current_user_username} has started impersonating %{username}"
+msgstr ""
+
+msgid "User %{username} was successfully removed."
+msgstr ""
+
+msgid "User %{user} was removed from %{group}."
+msgstr ""
+
+msgid "User ID"
+msgstr ""
+
+msgid "User OAuth applications"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User cap"
+msgstr ""
+
+msgid "User cap cannot be enabled. The group or one of its subgroups or projects is shared externally."
+msgstr ""
+
+msgid "User created at"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
+
+msgid "User identity was successfully created."
+msgstr ""
+
+msgid "User identity was successfully removed."
+msgstr ""
+
+msgid "User identity was successfully updated."
+msgstr ""
+
+msgid "User is not allowed to resolve thread"
+msgstr ""
+
+msgid "User key"
+msgstr ""
+
+msgid "User key was successfully removed."
+msgstr ""
+
+msgid "User list %{name} will be removed. Are you sure?"
+msgstr ""
+
+msgid "User map"
+msgstr ""
+
+msgid "User pipeline minutes were successfully reset."
+msgstr ""
+
+msgid "User restrictions"
+msgstr ""
+
+msgid "User settings"
+msgstr ""
+
+msgid "User was successfully created."
+msgstr ""
+
+msgid "User was successfully removed from group and any subgroups and projects."
+msgstr ""
+
+msgid "User was successfully removed from group."
+msgstr ""
+
+msgid "User was successfully removed from project."
+msgstr ""
+
+msgid "User was successfully updated."
+msgstr ""
+
+msgid "User-based escalation rules must have a user with access to the project"
+msgstr ""
+
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
+msgid "UserAvailability|%{author} (Busy)"
+msgstr ""
+
+msgid "UserAvailability|(Busy)"
+msgstr ""
+
+msgid "UserLists|Add"
+msgstr ""
+
+msgid "UserLists|Add Users"
+msgstr ""
+
+msgid "UserLists|Add users"
+msgstr ""
+
+msgid "UserLists|Cancel"
+msgstr ""
+
+msgid "UserLists|Create"
+msgstr ""
+
+msgid "UserLists|Define a set of users to be used within feature flag strategies"
+msgstr ""
+
+msgid "UserLists|Edit"
+msgstr ""
+
+msgid "UserLists|Edit %{name}"
+msgstr ""
+
+msgid "UserLists|Enter a comma separated list of user IDs. These IDs should be the users of the system in which the feature flag is set, not GitLab IDs"
+msgstr ""
+
+msgid "UserLists|Feature flag user list"
+msgstr ""
+
+msgid "UserLists|Get started with user lists"
+msgstr ""
+
+msgid "UserLists|Lists allow you to define a set of users to be used with feature flags. %{linkStart}Read more about feature flag lists.%{linkEnd}"
+msgstr ""
+
+msgid "UserLists|Loading user lists"
+msgstr ""
+
+msgid "UserLists|Name"
+msgstr ""
+
+msgid "UserLists|New list"
+msgstr ""
+
+msgid "UserLists|New user list"
+msgstr ""
+
+msgid "UserLists|Save"
+msgstr ""
+
+msgid "UserLists|There are no users"
+msgstr ""
+
+msgid "UserLists|There was an error fetching the user lists."
+msgstr ""
+
+msgid "UserLists|User ID"
+msgstr ""
+
+msgid "UserLists|User IDs"
+msgstr ""
+
+msgid "UserLists|User Lists"
+msgstr ""
+
+msgid "UserLists|User lists allow you to define a set of users to use with Feature Flags."
+msgstr ""
+
+msgid "UserList|Delete %{name}?"
+msgstr ""
+
+msgid "UserList|created %{timeago}"
+msgstr ""
+
+msgid "UserProfile|(Busy)"
+msgstr ""
+
+msgid "UserProfile|Activity"
+msgstr ""
+
+msgid "UserProfile|Already reported for abuse"
+msgstr ""
+
+msgid "UserProfile|Blocked user"
+msgstr ""
+
+msgid "UserProfile|Bot activity"
+msgstr ""
+
+msgid "UserProfile|Contributed projects"
+msgstr ""
+
+msgid "UserProfile|Edit profile"
+msgstr ""
+
+msgid "UserProfile|Explore public groups to find projects to contribute to."
+msgstr ""
+
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
+msgid "UserProfile|Groups"
+msgstr ""
+
+msgid "UserProfile|Groups are the best way to manage projects and members."
+msgstr ""
+
+msgid "UserProfile|Join or create a group to start contributing by commenting on issues or submitting merge requests!"
+msgstr ""
+
+msgid "UserProfile|Most Recent Activity"
+msgstr ""
+
+msgid "UserProfile|No snippets found."
+msgstr ""
+
+msgid "UserProfile|Overview"
+msgstr ""
+
+msgid "UserProfile|Personal projects"
+msgstr ""
+
+msgid "UserProfile|Pronounced as: %{pronunciation}"
+msgstr ""
+
+msgid "UserProfile|Report abuse"
+msgstr ""
+
+msgid "UserProfile|Retry"
+msgstr ""
+
+msgid "UserProfile|Snippets"
+msgstr ""
+
+msgid "UserProfile|Snippets in GitLab can either be private, internal, or public."
+msgstr ""
+
+msgid "UserProfile|Star projects to track their progress and show your appreciation."
+msgstr ""
+
+msgid "UserProfile|Starred projects"
+msgstr ""
+
+msgid "UserProfile|Subscribe"
+msgstr ""
+
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
+msgid "UserProfile|This user doesn't have any personal projects"
+msgstr ""
+
+msgid "UserProfile|This user has a private profile"
+msgstr ""
+
+msgid "UserProfile|This user hasn't contributed to any projects"
+msgstr ""
+
+msgid "UserProfile|This user hasn't starred any projects"
+msgstr ""
+
+msgid "UserProfile|This user is blocked"
+msgstr ""
+
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
+msgid "UserProfile|Unconfirmed user"
+msgstr ""
+
+msgid "UserProfile|View all"
+msgstr ""
+
+msgid "UserProfile|View user in admin area"
+msgstr ""
+
+msgid "UserProfile|You are not following other users."
+msgstr ""
+
+msgid "UserProfile|You can create a group for several dependent projects."
+msgstr ""
+
+msgid "UserProfile|You do not have any followers."
+msgstr ""
+
+msgid "UserProfile|You haven't created any personal projects."
+msgstr ""
+
+msgid "UserProfile|You haven't created any snippets."
+msgstr ""
+
+msgid "UserProfile|Your projects can be available publicly, internally, or privately, at your choice."
+msgstr ""
+
+msgid "UserProfile|at"
+msgstr ""
+
+msgid "UserProfile|made a private contribution"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "Username (optional)"
+msgstr ""
+
+msgid "Username is already taken."
+msgstr ""
+
+msgid "Username is available."
+msgstr ""
+
+msgid "Username or email"
+msgstr ""
+
+msgid "Username:"
+msgstr ""
+
+msgid "Username: %{username}"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Users API rate limit"
+msgstr ""
+
+msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
+msgstr ""
+
+msgid "Users can reactivate their account by signing in. %{link_start}Learn more%{link_end}"
+msgstr ""
+
+msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
+msgstr ""
+
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
+msgid "Users in License"
+msgstr ""
+
+msgid "Users or groups set as approvers in the project's or merge request's settings."
+msgstr ""
+
+msgid "Users over License"
+msgstr ""
+
+msgid "Users requesting access to"
+msgstr ""
+
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
+msgid "Users were successfully added."
+msgstr ""
+
+msgid "Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
+msgstr ""
+
+msgid "UsersSelect|%{name} + %{length} more"
+msgstr ""
+
+msgid "UsersSelect|Any User"
+msgstr ""
+
+msgid "UsersSelect|Assignee"
+msgstr ""
+
+msgid "UsersSelect|No assignee - %{openingTag} assign yourself %{closingTag}"
+msgstr ""
+
+msgid "UsersSelect|Unassigned"
+msgstr ""
+
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
+msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
+msgstr ""
+
+msgid "Using required encryption strategy when encrypted field is missing!"
+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 ""
+
+msgid "Validate your GitLab CI configuration"
+msgstr ""
+
+msgid "Validate your GitLab CI configuration file"
+msgstr ""
+
+msgid "Validated at"
+msgstr ""
+
+msgid "Validated at:"
+msgstr ""
+
+msgid "Validated:"
+msgstr ""
+
+msgid "Validations failed."
+msgstr ""
+
+msgid "Value"
+msgstr ""
+
+msgid "Value Stream Analytics"
+msgstr ""
+
+msgid "Value Stream Analytics can help you determine your team’s velocity"
+msgstr ""
+
+msgid "Value might contain a variable reference"
+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|%{subjectFilterText} and %{selectedLabelsCount} label"
+msgid_plural "ValueStreamAnalytics|%{subjectFilterText} and %{selectedLabelsCount} labels"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ValueStreamAnalytics|%{value}M"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}d"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}h"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}m"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}w"
+msgstr ""
+
+msgid "ValueStreamAnalytics|&lt;1m"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Average number of deployments to production per day."
+msgstr ""
+
+msgid "ValueStreamAnalytics|DORA metrics"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Dashboard"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Go to docs"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Key metrics"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time between merge request merge and deployment to a production environment for all MRs deployed in the given time period."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Number of new issues created."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Shows %{selectedFiltersDescription} for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Shows %{selectedFiltersDescription} for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Tasks by type"
+msgstr ""
+
+msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Total number of deploys to production."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Value stream"
+msgstr ""
+
+msgid "ValueStreamEvent|Items in stage"
+msgstr ""
+
+msgid "ValueStreamEvent|Stage time (median)"
+msgstr ""
+
+msgid "ValueStreamEvent|Start"
+msgstr ""
+
+msgid "ValueStreamEvent|Stop"
+msgstr ""
+
+msgid "ValueStream|The Default Value Stream cannot be deleted"
+msgstr ""
+
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
+msgid "Variable"
+msgstr ""
+
+msgid "Variable will be masked in job logs."
+msgstr ""
+
+msgid "Variables"
+msgstr ""
+
+msgid "Variables can be:"
+msgstr ""
+
+msgid "Variables store information, like passwords and secret keys, that you can use in job scripts."
+msgstr ""
+
+msgid "Variables store information, like passwords and secret keys, that you can use in job scripts. All projects on the instance can use these variables."
+msgstr ""
+
+msgid "Various container registry settings."
+msgstr ""
+
+msgid "Various email settings."
+msgstr ""
+
+msgid "Various settings that affect GitLab performance."
+msgstr ""
+
+msgid "Verification status"
+msgstr ""
+
+msgid "VerificationReminder|Pipeline failing? To keep GitLab spam and abuse free we ask that you verify your identity."
+msgstr ""
+
+msgid "VerificationReminder|Until then, shared runners will be unavailable. %{validateLinkStart}Validate your account%{validateLinkEnd} or %{docsLinkStart}use your own runners%{docsLinkEnd}."
+msgstr ""
+
+msgid "VerificationReminder|Your account has been validated"
+msgstr ""
+
+msgid "VerificationReminder|You’ll now be able to take advantage of free CI/CD minutes on shared runners."
+msgstr ""
+
+msgid "Verified"
+msgstr ""
+
+msgid "Verify SAML Configuration"
+msgstr ""
+
+msgid "Verify code"
+msgstr ""
+
+msgid "Verify configuration"
+msgstr ""
+
+msgid "Version"
+msgstr ""
+
+msgid "Version %{versionNumber}"
+msgstr ""
+
+msgid "Version %{versionNumber} (latest)"
+msgstr ""
+
+msgid "VersionCheck|Up to date"
+msgstr ""
+
+msgid "VersionCheck|Update ASAP"
+msgstr ""
+
+msgid "VersionCheck|Update available"
+msgstr ""
+
+msgid "VersionCheck|Your GitLab Version"
+msgstr ""
+
+msgid "View Stage: %{title}"
+msgstr ""
+
+msgid "View alert details at"
+msgstr ""
+
+msgid "View alert details."
+msgstr ""
+
+msgid "View all environments."
+msgstr ""
+
+msgid "View all issues"
+msgstr ""
+
+msgid "View all personal projects"
+msgstr ""
+
+msgid "View blame"
+msgstr ""
+
+msgid "View blame prior to this change"
+msgstr ""
+
+msgid "View chart"
+msgid_plural "View charts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "View dependency details for your project"
+msgstr ""
+
+msgid "View deployment"
+msgstr ""
+
+msgid "View details"
+msgstr ""
+
+msgid "View details: %{details_url}"
+msgstr ""
+
+msgid "View documentation"
+msgstr ""
+
+msgid "View eligible approvers"
+msgstr ""
+
+msgid "View epics list"
+msgstr ""
+
+msgid "View exposed artifact"
+msgid_plural "View %d exposed artifacts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "View file @ "
+msgstr ""
+
+msgid "View file @ %{commitSha}"
+msgstr ""
+
+msgid "View full dashboard"
+msgstr ""
+
+msgid "View full log"
+msgstr ""
+
+msgid "View group in admin area"
+msgstr ""
+
+msgid "View group labels"
+msgstr ""
+
+msgid "View group pipeline usage quota"
+msgstr ""
+
+msgid "View incident details at"
+msgstr ""
+
+msgid "View incident details."
+msgstr ""
+
+msgid "View incident issues."
+msgstr ""
+
+msgid "View issue"
+msgstr ""
+
+msgid "View issues"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
+msgid "View job"
+msgstr ""
+
+msgid "View job log"
+msgstr ""
+
+msgid "View jobs"
+msgstr ""
+
+msgid "View labels"
+msgstr ""
+
+msgid "View log"
+msgstr ""
+
+msgid "View logs"
+msgstr ""
+
+msgid "View milestones"
+msgstr ""
+
+msgid "View on %{url}"
+msgstr ""
+
+msgid "View open merge request"
+msgstr ""
+
+msgid "View page @ "
+msgstr ""
+
+msgid "View performance dashboard."
+msgstr ""
+
+msgid "View project"
+msgstr ""
+
+msgid "View project in admin area"
+msgstr ""
+
+msgid "View project labels"
+msgstr ""
+
+msgid "View public GPG key"
+msgid_plural "View public GPG keys"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "View replaced file @ "
+msgstr ""
+
+msgid "View seat usage"
+msgstr ""
+
+msgid "View supported languages and frameworks"
+msgstr ""
+
+msgid "View the %{code_open}last_activity_at%{code_close} attribute for %{project_link} using the %{projects_api_link}."
+msgstr ""
+
+msgid "View the documentation"
+msgstr ""
+
+msgid "View the latest successful deployment to this environment"
+msgstr ""
+
+msgid "View the performance dashboard at"
+msgstr ""
+
+msgid "View usage details"
+msgstr ""
+
+msgid "View users statistics"
+msgstr ""
+
+msgid "Viewed"
+msgstr ""
+
+msgid "Viewing commit"
+msgstr ""
+
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
+msgid "Violation"
+msgstr ""
+
+msgid "Visibility"
+msgstr ""
+
+msgid "Visibility and access controls"
+msgstr ""
+
+msgid "Visibility level"
+msgstr ""
+
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility settings have been disabled by the administrator."
+msgstr ""
+
+msgid "Visibility, project features, permissions"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
+msgid "VisibilityLevel|Internal"
+msgstr ""
+
+msgid "VisibilityLevel|Private"
+msgstr ""
+
+msgid "VisibilityLevel|Public"
+msgstr ""
+
+msgid "VisibilityLevel|Unknown"
+msgstr ""
+
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
+msgstr ""
+
+msgid "Vulnerabilities"
+msgstr ""
+
+msgid "Vulnerabilities over time"
+msgstr ""
+
+msgid "Vulnerability"
+msgstr ""
+
+msgid "Vulnerability Report"
+msgstr ""
+
+msgid "Vulnerability remediated. Review before resolving."
+msgstr ""
+
+msgid "Vulnerability report"
+msgstr ""
+
+msgid "Vulnerability resolved in %{branch}"
+msgstr ""
+
+msgid "Vulnerability resolved in the default branch"
+msgstr ""
+
+msgid "VulnerabilityChart|%{formattedStartDate} to today"
+msgstr ""
+
+msgid "VulnerabilityChart|Severity"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Detected%{statusEnd} %{timeago} in pipeline %{pipelineLink}"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Dismissed%{statusEnd} %{timeago} by %{user}"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Resolved%{statusEnd} %{timeago} by %{user}"
+msgstr ""
+
+msgid "VulnerabilityManagement|(optional) Include the solution to the vulnerability if available."
+msgstr ""
+
+msgid "VulnerabilityManagement|A removed or remediated vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|A true-positive and will fix"
+msgstr ""
+
+msgid "VulnerabilityManagement|A verified true-positive vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|Add vulnerability finding"
+msgstr ""
+
+msgid "VulnerabilityManagement|An unverified non-confirmed finding"
+msgstr ""
+
+msgid "VulnerabilityManagement|Change status"
+msgstr ""
+
+msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
+msgstr ""
+
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
+msgid "VulnerabilityManagement|Enter a name"
+msgstr ""
+
+msgid "VulnerabilityManagement|Enter the CVE or CWE code"
+msgstr ""
+
+msgid "VulnerabilityManagement|Enter the CVE or CWE identifier URL"
+msgstr ""
+
+msgid "VulnerabilityManagement|Fetching linked Jira issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
+msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
+msgstr ""
+
+msgid "VulnerabilityManagement|Name is a required field"
+msgstr ""
+
+msgid "VulnerabilityManagement|Needs triage"
+msgstr ""
+
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Requires assessment"
+msgstr ""
+
+msgid "VulnerabilityManagement|Select a method"
+msgstr ""
+
+msgid "VulnerabilityManagement|Select a severity level"
+msgstr ""
+
+msgid "VulnerabilityManagement|Select a status"
+msgstr ""
+
+msgid "VulnerabilityManagement|Severity is a required field"
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while creating vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to delete the comment. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to fetch related Jira issues. Please check the %{linkStart}Jira integration settings%{linkEnd} and try again."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to refresh the vulnerability. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to retrieve the vulnerability history. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to save the comment. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to unlink the issue. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong, could not get user."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong, could not update vulnerability state."
+msgstr ""
+
+msgid "VulnerabilityManagement|Status is a required field"
+msgstr ""
+
+msgid "VulnerabilityManagement|Submit vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|Summary, detailed description, steps to reproduce, etc."
+msgstr ""
+
+msgid "VulnerabilityManagement|Verified as fixed or mitigated"
+msgstr ""
+
+msgid "VulnerabilityManagement|Vulnerability name or type. Ex: Cross-site scripting"
+msgstr ""
+
+msgid "VulnerabilityManagement|Will not fix or a false-positive"
+msgstr ""
+
+msgid "VulnerabilityManagement|invalid issue link or ID"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|All statuses"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Confirmed"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Dismissed"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Needs triage"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Resolved"
+msgstr ""
+
+msgid "Vulnerability|%{scannerName} (version %{scannerVersion})"
+msgstr ""
+
+msgid "Vulnerability|Activity"
+msgstr ""
+
+msgid "Vulnerability|Actual Response"
+msgstr ""
+
+msgid "Vulnerability|Actual received response is the one received when this fault was detected"
+msgstr ""
+
+msgid "Vulnerability|Add another identifier"
+msgstr ""
+
+msgid "Vulnerability|Additional Info"
+msgstr ""
+
+msgid "Vulnerability|Bug Bounty"
+msgstr ""
+
+msgid "Vulnerability|CVSS v3"
+msgstr ""
+
+msgid "Vulnerability|Class"
+msgstr ""
+
+msgid "Vulnerability|Cluster"
+msgstr ""
+
+msgid "Vulnerability|Code Review"
+msgstr ""
+
+msgid "Vulnerability|Comments"
+msgstr ""
+
+msgid "Vulnerability|Crash address"
+msgstr ""
+
+msgid "Vulnerability|Crash state"
+msgstr ""
+
+msgid "Vulnerability|Crash type"
+msgstr ""
+
+msgid "Vulnerability|Description"
+msgstr ""
+
+msgid "Vulnerability|Details"
+msgstr ""
+
+msgid "Vulnerability|Detected"
+msgstr ""
+
+msgid "Vulnerability|Detection method"
+msgstr ""
+
+msgid "Vulnerability|Download"
+msgstr ""
+
+msgid "Vulnerability|Enter the associated CVE or CWE entries for this vulnerability."
+msgstr ""
+
+msgid "Vulnerability|Evidence"
+msgstr ""
+
+msgid "Vulnerability|External Security Report"
+msgstr ""
+
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
+msgid "Vulnerability|File"
+msgstr ""
+
+msgid "Vulnerability|GitLab Security Report"
+msgstr ""
+
+msgid "Vulnerability|Identifier"
+msgstr ""
+
+msgid "Vulnerability|Identifier URL"
+msgstr ""
+
+msgid "Vulnerability|Identifier code"
+msgstr ""
+
+msgid "Vulnerability|Identifiers"
+msgstr ""
+
+msgid "Vulnerability|Image"
+msgstr ""
+
+msgid "Vulnerability|Information related to how the vulnerability was discovered and its impact on the system."
+msgstr ""
+
+msgid "Vulnerability|Learn more about this vulnerability and the best way to resolve it."
+msgstr ""
+
+msgid "Vulnerability|Links"
+msgstr ""
+
+msgid "Vulnerability|Method"
+msgstr ""
+
+msgid "Vulnerability|Namespace"
+msgstr ""
+
+msgid "Vulnerability|Project"
+msgstr ""
+
+msgid "Vulnerability|Remove identifier row"
+msgstr ""
+
+msgid "Vulnerability|Reproduction Assets"
+msgstr ""
+
+msgid "Vulnerability|Request"
+msgstr ""
+
+msgid "Vulnerability|Request/Response"
+msgstr ""
+
+msgid "Vulnerability|Scanner Provider"
+msgstr ""
+
+msgid "Vulnerability|Security Audit"
+msgstr ""
+
+msgid "Vulnerability|Select a severity"
+msgstr ""
+
+msgid "Vulnerability|Set the status of the vulnerability finding based on the information available to you."
+msgstr ""
+
+msgid "Vulnerability|Severity"
+msgstr ""
+
+msgid "Vulnerability|Status"
+msgstr ""
+
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
+msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
+msgstr ""
+
+msgid "Vulnerability|Tool"
+msgstr ""
+
+msgid "Vulnerability|Training"
+msgstr ""
+
+msgid "Vulnerability|Training not available for this vulnerability."
+msgstr ""
+
+msgid "Vulnerability|Unmodified Response"
+msgstr ""
+
+msgid "Vulnerability|View training"
+msgstr ""
+
+msgid "WARNING: This snippet contains hidden files which might be used to mask malicious behavior. Exercise caution if cloning and executing code from this snippet."
+msgstr ""
+
+msgid "Wait for the file to load to copy its contents"
+msgstr ""
+
+msgid "Waiting for approval"
+msgstr ""
+
+msgid "Waiting for merge (open and assigned)"
+msgstr ""
+
+msgid "Waiting for performance data"
+msgstr ""
+
+msgid "Want to see the data? Please ask an administrator for access."
+msgstr ""
+
+msgid "Warning"
+msgstr ""
+
+msgid "Warning:"
+msgstr ""
+
+msgid "Warning: Displaying this diagram might cause performance issues on this page."
+msgstr ""
+
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
+msgid "Watch how"
+msgstr ""
+
+msgid "We are currently unable to fetch data for the pipeline header."
+msgstr ""
+
+msgid "We are currently unable to fetch data for this graph."
+msgstr ""
+
+msgid "We could not determine the path to remove the epic"
+msgstr ""
+
+msgid "We could not determine the path to remove the issue"
+msgstr ""
+
+msgid "We couldn't find any %{scope} matching %{term}"
+msgstr ""
+
+msgid "We couldn't find any %{scope} matching %{term} in group %{group}"
+msgstr ""
+
+msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
+msgstr ""
+
+msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
+msgstr ""
+
+msgid "We created a sandbox project that will help you learn the basics of GitLab. You’ll be guided by issues in an issue board. You can go through the issues at your own pace."
+msgstr ""
+
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
+msgid "We don't have enough data to show this stage."
+msgstr ""
+
+msgid "We have found the following errors:"
+msgstr ""
+
+msgid "We heard back from your device. You have been authenticated."
+msgstr ""
+
+msgid "We invite you to %{featureLinkStart}request a feature%{featureLinkEnd}, %{bugLinkStart}report a bug%{bugLinkEnd} or %{feedbackLinkStart}share feedback%{feedbackLinkEnd}"
+msgstr ""
+
+msgid "We recommend a work email address."
+msgstr ""
+
+msgid "We recommend cloud-based mobile authenticator apps such as Authy, Duo Mobile, and LastPass. They can restore access if you lose your hardware device."
+msgstr ""
+
+msgid "We recommend leaving all SAST analyzers enabled"
+msgstr ""
+
+msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
+msgstr ""
+
+msgid "We recommend that you buy additional Pipeline minutes to resume normal service."
+msgstr ""
+
+msgid "We sent you an email with reset password instructions"
+msgstr ""
+
+msgid "We tried to automatically renew your subscription for %{strong}%{namespace_name}%{strong_close} on %{expires_on} but something went wrong so your subscription was downgraded to the free plan. Don't worry, your data is safe. We suggest you check your payment method and get in touch with our support team (%{support_link}). They'll gladly help with your subscription renewal."
+msgstr ""
+
+msgid "We want to be sure it is you, please confirm you are not a robot."
+msgstr ""
+
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgstr ""
+
+msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
+msgstr ""
+
+msgid "We would like to inform you that your subscription GitLab Enterprise Edition %{plan_name} is nearing its user limit. You have %{active_user_count} active users, which is almost at the user limit of %{maximum_user_count}."
+msgstr ""
+
+msgid "We'll continuously validate your pipeline configuration. The validation results will appear here."
+msgstr ""
+
+msgid "We'll use this to help surface the right features and information to you."
+msgstr ""
+
+msgid "We're experiencing difficulties and this tab content is currently unavailable."
+msgstr ""
+
+msgid "We've detected some unusual activity"
+msgstr ""
+
+msgid "We've detected unusual activity"
+msgstr ""
+
+msgid "We've found no vulnerabilities"
+msgstr ""
+
+msgid "Web IDE"
+msgstr ""
+
+msgid "Web Terminal"
+msgstr ""
+
+msgid "Web terminal"
+msgstr ""
+
+msgid "WebAuthn Devices (%{length})"
+msgstr ""
+
+msgid "WebAuthn only works with HTTPS-enabled websites. Contact your administrator for more details."
+msgstr ""
+
+msgid "WebIDE|Fork project"
+msgstr ""
+
+msgid "WebIDE|Go to fork"
+msgstr ""
+
+msgid "WebIDE|Merge request"
+msgstr ""
+
+msgid "WebIDE|This project does not accept unsigned commits."
+msgstr ""
+
+msgid "WebIDE|This project does not accept unsigned commits. You can’t commit changes through the Web IDE."
+msgstr ""
+
+msgid "WebIDE|You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
+msgid "WebIDE|You can’t edit files directly in this project. Go to your fork and submit a merge request with your changes."
+msgstr ""
+
+msgid "WebIDE|You need permission to edit files directly in this project."
+msgstr ""
+
+msgid "WebexTeamsService|Send notifications about project events to Webex Teams."
+msgstr ""
+
+msgid "WebexTeamsService|Send notifications about project events to a Webex Teams conversation. %{docs_link}"
+msgstr ""
+
+msgid "WebexTeamsService|Webex Teams"
+msgstr ""
+
+msgid "Webhook"
+msgstr ""
+
+msgid "Webhook Logs"
+msgstr ""
+
+msgid "Webhook Settings"
+msgstr ""
+
+msgid "Webhook events will be displayed here."
+msgstr ""
+
+msgid "Webhook:"
+msgstr ""
+
+msgid "Webhooks"
+msgstr ""
+
+msgid "Webhooks Help"
+msgstr ""
+
+msgid "Webhooks|A comment is added to a confidential issue."
+msgstr ""
+
+msgid "Webhooks|A comment is added to an issue or merge request."
+msgstr ""
+
+msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
+msgstr ""
+
+msgid "Webhooks|A deployment starts, finishes, fails, or is canceled."
+msgstr ""
+
+msgid "Webhooks|A feature flag is turned on or off."
+msgstr ""
+
+msgid "Webhooks|A group member is created, updated, or removed."
+msgstr ""
+
+msgid "Webhooks|A job's status changes."
+msgstr ""
+
+msgid "Webhooks|A merge request is created, updated, or merged."
+msgstr ""
+
+msgid "Webhooks|A new tag is pushed to the repository."
+msgstr ""
+
+msgid "Webhooks|A pipeline's status changes."
+msgstr ""
+
+msgid "Webhooks|A release is created or updated."
+msgstr ""
+
+msgid "Webhooks|A subgroup is created or removed."
+msgstr ""
+
+msgid "Webhooks|A wiki page is created or updated."
+msgstr ""
+
+msgid "Webhooks|An issue is created, updated, closed, or reopened."
+msgstr ""
+
+msgid "Webhooks|Are you sure you want to delete this group hook?"
+msgstr ""
+
+msgid "Webhooks|Are you sure you want to delete this project hook?"
+msgstr ""
+
+msgid "Webhooks|Are you sure you want to delete this webhook?"
+msgstr ""
+
+msgid "Webhooks|Comments"
+msgstr ""
+
+msgid "Webhooks|Confidential comments"
+msgstr ""
+
+msgid "Webhooks|Confidential issues events"
+msgstr ""
+
+msgid "Webhooks|Delete webhook"
+msgstr ""
+
+msgid "Webhooks|Deployment events"
+msgstr ""
+
+msgid "Webhooks|Enable SSL verification"
+msgstr ""
+
+msgid "Webhooks|Failed to connect"
+msgstr ""
+
+msgid "Webhooks|Fails to connect"
+msgstr ""
+
+msgid "Webhooks|Feature flag events"
+msgstr ""
+
+msgid "Webhooks|Issues events"
+msgstr ""
+
+msgid "Webhooks|Job events"
+msgstr ""
+
+msgid "Webhooks|Member events"
+msgstr ""
+
+msgid "Webhooks|Merge request events"
+msgstr ""
+
+msgid "Webhooks|Pipeline events"
+msgstr ""
+
+msgid "Webhooks|Push events"
+msgstr ""
+
+msgid "Webhooks|Push to the repository."
+msgstr ""
+
+msgid "Webhooks|Releases events"
+msgstr ""
+
+msgid "Webhooks|SSL verification"
+msgstr ""
+
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
+msgstr ""
+
+msgid "Webhooks|Tag push events"
+msgstr ""
+
+msgid "Webhooks|The webhook %{help_link_start}failed to connect%{help_link_end}, and will retry in %{retry_time}. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
+msgstr ""
+
+msgid "Webhooks|The webhook failed to connect, and is disabled. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
+msgstr ""
+
+msgid "Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook."
+msgstr ""
+
+msgid "Webhooks|Trigger"
+msgstr ""
+
+msgid "Webhooks|URL"
+msgstr ""
+
+msgid "Webhooks|URL must be percent-encoded if it contains one or more special characters."
+msgstr ""
+
+msgid "Webhooks|Used to validate received payloads. Sent with the request in the %{code_start}X-Gitlab-Token HTTP%{code_end} header."
+msgstr ""
+
+msgid "Webhooks|Webhook failed to connect"
+msgstr ""
+
+msgid "Webhooks|Webhook fails to connect"
+msgstr ""
+
+msgid "Webhooks|Webhook was automatically disabled"
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
+msgstr ""
+
+msgid "Website"
+msgstr ""
+
+msgid "Website:"
+msgstr ""
+
+msgid "Wednesday"
+msgstr ""
+
+msgid "Weekday"
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
+msgid "Welcome back! Your account had been deactivated due to inactivity but is now reactivated."
+msgstr ""
+
+msgid "Welcome to GitLab"
+msgstr ""
+
+msgid "Welcome to GitLab, %{first_name}!"
+msgstr ""
+
+msgid "Welcome to GitLab,%{br_tag}%{name}!"
+msgstr ""
+
+msgid "Welcome, %{name}!"
+msgstr ""
+
+msgid "What are CI/CD minutes?"
+msgstr ""
+
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
+msgid "What does this command do?"
+msgstr ""
+
+msgid "What is Markdown?"
+msgstr ""
+
+msgid "What is listed here?"
+msgstr ""
+
+msgid "What is repository mirroring?"
+msgstr ""
+
+msgid "What is squashing?"
+msgstr ""
+
+msgid "What templates can I create?"
+msgstr ""
+
+msgid "What will you use this group for?"
+msgstr ""
+
+msgid "What would you like to do?"
+msgstr ""
+
+msgid "What's new"
+msgstr ""
+
+msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
+msgstr ""
+
+msgid "When a runner is locked, it cannot be assigned to other projects"
+msgstr ""
+
+msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
+msgstr ""
+
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
+msgstr ""
+
+msgid "When enabled, existing access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+msgstr ""
+
+msgid "When merge requests and commits in the default branch close, any issues they reference also close."
+msgstr ""
+
+msgid "When this merge request is accepted"
+msgid_plural "When these merge requests are accepted"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
+msgstr ""
+
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
+msgid "When:"
+msgstr ""
+
+msgid "Which API requests are affected?"
+msgstr ""
+
+msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
+msgstr ""
+
+msgid "Who can approve?"
+msgstr ""
+
+msgid "Who can see this group?"
+msgstr ""
+
+msgid "Who will be able to see this group?"
+msgstr ""
+
+msgid "Who will be using GitLab?"
+msgstr ""
+
+msgid "Who will be using this GitLab subscription?"
+msgstr ""
+
+msgid "Who will be using this GitLab trial?"
+msgstr ""
+
+msgid "Who will be using this group?"
+msgstr ""
+
+msgid "Why are you signing up? (optional)"
+msgstr ""
+
+msgid "Wiki"
+msgstr ""
+
+msgid "Wiki page"
+msgstr ""
+
+msgid "Wiki page was successfully created."
+msgstr ""
+
+msgid "Wiki page was successfully deleted."
+msgstr ""
+
+msgid "Wiki page was successfully updated."
+msgstr ""
+
+msgid "WikiClone|Clone your wiki"
+msgstr ""
+
+msgid "WikiClone|Git Access"
+msgstr ""
+
+msgid "WikiClone|Install Gollum"
+msgstr ""
+
+msgid "WikiClone|Start Gollum and edit locally"
+msgstr ""
+
+msgid "WikiEdit|There is already a page with the same title in that path."
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|Suggest wiki improvement"
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|You must be a group member in order to add wiki pages. If you have suggestions for how to improve the wiki for this group, consider opening an issue in the %{issues_link}."
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|You must be a project member in order to add wiki pages. If you have suggestions for how to improve the wiki for this project, consider opening an issue in the %{issues_link}."
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|issue tracker"
+msgstr ""
+
+msgid "WikiEmpty| Have a Confluence wiki already? Use that instead."
+msgstr ""
+
+msgid "WikiEmpty|A wiki is where you can store all the details about your group. This can include why you've created it, its principles, how to use it, and so on."
+msgstr ""
+
+msgid "WikiEmpty|A wiki is where you can store all the details about your project. This can include why you've created it, its principles, how to use it, and so on."
+msgstr ""
+
+msgid "WikiEmpty|Confluence is enabled"
+msgstr ""
+
+msgid "WikiEmpty|Create your first page"
+msgstr ""
+
+msgid "WikiEmpty|Enable the Confluence Wiki integration"
+msgstr ""
+
+msgid "WikiEmpty|Go to Confluence"
+msgstr ""
+
+msgid "WikiEmpty|Suggest wiki improvement"
+msgstr ""
+
+msgid "WikiEmpty|The wiki lets you write documentation for your group"
+msgstr ""
+
+msgid "WikiEmpty|The wiki lets you write documentation for your project"
+msgstr ""
+
+msgid "WikiEmpty|This group has no wiki pages"
+msgstr ""
+
+msgid "WikiEmpty|This project has no wiki pages"
+msgstr ""
+
+msgid "WikiEmpty|You must be a group member in order to add wiki pages."
+msgstr ""
+
+msgid "WikiEmpty|You must be a project member in order to add wiki pages."
+msgstr ""
+
+msgid "WikiEmpty|You've enabled the Confluence Workspace integration. Your wiki will be viewable directly within Confluence. We are hard at work integrating Confluence more seamlessly into GitLab. If you'd like to stay up to date, follow our %{wiki_confluence_epic_link_start}Confluence epic%{wiki_confluence_epic_link_end}."
+msgstr ""
+
+msgid "WikiHistoricalPage|This is an old version of this page."
+msgstr ""
+
+msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
+msgstr ""
+
+msgid "WikiHistoricalPage|history"
+msgstr ""
+
+msgid "WikiHistoricalPage|most recent version"
+msgstr ""
+
+msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
+msgstr ""
+
+msgid "WikiPageConfirmDelete|Delete page"
+msgstr ""
+
+msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
+msgstr ""
+
+msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{wikiLinkStart}the page%{wikiLinkEnd} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
+msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
+msgstr ""
+
+msgid "WikiPage|Cancel"
+msgstr ""
+
+msgid "WikiPage|Commit message"
+msgstr ""
+
+msgid "WikiPage|Content"
+msgstr ""
+
+msgid "WikiPage|Create %{pageTitle}"
+msgstr ""
+
+msgid "WikiPage|Create page"
+msgstr ""
+
+msgid "WikiPage|Edit rich text"
+msgstr ""
+
+msgid "WikiPage|Edit source"
+msgstr ""
+
+msgid "WikiPage|Format"
+msgstr ""
+
+msgid "WikiPage|Learn more."
+msgstr ""
+
+msgid "WikiPage|Page title"
+msgstr ""
+
+msgid "WikiPage|Retry"
+msgstr ""
+
+msgid "WikiPage|Save changes"
+msgstr ""
+
+msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
+msgstr ""
+
+msgid "WikiPage|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
+msgstr ""
+
+msgid "WikiPage|Title"
+msgstr ""
+
+msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
+msgstr ""
+
+msgid "WikiPage|Update %{pageTitle}"
+msgstr ""
+
+msgid "WikiPage|Write your content or drag files here…"
+msgstr ""
+
+msgid "Wikis"
+msgstr ""
+
+msgid "Wiki|Create New Page"
+msgstr ""
+
+msgid "Wiki|Created date"
+msgstr ""
+
+msgid "Wiki|Edit Page"
+msgstr ""
+
+msgid "Wiki|New page"
+msgstr ""
+
+msgid "Wiki|Page history"
+msgstr ""
+
+msgid "Wiki|Page version"
+msgstr ""
+
+msgid "Wiki|Pages"
+msgstr ""
+
+msgid "Wiki|The sidebar failed to load. You can reload the page to try again."
+msgstr ""
+
+msgid "Wiki|Title"
+msgstr ""
+
+msgid "Wiki|View All Pages"
+msgstr ""
+
+msgid "Wiki|Wiki Pages"
+msgstr ""
+
+msgid "Will be created"
+msgstr ""
+
+msgid "Will be mapped to"
+msgstr ""
+
+msgid "Will deploy to"
+msgstr ""
+
+msgid "Wireframe"
+msgstr ""
+
+msgid "With requirements, you can set criteria to check your products against."
+msgstr ""
+
+msgid "With test cases, you can define conditions for your project to meet in determining quality"
+msgstr ""
+
+msgid "Withdraw Access Request"
+msgstr ""
+
+msgid "Won't fix / Accept risk"
+msgstr ""
+
+msgid "Work in progress (open and unassigned)"
+msgstr ""
+
+msgid "Work in progress Limit"
+msgstr ""
+
+msgid "WorkItem|Add"
+msgstr ""
+
+msgid "WorkItem|Add a child"
+msgstr ""
+
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "WorkItem|Cancel"
+msgstr ""
+
+msgid "WorkItem|Child items"
+msgstr ""
+
+msgid "WorkItem|Closed"
+msgstr ""
+
+msgid "WorkItem|Collapse child items"
+msgstr ""
+
+msgid "WorkItem|Create task"
+msgstr ""
+
+msgid "WorkItem|Create work item"
+msgstr ""
+
+msgid "WorkItem|Delete work item"
+msgstr ""
+
+msgid "WorkItem|Expand child items"
+msgstr ""
+
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgstr ""
+
+msgid "WorkItem|Open"
+msgstr ""
+
+msgid "WorkItem|Select type"
+msgstr ""
+
+msgid "WorkItem|Something went wrong when creating a work item. Please try again"
+msgstr ""
+
+msgid "WorkItem|Something went wrong when deleting the work item. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong when fetching the work item. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
+msgstr ""
+
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
+msgid "WorkItem|Type"
+msgstr ""
+
+msgid "WorkItem|Work Items"
+msgstr ""
+
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
+msgid "Would you like to create a new branch?"
+msgstr ""
+
+msgid "Would you like to try auto-generating a branch name?"
+msgstr ""
+
+msgid "Write"
+msgstr ""
+
+msgid "Write a comment or drag your files here…"
+msgstr ""
+
+msgid "Write a comment…"
+msgstr ""
+
+msgid "Write a description or drag your files here…"
+msgstr ""
+
+msgid "Write a description…"
+msgstr ""
+
+msgid "Write an internal note or drag your files here…"
+msgstr ""
+
+msgid "Write milestone description..."
+msgstr ""
+
+msgid "Write your release notes or drag your files here…"
+msgstr ""
+
+msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
+msgstr ""
+
+msgid "Xcode"
+msgstr ""
+
+msgid "YYYY-MM-DD"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "Yes or No"
+msgstr ""
+
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, close issue"
+msgstr ""
+
+msgid "Yes, delete project"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "You"
+msgstr ""
+
+msgid "You already have pending todo for this alert"
+msgstr ""
+
+msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
+msgstr ""
+
+msgid "You are about to clear %{count} image from the cache. Once you confirm, the next time a pipeline runs it must pull an image or tag from Docker Hub. Are you sure?"
+msgid_plural "You are about to clear %{count} images from the cache. Once you confirm, the next time a pipeline runs it must pull an image or tag from Docker Hub. Are you sure?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "You are about to delete this forked project containing:"
+msgstr ""
+
+msgid "You are about to delete this project containing:"
+msgstr ""
+
+msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
+msgstr ""
+
+msgid "You are already a member of this %{member_source}."
+msgstr ""
+
+msgid "You are already impersonating another user"
+msgstr ""
+
+msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
+msgid "You are attempting to delete a file that has been previously updated."
+msgstr ""
+
+msgid "You are attempting to update a file that has changed since you started editing it."
+msgstr ""
+
+msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
+msgstr ""
+
+msgid "You are connected to the Prometheus server, but there is currently no data to display."
+msgstr ""
+
+msgid "You are currently offline, or the GitLab instance is not reachable."
+msgstr ""
+
+msgid "You are going to delete %{project_full_name}. Deleted projects CANNOT be restored! Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to remove %{group_name}. This will also delete all of its subgroups and projects. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to remove the fork relationship from %{project_full_name}. Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to transfer %{group_name} to another namespace. Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to transfer %{project_full_name} to another namespace. Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
+msgstr ""
+
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
+msgstr ""
+
+msgid "You are not allowed to %{action} a user"
+msgstr ""
+
+msgid "You are not allowed to approve a user"
+msgstr ""
+
+msgid "You are not allowed to log in using password"
+msgstr ""
+
+msgid "You are not allowed to push into this branch. Create another branch or open a merge request."
+msgstr ""
+
+msgid "You are not allowed to reject a user"
+msgstr ""
+
+msgid "You are not allowed to unlink your primary login account"
+msgstr ""
+
+msgid "You are not authorized to delete this site profile"
+msgstr ""
+
+msgid "You are not authorized to perform this action"
+msgstr ""
+
+msgid "You are not authorized to run this manual job"
+msgstr ""
+
+msgid "You are not authorized to update this profile"
+msgstr ""
+
+msgid "You are not authorized to update this scanner profile"
+msgstr ""
+
+msgid "You are not authorized to upload metric images"
+msgstr ""
+
+msgid "You are now impersonating %{username}"
+msgstr ""
+
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are receiving this message because you are a GitLab administrator for %{url}."
+msgstr ""
+
+msgid "You are signed in to GitLab as:"
+msgstr ""
+
+msgid "You are trying to upload something other than an image. Please upload a .png, .jpg, .jpeg, .gif, .bmp, .tiff or .ico."
+msgstr ""
+
+msgid "You are using PostgreSQL %{pg_version_current}, but PostgreSQL %{pg_version_minimum} is required for this version of GitLab. Please upgrade your environment to a supported PostgreSQL version, see %{pg_requirements_url} for details."
+msgstr ""
+
+msgid "You can %{gitlabLinkStart}resolve conflicts on GitLab%{gitlabLinkEnd} or %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
+msgstr ""
+
+msgid "You can %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
+msgstr ""
+
+msgid "You can adjust rules on auto-banning %{link_start}here%{link_end}."
+msgstr ""
+
+msgid "You can adjust rules on auto-banning here: %{url}."
+msgstr ""
+
+msgid "You can also create a project from the command line."
+msgstr ""
+
+msgid "You can also press Ctrl-Enter"
+msgstr ""
+
+msgid "You can also press ⌘-Enter"
+msgstr ""
+
+msgid "You can also star a label to make it a priority label."
+msgstr ""
+
+msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
+msgstr ""
+
+msgid "You can also upload existing files from your computer using the instructions below."
+msgstr ""
+
+msgid "You can also use group access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "You can always change your URL later"
+msgstr ""
+
+msgid "You can always edit this later"
+msgstr ""
+
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
+msgid "You can create a new %{link}."
+msgstr ""
+
+msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
+msgstr ""
+
+msgid "You can create a new Personal Access Token by visiting %{link}"
+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."
+msgstr ""
+
+msgid "You can create a new one or check them in your %{ssh_key_link_start}SSH keys%{ssh_key_link_end} settings."
+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}."
+msgstr ""
+
+msgid "You can create new ones at your %{pat_link_start}Personal Access Tokens%{pat_link_end} settings"
+msgstr ""
+
+msgid "You can create new ones at your Personal Access Tokens settings %{pat_link}"
+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 group access token creation in %{link_start}group settings%{link_end}."
+msgstr ""
+
+msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
+msgstr ""
+
+msgid "You can filter by 'days to merge' by clicking on the columns in the chart."
+msgstr ""
+
+msgid "You can find more information about GitLab subscriptions in %{subscriptions_doc_link}."
+msgstr ""
+
+msgid "You can get started by cloning the repository or start adding files to it with one of the following options."
+msgstr ""
+
+msgid "You can group test cases using labels. To learn about the future direction of this feature, visit %{linkStart}Quality Management direction page%{linkEnd}."
+msgstr ""
+
+msgid "You can have a maximum of %{free_limit} unique members across all of your personal projects. To view and manage members, check the members page for each project in your namespace. We recommend you %{move_link_start}move your projects to a group%{move_link_end} so you can easily manage users and features."
+msgstr ""
+
+msgid "You can invite a new member to %{project_name} or invite another group."
+msgstr ""
+
+msgid "You can invite a new member to %{project_name}."
+msgstr ""
+
+msgid "You can invite a new member to %{strong_start}%{group_name}%{strong_end}."
+msgstr ""
+
+msgid "You can invite another group to %{project_name}."
+msgstr ""
+
+msgid "You can move around the graph by using the arrow keys."
+msgstr ""
+
+msgid "You can notify the app / group or a project by sending them an email notification"
+msgstr ""
+
+msgid "You can now close this window."
+msgstr ""
+
+msgid "You can now export your security dashboard to a CSV report."
+msgstr ""
+
+msgid "You can now submit a merge request to get this change into the original branch."
+msgstr ""
+
+msgid "You can now submit a merge request to get this change into the original project."
+msgstr ""
+
+msgid "You can only %{action} files when you are on a branch"
+msgstr ""
+
+msgid "You can only add up to %{max_contacts} contacts at one time"
+msgstr ""
+
+msgid "You can only edit files when you are on a branch"
+msgstr ""
+
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
+msgid "You can only transfer the project to namespaces you manage."
+msgstr ""
+
+msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
+msgstr ""
+
+msgid "You can see your chat accounts."
+msgstr ""
+
+msgid "You can set up jobs to only use runners with specific tags. Separate tags with commas."
+msgstr ""
+
+msgid "You can specify notification level per group or per project."
+msgstr ""
+
+msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
+msgstr ""
+
+msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
+msgstr ""
+
+msgid "You can't add any more, but you can manage your existing members, for example, by removing inactive members and replacing them with new members. To get more members an owner of this namespace can start a trial or upgrade to a paid tier."
+msgstr ""
+
+msgid "You cannot %{action} %{state} users."
+msgstr ""
+
+msgid "You cannot access the raw file. Please wait a minute."
+msgstr ""
+
+msgid "You cannot approve your own deployment."
+msgstr ""
+
+msgid "You cannot change the start date after the cadence has started. Please create a new cadence."
+msgstr ""
+
+msgid "You cannot combine replace_ids with add_ids or remove_ids"
+msgstr ""
+
+msgid "You cannot edit this timeline event."
+msgstr ""
+
+msgid "You cannot impersonate a blocked user"
+msgstr ""
+
+msgid "You cannot impersonate a user who cannot log in"
+msgstr ""
+
+msgid "You cannot impersonate an internal user"
+msgstr ""
+
+msgid "You cannot play this scheduled pipeline at the moment. Please wait a minute."
+msgstr ""
+
+msgid "You cannot rename an environment after it's created."
+msgstr ""
+
+msgid "You cannot set yourself to awaiting"
+msgstr ""
+
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
+msgid "You could not create a new trigger."
+msgstr ""
+
+msgid "You currently have more than %{free_limit} members across all your personal projects. From June 22, 2022, the %{free_limit} most recently active members will remain active, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access. To view and manage members, check the members page for each project in your namespace. We recommend you %{move_link_start}move your project to a group%{move_link_end} so you can easily manage users and features."
+msgstr ""
+
+msgid "You do not have any Google Cloud projects. Please create a Google Cloud project and then reload this page."
+msgstr ""
+
+msgid "You do not have any subscriptions yet"
+msgstr ""
+
+msgid "You do not have permission to access dora metrics."
+msgstr ""
+
+msgid "You do not have permission to approve a member"
+msgstr ""
+
+msgid "You do not have permission to leave this %{namespaceType}."
+msgstr ""
+
+msgid "You do not have permission to run a pipeline on this branch."
+msgstr ""
+
+msgid "You do not have permission to run the Web Terminal. Please contact a project administrator."
+msgstr ""
+
+msgid "You do not have permission to set a member awaiting"
+msgstr ""
+
+msgid "You do not have permission to update the environment."
+msgstr ""
+
+msgid "You do not have permissions to run the import."
+msgstr ""
+
+msgid "You don't have any U2F devices registered yet."
+msgstr ""
+
+msgid "You don't have any WebAuthn devices registered yet."
+msgstr ""
+
+msgid "You don't have any active chat names."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
+msgid "You don't have any deployments right now."
+msgstr ""
+
+msgid "You don't have any open merge requests"
+msgstr ""
+
+msgid "You don't have any recent searches"
+msgstr ""
+
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
+msgid "You don't have permissions to create this project"
+msgstr ""
+
+msgid "You don't have sufficient permission to perform this action."
+msgstr ""
+
+msgid "You don't have the %{role} role for any groups in this instance."
+msgstr ""
+
+msgid "You don't have write access to the source branch."
+msgstr ""
+
+msgid "You don’t have access to Productivity Analytics in this group"
+msgstr ""
+
+msgid "You don’t have access to Value Stream Analytics for this group"
+msgstr ""
+
+msgid "You have %{pendingMembersCount} pending member that needs approval."
+msgid_plural "You have %{pendingMembersCount} pending members that need approval."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
+msgstr ""
+
+msgid "You have been granted %{access_level} access to the %{source_name} %{source_type}."
+msgstr ""
+
+msgid "You have been granted %{member_human_access} access to group %{name}."
+msgstr ""
+
+msgid "You have been granted %{member_human_access} access to project %{name}."
+msgstr ""
+
+msgid "You have been invited by %{link_to_inviter} to join %{source_name} %{strong_open}%{link_to_source}%{strong_close} as %{role}"
+msgstr ""
+
+msgid "You have been redirected to the only result; see the %{a_start}search results%{a_end} instead."
+msgstr ""
+
+msgid "You have been unsubscribed from this thread."
+msgstr ""
+
+msgid "You have declined the invitation to join %{title} %{name}."
+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 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 ""
+
+msgid "You have insufficient permissions to create an on-call schedule for this project"
+msgstr ""
+
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
+msgid "You have insufficient permissions to manage timeline events for this incident"
+msgstr ""
+
+msgid "You have insufficient permissions to remove an on-call rotation from this project"
+msgstr ""
+
+msgid "You have insufficient permissions to remove an on-call schedule from this project"
+msgstr ""
+
+msgid "You have insufficient permissions to remove this HTTP integration"
+msgstr ""
+
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
+msgid "You have insufficient permissions to set customer relations contacts for this issue"
+msgstr ""
+
+msgid "You have insufficient permissions to update an on-call schedule for this project"
+msgstr ""
+
+msgid "You have insufficient permissions to update this HTTP integration"
+msgstr ""
+
+msgid "You have insufficient permissions to view shifts for this rotation"
+msgstr ""
+
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr ""
+
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr ""
+
+msgid "You have no permissions"
+msgstr ""
+
+msgid "You have not added any approvers. Start by adding users or groups."
+msgstr ""
+
+msgid "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}."
+msgstr ""
+
+msgid "You have successfully purchased %{product}. You'll receive a receipt by email. Your purchase may take a minute to sync, so refresh the page if you don't see it yet."
+msgstr ""
+
+msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
+msgstr ""
+
+msgid "You have unsaved changes"
+msgstr ""
+
+msgid "You left the \"%{membershipable_human_name}\" %{source_type}."
+msgstr ""
+
+msgid "You may close the milestone now."
+msgstr ""
+
+msgid "You must be authenticated to access this path."
+msgstr ""
+
+msgid "You must be logged in to search across all of GitLab"
+msgstr ""
+
+msgid "You must have developer or higher permissions in the associated project to view job logs when debug trace is enabled. To disable debug trace, set the 'CI_DEBUG_TRACE' variable to 'false' in your pipeline configuration or CI/CD settings. If you need to view this job log, a project maintainer must add you to the project with developer permissions or higher."
+msgstr ""
+
+msgid "You must have maintainer access to force delete a lock"
+msgstr ""
+
+msgid "You must provide a valid current password"
+msgstr ""
+
+msgid "You must provide your current password in order to change it."
+msgstr ""
+
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
+msgid "You must solve the CAPTCHA in order to submit"
+msgstr ""
+
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
+msgid "You need permission."
+msgstr ""
+
+msgid "You need to register a two-factor authentication app before you can set up a device."
+msgstr ""
+
+msgid "You need to set terms to be enforced"
+msgstr ""
+
+msgid "You need to specify both an Access Token and a Host URL."
+msgstr ""
+
+msgid "You need to upload a GitLab project export archive (ending in .gz)."
+msgstr ""
+
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
+msgid "You successfully declined the invitation"
+msgstr ""
+
+msgid "You tried to fork %{link_to_the_project} but it failed for the following reason:"
+msgstr ""
+
+msgid "You will be removed from existing projects/groups"
+msgstr ""
+
+msgid "You will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
+msgstr ""
+
+msgid "You will first need to set up Jira Integration to use this feature."
+msgstr ""
+
+msgid "You will lose all changes you've made to this file. This action cannot be undone."
+msgstr ""
+
+msgid "You will lose all uncommitted changes you've made in this project. This action cannot be undone."
+msgstr ""
+
+msgid "You will need to update your local repositories to point to the new location."
+msgstr ""
+
+msgid "You will not get any notifications via email"
+msgstr ""
+
+msgid "You will only receive notifications for the events you choose"
+msgstr ""
+
+msgid "You will only receive notifications for threads you have participated in"
+msgstr ""
+
+msgid "You will receive notifications for any activity"
+msgstr ""
+
+msgid "You will receive notifications only for comments in which you were @mentioned"
+msgstr ""
+
+msgid "You won't be able to create new projects because you have reached your project limit."
+msgstr ""
+
+msgid "You'll be charged for %{true_up_link_start}users over license%{link_end} on a quarterly or annual basis, depending on the terms of your agreement."
+msgstr ""
+
+msgid "You'll be signed out from your current account automatically."
+msgstr ""
+
+msgid "You'll need to use different branch names to get a valid comparison."
+msgstr ""
+
+msgid "You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end} in %{strong_start}%{group_name}%{strong_end}."
+msgstr ""
+
+msgid "You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end}."
+msgstr ""
+
+msgid "You're at the first commit"
+msgstr ""
+
+msgid "You're at the last commit"
+msgstr ""
+
+msgid "You're not allowed to %{tag_start}edit%{tag_end} files in this project directly. Please fork this project, make your changes there, and submit a merge request."
+msgstr ""
+
+msgid "You're not allowed to make changes to this project directly. A fork of this project has been created that you can make changes in, so you can submit a merge request."
+msgstr ""
+
+msgid "You're not allowed to make changes to this project directly. A fork of this project is being created that you can make changes in, so you can submit a merge request."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your activity on %{host}."
+msgstr ""
+
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been assigned an item on %{host}."
+msgstr ""
+
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}."
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
+msgstr ""
+
+msgid "You've reached your %{free_limit} member limit across all of your personal projects"
+msgstr ""
+
+msgid "You've rejected %{user}"
+msgstr ""
+
+msgid "YouTube"
+msgstr ""
+
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
+msgid "Your %{group} membership will now expire in %{days}."
+msgstr ""
+
+msgid "Your %{host} account was signed in to from a new location"
+msgstr ""
+
+msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
+msgstr ""
+
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
+msgstr ""
+
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgstr ""
+
+msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
+msgstr ""
+
+msgid "Your CSV export has started. It will be emailed to %{email} when complete."
+msgstr ""
+
+msgid "Your CSV export of %{count} from project %{project_link} has been added to this email as an attachment."
+msgstr ""
+
+msgid "Your CSV export of %{written_count} from project %{project_name} (%{project_url}) has been added to this email as an attachment."
+msgstr ""
+
+msgid "Your CSV import for project"
+msgstr ""
+
+msgid "Your DevOps Reports give an overview of how you are using GitLab from a feature perspective. Use them to view how you compare with other organizations, and how your teams compare against each other."
+msgstr ""
+
+msgid "Your GPG keys (%{count})"
+msgstr ""
+
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
+msgstr ""
+
+msgid "Your GitLab account request has been approved!"
+msgstr ""
+
+msgid "Your GitLab group"
+msgstr ""
+
+msgid "Your Groups"
+msgstr ""
+
+msgid "Your Personal Access Token was revoked"
+msgstr ""
+
+msgid "Your Projects (default)"
+msgstr ""
+
+msgid "Your Projects' Activity"
+msgstr ""
+
+msgid "Your SSH key has expired"
+msgstr ""
+
+msgid "Your SSH key is expiring soon."
+msgstr ""
+
+msgid "Your SSH key was deleted"
+msgstr ""
+
+msgid "Your SSH keys (%{count})"
+msgstr ""
+
+msgid "Your To-Do List"
+msgstr ""
+
+msgid "Your U2F device did not send a valid JSON response."
+msgstr ""
+
+msgid "Your U2F device was registered!"
+msgstr ""
+
+msgid "Your WebAuthn device did not send a valid JSON response."
+msgstr ""
+
+msgid "Your WebAuthn device was registered!"
+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 authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_password_link_start}set a password%{link_end} or %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}."
+msgstr ""
+
+msgid "Your account is authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}."
+msgstr ""
+
+msgid "Your account is locked."
+msgstr ""
+
+msgid "Your account uses dedicated credentials for the \"%{group_name}\" group and can only be updated through SSO."
+msgstr ""
+
+msgid "Your action succeeded."
+msgstr ""
+
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
+msgid "Your browser does not support iFrames"
+msgstr ""
+
+msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
+msgstr ""
+
+msgid "Your browser doesn't support WebAuthn. Please use a supported browser, e.g. Chrome (67+) or Firefox (60+)."
+msgstr ""
+
+msgid "Your changes can be committed to %{branch_name} because a merge request is open."
+msgstr ""
+
+msgid "Your changes have been committed. Commit %{commitId} %{commitStats}"
+msgstr ""
+
+msgid "Your changes have been saved"
+msgstr ""
+
+msgid "Your changes have been successfully committed."
+msgstr ""
+
+msgid "Your comment could not be submitted because %{error}"
+msgstr ""
+
+msgid "Your comment could not be submitted! Please check your network connection and try again."
+msgstr ""
+
+msgid "Your comment could not be updated! Please check your network connection and try again."
+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 current password is required to register a two-factor authenticator app."
+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 ""
+
+msgid "Your device is not compatible with GitLab. Please try another device"
+msgstr ""
+
+msgid "Your device needs to be set up. Plug it in (if needed) and click the button on the left."
+msgstr ""
+
+msgid "Your device was successfully set up! Give it a name and register it with the GitLab server."
+msgstr ""
+
+msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
+msgstr ""
+
+msgid "Your first project"
+msgstr ""
+
+msgid "Your groups"
+msgstr ""
+
+msgid "Your instance has %{remaining_user_count} users remaining of the %{total_user_count} included in your subscription. You can add more users than the number included in your license, and we will include the overage in your next bill."
+msgstr ""
+
+msgid "Your instance has exceeded your subscription's licensed user count."
+msgstr ""
+
+msgid "Your instance is approaching its licensed user count"
+msgstr ""
+
+msgid "Your issues are being imported. Once finished, you'll get a confirmation email."
+msgstr ""
+
+msgid "Your issues will be imported in the background. Once finished, you'll get a confirmation email."
+msgstr ""
+
+msgid "Your license does not support on-call rotations"
+msgstr ""
+
+msgid "Your license does not support on-call schedules"
+msgstr ""
+
+msgid "Your license is valid from"
+msgstr ""
+
+msgid "Your membership in %{group} no longer expires."
+msgstr ""
+
+msgid "Your message here"
+msgstr ""
+
+msgid "Your name"
+msgstr ""
+
+msgid "Your new %{accessTokenType}"
+msgstr ""
+
+msgid "Your new %{accessTokenType} has been created."
+msgstr ""
+
+msgid "Your new %{type}"
+msgstr ""
+
+msgid "Your new access token has been created."
+msgstr ""
+
+msgid "Your new comment"
+msgstr ""
+
+msgid "Your password reset token has expired."
+msgstr ""
+
+msgid "Your personal access token has expired"
+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 ""
+
+msgid "Your project has limited quotas and features"
+msgstr ""
+
+msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
+msgstr ""
+
+msgid "Your project will be created at:"
+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_message}"
+msgstr ""
+
+msgid "Your request for access has been queued for review."
+msgstr ""
+
+msgid "Your request to join %{host} has been rejected."
+msgstr ""
+
+msgid "Your requirements are being imported. Once finished, you'll receive a confirmation email."
+msgstr ""
+
+msgid "Your requirements will be imported in the background. After it's finished, you'll get a confirmation email."
+msgstr ""
+
+msgid "Your response has been recorded."
+msgstr ""
+
+msgid "Your search didn't match any commits."
+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 ""
+
+msgid "Your snippets"
+msgstr ""
+
+msgid "Your subscription expired!"
+msgstr ""
+
+msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seat remaining."
+msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
+msgid "Your username is %{username}."
+msgstr ""
+
+msgid "ZenTaoIntegration|Failed to load ZenTao issue. View the issue in ZenTao, or reload the page."
+msgstr ""
+
+msgid "ZenTaoIntegration|This is a ZenTao user."
+msgstr ""
+
+msgid "ZenTaoIntegration|ZenTao user"
+msgstr ""
+
+msgid "ZentaoIntegration|An error occurred while requesting data from the ZenTao service."
+msgstr ""
+
+msgid "ZentaoIntegration|Base URL of the ZenTao instance."
+msgstr ""
+
+msgid "ZentaoIntegration|Before you enable this integration, you must configure ZenTao. For more details, read the %{link_start}ZenTao integration documentation%{link_end}."
+msgstr ""
+
+msgid "ZentaoIntegration|Enter new ZenTao API token"
+msgstr ""
+
+msgid "ZentaoIntegration|If different from Web URL."
+msgstr ""
+
+msgid "ZentaoIntegration|Open ZenTao"
+msgstr ""
+
+msgid "ZentaoIntegration|Use ZenTao as this project's issue tracker."
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao API URL (optional)"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao API token"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao Product ID"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao Web URL"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao issues"
+msgstr ""
+
+msgid "Zoom meeting added"
+msgstr ""
+
+msgid "Zoom meeting removed"
+msgstr ""
+
+msgid "[No reason]"
+msgstr ""
+
+msgid "[REDACTED]"
+msgstr ""
+
+msgid "[Redacted]"
+msgstr ""
+
+msgid "`end_time` should not exceed one month after `start_time`"
+msgstr ""
+
+msgid "`start_time` should precede `end_time`"
+msgstr ""
+
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
+msgid "a deleted user"
+msgstr ""
+
+msgid "about 1 hour"
+msgid_plural "about %d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "access:"
+msgstr ""
+
+msgid "added"
+msgstr ""
+
+msgid "added %{emails}"
+msgstr ""
+
+msgid "added a Zoom call to this issue"
+msgstr ""
+
+msgid "ago"
+msgstr ""
+
+msgid "alert"
+msgstr ""
+
+msgid "allowed to fail"
+msgstr ""
+
+msgid "already banned from namespace"
+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 ""
+
+msgid "already shared with this group"
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+msgid "any-approver for the merge request already exists"
+msgstr ""
+
+msgid "any-approver for the project already exists"
+msgstr ""
+
+msgid "approval"
+msgid_plural "approvals"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "archived"
+msgstr ""
+
+msgid "archived:"
+msgstr ""
+
+msgid "artifacts"
+msgstr ""
+
+msgid "assign yourself"
+msgstr ""
+
+msgid "at"
+msgstr ""
+
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
+msgid "at risk"
+msgstr ""
+
+msgid "attach a new file"
+msgstr ""
+
+msgid "authored"
+msgstr ""
+
+msgid "banned user already exists"
+msgstr ""
+
+msgid "blocks"
+msgstr ""
+
+msgid "branch"
+msgid_plural "branches"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "branch name"
+msgstr ""
+
+msgid "builds"
+msgstr ""
+
+msgid "by"
+msgstr ""
+
+msgid "cURL:"
+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 not be changed for existing notes"
+msgstr ""
+
+msgid "can not be set for this resource"
+msgstr ""
+
+msgid "can not be set for this type of note"
+msgstr ""
+
+msgid "can only be changed by a group admin."
+msgstr ""
+
+msgid "can only have one escalation policy"
+msgstr ""
+
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
+msgid "can't be nil"
+msgstr ""
+
+msgid "can't be solely blank"
+msgstr ""
+
+msgid "can't be the same as the source project"
+msgstr ""
+
+msgid "can't include: %{invalid_storages}"
+msgstr ""
+
+msgid "can't reference a branch that does not exist"
+msgstr ""
+
+msgid "cannot be a date in the past"
+msgstr ""
+
+msgid "cannot be changed"
+msgstr ""
+
+msgid "cannot be changed if a personal project has container registry tags."
+msgstr ""
+
+msgid "cannot be changed if shared runners are enabled"
+msgstr ""
+
+msgid "cannot be enabled"
+msgstr ""
+
+msgid "cannot be enabled because parent group does not allow it"
+msgstr ""
+
+msgid "cannot be enabled because parent group has shared Runners disabled"
+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 used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
+msgid "cannot be used for user namespace"
+msgstr ""
+
+msgid "cannot block others"
+msgstr ""
+
+msgid "cannot contain HTML/XML tags, including any word between angle brackets (&lt;,&gt;)."
+msgstr ""
+
+msgid "cannot include leading slash or directory traversal."
+msgstr ""
+
+msgid "cannot itself be blocked"
+msgstr ""
+
+msgid "cannot merge"
+msgstr ""
+
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
+msgstr ""
+
+msgid "ciReport|%{degradedNum} degraded"
+msgstr ""
+
+msgid "ciReport|%{improvedNum} improved"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about API Fuzzing%{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Coverage Fuzzing %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Secret Detection %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{prefix} %{strong_start}%{score}%{strong_end} %{delta} %{deltaPercent} in %{path}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportType} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportType}: Loading resulted in an error"
+msgstr ""
+
+msgid "ciReport|%{sameNum} same"
+msgstr ""
+
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
+msgstr ""
+
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
+msgstr ""
+
+msgid "ciReport|: Loading resulted in an error"
+msgstr ""
+
+msgid "ciReport|API Fuzzing"
+msgstr ""
+
+msgid "ciReport|API fuzzing"
+msgstr ""
+
+msgid "ciReport|All clusters"
+msgstr ""
+
+msgid "ciReport|All projects"
+msgstr ""
+
+msgid "ciReport|All severities"
+msgstr ""
+
+msgid "ciReport|All tools"
+msgstr ""
+
+msgid "ciReport|Analyze a deployed version of your web application for known vulnerabilities by examining it from the outside in. DAST works by simulating external attacks on your application while it is running."
+msgstr ""
+
+msgid "ciReport|Automatically apply the patch in a new branch"
+msgstr ""
+
+msgid "ciReport|Base pipeline codequality artifact not found"
+msgstr ""
+
+msgid "ciReport|Browser Performance"
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics: "
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics: %{strong_start}%{changesFound}%{strong_end} change"
+msgid_plural "ciReport|Browser performance test metrics: %{strong_start}%{changesFound}%{strong_end} changes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|Browser performance test metrics: No changes"
+msgstr ""
+
+msgid "ciReport|Checks"
+msgstr ""
+
+msgid "ciReport|Cluster Image Scanning"
+msgstr ""
+
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Code quality degraded due to 1 new issue"
+msgid_plural "ciReport|Code quality degraded due to %d new issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|Code quality improved due to 1 resolved issue"
+msgid_plural "ciReport|Code quality improved due to %d resolved issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|Code quality scanning detected %{issueCount} changes in merged results"
+msgstr ""
+
+msgid "ciReport|Container Scanning"
+msgstr ""
+
+msgid "ciReport|Container scanning"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Could not dismiss vulnerability because the associated pipeline no longer exists. Refresh the page and try again."
+msgstr ""
+
+msgid "ciReport|Coverage Fuzzing"
+msgstr ""
+
+msgid "ciReport|Coverage fuzzing"
+msgstr ""
+
+msgid "ciReport|Create Jira issue"
+msgstr ""
+
+msgid "ciReport|Create a merge request to implement this solution, or download and apply the patch manually."
+msgstr ""
+
+msgid "ciReport|Create issue"
+msgstr ""
+
+msgid "ciReport|DAST"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning"
+msgstr ""
+
+msgid "ciReport|Download patch to resolve"
+msgstr ""
+
+msgid "ciReport|Download the patch to apply it manually"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Failed to load Code Quality report"
+msgstr ""
+
+msgid "ciReport|Fixed"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Found %{issuesWithCount}"
+msgstr ""
+
+msgid "ciReport|Full Report"
+msgstr ""
+
+msgid "ciReport|IaC Scanning"
+msgstr ""
+
+msgid "ciReport|Investigate this vulnerability by creating an issue"
+msgstr ""
+
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Load Performance"
+msgstr ""
+
+msgid "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} change"
+msgid_plural "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} changes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|Load performance test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Load performance test metrics: "
+msgstr ""
+
+msgid "ciReport|Load performance test metrics: No changes"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Loading Code Quality report"
+msgstr ""
+
+msgid "ciReport|Manage Licenses"
+msgstr ""
+
+msgid "ciReport|Manage licenses"
+msgstr ""
+
+msgid "ciReport|Manually Added"
+msgstr ""
+
+msgid "ciReport|New"
+msgstr ""
+
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No code quality issues found"
+msgstr ""
+
+msgid "ciReport|RPS"
+msgstr ""
+
+msgid "ciReport|Resolve with merge request"
+msgstr ""
+
+msgid "ciReport|SAST"
+msgstr ""
+
+msgid "ciReport|Secret Detection"
+msgstr ""
+
+msgid "ciReport|Secret Detection detects secrets and credentials vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|Secret detection"
+msgstr ""
+
+msgid "ciReport|Security reports failed loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Showing %{fetchedItems} of %{totalItems} items"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|TTFB P90"
+msgstr ""
+
+msgid "ciReport|TTFB P95"
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error creating the merge request. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error fetching the codequality report."
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|This report contains all Code Quality issues in the source branch."
+msgstr ""
+
+msgid "ciReport|Used by %{packagesString}"
+msgid_plural "ciReport|Used by %{packagesString}, and %{lastPackage}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|in"
+msgstr ""
+
+msgid "ciReport|is loading"
+msgstr ""
+
+msgid "ciReport|is loading, errors when loading results"
+msgstr ""
+
+msgid "closed"
+msgstr ""
+
+msgid "closed %{timeago}"
+msgstr ""
+
+msgid "closed issue"
+msgstr ""
+
+msgid "collect usage information"
+msgstr ""
+
+msgid "comment"
+msgstr ""
+
+msgid "commented on %{link_to_project}"
+msgstr ""
+
+msgid "commit %{commit_id}"
+msgstr ""
+
+msgid "committed"
+msgstr ""
+
+msgid "compliance violation has already been recorded"
+msgstr ""
+
+msgid "contacts can only be added to root groups"
+msgstr ""
+
+msgid "container registry images"
+msgstr ""
+
+msgid "contains URLs that exceed the 1024 character limit (%{urls})"
+msgstr ""
+
+msgid "contains invalid URLs (%{urls})"
+msgstr ""
+
+msgid "contribute to this project."
+msgstr ""
+
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "created"
+msgstr ""
+
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
+msgid "created %{timeAgoString} by %{email} via %{user}"
+msgstr ""
+
+msgid "created %{timeAgo}"
+msgstr ""
+
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
+msgid "created by"
+msgstr ""
+
+msgid "data"
+msgstr ""
+
+msgid "database"
+msgstr ""
+
+msgid "date must not be after 9999-12-31"
+msgstr ""
+
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "days"
+msgstr ""
+
+msgid "default branch"
+msgstr ""
+
+msgid "deleted"
+msgstr ""
+
+msgid "denied"
+msgstr ""
+
+msgid "deploy"
+msgstr ""
+
+msgid "design"
+msgstr ""
+
+msgid "disabled"
+msgstr ""
+
+msgid "does not exist"
+msgstr ""
+
+msgid "does not have a supported extension. Only %{extension_list} are supported"
+msgstr ""
+
+msgid "does not match dast_site.project"
+msgstr ""
+
+msgid "does not match dast_site_validation.project"
+msgstr ""
+
+msgid "download it"
+msgstr ""
+
+msgid "draft"
+msgid_plural "drafts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "e.g. %{token}"
+msgstr ""
+
+msgid "element is not a hierarchy"
+msgstr ""
+
+msgid "eligible users"
+msgstr ""
+
+msgid "email '%{email}' is not a verified email."
+msgstr ""
+
+msgid "email address settings"
+msgstr ""
+
+msgid "enabled"
+msgstr ""
+
+msgid "encrypted: needs to be a :required, :optional or :migrating!"
+msgstr ""
+
+msgid "ending with a reserved file extension is not allowed."
+msgstr ""
+
+msgid "entries cannot be larger than 255 characters"
+msgstr ""
+
+msgid "entries cannot be nil"
+msgstr ""
+
+msgid "entries cannot contain HTML tags"
+msgstr ""
+
+msgid "epic"
+msgstr ""
+
+msgid "error"
+msgstr ""
+
+msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
+msgstr ""
+
+msgid "example.com"
+msgstr ""
+
+msgid "exceeds the %{max_value_length} character limit"
+msgstr ""
+
+msgid "exceeds the limit of %{bytes} bytes"
+msgstr ""
+
+msgid "exceeds the limit of %{bytes} bytes for directory name \"%{dirname}\""
+msgstr ""
+
+msgid "expired on %{timebox_due_date}"
+msgstr ""
+
+msgid "expires on %{timebox_due_date}"
+msgstr ""
+
+msgid "failed"
+msgstr ""
+
+msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
+msgstr ""
+
+msgid "failed to dismiss finding: %{message}"
+msgstr ""
+
+msgid "failed to revert associated finding(id=%{finding_id}) to detected"
+msgstr ""
+
+msgid "file"
+msgid_plural "files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "finding is not found or is already attached to a vulnerability"
+msgstr ""
+
+msgid "following"
+msgstr ""
+
+msgid "for"
+msgstr ""
+
+msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
+msgstr ""
+
+msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
+msgstr ""
+
+msgid "for %{link_to_pipeline_ref}"
+msgstr ""
+
+msgid "for %{ref}"
+msgstr ""
+
+msgid "for this project"
+msgstr ""
+
+msgid "fork"
+msgstr ""
+
+msgid "from"
+msgstr ""
+
+msgid "from %d job"
+msgid_plural "from %d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "frontmatter"
+msgstr ""
+
+msgid "group"
+msgstr ""
+
+msgid "group access token"
+msgstr ""
+
+msgid "group access tokens"
+msgstr ""
+
+msgid "group members"
+msgstr ""
+
+msgid "group's CI/CD settings."
+msgstr ""
+
+msgid "groups"
+msgstr ""
+
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "has already been linked to another vulnerability"
+msgstr ""
+
+msgid "has already been taken"
+msgstr ""
+
+msgid "has already been taken as Codename"
+msgstr ""
+
+msgid "has already been taken as Suite"
+msgstr ""
+
+msgid "has been completed."
+msgstr ""
+
+msgid "has too deep level of nesting"
+msgstr ""
+
+msgid "help"
+msgstr ""
+
+msgid "http:"
+msgstr ""
+
+msgid "http://www.example.com"
+msgstr ""
+
+msgid "https://bamboo.example.com"
+msgstr ""
+
+msgid "https://your-bitbucket-server"
+msgstr ""
+
+msgid "i18n|%{language} (%{percent_translated}%% translated)"
+msgstr ""
+
+msgid "image diff"
+msgstr ""
+
+msgid "impersonation token"
+msgstr ""
+
+msgid "impersonation tokens"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
+msgid "in"
+msgstr ""
+
+msgid "in group %{link_to_group}"
+msgstr ""
+
+msgid "in project %{link_to_project}"
+msgstr ""
+
+msgid "instance completed"
+msgid_plural "instances completed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "internal note"
+msgstr ""
+
+msgid "invalid milestone state `%{state}`"
+msgstr ""
+
+msgid "is"
+msgstr ""
+
+msgid "is already associated to a GitLab Issue. New issue will not be associated."
+msgstr ""
+
+msgid "is an invalid IP address range"
+msgstr ""
+
+msgid "is blocked by"
+msgstr ""
+
+msgid "is forbidden by a top-level group"
+msgstr ""
+
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not"
+msgstr ""
+
+msgid "is not a descendant of the Group owning the template"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
+msgid "is not allowed for sign-up. Please use your regular email address."
+msgstr ""
+
+msgid "is not allowed for this group."
+msgstr ""
+
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. Please use your regular email address."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
+msgstr ""
+
+msgid "is not in the group enforcing Group Managed Account"
+msgstr ""
+
+msgid "is not in the member group"
+msgstr ""
+
+msgid "is not the member project"
+msgstr ""
+
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
+msgid "is read-only"
+msgstr ""
+
+msgid "is too long (%{current_value}). The maximum size is %{max_size}."
+msgstr ""
+
+msgid "is too long (maximum is %{count} characters)"
+msgstr ""
+
+msgid "is too long (maximum is 100 entries)"
+msgstr ""
+
+msgid "is too long (maximum is 1000 entries)"
+msgstr ""
+
+msgid "issue"
+msgstr ""
+
+msgid "issues at risk"
+msgstr ""
+
+msgid "issues need attention"
+msgstr ""
+
+msgid "issues on track"
+msgstr ""
+
+msgid "it is larger than %{limit}"
+msgstr ""
+
+msgid "it is stored as a job artifact"
+msgstr ""
+
+msgid "it is stored externally"
+msgstr ""
+
+msgid "it is stored in LFS"
+msgstr ""
+
+msgid "it is too large"
+msgstr ""
+
+msgid "jigsaw is not defined"
+msgstr ""
+
+msgid "kuromoji custom analyzer"
+msgstr ""
+
+msgid "last commit:"
+msgstr ""
+
+msgid "latest"
+msgstr ""
+
+msgid "latest deployment"
+msgstr ""
+
+msgid "latest version"
+msgstr ""
+
+msgid "leave %{group_name}"
+msgstr ""
+
+msgid "less than a minute"
+msgstr ""
+
+msgid "level: %{level}"
+msgstr ""
+
+msgid "lfs objects"
+msgstr ""
+
+msgid "limit of %{project_limit} reached"
+msgstr ""
+
+msgid "load it anyway"
+msgstr ""
+
+msgid "loading"
+msgstr ""
+
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
+msgid "manual"
+msgstr ""
+
+msgid "math|Displaying this math block may cause performance issues on this page"
+msgstr ""
+
+msgid "math|There was an error rendering this math block"
+msgstr ""
+
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "merge request"
+msgid_plural "merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
+
+msgid "metric_id must be unique across a project"
+msgstr ""
+
+msgid "missing"
+msgstr ""
+
+msgid "months"
+msgstr ""
+
+msgid "most recent deployment"
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}%{squashedCommits}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|1 merge commit"
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|Adds %{commitCount} and %{mergeCommitCount} to %{targetBranch}%{squashedCommits}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|Adds %{commitCount} to %{targetBranch}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|Changes merged into %{targetBranch} with %{mergeCommitSha}%{squashedCommits}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|The changes were not merged into %{targetBranch}."
+msgstr ""
+
+msgid "mrWidgetNothingToMerge|This merge request contains no changes."
+msgstr ""
+
+msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, push a commit or edit this merge request to use a different branch. With %{linkStart}CI/CD%{linkEnd}, automatically test your changes before merging."
+msgstr ""
+
+msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHeaderEnd}"
+msgstr ""
+
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
+msgid "mrWidget|%{mergeError}."
+msgstr ""
+
+msgid "mrWidget|%{mergeError}. Try again."
+msgstr ""
+
+msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} decreased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
+msgstr ""
+
+msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} increased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
+msgstr ""
+
+msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
+msgstr ""
+
+msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
+msgstr ""
+
+msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
+msgstr ""
+
+msgid "mrWidget|Added to the merge train by %{merge_author}"
+msgstr ""
+
+msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
+msgstr ""
+
+msgid "mrWidget|An error occurred while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while retrieving approval data for this merge request."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approval is optional"
+msgstr ""
+
+msgid "mrWidget|Approval password is invalid."
+msgstr ""
+
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
+msgid "mrWidget|Approved by you"
+msgstr ""
+
+msgid "mrWidget|Approved by you and others"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
+msgid "mrWidget|Cancel auto-merge"
+msgstr ""
+
+msgid "mrWidget|Checking if merge request can be merged…"
+msgstr ""
+
+msgid "mrWidget|Cherry-pick"
+msgstr ""
+
+msgid "mrWidget|Cherry-pick this merge request in a new merge request"
+msgstr ""
+
+msgid "mrWidget|Closed"
+msgstr ""
+
+msgid "mrWidget|Closed by"
+msgstr ""
+
+msgid "mrWidget|Closes issue"
+msgid_plural "mrWidget|Closes issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
+msgid "mrWidget|Delete source branch"
+msgstr ""
+
+msgid "mrWidget|Deletes the source branch"
+msgstr ""
+
+msgid "mrWidget|Deployment statistics are not available currently"
+msgstr ""
+
+msgid "mrWidget|Did not close"
+msgstr ""
+
+msgid "mrWidget|Dismiss"
+msgstr ""
+
+msgid "mrWidget|Does not delete the source branch"
+msgstr ""
+
+msgid "mrWidget|Failed to load deployment statistics"
+msgstr ""
+
+msgid "mrWidget|GitLab %{linkStart}CI/CD can automatically build, test, and deploy your application.%{linkEnd} It only takes a few minutes to get started, and we can help you create a pipeline configuration file."
+msgstr ""
+
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
+msgid "mrWidget|If the %{type} branch exists in your local repository, you can merge this merge request manually using the command line."
+msgstr ""
+
+msgid "mrWidget|If the last pipeline ran in the fork project, it may be inaccurate. Before merge, we advise running a pipeline in this project."
+msgstr ""
+
+msgid "mrWidget|Jump to first unresolved thread"
+msgstr ""
+
+msgid "mrWidget|Learn more"
+msgstr ""
+
+msgid "mrWidget|Loading deployment statistics"
+msgstr ""
+
+msgid "mrWidget|Mark as ready"
+msgstr ""
+
+msgid "mrWidget|Members who can merge are allowed to add commits."
+msgstr ""
+
+msgid "mrWidget|Mentions issue"
+msgid_plural "mrWidget|Mentions issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "mrWidget|Merge"
+msgstr ""
+
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: all threads must be resolved."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: denied licenses must be removed."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: merge conflicts must be resolved."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
+msgstr ""
+
+msgid "mrWidget|Merge failed."
+msgstr ""
+
+msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
+msgstr ""
+
+msgid "mrWidget|Merged by"
+msgstr ""
+
+msgid "mrWidget|Merges changes into"
+msgstr ""
+
+msgid "mrWidget|Merging! Changes are being shipped…"
+msgstr ""
+
+msgid "mrWidget|Merging! Changes will land soon…"
+msgstr ""
+
+msgid "mrWidget|Merging! Drum roll, please…"
+msgstr ""
+
+msgid "mrWidget|Merging! Everything's good…"
+msgstr ""
+
+msgid "mrWidget|Merging! Lift-off in 5… 4… 3…"
+msgstr ""
+
+msgid "mrWidget|Merging! Take a deep breath and relax…"
+msgstr ""
+
+msgid "mrWidget|Merging! The changes are leaving the station…"
+msgstr ""
+
+msgid "mrWidget|Merging! This is going to be great…"
+msgstr ""
+
+msgid "mrWidget|Merging! We're almost there…"
+msgstr ""
+
+msgid "mrWidget|More information"
+msgstr ""
+
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
+msgid "mrWidget|Please restore it or use a different %{type} branch."
+msgstr ""
+
+msgid "mrWidget|Ready to be merged automatically. Ask someone with write access to this repository to merge this request"
+msgstr ""
+
+msgid "mrWidget|Refresh"
+msgstr ""
+
+msgid "mrWidget|Refresh now"
+msgstr ""
+
+msgid "mrWidget|Refreshing now"
+msgstr ""
+
+msgid "mrWidget|Remove from merge train"
+msgstr ""
+
+msgid "mrWidget|Resolve conflicts"
+msgstr ""
+
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
+msgid "mrWidget|Revert"
+msgstr ""
+
+msgid "mrWidget|Revert this merge request in a new merge request"
+msgstr ""
+
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
+msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|Set by %{merge_author} to be merged automatically when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
+msgid "mrWidget|The %{type} branch %{codeStart}%{name}%{codeEnd} does not exist."
+msgstr ""
+
+msgid "mrWidget|The changes were merged into"
+msgstr ""
+
+msgid "mrWidget|The changes were not merged into"
+msgstr ""
+
+msgid "mrWidget|The source branch has been deleted"
+msgstr ""
+
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
+
+msgid "mrWidget|The source branch is being deleted"
+msgstr ""
+
+msgid "mrWidget|This merge request failed to be merged automatically"
+msgstr ""
+
+msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
+msgstr ""
+
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|To merge, a Jira issue key must be mentioned in the title or description."
+msgstr ""
+
+msgid "mrWidget|Users who can write to the source or target branches can resolve the conflicts."
+msgstr ""
+
+msgid "mrWidget|What is a merge train?"
+msgstr ""
+
+msgid "mrWidget|Your password"
+msgstr ""
+
+msgid "must be a Debian package"
+msgstr ""
+
+msgid "must be a boolean value"
+msgstr ""
+
+msgid "must be a root namespace"
+msgstr ""
+
+msgid "must be a valid IPv4 or IPv6 address"
+msgstr ""
+
+msgid "must be a valid json schema"
+msgstr ""
+
+msgid "must be after start"
+msgstr ""
+
+msgid "must be an email you have verified"
+msgstr ""
+
+msgid "must be greater than start date"
+msgstr ""
+
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must be less than the limit of %{tag_limit} tags"
+msgstr ""
+
+msgid "must be set for a project namespace"
+msgstr ""
+
+msgid "must be unique by status and elapsed time within a policy"
+msgstr ""
+
+msgid "must have a repository"
+msgstr ""
+
+msgid "must match %{association}.project_id"
+msgstr ""
+
+msgid "my-awesome-group"
+msgstr ""
+
+msgid "my-channel"
+msgstr ""
+
+msgid "my-topic"
+msgstr ""
+
+msgid "need attention"
+msgstr ""
+
+msgid "needs to be between 10 minutes and 1 month"
+msgstr ""
+
+msgid "never"
+msgstr ""
+
+msgid "never expires"
+msgstr ""
+
+msgid "new merge request"
+msgstr ""
+
+msgid "no expiration"
+msgstr ""
+
+msgid "no name set"
+msgstr ""
+
+msgid "no one can merge"
+msgstr ""
+
+msgid "no scopes selected"
+msgstr ""
+
+msgid "none"
+msgstr ""
+
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
+msgid "not found"
+msgstr ""
+
+msgid "nounSeries|%{firstItem} and %{lastItem}"
+msgstr ""
+
+msgid "nounSeries|%{item}"
+msgstr ""
+
+msgid "nounSeries|%{item}, %{nextItem}"
+msgstr ""
+
+msgid "nounSeries|%{item}, and %{lastItem}"
+msgstr ""
+
+msgid "on track"
+msgstr ""
+
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
+msgid "only available on top-level groups."
+msgstr ""
+
+msgid "open issue"
+msgstr ""
+
+msgid "or"
+msgstr ""
+
+msgid "organizations can only be added to root groups"
+msgstr ""
+
+msgid "other card matches"
+msgstr ""
+
+msgid "out of %d total test"
+msgid_plural "out of %d total tests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "packages"
+msgstr ""
+
+msgid "pages"
+msgstr ""
+
+msgid "parent"
+msgid_plural "parents"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
+msgid "password"
+msgstr ""
+
+msgid "pending comment"
+msgstr ""
+
+msgid "pending deletion"
+msgstr ""
+
+msgid "personal access token"
+msgstr ""
+
+msgid "personal access tokens"
+msgstr ""
+
+msgid "pipeline"
+msgstr ""
+
+msgid "pipeline schedules documentation"
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|Let's do this!"
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|See how GitLab pipelines work"
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|This %{codeStart}.gitlab-ci.yml%{codeEnd} file creates a simple test pipeline."
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|Use the %{boldStart}commit changes%{boldEnd} button at the bottom of the page to run the pipeline."
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "point"
+msgid_plural "points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "previously merged commits"
+msgstr ""
+
+msgid "private"
+msgstr ""
+
+msgid "private key does not match certificate."
+msgstr ""
+
+msgid "processing"
+msgstr ""
+
+msgid "project"
+msgid_plural "projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "project access token"
+msgstr ""
+
+msgid "project access tokens"
+msgstr ""
+
+msgid "project bots cannot be added to other groups / projects"
+msgstr ""
+
+msgid "project is read-only"
+msgstr ""
+
+msgid "project members"
+msgstr ""
+
+msgid "project name"
+msgstr ""
+
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
+msgid "projects"
+msgstr ""
+
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
+msgstr ""
+
+msgid "recent activity"
+msgstr ""
+
+msgid "register"
+msgstr ""
+
+msgid "relates to"
+msgstr ""
+
+msgid "remaining"
+msgstr ""
+
+msgid "remove"
+msgstr ""
+
+msgid "remove due date"
+msgstr ""
+
+msgid "remove start date"
+msgstr ""
+
+msgid "remove weight"
+msgstr ""
+
+msgid "removed"
+msgstr ""
+
+msgid "removed a Zoom call from this issue"
+msgstr ""
+
+msgid "rendered diff"
+msgstr ""
+
+msgid "reply"
+msgid_plural "replies"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
+msgid "repositories"
+msgstr ""
+
+msgid "repository:"
+msgstr ""
+
+msgid "satisfied"
+msgstr ""
+
+msgid "scan-execution-policy: policy not applied, %{policy_path} file is invalid"
+msgstr ""
+
+msgid "scan-execution-policy: policy not applied, %{policy_path} file is missing"
+msgstr ""
+
+msgid "security Reports|There was an error creating the merge request"
+msgstr ""
+
+msgid "severity|Blocker"
+msgstr ""
+
+msgid "severity|Critical"
+msgstr ""
+
+msgid "severity|High"
+msgstr ""
+
+msgid "severity|Info"
+msgstr ""
+
+msgid "severity|Low"
+msgstr ""
+
+msgid "severity|Major"
+msgstr ""
+
+msgid "severity|Medium"
+msgstr ""
+
+msgid "severity|Minor"
+msgstr ""
+
+msgid "severity|None"
+msgstr ""
+
+msgid "severity|Unknown"
+msgstr ""
+
+msgid "should be an array of %{object_name} objects"
+msgstr ""
+
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
+msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
+msgstr ""
+
+msgid "show %{count} more"
+msgstr ""
+
+msgid "show fewer"
+msgstr ""
+
+msgid "show less"
+msgstr ""
+
+msgid "sign in"
+msgstr ""
+
+msgid "smartcn custom analyzer"
+msgstr ""
+
+msgid "source"
+msgstr ""
+
+msgid "source diff"
+msgstr ""
+
+msgid "specified top is not part of the tree"
+msgstr ""
+
+msgid "spendCommand|%{slash_command} adds or subtracts time already spent."
+msgstr ""
+
+msgid "ssh:"
+msgstr ""
+
+msgid "started a discussion on %{design_link}"
+msgstr ""
+
+msgid "started on %{timebox_start_date}"
+msgstr ""
+
+msgid "starts on %{timebox_start_date}"
+msgstr ""
+
+msgid "structure is too large"
+msgstr ""
+
+msgid "stuck"
+msgstr ""
+
+msgid "success"
+msgstr ""
+
+msgid "suggestPipeline|1/2: Choose a template"
+msgstr ""
+
+msgid "suggestPipeline|2/2: Commit your changes"
+msgstr ""
+
+msgid "suggestPipeline|Choose %{boldStart}Code Quality%{boldEnd} to add a pipeline that tests the quality of your code."
+msgstr ""
+
+msgid "suggestPipeline|The template is ready! You can now commit it to create your first pipeline."
+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 "tag name"
+msgstr ""
+
+msgid "terraform states"
+msgstr ""
+
+msgid "the correct format."
+msgstr ""
+
+msgid "the following epic(s)"
+msgstr ""
+
+msgid "the following incident(s) or issue(s)"
+msgstr ""
+
+msgid "the following issue(s)"
+msgstr ""
+
+msgid "the wiki"
+msgstr ""
+
+msgid "then"
+msgstr ""
+
+msgid "this document"
+msgstr ""
+
+msgid "time summary"
+msgstr ""
+
+msgid "today"
+msgstr ""
+
+msgid "toggle collapse"
+msgstr ""
+
+msgid "triggered"
+msgstr ""
+
+msgid "two-factor authentication settings"
+msgstr ""
+
+msgid "type must be Debian"
+msgstr ""
+
+msgid "type parameter is missing and is required"
+msgstr ""
+
+msgid "unicode domains should use IDNA encoding"
+msgstr ""
+
+msgid "updated"
+msgstr ""
+
+msgid "updated %{timeAgo}"
+msgstr ""
+
+msgid "updated %{time_ago}"
+msgstr ""
+
+msgid "uploads"
+msgstr ""
+
+msgid "user avatar"
+msgstr ""
+
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
+msgid "v%{version} published %{timeAgo}"
+msgstr ""
+
+msgid "value for '%{storage}' must be an integer"
+msgstr ""
+
+msgid "value for '%{storage}' must be between 0 and 100"
+msgstr ""
+
+msgid "verify ownership"
+msgstr ""
+
+msgid "version %{versionIndex}"
+msgstr ""
+
+msgid "via %{closed_via}"
+msgstr ""
+
+msgid "via merge request %{link}"
+msgstr ""
+
+msgid "view it on GitLab"
+msgstr ""
+
+msgid "view the blob"
+msgstr ""
+
+msgid "view the source"
+msgstr ""
+
+msgid "visibility"
+msgstr ""
+
+msgid "vulnerability"
+msgid_plural "vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "vulnerability|Add a comment"
+msgstr ""
+
+msgid "vulnerability|Add a comment or reason for dismissal"
+msgstr ""
+
+msgid "vulnerability|Add comment"
+msgstr ""
+
+msgid "vulnerability|Add comment & dismiss"
+msgstr ""
+
+msgid "vulnerability|Add comment and dismiss"
+msgstr ""
+
+msgid "vulnerability|Dismiss vulnerability"
+msgstr ""
+
+msgid "vulnerability|Save comment"
+msgstr ""
+
+msgid "vulnerability|Undo dismiss"
+msgstr ""
+
+msgid "vulnerability|dismissed"
+msgstr ""
+
+msgid "was scheduled to merge after pipeline succeeds by"
+msgstr ""
+
+msgid "wiki page"
+msgstr ""
+
+msgid "with %{additions} additions, %{deletions} deletions."
+msgstr ""
+
+msgid "with expiry changing from %{old_expiry} to %{new_expiry}"
+msgstr ""
+
+msgid "with expiry remaining unchanged at %{old_expiry}"
+msgstr ""
+
+msgid "yaml invalid"
+msgstr ""
+
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
+msgid "your settings"
+msgstr ""
+
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
+msgid "✔"
+msgstr ""
+
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index a5849fb4d30..e9ea2884d93 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Alkroĉu dosieron per Åovmetado aÅ­ %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr "Redakti"
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr "Trovi per dosierindiko"
msgid "Find file"
msgstr "Trovi dosieron"
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr ""
-
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,18 +25787,15 @@ msgstr ""
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Nova dosiero"
msgid "New group"
msgstr ""
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "Ne estas deponejo"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr "Opcioj"
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr "Posedanto"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nomo"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr "Elektu celan branĉon"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr "Tempo antaÅ­ problemo estas planita por ellabori"
msgid "Time before an issue starts implementation"
msgstr "Tempo antaÅ­ la komenco de laboro super problemo"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "Tempo inter la kreado de poeto pri kunfando kaj Äia aplikado/fermado"
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "alklaku por alÅuti"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "patro"
msgstr[1] "patroj"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index 948e8a0aaa4..abbc4881d6d 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr " %{start} hasta %{end}"
@@ -23,10 +23,10 @@ msgid " (from %{timeoutSource})"
msgstr " (desde %{timeoutSource})"
msgid " Collected %{time}"
-msgstr " Capturado %{time}"
+msgstr " Capturado el %{time}"
msgid " Please sign in."
-msgstr " Por favor, inicie sesión."
+msgstr "Por favor, inicie sesión."
msgid " Try to %{action} this file again."
msgstr " Intente %{action} este archivo de nuevo."
@@ -47,7 +47,7 @@ msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr ""
msgid " or %{emphasisStart}#id%{emphasisEnd}"
-msgstr ""
+msgstr " o %{emphasisStart}#id%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr ""
@@ -65,7 +65,7 @@ msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" no existía en \"%{ref}\""
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
-msgstr "El tamaño de \"%{repository_name}(%{repository_size}) es mayor que el límite de %{limit}."
+msgstr "El tamaño de \"%{repository_name}\" es (%{repository_size}), el cual es mayor que el límite de %{limit}."
msgid "#%{issueIid} (closed)"
msgstr "#%{issueIid} (cerrado)"
@@ -85,13 +85,13 @@ msgstr[1] "%d Alertas:"
msgid "%d Approval"
msgid_plural "%d Approvals"
-msgstr[0] "%d autorización"
-msgstr[1] "%d autorizaciones"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] "%d módulo"
-msgstr[1] "%d módulos"
+msgstr[0] "%d Módulo"
+msgstr[1] "%d Módulos"
msgid "%d Other"
msgid_plural "%d Others"
@@ -100,8 +100,8 @@ msgstr[1] "%d Otros"
msgid "%d Package"
msgid_plural "%d Packages"
-msgstr[0] "%d paquete"
-msgstr[1] "%d paquetes"
+msgstr[0] "%d Paquete"
+msgstr[1] "%d Paquetes"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
@@ -126,7 +126,7 @@ msgstr[1] "%d asignados adicionales"
msgid "%d additional commenter"
msgid_plural "%d additional commenters"
msgstr[0] "%d comentarista adicional"
-msgstr[1] "%d comentarios adicionales"
+msgstr[1] "%d comentaristas adicionales"
msgid "%d additional committer"
msgid_plural "%d additional committers"
@@ -160,8 +160,8 @@ msgstr[1] "%d carácteres restantes"
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] "%d tarea épica secundaria"
-msgstr[1] "%d tareas épicas secundarias"
+msgstr[0] "%d tarea épica hija"
+msgstr[1] "%d tareas épicas hijas"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
@@ -250,8 +250,8 @@ msgstr[1] "%d archivos"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
-msgstr[0] "%d solucionado el resultado de la prueba"
-msgstr[1] "%d solucionados los resultados de la prueba"
+msgstr[0] "%d resultado de la prueba solucionado"
+msgstr[1] "%d resultados de las pruebas solucionados"
msgid "%d fork"
msgid_plural "%d forks"
@@ -288,6 +288,11 @@ 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 job"
+msgid_plural "%d jobs"
+msgstr[0] "%d trabajo"
+msgstr[1] "%d trabajos"
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d capa"
@@ -320,23 +325,23 @@ msgstr[1] "%d hitos"
msgid "%d minute"
msgid_plural "%d minutes"
-msgstr[0] "%d minutos"
+msgstr[0] "%d minuto"
msgstr[1] "%d minutos"
msgid "%d more comment"
msgid_plural "%d more comments"
-msgstr[0] "%d comentarios más"
+msgstr[0] "%d comentario más"
msgstr[1] "%d comentarios más"
msgid "%d pending comment"
msgid_plural "%d pending comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d comentario pendiente"
+msgstr[1] "%d comentarios pendientes"
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] "Se eliminará el proyecto personal %d y no podrá ser restaurado."
-msgstr[1] "Se eliminarán los proyectos personales %d y no podrán ser restaurados."
+msgstr[0] "Se eliminará el proyecto personal %d y no podrá ser restaurado"
+msgstr[1] "Se eliminarán %d proyectos personales y no podrán ser restaurados."
msgid "%d point"
msgid_plural "%d points"
@@ -360,19 +365,29 @@ msgstr[1] "%d proyectos seleccionados"
msgid "%d remaining"
msgid_plural "%d remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d restante"
+msgstr[1] "%d restantes"
+
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] "%d respuesta"
+msgstr[1] "%d respuestas"
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d segundo"
msgstr[1] "%d segundos"
-msgid "%d star"
-msgid_plural "%d stars"
+msgid "%d stage"
+msgid_plural "%d stages"
msgstr[0] ""
msgstr[1] ""
+msgid "%d star"
+msgid_plural "%d stars"
+msgstr[0] "%d estrella"
+msgstr[1] "%d estrellas"
+
msgid "%d tag"
msgid_plural "%d tags"
msgstr[0] "%d etiqueta"
@@ -405,8 +420,8 @@ msgstr[1] "%d vulnerabilidades descartadas"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidad marcada como confirmada"
+msgstr[1] "%d vulnerabilidades marcadas como confirmadas"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
@@ -430,14 +445,14 @@ msgstr[1] "%d advertencias encontradas:"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
-msgstr[0] "%s cambio adicional ha sido omitido para evitar problemas de rendimiento."
-msgstr[1] "%s cambios adicionales han sido omitidos para evitar problemas de rendimiento."
+msgstr[0] "se ha omitido %s cambio adicional para evitar problemas de rendimiento."
+msgstr[1] "se han omitido %s cambios adicionales para evitar problemas de rendimiento."
msgid "%{actionText} & %{openOrClose} %{noteable}"
msgstr "%{actionText} & %{openOrClose} %{noteable}"
msgid "%{actionText} & close %{noteable}"
-msgstr "%{actionText} & cerrar %{noteable}"
+msgstr "%{actionText} y cerrar %{noteable}"
msgid "%{actionText} & reopen %{noteable}"
msgstr "%{actionText} y reabrir %{noteable}"
@@ -479,7 +494,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
-msgstr "%{code_open}Enmascarado:%{code_close} Oculto en los registros de trabajo. Debe coincidir con los requisitos de enmascaramiento."
+msgstr "%{code_open}Enmascarado:%{code_close} Oculto en los registros de los trabajos. Debe coincidir con los requisitos de enmascaramiento."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
@@ -544,12 +559,12 @@ msgid "%{count} more"
msgstr "%{count} más"
msgid "%{count} more assignees"
-msgstr "%{count} más asignados"
+msgstr "%{count} asignados más"
msgid "%{count} more release"
msgid_plural "%{count} more releases"
-msgstr[0] "%{count} más lanzamientos"
-msgstr[1] "%{count} más lanzamientos"
+msgstr[0] "%{count} versión más"
+msgstr[1] "%{count} versiones más"
msgid "%{count} of %{required} approvals from %{name}"
msgstr "%{count} de %{required} aprobaciones de %{name}"
@@ -614,7 +629,7 @@ msgid "%{edit_in_new_fork_notice} Try to create a new directory again."
msgstr "%{edit_in_new_fork_notice} Intente crear un nuevo directorio de nuevo."
msgid "%{edit_in_new_fork_notice} Try to revert this commit again."
-msgstr "%{edit_in_new_fork_notice} Intentar revertir este commit otra vez."
+msgstr "%{edit_in_new_fork_notice} Intente revertir este commit otra vez."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Intente subir un archivo de nuevo."
@@ -626,7 +641,7 @@ msgid "%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually
msgstr ""
msgid "%{extra} more downstream pipelines"
-msgstr "%{extra} más downstream pipelines"
+msgstr "%{extra} más pipelines downstream"
msgid "%{filePath} deleted"
msgstr "%{filePath} eliminado"
@@ -653,10 +668,10 @@ msgid "%{group_name} group members"
msgstr "miembros del grupo %{group_name}"
msgid "%{group_name} is approaching the limit of available seats"
-msgstr "%{group_name} se acerca al límite de asientos disponibles"
+msgstr "%{group_name} se acerca al límite de plazas disponibles"
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
-msgstr "%{group_name} utiliza cuentas administradas de grupo. Debe crear una nueva cuenta de GitLab que será administrada por %{group_name}."
+msgstr "%{group_name} utiliza cuentas de grupo administradas. Debe crear una nueva cuenta de GitLab que será administrada por %{group_name}."
msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
msgstr "%{group_name}&%{epic_iid} &middot; creado %{epic_created} por %{author}"
@@ -668,10 +683,10 @@ msgid "%{hook_type} was scheduled for deletion"
msgstr "Se ha programado %{hook_type} para su eliminación"
msgid "%{host} sign-in from new location"
-msgstr "%{host} inicia sesión desde una nueva ubicación"
+msgstr "%{host} iniciar sesión desde una nueva ubicación"
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 "Las %{integrations_link_start}integraciones%{link_end} le permiten el uso de aplicaciones de terceros ensu flujo de trabajo en GitLab. Si las integraciones disponibles no satisfacen sus necesidades. Puede considerar utilizar un %{webhooks_link_start}webhook%{link_end}."
+msgstr "Las %{integrations_link_start}integraciones%{link_end} le permiten utilizar aplicaciones de terceros en su flujo de trabajo de GitLab. Si las integraciones disponibles no satisfacen sus necesidades. Puede considerar utilizar un %{webhooks_link_start}webhook%{link_end}."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "¡Va a eliminar %{issuableType}! ¿Está seguro de que desea realizar esta acción?"
@@ -703,9 +718,15 @@ msgstr "%{labelStart}Clase:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Evidencia:%{labelEnd} %{evidence}"
@@ -722,7 +743,7 @@ msgid "%{labelStart}Namespace:%{labelEnd} %{namespace}"
msgstr "%{labelStart}Espacio de nombres:%{labelEnd} %{namespace}"
msgid "%{labelStart}Scanner:%{labelEnd} %{scanner}"
-msgstr "%{labelStart}Escáner:%{labelEnd} %{scanner}"
+msgstr "%{labelStart}Análisis:%{labelEnd} %{scanner}"
msgid "%{labelStart}Sent request:%{labelEnd} %{headers}"
msgstr ""
@@ -746,13 +767,13 @@ msgid "%{lessThan} 1 hour"
msgstr "%{lessThan} 1 hora"
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
-msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} es una autoridad de certificación gratuita, automatizada, y abierta que genera certificados digitales para habilitar HTTPS para sitios web."
+msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} es una autoridad de certificación gratuita, automatizada y abierta que genera certificados digitales para sitios web que le permiten habilitar el protocolo HTTPS."
msgid "%{level_name} is not allowed in a %{group_level_name} group."
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."
+msgstr "%{level_name} no está permitido debido a que el fork del proyecto origen tiene una menor visibilidad."
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 ""
@@ -770,7 +791,7 @@ msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} está bloqueado por el usuario de GitLab %{lock_user_id}"
msgid "%{mergeLength}/%{usersLength} can merge"
-msgstr "%{mergeLength}/%{usersLength} puede fusionarse"
+msgstr "%{mergeLength}/%{usersLength} puede hacer merge"
msgid "%{message} showing first %{warnings_displayed}"
msgstr "%{message} mostrando el primer %{warnings_displayed}"
@@ -785,7 +806,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds} ms"
msgid "%{minutesUsed} minutes"
-msgstr ""
+msgstr "%{minutesUsed} minutos"
msgid "%{model_name} not found"
msgstr "%{model_name} no encontrado"
@@ -812,7 +833,7 @@ msgid "%{name} is already being used for another emoji"
msgstr "%{name} ya está siendo utilizado para otro emoji"
msgid "%{name} is reserved for %{type} report type"
-msgstr "%{name} está reservado para %{type} tipo de informe"
+msgstr "%{name} está reservado para el tipo de informe %{type}"
msgid "%{name} is scheduled for %{action}"
msgstr "%{name} está programado para %{action}"
@@ -830,7 +851,7 @@ msgid "%{name}, confirm your email address now!"
msgstr "%{name}, ¡confirme su dirección de correo electrónico ahora!"
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name} %{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -880,7 +901,7 @@ msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})
msgstr ""
msgid "%{project_name}"
-msgstr ""
+msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
@@ -890,8 +911,8 @@ msgstr "%{ref} no se puede añadir: %{error}"
msgid "%{releases} release"
msgid_plural "%{releases} releases"
-msgstr[0] "%{releases} lanzamiento"
-msgstr[1] "%{releases} lanzamientos"
+msgstr[0] "%{releases} versión"
+msgstr[1] "%{releases} versiones"
msgid "%{remaining_approvals} left"
msgstr "quedan %{remaining_approvals}"
@@ -920,9 +941,6 @@ msgstr "%{runner} creado %{timeago}"
msgid "%{scope} results for term '%{term}'"
msgstr "%{scope} resultados para el término '%{term}'"
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search}%{description}%{scope}"
-
msgid "%{seconds}s"
msgstr "%{seconds} s"
@@ -955,7 +973,7 @@ msgid "%{sourceBranch} into %{targetBranch}"
msgstr "%{sourceBranch} en %{targetBranch}"
msgid "%{spammable_titlecase} was submitted to Akismet successfully."
-msgstr "%{spammable_titlecase} se envió con éxito a Akismet."
+msgstr "%{spammable_titlecase} se envió correctamente a Akismet."
msgid "%{spanStart}at line%{spanEnd} %{errorLine}%{errorColumn}"
msgstr "%{spanStart}en la línea%{spanEnd} %{errorLine}%{errorColumn}"
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1015,8 +1036,8 @@ msgstr[1] ""
msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
-msgstr[0] "%{strong_start}%{tag_count}%{strong_end} Etiqueta"
-msgstr[1] "%{strong_start}%{tag_count}%{strong_end} Etiquetas"
+msgstr[0] "%{strong_start}%{tag_count}%{strong_end} Tag"
+msgstr[1] "%{strong_start}%{tag_count}%{strong_end} Tags"
msgid "%{tabname} changed"
msgstr "%{tabname} cambiado"
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} requiere una fecha de inicio y de vencimiento"
+msgid "%{time} UTC"
+msgstr "%{time} UTC"
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1061,13 +1085,13 @@ msgid "%{totalWeight} total weight"
msgstr "%{totalWeight} peso total"
msgid "%{total_warnings} warning(s) found:"
-msgstr "%{total_warnings} advertencias encontradas:"
+msgstr "%{total_warnings} advertencia(s) encontradas:"
msgid "%{total} remaining issue weight"
msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
-msgstr "%{total} advertencias encontradas: mostrando la primera %{warningsDisplayed}"
+msgstr "%{total} advertencias encontradas: mostrando las primeras %{warningsDisplayed}"
msgid "%{type} only supports %{name} name"
msgstr "%{type} solo admite %{name} nombre"
@@ -1079,13 +1103,13 @@ msgid "%{userName}'s avatar"
msgstr "Avatar de %{userName}"
msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedule} in %{project}. "
-msgstr ""
+msgstr "%{user_name} (%{user_username}) se eliminó de %{rotation} en %{schedule} en %{project}."
msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project_link}: "
-msgstr ""
+msgstr "%{user_name} (%{user_username}) fue eliminado de las siguientes políticas de escalado en %{project_link}: "
msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project}:"
-msgstr ""
+msgstr "%{user_name} (%{user_username}) fue eliminado de las siguientes políticas de escalado en %{project}:"
msgid "%{user_name} profile page"
msgstr "%{user_name} página de perfil"
@@ -1103,7 +1127,7 @@ msgid "%{user} created a merge request: %{mr_link}"
msgstr ""
msgid "%{user} created an epic: %{epic_link}"
-msgstr "%{user} creó una épica: %{epic_link}"
+msgstr "%{user} creó una tarea épica: %{epic_link}"
msgid "%{user} created an issue: %{issue_link}"
msgstr "%{user} creó una incidencia: %{issue_link}"
@@ -1118,10 +1142,10 @@ msgid "%{verb} %{time_spent_value} spent time."
msgstr "%{verb} %{time_spent_value} tiempo gastado."
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project."
-msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} le permiten enviar notificaciones a aplicaciones web en respuesta a eventos en un grupo o proyecto."
+msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} le permiten enviar notificaciones a aplicaciones web en respuesta a los eventos generados en un grupo o en un proyecto."
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
-msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} le permiten enviar notificaciones a aplicaciones web en respuesta a eventos en un grupo o proyecto. Recomendamos utilizar una %{integrations_link_start}integración%{link_end} en lugar de un webhook."
+msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} le permiten enviar notificaciones a aplicaciones web en respuesta a los eventos generados en un grupo o en un proyecto. Recomendamos utilizar una %{integrations_link_start}integración%{link_end} en lugar de un webhook."
msgid "%{widget} options"
msgstr "%{widget} opciones"
@@ -1262,7 +1286,7 @@ msgid "+%{tags} more"
msgstr "+%{tags} más"
msgid ", "
-msgstr ""
+msgstr ", "
msgid ", or "
msgstr ", o "
@@ -1271,13 +1295,13 @@ msgid "- %{policy_name} (notifying after %{elapsed_time} minutes unless %{status
msgstr ""
msgid "- Add or remove a user."
-msgstr ""
+msgstr "- Añadir o eliminar un usuario."
msgid "- Available to run jobs."
msgstr "- Disponible para ejecutar trabajos."
msgid "- Create or close an issue."
-msgstr ""
+msgstr "- Crear o cerrar una incidencia."
msgid "- Create, update, or delete a merge request."
msgstr ""
@@ -1326,11 +1350,16 @@ msgid "/"
msgstr "/"
msgid "/day"
-msgstr ""
+msgstr "/día"
msgid "0 bytes"
msgstr "0 bytes"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 Día"
@@ -1542,6 +1571,9 @@ msgstr "Un sitio basado en Jekyll que utiliza Netlify como herramienta de CI/CD
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "No se puede obtener un certificado SSL de Let's Encrypt hasta que se verifique su dominio."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr "Un elemento de trabajo puede ser un padre o un hijo, pero no ambos."
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "Una página básica y una función serverless que usa AWS Lambda, AWS API Gateway y GitLab Pages"
@@ -1645,7 +1677,7 @@ msgid "A ready-to-go template for use with iOS Swift apps"
msgstr "Una plantilla lista para usar con las aplicaciones iOS basadas en Swift"
msgid "A rebase is already in progress."
-msgstr ""
+msgstr "Ya hay un rebase en progreso."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Se ha realizado un inicio de sesión en su cuenta desde la siguiente dirección IP: %{ip}"
@@ -1807,7 +1839,7 @@ msgid "About this feature"
msgstr "Acerca de esta característica"
msgid "About your company"
-msgstr ""
+msgstr "Sobre su empresa"
msgid "Abuse Reports"
msgstr "Reportes de abuso"
@@ -1830,6 +1862,9 @@ msgstr "Aceptable para su utilización en este proyecto"
msgid "Access Git repositories or the API."
msgstr "Acceder a los repositorios Git o a la API."
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Tokens de acceso"
@@ -1947,6 +1982,12 @@ msgstr "Nuevo"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Cuenta"
@@ -1984,7 +2025,7 @@ msgid "AccountValidation|Verification is required to discourage and reduce the a
msgstr ""
msgid "Acknowledge"
-msgstr ""
+msgstr "Aceptar"
msgid "Action"
msgstr "Acción"
@@ -2037,9 +2078,6 @@ msgstr "Añadir CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Añadir CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Añadir URL de Jaeger"
-
msgid "Add Kubernetes cluster"
msgstr "Añadir clúster de Kubernetes"
@@ -2047,7 +2085,7 @@ msgid "Add LICENSE"
msgstr "Añadir LICENSE"
msgid "Add License"
-msgstr ""
+msgstr "Añadir licencia"
msgid "Add New Site"
msgstr "Añadir un nuevo sitio"
@@ -2062,7 +2100,7 @@ msgid "Add a %{type}"
msgstr "Añadir un %{type}"
msgid "Add a GCP region"
-msgstr ""
+msgstr "Añadir una región de GCP"
msgid "Add a GPG key"
msgstr "Añadir una clave GPG"
@@ -2070,9 +2108,6 @@ msgstr "Añadir una clave GPG"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ msgstr "Añadir un comentario general a este %{noteableDisplayName}."
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 "Añadir una regla horizontal"
-
msgid "Add a new issue"
msgstr "Añadir una nueva incidencia"
@@ -2352,9 +2384,6 @@ msgstr "Añadido en esta versión"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Se ha deshabilitado la opción de añadir nuevas aplicaciones en su instancia de GitLab. Póngase en contacto con su administrador de GitLab para obtener el permiso"
-msgid "Additional Metadata"
-msgstr "Metadatos adicionales"
-
msgid "Additional minutes"
msgstr "Minutos adicionales"
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Dominio Auto DevOps"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2614,22 +2646,22 @@ msgid "AdminSettings|Configure when inactive projects should be automatically de
msgstr ""
msgid "AdminSettings|Delete inactive projects"
-msgstr ""
+msgstr "Eliminar proyectos inactivos"
msgid "AdminSettings|Delete inactive projects that exceed"
-msgstr ""
+msgstr "Eliminar proyectos inactivos que excedan"
msgid "AdminSettings|Delete project after"
-msgstr ""
+msgstr "Eliminar proyecto después de"
msgid "AdminSettings|Disable Elasticsearch until indexing completes."
-msgstr ""
+msgstr "Deshabilitar Elasticsearch hasta que se complete la indexación."
msgid "AdminSettings|Disable feed token"
msgstr "Deshabilitar el token del feed"
msgid "AdminSettings|Disable public access to Pages sites"
-msgstr ""
+msgstr "Desactivar el acceso público a los sitios web de Pages"
msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
msgstr ""
@@ -2638,7 +2670,7 @@ msgid "AdminSettings|Domain verification is an essential security measure for pu
msgstr ""
msgid "AdminSettings|Elasticsearch indexing"
-msgstr ""
+msgstr "Indexación de Elasticsearch"
msgid "AdminSettings|Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
msgstr ""
@@ -2671,11 +2703,14 @@ msgid "AdminSettings|Enable smartcn custom analyzer: Search"
msgstr ""
msgid "AdminSettings|Enabled"
-msgstr ""
+msgstr "Habilitado"
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "He leído y acepto los %{link_start}términos de servicio%{link_end}(PDF) de Let's Encrypt."
@@ -2722,13 +2757,13 @@ msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a proj
msgstr ""
msgid "AdminSettings|Maximum number of runners registered per group"
-msgstr ""
+msgstr "Número máximo de ejecutores registrados por grupo."
msgid "AdminSettings|Maximum number of runners registered per project"
-msgstr ""
+msgstr "Número máximo de ejecutores registrados por proyecto"
msgid "AdminSettings|Minimum size must be at least 0."
-msgstr ""
+msgstr "El tamaño mínimo debe ser al menos 0."
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2746,7 +2781,7 @@ msgid "AdminSettings|Preview payload"
msgstr ""
msgid "AdminSettings|Project export"
-msgstr ""
+msgstr "Exportar proyecto"
msgid "AdminSettings|Protect CI/CD variables by default"
msgstr "Proteger las variables de CI/CD de forma predeterminada"
@@ -2785,7 +2820,7 @@ msgid "AdminSettings|Send email to maintainers after project is inactive for"
msgstr ""
msgid "AdminSettings|Send warning email"
-msgstr ""
+msgstr "Enviar un correo electrónico de advertencia"
msgid "AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}."
msgstr ""
@@ -2797,7 +2832,7 @@ msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration
msgstr ""
msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
+msgstr "Establezca el límite a 0 para desactivarlo."
msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
msgstr ""
@@ -2842,7 +2877,7 @@ msgid "AdminSettings|When paused, GitLab still tracks the changes. This is usefu
msgstr ""
msgid "AdminSettings|When to delete inactive projects"
-msgstr ""
+msgstr "Cuándo eliminar proyectos inactivos"
msgid "AdminSettings|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 ""
@@ -2901,8 +2936,8 @@ msgstr "2FA desactivado"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA Habilitado"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "Un usuario se puede validar a sí mismo introduciendo una tarjeta de crédito/débito, o un administrador puede validar manualmente a un usuario."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr ""
msgid "AdminUsers|Access"
msgstr "Acceso"
@@ -2910,6 +2945,9 @@ msgstr "Acceso"
msgid "AdminUsers|Access Git repositories"
msgstr "Acceso a los repositorios de Git"
+msgid "AdminUsers|Access level"
+msgstr "Nivel de acceso"
+
msgid "AdminUsers|Access the API"
msgstr "Acceder a la API"
@@ -2952,6 +2990,9 @@ msgstr "Los auditores tienen acceso de solo lectura a todos los grupos, proyecto
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "Marcado automáticamente como usuario interno por defecto"
+msgid "AdminUsers|Avatar"
+msgstr "Avatar"
+
msgid "AdminUsers|Ban user"
msgstr "Banear usuario"
@@ -2979,6 +3020,9 @@ msgstr "Bloqueado"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Bloquear usuario tiene los siguientes efectos:"
+msgid "AdminUsers|Can create group"
+msgstr "Puede crear grupo"
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "No se puede iniciar sesión ni accesar a la información de la instancia"
@@ -3022,7 +3066,7 @@ msgid "AdminUsers|Delete user and contributions"
msgstr "Eliminar el usuario y sus colaboraciones"
msgid "AdminUsers|Export permissions as CSV (max 100,000 users)"
-msgstr ""
+msgstr "Exportar permisos como CSV (máximo 100.000 usuarios)"
msgid "AdminUsers|External"
msgstr "Externos"
@@ -3054,6 +3098,12 @@ msgstr "¡Es usted!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr "Límites"
+
+msgid "AdminUsers|Linkedin"
+msgstr "Linkedin"
+
msgid "AdminUsers|Locked"
msgstr "Bloqueado"
@@ -3081,6 +3131,9 @@ msgstr "Se dejarán los proyectos personales"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Los proyectos personales, los grupos y el historial de usuario se quedarán intactos"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr "Cuota de minutos de CI/CD"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Al reactivar un usuario:"
@@ -3099,6 +3152,9 @@ msgstr "¿Rechazar usuario %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "Usuarios rechazados:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Restaure el acceso del usuario a la cuenta, esto incluye la web, Git y API."
@@ -3111,9 +3167,15 @@ msgstr "Buscar usuarios"
msgid "AdminUsers|Send email to users"
msgstr "Enviar correo electrónico a los usuarios"
+msgid "AdminUsers|Skype"
+msgstr "Skype"
+
msgid "AdminUsers|Sort by"
msgstr "Ordenar por"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr "AdminUsers|El usuario no puede acceder a los repositorios de git."
@@ -3162,9 +3224,6 @@ msgstr "¿Desbloquear usuario %{username}?"
msgid "AdminUsers|User administration"
msgstr "Administración de usuarios"
-msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr "El usuario está validado y puede utilizar minutos CI gratuitos en los ejecutores compartidos."
-
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "El usuario no podrá acceder a los repositorios git"
@@ -3183,6 +3242,9 @@ msgstr "Validar cuenta de usuario"
msgid "AdminUsers|View pending member requests"
msgstr "Ver solicitudes pendientes de miembros"
+msgid "AdminUsers|Website URL"
+msgstr "URL del sitio web"
+
msgid "AdminUsers|What can I do?"
msgstr "¿Qué puedo hacer?"
@@ -3249,6 +3311,9 @@ msgstr "límite de usuarios"
msgid "Administration"
msgstr "‫Administración"
+msgid "Administrators"
+msgstr "Administradores"
+
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 ""
@@ -3292,7 +3357,7 @@ msgid "AdvancedSearch|Elasticsearch version not compatible"
msgstr ""
msgid "AdvancedSearch|Reindex required"
-msgstr ""
+msgstr "Reindexación requerida"
msgid "After a successful password update you will be redirected to login screen."
msgstr "Después de una actualización correcta de la contraseña, será redirigido a la pantalla de inicio de sesión."
@@ -3325,7 +3390,7 @@ msgid "Akismet helps prevent the creation of spam issues in public projects."
msgstr ""
msgid "Alert"
-msgstr ""
+msgstr "Alerta"
msgid "AlertManagement|Acknowledged"
msgstr "Confirmado"
@@ -3679,7 +3744,7 @@ msgid "All (default)"
msgstr "Todos (por defecto)"
msgid "All GitLab"
-msgstr ""
+msgstr "Todo GitLab"
msgid "All Members"
msgstr "Todos los miembros"
@@ -3700,7 +3765,7 @@ msgid "All groups and projects"
msgstr "Todos los grupos y proyectos"
msgid "All issues"
-msgstr ""
+msgstr "Todas las incidencias"
msgid "All issues for this milestone are closed."
msgstr "Todos las incidencias de este hito están cerradas."
@@ -3724,10 +3789,13 @@ msgid "All projects selected"
msgstr "Todos los proyectos seleccionados"
msgid "All protected branches"
-msgstr ""
+msgstr "Todas las ramas protegidas"
msgid "All threads resolved!"
-msgstr ""
+msgstr "¡Todos los hilos resueltos!"
+
+msgid "All users in this group must set up two-factor authentication"
+msgstr "Todos los usuarios de este grupo deben configurar la autenticación de dos factores"
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr "Todos los usuarios deben aceptar los términos de servicio y la política de privacidad para acceder a GitLab"
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Permitir al grupo %{group_name} iniciar sesión"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr "Permitir el acceso a los miembros del siguiente grupo"
@@ -3789,9 +3851,6 @@ msgstr "Permitir que los proyectos dentro de este grupo usen Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "Permitir que los subgrupos configuren sus propias reglas de autenticación de dos factores"
-
msgid "Allow this key to push to this repository"
msgstr "Permitir a esta clave hacer push a este repositorio"
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Permitir a los usuarios registrar cualquier aplicación para usar GitLab como proveedor de OAuth"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "Permitir a los usuarios solicitar acceso (si la visibilidad es pública o interna)"
-
msgid "Allowed"
msgstr "Permitido"
@@ -3819,12 +3875,18 @@ msgstr "Sólo los grupos de nivel superior pueden restringir los dominios de cor
msgid "Allowed to create:"
msgstr "Autorizado a crear:"
+msgid "Allowed to delete projects"
+msgstr "Permitido eliminar proyectos"
+
msgid "Allowed to fail"
msgstr "Permitido fallar"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Le permite añadir y administrar clusters de Kubernetes."
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr "Se ha producido un error al obtener los ancestros"
+msgid "An error occurred while fetching branches."
+msgstr "Se ha producido un error al obtener las ramas."
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4108,7 +4173,7 @@ msgid "An error occurred while loading projects."
msgstr "Se ha producido un error al cargar los proyectos."
msgid "An error occurred while loading the Jobs tab."
-msgstr ""
+msgstr "Se ha producido un error al cargar la pestaña Trabajos."
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4174,7 +4239,7 @@ msgid "An error occurred while pasting text in the editor. Please try again."
msgstr ""
msgid "An error occurred while performing this action."
-msgstr ""
+msgstr "Se ha producido un error al realizar esta acción."
msgid "An error occurred while removing epics."
msgstr "Se ha producido un error al eliminar las tareas épicas."
@@ -4203,13 +4268,19 @@ msgstr "Se ha producido un error al recuperar los archivos diff"
msgid "An error occurred while retrieving projects."
msgstr "Se ha producido un error al obtener los proyectos."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr "Se ha producido un error al guardar los cambios: %{error}"
msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Se ha producido un error al guardar los ajustes."
+msgstr[1] "Se han producido un error al guardar los ajustes."
+
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Se ha producido un error al suscribirse a las notificaciones."
@@ -4293,7 +4364,7 @@ msgid "An unauthenticated user"
msgstr "Un usuario no autenticado"
msgid "An unexpected error occurred"
-msgstr ""
+msgstr "Se ha producido un error inesperado"
msgid "An unexpected error occurred while checking the project environment."
msgstr "Se ha producido un error inesperado al comprobar el entorno del proyecto."
@@ -4418,6 +4489,9 @@ msgstr "Los límites de la aplicación se han guardado correctamente"
msgid "Application settings saved successfully"
msgstr "Se ha guardado correctamente la configuración de la aplicación"
+msgid "Application settings saved successfully."
+msgstr "La configuración de la aplicación se guardó correctamente."
+
msgid "Application settings update failed"
msgstr "Se ha producido un error al actualizar los ajustes de la aplicación"
@@ -4437,10 +4511,10 @@ msgid "ApplicationSettings|A Metrics Dashboard menu item appears in the Monitori
msgstr ""
msgid "ApplicationSettings|Add a link to Grafana"
-msgstr ""
+msgstr "Añadir un enlace a Grafana"
msgid "ApplicationSettings|After sign-up text"
-msgstr ""
+msgstr "Texto posterior al registro"
msgid "ApplicationSettings|After the instance reaches the user cap, any user who is added or requests access must be approved by an administrator. Leave blank for unlimited."
msgstr ""
@@ -4460,24 +4534,24 @@ msgstr[0] "Aprobar %d usuario"
msgstr[1] "Aprobar %d usuarios"
msgid "ApplicationSettings|Approve users"
-msgstr ""
+msgstr "Aprobar usuarios"
msgid "ApplicationSettings|Approve users in the pending approval status?"
-msgstr ""
+msgstr "¿Aprobar a los usuarios en el estado pendiente de aprobación?"
msgid "ApplicationSettings|Approve users who are pending approval?"
-msgstr ""
+msgstr "¿Aprobar usuarios que están pendientes de aprobación?"
msgid "ApplicationSettings|By making this change, you will automatically approve %d user who is pending approval."
msgid_plural "ApplicationSettings|By making this change, you will automatically approve %d users who are pending approval."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Al hacer este cambio, usted aprobará automáticamente %d usuario que está pendiente de aprobación."
+msgstr[1] "Al hacer este cambio, usted aprobará automáticamente %d usuarios que están pendientes de aprobación."
msgid "ApplicationSettings|By making this change, you will automatically approve all users who are pending approval."
-msgstr ""
+msgstr "Al hacer este cambio, usted aprobará automáticamente todos los usuarios que están pendientes de aprobación."
msgid "ApplicationSettings|Denied domains for sign-ups"
-msgstr ""
+msgstr "Dominios denegados para el registro"
msgid "ApplicationSettings|Denylist file"
msgstr ""
@@ -4546,7 +4620,7 @@ msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s
msgstr ""
msgid "ApplicationSettings|domain.com"
-msgstr ""
+msgstr "dominio.com"
msgid "Applications"
msgstr "Aplicaciones"
@@ -4559,8 +4633,8 @@ msgstr "Aplicar"
msgid "Apply %d suggestion"
msgid_plural "Apply %d suggestions"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Aplicar %d sugerencia"
+msgstr[1] "Aplicar %d sugerencias"
msgid "Apply a label"
msgstr "Aplicar a la etiqueta"
@@ -4646,10 +4720,10 @@ msgid "ApprovalRule|Approvers"
msgstr "Aprobadores"
msgid "ApprovalRule|Confirmed"
-msgstr ""
+msgstr "Confirmado"
msgid "ApprovalRule|Dismissed"
-msgstr ""
+msgstr "Descartado"
msgid "ApprovalRule|Examples: QA, Security."
msgstr "Ejemplos: QA, Seguridad."
@@ -4667,16 +4741,16 @@ msgid "ApprovalRule|Name"
msgstr "Nombre"
msgid "ApprovalRule|Newly detected"
-msgstr ""
+msgstr "Recientemente detectado"
msgid "ApprovalRule|Previously detected"
-msgstr ""
+msgstr "Previamente detectado"
msgid "ApprovalRule|Reduce your time to merge."
msgstr ""
msgid "ApprovalRule|Resolved"
-msgstr ""
+msgstr "Resuelto"
msgid "ApprovalRule|Rule name"
msgstr "Nombre de la regla"
@@ -4804,20 +4878,20 @@ msgstr "¡Proyecto archivado!. El repositorio y el resto de recursos del proyect
msgid "Archived projects"
msgstr "Proyectos archivados"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
-msgstr ""
+msgstr "¿Está ABSOLUTAMENTE SEGURO de que desea eliminar este grupo?"
msgid "Are you absolutely sure?"
-msgstr ""
+msgstr "¿Está absolutamente seguro?"
msgid "Are you sure that you want to archive this project?"
msgstr "¿Está seguro de que desea archivar el proyecto?"
msgid "Are you sure that you want to destroy %{application}"
-msgstr ""
+msgstr "¿Está seguro de que deseas eliminar %{application} ?"
msgid "Are you sure that you want to unarchive this project?"
msgstr "¿Está seguro de que desea desarchivar este proyecto?"
@@ -4826,7 +4900,7 @@ msgid "Are you sure you want to %{action} %{name}?"
msgstr "¿Está seguro que desea %{action} %{name}?"
msgid "Are you sure you want to approve %{user}?"
-msgstr ""
+msgstr "¿Está seguro de que desea aprobar a %{user}?"
msgid "Are you sure you want to attempt to merge?"
msgstr ""
@@ -4844,22 +4918,22 @@ msgid "Are you sure you want to delete these artifacts?"
msgstr "¿Está seguro de que desea eliminar estos artefactos?"
msgid "Are you sure you want to delete this %{commentType}?"
-msgstr ""
+msgstr "¿Está seguro que quiere eliminar este %{commentType}?"
msgid "Are you sure you want to delete this SSH key?"
msgstr "¿Está seguro de que desea eliminar la clave SSH?"
msgid "Are you sure you want to delete this comment?"
-msgstr ""
+msgstr "¿Está seguro que desea eliminar este comentario?"
msgid "Are you sure you want to delete this deploy key?"
-msgstr ""
+msgstr "¿Está seguro que desea eliminar esta clave de despliegue?"
msgid "Are you sure you want to delete this device? This action cannot be undone."
msgstr "¿Está seguro de que desea borrar este dispositivo? Esta acción no se puede deshacer."
msgid "Are you sure you want to delete this label?"
-msgstr ""
+msgstr "¿Está seguro de que quiere borrar esta etiqueta?"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "¿Estás seguro que deseas eliminar esta programación del pipeline?"
@@ -4908,6 +4982,9 @@ msgstr "¿Está seguro de que desea eliminar %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "¿Está seguro que desea eliminar %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr "¿Está seguro de que desea eliminar %{topic_name}?"
+
msgid "Are you sure you want to remove the attachment?"
msgstr "¿Está seguro que desea eliminar el archivo adjunto?"
@@ -4924,6 +5001,9 @@ msgid "Are you sure you want to remove this list?"
msgstr "¿Está seguro de que desea eliminar esta lista?"
msgid "Are you sure you want to remove this nickname?"
+msgstr "¿Está seguro de que quiere eliminar este apodo?"
+
+msgid "Are you sure you want to reset the error tracking access token?"
msgstr ""
msgid "Are you sure you want to reset the health check token?"
@@ -5043,6 +5123,9 @@ msgstr "Asignar etiquetas"
msgid "Assign milestone"
msgstr "Asignar milestone"
+msgid "Assign myself"
+msgstr "Asignar a mi mismo"
+
msgid "Assign reviewer"
msgstr "Asignar revisor"
@@ -5138,9 +5221,6 @@ msgstr "En riesgo"
msgid "Attach a file"
msgstr "Adjuntar un archivo"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Adjunte un archivo arrastrando &amp; soltando o %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr "Adjuntando archivo - %{progress}"
@@ -5212,6 +5292,9 @@ msgstr "Este mes"
msgid "AuditLogs|User Events"
msgstr "Eventos de usuario"
+msgid "AuditStreams|A header with this name already exists."
+msgstr "AuditStreams|Ya existe un cabecera con este nombre."
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5234,15 +5317,24 @@ msgid "AuditStreams|An error occurred when fetching external audit event streams
msgstr ""
msgid "AuditStreams|Cancel editing"
-msgstr ""
+msgstr "Cancelar edición"
+
+msgid "AuditStreams|Custom HTTP headers"
+msgstr "AuditStreams|Cabeceras HTTP personalizadas"
msgid "AuditStreams|Delete %{link}"
-msgstr ""
+msgstr "Eliminar %{link}"
msgid "AuditStreams|Destination URL"
-msgstr ""
+msgstr "URL de destino"
msgid "AuditStreams|Destinations receive all audit event data"
+msgstr "Los destinos reciben todos los datos del evento de auditoría"
+
+msgid "AuditStreams|Header"
+msgstr "AuditStreams|Cabecera"
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
msgid "AuditStreams|Setup streaming for audit events"
@@ -5252,7 +5344,7 @@ msgid "AuditStreams|Stream count icon"
msgstr ""
msgid "AuditStreams|Streams"
-msgstr ""
+msgstr "Streams"
msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr "AuditStreams|Valor"
+
msgid "Aug"
msgstr "Ago"
@@ -5492,7 +5587,7 @@ msgid "Available group runners: %{runners}"
msgstr "Grupo de ejecutores disponible: %{runners}"
msgid "Available on-demand"
-msgstr ""
+msgstr "Disponible bajo demanda"
msgid "Available shared runners:"
msgstr "Ejecutores compartidos disponibles:"
@@ -5510,7 +5605,7 @@ msgid "Average per day: %{average}"
msgstr "Promedio por día: %{average}"
msgid "Awaiting user signup"
-msgstr ""
+msgstr "En espera del registro de usuario"
msgid "Award added"
msgstr "Premio añadido"
@@ -5540,25 +5635,25 @@ msgid "Background color"
msgstr "Color de fondo"
msgid "BackgroundMigrations|Background Migrations"
-msgstr ""
+msgstr "Migraciones en segundo plano"
msgid "BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "BackgroundMigrations|Batch size"
-msgstr ""
+msgstr "Tamaño del lote"
msgid "BackgroundMigrations|Database"
-msgstr ""
+msgstr "Base de datos"
msgid "BackgroundMigrations|Failed jobs:"
-msgstr ""
+msgstr "Trabajos fallidos:"
msgid "BackgroundMigrations|Finished at"
-msgstr ""
+msgstr "Terminado en"
msgid "BackgroundMigrations|Started at"
-msgstr ""
+msgstr "Iniciado en"
msgid "Badges"
msgstr "Insignias"
@@ -5687,13 +5782,13 @@ msgid "BatchedJob|Batch size"
msgstr ""
msgid "BatchedJob|Batched Jobs"
-msgstr ""
+msgstr "Trabajos por lotes"
msgid "BatchedJob|Created At"
-msgstr ""
+msgstr "Creado en"
msgid "BatchedJob|Created at"
-msgstr ""
+msgstr "Creado en"
msgid "BatchedJob|Exception Class"
msgstr ""
@@ -5708,43 +5803,43 @@ msgid "BatchedJob|Exception message"
msgstr ""
msgid "BatchedJob|Finished at"
-msgstr ""
+msgstr "Terminado en"
msgid "BatchedJob|Max Value"
-msgstr ""
+msgstr "Valor máximo"
msgid "BatchedJob|Max value"
-msgstr ""
+msgstr "Valor máximo"
msgid "BatchedJob|Min Value"
-msgstr ""
+msgstr "Valor mínimo"
msgid "BatchedJob|Min value"
-msgstr ""
+msgstr "Valor mínimo"
msgid "BatchedJob|Next Status"
-msgstr ""
+msgstr "Siguiente estado"
msgid "BatchedJob|Next status"
-msgstr ""
+msgstr "Siguiente estado"
msgid "BatchedJob|Pause ms"
-msgstr ""
+msgstr "Pausa ms"
msgid "BatchedJob|Pause time (ms)"
-msgstr ""
+msgstr "Tiempo de pausa (ms)"
msgid "BatchedJob|Previous Status"
-msgstr ""
+msgstr "Estado anterior"
msgid "BatchedJob|Previous status"
-msgstr ""
+msgstr "Estado anterior"
msgid "BatchedJob|Started at"
-msgstr ""
+msgstr "Comenzado en"
msgid "BatchedJob|Transition logs:"
-msgstr ""
+msgstr "Registros de transición:"
msgid "Be careful. Changing the project's namespace can have unintended side effects."
msgstr "Tenga cuidado. Cambiar el espacio de nombres del proyecto puede tener efectos secundarios no deseados."
@@ -5752,9 +5847,6 @@ msgstr "Tenga cuidado. Cambiar el espacio de nombres del proyecto puede tener ef
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Tenga cuidado. Cambiar el nombre del repositorio de un proyecto puede tener efectos secundarios no deseados."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -5789,46 +5881,46 @@ msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
msgid "BillingPlans|10,000 CI/CD minutes per month"
-msgstr ""
+msgstr "10,000 minutos de CI/CD por mes"
msgid "BillingPlans|10GB transfer per month"
-msgstr ""
+msgstr "Transferencia de 10 GB por mes"
msgid "BillingPlans|400 CI/CD minutes per month"
-msgstr ""
+msgstr "400 minutos de CI/CD por mes"
msgid "BillingPlans|5 users per namespace"
-msgstr ""
+msgstr "5 usuarios por espacio de nombres"
msgid "BillingPlans|50,000 CI/CD minutes per month"
-msgstr ""
+msgstr "50.000 minutos de CI/CD por mes"
msgid "BillingPlans|5GB storage"
-msgstr ""
+msgstr "5 GB de almacenamiento"
msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
msgstr "@%{user_name} está utilizando el %{plan_name}."
msgid "BillingPlans|Advanced CI/CD"
-msgstr ""
+msgstr "CI/CD avanzado"
msgid "BillingPlans|All plans have unlimited (private) repositories."
-msgstr ""
+msgstr "Todos los planes tienen repositorios privados ilimitados."
msgid "BillingPlans|All the features from Free"
-msgstr ""
+msgstr "Todas las características de la edición Free"
msgid "BillingPlans|All the features from Premium"
-msgstr ""
+msgstr "Todaslas características de la edición Premium"
msgid "BillingPlans|Billed annually at %{price_per_year} USD"
-msgstr ""
+msgstr "Facturado anualmente a %{price_per_year} USD"
msgid "BillingPlans|Check out all groups"
-msgstr ""
+msgstr "Revise todos los grupos"
msgid "BillingPlans|Compliance"
-msgstr ""
+msgstr "Cumplimiento"
msgid "BillingPlans|Congratulations, your free trial is activated."
msgstr "Enhorabuena, su plan de prueba está activado."
@@ -5852,16 +5944,16 @@ msgid "BillingPlans|Free guest users"
msgstr ""
msgid "BillingPlans|Free upgrade!"
-msgstr ""
+msgstr "¡Actualización gratuita!"
msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
msgstr "Si deseas cambiar su plan, por favor, póngase en contacto con %{support_link_start}Atención al cliente%{support_link_end}."
msgid "BillingPlans|Includes free static websites"
-msgstr ""
+msgstr "Incluye sitios web estáticos gratuitos"
msgid "BillingPlans|Learn more"
-msgstr ""
+msgstr "Más información"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
msgstr ""
@@ -5921,13 +6013,13 @@ msgid "BillingPlans|Start a free Ultimate trial"
msgstr ""
msgid "BillingPlans|Still have questions?"
-msgstr ""
+msgstr "¿Todavía tiene preguntas?"
msgid "BillingPlans|Support"
-msgstr ""
+msgstr "Soporte"
msgid "BillingPlans|Talk to an expert today."
-msgstr ""
+msgstr "Hable con un experto hoy mismo."
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Este grupo utiliza el mismo plan asociado que su grupo principal."
@@ -5936,19 +6028,19 @@ msgid "BillingPlans|To manage the plan for this group, visit the billing section
msgstr "Para administrar el plan de este grupo, por favor visite la sección de facturación de %{parent_billing_page_link}."
msgid "BillingPlans|Ultimate"
-msgstr ""
+msgstr "Ultimate"
msgid "BillingPlans|Upgrade to Premium"
-msgstr ""
+msgstr "Actualizar a Premium"
msgid "BillingPlans|Upgrade to Ultimate"
-msgstr ""
+msgstr "Actualizar a Ultimate"
msgid "BillingPlans|Value stream management"
msgstr ""
msgid "BillingPlans|We're here to help."
-msgstr ""
+msgstr "Estamos aquí para ayudarle."
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
@@ -5966,13 +6058,13 @@ msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can
msgstr "Su periodo de prueba de GitLab.com Gold caducó en %{expiration_date}. Puede restaurar el acceso a las funciones en cualquier momento actualizando a la versión Gold."
msgid "BillingPlans|Your current plan"
-msgstr ""
+msgstr "Su plan actual"
msgid "BillingPlans|billed annually at %{price_per_year}"
msgstr "%{price_per_year} pagados anualmente"
msgid "BillingPlans|for the remainder of your subscription"
-msgstr ""
+msgstr "mientras dure su suscripción"
msgid "BillingPlans|frequently asked questions"
msgstr "preguntas frecuentes"
@@ -5987,7 +6079,7 @@ msgid "BillingPlans|per user"
msgstr "por usuario"
msgid "BillingPlans|per user/month"
-msgstr ""
+msgstr "por usuario/mes"
msgid "BillingPlan|Upgrade"
msgstr "Actualizar"
@@ -6107,7 +6199,7 @@ msgid "Billing|Enter at least three characters to search."
msgstr "Introduzca al menos tres caracteres para buscar."
msgid "Billing|Explore all plans"
-msgstr ""
+msgstr "Explorar todos los planes"
msgid "Billing|Export list"
msgstr "Exportar lista"
@@ -6157,6 +6249,12 @@ msgstr "Está a punto de eliminar al usuario %{username} de su suscripción. Si
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Importar desde un servidor de Bitbucket"
@@ -6298,7 +6396,7 @@ msgid "BoardScope|Select assignee"
msgstr "Seleccionar asignado"
msgid "BoardScope|Select iteration"
-msgstr ""
+msgstr "Seleccionar iteración"
msgid "BoardScope|Select labels"
msgstr "Seleccione las etiquetas"
@@ -6307,7 +6405,7 @@ msgid "BoardScope|Select milestone"
msgstr "Seleccionar hito"
msgid "BoardScope|Select weight"
-msgstr ""
+msgstr "Seleccionar peso"
msgid "BoardScope|Started"
msgstr "Iniciado"
@@ -6316,13 +6414,13 @@ msgid "BoardScope|Upcoming"
msgstr "Próximamente"
msgid "BoardScope|Weight"
-msgstr ""
+msgstr "Peso"
msgid "Boards"
msgstr "Tableros"
msgid "Boards and board lists"
-msgstr ""
+msgstr "Tableros y listas de tableros"
msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
@@ -6330,25 +6428,25 @@ msgstr[0] ""
msgstr[1] ""
msgid "Boards|An error occurred while creating the epic. Please try again."
-msgstr ""
+msgstr "Se ha producido un error al crear la tarea épica. Por favor, inténtelo de nuevo."
msgid "Boards|An error occurred while creating the issue. Please try again."
-msgstr ""
+msgstr "Se ha producido un error al crear la incidencia. Por favor, inténtelo de nuevo."
msgid "Boards|An error occurred while creating the list. Please try again."
-msgstr ""
+msgstr "Se ha producido un error al crear la lista. Por favor, inténtelo de nuevo."
msgid "Boards|An error occurred while fetching child groups. Please try again."
-msgstr ""
+msgstr "Se ha producido un error al buscar los grupos secundarios. Por favor, inténtelo de nuevo."
msgid "Boards|An error occurred while fetching group projects. Please try again."
-msgstr ""
+msgstr "Se ha producido un error al obtener los proyectos del grupo. Por favor, inténtelo de nuevo."
msgid "Boards|An error occurred while fetching issues. Please reload the page."
-msgstr ""
+msgstr "Se ha producido un error al obtener las incidencias. Por favor, vuelva a cargar la página."
msgid "Boards|An error occurred while fetching labels. Please reload the page."
-msgstr ""
+msgstr "Se ha producido un error al obtener las etiquetas. Por favor, vuelva a cargar la página."
msgid "Boards|An error occurred while fetching the board epics. Please reload the page."
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr "Cargando épicas"
msgid "Bold text"
msgstr "Negrita"
+msgid "Both SSH and HTTP(S)"
+msgstr "Tanto SSH como HTTP(S)"
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6575,7 +6676,7 @@ msgid "Branches|Stale"
msgstr ""
msgid "Branches|Stale branches"
-msgstr ""
+msgstr "Ramas obsoletas"
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
msgstr "No ha sido posible actualizar automáticamente la rama porque ha divergido de su contraparte en el servidor."
@@ -6593,13 +6694,13 @@ msgid "Branches|Unable to load branches"
msgstr ""
msgid "Branches|Yes, delete branch"
-msgstr ""
+msgstr "Sí, eliminar la rama"
msgid "Branches|Yes, delete protected branch"
-msgstr ""
+msgstr "Sí, eliminar rama la protegida"
msgid "Branches|You're about to permanently delete the branch %{branchName}."
-msgstr ""
+msgstr "Está a punto de eliminar permanentemente la rama %{branchName}."
msgid "Branches|You're about to permanently delete the protected branch %{branchName}."
msgstr ""
@@ -6665,10 +6766,10 @@ msgid "BulkImport|%{feature} (require v%{version})"
msgstr "%{feature} (requiere v%{version})"
msgid "BulkImport|Destination"
-msgstr ""
+msgstr "Destino"
msgid "BulkImport|Destination group"
-msgstr ""
+msgstr "Grupo de destino"
msgid "BulkImport|Existing groups"
msgstr "Grupos existentes"
@@ -6683,10 +6784,10 @@ msgid "BulkImport|From source group"
msgstr "Del grupo de origen"
msgid "BulkImport|Group import history"
-msgstr ""
+msgstr "Historial de importación de grupos"
msgid "BulkImport|History"
-msgstr ""
+msgstr "Historial"
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr "Importación fallida: el destino no puede ser un subgrupo del grupo de origen. Por favor, cambie el destino y vuelva a intentarlo."
@@ -6704,22 +6805,22 @@ msgid "BulkImport|Importing the group failed."
msgstr "Error al importar el grupo."
msgid "BulkImport|Last imported to %{link}"
-msgstr ""
+msgstr "Última importación a %{link}"
msgid "BulkImport|Name already exists."
msgstr "El nombre ya existe."
msgid "BulkImport|Name already used as a target for another group."
-msgstr ""
+msgstr "El nombre ya está en uso como destino para otro grupo."
msgid "BulkImport|No additional information provided."
-msgstr ""
+msgstr "No se proporcionó información adicional."
msgid "BulkImport|No groups found"
-msgstr ""
+msgstr "No se encontraron grupos"
msgid "BulkImport|No history is available"
-msgstr ""
+msgstr "No hay un historial disponible"
msgid "BulkImport|No parent"
msgstr "No hay ningún padre"
@@ -6728,7 +6829,7 @@ msgid "BulkImport|Only groups that you have the %{role} role for are listed as g
msgstr ""
msgid "BulkImport|Project import history"
-msgstr ""
+msgstr "Historial de importación de proyectos"
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6743,10 +6844,10 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own matching filt
msgstr ""
msgid "BulkImport|Source"
-msgstr ""
+msgstr "Origen"
msgid "BulkImport|Source group"
-msgstr ""
+msgstr "Grupo de origen"
msgid "BulkImport|Template / File-based import / GitLab Migration"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr "Lista de viñetas"
+
msgid "Burndown chart"
msgstr "Gráfico de evolución"
@@ -6854,18 +6958,21 @@ msgid "CI/CD configuration file"
msgstr "Archivo de configuración de CI/CD"
msgid "CI/CD limits"
-msgstr ""
+msgstr "Límites de CI/CD"
msgid "CI/CD minutes"
-msgstr ""
+msgstr "Minutos de CI/CD"
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
msgid "CICDAnalytics|%{percent}%{percentSymbol}"
-msgstr ""
+msgstr "%{percent}%{percentSymbol}"
msgid "CICDAnalytics|All time"
+msgstr "Todo el tiempo"
+
+msgid "CICDAnalytics|Change failure rate"
msgstr ""
msgid "CICDAnalytics|Deployment frequency"
@@ -6909,6 +7016,9 @@ msgstr "El uso compartido del ejecutor es el tiempo de ejecución total de todos
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr "Tiempo para restaurar el servicio"
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -6949,7 +7059,7 @@ msgid "CICD|Jobs"
msgstr "Trabajos"
msgid "CICD|Limit"
-msgstr ""
+msgstr "Límite"
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr "Nombre del titular de la tarjeta"
msgid "Card number:"
msgstr "Número de tarjeta:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr "Forzar para todos los subgrupos"
@@ -7407,9 +7520,6 @@ msgstr "Cambios eliminados. Haga clic para mostrar."
msgid "Changes the title to \"%{title_param}\"."
msgstr "Cambia el título a \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr "No se han guardado los cambios en el título"
@@ -7657,6 +7767,12 @@ msgstr "Plan de GitLab"
msgid "Checkout|Group"
msgstr "Grupo"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Nombre de la empresa u organización que está utilizando GitLab"
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr "Impuestos"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr "Total"
@@ -7774,6 +7887,9 @@ msgstr "La subtarea épica no existe."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr "Hijos"
+
msgid "Chinese language support using"
msgstr "Soporte para el idioma chino utilizando"
@@ -8148,6 +8264,9 @@ msgstr "Cerrado %{epicTimeagoDate}"
msgid "Closed MRs"
msgstr "MRs cerrados"
+msgid "Closed date"
+msgstr "Fecha de cierre"
+
msgid "Closed issues"
msgstr "Incidencias cerradas"
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr "CloudSeed|Todos"
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr "AlloyDB para Postgres"
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr "CloudSeed|Cancelar"
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr "CloudSeed|Cloud Firestore"
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr "CloudSeed|Cloud SQL para MySQL"
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr "CloudSeed|Cloud SQL para Postgres"
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr "CloudSeed|Cloud SQL para SQL Server"
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr "CloudSeed|Instancia de CloudSQL"
+
+msgid "CloudSeed|Create cluster"
+msgstr "CloudSeed|Crear clúster"
+
+msgid "CloudSeed|Create database"
+msgstr "CloudSeed|Crear base de datos"
+
+msgid "CloudSeed|Create instance"
+msgstr "CloudSeed|Crear instancia"
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr "CloudSeed|Versión de la base de datos"
+
+msgid "CloudSeed|Description"
+msgstr "CloudSeed|Descripción"
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr "CloudSeed|Entorno"
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr "CloudSeed|Google Cloud Project"
+
+msgid "CloudSeed|Google Cloud project"
+msgstr "CloudSeed|Google Cloud Project"
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr "CloudSeed|Acepto los precios de Google Cloud y las responsabilidades relacionadas con la administración de instancias de bases de datos"
+
+msgid "CloudSeed|Instances"
+msgstr "CloudSeed|Instancias"
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr "CloudSeed|Tipo de máquina"
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr "CloudSeed|Memorystore for Redis"
+
+msgid "CloudSeed|No instances"
+msgstr "CloudSeed|Sin instancias"
+
+msgid "CloudSeed|Refs"
+msgstr "CloudSeed|Referencias"
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr "CloudSeed|Servicio"
+
+msgid "CloudSeed|Services"
+msgstr "CloudSeed|Servicios"
+
+msgid "CloudSeed|There are no instances to display."
+msgstr "CloudSeed|No hay instancias para mostrar."
+
+msgid "CloudSeed|Version"
+msgstr "CloudSeed|Versión"
+
msgid "Cluster"
msgstr "Clúster"
@@ -8175,9 +8411,6 @@ msgstr "Estado de salud del clúster"
msgid "Cluster cache cleared."
msgstr "Borrada la caché del clúster."
-msgid "Cluster does not exist"
-msgstr "El clúster no existe"
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr "Verifique su token"
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."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr "ClusterIntegration|Civo Kubernetes"
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "Limpiar la caché de cluster"
@@ -8630,9 +8863,6 @@ msgstr "¿Sabía usted?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service"
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr "Habilitar la integración de Elastic Stack"
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ 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 certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr "Revisión de código"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,14 +9232,17 @@ msgstr ""
msgid "Collector hostname"
msgstr "Nombre del recolector"
+msgid "Color"
+msgstr "Color"
+
msgid "ColorWidget|An error occurred while updating color."
-msgstr ""
+msgstr "Se ha producido un error al actualizar el color."
msgid "ColorWidget|Assign epic color"
msgstr ""
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "Color"
msgid "ColorWidget|Error fetching epic color."
msgstr ""
@@ -9095,7 +9340,7 @@ msgid "CommitBoxTitle|Commit"
msgstr "Cambio"
msgid "CommitMessage|Add %{file_name}"
-msgstr "CommitMessage|Añadir %{file_name}"
+msgstr "Añadir %{file_name}"
msgid "CommitWidget|authored"
msgstr "autorizado"
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,12 +9663,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-msgstr "Configurar seguimiento"
-
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 advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr ""
@@ -9610,9 +9858,6 @@ msgstr "Registro de contenedores"
msgid "Container Scanning"
msgstr "Análisis de contenedores"
-msgid "Container does not exist"
-msgstr "El contenedor no existe"
-
msgid "Container must be a project or a group."
msgstr "El contenedor debe ser un proyecto o un grupo."
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr "Mostrar ruta completa"
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr "Crear nueva etiqueta"
msgid "Create new project"
msgstr "Crear nuevo proyecto"
+msgid "Create new..."
+msgstr "Crear nuevo..."
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr "Fecha"
@@ -11281,13 +11532,13 @@ msgid "DORA4Metrics|Median (last %{days}d)"
msgstr ""
msgid "DORA4Metrics|Median time (last %{days}d)"
-msgstr ""
+msgstr "Tiempo medio (últimos %{days} días)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
msgid "DORA4Metrics|No incidents during this period"
-msgstr ""
+msgstr "Sin incidencias durante este periodo"
msgid "DORA4Metrics|No merge requests were deployed during this period"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11311,7 +11571,7 @@ msgid "DORA4Metrics|The chart displays the median time between a merge request b
msgstr ""
msgid "DORA4Metrics|Time to restore service"
-msgstr ""
+msgstr "DORA4Metrics|Tiempo para restaurar el servicio"
msgid "DSN"
msgstr "DSN"
@@ -11343,15 +11603,15 @@ 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 "Configuración de DAST"
+msgid "DastConfig|DAST CI/CD configuration"
+msgstr "DastConfig|Configuración DAST CI/CD"
+
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
+msgstr ""
msgid "DastConfig|Generate code snippet"
msgstr "Generar fragmento de código"
-msgid "DastConfig|Scan Configuration"
-msgstr "Configuración del análisis"
-
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 ""
@@ -11481,6 +11741,9 @@ msgstr "Ocultar mensajes de depuración"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr "Administrar perfiles"
@@ -11691,6 +11954,9 @@ msgstr "Validar encabezado"
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr "DastSiteValidation|No validado"
+
msgid "DastSiteValidation|Retry validation"
msgstr "Reintentar validación"
@@ -11894,12 +12160,6 @@ msgstr "Rama por defecto"
msgid "Default branch and protected branches"
msgstr "Ramas por defecto y ramas protegidas"
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr "Plantilla de descripción predeterminada para las incidencias"
@@ -11912,9 +12172,6 @@ msgstr "Primer día de la semana por defecto"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Primer día de la semana por defecto en calendarios y selectores de fechas."
-msgid "Default project deletion protection"
-msgstr "Protección por defecto de eliminación de proyectos"
-
msgid "Default projects limit"
msgstr "Límite predeterminado de proyectos"
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr "Definición"
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr "Eliminar el comentario"
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr "Eliminar clave"
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr "Eliminar el epositorio de imágenes"
+msgid "Delete internal note"
+msgstr "Eliminar nota interna"
+
msgid "Delete label"
msgstr "Eliminar etiqueta"
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr "Todos los proyectos se eliminan inmediatamente."
+
+msgid "DeletionSettings|Deletion protection"
+msgstr "DeletionSettings|Protección contra eliminación"
+
+msgid "DeletionSettings|Keep deleted"
+msgstr "DeletionSettings|Mantener eliminado"
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr "DeletionSettings|Mantener los proyectos eliminados durante %{number} días"
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr "DeletionSettings|Mantener los proyectos eliminados durante 1 día"
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr "DeletionSettings|Ninguno, eliminar inmediatamente"
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr "Sólo los administradores pueden eliminar los proyectos."
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr "Los propietarios y los administradores pueden eliminar los proyectos."
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr "Denegado"
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr "Comentario"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "Se ha producido un error al crear el comentario. Por favor, inténtelo de nuevo."
@@ -12867,9 +13145,6 @@ msgstr "Mantener los cambios"
msgid "DesignManagement|Keep comment"
msgstr "Mantener comentario"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "La versión del diseño solicitada no existe. Mostrando la última versión en su lugar"
@@ -12927,6 +13202,9 @@ msgstr "Detalles"
msgid "Details (default)"
msgstr "Detalles (por defecto)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "Detectar las claves del host"
@@ -13128,6 +13406,9 @@ msgstr "Su puntuación"
msgid "DevopsReport|Your usage"
msgstr "Su uso"
+msgid "Diagram (%{language})"
+msgstr "Diagrama (%{language})"
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr "Deshabilitar para este proyecto"
msgid "Disable group runners"
msgstr "Desactivar grupo de ejecutores"
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr "Desactivar la autenticación de dos factores"
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr "Documentos reindexados: %{processed_documents} (%{percentage}%%)"
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,12 +13894,12 @@ msgstr ""
msgid "Edit"
msgstr "Editar"
-msgid "Edit %{issuable}"
-msgstr "Editar %{issuable}"
-
msgid "Edit %{name}"
msgstr "Editar %{name}"
+msgid "Edit %{profileType} profile"
+msgstr "Editar perfil de %{profileType}"
+
msgid "Edit Comment"
msgstr "Editar comentario"
@@ -13652,9 +13927,6 @@ msgstr "Editar la contraseña"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "Editar versión"
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr "Elasticsearch ha devuelto el código de estado: %{status_code}"
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr "Incrustado"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr "Archivo vacío"
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "Activar Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr "Habilitar Gitpod"
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr "Habilitar notificaciones por correo electrónico"
@@ -14147,9 +14413,6 @@ msgstr "Protocolos de acceso Git habilitados"
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr "Se ha producido un error al renderizar: %{err}"
@@ -14270,9 +14533,6 @@ msgstr "Empresa"
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr "El entorno no tiene implementaciones"
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr "Mostrando %{fetched} resultados."
-
-msgid "Environments|Currently showing all results."
-msgstr "Mostrando todos los resultados."
-
msgid "Environments|Delete"
msgstr "Eliminar"
@@ -14414,9 +14668,6 @@ msgstr "Los entornos son lugares en los que se despliega el código, como por ej
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr "Instala Elastic Stack en su clúster para habilitar capacidades de consulta avanzadas, como búsqueda de texto completo."
-
msgid "Environments|Job"
msgstr "Trabajo"
@@ -14426,9 +14677,6 @@ msgstr "Obtenga más información sobre los entornos"
msgid "Environments|Learn more about stopping environments"
msgstr "Obtenga más información sobre cómo detener los entornos"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr "Logs desde %{start} hasta %{end}."
-
msgid "Environments|New environment"
msgstr "Nuevo entorno"
@@ -14438,12 +14686,6 @@ msgstr "No hay entornos desplegados"
msgid "Environments|No deployments yet"
msgstr "Todavía no hay despliegues"
-msgid "Environments|No pod selected"
-msgstr "No hay nigún pod seleccionado"
-
-msgid "Environments|No pods to display"
-msgstr "No hay pods para mostrar"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Note que esta acción detendrá el entorno, pero %{emphasisStart}no%{emphasisEnd} tendrá ningún efecto sobre cualquier instancia debido a que no hay una \"acción para detener el entorno\" definida en el archivo %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}."
@@ -14453,11 +14695,8 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr "Entorno abierto"
-msgid "Environments|Pod name"
-msgstr "Nombre del Pod"
-
-msgid "Environments|Re-deploy"
-msgstr "Re-desplegar"
+msgid "Environments|Re-deploy environment"
+msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
msgstr "¿Desea redesplegar el entorno %{name}?"
@@ -14465,18 +14704,12 @@ msgstr "¿Desea redesplegar el entorno %{name}?"
msgid "Environments|Re-deploy to environment"
msgstr "Re-desplegar al entorno"
-msgid "Environments|Rollback"
-msgstr "Restaurar"
-
msgid "Environments|Rollback environment"
msgstr "Deshacer entorno"
msgid "Environments|Rollback environment %{name}?"
msgstr "¿Desea restaurar el entorno %{name}?"
-msgid "Environments|Select pod"
-msgstr "Seleccionar pod"
-
msgid "Environments|Show all"
msgstr "Mostrar todo"
@@ -14492,14 +14725,11 @@ msgstr "Deteniendo %{environmentName}"
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr "Esta acción volverá a ejecutar el trabajo para el commit %{linkStart}%{commitId}%{linkEnd}, cambiando el entorno a una versión anterior. ¿Está seguro de que desea continuar?"
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
-msgstr "Esta acción ejecutará el trabajo definido por %{name} para el commit %{linkStart}%{commitId}%{linkEnd}, estableciendo el entorno a una versión anterior. Puede dejar el entorno en la última versión de su aplicación volviendo a desplegarlo. ¿Está seguro de que desea continuar?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr ""
msgid "Environments|Upcoming"
msgstr "Próximos"
@@ -14633,6 +14863,9 @@ msgstr "Se ha producido un error al eliminar la incidencia de la tarea épica."
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "Activo"
@@ -15124,6 +15360,9 @@ msgstr "Todos los años los %{day} a las %{time} %{timezone}"
msgid "Everyone With Access"
msgstr "Todos los usuarios con acceso"
+msgid "Everyone can access the wiki."
+msgstr "Todo el mundo puede acceder al wiki."
+
msgid "Everyone can contribute"
msgstr "Todo el mundo puede colaborar"
@@ -15262,8 +15501,8 @@ msgstr "Caducado:"
msgid "Expires"
msgstr "Caduca"
-msgid "Expires in %{expires_at}"
-msgstr "Caduca en %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr "Expira %{preposition} %{expires_at}"
msgid "Expires on"
msgstr "Caduca el"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr "Introduzca la URL del wiki externo."
+
msgid "ExternalWikiService|External wiki"
msgstr "Wiki externo"
@@ -15448,6 +15690,11 @@ msgstr "Fallido"
msgid "Failed Jobs"
msgstr "Trabajos fallidos"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] "Trabajo fallido"
+msgstr[1] "Trabajos fallidos"
+
msgid "Failed on"
msgstr "Error en"
@@ -15580,7 +15827,7 @@ msgid "Failed to load groups, users and deploy keys."
msgstr ""
msgid "Failed to load groups."
-msgstr ""
+msgstr "Se ha producido un error al cargar los grupos."
msgid "Failed to load iteration cadences."
msgstr ""
@@ -16127,8 +16374,11 @@ msgstr "Buscar por ruta"
msgid "Find file"
msgstr "Buscar archivo"
-msgid "Fingerprint"
-msgstr "Huella digital"
+msgid "Fingerprint (MD5)"
+msgstr "Huella digital (MD5)"
+
+msgid "Fingerprint (SHA256)"
+msgstr "Huella digital (SHA256)"
msgid "Fingerprints"
msgstr "Huellas digitales"
@@ -16136,6 +16386,9 @@ msgstr "Huellas digitales"
msgid "Finish editing this message first!"
msgstr "¡Termine la edición de este mensaje primero!"
+msgid "Finish review"
+msgstr "Finalizar revisión"
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "Para obtener más información, vaya a "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,8 +16587,8 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr "Nivel de visibilidad"
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
-msgstr ""
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
+msgstr "¿Desea organizar varios proyectos dependientes bajo el mismo espacio de nombres?"
msgid "ForkSuggestion|Cancel"
msgstr "Cancelar"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr "Pendiente de verificación"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr "Nodo principal"
-
msgid "Geo|Primary site"
msgstr "Sitio principal"
-msgid "Geo|Project"
-msgstr "Proyecto"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "El proyecto (ID: %{project_id}) ya no existe en el nodo primario. Es seguro eliminar esta entrada, esta acción no eliminará ningún dato del disco."
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr "Nodo secundario"
-
msgid "Geo|Secondary site"
msgstr "Sitio secundario"
@@ -16938,9 +17176,6 @@ msgstr "Configuración del almacenamiento"
msgid "Geo|Synced"
msgstr "Sincronizado"
-msgid "Geo|Synced at"
-msgstr "Sincronizado en"
-
msgid "Geo|Synchronization"
msgstr "Sincronización"
@@ -17133,6 +17368,42 @@ msgstr "Transferencia de Git en progreso"
msgid "Git version"
msgstr "Versión de Git"
+msgid "GitAbuse|Excluded users"
+msgstr "Usuarios excluidos"
+
+msgid "GitAbuse|Number of repositories"
+msgstr "Número de repositorios"
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr "El número de repositorios no puede estar en blanco. Establézcalo en 0 para deshabilitar el límite."
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr "El número de repositorios debe ser un número."
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr "El número de repositorios debe estar entre %{minNumRepos}-%{maxNumRepos}."
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr "Solicitud de cuenta de GitLab"
msgid "GitLab Billing Team."
msgstr "Equipo de facturación de GitLab."
+msgid "GitLab Error Tracking"
+msgstr "Seguimiento de errores de GitLab"
+
msgid "GitLab Import"
msgstr "Importar desde GitLab"
@@ -17233,7 +17507,7 @@ msgid "GitLab is open source software to collaborate on code."
msgstr ""
msgid "GitLab is undergoing maintenance"
-msgstr ""
+msgstr "GitLab está en mantenimiento"
msgid "GitLab logo"
msgstr "Logotipo de GitLab"
@@ -17250,9 +17524,6 @@ msgstr "URL de inicio de sesión único de GitLab"
msgid "GitLab username"
msgstr "Nombre de usuario de GitLab"
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr "GitLab utiliza %{jaeger_link} para monitorizar sistemas distribuidos."
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17311,7 +17582,7 @@ msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable th
msgstr ""
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "Tamaño máximo (MB)"
msgid "GitLabPages|New Domain"
msgstr "Nuevo dominio"
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr "Sin verificar"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr "Verificado"
@@ -17454,9 +17728,15 @@ msgstr "Accesos directos globales"
msgid "Global notification settings"
msgstr "Configuración global de las notificaciones"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr " %{search} %{description} %{scope}"
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr "Grupos"
+
msgid "GlobalSearch|Issues I've created"
msgstr "Incidencias que he creado"
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr "Proyectos"
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,17 +17776,23 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
-msgstr "en todo GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr "todo GitLab"
+
+msgid "GlobalSearch|group"
+msgstr "grupo"
-msgid "GlobalSearch|in group"
-msgstr "en el grupo"
+msgid "GlobalSearch|in %{scope}"
+msgstr "en %{scope}"
-msgid "GlobalSearch|in project"
-msgstr "en el proyecto"
+msgid "GlobalSearch|project"
+msgstr "proyecto"
msgid "Globally-allowed IP ranges"
msgstr ""
@@ -17778,6 +18067,9 @@ msgstr "Gravatar habilitado"
msgid "Group"
msgstr "Grupo"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr "No se puede exportar el grupo %{group_name} ."
@@ -17931,6 +18223,9 @@ msgstr "Grupo actualizado correctamente."
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr "El wiki a nivel de grupo está deshabilitado."
+
msgid "Group: %{group_name}"
msgstr "Grupo: %{group_name}"
@@ -17940,8 +18235,8 @@ msgstr "Grupo: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
-msgstr ""
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr "GroupActivityMetrics|Últimos 30 días"
msgid "GroupActivityMetrics|Members added"
msgstr ""
@@ -18207,18 +18502,15 @@ msgstr "Buscar grupos"
msgid "GroupSelect|Select a group"
msgstr "Seleccione un grupo"
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "El pipeline Auto DevOps se actualizó para el grupo"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,26 +18541,26 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr "Plantillas de proyecto personalizadas"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr "GroupSettings|Las relaciones con los clientes están habilitadas"
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "Por defecto, al pipeline de Auto DevOps para todos los proyectos englobados dentro de este grupo"
-msgid "GroupSettings|Disable email notifications"
-msgstr "Desactivar las notificaciones por correo electrónico"
+msgid "GroupSettings|Email notifications are disabled"
+msgstr "GroupSettings|Las notificaciones por correo electrónico están deshabilitadas"
-msgid "GroupSettings|Disable group mentions"
-msgstr "Desactivar las menciones de grupo"
+msgid "GroupSettings|Export group"
+msgstr "Exportar grupo"
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr ""
-
-msgid "GroupSettings|Export group"
-msgstr "Exportar grupo"
+msgid "GroupSettings|Group mentions are disabled"
+msgstr "GroupSettings|Las menciones de grupo están deshabilitadas"
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
msgstr ""
@@ -18276,6 +18568,18 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
+msgid "GroupSettings|Interval (seconds)"
+msgstr "GroupSettings|Intervalo (segundos)"
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr "GroupSettings|Número de proyectos"
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18291,23 +18595,14 @@ 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|Prevents group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
-msgstr ""
+msgid "GroupSettings|Project download rate limit"
+msgstr "GroupSettings|Límite de velocidad de descarga del proyecto"
-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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
-msgstr ""
+msgid "GroupSettings|Reporting"
+msgstr "GroupSettings|Informes"
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr ""
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr "Seleccionar grupo principal"
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr "GroupSettings|Establézcalo en 0 para deshabilitar la limitación."
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr "Esta configuración se aplica en %{ancestor_group}. Puede sobrescribir l
msgid "GroupSettings|Transfer group"
msgstr "Transferir grupo"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18418,10 +18722,10 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Un grupo es una colección de varios proyectos."
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "GroupsEmptyState|Crear nuevo proyecto"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "GroupsEmptyState|Crear nuevo subgrupo"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
msgstr ""
@@ -18433,7 +18737,7 @@ msgid "GroupsEmptyState|No groups found"
msgstr "No se encuentran grupos"
msgid "GroupsEmptyState|No subgroups or projects."
-msgstr ""
+msgstr "No hay subgrupos ni proyectos."
msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
msgstr ""
@@ -18480,9 +18784,6 @@ msgstr "Importar grupo"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Importar grupos desde otra instancia de GitLab"
-msgid "GroupsNew|My Awesome Group"
-msgstr "Mi impresionante grupo"
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,12 +19263,12 @@ msgstr "Página principal"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr "Falló la ejecución del hook. Asegúrese de que el grupo tiene, al menos, un proyecto con commits."
-msgid "Hook was successfully created."
-msgstr "El hook se ha creado correctamente."
-
msgid "Hook was successfully updated."
msgstr "El hook se actualizó correctamente."
+msgid "Horizontal rule"
+msgstr "Regla horizontal"
+
msgid "Hostname"
msgstr "Nombre del host"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "Hora (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "Mantenimiento"
@@ -19089,7 +19387,7 @@ msgid "IDE|Review"
msgstr "Revisión"
msgid "IDE|Start a new merge request"
-msgstr ""
+msgstr "Iniciar una nueva solicitud de fusión"
msgid "IDE|Successful commit"
msgstr "Commit realizado correctamente"
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr "Antes de iniciar sesión, necesitamos verificar su identidad. Introduzca el siguiente código en la página de inicio de sesión."
+
msgid "IdentityVerification|Create a project"
msgstr "Crear un proyecto"
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr "Por favor, introduzca un código válido"
+
+msgid "IdentityVerification|Resend code"
+msgstr "IdentityVerification|Reenviar código"
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr "IdentityVerification|El código ha caducado. Vuelve a enviar un nuevo código e inténtalo de nuevo."
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr "IdentityVerification|El código es incorrecto. Introdúzcalo de nuevo, o vuelva a enviar un nuevo código."
+
+msgid "IdentityVerification|Verification code"
+msgstr "IdentityVerification|Código de verificación"
+
+msgid "IdentityVerification|Verification successful"
+msgstr "IdentityVerification|Verificación correcta"
+
+msgid "IdentityVerification|Verify code"
+msgstr "IdentityVerification|Verificar código"
+
msgid "IdentityVerification|Verify your identity"
msgstr "Verifique su identidad"
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr "Ha alcanzado la cantidad máxima de intentos. Espere %{interval} o reenvíe un nuevo código e inténtelo de nuevo."
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr "Su cuenta ha sido verificada correctamente. Será redirigido a su cuenta en un momento o %{redirect_url_start}haga clic aquí%{redirect_url_end} para actualizar."
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr "Suu código de verificación caduca después de %{expires_in_minutes} minutos."
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr "Detalles de la alerta"
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr "¿Está seguro que desea eliminar esta imagen?"
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr "Se ha producido un error al crear el evento de la linea de tiempo del incidente: %{error}"
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr "Métricas"
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr "Guardar y añadir otro evento"
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Resumen"
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Incluir el nombre del autor en el cuerpo del correo electrónico de notificación"
@@ -20420,9 +20799,6 @@ msgstr "Insertar"
msgid "Insert a %{rows}x%{cols} table."
msgstr "Inserte una tabla de %{rows}x%{cols}"
-msgid "Insert a code block"
-msgstr "Insertar un bloque de código"
-
msgid "Insert a quote"
msgstr "Insertar una cita"
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,11 +20954,14 @@ msgstr "Detalles del comentario:"
msgid "Integrations|Comment settings:"
msgstr "Configuración de los comentarios:"
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
-msgstr "Error de conexión. Por favor, compruebe su configuración."
+msgid "Integrations|Connection failed. Check your integration settings."
+msgstr ""
msgid "Integrations|Connection successful."
msgstr "Conexión exitosa."
@@ -20671,6 +21053,9 @@ msgstr "No hay espacios de nombres disponibles."
msgid "Integrations|No linked namespaces"
msgstr "No hay espacios de nombres vinculados"
+msgid "Integrations|Notification settings"
+msgstr "Configuración de las notificaciones"
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr "Disparador"
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr "Inválido"
+
msgid "Invalid Insights config file detected"
msgstr "Archivo de configuración de Insights no válido detectado"
@@ -20824,15 +21218,6 @@ msgstr "URL no válida"
msgid "Invalid URL: %{url}"
msgstr "URL no válida: %{url}"
-msgid "Invalid container_name"
-msgstr "Nombre del contenedor no válido"
-
-msgid "Invalid cursor parameter"
-msgstr "Parámetro de cursor no válido"
-
-msgid "Invalid cursor value provided"
-msgstr "Valor de cursor no válido proporcionado"
-
msgid "Invalid date"
msgstr "Fecha no válida"
@@ -20875,9 +21260,6 @@ msgstr "Período no válido"
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr "Pod_name no válido"
-
msgid "Invalid policy type"
msgstr "Tipo de política no válido"
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr "Ruta del repositorio no válida"
-msgid "Invalid search parameter"
-msgstr "Parámetro de búsqueda no válido"
+msgid "Invalid rule"
+msgstr "Regla inválida"
msgid "Invalid server response"
msgstr "Respuesta del servidor no válida"
-msgid "Invalid start or end time format"
-msgstr "Formato de hora inicial o final no válido"
-
msgid "Invalid status"
msgstr "Estado no válido"
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr "Los miembros se han añadido correctamente"
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Buscar un grupo para invitar"
@@ -21046,6 +21428,11 @@ msgstr "Seleccione miembros o escriba las direcciones de correo electrónico"
msgid "InviteMembersModal|Something went wrong"
msgstr "Algo salió mal"
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr "Invitado"
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr "URL de la nueva incidencia"
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr "URL de Jaeger"
-
msgid "Jan"
msgstr "Ene"
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr "Se ha eliminado el trabajo"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "Mantener"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr "No se encontraron resultados de búsqueda"
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr "Desplazar hacia abajo"
msgid "Job|Scroll to top"
msgstr "Desplazar hacia arriba"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr "Mostrar trabajo completo en crudo"
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr "No se ha encontrado este elemento."
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22148,7 +22556,7 @@ msgid "Job|triggered"
msgstr "activado"
msgid "Join GitLab today! You and your team can plan, build, and ship secure code all in one application. Get started here for free!"
-msgstr ""
+msgstr "¡Únase a GitLab hoy! Usted y su equipo pueden planificar, construir y enviar código seguro desde una sola aplicación. ¡Empiece aquí gratuitamente!"
msgid "Join Zoom meeting"
msgstr "Unirse a la reunión de Zoom"
@@ -22252,9 +22660,6 @@ msgstr "Kroki"
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr "El API de Kubernetes devolvió el código de estado: %{error_code}"
-
msgid "Kubernetes Cluster"
msgstr "Clúster de Kubernetes"
@@ -22330,6 +22735,11 @@ msgstr "Etiqueta"
msgid "Label actions dropdown"
msgstr "Desplegable de acciones de las etiquetaa"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] "Etiqueta añadida: %{labels}"
+msgstr[1] "Etiquetas añadidas: %{labels}"
+
msgid "Label priority"
msgstr "Prioridad de etiqueta"
@@ -22554,9 +22964,6 @@ msgstr "Aprenda GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr "Obtener mas información"
@@ -22572,9 +22979,6 @@ msgstr "Aprenda como %{no_packages_link_start}publicar y compartir sus paquetes%
msgid "Learn more"
msgstr "Conozca más"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,21 +23039,21 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
-msgstr ""
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
+msgstr "Analice su aplicación en busca de vulnerabilidades con DAST"
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
+msgid "LearnGitLab|Create a repository"
+msgstr "Crear un repositorio"
+
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
msgid "LearnGitLab|Create an issue"
msgstr "Crear una incidencia"
-msgid "LearnGitLab|Create or import a repository"
-msgstr "Crear o importar un repositorio"
-
msgid "LearnGitLab|Create or import your first repository into your new project."
msgstr ""
@@ -22692,23 +23096,26 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr "Analizar dependencias en busca de licencias"
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr "Analizar dependencias en busca de vulnerabilidades"
+
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
-msgstr ""
-
-msgid "LearnGitLab|Set-up CI/CD"
-msgstr ""
+msgid "LearnGitLab|Set up your first project's CI/CD"
+msgstr "Configure el sistema de CI/CD de su primer proyecto"
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
-msgstr ""
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
+msgstr "Comience una prueba gratuita de GitLab Ultimate"
msgid "LearnGitLab|Submit a merge request (MR)"
msgstr ""
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr "- Incluido en la versión de prueba"
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr "Logs"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr "Para ver los registros, despliegue su código en un entorno."
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,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 ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr "Administrar accesos"
-msgid "Manage all notifications"
-msgstr "Administrar todas las notificaciones"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "Administre aplicaciones que puedan utilizar GitLab como proveedor OAuth, y aplicaciones que haya autorizado para utilizar su cuenta."
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr "Marcado este %{noun} como listo."
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr "Esta incidencia esta marcada como un duplicado de %{duplicate_param}."
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr "Marca este %{noun} como listo."
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr "Marca esta incidencia como un duplicada de %{duplicate_reference}."
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr "Se ha producido un error al cargar el diff completo. Por favor, inténta
msgid "MergeRequest|No files found"
msgstr "No se encontraron archivos"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr "Diagrama de Mermaid"
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr "Nombre"
msgid "Metrics|View documentation"
msgstr "Ver la documentación"
-msgid "Metrics|View logs"
-msgstr "Ver registros"
-
msgid "Metrics|Y-axis label"
msgstr "Etiqueta del eje Y"
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr "MrSurvey|¡Gracias por sus comentarios!"
+
msgid "Multi-project"
msgstr "Multi-proyecto"
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr "Se encontraron varios tipos de modelo: %{model_types}"
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr "Mi reacción"
+msgid "NEW"
+msgstr "NUEVO"
+
msgid "Name"
msgstr "Nombre"
@@ -25106,9 +25531,6 @@ msgstr "Espacio de nombres"
msgid "Namespace ID:"
msgstr "ID del namespace :"
-msgid "Namespace is empty"
-msgstr "Espacio de nombres está vacía"
-
msgid "Namespace:"
msgstr "Espacio de nombres:"
@@ -25195,24 +25617,24 @@ msgstr "Barra de navegación"
msgid "NavigationTheme|Blue"
msgstr "Azul"
-msgid "NavigationTheme|Dark"
-msgstr "Oscuro"
-
msgid "NavigationTheme|Dark Mode (alpha)"
msgstr "Modo oscuro (alfa)"
+msgid "NavigationTheme|Gray"
+msgstr "NavigationTheme|Gris"
+
msgid "NavigationTheme|Green"
msgstr "Verde"
msgid "NavigationTheme|Indigo"
msgstr "Ãndigo"
-msgid "NavigationTheme|Light"
-msgstr "Claro"
-
msgid "NavigationTheme|Light Blue"
msgstr "Azul claro"
+msgid "NavigationTheme|Light Gray"
+msgstr "NavigationTheme|Gris claro"
+
msgid "NavigationTheme|Light Green"
msgstr "Verde claro"
@@ -25365,18 +25787,15 @@ msgstr "Nueva tarea épica"
msgid "New epic title"
msgstr "Nuevo título de la tarea épica"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Nuevo archivo"
msgid "New group"
msgstr "Nuevo grupo"
-msgid "New group URL"
-msgstr "Nueva URL de grupo"
-
-msgid "New group name"
-msgstr "Nuevo nombre de grupo"
-
msgid "New health check access token has been generated!"
msgstr "¡Se ha generado un nuevo token de acceso para la verificación de estado!"
@@ -25470,9 +25889,6 @@ msgstr "Nuevos usuarios configurados como externos"
msgid "New! Suggest changes directly"
msgstr "¡Nuevo! Sugerir cambios directamente"
-msgid "New..."
-msgstr "Nuevo..."
-
msgid "Newest first"
msgstr "La más reciente primero"
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr "Sin alcances"
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr "No se ha encontrado ningún usuario administrador activo"
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr "No se han encontrado ramas"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Sin cambios"
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "¡No ha sido posible realizar la conexión con un servidor de Gitaly, por favor compruebe sus logs!"
-msgid "No containers available"
-msgstr "No hay contenedores disponibles"
-
msgid "No contributions"
msgstr "Sin contribuciones"
@@ -25674,6 +26093,9 @@ msgstr "Sin licencia. Todos los derechos reservados"
msgid "No matches found"
msgstr "No hay coincidencias"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr "Ningún grupo padre"
msgid "No plan"
msgstr "Sin plan"
-msgid "No pods available"
-msgstr "No hay pods disponibles"
-
msgid "No policy matches this license"
msgstr "Ninguna política coincide con esta licencia"
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "No hay repositorio"
+msgid "No results"
+msgstr "No hay resultados"
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr "¿Está seguro de que desea cancelar la creación de este comentario?"
msgid "Notes|Collapse replies"
msgstr "Contraer respuestas"
+msgid "Notes|Expand replies"
+msgstr "Notes|Expandir respuestas"
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr "Notes|Última respuesta por %{name}"
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr "Notificaciones desactivadas"
msgid "Notifications on"
msgstr "Notificaciones activadas"
+msgid "Notifications turned off."
+msgstr "Notificaciones desactivadas."
+
+msgid "Notifications turned on."
+msgstr "Notificaciones activadas."
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr "%{commit_link} en %{mr_link}"
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr "Más información sobre Auto DevOps"
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] "Un elemento más"
msgstr[1] "%d elementos más"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,36 +27110,39 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
-msgstr ""
+msgid "Only HTTP(S)"
+msgstr "Solo HTTP(S)"
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr "Sólo miembros del proyecto"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
+msgstr "Solo SSH"
+
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
-msgid "Only admins can delete project"
-msgstr "Solo los administradores pueden borrar un proyecto"
-
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr "Sólo la política:"
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr "OperationsDashboard|Tablero de operaciones"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "OperationsDashboard|El tablero de operaciones proporciona un resumen del estado operativo de cada proyecto, incluidos los estados de los pipelines y de las alertas."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimice su flujo de trabajo con los pipelines de CI/CD"
@@ -26796,6 +27284,9 @@ msgstr "Opciones"
msgid "Or you can choose one of the suggested colors below"
msgstr "O puede seleccionar alguno de los colores sugeridos a continuación"
+msgid "Ordered list"
+msgstr "Lista ordenada"
+
msgid "Organizations"
msgstr "Organización"
@@ -26886,6 +27377,9 @@ msgstr "Propiedad de:"
msgid "Owner"
msgstr "Propietario"
+msgid "Owners and administrators"
+msgstr "Propietarios y administradores"
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr "El tipo de paquete debe ser PyPi"
msgid "Package type must be RubyGems"
msgstr "El tipo de paquete debe ser RubyGems"
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr "%{boldStart}Permitir duplicados%{boldEnd} - Acepta paquetes con el mismo nombre y versión."
-
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
-msgstr "%{boldStart}No permitir duplicados%{boldEnd} - Rechaza paquetes con el mismo nombre y versión."
-
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr "%{name} versión %{version} creada por primera vez %{datetime}"
@@ -26994,8 +27482,11 @@ msgstr "Añadir fuente de NuGet"
msgid "PackageRegistry|Add composer registry"
msgstr "Añadir registro de Composer"
-msgid "PackageRegistry|Allow duplicates"
-msgstr "Permitir duplicados"
+msgid "PackageRegistry|Additional metadata"
+msgstr "PackageRegistry|Metadatos adicionales"
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
+msgstr ""
msgid "PackageRegistry|App group: %{group}"
msgstr "Grupo de aplicaciones: %{group}"
@@ -27100,7 +27591,10 @@ msgid "PackageRegistry|Delete package"
msgstr "Eliminar paquete"
msgid "PackageRegistry|Delete this package"
-msgstr ""
+msgstr "Eliminar este paquete"
+
+msgid "PackageRegistry|Duplicate packages"
+msgstr "PackageRegistry|Paquetes duplicados"
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr "Receta: %{recipe}"
msgid "PackageRegistry|Registry setup"
msgstr "Configuración del registro"
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr "Eliminar paquete"
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ msgstr "No se ha podido obtener la información de la versión del paquete."
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 "Utilice GitLab como un registro privado para formatos de paquetes comunes. %{linkStart}Más información.%{linkEnd}"
-
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
msgstr "Está a punto de eliminar %{filename}. Esta es una acción destructiva que puede hacer que su paquete sea inutilizable. ¿Está seguro?"
@@ -27392,18 +27889,12 @@ msgstr "El parámetro \"job_id\" no puede exceder la longitud de %{job_id_max_si
msgid "Parent"
msgstr "Padre"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr "La tarea épica principal no existe."
msgid "Parent epic is not present."
msgstr "La tarea épica principal no está presente."
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27492,7 +27983,7 @@ msgid "Paste issue link"
msgstr "Pegar el enlace de la incidencia"
msgid "Paste link"
-msgstr ""
+msgstr "Pegar enlace"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr "Validar pipeline"
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr "Validar pipeline bajo unas condiciones seleccionadas"
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr "Validar pipeline bajo unas condiciones simuladas"
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr "Validar"
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr "URL de PlantUML"
+msgid "PlantUML diagram"
+msgstr "Diagrama de PlantUML"
+
msgid "Play"
msgstr "Ejecutar"
@@ -28658,12 +29182,6 @@ msgstr "Por favor espere mientras nos conectamos a su repositorio."
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Por favor espere mientras importamos el repositorio por usted."
-msgid "Pod does not exist"
-msgstr "El Pod no existe"
-
-msgid "Pod not found"
-msgstr "Pod no encontrado"
-
msgid "Pods in use"
msgstr "Pods en uso"
@@ -28739,14 +29257,17 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr "Tema de color"
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "Personalice la apariencia del encabezado de la aplicación y la barra de navegación lateral."
+msgid "Preferences|Customize the color of GitLab."
+msgstr "Personalizar el color de GitLab."
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr ""
@@ -28787,9 +29308,6 @@ msgstr "Ancho de diseño"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr "Tema de navegación"
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr "Previo"
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr "Vista previa de Markdown"
msgid "Preview changes"
msgstr "Vista previa de los cambios"
+msgid "Preview diagram"
+msgstr "Vista previa del Diagrama"
+
msgid "Preview payload"
msgstr "Vista previa del payload"
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "Cuenta programada para su eliminación."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Active el inicio de sesión con uno de los siguientes servicios"
-
msgid "Profiles|Active"
msgstr "Activo"
@@ -29054,8 +29569,8 @@ msgstr "Añadir emoji de estado"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
-msgstr ""
+msgid "Profiles|An indicator appears next to your name and avatar."
+msgstr "Se muestra un indicador junto a su nombre y su avatar."
msgid "Profiles|Avatar cropper"
msgstr "Redimensionador de avatar"
@@ -29081,8 +29596,8 @@ msgstr "Cambiar su nombre de usuario puede tener efectos secundarios no deseados
msgid "Profiles|Choose file..."
msgstr "Seleccionar un archivo..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "Seleccione mostrar las contribuciones de los proyectos privados en su perfil público sin ningún tipo de información de proyecto, repositorio u organización"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr ""
msgid "Profiles|City, country"
msgstr "Ciudad, país"
@@ -29096,6 +29611,9 @@ msgstr "Dirección de correo electrónico para los commits"
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "Cuentas conectadas"
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr "No mostrar en el perfil"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr "Editar perfil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-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 name, so people you know can recognize you."
+msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,8 +29692,8 @@ msgstr "Incluir las contribuciones privadas en mi perfil"
msgid "Profiles|Incoming email token was successfully reset"
msgstr "El token de correo electrónico entrante se ha restablecido correctamente"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "Aumente la seguridad de su cuenta al habilitar la autenticación de dos factores (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
msgid "Profiles|Invalid password"
msgstr "Contraseña no válida"
@@ -29261,14 +29779,14 @@ msgstr "Eliminar avatar"
msgid "Profiles|Select a service to sign in with."
msgstr ""
+msgid "Profiles|Service sign-in"
+msgstr ""
+
msgid "Profiles|Set new profile picture"
msgstr "Establecer una nueva imagen de perfil"
-msgid "Profiles|Set your local time zone"
-msgstr ""
-
-msgid "Profiles|Social sign-in"
-msgstr "Inicio de sesión social"
+msgid "Profiles|Set your local time zone."
+msgstr "Establezca su zona horaria local."
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "Algunas opciones no están disponibles para cuentas LDAP"
@@ -29276,8 +29794,8 @@ msgstr "Algunas opciones no están disponibles para cuentas LDAP"
msgid "Profiles|Static object token was successfully reset"
msgstr "Se ha restablecido correctamente el token de objeto estático"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "Cuéntenos más sobre usted en menos de 250 caracteres"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr "Cuéntanos algo sobre ti en menos de 250 caracteres."
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
@@ -29285,17 +29803,17 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "El tamaño máximo de archivo permitido es 200KB."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "Esta dirección de correo electrónico se mostrará en su perfil público"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "Este correo electrónico se utilizará para operaciones basadas en web, como ediciones y merges. %{commit_email_link_start}Obtenga más información%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Este emoji y el mensaje se mostrarán en su perfil y en toda la interfaz."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Esta información aparecerá en tu perfil"
+msgid "Profiles|This information will appear on your profile."
+msgstr "Esta información aparecerá en su perfil."
msgid "Profiles|Time settings"
msgstr "Ajustes de tiempo"
@@ -29303,7 +29821,7 @@ msgstr "Ajustes de tiempo"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr "Autenticación de dos factores"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,8 +29857,8 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "¿Cuál es su estado?"
-msgid "Profiles|Who you represent or work for"
-msgstr "A quién representa o para quién trabaja"
+msgid "Profiles|Who you represent or work for."
+msgstr "A quién representa o para quien trabaja."
msgid "Profiles|You can change your avatar here"
msgstr "Puedes cambiar su avatar aquí"
@@ -29381,6 +29899,9 @@ msgstr "Su ubicación se ha establecido automáticamente basándose en su cuenta
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "Su nombre se configuró automáticamente en función de su cuenta %{provider_label}, de modo que las personas que conozca lo reconozcan"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "Su estado"
@@ -29459,7 +29980,7 @@ msgstr "Plantillas de proyecto"
msgid "Project URL"
msgstr "URL del proyecto"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr "Mantenedores"
msgid "ProjectCreationLevel|No one"
msgstr "Nadie"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nombre"
@@ -29693,6 +30217,9 @@ msgstr "Buscar proyectos"
msgid "ProjectSelect|Select a project"
msgstr "Seleccione un proyecto"
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr "Introducir una nueva contraseña."
msgid "ProjectService|Enter new token"
msgstr "Introducir un nuevo token"
-msgid "ProjectService|Issue URL"
-msgstr "URL de la incidencia"
-
msgid "ProjectService|Jenkins server URL"
msgstr "URL del servidor Jenkins"
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr "Proyectos a los que ha contribuido"
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr "Los proyectos en este grupo pueden utilizar Git LFS"
+
msgid "Projects shared with %{group_name}"
msgstr "Proyectos compartidos con %{group_name}"
@@ -30377,7 +30907,7 @@ msgstr "Contacte con un administrador para habilitar opciones importantes para s
msgid "ProjectsNew|Create"
msgstr "Crear"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,8 +30967,8 @@ msgstr "Ejecutar CI/CD para un repositorio externo"
msgid "ProjectsNew|Visibility Level"
msgstr "Nivel de visibilidad"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "¿Desea alojar varios proyectos independientes bajo el mismo espacio de nombres? %{link_start}Crear un grupo%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
msgid "PrometheusAlerts|exceeded"
msgstr ""
@@ -30596,6 +31126,9 @@ msgstr "Comprar EE"
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr "Comprar GitLab Enterprise Edition"
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30882,7 +31418,7 @@ msgid "ProtectedEnvironment|Select an environment"
msgstr "Seleccione un entorno"
msgid "ProtectedEnvironment|Select groups"
-msgstr ""
+msgstr "Seleccionar grupos"
msgid "ProtectedEnvironment|Select users"
msgstr "Seleccionar usuarios"
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr "Proporcionar comentarios"
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr "Rebase"
+msgid "Rebase completed"
+msgstr "Reiniciar completado"
+
msgid "Rebase in progress"
msgstr "Rebase en progreso"
@@ -31328,9 +31870,6 @@ 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 "Actualizar"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31469,7 +32008,7 @@ msgid "Related feature flags"
msgstr ""
msgid "Related incidents or issues"
-msgstr ""
+msgstr "Incidentes o problemas relacionados"
msgid "Related issues"
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr "Fecha de lanzamiento"
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31591,7 +32133,7 @@ msgid "Remove Zoom meeting"
msgstr "Eliminar la reunión de Zoom"
msgid "Remove Zoom meeting."
-msgstr ""
+msgstr "Eliminar reunión de Zoom."
msgid "Remove access"
msgstr ""
@@ -31849,7 +32391,7 @@ msgid "Render diagrams in your documents using PlantUML."
msgstr ""
msgid "Renew subscription"
-msgstr ""
+msgstr "Renovar la suscripción"
msgid "Renews"
msgstr ""
@@ -31861,7 +32403,7 @@ msgid "Reopen %{issueType}"
msgstr "Reabrir %{issueType}"
msgid "Reopen %{noteable}"
-msgstr ""
+msgstr "Volver a abrir %{noteable}"
msgid "Reopen epic"
msgstr "Reabrir la tarea épica"
@@ -31884,11 +32426,8 @@ msgstr "Reabrir este %{quick_action_target}."
msgid "Replace"
msgstr "Reemplazar"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
-msgstr ""
+msgstr "Reemplazar %{name}"
msgid "Replace all label(s)"
msgstr "Reemplazar todas las etiquetas"
@@ -31914,6 +32453,9 @@ msgstr "Reemplaza la raíz de la URL de clonado."
msgid "Replication"
msgstr "Replicación"
+msgid "Reply"
+msgstr "Responder"
+
msgid "Reply by email"
msgstr "Responder por correo electrónico"
@@ -31942,7 +32484,7 @@ msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Report your license usage data to GitLab"
-msgstr ""
+msgstr "Informe de los datos de uso de su licencia a GitLab"
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Denunciado %{timeAgo} por %{reportedBy}"
@@ -31951,7 +32493,7 @@ msgid "Reported by"
msgstr ""
msgid "Reported by %{reporter}"
-msgstr ""
+msgstr "Reportado por %{reporter}"
msgid "Reporting"
msgstr "Informes"
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr "Nombre de la clase"
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr "Tiempo de ejecución"
@@ -32298,13 +32846,13 @@ msgid "Request data is too large"
msgstr ""
msgid "Request details"
-msgstr ""
+msgstr "Solicitar detalles"
msgid "Request parameter %{param} is missing."
msgstr ""
msgid "Request review from"
-msgstr ""
+msgstr "Solicitar revisión de"
msgid "Request time"
msgstr ""
@@ -32331,7 +32879,7 @@ msgid "Requested design version does not exist."
msgstr ""
msgid "Requested review"
-msgstr ""
+msgstr "Revisión solicitada"
msgid "Requested review. Your attention request was removed."
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32413,7 +32958,7 @@ msgid "Resend"
msgstr "Volver a enviar"
msgid "Resend Request"
-msgstr ""
+msgstr "Reenviar solicitud"
msgid "Resend confirmation email"
msgstr "Reenviar correo electrónico de confirmación"
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "Restablecer el token de acceso de verificación de estado"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr "Restablecer contraseña"
@@ -32458,7 +33003,7 @@ msgid "Resolve"
msgstr "Resolver"
msgid "Resolve conflicts"
-msgstr ""
+msgstr "Resolver conflictos"
msgid "Resolve conflicts on source branch"
msgstr "Resolver conflictos en la rama origen"
@@ -32509,7 +33054,7 @@ msgid "Response metrics (NGINX)"
msgstr "Respuesta métricas (NGINX)"
msgid "Response text"
-msgstr ""
+msgstr "Texto de respuesta"
msgid "Restart GitLab to apply changes."
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr "Restringir acceso por dirección IP"
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32560,20 +33108,14 @@ msgid "Retry downstream pipeline"
msgstr ""
msgid "Retry failed jobs"
-msgstr ""
+msgstr "Reintentar trabajos fallidos"
msgid "Retry job"
-msgstr ""
+msgstr "Reintentar trabajo"
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Reintentar este trabajo"
@@ -32636,7 +33178,7 @@ msgstr[0] "Revisor"
msgstr[1] "%d Revisores"
msgid "Reviewer(s)"
-msgstr ""
+msgstr "Revisor(es)"
msgid "Reviewers"
msgstr ""
@@ -32729,7 +33271,7 @@ msgid "Runner"
msgstr ""
msgid "Runner API"
-msgstr ""
+msgstr "API del ejecutor"
msgid "Runner tokens"
msgstr "Token del ejecutor"
@@ -32766,7 +33308,7 @@ msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spa
msgstr ""
msgid "Runners|A new version is available"
-msgstr ""
+msgstr "Hay una nueva versión disponible"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
msgstr ""
@@ -32870,7 +33412,7 @@ msgid "Runners|Download latest binary"
msgstr ""
msgid "Runners|Edit your search and try again"
-msgstr ""
+msgstr "Runners|Edite su búsqueda e inténtelo de nuevo"
msgid "Runners|Enable stale runner cleanup"
msgstr ""
@@ -32885,11 +33427,14 @@ msgid "Runners|Executor"
msgstr ""
msgid "Runners|Get started with runners"
-msgstr ""
+msgstr "Runners|Empezar con los ejecutores"
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr "¿Cómo actualizamos el ejecutor de GitLab?"
+
msgid "Runners|IP Address"
msgstr ""
@@ -32936,7 +33481,7 @@ msgid "Runners|New registration token generated!"
msgstr ""
msgid "Runners|No results found"
-msgstr ""
+msgstr "Runners|No se encontraron resultados"
msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
@@ -33001,7 +33546,7 @@ msgid "Runners|Register an instance runner"
msgstr ""
msgid "Runners|Registration token"
-msgstr ""
+msgstr "Token de registro"
msgid "Runners|Registration token copied!"
msgstr ""
@@ -33015,14 +33560,11 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
msgid "Runners|Runner #%{runner_id}"
-msgstr ""
+msgstr "Ejecutor #%{runner_id}"
msgid "Runners|Runner %{name} was deleted"
msgstr ""
@@ -33150,7 +33692,7 @@ msgid "Runners|This runner is available to all projects and subgroups in a group
msgstr ""
msgid "Runners|This runner is outdated, an upgrade is recommended"
-msgstr ""
+msgstr "Este ejecutor está desactualizado. Se recomienda actualizarlo"
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr "Runners|Actualización disponible"
+
+msgid "Runners|Upgrade recommended"
+msgstr "Runners|Actualización recomendada"
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33222,10 +33773,10 @@ msgid "Runners|stale"
msgstr ""
msgid "Runners|upgrade available"
-msgstr ""
+msgstr "Runners|actualización disponible"
msgid "Runners|upgrade recommended"
-msgstr ""
+msgstr "Runners|actualización recomendada"
msgid "Running"
msgstr "En ejecución"
@@ -33248,6 +33799,21 @@ msgstr "Tokens de descubrimiento SAML"
msgid "SAML for %{group_name}"
msgstr "SAML para %{group_name}"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33327,7 +33893,7 @@ msgid "Save deploy freeze"
msgstr ""
msgid "Save internal note"
-msgstr ""
+msgstr "Guardar nota interna"
msgid "Save password"
msgstr "Guardar la contraseña"
@@ -33519,7 +34085,7 @@ msgid "Search milestones"
msgstr "Buscar hitos"
msgid "Search or create tag"
-msgstr ""
+msgstr "Buscar o crear etiqueta"
msgid "Search or filter results..."
msgstr "Buscar o filtrar resultados..."
@@ -33838,7 +34404,7 @@ msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST
msgstr ""
msgid "SecurityConfiguration|Not enabled"
-msgstr ""
+msgstr "No habilitado"
msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
msgstr ""
@@ -33898,7 +34464,10 @@ msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request
msgstr ""
msgid "SecurityOrchestration|+%{count} more"
-msgstr ""
+msgstr "+%{count} más"
+
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ", y %{count} más"
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,8 +34484,8 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
-msgstr ""
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
+msgstr "SecurityOrchestration|Después de habilitar una política a nivel de grupo, esta política se aplica automáticamente a todos los proyectos y subgrupos de este grupo."
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -33960,11 +34529,14 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
-msgstr ""
+msgstr "Editar política"
msgid "SecurityOrchestration|Edit policy project"
msgstr "Editar la política del proyecto"
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr "Forzar la seguridad para este proyecto. %{linkStart}Más información%{linkEnd}"
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr "Se ha producido un error al cargar los agentes del clúster."
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34153,19 +34728,19 @@ msgid "SecurityOrchestration|This group"
msgstr ""
msgid "SecurityOrchestration|This is a group-level policy"
-msgstr ""
+msgstr "Esta es una política a nivel de grupo"
msgid "SecurityOrchestration|This is a project-level policy"
-msgstr ""
+msgstr "Esta es una política a nivel de proyecto"
msgid "SecurityOrchestration|This policy is inherited from %{namespace}"
-msgstr ""
+msgstr "Esta política se hereda desde %{namespace}"
msgid "SecurityOrchestration|This policy is inherited from the %{linkStart}namespace%{linkEnd} and must be edited there"
msgstr ""
msgid "SecurityOrchestration|This project"
-msgstr ""
+msgstr "Este proyecto"
msgid "SecurityOrchestration|This project does not contain any security policies."
msgstr ""
@@ -34174,7 +34749,7 @@ msgid "SecurityOrchestration|This view only shows scan results for the agent %{a
msgstr ""
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
-msgstr ""
+msgstr "Para ampliar su búsqueda, cambie los filtros anteriores o seleccione un proyecto de política de seguridad diferente."
msgid "SecurityOrchestration|Unlink project"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr "Clúster"
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Comentario añadido a '%{vulnerabilityName}'"
@@ -34381,7 +34944,7 @@ msgid "SecurityReports|No longer detected"
msgstr ""
msgid "SecurityReports|No vulnerabilities found"
-msgstr ""
+msgstr "No se encontraron vulnerabilidades"
msgid "SecurityReports|No vulnerabilities found for this pipeline"
msgstr "No se encontraron vulnerabilidades para este pipeline"
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr "No se puede añadir %{invalidProjects}"
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34579,7 +35139,13 @@ msgid "Select Profile"
msgstr ""
msgid "Select a branch"
-msgstr ""
+msgstr "Seleccione una rama"
+
+msgid "Select a branch to compare"
+msgstr "Seleccione una rama para comparar"
+
+msgid "Select a color"
+msgstr "Seleccione un color"
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34630,7 +35196,7 @@ msgid "Select an iteration"
msgstr ""
msgid "Select assignee"
-msgstr ""
+msgstr "Seleccionar asignado"
msgid "Select assignee(s)"
msgstr ""
@@ -34645,7 +35211,7 @@ msgid "Select due date"
msgstr ""
msgid "Select epic"
-msgstr ""
+msgstr "Seleccionar épica"
msgid "Select group"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr "Seleccione la rama de origen"
+msgid "Select source project"
+msgstr "Seleccionar proyecto de origen"
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr "Selecciona una rama de destino"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr "Seleccionar proyecto de destino"
+
msgid "Select timezone"
msgstr ""
@@ -34738,7 +35310,7 @@ msgid "Selected levels cannot be used by non-admin users for groups, projects or
msgstr "Los niveles seleccionados no pueden ser utilizados por usuarios que no tengan permisos de admnistración para grupos, proyectos o fragmentos de código. Si el nivel público está restringido, los perfiles de usuario solo son visibles para los usuarios registrados."
msgid "Selected projects"
-msgstr ""
+msgstr "Seleccionar proyectos"
msgid "Selected tag is already in use. Choose another option."
msgstr ""
@@ -34828,7 +35400,7 @@ msgid "Send service data"
msgstr ""
msgid "Sentry"
-msgstr ""
+msgstr "Sentry"
msgid "Sentry API URL"
msgstr "URL de la API de Sentry"
@@ -34882,7 +35454,7 @@ msgid "Service account generated successfully"
msgstr ""
msgid "Service accounts"
-msgstr ""
+msgstr "Cuentas de servicio"
msgid "Service usage data"
msgstr ""
@@ -34947,14 +35519,11 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "Establecer y restringir los niveles de visibilidad por defecto. Configure origenes para la importación y el protocolo de acceso de Git."
-
msgid "Set due date"
msgstr "Establecer fecha de finalización"
msgid "Set health status"
-msgstr ""
+msgstr "Establecer el estado de salud"
msgid "Set health status to %{health_status}."
msgstr ""
@@ -34993,7 +35562,7 @@ msgid "Set severity"
msgstr ""
msgid "Set sign-in restrictions for all users."
-msgstr ""
+msgstr "Establecer restricciones de inicio de sesión para todos los usuarios."
msgid "Set size limits for displaying diffs in the browser."
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr "Establecer la rama de destino a"
msgid "Set target branch to %{branch_name}."
msgstr "Establecer la rama de destino a %{branch_name}."
+msgid "Set the Ready status"
+msgstr "Establecer el estado a Preparado"
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35020,7 +35592,7 @@ msgid "Set the maximum number of slices allowed to run concurrently during Elast
msgstr ""
msgid "Set the maximum session time for a web terminal."
-msgstr ""
+msgstr "Establecer el tiempo máximo de sesión para un terminal web."
msgid "Set the milestone to %{milestone_reference}."
msgstr "Establecer el hito a %{milestone_reference}."
@@ -35041,7 +35613,7 @@ msgid "Set time estimate to %{time_estimate}."
msgstr "Establecer el tiempo estimado a %{time_estimate}."
msgid "Set to 0 for no size limit."
-msgstr ""
+msgstr "Establézcalo a 0 para deshabilitar la limitación de tamaño."
msgid "Set up CI/CD"
msgstr "Configurar CI/CD"
@@ -35050,7 +35622,7 @@ msgid "Set up Jira Integration"
msgstr "Configurar la integración con Jira"
msgid "Set up a %{type} runner for a project"
-msgstr ""
+msgstr "Configurar un %{type} ejecutor para un proyecto"
msgid "Set up a hardware device as a second factor to sign in."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr "Establecer una nueva contraseña"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Configure su proyecto para hacer push o pull de los cambios de manera automática a/desde otro repositorio. Los branchs, los tags y los commits se sincronizarán automáticamente."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr "Establecer el peso"
@@ -35107,7 +35682,7 @@ msgid "SetStatusModal|What's your status?"
msgstr "¿Cuál es su estado?"
msgid "SetStatusModal|Your status resets on %{date}."
-msgstr ""
+msgstr "Tu estado se restablece en %{date}."
msgid "Sets %{epic_ref} as parent epic."
msgstr "Establecer %{epic_ref} cómo tarea épica principal."
@@ -35160,16 +35735,16 @@ msgid "Severity"
msgstr ""
msgid "Severity updated to %{severity}."
-msgstr ""
+msgstr "Gravedad actualizada a %{severity}."
msgid "SeverityWidget|Severity"
-msgstr ""
+msgstr "Gravedad"
msgid "SeverityWidget|Severity: %{severity}"
msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
-msgstr ""
+msgstr "Se ha producido un error al actualizar la gravedad."
msgid "Share"
msgstr "Compartir"
@@ -35184,7 +35759,7 @@ msgid "Shared projects"
msgstr "Proyectos compartidos"
msgid "Shared runners"
-msgstr ""
+msgstr "Ejecturores compartidos"
msgid "Shared runners are disabled for the parent group"
msgstr ""
@@ -35217,10 +35792,10 @@ msgid "Shimo|Link to a Shimo Workspace from the sidebar."
msgstr ""
msgid "Shimo|Shimo"
-msgstr ""
+msgstr "Shimo"
msgid "Shimo|Shimo Workspace"
-msgstr ""
+msgstr "Espacio de trabajo de Shimo"
msgid "Shimo|Shimo Workspace URL"
msgstr ""
@@ -35235,13 +35810,13 @@ msgid "Should you ever lose your phone or access to your one time password secre
msgstr ""
msgid "Show Pipeline ID"
-msgstr ""
+msgstr "Mostrar ID del pipeline"
msgid "Show Pipeline IID"
msgstr ""
msgid "Show all %{issuable_type}."
-msgstr ""
+msgstr "Mostrar todos los %{issuable_type}."
msgid "Show all activity"
msgstr "Mostrar toda la actividad"
@@ -35256,7 +35831,7 @@ msgid "Show all issues."
msgstr "Mostrar todas las incidencias."
msgid "Show all milestones"
-msgstr ""
+msgstr "Mostrar todos los hitos"
msgid "Show all test cases."
msgstr ""
@@ -35292,13 +35867,13 @@ msgid "Show file browser"
msgstr "Mostrar el explorador de archivos"
msgid "Show file contents"
-msgstr ""
+msgstr "Mostrar el contenido del archivo"
msgid "Show group milestones"
-msgstr ""
+msgstr "Mostrar los hitos del grupo"
msgid "Show labels"
-msgstr ""
+msgstr "Mostrar etiquetas"
msgid "Show latest version"
msgstr "Mostrar la última versión"
@@ -35310,10 +35885,10 @@ msgid "Show one file at a time"
msgstr ""
msgid "Show open epics"
-msgstr ""
+msgstr "Mostrar las tareas épicas abiertas"
msgid "Show project milestones"
-msgstr ""
+msgstr "Mostrar los hitos del proyecto"
msgid "Show sub-group milestones"
msgstr ""
@@ -35330,22 +35905,79 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Mostrar los espacios en blanco de los cambios"
-msgid "Showing %{conflict}"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
msgstr ""
-msgid "Showing %{count} of %{total} projects"
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
msgstr ""
+msgid "ShowcaseSecurity|Container scanning"
+msgstr "Análisis de contenedores"
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr "Análisis de dependencias"
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr "Habilitar SAST"
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr "Habilitar la detección de secretos"
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr "Iniciar una prueba gratuita"
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr "Lleve su seguridad al siguiente nivel"
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr "Actualizar ahora"
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr "Gestión de vulnerabilidades"
+
+msgid "Showing %{conflict}"
+msgstr "Mostrando %{conflict}"
+
+msgid "Showing %{count} of %{total} projects"
+msgstr "Mostrando %{count} de %{total} proyectos"
+
msgid "Showing %{count} project"
msgid_plural "Showing %{count} projects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Mostrando %{count} proyecto"
+msgstr[1] "Mostrando %{count} proyectos"
msgid "Showing %{limit} of %{total_count} issues. "
msgstr "Mostrando %{limit} de %{total_count} incidencias. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
-msgstr ""
+msgstr "Mostrando %{pageSize} de %{total} %{issuableType}"
msgid "Showing all epics"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr "Mostrar todas las incidencias"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "En paralelo"
@@ -35414,7 +36046,7 @@ msgid "Sign in to \"%{group_name}\""
msgstr "Iniciar sesión en %{group_name}\""
msgid "Sign in to GitLab"
-msgstr ""
+msgstr "Iniciar sesión en GitLab"
msgid "Sign in using smart card"
msgstr "Inicie sesión mediante una tarjeta inteligente"
@@ -35456,16 +36088,16 @@ msgid "Sign-in count:"
msgstr ""
msgid "Sign-in page"
-msgstr ""
+msgstr "Página de inicio de sesión"
msgid "Sign-in restrictions"
msgstr "Restricciones de inicio de sesión"
msgid "Sign-in text"
-msgstr ""
+msgstr "Texto de inicio de sesión"
msgid "Sign-out page URL"
-msgstr ""
+msgstr "URL de la página de cierre de sesión"
msgid "Sign-up restrictions"
msgstr "Restricciones de registro"
@@ -35495,10 +36127,10 @@ msgid "Signed in"
msgstr "Sesión iniciada"
msgid "Signed in to GitLab"
-msgstr ""
+msgstr "Iniciada sesión en GitLab"
msgid "Signed in to GitLab as %{user_link}"
-msgstr ""
+msgstr "Iniciada sesión en GitLab como %{user_link}"
msgid "Signed in with %{authentication} authentication"
msgstr "Iniciado con autenticación de %{authentication}"
@@ -35513,7 +36145,7 @@ msgid "Similar issues"
msgstr "Incidencias similares"
msgid "Simulate a pipeline created for the default branch"
-msgstr ""
+msgstr "Simula un pipeline creado para la rama predeterminada"
msgid "Site profile failed to delete"
msgstr ""
@@ -35561,7 +36193,7 @@ msgid "SlackIntegration|Client ID"
msgstr ""
msgid "SlackIntegration|Client secret"
-msgstr ""
+msgstr "Secreto del cliente"
msgid "SlackIntegration|GitLab for Slack"
msgstr ""
@@ -35573,13 +36205,13 @@ msgid "SlackIntegration|Install Slack app"
msgstr ""
msgid "SlackIntegration|Project alias"
-msgstr ""
+msgstr "Alias del proyecto"
msgid "SlackIntegration|Reinstall Slack app"
-msgstr ""
+msgstr "Reinstalar la aplicación Slack"
msgid "SlackIntegration|Remove project"
-msgstr ""
+msgstr "Eliminar proyecto"
msgid "SlackIntegration|See the list of available commands in Slack after setting up this integration by entering"
msgstr ""
@@ -35594,13 +36226,13 @@ msgid "SlackIntegration|Signing secret"
msgstr ""
msgid "SlackIntegration|Team name"
-msgstr ""
+msgstr "Nombre del equipo"
msgid "SlackIntegration|This integration allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr ""
+msgstr "Esta integración permite a los usuarios realizar operaciones comunes en este proyecto mediante la introducción de comandos en Slack."
msgid "SlackIntegration|Verification token"
-msgstr ""
+msgstr "Token de verificación"
msgid "SlackIntegration|You can now close this window and go to your Slack workspace."
msgstr ""
@@ -35666,7 +36298,7 @@ msgid "Snippets|%{spammable_titlecase} was submitted to Akismet successfully."
msgstr ""
msgid "Snippets|Add another file %{num}/%{total}"
-msgstr ""
+msgstr "Añadir otro archivo %{num}/%{total}"
msgid "Snippets|Delete file"
msgstr ""
@@ -35675,7 +36307,7 @@ msgid "Snippets|Description (optional)"
msgstr "Descripción (opcional)"
msgid "Snippets|Error with Akismet. Please check the logs for more info."
-msgstr ""
+msgstr "Se ha producido un error con Akismet. Por favor, compruebe los registros para más información."
msgid "Snippets|Files"
msgstr ""
@@ -35684,7 +36316,7 @@ msgid "Snippets|Give your file a name to add code highlighting, e.g. example.rb
msgstr ""
msgid "Snippets|Optionally add a description about what your snippet does or how to use it…"
-msgstr ""
+msgstr "Opcionalmente añada una descripción sobre lo que hace su fragmento de código o cómo utilizarlo…"
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr "Snowplow"
+msgid "Solid"
+msgstr "Sólido"
+
msgid "Solution"
msgstr "Solución"
@@ -35810,7 +36445,7 @@ msgid "Something went wrong while fetching projects"
msgstr "Se ha producido un error al obtener los proyectos"
msgid "Something went wrong while fetching projects."
-msgstr ""
+msgstr "Se ha producido un error al obtener los proyectos."
msgid "Something went wrong while fetching related merge requests."
msgstr "Se ha producido un error al obtener los merge request relacionados."
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Se ha producido un erro al añadir %{project} al tablero"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr "Se ha producido un erro al añadir los proyectos al tablero"
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36092,13 +36724,13 @@ msgid "Source Branch"
msgstr ""
msgid "Source IP"
-msgstr ""
+msgstr "IP de origen"
msgid "Source branch"
msgstr ""
msgid "Source branch will be deleted."
-msgstr ""
+msgstr "Se eliminará la rama de origen."
msgid "Source branch will not be deleted."
msgstr ""
@@ -36107,7 +36739,7 @@ msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close
msgstr ""
msgid "Source code (%{fileExtension})"
-msgstr ""
+msgstr "Código fuente (%{fileExtension})"
msgid "Source is not available"
msgstr "El origen no esta disponible"
@@ -36119,7 +36751,7 @@ msgid "SourceEditor|\"el\" parameter is required for createInstance()"
msgstr ""
msgid "SourceEditor|%{name} is not registered."
-msgstr ""
+msgstr "%{name} no está registrado."
msgid "SourceEditor|Extension definition should be either a class or a function"
msgstr ""
@@ -36170,7 +36802,7 @@ msgid "SourcegraphAdmin|Sourcegraph URL"
msgstr "URL de Sourcegraph"
msgid "SourcegraphAdmin|https://sourcegraph.example.com"
-msgstr ""
+msgstr "https://sourcegraph.example.com"
msgid "SourcegraphPreferences|This feature is experimental and currently limited to certain projects."
msgstr "Esta característica es experimental y actualmente limitada a determinados proyectos."
@@ -36188,10 +36820,10 @@ msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{li
msgstr ""
msgid "Spam Check"
-msgstr ""
+msgstr "Verificar spam"
msgid "Spam Check API key"
-msgstr ""
+msgstr "Clave API de verificación de spam"
msgid "Spam Logs"
msgstr "Registros de correo no deseado"
@@ -36203,7 +36835,7 @@ msgid "Spam log successfully submitted as ham."
msgstr "Se ha enviado el registro de spam correctamente."
msgid "Specific runners"
-msgstr ""
+msgstr "Ejecutores específicos"
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "No se puede usar la URL especificada: \"%{reason}\""
@@ -36217,8 +36849,8 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
-msgstr ""
+msgid "Spent at"
+msgstr "Gastado en"
msgid "Squash commit message"
msgstr "Modificar el mensaje de commit"
@@ -36227,7 +36859,7 @@ msgid "Squash commits"
msgstr "Squash commits"
msgid "Stack trace"
-msgstr ""
+msgstr "Traza de la pila"
msgid "Stacktrace snippet"
msgstr ""
@@ -36368,7 +37000,7 @@ msgid "Starts on"
msgstr ""
msgid "Starts: %{startsAt}"
-msgstr ""
+msgstr "Comienza: %{startsAt}"
msgid "State your message to activate"
msgstr "Indique su mensaje para activar"
@@ -36389,7 +37021,7 @@ msgid "Status"
msgstr "Estado"
msgid "Status was retried."
-msgstr ""
+msgstr "Se volvió a intentar el estado."
msgid "Status:"
msgstr "Estado:"
@@ -36398,13 +37030,13 @@ msgid "Status: %{title}"
msgstr "Estado: %{title}"
msgid "StatusCheck| %{failed} failed, and %{pending} pending"
-msgstr ""
+msgstr "%{failed} fallido y %{pending} pendiente"
msgid "StatusCheck|%{failed} failed"
msgstr ""
msgid "StatusCheck|%{pending} pending"
-msgstr ""
+msgstr "%{pending} pendiente"
msgid "StatusCheck|API to check"
msgstr ""
@@ -36413,7 +37045,7 @@ msgid "StatusCheck|Add status check"
msgstr ""
msgid "StatusCheck|All passed"
-msgstr ""
+msgstr "Todo superado"
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -36521,7 +37153,7 @@ msgid "Stay updated about the performance and health of your environment by conf
msgstr "Manténgase informado sobre el rendimiento y la salud de su entorno mediante la configuración dePrometheus para monitorizar sus despliegues."
msgid "Step %{currentStep} of %{stepCount}"
-msgstr ""
+msgstr "Paso %{currentStep} de %{stepCount}"
msgid "Step 1."
msgstr "Paso 1."
@@ -36562,6 +37194,9 @@ msgstr "Almacenamiento:"
msgid "StorageSize|Unknown"
msgstr "Desconocido"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36575,7 +37210,7 @@ msgid "Subdomains of the Pages root domain %{root_domain} are reserved and canno
msgstr ""
msgid "Subgroup information"
-msgstr ""
+msgstr "Información del subgrupo"
msgid "Subgroup milestone"
msgstr "Hito del subgrupo"
@@ -36583,8 +37218,8 @@ msgstr "Hito del subgrupo"
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr "Permitido crear subgrupos"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
msgstr "Permitido crear subgrupos"
@@ -36601,6 +37236,9 @@ msgstr "Sub-grupos"
msgid "Subgroups and projects"
msgstr "Subgrupos y proyectos"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,11 +37302,14 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr "Se suscribe a este %{quick_action_target}."
+msgid "Subscript"
+msgstr "Subíndice"
+
msgid "Subscription"
msgstr "Suscripción"
msgid "Subscription History"
-msgstr ""
+msgstr "Historial de suscripciones"
msgid "Subscription deletion failed."
msgstr "Se ha producido un error al eliminar la suscripción."
@@ -36686,13 +37327,13 @@ msgid "Subscription successfully deleted."
msgstr "Suscripción eliminada correctamente."
msgid "SubscriptionBanner|Add new license"
-msgstr ""
+msgstr "Añadir una nueva licencia"
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionBanner|Upload new license"
-msgstr ""
+msgstr "Cargar nueva licencia"
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36728,7 +37369,7 @@ msgid "SubscriptionTable|Refresh Seats"
msgstr ""
msgid "SubscriptionTable|Renew"
-msgstr ""
+msgstr "Renovar"
msgid "SubscriptionTable|Seats currently in use"
msgstr "Puestos actualmente en uso"
@@ -36782,16 +37423,16 @@ msgid "Subscriptions"
msgstr "Suscripciones"
msgid "Subscriptions|Chat with sales"
-msgstr ""
+msgstr "Chatear con ventas"
msgid "Subscriptions|Close"
-msgstr ""
+msgstr "Cerrar"
msgid "Subscriptions|Not ready to buy yet?"
-msgstr ""
+msgstr "¿Aún no está listo para comprar?"
msgid "Subscriptions|Start a free trial"
-msgstr ""
+msgstr "Comience una prueba gratuita"
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -36857,7 +37498,7 @@ msgid "Successfully updated %{last_updated_timeago}."
msgstr ""
msgid "Successfully updated the environment."
-msgstr ""
+msgstr "Entorno actualizado correctamente."
msgid "Suggest code changes which can be immediately applied in one click. Try it out!"
msgstr ""
@@ -36866,25 +37507,25 @@ msgid "Suggested change"
msgstr "Cambio sugerido"
msgid "SuggestedColors|Aztec Gold"
-msgstr ""
+msgstr "Oro Azteca"
msgid "SuggestedColors|Blue"
msgstr "Azul"
msgid "SuggestedColors|Blue-gray"
-msgstr ""
+msgstr "Azul-gris"
msgid "SuggestedColors|Carrot orange"
-msgstr ""
+msgstr "Naranja zanahoria"
msgid "SuggestedColors|Champagne"
-msgstr ""
+msgstr "Champán"
msgid "SuggestedColors|Charcoal grey"
-msgstr ""
+msgstr "Gris carbón"
msgid "SuggestedColors|Crimson"
-msgstr ""
+msgstr "Carmesí"
msgid "SuggestedColors|Current addition color"
msgstr ""
@@ -36893,19 +37534,19 @@ msgid "SuggestedColors|Current removal color"
msgstr ""
msgid "SuggestedColors|Dark coral"
-msgstr ""
+msgstr "Coral oscuro"
msgid "SuggestedColors|Dark green"
-msgstr ""
+msgstr "Verde oscuro"
msgid "SuggestedColors|Dark sea green"
-msgstr ""
+msgstr "Verde mar oscuro"
msgid "SuggestedColors|Dark violet"
-msgstr ""
+msgstr "Violeta oscuro"
msgid "SuggestedColors|Deep violet"
-msgstr ""
+msgstr "Violeta intenso"
msgid "SuggestedColors|Default addition color"
msgstr ""
@@ -36917,7 +37558,7 @@ msgid "SuggestedColors|Gray"
msgstr "Gris"
msgid "SuggestedColors|Green"
-msgstr ""
+msgstr "Verde"
msgid "SuggestedColors|Green screen"
msgstr ""
@@ -36938,7 +37579,7 @@ msgid "SuggestedColors|Orange"
msgstr ""
msgid "SuggestedColors|Purple"
-msgstr ""
+msgstr "Púrpura"
msgid "SuggestedColors|Red"
msgstr "Rojo"
@@ -36970,26 +37611,29 @@ msgstr "Suite"
msgid "Summary"
msgstr "Resumen"
-msgid "Summary / Note"
-msgstr ""
+msgid "Summary / note"
+msgstr "Resumen / nota"
+
+msgid "Summary comment (optional)"
+msgstr "Comentario de resumen (opcional)"
msgid "Sunday"
msgstr "Domingo"
msgid "SuperSonics|Activate subscription"
-msgstr ""
+msgstr "Activar suscripción"
msgid "SuperSonics|Activation code"
-msgstr ""
+msgstr "Código de activación"
msgid "SuperSonics|An error occurred while adding your subscription."
-msgstr ""
+msgstr "Se ha producido un error al añadir su suscripción."
msgid "SuperSonics|Billable users"
msgstr ""
msgid "SuperSonics|Buy subscription"
-msgstr ""
+msgstr "Comprar suscripción"
msgid "SuperSonics|Cannot activate instance due to a connectivity issue."
msgstr ""
@@ -37007,7 +37651,7 @@ msgid "SuperSonics|Export license usage file"
msgstr ""
msgid "SuperSonics|Free trial"
-msgstr ""
+msgstr "Prueba gratuita"
msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
msgstr ""
@@ -37022,19 +37666,19 @@ msgid "SuperSonics|Licensed to"
msgstr ""
msgid "SuperSonics|Manage"
-msgstr ""
+msgstr "Gestionar"
msgid "SuperSonics|Maximum users"
msgstr ""
msgid "SuperSonics|Offline license"
-msgstr ""
+msgstr "Licencia sin conexión"
msgid "SuperSonics|Online license"
-msgstr ""
+msgstr "Licencia con conexión"
msgid "SuperSonics|Paste your activation code"
-msgstr ""
+msgstr "Pegue su código de activación"
msgid "SuperSonics|Please agree to the Subscription Agreement"
msgstr ""
@@ -37046,10 +37690,10 @@ msgid "SuperSonics|Start free trial"
msgstr ""
msgid "SuperSonics|Subscription details"
-msgstr ""
+msgstr "Detalles de la suscripción"
msgid "SuperSonics|Subscription unavailable"
-msgstr ""
+msgstr "Suscripción no disponible"
msgid "SuperSonics|Sync subscription details"
msgstr ""
@@ -37077,14 +37721,14 @@ msgstr ""
msgid "SuperSonics|User in subscription"
msgid_plural "SuperSonics|Users in subscription"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Usuario en la suscripción"
+msgstr[1] "Usuarios en suscripción"
msgid "SuperSonics|Users in subscription"
-msgstr ""
+msgstr "Usuarios en la suscripción"
msgid "SuperSonics|Users over subscription"
-msgstr ""
+msgstr "Usuarios por encima de la suscripción"
msgid "SuperSonics|Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
msgstr ""
@@ -37114,19 +37758,19 @@ msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{t
msgstr ""
msgid "SuperSonics|Your %{subscriptionEntryName} cannot be displayed at the moment. Please refresh the page to try again."
-msgstr ""
+msgstr "No se puede mostrar tu %{subscriptionEntryName} en este momento. Por favor, actualice la página para volver a intentarlo."
msgid "SuperSonics|Your future dated license was successfully added"
msgstr ""
msgid "SuperSonics|Your subscription"
-msgstr ""
+msgstr "Su suscripción"
msgid "SuperSonics|Your subscription details will sync shortly."
-msgstr ""
+msgstr "Los detalles de su suscripción se sincronizarán en breve."
msgid "SuperSonics|Your subscription is expired."
-msgstr ""
+msgstr "Su suscripción ha caducado."
msgid "SuperSonics|Your subscription was successfully activated. You can see the details below."
msgstr ""
@@ -37138,7 +37782,10 @@ msgid "SuperSonics|future subscriptions"
msgstr ""
msgid "SuperSonics|past subscriptions"
-msgstr ""
+msgstr "Suscripciones anteriores"
+
+msgid "Superscript"
+msgstr "Superíndice"
msgid "Support"
msgstr "Soporte"
@@ -37150,13 +37797,28 @@ msgid "Support page URL"
msgstr "URL de la página de soporte"
msgid "Survey Response"
-msgstr ""
+msgstr "Respuesta de la encuesta"
+
+msgid "Surveys|Delighted"
+msgstr "Surveys|Encantado"
+
+msgid "Surveys|Happy"
+msgstr "Surveys|Feliz"
+
+msgid "Surveys|Neutral"
+msgstr "Surveys|Neutral"
+
+msgid "Surveys|Sad"
+msgstr "Surveys|Triste"
+
+msgid "Surveys|Unhappy"
+msgstr "Surveys|Descontento"
msgid "Switch Branches"
-msgstr ""
+msgstr "Cambiar ramas"
msgid "Switch branch"
-msgstr ""
+msgstr "Cambiar rama"
msgid "Switch branch/tag"
msgstr "Cambiar rama/etiqueta"
@@ -37180,34 +37842,34 @@ msgid "Synced"
msgstr "Sincronizado"
msgid "Synchronize LDAP"
-msgstr ""
+msgstr "Sincronizar LDAP"
msgid "Syncing…"
msgstr "Sincronizando…"
msgid "Syntax is correct."
-msgstr ""
+msgstr "La sintaxis es correcta."
msgid "Syntax is incorrect."
-msgstr ""
+msgstr "La sintaxis es incorrecta."
msgid "SynthaxHighlightingTheme|Dark"
-msgstr ""
+msgstr "Oscuro"
msgid "SynthaxHighlightingTheme|Light"
-msgstr ""
+msgstr "Claro"
msgid "SynthaxHighlightingTheme|Monokai"
-msgstr ""
+msgstr "Monokai"
msgid "SynthaxHighlightingTheme|None"
-msgstr ""
+msgstr "Ninguno"
msgid "SynthaxHighlightingTheme|Solarized Dark"
-msgstr ""
+msgstr "Solarized Dark"
msgid "SynthaxHighlightingTheme|Solarized Light"
-msgstr ""
+msgstr "Solarized Light"
msgid "System"
msgstr "Sistema"
@@ -37227,9 +37889,6 @@ msgstr "Sistema predeterminado (%{default})"
msgid "System header and footer"
msgstr "Encabezado y pie de página del sistema"
-msgid "System hook was successfully updated."
-msgstr "El hook del sistema se actualizó correctamente."
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37240,13 +37899,13 @@ msgid "System metrics (Kubernetes)"
msgstr "Métricas del sistema (Kubernetes)"
msgid "System output"
-msgstr ""
+msgstr "Salida del sistema"
msgid "Table of Contents"
msgstr "Tabla de contenidos"
msgid "Table of contents"
-msgstr ""
+msgstr "Tabla de contenidos"
msgid "Tag"
msgstr "Etiqueta"
@@ -37258,7 +37917,7 @@ msgid "Tag name"
msgstr "Nombre de la etiqueta"
msgid "Tag name is required."
-msgstr ""
+msgstr "El nombre de la etiqueta es obligatorio."
msgid "Tag push"
msgstr ""
@@ -37297,7 +37956,7 @@ msgid "Tags:"
msgstr "Etiquetas:"
msgid "TagsPage|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this tag."
-msgstr ""
+msgstr "Después de confirmar y seleccionar %{strongStart}%{buttonText},%{strongEnd} no se puede recuperar esta etiqueta."
msgid "TagsPage|Browse commits"
msgstr "Explorar commits"
@@ -37312,13 +37971,13 @@ msgid "TagsPage|Cancel"
msgstr "Cancelar"
msgid "TagsPage|Cancel, keep tag"
-msgstr ""
+msgstr "Cancelar, mantener etiqueta"
msgid "TagsPage|Create tag"
msgstr "Crear etiqueta"
msgid "TagsPage|Delete protected tag"
-msgstr ""
+msgstr "Eliminar etiqueta protegida"
msgid "TagsPage|Delete protected tag. Are you ABSOLUTELY SURE?"
msgstr ""
@@ -37357,7 +38016,7 @@ msgid "TagsPage|Optionally, create a public Release of your project, based on th
msgstr ""
msgid "TagsPage|Please type the following to confirm:"
-msgstr ""
+msgstr "Por favor, escriba lo siguiente para confirmar:"
msgid "TagsPage|Release notes"
msgstr "Notas de la versión"
@@ -37366,7 +38025,7 @@ msgid "TagsPage|Repository has no tags yet."
msgstr "El repositorio todavía no tiene etiquetas."
msgid "TagsPage|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Lo sentimos, su filtro no produjo resultados."
msgid "TagsPage|Tags"
msgstr "Etiquetas"
@@ -37378,7 +38037,7 @@ msgid "TagsPage|This tag has no release notes."
msgstr "Esta etiqueta no tiene notas de la versión."
msgid "TagsPage|Unable to load tags"
-msgstr ""
+msgstr "No se pueden cargar las etiquetas"
msgid "TagsPage|Use git tag command to add a new one:"
msgstr "Utilice el comando git tag para añadir una nueva:"
@@ -37387,10 +38046,10 @@ msgid "TagsPage|Write your release notes or drag files here…"
msgstr "Escriba sus notas de la versión o arrastre los archivos aquí…"
msgid "TagsPage|Yes, delete protected tag"
-msgstr ""
+msgstr "Sí, eliminar etiqueta protegida"
msgid "TagsPage|Yes, delete tag"
-msgstr ""
+msgstr "Sí, eliminar etiqueta"
msgid "TagsPage|You're about to permanently delete the protected tag %{strongStart}%{tagName}.%{strongEnd}"
msgstr ""
@@ -37423,10 +38082,16 @@ msgid "Target-Branch"
msgstr ""
msgid "Task"
-msgstr ""
+msgstr "Tarea"
msgid "Task ID: %{elastic_task}"
-msgstr ""
+msgstr "ID de tarea: %{elastic_task}"
+
+msgid "Task list"
+msgstr "Lista de tareas"
+
+msgid "Task with ID: %{id} could not be found."
+msgstr "No se ha encontrado la tarea con el ID: %{id}."
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37495,22 +38160,22 @@ msgid "Terms of Service and Privacy Policy"
msgstr "Términos del servicio y política de privacidad"
msgid "Terms of service"
-msgstr ""
+msgstr "Términos de servicio"
msgid "Terraform"
-msgstr ""
+msgstr "Terraform"
msgid "TerraformBanner|Learn more about GitLab's Backend State"
-msgstr ""
+msgstr "Obtenga más información sobre el backend de estado de GitLab"
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 ""
+msgstr "¿Utiliza Terraform? Pruebe los estados administrados de Terraform de GitLab"
msgid "Terraform|%{name} successfully removed"
-msgstr ""
+msgstr "%{name} eliminado correctamente"
msgid "Terraform|%{number} Terraform report failed to generate"
msgid_plural "Terraform|%{number} Terraform reports failed to generate"
@@ -37529,11 +38194,11 @@ msgstr[1] ""
msgid "Terraform|%{strong_start}%{number}%{strong_end} Terraform report was generated in your pipelines"
msgid_plural "Terraform|%{strong_start}%{number}%{strong_end} Terraform reports were generated in your pipelines"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{number}%{strong_end} Se generó un informe de Terraform en sus pipelines"
+msgstr[1] "Se generaron %{strong_start}%{number}%{strong_end} informes de Terraform en sus pipelines"
msgid "Terraform|%{user} updated %{timeAgo}"
-msgstr ""
+msgstr "%{user} actualizado hace %{timeAgo}"
msgid "Terraform|A Terraform report failed to generate."
msgstr ""
@@ -37542,19 +38207,19 @@ msgid "Terraform|A Terraform report was generated in your pipelines."
msgstr ""
msgid "Terraform|A report failed to generate."
-msgstr ""
+msgstr "Se ha producido un error al generar un informe de Terraform."
msgid "Terraform|A report was generated in your pipelines."
-msgstr ""
+msgstr "Se ha generado un informe en sus pipelines."
msgid "Terraform|Actions"
-msgstr ""
+msgstr "Acciones"
msgid "Terraform|An error occurred while changing the state file"
msgstr ""
msgid "Terraform|An error occurred while loading your Terraform States"
-msgstr ""
+msgstr "Se ha producido un error al cargar sus estados de Terraform"
msgid "Terraform|Are you sure you want to remove the Terraform State %{name}?"
msgstr ""
@@ -37569,10 +38234,10 @@ msgid "Terraform|Copy Terraform init command"
msgstr ""
msgid "Terraform|Deletion in progress"
-msgstr ""
+msgstr "Eliminación en curso"
msgid "Terraform|Details"
-msgstr ""
+msgstr "Detalles"
msgid "Terraform|Download JSON"
msgstr "Descargar JSON"
@@ -37590,7 +38255,7 @@ msgid "Terraform|Job status"
msgstr ""
msgid "Terraform|Loading Terraform reports..."
-msgstr ""
+msgstr "Cargando informes de Terraform..."
msgid "Terraform|Lock"
msgstr ""
@@ -37617,22 +38282,22 @@ msgid "Terraform|Remove state file and versions"
msgstr ""
msgid "Terraform|Removed"
-msgstr ""
+msgstr "Eliminado"
msgid "Terraform|Removing"
-msgstr ""
+msgstr "Eliminando"
msgid "Terraform|Reported Resource Changes: %{addNum} to add, %{changeNum} to change, %{deleteNum} to delete"
msgstr ""
msgid "Terraform|States"
-msgstr ""
+msgstr "Estados"
msgid "Terraform|Terraform init command"
-msgstr ""
+msgstr "El comando Terraform init"
msgid "Terraform|Terraform reports"
-msgstr ""
+msgstr "Informes de Terraform"
msgid "Terraform|The job %{name} failed to generate a report."
msgstr ""
@@ -37653,7 +38318,7 @@ msgid "Terraform|To remove the State file and its versions, type %{name} to conf
msgstr ""
msgid "Terraform|Unknown User"
-msgstr ""
+msgstr "Usuario desconocido"
msgid "Terraform|Unlock"
msgstr ""
@@ -37774,16 +38439,19 @@ msgid "TestReports|%{rate}%{sign} success rate"
msgstr "%{rate}%{sign} tasa de éxito"
msgid "TestReports|Attachment"
+msgstr "Adjunto"
+
+msgid "TestReports|Copy test name to rerun locally"
msgstr ""
msgid "TestReports|Job artifacts are expired"
-msgstr ""
+msgstr "Los artefactos del trabajo han caducado"
msgid "TestReports|Jobs"
-msgstr ""
+msgstr "Trabajos"
msgid "TestReports|Learn how to upload pipeline test reports"
-msgstr ""
+msgstr "Aprenda cómo subir informes de prueba de pipeline"
msgid "TestReports|Learn more about pipeline test reports"
msgstr ""
@@ -37822,13 +38490,13 @@ msgid "Tests"
msgstr "Pruebas"
msgid "Text (optional)"
-msgstr ""
+msgstr "Texto (opcional)"
msgid "Text added to the body of all email messages. %{character_limit} character limit"
msgstr ""
msgid "Text style"
-msgstr ""
+msgstr "Estilo del texto"
msgid "Thank you for your business."
msgstr ""
@@ -37843,19 +38511,16 @@ msgid "Thank you for your support request! We are tracking your request as ticke
msgstr ""
msgid "Thanks for signing up to GitLab!"
-msgstr ""
+msgstr "¡Gracias por registrarse en GitLab!"
msgid "Thanks for your purchase!"
msgstr "¡Gracias por su compra!"
msgid "That's OK, I don't want to renew"
-msgstr ""
+msgstr "Está bien, no quiero renovar"
msgid "That's it, well done!"
-msgstr ""
-
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr "El grupo \"%{group_path}\" le permite iniciar sesión utilizando su cuenta de inicio de sesión único"
+msgstr "Eso es todo, ¡bien hecho!"
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37881,7 +38546,7 @@ msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
msgid "The ID of the application."
-msgstr ""
+msgstr "El ID de la aplicación."
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 añadir cosas que necesitan ser mejoradas o resueltas en un proyecto"
@@ -37896,10 +38561,10 @@ msgid "The Snowplow cookie domain."
msgstr ""
msgid "The URL of the Jenkins server."
-msgstr ""
+msgstr "La URL del servidor de Jenkins."
msgid "The URL should start with http:// or https://"
-msgstr ""
+msgstr "La URL debe comenzar con http:// o https://"
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
@@ -37965,7 +38630,7 @@ msgid "The current epic"
msgstr ""
msgid "The current incident"
-msgstr ""
+msgstr "La incidencia actual"
msgid "The current issue"
msgstr "La incidencia actual"
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38001,9 +38669,9 @@ msgid "The domain you entered is not allowed."
msgstr "El dominio que ha introducido no está permitido."
msgid "The download link will expire in 24 hours."
-msgstr ""
+msgstr "El enlace de descarga caducará en 24 horas."
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38034,10 +38702,10 @@ msgid "The following %{user} can also push to this branch: %{branch}"
msgstr ""
msgid "The following Personal Access Token was revoked by an administrator, %{username}."
-msgstr ""
+msgstr "El siguiente token de acceso personal fue revocado por un administrador, %{username}."
msgid "The following SSH key was deleted by an administrator, %{username}."
-msgstr ""
+msgstr "La siguiente clave SSH fue eliminada por un administrador, %{username}."
msgid "The following items will NOT be exported:"
msgstr "No se exportarán los siguientes elementos:"
@@ -38055,14 +38723,14 @@ msgstr "La relación con la bifurcación se ha eliminado."
msgid "The form contains the following error:"
msgid_plural "The form contains the following errors:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "El formulario contiene el siguiente error:"
+msgstr[1] "El formulario contiene los siguientes errores:"
msgid "The form contains the following warning:"
-msgstr ""
+msgstr "El formulario contiene la siguiente advertencia:"
msgid "The git server, Gitaly, is not available at this time. Please contact your administrator."
-msgstr ""
+msgstr "El servidor git, Gitaly, no está disponible en este momento. Por favor, póngase en contacto con su administrador."
msgid "The global settings require you to enable Two-Factor Authentication for your account."
msgstr "La configuración global requiere que habilite la autenticación de dos factores para su cuenta."
@@ -38089,16 +38757,16 @@ msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
msgid "The hostname of your PlantUML server."
-msgstr ""
+msgstr "El nombre de servidor de su servidor de PlantUML."
msgid "The hostname of your Snowplow collector."
-msgstr ""
+msgstr "El nombre de su colector de Snowplow"
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'."
msgid "The interval must be one of %{intervals}."
-msgstr ""
+msgstr "El intervalo debe ser uno de %{intervals}."
msgid "The invitation can not be found with the provided invite token."
msgstr ""
@@ -38134,10 +38802,10 @@ msgid "The latest pipeline for this merge request has failed."
msgstr ""
msgid "The license key is invalid."
-msgstr ""
+msgstr "La clave de la licencia no es válida."
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
-msgstr ""
+msgstr "La clave de la licencia no es válida. Asegúrese de que está exactamente como la recibió por parte de GitLab Inc."
msgid "The license was removed. GitLab has fallen back on the previous license."
msgstr "La licencia se ha eliminado. GitLab vuelto al modelo de licencia anterior."
@@ -38149,25 +38817,28 @@ msgid "The license was successfully uploaded and is now active. You can see the
msgstr "La licencia se ha subido correctamente y está activada. Puede ver los detalles de a continuación."
msgid "The license was successfully uploaded and will be active from %{starts_at}. You can see the details below."
-msgstr ""
+msgstr "La licencia se ha subido correctamente y estará activa desde %{starts_at}. Puede ver los detalles a continuación."
msgid "The license you uploaded is invalid. If the issue persists, contact support at %{link}."
-msgstr ""
+msgstr "La licencia que ha subido no es válida. Si el problema persiste, póngase en contacto con el soporte técnico en %{link}."
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "El tamaño máximo de archivo permitido es de %{size}."
msgid "The maximum file size for job artifacts."
-msgstr ""
+msgstr "El tamaño máximo de archivo para los artefactos del trabajo."
msgid "The maximum file size in megabytes for individual job artifacts."
msgstr ""
msgid "The maximum file size is %{size}."
-msgstr ""
+msgstr "El tamaño máximo del archivo es %{size}."
msgid "The maximum number of CI/CD minutes on shared runners that a group can use each month. 0 for unlimited."
msgstr ""
@@ -38185,7 +38856,7 @@ msgid "The merge conflicts for this merge request have already been resolved. Pl
msgstr "Los conflictos en el merge para este merge request ya se han resuelto. Por favor, vuelva al merge request."
msgid "The metric must be one of %{metrics}."
-msgstr ""
+msgstr "La métrica debe ser una de %{metrics}."
msgid "The name \"%{name}\" is already taken in this directory."
msgstr "El nombre %{name} ya se está utilizando en este directorio."
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38215,7 +38883,7 @@ msgid "The parent epic is confidential and can only contain confidential epics a
msgstr ""
msgid "The password for the Jenkins server."
-msgstr ""
+msgstr "La contraseña para el servidor de Jenkins."
msgid "The password for your GitLab account on %{gitlab_url} has successfully been changed."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr "El proyecto puede ser consultado por cualquier usuario que ha iniciado sesión."
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr "El proyecto puede ser consultado por cualquier persona, independientemente de autenticación."
-
msgid "The project can be accessed without any authentication."
msgstr "El proyecto puede accederse sin ninguna autenticación."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr "El proyecto es accesible solo por los miembros del proyecto. Se debe otorgar el acceso explícitamente a cada usuario."
-
msgid "The project is still being deleted. Please try again later."
msgstr "Todavía se está eliminando el proyecto. Por favor, inténtelo de nuevo más tarde."
@@ -38263,7 +38922,7 @@ msgid "The related CI build failed."
msgstr ""
msgid "The remote mirror URL is invalid."
-msgstr ""
+msgstr "La URL remota de la réplica no es válida."
msgid "The remote mirror took to long to complete."
msgstr "La replica ha tardado demasiado tiempo en completarse."
@@ -38353,7 +39012,7 @@ msgid "The user you are trying to deactivate has been active in the past %{minim
msgstr "El usuario que está intentando desactivar ha estado activo en los últimos %{minimum_inactive_days} días y no puede ser desactivado"
msgid "The username for the Jenkins server."
-msgstr ""
+msgstr "El nombre de usuario para el servidor de Jenkins."
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -38460,8 +39119,11 @@ msgstr "Todavía no hay paquetes"
msgid "There are no projects shared with this group yet"
msgstr "Aún no hay proyectos compartidos con este grupo"
+msgid "There are no secure files yet."
+msgstr "Todavía no hay archivos seguros."
+
msgid "There are no topics to show."
-msgstr ""
+msgstr "No hay temas para mostrar."
msgid "There are no variables yet."
msgstr "Todavía no hay variables."
@@ -38488,7 +39150,7 @@ msgid "There is no chart data available."
msgstr ""
msgid "There is no data available."
-msgstr ""
+msgstr "No hay datos disponibles."
msgid "There is no data available. Please change your selection."
msgstr "No hay datos disponibles. Por favor, cambie su selección."
@@ -38505,23 +39167,29 @@ 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 fetching CRM contacts."
+msgstr "Se ha producido un error al recuperar los contactos desde CRM."
+
+msgid "There was a problem fetching CRM organizations."
+msgstr "Se ha producido un error al recuperar las organizaciones desde CRM."
+
msgid "There was a problem fetching branches."
-msgstr ""
+msgstr "Se ha producido un problema al obtener las ramas."
msgid "There was a problem fetching emojis."
-msgstr ""
+msgstr "Se ha producido un problema al obtener los emojis."
msgid "There was a problem fetching epics."
-msgstr ""
+msgstr "Se ha producido un problema al recuperar las tareas épicas."
msgid "There was a problem fetching groups."
-msgstr ""
+msgstr "Se ha producido un problema al recuperar los grupos."
msgid "There was a problem fetching iterations."
-msgstr ""
+msgstr "Se ha producido un problema al recuperar las iteraciones."
msgid "There was a problem fetching labels."
-msgstr ""
+msgstr "Se ha producido un problema al recuperar las etiquetas."
msgid "There was a problem fetching linked pipelines."
msgstr ""
@@ -38608,7 +39276,7 @@ msgid "There was an error fetching median data for stages"
msgstr ""
msgid "There was an error fetching projects"
-msgstr ""
+msgstr "Se ha producido un error al obtener los proyectos"
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -38641,7 +39309,7 @@ msgid "There was an error getting the epic participants."
msgstr ""
msgid "There was an error importing the Jira project."
-msgstr ""
+msgstr "Se ha producido un error al importar el proyecto de Jira."
msgid "There was an error loading related feature flags"
msgstr ""
@@ -38776,7 +39444,7 @@ msgid "This Project is currently archived and read-only. Please unarchive the pr
msgstr ""
msgid "This URL already exists."
-msgstr ""
+msgstr "Esta URL ya existe."
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "Esta acción puede provocar la pérdida de datos. Para prevenir acciones accidentales, le pedimos que confirme su intención."
@@ -39129,9 +39797,6 @@ msgstr "Este trabajo requiere una acción manual"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr "Este ejecutor solo se ejecutará en pipelines disparados sobre ramas pro
msgid "This setting can be overridden in each project."
msgstr "Esta configuración se puede reemplazar en cada proyecto."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr "Esto le redirigirá a una página de inicio de sesión externa."
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr "Tiempo"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr "Basado en tiempo: Si"
@@ -39369,9 +40031,6 @@ msgstr "Tiempo antes de que una incidencia sea programada"
msgid "Time before an issue starts implementation"
msgstr "Tiempo antes de que empieze la implementación de una incidencia"
-msgid "Time before enforced"
-msgstr "Tiempo antes de forzar"
-
msgid "Time between merge request creation and merge/close"
msgstr "Tiempo entre la creación de la solicitud de fusión y la integración o cierre de ésta"
@@ -39423,6 +40082,12 @@ msgstr "Est"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr "Eliminar el tiempo dedicado"
+
msgid "TimeTracking|Estimated:"
msgstr "Estimado:"
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "Ocultar/mostrar barra lateral"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr "Demasiadas referencias. Las acciones rápidas están limitadas a un máximo de %{max_count} referencias de usuario"
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr "El tema %{topic_name} se eliminó correctamente."
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-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"
@@ -40168,9 +40839,6 @@ msgstr "Número de empleados"
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr "Número de teléfono"
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "Solucione problemas y supervise su aplicación con el seguimiento"
-
msgid "Trusted"
msgstr "Confiable"
@@ -40327,6 +40992,9 @@ msgstr "Autenticación de doble factor"
msgid "Two-factor authentication disabled"
msgstr "Autenticación de doble factor desactivada"
+msgid "Two-factor authentication grace period"
+msgstr "Tiempo de gracia de la autenticación de dos factores"
+
msgid "Two-factor authentication has been disabled for this user"
msgstr "La autenticación de doble factor ha sido desactivada para este usuario"
@@ -40417,9 +41085,6 @@ msgstr "No se puede recopilar la información de la CPU"
msgid "Unable to collect memory info"
msgstr "No se puede recopilar la información de la memoria"
-msgid "Unable to connect to Elasticsearch"
-msgstr "Se ha producido un error al conectar a Elasticsearch"
-
msgid "Unable to connect to Prometheus server"
msgstr "No se ha podido conectar con el servidor de Prometheus"
@@ -40429,9 +41094,6 @@ msgstr "Imposible conectar con el servidor: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr "Se ha producido un error al conectar a la instancia de Jira. Por favor, compruebe la configuración de integración de Jira."
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr "No se puede convertir la codificación de registros de Kubernetes a UTF-8"
-
msgid "Unable to create link to vulnerability"
msgstr "No se puede crear un enlace a la vulnerabilidad"
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr "No se pueden obtener los proyectos vulnerables"
-
msgid "Unable to find Jira project to import data from."
msgstr "No se puede encontrar el proyecto Jira para importar datos."
@@ -40474,6 +41133,9 @@ msgstr "No se puede cargar el fichero diff. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr "No se pueden analizar las opciones del informe de vulnerabilidades."
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr "Desarchivar proyecto"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr "Desconocido"
msgid "Unknown Error"
msgstr "Error desconocido"
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr "¡Estrategia de cifrado desconocida: %{encrypted_strategy}!"
@@ -40624,12 +41283,6 @@ msgstr "Desbloqueó la discusión."
msgid "Unlocks the discussion."
msgstr "Desbloquea la discusión."
-msgid "Unmarked this %{noun} as a draft."
-msgstr "Desmarcado este %{noun} como borrador."
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr "Desmarca este %{noun} como borrador."
-
msgid "Unreachable"
msgstr "Inalcanzable"
@@ -40825,10 +41478,7 @@ msgstr "Subir nuevo archivo"
msgid "Upload object map"
msgstr "Subir un mapa de objetos"
-msgid "UploadLink|click to upload"
-msgstr "Hacer clic para subir"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Comprar minutos adicionales"
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "Almacenamiento"
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr "No se pueden añadir usuarios a proyectos en este grupo"
+
msgid "Users in License"
msgstr "Usuarios con licencia"
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr "Ver documentación"
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr "Ver detalles: %{details_url}"
msgid "View documentation"
msgstr "Ver documentación"
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "Ver aprobadores elegibles"
@@ -42549,8 +43199,8 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Queremos asegurarnos de que sea usted, por favor, ayudenos a confirmar que no es un robot."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
-msgstr ""
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgstr "Queremos informarle que el usuario %{username} ha sido baneado de %{scope} debido a que ha descargado más de %{max_project_downloads} repositorios de proyectos en %{within_minutes} minutos."
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
msgstr "Notificaremos a %{inviter} que ha rechazado su invitación para unirse a GitLab. Dejará de recibir recordatorios."
@@ -42715,10 +43365,10 @@ msgid "Webhooks|Enable SSL verification"
msgstr "Activar la verificación SSL"
msgid "Webhooks|Failed to connect"
-msgstr ""
+msgstr "Error al conectar"
msgid "Webhooks|Fails to connect"
-msgstr ""
+msgstr "Error al conectar"
msgid "Webhooks|Feature flag events"
msgstr ""
@@ -42793,7 +43443,7 @@ msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Website"
-msgstr ""
+msgstr "Sitio web"
msgid "Website:"
msgstr ""
@@ -42829,16 +43479,16 @@ msgid "Welcome, %{name}!"
msgstr ""
msgid "What are CI/CD minutes?"
-msgstr ""
+msgstr "¿Qué son los minutos de CI/CD?"
msgid "What are group audit events?"
-msgstr ""
+msgstr "¿Qué son los eventos de auditoría de los grupos?"
msgid "What are instance audit events?"
-msgstr ""
+msgstr "¿Qué son los eventos de auditoría de las instancias?"
msgid "What are project audit events?"
-msgstr ""
+msgstr "¿Qué son los eventos de auditoría de los proyectos?"
msgid "What does this command do?"
msgstr "¿Qué hace este comando?"
@@ -42847,7 +43497,7 @@ msgid "What is Markdown?"
msgstr "¿Qué es Markdown?"
msgid "What is listed here?"
-msgstr ""
+msgstr "¿Qué se enumera aquí?"
msgid "What is repository mirroring?"
msgstr "¿Qué es la duplicación de repositorios?"
@@ -42856,13 +43506,13 @@ msgid "What is squashing?"
msgstr ""
msgid "What templates can I create?"
-msgstr ""
+msgstr "¿Qué plantillas puedo crear?"
msgid "What will you use this group for?"
-msgstr ""
+msgstr "¿Para qué va a utilizar este grupo?"
msgid "What would you like to do?"
-msgstr ""
+msgstr "¿Qué le gustaría hacer?"
msgid "What's new"
msgstr "¿Qué hay de nuevo?"
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr "Se desplegará a"
+msgid "Wireframe"
+msgstr "Malla"
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43152,7 +43805,7 @@ msgid "With test cases, you can define conditions for your project to meet in de
msgstr ""
msgid "Withdraw Access Request"
-msgstr "Retirar Solicitud de Acceso"
+msgstr "Retirar solicitud de acceso"
msgid "Won't fix / Accept risk"
msgstr ""
@@ -43169,20 +43822,37 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr "¿Está seguro que desea cancelar la edición?"
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] "Asignado"
+msgstr[1] "Asignados"
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr "Cerrado"
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
-msgstr ""
+msgid "WorkItem|Create task"
+msgstr "Crear tarea"
msgid "WorkItem|Create work item"
msgstr ""
@@ -43193,12 +43863,12 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
-msgstr ""
-
msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
+msgid "WorkItem|Open"
+msgstr "Abrir"
+
msgid "WorkItem|Select type"
msgstr ""
@@ -43248,7 +43918,7 @@ msgid "Write a description…"
msgstr ""
msgid "Write an internal note or drag your files here…"
-msgstr ""
+msgstr "Escriba una nota interna o arrastre sus archivos aquí…"
msgid "Write milestone description..."
msgstr "Escriba la descripción del hito..."
@@ -43260,7 +43930,7 @@ msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr "UID externo incorrecto. Por favor, asegúrese de que Auth0 está configurado correctamente."
msgid "Xcode"
-msgstr ""
+msgstr "Xcode"
msgid "YYYY-MM-DD"
msgstr "AAAA-MM-DD"
@@ -43328,7 +43998,7 @@ msgid "You are connected to the Prometheus server, but there is currently no dat
msgstr "Está conectado al servidor de Prometheus, pero actualmente no hay datos disponibles para mostrar."
msgid "You are currently offline, or the GitLab instance is not reachable."
-msgstr ""
+msgstr "Actualmente está desconectado, o la instancia de GitLab no es accesible."
msgid "You are going to delete %{project_full_name}. Deleted projects CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Va a borrar %{project_full_name}. Los proyectos borrados NO SE PUEDEN restaurar ¿Está ABSOLUTAMENTE seguro?"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "Solo puede añadir archivos cuando está en una rama"
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr "Solo puede transferir el proyecto a los espacios de nombres que administre."
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Puede resolver el conflicto del merge request utilizando el modo Interactivo, utilizando los botones %{use_ours} o %{use_theirs}, o editando los archivos directamente. Confirme estos cambios en %{branch_name}"
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "No puede acceder al archivo sin formato. Por favor, espere un minuto."
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr "No puede editar este evento de la línea de tiempo."
+
msgid "You cannot impersonate a blocked user"
msgstr "No puede suplantar a un usuario bloqueado"
@@ -43691,7 +44355,7 @@ msgid "You don't have permission to review this deployment. Contact the project
msgstr ""
msgid "You don't have permissions to create this project"
-msgstr ""
+msgstr "No tiene permisos para crear este proyecto"
msgid "You don't have sufficient permission to perform this action."
msgstr "No tiene permisos suficientes para realizar esta acción."
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr "No tiene suficientes permisos para eliminar esta prohibición del espacio de nombres"
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr "Debe resolver el CAPTCHA para poder enviar"
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr "Necesita una licencia diferente para habilitar la función FileLocks"
@@ -43843,7 +44510,7 @@ msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue.
msgstr "Necesita la versión %{min_git_lfs_version} de git-lfs para continuar. Por favor, visite la URL https://git-lfs.github.com"
msgid "You need permission."
-msgstr "Necesitas permisos."
+msgstr "Necesita permisos."
msgid "You need to register a two-factor authentication app before you can set up a device."
msgstr ""
@@ -43885,10 +44552,10 @@ msgid "You will need to update your local repositories to point to the new locat
msgstr "Debe actualizar sus repositorios locales para que apunten a la nueva ubicación."
msgid "You will not get any notifications via email"
-msgstr "No recibirás ninguna notificación por correo electrónico"
+msgstr "No recibirá ninguna notificación por correo electrónico"
msgid "You will only receive notifications for the events you choose"
-msgstr "Solo recibirás notificaciones de los eventos que elijas"
+msgstr "Solo recibirá notificaciones de los eventos que seleccione"
msgid "You will only receive notifications for threads you have participated in"
msgstr "Solo recibirás notificaciones de los temas en los que has participado"
@@ -43935,18 +44602,36 @@ msgstr "No tiene permiso para realizar cambios directamente en este proyecto. Se
msgid "You're receiving this email because of your account on %{host}."
msgstr "Está recibiendo este correo electrónico por su cuenta en %{host}."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Está recibiendo este correo electrónico porque tiene su cuenta en %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr "Ha recibido este correo electrónico debido a su actividad en %{host}."
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr "Ha recibido este correo electrónico porque se le ha asignado un elemento en %{host}."
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "Ha recibido este correo electrónico porque se le ha mencionado en %{host}."
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "Ya ha habilitado la autenticación de dos pasos utilizando una contraseña de un solo uso. Para registrar un dispositivo diferente, primero debe desactivar la autenticación de dos factores."
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44191,10 +44870,10 @@ msgid "Your name"
msgstr "Tu nombre"
msgid "Your new %{accessTokenType}"
-msgstr ""
+msgstr "Su nuevo %{accessTokenType}"
msgid "Your new %{accessTokenType} has been created."
-msgstr ""
+msgstr "Se ha creado un nuevo %{accessTokenType}."
msgid "Your new %{type}"
msgstr "Su nuevo %{type}"
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr "Se ha creado su nuevo token de acceso personal."
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr "Su contraseña no es necesaria para ver esta página. Si se le solicita una contraseña o cualquier otro dato personal, póngase en contacto con su administrador para denunciar el abuso."
-
msgid "Your password reset token has expired."
msgstr "Su token para restablecer la contraseña ha caducado."
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr "Su perfil"
+msgid "Your project has limited quotas and features"
+msgstr "Su proyecto tiene cuotas y características limitadas"
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "¡Su límite de proyecto es %{limit} proyectos! Por favor, contacte con su administrador para aumentarlo"
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr "Su nombre de usuario es %{username}."
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "un usuario eliminado"
@@ -44388,6 +45070,9 @@ msgstr "alerta"
msgid "allowed to fail"
msgstr "permitido fallar"
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr "ya se está utilizando para otro grupo o proyecto %{timebox_name}."
@@ -44429,6 +45114,12 @@ msgstr "asignar a ti mismo"
msgid "at"
msgstr "en"
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr "en riesgo"
@@ -44453,7 +45144,7 @@ msgid "branch name"
msgstr "nombre de la rama"
msgid "builds"
-msgstr ""
+msgstr "construcciones"
msgid "by"
msgstr "por"
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr "no se puede habilitar a menos que todos los dominios tengan certificados
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr "%{reportType}: La carga finalizó con errores"
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr "Todos los clústeres"
+
msgid "ciReport|All projects"
msgstr "Todos los proyectos"
@@ -44662,8 +45362,8 @@ msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "La calidad de código se ha degradado debido a que se ha encontrado 1 problema nuevo"
+msgstr[1] "La calidad de código se ha degradado debido a que se han encontrado %d problemas nuevos"
msgid "ciReport|Code quality improved due to 1 resolved issue"
msgid_plural "ciReport|Code quality improved due to %d resolved issues"
@@ -44737,7 +45437,7 @@ msgid "ciReport|Found %{issuesWithCount}"
msgstr "Encontrado %{issuesWithCount}"
msgid "ciReport|Full Report"
-msgstr ""
+msgstr "Informe completo"
msgid "ciReport|IaC Scanning"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr "cerrado"
+msgid "closed %{timeago}"
+msgstr "cerrado %{timeago}"
+
msgid "closed issue"
msgstr "incidencia cerrada"
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr "el nombre contenedor no puede ser mayor que %{max_length} caracteres"
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr "rama por defecto"
msgid "deleted"
msgstr "eliminado"
+msgid "denied"
+msgstr "denegado"
+
msgid "deploy"
msgstr "desplegar"
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr "para"
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "para %{link_to_merge_request} con %{link_to_merge_request_source_branch}"
@@ -45106,7 +45809,7 @@ msgstr[0] "de %d trabajo"
msgstr[1] "de %d trabajos"
msgid "frontmatter"
-msgstr ""
+msgstr "frontmatter"
msgid "group"
msgstr "grupo"
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr "grupos"
+msgid "groups and projects"
+msgstr "grupos y proyectos"
+
+msgid "groups only"
+msgstr "solo grupos"
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] "tuvo %{count} trabajo fallido"
+msgstr[1] "tuvo %{count} trabajos fallidos"
+
msgid "has already been linked to another vulnerability"
msgstr "ya ha sido vinculado a otra vulnerabilidad"
@@ -45151,10 +45865,10 @@ msgid "http:"
msgstr "http:"
msgid "http://www.example.com"
-msgstr ""
+msgstr "http://ejemplo.com"
msgid "https://bamboo.example.com"
-msgstr ""
+msgstr "https://bamboo.ejemplo.com"
msgid "https://your-bitbucket-server"
msgstr "https://tu-servidor-bitbucket"
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr "La contraseña de aprobación no es correcta."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Aprobar"
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr "Merge"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr "Más información"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr "%{item}, y %{lastItem}"
msgid "on track"
msgstr "a tiempo"
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "padre"
msgstr[1] "padres"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "contraseña"
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "el nombre del pod no puede ser mayor que %{max_length} chars"
-
msgid "point"
msgid_plural "points"
msgstr[0] "punto"
@@ -46037,6 +46766,9 @@ msgstr "Desconocida"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr "debe ser mayor o igual que %{access} el nivel de acceso heredado del grupo %{group_name}"
@@ -46116,7 +46848,7 @@ msgid "the following epic(s)"
msgstr ""
msgid "the following incident(s) or issue(s)"
-msgstr ""
+msgstr "los siguientes incidentes o problemas"
msgid "the following issue(s)"
msgstr "la siguiente incidencia(s)"
@@ -46258,6 +46990,12 @@ msgstr "con el vencimiento que permanece sin cambios en %{old_expiry}"
msgid "yaml invalid"
msgstr "El fichero yaml no es válido"
+msgid "your GitLab instance"
+msgstr "su instancia de GitLab"
+
+msgid "your group (%{group_name})"
+msgstr "su grupo (%{group_name})"
+
msgid "your settings"
msgstr "sus ajustes"
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index 2ddfbba495c..09a71424128 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index 291ac8fdbea..16f80372ced 100644
--- a/locale/fa_IR/gitlab.po
+++ b/locale/fa_IR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index 6d5a1391e36..9d391b685bf 100644
--- a/locale/fi_FI/gitlab.po
+++ b/locale/fi_FI/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 6156419bd13..644c759f8b0 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index f17e3bca857..fb60dea983b 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr " %{start} à %{end}"
@@ -105,33 +105,33 @@ msgstr[1] "%d Paquets"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d URL analysée"
+msgstr[1] "%d URL analysées"
msgid "%d URL scanned"
msgid_plural "%d URLs scanned"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d URL analysée"
+msgstr[1] "%d URL analysées"
msgid "%d additional approver"
msgid_plural "%d additional approvers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d approbateur supplémentaire"
+msgstr[1] "%d approbateurs supplémentaires"
msgid "%d additional assignee"
msgid_plural "%d additional assignees"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d personne assignée supplémentaire"
+msgstr[1] "%d personnes assignées supplémentaires"
msgid "%d additional commenter"
msgid_plural "%d additional commenters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d commentateur supplémentaire"
+msgstr[1] "%d commentateurs supplémentaires"
msgid "%d additional committer"
msgid_plural "%d additional committers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d contributeur supplémentaire"
+msgstr[1] "%d contributeurs supplémentaires"
msgid "%d approver"
msgid_plural "%d approvers"
@@ -145,8 +145,8 @@ msgstr[1] "%d approbateurs (vous avez approuvé)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d ticket assigné"
+msgstr[1] "%d tickets assignés"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -255,8 +255,8 @@ msgstr[1] "%d résultats du test corrigés"
msgid "%d fork"
msgid_plural "%d forks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d divergence"
+msgstr[1] "%d divergences"
msgid "%d group"
msgid_plural "%d groups"
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d ticket importé avec succès avec l'étiquette"
msgstr[1] "%d tickets importés avec succès avec l'étiquette"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d couche"
@@ -340,8 +345,8 @@ msgstr[1] "%d projets personnels seront supprimés et ne pourront pas être rest
msgid "%d point"
msgid_plural "%d points"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d point"
+msgstr[1] "%d points"
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
@@ -360,6 +365,11 @@ msgstr[1] "%d projets sélectionnés"
msgid "%d remaining"
msgid_plural "%d remaining"
+msgstr[0] "%d restant"
+msgstr[1] "%d restants"
+
+msgid "%d reply"
+msgid_plural "%d replies"
msgstr[0] ""
msgstr[1] ""
@@ -368,6 +378,11 @@ msgid_plural "%d seconds"
msgstr[0] "%d seconde"
msgstr[1] "%d secondes"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d étoile"
@@ -405,28 +420,28 @@ msgstr[1] "%d vulnérabilités rejetées"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnérabilité confirmée"
+msgstr[1] "%d vulnérabilités confirmées"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnérabilité rejetée"
+msgstr[1] "%d vulnérabilités rejetées"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnérabilité marquée en attente de priorisation"
+msgstr[1] "%d vulnérabilités marquées en attente de priorisation"
msgid "%d vulnerability set to resolved"
msgid_plural "%d vulnerabilities set to resolved"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnérabilité marquée comme résolue"
+msgstr[1] "%d vulnérabilités marquées comme résolues"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
-msgstr[0] "%d avertissement trouvé :"
-msgstr[1] "%d avertissements trouvés :"
+msgstr[0] "%d avertissement trouvé :"
+msgstr[1] "%d avertissements trouvés :"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -452,13 +467,13 @@ msgid "%{author_link} cloned %{original_issue}. You don't have access to the new
msgstr "%{author_link} a cloné %{original_issue}. Vous n'avez pas accès au nouveau projet."
msgid "%{author_link} wrote:"
-msgstr "%{author_link} a écrit :"
+msgstr "%{author_link} a écrit :"
msgid "%{authorsName}'s thread"
msgstr "Le fil de %{authorsName}"
msgid "%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}"
-msgstr ""
+msgstr "%{author} a demandé de fusionner %{source_branch} %{copy_button} vers %{target_branch} %{created_at}"
msgid "%{board_target} not found"
msgstr "%{board_target} introuvable"
@@ -502,7 +517,7 @@ msgid "%{completedWeight} of %{totalWeight} weight completed"
msgstr "%{completedWeight} sur %{totalWeight} du poids complété"
msgid "%{completed} of %{total} issues closed"
-msgstr ""
+msgstr "%{completed} sur %{total} tickets fermés"
msgid "%{completed} of %{total} weight completed"
msgstr ""
@@ -635,16 +650,16 @@ msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} et %{labelCount} de plus"
msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
-msgstr ""
+msgstr "%{firstMilestoneName} + %{numberOfOtherMilestones} de plus"
msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
-msgstr ""
+msgstr "%{gitlab_experience_text}. Ne vous inquiétez pas, ces informations ne sont pas partagées en dehors de votre instance GitLab autogérée."
msgid "%{gitlab_experience_text}. We won't share this information with anyone."
-msgstr ""
+msgstr "%{gitlab_experience_text}. Nous ne partagerons ces informations avec personne."
msgid "%{global_id} is not a valid ID for %{expected_types}."
-msgstr "%{global_id} n'est pas un identifiant valide pour %{expected_types}."
+msgstr "%{global_id} n’est pas un identifiant valide pour %{expected_types}."
msgid "%{group_name} activity"
msgstr "Activité du groupe %{group_name}"
@@ -653,7 +668,7 @@ msgid "%{group_name} group members"
msgstr "Membres du groupe %{group_name}"
msgid "%{group_name} is approaching the limit of available seats"
-msgstr ""
+msgstr "%{group_name} approche la limite des places disponibles"
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
msgstr "%{group_name} utilise les comptes gérés du groupe. Vous devez créer un nouveau compte GitLab qui sera géré par %{group_name}."
@@ -677,7 +692,7 @@ msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} sera supprimé ! Êtesâ€vous sûr ?"
msgid "%{issuable}(s) already assigned"
-msgstr ""
+msgstr "%{issuable}(s) déjà assigné(s)"
msgid "%{issueType} actions"
msgstr "%{issueType} actions"
@@ -703,9 +718,15 @@ msgstr "%{labelStart}Classe :%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Adresse du plantage :%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}État du plantage :%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Preuve :%{labelEnd} %{evidence}"
@@ -776,16 +797,16 @@ msgid "%{message} showing first %{warnings_displayed}"
msgstr "%{message} %{warnings_displayed} premiers affichés"
msgid "%{message}. Your attention request was removed."
-msgstr ""
+msgstr "%{message}. Votre demande d’attention a été supprimée."
msgid "%{milestone} (expired)"
msgstr "%{milestone} (expirée)"
msgid "%{milliseconds}ms"
-msgstr "%{milliseconds}ms"
+msgstr "%{milliseconds} ms"
msgid "%{minutesUsed} minutes"
-msgstr ""
+msgstr "%{minutesUsed} minutes"
msgid "%{model_name} not found"
msgstr "%{model_name} introuvable"
@@ -794,13 +815,13 @@ msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText}, ce ticket sera fermé automatiquement."
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 "L'espace de noms %{name_with_link} dispose de %{percent} ou moins de minutes restantes d'Exécuteur de Pipeline Partagé. Une fois qu’elles seront épuisées, aucune nouvelle tâche ni pipeline de ses projets ne sera lancé."
+msgstr "L’espace de noms %{name_with_link} dispose de moins de %{percent} de temps d’exécution de pipeline partagé. Une fois ce temps épuisé, aucune nouvelle tâche ni aucun pipeline de ses projets ne sera lancé."
msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes. No new jobs or pipelines in its projects will run."
-msgstr "L'espace de noms %{name_with_link} a épuisé ses minutes d'Exécuteur de Pipeline Partagé. Aucune nouvelle tâche ni pipeline dans ses projets ne sera lancé."
+msgstr "L’espace de noms %{name_with_link} a épuisé son temps d’exécution de pipeline partagé. Aucune nouvelle tâche ni aucun pipeline dans ses projets ne sera lancé."
msgid "%{name} (Busy)"
-msgstr "%{name} (Occupé)"
+msgstr "%{name} (occupé)"
msgid "%{name} contained %{resultsString}"
msgstr "%{name} contenait %{resultsString}"
@@ -821,16 +842,16 @@ msgid "%{name}'s avatar"
msgstr "Avatar de %{name}"
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 "L'espace de noms %{name}(%{url}) dispose de %{percent} ou moins de minutes restantes d'Exécuteur Partagé de Pipeline. Une fois qu’elles seront épuisées, aucune nouvelle tâche ni pipeline de ses projets ne sera lancé."
+msgstr "L’espace de noms %{name}(%{url}) dispose de moins %{percent} de temps d’exécution de Pipeline partagé. Une fois ce temps épuisé, aucune nouvelle tâche ni aucun pipeline de ses projets ne sera lancé."
msgid "%{name}(%{url}) namespace has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr "L'espace de noms %{name}(%{url}) a épuisé ses minutes de Pipeline d'Exécuteur Partagé de sorte qu'aucune nouvelle tâche ni pipeline dans ses projets ne sera lancé."
msgid "%{name}, confirm your email address now!"
-msgstr "%{name}, confirmez votre adresse e-mail maintenant !"
+msgstr "%{name}, confirmez votre adresse de courriel maintenant !"
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name} : %{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -856,13 +877,13 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues} ouverts, %{closedIssues} fermés"
msgid "%{percentageUsed}%% used"
-msgstr ""
+msgstr "%{percentageUsed} %% utilisé(s)"
msgid "%{percentage}%% issues closed"
-msgstr ""
+msgstr "%{percentage} %% de tickets fermés"
msgid "%{percentage}%% weight completed"
-msgstr "%{percentage}%% du poids completé"
+msgstr "%{percentage} %% du poids complété"
msgid "%{percent}%% complete"
msgstr "%{percent} %% effectués"
@@ -880,76 +901,73 @@ msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})
msgstr "%{policy_link} (notifiant après %{elapsed_time} minutes à moins de %{status})"
msgid "%{project_name}"
-msgstr ""
+msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}"
-msgstr ""
+msgstr "%{project_path} est un projet que vous pouvez utiliser pour ajouter un README à votre profil GitLab. Créez un projet public and initialisez le dépôt avec un README pour commencer. %{help_link_start}En savoir plus.%{help_link_end}"
msgid "%{ref} cannot be added: %{error}"
-msgstr ""
+msgstr "%{ref} ne peut être ajouté : %{error}"
msgid "%{releases} release"
msgid_plural "%{releases} releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{releases} version"
+msgstr[1] "%{releases} versions"
msgid "%{remaining_approvals} left"
-msgstr ""
+msgstr "%{remaining_approvals} restantes"
msgid "%{reportType} %{status}"
-msgstr ""
+msgstr "%{reportType} %{status}"
msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
-msgstr ""
+msgstr "%{reportType} a détecté %{totalStart}%{total}%{totalEnd} %{vulnMessage} possibles"
msgid "%{reportType} detected no %{totalStart}new%{totalEnd} vulnerabilities."
-msgstr ""
+msgstr "%{reportType} n’a détecté aucune %{totalStart}nouvelle%{totalEnd} vulnérabilité."
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
-msgstr ""
+msgstr "%{retryButtonStart}Réessayez%{retryButtonEnd} ou %{newFileButtonStart}joignez un nouveau fichier%{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 ""
+msgstr "%{rotation} a été recalculé avec les participants restants. Veuillez vérifier la nouvelle configuration pour %{rotation_link}. Il est recommandé de contacter la personne d’astreinte afin d’assurer la continuité du support."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr ""
+msgstr "%{rotation} a été recalculé avec les participants restants. Veuillez vérifier la nouvelle configuration pour %{rotation}. Il est recommandé de contacter la personne d’astreinte afin d’assurer la continuité du support."
msgid "%{runner} created %{timeago}"
-msgstr ""
+msgstr "%{runner} créé %{timeago}"
msgid "%{scope} results for term '%{term}'"
-msgstr ""
-
-msgid "%{search} %{description} %{scope}"
-msgstr ""
+msgstr "%{scope} résultats pour le terme « %{term} »"
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[0] "%{securityScanner} n’est pas activé(e) pour ce projet. %{linkStart}Plus d’informations%{linkEnd}"
+msgstr[1] "%{securityScanner} ne sont pas activé(e)s pour ce projet. %{linkStart}Plus d’informations%{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[0] "Le résultat de %{securityScanner} n’est pas disponible, car aucun pipeline n’a pas été exécuté depuis son activation. %{linkStart}Exécuter un pipeline%{linkEnd}"
+msgstr[1] "Les résultats de %{securityScanner} ne sont pas disponibles, car aucun pipeline n’a pas été exécuté depuis son activation. %{linkStart}Exécuter un pipeline%{linkEnd}"
msgid "%{size} %{unit}"
-msgstr ""
+msgstr "%{size} %{unit}"
msgid "%{size} GiB"
-msgstr ""
+msgstr "%{size} Gio"
msgid "%{size} KiB"
-msgstr ""
+msgstr "%{size} Kio"
msgid "%{size} MiB"
-msgstr ""
+msgstr "%{size} Mio"
msgid "%{size} bytes"
-msgstr ""
+msgstr "%{size} octets"
msgid "%{sourceBranch} into %{targetBranch}"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1100,13 +1124,13 @@ msgid "%{username}'s avatar"
msgstr ""
msgid "%{user} created a merge request: %{mr_link}"
-msgstr ""
+msgstr "%{user} a créé une demande de fusion : %{mr_link}"
msgid "%{user} created an epic: %{epic_link}"
msgstr ""
msgid "%{user} created an issue: %{issue_link}"
-msgstr ""
+msgstr "%{user} a créé un ticket : %{issue_link}"
msgid "%{value} is not included in the list"
msgstr ""
@@ -1277,7 +1301,7 @@ msgid "- Available to run jobs."
msgstr ""
msgid "- Create or close an issue."
-msgstr ""
+msgstr "- Créer ou fermer un ticket."
msgid "- Create, update, or delete a merge request."
msgstr ""
@@ -1311,7 +1335,7 @@ msgid "- View the last_activity_at attribute for %{project_name} using the Proje
msgstr ""
msgid "- of - issues closed"
-msgstr ""
+msgstr "- de - tickets fermés"
msgid "- of - weight completed"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "un jour"
@@ -1343,13 +1372,13 @@ msgstr[1] ""
msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 ticket fermé"
+msgstr[1] "%{issues} tickets fermés"
msgid "1 closed merge request"
msgid_plural "%{merge_requests} closed merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 demande de fusion fermée"
+msgstr[1] "%{merge_requests} demandes de fusion fermées"
msgid "1 day"
msgid_plural "%d days"
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1615,7 +1647,7 @@ msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
msgid "A page with that title already exists"
-msgstr ""
+msgstr "Une page avec ce titre existe déjà"
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
@@ -1651,7 +1683,7 @@ msgid "A sign-in to your account has been made from the following IP address: %{
msgstr ""
msgid "A title is required"
-msgstr ""
+msgstr "Un titre est requis"
msgid "A user with write access to the source branch selected this option"
msgstr "Une personne avec un accès en écriture à la branche source a sélectionné cette option"
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Jetons d’accès"
@@ -1888,7 +1923,7 @@ msgid "AccessTokens|Copy static object token"
msgstr ""
msgid "AccessTokens|Created"
-msgstr ""
+msgstr "Créé"
msgid "AccessTokens|Feed token"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Compte"
@@ -2037,9 +2078,6 @@ msgstr "Ajouter un CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Ajouter un CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Ajouter une URL Jaeger"
-
msgid "Add Kubernetes cluster"
msgstr "Ajouter une grappe de serveurs Kubernetes"
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 "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 new issue"
msgstr ""
@@ -2125,7 +2157,7 @@ msgid "Add a task list"
msgstr "Ajouter une liste de tâches"
msgid "Add a title..."
-msgstr ""
+msgstr "Ajouter un titre..."
msgid "Add a to do"
msgstr ""
@@ -2212,7 +2244,7 @@ msgid "Add key"
msgstr ""
msgid "Add label(s)"
-msgstr ""
+msgstr "Ajouter des étiquettes"
msgid "Add list"
msgstr ""
@@ -2248,7 +2280,7 @@ msgid "Add reaction"
msgstr "Ajouter une réaction"
msgid "Add request manually"
-msgstr ""
+msgstr "Ajouter une requête manuellement"
msgid "Add suggestion to batch"
msgstr ""
@@ -2278,7 +2310,7 @@ msgid "Add to tree"
msgstr ""
msgid "Add topics to projects to help users find them."
-msgstr ""
+msgstr "Ajouter des sujets aux projets pour aider les utilisateurs à les trouver."
msgid "Add trigger"
msgstr ""
@@ -2335,7 +2367,7 @@ msgid "Added %{epic_ref} as a child epic."
msgstr ""
msgid "Added %{label_references} %{label_text}."
-msgstr ""
+msgstr "%{label_references} %{label_text} ajouté."
msgid "Added a to do."
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "L’ajout de nouvelles applications est désactivé dans votre instance GitLab. Veuillez contacter votre administrateur GitLab pour en obtenir la permission."
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2383,7 +2412,7 @@ msgid "Adds %{epic_ref} as child epic."
msgstr ""
msgid "Adds %{labels} %{label_text}."
-msgstr ""
+msgstr "Ajoute %{labels} %{label_text}."
msgid "Adds a Zoom meeting."
msgstr ""
@@ -2476,7 +2505,7 @@ msgid "AdminArea|Groups"
msgstr ""
msgid "AdminArea|Guest"
-msgstr ""
+msgstr "Invité"
msgid "AdminArea|Included Free in license"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domaine de DevOps automatique"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3022,7 +3066,7 @@ msgid "AdminUsers|Delete user and contributions"
msgstr "Supprimer le compte et ses contributions"
msgid "AdminUsers|Export permissions as CSV (max 100,000 users)"
-msgstr ""
+msgstr "Exporter les permissions en CSV (100000 utilisateurs maximum)"
msgid "AdminUsers|External"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3106,14 +3162,20 @@ msgid "AdminUsers|Search by name, email or username"
msgstr ""
msgid "AdminUsers|Search users"
-msgstr ""
+msgstr "Rechercher des utilisateurs"
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3643,7 +3708,7 @@ msgid "AlertsIntegrations|No integrations have been added yet."
msgstr ""
msgid "AlertsIntegrations|The current integration could not be updated. Please try again."
-msgstr ""
+msgstr "L'intégration actuelle n'a pas pu être mise à jour. Veuillez réessayer."
msgid "AlertsIntegrations|The integration could not be added. Please try again."
msgstr ""
@@ -3679,7 +3744,7 @@ msgid "All (default)"
msgstr ""
msgid "All GitLab"
-msgstr ""
+msgstr "Tout GitLab"
msgid "All Members"
msgstr "Tous les membres"
@@ -3703,7 +3768,7 @@ msgid "All issues"
msgstr ""
msgid "All issues for this milestone are closed."
-msgstr ""
+msgstr "Tous les tickets de ce jalon sont fermés"
msgid "All issues for this milestone are closed. You may close this milestone now."
msgstr ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr "Autoriser les projets de ce groupe à utiliser le stockage Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Vous permet d’ajouter et de gérer des grappes de serveurs Kubernetes."
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Une erreur est survenue lors de l’abonnement aux notifications."
@@ -4368,7 +4439,7 @@ msgid "Any Author"
msgstr ""
msgid "Any Milestone"
-msgstr ""
+msgstr "N'importe quel jalon"
msgid "Any encrypted tokens"
msgstr ""
@@ -4380,7 +4451,7 @@ msgid "Any member with at least Developer permissions on the project."
msgstr ""
msgid "Any milestone"
-msgstr ""
+msgstr "N'importe quel jalon"
msgid "Any namespace"
msgstr ""
@@ -4398,7 +4469,7 @@ msgid "Appearance was successfully created."
msgstr ""
msgid "Appearance was successfully updated."
-msgstr ""
+msgstr "L'apparence a bien été mise à jour."
msgid "Append the comment with %{shrug}"
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4428,7 +4502,7 @@ msgid "Application was successfully destroyed."
msgstr ""
msgid "Application was successfully updated."
-msgstr ""
+msgstr "L'application a été mise à jour avec succès."
msgid "Application: %{name}"
msgstr "Application : %{name}"
@@ -4804,7 +4878,7 @@ msgstr "Projet archivé ! Le dépôt et les autres ressources du projet sont e
msgid "Archived projects"
msgstr "Projets archivés"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,9 +4982,12 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Voulezâ€vous vraiment supprimer %{group_name} ?"
-msgid "Are you sure you want to remove the attachment?"
+msgid "Are you sure you want to remove %{topic_name}?"
msgstr ""
+msgid "Are you sure you want to remove the attachment?"
+msgstr "Êtes-vous sûr de vouloir supprimer la pièce jointe?"
+
msgid "Are you sure you want to remove the license?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Êtesâ€vous sûr·e de vouloir réinitialiser le jeton de bilan de santé ?"
@@ -5043,6 +5123,9 @@ msgstr "Attribuer des étiquettes"
msgid "Assign milestone"
msgstr "Attribuer un jalon"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5080,10 +5163,10 @@ msgid "Assigned projects"
msgstr ""
msgid "Assigned to %{assigneeName}"
-msgstr ""
+msgstr "Assigné à %{assigneeName}"
msgid "Assigned to %{assignee_name}"
-msgstr ""
+msgstr "Assigné à %{assignee_name}"
msgid "Assigned to me"
msgstr "Assigné à moi"
@@ -5109,7 +5192,7 @@ msgid "Assignee(s)"
msgstr "Assigné·e(s)"
msgid "Assignees"
-msgstr ""
+msgstr "Assigné(e)s"
msgid "Assigns %{assignee_users_sentence}."
msgstr ""
@@ -5136,13 +5219,10 @@ msgid "At risk"
msgstr ""
msgid "Attach a file"
-msgstr ""
-
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Attachez un fichier par glisserâ€déposer ou %{upload_link}"
+msgstr "Joindre un fichier"
msgid "Attaching File - %{progress}"
-msgstr ""
+msgstr "Ajout du fichier en pièce-jointe - %{progress}"
msgid "Attaching a file"
msgid_plural "Attaching %d files"
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "août"
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -5849,7 +5941,7 @@ msgid "BillingPlans|Free forever features for individual users"
msgstr ""
msgid "BillingPlans|Free guest users"
-msgstr ""
+msgstr "Utilisateurs invités à titre gratuit"
msgid "BillingPlans|Free upgrade!"
msgstr ""
@@ -6104,7 +6196,7 @@ msgid "Billing|Direct memberships"
msgstr ""
msgid "Billing|Enter at least three characters to search."
-msgstr ""
+msgstr "Entrez au moins trois caractères pour faire une recherche."
msgid "Billing|Explore all plans"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Importation d’un serveur Bitbucket"
@@ -6241,10 +6339,10 @@ msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
msgid "BoardScope|An error occurred while searching for labels, please try again."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la recherche des étiquettes, veuillez réessayer."
msgid "BoardScope|An error occurred while searching for users, please try again."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la recherche d'utilisateurs, veuillez réessayer."
msgid "BoardScope|Any Milestone"
msgstr ""
@@ -6280,31 +6378,31 @@ msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
-msgstr ""
+msgstr "Jalon"
msgid "BoardScope|No iteration"
msgstr ""
msgid "BoardScope|No milestone"
-msgstr ""
+msgstr "Aucun jalon"
msgid "BoardScope|Search iterations"
msgstr ""
msgid "BoardScope|Search milestones"
-msgstr ""
+msgstr "Rechercher des jalons"
msgid "BoardScope|Select assignee"
-msgstr ""
+msgstr "Sélectionner une personne assignée"
msgid "BoardScope|Select iteration"
msgstr ""
msgid "BoardScope|Select labels"
-msgstr ""
+msgstr "Sélectionner des étiquettes"
msgid "BoardScope|Select milestone"
-msgstr ""
+msgstr "Sélectionner un jalon"
msgid "BoardScope|Select weight"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6617,10 +6718,10 @@ msgid "Breadcrumbs"
msgstr ""
msgid "Broadcast Message was successfully created."
-msgstr ""
+msgstr "Le message de diffusion a été créé avec succès."
msgid "Broadcast Message was successfully updated."
-msgstr ""
+msgstr "Le message de diffusion a été mis à jour avec succès."
msgid "Broadcast Messages"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -6979,10 +7089,10 @@ msgid "CICD|instance enabled"
msgstr "instance activée"
msgid "CLOSED"
-msgstr ""
+msgstr "FERMÉ"
msgid "CLOSED (MOVED)"
-msgstr ""
+msgstr "FERMÉ (DÉPLACÉ)"
msgid "CODEOWNERS rule violation"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7288,13 +7401,13 @@ msgid "Change branches"
msgstr ""
msgid "Change label"
-msgstr ""
+msgstr "Modifier l'étiquette"
msgid "Change made by"
msgstr ""
msgid "Change milestone"
-msgstr ""
+msgstr "Changer de jalon"
msgid "Change path"
msgstr ""
@@ -7318,7 +7431,7 @@ msgid "Change template"
msgstr "Changer de modèle"
msgid "Change title"
-msgstr ""
+msgstr "Modifier le titre"
msgid "Change your password"
msgstr ""
@@ -7333,7 +7446,7 @@ msgid "ChangeReviewer|Reviewer changed to %{new}"
msgstr ""
msgid "ChangeReviewer|Unassigned"
-msgstr ""
+msgstr "Non assigné(s)"
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Picorer"
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8002,7 +8118,7 @@ msgid "Clear health status"
msgstr ""
msgid "Clear recent searches"
-msgstr ""
+msgstr "Effacer les recherches récentes"
msgid "Clear repository checks"
msgstr ""
@@ -8116,7 +8232,7 @@ msgid "Close"
msgstr "Fermer"
msgid "Close %{issueType}"
-msgstr ""
+msgstr "Fermer %{issueType}"
msgid "Close %{noteable}"
msgstr ""
@@ -8131,7 +8247,7 @@ msgid "Close epic"
msgstr "Clore l’épopée"
msgid "Close milestone"
-msgstr ""
+msgstr "Fermer le jalon"
msgid "Close sidebar"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Tickets clos"
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8317,7 +8550,7 @@ msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
-msgstr ""
+msgstr "Créé par"
msgid "ClusterAgents|Created by %{name} %{time}"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Choisissez lequel de vos environnements utilisera cette grappe de serveurs."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr "Le saviezâ€vous ?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9039,7 +9284,7 @@ msgid "Comment form position"
msgstr "Position du formulaire de commentaire"
msgid "Comment is being updated"
-msgstr ""
+msgstr "Le commentaire est en cours de mise à jour"
msgid "Comment on lines %{startLine} to %{endLine}"
msgstr ""
@@ -9134,7 +9379,7 @@ msgid "Committed by"
msgstr "Commit de"
msgid "Community forum"
-msgstr ""
+msgstr "Forum de la communauté"
msgid "Company"
msgstr ""
@@ -9344,7 +9589,7 @@ msgid "Confidential issue"
msgstr ""
msgid "Confidential note"
-msgstr ""
+msgstr "Note confidentielle"
msgid "Confidentiality"
msgstr "Confidentialité"
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,12 +9663,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-msgstr "Configurer le traçage"
-
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 advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr ""
@@ -9610,9 +9858,6 @@ msgstr "Registre de conteneur"
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9875,7 +10120,7 @@ msgid "ContainerRegistry|Something went wrong while updating the cleanup policy.
msgstr ""
msgid "ContainerRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche."
msgid "ContainerRegistry|Tag successfully marked for deletion."
msgstr ""
@@ -9944,7 +10189,7 @@ msgid "ContainerRegistry|This project's cleanup policy for tags is not enabled."
msgstr ""
msgid "ContainerRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "Pour élargir votre recherche, modifiez ou supprimez les filtres ci-dessus."
msgid "ContainerRegistry|We are having trouble connecting to the Container Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
msgstr ""
@@ -10538,7 +10783,7 @@ msgid "Create merge request and branch"
msgstr "Créer une demande de fusion et une branche"
msgid "Create milestone"
-msgstr ""
+msgstr "Créer un jalon"
msgid "Create new"
msgstr ""
@@ -10570,11 +10815,14 @@ msgstr "Créer une nouvelle étiquette"
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
msgid "Create or close an issue."
-msgstr ""
+msgstr "Créer ou fermer un ticket."
msgid "Create or import your first project"
msgstr ""
@@ -10778,19 +11026,19 @@ msgid "Created branch '%{branch_name}' and a merge request to resolve this issue
msgstr ""
msgid "Created by %{job}"
-msgstr ""
+msgstr "Création par %{job}"
msgid "Created by me"
msgstr "Créé par moi"
msgid "Created by:"
-msgstr ""
+msgstr "Créé par:"
msgid "Created compliance violations if any were found"
msgstr ""
msgid "Created date"
-msgstr ""
+msgstr "Date de création"
msgid "Created issue %{issueLink}"
msgstr ""
@@ -10808,7 +11056,7 @@ msgid "Created on"
msgstr "Créé le"
msgid "Created on %{created_at}"
-msgstr ""
+msgstr "Créé le %{created_at}"
msgid "Created on:"
msgstr "Créé le :"
@@ -10970,13 +11218,13 @@ msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
msgid "CurrentUser|Edit profile"
-msgstr ""
+msgstr "Modifier le profil"
msgid "CurrentUser|One of your groups is running out"
msgstr ""
msgid "CurrentUser|Preferences"
-msgstr ""
+msgstr "Préférences"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -11057,10 +11305,10 @@ msgid "Cycle Time"
msgstr ""
msgid "CycleAnalyticsEvent|%{label_reference} label was added to the issue"
-msgstr ""
+msgstr "L'étiquette %{label_reference} a été ajoutée au ticket"
msgid "CycleAnalyticsEvent|%{label_reference} label was added to the merge request"
-msgstr ""
+msgstr "L'étiquette %{label_reference} a été ajoutée à la demande de fusion"
msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the issue"
msgstr ""
@@ -11087,7 +11335,7 @@ msgid "CycleAnalyticsEvent|Issue first mentioned in a commit"
msgstr ""
msgid "CycleAnalyticsEvent|Issue label was added"
-msgstr ""
+msgstr "L'étiquette de ticket a été ajoutée"
msgid "CycleAnalyticsEvent|Issue label was removed"
msgstr ""
@@ -11200,7 +11448,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "CycleAnalytics|Select labels"
-msgstr ""
+msgstr "Sélectionner les étiquettes"
msgid "CycleAnalytics|Show"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11443,13 +11703,13 @@ msgid "DastProfiles|Do you want to discard your changes?"
msgstr ""
msgid "DastProfiles|Edit profile"
-msgstr ""
+msgstr "Modifier le profil"
msgid "DastProfiles|Edit scanner profile"
msgstr ""
msgid "DastProfiles|Edit site profile"
-msgstr ""
+msgstr "Modifier le profil de site"
msgid "DastProfiles|Enable Authentication"
msgstr ""
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12093,7 +12353,7 @@ msgid "Delete table"
msgstr ""
msgid "Delete this attachment"
-msgstr ""
+msgstr "Supprimer cette pièce jointe"
msgid "Delete this epic and all descendants?"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr "Détails"
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "Détecter les clefs de l’hôte"
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr "Désactiver pour ce projet"
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13506,7 +13781,7 @@ msgid "Draft: %{filename}"
msgstr ""
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
-msgstr ""
+msgstr "Faites glisser vos designs ici ou %{linkStart}cliquez pour les téléverser%{linkEnd}."
msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr "Éditer"
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13644,7 +13919,7 @@ msgid "Edit Label"
msgstr "Modifier l’étiquette"
msgid "Edit Milestone"
-msgstr ""
+msgstr "Modifier le jalon"
msgid "Edit Password"
msgstr ""
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13725,7 +13997,7 @@ msgid "Edit inline"
msgstr ""
msgid "Edit issues"
-msgstr ""
+msgstr "Modifier les tickets"
msgid "Edit link"
msgstr ""
@@ -13749,7 +14021,7 @@ msgid "Edit this release"
msgstr ""
msgid "Edit title and description"
-msgstr ""
+msgstr "Modifier le titre et la description"
msgid "Edit topic: %{topic_name}"
msgstr ""
@@ -13770,10 +14042,10 @@ msgid "Edit, lint, and visualize your pipeline."
msgstr ""
msgid "Edited"
-msgstr ""
+msgstr "Édité"
msgid "Edited %{timeago}"
-msgstr ""
+msgstr "Édité il y a %{timeago}"
msgid "Editing"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr "Embarquer"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "Activer Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr "Les environnements sont des endroits où le code est déployé, tel que
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Tâche"
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr "En savoir plus sur l’arrêt des environnements"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Nouvel environnement"
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr "Aucun déploiement pour le moment"
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Notez que cette action arrêtera l’environnement, mais n’aura %{emphasisStart}aucun%{emphasisEnd} effet sur les déploiements existants en raison de l’absence de directive « arrêter l’action de l’environnement » dans le fichier de configuration %{ciConfigLinkEnd}.gitlab-ci.yml%{ciConfigLinkStart}."
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr "Ouvrir l’environnement en cours"
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr "Redéployer dans l’environnement"
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr "Restaurer l’environnement"
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr "Tout afficher"
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14583,7 +14813,7 @@ msgid "Epics|Assign Epic"
msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
-msgstr ""
+msgstr "Laisser vide pour hériter des dates du jalon"
msgid "Epics|No start date – %{dueDate}"
msgstr ""
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "Tout le monde peut contribuer"
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15302,7 +15541,7 @@ msgid "Explore snippets"
msgstr ""
msgid "Explore topics"
-msgstr ""
+msgstr "Explorer les sujets"
msgid "Export"
msgstr ""
@@ -15311,7 +15550,7 @@ msgid "Export %{requirementsCount} requirements?"
msgstr ""
msgid "Export as CSV"
-msgstr ""
+msgstr "Exporter en CSV"
msgid "Export commit custody report"
msgstr ""
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr "Échec"
msgid "Failed Jobs"
msgstr "Tâches ayant échoué"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -15670,7 +15917,7 @@ msgid "Failed to save new settings"
msgstr ""
msgid "Failed to save preferences (%{error_message})."
-msgstr ""
+msgstr "Impossible d'enregistrer les préférences (%{error_message})."
msgid "Failed to save preferences."
msgstr ""
@@ -16074,10 +16321,10 @@ msgid "Filter by milestone"
msgstr ""
msgid "Filter by milestone name"
-msgstr ""
+msgstr "Filtrer par nom de jalon"
msgid "Filter by name"
-msgstr ""
+msgstr "Filtrer par nom"
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr "Rechercher par chemin d’accès"
msgid "Find file"
msgstr "Rechercher un fichier"
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr "Empreintes"
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "Pour plus d’informations, consultez "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16648,7 +16895,7 @@ msgid "Geo|Filter Geo sites"
msgstr ""
msgid "Geo|Filter by name"
-msgstr ""
+msgstr "Filtrer par nom"
msgid "Geo|Filter by status"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr "En attente de vérification"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "Le projet (identifiant : %{project_id}) n’existe plus sur le primaire. Vous pouvez supprimer cette entrée en toute sécurité, car cela ne supprimera aucune donnée sur le disque."
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "Synchronisé"
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17026,7 +17261,7 @@ msgid "Geo|Unknown state"
msgstr "État inconnu"
msgid "Geo|Updated %{timeAgo}"
-msgstr ""
+msgstr "Mis à jour %{timeAgo}"
msgid "Geo|Verification"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr "Version de Git"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "Importation depuis GitLab"
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,55 +17728,70 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
+msgstr "%{count} résultats par défaut fournis. Utilisez les touches fléchées haut et bas pour parcourir la liste des résultats de la recherche."
+
+msgid "GlobalSearch|Groups"
msgstr ""
msgid "GlobalSearch|Issues I've created"
-msgstr ""
+msgstr "Tickets que j'ai créés"
msgid "GlobalSearch|Issues assigned to me"
-msgstr ""
+msgstr "Tickets qui me sont assignés"
msgid "GlobalSearch|Merge requests I've created"
-msgstr ""
+msgstr "Demandes de fusion que j'ai créées"
msgid "GlobalSearch|Merge requests assigned to me"
-msgstr ""
+msgstr "Demandes de fusion qui me sont assignées"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
+msgstr "Demandes de fusion dont je suis un relecteur"
+
+msgid "GlobalSearch|Projects"
msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
-msgstr ""
+msgstr "Résultats mis à jour. %{count} résultats disponibles. Utilisez les touches fléchées haut et bas pour parcourir la liste des résultats de la recherche, ou ENTRÉE pour envoyer."
msgid "GlobalSearch|Search GitLab"
-msgstr ""
+msgstr "Rechercher sur GitLab"
msgid "GlobalSearch|Search for projects, issues, etc."
-msgstr ""
+msgstr "Rechercher des projets, des tickets etc."
msgid "GlobalSearch|Search results are loading"
-msgstr ""
+msgstr "Les résultats de la recherche sont en cours de chargement"
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la récupération des suggestions d'autocomplétion de recherche."
msgid "GlobalSearch|Type and press the enter key to submit search."
-msgstr ""
+msgstr "Écrivez puis appuyez sur la touche Entrée pour soumettre la recherche."
msgid "GlobalSearch|Type for new suggestions to appear below."
+msgstr "Écrivez pour faire apparaître de nouvelles suggestions ci-dessous"
+
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
msgstr ""
msgid "GlobalSearch|What are you searching for?"
+msgstr "Que recherchez-vous ?"
+
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17518,7 +17807,7 @@ msgid "Go back"
msgstr "Retour"
msgid "Go back (while searching for files)"
-msgstr ""
+msgstr "Revenir en arrière (lors de la recherche de fichiers)"
msgid "Go back to configuration"
msgstr ""
@@ -17575,10 +17864,10 @@ msgid "Go to metrics"
msgstr ""
msgid "Go to next page"
-msgstr ""
+msgstr "Aller à la page suivante"
msgid "Go to next unresolved thread"
-msgstr ""
+msgstr "Aller au sujet non résolu suivant"
msgid "Go to page %{page}"
msgstr ""
@@ -17590,7 +17879,7 @@ msgid "Go to parent directory"
msgstr ""
msgid "Go to previous page"
-msgstr ""
+msgstr "Aller à la page précédente"
msgid "Go to previous unresolved thread"
msgstr ""
@@ -17632,7 +17921,7 @@ msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict mem
msgstr ""
msgid "Go to the milestone list"
-msgstr ""
+msgstr "Aller à la liste des jalons"
msgid "Go to the project's activity feed"
msgstr ""
@@ -17644,7 +17933,7 @@ msgid "Go to wiki"
msgstr ""
msgid "Go to your To-Do list"
-msgstr ""
+msgstr "Aller à votre liste de tâches"
msgid "Go to your fork"
msgstr ""
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr "Groupe"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr "Le groupe « %{group_name} » a été mis à jour avec succès."
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "Groupe : %{group_name}"
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
+msgstr ""
+
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
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|Prevent forking outside of the group"
+msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr "Ce paramètre s’applique au groupe %{ancestor_group}. Vous pouvez écr
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18683,7 +18984,7 @@ msgid "HarborRegistry|Root image"
msgstr ""
msgid "HarborRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche."
msgid "HarborRegistry|The filter returned no results"
msgstr ""
@@ -18701,7 +19002,7 @@ msgid "HarborRegistry|This image has no active tags"
msgstr ""
msgid "HarborRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "Pour élargir votre recherche, modifiez ou supprimez les filtres ci-dessus."
msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
msgstr ""
@@ -18851,7 +19152,7 @@ msgid "Hide Live Preview"
msgstr ""
msgid "Hide archived projects"
-msgstr ""
+msgstr "Masquer les projets archivés"
msgid "Hide chart"
msgid_plural "Hide charts"
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20184,7 +20533,7 @@ msgid "IncidentManagement|Triggered"
msgstr ""
msgid "IncidentManagement|Unassigned"
-msgstr ""
+msgstr "Non assigné(s)"
msgid "IncidentManagement|Unknown"
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20927,13 +21306,13 @@ msgid "Invite \"%{trimmed}\" by email"
msgstr ""
msgid "Invite Members"
-msgstr ""
+msgstr "Inviter des membres"
msgid "Invite a group"
msgstr ""
msgid "Invite members"
-msgstr ""
+msgstr "Inviter des membres"
msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{project_or_group} as a %{role}"
msgstr ""
@@ -21017,13 +21396,13 @@ msgid "InviteMembersModal|How about inviting a colleague or two to join you?"
msgstr ""
msgid "InviteMembersModal|Invite"
-msgstr ""
+msgstr "Inviter"
msgid "InviteMembersModal|Invite a group"
-msgstr ""
+msgstr "Inviter un groupe"
msgid "InviteMembersModal|Invite members"
-msgstr ""
+msgstr "Inviter des membres"
msgid "InviteMembersModal|Manage members"
msgstr ""
@@ -21031,11 +21410,14 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
-msgid "InviteMembersModal|Search for a group to invite"
+msgid "InviteMembersModal|Review the invite errors and try again:"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr "Rechercher un groupe à inviter"
+
msgid "InviteMembersModal|Select a group to invite"
-msgstr ""
+msgstr "Sélectionnez un groupe à inviter"
msgid "InviteMembersModal|Select a role"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21089,7 +21476,7 @@ msgid "InviteMembersModal|You've reached your %{count} %{members} limit for your
msgstr ""
msgid "InviteMembers|Invite a group"
-msgstr ""
+msgstr "Inviter un groupe"
msgid "InviteMembers|Invite team members"
msgstr ""
@@ -21104,7 +21491,7 @@ msgid "InviteMember|Invite another member"
msgstr ""
msgid "InviteMember|Invite members"
-msgstr ""
+msgstr "Inviter des membres"
msgid "InviteMember|Invite your team"
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21203,10 +21593,10 @@ msgid "Is using seat"
msgstr ""
msgid "IssuableStatus|Closed"
-msgstr ""
+msgstr "Fermé"
msgid "IssuableStatus|Closed (%{link})"
-msgstr ""
+msgstr "Fermé (%{link})"
msgid "IssuableStatus|duplicated"
msgstr ""
@@ -21272,7 +21662,7 @@ msgid "Issue update failed"
msgstr ""
msgid "Issue was closed by %{name} %{reason}"
-msgstr ""
+msgstr "Le ticket a été fermé par %{name} %{reason}"
msgid "Issue weight"
msgstr ""
@@ -21284,7 +21674,7 @@ msgid "IssueAnalytics|Assignees"
msgstr ""
msgid "IssueAnalytics|Created by"
-msgstr ""
+msgstr "Créé par"
msgid "IssueAnalytics|Due date"
msgstr ""
@@ -21326,7 +21716,7 @@ msgid "IssueBoards|Switch board"
msgstr ""
msgid "IssueList|created %{timeAgoString} by %{user}"
-msgstr ""
+msgstr "créé %{timeAgoString} par %{user}"
msgid "IssueTracker|Custom issue tracker"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21425,10 +21809,10 @@ msgid "IssuesAnalytics|Avg/Month:"
msgstr ""
msgid "IssuesAnalytics|Issues created"
-msgstr ""
+msgstr "Tickets créés"
msgid "IssuesAnalytics|Issues created per month"
-msgstr ""
+msgstr "Tickets créés par mois"
msgid "IssuesAnalytics|Last 12 months"
msgstr "Les 12 derniers mois"
@@ -21446,7 +21830,7 @@ msgid "IssuesAnalytics|Total:"
msgstr ""
msgid "Issue|Title"
-msgstr ""
+msgstr "Titre"
msgid "It is not possible to %{action} files that are stored in LFS using the web interface"
msgstr ""
@@ -21638,7 +22022,7 @@ msgid "Iterations|This will remove the iteration from any issues that are assign
msgstr ""
msgid "Iterations|Title"
-msgstr ""
+msgstr "Titre"
msgid "Iterations|To convert this cadence to automatic scheduling, add a duration and number of upcoming iterations. The upgrade is irreversible."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr "URL Jaeger"
-
msgid "Jan"
msgstr "janv."
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr "La tâche a été effacée"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "Garder"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr "Faire défiler vers le bas"
msgid "Job|Scroll to top"
msgstr "Faire défiler vers le haut"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr "Afficher la version brute"
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22214,7 +22622,7 @@ msgid "Key: %{key}"
msgstr ""
msgid "Keyboard shortcuts"
-msgstr ""
+msgstr "Raccourcis clavier"
msgid "KeyboardKey|Alt"
msgstr ""
@@ -22235,10 +22643,10 @@ msgid "KeyboardKey|Shift"
msgstr ""
msgid "KeyboardShortcuts|No shortcuts matched your search"
-msgstr ""
+msgstr "Aucun raccourci ne correspond à votre recherche"
msgid "KeyboardShortcuts|Search keyboard shortcuts"
-msgstr ""
+msgstr "Rechercher dans les raccourcis clavier"
msgid "Keys"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr "Grappe de serveurs Kubernetes"
@@ -22330,14 +22735,19 @@ msgstr "Étiquette"
msgid "Label actions dropdown"
msgstr "Menu déroulant des actions sur les étiquettes"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
-msgstr ""
+msgstr "Priorité de l'étiquette"
msgid "Label was created"
msgstr ""
msgid "Label was removed"
-msgstr ""
+msgstr "L'étiquette a été supprimée"
msgid "Label was successfully updated."
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr "En savoir plus"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,23 +23039,23 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
-msgstr ""
+msgstr "Créez ou importez votre premier dépôt dans votre nouveau projet."
msgid "LearnGitLab|Create/import issues (tickets) to collaborate on ideas and plan work."
msgstr ""
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23044,7 +23451,7 @@ msgid "Linked epics"
msgstr ""
msgid "Linked issues"
-msgstr ""
+msgstr "Tickets liés"
msgid "LinkedIn"
msgstr "LinkedIn"
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr "Journaux"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr "Gestion des accès"
-msgid "Manage all notifications"
-msgstr "Gérer toutes les notifications"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "Gérez les applications pouvant utiliser GitLab en tant que fournisseur OAuth et les applications que vous avez autorisées à utiliser votre compte."
@@ -23389,7 +23787,7 @@ msgid "Manifest import"
msgstr ""
msgid "Manual"
-msgstr ""
+msgstr "Manuel"
msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
msgstr ""
@@ -23410,7 +23808,7 @@ msgid "March"
msgstr "mars"
msgid "Mark as done"
-msgstr ""
+msgstr "Marquer comme fait"
msgid "Mark as draft"
msgstr ""
@@ -23425,7 +23823,7 @@ msgid "Mark this issue as related to another issue"
msgstr ""
msgid "Mark to do as done"
-msgstr ""
+msgstr "Marquer comme fait"
msgid "Markdown Help"
msgstr ""
@@ -23461,7 +23859,7 @@ msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
msgstr ""
msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
+msgstr "Prend en charge le %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23482,11 +23883,14 @@ msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
msgid "Marked to do as done."
-msgstr ""
+msgstr "Marqué comme fait."
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23494,7 +23898,7 @@ msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
msgid "Marks to do as done."
-msgstr ""
+msgstr "Marque comme fait."
msgid "Mask variable"
msgstr ""
@@ -23915,7 +24319,7 @@ msgid "Members|Expiration date removed successfully."
msgstr ""
msgid "Members|Expiration date updated successfully."
-msgstr ""
+msgstr "La date d'expiration a été mise à jour avec succès."
msgid "Members|Filter groups"
msgstr ""
@@ -23954,7 +24358,7 @@ msgid "Members|Search groups"
msgstr ""
msgid "Members|Search invited"
-msgstr ""
+msgstr "Rechercher les invités"
msgid "Member|Deny access"
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr "Aucun fichier trouvé"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "Libellé de l’axe Y"
@@ -24657,7 +25067,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Milestone due date"
-msgstr ""
+msgstr "Date d'échéance du jalon"
msgid "Milestone lists not available with your current license"
msgstr "La liste des jalons n’est pas disponible avec votre licence actuelle"
@@ -24687,13 +25097,13 @@ msgid "MilestoneCombobox|Select milestone"
msgstr ""
msgid "MilestoneSidebar|Closed:"
-msgstr ""
+msgstr "Fermé:"
msgid "MilestoneSidebar|Copy reference"
msgstr ""
msgid "MilestoneSidebar|Due date"
-msgstr ""
+msgstr "Date d'échéance"
msgid "MilestoneSidebar|Edit"
msgstr ""
@@ -24717,13 +25127,13 @@ msgid "MilestoneSidebar|New issue"
msgstr ""
msgid "MilestoneSidebar|No due date"
-msgstr ""
+msgstr "Aucune date d'échéance"
msgid "MilestoneSidebar|No start date"
msgstr ""
msgid "MilestoneSidebar|None"
-msgstr ""
+msgstr "Aucun"
msgid "MilestoneSidebar|Open:"
msgstr ""
@@ -24810,7 +25220,7 @@ msgid "Milestones|This action cannot be reversed."
msgstr "Cette action ne peut pas être annulée."
msgid "Milestones|Unstarted Issues (open and unassigned)"
-msgstr ""
+msgstr "Tickets non commencés (ouverts et non attribués)"
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25080,6 +25502,9 @@ msgid "My topic"
msgstr ""
msgid "My-Reaction"
+msgstr "Ma réaction"
+
+msgid "NEW"
msgstr ""
msgid "Name"
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,18 +25787,15 @@ msgstr "Nouvelle épopée"
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Nouveau fichier"
msgid "New group"
msgstr "Nouveau groupe"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25426,13 +25845,13 @@ msgid "New project pages"
msgstr ""
msgid "New project/repository"
-msgstr ""
+msgstr "Nouveau projet/dépôt"
msgid "New public deploy key"
msgstr ""
msgid "New related %{issueType}"
-msgstr ""
+msgstr "Nouveau %{issueType} lié"
msgid "New release"
msgstr ""
@@ -25470,17 +25889,14 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr "Nouveau…"
-
msgid "Newest first"
-msgstr ""
+msgstr "Plus récent en premier"
msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
-msgstr ""
+msgstr "Suivant"
msgid "Next commit"
msgstr ""
@@ -25498,7 +25914,7 @@ msgid "Next unresolved discussion"
msgstr ""
msgid "Next update"
-msgstr ""
+msgstr "Prochaine mise à jour"
msgid "Nickname"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25543,7 +25962,7 @@ msgid "No artifacts found"
msgstr ""
msgid "No assignee"
-msgstr ""
+msgstr "Aucune personne assignée"
msgid "No attention request"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr "Aucune branche trouvée"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Aucun changement"
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Aucune connexion n’a pu être établie avec un serveur Gitaly, veuillez vérifier votre journal !"
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25663,7 +26082,7 @@ msgid "No jobs to show"
msgstr ""
msgid "No label"
-msgstr ""
+msgstr "Aucun étiquette"
msgid "No labels with such name or description"
msgstr "Aucune étiquette avec un tel nom ou une telle description"
@@ -25674,6 +26093,9 @@ msgstr "Aucune licence. Tous droits réservés"
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "Aucun dépôt"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25836,7 +26258,7 @@ msgid "Non-admin users are restricted to read-only access, in both GitLab UI and
msgstr ""
msgid "None"
-msgstr ""
+msgstr "Aucun"
msgid "None of the group milestones have the same project as the release"
msgstr ""
@@ -25869,7 +26291,7 @@ msgid "Not available for protected branches"
msgstr "Non disponible pour les branches protégées"
msgid "Not confidential"
-msgstr ""
+msgstr "Non confidentiel"
msgid "Not found"
msgstr ""
@@ -25920,7 +26342,7 @@ msgid "NoteForm|Note"
msgstr ""
msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
+msgstr "Prend en charge le %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Pour les %{quickActionsDocsLinkStart}actions rapides%{quickActionsDocsLinkEnd}, tapez %{keyboardStart}/%{keyboardEnd}."
msgid "Notes"
msgstr ""
@@ -25937,12 +26359,18 @@ msgstr "Souhaitezâ€vous réellement annuler la création de ce commentaire ?"
msgid "Notes|Collapse replies"
msgstr "Réduire les réponses"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
-msgid "Notes|Make this an internal note"
+msgid "Notes|Last reply by %{name}"
msgstr ""
+msgid "Notes|Make this an internal note"
+msgstr "Rendre ce commentaire interne"
+
msgid "Notes|Show all activity"
msgstr "Afficher toute l’activité"
@@ -26083,45 +26511,96 @@ msgstr "Notifications désactivées"
msgid "Notifications on"
msgstr "Notifications activées"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
-msgstr ""
+msgstr "Le ticket de %{author_link} arrive bientôt à échéance %{issue_reference_link}."
+
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr "%{commit_link} dans %{mr_link}"
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr "L'assignation est passée de %{fromNames} à %{toNames}"
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr "Assignation passée à %{toNames}"
msgid "Notify|Author: %{author_name}"
+msgstr "Auteur : %{author_name}"
+
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
msgstr ""
-msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
msgstr ""
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr "Le ticket a été %{issue_status} par %{updated_by}"
+
msgid "Notify|Issue was moved to another project."
+msgstr "Le ticket a été déplacé vers un autre projet."
+
+msgid "Notify|Learn more about Auto DevOps"
msgstr ""
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
-msgstr ""
+msgstr "La demande de fusion %{merge_request} ne peut plus être fusionnée en raison d'un conflit."
msgid "Notify|Merge request %{merge_request} was %{mr_status}"
-msgstr ""
+msgstr "La demande de fusion %{merge_request} a été %{mr_status}"
msgid "Notify|Merge request %{merge_request} was %{mr_status} by %{updated_by}"
-msgstr ""
+msgstr "La demande de fusion %{merge_request} a été %{mr_status} par %{updated_by}"
msgid "Notify|Merge request %{merge_request} was merged"
-msgstr ""
+msgstr "La demande de fusion %{merge_request} a été fusionnée"
+
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr "Notify|La demande de fusion %{mr_link} a été fermée par %{closed_by}"
msgid "Notify|Merge request URL: %{merge_request_url}"
-msgstr ""
+msgstr "URL de la demande de fusion : %{merge_request_url}"
+
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr "Le jalon a été changé à %{milestone}"
msgid "Notify|New issue: %{project_issue_url}"
+msgstr "Nouveau ticket : %{project_issue_url}"
+
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr "Pipeline %{pipeline_link} déclenché par"
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
msgstr ""
msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr "Ce ticket arrive à échéance le: %{issue_due_date}"
+
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
msgstr ""
msgid "Notify|You don't have access to the project."
+msgstr "Vous n'avez pas accès au projet."
+
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
msgstr ""
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr "a terminé %{jobs} avec succès en %{stages}."
+
msgid "Nov"
msgstr "nov."
@@ -26204,7 +26683,7 @@ msgid "Okay"
msgstr ""
msgid "Oldest first"
-msgstr ""
+msgstr "Plus ancien en premier"
msgid "OmniAuth"
msgstr ""
@@ -26435,7 +26914,7 @@ msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
msgstr ""
msgid "OnDemandScans|Edit %{profileType} profile"
-msgstr ""
+msgstr "Modifier %{profileType} profil"
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr ""
@@ -26444,7 +26923,7 @@ msgid "OnDemandScans|Edit on-demand scan"
msgstr ""
msgid "OnDemandScans|Edit profile"
-msgstr ""
+msgstr "Modifier le profil"
msgid "OnDemandScans|Enable scan schedule"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] "Un élément de plus"
msgstr[1] "%d éléments de plus"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "Le tableau de bord des opérations fournit un résumé de l’état de santé opérationnel de chaque projet, comprenant les états des pipelines et des alertes."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr "Options"
msgid "Or you can choose one of the suggested colors below"
msgstr "Ou vous pouvez choisir l’une des couleurs suggérées ciâ€dessous"
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26875,10 +27366,10 @@ msgid "Owned by %{image_tag}"
msgstr ""
msgid "Owned by anyone"
-msgstr ""
+msgstr "Appartenant à n'importe qui"
msgid "Owned by me"
-msgstr ""
+msgstr "M'appartenant"
msgid "Owned by:"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr "Propriétaire"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,9 +27757,12 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
-msgid "PackageRegistry|Sorry, your filter produced no results"
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
msgstr ""
+msgid "PackageRegistry|Sorry, your filter produced no results"
+msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche."
+
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
@@ -27288,7 +27788,7 @@ msgid "PackageRegistry|This NuGet package has no dependencies."
msgstr ""
msgid "PackageRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "Pour élargir votre recherche, modifiez ou supprimez les filtres ci-dessus."
msgid "PackageRegistry|Type"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27375,10 +27872,10 @@ msgid "Pagination|Last »"
msgstr "Dernière ⇥"
msgid "Pagination|Next"
-msgstr ""
+msgstr "Suivant"
msgid "Pagination|Prev"
-msgstr ""
+msgstr "Précédent"
msgid "Pagination|« First"
msgstr "⇤ Première"
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27558,7 +28049,7 @@ msgid "People without permission will never get a notification."
msgstr ""
msgid "Per your subscription agreement with GitLab, you must report your license usage data on a monthly basis. GitLab uses this data to keep your subscription up to date. To report your license usage data, export your license usage file and email it to %{renewal_service_email}. If you need an updated license, GitLab will send the license to the email address registered in the %{customers_dot}, and you can upload this license to your instance."
-msgstr ""
+msgstr "Conformément aux termes de votre contrat d'abonnement avec GitLab, vous devez communiquer vos données d'utilisation de licences à une fréquence mensuelle. GitLab utilise ces données pour maintenir votre abonnement à jour. Pour ce faire, exportez votre fichier d'utilisation de licence et envoyez-le par courriel à %{renewal_service_email}. Si une mise à jour de la licence est nécessaire, GitLab vous enverra celle-ci à l'adresse de courriel enregistrée dans le %{customers_dot} et vous pourrez la téléverser sur votre instance."
msgid "Percent rollout must be an integer number between 0 and 100"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Lancer"
@@ -28658,12 +29182,6 @@ msgstr "Veuillez patienter pendant la connexion à votre dépôt. Actualisez à
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Veuillez patienter pendant l’importation de votre dépôt. Actualisez à votre guise."
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28698,7 +29216,7 @@ msgid "Polling interval multiplier"
msgstr ""
msgid "Popularity"
-msgstr ""
+msgstr "Popularité"
msgid "Port"
msgstr ""
@@ -28719,7 +29237,7 @@ msgid "Preferences"
msgstr "Préférences"
msgid "Preferences saved."
-msgstr ""
+msgstr "Préférences enregistrées."
msgid "Preferences|Behavior"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr "Couleurs du thème"
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28755,7 +29276,7 @@ msgid "Preferences|Diff colors"
msgstr ""
msgid "Preferences|Display time in 24-hour format"
-msgstr ""
+msgstr "Afficher l'heure au format 24 heures"
msgid "Preferences|Enable Gitpod integration"
msgstr ""
@@ -28767,7 +29288,7 @@ msgid "Preferences|Failed to save preferences."
msgstr ""
msgid "Preferences|For example: 30 minutes ago."
-msgstr ""
+msgstr "Par exemple : il y a 30 minutes."
msgid "Preferences|Gitpod"
msgstr ""
@@ -28787,11 +29308,8 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr "Thème de navigation"
-
msgid "Preferences|Preview"
-msgstr ""
+msgstr "Aperçu"
msgid "Preferences|Project overview content"
msgstr ""
@@ -28821,13 +29339,13 @@ msgid "Preferences|This feature is experimental and translations are not yet com
msgstr ""
msgid "Preferences|This setting allows you to customize the appearance of the syntax."
-msgstr ""
+msgstr "Ce paramètre vous permet de personnaliser l'apparence de la syntaxe."
msgid "Preferences|This setting allows you to customize the behavior of the system layout and default views."
msgstr ""
msgid "Preferences|Time preferences"
-msgstr ""
+msgstr "Préférences de l’heure"
msgid "Preferences|Use relative times"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr "Aperçu de la charge utile"
@@ -28911,13 +29429,13 @@ msgid "Prioritized label"
msgstr "Étiquette prioritaire"
msgid "Priority"
-msgstr ""
+msgstr "Priorité"
msgid "Private"
msgstr ""
msgid "Private - Guest users are not allowed to view detailed release information like title and source code."
-msgstr ""
+msgstr "Privé - Les utilisateurs invités ne sont pas autorisés à voir les informations de version détaillées telles que la version ou le code source."
msgid "Private - Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "Compte programmé pour suppression."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr "Ajouter un émoji de statut"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr "Choisir un fichier…"
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr "Ne pas montrer sur le profil"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr "Modifier le profil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29238,7 +29756,7 @@ msgid "Profiles|Private contributions"
msgstr "Contributions privées"
msgid "Profiles|Profile was successfully updated"
-msgstr ""
+msgstr "Profil mis à jour avec succès"
msgid "Profiles|Pronouns"
msgstr ""
@@ -29261,13 +29779,13 @@ msgstr "Supprimer l’avatar"
msgid "Profiles|Select a service to sign in with."
msgstr ""
+msgid "Profiles|Service sign-in"
+msgstr ""
+
msgid "Profiles|Set new profile picture"
msgstr "Définir une nouvelle photo de profil"
-msgid "Profiles|Set your local time zone"
-msgstr ""
-
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr "Certaines options ne sont pas disponibles pour les comptes LDAP"
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,25 +29803,25 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "La taille de fichier maximale autorisée est de 200 Kio."
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Cet émoji et ce message apparaîtront sur votre profil et partout dans l’interface."
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
msgstr ""
msgid "Profiles|Title"
-msgstr ""
+msgstr "Titre"
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "Quel est votre statut ?"
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "Votre statut"
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr "URL du projet"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29520,7 +30041,7 @@ msgid "Project info:"
msgstr ""
msgid "Project information"
-msgstr ""
+msgstr "Informations du projet"
msgid "Project is required when cluster_type is :project"
msgstr ""
@@ -29582,6 +30103,9 @@ msgstr "Responsables"
msgid "ProjectCreationLevel|No one"
msgstr "Personne"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nom"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projets partagés avec %{group_name}"
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31110,7 +31649,7 @@ msgid "PushoverService|Get real-time notifications on your device."
msgstr ""
msgid "PushoverService|High priority"
-msgstr ""
+msgstr "Priorité haute"
msgid "PushoverService|Leave blank for all active devices."
msgstr ""
@@ -31119,13 +31658,13 @@ msgid "PushoverService|Leave blank to use your current user key."
msgstr ""
msgid "PushoverService|Low priority"
-msgstr ""
+msgstr "Priorité basse"
msgid "PushoverService|Lowest priority"
-msgstr ""
+msgstr "Priorité la plus basse"
msgid "PushoverService|Normal priority"
-msgstr ""
+msgstr "Priorité normale"
msgid "PushoverService|See project %{project_full_name}"
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 "Actualiser"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31750,7 +32292,7 @@ msgid "Removed %{iteration_reference} iteration."
msgstr ""
msgid "Removed %{label_references} %{label_text}."
-msgstr ""
+msgstr "%{label_references} %{label_text} supprimé."
msgid "Removed %{milestone_reference} milestone."
msgstr ""
@@ -31759,7 +32301,7 @@ msgid "Removed %{reviewer_text} %{reviewer_references}."
msgstr ""
msgid "Removed all labels."
-msgstr ""
+msgstr "Tous les labels ont été supprimés."
msgid "Removed an issue from an epic."
msgstr ""
@@ -31813,7 +32355,7 @@ msgid "Removes %{reviewer_text} %{reviewer_references}."
msgstr ""
msgid "Removes all labels."
-msgstr ""
+msgstr "Supprime toutes les étiquettes."
msgid "Removes an issue from an epic."
msgstr ""
@@ -31858,7 +32400,7 @@ msgid "Reopen"
msgstr ""
msgid "Reopen %{issueType}"
-msgstr ""
+msgstr "Rouvrir %{issueType}"
msgid "Reopen %{noteable}"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31930,7 +32472,7 @@ msgid "Reply…"
msgstr ""
msgid "Report abuse"
-msgstr ""
+msgstr "Signaler un abus"
msgid "Report abuse to admin"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr "Durée d’exécution"
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "Réinitialiser le jeton d’accès au bilan de santé"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Relancer cette tâche"
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33438,7 +34004,7 @@ msgid "Search"
msgstr "Rechercher"
msgid "Search GitLab"
-msgstr ""
+msgstr "Rechercher dans GitLab"
msgid "Search a group"
msgstr ""
@@ -33471,10 +34037,10 @@ msgid "Search by commit title or SHA"
msgstr ""
msgid "Search by message"
-msgstr ""
+msgstr "Rechercher par message"
msgid "Search by name"
-msgstr ""
+msgstr "Rechercher par nom"
msgid "Search files"
msgstr "Rechercher des fichiers"
@@ -33486,10 +34052,10 @@ msgid "Search for a LDAP group"
msgstr ""
msgid "Search for a group"
-msgstr ""
+msgstr "Rechercher un groupe"
msgid "Search for a user"
-msgstr ""
+msgstr "Rechercher un utilisateur"
msgid "Search for an emoji"
msgstr ""
@@ -33549,7 +34115,7 @@ msgid "Search requirements"
msgstr ""
msgid "Search settings"
-msgstr ""
+msgstr "Paramètres de recherche"
msgid "Search users"
msgstr "Rechercher des utilisateurs et utilisatrices"
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34126,7 +34701,7 @@ msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
msgstr ""
msgid "SecurityOrchestration|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche."
msgid "SecurityOrchestration|Source"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34441,7 +35004,7 @@ msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity.
msgstr ""
msgid "SecurityReports|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche."
msgid "SecurityReports|Status"
msgstr ""
@@ -34492,7 +35055,7 @@ msgid "SecurityReports|These vulnerabilities were detected in external sources.
msgstr ""
msgid "SecurityReports|To widen your search, change or remove filters above"
-msgstr ""
+msgstr "Pour élargir votre recherche, modifiez ou supprimez les filtres ci-dessus"
msgid "SecurityReports|Tool"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34588,7 +35154,7 @@ msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll
msgstr ""
msgid "Select a label"
-msgstr ""
+msgstr "Sélectionnez une étiquette"
msgid "Select a milestone"
msgstr ""
@@ -34624,16 +35190,16 @@ msgid "Select all"
msgstr ""
msgid "Select an assignee"
-msgstr ""
+msgstr "Sélectionnez un(e) assigné(e)"
msgid "Select an iteration"
msgstr ""
msgid "Select assignee"
-msgstr ""
+msgstr "Sélectionner une personne assignée"
msgid "Select assignee(s)"
-msgstr ""
+msgstr "Sélectionner une personne assignée"
msgid "Select branch"
msgstr ""
@@ -34660,10 +35226,10 @@ msgid "Select iteration"
msgstr ""
msgid "Select label"
-msgstr ""
+msgstr "Sélectionnez une étiquette"
msgid "Select labels"
-msgstr ""
+msgstr "Sélectionner des étiquettes"
msgid "Select merge moment"
msgstr ""
@@ -34681,7 +35247,7 @@ msgid "Select project to create %{type}"
msgstr ""
msgid "Select project to create issue"
-msgstr ""
+msgstr "Sélectionnez un projet pour créer un ticket"
msgid "Select projects"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr "Sélectionner une branche source"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr "Sélectionner une branche cible"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "Définissez les valeurs par défaut et restreignez les niveaux de visibilité. Configurez les sources d’importation et le protocole d’accès pour Git."
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Configurez votre projet afin de pouvoir pousser et/ou récupérer automatiquement les modifications vers ou depuis un autre dépôt. Les branches, les étiquettes et les commits seront automatiquement synchronisés."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35262,10 +35837,10 @@ msgid "Show all test cases."
msgstr ""
msgid "Show archived projects"
-msgstr ""
+msgstr "Afficher les projets archivés"
msgid "Show archived projects only"
-msgstr ""
+msgstr "Afficher uniquement les projets archivés"
msgid "Show closed epics"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Afficher les modifications des espaces"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "côte à côte"
@@ -35387,7 +36019,7 @@ msgid "Sidebar|No status"
msgstr ""
msgid "Sidebar|None"
-msgstr ""
+msgstr "Aucun"
msgid "Sidekiq job compression threshold (bytes)"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Une erreur est survenue, impossible d’ajouter %{project} au tableau de bord"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35915,7 +36547,7 @@ msgid "Sorry, you have exceeded the maximum browsable page number. Please use th
msgstr ""
msgid "Sorry, your filter produced no results"
-msgstr ""
+msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche"
msgid "Sort by"
msgstr "Trier par"
@@ -35924,22 +36556,22 @@ msgid "Sort direction"
msgstr ""
msgid "Sort direction: Ascending"
-msgstr ""
+msgstr "Sens de tri : Croissant"
msgid "Sort direction: Descending"
-msgstr ""
+msgstr "Sens de tri : Décroissant"
msgid "SortOptions|Blocking"
-msgstr ""
+msgstr "Faisant blocage"
msgid "SortOptions|Closed date"
-msgstr ""
+msgstr "Date de fermeture"
msgid "SortOptions|Closed earlier"
-msgstr ""
+msgstr "Fermetures antérieures"
msgid "SortOptions|Closed recently"
-msgstr ""
+msgstr "Fermetures récentes"
msgid "SortOptions|Created date"
msgstr "Date de création décroissante"
@@ -35954,7 +36586,7 @@ msgid "SortOptions|Due soon"
msgstr "Échéance proche"
msgid "SortOptions|Expired date"
-msgstr ""
+msgstr "Date expirée"
msgid "SortOptions|Label priority"
msgstr "Priorité de l’étiquette"
@@ -35975,22 +36607,22 @@ msgid "SortOptions|Least popular"
msgstr "Popularité croissante"
msgid "SortOptions|Less weight"
-msgstr ""
+msgstr "Poids croissant"
msgid "SortOptions|Manual"
-msgstr ""
+msgstr "Manuel"
msgid "SortOptions|Merged date"
-msgstr ""
+msgstr "Date de fusion"
msgid "SortOptions|Merged earlier"
-msgstr ""
+msgstr "Fusions antérieures"
msgid "SortOptions|Merged recently"
-msgstr ""
+msgstr "Fusions récentes"
msgid "SortOptions|Milestone due date"
-msgstr ""
+msgstr "Date d'échéance du jalon"
msgid "SortOptions|Milestone due later"
msgstr "Jalon avec une échéance lointaine"
@@ -35999,7 +36631,7 @@ msgid "SortOptions|Milestone due soon"
msgstr "Jalon avec une échéance proche"
msgid "SortOptions|More weight"
-msgstr ""
+msgstr "Poids décroissant"
msgid "SortOptions|Most popular"
msgstr "Popularité décroissante"
@@ -36020,13 +36652,13 @@ msgid "SortOptions|Oldest created"
msgstr "Date de création croissante"
msgid "SortOptions|Oldest last activity"
-msgstr ""
+msgstr "Dernière activité la plus ancienne"
msgid "SortOptions|Oldest sign in"
msgstr "Date d’inscription croissante"
msgid "SortOptions|Oldest starred"
-msgstr ""
+msgstr "Étoiles les plus anciennes"
msgid "SortOptions|Oldest updated"
msgstr "Date de mise à jour croissante"
@@ -36038,28 +36670,28 @@ msgid "SortOptions|Priority"
msgstr "Priorité"
msgid "SortOptions|Project"
-msgstr ""
+msgstr "Projet"
msgid "SortOptions|Recent last activity"
-msgstr ""
+msgstr "Dernière activité la plus récente"
msgid "SortOptions|Recent sign in"
msgstr "Date d’inscription décroissante"
msgid "SortOptions|Recently starred"
-msgstr ""
+msgstr "Étoiles les plus récentes"
msgid "SortOptions|Size"
-msgstr ""
+msgstr "Taille"
msgid "SortOptions|Sort by:"
-msgstr ""
+msgstr "Trier par :"
msgid "SortOptions|Sort direction"
-msgstr ""
+msgstr "Sens de tri"
msgid "SortOptions|Stars"
-msgstr ""
+msgstr "Étoiles"
msgid "SortOptions|Start date"
msgstr "Date de début"
@@ -36071,13 +36703,13 @@ msgid "SortOptions|Start soon"
msgstr "Commence bientôt"
msgid "SortOptions|Title"
-msgstr ""
+msgstr "Titre"
msgid "SortOptions|Type"
-msgstr ""
+msgstr "Type"
msgid "SortOptions|Version"
-msgstr ""
+msgstr "Version"
msgid "SortOptions|Weight"
msgstr "Poids"
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36245,7 +36877,7 @@ msgid "Star a label to make it a priority label. Order the prioritized labels to
msgstr "Mettez une étoile sur une étiquette pour en faire une étiquette prioritaire. Ordonnez les étiquettes prioritaires pour changer leurs priorités relatives en les faisant glisser."
msgid "Star labels to start sorting by priority"
-msgstr ""
+msgstr "Mettez des étoiles sur les étiquettes pour les classer par priorité"
msgid "Star toggle failed. Try again later."
msgstr ""
@@ -36395,7 +37027,7 @@ msgid "Status:"
msgstr ""
msgid "Status: %{title}"
-msgstr ""
+msgstr "État : %{title}"
msgid "StatusCheck| %{failed} failed, and %{pending} pending"
msgstr ""
@@ -36562,6 +37194,9 @@ msgstr "Stockage :"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr "Sousâ€groupes"
msgid "Subgroups and projects"
msgstr "Sousâ€groupes et projets"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36620,7 +37258,7 @@ msgid "Submit as spam"
msgstr "Soumettre comme indésirable"
msgid "Submit feedback"
-msgstr ""
+msgstr "Proposer une rétroaction"
msgid "Submit review"
msgstr "Envoyer la revue de code"
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36854,7 +37495,7 @@ msgid "Successfully unlocked"
msgstr ""
msgid "Successfully updated %{last_updated_timeago}."
-msgstr ""
+msgstr "Mise à jour réussie %{last_updated_timeago}."
msgid "Successfully updated the environment."
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37366,7 +38025,7 @@ msgid "TagsPage|Repository has no tags yet."
msgstr "Le dépôt n’a pour le moment aucune étiquette."
msgid "TagsPage|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche."
msgid "TagsPage|Tags"
msgstr "Étiquettes"
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37852,10 +38520,7 @@ msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
-msgstr ""
-
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
+msgstr "Voilà, bien joué!"
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37872,7 +38537,7 @@ msgid "The API key used by GitLab for accessing the Spam Check service endpoint.
msgstr ""
msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
-msgstr ""
+msgstr "L'export CSV sera créé en tâche de fond. Une fois terminé, il sera envoyé en pièce-jointe à %{email}."
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}."
msgstr ""
@@ -37911,7 +38576,7 @@ msgid "The application will be used where the client secret can be kept confiden
msgstr ""
msgid "The associated issue #%{issueId} has been closed as the error is now resolved."
-msgstr ""
+msgstr "Le ticket #%{issueId} associé a été fermé car l'erreur est maintenant résolue."
msgid "The branch for this project has no active pipeline configuration."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr "La planification des pipelines permet l’exécution de pipelines progra
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr "Votre projet est accessible sans aucune authentification."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38398,7 +39057,7 @@ msgid "There are no Spam Logs"
msgstr ""
msgid "There are no abuse reports!"
-msgstr ""
+msgstr "Il n'y a aucun rapport d'abus !"
msgid "There are no archived projects yet"
msgstr "Il n’y a pas encore de projets archivés"
@@ -38460,9 +39119,12 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr "Il n’y a pas encore de projets partagés avec ce groupe"
-msgid "There are no topics to show."
+msgid "There are no secure files yet."
msgstr ""
+msgid "There are no topics to show."
+msgstr "Il n'y a aucun sujet à afficher."
+
msgid "There are no variables yet."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39025,7 +39693,7 @@ msgid "This issue cannot be made public because it belongs to a confidential epi
msgstr ""
msgid "This issue is confidential and should only be visible to team members with at least Reporter access."
-msgstr ""
+msgstr "Ce ticket est confidentiel et ne devrait être visible que par les membres de l’équipe ayant au moins un accès à Rapporteur."
msgid "This issue is currently blocked by the following issues:"
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr "Cette tâche nécessite une action manuelle"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr "Cet exécuteur ne fonctionnera que sur les pipelines déclenchés sur de
msgid "This setting can be overridden in each project."
msgstr "Ce paramètre peut être outrepassé pour chacun des projets."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr "Temps avant qu’un ticket ne soit planifié"
msgid "Time before an issue starts implementation"
msgstr "Temps avant que la résolution du ticket ne débute"
-msgid "Time before enforced"
-msgstr "Durée avant mise en application"
-
msgid "Time between merge request creation and merge/close"
msgstr "Temps entre la création d’une demande de fusion et sa fusion/clôture"
@@ -39423,6 +40082,12 @@ msgstr "Est"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Estimé :"
@@ -39611,7 +40276,7 @@ msgid "Title:"
msgstr ""
msgid "Titles and Descriptions"
-msgstr ""
+msgstr "Titres et descriptions"
msgid "To"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39809,10 +40471,10 @@ msgid "To view usage, refresh this page in a few minutes."
msgstr ""
msgid "To widen your search, change or remove filters above"
-msgstr ""
+msgstr "Pour élargir votre recherche, modifiez ou supprimez les filtres ci-dessus"
msgid "To widen your search, change or remove filters above."
-msgstr ""
+msgstr "Pour élargir votre recherche, modifiez ou supprimez des filtres ci-dessus."
msgid "To-Do"
msgstr ""
@@ -39845,19 +40507,19 @@ msgid "Todos|It's how you always know what to work on next."
msgstr ""
msgid "Todos|Mark all as done"
-msgstr ""
+msgstr "Tout marquer comme terminé"
msgid "Todos|Nothing is on your to-do list. Nice work!"
msgstr ""
msgid "Todos|Undo mark all as done"
-msgstr ""
+msgstr "Annuler tout marquer comme fait"
msgid "Todos|When an issue or merge request is assigned to you, or when you receive a %{strongStart}@mention%{strongEnd} in a comment, this automatically triggers a new item in your To-Do List."
msgstr ""
msgid "Todos|You're all done!"
-msgstr ""
+msgstr "Vous avez terminé !"
msgid "Todos|Your To-Do List shows what to work on next"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "Afficher/masquer la barre latérale"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-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"
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "Dépanner et surveiller votre application grâce au traçage"
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr "Authentification à double facteur"
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr "Impossible de charger le diff. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,14 +41178,14 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
msgstr ""
msgid "Unassigned"
-msgstr ""
+msgstr "Non assigné(e)"
msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
@@ -40570,9 +41232,6 @@ msgstr "Inconnu"
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40763,7 +41416,7 @@ msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
msgid "UpdateProject|Project could not be updated!"
-msgstr ""
+msgstr "Le projet n'a pas pu être mis à jour!"
msgid "UpdateRepositoryStorage|Failed to verify %{type} repository checksum from %{old} to %{new}"
msgstr ""
@@ -40772,13 +41425,13 @@ msgid "UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes"
msgstr ""
msgid "Updated"
-msgstr ""
+msgstr "Mis à jour"
msgid "Updated %{updated_at} by %{updated_by}"
-msgstr ""
+msgstr "Mis à jour %{updated_at} par %{updated_by}"
msgid "Updated date"
-msgstr ""
+msgstr "Date de mise à jour"
msgid "Updating"
msgstr "Mise à jour en cours"
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "Cliquez pour envoyer"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41480,7 +42130,7 @@ msgid "UserProfile|Edit profile"
msgstr "Modifier le profil"
msgid "UserProfile|Explore public groups to find projects to contribute to."
-msgstr ""
+msgstr "Explorez les groupes publics pour trouver des projets pour lesquels contribuer."
msgid "UserProfile|Followers"
msgstr ""
@@ -41537,7 +42187,7 @@ msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user doesn't have any personal projects"
-msgstr ""
+msgstr "Cet utilisateur ne dispose pas de projets personnels"
msgid "UserProfile|This user has a private profile"
msgstr "Cet utilisateur a un profil privé"
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,7 +42307,7 @@ msgid "UsersSelect|Any User"
msgstr ""
msgid "UsersSelect|Assignee"
-msgstr ""
+msgstr "Assigné"
msgid "UsersSelect|No assignee - %{openingTag} assign yourself %{closingTag}"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Nous voulons nous assurer qu’il s’agit bien de vous, merci de confirmer que vous n’êtes pas un robot."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42652,7 +43302,7 @@ msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
-msgstr ""
+msgstr "Un ticket confidentiel est créé, mis à jour, fermé ou rouvert."
msgid "Webhooks|A deployment starts, finishes, fails, or is canceled."
msgstr ""
@@ -42685,7 +43335,7 @@ msgid "Webhooks|A wiki page is created or updated."
msgstr ""
msgid "Webhooks|An issue is created, updated, closed, or reopened."
-msgstr ""
+msgstr "Un ticket est créé, mis à jour, fermé ou rouvert."
msgid "Webhooks|Are you sure you want to delete this group hook?"
msgstr ""
@@ -42865,7 +43515,7 @@ msgid "What would you like to do?"
msgstr ""
msgid "What's new"
-msgstr ""
+msgstr "Nouveautés"
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -43107,7 +43757,7 @@ msgid "Wiki|Create New Page"
msgstr ""
msgid "Wiki|Created date"
-msgstr ""
+msgstr "Date de création"
msgid "Wiki|Edit Page"
msgstr "Modifier cette page"
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43233,25 +43903,25 @@ msgid "Would you like to try auto-generating a branch name?"
msgstr ""
msgid "Write"
-msgstr ""
+msgstr "Rédiger"
msgid "Write a comment or drag your files here…"
msgstr ""
msgid "Write a comment…"
-msgstr ""
+msgstr "Écrire un commentaire…"
msgid "Write a description or drag your files here…"
-msgstr ""
+msgstr "Rédigez une description ou faites glisser vos fichiers ici…"
msgid "Write a description…"
-msgstr ""
+msgstr "Écrivez une description…"
msgid "Write an internal note or drag your files here…"
-msgstr ""
+msgstr "Rédigez une note interne ou faites glisser vos fichiers ici…"
msgid "Write milestone description..."
-msgstr ""
+msgstr "Ecrire une description du jalon ..."
msgid "Write your release notes or drag your files here…"
msgstr ""
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43532,7 +44202,7 @@ msgid "You can now close this window."
msgstr ""
msgid "You can now export your security dashboard to a CSV report."
-msgstr ""
+msgstr "Vous pouvez maintenant exporter votre tableau de bord de sécurité vers un rapport CSV."
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "Vous ne pouvez modifier des fichiers que dans une branche"
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Vous pouvez résoudre le conflit de fusion Git soit en mode interactif, en cliquant sur les boutons « %{use_ours} » ou « %{use_theirs} », soit en modifiant directement les fichiers. Valider ces modifications dans la branche « %{branch_name} »"
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43810,7 +44480,7 @@ msgid "You must be authenticated to access this path."
msgstr ""
msgid "You must be logged in to search across all of GitLab"
-msgstr ""
+msgstr "Vous devez être connecté(e) pour rechercher dans tout GitLab"
msgid "You must have developer or higher permissions in the associated project to view job logs when debug trace is enabled. To disable debug trace, set the 'CI_DEBUG_TRACE' variable to 'false' in your pipeline configuration or CI/CD settings. If you need to view this job log, a project maintainer must add you to the project with developer permissions or higher."
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr "Vous avez besoin d’une licence différente pour activer la fonctionnalité de verrouillage de fichiers FileLocks"
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr "Vous recevez ce courriel parce que vous possédez un compte sur %{host}."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Vous recevez ce courriel en raison de votre compte sur %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Vous recevez ce courriel car un ticket vous a été assigné sur %{host}. %{unsubscribe_link_start}Se désabonner%{unsubscribe_link_end} des notifications de ce ticket &middot; %{manage_notifications_link_start}Gérer toutes les notifications%{manage_notifications_link_end} &middot; %{help_link_start}Aide%{help_link_end}"
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43993,7 +44672,7 @@ msgid "Your CSV export has started. It will be emailed to %{email} when complete
msgstr ""
msgid "Your CSV export of %{count} from project %{project_link} has been added to this email as an attachment."
-msgstr ""
+msgstr "Votre export CSV de %{count} depuis le projet %{project_link} a été ajouté à ce courriel en pièce-jointe."
msgid "Your CSV export of %{written_count} from project %{project_name} (%{project_url}) has been added to this email as an attachment."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "un utilisateur supprimé"
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr "%{reportType} : le chargement a généré une erreur"
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,9 +45581,12 @@ msgstr ""
msgid "closed"
msgstr ""
-msgid "closed issue"
+msgid "closed %{timeago}"
msgstr ""
+msgid "closed issue"
+msgstr "ticket fermé"
+
msgid "collect usage information"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44930,7 +45627,7 @@ msgid "created"
msgstr ""
msgid "created %{issuable_created} by %{author}"
-msgstr ""
+msgstr "créé %{issuable_created} par %{author}"
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Approuver"
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr "Fusionner"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45788,7 +46511,7 @@ msgid "no scopes selected"
msgstr ""
msgid "none"
-msgstr ""
+msgstr "aucun"
msgid "not authorized to create member"
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "parent"
msgstr[1] "parents"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "mot de passe"
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46029,7 +46758,7 @@ msgid "severity|Minor"
msgstr ""
msgid "severity|None"
-msgstr ""
+msgstr "Aucune"
msgid "severity|Unknown"
msgstr ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 566ec3633fc..e51f434bb55 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -445,6 +460,9 @@ msgstr ""
msgid "%{address} is an invalid IP address range"
msgstr ""
+msgid "%{attribute} must be between %{min} and %{max}"
+msgstr ""
+
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -703,9 +721,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -733,6 +757,9 @@ msgstr ""
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
msgstr ""
+msgid "%{labelStart}URL:%{labelEnd} %{url}"
+msgstr ""
+
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
msgstr ""
@@ -920,9 +947,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1337,6 +1361,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1548,6 +1577,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1836,6 +1868,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1953,6 +1988,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2043,9 +2084,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2076,9 +2114,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2154,9 +2189,6 @@ msgstr ""
msgid "Add approvers"
msgstr ""
-msgid "Add assignees"
-msgstr ""
-
msgid "Add attention request"
msgstr ""
@@ -2607,6 +2639,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2679,6 +2714,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2904,7 +2942,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2913,6 +2951,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2955,6 +2996,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2982,6 +3026,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3057,6 +3104,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3084,6 +3137,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3102,6 +3158,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3114,9 +3173,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3165,9 +3230,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3186,6 +3248,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3696,6 +3761,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All eligible users"
+msgstr ""
+
msgid "All email addresses will be used to identify your commits."
msgstr ""
@@ -3735,6 +3803,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3747,12 +3818,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3795,9 +3860,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3810,9 +3872,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3834,6 +3893,9 @@ msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4215,6 +4277,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4223,6 +4288,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4430,6 +4498,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4524,13 +4595,25 @@ msgstr ""
msgid "ApplicationSettings|Require admin approval for new sign-ups"
msgstr ""
+msgid "ApplicationSettings|Require lowercase letters"
+msgstr ""
+
+msgid "ApplicationSettings|Require numbers"
+msgstr ""
+
+msgid "ApplicationSettings|Require symbols"
+msgstr ""
+
+msgid "ApplicationSettings|Require uppercase letters"
+msgstr ""
+
msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. %{linkStart}What is the supported syntax?%{linkEnd}"
msgstr ""
msgid "ApplicationSettings|Save changes"
msgstr ""
-msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
+msgid "ApplicationSettings|See %{linkStart}password policy guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4557,6 +4640,18 @@ msgstr ""
msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) cannot sign up. Wildcards allowed. Use separate lines or commas for multiple entries."
msgstr ""
+msgid "ApplicationSettings|When enabled, new passwords must contain at least one lowercase letter (a-z)."
+msgstr ""
+
+msgid "ApplicationSettings|When enabled, new passwords must contain at least one number (0-9)."
+msgstr ""
+
+msgid "ApplicationSettings|When enabled, new passwords must contain at least one symbol."
+msgstr ""
+
+msgid "ApplicationSettings|When enabled, new passwords must contain at least one uppercase letter (A-Z)."
+msgstr ""
+
msgid "ApplicationSettings|domain.com"
msgstr ""
@@ -4708,16 +4803,13 @@ msgstr ""
msgid "ApprovalSettings|Prevent approval by author"
msgstr ""
-msgid "ApprovalSettings|Prevent approval by author."
-msgstr ""
-
msgid "ApprovalSettings|Prevent approvals by users who add commits"
msgstr ""
-msgid "ApprovalSettings|Prevent approvals by users who add commits."
+msgid "ApprovalSettings|Prevent editing approval rules in merge requests"
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in merge requests"
+msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests"
msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
@@ -4920,6 +5012,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4938,6 +5033,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5055,6 +5153,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5221,6 +5322,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5245,6 +5349,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5254,6 +5361,18 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Edit %{link}"
+msgstr ""
+
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
+msgid "AuditStreams|Save external stream destination"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5269,6 +5388,12 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
+msgid "AuditStreams|Verification token"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5674,6 +5799,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banned"
+msgstr ""
+
msgid "Banner message"
msgstr ""
@@ -5761,9 +5889,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6166,6 +6291,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6784,6 +6915,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6880,6 +7014,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7425,9 +7562,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7675,6 +7809,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7726,9 +7866,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7792,6 +7929,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8166,6 +8306,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8184,6 +8327,138 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Configuration"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Databases"
+msgstr ""
+
+msgid "CloudSeed|Deployments"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Regions"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Service Account"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8193,9 +8468,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8561,9 +8833,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8603,6 +8872,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8648,9 +8920,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8837,7 +9106,7 @@ msgstr ""
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8933,6 +9202,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9014,6 +9289,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9403,6 +9681,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9439,10 +9720,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9634,9 +9915,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9856,9 +10134,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9868,6 +10143,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10435,9 +10713,6 @@ msgstr ""
msgid "Create %{workspace} label"
msgstr ""
-msgid "Create Google Cloud project"
-msgstr ""
-
msgid "Create New Directory"
msgstr ""
@@ -10594,6 +10869,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11176,9 +11454,6 @@ msgstr ""
msgid "CycleAnalyticsStage|should be under a group"
msgstr ""
-msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
-msgstr ""
-
msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
msgstr ""
@@ -11203,9 +11478,6 @@ msgstr ""
msgid "CycleAnalytics|Date"
msgstr ""
-msgid "CycleAnalytics|Display chart filters"
-msgstr ""
-
msgid "CycleAnalytics|If you have recently upgraded to GitLab Premium, it can take up to 30 minutes for data to collect and display."
msgstr ""
@@ -11215,20 +11487,11 @@ msgstr ""
msgid "CycleAnalytics|Number of tasks"
msgstr ""
-msgid "CycleAnalytics|Only %{maxLabels} labels can be selected at this time"
-msgstr ""
-
msgid "CycleAnalytics|Project selected"
msgid_plural "CycleAnalytics|%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Select labels"
-msgstr ""
-
-msgid "CycleAnalytics|Show"
-msgstr ""
-
msgid "CycleAnalytics|Stage time: %{title}"
msgstr ""
@@ -11271,6 +11534,9 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
+msgid "DAST configuration not found"
+msgstr ""
+
msgid "DAST profile not found: %{name}"
msgstr ""
@@ -11286,6 +11552,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11319,6 +11588,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11505,6 +11783,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11990,6 +12271,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12026,9 +12310,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12074,6 +12355,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12089,6 +12373,12 @@ msgstr ""
msgid "Delete project"
msgstr ""
+msgid "Delete release"
+msgstr ""
+
+msgid "Delete release %{release}?"
+msgstr ""
+
msgid "Delete row"
msgstr ""
@@ -12146,6 +12436,15 @@ msgstr ""
msgid "DeleteProject|Failed to remove wiki repository. Please try again or contact administrator."
msgstr ""
+msgid "DeleteRelease|Are you sure you want to delete this release?"
+msgstr ""
+
+msgid "DeleteRelease|For more details, see %{docsPathStart}Deleting a release%{docsPathEnd}."
+msgstr ""
+
+msgid "DeleteRelease|You are about to delete release %{release} and its assets. The Git tag %{tag} will not be deleted."
+msgstr ""
+
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
msgstr ""
@@ -12347,13 +12646,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12772,12 +13071,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12867,9 +13160,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12912,9 +13202,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12972,6 +13259,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13278,9 +13568,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13667,6 +13954,9 @@ msgstr ""
msgid "Edit %{name}"
msgstr ""
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr ""
@@ -13694,9 +13984,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13847,9 +14134,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13862,9 +14146,6 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
-msgid "Eligible users"
-msgstr ""
-
msgid "Email"
msgstr ""
@@ -13988,9 +14269,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14006,6 +14284,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14186,9 +14467,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14309,9 +14587,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14411,12 +14686,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14453,9 +14722,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14465,9 +14731,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14477,12 +14740,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14492,10 +14749,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14504,18 +14758,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14531,13 +14779,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14672,6 +14917,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14900,6 +15148,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15163,6 +15414,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15301,7 +15555,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15466,6 +15720,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15487,6 +15744,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16004,6 +16266,9 @@ msgstr ""
msgid "February"
msgstr ""
+msgid "Feedback issue"
+msgstr ""
+
msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
@@ -16166,7 +16431,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16310,9 +16578,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16379,7 +16644,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16821,9 +17086,6 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
@@ -16923,9 +17185,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17166,6 +17425,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17193,6 +17488,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17226,9 +17524,6 @@ msgstr ""
msgid "GitLab account request rejected"
msgstr ""
-msgid "GitLab and Google Cloud configuration seems to be incomplete. This probably can be fixed by your GitLab administration team. You may share these logs with them:"
-msgstr ""
-
msgid "GitLab commit"
msgstr ""
@@ -17283,9 +17578,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17382,6 +17674,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17487,9 +17782,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17505,6 +17806,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17526,16 +17830,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17700,16 +18010,13 @@ msgstr ""
msgid "Google Cloud"
msgstr ""
-msgid "Google Cloud Project"
+msgid "Google Cloud Error - %{error}"
msgstr ""
-msgid "Google Cloud authorizations required"
-msgstr ""
-
-msgid "Google Cloud project misconfigured"
+msgid "Google Cloud Project"
msgstr ""
-msgid "Google Cloud project required"
+msgid "Google Cloud authorizations required"
msgstr ""
msgid "GoogleCloud|Cancel"
@@ -17811,6 +18118,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17964,6 +18274,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17973,7 +18286,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18240,18 +18553,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18282,22 +18592,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18306,6 +18619,18 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18321,13 +18646,13 @@ 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"
+msgid "GroupSettings|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18348,9 +18673,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18372,7 +18703,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18504,9 +18835,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18742,12 +19070,6 @@ msgstr ""
msgid "Hashed storage can't be disabled anymore for new projects"
msgstr ""
-msgid "Have a quick chat with us about your experience."
-msgstr ""
-
-msgid "Have more to say about GitLab?"
-msgstr ""
-
msgid "Header logo"
msgstr ""
@@ -18986,9 +19308,6 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
-msgstr ""
-
msgid "Hook was successfully updated."
msgstr ""
@@ -19004,9 +19323,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19166,15 +19482,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -19202,6 +19569,9 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
+msgid "If none of the options work, try contacting a GitLab administrator."
+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."
msgstr ""
@@ -19526,9 +19896,6 @@ msgstr ""
msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
msgstr ""
-msgid "InProductMarketing|%{strong_start}Overall, how difficult or easy was it to get started with GitLab?%{strong_end}"
-msgstr ""
-
msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
msgstr ""
@@ -19586,9 +19953,6 @@ msgstr ""
msgid "InProductMarketing|By enabling code owners and required merge approvals the right person will review the right MR. This is a win-win: cleaner code and a more efficient review process."
msgstr ""
-msgid "InProductMarketing|Click on the number below that corresponds with your answer — 1 being very difficult, 5 being very easy."
-msgstr ""
-
msgid "InProductMarketing|Code owners"
msgstr ""
@@ -19631,9 +19995,6 @@ msgstr ""
msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
msgstr ""
-msgid "InProductMarketing|Difficult"
-msgstr ""
-
msgid "InProductMarketing|Dig in and create a project and a repo"
msgstr ""
@@ -19643,18 +20004,12 @@ msgstr ""
msgid "InProductMarketing|Discover Premium & Ultimate."
msgstr ""
-msgid "InProductMarketing|Do you have a minute?"
-msgstr ""
-
msgid "InProductMarketing|Do you have a teammate who would be perfect for this task?"
msgstr ""
msgid "InProductMarketing|Dynamic application security testing"
msgstr ""
-msgid "InProductMarketing|Easy"
-msgstr ""
-
msgid "InProductMarketing|Epics"
msgstr ""
@@ -19673,9 +20028,6 @@ msgstr ""
msgid "InProductMarketing|Facebook"
msgstr ""
-msgid "InProductMarketing|Feedback from users like you really improves our product. Thanks for your help!"
-msgstr ""
-
msgid "InProductMarketing|Feel the need for speed?"
msgstr ""
@@ -19844,9 +20196,6 @@ msgstr ""
msgid "InProductMarketing|Need an alternative to importing?"
msgstr ""
-msgid "InProductMarketing|Neutral"
-msgstr ""
-
msgid "InProductMarketing|No credit card required."
msgstr ""
@@ -19919,9 +20268,6 @@ msgstr ""
msgid "InProductMarketing|Streamline code review, know at a glance who's unavailable, communicate in comments or in email and integrate with Slack so everyone's on the same page."
msgstr ""
-msgid "InProductMarketing|Take this 1-question survey!"
-msgstr ""
-
msgid "InProductMarketing|Take your first steps with GitLab"
msgstr ""
@@ -19994,12 +20340,6 @@ msgstr ""
msgid "InProductMarketing|Used by more than 100,000 organizations from around the globe:"
msgstr ""
-msgid "InProductMarketing|Very difficult"
-msgstr ""
-
-msgid "InProductMarketing|Very easy"
-msgstr ""
-
msgid "InProductMarketing|Visualize your epics and milestones in a timeline."
msgstr ""
@@ -20015,9 +20355,6 @@ msgstr ""
msgid "InProductMarketing|We know a thing or two about efficiency and we don't want to keep that to ourselves. Sign up for a free trial of GitLab Ultimate and your teams will be on it from day one."
msgstr ""
-msgid "InProductMarketing|We want your GitLab experience to be great"
-msgstr ""
-
msgid "InProductMarketing|What does our value stream timeline look like from product to development to review and production?"
msgstr ""
@@ -20279,12 +20616,21 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20297,12 +20643,27 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
msgid "Incident|Something went wrong while fetching incident timeline events."
msgstr ""
@@ -20318,6 +20679,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20447,9 +20814,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20611,7 +20975,7 @@ msgstr ""
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20722,6 +21086,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20866,15 +21233,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20917,9 +21275,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20932,15 +21287,9 @@ msgstr ""
msgid "Invalid rule"
msgstr ""
-msgid "Invalid search parameter"
-msgstr ""
-
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21076,6 +21425,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21091,6 +21443,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21388,15 +21745,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21547,6 +21898,9 @@ msgstr ""
msgid "Iterations|All"
msgstr ""
+msgid "Iterations|Automatic scheduling"
+msgstr ""
+
msgid "Iterations|Cadence configuration is invalid."
msgstr ""
@@ -21568,6 +21922,9 @@ msgstr ""
msgid "Iterations|Create iteration"
msgstr ""
+msgid "Iterations|Create iterations automatically on a regular schedule."
+msgstr ""
+
msgid "Iterations|Delete cadence"
msgstr ""
@@ -21598,6 +21955,9 @@ msgstr ""
msgid "Iterations|Edit iteration cadence"
msgstr ""
+msgid "Iterations|Enable roll over"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -21610,6 +21970,9 @@ msgstr ""
msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
msgstr ""
+msgid "Iterations|Iterations are scheduled to start on %{weekday}s."
+msgstr ""
+
msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
@@ -21637,9 +22000,6 @@ msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
-msgid "Iterations|No one can change this date after the cadence has begun."
-msgstr ""
-
msgid "Iterations|No open iterations."
msgstr ""
@@ -21715,9 +22075,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22087,6 +22444,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22126,12 +22486,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22156,6 +22522,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22192,6 +22564,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22309,9 +22684,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22387,6 +22759,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22611,9 +22988,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22629,9 +23003,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22692,19 +23063,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22749,22 +23120,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22782,6 +23156,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22791,9 +23168,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -22827,19 +23201,19 @@ msgstr ""
msgid "Less Details"
msgstr ""
-msgid "Let's Encrypt does not accept emails on example.com"
+msgid "Less restrictive visibility"
msgstr ""
-msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
+msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
-msgid "Let's talk!"
+msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
msgstr ""
msgid "License Compliance"
msgstr ""
-msgid "License Compliance| Used by"
+msgid "License Compliance| Used by %{dependencies}"
msgstr ""
msgid "License compliance"
@@ -23112,6 +23486,27 @@ msgstr ""
msgid "LinkedPipelines|%{counterLabel} more downstream pipelines"
msgstr ""
+msgid "LinkedResources|Add"
+msgstr ""
+
+msgid "LinkedResources|Add a resource link"
+msgstr ""
+
+msgid "LinkedResources|Cancel"
+msgstr ""
+
+msgid "LinkedResources|Link"
+msgstr ""
+
+msgid "LinkedResources|Linked resources"
+msgstr ""
+
+msgid "LinkedResources|Read more about linked resources"
+msgstr ""
+
+msgid "LinkedResources|Text (Optional)"
+msgstr ""
+
msgid "Links"
msgstr ""
@@ -23289,9 +23684,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23379,9 +23771,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23391,9 +23780,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -24121,12 +24507,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24292,7 +24684,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24672,9 +25064,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25112,6 +25501,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25124,9 +25528,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25148,6 +25549,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25172,9 +25576,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25431,16 +25832,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25581,6 +25979,9 @@ msgstr ""
msgid "No Epic"
msgstr ""
+msgid "No Google Cloud projects - You need at least one Google Cloud project"
+msgstr ""
+
msgid "No Matching Results"
msgstr ""
@@ -25590,6 +25991,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25647,9 +26051,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25740,6 +26141,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25785,9 +26189,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25824,6 +26225,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26003,9 +26407,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26027,6 +26437,9 @@ msgstr ""
msgid "Notes|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
msgstr ""
+msgid "Note|The created date provided is too far in the past."
+msgstr ""
+
msgid "Nothing to preview."
msgstr ""
@@ -26149,21 +26562,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26176,18 +26616,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26661,6 +27125,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26700,16 +27167,13 @@ msgstr ""
msgid "Only Issue ID or merge request ID is required"
msgstr ""
-msgid "Only Issue can be parent of Task."
-msgstr ""
-
msgid "Only Project Members"
msgstr ""
msgid "Only SSH"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
msgid "Only active projects show up in the search and on the dashboard."
@@ -26727,6 +27191,9 @@ msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26748,10 +27215,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26847,6 +27314,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26865,6 +27335,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27042,12 +27515,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27069,7 +27536,7 @@ msgstr ""
msgid "PackageRegistry|Additional metadata"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27177,9 +27644,15 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
+msgid "PackageRegistry|Examples of assets include .pom & .jar files"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27237,6 +27710,9 @@ msgstr ""
msgid "PackageRegistry|License information located at %{link}"
msgstr ""
+msgid "PackageRegistry|Manage storage used by package assets"
+msgstr ""
+
msgid "PackageRegistry|Manually Published"
msgstr ""
@@ -27255,6 +27731,9 @@ msgstr ""
msgid "PackageRegistry|NuGet Command"
msgstr ""
+msgid "PackageRegistry|Number of duplicate assets to keep"
+msgstr ""
+
msgid "PackageRegistry|Package Registry"
msgstr ""
@@ -27293,6 +27772,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27377,7 +27859,7 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
-msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgid "PackageRegistry|When a package with same name and version is uploaded to the registry, more assets are added to the package. To save storage space, keep only the most recent assets."
msgstr ""
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
@@ -27470,18 +27952,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27653,6 +28129,9 @@ msgstr ""
msgid "Perform common operations on GitLab project"
msgstr ""
+msgid "Performance insights"
+msgstr ""
+
msgid "Performance optimization"
msgstr ""
@@ -27914,6 +28393,9 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Configuration content has changed. Re-run validation for updated results."
+msgstr ""
+
msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
msgstr ""
@@ -27929,6 +28411,18 @@ msgstr ""
msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
msgstr ""
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline simulation completed with errors"
+msgstr ""
+
+msgid "PipelineEditor|Simulated a %{codeStart}git push%{codeEnd} event for a default branch. %{codeStart}Rules%{codeEnd}, %{codeStart}only%{codeEnd}, %{codeStart}except%{codeEnd}, and %{codeStart}needs%{codeEnd} job dependencies logic have been evaluated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditor|Simulation completed successfully"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27947,6 +28441,15 @@ msgstr ""
msgid "PipelineEditor|Validate pipeline under selected conditions"
msgstr ""
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validating pipeline... It can take up to a minute."
+msgstr ""
+
+msgid "PipelineEditor|Waiting for CI content to load..."
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28226,6 +28729,9 @@ msgstr ""
msgid "Pipelines|Pipeline Editor"
msgstr ""
+msgid "Pipelines|Pipeline syntax is correct."
+msgstr ""
+
msgid "Pipelines|Project cache successfully reset."
msgstr ""
@@ -28394,9 +28900,18 @@ msgstr ""
msgid "Pipeline|Failed"
msgstr ""
+msgid "Pipeline|Five slowest jobs"
+msgstr ""
+
msgid "Pipeline|In progress"
msgstr ""
+msgid "Pipeline|Last executed job"
+msgstr ""
+
+msgid "Pipeline|Longest queued job"
+msgstr ""
+
msgid "Pipeline|Manual"
msgstr ""
@@ -28409,12 +28924,18 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|Only able to show first 100 results"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
msgid "Pipeline|Pending"
msgstr ""
+msgid "Pipeline|Performance insights"
+msgstr ""
+
msgid "Pipeline|Pipeline"
msgstr ""
@@ -28469,6 +28990,12 @@ msgstr ""
msgid "Pipeline|Test coverage"
msgstr ""
+msgid "Pipeline|The last executed job is the last job to start in the pipeline."
+msgstr ""
+
+msgid "Pipeline|The longest queued job is the job that spent the longest time in the pending state, waiting to be picked up by a Runner"
+msgstr ""
+
msgid "Pipeline|This change will decrease the overall test coverage if merged."
msgstr ""
@@ -28496,6 +29023,9 @@ msgstr ""
msgid "Pipeline|View commit"
msgstr ""
+msgid "Pipeline|View dependency"
+msgstr ""
+
msgid "Pipeline|View pipeline"
msgstr ""
@@ -28763,12 +29293,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28946,13 +29470,10 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
-msgid "Prevent editing approval rules in projects and merge requests."
+msgid "Prevent editing approval rules in projects and merge requests"
msgstr ""
msgid "Prevent environment from auto-stopping"
@@ -29147,9 +29668,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29162,7 +29680,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29189,7 +29707,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29204,6 +29722,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29231,7 +29752,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29240,16 +29761,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29282,7 +29803,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29369,13 +29890,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29384,7 +29905,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29393,16 +29914,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29411,7 +29932,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29447,7 +29968,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29489,6 +30010,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29567,7 +30091,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29663,6 +30187,9 @@ msgstr ""
msgid "Project uploads"
msgstr ""
+msgid "Project visibility level is less restrictive than the group settings."
+msgstr ""
+
msgid "Project visibility level will be changed to match namespace rules when transferring to a group."
msgstr ""
@@ -29690,6 +30217,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29822,9 +30352,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30284,6 +30811,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30422,6 +30952,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30488,7 +31021,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30548,7 +31081,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -31046,6 +31579,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31358,6 +31894,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31373,12 +31912,6 @@ msgstr ""
msgid "Recaptcha verified?"
msgstr ""
-msgid "Receive a $50 gift card as a thank you for your time."
-msgstr ""
-
-msgid "Receive a %{strongOpen}$50 gift card%{strongClose} as a thank you for your time."
-msgstr ""
-
msgid "Receive any notifications from GitLab."
msgstr ""
@@ -31412,6 +31945,9 @@ msgstr ""
msgid "Reconfigure"
msgstr ""
+msgid "Recover password"
+msgstr ""
+
msgid "Recovery Codes"
msgstr ""
@@ -31445,9 +31981,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31602,12 +32135,18 @@ msgid_plural "Releases"
msgstr[0] ""
msgstr[1] ""
+msgid "Release %{deletedRelease} has been successfully deleted."
+msgstr ""
+
msgid "Release assets"
msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31671,6 +32210,9 @@ msgstr ""
msgid "Release|Something went wrong while creating a new release."
msgstr ""
+msgid "Release|Something went wrong while deleting the release."
+msgstr ""
+
msgid "Release|Something went wrong while getting the release details."
msgstr ""
@@ -32121,6 +32663,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32468,9 +33016,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32547,6 +33092,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32556,9 +33104,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32652,6 +33197,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32685,12 +33233,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32921,6 +33463,9 @@ msgstr ""
msgid "Runners|Associated with one or more projects"
msgstr ""
+msgid "Runners|Available"
+msgstr ""
+
msgid "Runners|Available to all projects"
msgstr ""
@@ -33007,6 +33552,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33105,6 +33653,9 @@ msgstr ""
msgid "Runners|Protected"
msgstr ""
+msgid "Runners|Recommended"
+msgstr ""
+
msgid "Runners|Register a group runner"
msgstr ""
@@ -33272,6 +33823,21 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Up to date"
+msgstr ""
+
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade Status"
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33362,6 +33928,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34014,6 +34595,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34029,7 +34613,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34074,6 +34658,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34098,9 +34685,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34260,6 +34853,9 @@ msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr ""
+msgid "SecurityOrchestration|This %{namespaceType} does not contain any security policies."
+msgstr ""
+
msgid "SecurityOrchestration|This group"
msgstr ""
@@ -34278,9 +34874,6 @@ msgstr ""
msgid "SecurityOrchestration|This project"
msgstr ""
-msgid "SecurityOrchestration|This project does not contain any security policies."
-msgstr ""
-
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
@@ -34323,18 +34916,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34344,12 +34925,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34389,6 +34964,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34695,6 +35273,9 @@ msgstr ""
msgid "Select a branch to compare"
msgstr ""
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35043,9 +35624,6 @@ msgstr ""
msgid "ServicePing|Turn on service ping to review instance-level analytics."
msgstr ""
-msgid "Services"
-msgstr ""
-
msgid "Session ID"
msgstr ""
@@ -35067,9 +35645,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35190,6 +35765,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35453,6 +36031,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35476,9 +36111,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35494,6 +36126,12 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} label for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35578,6 +36216,9 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
+msgid "Sign-in failed because %{error}."
+msgstr ""
+
msgid "Sign-in page"
msgstr ""
@@ -35587,6 +36228,9 @@ msgstr ""
msgid "Sign-in text"
msgstr ""
+msgid "Sign-in using %{provider} auth failed"
+msgstr ""
+
msgid "Sign-out page URL"
msgstr ""
@@ -35815,6 +36459,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36682,6 +37329,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36703,7 +37353,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36721,6 +37371,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36784,6 +37437,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36928,9 +37584,6 @@ msgstr ""
msgid "Succeeded"
msgstr ""
-msgid "Successful purchase image"
-msgstr ""
-
msgid "Successfully activated"
msgstr ""
@@ -37263,6 +37916,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37272,7 +37928,19 @@ msgstr ""
msgid "Support page URL"
msgstr ""
-msgid "Survey Response"
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
msgstr ""
msgid "Switch Branches"
@@ -37350,9 +38018,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37365,6 +38030,9 @@ msgstr ""
msgid "System output"
msgstr ""
+msgid "System started"
+msgstr ""
+
msgid "Table of Contents"
msgstr ""
@@ -37437,6 +38105,9 @@ msgstr ""
msgid "TagsPage|Cancel, keep tag"
msgstr ""
+msgid "TagsPage|Create release"
+msgstr ""
+
msgid "TagsPage|Create tag"
msgstr ""
@@ -37455,6 +38126,9 @@ msgstr ""
msgid "TagsPage|Deleting the %{strongStart}%{tagName}%{strongEnd} tag cannot be undone. Are you sure?"
msgstr ""
+msgid "TagsPage|Edit release"
+msgstr ""
+
msgid "TagsPage|Edit release notes"
msgstr ""
@@ -37551,6 +38225,9 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37899,6 +38576,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37956,9 +38636,6 @@ msgstr ""
msgid "Thank you for your business."
msgstr ""
-msgid "Thank you for your feedback!"
-msgstr ""
-
msgid "Thank you for your report. A GitLab administrator will look into it shortly."
msgstr ""
@@ -37977,9 +38654,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38102,6 +38776,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38126,7 +38803,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38280,6 +38957,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38352,21 +39032,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38580,6 +39251,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38625,6 +39299,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39249,9 +39929,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39369,7 +40046,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39447,9 +40124,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39489,9 +40163,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -40075,12 +40746,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40135,9 +40815,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40360,9 +41037,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40387,6 +41061,9 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
+msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgstr ""
+
msgid "Try out GitLab Pipelines"
msgstr ""
@@ -40450,6 +41127,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40540,9 +41220,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40552,9 +41229,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40567,9 +41241,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40597,6 +41268,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40693,9 +41367,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40705,9 +41376,6 @@ msgstr ""
msgid "Unknown response text"
msgstr ""
-msgid "Unknown screen"
-msgstr ""
-
msgid "Unknown user"
msgstr ""
@@ -40942,7 +41610,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40954,9 +41622,6 @@ msgstr ""
msgid "Upstream"
msgstr ""
-msgid "Uptime"
-msgstr ""
-
msgid "Upvotes"
msgstr ""
@@ -40987,9 +41652,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41110,6 +41772,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42054,11 @@ msgstr ""
msgid "Used"
msgstr ""
+msgid "Used by %d package"
+msgid_plural "Used by %d packages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Used by members to sign in to your group in GitLab"
msgstr ""
@@ -41590,6 +42260,9 @@ msgstr ""
msgid "UserProfile|Contributed projects"
msgstr ""
+msgid "UserProfile|Copy user ID"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -41671,6 +42344,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID: %{id}"
+msgstr ""
+
msgid "UserProfile|View all"
msgstr ""
@@ -41737,6 +42413,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42000,9 +42682,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42047,9 +42726,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42663,7 +43339,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43259,6 +43935,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43277,54 +43956,86 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
-msgid "WorkItem|Add"
+msgid "WorkItem|A task provides the ability to break down your work into smaller pieces tied to an issue. Tasks are the first items using our new %{workItemsLink} objects. Additional work item types will be coming soon."
+msgstr ""
+
+msgid "WorkItem|Add a task"
+msgstr ""
+
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
msgstr ""
-msgid "WorkItem|Add a child"
+msgid "WorkItem|Add task"
msgstr ""
msgid "WorkItem|Are you sure you want to cancel editing?"
msgstr ""
-msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgid "WorkItem|Are you sure you want to delete the task? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Child removed"
+msgstr ""
+
msgid "WorkItem|Closed"
msgstr ""
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
-msgid "WorkItem|Delete work item"
+msgid "WorkItem|Delete task"
msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
+msgid "WorkItem|Introducing tasks"
+msgstr ""
+
+msgid "WorkItem|Learn about tasks"
+msgstr ""
+
msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
msgid "WorkItem|Open"
msgstr ""
+msgid "WorkItem|Remove"
+msgstr ""
+
msgid "WorkItem|Select type"
msgstr ""
+msgid "WorkItem|Something went wrong when creating a task. Please try again"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong when deleting the task. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong when deleting the work item. Please try again."
msgstr ""
@@ -43334,18 +44045,30 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong when trying to add a child. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the work item. Please try again."
msgstr ""
+msgid "WorkItem|Task deleted"
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
+msgid "WorkItem|Undo"
+msgstr ""
+
msgid "WorkItem|Work Items"
msgstr ""
msgid "WorkItem|Work item deleted"
msgstr ""
+msgid "WorkItem|work items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43666,9 +44389,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43678,9 +44398,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43708,9 +44425,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43720,9 +44434,6 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
-msgid "You cannot edit this timeline event."
-msgstr ""
-
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43756,9 +44467,6 @@ msgstr ""
msgid "You currently have more than %{free_limit} members across all your personal projects. From June 22, 2022, the %{free_limit} most recently active members will remain active, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access. To view and manage members, check the members page for each project in your namespace. We recommend you %{move_link_start}move your project to a group%{move_link_end} so you can easily manage users and features."
msgstr ""
-msgid "You do not have any Google Cloud projects. Please create a Google Cloud project and then reload this page."
-msgstr ""
-
msgid "You do not have any subscriptions yet"
msgstr ""
@@ -43890,6 +44598,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43959,9 +44670,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44061,18 +44769,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44325,9 +45051,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44373,9 +45096,6 @@ msgstr ""
msgid "Your requirements will be imported in the background. After it's finished, you'll get a confirmation email."
msgstr ""
-msgid "Your response has been recorded."
-msgstr ""
-
msgid "Your search didn't match any commits."
msgstr ""
@@ -44404,6 +45124,12 @@ msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44476,6 +45202,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44505,6 +45234,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44739,6 +45471,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45010,6 +45745,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45037,12 +45775,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45096,6 +45828,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45264,6 +45999,11 @@ msgstr ""
msgid "groups only"
msgstr ""
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45694,6 +46434,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45712,9 +46455,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45961,6 +46701,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45992,6 +46738,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46028,12 +46780,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46184,6 +46930,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46405,6 +47154,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index b0445cf7468..011ed0c06ea 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr " %{start} a %{end}"
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d capa"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 7b7ab7193ea..763a6fed51f 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -374,6 +374,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -486,6 +500,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -865,9 +886,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1086,9 +1113,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1190,6 +1214,9 @@ msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1231,6 +1258,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1527,6 +1557,13 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1784,6 +1821,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2072,6 +2112,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "×סימוני גישה"
@@ -2189,6 +2232,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2279,9 +2328,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr "הוספת CONTRIBUTING (הדרכה למתנדבי×)"
-msgid "Add Jaeger URL"
-msgstr "הוספת כתובת Jaeger"
-
msgid "Add Kubernetes cluster"
msgstr "הוספת מקבץ Kubernetes"
@@ -2312,9 +2358,6 @@ msgstr "הוספת מפתח GPG"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2342,9 +2385,6 @@ 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 new issue"
msgstr ""
@@ -2594,9 +2634,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "דקות נוספות"
@@ -2846,6 +2883,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2918,6 +2958,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3143,7 +3186,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3152,6 +3195,9 @@ msgstr "גישה"
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3194,6 +3240,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3221,6 +3270,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3296,6 +3348,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3323,6 +3381,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3341,6 +3402,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3353,9 +3417,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3404,9 +3474,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3425,6 +3492,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3491,6 +3561,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3971,6 +4044,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3983,12 +4059,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4031,9 +4101,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4046,9 +4113,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4061,12 +4125,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4226,6 +4296,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4445,6 +4518,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4455,6 +4531,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4662,6 +4741,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5062,7 +5144,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5168,6 +5250,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5186,6 +5271,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5303,6 +5391,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5400,9 +5491,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5476,6 +5564,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5500,6 +5591,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5509,6 +5603,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5524,6 +5624,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6016,9 +6119,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6421,6 +6521,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6721,6 +6827,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7042,6 +7151,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7138,6 +7250,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7181,6 +7296,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7508,6 +7626,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7679,9 +7800,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7933,6 +8051,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8050,6 +8171,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8426,6 +8550,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8444,6 +8571,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8453,9 +8697,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8823,9 +9064,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8865,6 +9103,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8910,9 +9151,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9090,10 +9328,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9270,6 +9520,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9661,6 +9914,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9697,10 +9953,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9892,9 +10148,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10120,9 +10373,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10858,6 +11111,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11552,6 +11808,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11585,6 +11844,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11633,13 +11901,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11771,6 +12039,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11981,6 +12252,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12186,12 +12460,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12204,9 +12472,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12300,9 +12568,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12348,6 +12613,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12459,6 +12727,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12600,13 +12895,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13235,6 +13518,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13716,9 +14002,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13935,10 +14218,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13968,9 +14251,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14121,9 +14401,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14262,9 +14539,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14280,6 +14554,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14463,9 +14737,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14586,9 +14857,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14688,12 +14956,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14730,9 +14992,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14742,9 +15001,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14754,12 +15010,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14769,10 +15019,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14781,18 +15028,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14808,13 +15049,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14949,6 +15187,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15580,7 +15827,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15766,6 +16016,13 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr ""
@@ -16449,7 +16706,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16458,6 +16718,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16659,7 +16919,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16901,9 +17161,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17213,9 +17464,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17459,6 +17704,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17576,9 +17860,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17675,6 +17956,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17780,9 +18064,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17798,6 +18088,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,16 +18112,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18104,6 +18403,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18257,6 +18559,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18266,7 +18571,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18533,18 +18838,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18575,25 +18877,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18602,37 +18904,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,9 +18958,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18674,7 +18988,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18806,9 +19120,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19296,10 +19607,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19473,15 +19781,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20760,9 +21149,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21013,6 +21405,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21154,6 +21555,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21166,15 +21570,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21217,9 +21612,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21388,6 +21780,13 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21499,6 +21898,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21682,15 +22084,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22048,9 +22441,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22411,12 +22816,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22672,6 +23089,13 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr ""
@@ -22898,9 +23322,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22916,9 +23337,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22979,19 +23397,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23036,22 +23454,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23078,9 +23502,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23678,9 +24096,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23690,9 +24105,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24418,12 +24836,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24589,7 +25013,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25446,6 +25882,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25470,9 +25909,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25561,10 +25997,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25573,10 +26009,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25733,16 +26169,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25838,9 +26271,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25895,6 +26325,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25925,6 +26358,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26042,6 +26475,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26461,21 +26903,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26975,6 +27468,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26999,7 +27495,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,22 +27504,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27059,10 +27558,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27158,6 +27657,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27176,6 +27678,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27482,6 +27987,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27642,6 +28153,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27681,9 +28195,6 @@ 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 ""
@@ -27774,18 +28285,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28833,6 +29368,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29040,12 +29578,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29121,13 +29653,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29169,9 +29704,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29436,7 +29965,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,7 +29992,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29478,6 +30007,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29505,7 +30037,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29514,16 +30046,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,7 +30088,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29643,13 +30175,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29658,7 +30190,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29667,16 +30199,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29685,7 +30217,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29721,7 +30253,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29763,6 +30295,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29841,7 +30376,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29964,6 +30499,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30759,7 +31303,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30819,7 +31363,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31710,9 +32266,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31877,6 +32430,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32270,9 +32826,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32300,6 +32853,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33304,6 +33860,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34355,7 +34938,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,6 +34983,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35021,6 +35595,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35135,6 +35715,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35156,6 +35739,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35444,6 +36027,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35772,6 +36361,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37006,6 +37652,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37027,7 +37676,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37045,6 +37694,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,6 +37760,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37414,7 +38069,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37598,6 +38259,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38312,9 +38994,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38924,6 +39597,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39833,9 +40509,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39887,6 +40560,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40477,9 +41165,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40795,6 +41474,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40885,9 +41567,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40897,9 +41576,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40942,6 +41615,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41038,9 +41714,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41092,12 +41765,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41293,10 +41960,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42356,9 +43026,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,10 +44357,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44417,18 +45100,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44708,6 +45397,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44876,6 +45574,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45589,6 +46305,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45965,6 +46697,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46072,6 +46810,9 @@ msgstr[3] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46569,6 +47316,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46792,6 +47542,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 13732d6c37b..758f11ef1b4 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index e7fa0e06bfa..c50d35140ef 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -331,6 +331,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,12 +427,24 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -784,9 +802,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1003,9 +1027,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1099,6 +1120,9 @@ msgstr[2] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1138,6 +1162,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1429,6 +1456,12 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1663,6 +1696,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1951,6 +1987,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2068,6 +2107,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2158,9 +2203,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2191,9 +2233,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2221,9 +2260,6 @@ 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 new issue"
msgstr ""
@@ -2473,9 +2509,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2725,6 +2758,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2797,6 +2833,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3022,7 +3061,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3031,6 +3070,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3073,6 +3115,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3100,6 +3145,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3175,6 +3223,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3202,6 +3256,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3220,6 +3277,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3232,9 +3292,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3283,9 +3349,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3304,6 +3367,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3370,6 +3436,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3850,6 +3919,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3862,12 +3934,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3910,9 +3976,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3925,9 +3988,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3940,12 +4000,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4105,6 +4171,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4324,6 +4393,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4333,6 +4405,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4540,6 +4615,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4933,7 +5011,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5038,6 +5116,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5056,6 +5137,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5173,6 +5257,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5269,9 +5356,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5344,6 +5428,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5368,6 +5455,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5377,6 +5467,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5392,6 +5488,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5884,9 +5983,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6289,6 +6385,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6586,6 +6688,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6907,6 +7012,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7003,6 +7111,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7045,6 +7156,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7372,6 +7486,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7543,9 +7660,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7795,6 +7909,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7846,9 +7966,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7912,6 +8029,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8287,6 +8407,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8305,6 +8428,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8314,9 +8554,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8683,9 +8920,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8725,6 +8959,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8770,9 +9007,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8950,10 +9184,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9049,6 +9289,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9130,6 +9376,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9520,6 +9769,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9556,10 +9808,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9751,9 +10003,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9976,9 +10225,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9988,6 +10234,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10714,6 +10963,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11407,6 +11659,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11440,6 +11695,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11488,13 +11752,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11626,6 +11890,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11836,6 +12103,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12040,12 +12310,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12058,9 +12322,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12118,6 +12379,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12154,9 +12418,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12202,6 +12463,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12313,6 +12577,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12451,13 +12742,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12880,12 +13171,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12976,9 +13261,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13021,9 +13303,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13081,6 +13360,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13282,6 +13564,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13387,9 +13672,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13558,9 +13840,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13777,10 +14056,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13810,9 +14089,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13963,9 +14239,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14104,9 +14377,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14122,6 +14392,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14188,9 +14461,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14305,9 +14575,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14428,9 +14695,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14530,12 +14794,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14572,9 +14830,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14584,9 +14839,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14596,12 +14848,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14611,10 +14857,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14623,18 +14866,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14650,13 +14887,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14791,6 +15025,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15019,6 +15256,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15283,6 +15523,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15421,7 +15664,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15586,6 +15829,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15607,6 +15853,12 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Failed on"
msgstr ""
@@ -16288,7 +16540,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16297,6 +16552,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16429,9 +16687,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16498,7 +16753,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16738,9 +16993,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16945,15 +17197,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17050,9 +17296,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17101,9 +17344,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17296,6 +17536,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17323,6 +17599,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17413,9 +17692,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17512,6 +17788,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17617,9 +17896,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17635,6 +17920,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17656,16 +17944,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17941,6 +18235,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18094,6 +18391,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18103,7 +18403,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18370,18 +18670,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18412,25 +18709,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18439,37 +18736,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18478,7 +18778,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18487,9 +18790,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18511,7 +18820,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18643,9 +18952,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19129,10 +19435,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19144,9 +19450,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19306,15 +19609,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20428,9 +20782,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20443,12 +20803,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20461,6 +20839,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20590,9 +20974,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20734,6 +21115,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20746,10 +21130,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20842,6 +21229,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20857,6 +21247,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20902,6 +21295,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20983,6 +21379,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20995,15 +21394,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21046,9 +21436,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21058,15 +21445,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21202,6 +21586,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21217,6 +21604,12 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21328,6 +21721,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21511,15 +21907,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21838,9 +22228,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21877,9 +22264,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21898,6 +22291,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22201,6 +22597,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22240,12 +22639,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22270,6 +22675,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22306,6 +22717,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22423,9 +22837,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22501,6 +22912,12 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Label priority"
msgstr ""
@@ -22726,9 +23143,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22744,9 +23158,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22807,19 +23218,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22864,22 +23275,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22897,6 +23311,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22906,9 +23323,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23410,9 +23824,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23500,9 +23911,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23512,9 +23920,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23653,6 +24058,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23665,6 +24073,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24238,12 +24649,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24409,7 +24826,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24436,6 +24853,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24787,9 +25207,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25228,6 +25645,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25240,9 +25672,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25264,6 +25693,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25288,9 +25720,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25378,10 +25807,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25390,10 +25819,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25549,16 +25978,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25654,9 +26080,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25711,6 +26134,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25741,6 +26167,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25765,9 +26194,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25858,6 +26284,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25903,9 +26332,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25942,6 +26368,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26122,9 +26551,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26272,21 +26707,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26299,18 +26761,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26785,6 +27271,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26809,7 +27298,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26818,22 +27307,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26842,12 +27331,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26869,10 +27361,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26968,6 +27460,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26986,6 +27481,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27076,6 +27574,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27160,12 +27661,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27184,7 +27679,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27292,6 +27790,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27409,6 +27910,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27451,6 +27955,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27490,9 +27997,6 @@ 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 ""
@@ -27583,18 +28087,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28027,6 +28525,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28039,6 +28555,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28405,6 +28930,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28642,6 +29170,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28849,12 +29380,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28930,13 +29455,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28978,9 +29506,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29032,9 +29557,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29065,6 +29587,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29230,9 +29755,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29245,7 +29767,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29272,7 +29794,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29287,6 +29809,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29314,7 +29839,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29323,16 +29848,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29365,7 +29890,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29452,13 +29977,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29467,7 +29992,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29476,16 +30001,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29494,7 +30019,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29530,7 +30055,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29572,6 +30097,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29650,7 +30178,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29773,6 +30301,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29884,6 +30415,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29902,9 +30436,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30364,6 +30895,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30502,6 +31036,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30568,7 +31105,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30628,7 +31165,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30787,6 +31324,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30799,6 +31339,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31120,6 +31663,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31432,6 +31978,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31519,9 +32068,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31684,6 +32230,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32077,9 +32626,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32107,6 +32653,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32200,6 +32749,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32551,9 +33106,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32632,6 +33184,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32641,9 +33196,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32737,6 +33289,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32770,12 +33325,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33097,6 +33646,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33223,9 +33775,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33367,6 +33916,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33457,6 +34015,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34120,6 +34693,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34135,7 +34711,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34180,6 +34756,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34204,9 +34783,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34303,9 +34888,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34405,6 +34987,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34429,18 +35014,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34450,12 +35023,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34495,6 +35062,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34720,9 +35290,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34801,6 +35368,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34915,6 +35488,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34936,6 +35512,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35167,9 +35746,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35224,6 +35800,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35287,6 +35866,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35551,6 +36133,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35575,9 +36214,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35593,6 +36229,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35914,6 +36553,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36109,9 +36751,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36439,7 +37078,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36784,6 +37423,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36805,7 +37447,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36823,6 +37465,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36886,6 +37531,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37192,7 +37840,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37363,6 +38014,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37375,6 +38029,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37450,9 +38119,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37651,6 +38317,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38005,6 +38677,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38083,9 +38758,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38209,6 +38881,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38233,7 +38908,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38389,6 +39064,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38431,9 +39109,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38464,21 +39139,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38692,6 +39358,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38737,6 +39406,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39361,9 +40036,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39481,7 +40153,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39505,6 +40177,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39556,9 +40231,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39589,9 +40261,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39601,9 +40270,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39655,6 +40321,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39991,9 +40663,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40144,6 +40813,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40183,12 +40855,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40243,9 +40924,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40402,9 +41080,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40471,9 +41146,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40561,6 +41233,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40651,9 +41326,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40663,9 +41335,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40678,9 +41347,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40708,6 +41374,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40750,7 +41419,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40804,9 +41473,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40858,12 +41524,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41059,10 +41719,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41107,9 +41764,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41230,6 +41884,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41857,6 +42514,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42121,9 +42784,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42169,9 +42829,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42787,7 +43444,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43384,6 +44041,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43408,19 +44068,37 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43432,10 +44110,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43588,7 +44266,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43786,9 +44464,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43798,9 +44473,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43828,9 +44500,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43840,6 +44509,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43993,6 +44665,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44005,6 +44680,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44074,9 +44752,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44176,18 +44851,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44209,12 +44902,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44446,12 +45133,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44467,6 +45148,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44521,15 +45205,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44602,6 +45289,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44632,6 +45322,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44674,6 +45367,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44728,6 +45427,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44770,6 +45472,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44842,10 +45547,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44857,6 +45562,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45133,6 +45841,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45160,12 +45871,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45220,6 +45925,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45334,6 +46042,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45382,6 +46093,18 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45706,6 +46429,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45811,6 +46540,9 @@ msgstr[2] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45829,9 +46561,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45877,6 +46606,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46075,6 +46807,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46108,6 +46846,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46144,12 +46888,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46303,6 +47041,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46525,6 +47266,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index 264887d4f96..84804fe769f 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:22\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index 4f974ebe020..61ca48e3c68 100644
--- a/locale/hy_AM/gitlab.po
+++ b/locale/hy_AM/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hy-AM\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 569e13bda38..253338aebae 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -622,9 +634,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -917,6 +932,9 @@ msgstr[0] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -952,6 +970,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1233,6 +1254,10 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1421,6 +1446,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1709,6 +1737,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1826,6 +1857,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -1916,9 +1953,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -1949,9 +1983,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ 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 new issue"
msgstr ""
@@ -2231,9 +2259,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -2990,9 +3042,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -4913,6 +4989,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8769,6 +9001,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,10 +9518,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9469,9 +9713,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,10 +13732,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13494,9 +13765,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14280,12 +14524,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14295,10 +14533,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14334,13 +14563,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,37 +18400,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,7 +18442,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22159,6 +22558,10 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,16 +25596,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25490,6 +25902,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28548,13 +29059,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28596,9 +29110,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -28863,7 +29371,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,7 +29398,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -28905,6 +29413,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,7 +29494,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29070,13 +29581,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29085,7 +29596,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29094,16 +29605,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29112,7 +29623,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29148,7 +29659,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29268,7 +29782,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36340,6 +36965,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -36929,6 +37569,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39191,6 +39843,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index 7c42830845a..a9581697c8a 100644
--- a/locale/ig_NG/gitlab.po
+++ b/locale/ig_NG/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ig\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -622,9 +634,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -917,6 +932,9 @@ msgstr[0] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -952,6 +970,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1233,6 +1254,10 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1421,6 +1446,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1709,6 +1737,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1826,6 +1857,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -1916,9 +1953,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -1949,9 +1983,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ 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 new issue"
msgstr ""
@@ -2231,9 +2259,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -2990,9 +3042,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -4913,6 +4989,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8769,6 +9001,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,10 +9518,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9469,9 +9713,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,10 +13732,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13494,9 +13765,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14280,12 +14524,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14295,10 +14533,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14334,13 +14563,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,37 +18400,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,7 +18442,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22159,6 +22558,10 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,16 +25596,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25490,6 +25902,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28548,13 +29059,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28596,9 +29110,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -28863,7 +29371,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,7 +29398,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -28905,6 +29413,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,7 +29494,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29070,13 +29581,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29085,7 +29596,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29094,16 +29605,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29112,7 +29623,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29148,7 +29659,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29268,7 +29782,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36340,6 +36965,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -36929,6 +37569,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39191,6 +39843,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index caaae0558dc..ec84c5ec1f8 100644
--- a/locale/is_IS/gitlab.po
+++ b/locale/is_IS/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: is\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index 7dd1e5865d6..94a2ecb748d 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:09\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d livello"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 Giorno"
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Token di accesso"
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Account"
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Confermi di voler resettare il token di controllo di stato?"
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Aggiungi un file tramite trascina &amp; rilascia ( drag &amp; drop) o %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr "Dettagli"
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr "Modifica"
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Job"
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Nuovo ambiente"
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr "Ancora nessuna chiave di rilascio"
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr "Mostra tutti"
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr "Trova in percorso"
msgid "Find file"
msgstr "Trova file"
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr ""
-
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
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|Prevent forking outside of the group"
+msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr "Questa impostazione è stata applicata a %{ancestor_group}. Puoi eseguir
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr "Gen"
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,18 +25787,15 @@ msgstr ""
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Nuovo file"
msgid "New group"
msgstr "Nuovo gruppo"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "Nessuna Repository"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr "Opzioni"
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr "Proprietario"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "Account pianificato per la rimozione."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Questa emoticon e questo messaggio appariranno sul tuo profilo e su tutta l'interfaccia."
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nome"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr "Seleziona una branch di destinazione"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr "Chiunque può accedere a questo progetto (senza alcuna autenticazione)."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr "Il tempo che impiega un issue per esser pianificato"
msgid "Time before an issue starts implementation"
msgstr "Il tempo che impiega un issue per esser implementato"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "Il tempo tra la creazione di una richiesta di merge ed il merge/close"
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "clicca per caricare"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index b204a0cfa7d..2fe056ee2a7 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:09\n"
msgid " %{start} to %{end}"
msgstr " %{start} ã‹ã‚‰ %{end} ã¾ã§"
@@ -119,7 +119,7 @@ msgstr[0] ""
msgid "%d additional committer"
msgid_plural "%d additional committers"
-msgstr[0] ""
+msgstr[0] "%d 人ã®è¿½åŠ ã‚³ãƒŸãƒƒã‚¿ãƒ¼"
msgid "%d approver"
msgid_plural "%d approvers"
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ラベル付ãã§ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã—ãŸ"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d 個ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼"
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d 秒"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d 件ã®ã‚¹ã‚¿ãƒ¼"
@@ -622,9 +634,15 @@ msgstr "%{labelStart}クラス:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}クラッシュアドレス:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}クラッシュ状態:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}エビデンス:%{labelEnd} %{evidence}"
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search} %{description} %{scope}"
-
msgid "%{seconds}s"
msgstr "%{seconds} 秒"
@@ -917,6 +932,9 @@ msgstr[0] "マージã™ã‚‹ãŸã‚ã« %{strong_start}%{count} 人ã®ãƒ¡ãƒ³ãƒãƒ¼%{
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} リリース"
@@ -952,6 +970,9 @@ msgstr "%{timebox_type} ã¯ãƒãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ãƒãƒ£ãƒ¼ãƒˆã‚’サãƒãƒ¼ãƒˆã—ã¦ã
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} ã«ã¯é–‹å§‹æ—¥ã¨çµ‚了日ãŒå¿…è¦ã§ã™"
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1110,7 +1131,7 @@ msgid "(max size 15 MB)"
msgstr "(最大サイズ 15MB)"
msgid "(optional)"
-msgstr ""
+msgstr "(オプション)"
msgid "(removed)"
msgstr "(除去ã—ã¾ã—ãŸ)"
@@ -1166,7 +1187,7 @@ msgid "+%{tags} more"
msgstr "+%{tags} 以上"
msgid ", "
-msgstr ""
+msgstr ", "
msgid ", or "
msgstr "ã€ã¾ãŸã¯"
@@ -1233,6 +1254,10 @@ msgstr "/day"
msgid "0 bytes"
msgstr "0 ãƒã‚¤ãƒˆ"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "%d æ—¥"
@@ -1421,6 +1446,9 @@ msgstr "Jekyllã®ã‚µã‚¤ãƒˆã§GitLabã®ä»£ã‚ã‚Šã«Netlifyã‚’CI/CDã§ä½¿ç”¨ã—ã¦
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Let's Encrypt ã®SSL証明書ã¯ã€ã‚ãªãŸã®ãƒ‰ãƒ¡ã‚¤ãƒ³ãŒç¢ºèªã•ã‚Œã‚‹ã¾ã§å–å¾—ã§ãã¾ã›ã‚“。"
+msgid "A Work Item can be a parent or a child, but not both."
+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を使用ã™ã‚‹åŸºæœ¬çš„ãªãƒšãƒ¼ã‚¸ã¨ã‚µãƒ¼ãƒãƒ¼ãƒ¬ã‚¹é–¢æ•°"
@@ -1709,6 +1737,9 @@ msgstr "ã“ã®ãƒ—ロジェクトã¯ä½¿ç”¨å¯èƒ½"
msgid "Access Git repositories or the API."
msgstr "Git リãƒã‚¸ãƒˆãƒªã¾ãŸã¯ API ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¾ã™ã€‚"
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "アクセス トークン"
@@ -1826,6 +1857,12 @@ msgstr " æ–°ã—ã„"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "アクセシビリティã®ã‚¹ã‚­ãƒ£ãƒ³ã§æ¬¡ã®ã‚¿ã‚¤ãƒ—ã®ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "アカウント"
@@ -1916,9 +1953,6 @@ msgstr "変更履歴を追加"
msgid "Add CONTRIBUTING"
msgstr "CONTRIBUTINGを追加"
-msgid "Add Jaeger URL"
-msgstr "Jaeger URL を追加"
-
msgid "Add Kubernetes cluster"
msgstr "Kubernetes クラスターを追加"
@@ -1949,9 +1983,6 @@ msgstr "GPGキーを追加"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 "Jaeger URL を追加ã—ã¦ã€ã“ã®ãƒšãƒ¼ã‚¸ã‚’ Jaeger サーãƒãƒ¼ã¸ã®ãƒªãƒ³ã‚¯ã«ç½®ãæ›ãˆã¾ã™ã€‚ã¾ãš %{link_start_tag}Jaeger をインストール%{link_end_tag}ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr "ã“ã® GitLab インスタンスã®ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—ã¦ã€åˆ©ç”¨è¦ç´„ã¨ãƒ—ライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼ã‚’追加ã—ã¾ã™ã€‚"
@@ -1979,9 +2010,6 @@ msgstr "ã“ã® %{noteableDisplayName} ã¸ä¸€èˆ¬çš„ãªã‚³ãƒ¡ãƒ³ãƒˆã‚’追加。"
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 new issue"
msgstr "æ–°ã—ã„イシューを作æˆã™ã‚‹"
@@ -2010,10 +2038,10 @@ msgid "Add a to do"
msgstr "Todoを追加"
msgid "Add an SSH key"
-msgstr "SSH éµã‚’追加"
+msgstr "SSH キーを追加"
msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
-msgstr ""
+msgstr "GitLabã¸ã®ã‚»ã‚­ãƒ¥ã‚¢ãªã‚¢ã‚¯ã‚»ã‚¹ã®ãŸã‚ã« SSH キーを追加ã—ã¾ã™ã€‚ 詳細ã¯%{help_link_start}ã“ã¡ã‚‰%{help_link_end}。"
msgid "Add an existing issue"
msgstr "既存ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’追加"
@@ -2231,9 +2259,6 @@ msgstr "ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æ–°æ©Ÿèƒ½"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "ã‚ãªãŸã® GitLab インスタンスã§æ–°ã—ã„アプリケーションを追加ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。権é™ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€GitLab 管ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
-msgid "Additional Metadata"
-msgstr "追加メタデータ"
-
msgid "Additional minutes"
msgstr "追加分数"
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps ドメイン"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2523,7 +2551,7 @@ msgid "AdminSettings|Email from GitLab - email users right from the Admin Area.
msgstr ""
msgid "AdminSettings|Enable Registration Features"
-msgstr ""
+msgstr "登録機能を有効ã«ã™ã‚‹"
msgid "AdminSettings|Enable Service Ping"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2631,7 +2662,7 @@ msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
msgid "AdminSettings|Registration Features include:"
-msgstr ""
+msgstr "登録機能ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™:"
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -2748,7 +2779,7 @@ msgid "AdminStatistics|Notes"
msgstr "ノート"
msgid "AdminStatistics|SSH Keys"
-msgstr "SSHéµ"
+msgstr "SSH キー"
msgid "AdminStatistics|Snippets"
msgstr "スニペット"
@@ -2780,7 +2811,7 @@ msgstr "2FA 無効"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA 有効"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr "アクセス"
msgid "AdminUsers|Access Git repositories"
msgstr "Git リãƒã‚¸ãƒˆãƒªã«ã‚¢ã‚¯ã‚»ã‚¹"
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr "API ã«ã‚¢ã‚¯ã‚»ã‚¹"
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "自動的ã«ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®å†…部ユーザーã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸã€‚"
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr "ブロック済ã¿"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "ユーザーã®ãƒ–ロックã«ã¯æ¬¡ã®åŠ¹æžœãŒã‚ã‚Šã¾ã™:"
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "サインインã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“"
@@ -2933,6 +2973,12 @@ msgstr "ã‚ãªãŸã§ã™ï¼"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr "ロック中"
@@ -2960,6 +3006,9 @@ msgstr "個人プロジェクトã¯æ®‹ã‚Šã¾ã™"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "個人プロジェクトã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å±¥æ­´ã¯ãã®ã¾ã¾æ®‹ã‚Šã¾ã™"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "ユーザーã®å†æœ‰åŠ¹åŒ–:"
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr "æ‹’å¦ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Web, Git, APIã‚’å«ã‚€ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¢ã‚¯ã‚»ã‚¹ã‚’復元ã—ã¾ã™ã€‚"
@@ -2990,9 +3042,15 @@ msgstr "ユーザーを検索"
msgid "AdminUsers|Send email to users"
msgstr "ユーザーã«Eメールをé€ä¿¡ã™ã‚‹"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "並ã³æ›¿ãˆ"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3000,7 +3058,7 @@ msgid "AdminUsers|The user can't log in."
msgstr ""
msgid "AdminUsers|The user has unlimited access to all groups, projects, users, and features."
-msgstr ""
+msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯ã€ã™ã¹ã¦ã®ã‚°ãƒ«ãƒ¼ãƒ—ã€ãƒ—ロジェクトã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã€ãŠã‚ˆã³æ©Ÿèƒ½ã¸ã®ç„¡åˆ¶é™ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "AdminUsers|The user will be logged out"
msgstr "ユーザーã¯ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã™"
@@ -3041,9 +3099,6 @@ msgstr "ユーザー %{username} ã®ãƒ­ãƒƒã‚¯ã‚’解除ã—ã¾ã™ã‹?"
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr "ユーザーã¯gitリãƒã‚¸ãƒˆãƒªã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚Šã¾ã™"
@@ -3062,6 +3117,9 @@ msgstr "ユーザーアカウントを検証ã™ã‚‹"
msgid "AdminUsers|View pending member requests"
msgstr "ä¿ç•™ä¸­ã®ãƒ¡ãƒ³ãƒãƒ¼ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’表示"
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr "管ç†"
+msgid "Administrators"
+msgstr ""
+
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 "追加ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã«ã‚ˆã£ã¦ç¢ºèªã•ã‚Œã€æ‰¿èªã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 使用状æ³ã®ä¸Šé™è©³ç´°ã«ã¤ã„ã¦ã¯ã€%{help_link_start} ã“ã¡ã‚‰%{help_link_end} ã‚’ã”覧ãã ã•ã„。"
@@ -3180,13 +3241,13 @@ msgid "After a successful password update, you will be redirected to the login p
msgstr "パスワードを正常ã«æ›´æ–°ã—ãŸå¾Œã€ãƒ­ã‚°ã‚¤ãƒ³ãƒšãƒ¼ã‚¸ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã‚‹ã®ã§ã€ãã“ã§æ–°ã—ã„パスワードã§ãƒ­ã‚°ã‚¤ãƒ³ã§ãã¾ã™ã€‚"
msgid "After it expires, you can't use merge approvals, code quality, or many other features."
-msgstr ""
+msgstr "有効期é™ãŒåˆ‡ã‚Œã‚‹ã¨ã€ãƒžãƒ¼ã‚¸æ‰¿èªã€Code Qualityã€ãã®ä»–多ãã®æ©Ÿèƒ½ãŒä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚"
msgid "After it expires, you can't use merge approvals, epics, or many other features."
-msgstr ""
+msgstr "有効期é™ãŒåˆ‡ã‚Œã‚‹ã¨ã€ãƒžãƒ¼ã‚¸æ‰¿èªã€ã‚¨ãƒ”ックã€ãã®ä»–多ãã®æ©Ÿèƒ½ãŒä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚"
msgid "After it expires, you can't use merge approvals, epics, or many security features."
-msgstr ""
+msgstr "有効期é™ãŒåˆ‡ã‚Œã‚‹ã¨ã€ãƒžãƒ¼ã‚¸æ‰¿èªã€ã‚¨ãƒ”ックã€ãã®ä»–多ãã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£æ©Ÿèƒ½ãŒä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚"
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr "エクスãƒãƒ¼ãƒˆãŒå®Œäº†ã—ãŸã‚‰ã€é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã¾ãŸã¯ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã—ã¾ã™ã€‚ ãã®å¾Œã€åˆ¥ã® GitLab インスタンス㮠%{strong_text_start}æ–°ã—ã„グループã®ä½œæˆ%{strong_text_end} ページã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ ファイルをインãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚"
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "%{group_name} ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã‚’許å¯"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®ãƒ—ロジェクト㫠Git LFS を使用ã§ãã‚‹
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "サブグループãŒç‹¬è‡ªã®2è¦ç´ èªè¨¼ãƒ«ãƒ¼ãƒ«ã‚’設定ã§ãるよã†ã«ã™ã‚‹"
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "ユーザーãŒGitLabã‚’OAuthプロãƒã‚¤ãƒ€ãƒ¼ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã‚らゆるアプリケーションを登録ã™ã‚‹ã“ã¨ã‚’許å¯"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "ユーザーãŒã‚¢ã‚¯ã‚»ã‚¹ã‚’リクエストã§ãるよã†ã«ã™ã‚‹(å¯è¦–性ãŒãƒ‘ブリックã¾ãŸã¯å†…部ã®å ´åˆ)"
-
msgid "Allowed"
msgstr "許å¯"
@@ -3698,12 +3750,18 @@ msgstr "メールドメイン制é™ã¯ã€æœ€ä¸Šä½ã‚°ãƒ«ãƒ¼ãƒ—ã«ã®ã¿è¨±å¯ã•
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "失敗を許容"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Kubernetes クラスターを追加ãŠã‚ˆã³ç®¡ç†ã§ãã¾ã™ã€‚"
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] "設定ã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "通知ã®è³¼èª­ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -4296,9 +4363,12 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "アプリケーション設定ã¯æ­£å¸¸ã«ä¿å­˜ã•ã‚Œã¾ã—ãŸ"
-msgid "Application settings update failed"
+msgid "Application settings saved successfully."
msgstr ""
+msgid "Application settings update failed"
+msgstr "アプリケーションã®è¨­å®šæ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
msgid "Application uninstalled but failed to destroy: %{error_message}"
msgstr "アプリケーションã¯ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¾ã—ãŸãŒã€ç ´æ£„ã«å¤±æ•—ã—ã¾ã—ãŸ: %{error_message}"
@@ -4350,7 +4420,7 @@ msgid_plural "ApplicationSettings|By making this change, you will automatically
msgstr[0] ""
msgid "ApplicationSettings|By making this change, you will automatically approve all users who are pending approval."
-msgstr ""
+msgstr "ã“ã®å¤‰æ›´ã‚’è¡Œã†ã¨ã€æ‰¿èªå¾…ã¡ã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè‡ªå‹•çš„ã«æ‰¿èªã•ã‚Œã¾ã™ã€‚"
msgid "ApplicationSettings|Denied domains for sign-ups"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr "ã“ã®ãƒ—ロジェクトã¯ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚リãƒã‚¸
msgid "Archived projects"
msgstr "アーカイブã•ã‚ŒãŸãƒ—ロジェクト"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4718,7 +4788,7 @@ msgid "Are you sure you want to delete this %{commentType}?"
msgstr ""
msgid "Are you sure you want to delete this SSH key?"
-msgstr ""
+msgstr "ã“ã® SSH キーを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
msgid "Are you sure you want to delete this comment?"
msgstr ""
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr "ã“ã® %{group_name} を削除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "添付ファイルを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "本当ã«ãƒ˜ãƒ«ã‚¹ãƒã‚§ãƒƒã‚¯ãƒˆãƒ¼ã‚¯ãƒ³ã‚’リセットã—ã¾ã™ã‹ï¼Ÿ"
@@ -4860,7 +4936,7 @@ msgid "Artifacts"
msgstr "アーティファクト"
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
-msgstr ""
+msgstr "SASTã®æ©Ÿèƒ½ã‚’ã•ã‚‰ã«æ§‹ç¯‰ã—ã¦ã„ã中ã§ã€%{linkStart}ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼%{linkEnd}ã®SAST設定機能ã«é–¢ã™ã‚‹ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’ãŠå¾…ã¡ã—ã¦ã„ã¾ã™ã€‚"
msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ):"
msgstr "%{user} ㌠%{project_name} ã®ãƒ–ランム%{branch} ã«ãƒ—ッシュã—ã¾ã—ãŸï¼ˆ%{commit_url}):"
@@ -4913,6 +4989,9 @@ msgstr "ラベルを割り当ã¦ã‚‹"
msgid "Assign milestone"
msgstr "マイルストーンを割り当ã¦ã‚‹"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr "レビュアーを割り当ã¦ã‚‹"
@@ -5007,9 +5086,6 @@ msgstr "å±é™º"
msgid "Attach a file"
msgstr "ファイルを添付"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "ドラッグ&ドロップã¾ãŸã¯ %{upload_link} ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’添付"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr "ユーザーイベント"
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "8月"
@@ -5138,7 +5229,7 @@ msgid "Authenticate"
msgstr "èªè¨¼"
msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead. %{link_start}How do I configure authentication using the GitLab database? %{link_end}"
-msgstr ""
+msgstr "追加ã®è¨­å®šã‚’å¿…è¦ã¨ã›ãšã«ãƒ¦ãƒ¼ã‚¶ã® SSH キーをèªè¨¼ã—ã¾ã™ã€‚代ã‚ã‚Šã« GitLab データベースを使用ã™ã‚‹ã“ã¨ã§ã€GitLab ã®ãƒ‘フォーマンスをå‘上ã§ãã¾ã™ã€‚ %{link_start}GitLab データベースを使用ã—ã¦èªè¨¼ã‚’設定ã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹ï¼Ÿ %{link_end}"
msgid "Authenticate with GitHub"
msgstr "GitHub ã§èªè¨¼ã—ã¾ã™"
@@ -5620,9 +5711,6 @@ msgstr "ã”注æ„ãã ã•ã„。プロジェクトã®åå‰ç©ºé–“を変更ã™ã‚‹
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "ã”注æ„ãã ã•ã„。プロジェクトã®ãƒªãƒã‚¸ãƒˆãƒªã®åå‰ã‚’変更ã™ã‚‹ã¨ã€æ„図ã—ãªã„副作用ãŒç™ºç”Ÿã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -5636,7 +5724,7 @@ msgid "Begin with the selected commit"
msgstr "é¸æŠžã—ãŸã‚³ãƒŸãƒƒãƒˆã§ã¯ã˜ã‚ã‚‹"
msgid "Below are the fingerprints for the current instance SSH host keys."
-msgstr "ç¾åœ¨ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®SSHホストキーã®ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ãƒ—リントã§ã™ã€‚"
+msgstr "以下ã¯ç¾åœ¨ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®SSHホストキーã®ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ãƒ—リントã§ã™ã€‚"
msgid "Below are the settings for %{link_to_gitlab_pages}."
msgstr ""
@@ -5828,7 +5916,7 @@ msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_lin
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
-msgstr ""
+msgstr "GitLab.com ã® %{plan} ã®è©¦ç”¨ç‰ˆã¯ã€ %{strong_open}%{expiration_date}後ã«æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¾ã™%{strong_close}。 以下をアップグレードã—ã¦ã€%{plan} ã®æ©Ÿèƒ½ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ãã®ã¾ã¾ã«ã§ãã¾ã™ã€‚"
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
msgstr "GitLab.com ã®è©¦ç”¨ç‰ˆã¯ %{expiration_date} ã«æœŸé™åˆ‡ã‚Œã«ãªã‚Šã¾ã—ãŸã€‚ 以下ã®ã‚¢ãƒƒãƒ—グレードã«ã‚ˆã‚Šã€ã„ã¤ã§ã‚‚ゴールド機能ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’復元ã§ãã¾ã™ã€‚"
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Bitbucket サーãƒãƒ¼ インãƒãƒ¼ãƒˆ"
@@ -6135,7 +6229,7 @@ msgid "BoardScope|Current iteration"
msgstr ""
msgid "BoardScope|Don't filter milestone"
-msgstr ""
+msgstr "マイルストーンをフィルターã—ãªã„"
msgid "BoardScope|Edit"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6518,7 +6615,7 @@ msgid "Built-in"
msgstr "ビルトイン"
msgid "Bulk request concurrency"
-msgstr ""
+msgstr "ãƒãƒ«ã‚¯ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ä¸¦åˆ—実行"
msgid "Bulk update"
msgstr ""
@@ -6527,7 +6624,7 @@ msgid "BulkImport| %{host} is running outdated GitLab version (v%{version})"
msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
-msgstr ""
+msgstr "%{feature} (v%{version} ãŒå¿…è¦)"
msgid "BulkImport|Destination"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr "ãƒãƒ¼ãƒ³ãƒ€ã‚¦ãƒ³ãƒãƒ£ãƒ¼ãƒˆ"
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr "共有ランナーã®åˆ©ç”¨æ™‚é–“ã¨ã¯?"
@@ -6951,7 +7057,7 @@ msgid "Can't find variable: ZiteReader"
msgstr "ZiteReader 変数ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "Can't load mermaid module: %{err}"
-msgstr ""
+msgstr "Mermaid モジュールをロードã§ãã¾ã›ã‚“: %{err} "
msgid "Can't scan the code?"
msgstr "コードをスキャンã§ãã¾ã™ã‹ï¼Ÿ"
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr "カード番å·:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr "変更ã¯æŠ‘制ã•ã‚Œã¾ã—ãŸã€‚クリックã—ã¦è¡¨ç¤º"
msgid "Changes the title to \"%{title_param}\"."
msgstr "タイトルを \"%{title_param}\" ã«å¤‰æ›´ã—ã¾ã™ã€‚"
-msgid "Changes to free tier open source projects"
-msgstr "無料利用枠ã®ã‚ªãƒ¼ãƒ—ンソースプロジェクトã¸ã®å¤‰æ›´"
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7396,7 +7502,7 @@ msgid_plural "Checkout|%d CI minute packs"
msgstr[0] ""
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
-msgstr ""
+msgstr "%{cardType} ã®æœ«å°¾ %{lastFourDigits}"
msgid "Checkout|%{name}'s CI minutes"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr "GitLabプラン"
msgid "Checkout|Group"
msgstr "グループ"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "GitLab を使用ã—ã¦ã„る会社åã¾ãŸã¯çµ„ç¹”å"
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr "税"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr "åˆè¨ˆ"
@@ -7636,6 +7745,9 @@ msgstr "å­ã‚¨ãƒ”ックãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "クローズã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr "クラスター"
@@ -8036,9 +8268,6 @@ msgstr "クラスターã®å¥åº·çŠ¶æ…‹"
msgid "Cluster cache cleared."
msgstr "クラスターã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’削除ã—ã¾ã—ãŸ"
-msgid "Cluster does not exist"
-msgstr "クラスターãŒå­˜åœ¨ã—ã¾ã›ã‚“"
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr "ã“ã®Kubernetesクラスタ統åˆã«é–¢ã™ã‚‹è©³ç´°ã‚ªãƒ—ション"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’使用ã™ã‚‹ç’°å¢ƒã‚’é¸æŠžã—ã¦ãã ã•ã„。"
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "クラスターã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’削除"
@@ -8490,9 +8719,6 @@ msgstr "ã”存知ã§ã™ã‹ï¼Ÿ"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes サービス"
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,11 +8896,17 @@ msgstr "クラスターã®èªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹Kubernetes証明書。"
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "Kubernetes APIã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã•ã‚Œã‚‹URL。"
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
-msgstr "プロジェクトã«é–¢é€£ä»˜ã‘ã—ãŸåå‰ç©ºé–“。ã“ã‚Œã¯ã€ãƒ‡ãƒ—ロイボードã€ãƒ­ã‚°ã€ãŠã‚ˆã³Web端末ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
+msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
msgstr "クラスターã¨ã®èªè¨¼ã«å•é¡ŒãŒã‚ã‚Šã¾ã—ãŸã€‚ CA証明書ã¨ãƒˆãƒ¼ã‚¯ãƒ³ãŒæœ‰åŠ¹ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
@@ -8767,6 +8999,12 @@ msgid "Code Review"
msgstr "コードレビュー"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
+msgstr "コードレビュー分æžã¯ã€ã‚³ãƒ¼ãƒ‰ãƒ¬ãƒ“ュー中ã§ã‚ã‚‹ã€ã‚ªãƒ¼ãƒ—ンã—ãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚ç¾åœ¨ã€ã“ã®ãƒ—ロジェクトã¾ãŸã¯ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã€ã‚ã‚‹ã„ã¯ãã®ä¸¡æ–¹ã®ãƒ¬ãƒ“ュー対象ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
msgstr ""
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
@@ -8850,17 +9088,20 @@ msgstr ""
msgid "Collector hostname"
msgstr "コレクタã®ãƒ›ã‚¹ãƒˆå"
-msgid "ColorWidget|An error occurred while updating color."
+msgid "Color"
msgstr ""
+msgid "ColorWidget|An error occurred while updating color."
+msgstr "カラーã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
msgid "ColorWidget|Assign epic color"
-msgstr ""
+msgstr "エピックã®è‰²ã‚’割り当ã¦ã‚‹"
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "色"
msgid "ColorWidget|Error fetching epic color."
-msgstr ""
+msgstr "エピックカラーã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Colorize messages"
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,12 +9518,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-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 advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr "権é™ã€Large File Storageã€2è¦ç´ èªè¨¼ã¨é¡§å®¢é–¢ä¿‚ã®é«˜åº¦ãªè¨­å®š"
@@ -9469,9 +9713,6 @@ msgstr "コンテナレジストリ"
msgid "Container Scanning"
msgstr "コンテナã®ã‚¹ã‚­ãƒ£ãƒ³"
-msgid "Container does not exist"
-msgstr "コンテナãŒã‚ã‚Šã¾ã›ã‚“"
-
msgid "Container must be a project or a group."
msgstr "コンテナã¯ãƒ—ロジェクトã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -9488,7 +9729,7 @@ msgid "Container repository"
msgstr ""
msgid "ContainerRegistry| Please visit the %{linkStart}administration settings%{linkEnd} to enable this feature."
-msgstr ""
+msgstr "%{linkStart}管ç†è¨­å®š%{linkEnd} ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã—ã¦ãã ã•ã„。"
msgid "ContainerRegistry|%{count} Image repository"
msgid_plural "ContainerRegistry|%{count} Image repositories"
@@ -9517,7 +9758,7 @@ msgid "ContainerRegistry|CLI Commands"
msgstr "CLI コマンド"
msgid "ContainerRegistry|Clean up image tags"
-msgstr ""
+msgstr "イメージタグをクリーンアップ"
msgid "ContainerRegistry|Cleanup disabled"
msgstr ""
@@ -9688,18 +9929,18 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr "クリーンアップã®å®Ÿè¡Œ:"
msgid "ContainerRegistry|Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
-msgstr ""
+msgstr "コンテナレジストリã‹ã‚‰ã‚¿ã‚°ã‚’自動的ã«å‰Šé™¤ã—ã€å¿…è¦ãªã‚¿ã‚°ã‚’ä¿æŒã™ã‚‹ã“ã¨ã§ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚¹ãƒšãƒ¼ã‚¹ã‚’節約ã§ãã¾ã™ã€‚ %{linkStart}クリーンアップã¯ã©ã®ã‚ˆã†ã«æ©Ÿèƒ½ã—ã¾ã™ã‹ï¼Ÿ%{linkEnd}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10145,7 +10386,7 @@ msgid "Could not connect to FogBugz, check your URL"
msgstr "FogBugz ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã€URL を確èªã—ã¦ãã ã•ã„"
msgid "Could not connect to Sentry. Refresh the page to try again."
-msgstr ""
+msgstr "Sentry ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ページを更新ã—ã¦ã€å†åº¦ãŠè©¦ã—ãã ã•ã„。"
msgid "Could not connect to Web IDE file mirror service."
msgstr "Web IDE ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒŸãƒ©ãƒ¼ã‚µãƒ¼ãƒ“スã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -10154,7 +10395,7 @@ msgid "Could not create Wiki Repository at this time. Please try again later."
msgstr "Wikiリãƒã‚¸ãƒˆãƒªã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Could not create environment"
-msgstr ""
+msgstr "環境を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Could not create group"
msgstr "グループを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -10232,7 +10473,7 @@ msgid "Could not save prometheus manual configuration"
msgstr "プロメテウスã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«è¨­å®šã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Could not update the LDAP settings"
-msgstr ""
+msgstr "LDAP ã®è¨­å®šã‚’æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Could not update wiki page"
msgstr ""
@@ -10256,7 +10497,7 @@ msgid "Create"
msgstr "作æˆ"
msgid "Create %{environment}"
-msgstr ""
+msgstr "%{environment} を作æˆ"
msgid "Create %{humanized_resource_name}"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr "ラベルã®æ–°è¦ä½œæˆ"
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr "デフォルトブランãƒ"
msgid "Default branch and protected branches"
msgstr "デフォルトブランãƒã¨ä¿è­·ãƒ–ランãƒ"
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr "イシューã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®èª¬æ˜Žãƒ†ãƒ³ãƒ—レート"
@@ -11766,9 +12022,6 @@ msgstr "週ã®å§‹ã¾ã‚Šã®æ›œæ—¥ (デフォルト)"
msgid "Default first day of the week in calendars and date pickers."
msgstr "カレンダーã¨æ—¥ä»˜ã®è¨­å®šã§ä½¿ç”¨ã™ã‚‹ã€é€±ã®æœ€åˆã®æ—¥(デフォルト)"
-msgid "Default project deletion protection"
-msgstr "プロジェクトã®å‰Šé™¤ä¿è­·è¨­å®šï¼ˆãƒ‡ãƒ•ã‚©ãƒ«ãƒˆï¼‰"
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr "コメントを削除"
msgid "Delete File"
msgstr "ファイルを削除"
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr "ラベルを削除"
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "æ–°ã—ã„コメントを追加ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr "コメントã®ç¶­æŒ"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "è¦æ±‚ã•ã‚ŒãŸãƒ‡ã‚¶ã‚¤ãƒ³ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯å­˜åœ¨ã—ã¾ã›ã‚“。代ã‚ã‚Šã«æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã—ã¦ã„ã¾ã™"
@@ -12773,6 +13044,9 @@ msgstr "詳細"
msgid "Details (default)"
msgstr "詳細 (デフォルト)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "ホストキーã®æ¤œå‡º"
@@ -12789,7 +13063,7 @@ msgid "Devices (optional)"
msgstr ""
msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
-msgstr ""
+msgstr "%{adoptedCount}/%{featuresCount} %{title} 機能を採用"
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr "ã“ã®ãƒ—ロジェクトã§ã¯ç„¡åŠ¹ã«ã™ã‚‹"
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr "2è¦ç´ èªè¨¼ã‚’無効ã«ã™ã‚‹"
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,12 +13732,12 @@ msgstr ""
msgid "Edit"
msgstr "編集"
-msgid "Edit %{issuable}"
-msgstr "%{issuable} を編集"
-
msgid "Edit %{name}"
msgstr "%{name} を編集"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "コメントを編集"
@@ -13494,9 +13765,6 @@ msgstr "パスワードを編集"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "リリースを編集"
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr "ElasticsearchãŒè¿”ã—ãŸã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰: %{status_code}"
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr "埋ã‚è¾¼ã¿"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr "空ã®ãƒ•ã‚¡ã‚¤ãƒ«"
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "Auto DevOps を有効ã«ã™ã‚‹"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr "有効ãªGitアクセスプロトコル"
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr "プロジェクト作æˆä¸­ã®ã‚³ãƒ¼ãƒ‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æœ‰åŠ¹ãªã‚½ãƒ¼ã‚¹ã€‚ OmniAuth 㯠GitHub 用ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-
msgid "Encountered an error while rendering: %{err}"
msgstr "レンダリング中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %{err}"
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "コミット"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr "ç¾åœ¨%{fetched}ã®çµæžœã‚’表示ã—ã¦ã„ã¾ã™ã€‚"
-
-msgid "Environments|Currently showing all results."
-msgstr "ç¾åœ¨ã™ã¹ã¦ã®çµæžœã‚’表示ã—ã¦ã„ã¾ã™ã€‚"
-
msgid "Environments|Delete"
msgstr "削除"
@@ -14256,9 +14506,6 @@ msgstr "環境ã¨ã¯ã€staging ã‚„ production ã¨ã„ã£ãŸã‚³ãƒ¼ãƒ‰ã‚’デプロã
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr "クラスターã«Elastic Stackをインストールã—ã¦ã€å…¨æ–‡æ¤œç´¢ç­‰ã®é«˜åº¦ãªæ‹¡å¼µã‚¯ã‚¨ãƒªæ©Ÿèƒ½ã‚’有効ã«ã—ã¾ã™ã€‚"
-
msgid "Environments|Job"
msgstr "ジョブ"
@@ -14268,9 +14515,6 @@ msgstr "環境ã®è©³ç´°ã«ã¤ã„ã¦å­¦ã¶"
msgid "Environments|Learn more about stopping environments"
msgstr "環境ã®åœæ­¢ã«ã¤ã„ã¦"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "æ–°ã—ã„環境"
@@ -14280,12 +14524,6 @@ msgstr "デプロイã•ã‚ŒãŸç’°å¢ƒã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "Environments|No deployments yet"
msgstr "未デプロイ"
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr "表示ã™ã‚‹ãƒãƒƒãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯ç’°å¢ƒã‚’åœæ­¢ã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。ã—ã‹ã—ã€%{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} ファイルã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ã€ç’°å¢ƒåœæ­¢ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ä»¥å¤–ã«ã‚ˆã‚‹ã€ã‚らゆる既存ã®ãƒ‡ãƒ—ロイメントã«å½±éŸ¿ã‚’ %{emphasisStart}与ãˆã¾ã›ã‚“%{emphasisEnd}。"
@@ -14295,11 +14533,8 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr "ライブ環境を開ã"
-msgid "Environments|Pod name"
-msgstr "ãƒãƒƒãƒ‰å"
-
-msgid "Environments|Re-deploy"
-msgstr "å†ãƒ‡ãƒ—ロイ"
+msgid "Environments|Re-deploy environment"
+msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
msgstr "環境 %{name} å†ãƒ‡ãƒ—ロイã—ã¾ã™ã‹?"
@@ -14307,18 +14542,12 @@ msgstr "環境 %{name} å†ãƒ‡ãƒ—ロイã—ã¾ã™ã‹?"
msgid "Environments|Re-deploy to environment"
msgstr "環境ã«å†ãƒ‡ãƒ—ロイ"
-msgid "Environments|Rollback"
-msgstr "ロールãƒãƒƒã‚¯"
-
msgid "Environments|Rollback environment"
msgstr "環境ã®ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯"
msgid "Environments|Rollback environment %{name}?"
msgstr "環境 %{name} をロールãƒãƒƒã‚¯ã—ã¾ã™ã‹?"
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr "全件を表示"
@@ -14334,14 +14563,11 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr "ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚³ãƒŸãƒƒãƒˆ %{linkStart}%{commitId}%{linkEnd} ã®ã‚¸ãƒ§ãƒ–ã‚’å†èµ·å‹•ã—ã€ç’°å¢ƒã‚’以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã—ã¾ã™ã€‚本当ã«ç¶šã‘ã¾ã™ã‹ï¼Ÿ"
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
-msgstr "ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯ã€ã‚³ãƒŸãƒƒãƒˆ %{linkStart}%{commitId}%{linkEnd} ã«å¯¾ã—㦠%{name} ã§å®šç¾©ã•ã‚ŒãŸã‚¸ãƒ§ãƒ–を実行ã—ã¦ã€ç’°å¢ƒã‚’å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã—ã¾ã™ã€‚アプリケーションã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å†ãƒ‡ãƒ—ロイã™ã‚‹ã“ã¨ã§ revert ã§ãã¾ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr ""
msgid "Environments|Upcoming"
msgstr ""
@@ -14475,6 +14701,9 @@ msgstr "エピックã‹ã‚‰ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’削除ã—ã¦ã‚‹é–“ã«ä½•ã‹å•é¡ŒãŒç™º
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr "ã“ã®ã‚¨ãƒ”ックã¨ã“ã‚Œå«ã¾ã‚Œã¦ã„ã‚‹å­ã‚¨ãƒ”ックã¯éžå…¬é–‹ã§ã‚ã‚Šã€å°‘ãªãã¨ã‚‚Reporterアクセス権é™ã®ã‚ã‚‹ãƒãƒ¼ãƒ ãƒ¡ãƒ³ãƒãƒ¼ã«ã®ã¿è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "アクティブ"
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr "アクセスã§ãる人ã™ã¹ã¦"
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "全員ãŒè²¢çŒ®ã§ãã¾ã™"
@@ -15103,8 +15338,8 @@ msgstr ""
msgid "Expires"
msgstr "有効期é™"
-msgid "Expires in %{expires_at}"
-msgstr "%{expires_at} ã§æœŸé™åˆ‡ã‚Œ"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr ""
msgid "Expires on"
msgstr ""
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr "失敗"
msgid "Failed Jobs"
msgstr "失敗ã—ãŸã‚¸ãƒ§ãƒ–"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15339,7 +15581,7 @@ msgid "Failed to create framework"
msgstr ""
msgid "Failed to create import label for jira import."
-msgstr ""
+msgstr "Jira インãƒãƒ¼ãƒˆã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒ©ãƒ™ãƒ«ãŒä½œæˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Failed to create new access token: %{token_response_message}"
msgstr ""
@@ -15414,13 +15656,13 @@ msgid "Failed to load errors from Sentry."
msgstr ""
msgid "Failed to load group activity metrics. Please try again."
-msgstr ""
+msgstr "グループアクティビティメトリクスを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Failed to load groups, users and deploy keys."
msgstr ""
msgid "Failed to load groups."
-msgstr ""
+msgstr "グループã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Failed to load iteration cadences."
msgstr ""
@@ -15616,13 +15858,13 @@ msgid "FeatureFlags|Active"
msgstr "アクティブ"
msgid "FeatureFlags|Add strategy"
-msgstr ""
+msgstr "戦略ã®è¿½åŠ "
msgid "FeatureFlags|All Environments"
msgstr ""
msgid "FeatureFlags|All Users"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼"
msgid "FeatureFlags|All users"
msgstr "ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼"
@@ -15634,7 +15876,7 @@ msgid "FeatureFlags|Configure feature flags"
msgstr "機能フラグを設定"
msgid "FeatureFlags|Consider using the more flexible \"Percent rollout\" strategy instead."
-msgstr ""
+msgstr "代ã‚ã‚Šã«ã€ã‚ˆã‚ŠæŸ”軟㪠\"パーセントロールアウト\" 戦略ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„。"
msgid "FeatureFlags|Create feature flag"
msgstr "機能フラグを作æˆ"
@@ -15652,7 +15894,7 @@ msgid "FeatureFlags|Edit Feature Flag"
msgstr "機能フラグを編集"
msgid "FeatureFlags|Edit User List"
-msgstr ""
+msgstr "ユーザーリストを編集"
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
@@ -15706,7 +15948,7 @@ msgid "FeatureFlags|Instance ID"
msgstr "インスタンス ID"
msgid "FeatureFlags|List details"
-msgstr ""
+msgstr "リストã®è©³ç´°"
msgid "FeatureFlags|Loading feature flags"
msgstr "機能フラグを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
@@ -15724,22 +15966,22 @@ msgid "FeatureFlags|New Feature Flag"
msgstr "æ–°ã—ã„機能フラグ"
msgid "FeatureFlags|New User List"
-msgstr ""
+msgstr "æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒªã‚¹ãƒˆ"
msgid "FeatureFlags|New feature flag"
msgstr "æ–°ã—ã„機能フラグ"
msgid "FeatureFlags|No user list selected"
-msgstr ""
+msgstr "ユーザーリストãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "FeatureFlags|Percent of users"
-msgstr ""
+msgstr "ユーザーã®å‰²åˆ"
msgid "FeatureFlags|Percent rollout"
-msgstr ""
+msgstr "パーセントロールアウト"
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
-msgstr ""
+msgstr "ロールアウト率ã¯0〜100ã®æ•´æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
msgid "FeatureFlags|Remove"
msgstr "削除"
@@ -15748,7 +15990,7 @@ msgid "FeatureFlags|Search code references"
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 ""
+msgstr "Unleash クライアントアプリケーションåã«ã€ã‚ãªãŸã®ã‚¢ãƒ—リケーションを実行ã™ã‚‹ç’°å¢ƒã®åå‰ã‚’設定ã—ã¾ã™ã€‚ ã“ã®å€¤ã¯ç’°å¢ƒã‚¹ã‚³ãƒ¼ãƒ—ã¨ä¸€è‡´ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™ã€‚ %{linkStart}クライアント設定ã®ä¾‹%{linkEnd} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
msgid "FeatureFlags|Status"
msgstr "ステータス"
@@ -15769,13 +16011,13 @@ msgid "FeatureFlags|User IDs"
msgstr "ユーザーID"
msgid "FeatureFlags|User List"
-msgstr ""
+msgstr "ユーザーリスト"
msgid "FeatureFlags|User Lists"
-msgstr ""
+msgstr "ユーザーリスト"
msgid "FeatureFlags|View user lists"
-msgstr ""
+msgstr "ユーザーリストã®è¡¨ç¤º"
msgid "FeatureFlag|Percentage"
msgstr ""
@@ -15790,7 +16032,7 @@ msgid "FeatureFlag|There are no configured user lists"
msgstr ""
msgid "FeatureFlag|Type"
-msgstr ""
+msgstr "タイプ"
msgid "FeatureFlag|User IDs"
msgstr ""
@@ -15966,8 +16208,11 @@ msgstr "パスã§æ¤œç´¢"
msgid "Find file"
msgstr "ファイルを検索"
-msgid "Fingerprint"
-msgstr "フィンガープリント"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
+msgstr ""
msgid "Fingerprints"
msgstr "フィンガープリント"
@@ -15975,6 +16220,9 @@ msgstr "フィンガープリント"
msgid "Finish editing this message first!"
msgstr "å…ˆã«ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç·¨é›†ã‚’終ãˆã¦ãã ã•ã„。"
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr "詳ã—ã„情報ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ãƒ•ãƒƒã‚¯ã®æ–‡æ›¸ã‚’ã”覧ãã ã•ã„"
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr "確èªã‚’ä¿ç•™ä¸­"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr "プロジェクト"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "プロジェクト (ID: %{project_id}) ã¯ãƒ—ライマリã«å­˜åœ¨ã—ã¾ã›ã‚“。ã“ã®ã‚¨ãƒ³ãƒˆãƒªã‚’削除ã—ã¦ã‚‚ã€ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã®ãƒ‡ãƒ¼ã‚¿ã¯å‰Šé™¤ã•ã‚Œãªã„ã®ã§å®‰å…¨ã§ã™ã€‚"
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "åŒæœŸæ¸ˆã¿"
-msgid "Geo|Synced at"
-msgstr "åŒæœŸå…ˆ"
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr "Git ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr "GitHub APIã®åˆ¶é™ã‚’超ãˆã¾ã—ãŸã€‚ %{reset_time} 後ã«å†è©¦è¡Œã—ã¦ãã ã•ã„"
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "GitLab インãƒãƒ¼ãƒˆ"
@@ -17070,7 +17339,7 @@ msgid "GitLab is open source software to collaborate on code."
msgstr ""
msgid "GitLab is undergoing maintenance"
-msgstr ""
+msgstr "GitLab ã¯ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ä¸­ã§ã™"
msgid "GitLab logo"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr "GitLab 㯠%{jaeger_link} を使ã£ã¦åˆ†æ•£ã‚·ã‚¹ãƒ†ãƒ ã‚’モニタリングã—ã¾ã™ã€‚"
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17148,7 +17414,7 @@ msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable th
msgstr ""
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "最大サイズ (MB)"
msgid "GitLabPages|New Domain"
msgstr "新ドメイン"
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr "未確èª"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr "確èªæ¸ˆ"
@@ -17291,9 +17560,15 @@ msgstr "グローãƒãƒ« ショートカット"
msgid "Global notification settings"
msgstr "グローãƒãƒ«é€šçŸ¥è¨­å®š"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr "Gravatar を有効化"
msgid "Group"
msgstr "グループ"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr "グループã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Group wikis"
msgstr "グループ Wiki"
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "グループ:%{group_name}"
@@ -17777,7 +18067,7 @@ msgstr "グループ: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -17814,7 +18104,7 @@ msgid "GroupPage|Group ID: %{group_id}"
msgstr "グループID: %{group_id}"
msgid "GroupRoadmap|%{dateWord} – No end date"
-msgstr ""
+msgstr "%{dateWord} – 終了日未設定"
msgid "GroupRoadmap|%{startDateInWords} – %{endDateInWords}"
msgstr ""
@@ -17826,7 +18116,7 @@ msgid "GroupRoadmap|No start and end date"
msgstr ""
msgid "GroupRoadmap|No start date – %{dateWord}"
-msgstr ""
+msgstr "開始日未設定 – %{dateWord}"
msgid "GroupRoadmap|Something went wrong while fetching epics"
msgstr "エピックã®èª­ã¿è¾¼ã¿ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -18003,7 +18293,7 @@ msgid "GroupSAML|To be able to enable group-managed accounts, you first need to
msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
-msgstr ""
+msgstr "外部フォークをç¦æ­¢ã™ã‚‹ã«ã¯ã€å…ˆã«å°‚用ã®ã‚°ãƒ«ãƒ¼ãƒ—管ç†ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’é©ç”¨ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
msgstr ""
@@ -18012,7 +18302,7 @@ msgid "GroupSAML|Valid SAML Response"
msgstr "妥当ãªSAMLレスãƒãƒ³ã‚¹"
msgid "GroupSAML|With prohibit outer forks flag enabled group members will be able to fork project only inside your group."
-msgstr ""
+msgstr "外部フォークç¦æ­¢ãƒ•ãƒ©ã‚°ã‚’有効ã«ã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—内ã«ã ã‘プロジェクトをフォークã§ãã¾ã™ã€‚"
msgid "GroupSAML|as %{access_level}"
msgstr ""
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr "グループオーナーã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œãªã„é™ã‚Šã€ã™ã¹ã¦ã®ã‚µãƒ–グループã«é©ç”¨ã•ã‚Œã¾ã™ã€‚プロジェクトã«ã™ã§ã«è¿½åŠ ã•ã‚Œã¦ã„るグループã¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’失ã„ã¾ã™ã€‚"
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Auto DevOps パイプラインãŒã‚°ãƒ«ãƒ¼ãƒ—用ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸ"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr "トップレベルã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã§ä½¿ç”¨ã§ãã¾ã™ã€‚ã™ã¹ã¦ã®ã‚µãƒ–グループã«é©ç”¨ã•ã‚Œã¾ã™ã€‚%{group}ã®å¤–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨æ—¢ã«å…±æœ‰ã—ã¦ã„るグループã¯ã€æ‰‹å‹•ã§å‰Šé™¤ã—ãªã„é™ã‚Šã€å…±æœ‰ã•ã‚ŒãŸã¾ã¾ã§ã™ã€‚"
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr "カスタムプロジェクトテンプレート"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒãƒƒã‚¸ã‚’カスタマイズã—ã¾ã™ã€‚"
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®ã™ã¹ã¦ã®ãƒ—ロジェクトã«å¯¾ã—ã¦ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã® Auto DevOps パイプライン"
-msgid "GroupSettings|Disable email notifications"
-msgstr "メール通知を無効ã«ã™ã‚‹"
-
-msgid "GroupSettings|Disable group mentions"
-msgstr "グループã®ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã‚’無効ã«ã™ã‚‹"
+msgid "GroupSettings|Email notifications are disabled"
+msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,6 +18400,18 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr "親グループã®å¯è¦–性ãŒã‚°ãƒ«ãƒ¼ãƒ—ã®ç¾åœ¨ã®å¯è¦–性より低ã„å ´åˆã€ã‚µãƒ–グループã¨ãƒ—ロジェクトã®å¯è¦–性レベルã¯ã€æ–°ã—ã„親グループã®å¯è¦–性ã«åˆã‚ã›ã¦å¤‰æ›´ã•ã‚Œã¾ã™ã€‚"
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "ã“ã®è¨­å®šã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã‚µãƒ–グループã€ãŠã‚ˆã³ãƒ—ロジェクトã®ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼é€šçŸ¥è¨­å®šã‚’上書ãã—ã¾ã™ã€‚"
@@ -18128,22 +18427,13 @@ 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 "%{group} ã¨ãã®ã‚µãƒ–グループ以外ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®æ‹›å¾…をメンãƒãƒ¼ãŒé€ä¿¡ã§ããªã„よã†ã«ã—ã¾ã™ã€‚"
-
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "%{group} 内ã®ãƒ—ロジェクトを他ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ãªã„よã†ã«ã™ã‚‹"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr "グループãŒãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã•ã‚ŒãŸå ´åˆã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«é€šçŸ¥ã•ã‚Œãªã„よã†ã«ã—ã¾ã™ã€‚"
-
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,18 +18442,27 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr "親グループをé¸æŠž"
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
msgstr ""
-msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
+msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®å„ページサイトã®ã™ã¹ã¦ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚µã‚¤ã‚ºåˆ¶é™ã‚’設定ã—ã¦ãã ã•ã„。 %{link_start}詳細ã¯ã“ã¡ã‚‰ã€‚%{link_end}"
+
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚設定を上æ›
msgid "GroupSettings|Transfer group"
msgstr "グループã®è»¢é€"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18255,13 +18554,13 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "グループã¯è¤‡æ•°ã®ãƒ—ロジェクトã®é›†åˆä½“ã§ã™ã€‚"
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "æ–°è¦ãƒ—ロジェクトを作æˆ"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "æ–°ã—ã„サブグループを作æˆ"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
-msgstr ""
+msgstr "グループã¯ã€è¤‡æ•°ã®ãƒ—ロジェクトã¨ãƒ¡ãƒ³ãƒãƒ¼ã‚’管ç†ã™ã‚‹ãŸã‚ã®æœ€è‰¯ã®æ–¹æ³•ã§ã™ã€‚"
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "グループã¯ãƒ—ロジェクトを整ç†ã™ã‚‹ãŸã‚ã®ã€ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã®ã‚ˆã†ã«æ©Ÿèƒ½ã—ã¾ã™ã€‚"
@@ -18270,7 +18569,7 @@ msgid "GroupsEmptyState|No groups found"
msgstr "グループã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "GroupsEmptyState|No subgroups or projects."
-msgstr ""
+msgstr "サブグループやプロジェクトã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
msgstr ""
@@ -18279,7 +18578,7 @@ msgid "GroupsEmptyState|You can manage your group member’s permissions and acc
msgstr "グループメンãƒãƒ¼ã®æ¨©é™ç®¡ç†ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—内ã®å„プロジェクトã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’管ç†ã§ãã¾ã™ã€‚"
msgid "GroupsEmptyState|You do not have necessary permissions to create a subgroup or project in this group. Please contact an owner of this group to create a new subgroup or project."
-msgstr ""
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚µãƒ–グループã¾ãŸã¯ãƒ—ロジェクトを作æˆã™ã‚‹ãŸã‚ã«å¿…è¦ãªæ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 æ–°ã—ã„サブグループã¾ãŸã¯ãƒ—ロジェクトを作æˆã™ã‚‹ã«ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®æ‰€æœ‰è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
msgstr ""
@@ -18317,9 +18616,6 @@ msgstr "グループをインãƒãƒ¼ãƒˆ"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,12 +19091,12 @@ msgstr "ホームページ"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr "フックã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚グループã«ã‚³ãƒŸãƒƒãƒˆã®ã‚るプロジェクトãŒã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
-msgid "Hook was successfully created."
-msgstr "フックã¯æ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
-
msgid "Hook was successfully updated."
msgstr "フックã¯æ­£å¸¸ã«æ›´æ–°ã—ã¾ã—ãŸã€‚"
+msgid "Horizontal rule"
+msgstr ""
+
msgid "Hostname"
msgstr ""
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "時間 (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ング"
@@ -18922,7 +19215,7 @@ msgid "IDE|Review"
msgstr "レビュー"
msgid "IDE|Start a new merge request"
-msgstr ""
+msgstr "æ–°ã—ã„マージリクエストを開始"
msgid "IDE|Successful commit"
msgstr "コミットã«æˆåŠŸ"
@@ -18934,10 +19227,10 @@ msgid "IDE|This option is disabled because you don't have write permissions for
msgstr ""
msgid "INFO: Your SSH key has expired. Please generate a new key."
-msgstr "情報: SSH éµã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚æ–°ã—ã„ SSH éµã‚’生æˆã—ã¦ãã ã•ã„。"
+msgstr "情報: SSH キーã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚æ–°ã—ã„ SSH キーを生æˆã—ã¦ãã ã•ã„。"
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
-msgstr "情報: SSHéµãŒã¾ã‚‚ãªã期é™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚æ–°ã—ã„ SSHéµ ã‚’ç”Ÿæˆã—ã¦ãã ã•ã„。"
+msgstr "情報: SSH キーãŒã¾ã‚‚ãªã期é™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚æ–°ã—ã„ SSH キーを生æˆã—ã¦ãã ã•ã„。"
msgid "IP Address"
msgstr "IP アドレス"
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -19084,7 +19428,7 @@ msgid "Ignore"
msgstr "無視ã™ã‚‹"
msgid "Ignored"
-msgstr ""
+msgstr "無視済ã¿"
msgid "Image URL"
msgstr "ç”»åƒã®URL"
@@ -19143,7 +19487,7 @@ msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
-msgstr ""
+msgstr "インãƒãƒ¼ãƒˆå…ƒ"
msgid "Import from Jira"
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "通知メールã®æœ¬æ–‡ã«ä½œæˆè€…ã®åå‰ã‚’å«ã‚ã‚‹"
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr "コードブロックを挿入"
-
msgid "Insert a quote"
msgstr "引用を挿入"
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr "無効ãªã‚¤ãƒ³ã‚µã‚¤ãƒˆè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ãŒã¿ã¤ã‹ã‚Šã¾ã—ãŸ"
@@ -20653,15 +21042,6 @@ msgstr "無効㪠URL"
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr "無効ãªã‚«ãƒ¼ã‚½ãƒ«ã®å€¤ãŒæä¾›ã•ã‚Œã¾ã—ãŸ"
-
msgid "Invalid date"
msgstr "無効ãªæ—¥ä»˜"
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr "リãƒã‚¸ãƒˆãƒªãƒ‘スãŒç„¡åŠ¹ã§ã™"
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr "無効ãªã‚µãƒ¼ãƒãƒ¼å¿œç­”"
-msgid "Invalid start or end time format"
-msgstr "開始時刻ã¾ãŸã¯çµ‚了時刻ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒç„¡åŠ¹ã§ã™ã€‚"
-
msgid "Invalid status"
msgstr ""
@@ -20759,7 +21133,7 @@ msgid "Invite Members"
msgstr ""
msgid "Invite a group"
-msgstr "グループã«æ‹›å¾…"
+msgstr "グループを招待"
msgid "Invite members"
msgstr "メンãƒãƒ¼ã‚’招待"
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20900,7 +21281,7 @@ msgid "InviteMembersModal|You only have space for %{count} more %{members} in yo
msgstr ""
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
-msgstr ""
+msgstr "グループを %{strongStart}%{name}%{strongEnd} グループã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚"
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "500年以上先ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
-msgid "Jaeger URL"
-msgstr "Jaeger URL"
-
msgid "Jan"
msgstr "1月"
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr "ジョブãŒæ¶ˆåŽ»ã•ã‚Œã¾ã—ãŸ"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "維æŒ"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr "最下部ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«"
msgid "Job|Scroll to top"
msgstr "最上部ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr "完全㪠Raw を表示ã™ã‚‹"
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr "Kubernetes API ã‹ã‚‰ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰ %{error_code} ãŒè¿”ã•ã‚Œã¾ã—ãŸã€‚"
-
msgid "Kubernetes Cluster"
msgstr "Kubernetes クラスター"
@@ -22127,7 +22526,7 @@ msgid "LDAP settings"
msgstr "LDAP 設定"
msgid "LDAP settings updated"
-msgstr ""
+msgstr "LDAP設定を更新ã—ã¾ã—ãŸã€‚"
msgid "LDAP sync in progress. This could take a few minutes. Refresh the page to see the changes."
msgstr "LDAP åŒæœŸãŒé€²è¡Œä¸­ã§ã™ã€‚ã“ã‚Œã«ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ページを更新ã—ã¦å¤‰æ›´å†…容を確èªã—ã¦ãã ã•ã„。"
@@ -22159,6 +22558,10 @@ msgstr "ラベル"
msgid "Label actions dropdown"
msgstr "ラベルアクションドロップダウン"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22202,7 +22605,7 @@ msgid "Labels|Promote Label"
msgstr "ラベルã®æ˜‡æ ¼"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. If a group label with the same title exists, it will also be merged. This action cannot be reversed."
-msgstr ""
+msgstr "%{labelTitle} を宣言ã™ã‚‹ã¨ %{groupName} 内ã®ã™ã¹ã¦ã®ãƒ—ロジェクト内ã§åˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚åŒã˜ã‚¿ã‚¤ãƒˆãƒ«ã®æ—¢å­˜ã®ãƒ—ロジェクトラベルã¯ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã™ã€‚ã‚‚ã—åŒã˜ã‚¿ã‚¤ãƒˆãƒ«ã®ã‚°ãƒ«ãƒ¼ãƒ—ラベルãŒã‚ã‚‹å ´åˆã€ãã‚Œã¯ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã™ã€‚ã“ã®æ“作ã¯å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
msgid "Language"
msgstr "言語"
@@ -22382,9 +22785,6 @@ msgstr "GitLab ã‚’å­¦ã¶"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr "GitLabã§ã®%{no_packages_link_start}パッケージã®å…±æœ‰ã¨å…¬é–‹%{
msgid "Learn more"
msgstr "詳細"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -22788,7 +23188,7 @@ msgid "Licenses|Policy violation: denied"
msgstr "ãƒãƒªã‚·ãƒ¼é•å:æ‹’å¦"
msgid "Licenses|Specified policies in this project"
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã§æŒ‡å®šã•ã‚Œã¦ã„ã‚‹ãƒãƒªã‚·ãƒ¼"
msgid "Licenses|The file could not be uploaded."
msgstr ""
@@ -22848,7 +23248,7 @@ msgid "Link text"
msgstr ""
msgid "Link title"
-msgstr ""
+msgstr "リンクタイトル"
msgid "Link title is required"
msgstr " リンクタイトルã¯å¿…須入力項目ã§ã™"
@@ -22926,7 +23326,7 @@ msgid "Load more users"
msgstr ""
msgid "Loading"
-msgstr ""
+msgstr "読ã¿è¾¼ã¿ä¸­"
msgid "Loading %{name}"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr "ログ"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr "ログを表示ã™ã‚‹ã«ã¯ã€ã‚³ãƒ¼ãƒ‰ã‚’環境ã«ãƒ‡ãƒ—ロイã—ã¾ã™ã€‚"
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr "ã“ã‚Œã¯å¿…ãšä¿å­˜ã—ã¦ãã ã•ã„。二度ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾
msgid "Makes this issue confidential."
msgstr "イシューをéžå…¬é–‹ã«ã™ã‚‹ã€‚"
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr "アクセス管ç†"
-msgid "Manage all notifications"
-msgstr "ã™ã¹ã¦ã®é€šçŸ¥ã‚’管ç†"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "OAuth プロãƒã‚¤ãƒ€ã¨ã—㦠GitLab を使用ã§ãるアプリケーションã¨ã€ã‚ãªãŸãŒã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’使用ã™ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹ã‚¢ãƒ—リケーションを管ç†ã—ã¾ã™ã€‚"
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ %{duplicate_param} ã¨é‡è¤‡ã—ã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸã€‚"
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ %{duplicate_reference} ã¨é‡è¤‡ã—ã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯ã™ã‚‹ã€‚"
@@ -23457,7 +23854,7 @@ msgid "Maximum diff patch size (Bytes)"
msgstr ""
msgid "Maximum duration of a session."
-msgstr ""
+msgstr "セッションã®æœ€å¤§ç¶™ç¶šæ™‚é–“"
msgid "Maximum export size"
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr "マージリクエストã®ä¾å­˜é–¢ä¿‚"
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr "全体差分を読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†
msgid "MergeRequest|No files found"
msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr "既存ã®ãƒžãƒ¼ã‚¸ãƒˆãƒ¬ã‚¤ãƒ³ã«æ‚ªå½±éŸ¿ã‚’与ãˆã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€ç›´ã¡ã«ãƒžãƒ¼ã‚¸ã™ã‚‹ã“ã¨ã¯å‹§ã‚られã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€ %{docsLinkStart}ドキュメント%{docsLinkEnd} ã‚’ãŠèª­ã¿ãã ã•ã„。"
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "Y軸ラベル"
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr "複数ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚"
-
msgid "Multiple model types found: %{model_types}"
msgstr "複数ã®ãƒ¢ãƒ‡ãƒ«ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %{model_types}"
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr "自分ã®ãƒªã‚¢ã‚¯ã‚·ãƒ§ãƒ³"
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr "åå‰"
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,18 +25596,15 @@ msgstr "æ–°ã—ã„エピック"
msgid "New epic title"
msgstr "æ–°è¦ã‚¨ãƒ”ックã®ã‚¿ã‚¤ãƒˆãƒ«"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«"
msgid "New group"
msgstr "æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr "æ–°ã—ã„ヘルスãƒã‚§ãƒƒã‚¯ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’生æˆã—ã¾ã—ãŸã€‚"
@@ -25286,9 +25698,6 @@ msgstr "æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’外部ユーザーã«è¨­å®š"
msgid "New! Suggest changes directly"
msgstr "æ–°æ©Ÿèƒ½ï¼ å¤‰æ›´ã‚’ç›´æŽ¥æ案"
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr "æ–°ã—ã„é †"
@@ -25343,6 +25752,9 @@ msgstr "マイルストーンãªã—"
msgid "No Scopes"
msgstr "スコープãªã—"
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr "アクティブãªç®¡ç†ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr "ブランãƒãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "変更ãªã—"
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Gitaly サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ログを確èªã—ã¦ãã ã•ã„ï¼"
-msgid "No containers available"
-msgstr "コンテナãŒã‚ã‚Šã¾ã›ã‚“"
-
msgid "No contributions"
msgstr "貢献ãªã—"
@@ -25490,6 +25902,9 @@ msgstr "ライセンス表記ãŒã‚ã‚Šã¾ã›ã‚“。全ã¦ã®æ¨©åˆ©ã‚’ä¿æœ‰ã—ã¦
msgid "No matches found"
msgstr "一致ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr "親グループã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr "利用å¯èƒ½ãªãƒãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr "リãƒã‚¸ãƒˆãƒªãŒã‚ã‚Šã¾ã›ã‚“"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr "本当ã«ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã®ä½œæˆã‚’キャンセルã—ã¾ã™ã‹ï¼Ÿ"
msgid "Notes|Collapse replies"
msgstr "返信を折りãŸãŸã‚€"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr "通知オフ"
msgid "Notifications on"
msgstr "通知オン"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "11月"
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] "ãã®ä»–ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä»¶æ•° %d"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,23 +26913,23 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr "出ç¾è¡Œã¯1ã¤ã ã‘存在ã§ãã¾ã™"
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr "プロジェクトメンãƒãƒ¼ã®ã¿"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
-msgstr "管ç†è€…ã ã‘ãŒãƒ—ロジェクトを削除ã§ãã¾ã™"
+msgid "Only active projects show up in the search and on the dashboard."
+msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr ""
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr "ãƒãƒªã‚·ãƒ¼ã®ã¿:"
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr "オペレーションダッシュボード"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "オペレーションダッシュボードã¯å„プロジェクトé‹ç”¨çŠ¶æ…‹ï¼ˆãƒ‘イプライン&アラート状態ãªã©ï¼‰ã‚’表示ã•ã‚Œã¾ã™ã€‚"
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr "オプション"
msgid "Or you can choose one of the suggested colors below"
msgstr "ã¾ãŸã¯ã€ä¸‹è¨˜ã®ã„ãšã‚Œã‹ã®è‰²ã‚’é¸æŠžã§ãã¾ã™"
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr "オーナー"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr "NuGet ソースを追加"
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr "パッケージã®å‰Šé™¤"
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -26922,7 +27409,7 @@ msgid "PackageRegistry|For more information on Composer packages in GitLab, %{li
msgstr ""
msgid "PackageRegistry|For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}."
-msgstr ""
+msgstr "Conanレジストリã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ %{linkStart}ドキュメントをå‚ç…§%{linkEnd}。"
msgid "PackageRegistry|For more information on the Maven registry, %{linkStart}see the documentation%{linkEnd}."
msgstr "Mavenã®ãƒ¬ã‚¸ã‚¹ãƒˆãƒªã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ %{linkStart}文書をå‚ç…§%{linkEnd}。"
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr "パッケージを削除"
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "申ã—訳ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã§ã¯è©²å½“ã™ã‚‹çµæžœãŒä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr "パラメーター \"job_id\"㯠%{job_id_max_size} 長を超ãˆã‚‹ã“ã
msgid "Parent"
msgstr "親"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr "親 epic ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "Parent epic is not present."
msgstr "親エピックãŒã‚ã‚Šã¾ã›ã‚“。"
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27301,7 +27785,7 @@ msgid "Paste issue link"
msgstr "イシューã®ãƒªãƒ³ã‚¯ã‚’貼り付ã‘"
msgid "Paste link"
-msgstr ""
+msgstr "リンクを貼り付ã‘"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
@@ -27373,7 +27857,7 @@ msgid "Percent rollout must be an integer number between 0 and 100"
msgstr ""
msgid "Percentage"
-msgstr ""
+msgstr "パーセント"
msgid "Perform advanced options such as changing path, transferring, exporting, or removing the group."
msgstr "パスã®å¤‰æ›´ã€è»¢é€ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã€ã‚°ãƒ«ãƒ¼ãƒ—ã®å‰Šé™¤ãªã©ã®é«˜åº¦ãªã‚ªãƒ—ションを設定ã—ã¾ã™ã€‚"
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "実行"
@@ -28467,12 +28984,6 @@ msgstr "リãƒã‚¸ãƒˆãƒªã«æŽ¥ç¶šã§ãã‚‹ã¾ã§ã€ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "リãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ã®ã§ã€ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。完了ã™ã‚‹ã¨ã€ç”»é¢ãŒè‡ªå‹•çš„ã«æ›´æ–°ã•ã‚Œã¾ã™ã€‚"
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr "ãƒãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-
msgid "Pods in use"
msgstr "使用中ã®ãƒãƒƒãƒ‰"
@@ -28548,14 +29059,17 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "日付ã¨æ™‚刻ã®è¡¨ç¤ºæ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚"
msgid "Preferences|Customize integrations with third party services."
msgstr "サードパーティã®ã‚µãƒ¼ãƒ“スã¨ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’カスタマイズã—ã¾ã™ã€‚"
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "アプリケーションヘッダーã¨ãƒŠãƒ“ゲーションサイドãƒãƒ¼ã®å¤–観をカスタマイズã—ã¾ã™ã€‚"
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr ""
@@ -28596,9 +29110,6 @@ msgstr "レイアウトã®å¹…"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr " %{min} ã‹ã‚‰ %{max} ã¾ã§ã®æ•°å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-msgid "Preferences|Navigation theme"
-msgstr "ナビゲーションテーマ"
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr "å‰ã¸"
-msgid "Prevent adding new members to projects within this group"
-msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®ãƒ—ロジェクトã¸ã®æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ã®è¿½åŠ ã‚’ç¦æ­¢ã™ã‚‹"
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr "マークダウンをプレビュー"
msgid "Preview changes"
msgstr "変更をプレビュー"
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr "データ部ã®ãƒ—レビュー"
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "削除予定ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã™ã€‚"
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "次ã®ã‚µãƒ¼ãƒ“スã®ä¸­ã‹ã‚‰ä¸€ã¤ã‚’é¸ã‚“ã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã‚’有効ã«ã—ã¦ãã ã•ã„"
-
msgid "Profiles|Active"
msgstr "アクティブ"
@@ -28863,7 +29371,7 @@ msgstr "ステータス絵文字を追加"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,8 +29398,8 @@ msgstr "ユーザーåを変更ã™ã‚‹ã¨ã€æ„図ã—ãªã„副作用ãŒç™ºç”Ÿã™
msgid "Profiles|Choose file..."
msgstr "ファイルをé¸æŠž..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "プロジェクトã€ãƒªãƒã‚¸ãƒˆãƒªã¾ãŸã¯çµ„織情報ãªã—ã§ã€å…¬é–‹ãƒ—ロファイルã«éžå…¬é–‹ãƒ—ロジェクトã®æŠ•ç¨¿ã‚’表示ã™ã‚‹ã“ã¨ã‚’é¸æŠžã—ã¾ã™"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr ""
msgid "Profiles|City, country"
msgstr "国ã€éƒ½é“府県"
@@ -28905,6 +29413,9 @@ msgstr "コミットメール"
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "接続ã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆ"
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr "プロフィールã«è¡¨ç¤ºã—ãªã„"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr "プロフィールを編集"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "ä»–ã®äººãŒã‚ãªãŸã ã¨ã‚ã‹ã‚‹åå‰ã‚’入力ã—ã¦ãã ã•ã„。"
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,8 +29494,8 @@ msgstr "プロフィールã«å€‹äººçš„ãªã‚³ãƒ³ãƒˆãƒªãƒ“ューションをå«ã‚
msgid "Profiles|Incoming email token was successfully reset"
msgstr "å—信用ã®ãƒ¡ãƒ¼ãƒ«ãƒˆãƒ¼ã‚¯ãƒ³ã‚’正常ã«ãƒªã‚»ãƒƒãƒˆã§ãã¾ã—ãŸ"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "2è¦ç´ èªè¨¼ã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãŒå‘上ã—ã¾ã™ã€‚"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
msgid "Profiles|Invalid password"
msgstr "パスワードãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
@@ -29005,7 +29516,7 @@ msgid "Profiles|Key becomes invalid on this date. Maximum lifetime for SSH keys
msgstr ""
msgid "Profiles|Key titles are publicly visible."
-msgstr ""
+msgstr "キータイトルã¯ä¸€èˆ¬ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
msgid "Profiles|Last used:"
msgstr ""
@@ -29070,23 +29581,23 @@ msgstr "ã‚¢ãƒã‚¿ãƒ¼ã‚’削除"
msgid "Profiles|Select a service to sign in with."
msgstr "サインインã™ã‚‹ã‚µãƒ¼ãƒ“スをé¸æŠžã—ã¾ã™ã€‚"
+msgid "Profiles|Service sign-in"
+msgstr ""
+
msgid "Profiles|Set new profile picture"
msgstr "æ–°ã—ã„プロフィール画åƒã‚’設定ã™ã‚‹"
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set your local time zone."
msgstr ""
-msgid "Profiles|Social sign-in"
-msgstr "ソーシャルサインイン"
-
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "ã„ãã¤ã‹ã®ã‚ªãƒ—ションã¯LDAPアカウントã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
msgid "Profiles|Static object token was successfully reset"
msgstr "スタティックオブジェクトトークンを正常ã«ãƒªã‚»ãƒƒãƒˆã§ãã¾ã—ãŸ"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "250文字未満ã§è‡ªå·±ç´¹ä»‹ã—ã¦ãã ã•ã„"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr "ã‚ãªãŸã®åå‰ã‚’æ›´æ–°ã™ã‚‹æ©Ÿèƒ½ã¯ã€ç®¡ç†è€…ã«ã‚ˆã£ã¦ç„¡åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -29094,17 +29605,17 @@ msgstr "ã‚ãªãŸã®åå‰ã‚’æ›´æ–°ã™ã‚‹æ©Ÿèƒ½ã¯ã€ç®¡ç†è€…ã«ã‚ˆã£ã¦ç„¡åŠ¹
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "許å¯ã•ã‚Œã‚‹æœ€å¤§ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¯200KBã§ã™ã€‚"
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚’ã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールã«è¡¨ç¤ºã—ã¾ã™"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "ã“ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã¯ã€ç·¨é›†ã‚„マージãªã©ã®Webベースã®æ“作ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ %{commit_email_link_start} 詳細ã¯ã“ã¡ã‚‰ %{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "ã“ã®çµµæ–‡å­—ã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚ãªãŸã®ãƒ—ロフィールã¨ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹å…¨ä½“ã«è¡¨ç¤ºã—ã¾ã™ã€‚"
-msgid "Profiles|This information will appear on your profile"
-msgstr "ã“ã®æƒ…報をプロフィールã«è¡¨ç¤ºã—ã¾ã™"
+msgid "Profiles|This information will appear on your profile."
+msgstr ""
msgid "Profiles|Time settings"
msgstr "時間ã®è¨­å®š"
@@ -29112,8 +29623,8 @@ msgstr "時間ã®è¨­å®š"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
-msgstr "2è¦ç´ èªè¨¼"
+msgid "Profiles|Two-factor authentication"
+msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "確èªã®ãŸã‚ %{confirmationValue} を入力ã—ã¦ãã ã•ã„:"
@@ -29148,8 +29659,8 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "ã‚ãªãŸã¯ã©ã‚“ãªã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã§ã™ã‹ï¼Ÿ"
-msgid "Profiles|Who you represent or work for"
-msgstr "代表者ã¾ãŸã¯é›‡ç”¨è€…"
+msgid "Profiles|Who you represent or work for."
+msgstr ""
msgid "Profiles|You can change your avatar here"
msgstr "ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã‚’変更ã§ãã¾ã™"
@@ -29190,6 +29701,9 @@ msgstr "ã‚ãªãŸã®å ´æ‰€ã¯ã‚ãªãŸã® %{provider_label} アカウントã«åŸ
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "ã‚ãªãŸã®åå‰ã¯ã‚ãªãŸã® %{provider_label} アカウントã«åŸºã¥ã„ã¦è‡ªå‹•çš„ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ãã‚Œã§ã‚ãªãŸãŒçŸ¥ã£ã¦ã„る人ãŒã‚ãªãŸã‚’èªè­˜ã§ãã¾ã™"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "ã‚ãªãŸã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹"
@@ -29268,8 +29782,8 @@ msgstr ""
msgid "Project URL"
msgstr "プロジェクト㮠URL"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
-msgstr "プロジェクトã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã¯ã€æ˜Žç¤ºçš„ã«å„ユーザーã¸ä»˜ä¸Žã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãƒ—ロジェクトãŒã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸€éƒ¨ã§ã‚ã‚‹å ´åˆã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹æ¨©ãŒä»˜ä¸Žã•ã‚Œã¾ã™ã€‚"
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -29391,6 +29905,9 @@ msgstr "Maintainers"
msgid "ProjectCreationLevel|No one"
msgstr "誰ã«ã‚‚許å¯ã—ãªã„"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "åå‰"
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr "ãƒãƒƒã‚¸ã¨ã¯ä½•ã§ã™ã‹ï¼Ÿ"
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "%{group_name} グループã§å…±æœ‰ã•ã‚ŒãŸãƒ—ロジェクト"
@@ -30186,7 +30709,7 @@ msgstr "管ç†è€…ã«é€£çµ¡ã—ã¦ã€ãƒ—ロジェクトをインãƒãƒ¼ãƒˆã™ã‚‹ãŸ
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,8 +30769,8 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr "å¯è¦–レベル"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "åŒã˜åå‰ç©ºé–“ã®ä¸‹ã«ã„ãã¤ã‹ã®ä¾å­˜ãƒ—ロジェクトをåŽå®¹ã—ãŸã„ã§ã™ã‹ï¼Ÿ %{link_start}グループを作æˆã—ã¾ã™ã€‚%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
msgid "PrometheusAlerts|exceeded"
msgstr ""
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr "Rebase"
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr "進行中㮠Rebase"
@@ -31137,9 +31672,6 @@ 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 "æ›´æ–°"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31208,7 +31740,7 @@ msgid "RegistrationFeatures|Registration Features Program"
msgstr ""
msgid "RegistrationFeatures|Want to %{feature_title} for free?"
-msgstr ""
+msgstr "無料㧠%{feature_title} ã‚’ã”希望ã§ã™ã‹ï¼Ÿ"
msgid "RegistrationFeatures|send emails to users"
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr "アセットをリリース"
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr "リリースã«ã¯ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã¨åŒã˜ãƒ—ロジェクトãŒã‚ã‚Šã¾ã›ã‚“"
@@ -31691,9 +32226,6 @@ msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã。"
msgid "Replace"
msgstr "ç½®ãæ›ãˆ"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr "クローンURLã®ãƒ«ãƒ¼ãƒˆã‚’ç½®ãæ›ãˆã‚‹ã€‚"
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr "メールã¸ã®è¿”ä¿¡"
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr "クラスå"
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr "実行時間"
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«2è¦ç´ èªè¨¼ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã‚’è¦æ±‚ã™ã‚‹"
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "正常性ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’リセット"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr "グループを復元ã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ã‚µãƒ–グループ
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "ジョブをå†è©¦è¡Œã—ã¦ãã ã•ã„"
@@ -32560,7 +33095,7 @@ msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spa
msgstr ""
msgid "Runners|A new version is available"
-msgstr ""
+msgstr "æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
msgstr ""
@@ -32678,11 +33213,14 @@ msgid "Runners|Executor"
msgstr ""
msgid "Runners|Get started with runners"
-msgstr ""
+msgstr "Runners を始ã‚ã¾ã—ょã†"
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32941,7 +33476,7 @@ msgid "Runners|This runner is available to all projects and subgroups in a group
msgstr ""
msgid "Runners|This runner is outdated, an upgrade is recommended"
-msgstr ""
+msgstr "ã“ã®Runnerã¯å¤ããªã£ã¦ã„ã¾ã™ã€‚アップグレードをãŠå‹§ã‚ã—ã¾ã™ã€‚"
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -32956,7 +33500,7 @@ msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs.
msgstr ""
msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
-msgstr ""
+msgstr "ç¾åœ¨å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„るプロジェクトã«ã®ã¿ãƒ©ãƒ³ãƒŠãƒ¼ã‚’使用ã—ã¾ã™ã€‚管ç†è€…ã®ã¿å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒ—ロジェクトを変更ã§ãã¾ã™ã€‚"
msgid "Runners|Use the runner on pipelines for protected branches only."
msgstr ""
@@ -33013,10 +33557,10 @@ msgid "Runners|stale"
msgstr ""
msgid "Runners|upgrade available"
-msgstr ""
+msgstr "利用å¯èƒ½ãªã‚¢ãƒƒãƒ—グレード"
msgid "Runners|upgrade recommended"
-msgstr ""
+msgstr "アップグレードをãŠå‹§ã‚ã—ã¾ã™"
msgid "Running"
msgstr "稼åƒä¸­"
@@ -33039,6 +33583,21 @@ msgstr "SAML ディスカãƒãƒªãƒ¼ãƒˆãƒ¼ã‚¯ãƒ³"
msgid "SAML for %{group_name}"
msgstr "%{group_name} 用ã®SAML"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33046,10 +33605,10 @@ msgid "SHA256"
msgstr "SHA256"
msgid "SSH Key"
-msgstr "SSHキー"
+msgstr "SSH キー"
msgid "SSH Keys"
-msgstr "SSH éµ"
+msgstr "SSH キー"
msgid "SSH Keys Help"
msgstr ""
@@ -33064,10 +33623,10 @@ msgid "SSH host keys are not available on this system. Please use %{ssh_keyscan}
msgstr ""
msgid "SSH key"
-msgstr ""
+msgstr "SSH キー"
msgid "SSH keys"
-msgstr ""
+msgstr "SSH キー"
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr "SSH éµã‚’使用ã™ã‚‹ã¨ã€ã‚³ãƒ³ãƒ”ュータã¨GitLabã®é–“を安全ã«æŽ¥ç¶šã§ãã¾ã™ã€‚"
@@ -33678,6 +34237,9 @@ msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request
msgstr ""
msgid "SecurityOrchestration|+%{count} more"
+msgstr "+%{count} 以上"
+
+msgid "SecurityOrchestration|, and %{count} more"
msgstr ""
msgid "SecurityOrchestration|.yaml mode"
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33933,10 +34501,10 @@ msgid "SecurityOrchestration|This group"
msgstr ""
msgid "SecurityOrchestration|This is a group-level policy"
-msgstr ""
+msgstr "ã“ã‚Œã¯ã‚°ãƒ«ãƒ¼ãƒ—レベルãƒãƒªã‚·ãƒ¼ã§ã™"
msgid "SecurityOrchestration|This is a project-level policy"
-msgstr ""
+msgstr "ã“ã‚Œã¯ãƒ—ロジェクトレベルã®ãƒãƒªã‚·ãƒ¼ã§ã™"
msgid "SecurityOrchestration|This policy is inherited from %{namespace}"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "'%{vulnerabilityName}' ã«è¿½åŠ ã•ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ"
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr "ソースブランãƒã‚’é¸æŠž"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr "ターゲットブランãƒã‚’é¸æŠž"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr "タイムゾーンをé¸æŠž"
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "デフォルトを設定ã—ã€å¯è¦–性レベルを制é™ã—ã¾ã™ã€‚インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¨ git アクセスプロトコルを設定ã—ã¾ã™ã€‚"
-
msgid "Set due date"
msgstr "期é™ã®è¨­å®š"
@@ -34784,6 +35346,9 @@ msgstr "ターゲットブランãƒã‚’設定"
msgid "Set target branch to %{branch_name}."
msgstr "ターゲットブランãƒã‚’ %{branch_name} ã«è¨­å®šã—ã¾ã—ãŸã€‚"
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr "æ–°ã—ã„パスワードを設定"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "プロジェクトを設定ã—ã¦ã€åˆ¥ã®ãƒªãƒã‚¸ãƒˆãƒªã¨ã®é–“ã§å¤‰æ›´ã‚’自動的ã«ãƒ—ッシュ/プルã™ã‚‹ã€‚ブランãƒã€ã‚¿ã‚°ã€ãŠã‚ˆã³ã‚³ãƒŸãƒƒãƒˆã¯è‡ªå‹•çš„ã«åŒæœŸã—ã¾ã™ã€‚"
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr "ウェイトを設定"
@@ -35109,6 +35677,63 @@ msgstr "スレッドを表示"
msgid "Show whitespace changes"
msgstr "空白 (éžè¡¨ç¤ºæ–‡å­—) ã®å¤‰æ›´ã‚’表示ã™ã‚‹"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr "ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’表示"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "並列"
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr "Snowplow"
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr "解決策"
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "å•é¡ŒãŒç™ºç”Ÿã—ã¦ã€ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã« %{project} を追加ã§ãã¾ã›ã‚“"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr "å•é¡ŒãŒç™ºç”Ÿã—ã¦ã€ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã«ãƒ—ロジェクトを追加ã§ãã¾ã›ã‚“"
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36278,10 +36903,10 @@ msgid "StatusPage|Configure file storage settings to link issues in this project
msgstr ""
msgid "StatusPage|S3 Bucket name"
-msgstr ""
+msgstr "S3 ãƒã‚±ãƒƒãƒˆå"
msgid "StatusPage|Status page"
-msgstr ""
+msgstr "ステータスページ"
msgid "StatusPage|Status page URL"
msgstr "ステータスページã®URL"
@@ -36340,6 +36965,9 @@ msgstr "ストレージ:"
msgid "StorageSize|Unknown"
msgstr "ä¸æ˜Ž"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,8 +36989,8 @@ msgstr "サブグループマイルストーン"
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr "サブグループã®ä½œæˆã‚’許å¯"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
msgstr "サブグループã®ä½œæˆã‚’許å¯"
@@ -36379,6 +37007,9 @@ msgstr "サブグループ"
msgid "Subgroups and projects"
msgstr "サブグループã¨ãƒ—ロジェクト"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} を購読ã—ã¾ã™ã€‚"
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr "サブスクリプション"
@@ -36695,7 +37329,7 @@ msgid "SuggestedColors|Gray"
msgstr ""
msgid "SuggestedColors|Green"
-msgstr ""
+msgstr "ç·‘"
msgid "SuggestedColors|Green screen"
msgstr ""
@@ -36716,7 +37350,7 @@ msgid "SuggestedColors|Orange"
msgstr ""
msgid "SuggestedColors|Purple"
-msgstr ""
+msgstr "ç´«"
msgid "SuggestedColors|Red"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr "スイート"
msgid "Summary"
msgstr "概è¦"
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr "サãƒãƒ¼ãƒˆ"
@@ -36929,6 +37569,21 @@ msgstr "サãƒãƒ¼ãƒˆãƒšãƒ¼ã‚¸URL"
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr "システムã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ (%{default})"
msgid "System header and footer"
msgstr "システムヘッダーã¨ãƒ•ãƒƒã‚¿ãƒ¼"
-msgid "System hook was successfully updated."
-msgstr "システムフックã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr "%{rate}%{sign} æˆåŠŸçŽ‡"
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr "ã“ã® %{group_path} グループã§ã€ã‚ãªãŸã¯ã‚·ãƒ³ã‚°ãƒ«ã‚µã‚¤ãƒ³ã‚ªãƒ³ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã§ãã¾ã™ã€‚"
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37735,7 +38393,7 @@ msgid "The current epic"
msgstr ""
msgid "The current incident"
-msgstr ""
+msgstr "ç¾åœ¨ã®ã‚¤ãƒ³ã‚·ãƒ‡ãƒ³ãƒˆ"
msgid "The current issue"
msgstr "ç¾åœ¨ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "データソースã«ã¯æŽ¥ç¶šã§ãã¦ã„ã¾ã™ãŒã€è¡¨ç¤ºã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯ã‚ã‚Šã¾ã›ã‚“。 %{documentationLink}"
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr "ã‚ãªãŸãŒå…¥åŠ›ã—ãŸãƒ‰ãƒ¡ã‚¤ãƒ³ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "許å¯ã•ã‚Œã‚‹æœ€å¤§ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¯ %{size} ã§ã™ã€‚"
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr "パイプラインスケジュールã¯æŒ‡å®šã®ãƒ–ランãƒã¾ãŸã¯ã‚¿
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr "ã“ã®ãƒ—ロジェクトã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã‚ã‚Œã°èª°ã§ã‚‚アクセスã§ãã¾ã™ã€‚"
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr "プロジェクトã¯ã€èªè¨¼ã«ã‚ˆã‚‰ãšã€èª°ã§ã‚‚アクセスã§ãã¾ã™ã€‚"
-
msgid "The project can be accessed without any authentication."
msgstr "プロジェクトã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ãªã—ã«èª°ã§ã‚‚アクセスã§ãã¾ã™ã€‚"
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr "プロジェクトã¯ã€ãã®ãƒ—ロジェクトã®ãƒ¡ãƒ³ãƒãƒ¼ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚å„ユーザーã«ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’明示的ã«æŒ‡å®šã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-
msgid "The project is still being deleted. Please try again later."
msgstr "ã“ã®ãƒ—ロジェクトã¯å‰Šé™¤ä¸­ã§ã™ã€‚ã—ã°ã‚‰ã後ã§è©¦ã—ã¦ãã ã•ã„。"
@@ -38228,6 +38880,9 @@ msgstr "ã¾ã ãƒ‘ッケージãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "There are no projects shared with this group yet"
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ã¦ã„るプロジェクトã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "ã‚ãªãŸã®ãƒ‡ãƒã‚¤ã‚¹ã¨ã®é–“ã«é€šä¿¡éšœå®³ãŒç™ºç”Ÿã—ã¦ã„ã¾ã™ã€‚"
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38817,7 +39478,7 @@ msgid "This job does not have a trace."
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã«ã¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
-msgstr ""
+msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯è‡ªå‹•çš„ã«å®Ÿè¡Œã•ã‚Œãšã€æ‰‹å‹•ã§é–‹å§‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "This job has been canceled"
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
@@ -38897,9 +39558,6 @@ msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯æ‰‹å‹•ã«ã‚ˆã‚‹å®Ÿè¡Œã‚’求ã‚ã¦ã„ã¾ã™"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–を開始ã™ã‚‹ã«ã¯ã€æ‰‹å‹•ã«ã‚ˆã‚‹ä»‹å…¥ãŒå¿…è¦ã§ã™ã€‚ ã“ã®ã‚¸ãƒ§ãƒ–を開始ã™ã‚‹å‰ã«ã€ç›´å‰ã®æ§‹æˆå¤‰æ›´ã®ãŸã‚ã«ä»¥ä¸‹ã®å¤‰æ•°ã‚’追加ã§ãã¾ã™ã€‚"
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚¿ã‚¤ãƒžãƒ¼çµ‚了後ã«è‡ªå‹•çš„ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚多ãã®å ´åˆæœ¬ç•ªç’°å¢ƒã¸ã®æ®µéšŽçš„ãªãƒ­ãƒ¼ãƒ«ã‚¢ã‚¦ãƒˆãƒ‡ãƒ—ロイã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚スケジュールã•ã‚Œã¦ã„ãªã„ã¨ãã¯æ‰‹å‹•ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚"
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr "ã“ã® Runner ã¯ä¿è­·ãƒ–ランãƒä¸Šã§èµ·å‹•ã•ã‚ŒãŸãƒ‘イプライã
msgid "This setting can be overridden in each project."
msgstr "ã“ã®è¨­å®šã¯ã€å„プロジェクトã§ä¸Šæ›¸ãã§ãã¾ã™ã€‚"
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr "外部ã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³ãƒšãƒ¼ã‚¸ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¾ã™ã€‚"
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr "ã“ã®æ“作ã¯ã€ã“ã®ãƒ—ロジェクト㨠%{fork_source} é–“ã®ãƒ•ã‚©ãƒ¼ã‚¯é–¢ä¿‚を削除ã—ã¾ã™ã€‚"
@@ -39125,9 +39783,6 @@ msgstr "時間"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr "ユーザーãŒå¼·åˆ¶çš„ãª2è¦ç´ èªè¨¼ã‚’無視ã§ãる時間(時間å˜ä½)"
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr "時間ベース: ã‚ã‚Š"
@@ -39137,9 +39792,6 @@ msgstr "イシューãŒè¨ˆç”»ã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“"
msgid "Time before an issue starts implementation"
msgstr "イシューã®å®Ÿè£…ãŒé–‹å§‹ã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“"
-msgid "Time before enforced"
-msgstr "実施å‰ã®æ™‚é–“"
-
msgid "Time between merge request creation and merge/close"
msgstr "マージリクエストãŒä½œæˆã•ã‚Œã¦ã‹ã‚‰ãƒžãƒ¼ã‚¸ã¾ãŸã¯ã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“"
@@ -39191,6 +39843,12 @@ msgstr "見ç©ã‚‚り時間"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "見ç©ã‚‚り時間:"
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "サイドãƒãƒ¼ã‚’切り替ãˆ"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr "パフォーマンスãƒãƒ¼ã®åˆ‡ã‚Šæ›¿ãˆ"
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr "トレーシング"
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "プロジェクトãŠã‚ˆã³ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³å…¨ä½“ã§ã€ãƒ†ãƒ¼ãƒžã‚’共有ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚°ãƒ«ãƒ¼ãƒ—を追跡"
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "トレーシングã§ã‚¢ãƒ—リケーションをトラブルシューティングãŠã‚ˆã³ç›£è¦–ã™ã‚‹"
-
msgid "Trusted"
msgstr ""
@@ -40019,7 +40677,7 @@ msgid "Try again?"
msgstr "å†è©¦è¡Œã—ã¾ã™ã‹ï¼Ÿ"
msgid "Try all GitLab features for free for 30 days. No credit card required."
-msgstr ""
+msgstr "GitLabã®ã™ã¹ã¦ã®æ©Ÿèƒ½ã‚’30日間無料ã§ãŠè©¦ã—ã§ãã¾ã™ã€‚クレジットカードã¯ä¸è¦ã§ã™ã€‚"
msgid "Try all GitLab has to offer for 30 days."
msgstr "30日間ã§GitLabãŒæä¾›ã™ã‚‹ã™ã¹ã¦ã®æ©Ÿèƒ½ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„。"
@@ -40093,6 +40751,9 @@ msgstr "2è¦ç´ èªè¨¼"
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr "CPU ã®æƒ…報をåŽé›†ã§ããªã„"
msgid "Unable to collect memory info"
msgstr "メモリ情報をåŽé›†ã§ããªã„"
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr "Prometheus サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“"
@@ -40195,9 +40853,6 @@ msgstr "サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr "Jira インスタンスã«æŽ¥ç¶šã§ãã¾ã›ã‚“。 Jira çµ±åˆè¨­å®šã‚’確èªã—ã¦ãã ã•ã„。"
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr "Kubernetes ã®ãƒ­ã‚°ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã‚’UTF-8ã«å¤‰æ›ã§ãã¾ã›ã‚“"
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr "脆弱ãªãƒ—ロジェクトã¯å–å¾—ã§ãã¾ã›ã‚“"
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr "差分を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。%{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "マージリクエストウィジェットをロードã§ãã¾ã›ã‚“。ページをå†èª­ã¿è¾¼ã¿ã—ã¦ãã ã•ã„。"
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr "イテレーションをä¿å­˜ã§ãã¾ã›ã‚“。もã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr "プロジェクトã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–解除"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr "ä¸æ˜Ž"
msgid "Unknown Error"
msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼"
-msgid "Unknown cache key"
-msgstr "ä¸æ˜Žãªã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚­ãƒ¼"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr "æš—å·åŒ–戦略ãŒä¸æ˜Ž: %{encrypted_strategy}ï¼"
@@ -40390,12 +41042,6 @@ msgstr "ディスカッションã®ãƒ­ãƒƒã‚¯ã‚’解除ã—ãŸ"
msgid "Unlocks the discussion."
msgstr "ディスカッションã®ãƒ­ãƒƒã‚¯ã‚’解除ã™ã‚‹."
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr "オブジェクトマップをアップロード"
-msgid "UploadLink|click to upload"
-msgstr "クリックã—ã¦ã‚¢ãƒƒãƒ—ロード"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "追加分ã®è³¼å…¥"
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "ストレージ"
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr "文書ã®è¡¨ç¤º"
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr "詳細を見る: %{details_url}"
msgid "View documentation"
msgstr "ドキュメントã®è¡¨ç¤º"
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "資格ã®ã‚る承èªè€…を表示"
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "本人確èªã®ãŸã‚ã€ã‚ãªãŸãŒãƒ­ãƒœãƒƒãƒˆã§ãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr "次ã®å ´æ‰€ã«ãƒ‡ãƒ—ロイã—ã¾ã™"
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,14 +43616,14 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
-msgstr ""
+msgstr "種類をé¸æŠž"
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr "ã‚ãªãŸã¯å…¬é–‹è¨­å®šã«å¤‰æ›´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯%{strongStart}ã™ã¹ã¦ã®äºº%{strongEnd} ãŒé–²è¦§å¯èƒ½ã«ãªã‚Šã€%{issuableType}ã«å¯¾ã—ã¦ã‚³ãƒ¡ãƒ³ãƒˆã‚’残ã™ã“ã¨ãŒã§ãるよã†ã«ãªã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚"
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "ファイルを編集ã™ã‚‹ã«ã¯ã€ã©ã“ã‹ã®ãƒ–ランãƒã«ã„ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr "プロジェクトã¯è‡ªåˆ†ãŒç®¡ç†ã™ã‚‹åå‰ç©ºé–“ã«ã®ã¿è»¢é€ã§ãã¾ã™ã€‚"
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr "既存ã®ãƒ‡ã‚¶ã‚¤ãƒ³ã«ç ´æ£„ã—ãŸã¨ãã«ã‚¢ãƒƒãƒ—ロードã§ãるデザインã¯1ã¤ã ã‘ã§ã™ã€‚"
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "対話モードã§ã¯ã€%{use_ours} ボタンã¾ãŸã¯%{use_theirs} ボタンã§ã®é¸æŠžã¨ã€ãã®ä»–ファイルã®ç›´æŽ¥ç·¨é›†ã§ç«¶åˆã‚’解決ã§ãã¾ã™ã€‚ãã‚Œã‹ã‚‰ã“れらã®å¤‰æ›´ã‚’ %{branch_name} ã«ã‚³ãƒŸãƒƒãƒˆã—ã¾ã™ã€‚"
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。"
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr "ブロックã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ãªã‚Šã™ã¾ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“"
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr "既存ã®ãƒ‡ã‚¶ã‚¤ãƒ³ä¸Šã«ãƒ‰ãƒ­ãƒƒãƒ—ã™ã‚‹å ´åˆã¯ã€åŒã˜ãƒ•ã‚¡ã‚¤ãƒ«åã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’アップロードã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "You need a different license to enable FileLocks feature"
msgstr "ファイルロック機能を有効ã«ã™ã‚‹ã«ã¯åˆ¥ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒå¿…è¦ã§ã™"
@@ -43694,18 +44353,36 @@ msgstr "ã“ã®ãƒ—ロジェクトを直接変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
msgid "You're receiving this email because of your account on %{host}."
msgstr "ã“ã®ãƒ¡ãƒ¼ãƒ«ã¯ %{host} ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå®›ã«é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚"
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "ã“ã®ãƒ¡ãƒ¼ãƒ«ã¯ %{host} ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå®›ã«é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚ %{manage_notifications_link}&middot;%{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr "%{host} ã§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティーã®ãŸã‚ã€ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚’å—ä¿¡ã—ã¦ã„ã¾ã™ã€‚"
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr "%{host} ã§ã®ã‚ãªãŸã¸ã®ã‚¢ã‚¤ãƒ†ãƒ å‰²ã‚Šå½“ã¦ã®ãŸã‚ã€ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚’å—ä¿¡ã—ã¦ã„ã¾ã™ã€‚"
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "%{host} ã«ã¦ã‚ãªãŸãŒè¨€åŠã•ã‚ŒãŸãŸã‚ã€ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚’å—ä¿¡ã—ã¦ã„ã¾ã™ã€‚"
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "ワンタイムパスワードèªè¨¼ã‚’使用ã—ãŸ2è¦ç´ èªè¨¼ã¯æ—¢ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚別ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’登録ã™ã‚‹ã«ã¯ã€ã¾ãš2è¦ç´ èªè¨¼ã‚’無効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43791,13 +44462,13 @@ msgid "Your SSH key has expired"
msgstr ""
msgid "Your SSH key is expiring soon."
-msgstr ""
+msgstr "SSH キーã¯ã¾ã‚‚ãªã期é™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚"
msgid "Your SSH key was deleted"
-msgstr ""
+msgstr "SSH キーãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
msgid "Your SSH keys (%{count})"
-msgstr "SSH éµ (%{count})"
+msgstr "SSH キー (%{count})"
msgid "Your To-Do List"
msgstr "ã‚ãªãŸã®To Doリスト"
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr "æ–°ã—ã„パーソナルアクセストークンãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ãƒ‘スワードã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。パスワードやãã®ä»–ã®å€‹äººæƒ…報をè¦æ±‚ã•ã‚ŒãŸå ´åˆã¯ã€ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ä¸æ­£åˆ©ç”¨ã‚’報告ã—ã¦ãã ã•ã„。"
-
msgid "Your password reset token has expired."
msgstr "パスワードリセットトークンã¯æœ‰åŠ¹æœŸé™åˆ‡ã‚Œã§ã™ã€‚"
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr "ã‚ãªãŸã®ãƒ—ロフィール"
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "ã‚ãªãŸã®ãƒ—ロジェクト数㯠%{limit} 以下ã«åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®ä¸Šé™ã‚’増やã™ã«ã¯ã‚ãªãŸã®ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„"
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "削除ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼"
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr "失敗å¯èƒ½"
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr "ã™ã§ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚„ä»–ã®ãƒ—ロジェクトã®%{timebox_name}ã«ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚"
@@ -44184,6 +44861,12 @@ msgstr "自分ã«å‰²ã‚Šå½“ã¦"
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr "リスクã‚ã‚Š"
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr "ã™ã¹ã¦ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã« TLS 証明書ãŒãªã„ã¨æœ‰åŠ¹ã«ã§ãã¾ã
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr "%{reportType}:読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクト"
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr "クローズã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr "container_name ã« %{max_length} 以上ã®æ–‡å­—列を付与ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr "デフォルトブランãƒ"
msgid "deleted"
msgstr "削除完了"
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr "デプロイ"
@@ -44824,6 +45516,9 @@ msgstr "検出çµæžœãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã€ã™ã§ã«è„†å¼±æ€§ã«é–¢é€£ä»˜ã‘
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "%{link_to_merge_request} ã¨%{link_to_merge_request_source_branch} ã®å ´åˆ"
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr "グループ"
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr "ã™ã§ã«åˆ¥ã®è„†å¼±æ€§ã«ãƒªãƒ³ã‚¯ã—ã¦ã„ã¾ã™"
@@ -45188,6 +45893,12 @@ msgstr "承èªã¯ã‚ªãƒ—ションã§ã™"
msgid "mrWidget|Approval password is invalid."
msgstr "承èªãƒ‘スワードãŒç„¡åŠ¹ã§ã™ã€‚"
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "承èª"
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr "マージ"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr "マージã¯ãƒ–ロックã•ã‚Œã¾ã—ãŸ: ã™ã¹ã¦ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’解決ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr "詳ã—ã„情報"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr "%{item} ãれ㫠%{lastItem}"
msgid "on track"
msgstr "順調"
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "親"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "パスワード"
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "pod_name ã« %{max_length} 以上ã®æ–‡å­—列を付与ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
-
msgid "point"
msgid_plural "points"
msgstr[0] "ãƒã‚¤ãƒ³ãƒˆ"
@@ -45771,6 +46491,9 @@ msgstr "ä¸æ˜Ž"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr "%{group_name} グループã‹ã‚‰ç¶™æ‰¿ã•ã‚ŒãŸãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—㯠%{access} ã¨åŒç­‰ã¾ãŸã¯ãれ以上ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "yaml ãŒç„¡åŠ¹ã§ã™"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index 45cde29c29b..27f459ea162 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ka\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:09\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index a3dc0c27dbb..e7399898784 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: kab\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:27\n"
+"PO-Revision-Date: 2022-07-14 17:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 32f4816bf75..af51effc951 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:09\n"
msgid " %{start} to %{end}"
msgstr " %{start}부터 %{end}까지"
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%dê±´ì˜ ì´ìŠˆë¥¼ ë¼ë²¨ì„ 통해 성공ì ìœ¼ë¡œ 가져왔습니다"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d ë ˆì´ì–´"
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d ì´ˆ"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%dê°œì˜ ìŠ¤íƒ€"
@@ -622,9 +634,15 @@ msgstr "%{labelStart}í´ëž˜ìŠ¤:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr "%{seconds}ì´ˆ"
@@ -917,6 +932,9 @@ msgstr[0] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end}ê°œì˜ ë¦´ë¦¬ì¦ˆ"
@@ -952,6 +970,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} ì€(는) 시작날짜와 종료날짜가 있어야합니다."
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1233,6 +1254,10 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "%dì¼"
@@ -1421,6 +1446,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Let's Encrypt SSL ì¸ì¦ì„œëŠ” ë„ë©”ì¸ì´ ì¸ì¦ë˜ê¸° ì „ì—는 사용할 수 없습니다."
+msgid "A Work Item can be a parent or a child, but not both."
+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를 사용합니다"
@@ -1709,6 +1737,9 @@ msgstr "ì´ í”„ë¡œì íŠ¸ì—ì„œ 사용 가능"
msgid "Access Git repositories or the API."
msgstr "Git 저장소 ë˜ëŠ” APIì— ì•¡ì„¸ìŠ¤í•©ë‹ˆë‹¤."
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "액세스 토í°"
@@ -1826,6 +1857,12 @@ msgstr "새로 만들기"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "접근성 검사ì—ì„œ ë‹¤ìŒ ìœ í˜•ì˜ ì˜¤ë¥˜ë¥¼ 발견했습니다: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "계정"
@@ -1916,9 +1953,6 @@ msgstr "ë³€ê²½ëœ ë¡œê·¸ 추가"
msgid "Add CONTRIBUTING"
msgstr "컨트리뷰팅 추가"
-msgid "Add Jaeger URL"
-msgstr "Jaeger URL 추가"
-
msgid "Add Kubernetes cluster"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 추가"
@@ -1949,9 +1983,6 @@ msgstr "GPG 키 추가"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 "ì´ íŽ˜ì´ì§€ë¥¼ Jaeger ì„œë²„ì— ëŒ€í•œ ë§í¬ë¡œ 바꾸려면 Jaeger URLì„ ì¶”ê°€í•˜ì‹­ì‹œì˜¤. 먼저 %{link_start_tag}Jaeger를 설치%{link_end_tag}해야 합니다."
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ msgstr "ì´ %{noteableDisplayName} ì— ì¼ë°˜ì ì¸ 코멘트를 추가 합니ë‹
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 new issue"
msgstr "ì´ìŠˆ 추가"
@@ -2231,9 +2259,6 @@ msgstr "ì´ ë²„ì „ì— ì¶”ê°€ë¨"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "GitLab ì¸ìŠ¤í„´ìŠ¤ì— 새 애플리케ì´ì…˜ì„ 추가 í•  수 없습니다. ê¶Œí•œì„ ì–»ìœ¼ë ¤ë©´ GitLab 관리ìžì—게 문ì˜í•˜ì‹­ì‹œì˜¤."
-msgid "Additional Metadata"
-msgstr "추가 메타ë°ì´í„°"
-
msgid "Additional minutes"
msgstr "추가 시간(분)"
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps ë„ë©”ì¸"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr "피드 토í°"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr "2FA 사용 중지"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA 사용"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr "차단ë¨"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "사용ìžë¥¼ 차단하면 다ìŒê³¼ ê°™ì€ íš¨ê³¼ê°€ 있습니다."
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr "ì´ê²ƒì€ 나!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -2990,9 +3042,15 @@ msgstr "유저 검색"
msgid "AdminUsers|Send email to users"
msgstr "유저ì—게 ì´ë©”ì¼ ë³´ë‚´ê¸°"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "정렬 기준"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr "관리"
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "\"%{group_name}\"ì„ ìž…ë ¥í•˜ë©´ ë¡œê·¸ì¸ í•  수 있습니다."
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr "ì´ ê·¸ë£¹ì˜ í”„ë¡œì íŠ¸ë“¤ì´ Git LFS를 사용하ë„ë¡ í—ˆìš©"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "하위 ê·¸ë£¹ì´ ìžì²´ 2단계 ì¸ì¦ ê·œì¹™ì„ ì„¤ì •í•˜ë„ë¡ í—ˆìš©í•©ë‹ˆë‹¤."
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "실패 허용ë¨"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr "ì´ ê·¸ë£¹ì˜ í”„ë¡œì íŠ¸ ë˜ëŠ” 하위 ê·¸ë£¹ì´ ì „ì—­ ì„¤ì •ì„ ìž¬ì •ì˜ í•  수 있습니다."
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 추가하고 관리 í•  수 ​​있습니다."
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "ì•Œë¦¼ì„ êµ¬ë…하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "어플리케ì´ì…˜ ì„¤ì •ì´ ì„±ê³µì ìœ¼ë¡œ 저장ë˜ì—ˆìŠµë‹ˆë‹¤."
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr "ë³´ê´€ëœ í”„ë¡œì íŠ¸! 저장소 ë° ê¸°íƒ€ 프로ì íŠ¸ 리소스는 ì
msgid "Archived projects"
msgstr "ì•„ì¹´ì´ë¸Œëœ 프로ì íŠ¸"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr "ì •ë§ë¡œ %{group_name}(ì„)를 ì‚­ì œ 하시겠습니까?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "첨부 파ì¼ì´ 지워집니다. ê³„ì† í•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "헬스 ì²´í¬ í† í°ì„ 초기화 하시겠습니까?"
@@ -4913,6 +4989,9 @@ msgstr "ë¼ë²¨ 지정"
msgid "Assign milestone"
msgstr "마ì¼ìŠ¤í†¤ 지정"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr "리뷰어 지정하기"
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr "íŒŒì¼ ì²¨ë¶€"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "드래그 &amp; 드롭 ë˜ëŠ” %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "8ì›”"
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Bitbucket 서버ì—ì„œ 가져 오기"
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr "ì¹´ë“œ ì†Œì§€ìž ì´ë¦„"
msgid "Card number:"
msgstr "카드번호:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr "ì—…ë°ì´íŠ¸ê°€ 반려ë˜ì—ˆìŠµë‹ˆë‹¤. í´ë¦­í•˜ì—¬ 확ì¸í•©ë‹ˆë‹¤."
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr "하위 ì—í”½ì´ ì¡´ìž¬í•˜ì§€ 않습니다."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "닫힌 ì´ìŠˆ"
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "ì´ Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 사용할 프로ì íŠ¸ 환경 ì„ íƒ"
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr "알고 계셨나요?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8769,6 +9001,12 @@ msgstr "코드 검토"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,12 +9518,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-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 advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr ""
@@ -9469,9 +9713,6 @@ msgstr "컨테ì´ë„ˆ 레지스트리"
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr "컨테ì´ë„ˆê°€ 존재하지 않습니다"
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr "새 ë¼ë²¨ 만들기"
msgid "Create new project"
msgstr "새 프로ì íŠ¸ 만들기"
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr "기본 브랜치"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr "ì´ìŠˆì˜ 기본 설명 템플릿"
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr "댓글 삭제"
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr "키 삭제"
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr "ë¼ë²¨ ì‚­ì œ"
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr "ì‚­ì œ 대기 중. ì´ í”„ë¡œì íŠ¸ëŠ” %{date}ì— ì‚­ì œë©ë‹ˆë‹¤. 저장소와 다른 프로ì íŠ¸ 리소스는 ì½ê¸° 전용입니다."
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr "댓글"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr "ìƒì„¸"
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "호스트 키 발견"
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 사용 중지"
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,12 +13732,12 @@ msgstr ""
msgid "Edit"
msgstr "편집"
-msgid "Edit %{issuable}"
-msgstr ""
-
msgid "Edit %{name}"
msgstr "%{name} 편집"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "댓글 편집"
@@ -13494,9 +13765,6 @@ msgstr "비밀번호 수정"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr "임베드"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr "빈 파ì¼"
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "ìžë™ DevOps 활성화"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr "ì´ë©”ì¼ ì•Œë¦¼ 활성화"
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "커밋"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr "í™˜ê²½ì€ ì½”ë“œê°€ ë°°í¬ë˜ëŠ” 장소(예: 스테ì´ì§• ë˜ëŠ” ìš´ì˜)
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "ìž‘ì—…"
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr "환경 ì •ì§€ì— ëŒ€í•´ ìžì„¸ížˆ 알아보기"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "새 환경"
@@ -14280,12 +14524,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr "ë°°í¬ê°€ 없습니다."
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14295,10 +14533,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr "í™˜ê²½ì— ìž¬ë°°í¬"
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr "ëª¨ë‘ ë³´ê¸°"
@@ -14334,13 +14563,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "모ë‘ê°€ 기여할 수 있ìŒ."
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr "실패"
msgid "Failed Jobs"
msgstr "작업 실패"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr "경로로 찾기"
msgid "Find file"
msgstr "íŒŒì¼ ì°¾ê¸°"
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr "지문"
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "ë™ê¸°í™” ë¨"
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr "Git 버전"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "GitLab 가져오기"
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "%{count}ê°œì˜ ê¸°ë³¸ 결과가 제공ë˜ì—ˆìŠµë‹ˆë‹¤. 위/아래 화살표 키를 사용하여 검색 결과를 íƒìƒ‰í•˜ì„¸ìš”."
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr "ë‚´ê°€ 만든 ì´ìŠˆ"
@@ -17309,6 +17584,9 @@ msgstr "나ì—게 í• ë‹¹ëœ ë¨¸ì§€ 리퀘스트"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "ë‚´ê°€ 검토ìžì¸ 머지 리퀘스트"
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "결과가 ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤. %{count}ê°œì˜ ê²°ê³¼ë¥¼ 사용할 수 있습니다. 위/아래 화살표 키를 사용하여 검색 결과를 íƒìƒ‰í•˜ê±°ë‚˜ 엔터 키를 눌러 제출하세요."
@@ -17330,17 +17608,23 @@ msgstr "입력하고 엔터 키를 눌러 검색하세요."
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr "ì•„ëž˜ì— í‘œì‹œí•  새 ì œì•ˆì„ ìž…ë ¥í•˜ì„¸ìš”."
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr "ë¬´ì—‡ì„ ì°¾ê³  있나요?"
-msgid "GlobalSearch|in all GitLab"
-msgstr "- GitLab ì „ì²´ì—ì„œ 검색"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
-msgid "GlobalSearch|in group"
-msgstr "- 그룹ì—ì„œ 검색"
+msgid "GlobalSearch|group"
+msgstr ""
-msgid "GlobalSearch|in project"
-msgstr "- 프로ì íŠ¸ì—ì„œ 검색"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
+msgstr ""
msgid "Globally-allowed IP ranges"
msgstr ""
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr "그룹"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr "ê·¸ë£¹ì´ ì„±ê³µì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "그룹: %{group_name}"
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,37 +18400,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "%{group} ë‚´ì˜ í”„ë¡œì íŠ¸ë¥¼ 다른 ê·¸ë£¹ì— ê³µìœ í•  수 없게 합니다."
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgstr ""
+
+msgid "GroupSettings|Prevent forking outside of the group"
+msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,7 +18442,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš©ë©ë‹ˆë‹¤. ì„¤ì •ì„ ìž¬ì •ì˜
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr "홈페ì´ì§€"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "정리"
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr "유효하지 ì•Šì€ URL"
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr "유효하지 ì•Šì€ ë‚ ì§œ"
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr "1ì›”"
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr "ìž‘ì—…ì´ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "유지"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr "맨 아래로 스í¬ë¡¤"
msgid "Job|Scroll to top"
msgstr "맨 위로 스í¬ë¡¤"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°"
@@ -22159,6 +22558,10 @@ msgstr "ë¼ë²¨"
msgid "Label actions dropdown"
msgstr "ë¼ë²¨ ìž‘ì—… 드롭 다운"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr "ë” ì•Œì•„ë³´ê¸°"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr "로그"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr "액세스 관리"
-msgid "Manage all notifications"
-msgstr "모든 알림 관리"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr "ì´ë¦„"
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr "네임스페ì´ìŠ¤ ID:"
-msgid "Namespace is empty"
-msgstr "네임스페ì´ìŠ¤ê°€ 비어 있습니다."
-
msgid "Namespace:"
msgstr "네임스페ì´ìŠ¤:"
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,18 +25596,15 @@ msgstr "ì‹ ê·œ ì—픽"
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "새 파ì¼"
msgid "New group"
msgstr "새 그룹"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr "새로 만들기..."
-
msgid "Newest first"
msgstr "최신순"
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr "브랜치가 존재하지 않습니다."
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "변경 사항 ì—†ìŒ"
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Gitaly Serverì— ì—°ê²°í•  수 없습니다. 로그를 확ì¸í•˜ì‹­ì‹œì˜¤!"
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr "기여 ì—†ìŒ"
@@ -25490,6 +25902,9 @@ msgstr "ë¼ì´ì„¼ìŠ¤ê°€ 없습니다. All rights reserved"
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr "저장소 ì—†ìŒ"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr "알림 ë„기"
msgid "Notifications on"
msgstr "알림 켬"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "11ì›”"
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] "%dê°œì˜ ì¶”ê°€ ì•„ì´í…œ"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "ìž‘ì—… 대시보드는 파ì´í”„ë¼ì¸ê³¼ 경고 ìƒíƒœë¥¼ í¬í•¨í•˜ì—¬ ê° í”„ë¡œì íŠ¸ì˜ ìš´ì˜ ìƒíƒœì— 대한 ìš”ì•½ì„ ì œê³µí•©ë‹ˆë‹¤."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr "소유ìž"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Play"
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "저장소를 가져오는 ë™ì•ˆ 기다려주십시오. 완료ë˜ë©´ ìžë™ìœ¼ë¡œ 페ì´ì§€ë¥¼ 새로고침 합니다."
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28548,14 +29059,17 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "애플리케ì´ì…˜ì˜ ìƒë‹¨ ë° ë„¤ë¹„ê²Œì´ì…˜ 사ì´ë“œ ë°”ì˜ í…Œë§ˆë¥¼ 변경합니다."
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr ""
@@ -28596,9 +29110,6 @@ msgstr "ë ˆì´ì•„웃 너비"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "%{min}와 %{max} 사ì´ì˜ 숫ìžì—¬ì•¼ 합니다."
-msgid "Preferences|Navigation theme"
-msgstr "테마 íƒìƒ‰"
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr "마í¬ë‹¤ìš´ 미리보기"
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr "페ì´ë¡œë“œ 미리보기"
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "ê³„ì •ì´ ì‚­ì œë  ì˜ˆì •ìž…ë‹ˆë‹¤."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "ë‹¤ìŒ ì„œë¹„ìŠ¤ 중 하나로 ë¡œê·¸ì¸ í™œì„±í™”"
-
msgid "Profiles|Active"
msgstr "활성화"
@@ -28863,7 +29371,7 @@ msgstr "ìƒíƒœ ì´ëª¨í‹°ì½˜ 추가"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,8 +29398,8 @@ msgstr "ì‚¬ìš©ìž ì´ë¦„ì„ ë³€ê²½í•˜ë©´ ì˜ë„하지 ì•Šì€ ë¬¸ì œê°€ ìƒê¸¸ ìˆ
msgid "Profiles|Choose file..."
msgstr "íŒŒì¼ ì„ íƒ.."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "프로ì íŠ¸, 저장소 ë˜ëŠ” ì¡°ì§ ì •ë³´ ì—†ì´ ê³µê°œ í”„ë¡œí•„ì— ë¹„ë°€ 프로ì íŠ¸ì˜ 기여ë„를 표시하려면 ì´ í•­ëª©ì„ ì„ íƒí•©ë‹ˆë‹¤"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr ""
msgid "Profiles|City, country"
msgstr "ë„ì‹œ, êµ­ê°€"
@@ -28905,6 +29413,9 @@ msgstr "커밋 ì´ë©”ì¼"
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "ì—°ê²°ëœ ê³„ì •"
@@ -28932,7 +29443,7 @@ msgstr "%{provider} ì—°ê²° ëŠê¸°"
msgid "Profiles|Do not show on profile"
msgstr "í”„ë¡œí•„ì— í‘œì‹œí•˜ì§€ ì•ŠìŒ"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr "프로필 편집"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "ì‚¬ëžŒë“¤ì´ ë‚˜ë¥¼ 알아볼 수 있ë„ë¡ ë‚´ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”."
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,8 +29494,8 @@ msgstr "ë‚´ í”„ë¡œí•„ì— ë¹„ë°€ 기여 í¬í•¨"
msgid "Profiles|Incoming email token was successfully reset"
msgstr "수신 ì´ë©”ì¼ í† í°ì´ 성공ì ìœ¼ë¡œ 초기화ë˜ì—ˆìŠµë‹ˆë‹¤."
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "ì´ì¤‘ ì¸ì¦(2FA)를 활성화하여 ê³„ì •ì˜ ë³´ì•ˆì„ ê°•í™”í•˜ì„¸ìš”."
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
msgid "Profiles|Invalid password"
msgstr "ìž˜ëª»ëœ íŒ¨ìŠ¤ì›Œë“œ"
@@ -29070,23 +29581,23 @@ msgstr "아바타 제거"
msgid "Profiles|Select a service to sign in with."
msgstr ""
+msgid "Profiles|Service sign-in"
+msgstr ""
+
msgid "Profiles|Set new profile picture"
msgstr "새 프로필 사진 설정"
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set your local time zone."
msgstr ""
-msgid "Profiles|Social sign-in"
-msgstr "소셜 로그ì¸"
-
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "ì¼ë¶€ ì˜µì…˜ì€ LDAP 계정ì—ì„œ 사용할 수 없습니다."
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "250ê°€ ì´ë‚´ë¡œ ìžì‹ ì— 대해 알려주세요."
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
@@ -29094,17 +29605,17 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "최대 허용ë˜ëŠ” 파ì¼ì˜ í¬ê¸°ëŠ” 200KB입니다."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "ì´ ì´ë©”ì¼ì€ ë‚´ 공개 í”„ë¡œí•„ì— í‘œì‹œë©ë‹ˆë‹¤."
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "ì´ ì´ë©”ì¼ì€ 수정ì´ë‚˜ ë¨¸ì§€ê°™ì€ ì›¹ 기반 ìž‘ì—…ì— ì‚¬ìš©ë©ë‹ˆë‹¤. %{commit_email_link_start}ë” ì•Œì•„ë³´ê¸°%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "ì´ ê·¸ë¦¼ê³¼ 메시지는 프로필과 ì¸í„°íŽ˜ì´ìŠ¤ ì „ì²´ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤."
-msgid "Profiles|This information will appear on your profile"
-msgstr "ì´ ì •ë³´ëŠ” ë‚´ í”„ë¡œí•„ì— í‘œì‹œë©ë‹ˆë‹¤."
+msgid "Profiles|This information will appear on your profile."
+msgstr ""
msgid "Profiles|Time settings"
msgstr "시간 설정"
@@ -29112,8 +29623,8 @@ msgstr "시간 설정"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
-msgstr "ì´ì¤‘ ì¸ì¤‘"
+msgid "Profiles|Two-factor authentication"
+msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "확ì¸ì„ 위해 %{confirmationValue} 를 입력하세요."
@@ -29148,8 +29659,8 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "ìƒíƒœëŠ” 어떤가요?"
-msgid "Profiles|Who you represent or work for"
-msgstr "ë‚´ê°€ 대표로 있는 ê³³ ë˜ëŠ” ì¼í•˜ëŠ” ê³³"
+msgid "Profiles|Who you represent or work for."
+msgstr ""
msgid "Profiles|You can change your avatar here"
msgstr "여기ì—ì„œ 아바타를 변경할 수 있습니다."
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "ë‚˜ì˜ ìƒíƒœ"
@@ -29268,7 +29782,7 @@ msgstr "프로ì íŠ¸ 템플릿"
msgid "Project URL"
msgstr "프로ì íŠ¸ URL"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr "관리ìž"
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "ì´ë¦„"
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "%{group_name}ê³¼ 공유ë˜ëŠ” 프로ì íŠ¸"
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 "새로고침"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr "실행 시간"
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "헬스 ì²´í¬ ì ‘ê·¼ í† í° ì´ˆê¸°í™”"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "ì´ ìž‘ì—… 재시ë„"
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr "소스 브랜치 ì„ íƒ"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜ ì„ íƒ"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "ê¸°ë³¸ê°’ì„ ì„¤ì •í•˜ê³  공개 ìˆ˜ì¤€ì„ ì œí•œí•˜ì‹­ì‹œì˜¤. 소스 가져오기와 git ì ‘ê·¼ í”„ë¡œí† ì½œì„ ì„¤ì •í•˜ì‹­ì‹œì˜¤."
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr "새 비밀번호 설정"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "나란히"
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36340,6 +36965,9 @@ msgstr "저장소:"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr "하위 그룹"
msgid "Subgroups and projects"
msgstr "서브 그룹과 프로ì íŠ¸"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr "지ì›"
@@ -36929,6 +37569,21 @@ msgstr "ì§€ì› íŽ˜ì´ì§€ URL"
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr "괜찮습니다, 갱신하지 않겠습니다."
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr "ì´ í”„ë¡œì íŠ¸ëŠ” ì¸ì¦ì—†ì´ 액세스 í•  수 있습니다."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr "ì•„ì§ íŒ¨í‚¤ì§€ê°€ 없습니다"
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr "표시할 주제가 없습니다."
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr "ì´ ìž‘ì—…ì—는 ìˆ˜ë™ ìž‘ì—…ì´ í•„ìš”í•©ë‹ˆë‹¤."
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr "시간"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr "소요 시간"
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr "ì´ìŠˆê°€ 스케줄ë˜ê¸° ì „ì˜ ì‹œê°„"
msgid "Time before an issue starts implementation"
msgstr "ì´ìŠˆê°€ 구현ë˜ê¸° ì „ì˜ ì‹œê°„"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "머지 리퀘스트(MR) ìƒì„±ê³¼ 머지 / 닫기 사ì´ì˜ 시간"
@@ -39191,6 +39843,12 @@ msgstr "Est"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "ì˜ˆìƒ ì‹œê°„:"
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "사ì´ë“œë°” 토글"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr "2단계 ì¸ì¦"
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr "ì°¨ì´ì ì„ ì½ì–´ë“¤ì¼ 수 없습니다. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr "ì•Œ 수 ì—†ìŒ"
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr "새 íŒŒì¼ ì—…ë¡œë“œ"
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "업로드하려면 í´ë¦­í•˜ì‹­ì‹œì˜¤."
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr "아티팩트는 빌드와 파ì´í”„ë¼ì¸ ì•„í‹°íŒ©íŠ¸ì˜ í•©ê³„ìž…ë‹ˆë‹
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "추가 시간 구매"
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "저장 공간"
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "ì •ë§ ë‹¹ì‹ ì´ ë§žëŠ”ì§€ 확ì¸í•˜ê³  싶습니다, ë‹¹ì‹ ì´ ë¡œë´‡ì´ ì•„ë‹ˆë¼ëŠ” ê²ƒì„ í™•ì¸í•´ì£¼ì‹­ì‹œì˜¤."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "ë¸Œëžœì¹˜ì— ìžˆì„ ë•Œë§Œ 파ì¼ì„ 편집할 수 있습니다."
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "ì´ ì´ë©”ì¼ì„ 받는 ì´ìœ ëŠ” 사용ìžì˜ ê³„ì •ì´ %{host}ì— ìžˆê¸° 때문입니다. %{manage_notifications_link}&middot;%{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "ì´ë¯¸ ì¼íšŒìš© ì¸ì¦ê¸°ë¥¼ ì´ìš©í•˜ì—¬ ì´ì¤‘ ì¸ì¦ì„ 활성화했습니다. 다른 기기를 등ë¡í•˜ë ¤ë©´ ì´ì¤‘ ì¸ì¦ì„ 먼저 비활성화해야 합니다."
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr "비밀번호 재설정 토í°ì´ 만료ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "ì‚­ì œëœ ì‚¬ìš©ìž"
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr "기본 브랜치"
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr "그룹"
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr "머지"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr "머지 중! ê±°ì˜ ë‹¤ ë습니다…"
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr "최ìƒìœ„ 그룹ì—서만 사용 가능합니다."
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "부모"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "패스워드"
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "유효하지 ì•Šì€ yaml"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr "ë‹¹ì‹ ì˜ ì„¤ì •"
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index e76fbe294ab..46948375dd1 100644
--- a/locale/ku_TR/gitlab.po
+++ b/locale/ku_TR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ku\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:09\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index 73a8a0af2a3..d2da2dcfed0 100644
--- a/locale/ky_KG/gitlab.po
+++ b/locale/ky_KG/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ky\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index 1b696b14c14..ccacc8594a7 100644
--- a/locale/lt_LT/gitlab.po
+++ b/locale/lt_LT/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: lt\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:09\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -374,6 +374,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -486,6 +500,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -865,9 +886,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1086,9 +1113,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1190,6 +1214,9 @@ msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1231,6 +1258,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1527,6 +1557,13 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1784,6 +1821,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2072,6 +2112,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2189,6 +2232,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2279,9 +2328,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2312,9 +2358,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2342,9 +2385,6 @@ 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 new issue"
msgstr ""
@@ -2594,9 +2634,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2846,6 +2883,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2918,6 +2958,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3143,7 +3186,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3152,6 +3195,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3194,6 +3240,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3221,6 +3270,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3296,6 +3348,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3323,6 +3381,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3341,6 +3402,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3353,9 +3417,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3404,9 +3474,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3425,6 +3492,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3491,6 +3561,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3971,6 +4044,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3983,12 +4059,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4031,9 +4101,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4046,9 +4113,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4061,12 +4125,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4226,6 +4296,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4445,6 +4518,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4455,6 +4531,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4662,6 +4741,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5062,7 +5144,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5168,6 +5250,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5186,6 +5271,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5303,6 +5391,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5400,9 +5491,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5476,6 +5564,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5500,6 +5591,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5509,6 +5603,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5524,6 +5624,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6016,9 +6119,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6421,6 +6521,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6721,6 +6827,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7042,6 +7151,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7138,6 +7250,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7181,6 +7296,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7508,6 +7626,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7679,9 +7800,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7933,6 +8051,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8050,6 +8171,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8426,6 +8550,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8444,6 +8571,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8453,9 +8697,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8823,9 +9064,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8865,6 +9103,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8910,9 +9151,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9090,10 +9328,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9270,6 +9520,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9661,6 +9914,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9697,10 +9953,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9892,9 +10148,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10120,9 +10373,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10858,6 +11111,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11552,6 +11808,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11585,6 +11844,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11633,13 +11901,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11771,6 +12039,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11981,6 +12252,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12186,12 +12460,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12204,9 +12472,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12300,9 +12568,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12348,6 +12613,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12459,6 +12727,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12600,13 +12895,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13235,6 +13518,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13716,9 +14002,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13935,10 +14218,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13968,9 +14251,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14121,9 +14401,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14262,9 +14539,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14280,6 +14554,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14463,9 +14737,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14586,9 +14857,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14688,12 +14956,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14730,9 +14992,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14742,9 +15001,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14754,12 +15010,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14769,10 +15019,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14781,18 +15028,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14808,13 +15049,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14949,6 +15187,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15580,7 +15827,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15766,6 +16016,13 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr ""
@@ -16449,7 +16706,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16458,6 +16718,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16659,7 +16919,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16901,9 +17161,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17213,9 +17464,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17459,6 +17704,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17576,9 +17860,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17675,6 +17956,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17780,9 +18064,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17798,6 +18088,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,16 +18112,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18104,6 +18403,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18257,6 +18559,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18266,7 +18571,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18533,18 +18838,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18575,25 +18877,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18602,37 +18904,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,9 +18958,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18674,7 +18988,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18806,9 +19120,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19296,10 +19607,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19473,15 +19781,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20760,9 +21149,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21013,6 +21405,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21154,6 +21555,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21166,15 +21570,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21217,9 +21612,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21388,6 +21780,13 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21499,6 +21898,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21682,15 +22084,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22048,9 +22441,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22411,12 +22816,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22672,6 +23089,13 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr ""
@@ -22898,9 +23322,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22916,9 +23337,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22979,19 +23397,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23036,22 +23454,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23078,9 +23502,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23678,9 +24096,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23690,9 +24105,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24418,12 +24836,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24589,7 +25013,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25446,6 +25882,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25470,9 +25909,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25561,10 +25997,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25573,10 +26009,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25733,16 +26169,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25838,9 +26271,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25895,6 +26325,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25925,6 +26358,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26042,6 +26475,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26461,21 +26903,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26975,6 +27468,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26999,7 +27495,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,22 +27504,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27059,10 +27558,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27158,6 +27657,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27176,6 +27678,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27482,6 +27987,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27642,6 +28153,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27681,9 +28195,6 @@ 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 ""
@@ -27774,18 +28285,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28833,6 +29368,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29040,12 +29578,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29121,13 +29653,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29169,9 +29704,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29436,7 +29965,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,7 +29992,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29478,6 +30007,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29505,7 +30037,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29514,16 +30046,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,7 +30088,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29643,13 +30175,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29658,7 +30190,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29667,16 +30199,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29685,7 +30217,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29721,7 +30253,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29763,6 +30295,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29841,7 +30376,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29964,6 +30499,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30759,7 +31303,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30819,7 +31363,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31710,9 +32266,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31877,6 +32430,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32270,9 +32826,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32300,6 +32853,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33304,6 +33860,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34355,7 +34938,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,6 +34983,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35021,6 +35595,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35135,6 +35715,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35156,6 +35739,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35444,6 +36027,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35772,6 +36361,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37006,6 +37652,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37027,7 +37676,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37045,6 +37694,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,6 +37760,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37414,7 +38069,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37598,6 +38259,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38312,9 +38994,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38924,6 +39597,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39833,9 +40509,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39887,6 +40560,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40477,9 +41165,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40795,6 +41474,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40885,9 +41567,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40897,9 +41576,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40942,6 +41615,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41038,9 +41714,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41092,12 +41765,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41293,10 +41960,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42356,9 +43026,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,10 +44357,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44417,18 +45100,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44708,6 +45397,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44876,6 +45574,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45589,6 +46305,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45965,6 +46697,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46072,6 +46810,9 @@ msgstr[3] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46569,6 +47316,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46792,6 +47542,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index 31a352189a5..bbdb8af48a8 100644
--- a/locale/mk_MK/gitlab.po
+++ b/locale/mk_MK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: mk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ml_IN/gitlab.po b/locale/ml_IN/gitlab.po
index 71b9304978b..13516539a6a 100644
--- a/locale/ml_IN/gitlab.po
+++ b/locale/ml_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ml-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index 2e4fe7093b0..596726bc6c7 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 896d2c81902..0ab69246777 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:13\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -288,6 +288,11 @@ 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 job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d lag"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekund"
msgstr[1] "%d sekunder"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d stjerne"
@@ -703,9 +718,15 @@ msgstr "%{labelStart}Klasse:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Krasjadresse:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Krasjtilstand:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Bevis:%{labelEnd} %{evidence}"
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search} %{description} %{scope}"
-
msgid "%{seconds}s"
msgstr "%{seconds}s"
@@ -1008,6 +1026,9 @@ msgstr[1] "%{strong_start}%{count} medlemmer%{strong_end} må godkjenne sammensl
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} utgivelse"
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} må ha start- og forfallsdato"
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr "0 byte"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 dag"
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Et 'Let's Encrypt'-SSL-sertifikat kan ikke fås før domenet ditt har blitt bekreftet."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr "Akseptabelt for bruk i dette prosjektet"
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Tilgangskode"
@@ -1947,6 +1982,12 @@ msgstr "Ny"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Konto"
@@ -2037,9 +2078,6 @@ msgstr "Legg til CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Legg til CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Legg til Jaeger-URL"
-
msgid "Add Kubernetes cluster"
msgstr "Legg til Kubernetes-klynge"
@@ -2070,9 +2108,6 @@ msgstr "Legg til en GPG-nøkkel"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ msgstr "Legg til en generell kommentar til denne %{noteableDisplayName}."
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 "Legg til en vannrett linjal"
-
msgid "Add a new issue"
msgstr "Legg til en ny sak"
@@ -2352,9 +2384,6 @@ msgstr "Lagt til i denne versjonen"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Å legge til nye applikasjoner er deaktivert i GitLab-instansen din. Ta kontakt med GitLab-administratoren din for å få tillatelse til det"
-msgid "Additional Metadata"
-msgstr "Ekstra metadata"
-
msgid "Additional minutes"
msgstr "Ytterligere minutter"
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domene"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr "2FA er skrudd av"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA er skrudd på"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr "Tilgang"
msgid "AdminUsers|Access Git repositories"
msgstr "FÃ¥ tilgang til Git-arkiver"
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr "FÃ¥ tilgang til API-en"
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr "Bannlys bruker"
@@ -2979,6 +3020,9 @@ msgstr "Blokkert"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Å blokkere brukeren har følgende effekter:"
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr "Det er deg!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr "Personlige prosjekter vil bli forlatt"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Ã… reaktivere en bruker vil:"
@@ -3099,6 +3152,9 @@ msgstr "Vil du avvise brukeren %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "Avviste brukere:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Gjenopprett brukertilgang til kontoen, inkludert nett, Git og API."
@@ -3111,9 +3167,15 @@ msgstr "Søk etter brukere"
msgid "AdminUsers|Send email to users"
msgstr "Send E-post til brukere"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "Sorter etter"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr "Brukeradministrasjon"
-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"
msgstr "Brukeren vil ikke kunne gå inn på git-kodelagre"
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr "Hva kan jeg gjøre?"
@@ -3249,6 +3311,9 @@ msgstr "brukergrense"
msgid "Administration"
msgstr "Administrasjon"
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Tillat \"%{group_name}\" å logge deg på"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr "Tillat prosjekter innenfor denne gruppen å bruke Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr "Tillat brukere å avvise utsendingsmeldingen"
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "Tillat brukere å be om tilgang (dersom synligheten er offentlig eller intern)"
-
msgid "Allowed"
msgstr "Tillatt"
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr "Har tillatelse til å opprette:"
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "Tillatt å mislykkes"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Lar deg legge til og behandle Kubernetes-klynger."
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr "En feil oppstod under innhenting av diff-filer"
msgid "An error occurred while retrieving projects."
msgstr "Det oppstod en feil under innhenting av prosjekter."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "En feil oppstod under abonnering på varsler."
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "Programinnstillingene ble vellykket lagret"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "Oppdatering av programinnstillinger mislyktes"
@@ -4804,7 +4878,7 @@ msgstr "Arkivert prosjekt! kodelageret og andre prosjektressurser er skrivebesky
msgid "Archived projects"
msgstr "Arkiverte prosjekter"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Er du sikker på at du vil fjerne %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Er du sikker på at du vil fjerne vedlegget?"
@@ -4926,6 +5003,9 @@ msgstr "Er du sikker på at du vil fjerne denne listen?"
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Er du sikker du vil tilbakestille helsesjekksjetongen?"
@@ -5043,6 +5123,9 @@ msgstr "Tilordne stempler"
msgid "Assign milestone"
msgstr "Tilordne milepæl"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr "Tilordne godkjenner"
@@ -5138,9 +5221,6 @@ msgstr "I faresonen"
msgid "Attach a file"
msgstr "Legg ved en fil"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Legg til en fil ved å dra-og-slippe eller %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr "Denne måneden"
msgid "AuditLogs|User Events"
msgstr "Brukerhendelser"
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "Aug"
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Bitbucket-tjenerimportering"
@@ -6451,6 +6549,9 @@ msgstr "Laster inn eposer"
msgid "Bold text"
msgstr "Fet tekst"
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr "må være en gruppe"
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr "For evig"
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr "Endringer er klappet sammen. Klikk for å vise."
msgid "Changes the title to \"%{title_param}\"."
msgstr "Endrer tittelen til \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr "GitLab-plan"
msgid "Checkout|Group"
msgstr "Gruppe"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr "Avgift"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr "Totalt"
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr "Lukket %{epicTimeagoDate}"
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Lukkede saker"
@@ -8166,6 +8285,123 @@ msgstr "Cloud Run"
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr "Klynge"
@@ -8175,9 +8411,6 @@ msgstr "Klynge-helse"
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr "Klyngen finnes ikke"
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr "Avanserte alternativer for denne Kubernetes-klyngens integrering"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Velg hvilke av miljøene dine som skal bruke denne klyngen."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr "Visste du det?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ 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 certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr "Kodevurdering"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,12 +9663,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-msgstr "Konfigurer sporing"
-
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 "Konfigurer en %{codeStart}.gitlab-webide.yml%{codeEnd}-fil i %{codeStart}.gitlab%{codeEnd}-mappen for å begynne å bruke netterminalen. %{helpStart}Lær mer.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr ""
@@ -9610,9 +9858,6 @@ msgstr "Container-register"
msgid "Container Scanning"
msgstr "Containerskanning"
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr "Opprett ny stempel"
msgid "Create new project"
msgstr "Opprett et nytt prosjekt"
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr "Dato"
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr "Antall distribusjoner"
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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 "DAST-innstillinger"
+msgid "DastConfig|DAST CI/CD configuration"
+msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr "Behandle profiler"
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr "Prøv å validere på nytt"
@@ -11894,12 +12160,6 @@ msgstr "Standardgren"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr "Standard første ukedag"
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr "Definisjon"
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr "Slett kommentar"
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr "Slett nøkkel"
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr "Slett stempel"
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr "Avslått"
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr "Kommentar"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "Klarte ikke å legge til en ny kommentar. Vennligst prøv igjen."
@@ -12867,9 +13145,6 @@ msgstr "Behold endringer"
msgid "DesignManagement|Keep comment"
msgstr "Behold kommentaren"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr "Lær om å oppklare kommentarer"
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr "Detaljer"
msgid "Details (default)"
msgstr "Detaljer (standard)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr "Din score"
msgid "DevopsReport|Your usage"
msgstr "Din bruk"
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr "Deaktiver for dette prosjektet"
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr "Skru av 2-trinnsautentisering"
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,12 +13894,12 @@ msgstr ""
msgid "Edit"
msgstr "Rediger"
-msgid "Edit %{issuable}"
-msgstr "Rediger %{issuable}"
-
msgid "Edit %{name}"
msgstr "Rediger %{name}"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "Rediger kommentar"
@@ -13652,9 +13927,6 @@ msgstr "Rediger passord"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "Rediger utgivelse"
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr "Innbygging"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr "Tom fil"
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "Aktiver Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr "Skru på Gitpod"
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr "Skru på E-postvarsler"
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr "Bedrift"
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr "Viser for øyeblikket alle resultater."
-
msgid "Environments|Delete"
msgstr "Slett"
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Jobb"
@@ -14426,9 +14677,6 @@ msgstr "Lær om miljøer"
msgid "Environments|Learn more about stopping environments"
msgstr "Lær mer om hvordan stoppe miljøer"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Nytt miljø"
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr "Ingen pod er valgt"
-
-msgid "Environments|No pods to display"
-msgstr "Ingen podder å vise"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Merk at denne handlingen vil stoppe miljøet, men det vil %{emphasisStart}ikke%{emphasisEnd} ha en effekt på noen eksisterende distribusjoner fordi ingen «Stopp miljøhandling» er definert i %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}-filen."
@@ -14453,10 +14695,7 @@ msgstr "Ã…pne"
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr "Tilbakeføring"
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr "Velg pod"
-
msgid "Environments|Show all"
msgstr "Vis alle"
@@ -14492,14 +14725,11 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr "Det oppstod en feil under innhenting av loggfilene. Vennligst prøv igjen."
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
-msgstr "Denne handlingen vil kjøre jobben som er definert av %{name} for innsmettingen %{linkStart}%{commitId}%{linkEnd}, som setter miljøet til en tidligere versjon. Du kan tilbakestille det ved å distribuere den nyeste versjonen av applikasjonen på nytt. Er du sikker på at du vil fortsette?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr ""
msgid "Environments|Upcoming"
msgstr "Kommende"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "Aktiv"
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr "Alle med tilgang"
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "Alle kan bidra"
@@ -15262,8 +15501,8 @@ msgstr "Utløpt:"
msgid "Expires"
msgstr "Utløper"
-msgid "Expires in %{expires_at}"
-msgstr "Utløper om %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr ""
msgid "Expires on"
msgstr "Utløper den"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr "Mislykket"
msgid "Failed Jobs"
msgstr "Mislykkede jobber"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr "Mislyktes den"
@@ -16127,8 +16374,11 @@ msgstr "Finn utifra filbane"
msgid "Find file"
msgstr "Finn fil"
-msgid "Fingerprint"
-msgstr "Fingeravtrykk"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
+msgstr ""
msgid "Fingerprints"
msgstr "Fingeravtrykk"
@@ -16136,6 +16386,9 @@ msgstr "Fingeravtrykk"
msgid "Finish editing this message first!"
msgstr "Fullfør redigeringen av denne meldingen først!"
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "For mer informasjon, gå til "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr "Synlighetsnivå"
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr "Venter verifikasjon"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr "Hovednode"
-
msgid "Geo|Primary site"
msgstr "Hovednettsted"
-msgid "Geo|Project"
-msgstr "Prosjekt"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr "Sekundær node"
-
msgid "Geo|Secondary site"
msgstr "Sekundært nettsted"
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "Synkronisert"
-msgid "Geo|Synced at"
-msgstr "Synkronisert den"
-
msgid "Geo|Synchronization"
msgstr "Synkronisering"
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr "Git-versjon"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr "GitLab-kontoforespørsel"
msgid "GitLab Billing Team."
msgstr "GitLab-faktureringsteamet."
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "GitLab-importering"
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr "GitLab-brukernavn"
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr "Uverifisert"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr "Verifisert"
@@ -17454,9 +17728,15 @@ msgstr "Globale hurtigtaster"
msgid "Global notification settings"
msgstr "Universelle varslingsinnstillinger"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr "Saker jeg har opprettet"
@@ -17472,6 +17752,9 @@ msgstr "Fletteforespørsler tildelt til meg"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "Resultatene er oppdatert. %{count} resultater tilgjengelig. Bruk ↑- og ↓-piltastene for å navigere i søkeresultatlisten, eller ENTER for å sende inn."
@@ -17493,16 +17776,22 @@ msgstr "Skriv inn og trykk Enter-tasten for å sende inn et søk."
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr "Skriv inn for at nye forslag skal vises nedenfor."
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr "Hva søker du etter?"
-msgid "GlobalSearch|in all GitLab"
-msgstr "på hele GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr "Gravatar er skrudd på"
msgid "Group"
msgstr "Gruppe"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr "Gruppen ble vellykket oppdatert."
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "Gruppe: %{group_name}"
@@ -17940,8 +18235,8 @@ msgstr "Gruppe: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
-msgstr "Seneste 90 dager"
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr ""
msgid "GroupActivityMetrics|Members added"
msgstr "Medlemmer lagt til"
@@ -18207,18 +18502,15 @@ msgstr "Søk i grupper"
msgid "GroupSelect|Select a group"
msgstr "Velg en gruppe"
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,33 +18541,45 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr "Tilpassede prosjektmaler"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
-msgstr "Skru av e-postvarsler"
+msgid "GroupSettings|Email notifications are disabled"
+msgstr ""
-msgid "GroupSettings|Disable group mentions"
-msgstr "Skru av gruppenevninger"
+msgid "GroupSettings|Export group"
+msgstr "Eksporter gruppe"
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
-msgid "GroupSettings|Export group"
-msgstr "Eksporter gruppe"
-
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|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18291,22 +18595,13 @@ 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|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
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 ""
-
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr "Denne innstillingen brukes på %{ancestor_group}. Du kan overstyre innst
msgid "GroupSettings|Transfer group"
msgstr "Overfør gruppe"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr "Importer gruppe"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr "Min fantastiske gruppe"
-
msgid "GroupsNew|No import options available"
msgstr "Ingen importalternativer er tilgjengelige"
@@ -18962,12 +19263,12 @@ msgstr "Hjemmeside"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
-msgstr "Kroken ble vellykket opprettet."
-
msgid "Hook was successfully updated."
msgstr "Kroken ble vellykket oppdatert."
+msgid "Horizontal rule"
+msgstr ""
+
msgid "Hostname"
msgstr "Servernavn"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "Time (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "Renhold"
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr "Alarmdetaljer"
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr "MÃ¥ltall"
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Oppsummering"
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr "Sett inn"
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr "Sett inn en kodeblokk"
-
msgid "Insert a quote"
msgstr "Sett inn et sitat"
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr "Kommentardetalj:"
msgid "Integrations|Comment settings:"
msgstr "Kommentarinnstillinger"
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr "Ingen tilgjengelige navneområder."
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr "Bruk tilpassede innstillinger"
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr "Ugyldig URL"
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr "Ugyldig dato"
@@ -20875,9 +21260,6 @@ msgstr "Ugyldig periode"
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr "Ugyldig kodelager-filbane"
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr "Ugyldig status"
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr "Noe gikk galt"
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr "Invitert"
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "kan ikke vare mer enn 500 år inn i fremtiden"
-msgid "Jaeger URL"
-msgstr "Jaeger-URL"
-
msgid "Jan"
msgstr "Jan"
@@ -21706,9 +22087,15 @@ msgstr "Jira-brukere har blitt importert fra den konfigurerte Jira-instansen. De
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr "Jobben har blitt slettet"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "Behold"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr "Bla til bunn"
msgid "Job|Scroll to top"
msgstr "Bla til toppen"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "tillatt å mislykkes"
@@ -22252,9 +22660,6 @@ msgstr "Kroki"
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr "Kubernetes-klynge"
@@ -22330,6 +22735,11 @@ msgstr "Etikett"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr "Lær GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr "Kun prøveversjon"
-
msgid "Learn More"
msgstr "Lær mer"
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr "Lær mer"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr "Lær mer om %{username}"
@@ -22635,21 +23039,21 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr "Legg til kodeeiere"
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
+msgid "LearnGitLab|Create a repository"
+msgstr ""
+
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
msgid "LearnGitLab|Create an issue"
msgstr "Lag en saksrapport"
-msgid "LearnGitLab|Create or import a repository"
-msgstr ""
-
msgid "LearnGitLab|Create or import your first repository into your new project."
msgstr ""
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr ""
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr ""
+
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
msgid "LearnGitLab|Set up CI/CD"
msgstr "Sett opp CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
+msgstr ""
+
msgid "LearnGitLab|Set up your workspace"
msgstr "Sett opp arbeidsområdet ditt"
-msgid "LearnGitLab|Set-up CI/CD"
-msgstr "Sett opp CI/CD"
-
-msgid "LearnGitLab|Start a free Ultimate trial"
-msgstr ""
-
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr "OK, da setter vi i gang"
-msgid "LearnGitlab|Trial only"
-msgstr "Kun prøveperiode"
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr "Logger"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr "Gjør denne saken konfidensiell."
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr "Administrer tilgang"
-msgid "Manage all notifications"
-msgstr "Administrer alle varsler"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "Administrer programmer som kan bruke GitLab som OAuth-leverandør, og programmer som du har autorisert til å bruke kontoen din."
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr "Markerte oppgaven som ferdig."
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr "Fletteforespørselshendelser"
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,8 +24639,8 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr "Ingen filer ble funnet"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
-msgstr "Søk i filer (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgstr ""
msgid "Merged"
msgstr "Flettet"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr "Melding"
@@ -24606,9 +25019,6 @@ msgstr "Verdier"
msgid "Metrics|View documentation"
msgstr "Vis dokumentasjon"
-msgid "Metrics|View logs"
-msgstr "Vis loggføringer"
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr "Multi-prosjekt"
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr "Flere domener støttes."
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr "Navn"
@@ -25106,9 +25531,6 @@ msgstr "Navnefelt"
msgid "Namespace ID:"
msgstr "Navneområde-ID:"
-msgid "Namespace is empty"
-msgstr "Navnefeltet er tomt"
-
msgid "Namespace:"
msgstr "Navneområde:"
@@ -25195,10 +25617,10 @@ msgstr "Navigasjonslinje"
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,18 +25787,15 @@ msgstr "Nytt epos"
msgid "New epic title"
msgstr "Tittel på ny epos"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Ny fil"
msgid "New group"
msgstr "Ny gruppe"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr "Nytt gruppenavn"
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr "Ny..."
-
msgid "Newest first"
msgstr "Nyeste øverst"
@@ -25527,6 +25943,9 @@ msgstr "Ingen milepæl"
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr "Ingen tilgjengelige grener"
msgid "No branches found"
msgstr "Ingen grener funnet"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Ingen endringer"
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr "Ingen bidrag"
@@ -25674,6 +26093,9 @@ msgstr "Ingen lisens. Alle rettigheter forbeholdt"
msgid "No matches found"
msgstr "Ingen treff"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr "Ingen overgruppe"
msgid "No plan"
msgstr "Ingen plan"
-msgid "No pods available"
-msgstr "Ingen podder er tilgjengelige"
-
msgid "No policy matches this license"
msgstr "Ingen retningslinje samsvarer med denne lisensen"
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "Ingen kodelager"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr "Er du sikker på at du vil avbryte opprettelsen av denne kommentaren?"
msgid "Notes|Collapse replies"
msgstr "Klapp sammen svar"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr "Varsling av"
msgid "Notifications on"
msgstr "Varsling på"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] "Én gjenstand til"
msgstr[1] "%d gjenstander til"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,23 +27110,23 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr "Kun prosjektmedlemmer"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
-msgstr "Bare administratorer kan slette prosjektet"
+msgid "Only active projects show up in the search and on the dashboard."
+msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr ""
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,11 +27164,11 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
-msgstr "Bare bekreftede brukere med en e-postadresse hos et av disse domenene kan legges til i gruppen."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
+msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
msgstr ""
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr "Innstillinger"
msgid "Or you can choose one of the suggested colors below"
msgstr "Eller så kan du velge en av de foreslåtte fargene nedenfor"
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr "Eid av:"
msgid "Owner"
msgstr "Eier"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr "Pakketypen må være PyPi"
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,8 +27482,11 @@ msgstr "Legg til NuGet-kilde"
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
-msgstr "Tillat duplikater"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
+msgstr ""
msgid "PackageRegistry|App group: %{group}"
msgstr "Appgruppe: %{group}"
@@ -27102,6 +27593,9 @@ msgstr "Slett pakke"
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr "Fjern pakke"
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Beklager, filteret ditt ga ingen resultater"
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr "Parent"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr "Bruk mal"
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr "PlantUML-URL"
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Spill av"
@@ -28658,12 +29182,6 @@ msgstr "Vennligst vent mens vi kobler til kodelageret ditt. Oppdater når du vil
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Vennligst vent mens vi importerer kodelageret ditt. Oppdater når du vil."
-msgid "Pod does not exist"
-msgstr "Podden finnes ikke"
-
-msgid "Pod not found"
-msgstr "Podden ble ikke funnet"
-
msgid "Pods in use"
msgstr "Podder som brukes"
@@ -28739,14 +29257,17 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Konfigurer hvordan datoer og klokkeslett vises for deg."
msgid "Preferences|Customize integrations with third party services."
msgstr "Tilpass integreringer med tredjepartstjenester."
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "Tilpass utseende til applikasjons-toppområdet og navigasjonssidelinjen."
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr ""
@@ -28787,9 +29308,6 @@ msgstr "Utformingsbredde"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Må være et nummer mellom %{min} og %{max}"
-msgid "Preferences|Navigation theme"
-msgstr "Navigasjonstema"
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr "Forrige"
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr "Forhåndsvis Markdown"
msgid "Preview changes"
msgstr "Forhåndsvis endringer"
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Aktiver pålogging med en av følgende tjenester"
-
msgid "Profiles|Active"
msgstr "Aktiv"
@@ -29054,7 +29569,7 @@ msgstr "Legg til status emoji"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,8 +29596,8 @@ msgstr "Ã… endre brukernavnet ditt kan ha utilsiktede bivirkninger."
msgid "Profiles|Choose file..."
msgstr "Velg fil..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "Velg å vise bidrag fra private prosjekter på din offentlige profil uten informasjon om prosjekt, kodelager eller organisasjon"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr ""
msgid "Profiles|City, country"
msgstr "By, land"
@@ -29096,6 +29611,9 @@ msgstr "Commit-E-post"
msgid "Profiles|Connect %{provider}"
msgstr "Koble til %{provider}"
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "Tilkoblede kontoer"
@@ -29123,7 +29641,7 @@ msgstr "Koble fra %{provider}"
msgid "Profiles|Do not show on profile"
msgstr "Vis ikke på profilen"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,17 +29650,17 @@ msgstr "Rediger profil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
-msgstr "Skriv inn hvordan navnet ditt uttales for å hjelpe folk med å adressere deg riktig"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
+msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "Skriv inn navnet ditt, slik at folk du kjenner kan gjenkjenne deg"
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
-msgstr "Skriv inn pronomenene dine for å la folk vite hvordan de skal referere til deg"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
+msgstr ""
msgid "Profiles|Example: MacBook key"
msgstr ""
@@ -29174,8 +29692,8 @@ msgstr "Inkluder private bidrag på profilen min"
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "Øk kontosikkerheten din ved å skru på 2-trinnsautentisering (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
msgid "Profiles|Invalid password"
msgstr "Ugyldig passord"
@@ -29261,14 +29779,14 @@ msgstr "Fjern avatar"
msgid "Profiles|Select a service to sign in with."
msgstr ""
+msgid "Profiles|Service sign-in"
+msgstr ""
+
msgid "Profiles|Set new profile picture"
msgstr "Velg nytt profilbilde"
-msgid "Profiles|Set your local time zone"
-msgstr "Velg din lokale tidssone"
-
-msgid "Profiles|Social sign-in"
-msgstr "PÃ¥logging med sosiale medier"
+msgid "Profiles|Set your local time zone."
+msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr ""
@@ -29276,8 +29794,8 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "Fortell oss om deg selv med mindre enn 250 tegn"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr "Muligheten til å oppdatere navnet ditt har blitt skrudd av administratoren din."
@@ -29285,17 +29803,17 @@ msgstr "Muligheten til å oppdatere navnet ditt har blitt skrudd av administrato
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "Den maks tillatte filstørrelsen er 200KB."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "Denne e-postadressen vil bli vist på din offentlige profil"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Denne emojien og meldingen vil vises på profilen din og i hele grensesnittet."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Denne informasjonen vil vises på profilen din"
+msgid "Profiles|This information will appear on your profile."
+msgstr ""
msgid "Profiles|Time settings"
msgstr "Tidsinnstillinger"
@@ -29303,8 +29821,8 @@ msgstr "Tidsinnstillinger"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
-msgstr "2-trinnsautentisering"
+msgid "Profiles|Two-factor authentication"
+msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Skriv inn din %{confirmationValue} for å bekrefte:"
@@ -29339,8 +29857,8 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "Hva er statusen din?"
-msgid "Profiles|Who you represent or work for"
-msgstr "Hvem du representerer eller jobber for"
+msgid "Profiles|Who you represent or work for."
+msgstr ""
msgid "Profiles|You can change your avatar here"
msgstr "Du kan endre avataren din her"
@@ -29381,6 +29899,9 @@ msgstr "Posisjonen din ble automatisk satt, basert på din %{provider_label}-kon
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "Navnet ditt ble automatisk satt, basert på din %{provider_label}-konto, sånn at folk du kjenner kan kjenne deg igjen"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "Din status"
@@ -29459,7 +29980,7 @@ msgstr "Prosjektmaler"
msgid "Project URL"
msgstr "Prosjekt URL"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr "Vedlikeholdere"
msgid "ProjectCreationLevel|No one"
msgstr "Ingen"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Navn"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr "Skriv inn nytt passord."
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr "Sakens URL"
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr "Prosjekter bidratt til"
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Prosjekter delt med %{group_name}"
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr "Opprett"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,8 +30967,8 @@ msgstr "Kjør CI/CD for et eksternt kodelager"
msgid "ProjectsNew|Visibility Level"
msgstr "Synlighetsnivå"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "Vil du huse flere prosjekter som er avhengig av hverandre i det samme navnefeltet? %{link_start}Opprett en gruppe.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
msgid "PrometheusAlerts|exceeded"
msgstr "overskredet"
@@ -30596,6 +31126,9 @@ msgstr "Kjøp EE"
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr "Kjøp GitLab Enterprise Edition"
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr "Nullstill"
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ msgstr "Referanser"
msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
msgstr ""
-msgid "Refresh"
-msgstr "Oppdater"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr "Gjenåpner denne %{quick_action_target}."
msgid "Replace"
msgstr "Erstatt"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr "Erstatt %{name}"
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr "Svar via E-post"
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr "Klassenavn"
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr "Kjøretid"
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr "Nødvendige godkjenninger (%{approvals_given} er gitt)"
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr "Tilbakestill"
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr "Tilbakestill filtre"
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr "Tilbakestill passord"
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Prøv denne jobben på nytt"
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr "IP-adresse"
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr "Revisjon"
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr "Runner"
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr "SAML-oppdagelsessjetonger"
msgid "SAML for %{group_name}"
msgstr "SAML for %{group_name}"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr "SAST-oppsett"
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr "Beskrivelse"
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr "Endre status"
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr "Verktøy"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr "Klarte ikke å legge til %{invalidProjects}"
-
msgid "SecurityReports|Undo dismiss"
msgstr "Angre avvisning"
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr "Velg en gren"
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr "Velg kilde"
msgid "Select source branch"
msgstr "Velg kildegren"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr "Velg startdato"
@@ -34716,6 +35285,9 @@ msgstr "Velg målgren"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr "Velg tidssone"
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr "Bestem måldato"
@@ -35004,6 +35573,9 @@ msgstr "Bestem målgren"
msgid "Set target branch to %{branch_name}."
msgstr "Sett målgrenen til %{branch_name}."
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr "Sett opp nytt passord"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr "Bestem vektlegging"
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Vis tomromsendringer"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr "Viser alle eposer"
msgid "Showing all issues"
msgstr "Viser alle saker"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr "Viser den nyeste versjonen"
msgid "Showing version #%{versionNumber}"
msgstr "Viser versjon â„–%{versionNumber}"
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "Side-ved-side"
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr "Snøplog"
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr "Løsning"
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Noe gikk galt, kan ikke legge til %{project} på dashbordet"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr "Noe gikk galt, klarte ikke å slette prosjektet"
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr "Oppbevaring:"
msgid "StorageSize|Unknown"
msgstr "Ukjent"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr "Gjennomstrek"
@@ -36583,7 +37218,7 @@ msgstr "Undergruppe-milepæl"
msgid "Subgroup navigation"
msgstr "Undergruppe-navigasjon"
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr "Undergrupper"
msgid "Subgroups and projects"
msgstr "Undergrupper og prosjekter"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr "Abonnement"
@@ -36970,8 +37611,11 @@ msgstr ""
msgid "Summary"
msgstr "Sammendrag"
-msgid "Summary / Note"
-msgstr "Oppsummering / Notat"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
+msgstr ""
msgid "Sunday"
msgstr "Søndag"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr "Støtte"
@@ -37152,6 +37799,21 @@ msgstr "Støtteside-URL"
msgid "Survey Response"
msgstr "Undersøkelsessvar"
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr "Systemstandard (%{default})"
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr "Oppgave"
msgid "Task ID: %{elastic_task}"
msgstr "Oppgave-ID: %{elastic_task}"
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr "%{rate}%{sign} suksessprosent"
msgid "TestReports|Attachment"
msgstr "Vedlegg"
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr "Det var det, bra jobbet!"
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr "Domenet du skrev inn er ikke tillatt."
msgid "The download link will expire in 24 hours."
msgstr "Nedlastingslenken vil utløpe om 24 timer."
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "Den maks tillatte filstørrelsen er %{size}."
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr "Prosjektet er tilgjengelig for alle brukere som er pålogget."
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr "Prosjektet er tilgjengelig for alle, uavhengig av autentisering."
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr "Prosjektet blir fortsatt slettet. Prøv igjen senere."
@@ -38460,6 +39119,9 @@ msgstr "Det er ingen pakker ennå"
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr "En feil oppstod under innhenting av grener."
@@ -39129,9 +39797,6 @@ msgstr "Denne jobben krever en manuell handling"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,8 +39914,8 @@ msgstr "Dette prosjektet vil bli slettet den %{date}"
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."
-msgstr "Prosjektet vil leve i gruppen din %{strong_open}%{namespace}%{strong_close}. Et prosjekt er der du huser filene dine (kodelager), planlegger arbeidet ditt (saker), publiserer dokumentasjonen (wiki) og så mye mer."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
+msgstr ""
msgid "This repository"
msgstr "Dette kodelageret"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr "Denne innstillingen kan overstyres i hvert prosjekt."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr "Tid"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr "Tid brukt"
-
msgid "Time based: Yes"
msgstr "Tidsbasert: Ja"
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr "Ansl."
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Anslått:"
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr "For å aktivere kontoen din på nytt, logg på GitLab på %{gitlab_url}."
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr "For å oppklare dette, forsøk å:"
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "Veksle sidelinje"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr "GÃ¥ tilbake"
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr "1000+"
-msgid "Tracing"
-msgstr "Sporing"
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr "Antall ansatte"
msgid "Trial|Please select a country"
msgstr "Vennligst velg et land"
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr "Telefonnummer"
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr "Betrodd"
@@ -40327,6 +40992,9 @@ msgstr "2-trinnsautentisering"
msgid "Two-factor authentication disabled"
msgstr "2-trinnautentisering er skrudd av"
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr "2-trinnautentisering har blitt skrudd av for denne brukeren"
@@ -40417,9 +41085,6 @@ msgstr "Klarte ikke å samle inn CPU-info"
msgid "Unable to collect memory info"
msgstr "Klarte ikke å samle inn minneinfo"
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr "Klarte ikke å koble til Prometheus-tjeneren"
@@ -40429,9 +41094,6 @@ msgstr "Klarte ikke å koble til tjeneren: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr "Klarte ikke å innhente sårbare prosjekter"
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr "Klarte ikke å laste inn forskjellen. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr "Klarte ikke å lagre iterasjonen. Vennligst prøv igjen"
@@ -40516,8 +41178,8 @@ msgstr ""
msgid "Unarchive project"
msgstr "Opphev arkivering av prosjekt"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "Å fjerne arkivering av prosjektet vil gjenopprette dens medlemmers evne til å gjøre endringer i det. Datalageret kan bli kodeinnsmettet til, og saker, kommentarer og andre enheter kan opprettes. %{strong_start}Når dette prosjektet er aktivt, vises det i søket og på kontrollpanelet.%{strong_end} %{link_start}Lær mer.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr ""
msgid "Unassign from commenting user"
msgstr ""
@@ -40570,9 +41232,6 @@ msgstr "Ukjent"
msgid "Unknown Error"
msgstr "Ukjent feil"
-msgid "Unknown cache key"
-msgstr "Ukjent hurtigbuffernøkkel"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr "LÃ¥ste opp diskusjonen."
msgid "Unlocks the discussion."
msgstr "LÃ¥ser opp diskusjonen."
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr "Utilgjengelig"
@@ -40825,11 +41478,8 @@ msgstr ""
msgid "Upload object map"
msgstr "Last opp objektkart"
-msgid "UploadLink|click to upload"
-msgstr "klikk for å laste opp"
-
-msgid "Uploaded"
-msgstr "Lastet opp"
+msgid "Uploaded date"
+msgstr ""
msgid "Uploading changes to terminal"
msgstr "Laster opp endringer til terminalen"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Kjøp ekstra minutter"
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "Lagring"
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr "Brukere i lisensen"
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr "Vis dokumentasjon"
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr "Vis dokumentasjon"
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "Vis kvalifiserte godkjennere"
@@ -42549,7 +43199,7 @@ msgstr "Vi prøvde å fornye abonnementet ditt automatisk for %{strong}%{namespa
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr "Vil bli kartlagt til"
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "Du kan bare redigere filer når du er på en gren"
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Du kan ikke få tilgang til denne råfilen. Vennligst vent et minutt."
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr "Du må laste opp en fil med det samme filnavnet når du slipper inn i et eksisterende design."
-
msgid "You need a different license to enable FileLocks feature"
msgstr "Du trenger en annen lisens for å aktivere FileLocks-funksjonen"
@@ -43935,18 +44602,36 @@ msgstr "Du har ikke tillatelse til å gjøre endringer i dette prosjektet direkt
msgid "You're receiving this email because of your account on %{host}."
msgstr "Du mottar denne e-posten på grunn av kontoen din på %{host}."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Du mottar denne e-posten på grunn av kontoen din på %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "Du mottar denne E-posten fordi du har blitt nevnt i %{host}."
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "Du har allerede aktivert 2-trinnsautentisering ved hjelp av éngangspassord-autentikatorer. For å kunne registrere en annen enhet, må du først deaktivere 2-trinnsautentisering."
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr "Din nye kommentar"
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr "Din profil"
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "Prosjektgrensen din er %{limit} prosjekter! Kontakt administratoren din for å øke den"
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "en slettet bruker"
@@ -44388,6 +45070,9 @@ msgstr "alarm"
msgid "allowed to fail"
msgstr "tillatt å mislykkes"
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr "brukes allerede for en annen gruppe eller prosjekt %{timebox_name}."
@@ -44429,6 +45114,12 @@ msgstr "tildel deg selv"
msgid "at"
msgstr "kl."
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr "i faresonen"
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr "%{reportType}: Innlasting førte til en feil"
msgid "ciReport|%{sameNum} same"
msgstr "%{sameNum} samme"
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr "Alle prosjekter"
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr "lukket"
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr "lukket saksrapport"
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr "standardgren"
msgid "deleted"
msgstr "slettet"
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr "distribuering"
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr "følger"
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "for %{link_to_merge_request} med %{link_to_merge_request_source_branch}"
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr "grupper"
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr "Godkjennelse er valgfritt"
msgid "mrWidget|Approval password is invalid."
msgstr "Godkjennelsespassordet er ugyldig."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Godkjenn"
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr "Flett"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr "Mer informasjon"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr "%{item}, og %{lastItem}"
msgid "on track"
msgstr "på sporet"
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "overkategori"
msgstr[1] "overkategorier"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "passord"
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] "punkt"
@@ -46037,6 +46766,9 @@ msgstr "Ukjent"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "yaml er ugyldig"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr "innstillingene dine"
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index 19c223f8165..93619c9eaaf 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d laag"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Toegangstokens"
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Account"
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/or_IN/gitlab.po b/locale/or_IN/gitlab.po
index 8c399d285e7..cf45265727c 100644
--- a/locale/or_IN/gitlab.po
+++ b/locale/or_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: or\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index d4150c420f4..e5fd64e0c34 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index bb1a18534a5..72b70d4e745 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:23\n"
+"PO-Revision-Date: 2022-07-14 17:08\n"
msgid " %{start} to %{end}"
msgstr " %{start} do %{end}"
@@ -374,6 +374,13 @@ 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 job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d warstwa"
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekunda"
@@ -486,6 +500,13 @@ msgstr[1] "%d sekundy"
msgstr[2] "%d sekund"
msgstr[3] "%d sekundy"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -865,9 +886,15 @@ msgstr "%{labelStart}Klasa:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Adres awarii:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Stan awarii:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Dowód:%{labelEnd} %{evidence}"
@@ -1086,9 +1113,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr "%{seconds}s"
@@ -1190,6 +1214,9 @@ msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} Wydanie"
@@ -1231,6 +1258,9 @@ msgstr "%{timebox_type} nie obsługuje wykresów wypalania (burnup)"
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} musi mieć datę rozpoczęcia i zakończenia"
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1527,6 +1557,13 @@ msgstr ""
msgid "0 bytes"
msgstr "0 bajtów"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1784,6 +1821,9 @@ msgstr "Strona Jekyll, która używa Netlify dla CI/CD zamiast GitLab, ale nadal
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Nie można uzyskać certyfikatu Let's Encrypt SSL, dopóki domena nie zostanie zweryfikowana."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "Podstawowa strona i funkcja serverless wykorzystujÄ…ca AWS Lambda, AWS API Gateway i GitLab Pages"
@@ -2072,6 +2112,9 @@ msgstr "Akceptowalne do użycia w tym projekcie"
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Tokeny dostępu"
@@ -2189,6 +2232,12 @@ msgstr "Nowy"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "Skanowanie dostępności znalazło błąd następującego typu: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Konto"
@@ -2279,9 +2328,6 @@ msgstr "Dodaj CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Dodaj CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Dodaj adres URL Jaegera"
-
msgid "Add Kubernetes cluster"
msgstr "Dodaj klaster Kubernetes"
@@ -2312,9 +2358,6 @@ msgstr "Dodaj klucz GPG"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 "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 Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2342,9 +2385,6 @@ msgstr "Dodaj ogólny komentarz do tego %{noteableDisplayName}."
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 new issue"
msgstr "Dodaj nowe zgłoszenie"
@@ -2594,9 +2634,6 @@ 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 "W Twojej instancji GitLaba wyłączono dodawanie nowych aplikacji. Aby uzyskać pozwolenie, skontaktuj się z administratorem swojego GitLaba"
-msgid "Additional Metadata"
-msgstr "Dodatkowe metadane"
-
msgid "Additional minutes"
msgstr "Dodatkowe minuty"
@@ -2846,6 +2883,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Automatyczna domena DevOps"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2918,6 +2958,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr "Token kanału informacyjnego"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3143,7 +3186,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3152,6 +3195,9 @@ msgstr "Dostęp"
msgid "AdminUsers|Access Git repositories"
msgstr "Dostęp do repozytoriów Gita"
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr "Dostęp do API"
@@ -3194,6 +3240,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3221,6 +3270,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3296,6 +3348,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3323,6 +3381,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3341,6 +3402,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr "Odrzuceni użytkownicy:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Przywróć dostęp użytkownika do konta, w tym strony internetowej, Git i API."
@@ -3353,9 +3417,15 @@ msgstr "Wyszukaj użytkowników"
msgid "AdminUsers|Send email to users"
msgstr "Wyślij e-mail do użytkowników"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "Sortuj według"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3404,9 +3474,6 @@ msgstr "Usunąć użytkownika %{username}?"
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr "Użytkownik nie będzie miał dostępu do repozytoriów git"
@@ -3425,6 +3492,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr "Wyświetl oczekujące prośby o członkostwo"
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr "Co mogę zrobić?"
@@ -3491,6 +3561,9 @@ msgstr ""
msgid "Administration"
msgstr "Administracja"
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3971,6 +4044,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3983,12 +4059,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4031,9 +4101,6 @@ 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 subgroups to set up their own two-factor authentication rules"
-msgstr "Zezwalaj podgrupom na ustawianie własnych reguł uwierzytelniania dwuskładnikowego"
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4046,9 +4113,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
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 "Pozwól użytkownikom prosić o dostęp (jeśli widoczność jest publiczna lub wewnętrzna)"
-
msgid "Allowed"
msgstr "Dozwolone"
@@ -4061,12 +4125,18 @@ msgstr "Ograniczenia domeny e-mail są dozwolone tylko dla grup najwyższego poz
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr "Pozwala projektom lub podgrupom tej grupy na nadpisanie ustawienia globalnego."
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Pozwala Tobie dodawać i zarządzać klastrami Kubernetes."
@@ -4226,6 +4296,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4445,6 +4518,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr "Wystąpił błąd podczas pobierania projektów."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4455,6 +4531,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Wystąpił błąd podczas subskrybowania powiadomień."
@@ -4662,6 +4741,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "Ustawienia aplikacji zapisane pomyślnie"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "Aktualizacja ustawień aplikacji nie powiodła się"
@@ -5062,7 +5144,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5168,6 +5250,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5186,6 +5271,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5303,6 +5391,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5400,9 +5491,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5476,6 +5564,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5500,6 +5591,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5509,6 +5603,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5524,6 +5624,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6016,9 +6119,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6421,6 +6521,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6721,6 +6827,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7042,6 +7151,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7138,6 +7250,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7181,6 +7296,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7508,6 +7626,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7679,9 +7800,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7933,6 +8051,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8050,6 +8171,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8426,6 +8550,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8444,6 +8571,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8453,9 +8697,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8823,9 +9064,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8865,6 +9103,9 @@ 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."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8910,9 +9151,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9090,10 +9328,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9270,6 +9520,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9661,6 +9914,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9697,10 +9953,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9892,9 +10148,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10120,9 +10373,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10858,6 +11111,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11552,6 +11808,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11585,6 +11844,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11633,13 +11901,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11771,6 +12039,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11981,6 +12252,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12186,12 +12460,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12204,9 +12472,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12300,9 +12568,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12348,6 +12613,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12459,6 +12727,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12600,13 +12895,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13235,6 +13518,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13716,9 +14002,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13935,10 +14218,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13968,9 +14251,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14121,9 +14401,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14262,9 +14539,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14280,6 +14554,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14463,9 +14737,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14586,9 +14857,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14688,12 +14956,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14730,9 +14992,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14742,9 +15001,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14754,12 +15010,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14769,10 +15019,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14781,18 +15028,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14808,13 +15049,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14949,6 +15187,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15580,7 +15827,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15766,6 +16016,13 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr ""
@@ -16449,7 +16706,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16458,6 +16718,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16659,7 +16919,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16901,9 +17161,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17213,9 +17464,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17459,6 +17704,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17576,9 +17860,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17675,6 +17956,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17780,9 +18064,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17798,6 +18088,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,16 +18112,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18104,6 +18403,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18257,6 +18559,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18266,7 +18571,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18533,18 +18838,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18575,25 +18877,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18602,37 +18904,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,9 +18958,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18674,7 +18988,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18806,9 +19120,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19296,10 +19607,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19473,15 +19781,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20760,9 +21149,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21013,6 +21405,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21154,6 +21555,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21166,15 +21570,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21217,9 +21612,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21388,6 +21780,13 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21499,6 +21898,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21682,15 +22084,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22048,9 +22441,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22411,12 +22816,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22672,6 +23089,13 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr ""
@@ -22898,9 +23322,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22916,9 +23337,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22979,19 +23397,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23036,22 +23454,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23078,9 +23502,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23678,9 +24096,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23690,9 +24105,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24418,12 +24836,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24589,7 +25013,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25446,6 +25882,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25470,9 +25909,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25561,10 +25997,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25573,10 +26009,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25733,16 +26169,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25838,9 +26271,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25895,6 +26325,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25925,6 +26358,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26042,6 +26475,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26461,21 +26903,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26975,6 +27468,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26999,7 +27495,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,22 +27504,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27059,10 +27558,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27158,6 +27657,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27176,6 +27678,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27482,6 +27987,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27642,6 +28153,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27681,9 +28195,6 @@ 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 ""
@@ -27774,18 +28285,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28833,6 +29368,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29040,12 +29578,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29121,13 +29653,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29169,9 +29704,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29436,7 +29965,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,7 +29992,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29478,6 +30007,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29505,7 +30037,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29514,16 +30046,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,7 +30088,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29643,13 +30175,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29658,7 +30190,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29667,16 +30199,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29685,7 +30217,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29721,7 +30253,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29763,6 +30295,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29841,7 +30376,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29964,6 +30499,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30759,7 +31303,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30819,7 +31363,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31710,9 +32266,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31877,6 +32430,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32270,9 +32826,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32300,6 +32853,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33304,6 +33860,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34355,7 +34938,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,6 +34983,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35021,6 +35595,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35135,6 +35715,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35156,6 +35739,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35444,6 +36027,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35772,6 +36361,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Coś poszło nie tak, nie można dodać %{project} do pulpitu nawigacyjnego"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37006,6 +37652,9 @@ msgstr "Magazyn:"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37027,7 +37676,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37045,6 +37694,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr "Podgrupy i projekty"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,6 +37760,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37414,7 +38069,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37598,6 +38259,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38312,9 +38994,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr "Harmonogram potoków uruchamia procesy w przyszłości, wielokrotnie, dl
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38924,6 +39597,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr "Nie ma jeszcze projektów udostępnionych w tej grupie"
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39833,9 +40509,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39887,6 +40560,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40477,9 +41165,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40795,6 +41474,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40885,9 +41567,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40897,9 +41576,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40942,6 +41615,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41038,9 +41714,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41092,12 +41765,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41293,10 +41960,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42356,9 +43026,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,10 +44357,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44417,18 +45100,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44708,6 +45397,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44876,6 +45574,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45589,6 +46305,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45965,6 +46697,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46072,6 +46810,9 @@ msgstr[3] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46569,6 +47316,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46792,6 +47542,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index 6eaecb3637f..3e6cf2babe1 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 19:57\n"
msgid " %{start} to %{end}"
msgstr " %{start} até %{end}"
@@ -47,7 +47,7 @@ msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr " ou %{emphasisStart}!merge id solicitado%{emphasisEnd}"
msgid " or %{emphasisStart}#id%{emphasisEnd}"
-msgstr ""
+msgstr " ou %{emphasisStart}#id%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr " ou %{emphasisStart}#id da issue%{emphasisEnd}"
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d tarefa importada com sucesso com a etiqueta"
msgstr[1] "%d tarefas importadas com sucesso com a etiqueta"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] "%d tarefa"
+msgstr[1] "%d tarefas"
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d camada"
@@ -363,15 +368,25 @@ msgid_plural "%d remaining"
msgstr[0] "%d restantes"
msgstr[1] "%d restantes"
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d segundo"
msgstr[1] "%d segundos"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] "%d estágio"
+msgstr[1] "%d estágios"
+
msgid "%d star"
msgid_plural "%d stars"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d marcador"
+msgstr[1] "%d marcadores"
msgid "%d tag"
msgid_plural "%d tags"
@@ -526,8 +541,8 @@ msgstr "%{count} aprovações de %{name}"
msgid "%{count} contact"
msgid_plural "%{count} contacts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} contato"
+msgstr[1] "%{count} contatos"
msgid "%{count} files touched"
msgstr "%{count} arquivos modificados"
@@ -703,9 +718,15 @@ msgstr "%{labelStart}Classe:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Endereço da falha:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Estado da falha:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr "%{labelStart}Tipo da falha:%{labelEnd} %{crash_type}"
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Evidência:%{labelEnd} %{evidence}"
@@ -920,9 +941,6 @@ msgstr "%{runner} criou %{timeago}"
msgid "%{scope} results for term '%{term}'"
msgstr "%{scope} resultados para o termo '%{term}'"
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr "%{seconds}s"
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr "%{strong_start}%{human_size}%{strong_end} Armazenamento do projeto"
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr "%{timebox_type} não suporta o gráfico de burnup"
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} deve ter uma data de início e de vencimento"
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1297,7 +1321,7 @@ msgid "- Not available to run jobs."
msgstr "- Não disponível para executar tarefas."
msgid "- Push code to the repository."
-msgstr ""
+msgstr "- Envie o código para o repositório."
msgid "- Select -"
msgstr "- Selecionar -"
@@ -1331,6 +1355,11 @@ msgstr "/dia"
msgid "0 bytes"
msgstr "0 bytes"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 dia"
@@ -1542,6 +1571,9 @@ msgstr "Um site do Jekyll que usa Netlify para CI/CD em vez do Gitlab, mas ainda
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Um certificado SSL Let's Encrypt não pode ser obtido até que seu domínio seja verificado."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "Uma página básica e função serverless que usa AWS Lambda, o AWS API Gateway e GitLab Pages"
@@ -1612,7 +1644,7 @@ msgid "A new personal access token, named %{token_name}, has been created."
msgstr ""
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
-msgstr ""
+msgstr "Um épico não confidencial não pode ser atribuído a um épico pai confidencial"
msgid "A page with that title already exists"
msgstr "Já existe uma página com este nome."
@@ -1830,6 +1862,9 @@ msgstr "Aceitável para uso neste projeto"
msgid "Access Git repositories or the API."
msgstr "Acessar repositórios Git ou a API."
+msgid "Access Token"
+msgstr "Código de acesso"
+
msgid "Access Tokens"
msgstr "Tokens de acesso"
@@ -1879,13 +1914,13 @@ msgid "AccessTokens|Are you sure? Any issue email addresses currently in use wil
msgstr "Tem certeza? Todos os endereços de e-mail de issue atualmente em uso deixarão de funcionar."
msgid "AccessTokens|Copy feed token"
-msgstr ""
+msgstr "Copiar token de feed"
msgid "AccessTokens|Copy incoming email token"
msgstr "Copiar token de e-mail recebido"
msgid "AccessTokens|Copy static object token"
-msgstr ""
+msgstr "Copiar token de objeto estático"
msgid "AccessTokens|Created"
msgstr "Criado"
@@ -1915,7 +1950,7 @@ msgid "AccessTokens|Static object token"
msgstr "Token de objeto estático"
msgid "AccessTokens|The last time a token was used"
-msgstr ""
+msgstr "A última vez que um token foi usado"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Eles são a única senha aceita quando você tem a autenticação de dois fatores (2FA) ativada."
@@ -1947,6 +1982,12 @@ msgstr "Novo"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "A verificação de acessibilidade encontrou um erro do seguinte tipo: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Conta"
@@ -2005,7 +2046,7 @@ msgid "Active"
msgstr "Ativo"
msgid "Active %{accessTokenTypePlural} (%{totalAccessTokens})"
-msgstr ""
+msgstr "Ativo %{accessTokenTypePlural} (%{totalAccessTokens})"
msgid "Active %{type} (%{token_length})"
msgstr "Ativo %{type} (%{token_length})"
@@ -2037,9 +2078,6 @@ msgstr "Adicionar CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Adicionar CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Adicionar URL Jaeger"
-
msgid "Add Kubernetes cluster"
msgstr "Adicionar cluster Kubernetes"
@@ -2070,9 +2108,6 @@ msgstr "Adicionar chave GPG"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr "Adicionar uma chave GPG para acesso seguro ao GitLab. %{help_link_start}Saiba mais.%{help_link_end}"
-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 "Adicione uma URL Jaeger para substituir esta página com um link para seu servidor Jaeger. Você precisa primeiro %{link_start_tag}instalar Jaeger%{link_end_tag}"
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr "Adicione um contrato de termos de serviço e política de privacidade para usuários desta instância do GitLab."
@@ -2089,7 +2124,7 @@ msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
msgid "Add a confidential internal note to this %{noteableDisplayName}."
-msgstr ""
+msgstr "Adicione uma nota interna confidencial a este %{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 ""
@@ -2100,9 +2135,6 @@ msgstr "Adicionar um comentário geral para este %{noteableDisplayName}."
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 "Adicionar regra horizontal"
-
msgid "Add a new issue"
msgstr "Adicionar uma nova issue"
@@ -2233,7 +2265,7 @@ msgid "Add or subtract spent time"
msgstr "Adicionar ou subtrair tempo gasto"
msgid "Add people"
-msgstr ""
+msgstr "Adicionar pessoas"
msgid "Add previously merged commits"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr "Adicionado nesta versão"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "A adição de novos aplicativos está desativada na sua instância do GitLab. Entre em contato com seu administrador do GitLab para obter a permissão"
-msgid "Additional Metadata"
-msgstr "Metadados adicionais"
-
msgid "Additional minutes"
msgstr "Minutos adicionais"
@@ -2575,7 +2604,7 @@ msgid "AdminLabels|Define your default set of project labels"
msgstr ""
msgid "AdminLabels|Labels created here will be automatically added to new projects."
-msgstr ""
+msgstr "Os rótulos criados aqui serão adicionados automaticamente aos novos projetos."
msgid "AdminLabels|They can be used to categorize issues and merge requests."
msgstr ""
@@ -2590,7 +2619,7 @@ msgid "AdminProjects|Delete Project %{projectName}?"
msgstr "Excluir o projeto %{projectName}?"
msgid "AdminSettings|%{strongStart}WARNING:%{strongEnd} Environment variable %{environment_variable} does not exist or is not pointing to a valid directory. %{icon_link}"
-msgstr ""
+msgstr "%{strongStart}AVISO:%{strongEnd} A variável de ambiente %{environment_variable} não existe ou não está apontando para um diretório válido. %{icon_link}"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "Uma conta do Let's Encrypt será configurada parra essa instância do GitLab usando esse endereço de e-mail. Você receberá e-mails para avisar sobre a expiração do certificado. %{link_start}Saiba mais.%{link_end}"
@@ -2604,6 +2633,9 @@ msgstr "Todos os novos projetos podem usar os executores compartilhados da instÃ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domínio de Auto DevOps"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr "Banir automaticamente usuários que baixam mais do que um número especificado de repositórios em um determinado momento."
+
msgid "AdminSettings|CI/CD limits"
msgstr "Limites de CI/CD"
@@ -2611,7 +2643,7 @@ msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Configurar Let's Encrypt"
msgid "AdminSettings|Configure when inactive projects should be automatically deleted. %{linkStart}What are inactive projects?%{linkEnd}"
-msgstr ""
+msgstr "Configurar quando projetos inativos devem ser excluídos automaticamente. %{linkStart}O que são projetos inativos?%{linkEnd}"
msgid "AdminSettings|Delete inactive projects"
msgstr "Excluir projetos Inativos"
@@ -2650,7 +2682,7 @@ msgid "AdminSettings|Enable Service Ping"
msgstr "Ativar ping de serviço"
msgid "AdminSettings|Enable a Prometheus endpoint that exposes health and performance statistics. The Health Check menu item appears in the Monitoring section of the Admin Area. Restart required. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Ativar um endpoint do Prometheus que exponha estatísticas de integridade e desempenho. O item de menu Verificação de integridade aparece na seção Monitoramento da Ãrea de administração. É necessário reiniciar. %{link_start}Saiba mais.%{link_end}"
msgid "AdminSettings|Enable kuromoji custom analyzer: Indexing"
msgstr "Ativar analisador personalizado de kuromoji: indexação"
@@ -2676,6 +2708,9 @@ msgstr "Ativado"
msgid "AdminSettings|Feed token"
msgstr "Token de feed"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr "Limite de taxa de abuso do Git"
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "Li e concordo com os termos de serviço%{link_end} %{link_start}(PDF) de Let's Encrypt."
@@ -2761,7 +2796,7 @@ msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuração de pipeline necessária"
msgid "AdminSettings|Requires %{linkStart}email notifications%{linkEnd}"
-msgstr ""
+msgstr "Requer %{linkStart}notificações por e-mail%{linkEnd}"
msgid "AdminSettings|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
msgstr "Restringir o acesso ao grupo por endereço IP. %{link_start}Saiba mais%{link_end}."
@@ -2782,7 +2817,7 @@ msgid "AdminSettings|Select to disable public access for Pages sites, which requ
msgstr "Selecione para desativar o acesso público aos sites Pages, o que exige que os usuários façam login para acessar os sites Pages em sua instância. %{link_start}Saiba mais.%{link_end}"
msgid "AdminSettings|Send email to maintainers after project is inactive for"
-msgstr ""
+msgstr "Enviar e-mail aos mantenedores após o projeto estar inativo por"
msgid "AdminSettings|Send warning email"
msgstr "Enviar e-mail de aviso"
@@ -2901,8 +2936,8 @@ msgstr "A2F desativada"
msgid "AdminUsers|2FA Enabled"
msgstr "A2F ativada"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "Um usuário pode validar a si mesmo inserindo um cartão de crédito/débito, ou um administrador pode validar manualmente um usuário."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr ""
msgid "AdminUsers|Access"
msgstr "Acesso"
@@ -2910,6 +2945,9 @@ msgstr "Acesso"
msgid "AdminUsers|Access Git repositories"
msgstr "Acesso a repositórios do Git"
+msgid "AdminUsers|Access level"
+msgstr "Nível de acesso"
+
msgid "AdminUsers|Access the API"
msgstr "Acesse a API"
@@ -2952,6 +2990,9 @@ msgstr "Auditores têm acesso somente leitura a todos os grupos, projetos e usuÃ
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "Marcados automaticamente como usuários internos predefinidos"
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr "Banir usuário"
@@ -2979,6 +3020,9 @@ msgstr "Bloqueado"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Bloquear o usuário tem os seguintes efeitos:"
+msgid "AdminUsers|Can create group"
+msgstr "Pode criar grupo"
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "Não é possível entrar ou acessar informações da instância"
@@ -3054,6 +3098,12 @@ msgstr "É você!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr "Saiba mais sobre %{link_start}usuários banidos.%{link_end}"
+msgid "AdminUsers|Limits"
+msgstr "Límites"
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr "Bloqueado"
@@ -3081,6 +3131,9 @@ msgstr "Projetos pessoais serão excluídos"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Projetos pessoais, histórico de usuários e de grupos permanecerão intactos"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr "Cota de CI/CD minutos"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Reativar um usuário irá:"
@@ -3099,6 +3152,9 @@ msgstr "Rejeitar usuário %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "Usuários rejeitados:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Restaurar o acesso do usuário para a conta, incluindo a web, o Git e a API."
@@ -3111,9 +3167,15 @@ msgstr "Procurar usuários"
msgid "AdminUsers|Send email to users"
msgstr "Enviar e-mail para usuários"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "Ordenar por"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr "O usuário não pode acessar os repositórios git."
@@ -3162,9 +3224,6 @@ msgstr "Desbloquear usuário %{username}?"
msgid "AdminUsers|User administration"
msgstr "Administração de usuários"
-msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr "Usuário é validado e pode usar minutos de CI gratuitos em executores compartilhados."
-
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Usuário não será capaz de acessar repositórios do git"
@@ -3183,6 +3242,9 @@ msgstr "Validar conta do usuário"
msgid "AdminUsers|View pending member requests"
msgstr "Ver solicitações de membros pendentes"
+msgid "AdminUsers|Website URL"
+msgstr "URL do site"
+
msgid "AdminUsers|What can I do?"
msgstr "O que posso fazer?"
@@ -3249,6 +3311,9 @@ msgstr "limite de usuários"
msgid "Administration"
msgstr "Administração"
+msgid "Administrators"
+msgstr "Administradores"
+
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 "Usuários adicionais devem ser revisados e aprovados por um administrador do sistema. Saiba mais sobre %{help_link_start}limites de uso%{help_link_end}."
@@ -3729,6 +3794,9 @@ msgstr "Todas ramificações protegidas"
msgid "All threads resolved!"
msgstr "Todos tópicos resolvidos!"
+msgid "All users in this group must set up two-factor authentication"
+msgstr "Todos os usuários neste grupo devem configurar a autenticação de dois fatores"
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr "Todos os usuários devem aceitar os termos de serviço e a política de privacidade para acessar o GitLab"
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Permitir que \"%{group_name}\" adicione você"
-msgid "Allow access only to members of this group"
-msgstr "Permitir acesso apenas a membros deste grupo"
-
-msgid "Allow access to everyone"
-msgstr "Permitir acesso a todos"
-
msgid "Allow access to members of the following group"
msgstr "Permitir o acesoaos membros do seguinte grupo"
@@ -3789,9 +3851,6 @@ msgstr "Permitir que projetos dentro deste grupo usem o Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr "Permitir o acesso público a pipelines e detalhes de tarefas, incluindo logs de saída e artefatos."
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "Permitir que subgrupos configurem suas próprias regras de autenticação de dois fatores"
-
msgid "Allow this key to push to this repository"
msgstr "Permitir que esta chave faça push para este repositório"
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Permitir que os usuários registrem qualquer aplicativo para usar o GitLab como um provedor OAuth"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "Permitir que os usuários requisitar acesso (se a visibilidade for pública ou interna)"
-
msgid "Allowed"
msgstr "Permitido"
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr "Permitido de criar:"
+msgid "Allowed to delete projects"
+msgstr "Permitido excluir projetos"
+
msgid "Allowed to fail"
msgstr "Permitido falhar"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Permite adicionar e gerenciar clusters do Kubernetes."
@@ -3883,7 +3945,7 @@ msgid "An alert has been resolved in %{project_path}."
msgstr ""
msgid "An alert has been triggered in %{project_path}."
-msgstr ""
+msgstr "Um alerta foi disparando em %{project_path}."
msgid "An application called %{link_to_client} is requesting access to your GitLab account."
msgstr "Um aplicativo chamado %{link_to_client} está solicitando acesso à sua conta do GitLab."
@@ -3984,6 +4046,9 @@ msgstr "Um erro ocorreu ao obter a pré-visualização em Markdown"
msgid "An error occurred while fetching ancestors"
msgstr "Ocorreu um erro ao obter antepassados"
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "Ocorreu um erro ao obter as ramificações. Tente novamente a pesquisa."
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr "Ocorreu um erro ao recuperar projetos."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr "Ocorreu um erro ao salvar as alterações: %{error}"
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] "Ocorreu um erro ao salvar a configuração"
msgstr[1] "Ocorreu um erro ao salvar as configurações"
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Ocorreu um erro ao inscrever às notificações."
@@ -4281,7 +4352,7 @@ msgid "An incident has been resolved in %{project_path}."
msgstr ""
msgid "An incident has been triggered in %{project_path}."
-msgstr ""
+msgstr "Um incidente foi disparado em %{project_path}."
msgid "An integer value is required for seconds"
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "As configurações do aplicativo foram salvas com sucesso"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "Falha na atualização de configurações da aplicação"
@@ -4575,7 +4649,7 @@ msgid "Apply template"
msgstr "Aplicar modelo"
msgid "Apply this approval rule to all branches or a specific protected branch."
-msgstr ""
+msgstr "Aplique esta regra de aprovação a todas as branches ou a uma branch protegida específica."
msgid "Applying"
msgstr "Aplicando"
@@ -4652,7 +4726,7 @@ msgid "ApprovalRule|Dismissed"
msgstr "Dispensado"
msgid "ApprovalRule|Examples: QA, Security."
-msgstr ""
+msgstr "Exemplos: QA, Segurança."
msgid "ApprovalRule|Improve your organization's code review with required approvals."
msgstr ""
@@ -4804,8 +4878,8 @@ msgstr "Projeto arquivado! Repositório e outros recursos de projeto são soment
msgid "Archived projects"
msgstr "Projetos arquivados"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "Arquivar o projeto fará com que ele seja apenas para leitura. Estará oculto do painel e não aparece nas pesquisas. %{strong_start}O repositório não pode ter novos commits, e nenhuma issues, comentário ou outras entidades que possam ser criadas.%{strong_end} %{link_start}Saiba mais.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr "O arquivamento do projeto a torna totalmente somente leitura. Ele fica oculto no painel e não é exibido nas pesquisas. %{strong_start}O repositório não pode ser comprometido e nenhum problema, comentário ou outras entidades podem ser criados.%{strong_end} %{link_start}Saiba mais.%{link_end}"
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr ""
@@ -4908,6 +4982,9 @@ msgstr "Você tem certeza que quer remover %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Você tem certeza que quer remover %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Você deseja mesmo remover o anexo?"
@@ -4926,6 +5003,9 @@ msgstr "Tem certeza que deseja remover esta lista?"
msgid "Are you sure you want to remove this nickname?"
msgstr "Tem a certeza que deseja remover esse apelido?"
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Você tem certeza que quer reiniciar o token de status de saúde?"
@@ -4936,7 +5016,7 @@ msgid "Are you sure you want to retry this migration?"
msgstr "Tem certeza de que deseja repetir esta migração?"
msgid "Are you sure you want to revoke this %{accessTokenType}? This action cannot be undone."
-msgstr ""
+msgstr "Tem certeza de que deseja revogar este %{accessTokenType}? Essa ação não pode ser desfeita."
msgid "Are you sure you want to revoke this %{type}? This action cannot be undone."
msgstr "Tem certeza de que deseja revogar este %{type}? Essa ação não pode ser desfeita."
@@ -5043,6 +5123,9 @@ msgstr "Atribuir etiquetas"
msgid "Assign milestone"
msgstr "Atribuir marco"
+msgid "Assign myself"
+msgstr "Atribuir a mim"
+
msgid "Assign reviewer"
msgstr "Atribuir revisor"
@@ -5092,7 +5175,7 @@ msgid "Assigned to you"
msgstr "Atribuídos a você"
msgid "Assigned user(s). Your attention request was removed."
-msgstr ""
+msgstr "Usuário(s) atribuído(s). Sua solicitação de atenção foi removida."
msgid "Assignee"
msgid_plural "%d Assignees"
@@ -5138,9 +5221,6 @@ msgstr "Em risco"
msgid "Attach a file"
msgstr "Anexar um arquivo"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Para anexar arquivo, arraste e solte ou %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr "Anexando arquivo - %{progress}"
@@ -5212,6 +5292,9 @@ msgstr "Este mês"
msgid "AuditLogs|User Events"
msgstr "Eventos do Usuário"
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr "Ativo"
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr "Cancelar edição"
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr "Excluir %{link}"
@@ -5245,6 +5331,12 @@ msgstr "URL de destino"
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr "Cabeçalho"
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr "Valor"
+
msgid "Aug"
msgstr "Ago"
@@ -5540,25 +5635,25 @@ msgid "Background color"
msgstr "Cor do plano de fundo"
msgid "BackgroundMigrations|Background Migrations"
-msgstr ""
+msgstr "Migrações em segundo plano"
msgid "BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Migrações em segundo plano são usadas para realizar migrações de dados sempre que uma migração excede os limites de tempo em nossas diretrizes. %{linkStart}Saiba mais%{linkEnd}"
msgid "BackgroundMigrations|Batch size"
-msgstr ""
+msgstr "Tamanho do lote"
msgid "BackgroundMigrations|Database"
msgstr "Banco de dados"
msgid "BackgroundMigrations|Failed jobs:"
-msgstr ""
+msgstr "Tarefas com falha:"
msgid "BackgroundMigrations|Finished at"
-msgstr ""
+msgstr "Concluído em"
msgid "BackgroundMigrations|Started at"
-msgstr ""
+msgstr "|Iniciado em"
msgid "Badges"
msgstr "Selos"
@@ -5651,10 +5746,10 @@ msgid "BambooService|Bamboo service root URL."
msgstr ""
msgid "BambooService|Enter new build key"
-msgstr ""
+msgstr "Insira a nova chave de construção"
msgid "BambooService|Leave blank to use your current build key."
-msgstr ""
+msgstr "Deixe em branco para usar sua chave de construção atual."
msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo."
msgstr "Executa CI/CD pipelines com Atlassian Bamboo."
@@ -5675,25 +5770,25 @@ msgid "Batch size"
msgstr "Tamanho do lote"
msgid "Batched Job|Background Migrations"
-msgstr ""
+msgstr "Migrações em segundo plano"
msgid "Batched Job|Batched Job (Id: %{id})"
-msgstr ""
+msgstr "Trabalho em lote (Id: %{id})"
msgid "BatchedJob|Attempts"
-msgstr ""
+msgstr "Tentativas"
msgid "BatchedJob|Batch size"
-msgstr ""
+msgstr "Tamanho do lote"
msgid "BatchedJob|Batched Jobs"
msgstr ""
msgid "BatchedJob|Created At"
-msgstr ""
+msgstr "Criado em"
msgid "BatchedJob|Created at"
-msgstr ""
+msgstr "Criado em"
msgid "BatchedJob|Exception Class"
msgstr ""
@@ -5708,19 +5803,19 @@ msgid "BatchedJob|Exception message"
msgstr ""
msgid "BatchedJob|Finished at"
-msgstr ""
+msgstr "Concluído em"
msgid "BatchedJob|Max Value"
-msgstr ""
+msgstr "Valor máximo"
msgid "BatchedJob|Max value"
-msgstr ""
+msgstr "Valor máximo"
msgid "BatchedJob|Min Value"
-msgstr ""
+msgstr "Valor mínimo"
msgid "BatchedJob|Min value"
-msgstr ""
+msgstr "Valor mínimo"
msgid "BatchedJob|Next Status"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr "Cuidado. Alterar o espaço de nome do projeto pode ter efeitos colaterai
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Tenha cuidado. Renomear o repositório de um projeto pode ter efeitos colaterais indesejados."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr "Antes de 1º de julho de 2022, todos os projetos de código aberto públicos de nível gratuito devem %{enrollment_link} para continuar recebendo os benefícios do GitLab Ultimate."
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr "Antes de ativar esta integração, crie um webhook para a sala no Google Chat onde você deseja receber notificações deste projeto. %{docs_link}"
@@ -5816,7 +5908,7 @@ msgid "BillingPlans|All plans have unlimited (private) repositories."
msgstr "Todos os planos têm repositórios (privados) ilimitados."
msgid "BillingPlans|All the features from Free"
-msgstr ""
+msgstr "Todos os recursos do Free"
msgid "BillingPlans|All the features from Premium"
msgstr "Todos os recursos do Premium"
@@ -5843,7 +5935,7 @@ msgid "BillingPlans|Enterprise agile planning"
msgstr "Planejamento ágil empresarial"
msgid "BillingPlans|Faster code reviews"
-msgstr ""
+msgstr "Revisões de código mais rápidas"
msgid "BillingPlans|Free forever features for individual users"
msgstr "Recursos gratuitos para sempre para usuários individuais"
@@ -5873,13 +5965,13 @@ msgid "BillingPlans|Looking to purchase or manage a subscription for your group?
msgstr "Procurando comprar ou gerenciar uma assinatura para seu grupo? Navegue até seu %{groups_link} e vá para %{strong_open}Configurações &gt; Cobrança.%{strong_close}"
msgid "BillingPlans|Loved and trusted by our customers"
-msgstr ""
+msgstr "Amado e confiável por nossos clientes"
msgid "BillingPlans|Manage plan"
msgstr "Gerenciar plano"
msgid "BillingPlans|Not the group you're looking for? %{all_groups_link}."
-msgstr ""
+msgstr "Não é o grupo que você procura? %{all_groups_link}."
msgid "BillingPlans|Open Source - MIT License"
msgstr "Código aberto - Licença MIT"
@@ -5897,7 +5989,7 @@ msgid "BillingPlans|Pricing page"
msgstr "Página de preços"
msgid "BillingPlans|Ready to explore the value of the paid features today? Start a trial, no credit card required."
-msgstr ""
+msgstr "Pronto para explorar o valor dos recursos pagos hoje? Inicie uma avaliação, sem necessidade de cartão de crédito."
msgid "BillingPlans|Recommended"
msgstr "Recomendado"
@@ -5912,10 +6004,10 @@ msgid "BillingPlans|See all %{plan_name} features"
msgstr "Veja todas as funcionalidades do %{plan_name}"
msgid "BillingPlans|Self-managed reliability"
-msgstr ""
+msgstr "Confiabilidade autogerenciada"
msgid "BillingPlans|Spans the DevOps lifecycle"
-msgstr ""
+msgstr "Abrange o ciclo de vida do DevOps"
msgid "BillingPlans|Start a free Ultimate trial"
msgstr "Comece uma avaliação gratuita do Ultimate"
@@ -6020,7 +6112,7 @@ msgid "Billings|Free groups are limited to %{number} seats."
msgstr "Grupos gratuitos são limitados a %{number} assentos."
msgid "Billings|In a seat"
-msgstr ""
+msgstr "Em um assento"
msgid "Billings|Reactivate trial"
msgstr "Reativar avaliação"
@@ -6035,7 +6127,7 @@ msgid "Billings|Shared runners cannot be enabled until a valid credit card is on
msgstr "Executores compartilhados não podem ser ativados até que um cartão de crédito válido seja registrado."
msgid "Billings|The last owner cannot be removed from a seat."
-msgstr ""
+msgstr "O último proprietário não pode ser removido de um assento."
msgid "Billings|To make this member active, you must first remove an existing active member, or toggle them to over limit."
msgstr ""
@@ -6083,7 +6175,7 @@ msgid "Billing|An error occurred while getting a billable member details."
msgstr "Ocorreu um erro enquanto carregava a lista de membros faturáveis."
msgid "Billing|An error occurred while loading GitLab subscription details."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar os detalhes da assinatura do GitLab."
msgid "Billing|An error occurred while loading billable members list."
msgstr "Ocorreu um erro ao carregar a lista de membros faturáveis."
@@ -6113,10 +6205,10 @@ msgid "Billing|Export list"
msgstr "Exportar lista"
msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
-msgstr ""
+msgstr "Grupos gratuitos no GitLab são limitados a %{maxNamespaceSeats} assentos"
msgid "Billing|From June 22, 2022 (GitLab 15.1), free groups will be limited to 5 members"
-msgstr ""
+msgstr "A partir de 22 de junho de 2022 (GitLab 15.1), os grupos gratuitos serão limitados a 5 membros"
msgid "Billing|Group invite"
msgstr "Convite de grupo"
@@ -6157,6 +6249,12 @@ msgstr "Você está prestes a remover o usuário %{username} de sua assinatura.
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr "Seu grupo gratuito agora está limitado a %{free_user_limit} membros"
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Importação de Servidores Bitbucket"
@@ -6451,6 +6549,9 @@ msgstr "Carregando épicos"
msgid "Bold text"
msgstr "Texto em negrito"
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,11 +6873,14 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr "Lista com marcadores"
+
msgid "Burndown chart"
msgstr "Gráfico de Burndown"
msgid "BurndownChartLabel|Remaining"
-msgstr ""
+msgstr "Restante"
msgid "Burnup chart"
msgstr "Gráfico de burnup"
@@ -6868,6 +6972,9 @@ msgstr "%{percent}%{percentSymbol}"
msgid "CICDAnalytics|All time"
msgstr "Todo o período"
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr "Frequência de implantação"
@@ -6909,6 +7016,9 @@ msgstr "Uso do executor compartilhado é o tempo de execução total de todas as
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr "Algo deu errado ao obter estatísticas da versão"
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr "Qual é a duração do corredor compartilhado?"
@@ -6949,7 +7059,7 @@ msgid "CICD|Jobs"
msgstr "Tarefas"
msgid "CICD|Limit"
-msgstr ""
+msgstr "Limite"
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr "Limite de acesso de CI_JOB_TOKEN"
@@ -7165,7 +7275,7 @@ msgid "Cancelling Preview"
msgstr "Cancelando pré-visualização"
msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
-msgstr ""
+msgstr "Não é possível atribuir um épico confidencial a uma issue não confidencial. Torne a issue confidencial e tente novamente"
msgid "Cannot assign an issue that does not belong under the same group (or descendant) as the epic."
msgstr ""
@@ -7236,20 +7346,23 @@ msgstr "Nome do titular do cartão"
msgid "Card number:"
msgstr "Numero do cartão:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr "Aplicar para todos os subgrupos"
msgid "CascadingSettings|Setting enforced"
-msgstr ""
+msgstr "Configuração aplicada"
msgid "CascadingSettings|Subgroups cannot change this setting."
msgstr "Subgrupos não podem alterar esta configuração."
msgid "CascadingSettings|This setting has been enforced by an instance admin."
-msgstr ""
+msgstr "Esta configuração foi aplicada por um administrador da instância."
msgid "CascadingSettings|This setting has been enforced by an owner of %{link}."
-msgstr ""
+msgstr "Esta configuração foi aplicada por um proprietário de %{link}."
msgid "CascadingSettings|cannot be changed because it is locked by an ancestor"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr "Alterações suprimidas. Clique para mostrar."
msgid "Changes the title to \"%{title_param}\"."
msgstr "Altera o título para \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,10 +7629,10 @@ msgid "Checkout"
msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
-msgstr ""
+msgstr "$%{selectedPlanPrice} pelo pacote de 10GB de armazenamento por ano."
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
-msgstr ""
+msgstr "$%{selectedPlanPrice} por pacote de 1,000 minutos."
msgid "Checkout|$%{selectedPlanPrice} per user per year"
msgstr "$%{selectedPlanPrice} por usuário e ano"
@@ -7562,7 +7672,7 @@ msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
-msgstr ""
+msgstr "(pode ser %{linkStart}na compra%{linkEnd})"
msgid "Checkout|(x%{numberOfUsers})"
msgstr "(x%{numberOfUsers})"
@@ -7580,7 +7690,7 @@ msgid "Checkout|CI minute pack"
msgstr "Pacote de minutos de CI"
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 ""
+msgstr "CI são usados somente depois que você usa a cota mensal da sua assinatura. Os minutos adicionais serão acumulados mês a mês e são válidos por um ano."
msgid "Checkout|CI minutes"
msgstr "Minutos de CI"
@@ -7613,10 +7723,10 @@ msgid "Checkout|Create a new group"
msgstr "Criar um novo grupo"
msgid "Checkout|Credit card form failed to load. Please try again."
-msgstr ""
+msgstr "Falha ao carregar o formulário de cartão de crédito. Por favor, tente novamente."
msgid "Checkout|Credit card form failed to load: %{message}"
-msgstr ""
+msgstr "Falha ao carregar o formulário de cartão de crédito: %{message}"
msgid "Checkout|Edit"
msgstr "Editar"
@@ -7628,22 +7738,22 @@ msgid "Checkout|Exp %{expirationMonth}/%{expirationYear}"
msgstr "Expira em: %{expirationMonth}/%{expirationYear}"
msgid "Checkout|Failed to confirm your order! Please try again."
-msgstr ""
+msgstr "Falha ao confirmar seu pedido! Por favor, tente novamente."
msgid "Checkout|Failed to confirm your order: %{message}. Please try again."
-msgstr ""
+msgstr "Falha ao confirmar seu pedido: %{message}. Por favor, tente novamente."
msgid "Checkout|Failed to load countries. Please try again."
-msgstr ""
+msgstr "Falha ao carregar países. Por favor, tente novamente."
msgid "Checkout|Failed to load states. Please try again."
msgstr "Falha ao carregar estados. Por favor, tente novamente."
msgid "Checkout|Failed to load the payment form. Please try again."
-msgstr ""
+msgstr "Falha ao carregar o formulário de pagamento. Por favor, tente novamente."
msgid "Checkout|Failed to register credit card. Please try again."
-msgstr ""
+msgstr "Falha ao registrar o cartão de crédito. Por favor, tente novamente."
msgid "Checkout|GB"
msgstr "GB"
@@ -7657,6 +7767,12 @@ msgstr "Plano no GitLab"
msgid "Checkout|Group"
msgstr "Grupo"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Nome da empresa ou organização usando GitLab"
@@ -7664,7 +7780,7 @@ msgid "Checkout|Name: %{errors}"
msgstr ""
msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
-msgstr ""
+msgstr "Necessita de mais usuários? Compre o GitLab para a sua %{company}."
msgid "Checkout|Number of users"
msgstr "Número de usuários"
@@ -7694,7 +7810,7 @@ msgid "Checkout|Street address"
msgstr "Endereço da rua"
msgid "Checkout|Submitting the credit card form failed with code %{errorCode}: %{errorMessage}"
-msgstr ""
+msgstr "O envio do formulário do cartão de crédito falhou com código %{errorCode}: %{errorMessage}"
msgid "Checkout|Subscription details"
msgstr "Detalhes da assinatura"
@@ -7708,9 +7824,6 @@ msgstr "Sucesso: assinatura"
msgid "Checkout|Tax"
msgstr "Impostos"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr "Total"
@@ -7724,13 +7837,13 @@ msgid "Checkout|Users"
msgstr "Usuários"
msgid "Checkout|You'll create your new group after checkout"
-msgstr ""
+msgstr "Você vai criar um novo grupo após finalizar a compra"
msgid "Checkout|Your organization"
msgstr "Sua organização"
msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
-msgstr ""
+msgstr "Sua assinatura de armazenamento tem o mesmo prazo de sua assinatura principal e o preço é rateado de acordo."
msgid "Checkout|Your subscription will be applied to this group"
msgstr "Sua assinatura será aplicada a este grupo"
@@ -7774,6 +7887,9 @@ msgstr "O épico filho não existe."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7931,7 +8047,7 @@ msgid "CiVariables|Scope"
msgstr "Escopo"
msgid "CiVariables|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used as default"
-msgstr ""
+msgstr "Especifique os valores das variáveis a serem usadas nessa execução. Os valores especificados na configuração da %{linkStart}CI/CD %{linkEnd} serão usados como padrão"
msgid "CiVariables|State"
msgstr "Estado"
@@ -7970,7 +8086,7 @@ msgid "Clean up after running %{link_start}git filter-repo%{link_end} on the rep
msgstr "Limpe após de executar %{link_start}git filter-repo%{link_end} no repositório."
msgid "Cleanup policies are executed by background workers. This setting defines the maximum number of workers that can run concurrently. Set it to 0 to remove all workers and not execute the cleanup policies."
-msgstr ""
+msgstr "As políticas de limpeza são executadas por trabalhadores em segundo plano. Esta configuração define o número máximo de trabalhadores que podem desempenhar simultaneamente. Coloque no 0 para remover todos trabalhadores e não executar as políticas de limpeza."
msgid "Cleanup policy maximum number of tags to be deleted"
msgstr "Número máximo de tags para serem deletadas em Política de limpeza"
@@ -7986,8 +8102,8 @@ msgstr "Limpar"
msgid "Clear %{count} image from cache?"
msgid_plural "Clear %{count} images from cache?"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Limpar %{count} imagem do cache?"
+msgstr[1] "Limpar %{count} imagens do cache?"
msgid "Clear all repository checks"
msgstr "Limpar todas as verificações de repositório"
@@ -8020,13 +8136,13 @@ msgid "Clear templates search input"
msgstr "Limpar entrada de pesquisa de modelos"
msgid "Clear this checkbox to use a personal access token instead."
-msgstr ""
+msgstr "Desmarque esta opção para usar um token de acesso pessoal."
msgid "Clear this checkbox to use a personal access token or LDAP password instead."
-msgstr ""
+msgstr "Desmarque essa opção para usar um token de acesso pessoal ou uma senha LDAP."
msgid "Clear this checkbox to use an external authentication provider instead."
-msgstr ""
+msgstr "Desmarque esta opção para usar um provedor de autenticação externo."
msgid "Clear weight"
msgstr "Limpar peso"
@@ -8148,6 +8264,9 @@ msgstr "Fechado %{epicTimeagoDate}"
msgid "Closed MRs"
msgstr "MRs fechados"
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Issues fechadas"
@@ -8166,6 +8285,123 @@ msgstr "Cloud Run"
msgid "Cloud Storage"
msgstr "Armazenamento em nuvem"
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr "Cancelar"
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr "Criar instância"
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr "Versão do banco de dados"
+
+msgid "CloudSeed|Description"
+msgstr "Descrição"
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr "Ambiente"
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr "Instâncias"
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr "Serviço"
+
+msgid "CloudSeed|Services"
+msgstr "Serviços"
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr "Versão"
+
msgid "Cluster"
msgstr "Cluster"
@@ -8175,9 +8411,6 @@ msgstr "Saúde do cluster"
msgid "Cluster cache cleared."
msgstr "Cache do cluster limpo."
-msgid "Cluster does not exist"
-msgstr "Cluster não existe"
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8421,7 +8654,7 @@ msgid "ClusterAgents|Requires a Maintainer or greater role to perform these acti
msgstr "Requer um mantenedor ou função superior para excluir agentes"
msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
-msgstr ""
+msgstr "Requer um mantenedor ou função superior para executar esta ação"
msgid "ClusterAgents|Revoke access token?"
msgstr "Revogar token de acesso?"
@@ -8543,9 +8776,6 @@ msgstr "Opções avançadas na integração deste cluster Kubernetes"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Permitir ao GitLab gerenciar espaços de nome e contas de serviço para este cluster."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr "Permitir ao GitLab consultar um Prometheus especificamente configurado no cluster para obter métricas."
@@ -8585,6 +8815,9 @@ msgstr "Verifique seu token"
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Escolha quais dos seus ambientes usarão esse cluster."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "Limpar cluster de cache"
@@ -8630,9 +8863,6 @@ msgstr "Você sabia?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service"
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr "Ativar integração do Elastic Stack"
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr "Ativar integração do Prometheus"
@@ -8810,10 +9040,16 @@ 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 certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr "O método baseado em certificado para conectar clusters ao GitLab foi %{linkStart}descontinuado%{linkEnd} no GitLab 14.5."
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr "Revisão de código"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr "O Code Review Analytics exibe uma tabela de solicitações de mesclagem abertas consideradas em revisão de código. Atualmente não há solicitações de mesclagem em revisão para este projeto e/ou filtros."
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr "Estatísticas de cobertura de código para %{ref} %{start_date} - %{end_date}"
@@ -8990,14 +9232,17 @@ msgstr ""
msgid "Collector hostname"
msgstr "Nome do hostname"
+msgid "Color"
+msgstr "Cor"
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
msgid "ColorWidget|Assign epic color"
-msgstr ""
+msgstr "Atribuir cor do épico"
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "Cor"
msgid "ColorWidget|Error fetching epic color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr "Configurar GitLab"
@@ -9415,12 +9663,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-msgstr "Configurar rastreamento"
-
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 "Configure um arquivo %{codeStart}.gitlab-webide.yml%{codeEnd} no %{codeStart}.gitLab%{codeEnd} para começar a usar o Terminal Web. %{helpStart}Saiba mais.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr "Configure permissões avançadas, armazenamento de arquivos grandes, autenticação de dois fatores e configurações de relacionamento com o cliente."
@@ -9610,9 +9858,6 @@ msgstr "Registro de contêiner"
msgid "Container Scanning"
msgstr "Verificação de container"
-msgid "Container does not exist"
-msgstr "O container não existe"
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9660,7 +9905,7 @@ msgid "ContainerRegistry|CLI Commands"
msgstr "Comandos CLI"
msgid "ContainerRegistry|Clean up image tags"
-msgstr ""
+msgstr "Limpar tags de imagem"
msgid "ContainerRegistry|Cleanup disabled"
msgstr "Limpeza desativada"
@@ -9832,18 +10077,18 @@ msgstr "Remover tags mais antigas que:"
msgid "ContainerRegistry|Remove these tags"
msgstr "Remover essas tags"
-msgid "ContainerRegistry|Root image"
-msgstr "Imagem raiz"
-
msgid "ContainerRegistry|Run cleanup:"
msgstr "Executar limpeza:"
msgid "ContainerRegistry|Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
-msgstr ""
+msgstr "Economize espaço de armazenamento excluindo automaticamente as tags do registro do contêiner e mantendo as que você deseja. %{linkStart}Como funciona a limpeza%{linkEnd}"
msgid "ContainerRegistry|Set up cleanup"
msgstr "Configurar limpeza"
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Algumas tag não foram excluídas"
@@ -10067,7 +10312,7 @@ msgid "Control whether to display customer experience improvement content and th
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 ""
+msgstr "Controle quais projetos podem ser acessados por solicitações de API autenticadas com a variável CI_JOB_TOKEN CI/CD deste projeto. É um risco de segurança desativar esse recurso, pois projetos não autorizados podem tentar recuperar um token ativo e acessar a API."
msgid "Cookie domain"
msgstr ""
@@ -10082,7 +10327,7 @@ msgid "Copy"
msgstr "Copiar"
msgid "Copy %{accessTokenType}"
-msgstr ""
+msgstr "Copiar %{accessTokenType}"
msgid "Copy %{http_label} clone URL"
msgstr "Copiar URL de clone do %{http_label}"
@@ -10112,7 +10357,7 @@ msgid "Copy URL"
msgstr "Copiar URL"
msgid "Copy audio URL"
-msgstr ""
+msgstr "Copiar URL do áudio"
msgid "Copy branch name"
msgstr "Copiar nome do branch"
@@ -10148,7 +10393,7 @@ msgid "Copy file path"
msgstr "Copiar caminho do arquivo"
msgid "Copy image URL"
-msgstr ""
+msgstr "Copiar URL da imagem"
msgid "Copy issue URL to clipboard"
msgstr "Copiar a URL da issue para a área de transferência"
@@ -10199,7 +10444,7 @@ msgid "Copy value"
msgstr "Copiar valor"
msgid "Copy video URL"
-msgstr ""
+msgstr "Copiar URL do vídeo"
msgid "Corpus Management"
msgstr "Gerenciamento de corpus"
@@ -10490,7 +10735,7 @@ msgid "Create confidential merge request and branch"
msgstr "Criar merge request e branch confidencial"
msgid "Create custom type"
-msgstr ""
+msgstr "Criar tipo personalizado"
msgid "Create directory"
msgstr "Criar diretório"
@@ -10570,11 +10815,14 @@ msgstr "Criar nova etiqueta"
msgid "Create new project"
msgstr "Criar novo projeto"
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr "Criar um"
msgid "Create or close an issue."
-msgstr ""
+msgstr "Criar ou fechar uma issue."
msgid "Create or import your first project"
msgstr "Criar ou importar seu primeiro projeto"
@@ -10616,7 +10864,7 @@ msgid "Create your group"
msgstr "Criar seu grupo"
msgid "Create, update, or delete a merge request."
-msgstr ""
+msgstr "Criar, atualizar ou excluir uma solicitação de mesclagem."
msgid "Create/import your first project"
msgstr "Criar/importar seu primeiro projeto"
@@ -10847,7 +11095,7 @@ msgid "CredentialsInventory|Personal Access Tokens"
msgstr "Tokens de acesso pessoal"
msgid "CredentialsInventory|Project Access Tokens"
-msgstr ""
+msgstr "Tokens de acesso pessoal"
msgid "CredentialsInventory|SSH Keys"
msgstr "Chaves SSH"
@@ -10862,7 +11110,7 @@ msgid "Critical vulnerabilities present"
msgstr "Vulnerabilidades críticas presentes"
msgid "Crm|Contact"
-msgstr ""
+msgstr "Contato"
msgid "Crm|Contact has been added."
msgstr "Contato foi adicionado"
@@ -11262,11 +11510,14 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr "Alterar taxa de falha"
+
msgid "DORA4Metrics|Date"
msgstr "Data"
msgid "DORA4Metrics|Days for an open incident"
-msgstr ""
+msgstr "Dias para um incidente aberto"
msgid "DORA4Metrics|Days from merge to deploy"
msgstr ""
@@ -11284,10 +11535,10 @@ msgid "DORA4Metrics|Median time (last %{days}d)"
msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
-msgstr ""
+msgstr "Tempo médio em que um incidente foi aberto em um ambiente de produção durante o período de tempo determinado."
msgid "DORA4Metrics|No incidents during this period"
-msgstr ""
+msgstr "Nenhum incidente durante este período"
msgid "DORA4Metrics|No merge requests were deployed during this period"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr "Número de implantações"
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr "Número de incidentes dividido pelo número de implantações em um ambiente de produção no período de tempo determinado."
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr "Porcentagem de implantações com falha"
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr "Algo deu errado ao obter dados de taxa de falha de alteração."
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11311,7 +11571,7 @@ msgid "DORA4Metrics|The chart displays the median time between a merge request b
msgstr "O gráfico exibe a mediana de tempo entre uma solicitação de mesclagem sendo realizada e implantada no(s) ambient(s) de produção baseados no valor %{linkStart}deployment_tier%{linkEnd} ."
msgid "DORA4Metrics|Time to restore service"
-msgstr ""
+msgstr "Tempo para restaurar o serviço"
msgid "DSN"
msgstr ""
@@ -11343,15 +11603,15 @@ 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 "Configurações de DAST"
+msgid "DastConfig|DAST CI/CD configuration"
+msgstr ""
+
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
+msgstr ""
msgid "DastConfig|Generate code snippet"
msgstr "Gerar snippet de código"
-msgid "DastConfig|Scan Configuration"
-msgstr "Configuração de verificação"
-
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 ""
@@ -11374,7 +11634,7 @@ msgid "DastProfiles|Are you sure you want to delete this profile?"
msgstr ""
msgid "DastProfiles|Attacks the target to find potential vulnerabilities. Active scans are potentially harmful to the site being scanned."
-msgstr ""
+msgstr "Ataca o alvo para encontrar vulnerabilidades em potencial. As verificações ativas são potencialmente prejudiciais ao site que está sendo verificado."
msgid "DastProfiles|Authentication"
msgstr "Autenticação"
@@ -11481,6 +11741,9 @@ msgstr "Ocultar mensagens de depuração"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr "Incluir mensagens de depuração (debug) no console de saída do DAST."
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr "Gerenciar perfis"
@@ -11494,7 +11757,7 @@ msgid "DastProfiles|Minimum = 1 second, Maximum = 3600 seconds"
msgstr ""
msgid "DastProfiles|Monitors all HTTP requests sent to the target to find potential vulnerabilities."
-msgstr ""
+msgstr "Monitora todas as solicitações HTTP enviadas ao destino para encontrar possíveis vulnerabilidades."
msgid "DastProfiles|New scanner profile"
msgstr "Novo perfil de verificação"
@@ -11503,13 +11766,13 @@ msgid "DastProfiles|New site profile"
msgstr "Novo perfil de site"
msgid "DastProfiles|No scanner profile selected"
-msgstr ""
+msgstr "Nenhum perfil de verificação selecionado"
msgid "DastProfiles|No scanner profiles created yet"
msgstr "Nenhum perfil de verificação criado ainda"
msgid "DastProfiles|No site profile selected"
-msgstr ""
+msgstr "Nenhum perfil de site selecionado"
msgid "DastProfiles|No site profiles created yet"
msgstr "Nenhum perfil de site criado ainda"
@@ -11527,7 +11790,7 @@ msgid "DastProfiles|Password form field"
msgstr "Campo de formulário de senha"
msgid "DastProfiles|Profile is being used by this on-demand scan"
-msgstr ""
+msgstr "O perfil está sendo usado por esta verificação sob demanda"
msgid "DastProfiles|Profile name"
msgstr "Nome do perfil"
@@ -11566,10 +11829,10 @@ msgid "DastProfiles|Scanner profiles define the configuration details of a secur
msgstr ""
msgid "DastProfiles|Select a scanner profile to run a DAST scan"
-msgstr ""
+msgstr "Selecione um perfil de verificação para executar uma verificação de DAST"
msgid "DastProfiles|Select a site profile to run a DAST scan"
-msgstr ""
+msgstr "Selecione um perfil de site para executar uma verificação DAST"
msgid "DastProfiles|Select branch"
msgstr "Selecionar branch"
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr "Validação de metatag"
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr "Tentar novamente a validação"
@@ -11739,7 +12005,7 @@ msgid "DastSiteValidation|Validate"
msgstr "Validar"
msgid "DastSiteValidation|Validate site"
-msgstr ""
+msgstr "Validar site"
msgid "DastSiteValidation|Validated"
msgstr ""
@@ -11826,7 +12092,7 @@ msgid "Date range"
msgstr "Intervalo de datas"
msgid "Date range limited to %{number} days"
-msgstr ""
+msgstr "Período limitado a %{number} dias"
msgid "Date range must be shorter than %{max_range} days."
msgstr "O intervalo de datas deve ser menor que %{max_range} dias."
@@ -11894,12 +12160,6 @@ msgstr "Ramificação padrão"
msgid "Default branch and protected branches"
msgstr "Branch padrão e branches protegidos"
-msgid "Default delayed project deletion"
-msgstr "Atraso padrão para exclusão de projeto"
-
-msgid "Default deletion delay"
-msgstr "Atraso padrão para exclusão"
-
msgid "Default description template for issues"
msgstr "Modelo de descrição padrão para issues"
@@ -11912,9 +12172,6 @@ msgstr "Primeiro dia da semana padrão"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Primeiro dia da semana padrão em calendários e selecionadores de data."
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr "Limite padrão de projetos"
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr "Definição"
+msgid "Delay 2FA enforcement (hours)"
+msgstr "Atraso de aplicação 2FA (horas)"
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr "Excluir comentário"
msgid "Delete File"
msgstr "Excluir arquivo"
-msgid "Delete Internal Note"
-msgstr "Excluir nota interna"
-
msgid "Delete Key"
msgstr "Excluir chave"
@@ -12056,6 +12313,9 @@ msgstr "Excluir imagem"
msgid "Delete image repository"
msgstr "Excluir repositório de imagem"
+msgid "Delete internal note"
+msgstr "Excluir nota interna"
+
msgid "Delete label"
msgstr "Excluir etiqueta"
@@ -12167,6 +12427,33 @@ msgstr "Apagar o projeto irá apagar o repositório e todos os itens relacionado
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr "Exclusão pendente. Este projeto será excluído em %{date}. Repositório e outros recursos do projeto são somente leitura."
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr "Negado"
@@ -12302,15 +12589,15 @@ msgstr "Prefixo da imagem do proxy de dependência"
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr "Ativar proxy de dependências"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
+msgstr ""
+
msgid "DependencyProxy|Image list"
msgstr "Lista de imagens"
msgid "DependencyProxy|Scheduled for deletion"
msgstr "Programado para exclusão"
-msgid "DependencyProxy|Storage settings"
-msgstr "Configurações de armazenamento"
-
msgid "DependencyProxy|There are no images in the cache"
msgstr "Não há imagens no cache"
@@ -12719,20 +13006,14 @@ msgid "Deprecations|Feature deprecation and removal"
msgstr "Remoção e depreciação de funcionalidades"
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
+msgstr "Para informações sobre uma possível substituição %{epicStart} leia mais sobre Opstrace %{epicEnd}."
msgid "Deprecations|For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr "Depreciações|Para informações sobre uma possível substituição %{opstrace_link_start} leia mais sobre Opstrace %{link_end}."
+msgstr "Para informações sobre uma possível substituição %{opstrace_link_start} leia mais sobre Opstrace %{link_end}."
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr "Os registros e recursos de rastreamento também foram descontinuados no GitLab 14.7 e estão %{removal_link_start} programados para remoção %{link_end} no GitLab 15.0."
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr "Os registros e recursos de rastreamento foram descontinuados no GitLab 14.7 e estão %{epicStart} programados para remoção %{epicEnd} no GitLab 15.0."
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr "Os registros e recursos de rastreamento foram descontinuados no GitLab 14.7 e estão %{removal_link_start} agendados para remoção %{link_end} no GitLab 15. . Para informações sobre uma possível substituição, %{opstrace_link_start} leia mais sobre Opstrace %{link_end}."
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr "O recurso de métricas foi descontinuado no GitLab 14.7."
@@ -12796,7 +13077,7 @@ msgid "DesignManagement|Archive selected"
msgstr "Arquivo selecionado"
msgid "DesignManagement|Archived designs will still be available in previous versions of the design collection."
-msgstr ""
+msgstr "Os designs arquivados ainda estarão disponíveis nas versões anteriores da coleção de designs."
msgid "DesignManagement|Are you sure you want to archive the selected designs?"
msgstr "Tem certeza de que deseja arquivar os designs selecionados?"
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr "Comentário"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "Não foi possível adicionar um novo comentário. Por favor, tente novamente."
@@ -12867,9 +13145,6 @@ msgstr "Manter as alterações"
msgid "DesignManagement|Keep comment"
msgstr "Manter o comentário"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "A versão de design solicitada não existe. Mostrando a versão mais recente como alternativa"
@@ -12927,6 +13202,9 @@ msgstr "Detalhes"
msgid "Details (default)"
msgstr "Detalhes (padrão)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "Detectar chaves de host"
@@ -12943,7 +13221,7 @@ msgid "Devices (optional)"
msgstr "Dispositivos (opcional)"
msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
-msgstr ""
+msgstr "%{adoptedCount}/%{featuresCount} %{title} recursos adotados"
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
@@ -12976,7 +13254,7 @@ msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from th
msgstr ""
msgid "DevopsAdoption|At least one approval on a merge request"
-msgstr ""
+msgstr "Pelo menos uma aprovação em uma solicitação de mesclagem"
msgid "DevopsAdoption|At least one deploy"
msgstr ""
@@ -12991,10 +13269,10 @@ msgid "DevopsAdoption|At least one pipeline successfully run"
msgstr ""
msgid "DevopsAdoption|Code owners"
-msgstr ""
+msgstr "Proprietários de código"
msgid "DevopsAdoption|Code owners enabled for at least one project"
-msgstr ""
+msgstr "Proprietários de código ativados em pelo menos um projeto"
msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
@@ -13027,7 +13305,7 @@ msgid "DevopsAdoption|Edit subgroups"
msgstr "Editar subgrupos"
msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Data is updated at the beginning of each month. Last updated: %{timestamp}."
-msgstr ""
+msgstr "A adoção do recurso é baseada no uso no mês anterior. Os dados são atualizados no início de cada mês. Última atualização: %{timestamp}."
msgid "DevopsAdoption|Fuzz Testing"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr "Sua pontuação"
msgid "DevopsReport|Your usage"
msgstr "Seu uso"
+msgid "Diagram (%{language})"
+msgstr "Diagrama (%{language})"
+
msgid "Did not delete the source branch."
msgstr "Não excluiu a ramificação de origem."
@@ -13230,9 +13511,6 @@ msgstr "Desativar para este projeto"
msgid "Disable group runners"
msgstr "Desativar executores de grupo"
-msgid "Disable the group-level wiki"
-msgstr "Desabilitar a wiki em nível de grupo"
-
msgid "Disable two-factor authentication"
msgstr "Desativar autenticação de dois fatores"
@@ -13400,9 +13678,6 @@ msgstr "URL das páginas de documentação"
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr "Não exclui a ramificação de origem."
@@ -13619,12 +13894,12 @@ msgstr ""
msgid "Edit"
msgstr "Alterar"
-msgid "Edit %{issuable}"
-msgstr "Editar %{issuable}"
-
msgid "Edit %{name}"
msgstr "Editar %{name}"
+msgid "Edit %{profileType} profile"
+msgstr "Editar perfil %{profileType}"
+
msgid "Edit Comment"
msgstr "Editar comentário"
@@ -13652,9 +13927,6 @@ msgstr "Editar senha"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr "Editar perfil"
-
msgid "Edit Release"
msgstr "Editar versão"
@@ -13800,14 +14072,11 @@ msgid "Elasticsearch reindexing is already in progress"
msgstr ""
msgid "Elasticsearch reindexing triggered"
-msgstr ""
+msgstr "Reindexação de Elasticsearch disparada"
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr "tanooki@exemplo.com gitlab@exemplo.com"
msgid "Embed"
msgstr "Embutido"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr "Incorpore uma imagem de seu servidor Jaeger existente no GitLab."
-
msgid "Empty file"
msgstr "Arquivo vazio"
@@ -13964,6 +14230,9 @@ msgstr "Ativar integração da Amazon EKS"
msgid "Enable Auto DevOps"
msgstr "Ativar Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr "Ativar Gitpod"
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr "Ativar a exclusão atrasada do projeto por padrão para grupos recém-criados."
-
msgid "Enable email notification"
msgstr "Ativar notificações por e-mail"
@@ -14147,9 +14413,6 @@ msgstr "Protocolos de acesso do Git habilitados"
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr "As fontes para importação de código durante a criação de projetos foram ativadas. O OmniAuth deve ser configurado para o GitHub."
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr "Empresa"
msgid "Environment"
msgstr "Ambiente"
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr "Paradas automáticas %{autoStopAt}"
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr "Mostrando %{fetched} resultados."
-
-msgid "Environments|Currently showing all results."
-msgstr "Mostrando todos os resultados"
-
msgid "Environments|Delete"
msgstr "Excluir"
@@ -14414,9 +14668,6 @@ msgstr "Ambientes são locais onde a implantação é feita, tais como homologaÃ
msgid "Environments|How do I create an environment?"
msgstr "Como criar um ambiente?"
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr "Instale o Elastic Stack em seu cluster para ativar recursos avançados de consulta, como pesquisa de texto completo."
-
msgid "Environments|Job"
msgstr "Tarefa"
@@ -14426,9 +14677,6 @@ msgstr "Ler mais sobre ambientes"
msgid "Environments|Learn more about stopping environments"
msgstr "Saiba mais sobre como parar ambientes"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr "Regitros de %{start} a %{end}."
-
msgid "Environments|New environment"
msgstr "Novo ambiente"
@@ -14438,12 +14686,6 @@ msgstr "Nenhum ambiente de implantação"
msgid "Environments|No deployments yet"
msgstr "Nenhuma implantação ainda"
-msgid "Environments|No pod selected"
-msgstr "Nenhum pod selecionado"
-
-msgid "Environments|No pods to display"
-msgstr "Nenhum pod para exibir"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Observe que esta ação irá parar o ambiente mas %{emphasisStart}não%{emphasisEnd} terá efeito sobre qualquer deploy existente devido a \"ação de parar ambiente\" sendo definida no arquivo %{ciConfigLinkEnd}.gitlab-ci.yml%{ciConfigLinkStart}."
@@ -14453,11 +14695,8 @@ msgstr "Abrir"
msgid "Environments|Open live environment"
msgstr "Abrir ambiente ao vivo"
-msgid "Environments|Pod name"
-msgstr "Nome do pod"
-
-msgid "Environments|Re-deploy"
-msgstr "Re-implantar"
+msgid "Environments|Re-deploy environment"
+msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
msgstr ""
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr "Reimplantar no ambiente"
-msgid "Environments|Rollback"
-msgstr "Reverter"
-
msgid "Environments|Rollback environment"
msgstr "Reverter ambiente"
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr "Selecionar pod"
-
msgid "Environments|Show all"
msgstr "Mostrar tudo"
@@ -14492,13 +14725,10 @@ msgstr "Parar %{environmentName}"
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr "Algo deu errado ao remover a issue de épico."
msgid "Epics|Something went wrong while updating epics."
msgstr "Algo deu errado ao atualizar épicos filhos."
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr "A cor do épico quando ele é visualizado, como nas barras da linha do tempo do roadmap"
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "Ativo"
@@ -15124,6 +15360,9 @@ msgstr "Todos os anos em %{day} às %{time} %{timezone}"
msgid "Everyone With Access"
msgstr "Todos com acesso"
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "Todos podem contribuir"
@@ -15262,8 +15501,8 @@ msgstr "Expirado:"
msgid "Expires"
msgstr "Expira"
-msgid "Expires in %{expires_at}"
-msgstr "Expira em %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr ""
msgid "Expires on"
msgstr "Expira em"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr "Wiki externa"
@@ -15448,6 +15690,11 @@ msgstr "Falhou"
msgid "Failed Jobs"
msgstr "Tarefas com falha"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr "Falhou em"
@@ -16127,8 +16374,11 @@ msgstr "Localizar por caminho"
msgid "Find file"
msgstr "Localizar arquivo"
-msgid "Fingerprint"
-msgstr "Impressão digital"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
+msgstr ""
msgid "Fingerprints"
msgstr "Impressões digitais"
@@ -16136,6 +16386,9 @@ msgstr "Impressões digitais"
msgid "Finish editing this message first!"
msgstr "Conclua a edição desta mensagem primeiro!"
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "Para mais informações, vá para o "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,8 +16587,8 @@ msgstr "O projeto pode ser acessado sem nenhuma autenticação."
msgid "ForkProject|Visibility level"
msgstr "Nível de visibilidade"
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
-msgstr "Quer hospedar vários projetos dependentes no mesmo espaço de nome?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
+msgstr ""
msgid "ForkSuggestion|Cancel"
msgstr "Cancelar"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr "Verificação pendente"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr "Nó primário"
-
msgid "Geo|Primary site"
msgstr "Site principal"
-msgid "Geo|Project"
-msgstr "Projeto"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "Projeto (ID: %{project_id}) não existe mais no primário. É seguro remover esse registro, pois isso não removerá nenhum dado no disco."
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr "Nó secundário"
-
msgid "Geo|Secondary site"
msgstr "Site secundário"
@@ -16938,9 +17176,6 @@ msgstr "Configuração de armazenamento"
msgid "Geo|Synced"
msgstr "Sincronizado"
-msgid "Geo|Synced at"
-msgstr "Sincronizado em"
-
msgid "Geo|Synchronization"
msgstr "Sincronização"
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr "Versão do Git"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr "Solicitação de conta do GitLab"
msgid "GitLab Billing Team."
msgstr "Equipe de cobrança do GitLab."
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "Importação do GitLab"
@@ -17233,7 +17507,7 @@ msgid "GitLab is open source software to collaborate on code."
msgstr ""
msgid "GitLab is undergoing maintenance"
-msgstr ""
+msgstr "GitLab está passando por manutenção"
msgid "GitLab logo"
msgstr "Logotipo do GitLab"
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr "Nome de usuário do GitLab"
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17311,7 +17582,7 @@ msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable th
msgstr ""
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "Tamanho máximo (MB)"
msgid "GitLabPages|New Domain"
msgstr "Novo domínio"
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr "Não verificado"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr "Verificado"
@@ -17454,9 +17728,15 @@ msgstr "Atalhos Globais"
msgid "Global notification settings"
msgstr "Configurações de notificação global"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr "%{search} %{description} %{scope}"
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr "Grupos"
+
msgid "GlobalSearch|Issues I've created"
msgstr "Issues que eu criei"
@@ -17472,6 +17752,9 @@ msgstr "Solicitações de mesclagem atribuídas a mim"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Solicitações de mesclagem que eu seja um revisor"
+msgid "GlobalSearch|Projects"
+msgstr "Projetos"
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,17 +17776,23 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr "Use a tecla de atalho %{kbdOpen}/%{kbdClose} para iniciar uma pesquisa"
+
msgid "GlobalSearch|What are you searching for?"
msgstr "O que você está procurando?"
-msgid "GlobalSearch|in all GitLab"
-msgstr "em todo o GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr "todo GitLab"
+
+msgid "GlobalSearch|group"
+msgstr "grupo"
-msgid "GlobalSearch|in group"
-msgstr "no grupo"
+msgid "GlobalSearch|in %{scope}"
+msgstr "em %{scope}"
-msgid "GlobalSearch|in project"
-msgstr "no projeto"
+msgid "GlobalSearch|project"
+msgstr "projeto"
msgid "Globally-allowed IP ranges"
msgstr ""
@@ -17778,6 +18067,9 @@ msgstr "Gravatar habilitado"
msgid "Group"
msgstr "Grupo"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr "O grupo \"%{group_name}\" foi atualizado com sucesso."
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr "O grupo foi atualizado com sucesso."
msgid "Group wikis"
msgstr "Grupo de wikis"
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "Grupo: %{group_name}"
@@ -17940,8 +18235,8 @@ msgstr "Grupo: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr "Issues criadas"
-msgid "GroupActivityMetrics|Last 90 days"
-msgstr "Últimos 90 dias"
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr "Últimos 30 dias"
msgid "GroupActivityMetrics|Members added"
msgstr "Membros adicionados"
@@ -18031,7 +18326,7 @@ msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enable %{linkStart}SSO enf
msgstr ""
msgid "GroupSAML|Active SAML Group Links (%{count})"
-msgstr ""
+msgstr "Links de grupos SAML ativos (%{count})"
msgid "GroupSAML|An error occurred generating your SCIM token. Please try again."
msgstr ""
@@ -18085,7 +18380,7 @@ msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Id
msgstr "Gera um token SCIM para configurar seu Sistema para Gerenciamento de Identidade entre Domínios."
msgid "GroupSAML|Identifier"
-msgstr ""
+msgstr "Identificador"
msgid "GroupSAML|Identity provider single sign-on URL"
msgstr ""
@@ -18106,7 +18401,7 @@ msgid "GroupSAML|NameID"
msgstr "NameID"
msgid "GroupSAML|NameID Format"
-msgstr ""
+msgstr "Formato de ID do nome"
msgid "GroupSAML|New SAML group link saved."
msgstr ""
@@ -18118,19 +18413,19 @@ msgid "GroupSAML|Prohibit outer forks for this group"
msgstr ""
msgid "GroupSAML|Reset SCIM token"
-msgstr ""
+msgstr "Redefinir token SCIM"
msgid "GroupSAML|Role to assign members of this SAML group."
-msgstr ""
+msgstr "Cargo para designar membros deste grupo SAML."
msgid "GroupSAML|SAML Group Links"
-msgstr ""
+msgstr "Links de grupo SAML"
msgid "GroupSAML|SAML Group Name"
-msgstr ""
+msgstr "Nome do Grupo SAML"
msgid "GroupSAML|SAML Group Name: %{saml_group_name}"
-msgstr ""
+msgstr "Nome do Grupo SAML: %{saml_group_name}"
msgid "GroupSAML|SAML Response Output"
msgstr ""
@@ -18157,7 +18452,7 @@ msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token aga
msgstr ""
msgid "GroupSAML|The case-sensitive group name that will be sent by the SAML identity provider."
-msgstr ""
+msgstr "O nome do grupo que diferencia maiúsculas de minúsculas que será enviado pelo provedor de identidade SAML."
msgid "GroupSAML|This will be set as the access level of users added to the group."
msgstr "Isso será definido como o nível de acesso dos usuários adicionados ao grupo."
@@ -18178,10 +18473,10 @@ msgid "GroupSAML|With prohibit outer forks flag enabled group members will be ab
msgstr ""
msgid "GroupSAML|as %{access_level}"
-msgstr ""
+msgstr "como %{access_level}"
msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
-msgstr ""
+msgstr "deve corresponder ao ID de nome armazenado de \"%{extern_uid}\" para identificar o usuário e permitir a entrada"
msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
@@ -18207,18 +18502,15 @@ msgstr "Pesquisar grupos"
msgid "GroupSelect|Select a group"
msgstr "Selecionar grupos"
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr "Permitir a criação de token de acesso ao projeto e grupo"
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr "Permitir criar organizações e contatos e associá-los a issues."
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr "Aplicado a todos os subgrupos, a menos que seja substituído por um proprietário do grupo. Os grupos já adicionados ao projeto perdem o acesso."
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Pipeline de Auto DevOps foi atualizado para o grupo"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr "Banir automaticamente os usuários que baixam mais do que o número especificado de projetos dentro do intervalo especificado."
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr "Disponível apenas no grupo de nível superior. Aplica-se a todos os subgrupos. Grupos já compartilhados com um grupo fora de %{group} ainda são compartilhados, a menos que sejam removidos manualmente."
@@ -18249,38 +18541,50 @@ msgstr "Configure estruturas de conformidade para disponibilizá-las para projet
msgid "GroupSettings|Custom project templates"
msgstr "Modelos de projetos personalizados"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr "Relações com o cliente estão ativadas"
+
msgid "GroupSettings|Customize this group's badges."
msgstr "Personalize os selos deste grupo."
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "Padrão para pipeline de Auto DevOps para todos os projetos dentro deste grupo"
-msgid "GroupSettings|Disable email notifications"
-msgstr "Desativar notificações por e-mail"
-
-msgid "GroupSettings|Disable group mentions"
-msgstr "Desabilitar menções de grupo"
-
-msgid "GroupSettings|Enable customer relations"
-msgstr "Ativar relações com o cliente"
-
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr "Ativar exclusão atrasada do projeto"
+msgid "GroupSettings|Email notifications are disabled"
+msgstr "As notificações por e-mail estão desativadas"
msgid "GroupSettings|Export group"
msgstr "Exportar grupo"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
+msgstr "Os membros do grupo não são notificados se o grupo for mencionado."
+
+msgid "GroupSettings|Group mentions are disabled"
+msgstr "As menções de grupo estão desativadas"
+
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
msgstr "Se não for especificado no nível de grupo ou instância, o padrão é %{default_initial_branch_name}. Não afeta os repositórios existentes."
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr "Se a visibilidade do grupo pai for menor que a visibilidade atual do grupo, os níveis de visibilidade para subgrupos e projetos serão mudados para corresponder à visibilidade do novo grupo pai."
+msgid "GroupSettings|Interval (seconds)"
+msgstr "Intervalo (segundos)"
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr "Os membros não podem convidar grupos fora de %{group} e seus subgrupos"
+
+msgid "GroupSettings|Number of projects"
+msgstr "Número de projetos"
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr "Organizações e contatos podem ser criados e associados a issues."
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "Substitui as preferências de notificação do usuário para todos os membros do grupo, subgrupos e projetos."
msgid "GroupSettings|Pipeline settings was updated for the group"
-msgstr ""
+msgstr "As configurações de pipeline foram atualizadas para o grupo"
msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr "Por favor, escolha um URL de grupo sem caracteres especiais ou espaços."
@@ -18291,23 +18595,14 @@ msgstr "Evitar fork fora do grupo"
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr "A configuração de prevenção de fork não foi salva"
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
-msgstr "Evitar que membros enviem convites para grupos fora de %{group} e seus subgrupos"
-
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "Evitar compartilhamento de projetos do grupo %{group} com outros grupos"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr "Evitar que os membros do grupo sejam notificados se o grupo for mencionado."
-
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
-msgstr "Os projetos serão excluídos permanentemente após um %{waiting_period} atraso de dia(s). Herdado por subgrupos."
+msgid "GroupSettings|Project download rate limit"
+msgstr "Limite de taxa de download do projeto"
-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 "Os projetos serão excluídos permanentemente após um %{waiting_period}-atraso de dia(s). Este atraso pode ser %{link_start}personalizado por um administrador%{link_end} nas configurações de instância. Herdado por subgrupos."
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr "Projetos em %{group} não podem ser compartilhados com outros grupos"
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
-msgstr "Selecione um projeto com o arquivo %{code_start}.gitlab/insights.yml%{code_end}"
+msgid "GroupSettings|Reporting"
+msgstr "Relatórios"
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr "Selecione um subgrupo para usar como fonte para modelos de projeto personalizados para este grupo."
@@ -18315,18 +18610,27 @@ msgstr "Selecione um subgrupo para usar como fonte para modelos de projeto perso
msgid "GroupSettings|Select parent group"
msgstr "Selecionar o grupo pai"
-msgid "GroupSettings|Select the project that contains your custom Insights file."
-msgstr "Selecione o projeto que contém seu arquivo personalizado do Insights."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr "Selecione o projeto que contém o arquivo %{code_start}.gitlab/insights.yml%{code_end} file"
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
+msgstr "Selecione o projeto que contém seu arquivo de Insights personalizado. %{help_link_start}O que é Insights?%{help_link_end}"
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Defina um limite de tamanho para todo o conteúdo em cada site do Pages neste grupo. %{link_start}Saiba mais.%{link_end}"
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr "Defina o nome inicial e as proteções para a ramificação padrão dos novos repositórios criados no grupo."
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr "Defina como 0 para desativar a limitação."
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr "O pipeline de Auto DevOps é executado se nenhum arquivo de configuração de CI for encontrado."
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+msgstr "O número máximo de projetos únicos que um usuário pode baixar dentro do intervalo especificado antes de ser banido. Defina como 0 para desabilitar a limitação."
+
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 "Os projetos neste subgrupo podem ser selecionados como modelos para novos projetos criados no grupo. %{link_start}Saiba mais.%{link_end}"
@@ -18348,8 +18652,8 @@ msgstr "Essa configuração foi aplicada no grupo %{ancestor_group}. Você pode
msgid "GroupSettings|Transfer group"
msgstr "Transferir grupo"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
-msgstr "Os usuários podem criar %{link_start_project}tokens de acesso de projeto%{link_end} e %%{link_start_group}tokens de acesso de grupo%{link_end} neste grupo."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
+msgstr "Os usuários podem criar %{link_start_project}tokens de acesso de projeto%{link_end} e %%{link_start_group}tokens de acesso de grupo%{link_end} neste grupo"
msgid "GroupSettings|What are badges?"
msgstr "O que são selos?"
@@ -18418,10 +18722,10 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Um grupo é uma coleção de vários projetos."
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "Criar novo projeto"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "Criar novo subgrupo"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
msgstr ""
@@ -18480,9 +18784,6 @@ msgstr "Importar grupo"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Importar grupos de outras instância do GitLab"
-msgid "GroupsNew|My Awesome Group"
-msgstr "Meu grupo incrível"
-
msgid "GroupsNew|No import options available"
msgstr "Nenhuma opção de importação disponível"
@@ -18502,7 +18803,7 @@ msgid "GroupsNew|Provide credentials for another instance of GitLab to import yo
msgstr "Forneça as credenciais para outra instância do GitLab para importar seus grupos diretamente."
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
-msgstr "Este recurso foi descontinuado e substituído por %{docs_link_start}migração de grupo%{docs_link_end}."
+msgstr "Este recurso foi descontinuado e substituído pela %{docs_link_start}migração de grupo%{docs_link_end}."
msgid "GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here."
msgstr "Para importar um grupo, navegue até as configurações do grupo para a instância de origem do GitLab, %{link_start}gere um arquivo de exportação%{link_end}e carregue-o aqui."
@@ -18812,7 +19113,7 @@ msgid "Help"
msgstr "Ajuda"
msgid "Help translate GitLab into your language"
-msgstr ""
+msgstr "Ajude a traduzir o GitLab para seu idioma"
msgid "Helps prevent bots from brute-force attacks."
msgstr ""
@@ -18962,12 +19263,12 @@ msgstr "Página inicial"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr "A execução do hook falhou. Certifique-se de que o grupo tenha um projeto com commits."
-msgid "Hook was successfully created."
-msgstr "O Hook foi criado com sucesso."
-
msgid "Hook was successfully updated."
msgstr "O Hook foi atualizado com sucesso."
+msgid "Horizontal rule"
+msgstr "Régua horizontal"
+
msgid "Hostname"
msgstr "Nome do host"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "Hora (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "Manutenção"
@@ -18999,7 +19297,7 @@ msgid "How do I generate it?"
msgstr "Como faço para gerar?"
msgid "How do I mirror repositories?"
-msgstr ""
+msgstr "Como faço para espelhar repositórios?"
msgid "How do I rename an environment?"
msgstr "Como faço para renomear um ambiente?"
@@ -19029,19 +19327,19 @@ msgid "I forgot my password"
msgstr "Esqueci minha senha"
msgid "I want to explore GitLab to see if it’s worth switching to"
-msgstr ""
+msgstr "Eu quero explorar o GitLab para ver se vale a pena mudar para"
msgid "I want to learn the basics of Git"
msgstr "Eu quero aprender o básico do Git"
msgid "I want to move my repository to GitLab from somewhere else"
-msgstr ""
+msgstr "Eu quero mover meu repositório para o GitLab de outro lugar"
msgid "I want to store my code"
msgstr "Eu quero armazenar meu código"
msgid "I want to use GitLab CI with my existing repository"
-msgstr ""
+msgstr "Euquero usar o GitLab CI com meu repositório existente"
msgid "I'd like to receive updates about GitLab via email"
msgstr ""
@@ -19089,7 +19387,7 @@ msgid "IDE|Review"
msgstr "Revisar"
msgid "IDE|Start a new merge request"
-msgstr ""
+msgstr "Iniciar uma nova solicitação de mesclagem"
msgid "IDE|Successful commit"
msgstr "Commit realizado com sucesso"
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr "Criar um projeto"
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr "Verificar sua identidade"
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr "Você sempre pode verificar sua conta posteriormente para criar um grupo."
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20046,7 +20395,7 @@ msgid "InProductMarketing|unsubscribe"
msgstr "cancelar inscrição"
msgid "InProductMarketing|update your preferences"
-msgstr ""
+msgstr "atualize suas preferências"
msgid "InProductMarketing|using a CI/CD template"
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr "Detalhes do alerta"
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr "Tem certeza de que deseja excluir este evento?"
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr "Excluir evento"
+
msgid "Incident|Delete image"
msgstr "Excluir imagem"
@@ -20273,12 +20628,30 @@ msgstr "Editar texto ou link da imagem"
msgid "Incident|Editing %{filename}"
msgstr "Editando %{filename}"
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr "Métricas"
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Resumo"
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Incluir o nome do autor no corpo do e-mail de notificação"
@@ -20420,9 +20799,6 @@ msgstr "Inserir"
msgid "Insert a %{rows}x%{cols} table."
msgstr "Inserir uma tabela %{rows}x%{cols}."
-msgid "Insert a code block"
-msgstr "Inserir um bloco de código-fonte"
-
msgid "Insert a quote"
msgstr "Inserir uma citação"
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr "Ocorreu um erro ao carregar projetos usando configurações personalizadas."
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr "Ramificações para as quais as notificações devem ser enviadas"
@@ -20575,10 +20954,13 @@ msgstr "Detalhe do comentário:"
msgid "Integrations|Comment settings:"
msgstr "Configurações de comentário:"
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr "Detalhes da conexão"
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr "Projetos usando configurações personalizadas"
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr "Voltar ao GitLab para Jira"
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr "Para manter este projeto em andamento, crie uma nova issue."
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr "Usar configurações personalizadas"
@@ -20783,7 +21174,7 @@ msgid "Internal"
msgstr "Interno"
msgid "Internal - The group and any internal projects can be viewed by any logged in user except external users."
-msgstr ""
+msgstr "Interno - O grupo e quaisquer projetos internos podem ser visualizados por qualquer usuário logado, exceto usuários externos."
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr "Interno - O projeto pode ser acessado por qualquer usuário entrado, exceto usuários externos."
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr "Arquivo de configuração de Insights inválido detectado"
@@ -20824,15 +21218,6 @@ msgstr "URL inválida"
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr "Data inválida"
@@ -20875,9 +21260,6 @@ msgstr "Período inválido"
msgid "Invalid pin code."
msgstr "Código PIN inválido."
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr "Tipo de política inválido"
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr "Caminho de repositório inválido"
-msgid "Invalid search parameter"
-msgstr ""
+msgid "Invalid rule"
+msgstr "Regra inválida"
msgid "Invalid server response"
msgstr "Resposta do servidor inválida"
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr "Membros foram adicionados com sucesso"
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Pesquisar um grupo para convidar"
@@ -21046,6 +21428,11 @@ msgstr "Selecione membros ou digite o endereço de e-mail"
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr "Convidado"
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr "Canais e usuários separados por espaços em branco. %{recipients_docs_link}"
@@ -21340,15 +21730,9 @@ msgstr "Novo URL da issue"
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr "O URL para criar uma issue no rastreador de problemas externo."
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr "A URL para o projeto no YouTrack."
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr "O URL do projeto no rastreador de problemas externo."
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr "A URL para visualizar um problema no projeto YouTrack. Deve conter %{colon_id}."
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr "A URL para visualizar um problema no rastreador de problemas externo. Deve conter %{colon_id}."
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr "URL Jaeger"
-
msgid "Jan"
msgstr "Jan"
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr "A tarefa foi apagada"
msgid "Job|Job has been erased by %{userLink}"
msgstr "Ttarefa foi apagada por %{userLink}"
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "Manter"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr "Rolar para baixo"
msgid "Job|Scroll to top"
msgstr "Rolar para o topo"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr "Mostrar raw completo"
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr "Aguardando recurso"
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "permitido falhar"
@@ -22145,7 +22553,7 @@ msgid "Job|manual"
msgstr "manual"
msgid "Job|triggered"
-msgstr ""
+msgstr "disparando"
msgid "Join GitLab today! You and your team can plan, build, and ship secure code all in one application. Get started here for free!"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr "Cluster Kubernetes"
@@ -22330,6 +22735,11 @@ msgstr "Etiqueta"
msgid "Label actions dropdown"
msgstr "Dropdown de ações de etiqueta"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr "Prioridade da etiqueta"
@@ -22554,9 +22964,6 @@ msgstr "Aprenda GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr "Apenas para avaliação"
-
msgid "Learn More"
msgstr "Saiba mais"
@@ -22572,9 +22979,6 @@ msgstr "Saiba como %{no_packages_link_start}publicar e compartilhar seus pacotes
msgid "Learn more"
msgstr "Saiba mais"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr "Saiba mais sobre a %{link_start_tag}configuração do Jaeger %{link_end_tag}."
-
msgid "Learn more about %{username}"
msgstr "Saiba mais sobre o %{username}"
@@ -22635,20 +23039,20 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
+msgid "LearnGitLab|Create a repository"
+msgstr ""
+
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr "Crie um fluxo de trabalho para seu novo espaço de trabalho e aprenda como os recursos do GitLab funcionam juntos:"
msgid "LearnGitLab|Create an issue"
-msgstr ""
-
-msgid "LearnGitLab|Create or import a repository"
-msgstr "Criar ou importar um repositório"
+msgstr "Criar uma issue"
msgid "LearnGitLab|Create or import your first repository into your new project."
msgstr "Crie ou importe seu primeiro repositório em seu novo projeto."
@@ -22687,27 +23091,30 @@ msgid "LearnGitLab|Route code reviews to the right reviewers, every time."
msgstr ""
msgid "LearnGitLab|Run a Security scan using CI/CD"
-msgstr ""
+msgstr "Execute uma verificação de segurança usando CI/CD"
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr ""
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr ""
+
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
-msgstr "Comece uma avaliação gratuita do Ultimate"
-
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22717,7 +23124,7 @@ msgid "LearnGitLab|Try GitLab Ultimate for free"
msgstr ""
msgid "LearnGitLab|Try all GitLab features for 30 days, no credit card required."
-msgstr ""
+msgstr "Confira todos os recursos do GitLab por 30 dias, sem necessidade de cartão de crédito."
msgid "LearnGitLab|Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:"
msgstr ""
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr "Entre em contato com seu administrador para iniciar uma avaliação gratuita do Ultimate."
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr "Ok, vamos lá"
-msgid "LearnGitlab|Trial only"
-msgstr "Apenas avaliação"
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr "Registros"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr "Para ver os registros, implante o seu código em um ambiente."
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr "Torna esta issue confidencial."
-msgid "Manage"
-msgstr "Gerenciar"
-
msgid "Manage %{workspace} labels"
msgstr "Gerenciar etiquetas de %{workspace}"
@@ -23334,9 +23735,6 @@ msgstr "Gerenciar recursos do IDE Web."
msgid "Manage access"
msgstr "Gerenciar acesso"
-msgid "Manage all notifications"
-msgstr "Gerenciar todas as notificações"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "Gerencie aplicativos que podem utilizar o GitLab como um provedor OAuth e aplicativos que você autorizou a utilizar sua conta."
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr "Marcou tarefa como concluída."
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23584,7 +23988,7 @@ msgid "Maximum Terraform Module package file size in bytes"
msgstr ""
msgid "Maximum Users"
-msgstr ""
+msgstr "Usuários máximos"
msgid "Maximum allowable lifetime for access token (days)"
msgstr ""
@@ -24017,7 +24421,7 @@ msgid "Merge commit message"
msgstr "Mensagem do commit mesclado"
msgid "Merge details"
-msgstr ""
+msgstr "Detalhes da mesclagem"
msgid "Merge events"
msgstr "Eventos de mesclagem"
@@ -24058,12 +24462,18 @@ msgstr "Dependências de solicitação de mesclagem"
msgid "Merge request events"
msgstr "Eventos de solicitação de mesclagem"
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr "Relatórios de solicitação de mesclagem"
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr "Erro ao carregar o diff completo. Por favor, tente novamente."
msgid "MergeRequest|No files found"
msgstr "Nenhum arquivo encontrado"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr "Valores"
msgid "Metrics|View documentation"
msgstr "Ver documentação"
-msgid "Metrics|View logs"
-msgstr "Ver registros"
-
msgid "Metrics|Y-axis label"
msgstr "Rótulo do eixo Y"
@@ -25035,7 +25445,7 @@ msgid "MrDeploymentActions|Stop environment"
msgstr "Parar ambiente"
msgid "MrList|Assigned to %{name}"
-msgstr ""
+msgstr "Atribuído a %{name}"
msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr "Múltiplos domínios são suportados."
-
msgid "Multiple model types found: %{model_types}"
msgstr "Vários tipos de modelos encontrados: %{model_types}"
@@ -25082,6 +25504,9 @@ msgstr "Meu tópico"
msgid "My-Reaction"
msgstr "Minha reação"
+msgid "NEW"
+msgstr "NOVO"
+
msgid "Name"
msgstr "Nome"
@@ -25106,9 +25531,6 @@ msgstr "Espaço de nome"
msgid "Namespace ID:"
msgstr "ID do espaço de nome:"
-msgid "Namespace is empty"
-msgstr "O espaço de nome está vazio"
-
msgid "Namespace:"
msgstr "Espaço de nome:"
@@ -25195,24 +25617,24 @@ msgstr "Barra de navegação"
msgid "NavigationTheme|Blue"
msgstr "Azul"
-msgid "NavigationTheme|Dark"
-msgstr "Escuro"
-
msgid "NavigationTheme|Dark Mode (alpha)"
msgstr "Modo escuro (alpha)"
+msgid "NavigationTheme|Gray"
+msgstr ""
+
msgid "NavigationTheme|Green"
msgstr "Verde"
msgid "NavigationTheme|Indigo"
msgstr "Anil"
-msgid "NavigationTheme|Light"
-msgstr "Claro"
-
msgid "NavigationTheme|Light Blue"
msgstr "Azul claro"
+msgid "NavigationTheme|Light Gray"
+msgstr ""
+
msgid "NavigationTheme|Light Green"
msgstr "Verde claro"
@@ -25365,18 +25787,15 @@ msgstr "Novo épico"
msgid "New epic title"
msgstr "Novo título do épico"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Novo arquivo"
msgid "New group"
msgstr "Novo grupo"
-msgid "New group URL"
-msgstr "Novo URL do grupo"
-
-msgid "New group name"
-msgstr "Nome do novo grupo"
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr "Novos usuários definidos para uso externo"
msgid "New! Suggest changes directly"
msgstr "Novo! Sugira alterações diretamente"
-msgid "New..."
-msgstr "Novo..."
-
msgid "Newest first"
msgstr "Mais recente primeiro"
@@ -25527,6 +25943,9 @@ msgstr "Nenhum marco"
msgid "No Scopes"
msgstr "Nenhum escopo"
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr "Nenhum usuário administrador ativo encontrado"
@@ -25557,6 +25976,9 @@ msgstr "Nenhuma ramificação disponível"
msgid "No branches found"
msgstr "Nenhuma ramificação encontrada"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Sem alterarções"
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Nenhuma conexão pode ser feita para um servidor Gitaly, por favor verifique os registros!"
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr "Nenhum contribuidor"
@@ -25674,6 +26093,9 @@ msgstr "Nenhuma licença. Todos os direitos reservados"
msgid "No matches found"
msgstr "Nenhum resultado encontrado"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr "Nenhum grupo acima"
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr "Nenhum pod disponível"
-
msgid "No policy matches this license"
msgstr "Nenhuma política corresponde a essa licença"
@@ -25758,6 +26177,9 @@ msgstr "Nenhuma solicitação de mesclagem relacionada foi encontrada."
msgid "No repository"
msgstr "Nenhum repositório"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25920,7 +26342,7 @@ msgid "NoteForm|Note"
msgstr "Nota"
msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
+msgstr "Suporta %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Para %{quickActionsDocsLinkStart}ações rápidas%{quickActionsDocsLinkEnd}, digite %{keyboardStart}%{keyboardEnd}"
msgid "Notes"
msgstr "Notas"
@@ -25937,9 +26359,15 @@ msgstr "Você tem certeza que quer cancelar a criação deste comentário?"
msgid "Notes|Collapse replies"
msgstr "Recolher respostas"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr "As notas internas são visíveis apenas para o autor, cessionários e membros com a função de Repórter ou superior"
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr "Tornar disso uma nota interna"
@@ -26083,45 +26511,96 @@ msgstr "Notificações deligadas"
msgid "Notifications on"
msgstr "Notificações ligadas"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr "Notificar usuários por e-mail quando o local de login não for reconhecido"
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr "%{commit_link} em %{mr_link}"
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr "Responsável alterado de %{fromNames} para %{toNames}"
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr "Responsável alterado para %{toNames}"
+
msgid "Notify|Author: %{author_name}"
+msgstr "Autor: %{author_name}"
+
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
msgstr ""
-msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgid "Notify|CI/CD project settings"
msgstr ""
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr "A issue foi %{issue_status} por %{updated_by}"
+
msgid "Notify|Issue was moved to another project."
+msgstr "A issue foi movida para outro projeto."
+
+msgid "Notify|Learn more about Auto DevOps"
msgstr ""
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
-msgstr ""
+msgstr "A solicitação de mesclagem %{merge_request} não pode mais ser mesclada devido a conflito."
msgid "Notify|Merge request %{merge_request} was %{mr_status}"
-msgstr ""
+msgstr "A solicitação de mesclagem %{merge_request} foi %{mr_status}"
msgid "Notify|Merge request %{merge_request} was %{mr_status} by %{updated_by}"
-msgstr ""
+msgstr "A solicitação de mesclagem %{merge_request} foi %{mr_status} por %{updated_by}"
msgid "Notify|Merge request %{merge_request} was merged"
-msgstr ""
+msgstr "A solicitação de mesclagem %{merge_request} foi mesclada"
+
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr "A solicitação de mesclagem %{mr_link} foi fechada por %{closed_by}"
msgid "Notify|Merge request URL: %{merge_request_url}"
-msgstr ""
+msgstr "URL de solicitação de mesclagem: %{merge_request_url}"
+
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr "Marco alterado para %{milestone}"
msgid "Notify|New issue: %{project_issue_url}"
msgstr "Nova issue: %{project_issue_url}"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr "Pipeline %{pipeline_link} acionado por"
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr "Essa issue vence em: %{issue_due_date}"
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr "Você não tem acesso ao projeto."
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr "Sua solicitação para participar do %{target_to_join} %{target_type} foi %{denied_tag}."
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -26420,7 +26899,7 @@ msgid "OnDemandScans|DAST configuration"
msgstr "Configuração de DAST"
msgid "OnDemandScans|DAST scans for vulnerabilities in your project's running application, website, or API. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
-msgstr ""
+msgstr "DAST verifica vulnerabilidades no aplicativo, site ou API em execução do seu projeto. Para obter detalhes de todas as opções de configuração, consulte a documentação %{linkStart}GitLab DAST%{linkEnd}."
msgid "OnDemandScans|Define the fundamental configuration options for your on-demand scan."
msgstr "Defina as opções de configuração fundamentais para sua varredura sob demanda."
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] "Mais um item"
msgstr[1] "Mais %d itens"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,36 +27110,39 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
-msgstr ""
+msgid "Only HTTP(S)"
+msgstr "Apenas HTTP(S)"
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr "Apenas membros do projeto"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
+msgstr "Apenas SSH"
+
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
-msgid "Only admins can delete project"
-msgstr "Apenas administradores podem excluir projetos"
-
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr "Inclua apenas novos recursos no seu nível de assinatura atual."
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,11 +27164,11 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
-msgstr "Apenas usuários dos intervalos de endereços IP especificados podem alcançar este grupo, incluindo todos os subgrupos, projetos e repositórios Git."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
-msgstr "Apenas usuários verificados com um endereço de e-mail em qualquer um desses domínios podem ser adicionados ao grupo."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
+msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
msgstr ""
@@ -26778,6 +27263,9 @@ msgstr "Painel de operações"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "O painel de operações fornece um resumo da integridade operacional de cada projeto, incluindo status de pipeline e alerta."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Otimize seu fluxo de trabalho com pipelines CI/CD"
@@ -26796,6 +27284,9 @@ msgstr "Opções"
msgid "Or you can choose one of the suggested colors below"
msgstr "Ou você pode escolher uma das cores sugeridas abaixo"
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr "Organizações"
@@ -26886,6 +27377,9 @@ msgstr "Propriedade de:"
msgid "Owner"
msgstr "Proprietário"
+msgid "Owners and administrators"
+msgstr "Proprietários e administradores"
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26893,7 +27387,7 @@ msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
msgid "PQL|By providing my contact information, I agree GitLab may contact me via email about its product, services and events. You may opt-out at any time by unsubscribing in emails or visiting our communication preference center."
-msgstr ""
+msgstr "Ao fornecer minhas informações de contato, concordo que o GitLab possa entrar em contato comigo por e-mail sobre seus produtos, serviços e eventos. Você pode cancelar a inscrição a qualquer momento cancelando a inscrição em e-mails ou visitando nosso centro de preferências de comunicação."
msgid "PQL|Cancel"
msgstr "Cancelar"
@@ -26905,19 +27399,19 @@ msgid "PQL|Contact sales"
msgstr "Contatar vendas"
msgid "PQL|Hello %{userName}. Before putting you in touch with our sales team, we would like you to verify and complete the information below."
-msgstr ""
+msgstr "Olá %{userName}. Antes de entrar em contato com nossa equipe de vendas, gostaríamos que você verificasse e completasse as informações abaixo."
msgid "PQL|Message for the Sales team (optional)"
-msgstr ""
+msgstr "Mensagem para a equipe de vendas (opcional)"
msgid "PQL|Please select a city or state"
-msgstr ""
+msgstr "Por favor selecione uma cidade ou estado"
msgid "PQL|Submit information"
-msgstr ""
+msgstr "Enviar informações"
msgid "PQL|Thank you for reaching out! Our sales team will get back to you soon."
-msgstr ""
+msgstr "Obrigado por entrar em contato! Nossa equipe de vendas retornará em breve."
msgid "Package Registry"
msgstr "Registro de pacote"
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr "%{boldStart}Permitir duplicatas%{boldEnd} - Aceitar pacotes com o mesmo nome e versão."
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr "Excluir pacote"
msgid "PackageRegistry|Delete this package"
msgstr "Excluir esse pacote"
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr "Erro ao publicar"
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr "Remover pacote"
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 "Use o GitLab como um registro privado para formatos de pacote comuns. %{linkStart}Saiba mais.%{linkEnd}"
-
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
msgstr ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27492,7 +27983,7 @@ msgid "Paste issue link"
msgstr "Colar link de issue"
msgid "Paste link"
-msgstr ""
+msgstr "Colar link"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr "💡 Dica: Visualize e valide seu pipeline"
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr "🚀 Execute seu primeiro pipeline"
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr "Use um modelo baseado na linguagem ou estrutura do seu projeto para come
msgid "Pipelines|Use template"
msgstr "Usar modelo"
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr "Validando a configuração do GitLab CI…"
@@ -28451,6 +28972,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Iniciar"
@@ -28658,12 +29182,6 @@ msgstr "Por favor, aguarde enquanto conectamos ao seu repositório. Atualize à
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Por favor, aguarde enquanto importamos o repositório para você. Atualize à vontade."
-msgid "Pod does not exist"
-msgstr "Pod não existente"
-
-msgid "Pod not found"
-msgstr "Pod não encontrado"
-
msgid "Pods in use"
msgstr "Pods em uso"
@@ -28739,14 +29257,17 @@ msgstr "Cor para linhas adicionadas"
msgid "Preferences|Color for removed lines"
msgstr "Cor para linhas removidas"
+msgid "Preferences|Color theme"
+msgstr "Cor do tema"
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Configure como as datas e horas são exibidas para você."
msgid "Preferences|Customize integrations with third party services."
msgstr "Personalize integrações com serviços de terceiros."
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "Personalize a aparência do cabeçalho do aplicativo e da barra lateral de navegação."
+msgid "Preferences|Customize the color of GitLab."
+msgstr "Personalize a cor do GitLab."
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr "Personalize as cores das linhas removidas e adicionadas em diffs."
@@ -28787,9 +29308,6 @@ msgstr "Largura do layout"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Deve ser um número entre %{min} e %{max}"
-msgid "Preferences|Navigation theme"
-msgstr "Tema de navegação"
-
msgid "Preferences|Preview"
msgstr "Pré-visualizar"
@@ -28818,7 +29336,7 @@ msgid "Preferences|Tab width"
msgstr "Largura da guia"
msgid "Preferences|This feature is experimental and translations are not yet complete."
-msgstr ""
+msgstr "Este recurso é experimental e as traduções ainda não estão completas."
msgid "Preferences|This setting allows you to customize the appearance of the syntax."
msgstr "Esta configuração permite que você personalize a aparência da sintaxe."
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr "Evitar adicionar novos membros a projetos dentro deste grupo"
-
msgid "Prevent auto-stopping"
msgstr "Evitar a parada automática"
@@ -28874,6 +29389,9 @@ msgstr "Pré-visualizar Markdown"
msgid "Preview changes"
msgstr "Visualizar alterações"
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr "Pré-visualização de carga"
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "Conta agendada para remoção."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Ative a entrada com um dos seguintes serviços"
-
msgid "Profiles|Active"
msgstr "Ativo"
@@ -29054,8 +29569,8 @@ msgstr "Adicionar emoji de status"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr "Ocorreu um erro ao atualizar seu nome de usuário, por favor, tente novamente."
-msgid "Profiles|An indicator appears next to your name and avatar"
-msgstr "Um indicador aparece ao lado do seu nome e avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
+msgstr "Um indicador aparece ao lado do seu nome e avatar."
msgid "Profiles|Avatar cropper"
msgstr "Recortar Avatar"
@@ -29081,8 +29596,8 @@ msgstr "Alterar o seu nome de usuário pode ter efeitos colaterais indesejados."
msgid "Profiles|Choose file..."
msgstr "Escolher arquivo..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "Opte por mostrar contribuições de projetos privados em seu perfil público sem quaisquer informações do projeto, repositório ou da organização"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr "Escolha para mostrar contribuições de projetos privados em seu perfil público sem qualquer projeto, repositório ou informações da organização."
msgid "Profiles|City, country"
msgstr "Cidade, país"
@@ -29096,6 +29611,9 @@ msgstr "E-mail de commit"
msgid "Profiles|Connect %{provider}"
msgstr "Conectar %{provider}"
+msgid "Profiles|Connect a service for sign-in."
+msgstr "Conecte um serviço para entrar."
+
msgid "Profiles|Connected Accounts"
msgstr "Contas conectadas"
@@ -29123,8 +29641,8 @@ msgstr "Desconectar %{provider}"
msgid "Profiles|Do not show on profile"
msgstr "Não mostrar no perfil"
-msgid "Profiles|Don't display activity-related personal information on your profile"
-msgstr "Não exibir informações pessoais relacionadas à atividade em seu perfil"
+msgid "Profiles|Don't display activity-related personal information on your profile."
+msgstr "Não exibir informações pessoais relacionadas à atividade em seu perfil."
msgid "Profiles|Edit Profile"
msgstr "Editar perfil"
@@ -29132,17 +29650,17 @@ msgstr "Editar perfil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr "Certifique-se de guardar seus códigos de recuperação da autenticação de dois fatores (2FA) em um local seguro."
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
-msgstr "Digite como seu nome é pronunciado para ajudar as pessoas a tratá-lo corretamente"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
+msgstr "Digite como seu nome é pronunciado para ajudar as pessoas a tratá-lo corretamente."
-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 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 password to confirm the email change"
msgstr "Digite sua senha para confirmar a alteração do e-mail"
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
-msgstr "Preencha seu pronome para que as pessoas saibam como se referir a você"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
+msgstr "Digite seu pronome para que as pessoas sabiam como preferir a você."
msgid "Profiles|Example: MacBook key"
msgstr "Exemplo: tecla do MacBook"
@@ -29174,8 +29692,8 @@ msgstr "Incluir contribuições privadas no meu perfil"
msgid "Profiles|Incoming email token was successfully reset"
msgstr "O token de e-mail recebido foi redefinido com sucesso"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "Aumente a segurança da sua conta ativando a autenticação de dois fatores (A2F)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr "Aumente a segurança da sua conta habilitando a autenticação de dois fatores (2FA)."
msgid "Profiles|Invalid password"
msgstr "Senha inválida"
@@ -29261,14 +29779,14 @@ msgstr "Remover avatar"
msgid "Profiles|Select a service to sign in with."
msgstr "Selecionar um serviço para entrar."
+msgid "Profiles|Service sign-in"
+msgstr "Entrada de serviço"
+
msgid "Profiles|Set new profile picture"
msgstr "Definir nova foto de perfil"
-msgid "Profiles|Set your local time zone"
-msgstr "Definir seu fuso horário local"
-
-msgid "Profiles|Social sign-in"
-msgstr "Entrar com rede social"
+msgid "Profiles|Set your local time zone."
+msgstr "Definir seu fuso horário local."
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "Algumas opções estão indisponíveis para contas LDAP"
@@ -29276,8 +29794,8 @@ msgstr "Algumas opções estão indisponíveis para contas LDAP"
msgid "Profiles|Static object token was successfully reset"
msgstr "O token de objeto estático foi redefinido com sucesso"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "Conte-nos sobre você em menos de 250 caracteres"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr "Conte-nos sobre você em menos de 250 caracteres."
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
@@ -29285,17 +29803,17 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "O tamanho máximo de arquivo permitido é de 200KB."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "Este e-mail será exibido no seu perfil público"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr "Este e-mail será exibido no seu perfil público."
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "Este e-mail será usado para operações baseadas na web, como edições e merges. %{commit_email_link_start}Saiba mais%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr "Este e-mail será usado para operações baseadas na web, como edições e merges. %{commit_email_link_start}Saiba mais.%{commit_email_link_end}"
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Este emoji e mensagem aparecerão no seu perfil e em toda a interface."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Esta informação aparecerá no seu perfil"
+msgid "Profiles|This information will appear on your profile."
+msgstr "Esta informação aparecerá no seu perfil."
msgid "Profiles|Time settings"
msgstr "Configurações de hora"
@@ -29303,7 +29821,7 @@ msgstr "Configurações de hora"
msgid "Profiles|Title"
msgstr "Título"
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr "Autenticação de dois fatores"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,8 +29857,8 @@ msgstr "URL do site"
msgid "Profiles|What's your status?"
msgstr "Qual é o seu status?"
-msgid "Profiles|Who you represent or work for"
-msgstr "Por quem você representa ou trabalha"
+msgid "Profiles|Who you represent or work for."
+msgstr "Por quem você representa ou trabalha."
msgid "Profiles|You can change your avatar here"
msgstr "Você pode alterar o seu avatar aqui"
@@ -29381,6 +29899,9 @@ msgstr "A sua localização foi definida automaticamente com base na sua conta d
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "O seu nome foi definido automaticamente com base na sua conta do %{provider_label} para que as pessoas que conhece possam reconhecê-lo"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr "Seu nome foi definido automaticamente com base na sua conta %{provider_label}, para que as pessoas que você conhece possam reconhecê-lo."
+
msgid "Profiles|Your status"
msgstr "Seu status"
@@ -29459,8 +29980,8 @@ msgstr "Modelos de projeto"
msgid "Project URL"
msgstr "URL do projeto"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
-msgstr "O acesso ao projeto deve ser concedido explicitamente para cada usuário. Se esse projeto é parte de um grupo, o acesso será concedido para os membros do grupo,"
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr "O acesso ao projeto deve ser concedido explicitamente a cada usuário. Se este projeto fizer parte de um grupo, o acesso será concedido aos membros do grupo."
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -29582,6 +30103,9 @@ msgstr "Mantenedores"
msgid "ProjectCreationLevel|No one"
msgstr "Ninguém"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr "Cargos permitidos para criar projetos"
+
msgid "ProjectFileTree|Name"
msgstr "Nome"
@@ -29693,6 +30217,9 @@ msgstr "Pesquisar projetos"
msgid "ProjectSelect|Select a project"
msgstr "Selecionar um projeto"
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr "Insira a nova senha."
msgid "ProjectService|Enter new token"
msgstr "Insira o novo token"
-msgid "ProjectService|Issue URL"
-msgstr "URL da issue"
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29934,7 +30458,7 @@ msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and
msgstr "Manutenção, exportação, arquivamento, alteração de caminho, transferência e exclusão."
msgid "ProjectSettings|How do they differ?"
-msgstr ""
+msgstr "Como eles diferem?"
msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
msgstr "Se os merge trains estiverem ativados, a mesclagem só será possível se a ramificação puder ser rebaseada sem conflitos."
@@ -29985,7 +30509,7 @@ msgid "ProjectSettings|Merge requests"
msgstr "Solicitações de mesclagem"
msgid "ProjectSettings|Merge requests approved for merge are queued, and pipelines validate the combined results of the source and target branches before merge. %{link_start}What are merge trains?%{link_end}"
-msgstr ""
+msgstr "As solicitações de mesclagem aprovadas para mesclagem são enfileiradas e os pipelines validam os resultados combinados das ramificações de origem e destino antes da mesclagem. %{link_start}O que são merge train?%{link_end}"
msgid "ProjectSettings|Merge requests can't be merged if the latest pipeline did not succeed or is still running."
msgstr "As solicitações de mesclagem não podem ser mescladas se o pipeline mais recente não tiver êxito ou ainda estiver em execução."
@@ -30114,7 +30638,7 @@ msgid "ProjectSettings|The default target project for merge requests created in
msgstr "O projeto de destino padrão para solicitações de mesclagem criadas neste projeto de fork."
msgid "ProjectSettings|The default template will be applied on save."
-msgstr ""
+msgstr "O modelo padrão será aplicado ao salvar."
msgid "ProjectSettings|These checks must pass before merge requests can be merged."
msgstr "Essas verificações devem passar antes que solicitações de mesclagem possam ter seus merge realizados."
@@ -30144,7 +30668,7 @@ msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Usuários podem copiar o repositório para um novo projeto."
msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
-msgstr ""
+msgstr "Os usuários só podem enviar commits para este repositório se o e-mail do committer for um de seus próprios e-mails verificados."
msgid "ProjectSettings|Users can request access"
msgstr "Usuários podem solicitar acesso"
@@ -30173,8 +30697,11 @@ msgstr "O que são selos?"
msgid "ProjectSettings|What are merge trains?"
msgstr "O que são merge trains?"
+msgid "ProjectSettings|What is squashing?"
+msgstr "O que é squashing?"
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
-msgstr ""
+msgstr "Quando os pipelines de solicitação de mesclagem são habilitados no arquivo de configuração de CI/CD, os pipelines validam os resultados combinados das ramificações de origem e destino. %{link_start}Como configurar pipelines de solicitação de mesclagem?%{link_end}"
msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
msgstr "Quando a mesclagem semi-linear não é possível, o usuário tem a opção de rebase."
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projetos compartilhados com %{group_name}"
@@ -30377,8 +30907,8 @@ msgstr "Contate um administrador para habilitar opções para importar seu proje
msgid "ProjectsNew|Create"
msgstr "Criar"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
-msgstr "Crie um projeto em branco para armazenar seus arquivos, planejar seu trabalho e colaborar no código, entre outras coisas"
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
+msgstr "Crie um projeto em branco para armazenar seus arquivos, planejar seu trabalho e colaborar no código, entre outras coisas."
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
msgstr "Crie um projeto pré-preenchido com os arquivos necessários para você começar rapidamente."
@@ -30405,7 +30935,7 @@ msgid "ProjectsNew|Import project"
msgstr "Importar projeto"
msgid "ProjectsNew|Include a Getting Started README"
-msgstr ""
+msgstr "Incluir um README de introdução"
msgid "ProjectsNew|Initialize repository with a README"
msgstr "Inicializar repositório com um README"
@@ -30429,7 +30959,7 @@ msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
msgstr "Descrição do projeto %{tag_start}(opcional)%{tag_end}"
msgid "ProjectsNew|Recommended if you're new to GitLab"
-msgstr ""
+msgstr "Recomendado se você é novo no GitLab"
msgid "ProjectsNew|Run CI/CD for external repository"
msgstr "Execute CI/CD para um repositório externo"
@@ -30437,8 +30967,8 @@ msgstr "Execute CI/CD para um repositório externo"
msgid "ProjectsNew|Visibility Level"
msgstr "Nível de visibilidade"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "Quer abrigar vários projetos dependentes no mesmo espaço de nome? %{link_start}Crie um grupo.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
msgid "PrometheusAlerts|exceeded"
msgstr ""
@@ -30596,6 +31126,9 @@ msgstr "Comprar EE"
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr "Comprar GitLab Enterprise Edition"
+msgid "Promotions|Configure Service Desk"
+msgstr "Configurar central de serviços"
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr "Entre em contato com um proprietário do grupo %{namespace_name} para aprimorar o plano."
@@ -30608,6 +31141,9 @@ msgstr "Entre em contato com seu administrador para aprimorar sua licença."
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr "Modelos de descrição permitem que você defina modelos de contextos específicos para issue e descrição de merge requests para seu projeto."
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr "Dispensar promoção de central de serviços"
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30882,7 +31418,7 @@ msgid "ProtectedEnvironment|Select an environment"
msgstr "Selecione um ambiente"
msgid "ProtectedEnvironment|Select groups"
-msgstr ""
+msgstr "Selecionar grupos"
msgid "ProtectedEnvironment|Select users"
msgstr "Selecionar usuários"
@@ -30929,9 +31465,12 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
-msgid "Provide a number our sales team can use to call you."
+msgid "Provide Feedback"
msgstr ""
+msgid "Provide a number our sales team can use to call you."
+msgstr "Forneça um número que nossa equipe de vendas possa usar para ligar para você."
+
msgid "Provider"
msgstr "Provedor"
@@ -31050,7 +31589,7 @@ msgid "PushRules|All committed filenames cannot match this %{wiki_syntax_link_st
msgstr "Todos os nomes de arquivos confirmados não podem corresponder a essa %{wiki_syntax_link_start}expressão regular%{wiki_syntax_link_end}. Se vazio, qualquer nome de arquivo é permitido."
msgid "PushRules|Commit messages cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not rejected based on any expression."
-msgstr "PushRules|Mensagens de commit não podem corresponder a essa %{wiki_syntax_link_start}expressão regular%{wiki_syntax_link_end}. Se estiver vazio, as mensagens de confirmação não serão rejeitadas com base em nenhuma expressão."
+msgstr "Mensagens de commit não podem corresponder a essa %{wiki_syntax_link_start}expressão regular%{wiki_syntax_link_end}. Se estiver vazio, as mensagens de confirmação não serão rejeitadas com base em nenhuma expressão."
msgid "PushRules|Do not allow users to remove Git tags with %{code_block_start}git push%{code_block_end}"
msgstr "Não permitir que os usuários removam tags do Git com %{code_block_start}git push%{code_block_end}"
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr "Rebase"
+msgid "Rebase completed"
+msgstr "Rebase concluído"
+
msgid "Rebase in progress"
msgstr "Rebase em andamento"
@@ -31328,9 +31870,6 @@ msgstr "Referências"
msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
msgstr ""
-msgid "Refresh"
-msgstr "Atualizar"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31469,7 +32008,7 @@ msgid "Related feature flags"
msgstr "Feature flags relacionados"
msgid "Related incidents or issues"
-msgstr ""
+msgstr "Incidentes ou issues relacionadas"
msgid "Related issues"
msgstr "Issues relacionadas"
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr "Reabre este %{quick_action_target}."
msgid "Replace"
msgstr "Substituir"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr "Substituir %{name}"
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr "Responder"
+
msgid "Reply by email"
msgstr "Responder por e-mail"
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr "Noma da classe"
+msgid "Reports|Copy failed test names to run locally"
+msgstr "Copie nomes de teste com falha para executar localmente"
+
+msgid "Reports|Copy failed tests"
+msgstr "Copie testes com falha"
+
msgid "Reports|Execution time"
msgstr "Tempo de execução"
@@ -32214,7 +32762,7 @@ msgid "Repository check"
msgstr "Verificação do repositório"
msgid "Repository check was triggered."
-msgstr ""
+msgstr "A verificação do repositório foi disparanda."
msgid "Repository checks"
msgstr "Verificações do repositório"
@@ -32351,9 +32899,6 @@ msgstr "Requisições por período"
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr "Exigir que todos os usuários neste grupo configurem a autenticação de dois fatores"
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32397,8 +32942,8 @@ msgstr[1] "Requer %d aprovações de usuários qualificados."
msgid "Requires %{count} approval from %{names}."
msgid_plural "Requires %{count} approvals from %{names}."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Requer %{count} aprovação de %{names}."
+msgstr[1] "Requer %{count} aprovações de %{names}."
msgid "Requires values to meet regular expression requirements."
msgstr "Requer que valores atendam aos requisitos de expressão regular."
@@ -32430,6 +32975,9 @@ msgstr "Reenviar instruções de desbloqueio"
msgid "Reset"
msgstr "Redefinir"
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr "Redefinir arquivo"
@@ -32439,9 +32987,6 @@ msgstr "Redefinir filtros"
msgid "Reset health check access token"
msgstr "Recriar o token de status de saúde"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr "Redefinir senha"
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr "Restringir acesso por endereço IP"
+
msgid "Restrict membership by email domain"
msgstr "Restringir a participação por domínio de e-mail"
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Refazer tarefa"
@@ -32766,7 +33308,7 @@ msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spa
msgstr ""
msgid "Runners|A new version is available"
-msgstr ""
+msgstr "Uma nova versão está disponível"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
msgstr ""
@@ -32870,7 +33412,7 @@ msgid "Runners|Download latest binary"
msgstr "Baixar o último binário"
msgid "Runners|Edit your search and try again"
-msgstr ""
+msgstr "Edite sua pesquisa e tente novamente"
msgid "Runners|Enable stale runner cleanup"
msgstr ""
@@ -32885,11 +33427,14 @@ msgid "Runners|Executor"
msgstr "Executor"
msgid "Runners|Get started with runners"
-msgstr ""
+msgstr "Comece com os executores"
msgid "Runners|Group"
msgstr "Grupo"
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr "Endereço de IP"
@@ -32936,7 +33481,7 @@ msgid "Runners|New registration token generated!"
msgstr "Novo token de registro gerado!"
msgid "Runners|No results found"
-msgstr ""
+msgstr "Nenhum resultado encontrado"
msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr "Revisão"
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr "Executor"
@@ -33028,7 +33570,7 @@ msgid "Runners|Runner %{name} was deleted"
msgstr ""
msgid "Runners|Runner assigned to project."
-msgstr ""
+msgstr "Executor atribuído ao projeto."
msgid "Runners|Runner cannot be deleted, please contact your administrator"
msgstr ""
@@ -33150,7 +33692,7 @@ msgid "Runners|This runner is available to all projects and subgroups in a group
msgstr ""
msgid "Runners|This runner is outdated, an upgrade is recommended"
-msgstr ""
+msgstr "Este executor está desatualizado, uma atualização é recomendada"
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr "Atualização disponível"
+
+msgid "Runners|Upgrade recommended"
+msgstr "Atualização recomendada"
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33222,10 +33773,10 @@ msgid "Runners|stale"
msgstr "obsoleto"
msgid "Runners|upgrade available"
-msgstr ""
+msgstr "atualização disponível"
msgid "Runners|upgrade recommended"
-msgstr ""
+msgstr "atualização recomendada"
msgid "Running"
msgstr "Executando"
@@ -33248,6 +33799,21 @@ msgstr "Tokens de descoberta de SAML"
msgid "SAML for %{group_name}"
msgstr "SAML para %{group_name}"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr "Configuração de SAST"
@@ -33898,6 +34464,9 @@ msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request
msgstr ""
msgid "SecurityOrchestration|+%{count} more"
+msgstr "+%{count} mais"
+
+msgid "SecurityOrchestration|, and %{count} more"
msgstr ""
msgid "SecurityOrchestration|.yaml mode"
@@ -33915,8 +34484,8 @@ msgstr "Adicionar regra"
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
-msgstr ""
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
+msgstr "Depois de ativar uma política de nível de grupo, esta política se aplica automaticamente a todos os projetos e subgrupos neste grupo."
msgid "SecurityOrchestration|All policies"
msgstr "Todas as políticas"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr "Descrição"
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr "Ativado"
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr "Aplicar segurança para este projeto. %{linkStart}Mais informações.%{linkEnd}"
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr "Política de execução de verificação"
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr "Resultado da verificação"
@@ -34153,10 +34728,10 @@ msgid "SecurityOrchestration|This group"
msgstr "Este grupo"
msgid "SecurityOrchestration|This is a group-level policy"
-msgstr ""
+msgstr "Esta é uma política de nível de grupo"
msgid "SecurityOrchestration|This is a project-level policy"
-msgstr ""
+msgstr "Esta é uma política de nível de projeto"
msgid "SecurityOrchestration|This policy is inherited from %{namespace}"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr "Use uma política de resultados de verificação para criar regras que garantam que as issues de segurança sejam verificados antes de mesclar uma solicitação de mesclagem."
@@ -34209,18 +34787,6 @@ msgstr "ramificação"
msgid "SecurityOrchestration|branches"
msgstr "ramificações"
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr "Ferramenta"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr "Selecionar perfil"
msgid "Select a branch"
msgstr "Selecionar uma ramificação"
+msgid "Select a branch to compare"
+msgstr "Selecione uma ramificação para comparar"
+
+msgid "Select a color"
+msgstr "Selecionar uma cor"
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr "Selecione uma estrutura de conformidade para aplicar a este projeto. %{linkStart}Como estes são adicionados?%{linkEnd}"
@@ -34695,6 +35261,9 @@ msgstr "Selecionar fonte"
msgid "Select source branch"
msgstr "Selecionar ramificação de origem"
+msgid "Select source project"
+msgstr "Selecionar fonte do projeto"
+
msgid "Select start date"
msgstr "Selecionar data de início"
@@ -34716,6 +35285,9 @@ msgstr "Selecionar ramificação de destino"
msgid "Select target branch or tag"
msgstr "Selecionar branch de destino ou tag"
+msgid "Select target project"
+msgstr "Selecionar alvo do projeto"
+
msgid "Select timezone"
msgstr "Selecionar fuso horário"
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "Definir padrão e restringir os níveis de visibilidade. Configurar fontes de importação e protocolo de acesso git."
-
msgid "Set due date"
msgstr "Definir validade"
@@ -35004,6 +35573,9 @@ msgstr "Selecionar ramificação de destino"
msgid "Set target branch to %{branch_name}."
msgstr "Definir ramificação de destino à %{branch_name}."
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr "Defina a ramificação padrão para este projeto. Todas as merge requests e commits são feitos nessa ramificação, a menos que você especifique um diferente."
@@ -35067,6 +35639,9 @@ msgstr "Definir uma nova senha"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Configure seu projeto para fazer push e/ou pull de um repositório para outro automaticamente. Branches, tags e commits serão sincronizados automaticamente."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr "Defina a visibilidade do conteúdo do projeto. Configure fontes de importação e protocolos de acesso Git."
+
msgid "Set weight"
msgstr "Definir peso"
@@ -35330,9 +35905,66 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Mostrar as alterações de espaço em branco"
-msgid "Showing %{conflict}"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
msgstr ""
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
+msgid "Showing %{conflict}"
+msgstr "Mostrando %{conflict}"
+
msgid "Showing %{count} of %{total} projects"
msgstr "Mostrando %{count} de %{total} projetos"
@@ -35353,9 +35985,6 @@ msgstr "Mostrando todos os épicos"
msgid "Showing all issues"
msgstr "Mostrando todas as issues"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr "Mostrando dados para itens de fluxo de trabalho criados neste intervalo de datas. Período limitado a %{maxDateRange} dias."
@@ -35371,6 +36000,9 @@ msgstr "Mostrando a última versão"
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "Lado a lado"
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr "Snowplow"
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr "Solução"
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Algo deu errado, incapaz de adicionar %{project} ao dashboard"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36098,10 +36730,10 @@ msgid "Source branch"
msgstr "Ramificação de origem"
msgid "Source branch will be deleted."
-msgstr ""
+msgstr "A ramificação de origem será excluída."
msgid "Source branch will not be deleted."
-msgstr ""
+msgstr "A ramificação de origem não será excluída."
msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}"
msgstr "Branch de origem: %{source_branch_open}%{source_branch}%{source_branch_close}"
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36428,7 +37060,7 @@ msgid "StatusCheck|Check for a status response in merge requests. Failures do no
msgstr "Verifique se há uma resposta de status nas solicitações de mesclagem. As falhas não bloqueiam as mesclagens. %{link_start}Saiba mais%{link_end}"
msgid "StatusCheck|Examples: QA, Security."
-msgstr ""
+msgstr "Exemplos: QA, Segurança."
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
@@ -36562,6 +37194,9 @@ msgstr "Armazenamento:"
msgid "StorageSize|Unknown"
msgstr "Desconhecido"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,8 +37218,8 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr "Permitido criar subgrupos"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr "Cargos permitidos para criar subgrupos"
msgid "SubgroupCreationlevel|Allowed to create subgroups"
msgstr "Permitido criar subgrupos"
@@ -36601,6 +37236,9 @@ msgstr "Subgrupos"
msgid "Subgroups and projects"
msgstr "Subgrupos e projetos"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr "Subgrupos podem configurar suas próprias regras de autenticação de dois fatores"
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr "Inscrito neste projeto"
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr "Assinatura"
@@ -36692,7 +37333,7 @@ msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionBanner|Upload new license"
-msgstr ""
+msgstr "Carregar nova licença"
msgid "SubscriptionTable|Add seats"
msgstr "Adicionar lugares"
@@ -36917,7 +37558,7 @@ msgid "SuggestedColors|Gray"
msgstr "Cinza"
msgid "SuggestedColors|Green"
-msgstr ""
+msgstr "Verde"
msgid "SuggestedColors|Green screen"
msgstr "Tela verde"
@@ -36938,7 +37579,7 @@ msgid "SuggestedColors|Orange"
msgstr "Laranja"
msgid "SuggestedColors|Purple"
-msgstr ""
+msgstr "Roxo"
msgid "SuggestedColors|Red"
msgstr "Vermelho"
@@ -36970,8 +37611,11 @@ msgstr ""
msgid "Summary"
msgstr "Resumo"
-msgid "Summary / Note"
-msgstr "Resumo / Nota"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
+msgstr ""
msgid "Sunday"
msgstr "Domingo"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr "Suporte"
@@ -37152,6 +37799,21 @@ msgstr "URL da página de suporte"
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr "Trocar ramificações"
@@ -37227,9 +37889,6 @@ msgstr "Padrão do sistema (%{default})"
msgid "System header and footer"
msgstr "Cabeçalho e rodapé do sistema"
-msgid "System hook was successfully updated."
-msgstr "O hook de sistema foi atualizado com sucesso."
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr "ID da tarefa: %{elastic_task}"
+msgid "Task list"
+msgstr "Listas de tarefas"
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr "%{rate}%{sign} taxa de sucesso"
msgid "TestReports|Attachment"
msgstr "Anexo"
+msgid "TestReports|Copy test name to rerun locally"
+msgstr "Copie o nome do teste para executar novamente localmente"
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37965,7 +38630,7 @@ msgid "The current epic"
msgstr "O épico atual"
msgid "The current incident"
-msgstr ""
+msgstr "O incidente atual"
msgid "The current issue"
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr "O domínio que você digitou não é permitido."
msgid "The download link will expire in 24 hours."
msgstr "O link para download irá expirar em 24 horas."
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr "A quantidade máxima de tempo que os usuários têm para configurar a autenticação de dois fatores antes de ser aplicada."
+
msgid "The maximum file size allowed is %{size}."
msgstr "O tamanho máximo do arquivo é %{size}."
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr "O número de alterações a serem buscadas no GitLab ao clonar um repositório. Valores mais baixos podem acelerar a execução do pipeline. Defina como %{code_open}0%{code_close} ou em branco para buscar todas as ramificações e tags para cada tarefa"
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr "O número de solicitações de mesclagem mescladas por mês."
@@ -38232,21 +38900,12 @@ msgstr "Os agendamentos de pipelines rodam pipelines no futuro, de forma repetid
msgid "The project can be accessed by any logged in user except external users."
msgstr "O projeto pode ser acessado por qualquer usuário entrado, exceto usuários externos."
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr "O projeto pode ser acessado por qualquer pessoa, independentemente da autenticação."
-
msgid "The project can be accessed without any authentication."
msgstr "O projeto pode ser acessado sem a necessidade de autenticação."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr "O projeto é acessível apenas por membros do projeto. O acesso deve ser concedido explicitamente para cada usuário(a)."
-
msgid "The project is still being deleted. Please try again later."
msgstr "O projeto ainda está sendo excluído. Por favor, tente mais tarde."
@@ -38460,6 +39119,9 @@ msgstr "Não há pacotes ainda"
msgid "There are no projects shared with this group yet"
msgstr "Não há projetos compartilhados com esse grupo ainda"
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ 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 fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39019,13 +39687,13 @@ msgid "This is your current session"
msgstr "Esta é a sua sessão atual"
msgid "This issue cannot be assigned to a confidential epic because it is public."
-msgstr ""
+msgstr "Essa issue não pode ser atribuída a um épico confidencial porque é público."
msgid "This issue cannot be made public because it belongs to a confidential epic."
msgstr ""
msgid "This issue is confidential and should only be visible to team members with at least Reporter access."
-msgstr ""
+msgstr "Essa issue é confidencial e deve ser visível apenas para membros da equipe com pelo menos acesso de Repórter."
msgid "This issue is currently blocked by the following issues:"
msgstr "Essa issue está atualmente bloqueada pelas seguintes issues:"
@@ -39129,9 +39797,6 @@ msgstr "Essa tarefa exige uma ação manual"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr "Este projeto será excluído em %{date}"
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr "Este executor somente será executado em Pipelines acionados em ramifica
msgid "This setting can be overridden in each project."
msgstr "Essa configuração pode ser substituída em cada projeto."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr "Isso invalidará seus aplicativos registrados e dispositivos U2F / WebAu
msgid "This will invalidate your registered applications and U2F devices."
msgstr "Isso invalidará seus aplicativos registrados e dispositivos U2F."
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr "Isso removerá o relacionamento do fork entre esse projeto e %{fork_source}"
@@ -39357,9 +40022,6 @@ msgstr "Hora"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr "Tempo (em horas) que os usuários têm permissão para ignorar a configuração forçada da autenticação de dois fatores."
-msgid "Time Spent"
-msgstr "Tempo gasto"
-
msgid "Time based: Yes"
msgstr "Baseado no tempo: Sim"
@@ -39369,9 +40031,6 @@ msgstr "Tempo até que uma issue seja agendada"
msgid "Time before an issue starts implementation"
msgstr "Tempo até que uma issue comece a ser implementado"
-msgid "Time before enforced"
-msgstr "Tempo antes de reforço"
-
msgid "Time between merge request creation and merge/close"
msgstr "Tempo entre a criação da solicitação de incorporação e a aceitação/fechamento"
@@ -39423,6 +40082,12 @@ msgstr "Est"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Estimado:"
@@ -39614,7 +40279,7 @@ msgid "Titles and Descriptions"
msgstr "Títulos e descrições"
msgid "To"
-msgstr ""
+msgstr "Para"
msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
msgstr "Para %{link_to_help} de seu domínio, adicione a chave acima a um registro TXT dentro da sua configuração DNS."
@@ -39638,7 +40303,7 @@ msgid "To access this domain create a new DNS record"
msgstr "Para acessar este domínio crie um novo registro DNS"
msgid "To activate your trial, we need additional details from you."
-msgstr ""
+msgstr "Para ativar sua avaliação, precisamos de detalhes adicionais de você."
msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr "Alternar atalhos"
msgid "Toggle sidebar"
msgstr "Ativar/Desativar barra lateral"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr "Alternar a barra de desempenho"
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr "Muitas referências. Ações rápidas são limitadas a no máximo %{max_count} referências de usuários"
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr "Muitos usuários encontrados. Ações rápidas são limitadas a no máximo %{max_count} usuários"
+
msgid "TopNav|Go back"
msgstr "Voltar"
msgid "Topic %{topic_name} was successfully created."
msgstr "O trópico %{topic_name} foi criado com sucesso."
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr "Avatar do tópico"
@@ -40009,9 +40683,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-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"
@@ -40168,9 +40839,6 @@ msgstr "Número de funcionários"
msgid "Trial|Please select a country"
msgstr "Por favor selecione um país"
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr "Número de telefone"
@@ -40184,7 +40852,7 @@ msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your
msgstr "Sua avaliação do GitLab Ultimate dura 30 dias, mas você pode manter sua conta GitLab gratuita para sempre. Precisamos apenas de algumas informações adicionais para ativar sua avaliação."
msgid "Trigger"
-msgstr ""
+msgstr "Gatilho"
msgid "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."
msgstr "Acione um pipeline para uma ramificação ou tag gerando um token de gatilho e usando-o com uma chamada de API. O token representa o acesso e as permissões do projeto de um usuário."
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr "inválido"
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "Solucionar problemas e monitorar sua aplicação com rastreamento"
-
msgid "Trusted"
msgstr ""
@@ -40253,7 +40918,7 @@ msgid "Try again?"
msgstr "Tentar novamente?"
msgid "Try all GitLab features for free for 30 days. No credit card required."
-msgstr ""
+msgstr "Experimente todos os recursos do GitLab gratuitamente por 30 dias. Não é necessário cartão de crédito."
msgid "Try all GitLab has to offer for 30 days."
msgstr "Use tudo que o GitLab tem para oferecer por 30 dias."
@@ -40327,6 +40992,9 @@ msgstr "Autenticação de dois fatores"
msgid "Two-factor authentication disabled"
msgstr "Autenticação de dois fatores desativada"
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr "A autenticação de dois fatores foi desativada para este usuário"
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr "Não foi possível conectar ao servidor Prometheus"
@@ -40429,9 +41094,6 @@ msgstr "Não foi possível conectar ao servidor: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr "Não é possível carregar o diff. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr "Não é possível analisar as opções do relatório de vulnerabilidade."
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr "Desarquivar projeto"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr "Desconhecido"
msgid "Unknown Error"
msgstr "Erro desconhecido"
-msgid "Unknown cache key"
-msgstr "Chave de cache desconhecida"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr "Desbloqueou a discussão."
msgid "Unlocks the discussion."
msgstr "Desbloqueia a discussão."
-msgid "Unmarked this %{noun} as a draft."
-msgstr "Desmarcou este %{noun} como rascunho."
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr "Desmarca este %{noun} como um rascunho."
-
msgid "Unreachable"
msgstr "Inacessível"
@@ -40825,11 +41478,8 @@ msgstr "Enviar novo arquivo"
msgid "Upload object map"
msgstr "Enviar mapa de objetos"
-msgid "UploadLink|click to upload"
-msgstr "clique para fazer upload"
-
-msgid "Uploaded"
-msgstr "Enviado"
+msgid "Uploaded date"
+msgstr ""
msgid "Uploading changes to terminal"
msgstr "Enviando mudanças ao terminal"
@@ -40873,9 +41523,6 @@ msgstr "Artefatos é uma soma de artefatos de construção e pipeline."
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Amostras de áudio, vídeos, conjuntos de dados e gráficos."
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr "Por causa de uma issue conhecida, o total de artefatos para alguns projetos pode estar incorreto. Para mais detalhes, leia %{warningLinkStart}o épico%{warningLinkEnd}"
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Comprar minutos adicionais"
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr "Algo deu errado ao obter estatísticas de armazenamento do projetot"
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "Armazenamento"
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr "Os usuários podem solicitar acesso (se a visibilidade for pública ou interna)"
+
+msgid "Users cannot be added to projects in this group"
+msgstr "Os usuários não podem ser adicionados a projetos neste grupo"
+
msgid "Users in License"
msgstr "Usuários com licença"
@@ -41752,7 +42408,7 @@ msgid "ValueStreamAnalytics|Go to docs"
msgstr "Ir para docs"
msgid "ValueStreamAnalytics|Key metrics"
-msgstr ""
+msgstr "Métricas-chave"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "Tempo médio em que um incidente foi aberto em um ambiente de produção no período de tempo determinado."
@@ -41782,7 +42438,7 @@ msgid "ValueStreamAnalytics|Shows %{selectedFiltersDescription} for group '%{gro
msgstr ""
msgid "ValueStreamAnalytics|Tasks by type"
-msgstr ""
+msgstr "Tarefas por tipo"
msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr "Ver documentação"
-
msgid "View Stage: %{title}"
msgstr "Ver estágio: %{title}"
@@ -41933,9 +42586,6 @@ msgstr "Ver detalhes: %{details_url}"
msgid "View documentation"
msgstr "Ver documentação"
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "Visualizar aprovadores elegíveis"
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Queremos ter certeza de que é você, confirme que você não é um robô."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42829,7 +43479,7 @@ msgid "Welcome, %{name}!"
msgstr "Bem-vindo, %{name}!"
msgid "What are CI/CD minutes?"
-msgstr ""
+msgstr "O que são minutos de CI/CD?"
msgid "What are group audit events?"
msgstr "O que são eventos de auditoria em grupo?"
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr "Com os requisitos, pode estabelecer critérios para comprovar sus produtos."
@@ -43169,19 +43822,36 @@ msgstr "Adicionar"
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr "Adicionar responsável"
+
+msgid "WorkItem|Add assignees"
+msgstr "Adicionar responsáveis"
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43322,7 +43992,7 @@ msgid "You are attempting to update a file that has changed since you started ed
msgstr "Você está tentando atualizar um arquivo que foi alterado desde que você começou a editá-lo."
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
-msgstr ""
+msgstr "Você será cobrado se exceder esse número. %{qsrOverageLinkStart}Como funciona o faturamento?%{qsrOverageLinkEnd}"
msgid "You are connected to the Prometheus server, but there is currently no data to display."
msgstr "Você está conectado ao servidor Prometheus, mas atualmente não há dados para exibir."
@@ -43348,7 +44018,7 @@ msgstr "Você irá transferir %{project_full_name} para outro espaço de nome. T
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr "Você vai desligar a confidencialidade. Isso significa que %{strongStart}todos%{strongEnd} poderão ver e deixar um comentário sobre essa %{issuableType}."
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "Você só pode editar arquivos quando estiver em uma ramificação"
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr "Você só pode transferir o projeto para espaços de nome que você gerencia."
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Você pode resolver o conflito de mesclagem usando o modo Interativo, escolhendo os botões %{use_ours} ou %{use_theirs} ou editando os arquivos diretamente. Confirme essas mudanças em %{branch_name}"
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Você não pode acessar o arquivo bruto. Por favor, aguarde um minuto."
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr "Você não pode se passar por um usuário bloqueado"
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr "Você não tem permissões suficientes para remover este banimento de espaço de nome"
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr "Você precisa de uma licença diferente para ativar o recurso FileLocks"
@@ -43870,7 +44537,7 @@ msgid "You will be removed from existing projects/groups"
msgstr "Você será removido de projetos/grupos existentes"
msgid "You will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
-msgstr ""
+msgstr "Você será o autor de todos os eventos no feed de atividades que são o resultado de uma atualização, como novos branches sendo criados ou novos commits sendo enviados para os branches existentes."
msgid "You will first need to set up Jira Integration to use this feature."
msgstr "Primeiro, você precisa configurar a integração com o Jira para usar este recurso."
@@ -43935,18 +44602,36 @@ msgstr "Você não tem permissão para fazer alterações neste projeto diretame
msgid "You're receiving this email because of your account on %{host}."
msgstr "Você está recebendo este e-mail devido à sua conta no %{host}."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Você está recebendo este e-mail devido à sua conta no %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr "Você está recebendo este e-mail devido à sua atividade no %{host}."
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "Você está recebendo este e-mail porque foi mencionado no %{host}."
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "Você já ativou a autenticação de dois fatores usando autenticadores de senha única. Para registrar um dispositivo diferente, você deve primeiro desativar a autenticação de dois fatores."
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr "Sua conta %{host} foi conectada a partir de um novo local"
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr "Seu token de redefinição de senha expirou."
@@ -44226,6 +44899,9 @@ msgstr "Seu endereço de e-mail primário é usado para detecção de avatar. Vo
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr "Seu nome de usuário é %{username}."
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "um usuário excluído"
@@ -44388,6 +45070,9 @@ msgstr "alerta"
msgid "allowed to fail"
msgstr "permitido falhar"
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr "atribuir a si mesmo"
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr "%{reportType}: Carregamento resultou em um erro"
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr "Todos os clusters"
+
msgid "ciReport|All projects"
msgstr "Todos os projetos"
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr "fechado"
+msgid "closed %{timeago}"
+msgstr "fechado em %{timeago}"
+
msgid "closed issue"
msgstr "issue fechada"
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr "ramificação padrão"
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr "negada"
+
msgid "deploy"
msgstr "implantar"
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr "Seguindo"
+msgid "for"
+msgstr "para"
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "para %{link_to_merge_request} com %{link_to_merge_request_source_branch}"
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr "grupos e projetos"
+
+msgid "groups only"
+msgstr "apenas grupos"
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45373,10 +46087,10 @@ msgid "most recent deployment"
msgstr ""
msgid "mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}%{squashedCommits}."
-msgstr ""
+msgstr "%{commitCount} e %{mergeCommitCount} será adicionado à %{targetBranch}%{squashedCommits}."
msgid "mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}."
-msgstr ""
+msgstr "%{commitCount} será adicionado à %{targetBranch}."
msgid "mrWidgetCommitsAdded|1 merge commit"
msgstr "1 merge commit"
@@ -45427,10 +46141,10 @@ msgid "mrWidget|A new merge train has started and this merge request is the firs
msgstr ""
msgid "mrWidget|Added to the merge train by %{merge_author}"
-msgstr ""
+msgstr "Adicionado ao merge train na por %{merge_author}"
msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
-msgstr ""
+msgstr "Adicionado aomerge train. Há %{mergeTrainPosition} solicitações de mesclagem aguardando para serem mescladas"
msgid "mrWidget|An error occurred while removing your approval."
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr "A aprovação é opcional"
msgid "mrWidget|Approval password is invalid."
msgstr "A senha de aprovação é inválida."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Aprovar"
@@ -45522,13 +46242,13 @@ msgid "mrWidget|Hide %{widget} details"
msgstr "Ocultar detalhe de %{widget}"
msgid "mrWidget|If the %{type} branch exists in your local repository, you can merge this merge request manually using the command line."
-msgstr ""
+msgstr "Se o branch %{type} existir em seu repositório local, você poderá fazer merge request manualmente usando a linha de comando."
msgid "mrWidget|If the last pipeline ran in the fork project, it may be inaccurate. Before merge, we advise running a pipeline in this project."
msgstr "Se o ultimo pipeline foi executado no fork do projeto, pode ser impreciso. Antes de fazer o merge, recomendamos a execução de um pipeline nesse projeto"
msgid "mrWidget|Jump to first unresolved thread"
-msgstr ""
+msgstr "Ir para o primeiro tópico não resolvido"
msgid "mrWidget|Learn more"
msgstr "Saiba mais"
@@ -45550,6 +46270,9 @@ msgstr[1] "Issues mencionadas"
msgid "mrWidget|Merge"
msgstr "Mesclar"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr "Mesclagem bloqueada: todos os tópicos devem ser resolvidos."
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,9 +46336,12 @@ msgstr "Mesclando! Estamos quase lá…"
msgid "mrWidget|More information"
msgstr "Mais informações"
-msgid "mrWidget|Please restore it or use a different %{type} branch."
+msgid "mrWidget|No users match the rule's criteria."
msgstr ""
+msgid "mrWidget|Please restore it or use a different %{type} branch."
+msgstr "Por favor, restaurar ou usar um branch %{type} diferente."
+
msgid "mrWidget|Ready to be merged automatically. Ask someone with write access to this repository to merge this request"
msgstr "Pronto para ser mesclado automaticamente. Peça a alguém com acesso de gravação a este repositório para mesclar nessa requisição"
@@ -45656,16 +46379,16 @@ msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the p
msgstr ""
msgid "mrWidget|Set by %{merge_author} to be merged automatically when the pipeline succeeds"
-msgstr ""
+msgstr "Defindo por %{merge_author} para ser realizado merge automaticamente quando o pipeline for bem sucedido"
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
-msgstr ""
+msgstr "Definido por %{merge_author} para iniciar um merge train quando o pipeline for bem-sucedido"
msgid "mrWidget|Show %{widget} details"
msgstr "Exibir detalhes de %{widget}"
msgid "mrWidget|The %{type} branch %{codeStart}%{name}%{codeEnd} does not exist."
-msgstr ""
+msgstr "A ramificação %{type} %{codeStart}%{name}%{codeEnd} não existe."
msgid "mrWidget|The changes were merged into"
msgstr "Houve merge das alterações em"
@@ -45814,6 +46537,12 @@ msgstr "%{item}, e %{lastItem}"
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "pai"
msgstr[1] "pais"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "senha"
@@ -45881,12 +46616,6 @@ msgstr "Use o botão %{boldStart}confirmar mudanças%{boldEnd} na parte inferior
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr "Você pode usar a árvore de arquivos para visualizar seus arquivos de configuração de pipeline. %{linkStart}Saiba mais%{linkEnd}"
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] "ponto"
@@ -46037,6 +46766,9 @@ msgstr "Desconhecido"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46140,7 +46872,7 @@ msgid "toggle collapse"
msgstr "Ocultar/Expandir"
msgid "triggered"
-msgstr ""
+msgstr "disparado"
msgid "two-factor authentication settings"
msgstr "configurações de autenticação de dois fatores"
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index 0f05ffbf979..7edff0a17e9 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d camada"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 Dia"
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Tokens de Acesso"
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Conta"
@@ -2037,9 +2078,6 @@ msgstr "Adicionar CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Adicionar CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Adicionar URL Jaeger"
-
msgid "Add Kubernetes cluster"
msgstr "Adicionar cluster Kubernetes"
@@ -2070,9 +2108,6 @@ msgstr "Adicionar uma chave GPG"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 "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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "A adição de novas aplicações está desativada na tua instância do GitLab. Entra em contacto com o teu administrador do GitLab para obter a permissão"
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "Minutos adicionais"
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domínio Auto DevOps"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr "A2F Desativada"
msgid "AdminUsers|2FA Enabled"
msgstr "A2F Ativada"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr "Bloqueado"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr "És tu!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr "Pesquisar utilizadores"
msgid "AdminUsers|Send email to users"
msgstr "Enviar email aos utilizadores"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "Ordenar por"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Permitir que \"%{group_name}\" adicione-te"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr "Permitir que projetos dentro deste grupo usem o Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Permitir que os utilizadores se registem a qualquer aplicação para usar o GitLab como um fornecedor OAuth"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "Permissão para falhar"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Permite -te adicionar e gerir clusters do Kubernetes."
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Ocorreu um erro ao assinar as notificações."
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "Definições da aplicação salvas com sucesso"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr "Projeto arquivado! Repositório e outros recursos de projeto são soment
msgid "Archived projects"
msgstr "Projetos arquivados"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Tens a certeza de que queres remover %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Tens a certeza de que desejas remover o anexo?"
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Tens a certeza de que queres reiniciar o token de verificação de saúde?"
@@ -5043,6 +5123,9 @@ msgstr "Atribuir etiquetas"
msgid "Assign milestone"
msgstr "Atribuir objetivo"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr "Anexar um ficheiro"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Anexar um ficheiro ao arrastar &amp; soltar ou %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "ago"
@@ -5752,9 +5847,6 @@ msgstr "Tem cuidado. Alterar o espaço de nomes do projeto pode ter efeitos secu
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Tem cuidado. Renomear o repositório de um projeto pode ter efeitos secundários indesejados."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Importação de Servidores Bitbucket"
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr "Alterações suprimidas Clica para mostrar."
msgid "Changes the title to \"%{title_param}\"."
msgstr "Altera o título para \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Problemas Fechados"
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Escolhe qual dos teus ambientes usarás este cluster."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr "Sabias que?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ 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 certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr "Os Ambientes são lugares onde o código é implantado, como preparaçã
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr "Definições globais de notificação"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr "Erro ao carregar o diff completo. Por favor, tenta novamente."
msgid "MergeRequest|No files found"
msgstr "Nenhum ficheiro encontrado"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,8 +29857,8 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
-msgstr "Para quem representas ou trabalhas"
+msgid "Profiles|Who you represent or work for."
+msgstr ""
msgid "Profiles|You can change your avatar here"
msgstr ""
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr "Responsáveis"
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projetos compartilhados com %{group_name}"
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr "Assinatura"
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr "Página URL de suporte"
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr "Hora"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-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"
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr "Enviar mapa de objetos"
-msgid "UploadLink|click to upload"
-msgstr "clica para enviar"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "um utilizador apagado"
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr "permissão para falhar"
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index af971005108..4daa9fba10e 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 19:36\n"
+"PO-Revision-Date: 2022-07-14 17:05\n"
msgid " %{start} to %{end}"
msgstr " de la %{start} până la %{end}"
@@ -65,7 +65,7 @@ msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" nu există pe „%{ref}â€"
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
-msgstr "\"%{repository_name}\" dimensiunea (%{repository_size}) este mai mare decât limita de %{limit}."
+msgstr "Dimensiunea „%{repository_name}†(%{repository_size}) depășește limita de %{limit}."
msgid "#%{issueIid} (closed)"
msgstr "#%{issueIid} (închis)"
@@ -171,9 +171,9 @@ msgstr[2] "%d de fișiere modificate"
msgid "%d character remaining"
msgid_plural "%d characters remaining"
-msgstr[0] "%d caracter rămas"
-msgstr[1] "%d caractere rămase"
-msgstr[2] "%d de caractere rămase"
+msgstr[0] "%d caracter restant"
+msgstr[1] "%d caractere restante"
+msgstr[2] "%d de restante"
msgid "%d child epic"
msgid_plural "%d child epics"
@@ -231,9 +231,9 @@ msgstr[2] "%d de commit-uri,"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] "%d problemă completată"
-msgstr[1] "%d probleme completate"
-msgstr[2] "%d de probleme completate"
+msgstr[0] "%d problemă finalizată"
+msgstr[1] "%d probleme finalizate"
+msgstr[2] "%d de probleme finalizate"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -273,9 +273,9 @@ msgstr[2] "%d de eșuări"
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
-msgstr[0] "%d job de securitate eșuat"
-msgstr[1] "%d joburi de securitate eșuate"
-msgstr[2] "%d de joburi de securitate eșuate"
+msgstr[0] "%d job de securitate nereușit"
+msgstr[1] "%d joburi de securitate nereușite"
+msgstr[2] "%d de joburi de securitate nereușite"
msgid "%d file"
msgid_plural "%d files"
@@ -331,6 +331,12 @@ msgstr[0] "%d problemă importată cu succes cu eticheta"
msgstr[1] "%d probleme importate cu succes cu eticheta"
msgstr[2] "%d de probleme importate cu succes cu eticheta"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] "%d job"
+msgstr[1] "%d joburi"
+msgstr[2] "%d de joburi"
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d nivel"
@@ -375,9 +381,9 @@ msgstr[2] "%d de minute"
msgid "%d more comment"
msgid_plural "%d more comments"
-msgstr[0] "Încă %d comentariu"
-msgstr[1] "Încă %d comentarii"
-msgstr[2] "Încă %d de comentarii"
+msgstr[0] "%d comentariu în plus"
+msgstr[1] "%d comentarii în plus"
+msgstr[2] "%d de comentarii în plus"
msgid "%d pending comment"
msgid_plural "%d pending comments"
@@ -421,12 +427,24 @@ msgstr[0] "%d rămas"
msgstr[1] "%d rămase"
msgstr[2] "%d rămase"
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] "%d răspuns"
+msgstr[1] "%d răspunsuri"
+msgstr[2] "%d de răspunsuri"
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d secundă"
msgstr[1] "%d secunde"
msgstr[2] "%d de secunde"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] "%d etapă"
+msgstr[1] "%d etape"
+msgstr[2] "%d de etape"
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d stea"
@@ -594,9 +612,9 @@ msgstr "%{count} LOC/commit"
msgid "%{count} approval required from %{name}"
msgid_plural "%{count} approvals required from %{name}"
-msgstr[0] "%{count} aprobare cerută de %{name}"
-msgstr[1] "%{count} aprobări cerute de %{name}"
-msgstr[2] "%{count} de aprobări cerute de %{name}"
+msgstr[0] "%{count} aprobare necesară din partea %{name}"
+msgstr[1] "%{count} aprobări necesare din partea %{name}"
+msgstr[2] "%{count} de aprobări necesare din partea %{name}"
msgid "%{count} approvals from %{name}"
msgstr "%{count} aprobări de la %{name}"
@@ -608,7 +626,7 @@ msgstr[1] "%{count} contacte"
msgstr[2] "%{count} de contacte"
msgid "%{count} files touched"
-msgstr "%{count} fișiere atinse"
+msgstr "%{count} (de) fișiere atinse"
msgid "%{count} item"
msgid_plural "%{count} items"
@@ -623,13 +641,13 @@ msgid "%{count} more"
msgstr "%{count} mai mult"
msgid "%{count} more assignees"
-msgstr "Încă %{count} cesionari"
+msgstr "%{count} (de) alți responsabili"
msgid "%{count} more release"
msgid_plural "%{count} more releases"
-msgstr[0] "încă %{count} lansare"
-msgstr[1] "încă %{count} lansări"
-msgstr[2] "încă %{count} de lansări"
+msgstr[0] "%{count} lansare în plus"
+msgstr[1] "%{count} lansări în plus"
+msgstr[2] "%{count} de lansări în plus"
msgid "%{count} of %{required} approvals from %{name}"
msgstr "%{count} din %{required} aprobări de la %{name}"
@@ -644,7 +662,7 @@ msgstr[1] "%{count} participanți"
msgstr[2] "%{count} de participanți"
msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} legate de %{pluralized_subject}: %{links}"
+msgstr "%{count} de %{pluralized_subject} conexe: %{links}"
msgid "%{count} selected"
msgstr "%{count} selectat(e)"
@@ -665,7 +683,7 @@ msgid "%{deployLinkStart}Use a template to deploy to ECS%{deployLinkEnd}, or use
msgstr "%{deployLinkStart}Utilizați un șablon pentru a implementa în ECS%{deployLinkEnd} sau utilizați o imagine docker pentru a %{commandsLinkStart}rula comenzi AWS în GitLab CI/CD%{commandsLinkEnd}."
msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last seen: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
-msgstr "%{description}- Eveniment Sentry: %{errorUrl}- Prima dată când a fost văzut: %{firstSeen}- Ultima dată când a fost văzut: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
+msgstr "%{description}- Eveniment Sentry: %{errorUrl}- Văzut prima dată: %{firstSeen}- Văzut ultima dată: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
msgid "%{doc_link_start}Advanced search%{doc_link_end} is disabled since %{ref_elem} is not the default branch. %{docs_link}"
msgstr "%{doc_link_start}Cercetare avansată%{doc_link_end} este dezactivată deoarece %{ref_elem} nu este ramura implicită. %{docs_link}"
@@ -683,7 +701,7 @@ msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Ce este autentificarea cu doi factori?%{docs_link_end}"
msgid "%{due_date} (Past due)"
-msgstr "%{due_date} (Cu scadență depășită)"
+msgstr "%{due_date} (Depășit)"
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -692,7 +710,7 @@ msgid "%{edit_in_new_fork_notice} Try to cherry-pick this commit again."
msgstr "%{edit_in_new_fork_notice} Încercați să cherry-pick acest commit din nou."
msgid "%{edit_in_new_fork_notice} Try to create a new directory again."
-msgstr "%{edit_in_new_fork_notice} Încercați să creați iar un nou director."
+msgstr "%{edit_in_new_fork_notice} Încercați să creați din nou un director nou."
msgid "%{edit_in_new_fork_notice} Try to revert this commit again."
msgstr "%{edit_in_new_fork_notice} Încercați să reveniți încă o dată acest commit."
@@ -707,13 +725,13 @@ msgid "%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually
msgstr "%{enable_service_ping_link_start}Activați%{link_end} sau %{generate_manually_link_start}generați%{link_end} serviciul Ping pentru a previzualiza și descărca payload-ul datelor de utilizare a serviciului."
msgid "%{extra} more downstream pipelines"
-msgstr "%{extra} mai multe pipeline-uri downstream"
+msgstr "%{extra} alte pipeline-uri în aval"
msgid "%{filePath} deleted"
msgstr "%{filePath} șters"
msgid "%{firstLabel} +%{labelCount} more"
-msgstr "%{firstLabel} + %{labelCount} mai mult"
+msgstr "%{firstLabel} +%{labelCount} mai mult"
msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
msgstr "%{firstMilestoneName} + %{numberOfOtherMilestones} mai mult"
@@ -740,7 +758,7 @@ msgid "%{group_name} uses group managed accounts. You need to create a new GitLa
msgstr "%{group_name} utilizează conturi gestionate de grup. Trebuie să creați un nou cont GitLab care va fi gestionat de %{group_name}."
msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
-msgstr "%{group_name}&%{epic_iid} &middot; au creat %{epic_created} de %{author}"
+msgstr "%{group_name}&%{epic_iid} &middot; a creat %{epic_created} de %{author}"
msgid "%{hook_type} was deleted"
msgstr "%{hook_type} a fost șters"
@@ -749,7 +767,7 @@ msgid "%{hook_type} was scheduled for deletion"
msgstr "%{hook_type} a fost programat pentru ștergere"
msgid "%{host} sign-in from new location"
-msgstr "%{host} autentificare dintr-o locație nouă"
+msgstr "%{host} se conectează dintr-o nouă locație"
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 "%{integrations_link_start}Integrările%{link_end} vă permit să faceți aplicații terțe parte din fluxul de lucru GitLab. Dacă integrările disponibile nu vă satisfac nevoile, considerați posibilitatea de a utiliza un %{webhooks_link_start}webhook%{link_end}."
@@ -784,11 +802,17 @@ msgstr "%{labelStart}Clasa:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Adresa incidentului:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr "%{labelStart}Starea incidentului:%{labelEnd} %{crash_state}"
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Starea incidentului:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr "%{labelStart}Tipul incidentului:%{labelEnd} %{crash_type}"
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
-msgstr "%{labelStart}Evidență:%{labelEnd} %{evidence}"
+msgstr "%{labelStart}Dovadă:%{labelEnd} %{evidence}"
msgid "%{labelStart}File:%{labelEnd} %{file}"
msgstr "%{labelStart}Fișier:%{labelEnd} %{file}"
@@ -803,7 +827,7 @@ msgid "%{labelStart}Namespace:%{labelEnd} %{namespace}"
msgstr "%{labelStart}Spațiu de nume:%{labelEnd} %{namespace}"
msgid "%{labelStart}Scanner:%{labelEnd} %{scanner}"
-msgstr "%{labelStart}Scanner:%{labelEnd} %{scanner}"
+msgstr "%{labelStart}Scaner:%{labelEnd} %{scanner}"
msgid "%{labelStart}Sent request:%{labelEnd} %{headers}"
msgstr "%{labelStart}Solicitare trimisă:%{labelEnd} %{headers}"
@@ -827,7 +851,7 @@ msgid "%{lessThan} 1 hour"
msgstr "%{lessThan} 1 oră"
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
-msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} este o autoritate de certificare gratuită, automată și deschisă (CA) care emite certificate digitale pentru a activa HTTPS (SSL/TLS) pentru site-uri."
+msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} este o autoritate de certificare (CA) gratuită, automatizată și deschisă care emite certificate digitale pentru a activa HTTPS (SSL/TLS) pentru site-uri."
msgid "%{level_name} is not allowed in a %{group_level_name} group."
msgstr "%{level_name} nu este permisă într-un grup %{group_level_name}."
@@ -842,7 +866,7 @@ msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent
msgstr "%{link_start}Începeți titlul cu %{draft_snippet}%{link_end} pentru a preveni ca un proiect de merge request să se îmbine înainte de a fi gata."
msgid "%{listToShow}, and %{awardsListLength} more"
-msgstr "%{listToShow}, și încă %{awardsListLength} mai multe"
+msgstr "%{listToShow} și %{awardsListLength} mai mult"
msgid "%{location} is missing required keys: %{keys}"
msgstr "%{location} nu are cheile necesare: %{keys}"
@@ -854,7 +878,7 @@ msgid "%{mergeLength}/%{usersLength} can merge"
msgstr "%{mergeLength}/%{usersLength} poate îmbina"
msgid "%{message} showing first %{warnings_displayed}"
-msgstr "%{message} afișează primul %{warnings_displayed}"
+msgstr "%{message} afișând primul %{warnings_displayed}"
msgid "%{message}. Your attention request was removed."
msgstr "%{message}. Solicitarea dvs. de atenție a fost înlăturată."
@@ -884,7 +908,7 @@ msgid "%{name} (Busy)"
msgstr "%{name} (Ocupat)"
msgid "%{name} contained %{resultsString}"
-msgstr "%{name} a conținut %{resultsString}"
+msgstr "%{name} conținea %{resultsString}"
msgid "%{name} found %{resultsString}"
msgstr "%{name} a găsit %{resultsString}"
@@ -947,10 +971,10 @@ msgid "%{percentage}%% weight completed"
msgstr "%{percentage}%% greutate finalizată"
msgid "%{percent}%% complete"
-msgstr "%{percent}%% finalizat"
+msgstr "%{percent}%% completat"
msgid "%{percent}%{percentSymbol} complete"
-msgstr "%{percent}%{percentSymbol} completat"
+msgstr "%{percent}%{percentSymbol} complet"
msgid "%{placeholder} is not a valid color scheme"
msgstr "%{placeholder} nu este o schemă de culori validă"
@@ -977,7 +1001,7 @@ msgstr[1] "%{releases} lansări"
msgstr[2] "%{releases} de lansări"
msgid "%{remaining_approvals} left"
-msgstr "%{remaining_approvals} rămase"
+msgstr "%{remaining_approvals} rămasă(e)"
msgid "%{reportType} %{status}"
msgstr "%{reportType} %{status}"
@@ -992,10 +1016,10 @@ msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}att
msgstr "%{retryButtonStart}Încercați din nou%{retryButtonEnd} sau %{newFileButtonStart}atașați un nou fișier%{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 "%{rotation} a fost recalculată cu participanții rămași. Vă rugăm să consultați noua configurație pentru %{rotation_link}. Se recomandă să luați legătura cu actualul respondent la apel pentru a asigura continuitatea acoperirii serviciului la apel."
+msgstr "%{rotation} a fost recalculată cu participanții rămași. Vă rugăm să consultați noua configurație pentru %{rotation_link}. Se recomandă să luați legătura cu actualul respondent de gardă pentru a asigura continuitatea acoperirii de gardă."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr "%{rotation} a fost recalculată cu participanții rămași. Vă rugăm să consultați noua configurație pentru %{rotation}. Se recomandă să luați legătura cu actualul respondent la apel pentru a asigura continuitatea serviciului la apel."
+msgstr "%{rotation} a fost recalculată cu participanții rămași. Vă rugăm să consultați noua configurație pentru %{rotation}. Se recomandă să luați legătura cu actualul respondent de gardă pentru a asigura continuitatea acoperirii de gardă."
msgid "%{runner} created %{timeago}"
msgstr "%{runner} creat %{timeago}"
@@ -1003,9 +1027,6 @@ msgstr "%{runner} creat %{timeago}"
msgid "%{scope} results for term '%{term}'"
msgstr "%{scope} rezultate pentru termenul „%{term}â€"
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search} %{description} %{scope}"
-
msgid "%{seconds}s"
msgstr "%{seconds}s"
@@ -1017,9 +1038,9 @@ msgstr[2] "%{securityScanner} nu sunt activate pentru acest proiect. %{linkStart
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] "Rezultatul %{securityScanner} nu este disponibil deoarece nu a fost rulată o conductă de când a fost activată. %{linkStart}Executați o conductă%{linkEnd}"
-msgstr[1] "Rezultatele %{securityScanner} nu sunt disponibile deoarece nu a fost rulată o conductă de când a fost activată. %{linkStart}Executați o conductă%{linkEnd}"
-msgstr[2] "Rezultatele %{securityScanner} nu sunt disponibile deoarece nu a fost rulată o conductă de când a fost activată. %{linkStart}Executați o conductă%{linkEnd}"
+msgstr[0] "Rezultatul %{securityScanner} nu este disponibil deoarece nu a fost rulat niciun pipeline de când a fost activat. %{linkStart}Rulați un pipeline%{linkEnd}"
+msgstr[1] "Rezultatele %{securityScanner} nu sunt disponibile deoarece nu a fost rulat niciun pipeline de când a fost activat. %{linkStart}Rulați un pipeline%{linkEnd}"
+msgstr[2] "Rezultatele %{securityScanner} nu sunt disponibile deoarece nu a fost rulat niciun pipeline de când a fost activat. %{linkStart}Rulați un pipeline%{linkEnd}"
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1092,13 +1113,16 @@ msgstr[2] "%{strong_start}%{count} de membri eligibili%{strong_end} trebuie să
msgid "%{strong_start}%{count} member%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
-msgstr[0] "%{strong_start}%{count} membru%{strong_end} trebuie să aprobe îmbinarea. Oricine cu rol de Dezvoltator sau mai înalt poate aproba."
-msgstr[1] "%{strong_start}%{count} membri%{strong_end} trebuie să aprobe îmbinarea. Oricine cu rol de Dezvoltator sau mai înalt poate aproba."
-msgstr[2] "%{strong_start}%{count} de membri%{strong_end} trebuie să aprobe îmbinarea. Oricine cu rol de Dezvoltator sau mai înalt poate aproba."
+msgstr[0] "%{strong_start}%{count} membru%{strong_end} trebuie să aprobe îmbinarea. Oricine cu rol de Dezvoltator sau mai mare poate aproba."
+msgstr[1] "%{strong_start}%{count} membri%{strong_end} trebuie să aprobe îmbinarea. Oricine cu rol de Dezvoltator sau mai mare poate aproba."
+msgstr[2] "%{strong_start}%{count} de membri%{strong_end} trebuie să aprobe îmbinarea. Oricine cu rol de Dezvoltator sau mai mare poate aproba."
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr "%{strong_start}%{human_size}%{strong_end} Stocare pentru proiect"
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr "Deoarece %{strong_start}%{project_name}%{strong_end} este un proiect personal, nu puteți face upgrade la un plan plătit sau începe o încercare gratuită pentru a elimina aceste limite. Vă recomandăm să %{move_to_group_link}mutați acest proiect într-un grup%{end_link} pentru a debloca aceste opțiuni. Puteți %{manage_members_link}gestiona membrii acestui proiect%{end_link}, dar nu uitați că toți membrii unici din spațiul de nume personal %{strong_start}%{namespace_name}%{strong_end} contează pentru numărul total de seat-uri utilizate."
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} Lansare"
@@ -1118,7 +1142,7 @@ msgid "%{tags} tag per image name"
msgstr "%{tags} etichetă pe nume de imagine"
msgid "%{tags} tags per image name"
-msgstr "%{tags} etichete pe nume de imagine"
+msgstr "%{tags} (de) etichete pe nume de imagine"
msgid "%{tag}-%{evidence}-%{filename}"
msgstr "%{tag}-%{evidence}-%{filename}"
@@ -1127,7 +1151,7 @@ msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} este necunoscut sau invalid"
msgid "%{text} is available"
-msgstr "%{text} este disponibil"
+msgstr "%{text} este disponibil(ă)"
msgid "%{timebox_name} should belong either to a project or a group."
msgstr "%{timebox_name} trebuie să aparțină fie unui proiect, fie unui grup."
@@ -1138,11 +1162,14 @@ msgstr "%{timebox_type} nu acceptă grafice burnup"
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} trebuie să aibă o dată de început și o dată scadentă"
+msgid "%{time} UTC"
+msgstr "%{time} UTC"
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
msgid "%{title} changes"
-msgstr "%{title} modificări"
+msgstr "%{title} modificat(e)"
msgid "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} free)"
msgstr "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} gratuit)"
@@ -1160,7 +1187,7 @@ msgid "%{total} remaining issue weight"
msgstr "%{total} greutate de problemă rămasă"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
-msgstr "%{total} avertismente găsite: se afișează primul %{warningsDisplayed}"
+msgstr "%{total} (de) avertismente găsite: se afișează primul %{warningsDisplayed}"
msgid "%{type} only supports %{name} name"
msgstr "%{type} acceptă numai numele %{name}"
@@ -1223,37 +1250,37 @@ msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_
msgstr "%{wildcards_link_start}Jokerii%{wildcards_link_end} cum ar fi %{code_tag_start}v*%{code_tag_end} sau %{code_tag_start}*-lansare%{code_tag_end} sunt acceptați."
msgid "'%{data}' at %{location} does not match format: %{format}"
-msgstr "'%{data}' la %{location} nu se potrivește cu formatul: %{format}"
+msgstr "„%{data}†la %{location} nu se potrivește cu formatul: %{format}"
msgid "'%{data}' at %{location} does not match pattern: %{pattern}"
msgstr "'%{data}' la %{location} nu se potrivește cu modelul: %{pattern}"
msgid "'%{data}' at %{location} is invalid: error_type=%{type}"
-msgstr "'%{data}' la %{location} nu este valid: error_type=%{type}"
+msgstr "„%{data}†la %{location} este invalidă: error_type=%{type}"
msgid "'%{data}' at %{location} is not of type: %{type}"
msgstr "„%{data}†de la %{location} nu este de tipul: %{type}"
msgid "'%{data}' at %{location} is not one of: %{enum}"
-msgstr "'%{data}' la %{location} nu este unul dintre: %{enum}"
+msgstr "„%{data}†la %{location} nu este una dintre următoarele: %{enum}"
msgid "'%{data}' at %{location} is not: %{const}"
-msgstr "'%{data}' la %{location} nu este: %{const}"
+msgstr "„%{data}†la %{location} nu este: %{const}"
msgid "'%{level}' is not a valid visibility level"
msgstr "'%{level}' nu este un nivel de vizibilitate valid"
msgid "'%{name}' Value Stream created"
-msgstr "„%{name}†Value Stream creat"
+msgstr "Fluxul de valori „%{name}†a fost creat"
msgid "'%{name}' Value Stream deleted"
-msgstr "„%{name}†Value Stream șters"
+msgstr "Fluxul de valori „%{name}†a fost șters"
msgid "'%{name}' Value Stream saved"
-msgstr "„%{name}„ Value Stream salvat"
+msgstr "Fluxul de valori „%{name}†a fost salvat"
msgid "'%{source}' is not a import source"
-msgstr "'%{source}' nu este o sursă de import"
+msgstr "„%{source}†nu este o sursă de import"
msgid "'%{template_name}' is unknown or invalid"
msgstr "'%{template_name}' este necunoscut sau invalid"
@@ -1268,7 +1295,7 @@ msgid "(%{mrCount} merged)"
msgstr "(%{mrCount} îmbinate)"
msgid "(%{value}) has already been taken"
-msgstr "(%{value}) a fost deja luată"
+msgstr "(%{value}) a fost deja luat(ă)"
msgid "(+%{count}&nbsp;rules)"
msgstr "(+%{count}&nbsp;reguli)"
@@ -1295,7 +1322,7 @@ msgid "(leave blank if you don't want to change it)"
msgstr "(lăsați necompletat dacă nu doriți să o modificați)"
msgid "(max size 15 MB)"
-msgstr "(dimensiunea maximă 15 MB)"
+msgstr "(mărime maximă 15 MB)"
msgid "(optional)"
msgstr "(opțional)"
@@ -1352,7 +1379,7 @@ msgid "+%{more_reviewers_count}"
msgstr "+%{more_reviewers_count}"
msgid "+%{more_reviewers_count} more reviewers"
-msgstr "+%{more_reviewers_count} mai mulți recenzori"
+msgstr "+%{more_reviewers_count} mai mulți recenzenți"
msgid "+%{tags} more"
msgstr "+%{tags} mai mult"
@@ -1429,6 +1456,12 @@ msgstr "/zi"
msgid "0 bytes"
msgstr "0 octeți"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] "1 constatare a calității codului"
+msgstr[1] "%d constatări ale calității codului"
+msgstr[2] "%d de constatări ale calității codului"
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 Zi"
@@ -1455,9 +1488,9 @@ msgstr[2] "%{merge_requests} de merge request-uri închise"
msgid "1 day"
msgid_plural "%d days"
-msgstr[0] "1 zi"
-msgstr[1] "%d zile"
-msgstr[2] "%d de zile"
+msgstr[0] "O Zi"
+msgstr[1] "%d Zile"
+msgstr[2] "%d de Zile"
msgid "1 day remaining"
msgid_plural "%d days remaining"
@@ -1473,7 +1506,7 @@ msgstr[2] "%d de zile selectate"
msgid "1 deploy key"
msgid_plural "%d deploy keys"
-msgstr[0] "1 cheie de implementare"
+msgstr[0] "O cheie de implementare"
msgstr[1] "%d chei de implementare"
msgstr[2] "%d de chei de implementare"
@@ -1503,9 +1536,9 @@ msgstr[2] "%d de probleme selectate"
msgid "1 merge request selected"
msgid_plural "%d merge requests selected"
-msgstr[0] "1 cerere de îmbinare selectată"
-msgstr[1] "%d cereri de îmbinare selectate"
-msgstr[2] "%d de cereri de îmbinare selectate"
+msgstr[0] "1 merge request selectat"
+msgstr[1] "%d merge request-uri selectate"
+msgstr[2] "%d de merge request-uri selectate"
msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
@@ -1634,7 +1667,7 @@ msgid "8 hours"
msgstr "8 ore"
msgid ":%{startLine} to %{endLine}"
-msgstr ":%{startLine} la %{endLine}"
+msgstr ":de la %{startLine} la %{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
msgstr "O %{incident_docs_start}problemă modificată%{incident_docs_end} pentru a ghida rezolvarea incidentelor."
@@ -1663,6 +1696,9 @@ msgstr "Un site Jekyll care folosește Netlify pentru CI/CD în loc de GitLab, d
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Un certificat SSL Let's Encrypt nu poate fi obținut până când domeniul dvs. nu este verificat."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr "Un element de lucru poate fi un părinte sau un copil, dar nu ambele."
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "O pagină de bază și funcție serverless care utilizează AWS Lambda, AWS API Gateway și GitLab Pages"
@@ -1688,7 +1724,7 @@ msgid "A file was not found."
msgstr "Un fișier nu a fost găsit."
msgid "A file with '%{file_name}' already exists in %{branch} branch"
-msgstr "Un fișier cu '%{file_name}' există deja în ramura %{branch}"
+msgstr "Un fișier cu numele „%{file_name}†există deja în ramura %{branch}"
msgid "A file with this name already exists."
msgstr "Există deja un fișier cu acest nume."
@@ -1748,7 +1784,7 @@ msgid "A project boilerplate for Salesforce App development with Salesforce Deve
msgstr "Un proiect cazan pentru dezvoltarea de aplicații Salesforce cu instrumente de dezvoltatori Salesforce"
msgid "A project boilerplate for Tencent Serverless Framework that uses Next.js SSR"
-msgstr "Un proiect boilerplate pentru Tencent Serverless Framework care utilizează Next.js SSR"
+msgstr "Un proiect cazan pentru Tencent Serverless Framework care utilizează Next.js SSR"
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 "Un proiect care să conțină aspecte pentru fiecare anchetă de audit din Protocolul de audit HIPAA publicat de Departamentul de Sănătate și Servicii Umane al SUA."
@@ -1760,16 +1796,16 @@ msgid "A quarterly reconciliation is due on %{date}"
msgstr "O reconciliere trimestrială trebuie efectuată la data de %{date}."
msgid "A ready-to-go template for use with Android apps"
-msgstr "Un șablon gata de utilizare pentru utilizare cu aplicații Android"
+msgstr "Un șablon gata de utilizare pentru aplicații Android"
msgid "A ready-to-go template for use with iOS Swift apps"
-msgstr "Un șablon gata de utilizare pentru utilizare cu aplicații iOS Swift"
+msgstr "Un șablon gata de utilizare pentru aplicații Swift pentru iOS"
msgid "A rebase is already in progress."
msgstr "Un rebase este deja în curs de desfășurare."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
-msgstr "A fost efectuată o autentificare în contul dvs. de la următoarea adresă IP: %{ip}"
+msgstr "S-a efectuat o autentificare în contul dvs. de la următoarea adresă IP: %{ip}"
msgid "A title is required"
msgstr "Este necesar un titlu"
@@ -1778,7 +1814,7 @@ msgid "A user with write access to the source branch selected this option"
msgstr "Un utilizator cu acces în scriere la ramura sursă a selecționat această opțiune"
msgid "ACTION REQUIRED: Something went wrong while obtaining the Let's Encrypt certificate for GitLab Pages domain '%{domain}'"
-msgstr "ACȚIUNE NECESARĂ: Ceva nu a mers bine în timpul obținerii certificatului Let's Encrypt pentru domeniul GitLab Pages '%{domain}'"
+msgstr "ACȚIUNE NECESARĂ: Ceva nu a mers bine la obținerea certificatului Let's Encrypt pentru domeniul GitLab Pages %{domain}"
msgid "API"
msgstr "API"
@@ -1871,7 +1907,7 @@ msgid "APIFuzzing|There are three ways to perform scans."
msgstr "Există trei moduri de a efectua scanări."
msgid "APIFuzzing|Tip: Insert the following variables anywhere below stages and include"
-msgstr "Sfat: IntroduceÈ›i următoarele variabile oriunde după secÈ›iunile „stages†și „includeâ€"
+msgstr "Sfat: IntroduceÈ›i următoarele variabile oriunde după secÈ›iunile „etape†și „includeâ€"
msgid "APIFuzzing|Tip: Insert this part below all include"
msgstr "Sfat: Introduceți această parte sub tot conținutul inclus"
@@ -1904,7 +1940,7 @@ msgid "AWS Access Key"
msgstr "Cheia de acces AWS"
msgid "AWS Secret Access Key"
-msgstr "Cheia secretă de acces AWS"
+msgstr "Cheia de acces secret AWS"
msgid "AWS access key ID (Optional)"
msgstr "ID-ul cheii de acces AWS (Opțional)"
@@ -1916,7 +1952,7 @@ msgid "AWS service error: %{error}"
msgstr "Eroare de serviciu AWS: %{error}"
msgid "Abort"
-msgstr "Renunțați"
+msgstr "Abandonați"
msgid "About GitLab"
msgstr "Despre GitLab"
@@ -1925,16 +1961,16 @@ msgid "About auto deploy"
msgstr "Despre implementarea automată"
msgid "About this feature"
-msgstr "Despre această funcție"
+msgstr "Despre această caracteristică"
msgid "About your company"
msgstr "Despre compania dumneavoastră"
msgid "Abuse Reports"
-msgstr "Rapoarte abuz"
+msgstr "Rapoarte de abuzuri"
msgid "Abuse reports"
-msgstr "Rapoarte abuz"
+msgstr "Rapoarte privind abuzurile"
msgid "Abuse reports notification email"
msgstr "E-mail de notificare a rapoartelor de abuz"
@@ -1949,7 +1985,10 @@ msgid "Acceptable for use in this project"
msgstr "Acceptabil pentru utilizare în acest proiect"
msgid "Access Git repositories or the API."
-msgstr "Accesați repozitorii Git sau API-ul."
+msgstr "Accesați repozitoriile Git sau API."
+
+msgid "Access Token"
+msgstr ""
msgid "Access Tokens"
msgstr "Tokenuri de acces"
@@ -1967,16 +2006,16 @@ msgid "Access forbidden. Check your access level."
msgstr "Accesul interzis. Verificați nivelul de acces."
msgid "Access granted"
-msgstr "Acces acordat"
+msgstr "Accesul acordat"
msgid "Access requests"
-msgstr "Cereri de acces"
+msgstr "Solicitări de acces"
msgid "Access to '%{classification_label}' not allowed"
-msgstr "Accesul la \"%{classification_label}\" nu este permis"
+msgstr "Accesul la '%{classification_label}' nu este permis"
msgid "AccessDropdown|Deploy Keys"
-msgstr "Chei de distribuție"
+msgstr "Chei de implementare"
msgid "AccessDropdown|Groups"
msgstr "Grupuri"
@@ -2068,11 +2107,17 @@ msgstr "Nou"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "Scanarea de accesibilitate a găsit o eroare de tipul următor: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Cont"
msgid "Account ID"
-msgstr "ID cont"
+msgstr "ID-ul contului"
msgid "Account and limit"
msgstr "Contul și limita"
@@ -2111,7 +2156,7 @@ msgid "Action"
msgstr "Acțiune"
msgid "Action to take when receiving an alert. %{docsLink}"
-msgstr "Acțiune de întreprins când primiți o alertă. %{docsLink}"
+msgstr "Acțiunea care trebuie întreprinsă la primirea unei alerte. %{docsLink}"
msgid "Actions"
msgstr "Acțiuni"
@@ -2147,7 +2192,7 @@ msgid "Add"
msgstr "Adaugă"
msgid "Add \"%{value}\""
-msgstr "Adaugă \"%{value}\""
+msgstr "AdăugaÈ›i „%{value}â€"
msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically includes read-only assets, like source code and release evidence."
msgstr "Adăugați %{linkStart}resurse%{linkEnd} la versiunea dumneavoastră. GitLab include în mod automat resurse numai în citire, cum ar fi codul sursă și evidența lansării."
@@ -2158,29 +2203,26 @@ msgstr "Adăugați CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Adăugați CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Adăugați URL Jaeger"
-
msgid "Add Kubernetes cluster"
-msgstr "Adăugați cluster Kubernetes"
+msgstr "Adăugați clusterul Kubernetes"
msgid "Add LICENSE"
-msgstr "Adăugați LICENȚĂ"
+msgstr "Adăugați LICENSE"
msgid "Add License"
msgstr "Adăugați Licență"
msgid "Add New Site"
-msgstr "Adăugați un site nou"
+msgstr "Adăugare site nou"
msgid "Add README"
msgstr "Adăugați README"
msgid "Add Zoom meeting"
-msgstr "Adăugați o reuniune Zoom."
+msgstr "Adăugare reuniune Zoom."
msgid "Add a %{type}"
-msgstr "Adăugați un %{type}"
+msgstr "Adăugare %{type}"
msgid "Add a GCP region"
msgstr "Adăugați o regiune GCP"
@@ -2191,14 +2233,11 @@ msgstr "Adăugați o cheie GPG"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr "Adăugați o cheie GPG pentru acces securizat la GitLab. %{help_link_start}Aflați mai multe.%{help_link_end}"
-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 "Adăugați un URL Jaeger pentru a înlocui această pagină cu un link către serverul Jaeger. Mai întâi trebuie să %{link_start_tag}instalați Jaeger%{link_end_tag}."
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr "Adăugați un acord privind Termenii și condițiile de utilizare și Politica de confidențialitate pentru utilizatorii acestei instanțe GitLab."
msgid "Add a bullet list"
-msgstr "Adăugați o listă de puncte"
+msgstr "Adăugați o listă cu marcatori"
msgid "Add a collapsible section"
msgstr "Adăugați o secțiune pliabilă"
@@ -2207,7 +2246,7 @@ msgid "Add a comment to this line"
msgstr "Adăugați un comentariu la această linie"
msgid "Add a comment to this line or drag for multiple lines"
-msgstr "Adăugați un comentariu la această linie sau trageți pentru mai multe linii"
+msgstr "Adăugați un comentariu la această linie sau glisați pentru mai multe linii"
msgid "Add a confidential internal note to this %{noteableDisplayName}."
msgstr "Adăugați o notă internă confidențială la acest / această %{noteableDisplayName}."
@@ -2221,9 +2260,6 @@ msgstr "Adăugați un comentariu general la acest /această %{noteableDisplayNam
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Adăugați o pagină de pornire la propriul wiki care conține informații despre proiectul dvs. și GitLab o va afișa aici în loc de acest mesaj."
-msgid "Add a horizontal rule"
-msgstr "Adăugați o regulă orizontală"
-
msgid "Add a new issue"
msgstr "Adăugați o nouă problemă"
@@ -2234,7 +2270,7 @@ msgid "Add a related epic"
msgstr "Adăugați o epică asociată"
msgid "Add a related issue"
-msgstr "Adăugați o problemă conexă"
+msgstr "Adăugați o problemă asociată"
msgid "Add a suffix to Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr "Adăugați un sufix la adresa de e-mail Service Desk. %{linkStart}Aflați mai multe.%{linkEnd}"
@@ -2267,34 +2303,34 @@ msgid "Add another link"
msgstr "Adăugați un alt link"
msgid "Add approval rule"
-msgstr "Adăugați o regulă de aprobare"
+msgstr "Adăugare regulă de aprobare"
msgid "Add approvers"
-msgstr "Adăugați aprobatori"
+msgstr "Adăugare aprobatori"
msgid "Add attention request"
-msgstr "Adăugați o cerere de atenție"
+msgstr "Adăugare cerere de atenție"
msgid "Add broadcast message"
-msgstr "Adăugați un mesaj de difuzare"
+msgstr "Adăugare mesaj de difuzare"
msgid "Add child epic to an epic"
-msgstr "Adaugați o epică copil la o epică"
+msgstr "Adăugare epică copil la o epică"
msgid "Add comment now"
-msgstr "Adăugați un comentariu acum"
+msgstr "Adăugați comentariu acum"
msgid "Add comment to design"
-msgstr "Adăugați un comentariu la design"
+msgstr "Adăugare comentariu la design"
msgid "Add comment..."
-msgstr "Adăugați un comentariu..."
+msgstr "Adăugare comentariu..."
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "Adăugați mesajele commit-urilor sub formă de comentarii la sarcinile Asana. %{docs_link}"
msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
-msgstr "Adăugați mesaje de commit ca și comentarii la relatările Pivotal Tracker. %{docs_link}"
+msgstr "Adăugați mesaje commit-urilor ca și comentarii la relatările Pivotal Tracker. %{docs_link}"
msgid "Add customer relation contact(s)."
msgstr "Adăugați contacte de relații cu clienții."
@@ -2306,13 +2342,13 @@ msgid "Add deploy freeze"
msgstr "Adăugați înghețarea implementării"
msgid "Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"
-msgstr "Adăugați chei de distribuție pentru a acorda acces în citire/scriere la acest repozitoriu. %{link_start}Ce sunt cheile de distribuție?%{link_end}"
+msgstr "Adăugați chei de implementare pentru a acorda acces în citire/scriere la acest repozitoriu. %{link_start}Ce sunt cheile de implementare?%{link_end}"
msgid "Add email address"
-msgstr "Adăugați adresă e-mail"
+msgstr "Adăugați adresa de e-mail"
msgid "Add email participant(s)"
-msgstr "Adăugați participant(ți) la e-mail"
+msgstr "Adăugați participant(i) prin e-mail"
msgid "Add environment"
msgstr "Adăugați mediu"
@@ -2321,28 +2357,28 @@ msgid "Add existing confidential %{issuableType}"
msgstr "Adăugați %{issuableType} confidențial existent"
msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
-msgstr "Adăugați antetul și subsolul la e-mailuri. Rețineți că setările de culoare vor fi aplicate numai în interfața aplicației"
+msgstr "Adăugați antet și subsol la e-mailuri. Vă rugăm să rețineți că setările de culoare vor fi aplicate numai în interfața aplicației"
msgid "Add image comment"
msgstr "Adăugare comentariu la imagine"
msgid "Add internal note"
-msgstr "Adăugați o notă internă"
+msgstr "Adăugare notă internă"
msgid "Add key"
msgstr "Adăugare cheie"
msgid "Add label(s)"
-msgstr "Adăugați etichetă(e)"
+msgstr "Adăugare etichetă(e)"
msgid "Add list"
-msgstr "Adăugați listă"
+msgstr "Adăugare listă"
msgid "Add new application"
-msgstr "Adăugați o aplicație nouă"
+msgstr "Adăugare aplicație nouă"
msgid "Add new directory"
-msgstr "Adăugați un director nou"
+msgstr "Adăugare director nou"
msgid "Add or remove a user."
msgstr "Adăugați sau înlăturați un utilizator."
@@ -2354,10 +2390,10 @@ msgid "Add or subtract spent time"
msgstr "Adăugați sau scădeți timp petrecut"
msgid "Add people"
-msgstr "Adăugați persoane"
+msgstr "Adăugare persoane"
msgid "Add previously merged commits"
-msgstr "Adăugați commit-urile îmbinate anterior"
+msgstr "Adăugare commit-urile îmbinate anterior"
msgid "Add project"
msgstr "Adăugare proiect"
@@ -2366,40 +2402,40 @@ msgid "Add projects"
msgstr "Adăugare proiecte"
msgid "Add reaction"
-msgstr "Adăugați reacție"
+msgstr "Adăugare reacție"
msgid "Add request manually"
-msgstr "Adăugați cererea manual"
+msgstr "Adăugați manual solicitarea"
msgid "Add suggestion to batch"
-msgstr "Adăugați o sugestie la lot"
+msgstr "Adăugare sugestie la lot"
msgid "Add system hook"
-msgstr "Adăugare hook sistem"
+msgstr "Adăugare hook de sistem"
msgid "Add text to the sign-in page. Markdown enabled."
-msgstr "Adăugați text paginii de autentificare. Markdown activat."
+msgstr "Adăugați text la pagina de autentificare. Markdown activat."
msgid "Add to board"
msgstr "Adăugați la bord"
msgid "Add to epic"
-msgstr "Adăugați la epic"
+msgstr "Adăugați la epică"
msgid "Add to merge train"
-msgstr "Adăugare la merge train"
+msgstr "Adăugați la merge train"
msgid "Add to merge train when pipeline succeeds"
-msgstr "Adăugare la merge train când conducta reușește"
+msgstr "Adăugați la merge train atunci când pipeline-ul reușește"
msgid "Add to review"
-msgstr "Adăugați pentru revizuire"
+msgstr "Adăugați la revizuire"
msgid "Add to tree"
-msgstr "Adăugare la arbore"
+msgstr "Adăugați la arbore"
msgid "Add topics to projects to help users find them."
-msgstr "Adăugați subiecte la proiecte pentru a ajuta utilizatorii să le găsească."
+msgstr "Adăugați subiecte la proiecte pentru a-i ajuta utilizatorii să le găsească."
msgid "Add trigger"
msgstr "Adăugare declanșator"
@@ -2408,10 +2444,10 @@ msgid "Add user(s) to the group:"
msgstr "Adăugați utilizator(i) la grup:"
msgid "Add users to group"
-msgstr "Adăugați utilizatorii în grup"
+msgstr "Adăugare utilizatorii la grup"
msgid "Add variable"
-msgstr "Adăugați o variabilă"
+msgstr "Adăugare variabilă"
msgid "Add vulnerability finding"
msgstr "Adăugați descoperirea vulnerabilității"
@@ -2426,7 +2462,7 @@ msgid "Add/remove"
msgstr "Adăugare/înlăturare"
msgid "AddContextCommits|Add previously merged commits"
-msgstr "Adăugați commit-urile îmbinate anterior"
+msgstr "Adăugare commit-urile îmbinate anterior"
msgid "AddContextCommits|Add/remove"
msgstr "Adăugare/înlăturare"
@@ -2450,7 +2486,7 @@ msgid "AddMember|Too many users specified (limit is %{user_limit})"
msgstr "Prea mulți utilizatori specificați (limita este %{user_limit})"
msgid "Added"
-msgstr "Adăugat"
+msgstr "S-a adăugat"
msgid "Added %{epic_ref} as a child epic."
msgstr "S-a adăugat %{epic_ref} ca o epică copil."
@@ -2459,23 +2495,20 @@ msgid "Added %{label_references} %{label_text}."
msgstr "S-a adăugat %{label_references} %{label_text}."
msgid "Added a to do."
-msgstr "S-a adăugat un to do."
+msgstr "Adăugată o sarcină de făcut."
msgid "Added an issue to an epic."
-msgstr "Problemă adăugată la o epică."
+msgstr "S-a adăugat o problemă la o epică."
msgid "Added for this merge request"
-msgstr "Adăugat pentru acest merge request"
+msgstr "S-a adăugat pentru acest merge request"
msgid "Added in this version"
-msgstr "Adăugat în această versiune"
+msgstr "S-a adăugat în această versiune"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Adăugarea de aplicații noi este dezactivată în instanța dvs. GitLab. Vă rugăm să contactați administratorul dvs. GitLab pentru a obține permisiunea"
-msgid "Additional Metadata"
-msgstr "Metadate suplimentare"
-
msgid "Additional minutes"
msgstr "Minute suplimentare"
@@ -2486,46 +2519,46 @@ msgid "Additional text"
msgstr "Text suplimentar"
msgid "Additional text for the sign-in and Help page."
-msgstr "Text suplimentar pentru pagina de autentificare și pagina de Ajutor."
+msgstr "Text suplimentar pentru pagina de autentificare și de Ajutor."
msgid "Additional text to show on the Help page"
-msgstr "Text suplimentar pentru a fi afișat pe pagina de Ajutor"
+msgstr "Text suplimentar de afișat pe pagina de Ajutor"
msgid "Additional text to show on the sign-in page"
msgstr "Text suplimentar de afișat pe pagina de autentificare"
msgid "Address"
-msgstr "Adresă"
+msgstr "Adresa"
msgid "Adds"
msgstr "Adaugă"
msgid "Adds %{epic_ref} as child epic."
-msgstr "Adaugă %{epic_ref} ca epică secundară."
+msgstr "Adaugă %{epic_ref} ca epică copil."
msgid "Adds %{labels} %{label_text}."
msgstr "Adaugă %{labels} %{label_text}."
msgid "Adds a Zoom meeting."
-msgstr "Adăugați o reuniune Zoom."
+msgstr "Adaugă o reuniune Zoom."
msgid "Adds a to do."
-msgstr "Adăugați un de făcut."
+msgstr "Adăugă o sarcină de făcut."
msgid "Adds an issue to an epic."
-msgstr "Adăugați o problemă la o epică."
+msgstr "Adaugă o problemă la o epică."
msgid "Adds email participant(s)."
-msgstr "Adăugați participant(i) prin e-mail."
+msgstr "Adaugă participant(i) prin e-mail."
msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
-msgstr "Adăugați acest %{issuable_type} ca fiind legat de %{issuable_type} din care a fost creat"
+msgstr "Adaugă acest / această %{issuable_type} ca fiind legat(ă) de %{issuable_type} din care a fost creat(ă)"
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr "Reglați frecvența cu care GitLab UI verifică pentru actualizări."
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 "Ajustați filtrele/criteriile de căutare de mai sus. Dacă credeți că este vorba de o eroare, consultați documentația %{linkStart}Geo Troubleshooting%{linkEnd} pentru mai multe informații."
+msgstr "Ajustați filtrele/criteriile de căutare de mai sus. În cazul în care credeți că este vorba de o eroare, consultați documentația de %{linkStart}depanare Geo%{linkEnd} pentru mai multe informații."
msgid "Admin"
msgstr "Admin"
@@ -2725,6 +2758,9 @@ msgstr "Toate proiectele noi pot folosi executorii partajaÈ›i ai acestei instanÈ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domeniul Auto DevOps"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr "Interziceți automat utilizatorii care descarcă mai mult de un anumit număr de repozitorii într-un anumit interval de timp."
+
msgid "AdminSettings|CI/CD limits"
msgstr "Limitele CI/CD"
@@ -2797,6 +2833,9 @@ msgstr "Activat"
msgid "AdminSettings|Feed token"
msgstr "Token de fluxuri"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr "Limita ratei de abuz Git"
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "Am citit și sunt de acord cu %{link_start}Termenii și condițiile de utilizare%{link_end} Let's Encrypt (PDF)."
@@ -3014,7 +3053,7 @@ msgid "AdminUsers|(Locked)"
msgstr "(Blocat)"
msgid "AdminUsers|(Pending approval)"
-msgstr "(Aprobare în așteptare)"
+msgstr "(În așteptarea aprobării)"
msgid "AdminUsers|2FA Disabled"
msgstr "2FA Dezactivat"
@@ -3022,8 +3061,8 @@ msgstr "2FA Dezactivat"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA Activat"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "Un utilizator se poate valida singur prin introducerea unui card de credit/debit sau, alternativ, poate fi validat manual de către un administrator."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr "Un utilizator se poate valida singur prin introducerea unui card de credit/debit sau poate fi validat manual de către un administrator. Utilizatorii validați pot folosi minutele gratuite de CI pe executorii partajați."
msgid "AdminUsers|Access"
msgstr "Acces"
@@ -3031,6 +3070,9 @@ msgstr "Acces"
msgid "AdminUsers|Access Git repositories"
msgstr "Accesați repozitoriile Git"
+msgid "AdminUsers|Access level"
+msgstr "Nivelul de acces"
+
msgid "AdminUsers|Access the API"
msgstr "Accesați API-ul"
@@ -3073,6 +3115,9 @@ msgstr "Auditorii au acces numai în citire la toate grupurile, proiectele și u
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "Marcat automat ca utilizator intern implicit"
+msgid "AdminUsers|Avatar"
+msgstr "Avatar"
+
msgid "AdminUsers|Ban user"
msgstr "Interziceți utilizatorul"
@@ -3100,8 +3145,11 @@ msgstr "Blocat"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Blocarea utilizatorului are următoarele efecte:"
+msgid "AdminUsers|Can create group"
+msgstr "Poate crea un grup"
+
msgid "AdminUsers|Cannot sign in or access instance information"
-msgstr "Nu se poate conecta sau accesa informațiile despre instanță"
+msgstr "Nu puteți să vă conectați sau să accesați informațiile despre instanță"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
msgstr "Nu se pot debloca utilizatorii blocați prin LDAP"
@@ -3167,7 +3215,7 @@ msgid "AdminUsers|Is using seat"
msgstr "Folosește un seat"
msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "Problemele create de acest utilizator sunt ascunse pentru ceilalți utilizatori."
+msgstr "Problemele create de acest utilizator sunt ascunse celorlalți utilizatori."
msgid "AdminUsers|It's you!"
msgstr "Sunteți d-voastră!"
@@ -3175,6 +3223,12 @@ msgstr "Sunteți d-voastră!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr "Aflați mai multe despre %{link_start}utilizatori interziși.%{link_end}"
+msgid "AdminUsers|Limits"
+msgstr "Limite"
+
+msgid "AdminUsers|Linkedin"
+msgstr "Linkedin"
+
msgid "AdminUsers|Locked"
msgstr "Blocat"
@@ -3202,6 +3256,9 @@ msgstr "Proiectele personale vor fi lăsate"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Proiectele personale, istoricul grupurilor și al utilizatorilor vor fi lăsate intacte."
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr "Cotă de minute CI/CD"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Reactivarea unui utilizator va:"
@@ -3220,6 +3277,9 @@ msgstr "Respingeți utilizatorul %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "Utilizatori respinși:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr "Va fi generat și trimis utilizatorului un link de resetare. Utilizatorul va fi obligat să seteze parola în momentul primei autentificări."
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Restabiliți accesul utilizatorului la cont, inclusiv la web, Git și API."
@@ -3232,9 +3292,15 @@ msgstr "Căutați utilizatori"
msgid "AdminUsers|Send email to users"
msgstr "Trimiteți e-mail utilizatorilor"
+msgid "AdminUsers|Skype"
+msgstr "Skype"
+
msgid "AdminUsers|Sort by"
msgstr "Sortare după"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr "Numărul maxim de minute CI/CD pe executorii partajați pe care un grup le poate utiliza în fiecare lună. Setați 0 pentru nelimitat. Setați necompletat pentru a moșteni setarea globală de %{minutes}."
+
msgid "AdminUsers|The user can't access git repositories."
msgstr "Utilizatorul nu poate accesa repozitoriile git."
@@ -3283,9 +3349,6 @@ msgstr "Deblocați utilizatorul %{username}?"
msgid "AdminUsers|User administration"
msgstr "Managementul utilizatorilor"
-msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr "Utilizatorul este validat și poate folosi minutele gratuite de CI pe executorii partajați"
-
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Utilizatorul nu va putea accesa repozitoriile git"
@@ -3302,7 +3365,10 @@ msgid "AdminUsers|Validate user account"
msgstr "Validați contul de utilizator"
msgid "AdminUsers|View pending member requests"
-msgstr "Vizualizați cererile membrilor în așteptare"
+msgstr "Vizualizați solicitările membrilor în așteptare"
+
+msgid "AdminUsers|Website URL"
+msgstr "URL-ul site-ului web"
msgid "AdminUsers|What can I do?"
msgstr "Ce pot face?"
@@ -3370,8 +3436,11 @@ msgstr "limita de utilizare"
msgid "Administration"
msgstr "Administrație"
+msgid "Administrators"
+msgstr "Administratori"
+
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 "Utilizatorii suplimentari trebuie să fie analizați și aprobați de un administrator de sistem. Aflați mai multe despre %{help_link_start}plafoanele de utilizare%{help_link_end}."
+msgstr "Utilizatorii suplimentari trebuie să fie verificați și aprobați de un administrator de sistem. Aflați mai multe despre %{help_link_start}plafoanele de utilizare%{help_link_end}."
msgid "Admin|Admin notes"
msgstr "Note administrator"
@@ -3416,7 +3485,7 @@ msgid "AdvancedSearch|Reindex required"
msgstr "Reindexare necesară"
msgid "After a successful password update you will be redirected to login screen."
-msgstr "După o actualizare cu succes a parolei, veți fi redirecționat către ecranul de autentificare."
+msgstr "După o actualizare reușită a parolei, veți fi redirecționat către ecranul de conectare."
msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
msgstr "După o actualizare cu succes a parolei, veți fi redirecționat către pagina de autentificare, unde vă puteți conecta cu noua parolă."
@@ -3431,7 +3500,7 @@ msgid "After it expires, you can't use merge approvals, epics, or many security
msgstr "După expirare, nu mai puteți utiliza aprobările de îmbinare, epicele sau multe caracteristici de securitate."
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
-msgstr "După ce exportul este finalizat, descărcați fișierul de date dintr-un e-mail de notificare sau de pe această pagină. Apoi puteți importa fișierul de date din pagina %{strong_text_start}Creați un grup nou%{strong_text_end} a unei alte instanțe GitLab."
+msgstr "După ce exportul este finalizat, descărcați fișierul de date dintr-un e-mail de notificare sau de pe această pagină. Apoi puteți importa fișierul de date de pe pagina %{strong_text_start}Creați un grup nou%{strong_text_end} al unei alte instanțe GitLab."
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr "După revizuirea acestor orientări privind contribuțiile, veți fi gata să"
@@ -3575,7 +3644,7 @@ msgid "AlertManagement|There was an error while updating the status of the alert
msgstr "A survenit o eroare la actualizarea statutului alertei."
msgid "AlertManagement|There was an error while updating the to-do item of the alert."
-msgstr "A survenit o eroare la actualizarea elementului „de făcut†al alertei."
+msgstr "A survenit o eroare la actualizarea sarcinii de făcut a alertei."
msgid "AlertManagement|This assignee cannot be assigned to this alert."
msgstr "Acest responsabil nu poate fi atribuit acestei alerte"
@@ -3611,10 +3680,10 @@ msgid "AlertMappingBuilder|Title is a required field for alerts in GitLab. Shoul
msgstr "Titlul este un câmp obligatoriu pentru alertele din GitLab. În cazul în care câmpul payload-ului pe care l-ați specificat nu este disponibil, specificați ce câmp ar trebui să folosim în schimb. "
msgid "AlertSettings|A webhook URL and authorization key is generated for the integration. After you save the integration, both are visible under the “View credentials†tab."
-msgstr "Pentru integrare se generează un URL webhook È™i o cheie de autorizare. După ce salvaÈ›i integrarea, ambele sunt vizibile în fila „Vizualizare acredităriâ€."
+msgstr "Pentru integrare, se generează un URL webhook È™i o cheie de autorizare. După ce salvaÈ›i integrarea, ambele sunt vizibile în fila „Vizualizare acredităriâ€."
msgid "AlertSettings|Add new integration"
-msgstr "Adăugați o nouă integrare"
+msgstr "Adăugare nouă integrare"
msgid "AlertSettings|Alert settings"
msgstr "Setări de alertă"
@@ -3626,7 +3695,7 @@ msgid "AlertSettings|Configure details"
msgstr "Configurați detaliile"
msgid "AlertSettings|Current integrations"
-msgstr "Integrări curente"
+msgstr "Integrările actuale"
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr "Personalizarea mapării payload-ului alertei (opțional)"
@@ -3830,7 +3899,7 @@ msgid "All issues for this milestone are closed. You may close this milestone no
msgstr "Toate problemele legate de acest obiectiv sunt închise. Puteți închide acum acest obiectiv."
msgid "All merge conflicts were resolved. The merge request can now be merged."
-msgstr "Toate conflictele merge au fost rezolvate. Merge request-ul poate fi acum îmbinat."
+msgstr "Toate conflictele de îmbinare au fost rezolvate. Merge request-ul poate fi acum îmbinat."
msgid "All merge request dependencies have been merged"
msgstr "Toate dependențele merge request-ului au fost îmbinate"
@@ -3850,6 +3919,9 @@ msgstr "Toate ramurile protejate"
msgid "All threads resolved!"
msgstr "Toate subiectele sunt rezolvate!"
+msgid "All users in this group must set up two-factor authentication"
+msgstr "Toți utilizatorii din acest grup trebuie să configureze autentificarea cu doi factori"
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr "Toți utilizatorii trebuie să accepte Termenii și condițiile de utilizare și Politica de confidențialitate pentru a accesa GitLab"
@@ -3862,14 +3934,8 @@ msgstr "Toți utilizatorii cu carduri care se potrivesc"
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Permiteți \"%{group_name}\" să vă conecteze"
-msgid "Allow access only to members of this group"
-msgstr "Permiteți accesul numai membrilor acestui grup"
-
-msgid "Allow access to everyone"
-msgstr "Permiteți accesul tuturor"
-
msgid "Allow access to members of the following group"
-msgstr "Permiteți accesul membrilor din grupul următor"
+msgstr "Permiteți accesul membrilor din următorul grup"
msgid "Allow access to the following IP addresses"
msgstr "Permiteți accesul la următoarele adrese IP"
@@ -3884,7 +3950,7 @@ msgid "Allow non-administrators access to the performance bar"
msgstr "Permiteți accesul non-administratorilor la bara de performanță"
msgid "Allow only the selected protocols to be used for Git access."
-msgstr "Permiteți utilizarea numai protocoalelor selectate pentru accesul Git."
+msgstr "Permiteți ca numai protocoalele selectate să fie utilizate pentru accesul Git."
msgid "Allow owners to manage default branch protection per group."
msgstr "Permiteți proprietarilor să gestioneze protecția implicită a sucursalelor pentru fiecare grup."
@@ -3893,10 +3959,10 @@ msgid "Allow owners to manually add users outside of LDAP"
msgstr "Permiteți proprietarilor să adauge manual utilizatori în afara LDAP"
msgid "Allow password authentication for Git over HTTP(S)"
-msgstr "Permiteți autentificarea prin parolă pentru Git prin HTTP(S)"
+msgstr "Permiteți autentificarea cu parolă pentru Git over HTTP(S)"
msgid "Allow password authentication for the web interface"
-msgstr "Permiteți autentificarea prin parolă pentru interfața web"
+msgstr "Permiteți autentificarea cu parolă pentru interfața web"
msgid "Allow project maintainers to configure repository mirroring"
msgstr "Permiteți întreținătorilor proiectului să configureze replicarea repozitoriului"
@@ -3905,14 +3971,11 @@ msgid "Allow projects and subgroups to override the group setting"
msgstr "Permiteți proiectelor și subgrupurilor să suprascrie setarea grupului"
msgid "Allow projects within this group to use Git LFS"
-msgstr "Permiteți proiectelor din cadrul acestui grup să utilizeze Git LFS"
+msgstr "Permiteți proiectelor din acest grup să utilizeze Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr "Permiteți accesul public la pipeline-uri și la detaliile jobului, inclusiv la jurnalele de ieșire și la artefacte."
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "Permiteți subgrupurilor să își configureze propriile reguli de autentificare cu doi factori"
-
msgid "Allow this key to push to this repository"
msgstr "Permiteți acestei chei să facă push către acest repozitoriu"
@@ -3925,20 +3988,20 @@ msgstr "Permiteți utilizatorilor să respingă mesajul difuzat"
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Permiteți utilizatorilor să înregistreze orice aplicație pentru a utiliza GitLab ca furnizor OAuth"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "Permiteți utilizatorilor să solicite accesul (dacă vizibilitatea este publică sau internă)"
-
msgid "Allowed"
msgstr "Permis"
msgid "Allowed characters: +, 0-9, -, and spaces."
-msgstr "Caracterele permise: +, 0-9, - și spații."
+msgstr "Caractere permise: +, 0-9, - și spații."
msgid "Allowed email domain restriction only permitted for top-level groups"
-msgstr "Restricția domeniului de e-mail permisă numai pentru grupurile de nivel superior"
+msgstr "Restricția domeniului de e-mail autorizat se permite numai grupurilor de nivel superior"
msgid "Allowed to create:"
-msgstr "Permis să creeze:"
+msgstr "Autorizat să creeze:"
+
+msgid "Allowed to delete projects"
+msgstr "Permisiunea de a șterge proiecte"
msgid "Allowed to fail"
msgstr "Permis să eșueze"
@@ -3946,8 +4009,11 @@ msgstr "Permis să eșueze"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr "Permite proiectelor sau subgrupurilor din acest grup să suprascrie setarea globală."
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr "Permite proiectelor să urmărească erorile cu ajutorul unei integrări Opstrace."
+
msgid "Allows you to add and manage Kubernetes clusters."
-msgstr "Vă permite adăugarea și gestionarea clusterelor Kubernetes."
+msgstr "Vă permite să adăugați și să gestionați clusterele Kubernetes."
msgid "Almost there"
msgstr "Aproape acolo"
@@ -3962,10 +4028,10 @@ msgid "Already have login and password?"
msgstr "Aveți deja login și parolă?"
msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
-msgstr "De asemenea, numit „Emitent†sau „Identificator de încredere în partea invocatăâ€"
+msgstr "Denumit È™i „Emitent†sau „Identificator de încredere al părÈ›ii intermediare de încredereâ€"
msgid "Also called \"Relying party service URL\" or \"Reply URL\""
-msgstr "De asemenea, numit „Adresa URL a serviciului parte invocată†sau „Adresa URL de răspunsâ€"
+msgstr "Denumit È™i „URL-ul părÈ›ii intermediare de încredere†sau „URL-ul de răspunsâ€"
msgid "Also remove direct user membership from subgroups and projects"
msgstr "De asemenea, înlăturați apartenența directă a utilizatorilor la subgrupuri și proiecte"
@@ -3974,7 +4040,7 @@ msgid "Also unassign this user from related issues and merge requests"
msgstr "De asemenea, anulați atribuirea acestui utilizator de la problemele și merge request-urile asociate"
msgid "Alternate support URL for Help page and Help dropdown."
-msgstr "URL alternativ de asistență pentru pagina de Ajutor și lista derulantă Ajutor."
+msgstr "URL alternativ de asistență pentru pagina de Ajutor și meniul derulant Ajutor."
msgid "Alternatively, you can convert your account to a managed account by the %{group_name} group."
msgstr "Alternativ, puteți converti contul dvs. într-un cont administrat de grupul %{group_name}."
@@ -4007,7 +4073,7 @@ msgid "An alert has been triggered in %{project_path}."
msgstr "A fost declanșată o alertă în %{project_path}."
msgid "An application called %{link_to_client} is requesting access to your GitLab account."
-msgstr "O aplicație numită %{link_to_client} solicită accesul la contul dvs. GitLab."
+msgstr "O aplicație numită %{link_to_client} solicită acces la contul dvs. GitLab."
msgid "An email notification was recently sent from the admin panel. Please wait %{wait_time_in_words} before attempting to send another message."
msgstr "O notificare prin e-mail a fost trimisă recent din panoul de administrare. Vă rugăm să așteptați %{wait_time_in_words} înainte de a încerca să trimiteți un alt mesaj."
@@ -4019,7 +4085,7 @@ msgid "An error has occurred"
msgstr "A apărut o eroare"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
-msgstr "O eroare de raportare în care rezultatul unui test indică incorect prezența unei vulnerabilități într-un sistem, când vulnerabilitatea nu este prezentă."
+msgstr "O eroare de raportare în care rezultatul unui test indică în mod eronat prezența unei vulnerabilități într-un sistem atunci când vulnerabilitatea nu este prezentă."
msgid "An error occurred adding a draft to the thread."
msgstr "S-a produs o eroare la adăugarea unui draft la subiect."
@@ -4100,11 +4166,14 @@ msgid "An error occurred while enabling Service Desk."
msgstr "A survenit o eroare la activarea Service Desk."
msgid "An error occurred while fetching Markdown preview"
-msgstr "A apărut o eroare în timpul preluării previzualizării Markdown"
+msgstr "S-a produs o eroare la preluarea previzualizării Markdown"
msgid "An error occurred while fetching ancestors"
msgstr "A apărut o eroare în timpul preluării predecesorilor"
+msgid "An error occurred while fetching branches."
+msgstr "A apărut o eroare în timpul preluării ramurilor."
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "A apărut o eroare în timpul preluării ramurilor. Reîncercați căutarea."
@@ -4324,6 +4393,9 @@ msgstr "A apărut o eroare în timpul recuperării fișierelor diff"
msgid "An error occurred while retrieving projects."
msgstr "A apărut o eroare în timpul recuperării proiectelor."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr "A apărut o eroare în timpul salvării modificărilor: %{error}"
@@ -4333,6 +4405,9 @@ msgstr[0] "A apărut o eroare în timpul salvării setării"
msgstr[1] "A apărut o eroare în timpul salvării setărilor"
msgstr[2] "A apărut o eroare în timpul salvării setărilor"
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "A apărut o eroare în timp ce vă abonați la notificări."
@@ -4394,7 +4469,7 @@ msgid "An example project for managing Kubernetes clusters integrated with GitLa
msgstr "Un exemplu de proiect pentru gestionarea clusterelor Kubernetes integrat cu 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 "Un proiect de exemplu care prezintă cele mai bune practici pentru configurarea GitLab pentru propria organizație, inclusiv exemple de probleme, merge request-uri și obiective."
+msgstr "Un exemplu de proiect care prezintă cele mai bune practici pentru configurarea GitLab pentru propria organizație, inclusiv exemple de probleme, merge request-uri și obiective."
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
msgstr "Un exemplu care arată cum să folosiți Jsonnet cu conductele copil dinamice GitLab"
@@ -4442,25 +4517,25 @@ msgid "An unknown error occurred."
msgstr "A apărut o eroare necunoscută."
msgid "Analytics"
-msgstr "Statistici"
+msgstr "Analize"
msgid "Analyze your dependencies for known vulnerabilities."
-msgstr "Analizează dependențele dvs. pentru vulnerabilități cunoscute."
+msgstr "Analizați-vă dependențele pentru vulnerabilități cunoscute."
msgid "Analyze your infrastructure as code configuration files for known vulnerabilities."
-msgstr "Analizează fișierele de configurare a infrastructurii ca și cod pentru vulnerabilități cunoscute."
+msgstr "Analizați fișierele de configurare ale infrastructurii ca și cod pentru vulnerabilități cunoscute."
msgid "Analyze your source code and git history for secrets."
-msgstr "Analizați-vă codul sursă și istoricul git pentru a găsi secrete."
+msgstr "Analizați codul dvs. sursă și istoricul git pentru secrete."
msgid "Analyze your source code for known vulnerabilities."
-msgstr "Analizează codul dvs. sursă pentru vulnerabilități cunoscute."
+msgstr "Analizați codul dvs. sursă pentru vulnerabilități cunoscute."
msgid "Analyzing file…"
msgstr "Se analizează fișierul…"
msgid "Ancestors"
-msgstr "Antecesori"
+msgstr "Predecesori"
msgid "And this registration token:"
msgstr "Și acest token de înregistrare:"
@@ -4478,7 +4553,7 @@ msgid "Another third-party wiki is already in use. Only one third-party wiki int
msgstr "Un alt wiki al unei terțe părți este deja în uz. Numai o singură integrare wiki terță parte poate fi activă în același timp"
msgid "Anti-spam verification"
-msgstr "Verificare anti-spam"
+msgstr "Verificarea anti-spam"
msgid "Any"
msgstr "Orice"
@@ -4511,7 +4586,7 @@ msgid "Anyone can register for an account."
msgstr "Oricine se poate înregistra pentru un cont."
msgid "App ID"
-msgstr "ID Aplicație"
+msgstr "ID aplicație"
msgid "Appearance"
msgstr "Aspect"
@@ -4523,16 +4598,16 @@ msgid "Appearance was successfully updated."
msgstr "Aspectul a fost actualizat cu succes."
msgid "Append the comment with %{shrug}"
-msgstr "Adăugați comentariul cu %{shrug}"
+msgstr "Anexați comentariul cu %{shrug}"
msgid "Append the comment with %{tableflip}"
-msgstr "Adăugați comentariul la %{tableflip}"
+msgstr "Anexați comentariul cu %{tableflip}"
msgid "Application"
msgstr "Aplicație"
msgid "Application ID"
-msgstr "ID aplicație"
+msgstr "ID-ul aplicației"
msgid "Application limits saved successfully"
msgstr "Limitele aplicației au fost salvate cu succes"
@@ -4540,6 +4615,9 @@ msgstr "Limitele aplicației au fost salvate cu succes"
msgid "Application settings saved successfully"
msgstr "Setările aplicației au fost salvate cu succes"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "Actualizarea setărilor aplicației a eșuat"
@@ -4706,7 +4784,7 @@ msgid "Applying"
msgstr "Aplicare"
msgid "Applying a template will replace the existing issue description. Any changes you have made will be lost."
-msgstr "Aplicarea unui șablon va înlocui descrierea existentă a problemei. Toate modificările pe care le-ați făcut vor fi pierdute."
+msgstr "Aplicarea unui șablon va înlocui actuala descriere a problemei. Toate modificările pe care le-ați făcut vor fi pierdute."
msgid "Applying command"
msgstr "Aplicarea comenzii"
@@ -4760,13 +4838,13 @@ msgid "ApprovalRule|A merge request author collaborating with a merge request ap
msgstr "Un autor de merge request care colaborează cu un aprobator de merge request"
msgid "ApprovalRule|Add approvers"
-msgstr "Adăugați aprobatori"
+msgstr "Adăugare aprobatori"
msgid "ApprovalRule|Approval rules"
msgstr "Reguli de aprobare"
msgid "ApprovalRule|Approvals required"
-msgstr "Numărul de aprobări necesare"
+msgstr "Aprobări necesare"
msgid "ApprovalRule|Approver Type"
msgstr "Tipul de aprobator"
@@ -4787,7 +4865,7 @@ msgid "ApprovalRule|Improve your organization's code review with required approv
msgstr "Îmbunătățiți revizuirea codului organizației dvs. cu aprobări obligatorii."
msgid "ApprovalRule|Increase quality and maintain standards."
-msgstr "Sporesc calitatea și mențin standardele."
+msgstr "Creșteți calitatea și mențineți standardele."
msgid "ApprovalRule|Learn more about merge request approval rules."
msgstr "Aflați mai multe despre regulile de aprobare pentru merge request-urilor."
@@ -4844,7 +4922,7 @@ msgid "ApprovalSettings|Remove all approvals when commits are added to the sourc
msgstr "Înlăturați toate aprobările atunci când se adaugă commit-uri la ramura sursă"
msgid "ApprovalSettings|Require user password to approve"
-msgstr "Cereți parola utilizatorului pentru a aproba"
+msgstr "Solicitați parola utilizatorului pentru a aproba"
msgid "ApprovalSettings|There was an error loading merge request approval settings."
msgstr "S-a produs o eroare la încărcarea setărilor de aprobare a merge request-urilor."
@@ -4883,7 +4961,7 @@ msgid "Approved the current merge request."
msgstr "A fost aprobat merge request-ul actual."
msgid "Approved-By"
-msgstr "Aprobat de"
+msgstr "Aprobat-de"
msgid "Approved. Your attention request was removed."
msgstr "S-a aprobat. Solicitarea dvs. de atenție a fost înlăturată."
@@ -4895,22 +4973,22 @@ msgid "Approvers"
msgstr "Aprobatori"
msgid "Approvers from private group(s) not shown"
-msgstr "Aprobatorii din grupul (grupurile) privat(e) nu sunt afișați"
+msgstr "Aprobatorii din grupul / grupurile privat(e) nu sunt afișați"
msgid "Apr"
-msgstr "Apr"
+msgstr "apr"
msgid "April"
msgstr "Aprilie"
msgid "Architecture not found for OS"
-msgstr "Arhitectura nu a fost găsită pentru OS"
+msgstr "Arhitectura nu a fost găsită pentru SO"
msgid "Archive"
msgstr "Arhiva"
msgid "Archive jobs"
-msgstr "Arhivare joburi"
+msgstr "Arhivați joburile"
msgid "Archive project"
msgstr "Arhivare proiect"
@@ -4933,8 +5011,8 @@ msgstr "Proiect arhivat! Repozitoriul și alte resurse ale proiectului sunt doar
msgid "Archived projects"
msgstr "Proiecte arhivate"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "Arhivarea proiectului va face ca acesta să fie în întregime numai în citire. Acesta este ascuns din tabloul de bord și nu apare în căutări. %{strong_start}Nu se pot face commit-uri în repozitoriul respectiv și nu pot fi create probleme, comentarii sau alte entități.%{strong_end} %{link_start}Aflați mai multe.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr "Arhivarea proiectului face ca acesta să fie în întregime numai în citire. Acesta este ascuns din tabloul de bord și nu se afișează în căutări. %{strong_start}Repozitoriul nu poate accepta commit-uri și nu pot fi create probleme, comentarii sau alte entități.%{strong_end} %{link_start}Aflați mai multe.%{link_end}"
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr "Sunteți ABSOLUT SIGUR că doriți să înlăturați acest grup?"
@@ -5038,6 +5116,9 @@ msgstr "Sunteți sigur că doriți să înlăturați %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Sunteți sigur că doriți să înlăturați %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr "Sunteți sigur că doriți să înlăturați %{topic_name}?"
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Sunteți sigur că doriți să înlăturați atașamentul?"
@@ -5056,6 +5137,9 @@ msgstr "Sunteți sigur că doriți să înlăturați această listă?"
msgid "Are you sure you want to remove this nickname?"
msgstr "Sunteți sigur că doriți să înlăturați această poreclă?"
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Sunteți sigur că doriți să resetați tokenul pentru verificarea de sănătate?"
@@ -5173,11 +5257,14 @@ msgstr "Atribuire etichete"
msgid "Assign milestone"
msgstr "Atribuiți un obiectiv"
+msgid "Assign myself"
+msgstr "Atribuire personală"
+
msgid "Assign reviewer"
-msgstr "Atribuiți un evaluator"
+msgstr "Atribuiți un revizor"
msgid "Assign reviewer(s)"
-msgstr "Atribuiți evaluator(i)"
+msgstr "Atribuiți revizor(i)"
msgid "Assign severity"
msgstr "Atribuiți severitatea"
@@ -5189,7 +5276,7 @@ msgid "Assign to"
msgstr "Atribuire către"
msgid "Assign to commenting user"
-msgstr "Atribuire unui utilizator comentator"
+msgstr "Atribuiți utilizatorului care comentează"
msgid "Assign to me"
msgstr "Atribuiți-mi mie"
@@ -5234,7 +5321,7 @@ msgid "Assignee has no permissions"
msgstr "Responsabilul nu are permisiuni"
msgid "Assignee lists not available with your current license"
-msgstr "Listele de responsabili nu sunt disponibile cu licența dvs. curentă"
+msgstr "Listele de responsabili nu sunt disponibile cu licența dvs. actuală"
msgid "Assignee(s)"
msgstr "Responsabil(i)"
@@ -5264,14 +5351,11 @@ msgid "At least one of your Personal Access Tokens will expire soon. %{generate_
msgstr "Cel puțin unul dintre Tokenurile de acces personal va expira în curând. %{generate_new}"
msgid "At risk"
-msgstr "ÃŽn pericol"
+msgstr "La risc"
msgid "Attach a file"
msgstr "Atașați un fișier"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Atașați un fișier prin glisare &amp; fixare sau %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr "Atașarea fișierului - %{progress}"
@@ -5344,6 +5428,9 @@ msgstr "Luna aceasta"
msgid "AuditLogs|User Events"
msgstr "Evenimentele utilizatorului"
+msgid "AuditStreams|A header with this name already exists."
+msgstr "Un antet cu acest nume există deja."
+
msgid "AuditStreams|Active"
msgstr "Activ"
@@ -5354,7 +5441,7 @@ msgid "AuditStreams|Add external stream destination"
msgstr "Adăugați o destinație de flux extern"
msgid "AuditStreams|Add stream"
-msgstr "Adăugați un flux"
+msgstr "Adăugare flux"
msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
msgstr "S-a produs o eroare la crearea destinației fluxului de evenimente de audit extern. Vă rugăm să încercați din nou."
@@ -5368,15 +5455,24 @@ msgstr "S-a produs o eroare la preluarea fluxurilor de evenimente de audit exter
msgid "AuditStreams|Cancel editing"
msgstr "Anulați editarea"
+msgid "AuditStreams|Custom HTTP headers"
+msgstr "Anteturi HTTP personalizate"
+
msgid "AuditStreams|Delete %{link}"
msgstr "Ștergeți %{link}"
msgid "AuditStreams|Destination URL"
-msgstr "Adresa URL de destinație"
+msgstr "URL-ul de destinație"
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "Destinațiile primesc toate datele evenimentelor de audit"
+msgid "AuditStreams|Header"
+msgstr "Antet"
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr "A fost atins numărul maxim de %{number} (de) anteturi HTTP."
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "Configurați streamingul pentru evenimentele de audit"
@@ -5392,6 +5488,9 @@ msgstr "Acestea ar putea include informații sensibile. Asigurați-vă că aveț
msgid "AuditStreams|This is great for keeping everything one place."
msgstr "Acest lucru este excelent pentru a păstra totul într-un singur loc."
+msgid "AuditStreams|Value"
+msgstr "Valoare"
+
msgid "Aug"
msgstr "Aug"
@@ -5408,7 +5507,7 @@ msgid "Authenticate with GitHub"
msgstr "Autentificare cu GitHub"
msgid "Authenticated API rate limit period in seconds"
-msgstr "Perioada de limitare a ratei API autentificate în secunde"
+msgstr "Perioada limitei de rată a API-ului autentificat în secunde"
msgid "Authenticated API requests"
msgstr "Solicitări API autentificate"
@@ -5423,7 +5522,7 @@ msgid "Authenticated Git LFS requests"
msgstr "Solicitări Git LFS autentificate"
msgid "Authenticated web rate limit period in seconds"
-msgstr "Perioada de limitare a vitezei web autentificate în secunde"
+msgstr "Perioada limită a ratei web autentificată (în secunde)"
msgid "Authenticated web requests"
msgstr "Solicitări web autentificate"
@@ -5432,10 +5531,10 @@ msgid "Authentication"
msgstr "Autentificare"
msgid "Authentication Failure"
-msgstr "Eroare la autentificare"
+msgstr "Eroare de autentificare"
msgid "Authentication Log"
-msgstr "Jurnal autentificare"
+msgstr "Jurnal de autentificare"
msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
msgstr "Eroare de autentificare: activați 2FA în setările profilului dvs. pentru a continua să utilizați GitLab: %{mfa_help_page}"
@@ -5453,10 +5552,10 @@ msgid "Authentication method updated"
msgstr "Metoda de autentificare a fost actualizată"
msgid "Authentication via U2F device failed."
-msgstr "Autentificarea prin intermediul dispozitivului U2F a eșuat."
+msgstr "Autentificarea prin dispozitivul U2F a eșuat."
msgid "Authentication via WebAuthn device failed."
-msgstr "Autentificarea prin intermediul dispozitivului WebAuthn a eșuat."
+msgstr "Autentificarea prin dispozitivul WebAuthn a eșuat."
msgid "Author"
msgstr "Autor"
@@ -5483,13 +5582,13 @@ msgid "Authorization was granted by entering your username and password in the a
msgstr "Autorizarea a fost acordată introducând numele de utilizator și parola în aplicație."
msgid "Authorize"
-msgstr "Autorizează"
+msgstr "Autorizați"
msgid "Authorize %{link_to_client} to use your account?"
-msgstr "Autorizați %{link_to_client} să utilizeze contul dvs.?"
+msgstr "Autorizați %{link_to_client} să vă utilizeze contul?"
msgid "Authorize %{user} to use your account?"
-msgstr "Autorizați %{user} să vă folosească contul?"
+msgstr "Autorizați %{user} să vă utilizeze contul?"
msgid "Authorized %{new_chat_name}"
msgstr "S-a autorizat %{new_chat_name}"
@@ -5582,13 +5681,13 @@ msgid "Autocomplete"
msgstr "Autocompletare"
msgid "Autocomplete description"
-msgstr "Descriere autocompletare"
+msgstr "Descrierea autocompletării"
msgid "Autocomplete hint"
-msgstr "Sugestie autocompletare"
+msgstr "Sugestie de autocompletare"
msgid "Autocomplete usage hint"
-msgstr "Sugestie utilizare autocompletare"
+msgstr "Sugestie de utilizare a autocompletării"
msgid "Automatic certificate management using %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}"
msgstr "Gestionarea automată a certificatelor utilizând %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}"
@@ -5606,10 +5705,10 @@ msgid "Automatically close associated incident when a recovery alert notificatio
msgstr "Închideți automat incidentul asociat atunci când o notificare de alertă de recuperare rezolvă o alertă"
msgid "Automatically resolved"
-msgstr "Rezolvată automat"
+msgstr "S-a rezolvat automat"
msgid "Automatically update this project's branches and tags from the upstream repository every hour."
-msgstr "Actualizare automată a ramurilor și etichetelor acestui proiect din repozitoriul upstream din oră în oră."
+msgstr "Actualizați automat din oră în oră ramurile și etichetele acestui proiect din repozitoriul din amonte."
msgid "Autosave|Note"
msgstr "Notă"
@@ -5660,7 +5759,7 @@ msgid "Back to page %{number}"
msgstr "ÃŽnapoi la pagina %{number}"
msgid "Background Color"
-msgstr "Culoare fundal"
+msgstr "Culoarea de fundal"
msgid "Background Jobs"
msgstr "Joburi de fundal"
@@ -5696,7 +5795,7 @@ msgid "Badges"
msgstr "Insigne"
msgid "Badges|Add badge"
-msgstr "Adăugați insigna"
+msgstr "Adăugare insignă"
msgid "Badges|Adding the badge failed, please check the entered URLs and try again."
msgstr "Adăugarea insignei a eșuat, vă rugăm să verificați URL-urile introduse și să încercați din nou."
@@ -5801,7 +5900,7 @@ msgid "Banner message"
msgstr "Mesaj banner"
msgid "Based on"
-msgstr "Bazat pe"
+msgstr "Bazat(e) pe"
msgid "Batch size"
msgstr "Mărimea lotului"
@@ -5882,16 +5981,13 @@ msgid "Be careful. Changing the project's namespace can have unintended side eff
msgstr "Aveți grijă. Schimbarea spațiului de nume al proiectului poate avea efecte secundare neintenționate."
msgid "Be careful. Renaming a project's repository can have unintended side effects."
-msgstr "Fiți atent. Redenumirea unui repozitoriu al unui proiect poate avea efecte secundare nedorite."
-
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr "Înainte de 1 iulie 2022, toate proiectele open source publice de nivel gratuit trebuie să se %{enrollment_link} pentru a continua să primească beneficiile GitLab Ultimate."
+msgstr "Atenție. Redenumirea repozitoriului unui proiect poate avea efecte secundare neintenționate."
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr "Înainte de a activa această integrare, creați un webhook pentru camera din Google Chat în care doriți să primiți notificări de la acest proiect. %{docs_link}"
msgid "Before inserting code, be sure to read the comment that separated each code group."
-msgstr "Înainte de a insera codul, asigurați-vă că ați citit comentariul care separă fiecare grup de cod."
+msgstr "Înainte de a insera codul, asigurați-vă că citiți comentariul care a separat fiecare grup de cod."
msgid "Before this can be merged, a Jira issue must be linked in the title or description"
msgstr "Înainte ca aceasta să poată fi îmbinată, o problemă Jira trebuie să fie legată în titlu sau în descriere"
@@ -5963,7 +6059,7 @@ msgid "BillingPlans|Compliance"
msgstr "Conformitate"
msgid "BillingPlans|Congratulations, your free trial is activated."
-msgstr "Felicitări, evaluarea dvs. gratuită este activată."
+msgstr "Felicitări, versiunea dvs. de încercare gratuită este activată."
msgid "BillingPlans|End of availability for the Bronze Plan"
msgstr "Sfârșitul disponibilității pentru Planul Bronze"
@@ -5996,7 +6092,7 @@ msgid "BillingPlans|Learn more"
msgstr "Aflați mai multe"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
-msgstr "Aflați mai multe despre fiecare plan citind %{faq_link} nostru sau începeți o încercare gratuită de 30 de zile GitLab.com Ultimate."
+msgstr "Aflați mai multe despre fiecare plan citind %{faq_link} nostru sau începeți o perioadă de încercare gratuită de 30 de zile GitLab.com Ultimate."
msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_link}."
msgstr "Aflați mai multe despre fiecare plan vizitând pagina noastră %{pricing_page_link}."
@@ -6029,7 +6125,7 @@ msgid "BillingPlans|Pricing page"
msgstr "Pagina de prețuri"
msgid "BillingPlans|Ready to explore the value of the paid features today? Start a trial, no credit card required."
-msgstr "Sunteți gata să explorați astăzi valoarea funcțiilor plătite? Începeți o perioadă de evaluare, fără a fi nevoie de un card de credit."
+msgstr "Sunteți gata să explorați astăzi valoarea funcțiilor plătite? Începeți o perioadă de încercare, fără a fi nevoie de un card de credit."
msgid "BillingPlans|Recommended"
msgstr "Recomandat"
@@ -6050,7 +6146,7 @@ msgid "BillingPlans|Spans the DevOps lifecycle"
msgstr "Acoperă întregul ciclu de viață DevOps"
msgid "BillingPlans|Start a free Ultimate trial"
-msgstr "Începeți o evaluare gratuită Ultimate"
+msgstr "Începeți o perioadă de încercare gratuită Ultimate"
msgid "BillingPlans|Still have questions?"
msgstr "Încă mai aveți întrebări?"
@@ -6077,7 +6173,7 @@ msgid "BillingPlans|Upgrade to Ultimate"
msgstr "Faceți upgrade la Ultimate"
msgid "BillingPlans|Value stream management"
-msgstr "Managementul Value Stream"
+msgstr "Managementul Fluxului de valori"
msgid "BillingPlans|We're here to help."
msgstr "Suntem aici pentru a vă ajuta."
@@ -6095,13 +6191,13 @@ msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire afte
msgstr "Perioada dvs. de încercare GitLab.com %{plan} %{strong_open}expiră după %{expiration_date}%{strong_close}. Puteți să păstrați accesul la caracteristicile %{plan} dacă faceți upgrade mai jos."
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
-msgstr "Perioada dvs. de evaluare GitLab.com a expirat la %{expiration_date}. Puteți restabili accesul la funcții în orice moment prin actualizarea de mai jos."
+msgstr "Perioada dvs. de încercare GitLab.com a expirat la %{expiration_date}. Puteți restabili accesul la funcții în orice moment prin actualizarea de mai jos."
msgid "BillingPlans|Your current plan"
msgstr "Planul dvs. actual"
msgid "BillingPlans|billed annually at %{price_per_year}"
-msgstr "facturat anual la %{price_per_year}"
+msgstr "facturat anual cu %{price_per_year}"
msgid "BillingPlans|for the remainder of your subscription"
msgstr "pentru restul abonamentului"
@@ -6203,7 +6299,7 @@ msgid "Billing|%{user} was successfully approved"
msgstr "%{user} a fost aprobat cu succes"
msgid "Billing|Add seats"
-msgstr "Adăugați seats"
+msgstr "Adăugare seat-uri"
msgid "Billing|An email address is only visible for users with public emails."
msgstr "O adresă de e-mail este vizibilă doar pentru utilizatorii cu e-mailuri publice."
@@ -6245,7 +6341,7 @@ msgid "Billing|Export list"
msgstr "Exportați lista"
msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
-msgstr "Grupurile gratuite de pe GitLab sunt limitate la %{maxNamespaceSeats} seats"
+msgstr "Grupurile gratuite de pe GitLab sunt limitate la %{maxNamespaceSeats} seat-uri"
msgid "Billing|From June 22, 2022 (GitLab 15.1), free groups will be limited to 5 members"
msgstr "Din 22 iunie 2022 (GitLab 15.1), grupurile gratuite vor fi limitate la 5 membri."
@@ -6254,7 +6350,7 @@ msgid "Billing|Group invite"
msgstr "Invitație de grup"
msgid "Billing|If the group has over %{maxNamespaceSeats} members, only those occupying a seat can access the namespace. To ensure all members (active and %{linkStart}over limit%{linkEnd}) can access the namespace, you can start a trial or upgrade to a paid tier."
-msgstr "În cazul în care grupul conține peste %{maxNamespaceSeats} membri, numai cei care ocupă un seat pot avea acces la spațiul de nume. Pentru a vă asigura că toți membrii (activi și %{linkStart}peste limită%{linkEnd}) pot accesa spațiul de nume, puteți începe o perioadă de probă sau puteți face upgrade la un nivel plătit."
+msgstr "În cazul în care grupul conține peste %{maxNamespaceSeats} (de) membri, numai cei care ocupă un seat pot avea acces la spațiul de nume. Pentru a vă asigura că toți membrii (activi și %{linkStart}peste limită%{linkEnd}) pot accesa spațiul de nume, puteți începe o perioadă de încercare sau puteți face upgrade la un nivel plătit."
msgid "Billing|Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member."
msgstr "Membrii care au fost invitați printr-o invitație de grup nu pot fi înlăturați. Puteți fie să înlăturați întregul grup, fie să solicitați unui proprietar al grupului invitat să înlăture membrul."
@@ -6289,6 +6385,12 @@ msgstr "Sunteți pe cale să înlăturați utilizatorul %{username} din abonamen
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr "Puteți începe acum să mutați membrii în %{namespaceName}. Un membru își pierde accesul la grup atunci când dezactivați %{strongStart}Într-un seat%{strongEnd}. Dacă mai mult de 5 membri au activată opțiunea %{strongStart}Într-un seat%{strongEnd} după 22 iunie 2022, vom selecta cei 5 membri care își păstrează accesul. Vom număra mai întâi membrii care au roluri de Proprietar și Întreținător, apoi pe cei mai recent activi membri până când vom ajunge la 5 membri. Membrii rămași vor primi un statut de „Peste limită†și își vor pierde accesul la grup."
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr "Grupul dvs. gratuit este acum limitat la %{free_user_limit} membri"
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr "Grupul dvs. a trecut recent la utilizarea planului gratuit. Grupurile gratuite sunt limitate la %{free_user_limit} membri, iar membrii rămaÈ™i vor primi un statut de „Peste limită†și vor pierde accesul la grup. PuteÈ›i elibera spaÈ›iu pentru noii membri eliminându-i pe cei care nu mai au nevoie de acces sau trecându-i la „Peste limităâ€. Pentru a obÈ›ine un număr nelimitat de membri, puteÈ›i %{link_start}face upgrade%{link_end} la un nivel plătit."
+
msgid "Bitbucket Server Import"
msgstr "Importul din Serverul Bitbucket"
@@ -6398,7 +6500,7 @@ msgid "BoardScope|Choose labels"
msgstr "Alegeți etichete"
msgid "BoardScope|Current iteration"
-msgstr "Iterația curentă"
+msgstr "Iterația actuală"
msgid "BoardScope|Don't filter milestone"
msgstr "Nu filtrați obiectivul"
@@ -6459,9 +6561,9 @@ msgstr "Borduri și liste de borduri"
msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
-msgstr[0] "+ %{displayedIssuablesCount} mai mult %{issuableType}"
-msgstr[1] "+ %{displayedIssuablesCount} mai multe %{issuableType}s"
-msgstr[2] "+ %{displayedIssuablesCount} mai multe %{issuableType}s"
+msgstr[0] "+ %{displayedIssuablesCount} %{issuableType} mai mult"
+msgstr[1] "+ %{displayedIssuablesCount} %{issuableType} mai mult"
+msgstr[2] "+ %{displayedIssuablesCount} de %{issuableType} mai mult"
msgid "Boards|An error occurred while creating the epic. Please try again."
msgstr "A apărut o eroare în timpul creării epicei. Vă rugăm să încercați din nou."
@@ -6586,11 +6688,14 @@ msgstr "Se încarcă epicele"
msgid "Bold text"
msgstr "Text îngroșat"
+msgid "Both SSH and HTTP(S)"
+msgstr "Atât SSH, cât și HTTP(S)"
+
msgid "Both project and dashboard_path are required"
msgstr "Atât proiectul cât și dashboard_path sunt necesare"
msgid "Branch"
-msgstr "Ramură"
+msgstr "Ramura"
msgid "Branch %{branchName} was not found in this project's repository."
msgstr "Ramura %{branchName} nu a fost găsită în repozitoriul acestui proiect."
@@ -6602,7 +6707,7 @@ msgid "Branch already exists"
msgstr "Ramura există deja"
msgid "Branch changed"
-msgstr "Ramură schimbată"
+msgstr "Ramura schimbată"
msgid "Branch has been updated since the merge was requested."
msgstr "Ramura a fost actualizată de când a fost solicitată îmbinarea."
@@ -6752,31 +6857,31 @@ msgid "Breadcrumbs"
msgstr "Breadcrumb-uri"
msgid "Broadcast Message was successfully created."
-msgstr "Mesajul difuzat a fost creat cu succes."
+msgstr "Mesajul de difuzare a fost creat cu succes."
msgid "Broadcast Message was successfully updated."
-msgstr "Mesajul difuzat a fost actualizat cu succes."
+msgstr "Mesajul de difuzare a fost actualizat cu succes."
msgid "Broadcast Messages"
-msgstr "Mesaje difuzate"
+msgstr "Mesaje de difuzare"
msgid "Browse Directory"
-msgstr "Explorați directorul"
+msgstr "Răsfoiți directorul"
msgid "Browse File"
-msgstr "Explorați fișierul"
+msgstr "Răsfoiți fișierul"
msgid "Browse Files"
-msgstr "Explorați fișierele"
+msgstr "Răsfoiți fișierele"
msgid "Browse artifacts"
-msgstr "Explorați artefactele"
+msgstr "Răsfoiți artefactele"
msgid "Browse files"
-msgstr "Explorați fișierele"
+msgstr "Răsfoiți fișierele"
msgid "Browse templates"
-msgstr "Explorați șabloanele"
+msgstr "Răsfoiți șabloanele"
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr "A apărut o eroare la preluarea artefactelor"
@@ -6788,7 +6893,7 @@ msgid "Built-in"
msgstr "ÃŽncorporat"
msgid "Bulk request concurrency"
-msgstr "Concurența cererilor în masă"
+msgstr "Concurența solicitărilor în bloc"
msgid "Bulk update"
msgstr "Actualizare în bloc"
@@ -6818,7 +6923,7 @@ msgid "BulkImport|From source group"
msgstr "Din grupul sursă"
msgid "BulkImport|Group import history"
-msgstr "Istoric de import al grupului"
+msgstr "Istoricul importului grupului"
msgid "BulkImport|History"
msgstr "Istoric"
@@ -6875,7 +6980,7 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own from %{link}"
msgstr "Se afișează %{start}-%{end} din %{total} pe care le dețineți de la %{link}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own matching filter \"%{filter}\" from %{link}"
-msgstr "Se afișează %{start}-%{end} din %{total} pe care le dețineți și care se potrivesc cu filtrul \"%{filter}\" din %{link}"
+msgstr "Se afișează %{start}-%{end} din %{total} pe care le dețineți și care se potrivesc cu filtrul „%{filter}†din %{link}"
msgid "BulkImport|Source"
msgstr "Sursa"
@@ -6907,6 +7012,9 @@ msgstr "se aștepta la un Proiect asociat, dar are un Grup asociat"
msgid "BulkImport|must be a group"
msgstr "trebuie să fie un grup"
+msgid "Bullet list"
+msgstr "Lista cu puncte"
+
msgid "Burndown chart"
msgstr "Graficul burndown"
@@ -6941,10 +7049,10 @@ msgid "By %{user_name}"
msgstr "De %{user_name}"
msgid "By authenticating with an account tied to an Enterprise e-mail address, it is understood that this account is an Enterprise User. "
-msgstr "Prin autentificarea cu un cont legat de o adresă de e-mail Întreprindere, se înțelege că acest cont este un utilizator Întreprindere. "
+msgstr "Prin autentificarea cu un cont legat de o adresă de e-mail Enterprise, se înțelege că acest cont este un utilizator Întreprindere. "
msgid "By default, all projects and groups will use the global notifications setting."
-msgstr "În mod implicit, toate proiectele și grupurile vor utiliza setarea globală a notificărilor."
+msgstr "În mod implicit, toate proiectele și grupurile vor utiliza setarea de notificări globale."
msgid "By month"
msgstr "Pe lună"
@@ -7003,6 +7111,9 @@ msgstr "%{percent}%{percentSymbol}"
msgid "CICDAnalytics|All time"
msgstr "Toată perioada"
+msgid "CICDAnalytics|Change failure rate"
+msgstr "Rata de eșec a modificărilor"
+
msgid "CICDAnalytics|Deployment frequency"
msgstr "Frecvența de implementare"
@@ -7045,6 +7156,9 @@ msgstr "Utilizarea executorului partajat este timpul total de execuție al tutur
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr "Ceva nu a funcționat la preluarea statisticilor de lansare"
+msgid "CICDAnalytics|Time to restore service"
+msgstr "Timpul necesar pentru restabilirea serviciului"
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr "Ce este durata executorului partajat?"
@@ -7130,7 +7244,7 @@ msgid "CPU"
msgstr "CPU"
msgid "CSV is being generated and will be emailed to you upon completion."
-msgstr "CSV-ul se generează și va fi trimis dvs. prin e-mail la finalizare."
+msgstr "CSV-ul este în curs de generare și vă va fi trimis prin e-mail după finalizare."
msgid "CVE|As a maintainer, requesting a CVE for a vulnerability in your project will help your users stay secure and informed."
msgstr "În calitate de întreținător, solicitarea unui CVE pentru o vulnerabilitate în proiectul dvs., va ajuta utilizatorii să rămână în siguranță și informați."
@@ -7154,13 +7268,13 @@ msgid "CVE|Why Request a CVE ID?"
msgstr "De ce să solicitați un ID CVE?"
msgid "Cadence is not automated"
-msgstr "Cadența nu este automatizată"
+msgstr "Cadența nu este automată"
msgid "Calculate the number of slices during reindexing. The multiplier is applied to the number of shards per index. Learn more about %{slice_multiplier_link_start}slice multiplier configuration%{slice_multiplier_link_end}."
msgstr "Calculează numărul de tranșe în timpul reindexării. Multiplicatorul se aplică la numărul de fragmente pe indexare. Aflați mai multe despre %{slice_multiplier_link_start}configurarea multiplicatorului de tranșe%{slice_multiplier_link_end}."
msgid "Callback URL"
-msgstr "URL callback"
+msgstr "URL de callback"
msgid "Campfire room ID (optional)"
msgstr "ID-ul sălii Campfire (opțional)"
@@ -7265,7 +7379,7 @@ msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{envi
msgstr "Schimbați raportul de lansare canary pentru %{environment} în comparație cu implementarea stabilă la:"
msgid "Cancel"
-msgstr "Anulează"
+msgstr "Anulare"
msgid "Cancel and close"
msgstr "Anulați și închideți"
@@ -7289,7 +7403,7 @@ msgid "Cancel your account"
msgstr "Anulați-vă contul"
msgid "Cancel, keep project"
-msgstr "Anulați, păstrați proiectul"
+msgstr "Anulare, păstrați proiectul"
msgid "Canceled deployment to"
msgstr "Desfășurări anulate în"
@@ -7298,7 +7412,7 @@ msgid "Cancelled"
msgstr "Anulat"
msgid "Cancelling Preview"
-msgstr "Previzualizare anulare"
+msgstr "Anulare previzualizare"
msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
msgstr "Nu se poate atribui o epocă de tip confidențial unei probleme neconfidențiale. Faceți problema confidențială și încercați din nou."
@@ -7372,6 +7486,9 @@ msgstr "Numele titularului cardului"
msgid "Card number:"
msgstr "Numărul cardului:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr "Impuneți protecția împotriva ștergerii pentru toate subgrupurile"
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr "Impuneți pentru toate subgrupurile"
@@ -7403,10 +7520,10 @@ msgid "Certificate (PEM)"
msgstr "Certificat (PEM)"
msgid "Certificate Issuer"
-msgstr "Emitent certificat"
+msgstr "Emitent de certificat"
msgid "Certificate Subject"
-msgstr "Subiect certificat"
+msgstr "Subiectul certificatului"
msgid "Change Failure Rate"
msgstr "Rata eșecului schimbărilor"
@@ -7436,7 +7553,7 @@ msgid "Change path"
msgstr "Schimbați calea"
msgid "Change reviewer(s)"
-msgstr "Schimbați revizor(ii)"
+msgstr "Schimbare de revizor(i)"
msgid "Change reviewer(s)."
msgstr "Schimbare de revizor(i)"
@@ -7463,10 +7580,10 @@ msgid "Change your password or recover your current one"
msgstr "Schimbați-vă parola sau recuperați-vă parola curentă"
msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "Revizorul s-a schimbat de la %{old} la %{new}"
+msgstr "Recenzentul a fost schimbat de la %{old} la %{new}."
msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "Revizorul a fost schimbat la %{new}"
+msgstr "Recenzentul a fost schimbat cu %{new}"
msgid "ChangeReviewer|Unassigned"
msgstr "Neatribuit"
@@ -7541,10 +7658,7 @@ msgid "Changes suppressed. Click to show."
msgstr "Modificări suprimate. Faceți clic pentru a le afișa."
msgid "Changes the title to \"%{title_param}\"."
-msgstr "Schimbați titlul în \"%{title_param}\"."
-
-msgid "Changes to free tier open source projects"
-msgstr "Modificări la proiectele open source de nivel gratuit"
+msgstr "SchimbaÈ›i titlul în „%{title_param}â€."
msgid "Changes to the title have not been saved"
msgstr "Schimbările aduse titlului nu au fost salvate"
@@ -7625,16 +7739,16 @@ msgid "Check the %{code_open}elasticsearch.log%{code_close} file to debug why th
msgstr "Verificați fișierul %{code_open}elasticsearch.log%{code_close} pentru a depana motivul pentru care migrația s-a oprit și efectuați orice modificări înainte de a o încerca din nou. După remedierea cauzei eșecului, selectați %{strong_open}Reîncercați migrația%{strong_close}, iar migrația este programată să fie reîncercată în fundal."
msgid "Check the current instance configuration "
-msgstr "Verificați configurația instanței curente "
+msgstr "Verificați configurația curentă a instanței "
msgid "Check with your administrator."
msgstr "Verificați cu administratorul d-voastră."
msgid "Check your Docker images for known vulnerabilities."
-msgstr "Verifică imaginile dvs. Docker pentru vulnerabilități cunoscute."
+msgstr "Verificați imaginile dvs. Docker pentru vulnerabilități cunoscute."
msgid "Check your Kubernetes cluster images for known vulnerabilities."
-msgstr "Verifică imaginile clusterului dvs. Kubernetes pentru vulnerabilități cunoscute."
+msgstr "Verificați imaginile clusterului dvs. Kubernetes pentru vulnerabilități cunoscute."
msgid "Checking %{text} availability…"
msgstr "Verificarea disponibilității %{text}…"
@@ -7643,7 +7757,7 @@ msgid "Checking approval status"
msgstr "Verificarea stării de aprobare"
msgid "Checking branch availability..."
-msgstr "Verificarea disponibilității ramurilor…"
+msgstr "Verificarea disponibilității ramurii..."
msgid "Checking group path availability..."
msgstr "Verificarea disponibilității căii grupului..."
@@ -7655,13 +7769,13 @@ msgid "Checkout"
msgstr "Checkout"
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
-msgstr "%{selectedPlanPrice} USD per pachet de stocare de 10 GB pe an"
+msgstr "%{selectedPlanPrice} USD pe pachet de stocare de 10 GB pe an"
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr "%{selectedPlanPrice} USD pe pachet de 1.000 de minute"
msgid "Checkout|$%{selectedPlanPrice} per user per year"
-msgstr "%{selectedPlanPrice} USD per utilizator pe an"
+msgstr "%{selectedPlanPrice} USD pe utilizator pe an"
msgid "Checkout|%d CI minute pack"
msgid_plural "Checkout|%d CI minute packs"
@@ -7795,6 +7909,12 @@ msgstr "Planul GitLab"
msgid "Checkout|Group"
msgstr "Grupul"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr "Trebuie să fie de cel puțin %{minimumNumberOfUsers} (seat-urile dvs. în uz) sau mai mult."
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr "Trebuie să fie de minimum %{minimumNumberOfUsers} (seat-urile dvs. în uz, plus toți membrii care depășesc limita) sau mai mult. Pentru a cumpăra mai puține locuri, înlăturați membri din grup."
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Numele companiei sau organizației care utilizează GitLab"
@@ -7846,9 +7966,6 @@ msgstr "Succes: abonament"
msgid "Checkout|Tax"
msgstr "Taxa"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr "Acest număr trebuie să fie %{minimumNumberOfUsers} (seat-urile dvs. în uz) sau mai mult."
-
msgid "Checkout|Total"
msgstr "Total"
@@ -7912,14 +8029,17 @@ msgstr "Epica copil nu există."
msgid "Child issues and epics"
msgstr "Probleme și epice copii"
+msgid "Children"
+msgstr "Copii"
+
msgid "Chinese language support using"
msgstr "Suport pentru limba chineză folosind"
msgid "Choose File..."
-msgstr "Alegeți Fișierul..."
+msgstr "Alegeți fișierul..."
msgid "Choose a file"
-msgstr "Alegeți un fisier"
+msgstr "Alegeți un fișier"
msgid "Choose a group"
msgstr "Alegeți un grup"
@@ -7958,7 +8078,7 @@ msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "Alegeți ce repozitorii doriți să conectați pentru a rula pipeline-uri CI/CD."
msgid "Choose your framework"
-msgstr "Alegeți framework-ul dvs."
+msgstr "Alegeți framework-ul d-voastră"
msgid "CiCdAnalytics|Date range: %{range}"
msgstr "Interval de date: %{range}"
@@ -8285,7 +8405,10 @@ msgid "Closed %{epicTimeagoDate}"
msgstr "ÃŽnchis %{epicTimeagoDate}"
msgid "Closed MRs"
-msgstr "Cereri de îmbinare închise"
+msgstr "MR-uri închise"
+
+msgid "Closed date"
+msgstr "Data închiderii"
msgid "Closed issues"
msgstr "Probleme închise"
@@ -8305,6 +8428,123 @@ msgstr "Cloud Run"
msgid "Cloud Storage"
msgstr "Stocare în cloud"
+msgid "CloudSeed|All"
+msgstr "Tot"
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr "AlloyDB pentru Postgres"
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr "Servicii de baze de date disponibile prin care pot fi create instanțe"
+
+msgid "CloudSeed|Cancel"
+msgstr "Anulare"
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr "Cloud Firestore"
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr "Cloud SQL pentru MySQL"
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr "Cloud SQL pentru Postgres"
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr "Cloud SQL pentru SQL Server"
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr "Instanța CloudSQL"
+
+msgid "CloudSeed|Create cluster"
+msgstr "Creați un cluster"
+
+msgid "CloudSeed|Create database"
+msgstr "Creați o bază de date"
+
+msgid "CloudSeed|Create instance"
+msgstr "Creați o instanță"
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr "Instanța bazei de date este generată în cadrul proiectului Google Cloud selectat"
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr "Instanțele bazei de date asociate cu acest proiect"
+
+msgid "CloudSeed|Database version"
+msgstr "Versiunea bazei de date"
+
+msgid "CloudSeed|Description"
+msgstr "Descriere"
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr "Determină memoria și nucleele virtuale disponibile pentru instanța dvs."
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr "Îmbunătățiți securitatea prin stocarea variabilelor bazei de date în managerii de secrete - aflați mai multe despre %{docLinkStart}managementul secretelor cu GitLab%{docLinkEnd}"
+
+msgid "CloudSeed|Environment"
+msgstr "Mediu"
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr "Bază de date cloud NoSQL flexibilă și scalabilă pentru dezvoltarea pe partea de client și server"
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr "Serviciu complet gestionat, compatibil cu PostgreSQL, pentru sarcini de lucru cu solicitare ridicată"
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr "Serviciu de baze de date relaționale complet gestionat pentru MySQL"
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr "Serviciu de baze de date relaționale complet gestionat pentru PostgreSQL"
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr "Serviciu de baze de date relaționale complet gestionat pentru SQL Server"
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr "Instanța bazei de date generată este legată de ramura sau eticheta selectată"
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr "Proiectul Google Cloud"
+
+msgid "CloudSeed|Google Cloud project"
+msgstr "Proiectul Google Cloud"
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr "Accept prețurile Google Cloud și responsabilitățile implicate cu gestionarea instanțelor bazei de date"
+
+msgid "CloudSeed|Instances"
+msgstr "Instanțe"
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr "Aflați mai multe despre prețurile pentru %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} și %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+
+msgid "CloudSeed|Machine type"
+msgstr "Tipul mașinii"
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr "Memorystore pentru Redis"
+
+msgid "CloudSeed|No instances"
+msgstr "Nu există instanțe"
+
+msgid "CloudSeed|Refs"
+msgstr "Referințe"
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr "Serviciu în memorie scalabil, sigur și extrem de disponibil pentru Redis"
+
+msgid "CloudSeed|Service"
+msgstr "Serviciu"
+
+msgid "CloudSeed|Services"
+msgstr "Servicii"
+
+msgid "CloudSeed|There are no instances to display."
+msgstr "Nu există instanțe de afișat."
+
+msgid "CloudSeed|Version"
+msgstr "Versiunea"
+
msgid "Cluster"
msgstr "Cluster"
@@ -8314,9 +8554,6 @@ msgstr "Sănătatea Clusterului"
msgid "Cluster cache cleared."
msgstr "Cache-ul clusterului a fost curățat."
-msgid "Cluster does not exist"
-msgstr "Clusterul nu există"
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr "Clusterul este necesar pentru Stagii::ClusterEndpointInserter"
@@ -8663,7 +8900,7 @@ msgid "ClusterIntegration|API URL should be a valid http/https url."
msgstr "URL-ul API trebuie să fie un URL http/https valid."
msgid "ClusterIntegration|Add Kubernetes cluster"
-msgstr "Adăugați clusterul Kubernetes"
+msgstr "Adăugare cluster Kubernetes"
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "Adăugarea unui cluster Kubernetes la grupul dvs. va partaja automat clusterul în toate proiectele dumneavoastră. Utilizați aplicații de analiză de cod, implementați-vă aplicațiile și executați cu ușurință pipeline-urile dvs. pentru toate proiectele care utilizează același cluster."
@@ -8683,9 +8920,6 @@ msgstr "Opțiuni avansate privind integrarea acestui cluster Kubernetes"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Permiteți GitLab să administreze spațiile de nume și conturile de servicii pentru acest cluster."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr "Permite GitLab să interogheze un Elasticsearch în cluster configurat în mod specific pentru jurnalele pod."
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr "Permiteți ca GitLab să interogheze un Prometheus în cluster configurat în mod specific pentru metrici."
@@ -8725,6 +8959,9 @@ msgstr "Verificați-vă tokenul"
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Alegeți care dintre mediile dvs. vor utiliza acest cluster."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr "Civo Kubernetes"
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "Goliți cache-ul clusterului"
@@ -8770,9 +9007,6 @@ msgstr "Știați că?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Serviciul Elastic Kubernetes"
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr "Activați integrarea Elastic Stack"
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr "Activați integrarea Prometheus"
@@ -8950,11 +9184,17 @@ msgstr "Certificatul Kubernetes folosit pentru autentificarea în cluster."
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "URL-ul utilizat pentru a accesa API-ul Kubernetes."
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr "Integrarea Kubernetes bazată pe certificate a fost depreciată și va fi dezactivată la sfârșitul lunii noiembrie 2022. Vă rugăm să %{linkStart}migrați la agentul GitLab pentru Kubernetes%{linkEnd} sau să contactați asistența GitLab."
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr "Integrarea Kubernetes bazată pe certificate a fost depreciată și va fi dezactivată la sfârșitul lunii noiembrie 2022. Vă rugăm să %{linkStart}migrați la agentul GitLab pentru Kubernetes%{linkEnd}."
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr "Metoda bazată pe certificate pentru conectarea clusterelor la GitLab a fost %{linkStart}depreciată%{linkEnd} în GitLab 14.5."
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
-msgstr "Spațiul de nume asociat cu proiectul dumneavoastră. Acesta va fi utilizat pentru borduri de implementare, jurnalele și terminalele Web."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
+msgstr "Spațiul de nume asociat cu proiectul dumneavoastră. Acesta va fi utilizat pentru instalarea bordurilor de implementare și a terminalelor Web."
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
msgstr "A apărut o problemă la autentificarea cu clusterul dumneavoastră. Vă rugăm să vă asigurați că certificatul CA și tokenul sunt valabile."
@@ -9029,10 +9269,10 @@ msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr "Coverage de cod: %{coveragePercentage}%{percentSymbol}"
msgid "Code Coverage| Empty code coverage data"
-msgstr "Nu există date de coverage a codului"
+msgstr "Nu există date de coverage de cod"
msgid "Code Coverage|Couldn't fetch the code coverage data"
-msgstr "Nu s-au putut prelua datele de coverage a codului"
+msgstr "Nu s-au putut prelua datele de coverage de cod"
msgid "Code Owner"
msgstr "Proprietarul codului"
@@ -9049,8 +9289,14 @@ msgstr "Revizuirea codului"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr "Analiza revizuirii codului afișează un tabel cu merge request-uri deschise considerate a fi în curs de revizuire a codului. În prezent, nu există merge request-uri în revizuire pentru acest proiect și/sau filtre."
+msgid "Code block"
+msgstr "Bloc de cod"
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
-msgstr "Statisticile de coverage a codului pentru %{ref} %{start_date} - %{end_date}"
+msgstr "Statisticile de coverage de cod pentru %{ref} %{start_date} - %{end_date}"
msgid "Code owner approval is required"
msgstr "Este necesară aprobarea proprietarului codului"
@@ -9130,23 +9376,26 @@ msgstr "Restrângeți acest fișier (numai pentru dvs.) până când este schimb
msgid "Collector hostname"
msgstr "Numele de gazdă al colectorului"
+msgid "Color"
+msgstr "Culoare"
+
msgid "ColorWidget|An error occurred while updating color."
-msgstr ""
+msgstr "S-a produs o eroare în timp ce se actualiza culoarea."
msgid "ColorWidget|Assign epic color"
-msgstr ""
+msgstr "Atribuiți culoarea epicei"
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "Culoare"
msgid "ColorWidget|Error fetching epic color."
-msgstr ""
+msgstr "Eroare la preluarea culorii epicei"
msgid "Colorize messages"
-msgstr "Colorează mesajele"
+msgstr "Colorați mesajele"
msgid "ComboSearch is not defined"
-msgstr "ComboSearch nu este definită"
+msgstr "ComboSearch nu este definit"
msgid "Comma-separated list of email addresses."
msgstr "Lista adreselor de e-mail separate prin virgulă."
@@ -9188,10 +9437,10 @@ msgid "Comment/Reply (quoting selected text)"
msgstr "Comentariu/Răspuns (citând textul selectat)"
msgid "Commenting on files that replace or are replaced by symbolic links is currently not supported."
-msgstr ""
+msgstr "Comentarea fișierelor care înlocuiesc sau sunt înlocuite de legături simbolice nu este acceptată în prezent."
msgid "Commenting on symbolic links that replace or are replaced by files is currently not supported."
-msgstr ""
+msgstr "Comentarea legăturilor simbolice care înlocuiesc sau sunt înlocuite de fișiere nu este acceptată în prezent."
msgid "Comments"
msgstr "Comentarii"
@@ -9206,7 +9455,7 @@ msgid "Commit %{commit_id}"
msgstr "Commit %{commit_id}"
msgid "Commit (when editing commit message)"
-msgstr "Commit (la editarea mesajului de commit)"
+msgstr "Commit (când editați un mesaj de commit)"
msgid "Commit Message"
msgstr "Mesajul commit-ului"
@@ -9215,7 +9464,7 @@ msgid "Commit SHA"
msgstr "SHA de commit"
msgid "Commit changes"
-msgstr ""
+msgstr "Comiteți modificările"
msgid "Commit deleted"
msgstr "Commit șters"
@@ -9224,7 +9473,7 @@ msgid "Commit message"
msgstr "Mesajul commit-ului"
msgid "Commit message (optional)"
-msgstr ""
+msgstr "Mesaj de commit (opțional)"
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Statistici de commit-uri pentru %{ref} %{start_time} - %{end_time}"
@@ -9284,19 +9533,19 @@ msgid "Company Name"
msgstr "Numele companiei"
msgid "Compare"
-msgstr ""
+msgstr "Comparați"
msgid "Compare %{oldCommitId}...%{newCommitId}"
msgstr "Comparați %{oldCommitId}...%{newCommitId}"
msgid "Compare Git revisions"
-msgstr "Comparați reviziile Git"
+msgstr "Comparați revizuirile Git"
msgid "Compare GitLab editions"
msgstr "Comparați edițiile GitLab"
msgid "Compare Revisions"
-msgstr ""
+msgstr "Comparați revizuirile"
msgid "Compare changes"
msgstr "Comparați modificările"
@@ -9308,7 +9557,7 @@ msgid "Compare changes with the merge request target branch"
msgstr "Comparați modificările cu ramura țintă a merge request-ului"
msgid "Compare submodule commit revisions"
-msgstr ""
+msgstr "Comparați revizuirile commit-ului submodulului"
msgid "Compare with previous version"
msgstr "Comparați cu versiunea anterioară"
@@ -9365,19 +9614,19 @@ msgid "Complete verification to sign in."
msgstr "Completați verificarea pentru a vă autentifica."
msgid "Completed"
-msgstr ""
+msgstr "Completat"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "S-a completat în %{duration_seconds} (de) secunde (%{relative_time})"
msgid "Compliance framework"
-msgstr ""
+msgstr "Framework de conformitate"
msgid "Compliance report"
msgstr "Raport de conformitate"
msgid "ComplianceFrameworks|Add framework"
-msgstr "Adăugați un framework"
+msgstr "Adăugare framework"
msgid "ComplianceFrameworks|Background color"
msgstr "Culoare de fundal"
@@ -9497,10 +9746,10 @@ msgid "Configuration help"
msgstr "Ajutor pentru configurare"
msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
-msgstr "Configurați sertarul și conținutul %{italic_start}Noutăți%{italic_end}."
+msgstr "Configurați meniul și conținutul %{italic_start}Ce este nou%{italic_end}."
msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
-msgstr "Configurați %{link} pentru a urmări evenimentele. %{link_start}Învățați mai multe.%{link_end}"
+msgstr "Configurați %{link} pentru a urmări evenimentele. %{link_start}Aflați mai multe.%{link_end}"
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr "Configurați %{repository_checks_link_start}controalele de repozitoriu%{link_end} și %{housekeeping_link_start}curățenia%{link_end} în repozitorii."
@@ -9520,6 +9769,9 @@ msgstr "Configurați Scanarea dependențelor în „.gitlab-ci.yml†utilizând
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "ConfiguraÈ›i Scanarea dependenÈ›elor în „.gitlab-ci.ymlâ€, creând acest fiÈ™ier dacă nu există deja"
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr "Configurați GitLab"
@@ -9530,7 +9782,7 @@ msgid "Configure Gitaly timeouts."
msgstr "Configurați timeout-urile Gitaly."
msgid "Configure Integrations"
-msgstr ""
+msgstr "Configurați integrările"
msgid "Configure Prometheus"
msgstr "Configurați Prometheus"
@@ -9556,17 +9808,17 @@ msgstr "ConfiguraÈ›i Detectarea secretelor în „.gitlab-ci.ymlâ€, creând ace
msgid "Configure Sentry integration for error tracking"
msgstr "Configurați integrarea Sentry pentru urmărirea erorilor"
-msgid "Configure Tracing"
-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 "Configurați un fișier %{codeStart}.gitlab-webide.yml%{codeEnd} în directorul %{codeStart}.gitlab%{codeEnd} pentru a începe să utilizați Terminalul Web. %{helpStart}Aflați mai multe.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr "Configurați permisiunile avansate, Large File Storage, autentificarea cu doi factori și setările privind relațiile cu clienții."
msgid "Configure existing installation"
-msgstr ""
+msgstr "Configurați instalația existentă"
msgid "Configure pipeline"
msgstr "Configurați pipeline-ul"
@@ -9620,10 +9872,10 @@ msgid "Configure with a merge request"
msgstr "Configurați cu un merge request"
msgid "Configure your environments to be deployed to specific geographical regions"
-msgstr "Configurați mediile dvs. pentru a fi desfășurate în regiuni geografice specifice"
+msgstr "Configurați-vă mediile pentru a fi implementate în regiuni geografice specifice"
msgid "Confirm"
-msgstr ""
+msgstr "Confirmați"
msgid "Confirm approval"
msgstr "Confirmați aprobarea"
@@ -9656,10 +9908,10 @@ msgid "Confirmed:"
msgstr "Confirmat:"
msgid "Conflict: This file was added both in the source and target branches, but with different contents."
-msgstr "Conflict: Acest fișier a fost adăugat atât în ramurile sursei, cât și în cele țintă, dar cu conținut diferit."
+msgstr "Conflict: Acest fișier a fost adăugat atât în ramura sursă, cât și în ramura țintă, dar cu conținuturi diferite."
msgid "Conflict: This file was modified in both the source and target branches."
-msgstr "Conflict: Acest fișier a fost modificat atât în ramurile sursă, cât și în ramurile țintă."
+msgstr "Conflict: Acest fișier a fost modificat atât în ramura sursă, cât și în ramura țintă."
msgid "Conflict: This file was modified in the source branch, but removed in the target branch."
msgstr "Conflict: Acest fișier a fost modificat în ramura sursă, dar înlăturat în ramura țintă."
@@ -9680,7 +9932,7 @@ msgid "Confluence"
msgstr "Confluence"
msgid "Confluence Cloud Workspace URL"
-msgstr "Adresa URL a spațiului de lucru Cloud Confluence"
+msgstr "URL-ul spațiului de lucru Confluence Cloud"
msgid "ConfluenceService|Confluence Workspace"
msgstr "Spațiul de lucru Confluence"
@@ -9695,7 +9947,7 @@ msgid "ConfluenceService|Your GitLab wiki is still available at %{wiki_link}. To
msgstr "Wiki-ul dvs. GitLab este încă disponibil la %{wiki_link}. Pentru a reactiva linkul către wiki-ul GitLab, dezactivați această integrare."
msgid "Congratulations, your free trial is activated."
-msgstr "Felicitări, evaluarea dvs. gratuită este activată."
+msgstr "Felicitări, versiunea dvs. de încercare gratuită este activată."
msgid "Connect"
msgstr "Conectare"
@@ -9707,7 +9959,7 @@ msgid "Connect a cluster"
msgstr "Conectați un cluster"
msgid "Connect all repositories"
-msgstr ""
+msgstr "Conectați toate repozitoriile"
msgid "Connect repositories from GitHub"
msgstr "Conectați repozitoriile de la GitHub"
@@ -9719,28 +9971,28 @@ msgid "Connected"
msgstr "Conectat"
msgid "Connecting"
-msgstr ""
+msgstr "Conectarea"
msgid "Connecting to terminal sync service"
msgstr "Se conectează la serviciul de sincronizare a terminalului"
msgid "Connecting..."
-msgstr ""
+msgstr "Se conectează..."
msgid "Connection failed"
-msgstr ""
+msgstr "Conectare eșuată"
msgid "Connection failure"
-msgstr ""
+msgstr "Eșec de conectare"
msgid "Connection timed out"
-msgstr ""
+msgstr "Conexiunea a expirat"
msgid "Consistency guarantee method"
-msgstr ""
+msgstr "Metoda de garantare a consistenței"
msgid "Contact support"
-msgstr ""
+msgstr "Contactați asistența"
msgid "Contacts"
msgstr "Contacte"
@@ -9751,9 +10003,6 @@ msgstr "Registrul de containere"
msgid "Container Scanning"
msgstr "Scanarea containerelor"
-msgid "Container does not exist"
-msgstr "Containerul nu există"
-
msgid "Container must be a project or a group."
msgstr "Containerul trebuie să fie un proiect sau un grup."
@@ -9803,7 +10052,7 @@ msgid "ContainerRegistry|CLI Commands"
msgstr "Comenzi CLI"
msgid "ContainerRegistry|Clean up image tags"
-msgstr ""
+msgstr "Curățați etichetele imaginii"
msgid "ContainerRegistry|Cleanup disabled"
msgstr "Curățarea dezactivată"
@@ -9956,7 +10205,7 @@ msgid "ContainerRegistry|Push an image"
msgstr "Faceți push unei imagini"
msgid "ContainerRegistry|Remember to run %{docLinkStart}garbage collection%{docLinkEnd} to remove the stale data from storage."
-msgstr "Nu uitați să executați %{docLinkStart}colectarea de gunoaie%{docLinkEnd} pentru a înlătura datele vechi din stocare"
+msgstr "Nu uitați să executați %{docLinkStart}colectarea de gunoi%{docLinkEnd} pentru a înlătura datele vechi din stocare"
msgid "ContainerRegistry|Remove repository"
msgstr "Înlăturați repozitoriul"
@@ -9976,18 +10225,18 @@ msgstr "Înlăturați etichetele mai vechi de:"
msgid "ContainerRegistry|Remove these tags"
msgstr "Înlăturați aceste etichete"
-msgid "ContainerRegistry|Root image"
-msgstr "Imaginea rădăcină"
-
msgid "ContainerRegistry|Run cleanup:"
msgstr "Executați curățarea:"
msgid "ContainerRegistry|Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
-msgstr ""
+msgstr "Economisiți spațiu de stocare prin ștergerea automată a etichetelor din registrul container și păstrarea celor pe care le doriți. %{linkStart}Cum funcționează curățarea?%{linkEnd}"
msgid "ContainerRegistry|Set up cleanup"
msgstr "Configurați curățarea"
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Unele etichete nu au fost șterse"
@@ -10112,13 +10361,13 @@ msgid "ContainerRegistry|You can add an image to this registry with the followin
msgstr "Puteți adăuga o imagine în acest registru cu ajutorul următoarelor comenzi:"
msgid "Content parsed with %{link}."
-msgstr ""
+msgstr "Conținut analizat cu %{link}."
msgid "ContentEditor|Table of Contents"
msgstr "Cuprins"
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
-msgstr ""
+msgstr "Trebuie să furnizați o funcție renderMarkdown sau un serializator personalizat"
msgid "Contents of .gitlab-ci.yml"
msgstr "Conținutul fișierului .gitlab-ci.yml"
@@ -10133,7 +10382,7 @@ msgid "ContextCommits|Failed to delete context commits. Please try again."
msgstr "Nu s-au putut șterge commit-urile de context. Vă rugăm să încercați din nou."
msgid "Continue"
-msgstr ""
+msgstr "Continuați"
msgid "Continue editing"
msgstr "Continuați editarea"
@@ -10148,10 +10397,10 @@ msgid "Contribute to GitLab"
msgstr "Contribuiți la GitLab"
msgid "Contribution"
-msgstr ""
+msgstr "Contribuție"
msgid "Contribution Analytics"
-msgstr ""
+msgstr "Analize de contribuții"
msgid "ContributionAnalytics|%{created_count} created, %{closed_count} closed."
msgstr "%{created_count} create, %{closed_count} închise."
@@ -10160,7 +10409,7 @@ msgid "ContributionAnalytics|%{created_count} created, %{merged_count} merged, %
msgstr "%{created_count} create, %{merged_count} îmbinate, %{closed_count} închise."
msgid "ContributionAnalytics|%{pushes} pushes, more than %{commits} commits by %{people} contributors."
-msgstr "%{pushes} de împingeri, mai mult de %{commits} de commit-uri de la %{people} care au contribuit."
+msgstr "%{pushes} (de) împingeri, mai mult de %{commits} (de) commit-uri de la %{people} care au contribuit."
msgid "ContributionAnalytics|Contribution analytics for issues, merge requests and push events since %{start_date}"
msgstr "Analiza contribuțiilor pentru probleme, merge request-uri și evenimente push de la %{start_date}"
@@ -10190,22 +10439,22 @@ msgid "ContributionAnalytics|No pushes for the selected time period."
msgstr "Nu există împingeri pentru perioada de timp selectată."
msgid "Contributions for %{calendar_date}"
-msgstr ""
+msgstr "Contribuții pentru %{calendar_date}"
msgid "Contributions per group member"
-msgstr ""
+msgstr "Contribuții pe membru de grup"
msgid "Contributor"
-msgstr ""
+msgstr "Colaborator"
msgid "Contributors"
-msgstr ""
+msgstr "Colaboratori"
msgid "Control emails linked to your account"
-msgstr ""
+msgstr "Controlați e-mailurile legate de contul d-voastră"
msgid "Control how the GitLab Package Registry functions."
-msgstr "Controlați modul în care funcționează Registrul Pachetului GitLab."
+msgstr "Controlați modul în care funcționează Registrul de pachete GitLab."
msgid "Control whether to display customer experience improvement content and third-party offers in GitLab."
msgstr "Controlați dacă doriți să afișați conținutul de îmbunătățire a experienței clienților și ofertele terților în GitLab."
@@ -10214,7 +10463,7 @@ msgid "Control which projects can be accessed by API requests authenticated with
msgstr "Controlați ce proiecte pot fi accesate prin cereri API autentificate cu variabila CI/CD CI_JOB_TOKEN a acestui proiect. Dezactivarea acestei funcții reprezintă un risc de securitate, deoarece proiectele neautorizate ar putea încerca să recupereze un token activ și să acceseze API-ul."
msgid "Cookie domain"
-msgstr ""
+msgstr "Domeniul cookie"
msgid "Copied"
msgstr "S-a copiat"
@@ -10223,73 +10472,73 @@ msgid "Copied labels and milestone from %{source_issuable_reference}."
msgstr "S-au copia etichetele și obiectivul din %{source_issuable_reference}"
msgid "Copy"
-msgstr ""
+msgstr "Copiere"
msgid "Copy %{accessTokenType}"
msgstr "Copiați %{accessTokenType}"
msgid "Copy %{http_label} clone URL"
-msgstr ""
+msgstr "Copiați URL-ul clonei %{http_label}"
msgid "Copy %{name}"
-msgstr ""
+msgstr "Copiați %{name}"
msgid "Copy %{protocol} clone URL"
-msgstr ""
+msgstr "Copiați URL-ul clonei %{protocol}"
msgid "Copy %{type}"
-msgstr ""
+msgstr "Copiați %{type}"
msgid "Copy ID"
-msgstr ""
+msgstr "Copiați ID-ul"
msgid "Copy KRB5 clone URL"
-msgstr ""
+msgstr "Copiați URL-ul clonei KRB5"
msgid "Copy SSH clone URL"
-msgstr ""
+msgstr "Copiați URL-ul clonei SSH"
msgid "Copy SSH public key"
-msgstr ""
+msgstr "Copiați cheia publică SSH"
msgid "Copy URL"
-msgstr ""
+msgstr "Copiați URL-ul"
msgid "Copy audio URL"
msgstr "Copiați URL-ul audio"
msgid "Copy branch name"
-msgstr ""
+msgstr "Copiați numele ramurii"
msgid "Copy code"
msgstr "Copiere cod"
msgid "Copy codes"
-msgstr ""
+msgstr "Copiați codurile"
msgid "Copy command"
-msgstr ""
+msgstr "Copiați comanda"
msgid "Copy commands"
-msgstr ""
+msgstr "Copiați comenzile"
msgid "Copy commit SHA"
-msgstr ""
+msgstr "Copiați commit-ul SHA"
msgid "Copy environment"
-msgstr ""
+msgstr "Copiați mediul"
msgid "Copy evidence SHA"
-msgstr ""
+msgstr "Copiază dovada SHA"
msgid "Copy failed. Please manually copy the value."
msgstr "Copierea nu a reușit. Vă rugăm să copiați manual valoarea."
msgid "Copy file contents"
-msgstr ""
+msgstr "Copiați conținutul fișierului"
msgid "Copy file path"
-msgstr ""
+msgstr "Copiați calea fișierului"
msgid "Copy image URL"
msgstr "Copiați URL-ul imaginii"
@@ -10298,16 +10547,16 @@ msgid "Copy issue URL to clipboard"
msgstr "Copiați URL-ul problemei în clipboard"
msgid "Copy key"
-msgstr ""
+msgstr "Copiați cheia"
msgid "Copy labels and milestone from %{source_issuable_reference}."
-msgstr ""
+msgstr "Copiați etichetele și obiectivul din %{source_issuable_reference}"
msgid "Copy labels and milestone from other issue or merge request in this project"
msgstr "Copiați etichetele și obiectivul din altă problemă sau merge request în acest proiect"
msgid "Copy link"
-msgstr ""
+msgstr "Copiați linkul"
msgid "Copy link URL"
msgstr "Copiere URL de link"
@@ -10316,16 +10565,16 @@ msgid "Copy link to chart"
msgstr "Copiați linkul către grafic"
msgid "Copy reference"
-msgstr ""
+msgstr "Copiați referința"
msgid "Copy secret"
-msgstr ""
+msgstr "Copiați secretul"
msgid "Copy source branch name"
-msgstr ""
+msgstr "Copiați numele ramurii sursă"
msgid "Copy the code below to implement tracking in your application:"
-msgstr ""
+msgstr "Copiați codul de mai jos pentru a implementa urmărirea în aplicația d-voastră:"
msgid "Copy this registration token."
msgstr "Copiați acest token de înregistrare."
@@ -10334,13 +10583,13 @@ msgid "Copy to clipboard"
msgstr "Copiați în clipboard"
msgid "Copy token"
-msgstr ""
+msgstr "Copiați tokenul"
msgid "Copy trigger token"
msgstr "Copiați tokenului de declanșare"
msgid "Copy value"
-msgstr ""
+msgstr "Copiați valoarea"
msgid "Copy video URL"
msgstr "Copiază URL-ul videoului"
@@ -10415,7 +10664,7 @@ msgid "Could not add admins as members"
msgstr "Administratorii nu pot fi adăugați ca membri"
msgid "Could not apply %{name} command."
-msgstr ""
+msgstr "Nu a putut fi aplicată comanda %{name}."
msgid "Could not apply %{name} command. %{message}."
msgstr "Nu a putut fi aplicată comanda %{name}. %{message}."
@@ -10439,34 +10688,34 @@ msgid "Could not connect to Web IDE file mirror service."
msgstr "Nu s-a putut conecta la serviciul de replicare a fișierelor Web IDE."
msgid "Could not create Wiki Repository at this time. Please try again later."
-msgstr ""
+msgstr "Nu s-a putut crea repozitoriul Wiki în acest moment. Vă rugăm să încercați din nou mai târziu."
msgid "Could not create environment"
-msgstr ""
+msgstr "Nu s-a putut crea mediul"
msgid "Could not create group"
-msgstr ""
+msgstr "Nu s-a putut crea grupul"
msgid "Could not create issue"
-msgstr ""
+msgstr "Nu s-a putut crea problema"
msgid "Could not create project"
-msgstr ""
+msgstr "Nu s-a putut crea proiectul"
msgid "Could not create wiki page"
-msgstr ""
+msgstr "Nu s-a putut crea pagina wiki"
msgid "Could not delete chat nickname %{chat_name}."
-msgstr ""
+msgstr "Nu s-a putut șterge porecla de chat %{chat_name}."
msgid "Could not delete wiki page"
-msgstr ""
+msgstr "Nu s-a putut șterge pagina wiki"
msgid "Could not draw the lines for job relationships"
msgstr "Nu s-au putut trasa liniile pentru relațiile între joburi"
msgid "Could not fetch policy because existing policy YAML is invalid"
-msgstr "Nu s-a putut prelua politica, deoarece politica existentă YAML este invalidă"
+msgstr "Nu s-a putut prelua politica deoarece YAML-ul politicii existente nu este valid"
msgid "Could not fetch training providers. Please refresh the page, or try again later."
msgstr "Nu se pot prelua furnizorii de formare. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
@@ -10475,10 +10724,10 @@ msgid "Could not find design."
msgstr "Nu am găsit designul."
msgid "Could not find iteration"
-msgstr ""
+msgstr "Nu s-a putut găsi iterația"
msgid "Could not get the data properly"
-msgstr ""
+msgstr "Nu s-a putut obține datele în mod corespunzător"
msgid "Could not load the user chart. Please refresh the page to try again."
msgstr "Nu se poate încărca graficul utilizatorului. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
@@ -10496,7 +10745,7 @@ msgid "Could not remove the trigger."
msgstr "Nu s-a putut înlătura declanșatorul."
msgid "Could not restore the group"
-msgstr ""
+msgstr "Nu s-a putut restabili grupul"
msgid "Could not revoke access token %{access_token_name}."
msgstr "Nu s-a putut revoca tokenul de acces %{access_token_name}."
@@ -10511,19 +10760,19 @@ msgid "Could not save configuration. Please refresh the page, or try again later
msgstr "Nu se poate salva configurația. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "Could not save group ID"
-msgstr ""
+msgstr "Nu s-a putut salva ID-ul grupului"
msgid "Could not save project ID"
-msgstr ""
+msgstr "Nu s-a putut salva ID-ul proiectului"
msgid "Could not save prometheus manual configuration"
-msgstr ""
+msgstr "Nu s-a putut salva configurația manuală prometheus"
msgid "Could not update the LDAP settings"
-msgstr ""
+msgstr "Nu s-au putut actualiza setările LDAP"
msgid "Could not update wiki page"
-msgstr ""
+msgstr "Nu s-a putut actualiza pagina wiki"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "Nu s-au putut încărca design-urile, deoarece unul sau mai multe fișiere încărcate nu sunt acceptate."
@@ -10541,16 +10790,16 @@ msgid "Coverage Fuzzing"
msgstr "Fuzzing prin coverage"
msgid "Create"
-msgstr ""
+msgstr "Creați"
msgid "Create %{environment}"
-msgstr ""
+msgstr "Creați %{environment}"
msgid "Create %{humanized_resource_name}"
-msgstr ""
+msgstr "Creați %{humanized_resource_name}"
msgid "Create %{type}"
-msgstr ""
+msgstr "Creați %{type}"
msgid "Create %{workspace} label"
msgstr "Creați eticheta %{workspace}"
@@ -10559,19 +10808,19 @@ msgid "Create Google Cloud project"
msgstr "Creați proiectul Google Cloud"
msgid "Create New Directory"
-msgstr ""
+msgstr "Creați un nou director"
msgid "Create New Domain"
-msgstr ""
+msgstr "Creați un domeniu nou"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
-msgstr ""
+msgstr "Creați mai întâi un cont GitLab, apoi conectați-l la contul dvs. %{label}."
msgid "Create a Kubernetes cluster"
msgstr "Creați un cluster Kubernetes"
msgid "Create a Mattermost team for this group"
-msgstr ""
+msgstr "Creați o echipă Mattermost pentru acest grup"
msgid "Create a cluster"
msgstr "Creați un cluster"
@@ -10586,19 +10835,19 @@ msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the
msgstr "Creați un nou fișier %{codeStart}.gitlab-ci.yml%{codeEnd} la rădăcina repozitoriului pentru a începe."
msgid "Create a new branch"
-msgstr ""
+msgstr "Creați o nouă ramură"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Creați un fișier nou, deoarece nu există încă niciun fișier. După aceea, veți putea să vă comiteți modificările."
msgid "Create a new issue"
-msgstr ""
+msgstr "Creați o nouă problemă"
msgid "Create a new project"
msgstr "Creați un nou proiect"
msgid "Create a new repository"
-msgstr "Creați un repozitoriu nou"
+msgstr "Creați un nou repozitoriu"
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Create un token de acces personal în contul dvs. pentru a utiliza pull sau push prin %{protocol}."
@@ -10607,7 +10856,7 @@ msgid "Create a project"
msgstr "Creați un proiect"
msgid "Create an account using:"
-msgstr ""
+msgstr "Creați un cont folosind:"
msgid "Create an incident. Incidents are created for each alert triggered."
msgstr "Creați un incident. Incidentele sunt create pentru fiecare alertă declanșată."
@@ -10616,13 +10865,13 @@ msgid "Create and provide your GitHub %{link_start}Personal Access Token%{link_e
msgstr "Creați și furnizați %{link_start}Tokenul de acces personal%{link_end} GitHub. Va trebui să selectați domeniul %{code_open}repo%{code_close}, astfel încât să putem afișa o listă cu repozitoriile dvs. publice și private care sunt disponibile pentru import."
msgid "Create branch"
-msgstr ""
+msgstr "Creați ramura"
msgid "Create commit"
msgstr "Creați un commit"
msgid "Create commit..."
-msgstr "Creați un commit..."
+msgstr "Se creează commit-ul..."
msgid "Create common files more quickly, and standardize their format."
msgstr "Creați mai rapid fișiere comune și standardizați formatul acestora."
@@ -10637,7 +10886,7 @@ msgid "Create custom type"
msgstr "Creați un tip personalizat"
msgid "Create directory"
-msgstr ""
+msgstr "Creați directorul"
msgid "Create empty repository"
msgstr "Creați un repozitoriu gol"
@@ -10646,19 +10895,19 @@ msgid "Create epic"
msgstr "Creați o epică"
msgid "Create file"
-msgstr ""
+msgstr "Creați fișierul"
msgid "Create from"
-msgstr ""
+msgstr "Creați din"
msgid "Create group"
-msgstr ""
+msgstr "Creați grupul"
msgid "Create group label"
-msgstr ""
+msgstr "Creați o etichetă de grup"
msgid "Create issue"
-msgstr ""
+msgstr "Creați problema"
msgid "Create issue to resolve all threads"
msgstr "Creați o problemă pentru a rezolva toate subiectele"
@@ -10667,13 +10916,13 @@ msgid "Create iteration"
msgstr "Creați iterația"
msgid "Create label"
-msgstr "Creați o etichetă"
+msgstr "Creează eticheta"
msgid "Create list"
-msgstr ""
+msgstr "Creați lista"
msgid "Create lists from labels. Issues with that label appear in that list."
-msgstr ""
+msgstr "Creați liste din etichete. Problemele cu această etichetă apar în lista respectivă."
msgid "Create merge request"
msgstr "Creați un merge request"
@@ -10685,35 +10934,38 @@ msgid "Create milestone"
msgstr "Creați un obiectiv"
msgid "Create new"
-msgstr ""
+msgstr "Creare de nou(ă)"
msgid "Create new %{name} by email"
msgstr "Creați o nouă %{name} prin e-mail"
msgid "Create new Value Stream"
-msgstr "Creați un Value Stream"
+msgstr "Creați un nou Flux de valori"
msgid "Create new branch"
msgstr "Creați o ramură nouă"
msgid "Create new confidential %{issuableType}"
-msgstr "Creați un/o %{issuableType} de tip confidențial nou(ă)"
+msgstr "Creați un / o %{issuableType} de tip confidențial nou(ă)"
msgid "Create new directory"
-msgstr ""
+msgstr "Creați un nou director"
msgid "Create new file"
-msgstr ""
+msgstr "Creați un fișier nou"
msgid "Create new file or directory"
-msgstr ""
+msgstr "Creați un nou fișier sau un director"
msgid "Create new label"
-msgstr ""
+msgstr "Creați o nouă etichetă"
msgid "Create new project"
msgstr "Creați un nou proiect"
+msgid "Create new..."
+msgstr "Creare de nou(ă)..."
+
msgid "Create one"
msgstr "Creați unul"
@@ -10724,16 +10976,16 @@ msgid "Create or import your first project"
msgstr "Creați sau importați primul dvs. proiect"
msgid "Create project"
-msgstr ""
+msgstr "Creați proiectul"
msgid "Create project label"
-msgstr ""
+msgstr "Creați o etichetă de proiect"
msgid "Create release"
msgstr "Creați versiunea"
msgid "Create requirement"
-msgstr ""
+msgstr "Creați o cerință"
msgid "Create service account"
msgstr "Creați un cont de servicii"
@@ -10742,22 +10994,22 @@ msgid "Create snippet"
msgstr "Creați un fragment de cod"
msgid "Create tag %{tagName}"
-msgstr ""
+msgstr "Creați eticheta %{tagName}"
msgid "Create topic"
msgstr "Creați un subiect"
msgid "Create user"
-msgstr ""
+msgstr "Creați utilizatorul"
msgid "Create wildcard: %{searchTerm}"
-msgstr ""
+msgstr "Creați un wildcard: %{searchTerm}"
msgid "Create your first page"
-msgstr ""
+msgstr "Creați-vă prima pagină"
msgid "Create your group"
-msgstr ""
+msgstr "Creați-vă grupul"
msgid "Create, update, or delete a merge request."
msgstr "Creați, actualizați sau ștergeți un merge request."
@@ -10772,7 +11024,7 @@ msgid "CreateGroup|You don’t have permission to create groups."
msgstr "Nu aveți permisiunea de a crea grupuri."
msgid "CreateTag|Tag"
-msgstr ""
+msgstr "Etichetă"
msgid "CreateValueStreamForm|%{name} (default)"
msgstr "%{name} (implicit)"
@@ -10823,7 +11075,7 @@ msgid "CreateValueStreamForm|End event"
msgstr "Eveniment final"
msgid "CreateValueStreamForm|End event label"
-msgstr "Etichetă de eveniment final"
+msgstr "Eticheta evenimentului final"
msgid "CreateValueStreamForm|End event: "
msgstr "Eveniment final: "
@@ -10880,19 +11132,19 @@ msgid "CreateValueStreamForm|Stage name already exists"
msgstr "Numele etapei există deja"
msgid "CreateValueStreamForm|Stage name is required"
-msgstr "Este necesar numele etapei"
+msgstr "Numele etapei este necesar"
msgid "CreateValueStreamForm|Start event"
-msgstr "Eveniment de start"
+msgstr "Eveniment de început"
msgid "CreateValueStreamForm|Start event changed, please select a valid end event"
-msgstr "Evenimentul de start s-a schimbat, vă rugăm să selectați un eveniment final valid"
+msgstr "Evenimentul de început s-a schimbat, vă rugăm să selectați un eveniment de sfârșit valid"
msgid "CreateValueStreamForm|Start event label"
-msgstr "Eticheta evenimentului de start"
+msgstr "Eticheta evenimentului de început"
msgid "CreateValueStreamForm|Start event: "
-msgstr "Eveniment de start: "
+msgstr "Eveniment de început: "
msgid "CreateValueStreamForm|Update stage"
msgstr "Etapa de actualizare"
@@ -10901,34 +11153,34 @@ msgid "CreateValueStreamForm|Value Stream name"
msgstr "Numele Fluxului de valori"
msgid "Created"
-msgstr ""
+msgstr "Creat"
msgid "Created %{epicTimeagoDate}"
msgstr "Creată %{epicTimeagoDate}"
msgid "Created %{timestamp}"
-msgstr ""
+msgstr "A fost creat la %{timestamp}"
msgid "Created At"
-msgstr ""
+msgstr "Creat la"
msgid "Created On"
-msgstr ""
+msgstr "Creat pe"
msgid "Created a branch and a merge request to resolve this issue."
msgstr "Am creat o ramură și un merge request pentru a rezolva această problemă."
msgid "Created branch '%{branch_name}' and a merge request to resolve this issue."
-msgstr "S-a creat ramura \"%{branch_name}\" și un merge request pentru a rezolva această problemă."
+msgstr "S-a creat ramura „%{branch_name}†și un merge request pentru a rezolva această problemă."
msgid "Created by %{job}"
-msgstr ""
+msgstr "Creat(ă) de %{job}"
msgid "Created by me"
-msgstr ""
+msgstr "Creat(ă) de mine"
msgid "Created by:"
-msgstr ""
+msgstr "Creat(ă) de:"
msgid "Created compliance violations if any were found"
msgstr "În cazul în care au fost găsite, au fost create încălcări ale conformității"
@@ -10937,10 +11189,10 @@ msgid "Created date"
msgstr "Data creării"
msgid "Created issue %{issueLink}"
-msgstr ""
+msgstr "A creat problema %{issueLink}"
msgid "Created issue %{issueLink} at %{projectLink}"
-msgstr ""
+msgstr "S-a creat problema %{issueLink} la %{projectLink}"
msgid "Created merge request %{mergeRequestLink}"
msgstr "S-a creat merge request-ul %{mergeRequestLink}"
@@ -10949,13 +11201,13 @@ msgid "Created merge request %{mergeRequestLink} at %{projectLink}"
msgstr "S-a creat merge request-ul %{mergeRequestLink} în %{projectLink}"
msgid "Created on"
-msgstr ""
+msgstr "Creat(ă) în"
msgid "Created on %{created_at}"
-msgstr ""
+msgstr "Creat(ă) la %{created_at}"
msgid "Created on:"
-msgstr ""
+msgstr "Creat(ă) in:"
msgid "Creates a branch and a merge request to resolve this issue."
msgstr "Creează o ramură și un merge request pentru a rezolva această problemă."
@@ -10964,28 +11216,28 @@ msgid "Creates branch '%{branch_name}' and a merge request to resolve this issue
msgstr "Creează ramura „%{branch_name}†și un merge request pentru a rezolva această problemă."
msgid "Creating"
-msgstr ""
+msgstr "Se creează"
msgid "Creating epic"
msgstr "Se creează epica"
msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
+msgstr "Crearea graficelor utilizează datele de pe serverul Prometheus. Dacă durează mult, asigurați-vă că datele sunt disponibile."
msgid "Creation date"
-msgstr ""
+msgstr "Data creării"
msgid "Creator"
msgstr "Creator"
msgid "Credentials"
-msgstr ""
+msgstr "Acreditări"
msgid "CredentialsInventory|GPG Keys"
-msgstr ""
+msgstr "Chei GPG"
msgid "CredentialsInventory|No credentials found"
-msgstr ""
+msgstr "Nu s-au găsit acreditări"
msgid "CredentialsInventory|Personal Access Tokens"
msgstr "Tokenuri de acces personal"
@@ -10994,7 +11246,7 @@ msgid "CredentialsInventory|Project Access Tokens"
msgstr "Tokenuri de acces la proiect"
msgid "CredentialsInventory|SSH Keys"
-msgstr ""
+msgstr "Chei SSH"
msgid "Credit card required to be on file in order to create a pipeline"
msgstr "Cardul de credit trebuie să fie la dosar pentru a crea o conductă"
@@ -11003,7 +11255,7 @@ msgid "Credit card:"
msgstr "Card de credit:"
msgid "Critical vulnerabilities present"
-msgstr ""
+msgstr "Vulnerabilități critice prezente"
msgid "Crm|Contact"
msgstr "Contact"
@@ -11054,19 +11306,19 @@ msgid "Crm|Organization has been updated."
msgstr "Organizația a fost actualizată."
msgid "Cron Timezone"
-msgstr ""
+msgstr "Fusul orar Cron"
msgid "Cron time zone"
-msgstr ""
+msgstr "Fusul orar Cron"
msgid "Crowd"
-msgstr ""
+msgstr "Crowd"
msgid "CsvParser|Failed to render the CSV file for the following reasons:"
msgstr "Nu s-a reușit redarea fișierului CSV din următoarele motive:"
msgid "CsvParser|Quoted field unterminated"
-msgstr "Câmp între ghilimele neterminat"
+msgstr "Câmpul citat neterminat"
msgid "CsvParser|Too few fields"
msgstr "Prea puține câmpuri"
@@ -11075,40 +11327,40 @@ msgid "CsvParser|Too many fields"
msgstr "Prea multe câmpuri"
msgid "CsvParser|Trailing quote on quoted field is malformed"
-msgstr "Ghilimelele de sfârșit ale câmpului între ghilimele sunt malformate"
+msgstr "Ghilimelele de la sfârșitul câmpului citat sunt malformate"
msgid "CsvParser|Unable to auto-detect delimiter; defaulted to \",\""
msgstr "Imposibil de detectat automat delimitatorul; implicit la „ ,â€"
msgid "Current"
-msgstr ""
+msgstr "Actual"
msgid "Current Branch"
-msgstr ""
+msgstr "Ramura actuală"
msgid "Current Project"
-msgstr ""
+msgstr "Proiectul actual"
msgid "Current forks will keep their visibility level."
msgstr "Forkurile actuale își vor păstra nivelul de vizibilitate."
msgid "Current node must be the primary node or you will be locking yourself out"
-msgstr ""
+msgstr "Nodul actual trebuie să fie nodul primar, altfel vă blocați singur."
msgid "Current password"
-msgstr ""
+msgstr "Parola actuală"
msgid "Current sign-in IP:"
-msgstr ""
+msgstr "IP-ul actual de autentificare:"
msgid "Current sign-in at:"
-msgstr ""
+msgstr "Conectarea actuală la:"
msgid "Current sign-in ip"
-msgstr "IP-ul de conectare curent"
+msgstr "IP-ul actual de conectare"
msgid "Current vulnerabilities count"
-msgstr ""
+msgstr "Numărul actual de vulnerabilități"
msgid "CurrentUser|Buy Pipeline minutes"
msgstr "Cumpărați minute Pipeline"
@@ -11123,7 +11375,7 @@ msgid "CurrentUser|Preferences"
msgstr "Preferințe"
msgid "CurrentUser|Start an Ultimate trial"
-msgstr "Începeți o testare Ultimate"
+msgstr "Începeți o perioadă de încercare Ultimate"
msgid "Currently unable to fetch data for this pipeline."
msgstr "ÃŽn prezent, nu putem prelua date pentru acest pipeline."
@@ -11132,28 +11384,28 @@ msgid "Custom (%{language})"
msgstr "Personalizat (%{language})"
msgid "Custom Attributes"
-msgstr ""
+msgstr "Atribute personalizate"
msgid "Custom Git clone URL for HTTP(S)"
msgstr "URL-ul personalizat al clonei Git pentru HTTP(S)"
msgid "Custom analyzers: language support"
-msgstr ""
+msgstr "Analizatori personalizați: suport pentru limbaj"
msgid "Custom hostname (for private commit emails)"
msgstr "Nume de gazdă personalizat (pentru e-mailuri private de commit)"
msgid "Custom metrics"
-msgstr ""
+msgstr "Metrici personalizate"
msgid "Custom notification events"
-msgstr ""
+msgstr "Evenimente de notificare personalizate"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr "Nivelele de notificare personalizate sunt aceleași ca și nivelele de participare. Cu nivelele de notificare personalizate veți primi, de asemenea, notificări pentru anumite evenimente. Pentru a afla mai multe, consultați %{notificationLinkStart}e-mailuri de notificare%{notificationLinkEnd}."
msgid "Custom project templates"
-msgstr ""
+msgstr "Șabloane de proiect personalizate"
msgid "Custom project templates have not been set up for groups that you are a member of. They are enabled from a group’s settings page. Contact your group’s Owner or Maintainer to setup custom project templates."
msgstr "Nu au fost configurate șabloane de proiect personalizate pentru grupurile din care faceți parte. Acestea sunt activate din pagina de setări a unui grup. Contactați Proprietarul sau Întreținătorul grupului dvs. pentru a configura șabloanele de proiect personalizate."
@@ -11180,19 +11432,19 @@ msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job
msgstr "Personalizați setările CI/CD, inclusiv Auto DevOps, executorii partajați și artefacte de job."
msgid "Customize colors"
-msgstr ""
+msgstr "Personalizați culorile"
msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
msgstr "Personalizați modul în care adresele de e-mail și numele de utilizator FogBugz sunt importate în GitLab. În etapa următoare, veți putea selecta proiectele pe care doriți să le importați."
msgid "Customize icon"
-msgstr ""
+msgstr "Personalizați pictograma"
msgid "Customize language and region related settings."
-msgstr ""
+msgstr "Personalizați setările legate de limbă și regiune."
msgid "Customize name"
-msgstr ""
+msgstr "Personalizați numele"
msgid "Customize your pipeline configuration."
msgstr "Personalizați-vă configurația pipeline-ului."
@@ -11387,10 +11639,10 @@ msgid "CycleAnalytics|project dropdown filter"
msgstr "filtru derulant de proiect"
msgid "DAG visualization requires at least 3 dependent jobs."
-msgstr ""
+msgstr "Vizualizarea DAG necesită cel puțin 3 joburi dependente."
msgid "DAST Configuration"
-msgstr ""
+msgstr "Configurația DAST"
msgid "DAST profile not found: %{name}"
msgstr "Profilul DAST nu a fost găsit: %{name}"
@@ -11399,7 +11651,7 @@ msgid "DAST profiles"
msgstr "Profiluri DAST"
msgid "DNS"
-msgstr ""
+msgstr "DNS"
msgid "DORA4Metrics|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
@@ -11407,11 +11659,14 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "Media (ultimele %{days}d)"
+msgid "DORA4Metrics|Change failure rate"
+msgstr "Rata de eșec a modificărilor"
+
msgid "DORA4Metrics|Date"
msgstr "Data"
msgid "DORA4Metrics|Days for an open incident"
-msgstr ""
+msgstr "Zile pentru un incident deschis"
msgid "DORA4Metrics|Days from merge to deploy"
msgstr "Zile de la îmbinare până la desfășurare"
@@ -11426,13 +11681,13 @@ msgid "DORA4Metrics|Median (last %{days}d)"
msgstr "Media (ultimele %{days}d)"
msgid "DORA4Metrics|Median time (last %{days}d)"
-msgstr ""
+msgstr "Timpul mediu (ultimele %{days}d)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
-msgstr ""
+msgstr "Timpul mediu în care un incident a fost deschis într-un mediu de producție în perioada de timp dată."
msgid "DORA4Metrics|No incidents during this period"
-msgstr ""
+msgstr "Niciun incident în această perioadă"
msgid "DORA4Metrics|No merge requests were deployed during this period"
msgstr "În această perioadă nu au fost trimise merge request-uri."
@@ -11440,6 +11695,15 @@ msgstr "În această perioadă nu au fost trimise merge request-uri."
msgid "DORA4Metrics|Number of deployments"
msgstr "Numărul de desfășurări"
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr "Numărul de incidente împărțit la numărul de implementări într-un mediu de producție în perioada de timp dată."
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr "Procentul de implementări eșuate"
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr "Ceva nu a mers bine în timpul obținerii datelor privind rata de eșec a modificărilor."
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr "Ceva nu a mers bine la obținerea datelor privind frecvența de implementare."
@@ -11447,16 +11711,16 @@ msgid "DORA4Metrics|Something went wrong while getting lead time data."
msgstr "Ceva nu a mers bine în timpul obținerii datelor privind durata de execuție."
msgid "DORA4Metrics|Something went wrong while getting time to restore service data."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul obținerii datele referitoare la timpul pentru restabilirea serviciului."
msgid "DORA4Metrics|The chart displays the frequency of deployments to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
-msgstr "Graficul afișează frecvența implementărilor în mediul (mediile) de producție care se bazează pe valoarea %{linkStart}deployment_tier%{linkEnd}."
+msgstr "Graficul afișează frecvența implementărilor în mediul/mediile de producție care se bazează pe valoarea %{linkStart}deployment_tier%{linkEnd}."
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
-msgstr "Graficul afișează timpul mediu dintre îmbinarea și implementarea unui merge request în mediul (mediile) de producție care se bazează pe valoarea %{linkStart}deployment_tier%{linkEnd}."
+msgstr "Graficul afișează timpul mediu dintre îmbinarea și implementarea unui merge request în mediul/mediile de producție care se bazează pe valoarea %{linkStart}deployment_tier%{linkEnd}."
msgid "DORA4Metrics|Time to restore service"
-msgstr ""
+msgstr "Timpul pentru restabilirea serviciului"
msgid "DSN"
msgstr "DSN"
@@ -11486,17 +11750,17 @@ msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available f
msgstr "Nu se poate adăuga %{invalidProjects}. Acest tablou de bord este disponibil pentru proiectele publice și pentru proiectele private din grupurile cu un plan Premium."
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 ""
+msgstr "Personalizați setările DAST pentru a se potrivi cerințelor dumneavoastră. Modificările de configurare efectuate aici le înlocuiesc pe cele furnizate de GitLab și sunt excluse din actualizări. Pentru detalii despre opțiunile de configurare mai avansate, consultați documentația %{docsLinkStart}GitLab DAST%{docsLinkEnd}."
-msgid "DastConfig|DAST Settings"
-msgstr ""
+msgid "DastConfig|DAST CI/CD configuration"
+msgstr "Configurația DAST CI/CD"
+
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
+msgstr "Activați DAST pentru a testa automat vulnerabilitățile din aplicația, site-ul web sau API-ul care rulează în proiectul, în pipeline-ul CI/CD. Modificările de configurare trebuie aplicate în fișierul .gitlab-ci.yml pentru a intra în vigoare. Pentru detalii despre toate opțiunile de configurare, consultați %{linkStart}documentația GitLab DAST%{linkEnd}."
msgid "DastConfig|Generate code snippet"
msgstr "Generați un fragment de cod"
-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 "O scanare pasivă monitorizează toate mesajele HTTP (solicitări și răspunsuri) trimise către țintă. O scanare activă atacă ținta pentru a găsi vulnerabilități potențiale."
@@ -11626,6 +11890,9 @@ msgstr "Ascundeți mesajele de depanare"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr "Includeți mesaje de depanare în ieșirea consolei DAST."
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr "Gestionați profilurile %{profileType}"
+
msgid "DastProfiles|Manage profiles"
msgstr "Gestionați profilurile"
@@ -11651,7 +11918,7 @@ msgid "DastProfiles|No scanner profile selected"
msgstr "Nu este selectat niciun profil de scaner"
msgid "DastProfiles|No scanner profiles created yet"
-msgstr "Nu sunt create încă profiluri de scaner"
+msgstr "Nu s-a creat încă niciun profil de scaner"
msgid "DastProfiles|No site profile selected"
msgstr "Nu este selectat niciun profil de site"
@@ -11768,7 +12035,7 @@ msgid "DastProfiles|This profile is currently being used in a policy."
msgstr "Acest profil este utilizat în prezent într-o politică."
msgid "DastProfiles|This scanner profile is currently being used by a policy. To make edits you must remove it from the active policy."
-msgstr "Acest profil de scanare este utilizat în prezent de o politică. Pentru a face modificări, trebuie să-l eliminați din politica activă."
+msgstr "Acest profil de scanare este utilizat în prezent de o politică. Pentru a face modificări, trebuie să-l înlăturați din politica activă."
msgid "DastProfiles|This site profile is currently being used by a policy. To make edits you must remove it from the active policy."
msgstr "Acest profil de site este utilizat în prezent de o politică. Pentru a face modificări, trebuie să-l înlăturați din politica activă."
@@ -11786,7 +12053,7 @@ msgid "DastProfiles|Username"
msgstr "Nume de utilizator"
msgid "DastProfiles|Username form field"
-msgstr "Câmp de formular nume de utilizator"
+msgstr "Câmp de formular Nume de utilizator"
msgid "DastProfiles|Validated"
msgstr "Validat"
@@ -11828,13 +12095,16 @@ msgid "DastSiteValidation|Could not revoke validation. Please try again."
msgstr "Nu s-a putut revoca validarea. Vă rugăm să încercați din nou."
msgid "DastSiteValidation|Download validation text file"
-msgstr "Descarcă fișierul text de validare"
+msgstr "Descărcați fișierul text de validare"
msgid "DastSiteValidation|Header validation"
msgstr "Validarea antetului"
msgid "DastSiteValidation|Meta tag validation"
-msgstr "Validare etichetă Meta"
+msgstr "Validarea etichetei Meta"
+
+msgid "DastSiteValidation|Not validated"
+msgstr "Nevalidat"
msgid "DastSiteValidation|Retry validation"
msgstr "Încercați din nou validarea"
@@ -11876,7 +12146,7 @@ msgid "DastSiteValidation|This will affect %d other profile targeting the same U
msgid_plural "DastSiteValidation|This will affect %d other profiles targeting the same URL."
msgstr[0] "Acest lucru va afecta %d alt profil care vizează același URL."
msgstr[1] "Acest lucru va afecta alte %d profiluri care vizează același URL."
-msgstr[2] "Acest lucru va afecta %d de alte profiluri care vizează același URL."
+msgstr[2] "Acest lucru va afecta alte %d de profiluri care vizează același URL."
msgid "DastSiteValidation|To run an active scan, validate your site. Site profile validation reduces the risk of running an active scan against the wrong website. All site profiles that share the same base URL share the same validation status."
msgstr "Pentru a rula o scanare activă, validați-vă site-ul. Validarea profilului site-ului reduce riscul de a rula o scanare activă pe un site web greșit. Toate profilurile de site care partajează același URL de bază, partajează aceeași stare de validare."
@@ -11906,7 +12176,7 @@ msgid "DastSiteValidation|You will not be able to run active scans against %{url
msgstr "Nu veți putea rula scanări active pe %{url}."
msgid "Data is still calculating..."
-msgstr ""
+msgstr "Datele sunt încă în curs de calcul..."
msgid "Data refresh"
msgstr "Reîmprospătarea datelor"
@@ -11915,7 +12185,7 @@ msgid "Data type"
msgstr "Tipul de date"
msgid "Database update failed"
-msgstr ""
+msgstr "Actualizarea bazei de date a eșuat"
msgid "DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog."
msgstr "%{linkOpen}Cheie API %{linkClose} folosită pentru autentificarea cu Datadog."
@@ -11951,7 +12221,7 @@ msgid "DatadogIntegration|Tags"
msgstr "Etichete"
msgid "DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}."
-msgstr "Site-ul Datadog către care se trimit datele. Pentru a trimite date către site-ul UE, utilizați %{codeOpen}datadoghq.eu%{codeClose}."
+msgstr "Site-ul Datadog către care se trimit datele. Pentru a trimite date către site-ul din UE, utilizați %{codeOpen}datadoghq.eu%{codeClose}."
msgid "DatadogIntegration|Trace your GitLab pipelines with Datadog."
msgstr "Urmăriți pipeline-urile GitLab cu Datadog."
@@ -11960,25 +12230,25 @@ msgid "DatadogIntegration|have an invalid format"
msgstr "au un format invalid"
msgid "Datasource name not found"
-msgstr ""
+msgstr "Numele sursei de date nu a fost găsit"
msgid "Date"
-msgstr ""
+msgstr "Data"
msgid "Date merged"
msgstr "Data îmbinării"
msgid "Date range"
-msgstr ""
+msgstr "Intervalul de date"
msgid "Date range limited to %{number} days"
msgstr "Intervalul de date limitat la %{number} (de) zile"
msgid "Date range must be shorter than %{max_range} days."
-msgstr ""
+msgstr "Intervalul de date trebuie să fie mai mic de %{max_range} (de) zile."
msgid "Day of month"
-msgstr ""
+msgstr "Ziua lunii"
msgid "DayTitle|F"
msgstr "V"
@@ -11999,34 +12269,34 @@ msgid "Days to merge"
msgstr "Zile până la îmbinare"
msgid "Deactivate dormant users after 90 days of inactivity"
-msgstr "Dezactivați utilizatorii latenți după 90 de zile de inactivitate"
+msgstr "Dezactivați utilizatorii inactivi după 90 de zile de inactivitate"
msgid "Dear Administrator,"
msgstr "Stimate administrator,"
msgid "Debian package already exists in Distribution"
-msgstr ""
+msgstr "Pachetul Debian există deja în Distribuție"
msgid "Debug"
msgstr "Depanare"
msgid "Dec"
-msgstr ""
+msgstr "Dec"
msgid "December"
-msgstr ""
+msgstr "Decembrie"
msgid "Decline"
-msgstr ""
+msgstr "Refuzați"
msgid "Decline and sign out"
-msgstr ""
+msgstr "Refuzați și deconectați-vă"
msgid "Decompressed archive size validation failed."
-msgstr ""
+msgstr "Validarea mărimii arhivei decomprimate a eșuat."
msgid "Decrease"
-msgstr ""
+msgstr "Descreștere"
msgid "Default CI/CD configuration file"
msgstr "Fișier implicit de configurare CI/CD"
@@ -12035,34 +12305,25 @@ msgid "Default artifacts expiration"
msgstr "Expirarea artifactelor implicite"
msgid "Default branch"
-msgstr ""
+msgstr "Ramura implicită"
msgid "Default branch and protected branches"
-msgstr ""
-
-msgid "Default delayed project deletion"
-msgstr "Ștergerea întârziată implicită a proiectului"
-
-msgid "Default deletion delay"
-msgstr ""
+msgstr "Ramura implicită și ramurile protejate"
msgid "Default description template for issues"
-msgstr ""
+msgstr "Șablonul de descriere implicit pentru probleme"
msgid "Default description template for merge requests"
msgstr "Șablon de descriere implicit pentru merge request-uri"
msgid "Default first day of the week"
-msgstr ""
+msgstr "Prima zi implicită a săptămânii"
msgid "Default first day of the week in calendars and date pickers."
-msgstr ""
-
-msgid "Default project deletion protection"
-msgstr ""
+msgstr "Prima zi implicită a săptămânii în calendare și selectori de date."
msgid "Default projects limit"
-msgstr ""
+msgstr "Limita implicită a proiectelor"
msgid "Default timeout"
msgstr "Timeout implicit"
@@ -12086,25 +12347,25 @@ msgid "DefaultBranchProtection|Developers cannot push new commits, but maintaine
msgstr "Dezvoltatorii nu pot face push de commit-uri noi, dar întreținătorii pot. Nimeni nu poate forța un push."
msgid "DefaultBranchProtection|Fully protected"
-msgstr "Complet protejat"
+msgstr "Complet protejată"
msgid "DefaultBranchProtection|Not protected"
-msgstr "Neprotejat"
+msgstr "Neprotejată"
msgid "DefaultBranchProtection|Partially protected"
-msgstr "Parțial protejat"
+msgstr "Parțial protejată"
msgid "DefaultBranchProtection|Protected against pushes"
-msgstr "Protejat împotriva împingerilor"
+msgstr "Protejată împotriva împingerilor"
msgid "Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}"
msgstr "Definiți un model personalizat de înghețare a implementării cu %{cronSyntaxStart}sintaxa cron%{cronSyntaxEnd}"
msgid "Define a custom pattern with cron syntax"
-msgstr ""
+msgstr "Definiți un model personalizat cu sintaxa cron"
msgid "Define custom rules for what constitutes spam, independent of Akismet"
-msgstr ""
+msgstr "Definiți reguli personalizate pentru ceea ce constituie spam, independent de Akismet"
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr "Definiți mediile în etapa/etapele de desfășurare din %{code_open}.gitlab-ci.yml%{code_close} pentru a urmări desfășurările aici."
@@ -12116,7 +12377,10 @@ msgid "Define rules for who can push, merge, and the required approvals for each
msgstr "Definiți regulile pentru cine poate face push, îmbina și aprobările necesare pentru fiecare ramură."
msgid "Definition"
-msgstr ""
+msgstr "Definiție"
+
+msgid "Delay 2FA enforcement (hours)"
+msgstr "Întârzierea aplicării 2FA (ore)"
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr "Sunteți sigur că doriți să rulați %{jobName} imediat? În caz contrar, acest job va fi executat automat după expirarea temporizatorului său."
@@ -12140,61 +12404,58 @@ msgid "DelayedJobs|delayed"
msgstr "întârziat"
msgid "Delete"
-msgstr ""
+msgstr "Șterge"
msgid "Delete %{issuableType}"
-msgstr ""
+msgstr "Ștergeți %{issuableType}"
msgid "Delete %{name}"
-msgstr ""
+msgstr "Ștergeți %{name}"
msgid "Delete Comment"
-msgstr ""
+msgstr "Ștergeți comentariul"
msgid "Delete File"
msgstr "Ștergeți fișierul"
-msgid "Delete Internal Note"
-msgstr "Ștergeți nota internă"
-
msgid "Delete Key"
-msgstr ""
+msgstr "Ștergeți cheia"
msgid "Delete Selected"
msgstr "Ștergeți selecția"
msgid "Delete Value Stream"
-msgstr "Ștergeți Value Stream"
+msgstr "Ștergeți Fluxul de valori"
msgid "Delete account"
-msgstr ""
+msgstr "Ștergeți contul"
msgid "Delete artifacts"
-msgstr ""
+msgstr "Ștergeți artefactele"
msgid "Delete audio"
msgstr "Ștergeți audio"
msgid "Delete badge"
-msgstr ""
+msgstr "Ștergeți insigna"
msgid "Delete code block"
msgstr "Ștergeți blocul de cod"
msgid "Delete column"
-msgstr "Eliminare coloană"
+msgstr "Ștergeți coloana"
msgid "Delete comment"
-msgstr ""
+msgstr "Ștergeți comentariul"
msgid "Delete corpus"
-msgstr "Eliminare corpus"
+msgstr "Ștergerea corpusului"
msgid "Delete deploy key"
msgstr "Ștergeți cheia de implementare"
msgid "Delete file"
-msgstr ""
+msgstr "Ștergeți fișierul"
msgid "Delete image"
msgstr "Ștergeți imaginea"
@@ -12202,11 +12463,14 @@ msgstr "Ștergeți imaginea"
msgid "Delete image repository"
msgstr "Ștergeți repozitoriul de imagini"
+msgid "Delete internal note"
+msgstr "Ștergeți nota internă"
+
msgid "Delete label"
-msgstr ""
+msgstr "Ștergeți eticheta"
msgid "Delete label: %{labelName}"
-msgstr ""
+msgstr "Ștergeți eticheta: %{labelName}"
msgid "Delete pipeline"
msgstr "Ștergeți pipeline-ul"
@@ -12215,10 +12479,10 @@ msgid "Delete pipeline schedule"
msgstr "Ștergeți programul de pipeline"
msgid "Delete project"
-msgstr ""
+msgstr "Ștergeți proiectul"
msgid "Delete row"
-msgstr "Eliminare rând"
+msgstr "Ștergeți rândul"
msgid "Delete self monitoring project"
msgstr "Ștergeți proiectul de automonitorizare"
@@ -12233,13 +12497,13 @@ msgid "Delete source branch"
msgstr "Ștergeți ramura sursă"
msgid "Delete subscription"
-msgstr ""
+msgstr "Ștergeți abonamentul"
msgid "Delete table"
-msgstr "Eliminare tabel"
+msgstr "Ștergeți tabelul"
msgid "Delete this attachment"
-msgstr ""
+msgstr "Ștergeți atașamentul"
msgid "Delete this epic and all descendants?"
msgstr "Ștergeți această epică și toți descendenții?"
@@ -12251,7 +12515,7 @@ msgid "Delete user list"
msgstr "Ștergeți lista de utilizatori"
msgid "Delete variable"
-msgstr ""
+msgstr "Ștergeți variabila"
msgid "Delete video"
msgstr "Ștergeți videoclipul"
@@ -12275,19 +12539,19 @@ msgid "DeleteProject|Failed to remove wiki repository. Please try again or conta
msgstr "Nu s-a putut înlătura repozitoriul wiki. Vă rugăm să încercați din nou sau să contactați administratorul."
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
-msgstr "Value Stream „%{name}†șters"
+msgstr "Fluxul de valori „%{name}†a fost șters"
msgid "DeleteValueStream|Are you sure you want to delete the \"%{name}\" Value Stream?"
-msgstr "Sunteți sigur că doriți să ștergeți Value Stream „%{name}�"
+msgstr "Sunteți sigur că doriți să ștergeți Fluxul de valori „%{name}�"
msgid "DeleteValueStream|Delete %{name}"
msgstr "Ștergeți %{name}"
msgid "Deleted"
-msgstr ""
+msgstr "S-a șters"
msgid "Deleted chat nickname: %{chat_name}!"
-msgstr ""
+msgstr "S-a șters porecla de chat: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr "Proiectele șterse nu pot fi restaurate!"
@@ -12302,7 +12566,7 @@ msgid "Deletes the source branch."
msgstr "Șterge ramura sursă."
msgid "Deleting"
-msgstr ""
+msgstr "Ștergerea"
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 "Ștergerea unui proiect îl plasează într-o stare numai în citire până la %{date}, moment în care proiectul va fi șters definitiv. Sunteți ABSOLUT sigur?"
@@ -12313,23 +12577,50 @@ msgstr "Ștergerea proiectului va șterge repozitoriul acestuia și toate resurs
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr "În așteptarea ștergerii. Acest proiect va fi șters la %{date}. Repozitoriul și alte resurse ale proiectului sunt numai în citire."
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr "Toate proiectele sunt șterse imediat."
+
+msgid "DeletionSettings|Deletion protection"
+msgstr "Protecția împotriva ștergerii"
+
+msgid "DeletionSettings|Keep deleted"
+msgstr "Păstrați ștergerile de"
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr "Păstrați proiectele șterse timp de %{number} (de) zile"
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr "Păstrați proiectele șterse timp de 1 zi"
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr "Niciunul, ștergeți imediat"
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr "Numai administratorii pot șterge proiecte."
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr "Proprietarii și administratorii pot șterge proiecte."
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr "Perioada de păstrare în care grupurile și proiectele șterse vor putea fi restaurate. Proiectele personale sunt întotdeauna șterse imediat. Unele grupuri pot renunța la proiectele lor."
+
msgid "Denied"
-msgstr ""
+msgstr "Refuzat"
msgid "Denied authorization of chat nickname %{user_name}."
msgstr "A fost refuzată autorizarea poreclei de chat %{user_name}."
msgid "Deny"
-msgstr ""
+msgstr "Refuzați"
msgid "Deny access request"
-msgstr ""
+msgstr "Refuzați solicitarea de acces"
msgid "Dependencies"
-msgstr ""
+msgstr "Dependențe"
msgid "Dependencies help page link"
-msgstr ""
+msgstr "Link către pagina de ajutor pentru dependențe"
msgid "Dependencies|%d additional vulnerability not shown"
msgid_plural "Dependencies|%d additional vulnerabilities not shown"
@@ -12410,10 +12701,10 @@ msgid "Dependencies|Vulnerable components"
msgstr "Componente vulnerabile"
msgid "Dependency List"
-msgstr ""
+msgstr "Lista de dependențe"
msgid "Dependency List has no entries"
-msgstr ""
+msgstr "Lista de dependențe nu are intrări"
msgid "Dependency Proxy"
msgstr "Proxy de Dependență"
@@ -12451,15 +12742,15 @@ msgstr "Prefixul imaginii Proxy-ului de dependență"
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr "Activați Proxy de Dependență"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
+msgstr "Activați Proxy de Dependență și setările pentru ștergerea memoriei cache."
+
msgid "DependencyProxy|Image list"
msgstr "Lista de imagini"
msgid "DependencyProxy|Scheduled for deletion"
msgstr "Programat pentru ștergere"
-msgid "DependencyProxy|Storage settings"
-msgstr "Setări de stocare"
-
msgid "DependencyProxy|There are no images in the cache"
msgstr "Nu există imagini în cache"
@@ -12477,18 +12768,18 @@ msgstr[2] "Depinde de %d de merge request-uri care sunt îmbinate"
msgid "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge request."
msgid_plural "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge requests."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Depinde de %{strongStart}%{closedCount} merge request închis%{strongEnd}."
+msgstr[1] "Depinde de %{strongStart}%{closedCount} merge request-uri închise%{strongEnd}."
+msgstr[2] "Depinde de %{strongStart}%{closedCount} de merge request-uri închise%{strongEnd}."
msgid "Deploy"
msgid_plural "Deploys"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Desfășurare"
+msgstr[1] "Desfășurări"
+msgstr[2] "Desfășurări"
msgid "Deploy Keys"
-msgstr ""
+msgstr "Chei de implementare"
msgid "Deploy Token"
msgstr "Token de implementare"
@@ -12500,13 +12791,13 @@ msgid "Deploy freezes"
msgstr "Înghețările implementării"
msgid "Deploy key was successfully updated."
-msgstr ""
+msgstr "Cheia de implementare a fost actualizată cu succes."
msgid "Deploy keys"
-msgstr ""
+msgstr "Chei de implementare"
msgid "Deploy keys grant read/write access to all repositories in your instance"
-msgstr "Cheile de desfășurare acordă acces în citire/scriere la toate repozitoriile din instanța dvs."
+msgstr "Cheile de implementare acordă acces de citire/scriere la toate repozitoriile din instanța dvs."
msgid "Deploy progress not found. To see pods, ensure your environment matches %{linkStart}deploy board criteria%{linkEnd}."
msgstr "Progresul implementării nu a fost găsit. Pentru a vedea pod-urile, asigurați-vă că mediul dvs. corespunde %{linkStart}criteriilor de implementare a bordului%{linkEnd}."
@@ -12515,7 +12806,7 @@ msgid "Deploy static assets and resources to Google managed CDN"
msgstr "Distribuiți resurse și active statice pe CDN-ul administrat de Google"
msgid "Deploy to..."
-msgstr ""
+msgstr "Distribuiți în ..."
msgid "DeployBoards|To see deployment progress for your environments, make sure you are deploying to %{codeStart}$KUBE_NAMESPACE%{codeEnd} and annotating with %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} and %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
msgstr "Pentru a vedea progresul implementării pentru mediile dvs., asigurați-vă că implementați în %{codeStart}$KUBE_NAMESPACE%{codeEnd} și că adnotați cu %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} și %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
@@ -12524,10 +12815,10 @@ msgid "DeployBoard|Kubernetes Pods"
msgstr "Pod-uri Kubernetes"
msgid "DeployFreeze|Add a freeze period to prevent unintended releases during a period of time for a given environment. You must update the deployment jobs in %{filename} according to the deploy freezes added here. %{freeze_period_link_start}Learn more.%{freeze_period_link_end}"
-msgstr "Adăugați o perioadă de îngheț pentru a preveni lansările neintenționate pe parcursul unei perioade de timp pentru un anumit mediu. Trebuie să actualizați lucrările de implementare din %{filename} în funcție de înghețurile de implementare adăugate aici. %{freeze_period_link_start}Aflați mai multe.%{freeze_period_link_end}"
+msgstr "Adăugați o perioadă de îngheț pentru a preveni lansările neintenționate pe parcursul unei perioade de timp pentru un anumit mediu. Trebuie să actualizați joburile de implementare din %{filename} în funcție de înghețurile de implementare adăugate aici. %{freeze_period_link_start}Aflați mai multe.%{freeze_period_link_end}"
msgid "DeployFreeze|Add deploy freeze"
-msgstr "Adăugați înghețarea implementării"
+msgstr "Adăugare îngheț de implementare"
msgid "DeployFreeze|Delete"
msgstr "Ștergeți"
@@ -12563,43 +12854,43 @@ msgid "DeployKeys|+%{count} others"
msgstr "+%{count} altele"
msgid "DeployKeys|Current project"
-msgstr "Proiectul curent"
+msgstr "Proiectul actual"
msgid "DeployKeys|Deploy key"
-msgstr "Cheie de distribuție"
+msgstr "Cheie de implementare"
msgid "DeployKeys|Enabled deploy keys"
-msgstr "Chei de distribuție activate"
+msgstr "Chei de implementare activate"
msgid "DeployKeys|Error enabling deploy key"
-msgstr "Eroare de activare a cheii de distribuție"
+msgstr "Eroare de activare a cheii de implementare"
msgid "DeployKeys|Error getting deploy keys"
-msgstr "Eroare la obținerea cheilor de distribuție"
+msgstr "Eroare la obținerea cheilor de implementare"
msgid "DeployKeys|Error removing deploy key"
-msgstr "Eroare la eliminarea cheii de distribuție"
+msgstr "Eroare la eliminarea cheii de implementare"
msgid "DeployKeys|Expand %{count} other projects"
-msgstr "Extindeți %{count} alte proiecte"
+msgstr "Extindeți alte %{count} proiecte"
msgid "DeployKeys|Grant write permissions to this key"
msgstr "Acordați permisiuni în scriere pentru această cheie"
msgid "DeployKeys|Loading deploy keys"
-msgstr "Se încarcă cheile de distribuție"
+msgstr "Încărcarea cheilor de implementare"
msgid "DeployKeys|No deploy keys found. Create one with the form above."
-msgstr "Nu s-au găsit chei de distribuție. Creați una cu ajutorul formularului de mai sus."
+msgstr "Nu s-au găsit chei de implementare. Creați una cu ajutorul formularului de mai sus"
msgid "DeployKeys|Privately accessible deploy keys"
-msgstr "Chei de distribuție accesibile în mod privat"
+msgstr "Chei de implementare accesibile în mod privat"
msgid "DeployKeys|Project usage"
msgstr "Utilizarea proiectului"
msgid "DeployKeys|Publicly accessible deploy keys"
-msgstr "Chei de distribuție accesibile public"
+msgstr "Chei de implementare accesibile public"
msgid "DeployKeys|Read access only"
msgstr "Acces numai în citire"
@@ -12629,7 +12920,7 @@ msgid "DeployTokens|Copy username"
msgstr "Copiați numele de utilizator"
msgid "DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}"
-msgstr "Creați un token de implementare nou pentru toate proiectele din acest grup. %{link_start}Ce sunt tokenurile de implementare?%{link_end}"
+msgstr "Creați un nou token de implementare pentru toate proiectele din acest grup. %{link_start}Ce sunt tokenurile de implementare?%{link_end}"
msgid "DeployTokens|Create deploy token"
msgstr "Creați un token de implementare"
@@ -12704,19 +12995,19 @@ msgid "Deployed to"
msgstr "Desfășurat la"
msgid "Deployed-after"
-msgstr ""
+msgstr "Desfășurat-după"
msgid "Deployed-before"
-msgstr ""
+msgstr "Desfășurat-înainte"
msgid "Deploying to"
msgstr "Se desfășoară la"
msgid "Deploying to AWS is easy with GitLab"
-msgstr ""
+msgstr "Implementarea în AWS este ușoară cu GitLab"
msgid "Deployment"
-msgstr ""
+msgstr "Implementare"
msgid "Deployment Frequency"
msgstr "Frecvența de implementare"
@@ -12734,7 +13025,7 @@ msgid "Deployment frequency"
msgstr "Frecvența de implementare"
msgid "DeploymentApproval| Current approvals: %{current}"
-msgstr " Aprobări curente: %{current}"
+msgstr " Aprobări actuale: %{current}"
msgid "DeploymentApproval|Approval options"
msgstr "Opțiuni de aprobare"
@@ -12797,13 +13088,13 @@ msgid "DeploymentTarget|Virtual machine (for example, EC2)"
msgstr "Mașină virtuală (de exemplu, EC2)"
msgid "Deployments"
-msgstr ""
+msgstr "Implementări"
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{deployments} mediu afectat."
+msgstr[1] "%{deployments} medii afectate."
+msgstr[2] "%{deployments} de medii afectate."
msgid "Deployment|API"
msgstr "API"
@@ -12880,26 +13171,20 @@ msgstr "Pentru informații despre un posibil înlocuitor, %{opstrace_link_start}
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr "Funcțiile de jurnale și de urmărire au fost, de asemenea, depreciate în GitLab 14.7, și sunt %{removal_link_start} programate pentru înlăturare %{link_end} în GitLab 15.0."
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr "Funcțiile de jurnale și de urmărire au fost depreciate în GitLab 14.7 și sunt %{epicStart} programate să fie înlăturate %{epicEnd} în GitLab 15.0."
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr "Funcțiile de jurnale și de urmărire au fost depreciate în GitLab 14.7 și sunt %{removal_link_start} programate să fie înlăturate%{link_end} în GitLab 15.0. Pentru informații despre un înlocuitor posibil, %{opstrace_link_start} aflați mai multe despre Opstrace %{link_end}."
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr "Funcția de metrici a fost abandonată în GitLab 14.7."
msgid "Deprioritize label"
-msgstr ""
+msgstr "Deprioritizați eticheta"
msgid "Descending"
-msgstr ""
+msgstr "Descrescător"
msgid "Describe the goal of the changes and what reviewers should be aware of."
msgstr "Descrieți scopul modificărilor și ce ar trebui să aibă în vedere revizorii."
msgid "Description"
-msgstr ""
+msgstr "Descriere"
msgid "Description (alt text)"
msgstr "Descriere ( text alt)"
@@ -12908,16 +13193,16 @@ msgid "Description (optional)"
msgstr "Descriere (opțional)"
msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}"
-msgstr ""
+msgstr "Descriere analizată cu %{link_start}GitLab Flavored Markdown%{link_end}"
msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}."
-msgstr ""
+msgstr "Descriere analizată cu %{link_start}GitLab Flavored Markdown%{link_end}."
msgid "Description:"
-msgstr ""
+msgstr "Descriere:"
msgid "Descriptive label"
-msgstr ""
+msgstr "Etichetă descriptivă"
msgid "Design Management files and data"
msgstr "Fișierele și datele de Management al designului"
@@ -12976,9 +13261,6 @@ msgstr "FaceÈ›i clic pe imagine acolo unde doriÈ›i să începeÈ›i o nouă discuÈ
msgid "DesignManagement|Comment"
msgstr "Comentariu"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr "Comentariile pe care le rezolvați pot fi vizualizate și puteți anula rezolvarea acestora accesând secțiunea „Comentarii rezolvate†de mai jos."
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "Nu s-a putut adăuga un comentariu nou. Vă rugăm să încercați din nou."
@@ -13021,9 +13303,6 @@ msgstr "Păstrați modificările"
msgid "DesignManagement|Keep comment"
msgstr "Păstrați comentariul"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr "Aflați mai multe despre rezolvarea comentariilor"
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "Versiunea de design solicitată nu există. În schimb, se afișează cea mai recentă versiune"
@@ -13070,28 +13349,31 @@ msgid "Designs"
msgstr "Design-uri"
msgid "Destroy"
-msgstr ""
+msgstr "Distrugeți"
msgid "Detail"
-msgstr ""
+msgstr "Detaliu"
msgid "Details"
-msgstr ""
+msgstr "Detalii"
msgid "Details (default)"
msgstr "Detalii (implicit)"
+msgid "Details block"
+msgstr "Detalii bloc"
+
msgid "Detect host keys"
-msgstr ""
+msgstr "Detectați cheile gazdă"
msgid "DevOps Adoption"
-msgstr ""
+msgstr "Adoptarea DevOps"
msgid "DevOps Reports"
msgstr "Rapoarte DevOps"
msgid "DevOps adoption"
-msgstr ""
+msgstr "Adoptarea DevOps"
msgid "Devices (optional)"
msgstr "Dispozitive (opțional)"
@@ -13253,58 +13535,61 @@ msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr "Nu puteți elimina grupul în care vă aflați în prezent."
msgid "DevopsReport|DevOps Score"
-msgstr ""
+msgstr "Scor DevOps"
msgid "DevopsReport|DevOps score metrics are based on usage over the last 30 days. Last updated: %{timestamp}."
-msgstr ""
+msgstr "Metricile scorului DevOps se bazează pe utilizarea în ultimele 30 de zile. Ultima actualizare: %{timestamp}."
msgid "DevopsReport|High"
-msgstr ""
+msgstr "Ridicat"
msgid "DevopsReport|Leader usage"
-msgstr ""
+msgstr "Utilizarea Leader"
msgid "DevopsReport|Low"
-msgstr ""
+msgstr "Scăzut"
msgid "DevopsReport|Moderate"
-msgstr ""
+msgstr "Moderat"
msgid "DevopsReport|Overview"
-msgstr ""
+msgstr "Prezentare generală"
msgid "DevopsReport|Score"
-msgstr ""
+msgstr "Scor"
msgid "DevopsReport|Your score"
-msgstr ""
+msgstr "Scorul dvs."
msgid "DevopsReport|Your usage"
-msgstr ""
+msgstr "Utilizarea dvs."
+
+msgid "Diagram (%{language})"
+msgstr "Diagramă (%{language})"
msgid "Did not delete the source branch."
msgstr "Nu s-a șters ramura sursă."
msgid "Didn't receive a confirmation email?"
-msgstr ""
+msgstr "Nu ați primit un e-mail de confirmare?"
msgid "Didn't receive confirmation instructions?"
-msgstr ""
+msgstr "Nu ați primit instrucțiunile de confirmare?"
msgid "Didn't receive unlock instructions?"
-msgstr ""
+msgstr "Nu ați primit instrucțiunile de deblocare?"
msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr "Fișierele Diff care depășesc această limită vor fi prezentate ca fiind „prea mari†și nu vor putea fi extinse."
msgid "Diff limits"
-msgstr ""
+msgstr "Limite de diff"
msgid "Diff notes"
msgstr "Notele diff-ului"
msgid "Difference between start date and now"
-msgstr ""
+msgstr "Diferența dintre data de început și acum"
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -13315,8 +13600,8 @@ msgstr "(base)"
msgid "Diffs|%d addition"
msgid_plural "Diffs|%d additions"
msgstr[0] "%d adăugare"
-msgstr[1] "%d adăugiri"
-msgstr[2] "%d de adăugiri"
+msgstr[1] "%d adăugări"
+msgstr[2] "%d de adăugări"
msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
@@ -13334,7 +13619,7 @@ msgid "Diffs|No file name available"
msgstr "Niciun nume de fișier disponibil"
msgid "Diffs|Previous 20 lines"
-msgstr "Anterioarele 20 de linii"
+msgstr "Cele 20 de linii anterioare"
msgid "Diffs|Show %{unfoldCount} lines"
msgstr "Afișați %{unfoldCount} linii"
@@ -13355,7 +13640,7 @@ msgid "Diffs|with %{additions} and %{deletions}"
msgstr "cu %{additions} și %{deletions}"
msgid "Direct member"
-msgstr ""
+msgstr "Membru direct"
msgid "Direct members"
msgstr "Membri direcți"
@@ -13367,43 +13652,40 @@ msgid "Direct users to this page after they sign out."
msgstr "Direcționați utilizatorii către această pagină după ce se deconectează."
msgid "Direction"
-msgstr ""
+msgstr "Direcție"
msgid "Directory name"
-msgstr ""
+msgstr "Numele directorului"
msgid "Disable"
-msgstr ""
+msgstr "Dezactivați"
msgid "Disable Two-factor Authentication"
-msgstr ""
+msgstr "Dezactivați autentificarea cu doi factori"
msgid "Disable What's new"
-msgstr ""
+msgstr "DezactivaÈ›i „Ce este nouâ€"
msgid "Disable for this project"
-msgstr ""
+msgstr "Dezactivați pentru acest proiect"
msgid "Disable group runners"
msgstr "Dezactivați executorii de grup"
-msgid "Disable the group-level wiki"
-msgstr "Dezactivați wiki la nivel de grup"
-
msgid "Disable two-factor authentication"
-msgstr ""
+msgstr "Dezactivați autentificarea cu doi factori"
msgid "Disabled"
-msgstr ""
+msgstr "Dezactivat"
msgid "Disabled by %{parent} owner"
-msgstr ""
+msgstr "Dezactivat de proprietarul %{parent}"
msgid "Disabled mirrors can only be enabled by instance owners. It is recommended that you delete them."
-msgstr ""
+msgstr "Replicile dezactivate pot fi activate numai de proprietarii instanțelor. Se recomandă să le ștergeți."
msgid "Discard"
-msgstr ""
+msgstr "Renunțați"
msgid "Discard all changes"
msgstr "Renunțați la toate modificările"
@@ -13412,7 +13694,7 @@ msgid "Discard all changes?"
msgstr "Renunțați la toate modificările?"
msgid "Discard changes"
-msgstr ""
+msgstr "Renunțați la modificări"
msgid "Discard changes to %{path}?"
msgstr "Renunțați la modificările aduse la %{path}?"
@@ -13439,7 +13721,7 @@ msgid "Discover|Check your application for security vulnerabilities that may lea
msgstr "Verificați dacă aplicația dvs. prezintă vulnerabilități de securitate care pot duce la acces neautorizat, scurgeri de date și refuz de servicii (DoS)."
msgid "Discover|For code that's already live in production, our dashboards give you an easy way to prioritize any issues that are found, empowering your team to ship quickly and securely."
-msgstr ""
+msgstr "În cazul codului care se află deja în producție, tablourile noastre de bord vă oferă o modalitate ușoară de a da prioritate oricăror probleme găsite, permițând echipei dvs. să livreze rapid și sigur."
msgid "Discover|GitLab will perform static and dynamic tests on the code of your application, looking for known flaws and report them in the merge request so you can fix them before merging."
msgstr "GitLab va efectua teste statice și dinamice asupra codului aplicației dumneavoastră, căutând defecte cunoscute și le va raporta în merge request, astfel încât să le puteți remedia înainte de integrare."
@@ -13451,7 +13733,7 @@ msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd
msgstr "Vedeți celelalte caracteristici ale %{linkStart}planului ultimate%{linkEnd}"
msgid "Discover|Start a free trial"
-msgstr "Începeți o încercare gratuită"
+msgstr "Începeți o perioadă de încercare gratuită"
msgid "Discover|Upgrade now"
msgstr "Actualizați acum"
@@ -13463,16 +13745,16 @@ msgid "Discuss a specific suggestion or question internally."
msgstr "Discutați pe plan intern o sugestie sau o întrebare specifică."
msgid "Discuss a specific suggestion or question that needs to be resolved."
-msgstr ""
+msgstr "Discutați o sugestie sau o întrebare particulară care trebuie să fie rezolvată."
msgid "Discuss a specific suggestion or question."
-msgstr ""
+msgstr "Discutați o sugestie sau o întrebare specifică."
msgid "Discussion to reply to cannot be found"
msgstr "Discuția la care doriți să răspundeți nu poate fi găsită"
msgid "Disk Usage"
-msgstr ""
+msgstr "Utilizare disc"
msgid "Dismiss"
msgstr "Respingeți"
@@ -13493,7 +13775,7 @@ msgid "Dismiss selected"
msgstr "Respingeți selecția"
msgid "Dismiss trial promotion"
-msgstr "Respingeți oferta promoțională"
+msgstr "Respingeți promoția perioadei de încercare"
msgid "Dismissable"
msgstr "Poate fi respins"
@@ -13514,100 +13796,97 @@ msgid "Display"
msgstr "Afișare"
msgid "Display alerts from all configured monitoring tools."
-msgstr ""
+msgstr "Afișați alertele de la toate instrumentele de monitorizare configurate."
msgid "Display milestones"
msgstr "Afișați obiectivele"
msgid "Display name"
-msgstr ""
+msgstr "Afișați numele"
msgid "Display progress of child issues"
msgstr "Afișați progresul problemelor copil"
msgid "Display rendered file"
-msgstr ""
+msgstr "Afișarea fișierului redat"
msgid "Display source"
-msgstr ""
+msgstr "Afișează sursa"
msgid "Display time tracking in issues in total hours only. %{link_start}What is time tracking?%{link_end}"
msgstr "Afișați urmărirea timpului în probleme numai în ore totale. %{link_start}Ce este urmărirea timpului?%{link_end}"
msgid "Do not display content for customer experience improvement and offers from third parties"
-msgstr "Nu afișați conținut pentru îmbunătățirea experienței clienților și oferte de la terțe părți"
+msgstr "Nu afișați conținutul pentru îmbunătățirea experienței clienților și oferte de la terți"
msgid "Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}"
msgstr "Nu forțați împingerea peste referințele divergente. După ce replica este creată, această setare poate fi modificată numai folosind API-ul. %{mirroring_docs_link_start}Aflați mai multe despre această opțiune%{link_closing_tag} și despre %{mirroring_api_docs_link_start}API%{link_closing_tag}."
msgid "Do you want to remove this deploy key?"
-msgstr ""
+msgstr "Doriți să înlăturați această cheie de implementare?"
msgid "Dockerfile"
-msgstr ""
+msgstr "Dockerfile"
msgid "Documentation"
-msgstr ""
+msgstr "Documentație"
msgid "Documentation for popular identity providers"
-msgstr ""
+msgstr "Documentație pentru furnizorii populari de identitate"
msgid "Documentation pages URL"
-msgstr ""
+msgstr "Url-ul paginilor de documentație"
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
-msgstr ""
-
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr "Nu se aplică proiectelor din spațiile de nume personale, care sunt șterse imediat la cerere."
+msgstr "Documente reindexate: %{processed_documents} (%{percentage}%%)"
msgid "Does not delete the source branch."
msgstr "Nu șterge ramura sursă."
msgid "Domain"
-msgstr ""
+msgstr "Domeniu"
msgid "Domain Name"
-msgstr ""
+msgstr "Numele domeniului"
msgid "Don't have a group?"
msgstr "Nu aveți un grup?"
msgid "Don't have an account yet?"
-msgstr ""
+msgstr "Nu aveți încă un cont?"
msgid "Don't include description in commit message"
msgstr "Nu includeți descrierea în mesajul commit-ului"
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
-msgstr ""
+msgstr "Nu lipiÈ›i partea privată a cheii GPG. LipiÈ›i partea publică, care începe cu „-----BEGIN PGP PUBLIC KEY BLOCK-----â€."
msgid "Don't send service data"
-msgstr ""
+msgstr "Nu trimiteți date de serviciu"
msgid "Don't show again"
-msgstr ""
+msgstr "Nu mai afișați din nou"
msgid "Done"
-msgstr "Făcut"
+msgstr "Terminat"
msgid "Dormant users"
-msgstr ""
+msgstr "Utilizatori inactivi"
msgid "Download"
-msgstr ""
+msgstr "Descărcați"
msgid "Download %{format}"
-msgstr ""
+msgstr "Descărcați %{format}"
msgid "Download %{format}:"
-msgstr ""
+msgstr "Descărcați %{format}:"
msgid "Download (%{fileSizeReadable})"
msgstr "Descărcați (%{fileSizeReadable})"
msgid "Download (%{size})"
-msgstr ""
+msgstr "Descărcați (%{size})"
msgid "Download CSV"
msgstr "Descărcați CSV"
@@ -13616,19 +13895,19 @@ msgid "Download PDF"
msgstr "Descărcare PDF"
msgid "Download artifacts"
-msgstr ""
+msgstr "Descărcați artefacte"
msgid "Download codes"
-msgstr ""
+msgstr "Descărcați codurile"
msgid "Download evidence JSON"
-msgstr ""
+msgstr "Descărcați dovezi JSON"
msgid "Download export"
-msgstr ""
+msgstr "Descărcați exportul"
msgid "Download image"
-msgstr ""
+msgstr "Descărcați imaginea"
msgid "Download payload"
msgstr "Descărcare payload"
@@ -13637,10 +13916,10 @@ msgid "Download raw data (.csv)"
msgstr "Descărcați date brute (.csv)"
msgid "Download source code"
-msgstr ""
+msgstr "Descărcați codul sursă"
msgid "Download this directory"
-msgstr ""
+msgstr "Descărcați acest director"
msgid "DownloadCommit|Email Patches"
msgstr "Patch-uri e-mail"
@@ -13652,10 +13931,10 @@ msgid "DownloadSource|Download"
msgstr "Descărcare"
msgid "Downstream"
-msgstr ""
+msgstr "ÃŽn aval"
msgid "Downvotes"
-msgstr ""
+msgstr "Voturi negative"
msgid "Draft"
msgstr "Draft"
@@ -13667,16 +13946,16 @@ msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr "Glisați design-urile aici sau %{linkStart}faceți clic pentru a încărca%{linkEnd}."
msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
-msgstr ""
+msgstr "Plasați sau %{linkStart}încărcați%{linkEnd} fișierul pentru a-l atașa"
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
-msgstr ""
+msgstr "Plasați sau %{linkStart}încărcați%{linkEnd} fișierele pentru a le atașa"
msgid "Drop your designs to start your upload."
msgstr "Glisați și fixați design-urile dvs. pentru a începe încărcarea."
msgid "Drop your files to start your upload."
-msgstr ""
+msgstr "Plasați fișierele pentru a începe încărcarea."
msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
msgstr "S-a produs o eroare în timpul preluării %{issuableAttribute} atribuit pentru %{issuableType} selectat(ă)."
@@ -13706,13 +13985,13 @@ msgid "Due date"
msgstr "Data scadentă"
msgid "Due to inactivity, the %{project_link} project is scheduled to be deleted on %{b_open}%{deletion_date}%{b_close}. To unschedule the deletion of %{project_link}, perform some activity on it. For example:"
-msgstr ""
+msgstr "Din cauza inactivității, proiectul %{project_link} este programat să fie șters pe %{b_open}%{deletion_date}%{b_close}. Pentru a deprograma ștergerea proiectului %{project_link}, efectuați o anumită activitate pe acesta. De exemplu:"
msgid "Due to inactivity, the %{project_name} (%{project_link}) project is scheduled to be deleted on %{deletion_date}. To unschedule the deletion of %{project_name}, perform some activity on it. For example:"
-msgstr ""
+msgstr "Din cauza inactivității, proiectul %{project_name} (%{project_link}) este programat să fie șters pe %{deletion_date}. Pentru a deprograma ștergerea proiectului %{project_name}, efectuați o anumită activitate pe acesta. De exemplu:"
msgid "Due to inactivity, this project is scheduled to be deleted on %{deletion_date}. %{link_start}Why is this scheduled?%{link_end}"
-msgstr ""
+msgstr "Din cauza inactivității, acest proiect este programat să fie șters pe %{deletion_date}. %{link_start}De ce este programat acest lucru?%{link_end}"
msgid "Duplicate page: %{error_message}"
msgstr "Pagină duplicată: %{error_message}"
@@ -13742,7 +14021,7 @@ msgid "Duration|%s weeks"
msgstr "%s (de) săptămâni"
msgid "Duration|%s years"
-msgstr "%s ani"
+msgstr "%s (de) ani"
msgid "Duration|1 day"
msgstr "1 zi"
@@ -13763,31 +14042,31 @@ msgid "Duration|1 year"
msgstr "1 an"
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
-msgstr ""
+msgstr "Pe durata acestui proces, vi se vor cere URL-uri din partea GitLab. Folosiți URL-urile prezentate mai jos."
msgid "Dynamic Application Security Testing (DAST)"
msgstr "Testarea dinamică a securității aplicațiilor (DAST)"
msgid "E-mail:"
-msgstr ""
+msgstr "E-mail:"
msgid "Each project can also have an issue tracker and a wiki."
-msgstr ""
+msgstr "Fiecare proiect poate avea, de asemenea, un tracker de probleme și un wiki."
msgid "Edit"
-msgstr ""
-
-msgid "Edit %{issuable}"
-msgstr ""
+msgstr "Editați"
msgid "Edit %{name}"
msgstr "Editați %{name}"
+msgid "Edit %{profileType} profile"
+msgstr "Editați profilul %{profileType}"
+
msgid "Edit Comment"
-msgstr ""
+msgstr "Editați comentariul"
msgid "Edit Deploy Key"
-msgstr ""
+msgstr "Editați cheia de distribuire"
msgid "Edit Geo Site"
msgstr "Editați site-ul Geo"
@@ -13805,19 +14084,16 @@ msgid "Edit Milestone"
msgstr "Editați obiectivul"
msgid "Edit Password"
-msgstr ""
+msgstr "Editați parola"
msgid "Edit Pipeline Schedule"
msgstr "Editați programul de pipeline"
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "Editați versiunea"
msgid "Edit Requirement"
-msgstr ""
+msgstr "Editați cerința"
msgid "Edit Slack integration"
msgstr "Editați integrarea Slack"
@@ -13832,10 +14108,10 @@ msgid "Edit application"
msgstr "Editați aplicația"
msgid "Edit audio description"
-msgstr ""
+msgstr "Editați descrierea audio"
msgid "Edit comment"
-msgstr ""
+msgstr "Editați comentariul"
msgid "Edit commit message"
msgstr "Editați mesajul commit-ului"
@@ -13847,10 +14123,10 @@ msgid "Edit deploy key"
msgstr "Editați cheia de implementare"
msgid "Edit description"
-msgstr ""
+msgstr "Editați descrierea"
msgid "Edit environment"
-msgstr ""
+msgstr "Editați mediul"
msgid "Edit epics"
msgstr "Editare epicele"
@@ -13862,28 +14138,28 @@ msgid "Edit fork in Web IDE"
msgstr "Editați forkul în Web IDE"
msgid "Edit group application"
-msgstr ""
+msgstr "Editați aplicația de grup"
msgid "Edit group: %{group_name}"
-msgstr ""
+msgstr "Editați grupul: %{group_name}"
msgid "Edit identity for %{user_name}"
-msgstr ""
+msgstr "Editați identitatea pentru %{user_name}"
msgid "Edit image description"
-msgstr ""
+msgstr "Editați descrierea imaginii"
msgid "Edit in pipeline editor"
msgstr "Editați în editorul de pipeline"
msgid "Edit in single-file editor"
-msgstr ""
+msgstr "Editați în editorul cu un singur fișier"
msgid "Edit inline"
-msgstr ""
+msgstr "Editați în linie"
msgid "Edit issues"
-msgstr ""
+msgstr "Editați problemele"
msgid "Edit link"
msgstr "Editare link"
@@ -13892,34 +14168,34 @@ msgid "Edit merge requests"
msgstr "Editați merge request-urile"
msgid "Edit public deploy key"
-msgstr ""
+msgstr "Modificați cheia de implementare publică"
msgid "Edit sidebar"
-msgstr ""
+msgstr "Editați bara laterală"
msgid "Edit table"
msgstr "Editați tabelul"
msgid "Edit this file only."
-msgstr ""
+msgstr "Editați numai acest fișier."
msgid "Edit this release"
msgstr "Editați această versiune"
msgid "Edit title and description"
-msgstr ""
+msgstr "Editați titlul și descrierea"
msgid "Edit topic: %{topic_name}"
msgstr "Editați subiectul: %{topic_name}"
msgid "Edit user: %{user_name}"
-msgstr ""
+msgstr "Editați utilizatorul: %{user_name}"
msgid "Edit video description"
-msgstr ""
+msgstr "Editați descrierea videoclipului"
msgid "Edit wiki page"
-msgstr ""
+msgstr "Editați pagina wiki"
msgid "Edit your most recent comment in a thread (from an empty textarea)"
msgstr "Editați cel mai recent comentariu al dvs. dintr-un subiect (dintr-o zonă de text goală)"
@@ -13928,16 +14204,16 @@ msgid "Edit, lint, and visualize your pipeline."
msgstr "Editați, verificați cu lint și vizualizați-vă pipeline-ul."
msgid "Edited"
-msgstr ""
+msgstr "Editat"
msgid "Edited %{timeago}"
msgstr "Editat(ă) %{timeago}"
msgid "Editing"
-msgstr ""
+msgstr "Editare"
msgid "Elapsed time"
-msgstr ""
+msgstr "Timpul scurs"
msgid "Elasticsearch AWS IAM credentials"
msgstr "Acreditările IAM pentru Elasticsearch AWS"
@@ -13949,7 +14225,7 @@ msgid "Elasticsearch indexing restrictions"
msgstr "Restricții de indexare Elasticsearch"
msgid "Elasticsearch indexing started"
-msgstr ""
+msgstr "Indexarea Elasticsearch a început"
msgid "Elasticsearch migration halted"
msgstr "Migrarea Elasticsearch a fost oprită"
@@ -13963,9 +14239,6 @@ msgstr "Reindexarea Elasticsearch a fost declanșată"
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr "Reindexarea Elasticsearch nu a fost inițiată: %{errors}"
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr "Elasticsearch a returnat codul de stare: %{status_code}"
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr "Reindexarea Elasticsearch cu zero-downtime"
@@ -13982,34 +14255,34 @@ msgid "Eligible users"
msgstr "Utilizatori eligibili"
msgid "Email"
-msgstr ""
+msgstr "E-mail"
msgid "Email %{number}"
-msgstr ""
+msgstr "E-mail %{number}"
msgid "Email Notification"
-msgstr ""
+msgstr "Notificare prin e-mail"
msgid "Email a new %{name} to this project"
-msgstr "Trimiteți prin e-mail un nou %{name} la acest proiect"
+msgstr "Trimiteți prin e-mail un/o nou(ă) %{name} la acest proiect"
msgid "Email address suffix"
msgstr "Sufixul adresei de e-mail"
msgid "Email address to use for Support Desk"
-msgstr ""
+msgstr "Adresa de e-mail de utilizat pentru Service Desk"
msgid "Email could not be sent"
-msgstr ""
+msgstr "E-mailul nu a putut fi trimis"
msgid "Email display name"
-msgstr ""
+msgstr "Numele afișat de e-mail"
msgid "Email not verified. Please verify your email in Salesforce."
-msgstr ""
+msgstr "Email neverificat. Vă rugăm să vă verificați e-mailul în Salesforce."
msgid "Email notification for unknown sign-ins"
-msgstr ""
+msgstr "Notificare prin e-mail pentru înregistrările necunoscute"
msgid "Email patch"
msgstr "Patch e-mail"
@@ -14018,19 +14291,19 @@ msgid "Email patches"
msgstr "Patch-uri de e-mail"
msgid "Email sent"
-msgstr ""
+msgstr "E-mail trimis"
msgid "Email the pipeline status to a list of recipients."
-msgstr ""
+msgstr "Trimiteți prin e-mail starea conductei către o listă de destinatari."
msgid "Email updates (optional)"
-msgstr ""
+msgstr "Actualizări prin e-mail (opțional)"
msgid "Email:"
-msgstr ""
+msgstr "E-mail:"
msgid "Email: %{email}"
-msgstr ""
+msgstr "E-mail: %{email}"
msgid "EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies."
msgstr "Se pare că e-mailul este gol. Asigurați-vă că răspunsul dvs se află în partea de sus a e-mailului, nu putem procesa răspunsurile inline."
@@ -14075,7 +14348,7 @@ msgid "Emails sent from Service Desk have this name."
msgstr "E-mailurile trimise de la Service Desk au acest nume."
msgid "Emails sent to %{email} are also supported."
-msgstr ""
+msgstr "Se acceptă, de asemenea, e-mailurile trimise la %{email}."
msgid "EmailsOnPushService|Disable code diffs"
msgstr "Dezactivați diff-urile de cod"
@@ -14102,16 +14375,13 @@ msgid "EmailsOnPushService|tanuki@example.com gitlab@example.com"
msgstr "tanuki@example.com gitlab@example.com"
msgid "Embed"
-msgstr ""
-
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
+msgstr "Incorporați"
msgid "Empty file"
-msgstr ""
+msgstr "Fișier gol"
msgid "Enable"
-msgstr ""
+msgstr "Activați"
msgid "Enable Akismet"
msgstr "Activați Akismet"
@@ -14122,6 +14392,9 @@ msgstr "Activați integrarea Amazon EKS"
msgid "Enable Auto DevOps"
msgstr "Activați Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr "Activați urmărirea erorilor GitLab"
+
msgid "Enable Gitpod"
msgstr "Activați Gitpod"
@@ -14129,16 +14402,16 @@ msgid "Enable Gitpod?"
msgstr "Activați Gitpod?"
msgid "Enable Invisible Captcha during sign up"
-msgstr ""
+msgstr "Activați Captcha invizibilă în timpul conectării"
msgid "Enable Kroki"
-msgstr ""
+msgstr "Activați Kroki"
msgid "Enable Mailgun event receiver"
-msgstr ""
+msgstr "Activați receptorul de evenimente Mailgun"
msgid "Enable PlantUML"
-msgstr ""
+msgstr "Activați PlantUML"
msgid "Enable SSL verification"
msgstr "Activați verificarea prin SSL"
@@ -14150,13 +14423,13 @@ msgid "Enable Snowplow tracking"
msgstr "Activați urmărirea Snowplow"
msgid "Enable Spam Check via external API endpoint"
-msgstr ""
+msgstr "Activați Verificarea spam printr-un punct final API extern"
msgid "Enable What's new: All tiers"
-msgstr ""
+msgstr "ActivaÈ›i „Ce este nouâ€: toate nivelurile"
msgid "Enable What's new: Current tier only"
-msgstr ""
+msgstr "ActivaÈ›i „Ce este nouâ€: numai nivelul actual"
msgid "Enable access to the performance bar for non-administrators in a given group."
msgstr "Activați acces la bara de performanță pentru non-administratori într-un grup specificat."
@@ -14168,55 +14441,52 @@ msgid "Enable and disable Service Desk. Some additional configuration might be r
msgstr "Activați și dezactivați Service Desk. Ar putea fi necesare anumite configurări suplimentare. %{link_start}Aflați mai multe%{link_end}."
msgid "Enable authenticated API request rate limit"
-msgstr ""
+msgstr "Activați limita ratei de solicitare API autentificată"
msgid "Enable authenticated Git LFS request rate limit"
-msgstr ""
+msgstr "Activați limita ratei de solicitare Git LFS autentificată"
msgid "Enable authenticated web request rate limit"
msgstr "Activați limitarea ratei de solicitări web autentificate"
msgid "Enable authentication"
-msgstr ""
+msgstr "Activați autentificarea"
msgid "Enable automatic repository housekeeping"
msgstr "Activați menajul automat al repozitoriului"
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
-msgstr ""
+msgstr "Activați politicile de expirare și păstrare a containerelor pentru proiectele create anterior GitLab 12.7."
msgid "Enable container expiration caching."
msgstr "Activați caching-ul de expirare a containerului."
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr "Activați eliminarea întârziată a proiectului în mod implicit pentru grupuri nou-create."
-
msgid "Enable email notification"
msgstr "Activați notificarea prin e-mail"
msgid "Enable error tracking"
-msgstr ""
+msgstr "Activați urmărirea erorilor"
msgid "Enable feature to choose access level"
-msgstr ""
+msgstr "Activați funcția de alegere a nivelului de acces"
msgid "Enable for this project"
-msgstr ""
+msgstr "Activați pentru acest proiect"
msgid "Enable group runners"
msgstr "Activați executorii de grup"
msgid "Enable header and footer in emails"
-msgstr ""
+msgstr "Activați antetul și subsolul în e-mailuri"
msgid "Enable health and performance metrics endpoint"
msgstr "Activați punctul final de metrici de sănătate și performanță"
msgid "Enable in-product marketing emails"
-msgstr ""
+msgstr "Activați e-mailurile de marketing în produs"
msgid "Enable incident management inbound alert limit"
-msgstr ""
+msgstr "Activați limita de alertă de intrare pentru gestionarea incidentelor"
msgid "Enable integration"
msgstr "Activați integrarea"
@@ -14240,7 +14510,7 @@ msgid "Enable rate limiting for POST requests to the specified paths"
msgstr "Activați limitarea ratei pentru solicitările POST spre căile specificate"
msgid "Enable reCAPTCHA"
-msgstr ""
+msgstr "Activați reCAPTCHA"
msgid "Enable reCAPTCHA for login."
msgstr "Activați reCAPTCHA pentru autentificare."
@@ -14264,10 +14534,10 @@ msgid "Enable shared runners for this project"
msgstr "Activați executorii partajați pentru acest proiect"
msgid "Enable two-factor authentication"
-msgstr ""
+msgstr "Activați autentificarea cu două factori"
msgid "Enable unauthenticated API request rate limit"
-msgstr ""
+msgstr "Activați limita ratei de solicitare API neautentificată"
msgid "Enable unauthenticated web request rate limit"
msgstr "Activați limită ratei de solicitare web neautentificată"
@@ -14276,7 +14546,7 @@ msgid "Enable user deactivation emails"
msgstr "Activați e-mailurile de dezactivare a utilizatorilor"
msgid "Enable version check"
-msgstr ""
+msgstr "Activați verificarea versiunii"
msgid "EnableReviewApp|%{stepStart}Step 1%{stepEnd}. Ensure you have Kubernetes set up and have a base domain for your %{linkStart}cluster%{linkEnd}."
msgstr "%{stepStart}Etapa 1%{stepEnd}. Asigurați-vă că ați configurat Kubernetes și că aveți un domeniu de bază pentru %{linkStart}clusterul%{linkEnd} dumneavoastră."
@@ -14297,28 +14567,25 @@ msgid "EnableReviewApp|Copy snippet text"
msgstr "Copiați textul fragmentului de cod"
msgid "Enabled"
-msgstr ""
+msgstr "Activat"
msgid "Enabled Git access protocols"
-msgstr ""
+msgstr "Protocoale de acces Git activate"
msgid "Enabled OAuth authentication sources"
msgstr "Surse de autentificare OAuth activate"
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr "Sursele activate pentru importul de coduri în timpul creării proiectului. OmniAuth trebuie să fie configurat pentru GitHub"
-
msgid "Encountered an error while rendering: %{err}"
-msgstr ""
+msgstr "A apărut o eroare în timpul redării: %{err}"
msgid "End Time"
-msgstr ""
+msgstr "Ora de terminare"
msgid "Ends"
-msgstr ""
+msgstr "Se termină"
msgid "Ends at (UTC)"
-msgstr ""
+msgstr "Se termină la (UTC)"
msgid "Ends on"
msgstr "Se termină pe"
@@ -14327,10 +14594,10 @@ msgid "Ends: %{endsAt}"
msgstr "Se încheie: %{endsAt}"
msgid "Enforce two-factor authentication"
-msgstr "Impuneți autentificarea în doi pași"
+msgstr "Impuneți autentificarea cu doi factori"
msgid "Enforce two-factor authentication for all user sign-ins."
-msgstr "Impuneți autentificarea în doi pași pentru toate autentificările utilizatorilor."
+msgstr "Impuneți autentificarea cu doi factori pentru toate autentificările utilizatorilor."
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr "Îmbunătățiți securitatea prin stocarea cheilor conturilor de servicii în administratorii de secrete - aflați mai multe despre %{docLinkStart}managementul secretului cu GitLab%{docLinkEnd}"
@@ -14339,7 +14606,7 @@ msgid "Ensure connectivity is available from the GitLab server to the Prometheus
msgstr "Asigurați-vă că este disponibilă conectivitatea de la serverul GitLab la serverul Prometheus."
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
-msgstr ""
+msgstr "Asigurați-vă că %{linkStart}mediul dvs. face parte din etapa de implementare%{linkEnd} a pipeline-ului dvs. CI pentru a urmări implementările în clusterul dvs."
msgid "Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below."
msgstr "Introduceți %{weights_link_start}greutăți%{weights_link_end} pentru stocări pentru repozitoriile noi. Stocările configurate apar mai jos."
@@ -14351,10 +14618,10 @@ msgid "Enter Admin Mode"
msgstr "Intrați în Modul Admin"
msgid "Enter a number"
-msgstr ""
+msgstr "Introduceți un număr"
msgid "Enter an integer number between 0 and 100"
-msgstr ""
+msgstr "Introduceți un număr întreg între 0 și 100"
msgid "Enter any color or choose one of the suggested colors below."
msgstr "Introduceți orice culoare sau alegeți una dintre culorile sugerate mai jos."
@@ -14363,7 +14630,7 @@ msgid "Enter any color."
msgstr "Introduceți orice culoare."
msgid "Enter at least three characters to search"
-msgstr ""
+msgstr "Introduceți cel puțin trei caractere pentru a căuta"
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Introduceți mai jos URL-ul serverului Bitbucket și tokenul personal de acces"
@@ -14375,25 +14642,25 @@ msgid "Enter license key"
msgstr "Introduceți cheia de licență"
msgid "Enter merge request URLs"
-msgstr ""
+msgstr "Introduceți URL-urile merge request-ului"
msgid "Enter new AWS Secret Access Key"
-msgstr ""
+msgstr "Introduceți noua cheie de acces secret AWS"
msgid "Enter number of issues"
-msgstr ""
+msgstr "Introduceți numărul de probleme"
msgid "Enter one or more user ID separated by commas"
-msgstr ""
+msgstr "Introduceți unul sau mai multe ID-uri de utilizator separate prin virgule"
msgid "Enter the %{name} description"
-msgstr ""
+msgstr "Introduceți descrierea %{name}"
msgid "Enter the %{name} title"
-msgstr ""
+msgstr "Introduceți titlul %{name}"
msgid "Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes."
-msgstr ""
+msgstr "Introduceți codul din aplicația cu doi factori de pe dispozitivul dvs. mobil. Dacă v-ați pierdut dispozitivul, puteți introduce unul dintre codurile de recuperare."
msgid "Enter the following to confirm:"
msgstr "Introduceți următoarele pentru a confirma:"
@@ -14402,7 +14669,7 @@ msgid "Enter the name of your application, and we'll return a unique %{type}."
msgstr "Introduceți numele aplicației dvs., iar noi vom returna un %{type} unic."
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 ""
+msgstr "IntroduceÈ›i numărul de secunde sau alte date lizibile de către om, cum ar fi „1 orăâ€. Acest timp de expirare are prioritate față de timpii de expirare mai mici setaÈ›i pentru proiect."
msgid "Enter the password for password-protected Elasticsearch servers."
msgstr "Introduceți parola pentru serverele Elasticsearch protejate prin parolă."
@@ -14420,17 +14687,14 @@ msgid "Enter your Packagist username."
msgstr "Introduceți numele dvs. de utilizator Packagist."
msgid "Enter your password to approve"
-msgstr ""
+msgstr "Introduceți parola pentru a aproba"
msgid "Enterprise"
-msgstr "ÃŽntreprindere"
+msgstr "Enterprise"
msgid "Environment"
msgstr "Mediul"
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr "Mediul este necesar pentru Stagii::MetricEndpointInserter"
@@ -14447,7 +14711,7 @@ msgid "Environment variables on this GitLab instance are configured to be %{link
msgstr "Variabilele de mediu din această instanță GitLab sunt configurate implicit să fie %{link_start}protejate%{link_end}."
msgid "Environment:"
-msgstr ""
+msgstr "Mediu"
msgid "EnvironmentDashboard|API"
msgstr "API"
@@ -14459,7 +14723,7 @@ msgid "EnvironmentDashboard|You are looking at the last updated environment"
msgstr "Vizualizați ultimul mediu actualizat"
msgid "Environments"
-msgstr ""
+msgstr "Medii"
msgid "Environments Dashboard"
msgstr "Tabloul de bord de medii"
@@ -14468,16 +14732,16 @@ msgid "Environments allow you to track deployments of your application. %{linkSt
msgstr "Mediile vă permit să urmăriți implementările aplicației dvs. %{linkStart}Mai multe informații%{linkEnd}"
msgid "Environments in %{name}"
-msgstr ""
+msgstr "Mediile din %{name}"
msgid "EnvironmentsAlert|%{severity} • %{title} %{text}. %{linkStart}View Details%{linkEnd} · %{startedAt} "
-msgstr ""
+msgstr "%{severity} - %{title} %{text}. %{linkStart}Vizualizați detaliile%{linkEnd} - %{startedAt} "
msgid "EnvironmentsDashboard|Add a project to the dashboard"
-msgstr "Adăugați un proiect la dashboard"
+msgstr "Adăugați un proiect în tabloul de bord"
msgid "EnvironmentsDashboard|Add projects"
-msgstr "Adăugați proiecte"
+msgstr "Adăugare proiecte"
msgid "EnvironmentsDashboard|Environments Dashboard"
msgstr "Tabloul de bord de medii"
@@ -14530,12 +14794,6 @@ msgstr "Oprire automată %{autoStopAt}"
msgid "Environments|Commit"
msgstr "Commit"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr "În prezent se afișează %{fetched} (de) rezultate."
-
-msgid "Environments|Currently showing all results."
-msgstr "În prezent, sunt afișate toate rezultatele."
-
msgid "Environments|Delete"
msgstr "Ștergeți"
@@ -14546,7 +14804,7 @@ msgid "Environments|Delete environment"
msgstr "Ștergeți mediul"
msgid "Environments|Deleting the '%{environmentName}' environment cannot be undone. Do you want to delete it anyway?"
-msgstr "Ștergerea mediului '%{environmentName}' nu poate fi anulată. Doriți să-l ștergeți oricum?"
+msgstr "Ștergerea mediului „%{environmentName}†nu poate fi anulată. Doriți să-l ștergeți oricum?"
msgid "Environments|Deploy to..."
msgstr "Implementați în..."
@@ -14572,9 +14830,6 @@ msgstr "Mediile sunt locurile în care se distribuie codul, cum ar fi pre-produc
msgid "Environments|How do I create an environment?"
msgstr "Cum pot crea un mediu?"
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr "Instalați Elastic Stack pe clusterul d-voastră pentru a activa capacitățile avansate de interogare, cum ar fi căutarea de text complet."
-
msgid "Environments|Job"
msgstr "Joburi"
@@ -14584,9 +14839,6 @@ msgstr "Aflați mai multe despre medii"
msgid "Environments|Learn more about stopping environments"
msgstr "Aflați mai multe despre oprirea mediilor"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr "Jurnalele de la %{start} la %{end}."
-
msgid "Environments|New environment"
msgstr "Mediu nou"
@@ -14596,12 +14848,6 @@ msgstr "Nu există medii implementate"
msgid "Environments|No deployments yet"
msgstr "Nu există încă implementări"
-msgid "Environments|No pod selected"
-msgstr "Niciun pod selectat"
-
-msgid "Environments|No pods to display"
-msgstr "Niciun pod de afișat"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "ReÈ›ineÈ›i că această acÈ›iune va opri mediul, dar %{emphasisStart}nu%{emphasisEnd} va avea efect asupra niciunei implementări existente, deoarece în fiÈ™ierul %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} nu este definită nicio „acÈ›iune de oprire a mediuluiâ€."
@@ -14611,11 +14857,8 @@ msgstr "Deschideți"
msgid "Environments|Open live environment"
msgstr "Deschideți mediul live"
-msgid "Environments|Pod name"
-msgstr "Numele pod-ului"
-
-msgid "Environments|Re-deploy"
-msgstr "Redistribuiți"
+msgid "Environments|Re-deploy environment"
+msgstr "Redistribuirea mediului"
msgid "Environments|Re-deploy environment %{name}?"
msgstr "Doriți să redistribuiți mediul %{name}?"
@@ -14623,18 +14866,12 @@ msgstr "Doriți să redistribuiți mediul %{name}?"
msgid "Environments|Re-deploy to environment"
msgstr "Redistribuiți în mediu"
-msgid "Environments|Rollback"
-msgstr "Revenire"
-
msgid "Environments|Rollback environment"
msgstr "Mediu de revenire"
msgid "Environments|Rollback environment %{name}?"
msgstr "Mediul de revenire %{name}?"
-msgid "Environments|Select pod"
-msgstr "Selectați pod-ul"
-
msgid "Environments|Show all"
msgstr "Afișați toate"
@@ -14650,14 +14887,11 @@ msgstr "Opriți %{environmentName}"
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr "Nu există încă implementări pentru acest mediu. %{linkStart}Aflați mai multe despre configurarea implementărilor.%{linkEnd}"
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr "A apărut o eroare la preluarea jurnalelor. Vă rugăm să încercați din nou."
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr "Această acțiune va relansa jobul pentru commit-ul %{linkStart}%{commitId}%{linkEnd}, plasând mediul într-o versiune anterioară. Sunteți sigur că doriți să continuați?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
+msgstr "Această acțiune va %{docsStart}încerca din nou cea mai recentă implementare%{docsEnd} cu commit-ul %{commitId}, pentru acest mediu. Sunteți sigur că doriți să continuați?"
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
-msgstr "Această acțiune va rula jobul definit de %{name} pentru confirmarea %{linkStart}%{commitId}%{linkEnd} punând mediul într-o versiune anterioară. Puteți reveni la aceasta prin reimplementarea celei mai recente versiuni a aplicației dumneavoastră. Sunteți sigur că doriți să continuați?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr "Această acțiune va %{docsStart}readuce acest mediu%{docsEnd} la o implementare anterioară reușită pentru commit-ul %{commitId}. Sunteți sigur că doriți să continuați?"
msgid "Environments|Upcoming"
msgstr "Viitoare"
@@ -14699,7 +14933,7 @@ msgid "Epic details"
msgstr "Detaliile epicei"
msgid "Epic events"
-msgstr ""
+msgstr "Evenimente epice"
msgid "Epic not found for given params"
msgstr "Epica nu a fost găsită pentru parametrii dați"
@@ -14714,7 +14948,7 @@ msgid "Epics let you manage your portfolio of projects more efficiently and with
msgstr "Epicele vă permit să vă gestionați portofoliul de proiecte mai eficient și cu mai puțin efort"
msgid "Epics, issues, and merge requests"
-msgstr ""
+msgstr "Epice, probleme și merge request-uri"
msgid "Epics|%{startDate} – %{dueDate}"
msgstr "%{startDate} – %{dueDate}"
@@ -14735,7 +14969,7 @@ msgid "Epics|An error occurred while updating labels."
msgstr "A apărut o eroare în timp ce se actualizau etichetele."
msgid "Epics|Are you sure you want to remove %{bStart}%{targetIssueTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}?"
-msgstr "Sunteți sigur că doriți să eliminați %{bStart}%{targetIssueTitle}%{bEnd} din %{bStart}%{parentEpicTitle}%{bEnd}?"
+msgstr "Sunteți sigur că doriți să înlăturați %{bStart}%{targetIssueTitle}%{bEnd} din %{bStart}%{parentEpicTitle}%{bEnd}?"
msgid "Epics|Assign Epic"
msgstr "Atribuiți epica"
@@ -14791,6 +15025,9 @@ msgstr "Ceva nu a mers bine în timpul înlăturării problemei din epică."
msgid "Epics|Something went wrong while updating epics."
msgstr "Ceva nu a mers bine în timp ce se actualizau epicele."
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr "Culoarea pentru epică atunci când este vizualizată, cum ar fi pe barele de cronologie din foaia de parcurs."
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr "Această epică și orice epice copil pe care le conține sunt confidențiale și ar trebui să fie vizibile doar pentru membrii echipei care au cel puțin acces de Reporter."
@@ -14804,7 +15041,7 @@ msgid "Epics|Unable to save epic. Please try again"
msgstr "Nu se poate salva epica. Vă rugăm să încercați din nou"
msgid "Epics|due"
-msgstr "scadentă"
+msgstr "scadență"
msgid "Epics|start"
msgstr "de început"
@@ -14813,10 +15050,10 @@ msgid "Erased"
msgstr "Șters"
msgid "Error"
-msgstr ""
+msgstr "Eroare"
msgid "Error Details"
-msgstr ""
+msgstr "Detaliile erorii"
msgid "Error Tracking"
msgstr "Urmărirea erorilor"
@@ -14825,13 +15062,13 @@ msgid "Error creating epic"
msgstr "Eroare la crearea epicei"
msgid "Error creating label."
-msgstr ""
+msgstr "Eroare la crearea etichetei."
msgid "Error creating new directory. Please try again."
msgstr "Eroare la crearea unui nou director. Vă rugăm să încercați din nou."
msgid "Error creating new iteration"
-msgstr ""
+msgstr "Eroare la crearea noii iterații"
msgid "Error creating repository for snippet with id %{snippet_id}"
msgstr "Eroare la crearea repozitoriului pentru fragmentul de cod cu ID-ul %{snippet_id}"
@@ -14840,58 +15077,58 @@ msgid "Error creating the snippet"
msgstr "Eroare la crearea fragmentului de cod"
msgid "Error deleting project. Check logs for error details."
-msgstr ""
+msgstr "Eroare la ștergerea proiectului. Verificați jurnalele pentru detalii despre eroare."
msgid "Error fetching burnup chart data"
msgstr "Eroare la preluarea datelor graficului burnup"
msgid "Error fetching diverging counts for branches. Please try again."
-msgstr ""
+msgstr "Eroare la preluarea contorizărilor divergente pentru ramuri. Vă rugăm să încercați din nou."
msgid "Error fetching forked projects. Please try again."
msgstr "Eroare la preluarea proiectelor din forkuri. Vă rugăm să încercați din nou."
msgid "Error fetching labels."
-msgstr ""
+msgstr "Eroare la preluarea etichetelor."
msgid "Error fetching network graph."
-msgstr ""
+msgstr "Eroare la preluarea graficului de rețea."
msgid "Error fetching payload data."
msgstr "Eroare la preluarea datelor payload"
msgid "Error fetching refs"
-msgstr ""
+msgstr "Eroare la preluarea referințelor"
msgid "Error fetching the dependency list. Please check your network connection and try again."
-msgstr ""
+msgstr "Eroare la preluarea listei de dependențe. Vă rugăm să verificați conexiunea de rețea și să încercați din nou."
msgid "Error loading branch data. Please try again."
msgstr "Eroare la încărcarea datelor ramurii. Vă rugăm să încercați din nou."
msgid "Error loading branches."
-msgstr ""
+msgstr "Eroare la încărcarea ramurilor."
msgid "Error loading burndown chart data"
msgstr "Eroare la încărcarea datelor graficului burndown"
msgid "Error loading countries data."
-msgstr ""
+msgstr "Eroare la încărcarea datelor țărilor."
msgid "Error loading file viewer."
-msgstr ""
+msgstr "Eroare la încărcarea vizualizatorului de fișiere."
msgid "Error loading issues"
-msgstr ""
+msgstr "Eroare de încărcare a problemelor"
msgid "Error loading iterations"
-msgstr ""
+msgstr "Eroare de încărcare a iterațiilor"
msgid "Error loading last commit."
msgstr "Eroare la încărcarea ultimului commit."
msgid "Error loading markdown preview"
-msgstr ""
+msgstr "Eroare la încărcarea previzualizării markdown"
msgid "Error loading merge requests."
msgstr "Eroare la încărcarea merge request-urilor."
@@ -14906,13 +15143,13 @@ msgid "Error loading template types."
msgstr "Eroare la încărcarea tipurilor de șabloane."
msgid "Error loading template."
-msgstr ""
+msgstr "Eroare la încărcarea șablonului."
msgid "Error loading viewer"
-msgstr ""
+msgstr "Eroare la încărcarea vizualizatorului"
msgid "Error occurred when fetching sidebar data"
-msgstr ""
+msgstr "A apărut o eroare la preluarea datelor barei laterale"
msgid "Error occurred when saving assignees"
msgstr "A apărut o eroare la salvarea responsabililor"
@@ -14921,79 +15158,79 @@ msgid "Error occurred when saving reviewers"
msgstr "A apărut o eroare la salvarea recenzenților"
msgid "Error occurred while updating the %{issuableType} status"
-msgstr "A apărut o eroare actualizând statusul %{issuableType}"
+msgstr "A apărut o eroare la actualizarea statusului %{issuableType}"
msgid "Error occurred while updating the issue status"
-msgstr ""
+msgstr "A apărut o eroare la actualizarea stării problemei"
msgid "Error occurred. A blocked user cannot be deactivated"
msgstr "A apărut o eroare. Un utilizator blocat nu poate fi dezactivat"
msgid "Error occurred. A blocked user must be unblocked to be activated"
-msgstr ""
+msgstr "A apărut o eroare. Un utilizator blocat trebuie să fie deblocat pentru a fi activat"
msgid "Error occurred. User was not banned"
msgstr "A apărut o eroare. Interzicerea utilizatorului a eșuat"
msgid "Error occurred. User was not blocked"
-msgstr ""
+msgstr "A apărut o eroare. Utilizatorul nu a fost blocat"
msgid "Error occurred. User was not confirmed"
-msgstr ""
+msgstr "A apărut o eroare. Utilizatorul nu a fost confirmat"
msgid "Error occurred. User was not unbanned"
msgstr "A apărut o eroare. Anularea interzicerii utilizatorului a eșuat"
msgid "Error occurred. User was not unblocked"
-msgstr ""
+msgstr "A apărut o eroare. Utilizatorul nu a fost deblocat"
msgid "Error occurred. User was not unlocked"
-msgstr ""
+msgstr "A apărut o eroare. Utilizatorul nu a fost deblocat"
msgid "Error parsing CSV file. Please make sure it has"
-msgstr ""
+msgstr "Eroare la analizarea fișierului CSV. Vă rugăm să vă asigurați că are"
msgid "Error rendering Markdown preview"
msgstr "Eroare de redare a previzualizării Markdown"
msgid "Error saving label update."
-msgstr ""
+msgstr "Eroare la salvarea actualizării etichetei."
msgid "Error setting up editor. Please try again."
-msgstr ""
+msgstr "Eroare la configurarea editorului. Vă rugăm să încercați din nou."
msgid "Error tracking"
msgstr "Urmărirea erorilor"
msgid "Error updating %{issuableType}"
-msgstr ""
+msgstr "Eroare la actualizarea %{issuableType}"
msgid "Error updating status for all to-do items."
-msgstr "Eroare la actualizarea stării tuturor elementelor „de făcutâ€."
+msgstr "Eroare la actualizarea stării tuturor sarcinilor de-făcut."
msgid "Error updating status of to-do item."
-msgstr "Eroare la actualizarea stării elementului „de făcutâ€."
+msgstr "Eroare la actualizarea stării sarcinii de-făcut."
msgid "Error updating the snippet"
msgstr "Eroare la actualizarea fragmentului de cod"
msgid "Error uploading file"
-msgstr ""
+msgstr "Eroare la încărcarea fișierului"
msgid "Error uploading file. Please try again."
-msgstr ""
+msgstr "Eroare la încărcarea fișierului. Vă rugăm să încercați din nou."
msgid "Error uploading file: %{stripped}"
-msgstr ""
+msgstr "Eroare la încărcarea fișierului: %{stripped}"
msgid "Error while loading the merge request. Please try again."
msgstr "Eroare la încărcarea merge request-ului. Vă rugăm să încercați din nou."
msgid "Error while migrating %{upload_id}: %{error_message}"
-msgstr "Eroare la migrarea %{upload_id}: %{error_message}"
+msgstr "Eroare în timpul migrării %{upload_id}: %{error_message}"
msgid "Error with Akismet. Please check the logs for more info."
-msgstr ""
+msgstr "Eroare cu Akismet. Verificați jurnalele pentru mai multe informații."
msgid "Error: %{error_message}"
msgstr "Eroare: %{error_message}"
@@ -15005,7 +15242,7 @@ msgid "Error: Couldn't load some or all of the changes."
msgstr "Eroare: Nu s-au putut încărca unele sau toate modificările."
msgid "Error: No AWS credentials were supplied"
-msgstr ""
+msgstr "Eroare: nu au fost furnizate acreditări AWS"
msgid "Error: No AWS provision role found for user"
msgstr "Eroare: nu a fost găsit niciun rol de furnizare AWS pentru utilizator"
@@ -15017,6 +15254,9 @@ msgid "Error: Unable to delete deploy freeze"
msgstr "Eroare: Imposibil de șters înghețarea implementării"
msgid "Error: Unable to find AWS role for current user"
+msgstr "Eroare: nu se poate găsi rolul AWS pentru utilizatorul curent"
+
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
msgid "ErrorTracking|Active"
@@ -15062,7 +15302,7 @@ msgid "ErrorTracking|View project settings"
msgstr "Vizualizați setările proiectului"
msgid "Errors"
-msgstr ""
+msgstr "Erori"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr "Erori găsite pe linia %{line_number}: %{error_lines}. Vă rugăm să verificați dacă aceste rânduri au o cerință pentru titlu."
@@ -15101,7 +15341,7 @@ msgid "EscalationPolicies|A schedule is required for adding an escalation policy
msgstr "Este necesar un program pentru adăugarea unei politici de escaladare."
msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
-msgstr "Pentru a adăuga o politică de escaladare este necesar un program. Vă rugăm să creați mai întâi un program la apel."
+msgstr "Pentru a adăuga o politică de escaladare este necesară o planificare. Vă rugăm să creați mai întâi un program de gardă."
msgid "EscalationPolicies|A user is required for adding an escalation policy."
msgstr "Pentru a adăuga o politică de escaladare este necesar un utilizator."
@@ -15110,10 +15350,10 @@ msgid "EscalationPolicies|Add an escalation policy"
msgstr "Adăugați o politică de escaladare"
msgid "EscalationPolicies|Add escalation policy"
-msgstr "Adăugați politica de escaladare"
+msgstr "Adăugare politică de escaladare"
msgid "EscalationPolicies|Add policy"
-msgstr "Adăugați politica"
+msgstr "Adăugare politică"
msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
msgstr "Sunteți sigur că doriți să ștergeți politica de escaladare „%{escalationPolicy}� Această acțiune nu poate fi anulată."
@@ -15128,7 +15368,7 @@ msgid "EscalationPolicies|Edit escalation policy"
msgstr "Editați politica de escaladare"
msgid "EscalationPolicies|Email on-call user in schedule"
-msgstr "Trimiteți un e-mail utilizatorului la apel în program:"
+msgstr "Trimiteți un e-mail utilizatorului de gardă în program"
msgid "EscalationPolicies|Email user"
msgstr "Trimiteți e-mail utilizatorului"
@@ -15182,13 +15422,13 @@ msgid "EscalationPolicies|mins"
msgstr "min."
msgid "Estimate"
-msgstr ""
+msgstr "Estimare"
msgid "Estimated"
-msgstr ""
+msgstr "Estimat"
msgid "Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
-msgstr ""
+msgstr "Chiar dacă atingeți numărul de seat-uri din abonamentul dvs., puteți continua să adăugați utilizatori, iar GitLab vă va factura pentru depășirea numărului de seat-uri."
msgid "EventFilterBy|Filter by all"
msgstr "Filtrați după toate"
@@ -15218,7 +15458,7 @@ msgid "EventFilterBy|Filter by wiki"
msgstr "Filtrați după wiki"
msgid "Events"
-msgstr ""
+msgstr "Evenimente"
msgid "Events API"
msgstr "API de evenimente"
@@ -15248,7 +15488,7 @@ msgid "Every day at %{time} %{timezone}"
msgstr "ÃŽn fiecare zi la %{time} %{timezone}"
msgid "Every month"
-msgstr ""
+msgstr "În fiecare lună"
msgid "Every month (Day %{day} at %{time})"
msgstr "În fiecare lună (Ziua %{day} la %{time})"
@@ -15257,16 +15497,16 @@ msgid "Every month on the %{day} at %{time} %{timezone}"
msgstr "În fiecare lună, pe %{day} la %{time} %{timezone}"
msgid "Every three months"
-msgstr ""
+msgstr "La fiecare trei luni"
msgid "Every two weeks"
-msgstr ""
+msgstr "La fiecare două săptămâni"
msgid "Every week"
msgid_plural "Every %d weeks"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "În fiecare săptămână"
+msgstr[1] "La fiecare %d săptămâni"
+msgstr[2] "La fiecare %d de săptămâni"
msgid "Every week (%{weekday} at %{time})"
msgstr "În fiecare săptămână, (%{weekday} la %{time})"
@@ -15283,11 +15523,14 @@ msgstr "ÃŽn fiecare an, pe %{day} la %{time} %{timezone}"
msgid "Everyone With Access"
msgstr "Toți cei care au acces"
+msgid "Everyone can access the wiki."
+msgstr "Oricine poate avea acces la wiki."
+
msgid "Everyone can contribute"
-msgstr ""
+msgstr "Toată lumea poate contribui"
msgid "Everything on your to-do list is marked as done."
-msgstr "Toate sarcinile de pe lista de sarcini „de făcut†sunt marcate ca terminate."
+msgstr "Tot ceea ce aveți în lista de sarcini de-făcut sunt marcate ca terminate."
msgid "Everything you need to create a GitLab Pages site using Gatsby"
msgstr "Tot ce aveți nevoie pentru a crea un site GitLab Pages folosind Gatsby"
@@ -15308,19 +15551,19 @@ msgid "Everything you need to create a GitLab Pages site using Middleman"
msgstr "Tot ce aveți nevoie pentru a crea un site GitLab Pages folosind Middleman"
msgid "Everything you need to create a GitLab Pages site using Pelican"
-msgstr ""
+msgstr "Tot ce aveți nevoie pentru a crea un site GitLab Pages folosind Pelican"
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "Tot ce aveți nevoie pentru a crea un site GitLab Pages folosind HTML simplu"
msgid "Evidence collection"
-msgstr ""
+msgstr "Colectarea probelor"
msgid "Exactly one of %{attributes} is required"
msgstr "Exact unul dintre %{attributes} este necesar"
msgid "Example: @sub\\.company\\.com$"
-msgstr ""
+msgstr "Exemplu: @sub\\.company\\.com$"
msgid "Examples"
msgstr "Exemple"
@@ -15329,7 +15572,7 @@ msgid "Except policy:"
msgstr "Cu excepția politicii:"
msgid "Exceptions"
-msgstr ""
+msgstr "Excepții"
msgid "Excluding merge commits. Limited to %{limit} commits."
msgstr "Se exclud commit-urile de îmbinare. Limitat la %{limit} de commit-uri."
@@ -15338,19 +15581,19 @@ msgid "Excluding merge commits. Limited to 6,000 commits."
msgstr "Se exclud commit-urile de îmbinare. Limitat la 6000 de commit-uri."
msgid "Execution time"
-msgstr ""
+msgstr "Durata de execuție"
msgid "Existing branch name, tag, or commit SHA"
msgstr "Numele ramurii, eticheta sau SHA de commit existente"
msgid "Existing projects may be moved into a group"
-msgstr ""
+msgstr "Proiectele existente pot fi mutate într-un grup"
msgid "Existing projects will be able to use expiration policies. Avoid enabling this if an external Container Registry is being used, as there is a performance risk if many images exist on one project."
msgstr "Proiectele existente vor putea utiliza politicile de expirare. Evitați activarea acestei opțiuni dacă se utilizează un Registru de containere extern, întrucât există un risc de performanță în cazul în care există multe imagini într-un proiect."
msgid "Existing sign in methods may be removed"
-msgstr ""
+msgstr "Metodele de autentificare existente pot fi înlăturate"
msgid "Exit."
msgstr "Ieșire."
@@ -15377,7 +15620,7 @@ msgid "Expand issues"
msgstr "Extindeți problemele"
msgid "Expand jobs"
-msgstr ""
+msgstr "Extindeți joburile"
msgid "Expand milestones"
msgstr "Extindeți obiectivele"
@@ -15392,16 +15635,16 @@ msgid "Expand sidebar"
msgstr "Extindeți bara laterală"
msgid "Expected documents: %{expected_documents}"
-msgstr ""
+msgstr "Documente așteptate: %{expected_documents}"
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr "Trebuie să aibă exact una dintre următoarele: Utilizator, Spațiu de nume sau Proiect."
msgid "Expiration"
-msgstr ""
+msgstr "Expirare"
msgid "Expiration date"
-msgstr ""
+msgstr "Data de expirare"
msgid "Expiration date (optional)"
msgstr "Data expirării (opțional)"
@@ -15410,37 +15653,37 @@ msgid "Expiration date:"
msgstr "Data expirării:"
msgid "Expired"
-msgstr ""
+msgstr "Expirat"
msgid "Expired %{expiredOn}"
-msgstr ""
+msgstr "Expirat la %{expiredOn}"
msgid "Expired:"
-msgstr ""
+msgstr "Expirat:"
msgid "Expires"
-msgstr ""
+msgstr "Expiră"
-msgid "Expires in %{expires_at}"
-msgstr ""
+msgid "Expires %{preposition} %{expires_at}"
+msgstr "Expiră %{preposition} %{expires_at}"
msgid "Expires on"
msgstr "Expiră pe"
msgid "Expires:"
-msgstr ""
+msgstr "Expiră:"
msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
-msgstr ""
+msgstr "Explicați problema. Dacă este cazul, furnizați un link către problema sau comentariul în cauză."
msgid "Explore"
-msgstr ""
+msgstr "Explorați"
msgid "Explore GitLab"
-msgstr ""
+msgstr "Explorați GitLab"
msgid "Explore Groups"
-msgstr ""
+msgstr "Explorați grupurile"
msgid "Explore groups"
msgstr "Explorați grupurile"
@@ -15464,28 +15707,28 @@ msgid "Explore topics"
msgstr "Explorați subiectele"
msgid "Export"
-msgstr ""
+msgstr "Exportați"
msgid "Export %{requirementsCount} requirements?"
-msgstr ""
+msgstr "Exportați %{requirementsCount} (de) cerințe?"
msgid "Export as CSV"
-msgstr ""
+msgstr "Exportați ca CSV"
msgid "Export commit custody report"
-msgstr "Exportul raportului de custodie al commit-urilor"
+msgstr "Exportați raportul de custodie al commit-ului"
msgid "Export group"
-msgstr ""
+msgstr "Export de grup"
msgid "Export issues"
-msgstr "Exportați problemele"
+msgstr "Export de probleme"
msgid "Export merge requests"
-msgstr "Exportați merge request-urile"
+msgstr "Export de merge request-uri"
msgid "Export project"
-msgstr ""
+msgstr "Export de proiect"
msgid "Export requirements"
msgstr "Cerințe de export"
@@ -15494,25 +15737,25 @@ msgid "Export this group with all related data."
msgstr "Exportați acest grup cu toate datele asociate."
msgid "Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}"
-msgstr "Exportați acest proiect cu toate datele sale asociate pentru a-l muta într-o nouă instanță GitLab. Când fișierul exportat este gata, îl puteți descărca de pe această pagină sau de pe linkul de descărcare din notificarea pe care o veți primi prin e-mail. Apoi îl puteți importa atunci când creați un nou proiect. %{link_start}Învățați mai multe.%{link_end}"
+msgstr "Exportați acest proiect cu toate datele sale asociate pentru a-l muta într-o nouă instanță GitLab. Când fișierul exportat este gata, îl puteți descărca de pe această pagină sau de pe linkul de descărcare din notificarea pe care o veți primi prin e-mail. Apoi îl puteți importa atunci când creați un nou proiect. %{link_start}Aflați mai multe.%{link_end}"
msgid "Export variable to pipelines running on protected branches and tags only."
-msgstr "Exportă variabila numai pe pipeline-urile care rulează pe ramuri și etichete protejate."
+msgstr "Exportați variabila numai la pipeline-urile care rulează pe ramuri și etichete protejate."
msgid "Exported requirements"
-msgstr ""
+msgstr "Cerințe de export"
msgid "External URL"
-msgstr ""
+msgstr "URL extern"
msgid "External User:"
-msgstr ""
+msgstr "Utilizator extern:"
msgid "External authorization denied access to this project"
-msgstr ""
+msgstr "Autorizația externă a refuzat accesul la acest proiect"
msgid "External storage URL"
-msgstr ""
+msgstr "URL-ul de stocare externă"
msgid "External storage authentication token"
msgstr "Token de autentificare a stocării externe"
@@ -15586,6 +15829,9 @@ msgstr "O singură integrare a trackerului de probleme poate fi activă la un mo
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr "Această problemă este sincronizată cu %{trackerName}"
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr "Introduceți URL-ul către wiki-ul extern."
+
msgid "ExternalWikiService|External wiki"
msgstr "Wiki extern"
@@ -15605,13 +15851,19 @@ msgid "Failed"
msgstr "Eșuat(ă)"
msgid "Failed Jobs"
-msgstr "Joburile nereușite"
+msgstr "Joburi eșuate"
+
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] "Job eșuat"
+msgstr[1] "Joburi eșuate"
+msgstr[2] "Joburi eșuate"
msgid "Failed on"
-msgstr ""
+msgstr "Eșuat pe"
msgid "Failed to add a Zoom meeting"
-msgstr "Nu ați reușit să adăugați o reuniune Zoom"
+msgstr "Nu s-a reușit adăugarea unei reuniuni Zoom"
msgid "Failed to apply commands."
msgstr "Nu s-a reușit aplicarea comenzilor."
@@ -15653,7 +15905,7 @@ msgid "Failed to create a branch for this issue. Please try again."
msgstr "Nu s-a reușit crearea unei ramuri pentru această problemă. Vă rugăm să încercați din nou."
msgid "Failed to create a to-do item for the design."
-msgstr "Nu s-a reușit crearea unui element de-făcut pentru proiect."
+msgstr "Nu s-a reușit crearea unei sarcini de-făcut pentru proiect."
msgid "Failed to create framework"
msgstr "Nu s-a reușit crearea framework-ului"
@@ -15707,7 +15959,7 @@ msgid "Failed to load"
msgstr "Nu s-a reușit încărcarea"
msgid "Failed to load Roadmap"
-msgstr "Nu s-a reușit încărcarea Foii de parcurs"
+msgstr "Nu s-a reușit încărcarea foii de parcurs"
msgid "Failed to load assignees."
msgstr "Nu s-a reușit încărcarea responsabililor."
@@ -15737,10 +15989,10 @@ msgid "Failed to load group activity metrics. Please try again."
msgstr "Nu s-a reușit încărcarea metricilor activității grupului. Vă rugăm să încercați din nou."
msgid "Failed to load groups, users and deploy keys."
-msgstr "Nu s-a reușit încărcarea grupurilor, a utilizatorilor și a cheilor de distribuire."
+msgstr "Nu s-a reușit încărcarea grupurilor, a utilizatorilor și a cheilor de implementare."
msgid "Failed to load groups."
-msgstr ""
+msgstr "Nu s-a reușit încărcarea grupurilor."
msgid "Failed to load iteration cadences."
msgstr "Nu s-a reușit încărcarea cadențelor iterației."
@@ -15800,7 +16052,7 @@ msgid "Failed to remove a Zoom meeting"
msgstr "Nu s-a reușit înlăturarea unei ședințe Zoom"
msgid "Failed to remove a to-do item for the design."
-msgstr "Nu s-a reușit înlăturarea unui element de-făcut pentru design"
+msgstr "Nu s-a reușit înlăturarea unei sarcini de-făcut pentru elementul de design"
msgid "Failed to remove attention because no user was found."
msgstr "Nu s-a reușit înlăturarea atenției deoarece nu a fost găsit niciun utilizator."
@@ -15809,7 +16061,7 @@ msgid "Failed to remove mirror."
msgstr "Nu s-a reușit eliminarea replicii"
msgid "Failed to remove the pipeline schedule"
-msgstr ""
+msgstr "Nu s-a reușit înlăturarea programului pipeline-ului"
msgid "Failed to remove user identity."
msgstr "Nu s-a reușit înlăturarea identității utilizatorului."
@@ -15842,10 +16094,10 @@ msgid "Failed to set iteration on this issue. Please try again."
msgstr "Nu s-a reușit setarea iterației pentru această problemă. Vă rugăm să încercați din nou."
msgid "Failed to signing using smartcard authentication"
-msgstr "Nu s-a reușit semnarea utilizând autentificarea smartcard"
+msgstr "Nu s-a reușit autentificarea cu ajutorul smartcard-ului"
msgid "Failed to toggle the to-do status for the design."
-msgstr "Nu s-a reușit comutarea stării de-făcut pentru design."
+msgstr "Nu s-a reușit comutarea stării de-făcut pentru elementul de design."
msgid "Failed to update branch!"
msgstr "Nu s-a reușit actualizarea ramurii!"
@@ -15872,7 +16124,7 @@ msgid "Failed to upload object map file"
msgstr "Nu s-a reușit încărcarea fișierului de mapare a obiectului"
msgid "Failure"
-msgstr ""
+msgstr "Eșec"
msgid "False positive"
msgstr "Fals pozitiv"
@@ -15887,13 +16139,13 @@ msgid "Faster releases. Better code. Less pain."
msgstr "Lansări mai rapide. Cod mai bun. Mai puțină bătaie de cap."
msgid "Favicon"
-msgstr ""
+msgstr "Favicon"
msgid "Favicon was successfully removed."
-msgstr ""
+msgstr "Faviconul a fost eliminat cu succes."
msgid "Favicon will be removed. Are you sure?"
-msgstr "Favicon-ul va fi eliminat. Sunteți sigur?"
+msgstr "Faviconul va fi eliminat. Sunteți sigur?"
msgid "Feature Flags"
msgstr "Feature Flags"
@@ -15938,7 +16190,7 @@ msgid "FeatureFlags|Active"
msgstr "Activ"
msgid "FeatureFlags|Add strategy"
-msgstr "Adăugați strategia"
+msgstr "Adăugare strategie"
msgid "FeatureFlags|All Environments"
msgstr "Toate mediile"
@@ -16112,7 +16364,7 @@ msgid "FeatureFlag|There are no configured user lists"
msgstr "Nu există liste de utilizatori configurate"
msgid "FeatureFlag|Type"
-msgstr "Tip"
+msgstr "Tipul"
msgid "FeatureFlag|User IDs"
msgstr "ID-uri de utilizator"
@@ -16121,70 +16373,70 @@ msgid "FeatureFlag|User List"
msgstr "Lista de utilizatori"
msgid "Feb"
-msgstr ""
+msgstr "Feb"
msgid "February"
-msgstr ""
+msgstr "Februarie"
msgid "Fetch and check out this merge request's feature branch:"
msgstr "Obțineți și verificați această ramură de caracteristică a merge request-ului:"
msgid "Fetching incoming email"
-msgstr ""
+msgstr "Preluarea e-mailurilor primite"
msgid "File"
-msgstr ""
+msgstr "Fișier"
msgid "File %{current} of %{total}"
-msgstr ""
+msgstr "Fișierul %{current} din %{total}"
msgid "File Hooks"
-msgstr ""
+msgstr "Hook-uri de fișiere"
msgid "File Hooks (%{count})"
-msgstr ""
+msgstr "Hook-uri de fișiere (%{count})"
msgid "File Tree"
msgstr "Arbore de fișiere"
msgid "File added"
-msgstr ""
+msgstr "Fișier adăugat"
msgid "File browser"
-msgstr ""
+msgstr "Browser de fișiere"
msgid "File deleted"
-msgstr ""
+msgstr "Fișier șters"
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
-msgstr ""
+msgstr "Hook-urile de fișiere sunt similare cu cele de sistem, dar sunt executate ca fișiere în loc să trimită date către o adresă URL."
msgid "File mode changed from %{a_mode} to %{b_mode}"
-msgstr ""
+msgstr "Modul de fișier s-a schimbat de la %{a_mode} la %{b_mode}"
msgid "File moved"
-msgstr ""
+msgstr "Fișier mutat"
msgid "File name"
-msgstr ""
+msgstr "Numele fișierului"
msgid "File renamed with no changes."
-msgstr ""
+msgstr "Fișier redenumit fără modificări."
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr "Fișierul suprimat de o intrare .gitattributes sau codificarea fișierului nu este suportat."
msgid "File templates"
-msgstr ""
+msgstr "Șabloane de fișiere"
msgid "File too large. Secure Files must be less than %{limit} MB."
-msgstr ""
+msgstr "Fișier prea mare. Fișierele securizate trebuie să fie mai mici de %{limit} MB."
msgid "File upload error."
-msgstr ""
+msgstr "Eroare la încărcarea fișierului."
msgid "Filename"
-msgstr ""
+msgstr "Numele fișierului"
msgid "Files"
msgstr "Fișiere"
@@ -16202,28 +16454,28 @@ msgid "Files, directories, and submodules in the path %{path} for commit referen
msgstr "Fișiere, directoare și submodule din calea %{path} pentru referința de commit %{ref}"
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
-msgstr "Completați câmpurile următoare, porniți %{strong_open}Activarea autentificării SAML pentru acest grup%{strong_close} și apăsați %{strong_open}Salvați modificările%{strong_close}"
+msgstr "Completați câmpurile următoare, porniți %{strong_open}Activați autentificarea SAML pentru acest grup%{strong_close} și apăsați %{strong_open}Salvați modificările%{strong_close}"
msgid "Filter"
msgstr "Filtru"
msgid "Filter by"
-msgstr ""
+msgstr "Filtrați după"
msgid "Filter by %{page_context_word} that are currently open."
-msgstr ""
+msgstr "Filtrați după %{page_context_word} care sunt deschise în prezent."
msgid "Filter by Git revision"
-msgstr ""
+msgstr "Filtrați după revizuirea Git"
msgid "Filter by issues that are currently closed."
msgstr "Filtrați după problemele care sunt închise în prezent."
msgid "Filter by issues that are currently opened."
-msgstr ""
+msgstr "Filtrați după problemele care sunt deschise în prezent."
msgid "Filter by label"
-msgstr ""
+msgstr "Filtrați după etichetă"
msgid "Filter by merge requests that are currently closed and unmerged."
msgstr "Filtrați după merge request-uri care sunt în prezent închise și neîmbinate"
@@ -16238,7 +16490,7 @@ msgid "Filter by milestone name"
msgstr "Filtrează după numele obiectivului"
msgid "Filter by name"
-msgstr ""
+msgstr "Filtrați după nume"
msgid "Filter by test cases that are currently archived."
msgstr "Filtrați după cazurile de testare care sunt arhivate în prezent."
@@ -16247,79 +16499,85 @@ msgid "Filter by test cases that are currently open."
msgstr "Filtrați după cazurile de testare care sunt deschise în prezent."
msgid "Filter by user"
-msgstr ""
+msgstr "Filtrați după utilizator"
msgid "Filter parameters are not valid. Make sure that the end date is after the start date."
-msgstr ""
+msgstr "Parametrii de filtrare nu sunt valabili. Asigurați-vă că data de sfârșit este ulterioară datei de început."
msgid "Filter pipelines"
-msgstr ""
+msgstr "Filtrare de pipeline-uri"
msgid "Filter results"
-msgstr ""
+msgstr "Filtrați rezultatele"
msgid "Filter results by group"
-msgstr ""
+msgstr "Filtrați rezultatele după grup"
msgid "Filter results by project"
-msgstr ""
+msgstr "Filtrați rezultatele după proiect"
msgid "Filter results..."
-msgstr ""
+msgstr "Filtrarea rezultatelor..."
msgid "Filter users"
msgstr "Filtrați utilizatorii"
msgid "Filter..."
-msgstr ""
+msgstr "Filtrare..."
msgid "Find File"
-msgstr ""
+msgstr "Căutați un fișier"
msgid "Find bugs in your code with API fuzzing."
-msgstr "Găsiți erori în codul dvs. cu fuzzing de API."
+msgstr "Găsiți erori în codul dvs. cu fuzzing API."
msgid "Find bugs in your code with coverage-guided fuzzing."
msgstr "Găsiți erori în codul dvs. cu fuzzing ghidat prin coverage."
msgid "Find by path"
-msgstr ""
+msgstr "Căutați după cale"
msgid "Find file"
+msgstr "Căutați un fișier"
+
+msgid "Fingerprint (MD5)"
msgstr ""
-msgid "Fingerprint"
-msgstr "Amprentă"
+msgid "Fingerprint (SHA256)"
+msgstr ""
msgid "Fingerprints"
msgstr "Amprente"
msgid "Finish editing this message first!"
-msgstr ""
+msgstr "Finalizați mai întâi editarea acestui mesaj!"
+
+msgid "Finish review"
+msgstr "Terminați revizuirea"
msgid "Finish setting up your dedicated account for %{group_name}."
-msgstr ""
+msgstr "Finalizați configurarea contului dvs. dedicat pentru %{group_name}."
msgid "Finished"
-msgstr ""
+msgstr "Finalizat"
msgid "First Name"
msgstr "Prenumele"
msgid "First Seen"
-msgstr ""
+msgstr "Văzut(ă) prima dată"
msgid "First day of the week"
-msgstr ""
+msgstr "Prima zi a săptămânii"
msgid "First name"
-msgstr ""
+msgstr "Prenume"
msgid "First seen"
-msgstr ""
+msgstr "Văzut(ă) prima dată"
msgid "Fixed"
-msgstr ""
+msgstr "Corectat"
msgid "Fixed burndown chart"
msgstr "Graficul burndown fix"
@@ -16340,16 +16598,16 @@ msgid "FloC|Federated Learning of Cohorts"
msgstr "Federated Learning of Cohorts"
msgid "FlowdockService|Enter your Flowdock token."
-msgstr ""
+msgstr "Introduceți tokenul Flowdock."
msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows."
-msgstr ""
+msgstr "Trimiteți notificări de evenimente din GitLab la fluxurile Flowdock."
msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows. %{docs_link}"
-msgstr ""
+msgstr "Trimiteți notificări de evenimente din GitLab la fluxurile Flowdock. %{docs_link}"
msgid "Focus filter bar"
-msgstr ""
+msgstr "Focalizare bară filtru"
msgid "FogBugz Email"
msgstr "E-mail FogBugz"
@@ -16367,16 +16625,16 @@ msgid "FogBugz import"
msgstr "Import FogBugz"
msgid "Fogbugz|Fogbugz import failed due to an error: %{error}"
-msgstr ""
+msgstr "Importul Fogbugz a eșuat din cauza unei erori: %{error}"
msgid "Fogbugz|Project %{repo} could not be found"
-msgstr ""
+msgstr "Proiectul %{repo} nu a putut fi găsit"
msgid "Folder/%{name}"
-msgstr ""
+msgstr "Dosar/%{name}"
msgid "Follow"
-msgstr ""
+msgstr "Urmăriți"
msgid "Followed Users' Activity"
msgstr "Activitatea utilizatorilor urmăriți"
@@ -16385,58 +16643,55 @@ msgid "Followed users"
msgstr "Utilizatori urmăriți"
msgid "Font Color"
-msgstr ""
+msgstr "Culoarea fontului"
msgid "Footer message"
-msgstr ""
+msgstr "Mesajul de subsol"
msgid "For a faster browsing experience, some files are collapsed by default."
msgstr "Pentru o experiență de navigare mai rapidă, unele fișiere sunt restrânse în mod implicit."
msgid "For additional information, review your %{link_to} or contact your group owner."
-msgstr ""
+msgstr "Pentru informații suplimentare, verificați %{link_to} sau contactați proprietarul grupului dumneavoastră."
msgid "For additional information, review your group membership: %{link_to} or contact your group owner."
-msgstr ""
+msgstr "Pentru informații suplimentare, verificați-vă statutul de membru al grupului: %{link_to} sau contactați proprietarul grupului."
msgid "For each job, clone the repository."
-msgstr ""
+msgstr "Pentru fiecare job, clonați repozitoriul."
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
-msgstr ""
+msgstr "Pentru fiecare job, reutilizați spațiul de lucru al proiectului. Dacă spațiul de lucru nu există, utilizați %{code_open}git clone%{code_close}."
msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
+msgstr "De exemplu, aplicația care utilizează tokenul sau scopul său. Nu furnizați informații sensibile pentru numele tokenului, deoarece acesta va fi vizibil pentru toți membrii %{resource_type}."
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "Pentru fișiere mai mari decât această limită, indexați numai numele fișierului. Conținutul fișierului nu este nici indexat, nici nu poate fi căutat."
msgid "For general work"
-msgstr ""
+msgstr "Pentru lucrări generale"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
-msgstr ""
+msgstr "Pentru utilizare personală, creați un cont separat cu adresa dvs. de e-mail personală, cont care să nu fie legat de domeniul sau grupul de e-mail Enterprise."
msgid "For investigating IT service disruptions or outages"
-msgstr ""
+msgstr "Pentru investigarea întreruperilor sau indisponibilităților serviciilor IT"
msgid "For more info, read the documentation."
-msgstr ""
+msgstr "Pentru mai multe informații, consultați documentația."
msgid "For more information on how the number of active users is calculated, see the %{self_managed_subscriptions_doc_link} documentation."
msgstr "Pentru mai multe informații despre modul de calculare a numărului de utilizatori activi, consultați %{self_managed_subscriptions_doc_link} documentația."
msgid "For more information, go to the "
-msgstr ""
-
-msgid "For more information, see the %{faq_link}."
-msgstr ""
+msgstr "Pentru mai multe informații, accesați "
msgid "For more information, see the File Hooks documentation."
-msgstr ""
+msgstr "Pentru mai multe informații, consultați documentația Hook-urilor de fișiere"
msgid "Forgot your password?"
-msgstr ""
+msgstr "Ați uitat parola?"
msgid "Fork"
msgstr "Fork"
@@ -16498,8 +16753,8 @@ msgstr "Proiectul poate fi accesat fără nicio autentificare."
msgid "ForkProject|Visibility level"
msgstr "Nivel de vizibilitate"
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
-msgstr "Doriți să găzduiți mai multe proiecte dependente sub același spațiu de nume?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
+msgstr "Doriți să organizați mai multe proiecte dependente sub același spațiu de nume?"
msgid "ForkSuggestion|Cancel"
msgstr "Anulare"
@@ -16523,22 +16778,22 @@ msgid "Forks"
msgstr "Forkuri"
msgid "Format: %{dateFormat}"
-msgstr ""
+msgstr "Format: %{dateFormat}"
msgid "Forward %{package_type} package requests to the %{registry_type} Registry if the packages are not found in the GitLab Package Registry"
-msgstr ""
+msgstr "Redirecționați solicitările de pachete %{package_type} către Registrul %{registry_type} dacă pachetele nu sunt găsite în Registrul de pachete GitLab."
msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr ""
+msgstr "S-au găsit erori în %{gitlab_ci_yml} d-voastră:"
msgid "Found errors in your .gitlab-ci.yml:"
msgstr "S-au găsit erori în fișierul d-voastră .gitlab-ci.yml:"
msgid "Framework successfully deleted"
-msgstr ""
+msgstr "Framework-ul a fost eliminat cu succes"
msgid "Free Trial of GitLab.com Ultimate"
-msgstr ""
+msgstr "Versiune de încercare gratuită a GitLab.com Ultimate"
msgid "Freeze end"
msgstr "Înghețul se termină"
@@ -16547,7 +16802,7 @@ msgid "Freeze start"
msgstr "Înghețul începe"
msgid "Frequency"
-msgstr ""
+msgstr "Frecvență"
msgid "Frequently searched"
msgstr "Căutate frecvent"
@@ -16556,25 +16811,25 @@ msgid "Friday"
msgstr "Vineri"
msgid "From"
-msgstr ""
+msgstr "De la"
msgid "From %{code_open}%{source_title}%{code_close} into"
-msgstr ""
+msgstr "De la %{code_open}%{source_title}%{code_close} în"
msgid "From %{providerTitle}"
-msgstr ""
+msgstr "De la %{providerTitle}"
msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
msgstr "Începând cu 22 iunie 2022 (GitLab 15.1), spațiile de nume personale gratuite și grupurile de nivel superior vor fi limitate la %{free_limit} (de) membri"
msgid "From June 22, 2022 (GitLab 15.1), you can have a maximum of %{free_limit} unique members across all of your personal projects"
-msgstr ""
+msgstr "Începând cu 22 iunie 2022 (GitLab 15.1), puteți avea maxim %{free_limit} membri unici în toate proiectele personale."
msgid "From issue creation until deploy to production"
-msgstr ""
+msgstr "De la crearea problemei până la implementarea în producție"
msgid "From merge request merge until deploy to production"
-msgstr ""
+msgstr "De la îmbinarea merge request-ului până la implementarea în producție"
msgid "Full"
msgstr "Complet"
@@ -16583,49 +16838,49 @@ msgid "Full log"
msgstr "Jurnal complet"
msgid "Full name"
-msgstr ""
+msgstr "Numele complet"
msgid "GCP region configured"
-msgstr ""
+msgstr "Regiunea GCP configurată"
msgid "GPG Key ID:"
-msgstr ""
+msgstr "ID-ul cheii GPG:"
msgid "GPG Keys"
-msgstr ""
+msgstr "Chei GPG"
msgid "GPG keys allow you to verify signed commits."
msgstr "Cheile GPG vă permit să verificați commit-urile semnate."
msgid "GPG signature (loading...)"
-msgstr ""
+msgstr "Semnătura GPG (încărcare…)"
msgid "General"
-msgstr ""
+msgstr "General"
msgid "General Settings"
-msgstr ""
+msgstr "Setări generale"
msgid "General pipelines"
-msgstr ""
+msgstr "Pipeline-uri generale"
msgid "General settings"
msgstr "Setări generale"
msgid "Generate a default set of labels"
-msgstr ""
+msgstr "Generați un set implicit de etichete"
msgid "Generate group access tokens scoped to this group for your applications that need access to the GitLab API."
msgstr "Generați tokenuri de acces de grup cu scopuri specifice acestui grup pentru aplicațiile dvs. care au nevoie de acces la GitLab API."
msgid "Generate new export"
-msgstr ""
+msgstr "Generați un nou export"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "Generați tokenuri de acces de proiect cu scopuri specifice acestui proiect pentru aplicațiile dvs. care au nevoie de acces la GitLab API."
msgid "Generate site and private keys at"
-msgstr ""
+msgstr "Generați site-ul și cheile private la"
msgid "Generic"
msgstr "Generic"
@@ -16634,22 +16889,22 @@ msgid "Generic package file size in bytes"
msgstr "Dimensiunea fișierului pachetului generic în octeți"
msgid "GenericReport|After"
-msgstr ""
+msgstr "După"
msgid "GenericReport|Before"
-msgstr ""
+msgstr "ÃŽnainte"
msgid "GenericReport|Diff"
-msgstr ""
+msgstr "Diff"
msgid "Geo"
msgstr "Geo"
msgid "Geo Replication"
-msgstr ""
+msgstr "Replicarea Geo"
msgid "Geo Settings"
-msgstr ""
+msgstr "Setări Geo"
msgid "Geo Sites"
msgstr "Site-uri Geo"
@@ -16670,7 +16925,7 @@ msgstr[1] "%d fragmente selectate"
msgstr[2] "%d de fragmente selectate"
msgid "Geo|%{boldStart}Not applicable%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
-msgstr ""
+msgstr "%{boldStart}Nu se aplică%{boldEnd}: Geo nu verifică încă această componentă. Consultați %{linkStart}tipurile de date pe care intenționăm să le susținem%{linkEnd}."
msgid "Geo|%{component} synced"
msgstr "%{component} s-a sincronizat"
@@ -16679,7 +16934,7 @@ msgid "Geo|%{component} verified"
msgstr "%{component} s-a verificat"
msgid "Geo|%{label} can't be blank"
-msgstr "%{label} nu poate fi necompletat"
+msgstr "%{label} nu poate fi necompletat(ă)"
msgid "Geo|%{label} should be between 1-999"
msgstr "%{label} trebuie să fie între 1-999"
@@ -16700,13 +16955,13 @@ msgid "Geo|%{title} checksum progress"
msgstr "Progresul sumei de control pentru %{title}"
msgid "Geo|Add New Site"
-msgstr "Adăugați un site nou"
+msgstr "Adăugare site nou"
msgid "Geo|Add site"
-msgstr "Adăugați site"
+msgstr "Adăugare site"
msgid "Geo|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 "Ajustați filtrele/criteriile de căutare de mai sus. Dacă credeți că este vorba de o eroare, consultați documentația %{linkStart}Depanare Geo%{linkEnd} pentru mai multe informații."
+msgstr "Ajustați filtrele/criteriile de căutare de mai sus. în cazul în care credeți că este vorba de o eroare, consultați documentația %{linkStart}Depanare Geo%{linkEnd} pentru mai multe informații."
msgid "Geo|All"
msgstr "Toate"
@@ -16730,7 +16985,7 @@ msgid "Geo|Allowed Geo IP"
msgstr "IP Geo permis"
msgid "Geo|Allowed Geo IP can't be blank"
-msgstr "Geo IP permis nu poate fi necompletat"
+msgstr "IP-ul Geo permis nu poate fi necompletat"
msgid "Geo|Allowed Geo IP should be between 1 and 255 characters"
msgstr "IP-ul Geo permis trebuie să aibă între 1 și 255 de caractere"
@@ -16738,9 +16993,6 @@ msgstr "IP-ul Geo permis trebuie să aibă între 1 și 255 de caractere"
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr "IP-ul Geo permis trebuie să conțină adrese IP valide"
-msgid "Geo|Beta"
-msgstr "Beta"
-
msgid "Geo|Checksummed"
msgstr "Verificat cu suma de control"
@@ -16757,7 +17009,7 @@ msgid "Geo|Connection timeout"
msgstr "Timeout de conectare"
msgid "Geo|Connection timeout can't be blank"
-msgstr "Timeout-ul conexiunii nu poate fi necompletat"
+msgstr "Timpul de expirare al conexiunii nu poate fi necompletat"
msgid "Geo|Connection timeout must be a number"
msgstr "Timeout-ul conexiunii trebuie să fie un număr"
@@ -16775,7 +17027,7 @@ msgid "Geo|Could not remove tracking entry for an existing project."
msgstr "Nu s-a putut elimina intrarea de urmărire pentru un proiect existent."
msgid "Geo|Data replication lag"
-msgstr "Lag de replicare a datelor"
+msgstr "Lagul de replicare a datelor"
msgid "Geo|Data type"
msgstr "Tipul de date"
@@ -16817,13 +17069,13 @@ msgid "Geo|Filter by status"
msgstr "Filtrare după stare"
msgid "Geo|Full details"
-msgstr ""
+msgstr "Detalii complete"
msgid "Geo|Geo Settings"
msgstr "Setări Geo"
msgid "Geo|Geo Status"
-msgstr "Stare Geo"
+msgstr "Starea Geo"
msgid "Geo|Geo allows you to choose specific groups or storage shards to replicate."
msgstr "Geo vă permite să alegeți grupuri sau fragmente de stocare specifice pentru replicare."
@@ -16937,23 +17189,17 @@ msgid "Geo|Offline"
msgstr "Offline"
msgid "Geo|Pending synchronization"
-msgstr "Sincronizare în așteptare"
+msgstr "În așteptarea sincronizării"
msgid "Geo|Pending verification"
-msgstr "Verificare în așteptare"
+msgstr "În așteptarea verificării"
msgid "Geo|Primary"
msgstr "Principal"
-msgid "Geo|Primary node"
-msgstr "Nod principal"
-
msgid "Geo|Primary site"
msgstr "Site principal"
-msgid "Geo|Project"
-msgstr "Proiect"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "Proiectul (ID: %{project_id}) nu mai există pe serverul principal. Este sigur să eliminați această intrare, deoarece acest lucru nu va șterge datele de pe disc."
@@ -17021,13 +17267,13 @@ msgid "Geo|Resync all"
msgstr "Resincronizați tot"
msgid "Geo|Resync all %{projects_count} projects"
-msgstr ""
+msgstr "Resincronizați toate cele %{projects_count} (de) proiecte"
msgid "Geo|Resync all %{total}%{replicableType}"
-msgstr ""
+msgstr "Resincronizați toate cele %{total} (de) %{replicableType}"
msgid "Geo|Resync project"
-msgstr ""
+msgstr "Resincronizați proiectul"
msgid "Geo|Retry count"
msgstr "Număr de reîncercări"
@@ -17039,20 +17285,17 @@ msgid "Geo|Reverify all"
msgstr "Reverificați tot"
msgid "Geo|Reverify all %{projects_count} projects"
-msgstr ""
+msgstr "Reverificați toate cele %{projects_count} (de) proiecte"
msgid "Geo|Reverify project"
-msgstr ""
+msgstr "Reverificați proiectul"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
-msgstr "Revizuiți starea replicării, apoi resincronizați și reverificați elementele cu site-ul principal."
+msgstr "Analizați starea replicării și resincronizați și reverificați elementele cu site-ul principal."
msgid "Geo|Secondary"
msgstr "Secundar"
-msgid "Geo|Secondary node"
-msgstr "Nod secundar"
-
msgid "Geo|Secondary site"
msgstr "Site secundar"
@@ -17081,7 +17324,7 @@ msgid "Geo|Shards to synchronize"
msgstr "Fragmente de sincronizat"
msgid "Geo|Show more"
-msgstr ""
+msgstr "Arată mai mult"
msgid "Geo|Site name can't be blank"
msgstr "Numele site-ului nu poate fi necompletat"
@@ -17096,14 +17339,11 @@ msgid "Geo|Status"
msgstr "Stare"
msgid "Geo|Storage config"
-msgstr "Configurația de stocare"
+msgstr "Configurarea stocării"
msgid "Geo|Synced"
msgstr "Sincronizat"
-msgid "Geo|Synced at"
-msgstr "Sincronizat la"
-
msgid "Geo|Synchronization"
msgstr "Sincronizare"
@@ -17171,7 +17411,7 @@ msgid "Geo|Tuning settings"
msgstr "Ajustare de setări"
msgid "Geo|URL can't be blank"
-msgstr "URL nu poate fi necompletat"
+msgstr "URL-ul nu poate fi necompletat"
msgid "Geo|URL must be a valid url (ex: https://gitlab.com)"
msgstr "URL-ul trebuie să fie un URL valid (ex: https://gitlab.com)"
@@ -17231,76 +17471,112 @@ msgid "Geo|secondary"
msgstr "secundar"
msgid "Get a free instance review"
-msgstr ""
+msgstr "Obțineți o revizuire gratuită a instanței"
msgid "Get a free trial"
msgstr "Obțineți o încercare gratuită"
msgid "Get a support subscription"
-msgstr ""
+msgstr "Obțineți un abonament de asistență"
msgid "Get started"
-msgstr ""
+msgstr "Începeți"
msgid "Get started with GitLab"
-msgstr ""
+msgstr "Începeți cu GitLab"
msgid "Get started with error tracking"
-msgstr ""
+msgstr "Începeți cu urmărirea erorilor"
msgid "Get started with performance monitoring"
-msgstr ""
+msgstr "Începeți cu monitorizarea performanței"
msgid "Get started!"
-msgstr ""
+msgstr "Începeți!"
msgid "Getting started with releases"
msgstr "Să începem cu lansările"
msgid "Git"
-msgstr ""
+msgstr "Git"
msgid "Git GC period"
-msgstr ""
+msgstr "Perioada Git GC"
msgid "Git LFS Rate Limits"
-msgstr ""
+msgstr "Limitele ratei Git LFS"
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "Git LFS nu este activat pe acest server GitLab, contactați administratorul dumneavoastră."
msgid "Git LFS objects will be synced if LFS is %{docs_link_start}enabled for the project%{docs_link_end}. Push mirrors will %{strong_open}not%{strong_close} sync LFS objects over SSH."
-msgstr ""
+msgstr "Obiectele Git LFS vor fi sincronizate dacă LFS este %{docs_link_start}activat pentru proiect%{docs_link_end}. Replicile push %{strong_open}nu%{strong_close} vor sincroniza obiectele LFS peste SSH."
msgid "Git LFS status:"
-msgstr ""
+msgstr "Starea Git LFS:"
msgid "Git global setup"
-msgstr ""
+msgstr "Configurație globală Git"
msgid "Git repository URL"
-msgstr ""
+msgstr "URL-ul repozitoriului Git"
msgid "Git revision"
-msgstr ""
+msgstr "Revizuirea Git"
msgid "Git shallow clone"
-msgstr ""
+msgstr "Clona superficială Git"
msgid "Git strategy"
-msgstr ""
+msgstr "Strategia Git"
msgid "Git transfer in progress"
-msgstr ""
+msgstr "Transferul Git în curs"
msgid "Git version"
+msgstr "Versiunea Git"
+
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
msgstr ""
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr "Limita ratei API GitHub a fost depășită. Încercați din nou după %{reset_time}"
msgid "GitHub import"
-msgstr "Importul GitHub"
+msgstr "Import GitHub"
msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
msgstr "*ÃŽmbinat de: %{author} la %{timestamp}*"
@@ -17309,25 +17585,28 @@ msgid "GitLab"
msgstr "GitLab"
msgid "GitLab (self-managed)"
-msgstr ""
+msgstr "GitLab (autogestionat)"
msgid "GitLab / Unsubscribe"
-msgstr ""
+msgstr "GitLab / Dezabonare"
msgid "GitLab API"
-msgstr ""
+msgstr "API GitLab"
msgid "GitLab Account Request"
-msgstr ""
+msgstr "Solicitare de cont GitLab"
msgid "GitLab Billing Team."
-msgstr ""
+msgstr "Echipa de facturare GitLab."
+
+msgid "GitLab Error Tracking"
+msgstr "Urmărirea erorilor GitLab"
msgid "GitLab Import"
-msgstr ""
+msgstr "Import GitLab"
msgid "GitLab Issue"
-msgstr ""
+msgstr "Problema GitLab"
msgid "GitLab KAS"
msgstr "GitLab KAS"
@@ -17336,22 +17615,22 @@ msgid "GitLab Pages"
msgstr "GitLab Pages"
msgid "GitLab Shell"
-msgstr ""
+msgstr "GitLab Shell"
msgid "GitLab Support Bot"
-msgstr ""
+msgstr "Bot de asistență GitLab"
msgid "GitLab Team Member"
-msgstr ""
+msgstr "Membru al echipei GitLab"
msgid "GitLab Ultimate trial"
-msgstr "Evaluarea GitLab Ultimate"
+msgstr "Versiunea de încercare GitLab Ultimate"
msgid "GitLab User"
-msgstr ""
+msgstr "Utilizator GitLab"
msgid "GitLab Workhorse"
-msgstr ""
+msgstr "GitLab Workhorse"
msgid "GitLab account request rejected"
msgstr "Solicitarea contului GitLab a fost respinsă"
@@ -17360,16 +17639,16 @@ msgid "GitLab and Google Cloud configuration seems to be incomplete. This probab
msgstr "Configurația GitLab și Google Cloud pare să fie incompletă. Acest lucru poate fi probabil rezolvat de către echipa de administrare GitLab. Puteți partaja aceste jurnale cu ei:"
msgid "GitLab commit"
-msgstr ""
+msgstr "Commit GitLab"
msgid "GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}"
msgstr "Evenimentele GitLab declanșează webhook-uri. Utilizați detaliile de solicitare ale unui webhook pentru a ajuta la depanarea problemelor. %{link_start}Cum pot să rezolv problemele?%{link_end}"
msgid "GitLab export"
-msgstr ""
+msgstr "Export GitLab"
msgid "GitLab for Jira Cloud"
-msgstr ""
+msgstr "GitLab for Jira Cloud"
msgid "GitLab group: %{source_link}"
msgstr "Grup GitLab: %{source_link}"
@@ -17387,13 +17666,13 @@ msgid "GitLab is a single application for the entire software development lifecy
msgstr "GitLab este o singură aplicație pentru întregul ciclu de dezvoltare software. De la planificarea proiectului și gestionarea codului sursă la CI/CD, monitorizare și securitate."
msgid "GitLab is free to use. Many features for larger teams are part of our %{link_start}paid products%{link_end}. You can try Ultimate for free without any obligation or payment details."
-msgstr ""
+msgstr "Utilizarea GitLab este gratuită. Multe caracteristici pentru echipe mai mari fac parte din %{link_start}produsele noastre plătite%{link_end}. Puteți încerca Ultimate gratuit, fără nicio obligație sau detalii de plată."
msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
-msgstr ""
+msgstr "GitLab obține un certificat Let's Encrypt SSL pentru acest domeniu. Acest proces poate dura ceva timp. Vă rugăm să încercați din nou mai târziu."
msgid "GitLab is open source software to collaborate on code."
-msgstr ""
+msgstr "GitLab este un software open source pentru a colabora la cod."
msgid "GitLab is undergoing maintenance"
msgstr "GitLab este în curs de întreținere"
@@ -17402,82 +17681,79 @@ msgid "GitLab logo"
msgstr "Logoul GitLab"
msgid "GitLab metadata URL"
-msgstr ""
+msgstr "URL-ul metadatelor GitLab"
msgid "GitLab project export"
msgstr "Export de proiect GitLab"
msgid "GitLab single sign-on URL"
-msgstr ""
+msgstr "URL-ul de autentificare unică GitLab"
msgid "GitLab username"
msgstr "Nume de utilizator GitLab"
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
-msgstr ""
+msgstr "GitLab folosește %{linkStart}Sidekiq%{linkEnd} pentru a procesa joburile din fundal"
msgid "GitLab version"
-msgstr ""
+msgstr "Versiunea GitLab"
msgid "GitLab will create a branch in your fork and start a merge request."
msgstr "GitLab va crea o ramură în forkul dvs. și va iniția un merge request."
msgid "GitLab.com"
-msgstr ""
+msgstr "GitLab.com"
msgid "GitLab.com (SaaS)"
-msgstr ""
+msgstr "GitLab.com (SaaS)"
msgid "GitLab.com import"
-msgstr ""
+msgstr "Importul GitLab.com"
msgid "GitLabPagesDomains|Retry"
-msgstr ""
+msgstr "Reîncercați"
msgid "GitLabPages|%{domain} is not verified. To learn how to verify ownership, visit your %{link_start}domain details%{link_end}."
-msgstr ""
+msgstr "%{domain} nu este verificat. Pentru a afla cum să verificați proprietatea, vizitați %{link_start}detaliile domeniului%{link_end} dumneavoastră."
msgid "GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information."
-msgstr ""
+msgstr "Controlul accesului este activat pentru acest site web Pages; numai utilizatorii autorizați vor putea să îl acceseze. Pentru a face ca site-ul dvs. să fie disponibil publicului, navigați la %{strong_start}Setări &gt; General &gt; Vizibilitate%{strong_end} și selectați %{strong_start}Toată lumea%{strong_end}, în secțiunea Pages. Citiți %{link_start}documentația%{link_end} pentru mai multe informații."
msgid "GitLabPages|Access pages"
msgstr "Accesare pages"
msgid "GitLabPages|Are you sure?"
-msgstr ""
+msgstr "Sunteți sigur?"
msgid "GitLabPages|Can be overridden per project. For no limit, enter 0. To inherit the value, leave empty."
-msgstr ""
+msgstr "Poate fi suprascrisă pentru fiecare proiect. Pentru nicio limită, introduceți 0. Pentru a moșteni valoarea, lăsați gol."
msgid "GitLabPages|Certificate: %{subject}"
-msgstr ""
+msgstr "Certificat: %{subject}"
msgid "GitLabPages|Configure pages"
msgstr "Configurare pages"
msgid "GitLabPages|Domains"
-msgstr ""
+msgstr "Domenii"
msgid "GitLabPages|Edit"
-msgstr ""
+msgstr "Editare"
msgid "GitLabPages|Expired"
-msgstr ""
+msgstr "Expirat"
msgid "GitLabPages|Force HTTPS (requires valid certificates)"
msgstr "Forțați HTTPS (necesită certificate valide)"
msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable them on your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} page."
-msgstr ""
+msgstr "GitLab Pages este dezactivat pentru acest proiect. Îl puteți activa pe pagina %{strong_start}Setări &gt; General &gt; Vizibilitate%{strong_end} a proiectului."
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "Dimensiunea maximă (MB)"
msgid "GitLabPages|New Domain"
-msgstr ""
+msgstr "Domeniu nou"
msgid "GitLabPages|Only project maintainers can remove pages"
msgstr "Numai întreținătorii proiectului pot elimina pages"
@@ -17486,49 +17762,52 @@ msgid "GitLabPages|Pages"
msgstr "Pages"
msgid "GitLabPages|Remove"
-msgstr ""
+msgstr "Înlăturați"
msgid "GitLabPages|Remove certificate"
-msgstr ""
+msgstr "Înlăturați certificatul"
msgid "GitLabPages|Remove domain"
-msgstr ""
+msgstr "Înlăturați domeniul"
msgid "GitLabPages|Remove pages"
-msgstr "Eliminare pages"
+msgstr "Înlăturați paginile"
msgid "GitLabPages|Removing pages will prevent them from being exposed to the outside world."
-msgstr "Eliminând pages va preveni ca acestea să fie expuse lumii exterioare."
+msgstr "Înlăturarea pages va împiedica expunerea acestora lumii exterioare."
msgid "GitLabPages|Save changes"
msgstr "Salvați modificările"
msgid "GitLabPages|Something went wrong while obtaining the Let's Encrypt certificate for %{domain}. To retry visit your %{link_start}domain details%{link_end}."
-msgstr ""
+msgstr "Ceva nu a funcționat bine la obținerea certificatului Let's Encrypt pentru %{domain}. Pentru a încerca din nou, vizitați %{link_start}detaliile domeniului%{link_end}."
msgid "GitLabPages|Support for domains and certificates is disabled. Ask your system's administrator to enable it."
msgstr "Suportul pentru domenii și certificate este dezactivat. Solicitați administratorului sistemului dvs. să-l activeze."
msgid "GitLabPages|Unverified"
+msgstr "Neconfirmat"
+
+msgid "GitLabPages|Updating your Pages configuration..."
msgstr ""
msgid "GitLabPages|Verified"
-msgstr ""
+msgstr "Verificat"
msgid "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}"
-msgstr ""
+msgstr "Când este activată, toate încercările de a vă vizita site-ul web prin HTTP sunt redirecționate automat către HTTPS utilizând un răspuns cu codul de stare 301. Necesită un certificat valid pentru toate domeniile. %{docs_link_start}Aflați mai multe.%{link_end}"
msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
msgstr "Când utilizați Pages sub domeniul general al unei instanțe GitLab (%{pages_host}), nu puteți utiliza HTTPS cu subdomeniile unor subdomenii. Dacă spațiul de nume sau numele de grup al dvs. conține un punct, nu funcționează. Aceasta este o limitare a protocolului HTTP Over TLS. Paginile HTTP funcționează dacă nu redirecționați HTTP to HTTPS. %{docs_link_start}Aflați mai multe.%{link_end}"
msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Cu GitLab Pages puteți găzdui site-ul dvs. static direct din repozitoriul GitLab. %{docs_link_start}Aflați mai multe.%{link_end}"
msgid "GitLabPages|Your Pages site is not configured yet. See the %{docs_link_start}GitLab Pages documentation%{link_end} to learn how to upload your static site and have GitLab serve it. You can also take some inspiration from the %{samples_link_start}sample Pages projects%{link_end}."
-msgstr ""
+msgstr "Site-ul Pages nu este configurat încă. Consultați %{docs_link_start}documentația GitLab Pages%{link_end} pentru a afla cum să încărcați site-ul static și să solicitați ca GitLab să îl servească. De asemenea, vă puteți inspira din %{samples_link_start}exemplele de proiecte Pages%{link_end}."
msgid "GitLabPages|Your pages are served under:"
-msgstr ""
+msgstr "Site-urile dvs. pages sunt servite sub:"
msgid "Gitaly Servers"
msgstr "Servere Gitaly"
@@ -17546,10 +17825,10 @@ msgid "Gitaly|Address"
msgstr "Adresa"
msgid "Gitea Host URL"
-msgstr ""
+msgstr "URL-ul gazdei Gitea"
msgid "Gitea Import"
-msgstr ""
+msgstr "Import Gitea"
msgid "GithubImporter|PR mergers"
msgstr "Îmbinări de PR"
@@ -17603,7 +17882,7 @@ msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
msgid "Given access %{time_ago}"
-msgstr ""
+msgstr "Accesul acordat %{time_ago}"
msgid "Given epic is already related to this epic."
msgstr "Epica dată este deja legată de această epică."
@@ -17615,11 +17894,17 @@ msgid "Global Shortcuts"
msgstr "Comenzi rapide globale"
msgid "Global notification settings"
-msgstr ""
+msgstr "Setări de notificare globale"
+
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr "%{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "%{count} (de) rezultate implicite furnizate. Utilizați tastele săgeată sus și jos pentru a naviga în lista de rezultate ale căutării."
+msgid "GlobalSearch|Groups"
+msgstr "Grupuri"
+
msgid "GlobalSearch|Issues I've created"
msgstr "Problemele pe care le-am creat"
@@ -17635,6 +17920,9 @@ msgstr "Merge request-urile care mi-au fost atribuite"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Merge request-uri pentru care sunt un recenzent"
+msgid "GlobalSearch|Projects"
+msgstr "Proiecte"
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "Rezultatele s-au actualizat. %{count} (de) rezultate disponibile. Utilizați tastele săgeată sus și jos pentru a naviga în lista de rezultate ale căutării sau tasta ENTER pentru a trimite."
@@ -17656,38 +17944,44 @@ msgstr "Tastați și apăsați tasta Enter pentru a trimite căutarea."
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr "Tastați pentru ca noile sugestii să apară mai jos."
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr "Utilizați tasta rapidă %{kbdOpen}/%{kbdClose} pentru a iniția o căutare"
+
msgid "GlobalSearch|What are you searching for?"
msgstr "Ce căutați?"
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr "peste tot în GitLab"
-msgid "GlobalSearch|in group"
-msgstr "în grup"
+msgid "GlobalSearch|group"
+msgstr "grup"
+
+msgid "GlobalSearch|in %{scope}"
+msgstr "în %{scope}"
-msgid "GlobalSearch|in project"
-msgstr "în proiect"
+msgid "GlobalSearch|project"
+msgstr "proiect"
msgid "Globally-allowed IP ranges"
-msgstr ""
+msgstr "Intervale IP permise la nivel global"
msgid "Go Back"
-msgstr ""
+msgstr "ÃŽnapoi"
msgid "Go Micro is a framework for micro service development"
-msgstr ""
+msgstr "Go Micro este un framework pentru dezvoltarea de microservicii"
msgid "Go back"
-msgstr ""
+msgstr "ÃŽnapoi"
msgid "Go back (while searching for files)"
-msgstr ""
+msgstr "Înapoi (în timp ce căutați fișiere)"
msgid "Go back to configuration"
msgstr "Mergeți înapoi la configurare"
msgid "Go full screen"
-msgstr ""
+msgstr "Accesare ecran complet"
msgid "Go to %{source_name}"
msgstr "Mergeți la %{source_name}"
@@ -17696,10 +17990,10 @@ msgid "Go to commits"
msgstr "Mergeți la commit-uri"
msgid "Go to definition"
-msgstr ""
+msgstr "Mergeți la definiție"
msgid "Go to environments"
-msgstr ""
+msgstr "Mergeți la medii"
msgid "Go to environments page to approve or reject"
msgstr "Accesați pagina de medii pentru a aproba sau respinge"
@@ -17714,7 +18008,7 @@ msgid "Go to file permalink (while viewing a file)"
msgstr "Accesați fișierul permalink (în timp ce vizualizați un fișier)"
msgid "Go to files"
-msgstr ""
+msgstr "Mergeți la fișiere"
msgid "Go to find file"
msgstr "Mergeți să găsiți fișierul"
@@ -17741,7 +18035,7 @@ msgid "Go to next page"
msgstr "Mergeți la pagina următoare"
msgid "Go to next unresolved thread"
-msgstr ""
+msgstr "Mergeți la următorul subiect nerezolvat"
msgid "Go to page %{page}"
msgstr "Mergeți la pagina %{page}"
@@ -17756,7 +18050,7 @@ msgid "Go to previous page"
msgstr "Mergeți la pagina anterioară"
msgid "Go to previous unresolved thread"
-msgstr ""
+msgstr "Mergeți la subiectul anterior nerezolvat"
msgid "Go to primary site"
msgstr "Mergeți la site-ul principal"
@@ -17765,7 +18059,7 @@ msgid "Go to project"
msgstr "Mergeți la proiect"
msgid "Go to releases"
-msgstr "Accesați lansările"
+msgstr "Mergeți la versiuni"
msgid "Go to repository charts"
msgstr "Mergeți la graficele repozitoriului"
@@ -17777,7 +18071,7 @@ msgid "Go to snippets"
msgstr "Mergeți la fragmente de cod"
msgid "Go to the %{b_open}Activity%{b_close} page for %{project_link}."
-msgstr ""
+msgstr "Mergeți la pagina %{b_open}Activitate%{b_close} pentru %{project_link}."
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
msgstr "MergeÈ›i la „Zona Admin &gt; RestricÈ›ii de înscriere†și bifaÈ›i „Domenii permise pentru înscrieriâ€."
@@ -17807,7 +18101,7 @@ msgid "Go to wiki"
msgstr "Mergeți la wiki"
msgid "Go to your To-Do list"
-msgstr "MergeÈ›i la lista dvs. „De făcutâ€"
+msgstr "Mergeți la lista dvs. De-Făcut"
msgid "Go to your fork"
msgstr "Mergeți la forkul dumneavoastră"
@@ -17879,163 +18173,166 @@ msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invali
msgstr "Revocarea autorizațiilor acordate către GitLab. Acest lucru nu invalidează conturile de servicii."
msgid "Got it"
-msgstr ""
+msgstr "Am înțeles"
msgid "Got it!"
msgstr "Am înțeles!"
msgid "Grafana URL"
-msgstr ""
+msgstr "URL-ul Grafana"
msgid "Grafana response contains invalid json"
-msgstr ""
+msgstr "Răspunsul Grafana conține un json invalid"
msgid "GrafanaIntegration|API token"
-msgstr ""
+msgstr "Token API"
msgid "GrafanaIntegration|Active"
msgstr "Activ"
msgid "GrafanaIntegration|Enter the %{docLinkStart}Grafana API token%{docLinkEnd}."
-msgstr ""
+msgstr "Introduceți %{docLinkStart}tokenul Grafana API%{docLinkEnd}."
msgid "GrafanaIntegration|Enter the base URL of the Grafana instance."
-msgstr ""
+msgstr "Introduceți URL-ul de bază al instanței Grafana."
msgid "GrafanaIntegration|Grafana URL"
-msgstr ""
+msgstr "URL-ul Grafana"
msgid "GrafanaIntegration|Grafana authentication"
-msgstr ""
+msgstr "Autentificarea Grafana"
msgid "GrafanaIntegration|Set up Grafana authentication to embed Grafana panels in GitLab Flavored Markdown."
-msgstr ""
+msgstr "Configurați autentificarea Grafana pentru a încorpora panourile Grafana în GitLab Flavored Markdown."
msgid "Grant access"
-msgstr ""
+msgstr "Permiteți accesul"
msgid "Grant write permissions to this key"
msgstr "Acordați permisiuni în scriere pentru această cheie"
msgid "Graph"
-msgstr ""
+msgstr "Grafic"
msgid "GraphViewType|Job dependencies"
-msgstr ""
+msgstr "Dependențe de job"
msgid "GraphViewType|Show dependencies"
-msgstr ""
+msgstr "Afișați dependențele"
msgid "GraphViewType|Stage"
-msgstr ""
+msgstr "Etapa"
msgid "Graphs"
msgstr "Grafice"
msgid "Gravatar"
-msgstr ""
+msgstr "Gravatar"
msgid "Gravatar enabled"
-msgstr ""
+msgstr "Gravatar activat"
msgid "Group"
-msgstr ""
+msgstr "Grup"
+
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr "Grupul „%{group_name}†a fost actualizat cu succes."
msgid "Group %{group_name} couldn't be exported."
-msgstr ""
+msgstr "Grupul %{group_name} nu a putut fi exportat."
msgid "Group %{group_name} was exported successfully."
-msgstr ""
+msgstr "Grupul %{group_name} a fost exportat cu succes."
msgid "Group %{group_name} was scheduled for deletion."
-msgstr ""
+msgstr "Grupul %{group_name} a fost programat pentru ștergere."
msgid "Group %{group_name} was successfully created."
-msgstr ""
+msgstr "Grupul %{group_name} a fost creat cu succes."
msgid "Group Access Tokens"
msgstr "Tokenuri de acces de grup"
msgid "Group Git LFS status:"
-msgstr ""
+msgstr "Starea grupului Git LFS:"
msgid "Group Hooks"
msgstr "Hook-uri de grup"
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
-msgstr ""
+msgstr "Proprietarul grupului trebuie să se fi conectat cu SAML înainte de a activa conturile gestionate de grup"
msgid "Group SAML must be enabled to test"
msgstr "Grupul SAML trebuie să fie activat pentru a testa"
msgid "Group URL"
-msgstr ""
+msgstr "URL-ul grupului"
msgid "Group access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
msgstr "Crearea de tokenuri de acces de grup este dezactivată pentru acest grup. Puteți utiliza și gestiona în continuare tokenurile existente. %{link_start}Aflați mai multe.%{link_end}"
msgid "Group application: %{name}"
-msgstr ""
+msgstr "Aplicația grupului: %{name}"
msgid "Group applications"
-msgstr ""
+msgstr "Aplicațiile grupului"
msgid "Group audit events"
-msgstr ""
+msgstr "Evenimente de audit de grup"
msgid "Group avatar"
-msgstr ""
+msgstr "Avatarul grupului"
msgid "Group by"
-msgstr ""
+msgstr "Grupați după"
msgid "Group description (optional)"
msgstr "Descrierea grupului (opțional)"
msgid "Group export could not be started."
-msgstr ""
+msgstr "Exportul grupului nu a putut fi inițiat."
msgid "Group export download requests"
-msgstr "Solicitări descărcare export grup"
+msgstr "Solicitări de descărcare de export de grup"
msgid "Group export error"
-msgstr ""
+msgstr "Eroare la exportul grupului"
msgid "Group export link has expired. Please generate a new export from your group settings."
-msgstr ""
+msgstr "Linkul de export al grupului a expirat. Vă rugăm să generați un nou export din setările grupului dvs."
msgid "Group export requests"
-msgstr "Solicitări export grup"
+msgstr "Solicitări de export de grup"
msgid "Group export started. A download link will be sent by email and made available on this page."
-msgstr ""
+msgstr "A început exportul grupului. Un link de descărcare va fi trimis prin e-mail și va fi disponibil pe această pagină."
msgid "Group has been already marked for deletion"
msgstr "Acest grup a fost deja marcat pentru ștergere"
msgid "Group has not been marked for deletion"
-msgstr ""
+msgstr "Grupul nu a fost marcat pentru ștergere"
msgid "Group import could not be scheduled"
-msgstr ""
+msgstr "Importul de grup nu a putut fi programat"
msgid "Group import requests"
-msgstr "Solicitări import grup"
+msgstr "Solicitări de import de grup"
msgid "Group info:"
-msgstr ""
+msgstr "Info grup:"
msgid "Group information"
-msgstr ""
+msgstr "Informații despre grup"
msgid "Group is required when cluster_type is :group"
-msgstr ""
+msgstr "Grupul este necesar atunci când cluster_type este: group"
msgid "Group jobs by"
msgstr "Grupați joburile după"
msgid "Group members"
-msgstr ""
+msgstr "Membrii grupului"
msgid "Group membership expiration date changed"
msgstr "Data expirării apartenenței la grup s-a modificat"
@@ -18044,37 +18341,37 @@ msgid "Group membership expiration date removed"
msgstr "Data de expirare a apartenenței la grup eliminată"
msgid "Group milestone"
-msgstr ""
+msgstr "Obiectiv de grup"
msgid "Group name"
-msgstr ""
+msgstr "Numele grupului"
msgid "Group name (your organization)"
-msgstr ""
+msgstr "Numele grupului (organizația dvs.)"
msgid "Group navigation"
-msgstr ""
+msgstr "Navigare în grup"
msgid "Group overview content"
-msgstr ""
+msgstr "Conținutul general al grupului"
msgid "Group owners can register group runners in the %{link}"
msgstr "Proprietarii grupului pot înregistra executorii de grup în %{link}"
msgid "Group path is already taken. We've suggested one that is available."
-msgstr ""
+msgstr "Calea grupului este deja luată. Vă sugerăm una care este disponibilă."
msgid "Group path is available."
-msgstr ""
+msgstr "Calea grupului este disponibilă."
msgid "Group pipeline minutes were successfully reset."
-msgstr ""
+msgstr "Minutele de pipeline de grup au fost resetate cu succes."
msgid "Group project URLs are prefixed with the group namespace"
msgstr "URL-urile proiectelor de grup sunt prefixate cu spațiul de nume al grupului"
msgid "Group requires separate account"
-msgstr ""
+msgstr "Grupul necesită un cont separat"
msgid "Group runners"
msgstr "Executori de grup"
@@ -18083,28 +18380,31 @@ msgid "Group runners can be managed with the %{link}."
msgstr "Executorii de grup pot fi gestionați cu %{link}."
msgid "Group variables (inherited)"
-msgstr ""
+msgstr "Variabile de grup (moștenite)"
msgid "Group was exported"
-msgstr ""
+msgstr "Grupul dvs. a fost exportat"
msgid "Group was successfully updated."
-msgstr ""
+msgstr "Grupul s-a actualizat cu succes."
msgid "Group wikis"
msgstr "Wiki de grup"
+msgid "Group-level wiki is disabled."
+msgstr "Wiki-ul la nivel de grup este dezactivat."
+
msgid "Group: %{group_name}"
-msgstr ""
+msgstr "Grup: %{group_name}"
msgid "Group: %{name}"
-msgstr ""
+msgstr "Grup: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr "Probleme create"
-msgid "GroupActivityMetrics|Last 90 days"
-msgstr "Ultimele 90 de zile"
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr "Ultimele 30 de zile"
msgid "GroupActivityMetrics|Members added"
msgstr "Membri adăugați"
@@ -18119,7 +18419,7 @@ msgid "GroupImport|Failed to import group."
msgstr "Nu s-a reușit importarea grupului."
msgid "GroupImport|Group '%{group_name}' is being imported."
-msgstr "Grupul \"%{group_name}\" este în curs de import."
+msgstr "Grupul „%{group_name}†este în curs de import."
msgid "GroupImport|Group could not be imported: %{errors}"
msgstr "Grupul nu a putut fi importat: %{errors}"
@@ -18155,7 +18455,7 @@ msgid "GroupRoadmap|No start date – %{dateWord}"
msgstr "Fără dată de început – %{dateWord}"
msgid "GroupRoadmap|Something went wrong while fetching epics"
-msgstr "Ceva nu a mers bine în timpul recuperării epicelor"
+msgstr "Ceva nu a mers bine în timpul preluării epicelor"
msgid "GroupRoadmap|Something went wrong while fetching milestones"
msgstr "Ceva nu a mers bine în timpul preluării reperelor"
@@ -18188,7 +18488,7 @@ msgid "GroupRoadmap|Within 3 years"
msgstr "ÃŽn decurs de 3 ani"
msgid "GroupSAML|\"persistent\" recommended"
-msgstr "recomandat „persistentâ€"
+msgstr "„persistent†este recomandat"
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enable %{linkStart}SSO enforcement%{linkEnd} to reduce security risks."
msgstr "%{strongOpen}Avertisment%{strongClose} - Activați %{linkStart}aplicarea SSO%{linkEnd} pentru a reduce riscurile de securitate."
@@ -18227,7 +18527,7 @@ msgid "GroupSAML|Could not create SAML group link: %{errors}."
msgstr "Nu s-a putut crea linkul grupului SAML: %{errors}."
msgid "GroupSAML|Default membership role"
-msgstr "Rolul implicit al unui membru"
+msgstr "Rolul implicit al membrului"
msgid "GroupSAML|Enable SAML authentication for this group"
msgstr "Activați autentificarea SAML pentru acest grup"
@@ -18248,7 +18548,7 @@ msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Id
msgstr "Generați un token SCIM pentru a vă configura sistemul de gestionare a identității între domenii."
msgid "GroupSAML|Identifier"
-msgstr ""
+msgstr "Identificator"
msgid "GroupSAML|Identity provider single sign-on URL"
msgstr "URL-ul de autentificare unică (SSO) al furnizorului de identitate"
@@ -18320,7 +18620,7 @@ msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token aga
msgstr "Tokenul SCIM este acum ascuns. Pentru a vedea din nou valoarea tokenului, trebuie să %{linkStart}îl resetați%{linkEnd}."
msgid "GroupSAML|The case-sensitive group name that will be sent by the SAML identity provider."
-msgstr "Numele grupului sensibil la majuscule și minuscule care va fi trimis de furnizorul de identitate SAML."
+msgstr "Numele de grup sensibil la majuscule și minuscule, care va fi trimis de către furnizorul de identitate SAML."
msgid "GroupSAML|This will be set as the access level of users added to the group."
msgstr "Acesta va fi setat ca nivelul de acces al utilizatorilor adăugați la grup."
@@ -18365,16 +18665,10 @@ msgid "GroupSelect|No matching results"
msgstr "Nicio potrivire de rezultate"
msgid "GroupSelect|Search groups"
-msgstr ""
+msgstr "Căutați grupuri"
msgid "GroupSelect|Select a group"
-msgstr ""
-
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr "Permiteți crearea de tokenuri de acces pentru proiect și grup"
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr "Permiteți crearea de organizații și contacte și asocierea acestora cu probleme."
+msgstr "Selectați un grup"
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr "Se aplică tuturor subgrupurilor, cu excepția cazului în care este înlocuită de proprietarul grupului. Grupurile deja adăugate la proiect își pierd accesul."
@@ -18382,6 +18676,9 @@ msgstr "Se aplică tuturor subgrupurilor, cu excepția cazului în care este în
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Pipeline-ul Auto DevOps a fost actualizat pentru grup"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr "Interziceți automat utilizatorii care descarcă mai mult decât numărul specificat de proiecte în intervalul specificat."
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr "Este disponibil numai pentru grupul de nivel superior. Se aplică la toate subgrupurile. Grupurile deja partajate cu un grup din afara %{group} sunt în continuare partajate, doar dacă nu sunt eliminate manual."
@@ -18412,26 +18709,26 @@ msgstr "Configurați framework-urile de conformitate pentru a le face disponibil
msgid "GroupSettings|Custom project templates"
msgstr "Șabloane de proiect personalizate"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr "Relațiile cu clienții sunt activate"
+
msgid "GroupSettings|Customize this group's badges."
msgstr "Personalizați insignele acestui grup."
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "Setări implicite pentru pipeline-ul Auto DevOps la toate proiectele din acest grup"
-msgid "GroupSettings|Disable email notifications"
-msgstr "Dezactivați notificările prin e-mail"
+msgid "GroupSettings|Email notifications are disabled"
+msgstr "Notificările prin e-mail sunt dezactivate"
-msgid "GroupSettings|Disable group mentions"
-msgstr "Dezactivați mențiunile de grup"
-
-msgid "GroupSettings|Enable customer relations"
-msgstr "Activați relațiile cu clienții"
+msgid "GroupSettings|Export group"
+msgstr "Export de grup"
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr "Activați ștergerea întârziată a proiectului"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
+msgstr "Membrii grupului nu sunt notificați în cazul în care grupul este menționat."
-msgid "GroupSettings|Export group"
-msgstr "Exportați grupul"
+msgid "GroupSettings|Group mentions are disabled"
+msgstr "Mențiunile de grup sunt dezactivate"
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
msgstr "Dacă nu este specificată la nivel de grup sau de instanță, valoarea implicită este %{default_initial_branch_name}. Nu afectează repozitoriile existente."
@@ -18439,6 +18736,18 @@ msgstr "Dacă nu este specificată la nivel de grup sau de instanță, valoarea
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr "Dacă vizibilitatea grupului părinte este mai mică decât vizibilitatea curentă a grupului, nivelele de vizibilitate pentru subgrupuri și proiecte vor fi modificate pentru a corespunde vizibilității noului grup părinte."
+msgid "GroupSettings|Interval (seconds)"
+msgstr "Interval (secunde)"
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr "Membrii nu pot invita grupuri din afara grupului %{group} și a subgrupurilor sale"
+
+msgid "GroupSettings|Number of projects"
+msgstr "Numărul de proiecte"
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr "Organizațiile și contactele pot fi create și asociate cu probleme."
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "Ignoră preferințele de notificare ale utilizatorilor pentru toți membrii grupului, subgrupurilor și proiectelor."
@@ -18454,23 +18763,14 @@ msgstr "Împiedicați forkingul în afara grupului"
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr "Setarea prevenirii forkingului nu a fost salvată"
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
-msgstr "Împiedicați membrii să trimită invitații către grupuri din afara %{group} și a subgrupurilor sale"
-
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "Împiedicați partajarea unui proiect din %{group} cu alte grupuri"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr "Împiedică membrii grupului să fie notificați dacă grupul este menționat."
-
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
-msgstr "Proiectele vor fi șterse definitiv după o perioadă de așteptare de %{waiting_period} (de) zi(le). Moștenit de subgrupuri."
+msgid "GroupSettings|Project download rate limit"
+msgstr "Limita ratei de descărcare a proiectelor"
-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 "Proiectele vor fi șterse definitiv după o perioadă de așteptare de %{waiting_period} (de) zi(le). Această întârziere poate fi %{link_start}personalizată de un administrator%{link_end} în setările instanței. Moștenit de subgrupuri."
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr "Proiectele din %{group} nu pot fi partajate cu alte grupuri"
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
-msgstr "Selectați un proiect cu fișierul %{code_start}.gitlab/insights.yml%{code_end}."
+msgid "GroupSettings|Reporting"
+msgstr "Raportare"
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr "Selectați un subgrup care să fie utilizat ca sursă pentru șabloanele de proiect personalizate pentru acest grup."
@@ -18478,18 +18778,27 @@ msgstr "Selectați un subgrup care să fie utilizat ca sursă pentru șabloanele
msgid "GroupSettings|Select parent group"
msgstr "Selectați grupul părinte"
-msgid "GroupSettings|Select the project that contains your custom Insights file."
-msgstr "Selectați proiectul care conține fișierul Insights personalizat."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr "Selectați proiectul care conține fișierul %{code_start}.gitlab/insights.yml%{code_end}"
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
+msgstr "Selectați proiectul care conține fișierul dvs. Insights personalizat. %{help_link_start}Ce este Insights?%{help_link_end}"
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Setați o dimensiune limită pentru tot conținutul din fiecare site Pages din acest grup. %{link_start}Aflați mai multe.%{link_end}"
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr "Setați numele și protecțiile inițiale pentru ramura implicită a noilor repozitorii create în grup."
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr "Setați la 0 pentru a dezactiva limitarea."
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr "Pipeline-ul Auto DevOps se execută dacă nu se găsește niciun fișier de configurare CI alternativ."
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+msgstr "Numărul maxim de proiecte unice pe care un utilizator le poate descărca în intervalul specificat înainte de a fi interzis. Setați la 0 pentru a dezactiva limitarea."
+
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 "Proiectele din acest subgrup pot fi selectate ca șabloane pentru proiecte noi create în grup. %{link_start}Aflați mai multe.%{link_end}"
@@ -18506,22 +18815,22 @@ msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share proj
msgstr "Această setare se aplicată pe %{ancestor_group}. Pentru a partaja proiectele din acest grup cu un alt grup, solicitați proprietarului să anuleze această setare sau %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr "Această setare este aplicată pe %{ancestor_group}. Puteți să anula setarea sau %{remove_ancestor_share_with_group_lock}."
+msgstr "Această setare se aplică pe %{ancestor_group}. Puteți anula această setare sau %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|Transfer group"
msgstr "Transferați grupul"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr "Utilizatorii pot crea %{link_start_project}tokenuri de acces la proiect%{link_end} și %{link_start_group}tokenuri de acces la grup%{link_end} în acest grup."
msgid "GroupSettings|What are badges?"
msgstr "Ce sunt insignele?"
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals."
-msgstr "Atunci când numărul de utilizatori activi depășește acest număr, utilizatorii suplimentari trebuie să fie %{user_cap_docs_link_start}aprobați de un proprietar%{user_cap_docs_link_end}. Lăsați gol dacă nu doriți să impuneți aprobări."
+msgstr "Atunci când numărul de utilizatori activi depășește acest număr, utilizatorii suplimentari trebuie să fie %{user_cap_docs_link_start}aprobați de un proprietar%{user_cap_docs_link_end}. Lăsați necompletat dacă nu doriți să impuneți aprobări."
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals. Increasing the user cap will not automatically approve pending users."
-msgstr "Atunci când numărul de utilizatori activi depășește acest număr, utilizatorii suplimentari trebuie să fie %{user_cap_docs_link_start}aprobați de un proprietar%{user_cap_docs_link_end}. Lăsați gol dacă nu doriți să impuneți aprobări. Prin creșterea plafonului de utilizatori nu se aprobă automat utilizatorii în așteptare."
+msgstr "Atunci când numărul de utilizatori activi depășește acest număr, utilizatorii suplimentari trebuie să fie %{user_cap_docs_link_start}aprobați de un proprietar%{user_cap_docs_link_end}. Lăsați necompletat dacă nu doriți să impuneți aprobări. Prin creșterea plafonului de utilizatori nu se aprobă automat utilizatorii în așteptare."
msgid "GroupSettings|You can only transfer the group to a group you manage."
msgstr "Puteți transfera grupul doar într-un grup pe care îl gestionați."
@@ -18545,16 +18854,16 @@ msgid "Groups"
msgstr "Grupuri"
msgid "Groups (%{count})"
-msgstr ""
+msgstr "Grupuri (%{count})"
msgid "Groups and projects"
-msgstr ""
+msgstr "Grupuri și proiecte"
msgid "Groups are a great way to organize projects and people."
-msgstr ""
+msgstr "Grupurile sunt o modalitate excelentă de a organiza proiecte și persoane."
msgid "Groups are the best way to manage projects and members."
-msgstr ""
+msgstr "Grupurile sunt cel mai bun mod de a gestiona proiectele și membrii."
msgid "GroupsDropdown|Frequently visited"
msgstr "Frecvent vizitate"
@@ -18581,13 +18890,13 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Un grup este o colecție de mai multe proiecte."
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "Creați un nou proiect"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "Creați un nou subgrup"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
-msgstr ""
+msgstr "Grupurile sunt cel mai bun mod de a gestiona mai multe proiecte și membri."
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Dacă vă organizați proiectele în cadrul unui grup, acesta funcționează ca un dosar."
@@ -18596,16 +18905,16 @@ msgid "GroupsEmptyState|No groups found"
msgstr "Nu s-au găsit grupuri"
msgid "GroupsEmptyState|No subgroups or projects."
-msgstr ""
+msgstr "Nu există subgrupuri sau proiecte."
msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
-msgstr ""
+msgstr "Proiectele sunt locul în care vă puteți stoca propriul cod, puteți accesa problemele, wiki și alte caracteristici ale Gitlab."
msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
msgstr "Puteți gestiona permisiunile și accesul membrilor grupului dvs. la fiecare proiect din grup."
msgid "GroupsEmptyState|You do not have necessary permissions to create a subgroup or project in this group. Please contact an owner of this group to create a new subgroup or project."
-msgstr ""
+msgstr "Nu aveți permisiunile necesare pentru a crea un subgrup sau un proiect în acest grup. Vă rugăm să contactați un proprietar al acestui grup pentru a crea un nou subgrup sau proiect."
msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
msgstr "%{linkStart}Grupurile%{linkEnd} vă permit să gestionați și să colaborați în cadrul mai multor proiecte. Membrii unui grup au acces la toate proiectele sale."
@@ -18617,7 +18926,7 @@ msgid "GroupsNew|Connect instance"
msgstr "Conectați instanța"
msgid "GroupsNew|Contact an administrator to enable options for importing your group."
-msgstr "Contactați un administrator pentru a activa opțiunile de import al grupului dumneavoastră."
+msgstr "Contactați un administrator pentru a activa opțiunile de import ale grupului dumneavoastră."
msgid "GroupsNew|Create group"
msgstr "Creați un grup"
@@ -18635,7 +18944,7 @@ msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{li
msgstr "Grupurile pot fi, de asemenea, imbricate prin crearea de %{linkStart}subgrupuri%{linkEnd}."
msgid "GroupsNew|Import a group and related data from another GitLab instance."
-msgstr ""
+msgstr "Importați un grup și datele asociate dintr-o altă instanță GitLab."
msgid "GroupsNew|Import group"
msgstr "Importați grupul"
@@ -18643,9 +18952,6 @@ msgstr "Importați grupul"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Importați grupuri dintr-o altă instanță GitLab"
-msgid "GroupsNew|My Awesome Group"
-msgstr "Grupul meu minunat"
-
msgid "GroupsNew|No import options available"
msgstr "Nu sunt disponibile opțiuni de import"
@@ -18653,7 +18959,7 @@ msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More in
msgstr "Nu toate obiectele asociate sunt migrate. %{docs_link_start}Mai multe informații%{docs_link_end}."
msgid "GroupsNew|Personal access token"
-msgstr "Token de acces personal"
+msgstr "Tokenul de acces personal"
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "Vă rugăm să completați URL-ul sursei GitLab."
@@ -18665,7 +18971,7 @@ msgid "GroupsNew|Provide credentials for another instance of GitLab to import yo
msgstr "Furnizați acreditările unei alte instanțe de GitLab pentru a vă importa grupurile direct."
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
-msgstr "Această caracteristică este depășită și este înlocuită de %{docs_link_start}migrarea grupurilor%{docs_link_end}."
+msgstr "Această caracteristică este depășită și este înlocuită cu %{docs_link_start}migrarea grupurilor%{docs_link_end}."
msgid "GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here."
msgstr "Pentru a importa un grup, navigați la setările de grup pentru instanța sursă GitLab, %{link_start}generați un fișier de export%{link_end} și încărcați-l aici."
@@ -18710,58 +19016,58 @@ msgid "Groups|Avatar will be removed. Are you sure?"
msgstr "Avatarul va fi eliminat. Sunteți sigur?"
msgid "Groups|Changing group URL can have unintended side effects."
-msgstr ""
+msgstr "Schimbarea URL-ului grupului poate avea efecte secundare neintenționate."
msgid "Groups|Checking group URL availability..."
-msgstr ""
+msgstr "Verificarea disponibilității URL-ului grupului..."
msgid "Groups|Enter a descriptive name for your group."
-msgstr ""
+msgstr "Introduceți un nume descriptiv pentru grupul dumneavoastră."
msgid "Groups|Group ID"
-msgstr ""
+msgstr "ID-ul grupului"
msgid "Groups|Group URL"
-msgstr ""
+msgstr "URL-ul grupului"
msgid "Groups|Group avatar"
-msgstr ""
+msgstr "Avatarul grupului"
msgid "Groups|Group description (optional)"
msgstr "Descrierea grupului (opțional)"
msgid "Groups|Group name"
-msgstr ""
+msgstr "Numele grupului"
msgid "Groups|Group path is available."
-msgstr ""
+msgstr "Calea grupului este disponibilă."
msgid "Groups|Group path is unavailable. Path has been replaced with a suggested available path."
-msgstr ""
+msgstr "Calea grupului nu este disponibilă. Calea a fost înlocuită cu o cale disponibilă sugerată."
msgid "Groups|Learn more"
-msgstr ""
+msgstr "Aflați mai multe"
msgid "Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses."
-msgstr ""
+msgstr "Trebuie să înceapă cu o literă, o cifră, un emoji sau un caracter de subliniere. Poate conține, de asemenea, puncte, liniuțe, spații și paranteze."
msgid "Groups|Remove avatar"
-msgstr ""
+msgstr "Înlăturați avatarul"
msgid "Groups|Save changes"
msgstr "Salvați modificările"
msgid "Guideline"
-msgstr ""
+msgstr "Ghid"
msgid "HAR (HTTP Archive)"
-msgstr ""
+msgstr "HAR (arhivă HTTP)"
msgid "HAR file path or URL"
-msgstr "Traiectoria fișierului HAR sau URL-ul"
+msgstr "Calea sau URL-ul fișierului HAR"
msgid "HTTP Archive (HAR)"
-msgstr ""
+msgstr "Arhiva HTTP (HAR)"
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr "HTTP Basic: Acces refuzat\\n Trebuie să folosiți un token de acces personal cu domeniul „api†pentru Git over HTTP.\\n Puteți genera unul la %{profile_personal_access_tokens_url}"
@@ -18776,7 +19082,7 @@ msgid "HarborIntegration|Base URL of the Harbor instance."
msgstr "URL-ul de bază al instanței Harbor."
msgid "HarborIntegration|Enter new Harbor password"
-msgstr ""
+msgstr "Introduceți noua parolă Harbor"
msgid "HarborIntegration|Harbor URL"
msgstr "URL Harbor"
@@ -18791,7 +19097,7 @@ msgid "HarborIntegration|Harbor username"
msgstr "Numele de utilizator Harbor"
msgid "HarborIntegration|Leave blank to use your current password."
-msgstr ""
+msgstr "Lăsați gol pentru a utiliza parola curentă."
msgid "HarborIntegration|Password for your Harbor username."
msgstr "Parola pentru numele dvs. de utilizator Harbor."
@@ -18827,7 +19133,7 @@ msgid "HarborRegistry|Harbor connection error"
msgstr "Eroare de conectare la Harbor"
msgid "HarborRegistry|Invalid tag: missing manifest digest"
-msgstr "Etichetă invalidă: lipsește digestul manifestului"
+msgstr "Etichetă nevalidă: lipsește digestul manifestului"
msgid "HarborRegistry|Last updated %{time}"
msgstr "Ultima actualizare %{time}"
@@ -18875,13 +19181,13 @@ msgid "HarborRegistry|With the Harbor Registry, every project can have its own s
msgstr "Cu Registrul Harbor, fiecare proiect poate avea propriul său spațiu pentru a stoca imagini. %{docLinkStart}Mai multe informații%{docLinkEnd}"
msgid "Hashed Storage must be enabled to use Geo"
-msgstr ""
+msgstr "Stocarea hash trebuie să fie activată pentru a utiliza Geo"
msgid "Hashed repository storage paths"
-msgstr ""
+msgstr "Căile de stocare ale repozitoriilor hash"
msgid "Hashed storage can't be disabled anymore for new projects"
-msgstr ""
+msgstr "Stocarea hash nu mai poate fi dezactivată pentru proiectele noi"
msgid "Have a quick chat with us about your experience."
msgstr "Vă invităm să discutați cu noi pe scurt despre experiența dumneavoastră."
@@ -18899,7 +19205,7 @@ msgid "Header logo will be removed. Are you sure?"
msgstr "Logoul antetului va fi înlăturat. Sunteți sigur?"
msgid "Header message"
-msgstr ""
+msgstr "Mesaj de antet"
msgid "HeaderAction|incident"
msgstr "incident"
@@ -18911,16 +19217,16 @@ msgid "Headers"
msgstr "Antete"
msgid "Heading 1"
-msgstr ""
+msgstr "Titlu 1"
msgid "Heading 2"
-msgstr ""
+msgstr "Titlu 2"
msgid "Heading 3"
-msgstr ""
+msgstr "Titlu 3"
msgid "Heading 4"
-msgstr ""
+msgstr "Titlul 4"
msgid "Health"
msgstr "Sănătate"
@@ -18929,10 +19235,10 @@ msgid "Health Check"
msgstr "Verificarea de sănătate"
msgid "Health information can be retrieved from the following endpoints. More information is available"
-msgstr ""
+msgstr "Informațiile despre sănătate pot fi preluate din următoarele puncte finale. Sunt disponibile mai multe informații"
msgid "Health status"
-msgstr ""
+msgstr "Stare de sănătate"
msgid "Health status cannot be edited because this issue is closed"
msgstr "Starea de sănătate nu poate fi editată deoarece această problemă este închisă"
@@ -18950,13 +19256,13 @@ msgid "HealthCheck|Unhealthy"
msgstr "Nesănătos"
msgid "Hello %{name},"
-msgstr ""
+msgstr "Salut %{name},"
msgid "Hello, %{name}!"
-msgstr ""
+msgstr "Salut, %{name}!"
msgid "Hello, %{username}!"
-msgstr ""
+msgstr "Salut, %{username}!"
msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
msgstr "%{handshake_emoji} Contribuiți la GitLab: %{contribute_link}"
@@ -18974,22 +19280,22 @@ msgid "HelloMessage|Welcome to GitLab!"
msgstr "Bine ați venit la GitLab!"
msgid "Help"
-msgstr ""
+msgstr "Ajutor"
msgid "Help translate GitLab into your language"
-msgstr ""
+msgstr "Ajutați la traducerea GitLab în limba dvs."
msgid "Helps prevent bots from brute-force attacks."
msgstr "Ajută la împiedicarea atacurilor prin forță brută de către boți."
msgid "Helps prevent bots from creating accounts."
-msgstr ""
+msgstr "Ajută la prevenirea creării de conturi de către boți."
msgid "Helps prevent bots from creating accounts. %{link_start}How do I configure it?%{link_end}"
msgstr "Ajută la prevenirea creării de conturi de către roboți. %{link_start}Cum îl configurez?%{link_end}"
msgid "Helps prevent bots from creating issues."
-msgstr ""
+msgstr "Ajută la prevenirea creării de probleme de către boți."
msgid "Helps prevent malicious users hide their activity."
msgstr "Ajută la prevenirea utilizatorilor rău intenționați să-și ascundă activitatea."
@@ -19001,55 +19307,55 @@ msgid "Helps reduce request volume for protected paths."
msgstr "Ajută la reducerea volumului de solicitări pentru căile protejate."
msgid "Hi %{username}!"
-msgstr ""
+msgstr "Bună %{username}!"
msgid "Hi %{username},"
-msgstr ""
+msgstr "Bună, %{username},"
msgid "Hidden"
msgstr "Ascuns"
msgid "Hide"
-msgstr ""
+msgstr "Ascunde"
msgid "Hide Live Preview"
-msgstr ""
+msgstr "Ascundeți previzualizarea în direct"
msgid "Hide archived projects"
msgstr "Ascundeți proiectele arhivate"
msgid "Hide chart"
msgid_plural "Hide charts"
-msgstr[0] "Ascunde graficul"
-msgstr[1] "Ascunde graficele"
-msgstr[2] "Ascunde graficele"
+msgstr[0] "Ascundeți graficul"
+msgstr[1] "Ascundeți graficele"
+msgstr[2] "Ascundeți graficele"
msgid "Hide comments on this file"
-msgstr ""
+msgstr "Ascundeți comentariile la acest fișier"
msgid "Hide details"
-msgstr ""
+msgstr "Ascundeți detaliile"
msgid "Hide file browser"
-msgstr ""
+msgstr "Ascundeți browserul de fișiere"
msgid "Hide group projects"
-msgstr ""
+msgstr "Ascundeți proiectele grupului"
msgid "Hide host keys manual input"
-msgstr ""
+msgstr "Ascundeți introducerea manuală a cheilor gazdei"
msgid "Hide list"
-msgstr ""
+msgstr "Ascundeți lista"
msgid "Hide marketing-related entries from the Help page"
-msgstr "Ascundeți intrările legate de marketing din pagina de Ajutor"
+msgstr "Ascundeți intrările legate de marketing de pe pagina de Ajutor"
msgid "Hide payload"
msgstr "Ascundere payload"
msgid "Hide shared projects"
-msgstr ""
+msgstr "Ascundeți proiectele partajate"
msgid "Hide thread"
msgstr "Ascundeți subiectul"
@@ -19064,7 +19370,7 @@ msgstr[1] "Ascundeți valorile"
msgstr[2] "Ascundeți valorile"
msgid "Hide values"
-msgstr ""
+msgstr "Ascundeți valorile"
msgid "Hierarchy|Current structure"
msgstr "Structura actuală"
@@ -19094,19 +19400,19 @@ msgid "Hierarchy|You can start using these items now."
msgstr "Puteți începe să folosiți aceste elemente acum."
msgid "High or unknown vulnerabilities present"
-msgstr ""
+msgstr "Vulnerabilități ridicate sau necunoscute prezente"
msgid "Highest role:"
-msgstr ""
+msgstr "Cel mai înalt rol:"
msgid "HighlightBar|Alert events:"
-msgstr ""
+msgstr "Evenimente de alertă:"
msgid "HighlightBar|Alert start time:"
-msgstr ""
+msgstr "Ora de începere a alertei:"
msgid "HighlightBar|Original alert:"
-msgstr ""
+msgstr "Alerta originală:"
msgid "HighlightBar|Time to SLA:"
msgstr "Timp până la SLA:"
@@ -19115,13 +19421,13 @@ msgid "History"
msgstr "Istoric"
msgid "History of authentications"
-msgstr ""
+msgstr "Istoricul autentificărilor"
msgid "Holder name:"
msgstr "Numele titularului:"
msgid "Home page URL"
-msgstr ""
+msgstr "URL-ul paginii de start"
msgid "Homepage"
msgstr "Pagina de start"
@@ -19129,29 +19435,26 @@ msgstr "Pagina de start"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr "Executarea hook-ului a eșuat. Asigurați-vă ca grupul să aibă un proiect cu commit-uri."
-msgid "Hook was successfully created."
-msgstr ""
-
msgid "Hook was successfully updated."
-msgstr ""
+msgstr "Hook-ul a fost actualizat cu succes."
+
+msgid "Horizontal rule"
+msgstr "Regula orizontală"
msgid "Hostname"
-msgstr ""
+msgstr "Numele de gazdă"
msgid "Hostname used in private commit emails. %{learn_more}"
-msgstr "Hostname utilizat în e-mailuri comitere private. %{learn_more}"
+msgstr "Numele de gazdă utilizat în e-mailurile de commit private. %{learn_more}"
msgid "Hour (UTC)"
-msgstr ""
-
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr "Găzduiți-vă fișierele, planificați-vă munca, colaborați la cod și multe altele."
+msgstr "Ora (UTC)"
msgid "Housekeeping"
-msgstr ""
+msgstr "Menaj"
msgid "Housekeeping successfully started"
-msgstr ""
+msgstr "Menajul a început cu succes"
msgid "How do I configure Akismet?"
msgstr "Cum pot configura Akismet?"
@@ -19160,22 +19463,22 @@ msgid "How do I configure runners?"
msgstr "Cum să configurez executorii?"
msgid "How do I configure this integration?"
-msgstr ""
+msgstr "Cum pot configura această integrare?"
msgid "How do I generate it?"
-msgstr ""
+msgstr "Cum o pot genera?"
msgid "How do I mirror repositories?"
-msgstr ""
+msgstr "Cum pot replica repozitoriile?"
msgid "How do I rename an environment?"
-msgstr ""
+msgstr "Cum pot redenumi un mediu?"
msgid "How do I set up a Google Chat webhook?"
msgstr "Cum se configurează un webhook Google Chat?"
msgid "How do I set up this service?"
-msgstr ""
+msgstr "Cum pot configura acest serviciu?"
msgid "How do I use a web terminal?"
msgstr "Cum se utilizează un terminal web?"
@@ -19187,16 +19490,16 @@ msgid "How many seconds an IP counts toward the IP address limit."
msgstr "Câte secunde contează un IP pentru limita de adrese IP."
msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
-msgstr ""
+msgstr "Modul în care limitatorul de joburi gestionează joburile care depășesc pragurile specificate mai jos. Modul „urmărire†înregistrează doar joburile. Modul „comprimare†comprimă joburile și generează o excepție în cazul în care dimensiunea comprimată depășește limita."
msgid "I accept the %{terms_link}"
-msgstr ""
+msgstr "Accept %{terms_link}"
msgid "I forgot my password"
-msgstr ""
+msgstr "Am uitat parola"
msgid "I want to explore GitLab to see if it’s worth switching to"
-msgstr "Vreau să explorez GitLab pentru a vedea dacă merită să fac schimbarea"
+msgstr "Vreau să explorez GitLab pentru a vedea dacă merită să trec la"
msgid "I want to learn the basics of Git"
msgstr "Vreau să învăț elementele de bază ale Git"
@@ -19211,7 +19514,7 @@ msgid "I want to use GitLab CI with my existing repository"
msgstr "Vreau să folosesc GitLab CI cu repozitoriul meu existent"
msgid "I'd like to receive updates about GitLab via email"
-msgstr ""
+msgstr "Aș dori să primesc actualizări despre GitLab prin e-mail"
msgid "I'm signing up for GitLab because:"
msgstr "Mă înscriu la GitLab pentru că:"
@@ -19220,7 +19523,7 @@ msgid "ID"
msgstr "ID"
msgid "ID:"
-msgstr ""
+msgstr "ID:"
msgid "IDE"
msgstr "IDE"
@@ -19268,13 +19571,13 @@ msgid "IDE|This option is disabled because you don't have write permissions for
msgstr "Această opțiune este dezactivată deoarece nu aveți permisiuni de scriere pentru ramura curentă."
msgid "INFO: Your SSH key has expired. Please generate a new key."
-msgstr ""
+msgstr "INFO: Cheia dvs. SSH a expirat. Vă rugăm să generați o cheie nouă."
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
-msgstr ""
+msgstr "INFO: Cheia dvs. SSH expiră în curând. Vă rugăm să generați o nouă cheie."
msgid "IP Address"
-msgstr ""
+msgstr "Adresa IP"
msgid "IP address expiration time"
msgstr "Timpul de expirare a adresei IP"
@@ -19286,37 +19589,88 @@ msgid "IP addresses per user"
msgstr "Adrese IP pe utilizator"
msgid "IP subnet restriction only allowed for top-level groups"
-msgstr ""
+msgstr "Restricția de subrețea IP este permisă numai pentru grupurile de nivel superior"
msgid "Id"
msgstr "ID"
msgid "Identifier"
-msgstr ""
+msgstr "Identificator"
msgid "Identifiers"
-msgstr ""
+msgstr "Identificatori"
msgid "Identities"
-msgstr ""
+msgstr "Identități"
msgid "IdentityVerification|Before you create your first project, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
-msgstr ""
+msgstr "Înainte de a crea primul dvs. proiect, avem nevoie să vă verificați identitatea cu o metodă de plată validă. Nu veți fi taxat în această etapă. Dacă va fi nevoie să vă taxăm vreodată, vă vom anunța."
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
-msgstr ""
+msgstr "Înainte de a vă crea grupul, avem nevoie să vă verificați identitatea cu o metodă de plată validă. Nu veți fi taxat în această etapă. Dacă va trebui să vă taxăm vreodată, vă vom anunța."
+
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr "Înainte de a vă autentifica, trebuie să vă verificăm identitatea. Introduceți următorul cod pe pagina de conectare."
msgid "IdentityVerification|Create a project"
-msgstr ""
+msgstr "Creați un proiect"
+
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr "Pentru mai multă siguranță, va trebui să vă verificați identitatea. V-am trimis un cod de verificare la %{email}."
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr "Ajutați-ne să vă protejăm contul"
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr "Dacă nu ați încercat recent să vă conectați la GitLab, vă recomandăm să %{password_link_start}vă schimbați parola%{link_end} și să %{two_fa_link_start}configurați Autentificarea cu doi factori%{link_end} pentru a vă păstra contul în siguranță. Codul dvs. de verificare expiră după %{expires_in_minutes} (de) minute."
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr "Dacă nu ați încercat recent să vă conectați la GitLab, vă recomandăm să vă schimbați parola (%{password_link}) și să configurați Autentificarea cu doi factori (%{two_fa_link}) pentru a vă păstra contul în siguranță."
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr "Dacă ați pierdut accesul la adresa de e-mail asociată acestui cont sau aveți probleme cu codul, %{link_start}există și alte măsuri pe care le puteți lua.%{link_end}"
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr "Numărul maxim de încercări de autentificare a fost depășit. Așteptați %{interval} și încercați din nou."
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr "Vă rugăm să introduceți un cod valid"
+
+msgid "IdentityVerification|Resend code"
+msgstr "Retrimiteți codul"
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr "Codul a expirat. Retrimiteți un nou cod și încercați din nou."
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr "Codul este incorect. Introduceți-l din nou sau retrimiteți un nou cod."
+
+msgid "IdentityVerification|Verification code"
+msgstr "Cod de verificare"
+
+msgid "IdentityVerification|Verification successful"
+msgstr "Verificare reușită"
+
+msgid "IdentityVerification|Verify code"
+msgstr "Verificați codul"
msgid "IdentityVerification|Verify your identity"
-msgstr ""
+msgstr "Verificați-vă identitatea"
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
-msgstr ""
+msgstr "Puteți oricând să vă verificați contul ulterior pentru a crea un grup."
+
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr "Ați atins numărul maxim de încercări. Așteptați %{interval} sau retrimiteți un nou cod și încercați din nou."
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr "Contul dvs. a fost verificat cu succes. Veți fi redirecționat către contul dvs. în câteva momente sau %{redirect_url_start}faceți clic%{redirect_url_end} aici pentru a reîmprospăta."
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr "Codul dvs. de verificare expiră după %{expires_in_minutes} (de) minute."
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
-msgstr ""
+msgstr "Dacă un câmp indexat depășește această limită, acesta este trunchiat la acest număr de caractere. Restul conținutului nu este nici indexat și nici nu poate fi căutat. Acest lucru nu se aplică la indexarea depozitelor și a wiki-urilor. Pentru caractere nelimitate, setați această valoare la 0."
msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
msgstr "Dacă este necompletat, valoarea implicită este %{code_open}Reîncercați mai târziu%{code_close}."
@@ -19325,10 +19679,10 @@ msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as
msgstr "Dacă este necompletat, setează durata de viață permisă la %{instance_level_policy_in_words}, așa cum este definită de administratorul instanței. Odată configurat, tokenurile existente pentru utilizatorii din acest grup pot fi revocate."
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
-msgstr ""
+msgstr "Dacă este bifată, proprietarii de grupuri pot gestiona linkurile de grup LDAP și suprascrierile membrilor LDAP."
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
-msgstr ""
+msgstr "Dacă se bifează această opțiune, se pot adăuga noi membri și permisiuni de grup numai prin intermediul sincronizării LDAP."
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. %{link_start}Learn more.%{link_end}"
msgstr "Dacă este dezactivată, o ramură locală divergentă nu va fi actualizată automat cu commit-urile de la omologul său remote, pentru a preveni pierderea datelor locale. În cazul în care ramura implicită (%{default_branch}) a deviat și nu poate fi actualizată, replicarea va eșua. Alte ramuri divergente sunt ignorate în tăcere. %{link_start}Aflați mai multe.%{link_end}"
@@ -19337,7 +19691,7 @@ msgid "If disabled, only administrators can configure repository mirroring."
msgstr "Dacă este dezactivat, numai administratorii pot configura replicarea repozitoriului."
msgid "If enabled, only protected branches will be mirrored."
-msgstr ""
+msgstr "Dacă este activată, numai ramurile protejate vor fi replicate."
msgid "If no options are selected, only administrators can register runners."
msgstr "Dacă nu este selectată nicio opțiune, numai administratorii pot înregistra executorii."
@@ -19346,28 +19700,28 @@ msgid "If the number of active users exceeds the user limit, you will be charged
msgstr "Dacă numărul de utilizatori activi depășește limita de utilizator, veți fi taxat pentru numărul de %{users_over_license_link} la următoarea reconciliere a licenței."
msgid "If this email was added in error, you can remove it here:"
-msgstr ""
+msgstr "Dacă acest e-mail a fost adăugat din greșeală, îl puteți elimina aici:"
msgid "If this email was added in error, you can remove it here: %{profile_emails_url}"
-msgstr "Dacă acest e-mail a fost adăugat din greșeală, îl puteți elimina aici: %{profile_emails_url}"
+msgstr "Dacă acest e-mail a fost adăugat din greșeală, îl puteți înlătura aici: %{profile_emails_url}"
msgid "If this is a mistake, you can %{link_start}unban them%{link_end}."
-msgstr ""
+msgstr "Dacă este vorba de o greșeală, puteți să %{link_start}îi deblocați%{link_end}."
msgid "If this is a mistake, you can unban them: %{url}."
-msgstr ""
+msgstr "Dacă aceasta este o greșeală, îi puteți debloca: %{url}."
msgid "If this was a mistake you can %{leave_link_start}leave the %{source_type}%{link_end}."
-msgstr ""
+msgstr "Dacă aceasta a fost o greșeală, puteți %{leave_link_start} părăsi %{source_type} %{link_end}."
msgid "If this was a mistake you can leave the %{source_type}."
-msgstr ""
+msgstr "Dacă aceasta a fost o greșeală, puteți părăsi %{source_type}."
msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
msgstr "Dacă folosiți GitHub, veți vedea pe GitHub stările pipeline-ului pentru commit-urile și solicitările de pull. %{more_info_link}"
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
-msgstr ""
+msgstr "Dacă adăugați %{codeStart}needs%{codeEnd} la joburile din pipeline-ul dvs., veți putea vizualiza relațiile %{codeStart}needs%{codeEnd} între joburi în această filă sub forma unui %{linkStart}Grafic Aciclic Direcționat (DAG)%{linkEnd}."
msgid "If you are added to a project, it will be displayed here."
msgstr "Dacă sunteți adăugat la un proiect, acesta va fi afișat aici."
@@ -19379,28 +19733,28 @@ msgid "If you did not initiate this change, please contact your administrator im
msgstr "Dacă nu ați inițiat această modificare, vă rugăm să vă contactați imediat administratorul."
msgid "If you did not perform this request, you can safely ignore this email."
-msgstr ""
+msgstr "Dacă nu ați efectuat această solicitare, puteți ignora în siguranță acest e-mail."
msgid "If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}."
-msgstr ""
+msgstr "Dacă nu v-ați autentificat recent, trebuie să vă %{password_link_start}schimbați parola%{password_link_end} imediat."
msgid "If you did not recently sign in, you should immediately change your password: %{password_link}."
-msgstr ""
+msgstr "Dacă nu v-ați conectat recent, ar trebui să vă schimbați imediat parola: %{password_link}."
msgid "If you get a lot of false alarms from repository checks, you can clear all repository check information from the database."
msgstr "Dacă primiți o mulțime de alarme false din verificările repozitoriului, puteți șterge toate informațiile verificării repozitoriului din baza de date."
msgid "If you lose your recovery codes you can generate new ones, invalidating all previous codes."
-msgstr ""
+msgstr "Dacă vă pierdeți codurile de recuperare, puteți genera altele noi, invalidând toate codurile anterioare."
msgid "If you recently signed in and recognize the IP address, you may disregard this email."
-msgstr ""
+msgstr "Dacă v-ați conectat recent și recunoașteți adresa IP, puteți ignora acest e-mail."
msgid "If you want to re-enable two-factor authentication, visit %{two_factor_link}"
-msgstr ""
+msgstr "Dacă doriți să reactivați autentificarea cu doi factori, vizitați %{two_factor_link}"
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
-msgstr ""
+msgstr "Dacă doriți să reactivați autentificarea cu doi factori, accesați pagina %{settings_link_to}"
msgid "If you want to remove this email address, visit %{profile_link}"
msgstr "Dacă doriți să înlăturați această adresă de e-mail, vizitați %{profile_link}"
@@ -19412,16 +19766,16 @@ msgid "If you've purchased or renewed your subscription and have an activation c
msgstr "Dacă ați achiziționat sau ați reînnoit abonamentul și aveți un cod de activare, vă rugăm să-l introduceți mai jos pentru a începe procesul de activare."
msgid "If your HTTP repository is not publicly accessible, add your credentials."
-msgstr ""
+msgstr "Dacă repozitoriul dvs. HTTP nu este accesibil publicului, adăugați acreditările."
msgid "Ignore"
-msgstr ""
+msgstr "Ignoră"
msgid "Ignored"
msgstr "Ignorat"
msgid "Image URL"
-msgstr ""
+msgstr "URL-ul imaginii"
msgid "ImageDiffViewer|2-up"
msgstr "2-up"
@@ -19439,7 +19793,7 @@ msgid "ImageViewerDimensions|W"
msgstr "W"
msgid "Images with incorrect dimensions are not resized automatically, and may result in unexpected behavior."
-msgstr ""
+msgstr "Imaginile cu dimensiuni incorecte nu sunt redimensionate automat și pot avea ca rezultat un comportament neașteptat."
msgid "Impersonate"
msgstr "Impersonați"
@@ -19451,22 +19805,22 @@ msgid "Impersonation has been disabled"
msgstr "Impersonarea a fost dezactivată"
msgid "Import"
-msgstr ""
+msgstr "Importați"
msgid "Import %d compatible repository"
msgid_plural "Import %d compatible repositories"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Importați %d repozitoriu compatibil"
+msgstr[1] "Importați %d repozitorii compatibile"
+msgstr[2] "Importați %d de repozitorii compatibile"
msgid "Import %d repository"
msgid_plural "Import %d repositories"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Importați %d repozitoriu"
+msgstr[1] "Importați %d repozitorii"
+msgstr[2] "Importați %d de repozitorii"
msgid "Import CSV"
-msgstr ""
+msgstr "Importați CSV"
msgid "Import Projects from Gitea"
msgstr "Importați proiecte din Gitea"
@@ -19481,37 +19835,37 @@ msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr "Importul a eșuat din cauza unei erori GitHub: %{original} (HTTP %{code})"
msgid "Import from"
-msgstr ""
+msgstr "Importa din"
msgid "Import from Jira"
-msgstr ""
+msgstr "Import din Jira"
msgid "Import group"
-msgstr "Importați grupul"
+msgstr "Import de grup"
msgid "Import group from file"
-msgstr ""
+msgstr "Importați grupul din fișier"
msgid "Import groups"
-msgstr ""
+msgstr "Import de grupuri"
msgid "Import history"
-msgstr "Import de istoric"
+msgstr "Istoricul importului"
msgid "Import in progress"
-msgstr ""
+msgstr "Importul în curs"
msgid "Import in progress. Refresh page to see newly added issues."
msgstr "Import în curs. Reîmprospătați pagina pentru a vedea problemele adăugate recent."
msgid "Import issues"
-msgstr ""
+msgstr "Probleme de import"
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importați mai multe repozitorii prin încărcarea unui fișier manifest."
msgid "Import project"
-msgstr "Importați un proiect"
+msgstr "Import de proiect"
msgid "Import project from"
msgstr "Importați proiectul din"
@@ -19526,7 +19880,7 @@ msgid "Import projects from FogBugz"
msgstr "Importați proiecte din FogBugz"
msgid "Import projects from GitLab.com"
-msgstr "Importați proiecte din GitLab.com"
+msgstr "Importați proiecte de pe GitLab.com"
msgid "Import repositories from Bitbucket Server"
msgstr "Importați repozitoriile de pe serverul Bitbucket"
@@ -19535,16 +19889,16 @@ msgid "Import repositories from GitHub"
msgstr "Importați repozitoriile de la GitHub"
msgid "Import repository"
-msgstr ""
+msgstr "Import de repozitoriu"
msgid "Import requirements"
msgstr "Cerințe de import"
msgid "Import started by: %{importInitiator}"
-msgstr ""
+msgstr "Import inițiat de: %{importInitiator}"
msgid "Import tasks"
-msgstr ""
+msgstr "Import de sarcini"
msgid "Import tasks from Phabricator into issues"
msgstr "Importați sarcini din Phabricator în probleme"
@@ -19565,7 +19919,7 @@ msgid "ImportAProjectModal|Only project members (not group members) are imported
msgstr "Numai membrii proiectului (nu membrii grupului) sunt importați și primesc aceleași permisiuni ca și proiectul din care se face importul."
msgid "ImportAProjectModal|Successfully imported"
-msgstr "Ați importat cu succes"
+msgstr "Importul s-a efectuat cu succes"
msgid "ImportAProjectModal|Unable to import project members"
msgstr "Nu se pot importa membrii proiectului"
@@ -19586,7 +19940,7 @@ msgid "ImportProjects|Error importing repository %{project_safe_import_url} into
msgstr "Eroare la importarea repozitoriului %{project_safe_import_url} în %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
-msgstr "Importați repozitorii"
+msgstr "Import de repozitorii"
msgid "ImportProjects|Importing the project failed"
msgstr "Importul proiectului a eșuat"
@@ -19613,25 +19967,25 @@ msgid "ImportProjects|Update of imported projects with realtime changes failed"
msgstr "Actualizarea proiectelor importate cu modificări în timp real a eșuat"
msgid "Imported requirements"
-msgstr ""
+msgstr "Cerințe importate"
msgid "Importing %d repository"
msgid_plural "Importing %d repositories"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Se importă %d repozitoriu"
+msgstr[1] "Se importă %d repozitorii"
+msgstr[2] "Se importă %d de repozitorii"
msgid "Importing..."
-msgstr ""
+msgstr "Importarea..."
msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
-msgstr ""
+msgstr "Nu există un repozitoriu Git valid la această adresă URL. Dacă depozitul HTTP nu este accesibil publicului, verificați-vă acreditările."
msgid "Improve customer support with Service Desk"
msgstr "Îmbunătățiți asistența pentru clienți cu Service Desk"
msgid "In a seat"
-msgstr ""
+msgstr "Pe un seat"
msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
msgstr "În cazul replicării pull, utilizatorul dvs. va fi autorul tuturor evenimentelor din fluxul de activitate care sunt rezultatul unei actualizări, cum ar fi crearea de ramuri noi sau împingerea de noi commit-uri în ramurile existente."
@@ -19643,13 +19997,13 @@ msgid "In progress"
msgstr "În desfășurare"
msgid "In the background, we're attempting to connect you again."
-msgstr ""
+msgstr "În fundal, încercăm să vă conectăm din nou."
msgid "In this page you will find information about the settings that are used in your current instance."
msgstr "În această pagină veți găsi informații despre setările care sunt utilizate în instanța dvs. curentă."
msgid "In use"
-msgstr ""
+msgstr "ÃŽn uz"
msgid "InProductMarketing|%{organization_name} logo"
msgstr "logoul %{organization_name}"
@@ -19676,7 +20030,7 @@ msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
msgstr "*GitLab*, substantiv: un sinonim pentru echipe eficiente"
msgid "InProductMarketing|...and you can get a free trial of GitLab Ultimate"
-msgstr "...și puteți obține o evaluare gratuită a GitLab Ultimate"
+msgstr "...și puteți obține o versiune de încercare gratuită a GitLab Ultimate"
msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
msgstr "3 moduri de a aprofunda GitLab CI/CD"
@@ -19736,7 +20090,7 @@ msgid "InProductMarketing|Code owners"
msgstr "Proprietarii de coduri"
msgid "InProductMarketing|Code owners and required merge approvals are part of the paid tiers of GitLab. You can start a free 30-day trial of GitLab Ultimate and enable these features in less than 5 minutes with no credit card required."
-msgstr "Proprietarii de coduri și aprobările de îmbinare necesare fac parte din nivelurile plătite ale GitLab. Puteți începe o perioadă de evaluare gratuită de 30 de zile a GitLab Ultimate și puteți activa aceste funcții în mai puțin de 5 minute, fără a fi nevoie de un card de credit."
+msgstr "Proprietarii de coduri și aprobările de îmbinare necesare fac parte din nivelurile plătite ale GitLab. Puteți începe o perioadă de încercare gratuită de 30 de zile a GitLab Ultimate și puteți activa aceste funcții în mai puțin de 5 minute, fără a fi nevoie de un card de credit."
msgid "InProductMarketing|Code review analytics"
msgstr "Analize de revizuire a codului"
@@ -19760,7 +20114,7 @@ msgid "InProductMarketing|Create well-defined workflows by using scoped labels o
msgstr "Creați fluxuri de lucru bine definite prin utilizarea etichetelor vizate pe probleme, merge request-uri și epice. Etichetele cu același scop nu pot fi utilizate împreună, ceea ce previne conflictele."
msgid "InProductMarketing|Create your first project!"
-msgstr "Creați primul dvs. proiect!"
+msgstr "Creați-vă primul proiect!"
msgid "InProductMarketing|Define who owns specific files or directories, so the right reviewers are suggested when a merge request introduces changes to those files."
msgstr "Definiți cine deține anumite fișiere sau directoare, astfel încât, atunci când un merge request introduce modificări în aceste fișiere, recenzenții potriviți să fie sugerați."
@@ -19832,10 +20186,10 @@ msgid "InProductMarketing|Find out if your external libraries are safe. Run depe
msgstr "Aflați dacă bibliotecile dvs. externe sunt sigure. Rulați joburi de scanare a dependențelor care verifică vulnerabilitățile cunoscute în bibliotecile dvs. externe."
msgid "InProductMarketing|Follow our steps"
-msgstr "Urmați pașii noștri"
+msgstr "Urmați etapele noastre"
msgid "InProductMarketing|Free 30-day trial"
-msgstr "Încercare gratuită de 30 de zile"
+msgstr "Perioada de încercare gratuită de 30 de zile"
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 "Începeți rapid cu CI/CD folosind propriul nostru %{quick_start_link}. Începeți cu un executor disponibil și apoi creați un fișier CI .yml – este chiar atât de simplu."
@@ -19850,7 +20204,7 @@ msgid "InProductMarketing|Get started today"
msgstr "Începeți astăzi"
msgid "InProductMarketing|Get started today with a 30-day GitLab Ultimate trial, no credit card required."
-msgstr "Începeți astăzi cu o versiune de evaluare GitLab Ultimate de 30 de zile, fără a fi nevoie de un card de credit."
+msgstr "Începeți astăzi cu o perioadă de încercare GitLab Ultimate de 30 de zile, fără a fi nevoie de un card de credit."
msgid "InProductMarketing|Get started with GitLab CI/CD"
msgstr "Demarați cu GitLab CI/CD"
@@ -19898,7 +20252,7 @@ msgid "InProductMarketing|How (and why) mirroring makes sense"
msgstr "Cum (și de ce) replicarea are sens"
msgid "InProductMarketing|How long does it take us to close issues/MRs by types like feature requests, bugs, tech debt, security?"
-msgstr "Cât timp ne ia să închidem problemele/MR-uri în funcție de tipuri, cum ar fi solicitări de funcții, erori, datorii tehnice, securitate?"
+msgstr "Cât timp ne ia să închidem problemele/MR-urile în funcție de tipuri, cum ar fi solicitări de funcții, erori, datorii tehnice, securitate?"
msgid "InProductMarketing|How many days does it take our team to complete various tasks?"
msgstr "Câte zile îi ia echipei noastre pentru a finaliza diverse sarcini?"
@@ -19916,7 +20270,7 @@ msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket an
msgstr "Importați-vă proiectul și codul din GitHub, Bitbucket și altele"
msgid "InProductMarketing|Improve app security with a 30-day trial"
-msgstr "Îmbunătățiți securitatea aplicațiilor cu o perioadă de evaluare de 30 de zile"
+msgstr "Îmbunătățiți securitatea aplicațiilor cu o perioadă de încercare de 30 de zile"
msgid "InProductMarketing|Improve code quality and streamline reviews"
msgstr "Îmbunătățiți calitatea codului și eficientizați revizuirile"
@@ -20030,16 +20384,16 @@ msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one m
msgstr "Începeți astăzi o versiune de încercare GitLab Ultimate în mai puțin de un minut, fără a fi nevoie de un card de credit."
msgid "InProductMarketing|Start a Self-Managed trial"
-msgstr "Începeți o încercare autogestionată"
+msgstr "Începeți o versiune de încercare autogestionată"
msgid "InProductMarketing|Start a free trial"
-msgstr "Începeți o încercare gratuită"
+msgstr "Începeți o perioadă de încercare gratuită"
msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
-msgstr "Începeți o încercare gratuită a GitLab Ultimate – nu este nevoie de card de credit"
+msgstr "Începeți o perioadă de încercare gratuită a GitLab Ultimate – nu este nevoie de card de credit"
msgid "InProductMarketing|Start a trial"
-msgstr "Începeți o evaluare"
+msgstr "Începeți o perioadă de încercare"
msgid "InProductMarketing|Start by %{performance_link}"
msgstr "Începeți cu %{performance_link}"
@@ -20048,10 +20402,10 @@ msgid "InProductMarketing|Start by importing your projects"
msgstr "Începeți cu importul proiectelor dumneavoastră"
msgid "InProductMarketing|Start with a GitLab Ultimate free trial"
-msgstr "Începeți cu o încercare gratuită GitLab Ultimate"
+msgstr "Începeți cu o perioadă de testare gratuită GitLab Ultimate"
msgid "InProductMarketing|Start your trial now!"
-msgstr "Începeți testul acum!"
+msgstr "Începeți perioada de încercare acum!"
msgid "InProductMarketing|Start your trial today to experience single application success and discover all the features of GitLab Ultimate for free!"
msgstr "Începeți perioada dvs. de încercare astăzi pentru a experimenta succesul unei singure aplicații și pentru a descoperi gratuit toate caracteristicile GitLab Ultimate!"
@@ -20072,7 +20426,7 @@ msgid "InProductMarketing|Take your source code management to the next level"
msgstr "Duceți managementul codului sursă la nivelul următor"
msgid "InProductMarketing|Team members collaborating"
-msgstr ""
+msgstr "Membrii echipei care colaborează"
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr "Lucrați în echipă în GitLab pentru o mai mare eficiență"
@@ -20147,7 +20501,7 @@ msgid "InProductMarketing|Visualize your epics and milestones in a timeline."
msgstr "Vizualizați-vă epicele și obiectivele în ordine cronologică."
msgid "InProductMarketing|Want to get your iOS app up and running, including publishing all the way to TestFlight? Follow our guide to set up GitLab and fastlane to publish iOS apps to the App Store."
-msgstr "Doriți să vă puneți în funcțiune aplicația iOS, inclusiv publicarea până la TestFlight? Urmați ghidul nostru pentru a configura GitLab și fastlane pentru a publica aplicații iOS în App Store."
+msgstr "Doriți să vă puneți în funcțiune aplicația iOS, inclusiv publicarea sa până la TestFlight? Urmați ghidul nostru pentru a configura GitLab și fastlane pentru a publica aplicații iOS în App Store."
msgid "InProductMarketing|Want to host GitLab on your servers?"
msgstr "Vreți să găzduiți GitLab pe serverele dumneavoastră?"
@@ -20156,13 +20510,13 @@ msgid "InProductMarketing|Watch iOS building in action."
msgstr "Urmăriți dezvoltarea iOS în acțiune."
msgid "InProductMarketing|We know a thing or two about efficiency and we don't want to keep that to ourselves. Sign up for a free trial of GitLab Ultimate and your teams will be on it from day one."
-msgstr "Știm un lucru sau două despre eficiență și nu vrem să păstrăm acest lucru pentru noi. Înscrieți-vă pentru o versiune de evaluare gratuită a GitLab Ultimate, iar echipele dvs. vor participa din prima zi."
+msgstr "Știm un lucru sau două despre eficiență și nu vrem să păstrăm acest lucru pentru noi. Înscrieți-vă pentru o versiune de încercare gratuită a GitLab Ultimate, iar echipele dvs. îl vor folosi din prima zi."
msgid "InProductMarketing|We want your GitLab experience to be great"
msgstr "Vrem ca experiența dvs. GitLab să fie grozavă"
msgid "InProductMarketing|What does our value stream timeline look like from product to development to review and production?"
-msgstr "Cum arată cronologia propriului value stream, de la produs la dezvoltare la revizuire și producție?"
+msgstr "Cum arată cronologia fluxului nostru de valori, de la produs la dezvoltare, revizuire și producție?"
msgid "InProductMarketing|When your team is on GitLab these answers are a click away."
msgstr "Când echipa dvs. este pe GitLab, aceste răspunsuri sunt la un clic distanță."
@@ -20228,16 +20582,16 @@ msgid "Inactive"
msgstr "Inactiv"
msgid "Incident"
-msgstr ""
+msgstr "Incident"
msgid "Incident Management Limits"
-msgstr ""
+msgstr "Limite de gestionare a incidentelor"
msgid "Incident details"
msgstr "Detalii privind incidentul"
msgid "Incident template (optional)."
-msgstr ""
+msgstr "Șablon de incident (opțional)."
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
msgstr "%{hours} ore, %{minutes} minute rămase"
@@ -20363,7 +20717,7 @@ msgid "IncidentManagement|Unpublished"
msgstr "Nepublicat"
msgid "IncidentManagement|Use escalation policies to automatically page your team when incidents are created."
-msgstr "Utilizați politicile de escaladare pentru a vă contacta automat echipa atunci când sunt create incidente."
+msgstr "Utilizați politicile de escaladare pentru a vă informa automat echipa atunci când sunt create incidente."
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr "ActivaÈ›i contorul de numărătoare inversă „timp până la SLAâ€"
@@ -20408,29 +20762,35 @@ msgid "IncidentSettings|minutes"
msgstr "minute"
msgid "Incidents"
-msgstr ""
+msgstr "Incidente"
msgid "Incidents|Add image details"
-msgstr ""
+msgstr "Adăugați detalii despre imagine"
msgid "Incidents|Add text or a link to display with your image. If you don't add either, the file name displays instead."
-msgstr ""
+msgstr "Adăugați un text sau un link care să fie afișat cu imaginea dvs. Dacă nu adăugați niciunul dintre ele, se afișează în schimb numele fișierului."
msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
-msgstr ""
+msgstr "Plasați sau %{linkStart}încărcați%{linkEnd} o captură de ecran cu metrici pentru a o atașa la incident"
msgid "Incidents|Must start with http or https"
-msgstr ""
+msgstr "Trebuie să înceapă cu http sau https"
msgid "Incident|Add new timeline event"
-msgstr "Adăugați un nou eveniment cronologic"
+msgstr "Adăugare de nou eveniment cronologic"
msgid "Incident|Alert details"
msgstr "Detalii de alertă"
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr "Sunteți sigur că doriți să ștergeți această imagine?"
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr "Ștergeți imaginea"
@@ -20443,12 +20803,30 @@ msgstr "Editați textul imaginii sau linkul"
msgid "Incident|Editing %{filename}"
msgstr "Se editează %{filename}"
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr "Metrici"
msgid "Incident|No timeline items have been added yet."
msgstr "Încă nu au fost adăugate elemente de cronologie."
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr "Ceva nu a mers bine în timpul preluării evenimentelor din cronologia incidentelor."
+
msgid "Incident|Summary"
msgstr "Rezumat"
@@ -20461,6 +20839,12 @@ msgstr "A apărut o problemă la încărcarea datelor incidentului. Vă rugăm s
msgid "Incident|Timeline"
msgstr "Cronologie"
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Includeți numele autorului în corpul e-mailului de notificare"
@@ -20489,43 +20873,43 @@ msgid "Includes an MVC structure, mvnw and pom.xml to help you get started"
msgstr "Include o structură MVC, mvnw și pom.xml pentru a vă ajuta să începeți"
msgid "Incoming email"
-msgstr ""
+msgstr "E-mail primit"
msgid "Incoming!"
-msgstr ""
+msgstr "Sosește!"
msgid "Incompatible options set!"
-msgstr ""
+msgstr "Opțiuni incompatibile setate!"
msgid "Incompatible project"
-msgstr ""
+msgstr "Proiect incompatibil"
msgid "Incomplete"
-msgstr ""
+msgstr "Incomplet"
msgid "Increase"
-msgstr ""
+msgstr "Creștere"
msgid "Index"
-msgstr ""
+msgstr "Index"
msgid "Index all projects"
-msgstr ""
+msgstr "Indexați toate proiectele"
msgid "Index deletion is canceled"
-msgstr ""
+msgstr "Ștergerea indexului este anulată"
msgid "Indicates whether this runner can pick jobs without tags"
msgstr "Indică dacă acest executor poate alege joburi fără etichete"
msgid "Inform users without uploaded SSH keys that they can't push over SSH until one is added"
-msgstr ""
+msgstr "Informați utilizatorii fără chei SSH încărcate că nu pot face push prin SSH până când nu adaugă una."
msgid "Infrastructure"
msgstr "Infrastructură"
msgid "Infrastructure Registry"
-msgstr ""
+msgstr "Registrul de infrastructură"
msgid "Infrastructure as Code (IaC) Scanning"
msgstr "Scanarea infrastructurii ca și cod (IaC)"
@@ -20543,10 +20927,10 @@ msgid "InfrastructureRegistry|For more information on the Terraform registry, %{
msgstr "Pentru mai multe informații despre registrul Terraform, %{linkStart}consultați documentația noastră%{linkEnd}."
msgid "InfrastructureRegistry|Infrastructure Registry"
-msgstr ""
+msgstr "Registrul de infrastructură"
msgid "InfrastructureRegistry|Publish and share your modules. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
+msgstr "Publicați-vă și partajați-vă modulele. %{docLinkStart}Mai multe informații%{docLinkEnd}"
msgid "InfrastructureRegistry|Terraform"
msgstr "Terraform"
@@ -20561,10 +20945,10 @@ msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr "Nu aveți module Terraform în proiectul dumneavoastră"
msgid "Inherited"
-msgstr ""
+msgstr "Moștenit"
msgid "Inherited:"
-msgstr ""
+msgstr "Moștenit:"
msgid "Initial default branch name"
msgstr "Numele inițial implicit al ramurii"
@@ -20573,55 +20957,52 @@ msgid "Initial default branch protection"
msgstr "Protecția inițială implicită a ramurii"
msgid "Inline"
-msgstr ""
+msgstr "Inline"
msgid "Inline math"
msgstr "Matematică inline"
msgid "Input host keys manually"
-msgstr ""
+msgstr "Introduceți manual cheile gazdei"
msgid "Input the remote repository URL"
msgstr "Introduceți URL-ul depozitului remote"
msgid "Insert"
-msgstr "Inserați"
+msgstr "Introduceți"
msgid "Insert a %{rows}x%{cols} table."
-msgstr "Inserați un tabel %{rows}x%{cols}"
-
-msgid "Insert a code block"
-msgstr ""
+msgstr "Introduceți un tabel %{rows}x%{cols}."
msgid "Insert a quote"
-msgstr ""
+msgstr "Introduceți un citat"
msgid "Insert code"
-msgstr ""
+msgstr "Introduceți codul"
msgid "Insert column after"
msgstr "Inserați coloana după"
msgid "Insert column before"
-msgstr ""
+msgstr "Inserați coloana înainte"
msgid "Insert image"
-msgstr ""
+msgstr "Inserați imaginea"
msgid "Insert link"
-msgstr ""
+msgstr "Inserați un link"
msgid "Insert row after"
msgstr "Inserați rândul după"
msgid "Insert row before"
-msgstr ""
+msgstr "Inserați rândul înainte"
msgid "Insert suggestion"
-msgstr ""
+msgstr "Inserați sugestia"
msgid "Insights"
-msgstr ""
+msgstr "Insights"
msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "Unele elemente nu sunt vizibile pentru că proiectul a fost filtrat în fișierul insights.yml (consultați configurația projects.only pentru mai multe informații)."
@@ -20633,25 +21014,25 @@ msgid "Install GitLab Runner and ensure it's running."
msgstr "Instalați GitLab Runner și asigurați-vă că rulează."
msgid "Install on clusters"
-msgstr ""
+msgstr "Instalați pe clustere"
msgid "Installation"
-msgstr ""
+msgstr "Instalare"
msgid "Instance"
msgid_plural "Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Instanță"
+msgstr[1] "Instanțe"
+msgstr[2] "Instanțe"
msgid "Instance Configuration"
-msgstr ""
+msgstr "Configurarea instanței"
msgid "Instance access request"
-msgstr ""
+msgstr "Solicitarea de acces la instanță"
msgid "Instance access request approved"
-msgstr ""
+msgstr "Solicitarea de acces la instanță aprobată"
msgid "Instance access request rejected"
msgstr "Solicitarea accesului la instanță a fost respinsă"
@@ -20660,49 +21041,49 @@ msgid "Instance administrators group already exists"
msgstr "Grupul de administratori de instanțe există deja"
msgid "Instance audit events"
-msgstr ""
+msgstr "Evenimente de audit ale instanței"
msgid "Instance overview"
-msgstr ""
+msgstr "Prezentare generală a instanței"
msgid "Insufficient permissions"
-msgstr ""
+msgstr "Permisiuni insuficiente"
msgid "Insufficient permissions for dast_configuration keyword"
msgstr "Permisiuni insuficiente pentru cuvântul cheie dast_configuration"
msgid "Integration"
-msgstr ""
+msgstr "Integrare"
msgid "Integration Settings"
-msgstr ""
+msgstr "Setări de integrare"
msgid "IntegrationEvents|A comment is added on a confidential issue"
-msgstr ""
+msgstr "Se adaugă un comentariu cu privire la o problemă confidențială"
msgid "IntegrationEvents|A comment is added on an issue"
-msgstr ""
+msgstr "Se adaugă un comentariu la o problemă"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
-msgstr ""
+msgstr "O problemă confidențială este creată, actualizată sau închisă"
msgid "IntegrationEvents|A merge request is created, updated, or merged"
-msgstr ""
+msgstr "Un merge request este creat, actualizat sau fuzionat"
msgid "IntegrationEvents|A pipeline status changes"
-msgstr ""
+msgstr "Se schimbă starea unui pipeline"
msgid "IntegrationEvents|A push is made to the repository"
-msgstr ""
+msgstr "Se face un push în depozit"
msgid "IntegrationEvents|A tag is pushed to the repository"
-msgstr ""
+msgstr "O etichetă este împinsă în repozitoriu"
msgid "IntegrationEvents|A wiki page is created or updated"
-msgstr ""
+msgstr "O pagină wiki este creată sau actualizată"
msgid "IntegrationEvents|An issue is created, updated, or closed"
-msgstr ""
+msgstr "O problemă este creată, actualizată sau închisă"
msgid "Integrations"
msgstr "Integrări"
@@ -20723,7 +21104,7 @@ msgid "Integrations|Add an integration"
msgstr "Adăugați o integrare"
msgid "Integrations|Add namespace"
-msgstr "Adăugați spațiu de nume"
+msgstr "Adăugare spațiu de nume"
msgid "Integrations|All details"
msgstr "Toate detaliile"
@@ -20734,6 +21115,9 @@ msgstr "Toate proiectele care moștenesc aceste setări vor fi, de asemenea, res
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr "A apărut o eroare la încărcarea proiectelor care utilizează setări personalizate."
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr "Un eveniment va fi declanșat atunci când se întâmplă unul dintre următoarele elemente."
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr "Ramurile pentru care urmează să fie trimise notificări"
@@ -20746,11 +21130,14 @@ msgstr "Detaliile comentariului:"
msgid "Integrations|Comment settings:"
msgstr "Setări de comentarii:"
+msgid "Integrations|Configure the scope of notifications."
+msgstr "Configurați domeniul notificărilor."
+
msgid "Integrations|Connection details"
msgstr "Detalii de conectare"
-msgid "Integrations|Connection failed. Please check your settings."
-msgstr "Conexiunea a eșuat. Vă rugăm să verificați setările."
+msgid "Integrations|Connection failed. Check your integration settings."
+msgstr "Conexiunea a eșuat. Verificați setările integrării."
msgid "Integrations|Connection successful."
msgstr "Conexiune reușită."
@@ -20786,10 +21173,10 @@ msgid "Integrations|Failed to link namespace. Please try again."
msgstr "Spațiul de nume n-a putut fi conectat. Vă rugăm să încercați din nou."
msgid "Integrations|Failed to load namespaces. Please try again."
-msgstr "Spațiile de nume nu au putut fi încărcate. Vă rugăm să încercați din nou."
+msgstr "Spațiile de nume n-au putut fi încărcate. Vă rugăm să încercați din nou."
msgid "Integrations|Failed to load subscriptions."
-msgstr ""
+msgstr "Încărcarea abonamentelor nu a reușit."
msgid "Integrations|Failed to sign in to GitLab."
msgstr "Nu s-a reușit conectarea la GitLab."
@@ -20828,10 +21215,10 @@ msgid "Integrations|Link namespaces"
msgstr "Conectați spațiile de nume"
msgid "Integrations|Linked namespaces"
-msgstr "Spații de nume conectate"
+msgstr "Spații de nume legate"
msgid "Integrations|Namespace successfully linked"
-msgstr "Spațiu de nume conectat cu succes"
+msgstr "Spațiu de nume legat cu succes"
msgid "Integrations|Namespaces are the GitLab groups and subgroups you link to this Jira instance."
msgstr "Spațiile de nume sunt grupurile și subgrupurile GitLab pe care le asociați acestei instanțe Jira."
@@ -20840,7 +21227,10 @@ msgid "Integrations|No available namespaces."
msgstr "Niciun spațiu de nume disponibil."
msgid "Integrations|No linked namespaces"
-msgstr "Niciun spațiu de nume conectat."
+msgstr "Niciun spațiu de nume legat"
+
+msgid "Integrations|Notification settings"
+msgstr "Setări de notificare"
msgid "Integrations|Projects using custom settings"
msgstr "Proiecte care utilizează setări personalizate"
@@ -20857,6 +21247,9 @@ msgstr "Resetați integrarea?"
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr "Resetarea acestei integrări va șterge setările și va dezactiva această integrare."
+msgid "Integrations|Restrict to branch (optional)"
+msgstr "Restricționați la ramură (opțional)"
+
msgid "Integrations|Return to GitLab for Jira"
msgstr "ÃŽnapoi la GitLab pentru Jira"
@@ -20902,6 +21295,9 @@ msgstr "Această integrare și proiectele moștenite au fost resetate."
msgid "Integrations|To keep this project going, create a new issue."
msgstr "Pentru a continua acest proiect, creați o nouă problemă."
+msgid "Integrations|Trigger"
+msgstr "Declanșator"
+
msgid "Integrations|Use custom settings"
msgstr "Utilizați setările personalizate"
@@ -20939,10 +21335,10 @@ msgid "Integrations|can't exceed %{recipients_limit}"
msgstr "nu poate depăși %{recipients_limit}"
msgid "IntelliJ IDEA (HTTPS)"
-msgstr ""
+msgstr "IntelliJ IDEA (HTTPS)"
msgid "IntelliJ IDEA (SSH)"
-msgstr ""
+msgstr "IntelliJ IDEA (SSH)"
msgid "Interactive mode"
msgstr "Mod interactiv"
@@ -20951,22 +21347,22 @@ msgid "Interested parties can even contribute by pushing commits if they want to
msgstr "Părțile interesate pot chiar să contribuie făcând push de commit-uri, dacă doresc."
msgid "Internal"
-msgstr ""
+msgstr "Intern"
msgid "Internal - The group and any internal projects can be viewed by any logged in user except external users."
-msgstr ""
+msgstr "Intern - Grupul și orice proiecte interne pot fi vizualizate de orice utilizator conectat, cu excepția utilizatorilor externi."
msgid "Internal - The project can be accessed by any logged in user except external users."
-msgstr ""
+msgstr "Intern - Proiectul poate fi accesat de orice utilizator conectat, cu excepția utilizatorilor externi."
msgid "Internal error occurred while delivering this webhook."
-msgstr ""
+msgstr "S-a produs o eroare internă la livrarea acestui webhook."
msgid "Internal note"
-msgstr ""
+msgstr "Notă internă"
msgid "Internal users"
-msgstr ""
+msgstr "Utilizatori interni"
msgid "Internal users cannot be deactivated"
msgstr "Utilizatorii interni nu pot fi dezactivați"
@@ -20983,72 +21379,63 @@ msgstr "Introdus în GitLab 13.1, înainte de a utiliza %{reindexing_link_start}
msgid "Introducing Your DevOps Reports"
msgstr "Prezentarea rapoartelor dvs. DevOps"
+msgid "Invalid"
+msgstr "Nevalidă"
+
msgid "Invalid Insights config file detected"
-msgstr ""
+msgstr "Fișier de configurare Insights nevalid detectat"
msgid "Invalid OS"
-msgstr ""
+msgstr "OS nevalid"
msgid "Invalid URL"
-msgstr ""
+msgstr "URL nevalid"
msgid "Invalid URL: %{url}"
msgstr "URL invalid: %{url}"
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
-msgstr ""
+msgstr "Dată nevalidă"
msgid "Invalid date format. Please use UTC format as YYYY-MM-DD"
-msgstr ""
+msgstr "Format de dată nevalid. Vă rugăm să utilizați formatul UTC ca AAAA-LL-ZZ"
msgid "Invalid date range"
-msgstr ""
+msgstr "Interval de date nevalid"
msgid "Invalid feature"
-msgstr ""
+msgstr "Caracteristică nevalidă"
msgid "Invalid field"
-msgstr ""
+msgstr "Câmp nevalid"
msgid "Invalid file format with specified file type"
msgstr "Format de fișier nevalid cu tipul de fișier specificat"
msgid "Invalid file."
-msgstr ""
+msgstr "Fișier nevalid."
msgid "Invalid format selected"
msgstr "Format nevalid selectat"
msgid "Invalid hash"
-msgstr ""
+msgstr "Hash nevalid"
msgid "Invalid import params"
-msgstr ""
+msgstr "Parametri de import nevalizi"
msgid "Invalid input, please avoid emojis"
msgstr "Intrare invalidă, vă rugăm să evitați emojiurile"
msgid "Invalid login or password"
-msgstr ""
+msgstr "Autentificare sau parolă nevalidă"
msgid "Invalid period"
-msgstr ""
+msgstr "Perioadă nevalidă"
msgid "Invalid pin code."
msgstr "Cod PIN invalid."
-msgid "Invalid pod_name"
-msgstr "pod_name invalid"
-
msgid "Invalid policy type"
msgstr "Tip de politică invalid"
@@ -21056,28 +21443,25 @@ msgid "Invalid repository bundle for snippet with id %{snippet_id}"
msgstr "Pachet de repozitoriu nevalabil pentru fragmentul cu ID-ul %{snippet_id}"
msgid "Invalid repository path"
-msgstr ""
+msgstr "Cale de repozitoriu nevalidă"
-msgid "Invalid search parameter"
-msgstr ""
+msgid "Invalid rule"
+msgstr "Regulă nevalidă"
msgid "Invalid server response"
-msgstr ""
-
-msgid "Invalid start or end time format"
-msgstr ""
+msgstr "Răspuns nevalid al serverului"
msgid "Invalid status"
-msgstr ""
+msgstr "Stare nevalidă"
msgid "Invalid two-factor code."
-msgstr ""
+msgstr "Cod cu doi factori invalid."
msgid "Invalid yaml"
-msgstr ""
+msgstr "Yaml nevalid"
msgid "Investigate vulnerability: %{title}"
-msgstr ""
+msgstr "Investigați vulnerabilitatea: %{title}"
msgid "Invisible Captcha"
msgstr "Captcha invizibil"
@@ -21086,25 +21470,25 @@ msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a
msgstr "Captcha invizibil ajută la prevenirea creării de conturi spam. Acesta adaugă un câmp „honeypot†și o limită de timp de trimitere a formularului la formularul de înregistrare a contului."
msgid "Invitation"
-msgstr ""
+msgstr "Invitație"
msgid "Invitation declined"
-msgstr ""
+msgstr "Invitația a fost refuzată"
msgid "Invite \"%{email}\" by email"
-msgstr ""
+msgstr "Invitați „%{email}†prin e-mail"
msgid "Invite \"%{trimmed}\" by email"
-msgstr ""
+msgstr "Invitați \"%{trimmed}\" prin e-mail"
msgid "Invite Members"
-msgstr ""
+msgstr "Invitați membri"
msgid "Invite a group"
-msgstr ""
+msgstr "Invitați un grup"
msgid "Invite members"
-msgstr ""
+msgstr "Invitați membri"
msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{project_or_group} as a %{role}"
msgstr "%{inviter} v-a invitat să vă alăturați %{project_or_group_name} %{project_or_group} ca %{role}"
@@ -21116,7 +21500,7 @@ msgid "InviteEmail|%{project_or_group} details"
msgstr "Detaliile despre %{project_or_group}"
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
-msgstr "Grupurile reunesc proiecte înrudite și acordă membrilor acces la mai multe proiecte în același timp."
+msgstr "Grupurile reunesc proiecte asociate și acordă membrilor acces la mai multe proiecte în același timp."
msgid "InviteEmail|Join now"
msgstr "Înscrieți-vă acum"
@@ -21155,7 +21539,7 @@ msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this gr
msgstr "Am observat că nu ați invitat pe nimeni în acest grup. Invitați-vă colegii pentru a putea discuta probleme, colabora la merge request-uri și pentru a vă împărtăși cunoștințele."
msgid "InviteMembersModal| To get more members and access to additional paid features, an owner of this namespace can start a trial or upgrade to a paid tier."
-msgstr ""
+msgstr "Pentru a obține mai mulți membri și acces la caracteristici suplimentare plătite, proprietarul acestui spațiu de nume poate începe o perioadă de evaluare sau poate actualiza la un nivel plătit."
msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
msgstr "%{linkStart}Citiți mai multe%{linkEnd} despre permisiunile rolurilor"
@@ -21179,7 +21563,7 @@ msgid "InviteMembersModal|Create issues for your new team member to work on (opt
msgstr "Creați probleme la care să lucreze noul membru al echipei dumneavoastră (opțional)"
msgid "InviteMembersModal|Explore paid plans"
-msgstr ""
+msgstr "Explorați planurile plătite"
msgid "InviteMembersModal|GitLab is better with colleagues!"
msgstr "GitLab este mai bun împreună cu colegii!"
@@ -21197,11 +21581,14 @@ msgid "InviteMembersModal|Invite members"
msgstr "Invitați membri"
msgid "InviteMembersModal|Manage members"
-msgstr ""
+msgstr "Gestionați membrii"
msgid "InviteMembersModal|Members were successfully added"
msgstr "Membrii au fost adăugați cu succes"
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Căutați un grup pe care să-l invitați"
@@ -21217,29 +21604,35 @@ msgstr "Selectați membrii sau tastați adresele de e-mail"
msgid "InviteMembersModal|Something went wrong"
msgstr "Ceva nu a mers bine"
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
-msgstr ""
+msgstr "Această caracteristică este dezactivată până când acest grup are loc pentru mai mulți membri."
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr "Pentru a atribui probleme unui nou membru al echipei, aveți nevoie de un proiect pentru problemele respective. %{linkStart}Creați un proiect pentru a începe.%{linkEnd}"
msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
-msgstr "Pentru a obține mai mulți membri, un proprietar al acestui namespace poate %{trialLinkStart}începe o perioadă de probă%{trialLinkEnd} sau %{upgradeLinkStart}poate face upgrade%{upgradeLinkEnd} la un nivel plătit."
+msgstr "Pentru a obține mai mulți membri, un proprietar al acestui namespace poate %{trialLinkStart}începe o perioadă de încercare%{trialLinkEnd} sau %{upgradeLinkStart}poate face upgrade%{upgradeLinkEnd} la un nivel plătit."
msgid "InviteMembersModal|To make more space, you can remove members who no longer need access."
-msgstr ""
+msgstr "Pentru a face mai mult spațiu, puteți înlătura membrii care nu mai au nevoie de acces."
msgid "InviteMembersModal|Username or email address"
-msgstr ""
+msgstr "Nume de utilizator sau adresă de e-mail"
msgid "InviteMembersModal|You cannot add more members, but you can remove members who no longer need access."
-msgstr ""
+msgstr "Nu puteți adăuga alți membri, dar puteți înlătura membrii care nu mai au nevoie de acces."
msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
-msgstr "Aveți loc doar pentru încă %{count} %{members} în %{name}"
+msgstr "Mai aveți loc doar pentru încă %{count} %{members} în %{name}"
msgid "InviteMembersModal|You only have space for %{count} more %{members} in your personal projects"
-msgstr ""
+msgstr "Mai aveți loc doar pentru încă %{count} %{members} în proiectele dvs. personale"
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "Invitați un grup la grupul %{strongStart}%{name}%{strongEnd}."
@@ -21257,7 +21650,7 @@ msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{na
msgstr "Ați atins limita de %{count} %{members} pentru %{name}"
msgid "InviteMembersModal|You've reached your %{count} %{members} limit for your personal projects"
-msgstr ""
+msgstr "Ați atins limita de %{count} %{members} pentru proiectele dvs. personale"
msgid "InviteMembers|Invite a group"
msgstr "Invitați un grup"
@@ -21266,67 +21659,70 @@ msgid "InviteMembers|Invite team members"
msgstr "Invitați membrii echipei"
msgid "InviteMember|Add members to this project and start collaborating with your team."
-msgstr ""
+msgstr "Adăugați membri la acest proiect și începeți să colaborați cu echipa dumneavoastră."
msgid "InviteMember|Invite Members (optional)"
-msgstr ""
+msgstr "Invitați membri (opțional)"
msgid "InviteMember|Invite another member"
-msgstr ""
+msgstr "Invitați un alt membru"
msgid "InviteMember|Invite members"
-msgstr ""
+msgstr "Invitați membri"
msgid "InviteMember|Invite your team"
-msgstr ""
+msgstr "Invitați-vă echipa"
msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
msgstr "Utilizatorii invitați vor fi adăugați cu permisiuni la nivel de dezvoltator. %{linkStart}Consultați documentația%{linkEnd} pentru a vedea cum să modificați acest lucru mai târziu."
msgid "InviteReminderEmail|%{inviter} is still waiting for you to join GitLab"
-msgstr ""
+msgstr "%{inviter} încă vă așteaptă să vă alăturați la GitLab"
msgid "InviteReminderEmail|%{inviter} is waiting for you to join GitLab"
-msgstr ""
+msgstr "%{inviter} vă așteaptă să vă alăturați la GitLab"
msgid "InviteReminderEmail|%{inviter} is waiting for you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
-msgstr ""
+msgstr "%{inviter} vă așteaptă să vă alăturați la %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} ca %{role}."
msgid "InviteReminderEmail|%{inviter}'s invitation to GitLab is pending"
-msgstr ""
+msgstr "Invitația la GitLab de la %{inviter} este în așteptare"
msgid "InviteReminderEmail|Accept invitation"
-msgstr ""
+msgstr "Acceptați invitația"
msgid "InviteReminderEmail|Accept invitation: %{invite_url}"
-msgstr ""
+msgstr "Acceptați invitația: %{invite_url}"
msgid "InviteReminderEmail|Decline invitation"
-msgstr ""
+msgstr "Refuzați invitația"
msgid "InviteReminderEmail|Decline invitation: %{decline_url}"
-msgstr ""
+msgstr "Refuzați invitația: %{decline_url}"
msgid "InviteReminderEmail|Hey there %{wave_emoji}"
-msgstr ""
+msgstr "Salut %{wave_emoji}"
msgid "InviteReminderEmail|Hey there!"
-msgstr ""
+msgstr "Salut!"
msgid "InviteReminderEmail|In case you missed it..."
-msgstr ""
+msgstr "În caz că ați ratat-o..."
msgid "InviteReminderEmail|Invitation pending"
-msgstr ""
+msgstr "Invitație în așteptare"
msgid "InviteReminderEmail|It's been %{invitation_age} days since %{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}. What would you like to do?"
-msgstr ""
+msgstr "Au trecut %{invitation_age} (de) zile de când %{inviter} v-a invitat să vă alăturați la %{project_or_group} %{strong_start}%{project_or_group_name}%{strong_end} în calitate de %{role}. Ce ați dori să faceți?"
msgid "InviteReminderEmail|This is a friendly reminder that %{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
-msgstr ""
+msgstr "Acesta este un memento prietenos care vă reamintește că %{inviter} v-a invitat să vă alăturați la %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} ca %{role}."
msgid "Invited"
-msgstr ""
+msgstr "Invitat"
+
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr "Domeniile de e-mail permise ale grupului invitat trebuie să conÈ›ină un subset al domeniilor de e-mail permise ale grupului rădăcină predecesor. AccesaÈ›i pagina „Setări &gt; General†a grupului È™i bifaÈ›i „RestricÈ›ionaÈ›i apartenenÈ›a în funcÈ›ie de domeniul de e-mailâ€."
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr "Canale și utilizatori separați prin spații albe. %{recipients_docs_link}"
@@ -21365,7 +21761,7 @@ msgid "IrkerService|irker daemon port (defaults to 6659)."
msgstr "portul daemonului irker (valoarea implicită este 6659)."
msgid "Is blocked by"
-msgstr ""
+msgstr "Este blocat de"
msgid "Is using license seat:"
msgstr "Folosește seat de licență:"
@@ -21374,28 +21770,28 @@ msgid "Is using seat"
msgstr "Folosește seat"
msgid "IssuableStatus|Closed"
-msgstr ""
+msgstr "Închis(ă)"
msgid "IssuableStatus|Closed (%{link})"
-msgstr ""
+msgstr "Închis(ă) (%{link})"
msgid "IssuableStatus|duplicated"
-msgstr ""
+msgstr "duplicat"
msgid "IssuableStatus|moved"
-msgstr ""
+msgstr "mutat(ă)"
msgid "IssuableStatus|promoted"
-msgstr ""
+msgstr "promovat(ă)"
msgid "Issue"
-msgstr "Problemă"
+msgstr "Problema"
msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}."
-msgstr ""
+msgstr "Problema %{issue_reference} a fost deja adăugată la epica %{epic_reference}."
msgid "Issue Analytics"
-msgstr ""
+msgstr "Analizele problemelor"
msgid "Issue Boards"
msgstr "Borduri de probleme"
@@ -21404,49 +21800,49 @@ msgid "Issue Type"
msgstr "Tip de problemă"
msgid "Issue already promoted to epic."
-msgstr ""
+msgstr "Problema a fost deja promovată la epică."
msgid "Issue cannot be found."
msgstr "Problema nu poate fi găsită."
msgid "Issue created from vulnerability %{vulnerability_link}"
-msgstr ""
+msgstr "Problemă creată din vulnerabilitatea %{vulnerability_link}"
msgid "Issue creation requests"
-msgstr "Cereri de creare problemă"
+msgstr "Solicitări de creare de problemă"
msgid "Issue details"
-msgstr ""
+msgstr "Detaliile problemei"
msgid "Issue events"
-msgstr ""
+msgstr "Evenimente de problemă"
msgid "Issue first deployed to production"
-msgstr ""
+msgstr "Problemă implementată pentru prima dată în producție"
msgid "Issue has been promoted to incident"
msgstr "Problema a fost promovată la incident"
msgid "Issue label"
-msgstr ""
+msgstr "Eticheta problemei"
msgid "Issue or merge request ID is required"
-msgstr ""
+msgstr "Este necesar ID-ul merge request-ului sau al problemei"
msgid "Issue published on status page."
-msgstr ""
+msgstr "Problema a fost publicată pe pagina de stare."
msgid "Issue types"
msgstr "Tipuri de probleme"
msgid "Issue update failed"
-msgstr ""
+msgstr "Actualizarea problemei a eșuat"
msgid "Issue was closed by %{name} %{reason}"
-msgstr ""
+msgstr "Problema a fost închisă de %{name} %{reason}"
msgid "Issue weight"
-msgstr "Greutatea problemei"
+msgstr "Greutate de problemă"
msgid "IssueAnalytics|Age"
msgstr "Vârstă"
@@ -21455,7 +21851,7 @@ msgid "IssueAnalytics|Assignees"
msgstr "Responsabili"
msgid "IssueAnalytics|Created by"
-msgstr "Creat de"
+msgstr "Creat(ă) de"
msgid "IssueAnalytics|Due date"
msgstr "Data scadentă"
@@ -21497,7 +21893,7 @@ msgid "IssueBoards|Switch board"
msgstr "Comutator de bord"
msgid "IssueList|created %{timeAgoString} by %{user}"
-msgstr "creată %{timeAgoString} de %{user}"
+msgstr "creat(ă) %{timeAgoString} de %{user}"
msgid "IssueTracker|Custom issue tracker"
msgstr "Tracker de probleme personalizat"
@@ -21511,15 +21907,9 @@ msgstr "URL-ul noii probleme"
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr "URL-ul pentru crearea unei probleme în trackerul de probleme extern."
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr "URL-ul proiectului în YouTrack."
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr "URL-ul proiectului din trackerul de probleme extern."
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr "URL-ul pentru a vizualiza o problemă în proiectul YouTrack. Trebuie să conțină %{colon_id}."
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr "URL-ul pentru a vizualiza o problemă în trackerul de probleme extern. Trebuie să conțină %{colon_id}."
@@ -21557,10 +21947,10 @@ msgid "Issues"
msgstr "Probleme"
msgid "Issues Rate Limits"
-msgstr ""
+msgstr "Limitele ratei problemelor"
msgid "Issues and merge requests"
-msgstr ""
+msgstr "Probleme și merge request-uri"
msgid "Issues are being rebalanced at the moment, so manual reordering is disabled."
msgstr "În prezent, problemele sunt în curs de reechilibrare, de aceea reordonarea manuală este dezactivată."
@@ -21569,10 +21959,10 @@ msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are sear
msgstr "Problemele pot fi bug-uri, sarcini sau idei care trebuie discutate. De asemenea, problemele pot fi căutate și filtrate."
msgid "Issues closed"
-msgstr ""
+msgstr "Probleme închise"
msgid "Issues exist in projects, so to create an issue, first create a project."
-msgstr ""
+msgstr "Există probleme în proiecte, așa că, pentru a crea o problemă, mai întâi trebuie să creați un proiect."
msgid "Issues must match this scope to appear in this list."
msgstr "Problemele trebuie să corespundă acestui scop pentru a apărea în această listă."
@@ -21581,7 +21971,7 @@ msgid "Issues with comments, merge requests with diffs and comments, labels, mil
msgstr "Probleme cu comentarii, merge request-uri cu diff-uri și comentarii, etichete, obiective, fragmente de cod și alte entități de proiect"
msgid "Issues with label %{label}"
-msgstr ""
+msgstr "Probleme cu eticheta %{label}"
msgid "Issues with no epic assigned"
msgstr "Probleme fără nicio epică atribuită"
@@ -21611,7 +22001,7 @@ msgid "IssuesAnalytics|There are no issues for the projects in your group"
msgstr "Nu există probleme pentru proiectele din grupul dumneavoastră"
msgid "IssuesAnalytics|To widen your search, change or remove filters in the filter bar above"
-msgstr "Pentru a vă lărgi căutarea, schimbați sau eliminați filtrele din bara de filtrare de mai sus"
+msgstr "Pentru a vă lărgi căutarea, modificați sau înlăturați filtrele din bara de filtrare de mai sus"
msgid "IssuesAnalytics|Total:"
msgstr "Total:"
@@ -21620,19 +22010,19 @@ msgid "Issue|Title"
msgstr "Titlu"
msgid "It is not possible to %{action} files that are stored in LFS using the web interface"
-msgstr ""
+msgstr "Nu este posibilă %{action} fișierelor care sunt stocate în LFS utilizând interfața web."
msgid "It looks like you have some draft commits in this branch."
msgstr "Se pare că aveți câteva drafturi de commit-uri în această ramură."
msgid "It looks like you're attempting to activate your subscription. Use %{a_start}the Subscription page%{a_end} instead."
-msgstr ""
+msgstr "Se pare că încercați să vă activați abonamentul. Utilizați în schimb %{a_start}pagina Abonament%{a_end}."
msgid "It may be several days before you see feature usage data."
-msgstr ""
+msgstr "Pot trece câteva zile până când vedeți datele de utilizare a funcției."
msgid "It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected."
-msgstr ""
+msgstr "Acesta trebuie să aibă un rând de antet și cel puțin două coloane: prima coloană este titlul problemei și a doua este descrierea problemei. Separatorul este detectat automat."
msgid "It seems like the Dependency Scanning job ran successfully, but no dependencies have been detected in your project."
msgstr "Se pare că jobul de Scanare a dependențelor a rulat cu succes, dar nu au fost detectate dependențe în proiectul dvs."
@@ -21641,31 +22031,31 @@ msgid "It seems that there is currently no available data for code coverage"
msgstr "Se pare că în prezent nu există date disponibile pentru coverage de cod."
msgid "It's you"
-msgstr ""
+msgstr "Sunteți dvs."
msgid "Italic text"
-msgstr ""
+msgstr "Text italic"
msgid "Iteration"
msgstr "iterație"
msgid "Iteration changed to"
-msgstr ""
+msgstr "Iterația s-a schimbat în"
msgid "Iteration lists not available with your current license"
-msgstr ""
+msgstr "Listele de iterații nu sunt disponibile cu licența dvs. actuală"
msgid "Iteration removed"
-msgstr ""
+msgstr "Iterația înlăturată"
msgid "Iteration updated"
-msgstr ""
+msgstr "Iterația actualizată"
msgid "Iterations"
-msgstr "Iteratii"
+msgstr "Iterații"
msgid "Iterations|Add iteration"
-msgstr "Adăugați iterația"
+msgstr "Adăugare iterație"
msgid "Iterations|All"
msgstr "Toate"
@@ -21677,7 +22067,7 @@ msgid "Iterations|Cadence name"
msgstr "Numele cadenței"
msgid "Iterations|Can be converted"
-msgstr ""
+msgstr "Poate fi convertit(ă)"
msgid "Iterations|Cancel"
msgstr "Anulare"
@@ -21704,7 +22094,7 @@ msgid "Iterations|Description"
msgstr "Descriere"
msgid "Iterations|Done"
-msgstr "Făcut"
+msgstr "Terminat"
msgid "Iterations|Due date"
msgstr "Dată scadentă"
@@ -21725,7 +22115,7 @@ msgid "Iterations|Error loading iteration cadences."
msgstr "Eroare la încărcarea cadențelor de iterație."
msgid "Iterations|First iteration start date"
-msgstr ""
+msgstr "Data de începere a primei iterații"
msgid "Iterations|Iteration cadences"
msgstr "Cadențe de iterație"
@@ -21737,10 +22127,10 @@ msgid "Iterations|Learn more about automatic scheduling"
msgstr "Aflați mai multe despre programarea automată"
msgid "Iterations|Manual management of iterations will be deprecated in GitLab 15.6. Convert your manual cadence to use automated scheduling when you are ready."
-msgstr ""
+msgstr "Gestionarea manuală a iterațiilor va fi eliminată în GitLab 15.6. Convertiți-vă cadența manuală pentru a utiliza programarea automată atunci când sunteți pregătit."
msgid "Iterations|Move incomplete issues to the next iteration."
-msgstr ""
+msgstr "Mutați problemele incomplete la următoarea iterație."
msgid "Iterations|New iteration"
msgstr "Noua iterație"
@@ -21761,13 +22151,13 @@ msgid "Iterations|No iterations in cadence."
msgstr "Nicio iterație în cadență."
msgid "Iterations|No one can change this date after the cadence has begun."
-msgstr ""
+msgstr "Nimeni nu poate schimba această dată după ce a început cadența."
msgid "Iterations|No open iterations."
msgstr "Nicio iterație deschisă."
msgid "Iterations|Number of upcoming iterations that should be scheduled at a time."
-msgstr ""
+msgstr "Numărul de iterații viitoare care ar trebui să fie programate la un moment dat."
msgid "Iterations|Open"
msgstr "Deschise"
@@ -21791,16 +22181,16 @@ msgid "Iterations|Start date"
msgstr "Data de începere"
msgid "Iterations|The duration of each iteration (in weeks)."
-msgstr ""
+msgstr "Durata fiecărei iterații (în săptămâni)."
msgid "Iterations|The iteration has been deleted."
msgstr "Iterația a fost ștearsă."
msgid "Iterations|The start date of the first iteration determines when your cadence begins."
-msgstr ""
+msgstr "Data de începere a primei iterații determină momentul în care începe cadența."
msgid "Iterations|This cadence can be converted to use automated scheduling"
-msgstr ""
+msgstr "Această cadență poate fi convertită pentru a utiliza programarea automată"
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr "Acest lucru va șterge cadența, precum și toate iterațiile din cadrul acesteia."
@@ -21812,7 +22202,7 @@ msgid "Iterations|Title"
msgstr "Titlu"
msgid "Iterations|To convert this cadence to automatic scheduling, add a duration and number of upcoming iterations. The upgrade is irreversible."
-msgstr ""
+msgstr "Pentru a converti această cadență în programare automată, adăugați o durată și un număr de iterații viitoare. Actualizarea este ireversibilă."
msgid "Iterations|Unable to find iteration cadence."
msgstr "Nu se poate găsi cadența iterațiilor."
@@ -21824,10 +22214,10 @@ msgid "Iterations|Unable to save cadence. Please try again."
msgstr "Nu se poate salva cadența. Vă rugăm să încercați din nou."
msgid "Iterations|Upcoming iterations"
-msgstr ""
+msgstr "Iterațiile viitoare"
msgid "Iterations|Your manual cadence can be converted to use automated scheduling"
-msgstr ""
+msgstr "Cadența dvs. manuală poate fi convertită pentru a utiliza programarea automată."
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr "Datele nu se pot suprapune cu alte Iterații existente în cadrul acestui grup."
@@ -21838,26 +22228,23 @@ msgstr "Datele nu se pot suprapune cu alte iterații existente în cadrul aceste
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "nu poate fi mai mult de 500 de ani în viitor"
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
-msgstr ""
+msgstr "Ian"
msgid "January"
-msgstr ""
+msgstr "Ianuarie"
msgid "Japanese language support using"
-msgstr ""
+msgstr "Suport pentru limba japoneză folosind"
msgid "Jira display name"
-msgstr ""
+msgstr "Numele de afișare Jira"
msgid "Jira import is already running."
-msgstr ""
+msgstr "Importul Jira rulează deja."
msgid "Jira integration not configured."
-msgstr ""
+msgstr "Integrarea Jira nu este configurată."
msgid "Jira project key is not configured."
msgstr "Cheia proiectului Jira nu este configurată."
@@ -21866,38 +22253,47 @@ msgid "Jira project: %{importProject}"
msgstr "Proiect Jira: %{importProject}"
msgid "Jira service not configured."
-msgstr ""
+msgstr "Serviciul Jira nu este configurat."
msgid "Jira user"
-msgstr ""
+msgstr "Utilizator Jira"
msgid "Jira users have been imported from the configured Jira instance. They can be mapped by selecting a GitLab user from the dropdown in the \"GitLab username\" column. When the form appears, the dropdown defaults to the user conducting the import."
msgstr "Utilizatorii Jira au fost importaÈ›i din instanÈ›a Jira configurată. AceÈ™tia pot fi mapaÈ›i prin selectarea unui utilizator GitLab din lista derulantă din coloana „Nume utilizator GitLabâ€. Când apare formularul, lista derulantă este implicită la utilizatorul care efectuează importul."
msgid "Jira-GitLab user mapping template"
-msgstr ""
+msgstr "Șablon de mapare a utilizatorilor Jira-GitLab"
+
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr "Nu se găsește spațiul de nume. Asigurați-vă că aveți suficiente permisiuni."
msgid "JiraConnect|Configure your Jira Connect Application ID."
-msgstr ""
+msgstr "Configurați ID-ul aplicației Jira Connect."
+
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr "Nu s-au putut prelua informații despre utilizator din Jira. Verificați permisiunile din Jira și încercați din nou."
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
-msgstr "Creați ramură pentru problema Jira %{jiraIssue}"
+msgstr "Creați o ramură pentru problema Jira %{jiraIssue}"
msgid "JiraConnect|Failed to create branch."
msgstr "Nu s-a reușit crearea ramurii."
msgid "JiraConnect|Failed to create branch. Please try again."
-msgstr "Crearea ramurii a eșuat. Vă rugăm să încercați din nou."
+msgstr "Nu s-a reușit crearea ramurii. Vă rugăm să încercați din nou."
msgid "JiraConnect|GitLab for Jira App"
-msgstr ""
+msgstr "Aplicația GitLab pentru Jira"
msgid "JiraConnect|Jira Connect Application ID"
-msgstr ""
+msgstr "ID-ul aplicației Jira Connect"
msgid "JiraConnect|New branch was successfully created."
msgstr "Noua ramură a fost creată cu succes."
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr "Utilizatorul Jira nu este un administrator de site. Verificați permisiunile din Jira și încercați din nou."
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "Puteți închide acum această fereastră și vă puteți întoarce la Jira."
@@ -21941,7 +22337,7 @@ msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{proj
msgstr "%{user_link} a menționat această problemă în %{entity_link} din %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgid "JiraService|An error occurred while fetching issue list"
-msgstr "A apărut o eroare la preluarea listei de probleme"
+msgstr "S-a produs o eroare la preluarea listei de probleme"
msgid "JiraService|Automatically transitions Jira issues to the \"Done\" category. %{linkStart}Learn more%{linkEnd}"
msgstr "Transferă automat problemele Jira în categoria „Terminatâ€. %{linkStart}AflaÈ›i mai multe%{linkEnd}"
@@ -21950,7 +22346,7 @@ msgid "JiraService|Base URL of the Jira instance."
msgstr "URL-ul de bază al instanței Jira."
msgid "JiraService|Change GitLab version"
-msgstr ""
+msgstr "Schimbați versiunea GitLab"
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr "Definiți tipul de problemă Jira care urmează să fie creată dintr-o vulnerabilitate."
@@ -21986,13 +22382,13 @@ msgid "JiraService|For example, AB"
msgstr "De exemplu, AB"
msgid "JiraService|For example: https://gitlab.example.com"
-msgstr ""
+msgstr "De exemplu: https://gitlab.example.com"
msgid "JiraService|GitLab for Jira Configuration"
msgstr "Configurația GitLab pentru Jira"
msgid "JiraService|GitLab instance URL"
-msgstr ""
+msgstr "URL-ul instanței GitLab"
msgid "JiraService|IDs must be a list of numbers that can be split with , or ;"
msgstr "ID-urile trebuie să fie o listă de numere care pot fi separate cu , sau ; "
@@ -22043,7 +22439,7 @@ msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart
msgstr "Setați o stare finală personalizată utilizând ID-uri de tranziție. %{linkStart}Aflați mai multe despre ID-urile de tranziție%{linkEnd}"
msgid "JiraService|Sign in to GitLab to link namespaces."
-msgstr ""
+msgstr "Conectați-vă la GitLab pentru a lega spațiile de nume."
msgid "JiraService|Sign in to GitLab.com to get started."
msgstr "Conectați-vă la GitLab.com pentru a începe."
@@ -22079,10 +22475,10 @@ msgid "JiraService|Web URL"
msgstr "URL Web"
msgid "JiraService|Welcome to GitLab for Jira"
-msgstr ""
+msgstr "Bine ați venit la GitLab pentru Jira"
msgid "JiraService|What version of GitLab are you using?"
-msgstr ""
+msgstr "Ce versiune de GitLab folosiți?"
msgid "JiraService|When a Jira issue is mentioned in a commit or merge request, a remote link and comment (if enabled) will be created."
msgstr "Când o problemă Jira este menționată într-un commit sau merge request, se va crea un link și un comentariu la distanță (dacă este activat)."
@@ -22100,31 +22496,31 @@ msgid "JiraService|You must configure Jira before enabling this integration. %{j
msgstr "Trebuie să configurați Jira înainte de a activa această integrare. %{jira_doc_link_start}Aflați mai multe.%{link_end}"
msgid "Job"
-msgstr ""
+msgstr "Job"
msgid "Job %{jobName}"
-msgstr ""
+msgstr "Job %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "Jobul a eșuat #%{build_id}"
msgid "Job has been erased"
-msgstr ""
+msgstr "Jobul a fost șters"
msgid "Job has been successfully erased!"
-msgstr ""
+msgstr "Jobul a fost șters cu succes!"
msgid "Job has wrong arguments format."
-msgstr ""
+msgstr "Jobul are un format greșit de argumente."
msgid "Job is missing the `model_type` argument."
-msgstr ""
+msgstr "Jobului îi lipseÈ™te argumentul „model_typeâ€."
msgid "Job is stuck. Check runners."
msgstr "Jobul este blocat. Verificați executorii."
msgid "Job logs and artifacts"
-msgstr ""
+msgstr "Jurnale de job și artefacte"
msgid "Job to create self-monitoring project is in progress"
msgstr "Jobul pentru crearea proiectului de automonitorizare este în desfășurare"
@@ -22133,7 +22529,7 @@ msgid "Job to delete self-monitoring project is in progress"
msgstr "Jobul de ștergere a proiectului de auto-monitorizare este în desfășurare"
msgid "Job was retried"
-msgstr ""
+msgstr "Jobul a fost reîncercat"
msgid "Jobs"
msgstr "Joburi"
@@ -22201,11 +22597,14 @@ msgstr "%{boldStart}Pipeline%{boldEnd} %{id} pentru %{mrId} cu %{source} în %{t
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr "%{boldStart}Pipeline%{boldEnd} %{id} pentru %{ref}"
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr "Sunteți sigur că doriți să ștergeți acest jurnal de job și artefactele?"
msgid "Job|Browse"
-msgstr "Navigați"
+msgstr "Răsfoiți"
msgid "Job|Cancel"
msgstr "Anulare"
@@ -22240,12 +22639,18 @@ msgstr "Jobul a fost șters"
msgid "Job|Job has been erased by %{userLink}"
msgstr "Jobul a fost șters de %{userLink}"
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "Păstrați"
msgid "Job|Manual"
msgstr "Manual"
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr "A trecut"
@@ -22270,6 +22675,12 @@ msgstr "Derulați până jos"
msgid "Job|Scroll to top"
msgstr "Derulați până sus"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr "Afișați brut complet"
@@ -22295,7 +22706,7 @@ msgid "Job|This job failed because the necessary resources were not successfully
msgstr "Acest job a eșuat deoarece resursele necesare nu au fost create cu succes."
msgid "Job|This job is stuck because of one of the following problems. There are no active runners online, no runners for the %{linkStart}protected branch%{linkEnd}, or no runners that match all of the job's tags:"
-msgstr ""
+msgstr "Acest job este blocat din cauza uneia dintre următoarele probleme. Nu există niciun executor activ online, niciun executor pentru %{linkStart}ramura protejată%{linkEnd} sau niciun executor care să corespundă tuturor etichetelor jobului:"
msgid "Job|This job is stuck because the project doesn't have any runners online assigned to it."
msgstr "Acest job este blocat, deoarece proiectul nu are niciun executor online atribuit."
@@ -22306,6 +22717,9 @@ msgstr "Acest job este blocat pentru că nu aveÈ›i niciun executor activ care sÄ
msgid "Job|Waiting for resource"
msgstr "În așteptare de resurse"
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "permis să eșueze"
@@ -22319,7 +22733,7 @@ msgid "Job|triggered"
msgstr "declanșat"
msgid "Join GitLab today! You and your team can plan, build, and ship secure code all in one application. Get started here for free!"
-msgstr ""
+msgstr "Alăturați-vă astăzi GitLab! Dumneavoastră și echipa d-voastră puteți să planificați, să construiți și să livrați cod securizat, totul într-o singură aplicație. Începeți aici gratuit!"
msgid "Join Zoom meeting"
msgstr "Alăturați-vă reuniunii Zoom"
@@ -22331,160 +22745,157 @@ msgid "Join your team on GitLab and contribute to an existing project"
msgstr "Alăturați-vă echipei dvs. pe GitLab și contribuiți la un proiect existent"
msgid "Joined %{time_ago}"
-msgstr ""
+msgstr "S-a alăturat %{time_ago}"
msgid "Joined %{user_created_time}"
-msgstr ""
+msgstr "S-a înscris la %{user_created_time}"
msgid "Joined projects (%{projects_count})"
-msgstr ""
+msgstr "Proiecte la care s-a alăturat (%{projects_count})"
msgid "Jul"
-msgstr ""
+msgstr "Iul"
msgid "July"
-msgstr ""
+msgstr "Iulie"
msgid "Jun"
-msgstr ""
+msgstr "Iun"
msgid "June"
-msgstr ""
+msgstr "Iunie"
msgid "Just me"
-msgstr ""
+msgstr "Doar eu"
msgid "K8s pod health"
msgstr "Sănătatea pod-ului K8s"
msgid "KEY"
-msgstr ""
+msgstr "CHEIE"
msgid "Keep"
-msgstr ""
+msgstr "Păstrați"
msgid "Keep artifacts from most recent successful jobs"
-msgstr ""
+msgstr "Păstrați artefacte de la cele mai recente joburi de succes"
msgid "Keep divergent refs"
-msgstr ""
+msgstr "Păstrați referințele divergente"
msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr "Activarea tuturor analizoarelor SAST permite ca proiectul să fie pregătit pentru viitor, în cazul în care vor fi adăugate ulterior noi limbaje. Determinarea analizoarelor care se aplică este un proces care consumă resurse minime și adaugă un timp minim la pipeline. Prin activarea tuturor analizoarelor SAST se asigură o acoperire maximă."
+msgstr "Menținerea activată a tuturor analizatorilor SAST permite ca proiectul să fie pregătit pentru viitor, în cazul în care vor fi adăugate ulterior noi limbaje. Determinarea analizatorilor care se aplică este un proces care consumă resurse minime și adaugă un timp minim la procesul de lucru. Activarea tuturor analizatorilor SAST asigură o acoperire maximă."
msgid "Kerberos access denied"
-msgstr ""
+msgstr "Accesul Kerberos refuzat"
msgid "Key"
-msgstr ""
+msgstr "Cheie"
msgid "Key (PEM)"
-msgstr ""
+msgstr "Cheie (PEM)"
msgid "Key: %{key}"
-msgstr ""
+msgstr "Cheie: %{key}"
msgid "Keyboard shortcuts"
msgstr "Scurtături de la tastatură"
msgid "KeyboardKey|Alt"
-msgstr ""
+msgstr "Alt"
msgid "KeyboardKey|Ctrl"
-msgstr ""
+msgstr "Ctrl"
msgid "KeyboardKey|Ctrl+"
-msgstr ""
+msgstr "Ctrl+"
msgid "KeyboardKey|Enter"
-msgstr ""
+msgstr "Enter"
msgid "KeyboardKey|Esc"
-msgstr ""
+msgstr "Esc"
msgid "KeyboardKey|Shift"
-msgstr ""
+msgstr "Shift"
msgid "KeyboardShortcuts|No shortcuts matched your search"
-msgstr ""
+msgstr "Nicio comandă rapidă nu corespunde căutării dvs."
msgid "KeyboardShortcuts|Search keyboard shortcuts"
-msgstr ""
+msgstr "Căutați comenzile rapide de la tastatură"
msgid "Keys"
-msgstr ""
+msgstr "Chei"
msgid "Ki"
msgstr "Ki"
msgid "Kroki"
-msgstr ""
+msgstr "Kroki"
msgid "Kubernetes"
-msgstr ""
-
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr "API-ul Kubernetes a returnat codul de stare: %{error_code}"
+msgstr "Kubernetes"
msgid "Kubernetes Cluster"
-msgstr ""
+msgstr "Clusterul Kubernetes"
msgid "Kubernetes Clusters"
-msgstr ""
+msgstr "Clusterele Kubernetes"
msgid "Kubernetes cluster"
-msgstr ""
+msgstr "Clusterul Kubernetes"
msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
msgstr "Timpul de creare a clusterului Kubernetes depășește timpul de expirare; %{timeout}"
msgid "Kubernetes cluster integration and resources are being removed."
-msgstr ""
+msgstr "Integrarea și resursele clusterului Kubernetes sunt înlăturate."
msgid "Kubernetes cluster integration was successfully removed."
-msgstr ""
+msgstr "Integrarea clusterului Kubernetes a fost înlăturată cu succes."
msgid "Kubernetes cluster was successfully updated."
-msgstr ""
+msgstr "Clusterul Kubernetes a fost actualizat cu succes."
msgid "Kubernetes clusters"
-msgstr ""
+msgstr "Clusterele Kubernetes"
msgid "Kubernetes deployment not found"
-msgstr ""
+msgstr "Implementarea Kubernetes nu a fost găsită"
msgid "Kubernetes error: %{error_code}"
msgstr "Eroare Kubernetes: %{error_code}"
msgid "LDAP"
-msgstr ""
+msgstr "LDAP"
msgid "LDAP Synchronization"
-msgstr ""
+msgstr "Sincronizarea LDAP"
msgid "LDAP group settings"
-msgstr ""
+msgstr "Setări de grup LDAP"
msgid "LDAP settings"
-msgstr ""
+msgstr "Setări LDAP"
msgid "LDAP settings updated"
-msgstr ""
+msgstr "Setări LDAP actualizate"
msgid "LDAP sync in progress. This could take a few minutes. Refresh the page to see the changes."
msgstr "Sincronizare LDAP în curs. Acest lucru ar putea dura câteva minute. Reîmprospătați pagina pentru a vedea modificările."
msgid "LDAP synchronizations"
-msgstr ""
+msgstr "Sincronizări LDAP"
msgid "LDAP uid:"
-msgstr ""
+msgstr "uid LDAP:"
msgid "LFS"
msgstr "LFS"
msgid "LFS objects"
-msgstr ""
+msgstr "Obiecte LFS"
msgid "LFSStatus|Disabled"
msgstr "Dezactivat"
@@ -22493,25 +22904,31 @@ msgid "LFSStatus|Enabled"
msgstr "Activat"
msgid "LICENSE"
-msgstr ""
+msgstr "LICENSE"
msgid "Label"
msgstr "Etichetă"
msgid "Label actions dropdown"
-msgstr ""
+msgstr "Meniul derulant al acțiunilor de etichetare"
+
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] "Etichetă adăugată: %{labels}"
+msgstr[1] "Etichete adăugate: %{labels}"
+msgstr[2] "Etichete adăugate: %{labels}"
msgid "Label priority"
msgstr "Prioritatea etichetei"
msgid "Label was created"
-msgstr ""
+msgstr "Eticheta a fost creată"
msgid "Label was removed"
-msgstr ""
+msgstr "Eticheta a fost înlăturată"
msgid "Label was successfully updated."
-msgstr ""
+msgstr "Eticheta a fost actualizată cu succes."
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr "%{firstLabelName} + %{remainingLabelCount} mai mult"
@@ -22526,7 +22943,7 @@ msgid "Labels"
msgstr "Etichete"
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
-msgstr ""
+msgstr "Etichetele pot fi aplicate la %{features}. Etichetele de grup sunt disponibile pentru orice proiect din cadrul grupului."
msgid "Labels can be applied to issues and merge requests to categorize them."
msgstr "Etichetele pot fi aplicate problemelor și merge request-urilor pentru a le clasifica."
@@ -22535,22 +22952,22 @@ msgid "Labels can be applied to issues and merge requests."
msgstr "Etichetele pot fi aplicate problemelor și merge request-urilor."
msgid "Labels with no issues in this iteration:"
-msgstr ""
+msgstr "Etichete fără probleme în această iterație:"
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
-msgstr ""
+msgstr "%{spanStart}Promovați eticheta%{spanEnd} %{labelTitle} în %{spanStart}Etichetă de grup?%{spanEnd}"
msgid "Labels|Promote Label"
-msgstr ""
+msgstr "Promovați eticheta"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. If a group label with the same title exists, it will also be merged. This action cannot be reversed."
msgstr "Promovarea etichetei %{labelTitle} o va face disponibilă pentru toate proiectele din cadrul %{groupName}. Etichetele de proiect existente cu același titlu vor fi îmbinate. Dacă există o etichetă de grup cu același titlu, aceasta va fi, de asemenea, îmbinată. Această acțiune este ireversibilă."
msgid "Language"
-msgstr ""
+msgstr "Limbaj"
msgid "Language type"
-msgstr ""
+msgstr "Tipul de limbaj"
msgid "Large File Storage"
msgstr "Large File Storage"
@@ -22562,22 +22979,22 @@ msgstr[1] "Ultimele %d zile"
msgstr[2] "Ultimele %d zile"
msgid "Last %{days} days"
-msgstr ""
+msgstr "Ultimele %{days} zile"
msgid "Last 2 weeks"
-msgstr ""
+msgstr "Ultimele 2 săptămâni"
msgid "Last 30 days"
-msgstr ""
+msgstr "Ultimele 30 de zile"
msgid "Last 60 days"
-msgstr ""
+msgstr "Ultimele 60 de zile"
msgid "Last 90 days"
-msgstr ""
+msgstr "Ultimele 90 de zile"
msgid "Last Accessed On"
-msgstr ""
+msgstr "Ultimul acces la"
msgid "Last Activity"
msgstr "Ultima activitate"
@@ -22586,22 +23003,22 @@ msgid "Last Name"
msgstr "Numele de familie"
msgid "Last Pipeline"
-msgstr ""
+msgstr "Ultimul pipeline"
msgid "Last Seen"
-msgstr ""
+msgstr "Văzut(ă) ultima dată"
msgid "Last Sync"
msgstr "Ultima sincronizare"
msgid "Last Used"
-msgstr ""
+msgstr "Ultima utilizare"
msgid "Last accessed on"
-msgstr ""
+msgstr "Ultimul acces la"
msgid "Last activity"
-msgstr ""
+msgstr "Ultima activitate"
msgid "Last commit"
msgstr "Ultimul commit"
@@ -22613,58 +23030,58 @@ msgid "Last edited %{date}"
msgstr "Ultima editare %{date}"
msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
-msgstr ""
+msgstr "Ultima editare de %{link_start}%{avatar} %{name}%{link_end}"
msgid "Last event"
-msgstr ""
+msgstr "Ultimul eveniment"
msgid "Last item before this page loaded in your browser:"
-msgstr ""
+msgstr "Ultimul element înainte ca această pagină să fie încărcată în browser:"
msgid "Last modified"
-msgstr "Ultima dată modificat"
+msgstr "Ultima modificare"
msgid "Last month"
-msgstr ""
+msgstr "Luna trecută"
msgid "Last name"
-msgstr ""
+msgstr "Numele de familie"
msgid "Last reply by"
-msgstr ""
+msgstr "Ultimul răspuns de la"
msgid "Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages."
-msgstr ""
+msgstr "Ultima verificare a repozitoriului (%{last_check_timestamp}) a eșuat. Consultați fișierul „repocheck.log†pentru mesaje de eroare."
msgid "Last seen"
-msgstr ""
+msgstr "Văzut(ă) ultima dată"
msgid "Last sign-in"
-msgstr ""
+msgstr "Ultima autentificare"
msgid "Last sign-in IP:"
-msgstr ""
+msgstr "Ultimul IP de conectare:"
msgid "Last sign-in at:"
-msgstr ""
+msgstr "Ultima conectare la:"
msgid "Last successful sync"
-msgstr ""
+msgstr "Ultima sincronizare reușită"
msgid "Last successful update"
-msgstr ""
+msgstr "Ultima actualizare reușită"
msgid "Last time checked"
-msgstr ""
+msgstr "Ultima dată verificat(ă)"
msgid "Last time verified"
-msgstr ""
+msgstr "Ultima dată verificat(ă)"
msgid "Last update"
-msgstr ""
+msgstr "Ultima actualizare"
msgid "Last update attempt"
-msgstr ""
+msgstr "Ultima încercare de actualizare"
msgid "Last updated"
msgstr "Ultima actualizare"
@@ -22673,19 +23090,19 @@ msgid "Last updated %{time} ago"
msgstr "Ultima actualizare acum %{time}"
msgid "Last used"
-msgstr ""
+msgstr "Ultima utilizare"
msgid "Last used %{last_used_at} ago"
-msgstr ""
+msgstr "Ultima utilizare acum %{last_used_at}"
msgid "Last used on:"
-msgstr ""
+msgstr "Ultima utilizare pe:"
msgid "Last week"
-msgstr ""
+msgstr "Săptămâna trecută"
msgid "Last year"
-msgstr ""
+msgstr "Anul trecut"
msgid "LastCommit|authored"
msgstr "redactat"
@@ -22697,10 +23114,10 @@ msgid "LastPushEvent|at"
msgstr "la"
msgid "Latest changes"
-msgstr ""
+msgstr "Ultimele modificări"
msgid "Latest pipeline for the most recent commit on this branch"
-msgstr ""
+msgstr "Ultimul pipeline pentru cel mai recent commit pe această ramură"
msgid "Launch a ready-to-code development environment for your project."
msgstr "Lansați un mediu de dezvoltare gata de codificare pentru proiectul dumneavoastră."
@@ -22721,64 +23138,58 @@ msgid "Lead time"
msgstr "Durata execuției"
msgid "Learn GitLab"
-msgstr ""
+msgstr "Învățați GitLab"
msgid "Learn GitLab - Ultimate trial"
-msgstr ""
-
-msgid "Learn GitLab|Trial only"
-msgstr "Numai evaluare"
+msgstr "Învățați GitLab - Versiunea de încercare Ultimate"
msgid "Learn More"
-msgstr ""
+msgstr "Aflați mai multe"
msgid "Learn More."
msgstr "Aflați mai multe."
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
-msgstr ""
+msgstr "Aflați cum să %{link_start}contribuiți la șabloanele încorporate%{link_end}"
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
-msgstr ""
+msgstr "Aflați cum să %{no_packages_link_start}vă publicați și să partajați pachetele%{no_packages_link_end} cu GitLab."
msgid "Learn more"
-msgstr ""
-
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
+msgstr "Aflați mai multe"
msgid "Learn more about %{username}"
-msgstr ""
+msgstr "Aflați mai multe despre %{username}"
msgid "Learn more about Auto DevOps"
-msgstr ""
+msgstr "Aflați mai multe despre Auto DevOps"
msgid "Learn more about GitLab"
-msgstr ""
+msgstr "Aflați mai multe despre GitLab"
msgid "Learn more about Needs relationships"
-msgstr ""
+msgstr "Aflați mai multe despre relațiile Needs"
msgid "Learn more about Web Terminal"
msgstr "Aflați mai multe despre Terminalul Web"
msgid "Learn more about X.509 signed commits"
-msgstr ""
+msgstr "Aflați mai multe despre commit-urile semnate X.509"
msgid "Learn more about adding certificates to your project by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
msgstr "Aflați mai multe despre adăugarea de certificate la proiectul dvs. urmărind %{docs_link_start}documentația de pe GitLab Pages%{docs_link_end}."
msgid "Learn more about custom project templates"
-msgstr ""
+msgstr "Aflați mai multe despre șabloanele de proiecte personalizate"
msgid "Learn more about deploying to AWS"
-msgstr ""
+msgstr "Aflați mai multe despre implementarea în AWS"
msgid "Learn more about deploying to a cluster"
-msgstr ""
+msgstr "Aflați mai multe despre implementarea într-un cluster"
msgid "Learn more about group-level project templates"
-msgstr ""
+msgstr "Aflați mai multe despre șabloanele de proiect la nivel de grup"
msgid "Learn more about groups."
msgstr "Aflați mai multe despre grupuri."
@@ -22793,35 +23204,35 @@ msgid "Learn more about shards and replicas in the %{configuration_link_start}Ad
msgstr "Aflați mai multe despre fragmente și replici în documentația de %{configuration_link_start}configurare a Căutării avansate%{configuration_link_end}. Modificările nu au loc până când nu %{recreated_link_start}recreați%{recreated_link_end} indexul."
msgid "Learn more about signing commits"
-msgstr ""
+msgstr "Aflați mai multe despre semnarea commit-urilor"
msgid "Learn more in the"
msgstr "Aflați mai multe în"
msgid "Learn more."
-msgstr ""
+msgstr "Aflați mai multe."
msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
msgstr "%{percentage}%{percentSymbol} completat"
msgid "LearnGitLab|Add code owners"
-msgstr "Adăugați proprietari de coduri"
+msgstr "Adăugare de proprietari de coduri"
-msgid "LearnGitLab|Add merge request approval"
-msgstr "Adăugați aprobarea de merge request"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
+msgstr "Analizați-vă aplicația pentru vulnerabilități cu DAST"
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr "Finalizați mai întâi aceste sarcini pentru a vă putea bucura la maximum de funcțiile GitLab:"
+msgid "LearnGitLab|Create a repository"
+msgstr "Creați un repozitoriu"
+
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr "Creați un flux de lucru pentru noul dvs. spațiu de lucru și aflați cum funcționează împreună funcțiile GitLab:"
msgid "LearnGitLab|Create an issue"
msgstr "Creați o problemă"
-msgid "LearnGitLab|Create or import a repository"
-msgstr "Creați sau importați un repozitoriu"
-
msgid "LearnGitLab|Create or import your first repository into your new project."
msgstr "Creați sau importați primul dvs. repozitoriu în noul proiect."
@@ -22864,23 +23275,26 @@ msgstr "Executați o scanare de securitate folosind CI/CD"
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr "Economisiți timp prin automatizarea sarcinilor de integrare și distribuție."
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr "Scanați dependențele pentru licențe"
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr "Scanați dependențele pentru vulnerabilități"
+
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr "Scanați-vă codul pentru a descoperi vulnerabilitățile înainte de a-l distribui."
msgid "LearnGitLab|Set up CI/CD"
msgstr "Configurați CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
+msgstr "Configurați CI/CD pentru primul dvs. proiect"
+
msgid "LearnGitLab|Set up your workspace"
msgstr "Configurați-vă spațiul de lucru"
-msgid "LearnGitLab|Set-up CI/CD"
-msgstr "Configurați CI/CD"
-
-msgid "LearnGitLab|Start a free Ultimate trial"
-msgstr "Începeți o încercare gratuită Ultimate"
-
-msgid "LearnGitLab|Submit a merge request"
-msgstr "Trimiteți un merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
+msgstr "Începeți o încercare gratuită a GitLab Ultimate"
msgid "LearnGitLab|Submit a merge request (MR)"
msgstr "Trimiteți un merge request (MR)"
@@ -22897,8 +23311,11 @@ msgstr "Folosiți-vă noul flux de lucru GitLab pentru a vă implementa aplicaț
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr "Echipa dvs. se mărește! Ați invitat cu succes noi membri ai echipei la proiectul %{projectName}."
+msgid "LearnGitlab|- Included in trial"
+msgstr "- Inclus în încercare"
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
-msgstr "Contactați-vă administratorul pentru a începe o perioadă de probă gratuită Ultimate."
+msgstr "Contactați-vă administratorul pentru a începe o perioadă de încercare gratuită Ultimate."
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr "Crearea experienței dvs. de onboarding..."
@@ -22906,14 +23323,11 @@ msgstr "Crearea experienței dvs. de onboarding..."
msgid "LearnGitlab|Ok, let's go"
msgstr "Bine, să mergem."
-msgid "LearnGitlab|Trial only"
-msgstr "Numai evaluare"
-
msgid "LearnGitlab|View administrator list"
msgstr "Consultați lista de administratori"
msgid "Leave"
-msgstr ""
+msgstr "Părăsiți"
msgid "Leave Admin Mode"
msgstr "Ieșiți din Modul Admin"
@@ -22928,10 +23342,10 @@ msgid "Leave project"
msgstr "Părăsiți proiectul"
msgid "Leave zen mode"
-msgstr ""
+msgstr "Părăsiți modul zen"
msgid "Leaving this setting enabled is recommended."
-msgstr "Este recomandat să lăsați această setare activată."
+msgstr "Se recomandă să lăsați această setare activată."
msgid "Legacy burndown chart"
msgstr "Graficul burndown legacy"
@@ -22943,13 +23357,13 @@ msgid "Less Details"
msgstr "Mai puține detalii"
msgid "Let's Encrypt does not accept emails on example.com"
-msgstr ""
+msgstr "Let's Encrypt nu acceptă e-mailuri pe example.com"
msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
-msgstr ""
+msgstr "Let's Encrypt este o autoritate de certificare (CA) gratuită, automatizată și deschisă care oferă certificate digitale pentru a activa HTTPS (SSL/TLS) pentru site-urile web. Aflați mai multe despre configurarea Let's Encrypt urmărind %{docs_link_start}documentația de pe GitLab Pages%{docs_link_end}."
msgid "Let's talk!"
-msgstr ""
+msgstr "Hai să vorbim!"
msgid "License Compliance"
msgstr "Conformitatea licenței"
@@ -22964,7 +23378,7 @@ msgid "License key"
msgstr "Cheia de licență"
msgid "License overview"
-msgstr ""
+msgstr "Prezentare generală a licenței"
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are active"
msgstr "%{docLinkStart}Aprobările de licență%{docLinkEnd} sunt active"
@@ -22979,10 +23393,10 @@ msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr "Licență acceptabilă pentru a fi utilizată în proiect"
msgid "LicenseCompliance|Add license and related policy"
-msgstr "Adăugați licența și politica asociată"
+msgstr "Adăugați licența și polița asociată"
msgid "LicenseCompliance|Add license policy"
-msgstr "Adăugați politica de licență"
+msgstr "Adăugare politică de licență"
msgid "LicenseCompliance|Allow"
msgstr "Permiteți"
@@ -23016,7 +23430,7 @@ msgstr[2] "Conformitatea licenței a detectat %d de încălcări a licenței și
msgid "LicenseCompliance|License Compliance detected %d license for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses for the source branch only"
-msgstr[0] "Conformitatea licenței a detectat %d licență doar pentru ramura sursă"
+msgstr[0] "Conformitatea licenței a detectat %d licență numai pentru ramura sursă"
msgstr[1] "Conformitatea licenței a detectat %d licențe numai pentru ramura sursă"
msgstr[2] "Conformitatea licenței a detectat %d de licențe numai pentru ramura sursă"
@@ -23078,25 +23492,25 @@ msgid "LicenseCompliance|You are about to remove the license, %{name}, from this
msgstr "Sunteți pe cale să eliminați licența, %{name}, din acest proiect."
msgid "LicenseManagement|Allowed"
-msgstr ""
+msgstr "Permisă"
msgid "LicenseManagement|Denied"
-msgstr ""
+msgstr "Refuzată"
msgid "LicenseManagement|Uncategorized"
-msgstr ""
+msgstr "Necategorizată"
msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
msgstr "Caracteristicile din Ediția Enterprise cu licență pot fi utilizate dacă planul spațiului de nume al proiectului include caracteristica respectivă sau dacă proiectul este public."
msgid "Licensed Features"
-msgstr ""
+msgstr "Caracteristici licențiate"
msgid "Licensed to:"
msgstr "Licențiat pentru:"
msgid "Licenses"
-msgstr ""
+msgstr "Licențe"
msgid "Licenses|%{remainingComponentsCount} more"
msgstr "%{remainingComponentsCount} mai mult"
@@ -23165,106 +23579,106 @@ msgid "Limit sign in from multiple IP addresses"
msgstr "Limitați conectarea de la mai multe adrese IP"
msgid "Limit the number of inbound incident management alerts that can be sent to a project."
-msgstr "Limitați numărul de alerte de gestionare a incidentelor de intrare ce pot fi trimise unui proiect."
+msgstr "Limitați numărul de alerte de gestionare a incidentelor de intrare care pot fi trimise către un proiect."
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
-msgstr "Limitați numărul de probleme și epice pe care un utilizator le poate crea prin cereri API și web pe minut."
+msgstr "Limitați numărul de probleme și epice pe minut pe care un utilizator le poate crea prin intermediul cererilor web și API."
msgid "Limit the number of pipeline creation requests per minute. This limit includes pipelines created through the UI, the API, and by background processing."
-msgstr ""
+msgstr "Limitați numărul de solicitări de creare de pipeline-uri pe minut. Această limită include pipeline-urile create prin interfața de utilizare (UI), API și prin procesare în fundal."
msgid "Limit the size of Sidekiq jobs stored in Redis."
-msgstr ""
+msgstr "Limitați mărimea joburilor Sidekiq stocate în Redis."
msgid "Limiting mode"
msgstr "Modul restricționat"
msgid "Line changes"
-msgstr ""
+msgstr "Modificări de linie"
msgid "Link"
-msgstr ""
+msgstr "Linkul"
msgid "Link (optional)"
-msgstr ""
+msgstr "Linkul (opțional)"
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr "Conectați Sentry la GitLab pentru a descoperi și a vizualiza erorile generate de aplicația dvs."
msgid "Link URL"
-msgstr ""
+msgstr "URL-ul linkului"
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
-msgstr ""
+msgstr "Conectați un wiki extern din bara laterală a proiectului. %{docs_link}"
msgid "Link copied"
-msgstr ""
+msgstr "Link copiat"
msgid "Link text"
-msgstr ""
+msgstr "Textul linkului"
msgid "Link title"
-msgstr ""
+msgstr "Titlul linkului"
msgid "Link title is required"
-msgstr ""
+msgstr "Titlul linkului este obligatoriu"
msgid "Link to go to GitLab pipeline documentation"
-msgstr ""
+msgstr "Link pentru a accesa documentația pipeline-ului GitLab"
msgid "Link to your Grafana instance."
msgstr "Link către instanța dvs. Grafana."
msgid "Linked emails (%{email_count})"
-msgstr ""
+msgstr "E-mailuri legate (%{email_count})"
msgid "Linked epics"
-msgstr ""
+msgstr "Epice legate"
msgid "Linked issues"
-msgstr ""
+msgstr "Probleme legate"
msgid "LinkedIn"
msgstr "LinkedIn"
msgid "LinkedIn:"
-msgstr ""
+msgstr "LinkedIn:"
msgid "LinkedPipelines|%{counterLabel} more downstream pipelines"
msgstr "%{counterLabel} alte pipeline-uri în aval"
msgid "Links"
-msgstr ""
+msgstr "Linkuri"
msgid "List"
-msgstr ""
+msgstr "Listă"
msgid "List Your Gitea Repositories"
msgstr "Listați repozitoriile dvs. Gitea"
msgid "List available repositories"
-msgstr ""
+msgstr "Listați repozitoriile disponibile"
msgid "List of all merge commits"
msgstr "Lista tuturor commit-urilor de îmbinare"
msgid "List of suitable GCP locations"
-msgstr ""
+msgstr "Lista de locații GCP adecvate"
msgid "List of users who are allowed to exceed the rate limit. Example: username1, username2"
-msgstr ""
+msgstr "Lista utilizatorilor cărora li se permite să depășească limita de viteză. Exemplu: username1, username2"
msgid "List options"
-msgstr ""
+msgstr "Lista de opțiuni"
msgid "List settings"
-msgstr ""
+msgstr "Lista de setări"
msgid "List the merge requests that must be merged before this one."
msgstr "Listează merge request-urile care trebuie să fie îmbinate înainte de aceasta."
msgid "List the visible events for %{project_link} using the %{events_api_link}."
-msgstr ""
+msgstr "Listați evenimentele vizibile pentru %{project_link} utilizând %{events_api_link}."
msgid "List view"
msgstr "Vizualizare listă"
@@ -23276,10 +23690,10 @@ msgid "Live preview"
msgstr "Previzualizare în direct"
msgid "Load more"
-msgstr ""
+msgstr "Încărcați mai mult"
msgid "Load more users"
-msgstr ""
+msgstr "Încărcați mai mulți utilizatori"
msgid "Loading"
msgstr "Se încarcă"
@@ -23303,7 +23717,7 @@ msgid "Loading the GitLab IDE..."
msgstr "Se încarcă GitLab IDE..."
msgid "Loading, please wait."
-msgstr ""
+msgstr "Se încarcă, vă rugăm să așteptați."
msgid "Loading..."
msgstr "Se încarcă..."
@@ -23312,58 +23726,58 @@ msgid "Loading…"
msgstr "Se încarcă…"
msgid "Localization"
-msgstr ""
+msgstr "Localizare"
msgid "Location"
-msgstr ""
+msgstr "Locație"
msgid "Location:"
-msgstr ""
+msgstr "Locație:"
msgid "Lock"
-msgstr ""
+msgstr "Blocați"
msgid "Lock %{issuableDisplayName}"
-msgstr ""
+msgstr "Blocați %{issuableDisplayName}"
msgid "Lock File?"
msgstr "Blocați fișierul?"
msgid "Lock memberships to LDAP synchronization"
-msgstr ""
+msgstr "Blocați abonamentele la sincronizarea LDAP"
msgid "Lock merge request"
-msgstr ""
+msgstr "Blocați merge request-ul"
msgid "Lock not found"
-msgstr ""
+msgstr "Blocajul nu a fost găsit"
msgid "Lock the discussion"
-msgstr ""
+msgstr "Blocați discuția"
msgid "Lock this %{issuableDisplayName}? Only %{strongStart}project members%{strongEnd} will be able to comment."
msgstr "Blocați acest %{issuableDisplayName}? Numai %{strongStart}membrii proiectului%{strongEnd} vor putea comenta."
msgid "Lock to current projects"
-msgstr ""
+msgstr "Blocați la proiectele curente"
msgid "Locked"
-msgstr ""
+msgstr "Blocat"
msgid "Locked Files"
-msgstr ""
+msgstr "Fișiere blocate"
msgid "Locked by %{fileLockUserName}"
-msgstr ""
+msgstr "Blocat de %{fileLockUserName}"
msgid "Locked the discussion."
-msgstr ""
+msgstr "Discuția a fost închisă."
msgid "Locks give the ability to lock specific file or folder."
-msgstr ""
+msgstr "Blocările oferă posibilitatea de a bloca un anumit fișier sau un dosar."
msgid "Locks the discussion."
-msgstr ""
+msgstr "Închideți discuția."
msgid "LoggedOutMarketingHeader|About GitLab"
msgstr "Despre GitLab"
@@ -23399,7 +23813,7 @@ msgid "Login"
msgstr "Conectare"
msgid "Login with smartcard"
-msgstr ""
+msgstr "Autentificare cu smartcard"
msgid "Logo was successfully removed."
msgstr "Logoul a fost înlăturat cu succes."
@@ -23408,25 +23822,22 @@ msgid "Logo will be removed. Are you sure?"
msgstr "Logoul va fi înlăturat. Sunteți sigur?"
msgid "Logs"
-msgstr ""
-
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
+msgstr "Jurnale"
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr "Se pare că ați atins limita de %{free_limit} (de) membri pentru %{strong_start}%{namespace_name}%{strong_end}"
msgid "Low vulnerabilities present"
-msgstr ""
+msgstr "Prezintă vulnerabilități scăzute"
msgid "MB"
msgstr "MB"
msgid "MD5"
-msgstr ""
+msgstr "MD5"
msgid "MERGED"
-msgstr ""
+msgstr "ÃŽMBINAT"
msgid "MR widget|Back to the merge request"
msgstr "ÃŽnapoi la merge request"
@@ -23453,7 +23864,7 @@ msgid "MRApprovals|Commented by"
msgstr "Comentat de"
msgid "MRDiffFile|Changes are too large to be shown."
-msgstr ""
+msgstr "Modificările sunt prea mari pentru a fi afișate."
msgid "MRDiffFile|View file @ %{commitSha}"
msgstr "Vizualizați fișierul @ %{commitSha}"
@@ -23468,41 +23879,38 @@ msgid "Made this issue confidential."
msgstr "Această problemă a devenit confidențială."
msgid "Mailgun"
-msgstr ""
+msgstr "Mailgun"
msgid "Mailgun HTTP webhook signing key"
-msgstr ""
+msgstr "Cheia de semnare a webhook-ului HTTP Mailgun"
msgid "Mailgun events"
-msgstr ""
+msgstr "Evenimente Mailgun"
msgid "Maintenance mode"
msgstr "Modul de întreținere"
msgid "Make adjustments to how your GitLab instance is set up."
-msgstr ""
+msgstr "Efectuați modificări la modul în care este configurată instanța dvs. GitLab."
msgid "Make and review changes in the browser with the Web IDE"
msgstr "Efectuați și revizuiți modificările în browser cu ajutorul IDE Web"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
-msgstr ""
+msgstr "Faceți ca toți membrii echipei dvs. să fie mai productivi, indiferent de locația lor. GitLab Geo creează replici doar în citire ale instanței dvs. GitLab, astfel încât să puteți reduce timpul necesar pentru a clona și a prelua repozitoriile mari."
msgid "Make issue confidential"
msgstr "Faceți problema confidențială"
msgid "Make sure you have the correct permissions to link your project."
-msgstr ""
+msgstr "Asigurați-vă că aveți permisiunile adecvate pentru a vă conecta proiectul."
msgid "Make sure you save it - you won't be able to access it again."
-msgstr ""
+msgstr "Asigurați-vă că îl salvați - nu îl veți mai putea accesa din nou."
msgid "Makes this issue confidential."
msgstr "Face această problemă confidențială."
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr "Gestionați etichetele pentru %{workspace}"
@@ -23510,10 +23918,7 @@ msgid "Manage Web IDE features."
msgstr "Gestionați funcțiile Web IDE."
msgid "Manage access"
-msgstr ""
-
-msgid "Manage all notifications"
-msgstr ""
+msgstr "Gestionați accesul"
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "Gestionați aplicațiile care pot utiliza GitLab ca furnizor OAuth și aplicațiile pe care le-ați autorizat să vă utilizeze contul."
@@ -23522,52 +23927,52 @@ msgid "Manage applications that use GitLab as an OAuth provider."
msgstr "Gestionați aplicațiile care utilizează GitLab ca furnizor OAuth."
msgid "Manage applications that you've authorized to use your account."
-msgstr ""
+msgstr "Gestionați aplicațiile pe care le-ați autorizat să vă utilizeze contul."
msgid "Manage git repositories with fine-grained access controls that keep your code secure."
-msgstr ""
+msgstr "Gestionați repozitoriile git cu controale de acces de finețe (FGAC) care vă păstrează codul în siguranță."
msgid "Manage group labels"
-msgstr ""
+msgstr "Gestionați etichetele de grup"
msgid "Manage labels"
-msgstr ""
+msgstr "Gestionați etichetele"
msgid "Manage members"
msgstr "Gestionați membrii"
msgid "Manage milestones"
-msgstr ""
+msgstr "Gestionați obiectivele"
msgid "Manage project labels"
-msgstr ""
+msgstr "Gestionați etichetele proiectului"
msgid "Manage projects."
-msgstr ""
+msgstr "Gestionați proiectele."
msgid "Manage two-factor authentication"
-msgstr ""
+msgstr "Gestionați autentificarea cu două factori"
msgid "Manage your license"
-msgstr ""
+msgstr "Gestionați-vă licența"
msgid "Manage your project's triggers"
msgstr "Gestionați declanșatoarele proiectului dumneavoastră"
msgid "Managed Account"
-msgstr ""
+msgstr "Cont gestionat"
msgid "Manifest"
-msgstr ""
+msgstr "Manifest"
msgid "Manifest file import"
-msgstr ""
+msgstr "Importul cu un fișier manifest"
msgid "Manifest import"
-msgstr ""
+msgstr "Importul cu un manifest"
msgid "Manual"
-msgstr ""
+msgstr "Manual"
msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
msgstr "Cadențele de iterație manuală sunt depășite. Sunt permise numai cadențele automate de iterație."
@@ -23582,10 +23987,10 @@ msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Maparea unui ID de cont FogBugz la un utilizator GitLab"
msgid "Mar"
-msgstr ""
+msgstr "Mar"
msgid "March"
-msgstr ""
+msgstr "Martie"
msgid "Mark as done"
msgstr "Marcați ca terminat"
@@ -23597,52 +24002,52 @@ msgid "Mark as ready"
msgstr "Marcat ca gata"
msgid "Mark this issue as a duplicate of another issue"
-msgstr ""
+msgstr "Marcați această problemă ca duplicat al unei alte probleme"
msgid "Mark this issue as related to another issue"
-msgstr ""
+msgstr "Marcați această problemă ca fiind legată de o altă problemă"
msgid "Mark to do as done"
msgstr "Marcați de făcut ca terminat"
msgid "Markdown Help"
-msgstr ""
+msgstr "Ajutor Markdown"
msgid "Markdown enabled."
msgstr "Markdown activat."
msgid "Markdown supported."
-msgstr "Markdown suportat."
+msgstr "Markdown acceptat."
msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
-msgstr ""
+msgstr "Adăugați un link (%{modifierKey}K)"
msgid "MarkdownEditor|Add a link (%{modifier_key}K)"
-msgstr ""
+msgstr "Adăugați un link (%{modifier_key}K)"
msgid "MarkdownEditor|Add bold text (%{modifierKey}B)"
-msgstr ""
+msgstr "Adăugați text îngroșat (%{modifierKey}B)"
msgid "MarkdownEditor|Add bold text (%{modifier_key}B)"
-msgstr ""
+msgstr "Adăugați text îngroșat (%{modifier_key}B)"
msgid "MarkdownEditor|Add italic text (%{modifierKey}I)"
-msgstr ""
+msgstr "Adăugați text italic (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
-msgstr ""
+msgstr "Adăugați text italic (%{modifier_key}I)"
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
-msgstr ""
+msgstr "Adăugați text tăiat cu o linie (%{modifierKey}⇧X)"
msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
-msgstr ""
+msgstr "Adăugați text tăiat cu o linie (%{modifier_key}⇧X)"
msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
+msgstr "Acceptă %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
msgid "Marked For Deletion At - %{deletion_time}"
-msgstr ""
+msgstr "S-a marcat pentru ștergere la - %{deletion_time}"
msgid "Marked as draft. Can only be merged when marked as ready."
msgstr "Marcat ca draft. Poate fi îmbinat doar atunci când este marcat ca fiind finalizat."
@@ -23653,11 +24058,14 @@ msgstr "Marcat ca gata. Îmbinarea este acum permisă."
msgid "Marked this %{noun} as a draft."
msgstr "Acest %{noun} a fost marcat ca un draft"
+msgid "Marked this %{noun} as ready."
+msgstr "Acest/această %{noun} a fost marcat(ă) ca fiind gata."
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
+msgstr "S-a marcat această problemă ca fiind un duplicat al %{duplicate_param}."
msgid "Marked this issue as related to %{issue_ref}."
-msgstr ""
+msgstr "S-a marcat această problemă ca fiind legată de %{issue_ref}."
msgid "Marked to do as done."
msgstr "S-a marcat de făcut ca terminat."
@@ -23665,11 +24073,14 @@ msgstr "S-a marcat de făcut ca terminat."
msgid "Marks this %{noun} as a draft."
msgstr "Marchează acest %{noun} ca fiind un draft."
+msgid "Marks this %{noun} as ready."
+msgstr "Marchează acest/această %{noun} ca fiind gata."
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
+msgstr "Marchează această problemă ca duplicat de %{duplicate_reference}."
msgid "Marks this issue as related to %{issue_ref}."
-msgstr ""
+msgstr "Marchează această problemă ca fiind legată de %{issue_ref}."
msgid "Marks to do as done."
msgstr "Marchează de făcut ca terminat."
@@ -23678,19 +24089,19 @@ msgid "Mask variable"
msgstr "Mascați variabila"
msgid "Match not found; try refining your search query."
-msgstr ""
+msgstr "Potrivirea nu a fost găsită; încercați să vă rafinați interogarea de căutare."
msgid "Mattermost"
-msgstr ""
+msgstr "Mattermost"
msgid "Mattermost URL:"
-msgstr ""
+msgstr "URL-ul Mattermost:"
msgid "Mattermost notifications"
-msgstr ""
+msgstr "Notificări Mattermost"
msgid "MattermostService|Add to Mattermost"
-msgstr "Adăugați la Mattermost"
+msgstr "Adăugare la Mattermost"
msgid "MattermostService|After you configure the integration, view your new Mattermost commands by entering"
msgstr "După ce configurați integrarea, vizualizați noile comenzi Mattermost introducând"
@@ -23720,46 +24131,46 @@ msgid "MattermostService|Use this service to perform common tasks in your projec
msgstr "Utilizați acest serviciu pentru a efectua operațiuni comune în proiectul dvs. prin introducerea de comenzi slash în Mattermost."
msgid "Max 100,000 events"
-msgstr ""
+msgstr "Max 100.000 de evenimente"
msgid "Max Value"
msgstr "Valoarea maximă"
msgid "Max authenticated Git LFS requests per period per user"
-msgstr "Maximum cereri Git LFS autentificate pe perioadă pe utilizator"
+msgstr "Numărul maxim de solicitări autentificate Git LFS pe perioadă și pe utilizator"
msgid "Max file size is 200 KB."
-msgstr ""
+msgstr "Mărimea maximă a fișierului este de 200 KB."
msgid "Max role"
-msgstr ""
+msgstr "Rolul maxim"
msgid "Max seats used"
msgstr "Max. seat-uri utilizate"
msgid "Max session time"
-msgstr ""
+msgstr "Durata maximă a sesiunii"
msgid "Maximum 20 characters"
msgstr "Maxim 20 de caractere"
msgid "Maximum Conan package file size in bytes"
-msgstr "Dimensiunea maximă a fișierului pachetului Conan în octeți"
+msgstr "Mărimea maximă a fișierului pachetului Conan în octeți"
msgid "Maximum Helm chart file size in bytes"
-msgstr "Dimensiunea maximă a fișierului graficului Helm în octeți"
+msgstr "Mărimea maximă a fișierului graficului Helm în octeți"
msgid "Maximum Maven package file size in bytes"
-msgstr "Dimensiunea maximă a fișierului pachetului Maven în octeți"
+msgstr "Mărimea maximă a fișierului pachetului Maven în octeți"
msgid "Maximum NuGet package file size in bytes"
-msgstr "Dimensiunea maximă a fișierului pachetului NuGet în octeți"
+msgstr "Mărimea maximă a fișierului pachetului NuGet în octeți"
msgid "Maximum PyPI package file size in bytes"
-msgstr "Dimensiunea maximă a fișierului pachetului PyPI în octeți"
+msgstr "Mărimea maximă a fișierului pachetului PyPI în octeți"
msgid "Maximum Terraform Module package file size in bytes"
-msgstr "Dimensiunea maximă a fișierului pachetului modulului Terraform în octeți"
+msgstr "Mărimea maximă a fișierului pachetului modulului Terraform în octeți"
msgid "Maximum Users"
msgstr "Numărul maxim de utilizatori"
@@ -23774,16 +24185,16 @@ msgid "Maximum allowed lifetime for SSH keys (in days)"
msgstr "Durata de viață maximă permisă pentru cheile SSH (în zile)"
msgid "Maximum artifacts size"
-msgstr ""
+msgstr "Mărimea maximă a artefactelor"
msgid "Maximum artifacts size (MB)"
-msgstr "Dimensiunea maximă a artefactelor (MB)"
+msgstr "Mărimea maximă a artefactelor (MB)"
msgid "Maximum attachment size"
-msgstr "Dimensiune maximă atașament"
+msgstr "Mărimea maximă a atașamentului"
msgid "Maximum attachment size (MB)"
-msgstr ""
+msgstr "Mărimea maximă a atașamentului (MB)"
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "Numărul maxim de solicitări API autentificate pe perioada limită de ratei pe utilizator"
@@ -23792,70 +24203,70 @@ msgid "Maximum authenticated web requests per rate limit period per user"
msgstr "Maximum de solicitări web autentificate pe perioadă limită a ratei pe utilizator"
msgid "Maximum bulk request size (MiB)"
-msgstr ""
+msgstr "Mărimea maximă a solicitării în bloc (MiB)"
msgid "Maximum capacity"
-msgstr ""
+msgstr "Capacitatea maximă"
msgid "Maximum character limit - %{limit}"
-msgstr ""
+msgstr "Limita maximă de caractere - %{limit}"
msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation."
msgstr "Concurența maximă a solicitărilor în bloc Elasticsearch pe operație de indexare."
msgid "Maximum delay (Minutes)"
-msgstr ""
+msgstr "Întârzierea maximă (minute)"
msgid "Maximum diff patch size"
-msgstr "Dimensiunea maximă a patch-ului diff"
+msgstr "Mărimea maximă a patch-ului diff"
msgid "Maximum diff patch size (Bytes)"
-msgstr "Dimensiunea maximă a patch-ului diff (Octeți)"
+msgstr "Mărimea maximă a patch-ului diff (Octeți)"
msgid "Maximum duration of a session."
msgstr "Durata maximă a unei sesiuni."
msgid "Maximum export size"
-msgstr ""
+msgstr "Mărimea maximă a exportului"
msgid "Maximum export size (MB)"
-msgstr ""
+msgstr "Mărimea maximă a exportului (MB)"
msgid "Maximum field length"
-msgstr ""
+msgstr "Lungimea maximă a câmpului"
msgid "Maximum file size indexed (KiB)"
-msgstr ""
+msgstr "Mărimea maximă a fișierului indexată (KiB)"
msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
-msgstr "Dimensiunea maximă a fișierului este 1 MB. Dimensiunea imaginii trebuie să fie de 32 x 32 pixeli. Formatele permise de imagine sunt %{favicon_extension_whitelist}."
+msgstr "Mărimea maximă a fișierului este de 1 MB. Dimensiunea imaginii trebuie să fie de 32 x 32 pixeli. Formatele de imagine permise sunt %{favicon_extension_whitelist}."
msgid "Maximum file size is 1MB. Pages are optimized for a 24px tall header logo"
msgstr "Mărimea maximă a fișierului este de 1 MB. Paginile sunt optimizate pentru un logo de antet înalt de 24px."
msgid "Maximum file size is 1MB. Pages are optimized for a 640x360 px logo."
-msgstr "Dimensiunea maximă a fișierului este de 1 MB. Pages este optimizat pentru un logo de 640x360 px."
+msgstr "Mărimea maximă a fișierului este de 1 MB. Pages este optimizat pentru un logo de 640x360 px."
msgid "Maximum files in a diff"
-msgstr ""
+msgstr "Numărul maxim de fișiere într-un diff"
msgid "Maximum group export download requests per minute"
msgstr "Maximum de solicitări de descărcare a exportului de grup pe minut"
msgid "Maximum group export requests per minute"
-msgstr "Maximum de solicitări de export al grupului pe minut"
+msgstr "Maximum de solicitări de export de grup pe minut"
msgid "Maximum group import requests per minute"
-msgstr "Maximum de solicitări de import al grupului pe minut"
+msgstr "Maximum de solicitări de import de grup pe minut"
msgid "Maximum import size"
-msgstr "Mărime maximă import"
+msgstr "Mărimea maximă a importului"
msgid "Maximum import size (MB)"
-msgstr ""
+msgstr "Mărimea maximă a importului (MB)"
msgid "Maximum job artifact size"
-msgstr "Mărime maximă artefact job"
+msgstr "Mărimea maximă a artefactului jobului"
msgid "Maximum job timeout"
msgstr "Timeout maxim de job"
@@ -23864,10 +24275,10 @@ msgid "Maximum job timeout has a value which could not be accepted"
msgstr "Timeout-ul maxim al jobului are o valoare care nu a putut fi acceptată"
msgid "Maximum lines in a diff"
-msgstr ""
+msgstr "Numărul maxim de linii într-un diff"
msgid "Maximum npm package file size in bytes"
-msgstr "Dimensiunea maximă a fișierului pachetului npm în octeți"
+msgstr "Mărimea maximă a fișierului pachetului npm în octeți"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Numărul maxim de %{name} (%{count}) a fost depășit"
@@ -23876,16 +24287,16 @@ msgid "Maximum number of changes (branches or tags) in a single push for which w
msgstr "Numărul maxim de modificări (ramuri sau etichete) într-un singur push pentru care se declanșează webhook-urile și serviciile (valoarea implicită este 3)."
msgid "Maximum number of comments exceeded"
-msgstr ""
+msgstr "Numărul maxim de comentarii a fost depășit"
msgid "Maximum number of mirrors that can be synchronizing at the same time."
-msgstr ""
+msgstr "Numărul maxim de replici care pot fi sincronizate în același timp."
msgid "Maximum number of projects."
-msgstr ""
+msgstr "Numărul maxim de proiecte."
msgid "Maximum number of requests per minute"
-msgstr ""
+msgstr "Numărul maxim de solicitări pe minut"
msgid "Maximum number of requests per minute for an authenticated user"
msgstr "Numărul maxim de solicitări pe minut pentru un utilizator autentificat"
@@ -23900,16 +24311,16 @@ msgid "Maximum number of unique IP addresses per user."
msgstr "Numărul maxim de adrese IP unice pe utilizator."
msgid "Maximum of 255 characters"
-msgstr ""
+msgstr "Maxim 255 de caractere"
msgid "Maximum page reached"
-msgstr ""
+msgstr "Maximum de pagini a fost atins"
msgid "Maximum page size"
-msgstr "Mărime maximă pagină"
+msgstr "Mărimea maximă a paginii"
msgid "Maximum project export download requests per minute"
-msgstr "Maximum de solicitări de descărcare a exportului de proiect pe minut"
+msgstr "Maximum de solicitări de descărcare de export de proiecte pe minut"
msgid "Maximum project export requests per minute"
msgstr "Maximum de solicitări de export de proiecte pe minut"
@@ -23918,13 +24329,13 @@ msgid "Maximum project import requests per minute"
msgstr "Maximum de solicitări de import de proiecte pe minut"
msgid "Maximum push size"
-msgstr "Mărime maximă push"
+msgstr "Mărime maximă de push"
msgid "Maximum push size (MB)"
-msgstr ""
+msgstr "Mărimea maximă de push (MB)"
msgid "Maximum requests per 10 minutes per user"
-msgstr ""
+msgstr "Maximum de solicitări pe 10 minute pe utilizator"
msgid "Maximum requests per minute"
msgstr "Solicitări maxime pe minut"
@@ -23933,31 +24344,31 @@ msgid "Maximum running slices"
msgstr "Maximum de tranșe care rulează"
msgid "Maximum size limit for a single commit."
-msgstr ""
+msgstr "Limita maximă a mărimii pentru un singur commit."
msgid "Maximum size limit for each repository."
-msgstr ""
+msgstr "Limita maximă a mărimii pentru fiecare repozitoriu."
msgid "Maximum size of Elasticsearch bulk indexing requests."
-msgstr "Dimensiunea maximă a cererilor de indexare în bloc Elasticsearch."
+msgstr "Mărimea maximă a solicitărilor de indexare în bloc Elasticsearch."
msgid "Maximum size of export files."
-msgstr ""
+msgstr "Mărimea maximă a fișierelor de export."
msgid "Maximum size of import files."
-msgstr ""
+msgstr "Mărimea maximă a fișierelor de import."
msgid "Maximum size of individual attachments in comments."
-msgstr ""
+msgstr "Mărimea maximă a atașamentelor individuale în comentarii."
msgid "Maximum size of pages (MB)"
-msgstr ""
+msgstr "Mărimea maximă a paginilor (MB)"
msgid "Maximum snippet size"
msgstr "Mărimea maximă a fragmentului de cod"
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
-msgstr ""
+msgstr "Timpul maxim între actualizări pe care o replică o poate avea atunci când este programată să se sincronizeze."
msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr "Timpul maxim în care utilizatorii au voie să sară peste configurarea autentificării cu doi factori (în ore). Setați la 0 (zero) pentru a aplica la următoarea autentificare."
@@ -23975,25 +24386,25 @@ msgid "May"
msgstr "Mai"
msgid "Mean time to merge"
-msgstr ""
+msgstr "Timpul mediu de îmbinare"
msgid "Measured in bytes of code. Excludes generated and vendored code."
-msgstr ""
+msgstr "Numărul de octeți de cod măsurat. Se exclud codurile generate automat și cele furnizate."
msgid "Medium timeout"
msgstr "Timeout mediu"
msgid "Medium vulnerabilities present"
-msgstr ""
+msgstr "Prezintă vulnerabilități medii"
msgid "Member since"
-msgstr ""
+msgstr "Membru din"
msgid "Member since %{date}"
-msgstr ""
+msgstr "Membru din %{date}"
msgid "Member since:"
-msgstr ""
+msgstr "Membru din:"
msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
msgstr "%{member_name} v-a invitat să vă alăturați la GitLab"
@@ -24008,22 +24419,22 @@ msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_ope
msgstr "Membrii pot fi adăugați de către %{i_open}Întreținătorii%{i_close} sau %{i_open}Proprietarii%{i_close} de proiect."
msgid "Members listed as CODEOWNERS of affected files."
-msgstr ""
+msgstr "Membrii listați în calitate de CODEOWNERS ai fișierelor afectate."
msgid "Members of %{group} can also merge into this branch: %{branch}"
-msgstr ""
+msgstr "Membrii %{group} pot, de asemenea, să îmbine în această ramură: %{branch}"
msgid "Members of %{group} can also push to this branch: %{branch}"
-msgstr ""
+msgstr "Membrii %{group} pot, de asemenea, să facă push către această ramură: %{branch}"
msgid "Members of a group may only view projects they have permission to access"
-msgstr ""
+msgstr "Membrii unui grup pot vizualiza numai proiectele pe care au permisiunea de a le accesa"
msgid "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seat in use and will be billed for the overage."
msgid_plural "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seats in use and will be billed for the overage."
msgstr[0] "În cazul în care continuați, grupul %{groupName} va avea %{quantity} seat în uz și va fi facturat pentru depășire."
-msgstr[1] "În cazul în care continuați, grupul %{groupName} va avea %{quantity} seats în uz și va fi facturat pentru depășire."
-msgstr[2] "În cazul în care continuați, grupul %{groupName} va avea %{quantity} de seats în uz și va fi facturat pentru depășire."
+msgstr[1] "În cazul în care continuați, grupul %{groupName} va avea %{quantity} seat-uri în uz și va fi facturat pentru depășire."
+msgstr[2] "În cazul în care continuați, grupul %{groupName} va avea %{quantity} de seat-uri în uz și va fi facturat pentru depășire."
msgid "MembersOverage|You are about to incur additional charges"
msgstr "Sunteți pe cale să suportați costuri suplimentare"
@@ -24031,8 +24442,8 @@ msgstr "Sunteți pe cale să suportați costuri suplimentare"
msgid "MembersOverage|Your subscription includes %d seat."
msgid_plural "MembersOverage|Your subscription includes %d seats."
msgstr[0] "Abonamentul dvs. include %d seat."
-msgstr[1] "Abonamentul dvs. include %d seats."
-msgstr[2] "Abonamentul dvs. include %d de seats."
+msgstr[1] "Abonamentul dvs. include %d seat-uri."
+msgstr[2] "Abonamentul dvs. include %d de seat-uri."
msgid "Membership"
msgstr "Apartenență"
@@ -24137,31 +24548,31 @@ msgid "Members|Search invited"
msgstr "Căutați invitați"
msgid "Member|Deny access"
-msgstr ""
+msgstr "Refuzați accesul"
msgid "Member|Revoke invite"
-msgstr ""
+msgstr "Revocați invitația"
msgid "Memory Usage"
-msgstr ""
+msgstr "Utilizarea memoriei"
msgid "Menu"
-msgstr ""
+msgstr "Meniul"
msgid "Merge"
-msgstr ""
+msgstr "ÃŽmbinare"
msgid "Merge Conflicts"
-msgstr ""
+msgstr "Conflicte de îmbinare"
msgid "Merge Request"
-msgstr ""
+msgstr "Merge request"
msgid "Merge Request Analytics"
-msgstr ""
+msgstr "Analiza merge request-urilor"
msgid "Merge Requests"
-msgstr "Merge Request-uri"
+msgstr "Merge request-uri"
msgid "Merge Requests created"
msgstr "Merge request-uri create"
@@ -24173,7 +24584,7 @@ msgid "Merge Requests merged"
msgstr "Merge request-uri îmbinate"
msgid "Merge automatically (%{strategy})"
-msgstr ""
+msgstr "Îmbinare automată (%{strategy})"
msgid "Merge blocked: all merge request dependencies must be merged."
msgstr "Îmbinare blocată: toate dependențele merge request-ului trebuie să fie îmbinate."
@@ -24182,7 +24593,7 @@ msgid "Merge blocked: merge request must be marked as ready. It's still marked a
msgstr "Îmbinare blocată: merge request-ul trebuie să fie marcat ca gata. Este încă marcat ca draft."
msgid "Merge blocked: new changes were just added."
-msgstr "Îmbinare blocată: tocmai au fost adăugate modificări noi."
+msgstr "Merge blocat: tocmai au fost adăugate noi modificări."
msgid "Merge blocked: pipeline must succeed. It's waiting for a manual job to continue."
msgstr "Îmbinare blocată: pipeline-ul trebuie să reușească. Se așteaptă un job manual pentru a continua."
@@ -24200,16 +24611,16 @@ msgid "Merge details"
msgstr "Detalii de îmbinare"
msgid "Merge events"
-msgstr ""
+msgstr "Evenimente de îmbinare"
msgid "Merge immediately"
msgstr "Îmbinare imediată"
msgid "Merge in progress"
-msgstr ""
+msgstr "Îmbinare în curs"
msgid "Merge locally"
-msgstr ""
+msgstr "Îmbinare locală"
msgid "Merge options"
msgstr "Opțiuni de îmbinare"
@@ -24218,16 +24629,16 @@ msgid "Merge request"
msgstr "Merge request"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
-msgstr ""
+msgstr "Merge request-ul %{mr_link} a fost revizuit de %{mr_author}"
msgid "Merge request actions"
msgstr "Acțiuni de merge request"
msgid "Merge request analytics"
-msgstr ""
+msgstr "Analiza merge request-urilor"
msgid "Merge request approvals"
-msgstr ""
+msgstr "Aprobări de merge request-uri"
msgid "Merge request commits"
msgstr "Commit-uri de merge request"
@@ -24236,7 +24647,10 @@ msgid "Merge request dependencies"
msgstr "Dependențele merge request-ului"
msgid "Merge request events"
-msgstr ""
+msgstr "Evenimente de merge request-uri"
+
+msgid "Merge request locked."
+msgstr "Merge request blocat."
msgid "Merge request not merged"
msgstr "Merge request-uri neîmbinate"
@@ -24244,8 +24658,11 @@ msgstr "Merge request-uri neîmbinate"
msgid "Merge request reports"
msgstr "Rapoarte de merge request-uri"
+msgid "Merge request unlocked."
+msgstr "Merge request deblocat."
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
-msgstr ""
+msgstr "Merge request-ul a fost programat pentru îmbinare după ce pipeline-ul reușește"
msgid "Merge requests"
msgstr "Merge request-uri"
@@ -24266,7 +24683,7 @@ msgid "Merge unverified changes?"
msgstr "Îmbinați modificările neverificate?"
msgid "Merge when pipeline succeeds"
-msgstr ""
+msgstr "Se îmbină atunci când pipeline-ul reușește"
msgid "Merge..."
msgstr "ÃŽmbinarea..."
@@ -24296,25 +24713,25 @@ msgid "MergeConflict|origin//their changes"
msgstr "origin//modificările lor"
msgid "MergeRequestAnalytics|Assignees"
-msgstr ""
+msgstr "Responsabili"
msgid "MergeRequestAnalytics|Date Merged"
-msgstr ""
+msgstr "Data îmbinării"
msgid "MergeRequestAnalytics|Line changes"
-msgstr ""
+msgstr "Modificări de linie"
msgid "MergeRequestAnalytics|Merge Request"
-msgstr ""
+msgstr "Merge request"
msgid "MergeRequestAnalytics|Milestone"
-msgstr ""
+msgstr "Obiective"
msgid "MergeRequestAnalytics|Pipelines"
-msgstr ""
+msgstr "Pipeline-uri"
msgid "MergeRequestAnalytics|Time to merge"
-msgstr ""
+msgstr "Timp până la îmbinare"
msgid "MergeRequestApprovals|Define approval rules and settings to ensure %{link_start}separation of duties%{link_end} for new merge requests."
msgstr "Definiți regulile și setările aprobărilor pentru a asigura %{link_start}separarea sarcinilor%{link_end} pentru noile merge request-uri."
@@ -24409,14 +24826,14 @@ msgstr "Eroare la încărcarea întregului diff. Vă rugăm să încercați din
msgid "MergeRequest|No files found"
msgstr "Nu au fost găsite fișiere"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
-msgstr "Căutați fișiere (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgstr "Căutare (de exemplu, *.vue) (%{modifier_key}P)"
msgid "Merged"
msgstr "ÃŽmbinat"
msgid "Merged MRs"
-msgstr ""
+msgstr "MR-uri îmbinate"
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 "Ramurile îmbinate sunt în curs de ștergere. Acest lucru poate dura ceva timp, în funcție de numărul de ramuri. Vă rugăm să reîmprospătați pagina pentru a vedea modificările."
@@ -24425,10 +24842,10 @@ msgid "Merged by"
msgstr "ÃŽmbinat de"
msgid "Merged this merge request."
-msgstr ""
+msgstr "Acest merge request a fost îmbinat."
msgid "Merged: %{merged}"
-msgstr ""
+msgstr "ÃŽmbinat: %{merged}"
msgid "Merges this merge request immediately."
msgstr "Îmbină imediat acest merge request."
@@ -24436,26 +24853,29 @@ msgstr "Îmbină imediat acest merge request."
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr "Nu se recomandă îmbinarea imediată, deoarece poate avea un impact negativ asupra merge train-ului existent. Citiți %{docsLinkStart}documentația%{docsLinkEnd} pentru mai multe informații."
+msgid "Mermaid diagram"
+msgstr "Diagrama Mermaid"
+
msgid "Message"
-msgstr ""
+msgstr "Mesaj"
msgid "Messages"
-msgstr ""
+msgstr "Mesaje"
msgid "Method"
-msgstr ""
+msgstr "Metodă"
msgid "Method call threshold (ms)"
-msgstr "Prag metodă apel (ms)"
+msgstr "Pragul metodei de apel (ms)"
msgid "Metric was successfully added."
-msgstr ""
+msgstr "Metrica a fost adăugată cu succes."
msgid "Metric was successfully updated."
-msgstr ""
+msgstr "Metrica a fost actualizată cu succes."
msgid "Metric:"
-msgstr ""
+msgstr "Metrică:"
msgid "MetricChart|Please select a metric"
msgstr "Vă rugăm să selectați o metrică"
@@ -24482,13 +24902,13 @@ msgid "MetricImages|There was an issue uploading your image."
msgstr "A apărut o problemă la încărcarea imaginii dvs."
msgid "Metrics"
-msgstr ""
+msgstr "Metrici"
msgid "Metrics - Grafana"
-msgstr ""
+msgstr "Metrici - Grafana"
msgid "Metrics - Prometheus"
-msgstr ""
+msgstr "Metrici - Prometheus"
msgid "Metrics Dashboard"
msgstr "Tabloul de bord al metricilor"
@@ -24503,7 +24923,7 @@ msgid "Metrics Dashboard YAML definition is valid."
msgstr "Definiția YAML a Tabloul de bord al metricilor este validă."
msgid "Metrics and profiling"
-msgstr ""
+msgstr "Metrici și profilare"
msgid "Metrics:"
msgstr "Metrici:"
@@ -24548,7 +24968,7 @@ msgid "MetricsSettings|Manage metrics dashboard settings."
msgstr "Gestionați setările tabloul de bord al metricilor"
msgid "MetricsSettings|Metrics"
-msgstr ""
+msgstr "Metrici"
msgid "MetricsSettings|UTC (Coordinated Universal Time)"
msgstr "UTC (Timpul universal coordonat)"
@@ -24569,10 +24989,10 @@ msgid "Metrics|2. Paste panel YAML into dashboard"
msgstr "2. Lipiți panoul YAML în dashboard"
msgid "Metrics|Add metric"
-msgstr "Adăugați o metrică"
+msgstr "Adăugare metrică"
msgid "Metrics|Add panel"
-msgstr "Adăugați un panou"
+msgstr "Adăugare panou"
msgid "Metrics|Avg"
msgstr "Med"
@@ -24599,19 +25019,19 @@ msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
msgstr "Copiați și lipiți YAML-ul panoului în fișierul YAML al dashboard-ului dumneavoastră."
msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Creați un dashboard personalizat %{fileName}"
+msgstr "Creați un tablou de bord personalizat %{fileName}"
msgid "Metrics|Create metric"
msgstr "Creați o metrică"
msgid "Metrics|Create new dashboard"
-msgstr "Creați un nou dashboard"
+msgstr "Creați un nou tablou de bord"
msgid "Metrics|Create your dashboard configuration file"
-msgstr "Creați fișierul de configurare al dashboard-ului dumneavoastră"
+msgstr "Creați-vă fișierul de configurare al tabloului de bord"
msgid "Metrics|Current"
-msgstr "Curent"
+msgstr "Actual"
msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
msgstr "Fișierele dashboard-ului pot fi găsite în %{codeStart}.gitlab/dashboards%{codeEnd} la rădăcina acestui proiect."
@@ -24787,9 +25207,6 @@ msgstr "Valori"
msgid "Metrics|View documentation"
msgstr "Vizualizați documentația"
-msgid "Metrics|View logs"
-msgstr "Vizualizați jurnalele"
-
msgid "Metrics|Y-axis label"
msgstr "Eticheta axei Y"
@@ -24821,52 +25238,52 @@ msgid "Mi"
msgstr "Mi"
msgid "Migrated %{success_count}/%{total_count} files."
-msgstr ""
+msgstr "%{success_count}/%{total_count} de fișiere migrate."
msgid "Migration"
-msgstr ""
+msgstr "Migrare"
msgid "Migration has been scheduled to be retried"
-msgstr ""
+msgstr "Migrarea a fost programată pentru a fi reîncercată"
msgid "Migration successful."
-msgstr ""
+msgstr "Migrarea a reușit."
msgid "Milestone"
msgid_plural "Milestones"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Obiectiv"
+msgstr[1] "Obiective"
+msgstr[2] "Obiective"
msgid "Milestone due date"
msgstr "Data scadentă a obiectivului"
msgid "Milestone lists not available with your current license"
-msgstr ""
+msgstr "Listele de obiective nu sunt disponibile cu licența dvs. actuală"
msgid "MilestoneCombobox|An error occurred while searching for milestones"
-msgstr "A apărut o eroare în timpul căutării pentru obiective"
+msgstr "S-a produs o eroare în timpul căutării pentru obiective"
msgid "MilestoneCombobox|Group milestones"
-msgstr ""
+msgstr "Obiective de grup"
msgid "MilestoneCombobox|Milestone"
-msgstr ""
+msgstr "Obiectiv"
msgid "MilestoneCombobox|No matching results"
msgstr "Nicio potrivire de rezultate"
msgid "MilestoneCombobox|No milestone"
-msgstr ""
+msgstr "Niciun obiectiv"
msgid "MilestoneCombobox|Project milestones"
-msgstr ""
+msgstr "Obiectivele proiectului"
msgid "MilestoneCombobox|Search Milestones"
-msgstr ""
+msgstr "Căutați obiective"
msgid "MilestoneCombobox|Select milestone"
-msgstr ""
+msgstr "Selectați obiective"
msgid "MilestoneSidebar|Closed:"
msgstr "ÃŽnchise:"
@@ -24926,7 +25343,7 @@ msgid "MilestoneSidebar|complete"
msgstr "complet"
msgid "Milestones"
-msgstr ""
+msgstr "Obiectiv"
msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle} and remove it from %{issuesWithCount} and %{mergeRequestsWithCount}. Once deleted, it cannot be undone or recovered."
msgstr "Sunteți pe cale să ștergeți definitiv obiectivul %{milestoneTitle} și să-l înlăturați din %{issuesWithCount} și %{mergeRequestsWithCount}. Odată șters, acesta nu mai poate fi anulat sau recuperat."
@@ -25001,10 +25418,10 @@ msgid "Min Value"
msgstr "Valoare minimă"
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
-msgstr ""
+msgstr "Capacitatea minimă care trebuie să fie disponibilă înainte de a programa mai multe replici în mod preventiv."
msgid "Minutes"
-msgstr ""
+msgstr "Minute"
msgid "Mirror direction"
msgstr "Direcția replicării"
@@ -25022,169 +25439,169 @@ msgid "Mirror user"
msgstr "Utilizatorul replicii"
msgid "Mirrored repositories"
-msgstr ""
+msgstr "Repozitorii replicate"
msgid "Mirroring repositories"
msgstr "Replicarea repozitoriilor"
msgid "Mirroring settings were successfully updated."
-msgstr ""
+msgstr "Setările de replicare au fost actualizate cu succes."
msgid "Mirroring settings were successfully updated. The project is being updated."
-msgstr ""
+msgstr "Setările de replicare au fost actualizate cu succes. Proiectul este în curs de actualizare."
msgid "Mirroring was successfully disabled."
-msgstr ""
+msgstr "Replicarea a fost dezactivată cu succes."
msgid "Mirroring will only be available if the feature is included in the plan of the selected group or user."
msgstr "Replicarea va fi disponibilă numai dacă funcția este inclusă în planul grupului sau utilizatorului selectat."
msgid "Miscellaneous"
-msgstr ""
+msgstr "Diverse"
msgid "Missing"
-msgstr ""
+msgstr "Lipsește"
msgid "Missing OAuth configuration for GitHub."
msgstr "Lipsește configurația OAuth pentru GitHub."
msgid "Missing OS"
-msgstr ""
+msgstr "SO absent"
msgid "Missing arch"
-msgstr ""
+msgstr "Lipsește arhitectura"
msgid "Missing commit signatures endpoint!"
-msgstr ""
+msgstr "Lipsește punctul final al semnăturilor commit-ului!"
msgid "MissingSSHKeyWarningLink|Add SSH key"
-msgstr ""
+msgstr "Adăugați cheia SSH"
msgid "MissingSSHKeyWarningLink|Don't show again"
-msgstr ""
+msgstr "Nu mai afișați din nou"
msgid "MissingSSHKeyWarningLink|You can't push or pull repositories using SSH until you add an SSH key to your profile."
msgstr "Nu puteți să faceți push sau pull de repozitorii folosind SSH până când nu adăugați o cheie SSH la profilul dumneavoastră."
msgid "MissingSSHKeyWarningLink|You won't be able to pull or push repositories via SSH until you add an SSH key to your profile"
-msgstr "Nu veți putea efectua pull sau push de repozitorii prin SSH până când nu adăugați o cheie SSH la profilul dumneavoastră."
+msgstr "Nu veți putea face pull sau push de repozitorii prin SSH până când nu adăugați o cheie SSH la profilul dvs."
msgid "ModalButton|Add projects"
-msgstr ""
+msgstr "Adăugare proiecte"
msgid "Modal|Close"
-msgstr ""
+msgstr "Închideți"
msgid "Modified"
-msgstr ""
+msgstr "Modificat"
msgid "Modified in this version"
-msgstr ""
+msgstr "Modificat în această versiune"
msgid "Modify commit message"
-msgstr ""
+msgstr "Modificați mesajul commit-ului"
msgid "Modify commit messages"
-msgstr ""
+msgstr "Modificați mesajele commit-urilor"
msgid "Modify merge commit"
msgstr "Modificați commit-ul îmbinării"
msgid "Monday"
-msgstr ""
+msgstr "Luni"
msgid "Monitor"
-msgstr ""
+msgstr "Monitor"
msgid "Monitor Settings"
-msgstr ""
+msgstr "Setări monitor"
msgid "Monitor the health and performance of GitLab with Prometheus."
msgstr "Monitorizați sănătatea și performanța GitLab cu Prometheus."
msgid "Monitor your errors by integrating with Sentry."
-msgstr ""
+msgstr "Monitorizați erorile prin integrarea cu Sentry."
msgid "Monitoring"
-msgstr ""
+msgstr "Monitorizare"
msgid "Month"
-msgstr ""
+msgstr "Lună"
msgid "Months"
-msgstr ""
+msgstr "Luni"
msgid "More Details"
msgstr "Mai multe detalii"
msgid "More Information"
-msgstr ""
+msgstr "Mai multe informații"
msgid "More actions"
-msgstr ""
+msgstr "Mai multe acțiuni"
msgid "More details"
-msgstr ""
+msgstr "Mai multe detalii"
msgid "More info"
-msgstr ""
+msgstr "Mai multe informații"
msgid "More information"
-msgstr "Mai multe informatii"
+msgstr "Mai multe informații"
msgid "More information and share feedback"
-msgstr ""
+msgstr "Mai multe informații și împărtășiți feedback-ul"
msgid "More information is available|here"
msgstr "Mai multe informații sunt disponibile|aici"
msgid "More information."
-msgstr ""
+msgstr "Mai multe informații"
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
-msgstr ""
+msgstr "Mai mult de %{number_commits_distance} (de) commit-uri diferit față de %{default_branch}"
msgid "More topics"
msgstr "Mai multe subiecte"
msgid "Most common"
-msgstr ""
+msgstr "Cele mai comune"
msgid "Most relevant"
-msgstr ""
+msgstr "Cel mai relevant"
msgid "Most stars"
-msgstr ""
+msgstr "Cele mai multe stele"
msgid "Mount point %{mounted_as} not found in %{model_class}."
-msgstr ""
+msgstr "Punctul de montare %{mounted_as} nu a fost găsit în %{model_class}."
msgid "Move"
-msgstr ""
+msgstr "Mutare"
msgid "Move down"
-msgstr ""
+msgstr "Mutare in jos"
msgid "Move issue"
-msgstr ""
+msgstr "Mutare problemă"
msgid "Move issue from one column of the board to another"
-msgstr ""
+msgstr "Mutați problema de pe o coloană a bordului pe alta"
msgid "Move selection down"
-msgstr ""
+msgstr "Mutare selecție în jos"
msgid "Move selection up"
-msgstr ""
+msgstr "Mutare selecție în sus"
msgid "Move test case"
msgstr "Mutați cazul de testare"
msgid "Move this issue to another project."
-msgstr ""
+msgstr "Mutați această problemă într-un alt proiect."
msgid "Move up"
-msgstr ""
+msgstr "Mutare în sus"
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr "Problema nu poate fi mutată din cauza permisiunilor insuficiente!"
@@ -25199,22 +25616,22 @@ msgid "Moved issue to %{label} column in the board."
msgstr "Problema a fost mutată în coloana %{label} de pe bord."
msgid "Moved this issue to %{path_to_project}."
-msgstr ""
+msgstr "S-a mutat această problemă în %{path_to_project}."
msgid "Moves issue to %{label} column in the board."
msgstr "Problema a fost mutată în coloana %{label} de pe bord."
msgid "Moves this issue to %{path_to_project}."
-msgstr ""
+msgstr "Mută această problemă în %{path_to_project}."
msgid "MrDeploymentActions|Deploy"
-msgstr ""
+msgstr "Distribuiți"
msgid "MrDeploymentActions|Re-deploy"
-msgstr ""
+msgstr "Redistribuiți"
msgid "MrDeploymentActions|Stop environment"
-msgstr ""
+msgstr "Opriți mediul"
msgid "MrList|Assigned to %{name}"
msgstr "Atribuit lui %{name}"
@@ -25228,8 +25645,23 @@ msgstr "Atenție solicitată de la revizorul %{name}"
msgid "MrList|Review requested from %{name}"
msgstr "Revizuire solicitată de la %{name}"
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr "Continuând, sunteți de acord că răspunsurile vor fi folosite în scopul îmbunătățirii GitLab și în conformitate cu %{linkStart}Politica de confidențialitate GitLab%{linkEnd}."
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr "Cât de mulțumit sunteți de %{strongStart}viteza/performanța%{strongEnd} merge request-urilor?"
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr "Sondaj privind experiența cu merge request-urile"
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr "În general, cât de mulțumit sunteți de merge request-uri?"
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr "Vă mulțumim pentru feedback!"
+
msgid "Multi-project"
-msgstr ""
+msgstr "Multi-proiect"
msgid "Multiple HTTP integrations are not supported for this project"
msgstr "Integrările HTTP multiple nu sunt acceptate pentru acest proiect"
@@ -25240,9 +25672,6 @@ msgstr "Sunt acceptate mai multe intervale de adrese IP."
msgid "Multiple Prometheus integrations are not supported"
msgstr "Integrările multiple Prometheus nu sunt acceptate"
-msgid "Multiple domains are supported."
-msgstr "Sunt acceptate domenii multiple."
-
msgid "Multiple model types found: %{model_types}"
msgstr "Au fost găsite mai multe tipuri de modele: %{model_types}"
@@ -25253,34 +25682,37 @@ msgid "Multiplier to apply to polling intervals. Decimal values are supported. D
msgstr "Multiplicator aplicabil intervalelor de sondare. Sunt acceptate valorile zecimale. Valoarea implicită este 1."
msgid "My awesome group"
-msgstr ""
+msgstr "Grupul meu formidabil"
msgid "My company or team"
-msgstr ""
+msgstr "Compania sau echipa mea"
msgid "My topic"
msgstr "Subiectul meu"
msgid "My-Reaction"
-msgstr ""
+msgstr "Reacția-mea"
+
+msgid "NEW"
+msgstr "NOU"
msgid "Name"
-msgstr ""
+msgstr "Nume"
msgid "Name can't be blank"
-msgstr ""
+msgstr "Numele nu poate fi necompletat"
msgid "Name has already been taken"
-msgstr ""
+msgstr "Numele a fost deja luat"
msgid "Name is already taken."
-msgstr ""
+msgstr "Numele este deja luat."
msgid "Name new label"
-msgstr ""
+msgstr "Denumiți noua etichetă"
msgid "Name:"
-msgstr ""
+msgstr "Nume:"
msgid "Namespace"
msgstr "Spațiu de nume"
@@ -25288,9 +25720,6 @@ msgstr "Spațiu de nume"
msgid "Namespace ID:"
msgstr "ID-ul spațiului de nume:"
-msgid "Namespace is empty"
-msgstr "Spațiul de nume este gol"
-
msgid "Namespace:"
msgstr "Spațiu de nume:"
@@ -25319,7 +25748,7 @@ msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_si
msgstr "Ați atins limita de stocare liberă de %{free_size_limit} pe unul sau mai multe proiecte."
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
-msgstr "faceți push către repozitoriul dvs., creați conducte, creați probleme sau adăugați comentarii. Pentru a reduce capacitatea de stocare, ștergeți repozitoriile, artefactele, wiki-urile, problemele și pipeline-urile neutilizate."
+msgstr "faceți push către repozitoriul dvs., creați pipeline-uri, creați probleme sau adăugați comentarii. Pentru a reduce capacitatea de stocare, ștergeți repozitoriile, artefactele, wiki-urile, problemele și pipeline-urile neutilizate."
msgid "NamespaceStorage|%{name_with_link} namespace has approximately %{percent} (%{size}) namespace storage space remaining."
msgstr "Spațiul de nume %{name_with_link} are aproximativ %{percent} (%{size}) din spațiul de stocare al spațiului de nume rămas disponibil."
@@ -25364,38 +25793,38 @@ msgid "Namespaces to index"
msgstr "Spațiu de nume pentru indexare"
msgid "Naming, topics, avatar"
-msgstr ""
+msgstr "Denumirea, subiecte, avatar"
msgid "Naming, visibility"
-msgstr ""
+msgstr "Denumirea, vizibilitatea"
msgid "Navigate to the project to close the milestone."
-msgstr ""
+msgstr "Navigați la proiect pentru a închide obiectivul."
msgid "Navigation bar"
-msgstr ""
+msgstr "Bara de navigație"
msgid "NavigationTheme|Blue"
msgstr "Albastru"
-msgid "NavigationTheme|Dark"
-msgstr "ÃŽntunecat"
-
msgid "NavigationTheme|Dark Mode (alpha)"
msgstr "Modul întunecat (alfa)"
+msgid "NavigationTheme|Gray"
+msgstr "Gri"
+
msgid "NavigationTheme|Green"
msgstr "Verde"
msgid "NavigationTheme|Indigo"
msgstr "Indigo"
-msgid "NavigationTheme|Light"
-msgstr "Luminos"
-
msgid "NavigationTheme|Light Blue"
msgstr "Albastru deschis"
+msgid "NavigationTheme|Light Gray"
+msgstr "Gri deschis"
+
msgid "NavigationTheme|Light Green"
msgstr "Verde deschis"
@@ -25409,31 +25838,31 @@ msgid "NavigationTheme|Red"
msgstr "Roșu"
msgid "Nav|Help"
-msgstr ""
+msgstr "Ajutor"
msgid "Nav|Home"
-msgstr ""
+msgstr "Acasă"
msgid "Nav|Sign In / Register"
-msgstr ""
+msgstr "Conectare / ÃŽnregistrare"
msgid "Nav|Sign out and sign in with a different account"
-msgstr ""
+msgstr "Deconectați-vă și conectați-vă cu un alt cont"
msgid "Need help?"
-msgstr ""
+msgstr "Aveți nevoie de ajutor?"
msgid "Need your attention"
msgstr "Necesită atenția dvs."
msgid "Needs"
-msgstr ""
+msgstr "Needs"
msgid "Needs attention"
-msgstr ""
+msgstr "Necesită atenție"
msgid "Network"
-msgstr ""
+msgstr "Rețea"
msgid "Network:"
msgstr "Rețea:"
@@ -25448,31 +25877,31 @@ msgid "New %{type} in %{project}"
msgstr "%{type} nou(ă) în %{project}"
msgid "New Application"
-msgstr ""
+msgstr "Aplicație nouă"
msgid "New Branch"
-msgstr ""
+msgstr "Ramură nouă"
msgid "New Deploy Key"
-msgstr ""
+msgstr "Nouă cheie de implementare"
msgid "New Environment"
-msgstr ""
+msgstr "Mediul nou"
msgid "New Epic"
-msgstr ""
+msgstr "Epică nouă"
msgid "New File"
-msgstr ""
+msgstr "Fișier nou"
msgid "New Group"
-msgstr ""
+msgstr "Grup Nou"
msgid "New Group Name"
-msgstr ""
+msgstr "Numele noului grup"
msgid "New Identity"
-msgstr ""
+msgstr "Identitate nouă"
msgid "New Issue"
msgid_plural "New Issues"
@@ -25481,31 +25910,31 @@ msgstr[1] "Probleme noi"
msgstr[2] "Probleme noi"
msgid "New Jira import"
-msgstr ""
+msgstr "Nou import Jira"
msgid "New Label"
-msgstr ""
+msgstr "Etichetă nouă"
msgid "New Milestone"
msgstr "Obiectiv nou"
msgid "New Pages Domain"
-msgstr ""
+msgstr "Nou domeniu Pages"
msgid "New Password"
-msgstr ""
+msgstr "Parolă nouă"
msgid "New Pipeline Schedule"
msgstr "Noul program de pipeline"
msgid "New Project"
-msgstr ""
+msgstr "Proiect nou"
msgid "New Requirement"
-msgstr ""
+msgstr "Cerință nouă"
msgid "New Snippet"
-msgstr "Fragment de cod nou"
+msgstr "Nou fragment de cod"
msgid "New Test Case"
msgstr "Caz de testare nou"
@@ -25514,10 +25943,10 @@ msgid "New User"
msgstr "Utilizator nou"
msgid "New application"
-msgstr ""
+msgstr "Aplicație nouă"
msgid "New branch"
-msgstr ""
+msgstr "Ramură nouă"
msgid "New branch unavailable"
msgstr "Noua ramură nu este disponibilă"
@@ -25529,19 +25958,19 @@ msgid "New confidential issue title"
msgstr "Noul titlu al problemei confidențiale"
msgid "New deploy key"
-msgstr ""
+msgstr "Nouă cheie de implementare"
msgid "New directory"
-msgstr ""
+msgstr "Director nou"
msgid "New discussion"
-msgstr ""
+msgstr "Discuție nouă"
msgid "New email address added"
msgstr "Adresă de e-mail nouă adăugată"
msgid "New environment"
-msgstr ""
+msgstr "Mediu nou"
msgid "New epic"
msgstr "Epică nouă"
@@ -25549,23 +25978,20 @@ msgstr "Epică nouă"
msgid "New epic title"
msgstr "Titlu nou de epică"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Fișier nou"
msgid "New group"
-msgstr ""
-
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
+msgstr "Grup nou"
msgid "New health check access token has been generated!"
msgstr "A fost generat un nou token de acces pentru verificarea de sănătate!"
msgid "New identity"
-msgstr ""
+msgstr "Noua identitate"
msgid "New issue"
msgstr "Problemă nouă"
@@ -25574,16 +26000,16 @@ msgid "New issue in %{project}"
msgstr "Problemă nouă în %{project}"
msgid "New issue title"
-msgstr ""
+msgstr "Titlul noii probleme"
msgid "New iteration created"
-msgstr ""
+msgstr "Noua iterație a fost creată"
msgid "New label"
-msgstr ""
+msgstr "Etichetă nouă"
msgid "New list"
-msgstr ""
+msgstr "Listă nouă"
msgid "New merge request"
msgstr "Merge request nou"
@@ -25595,25 +26021,25 @@ msgid "New name"
msgstr "Nume nou"
msgid "New password"
-msgstr ""
+msgstr "Parolă nouă"
msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
-msgstr ""
+msgstr "Noile pipeline-uri determină anularea pipeline-urilor mai vechi în așteptare sau în curs de execuție pe aceeași ramură."
msgid "New project"
-msgstr ""
+msgstr "Proiect nou"
msgid "New project page"
-msgstr ""
+msgstr "Pagină nouă de proiect"
msgid "New project pages"
-msgstr ""
+msgstr "Pagini noi de proiect"
msgid "New project/repository"
-msgstr ""
+msgstr "Proiect / repozitoriu"
msgid "New public deploy key"
-msgstr ""
+msgstr "Noua cheie de implementare publică"
msgid "New related %{issueType}"
msgstr "Nou %{issueType} asociat"
@@ -25622,22 +26048,22 @@ msgid "New release"
msgstr "Noua versiune"
msgid "New requirement"
-msgstr ""
+msgstr "Cerință nouă"
msgid "New response for issue #%{issue_iid}:"
-msgstr ""
+msgstr "Răspuns nou pentru problema #%{issue_iid}:"
msgid "New runners registration token has been generated!"
msgstr "A fost generat un nou token de înregistrare a executorilor!"
msgid "New schedule"
-msgstr ""
+msgstr "Program nou"
msgid "New snippet"
msgstr "Fragment de cod nou"
msgid "New subgroup"
-msgstr ""
+msgstr "Subgrup nou"
msgid "New tag"
msgstr "Etichetă nouă"
@@ -25649,22 +26075,19 @@ msgid "New topic"
msgstr "Subiect nou"
msgid "New users set to external"
-msgstr ""
+msgstr "Utilizatori noi setați ca externi"
msgid "New! Suggest changes directly"
-msgstr ""
-
-msgid "New..."
-msgstr ""
+msgstr "Nou! Sugerați direct modificări"
msgid "Newest first"
-msgstr ""
+msgstr "Cel mai nou mai întâi"
msgid "Newly-registered users are external by default"
msgstr "Utilizatorii nou-înregistrați sunt în mod implicit externi"
msgid "Next"
-msgstr ""
+msgstr "Următor"
msgid "Next commit"
msgstr "Următorul commit"
@@ -25673,34 +26096,34 @@ msgid "Next design"
msgstr "Următorul design"
msgid "Next file in diff"
-msgstr ""
+msgstr "Următorul fișier în diff"
msgid "Next scan"
msgstr "Următoarea scanare"
msgid "Next unresolved discussion"
-msgstr ""
+msgstr "Următoarea discuție nerezolvată"
msgid "Next update"
msgstr "Următoarea actualizare"
msgid "Nickname"
-msgstr ""
+msgstr "Poreclă"
msgid "No"
-msgstr ""
+msgstr "Nu"
msgid "No %{header} for this request."
-msgstr ""
+msgstr "Niciun %{header}pentru această solicitare."
msgid "No %{providerTitle} repositories found"
-msgstr ""
+msgstr "Nu s-au găsit repozitorii %{providerTitle}"
msgid "No CSV data to display."
msgstr "Nu există date CSV de afișat."
msgid "No Epic"
-msgstr ""
+msgstr "Nicio epică"
msgid "No Matching Results"
msgstr "Nicio potrivire de rezultate"
@@ -25711,14 +26134,17 @@ msgstr "Niciun Obiectiv"
msgid "No Scopes"
msgstr "Fără scopuri"
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr "Nu s-a găsit niciun utilizator administrator activ"
msgid "No activities found"
-msgstr ""
+msgstr "Nu s-au găsit activități"
msgid "No application_settings found"
-msgstr ""
+msgstr "Nu s-a găsit application_settings"
msgid "No approvers"
msgstr "Niciun aprobator"
@@ -25727,34 +26153,37 @@ msgid "No artifacts found"
msgstr "Nu s-au găsit artefacte"
msgid "No assignee"
-msgstr ""
+msgstr "Niciun responsabil"
msgid "No attention request"
msgstr "Nicio solicitare de atenție"
msgid "No authentication methods configured."
-msgstr ""
+msgstr "Nu sunt configurate metode de autentificare."
msgid "No available branches"
-msgstr ""
+msgstr "Nu există ramuri disponibile"
msgid "No branches found"
-msgstr ""
+msgstr "Nu s-au găsit ramuri"
+
+msgid "No change to this %{noun}'s draft status."
+msgstr "Nicio modificare a statutului de draft al acestui/acestei %{noun}."
msgid "No changes"
-msgstr ""
+msgstr "Nicio modificare"
msgid "No changes between %{source} and %{target}"
-msgstr ""
+msgstr "Nu există modificări între %{source} și %{target}"
msgid "No child epics match applied filters"
-msgstr ""
+msgstr "Nu există epice copil potrivite cu filtrele aplicate"
msgid "No commenters"
msgstr "Niciun comentator"
msgid "No commits present here"
-msgstr ""
+msgstr "Niciun commit prezent aici"
msgid "No committers"
msgstr "Niciun comitent"
@@ -25765,62 +26194,59 @@ msgstr "Nu ați primit niciun e-mail de confirmare? Verificați dosarul de spam
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Nu se poate face nicio conexiune la un server Gitaly, vă rugăm să verificați jurnalele!"
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
-msgstr ""
+msgstr "Nicio contribuție"
msgid "No contributions were found"
-msgstr ""
+msgstr "Nu au fost găsite contribuții"
msgid "No credit card data for matching"
msgstr "Nu există date de card de credit pentru potrivire"
msgid "No credit card required."
-msgstr ""
+msgstr "Nu este nevoie de card de credit."
msgid "No data found"
-msgstr ""
+msgstr "Nu s-au găsit date"
msgid "No data to display"
-msgstr ""
+msgstr "Nu există date de afișat"
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
-msgstr ""
+msgstr "Nu a fost detectată nicio implementare. Utilizați mediile pentru a controla implementarea continuă a software-ului dumneavoastră. %{linkStart}Aflați mai multe despre joburile de implementare.%{linkEnd}"
msgid "No deployments found"
-msgstr ""
+msgstr "Nu s-au găsit implementări"
msgid "No due date"
msgstr "Fără dată scadentă"
msgid "No email participants were added. Either none were provided, or they already exist."
-msgstr ""
+msgstr "Nu au fost adăugați participanți prin e-mail. Fie nu a fost furnizat niciunul, fie aceștia există deja."
msgid "No endpoint provided"
-msgstr ""
+msgstr "Nu a fost furnizat niciun punct final"
msgid "No errors to display."
-msgstr ""
+msgstr "Nu există erori de afișat."
msgid "No estimate or time spent"
msgstr "Nicio estimare sau timp petrecut"
msgid "No file chosen."
-msgstr ""
+msgstr "Nu s-a ales niciun fișier."
msgid "No file hooks found."
-msgstr ""
+msgstr "Nu au fost găsite hook-uri de fișiere."
msgid "No file selected"
-msgstr ""
+msgstr "Nu s-a selectat niciun fișier"
msgid "No files"
-msgstr ""
+msgstr "Fără fișiere"
msgid "No files found."
-msgstr ""
+msgstr "Niciun fișier găsit."
msgid "No forks are available to you."
msgstr "Niciun fork nu este disponibil pentru dvs."
@@ -25829,34 +26255,37 @@ msgid "No group provided"
msgstr "Nu a fost furnizat niciun grup"
msgid "No grouping"
-msgstr ""
+msgstr "Fără grupare"
msgid "No issues found"
-msgstr ""
+msgstr "Nu s-au găsit probleme"
msgid "No iteration"
-msgstr ""
+msgstr "Nicio iterație"
msgid "No iterations to show"
-msgstr ""
+msgstr "Nicio iterație de afișat"
msgid "No job log"
-msgstr ""
+msgstr "Niciun jurnal de job"
msgid "No jobs to show"
-msgstr ""
+msgstr "Niciun job de afișat"
msgid "No label"
-msgstr ""
+msgstr "Nicio etichetă"
msgid "No labels with such name or description"
-msgstr ""
+msgstr "Nicio etichetă cu un astfel de nume sau descriere"
msgid "No license. All rights reserved"
-msgstr ""
+msgstr "Fără licență. Toate drepturile rezervate"
msgid "No matches found"
-msgstr ""
+msgstr "Nu s-au găsit potriviri"
+
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr "Nu s-a găsit niciun/nicio %{issuable} care să corespundă. Asigurați-vă că adăugați un ID de %{issuable} valid."
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr "Nu s-a găsit niciun %{issuable} corespunzător. Asigurați-vă că adăugați un URL %{issuable} valid."
@@ -25874,7 +26303,7 @@ msgid "No matching results..."
msgstr "Nicio potrivire de rezultate..."
msgid "No members found"
-msgstr ""
+msgstr "Nu s-au găsit membri"
msgid "No memberships found"
msgstr "Nu s-a găsit niciun membru"
@@ -25883,70 +26312,70 @@ msgid "No merge requests found"
msgstr "Nu au fost găsite merge request-uri"
msgid "No messages were logged"
-msgstr ""
+msgstr "Nu s-au înregistrat mesaje"
msgid "No milestone"
-msgstr ""
+msgstr "Niciun obiectiv"
msgid "No namespace"
msgstr "Niciun spațiu de nume"
msgid "No other labels with such name or description"
-msgstr ""
+msgstr "Nicio altă etichetă cu un astfel de nume sau descriere"
msgid "No panels matching properties %{opts}"
msgstr "Niciun panou nu se potrivește cu proprietățile %{opts}"
msgid "No parent group"
-msgstr ""
+msgstr "Niciun grup părinte"
msgid "No plan"
-msgstr ""
-
-msgid "No pods available"
-msgstr "Nu există pod-uri disponibile"
+msgstr "Niciun plan"
msgid "No policy matches this license"
-msgstr ""
+msgstr "Nicio politică nu se potrivește cu această licență"
msgid "No preview for this file type"
msgstr "Nicio previzualizare pentru acest tip de fișier"
msgid "No prioritized labels with such name or description"
-msgstr ""
+msgstr "Nicio etichetă prioritizată cu un astfel de nume sau descriere"
msgid "No project subscribes to the pipelines in this project."
msgstr "Niciun proiect nu este abonat la pipeline-urile din acest proiect."
msgid "No projects available."
-msgstr ""
+msgstr "Nu există proiecte disponibile."
msgid "No projects found"
-msgstr ""
+msgstr "Niciun proiect găsit"
msgid "No public deploy keys"
-msgstr "Nu există chei publice de desfășurare"
+msgstr "Nu există chei de implementare publice"
msgid "No public groups"
-msgstr ""
+msgstr "Niciun grup public"
msgid "No ref selected"
-msgstr ""
+msgstr "Niciun ref selectat"
msgid "No regions configured"
-msgstr ""
+msgstr "Nicio regiune configurată"
msgid "No related merge requests found."
-msgstr ""
+msgstr "Niciun merge request asociat găsit."
msgid "No repository"
+msgstr "Niciun repozitoriu"
+
+msgid "No results"
msgstr ""
msgid "No runner executable"
msgstr "Niciun executor disponibil"
msgid "No schedules"
-msgstr ""
+msgstr "Nicio programare"
msgid "No service accounts"
msgstr "Nu există conturi de servicii"
@@ -25955,28 +26384,28 @@ msgid "No severity matches the provided parameter"
msgstr "Nicio severitate nu corespunde parametrului furnizat"
msgid "No source selected"
-msgstr ""
+msgstr "Nicio sursă selectată"
msgid "No stack trace for this error"
-msgstr ""
+msgstr "Nicio urmă de stivă pentru această eroare"
msgid "No starrers matched your search"
msgstr "Niciun marcator cu stele nu a corespuns căutării dvs."
msgid "No start date"
-msgstr ""
+msgstr "Fără dată de început"
msgid "No suggestions found"
msgstr "Nu s-au găsit sugestii"
msgid "No tag selected"
-msgstr ""
+msgstr "Nicio etichetă selectată"
msgid "No template"
-msgstr ""
+msgstr "Niciun șablon"
msgid "No template selected"
-msgstr ""
+msgstr "Niciun șablon selectat"
msgid "No test coverage"
msgstr "Fără coverage de teste"
@@ -25985,16 +26414,16 @@ msgid "No triggers exist yet. Use the form above to create one."
msgstr "Nu există încă niciun declanșator. Utilizați formularul anterior pentru a crea unul."
msgid "No user provided"
-msgstr ""
+msgstr "Niciun utilizator furnizat"
msgid "No vulnerabilities present"
-msgstr ""
+msgstr "Nu există vulnerabilități prezente"
msgid "No webhook events"
-msgstr ""
+msgstr "Niciun eveniment webhook"
msgid "No webhooks enabled. Select trigger events above."
-msgstr "Nu sunt activate webhooks-uri. Selectați evenimente de declanșare mai sus."
+msgstr "Niciun webhooks activat. Selectați evenimentele de declanșare de mai sus."
msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
@@ -26003,55 +26432,55 @@ msgstr[1] "Nu vă faceți griji, puteți utiliza în continuare toate caracteris
msgstr[2] "Nu vă faceți griji, puteți utiliza în continuare toate caracteristicile %{strong}%{plan_name}%{strong_close} pentru acum. Aveți la dispoziție %{remaining_days} de zile pentru a vă reînnoi abonamentul."
msgid "No. of commits"
-msgstr ""
+msgstr "Nr. de commit-uri"
msgid "Nobody has starred this repository yet"
msgstr "Nimeni nu a marcat cu stele încă acest repozitoriu"
msgid "Node was successfully created."
-msgstr ""
+msgstr "Nodul a fost creat cu succes."
msgid "Node was successfully updated."
-msgstr ""
+msgstr "Nodul a fost actualizat cu succes."
msgid "Nodes"
-msgstr ""
+msgstr "Noduri"
msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr "Utilizatorii non-administratori sunt restricționați la acces doar în citire, atât în GitLab UI cât și în API."
msgid "None"
-msgstr ""
+msgstr "Nimic"
msgid "None of the group milestones have the same project as the release"
msgstr "Niciunul dintre obiectivele grupului nu are același proiect ca și versiunea."
msgid "Normal text"
-msgstr ""
+msgstr "Text normal"
msgid "Not Implemented"
-msgstr ""
+msgstr "Neimplementat"
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr "Nu toate browserele sunt compatibile cu dispozitivele U2F. Prin urmare, vă solicităm să configurați mai întâi o aplicație de autentificare cu doi factori. În acest fel, veți putea să vă conectați întotdeauna - chiar și atunci când utilizați un browser neacceptat."
msgid "Not all browsers support WebAuthn. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even from an unsupported browser."
-msgstr ""
+msgstr "Nu toate browserele acceptă WebAuthn. Prin urmare, vă solicităm să configurați mai întâi o aplicație de autentificare cu doi factori. În acest fel, veți putea să vă conectați întotdeauna - chiar și de pe un browser neacceptat."
msgid "Not all data has been processed yet, the accuracy of the chart for the selected timeframe is limited."
msgstr "Nu au fost procesate încă toate datele, precizia graficului pentru intervalul de timp selectat este limitată."
msgid "Not applicable."
-msgstr ""
+msgstr "Nu se aplică."
msgid "Not available"
-msgstr ""
+msgstr "Nu este disponibil(ă)"
msgid "Not available for private projects"
-msgstr ""
+msgstr "Nu este disponibil(ă) pentru proiectele private"
msgid "Not available for protected branches"
-msgstr ""
+msgstr "Nu este disponibil(ă) pentru ramurile protejate"
msgid "Not confidential"
msgstr "Neconfidențial"
@@ -26060,31 +26489,31 @@ msgid "Not found"
msgstr "Nu s-a găsit"
msgid "Not found."
-msgstr ""
+msgstr "Nu s-a găsit."
msgid "Not permitted to destroy framework"
-msgstr ""
+msgstr "Nu este permisă distrugerea framework-ului"
msgid "Not ready yet. Try again later."
-msgstr ""
+msgstr "Nu este încă gata. Încercați din nou mai târziu."
msgid "Not started"
-msgstr ""
+msgstr "Nu a început"
msgid "Not supported"
-msgstr ""
+msgstr "Nu este acceptat"
msgid "Note"
-msgstr ""
+msgstr "Notă"
msgid "Note creation requests"
-msgstr "Solicitări creare notă"
+msgstr "Solicitări de creare de notă"
msgid "Note parameters are invalid: %{errors}"
msgstr "Parametrii notei nu sunt valabili: %{errors}"
msgid "Note that pushing to GitLab requires write access to this repository."
-msgstr ""
+msgstr "Rețineți că pentru a împinge în GitLab este necesar accesul în scris la acest repozitoriu."
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
msgstr "Notă: În calitate de administrator, poate doriți să configurați %{github_integration_link}, care va permite autentificarea prin GitHub și va permite conectarea repozitoriilor fără a genera un Token de acces personal."
@@ -26102,10 +26531,10 @@ msgid "Note: current forks will keep their visibility level."
msgstr "Notă: forkurile actuale își vor păstra nivelul de vizibilitate."
msgid "NoteForm|Note"
-msgstr ""
+msgstr "Notă"
msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
+msgstr "Acceptă %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Pentru %{quickActionsDocsLinkStart}acțiuni rapide%{quickActionsDocsLinkEnd}, tastați %{keyboardStart}/%{keyboardEnd}."
msgid "Notes"
msgstr "Note"
@@ -26114,7 +26543,7 @@ msgid "Notes rate limit"
msgstr "Limita ratei notelor"
msgid "Notes|Are you sure you want to cancel creating this %{commentType}?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să anulați crearea acestui %{commentType}?"
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Sunteți sigur că doriți să anulați crearea acestui comentariu?"
@@ -26122,11 +26551,17 @@ msgstr "Sunteți sigur că doriți să anulați crearea acestui comentariu?"
msgid "Notes|Collapse replies"
msgstr "Restrângeți răspunsurile"
+msgid "Notes|Expand replies"
+msgstr "Extindeți răspunsurile"
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
-msgstr ""
+msgstr "Notele interne sunt vizibile doar pentru autor, responsabili și membrii cu rol de Reporter sau mai mare"
+
+msgid "Notes|Last reply by %{name}"
+msgstr "Ultimul răspuns de %{name}"
msgid "Notes|Make this an internal note"
-msgstr ""
+msgstr "Faceți din aceasta o notă internă"
msgid "Notes|Show all activity"
msgstr "Afișați toată activitatea"
@@ -26141,46 +26576,46 @@ msgid "Notes|This comment has changed since you started editing, please review t
msgstr "Acest comentariu s-a modificat de când ați început editarea, vă rugăm să revizuiți %{open_link}comentariul actualizat%{close_link} pentru a vă asigura că informațiile nu sunt pierdute"
msgid "Notes|This internal note will always remain confidential"
-msgstr ""
+msgstr "Această notă internă va rămâne întotdeauna confidențială."
msgid "Notes|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
msgstr "Vedeți doar %{boldStart}alte activități%{boldEnd} în flux. Pentru a adăuga un comentariu, treceți la una dintre următoarele opțiuni."
msgid "Nothing to preview."
-msgstr ""
+msgstr "Nimic de previzualizat."
msgid "Notification events"
-msgstr ""
+msgstr "Evenimente de notificare"
msgid "Notification setting - %{notification_title}"
-msgstr ""
+msgstr "Setarea notificării - %{notification_title}"
msgid "Notification settings saved"
msgstr "Setări de notificare salvate"
msgid "NotificationEmail|Assignee"
msgid_plural "NotificationEmail|Assignees"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Responsabil"
+msgstr[1] "Responsabili"
+msgstr[2] "Responsabil"
msgid "NotificationEmail|Assignee: %{users}"
msgid_plural "NotificationEmail|Assignees: %{users}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Responsabil: %{users}"
+msgstr[1] "Responsabili: %{users}"
+msgstr[2] "Responsabili: %{users}"
msgid "NotificationEmail|Reviewer"
msgid_plural "NotificationEmail|Reviewers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Revizor"
+msgstr[1] "Revizori"
+msgstr[2] "Revizori"
msgid "NotificationEmail|Reviewer: %{users}"
msgid_plural "NotificationEmail|Reviewers: %{users}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Recenzent: %{users}"
+msgstr[1] "Recenzenți: %{users}"
+msgstr[2] "Recenzenți: %{users}"
msgid "NotificationEvent|Change reviewer merge request"
msgstr "Schimbați merge request-ul recenzentului"
@@ -26243,50 +26678,77 @@ msgid "NotificationEvent|Successful pipeline"
msgstr "Pipeline de succes"
msgid "NotificationLevel|Custom"
-msgstr ""
+msgstr "Personalizat"
msgid "NotificationLevel|Disabled"
-msgstr ""
+msgstr "Dezactivat"
msgid "NotificationLevel|Global"
-msgstr ""
+msgstr "Global"
msgid "NotificationLevel|On mention"
-msgstr ""
+msgstr "La menționare"
msgid "NotificationLevel|Participate"
-msgstr ""
+msgstr "Participare"
msgid "NotificationLevel|Watch"
-msgstr ""
+msgstr "Vizionare"
msgid "Notifications"
-msgstr ""
+msgstr "Notificări"
msgid "Notifications have been disabled by the project or group owner"
-msgstr ""
+msgstr "Notificările au fost dezactivate de către proprietarul proiectului sau al grupului"
msgid "Notifications off"
-msgstr ""
+msgstr "Notificări dezactivate"
msgid "Notifications on"
-msgstr ""
+msgstr "Notificări activate"
+
+msgid "Notifications turned off."
+msgstr "Notificările sunt dezactivate."
+
+msgid "Notifications turned on."
+msgstr "Notificările sunt activate."
msgid "Notify users by email when sign-in location is not recognized."
-msgstr "Notificați utilizatorii prin e-mail când locația de autentificare nu este recunoscută."
+msgstr "Notificați utilizatorii prin e-mail atunci când locația de conectare nu este recunoscută."
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr "Problema creată de %{author_link} %{issue_reference_link} va expira în curând."
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr "%{commit_link} în %{mr_link}"
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr "Responsabilul a fost schimbat de la %{fromNames} la %{toNames}"
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr "Responsabilul a fost schimbat pentru %{toNames}"
+
msgid "Notify|Author: %{author_name}"
msgstr "Autor: %{author_name}"
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr "Dacă nu mai doriți să utilizați acest domeniu cu GitLab Pages, vă rugăm să-l înlăturați din proiectul dumneavoastră GitLab și să ștergeți toate înregistrările DNS aferente."
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr "Problema a fost %{issue_status} de %{updated_by}"
msgid "Notify|Issue was moved to another project."
msgstr "Problema a fost mutată la un alt proiect."
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr "Merge request-ul %{merge_request} nu mai poate fi îmbinat din cauza unui conflict."
@@ -26299,116 +26761,140 @@ msgstr "Merge request-ul %{merge_request} a fost %{mr_status} de %{updated_by}"
msgid "Notify|Merge request %{merge_request} was merged"
msgstr "Merge request-ul %{merge_request} a fost îmbinat"
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr "Merge request-ul %{mr_link} a fost închis de %{closed_by}"
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr "URL-ul merge request-ului: %{merge_request_url}"
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr "Obiectivul a fost schimbat in %{milestone}"
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr "Problema nouă: %{project_issue_url}"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr "Pipeline-ul %{pipeline_link} declanșat de"
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr "Această problemă expiră pe: %{issue_due_date}"
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr "Dacă nu vă verificați domeniul până la %{time_start}%{time}%{time_end}, acesta va fi înlăturat din proiectul dumneavoastră GitLab."
+
msgid "Notify|You don't have access to the project."
msgstr "Nu aveți acces la proiect."
-msgid "Nov"
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr "Solicitarea dvs. de a vă alătura la %{target_to_join} %{target_type} a fost %{denied_tag}."
+
+msgid "Notify|currently supported languages"
msgstr ""
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr "s-a(u) finalizat cu succes %{jobs} în %{stages}."
+
+msgid "Nov"
+msgstr "Nov"
+
msgid "November"
-msgstr ""
+msgstr "Noiembrie"
msgid "Now, personalize your GitLab experience"
-msgstr ""
+msgstr "Acum, personalizați-vă experiența GitLab"
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
-msgstr ""
+msgstr "Nuget metadatum trebuie să aibă cel puțin license_url, project_url sau icon_url setate."
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr "Numărul de fragmente și replici Elasticsearch pe index:"
msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr "Numărul de împingeri Git după ce %{code_start}git gc%{code_end} este executat."
+msgstr "Numărul de împingeri Git după care %{code_start}git gc%{code_end} este executat."
msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr "Numărul de împingeri Git după ce un %{code_start}git repack%{code_end} complet este executat."
+msgstr "Numărul de împingeri Git după care se execută un %{code_start}git repack%{code_end} complet."
msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
-msgstr "Numărul de împingeri Git după ce un %{code_start}git repack%{code_end} incremental este executat."
+msgstr "Numărul de împingeri Git după care se execută un %{code_start}git repack%{code_end} incremental."
msgid "Number of LOCs per commit"
-msgstr ""
+msgstr "Numărul de LOC-uri pe commit"
msgid "Number of commits"
-msgstr ""
+msgstr "Numărul de commit-uri"
msgid "Number of commits per MR"
-msgstr ""
+msgstr "Numărul de commit-uri pe MR"
msgid "Number of employees"
msgstr "Numărul de angajați"
msgid "Number of events"
-msgstr ""
+msgstr "Numărul de evenimente"
msgid "Number of events for this project: %{total_count}."
-msgstr ""
+msgstr "Numărul de evenimente pentru acest proiect: %{total_count}."
msgid "Number of files touched"
-msgstr ""
+msgstr "Numărul de fișiere atinse"
msgid "Number of replicas"
-msgstr ""
+msgstr "Numărul de replici"
msgid "Number of shards"
-msgstr ""
+msgstr "Numărul de fragmente"
msgid "OK"
-msgstr ""
+msgstr "OK"
msgid "Object does not exist on the server or you don't have permissions to access it"
-msgstr ""
+msgstr "Obiectul nu există pe server sau nu aveți permisiuni pentru a-l accesa"
msgid "Oct"
-msgstr ""
+msgstr "Oct"
msgid "October"
-msgstr ""
+msgstr "Octombrie"
msgid "OfSearchInADropdown|Filter"
-msgstr ""
+msgstr "Filtru"
msgid "Off"
-msgstr ""
+msgstr "Oprit"
msgid "Offline"
-msgstr ""
+msgstr "Offline"
msgid "Oh no!"
-msgstr ""
+msgstr "Vai, nu!"
msgid "Ok, let's go"
-msgstr ""
+msgstr "Bine, să mergem."
msgid "Okay"
-msgstr ""
+msgstr "Ok"
msgid "Oldest first"
msgstr "Cel mai vechi mai întâi"
msgid "OmniAuth"
-msgstr ""
+msgstr "OmniAuth"
msgid "On"
-msgstr ""
+msgstr "Pornit"
msgid "On track"
-msgstr ""
+msgstr "Conform planului"
msgid "On-call Schedules"
-msgstr ""
+msgstr "Program la apel"
msgid "On-call schedules"
-msgstr ""
+msgstr "Programe de gardă"
msgid "On-demand scans run outside of the DevOps cycle and find vulnerabilities in your projects"
msgstr "Scanările la cerere se execută în afara ciclului DevOps și găsesc vulnerabilități în proiectele dumneavoastră"
@@ -26417,25 +26903,25 @@ msgid "OnCallScheduless|Any escalation rules that are using this schedule will a
msgstr "Toate regulile de escaladare care utilizează acest program vor fi, de asemenea, șterse."
msgid "OnCallSchedules|1 day"
-msgstr ""
+msgstr "1 zi"
msgid "OnCallSchedules|2 weeks"
-msgstr ""
+msgstr "2 săptămâni"
msgid "OnCallSchedules|Add a rotation"
msgstr "Adăugați o rotație"
msgid "OnCallSchedules|Add a schedule"
-msgstr ""
+msgstr "Adăugați un program"
msgid "OnCallSchedules|Add an additional schedule to your project"
-msgstr ""
+msgstr "Adăugați un program suplimentar la proiectul dvs."
msgid "OnCallSchedules|Add rotation"
-msgstr "Adăugați rotație"
+msgstr "Adăugare rotație"
msgid "OnCallSchedules|Add schedule"
-msgstr ""
+msgstr "Adăugare program"
msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteRotation}\" rotation? This action cannot be undone."
msgstr "Sigur doriți să ștergeți rotația „%{deleteRotation}� Această acțiune nu poate fi anulată."
@@ -26447,25 +26933,25 @@ msgid "OnCallSchedules|Collapse schedule"
msgstr "Restrângeți programul"
msgid "OnCallSchedules|Create on-call schedules in GitLab"
-msgstr "Creați programe la apel în GitLab"
+msgstr "Creați programe de gardă în GitLab"
msgid "OnCallSchedules|Currently no rotation."
-msgstr ""
+msgstr "În prezent, nu există nicio rotație."
msgid "OnCallSchedules|Delete rotation"
-msgstr ""
+msgstr "Ștergeți rotația"
msgid "OnCallSchedules|Delete schedule"
-msgstr ""
+msgstr "Ștergeți programul"
msgid "OnCallSchedules|Edit rotation"
-msgstr ""
+msgstr "Editați rotația"
msgid "OnCallSchedules|Edit schedule"
-msgstr ""
+msgstr "Editați programul"
msgid "OnCallSchedules|Enable end date"
-msgstr "Activați data de încheiere"
+msgstr "Activați data de sfârșit"
msgid "OnCallSchedules|Expand schedule"
msgstr "Extindeți programul"
@@ -26480,31 +26966,31 @@ msgid "OnCallSchedules|Failed to edit schedule"
msgstr "Nu s-a reușit editarea programului"
msgid "OnCallSchedules|For this rotation, on-call will be:"
-msgstr ""
+msgstr "Pentru această rotație, de gardă va fi:"
msgid "OnCallSchedules|On-call schedule %{obstacle} in project %{project}"
-msgstr "Programul la apel %{obstacle} în proiectul %{project}"
+msgstr "Program de gardă %{obstacle} în proiectul %{project}"
msgid "OnCallSchedules|On-call schedules"
-msgstr ""
+msgstr "Programe de gardă"
msgid "OnCallSchedules|Please note, rotations with shifts that are less than four hours are currently not supported in the weekly view."
msgstr "Vă rugăm să rețineți, rotațiile cu ture mai mici de patru ore nu sunt acceptate în prezent în vizualizarea săptămânală."
msgid "OnCallSchedules|Removing this user may put their on-call team at risk of missing a notification."
-msgstr "Înlăturarea acestui utilizator poate pune echipa la apel în pericol de a pierde o notificare."
+msgstr "Înlăturarea acestui utilizator poate pune echipa de gardă a acestuia în pericol de a pierde o notificare."
msgid "OnCallSchedules|Removing yourself may put your on-call team at risk of missing a notification."
-msgstr ""
+msgstr "Dacă vă retrageți, echipa de gardă poate risca să rateze o notificare."
msgid "OnCallSchedules|Restrict to time intervals"
msgstr "Limitați-vă la intervale de timp"
msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
-msgstr ""
+msgstr "Data/ora de sfârșit a rotației trebuie să vină după data/ora de început"
msgid "OnCallSchedules|Rotation length"
-msgstr ""
+msgstr "Durata rotației"
msgid "OnCallSchedules|Rotation name cannot be empty"
msgstr "Numele rotației nu poate fi gol"
@@ -26516,37 +27002,37 @@ msgid "OnCallSchedules|Rotation start date cannot be empty"
msgstr "Data de începere a rotației nu poate fi goală"
msgid "OnCallSchedules|Rotations"
-msgstr ""
+msgstr "Rotații"
msgid "OnCallSchedules|Route alerts directly to specific members of your team"
-msgstr ""
+msgstr "Direcționați alertele direct către anumiți membri ai echipei dumneavoastră"
msgid "OnCallSchedules|Select participant"
-msgstr ""
+msgstr "Selectați participantul"
msgid "OnCallSchedules|Select timezone"
-msgstr ""
+msgstr "Selectați fusul orar"
msgid "OnCallSchedules|Sets the default timezone for the schedule, for all participants"
msgstr "Setează fusul orar implicit pentru program, pentru toți participanții"
msgid "OnCallSchedules|Successfully created a new rotation"
-msgstr ""
+msgstr "A fost creată cu succes o nouă rotație"
msgid "OnCallSchedules|Successfully edited your rotation"
-msgstr ""
+msgstr "Ați editat cu succes rotația dumneavoastră"
msgid "OnCallSchedules|The rotation could not be deleted. Please try again."
-msgstr ""
+msgstr "Rotația nu a putut fi ștearsă. Vă rugăm să încercați din nou."
msgid "OnCallSchedules|The rotation could not be updated. Please try again."
-msgstr ""
+msgstr "Rotația nu a putut fi actualizată. Vă rugăm să încercați din nou."
msgid "OnCallSchedules|The schedule could not be deleted. Please try again."
-msgstr ""
+msgstr "Programul nu a putut fi șters. Vă rugăm să încercați din nou."
msgid "OnCallSchedules|The schedule could not be updated. Please try again."
-msgstr ""
+msgstr "Programul nu a putut fi actualizat. Vă rugăm să încercați din nou."
msgid "OnCallSchedules|Try adding a rotation"
msgstr "Încercați să adăugați o rotație"
@@ -26561,7 +27047,7 @@ msgid "OnCallSchedules|View previous timeframe"
msgstr "Vizualizați intervalul de timp anterior"
msgid "OnCallSchedules|You are currently a part of:"
-msgstr ""
+msgstr "În prezent faceți parte din:"
msgid "OnCallSchedules|Your schedule has been successfully created. To add individual users to this schedule, use the Add a rotation button. To enable notifications for this schedule, you must also create an %{linkStart}escalation policy%{linkEnd}."
msgstr "Programarea dvs. a fost creată cu succes. Pentru a adăuga utilizatori individuali la această programare, utilizaÈ›i butonul „AdăugaÈ›i o rotaÈ›ieâ€. Pentru a activa notificările pentru această programare, trebuie să creaÈ›i, de asemenea, o %{linkStart}politică de escaladare%{linkEnd}."
@@ -26570,13 +27056,13 @@ msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{lear
msgstr "%{learnMoreLinkStart}Aflați mai multe despre scanările la cerere%{learnMoreLinkEnd}."
msgid "OnDemandScans|%{profileType} profile library"
-msgstr ""
+msgstr "Biblioteca de profiluri %{profileType}"
msgid "OnDemandScans|Add a schedule to run this scan at a specified date and time or on a recurring basis. Scheduled scans are automatically saved to scan library."
msgstr "Adăugați o programare pentru a rula această scanare la o dată și oră specificate sau în mod recurent. Scanările programate sunt salvate automat în biblioteca de scanare."
msgid "OnDemandScans|Analyze a deployed version of your web application for known vulnerabilities by examining it from the outside in. DAST works by simulating external attacks on your application while it is running."
-msgstr "Analizează o versiune desfășurată a aplicației dvs. web pentru vulnerabilități cunoscute, examinând-o din exterior spre interior. DAST funcționează prin simularea unor atacuri externe asupra aplicației dvs. în timp ce aceasta rulează."
+msgstr "Analizați o versiune implementată a aplicației dvs. web pentru vulnerabilități cunoscute, examinând-o din exterior spre interior. DAST funcționează prin simularea unor atacuri externe asupra aplicației dvs. în timp ce aceasta rulează."
msgid "OnDemandScans|Are you sure you want to delete this scan?"
msgstr "Sunteți sigur că doriți să ștergeți această scanare?"
@@ -26591,10 +27077,10 @@ msgid "OnDemandScans|Could not fetch on-demand scans. Please refresh the page, o
msgstr "Nu se pot prelua scanările la cerere. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "OnDemandScans|Could not fetch scanner profiles. Please refresh the page, or try again later."
-msgstr "Nu se pot prelua profilurile de scanare. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
+msgstr "Nu se pot prelua profilurile de scanare. Vă rugăm să reîmprospătați pagina sau să încercați din nou mai târziu."
msgid "OnDemandScans|Could not fetch site profiles. Please refresh the page, or try again later."
-msgstr "Nu se pot prelua profilurile site-ului. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
+msgstr "Nu se pot prelua profilurile site-ului. Vă rugăm să reîmprospătați pagina sau să încercați din nou mai târziu."
msgid "OnDemandScans|Could not run the scan. Please try again."
msgstr "Nu s-a putut rula scanarea. Vă rugăm să încercați din nou."
@@ -26624,7 +27110,7 @@ msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
msgstr "Testarea dinamică a securității aplicațiilor (DAST)"
msgid "OnDemandScans|Edit %{profileType} profile"
-msgstr ""
+msgstr "Editați profilul %{profileType}"
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr "Editați scanarea DAST la cerere"
@@ -26651,7 +27137,7 @@ msgid "OnDemandScans|My daily scan"
msgstr "Scanarea mea zilnică"
msgid "OnDemandScans|New %{profileType} profile"
-msgstr ""
+msgstr "Profil nou %{profileType}"
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "Nouă scanare DAST la cerere"
@@ -26660,13 +27146,13 @@ msgid "OnDemandScans|New on-demand scan"
msgstr "Noua scanare la cerere"
msgid "OnDemandScans|New profile"
-msgstr ""
+msgstr "Profil nou"
msgid "OnDemandScans|New scan"
-msgstr "Noua scanare"
+msgstr "Scanare nouă"
msgid "OnDemandScans|No %{profileType} profiles found for DAST"
-msgstr ""
+msgstr "Nu s-au găsit profiluri %{profileType} pentru DAST"
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
msgstr "Nu aveți niciun profil configurat. Pentru a crea o nouă scanare, trebuie să aveți cel puțin un profil de scanare finalizat."
@@ -26726,7 +27212,7 @@ msgid "OnDemandScans|Site profile"
msgstr "Profilul site-ului"
msgid "OnDemandScans|Start by creating a new profile. Profiles make it easy to save and reuse configuration details for GitLab’s security tools."
-msgstr ""
+msgstr "Începeți prin crearea unui profil nou. Profilurile facilitează salvarea și reutilizarea detaliilor de configurare pentru instrumentele de securitate GitLab."
msgid "OnDemandScans|Start time"
msgstr "Timpul de începere"
@@ -26771,19 +27257,22 @@ msgid "OnDemandScans|at"
msgstr "la"
msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}."
-msgstr "Odată importate, depozitele pot fi replicate prin SSH. Aflați mai multe %{link_start}aici%{link_end}."
+msgstr "Odată importate, repozitoriile pot fi replicate prin SSH. Aflați mai multe %{link_start}aici%{link_end}."
msgid "Once removed, the fork relationship cannot be restored. This project will no longer be able to receive or send merge requests to the source project or other forks."
msgstr "Odată eliminată, relația de fork nu mai poate fi restabilită. Acest proiect nu va mai putea să primească sau să trimită merge request-uri către proiectul sursă sau către alte forkuri."
msgid "Once you confirm and press \"Reduce project visibility\":"
-msgstr ""
+msgstr "După ce confirmaÈ›i È™i apăsaÈ›i „ReduceÈ›i vizibilitatea proiectuluiâ€:"
msgid "One more item"
msgid_plural "%d more items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Un element mai mult"
+msgstr[1] "%d elemente mai mult"
+msgstr[2] "%d de elemente mai mult"
+
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
msgid "One or more contacts were successfully added."
msgstr "Una sau mai multe contacte au fost adăugate cu succes."
@@ -26792,7 +27281,7 @@ msgid "One or more contacts were successfully removed."
msgstr "Unul sau mai multe contacte au fost eliminate cu succes."
msgid "One or more groups that you don't have access to."
-msgstr ""
+msgstr "Unul sau mai multe grupuri la care nu aveți acces."
msgid "One or more of you personal access tokens were revoked"
msgstr "Unul sau mai multe tokenuri de acces personal au fost revocate"
@@ -26809,53 +27298,56 @@ msgstr "Unul sau mai multe dintre tokenurile dvs. de acces personal a expirat."
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr "Unul sau mai multe dintre tokenurile dvs. de acces personal vor expira în %{days_to_expire} zile sau mai puțin:"
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
-msgstr ""
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
+msgstr "Numai membrii din %{workspaceType} cu %{permissions} pot vizualiza sau pot fi notificați despre acest/această %{issuableType}."
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
-msgstr "Numai rolurile de „Reporter†și mai sus pe nivelurile Premium și mai sus pot vedea Analizele Value Stream."
+msgstr "Numai rolurile „Reporter†și cele de nivel superior de la nivelurile Premium și superioare pot vedea analiza Fluxului de valori."
msgid "Only 1 appearances row can exist"
-msgstr ""
+msgstr "Nu poate exista decât o singură linie de aspect"
-msgid "Only Issue ID or merge request ID is required"
-msgstr ""
+msgid "Only HTTP(S)"
+msgstr "Numai HTTP(S)"
-msgid "Only Issue can be parent of Task."
-msgstr ""
+msgid "Only Issue ID or merge request ID is required"
+msgstr "Este necesar numai ID-ul problemei sau ID-ul merge request-ului"
msgid "Only Project Members"
-msgstr ""
+msgstr "Numai membrii proiectului"
+
+msgid "Only SSH"
+msgstr "Numai SSH"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
msgid "Only active projects show up in the search and on the dashboard."
msgstr "Numai proiectele active apar în căutări și în tabloul de bord."
-msgid "Only admins can delete project"
-msgstr "Doar administratorii pot șterge proiectul"
-
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr "Permiteți oricui să se înregistreze pentru conturi pe instanțele GitLab pe care intenționați să le folosească oricine. Permițând oricui să se înregistreze, face ca instanțele GitLab să fie mai vulnerabile."
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
-msgstr "Are efect numai atunci când este activată stocarea remote. Setați la 0 pentru nicio limită de dimensiune."
+msgstr "Are efect numai atunci când este activată stocarea remote. Setați la 0 pentru nicio limită de mărime."
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
-msgstr ""
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
+msgstr "Numai membrii din grup cu cel puțin rolul de Reporter pot vizualiza sau pot fi notificați despre această epică"
msgid "Only include features new to your current subscription tier."
msgstr "Includeți numai caracteristici noi pentru nivelul actual de abonament."
+msgid "Only members of this group can access the wiki."
+msgstr "Numai membrii acestui grup pot accesa wiki-ul."
+
msgid "Only policy:"
-msgstr ""
+msgstr "Numai politica:"
msgid "Only proceed if you trust %{idp_url} to control your GitLab account sign in."
-msgstr ""
+msgstr "Procedați numai dacă aveți încredere în %{idp_url} pentru a vă controla conectarea la contul GitLab."
msgid "Only project members can comment."
-msgstr ""
+msgstr "Numai membrii proiectului pot comenta."
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr "Numai proiectele create sub o licență Ultimate sunt disponibile în Tablourile de bord de securitate."
@@ -26869,26 +27361,26 @@ msgstr "Este necesar numai dacă nu se utilizează acreditările instanței de r
msgid "Only use lowercase letters, numbers, and underscores."
msgstr "Folosiți numai litere minuscule, cifre și caractere de subliniere."
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
-msgstr "Numai utilizatorii din intervalele de adrese IP specificate pot accesa acest grup, inclusiv toate subgrupurile, proiectele și depozitele Git."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
+msgstr "Numai utilizatorii din intervalele de adrese IP specificate pot accesa acest grup, inclusiv toate subgrupurile, proiectele și repozitoriile Git."
-msgid "Only verified users with an email address in any of these domains can be added to the group."
-msgstr ""
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
+msgstr "Numai utilizatorii verificați care au o adresă de e-mail în oricare dintre aceste domenii pot fi adăugați la grup. Sunt acceptate mai multe domenii."
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
-msgstr ""
+msgstr "Numai rolurile „Reporter†și mai sus pe nivelurile Premium și mai sus pot vedea Analizele Productivității."
msgid "Oops, are you sure?"
-msgstr ""
+msgstr "Hopa, sunteți sigur?"
msgid "Open"
-msgstr ""
+msgstr "Deschis"
msgid "Open Selection"
-msgstr ""
+msgstr "Deschideți selecția"
msgid "Open errors"
-msgstr ""
+msgstr "Erori deschise"
msgid "Open in Gitpod"
msgstr "Deschideți în Gitpod"
@@ -26897,34 +27389,34 @@ msgid "Open in Web IDE"
msgstr "Deschideți în Web IDE"
msgid "Open in file view"
-msgstr ""
+msgstr "Deschideți în vizualizarea fișierului"
msgid "Open in your IDE"
msgstr "Deschideți în propriul IDE"
msgid "Open new window"
-msgstr ""
+msgstr "Deschideți o fereastră nouă"
msgid "Open raw"
-msgstr ""
+msgstr "Deschideți brut"
msgid "Open sidebar"
msgstr "Deschideți bara laterală"
msgid "Open: %{open}"
-msgstr ""
+msgstr "Deschis: %{open}"
msgid "OpenAPI"
-msgstr ""
+msgstr "OpenAPI"
msgid "OpenAPI Specification file path or URL"
-msgstr ""
+msgstr "Calea sau URL-ul fișierului de specificații OpenAPI"
msgid "Opened"
msgstr "Deschis"
msgid "Opened MRs"
-msgstr ""
+msgstr "MR-uri deschise"
msgid "Opened issues"
msgstr "Probleme deschise"
@@ -26933,7 +27425,7 @@ msgid "OpenedNDaysAgo|Created"
msgstr "Creat"
msgid "Opens in a new window"
-msgstr ""
+msgstr "Se deschide într-o fereastră nouă"
msgid "Opens new window"
msgstr "Deschide o fereastră nouă"
@@ -26942,7 +27434,7 @@ msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr "Operația a eșuat. Verificați jurnalele pod pentru %{pod_name} pentru mai multe detalii."
msgid "Operation not allowed"
-msgstr ""
+msgstr "Operațiunea nu este permisă"
msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
msgstr "Operația a expirat. Verificați jurnalele pod pentru %{pod_name} pentru mai multe detalii."
@@ -26957,7 +27449,7 @@ msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "Adăugați un proiect în tabloul de bord"
msgid "OperationsDashboard|Add projects"
-msgstr "Adăugați proiecte"
+msgstr "Adăugare proiecte"
msgid "OperationsDashboard|More information"
msgstr "Mai multe informații"
@@ -26968,44 +27460,50 @@ msgstr "Tabloul de bord al operațiunilor"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "Tablou de bord de operațiuni oferă un rezumat al stării de sănătate operațională a fiecărui proiect, inclusiv statusul pipeline-urilor și alertelor."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr "Punctul final Opstrace pentru integrarea urmăririi erorilor"
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimizează-ți fluxul de lucru cu pipeline-urile CI/CD"
msgid "Optional"
-msgstr ""
+msgstr "Opțional"
msgid "Optional parameter \"variables\" must be a Hash. Ex: variables[key1]=value1"
-msgstr ""
+msgstr "Parametrul opțional „variables†trebuie să fie un Hash. De exemplu: variables[key1]=value1"
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr "În mod opțional, aveți posibilitatea să %{link_to_customize} cum sunt importate adresele de e-mail și numele de utilizator FogBugz în GitLab."
msgid "Options"
-msgstr ""
+msgstr "Opțiuni"
msgid "Or you can choose one of the suggested colors below"
-msgstr ""
+msgstr "Sau puteți alege una dintre culorile sugerate mai jos"
+
+msgid "Ordered list"
+msgstr "Lista ordonată"
msgid "Organizations"
msgstr "Organizații"
msgid "Orphaned member"
-msgstr ""
+msgstr "Membru orfan"
msgid "Other Labels"
-msgstr ""
+msgstr "Alte etichete"
msgid "Other available runners"
msgstr "Alți executori disponibili"
msgid "Other information"
-msgstr ""
+msgstr "Alte informații"
msgid "Other merge requests block this MR"
msgstr "Alte merge request-uri blochează acest MR"
msgid "Other versions"
-msgstr ""
+msgstr "Alte versiuni"
msgid "Other visibility settings have been disabled by the administrator."
msgstr "Alte setări de vizibilitate au fost dezactivate de către administrator."
@@ -27017,10 +27515,10 @@ msgid "Otherwise, click the link below to complete the process:"
msgstr "În caz contrar, faceți clic pe linkul următor pentru a finaliza procesul:"
msgid "Our team has been notified. Please try again."
-msgstr ""
+msgstr "Echipa noastră a fost notificată. Vă rugăm să încercați din nou."
msgid "Out-of-compliance with this project's policies and should be removed"
-msgstr ""
+msgstr "Neconform cu politicile acestui proiect și ar trebui să fie înlăturat."
msgid "OutboundRequests|Allow requests to the local network from hooks and services."
msgstr "Permiteți solicitări către rețeaua locală de la hook-uri și servicii."
@@ -27047,34 +27545,37 @@ msgid "OutboundRequests|Resolve IP addresses once and uses them to submit reques
msgstr "Rezolvați adresele IP o dată și utilizați-le pentru a trimite solicitări."
msgid "OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser."
-msgstr ""
+msgstr "S-ar putea ca GitLab să nu funcționeze corect, deoarece utilizați un browser web învechit."
msgid "OutdatedBrowser|Please install a %{browser_link_start}supported web browser%{browser_link_end} for a better experience."
-msgstr ""
+msgstr "Vă rugăm să instalați un %{browser_link_start}browser compatibil%{browser_link_end} pentru o experiență mai bună."
msgid "Overridden"
msgstr "Suprascris"
msgid "Overview"
-msgstr ""
+msgstr "Prezentare generală"
msgid "Overwrite diverged branches"
msgstr "Suprascrieți ramurile divergente"
msgid "Owned by %{image_tag}"
-msgstr ""
+msgstr "Deținut de %{image_tag}"
msgid "Owned by anyone"
-msgstr ""
+msgstr "Deținut de oricine"
msgid "Owned by me"
-msgstr ""
+msgstr "Deținut de mine"
msgid "Owned by:"
-msgstr ""
+msgstr "Deținut de:"
msgid "Owner"
-msgstr ""
+msgstr "Proprietar"
+
+msgid "Owners and administrators"
+msgstr "Proprietari și administratori"
msgid "Owners can modify this selection."
msgstr "Proprietarii pot modifica această selecție."
@@ -27110,22 +27611,22 @@ msgid "PQL|Thank you for reaching out! Our sales team will get back to you soon.
msgstr "Vă mulțumim pentru că ne-ați contactat! Echipa noastră de vânzări vă va contacta în curând."
msgid "Package Registry"
-msgstr ""
+msgstr "Registrul de pachete"
msgid "Package Registry: authenticated API requests"
-msgstr "Registru de pachete: solicitări API autentificate"
+msgstr "Registrul de pachete: solicitări API autentificate"
msgid "Package Registry: unauthenticated API requests"
-msgstr "Registru pachete: solicitări API neautentificate"
+msgstr "Registrul de pachete: solicitări API neautentificate"
msgid "Package already exists"
-msgstr ""
+msgstr "Pachetul există deja"
msgid "Package deleted successfully"
-msgstr ""
+msgstr "Pachetul a fost șters cu succes"
msgid "Package file size limits"
-msgstr ""
+msgstr "Limitele de mărime a fișierelor din pachet"
msgid "Package recipe already exists"
msgstr "Rețeta pachetului există deja"
@@ -27160,12 +27661,6 @@ msgstr "Tipul pachetului trebuie să fie PyPi"
msgid "Package type must be RubyGems"
msgstr "Tipul pachetului trebuie să fie RubyGems"
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr "%{boldStart}Permiteți duplicatele%{boldEnd} - Acceptați pachetele cu același nume și versiune."
-
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
-msgstr "%{boldStart}Nu permite duplicatele%{boldEnd} - Respinge pachetele cu același nume și versiune."
-
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr "%{name} versiunea %{version} a fost creată pentru prima dată la %{datetime}"
@@ -27184,8 +27679,11 @@ msgstr "Adăugați sursa NuGet"
msgid "PackageRegistry|Add composer registry"
msgstr "Adăugați registrul compozitorului"
-msgid "PackageRegistry|Allow duplicates"
-msgstr "Permiteți duplicatele"
+msgid "PackageRegistry|Additional metadata"
+msgstr "Metadate suplimentare"
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
+msgstr "Permiteți încărcarea în registru a pachetelor cu același nume și versiune. Cea mai nouă versiune a unui pachet este întotdeauna utilizată la instalare."
msgid "PackageRegistry|App group: %{group}"
msgstr "Grupul de aplicații: %{group}"
@@ -27292,6 +27790,9 @@ msgstr "Ștergeți pachetul"
msgid "PackageRegistry|Delete this package"
msgstr "Ștergeți acest pachet"
+msgid "PackageRegistry|Duplicate packages"
+msgstr "Pachete duplicate"
+
msgid "PackageRegistry|Error publishing"
msgstr "Eroare de publicare"
@@ -27335,7 +27836,7 @@ msgid "PackageRegistry|If you haven't already done so, you will need to add the
msgstr "Dacă nu ați făcut-o deja, va trebui să adăugați următoarele la fișierul d-voastră %{codeStart}.pypirc%{codeEnd}."
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}pom.xml%{codeEnd} file."
-msgstr "Dacă nu ați făcut-o deja, va trebui să adăugați următoarele la fișierul dvs. %{codeStart}pom.xml%{codeEnd}."
+msgstr "Dacă nu ați făcut-o deja, va trebui să adăugați următoarele la fișierul d-voastră. %{codeStart}pom.xml%{codeEnd}."
msgid "PackageRegistry|Install package version"
msgstr "Instalați versiunea pachetului"
@@ -27409,6 +27910,9 @@ msgstr "Rețetă: %{recipe}"
msgid "PackageRegistry|Registry setup"
msgstr "Configurarea registrului"
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr "Respingeți pachetele cu același nume și versiune"
+
msgid "PackageRegistry|Remove package"
msgstr "Înlăturarea pachetului"
@@ -27449,7 +27953,10 @@ msgid "PackageRegistry|Something went wrong while deleting the package."
msgstr "Ceva nu a mers bine la ștergerea pachetului."
msgid "PackageRegistry|Something went wrong while fetching the package history."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării istoricului pachetului."
+
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr "Ceva nu a mers bine la preluarea metadatelor pachetului."
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Ne pare rău, filtrul dvs. nu a produs rezultate"
@@ -27482,7 +27989,7 @@ msgid "PackageRegistry|To widen your search, change or remove the filters above.
msgstr "Pentru a vă extinde căutarea, modificați sau eliminați filtrele de mai sus."
msgid "PackageRegistry|Type"
-msgstr "Tip"
+msgstr "Tipul"
msgid "PackageRegistry|Unable to fetch package version information."
msgstr "Nu se pot obține informații despre versiunea pachetului."
@@ -27490,9 +27997,6 @@ msgstr "Nu se pot obține informații despre versiunea pachetului."
msgid "PackageRegistry|Unable to load package"
msgstr "Nu se poate încărca pachetul"
-msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Utilizați GitLab ca registru privat pentru formatele de pachete comune. %{linkStart}Aflați mai multe.%{linkEnd}"
-
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
msgstr "Sunteți pe cale să ștergeți %{filename}. Aceasta este o acțiune distructivă care poate face pachetul dvs. inutilizabil. Sunteți sigur?"
@@ -27512,70 +28016,70 @@ msgid "PackageRegistry|published by %{author}"
msgstr "publicat de %{author}"
msgid "Packages & Registries"
-msgstr ""
+msgstr "Pachete și registre"
msgid "Page not found"
-msgstr ""
+msgstr "Pagina nu a fost găsită"
msgid "PagerDutySettings|Active"
msgstr "Activ"
msgid "PagerDutySettings|Create a GitLab incident for each PagerDuty incident by %{linkStart}configuring a webhook in PagerDuty%{linkEnd}"
-msgstr ""
+msgstr "Creați un incident GitLab pentru fiecare incident PagerDuty prin %{linkStart}configurarea unui webhook în PagerDuty%{linkEnd}"
msgid "PagerDutySettings|Failed to update Webhook URL"
-msgstr "Nu s-a reușit să se actualizeze URL-ul Webhook-ului"
+msgstr "Actualizarea URL-ului Webhook a eșuat"
msgid "PagerDutySettings|Reset webhook URL"
-msgstr ""
+msgstr "Resetați URL-ul webhook"
msgid "PagerDutySettings|Resetting the webhook URL for this project will require updating this integration's settings in PagerDuty."
-msgstr ""
+msgstr "Resetarea URL-ului webhook pentru acest proiect va necesita actualizarea setărilor acestei integrări în PagerDuty."
msgid "PagerDutySettings|Webhook URL"
-msgstr ""
+msgstr "URL webhook"
msgid "PagerDutySettings|Webhook URL update was successful"
-msgstr ""
+msgstr "Actualizarea URL-ului Webhook a avut succes"
msgid "Pages"
-msgstr ""
+msgstr "Pages"
msgid "Pages Domain"
-msgstr ""
+msgstr "Domeniul Pages"
msgid "Pagination|First"
-msgstr ""
+msgstr "Prima"
msgid "Pagination|Go to first page"
-msgstr ""
+msgstr "Mergeți la prima pagină"
msgid "Pagination|Go to last page"
-msgstr ""
+msgstr "Mergeți la ultima pagină"
msgid "Pagination|Go to next page"
-msgstr ""
+msgstr "Mergeți la pagina următoare"
msgid "Pagination|Go to previous page"
-msgstr ""
+msgstr "Mergeți la pagina anterioară"
msgid "Pagination|Last"
-msgstr ""
+msgstr "Ultima"
msgid "Pagination|Last »"
-msgstr ""
+msgstr "Ultima »"
msgid "Pagination|Next"
-msgstr ""
+msgstr "Următoarea"
msgid "Pagination|Prev"
-msgstr ""
+msgstr "Anterior"
msgid "Pagination|« First"
-msgstr ""
+msgstr "« Prima"
msgid "Parameter"
-msgstr ""
+msgstr "Parametru"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr "Parametrul „job_id†nu poate depăși lungimea de %{job_id_max_size}"
@@ -27583,86 +28087,80 @@ msgstr "Parametrul „job_id†nu poate depăși lungimea de %{job_id_max_size}
msgid "Parent"
msgstr "Părinte"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
-msgstr ""
+msgstr "Epica părinte nu există."
msgid "Parent epic is not present."
-msgstr ""
-
-msgid "Parent must be in the same project as child."
-msgstr ""
+msgstr "Epica părinte nu este prezentă."
msgid "Parsing error for param :embed_json. %{message}"
-msgstr ""
+msgstr "Eroare de analiză pentru parametrul :embed_json. %{message}"
msgid "Part of merge request changes"
-msgstr ""
+msgstr "O parte din modificările merge request-ului"
msgid "Partial import"
msgstr "Import parțial"
msgid "Participants"
-msgstr ""
+msgstr "Participanți"
msgid "Pass job variables"
-msgstr ""
+msgstr "Treceți variabilele jobului"
msgid "Passed"
-msgstr ""
+msgstr "A trecut"
msgid "Passed on"
-msgstr ""
+msgstr "A trecut la"
msgid "Password"
-msgstr ""
+msgstr "Parola"
msgid "Password (optional)"
-msgstr ""
+msgstr "Parolă (opțional)"
msgid "Password authentication is unavailable."
-msgstr ""
+msgstr "Autentificarea prin parolă nu este disponibilă."
msgid "Password confirmation"
-msgstr ""
+msgstr "Confirmarea parolei"
msgid "Password successfully changed"
-msgstr ""
+msgstr "Parola a fost schimbată cu succes"
msgid "Password was successfully updated. Please sign in again."
-msgstr ""
+msgstr "Parola a fost actualizată cu succes. Vă rugăm să vă conectați din nou."
msgid "PasswordPrompt|Confirm password"
-msgstr ""
+msgstr "Confirmați parola"
msgid "PasswordPrompt|Confirm password to continue"
-msgstr ""
+msgstr "Confirmați parola pentru a continua"
msgid "PasswordPrompt|Password is required"
-msgstr ""
+msgstr "Parola este necesară"
msgid "PasswordPrompt|Please enter your password to confirm"
-msgstr ""
+msgstr "Vă rugăm să introduceți parola pentru a confirma"
msgid "Passwords should be unique and not used for any other sites or services."
msgstr "Parolele ar trebui să fie unice și să nu fie utilizate pentru alte site-uri sau servicii."
msgid "Password|requires at least one lowercase letter"
-msgstr ""
+msgstr "necesită cel puțin o literă minusculă"
msgid "Password|requires at least one number"
-msgstr ""
+msgstr "necesită cel puțin un număr"
msgid "Password|requires at least one symbol character"
-msgstr ""
+msgstr "necesită cel puțin un simbol"
msgid "Password|requires at least one uppercase letter"
-msgstr ""
+msgstr "necesită cel puțin o majusculă"
msgid "Past due"
-msgstr ""
+msgstr "Depășit"
msgid "Paste a public key here."
msgstr "Lipiți aici o cheie publică."
@@ -27677,13 +28175,13 @@ msgid "Paste confidential issue link"
msgstr "Lipiți linkul problemei confidențiale"
msgid "Paste epic link"
-msgstr ""
+msgstr "Lipiți linkul epicei"
msgid "Paste issue link"
-msgstr ""
+msgstr "Lipiți linkul problemei"
msgid "Paste link"
-msgstr ""
+msgstr "Lipiți linkul"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr "Lipiți calea proiectului (de exemplu, gitlab-org/gitlab)"
@@ -27692,154 +28190,154 @@ msgid "Paste this DSN into your Sentry SDK"
msgstr "Lipiți acest DSN în SDK-ul dvs. Sentry"
msgid "Patch to apply"
-msgstr ""
+msgstr "Patch de aplicat"
msgid "Path"
-msgstr ""
+msgstr "Cale"
msgid "Path:"
-msgstr ""
+msgstr "Cale:"
msgid "Paths can contain wildcards, like */welcome"
-msgstr ""
+msgstr "Căile pot conține wildcard-uri, cum ar fi */welcome"
msgid "Paths to protect with rate limiting"
msgstr "Căile care trebuie protejate cu limitarea ratei"
msgid "Pause"
-msgstr ""
+msgstr "Pauză"
msgid "Pause indexing and upgrade Elasticsearch to a supported version."
-msgstr ""
+msgstr "Întrerupeți indexarea și actualizați Elasticsearch la o versiune acceptată."
msgid "Pause time (ms)"
msgstr "Timp de pauză (ms)"
msgid "Paused"
-msgstr ""
+msgstr "ÃŽntrerupt"
msgid "Paused runners don't accept new jobs"
-msgstr "Executorii în pauză nu acceptă joburi noi"
+msgstr "Executorii întrerupți nu acceptă joburi noi"
msgid "Peer review by"
-msgstr "Recenzie peer de"
+msgstr "Evaluare „inter pares†de către"
msgid "Pending"
-msgstr ""
+msgstr "În așteptare"
msgid "Pending Deletion"
msgstr "În așteptarea ștergerii"
msgid "Pending comments"
-msgstr ""
+msgstr "Comentarii în așteptare"
msgid "Pending deletion"
msgstr "În așteptarea ștergerii"
msgid "Pending owner action"
-msgstr ""
+msgstr "În așteptarea acțiunii proprietarului"
msgid "Pending sync…"
-msgstr ""
+msgstr "Sincronizare în așteptare…"
msgid "People without permission will never get a notification and won't be able to comment."
-msgstr ""
+msgstr "Persoanele fără permisiune nu vor primi niciodată o notificare și nu vor putea să comenteze."
msgid "People without permission will never get a notification."
-msgstr ""
+msgstr "Persoanele fără permisiune nu vor primi niciodată o notificare."
msgid "Per your subscription agreement with GitLab, you must report your license usage data on a monthly basis. GitLab uses this data to keep your subscription up to date. To report your license usage data, export your license usage file and email it to %{renewal_service_email}. If you need an updated license, GitLab will send the license to the email address registered in the %{customers_dot}, and you can upload this license to your instance."
-msgstr ""
+msgstr "Conform contractului de abonament încheiat cu GitLab, trebuie să raportați lunar datele de utilizare a licenței. GitLab utilizează aceste date pentru a vă menține abonamentul la zi. Pentru a raporta datele de utilizare a licenței, exportați fișierul de utilizare a licenței și trimiteți-l prin e-mail la %{renewal_service_email}. Dacă aveți nevoie de o licență actualizată, GitLab va trimite licența la adresa de e-mail înregistrată în %{customers_dot}, iar dumneavoastră puteți încărca această licență în propria instanță."
msgid "Percent rollout must be an integer number between 0 and 100"
msgstr "Implementarea procentuală trebuie să fie un număr întreg între 0 și 100"
msgid "Percentage"
-msgstr ""
+msgstr "Procentaj"
msgid "Perform advanced options such as changing path, transferring, exporting, or removing the group."
-msgstr ""
+msgstr "Efectuați opțiuni avansate, cum ar fi modificarea căii, transferul, exportul sau înlăturarea grupului."
msgid "Perform code reviews and enhance collaboration with merge requests."
-msgstr ""
+msgstr "Efectuați revizuiri de cod și îmbunătățiți colaborarea cu merge request-uri."
msgid "Perform common operations on GitLab project"
-msgstr ""
+msgstr "Efectuați operații comune în proiectul GitLab"
msgid "Performance optimization"
-msgstr ""
+msgstr "Optimizarea performanțelor"
msgid "PerformanceBar|Backend"
msgstr "Backend"
msgid "PerformanceBar|Bullet notifications"
-msgstr ""
+msgstr "Notificări Bullet"
msgid "PerformanceBar|DOM Content Loaded"
-msgstr ""
+msgstr "Conținutul DOM încărcat"
msgid "PerformanceBar|Download"
-msgstr ""
+msgstr "Descărcare"
msgid "PerformanceBar|Elasticsearch calls"
msgstr "Apeluri Elasticsearch"
msgid "PerformanceBar|External Http calls"
-msgstr ""
+msgstr "Apeluri Http externe"
msgid "PerformanceBar|First Contentful Paint"
-msgstr ""
+msgstr "Prima mapare a conținutului"
msgid "PerformanceBar|Flamegraph with mode:"
-msgstr ""
+msgstr "Flamegraph cu modul:"
msgid "PerformanceBar|Frontend resources"
-msgstr ""
+msgstr "Resurse frontend"
msgid "PerformanceBar|Gitaly calls"
msgstr "Apelurile Gitaly"
msgid "PerformanceBar|Memory"
-msgstr ""
+msgstr "Memorie"
msgid "PerformanceBar|Memory report"
-msgstr ""
+msgstr "Raport de memorie"
msgid "PerformanceBar|Redis calls"
-msgstr ""
+msgstr "Apeluri Redis"
msgid "PerformanceBar|Rugged calls"
-msgstr ""
+msgstr "Apeluri Rugged"
msgid "PerformanceBar|SQL queries"
-msgstr ""
+msgstr "Interogări SQL"
msgid "PerformanceBar|Sort by duration"
msgstr "Sortare după durată"
msgid "PerformanceBar|Sort chronologically"
-msgstr ""
+msgstr "Sortare cronologică"
msgid "PerformanceBar|Stats"
-msgstr ""
+msgstr "Statistici"
msgid "PerformanceBar|Total duration"
msgstr "Durata totală"
msgid "PerformanceBar|Trace"
-msgstr ""
+msgstr "Trace"
msgid "PerformanceBar|cpu"
-msgstr ""
+msgstr "cpu"
msgid "PerformanceBar|object"
-msgstr ""
+msgstr "obiect"
msgid "PerformanceBar|wall"
-msgstr ""
+msgstr "perete"
msgid "Period in seconds"
-msgstr "Perioadă în secunde"
+msgstr "Perioada în secunde"
msgid "Permalink"
msgstr "Permalink"
@@ -27848,10 +28346,10 @@ msgid "Permanently remove group"
msgstr "Înlăturați definitiv grupul"
msgid "Permissions"
-msgstr ""
+msgstr "Permisiuni"
msgid "Permissions Help"
-msgstr ""
+msgstr "Ajutor pentru permisiuni"
msgid "Permissions and group features"
msgstr "Permisiuni și funcții de grup"
@@ -27866,10 +28364,10 @@ msgid "Personal project creation is not allowed. Please contact your administrat
msgstr "Nu este permisă crearea de proiecte personale. Vă rugăm să contactați administratorul dvs. dacă aveți întrebări"
msgid "Personal projects"
-msgstr ""
+msgstr "Proiecte personale"
msgid "Personal projects limit:"
-msgstr ""
+msgstr "Limita proiectelor personale:"
msgid "Phabricator Server Import"
msgstr "Import de pe serverul Phabricator"
@@ -27884,40 +28382,40 @@ msgid "Phone"
msgstr "Telefon"
msgid "Pick a name"
-msgstr ""
+msgstr "Alegeți un nume"
msgid "Pin code"
-msgstr ""
+msgstr "Codul PIN"
msgid "Pipeline"
-msgstr "Conductă"
+msgstr "Pipeline"
msgid "Pipeline %{label}"
-msgstr ""
+msgstr "Pipeline-ul %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
-msgstr ""
+msgstr "Pipeline-ul %{label} pentru „%{dataTitle}â€"
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr "Sunteți sigur că vreți să resetați fișierul la ultima sa versiune comisă?"
msgid "Pipeline ID"
-msgstr "ID conductă"
+msgstr "ID-ul pipeline-ului"
msgid "Pipeline IID"
-msgstr "IID conductă"
+msgstr "IID-ul pipeline-ului"
msgid "Pipeline Schedule"
-msgstr ""
+msgstr "Programul pipeline-ului"
msgid "Pipeline Schedules"
-msgstr ""
+msgstr "Programele pipeline-ului"
msgid "Pipeline URL"
-msgstr "URL conductă"
+msgstr "URL-ul pipeline-ului"
msgid "Pipeline creation rate limits"
-msgstr ""
+msgstr "Limitele ratei de creare a pipeline-urilor"
msgid "Pipeline durations for the last 30 commits"
msgstr "Duratele pipeline-ului pentru ultimele 30 de commit-uri"
@@ -27926,10 +28424,10 @@ msgid "Pipeline ran in fork of project"
msgstr "Pipeline-ul a rulat în forkul proiectului"
msgid "Pipeline status emails"
-msgstr ""
+msgstr "E-mailuri de stare a pipeline-ului"
msgid "Pipeline subscriptions"
-msgstr ""
+msgstr "Abonamente la pipeline"
msgid "Pipeline subscriptions trigger a new pipeline on the default branch of this project when a pipeline successfully completes for a new tag on the %{default_branch_docs} of the subscribed project."
msgstr "Abonamentele la pipeline declanșează un nou pipeline pe ramura implicită a acestui proiect atunci când un pipeline se finalizează cu succes pentru o nouă etichetă pe %{default_branch_docs} a proiectului abonat."
@@ -27938,7 +28436,7 @@ msgid "Pipeline triggers"
msgstr "Declanșatori de pipeline-uri"
msgid "Pipeline: %{status}"
-msgstr ""
+msgstr "Pipeline: %{status}"
msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr "A apărut o eroare la preluarea datelor analitice"
@@ -27953,7 +28451,7 @@ msgid "PipelineCharts|CI/CD Analytics"
msgstr "Analize CI/CD"
msgid "PipelineCharts|Failed:"
-msgstr "A eșuat:"
+msgstr "Eșuat:"
msgid "PipelineCharts|Overall statistics"
msgstr "Statistici generale"
@@ -27977,40 +28475,40 @@ msgid "PipelineEditorFileTree|When you use the include keyword to add pipeline c
msgstr "Atunci când utilizați cuvântul cheie include pentru a adăuga configurația pipeline-ului din fișierele din proiect, aceste fișiere vor fi enumerate aici."
msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
-msgstr "Parcurgeți %{linkStart}exemple și șabloane CI/CD%{linkEnd}"
+msgstr "Răsfoiți %{linkStart}exemple și șabloane CI/CD%{linkEnd}"
msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr "Comiteți fișierul în repozitoriul dumneavoastră. Apoi, pipeline-ul se execută automat."
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
-msgstr "Demarați cu GitLab CI/CD"
+msgstr "Începeți cu GitLab CI/CD"
msgid "PipelineEditorTutorial|GitLab CI/CD can automatically build, test, and deploy your application."
msgstr "GitLab CI/CD poate construi, testa și implementa automat aplicația dumneavoastră."
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
-msgstr "Dacă folosiți o instanță GitLab autogestionată, %{linkStart}asigurați-vă că instanța dvs. are executori disponibili.%{linkEnd}"
+msgstr "Dacă folosiți o instanță GitLab cu autogestionare, %{linkStart}asigurați-vă că instanța dvs. are executori disponibili.%{linkEnd}"
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr "Aflați mai multe despre %{linkStart}conceptele GitLab CI/CD%{linkEnd}"
msgid "PipelineEditorTutorial|Make your pipeline more efficient with the %{linkStart}Needs keyword%{linkEnd}"
-msgstr ""
+msgstr "Eficientizați-vă pipeline-ul cu ajutorul %{linkStart}cuvântului cheie Needs%{linkEnd}"
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr "Resurse pentru a vă ajuta cu configurația CI/CD:"
msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
-msgstr ""
+msgstr "Selectați ID-ul pipeline-ului pentru a vizualiza detaliile complete despre prima dvs. rulare a pipeline-ului."
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 "Etapele și joburile din pipeline sunt definite într-un fișier %{codeStart}.gitlab-ci.yml%{codeEnd}. Puteți edita, vizualiza și valida sintaxa din acest fișier utilizând Editorul de conducte."
+msgstr "Etapele și joburile din pipeline sunt definite într-un fișier %{codeStart}.gitlab-ci.yml%{codeEnd}. Puteți edita, vizualiza și valida sintaxa din acest fișier utilizând Editorul de pipeline-uri."
msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr "Starea pipeline-ului se află în partea de sus a paginii."
msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
-msgstr ""
+msgstr "Acest șablon creează un pipeline de testare simplu. Pentru a-l utiliza:"
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 "Utilizați filele Vizualizare și Lint din Editorul de pipeline pentru a vizualiza pipeline-ul dvs. și pentru a verifica dacă există erori sau avertismente înainte de a comite modificările."
@@ -28019,13 +28517,31 @@ msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{
msgstr "Vizualizați %{linkStart}referința de sintaxă pentru .gitlab-ci.yml%{linkEnd}"
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
-msgstr ""
+msgstr "âš™ï¸ Referință de configurare a pipeline-ului"
msgid "PipelineEditorTutorial|💡 Tip: Visualize and validate your pipeline"
msgstr "💡 Sfat: Vizualizați și validați-vă pipeline-ul"
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
-msgstr ""
+msgstr "🚀 Rulați primul dvs. pipeline"
+
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr "Conținutul curent din fila Editare va fi utilizat pentru simulare."
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr "Eveniment push Git pentru ramura implicită"
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr "Alte surse de pipeline-uri nu sunt disponibile încă."
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr "Sursa pipeline-ului"
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr "Comportamentul pipeline-ului va fi simulat, inclusiv %{codeStart}regulile%{codeEnd} %{codeStart}only%{codeEnd}, %{codeStart}except%{codeEnd} și %{codeStart}needs%{codeEnd} ale dependențelor jobului."
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr "Comportamentul pipeline-ului va fi simulat, inclusiv %{codeStart}regulile%{codeEnd} %{codeStart}only%{codeEnd}, %{codeStart}except%{codeEnd} și %{codeStart}needs%{codeEnd} ale dependențelor jobului. %{linkStart}Aflați mai multe%{linkEnd}"
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr "Configurația CI/CD este validată în mod continuu. Sunt afișate erori și avertismente atunci când fișierul de configurare CI/CD nu este gol."
@@ -28034,43 +28550,52 @@ msgid "PipelineEditor|The merged YAML view is displayed when the CI/CD configura
msgstr "Vizualizarea YAML îmbinată este afișată atunci când fișierul de configurare CI/CD are o sintaxă validă."
msgid "PipelineEditor|The pipeline visualization is displayed when the CI/CD configuration file has valid syntax."
-msgstr "Vizualizarea conductei este afișată atunci când fișierul de configurare CI/CD are o sintaxă validă."
+msgstr "Vizualizarea pipeline-ului este afișată atunci când fișierul de configurare CI/CD are o sintaxă validă."
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr "Această filă va fi utilizabilă atunci când fișierul de configurare CI/CD este populat cu o sintaxă validă."
+msgid "PipelineEditor|Validate pipeline"
+msgstr "Validați pipeline-ul"
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr "Validați pipeline-ul în condițiile selectate"
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr "Validați pipeline-ul în condiții simulate"
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr "Personalizat (%{linkStart}Sintaxă Cron%{linkEnd})"
msgid "PipelineSchedules|Activated"
-msgstr ""
+msgstr "Activat"
msgid "PipelineSchedules|Active"
msgstr "Activ"
msgid "PipelineSchedules|All"
-msgstr ""
+msgstr "Toate"
msgid "PipelineSchedules|Inactive"
msgstr "Inactiv"
msgid "PipelineSchedules|Next Run"
-msgstr ""
+msgstr "Următoarea execuție"
msgid "PipelineSchedules|None"
-msgstr ""
+msgstr "Niciunul"
msgid "PipelineSchedules|Provide a short description for this pipeline"
msgstr "Furnizați o scurtă descriere pentru acest pipeline"
msgid "PipelineSchedules|Take ownership"
-msgstr ""
+msgstr "Asumați-vă proprietatea"
msgid "PipelineSchedules|Target"
-msgstr ""
+msgstr "Țintă"
msgid "PipelineSchedules|Variables"
-msgstr ""
+msgstr "Variabile"
msgid "PipelineSource|API"
msgstr "API"
@@ -28121,70 +28646,70 @@ msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
msgstr "Pipeline: %{ci_status}"
msgid "PipelineWizardDefaultCommitMessage|Add %{filename}"
-msgstr ""
+msgstr "Adăugați %{filename}"
msgid "PipelineWizardDefaultCommitMessage|Update %{filename}"
-msgstr ""
+msgstr "Actualizați %{filename}"
msgid "PipelineWizardInputValidation|At least one entry is required"
-msgstr ""
+msgstr "Este necesară cel puțin o intrare"
msgid "PipelineWizardInputValidation|This field is required"
-msgstr ""
+msgstr "Acest câmp este obligatoriu"
msgid "PipelineWizardInputValidation|This value is not valid"
-msgstr ""
+msgstr "Această valoare nu este validă"
msgid "PipelineWizardListWidget|add another step"
-msgstr ""
+msgstr "adăugați încă o etapă"
msgid "PipelineWizardListWidget|remove step"
-msgstr ""
+msgstr "înlăturați etapa"
msgid "PipelineWizard|Commit"
-msgstr ""
+msgstr "Comiteți"
msgid "PipelineWizard|Commit Message"
-msgstr ""
+msgstr "Mesajul commit-ului"
msgid "PipelineWizard|Commit changes to your file"
-msgstr "Comiteți modificările aduse fișierului dumneavoastră"
+msgstr "Comiteți modificările aduse fișierului d-voastră"
msgid "PipelineWizard|Commit file to Branch"
msgstr "Comiteți fișierul în Ramură"
msgid "PipelineWizard|Commit your new file"
-msgstr ""
+msgstr "Comiteți noul dvs. fișier"
msgid "PipelineWizard|The file has been committed."
-msgstr "Commit-ul fișierului s-a efectuat."
+msgstr "Fișierul a fost comis."
msgid "PipelineWizard|There was a problem committing the changes."
-msgstr ""
+msgstr "A apărut o problemă la comiterea modificărilor."
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
-msgstr ""
+msgstr "A apărut o problemă la verificarea dacă fișierul dvs. există deja în ramura specificată."
msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
msgstr "A apărut o eroare neașteptată la încercarea de a configura șablonul. Eroarea a fost înregistrată."
msgid "Pipelines"
-msgstr ""
+msgstr "Pipeline-uri"
msgid "Pipelines charts"
msgstr "Diagrame de pipeline-uri"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
-msgstr ""
+msgstr "Setările pipeline-urilor pentru „%{project_name}†au fost actualizate cu succes."
msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr "„Hello world†cu GitLab Cl"
msgid "Pipelines|1. Set up a runner"
-msgstr ""
+msgstr "1. Configurați un executor"
msgid "Pipelines|2. Configure deployment pipeline"
-msgstr ""
+msgstr "2. Configurați pipeline-ul de implementare"
msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr "Un GitLab Runner este o aplicație care funcționează cu GitLab CI/CD pentru a rula joburi într-un pipeline. Instalați GitLab Runner și înregistrați-vă propriii executori pentru a începe cu CI/CD."
@@ -28199,13 +28724,13 @@ msgid "Pipelines|Auto DevOps"
msgstr "Auto DevOps"
msgid "Pipelines|Based on your project, we recommend this template:"
-msgstr ""
+msgstr "Pe baza proiectului dumneavoastră, vă recomandăm acest șablon:"
msgid "Pipelines|Build with confidence"
msgstr "Construiți cu încredere"
msgid "Pipelines|Building for iOS?"
-msgstr ""
+msgstr "Construiți pentru iOS?"
msgid "Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?"
msgstr "Prin revocarea unui declanșator, veți întrerupe toate procesele care îl utilizează. Sunteți sigur?"
@@ -28223,10 +28748,10 @@ msgid "Pipelines|Configuration validation currently not available."
msgstr "Validarea configurației nu este disponibilă în prezent."
msgid "Pipelines|Configure pipeline"
-msgstr ""
+msgstr "Configurați pipeline-ul"
msgid "Pipelines|Continuous integration and deployment template to test and deploy your %{name} project."
-msgstr ""
+msgstr "Șablon de integrare și implementare continuă pentru a vă testa și implementa proiectul %{name}."
msgid "Pipelines|Copy trigger token"
msgstr "Copiați tokenul declanșatorului"
@@ -28241,7 +28766,7 @@ msgid "Pipelines|Description"
msgstr "Descriere"
msgid "Pipelines|Don't need a guide? Jump in right away with a template."
-msgstr ""
+msgstr "Nu aveți nevoie de un ghid? Treceți imediat la treabă cu un șablon."
msgid "Pipelines|Edit"
msgstr "Editare"
@@ -28250,7 +28775,7 @@ msgid "Pipelines|Editor"
msgstr "Editor"
msgid "Pipelines|Follow these instructions to install GitLab Runner on macOS."
-msgstr ""
+msgstr "Urmați aceste instrucțiuni pentru a instala GitLab Runner pe macOS."
msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr "Familiarizați-vă cu sintaxa GitLab CI prin configurarea unui pipeline simplu care rulează un script „Hello world†pentru a vedea cum se execută, explorați modul în care funcționează CI/CD."
@@ -28262,10 +28787,10 @@ msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your cod
msgstr "GitLab CI/CD vă poate construi, testa și implementa automat codul. Lăsați GitLab să se ocupe de sarcinile consumatoare de timp, astfel încât să puteți petrece mai mult timp creând."
msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline."
-msgstr ""
+msgstr "GitLab Runner este o aplicație care funcționează cu GitLab CI/CD pentru a rula joburi într-un pipeline."
msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
-msgstr "GitLab Runner este o aplicație care funcționează cu GitLab CI/CD pentru a rula joburi într-un pipeline. Există executori activi disponibili pentru a vă rula joburile chiar acum. Dacă preferați, puteți %{settingsLinkStart}configura executorii dvs.%{settingsLinkEnd} sau %{docsLinkStart}învăța mai multe%{docsLinkEnd} despre executori."
+msgstr "GitLab Runner este o aplicație care funcționează cu GitLab CI/CD pentru a rula joburi într-un pipeline. Există executori activi disponibili pentru a vă rula joburile chiar acum. Dacă preferați, vă puteți %{settingsLinkStart}configura executorii%{settingsLinkEnd} sau puteți %{docsLinkStart}afla mai multe%{docsLinkEnd} despre executori."
msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr "Dacă nu sunteți sigur, vă rugăm să cereți unui responsabil de proiect să-l revizuiască pentru dumneavoastră."
@@ -28280,16 +28805,16 @@ msgid "Pipelines|Last Used"
msgstr "Ultima utilizare"
msgid "Pipelines|Learn the basics of pipelines and .yml files"
-msgstr "Învățați noțiunile de bază despre conducte și fișiere .yml"
+msgstr "Învățați elementele de bază despre pipeline-uri și fișiere .yml"
msgid "Pipelines|Let's get that runner set up! %{emojiStart}tada%{emojiEnd}"
-msgstr ""
+msgstr "Haideți să pregătim acel executor! %{emojiStart}tada%{emojiEnd}"
msgid "Pipelines|Lint"
msgstr "Lint"
msgid "Pipelines|Loading Pipelines"
-msgstr "Încărcare conducte"
+msgstr "Se încarcă pipeline-urile"
msgid "Pipelines|Loading pipelines"
msgstr "Se încarcă pipeline-urile"
@@ -28301,7 +28826,7 @@ msgid "Pipelines|More Information"
msgstr "Mai multe informații"
msgid "Pipelines|Need more information to set up your runner? %{linkStart}Check out our documentation%{linkEnd}."
-msgstr ""
+msgstr "Aveți nevoie de mai multe informații pentru a vă configura executorul? %{linkStart}Consultați documentația noastră%{linkEnd}."
msgid "Pipelines|No runners detected"
msgstr "Nu a fost detectat niciun executor"
@@ -28310,7 +28835,7 @@ msgid "Pipelines|No triggers have been created yet. Add one using the form above
msgstr "Încă nu a fost creat niciun declanșator. Adăugați unul folosind formularul de mai sus."
msgid "Pipelines|Not building for iOS or not what you're looking for? %{linkStart}See what else%{linkEnd} GitLab CI/CD has to offer."
-msgstr ""
+msgstr "Nu construiți pentru iOS sau nu este ceea ce căutați? %{linkStart}Vedeți ce altceva%{linkEnd} are de oferit GitLab CI/CD."
msgid "Pipelines|Owner"
msgstr "Proprietar"
@@ -28331,7 +28856,7 @@ msgid "Pipelines|Runners are available to run your jobs now"
msgstr "Executorii sunt disponibili pentru a vă rula joburile acum"
msgid "Pipelines|Set up a runner"
-msgstr ""
+msgstr "Configurați un executor"
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "A apărut o eroare în timpul curățării cache-ului executorilor."
@@ -28340,7 +28865,7 @@ msgid "Pipelines|The %{namespace_name} namespace has %{percentage}%% or less Sha
msgstr "Spațiul de nume %{namespace_name} mai are %{percentage}%% sau mai puține minute rămase de pipeline pentru executorii partajați. După epuizarea lor, nu se va mai executa niciun job sau pipeline nou în proiectele sale."
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 "Spațiul de nume %{namespace_name} a depășit cota de minute de pipeline. Achiziționați minute suplimentare de pipeline sau nu se vor executa noi lucrări sau pipeline-uri în proiectele sale."
+msgstr "Spațiul de nume %{namespace_name} a depășit cota de minute de funcționare a pipeline-ului. Achiziționați minute suplimentare de pipeline sau nu se vor executa noi joburi sau pipeline-uri în proiectele sale."
msgid "Pipelines|The CI configuration was not loaded, please try again."
msgstr "Configurația CI nu a fost încărcată, vă rugăm să încercați din nou."
@@ -28391,13 +28916,13 @@ msgid "Pipelines|Token"
msgstr "Token"
msgid "Pipelines|Trigger user has insufficient permissions to project"
-msgstr "Utilizatorul care declanșează are permisiuni insuficiente pentru proiect"
+msgstr "Utilizatorul declanșator nu are permisiuni suficiente pentru proiect"
msgid "Pipelines|Try test template"
msgstr "Încercați șablonul de testare"
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
-msgstr "Utilizați un eșantion de fișier șablon %{codeStart}.gitlab-ci.yml%{codeEnd} pentru a explora modul în care funcționează CI/CD."
+msgstr "Utilizați un exemplu de fișier șablon %{codeStart}.gitlab-ci.yml%{codeEnd} pentru a explora modul în care funcționează CI/CD."
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr "Utilizați un șablon bazat pe limbajul sau framework-ul proiectului dvs. pentru a începe cu GitLab CI/CD."
@@ -28405,6 +28930,9 @@ msgstr "Utilizați un șablon bazat pe limbajul sau framework-ul proiectului dvs
msgid "Pipelines|Use template"
msgstr "Utilizați șablonul"
+msgid "Pipelines|Validate"
+msgstr "Validare"
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr "Se validează configurația GitLab CI…"
@@ -28415,13 +28943,13 @@ msgid "Pipelines|Visualize"
msgstr "Vizualizare"
msgid "Pipelines|We'll guide you through a simple pipeline set-up."
-msgstr ""
+msgstr "Vă vom ghida prin configurarea simplă a unui pipeline."
msgid "Pipelines|We'll walk you through how to deploy to iOS in two easy steps."
-msgstr ""
+msgstr "Vă vom prezenta cum să implementați pe iOS în doi pași simpli."
msgid "Pipelines|You have runners available to run your job now. No need to do anything else."
-msgstr ""
+msgstr "Acum aveți executori disponibili pentru a vă executa activitatea. Nu este nevoie să faceți nimic altceva."
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "Schimbările dvs. au fost comise cu succes. Acum se redirecționează către noua pagină a merge request-ului."
@@ -28448,112 +28976,112 @@ msgid "Pipelines|yaml invalid"
msgstr "yaml invalid"
msgid "Pipeline|Actions"
-msgstr ""
+msgstr "Acțiuni"
msgid "Pipeline|Branch name"
-msgstr ""
+msgstr "Numele ramurii"
msgid "Pipeline|Branches or tags could not be loaded."
-msgstr ""
+msgstr "Ramurile sau etichetele nu au putut fi încărcate."
msgid "Pipeline|Canceled"
-msgstr ""
+msgstr "Anulat"
msgid "Pipeline|Checking pipeline status"
-msgstr "Se verifică statusul pipeline-ului"
+msgstr "Verificarea stării pipeline-ului"
msgid "Pipeline|Checking pipeline status."
-msgstr "Se verifică statusul pipeline-ului"
+msgstr "Verificarea stării pipeline-ului."
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
-msgstr ""
+msgstr "Nu s-a putut recupera starea pipeline-ului. Pentru pașii de depanare, citiți %{linkStart}documentația%{linkEnd}."
msgid "Pipeline|Created"
-msgstr ""
+msgstr "Creată"
msgid "Pipeline|Creating pipeline."
-msgstr ""
+msgstr "Se creează pipeline-ul."
msgid "Pipeline|Date"
-msgstr ""
+msgstr "Data"
msgid "Pipeline|Detached merge request pipeline"
-msgstr ""
+msgstr "Pipeline de merge request detașat"
msgid "Pipeline|Failed"
-msgstr ""
+msgstr "Eșuat"
msgid "Pipeline|In progress"
-msgstr ""
+msgstr "ÃŽn curs"
msgid "Pipeline|Manual"
-msgstr ""
+msgstr "Manual"
msgid "Pipeline|Merge train pipeline"
-msgstr ""
+msgstr "Pipeline de merge train"
msgid "Pipeline|Merge train pipeline jobs can not be retried"
-msgstr ""
+msgstr "Joburile pipeline de merge train nu pot fi reîncercate"
msgid "Pipeline|Merged result pipeline"
-msgstr ""
+msgstr "Pipeline de rezultate îmbinate"
msgid "Pipeline|Passed"
-msgstr ""
+msgstr "A trecut"
msgid "Pipeline|Pending"
-msgstr ""
+msgstr "În așteptare"
msgid "Pipeline|Pipeline"
-msgstr ""
+msgstr "Pipeline"
msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
-msgstr ""
+msgstr "Pipeline-ul %{idStart}#%{idEnd} %{statusStart}%{statusEnd} pentru %{commitStart}%{commitEnd}"
msgid "Pipeline|Pipeline cannot be run."
-msgstr "Pipeline-ul nu poate fi rulat."
+msgstr "Pipeline-ul nu poate fi executat."
msgid "Pipeline|Pipelines"
-msgstr ""
+msgstr "Pipeline-uri"
msgid "Pipeline|Raw text search is not currently supported. Please use the available search tokens."
-msgstr ""
+msgstr "Căutarea de text brut nu este acceptată în prezent. Vă rugăm să utilizați tokenurile de căutare disponibile."
msgid "Pipeline|Run for branch name or tag"
-msgstr ""
+msgstr "Executați pentru numele ramurii sau etichetă"
msgid "Pipeline|Run pipeline"
-msgstr ""
+msgstr "Executați pipeline-ul"
msgid "Pipeline|Running"
-msgstr ""
+msgstr "Se execută"
msgid "Pipeline|Skipped"
msgstr "Sărit"
msgid "Pipeline|Source"
-msgstr ""
+msgstr "Sursa"
msgid "Pipeline|Source|Security Policy"
-msgstr ""
+msgstr "Politica de securitate"
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
msgstr "Specificați valorile variabilelor care vor fi utilizate în această rulare. Valorile specificate în %{linkStart}setările CI/CD%{linkEnd} vor fi folosite în mod implicit."
msgid "Pipeline|Stages"
-msgstr ""
+msgstr "Etape"
msgid "Pipeline|Status"
-msgstr ""
+msgstr "Status"
msgid "Pipeline|Stop pipeline"
-msgstr ""
+msgstr "Opriți pipeline-ul"
msgid "Pipeline|Stop pipeline #%{pipelineId}?"
-msgstr ""
+msgstr "Vreți să opriți pipeline-ul #%{pipelineId}?"
msgid "Pipeline|Tag name"
-msgstr ""
+msgstr "Numele etichetei"
msgid "Pipeline|Test coverage"
msgstr "Coverage de testare"
@@ -28568,10 +29096,10 @@ msgid "Pipeline|This change will not change the overall test coverage if merged.
msgstr "Această modificare nu va modifica gradul general de coverage de teste dacă va fi îmbinată."
msgid "Pipeline|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
-msgstr ""
+msgstr "Acest pipeline a rulat pe conținutul acestui merge request combinat cu conținutul tuturor celorlalte merge request-uri puse în coadă pentru îmbinarea în ramura țintă."
msgid "Pipeline|This pipeline ran on the contents of this merge request's source branch, not the target branch."
-msgstr ""
+msgstr "Acest pipeline a rulat pe conținutul ramurii sursă a acestui merge request, nu pe cel al ramurii țintă."
msgid "Pipeline|Trigger author"
msgstr "Autorul declanșatorului"
@@ -28580,7 +29108,7 @@ msgid "Pipeline|Triggerer"
msgstr "Declanșator"
msgid "Pipeline|Variables"
-msgstr ""
+msgstr "Variabile"
msgid "Pipeline|View commit"
msgstr "Vizualizați commit-ul"
@@ -28589,28 +29117,28 @@ msgid "Pipeline|View pipeline"
msgstr "Vizualizați pipeline-ul"
msgid "Pipeline|We are currently unable to fetch pipeline data"
-msgstr ""
+msgstr "ÃŽn prezent, nu putem prelua date despre pipeline."
msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
-msgstr ""
+msgstr "Sunteți pe cale să opriți pipeline-ul #%{pipelineId}."
msgid "Pipeline|for"
-msgstr ""
+msgstr "pentru"
msgid "Pipeline|merge request"
-msgstr ""
+msgstr "merge request"
msgid "Pipeline|merge train"
-msgstr ""
+msgstr "merge train"
msgid "Pipeline|on"
-msgstr ""
+msgstr "pe"
msgid "Pipeline|with stage"
-msgstr ""
+msgstr "cu etapă"
msgid "Pipeline|with stages"
-msgstr ""
+msgstr "cu etape"
msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr "Adăugați mesaje de commit ca și comentarii la relatările Pivotal Tracker."
@@ -28622,7 +29150,7 @@ msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to
msgstr "Tokenul API Pivotal Tracker. Utilizatorul trebuie să aibă acces la relatarea de utilizator. Toate comentariile sunt atribuite acestui utilizator."
msgid "Plain diff"
-msgstr ""
+msgstr "Plain diff"
msgid "Plain-text response to send to clients that hit a rate limit"
msgstr "Răspuns în text simplu pentru a trimite clienților care au atins o limită de rată"
@@ -28631,25 +29159,28 @@ msgid "Plan"
msgstr "Plan"
msgid "Plan:"
-msgstr ""
+msgstr "Plan:"
msgid "Planning hierarchy"
msgstr "Ierarhia de planificare"
msgid "PlantUML"
-msgstr ""
+msgstr "PlantUML"
msgid "PlantUML URL"
-msgstr ""
+msgstr "URL-ul PlantUML"
+
+msgid "PlantUML diagram"
+msgstr "Diagrama PlantUML"
msgid "Play"
-msgstr ""
+msgstr "Rulare"
msgid "Play all manual"
-msgstr ""
+msgstr "Rulați totul manual"
msgid "Please %{link_to_register} or %{link_to_sign_in} to comment"
-msgstr ""
+msgstr "Vă rugăm %{link_to_register} sau %{link_to_sign_in} pentru a comenta"
msgid "Please %{registerLinkStart}register%{registerLinkEnd} or %{signInLinkStart}sign in%{signInLinkEnd} to reply."
msgstr "Vă rugăm %{registerLinkStart}înregistrați-vă%{registerLinkEnd} sau %{signInLinkStart}conectați-vă%{signInLinkEnd} pentru a răspunde."
@@ -28658,13 +29189,13 @@ msgid "Please %{registerLinkStart}register%{registerLinkEnd} or %{signInLinkStar
msgstr "Vă rugăm %{registerLinkStart}înregistrați-vă%{registerLinkEnd} sau %{signInLinkStart}conectați-vă%{signInLinkEnd} pentru a începe o nouă discuție."
msgid "Please %{startTagRegister}register%{endRegisterTag} or %{startTagSignIn}sign in%{endSignInTag} to reply"
-msgstr ""
+msgstr "Vă rugăm %{startTagRegister}să vă înregistrați%{endRegisterTag} sau %{startTagSignIn}să vă autentificați%{endSignInTag} pentru a răspunde"
msgid "Please accept the Terms of Service before continuing."
msgstr "Vă rugăm să acceptați Termenii și condițiile de utilizare înainte de a continua."
msgid "Please add a comment in the text area above"
-msgstr ""
+msgstr "Vă rugăm să adăugați un comentariu în zona de text de mai sus"
msgid "Please check the configuration file for this chart"
msgstr "Vă rugăm să verificați fișierul de configurare pentru acest grafic"
@@ -28673,10 +29204,10 @@ msgid "Please check the configuration file to ensure that a collection of charts
msgstr "Vă rugăm să verificați fișierul de configurare pentru a vă asigura că a fost declarată o colecție de grafice."
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
-msgstr ""
+msgstr "Vă rugăm să verificați fișierul de configurare pentru a vă asigura că este disponibil și că YAML-ul este valid"
msgid "Please check your email %{email} to confirm your account"
-msgstr ""
+msgstr "Vă rugăm să vă verificați e-mailul %{email} pentru a vă confirma contul."
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 "Vă rugăm să vă verificați e-mailul (%{email}) pentru a confirma că sunteți proprietarul acestei adrese și pentru a debloca puterea CI/CD. Nu l-ați primit? %{resend_link}. Adresa de e-mail greșită? %{update_link}."
@@ -28685,7 +29216,7 @@ msgid "Please complete your profile with email address"
msgstr "Vă rugăm să completați profilul dvs. cu adresa de e-mail"
msgid "Please confirm your email address"
-msgstr ""
+msgstr "Vă rugăm să confirmați adresa dvs. de e-mail"
msgid "Please contact an admin to register runners."
msgstr "Vă rugăm să contactați un administrator pentru a înregistra executori."
@@ -28700,40 +29231,40 @@ msgid "Please contact your administrator."
msgstr "Vă rugăm să contactați administratorul dumneavoastră."
msgid "Please convert %{linkStart}them to Git%{linkEnd}, and go through the %{linkToImportFlow} again."
-msgstr ""
+msgstr "Vă rugăm să le convertiți %{linkStart}în Git%{linkEnd} și să treceți din nou prin %{linkToImportFlow}"
msgid "Please copy, download, or print your recovery codes before proceeding."
-msgstr ""
+msgstr "Vă rugăm să copiați, să descărcați sau să imprimați codurile de recuperare înainte de a continua."
msgid "Please create a password for your new account."
-msgstr ""
+msgstr "Vă rugăm să creați o parolă pentru noul dvs. cont."
msgid "Please create a username with only alphanumeric characters."
msgstr "Vă rugăm să creați un nume de utilizator numai cu caractere alfanumerice."
msgid "Please create an index before enabling indexing"
-msgstr ""
+msgstr "Vă rugăm să creați un index înainte de a activa indexarea"
msgid "Please delete your current license if you want to downgrade to the free plan."
-msgstr ""
+msgstr "Vă rugăm să ștergeți licența dvs. actuală dacă doriți să retrogradați la planul gratuit."
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
-msgstr ""
+msgstr "Vă rugăm să activați și să migrați la stocarea hash pentru a evita problemele de securitate și a asigura integritatea datelor. %{migrate_link}"
msgid "Please enter a non-negative number"
-msgstr ""
+msgstr "Vă rugăm să introduceți un număr non-negativ"
msgid "Please enter a number greater than %{number} (from the project settings)"
-msgstr ""
+msgstr "Vă rugăm să introduceți un număr mai mare de %{number} (din setările proiectului)"
msgid "Please enter a valid URL format, ex: http://www.example.com/home"
-msgstr ""
+msgstr "Vă rugăm să introduceți un format URL valid, de exemplu: http://www.example.com/home"
msgid "Please enter a valid hex (#RRGGBB or #RGB) color value"
-msgstr ""
+msgstr "Vă rugăm să introduceți o valoare de culoare hex ( #RRGGBB sau #RGB) validă."
msgid "Please enter a valid number"
-msgstr ""
+msgstr "Vă rugăm să introduceți un număr valid"
msgid "Please enter a valid time interval"
msgstr "Vă rugăm să introduceți un interval de timp valid"
@@ -28742,7 +29273,7 @@ msgid "Please enter your current password."
msgstr "Vă rugăm să introduceți parola dvs. actuală."
msgid "Please fill in a descriptive name for your group."
-msgstr ""
+msgstr "Vă rugăm să completați un nume descriptiv pentru grupul dumneavoastră."
msgid "Please fill in a name for your topic."
msgstr "Vă rugăm să introduceți un nume pentru subiectul dvs."
@@ -28751,91 +29282,91 @@ msgid "Please fill in a title for your topic."
msgstr "Vă rugăm să completați un titlu pentru subiectul dvs."
msgid "Please fill out this field."
-msgstr ""
+msgstr "Vă rugăm să completați acest câmp."
msgid "Please follow the %{link_start}Let's Encrypt troubleshooting instructions%{link_end} to re-obtain your Let's Encrypt certificate."
-msgstr ""
+msgstr "Vă rugăm să urmați instrucțiunile de depanare %{link_start}Let's Encrypt%{link_end} pentru a obține din nou certificatul Let's Encrypt."
msgid "Please follow the Let's Encrypt troubleshooting instructions to re-obtain your Let's Encrypt certificate: %{docs_url}."
-msgstr ""
+msgstr "Vă rugăm să urmați instrucțiunile de depanare Let's Encrypt pentru a obține din nou certificatul Let's Encrypt: %{docs_url}."
msgid "Please migrate all existing projects to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
-msgstr ""
+msgstr "Vă rugăm să migrați toate proiectele existente în stocarea hash pentru a evita problemele de securitate și pentru a asigura integritatea datelor. %{migrate_link}"
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
-msgstr ""
+msgstr "Vă rugăm să rețineți că această aplicație nu este furnizată de GitLab și ar trebui să-i verificați autenticitatea acesteia înainte de a permite accesul."
msgid "Please provide a name"
-msgstr ""
+msgstr "Vă rugăm să furnizați un nume"
msgid "Please provide a name."
-msgstr ""
+msgstr "Vă rugăm să furnizați un nume."
msgid "Please provide a valid URL."
-msgstr ""
+msgstr "Vă rugăm să furnizați o adresă URL validă."
msgid "Please provide a valid email address."
-msgstr ""
+msgstr "Vă rugăm să furnizați o adresă de e-mail validă."
msgid "Please provide attributes to update"
msgstr "Vă rugăm să furnizați atributele pentru actualizare"
msgid "Please reach out if you have any questions and we'll be happy to assist."
-msgstr ""
+msgstr "Vă rugăm să ne contactați dacă aveți întrebări și vom fi bucuroși să vă ajutăm."
msgid "Please review the updated escalation policies for %{project_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr "Vă rugăm să consultați politicile de escaladare actualizate pentru %{project_link}. Se recomandă să luați legătura cu actualul respondent de apel pentru a asigura continuitatea acoperirii serviciului la apel."
+msgstr "Vă rugăm să consultați politicile de escaladare actualizate pentru %{project_link} Se recomandă să luați legătura cu actualul respondent de gardă pentru a asigura continuitatea acoperirii de gardă."
msgid "Please review the updated escalation policies for %{project}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr "Vă rugăm să consultați politicile de escaladare actualizate pentru %{project}. Se recomandă să luați legătura cu actualul respondent de apel pentru a asigura continuitatea acoperirii serviciului la apel."
+msgstr "Vă rugăm să consultați politicile de escaladare actualizate pentru %{project}. Se recomandă să luați legătura cu actualul respondent de gardă pentru a asigura continuitatea acoperirii de gardă."
msgid "Please select"
-msgstr ""
+msgstr "Vă rugăm să selectați"
msgid "Please select a Jira project"
-msgstr ""
+msgstr "Vă rugăm să selectați un proiect Jira"
msgid "Please select a country"
-msgstr ""
+msgstr "Vă rugăm să selectați o țară"
msgid "Please select a file"
-msgstr ""
+msgstr "Vă rugăm să selectați un fișier"
msgid "Please select a group"
msgstr "Vă rugăm să selectați un grup"
msgid "Please select a valid target branch"
-msgstr ""
+msgstr "Vă rugăm să selectați o ramură țintă validă"
msgid "Please select a valid target branch."
-msgstr ""
+msgstr "Vă rugăm să selectați o ramură țintă validă."
msgid "Please select and add a member"
-msgstr ""
+msgstr "Vă rugăm să selectați și să adăugați un membru"
msgid "Please select at least one filter to see results"
-msgstr ""
+msgstr "Vă rugăm să selectați cel puțin un filtru pentru a vedea rezultatele"
msgid "Please select what should be included in each exported requirement."
msgstr "Vă rugăm să selectați ce ar trebui să fie inclus în fiecare cerință exportată."
msgid "Please select..."
-msgstr ""
+msgstr "Vă rugăm să selectați..."
msgid "Please set a new password before proceeding."
-msgstr ""
+msgstr "Vă rugăm să setați o parolă nouă înainte de a continua."
msgid "Please solve the captcha"
-msgstr ""
+msgstr "Vă rugăm să rezolvați captcha"
msgid "Please try again"
-msgstr ""
+msgstr "Vă rugăm să încercați din nou"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "Vă rugăm să încercați să reîmprospătați pagina. Dacă problema persistă, vă rugăm să contactați serviciul de asistență."
msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr ""
+msgstr "Vă rugăm să introduceți %{phrase_code} pentru a continua sau să închideți acest mod pentru a anula."
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "Vă rugăm să folosiți acest formular pentru a raporta administratorului utilizatorii care creează probleme de spam, comentarii sau se comportă necorespunzător."
@@ -28849,12 +29380,6 @@ msgstr "Vă rugăm să așteptați în timp ce ne conectăm la repozitoriul dumn
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Vă rugăm să așteptați până când importăm repozitoriul pentru dumneavoastră. Reîncărcați în orice moment."
-msgid "Pod does not exist"
-msgstr "Pod-ul nu există"
-
-msgid "Pod not found"
-msgstr "Pod-ul nu a fost găsit"
-
msgid "Pods in use"
msgstr "Pod-uri în uz"
@@ -28868,22 +29393,22 @@ msgid "Policy '%{escalation_policy_name}' does not exist."
msgstr "Politica „%{escalation_policy_name}†nu există."
msgid "Policy management project does not have any policies in %{policy_path}"
-msgstr ""
+msgstr "Proiectul de gestionare a politicilor nu are nicio politică în %{policy_path}"
msgid "Policy project doesn't exist"
-msgstr ""
+msgstr "Proiectul de politică nu există"
msgid "PolicyRuleMultiSelect|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr ""
+msgstr "%{firstLabel} +%{numberOfAdditionalLabels} mai mult(e)"
msgid "PolicyRuleMultiSelect|All %{itemTypeName}"
-msgstr ""
+msgstr "Toate %{itemTypeName}"
msgid "PolicyRuleMultiSelect|Select %{itemTypeName}"
-msgstr ""
+msgstr "Selectați %{itemTypeName}"
msgid "PolicyRuleMultiSelect|Select all"
-msgstr ""
+msgstr "Selecție totală"
msgid "Polling interval multiplier"
msgstr "Multiplicatorul intervalului de sondare"
@@ -28892,13 +29417,13 @@ msgid "Popularity"
msgstr "Popularitate"
msgid "Port"
-msgstr ""
+msgstr "Portul"
msgid "Postman collection"
-msgstr ""
+msgstr "Colecția Postman"
msgid "Postman collection file path or URL"
-msgstr ""
+msgstr "Calea sau URL-ul fișierului de colecție Postman"
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr "Caracter potențial nedorit detectat: Control Unicode pentru text BiDi"
@@ -28907,10 +29432,10 @@ msgid "Pre-defined push rules"
msgstr "Reguli push predefinite"
msgid "Preferences"
-msgstr ""
+msgstr "Preferințe"
msgid "Preferences saved."
-msgstr ""
+msgstr "Preferințe salvate."
msgid "Preferences|Behavior"
msgstr "Comportament"
@@ -28930,14 +29455,17 @@ msgstr "Culoare pentru linii adăugate"
msgid "Preferences|Color for removed lines"
msgstr "Culoare pentru liniile eliminate"
+msgid "Preferences|Color theme"
+msgstr "Tema de culoare"
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Configurați modul în care se afișează datele și orele pentru dvs."
msgid "Preferences|Customize integrations with third party services."
msgstr "Personalizați integrările cu servicii terțe."
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "Personalizați aspectul antetului aplicației și al barei laterale de navigare."
+msgid "Preferences|Customize the color of GitLab."
+msgstr "Personalizați culoarea GitLab."
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr "Personalizați culorile liniilor eliminate și adăugate în diff-uri."
@@ -28978,9 +29506,6 @@ msgstr "Lățimea aspectului"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Trebuie să fie un număr între %{min} și %{max}."
-msgid "Preferences|Navigation theme"
-msgstr "Tema de navigare"
-
msgid "Preferences|Preview"
msgstr "Previzualizare"
@@ -29009,7 +29534,7 @@ msgid "Preferences|Tab width"
msgstr "Lățimea tab-ului"
msgid "Preferences|This feature is experimental and translations are not yet complete."
-msgstr ""
+msgstr "Această funcție este experimentală, iar traducerile nu sunt completate încă."
msgid "Preferences|This setting allows you to customize the appearance of the syntax."
msgstr "Această setare vă permite să personalizați aspectul sintaxei."
@@ -29030,10 +29555,7 @@ msgid "Preparing the report for the scan."
msgstr "Pregătirea raportului pentru scanare."
msgid "Prev"
-msgstr ""
-
-msgid "Prevent adding new members to projects within this group"
-msgstr "Împiedicați adăugarea de noi membri la proiectele din acest grup"
+msgstr "Anterior"
msgid "Prevent auto-stopping"
msgstr "Preveniți oprirea automată"
@@ -29054,58 +29576,61 @@ msgid "Prevent users from performing write operations while GitLab maintenance i
msgstr "Împiedică utilizatorii să efectueze operațiuni de scriere în timp ce întreținerea GitLab este în curs de desfășurare."
msgid "Preview"
-msgstr ""
+msgstr "Previzualizare"
msgid "Preview JavaScript projects in the Web IDE with CodeSandbox Live Preview. %{link_start}Learn more.%{link_end} "
msgstr "Previzualizați proiectele JavaScript în Web IDE cu Previzualizarea în direct CodeSandbox. %{link_start}Aflați mai multe.%{link_end} "
msgid "Preview Markdown"
-msgstr ""
+msgstr "Previzualizare Markdown"
msgid "Preview changes"
-msgstr ""
+msgstr "Previzualizarea modificărilor"
+
+msgid "Preview diagram"
+msgstr "Previzualizare diagramă"
msgid "Preview payload"
msgstr "Vizualizare payload"
msgid "Previous Artifacts"
-msgstr ""
+msgstr "Artefactele anterioare"
msgid "Previous commit"
-msgstr ""
+msgstr "Commit-ul anterior"
msgid "Previous design"
msgstr "Designul anterior"
msgid "Previous file in diff"
-msgstr ""
+msgstr "Fișierul anterior în diff"
msgid "Previous unresolved discussion"
-msgstr ""
+msgstr "Discuție anterioară nerezolvată"
msgid "Primary Action"
-msgstr ""
+msgstr "Acțiune primară"
msgid "Print codes"
-msgstr ""
+msgstr "Imprimați codurile"
msgid "Prioritize"
-msgstr ""
+msgstr "Prioritizați"
msgid "Prioritize label"
-msgstr ""
+msgstr "Prioritizați eticheta"
msgid "Prioritized Labels"
-msgstr ""
+msgstr "Etichete prioritizate"
msgid "Prioritized label"
-msgstr ""
+msgstr "Etichetă prioritizată"
msgid "Priority"
-msgstr ""
+msgstr "Prioritate"
msgid "Private"
-msgstr ""
+msgstr "Privat"
msgid "Private - Guest users are not allowed to view detailed release information like title and source code."
msgstr "Privat - Utilizatorilor invitați nu li se permite să vizualizeze informații detaliate despre versiuni, cum ar fi titlul și codul sursă."
@@ -29114,82 +29639,82 @@ msgid "Private - Project access must be granted explicitly to each user. If this
msgstr "Privat - Accesul la proiect trebuie acordat în mod explicit fiecărui utilizator. Dacă acest proiect face parte dintr-un grup, accesul va fi acordat membrilor grupului."
msgid "Private - The group and its projects can only be viewed by members."
-msgstr ""
+msgstr "Private - Grupul și proiectele sale pot fi vizualizate numai de membri."
msgid "Private group(s)"
-msgstr ""
+msgstr "Grup(uri) privat(e)"
msgid "Private profile"
msgstr "Profil privat"
msgid "Private projects Minutes cost factor"
-msgstr ""
+msgstr "Factorul de cost pentru Minutele proiectelor private"
msgid "Private projects can be created in your personal namespace with:"
msgstr "Proiectele private pot fi create în spațiul dvs. de nume personal cu:"
msgid "Problem with %{name} command: %{message}."
-msgstr ""
+msgstr "Problemă cu comanda %{name}: %{message}."
msgid "Proceed"
-msgstr ""
+msgstr "Continuați"
msgid "Product Analytics"
-msgstr ""
+msgstr "Analize de produs"
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr "În prezent, nu există date pentru acest tip de grafic. Vă rugăm să consultați fila „Configurare†dacă nu ați configurat deja instrumentul de analiză a produsului."
msgid "Productivity"
-msgstr ""
+msgstr "Productivitate"
msgid "Productivity Analytics"
-msgstr ""
+msgstr "Analize de productivitate"
msgid "Productivity analytics can help identify the problems that are delaying your team"
-msgstr ""
+msgstr "Analizele de productivitate vă pot ajuta să identificați problemele care vă întârzie echipa"
msgid "ProductivityAanalytics|Merge requests"
msgstr "Merge request-uri"
msgid "ProductivityAanalytics|is earlier than the allowed minimum date"
-msgstr ""
+msgstr "este anterioară datei minime permise"
msgid "ProductivityAnalytics|Ascending"
-msgstr ""
+msgstr "Ascendent"
msgid "ProductivityAnalytics|Days"
-msgstr ""
+msgstr "Zile"
msgid "ProductivityAnalytics|Days to merge"
-msgstr ""
+msgstr "Zile până la îmbinare"
msgid "ProductivityAnalytics|Descending"
-msgstr ""
+msgstr "Descendent"
msgid "ProductivityAnalytics|Hours"
-msgstr ""
+msgstr "Ore"
msgid "ProductivityAnalytics|List"
-msgstr ""
+msgstr "Listă"
msgid "ProductivityAnalytics|Merge Requests"
msgstr "Merge request-uri"
msgid "ProductivityAnalytics|Merge date"
-msgstr ""
+msgstr "Data îmbinării"
msgid "ProductivityAnalytics|Merge requests"
msgstr "Merge request-uri"
msgid "ProductivityAnalytics|Time to merge"
-msgstr ""
+msgstr "Timp până la îmbinare"
msgid "ProductivityAnalytics|Trendline"
-msgstr ""
+msgstr "Linie de tendință"
msgid "ProductivityAnalytics|is earlier than the given merged at after date"
-msgstr ""
+msgstr "este anterioară datei ulterioare a îmbinării respective"
msgid "Profile"
msgstr "Profil"
@@ -29230,9 +29755,6 @@ msgstr "Contul nu a putut fi șters. GitLab nu a putut să vă verifice identita
msgid "Profiles|Account scheduled for removal."
msgstr "Cont programat pentru eliminare."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Activați autentificarea cu unul dintre următoarele servicii"
-
msgid "Profiles|Active"
msgstr "Activ"
@@ -29245,8 +29767,8 @@ msgstr "Adăugați emoji de stare"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr "A apărut o eroare la actualizarea numelui de utilizator, vă rugăm să încercați din nou."
-msgid "Profiles|An indicator appears next to your name and avatar"
-msgstr "Un indicator apare lângă numele și avatarul dumneavoastră"
+msgid "Profiles|An indicator appears next to your name and avatar."
+msgstr "Un indicator apare lângă numele și avatarul dumneavoastră."
msgid "Profiles|Avatar cropper"
msgstr "Decupator de avatar"
@@ -29272,8 +29794,8 @@ msgstr "Schimbarea numelui de utilizator poate avea efecte secundare nedorite."
msgid "Profiles|Choose file..."
msgstr "Alegeți fișierul…"
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "Alegeți să afișați contribuțiile din proiectele private pe profilul dvs. public, fără nicio informație despre proiect, repozitoriu sau organizație"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr "Selectați afișarea contribuțiilor din proiectele private în profilul dvs. public, fără informații despre proiect, repozitorii sau organizație."
msgid "Profiles|City, country"
msgstr "Oraș, țară"
@@ -29287,6 +29809,9 @@ msgstr "E-mail pentru commit-uri"
msgid "Profiles|Connect %{provider}"
msgstr "Conectare cu %{provider}"
+msgid "Profiles|Connect a service for sign-in."
+msgstr "Conectați un serviciu pentru autentificare."
+
msgid "Profiles|Connected Accounts"
msgstr "Conturi conectate"
@@ -29294,7 +29819,7 @@ msgid "Profiles|Current path: %{path}"
msgstr "Calea curentă: %{path}"
msgid "Profiles|Current status"
-msgstr "Starea curentă"
+msgstr "Starea actuală"
msgid "Profiles|Default notification email"
msgstr "E-mail de notificare implicit"
@@ -29314,8 +29839,8 @@ msgstr "Deconectare de la %{provider}"
msgid "Profiles|Do not show on profile"
msgstr "Nu se afișează în profil"
-msgid "Profiles|Don't display activity-related personal information on your profile"
-msgstr "Nu afișați informații personale legate de activitatea proprie în profilul dvs."
+msgid "Profiles|Don't display activity-related personal information on your profile."
+msgstr "Nu afișați în profilul dvs. informații personale legate de propria activitate."
msgid "Profiles|Edit Profile"
msgstr "Editare profil"
@@ -29323,17 +29848,17 @@ msgstr "Editare profil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr "Asigurați-vă ca aveți codurile de recuperare a autentificării în doi pași stocate într-un loc sigur."
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
-msgstr "Introduceți modul în care numele dvs. este pronunțat pentru a ajuta persoanele să vi se adreseze corect"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
+msgstr "Introduceți modul în care se pronunță numele dvs. pentru a ajuta oamenii să vi se adreseze corect."
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "Introduceți numele dvs, astfel încât persoanele pe care le cunoașteți să vă poată recunoaște"
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr "Introduceți numele dvs., în așa fel încât persoanele pe care le cunoașteți să vă poată recunoaște."
msgid "Profiles|Enter your password to confirm the email change"
msgstr "Introduceți parola pentru a confirma modificarea e-mailului"
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
-msgstr "Introduceți pronumele dvs. pentru ca persoanele să știe cum să se refere la dvs."
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
+msgstr "Introduceți pronumele dvs. pentru ca oamenii să știe cum să vi se adreseze."
msgid "Profiles|Example: MacBook key"
msgstr "Exemplu: Cheia MacBook"
@@ -29357,7 +29882,7 @@ msgid "Profiles|GitLab is unable to verify your identity automatically. For secu
msgstr "GitLab nu vă poate verifica identitatea în mod automat. Din motive de securitate, trebuie să vă setați o parolă prin %{openingTag}resetarea parolei%{closingTag} pentru a vă șterge contul."
msgid "Profiles|If after setting a password, the option to delete your account is still not available, please %{link_start}submit a request%{link_end} to begin the account deletion process."
-msgstr ""
+msgstr "Dacă după ce ați setat o parolă, opțiunea de ștergere a contului dvs. nu este încă disponibilă, vă rugăm să %{link_start}trimiteți o cerere%{link_end} pentru a începe procesul de ștergere a contului."
msgid "Profiles|Include private contributions on my profile"
msgstr "Includeți contribuții private pe profilul meu"
@@ -29365,8 +29890,8 @@ msgstr "Includeți contribuții private pe profilul meu"
msgid "Profiles|Incoming email token was successfully reset"
msgstr "Tokenul de e-mail primit a fost resetat cu succes"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "Creșteți securitatea contului dvs. activând Autentificarea cu doi factori (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr "Măriți securitatea contului dvs. prin activarea autentificării cu doi factori (2FA)."
msgid "Profiles|Invalid password"
msgstr "Parolă invalidă"
@@ -29452,14 +29977,14 @@ msgstr "Înlăturați avatarul"
msgid "Profiles|Select a service to sign in with."
msgstr "Selectați un serviciu cu care să vă conectați."
+msgid "Profiles|Service sign-in"
+msgstr "Serviciul de autentificare"
+
msgid "Profiles|Set new profile picture"
msgstr "Setarea unei noi imagini de profil"
-msgid "Profiles|Set your local time zone"
-msgstr "Setați fusul orar local"
-
-msgid "Profiles|Social sign-in"
-msgstr "Conectarea socială"
+msgid "Profiles|Set your local time zone."
+msgstr "Setați fusul orar local."
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "Unele opțiuni nu sunt disponibile pentru conturile LDAP"
@@ -29467,26 +29992,26 @@ msgstr "Unele opțiuni nu sunt disponibile pentru conturile LDAP"
msgid "Profiles|Static object token was successfully reset"
msgstr "Tokenul obiectului static a fost resetat cu succes"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "Spuneți-ne despre dvs. în mai puțin de 250 de caractere"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr "Spune-ne ceva despre dvs. în mai puțin de 250 de caractere."
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr "Administratorul dvs. a dezactivat capacitatea de a vă actualiza numele."
msgid "Profiles|The maximum file size allowed is 200KB."
-msgstr "Dimensiunea maximă permisă a fișierului este de 200KB."
+msgstr "Mărimea maximă permisă a fișierului este de 200KB."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "Acest e-mail va fi afișat pe profilul dvs. public"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr "Acest e-mail se va afișa în profilul dvs. public."
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "Acest e-mail va fi utilizat pentru operațiunile bazate pe web, cum ar fi editările și îmbinările. %{commit_email_link_start}Aflați mai multe%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr "Această adresă de e-mail se va utiliza pentru operațiunile bazate pe web, cum ar fi editările și îmbinările. %{commit_email_link_start}Aflați mai multe.%{commit_email_link_end}"
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Acest emoji și acest mesaj vor apărea pe profilul dvs. și în întreaga interfață."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Aceste informații vor apărea pe profilul dumneavoastră"
+msgid "Profiles|This information will appear on your profile."
+msgstr "Aceste informații vor apărea în profilul dumneavoastră."
msgid "Profiles|Time settings"
msgstr "Setări de timp"
@@ -29494,8 +30019,8 @@ msgstr "Setări de timp"
msgid "Profiles|Title"
msgstr "Titlu"
-msgid "Profiles|Two-Factor Authentication"
-msgstr "Autentificare cu două factori"
+msgid "Profiles|Two-factor authentication"
+msgstr "Autentificare cu doi factori"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Introduceți %{confirmationValue} pentru a confirma:"
@@ -29530,8 +30055,8 @@ msgstr "URL-ul site-ului web"
msgid "Profiles|What's your status?"
msgstr "Care este starea dvs. actuală?"
-msgid "Profiles|Who you represent or work for"
-msgstr "Pe cine reprezentați sau pentru cine lucrați"
+msgid "Profiles|Who you represent or work for."
+msgstr "Pe cine reprezentați sau pentru cine lucrați."
msgid "Profiles|You can change your avatar here"
msgstr "Vă puteți schimba avatarul aici"
@@ -29572,6 +30097,9 @@ msgstr "Locația dvs. a fost setată automat pe baza contului dvs. %{provider_la
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "Numele dvs. a fost setat automat în funcție de contul dvs. %{provider_label}, astfel încât persoanele pe care le cunoașteți să vă poată recunoaște"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr "Numele dvs. a fost setat automat pe baza contului dvs. %{provider_label}, pentru ca cei pe care îi cunoașteți să vă poată recunoaște."
+
msgid "Profiles|Your status"
msgstr "Starea dumneavoastră"
@@ -29588,163 +30116,163 @@ msgid "Profile|%{job_title} at %{organization}"
msgstr "%{job_title} la %{organization}"
msgid "Profiling - Performance bar"
-msgstr ""
+msgstr "Profilare - Bara de performanță"
msgid "Programming languages used in this repository"
-msgstr ""
+msgstr "Limbaje de programare utilizate în acest repozitoriu"
msgid "Progress"
-msgstr ""
+msgstr "În desfășurare"
msgid "Progress tracking"
-msgstr ""
+msgstr "Monitorizarea progresului"
msgid "Project"
-msgstr ""
+msgstr "Proiect"
msgid "Project \"%{name}\" is no longer available. Select another project to continue."
-msgstr ""
+msgstr "Proiectul „%{name}†nu mai este disponibil. Selectați un alt proiect pentru a continua."
msgid "Project %{project_repo} could not be found"
-msgstr ""
+msgstr "Proiectul %{project_repo} nu a putut fi găsit"
msgid "Project & Group can not be assigned at the same time"
-msgstr ""
+msgstr "Proiectul și grupul nu pot fi atribuite în același timp"
msgid "Project '%{project_name}' is being imported."
msgstr "Proiectul „%{project_name}†este importat."
msgid "Project '%{project_name}' is in the process of being deleted."
-msgstr ""
+msgstr "Proiectul „%{project_name}†este în curs de ștergere."
msgid "Project '%{project_name}' is restored."
-msgstr ""
+msgstr "Proiectul „%{project_name}†este restabilit."
msgid "Project '%{project_name}' queued for deletion."
-msgstr ""
+msgstr "Proiectul „%{project_name}†a fost pus în coadă pentru ștergere."
msgid "Project '%{project_name}' was successfully created."
-msgstr ""
+msgstr "Proiectul „%{project_name}†a fost creat cu succes."
msgid "Project '%{project_name}' was successfully updated."
-msgstr ""
+msgstr "Proiectul „%{project_name}†a fost actualizat cu succes."
msgid "Project '%{project_name}' will be deleted on %{date}"
-msgstr ""
+msgstr "Proiectul „%{project_name}†va fi șters pe %{date}."
msgid "Project Access Tokens"
-msgstr ""
+msgstr "Tokenuri de acces la proiect"
msgid "Project Badges"
msgstr "Insigna proiectului"
msgid "Project Files"
-msgstr ""
+msgstr "Fișiere de proiect"
msgid "Project ID"
-msgstr ""
+msgstr "ID proiect"
msgid "Project Templates"
-msgstr ""
+msgstr "Șabloane de proiect"
msgid "Project URL"
-msgstr ""
+msgstr "URL-ul proiectului"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
-msgstr "Accesul la proiect trebuie acordat în mod explicit fiecărui utilizator. Dacă acest proiect face parte dintr-un grup, accesul va fi acordat membrilor grupului."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Crearea de tokenuri de acces la proiect este dezactivată în acest grup. Puteți în continuare să utilizați și să gestionați tokenurile existente. %{link_start}Aflați mai multe.%{link_end}"
msgid "Project already deleted"
-msgstr ""
+msgstr "Proiectul a fost șters deja"
msgid "Project and wiki repositories"
-msgstr ""
+msgstr "Repozitorii de proiecte și wiki"
msgid "Project audit events"
-msgstr ""
+msgstr "Evenimente de audit de proiect"
msgid "Project avatar"
-msgstr ""
+msgstr "Avatarul proiectului"
msgid "Project cannot be shared with the group it is in or one of its ancestors."
msgstr "Proiectul nu poate fi partajat cu grupul în care se află sau cu unul dintre predecesorii săi."
msgid "Project configuration, excluding integrations"
-msgstr ""
+msgstr "Configurarea proiectului, cu excepția integrărilor"
msgid "Project description (optional)"
msgstr "Descrierea proiectului (opțional)"
msgid "Project does not exist or you don't have permission to perform this action"
-msgstr ""
+msgstr "Proiectul nu există sau nu aveți permisiunea de a efectua această acțiune"
msgid "Project does not have a policy configuration"
-msgstr ""
+msgstr "Proiectul nu are o configurație de politică"
msgid "Project export could not be deleted."
-msgstr ""
+msgstr "Exportul proiectului nu a putut fi șters."
msgid "Project export download requests"
-msgstr "Solicitări descărcare export proiect"
+msgstr "Solicitări de descărcare de export de proiect"
msgid "Project export has been deleted."
-msgstr ""
+msgstr "Exportul proiectului a fost șters."
msgid "Project export link has expired. Please generate a new export from your project settings."
-msgstr ""
+msgstr "Linkul de export al proiectului a expirat. Vă rugăm să generați un nou export din setările proiectului dvs."
msgid "Project export requests"
-msgstr "Solicitări export proiect"
+msgstr "Solicitări de export de proiect"
msgid "Project export started. A download link will be sent by email and made available on this page."
-msgstr "A început exportul proiectului. Un link de descărcare va fi trimis prin e-mail și pus la dispoziție pe această pagină."
+msgstr "Exportul proiectului a început. Un link de descărcare va fi trimis prin e-mail și va fi pus la dispoziție pe această pagină."
msgid "Project has too many %{label_for_message} to search"
-msgstr ""
+msgstr "Proiectul are prea multe %{label_for_message} de căutat"
msgid "Project import requests"
msgstr "Solicitări de import de proiecte"
msgid "Project info:"
-msgstr ""
+msgstr "Informații despre proiect:"
msgid "Project information"
-msgstr ""
+msgstr "Informații despre proiect"
msgid "Project is required when cluster_type is :project"
-msgstr ""
+msgstr "Proiectul este necesar atunci când cluster_type este: project"
msgid "Project members"
-msgstr ""
+msgstr "Membrii proiectului"
msgid "Project milestone"
-msgstr ""
+msgstr "Obiectiv de proiect"
msgid "Project name"
-msgstr ""
+msgstr "Numele proiectului"
msgid "Project navigation"
-msgstr ""
+msgstr "Navigarea în proiect"
msgid "Project order will not be saved as local storage is not available."
msgstr "Ordinea proiectelor nu va fi salvată, deoarece nu este disponibilă stocarea locală."
msgid "Project path"
-msgstr ""
+msgstr "Calea proiectului"
msgid "Project security status"
-msgstr ""
+msgstr "Starea securității proiectului"
msgid "Project security status help page"
-msgstr ""
+msgstr "Pagina de ajutor privind starea de securitate a proiectului"
msgid "Project slug"
-msgstr ""
+msgstr "Slug de proiect"
msgid "Project uploads"
-msgstr ""
+msgstr "Încărcările proiectului"
msgid "Project visibility level will be changed to match namespace rules when transferring to a group."
msgstr "Nivelul de vizibilitate al proiectului va fi modificat pentru a se potrivi cu regulile spațiului de nume atunci când se transferă într-un grup."
@@ -29753,16 +30281,16 @@ msgid "Project was not found or you do not have permission to add this project t
msgstr "Proiectul nu a fost găsit sau nu aveți permisiunea de a adăuga acest proiect în Tablourile de bord de securitate."
msgid "Project: %{name}"
-msgstr ""
+msgstr "Proiect: %{name}"
msgid "ProjectActivityRSS|Subscribe"
-msgstr ""
+msgstr "Abonați-vă"
msgid "ProjectCreationLevel|Allowed to create projects"
-msgstr ""
+msgstr "Autorizat să creeze proiecte"
msgid "ProjectCreationLevel|Default project creation protection"
-msgstr ""
+msgstr "Protecția implicită pentru crearea de proiecte"
msgid "ProjectCreationLevel|Developers + Maintainers"
msgstr "Dezvoltatori + Întreținători"
@@ -29771,13 +30299,16 @@ msgid "ProjectCreationLevel|Maintainers"
msgstr "Întreținători"
msgid "ProjectCreationLevel|No one"
-msgstr ""
+msgstr "Nimeni"
+
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr "Rolurile autorizate să creeze proiecte"
msgid "ProjectFileTree|Name"
-msgstr ""
+msgstr "Nume"
msgid "ProjectFileTree|Show more"
-msgstr ""
+msgstr "Afișați mai mult"
msgid "ProjectLastActivity|Never"
msgstr "Niciodată"
@@ -29789,10 +30320,10 @@ msgid "ProjectOverview|Forks"
msgstr "Forkuri"
msgid "ProjectOverview|Go to your fork"
-msgstr "Mergeți la forkul dumneavoastră"
+msgstr "Mergeți la forkul d-voastră"
msgid "ProjectOverview|Star"
-msgstr ""
+msgstr "Adăugare stea"
msgid "ProjectOverview|Starrer"
msgstr "Marcator cu stea"
@@ -29801,22 +30332,22 @@ msgid "ProjectOverview|Starrers"
msgstr "Marcatori cu stele"
msgid "ProjectOverview|Unstar"
-msgstr ""
+msgstr "Anulare marcare cu stea"
msgid "ProjectOverview|You don't have permission to fork this project"
msgstr "Nu aveți permisiunea de a crea un fork pentru acest proiect"
msgid "ProjectOverview|You have reached your project limit"
-msgstr ""
+msgstr "ProjectOverview: Ați atins limita proiectului"
msgid "ProjectOverview|You must sign in to star a project"
-msgstr ""
+msgstr "Trebuie să vă conectați pentru a marca un proiect cu o stea"
msgid "ProjectPage|Copy project ID"
-msgstr ""
+msgstr "Copiați ID-ul proiectului"
msgid "ProjectPage|Project ID: %{project_id}"
-msgstr ""
+msgstr "ID-ul proiectului: %{project_id}"
msgid "ProjectQualitySummary|An error occurred while trying to fetch project quality statistics"
msgstr "A apărut o eroare în timpul încercării de a prelua statisticile privind calitatea proiectului"
@@ -29884,6 +30415,9 @@ msgstr "Căutați proiecte"
msgid "ProjectSelect|Select a project"
msgstr "Selectați un proiect"
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr "Ceva nu a mers bine la preluarea proiectelor"
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr "S-a produs o eroare la preluarea proiectelor. Vă rugăm să încercați din nou."
@@ -29902,9 +30436,6 @@ msgstr "Introduceți noua parolă."
msgid "ProjectService|Enter new token"
msgstr "Introduceți noul token"
-msgid "ProjectService|Issue URL"
-msgstr "URL-ul problemei"
-
msgid "ProjectService|Jenkins server URL"
msgstr "URL-ul serverului Jenkins"
@@ -29912,7 +30443,7 @@ msgid "ProjectService|Leave blank to use your current API key"
msgstr "Lăsați necompletat pentru a utiliza cheia API curentă"
msgid "ProjectService|Leave blank to use your current API key."
-msgstr ""
+msgstr "Lăsați necompletat pentru a utiliza cheia API curentă"
msgid "ProjectService|Leave blank to use your current password"
msgstr "Lăsați necompletat pentru a utiliza parola dvs. curentă"
@@ -29924,7 +30455,7 @@ msgid "ProjectService|Leave blank to use your current token."
msgstr "Lăsați necompletat pentru a utiliza tokenul actual."
msgid "ProjectService|Mock service URL"
-msgstr ""
+msgstr "URL-ul simulat al serviciului"
msgid "ProjectService|Must have permission to trigger a manual build in TeamCity."
msgstr "Trebuie să aibă permisiunea de a declanșa un build manual în TeamCity."
@@ -29951,10 +30482,10 @@ msgid "ProjectService|The token you get after you create a Buildkite pipeline wi
msgstr "Tokenul pe care îl primiți după ce creați un pipeline Buildkite cu un repozitoriu GitLab."
msgid "ProjectService|To configure this integration, you should:"
-msgstr ""
+msgstr "Pentru a configura această integrare, trebuie să:"
msgid "ProjectService|Token for the Drone project."
-msgstr ""
+msgstr "Token pentru proiectul Drone."
msgid "ProjectService|Trigger event for new comments on confidential issues."
msgstr "Declanșează evenimentul pentru noi comentarii privind aspecte confidențiale."
@@ -30002,13 +30533,13 @@ msgid "ProjectSettings|%{link_start}What variables can I use?%{link_end}"
msgstr "%{link_start}Ce variabile pot folosi?%{link_end}"
msgid "ProjectSettings|Additional options"
-msgstr ""
+msgstr "Opțiuni suplimentare"
msgid "ProjectSettings|Additional settings that influence how and when merges are done."
msgstr "Setări suplimentare care influențează modul și momentul în care se realizează îmbinările."
msgid "ProjectSettings|All threads must be resolved"
-msgstr ""
+msgstr "Toate subiectele trebuie să fie rezolvate"
msgid "ProjectSettings|Allow"
msgstr "Permiteți"
@@ -30020,7 +30551,7 @@ msgid "ProjectSettings|Analytics"
msgstr "Analize"
msgid "ProjectSettings|Automatically resolve merge request diff threads when they become outdated"
-msgstr ""
+msgstr "Rezolvați automat subiectele legate de diff-uri de merge request atunci când acestea devin depășite"
msgid "ProjectSettings|Badges"
msgstr "Insigne"
@@ -30056,7 +30587,7 @@ msgid "ProjectSettings|Customize this project's badges."
msgstr "Personalizați insignele acestui proiect."
msgid "ProjectSettings|Determine what happens to the commit history when you merge a merge request."
-msgstr "Determinați ce se întâmplă cu istoricul de commit-uri atunci când îmbinați un merge request."
+msgstr "Decideți ce anume se întâmplă cu istoricul commit-urilor atunci când îmbinați un merge request."
msgid "ProjectSettings|Disable email notifications"
msgstr "Dezactivați notificările prin e-mail"
@@ -30065,7 +30596,7 @@ msgid "ProjectSettings|Do not allow"
msgstr "Nu permiteți"
msgid "ProjectSettings|Enable \"Delete source branch\" option by default"
-msgstr "Activați opțiunea „Șterge ramura sursă†în mod implicit"
+msgstr "Activați opțiunea „Ștergeți ramura sursă†în mod implicit"
msgid "ProjectSettings|Enable merge trains"
msgstr "Activați merge train-urile"
@@ -30083,19 +30614,19 @@ msgid "ProjectSettings|Every project can have its own space to store its Docker
msgstr "Fiecare proiect poate avea propriul spațiu pentru a-și stoca imaginile Docker"
msgid "ProjectSettings|Every project can have its own space to store its packages."
-msgstr ""
+msgstr "Fiecare proiect poate avea propriul spațiu de depozitare a pachetelor sale."
msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr "Fiecare proiect poate avea propriul său spațiu pentru a-și depozita pachetele. Notă: Registrul de pachete este întotdeauna vizibil atunci când un proiect este public."
msgid "ProjectSettings|Everyone"
-msgstr ""
+msgstr "Toată lumea"
msgid "ProjectSettings|Existing merge requests and protected branches are not affected."
msgstr "Merge request-urile existente și ramurile protejate nu sunt afectate."
msgid "ProjectSettings|Failed to protect the tag"
-msgstr "Nu a reușit să protejeze eticheta"
+msgstr "Protejarea etichetei nu a reușit"
msgid "ProjectSettings|Failed to update tag!"
msgstr "Nu s-a reușit actualizarea etichetei!"
@@ -30125,7 +30656,7 @@ msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and
msgstr "Întreținere, export, arhivare, schimbare de cale, transfer și ștergere."
msgid "ProjectSettings|How do they differ?"
-msgstr ""
+msgstr "Care sunt diferențele dintre ele?"
msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
msgstr "În cazul în care merge train-urile sunt activate, îmbinarea este posibilă numai dacă un rebase al ramurii poate fi făcut fără conflicte."
@@ -30143,7 +30674,7 @@ msgid "ProjectSettings|LFS objects from this repository are available to forks.
msgstr "Obiectele LFS din acest repozitoriu sunt disponibile pentru fork-uri. %{linkStart}Cum le pot elimina?%{linkEnd}"
msgid "ProjectSettings|Leave empty to use default template."
-msgstr "Lăsați gol pentru a utiliza șablonul implicit."
+msgstr "Lăsați necompletat pentru a utiliza șablonul implicit."
msgid "ProjectSettings|Manage who can see the project in the public access directory."
msgstr "Gestionați cine poate vedea proiectul în directorul de acces public."
@@ -30203,7 +30734,7 @@ msgid "ProjectSettings|Override user notification preferences for all project me
msgstr "Suprascrie preferințele de notificare ale utilizatorilor pentru toți membrii proiectului."
msgid "ProjectSettings|Package registry"
-msgstr ""
+msgstr "Registrul pachetului"
msgid "ProjectSettings|Packages"
msgstr "Pachete"
@@ -30218,7 +30749,7 @@ msgid "ProjectSettings|Pipelines must succeed"
msgstr "Pipeline-urile trebuie să reușească"
msgid "ProjectSettings|Prevents direct linking to potentially sensitive media files"
-msgstr ""
+msgstr "Împiedică crearea de legături directe către fișiere media potențial sensibile"
msgid "ProjectSettings|Private"
msgstr "Privat"
@@ -30239,7 +30770,7 @@ msgid "ProjectSettings|Require an associated issue from Jira"
msgstr "Necesită o problemă asociată din Jira"
msgid "ProjectSettings|Require authentication to view media files"
-msgstr ""
+msgstr "Necesită autentificare pentru a vizualiza fișiere media"
msgid "ProjectSettings|Requirements"
msgstr "Cerințe"
@@ -30364,6 +30895,9 @@ msgstr "Ce sunt insignele?"
msgid "ProjectSettings|What are merge trains?"
msgstr "Ce sunt merge train-urile?"
+msgid "ProjectSettings|What is squashing?"
+msgstr "Ce este squashing-ul?"
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr "Atunci când în fișierul de configurare Cl/CD sunt activate pipeline-urile de merge request, pipeline-urile validează rezultatele combinate ale ramurilor sursă și țintă. %{link_start}Cum se configurează pipeline-urile de merge request?%{link_end}"
@@ -30398,7 +30932,7 @@ msgid "ProjectTemplates|HIPAA Audit Protocol"
msgstr "Protocolul de audit HIPAA"
msgid "ProjectTemplates|Jsonnet for Dynamic Child Pipelines"
-msgstr ""
+msgstr "Jsonnet pentru Pipeline-uri copil dinamice"
msgid "ProjectTemplates|Kotlin Native for Linux"
msgstr "Kotlin Native pentru Linux"
@@ -30440,7 +30974,7 @@ msgid "ProjectTemplates|Pages/Middleman"
msgstr "Pages/Middleman"
msgid "ProjectTemplates|Pages/Pelican"
-msgstr ""
+msgstr "Pages/Pelican"
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/Plain HTML"
@@ -30476,76 +31010,79 @@ msgid "ProjectView|Readme"
msgstr "Readme"
msgid "Projects"
-msgstr ""
+msgstr "Proiecte"
msgid "Projects (%{count})"
-msgstr ""
+msgstr "Proiecte (%{count})"
msgid "Projects API"
-msgstr ""
+msgstr "API de proiecte"
msgid "Projects Successfully Retrieved"
-msgstr ""
+msgstr "Proiecte recuperate cu succes"
msgid "Projects are graded based on the highest severity vulnerability present"
-msgstr ""
+msgstr "Proiectele sunt clasificate după vulnerabilitatea cu cea mai mare severitate prezentă."
msgid "Projects are organized into groups"
msgstr "Proiectele sunt organizate în grupuri"
msgid "Projects are where you store your code, access issues, wiki and other features of GitLab."
-msgstr ""
+msgstr "Proiectele sunt locul în care vă stocați codul, accesați problemele, wiki și alte caracteristici ale GitLab."
msgid "Projects contributed to"
-msgstr ""
+msgstr "Proiect la care a contribuit"
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
-msgstr ""
+msgstr "Proiectele vă ajută să vă organizați munca. Acestea conțin repozitoriul dvs. de fișiere, probleme, merge request-uri și multe altele."
+
+msgid "Projects in this group can use Git LFS"
+msgstr "Proiectele din acest grup pot utiliza Git LFS"
msgid "Projects shared with %{group_name}"
-msgstr ""
+msgstr "Proiecte partajate cu %{group_name}"
msgid "Projects that can be accessed"
-msgstr "Proiecte ce pot fi accesate"
+msgstr "Proiecte care pot fi accesate"
msgid "Projects to index"
-msgstr ""
+msgstr "Proiecte de indexat"
msgid "Projects with critical vulnerabilities"
-msgstr ""
+msgstr "Proiecte cu vulnerabilități critice"
msgid "Projects with high or unknown vulnerabilities"
-msgstr ""
+msgstr "Proiecte cu vulnerabilități ridicate sau necunoscute"
msgid "Projects with low vulnerabilities"
-msgstr ""
+msgstr "Proiecte cu vulnerabilități scăzute"
msgid "Projects with medium vulnerabilities"
-msgstr ""
+msgstr "Proiecte cu vulnerabilități medii"
msgid "Projects with no vulnerabilities and security scanning enabled"
-msgstr ""
+msgstr "Proiecte fără vulnerabilități și cu scanarea de securitate activată"
msgid "Projects with this topic"
msgstr "Proiecte cu această temă"
msgid "Projects with write access"
-msgstr ""
+msgstr "Proiecte cu acces în scriere"
msgid "ProjectsDropdown|Frequently visited"
-msgstr ""
+msgstr "Vizitate frecvent"
msgid "ProjectsDropdown|Loading projects"
msgstr "Se încarcă proiectele"
msgid "ProjectsDropdown|Projects you visit often will appear here"
-msgstr ""
+msgstr "Proiectele pe care le vizitați des vor apărea aici"
msgid "ProjectsDropdown|Search your projects"
msgstr "Căutați proiectele d-voastră"
msgid "ProjectsDropdown|Something went wrong on our end."
-msgstr ""
+msgstr "Ceva nu a mers bine de partea noastră."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "Ne pare rău, niciun proiect nu corespunde căutării d-voastră"
@@ -30568,8 +31105,8 @@ msgstr "Contactați un administrator pentru a activa opțiunile de import ale pr
msgid "ProjectsNew|Create"
msgstr "Creați"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
-msgstr "Creați un proiect gol pentru a vă găzdui fișierele, pentru a vă planifica munca și pentru a colabora la cod, printre altele."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
+msgstr "Construiți un proiect gol în care să vă stocați fișierele, să vă programați activitatea și să colaborați la cod, printre altele."
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
msgstr "Creați un proiect precompletat cu fișierele necesare pentru a începe rapid."
@@ -30596,10 +31133,10 @@ msgid "ProjectsNew|Import project"
msgstr "Importați un proiect"
msgid "ProjectsNew|Include a Getting Started README"
-msgstr "Includeți un README introductiv"
+msgstr "Includeți un README de inițiere"
msgid "ProjectsNew|Initialize repository with a README"
-msgstr "Inițializați depozitul cu un README"
+msgstr "Inițializați repozitoriul cu un README"
msgid "ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
msgstr "Migrați datele dintr-o sursă externă, cum ar fi GitHub, Bitbucket sau o altă instanță de GitLab."
@@ -30628,17 +31165,17 @@ msgstr "Rulați CI/CD pentru repozitoriul extern"
msgid "ProjectsNew|Visibility Level"
msgstr "Nivelul de vizibilitate"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "Doriți să găzduiți mai multe proiecte dependente sub același spațiu de nume? %{link_start}Creați un grup.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr "Doriți să organizați mai multe proiecte dependente sub același spațiu de nume? %{link_start}Creați un grup.%{link_end}"
msgid "PrometheusAlerts|exceeded"
-msgstr ""
+msgstr "a depășit"
msgid "PrometheusAlerts|is equal to"
-msgstr ""
+msgstr "este egal(ă) cu"
msgid "PrometheusAlerts|is less than"
-msgstr ""
+msgstr "este mai mic(ă) decât"
msgid "PrometheusService|%{exporters} with %{metrics} were found"
msgstr "%{exporters} cu %{metrics} au fost găsiți"
@@ -30701,7 +31238,7 @@ msgid "PrometheusService|No %{docsUrlStart}common metrics%{docsUrlEnd} were foun
msgstr "Nu au fost găsite %{docsUrlStart}metrici comune%{docsUrlEnd}"
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
-msgstr "Nu a fost create metrici personalizate. Creați una folosind butonul de mai sus"
+msgstr "Nu a fost creată nicio metrică personalizată. Creați una folosind butonul de mai sus"
msgid "PrometheusService|Prometheus cluster integration"
msgstr "Integrarea clusterului Prometheus"
@@ -30737,43 +31274,43 @@ msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
msgstr "{ \"type\": \"service_account\", \"project_id\": ... }"
msgid "Promote"
-msgstr ""
+msgstr "Promovați"
msgid "Promote issue to an epic"
-msgstr ""
+msgstr "Promovați problema la o epică"
msgid "Promote issue to incident"
msgstr "Promovați problema în incident"
msgid "Promote to epic"
-msgstr ""
+msgstr "Promovați la epică"
msgid "Promote to group label"
-msgstr ""
+msgstr "Promovați la etichetă de grup"
msgid "PromoteMilestone|Only project milestones can be promoted."
-msgstr ""
+msgstr "Numai obiectivele proiectului pot fi promovate."
msgid "PromoteMilestone|Project does not belong to a group."
-msgstr ""
+msgstr "Proiectul nu aparține unui grup."
msgid "PromoteMilestone|Promotion failed - %{message}"
-msgstr ""
+msgstr "Promovarea nu a reușit - %{message}"
msgid "Promoted issue to an epic."
-msgstr ""
+msgstr "Problemă promovată la o epică."
msgid "Promotes issue to incident"
msgstr "Promovează problema în incident"
msgid "Promotion is not supported."
-msgstr ""
+msgstr "Promovarea nu este acceptată."
msgid "Promotions|Add %{link_start} description templates %{link_end} to help your contributors to communicate effectively!"
msgstr "Adăugați %{link_start} șabloane de descriere %{link_end} pentru a vă ajuta colaboratorii să comunice eficient!"
msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
-msgstr "Adăugați Webhook-uri de grup și GitLab Enterprise Edition."
+msgstr "Adăugați Webhook-uri de grup și Ediția GitLab Enterprise."
msgid "Promotions|Better Protected Branches"
msgstr "Ramuri mai bine protejate"
@@ -30785,7 +31322,10 @@ msgid "Promotions|Buy EE"
msgstr "Cumpărați EE"
msgid "Promotions|Buy GitLab Enterprise Edition"
-msgstr "Cumpărați GitLab Enterprise Edition"
+msgstr "Cumpărați Ediția GitLab Enterprise"
+
+msgid "Promotions|Configure Service Desk"
+msgstr "Configurați Service Desk"
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr "Contactați un proprietar al grupului %{namespace_name} pentru a actualiza planul."
@@ -30799,6 +31339,9 @@ msgstr "Contactați administratorul dvs. pentru a vă actualiza licența."
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr "Șabloanele de descriere vă permit să definiți șabloane specifice contextului pentru câmpurile de descriere a problemelor și a merge request-urilor pentru proiectul dumneavoastră."
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr "Respingeți promovarea Service Desk"
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr "Respingeți promovarea graficelor burndown"
@@ -30806,25 +31349,25 @@ msgid "Promotions|Dismiss repository features promotion"
msgstr "Respingeți promovarea funcțiilor repozitoriului"
msgid "Promotions|Don't show me this again"
-msgstr "Nu mai afișa acest mesaj"
+msgstr "Nu mai afișați acest mesaj"
msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
msgstr "Epicele vă permit să vă gestionați portofoliul de proiecte mai eficient și cu mai puțin efort prin urmărirea grupurilor de probleme care au o temă comună, în cadrul proiectelor și obiectivelor."
msgid "Promotions|Improve issues management with Issue weight and GitLab Enterprise Edition."
-msgstr "Îmbunătățiți gestionarea problemelor cu „greutate†de probleme și GitLab Enterprise Edition."
+msgstr "Îmbunătățiți gestionarea problemelor cu „greutate†de probleme și Ediția GitLab Enterprise."
msgid "Promotions|Improve merge requests and customer support with GitLab Enterprise Edition."
-msgstr "Îmbunătățiți merge request-urile și suportul pentru clienți cu GitLab Enterprise Edition."
+msgstr "Îmbunătățiți merge request-urile și suportul pentru clienți cu Ediția GitLab Enterprise."
msgid "Promotions|Improve milestones with Burndown Charts."
msgstr "Îmbunătățiți obiectivele cu ajutorul Graficelor Burndown."
msgid "Promotions|Improve repositories with GitLab Enterprise Edition."
-msgstr "Îmbunătățiți repozitoriile cu GitLab Enterprise Edition."
+msgstr "Îmbunătățiți repozitoriile cu Ediția GitLab Enterprise."
msgid "Promotions|Improve search with Advanced Search and GitLab Enterprise Edition."
-msgstr "Îmbunătățiți căutarea cu Căutare Avansată și GitLab Enterprise Edition."
+msgstr "Îmbunătățiți căutarea cu Căutare Avansată și Ediția GitLab Enterprise."
msgid "Promotions|Keep track of events in your project"
msgstr "Țineți evidența evenimentelor din proiectul dumneavoastră"
@@ -30857,7 +31400,7 @@ msgid "Promotions|Set the number of necessary approvals and define a list of app
msgstr "Setați numărul de aprobări necesare și definiți o listă de aprobatori necesari pentru fiecare merge request dintr-un proiect."
msgid "Promotions|Start GitLab Ultimate trial"
-msgstr "Începeți testarea GitLab Ultimate"
+msgstr "Începeți perioada de încercare GitLab Ultimate"
msgid "Promotions|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 "Căutarea avansată din GitLab este un serviciu de căutare puternic care vă economisește timp. În loc să creați cod duplicat și să pierdeți timpul, acum puteți căuta cod în cadrul altor echipe care vă poate ajuta în propriul proiect."
@@ -30911,46 +31454,46 @@ msgid "Promotions|to help your contributors communicate effectively!"
msgstr "pentru a vă ajuta colaboratorii să comunice eficient!"
msgid "Prompt users to upload SSH keys"
-msgstr ""
+msgstr "Solicită utilizatorilor să încarce cheile SSH"
msgid "Protect"
-msgstr ""
+msgstr "Protejați"
msgid "Protect a tag"
-msgstr ""
+msgstr "Protejați o etichetă"
msgid "Protect variable"
msgstr "Protejați variabila"
msgid "Protected"
-msgstr ""
+msgstr "Protejat"
msgid "Protected Branch"
-msgstr ""
+msgstr "Ramură protejată"
msgid "Protected Branches"
-msgstr ""
+msgstr "Ramuri protejate"
msgid "Protected Environment"
-msgstr ""
+msgstr "Mediu protejat"
msgid "Protected Paths: requests"
-msgstr "Traiectorii protejate: cereri"
+msgstr "Căi protejate: solicitări"
msgid "Protected Tag"
-msgstr ""
+msgstr "Etichetă protejată"
msgid "Protected Tags"
-msgstr ""
+msgstr "Etichete protejate"
msgid "Protected branches"
-msgstr ""
+msgstr "Ramuri protejate"
msgid "Protected environments"
-msgstr ""
+msgstr "Medii protejate"
msgid "Protected paths"
-msgstr "Căile protejate"
+msgstr "Căi protejate"
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 "Sunt acceptate caracterele %{wildcards_link_start}wildcard%{wildcards_link_end} cum ar fi %{code_tag_start}*-stable%{code_tag_end} sau %{code_tag_start}production/*%{code_tag_end}."
@@ -30962,10 +31505,10 @@ msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr "Permiteți tuturor utilizatorilor cu acces push să execute push forțat."
msgid "ProtectedBranch|Allowed to force push"
-msgstr "Autorizați să forțeze push"
+msgstr "Autorizați să facă push forțat"
msgid "ProtectedBranch|Allowed to force push:"
-msgstr "Autorizați să forțeze push:"
+msgstr "Autorizați să facă push forțat:"
msgid "ProtectedBranch|Allowed to merge"
msgstr "Autorizați să îmbine"
@@ -31010,7 +31553,7 @@ msgid "ProtectedBranch|Protect a branch"
msgstr "Protejați o ramură"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
-msgstr "Ramură protejată (%{protected_branches_count})"
+msgstr "Ramuri protejate (%{protected_branches_count})"
msgid "ProtectedBranch|Protected branches"
msgstr "Ramuri protejate"
@@ -31052,10 +31595,10 @@ msgid "ProtectedEnvironment|Environment"
msgstr "Mediu"
msgid "ProtectedEnvironment|Only specified groups can execute deployments in protected environments."
-msgstr ""
+msgstr "Numai grupurile specificate pot executa implementări în medii protejate."
msgid "ProtectedEnvironment|Only specified users can execute deployments in a protected environment."
-msgstr "Numai utilizatorii specificați pot executa implementări într-un mediu protejat."
+msgstr "Numai utilizatorii specificați pot executa desfășurări într-un mediu protejat."
msgid "ProtectedEnvironment|Protect"
msgstr "Protejare"
@@ -31073,7 +31616,7 @@ msgid "ProtectedEnvironment|Select an environment"
msgstr "Alegeți un mediu"
msgid "ProtectedEnvironment|Select groups"
-msgstr ""
+msgstr "Selectați grupurile"
msgid "ProtectedEnvironment|Select users"
msgstr "Alegeți utilizatorii"
@@ -31082,7 +31625,7 @@ msgid "ProtectedEnvironment|There are currently no protected environments. Prote
msgstr "În prezent, nu există medii protejate. Protejați un mediu cu acest formular."
msgid "ProtectedEnvironment|Unprotect"
-msgstr "Anulare protecție"
+msgstr "Anulați protecția"
msgid "ProtectedEnvironment|Your environment can't be unprotected"
msgstr "Mediul dvs. nu poate fi neprotejat"
@@ -31103,16 +31646,16 @@ msgid "ProtectedTag|By default, protected tags restrict who can modify the tag."
msgstr "În mod implicit, etichetele protejate limitează cine poate modifica eticheta."
msgid "ProtectedTag|Learn more."
-msgstr ""
+msgstr "Aflați mai multe."
msgid "ProtectedTag|Limit access to creating and updating tags."
-msgstr ""
+msgstr "Limitați accesul la crearea și actualizarea etichetelor."
msgid "ProtectedTag|Protected tags"
-msgstr ""
+msgstr "Etichete protejate"
msgid "ProtectedTag|What are protected tags?"
-msgstr ""
+msgstr "Ce sunt etichetele protejate?"
msgid "ProtectedTag|default"
msgstr "implicit"
@@ -31120,11 +31663,14 @@ msgstr "implicit"
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr "Sfat pro: %{linkStart}Auto DevOps%{linkEnd} folosește clusterele Kubernetes pentru a vă implementa codul!"
+msgid "Provide Feedback"
+msgstr "Oferiți feedback"
+
msgid "Provide a number our sales team can use to call you."
-msgstr ""
+msgstr "Furnizați un număr de telefon la care echipa noastră de vânzări să vă poată suna."
msgid "Provider"
-msgstr ""
+msgstr "Furnizor"
msgid "Provision instructions"
msgstr "Instrucțiuni de furnizare"
@@ -31133,46 +31679,46 @@ msgid "Provisioned by:"
msgstr "Furnizat de:"
msgid "Proxy support for this API is not available currently"
-msgstr ""
+msgstr "Suportul proxy pentru acest API nu este disponibil în prezent"
msgid "Public"
-msgstr ""
+msgstr "Public"
msgid "Public - The group and any public projects can be viewed without any authentication."
-msgstr ""
+msgstr "Public - Grupul și toate proiectele publice pot fi vizualizate fără nicio autentificare."
msgid "Public - The project can be accessed without any authentication."
-msgstr ""
+msgstr "Public - Proiectul poate fi accesat fără nicio autentificare."
msgid "Public Access Help"
-msgstr ""
+msgstr "Ajutor pentru accesul public"
msgid "Public deploy keys"
-msgstr "Chei publice de desfășurare"
+msgstr "Chei de implementare publice"
msgid "Public pipelines"
-msgstr ""
+msgstr "Pipeline-uri publice"
msgid "Public projects Minutes cost factor"
-msgstr ""
+msgstr "Factorul de cost pentru Minutele proiectelor publice"
msgid "Public projects are an easy way to allow everyone to have read-only access."
-msgstr ""
+msgstr "Proiectele publice sunt o modalitate ușoară de a permite tuturor să aibă acces numai în citire."
msgid "Publish to status page"
-msgstr ""
+msgstr "Publicați pe pagina de stare"
msgid "Published"
-msgstr ""
+msgstr "Publicat"
msgid "Published on status page"
-msgstr ""
+msgstr "Publicat pe pagina de stare"
msgid "Publishes this issue to the associated status page."
-msgstr ""
+msgstr "Publică această problemă pe pagina de stare asociată."
msgid "Pull"
-msgstr ""
+msgstr "Pull"
msgid "Pull requests from fork are not supported"
msgstr "Pull request-urile din fork nu sunt acceptate"
@@ -31181,43 +31727,43 @@ msgid "Puma is running with a thread count above 1 and the Rugged service is ena
msgstr "Puma rulează cu un număr de subiecte mai mare de 1 și serviciul Rugged este activat. Acest lucru poate scădea performanța în anumite medii. Consultați %{link_start}documentația%{link_end} noastră pentru detalii despre această problemă."
msgid "Purchase more minutes"
-msgstr ""
+msgstr "Cumpărați mai multe minute"
msgid "Purchase more storage"
-msgstr ""
+msgstr "Achiziționați mai mult spațiu de stocare"
msgid "PurchaseStep|An error occurred in the purchase step. If the problem persists please contact support at https://support.gitlab.com."
msgstr "A apărut o eroare în etapa de achiziție. Dacă problema persistă, vă rugăm să contactați serviciul de asistență la https://support.gitlab.com."
msgid "Push"
-msgstr ""
+msgstr "Push"
msgid "Push Rule updated successfully."
-msgstr ""
+msgstr "Regula push a fost actualizată cu succes."
msgid "Push Rules"
-msgstr ""
+msgstr "Reguli pentru push"
msgid "Push Rules updated successfully."
-msgstr ""
+msgstr "Regulile pentru push actualizate cu succes."
msgid "Push an existing Git repository"
-msgstr ""
+msgstr "Faceți push la un repozitoriu Git existent"
msgid "Push an existing folder"
-msgstr ""
+msgstr "Faceți push la un folder existent"
msgid "Push code to the repository."
-msgstr ""
+msgstr "Faceți push de cod în repozitoriu."
msgid "Push commits to the source branch or add previously merged commits to review them."
msgstr "Faceți push de commit-uri la ramura sursă sau adăugați commit-urile îmbinate anterior pentru a le revizui."
msgid "Push events"
-msgstr ""
+msgstr "Evenimente push"
msgid "Push project from command line"
-msgstr ""
+msgstr "Faceți push proiectului din linia de comandă"
msgid "Push rules"
msgstr "Reguli pentru push"
@@ -31226,22 +31772,22 @@ msgid "Push the target branch up to GitLab."
msgstr "Faceți push ramurii țintă către GitLab."
msgid "Push to create a project"
-msgstr ""
+msgstr "Faceți push pentru a crea un proiect"
msgid "PushRules|All branch names must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any branch name is allowed."
-msgstr "Toate numele ramurilor trebuie să corespundă acestei %{wiki_syntax_link_start}expresii regulate%{wiki_syntax_link_end}. Dacă este necompletă, orice nume de ramură este permis."
+msgstr "Toate numele ramurilor trebuie să corespundă acestei %{wiki_syntax_link_start}expresii regulate%{wiki_syntax_link_end}. Dacă este necompletă, este permis orice nume de ramură."
msgid "PushRules|All commit author's email must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any email is allowed."
-msgstr "Toate e-mailurile autorilor de commit-uri trebuie să corespundă cu această %{wiki_syntax_link_start}expresie regulată%{wiki_syntax_link_end}. Dacă este necompletă, este permis orice e-mail."
+msgstr "Toate e-mailurile autorilor de commit-uri trebuie să corespundă acestei %{wiki_syntax_link_start}expresii regulate%{wiki_syntax_link_end}. Dacă este necompletă, este permis orice e-mail."
msgid "PushRules|All commit messages must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not required to match any expression."
-msgstr "Toate commit-urile trebuie să corespundă acestei %{wiki_syntax_link_start}expresii regulate%{wiki_syntax_link_end}. Dacă este necompletă, mesajele de confirmare nu trebuie să corespundă niciunei expresii."
+msgstr "Toate mesajele de commit trebuie să corespundă acestei %{wiki_syntax_link_start}expresii regulate%{wiki_syntax_link_end}. Dacă este necompletă, mesajele de commit nu trebuie să corespundă niciunei expresii."
msgid "PushRules|All committed filenames cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any filename is allowed."
msgstr "Toate numele de fișiere comise nu se pot potrivi cu această %{wiki_syntax_link_start}expresie regulată%{wiki_syntax_link_end}. Dacă este necompletă, este permis orice nume de fișier."
msgid "PushRules|Commit messages cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not rejected based on any expression."
-msgstr "Commit-urile nu pot corespunde cu această %{wiki_syntax_link_start}expresie regulată%{wiki_syntax_link_end}. Dacă este necompletă, commit-urile nu sunt respinse pe baza niciunei expresii."
+msgstr "Mesajele de commit nu se pot potrivi cu această %{wiki_syntax_link_start}expresie regulată%{wiki_syntax_link_end}. Dacă este necompletă, mesajele de commit nu sunt respinse pe baza niciunei expresii."
msgid "PushRules|Do not allow users to remove Git tags with %{code_block_start}git push%{code_block_end}"
msgstr "Nu permiteți utilizatorilor să elimine etichete Git cu %{code_block_start}git push%{code_block_end}"
@@ -31250,34 +31796,34 @@ msgid "PushRules|Reject any files likely to contain secrets. %{secret_files_link
msgstr "Respingeți orice fișier care ar putea conține secrete. %{secret_files_link_start}Ce fișiere secrete sunt respinse?%{secret_files_link_end}"
msgid "PushRules|Reject file sizes equal to or greater than this size. If set to 0, files of any size are allowed. This rule does not apply to files tracked by Git LFS."
-msgstr "Respingeți fișierele de dimensiuni egale sau mai mari decât această dimensiune. Dacă este setat la 0, sunt permise fișiere de orice dimensiune. Această regulă nu se aplică fișierelor urmărite de Git LFS."
+msgstr "Respingeți fișierele de mărimi egale sau mai mari decât această mărime. Dacă este setat la 0, sunt permise fișiere de orice mărime. Această regulă nu se aplică fișierelor urmărite de Git LFS."
msgid "PushRules|Restrict commits to existing GitLab users."
msgstr "Limitați commit-urile la utilizatorii GitLab existenți."
msgid "PushRules|Restrict push operations for this project."
-msgstr ""
+msgstr "Restricționați operațiunile push pentru acest proiect."
msgid "PushRules|Save push rules"
-msgstr ""
+msgstr "Salvați regulile push"
msgid "PushRules|Select push rules"
-msgstr ""
+msgstr "Selectați regulile push"
msgid "PushRules|Users can still delete tags through the GitLab UI."
msgstr "Utilizatorii pot șterge în continuare etichetele prin interfața GitLab UI."
msgid "PushRule|Push rules"
-msgstr ""
+msgstr "Reguli push"
msgid "PushRule|Reject unverified users"
msgstr "Respingeți utilizatorii neverificați"
msgid "Pushed"
-msgstr ""
+msgstr "ÃŽmpins"
msgid "Pushes"
-msgstr ""
+msgstr "ÃŽmpingeri"
msgid "PushoverService|%{user_name} deleted branch \"%{ref}\"."
msgstr "%{user_name} a È™ters ramura „%{ref}â€."
@@ -31289,7 +31835,7 @@ msgid "PushoverService|%{user_name} pushed new branch \"%{ref}\"."
msgstr "%{user_name} a împins noua ramură „%{ref}â€."
msgid "PushoverService|Enter new user key"
-msgstr ""
+msgstr "Introduceți noua cheie de utilizator"
msgid "PushoverService|Enter your application key."
msgstr "Introduceți cheia aplicației."
@@ -31307,7 +31853,7 @@ msgid "PushoverService|Leave blank for all active devices."
msgstr "Lăsați necompletat pentru toate dispozitivele active."
msgid "PushoverService|Leave blank to use your current user key."
-msgstr ""
+msgstr "Lăsați necompletat pentru a utiliza cheia de utilizator curentă."
msgid "PushoverService|Low priority"
msgstr "Prioritate redusă"
@@ -31328,7 +31874,7 @@ msgid "QualitySummary|Project quality"
msgstr "Calitatea proiectului"
msgid "Query"
-msgstr ""
+msgstr "Interogare"
msgid "Query cannot be processed"
msgstr "Interogarea nu poate fi procesată"
@@ -31340,37 +31886,37 @@ msgid "Quick actions can be used in description and comment boxes."
msgstr "Acțiunile rapide pot fi utilizate în casetele de descriere și de comentarii."
msgid "Quick help"
-msgstr ""
+msgstr "Ajutor rapid"
msgid "Quick range"
-msgstr ""
+msgstr "Interval rapid"
msgid "Quickly and easily edit multiple files in your project."
msgstr "Editați rapid și ușor mai multe fișiere din proiectul dumneavoastră."
msgid "Quota of CI/CD minutes"
-msgstr ""
+msgstr "Cotă de minute CI/CD"
msgid "Quota of CI/CD minutes:"
-msgstr ""
+msgstr "Cotă de minute CI/CD:"
msgid "README"
-msgstr ""
+msgstr "README"
msgid "Rails"
-msgstr ""
+msgstr "Rails"
msgid "Rake Tasks Help"
-msgstr ""
+msgstr "Ajutor pentru sarcinile Rake"
msgid "Random"
-msgstr ""
+msgstr "Aleatoriu"
msgid "Rate Limits"
-msgstr "Limite frecvență"
+msgstr "Limitele ratei"
msgid "Rate limit"
-msgstr "Limită frecvență"
+msgstr "Limita ratei"
msgid "Rate limit access to specified paths."
msgstr "Limitați rata de acces la căile specificate."
@@ -31385,53 +31931,56 @@ msgid "Raw blob requests"
msgstr "Solicitări blob brute"
msgid "Re-authentication period expired or never requested. Please try again"
-msgstr ""
+msgstr "Perioada de reautentificare a expirat sau nu a fost solicitată niciodată. Vă rugăm să încercați din nou"
msgid "Re-authentication required"
-msgstr ""
+msgstr "Reautentificarea este necesară"
msgid "Re-import"
-msgstr ""
+msgstr "Reimportați"
msgid "Re-request review"
-msgstr ""
+msgstr "Solicitați din nou o revizuire"
msgid "Read documentation"
-msgstr ""
+msgstr "Citiți documentația"
msgid "Read more"
msgstr "Citiți mai mult"
msgid "Read more about GitLab at %{link_to_promo}."
-msgstr ""
+msgstr "Citiți mai multe despre GitLab la %{link_to_promo}."
msgid "Read more about project permissions %{help_link_open}here%{help_link_close}"
-msgstr ""
+msgstr "Citiți mai multe despre permisiunile de proiect %{help_link_open}aici%{help_link_close}"
msgid "Read more about related epics"
-msgstr ""
+msgstr "Citiți mai multe despre epicele conexe"
msgid "Read more about related issues"
-msgstr ""
+msgstr "Citiți mai multe despre problemele conexe"
msgid "Read their documentation."
-msgstr ""
+msgstr "Citiți documentația acestora."
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr "Sunteți gata să începeți cu GitLab? Urmați aceste etape pentru a vă configura spațiul de lucru, pentru a planifica și comite modificări și pentru a vă implementa proiectul."
msgid "Ready to merge by members who can write to the target branch."
-msgstr ""
+msgstr "Gata de îmbinare de către membrii care pot scrie pe ramura țintă."
msgid "Ready to merge!"
-msgstr ""
+msgstr "Gata de îmbinare!"
msgid "Reauthenticating with SAML provider."
-msgstr ""
+msgstr "Reautentificarea cu furnizorul SAML."
msgid "Rebase"
msgstr "Rebase"
+msgid "Rebase completed"
+msgstr "Rebase finalizat"
+
msgid "Rebase in progress"
msgstr "Rebase în curs"
@@ -31445,7 +31994,7 @@ msgid "Rebase without pipeline"
msgstr "Rebase fără pipeline"
msgid "Recaptcha verified?"
-msgstr ""
+msgstr "Recaptcha este verificată?"
msgid "Receive a $50 gift card as a thank you for your time."
msgstr "Primiți un card cadou de 50 de dolari ca mulțumire pentru timpul dedicat."
@@ -31454,74 +32003,71 @@ msgid "Receive a %{strongOpen}$50 gift card%{strongClose} as a thank you for you
msgstr "Primiți un %{strongOpen}card cadou de 50 de dolari%{strongClose} ca mulțumire pentru timpul dedicat."
msgid "Receive any notifications from GitLab."
-msgstr "Primiți orice notificare de la GitLab."
+msgstr "Primiți orice notificări de la GitLab."
msgid "Receive notification of abuse reports by email."
msgstr "Primiți notificări cu privire la rapoartele de abuz prin e-mail."
msgid "Receive notifications about your own activity"
-msgstr ""
+msgstr "Primiți notificări despre propria activitate"
msgid "Receive product marketing emails"
-msgstr ""
+msgstr "Primiți e-mailuri de marketing pentru produse"
msgid "Recent"
-msgstr ""
+msgstr "Recent"
msgid "Recent Project Activity"
msgstr "Activitatea recentă a proiectului"
msgid "Recent Searches Service is unavailable"
-msgstr ""
+msgstr "Serviciul de căutări recente nu este disponibil"
msgid "Recent events"
msgstr "Evenimente recente"
msgid "Recent searches"
-msgstr ""
+msgstr "Căutări recente"
msgid "Recently used"
-msgstr ""
+msgstr "Utilizate recent"
msgid "Reconfigure"
-msgstr ""
+msgstr "Reconfigurați"
msgid "Recovery Codes"
-msgstr ""
+msgstr "Coduri de recuperare"
msgid "Redirect to SAML provider to test configuration"
-msgstr ""
+msgstr "Redirecționați către furnizorul SAML pentru a testa configurația"
msgid "Redirecting"
-msgstr ""
+msgstr "Redirecționare"
msgid "Redis"
-msgstr ""
+msgstr "Redis"
msgid "Reduce incident management alert volume (for example, if too many issues are being created)."
-msgstr ""
+msgstr "Reduceți volumul alertelor de gestionare a incidentelor (de exemplu, dacă se creează prea multe probleme)."
msgid "Reduce project visibility"
-msgstr ""
+msgstr "Reduceți vizibilitatea proiectului"
msgid "Reduce risk and triage fewer vulnerabilities with security training"
msgstr "Reduceți riscurile și triați mai puține vulnerabilități cu ajutorul formării de securitate"
msgid "Reduce this project’s visibility?"
-msgstr ""
+msgstr "Reduceți vizibilitatea acestui proiect?"
msgid "Reference"
-msgstr ""
+msgstr "Referință"
msgid "References"
-msgstr ""
+msgstr "Referințe"
msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
msgstr "Rafinați-vă criteriile de căutare (selectați %{strong_open}un grup%{strong_close} și %{strong_open}un proiect%{strong_close} atunci când este posibil)"
-msgid "Refresh"
-msgstr "Reîmprospătare"
-
msgid "Refresh the page and try again."
msgstr "Reîmprospătați pagina și încercați din nou."
@@ -31532,61 +32078,61 @@ msgstr[1] "Se reîmprospătează în %d secunde pentru a afișa starea actualiza
msgstr[2] "Se reîmprospătează în %d de secunde pentru a afișa starea actualizată..."
msgid "Regenerate export"
-msgstr ""
+msgstr "Regenerați exportul"
msgid "Regenerate instance ID"
-msgstr ""
+msgstr "Regenerați ID-ul instanței"
msgid "Regenerate recovery codes"
-msgstr ""
+msgstr "Regenerați codurile de recuperare"
msgid "Regenerating the instance ID can break integration depending on the client you are using."
-msgstr ""
+msgstr "Regenerarea ID-ului instanței poate întrerupe integrarea în funcție de clientul pe care îl utilizați."
msgid "Regex pattern"
-msgstr ""
+msgstr "Modelul Regex"
msgid "Region"
-msgstr ""
+msgstr "Regiune"
msgid "Regions"
-msgstr ""
+msgstr "Regiuni"
msgid "Register"
-msgstr ""
+msgstr "Înregistrați-vă"
msgid "Register / Sign In"
-msgstr ""
+msgstr "ÃŽnregistrare / Conectare"
msgid "Register Two-Factor Authenticator"
-msgstr ""
+msgstr "Înregistrați Authenticatorul cu doi factori"
msgid "Register Universal Two-Factor (U2F) Device"
-msgstr ""
+msgstr "Înregistrați dispozitivul universal cu doi factori (U2F)"
msgid "Register WebAuthn Device"
-msgstr ""
+msgstr "Înregistrați dispozitivul WebAuthn"
msgid "Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine. Runners are either:"
msgstr "Înregistrați cât de mulți executori doriți. Puteți înregistra executorii ca utilizatori separați, pe servere separate și pe computerul dvs. local. Executorii sunt fie:"
msgid "Register device"
-msgstr ""
+msgstr "Înregistrați dispozitivul"
msgid "Register now"
-msgstr ""
+msgstr "Înregistrați-vă acum"
msgid "Register the runner with this URL:"
msgstr "Înregistrați executorul cu acest URL:"
msgid "Register with two-factor app"
-msgstr ""
+msgstr "Înregistrați-vă cu aplicația cu doi factori"
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr "Activați serviciul Ping și înregistrați-vă pentru această funcție."
msgid "RegistrationFeatures|Read more about the %{link_start}Registration Features Program%{link_end}."
-msgstr "Aflați mai multe despre %{link_start}programul Funcții de înregistrare%{link_end}."
+msgstr "Citiți mai multe despre %{link_start}Programul de înregistrare de caracteristici%{link_end}."
msgid "RegistrationFeatures|Registration Features Program"
msgstr "Programul Funcții de înregistrare"
@@ -31631,19 +32177,19 @@ msgid "RegistrationVerification|You can alway verify your account at a later tim
msgstr "Puteți oricând să vă verificați contul ulterior."
msgid "Registration|Checkout"
-msgstr "Checkout"
+msgstr "Validare"
msgid "Registration|Your GitLab group"
-msgstr ""
+msgstr "Grupul d-voastră GitLab"
msgid "Registration|Your first project"
-msgstr ""
+msgstr "Primul d-voastră proiect"
msgid "Registration|Your profile"
msgstr "Profilul dumneavoastră"
msgid "Registry setup"
-msgstr ""
+msgstr "Configurarea registrului"
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr "Starea de reindexare: %{status} (Multiplicatorul tranșelor: %{multiplier}, Maximum de tranșe care rulează: %{max_slices})"
@@ -31661,16 +32207,16 @@ msgid "Related feature flags"
msgstr "Feature Flags asociate"
msgid "Related incidents or issues"
-msgstr ""
+msgstr "Incidente sau probleme conexe"
msgid "Related issues"
-msgstr ""
+msgstr "Probleme asociate"
msgid "Related merge requests"
msgstr "Merge request-uri asociate"
msgid "Relates to"
-msgstr ""
+msgstr "Este asociată cu"
msgid "Release"
msgid_plural "Releases"
@@ -31684,6 +32230,9 @@ msgstr "Resursele versiunii"
msgid "Release assets documentation"
msgstr "Documentația resurselor versiunii"
+msgid "Release date"
+msgstr "Data lansării"
+
msgid "Release does not have the same project as the milestone"
msgstr "Lansarea nu are același proiect ca și obiectivul"
@@ -31763,22 +32312,22 @@ msgid "Reload page"
msgstr "Reîncărcați pagina"
msgid "Remediations"
-msgstr ""
+msgstr "Remedieri"
msgid "Remember me"
msgstr "Amintiți-vă de mine"
msgid "Remind later"
-msgstr ""
+msgstr "Reamintiți mai târziu"
msgid "Remote object has no absolute path."
msgstr "Obiectul remote nu are cale absolută."
msgid "Remove"
-msgstr ""
+msgstr "Înlăturați"
msgid "Remove %{displayReference}"
-msgstr ""
+msgstr "Înlăturați %{displayReference}"
msgid "Remove Zoom meeting"
msgstr "Înlăturați reuniunea Zoom"
@@ -31787,43 +32336,43 @@ msgid "Remove Zoom meeting."
msgstr "Înlăturați reuniunea Zoom."
msgid "Remove access"
-msgstr ""
+msgstr "Înlăturați accesul"
msgid "Remove all or specific assignee(s)"
-msgstr ""
+msgstr "Înlăturați toți sau anumiți responsabili"
msgid "Remove all or specific label(s)"
-msgstr ""
+msgstr "Înlăturați toate sau anumite etichete"
msgid "Remove all or specific reviewer(s)"
-msgstr "Eliminați toți sau anumiți recenzenți"
+msgstr "Înlăturați toți sau anumiți recenzenți"
msgid "Remove approvers"
-msgstr ""
+msgstr "Înlăturați aprobatorii"
msgid "Remove approvers?"
-msgstr ""
+msgstr "Înlăturați aprobatorii?"
msgid "Remove asset link"
-msgstr ""
+msgstr "Înlăturați legătura activului"
msgid "Remove assignee"
-msgstr ""
+msgstr "Înlăturați responsabilul"
msgid "Remove attention request"
msgstr "Înlăturați cererea de atenție"
msgid "Remove attention request(s)"
-msgstr ""
+msgstr "Înlăturați cererea / cererile de atenție"
msgid "Remove avatar"
-msgstr ""
+msgstr "Înlăturați avatarul"
msgid "Remove card"
-msgstr ""
+msgstr "Înlăturați cardul"
msgid "Remove child epic from an epic"
-msgstr ""
+msgstr "Înlăturați o epică copil dintr-o epică"
msgid "Remove customer relation contact(s)."
msgstr "Înlăturați contactul (contactele) de relații cu clienții."
@@ -31832,16 +32381,16 @@ msgid "Remove customer relation contacts"
msgstr "Înlăturați contactele de relații cu clienții"
msgid "Remove deploy key"
-msgstr ""
+msgstr "Înlăturați cheia de implementare"
msgid "Remove description history"
-msgstr ""
+msgstr "Eliminați istoricul descrierilor"
msgid "Remove due date"
msgstr "Înlăturați data scadentă"
msgid "Remove favicon"
-msgstr ""
+msgstr "Eliminați faviconul"
msgid "Remove file"
msgstr "Înlăturați fișierul"
@@ -31850,133 +32399,133 @@ msgid "Remove fork relationship"
msgstr "Eliminați relația fork"
msgid "Remove from batch"
-msgstr ""
+msgstr "Înlăturați din lot"
msgid "Remove from epic"
-msgstr ""
+msgstr "Înlăturați din epică"
msgid "Remove group"
-msgstr ""
+msgstr "Înlăturați grupul"
msgid "Remove header logo"
-msgstr "Îndepărtați logoul antetului"
+msgstr "Înlăturați logoul antetului"
msgid "Remove iteration"
-msgstr ""
+msgstr "Înlăturați iterația"
msgid "Remove license"
-msgstr ""
+msgstr "Înlăturați licența"
msgid "Remove limit"
-msgstr ""
+msgstr "Înlăturați limita"
msgid "Remove link"
-msgstr ""
+msgstr "Înlăturați linkul"
msgid "Remove list"
msgstr "Înlăturați lista"
msgid "Remove log"
-msgstr ""
+msgstr "Înlăturați jurnalul"
msgid "Remove logo"
msgstr "Eliminați logoul"
msgid "Remove member"
-msgstr ""
+msgstr "Înlăturați membrul"
msgid "Remove milestone"
-msgstr ""
+msgstr "Înlăturați obiectivul"
msgid "Remove parent epic from an epic"
-msgstr ""
+msgstr "Înlăturați o epică părinte dintr-o epică"
msgid "Remove priority"
-msgstr ""
+msgstr "Înlăturați prioritatea"
msgid "Remove report"
-msgstr ""
+msgstr "Înlăturați raportul"
msgid "Remove reviewer"
-msgstr ""
+msgstr "Înlăturați recenzentul"
msgid "Remove runner"
msgstr "Înlăturați executorul"
msgid "Remove secondary email"
-msgstr ""
+msgstr "Înlăturați e-mailul secundar"
msgid "Remove spent time"
msgstr "Înlăturați timpul petrecut"
msgid "Remove time estimate"
-msgstr ""
+msgstr "Înlăturați estimarea timpului"
msgid "Remove topic avatar"
msgstr "Înlăturați avatarul subiectului"
msgid "Remove user"
-msgstr ""
+msgstr "Înlăturați utilizatorul"
msgid "Remove user & report"
-msgstr ""
+msgstr "Înlăturați utilizatorul și raportați-l"
msgid "Remove user from group"
-msgstr ""
+msgstr "Înlăturați utilizatorul din grup"
msgid "Remove user from project"
-msgstr ""
+msgstr "Înlăturați utilizatorul din proiect"
msgid "Remove..."
-msgstr ""
+msgstr "Înlăturare..."
msgid "Removed"
-msgstr ""
+msgstr "S-a înlăturat"
msgid "Removed %{assignee_text} %{assignee_references}."
-msgstr ""
+msgstr "S-a înlăturat %{assignee_text} %{assignee_references}"
msgid "Removed %{epic_ref} from child epics."
-msgstr ""
+msgstr "S-a înlăturat %{epic_ref} din epicele copil."
msgid "Removed %{iteration_reference} iteration."
-msgstr ""
+msgstr "S-a înlăturat iterația %{iteration_reference}."
msgid "Removed %{label_references} %{label_text}."
-msgstr ""
+msgstr "S-a înlăturat %{label_text} %{label_references}."
msgid "Removed %{milestone_reference} milestone."
-msgstr ""
+msgstr "S-a înlăturat obiectivul %{milestone_reference}."
msgid "Removed %{reviewer_text} %{reviewer_references}."
-msgstr ""
+msgstr "S-a înlăturat %{reviewer_text} %{reviewer_references}."
msgid "Removed all labels."
-msgstr ""
+msgstr "S-au înlăturat toate etichetele."
msgid "Removed an issue from an epic."
-msgstr ""
+msgstr "S-a înlăturat o problemă dintr-o epică."
msgid "Removed attention from %{users_sentence}."
-msgstr ""
+msgstr "S-a înlăturat atenția de la %{users_sentence}."
msgid "Removed attention request from @%{username}"
msgstr "A fost eliminată solicitarea de atenție de la @%{username}"
msgid "Removed group can not be restored!"
-msgstr ""
+msgstr "Grupul înlăturat nu poate fi restabilit!"
msgid "Removed parent epic %{epic_ref}."
-msgstr ""
+msgstr "S-a înlăturat epica părinte %{epic_ref}."
msgid "Removed spent time."
-msgstr ""
+msgstr "S-a înlăturat timpul petrecut."
msgid "Removed the due date."
msgstr "A fost înlăturată data scadentă."
msgid "Removed time estimate."
-msgstr ""
+msgstr "S-a înlăturat estimarea timpului."
msgid "Removed upload with id %{id}"
msgstr "S-a eliminat încărcarea cu ID-ul %{id}"
@@ -31988,34 +32537,34 @@ msgid "RemovedProjects|Projects that are pending deletion that you have access t
msgstr "Proiectele care sunt în curs de ștergere și la care aveți acces sunt enumerate aici."
msgid "Removes %{assignee_text} %{assignee_references}."
-msgstr ""
+msgstr "Înlătură %{assignee_text} %{assignee_references}"
msgid "Removes %{epic_ref} from child epics."
-msgstr ""
+msgstr "Înlătură %{epic_ref} din epicele copil."
msgid "Removes %{iteration_reference} iteration."
-msgstr ""
+msgstr "Înlătură iterația %{iteration_reference}."
msgid "Removes %{label_references} %{label_text}."
-msgstr ""
+msgstr "Înlătură %{label_text} %{label_references}."
msgid "Removes %{milestone_reference} milestone."
-msgstr ""
+msgstr "Înlătură obiectivul %{milestone_reference}."
msgid "Removes %{reviewer_text} %{reviewer_references}."
-msgstr ""
+msgstr "Înlătură %{reviewer_text} %{reviewer_references}."
msgid "Removes all labels."
-msgstr ""
+msgstr "Înlătură toate etichetele."
msgid "Removes an issue from an epic."
-msgstr ""
+msgstr "Înlătură o problemă dintr-o epică."
msgid "Removes attention from %{users_sentence}."
-msgstr ""
+msgstr "Înlătură atenția de la %{users_sentence}."
msgid "Removes parent epic %{epic_ref}."
-msgstr ""
+msgstr "Înlătură epica părinte %{epic_ref}."
msgid "Removes spent time."
msgstr "Înlătură timpul petrecut."
@@ -32024,106 +32573,106 @@ msgid "Removes the due date."
msgstr "Înlătură data scadentă."
msgid "Removes time estimate."
-msgstr ""
+msgstr "Înlătură estimarea timpului."
msgid "Removing this group also removes all child projects, including archived projects, and their resources."
msgstr "Înlăturarea acestui grup elimină, de asemenea, toate proiectele copil, inclusiv proiectele arhivate, și resursele acestora."
msgid "Rename file"
-msgstr ""
+msgstr "Redenumiți fișierul"
msgid "Rename folder"
-msgstr ""
+msgstr "Redenumiți dosarul"
msgid "Rename/Move"
-msgstr ""
+msgstr "Redenumiți / Mutați"
msgid "Render diagrams in your documents using PlantUML."
msgstr "Redați diagrame în documentele dvs. utilizând PlantUML."
msgid "Renew subscription"
-msgstr ""
+msgstr "Reînnoiți abonamentul"
msgid "Renews"
msgstr "Reînnoiește"
msgid "Reopen"
-msgstr ""
+msgstr "Redeschideți"
msgid "Reopen %{issueType}"
-msgstr ""
+msgstr "Redeschideți %{issueType}"
msgid "Reopen %{noteable}"
msgstr "Redeschide %{noteable}"
msgid "Reopen epic"
-msgstr ""
+msgstr "Redeschideți epica"
msgid "Reopen milestone"
-msgstr ""
+msgstr "Redeschideți obiectivul"
msgid "Reopen test case"
msgstr "Redeschideți cazul de testare"
msgid "Reopen this %{quick_action_target}"
-msgstr ""
+msgstr "Redeschideți acest / această %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
-msgstr ""
+msgstr "S-a redeschis acest / această %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
-msgstr ""
+msgstr "Redeschide acest / această %{quick_action_target}."
msgid "Replace"
-msgstr ""
-
-msgid "Replace %{blob_name}"
-msgstr "Înlocuiți %{blob_name}"
+msgstr "Înlocuiți"
msgid "Replace %{name}"
-msgstr ""
+msgstr "Înlocuiți %{name}"
msgid "Replace all label(s)"
-msgstr ""
+msgstr "Înlocuiți toate etichetele"
msgid "Replace audio"
-msgstr ""
+msgstr "Înlocuiți audio"
msgid "Replace file"
msgstr "Înlocuiți fișierul"
msgid "Replace image"
-msgstr ""
+msgstr "Înlocuiți imaginea"
msgid "Replace video"
-msgstr ""
+msgstr "Înlocuiți videoclipul"
msgid "Replaced all labels with %{label_references} %{label_text}."
-msgstr ""
+msgstr "Toate etichetele au fost înlocuite cu %{label_references} %{label_text}."
msgid "Replaces the clone URL root."
msgstr "Înlocuiește rădăcina URL a clonei."
msgid "Replication"
-msgstr ""
+msgstr "Replicare"
+
+msgid "Reply"
+msgstr "Răspuns"
msgid "Reply by email"
-msgstr ""
+msgstr "Răspundeți prin e-mail"
msgid "Reply internally"
-msgstr ""
+msgstr "Răspundeți pe plan intern"
msgid "Reply to comment"
-msgstr ""
+msgstr "Răspundeți la comentariu"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
-msgstr ""
+msgstr "Răspundeți direct la acest e-mail sau %{view_it_on_gitlab}."
msgid "Reply…"
-msgstr ""
+msgstr "Răspunde..."
msgid "Report abuse"
-msgstr ""
+msgstr "Raportați un abuz"
msgid "Report abuse to admin"
msgstr "Raportați abuzul la un administrator"
@@ -32135,19 +32684,19 @@ msgid "Report for the scan has been removed from the database."
msgstr "Raportul pentru scanare a fost eliminat din baza de date."
msgid "Report your license usage data to GitLab"
-msgstr ""
+msgstr "Raportați datele de utilizare a licenței dvs. către GitLab"
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Raportat(ă) %{timeAgo} de %{reportedBy}"
msgid "Reported by"
-msgstr ""
+msgstr "Raportat de"
msgid "Reported by %{reporter}"
-msgstr ""
+msgstr "Raportat de %{reporter}"
msgid "Reporting"
-msgstr ""
+msgstr "Raportare"
msgid "Reports|%{combinedString} and %{resolvedString}"
msgstr "%{combinedString} și %{resolvedString}"
@@ -32200,6 +32749,12 @@ msgstr "Eroare de analiză a raportului de bază:"
msgid "Reports|Classname"
msgstr "Numele clasei"
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr "Timp de execuție"
@@ -32294,13 +32849,13 @@ msgid "Reports|no changed test results"
msgstr "nu s-au modificat rezultatele testelor"
msgid "Repositories"
-msgstr ""
+msgstr "Repozitorii"
msgid "Repositories Analytics"
-msgstr ""
+msgstr "Analizele repozitoriilor"
msgid "RepositoriesAnalytics|Analyze repositories for projects in %{groupName}. Data doesn't include projects in subgroups. %{learnMoreLink}."
-msgstr ""
+msgstr "Analizează repozitoriile proiectelor din %{groupName}. Datele nu includ proiectele din subgrupuri. %{learnMoreLink}"
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr "Coverage mediu pe job"
@@ -32309,7 +32864,7 @@ msgid "RepositoriesAnalytics|Average coverage"
msgstr "Coverage mediu"
msgid "RepositoriesAnalytics|Average test coverage"
-msgstr ""
+msgstr "Coverage mediu de teste"
msgid "RepositoriesAnalytics|Code Coverage: %{averageCoverage}"
msgstr "Coverage de cod: %{averageCoverage}"
@@ -32334,18 +32889,18 @@ msgstr "Datele istoricului de coverage de teste sunt disponibile în format brut
msgid "RepositoriesAnalytics|In the last day, %{metricValue} job has code coverage."
msgid_plural "RepositoriesAnalytics|In the last day, %{metricValue} jobs have code coverage."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "ÃŽn ultima zi, %{metricValue} job are coverage de cod."
+msgstr[1] "ÃŽn ultima zi, %{metricValue} joburi au coverage de cod."
+msgstr[2] "ÃŽn ultima zi, %{metricValue} de joburi au coverage de cod."
msgid "RepositoriesAnalytics|In the last day, %{metricValue} project in %{groupName} has code coverage enabled."
msgid_plural "RepositoriesAnalytics|In the last day, %{metricValue} projects in %{groupName} have code coverage enabled."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "ÃŽn ultima zi, %{metricValue} proiect din %{groupName} are coverage de cod activat."
+msgstr[1] "ÃŽn ultima zi, %{metricValue} proiecte din %{groupName} au coverage de cod activat."
+msgstr[2] "ÃŽn ultima zi, %{metricValue} de proiecte din %{groupName} au coverage de cod activat."
msgid "RepositoriesAnalytics|In the last day, on average, %{metricValue} of all jobs are covered."
-msgstr ""
+msgstr "În ultima zi, în medie, %{metricValue} din toate joburile sunt acoperite."
msgid "RepositoriesAnalytics|Jobs with Coverage"
msgstr "Joburi cu Coverage"
@@ -32354,19 +32909,19 @@ msgid "RepositoriesAnalytics|Jobs with Coverage: %{coverageCount}"
msgstr "Joburi cu Coverage: %{coverageCount}"
msgid "RepositoriesAnalytics|Last 30 days"
-msgstr ""
+msgstr "Ultimele 30 de zile"
msgid "RepositoriesAnalytics|Last Update"
-msgstr ""
+msgstr "Ultima actualizare"
msgid "RepositoriesAnalytics|Last updated %{timeAgo}"
-msgstr ""
+msgstr "Ultima actualizare %{timeAgo}"
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr "Ultimele rezultate de coverage de teste"
msgid "RepositoriesAnalytics|Latest test coverage results for all projects in %{groupName} (excluding projects in subgroups)."
-msgstr ""
+msgstr "Ultimele rezultate de coverage de testare pentru toate proiectele din %{groupName} (cu excepția proiectelor din subgrupuri)."
msgid "RepositoriesAnalytics|No test coverage to display"
msgstr "Niciun coverage de teste de afișat"
@@ -32375,7 +32930,7 @@ msgid "RepositoriesAnalytics|Please select a project or multiple projects to dis
msgstr "Vă rugăm să selectați unul sau mai multe proiecte pentru a afișa cele mai recente date de coverage de teste."
msgid "RepositoriesAnalytics|Please select projects to display."
-msgstr ""
+msgstr "Vă rugăm să selectați proiectele de afișat."
msgid "RepositoriesAnalytics|Projects with Coverage"
msgstr "Proiecte cu Coverage"
@@ -32384,7 +32939,7 @@ msgid "RepositoriesAnalytics|Projects with Coverage: %{projectCount}"
msgstr "Proiecte cu Coverage: %{projectCount}"
msgid "RepositoriesAnalytics|Repositories Analytics"
-msgstr ""
+msgstr "Analize de repozitorii"
msgid "RepositoriesAnalytics|Test Code Coverage"
msgstr "Testare Coverage de cod"
@@ -32393,55 +32948,55 @@ msgid "RepositoriesAnalytics|There was an error fetching the projects."
msgstr "A apărut o eroare în timpul preluării proiectelor."
msgid "Repository"
-msgstr ""
+msgstr "Repozitoriu"
msgid "Repository Analytics"
-msgstr ""
+msgstr "Analize de repozitorii"
msgid "Repository Graph"
-msgstr ""
+msgstr "Graficul repozitoriului"
msgid "Repository Settings"
-msgstr ""
+msgstr "Setările repozitoriului"
msgid "Repository already read-only"
-msgstr ""
+msgstr "Repozitoriul este deja numai în citire"
msgid "Repository by URL"
-msgstr ""
+msgstr "Repozitoriu prin URL"
msgid "Repository check"
-msgstr ""
+msgstr "Verificarea repozitoriului"
msgid "Repository check was triggered."
msgstr "A fost declanșată verificarea repozitoriului."
msgid "Repository checks"
-msgstr ""
+msgstr "Verificările repozitoriului"
msgid "Repository cleanup"
-msgstr ""
+msgstr "Curățarea repozitoriului"
msgid "Repository cleanup has started. You will receive an email once the cleanup operation is complete."
-msgstr ""
+msgstr "A început curățarea repozitoriului. Veți primi un e-mail odată ce operațiunea de curățare este finalizată."
msgid "Repository clone URL"
-msgstr ""
+msgstr "URL-ul clonei repozitoriului"
msgid "Repository files count over the limit"
-msgstr ""
+msgstr "Numărul de fișiere din repozitoriu depășește limita"
msgid "Repository has an invalid default branch name."
-msgstr ""
+msgstr "Repozitoriul are un nume de ramură implicit invalid."
msgid "Repository has more than one branch."
-msgstr ""
+msgstr "Repozitoriul are mai mult de o ramură."
msgid "Repository has no locks."
-msgstr ""
+msgstr "Repozitoriul nu are blocări."
msgid "Repository has tags."
-msgstr ""
+msgstr "Repozitoriul nu are etichete."
msgid "Repository maintenance"
msgstr "Administrarea repozitoriului"
@@ -32453,97 +33008,97 @@ msgid "Repository mirroring configuration"
msgstr "Configurația replicării repozitoriului"
msgid "Repository must contain at least 1 file."
-msgstr ""
+msgstr "Repozitoriul trebuie să conțină cel puțin 1 fișier."
msgid "Repository size is above the limit."
-msgstr ""
+msgstr "Mărimea repozitoriului depășește limita."
msgid "Repository size limit (MB)"
msgstr "Limita dimensiunii repozitoriului (MB)"
msgid "Repository storage"
-msgstr ""
+msgstr "Stocarea repozitoriului"
msgid "Repository update events"
-msgstr ""
+msgstr "Evenimente de actualizare a repozitoriului"
msgid "Repository usage recalculation started"
-msgstr ""
+msgstr "Recalcularea utilizării repozitoriului a început"
msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
msgstr "Repozitoriu: %{counter_repositories} / Wikis: %{counter_wikis} / Artefacte de construcție: %{counter_build_artifacts} / Artefacte de pipeline: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Fragmente de cod: %{counter_snippets} / Pachete: %{counter_packages} / Încărcări: %{counter_uploads}"
msgid "RepositorySettingsAccessLevel|Select"
-msgstr ""
+msgstr "Selectați"
msgid "Request"
msgstr "Solicitare"
msgid "Request Access"
-msgstr ""
+msgstr "Solicitați acces"
msgid "Request a new one"
-msgstr ""
+msgstr "Solicitați una nouă"
msgid "Request attention from %{users_sentence}."
-msgstr ""
+msgstr "Solicitați atenție de la %{users_sentence}."
msgid "Request attention from assignee or reviewer"
-msgstr ""
+msgstr "Solicitați atenție de la responsabil sau recenzent"
msgid "Request attention from assignee(s) or reviewer(s)"
-msgstr ""
+msgstr "Solicitați atenție de la responsabil(i) sau recenzent(i)"
msgid "Request data is too large"
-msgstr ""
+msgstr "Datele solicitate sunt prea mari"
msgid "Request details"
-msgstr ""
+msgstr "Solicitați detalii"
msgid "Request parameter %{param} is missing."
-msgstr ""
+msgstr "Parametrul %{param} al solicitării lipsește."
msgid "Request review from"
-msgstr ""
+msgstr "Solicitați o revizuire din partea"
msgid "Request time"
-msgstr ""
+msgstr "Timpul solicitării"
msgid "Request to link SAML account must be authorized"
-msgstr ""
+msgstr "Solicitarea de conectare a contului SAML trebuie autorizată"
msgid "Requested"
-msgstr ""
+msgstr "Solicitat"
msgid "Requested %{time_ago}"
-msgstr ""
+msgstr "Solicitat %{time_ago}"
msgid "Requested attention from %{users_sentence}."
-msgstr ""
+msgstr "S-a solicitat atenție de la %{users_sentence}."
msgid "Requested attention from @%{username}"
msgstr "A solicitat atenție de la @%{username}"
msgid "Requested attention from @%{username}. Your own attention request was removed."
-msgstr ""
+msgstr "S-a solicitat atenția de la @%{username}. Propria dvs. solicitare de atenție a fost înlăturată."
msgid "Requested design version does not exist."
msgstr "Versiunea de design solicitată nu există."
msgid "Requested review"
-msgstr ""
+msgstr "Revizuirea solicitată"
msgid "Requested review. Your attention request was removed."
-msgstr ""
+msgstr "Revizuire solicitată. Solicitarea dvs. de atenție a fost înlăturată."
msgid "Requested states are invalid"
msgstr "Stările solicitate nu sunt valide"
msgid "Requests"
-msgstr ""
+msgstr "Solicitări"
msgid "Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}"
-msgstr "Solicitări pentru pagini la %{code_start}%{help_text_url}%{code_end} sunt redirecționate către URL. Destinația trebuie să întâlnească anumite cerințe. %{docs_link_start}Aflați mai multe.%{docs_link_end}"
+msgstr "Solicitările pentru paginile de la %{code_start}%{help_text_url}%{code_end} sunt redirecționate către URL. Destinația trebuie să îndeplinească anumite cerințe. %{docs_link_start}Aflați mai multe%{docs_link_end}."
msgid "Requests per period"
msgstr "Solicitări pe perioadă"
@@ -32551,17 +33106,14 @@ msgstr "Solicitări pe perioadă"
msgid "Require additional authentication for administrative tasks."
msgstr "Necesită autentificare suplimentară pentru sarcini administrative."
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr "Solicitați ca toți utilizatorii din acest grup să configureze autentificarea cu doi factori"
-
msgid "Required approvals (%{approvals_given} given)"
-msgstr ""
+msgstr "Aprobări necesare (%{approvals_given} acordate)"
msgid "Required approvals (%{approvals_given} given, you've approved)"
-msgstr ""
+msgstr "Aprobări necesare (%{approvals_given} acordate, ați aprobat)"
msgid "Required in this project."
-msgstr ""
+msgstr "Necesar în acest proiect."
msgid "Required only if you are not using role instance credentials."
msgstr "Este necesar numai dacă nu utilizați acreditările instanței de rol."
@@ -32570,25 +33122,25 @@ msgid "Requirement"
msgstr "Cerință"
msgid "Requirement %{reference} has been added"
-msgstr ""
+msgstr "Cerința %{reference} a fost adăugată"
msgid "Requirement %{reference} has been archived"
-msgstr ""
+msgstr "Cerința %{reference} a fost arhivată"
msgid "Requirement %{reference} has been reopened"
-msgstr ""
+msgstr "Cerința %{reference} a fost redeschisă"
msgid "Requirement %{reference} has been updated"
-msgstr ""
+msgstr "Cerința %{reference} a fost actualizată"
msgid "Requirement title cannot have more than %{limit} characters."
msgstr "Titlul cerinței nu poate avea mai mult de %{limit} caractere."
msgid "Requirements"
-msgstr ""
+msgstr "Cerințe"
msgid "Requirements can be based on users, stakeholders, system, software, or anything else you find important to capture."
-msgstr ""
+msgstr "Cerințele se pot baza pe utilizatori, părți interesate, sistem, software sau orice altceva vi se pare important de captat."
msgid "Requires %d approval from eligible users."
msgid_plural "Requires %d approvals from eligible users."
@@ -32609,61 +33161,61 @@ msgid "Requires you to deploy or set up cloud-hosted Sentry."
msgstr "Necesită să implementați sau să configurați Sentry găzduit în cloud."
msgid "Requires your primary GitLab email address."
-msgstr ""
+msgstr "Necesită adresa dvs. principală de e-mail GitLab."
msgid "Resend"
-msgstr ""
+msgstr "Retrimiteți"
msgid "Resend Request"
-msgstr ""
+msgstr "Retrimiteți solicitarea"
msgid "Resend confirmation email"
-msgstr ""
+msgstr "Retrimiteți e-mailul de confirmare"
msgid "Resend invite"
-msgstr ""
+msgstr "Retrimiteți invitația"
msgid "Resend it"
-msgstr ""
+msgstr "Trimiteți-l din nou"
msgid "Resend unlock instructions"
-msgstr ""
+msgstr "Retrimiteți instrucțiunile de deblocare"
msgid "Reset"
+msgstr "Resetați"
+
+msgid "Reset error tracking access token"
msgstr ""
msgid "Reset file"
msgstr "Resetare fișier"
msgid "Reset filters"
-msgstr ""
+msgstr "Resetați filtrele"
msgid "Reset health check access token"
msgstr "Resetați tokenul de acces pentru verificarea de sănătate"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
-msgstr ""
+msgstr "Resetare parolă"
msgid "Reset registration token"
msgstr "Resetați tokenul de înregistrare"
msgid "Reset template"
-msgstr ""
+msgstr "Resetați șablonul"
msgid "Reset to project defaults"
-msgstr ""
+msgstr "Resetați la valorile implicite ale proiectului"
msgid "Resolve"
-msgstr ""
+msgstr "Rezolvați"
msgid "Resolve conflicts"
msgstr "Rezolvați conflictele"
msgid "Resolve conflicts on source branch"
-msgstr ""
+msgstr "Rezolvați conflictele de pe ramura sursă"
msgid "Resolve these conflicts or ask someone with write access to this repository to merge it locally."
msgstr "Rezolvați aceste conflicte sau rugați pe cineva cu acces în scriere la acest repozitoriu să îl îmbine local."
@@ -32672,46 +33224,46 @@ msgid "Resolve thread"
msgstr "Rezolvați subiectul"
msgid "Resolved"
-msgstr ""
+msgstr "Rezolvat"
msgid "Resolved 1 discussion."
-msgstr ""
+msgstr "S-a rezolvat 1 discuție."
msgid "Resolved all discussions."
-msgstr ""
+msgstr "S-au rezolvat toate discuțiile."
msgid "Resolved by"
-msgstr ""
+msgstr "Rezolvat de"
msgid "Resolved by %{name}"
-msgstr ""
+msgstr "Rezolvat de %{name}"
msgid "Response"
-msgstr ""
+msgstr "Răspuns"
msgid "Response didn't include `service_desk_address`"
msgstr "Răspunsul nu include „service_desk_addressâ€."
msgid "Response metrics (AWS ELB)"
-msgstr ""
+msgstr "Metricile de răspuns (AWS ELB)"
msgid "Response metrics (Custom)"
msgstr "Metricile de răspuns (personalizate)"
msgid "Response metrics (HA Proxy)"
-msgstr ""
+msgstr "Metricile de răspuns (HA Proxy)"
msgid "Response metrics (NGINX Ingress VTS)"
-msgstr ""
+msgstr "Metricile de răspuns (NGINX Ingress VTS)"
msgid "Response metrics (NGINX Ingress)"
-msgstr ""
+msgstr "Metricile de răspuns (NGINX Ingress)"
msgid "Response metrics (NGINX)"
-msgstr ""
+msgstr "Metricile de răspuns (NGINX)"
msgid "Response text"
-msgstr ""
+msgstr "Text de răspuns"
msgid "Restart GitLab to apply changes."
msgstr "Reporniți GitLab pentru a aplica modificările."
@@ -32720,34 +33272,37 @@ msgid "Restart Terminal"
msgstr "Reporniți terminalul"
msgid "Restore"
-msgstr ""
+msgstr "Restabiliți"
msgid "Restore group"
-msgstr ""
+msgstr "Restabiliți grupul"
msgid "Restore project"
-msgstr ""
+msgstr "Restabiliți proiectul"
msgid "Restoring projects"
-msgstr ""
+msgstr "Restabilirea proiectelor"
msgid "Restoring the group will prevent the group, its subgroups and projects from being removed on this date."
-msgstr ""
+msgstr "Restabilirea grupului va împiedica înlăturarea grupului, a subgrupurilor și a proiectelor sale la această dată."
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
-msgstr ""
+msgstr "Restabilirea proiectului va împiedica înlăturarea proiectului la această dată și va restabili capacitatea oamenilor de a face modificări la acesta."
+
+msgid "Restrict access by IP address"
+msgstr "Restricționați accesul în funcție de adresa IP"
msgid "Restrict membership by email domain"
-msgstr ""
+msgstr "Restricționați apartenența în funcție de domeniul de e-mail"
msgid "Restrict projects for this runner"
msgstr "Limitați proiectele pentru acest executor"
msgid "Restricted shift times are not available for hourly shifts"
-msgstr ""
+msgstr "Orele de tură restricționate nu sunt disponibile pentru turele orare"
msgid "Resume"
-msgstr ""
+msgstr "Reluare"
msgid "Resync"
msgstr "Resincronizare"
@@ -32756,7 +33311,7 @@ msgid "Retrieving the compliance report failed. Refresh the page and try again."
msgstr "Recuperarea raportului de conformitate a eșuat. Reîmprospătați pagina și încercați din nou."
msgid "Retry"
-msgstr ""
+msgstr "Reîncercați"
msgid "Retry downstream pipeline"
msgstr "Reîncercare pipeline din aval"
@@ -32765,97 +33320,91 @@ msgid "Retry failed jobs"
msgstr "Reîncercați joburile eșuate"
msgid "Retry job"
-msgstr ""
+msgstr "Reîncercați jobul"
msgid "Retry migration"
-msgstr ""
-
-msgid "Retry the downstream pipeline"
-msgstr "Reîncercați pipeline-ul din aval"
-
-msgid "Retry the trigger job"
-msgstr "Reîncercați jobul de declanșare"
+msgstr "Reîncercați migrarea"
msgid "Retry this job"
-msgstr ""
+msgstr "Reîncercați acest job"
msgid "Retry this job in order to create the necessary resources."
-msgstr ""
+msgstr "Reîncercați acest job pentru a crea resursele necesare."
msgid "Retry verification"
-msgstr ""
+msgstr "Reîncercați verificarea"
msgid "Reveal value"
msgid_plural "Reveal values"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Dezvăluiți valoarea"
+msgstr[1] "Dezvăluiți valorile"
+msgstr[2] "Dezvăluiți valorile"
msgid "Reveal values"
-msgstr ""
+msgstr "Dezvăluiți valorile"
msgid "Revert this commit"
-msgstr ""
+msgstr "Reveniți la acest commit"
msgid "Revert this merge request"
-msgstr "Anulați acest merge request"
+msgstr "Reveniți acest merge request"
msgid "Review"
-msgstr ""
+msgstr "Revizuire"
msgid "Review App|View app"
-msgstr ""
+msgstr "Vizualizați aplicația"
msgid "Review App|View latest app"
-msgstr ""
+msgstr "Vizualizați cea mai recentă aplicație"
msgid "Review changes"
-msgstr ""
+msgstr "Revizuiți schimbările"
msgid "Review requests for you"
-msgstr ""
+msgstr "Revizuiesc solicitările pentru dvs."
msgid "Review the changes locally."
msgstr "Examinați modificările la nivel local."
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
-msgstr ""
+msgstr "RevizuiÈ›i procesul de configurare a furnizorilor de servicii în furnizorul dvs. de identitate — în acest caz, GitLab este „furnizorul de servicii†sau „partea intermediară de încredere (RP)â€."
msgid "Review the target project before submitting to avoid exposing %{source} changes."
-msgstr ""
+msgstr "Revizuiți proiectul țintă înainte de a-l trimite pentru a evita expunerea modificărilor aduse la %{source}."
msgid "Review time"
-msgstr ""
+msgstr "Timpul de revizuire"
msgid "Review time is defined as the time it takes from first comment until merged."
-msgstr ""
+msgstr "Timpul de revizuire este definit ca fiind timpul necesar de la primul comentariu până la integrare."
msgid "ReviewApp|Enable Review App"
-msgstr ""
+msgstr "Activați aplicația de analiză"
msgid "Reviewer"
msgid_plural "%d Reviewers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Revizor"
+msgstr[1] "%d Revizori"
+msgstr[2] "%d de Revizori"
msgid "Reviewer(s)"
-msgstr ""
+msgstr "Revizor(i)"
msgid "Reviewers"
-msgstr ""
+msgstr "Recenzenți"
msgid "Reviewing"
-msgstr ""
+msgstr "Revizuirea"
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr "Se revizuiește (merge request !%{mergeRequestId})"
msgid "Revoke"
-msgstr ""
+msgstr "Revocați"
msgid "Revoked"
-msgstr ""
+msgstr "Revocat"
msgid "Revoked access token %{access_token_name}!"
msgstr "S-a revocat tokenul de acces %{access_token_name}!"
@@ -32888,16 +33437,16 @@ msgid "Roadmap view"
msgstr "Afișare foaie de parcurs"
msgid "Role"
-msgstr ""
+msgstr "Rol"
msgid "Rollback"
-msgstr ""
+msgstr "Rollback"
msgid "Ruby"
-msgstr ""
+msgstr "Ruby"
msgid "Rule name is already taken."
-msgstr ""
+msgstr "Numele regulii este deja luat."
msgid "Rules that define what git pushes are accepted for a project in this group. All newly created projects in this group will use these settings."
msgstr "Reguli care definesc ce push-uri git sunt acceptate pentru un proiect din acest grup. Toate proiectele nou create în acest grup vor utiliza aceste setări."
@@ -32906,7 +33455,7 @@ msgid "Rules that define what git pushes are accepted for a project. All newly c
msgstr "Reguli care definesc ce push-uri git sunt acceptate pentru un proiect. Toate proiectele nou create vor utiliza aceste setări."
msgid "Run %{code_start}git fsck%{code_end} periodically in all project and wiki repositories to look for silent disk corruption issues."
-msgstr "Executați %{code_start}git fsck%{code_end} periodic în toate proiectele și repozitoriile wiki pentru a căuta probleme de corupție disc silențioase."
+msgstr "Rulați %{code_start}git fsck%{code_end} periodic în toate repozitoriile de proiecte și wiki pentru a căuta probleme de corupție silențioasă a discului."
msgid "Run CI/CD pipelines for external repositories"
msgstr "Rulați pipeline-uri CI/CD pentru repozitoriile externe"
@@ -32918,16 +33467,16 @@ msgid "Run CI/CD pipelines with Jenkins."
msgstr "Executați pipeline-uri CI/CD cu Jenkins."
msgid "Run housekeeping"
-msgstr ""
+msgstr "Executați menajul"
msgid "Run manual or delayed jobs"
-msgstr ""
+msgstr "Executați joburi manuale sau întârziate"
msgid "Run tests against your code live using the Web Terminal"
msgstr "Rulați testele pentru codul dvs. în timp real utilizând Terminalul Web"
msgid "Run untagged jobs"
-msgstr ""
+msgstr "Rulați joburi neetichetate"
msgid "Runner"
msgstr "Executor"
@@ -33077,7 +33626,7 @@ msgid "Runners|Download latest binary"
msgstr "Descărcați cel mai recent binar"
msgid "Runners|Edit your search and try again"
-msgstr ""
+msgstr "Editați-vă căutarea și încercați din nou"
msgid "Runners|Enable stale runner cleanup"
msgstr "Activați curățarea executorilor inactivi"
@@ -33092,13 +33641,16 @@ msgid "Runners|Executor"
msgstr "Executor"
msgid "Runners|Get started with runners"
-msgstr ""
+msgstr "Începeți cu executorii"
msgid "Runners|Group"
msgstr "Grup"
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr "Cum actualizăm executorul GitLab?"
+
msgid "Runners|IP Address"
-msgstr "Adresă IP"
+msgstr "Adresa IP"
msgid "Runners|Install a runner"
msgstr "Instalați un executor"
@@ -33143,7 +33695,7 @@ msgid "Runners|New registration token generated!"
msgstr "S-a generat un nou token de înregistrare!"
msgid "Runners|No results found"
-msgstr ""
+msgstr "Nu s-a găsit niciun rezultat"
msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr "Non spot. Alegerea implicită pentru executorul Shell în Windows."
@@ -33223,9 +33775,6 @@ msgstr "Reluați acceptarea de joburi"
msgid "Runners|Revision"
msgstr "Revizuire"
-msgid "Runners|Rocket launch illustration"
-msgstr "Ilustrația lansării rachetei"
-
msgid "Runners|Runner"
msgstr "Executor"
@@ -33290,7 +33839,7 @@ msgid "Runners|Runners"
msgstr "Executori"
msgid "Runners|Runners are the agents that run your CI/CD jobs. Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
+msgstr "Executorii sunt agenții care execută joburile CI/CD. Urmați %{linkStart}instrucțiunile de instalare și înregistrare%{linkEnd} pentru a configura un executor."
msgid "Runners|Runs untagged jobs"
msgstr "Rulează joburi neetichetate"
@@ -33367,6 +33916,15 @@ msgstr "Pentru a instala un Executor în Kubernetes, urmați instrucțiunile des
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr "Pentru a instala un Executor într-un container, urmați instrucțiunile descrise în documentația GitLab"
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr "Actualizați GitLab Runner pentru a se potrivi cu versiunea lui GitLab pe care o utilizați. Amândouă %{linkStart}versiunile, majoră și minoră%{linkEnd}, ar trebui să corespundă."
+
+msgid "Runners|Upgrade available"
+msgstr "Upgrade disponibil"
+
+msgid "Runners|Upgrade recommended"
+msgstr "Upgrade recomandat"
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr "Folosiți Executorii de grup atunci când doriți ca toate proiectele dintr-un grup să aibă acces la un set de executori."
@@ -33437,58 +33995,73 @@ msgid "Runners|upgrade recommended"
msgstr "actualizare recomandată"
msgid "Running"
-msgstr ""
+msgstr "Rulează"
msgid "Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects."
-msgstr ""
+msgstr "Efectuează o serie de sarcini de întreținere în cadrul repozitoriului curent, cum ar fi comprimarea reviziilor de fișiere și eliminarea obiectelor inaccesibile."
msgid "SAML"
-msgstr ""
+msgstr "SAML"
msgid "SAML SSO"
-msgstr ""
+msgstr "SAML SSO"
msgid "SAML SSO for %{group_name}"
-msgstr ""
+msgstr "SAML SSO pentru %{group_name}"
msgid "SAML discovery tokens"
-msgstr ""
+msgstr "Tokenuri de descoperire SAML"
msgid "SAML for %{group_name}"
-msgstr ""
+msgstr "SAML pentru %{group_name}"
+
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr "Selectând „Autorizați†veți transfera proprietatea contului GitLab „%{username}†(%{email}) către organizația dumneavoastră."
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr "Conectați-vă la GitLab pentru a conecta contul organizației dumneavoastră"
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr "Grupul „%{group_path}†vă permite să vă conectați cu contul dvs. de autentificare unică (SSO)."
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr "Pentru a accesa „%{group_name}†trebuie să vă conectați cu contul dvs. de autentificare unică (SSO), prin intermediul unei pagini externe de autentificare."
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr "Autentificarea unică (SSO) a organizației dvs. a fost conectată la contul dvs. GitLab"
msgid "SAST Configuration"
-msgstr ""
+msgstr "Configurare SAST"
msgid "SHA256"
-msgstr ""
+msgstr "SHA256"
msgid "SSH Key"
-msgstr ""
+msgstr "Cheie SSH"
msgid "SSH Keys"
-msgstr ""
+msgstr "Chei SSH"
msgid "SSH Keys Help"
-msgstr ""
+msgstr "Ajutor pentru cheile SSH"
msgid "SSH host key fingerprints"
msgstr "Amprentele cheii SSH a gazdei"
msgid "SSH host keys"
-msgstr ""
+msgstr "Chei de gazdă SSH"
msgid "SSH host keys are not available on this system. Please use %{ssh_keyscan} command or contact your GitLab administrator for more information."
msgstr "Cheile gazdă SSH nu sunt disponibile pe acest sistem. Vă rugăm să utilizați comanda %{ssh_keyscan} sau contactați administratorul dvs. GitLab pentru mai multe informații."
msgid "SSH key"
-msgstr ""
+msgstr "Cheia SSH"
msgid "SSH keys"
-msgstr ""
+msgstr "Chei SSH"
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
-msgstr ""
+msgstr "Cheile SSH vă permit să stabiliți o conexiune sigură între computer și GitLab."
msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
msgstr "Cheile SSH cu următoarele amprente sunt programate să expire în curând. Cheile SSH expirate nu pot fi utilizate:"
@@ -33497,31 +34070,31 @@ msgid "SSH keys with the following fingerprints have expired and can no longer b
msgstr "Cheile SSH cu următoarele amprente au expirat și nu mai pot fi utilizate:"
msgid "SSH public key"
-msgstr ""
+msgstr "Cheia publică SSH"
msgid "SSL Verification:"
-msgstr ""
+msgstr "Verificare SSL:"
msgid "SSL verification"
-msgstr ""
+msgstr "Verificare SSL"
msgid "Satisfied"
-msgstr ""
+msgstr "Mulțumit"
msgid "Saturday"
-msgstr ""
+msgstr "Sâmbătă"
msgid "Save"
-msgstr ""
+msgstr "Salvați"
msgid "Save %{name} size limits"
-msgstr ""
+msgstr "Salvați limitele mărimii pentru %{name}"
msgid "Save Changes"
msgstr "Salvați modificările"
msgid "Save application"
-msgstr ""
+msgstr "Salvați aplicația"
msgid "Save changes"
msgstr "Salvați modificările"
@@ -33530,25 +34103,25 @@ msgid "Save changes before testing"
msgstr "Salvați modificările înainte de testare"
msgid "Save comment"
-msgstr ""
+msgstr "Salvați comentariul"
msgid "Save deploy freeze"
msgstr "Salvați înghețarea implementării"
msgid "Save internal note"
-msgstr ""
+msgstr "Salvați nota internă"
msgid "Save password"
-msgstr ""
+msgstr "Salvați parola"
msgid "Save pipeline schedule"
-msgstr ""
+msgstr "Salvați programul de pipeline"
msgid "Saving"
-msgstr ""
+msgstr "Se salvează"
msgid "Saving project."
-msgstr ""
+msgstr "Se salvează proiectul."
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr "%{ifLabelStart}dacă%{ifLabelEnd} %{scanners} găsește mai mult de %{vulnerabilitiesAllowed} (de) vulnerabilitate/vulnerabilități %{severities} %{vulnerabilityStates} într-un merge request deschis care vizează %{branches}"
@@ -33569,7 +34142,7 @@ msgid "ScanResultPolicy|vulnerability states"
msgstr "stări de vulnerabilitate"
msgid "Scanner"
-msgstr ""
+msgstr "Scaner"
msgid "Scanner profile failed to delete"
msgstr "Profilul scanerului nu a putut fi șters"
@@ -33584,10 +34157,10 @@ msgid "Schedule-based escalation rules must have a schedule in the same project
msgstr "Regulile de escaladare bazate pe un program trebuie să aibă un program în același proiect cu politica"
msgid "Scheduled"
-msgstr ""
+msgstr "Programat"
msgid "Scheduled Deletion At - %{permanent_deletion_time}"
-msgstr ""
+msgstr "Ștergere programată la - %{permanent_deletion_time}"
msgid "Scheduled a rebase of branch %{branch}."
msgstr "A fost programat un rebase al ramurii %{branch}."
@@ -33596,13 +34169,13 @@ msgid "Scheduled pipelines cannot run more frequently than once per %{limit} min
msgstr "Pipeline-rile programate nu pot fi executate mai frecvent decât o dată la %{limit} minute. Un pipeline configurat pentru a fi executat mai frecvent pornește numai după ce au trecut %{limit} minute de la ultima dată când a fost executat."
msgid "Scheduled to merge this merge request (%{strategy})."
-msgstr ""
+msgstr "S-a programat îmbinarea acestui merge request (%{strategy})."
msgid "Schedules"
-msgstr ""
+msgstr "Programe"
msgid "Schedules to merge this merge request (%{strategy})."
-msgstr ""
+msgstr "Programează îmbinarea acestui merge request (%{strategy})."
msgid "Scheduling Pipelines"
msgstr "Programarea pipeline-urilor"
@@ -33620,94 +34193,94 @@ msgid "Scopes (select at least one)"
msgstr "Domenii de aplicare (selectați cel puțin unul)"
msgid "Scopes can't be blank"
-msgstr ""
+msgstr "Domeniile nu pot fi necompletate"
msgid "Scopes: %{scope_list}"
msgstr "Scopuri: %{scope_list}"
msgid "Scroll down"
-msgstr ""
+msgstr "Derulați în jos"
msgid "Scroll left"
-msgstr ""
+msgstr "Derulați la stânga"
msgid "Scroll right"
-msgstr ""
+msgstr "Derulați la dreapta"
msgid "Scroll to bottom"
-msgstr ""
+msgstr "Derulați până jos"
msgid "Scroll to top"
-msgstr ""
+msgstr "Derulați până sus"
msgid "Scroll up"
-msgstr ""
+msgstr "Derulați în sus"
msgid "Search"
-msgstr ""
+msgstr "Căutare"
msgid "Search GitLab"
-msgstr ""
+msgstr "Căutați în GitLab"
msgid "Search a group"
-msgstr ""
+msgstr "Căutați un grup"
msgid "Search an environment spec"
-msgstr ""
+msgstr "Căutați o specificație de mediu"
msgid "Search assignees"
-msgstr ""
+msgstr "Căutați responsabili"
msgid "Search authors"
-msgstr ""
+msgstr "Căutați autorii"
msgid "Search branches"
-msgstr ""
+msgstr "Căutați ramuri"
msgid "Search branches and tags"
-msgstr ""
+msgstr "Căutați ramuri și etichete"
msgid "Search branches, tags, and commits"
-msgstr ""
+msgstr "Căutați ramuri, etichete și commit-uri"
msgid "Search by Git revision"
-msgstr ""
+msgstr "Căutați după revizia Git"
msgid "Search by author"
-msgstr ""
+msgstr "Căutați după autor"
msgid "Search by commit title or SHA"
-msgstr ""
+msgstr "Căutați după titlu commit-ului sau SHA"
msgid "Search by message"
-msgstr ""
+msgstr "Căutați după mesaj"
msgid "Search by name"
-msgstr ""
+msgstr "Căutați după nume"
msgid "Search files"
-msgstr ""
+msgstr "Căutați fișiere"
msgid "Search for Namespace"
msgstr "Căutați spațiul de nume"
msgid "Search for a LDAP group"
-msgstr ""
+msgstr "Căutați un grup LDAP"
msgid "Search for a group"
-msgstr ""
+msgstr "Căutați un grup"
msgid "Search for a user"
-msgstr ""
+msgstr "Căutați un utilizator"
msgid "Search for an emoji"
-msgstr ""
+msgstr "Căutați un emoji"
msgid "Search for projects, issues, etc."
-msgstr ""
+msgstr "Căutați proiecte, probleme etc."
msgid "Search for this text"
-msgstr ""
+msgstr "Căutați acest text"
msgid "Search forks"
msgstr "Căutați forkuri"
@@ -33716,58 +34289,58 @@ msgid "Search groups"
msgstr "Căutați grupuri"
msgid "Search iterations"
-msgstr ""
+msgstr "Căutați iterații"
msgid "Search labels"
-msgstr ""
+msgstr "Căutați etichete"
msgid "Search merge requests"
msgstr "Căutați merge request-uri"
msgid "Search milestones"
-msgstr ""
+msgstr "Căutați obiective"
msgid "Search or create tag"
-msgstr ""
+msgstr "Căutați sau creați o etichetă"
msgid "Search or filter results..."
-msgstr ""
+msgstr "Căutați sau filtrați rezultatele…"
msgid "Search or filter results…"
-msgstr ""
+msgstr "Căutați sau filtrați rezultatele…"
msgid "Search page"
-msgstr ""
+msgstr "Pagina de căutare"
msgid "Search project"
-msgstr ""
+msgstr "Căutați un proiect"
msgid "Search projects"
-msgstr ""
+msgstr "Căutați proiecte"
msgid "Search projects..."
-msgstr ""
+msgstr "Căutare proiecte..."
msgid "Search rate limits"
msgstr "Limitele ratei de căutare"
msgid "Search refs"
-msgstr ""
+msgstr "Căutați referințe"
msgid "Search requirements"
-msgstr ""
+msgstr "Căutați cerințe"
msgid "Search settings"
-msgstr ""
+msgstr "Căutați setări"
msgid "Search users"
-msgstr ""
+msgstr "Căutați utilizatori"
msgid "Search users or groups"
-msgstr ""
+msgstr "Căutați utilizatori sau grupuri"
msgid "Search your project dependencies for their licenses and apply policies."
-msgstr ""
+msgstr "Căutați în dependențele proiectului dvs. pentru licențele acestora și aplicați politicile."
msgid "Search your projects"
msgstr "Căutați proiectele d-voastră"
@@ -33776,16 +34349,16 @@ msgid "SearchAutocomplete|All GitLab"
msgstr "ÃŽntregul GitLab"
msgid "SearchAutocomplete|Issues I've created"
-msgstr "Probleme pe care le-am creat"
+msgstr "Problemele create de mine"
msgid "SearchAutocomplete|Issues assigned to me"
-msgstr "Probleme atribuite mie"
+msgstr "Problemele atribuite mie"
msgid "SearchAutocomplete|Merge requests I've created"
-msgstr "Merge request-urile pe care le-am creat"
+msgstr "Merge request-urile create de mine"
msgid "SearchAutocomplete|Merge requests assigned to me"
-msgstr "Merge request-urile care mi-au fost atribuite"
+msgstr "Merge request-urile atribuite mie"
msgid "SearchAutocomplete|Merge requests that I'm a reviewer"
msgstr "Merge request-uri la care sunt recenzent"
@@ -33800,7 +34373,7 @@ msgid "SearchAutocomplete|in project %{projectName}"
msgstr "în proiectul %{projectName}"
msgid "SearchCodeResults|of %{link_to_project}"
-msgstr ""
+msgstr "din %{link_to_project}"
msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr "Se afișează %{count} %{scope} pentru %{term_element}"
@@ -33881,7 +34454,7 @@ msgstr[1] "rezultate wiki"
msgstr[2] "de rezultate wiki"
msgid "Searching by both author and message is currently not supported."
-msgstr ""
+msgstr "Căutarea atât după autor, cât și după mesaj nu este acceptată în prezent."
msgid "Seats"
msgstr "Seats"
@@ -33896,19 +34469,19 @@ msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr "Datele de utilizare despre seats sunt actualizate în fiecare zi la ora 12:00 UTC"
msgid "Secondary email:"
-msgstr ""
+msgstr "E-mail secundar:"
msgid "Seconds"
-msgstr ""
+msgstr "Secunde"
msgid "Secret"
-msgstr ""
+msgstr "Secret"
msgid "Secret Detection"
msgstr "Detectarea secretelor"
msgid "Secret token"
-msgstr ""
+msgstr "Token secret"
msgid "Secure Code Warrior"
msgstr "Secure Code Warrior"
@@ -33917,22 +34490,22 @@ msgid "Secure Files"
msgstr "Fișiere Securizate"
msgid "Secure token that identifies an external storage request."
-msgstr "Token sigur care identifică o solicitare stocare externă."
+msgstr "Token securizat care identifică o solicitare de stocare externă."
msgid "SecureFiles|Delete %{name}?"
-msgstr ""
+msgstr "Ștergeți %{name}?"
msgid "SecureFiles|Delete secure file"
-msgstr ""
+msgstr "Ștergeți fișierul securizat"
msgid "SecureFiles|Secure File %{name} will be permanently deleted. Are you sure?"
-msgstr ""
+msgstr "Fișierul securizat %{name} va fi șters definitiv. Sunteți sigur?"
msgid "Security"
-msgstr ""
+msgstr "Securitate"
msgid "Security & Compliance"
-msgstr ""
+msgstr "Securitate & Conformitate"
msgid "Security Configuration"
msgstr "Configurarea securității"
@@ -33944,7 +34517,7 @@ msgid "Security dashboard"
msgstr "Tabloul de bord de securitate"
msgid "Security navigation"
-msgstr ""
+msgstr "Navigare de securitate"
msgid "Security report is out of date. Please update your branch with the latest changes from the target branch (%{targetBranchName})"
msgstr "Raportul de securitate este expirat. Vă rugăm să vă actualizați ramura cu ultimele modificări din ramura țintă (%{targetBranchName})"
@@ -33989,7 +34562,7 @@ msgid "SecurityConfiguration|Available with Ultimate"
msgstr "Disponibil cu Ultimate"
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 "În mod implicit, toate analizoarele sunt aplicate pentru a acoperi toate limbajele din proiectul dvs. și se execută numai dacă limbajul este detectat în merge request."
+msgstr "În mod implicit, toate analizatoarele sunt aplicate pentru a acoperi toate limbajele din proiectul dvs. și se execută numai dacă limbajul este detectat în merge request."
msgid "SecurityConfiguration|Compliance"
msgstr "Conformitate"
@@ -34019,7 +34592,7 @@ msgid "SecurityConfiguration|Create merge request"
msgstr "Creați un merge request"
msgid "SecurityConfiguration|Customize common SAST 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 %{linkStart}GitLab SAST documentation%{linkEnd}."
-msgstr "Personalizați setările comune SAST pentru a satisface cerințele dumneavoastră. Modificările de configurare efectuate aici le înlocuiesc pe cele furnizate de GitLab și sunt excluse din actualizări. Pentru detalii despre opțiunile de configurare mai avansate, consultați %{linkStart}documentația GitLab SAST%{linkEnd}."
+msgstr "Personalizați setările comune SAST pentru a se potrivi cerințele dumneavoastră. Modificările de configurare efectuate aici le înlocuiesc pe cele furnizate de GitLab și sunt excluse din actualizări. Pentru detalii despre opțiunile de configurare mai avansate, consultați %{linkStart}documentația GitLab SAST%{linkEnd}."
msgid "SecurityConfiguration|Enable %{feature}"
msgstr "Activați %{feature}"
@@ -34070,7 +34643,7 @@ msgid "SecurityConfiguration|Runtime security metrics for application environmen
msgstr "Metricile de securitate runtime pentru mediile aplicațiilor"
msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "Analizoare SAST"
+msgstr "Analizatoare SAST"
msgid "SecurityConfiguration|SAST Configuration"
msgstr "Configurația SAST"
@@ -34085,10 +34658,10 @@ msgid "SecurityConfiguration|Security training"
msgstr "Formare de securitate"
msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
-msgstr "Statusul instrumentelor se aplică numai la ramura implicită și se bazează pe %{linkStart}cel mai recent pipeline%{linkEnd}."
+msgstr "Starea instrumentelor se aplică numai la ramura implicită și se bazează pe %{linkStart}cel mai recent pipeline%{linkEnd}."
msgid "SecurityConfiguration|Upgrade or start a free trial"
-msgstr "Faceți upgrade sau începeți o evaluare gratuită"
+msgstr "Actualizați sau începeți o perioadă de încercare gratuită"
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
msgstr "Utilizarea setărilor personalizate. Nu veți primi actualizări automate pentru această variabilă. %{anchorStart}Restabiliți la valoarea implicită%{anchorEnd}"
@@ -34118,7 +34691,10 @@ msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request
msgstr "%{scanners} %{severities} într-un merge request deschis care vizează %{branches}."
msgid "SecurityOrchestration|+%{count} more"
-msgstr ""
+msgstr "+%{count} mai mult"
+
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ", și %{count} mai mult"
msgid "SecurityOrchestration|.yaml mode"
msgstr ".yaml mode"
@@ -34130,13 +34706,13 @@ msgid "SecurityOrchestration|Actions"
msgstr "Acțiuni"
msgid "SecurityOrchestration|Add rule"
-msgstr "Adăugați o regulă"
+msgstr "Adăugare regulă"
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr "După anularea alertei, mesajul nu va mai fi afișat niciodată."
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
-msgstr ""
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
+msgstr "După activarea unei politici la nivel de grup, această politică se aplică automat tuturor proiectelor și subgrupurilor din acest grup."
msgid "SecurityOrchestration|All policies"
msgstr "Toate politicile"
@@ -34180,6 +34756,9 @@ msgstr "Ștergeți politica: %{policy}"
msgid "SecurityOrchestration|Description"
msgstr "Descriere"
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr "Nu mai afișați alerta"
@@ -34204,12 +34783,18 @@ msgstr "Activat"
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr "Impuneți securitatea pentru acest proiect. %{linkStart}Mai multe informații.%{linkEnd}"
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr "Încărcarea agenților de cluster a eșuat."
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr "Dacă un scaner găsește o vulnerabilitate critică nou detectată într-un merge request deschis care vizează ramura principală, atunci solicitați două aprobări din partea oricărui membru al securității aplicației."
-msgid "SecurityOrchestration|Inherited from %{namespace}"
+msgid "SecurityOrchestration|Inherited"
msgstr ""
+msgid "SecurityOrchestration|Inherited from %{namespace}"
+msgstr "Moștenit din %{namespace}"
+
msgid "SecurityOrchestration|Invalid policy type"
msgstr "Tip de politică invalid"
@@ -34303,9 +34888,6 @@ msgstr "Politicile de execuție a scanării pot fi create numai de către propri
msgid "SecurityOrchestration|Scan execution policy"
msgstr "Politica de execuție a scanării"
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr "Politica de execuție a scanării permite crearea de reguli care forțează scanările de securitate pentru anumite ramuri la un moment dat. Tipurile acceptate sunt SAST, DAST, Detectarea secretelor, Scanarea containerelor, Scanarea licențelor, Fuzzing de API, Fuzzing ghidat prin coverage."
-
msgid "SecurityOrchestration|Scan result"
msgstr "Rezultatul scanării"
@@ -34349,7 +34931,7 @@ msgid "SecurityOrchestration|Sorry, your filter produced no results."
msgstr "Ne pare rău, filtrul dvs. nu a produs niciun rezultat."
msgid "SecurityOrchestration|Source"
-msgstr ""
+msgstr "Sursa"
msgid "SecurityOrchestration|Status"
msgstr "Status"
@@ -34370,22 +34952,22 @@ msgid "SecurityOrchestration|There was a problem creating the new security polic
msgstr "A apărut o problemă în timpul creării noii politici de securitate"
msgid "SecurityOrchestration|This group"
-msgstr ""
+msgstr "Acest grup"
msgid "SecurityOrchestration|This is a group-level policy"
-msgstr ""
+msgstr "Aceasta este o politică la nivel de grup"
msgid "SecurityOrchestration|This is a project-level policy"
-msgstr ""
+msgstr "Aceasta este o politică la nivel de proiect"
msgid "SecurityOrchestration|This policy is inherited from %{namespace}"
-msgstr ""
+msgstr "Această politică este moștenită din %{namespace}"
msgid "SecurityOrchestration|This policy is inherited from the %{linkStart}namespace%{linkEnd} and must be edited there"
-msgstr ""
+msgstr "Această politică este moștenită din %{linkStart}spațiul de nume%{linkEnd} și trebuie editată acolo"
msgid "SecurityOrchestration|This project"
-msgstr ""
+msgstr "Acest proiect"
msgid "SecurityOrchestration|This project does not contain any security policies."
msgstr "Acest proiect nu conține nicio politică de securitate."
@@ -34405,11 +34987,14 @@ msgstr "Deconectarea unui proiect de securitate elimină toate politicile stocat
msgid "SecurityOrchestration|Update scan policies"
msgstr "Actualizați politicile de scanare"
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr "Utilizați o politică de execuție a scanării pentru crearea de reguli care să impună scanări de securitate pentru anumite ramuri la un anumit moment. Tipurile acceptate sunt SAST, DAST, Detectarea secretelor și Scanarea containerelor."
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
-msgstr "Utilizați o politică de rezultat al scanării pentru a crea reguli care să asigure că problemele de securitate sunt verificate înainte de îmbinarea unui merge request."
+msgstr "Utilizați o politică de rezultate ale scanării pentru a crea reguli care asigură verificarea problemelor de securitate înainte de îmbinarea unui merge request."
msgid "SecurityOrchestration|View policy project"
-msgstr "Vizualizați proiectul de politici"
+msgstr "Vizualizați proiectul de politică"
msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr "Nu aveți încă nicio politică de securitate"
@@ -34429,20 +35014,8 @@ msgstr "ramură"
msgid "SecurityOrchestration|branches"
msgstr "ramuri"
-msgid "SecurityOrchestration|members of groups"
-msgstr "membri ai grupurilor"
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr "membri ai grupurilor cu id-urile"
-
-msgid "SecurityOrchestration|members of the group"
-msgstr "membri ai grupului"
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr "membri ai grupului cu id-ul"
-
msgid "SecurityOrchestration|scanner finds"
-msgstr "scanerul găsește"
+msgstr "scaner găsește"
msgid "SecurityOrchestration|scanners find"
msgstr "scanerele găsesc"
@@ -34450,12 +35023,6 @@ msgstr "scanerele găsesc"
msgid "SecurityOrchestration|the %{branches}"
msgstr "%{branches}"
-msgid "SecurityOrchestration|user with id"
-msgstr "utilizator cu ID-ul"
-
-msgid "SecurityOrchestration|users with ids"
-msgstr "utilizatorii cu ID-urile"
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr "vulnerabilități"
@@ -34475,16 +35042,16 @@ msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
msgstr "%{firstProject}, %{secondProject}, și %{rest}"
msgid "SecurityReports|Add or remove projects to monitor in the security area. Projects included in this list will have their results displayed in the security dashboard and vulnerability report."
-msgstr "Adăugați sau eliminați proiecte de monitorizat în zona de securitate. Proiectele incluse în această listă vor avea rezultatele lor afișate în dashboard-ul de securitate și în raportul de vulnerabilitate."
+msgstr "Adăugați sau eliminați proiecte de monitorizat în zona de securitate. Proiectele incluse în această listă vor avea rezultatele lor afișate în tabloul de bord de securitate și în raportul de vulnerabilitate."
msgid "SecurityReports|Add projects"
-msgstr "Adăugați proiecte"
+msgstr "Adăugare proiecte"
msgid "SecurityReports|All activity"
msgstr "Toată activitatea"
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 "Deși este rar să nu existe vulnerabilități, acest lucru se poate întâmpla. Verificați setările pentru a vă asigura că v-ați configurat corect dashboard-ul."
+msgstr "Deși este rar să nu existe vulnerabilități, acest lucru se poate întâmpla. Verificați setările pentru a vă asigura că v-ați configurat corect tabloul de bord."
msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
msgstr "La GitLab, totul se bazează pe iterație și feedback. De aceea, ne adresăm clienților ca dvs. pentru a ne ajuta să ne ghidăm la ceea ce vom lucra în acest an pentru Managementul vulnerabilităților. Avem o mulțime de idei interesante și vă rugăm să ne ajutați răspunzând la un scurt sondaj %{boldStart}care nu durează mai mult de 10 minute%{boldEnd} pentru a evalua câteva dintre caracteristicile noastre potențiale."
@@ -34495,6 +35062,9 @@ msgstr "Schimbați starea"
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr "Verificați mesajele generate pe parcursul analizei următoarelor rapoarte de securitate, deoarece acestea pot împiedica GitLab să incorporeze rezultatele. Asigurați-vă că raportul de securitate este conform cu o %{helpPageLinkStart}schemă JSON%{helpPageLinkEnd} acceptată."
+msgid "SecurityReports|Cluster"
+msgstr "Cluster"
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Comentariu adăugat la „%{vulnerabilityName}â€"
@@ -34535,13 +35105,13 @@ msgid "SecurityReports|Download scanned URLs"
msgstr "Descărcați URL-urile scanate"
msgid "SecurityReports|Either you don't have permission to view this dashboard or the dashboard has not been setup. Please check your permission settings with your administrator or check your dashboard configurations to proceed."
-msgstr "Fie că nu aveți permisiunea de a vizualiza acest tablou de bord, fie tabloul de bord nu a fost configurat. Vă rugăm să verificați setările de permisiune cu administratorul sau verificați configurațiile tabloului de bord pentru a continua."
+msgstr "Fie că nu aveți permisiunea de a vizualiza acest tablou de bord, fie tabloul de bord nu a fost configurat. Vă rugăm să verificați setările de permisiune cu administratorul dvs. sau verificați configurațiile tabloului de bord pentru a continua."
msgid "SecurityReports|Ensure that %{trackingStart}issue tracking%{trackingEnd} is enabled for this project and you have %{permissionsStart}permission to create new issues%{permissionsEnd}."
msgstr "Asigurați-vă că %{trackingStart}urmărirea problemelor%{trackingEnd} este activată pentru acest proiect și că aveți %{permissionsStart}permisiunea de a crea probleme noi%{permissionsEnd}."
msgid "SecurityReports|Error fetching the vulnerabilities over time. Please check your network connection and try again."
-msgstr ""
+msgstr "Eroare de preluare a vulnerabilităților în timp. Vă rugăm să verificați conexiunea de rețea și să încercați din nou."
msgid "SecurityReports|Error fetching the vulnerability counts. Please check your network connection and try again."
msgstr "Eroare la preluarea numărului de vulnerabilități. Vă rugăm să verificați conexiunea la rețea și să încercați din nou."
@@ -34628,13 +35198,13 @@ msgid "SecurityReports|Report has expired"
msgstr "Raportul a expirat"
msgid "SecurityReports|Results show vulnerabilities introduced by the merge request, in addition to existing vulnerabilities from the latest successful pipeline in your project's default branch."
-msgstr ""
+msgstr "Rezultatele arată vulnerabilitățile introduse de merge request, în plus față de vulnerabilitățile existente din ultimul pipeline de succes din ramura implicită a proiectului dumneavoastră."
msgid "SecurityReports|Scan details"
msgstr "Detalii de scanare"
msgid "SecurityReports|Security Dashboard"
-msgstr "Dashboard de securitate"
+msgstr "Tablou de bord de securitate"
msgid "SecurityReports|Security reports can only be accessed by authorized users."
msgstr "Rapoartele de securitate pot fi accesate numai de către utilizatorii autorizați."
@@ -34655,7 +35225,7 @@ msgid "SecurityReports|Severity"
msgstr "Severitate"
msgid "SecurityReports|Show %{pageSize} items"
-msgstr "Afișează %{pageSize} (de) articole"
+msgstr "Afișați %{pageSize} (de) articole"
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
msgstr "Uneori, un scaner nu poate determina severitatea unei descoperiri. Aceste constatări pot fi totuși o sursă potențială de risc. Vă rugăm să le examinați manual."
@@ -34720,20 +35290,17 @@ msgstr "Instrument"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr "Nu se poate adăuga %{invalidProjectsMessage}: %{errorMessage}"
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr "Nu se poate adăuga %{invalidProjects}"
-
msgid "SecurityReports|Undo dismiss"
msgstr "Anulați respingerea"
msgid "SecurityReports|Upgrade to interact, track and shift left with vulnerability management features in the UI."
-msgstr "Actualizați pentru a interacționa, a urmări și a începe funcțiile de gestionare a vulnerabilității odată cu dezvoltarea în interfața utilizatorului."
+msgstr "Actualizați pentru a interacționa, a urmări și a începe din timp testele cu funcțiile de management al vulnerabilității în interfața utilizatorului."
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr "Actualizați pentru a gestiona vulnerabilitățile"
msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr "Sondaj privind funcțiile de gestionare a vulnerabilității"
+msgstr "Sondaj privind funcția de Gestionare a vulnerabilităților"
msgid "SecurityReports|Vulnerability Report"
msgstr "Raport de vulnerabilitate"
@@ -34766,40 +35333,46 @@ msgid "SecurityTraining|Training from this partner takes precedence when more th
msgstr "Formarea de la acest partener are prioritate atunci când sunt activați mai mulți parteneri de formare."
msgid "See example DevOps Score page in our documentation."
-msgstr ""
+msgstr "Consultați pagina de exemple Scor DevOps din documentația noastră."
msgid "See metrics"
-msgstr ""
+msgstr "Consultați metricile"
msgid "See our website for help"
-msgstr "Vizitați site-ul nostru pentru ajutor"
+msgstr "Consultați site-ul nostru pentru ajutor"
msgid "See the affected projects in the GitLab admin panel"
msgstr "Vedeți proiectele afectate în panoul de administrare GitLab"
msgid "See vulnerability %{vulnerability_link} for any Remediation details."
-msgstr ""
+msgstr "Consultați vulnerabilitatea %{vulnerability_link} pentru orice detalii de remediere."
msgid "See vulnerability %{vulnerability_link} for any Solution details."
-msgstr ""
+msgstr "Consultați vulnerabilitatea %{vulnerability_link} pentru orice detalii privind soluția."
msgid "Select"
-msgstr ""
+msgstr "Selectați"
msgid "Select Archive Format"
-msgstr ""
+msgstr "Selectați formatul arhivei"
msgid "Select Git revision"
-msgstr ""
+msgstr "Selectați revizuirea Git"
msgid "Select Page"
-msgstr ""
+msgstr "Selectați pagina"
msgid "Select Profile"
-msgstr ""
+msgstr "Selectați profilul"
msgid "Select a branch"
-msgstr ""
+msgstr "Selectați o ramură"
+
+msgid "Select a branch to compare"
+msgstr "Selectați o ramură pentru a compara"
+
+msgid "Select a color"
+msgstr "Selectați o culoare"
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr "Selectați un framework de conformitate care să se aplice acestui proiect. %{linkStart}Cum se adaugă acestea?%{linkEnd}"
@@ -34808,28 +35381,28 @@ msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll
msgstr "Selectați un fișier din bara laterală din stânga pentru a începe editarea. Ulterior, veți putea să comiteți modificările."
msgid "Select a label"
-msgstr ""
+msgstr "Selectați o etichetă"
msgid "Select a milestone"
-msgstr ""
+msgstr "Selectați un obiectiv"
msgid "Select a new namespace"
msgstr "Selectați un nou spațiu de nume"
msgid "Select a project"
-msgstr ""
+msgstr "Selectați un proiect"
msgid "Select a reason"
-msgstr ""
+msgstr "Selectați un motiv"
msgid "Select a repository containing templates for common files."
msgstr "Selectați un repozitoriu care conține șabloane pentru fișiere comune."
msgid "Select a role"
-msgstr ""
+msgstr "Selectați un rol"
msgid "Select a template repository"
-msgstr ""
+msgstr "Selectați un repozitoriu de șabloane"
msgid "Select a template type"
msgstr "Selectați un tip de șablon"
@@ -34838,25 +35411,25 @@ msgid "Select a time zone"
msgstr "Selectați un fus orar"
msgid "Select a timezone"
-msgstr ""
+msgstr "Selectați un fus orar"
msgid "Select all"
-msgstr ""
+msgstr "Selectați tot"
msgid "Select an assignee"
-msgstr ""
+msgstr "Selectați un responsabil"
msgid "Select an iteration"
-msgstr ""
+msgstr "Selectați o iterație"
msgid "Select assignee"
-msgstr ""
+msgstr "Selectați responsabilul"
msgid "Select assignee(s)"
msgstr "Selectați responsabilul"
msgid "Select branch"
-msgstr ""
+msgstr "Selectați ramura"
msgid "Select branches"
msgstr "Selectați ramura"
@@ -34865,37 +35438,37 @@ msgid "Select due date"
msgstr "Selectați data scadentă"
msgid "Select epic"
-msgstr ""
+msgstr "Selectați epica"
msgid "Select group"
-msgstr "Selectați grup"
+msgstr "Selectați grupul"
msgid "Select group or project"
-msgstr ""
+msgstr "Selectați grupul sau proiectul"
msgid "Select health status"
-msgstr ""
+msgstr "Selectați starea de sănătate"
msgid "Select iteration"
-msgstr ""
+msgstr "Selectați iterația"
msgid "Select label"
-msgstr ""
+msgstr "Selectați eticheta"
msgid "Select labels"
-msgstr ""
+msgstr "Selectați etichetele"
msgid "Select merge moment"
-msgstr ""
+msgstr "Selectați momentul îmbinării"
msgid "Select milestone"
-msgstr ""
+msgstr "Selectați obiectivul"
msgid "Select private project"
-msgstr ""
+msgstr "Selectați proiectul privat"
msgid "Select project"
-msgstr ""
+msgstr "Selectați proiectul"
msgid "Select project to create %{type}"
msgstr "Selectați proiectul pentru a crea %{type}"
@@ -34904,64 +35477,70 @@ msgid "Select project to create issue"
msgstr "Selectați proiectul pentru a crea problema"
msgid "Select projects"
-msgstr ""
+msgstr "Selectați proiecte"
msgid "Select reviewer(s)"
-msgstr ""
+msgstr "Selectare recenzent(i)"
msgid "Select source"
-msgstr ""
+msgstr "Selectați sursa"
msgid "Select source branch"
-msgstr ""
+msgstr "Selectați ramura sursă"
+
+msgid "Select source project"
+msgstr "Selectați proiectul sursă"
msgid "Select start date"
-msgstr ""
+msgstr "Selectați data de început"
msgid "Select status"
-msgstr ""
+msgstr "Selectați starea"
msgid "Select strategy activation method"
-msgstr ""
+msgstr "Selectați metoda de activare a strategiei"
msgid "Select subgroup"
-msgstr "Selectați subgrup"
+msgstr "Selectați subgrupul"
msgid "Select subscription"
-msgstr ""
+msgstr "Selectați abonamentul"
msgid "Select target branch"
-msgstr ""
+msgstr "Selectați ramura țintă"
msgid "Select target branch or tag"
msgstr "Selectați ramura sau eticheta țintă"
+msgid "Select target project"
+msgstr "Selectați proiectul țintă"
+
msgid "Select timezone"
-msgstr ""
+msgstr "Selectați fusul orar"
msgid "Select type"
msgstr "Selectați tipul"
msgid "Selected"
-msgstr ""
+msgstr "Selectat"
msgid "Selected commits"
-msgstr ""
+msgstr "Commit-uri selectate"
msgid "Selected for all items."
-msgstr ""
+msgstr "Selectat pentru toate articolele."
msgid "Selected for some items."
-msgstr ""
+msgstr "Selectat pentru unele articole."
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 "Nivelurile selectate nu pot fi utilizate de utilizatorii care nu sunt administratori pentru grupuri, proiecte sau fragmente de cod. Dacă nivelul public este restricționat, profilurile utilizatorilor sunt vizibile numai pentru utilizatorii conectați."
msgid "Selected projects"
-msgstr ""
+msgstr "Proiecte selectate"
msgid "Selected tag is already in use. Choose another option."
-msgstr ""
+msgstr "Eticheta selectată este deja în uz. Alegeți o altă opțiune."
msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By %{link_open}@johnsmith%{link_close}\"). It will also associate and/or assign these issues and comments with the selected user."
msgstr "Selectarea unui utilizator GitLab va adăuga un link către utilizatorul GitLab în descrierile problemelor È™i comentariilor (de exemplu, „de %{link_open}@johnsmith%{link_close}â€). De asemenea, va asocia È™i/sau atribui aceste probleme È™i comentarii cu creatorul proiectului."
@@ -35006,22 +35585,22 @@ msgid "SelfMonitoring|Self monitoring project successfully deleted."
msgstr "Proiectul de automonitorizare a fost șters cu succes."
msgid "Send"
-msgstr ""
+msgstr "Trimite"
msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr "Trimiteți o singură notificare prin e-mail proprietarilor și întreținătorilor pentru noi alerte."
msgid "Send confirmation email"
-msgstr ""
+msgstr "Trimiteți un e-mail de confirmare"
msgid "Send email"
-msgstr ""
+msgstr "Trimiteți un e-mail"
msgid "Send email in multipart format (HTML and plain text). Uncheck to send email messages in plain text only."
msgstr "Trimiteți e-mailuri în format multipart (HTML și text simplu). Debifați pentru a trimite mesajele de e-mail numai în format text simplu."
msgid "Send email notification"
-msgstr ""
+msgstr "Trimiteți o notificare prin e-mail"
msgid "Send emails to help guide new users through the onboarding process."
msgstr "Trimiteți e-mailuri pentru a ajuta la ghidarea noilor utilizatori prin procesul de onboarding."
@@ -35030,22 +35609,22 @@ msgid "Send emails to users upon account deactivation."
msgstr "Trimiteți e-mailuri utilizatorilor la dezactivarea contului."
msgid "Send message"
-msgstr ""
+msgstr "Trimiteți un mesaj"
msgid "Send notifications about project events to Mattermost channels."
-msgstr ""
+msgstr "Trimiteți notificări despre evenimentele proiectului către canalele Mattermost."
msgid "Send notifications about project events to Mattermost channels. %{docs_link}"
-msgstr ""
+msgstr "Trimiteți notificări despre evenimentele proiectului către canalele Mattermost. %{docs_link}"
msgid "Send notifications about project events to a Discord channel. %{docs_link}"
-msgstr ""
+msgstr "Trimiteți notificări despre evenimentele proiectului către un canal Discord. %{docs_link}"
msgid "Send report"
-msgstr ""
+msgstr "Trimiteți un raport"
msgid "Send service data"
-msgstr ""
+msgstr "Trimiteți date de serviciu"
msgid "Sentry"
msgstr "Sentry"
@@ -35054,16 +35633,16 @@ msgid "Sentry API URL"
msgstr "URL-ul API-ului Sentry"
msgid "Sentry event"
-msgstr ""
+msgstr "Evenimentul Sentry"
msgid "Sep"
-msgstr ""
+msgstr "Sep"
msgid "September"
-msgstr ""
+msgstr "Septembrie"
msgid "SeriesFinalConjunction|and"
-msgstr ""
+msgstr "și"
msgid "Serve repository static objects (for example, archives and blobs) from external storage."
msgstr "Servește obiecte statice de repozitoriu (cum ar fi arhivele și blob-urile) din stocarea externă."
@@ -35072,13 +35651,13 @@ msgid "Server (optional)"
msgstr "Server (opțional)"
msgid "Server supports batch API only, please update your Git LFS client to version 1.0.1 and up."
-msgstr ""
+msgstr "Serverul suportă doar API-ul pe loturi, vă rugăm să vă actualizați clientul Git LFS la versiunea 1.0.1 și mai sus."
msgid "Server version"
-msgstr ""
+msgstr "Versiunea serverului"
msgid "Service"
-msgstr ""
+msgstr "Serviciu"
msgid "Service Account"
msgstr "Contul de servicii"
@@ -35087,13 +35666,13 @@ msgid "Service Account Key"
msgstr "Cheia contului de servicii"
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
-msgstr ""
+msgstr "Cheile conturilor de servicii autorizează GitLab să implementeze proiectul dvs. Google Cloud"
msgid "Service Desk"
msgstr "Service Desk"
msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
-msgstr "Service Desk permite oamenilor să creeze probleme în instanța dvs. GitLab fără propriul lor cont de utilizator. Acesta oferă o adresă de e-mail unică pentru ca utilizatorii finali să creeze probleme într-un proiect. Răspunsurile pot fi trimise fie prin interfața GitLab, fie prin e-mail. Utilizatorii finali văd discuțiile doar prin e-mail."
+msgstr "Service Desk permite oamenilor să creeze probleme în instanța d-voastră GitLab fără propriul lor cont de utilizator. Acesta oferă o adresă de e-mail unică pentru ca utilizatorii finali să creeze probleme într-un proiect. Răspunsurile pot fi trimise fie prin interfața GitLab, fie prin e-mail. Utilizatorii finali văd discuțiile doar prin e-mail."
msgid "Service Ping payload not found in the application cache"
msgstr "Payload-ul serviciului Ping nu a fost găsit în cache-ul aplicației"
@@ -35102,7 +35681,7 @@ msgid "Service account generated successfully"
msgstr "Cont de serviciu generat cu succes"
msgid "Service accounts"
-msgstr ""
+msgstr "Conturi de servicii"
msgid "Service usage data"
msgstr "Date de utilizare a serviciilor"
@@ -35147,29 +35726,26 @@ msgid "Services"
msgstr "Servicii"
msgid "Session ID"
-msgstr ""
+msgstr "ID-ul sesiunii"
msgid "Session duration (minutes)"
msgstr "Durata sesiunii (minute)"
msgid "Set %{epic_ref} as the parent epic."
-msgstr ""
+msgstr "Setați %{epic_ref} ca epică părinte."
msgid "Set a default description template to be used for new issues. %{link_start}What are description templates?%{link_end}"
-msgstr ""
+msgstr "Setați un șablon de descriere implicit pentru a fi utilizat pentru noi probleme. %{link_start}Ce sunt șabloanele de descriere?%{link_end}"
msgid "Set a password on your account to pull or push via %{protocol}."
-msgstr ""
+msgstr "Setați o parolă în contul dvs. pentru a face pull sau push prin %{protocol}."
msgid "Set access permissions for this token."
-msgstr ""
+msgstr "Setați permisiunile de acces pentru acest token."
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr "Setați orice limită de rată la %{code_open}0%{code_close} pentru a dezactiva limita."
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr "Setați data scadentă"
@@ -35180,22 +35756,22 @@ msgid "Set health status to %{health_status}."
msgstr "Setați starea de sănătate la %{health_status}."
msgid "Set iteration"
-msgstr ""
+msgstr "Setați iterația"
msgid "Set limit to 0 to allow any file size."
-msgstr ""
+msgstr "Setați limita la 0 pentru a permite orice dimensiune a fișierului."
msgid "Set limits for web and API requests."
msgstr "Setați limite pentru solicitările web și API."
msgid "Set milestone"
-msgstr ""
+msgstr "Setare obiectiv"
msgid "Set new password"
-msgstr ""
+msgstr "Setați o nouă parolă"
msgid "Set parent epic to an epic"
-msgstr ""
+msgstr "Setați epica părinte la un epic"
msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr "Setați limite de rate pe utilizator pentru importurile și exporturile de proiecte și grupuri."
@@ -35210,19 +35786,22 @@ msgid "Set rate limits for searches performed by web or API requests."
msgstr "Setați limitele ratei căutărilor efectuate prin solicitări web sau API."
msgid "Set severity"
-msgstr ""
+msgstr "Setați severitatea"
msgid "Set sign-in restrictions for all users."
-msgstr ""
+msgstr "Setați restricții de autentificare pentru toți utilizatorii."
msgid "Set size limits for displaying diffs in the browser."
-msgstr ""
+msgstr "Setați limitele de mărime pentru afișarea diff-urilor în browser."
msgid "Set target branch"
-msgstr ""
+msgstr "Setați ramura țintă"
msgid "Set target branch to %{branch_name}."
-msgstr ""
+msgstr "Setați ramura țintă la %{branch_name}."
+
+msgid "Set the Ready status"
+msgstr "Setați starea Gata"
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr "Setați ramura implicită pentru acest proiect. Toate merge request-urile și editările sunt efectuate către această ramură, cu excepția cazului în care specificați o ramură diferită."
@@ -35234,7 +35813,7 @@ msgid "Set the due date to %{due_date}."
msgstr "Setați data scadenței la %{due_date}."
msgid "Set the iteration to %{iteration_reference}."
-msgstr ""
+msgstr "Setați iterația la %{iteration_reference}."
msgid "Set the maximum number of slices allowed to run concurrently during Elasticsearch reindexing. Learn more about %{max_slices_running_link_start}maximum running slices configuration%{max_slices_link_end}."
msgstr "Setați numărul maxim de segmente care pot fi rulate simultan în timpul reindexării Elasticsearch. Aflați mai multe despre %{max_slices_running_link_start}configurarea numărului maxim de segmente care rulează%{max_slices_link_end}."
@@ -35243,10 +35822,10 @@ msgid "Set the maximum session time for a web terminal."
msgstr "Setați durata maximă a sesiunii pentru un terminal web."
msgid "Set the milestone to %{milestone_reference}."
-msgstr ""
+msgstr "Setați obiectivul la %{milestone_reference}"
msgid "Set the per-user rate limit for getting a user by ID via the API."
-msgstr ""
+msgstr "Setați limita ratei pe utilizator pentru obținerea unui utilizator după ID prin intermediul API-ului."
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr "Setați limita ratei pe utilizator pentru notele create prin solicitări web sau API."
@@ -35255,43 +35834,46 @@ msgid "Set this number to 0 to disable the limit."
msgstr "Setați acest număr la 0 pentru a dezactiva limita."
msgid "Set time estimate"
-msgstr ""
+msgstr "Setați o estimare de timp"
msgid "Set time estimate to %{time_estimate}."
-msgstr ""
+msgstr "Setați estimarea de timp la %{time_estimate}."
msgid "Set to 0 for no size limit."
-msgstr ""
+msgstr "Setați la 0 pentru nicio limită de mărime."
msgid "Set up CI/CD"
-msgstr ""
+msgstr "Configurați CI/CD"
msgid "Set up Jira Integration"
-msgstr ""
+msgstr "Configurați integrarea Jira"
msgid "Set up a %{type} runner for a project"
msgstr "Configurați un executor %{type} pentru un proiect"
msgid "Set up a hardware device as a second factor to sign in."
-msgstr ""
+msgstr "Configurați un dispozitiv hardware ca al doilea factor de autentificare."
msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
msgstr "Configurați aserțiunile/atributele/reclamațiile (email, first_name, last_name) și NameID în conformitate cu %{docsLinkStart}documentația %{icon}%{docsLinkEnd}"
msgid "Set up new device"
-msgstr ""
+msgstr "Configurați un dispozitiv nou"
msgid "Set up new password"
-msgstr ""
+msgstr "Configurați o nouă parolă"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Configurați-vă proiectul pentru push și/sau pull automat către/de la un alt repozitoriu. Ramurile, etichetele și commit-urile vor fi sincronizate automat."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr "Setați greutatea"
msgid "Set weight to %{weight}."
-msgstr "Setați greutatea la %{weight}."
+msgstr "Setați greutate la %{weight}."
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "Un indicator apare lângă numele și avatarul dumneavoastră"
@@ -35330,37 +35912,37 @@ msgid "SetStatusModal|Your status resets on %{date}."
msgstr "Starea dvs. se resetează la %{date}."
msgid "Sets %{epic_ref} as parent epic."
-msgstr ""
+msgstr "Setați %{epic_ref} ca epică părinte."
msgid "Sets health status to %{health_status}."
msgstr "Setează starea de sănătate la %{health_status}."
msgid "Sets target branch to %{branch_name}."
-msgstr ""
+msgstr "Setează ramura țintă la %{branch_name}."
msgid "Sets the due date to %{due_date}."
msgstr "Setează data scadenței la %{due_date}."
msgid "Sets the iteration to %{iteration_reference}."
-msgstr ""
+msgstr "Setează iterația la %{iteration_reference}."
msgid "Sets the milestone to %{milestone_reference}."
-msgstr ""
+msgstr "Setează obiectivul la %{milestone_reference}."
msgid "Sets the severity"
-msgstr ""
+msgstr "Setează severitatea"
msgid "Sets time estimate to %{time_estimate}."
-msgstr ""
+msgstr "Setează estimarea de timp la %{time_estimate}."
msgid "Sets weight to %{weight}."
msgstr "Setează greutatea la %{weight}."
msgid "Setting"
-msgstr ""
+msgstr "Setare"
msgid "Setting enforced"
-msgstr ""
+msgstr "Setare impusă"
msgid "Setting saved successfully"
msgid_plural "Settings saved successfully"
@@ -35369,40 +35951,40 @@ msgstr[1] "Setările au fost salvate cu succes"
msgstr[2] "Setările au fost salvate cu succes"
msgid "Settings"
-msgstr ""
+msgstr "Setări"
msgid "Settings|Unable to load the merge request options settings. Try reloading the page."
msgstr "Nu se pot încărca setările opțiunilor merge request-urilor. Încercați să reîncărcați pagina."
msgid "Setup"
-msgstr ""
+msgstr "Configurare"
msgid "Severity"
-msgstr ""
+msgstr "Severitate"
msgid "Severity updated to %{severity}."
-msgstr ""
+msgstr "Severitate actualizată la %{severity}."
msgid "SeverityWidget|Severity"
-msgstr ""
+msgstr "Severitate"
msgid "SeverityWidget|Severity: %{severity}"
-msgstr ""
+msgstr "Severitate: %{severity}"
msgid "SeverityWidget|There was an error while updating severity."
msgstr "A apărut o eroare la actualizarea severității."
msgid "Share"
-msgstr ""
+msgstr "Partajați"
msgid "Share the %{strong_open}GitLab single sign-on URL%{strong_close} with members so they can sign in to your group through your identity provider"
-msgstr ""
+msgstr "Partajați %{strong_open}URL-ul de autentificare unică GitLab%{strong_close} cu membrii, astfel încât aceștia să se poată autentifica în grupul dvs. prin intermediul furnizorului dvs. de identitate"
msgid "Shared Runners"
msgstr "Executori partajați"
msgid "Shared projects"
-msgstr ""
+msgstr "Proiecte partajate"
msgid "Shared runners"
msgstr "Executori partajați"
@@ -35432,34 +36014,34 @@ msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
msgstr "Resetarea minutelor de pipeline folosite"
msgid "Shimo|Go to Shimo Workspace"
-msgstr ""
+msgstr "Mergeți la spațiul de lucru Shimo"
msgid "Shimo|Link to a Shimo Workspace from the sidebar."
-msgstr ""
+msgstr "Link către un spațiu de lucru Shimo din bara laterală."
msgid "Shimo|Shimo"
-msgstr ""
+msgstr "Shimo"
msgid "Shimo|Shimo Workspace"
-msgstr ""
+msgstr "Spațiul de lucru Shimo"
msgid "Shimo|Shimo Workspace URL"
-msgstr ""
+msgstr "URL-ul spațiului de lucru Shimo"
msgid "Shimo|Shimo Workspace integration is enabled"
-msgstr ""
+msgstr "Integrarea spațiului de lucru Shimo este activată"
msgid "Shimo|You've enabled the Shimo Workspace integration. You can view your wiki directly in Shimo."
-msgstr ""
+msgstr "Ați activat integrarea spațiului de lucru Shimo. Vă puteți vizualiza wiki-ul direct în Shimo."
msgid "Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{boldStart}will%{boldEnd} lose access to your account."
-msgstr ""
+msgstr "În cazul în care vă pierdeți vreodată telefonul sau accesul la parola secretă unică, fiecare dintre aceste coduri de recuperare poate fi folosit o singură dată pentru a vă recăpăta accesul la cont. Vă rugăm să le păstrați într-un loc sigur, altfel %{boldStart}vă%{boldEnd} pierdeți accesul la contul dumneavoastră."
msgid "Show Pipeline ID"
-msgstr ""
+msgstr "Afișați ID-ul pipeline-ului"
msgid "Show Pipeline IID"
-msgstr ""
+msgstr "Afișați IID-ul pipeline-ului"
msgid "Show all %{issuable_type}."
msgstr "Afișați toate %{issuable_type}."
@@ -35471,13 +36053,13 @@ msgid "Show all breadcrumbs"
msgstr "Afișați toate breadcrumb-urile"
msgid "Show all epics"
-msgstr ""
+msgstr "Afișați toate epicele"
msgid "Show all issues."
-msgstr ""
+msgstr "Afișați toate problemele."
msgid "Show all milestones"
-msgstr ""
+msgstr "Afișați toate obiectivele"
msgid "Show all test cases."
msgstr "Afișați toate cazurile de testare."
@@ -35486,64 +36068,64 @@ msgid "Show archived projects"
msgstr "Afișați proiectele arhivate"
msgid "Show archived projects only"
-msgstr "Arătați numai proiectele arhivate"
+msgstr "Afișați numai proiectele arhivate"
msgid "Show closed epics"
-msgstr ""
+msgstr "Afișați epicele închise"
msgid "Show command"
-msgstr ""
+msgstr "Afișați comanda"
msgid "Show comments"
-msgstr ""
+msgstr "Afișați comentarii"
msgid "Show comments on this file"
-msgstr ""
+msgstr "Afișați comentarii la acest fișier"
msgid "Show comments only"
-msgstr ""
+msgstr "Afișați numai comentariile"
msgid "Show complete raw log"
-msgstr ""
+msgstr "Afișați jurnalul brut complet"
msgid "Show details"
-msgstr ""
+msgstr "Afișați detaliile"
msgid "Show file browser"
-msgstr ""
+msgstr "Afișați browserul de fișiere"
msgid "Show file contents"
-msgstr ""
+msgstr "Afișați conținutul fișierului"
msgid "Show group milestones"
-msgstr ""
+msgstr "Afișați obiectivele grupului"
msgid "Show labels"
-msgstr ""
+msgstr "Afișați etichete"
msgid "Show latest version"
-msgstr ""
+msgstr "Afișați ultima versiune"
msgid "Show list"
-msgstr ""
+msgstr "Afișați lista"
msgid "Show one file at a time"
msgstr "Afișați câte un fișier odată"
msgid "Show open epics"
-msgstr ""
+msgstr "Afișați epicele deschise"
msgid "Show project milestones"
-msgstr ""
+msgstr "Afișați obiectivele proiectului"
msgid "Show sub-group milestones"
-msgstr ""
+msgstr "Afișați obiectivele subgrupurilor"
msgid "Show the Closed list"
-msgstr ""
+msgstr "Afișați lista Închise"
msgid "Show the Open list"
-msgstr ""
+msgstr "Afișați lista Deschise"
msgid "Show thread"
msgstr "Afișare subiecte"
@@ -35551,146 +36133,203 @@ msgstr "Afișare subiecte"
msgid "Show whitespace changes"
msgstr "Afișați modificările spațiilor albe"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr "Accesați o zonă dedicată pentru managementul vulnerabilității. Aceasta include un tablou de bord de securitate, un raport de vulnerabilitate și setări."
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr "Auditați aplicația dvs. bazată pe Docker. Scanați pentru vulnerabilități cunoscute în imaginile Docker unde este livrat codul."
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr "Scanarea containerelor"
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr "Scanarea dependențelor"
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr "Testarea dinamică a securității aplicațiilor (DAST)"
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr "Examinați în mod dinamic aplicația dvs. pentru vulnerabilități în mediile implementate."
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr "Activați SAST"
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr "Activați detectarea secretelor"
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr "Activați testarea statică a securității aplicațiilor (SAST)"
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr "Aflați dacă bibliotecile dvs. externe sunt sigure. Rulați joburi de scanare a dependențelor care verifică vulnerabilitățile cunoscute în bibliotecile dvs. externe."
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr "Identificați acum vulnerabilitățile din codul dumneavoastră"
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr "Scanați-vă codul pentru a detecta secretele comise neintenționat, cum ar fi cheile, parolele și tokenurile API."
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr "Scanați-vă codul sursă folosind GitLab CI/CD și descoperiți vulnerabilitățile înainte de implementare."
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr "Începeți o perioadă de încercare Ultimate gratuită de 30 de zile sau faceți upgrade instanței dvs. pentru a avea acces la funcțiile de securitate și conformitate la nivelul întregii organizații. Vedeți și celelalte funcții ale planului Ultimate."
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr "Începeți o încercare gratuită"
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr "Aduceți securitatea la nivelul următor"
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr "Faceți upgrade acum"
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr "Folosiți GitLab CI/CD pentru a analiza codul sursă pentru vulnerabilități cunoscute. Comparați vulnerabilitățile găsite între ramurile dvs. sursă și țintă."
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr "Managementul vulnerabilității"
+
msgid "Showing %{conflict}"
-msgstr ""
+msgstr "Se afișează %{conflict}"
msgid "Showing %{count} of %{total} projects"
-msgstr ""
+msgstr "Se afișează %{count} din %{total} proiecte"
msgid "Showing %{count} project"
msgid_plural "Showing %{count} projects"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Se afișează %{count} proiect"
+msgstr[1] "Se afișează %{count} proiecte"
+msgstr[2] "Se afișează %{count} de proiecte"
msgid "Showing %{limit} of %{total_count} issues. "
-msgstr ""
+msgstr "Se afișează %{limit} din %{total_count} (de) probleme. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
-msgstr ""
+msgstr "Se afișează %{pageSize} din %{total} %{issuableType}"
msgid "Showing all epics"
-msgstr ""
+msgstr "Afișarea tuturor epicelor"
msgid "Showing all issues"
-msgstr ""
-
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr "Se afișează datele pentru grupul „%{group_name}†de la 1 noiembrie 2019 la 31 decembrie 2019"
+msgstr "Afișarea tuturor problemelor"
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
-msgstr "Afișarea datelor pentru elementele fluxului de lucru create în acest interval de date. Interval de date limitat la %{maxDateRange} de zile."
+msgstr "Afișarea datelor pentru elementele fluxului de lucru create în acest interval de date. Interval de date limitat la %{maxDateRange} (de) zile."
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr "Afișarea graficelor bazate pe evenimentele din ultimele %{timerange} zile."
msgid "Showing last %{size} of log -"
-msgstr ""
+msgstr "Se afișează ultimii %{size} de jurnal -"
msgid "Showing latest version"
-msgstr ""
+msgstr "Se afișează cea mai recentă versiune"
msgid "Showing version #%{versionNumber}"
-msgstr ""
+msgstr "Se afișează versiunea #%{versionNumber}"
+
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr "Afișează problemele și %{labels_count} (de) etichete pentru grupul „%{group_name}†de la 1 noiembrie 2019 până la 31 decembrie 2019"
msgid "Side-by-side"
-msgstr ""
+msgstr "Alăturat"
msgid "Sidebar|%{name}: %{value}"
-msgstr ""
+msgstr "%{name}: %{value}"
msgid "Sidebar|Assign health status"
-msgstr ""
+msgstr "Atribuirea stării de sănătate"
msgid "Sidebar|Health status"
-msgstr ""
+msgstr "Starea de sănătate"
msgid "Sidebar|No status"
-msgstr ""
+msgstr "Fără statut"
msgid "Sidebar|None"
-msgstr ""
+msgstr "Nimic"
msgid "Sidekiq job compression threshold (bytes)"
-msgstr ""
+msgstr "Pragul de compresie a lucrărilor Sidekiq (octeți)"
msgid "Sidekiq job size limit (bytes)"
msgstr "Limita dimensiunii jobului Sidekiq (octeți)"
msgid "Sidekiq job size limits"
-msgstr ""
+msgstr "Limitele mărimii jobului Sidekiq"
msgid "Sign in"
-msgstr ""
+msgstr "Autentificare"
msgid "Sign in / Register"
-msgstr ""
+msgstr "Conectare / ÃŽnregistrare"
msgid "Sign in as a user with the matching email address, add the email to this account, or sign-up for a new account using the matching email."
msgstr "Conectați-vă ca utilizator cu adresa de e-mail potrivită, adăugați adresa de e-mail la acest cont sau înregistrați-vă pentru un cont nou utilizând adresa de e-mail potrivită."
msgid "Sign in preview"
-msgstr ""
+msgstr "Previzualizare autentificare"
msgid "Sign in to \"%{group_name}\""
-msgstr ""
+msgstr "ConectaÈ›i-vă la „%{group_name}â€"
msgid "Sign in to GitLab"
-msgstr ""
+msgstr "Conectați-vă la GitLab"
msgid "Sign in using smart card"
-msgstr ""
+msgstr "Conectați-vă cu ajutorul cardului inteligent"
msgid "Sign in via 2FA code"
-msgstr ""
+msgstr "Conectați-vă prin codul 2FA"
msgid "Sign in with"
-msgstr ""
+msgstr "Conectați-vă cu"
msgid "Sign in with Single Sign-On"
-msgstr ""
+msgstr "Conectați-vă cu autentificarea unică (SSO)"
msgid "Sign in with smart card"
-msgstr ""
+msgstr "Conectați-vă cu cardul inteligent"
msgid "Sign in/Sign up pages"
-msgstr ""
+msgstr "Paginile de conectare/înscriere"
msgid "Sign out"
-msgstr ""
+msgstr "Deconectare"
msgid "Sign out & Register"
-msgstr ""
+msgstr "Deconectare & ÃŽnregistrare"
msgid "Sign up"
-msgstr ""
+msgstr "Înregistrați-vă"
msgid "Sign up now"
msgstr "Înregistrați-vă acum"
msgid "Sign up was successful! Please confirm your email to sign in."
-msgstr ""
+msgstr "Înscrierea a avut succes! Vă rugăm să vă confirmați adresa de e-mail pentru a vă conecta."
msgid "Sign-in and Help page"
-msgstr ""
+msgstr "Pagina de autentificare și de Ajutor"
msgid "Sign-in count:"
-msgstr ""
+msgstr "Număr de conectări:"
msgid "Sign-in page"
-msgstr ""
+msgstr "Pagina de conectare"
msgid "Sign-in restrictions"
-msgstr ""
+msgstr "Restricții de conectare"
msgid "Sign-in text"
-msgstr ""
+msgstr "Text de conectare"
msgid "Sign-out page URL"
-msgstr ""
+msgstr "URL-ul paginii de deconectare"
msgid "Sign-up restrictions"
-msgstr ""
+msgstr "Restricții de înscriere"
msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted the %{link_start}Terms of Use and Privacy Policy%{link_end}"
msgstr "Făcând clic pe %{button_text}, sunt de acord că am citit și acceptat %{link_start}Termenii de utilizare și Politica de confidențialitate%{link_end}"
@@ -35699,43 +36338,43 @@ msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted
msgstr "Făcând clic pe %{button_text}, sunt de acord că am citit și acceptat Termenii de utilizare și %{link_start}Politica de confidențialitate%{link_end} GitLab"
msgid "SignUp|First name is too long (maximum is %{max_length} characters)."
-msgstr ""
+msgstr "Prenumele este prea lung (maximum este de %{max_length} de caractere)."
msgid "SignUp|Last name is too long (maximum is %{max_length} characters)."
-msgstr ""
+msgstr "Numele de familie este prea lung (maximum este de %{max_length} de caractere)."
msgid "SignUp|Minimum length is %{minimum_password_length} characters."
-msgstr ""
+msgstr "Lungimea minimă este de %{minimum_password_length} caractere."
msgid "SignUp|Username is too long (maximum is %{max_length} characters)."
-msgstr "Numele de utilizator este prea lung (maximum %{max_length} caractere)."
+msgstr "Numele de utilizator este prea lung (maximum este de %{max_length} de caractere)."
msgid "SignUp|Username is too short (minimum is %{min_length} characters)."
-msgstr "Numele de utilizator este prea scurt (minimum %{min_length} caractere)."
+msgstr "Numele de utilizator este prea scurt (minimum este de %{min_length} caractere)."
msgid "Signed in"
-msgstr ""
+msgstr "Conectat"
msgid "Signed in to GitLab"
msgstr "Conectat la GitLab"
msgid "Signed in to GitLab as %{user_link}"
-msgstr ""
+msgstr "Conectat la GitLab ca %{user_link}"
msgid "Signed in with %{authentication} authentication"
-msgstr ""
+msgstr "Conectat cu autentificare %{authentication}"
msgid "Signing in using %{label} has been disabled"
-msgstr ""
+msgstr "Conectarea folosind %{label} a fost dezactivată"
msgid "Signing in using your %{label} account without a pre-existing GitLab account is not allowed."
-msgstr ""
+msgstr "Nu este permisă autentificarea folosind contul %{label} fără un cont GitLab preexistent."
msgid "Similar issues"
-msgstr ""
+msgstr "Probleme similare"
msgid "Simulate a pipeline created for the default branch"
-msgstr ""
+msgstr "Simulați un pipeline creat pentru ramura implicită"
msgid "Site profile failed to delete"
msgstr "Profilul site-ului nu a putut fi șters"
@@ -35747,16 +36386,16 @@ msgid "Sites"
msgstr "Site-uri"
msgid "Size"
-msgstr ""
+msgstr "Mărime"
msgid "Size Limits"
-msgstr ""
+msgstr "Limite de mărime"
msgid "Size limit per repository (MB)"
msgstr "Limita de dimensiune pe depozit (MB)"
msgid "Skip outdated deployment jobs"
-msgstr ""
+msgstr "Săriți peste joburile de implementare învechite"
msgid "Skipped"
msgstr "Sărit"
@@ -35765,7 +36404,7 @@ msgid "Skipped deployment to"
msgstr "A sărit implementarea la"
msgid "Skype:"
-msgstr ""
+msgstr "Skype:"
msgid "Slack application"
msgstr "Aplicația Slack"
@@ -35780,10 +36419,10 @@ msgid "SlackIntegration|Are you sure you want to remove this project from the Sl
msgstr "Sunteți sigur că doriți să înlăturați acest proiect din aplicația Slack?"
msgid "SlackIntegration|Client ID"
-msgstr ""
+msgstr "ID client"
msgid "SlackIntegration|Client secret"
-msgstr ""
+msgstr "Secretul clientului"
msgid "SlackIntegration|GitLab for Slack"
msgstr "GitLab pentru Slack"
@@ -35792,19 +36431,19 @@ msgid "SlackIntegration|GitLab for Slack was successfully installed."
msgstr "GitLab pentru Slack a fost instalat cu succes."
msgid "SlackIntegration|Install Slack app"
-msgstr ""
+msgstr "Instalați aplicația Slack"
msgid "SlackIntegration|Project alias"
msgstr "Aliasul proiectului"
msgid "SlackIntegration|Reinstall Slack app"
-msgstr ""
+msgstr "Reinstalați aplicația Slack"
msgid "SlackIntegration|Remove project"
msgstr "Înlăturați proiectul"
msgid "SlackIntegration|See the list of available commands in Slack after setting up this integration by entering"
-msgstr ""
+msgstr "Consultați lista de comenzi disponibile în Slack după ce ați configurat această integrare, introducând"
msgid "SlackIntegration|Select a GitLab project to link with your Slack workspace."
msgstr "Selectați un proiect GitLab pentru a-l lega cu spațiul de lucru Slack."
@@ -35813,22 +36452,22 @@ msgid "SlackIntegration|Sends notifications about project events to Slack channe
msgstr "Trimite notificări despre evenimentele proiectului către canalele Slack."
msgid "SlackIntegration|Signing secret"
-msgstr ""
+msgstr "Secret de semnare"
msgid "SlackIntegration|Team name"
msgstr "Numele echipei"
msgid "SlackIntegration|This integration allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr ""
+msgstr "Această integrare permite utilizatorilor să efectueze operații comune pe acest proiect prin introducerea de comenzi slash (/) în Slack."
msgid "SlackIntegration|Verification token"
-msgstr ""
+msgstr "Token de verificare"
msgid "SlackIntegration|You can now close this window and go to your Slack workspace."
msgstr "Acum puteți închide această fereastră și puteți merge la spațiul de lucru Slack."
msgid "SlackIntegration|You may need to reinstall the Slack application when we %{linkStart}make updates or change permissions%{linkEnd}."
-msgstr ""
+msgstr "S-ar putea să fie nevoie să reinstalați aplicația Slack atunci când %{linkStart}facem actualizări sau modificăm permisiunile%{linkEnd}."
msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr "1. %{slash_command_link_start}Adăugați o comandă slash%{slash_command_link_end} în echipa Slack folosind aceste informații:"
@@ -35852,10 +36491,10 @@ msgid "Slice multiplier"
msgstr "Multiplicator de tranșe"
msgid "Smartcard"
-msgstr ""
+msgstr "Smartcard"
msgid "Smartcard authentication failed: client certificate header is missing."
-msgstr ""
+msgstr "Autentificarea cu smartcard a eșuat: lipsește antetul certificatului clientului."
msgid "Snippet"
msgstr "Fragment de cod"
@@ -35873,7 +36512,7 @@ msgid "SnippetsEmptyState|Documentation"
msgstr "Documentație"
msgid "SnippetsEmptyState|New snippet"
-msgstr "Fragment de cod nou"
+msgstr "Nou fragment de cod"
msgid "SnippetsEmptyState|No snippets found"
msgstr "Nu au fost găsite fragmente de cod"
@@ -35888,7 +36527,7 @@ msgid "Snippets|%{spammable_titlecase} was submitted to Akismet successfully."
msgstr "%{spammable_titlecase} a fost trimis la Akismet cu succes."
msgid "Snippets|Add another file %{num}/%{total}"
-msgstr "Adăugați alt fișier %{num}/%{total}"
+msgstr "Adăugați un alt fișier %{num}/%{total}"
msgid "Snippets|Delete file"
msgstr "Ștergeți fișierul"
@@ -35909,22 +36548,25 @@ msgid "Snippets|Optionally add a description about what your snippet does or how
msgstr "Adăugați opțional o descriere despre ceea ce face fragmentul dvs. de cod sau despre cum să-l utilizați…"
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
-msgstr ""
+msgstr "Fragmentele de cod nu pot conține fișiere goale. Asigurați-vă că toate fișierele au conținut sau ștergeți-le."
msgid "Snowplow"
msgstr "Snowplow"
+msgid "Solid"
+msgstr "Solid"
+
msgid "Solution"
-msgstr ""
+msgstr "Soluție"
msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
msgstr "Unele acțiuni elimină cererile de atenție, cum ar fi aprobarea unui revizor sau îmbinarea unui merge request de către cineva."
msgid "Some changes are not shown"
-msgstr ""
+msgstr "Unele modificări nu sunt afișate"
msgid "Some child epics may be hidden due to applied filters"
-msgstr ""
+msgstr "Unele epice copil pot fi ascunse din cauza filtrelor aplicate"
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr "Unele domenii comune nu sunt permise. %{learn_more_link}."
@@ -35933,10 +36575,10 @@ msgid "Someone edited the file the same time you did. Please check out %{link_st
msgstr "Cineva a editat fișierul în același timp cu dumneavoastră. Vă rugăm să verificați %{link_start}fișierul %{icon}%{link_end} și să vă asigurați că modificările dvs. nu vor elimina neintenționat modificările lor."
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
+msgstr "Cineva a editat problema în același timp cu dvs. Vă rugăm să verificați %{linkStart}problema%{linkEnd} și să vă asigurați că modificările dvs. nu le vor elimina neintenționat pe ale lor."
msgid "Someone edited this %{issueType} at the same time you did. The description has been updated and you will need to make your changes again."
-msgstr ""
+msgstr "Cineva a editat acest %{issueType} în același timp. Descrierea a fost actualizată și va trebui să faceți modificările din nou."
msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
msgstr "Cineva a editat acest merge request în același timp cu dumneavoastră. Vă rugăm să reîmprospătați pagina pentru a vedea modificările."
@@ -35945,22 +36587,22 @@ msgid "Someone edited this test case at the same time you did. The description h
msgstr "Cineva a editat acest caz de testare în același timp cu dumneavoastră. Descrierea a fost actualizată și va trebui să efectuați din nou modificările."
msgid "Someone, hopefully you, has requested to reset the password for your GitLab account on %{link_to_gitlab}."
-msgstr ""
+msgstr "Cineva, sperăm că dvs., a solicitat resetarea parolei pentru contul dvs. GitLab pe %{link_to_gitlab}."
msgid "Something went wrong"
-msgstr ""
+msgstr "Ceva nu a mers bine"
msgid "Something went wrong on our end"
-msgstr ""
+msgstr "Ceva nu a mers bine la noi."
msgid "Something went wrong on our end."
-msgstr ""
+msgstr "Ceva nu a mers bine la noi."
msgid "Something went wrong on our end. Please try again!"
-msgstr ""
+msgstr "Ceva nu a mers bine la noi. Vă rugăm să încercați din nou!"
msgid "Something went wrong on our end. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine la noi. Vă rugăm să încercați din nou."
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "S-a produs o eroare în timpul încercării de a modifica starea de blocare a acestui %{issuableDisplayName}."
@@ -35972,196 +36614,193 @@ msgid "Something went wrong when reordering designs. Please try again"
msgstr "Ceva nu a mers bine atunci când am reordonat design-urile. Vă rugăm să încercați din nou"
msgid "Something went wrong while adding your award. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine la adăugarea premiului dumneavoastră. Vă rugăm să încercați din nou."
msgid "Something went wrong while applying the batch of suggestions. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine la aplicarea lotului de sugestii. Vă rugăm să încercați din nou."
msgid "Something went wrong while applying the suggestion. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine la aplicarea sugestiei. Vă rugăm să încercați din nou."
msgid "Something went wrong while archiving a requirement."
-msgstr ""
+msgstr "Ceva nu a mers bine la arhivarea unei cerințe."
msgid "Something went wrong while closing the epic. Please try again later."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul închiderii epicei. Vă rugăm să încercați din nou mai târziu."
msgid "Something went wrong while closing the merge request. Please try again later."
-msgstr ""
+msgstr "Ceva nu a mers bine la închiderea merge request-ului. Vă rugăm să încercați din nou mai târziu."
msgid "Something went wrong while creating a requirement."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul creării unei cerințe."
msgid "Something went wrong while deleting description changes. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine la ștergerea modificărilor descrierii. Vă rugăm să încercați din nou."
msgid "Something went wrong while deleting the source branch. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine la ștergerea ramurii sursă. Vă rugăm să încercați din nou."
msgid "Something went wrong while deleting your note. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul ștergerii notei dumneavoastră. Vă rugăm să încercați din nou."
msgid "Something went wrong while deploying this environment. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul implementării acestui mediu. Vă rugăm să încercați din nou."
msgid "Something went wrong while editing your comment. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul editării comentariului dumneavoastră. Vă rugăm să încercați din nou."
msgid "Something went wrong while exporting requirements"
-msgstr ""
+msgstr "Ceva nu a funcționat în timpul exportului cerințelor"
msgid "Something went wrong while fetching branches"
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării ramurilor"
msgid "Something went wrong while fetching comments. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării comentariilor. Vă rugăm să încercați din nou."
msgid "Something went wrong while fetching description changes. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării modificărilor descrierii. Vă rugăm să încercați din nou."
msgid "Something went wrong while fetching details"
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării detaliilor"
msgid "Something went wrong while fetching group member contributions"
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării contribuțiilor membrilor grupului"
msgid "Something went wrong while fetching latest comments."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării ultimelor comentarii."
msgid "Something went wrong while fetching projects"
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării proiectelor"
msgid "Something went wrong while fetching projects."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării proiectelor."
msgid "Something went wrong while fetching related merge requests."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării merge request-urilor asociate."
msgid "Something went wrong while fetching requirements count."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul obținerii numărului de cerințe."
msgid "Something went wrong while fetching requirements list."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul obținerii listei de cerințe."
msgid "Something went wrong while fetching source branches."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării ramurilor sursă."
msgid "Something went wrong while fetching the environments for this merge request. Please try again."
-msgstr "Ceva nu a mers bine în timpul preluării mediilor pentru acest merge request. Vă rugăm încercați din nou."
+msgstr "Ceva nu a mers bine în timpul preluării mediilor pentru acest merge request. Vă rugăm să încercați din nou."
msgid "Something went wrong while fetching the packages list."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării listei de pachete."
msgid "Something went wrong while initializing the OpenAPI viewer"
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul inițializării vizualizatorului OpenAPI"
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
-msgstr ""
+msgstr "Ceva nu a mers bine la obținerea certificatului Let's Encrypt."
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr "Ceva nu a mers bine în timpul promovării problemei într-o epică. Vă rugăm să încercați din nou."
msgid "Something went wrong while reopening a requirement."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul redeschiderii unei cerințe."
msgid "Something went wrong while reopening the epic. Please try again later."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul redeschiderii epicei. Vă rugăm să încercați din nou mai târziu."
msgid "Something went wrong while reopening the merge request. Please try again later."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul redeschiderii merge request-ului. Vă rugăm să încercați din nou mai târziu."
msgid "Something went wrong while resolving this discussion. Please try again."
-msgstr ""
+msgstr "Ceva a mers prost în timpul rezolvării acestei discuții. Vă rugăm să încercați din nou."
msgid "Something went wrong while setting %{issuableType} %{dateType} date."
-msgstr ""
+msgstr "Ceva nu a mers bine la setarea datei de %{dateType} a %{issuableType}."
msgid "Something went wrong while setting %{issuableType} confidentiality."
msgstr "Eroare la setarea confidențialității pentru %{issuableType}."
msgid "Something went wrong while setting %{issuableType} health status."
-msgstr ""
+msgstr "Ceva nu a mers bine la setarea stării de sănătate %{issuableType}."
msgid "Something went wrong while setting %{issuableType} notifications."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul setării notificărilor pentru %{issuableType}."
msgid "Something went wrong while setting %{issuableType} to-do item."
-msgstr ""
+msgstr "A apărut o eroare la setarea sarcinii de-făcut %{issuableType}."
msgid "Something went wrong while setting %{issuableType} weight."
msgstr "Ceva nu a mers bine în timpul setării greutății %{issuableType}."
msgid "Something went wrong while stopping this environment. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul opririi acestui mediu. Vă rugăm să încercați din nou."
msgid "Something went wrong while updating a requirement."
-msgstr ""
+msgstr "Ceva a mers prost la actualizarea unei cerințe."
msgid "Something went wrong while updating assignees"
-msgstr ""
+msgstr "Ceva nu a mers bine la actualizarea responsabililor"
msgid "Something went wrong while updating your list settings"
-msgstr ""
+msgstr "Ceva nu a mers bine la actualizarea setărilor listei dumneavoastră"
msgid "Something went wrong with your automatic subscription renewal."
-msgstr ""
+msgstr "Ceva nu a mers bine cu reînnoirea automată a abonamentului dumneavoastră."
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Ceva nu a mers bine, nu se poate adăuga %{project} la tabloul de bord"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr "Ceva nu a mers bine, nu se pot adăuga proiecte la dashboard"
-
msgid "Something went wrong, unable to delete project"
-msgstr ""
+msgstr "Ceva nu a mers bine, nu se poate șterge proiectul"
msgid "Something went wrong, unable to get projects"
-msgstr ""
+msgstr "Ceva nu a mers bine, nu pot obține proiecte"
msgid "Something went wrong, unable to search projects"
-msgstr ""
+msgstr "Ceva nu a mers bine, nu se pot căuta proiecte"
msgid "Something went wrong. Please try again later"
-msgstr ""
+msgstr "Ceva n-a mers bine. Vă rugăm să încercați din nou mai târziu"
msgid "Something went wrong. Please try again."
msgstr "Ceva a mers prost. Vă rugăm să încercați din nou."
msgid "Something went wrong. Try again later."
-msgstr ""
+msgstr "Ceva n-a mers bine. Încercați din nou mai târziu."
msgid "Sorry, no projects matched your search"
msgstr "Ne pare rău, niciun proiect nu corespunde căutării d-voastră"
msgid "Sorry, you have exceeded the maximum browsable page number. Please use the API to explore further."
-msgstr ""
+msgstr "Ne pare rău, ați depășit numărul maxim de pagini navigabile. Vă rugăm să utilizați API-ul pentru a explora mai departe."
msgid "Sorry, your filter produced no results"
-msgstr ""
+msgstr "NeNe pare rău, filtrul dvs. nu a produs niciun rezultat"
msgid "Sort by"
-msgstr ""
+msgstr "Sortați după"
msgid "Sort direction"
-msgstr ""
+msgstr "Direcția de sortare"
msgid "Sort direction: Ascending"
-msgstr ""
+msgstr "Direcția de sortare: Ascendentă"
msgid "Sort direction: Descending"
-msgstr ""
+msgstr "Direcția de sortare: Descendentă"
msgid "SortOptions|Blocking"
msgstr "Blocări"
msgid "SortOptions|Closed date"
-msgstr ""
+msgstr "Data închiderii"
msgid "SortOptions|Closed earlier"
-msgstr ""
+msgstr "Închisă mai devreme"
msgid "SortOptions|Closed recently"
-msgstr ""
+msgstr "Închisă recent"
msgid "SortOptions|Created date"
msgstr "Data creării"
@@ -36170,31 +36809,31 @@ msgid "SortOptions|Due date"
msgstr "Data scadentă"
msgid "SortOptions|Due later"
-msgstr ""
+msgstr "Scadentă îndepărtată"
msgid "SortOptions|Due soon"
-msgstr ""
+msgstr "Scadență apropiată"
msgid "SortOptions|Expired date"
-msgstr ""
+msgstr "Data expirării"
msgid "SortOptions|Label priority"
msgstr "Prioritatea etichetei"
msgid "SortOptions|Largest group"
-msgstr ""
+msgstr "Cel mai mare grup"
msgid "SortOptions|Largest repository"
-msgstr ""
+msgstr "Cel mai mare repozitoriu"
msgid "SortOptions|Last Contact"
-msgstr ""
+msgstr "Ultimul contact"
msgid "SortOptions|Last created"
-msgstr ""
+msgstr "Ultimul creat"
msgid "SortOptions|Least popular"
-msgstr ""
+msgstr "Cel mai puțin popular"
msgid "SortOptions|Less weight"
msgstr "Greutate mai mică"
@@ -36203,82 +36842,82 @@ msgid "SortOptions|Manual"
msgstr "Manual"
msgid "SortOptions|Merged date"
-msgstr ""
+msgstr "Data îmbinării"
msgid "SortOptions|Merged earlier"
-msgstr ""
+msgstr "ÃŽmbinat mai devreme"
msgid "SortOptions|Merged recently"
-msgstr ""
+msgstr "ÃŽmbinat recent"
msgid "SortOptions|Milestone due date"
msgstr "Data scadentă a obiectivului"
msgid "SortOptions|Milestone due later"
-msgstr ""
+msgstr "Obiectiv cu scadență îndepărtată"
msgid "SortOptions|Milestone due soon"
-msgstr ""
+msgstr "Obiectiv cu scadență apropiată"
msgid "SortOptions|More weight"
-msgstr "Greutate mai mare"
+msgstr "Mai multă greutate"
msgid "SortOptions|Most popular"
-msgstr ""
+msgstr "Cel mai popular"
msgid "SortOptions|Most stars"
msgstr "Cele mai multe stele"
msgid "SortOptions|Name"
-msgstr ""
+msgstr "Nume"
msgid "SortOptions|Name, ascending"
-msgstr ""
+msgstr "Nume, crescător"
msgid "SortOptions|Name, descending"
-msgstr ""
+msgstr "Nume, descrescător"
msgid "SortOptions|Oldest created"
-msgstr ""
+msgstr "Cel mai vechi creat"
msgid "SortOptions|Oldest last activity"
-msgstr ""
+msgstr "Cea mai veche ultimă activitate"
msgid "SortOptions|Oldest sign in"
-msgstr ""
+msgstr "Cea mai veche conectare"
msgid "SortOptions|Oldest starred"
msgstr "Cel mai vechi marcat cu stea"
msgid "SortOptions|Oldest updated"
-msgstr ""
+msgstr "Cea mai veche actualizare"
msgid "SortOptions|Popularity"
msgstr "Popularitate"
msgid "SortOptions|Priority"
-msgstr ""
+msgstr "Prioritate"
msgid "SortOptions|Project"
-msgstr ""
+msgstr "Proiect"
msgid "SortOptions|Recent last activity"
-msgstr ""
+msgstr "Ultima activitate recentă"
msgid "SortOptions|Recent sign in"
-msgstr ""
+msgstr "Cea mai recentă conectare"
msgid "SortOptions|Recently starred"
msgstr "Cea mai recent marcat cu stea"
msgid "SortOptions|Size"
-msgstr ""
+msgstr "Mărime"
msgid "SortOptions|Sort by:"
-msgstr ""
+msgstr "Sortați după:"
msgid "SortOptions|Sort direction"
-msgstr ""
+msgstr "Direcția sortării"
msgid "SortOptions|Stars"
msgstr "Stele"
@@ -36287,10 +36926,10 @@ msgid "SortOptions|Start date"
msgstr "Data de începere"
msgid "SortOptions|Start later"
-msgstr ""
+msgstr "Începe mai târziu"
msgid "SortOptions|Start soon"
-msgstr ""
+msgstr "Începe în curând"
msgid "SortOptions|Title"
msgstr "Titlu"
@@ -36299,25 +36938,25 @@ msgid "SortOptions|Type"
msgstr "Tip"
msgid "SortOptions|Version"
-msgstr ""
+msgstr "Versiune"
msgid "SortOptions|Weight"
msgstr "Greutate"
msgid "Source"
-msgstr ""
+msgstr "Sursa"
msgid "Source (branch or tag)"
-msgstr ""
+msgstr "Sursa (ramură sau etichetă)"
msgid "Source Branch"
-msgstr ""
+msgstr "Ramura sursă"
msgid "Source IP"
-msgstr ""
+msgstr "IP sursă"
msgid "Source branch"
-msgstr ""
+msgstr "Ramura sursă"
msgid "Source branch will be deleted."
msgstr "Ramura sursă va fi ștearsă."
@@ -36326,13 +36965,13 @@ msgid "Source branch will not be deleted."
msgstr "Ramura sursă nu va fi ștearsă."
msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}"
-msgstr ""
+msgstr "Ramura sursă: %{source_branch_open}%{source_branch}%{source_branch_close}"
msgid "Source code (%{fileExtension})"
-msgstr ""
+msgstr "Codul sursă (%{fileExtension})"
msgid "Source is not available"
-msgstr ""
+msgstr "Sursa nu este disponibilă"
msgid "Source project cannot be found."
msgstr "Proiectul sursă nu poate fi găsit."
@@ -36365,7 +37004,7 @@ msgid "SourceEditor|`definition` property is expected on the extension."
msgstr "Proprietatea „definition†este așteptată pe extensie."
msgid "Sourcegraph"
-msgstr ""
+msgstr "Sourcegraph"
msgid "SourcegraphAdmin|Block on private and internal projects"
msgstr "Blocați pe proiecte private și interne"
@@ -36413,16 +37052,16 @@ msgid "Spam Check"
msgstr "Verificare spam"
msgid "Spam Check API key"
-msgstr "Cheie API de verificare spam"
+msgstr "Cheie API de Verificare spam"
msgid "Spam Logs"
-msgstr ""
+msgstr "Jurnalele de spam"
msgid "Spam and Anti-bot Protection"
-msgstr ""
+msgstr "Protecție anti-spam și anti-bot"
msgid "Spam log successfully submitted as ham."
-msgstr ""
+msgstr "Jurnalul de spam a fost trimis cu succes ca ham."
msgid "Specific runners"
msgstr "Executori specifici"
@@ -36431,15 +37070,15 @@ msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "URL-ul specificat nu poate fi utilizat: „%{reason}â€"
msgid "Specify IP ranges that are always allowed for inbound traffic, for use with group-level IP restrictions. Runner and Pages daemon internal IPs should be listed here so that they can access project artifacts."
-msgstr ""
+msgstr "Specificați intervalele IP care sunt întotdeauna permise pentru traficul de intrare, pentru a fi utilizate cu restricțiile IP la nivel de grup. IP-urile interne ale daemonilor Runner și Pages ar trebui să fie listate aici pentru ca aceștia să poată accesa artefactele proiectului."
msgid "Specify an email address regex pattern to identify default internal users."
msgstr "Specificați un model regex de adresă de e-mail pentru a identifica utilizatorii interni impliciți."
msgid "Speed up your pipelines with Needs relationships"
-msgstr ""
+msgstr "Accelerați-vă pipeline-urile cu relațiile Needs"
-msgid "Spent At"
+msgid "Spent at"
msgstr "Petrecut la"
msgid "Squash commit message"
@@ -36449,31 +37088,31 @@ msgid "Squash commits"
msgstr "Squash de commit-uri"
msgid "Stack trace"
-msgstr ""
+msgstr "Urmărire stivă"
msgid "Stacktrace snippet"
msgstr "Fragment de cod de urmărire a stivei"
msgid "Stage"
-msgstr ""
+msgstr "Etape"
msgid "Stage:"
-msgstr ""
+msgstr "Etape:"
msgid "Standard"
-msgstr ""
+msgstr "Standard"
msgid "Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging."
-msgstr ""
+msgstr "Marcați cu stea o etichetă pentru a o transforma într-o etichetă prioritară. Așezați în ordine etichetele prioritizate pentru a le modifica prioritatea relativă, prin glisare."
msgid "Star labels to start sorting by priority"
-msgstr ""
+msgstr "Marcați etichetele cu stele pentru a începe sortarea după prioritate"
msgid "Star toggle failed. Try again later."
-msgstr ""
+msgstr "Comutarea stelei a eșuat. Încercați din nou mai târziu."
msgid "StarProject|Star"
-msgstr ""
+msgstr "Adăugare stea"
msgid "Starred Projects"
msgstr "Proiecte marcate cu stele"
@@ -36494,13 +37133,13 @@ msgid "Starrers"
msgstr "Marcatori cu stele"
msgid "Stars"
-msgstr ""
+msgstr "Stele"
msgid "Start Date"
msgstr "Data de început"
msgid "Start Time"
-msgstr ""
+msgstr "Ora de începere"
msgid "Start Web Terminal"
msgstr "Porniți Terminalul Web"
@@ -36509,61 +37148,61 @@ msgid "Start a %{new_merge_request} with these changes"
msgstr "Începeți un %{new_merge_request}} cu aceste modificări"
msgid "Start a Free Ultimate Trial"
-msgstr ""
+msgstr "Începeți o perioadă de încercare gratuită Ultimate"
msgid "Start a new discussion…"
-msgstr ""
+msgstr "Începeți o nouă discuție…"
msgid "Start a new merge request with these changes"
msgstr "Începeți un nou merge request cu aceste modificări"
msgid "Start a review"
-msgstr ""
+msgstr "Începeți o revizuire"
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "Începeți prin a alege un grup pentru a explora merge request-urile din acel grup. Apoi puteți trece la filtrarea în funcție de proiecte, etichete, etape și autori."
msgid "Start cleanup"
-msgstr ""
+msgstr "Începeți curățarea"
msgid "Start date"
-msgstr ""
+msgstr "Data de început"
msgid "Start free trial"
-msgstr ""
+msgstr "Începeți încercarea gratuită"
msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
msgstr "Începeți să introduceți modificările și vom genera un fișier YAML pe care să-l adăugați în repozitoriul dvs."
msgid "Start internal thread"
-msgstr ""
+msgstr "Începeți un subiect intern"
msgid "Start merge train"
-msgstr ""
+msgstr "Începeți merge train-ul"
msgid "Start merge train when pipeline succeeds"
msgstr "Porniți merge train-ul când conducta reușește"
msgid "Start merge train..."
-msgstr ""
+msgstr "ÃŽncepe merge train-ul..."
msgid "Start search"
-msgstr ""
+msgstr "Începeți căutarea"
msgid "Start thread"
-msgstr "Începeți subiectul"
+msgstr "Începeți un subiect"
msgid "Start your Free Ultimate Trial"
-msgstr ""
+msgstr "Începeți perioada dvs. de încercare gratuită Ultimate"
msgid "Start your free trial"
-msgstr ""
+msgstr "Începeți încercarea dvs. gratuită"
msgid "Started"
-msgstr ""
+msgstr "ÃŽnceput"
msgid "Started %{startsIn}"
-msgstr ""
+msgstr "ÃŽnceput %{startsIn}"
msgid "Started asynchronous removal of all repository check states."
msgstr "A început eliminarea asincronă a tuturor stărilor de verificare a repozitoriului."
@@ -36572,25 +37211,25 @@ msgid "Started escalation for this incident."
msgstr "A început escaladarea pentru acest incident."
msgid "Starting..."
-msgstr ""
+msgstr "Pornire..."
msgid "Starts"
-msgstr ""
+msgstr "ÃŽncepe"
msgid "Starts %{startsIn}"
-msgstr ""
+msgstr "ÃŽncepe %{startsIn}"
msgid "Starts at (UTC)"
-msgstr ""
+msgstr "ÃŽncepe la (UTC)"
msgid "Starts escalations for this incident"
msgstr "ÃŽncepe escaladarea pentru acest incident"
msgid "Starts on"
-msgstr ""
+msgstr "ÃŽncepe pe"
msgid "Starts: %{startsAt}"
-msgstr ""
+msgstr "ÃŽncepe: %{startsAt}"
msgid "State your message to activate"
msgstr "Menționați mesajul dvs. pentru a activa"
@@ -36605,13 +37244,13 @@ msgid "Static Application Security Testing (SAST)"
msgstr "Testarea statică a securității aplicațiilor (SAST)"
msgid "Statistics"
-msgstr ""
+msgstr "Statistici"
msgid "Status"
msgstr "Stare"
msgid "Status was retried."
-msgstr ""
+msgstr "Starea a fost reîncercată."
msgid "Status:"
msgstr "Stare:"
@@ -36638,13 +37277,13 @@ msgid "StatusCheck|All passed"
msgstr "Toate au trecut"
msgid "StatusCheck|An error occurred deleting the %{name} status check."
-msgstr "A apărut o eroare la ștergerea verificării stării %{name}"
+msgstr "S-a produs o eroare la ștergerea verificării stării %{name}."
msgid "StatusCheck|An error occurred fetching the status checks."
-msgstr "A apărut o eroare la preluarea verificărilor de stare."
+msgstr "S-a produs o eroare la preluarea verificărilor de stare."
msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
-msgstr "Aplică această verificare a stării la toate ramurile sau la o anumită ramură protejată."
+msgstr "Aplicați această verificare a stării la toate ramurile sau la o anumită ramură protejată."
msgid "StatusCheck|Check for a status response in merge requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
msgstr "Verificați dacă există un răspuns de stare în merge request-uri. Eșecurile nu blochează îmbinările. %{link_start}Aflați mai multe%{link_end}."
@@ -36662,16 +37301,16 @@ msgid "StatusCheck|Failed to load status checks."
msgstr "Nu s-a reușit încărcarea verificărilor de stare."
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
-msgstr "Invocă un API extern ca parte a procesului pipeline."
+msgstr "Invocați un API extern ca parte a procesului pipeline."
msgid "StatusCheck|No status checks are defined yet."
msgstr "Nu sunt definite încă verificări de stare."
msgid "StatusCheck|Remove status check"
-msgstr "Îndepărtați verificarea stării"
+msgstr "Înlăturați verificarea stării"
msgid "StatusCheck|Remove status check?"
-msgstr "Îndepărtați verificarea stării?"
+msgstr "Înlăturați verificarea stării?"
msgid "StatusCheck|Service name"
msgstr "Numele serviciului"
@@ -36722,7 +37361,7 @@ msgid "StatusPage|Configure file storage settings to link issues in this project
msgstr "Configurați setările de stocare a fișierelor pentru a conecta problemele din acest proiect la o pagină de stare externă."
msgid "StatusPage|S3 Bucket name"
-msgstr "Numele S3 bucket"
+msgstr "Numele S3 Bucket"
msgid "StatusPage|Status page"
msgstr "Pagina de stare"
@@ -36734,13 +37373,13 @@ msgid "StatusPage|To publish incidents to an external status page, GitLab stores
msgstr "Pentru a publica incidentele pe o pagină de stare externă, GitLab stochează un fișier JSON în contul Amazon S3 într-o locație pe care serviciul dvs. de pagină de stare externă o poate accesa. Asigurați-vă că ați configurat, de asemenea, %{docsLink}"
msgid "StatusPage|configuration documentation"
-msgstr ""
+msgstr "documentația de configurare"
msgid "StatusPage|your status page frontend."
msgstr "frontend-ul paginii dvs. de stare."
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
+msgstr "Rămâneți la curent cu performanțele și starea de sănătate a mediului dvs. prin configurarea Prometheus pentru a vă monitoriza implementările."
msgid "Step %{currentStep} of %{stepCount}"
msgstr "Etapa %{currentStep} din %{stepCount}"
@@ -36758,37 +37397,40 @@ msgid "Step 4."
msgstr "Etapa 4."
msgid "Stop Terminal"
-msgstr ""
+msgstr "Opriți terminalul"
msgid "Stop impersonation"
msgstr "Opriți impersonarea"
msgid "Stop this environment"
-msgstr ""
+msgstr "Opriți acest mediu"
msgid "Stopped"
-msgstr ""
+msgstr "Oprit"
msgid "Stopping..."
-msgstr ""
+msgstr "Oprire..."
msgid "Storage"
-msgstr ""
+msgstr "Stocare"
msgid "Storage nodes for new repositories"
-msgstr ""
+msgstr "Noduri de stocare pentru noile repozitorii"
msgid "Storage:"
-msgstr ""
+msgstr "Stocare:"
msgid "StorageSize|Unknown"
-msgstr ""
+msgstr "Necunoscut"
+
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr "Stocați-vă fișierele, planificați-vă activitatea, colaborați la cod și multe altele."
msgid "Strikethrough"
-msgstr ""
+msgstr "Tăiat cu o linie"
msgid "Strikethrough text"
-msgstr ""
+msgstr "Text tăiat cu o linie"
msgid "Sub-batch size"
msgstr "Mărimea subloturilor"
@@ -36797,181 +37439,187 @@ msgid "Subdomains of the Pages root domain %{root_domain} are reserved and canno
msgstr "Subdomeniile domeniului rădăcină Pages %{root_domain} sunt rezervate și nu pot fi utilizate ca domenii Pages particularizate."
msgid "Subgroup information"
-msgstr ""
+msgstr "Informații despre subgrup"
msgid "Subgroup milestone"
-msgstr ""
+msgstr "Obiectiv de subgrup"
msgid "Subgroup navigation"
-msgstr ""
+msgstr "Navigare în subgrup"
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr ""
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr "Stocați-vă fișierele, planificați-vă activitatea, colaborați la cod și multe altele."
msgid "SubgroupCreationlevel|Allowed to create subgroups"
-msgstr ""
+msgstr "Autorizat să creeze subgrupuri"
msgid "SubgroupCreationlevel|Maintainers"
msgstr "Întreținători"
msgid "SubgroupCreationlevel|Owners"
-msgstr ""
+msgstr "Proprietari"
msgid "Subgroups"
-msgstr ""
+msgstr "Subgrupuri"
msgid "Subgroups and projects"
-msgstr ""
+msgstr "Subgrupuri și proiecte"
+
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr "Subgrupurile își pot configura propriile reguli de autentificare cu doi factori"
msgid "Subject Key Identifier:"
-msgstr ""
+msgstr "Identificatorul cheii subiectului:"
msgid "Subkeys"
-msgstr ""
+msgstr "Subchei"
msgid "Submit"
-msgstr ""
+msgstr "Trimiteți"
msgid "Submit a review"
-msgstr ""
+msgstr "Trimiteți o recenzie"
msgid "Submit as ham"
-msgstr ""
+msgstr "Trimiteți ca ham"
msgid "Submit as spam"
-msgstr ""
+msgstr "Trimiteți ca spam"
msgid "Submit feedback"
-msgstr ""
+msgstr "Trimiteți un feedback"
msgid "Submit review"
-msgstr ""
+msgstr "Trimiteți o recenzie"
msgid "Submit search"
-msgstr ""
+msgstr "Trimiteți căutarea"
msgid "Submit the current review."
-msgstr ""
+msgstr "Trimiteți recenzia curentă."
msgid "Submitted as ham"
-msgstr ""
+msgstr "Trimis ca ham"
msgid "Submitted the current review."
-msgstr ""
+msgstr "A trimis recenzia curentă."
msgid "Subscribe"
-msgstr ""
+msgstr "Abonați-vă"
msgid "Subscribe at group level"
-msgstr ""
+msgstr "Abonați-vă la nivel de grup"
msgid "Subscribe at project level"
-msgstr ""
+msgstr "Abonați-vă la nivel de proiect"
msgid "Subscribe to RSS feed"
-msgstr ""
+msgstr "Abonați-vă la fluxul RSS"
msgid "Subscribe to calendar"
-msgstr ""
+msgstr "Abonați-vă la calendar"
msgid "Subscribed"
-msgstr ""
+msgstr "Abonat"
msgid "Subscribed to this %{quick_action_target}."
-msgstr ""
+msgstr "Abonat la acest / această %{quick_action_target}."
msgid "Subscribed to this project"
msgstr "Abonat la acest proiect"
msgid "Subscribes to this %{quick_action_target}."
-msgstr ""
+msgstr "Se abonează la acest / această %{quick_action_target}."
+
+msgid "Subscript"
+msgstr "Subscript"
msgid "Subscription"
-msgstr ""
+msgstr "Abonament"
msgid "Subscription History"
-msgstr ""
+msgstr "Istoricul abonamentelor"
msgid "Subscription deletion failed."
-msgstr ""
+msgstr "Ștergerea abonamentului nu a reușit."
msgid "Subscription service outage"
-msgstr ""
+msgstr "ÃŽntreruperea serviciului de abonament"
msgid "Subscription successfully applied to \"%{group_name}\""
-msgstr ""
+msgstr "Abonamentul a fost aplicat cu succes la „%{group_name}â€"
msgid "Subscription successfully created."
-msgstr ""
+msgstr "Abonamentul a fost creat cu succes."
msgid "Subscription successfully deleted."
-msgstr ""
+msgstr "Abonamentul a fost șters cu succes."
msgid "SubscriptionBanner|Add new license"
-msgstr "Adăugați o nouă licență"
+msgstr "Adăugare licență nouă"
msgid "SubscriptionBanner|Export license usage file"
msgstr "Exportați fișierul de utilizare a licenței"
msgid "SubscriptionBanner|Upload new license"
-msgstr ""
+msgstr "Încărcați noua licență"
msgid "SubscriptionTable|Add seats"
-msgstr "Adăugați seats"
+msgstr "Adăugați seat-uri"
msgid "SubscriptionTable|An error occurred while loading the subscription details."
msgstr "A apărut o eroare în timpul încărcării detaliilor abonamentului."
msgid "SubscriptionTable|Billing"
-msgstr ""
+msgstr "Facturare"
msgid "SubscriptionTable|Free"
-msgstr ""
+msgstr "Gratuit"
msgid "SubscriptionTable|GitLab allows you to continue using your subscription even if you exceed the number of seats you purchased. You will be required to pay for these seats upon renewal."
msgstr "GitLab vă permite să continuați să vă folosiți abonamentul chiar dacă depășiți numărul de seats achiziționate. Vi se va cere să plătiți pentru aceste seats la reînnoire."
msgid "SubscriptionTable|Last invoice"
-msgstr ""
+msgstr "Ultima factură"
msgid "SubscriptionTable|Loading subscriptions"
msgstr "Se încarcă abonamentele"
msgid "SubscriptionTable|Manage"
-msgstr ""
+msgstr "Gestionare"
msgid "SubscriptionTable|Max seats used"
-msgstr "Max. seats utilizate"
+msgstr "Max. seat-uri utilizate"
msgid "SubscriptionTable|Next invoice"
-msgstr ""
+msgstr "Factura următoare"
msgid "SubscriptionTable|Refresh Seats"
msgstr "Reîmprospătați Seat-urile"
msgid "SubscriptionTable|Renew"
-msgstr ""
+msgstr "Reînnoire"
msgid "SubscriptionTable|Seats currently in use"
-msgstr "Seats actual în uz"
+msgstr "Seat-uri actual în uz"
msgid "SubscriptionTable|Seats in subscription"
-msgstr "Seats în abonament"
+msgstr "Seat-uri în abonament"
msgid "SubscriptionTable|Seats owed"
-msgstr "Seats datorate"
+msgstr "Seat-uri datorate"
msgid "SubscriptionTable|See usage"
-msgstr ""
+msgstr "Consultați utilizarea"
msgid "SubscriptionTable|Something went wrong trying to refresh seats"
msgstr "Ceva nu a mers bine la încercarea de a reîmprospăta seat-urile"
msgid "SubscriptionTable|Subscription end date"
-msgstr ""
+msgstr "Data de sfârșit a abonamentului"
msgid "SubscriptionTable|Subscription start date"
-msgstr ""
+msgstr "Data de început a abonamentului"
msgid "SubscriptionTable|This is the last time the GitLab.com team was in contact with you to settle any outstanding balances."
msgstr "Aceasta este ultima dată când echipa GitLab.com a intrat în contact cu dvs. pentru a soluționa orice solduri restante."
@@ -36980,46 +37628,46 @@ msgid "SubscriptionTable|This is the maximum number of users that have existed a
msgstr "Acesta este maximul de utilizatori care au existat în același timp de când a început acest abonament."
msgid "SubscriptionTable|This is the next date when the GitLab.com team is scheduled to get in contact with you to settle any outstanding balances."
-msgstr ""
+msgstr "Aceasta este următoarea dată la care echipa GitLab.com este programată să vă contacteze pentru a rezolva orice solduri restante."
msgid "SubscriptionTable|This is the number of seats you will be required to purchase if you update to a paid plan."
-msgstr "Acesta este numărul de seats pe care va trebui să le achiziționați faceți upgrade la un plan plătit."
+msgstr "Acesta este numărul de seat-uri pe care va trebui să le achiziționați dacă faceți upgrade la un plan plătit."
msgid "SubscriptionTable|Trial"
-msgstr ""
+msgstr "Versiune de încercare"
msgid "SubscriptionTable|Trial end date"
-msgstr ""
+msgstr "Data încheierii perioadei de încercare"
msgid "SubscriptionTable|Trial start date"
-msgstr ""
+msgstr "Data începerii perioadei de încercare"
msgid "SubscriptionTable|Usage"
-msgstr ""
+msgstr "Utilizare"
msgid "SubscriptionTable|Usage count is performed once a day at 12:00 PM."
-msgstr ""
+msgstr "Contorizarea utilizării se efectuează o dată pe zi, la ora 12:00 PM."
msgid "Subscriptions"
-msgstr ""
+msgstr "Abonamente"
msgid "Subscriptions|Chat with sales"
-msgstr ""
+msgstr "Chat cu vânzările"
msgid "Subscriptions|Close"
-msgstr ""
+msgstr "ÃŽnchide"
msgid "Subscriptions|Not ready to buy yet?"
-msgstr ""
+msgstr "Nu sunteți încă gata să cumpărați?"
msgid "Subscriptions|Start a free trial"
-msgstr ""
+msgstr "Începeți o perioadă de încercare gratuită"
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
-msgstr ""
+msgstr "Vă înțelegem. Probabil că aveți câteva întrebări pentru echipa noastră de vânzări sau poate că doriți să încercați mai întâi unele dintre funcțiile plătite. Ce ați dori să faceți?"
msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
-msgstr "Abonamentul dvs. pentru %{strong}%{namespace_name}%{strong_close} a expirat și sunteți acum pe %{pricing_link_start}nivelul GitLab Free%{pricing_link_end}. Nu vă faceți griji, datele dvs. sunt în siguranță. Luați legătura cu echipa noastră de asistență (%{support_email}). Ei vă vor ajuta cu plăcere cu reînnoirea abonamentului."
+msgstr "Abonamentul dvs. pentru %{strong}%{namespace_name}%{strong_close} a expirat și sunteți acum pe %{pricing_link_start}nivelul GitLab Gratuit%{pricing_link_end}. Nu vă faceți griji, datele dvs. sunt în siguranță. Luați legătura cu echipa noastră de asistență (%{support_email}). Aceștia vă vor ajuta cu plăcere să vă reînnoiți abonamentul."
msgid "Subtracted"
msgstr "S-a scăzut"
@@ -37028,40 +37676,40 @@ msgid "Subtracts"
msgstr "Scade"
msgid "Succeeded"
-msgstr ""
+msgstr "Reușit"
msgid "Successful purchase image"
-msgstr ""
+msgstr "Imagine achiziționată cu succes"
msgid "Successfully activated"
-msgstr ""
+msgstr "Activat cu succes"
msgid "Successfully approved"
-msgstr ""
+msgstr "Aprobat cu succes"
msgid "Successfully banned"
msgstr "Interzicere reușită"
msgid "Successfully blocked"
-msgstr ""
+msgstr "Blocat cu succes"
msgid "Successfully confirmed"
-msgstr ""
+msgstr "Confirmat cu succes"
msgid "Successfully deactivated"
-msgstr ""
+msgstr "Dezactivat cu succes"
msgid "Successfully deleted U2F device."
-msgstr ""
+msgstr "Dispozitivul U2F a fost șters cu succes."
msgid "Successfully deleted WebAuthn device."
-msgstr ""
+msgstr "Dispozitivul WebAuthn a fost înlăturat cu succes."
msgid "Successfully removed email."
-msgstr ""
+msgstr "E-mail eliminat cu succes."
msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details."
-msgstr ""
+msgstr "A fost programată cu succes rularea unui pipeline. Accesați %{pipelines_link_start}pagina Pipeline%{pipelines_link_end} pentru detalii."
msgid "Successfully synced %{synced_timeago}."
msgstr "S-a sincronizat cu succes %{synced_timeago}."
@@ -37070,10 +37718,10 @@ msgid "Successfully unbanned"
msgstr "Anularea interzicerii reușită"
msgid "Successfully unblocked"
-msgstr ""
+msgstr "Deblocat cu succes"
msgid "Successfully unlocked"
-msgstr ""
+msgstr "Deblocat cu succes"
msgid "Successfully updated %{last_updated_timeago}."
msgstr "Actualizare reușită %{last_updated_timeago}."
@@ -37085,7 +37733,7 @@ msgid "Suggest code changes which can be immediately applied in one click. Try i
msgstr "Sugerați modificări de cod care pot fi aplicate imediat cu un singur clic. Încercați!"
msgid "Suggested change"
-msgstr ""
+msgstr "Modificarea propusă"
msgid "SuggestedColors|Aztec Gold"
msgstr "Aur Aztec"
@@ -37109,10 +37757,10 @@ msgid "SuggestedColors|Crimson"
msgstr "Purpuriu"
msgid "SuggestedColors|Current addition color"
-msgstr "Culoarea curentă pentru adăugări"
+msgstr "Culoarea actuală de adăugare"
msgid "SuggestedColors|Current removal color"
-msgstr "Culoarea curentă pentru înlăturări"
+msgstr "Culoarea actuală de înlăturare"
msgid "SuggestedColors|Dark coral"
msgstr "Coral închis"
@@ -37130,16 +37778,16 @@ msgid "SuggestedColors|Deep violet"
msgstr "Violet profund"
msgid "SuggestedColors|Default addition color"
-msgstr "Culoarea implicită pentru adăugări"
+msgstr "Culoare implicită de adăugare"
msgid "SuggestedColors|Default removal color"
-msgstr "Culoarea implicită pentru înlăturări"
+msgstr "Culoarea implicită de înlăturare"
msgid "SuggestedColors|Gray"
msgstr "Gri"
msgid "SuggestedColors|Green"
-msgstr ""
+msgstr "Verde"
msgid "SuggestedColors|Green screen"
msgstr "Ecran verde"
@@ -37160,7 +37808,7 @@ msgid "SuggestedColors|Orange"
msgstr "Portocaliu"
msgid "SuggestedColors|Purple"
-msgstr ""
+msgstr "Violet"
msgid "SuggestedColors|Red"
msgstr "Roșu"
@@ -37172,31 +37820,34 @@ msgid "SuggestedColors|Titanium yellow"
msgstr "Galben titan"
msgid "Suggestion is not applicable as the suggestion was not found."
-msgstr ""
+msgstr "Sugestia nu se aplică, deoarece sugestia nu a fost găsită."
msgid "Suggestions are not applicable as one or more suggestions were not found."
-msgstr ""
+msgstr "Sugestiile nu se aplică deoarece nu au fost găsite una sau mai multe sugestii."
msgid "Suggestions are not applicable as their lines cannot overlap."
msgstr "Sugestiile nu sunt aplicabile, deoarece liniile lor nu se pot suprapune."
msgid "Suggestions must all be on the same branch."
-msgstr ""
+msgstr "Sugestiile trebuie să fie toate pe aceeași ramură."
msgid "Suggestions:"
-msgstr ""
+msgstr "Sugestii:"
msgid "Suite"
-msgstr ""
+msgstr "Suite"
msgid "Summary"
-msgstr ""
+msgstr "Sumar"
-msgid "Summary / Note"
-msgstr ""
+msgid "Summary / note"
+msgstr "Rezumat / notă"
+
+msgid "Summary comment (optional)"
+msgstr "Comentariu sumar (opțional)"
msgid "Sunday"
-msgstr ""
+msgstr "Duminică"
msgid "SuperSonics|Activate subscription"
msgstr "Activați abonamentul"
@@ -37220,7 +37871,7 @@ msgid "SuperSonics|Cloud licensing"
msgstr "Licențiere în cloud"
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 "Licențierea în cloud este acum disponibilă. Este o modalitate mai ușoară de activare a instanțelor și de gestionare a abonamentelor. Citiți mai multe despre aceasta în %{blogPostLinkStart}postarea din blogul%{blogPostLinkEnd} nostru. Codurile de activare sunt disponibile în %{portalLinkStart}Portalul Clienților%{portalLinkEnd}."
+msgstr "Licențierea în cloud este acum disponibilă. Este o modalitate mai ușoară de a activa instanțele și de a gestiona abonamentele. Citiți mai multe despre aceasta în %{blogPostLinkStart}postarea de pe blogul%{blogPostLinkEnd} nostru. Codurile de activare sunt disponibile în %{portalLinkStart}Portalul clienților%{portalLinkEnd}."
msgid "SuperSonics|Enter activation code"
msgstr "Introduceți codul de activare"
@@ -37229,7 +37880,7 @@ msgid "SuperSonics|Export license usage file"
msgstr "Exportați fișierul de utilizare a licenței"
msgid "SuperSonics|Free trial"
-msgstr "Evaluare gratuită"
+msgstr "Perioadă de încercare gratuită"
msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
msgstr "Sunt de acord că utilizarea de către mine a Software-ului GitLab este supusă Acordului de abonament aflat în %{linkStart} Termenii și condițiile serviciului%{linkEnd}, dacă nu se convine altfel în scris cu GitLab."
@@ -37265,7 +37916,7 @@ msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling orga
msgstr "Sunteți gata să începeți? Un plan GitLab este ideal pentru organizații în creștere și pentru utilizarea în mai multe echipe."
msgid "SuperSonics|Start free trial"
-msgstr "Începeți evaluarea gratuită"
+msgstr "Începeți o perioadă de încercare gratuită"
msgid "SuperSonics|Subscription details"
msgstr "Detaliile abonamentului"
@@ -37319,7 +37970,7 @@ msgid "SuperSonics|You can no longer sync your subscription details with GitLab.
msgstr "Nu vă mai puteți sincroniza detaliile abonamentului cu GitLab. Obțineți ajutor pentru cele mai frecvente probleme de conectivitate prin %{connectivityHelpLinkStart}depanarea codului de activare%{connectivityHelpLinkEnd}."
msgid "SuperSonics|You can start a free trial of GitLab Ultimate without any obligation or payment details."
-msgstr "Puteți începe o perioadă de evaluare gratuită a GitLab Ultimate fără nicio obligație sau detalii de plată."
+msgstr "Puteți începe o perioadă de încercare gratuită a GitLab Ultimate fără nicio obligație sau detalii de plată."
msgid "SuperSonics|You do not have an active subscription"
msgstr "Nu aveți un abonament activ"
@@ -37363,56 +38014,74 @@ msgstr "abonamente viitoare"
msgid "SuperSonics|past subscriptions"
msgstr "abonamente anterioare"
+msgid "Superscript"
+msgstr "Superscript"
+
msgid "Support"
-msgstr ""
+msgstr "Asistență"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
msgstr "Suportul pentru certificate personalizate este dezactivat. Cereți administratorului dvs. de sistem să-l activeze."
msgid "Support page URL"
-msgstr ""
+msgstr "URL-ul paginii de asistență"
msgid "Survey Response"
-msgstr ""
+msgstr "Răspuns la sondaj"
+
+msgid "Surveys|Delighted"
+msgstr "Încântat"
+
+msgid "Surveys|Happy"
+msgstr "Fericit"
+
+msgid "Surveys|Neutral"
+msgstr "Neutru"
+
+msgid "Surveys|Sad"
+msgstr "Trist"
+
+msgid "Surveys|Unhappy"
+msgstr "Nemulțumit"
msgid "Switch Branches"
msgstr "Comutați ramurile"
msgid "Switch branch"
-msgstr ""
+msgstr "Schimbați branșa"
msgid "Switch branch/tag"
-msgstr ""
+msgstr "Schimbați ramura/eticheta"
msgid "Switch to GitLab Next"
-msgstr ""
+msgstr "Treceți la GitLab Next"
msgid "Switch to the source to copy the file contents"
-msgstr ""
+msgstr "Comutați la sursă pentru a copia conținutul fișierului"
msgid "Symbolic link"
-msgstr ""
+msgstr "Link simbolic"
msgid "Sync LDAP"
-msgstr ""
+msgstr "Sincronizare LDAP"
msgid "Sync now"
-msgstr ""
+msgstr "Sincronizare acum"
msgid "Synced"
-msgstr ""
+msgstr "Sincronizat"
msgid "Synchronize LDAP"
-msgstr ""
+msgstr "Sincronizați LDAP"
msgid "Syncing…"
-msgstr ""
+msgstr "Se sincronizează…"
msgid "Syntax is correct."
-msgstr ""
+msgstr "Sintaxa este corectă."
msgid "Syntax is incorrect."
-msgstr ""
+msgstr "Sintaxa este incorectă."
msgid "SynthaxHighlightingTheme|Dark"
msgstr "ÃŽntunecat"
@@ -37433,25 +38102,22 @@ msgid "SynthaxHighlightingTheme|Solarized Light"
msgstr "Solarizat deschis"
msgid "System"
-msgstr ""
+msgstr "Sistem"
msgid "System Hooks"
-msgstr ""
+msgstr "Hook-uri de sistem"
msgid "System Hooks Help"
-msgstr ""
+msgstr "Ajutor pentru Hook-uri de sistem"
msgid "System Info"
-msgstr ""
+msgstr "Informații despre sistem"
msgid "System default (%{default})"
-msgstr ""
+msgstr "Valoarea implicită de sistem (%{default})"
msgid "System header and footer"
-msgstr ""
-
-msgid "System hook was successfully updated."
-msgstr ""
+msgstr "Antetul și subsolul sistemului"
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr "Hook-urile de sistem sunt declanșate la seturi de evenimente, cum ar fi crearea unui proiect sau adăugarea unei chei SSH. De asemenea, puteți activa declanșatori suplimentari, cum ar fi evenimentele push."
@@ -37463,37 +38129,37 @@ msgid "System metrics (Kubernetes)"
msgstr "Metrici de sistem (Kubernetes)"
msgid "System output"
-msgstr ""
+msgstr "Ieșirea sistemului"
msgid "Table of Contents"
-msgstr ""
+msgstr "Cuprins"
msgid "Table of contents"
-msgstr ""
+msgstr "Cuprins"
msgid "Tag"
-msgstr ""
+msgstr "Etichetă"
msgid "Tag list:"
-msgstr ""
+msgstr "Lista de etichete:"
msgid "Tag name"
-msgstr ""
+msgstr "Numele etichetei"
msgid "Tag name is required."
-msgstr ""
+msgstr "Numele etichetei este necesar."
msgid "Tag push"
-msgstr ""
+msgstr "Push de etichetă"
msgid "Tag push events"
-msgstr ""
+msgstr "Evenimente de push de etichetă"
msgid "Tag this commit."
-msgstr ""
+msgstr "Etichetați acest commit."
msgid "Tag:"
-msgstr ""
+msgstr "Etichetă:"
msgid "Tagged this commit to %{tag_name} with \"%{message}\"."
msgstr "Acest commit a fost etichetat la %{tag_name} cu \"%{message}\"."
@@ -37502,13 +38168,13 @@ msgid "Tagged this commit to %{tag_name}."
msgstr "Acest commit a fost etichetat la %{tag_name}."
msgid "Tags"
-msgstr ""
+msgstr "Etichete"
msgid "Tags are deleted until the timeout is reached. Any remaining tags are included the next time the policy runs. To remove the time limit, set it to 0."
-msgstr "Etichetele sunt șterse până când este atins timeout-ul. Toate etichetele rămase sunt incluse la următoarea rulare a politicii. Pentru a elimina limita de timp, setați-o la 0."
+msgstr "Etichetele sunt șterse până când este atins termenul de expirare. Toate etichetele rămase sunt incluse la următoarea rulare a politicii. Pentru a elimina limita de timp, setați-o la 0."
msgid "Tags feed"
-msgstr ""
+msgstr "Fluxul de etichete"
msgid "Tags this commit to %{tag_name} with \"%{message}\"."
msgstr "Etichetează acest commit la %{tag_name} cu \"%{message}\"."
@@ -37517,10 +38183,10 @@ msgid "Tags this commit to %{tag_name}."
msgstr "Etichetează acest commit la %{tag_name}."
msgid "Tags:"
-msgstr ""
+msgstr "Etichete:"
msgid "TagsPage|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this tag."
-msgstr ""
+msgstr "După ce confirmați și selectați %{strongStart}%{buttonText}.%{strongEnd} nu mai puteți recupera această etichetă."
msgid "TagsPage|Browse commits"
msgstr "Răsfoiți commit-urile"
@@ -37535,25 +38201,25 @@ msgid "TagsPage|Cancel"
msgstr "Anulare"
msgid "TagsPage|Cancel, keep tag"
-msgstr ""
+msgstr "Anulați, păstrați eticheta"
msgid "TagsPage|Create tag"
-msgstr "Creare etichetă"
+msgstr "Creați eticheta"
msgid "TagsPage|Delete protected tag"
-msgstr ""
+msgstr "Ștergeți eticheta protejată"
msgid "TagsPage|Delete protected tag. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "Ștergeți eticheta protejată. Sunteți ABSOLUT SIGUR?"
msgid "TagsPage|Delete tag"
msgstr "Ștergeți eticheta"
msgid "TagsPage|Delete tag. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "Ștergeți eticheta. Sunteți ABSOLUT SIGUR?"
msgid "TagsPage|Deleting the %{strongStart}%{tagName}%{strongEnd} tag cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Ștergerea etichetei %{strongStart}%{tagName}%{strongEnd} nu poate fi anulată. Sunteți sigur?"
msgid "TagsPage|Edit release notes"
msgstr "Editați notele de lansare"
@@ -37571,7 +38237,7 @@ msgid "TagsPage|New tag"
msgstr "Etichetă nouă"
msgid "TagsPage|Only a project maintainer or owner can delete a protected tag"
-msgstr ""
+msgstr "Numai un întreținător sau un proprietar de proiect poate șterge o etichetă protejată."
msgid "TagsPage|Optionally, add a message to the tag. Leaving this blank creates a %{link_start}lightweight tag.%{link_end}"
msgstr "Opțional, adăugați un mesaj la etichetă. Lăsând acest spațiu necompletat, se creează o %{link_start}etichetă ușoară.%{link_end}"
@@ -37580,7 +38246,7 @@ msgid "TagsPage|Optionally, create a public Release of your project, based on th
msgstr "Opțional, creați o Lansare publică a proiectului dumneavoastră, bazată pe această etichetă. Notele de lansare sunt afișate pe pagina %{releases_page_link_start}Lansări%{link_end}. %{docs_link_start}Mai multe informații%{link_end}"
msgid "TagsPage|Please type the following to confirm:"
-msgstr ""
+msgstr "Vă rugăm să introduceți următoarele date pentru a confirma:"
msgid "TagsPage|Release notes"
msgstr "Note de lansare"
@@ -37610,28 +38276,28 @@ msgid "TagsPage|Write your release notes or drag files here…"
msgstr "Scrieți-vă notele de lansare sau trageți fișierele aici..."
msgid "TagsPage|Yes, delete protected tag"
-msgstr ""
+msgstr "Da, ștergeți eticheta protejată"
msgid "TagsPage|Yes, delete tag"
-msgstr ""
+msgstr "Da, ștergeți eticheta"
msgid "TagsPage|You're about to permanently delete the protected tag %{strongStart}%{tagName}.%{strongEnd}"
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți definitiv eticheta protejată %{strongStart}%{tagName}.%{strongEnd}"
msgid "TagsPage|You're about to permanently delete the tag %{strongStart}%{tagName}.%{strongEnd}"
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți definitiv eticheta %{strongStart}%{tagName}.%{strongEnd}"
msgid "TagsPage|protected"
msgstr "protejate"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
-msgstr ""
+msgstr "Consultați documentația pentru a descoperi toate capacitățile GitLab."
msgid "Target Branch"
msgstr "Ramura țintă"
msgid "Target Path"
-msgstr "Traiectoria țintă"
+msgstr "Calea de destinație"
msgid "Target branch"
msgstr "Ramura țintă"
@@ -37643,13 +38309,19 @@ msgid "Target roles"
msgstr "Roluri țintă"
msgid "Target-Branch"
-msgstr ""
+msgstr "Ramura-țintă"
msgid "Task"
msgstr "Sarcină"
msgid "Task ID: %{elastic_task}"
-msgstr ""
+msgstr "ID-ul sarcinii: %{elastic_task}"
+
+msgid "Task list"
+msgstr "Lista de sarcini"
+
+msgid "Task with ID: %{id} could not be found."
+msgstr "Sarcina cu ID-ul: %{id} nu a putut fi găsită."
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr "Creați/importați cod într-un proiect (repozitoriu)"
@@ -37661,10 +38333,10 @@ msgid "TasksToBeDone|Set up CI/CD pipelines to build, test, deploy, and monitor
msgstr "Configurați pipeline-uri CI/CD pentru a construi, testa, distribui și monitoriza codul"
msgid "Team"
-msgstr ""
+msgstr "Echipa"
msgid "Team domain"
-msgstr ""
+msgstr "Domeniul echipei"
msgid "TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated"
msgstr "Declanșează TeamCity CI după ce un merge request a fost creat sau actualizat"
@@ -37685,28 +38357,28 @@ msgid "TemplateRepository|Create common files more quickly, and standardize thei
msgstr "Creați mai rapid fișiere comune și standardizați formatul acestora."
msgid "Templates"
-msgstr ""
+msgstr "Șabloane"
msgid "TemporaryStorageIncrease|can only be set once"
-msgstr ""
+msgstr "poate fi setat numai o singură dată"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
-msgstr ""
+msgstr "poate fi setat numai cu mai mult de %{percentage}%% utilizare"
msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
+msgstr "GitLab vă permite o %{strongStart}unică creștere gratuită a capacității de stocare%{strongEnd}. Timp de 30 de zile, spațiul dvs. de stocare va fi nelimitat. Acest lucru vă oferă timp pentru a vă reduce utilizarea spațiului de stocare. După 30 de zile, se aplică limita de stocare inițială de %{limit}. Dacă sunteți la capacitatea maximă de stocare, contul dvs. va fi doar în citire. Pentru a continua să utilizați GitLab va trebui să achiziționați spațiu de stocare suplimentar sau să reduceți utilizarea spațiului de stocare."
msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
+msgstr "Măriți temporar stocarea"
msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
+msgstr "Măriți temporar spațiul de stocare acum?"
msgid "Terminal"
-msgstr ""
+msgstr "Terminal"
msgid "Terminal for environment"
-msgstr ""
+msgstr "Terminal pentru mediu"
msgid "Terminal sync service is running"
msgstr "Serviciul de sincronizare a terminalului rulează"
@@ -37898,7 +38570,7 @@ msgid "Terraform|Your project doesn't have any Terraform state files"
msgstr "Proiectul dvs. nu are niciun fișier de stare Terraform"
msgid "Test"
-msgstr ""
+msgstr "Test"
msgid "Test Cases"
msgstr "Cazuri de testare"
@@ -37919,7 +38591,7 @@ msgstr[1] "Coverage de teste: %d executate"
msgstr[2] "Coverage de teste: %d executate"
msgid "Test settings"
-msgstr ""
+msgstr "Setări de testare"
msgid "TestCases|Move test case"
msgstr "Mutați cazul de testare"
@@ -37937,7 +38609,7 @@ msgid "TestCases|Search test cases"
msgstr "Căutați cazuri de testare"
msgid "TestCases|Something went wrong while adding test case to a to-do item."
-msgstr "Ceva nu a mers bine în timp ce se adăuga un caz de testare la o sarcină „de făcutâ€."
+msgstr "Ceva nu a mers bine în timp ce se adăuga un caz de testare la o sarcină de-făcut."
msgid "TestCases|Something went wrong while creating a test case."
msgstr "Ceva nu a mers bine în timpul creării unui caz de testare."
@@ -37949,7 +38621,7 @@ msgid "TestCases|Something went wrong while fetching test cases list."
msgstr "Ceva nu a mers bine la preluarea listei de cazuri de testare."
msgid "TestCases|Something went wrong while marking test case to-do item as done."
-msgstr "Ceva nu a mers bine în timpul marcării sarcinii „de făcut†a cazului de testare ca fiind terminată."
+msgstr "Ceva nu a mers bine în timpul marcării sarcinii de-făcut a cazului de testare ca fiind terminată."
msgid "TestCases|Something went wrong while moving test case."
msgstr "Ceva nu a mers bine în timpul mutării cazului de testare."
@@ -37964,50 +38636,53 @@ msgid "TestCases|Submit test case"
msgstr "Trimiteți cazul de testare"
msgid "TestHooks|Ensure one of your projects has merge requests."
-msgstr ""
+msgstr "Asigurați-vă că unul dintre proiectele dvs. are merge request-uri."
msgid "TestHooks|Ensure the project has CI jobs."
-msgstr ""
+msgstr "Asigurați-vă că proiectul are joburi CI."
msgid "TestHooks|Ensure the project has CI pipelines."
-msgstr ""
+msgstr "Asigurați-vă că proiectul dvs. are pipeline-uri CI."
msgid "TestHooks|Ensure the project has deployments."
-msgstr ""
+msgstr "Asigurați-vă că proiectul are implementări."
msgid "TestHooks|Ensure the project has issues."
-msgstr ""
+msgstr "Asigurați-vă că proiectul are probleme."
msgid "TestHooks|Ensure the project has merge requests."
-msgstr ""
+msgstr "Asigurați-vă că proiectul are merge request-uri."
msgid "TestHooks|Ensure the project has notes."
-msgstr ""
+msgstr "Asigurați-vă că proiectul are note."
msgid "TestHooks|Ensure the project has releases."
-msgstr "Asigurați-vă că proiectul are lansări."
+msgstr "Asigurați-vă că proiectul are versiuni."
msgid "TestHooks|Ensure the wiki is enabled and has pages."
-msgstr ""
+msgstr "Asigurați-vă că wiki este activat și are pagini."
msgid "TestReports|%{count} errors"
-msgstr "%{count} erori"
+msgstr "erori - %{count}"
msgid "TestReports|%{count} failures"
-msgstr "%{count} eșecuri"
+msgstr "eșecuri - %{count}"
msgid "TestReports|%{count} tests"
-msgstr "%{count} teste"
+msgstr "test - %{count}"
msgid "TestReports|%{rate}%{sign} success rate"
-msgstr "rată de succes de %{rate}%{sign}"
+msgstr "rata de succes - %{rate}%{sign}"
msgid "TestReports|Attachment"
msgstr "Atașament"
-msgid "TestReports|Job artifacts are expired"
+msgid "TestReports|Copy test name to rerun locally"
msgstr ""
+msgid "TestReports|Job artifacts are expired"
+msgstr "Artefactele de job sunt expirate"
+
msgid "TestReports|Jobs"
msgstr "Joburi"
@@ -38021,7 +38696,7 @@ msgid "TestReports|No test cases were found in the test report."
msgstr "Nu au fost găsite cazuri de testare în raportul de testare."
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Rapoartele de testare necesită artefacte de job, dar toate artefactele sunt expirate. %{linkStart}Aflați mai multe%{linkEnd}"
msgid "TestReports|Tests"
msgstr "Teste"
@@ -38033,7 +38708,7 @@ msgid "TestReports|There are no test reports for this pipeline"
msgstr "Nu există rapoarte de testare pentru acest pipeline"
msgid "TestReports|There are no test suites to show."
-msgstr "Nu există serii de teste de afișat."
+msgstr "Nu există suite de testare de afișat."
msgid "TestReports|There are no tests to display"
msgstr "Nu există teste de afișat."
@@ -38042,64 +38717,61 @@ msgid "TestReports|There was an error fetching the summary."
msgstr "A apărut o eroare la preluarea rezumatului."
msgid "TestReports|There was an error fetching the test suite."
-msgstr "A apărut o eroare la preluarea seriei de teste."
+msgstr "A apărut o eroare la preluarea suitei de teste."
msgid "TestReports|You can configure your job to use unit test reports, and GitLab displays a report here and in the related merge request."
msgstr "Vă puteți configura jobul pentru a utiliza rapoartele de testare unitară, iar GitLab afișează un raport aici și în merge request-ul asociat."
msgid "Tests"
-msgstr ""
+msgstr "Teste"
msgid "Text (optional)"
-msgstr ""
+msgstr "Text (opțional)"
msgid "Text added to the body of all email messages. %{character_limit} character limit"
-msgstr ""
+msgstr "Text adăugat în corpul tuturor mesajelor de e-mail. Limita de %{character_limit} de caractere"
msgid "Text style"
-msgstr ""
+msgstr "Stil de text"
msgid "Thank you for your business."
-msgstr ""
+msgstr "Vă mulțumesc pentru afacerea dumneavoastră."
msgid "Thank you for your feedback!"
-msgstr ""
+msgstr "Vă mulțumim pentru feedbackul dumneavoastră!"
msgid "Thank you for your report. A GitLab administrator will look into it shortly."
msgstr "Vă mulțumim pentru raportul dumneavoastră. Un administrator GitLab se va ocupa de acesta în scurt timp."
msgid "Thank you for your support request! We are tracking your request as ticket #%{issue_iid}, and will respond as soon as we can."
-msgstr ""
+msgstr "Vă mulțumim pentru solicitarea de asistență! Urmărim solicitarea dvs. ca bilet nr.%{issue_iid}și vă vom răspunde cât mai curând posibil."
msgid "Thanks for signing up to GitLab!"
-msgstr ""
+msgstr "Vă mulțumim că v-ați înscris la GitLab!"
msgid "Thanks for your purchase!"
-msgstr ""
+msgstr "Vă mulțumim pentru achiziția dumneavoastră!"
msgid "That's OK, I don't want to renew"
-msgstr ""
+msgstr "E în regulă, nu vreau să reînnoiesc."
msgid "That's it, well done!"
-msgstr ""
-
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
+msgstr "Asta e tot, bine lucrat!"
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr "Modelul %{link_start}utilizatori peste licență (true-up)%{link_end} permite existența mai multor utilizatori, iar utilizatorilor suplimentari li se va percepe o taxă retroactivă la reînnoire."
msgid "The %{plan_name} is no longer available to purchase. For more information about how this will impact you, check our %{faq_link_start}frequently asked questions%{faq_link_end}."
-msgstr ""
+msgstr "%{plan_name} nu mai este disponibil pentru achiziționare. Pentru mai multe informații despre cum vă va afecta acest lucru, consultați %{faq_link_start}întrebările noastre frecvente (FAQ)%{faq_link_end}."
msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] "%{type} conține următoarea eroare:"
-msgstr[1] "%{type} conține următoarele erori:"
-msgstr[2] "%{type} conține următoarele erori:"
+msgstr[1] "%{type} conțin următoarele erori:"
+msgstr[2] "%{type} conțin următoarele erori:"
msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
-msgstr "Cheia API utilizată de GitLab pentru accesarea punctului final al serviciului Spam Check."
+msgstr "Cheia API utilizată de GitLab pentru accesarea punctului final al serviciului de Verificare spam."
msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
msgstr "Exportul CSV va fi creat în fundal. Odată terminat, acesta va fi trimis într-un atașament la %{email}."
@@ -38111,7 +38783,7 @@ msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr "Utilizatorul GitLab la care va fi mapat utilizatorul Jira %{jiraDisplayName}."
msgid "The ID of the application."
-msgstr ""
+msgstr "ID-ul aplicației."
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Trackerul de probleme este locul în care puteți adăuga lucruri care trebuie îmbunătățite sau rezolvate într-un proiect."
@@ -38120,16 +38792,16 @@ msgid "The Issue Tracker is the place to add things that need to be improved or
msgstr "Trackerul de probleme este locul în care puteți adăuga lucruri care trebuie îmbunătățite sau rezolvate într-un proiect. Vă puteți înregistra sau autentifica pentru a crea probleme pentru acest proiect."
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
+msgstr "Serverul Prometheus a răspuns cu „solicitare greÈ™ităâ€. Vă rugăm să verificaÈ›i dacă interogările dvs. sunt corecte È™i sunt acceptate în versiunea dvs. de Prometheus. %{documentationLink}"
msgid "The Snowplow cookie domain."
msgstr "Domeniul cookie-ului Snowplow."
msgid "The URL of the Jenkins server."
-msgstr ""
+msgstr "URL-ul serverului Jenkins."
msgid "The URL should start with http:// or https://"
-msgstr ""
+msgstr "URL-ul trebuie să înceapă cu http:// sau https://"
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr "URL-urile pentru conectarea la Elasticsearch. Pentru grupare în cluster, adăugați URL-urile separate prin virgule."
@@ -38141,7 +38813,7 @@ msgid "The application will be used where the client secret can be kept confiden
msgstr "Aplicația va fi folosită acolo unde secretul clientului poate fi păstrat confidențial. Aplicațiile mobile native și aplicațiile cu o singură pagină sunt considerate neconfidențiale."
msgid "The associated issue #%{issueId} has been closed as the error is now resolved."
-msgstr ""
+msgstr "Problema asociată #%{issueId} a fost închisă, deoarece eroarea a fost rezolvată."
msgid "The branch for this project has no active pipeline configuration."
msgstr "Ramura acestui proiect nu are o configurație de pipeline activă."
@@ -38153,19 +38825,19 @@ msgid "The broadcast message displays only to users in projects and groups who h
msgstr "Mesajul difuzat se afișează numai utilizatorilor din proiecte și grupuri care au aceste roluri."
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 ""
+msgstr "Evidențierea caracterelor vă ajută să păstrați linia subiectului la %{titleLength} de caractere și înfășoară corpul la %{bodyLength} astfel încât să poată fi lisibil în git."
msgid "The comment you are editing has been changed by another user. Would you like to keep your changes and overwrite the new description or discard your changes?"
msgstr "Comentariul pe care îl editați a fost modificat de un alt utilizator. Doriți să vă păstrați modificările și să suprascrieți noua descriere sau să renunțați la modificări?"
msgid "The commit does not exist"
-msgstr ""
+msgstr "Commit-ul nu există"
msgid "The comparison view may be inaccurate due to merge conflicts."
-msgstr ""
+msgstr "Vizualizarea comparativă poate fi inexactă din cauza conflictelor de îmbinare."
msgid "The complete DevOps platform. One application with endless possibilities. Organizations rely on GitLab’s source code management, CI/CD, security, and more to deliver software rapidly."
-msgstr ""
+msgstr "Platforma DevOps completă. O singură aplicație cu posibilități infinite. Organizațiile se bazează pe managementul codului sursă, CI/CD, securitate și multe altele de la GitLab pentru a livra rapid software."
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr "Raportul de conformitate arată încălcările merge request-urilor îmbinate în medii protejate."
@@ -38186,82 +38858,85 @@ msgid "The content for this wiki page failed to render."
msgstr "Conținutul acestei pagini wiki nu a putut fi redat."
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
-msgstr ""
+msgstr "Conținutul acestei pagini nu este codificat în UTF-8. Modificările pot fi efectuate numai prin intermediul depozitului Git."
msgid "The contents of this group, its subgroups and projects will be permanently removed after %{deletion_adjourned_period} days on %{date}. After this point, your data cannot be recovered."
msgstr "Conținutul acestui grup, al subgrupurilor și al proiectelor sale va fi înlăturat definitiv după %{deletion_adjourned_period} zile la %{date}. După acest moment, datele dvs. nu mai pot fi recuperate."
msgid "The current epic"
-msgstr ""
+msgstr "Epica actuală"
msgid "The current incident"
-msgstr ""
+msgstr "Incidentul actual"
msgid "The current issue"
-msgstr ""
+msgstr "Problema actuală"
msgid "The current user is not authorized to access the job log."
-msgstr ""
+msgstr "Utilizatorul curent nu este autorizat să acceseze jurnalul jobului."
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
-msgstr ""
+msgstr "Datele acestui pipeline sunt prea vechi pentru a fi redate sub formă de grafic. Vă rugăm să verificați fila Joburi pentru a accesa datele istorice."
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr ""
+msgstr "Sursa de date este conectată, dar nu există date de afișat. %{documentationLink}"
+
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr "Data la care versiunea este gata. O versiune cu o dată în viitor este etichetată ca fiind o %{linkStart}Versiune viitoare%{linkEnd}."
msgid "The default CI/CD configuration file and path for new projects."
msgstr "Fișierul de configurare CI/CD implicit și calea de acces pentru proiectele noi."
msgid "The default branch for this project has been changed. Please update your bookmarks."
-msgstr ""
+msgstr "Ramura implicită pentru acest proiect a fost modificată. Vă rugăm să vă actualizați marcajele."
msgid "The dependency list details information about the components used within your project."
-msgstr ""
+msgstr "Lista de dependențe conține informații detaliate despre componentele utilizate în cadrul proiectului dumneavoastră."
msgid "The deployment of this job to %{environmentLink} did not succeed."
-msgstr ""
+msgstr "Implementarea acestei sarcini în %{environmentLink} nu a reușit."
msgid "The directory has been successfully created."
-msgstr ""
+msgstr "Directorul a fost creat cu succes."
msgid "The domain you entered is misformatted."
-msgstr ""
+msgstr "Domeniul introdus este formatat greșit."
msgid "The domain you entered is not allowed."
-msgstr ""
+msgstr "Domeniul introdus nu este permis."
msgid "The download link will expire in 24 hours."
-msgstr ""
+msgstr "Linkul de descărcare va expira în 24 de ore."
-msgid "The environment tier must be one of %{environment_tiers}."
-msgstr ""
+msgid "The environment tiers must be from %{environment_tiers}."
+msgstr "Nivelurile de mediu trebuie să fie din %{environment_tiers}"
msgid "The errors we encountered were:"
-msgstr ""
+msgstr "Erorile pe care le-am întâlnit au fost:"
msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
-msgstr ""
+msgstr "Fișierul care conține exportul nu este încă disponibil; este posibil ca acesta să fie încă în curs de transfer. Vă rugăm să încercați din nou mai târziu."
msgid "The file could not be displayed because it is empty or larger than the maximum file size indexed (%{size})."
-msgstr ""
+msgstr "Fișierul nu a putut fi afișat deoarece este gol sau mai mare decât mărimea maximă a fișierului indexat (%{size})."
msgid "The file has been successfully created."
-msgstr ""
+msgstr "Fișierul a fost creat cu succes."
msgid "The file has been successfully deleted."
-msgstr ""
+msgstr "Fișierul a fost șters cu succes."
msgid "The file name should have a .yml extension"
msgstr "Numele fișierului trebuie să aibă extensia .yml."
msgid "The finding is not a vulnerability because it is part of a test or is test data."
-msgstr ""
+msgstr "Constatarea nu este o vulnerabilitate deoarece face parte dintr-un test sau din datele de testare."
msgid "The following %{user} can also merge into this branch: %{branch}"
-msgstr ""
+msgstr "Următorul %{user} poate, de asemenea, să îmbine în această ramură: %{branch}"
msgid "The following %{user} can also push to this branch: %{branch}"
-msgstr ""
+msgstr "Următorul %{user} poate, de asemenea, să facă push la această branșă: %{branch}"
msgid "The following Personal Access Token was revoked by an administrator, %{username}."
msgstr "Următorul token de acces personal a fost revocat de un administrator, %{username}."
@@ -38270,10 +38945,10 @@ msgid "The following SSH key was deleted by an administrator, %{username}."
msgstr "Următoarea cheie SSH a fost ștearsă de un administrator, %{username}."
msgid "The following items will NOT be exported:"
-msgstr ""
+msgstr "Următoarele elemente NU vor fi exportate:"
msgid "The following items will be exported:"
-msgstr ""
+msgstr "Următoarele elemente vor fi exportate:"
msgid "The following personal access token: %{token_names} was revoked, because a new policy to expire personal access tokens were set."
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
@@ -38286,9 +38961,9 @@ msgstr "Relația fork a fost eliminată."
msgid "The form contains the following error:"
msgid_plural "The form contains the following errors:"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Formularul conține următoarea eroare:"
+msgstr[1] "Formularul conține următoarele erori:"
+msgstr[2] "Formularul conține următoarele erori:"
msgid "The form contains the following warning:"
msgstr "Formularul conține următorul avertisment:"
@@ -38297,31 +38972,31 @@ msgid "The git server, Gitaly, is not available at this time. Please contact you
msgstr "Serverul git, Gitaly, nu este disponibil pentru moment. Vă rugăm să vă contactați administratorul."
msgid "The global settings require you to enable Two-Factor Authentication for your account."
-msgstr ""
+msgstr "Setările globale necesită activarea Autentificării cu doi factori pentru contul dumneavoastră."
msgid "The group and any internal projects can be viewed by any logged in user except external users."
-msgstr ""
+msgstr "Grupul și toate proiectele interne pot fi vizualizate de orice utilizator conectat, cu excepția utilizatorilor externi."
msgid "The group and any public projects can be viewed without any authentication."
-msgstr ""
+msgstr "Grupul și toate proiectele publice pot fi vizualizate fără nicio autentificare."
msgid "The group and its projects can only be viewed by members."
-msgstr ""
+msgstr "Grupul și proiectele sale pot fi vizualizate numai de către membri."
msgid "The group export can be downloaded from:"
-msgstr ""
+msgstr "Exportul grupului poate fi descărcat de la:"
msgid "The group has already been shared with this group"
-msgstr ""
+msgstr "Grupul menționat a fost deja partajat cu acest grup"
msgid "The group settings for %{group_links} require you to enable Two-Factor Authentication for your account. You can %{leave_group_links}."
-msgstr ""
+msgstr "Setările de grup pentru %{group_links} necesită activarea Autentificării cu doi factori pentru contul dumneavoastră. Puteți %{leave_group_links}."
msgid "The group_project_ids parameter is only allowed for a group"
-msgstr ""
+msgstr "Parametrul group_project_ids este permis numai pentru un grup"
msgid "The hostname of your PlantUML server."
-msgstr ""
+msgstr "Numele de gazdă al serverului PlantUML."
msgid "The hostname of your Snowplow collector."
msgstr "Numele de gazdă al colectorului Snowplow."
@@ -38330,34 +39005,34 @@ msgid "The import will time out after %{timeout}. For repositories that take lon
msgstr "Importul va expira după %{timeout}. Pentru repozitoriile care necesită mai mult timp, utilizați o combinație clonă/push."
msgid "The interval must be one of %{intervals}."
-msgstr ""
+msgstr "Intervalul trebuie să fie unul dintre %{intervals}."
msgid "The invitation can not be found with the provided invite token."
-msgstr ""
+msgstr "Invitația nu poate fi găsită cu tokenul de invitație furnizat."
msgid "The invitation could not be accepted."
-msgstr ""
+msgstr "Invitația nu a putut fi acceptată."
msgid "The invitation could not be declined."
-msgstr ""
+msgstr "Invitația nu a putut fi refuzată."
msgid "The invitation has already been accepted."
-msgstr ""
+msgstr "Invitația a fost deja acceptată."
msgid "The invitation was successfully resent."
-msgstr ""
+msgstr "Invitația a fost retrimisă cu succes."
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
-msgstr ""
+msgstr "Problema a fost promovată cu succes la o epică. Redirecționarea către epică..."
msgid "The last owner cannot be set to awaiting"
-msgstr ""
+msgstr "Ultimul proprietar nu poate fi setat în așteptare"
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
-msgstr ""
+msgstr "Ultimele artefacte create de joburile din cel mai recent pipeline de succes vor fi stocate."
msgid "The latest pipeline for this merge request did not complete successfully."
-msgstr ""
+msgstr "Cel mai recent pipeline pentru acest merge request nu s-a finalizat cu succes."
msgid "The latest pipeline for this merge request did not succeed. The latest changes are unverified."
msgstr "Cel mai recent pipeline pentru acest merge request nu a reușit. Cele mai recente modificări sunt neverificate."
@@ -38366,16 +39041,16 @@ msgid "The latest pipeline for this merge request has failed."
msgstr "Ultimul pipeline pentru acest merge request a eșuat."
msgid "The license key is invalid."
-msgstr ""
+msgstr "Cheia de licență nu este validă."
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
-msgstr ""
+msgstr "Cheia de licență nu este validă. Asigurați-vă că este exact așa cum ați primit-o de la GitLab Inc."
msgid "The license was removed. GitLab has fallen back on the previous license."
-msgstr ""
+msgstr "Licența a fost înlăturată. GitLab a revenit la licența anterioară."
msgid "The license was removed. GitLab now no longer has a valid license."
-msgstr ""
+msgstr "Licența a fost înlăturată. GitLab nu mai are acum o licență valabilă."
msgid "The license was successfully uploaded and is now active. You can see the details below."
msgstr "Licența a fost încărcată cu succes și este acum activă. Puteți vedea detaliile prezentate în continuare."
@@ -38384,13 +39059,16 @@ msgid "The license was successfully uploaded and will be active from %{starts_at
msgstr "Licența a fost încărcată cu succes și va fi activă de la %{starts_at}. Puteți vedea detaliile prezentate în continuare."
msgid "The license you uploaded is invalid. If the issue persists, contact support at %{link}."
-msgstr ""
+msgstr "Licența pe care ați încărcat-o nu este valabilă. Dacă problema persistă, contactați serviciul de asistență la %{link}."
msgid "The list creation wizard is already open"
msgstr "Expertul de creare a listei este deja deschis"
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr "Durata maximă de timp avută de utilizatori pentru a configura autentificarea cu doi factori înainte de a fi impusă."
+
msgid "The maximum file size allowed is %{size}."
-msgstr ""
+msgstr "Mărimea maximă permisă a fișierului este %{size}."
msgid "The maximum file size for job artifacts."
msgstr "Dimensiunea maximă a fișierului pentru artefactele de job."
@@ -38399,7 +39077,7 @@ msgid "The maximum file size in megabytes for individual job artifacts."
msgstr "Mărimea maximă a fișierului în megaocteți pentru artefactele individuale ale jobului."
msgid "The maximum file size is %{size}."
-msgstr ""
+msgstr "Mărimea maximă a fișierului este %{size}."
msgid "The maximum number of CI/CD minutes on shared runners that a group can use each month. 0 for unlimited."
msgstr "Numărul maxim de minute CI/CD pe executorii partajați care pot fi utilizate de un grup în fiecare lună. 0 pentru nelimitat."
@@ -38411,79 +39089,67 @@ msgid "The merge conflicts for this merge request cannot be resolved through Git
msgstr "Conflictele de îmbinare pentru acest merge request nu pot fi rezolvate prin GitLab. Încercați să le rezolvați pe plan local."
msgid "The merge conflicts for this merge request have already been resolved."
-msgstr ""
+msgstr "Conflictele de îmbinare pentru acest merge request au fost deja rezolvate."
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
-msgstr ""
+msgstr "Conflictele de îmbinare pentru acest merge request au fost deja rezolvate. Vă rugăm să reveniți la merge request."
msgid "The metric must be one of %{metrics}."
-msgstr ""
+msgstr "Metrica trebuie să fie una dintre %{metrics}."
msgid "The name \"%{name}\" is already taken in this directory."
-msgstr ""
+msgstr "Numele „%{name}†este deja luat în acest director."
msgid "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})."
msgstr "Numele fișierului de configurare CI/CD. Calea relativă la directorul rădăcină este opțională (de exemplu, %{code_open}my/path/.myfile.yml%{code_close})."
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
-msgstr ""
+msgstr "Numele proiectului Jenkins. Copiați numele de la sfârșitul URL-ului în proiect."
msgid "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"
-msgstr ""
-
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
+msgstr "Numărul de modificări care trebuie preluate din GitLab atunci când se clonează un repozitoriu. Valorile mai mici pot accelera execuția pipeline-ului. Setați la %{code_open}0%{code_close} sau necompletat pentru a prelua toate ramurile și etichetele pentru fiecare lucrare."
msgid "The number of merge requests merged by month."
msgstr "Numărul de merge request-uri îmbinate pe lună."
msgid "The number of times an upload record could not find its file"
-msgstr ""
+msgstr "De câte ori o înregistrare de încărcare nu a putut găsi fișierul său"
msgid "The page could not be displayed because it timed out."
-msgstr ""
+msgstr "Pagina nu a putut fi afișată deoarece a expirat."
msgid "The parent epic is confidential and can only contain confidential epics and issues"
msgstr "Epica părinte este confidențială și poate conține numai epice și probleme confidențiale."
msgid "The password for the Jenkins server."
-msgstr ""
+msgstr "Parola pentru serverul Jenkins."
msgid "The password for your GitLab account on %{gitlab_url} has successfully been changed."
-msgstr ""
+msgstr "Parola contului dvs. GitLab de la %{gitlab_url} a fost schimbată cu succes."
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
-msgstr ""
+msgstr "Parola contului dvs. GitLab de la %{link_to_gitlab} a fost schimbată cu succes."
msgid "The pipeline has been deleted"
-msgstr ""
+msgstr "Pipeline-ul a fost șters."
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 "Programul pipeline-urilor execută pipeline-uri în viitor, în mod repetat, pentru anumite ramuri sau etichete. Aceste pipeline-uri programate vor moșteni accesul limitat la proiect în funcție de utilizatorul asociat."
msgid "The project can be accessed by any logged in user except external users."
-msgstr ""
-
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
+msgstr "Proiectul poate fi accesat de orice utilizator conectat, cu excepția utilizatorilor externi."
msgid "The project can be accessed without any authentication."
-msgstr ""
+msgstr "Proiectul poate fi accesat fără nicio autentificare."
msgid "The project has already been added to your dashboard."
msgstr "Proiectul a fost deja adăugat la dashboard-ul dumneavoastră."
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr "Proiectul este accesibil numai membrilor proiectului. Accesul trebuie să fie acordat în mod explicit fiecărui utilizator."
-
msgid "The project is still being deleted. Please try again later."
-msgstr ""
+msgstr "Proiectul este încă în curs de ștergere. Vă rugăm să încercați din nou mai târziu."
msgid "The project size exceeds the export limit."
-msgstr ""
+msgstr "Mărimea proiectului depășește limita de export."
msgid "The project was successfully forked."
msgstr "Crearea forkului de proiect s-a făcut cu succes."
@@ -38513,19 +39179,19 @@ msgid "The repository can be committed to, and issues, comments and other entiti
msgstr "Se pot face commit-uri în acest repozitoriu și pot fi create probleme, comentarii și alte entități."
msgid "The repository for this project does not exist."
-msgstr ""
+msgstr "Repozitoriul pentru acest proiect nu există."
msgid "The repository for this project is empty"
msgstr "Repozitoriul pentru acest proiect este gol"
msgid "The repository is being updated..."
-msgstr ""
+msgstr "Repozitoriul este în curs de actualizare..."
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}."
-msgstr ""
+msgstr "Repozitoriul trebuie să fie accesibil prin %{code_open}http://%{code_close}, %{code_open}https://%{code_close} sau %{code_open}git://%{code_close}."
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 ""
+msgstr "Repozitoriul trebuie să fie accesibil prin %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} sau %{code_open}git://%{code_close}."
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 "Același executor partajat execută cod din mai multe proiecte, numai dacă nu configurați scalarea automată cu %{link} setat la 1 (care este pe GitLab.com)."
@@ -38549,10 +39215,10 @@ msgid "The source project of this merge request has been removed."
msgstr "Proiectul sursă al acestui merge request a fost înlăturat."
msgid "The specified tab is invalid, please select another"
-msgstr ""
+msgstr "Fila specificată nu este validă, vă rugăm să selectați alta"
msgid "The start date must be ealier than the end date."
-msgstr ""
+msgstr "Data de început trebuie să fie mai devreme decât data de sfârșit."
msgid "The subject will be used as the title of the new issue, and the message will be the description. %{quickActionsLinkStart}Quick actions%{quickActionsLinkEnd} and styling with %{markdownLinkStart}Markdown%{markdownLinkEnd} are supported."
msgstr "Subiectul va fi folosit ca titlu al noii probleme, iar mesajul va fi descrierea. Sunt acceptate %{quickActionsLinkStart}acțiunile rapide%{quickActionsLinkEnd} și formatarea cu %{markdownLinkStart}Markdown%{markdownLinkEnd}."
@@ -38561,13 +39227,13 @@ msgid "The tag name can't be changed for an existing release."
msgstr "Numele etichetei nu poate fi modificat pentru o versiune existentă."
msgid "The time period in seconds that the maximum requests per project limit applies to."
-msgstr ""
+msgstr "Perioada de timp în secunde la care se aplică limita maximă de solicitări pe proiect."
msgid "The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination."
-msgstr ""
+msgstr "Acțiunea de actualizare se va încheia după %{number_of_minutes} (de) minute. Pentru repozitoriile mari, folosiți o combinație clonă/push."
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
-msgstr ""
+msgstr "Fișierul încărcat nu era valid. Extensiile de fișiere acceptate sunt %{extensions}."
msgid "The user is being deleted."
msgstr "Utilizatorul este șters."
@@ -38579,7 +39245,7 @@ msgid "The user map is a mapping of the FogBugz users that participated on your
msgstr "Harta utilizatorilor este o mapare a utilizatorilor FogBugz care au participat la proiectele dvs., la modul în care adresa lor de email și numele de utilizator vor fi importate în GitLab. Puteți schimba acest lucru populând tabelul de mai jos."
msgid "The user you are trying to approve is not pending approval"
-msgstr ""
+msgstr "Utilizatorul pe care încercați să-l aprobați nu este în așteptarea aprobării"
msgid "The user you are trying to deactivate has been active in the past %{minimum_inactive_days} days and cannot be deactivated"
msgstr "Utilizatorul pe care încercați să îl dezactivați a fost activ în ultimele %{minimum_inactive_days} (de) zile și nu poate fi dezactivat."
@@ -38588,49 +39254,49 @@ msgid "The username for the Jenkins server."
msgstr "Numele de utilizator pentru serverul Jenkins."
msgid "The value of the provided variable exceeds the %{count} character limit"
-msgstr ""
+msgstr "Valoarea variabilei furnizate depășește limita de %{count} de caractere."
msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be an acceptable business risk."
-msgstr ""
+msgstr "Vulnerabilitatea este cunoscută și nu a fost remediată sau atenuată, dar este considerată a fi un risc de afaceri acceptabil."
msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be in a part of the application that will not be updated."
-msgstr "Această vulnerabilitate este cunoscută și nu a fost remediată sau atenuată, dar este considerată a fi o parte a aplicației care nu va fi actualizată."
+msgstr "Vulnerabilitatea este cunoscută și nu a fost remediată sau diminuată, dar se consideră că se află într-o parte a aplicației care nu va fi actualizată."
msgid "The vulnerability is no longer detected. Verify the vulnerability has been fixed or removed before changing its status."
msgstr "Vulnerabilitatea nu mai este detectată. Verificați dacă vulnerabilitatea a fost remediată sau eliminată înainte de a-i schimba starea."
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
-msgstr ""
+msgstr "Vulnerabilitatea nu mai este detectată. Verificați dacă vulnerabilitatea a fost remediată înainte de a-i schimba starea."
msgid "Theme"
msgstr "Tema"
msgid "There are currently no events."
-msgstr ""
+msgstr "În prezent nu există evenimente."
msgid "There are merge conflicts"
-msgstr ""
+msgstr "Există conflicte de îmbinare"
msgid "There are no %{replicableTypeName} to show"
-msgstr ""
+msgstr "Nu există niciun/nicio %{replicableTypeName} de afișat"
msgid "There are no GPG keys associated with this account."
-msgstr ""
+msgstr "Nu există chei GPG asociate cu acest cont."
msgid "There are no GPG keys with access to your account."
-msgstr ""
+msgstr "Nu există chei GPG cu acces la contul dumneavoastră."
msgid "There are no SSH keys associated with this account."
-msgstr ""
+msgstr "Nu există chei SSH asociate cu acest cont."
msgid "There are no SSH keys with access to your account."
-msgstr ""
+msgstr "Nu există chei SSH cu acces la contul dumneavoastră."
msgid "There are no Spam Logs"
-msgstr ""
+msgstr "Nu există jurnale de spam"
msgid "There are no abuse reports!"
-msgstr ""
+msgstr "Nu există rapoarte de abuz!"
msgid "There are no archived projects yet"
msgstr "Nu există încă proiecte arhivate"
@@ -38642,54 +39308,57 @@ msgid "There are no archived test cases"
msgstr "Nu există cazuri de testare arhivate"
msgid "There are no changes"
-msgstr ""
+msgstr "Nu există modificări"
msgid "There are no charts configured for this page"
msgstr "Nu sunt configurate grafice pentru această pagină"
msgid "There are no closed epics"
-msgstr ""
+msgstr "Nu există epice închise"
msgid "There are no closed issues"
-msgstr ""
+msgstr "Nu există probleme închise"
msgid "There are no closed merge requests"
msgstr "Nu există merge request-uri închise"
msgid "There are no commits yet."
-msgstr ""
+msgstr "Nu există încă niciun commit."
msgid "There are no custom project templates set up for this GitLab instance. They are enabled from GitLab's Admin Area. Contact your GitLab instance administrator to setup custom project templates."
msgstr "Nu sunt configurate șabloane de proiect personalizate pentru această instanță GitLab. Acestea se activează din Zona Admin a GitLab. Contactați administratorul instanței dvs. GitLab pentru a configura șabloane de proiect personalizate."
msgid "There are no issues to show"
-msgstr ""
+msgstr "Nu există probleme de afișat"
msgid "There are no issues with the selected labels"
-msgstr ""
+msgstr "Nu există probleme cu etichetele selectate"
msgid "There are no matching files"
msgstr "Nu există nicio potrivire de fișiere"
msgid "There are no open epics"
-msgstr ""
+msgstr "Nu există epice deschise"
msgid "There are no open issues"
-msgstr ""
+msgstr "Nu există probleme deschise"
msgid "There are no open merge requests"
msgstr "Nu există merge request-uri deschise"
msgid "There are no open requirements"
-msgstr ""
+msgstr "Nu există cerințe deschise"
msgid "There are no open test cases"
msgstr "Nu există cazuri de testare deschise"
msgid "There are no packages yet"
-msgstr ""
+msgstr "Nu există încă pachete"
msgid "There are no projects shared with this group yet"
+msgstr "Nu există încă proiecte partajate cu acest grup"
+
+msgid "There are no secure files yet."
msgstr ""
msgid "There are no topics to show."
@@ -38699,118 +39368,124 @@ msgid "There are no variables yet."
msgstr "Nu există încă variabile."
msgid "There are running deployments on the environment. Please retry later."
-msgstr ""
+msgstr "Există implementări în curs pe acest mediu. Vă rugăm să încercați din nou mai târziu."
msgid "There are several file size limits in place for the Package Registry."
-msgstr ""
+msgstr "Există mai multe limite de mărime a fișierelor pentru Registrul de pachete."
msgid "There are several rate limits in place to protect the system."
msgstr "Există mai multe limite de rată pentru a proteja sistemul."
msgid "There are several size limits in place."
-msgstr ""
+msgstr "Există mai multe limite de mărime în vigoare."
msgid "There is already a repository with that name on disk"
-msgstr ""
+msgstr "Există deja un repozitoriu cu acest nume pe disc"
msgid "There is already a to-do item for this design."
-msgstr "Există deja o sarcină „de făcut†pentru acest design."
+msgstr "Există deja o sarcină de-făcut pentru acest element de design."
msgid "There is no chart data available."
msgstr "Nu sunt disponibile date grafice."
msgid "There is no data available."
-msgstr ""
+msgstr "Nu există date disponibile."
msgid "There is no data available. Please change your selection."
-msgstr ""
+msgstr "Nu există date disponibile. Vă rugăm să schimbați selecția."
msgid "There is no seat left to activate the member"
-msgstr ""
+msgstr "Nu mai există niciun seat pentru a activa membrul"
msgid "There is no table data available."
-msgstr ""
+msgstr "Nu există date de tabel disponibile."
msgid "There is too much data to calculate. Please change your selection."
-msgstr ""
+msgstr "Există prea multe date de calculat. Vă rugăm să schimbați selecția."
msgid "There was a problem communicating with your device."
-msgstr ""
+msgstr "A existat o problemă de comunicare cu dispozitivul dumneavoastră."
+
+msgid "There was a problem fetching CRM contacts."
+msgstr "A apărut o problemă la preluarea contactelor CRM."
+
+msgid "There was a problem fetching CRM organizations."
+msgstr "A apărut o problemă la preluarea organizațiilor CRM."
msgid "There was a problem fetching branches."
-msgstr ""
+msgstr "A existat o problemă la preluarea branșelor."
msgid "There was a problem fetching emojis."
msgstr "A apărut o problemă la preluarea emojiurilor."
msgid "There was a problem fetching epics."
-msgstr ""
+msgstr "A existat o problemă la preluarea epicelor."
msgid "There was a problem fetching groups."
-msgstr ""
+msgstr "A existat o problemă la preluarea grupurilor."
msgid "There was a problem fetching iterations."
-msgstr ""
+msgstr "A existat o problemă la preluarea iterațiilor."
msgid "There was a problem fetching labels."
-msgstr ""
+msgstr "A existat o problemă la preluarea etichetelor."
msgid "There was a problem fetching linked pipelines."
-msgstr ""
+msgstr "A existat o problemă la preluarea pipeline-urilor conectate."
msgid "There was a problem fetching milestones."
-msgstr ""
+msgstr "A apărut o problemă la preluarea obiectivelor."
msgid "There was a problem fetching project branches."
-msgstr ""
+msgstr "A existat o problemă la preluarea ramurilor proiectului."
msgid "There was a problem fetching project tags."
-msgstr ""
+msgstr "A existat o problemă la preluarea etichetelor proiectului."
msgid "There was a problem fetching project users."
-msgstr ""
+msgstr "A existat o problemă la preluarea utilizatorilor proiectului."
msgid "There was a problem fetching recent groups."
-msgstr "A apărut o problemă în timpul preluării grupurilor recente."
+msgstr "A apărut o problemă la preluarea grupurilor recente."
msgid "There was a problem fetching recent projects."
-msgstr "A apărut o problemă în timpul preluării proiectelor recente."
+msgstr "A apărut o problemă la preluarea proiectelor recente."
msgid "There was a problem fetching releases."
msgstr "A apărut o problemă la preluarea versiunilor."
msgid "There was a problem fetching the job token scope value"
-msgstr "A apărut o problemă în timpul preluării valorii domeniului de aplicare al tokenului jobului"
+msgstr "A apărut o problemă la preluarea valorii domeniului tokenului jobului"
msgid "There was a problem fetching the keep latest artifacts setting."
-msgstr ""
+msgstr "A existat o problemă la preluarea setării de păstrare a celor mai recente artefacte."
msgid "There was a problem fetching the latest pipeline status."
msgstr "A apărut o problemă la preluarea ultimului statut al pipeline-ului."
msgid "There was a problem fetching the pipeline stages."
-msgstr "A apărut o problemă la preluarea etapelor pipeline."
+msgstr "A apărut o problemă la preluarea etapelor de pipeline."
msgid "There was a problem fetching the projects"
-msgstr "A apărut o problemă în timpul preluării proiectelor"
+msgstr "A apărut o problemă la preluarea proiectelor"
msgid "There was a problem fetching users."
-msgstr ""
+msgstr "A existat o problemă la preluarea utilizatorilor."
msgid "There was a problem handling the pipeline data."
msgstr "A apărut o problemă în manipularea datelor pipeline."
msgid "There was a problem sending the confirmation email"
-msgstr ""
+msgstr "A existat o eroare la trimiterea e-mailului de confirmare"
msgid "There was a problem updating the keep latest artifacts setting."
-msgstr ""
+msgstr "A existat o problemă la actualizarea setării de păstrare a celor mai recente artefacte."
msgid "There was an error %{message} to-do item."
-msgstr "A apărut o eroare %{message} elementului de-făcut."
+msgstr "A apărut o eroare %{message} sarcinii de-făcut."
msgid "There was an error adding a To Do."
-msgstr "S-a produs o eroare la adăugarea unui De Făcut"
+msgstr "S-a produs o eroare la adăugarea unui element De Făcut"
msgid "There was an error creating the dashboard, branch name is invalid."
msgstr "A apărut o eroare la crearea dashboard-ului, numele ramurii este invalid."
@@ -38822,7 +39497,7 @@ msgid "There was an error creating the issue"
msgstr "A apărut o eroare la crearea problemei"
msgid "There was an error deleting the To Do."
-msgstr "A apărut o eroare la ștergerea unui De Făcut."
+msgstr "A apărut o eroare la ștergerea unui element De Făcut"
msgid "There was an error fetching configuration for charts"
msgstr "A apărut o eroare la preluarea configurației pentru grafice"
@@ -38837,7 +39512,7 @@ msgid "There was an error fetching label data for the selected group"
msgstr "A apărut o eroare la preluarea datelor despre etichete pentru grupul selectat"
msgid "There was an error fetching median data for stages"
-msgstr "A apărut o eroare la preluarea datelor mediane pentru etape"
+msgstr "A apărut o eroare la preluarea datelor medii pentru etape"
msgid "There was an error fetching projects"
msgstr "A apărut o eroare la preluarea proiectelor"
@@ -38864,7 +39539,7 @@ msgid "There was an error fetching the variables."
msgstr "A apărut o eroare la preluarea variabilelor."
msgid "There was an error fetching value stream analytics stages."
-msgstr "A apărut o eroare la preluarea etapelor de analiză value stream."
+msgstr "A apărut o eroare la preluarea etapelor de analiză a fluxului de valori."
msgid "There was an error gathering the chart data"
msgstr "A apărut o eroare la colectarea datelor graficului"
@@ -38936,13 +39611,13 @@ msgid "There was an error while fetching the table data. Please refresh the page
msgstr "A survenit o eroare la preluarea datelor din tabel. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "There was an error while fetching value stream analytics data."
-msgstr "A apărut o eroare la preluarea datelor de analiză value stream."
+msgstr "S-a produs o eroare în timpul preluării datelor de analiză a fluxului de valori."
msgid "There was an error while fetching value stream analytics duration data."
-msgstr "A apărut o eroare în timpul preluării datelor privind durata analizei value stream."
+msgstr "S-a produs o eroare în timpul preluării datelor privind durata analizei fluxului de valori."
msgid "There was an error while fetching value stream summary data."
-msgstr "A apărut o eroare la preluarea datelor de analiză value stream."
+msgstr "S-a produs o eroare la preluarea datelor de sinteză a fluxului de valori."
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "A apărut o eroare cu reCAPTCHA. Vă rugăm să rezolvați din nou reCAPTCHA."
@@ -38954,7 +39629,7 @@ msgid "These examples show how to trigger this project's pipeline for a branch o
msgstr "Aceste exemple arată cum se declanșează pipeline-ul acestui proiect pentru o ramură sau o etichetă."
msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
-msgstr ""
+msgstr "Aceste probleme existente au un titlu similar. Ar fi mai bine să comentați acolo în loc să creați o altă problemă similară."
msgid "These runners are shared across projects in this group."
msgstr "Acești executori sunt partajați între proiectele din acest grup."
@@ -38966,22 +39641,22 @@ msgid "These runners are specific to this project."
msgstr "Acești executori sunt specifici pentru acest proiect."
msgid "These variables are inherited from the parent group."
-msgstr ""
+msgstr "Aceste variabile sunt moștenite de la grupul părinte."
msgid "These will be sent to %{email} in an attachment once finished."
-msgstr ""
+msgstr "Acestea vor fi trimise la %{email} într-un atașament, odată terminate."
msgid "Things to be aware of before transferring:"
msgstr "Lucruri de care trebuie să fiți conștienți înainte de transfer:"
msgid "Third Party Advisory Link"
-msgstr ""
+msgstr "Link de consultanță terță parte"
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
-msgstr ""
+msgstr "Acest/această %{issuableDisplayName} este blocat(ă). Numai membrii proiectului pot comenta."
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
-msgstr ""
+msgstr "Acest/această %{issuable} este blocat(ă). Numai %{strong_open}membrii proiectului%{strong_close} pot comenta."
msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr "Acest/această %{noteableTypeText} este %{confidentialLinkStart}confidențial(ă)%{confidentialLinkEnd} și este %{lockedLinkStart}blocat(ă)%{lockedLinkEnd}."
@@ -38990,10 +39665,10 @@ msgid "This %{noteableTypeText} is locked."
msgstr "Acest/această %{noteableTypeText} este blocat(ă)."
msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead."
-msgstr "Acest %{viewer} nu a putut fi afișat din cauza %{reason}. În schimb, poți să ai %{options}."
+msgstr "Acest %{viewer} nu a putut fi afișat deoarece %{reason}. Puteți %{options} în schimb."
msgid "This Cron pattern is invalid"
-msgstr ""
+msgstr "Acest model Cron nu este valid"
msgid "This GitLab instance does not provide any shared runners yet. Instance administrators can register shared runners in the admin area."
msgstr "Această instanță GitLab nu oferă încă niciun executor partajat. Administratorii instanței pot înregistra executorii partajați în zona admin."
@@ -39011,7 +39686,7 @@ msgid "This URL already exists."
msgstr "Acest URL există deja."
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
-msgstr ""
+msgstr "Această acțiune poate duce la pierderea de date. Pentru a preveni acțiunile accidentale, vă rugăm să vă confirmați intenția."
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr "Această acțiune nu poate fi anulată și va șterge definitiv cheia SSH %{key}"
@@ -39026,7 +39701,7 @@ msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose}
msgstr "Această acțiune șterge %{codeOpen}%{project_path_with_namespace}%{codeClose} pe %{date} și tot ce conține acest proiect. %{strongOpen}Nu există cale de întoarcere.%{strongClose}"
msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
-msgstr ""
+msgstr "Această acțiune va %{strongOpen}înlătura definitiv%{strongClose} și %{strongOpen}imediat%{strongClose} %{codeOpen}%{group}%{codeClose}."
msgid "This also resolves all related threads"
msgstr "Aceasta rezolvă, de asemenea, toate subiectele conexe"
@@ -39035,31 +39710,31 @@ msgid "This also resolves this thread"
msgstr "Aceasta rezolvă și acest subiect"
msgid "This application was created by %{user_link}."
-msgstr ""
+msgstr "Această aplicație a fost creată de %{user_link}."
msgid "This application was created for group %{group_link}."
-msgstr ""
+msgstr "Această aplicație a fost creată pentru grupul %{group_link}."
msgid "This application will be able to:"
-msgstr ""
+msgstr "Această aplicație va putea:"
msgid "This archive has been requested too many times. Try again later."
msgstr "Această arhivă a fost solicitată de prea multe ori. Încercați din nou mai târziu."
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{count} %{issuables} have been included. Consider re-exporting with a narrower selection of %{issuables}."
-msgstr "Acest atașament a fost trunchiat pentru a evita depășirea dimensiunii maxime admise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{count} %{issuables}. Luați în considerare reexportarea cu o selecție mai restrânsă de %{issuables}."
+msgstr "Acest atașament a fost trunchiat pentru a evita depășirea mărimii maxime admise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{count} %{issuables}. Luați în considerare reexportarea cu o selecție mai restrânsă de %{issuables}."
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{issues_count} issues have been included. Consider re-exporting with a narrower selection of issues."
-msgstr "Acest atașament a fost trunchiat pentru a evita depășirea dimensiunii maxime permise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{issues_count} probleme. Luați în considerare reexportarea cu o selecție mai restrânsă de probleme."
+msgstr "Acest atașament a fost trunchiat pentru a evita depășirea mărimii maxime permise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{issues_count} probleme. Luați în considerare reexportarea cu o selecție mai restrânsă de probleme."
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{merge_requests_count} merge requests have been included. Consider re-exporting with a narrower selection of merge requests."
-msgstr "Acest atașament a fost trunchiat pentru a evita depășirea dimensiunii maxime permise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{merge_requests_count} merge request-uri. Luați în considerare reexportarea cu o selecție mai restrânsă de merge request-uri."
+msgstr "Acest atașament a fost trunchiat pentru a evita depășirea mărimii maxime permise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{merge_requests_count} merge request-uri. Luați în considerare reexportarea cu o selecție mai restrânsă de merge request-uri."
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{requirements_count} requirements have been included. Consider re-exporting with a narrower selection of requirements."
-msgstr "Acest atașament a fost trunchiat pentru a evita depășirea dimensiunii maxime permise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{requirements_count} cerințe. Luați în considerare reexportarea cu o selecție mai restrânsă de cerințe."
+msgstr "Acest atașament a fost trunchiat pentru a evita depășirea mărimii maxime permise a atașamentului de %{size_limit}. Au fost incluse %{written_count} din %{requirements_count} cerințe. Luați în considerare reexportarea cu o selecție mai restrânsă de cerințe."
msgid "This block is self-referential"
-msgstr ""
+msgstr "Acest bloc este autoreferențial"
msgid "This board's scope is reduced"
msgstr "Acest bord a fost restrâns în scop"
@@ -39092,16 +39767,16 @@ msgid "This commit was signed with a verified signature, but the committer email
msgstr "Acest commit a fost semnat cu o semnătură verificată, dar nu s-a %{strong_open}verificat%{strong_close} dacă adresa de e-mail a comitentului aparține aceluiași utilizator."
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
-msgstr ""
+msgstr "Acest commit a fost semnat cu o semnătură %{strong_open}neverificată%{strong_close}."
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
-msgstr ""
+msgstr "Acest conținut nu a putut fi afișat deoarece %{reason}. În schimb, puteți %{options}."
msgid "This content could not be displayed because it is stored in LFS. You can %{linkStart}download it%{linkEnd} instead."
msgstr "Acest conținut nu a putut fi afișat deoarece este stocat în LFS. În schimb, îl puteți %{linkStart}descărca%{linkEnd}."
msgid "This credential has expired"
-msgstr ""
+msgstr "Această acreditare a expirat"
msgid "This deployment is not waiting for approvals."
msgstr "Această implementare nu este în așteptarea aprobărilor."
@@ -39110,37 +39785,37 @@ msgid "This deployment job does not run automatically and must be started manual
msgstr "Acest job de implementare nu se execută automat și trebuie pornit manual, dar nu aveți acces la mediul protejat al acestui job. Jobul poate fi inițiat numai de un membru al proiectului care are permisiunea de implementare în mediul respectiv."
msgid "This device has already been registered with us."
-msgstr ""
+msgstr "Acest dispozitiv a fost deja înregistrat la noi."
msgid "This device has not been registered with us."
-msgstr ""
+msgstr "Acest dispozitiv nu a fost înregistrat la noi."
msgid "This diff is collapsed."
msgstr "Acest diff este restrâns."
msgid "This directory"
-msgstr ""
+msgstr "Acest director"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
-msgstr ""
+msgstr "Acest domeniu nu este confirmat. Va trebui să verificați calitatea de proprietar înainte de activarea accesului."
msgid "This email supersedes any previous emails about scheduled deletion you may have received for %{project_link}."
-msgstr ""
+msgstr "Acest e-mail înlocuiește toate e-mailurile anterioare despre ștergerea programată pe care le-ați primit pentru %{project_link}."
msgid "This email supersedes any previous emails about scheduled deletion you may have received for %{project_name}."
-msgstr ""
+msgstr "Acest e-mail înlocuiește toate e-mailurile anterioare despre ștergerea programată pe care le-ați primit pentru %{project_name}."
msgid "This endpoint has been requested too many times. Try again later."
-msgstr ""
+msgstr "Acest punct final a fost solicitat de prea multe ori. Încercați din nou mai târziu."
msgid "This environment has no deployments yet."
-msgstr ""
+msgstr "Acest mediu nu are încă implementări."
msgid "This environment is being deployed"
-msgstr ""
+msgstr "Acest mediu este în curs de desfășurare"
msgid "This environment is being re-deployed"
-msgstr ""
+msgstr "Acest mediu este în curs de redesfășurare"
msgid "This environment is not protected."
msgstr "Acest mediu nu este protejat."
@@ -39149,10 +39824,10 @@ msgid "This environment's canary ingress has been updated recently. Please retry
msgstr "Canary ingress al acestui mediu a fost actualizat recent. Vă rugăm să încercați din nou mai târziu."
msgid "This epic already has the maximum number of child epics."
-msgstr ""
+msgstr "Această epică are deja numărul maxim de epice copil."
msgid "This epic does not exist or you don't have sufficient permission."
-msgstr ""
+msgstr "Această epică nu există sau nu aveți permisiunea suficientă."
msgid "This epic would exceed maximum number of related epics."
msgstr "Această epică ar depăși numărul maxim de epice conexe."
@@ -39164,7 +39839,7 @@ msgid "This field is required"
msgstr "Acest câmp este obligatoriu"
msgid "This field is required."
-msgstr ""
+msgstr "Acest câmp este obligatoriu."
msgid "This file was modified for readability, and can't accept suggestions. Edit it directly."
msgstr "Acest fișier a fost modificat pentru lizibilitate și nu poate accepta sugestii. Modificați-l direct."
@@ -39173,13 +39848,13 @@ msgid "This form is disabled in preview"
msgstr "Acest formular este dezactivat în previzualizare"
msgid "This group"
-msgstr ""
+msgstr "Acest grup"
msgid "This group and its subgroups and projects will be placed in a 'pending deletion' state for %{deletion_adjourned_period} days, then permanently deleted on %{date}. The group can be fully restored before that date."
msgstr "Acest grup împreună cu subgrupurile și proiectele sale vor fi plasate în starea „în așteptare de ștergere†timp de %{deletion_adjourned_period} zile, apoi vor fi șterse definitiv la %{date}. Grupul poate fi restaurat complet înainte de această dată."
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 ""
+msgstr "Acest grup nu poate fi înlăturat deoarece este legat de un abonament. Pentru a înlătura acest grup, %{linkStart}conectați abonamentul%{linkEnd} cu un alt grup."
msgid "This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group."
msgstr "Acest grup nu poate fi transferat deoarece este conectat la un abonament. Pentru a transfera acest grup, %{linkStart}conectați abonamentul%{linkEnd} cu un alt grup."
@@ -39191,19 +39866,19 @@ msgid "This group does not have any group runners yet."
msgstr "Acest grup nu are încă niciun executor de grup"
msgid "This group has been scheduled for permanent removal on %{date}"
-msgstr ""
+msgstr "Acest grup a fost programat pentru înlăturare permanentă la %{date}."
msgid "This group has no active access tokens."
msgstr "Acest grup nu are tokenuri de acces active."
msgid "This group is linked to a subscription"
-msgstr ""
+msgstr "Acest grup este legat de un abonament"
msgid "This group is not permitted to create compliance violations"
msgstr "Acest grup nu este autorizat să creeze încălcări ale conformității"
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
-msgstr ""
+msgstr "Acest grup, subgrupurile și proiectele sale au fost programate pentru înlăturare la %{date}."
msgid "This group, its subgroups and projects will be removed on %{date} since its parent group '%{parent_group_name}' has been scheduled for removal."
msgstr "Acest grup, subgrupurile și proiectele sale vor fi eliminate la %{date}, deoarece grupul său părinte „%{parent_group_name}†a fost programat pentru înlăturare."
@@ -39212,25 +39887,25 @@ msgid "This incident is already escalated with '%{escalation_policy_name}'."
msgstr "Acest incident este deja escaladat cu „%{escalation_policy_name}â€."
msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
-msgstr ""
+msgstr "Această invitație a fost trimisă la %{mail_to_invite_email}, dar dvs. sunteți autentificat ca %{link_to_current_user} cu adresa de e-mail %{mail_to_current_user}."
msgid "This is a \"Ghost User\", created to hold all issues authored by users that have since been deleted. This user cannot be removed."
msgstr "Acesta este un „Utilizator fantomăâ€, creat pentru a reÈ›ine toate problemele create de utilizatorii care au fost È™terÈ™i între timp. Acest utilizator nu poate fi eliminat."
msgid "This is a Jira user."
-msgstr ""
+msgstr "Acesta este un utilizator Jira."
msgid "This is a confidential %{noteableTypeText}."
msgstr "Acesta/aceasta este un/o %{noteableTypeText} confidențial(ă)."
msgid "This is a delayed job to run in %{remainingTime}"
-msgstr ""
+msgstr "Acesta este un job întârziat care va rula în %{remainingTime}"
msgid "This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize."
-msgstr ""
+msgstr "Aceasta este o listă a dispozitivelor care s-au conectat la contul dumneavoastră. Revocați orice sesiune pe care nu o recunoașteți."
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 ""
+msgstr "Aceasta este un e-mail privat %{helpIcon} generat doar pentru dumneavoastră. Oricine îl are poate crea probleme sau merge request-uri ca și cum ar fi în locul dumneavoastră. Dacă se întâmplă acest lucru, %{resetLinkStart}resetați acest token%{resetLinkEnd}."
msgid "This is a security log of authentication events involving your account."
msgstr "Acesta este un jurnal de securitate al evenimentelor de autentificare implicând contul dumneavoastră."
@@ -39245,10 +39920,10 @@ msgid "This is the highest peak of users on your installation since the license
msgstr "Acesta este numărul cel mai mare de utilizatori de pe instalația dvs. de la începutul licenței."
msgid "This is the number of %{billable_users_link_start}billable users%{link_end} on your installation, and this is the minimum number you need to purchase when you renew your license."
-msgstr ""
+msgstr "Acesta este numărul de %{billable_users_link_start}utilizatori facturabili%{link_end} de pe instalația dvs. și acesta este numărul minim pe care trebuie să-l achiziționați atunci când vă reînnoiți licența."
msgid "This is your current session"
-msgstr ""
+msgstr "Aceasta este sesiunea dvs. curentă"
msgid "This issue cannot be assigned to a confidential epic because it is public."
msgstr "Această problemă nu poate fi atribuită unei epice confidențiale, deoarece este publică."
@@ -39260,13 +39935,13 @@ msgid "This issue is confidential and should only be visible to team members wit
msgstr "Această problemă este confidențială și ar trebui să fie vizibilă numai membrilor echipei cu cel puțin acces de Reporter."
msgid "This issue is currently blocked by the following issues:"
-msgstr ""
+msgstr "Această problemă este blocată în prezent de următoarele probleme:"
msgid "This issue is hidden because its author has been banned"
msgstr "Această problemă este ascunsă deoarece autorul ei a fost interzis"
msgid "This issue is in a child epic of the filtered epic"
-msgstr ""
+msgstr "Această problemă se află într-o epică copil a epicei filtrate"
msgid "This job could not start because it could not retrieve the needed artifacts%{punctuation}%{invalid_dependencies}"
msgstr "Acest job nu a putut începe deoarece nu a putut prelua artefactele%{punctuation}%{invalid_dependencies} necesare"
@@ -39278,13 +39953,13 @@ msgid "This job deploys to the protected environment \"%{environment}\" which re
msgstr "Acest job se implementează în mediul protejat „%{environment}â€, care necesită aprobări."
msgid "This job does not have a trace."
-msgstr ""
+msgstr "Acest job nu are nicio urmă."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr "Acest job nu se execută automat și trebuie să fie pornit manual, dar nu aveți acces la el."
msgid "This job has been canceled"
-msgstr ""
+msgstr "Acest job a fost anulat"
msgid "This job has been skipped"
msgstr "Acest job a fost sărit"
@@ -39293,7 +39968,7 @@ msgid "This job has not been triggered yet"
msgstr "Acest job nu a fost încă declanșat"
msgid "This job has not started yet"
-msgstr ""
+msgstr "Acest job nu a început încă"
msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
msgstr "Acest job este o implementare neactualizată la %{environmentLink} utilizând clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}."
@@ -39302,19 +39977,19 @@ msgid "This job is an out-of-date deployment to %{environmentLink} using cluster
msgstr "Acest job este o implementare neactualizată la %{environmentLink} utilizând clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}. Vedeți %{deploymentLink}."
msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
-msgstr ""
+msgstr "Acest job este o implementare învechită la %{environmentLink} folosind clusterul %{clusterNameOrLink}."
msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink}. View the %{deploymentLink}."
-msgstr ""
+msgstr "Acest job este o implementare învechită la %{environmentLink} folosind clusterul %{clusterNameOrLink}. Vedeți %{deploymentLink}."
msgid "This job is an out-of-date deployment to %{environmentLink}."
-msgstr ""
+msgstr "Acest job este o implementare învechită la %{environmentLink}."
msgid "This job is an out-of-date deployment to %{environmentLink}. View the %{deploymentLink}."
-msgstr ""
+msgstr "Acest job este o implementare învechită la %{environmentLink}. Vedeți %{deploymentLink}."
msgid "This job is archived. Only the complete pipeline can be retried."
-msgstr ""
+msgstr "Acest job este arhivat. Numai pipeline-ul complet poate fi reîncercat."
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
msgstr "Acest job creează o implementare la %{environmentLink} folosind clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}."
@@ -39323,64 +39998,61 @@ msgid "This job is creating a deployment to %{environmentLink} using cluster %{c
msgstr "Acest job creează o implementare la %{environmentLink} folosind clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}. Aceasta va suprascrie %{deploymentLink}."
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
-msgstr ""
+msgstr "Acest job creează o implementare la %{environmentLink} folosind clusterul %{clusterNameOrLink}."
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}. This will overwrite the %{deploymentLink}."
-msgstr ""
+msgstr "Acest job creează o implementare la %{environmentLink} folosind clusterul %{clusterNameOrLink}. Aceasta va suprascrie %{deploymentLink}."
msgid "This job is creating a deployment to %{environmentLink}."
-msgstr ""
+msgstr "Acest job creează o implementare la %{environmentLink}."
msgid "This job is creating a deployment to %{environmentLink}. This will overwrite the %{deploymentLink}."
-msgstr ""
+msgstr "Acest job creează o implementare în %{environmentLink}. Aceasta va suprascrie %{deploymentLink}."
msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
msgstr "Acest job este implementat la %{environmentLink} utilizând clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}."
msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink}."
-msgstr ""
+msgstr "Acest job este desfășurat la %{environmentLink} folosind clusterul %{clusterNameOrLink}."
msgid "This job is deployed to %{environmentLink}."
-msgstr ""
+msgstr "Acest job este desfășurat la %{environmentLink}."
msgid "This job is in pending state and is waiting to be picked by a runner"
msgstr "Acest job este în stare de așteptare și așteaptă să fie preluat de un executor."
msgid "This job is performing tasks that must complete before it can start"
-msgstr ""
+msgstr "Acest job execută sarcini care trebuie finalizate înainte de a putea începe"
msgid "This job is preparing to start"
-msgstr ""
+msgstr "Acest job se pregătește să înceapă"
msgid "This job is waiting for resource: "
-msgstr ""
+msgstr "Acest job așteaptă resurse: "
msgid "This job requires a manual action"
-msgstr ""
+msgstr "Acest job necesită o acțiune manuală"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr "Acest job necesită o intervenție manuală pentru a începe. Înainte de a porni acest job, puteți adăuga variabilele de mai jos pentru modificări de ultim moment ale configurației."
-msgid "This job triggers a downstream pipeline"
-msgstr "Acest job declanșează un pipeline în aval"
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "Acest job se va executa automat după finalizarea temporizatorului său. Adesea, acestea sunt utilizate pentru implementări incrementale în mediile de producție. Atunci când este neprogramat, se transformă într-o acțiune manuală."
msgid "This license has already expired."
-msgstr ""
+msgstr "Această licență a expirat deja."
msgid "This link points to external content"
-msgstr ""
+msgstr "Acest link indică un conținut extern"
msgid "This may expose confidential information as the selected fork is in another namespace that can have other members."
msgstr "Acest lucru poate expune informații confidențiale, deoarece forkul selectat se află într-un alt spațiu de nume care poate avea și alți membri."
msgid "This means you can not push code until you create an empty repository or import existing one."
-msgstr ""
+msgstr "Acest lucru înseamnă că nu puteți face push de cod până când nu creați un repozitoriu gol sau importați unul existent."
msgid "This merge request branch is protected from force push."
-msgstr ""
+msgstr "Această ramură de merge request este protejată împotriva unui push forțat."
msgid "This merge request cannot be rebased while there are conflicts."
msgstr "Nu se poate face un rebase al acestui merge request atât timp cât există conflicte."
@@ -39392,28 +40064,28 @@ msgid "This merge request does not have codequality reports"
msgstr "Acest merge request nu are rapoarte codequality"
msgid "This merge request is closed. To apply this suggestion, edit this file directly."
-msgstr ""
+msgstr "Acest merge request este închis. Pentru a aplica această sugestie, editați direct acest fișier."
msgid "This merge request is from a private project to a public project."
-msgstr ""
+msgstr "Acest merge request este de la un proiect privat la un proiect public."
msgid "This merge request is from a private project to an internal project."
-msgstr ""
+msgstr "Acest merge request este de la un proiect privat la un proiect intern."
msgid "This merge request is from an internal project to a public project."
-msgstr ""
+msgstr "Acest merge request este de la un proiect intern la un proiect public."
msgid "This merge request is locked."
msgstr "Acest merge request este blocat."
msgid "This merge request was merged. To apply this suggestion, edit this file directly."
-msgstr ""
+msgstr "Acest merge request a fost îmbinat. Pentru a aplica această sugestie, editați direct acest fișier."
msgid "This namespace has already been taken! Please choose another one."
msgstr "Acest spațiu de nume a fost deja luat! Vă rugăm să alegeți altul."
msgid "This only applies to repository indexing operations."
-msgstr ""
+msgstr "Acest lucru se aplică numai la operațiunile de indexare a repozitoriilor."
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Această pagină nu este disponibilă deoarece nu aveți permisiunea de a citi informații în mai multe proiecte."
@@ -39431,13 +40103,13 @@ msgid "This pipeline was triggered by a schedule."
msgstr "Acest pipeline a fost declanșat de o programare."
msgid "This process deletes the project repository and all related resources."
-msgstr ""
+msgstr "Acest proces șterge repozitoriul proiectului și toate resursele aferente."
msgid "This project"
-msgstr ""
+msgstr "Acest proiect"
msgid "This project can be restored until %{date}."
-msgstr ""
+msgstr "Acest proiect poate fi restaurat până la %{date}."
msgid "This project cannot be %{visibilityLevel} because the visibility of %{openShowLink}%{name}%{closeShowLink} is %{visibility}. To make this project %{visibilityLevel}, you must first %{openEditLink}change the visibility%{closeEditLink} of the parent group."
msgstr "Acest proiect nu poate fi %{visibilityLevel} deoarece vizibilitatea lui %{openShowLink}%{name}%{closeShowLink} este %{visibility}. Pentru ca acest proiect să devină %{visibilityLevel}, trebuie mai întâi să %{openEditLink}modificați vizibilitatea%{closeEditLink} grupului părinte."
@@ -39464,40 +40136,40 @@ msgid "This project is archived and cannot be commented on."
msgstr "Acest proiect este arhivat și nu poate fi comentat."
msgid "This project is licensed under the %{strong_start}%{license_name}%{strong_end}."
-msgstr ""
+msgstr "Acest proiect este licențiat sub %{strong_start}%{license_name}%{strong_end}."
msgid "This project is not subscribed to any project pipelines."
msgstr "Acest proiect nu este abonat la niciun pipeline de proiecte."
msgid "This project manages its dependencies using %{strong_start}%{manager_name}%{strong_end}"
-msgstr ""
+msgstr "Acest proiect își gestionează dependențele folosind %{strong_start}%{manager_name}%{strong_end}"
msgid "This project path either does not exist or you do not have access."
-msgstr ""
+msgstr "Această cale a proiectului fie nu există, fie nu aveți acces."
msgid "This project will be deleted on %{date}"
-msgstr ""
+msgstr "Acest proiect va fi șters pe %{date}"
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
-msgstr ""
+msgstr "Acest proiect va fi șters la %{date}, deoarece grupul său părinte „%{parent_group_name}†a fost programat pentru ștergere."
-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."
-msgstr "Acest proiect va locui în grupul dvs. %{strong_open}%{namespace}%{strong_close}. Un proiect este locul în care vă găzduiți fișierele (repozitoriile), vă planificați activitatea (probleme), vă publicați documentația (wiki) și multe altele."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
+msgstr "Acest proiect va fi găzduit în grupul dvs. %{strong_open}%{namespace}%{strong_close}. Un proiect este locul unde vă stocați fișierele (repozitoriu), vă planificați activitatea (probleme), vă publicați documentația (wiki) și multe altele."
msgid "This repository"
-msgstr ""
+msgstr "Acest repozitoriu"
msgid "This repository has never been checked."
-msgstr ""
+msgstr "Acest repozitoriu nu a fost verificat niciodată."
msgid "This repository is currently empty. A new Auto DevOps pipeline will be created after a new file has been pushed to a branch."
-msgstr ""
+msgstr "Acest repozitoriu este momentan gol. Un nou pipeline Auto DevOps va fi creat după ce un fișier nou a fost împins la o ramură."
msgid "This repository was last checked %{last_check_timestamp}. The check %{strong_start}failed.%{strong_end} See the 'repocheck.log' file for error messages."
-msgstr ""
+msgstr "Acest repozitoriu a fost verificat ultima dată %{last_check_timestamp}. Verificarea a %{strong_start}eșuat%{strong_end}. Consultați fișierul „repocheck.log†pentru mesaje de eroare."
msgid "This repository was last checked %{last_check_timestamp}. The check passed."
-msgstr ""
+msgstr "Acest depozit a fost verificat ultima dată la %{last_check_timestamp}. Verificarea a trecut."
msgid "This runner will only run on pipelines triggered on protected branches"
msgstr "Acest executor va rula numai pe pipeline-urile declanșate pe ramurile protejate"
@@ -39505,14 +40177,17 @@ msgstr "Acest executor va rula numai pe pipeline-urile declanșate pe ramurile p
msgid "This setting can be overridden in each project."
msgstr "Această setare poate fi suprascrisă în fiecare proiect."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr "Această setare a fost configurată la nivel de instanță și nu poate fi suprascrisă pentru fiecare grup."
+
msgid "This setting is allowed for forked projects only"
msgstr "Această setare este permisă numai pentru forkurile de proiecte"
msgid "This subscription is for"
-msgstr ""
+msgstr "Acest abonament este pentru"
msgid "This suggestion already matches its content."
-msgstr ""
+msgstr "Această sugestie se potrivește deja cu conținutul său."
msgid "This title already exists."
msgstr "Acest titlu există deja."
@@ -39521,28 +40196,28 @@ msgid "This user cannot be unlocked manually from GitLab"
msgstr "Acest utilizator nu poate fi deblocat manual din GitLab"
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
-msgstr ""
+msgstr "Acest utilizator are o adresă de e-mail neconfirmată (%{email}). Puteți forța o confirmare."
msgid "This user has an unconfirmed email address. You may force a confirmation."
-msgstr ""
+msgstr "Acest utilizator are o adresă de e-mail neconfirmată. Puteți forța o confirmare."
msgid "This user has no active %{accessTokenTypePlural}."
-msgstr ""
+msgstr "Acest utilizator nu are %{accessTokenTypePlural} active."
msgid "This user has no active %{type}."
msgstr "Acest utilizator nu are niciun %{type} activ."
msgid "This user has no identities"
-msgstr ""
+msgstr "Acest utilizator nu are identități"
msgid "This user has no personal projects."
-msgstr ""
+msgstr "Acest utilizator nu are proiecte personale."
msgid "This user has previously committed to the %{name} project."
msgstr "Acest utilizator a făcut anterior commit în proiectul %{name}."
msgid "This user has the %{access} role in the %{name} project."
-msgstr ""
+msgstr "Acest utilizator are rolul de %{access} în proiectul %{name}."
msgid "This user is the author of this %{noteable}."
msgstr "Acest utilizator este autorul acestui/acestei %{noteable}."
@@ -39556,9 +40231,6 @@ msgstr "Aceasta va invalida aplicațiile înregistrate și dispozitivele U2F / W
msgid "This will invalidate your registered applications and U2F devices."
msgstr "Aceasta va invalida aplicațiile înregistrate și dispozitivele U2F."
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr "Aceasta va elimina relația de fork dintre acest proiect și %{fork_source}."
@@ -39569,70 +40241,64 @@ msgid "Thread to reply to cannot be found"
msgstr "Nu se poate găsi subiectul la care să răspundeți"
msgid "Threshold in bytes at which to compress Sidekiq job arguments."
-msgstr ""
+msgstr "Pragul în octeți la care se comprimă argumentele jobului Sidekiq."
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
-msgstr "Limita în octeți la care se resping joburile Sidekiq. Setați acest lucru la 0 dacă nu doriți să limitați joburile Sidekiq."
+msgstr "Limita în octeți la care se resping joburile Sidekiq. Setați această valoare la 0 dacă nu doriți să limitați lucrările Sidekiq."
msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
+msgstr "Limita de modificări (ramuri sau etichete) într-un singur push, peste care se creează un eveniment de push în bloc (valoarea implicită este 3)."
msgid "Throughput"
-msgstr ""
+msgstr "Debit"
msgid "Thursday"
-msgstr ""
+msgstr "Joi"
msgid "Time"
-msgstr ""
+msgstr "Timp"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr "Timpul (în ore) în care utilizatorilor li se permite să sară peste configurarea forțată a autentificării cu doi factori."
-msgid "Time Spent"
-msgstr "Timp petrecut"
-
msgid "Time based: Yes"
-msgstr ""
+msgstr "Pe bază de timp: Da"
msgid "Time before an issue gets scheduled"
-msgstr ""
+msgstr "Timpul înainte ca o problemă să fie programată"
msgid "Time before an issue starts implementation"
-msgstr ""
-
-msgid "Time before enforced"
-msgstr ""
+msgstr "Timpul înainte ca o problemă să înceapă implementarea"
msgid "Time between merge request creation and merge/close"
-msgstr ""
+msgstr "Timpul dintre crearea merge request-ului și îmbinare/închidere"
msgid "Time estimate"
-msgstr ""
+msgstr "Estimare de timp"
msgid "Time from first comment to last commit"
msgstr "Timpul de la primul comentariu până la ultimul commit"
msgid "Time from first commit until first comment"
-msgstr ""
+msgstr "Timp de la primul commit până la primul comentariu"
msgid "Time from last commit to merge"
msgstr "Timpul de la ultimul commit până la îmbinare"
msgid "Time of import: %{importTime}"
-msgstr ""
+msgstr "Timpul de import: %{importTime}"
msgid "Time remaining"
-msgstr ""
+msgstr "Timp rămas"
msgid "Time spent"
msgstr "Timp petrecut"
msgid "Time to Restore Service"
-msgstr ""
+msgstr "Timpul pentru restabilirea serviciului"
msgid "Time to merge"
-msgstr ""
+msgstr "Timp până la îmbinare"
msgid "Time to subtract exceeds the total time spent"
msgstr "Timpul care trebuie scăzut depășește timpul total petrecut"
@@ -39647,7 +40313,7 @@ msgid "Time until first merge request"
msgstr "Timp până la primul merge request"
msgid "Time zone"
-msgstr ""
+msgstr "Fusul orar"
msgid "TimeTrackingEstimated|Est"
msgstr "Est"
@@ -39655,6 +40321,12 @@ msgstr "Est"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr "%{spentStart}Petrecut: %{spentEnd}"
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr "S-a produs o eroare în timpul eliminării jurnalului de timp."
+
+msgid "TimeTracking|Delete time spent"
+msgstr "Ștergeți timpul petrecut"
+
msgid "TimeTracking|Estimated:"
msgstr "Estimat:"
@@ -39701,10 +40373,10 @@ msgid "Timeago|%s weeks remaining"
msgstr "%s săptămâni rămase"
msgid "Timeago|%s years ago"
-msgstr "acum %s ani"
+msgstr "acum %s (de) ani"
msgid "Timeago|%s years remaining"
-msgstr "%s ani rămași"
+msgstr "%s (de) ani rămași"
msgid "Timeago|1 day ago"
msgstr "acum o zi"
@@ -39764,7 +40436,7 @@ msgid "Timeago|in %s weeks"
msgstr "în %s săptămâni"
msgid "Timeago|in %s years"
-msgstr "în %s ani"
+msgstr "în %s (de) ani"
msgid "Timeago|in 1 day"
msgstr "în 1 zi"
@@ -39812,22 +40484,22 @@ msgid "Timeout for the fastest Gitaly operations (in seconds)."
msgstr "Timeout pentru cele mai rapide operațiuni Gitaly (în secunde)."
msgid "Timezone"
-msgstr ""
+msgstr "Fusul orar"
msgid "Time|hr"
msgid_plural "Time|hrs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "oră"
+msgstr[1] "ore"
+msgstr[2] "de ore"
msgid "Time|min"
msgid_plural "Time|mins"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "min."
+msgstr[1] "min."
+msgstr[2] "min."
msgid "Time|s"
-msgstr ""
+msgstr "s"
msgid "Tip: Hover over a job to see the jobs it depends on to run."
msgstr "Sfat: Deplasați cursorul peste un job pentru a vedea joburile de care depinde pentru a se executa."
@@ -39836,49 +40508,49 @@ msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approver
msgstr "Sfat: adăugați un %{linkStart}CODEOWNERS%{linkEnd} pentru a adăuga automat aprobatorii pe baza căilor de acces la fișiere și a tipurilor de fișiere."
msgid "Title"
-msgstr ""
+msgstr "Titlu"
msgid "Title (required)"
-msgstr ""
+msgstr "Titlu (obligatoriu)"
msgid "Title:"
-msgstr ""
+msgstr "Titlu:"
msgid "Titles and Descriptions"
-msgstr ""
+msgstr "Titluri și descrieri"
msgid "To"
-msgstr ""
+msgstr "La"
msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr ""
+msgstr "Pentru %{link_to_help} domeniului dvs., adăugați cheia de mai sus la o înregistrare TXT în configurația DNS."
msgid "To Do"
-msgstr ""
+msgstr "De Făcut"
msgid "To GitLab"
-msgstr ""
+msgstr "Către GitLab"
msgid "To accept this invitation, create an account or sign in."
-msgstr ""
+msgstr "Pentru a accepta această invitație, creați un cont sau conectați-vă."
msgid "To accept this invitation, sign in or create an account."
-msgstr ""
+msgstr "Pentru a accepta această invitație, conectați-vă sau creați-vă un cont."
msgid "To accept this invitation, sign in."
-msgstr ""
+msgstr "Pentru a accepta această invitație, conectați-vă."
msgid "To access this domain create a new DNS record"
-msgstr ""
+msgstr "Pentru a accesa acest domeniu creați o nouă înregistrare DNS"
msgid "To activate your trial, we need additional details from you."
-msgstr "Pentru a activa perioada dvs. de încercare, avem nevoie de detalii suplimentare de la dumneavoastră."
+msgstr "Pentru a vă activa perioada de încercare, avem nevoie de detalii suplimentare din partea dumneavoastră."
msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr "Pentru a adăuga un sufix personalizat, configurați o adresă de e-mail Service Desk. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "To add the entry manually, provide the following details to the application on your phone."
-msgstr ""
+msgstr "Pentru a adăuga manual intrarea, furnizați următoarele detalii aplicației de pe telefon."
msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
msgstr "Pentru a cere cuiva să examineze un merge request, selectați %{strongStart}Solicită atenție%{strongEnd}. Selectați din nou pentru a elimina solicitarea."
@@ -39887,7 +40559,7 @@ msgid "To complete registration, we need additional details from you."
msgstr "Pentru a finaliza înregistrarea, avem nevoie de detalii suplimentare de la dumneavoastră."
msgid "To confirm, type %{phrase_code}"
-msgstr ""
+msgstr "Pentru confirmare, tastați %{phrase_code}"
msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to connect."
msgstr "Pentru a conecta repozitoriile GitHub, puteți utiliza un %{personal_access_token_link}. Atunci când vă creați Tokenul de acces personal, va trebui să selectați domeniul %{code_open}repo%{code_close}, astfel încât să putem afișa o listă a repozitoriilor dvs. publice și private care sunt disponibile pentru conectare."
@@ -39899,37 +40571,37 @@ msgid "To connect GitHub repositories, you first need to authorize GitLab to acc
msgstr "Pentru a conecta repozitoriile GitHub, mai întâi trebuie să autorizați GitLab să acceseze lista de repozitorii GitHub:"
msgid "To connect an SVN repository, check out %{svn_link}."
-msgstr ""
+msgstr "Pentru a conecta un repozitoriu SVN, consultați %{svn_link}."
msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
-msgstr "Pentru a continua să utilizați GitLab Enterprise Edition, încărcați fișierul %{codeOpen}.gitlab-license%{codeClose} sau introduceți cheia de licență pe care ați primit-o de la GitLab Inc."
+msgstr "Pentru a continua să utilizați Ediția GitLab Enterprise, încărcați fișierul %{codeOpen}.gitlab-license%{codeClose} sau introduceți cheia de licență pe care ați primit-o de la GitLab Inc."
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 ""
+msgstr "Pentru a continua, trebuie să selectați linkul din e-mailul de confirmare pe care vi l-am trimis pentru a vă verifica adresa de e-mail. Dacă nu ați primit e-mailul nostru, selectați %{strongStart}Retrimiteți e-mailul de confirmare.%{strongEnd}"
msgid "To define internal users, first enable new users set to external"
-msgstr ""
+msgstr "Pentru a defini utilizatorii interni, activați mai întâi setarea ca noii utilizatori să fie externi"
msgid "To enable Registration Features, first enable Service Ping."
msgstr "Pentru a activa Funcțiile de înregistrare, activați mai întâi Serviciul Ping."
msgid "To ensure %{project_link} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
-msgstr ""
+msgstr "Pentru a vă asigura că %{project_link} este deprogramat de la ștergere, verificați dacă s-a înregistrat vreo activitate de către GitLab. De exemplu:"
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
-msgstr ""
+msgstr "Pentru a vă asigura că %{project_name} este deprogramat de la ștergere, verificați dacă s-a înregistrat vreo activitate de către GitLab. De exemplu:"
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
-msgstr ""
+msgstr "Pentru a nu pierde conținutul personal, acest cont trebuie utilizat numai pentru aspecte legate de %{group_name}."
msgid "To find the state of this project's repository at the time of any of these versions, check out %{link_start}the tags%{link_end}"
msgstr "Pentru a afla care era starea repozitoriului acestui proiect la momentul oricăreia dintre aceste versiuni, verificați %{link_start}etichetele%{link_end}"
msgid "To further protect your account, consider configuring a %{mfa_link_start}two-factor authentication%{mfa_link_end} method."
-msgstr ""
+msgstr "Pentru a vă proteja în continuare contul, considerați configurarea unei metode de %{mfa_link_start}autentificare cu doi factori%{mfa_link_end}."
msgid "To further protect your account, consider configuring a two-factor authentication method: %{mfa_link}."
-msgstr ""
+msgstr "Pentru a vă proteja în continuare contul, considerați configurarea unei metode de autentificare cu doi factori: %{mfa_link}."
msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
msgstr "Pentru a începe, introduceți URL-ul FogBugz și informațiile de conectare mai jos. În etapele următoare, veți putea să mapați utilizatorii și să selectați proiectele pe care doriți să le importați."
@@ -39938,16 +40610,16 @@ msgid "To get started, click the link below to confirm your account."
msgstr "Pentru a începe, faceți clic pe linkul următor pentru a vă confirma contul."
msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
-msgstr ""
+msgstr "Pentru a începe, vă rugăm să introduceți URL-ul dvs. Gitea Host și un %{link_to_personal_token}."
msgid "To get started, use the link below to confirm your account."
-msgstr ""
+msgstr "Pentru a începe, utilizați linkul de mai jos pentru a vă confirma contul."
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr "Pentru a ajuta la îmbunătățirea GitLab, am dori ca periodic să %{docs_link}. Acest lucru poate fi schimbat în orice moment în %{settings_link}."
msgid "To import an SVN repository, check out %{svn_link}."
-msgstr ""
+msgstr "Pentru a importa un repozitoriu SVN, consultați %{svn_link}."
msgid "To keep this project going, create a new issue"
msgstr "Pentru a continua acest proiect, creați o nouă problemă"
@@ -39959,7 +40631,7 @@ msgid "To learn more about this project, read %{link_to_wiki}"
msgstr "Pentru a afla mai multe despre acest proiect, citiți %{link_to_wiki}"
msgid "To manage all members associated with this group and its subgroups and projects, visit the %{link_start}usage quotas page%{link_end}."
-msgstr ""
+msgstr "Pentru a gestiona toți membrii asociați cu acest grup și cu subgrupurile și proiectele sale, vizitați %{link_start}pagina cotelor de utilizare%{link_end}."
msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
msgstr "Pentru a muta sau a copia un întreg proiect GitLab de pe o altă instalație GitLab pe aceasta, navigați pe pagina de setări a proiectului original, generați un fișier de export și încărcați-l aici."
@@ -39971,13 +40643,13 @@ msgid "To pass variables to the triggered pipeline, add %{code_start}variables[V
msgstr "Pentru a transfera variabile la pipeline-ul declanșat, adăugați %{code_start}variables[VARIABLE]=VALUE%{code_end} la solicitarea API."
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
-msgstr ""
+msgstr "Pentru a vă personaliza experiența GitLab, am dori să știm ceva mai multe despre dvs."
msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
-msgstr "Pentru a păstra performanța, sunt afișate doar %{strongStart}%{visible} din %{total}%{strongEnd} fișiere."
+msgstr "Pentru a păstra performanța, sunt afișate doar %{strongStart}%{visible} din %{total}%{strongEnd} (de) fișiere."
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
-msgstr ""
+msgstr "Pentru a păstra performanța, sunt afișate numai %{strong_open}%{display_size} din %{real_size}%{strong_close} (de) fișiere."
msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr "Pentru a proteja confidențialitatea acestei probleme, %{linkStart}creați un fork al acestui proiect%{linkEnd} și setați vizibilitatea forkului la privat."
@@ -39986,16 +40658,13 @@ msgid "To protect this issue's confidentiality, a private fork of this project w
msgstr "Pentru a proteja confidențialitatea acestei probleme, a fost selectat un fork privat al acestui proiect."
msgid "To reactivate your account, %{gitlab_link_start}sign in to GitLab.%{link_end}"
-msgstr ""
+msgstr "Pentru a vă reactiva contul, %{gitlab_link_start}conectați-vă la GitLab.%{link_end}"
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
-msgstr ""
-
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr "Pentru reînnoire, exportați fișierul de utilizare a licenței și trimiteți-l prin e-mail la %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dumneavoastră."
+msgstr "Pentru a vă reactiva contul, conectați-vă la GitLab la %{gitlab_url}."
msgid "To resolve this, try to:"
-msgstr "Pentru a rezolva asta, încercați:"
+msgstr "Pentru a rezolva această, încercați să:"
msgid "To run CI/CD pipelines with JetBrains TeamCity, input the GitLab project details in the TeamCity project Version Control Settings."
msgstr "Pentru a rula pipeline-uri CI/CD cu JetBrains TeamCity, introduceți detaliile proiectului GitLab în Setările de control ale versiunii proiectului TeamCity."
@@ -40013,25 +40682,25 @@ msgid "To see what's changed or create a merge request, choose a branch or tag (
msgstr "Pentru a vedea ce s-a schimbat sau pentru a crea un merge request, alegeți o ramură sau o etichetă (cum ar fi %{branch}) sau introduceți un commit (cum ar fi %{sha})."
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
-msgstr ""
+msgstr "Pentru a configura autentificarea SAML pentru grupul dvs prin intermediul unui furnizor de identitate precum Azure, Okta, Onelogin, Ping Identity sau furnizorul dvs personalizat SAML 2.0:"
msgid "To set up this integration:"
-msgstr ""
+msgstr "Pentru a configura această integrare:"
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 ""
+msgstr "Pentru a specifica nivelul de notificare pentru fiecare proiect al unui grup din care faceți parte, trebuie să vizitați pagina proiectului și să modificați acolo nivelul de notificare."
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
-msgstr "Pentru a începe să utilizați GitLab Enterprise Edition, încărcați fișierul %{codeOpen}.gitlab-license%{codeClose} sau introduceți cheia de licență pe care ați primit-o de la GitLab Inc."
+msgstr "Pentru a începe să utilizați Ediția GitLab Enterprise, încărcați fișierul %{codeOpen}.gitlab-license%{codeClose} sau introduceți cheia de licență pe care ați primit-o de la GitLab Inc."
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
-msgstr ""
+msgstr "Pentru a vă dezabona de la această problemă, vă rugăm să introduceți următorul link în browserul d-voastră:"
msgid "To update Snippets with multiple files, you must use the `files` parameter"
msgstr "Pentru a actualiza Fragmentele cu mai multe fiÈ™iere, trebuie să folosiÈ›i parametrul „filesâ€."
msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
-msgstr "Pentru a folosi formate suplimentare, trebuie să porniți %{container_link_start}containerele însoțitoare%{container_link_end}."
+msgstr "Pentru a utiliza formatele suplimentare, trebuie să porniți %{container_link_start}containerele companion necesare%{container_link_end}."
msgid "To use the system's default, set this value to 0."
msgstr "Pentru a utiliza valoarea implicită a sistemului, setați această valoare la 0."
@@ -40040,31 +40709,31 @@ msgid "To view all %{scannedResourcesCount} scanned URLs, %{linkStart}please dow
msgstr "Pentru a vizualiza toate cele %{scannedResourcesCount} adrese URL scanate, %{linkStart}vă rugăm să descărcați fișierul CSV%{linkEnd}"
msgid "To view usage, refresh this page in a few minutes."
-msgstr ""
+msgstr "Pentru vizualizarea utilizării, reîmprospătați această pagină în câteva minute."
msgid "To widen your search, change or remove filters above"
-msgstr ""
+msgstr "Pentru a vă extinde căutarea, modificați sau eliminați filtrele de mai sus"
msgid "To widen your search, change or remove filters above."
-msgstr ""
+msgstr "Pentru a vă extinde căutarea, modificați sau înlăturați filtrele de mai sus"
msgid "To-Do"
-msgstr ""
+msgstr "De-Făcut"
msgid "To-Do List"
-msgstr ""
+msgstr "Lista De-Făcut"
msgid "To-do item successfully marked as done."
-msgstr ""
+msgstr "Sarcina de-făcut marcată cu succes ca terminată."
msgid "Today"
-msgstr ""
+msgstr "Astăzi"
msgid "Todos count"
msgstr "Număr de todos"
msgid "Todos|Are you looking for things to do? Take a look at %{strongStart}%{openIssuesLinkStart}open issues%{openIssuesLinkEnd}%{strongEnd}, contribute to %{strongStart}%{mergeRequestLinkStart}a merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}, or mention someone in a comment to automatically assign them a new to-do item."
-msgstr ""
+msgstr "Căutați lucruri de făcut? Aruncați o privire la %{strongStart}%{openIssuesLinkStart}problemele deschise%{openIssuesLinkEnd}%{strongEnd}, contribuiți la %{strongStart}%{mergeRequestLinkStart}un merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd} sau menționați pe cineva într-un comentariu pentru a-i atribui automat un nou element de-făcut."
msgid "Todos|Filter by author"
msgstr "Filtrați după autor"
@@ -40082,37 +40751,37 @@ msgid "Todos|Mark all as done"
msgstr "Marcați totul ca terminat"
msgid "Todos|Nothing is on your to-do list. Nice work!"
-msgstr "Nu aveÈ›i nimic pe lista de sarcini „de făcutâ€. Bine lucrat!"
+msgstr "Nu aveți nimic pe lista lucrurilor de-făcut. Bine lucrat!"
msgid "Todos|Undo mark all as done"
msgstr "Anulați marcarea tuturor ca fiind făcute"
msgid "Todos|When an issue or merge request is assigned to you, or when you receive a %{strongStart}@mention%{strongEnd} in a comment, this automatically triggers a new item in your To-Do List."
-msgstr "Atunci când vi se atribuie o problemă sau un merge request sau când primiÈ›i o %{strongStart}@mention%{strongEnd} într-un comentariu, aceasta declanÈ™ează automat un nou element în Lista de sarcini „De făcutâ€."
+msgstr "Atunci când vi se atribuie o problemă sau un merge request sau când primiți o %{strongStart}@mention%{strongEnd} într-un comentariu, aceasta declanșează automat un nou element în Lista de sarcini De-Făcut."
msgid "Todos|You're all done!"
msgstr "Ați terminat totul!"
msgid "Todos|Your To-Do List shows what to work on next"
-msgstr "Lista de sarcini „De făcut†arată la ce să lucrați în continuare"
+msgstr "Lista de sarcini De-Făcut arată la ce să lucrați în continuare"
msgid "Toggle GitLab Next"
-msgstr ""
+msgstr "Comutați la GitLab Next"
msgid "Toggle Markdown preview"
-msgstr ""
+msgstr "Comutați previzualizarea Markdown"
msgid "Toggle Sidebar"
-msgstr ""
+msgstr "Comutați bara laterală"
msgid "Toggle backtrace"
-msgstr ""
+msgstr "Comutați backtrace"
msgid "Toggle collapse"
msgstr "Comutare restrângere"
msgid "Toggle comments for this file"
-msgstr ""
+msgstr "Comutați comentariile pentru acest fișier"
msgid "Toggle commit description"
msgstr "Comutare la descrierea commit-ului"
@@ -40121,61 +40790,64 @@ msgid "Toggle commit list"
msgstr "Comutare la lista de commit-uri"
msgid "Toggle dropdown"
-msgstr ""
+msgstr "Comutați lista verticală"
msgid "Toggle emoji award"
-msgstr ""
+msgstr "Schimbați premiul emoji"
msgid "Toggle focus mode"
-msgstr ""
+msgstr "Comutați modul focalizare"
msgid "Toggle keyboard shortcuts help dialog"
-msgstr "Comută dialogul de ajutor pentru scurtăturile de la tastatură"
+msgstr "Comutați dialogul de ajutor pentru comenzi rapide de la tastatură"
msgid "Toggle navigation"
-msgstr ""
+msgstr "Comutare navigare"
msgid "Toggle project select"
-msgstr ""
+msgstr "Comutați selectarea proiectului"
msgid "Toggle shortcuts"
-msgstr ""
+msgstr "Comutați comenzile rapide"
msgid "Toggle sidebar"
-msgstr ""
+msgstr "Comutați bara laterală"
+
+msgid "Toggle the Draft status"
+msgstr "Comutați starea Draft"
msgid "Toggle the Performance Bar"
-msgstr ""
+msgstr "Comutați bara de performanță"
msgid "Toggled :%{name}: emoji award."
-msgstr ""
+msgstr "Premiul emoji :%{name}: a fost comutat."
msgid "Toggles :%{name}: emoji award."
-msgstr ""
+msgstr "Comută premiul emoji :%{name}:"
msgid "Token"
-msgstr ""
+msgstr "Token"
msgid "Token Access"
-msgstr ""
+msgstr "Accesul prin token"
msgid "Token name"
-msgstr ""
+msgstr "Numele tokenului"
msgid "Token valid until revoked"
-msgstr ""
+msgstr "Token valabil până la revocare"
msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
+msgstr "Scopurile stabilesc nivelurile de permisiune acordate tokenului."
msgid "Tokens|Select scopes"
-msgstr ""
+msgstr "Selectați domeniile"
msgid "Tomorrow"
-msgstr ""
+msgstr "Mâine"
msgid "Too many changes to show."
-msgstr ""
+msgstr "Prea multe modificări de afișat."
msgid "Too many namespaces enabled. Manage them through the console or the API."
msgstr "Prea multe spații de nume activate. Gestionați-le prin consolă sau prin API."
@@ -40183,12 +40855,21 @@ msgstr "Prea multe spații de nume activate. Gestionați-le prin consolă sau pr
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr "Aveți prea multe proiecte activate. Gestionați-le prin consolă sau prin API."
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr "Prea multe referințe. Acțiunile rapide sunt limitate la cel mult %{max_count} referințe de utilizator"
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr "S-au găsit prea mulți utilizatori. Acțiunile rapide sunt limitate la cel mult %{max_count} utilizatori"
+
msgid "TopNav|Go back"
-msgstr ""
+msgstr "ÃŽnapoi"
msgid "Topic %{topic_name} was successfully created."
msgstr "Subiectul %{topic_name} a fost creat cu succes."
+msgid "Topic %{topic_name} was successfully removed."
+msgstr "Subiectul %{topic_name} a fost înlăturat cu succes."
+
msgid "Topic avatar"
msgstr "Avatarul subiectului"
@@ -40208,28 +40889,28 @@ msgid "Topics"
msgstr "Subiecte"
msgid "Total"
-msgstr ""
+msgstr "Total"
msgid "Total Contributions"
-msgstr ""
+msgstr "Contribuții totale"
msgid "Total Score"
-msgstr ""
+msgstr "Scor total"
msgid "Total artifacts size: %{total_size}"
-msgstr ""
+msgstr "Mărimea totală a artefactelor: %{total_size}"
msgid "Total cores (CPUs)"
-msgstr ""
+msgstr "Total nuclee (CPU)"
msgid "Total memory (GB)"
-msgstr ""
+msgstr "Memorie totală (GB)"
msgid "Total test time for all commits/merges"
msgstr "Timpul total de testare pentru toate commit-urile/îmbinările"
msgid "Total users"
-msgstr ""
+msgstr "Total utilizatori"
msgid "Total weight"
msgstr "Greutatea totală"
@@ -40238,22 +40919,19 @@ msgid "Total: %{total}"
msgstr "Total: %{total}"
msgid "TotalMilestonesIndicator|1000+"
-msgstr ""
+msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
-msgstr ""
-
-msgid "Tracing"
-msgstr ""
+msgstr "1000+"
msgid "Track groups of issues that share a theme, across projects and milestones"
-msgstr ""
+msgstr "Urmăriți grupurile de tichete care împărtășesc o temă, între proiecte și obiective"
msgid "Track important events in your GitLab instance."
-msgstr ""
+msgstr "Urmăriți evenimentele importante din instanța dumneavoastră GitLab."
msgid "Track important events in your group."
-msgstr ""
+msgstr "Urmăriți evenimentele importante din grupul dumneavoastră ."
msgid "Track important events in your project."
msgstr "Urmăriți evenimentele importante din proiectul dumneavoastră."
@@ -40265,16 +40943,16 @@ msgid "Training mode"
msgstr "Modul de formare"
msgid "Transfer"
-msgstr ""
+msgstr "Transfer"
msgid "Transfer group to another parent group."
msgstr "Transferul grupului către un alt grup părinte."
msgid "Transfer ownership"
-msgstr ""
+msgstr "Transferul de proprietate"
msgid "Transfer project"
-msgstr ""
+msgstr "Transferați proiectul"
msgid "Transfer your project into another namespace. %{link_start}Learn more.%{link_end}"
msgstr "Transferați-vă proiectul într-un alt spațiu de nume. %{link_start}Aflați mai multe.%{link_end}"
@@ -40331,49 +41009,49 @@ msgid "TransferProject|You don't have permission to transfer projects into that
msgstr "Nu aveți permisiunea de a transfera proiecte în acel spațiu de nume."
msgid "TransferProject|You don't have permission to transfer this project."
-msgstr ""
+msgstr "Nu aveți permisiunea de a transfera acest proiect."
msgid "Tree view"
msgstr "Afișaj arborescent"
msgid "Trending"
-msgstr ""
+msgstr "Trenduri"
msgid "Trials|%{planName} Trial"
-msgstr ""
+msgstr "Versiune de încercare%{planName}"
msgid "Trials|Compare all plans"
-msgstr ""
+msgstr "Comparați toate planurile"
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
-msgstr ""
+msgstr "Creați un nou grup pentru a începe perioada de încercare GitLab Ultimate."
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr "Ziua %{daysUsed}/%{duration}"
msgid "Trials|Go back to GitLab"
-msgstr ""
+msgstr "ÃŽnapoi la GitLab"
msgid "Trials|Hey there"
-msgstr ""
+msgstr "Salut"
msgid "Trials|Skip Trial"
-msgstr "Săriți peste evaluare"
+msgstr "Săriți perioada de încercare"
msgid "Trials|Upgrade %{groupName} to %{planName}"
-msgstr ""
+msgstr "Actualizați %{groupName} la %{planName}"
msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
+msgstr "Puteți relua oricând acest proces selectându-vă avatarul și alegând \"Începeți o perioadă de încercare Ultimate\"."
msgid "Trials|You can apply your trial to a new group or an existing group."
-msgstr ""
+msgstr "Puteți aplica perioada de încercare unui grup nou sau unui grup existent."
msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
+msgstr "Nu veÈ›i obÈ›ine o perioadă de încercare gratuită chiar acum, dar puteÈ›i relua oricând acest proces prin selectarea avatarului dvs. È™i alegerea „ÎncepeÈ›i o perioadă de încercare Ultimateâ€."
msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you’re enjoying the features of GitLab %{planName}. To keep those features after your trial ends, you’ll need to buy a subscription. (You can also choose GitLab Premium if it meets your needs.)"
-msgstr ""
+msgstr "Perioada dvs. de încercare se încheie la %{boldStart}%{trialEndDate}%{boldEnd}. Sperăm că vă bucurați de caracteristicile GitLab %{planName}. Pentru a păstra aceste caracteristici după ce se termină perioada de încercare, va trebui să cumpărați un abonament. (De asemenea, puteți alege GitLab Premium, dacă vă satisface nevoile)."
msgid "Trial|Allowed characters: +, 0-9, -, and spaces."
msgstr "Caractere permise: +, 0-9, - și spații."
@@ -40394,7 +41072,7 @@ msgid "Trial|Dismiss"
msgstr "Respingeți"
msgid "Trial|GitLab Ultimate trial (optional)"
-msgstr "Evaluarea GitLab Ultimate (opțional)"
+msgstr "Versiunea de încercare GitLab Ultimate (opțional)"
msgid "Trial|Number of employees"
msgstr "Număr de angajați"
@@ -40402,9 +41080,6 @@ msgstr "Număr de angajați"
msgid "Trial|Please select a country"
msgstr "Vă rugăm să selectați o țară"
-msgid "Trial|Successful trial activation image"
-msgstr "Imagine de activare a încercării de succes"
-
msgid "Trial|Telephone number"
msgstr "Număr de telefon"
@@ -40412,10 +41087,10 @@ msgid "Trial|Upgrade to Ultimate to keep using GitLab with advanced features."
msgstr "Faceți upgrade la Ultimate pentru a continua să utilizați GitLab cu funcții avansate."
msgid "Trial|We will activate your trial on your group after you complete this step. After 30 days, you can:"
-msgstr "După finalizarea acestei etape, vă vom activa evaluarea pe grupul dumneavoastră. După 30 de zile, puteți:"
+msgstr "După finalizarea acestei etape, vă vom activa versiunea de încercare pentru grupul dumneavoastră. După 30 de zile, puteți:"
msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial."
-msgstr "Versiunea dvs. de evaluare GitLab Ultimate durează 30 de zile, dar vă puteți păstra contul gratuit GitLab pentru totdeauna. Avem nevoie doar de câteva informații suplimentare pentru a activa versiunea de evaluare."
+msgstr "Versiunea dvs. de încercare GitLab Ultimate durează 30 de zile, dar vă puteți păstra contul gratuit GitLab pentru totdeauna. Avem nevoie doar de câteva informații suplimentare pentru a vă activa versiunea de încercare."
msgid "Trigger"
msgstr "Declanșator"
@@ -40430,7 +41105,7 @@ msgid "Trigger cluster reindexing. Only use this with an index that was created
msgstr "Declanșați reindexarea clusterului. Folosiți această opțiune numai cu un index care a fost creat în GitLab 13.0 sau o versiune ulterioară."
msgid "Trigger job"
-msgstr ""
+msgstr "Job declanșator"
msgid "Trigger manual job"
msgstr "Declanșează un job manual"
@@ -40471,32 +41146,29 @@ msgstr "Utilizatorul declanșator nu are permisiuni suficiente pentru proiect"
msgid "Trigger|invalid"
msgstr "invalid"
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
-msgstr ""
+msgstr "De încredere"
msgid "Trusted applications are automatically authorized on GitLab OAuth flow. It's highly recommended for the security of users that trusted applications have the confidential setting set to true."
msgstr "AplicaÈ›iile de încredere sunt autorizate automat pe fluxul OAuth GitLab. Este foarte recomandat pentru securitatea utilizatorilor ca aplicaÈ›iile de încredere să aibă setarea confidenÈ›ialitate setată la „trueâ€."
msgid "Try again"
-msgstr ""
+msgstr "Încercați din nou"
msgid "Try again?"
-msgstr ""
+msgstr "Mai încercați o dată?"
msgid "Try all GitLab features for free for 30 days. No credit card required."
msgstr "Încercați toate caracteristicile GitLab gratuit timp de 30 de zile. Nu este nevoie de card de credit."
msgid "Try all GitLab has to offer for 30 days."
-msgstr ""
+msgstr "Încercați tot ce are GitLab de oferit timp de 30 de zile."
msgid "Try changing or removing filters."
-msgstr ""
+msgstr "Încercați să schimbați sau să înlăturați filtrele."
msgid "Try grouping with different labels"
-msgstr ""
+msgstr "Încercați să grupați cu etichete diferite"
msgid "Try out GitLab Pipelines"
msgstr "Încercați pipeline-urile GitLab"
@@ -40508,94 +41180,97 @@ msgid "Try to fork again"
msgstr "Încercați să bifurcați din nou"
msgid "Try to keep the first line under 52 characters and the others under 72."
-msgstr ""
+msgstr "Încercați să păstrați prima linie sub 52 de caractere, iar celelalte sub 72."
msgid "Try using a different search term to find the file you are looking for."
-msgstr ""
+msgstr "Încercați să utilizați un alt termen de căutare pentru a găsi fișierul pe care îl căutați."
msgid "Trying to communicate with your device. Plug it in (if needed) and press the button on the device now."
-msgstr ""
+msgstr "Încercați să comunicați cu dispozitivul dumneavoastră. Conectați-l (dacă este necesar) și apăsați butonul de pe dispozitiv acum."
msgid "Trying to communicate with your device. Plug it in (if you haven't already) and press the button on the device now."
-msgstr ""
+msgstr "Încercați să comunicați cu dispozitivul dvs. Conectați-l ( dacă nu ați făcut-o deja) și apăsați butonul de pe dispozitiv acum."
msgid "Tuesday"
-msgstr ""
+msgstr "Marți"
msgid "Turn off"
-msgstr ""
+msgstr "Opriți"
msgid "Turn off notifications"
-msgstr ""
+msgstr "Dezactivați notificările"
msgid "Turn on"
-msgstr ""
+msgstr "Porniți"
msgid "Turn on notifications"
-msgstr ""
+msgstr "Activați notificările"
msgid "Twitter"
-msgstr ""
+msgstr "Twitter"
msgid "Twitter:"
-msgstr ""
+msgstr "Twitter:"
msgid "Two-Factor Authentication"
-msgstr ""
+msgstr "Autentificarea cu doi factori"
msgid "Two-Factor Authentication code"
-msgstr ""
+msgstr "Codul de autentificare cu doi factori"
msgid "Two-factor Authentication"
-msgstr ""
+msgstr "Autentificarea cu doi factori"
msgid "Two-factor Authentication Recovery codes"
-msgstr ""
+msgstr "Codurile de recuperare a autentificării cu doi factori"
msgid "Two-factor Authentication:"
-msgstr ""
+msgstr "Autentificarea cu doi factori:"
msgid "Two-factor authentication"
-msgstr ""
+msgstr "Autentificarea cu doi factori"
msgid "Two-factor authentication disabled"
-msgstr ""
+msgstr "Autentificarea cu doi factori dezactivată"
+
+msgid "Two-factor authentication grace period"
+msgstr "Perioada de grație pentru autentificarea cu doi factori"
msgid "Two-factor authentication has been disabled for this user"
-msgstr ""
+msgstr "Autentificarea cu doi factori a fost dezactivată pentru acest utilizator"
msgid "Two-factor authentication has been disabled for your GitLab account."
-msgstr ""
+msgstr "Autentificarea cu doi factori a fost dezactivată pentru contul dvs. GitLab."
msgid "Two-factor authentication has been disabled successfully!"
-msgstr ""
+msgstr "Autentificarea cu doi factori a fost dezactivată cu succes!"
msgid "Two-factor authentication is not enabled for this user"
-msgstr ""
+msgstr "Autentificarea cu doi factori nu este activată pentru acest utilizator"
msgid "Two-factor grace period"
-msgstr "Perioadă de grație cu doi factori"
+msgstr "Perioada de grație cu doi factori"
msgid "Type"
-msgstr "Tip"
+msgstr "Tipul"
msgid "U2F Devices (%{length})"
-msgstr ""
+msgstr "Dispozitive U2F (%{length})"
msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details."
msgstr "U2F funcționează numai cu site-uri web compatibile cu HTTPS. Contactați administratorul pentru mai multe detalii."
msgid "URL"
-msgstr ""
+msgstr "URL"
msgid "URL cannot be blank"
msgstr "URL-ul nu poate fi gol"
msgid "URL is invalid"
-msgstr ""
+msgstr "URL-ul este nevalid"
msgid "URL is required"
-msgstr ""
+msgstr "URL-ul este necesar"
msgid "URL is triggered for each branch updated to the repository"
msgstr "URL-ul este declanșat pentru fiecare ramură actualizată în repozitoriu"
@@ -40610,22 +41285,22 @@ msgid "URL is triggered when repository is updated"
msgstr "URL-ul este declanșat atunci când repozitoriul este actualizat"
msgid "URL must be percent-encoded if necessary."
-msgstr ""
+msgstr "URL-ul trebuie să fie codificat în procente, dacă este necesar."
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
-msgstr ""
+msgstr "URL-ul trebuie să înceapă cu %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, sau %{codeStart}ftp://%{codeEnd}"
msgid "URL of the Grafana instance to link to from the Metrics Dashboard menu item."
msgstr "URL-ul instanÈ›ei Grafana către care se face legătura din elementul meniului „Tablou de bord de metriciâ€."
msgid "URL of the external Spam Check endpoint"
-msgstr ""
+msgstr "URL-ul punctului final extern de Verificare spam"
msgid "URL of the external storage to serve the repository static objects."
msgstr "URL-ul stocării externe care servește obiectele statice ale repozitoriului."
msgid "URL or request ID"
-msgstr ""
+msgstr "URL-ul sau ID-ul solicitării"
msgid "USER %{user_name} WILL BE REMOVED! Are you sure?"
msgstr "UTILIZATORUL %{user_name} VA FI ÎNLĂTURAT! Sunteți sigur?"
@@ -40637,22 +41312,19 @@ msgid "USER WILL BE BLOCKED! Are you sure?"
msgstr "UTILIZATORUL VA FI BLOCAT! Sunteți sigur?"
msgid "UTC"
-msgstr ""
+msgstr "UTC"
msgid "Unable to apply suggestions to a deleted line."
-msgstr ""
+msgstr "Nu se pot aplica sugestii la o linie ștearsă."
msgid "Unable to build Slack link."
msgstr "Nu se poate crea un link Slack."
msgid "Unable to collect CPU info"
-msgstr ""
+msgstr "Nu se pot colecta informații despre CPU"
msgid "Unable to collect memory info"
-msgstr ""
-
-msgid "Unable to connect to Elasticsearch"
-msgstr "Nu se poate conecta la Elasticsearch"
+msgstr "Nu se pot colecta informații despre memorie"
msgid "Unable to connect to Prometheus server"
msgstr "Nu se poate conecta la serverul Prometheus"
@@ -40663,24 +41335,18 @@ msgstr "Nu se poate conecta la server: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr "Nu se poate conecta la instanța Jira. Vă rugăm să verificați configurația de integrare Jira."
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
-msgstr ""
+msgstr "Nu se poate crea un link către vulnerabilitate"
msgid "Unable to fetch branch list for this project."
-msgstr ""
+msgstr "Nu se poate prelua lista ramurilor acestui proiect."
msgid "Unable to fetch branches list, please close the form and try again"
-msgstr ""
+msgstr "Nu s-a putut prelua lista ramurilor, vă rugăm să închideți formularul și să încercați din nou"
msgid "Unable to fetch upstream and downstream pipelines."
msgstr "Imposibil de preluat pipeline-urile din amonte și din aval."
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr "Nu se poate găsi proiectul Jira din care să se importe date."
@@ -40688,13 +41354,13 @@ msgid "Unable to fully load the default commit message. You can still apply this
msgstr "Nu s-a putut încărca în totalitate mesajul implicit al commit-ului. Puteți aplica în continuare această sugestie iar mesajul commit-ului va fi corect"
msgid "Unable to generate new instance ID"
-msgstr ""
+msgstr "Nu se poate genera un nou ID de instanță"
msgid "Unable to load commits. Try again later."
msgstr "Commit-urile nu se pot încărca. Încercați din nou mai târziu."
msgid "Unable to load file contents. Try again later."
-msgstr ""
+msgstr "Nu a putut fi încărcat conținutul fișierului. Încercați din nou mai târziu."
msgid "Unable to load refs"
msgstr "Nu se pot încărca referințele"
@@ -40708,32 +41374,35 @@ msgstr "Nu se poate încărca diff-ul. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "Imposibil de încărcat widget-ul Merge-Request-ului. Încercați să reîncărcați pagina."
+msgid "Unable to parse the vulnerability report's options."
+msgstr "Nu se pot analiza opțiunile raportului de vulnerabilitate."
+
msgid "Unable to save iteration. Please try again"
-msgstr ""
+msgstr "Nu se poate salva iterația. Vă rugăm să încercați din nou"
msgid "Unable to save your changes. Please try again."
msgstr "Nu se pot salva modificările. Vă rugăm să încercați din nou."
msgid "Unable to save your preference"
-msgstr ""
+msgstr "Nu se poate salva preferința dumneavoastră"
msgid "Unable to schedule a pipeline to run immediately"
-msgstr ""
+msgstr "Nu se poate programa un pipeline pentru a se executa imediat"
msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
-msgstr ""
+msgstr "Nu vă puteÈ›i conecta la grup cu SAML deoarece „%{reason}â€"
msgid "Unable to suggest a path. Please refresh and try again."
msgstr "Imposibil de sugerat o cale. Vă rugăm să reîmprospătați și să încercați din nou."
msgid "Unable to update label prioritization at this time"
-msgstr ""
+msgstr "Nu se poate actualiza prioritizarea etichetelor în acest moment"
msgid "Unable to update this epic at this time."
-msgstr ""
+msgstr "Nu se poate actualiza această epică în acest moment."
msgid "Unable to update this issue at this time."
-msgstr ""
+msgstr "Nu se poate actualiza această problemă în acest moment."
msgid "Unable to verify the user"
msgstr "Nu se poate verifica utilizatorul"
@@ -40748,22 +41417,22 @@ msgid "Unapproved the current merge request."
msgstr "Merge request-ul actual a fost dezaprobat."
msgid "Unarchive project"
-msgstr ""
+msgstr "Dezarhivați proiectul"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "Dezarhivarea proiectului va restabili capacitatea membrilor săi de a face modificări la acesta. Commit-urile pot fi făcute în repozitoriu, iar problemele, comentariile și alte entități pot fi create. %{strong_start}Odată activat, acest proiect apare în căutare și în tabloul de bord.%{strong_end} %{link_start}Aflați mai multe.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr "Prin dezarhivarea proiectului, se restabilește capacitatea membrilor săi de a face commit-uri și de a crea probleme, comentarii și alte entități. %{strong_start}După ce dezarhivați proiectul, acesta se afișează în căutare și în tabloul de bord.%{strong_end} %{link_start}Aflați mai multe.%{link_end}"
msgid "Unassign from commenting user"
-msgstr ""
+msgstr "Anulați atribuirea unui utilizator care comentează"
msgid "Unassigned"
-msgstr ""
+msgstr "Atribuire anulată"
msgid "Unauthenticated API rate limit period in seconds"
msgstr "Perioada limită a ratei pentru API-ul neautentificat în secunde"
msgid "Unauthenticated requests"
-msgstr ""
+msgstr "Solicitări neautentificate"
msgid "Unauthenticated web rate limit period in seconds"
msgstr "Perioada limită a ratei pentru web-ul neautentificat în secunde"
@@ -40772,49 +41441,46 @@ msgid "Uncommitted changes will be lost if you change branches. Do you want to c
msgstr "Modificările care nu au fost comise vor fi pierdute dacă schimbați ramurile. Doriți să continuați?"
msgid "Undo"
-msgstr ""
+msgstr "Anulare"
msgid "Undo Ignore"
-msgstr ""
+msgstr "Anulare Ignorare"
msgid "Undo ignore"
-msgstr ""
+msgstr "Anulare Ignorare"
msgid "Unexpected error"
-msgstr ""
+msgstr "Eroare neașteptată"
msgid "Unfollow"
-msgstr ""
+msgstr "Anulați urmărirea"
msgid "Unfortunately, your email message to GitLab could not be processed."
-msgstr ""
+msgstr "Din păcate, mesajul dvs. de e-mail către GitLab nu a putut fi procesat."
msgid "Unhappy?"
-msgstr ""
+msgstr "Nemulțumit(ă)?"
msgid "Units|ms"
-msgstr ""
+msgstr "ms"
msgid "Units|s"
-msgstr ""
+msgstr "s"
msgid "Unknown"
-msgstr ""
+msgstr "Necunoscut"
msgid "Unknown Error"
-msgstr ""
-
-msgid "Unknown cache key"
-msgstr ""
+msgstr "Eroare necunoscută"
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
-msgstr ""
+msgstr "Strategie de criptare necunoscută: %{encrypted_strategy}!"
msgid "Unknown format"
-msgstr ""
+msgstr "Format necunoscut"
msgid "Unknown response text"
-msgstr ""
+msgstr "Text de răspuns necunoscut"
msgid "Unknown screen"
msgstr "Ecran necunoscut"
@@ -40826,106 +41492,100 @@ msgid "Unless otherwise agreed to in writing with GitLab, by clicking \"Upload L
msgstr "Dacă nu se convine altfel în scris cu GitLab, făcând clic pe „Încărcare Licență†sunteți de acord că utilizarea software-ului GitLab este supusă %{eula_link_start}Termenilor și condițiilor de utilizare%{eula_link_end}."
msgid "Unlimited"
-msgstr ""
+msgstr "Nelimitat"
msgid "Unlink"
-msgstr ""
+msgstr "Dezlegare"
msgid "Unlock"
-msgstr ""
+msgstr "Deblocați"
msgid "Unlock account"
-msgstr ""
+msgstr "Deblocați contul"
msgid "Unlock merge request"
-msgstr ""
+msgstr "Deblocați merge request-ul"
msgid "Unlock more features with GitLab Ultimate"
-msgstr ""
+msgstr "Deblocați mai multe funcții cu GitLab Ultimate"
msgid "Unlock the discussion"
-msgstr ""
+msgstr "Deblocați discuția"
msgid "Unlock this %{issuableDisplayName}? %{strongStart}Everyone%{strongEnd} will be able to comment."
msgstr "Deblocați acest %{issuableDisplayName}? %{strongStart}Toată lumea%{strongEnd} va putea să comenteze."
msgid "Unlocked"
-msgstr ""
+msgstr "Deblocat"
msgid "Unlocked the discussion."
-msgstr ""
+msgstr "Discuția a fost deblocată."
msgid "Unlocks the discussion."
-msgstr ""
-
-msgid "Unmarked this %{noun} as a draft."
-msgstr "Acest %{noun} nu mai este marcat ca draft."
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr "Anulați marcarea acestui %{noun} ca un draft."
+msgstr "Deblochează discuția."
msgid "Unreachable"
-msgstr ""
+msgstr "Inaccesibil"
msgid "Unrecognized approval status."
msgstr "Statusul de aprobare nerecunoscut."
msgid "Unrecognized cluster type"
-msgstr "Tipul de cluster nerecunoscut"
+msgstr "Tip de cluster nerecunoscut"
msgid "Unresolve"
-msgstr ""
+msgstr "Marcați nerezolvat"
msgid "Unresolve thread"
msgstr "Marcați subiect ca nerezolvat"
msgid "Unresolved"
-msgstr ""
+msgstr "Nerezolvat"
msgid "Unschedule job"
-msgstr ""
+msgstr "Deprogramați jobul"
msgid "Unstar"
-msgstr ""
+msgstr "Anulare stea"
msgid "Unstarted"
-msgstr ""
+msgstr "Neînceput"
msgid "Unsubscribe"
-msgstr ""
+msgstr "Dezabonare"
msgid "Unsubscribe at group level"
-msgstr ""
+msgstr "Dezabonați-vă la nivel de grup"
msgid "Unsubscribe at project level"
-msgstr ""
+msgstr "Dezabonați-vă la nivel de proiect"
msgid "Unsubscribe from %{type}"
-msgstr ""
+msgstr "Dezabonați-vă de la %{type}"
msgid "Unsubscribed from this %{quick_action_target}."
-msgstr ""
+msgstr "V-ați dezabonat de la acest/această %{quick_action_target}."
msgid "Unsubscribes from this %{quick_action_target}."
-msgstr ""
+msgstr "Se dezabonează de la acest/această %{quick_action_target}."
msgid "Unsupported sort value."
-msgstr ""
+msgstr "Valoare de sortare neacceptată."
msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
-msgstr "Tipul de todo transmis nu este acceptat. Tipurile de todo acceptate sunt: %{todo_types}"
+msgstr "Tip de sarcină de făcut neacceptat transmis. Tipurile de lucruri de făcut acceptate sunt: %{todo_types}"
msgid "Unused"
-msgstr ""
+msgstr "Nefolosit"
msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
-msgstr ""
+msgstr "Indicii anteriori neutilizați: %{index_names} vor fi șterși automat după %{time}."
msgid "Unverified"
-msgstr ""
+msgstr "Neverificat"
msgid "Up to date"
-msgstr ""
+msgstr "La zi"
msgid "Upcoming"
msgstr "Viitoare"
@@ -40934,70 +41594,70 @@ msgid "Upcoming Release"
msgstr "Lansarea viitoare"
msgid "Update"
-msgstr ""
+msgstr "Actualizare"
msgid "Update %{sourcePath} file"
-msgstr ""
+msgstr "Actualizați fișierul %{sourcePath}"
msgid "Update Now"
-msgstr "Actualizare imediată"
+msgstr "Actualizați acum"
msgid "Update Scheduled…"
-msgstr ""
+msgstr "Actualizare programată…"
msgid "Update all"
-msgstr ""
+msgstr "Actualizați tot"
msgid "Update appearance settings"
-msgstr ""
+msgstr "Actualizați setările aspectului"
msgid "Update approval rule"
msgstr "Actualizați regula de aprobare"
msgid "Update approvers"
-msgstr ""
+msgstr "Actualizați aprobatorii"
msgid "Update broadcast message"
-msgstr ""
+msgstr "Actualizați mesajul difuzat"
msgid "Update failed"
-msgstr ""
+msgstr "Actualizarea a eșuat"
msgid "Update it"
-msgstr ""
+msgstr "Actualizați-o"
msgid "Update milestone"
-msgstr ""
+msgstr "Actualizați obiectivul"
msgid "Update now"
-msgstr "Actualizare imediată"
+msgstr "Actualizați acum"
msgid "Update username"
msgstr "Actualizați numele de utilizator"
msgid "Update variable"
-msgstr ""
+msgstr "Actualizați variabila"
msgid "Update your bookmarked URLs as filtered/sorted branches URL has been changed."
-msgstr ""
+msgstr "Actualizați URL-urile marcate ca favorite, deoarece URL-urile ramurilor filtrate/sortate au fost modificate."
msgid "Update your group name, description, avatar, and visibility."
-msgstr ""
+msgstr "Actualizați numele, descrierea, avatarul și vizibilitatea grupului dumneavoastră."
msgid "Update your project name, topics, description, and avatar."
-msgstr ""
+msgstr "Actualizați numele, subiectele, descrierea și avatarul proiectului dumneavoastră."
msgid "UpdateProject|Cannot rename project because it contains container registry tags!"
msgstr "Nu se poate redenumi proiectul deoarece acesta conține etichete de registru container!"
msgid "UpdateProject|Could not set the default branch"
-msgstr ""
+msgstr "Nu s-a putut seta ramura implicită"
msgid "UpdateProject|New visibility level not allowed!"
-msgstr ""
+msgstr "Noul nivel de vizibilitate nu este permis!"
msgid "UpdateProject|Project could not be updated!"
-msgstr ""
+msgstr "Proiectul nu a putut fi actualizat!"
msgid "UpdateRepositoryStorage|Failed to verify %{type} repository checksum from %{old} to %{new}"
msgstr "Nu s-a reușit verificarea sumei de control a repozitoriului %{type} de la %{old} la %{new}"
@@ -41006,49 +41666,49 @@ msgid "UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes"
msgstr "Timeout de așteptare pentru împingeri de repozitorii %{type}"
msgid "Updated"
-msgstr ""
+msgstr "Actualizat"
msgid "Updated %{updated_at} by %{updated_by}"
-msgstr ""
+msgstr "Actualizat la %{updated_at} de %{updated_by}"
msgid "Updated date"
msgstr "Data actualizării"
msgid "Updating"
-msgstr ""
+msgstr "Actualizare"
msgid "Updating the attention request for %{username} failed."
msgstr "Actualizarea solicitării de atenție pentru %{username} a eșuat."
msgid "Updating…"
-msgstr ""
+msgstr "Actualizare..."
msgid "Upgrade offers available!"
-msgstr ""
+msgstr "Oferte de upgrade disponibile!"
msgid "Upload"
-msgstr ""
+msgstr "Încărcare"
msgid "Upload %{file_name} file"
msgstr "Încărcați fișierul %{file_name}"
msgid "Upload CSV file"
-msgstr ""
+msgstr "Încărcați fișierul CSV"
msgid "Upload File"
-msgstr ""
+msgstr "Încărcați fișierul"
msgid "Upload New File"
-msgstr ""
+msgstr "Încărcați un fișier nou"
msgid "Upload a certificate for your domain with all intermediates"
-msgstr ""
+msgstr "Încărcați un certificat pentru domeniul dvs cu toți intermediarii"
msgid "Upload a private key for your certificate"
-msgstr ""
+msgstr "Încărcați o cheie privată pentru certificatul d-voastră"
msgid "Upload file"
-msgstr ""
+msgstr "Încărcați fișierul"
msgid "Upload image"
msgstr "încărcați o imagine"
@@ -41057,40 +41717,37 @@ msgid "Upload new file"
msgstr "Încărcați un nou fișier"
msgid "Upload object map"
-msgstr ""
+msgstr "Încărcați maparea obiectelor"
-msgid "UploadLink|click to upload"
-msgstr "faceți clic pentru a încărca"
-
-msgid "Uploaded"
-msgstr "Încărcat"
+msgid "Uploaded date"
+msgstr ""
msgid "Uploading changes to terminal"
-msgstr ""
+msgstr "Încărcarea modificărilor în terminal"
msgid "Uploading..."
-msgstr ""
+msgstr "Se încarcă..."
msgid "Upstream"
-msgstr ""
+msgstr "ÃŽn amonte"
msgid "Uptime"
-msgstr ""
+msgstr "Timp de funcționare"
msgid "Upvotes"
-msgstr ""
+msgstr "Voturi pozitive"
msgid "Usage Trends"
-msgstr ""
+msgstr "Tendințe de utilizare"
msgid "Usage statistics"
-msgstr ""
+msgstr "Statistici de utilizare"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}Executorii partajați%{help_link_end} sunt dezactivați, așa că nu există limite stabilite pentru utilizarea de pipeline-uri."
msgid "UsageQuota|%{linkStart}Shared runners%{linkEnd} are disabled, so there are no limits set on pipeline usage"
-msgstr ""
+msgstr "%{linkStart}Executorii partajați%{linkEnd} sunt dezactivați, așa că nu există limite stabilite pentru utilizarea pipeline-ului."
msgid "UsageQuota|%{linkTitle} help link"
msgstr "%{linkTitle} link de ajutor"
@@ -41107,14 +41764,11 @@ msgstr "Artefactele reprezintă o sumă de artefacte de construcție și de pipe
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Mostre audio, videoclipuri, seturi de date și grafice."
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr "Din cauza unei probleme cunoscute, totalul artefactelor pentru unele proiecte poate fi incorect. Pentru mai multe detalii, citiți %{warningLinkStart}epica%{warningLinkEnd}."
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Cumpărați minute suplimentare"
msgid "UsageQuota|Buy storage"
-msgstr ""
+msgstr "Cumpărați spațiu de stocare"
msgid "UsageQuota|CI minutes usage by month"
msgstr "Utilizarea de minute CI pe lună"
@@ -41132,13 +41786,13 @@ msgid "UsageQuota|Code packages and container images."
msgstr "Pachete de cod și imagini de containere."
msgid "UsageQuota|Container Registry"
-msgstr ""
+msgstr "Registrul de containere"
msgid "UsageQuota|Current period usage"
msgstr "Utilizarea în perioada curentă"
msgid "UsageQuota|Dependency proxy"
-msgstr ""
+msgstr "Proxy de dependență"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr "Fișiere atașate și elemente grafice de design mai mici."
@@ -41150,10 +41804,10 @@ msgid "UsageQuota|Git repository."
msgstr "Repozitoriul Git."
msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images."
-msgstr ""
+msgstr "Registrul de container Docker integrat în Gitlab pentru stocarea imaginilor Docker."
msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images. %{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "Registrul de container Docker integrat în Gitlab pentru stocarea imaginilor Docker. %{linkStart}Mai multe informații%{linkEnd}"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "Include artefacte, depozite, wiki, încărcări și alte elemente."
@@ -41171,13 +41825,13 @@ msgid "UsageQuota|Learn more about usage quotas"
msgstr "Aflați mai multe despre cotele de utilizare"
msgid "UsageQuota|Learn more about usage quotas."
-msgstr ""
+msgstr "Aflați mai multe despre cotele de utilizare."
msgid "UsageQuota|Local proxy used for frequently-accessed upstream Docker images. %{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "Proxy local utilizat pentru imaginile Docker din amonte accesate frecvent. %{linkStart}Mai multe informații%{linkEnd}"
msgid "UsageQuota|Namespace storage used"
-msgstr ""
+msgstr "Stocarea spațiului de nume utilizată"
msgid "UsageQuota|No CI minutes usage data available."
msgstr "Nu sunt disponibile date privind utilizarea minutelor CI."
@@ -41198,40 +41852,43 @@ msgid "UsageQuota|Purchase more storage"
msgstr "Cumpărați mai mult spațiu de stocare"
msgid "UsageQuota|Purchased storage"
-msgstr ""
+msgstr "Stocarea achiziționată"
msgid "UsageQuota|Purchased storage available"
-msgstr "Stocare achiziționată disponibilă"
+msgstr "Stocarea achiziționată disponibilă"
msgid "UsageQuota|Purchased storage used"
-msgstr ""
+msgstr "Stocarea achiziționată folosită"
msgid "UsageQuota|Recalculate repository usage"
-msgstr ""
+msgstr "Recalculați utilizarea repozitorului"
msgid "UsageQuota|Repository"
msgstr "Repozitoriu"
msgid "UsageQuota|Seats"
-msgstr "Seats"
+msgstr "Seat-uri"
msgid "UsageQuota|Shared bits of code and text."
msgstr "Fragmente de cod și de text partajate."
msgid "UsageQuota|Shared runner duration"
-msgstr ""
+msgstr "Durata executorilor partajați"
msgid "UsageQuota|Snippets"
msgstr "Fragmente de cod"
msgid "UsageQuota|Something went wrong while fetching pipeline statistics"
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării statisticilor pipeline-ului"
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr "Ceva nu a mers bine în timpul preluării statisticilor de stocare a proiectului"
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr "Ceva nu a mers bine la încărcarea detaliilor de utilizare"
+
msgid "UsageQuota|Storage"
-msgstr "Spațiu de stocare"
+msgstr "Stocare"
msgid "UsageQuota|Storage type"
msgstr "Tipul de stocare"
@@ -41240,13 +41897,13 @@ msgid "UsageQuota|Storage used"
msgstr "Stocarea utilizată"
msgid "UsageQuota|The table below shows current period usage"
-msgstr ""
+msgstr "Tabelul de mai jos prezintă utilizarea din perioada curentă"
msgid "UsageQuota|The table below shows usage since %{timeElapsed}"
-msgstr ""
+msgstr "Tabelul de mai jos arată utilizarea de la %{timeElapsed}"
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr "Aceasta este cantitatea totală de spațiu de stocare utilizată pentru toate proiectele dvs. din acest spațiu de nume."
+msgstr "Aceasta este stocarea totală utilizată de toate proiectele dvs. din acest spațiu de nume."
msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
msgstr "Aceasta este cantitatea totală de spațiu de stocare utilizată de proiecte peste limita de stocare gratuită de %{actualRepositorySizeLimit}."
@@ -41258,10 +41915,10 @@ msgid "UsageQuota|This namespace has no projects which use shared runners"
msgstr "Acest spațiu de nume nu are niciun proiect care să folosească executori partajați"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
-msgstr ""
+msgstr "Acest spațiu de nume nu are proiecte care au folosit executorii partajați în perioada curentă."
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
-msgstr ""
+msgstr "Acest tabel omite proiectele care au folosit 0 minute CI/CD sau 0 minute de funcționare partajată."
msgid "UsageQuota|Total excess storage used"
msgstr "Totalul stocării excesive utilizate"
@@ -41303,7 +41960,7 @@ msgid "UsageQuota|Usage quotas help link"
msgstr "Link de ajutor pentru cotele de utilizare"
msgid "UsageQuota|Usage since %{usageSince}"
-msgstr ""
+msgstr "Utilizare de la %{usageSince}"
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr "Atunci când achiziționați spațiu de stocare suplimentar, deblocăm automat proiectele care au fost blocate atunci când ați atins limita de %{actualRepositorySizeLimit}."
@@ -41432,7 +42089,7 @@ msgid "Use Secure Files to store files used by your pipelines such as Android ke
msgstr "Utilizați Fișiere Securizate pentru a stoca fișiere utilizate de pipeline-urile dvs., cum ar fi depozitele de chei Android sau profilurile de provizionare și certificatele de semnare Apple."
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
-msgstr ""
+msgstr "Utilizați un autentificator de parole unice pe dispozitivul dvs. mobil sau pe computer pentru a activa autentificarea cu doi factori (2FA)."
msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
msgstr "Utilizați un Șablon AWS CloudFormation (CFT) pentru a instala și configura executorii GitLab în AWS."
@@ -41444,103 +42101,103 @@ msgid "Use banners and notifications to notify your users about scheduled mainte
msgstr "Folosiți bannere și notificări pentru a vă anunța utilizatorii despre întreținerea programată, actualizările recente și multe altele."
msgid "Use cURL"
-msgstr ""
+msgstr "Folosiți cURL"
msgid "Use custom color #FF0000"
-msgstr ""
+msgstr "Folosiți culoarea personalizată # FF0000"
msgid "Use double quotes for multiple keywords, such as %{code_open}\"your search\"%{code_close}"
-msgstr "Folosiți ghilimele duble pentru multiple cuvinte cheie, cum ar fi %{code_open}\"căutarea dumneavoastră\"%{code_close}"
+msgstr "FolosiÈ›i ghilimele duble pentru cuvintele cheie multiple, cum ar fi %{code_open}„căutarea d-voastrăâ€%{code_close}"
msgid "Use hashed storage"
-msgstr ""
+msgstr "Utilizați stocarea hash"
msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0. %{link_start}Learn more.%{link_end}"
-msgstr "Utilizați căi de stocare hashate pentru repozitoriile nou create și redenumite. Întotdeauna activată de la versiunea 13.0. %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Utilizați căi de stocare hash pentru repozitoriile nou create și redenumite. Activată întotdeauna începând cu versiunea 13.0. %{link_start}Aflați mai multe.%{link_end}"
msgid "Use issue count"
-msgstr ""
+msgstr "Utilizați numărul de probleme"
msgid "Use issue weight"
-msgstr "Utilizați greutatea problemei"
+msgstr "Utilizați greutate de problemă"
msgid "Use one line per URI"
-msgstr ""
+msgstr "Folosiți o linie pentru fiecare URI"
msgid "Use primary email (%{email})"
-msgstr ""
+msgstr "Utilizați e-mail-ul principal (%{email})"
msgid "Use shortcuts"
-msgstr ""
+msgstr "Folosiți comenzi rapide"
msgid "Use slash commands."
msgstr "Utilizați comenzi slash."
msgid "Use template"
-msgstr ""
+msgstr "Utilizați șablonul"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr "Utilizați opțiunea %{strongStart}Test%{strongEnd} menționată anterior pentru a crea un eveniment."
msgid "Use the link below to confirm your email address (%{email})"
-msgstr ""
+msgstr "Utilizați linkul de mai jos pentru a vă confirma adresa de e-mail (%{email})"
msgid "Use the link below to confirm your email address."
-msgstr ""
+msgstr "Utilizați linkul de mai jos pentru a vă confirma adresa de e-mail."
msgid "Use the public cloud instance URL (%{kroki_public_url}) or %{install_link_start}install Kroki%{install_link_end} on your own infrastructure and use your own instance URL."
-msgstr "Utilizați URL-ul instanței cloud publice (%{kroki_public_url}) sau %{install_link_start}instalați Kroki%{install_link_end} pe infrastructura dvs. și utilizați URL-ul instanței dvs."
+msgstr "Folosiți URL-ul instanței cloud publice (%{kroki_public_url}) sau %{install_link_start}instalați Kroki%{install_link_end} pe propria infrastructură și folosiți propriul URL de instanță."
msgid "Use the search bar on the top of this page"
-msgstr ""
+msgstr "Utilizați bara de căutare din partea de sus a acestei pagini"
msgid "Use this token to validate received payloads."
msgstr "Utilizați acest token pentru a valida payload-urile primite."
msgid "Use webhook"
-msgstr ""
+msgstr "Utilizați webhook"
msgid "Use your global notification setting"
-msgstr ""
+msgstr "Utilizați setarea de notificare globală"
msgid "Use your smart card to authenticate with the LDAP server."
-msgstr ""
+msgstr "Utilizați cardul inteligent pentru a vă autentifica prin serverul LDAP."
msgid "Used"
-msgstr ""
+msgstr "Folosit"
msgid "Used by members to sign in to your group in GitLab"
-msgstr ""
+msgstr "Folosit de membri pentru a se conecta la grupul dvs. în GitLab"
msgid "Used by more than 100,000 organizations, GitLab is the most popular solution to manage git repositories on-premises."
-msgstr ""
+msgstr "Folosit de peste 100.000 de organizații, GitLab este cea mai populară soluție de gestionare a repozitoriilor git la nivel local."
msgid "Used programming language"
-msgstr ""
+msgstr "Limbaj de programare folosit"
msgid "Used to help configure your identity provider"
-msgstr ""
+msgstr "Utilizat pentru a ajuta la configurarea furnizorului dvs. de identitate"
msgid "User"
-msgstr ""
+msgstr "Utilizator"
msgid "User %{current_user_username} has started impersonating %{username}"
msgstr "Utilizatorul %{current_user_username} a început să o/îl impersoneze pe %{username}"
msgid "User %{username} was successfully removed."
-msgstr ""
+msgstr "Utilizatorul %{username} a fost înlăturat cu succes."
msgid "User %{user} was removed from %{group}."
-msgstr ""
+msgstr "Utilizatorul %{user} a fost înlăturat din %{group}."
msgid "User ID"
-msgstr ""
+msgstr "ID utilizator"
msgid "User OAuth applications"
-msgstr ""
+msgstr "Aplicații OAuth pentru utilizatori"
msgid "User Settings"
-msgstr ""
+msgstr "Setări utilizator"
msgid "User and IP rate limits"
msgstr "Limitele ratei pentru utilizatori și IP"
@@ -41558,73 +42215,73 @@ msgid "User does not have a pending request"
msgstr "Utilizatorul nu are o solicitare în așteptare"
msgid "User identity was successfully created."
-msgstr ""
+msgstr "Identitatea utilizatorului a fost creată cu succes."
msgid "User identity was successfully removed."
-msgstr ""
+msgstr "Identitatea utilizatorului a fost înlăturată cu succes."
msgid "User identity was successfully updated."
-msgstr ""
+msgstr "Identitatea utilizatorului a fost actualizată cu succes."
msgid "User is not allowed to resolve thread"
msgstr "Utilizatorul nu are voie să rezolve subiectul"
msgid "User key"
-msgstr "Cheie utilizator"
+msgstr "Cheie de utilizator"
msgid "User key was successfully removed."
-msgstr ""
+msgstr "Cheia utilizatorului a fost înlăturată cu succes."
msgid "User list %{name} will be removed. Are you sure?"
msgstr "Lista de utilizatori %{name} va fi înlăturată. Sunteți sigur?"
msgid "User map"
-msgstr ""
+msgstr "Mapare utilizator"
msgid "User pipeline minutes were successfully reset."
-msgstr ""
+msgstr "Minutele de pipeline ale utilizatorului au fost resetate cu succes."
msgid "User restrictions"
-msgstr ""
+msgstr "Restricții pentru utilizatori"
msgid "User settings"
-msgstr ""
+msgstr "Setări de utilizator"
msgid "User was successfully created."
-msgstr ""
+msgstr "Utilizatorul a fost creat cu succes."
msgid "User was successfully removed from group and any subgroups and projects."
-msgstr ""
+msgstr "Utilizatorul a fost înlăturat cu succes din grup și din toate subgrupurile și proiectele."
msgid "User was successfully removed from group."
-msgstr ""
+msgstr "Utilizatorul a fost înlăturat cu succes din grup."
msgid "User was successfully removed from project."
-msgstr ""
+msgstr "Utilizatorul a fost înlăturat cu succes din proiect."
msgid "User was successfully updated."
-msgstr ""
+msgstr "Utilizatorul a fost actualizat cu succes."
msgid "User-based escalation rules must have a user with access to the project"
msgstr "Regulile de escaladare bazate pe utilizatori trebuie să aibă un utilizator cu acces la proiect."
msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
-msgstr ""
+msgstr "%{author} %{spanStart}(Ocupat)%{spanEnd}"
msgid "UserAvailability|%{author} (Busy)"
-msgstr ""
+msgstr "%{author} (Ocupat)"
msgid "UserAvailability|(Busy)"
-msgstr ""
+msgstr "(Ocupat)"
msgid "UserLists|Add"
msgstr "Adăugați"
msgid "UserLists|Add Users"
-msgstr "Adăugare de utilizatori"
+msgstr "Adăuga utilizatori"
msgid "UserLists|Add users"
-msgstr "Adăugați utilizatori"
+msgstr "Adăugare utilizatori"
msgid "UserLists|Cancel"
msgstr "Anulare"
@@ -41651,7 +42308,7 @@ msgid "UserLists|Get started with user lists"
msgstr "Începeți cu listele de utilizatori"
msgid "UserLists|Lists allow you to define a set of users to be used with feature flags. %{linkStart}Read more about feature flag lists.%{linkEnd}"
-msgstr "Listele vă permit să definiți un set de utilizatori care să fie folosiți cu Feature Flags. %{linkStart}Citiți mai multe despre listele Feature Flag.%{linkEnd}"
+msgstr "Listele vă permit să definiți un set de utilizatori care să fie utilizați cu feature flags. %{linkStart}Citiți mai multe despre listele feature flags.%{linkEnd}"
msgid "UserLists|Loading user lists"
msgstr "Se încarcă listele de utilizatori"
@@ -41708,7 +42365,7 @@ msgid "UserProfile|Bot activity"
msgstr "Activitate bot"
msgid "UserProfile|Contributed projects"
-msgstr "Proiecte la care au contribuit"
+msgstr "Proiecte contribuite"
msgid "UserProfile|Edit profile"
msgstr "Editare profil"
@@ -41762,7 +42419,7 @@ msgid "UserProfile|Star projects to track their progress and show your appreciat
msgstr "Marcați proiectele ca favorite pentru a le urmări progresul și pentru a vă arăta aprecierea."
msgid "UserProfile|Starred projects"
-msgstr "Proiecte marcate cu stele"
+msgstr "Proiecte cu stea"
msgid "UserProfile|Subscribe"
msgstr "Înscrieți-vă"
@@ -41843,10 +42500,10 @@ msgid "Username: %{username}"
msgstr "Nume de utilizator: %{username}"
msgid "Users"
-msgstr ""
+msgstr "Utilizatori"
msgid "Users API rate limit"
-msgstr ""
+msgstr "Limita ratei API a utilizatorilor"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "Utilizatorii pot lansa un mediu de dezvoltare dintr-o filă de browser GitLab atunci când este activată integrarea %{linkStart}Gitpod%{linkEnd}"
@@ -41857,41 +42514,47 @@ msgstr "Utilizatorii își pot reactiva conturile conectându-se. %{link_start}A
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr "Utilizatorii pot reda diagrame în documente AsciiDoc, Markdown, reStructuredText, și Textile utilizând Kroki."
+msgid "Users can request access (if visibility is public or internal)"
+msgstr "Utilizatorii pot solicita accesul (dacă vizibilitatea este publică sau internă)"
+
+msgid "Users cannot be added to projects in this group"
+msgstr "Utilizatorii nu pot fi adăugați la proiectele din acest grup"
+
msgid "Users in License"
msgstr "Utilizatori în licență"
msgid "Users or groups set as approvers in the project's or merge request's settings."
-msgstr ""
+msgstr "Utilizatorii sau grupurile stabilite ca aprobatori în setările proiectului sau ale merge request-ului."
msgid "Users over License"
msgstr "Utilizatori peste licență"
msgid "Users requesting access to"
-msgstr ""
+msgstr "Utilizatorii care solicită acces la"
msgid "Users to exclude from the rate limit"
msgstr "Utilizatori de exclus de la limita de rată"
msgid "Users were successfully added."
-msgstr ""
+msgstr "Utilizatorii au fost adăugați cu succes."
msgid "Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
msgstr "Utilizatorii cu rol de Invitat sau cei care nu aparțin unui Proiect sau Grup nu vor utiliza un seat din licența dumneavoastră."
msgid "UsersSelect|%{name} + %{length} more"
-msgstr ""
+msgstr "%{name} + %{length} mai mult"
msgid "UsersSelect|Any User"
-msgstr ""
+msgstr "Orice utilizator"
msgid "UsersSelect|Assignee"
-msgstr ""
+msgstr "Responsabil"
msgid "UsersSelect|No assignee - %{openingTag} assign yourself %{closingTag}"
-msgstr ""
+msgstr "Niciun responsabil - %{openingTag} atribuiați-vă %{closingTag}"
msgid "UsersSelect|Unassigned"
-msgstr ""
+msgstr "Neatribuit"
msgid "Uses GitLab as a lightweight alternative to Sentry."
msgstr "Folosiți GitLab ca o alternativă ușoară la Sentry."
@@ -41900,22 +42563,22 @@ msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%
msgstr "Folosirea %{code_start}::%{code_end} indică un %{link_start}set de etichete cu scop%{link_end}"
msgid "Using required encryption strategy when encrypted field is missing!"
-msgstr ""
+msgstr "Utilizarea strategiei de criptare necesară atunci când câmpul criptat lipsește!"
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 ""
+msgstr "Utilizând cuvântul cheie %{codeStart}needs%{codeEnd}, joburile unei etape ulterioare se execută înainte de finalizarea completă a etapei actuale. Joburile rulează imediat ce sunt îndeplinite relațiile %{codeStart}needs%{codeEnd}, ceea ce accelerează pipeline-urile."
msgid "Valid From"
msgstr "Valabil de la"
msgid "Validate"
-msgstr ""
+msgstr "Validați"
msgid "Validate your GitLab CI configuration"
-msgstr ""
+msgstr "Validați configurația GitLab CI"
msgid "Validate your GitLab CI configuration file"
-msgstr ""
+msgstr "Validați fișierul dvs de configurare GitLab CI"
msgid "Validated at"
msgstr "Validat la"
@@ -41927,22 +42590,22 @@ msgid "Validated:"
msgstr "Validat:"
msgid "Validations failed."
-msgstr ""
+msgstr "Validările au eșuat."
msgid "Value"
-msgstr ""
+msgstr "Valoare"
msgid "Value Stream Analytics"
-msgstr "Analizele Value Stream"
+msgstr "Analiza Fluxului de valori"
msgid "Value Stream Analytics can help you determine your team’s velocity"
-msgstr "Analizele Value Stream vă pot ajuta să determinați velocitatea echipei dumneavoastră."
+msgstr "Analiza Fluxului de valori vă poate ajuta să determinați viteza echipei dumneavoastră."
msgid "Value might contain a variable reference"
msgstr "Valoarea poate conține o referință la o variabilă"
msgid "Value stream"
-msgstr "Value stream"
+msgstr "Fluxul de valori"
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr "Nu avem suficiente date pentru a afișa această etapă."
@@ -41952,9 +42615,9 @@ msgstr "%{stageCount}+ elemente"
msgid "ValueStreamAnalytics|%{subjectFilterText} and %{selectedLabelsCount} label"
msgid_plural "ValueStreamAnalytics|%{subjectFilterText} and %{selectedLabelsCount} labels"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{subjectFilterText} și %{selectedLabelsCount} etichetă"
+msgstr[1] "%{subjectFilterText} și %{selectedLabelsCount} etichete"
+msgstr[2] "%{subjectFilterText} și %{selectedLabelsCount} de etichete"
msgid "ValueStreamAnalytics|%{value}M"
msgstr "%{value}luni"
@@ -41978,61 +42641,61 @@ msgid "ValueStreamAnalytics|Average number of deployments to production per day.
msgstr "Numărul mediu de implementări în producție pe zi."
msgid "ValueStreamAnalytics|DORA metrics"
-msgstr ""
+msgstr "Metrici DORA"
msgid "ValueStreamAnalytics|Dashboard"
-msgstr "Dashboard"
+msgstr "Tablou de bord"
msgid "ValueStreamAnalytics|Go to docs"
msgstr "Mergeți la documente"
msgid "ValueStreamAnalytics|Key metrics"
-msgstr ""
+msgstr "Metrici cheie"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
-msgstr ""
+msgstr "Timpul mediu în care un incident a fost deschis într-un mediu de producție în perioada de timp dată."
msgid "ValueStreamAnalytics|Median time between merge request merge and deployment to a production environment for all MRs deployed in the given time period."
-msgstr "Timpul median dintre îmbinarea merge request-urilor și implementarea într-un mediu de producție pentru toate MR-urile desfășurate în perioada de timp dată."
+msgstr "Timpul mediu dintre îmbinarea merge request-urilor și implementarea într-un mediu de producție pentru toate MR-urile desfășurate în perioada de timp dată."
msgid "ValueStreamAnalytics|Median time from issue created to issue closed."
-msgstr "Timpul median de la crearea problemei până la închiderea acesteia."
+msgstr "Timpul mediu de la crearea problemei până la închiderea acesteia."
msgid "ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
-msgstr "Timpul median de la primul commit al merge request-ului unei probleme legate până la momentul în care problema respectivă este închisă."
+msgstr "Timpul mediu de la primul commit al merge request-ului unei probleme legate până la momentul în care problema respectivă este închisă."
msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
msgstr "Numărul de commit-uri împinse în ramura implicită"
msgid "ValueStreamAnalytics|Number of new issues created."
-msgstr "Număr de noi probleme create."
+msgstr "Numărul de noi probleme create."
msgid "ValueStreamAnalytics|Percentage of deployments that cause an incident in production."
-msgstr ""
+msgstr "Procentul de implementări care provoacă un incident în producție."
msgid "ValueStreamAnalytics|Shows %{selectedFiltersDescription} for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
-msgstr ""
+msgstr "Afișează %{selectedFiltersDescription} pentru grupul „%{groupName}†și %{selectedProjectCount} (de) proiecte creat(e) între %{createdAfter} și %{createdBefore}"
msgid "ValueStreamAnalytics|Shows %{selectedFiltersDescription} for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
-msgstr ""
+msgstr "Afișează %{selectedFiltersDescription} pentru grupul „%{groupName}†de la %{createdAfter} la %{createdBefore}"
msgid "ValueStreamAnalytics|Tasks by type"
-msgstr ""
+msgstr "Sarcini după tip"
msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
-msgstr "A apărut o eroare în timpul preluării datelor de analize value stream %{requestTypeName}."
+msgstr "S-a produs o eroare în timpul preluării datelor de analiză a fluxului de valori %{requestTypeName}."
msgid "ValueStreamAnalytics|Total number of deploys to production."
msgstr "Numărul total de implementări în producție."
msgid "ValueStreamAnalytics|Value stream"
-msgstr ""
+msgstr "Fluxul de valori"
msgid "ValueStreamEvent|Items in stage"
msgstr "Elemente în etapă"
msgid "ValueStreamEvent|Stage time (median)"
-msgstr "Durata etapei (mediană)"
+msgstr "Durata etapei (medie)"
msgid "ValueStreamEvent|Start"
msgstr "Start"
@@ -42041,19 +42704,19 @@ msgid "ValueStreamEvent|Stop"
msgstr "Stop"
msgid "ValueStream|The Default Value Stream cannot be deleted"
-msgstr "Value Stream implicit nu poate fi șters"
+msgstr "Fluxul de valori implicit nu poate fi șters"
msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr "Valorile care conțin caracterul %{codeStart}$%{codeEnd} pot fi considerate o referință la o variabilă și pot fi extinse.%{docsLinkStart}Aflați mai multe.%{docsLinkEnd}"
msgid "Variable"
-msgstr ""
+msgstr "Variabilă"
msgid "Variable will be masked in job logs."
msgstr "Variabila va fi mascată în jurnalele de joburi."
msgid "Variables"
-msgstr ""
+msgstr "Variabile"
msgid "Variables can be:"
msgstr "Variabilele pot fi:"
@@ -42068,13 +42731,13 @@ msgid "Various container registry settings."
msgstr "Diverse setări ale registrului de containere."
msgid "Various email settings."
-msgstr ""
+msgstr "Diverse setări de e-mail."
msgid "Various settings that affect GitLab performance."
-msgstr ""
+msgstr "Diverse setări care afectează performanța GitLab."
msgid "Verification status"
-msgstr "Starea de verificare"
+msgstr "Starea verificării"
msgid "VerificationReminder|Pipeline failing? To keep GitLab spam and abuse free we ask that you verify your identity."
msgstr "Pipeline-ul nu reușește? Pentru a menține GitLab fără spam și abuzuri, vă rugăm să vă verificați identitatea."
@@ -42089,25 +42752,25 @@ msgid "VerificationReminder|You’ll now be able to take advantage of free CI/CD
msgstr "Acum veți putea profita de minutele gratuite de CI/CD pe executorii partajați."
msgid "Verified"
-msgstr ""
+msgstr "Verificat"
msgid "Verify SAML Configuration"
-msgstr ""
+msgstr "Verificați configurația SAML"
msgid "Verify code"
-msgstr ""
+msgstr "Verificați codul"
msgid "Verify configuration"
-msgstr ""
+msgstr "Verificați configurația"
msgid "Version"
-msgstr ""
+msgstr "Versiune"
msgid "Version %{versionNumber}"
-msgstr ""
+msgstr "Versiunea %{versionNumber}"
msgid "Version %{versionNumber} (latest)"
-msgstr ""
+msgstr "Versiunea %{versionNumber} (cea mai recentă)"
msgid "VersionCheck|Up to date"
msgstr "La zi"
@@ -42121,9 +42784,6 @@ msgstr "Actualizare disponibilă"
msgid "VersionCheck|Your GitLab Version"
msgstr "Versiunea dvs. GitLab"
-msgid "View Documentation"
-msgstr "Vizualizați documentația"
-
msgid "View Stage: %{title}"
msgstr "Vizualizați etapa: %{title}"
@@ -42140,7 +42800,7 @@ msgid "View all issues"
msgstr "Vizualizați toate problemele"
msgid "View all personal projects"
-msgstr ""
+msgstr "Vedeți toate proiectele personale"
msgid "View blame"
msgstr "Vizualizați blame"
@@ -42155,7 +42815,7 @@ msgstr[1] "Vizualizați graficele"
msgstr[2] "Vizualizați graficele"
msgid "View dependency details for your project"
-msgstr "Vizualizați detaliile de dependență pentru proiectul dumneavoastră"
+msgstr "Vizualizați detaliile dependențelor pentru proiectul dvs."
msgid "View deployment"
msgstr "Vizualizați desfășurarea"
@@ -42169,9 +42829,6 @@ msgstr "Vizualizați detalii: %{details_url}"
msgid "View documentation"
msgstr "Vizualizați documentația"
-msgid "View downstream pipeline"
-msgstr "Vizualizați pipeline-ul din aval"
-
msgid "View eligible approvers"
msgstr "Vizualizați aprobatorii eligibili"
@@ -42221,7 +42878,7 @@ msgid "View issues"
msgstr "Vizualizați problemele"
msgid "View it on GitLab"
-msgstr ""
+msgstr "Vizualizați-l pe GitLab"
msgid "View job"
msgstr "Vedeți jobul"
@@ -42281,7 +42938,7 @@ msgid "View supported languages and frameworks"
msgstr "Vedeți limbajele și framework-urile acceptate"
msgid "View the %{code_open}last_activity_at%{code_close} attribute for %{project_link} using the %{projects_api_link}."
-msgstr ""
+msgstr "Vizualizați atributul %{code_open}last_activity_at%{code_close} pentru %{project_link} utilizând %{projects_api_link}."
msgid "View the documentation"
msgstr "Consultați documentația"
@@ -42311,67 +42968,67 @@ msgid "Violation"
msgstr "Încălcare"
msgid "Visibility"
-msgstr ""
+msgstr "Vizibilitate"
msgid "Visibility and access controls"
-msgstr ""
+msgstr "Vizibilitatea și controlul accesului"
msgid "Visibility level"
-msgstr ""
+msgstr "Nivelul de vizibilitate"
msgid "Visibility level:"
-msgstr ""
+msgstr "Nivelul de vizibilitate:"
msgid "Visibility settings have been disabled by the administrator."
-msgstr ""
+msgstr "Setările de vizibilitate au fost dezactivate de administrator."
msgid "Visibility, project features, permissions"
-msgstr ""
+msgstr "Vizibilitate, funcții de proiect, permisiuni"
msgid "Visibility:"
-msgstr ""
+msgstr "Vizibilitate:"
msgid "VisibilityLevel|Internal"
-msgstr ""
+msgstr "Intern"
msgid "VisibilityLevel|Private"
-msgstr ""
+msgstr "Privat"
msgid "VisibilityLevel|Public"
-msgstr ""
+msgstr "Public"
msgid "VisibilityLevel|Unknown"
-msgstr ""
+msgstr "Necunoscut"
msgid "Visual Studio Code (HTTPS)"
-msgstr ""
+msgstr "Codul Visual Studio (HTTPS)"
msgid "Visual Studio Code (SSH)"
-msgstr ""
+msgstr "Codul Visual Studio (SSH)"
msgid "Vulnerabilities"
-msgstr ""
+msgstr "Vulnerabilități"
msgid "Vulnerabilities over time"
-msgstr ""
+msgstr "Vulnerabilități în timp"
msgid "Vulnerability"
-msgstr ""
+msgstr "Vulnerabilitate"
msgid "Vulnerability Report"
-msgstr ""
+msgstr "Raport de vulnerabilitate"
msgid "Vulnerability remediated. Review before resolving."
-msgstr ""
+msgstr "Vulnerabilitate remediată. Examinați înainte de rezolvare."
msgid "Vulnerability report"
msgstr "Raport de vulnerabilitate"
msgid "Vulnerability resolved in %{branch}"
-msgstr ""
+msgstr "Vulnerabilitate rezolvată în %{branch}"
msgid "Vulnerability resolved in the default branch"
-msgstr ""
+msgstr "Vulnerabilitate rezolvată în ramura implicită"
msgid "VulnerabilityChart|%{formattedStartDate} to today"
msgstr "%{formattedStartDate} până astăzi"
@@ -42443,7 +43100,7 @@ msgid "VulnerabilityManagement|Needs triage"
msgstr "Necesită clasificare"
msgid "VulnerabilityManagement|Read more about related issues"
-msgstr "Citiți mai multe despre problemele asociate"
+msgstr "Citiți mai multe despre probleme conexe"
msgid "VulnerabilityManagement|Related Jira issues"
msgstr "Probleme legate de Jira"
@@ -42692,46 +43349,46 @@ msgid "WARNING: This snippet contains hidden files which might be used to mask m
msgstr "AVERTISMENT: Acest fragment de cod conține fișiere ascunse care pot fi folosite pentru a masca un comportament rău intenționat. Fiți precauți la clonarea și executarea codului din acest fragment de cod."
msgid "Wait for the file to load to copy its contents"
-msgstr ""
+msgstr "Așteptați încărcarea fișierului pentru a copia conținutul acestuia"
msgid "Waiting for approval"
msgstr "Se așteaptă aprobarea"
msgid "Waiting for merge (open and assigned)"
-msgstr ""
+msgstr "Se așteaptă pentru îmbinare (deschisă și atribuită)"
msgid "Waiting for performance data"
-msgstr ""
+msgstr "Se așteaptă datele de performanță"
msgid "Want to see the data? Please ask an administrator for access."
-msgstr ""
+msgstr "Doriți să vedeți datele? Adresați-vă unui administrator pentru acces."
msgid "Warning"
-msgstr ""
+msgstr "Avertisment"
msgid "Warning:"
-msgstr ""
+msgstr "Avertisment:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
-msgstr ""
+msgstr "Avertisment: Afișarea acestei diagrame poate cauza probleme de performanță pe această pagină."
msgid "Warning: Synchronizing LDAP removes direct members' access."
-msgstr ""
+msgstr "Avertisment: Sincronizarea LDAP înlătură accesul direct al membrilor."
msgid "Watch how"
msgstr "Observați cum"
msgid "We are currently unable to fetch data for the pipeline header."
-msgstr ""
+msgstr "ÃŽn prezent, nu putem prelua date pentru antetul pipeline-ului."
msgid "We are currently unable to fetch data for this graph."
-msgstr ""
+msgstr "ÃŽn prezent, nu putem prelua date pentru acest grafic."
msgid "We could not determine the path to remove the epic"
-msgstr ""
+msgstr "Nu am putut determina calea pentru a elimina epica"
msgid "We could not determine the path to remove the issue"
-msgstr ""
+msgstr "Nu am putut determina calea pentru a elimina problema"
msgid "We couldn't find any %{scope} matching %{term}"
msgstr "Nu s-au găsit %{scope} care să corespundă cu %{term}"
@@ -42743,76 +43400,76 @@ msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "Nu s-au găsit %{scope} care să corespundă cu %{term} din proiectul %{project}."
msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
+msgstr "Nu am putut ajunge la serverul Prometheus. Fie serverul nu mai există, fie detaliile de configurare trebuie actualizate."
msgid "We created a sandbox project that will help you learn the basics of GitLab. You’ll be guided by issues in an issue board. You can go through the issues at your own pace."
-msgstr ""
+msgstr "Am creat un proiect sandbox care vă va ajuta să învățați elementele de bază ale GitLab. Veți fi ghidat prin probleme într-un tablou de probleme. Puteți parcurge problemele în propriul ritm."
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
-msgstr ""
+msgstr "Am detectat un spam potențial în %{humanized_resource_name}. Vă rugăm să rezolvați reCAPTCHA pentru a continua."
msgid "We don't have enough data to show this stage."
-msgstr ""
+msgstr "Nu avem suficiente date pentru a afișa această etapă."
msgid "We have found the following errors:"
-msgstr ""
+msgstr "Am găsit următoarele erori:"
msgid "We heard back from your device. You have been authenticated."
-msgstr ""
+msgstr "Am primit răspuns de la dispozitivul dvs. Ați fost autentificat."
msgid "We invite you to %{featureLinkStart}request a feature%{featureLinkEnd}, %{bugLinkStart}report a bug%{bugLinkEnd} or %{feedbackLinkStart}share feedback%{feedbackLinkEnd}"
msgstr "Vă invităm să %{featureLinkStart}solicitați o caracteristică%{featureLinkEnd}, %{bugLinkStart}să raportați un bug%{bugLinkEnd} sau %{feedbackLinkStart}să împărtășiți feedbackul%{feedbackLinkEnd}"
msgid "We recommend a work email address."
-msgstr ""
+msgstr "Vă recomandăm o adresă de e-mail de serviciu."
msgid "We recommend cloud-based mobile authenticator apps such as Authy, Duo Mobile, and LastPass. They can restore access if you lose your hardware device."
-msgstr ""
+msgstr "Vă recomandăm aplicațiile de autentificare mobilă bazate pe cloud, cum ar fi Authy, Duo Mobile și LastPass. Acestea pot restabili accesul în cazul în care vă pierdeți dispozitivul hardware."
msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
+msgstr "Vă recomandăm să lăsați toți analizatorii SAST activi"
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
-msgstr "Vă recomandăm să cumpărați minute suplimentare de conducte pentru a evita orice întrerupere a serviciului."
+msgstr "Vă recomandăm să cumpărați minute suplimentare pipeline pentru a evita orice întrerupere a serviciului."
msgid "We recommend that you buy additional Pipeline minutes to resume normal service."
-msgstr "Vă recomandăm să cumpărați minute suplimentare de conducte pentru a relua serviciul normal."
+msgstr "Vă recomandăm să cumpărați minute suplimentare pipeline pentru a relua serviciul normal."
msgid "We sent you an email with reset password instructions"
-msgstr ""
+msgstr "V-am trimis un e-mail cu instrucțiuni de resetare a parolei"
msgid "We tried to automatically renew your subscription for %{strong}%{namespace_name}%{strong_close} on %{expires_on} but something went wrong so your subscription was downgraded to the free plan. Don't worry, your data is safe. We suggest you check your payment method and get in touch with our support team (%{support_link}). They'll gladly help with your subscription renewal."
msgstr "Am încercat să vă reînnoim automat abonamentul pentru %{strong}%{namespace_name}%{strong_close} pe %{expires_on}, dar ceva nu a mers bine, așa că abonamentul dvs. a fost retrogradat la planul gratuit. Nu vă faceți griji, datele dvs. sunt în siguranță. Vă sugerăm să vă verificați metoda de plată și să luați legătura cu echipa noastră de asistență (%{support_link}). Aceștia vă vor ajuta cu plăcere să vă reînnoiți abonamentul."
msgid "We want to be sure it is you, please confirm you are not a robot."
-msgstr ""
+msgstr "Vrem să fim siguri că sunteți dvs., vă rugăm să confirmați că nu sunteți un robot."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
-msgstr ""
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgstr "Dorim să vă informăm că %{username} a fost interzis din %{scope} deoarece a descărcat mai mult de %{max_project_downloads} (de) repozitorii de proiecte în decurs de %{within_minutes} (de) minute."
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
-msgstr ""
+msgstr "Vom notifica %{inviter} că ați refuzat invitația de a vă alătura GitLab. Nu veți mai primi mementouri."
msgid "We would like to inform you that your subscription GitLab Enterprise Edition %{plan_name} is nearing its user limit. You have %{active_user_count} active users, which is almost at the user limit of %{maximum_user_count}."
-msgstr "Dorim să vă informăm că abonamentul GitLab Enterprise Edition %{plan_name} se apropie de limita de utilizatori. Aveți %{active_user_count} utilizatori activi, care este aproape de limita maximă de %{maximum_user_count} de utilizatori."
+msgstr "Dorim să vă informăm că abonamentul Ediția GitLab Enterprise %{plan_name} se apropie de limita de utilizatori. Aveți %{active_user_count} utilizatori activi, care este aproape de limita maximă de %{maximum_user_count} de utilizatori."
msgid "We'll continuously validate your pipeline configuration. The validation results will appear here."
-msgstr ""
+msgstr "Vom valida în permanență configurația pipeline-ului dumneavoastră. Rezultatele validării vor apărea aici."
msgid "We'll use this to help surface the right features and information to you."
-msgstr ""
+msgstr "Vom folosi aceste date pentru a vă ajuta să evidențiați caracteristicile și informațiile potrivite pentru dumneavoastră."
msgid "We're experiencing difficulties and this tab content is currently unavailable."
msgstr "Ne confruntăm cu dificultăți și conținutul acestei file este momentan indisponibil"
msgid "We've detected some unusual activity"
-msgstr ""
+msgstr "Am detectat o activitate neobișnuită"
msgid "We've detected unusual activity"
-msgstr ""
+msgstr "Am detectat o activitate neobișnuită"
msgid "We've found no vulnerabilities"
-msgstr ""
+msgstr "Nu am găsit nicio vulnerabilitate"
msgid "Web IDE"
msgstr "Web IDE"
@@ -42824,10 +43481,10 @@ msgid "Web terminal"
msgstr "Terminal web"
msgid "WebAuthn Devices (%{length})"
-msgstr ""
+msgstr "Dispozitive WebAuthn (%{length})"
msgid "WebAuthn only works with HTTPS-enabled websites. Contact your administrator for more details."
-msgstr ""
+msgstr "WebAuthn funcționează numai cu site-uri web compatibile HTTPS. Contactați administratorul dumneavoastră pentru mai multe detalii."
msgid "WebIDE|Fork project"
msgstr "Creați fork de proiect"
@@ -42854,28 +43511,28 @@ msgid "WebIDE|You need permission to edit files directly in this project."
msgstr "Aveți nevoie de permisiunea de a edita fișiere direct în acest proiect."
msgid "WebexTeamsService|Send notifications about project events to Webex Teams."
-msgstr ""
+msgstr "Trimiteți notificări despre evenimentele proiectului către Webex Teams."
msgid "WebexTeamsService|Send notifications about project events to a Webex Teams conversation. %{docs_link}"
-msgstr "Trimite notificări despre evenimentele din proiect într-o conversație Webex Teams. %{docs_link}"
+msgstr "Trimiteți notificări despre evenimentele proiectului către o conversație Webex Teams. %{docs_link}"
msgid "WebexTeamsService|Webex Teams"
msgstr "Webex Teams"
msgid "Webhook"
-msgstr ""
+msgstr "Webhook"
msgid "Webhook Logs"
-msgstr ""
+msgstr "Jurnalele Webhook"
msgid "Webhook Settings"
-msgstr ""
+msgstr "Setări Webhook"
msgid "Webhook events will be displayed here."
msgstr "Evenimentele Webhook vor fi afișate aici."
msgid "Webhook:"
-msgstr ""
+msgstr "Webhook:"
msgid "Webhooks"
msgstr "Webhook-uri"
@@ -42986,7 +43643,7 @@ msgid "Webhooks|Releases events"
msgstr "Evenimente de lansări"
msgid "Webhooks|SSL verification"
-msgstr ""
+msgstr "Verificarea SSL"
msgid "Webhooks|Secret token"
msgstr "Token secret"
@@ -43034,16 +43691,16 @@ msgid "Website"
msgstr "Site web"
msgid "Website:"
-msgstr ""
+msgstr "Site web:"
msgid "Wednesday"
-msgstr ""
+msgstr "Miercuri"
msgid "Weekday"
-msgstr ""
+msgstr "Ziua săptămânii"
msgid "Weeks"
-msgstr ""
+msgstr "Săptămâni"
msgid "Weight"
msgstr "Greutate"
@@ -43052,40 +43709,40 @@ msgid "Weight %{weight}"
msgstr "Greutate %{weight}"
msgid "Welcome back! Your account had been deactivated due to inactivity but is now reactivated."
-msgstr ""
+msgstr "Bine ați revenit! Contul dvs. a fost dezactivat din cauza inactivității, dar acum este reactivat."
msgid "Welcome to GitLab"
-msgstr ""
+msgstr "Bine ați venit la GitLab"
msgid "Welcome to GitLab, %{first_name}!"
-msgstr ""
+msgstr "Bine ați venit la GitLab, %{first_name}!"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
-msgstr ""
+msgstr "Bine ați venit la GitLab,%{br_tag}%{name}!"
msgid "Welcome, %{name}!"
-msgstr ""
+msgstr "Bine ați venit, %{name}!"
msgid "What are CI/CD minutes?"
msgstr "Ce sunt minutele CI/CD?"
msgid "What are group audit events?"
-msgstr ""
+msgstr "Ce sunt evenimentele de audit de grup?"
msgid "What are instance audit events?"
-msgstr ""
+msgstr "Ce sunt evenimentele de audit de instanță?"
msgid "What are project audit events?"
-msgstr ""
+msgstr "Ce sunt evenimentele de audit de proiect?"
msgid "What does this command do?"
-msgstr ""
+msgstr "Ce face această comandă?"
msgid "What is Markdown?"
msgstr "Ce este Markdown?"
msgid "What is listed here?"
-msgstr ""
+msgstr "Ce este listat aici?"
msgid "What is repository mirroring?"
msgstr "Ce este replicarea repozitoriului?"
@@ -43094,16 +43751,16 @@ msgid "What is squashing?"
msgstr "Ce este squashing-ul?"
msgid "What templates can I create?"
-msgstr ""
+msgstr "Ce șabloane pot crea?"
msgid "What will you use this group for?"
msgstr "Pentru ce veți folosi acest grup?"
msgid "What would you like to do?"
-msgstr ""
+msgstr "Ce ați dori să faceți?"
msgid "What's new"
-msgstr ""
+msgstr "Ce este nou"
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr "Atunci când un job de implementare are succes, săriți joburile de implementare mai vechi încă în așteptare."
@@ -43118,10 +43775,10 @@ msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr "Atunci când este activată, politicile de curățare se execută mai rapid, dar solicită mai mult Redis."
msgid "When enabled, existing access tokens may be revoked. Leave blank for no limit."
-msgstr ""
+msgstr "Atunci când este activat, tokenurile de acces existente pot fi revocate. Lăsați necompletat pentru nicio limită."
msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
-msgstr ""
+msgstr "Atunci când este activat, jurnalele de joburi sunt colectate de Datadog și afișate împreună cu urmele de execuție a pipeline-ului."
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr "Atunci când se închid merge request-urile și commit-urile din ramura implicită, se închid și toate problemele la care fac referire."
@@ -43133,73 +43790,73 @@ msgstr[1] "Când aceste merge request-uri sunt acceptate"
msgstr[2] "Când aceste merge request-uri sunt acceptate"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
-msgstr ""
+msgstr "Atunci când utilizați protocoalele %{code_open}http://%{code_close} sau %{code_open}https://%{code_close}, vă rugăm să furnizați adresa URL exactă a repozitoriului. Redirecționările HTTP nu vor fi respectate."
msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
msgstr "Când vă transferați proiectul într-un grup, puteți să gestionați cu ușurință mai multe proiecte, să vizualizați cotele de utilizare a stocării, a minutelor de pipeline și a utilizatorilor și să începeți o perioadă de încercare sau să treceți la un nivel plătit."
msgid "When:"
-msgstr ""
+msgstr "Când:"
msgid "Which API requests are affected?"
-msgstr ""
+msgstr "Ce solicitări API sunt afectate?"
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
-msgstr "Deși este rar să nu existe vulnerabilități, se poate întâmpla. În orice caz, vă rugăm să vă verificați de două ori setările pentru a vă asigura că v-ați configurat corect dashboard-ul."
+msgstr "Deși este rar să nu existe vulnerabilități, se poate întâmpla. În orice caz, vă rugăm să vă verificați de două ori setările pentru a vă asigura că v-ați configurat corect tabloul de bord."
msgid "Who can approve?"
-msgstr ""
+msgstr "Cine poate aproba?"
msgid "Who can see this group?"
-msgstr ""
+msgstr "Cine poate vedea acest grup?"
msgid "Who will be able to see this group?"
-msgstr ""
+msgstr "Cine va putea să vadă acest grup?"
msgid "Who will be using GitLab?"
-msgstr ""
+msgstr "Cine va folosi GitLab?"
msgid "Who will be using this GitLab subscription?"
-msgstr ""
+msgstr "Cine va folosi acest abonament GitLab?"
msgid "Who will be using this GitLab trial?"
-msgstr ""
+msgstr "Cine va folosi această versiune de încercare GitLab?"
msgid "Who will be using this group?"
-msgstr ""
+msgstr "Cine va folosi acest grup?"
msgid "Why are you signing up? (optional)"
msgstr "De ce vă înscrieți? (opțional)"
msgid "Wiki"
-msgstr ""
+msgstr "Wiki"
msgid "Wiki page"
-msgstr ""
+msgstr "Pagina Wiki"
msgid "Wiki page was successfully created."
-msgstr ""
+msgstr "Pagina Wiki a fost creată cu succes."
msgid "Wiki page was successfully deleted."
-msgstr ""
+msgstr "Pagina Wiki a fost ștearsă cu succes."
msgid "Wiki page was successfully updated."
-msgstr ""
+msgstr "Pagina Wiki a fost actualizată cu succes."
msgid "WikiClone|Clone your wiki"
-msgstr ""
+msgstr "Clonați-vă wiki-ul"
msgid "WikiClone|Git Access"
-msgstr ""
+msgstr "Acces Git"
msgid "WikiClone|Install Gollum"
-msgstr ""
+msgstr "Instalați Gollum"
msgid "WikiClone|Start Gollum and edit locally"
-msgstr ""
+msgstr "Începeți Gollum și editați local"
msgid "WikiEdit|There is already a page with the same title in that path."
-msgstr ""
+msgstr "Există deja o pagină cu același titlu în această cale."
msgid "WikiEmptyIssueMessage|Suggest wiki improvement"
msgstr "Sugerați îmbunătățirea wiki"
@@ -43214,7 +43871,7 @@ msgid "WikiEmptyIssueMessage|issue tracker"
msgstr "tracker de probleme"
msgid "WikiEmpty| Have a Confluence wiki already? Use that instead."
-msgstr ""
+msgstr "Aveți deja un wiki Confluence? Folosiți-l pe acesta în schimb."
msgid "WikiEmpty|A wiki is where you can store all the details about your group. This can include why you've created it, its principles, how to use it, and so on."
msgstr "Un wiki este locul unde puteți stoca toate detaliile despre grupul dvs. Aceasta poate include motivul pentru care l-ați creat, principiile sale, modul de utilizare și așa mai departe."
@@ -43223,64 +43880,64 @@ msgid "WikiEmpty|A wiki is where you can store all the details about your projec
msgstr "Un wiki este locul în care puteți stoca toate detaliile despre proiectul dumneavoastră. Acestea pot include motivul pentru care l-ați creat, principiile sale, modul de utilizare și așa mai departe."
msgid "WikiEmpty|Confluence is enabled"
-msgstr ""
+msgstr "Confluence este activat"
msgid "WikiEmpty|Create your first page"
-msgstr ""
+msgstr "Creați-vă prima pagină"
msgid "WikiEmpty|Enable the Confluence Wiki integration"
-msgstr ""
+msgstr "Activați integrarea Confluence Wiki"
msgid "WikiEmpty|Go to Confluence"
-msgstr ""
+msgstr "Mergeți la Confluence"
msgid "WikiEmpty|Suggest wiki improvement"
-msgstr ""
+msgstr "Sugerați îmbunătățirea wiki-ului"
msgid "WikiEmpty|The wiki lets you write documentation for your group"
-msgstr ""
+msgstr "Wiki vă permite să scrieți documentația pentru grupul dvs."
msgid "WikiEmpty|The wiki lets you write documentation for your project"
-msgstr ""
+msgstr "Wiki vă permite să scrieți documentația pentru proiectul dvs"
msgid "WikiEmpty|This group has no wiki pages"
-msgstr ""
+msgstr "Acest grup nu are pagini wiki"
msgid "WikiEmpty|This project has no wiki pages"
-msgstr ""
+msgstr "Acest proiect nu are pagini wiki"
msgid "WikiEmpty|You must be a group member in order to add wiki pages."
-msgstr ""
+msgstr "Trebuie să fiți membru al grupului pentru a adăuga pagini wiki."
msgid "WikiEmpty|You must be a project member in order to add wiki pages."
-msgstr ""
+msgstr "Trebuie să fiți membru al proiectului pentru a adăuga pagini wiki."
msgid "WikiEmpty|You've enabled the Confluence Workspace integration. Your wiki will be viewable directly within Confluence. We are hard at work integrating Confluence more seamlessly into GitLab. If you'd like to stay up to date, follow our %{wiki_confluence_epic_link_start}Confluence epic%{wiki_confluence_epic_link_end}."
-msgstr ""
+msgstr "Ați activat integrarea spațiului de lucru Confluence. Wiki-ul dvs. va putea fi vizibil direct în Confluence. Lucrăm asiduu la integrarea mai armonioasă a Confluence în GitLab. Dacă vreți să rămâneți la curent, urmați-ne %{wiki_confluence_epic_link_start}epica Confluence%{wiki_confluence_epic_link_end}."
msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
+msgstr "Aceasta este o versiune veche a acestei pagini."
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
-msgstr ""
+msgstr "Puteți vizualiza %{most_recent_link} sau puteți răsfoi %{history_link}."
msgid "WikiHistoricalPage|history"
-msgstr ""
+msgstr "Istoric"
msgid "WikiHistoricalPage|most recent version"
-msgstr ""
+msgstr "versiunea cea mai recentă"
msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
msgstr "Sunteți sigur că doriți să ștergeți această pagină?"
msgid "WikiPageConfirmDelete|Delete page"
-msgstr ""
+msgstr "Ștergeți pagina"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
-msgstr ""
+msgstr "Ștergeți pagina %{pageTitle}?"
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{wikiLinkStart}the page%{wikiLinkEnd} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
+msgstr "Cineva a editat pagina în același timp cu dumneavoastră. Vă rugăm să verificați %{wikiLinkStart}pagina%{wikiLinkEnd} și să vă asigurați că modificările dvs. nu le vor șterge involuntar pe ale lor."
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr "A apărut o eroare în timp ce se încerca redarea editorului de conținut. Vă rugăm să încercați din nou mai târziu."
@@ -43325,7 +43982,7 @@ msgid "WikiPage|Tip: You can move this page by adding the path to the beginning
msgstr "Sfat: Puteți muta această pagină adăugând calea la începutul titlului."
msgid "WikiPage|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
-msgstr "Indicație: Puteți să specificați calea completă a noului fișier. Vom crea automat toate directoarele care lipsesc."
+msgstr "Sfat: Puteți să specificați calea completă a noului fișier. Vom crea automat toate directoarele care lipsesc."
msgid "WikiPage|Title"
msgstr "Titlu"
@@ -43340,88 +43997,109 @@ msgid "WikiPage|Write your content or drag files here…"
msgstr "Scrieți conținutul dvs. sau trageți fișierele aici..."
msgid "Wikis"
-msgstr ""
+msgstr "Wiki-uri"
msgid "Wiki|Create New Page"
-msgstr ""
+msgstr "Creați o pagină nouă"
msgid "Wiki|Created date"
msgstr "Data creării"
msgid "Wiki|Edit Page"
-msgstr ""
+msgstr "Editare pagină"
msgid "Wiki|New page"
-msgstr ""
+msgstr "Pagina nouă"
msgid "Wiki|Page history"
-msgstr ""
+msgstr "Istoricul paginii"
msgid "Wiki|Page version"
-msgstr ""
+msgstr "Versiunea paginii"
msgid "Wiki|Pages"
-msgstr ""
+msgstr "Pagini"
msgid "Wiki|The sidebar failed to load. You can reload the page to try again."
-msgstr ""
+msgstr "Bara laterală nu s-a încărcat. Puteți reîncărca pagina pentru a încerca din nou."
msgid "Wiki|Title"
-msgstr ""
+msgstr "Titlu"
msgid "Wiki|View All Pages"
msgstr "Vizualizați toate paginile"
msgid "Wiki|Wiki Pages"
-msgstr ""
+msgstr "Pagini Wiki"
msgid "Will be created"
-msgstr ""
+msgstr "Va fi creat(ă)"
msgid "Will be mapped to"
-msgstr ""
+msgstr "Va fi mapat la"
msgid "Will deploy to"
msgstr "Se va desfășura la"
+msgid "Wireframe"
+msgstr "Structură de fire"
+
msgid "With requirements, you can set criteria to check your products against."
-msgstr ""
+msgstr "Cu ajutorul cerințelor, puteți stabili criterii de verificare a produselor dumneavoastră."
msgid "With test cases, you can define conditions for your project to meet in determining quality"
msgstr "Cu ajutorul cazurilor de testare, puteți defini condițiile pe care trebuie să le îndeplinească proiectul dumneavoastră pentru a determina calitatea."
msgid "Withdraw Access Request"
-msgstr ""
+msgstr "Retrageți solicitarea de acces"
msgid "Won't fix / Accept risk"
msgstr "Nu se repară / Acceptați riscul"
msgid "Work in progress (open and unassigned)"
-msgstr ""
+msgstr "Lucrări în curs (deschise și neatribuite)"
msgid "Work in progress Limit"
-msgstr ""
+msgstr "Limita de lucrări în curs"
msgid "WorkItem|Add"
-msgstr ""
+msgstr "Adăugați"
msgid "WorkItem|Add a child"
+msgstr "Adăugați un copil"
+
+msgid "WorkItem|Add assignee"
msgstr ""
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr "Sunteți sigur că doriți să anulați editarea?"
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr "Sunteți sigur că doriți să ștergeți elementul de lucru? Această acțiune nu poate fi anulată."
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] "Responsabil"
+msgstr[1] "Responsabili"
+msgstr[2] "Responsabili"
+
msgid "WorkItem|Cancel"
-msgstr ""
+msgstr "Anulare"
msgid "WorkItem|Child items"
-msgstr ""
+msgstr "Elemente copil"
+
+msgid "WorkItem|Closed"
+msgstr "ÃŽnchis"
msgid "WorkItem|Collapse child items"
msgstr "Restrângeți elementele copil"
-msgid "WorkItem|Convert to work item"
-msgstr "Convertiți în element de lucru"
+msgid "WorkItem|Create task"
+msgstr "Creați o sarcină"
msgid "WorkItem|Create work item"
msgstr "Creați elementul de lucru"
@@ -43430,13 +44108,13 @@ msgid "WorkItem|Delete work item"
msgstr "Ștergeți elementul de lucru"
msgid "WorkItem|Expand child items"
-msgstr ""
-
-msgid "WorkItem|New Task"
-msgstr "Sarcină nouă"
+msgstr "Extindeți elementele copil"
msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
-msgstr ""
+msgstr "În prezent nu este atribuit niciun element copil. Utilizați elementele copil pentru a acorda prioritate sarcinilor pe care echipa dvs. trebuie să le completeze, pentru a vă îndeplini obiectivele!"
+
+msgid "WorkItem|Open"
+msgstr "Deschis"
msgid "WorkItem|Select type"
msgstr "Selectați tipul"
@@ -43466,67 +44144,67 @@ msgid "WorkItem|Work item deleted"
msgstr "Element de lucru șters"
msgid "Would you like to create a new branch?"
-msgstr ""
+msgstr "Doriți să creați o nouă ramură?"
msgid "Would you like to try auto-generating a branch name?"
-msgstr ""
+msgstr "Doriți să încercați generarea automată a unui nume de ramură?"
msgid "Write"
-msgstr ""
+msgstr "Scriere"
msgid "Write a comment or drag your files here…"
-msgstr ""
+msgstr "Scrieți un comentariu sau glisați fișierele aici..."
msgid "Write a comment…"
-msgstr ""
+msgstr "Scrieți un comentariu..."
msgid "Write a description or drag your files here…"
-msgstr ""
+msgstr "Scrieți o descriere sau glisați fișierele aici…"
msgid "Write a description…"
msgstr "Scrieți o descriere..."
msgid "Write an internal note or drag your files here…"
-msgstr ""
+msgstr "Scrieți o notă internă sau glisați fișierele aici..."
msgid "Write milestone description..."
-msgstr ""
+msgstr "Scrieți descrierea obiectivului..."
msgid "Write your release notes or drag your files here…"
msgstr "Scrieți-vă notele de lansare sau trageți fișierele aici…"
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
-msgstr ""
+msgstr "UID extern greșit furnizat. Asigurați-vă că Auth0 este configurat corect."
msgid "Xcode"
-msgstr ""
+msgstr "Xcode"
msgid "YYYY-MM-DD"
-msgstr ""
+msgstr "AAAA-LL-ZZ"
msgid "Yes"
-msgstr ""
+msgstr "Da"
msgid "Yes or No"
-msgstr ""
+msgstr "Da sau nu"
msgid "Yes, add it"
-msgstr ""
+msgstr "Da, adăugați-o"
msgid "Yes, close issue"
-msgstr ""
+msgstr "Da, închideți problema"
msgid "Yes, delete project"
-msgstr ""
+msgstr "Da, ștergeți proiectul"
msgid "Yesterday"
msgstr "Ieri"
msgid "You"
-msgstr ""
+msgstr "Dvs."
msgid "You already have pending todo for this alert"
-msgstr "Aveți deja un todo în așteptare pentru această alertă"
+msgstr "Aveți deja un element de făcut în așteptare pentru această alertă"
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr "Sunteți pe cale să adăugați %{usersTag} (de) persoane la discuție. Toate acestea vor primi o notificare."
@@ -43547,7 +44225,7 @@ msgid "You are about to transfer the control of your account to %{group_name} gr
msgstr "Sunteți pe cale să transferați controlul contului dvs. către grupul %{group_name}. Această acțiune NU este reversibilă, nu veți mai putea accesa niciunul dintre grupurile și proiectele dvs. în afara grupului %{group_name} odată ce acest transfer este finalizat."
msgid "You are already a member of this %{member_source}."
-msgstr "Sunteți deja un membru al acestui %{member_source}."
+msgstr "Sunteți deja membru al acestui %{member_source}."
msgid "You are already impersonating another user"
msgstr "Impersonați deja un alt utilizator"
@@ -43556,19 +44234,19 @@ msgid "You are an admin, which means granting access to %{client_name} will allo
msgstr "Sunteți un administrator, ceea ce înseamnă că acordând accesul la %{client_name}, le va permite acestora să interacționeze, de asemenea, în calitate de administrator cu GitLab. Procedați cu prudență."
msgid "You are attempting to delete a file that has been previously updated."
-msgstr ""
+msgstr "Încercați să ștergeți un fișier care a fost actualizat anterior."
msgid "You are attempting to update a file that has changed since you started editing it."
-msgstr ""
+msgstr "Încercați să actualizați un fișier care s-a modificat de când ați început să-l editați."
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
-msgstr ""
+msgstr "Dacă depășiți acest număr, veți fi facturat. %{qsrOverageLinkStart}Cum funcționează facturarea?%{qsrOverageLinkEnd}"
msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
+msgstr "Sunteți conectat la serverul Prometheus, dar în prezent nu există date de afișat."
msgid "You are currently offline, or the GitLab instance is not reachable."
-msgstr ""
+msgstr "În prezent sunteți offline sau instanța GitLab nu este accesibilă."
msgid "You are going to delete %{project_full_name}. Deleted projects CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Veți șterge proiectul %{project_full_name}. Proiectele șterse NU POT fi restaurate! Sunteți ABSOLUT sigur?"
@@ -43588,35 +44266,35 @@ msgstr "Veți transfera %{project_full_name} într-un alt spațiu de nume. Sunte
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr "Veți opri confidențialitatea. Aceasta înseamnă că %{strongStart}toată lumea%{strongEnd} va putea să vadă și să lase un comentariu legat de %{issuableType}."
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
-msgstr ""
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
+msgstr "Veți activa confidențialitatea. Numai membrii acestui %{context} cu %{strongStart}%{permissions}%{strongEnd} pot vizualiza sau pot fi notificați despre acest/această %{issuableType}."
msgid "You are not allowed to %{action} a user"
-msgstr "Nu aveți permisiunea de a %{action} un utilizator"
+msgstr "Nu aveți permisiunea să %{action} un utilizator"
msgid "You are not allowed to approve a user"
-msgstr ""
+msgstr "Nu aveți voie să aprobați un utilizator"
msgid "You are not allowed to log in using password"
-msgstr ""
+msgstr "Nu aveți voie să vă conectați folosind parola"
msgid "You are not allowed to push into this branch. Create another branch or open a merge request."
-msgstr ""
+msgstr "Nu aveți voie să faceți push în această ramură. Creați o altă ramură sau deschideți un merge request."
msgid "You are not allowed to reject a user"
msgstr "Nu aveți permisiunea să respingeți un utilizator"
msgid "You are not allowed to unlink your primary login account"
-msgstr ""
+msgstr "Nu aveți voie să vă deconectați contul principal de conectare"
msgid "You are not authorized to delete this site profile"
msgstr "Nu sunteți autorizat să ștergeți profilul acestui site"
msgid "You are not authorized to perform this action"
-msgstr ""
+msgstr "Nu sunteți autorizat să efectuați această acțiune"
msgid "You are not authorized to run this manual job"
-msgstr ""
+msgstr "Nu sunteți autorizat să executați acest job manual"
msgid "You are not authorized to update this profile"
msgstr "Nu sunteți autorizat să actualizați acest profil"
@@ -43625,55 +44303,55 @@ msgid "You are not authorized to update this scanner profile"
msgstr "Nu sunteți autorizat să actualizați acest profil de scaner"
msgid "You are not authorized to upload metric images"
-msgstr ""
+msgstr "Nu sunteți autorizat să încărcați imagini de metrice"
msgid "You are now impersonating %{username}"
msgstr "Acum o/îl impersonați pe %{username}"
msgid "You are on a read-only GitLab instance."
-msgstr ""
+msgstr "Sunteți pe o instanță GitLab numai în citire."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
-msgstr ""
+msgstr "Primiți acest mesaj deoarece sunteți un administrator GitLab pentru %{url}."
msgid "You are signed in to GitLab as:"
msgstr "Sunteți conectat la GitLab ca:"
msgid "You are trying to upload something other than an image. Please upload a .png, .jpg, .jpeg, .gif, .bmp, .tiff or .ico."
-msgstr ""
+msgstr "Încercați să încărcați altceva decât o imagine. Vă rugăm să încărcați un fișier .png, .jpg, .jpeg, .gif, .bmp, .tiff sau .ico."
msgid "You are using PostgreSQL %{pg_version_current}, but PostgreSQL %{pg_version_minimum} is required for this version of GitLab. Please upgrade your environment to a supported PostgreSQL version, see %{pg_requirements_url} for details."
-msgstr ""
+msgstr "Folosiți %{pg_version_current}, dar pentru această versiune de GitLab este necesar %{pg_version_minimum}. Vă rugăm să vă actualizați mediul la o versiune PostgreSQL acceptată, consultați %{pg_requirements_url} pentru detalii."
msgid "You can %{gitlabLinkStart}resolve conflicts on GitLab%{gitlabLinkEnd} or %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
-msgstr "Puteți %{gitlabLinkStart}rezolva conflicte pe GitLab%{gitlabLinkEnd} sau să %{resolveLocallyStart}rezolvați local%{resolveLocallyEnd}."
+msgstr "Puteți să %{gitlabLinkStart}rezolvați conflictele pe GitLab%{gitlabLinkEnd} sau %{resolveLocallyStart}să le rezolvați local%{resolveLocallyEnd}."
msgid "You can %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
-msgstr "Puteți să %{resolveLocallyStart}rezolvați local%{resolveLocallyEnd}."
+msgstr "Puteți %{resolveLocallyStart}rezolva la nivel local%{resolveLocallyEnd}."
msgid "You can adjust rules on auto-banning %{link_start}here%{link_end}."
-msgstr ""
+msgstr "Puteți ajusta regulile de interzicere automată %{link_start}aici%{link_end}."
msgid "You can adjust rules on auto-banning here: %{url}."
-msgstr ""
+msgstr "Puteți ajusta regulile de interzicere automată aici: %{url}."
msgid "You can also create a project from the command line."
-msgstr ""
+msgstr "De asemenea, puteți crea un proiect din linia de comandă."
msgid "You can also press Ctrl-Enter"
-msgstr ""
+msgstr "De asemenea, puteți apăsa Ctrl-Enter"
msgid "You can also press ⌘-Enter"
-msgstr ""
+msgstr "De asemenea, puteți apăsa ⌘-Enter"
msgid "You can also star a label to make it a priority label."
msgstr "Puteți, de asemenea, să marcați cu o stea o etichetă pentru a face din ea o etichetă prioritară."
msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
+msgstr "De asemenea, puteți testa %{gitlab_ci_yml} în %{lint_link_start}CI Lint%{lint_link_end}"
msgid "You can also upload existing files from your computer using the instructions below."
-msgstr ""
+msgstr "De asemenea, puteți încărca fișiere existente de pe computerul dvs. folosind instrucțiunile de mai jos."
msgid "You can also use group access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr "Puteți utiliza, de asemenea, tokenuri de acces de grup cu Git pentru a vă autentifica prin HTTP(S). %{link_start}Aflați mai multe.%{link_end}"
@@ -43685,7 +44363,7 @@ msgid "You can always change your URL later"
msgstr "Puteți schimba oricând URL-ul mai târziu"
msgid "You can always edit this later"
-msgstr ""
+msgstr "Puteți edita oricând acest lucru mai târziu"
msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
msgstr "Îl puteți verifica în setările %{pat_link_start}tokenurilor de acces personale%{pat_link_end}."
@@ -43694,25 +44372,25 @@ msgid "You can check it in your in your personal access tokens settings %{pat_li
msgstr "Îl puteți verifica în setările tokenurilor de acces personale %{pat_link}."
msgid "You can create a new %{link}."
-msgstr ""
+msgstr "Puteți crea un nou %{link}."
msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
-msgstr "Puteți crea o nouă %{name} în cadrul acestui proiect trimițând un e-mail la următoarea adresă de e-mail:"
+msgstr "Puteți crea un/o nou(ă) %{name} în cadrul acestui proiect trimițând un e-mail la următoarea adresă de e-mail:"
msgid "You can create a new Personal Access Token by visiting %{link}"
msgstr "Puteți crea un nou token de acces personal vizitând %{link}"
msgid "You can create a new SSH key by visiting %{link}"
-msgstr ""
+msgstr "Puteți crea o nouă cheie SSH vizitând %{link}"
msgid "You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
msgstr "Puteți crea unul nou sau le puteți verifica în setările pentru %{pat_link_start}tokenurile de acces personal%{pat_link_end}."
msgid "You can create a new one or check them in your %{ssh_key_link_start}SSH keys%{ssh_key_link_end} settings."
-msgstr ""
+msgstr "Puteți să creați una nouă sau să le verificați în setările %{ssh_key_link_start}cheilor SSH%{ssh_key_link_end}."
msgid "You can create a new one or check them in your SSH keys settings %{ssh_key_link}."
-msgstr ""
+msgstr "Puteți să creați una nouă sau să le verificați în setările cheilor SSH %{ssh_key_link}."
msgid "You can create a new one or check them in your personal access tokens settings %{pat_link}."
msgstr "Puteți să creați unul nou sau să le verificați în setările tokenurilor de acces personal %{pat_link}."
@@ -43733,64 +44411,61 @@ msgid "You can enable group access token creation in %{link_start}group settings
msgstr "Puteți activa crearea de tokenuri de acces de grup în %{link_start}setările grupului%{link_end}."
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
-msgstr ""
+msgstr "Puteți activa crearea de tokenuri de acces la proiect în %{link_start}setările grupului%{link_end}."
msgid "You can filter by 'days to merge' by clicking on the columns in the chart."
msgstr "Puteți filtra în funcție de „zile până la îmbinare†făcând clic pe coloanele din grafic."
msgid "You can find more information about GitLab subscriptions in %{subscriptions_doc_link}."
-msgstr ""
+msgstr "Puteți găsi mai multe informații despre abonamentele GitLab în %{subscriptions_doc_link}."
msgid "You can get started by cloning the repository or start adding files to it with one of the following options."
-msgstr ""
+msgstr "Puteți începe prin a clona repozitoriul sau puteți începe să adăugați fișiere în acesta cu una dintre următoarele opțiuni."
msgid "You can group test cases using labels. To learn about the future direction of this feature, visit %{linkStart}Quality Management direction page%{linkEnd}."
msgstr "Puteți grupa cazurile de testare utilizând etichete. Pentru a afla despre direcția viitoare a acestei funcții, vizitați %{linkStart}pagina direcției Managementul Calității%{linkEnd}."
msgid "You can have a maximum of %{free_limit} unique members across all of your personal projects. To view and manage members, check the members page for each project in your namespace. We recommend you %{move_link_start}move your projects to a group%{move_link_end} so you can easily manage users and features."
-msgstr ""
+msgstr "Puteți avea un maxim de %{free_limit} (de) membri unici în toate proiectele personale. Pentru a vizualiza și gestiona membrii, consultați pagina de membri pentru fiecare proiect din spațiul dvs. de nume. Vă recomandăm să vă %{move_link_start}mutați proiectele într-un grup%{move_link_end}, astfel încât să puteți gestiona cu ușurință utilizatorii și funcțiile."
msgid "You can invite a new member to %{project_name} or invite another group."
-msgstr ""
+msgstr "Puteți invita un nou membru la %{project_name} sau puteți invita un alt grup."
msgid "You can invite a new member to %{project_name}."
-msgstr ""
+msgstr "Puteți invita un nou membru la %{project_name}."
msgid "You can invite a new member to %{strong_start}%{group_name}%{strong_end}."
-msgstr ""
+msgstr "Puteți invita un nou membru la %{strong_start}%{group_name}%{strong_end}."
msgid "You can invite another group to %{project_name}."
-msgstr ""
+msgstr "Puteți invita un alt grup la %{project_name}."
msgid "You can move around the graph by using the arrow keys."
-msgstr ""
+msgstr "Vă puteți deplasa în jurul graficului cu ajutorul tastelor săgeți."
msgid "You can notify the app / group or a project by sending them an email notification"
-msgstr ""
+msgstr "Puteți notifica aplicația/grupul sau un proiect trimițându-le o notificare prin e-mail"
msgid "You can now close this window."
-msgstr ""
+msgstr "Acum puteți închide această fereastră."
msgid "You can now export your security dashboard to a CSV report."
msgstr "Acum puteți să exportați tabloul de bord de securitate într-un raport CSV."
msgid "You can now submit a merge request to get this change into the original branch."
-msgstr ""
+msgstr "Acum puteți trimite un merge request pentru a introduce această modificare în ramura originală."
msgid "You can now submit a merge request to get this change into the original project."
-msgstr ""
+msgstr "Acum puteți trimite un merge request pentru a introduce această modificare în proiectul original."
msgid "You can only %{action} files when you are on a branch"
-msgstr ""
+msgstr "Puteți %{action} fișiere numai atunci când vă aflați pe o ramură"
msgid "You can only add up to %{max_contacts} contacts at one time"
-msgstr "Puteți adăuga doar până la %{max_contacts} contacte în același timp"
-
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
+msgstr "Puteți adăuga doar până la %{max_contacts} (de) contacte în același timp"
msgid "You can only edit files when you are on a branch"
-msgstr ""
+msgstr "Puteți edita fișiere numai atunci când vă aflați pe o ramură"
msgid "You can only merge once the items above are resolved."
msgstr "Puteți îmbina numai după ce elementele de mai sus sunt rezolvate."
@@ -43798,29 +44473,26 @@ msgstr "Puteți îmbina numai după ce elementele de mai sus sunt rezolvate."
msgid "You can only transfer the project to namespaces you manage."
msgstr "Puteți transfera proiectul numai în spațiile de nume pe care le gestionați."
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr "Puteți încărca doar un singur design atunci când îl adăugați la un design existent."
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Puteți rezolva conflictul de îmbinare utilizând fie modul interactiv, alegând butoanele %{use_ours} sau %{use_theirs}, fie editând direct fișierele. Comiteți aceste modificări în %{branch_name}"
msgid "You can see your chat accounts."
-msgstr ""
+msgstr "Puteți vedea conturile dvs. de chat."
msgid "You can set up jobs to only use runners with specific tags. Separate tags with commas."
msgstr "Puteți configura joburile pentru a utiliza doar executorii cu anumite etichete. Separați etichetele cu virgule."
msgid "You can specify notification level per group or per project."
-msgstr ""
+msgstr "Puteți specifica nivelul de notificare pentru fiecare grup sau pentru fiecare proiect."
msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
msgstr "Vă puteți testa fișierul .gitlab-ci.yml în %{linkStart}CI Lint%{linkEnd}."
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
-msgstr ""
+msgstr "Puteți vizualiza sursa sau %{linkStart}%{cloneIcon} clona repozitoriul%{linkEnd}"
msgid "You can't add any more, but you can manage your existing members, for example, by removing inactive members and replacing them with new members. To get more members an owner of this namespace can start a trial or upgrade to a paid tier."
-msgstr "Nu mai puteți adăuga membri, dar îi puteți gestiona pe cei existenți, de exemplu, prin înlăturarea membrilor inactivi și înlocuirea lor cu membri noi. Pentru a obține mai mulți membri, un proprietar al acestui namespace poate începe o perioadă de probă sau poate face upgrade la un nivel plătit."
+msgstr "Nu mai puteți adăuga membri, dar îi puteți gestiona pe cei existenți, de exemplu, prin înlăturarea membrilor inactivi și înlocuirea lor cu membri noi. Pentru a obține mai mulți membri, un proprietar al acestui namespace poate începe o perioadă de încercare sau poate face upgrade la un nivel plătit."
msgid "You cannot %{action} %{state} users."
msgstr "Nu puteți %{action} utilizatorii %{state}."
@@ -43828,18 +44500,18 @@ msgstr "Nu puteți %{action} utilizatorii %{state}."
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Nu puteți accesa fișierul brut. Vă rugăm să așteptați un minut."
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr "Nu puteți aproba propria implementare."
msgid "You cannot change the start date after the cadence has started. Please create a new cadence."
-msgstr ""
+msgstr "Nu puteți modifica data de început după ce a început cadența. Vă rugăm să creați o nouă cadență."
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr "Nu puteți combina replace_ids cu add_ids sau remove_ids."
+msgid "You cannot edit this timeline event."
+msgstr "Nu puteți edita acest eveniment cronologic."
+
msgid "You cannot impersonate a blocked user"
msgstr "Nu puteți impersona un utilizator blocat"
@@ -43856,7 +44528,7 @@ msgid "You cannot rename an environment after it's created."
msgstr "Nu puteți redenumi un mediu după ce este creat."
msgid "You cannot set yourself to awaiting"
-msgstr ""
+msgstr "Nu vă puteți pune singur în așteptare"
msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
msgstr "Nu puteți scrie pe o instanță secundară GitLab Geo numai în citire. Folosiți în schimb %{link_to_primary_node}."
@@ -43871,13 +44543,13 @@ msgid "You could not create a new trigger."
msgstr "Nu ați putut crea un nou declanșator."
msgid "You currently have more than %{free_limit} members across all your personal projects. From June 22, 2022, the %{free_limit} most recently active members will remain active, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access. To view and manage members, check the members page for each project in your namespace. We recommend you %{move_link_start}move your project to a group%{move_link_end} so you can easily manage users and features."
-msgstr ""
+msgstr "ÃŽn prezent, aveÈ›i peste %{free_limit} (de) membri în toate proiectele dvs. personale. ÃŽncepând cu 22 iunie 2022, cei mai recent activi %{free_limit} (de) membri vor rămâne activi, iar restul membrilor vor primi %{link_start}statutul „Peste limităâ€%{link_end} È™i își vor pierde accesul. Pentru a vizualiza È™i gestiona membrii, consultaÈ›i pagina membrilor pentru fiecare proiect din spaÈ›iul dvs. de nume. Vă recomandăm să vă %{move_link_start}mutaÈ›i proiectul într-un grup%{move_link_end} pentru a putea gestiona cu uÈ™urință utilizatorii È™i caracteristicile."
msgid "You do not have any Google Cloud projects. Please create a Google Cloud project and then reload this page."
msgstr "Nu aveți niciun proiect Google Cloud. Vă rugăm să creați un proiect Google Cloud și apoi să reîncărcați această pagină."
msgid "You do not have any subscriptions yet"
-msgstr ""
+msgstr "Nu aveți încă niciun abonament"
msgid "You do not have permission to access dora metrics."
msgstr "Nu aveți permisiunea de a accesa metricile dora."
@@ -43895,58 +44567,58 @@ msgid "You do not have permission to run the Web Terminal. Please contact a proj
msgstr "Nu aveți permisiunea de a rula Terminalul Web. Contactați un administrator de proiect."
msgid "You do not have permission to set a member awaiting"
-msgstr ""
+msgstr "Nu aveți permisiunea de a seta un membru în așteptare"
msgid "You do not have permission to update the environment."
-msgstr ""
+msgstr "Nu aveți permisiunea de a actualiza mediul."
msgid "You do not have permissions to run the import."
-msgstr ""
+msgstr "Nu aveți permisiuni pentru a executa importul."
msgid "You don't have any U2F devices registered yet."
-msgstr ""
+msgstr "Nu aveți încă dispozitive U2F înregistrate."
msgid "You don't have any WebAuthn devices registered yet."
-msgstr ""
+msgstr "Nu aveți încă niciun dispozitiv WebAuthn înregistrat."
msgid "You don't have any active chat names."
msgstr "Nu aveți niciun nume de chat activ."
msgid "You don't have any applications"
-msgstr ""
+msgstr "Nu aveți nicio aplicație"
msgid "You don't have any authorized applications"
-msgstr ""
+msgstr "Nu aveți nicio aplicație autorizată"
msgid "You don't have any deployments right now."
-msgstr ""
+msgstr "Nu aveți nicio implementare în acest moment."
msgid "You don't have any open merge requests"
-msgstr ""
+msgstr "Nu aveți niciun merge request deschis"
msgid "You don't have any recent searches"
-msgstr ""
+msgstr "Nu aveți nicio căutare recentă"
msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
msgstr "Nu aveți permisiunea de a revizui această implementare. Contactați proprietarul proiectului sau al grupului pentru ajutor."
msgid "You don't have permissions to create this project"
-msgstr ""
+msgstr "Nu aveți permisiuni pentru a crea acest proiect"
msgid "You don't have sufficient permission to perform this action."
-msgstr ""
+msgstr "Nu aveți permisiunea suficientă pentru a efectua această acțiune."
msgid "You don't have the %{role} role for any groups in this instance."
-msgstr ""
+msgstr "Nu aveți rolul de %{role} pentru niciun grup în această instanță."
msgid "You don't have write access to the source branch."
-msgstr ""
+msgstr "Nu aveți acces în scriere la ramura sursă."
msgid "You don’t have access to Productivity Analytics in this group"
-msgstr ""
+msgstr "Nu aveți acces la Analizele de productivitate din acest grup"
msgid "You don’t have access to Value Stream Analytics for this group"
-msgstr "Nu aveți acces la Analizele Value Stream pentru acest grup"
+msgstr "Nu aveți acces la Analizele fluxului de valori pentru acest grup"
msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
@@ -43955,28 +44627,28 @@ msgstr[1] "Aveți %{pendingMembersCount} membri în așteptare care au nevoie de
msgstr[2] "Aveți %{pendingMembersCount} de membri în așteptare care au nevoie de aprobare."
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
-msgstr ""
+msgstr "Vi s-a acordat acces de %{access_level} la %{source_link} %{source_type}"
msgid "You have been granted %{access_level} access to the %{source_name} %{source_type}."
-msgstr ""
+msgstr "Vi s-a acordat acces de %{access_level} la %{source_name} %{source_type}"
msgid "You have been granted %{member_human_access} access to group %{name}."
-msgstr ""
+msgstr "Vi s-a acordat acces de %{member_human_access} la grupul %{name}."
msgid "You have been granted %{member_human_access} access to project %{name}."
-msgstr ""
+msgstr "Vi s-a acordat acces de %{member_human_access} la proiectul %{name}."
msgid "You have been invited by %{link_to_inviter} to join %{source_name} %{strong_open}%{link_to_source}%{strong_close} as %{role}"
-msgstr "Ați fost invitat de către %{link_to_inviter} să vă alăturați %{source_name} %{strong_open}%{link_to_source}%{strong_close} ca %{role}"
+msgstr "Ați fost invitat de %{link_to_inviter} să vă alăturați la %{source_name} %{strong_open}%{link_to_source}%{strong_close} în calitate de %{role}"
msgid "You have been redirected to the only result; see the %{a_start}search results%{a_end} instead."
-msgstr ""
+msgstr "Ați fost redirecționat către singurul rezultat; vedeți mai bine %{a_start}rezultatele căutării%{a_end}."
msgid "You have been unsubscribed from this thread."
msgstr "Ați fost dezabonat de la acest subiect."
msgid "You have declined the invitation to join %{title} %{name}."
-msgstr ""
+msgstr "Ați refuzat invitația de a vă alătura %{title} %{name}."
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr "Ați mai importat din acest proiect de %{numberOfPreviousImports} ori până acum. Fiecare nou import va crea probleme duplicat."
@@ -43985,37 +44657,43 @@ msgid "You have insufficient permissions to configure escalation policies for th
msgstr "Nu aveți permisiuni suficiente pentru a configura politicile de escaladare pentru acest proiect"
msgid "You have insufficient permissions to create a Todo for this alert"
-msgstr "Nu aveți permisiuni suficiente pentru a crea un Todo pentru această alertă"
+msgstr "Nu aveți permisiuni suficiente pentru a crea un lucru de făcut pentru această alertă"
msgid "You have insufficient permissions to create an HTTP integration for this project"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a crea o integrare HTTP pentru acest proiect"
msgid "You have insufficient permissions to create an on-call schedule for this project"
-msgstr "Nu aveți permisiuni suficiente pentru a crea un program la apel pentru acest proiect"
+msgstr "Nu aveți permisiuni suficiente pentru a crea un program de gardă pentru acest proiect"
+
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr "Nu aveți permisiuni suficiente pentru a gestiona linkurile resurselor acestui incident"
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr "Nu aveți permisiuni suficiente pentru a gestiona evenimentele cronologice pentru acest incident"
msgid "You have insufficient permissions to remove an on-call rotation from this project"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a înlătura o rotație de gardă din acest proiect"
msgid "You have insufficient permissions to remove an on-call schedule from this project"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a înlătura un program de gardă din acest proiect"
msgid "You have insufficient permissions to remove this HTTP integration"
+msgstr "Nu aveți permisiuni suficiente pentru a înlătura această integrare HTTP"
+
+msgid "You have insufficient permissions to remove this Namespace Ban"
msgstr ""
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr "Aveți permisiuni insuficiente de a seta contacte pentru relațiile cu clienții pentru această problemă"
msgid "You have insufficient permissions to update an on-call schedule for this project"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a actualiza un program de gardă pentru acest proiect"
msgid "You have insufficient permissions to update this HTTP integration"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a actualiza această integrare HTTP"
msgid "You have insufficient permissions to view shifts for this rotation"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a vedea turele pentru această rotație"
msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr "Aveți mai mulți utilizatori activi decât sunt permiși de licența dumneavoastră. Înainte de %{date} GitLab trebuie să vă reconcilieze abonamentul. Pentru finalizarea acestui proces, exportați fișierul de utilizare a licenței dvs. și trimiteți-l prin e-mail la adresa %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dvs."
@@ -44024,13 +44702,13 @@ msgid "You have more active users than are allowed by your license. GitLab must
msgstr "Aveți mai mulți utilizatori activi decât sunt permiși de licența dumneavoastră. GitLab trebuie acum să vă reconcilieze abonamentul. Pentru finalizarea acestui proces, exportați fișierul de utilizare a licenței dvs. și trimiteți-l prin e-mail la adresa %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dvs."
msgid "You have no permissions"
-msgstr ""
+msgstr "Nu aveți permisiuni"
msgid "You have not added any approvers. Start by adding users or groups."
msgstr "Nu ați adăugat niciun aprobator. Începeți prin a adăuga utilizatori sau grupuri."
msgid "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}."
-msgstr ""
+msgstr "Ați configurat 2FA pentru contul dvs.! Dacă pierdeți accesul la dispozitivul 2FA, puteți utiliza codurile de recuperare pentru a vă accesa contul. Alternativ, dacă încărcați o cheie SSH, puteți %{anchorOpen}utiliza această cheie pentru a genera coduri de recuperare suplimentare%{anchorClose}."
msgid "You have successfully purchased %{product}. You'll receive a receipt by email. Your purchase may take a minute to sync, so refresh the page if you don't see it yet."
msgstr "Ați cumpărat cu succes %{product}. Veți primi o chitanță prin e-mail. Achiziția dvs. poate dura un minut pentru a se sincroniza, așa că reîmprospătați pagina dacă nu o vedeți încă."
@@ -44042,16 +44720,16 @@ msgid "You have unsaved changes"
msgstr "Aveți modificări nesalvate"
msgid "You left the \"%{membershipable_human_name}\" %{source_type}."
-msgstr ""
+msgstr "Ați părăsit „%{membershipable_human_name}†%{source_type}."
msgid "You may close the milestone now."
-msgstr ""
+msgstr "Puteți închide obiectivul acum."
msgid "You must be authenticated to access this path."
msgstr "Trebuie să fiți autentificat pentru a accesa această cale."
msgid "You must be logged in to search across all of GitLab"
-msgstr ""
+msgstr "Trebuie să fiți autentificat pentru a căuta peste tot în GitLab"
msgid "You must have developer or higher permissions in the associated project to view job logs when debug trace is enabled. To disable debug trace, set the 'CI_DEBUG_TRACE' variable to 'false' in your pipeline configuration or CI/CD settings. If you need to view this job log, a project maintainer must add you to the project with developer permissions or higher."
msgstr "Trebuie să aveți permisiuni de dezvoltator sau mai mari în proiectul asociat pentru a vizualiza jurnalele de joburi atunci când este activată urmărirea de depanare. Pentru a dezactiva urmărirea de depanare, setați variabila „CI_DEBUG_TRACE†la „false†în configurația pipeline-ului sau în setările CI/CD. Dacă aveți nevoie să vizualizați acest jurnal de joburi, un întreținător de proiect trebuie să vă adauge la proiect cu permisiuni de dezvoltator sau mai mari."
@@ -44072,10 +44750,7 @@ msgid "You must sign in to search for specific terms."
msgstr "Trebuie să vă conectați pentru a căuta termeni specifici."
msgid "You must solve the CAPTCHA in order to submit"
-msgstr ""
-
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr "Trebuie să încărcați un fișier cu același nume de fișier atunci când îl adăugați la un design existent."
+msgstr "Trebuie să rezolvați CAPTCHA pentru a putea trimite"
msgid "You need a different license to enable FileLocks feature"
msgstr "Aveți nevoie de o licență diferită pentru a activa caracteristica FileLocks"
@@ -44087,34 +44762,34 @@ msgid "You need permission."
msgstr "Aveți nevoie de permisiune."
msgid "You need to register a two-factor authentication app before you can set up a device."
-msgstr ""
+msgstr "Trebuie să înregistrați o aplicație de autentificare cu doi factori înainte de a putea configura un dispozitiv."
msgid "You need to set terms to be enforced"
-msgstr ""
+msgstr "Trebuie să stabiliți condiții care să fie puse în aplicare"
msgid "You need to specify both an Access Token and a Host URL."
-msgstr ""
+msgstr "Trebuie să specificați atât un Token de acces, cât și un URL gazdă."
msgid "You need to upload a GitLab project export archive (ending in .gz)."
-msgstr ""
+msgstr "Trebuie să încărcați o arhivă de export a proiectului GitLab (care se termină în .gz)."
msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
msgstr "Trebuie să vă verificați mai întâi e-mailul principal înainte de a activa Autentificarea cu doi factori."
msgid "You successfully declined the invitation"
-msgstr ""
+msgstr "Ați refuzat cu succes invitația"
msgid "You tried to fork %{link_to_the_project} but it failed for the following reason:"
msgstr "Ați încercat să creați un fork pentru %{link_to_the_project}, dar a eșuat din următorul motiv:"
msgid "You will be removed from existing projects/groups"
-msgstr ""
+msgstr "Veți fi înlăturat din proiectele/grupurile existente"
msgid "You will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
msgstr "Veți fi autorul tuturor evenimentelor din fluxul de activitate care sunt rezultatul unei actualizări, cum ar fi crearea de noi ramuri sau împingerea de noi commit-uri în ramurile existente."
msgid "You will first need to set up Jira Integration to use this feature."
-msgstr ""
+msgstr "Mai întâi va trebui să configurați Integrarea Jira pentru a utiliza această funcție."
msgid "You will lose all changes you've made to this file. This action cannot be undone."
msgstr "Veți pierde toate modificările pe care le-ați făcut în acest fișier. Această acțiune nu poate fi anulată."
@@ -44126,19 +44801,19 @@ msgid "You will need to update your local repositories to point to the new locat
msgstr "Va trebui să vă actualizați repozitoriile locale pentru a indica noua locație."
msgid "You will not get any notifications via email"
-msgstr ""
+msgstr "Nu veți primi nicio notificare prin e-mail"
msgid "You will only receive notifications for the events you choose"
-msgstr ""
+msgstr "Veți primi notificări numai pentru evenimentele pe care le alegeți"
msgid "You will only receive notifications for threads you have participated in"
msgstr "Veți primi notificări doar pentru subiectele la care ați participat."
msgid "You will receive notifications for any activity"
-msgstr ""
+msgstr "Veți primi notificări pentru orice activitate"
msgid "You will receive notifications only for comments in which you were @mentioned"
-msgstr ""
+msgstr "Veți primi notificări doar pentru comentariile în care ați fost @menționat."
msgid "You won't be able to create new projects because you have reached your project limit."
msgstr "Nu veți putea crea proiecte noi, deoarece ați atins limita proiectului dumneavoastră."
@@ -44147,22 +44822,22 @@ msgid "You'll be charged for %{true_up_link_start}users over license%{link_end}
msgstr "Veți fi taxat pentru %{true_up_link_start}utilizatorii care depășesc licența%{link_end} pe o bază trimestrială sau anuală, în funcție de termenii acordului dumneavoastră."
msgid "You'll be signed out from your current account automatically."
-msgstr ""
+msgstr "Veți fi deconectat automat de la contul dvs. curent."
msgid "You'll need to use different branch names to get a valid comparison."
-msgstr ""
+msgstr "Va trebui să folosiți nume de ramuri diferite pentru a obține o comparație validă."
msgid "You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end} in %{strong_start}%{group_name}%{strong_end}."
-msgstr ""
+msgstr "Sunteți pe cale să reduceți vizibilitatea proiectului %{strong_start}%{project_name}%{strong_end} în %{strong_start}%{group_name}%{strong_end}."
msgid "You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end}."
-msgstr ""
+msgstr "Sunteți pe cale să reduceți vizibilitatea proiectului %{strong_start}%{project_name}%{strong_end}."
msgid "You're at the first commit"
-msgstr ""
+msgstr "Sunteți la primul commit"
msgid "You're at the last commit"
-msgstr ""
+msgstr "Sunteți la ultimul commit"
msgid "You're not allowed to %{tag_start}edit%{tag_end} files in this project directly. Please fork this project, make your changes there, and submit a merge request."
msgstr "Nu aveți permisiunea să %{tag_start}editați%{tag_end} direct fișierele din acest proiect. Vă rugăm să creați un fork pentru acest proiect, faceți modificările acolo și transmiteți un merge request."
@@ -44174,25 +44849,43 @@ msgid "You're not allowed to make changes to this project directly. A fork of th
msgstr "Nu aveți permisiunea de a face modificări în acest proiect în mod direct. Se creează un fork al acestui proiect în care puteți face modificări, astfel încât să puteți trimite un merge request."
msgid "You're receiving this email because of your account on %{host}."
-msgstr ""
+msgstr "Primiți acest e-mail din cauza contului dvs. de pe %{host}."
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Primiți acest e-mail datorită contului dvs. de pe %{host}. %{manage_label_subscriptions_link_start}Gestionați abonamentele la etichete%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Ajutor%{help_link_end}"
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Primiți acest e-mail datorită contului dvs. de pe %{host}. %{manage_notifications_link_start}Gestionați toate notificările%{manage_notifications_link_end} &middot; %{help_link_start}Ajutor%{help_link_end}"
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Primiți acest e-mail din cauza contului dvs. pe %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Primiți acest e-mail datorită contului dvs. de pe %{host}. %{unsubscribe_link_start}Dezabonați-vă%{unsubscribe_link_end} de la această discuție &middot; %{manage_notifications_link_start}Gestionați toate notificările%{manage_notifications_link_end} &middot; %{help_link_start}Ajutor%{help_link_end}"
msgid "You're receiving this email because of your activity on %{host}."
-msgstr "Primești acest e-mail din cauza activității dvs. pe %{host}."
+msgstr "Primiți acest e-mail din cauza activității dvs. pe %{host}."
+
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Primiți acest e-mail datorită activității dvs. pe %{host}. %{unsubscribe_link_start}Dezabonați-vă%{unsubscribe_link_end} de la această discuție &middot; %{manage_notifications_link_start}Gestionați toate notificările%{manage_notifications_link_end} &middot; %{help_link_start}Ajutor%{help_link_end}"
msgid "You're receiving this email because you have been assigned an item on %{host}."
-msgstr ""
+msgstr "Primiți acest e-mail pentru că vi s-a atribuit un articol pe %{host}."
+
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Primiți acest e-mail deoarece vi s-a atribuit un articol pe %{host}. %{unsubscribe_link_start}Dezabonați-vă%{unsubscribe_link_end} de la acest subiect &middot; %{manage_notifications_link_start}Gestionați toate notificările%{manage_notifications_link_end} &middot; %{help_link_start}Ajutor%{help_link_end}"
msgid "You're receiving this email because you have been mentioned on %{host}."
-msgstr ""
+msgstr "Primești acest e-mail pentru că ai fost menționat pe %{host}."
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Primiți acest e-mail pentru că ați fost menționat pe %{host}. %{manage_notifications_link_start}Gestionați toate notificările%{manage_notifications_link_end} &middot; %{help_link_start}Ajutor%{help_link_end}"
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "Primiți acest e-mail pentru că ați fost menționat pe %{host}. %{unsubscribe_link_start}Dezabonați-vă%{unsubscribe_link_end} de la această discuție &middot; %{manage_notifications_link_start}Gestionați toate notificările%{manage_notifications_link_end} &middot; %{help_link_start}Ajutor%{help_link_end}"
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
-msgstr ""
+msgstr "Ați activat deja autentificarea cu doi factori folosind autentificatoare cu o parolă unică. Pentru a înregistra un alt dispozitiv, trebuie mai întâi să dezactivați autentificarea cu doi factori."
msgid "You've reached your %{free_limit} member limit across all of your personal projects"
-msgstr ""
+msgstr "Ați atins limita de %{free_limit} (de) membri în toate proiectele personale."
msgid "You've rejected %{user}"
msgstr "Ați respins %{user}"
@@ -44201,19 +44894,13 @@ msgid "YouTube"
msgstr "YouTube"
msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
-msgstr "%{doc_link_start}SpaÈ›iul dvs. de nume%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end}, are peste %{free_limit} de membri. ÃŽncepând cu 22 iunie 2022, acesta va fi limitat la %{free_limit}, iar restul membrilor vor primi %{link_start}statutul „Peste limităâ€%{link_end} È™i vor pierde accesul la spaÈ›iul de nume. PuteÈ›i accesa pagina „Cote de utilizare†pentru a gestiona care %{free_limit} de membri vor rămâne în spaÈ›iul dvs. de nume. Pentru a obÈ›ine mai mulÈ›i membri, un proprietar poate începe o perioadă de probă sau poate face upgrade la un nivel plătit."
+msgstr "%{doc_link_start}SpaÈ›iul dvs. de nume%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end}, are peste %{free_limit} de membri. ÃŽncepând cu 22 iunie 2022, acesta va fi limitat la %{free_limit}, iar restul membrilor vor primi %{link_start}statutul „Peste limităâ€%{link_end} È™i vor pierde accesul la spaÈ›iul de nume. PuteÈ›i accesa pagina „Cote de utilizare†pentru a gestiona care %{free_limit} de membri vor rămâne în spaÈ›iul dvs. de nume. Pentru a obÈ›ine mai mulÈ›i membri, un proprietar poate începe o perioadă de încercare sau poate face upgrade la un nivel plătit."
msgid "Your %{group} membership will now expire in %{days}."
msgstr "Abonamentul dvs. %{group} va expira acum în %{days}."
msgid "Your %{host} account was signed in to from a new location"
-msgstr ""
-
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr "Abonamentul dvs. %{plan} a expirat la %{expiry_date}"
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr "Abonamentul dvs. %{plan} expiră la %{expiry_date}"
+msgstr "Contul dvs. %{host} a fost conectat dintr-o locație nouă"
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr "%{spammable_entity_type} dvs. a fost recunoscut ca spam și a fost înlăturat."
@@ -44231,7 +44918,7 @@ msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more detail
msgstr "Sintaxa configurației dvs. CI/CD nu este valabilă. Vizualizați fila Lint pentru mai multe detalii."
msgid "Your CSV export has started. It will be emailed to %{email} when complete."
-msgstr "Exportul dvs. CSV a început. Va fi trimis prin e-mail la %{email} la finalizare."
+msgstr "Exportul dvs. CSV a început. Acesta va fi trimis prin e-mail la %{email} atunci când este finalizat."
msgid "Your CSV export of %{count} from project %{project_link} has been added to this email as an attachment."
msgstr "Exportul dvs. CSV de %{count} din proiectul %{project_link} a fost adăugat la acest e-mail ca atașament."
@@ -44252,7 +44939,7 @@ msgid "Your GitLab account has been locked due to an excessive number of unsucce
msgstr "Contul dvs. GitLab a fost blocat datorită unui număr excesiv de încercări nereușite de autentificare. Puteți aștepta deblocarea automată a contului dvs. în %{duration} sau puteți face clic pe linkul de mai jos pentru a vă debloca acum."
msgid "Your GitLab account request has been approved!"
-msgstr "Solicitarea contului dvs. GitLab a fost aprobată!"
+msgstr "Solicitarea dvs. de creare a contului GitLab a fost aprobată!"
msgid "Your GitLab group"
msgstr "Grupul dvs. GitLab"
@@ -44267,7 +44954,7 @@ msgid "Your Projects (default)"
msgstr "Proiectele dvs. (implicit)"
msgid "Your Projects' Activity"
-msgstr "Activitatea proiectelor dvs."
+msgstr "Activitatea proiectelor d-voastră"
msgid "Your SSH key has expired"
msgstr "Cheia dvs. SSH a expirat"
@@ -44282,10 +44969,10 @@ msgid "Your SSH keys (%{count})"
msgstr "Cheile dvs. SSH (%{count})"
msgid "Your To-Do List"
-msgstr "Lista dvs. „De făcutâ€"
+msgstr "Lista dvs. De-Făcut"
msgid "Your U2F device did not send a valid JSON response."
-msgstr "Dispozitivul dvs. U2F nu a trimis un răspuns valid JSON."
+msgstr "Dispozitivul dvs. U2F nu a trimis un răspuns JSON valid."
msgid "Your U2F device was registered!"
msgstr "Dispozitivul dvs. U2F a fost înregistrat!"
@@ -44300,10 +44987,10 @@ msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Solicitarea dvs. de acces la %{source_type} a fost retrasă."
msgid "Your account has been deactivated"
-msgstr "Contul dvs. a fost dezactivat."
+msgstr "Contul dvs. a fost dezactivat"
msgid "Your account has been deactivated by your administrator. Please log back in to reactivate your account."
-msgstr ""
+msgstr "Administratorul dumneavoastră v-a dezactivat contul. Vă rugăm să vă conectați din nou pentru a vă reactiva contul."
msgid "Your account has been deactivated. You will not be able to: "
msgstr "Contul dvs. a fost dezactivat. Nu veți mai putea să: "
@@ -44330,13 +45017,13 @@ msgid "Your authorized applications"
msgstr "Aplicațiile dvs. autorizate"
msgid "Your browser does not support iFrames"
-msgstr "Browser-ul dvs. nu acceptă iFrames"
+msgstr "Browserul dvs. nu acceptă iFrames"
msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
msgstr "Browserul dvs. nu acceptă U2F. Va rugăm să folosiți Google Chrome desktop (versiunea 41 sau mai nouă)."
msgid "Your browser doesn't support WebAuthn. Please use a supported browser, e.g. Chrome (67+) or Firefox (60+)."
-msgstr "Browserul dvs. nu acceptă WebAuthn. Vă rugăm să utilizați un browser acceptat, de exemplu Chrome (67+) sau Firefox (60+)."
+msgstr "Browserul dvs. nu acceptă WebAuthn. Vă rugăm să utilizați un browser compatibil, de exemplu Chrome (67+) sau Firefox (60+)."
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr "Modificările dvs pot fi comise în %{branch_name} deoarece un merge request este deschis."
@@ -44360,7 +45047,7 @@ msgid "Your comment could not be updated! Please check your network connection a
msgstr "Comentariul dvs. nu a putut fi actualizat! Vă rugăm să verificați conexiunea la rețea și să încercați din nou."
msgid "Your comment will be discarded."
-msgstr ""
+msgstr "Comentariul dvs. va fi înlăturat."
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr "E-mailul dvs. de commit este utilizat pentru operațiunile bazate pe web, cum ar fi editările și fuziunile."
@@ -44369,13 +45056,13 @@ msgid "Your current password is required to register a two-factor authenticator
msgstr "Parola dvs. actuală este necesară pentru a înregistra o aplicație de autentificare cu doi factori."
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
-msgstr "Dashboard-ul dvs. a fost copiat. Îl puteți %{web_ide_link_start}edita aici%{web_ide_link_end}."
+msgstr "Tabloul dvs. de bord a fost copiat. Îl puteți %{web_ide_link_start}edita aici%{web_ide_link_end}."
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
-msgstr "Dashboard-ul dvs. a fost actualizat. Îl puteți %{web_ide_link_start}edita aici%{web_ide_link_end}."
+msgstr "Tabloul dvs. de bord a fost actualizat. Îl puteți %{web_ide_link_start}edita aici%{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 ""
+msgstr "Adresa dvs. de e-mail de notificare implicită este utilizată pentru notificările de cont dacă nu este setată o %{openingTag}adresă de e-mail specifică grupului%{closingTag}."
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr "Serviciile dvs. de implementare vor fi întrerupte, va trebui să reparați manual serviciile după redenumire."
@@ -44387,10 +45074,10 @@ msgid "Your device needs to be set up. Plug it in (if needed) and click the butt
msgstr "Dispozitivul dvs. trebuie să fie configurat. Conectați-l (dacă este necesar) și faceți clic pe butonul din stânga."
msgid "Your device was successfully set up! Give it a name and register it with the GitLab server."
-msgstr "Dispozitivul dvs. fost configurat cu succes! Dați-i un nume și înregistrați-l pe serverul GitLab."
+msgstr "Dispozitivul dvs. a fost configurat cu succes! Dați-i un nume și înregistrați-l pe serverul GitLab."
msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
-msgstr ""
+msgstr "Fișierul dvs. trebuie să conțină o coloană numită %{codeStart}titlu%{codeEnd}. O coloană de %{codeStart}descriere%{codeEnd} este opțională. Mărimea maximă permisă a fișierului este de 10 MB."
msgid "Your first project"
msgstr "Primul dvs. proiect"
@@ -44408,16 +45095,16 @@ msgid "Your instance is approaching its licensed user count"
msgstr "Instanța dvs. se apropie de numărul de utilizatori licențiați"
msgid "Your issues are being imported. Once finished, you'll get a confirmation email."
-msgstr "Problemele dvs. sunt importate. Odată finalizat, veți primi un e-mail de confirmare."
+msgstr "Problemele dvs. sunt importate. După terminare, veți primi un e-mail de confirmare."
msgid "Your issues will be imported in the background. Once finished, you'll get a confirmation email."
-msgstr "Problemele dvs. vor fi importate în fundal. Odată finalizat, veți primi un e-mail de confirmare."
+msgstr "Problemele dvs. vor fi importate în fundal. După terminare, veți primi un e-mail de confirmare."
msgid "Your license does not support on-call rotations"
-msgstr ""
+msgstr "Licența dvs. nu acceptă rotații de gardă"
msgid "Your license does not support on-call schedules"
-msgstr ""
+msgstr "Licența dvs. nu acceptă programe de gardă"
msgid "Your license is valid from"
msgstr "Licența dvs. este valabilă de la"
@@ -44432,13 +45119,13 @@ msgid "Your name"
msgstr "Numele dvs."
msgid "Your new %{accessTokenType}"
-msgstr ""
+msgstr "Noul dvs. %{accessTokenType}"
msgid "Your new %{accessTokenType} has been created."
-msgstr ""
+msgstr "Noul dvs. %{accessTokenType} a fost creat."
msgid "Your new %{type}"
-msgstr "Noul tău %{type}"
+msgstr "Noul dvs. %{type}"
msgid "Your new access token has been created."
msgstr "Noul dvs. token de acces a fost creat."
@@ -44446,14 +45133,8 @@ msgstr "Noul dvs. token de acces a fost creat."
msgid "Your new comment"
msgstr "Noul dvs. comentariu"
-msgid "Your new personal access token has been created."
-msgstr "Noul dvs. token de acces personal a fost creat."
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
-msgstr "Token-ul de resetare a parolei a expirat."
+msgstr "Tokenul dvs. de resetare a parolei a expirat."
msgid "Your personal access token has expired"
msgstr "Tokenul dvs. de acces personal a expirat"
@@ -44465,10 +45146,13 @@ msgid "Your primary email is used for avatar detection. You can change it in you
msgstr "Adresa dvs. de e-mail principală este folosită pentru înregistrarea avatarurilor. O puteți schimba în %{openingTag}setările profilului%{closingTag} dvs."
msgid "Your profile"
-msgstr "Profilul dvs."
+msgstr "Profilul d-voastră"
+
+msgid "Your project has limited quotas and features"
+msgstr "Proiectul dvs. are cote și caracteristici limitate"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
-msgstr ""
+msgstr "Limita proiectelor dvs. este de %{limit} (de) proiecte! Vă rugăm să contactați administratorul dvs. pentru a o mări"
msgid "Your project will be created at:"
msgstr "Proiectul dvs. va fi creat la:"
@@ -44480,28 +45164,28 @@ msgid "Your public email will be displayed on your public profile."
msgstr "E-mailul dvs. public va fi afișat pe profilul dvs. public."
msgid "Your request for access could not be processed: %{error_message}"
-msgstr ""
+msgstr "Solicitarea dvs. de acces nu a putut fi procesată: %{error_message}"
msgid "Your request for access has been queued for review."
-msgstr "Solicitarea dvs. de acces a fost pusă în așteptare pentru examinare."
+msgstr "Solicitarea dvs. de acces a fost pusă în coadă pentru examinare."
msgid "Your request to join %{host} has been rejected."
msgstr "Solicitarea dvs. de a vă alătura la %{host} a fost respinsă"
msgid "Your requirements are being imported. Once finished, you'll receive a confirmation email."
-msgstr "Cerințele dvs. sunt importate. Odată finalizat, veți primi un e-mail de confirmare."
+msgstr "Cerințele dvs. sunt importate. După terminare, veți primi un e-mail de confirmare."
msgid "Your requirements will be imported in the background. After it's finished, you'll get a confirmation email."
-msgstr "Cerințele dvs. vor fi importate în fundal. După ce importul s-a finalizat, veți primi un e-mail de confirmare."
+msgstr "Cerințele dvs. vor fi importate în fundal. După terminare, veți primi un e-mail de confirmare."
msgid "Your response has been recorded."
-msgstr "Răspunsul dumneavoastră a fost înregistrat."
+msgstr "Răspunsul dvs. a fost înregistrat."
msgid "Your search didn't match any commits."
-msgstr ""
+msgstr "Căutarea dvs. nu a găsit niciun commit."
msgid "Your search didn't match any commits. Try a different query."
-msgstr "Căutarea dvs. nu s-a potrivit cu nici un commit. Încercați o altă interogare."
+msgstr "Căutarea dvs. nu s-a potrivit cu niciun commit. Încercați o altă interogare."
msgid "Your search timed out"
msgstr "Căutarea dvs. a expirat"
@@ -44517,12 +45201,9 @@ msgstr "Abonamentul dvs. a expirat!"
msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seat remaining."
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr "Abonamentul dvs. a expirat. Pentru a-l reînnoi, exportați fișierul de utilizare a licenței și trimiteți-l prin e-mail la %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dumneavoastră. Pentru a utiliza nivelul gratuit, înlăturați licența curentă."
+msgstr[0] "În abonamentul dvs. a rămas %{remaining_seat_count} din %{total_seat_count} seat."
+msgstr[1] "În abonamentul dvs. a(u) rămas %{remaining_seat_count} din %{total_seat_count} seat-uri."
+msgstr[2] "În abonamentul dvs. a(u) rămas %{remaining_seat_count} din %{total_seat_count} de seat-uri."
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
@@ -44530,6 +45211,12 @@ msgstr[0] "Abonamentul dvs. va expira în %{remaining_days} zi."
msgstr[1] "Abonamentul dvs. va expira în %{remaining_days} zile."
msgstr[2] "Abonamentul dvs. va expira în %{remaining_days} de zile."
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr "Numele dvs. de utilizator este %{username}."
@@ -44597,17 +45284,20 @@ msgid "[Redacted]"
msgstr "[Redacted]"
msgid "`end_time` should not exceed one month after `start_time`"
-msgstr "`end_time` nu trebuie să depășească o lună după `start_time`"
+msgstr "„end_time†nu trebuie să depășească o lună după „start_timeâ€."
msgid "`start_time` should precede `end_time`"
-msgstr "`start_time` ar trebui să preceadă `end_time`"
+msgstr "„start_time†ar trebui să preceadă „end_timeâ€"
+
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr "Pentru acest proiect, Feature Flag „work_items_hierarchy†a fost dezactivat"
msgid "a deleted user"
msgstr "un utilizator șters"
msgid "about 1 hour"
msgid_plural "about %d hours"
-msgstr[0] "cam 1 oră"
+msgstr[0] "aproximativ 1 oră"
msgstr[1] "aproximativ %d ore"
msgstr[2] "aproximativ %d de ore"
@@ -44630,16 +45320,19 @@ msgid "alert"
msgstr "alertă"
msgid "allowed to fail"
-msgstr ""
+msgstr "permis să eșueze"
+
+msgid "already banned from namespace"
+msgstr "deja interzis din spațiul de nume"
msgid "already being used for another group or project %{timebox_name}."
msgstr "este deja utilizat pentru un alt grup sau proiect %{timebox_name}."
msgid "already being used for another iteration within this cadence."
-msgstr ""
+msgstr "este deja utilizat pentru o altă iterație în cadrul acestei cadențe."
msgid "already has a \"created\" issue link"
-msgstr ""
+msgstr "are deja un link de problemă „creatâ€"
msgid "already shared with this group"
msgstr "deja partajat cu acest grup"
@@ -44648,10 +45341,10 @@ msgid "and"
msgstr "și"
msgid "any-approver for the merge request already exists"
-msgstr ""
+msgstr "orice-aprobator pentru merge request există deja"
msgid "any-approver for the project already exists"
-msgstr ""
+msgstr "orice-aprobator pentru proiect există deja"
msgid "approval"
msgid_plural "approvals"
@@ -44666,16 +45359,22 @@ msgid "archived:"
msgstr "arhivat:"
msgid "artifacts"
-msgstr ""
+msgstr "artefacte"
msgid "assign yourself"
-msgstr "atribuie-te"
+msgstr "atribuiți-vă singur"
msgid "at"
msgstr "la"
+msgid "at least the Reporter role"
+msgstr "cel puțin rolul de Reporter"
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr "cel puțin rolul de Reporter, autorul și responsabilii"
+
msgid "at risk"
-msgstr ""
+msgstr "la risc"
msgid "attach a new file"
msgstr "atașați un fișier nou"
@@ -44687,13 +45386,13 @@ msgid "banned user already exists"
msgstr "utilizatorul interzis există deja"
msgid "blocks"
-msgstr ""
+msgstr "blochează"
msgid "branch"
msgid_plural "branches"
msgstr[0] "ramură"
msgstr[1] "ramuri"
-msgstr[2] "ramurii"
+msgstr[2] "de ramuri"
msgid "branch name"
msgstr "numele ramurii"
@@ -44708,10 +45407,10 @@ msgid "cURL:"
msgstr "cURL:"
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
-msgstr ""
+msgstr "poate conÈ›ine numai litere din alfabetul Base64 (RFC4648), la care se adaugă „@â€, „:†și „.â€."
msgid "can contain only lowercase letters, digits, and '_'."
-msgstr "poate conține doar litere mici, cifre și '_'."
+msgstr "poate conține numai litere minuscule, cifre și \"_\"."
msgid "can not be changed for existing notes"
msgstr "nu poate fi modificat pentru notele existente"
@@ -44723,19 +45422,22 @@ msgid "can not be set for this type of note"
msgstr "nu poate fi setat pentru acest tip de notă"
msgid "can only be changed by a group admin."
-msgstr ""
+msgstr "se poate schimba doar de un administrator de grup."
msgid "can only have one escalation policy"
msgstr "poate avea doar o singură politică de escaladare"
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr "nu se poate activa atunci când ștergerea întârziată a grupului este dezactivată"
+
msgid "can't be nil"
msgstr "nu poate fi nil"
msgid "can't be solely blank"
-msgstr "nu poate fi doar gol"
+msgstr "nu poate fi doar necompletat"
msgid "can't be the same as the source project"
-msgstr ""
+msgstr "nu poate fi același cu proiectul sursă"
msgid "can't include: %{invalid_storages}"
msgstr "nu poate include: %{invalid_storages}"
@@ -44770,6 +45472,9 @@ msgstr "nu se poate activa decât dacă toate domeniile au certificate TLS"
msgid "cannot be enabled until a valid credit card is on file"
msgstr "nu se poate activa până când nu este înregistrat un card de credit valabil"
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr "nu se poate utiliza deoarece aparține unei chei private compromise. Nu mai utilizați această cheie și generați una nouă."
+
msgid "cannot be used for user namespace"
msgstr "nu poate fi utilizat pentru spațiul de nume de utilizator"
@@ -44842,11 +45547,11 @@ msgstr "%{reportType}: Încărcarea a avut ca rezultat o eroare"
msgid "ciReport|%{sameNum} same"
msgstr "%{sameNum} la fel"
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
-msgstr ""
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
+msgstr "%{scanner} a detectat %{strong_start}%{number}%{strong_end} potențiale noi %{vulnStr}"
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
-msgstr ""
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
+msgstr "%{scanner} nu a detectat %{strong_start}noi%{strong_end} %{vulnStr}"
msgid "ciReport|: Loading resulted in an error"
msgstr ": Încărcarea a avut ca rezultat o eroare"
@@ -44857,6 +45562,9 @@ msgstr "Fuzzing de API"
msgid "ciReport|API fuzzing"
msgstr "Fuzzing de API"
+msgid "ciReport|All clusters"
+msgstr "Toate clusterele"
+
msgid "ciReport|All projects"
msgstr "Toate proiectele"
@@ -44910,15 +45618,15 @@ msgstr "Rezultatele metricilor de testare a Code Quality sunt analizate"
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Calitatea codului s-a degradat din cauza unei noi probleme"
+msgstr[1] "Calitatea codului s-a degradat din cauza a %d probleme noi"
+msgstr[2] "Calitatea codului s-a degradat din cauza a %d de probleme noi"
msgid "ciReport|Code quality improved due to 1 resolved issue"
msgid_plural "ciReport|Code quality improved due to %d resolved issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Calitatea codului s-a îmbunătățit datorită unei probleme rezolvate"
+msgstr[1] "Calitatea codului s-a îmbunătățit datorită a %d probleme rezolvate"
+msgstr[2] "Calitatea codului s-a îmbunătățit datorită a %d de probleme rezolvate"
msgid "ciReport|Code quality scanning detected %{issueCount} changes in merged results"
msgstr "Scanarea calității codului a detectat %{issueCount} modificări în rezultatele îmbinate"
@@ -44984,10 +45692,10 @@ msgid "ciReport|Fixed:"
msgstr "Corectat:"
msgid "ciReport|Found %{issuesWithCount}"
-msgstr "S-au găsit %{issuesWithCount}"
+msgstr "S-a(u) găsit %{issuesWithCount}"
msgid "ciReport|Full Report"
-msgstr ""
+msgstr "Raportul complet"
msgid "ciReport|IaC Scanning"
msgstr "Scanarea IaC"
@@ -45029,7 +45737,7 @@ msgid "ciReport|Loading Code Quality report"
msgstr "Încărcarea raportului Code Quality"
msgid "ciReport|Manage Licenses"
-msgstr ""
+msgstr "Gestionați licențele"
msgid "ciReport|Manage licenses"
msgstr "Gestionați licențele"
@@ -45068,7 +45776,7 @@ msgid "ciReport|Secret detection"
msgstr "Detectarea secretelor"
msgid "ciReport|Security reports failed loading results"
-msgstr ""
+msgstr "Rapoartele de securitate nu au reușit să încarce rezultatele"
msgid "ciReport|Security scanning"
msgstr "Scanare de securitate"
@@ -45077,7 +45785,7 @@ msgid "ciReport|Security scanning failed loading any results"
msgstr "Scanarea de securitate nu a reușit să încarce niciun rezultat"
msgid "ciReport|Security scanning is loading"
-msgstr ""
+msgstr "Scanarea de securitate se încarcă"
msgid "ciReport|Showing %{fetchedItems} of %{totalItems} items"
msgstr "Se afișează %{fetchedItems} din %{totalItems} elemente"
@@ -45122,7 +45830,7 @@ msgid "ciReport|View full report"
msgstr "Vizualizați raportul complet"
msgid "ciReport|in"
-msgstr ""
+msgstr "în"
msgid "ciReport|is loading"
msgstr "se încarcă"
@@ -45133,17 +45841,20 @@ msgstr "se încarcă, erori la încărcarea rezultatelor"
msgid "closed"
msgstr "închis"
+msgid "closed %{timeago}"
+msgstr "închis %{timeago}"
+
msgid "closed issue"
msgstr "problemă închisă"
msgid "collect usage information"
-msgstr "colectați informații de utilizare"
+msgstr "colectează informații de utilizare"
msgid "comment"
msgstr "comentariu"
msgid "commented on %{link_to_project}"
-msgstr ""
+msgstr "a comentat pe %{link_to_project}"
msgid "commit %{commit_id}"
msgstr "commit %{commit_id}"
@@ -45160,12 +45871,6 @@ msgstr "contactele pot fi adăugate numai la grupurile rădăcină"
msgid "container registry images"
msgstr "imaginile registrului de containere"
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr "container_name poate conține numai litere mici, cifre, '-' și '.' și trebuie să înceapă și să se termine cu un caracter alfanumeric"
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr "container_name nu poate fi mai mare de %{max_length} (de) caractere"
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr "conține URL-uri care depășesc limita de 1024 de caractere (%{urls})"
@@ -45173,19 +45878,19 @@ msgid "contains invalid URLs (%{urls})"
msgstr "conține URL-uri invalide (%{urls})"
msgid "contribute to this project."
-msgstr "contribuie la acest proiect."
+msgstr "contribuiți la acest proiect."
msgid "could not read private key, is the passphrase correct?"
-msgstr ""
+msgstr "nu s-a putut citi cheia privată, este fraza de acces corectă?"
msgid "created"
msgstr "creat"
msgid "created %{issuable_created} by %{author}"
-msgstr ""
+msgstr "%{issuable_created} creat(ă) de %{author}"
msgid "created %{timeAgoString} by %{email} via %{user}"
-msgstr "creat(ă) %{timeAgoString} prin %{email} via %{user}"
+msgstr "creat(ă) %{timeAgoString} prin %{email} prin %{user}"
msgid "created %{timeAgo}"
msgstr "creat(ă) %{timeAgo}"
@@ -45194,13 +45899,13 @@ msgid "created %{timeAgo} by %{author}"
msgstr "creat(ă) %{timeAgo} de %{author}"
msgid "created by"
-msgstr "creat de"
+msgstr "creat(ă) de"
msgid "data"
msgstr "date"
msgid "database"
-msgstr ""
+msgstr "baza de date"
msgid "date must not be after 9999-12-31"
msgstr "data nu trebuie să fie după 9999-12-31"
@@ -45209,7 +45914,7 @@ msgid "day"
msgid_plural "days"
msgstr[0] "zi"
msgstr[1] "zile"
-msgstr[2] "zile"
+msgstr[2] "de zile"
msgid "days"
msgstr "zile"
@@ -45218,10 +45923,13 @@ msgid "default branch"
msgstr "ramura implicită"
msgid "deleted"
-msgstr "șterse"
+msgstr "șters"
+
+msgid "denied"
+msgstr "refuzat"
msgid "deploy"
-msgstr ""
+msgstr "desfășurare"
msgid "design"
msgstr "design"
@@ -45269,7 +45977,7 @@ msgid "enabled"
msgstr "activat"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
-msgstr ""
+msgstr "criptat: trebuie să fie :required, :optional sau :migrating!"
msgid "ending with a reserved file extension is not allowed."
msgstr "terminarea cu o extensie de fișier rezervată nu este permisă."
@@ -45302,7 +46010,7 @@ msgid "exceeds the limit of %{bytes} bytes"
msgstr "depășește limita de %{bytes} bytes"
msgid "exceeds the limit of %{bytes} bytes for directory name \"%{dirname}\""
-msgstr "depășește limita de %{bytes} bytes pentru numele directorului \"%{dirname}\""
+msgstr "depășeÈ™te limita de %{bytes} bytes pentru numele directorului „%{dirname}â€"
msgid "expired on %{timebox_due_date}"
msgstr "a expirat la %{timebox_due_date}"
@@ -45320,7 +46028,7 @@ msgid "failed to dismiss finding: %{message}"
msgstr "nu a putut fi respinsă detectarea: %{message}"
msgid "failed to revert associated finding(id=%{finding_id}) to detected"
-msgstr ""
+msgstr "nu a reușit să revină descoperirea asociată (id=%{finding_id}) la cea detectată"
msgid "file"
msgid_plural "files"
@@ -45329,10 +46037,13 @@ msgstr[1] "fișiere"
msgstr[2] "de fișiere"
msgid "finding is not found or is already attached to a vulnerability"
-msgstr ""
+msgstr "constatarea nu este găsită sau este deja atașată unei vulnerabilități"
msgid "following"
-msgstr ""
+msgstr "urmăriți"
+
+msgid "for"
+msgstr "pentru"
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "pentru %{link_to_merge_request} cu %{link_to_merge_request_source_branch}"
@@ -45382,23 +46093,35 @@ msgstr "setările CI/CD ale grupului."
msgid "groups"
msgstr "grupuri"
+msgid "groups and projects"
+msgstr "grupuri și proiecte"
+
+msgid "groups only"
+msgstr "numai grupuri"
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] "a avut %{count} job eșuat"
+msgstr[1] "a avut %{count} joburi eșuate"
+msgstr[2] "a avut %{count} de joburi eșuate"
+
msgid "has already been linked to another vulnerability"
msgstr "a fost deja legat de o altă vulnerabilitate"
msgid "has already been taken"
-msgstr ""
+msgstr "a fost deja luat(ă)"
msgid "has already been taken as Codename"
-msgstr "a fost deja luat ca nume de cod"
+msgstr "a fost deja luat ca Nume de cod"
msgid "has already been taken as Suite"
-msgstr ""
+msgstr "a fost deja luat ca Suite"
msgid "has been completed."
msgstr "a fost finalizat."
msgid "has too deep level of nesting"
-msgstr ""
+msgstr "are un nivel prea adânc de imbricare"
msgid "help"
msgstr "ajutor"
@@ -45419,7 +46142,7 @@ msgid "i18n|%{language} (%{percent_translated}%% translated)"
msgstr "%{language} (%{percent_translated}%% tradus)"
msgid "image diff"
-msgstr ""
+msgstr "diff imagine"
msgid "impersonation token"
msgstr "token de impersonare"
@@ -45443,10 +46166,10 @@ msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instanță finalizată"
msgstr[1] "instanțe finalizate"
-msgstr[2] "instanțe finalizate"
+msgstr[2] "de instanțe finalizate"
msgid "internal note"
-msgstr ""
+msgstr "notă internă"
msgid "invalid milestone state `%{state}`"
msgstr "stare invalidă a obiectivului `%{state}`"
@@ -45458,7 +46181,7 @@ msgid "is already associated to a GitLab Issue. New issue will not be associated
msgstr "este deja asociat cu o problemă GitLab. Noua problemă nu va fi asociată."
msgid "is an invalid IP address range"
-msgstr "este un interval de adrese IP invalide"
+msgstr "este un interval de adrese IP invalid"
msgid "is blocked by"
msgstr "este blocat de"
@@ -45467,10 +46190,10 @@ msgid "is forbidden by a top-level group"
msgstr "este interzisă de un grup de nivel superior"
msgid "is invalid because there is downstream lock"
-msgstr ""
+msgstr "nu este valid, deoarece există un blocaj în aval"
msgid "is invalid because there is upstream lock"
-msgstr ""
+msgstr "nu este valid, deoarece există un blocaj în amonte"
msgid "is not"
msgstr "nu este"
@@ -45482,7 +46205,7 @@ msgid "is not a valid X509 certificate."
msgstr "nu este un certificat X509 valid."
msgid "is not allowed for sign-up. Please use your regular email address."
-msgstr ""
+msgstr "nu este permisă pentru înscriere. Vă rugăm să folosiți adresa dvs. obișnuită de e-mail."
msgid "is not allowed for this group."
msgstr "nu este permis pentru acest grup."
@@ -45494,13 +46217,13 @@ msgid "is not allowed since the group is not top-level group."
msgstr "nu este permis, deoarece grupul nu este un grup de nivel superior."
msgid "is not allowed. Please use your regular email address."
-msgstr ""
+msgstr "nu este permisă. Vă rugăm să folosiți adresa dvs. obișnuită de e-mail."
msgid "is not allowed. We do not currently support project-level iterations"
-msgstr ""
+msgstr "nu este permis. În prezent nu acceptăm iterații la nivel de proiect"
msgid "is not in the group enforcing Group Managed Account"
-msgstr ""
+msgstr "nu face parte din grupul care impune Contul gestionat de grup"
msgid "is not in the member group"
msgstr "nu face parte din membrii grupului"
@@ -45509,40 +46232,40 @@ msgid "is not the member project"
msgstr "nu este membru al proiectului"
msgid "is not valid. The iteration group has to match the iteration cadence group."
-msgstr ""
+msgstr "nu este validă. Grupul de iterații trebuie să se potrivească grupului de cadență de iterații."
msgid "is read-only"
-msgstr ""
+msgstr "este numai în citire"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
-msgstr "este prea lung (%{current_value}). Dimensiunea maximă este %{max_size}."
+msgstr "este prea lung (%{current_value}). Valoarea maximă este de %{max_size}."
msgid "is too long (maximum is %{count} characters)"
-msgstr ""
+msgstr "este prea lung(ă) (maximum este %{count} de caractere)"
msgid "is too long (maximum is 100 entries)"
msgstr "este prea lung (maximum 100 de intrări)"
msgid "is too long (maximum is 1000 entries)"
-msgstr ""
+msgstr "este prea lung (maximum este de 1000 de intrări)"
msgid "issue"
-msgstr "problemă"
+msgstr "problema"
msgid "issues at risk"
-msgstr ""
+msgstr "problemă(e) în pericol"
msgid "issues need attention"
-msgstr ""
+msgstr "problemă(e) necesită atenție"
msgid "issues on track"
-msgstr ""
+msgstr "problemă(e) conform planului"
msgid "it is larger than %{limit}"
msgstr "este mai mare de %{limit}"
msgid "it is stored as a job artifact"
-msgstr ""
+msgstr "este stocat ca un artefact de job"
msgid "it is stored externally"
msgstr "este stocat extern"
@@ -45557,13 +46280,13 @@ msgid "jigsaw is not defined"
msgstr "jigsaw nu este definit"
msgid "kuromoji custom analyzer"
-msgstr "analizor personalizat kuromoji"
+msgstr "analizator personalizat kuromoji"
msgid "last commit:"
msgstr "ultimul commit:"
msgid "latest"
-msgstr ""
+msgstr "cel mai recent"
msgid "latest deployment"
msgstr "ultima implementare"
@@ -45575,25 +46298,25 @@ msgid "leave %{group_name}"
msgstr "părăsiți %{group_name}"
msgid "less than a minute"
-msgstr "mai putin de un minut"
+msgstr "mai puțin de un minut"
msgid "level: %{level}"
msgstr "nivel: %{level}"
msgid "lfs objects"
-msgstr ""
+msgstr "obiecte lfs"
msgid "limit of %{project_limit} reached"
-msgstr ""
+msgstr "limita de %{project_limit} a fost atinsă"
msgid "load it anyway"
msgstr "încărcați-l oricum"
msgid "loading"
-msgstr "se încarcă"
+msgstr "încărcare"
msgid "locked by %{path_lock_user_name} %{created_at}"
-msgstr "blocat de %{path_lock_user_name} %{created_at}"
+msgstr "blocat(ă) de %{path_lock_user_name} la %{created_at}"
msgid "manual"
msgstr "manual"
@@ -45614,7 +46337,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "merge request"
msgstr[1] "merge request-uri"
-msgstr[2] "merge request-urile"
+msgstr[2] "de merge request-uri"
msgid "mergedCommitsAdded|(commits were squashed)"
msgstr "(squashing-ul de commit-uri s-a efectuat)"
@@ -45626,16 +46349,16 @@ msgid "missing"
msgstr "lipsește"
msgid "months"
-msgstr ""
+msgstr "luni"
msgid "most recent deployment"
-msgstr ""
+msgstr "cea mai recentă implementare"
msgid "mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}%{squashedCommits}."
msgstr "%{commitCount} și %{mergeCommitCount} vor fi adăugate la %{targetBranch}%{squashedCommits}."
msgid "mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}."
-msgstr "%{commitCount} se va/vor adăuga la %{targetBranch}."
+msgstr "%{commitCount} se va / vor adăuga la %{targetBranch}."
msgid "mrWidgetCommitsAdded|1 merge commit"
msgstr "1 commit de îmbinare"
@@ -45653,7 +46376,7 @@ msgid "mrWidgetCommitsAdded|The changes were not merged into %{targetBranch}."
msgstr "Modificările nu au fost îmbinate în %{targetBranch}."
msgid "mrWidgetNothingToMerge|This merge request contains no changes."
-msgstr ""
+msgstr "Acest merge request nu conține modificări."
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, push a commit or edit this merge request to use a different branch. With %{linkStart}CI/CD%{linkEnd}, automatically test your changes before merging."
msgstr "Folosiți merge request-uri pentru a propune modificări la propriul proiect și pentru a le discuta cu echipa dumneavoastră. Pentru a face modificări, împingeți un commit sau editați acest merge request pentru a utiliza o ramură diferită. Cu %{linkStart}CI/CD%{linkEnd}, testați-vă automat modificările înainte de a le îmbina."
@@ -45686,10 +46409,10 @@ msgid "mrWidget|A new merge train has started and this merge request is the firs
msgstr "Un nou merge train a început și acest merge request este primul în coada de așteptare."
msgid "mrWidget|Added to the merge train by %{merge_author}"
-msgstr "Adăugat la merge train de %{merge_author}"
+msgstr "Adăugat(e) la merge train de %{merge_author}"
msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
-msgstr "Adăugat la merge train. Există %{mergeTrainPosition} merge request-uri care așteaptă să fie îmbinate."
+msgstr "Adăugat(e) la merge train. Există %{mergeTrainPosition} merge request-uri care așteaptă să fie îmbinate"
msgid "mrWidget|An error occurred while removing your approval."
msgstr "A survenit o eroare în timpul înlăturării aprobării dvs."
@@ -45706,6 +46429,12 @@ msgstr "Aprobarea este opțională"
msgid "mrWidget|Approval password is invalid."
msgstr "Parola de aprobare nu este validă."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr "Regula de aprobare %{rules} este nevalidă. GitLab a aprobat automat această regulă pentru a debloca merge request-ul. %{link}"
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr "Regulile de aprobare %{rules} sunt nevalide. GitLab a aprobat automat aceste reguli pentru a debloca merge request-ul. %{link}"
+
msgid "mrWidget|Approve"
msgstr "Aprobați"
@@ -45811,6 +46540,9 @@ msgstr[2] "Probleme menționate"
msgid "mrWidget|Merge"
msgstr "ÃŽmbinare"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr "Îmbinare blocată: toate aprobările necesare trebuie să fie acordate."
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr "Îmbinare blocată: toate subiectele trebuie să fie rezolvate."
@@ -45829,9 +46561,6 @@ msgstr "Îmbinare blocată: pipeline-ul trebuie să reușească. Se așteaptă o
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr "Îmbinare blocată: pipeline-ul trebuie să reușească. Faceți push la un commit care corectează eșecul sau %{linkStart}aflați despre alte soluții.%{linkEnd}"
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr "Îmbinare blocată: acest merge request trebuie să fie aprobat."
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr "Îmbinare blocată: puteți îmbina numai după ce elementele de mai sus sunt rezolvate."
@@ -45877,6 +46606,9 @@ msgstr "Îmbinare în curs! Suntem aproape acolo..."
msgid "mrWidget|More information"
msgstr "Mai multe informații"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr "Niciun utilizator nu corespunde criteriilor regulii."
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "Vă rugăm să o restaurați sau să folosiți o altă ramură %{type}."
@@ -45920,7 +46652,7 @@ msgid "mrWidget|Set by %{merge_author} to be merged automatically when the pipel
msgstr "Setat de %{merge_author} pentru a fi îmbinat automat atunci când pipeline-ul reușește"
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
-msgstr "Setat de %{merge_author} pentru a începe un merge train când conducta reușește"
+msgstr "Setat de %{merge_author} pentru a începe un merge train când pipeline-ul reușește"
msgid "mrWidget|Show %{widget} details"
msgstr "Afișați detalii despre %{widget}"
@@ -45989,16 +46721,16 @@ msgid "must be after start"
msgstr "trebuie să fie după start"
msgid "must be an email you have verified"
-msgstr "trebuie să fie un e-mail verificat"
+msgstr "trebuie să fie un e-mail pe care l-ați verificat"
msgid "must be greater than start date"
-msgstr "trebuie să fie mai mare decât data de începere"
+msgstr "trebuie să fie mai mare decât data de început"
msgid "must be inside the fork network"
msgstr "trebuie să fie în interiorul rețelei fork."
msgid "must be less than the limit of %{tag_limit} tags"
-msgstr ""
+msgstr "trebuie să fie mai mic(ă) decât limita de %{tag_limit} (de) etichete"
msgid "must be set for a project namespace"
msgstr "trebuie să fie setat pentru un spațiu de nume de proiect"
@@ -46013,16 +46745,16 @@ msgid "must match %{association}.project_id"
msgstr "trebuie să corespundă cu %{association}.project_id"
msgid "my-awesome-group"
-msgstr "grupul-meu-minunat"
+msgstr "grupul-meu-formidabil"
msgid "my-channel"
-msgstr "canalul meu"
+msgstr "canalul-meu"
msgid "my-topic"
msgstr "subiectul meu"
msgid "need attention"
-msgstr "au nevoie de atenție"
+msgstr "necesită atenție"
msgid "needs to be between 10 minutes and 1 month"
msgstr "trebuie să fie între 10 minute și 1 lună"
@@ -46037,19 +46769,19 @@ msgid "new merge request"
msgstr "merge request nou"
msgid "no expiration"
-msgstr ""
+msgstr "nu expiră"
msgid "no name set"
-msgstr ""
+msgstr "niciun nume setat"
msgid "no one can merge"
-msgstr ""
+msgstr "nimeni nu poate îmbina"
msgid "no scopes selected"
-msgstr ""
+msgstr "niciun domeniu selectat"
msgid "none"
-msgstr ""
+msgstr "nimic"
msgid "not authorized to create member"
msgstr "nu este autorizat să creeze un membru"
@@ -46061,26 +46793,32 @@ msgid "not found"
msgstr "nu a fost găsit"
msgid "nounSeries|%{firstItem} and %{lastItem}"
-msgstr ""
+msgstr "%{firstItem} și %{lastItem}"
msgid "nounSeries|%{item}"
msgstr "%{item}"
msgid "nounSeries|%{item}, %{nextItem}"
-msgstr ""
+msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
-msgstr ""
+msgstr "%{item} și %{lastItem}"
msgid "on track"
-msgstr "în grafic"
+msgstr "conform planului"
-msgid "only available on top-level groups."
+msgid "only %{parent_types} can be parent of Task."
msgstr ""
-msgid "open issue"
+msgid "only Task can be assigned as a child in hierarchy."
msgstr ""
+msgid "only available on top-level groups."
+msgstr "disponibil(ă) numai pentru grupurile de nivel superior."
+
+msgid "open issue"
+msgstr "problemă deschisă"
+
msgid "or"
msgstr "sau"
@@ -46094,22 +46832,28 @@ msgid "out of %d total test"
msgid_plural "out of %d total tests"
msgstr[0] "din %d test total"
msgstr[1] "din %d teste totale"
-msgstr[2] "din %d teste totale"
+msgstr[2] "din %d de teste totale"
msgid "packages"
-msgstr ""
+msgstr "pachete"
msgid "pages"
-msgstr ""
+msgstr "pagini"
msgid "parent"
msgid_plural "parents"
msgstr[0] "părinte"
msgstr[1] "părinți"
-msgstr[2] "părinții"
+msgstr[2] "de părinții"
+
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
msgid "password"
-msgstr "parolă"
+msgstr "parola"
msgid "pending comment"
msgstr "comentariu în așteptare"
@@ -46130,7 +46874,7 @@ msgid "pipeline schedules documentation"
msgstr "documentația despre programele de pipeline"
msgid "pipelineEditorWalkthrough|Let's do this!"
-msgstr "Haideți să facem asta!"
+msgstr "Haideți să o facem!"
msgid "pipelineEditorWalkthrough|See how GitLab pipelines work"
msgstr "Vedeți cum funcționează pipeline-urile GitLab"
@@ -46139,22 +46883,16 @@ msgid "pipelineEditorWalkthrough|This %{codeStart}.gitlab-ci.yml%{codeEnd} file
msgstr "Acest fișier %{codeStart}.gitlab-ci.yml%{codeEnd} creează un pipeline de testare simplu."
msgid "pipelineEditorWalkthrough|Use the %{boldStart}commit changes%{boldEnd} button at the bottom of the page to run the pipeline."
-msgstr "Utilizați butonul %{boldStart}comiteți modificările%{boldEnd} din partea de jos a paginii pentru a rula pipeline-ul."
+msgstr "Utilizați butonul %{boldStart}Comiteți modificările%{boldEnd} din partea de jos a paginii pentru a rula pipeline-ul."
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr "pod_name poate conține doar litere mici, cifre, '-' și '.' și trebuie să înceapă și să se termine cu un caracter alfanumeric."
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "pod_name nu poate fi mai mare de %{max_length} (de) caractere"
+msgstr "Puteți utiliza arborele de fișiere pentru a vizualiza fișierele de configurare a pipeline-ului. %{linkStart}Aflați mai multe%{linkEnd}"
msgid "point"
msgid_plural "points"
msgstr[0] "punct"
msgstr[1] "puncte"
-msgstr[2] "puncte"
+msgstr[2] "de puncte"
msgid "previously merged commits"
msgstr "commit-uri îmbinate anterior"
@@ -46166,25 +46904,25 @@ msgid "private key does not match certificate."
msgstr "cheia privată nu se potrivește cu certificatul."
msgid "processing"
-msgstr ""
+msgstr "procesare"
msgid "project"
msgid_plural "projects"
msgstr[0] "proiect"
msgstr[1] "proiecte"
-msgstr[2] "proiectele"
+msgstr[2] "de proiecte"
msgid "project access token"
-msgstr ""
+msgstr "token de acces la proiect"
msgid "project access tokens"
-msgstr ""
+msgstr "tokenuri de acces la proiect"
msgid "project bots cannot be added to other groups / projects"
msgstr "boții de proiect nu pot fi adăugați la alte grupuri / proiecte"
msgid "project is read-only"
-msgstr ""
+msgstr "proiectul este numai în citire"
msgid "project members"
msgstr "membrii proiectului"
@@ -46208,19 +46946,19 @@ msgid "reCAPTCHA private key"
msgstr "cheie privată reCAPTCHA"
msgid "reCAPTCHA site key"
-msgstr ""
+msgstr "cheia site-ului reCAPTCHA"
msgid "recent activity"
msgstr "activitate recentă"
msgid "register"
-msgstr "înregistrare"
+msgstr "înregistrați-vă"
msgid "relates to"
msgstr "se referă la"
msgid "remaining"
-msgstr "rămase"
+msgstr "rămas(e)"
msgid "remove"
msgstr "înlăturați"
@@ -46241,19 +46979,19 @@ msgid "removed a Zoom call from this issue"
msgstr "a înlăturat un apel Zoom din această problemă"
msgid "rendered diff"
-msgstr ""
+msgstr "diff redat"
msgid "reply"
msgid_plural "replies"
msgstr[0] "răspuns"
msgstr[1] "răspunsuri"
-msgstr[2] "răspunsurile"
+msgstr[2] "de răspunsuri"
msgid "reply should have same confidentiality as top-level note"
msgstr "răspunsul ar trebui să aibă aceeași confidențialitate ca și nota de nivel superior"
msgid "repositories"
-msgstr ""
+msgstr "repozitorii"
msgid "repository:"
msgstr "repozitoriu:"
@@ -46262,10 +47000,10 @@ msgid "satisfied"
msgstr "satisfăcut"
msgid "scan-execution-policy: policy not applied, %{policy_path} file is invalid"
-msgstr ""
+msgstr "scan-execution-policy: politica nu s-a aplicat, fișierul %{policy_path} este nevalid"
msgid "scan-execution-policy: policy not applied, %{policy_path} file is missing"
-msgstr ""
+msgstr "scan-execution-policy: politica nu s-a aplicat, fișierul %{policy_path} lipsește"
msgid "security Reports|There was an error creating the merge request"
msgstr "A apărut o eroare la crearea merge request-ului"
@@ -46301,13 +47039,16 @@ msgid "severity|Unknown"
msgstr "Necunoscută"
msgid "should be an array of %{object_name} objects"
-msgstr ""
+msgstr "ar trebui să fie o matrice de obiecte %{object_name}"
+
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr "ar trebui să fie o matrice de nume de utilizator existente. %{invalid} nu există"
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
-msgstr "ar trebui să fie mai mare sau egală cu %{access} membri moșteniți din grupul %{group_name}"
+msgstr "ar trebui să fie mai mare sau egal cu cel de %{access} moștenit de la grupul %{group_name}"
msgid "show %{count} more"
-msgstr ""
+msgstr "arată încă %{count}"
msgid "show fewer"
msgstr "arată mai puține"
@@ -46316,19 +47057,19 @@ msgid "show less"
msgstr "arată mai puțin"
msgid "sign in"
-msgstr "autentificare"
+msgstr "autentificați-vă"
msgid "smartcn custom analyzer"
-msgstr "analizor personalizat smartcn"
+msgstr "analizator personalizat smartcn"
msgid "source"
-msgstr "sursă"
+msgstr "sursa"
msgid "source diff"
-msgstr ""
+msgstr "diff sursă"
msgid "specified top is not part of the tree"
-msgstr ""
+msgstr "nivelul superior specificat nu face parte din arbore"
msgid "spendCommand|%{slash_command} adds or subtracts time already spent."
msgstr "%{slash_command} adaugă sau scade timpul deja petrecut."
@@ -46370,7 +47111,7 @@ msgid "suggestPipeline|We’re adding a GitLab CI configuration file to add a pi
msgstr "Adăugăm un fișier de configurare GitLab CI pentru a adăuga un pipeline la proiect. Ați putea să-l creați manual, dar vă recomandăm să începeți cu un șablon GitLab care funcționează din start."
msgid "tag name"
-msgstr "nume etichetă"
+msgstr "numele etichetei"
msgid "terraform states"
msgstr "stările terraform"
@@ -46379,13 +47120,13 @@ msgid "the correct format."
msgstr "formatul corect."
msgid "the following epic(s)"
-msgstr ""
+msgstr "următoarea / următoarele epică(e)"
msgid "the following incident(s) or issue(s)"
-msgstr ""
+msgstr "următorul (următoarele) incident(e) sau problemă(e)"
msgid "the following issue(s)"
-msgstr "următoarea (următoarele) problemă(e)"
+msgstr "următoarea / următoarele problemă(e)"
msgid "the wiki"
msgstr "wiki"
@@ -46397,10 +47138,10 @@ msgid "this document"
msgstr "acest document"
msgid "time summary"
-msgstr "sumar timp"
+msgstr "rezumat de timp"
msgid "today"
-msgstr ""
+msgstr "astăzi"
msgid "toggle collapse"
msgstr "comutare restrângere"
@@ -46421,13 +47162,13 @@ msgid "unicode domains should use IDNA encoding"
msgstr "domeniile unicode ar trebui să utilizeze codificarea IDNA"
msgid "updated"
-msgstr ""
+msgstr "s-a actualizat"
msgid "updated %{timeAgo}"
msgstr "s-a actualizat %{timeAgo}"
msgid "updated %{time_ago}"
-msgstr ""
+msgstr "s-a actualizat %{time_ago}"
msgid "uploads"
msgstr "încărcări"
@@ -46445,13 +47186,13 @@ msgid "v%{version} published %{timeAgo}"
msgstr "v%{version} publicată %{timeAgo}"
msgid "value for '%{storage}' must be an integer"
-msgstr "valoarea pentru '%{storage}' trebuie să fie un număr întreg"
+msgstr "valoarea pentru „%{storage}†trebuie să fie un număr întreg."
msgid "value for '%{storage}' must be between 0 and 100"
-msgstr "valoarea pentru '%{storage}' trebuie să fie între 0 și 100"
+msgstr "valoarea pentru „%{storage}†trebuie să fie între 0 și 100"
msgid "verify ownership"
-msgstr ""
+msgstr "verificați proprietatea"
msgid "version %{versionIndex}"
msgstr "versiunea %{versionIndex}"
@@ -46487,7 +47228,7 @@ msgid "vulnerability|Add a comment or reason for dismissal"
msgstr "Adăugați un comentariu sau un motiv pentru respingere"
msgid "vulnerability|Add comment"
-msgstr "Adăugați comentariul"
+msgstr "Adăugare comentariu"
msgid "vulnerability|Add comment & dismiss"
msgstr "Adăugați comentariu & respingeți"
@@ -46508,31 +47249,37 @@ msgid "vulnerability|dismissed"
msgstr "respins"
msgid "was scheduled to merge after pipeline succeeds by"
-msgstr ""
+msgstr "a fost programată pentru îmbinare după ce pipeline-ul reușește de"
msgid "wiki page"
msgstr "pagina wiki"
msgid "with %{additions} additions, %{deletions} deletions."
-msgstr ""
+msgstr "cu %{additions} (de) adăugiri și %{deletions} (de) ștergeri."
msgid "with expiry changing from %{old_expiry} to %{new_expiry}"
-msgstr "cu expirarea schimbării de la %{old_expiry} la %{new_expiry}"
+msgstr "cu schimbarea expirării de la %{old_expiry} la %{new_expiry}"
msgid "with expiry remaining unchanged at %{old_expiry}"
-msgstr "cu expirarea rămânând neschimbată la %{old_expiry}"
+msgstr "cu expirarea rămasă neschimbată la %{old_expiry}"
msgid "yaml invalid"
msgstr "yaml invalid"
+msgid "your GitLab instance"
+msgstr "instanța dvs. GitLab"
+
+msgid "your group (%{group_name})"
+msgstr "grupul dvs. (%{group_name})"
+
msgid "your settings"
-msgstr "setările dvs."
+msgstr "setările d-voastră"
msgid "{group}"
-msgstr "{group}"
+msgstr "{grup}"
msgid "{project}"
-msgstr "{project}"
+msgstr "{proiect}"
msgid "✔"
msgstr "✔"
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index 41c3a693864..a85c992d7a2 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -374,6 +374,13 @@ msgstr[1] "%d обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ ÑƒÑпешно импортированы Ñ
msgstr[2] "%d обÑуждений уÑпешно импортированы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹"
msgstr[3] "%d обÑуждений уÑпешно импортированы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d Ñлой"
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d Ñекунда"
@@ -486,6 +500,13 @@ msgstr[1] "%d Ñекунды"
msgstr[2] "%d Ñекунд"
msgstr[3] "%d Ñекунд"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d звезда"
@@ -865,9 +886,15 @@ msgstr "%{labelStart}КлаÑÑ:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}ÐÐ´Ñ€ÐµÑ ÑбоÑ:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}СоÑтоÑние ÑбоÑ:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}ДоказательÑтва:%{labelEnd} %{evidence}"
@@ -1086,9 +1113,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr "%{seconds}Ñ"
@@ -1190,6 +1214,9 @@ msgstr[3] "%{strong_start}%{count} учаÑтников%{strong_end} должнÑ
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} Релиз"
@@ -1231,6 +1258,9 @@ msgstr "%{timebox_type} не поддерживает диаграммы ÑгоÑ
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1527,6 +1557,13 @@ msgstr ""
msgid "0 bytes"
msgstr "0 байт"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 день"
@@ -1784,6 +1821,9 @@ msgstr "Сайт Jekyll иÑпользует Netlify Ð´Ð»Ñ CI/CD вмеÑто G
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "SSL Ñертификат Let's Encrypt не может быть получен, пока ваш домен не будет проверен."
+msgid "A Work Item can be a parent or a child, but not both."
+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"
@@ -2072,6 +2112,9 @@ msgstr "Разрешены к иÑпользованию в Ñтом проекÑ
msgid "Access Git repositories or the API."
msgstr "ДоÑтуп к репозиториÑм Git или API."
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Токены доÑтупа"
@@ -2189,6 +2232,12 @@ msgstr "Ðовый"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "При Ñканировании доÑтупноÑти обнаружена ошибка типа %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ"
@@ -2279,9 +2328,6 @@ msgstr "Добавить CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "Добавить CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Добавить URL-Ð°Ð´Ñ€ÐµÑ Jaeger"
-
msgid "Add Kubernetes cluster"
msgstr "Добавить клаÑтер Kubernetes"
@@ -2312,9 +2358,6 @@ msgstr "Добавить ключ GPG"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 "Добавьте URL-Ð°Ð´Ñ€ÐµÑ Jaeger, чтобы заменить Ñту Ñтраницу ÑÑылкой на ваш Jaeger-Ñервер. Сначала необходимо %{link_start_tag}уÑтановить Jaeger%{link_end_tag}."
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr "Добавить УÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Политику конфиденциальноÑти Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ñтого ÑкземплÑра GitLab."
@@ -2342,9 +2385,6 @@ msgstr "Добавить общий комментарий Ð´Ð»Ñ Ñтого %{n
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 new issue"
msgstr "Добавить новое обÑуждение"
@@ -2594,9 +2634,6 @@ msgstr "Добавлено в Ñтой верÑии"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Добавление новых приложений отключено в вашем ÑкземплÑре GitLab. ОбратитеÑÑŒ к админиÑтратору GitLab, чтобы получить разрешение"
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "Дополнительные минуты"
@@ -2846,6 +2883,9 @@ msgstr "Ð’Ñе новые проекты могут иÑпользовать оÐ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Домен Auto DevOps"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2918,6 +2958,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr "Токен канала"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "Я прочёл и принимаю %{link_start}УÑÐ»Ð¾Ð²Ð¸Ñ Ð¾Ð±ÑлуживаниÑ%{link_end} (PDF) Let's Encrypt."
@@ -3143,8 +3186,8 @@ msgstr "2FA отключена"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA включена"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "Пользователь может подтвердить ÑебÑ, указав кредитную/дебетовую карту, или админиÑтратор может вручную проверить пользователÑ."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr ""
msgid "AdminUsers|Access"
msgstr "ДоÑтуп"
@@ -3152,6 +3195,9 @@ msgstr "ДоÑтуп"
msgid "AdminUsers|Access Git repositories"
msgstr "ДоÑтуп к Git-репозиториÑм"
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr "ДоÑтуп к API"
@@ -3194,6 +3240,9 @@ msgstr "Ðудиторы имеют право на проÑмотр вÑех г
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "ÐвтоматичеÑки помечен как внутренний пользователь по умолчанию."
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr "Забанить пользователÑ"
@@ -3221,6 +3270,9 @@ msgstr "Заблокированные"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Блокировка Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð¼ÐµÐµÑ‚ Ñледующие Ñффекты:"
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "Ðе удаетÑÑ Ð²Ð¾Ð¹Ñ‚Ð¸ или получить доÑтуп к информации об ÑкземплÑре"
@@ -3296,6 +3348,12 @@ msgstr "Это вы!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr "Узнать больше о %{link_start}забаненных пользователÑÑ….%{link_end}"
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3323,6 +3381,9 @@ msgstr "Личные проекты будут Ñохранены"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Личные проекты, группы и иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ оÑтанутÑÑ Ð½ÐµÑ‚Ñ€Ð¾Ð½ÑƒÑ‚Ñ‹Ð¼Ð¸"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÑƒÐ´ÐµÑ‚:"
@@ -3341,6 +3402,9 @@ msgstr "Отклонить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "Отклонённые пользователи:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "ВоÑÑтановить доÑтуп Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ðº учетной запиÑи, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²ÐµÐ±, Git и API."
@@ -3353,9 +3417,15 @@ msgstr "ПоиÑк пользователей"
msgid "AdminUsers|Send email to users"
msgstr "Отправить Ñлектронные пиÑьма пользователÑм"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "Сортировать по"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr "Пользователь не имеет доÑтупа к репозиториÑм git."
@@ -3404,9 +3474,6 @@ msgstr "Разблокировать Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{username}?"
msgid "AdminUsers|User administration"
msgstr "Управление пользователем"
-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"
msgstr "Пользователь не Ñможет получить доÑтуп к репозиториÑм git"
@@ -3425,6 +3492,9 @@ msgstr "Подтвердить учётную запиÑÑŒ пользоватеÐ
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3491,6 +3561,9 @@ msgstr ""
msgid "Administration"
msgstr "ÐдминиÑтрирование"
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3971,6 +4044,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr "Ð’Ñе пользователи должны принÑÑ‚ÑŒ УÑÐ»Ð¾Ð²Ð¸Ñ Ð¾ÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑƒÑлуг и Политику конфиденциальноÑти Ð´Ð»Ñ Ð´Ð¾Ñтупа к GitLab"
@@ -3983,12 +4059,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Разрешить %{group_name} Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñать"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr "Разрешить доÑтуп учаÑтникам Ñледующей группы"
@@ -4031,9 +4101,6 @@ msgstr "Разрешить проектам в Ñтой группе иÑполÑ
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr "Разрешить публичный доÑтуп к Ñборочным линиÑм и деталÑм заданий, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð»Ð¾Ð³Ð¸ и артефакты."
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "Разрешить подгруппам уÑтанавливать Ñвои ÑобÑтвенные правила двухфакторной аутентификации"
-
msgid "Allow this key to push to this repository"
msgstr "Разрешить Ñтому ключу выполнÑÑ‚ÑŒ push в данный репозиторий"
@@ -4046,9 +4113,6 @@ msgstr "Разрешить пользователÑм закрыть ÑообщÐ
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Разрешить пользователÑм региÑтрировать любое приложение Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ GitLab как провайдера OAuth"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "Разрешить пользователÑм запрашивать доÑтуп (еÑли видимоÑÑ‚ÑŒ ÑвлÑетÑÑ Ð¾Ð±Ñ‰ÐµÐ´Ð¾Ñтупной или внутренней)"
-
msgid "Allowed"
msgstr "Разрешено"
@@ -4061,12 +4125,18 @@ msgstr "Разрешено ограничение доменов ÑлектроÐ
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "Ðеудача разрешена"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr "Разрешает проектам или подгруппам в Ñтой группе переопределÑÑ‚ÑŒ глобальные наÑтройки."
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "ПозволÑет добавлÑÑ‚ÑŒ и управлÑÑ‚ÑŒ клаÑтерами Kubernetes."
@@ -4226,6 +4296,9 @@ msgstr "Произошла ошибка при получении предпро
msgid "An error occurred while fetching ancestors"
msgstr "Произошла ошибка при получении предков"
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "Произошла ошибка при получении веток. Повторите поиÑк."
@@ -4445,6 +4518,9 @@ msgstr "Произошла ошибка при получении diff-файлÐ
msgid "An error occurred while retrieving projects."
msgstr "Произошла ошибка при получении проектов."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr "Произошла ошибка при Ñохранении изменений: %{error}"
@@ -4455,6 +4531,9 @@ msgstr[1] "Произошла ошибка при Ñохранении параÐ
msgstr[2] "Произошла ошибка при Ñохранении параметров"
msgstr[3] "Произошла ошибка при Ñохранении параметров"
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "При подпиÑке на ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐ»Ð° ошибка."
@@ -4662,6 +4741,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "ÐаÑтройки Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑƒÑпешно Ñохранены"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "Ðе удалоÑÑŒ обновить наÑтройки приложениÑ"
@@ -5062,8 +5144,8 @@ msgstr "Ðрхивный проект! Репозиторий и другие Ñ€
msgid "Archived projects"
msgstr "Ðрхивные проекты"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "ÐÑ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð° Ñделает его Ñовершенно недоÑтупным Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи. Он не будет отображатьÑÑ Ð½Ð° панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ в результатах поиÑка. %{strong_start}Ð’ репозиторий Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ вноÑить изменениÑ, Ñоздавать обÑуждениÑ, комментарии, а также другие ÑущноÑти.%{strong_end} %{link_start}Узнать подробнее.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr "Ð’Ñ‹ ÐБСОЛЮТÐО УВЕРЕÐЫ, что хотите удалить Ñту группу?"
@@ -5168,6 +5250,9 @@ msgstr "Вы уверены, что хотите удалить %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Вы уверены, что вы хотите удалить %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить вложение?"
@@ -5186,6 +5271,9 @@ msgstr "Ð’Ñ‹ уверены, что хотите удалить Ñтот ÑпиÑ
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Ð’Ñ‹ уверены, что хотите ÑброÑить Ñтот токен проверки работоÑпоÑобноÑти?"
@@ -5303,6 +5391,9 @@ msgstr "Ðазначить метки"
msgid "Assign milestone"
msgstr "Ðазначить Ñтап"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5400,9 +5491,6 @@ msgstr "Под угрозой"
msgid "Attach a file"
msgstr "Прикрепить файл"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Приложить файл через drag &amp; drop или %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr "Прикрепление файла - %{progress}"
@@ -5476,6 +5564,9 @@ msgstr "Этот меÑÑц"
msgid "AuditLogs|User Events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5500,6 +5591,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5509,6 +5603,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5524,6 +5624,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "Ðвг."
@@ -6016,9 +6119,6 @@ msgstr "Будьте оÑторожны. Изменение пути проекÑ
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Будьте оÑторожны. Переименование Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð° может вызвать нежелательные побочные Ñффекты."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr "Перед включением данной интеграции Ñоздайте веб-обработчик Ð´Ð»Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ñ‹ Google Chat, в которой вы хотите получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтого проекта. %{docs_link}"
@@ -6421,6 +6521,12 @@ msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить %{username} из вашей Ð
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Импорт из Bitbucket Server"
@@ -6721,6 +6827,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7042,6 +7151,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr "Диаграмма ÑгораниÑ"
@@ -7138,6 +7250,9 @@ msgstr "%{percent}%{percentSymbol}"
msgid "CICDAnalytics|All time"
msgstr "Ð’ÑÑ‘ времÑ"
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr "ЧаÑтота развертываниÑ"
@@ -7181,6 +7296,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7508,6 +7626,9 @@ msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° карты"
msgid "Card number:"
msgstr "Ðомер карты:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr "Принудительно применить Ð´Ð»Ñ Ð²Ñех подгрупп"
@@ -7679,9 +7800,6 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñкрыты. Ðажмите, чтобы показа
msgid "Changes the title to \"%{title_param}\"."
msgstr "ИзменÑет название на \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² заголовке не были Ñохранены"
@@ -7933,6 +8051,12 @@ msgstr "План GitLab"
msgid "Checkout|Group"
msgstr "Группа"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð¸ или организации, иÑпользующей GitLab"
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr "Ðалоги"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr "Итого"
@@ -8050,6 +8171,9 @@ msgstr "Дочерней цели не ÑущеÑтвует."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8426,6 +8550,9 @@ msgstr "Закрыто %{epicTimeagoDate}"
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Закрытые обÑуждениÑ"
@@ -8444,6 +8571,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr "КлаÑтер"
@@ -8453,9 +8697,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr "КÑш клаÑтера очищен."
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8823,9 +9064,6 @@ msgstr "РаÑширенные опции интеграции Ñтого кла
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Разрешить GitLab управлÑÑ‚ÑŒ проÑтранÑтвами имён и Ñлужебными аккаунтами Ñтого клаÑтера."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8865,6 +9103,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Выберите, какие из ваших окружений будут иÑпользовать Ñтот клаÑтер."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "ОчиÑтить кÑш клаÑтера"
@@ -8910,9 +9151,6 @@ msgstr "Знаете ли вы?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Служба Elastic Kubernetes"
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9090,10 +9328,16 @@ msgstr "SSL-Ñертификат Kubernetes, иÑпользуемый Ð´Ð»Ñ Ð°Ñ
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "URL, иÑпользуемый Ð´Ð»Ñ Ð´Ð¾Ñтупа к API Kubernetes."
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr "Ðналитика Ð ÐµÑ†ÐµÐ½Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ ÑпиÑок открытых запроÑов на ÑлиÑние, которые находÑÑ‚ÑÑ Ð½Ð° Ñтадии проверки кода. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ проекта и/или фильтров отÑутÑтвуют рецензируемые запроÑÑ‹ на ÑлиÑние."
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9270,6 +9520,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9661,6 +9914,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9697,12 +9953,12 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
-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 advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr ""
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr ""
@@ -9892,9 +10148,6 @@ msgstr "РееÑÑ‚Ñ€ контейнеров"
msgid "Container Scanning"
msgstr "Сканирование контейнеров"
-msgid "Container does not exist"
-msgstr "Контейнер не ÑущеÑтвует"
-
msgid "Container must be a project or a group."
msgstr "Контейнер должен быть проектом или группой."
@@ -10120,9 +10373,6 @@ msgstr "Удалить теги Ñтарше:"
msgid "ContainerRegistry|Remove these tags"
msgstr "Удалить Ñти теги"
-msgid "ContainerRegistry|Root image"
-msgstr "Корневой образ"
-
msgid "ContainerRegistry|Run cleanup:"
msgstr "ЗапуÑтить очиÑтку:"
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Ðекоторые теги не были удалены"
@@ -10858,6 +11111,9 @@ msgstr "Создать новую метку"
msgid "Create new project"
msgstr "Создать новый проект"
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11552,6 +11808,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11585,6 +11844,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11633,13 +11901,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11771,6 +12039,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11981,6 +12252,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12186,12 +12460,6 @@ msgstr "Ветвь по умолчанию"
msgid "Default branch and protected branches"
msgstr "Ветвь по умолчанию и защищенные ветки"
-msgid "Default delayed project deletion"
-msgstr "Отложенное удаление проекта по умолчанию"
-
-msgid "Default deletion delay"
-msgstr "Задержка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию"
-
msgid "Default description template for issues"
msgstr "Шаблон опиÑÐ°Ð½Ð¸Ñ Ð¾Ð±Ñуждений по умолчанию."
@@ -12204,9 +12472,6 @@ msgstr "Первый день недели по умолчанию"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Первый день недели по умолчанию в календарÑÑ… и ÑредÑтвах выбора даты."
-msgid "Default project deletion protection"
-msgstr "Защита от ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð° по умолчанию"
-
msgid "Default projects limit"
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12300,9 +12568,6 @@ msgstr "Удалить комментарий"
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr "Удалить ключ"
@@ -12348,6 +12613,9 @@ msgstr ""
msgid "Delete image repository"
msgstr "Удалить репозиторий образов"
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr "Удалить метку"
@@ -12459,6 +12727,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12600,13 +12895,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð° не ÑущеÑтвует. ВмеÑто неё показана поÑледнÑÑ Ð²ÐµÑ€ÑиÑ"
@@ -13235,6 +13518,9 @@ msgstr "ИнформациÑ"
msgid "Details (default)"
msgstr "ПодробноÑти (по умолчанию)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr "Отключить Ð´Ð»Ñ Ñтого проекта"
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr "Отключить двухфакторную аутентификацию"
@@ -13716,9 +14002,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13935,12 +14218,12 @@ msgstr ""
msgid "Edit"
msgstr "Редактировать"
-msgid "Edit %{issuable}"
-msgstr "Редактировать %{issuable}"
-
msgid "Edit %{name}"
msgstr "Редактировать %{name}"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr ""
@@ -13968,9 +14251,6 @@ msgstr "Изменить пароль"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14121,9 +14401,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14262,9 +14539,6 @@ msgstr ""
msgid "Embed"
msgstr "Ð’Ñтроить"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr "ПуÑтой файл"
@@ -14280,6 +14554,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr "Включить Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr "Включить Gitpod"
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr "Включить отложенное удаление проектов Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… групп по умолчанию."
-
msgid "Enable email notification"
msgstr ""
@@ -14463,9 +14737,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr "Произошла ошибка во Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð°: %{err}"
@@ -14586,9 +14857,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr "Окружение не имеет развёртываний"
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14688,12 +14956,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "Коммит"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ‹ вÑе результаты."
-
msgid "Environments|Delete"
msgstr ""
@@ -14730,9 +14992,6 @@ msgstr "ÐžÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ - Ñто меÑта где код развёртывÐ
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Задание"
@@ -14742,9 +15001,6 @@ msgstr "Узнайте больше об окружениÑÑ…"
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr "Журналы Ñ %{start} по %{end}."
-
msgid "Environments|New environment"
msgstr "Ðовое окружение"
@@ -14754,12 +15010,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr "Еще нет развертываний"
-msgid "Environments|No pod selected"
-msgstr "Под не выбран"
-
-msgid "Environments|No pods to display"
-msgstr "Ðет подов Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Обратите внимание, что Ñто дейÑтвие оÑтановит окружение, но %{emphasisStart}не%{emphasisEnd} повлиÑет на уже запущенные фазы развёртываниÑ, в Ñлучае еÑли в файле %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} не определено дейÑтвие \"оÑтановка окружениÑ\"."
@@ -14769,11 +15019,8 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr "Открыть живое окружение"
-msgid "Environments|Pod name"
-msgstr "Ðазвание пода"
-
-msgid "Environments|Re-deploy"
-msgstr "Повторное развертывание"
+msgid "Environments|Re-deploy environment"
+msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
msgstr ""
@@ -14781,18 +15028,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr "Повторное развертывание в окружение"
-msgid "Environments|Rollback"
-msgstr "Откатить"
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr "Откатить окружение %{name}?"
-msgid "Environments|Select pod"
-msgstr "Выберите под"
-
msgid "Environments|Show all"
msgstr "Показать вÑе"
@@ -14808,14 +15049,11 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr "Произошла ошибка при извлечении журналов. ПожалуйÑта, попробуйте ещё раз."
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr "Это дейÑтвие перезапуÑтит задание Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð° %{linkStart}%{commitId}%{linkEnd}, вернув окружение в предыдущую верÑию. Ð’Ñ‹ уверены что хотите продолжить?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
+msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
-msgstr "Это дейÑтвие запуÑтит задание, определённое %{name} Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð° %{linkStart}%{commitId}%{linkEnd}, Ð¿ÐµÑ€ÐµÐ²ÐµÐ´Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ðµ в предыдущую верÑию. Ð’Ñ‹ можете обратить Ñтот Ñффект, повторно развернув поÑледнюю верÑию Ñвоего приложениÑ. Ð’Ñ‹ дейÑтвительно хотите продолжить?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr ""
msgid "Environments|Upcoming"
msgstr ""
@@ -14949,6 +15187,9 @@ msgstr "Что-то пошло не так при удалении обÑуждÐ
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "Ðктивно"
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr "Ð’Ñе, имеющие доÑтуп"
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "Каждый может внеÑти Ñвой вклад"
@@ -15580,8 +15827,8 @@ msgstr ""
msgid "Expires"
msgstr "ИÑтекает"
-msgid "Expires in %{expires_at}"
-msgstr "ИÑтекает в %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr ""
msgid "Expires on"
msgstr ""
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15766,6 +16016,13 @@ msgstr "Ðеудачно"
msgid "Failed Jobs"
msgstr "Ðевыполненные ЗаданиÑ"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr ""
@@ -16449,8 +16706,11 @@ msgstr "ПоиÑк по пути"
msgid "Find file"
msgstr "Ðайти файл"
-msgid "Fingerprint"
-msgstr "Отпечаток"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
+msgstr ""
msgid "Fingerprints"
msgstr ""
@@ -16458,6 +16718,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr "Сначала завершите редактирование Ñтого ÑообщениÑ!"
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16659,7 +16919,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16901,9 +17161,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr "Проект"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "Проект (ID: %{project_id}) больше не ÑущеÑтвует на первичном узле. Удалить Ñту запиÑÑŒ безопаÑно, так как Ñто не удалит никакие данные на диÑке."
@@ -17213,9 +17464,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "Синхронизировано"
-msgid "Geo|Synced at"
-msgstr "Синхронизировано в"
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17459,6 +17704,42 @@ msgstr ""
msgid "Git version"
msgstr "ВерÑÐ¸Ñ Git"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17576,9 +17860,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17675,6 +17956,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr "Проверенные"
@@ -17780,9 +18064,15 @@ msgstr "Глобальные ÑÐ¾Ñ‡ÐµÑ‚Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ"
msgid "Global notification settings"
msgstr "Глобальные наÑтройки уведомлений"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17798,6 +18088,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,16 +18112,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18104,6 +18403,9 @@ msgstr "Gravatar включён"
msgid "Group"
msgstr "Группа"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18257,6 +18559,9 @@ msgstr "Группа была уÑпешно обновлена."
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "Группа: %{group_name}"
@@ -18266,7 +18571,7 @@ msgstr "Группа: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18533,18 +18838,15 @@ msgstr "ПоиÑк групп"
msgid "GroupSelect|Select a group"
msgstr "Выбрать группу"
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ была обновлена ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого DevOps"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18575,25 +18877,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr "ПользовательÑкие шаблоны проекта"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "ИÑпользовать по умолчанию Ñборочные линии Auto DevOps Ð´Ð»Ñ Ð²Ñех проектов в Ñтой группе"
-msgid "GroupSettings|Disable email notifications"
-msgstr "Отключить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте"
-
-msgid "GroupSettings|Disable group mentions"
-msgstr "Отключить групповые упоминаниÑ"
+msgid "GroupSettings|Email notifications are disabled"
+msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18602,6 +18904,18 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "ПереопределÑет пользовательÑкие наÑтройки уведомлений Ð´Ð»Ñ Ð²Ñех учаÑтников Ñтой группы, подгрупп и проектов."
@@ -18617,22 +18931,13 @@ 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"
+msgid "GroupSettings|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "Запретить публикацию проектов из %{group} в других группах"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-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. Inherited by subgroups."
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,9 +18958,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18674,7 +18988,7 @@ msgstr "Эта наÑтройка применена в %{ancestor_group}. Ð’Ñ‹
msgid "GroupSettings|Transfer group"
msgstr "ПеренеÑти группу"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18806,9 +19120,6 @@ msgstr "Импорт группы"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19296,10 +19607,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr "Ðе удалоÑÑŒ выполнить обработчик. УбедитеÑÑŒ, что группа имеет проект Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°Ð¼Ð¸."
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "Ð§Ð°Ñ (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "ОчиÑтка"
@@ -19473,15 +19781,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Включать Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° в текÑте ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте"
@@ -20760,9 +21149,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr "Ð’Ñтавить цитату"
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21013,6 +21405,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ð¸ очиÑтит наÑтройки и деактивирует Ñту интеграцию."
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21154,6 +21555,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr "Обнаружен неверный файл конфигурации Insights"
@@ -21166,15 +21570,6 @@ msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ ÑÑылка"
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð°Ñ‚Ð°"
@@ -21217,9 +21612,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr "Ðеверный ответ Ñервера"
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr "УчаÑтники уÑпешно добавлены"
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "ПоиÑк группы Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ"
@@ -21388,6 +21780,13 @@ msgstr "Выберите учаÑтников или введите адреÑа
msgid "InviteMembersModal|Something went wrong"
msgstr "Что-то пошло не так"
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21499,6 +21898,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21682,15 +22084,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "не может быть более 500 лет в будущем"
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr "Янв."
@@ -22048,9 +22441,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22411,12 +22816,18 @@ msgstr "Задание было удалено"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr "ОÑтавить"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr "Прокрутить вниз"
msgid "Job|Scroll to top"
msgstr "Прокрутить вверх"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr "Показать полный иÑходный текÑÑ‚"
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr "КлаÑтер Kubernetes"
@@ -22672,6 +23089,13 @@ msgstr "Метка"
msgid "Label actions dropdown"
msgstr "Выпадающее меню дейÑтвий над метками"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr ""
@@ -22898,9 +23322,6 @@ msgstr "Узнайте о GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22916,9 +23337,6 @@ msgstr "Узнайте, как %{no_packages_link_start}опубликовать
msgid "Learn more"
msgstr "Подробнее"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22979,19 +23397,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23036,22 +23454,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr "Ваша команда раÑÑ‚Ñ‘Ñ‚! Ð’Ñ‹ уÑпешно приглаÑили новых учаÑтников в проект %{projectName}."
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23078,9 +23502,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr "Журналы"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr "Чтобы проÑмотреть журналы, разверните Ñвой код в окружение."
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23678,9 +24096,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23690,9 +24105,6 @@ msgstr ""
msgid "Manage access"
msgstr "УправлÑÑ‚ÑŒ доÑтупом"
-msgid "Manage all notifications"
-msgstr "Управление уведомлениÑми"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24418,12 +24836,18 @@ msgstr "ЗавиÑимоÑти запроÑа на ÑлиÑние"
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24589,8 +25013,8 @@ msgstr "Ошибка при загрузке полной разницы. Пож
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
-msgstr "ПоиÑк файлов (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgstr ""
msgid "Merged"
msgstr "Слито"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr "ПроÑмотр журналов"
-
msgid "Metrics|Y-axis label"
msgstr "ПодпиÑÑŒ оÑи Y"
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr "Ðайдено неÑколько типов моделей: %{model_types}"
@@ -25446,6 +25882,9 @@ msgstr ""
msgid "My-Reaction"
msgstr "ÐœÐ¾Ñ Ñ€ÐµÐ°ÐºÑ†Ð¸Ñ"
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr "ИмÑ"
@@ -25470,9 +25909,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr "ID проÑтранÑтва имён:"
-msgid "Namespace is empty"
-msgstr "ПроÑтранÑтво имён пуÑто"
-
msgid "Namespace:"
msgstr "ПроÑтранÑтво:"
@@ -25561,10 +25997,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25573,10 +26009,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25733,18 +26169,15 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ñ†ÐµÐ»ÑŒ"
msgid "New epic title"
msgstr "Ðовый заголовок цели"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Ðовый файл"
msgid "New group"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr "Ðовый токен доÑтупа Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ работоÑпоÑобноÑти Ñгенерирован!"
@@ -25838,9 +26271,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr "Ðовый..."
-
msgid "Newest first"
msgstr "Сначала новые"
@@ -25895,6 +26325,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25925,6 +26358,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Ðет изменений"
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26042,6 +26475,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr "Ðет доÑтупных подов"
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr "СвÑзанные запроÑÑ‹ на ÑлиÑние не найденÑ
msgid "No repository"
msgstr "Ðет репозиториÑ"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr "Ð’Ñ‹ уверены, что вы хотите отменить ÑоздÐ
msgid "Notes|Collapse replies"
msgstr "Свернуть ответы"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26461,21 +26903,48 @@ msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹"
msgid "Notifications on"
msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "ÐоÑб."
@@ -26975,6 +27468,9 @@ msgstr[1] "Еще %d Ñлементов"
msgstr[2] "Еще %d Ñлементов"
msgstr[3] "Еще %d Ñлементов"
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26999,7 +27495,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,22 +27504,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr "Только учаÑтники проекта"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27059,10 +27558,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27158,6 +27657,9 @@ msgstr "Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñми"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ предоÑтавлÑет Ñводку оперативного ÑоÑтоÑÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ проекта, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÑтатуÑÑ‹ Ñборочной линии и предупреждений."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27176,6 +27678,9 @@ msgstr "ÐаÑтройки"
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr ""
msgid "Owner"
msgstr "Владелец"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr "Добавить иÑточник NuGet"
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27482,6 +27987,9 @@ msgstr "Удалить пакет"
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr "Удалить пакет"
@@ -27642,6 +28153,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Извините, ваш фильтр иÑключил вÑе результаты"
@@ -27681,9 +28195,6 @@ 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 ""
@@ -27774,18 +28285,12 @@ msgstr "Параметр \"job_id\" не может превышать длинÑ
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr "РодительÑÐºÐ°Ñ Ñ†ÐµÐ»ÑŒ не ÑущеÑтвует."
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr "ИÑпользовать шаблон"
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr "Проверка конфигурации GitLab CI…"
@@ -28833,6 +29368,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "ЗапуÑк"
@@ -29040,12 +29578,6 @@ msgstr "ПожалуйÑта, подождите, пока мы не подклÑ
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "ПожалуйÑта, подождите пока мы импортируем к ваш репозиторий. ОбновлÑйте Ñтраницу по желанию."
-msgid "Pod does not exist"
-msgstr "Под не ÑущеÑтвует"
-
-msgid "Pod not found"
-msgstr "Под не найден"
-
msgid "Pods in use"
msgstr "ИÑпользуемые поды"
@@ -29121,14 +29653,17 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "ÐаÑтройте Ð´Ð»Ñ ÑÐµÐ±Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ даты и времени"
msgid "Preferences|Customize integrations with third party services."
msgstr "ÐаÑтройте интеграцию Ñо Ñторонними ÑервиÑами."
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "ÐаÑтройте внешний вид верхней и боковой панели навигации."
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr ""
@@ -29169,9 +29704,6 @@ msgstr "Ширина макета"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Должно быть чиÑлом между %{min} и %{max}"
-msgid "Preferences|Navigation theme"
-msgstr "Дизайн верхней панели"
-
msgid "Preferences|Preview"
msgstr ""
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr "Пред."
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr "ПредпроÑмотр Markdown"
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ запланирована к удалению."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Ðктивировать вход Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ одного из Ñледующих ÑервиÑов"
-
msgid "Profiles|Active"
msgstr "ÐктивноÑÑ‚ÑŒ"
@@ -29436,7 +29965,7 @@ msgstr "Добавить Ñмайл к ÑтатуÑу"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,8 +29992,8 @@ msgstr "Изменение вашего имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾
msgid "Profiles|Choose file..."
msgstr "Выбрать файл..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "Выберите, чтобы показывать вклад от закрытых проектов в ваш публичный профиль без какой-либо информации о проекте, репозитории или организации"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr ""
msgid "Profiles|City, country"
msgstr "Город, Ñтрана"
@@ -29478,6 +30007,9 @@ msgstr "Email коммита"
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "Подключенные аккаунты"
@@ -29505,7 +30037,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr "Ðе показывать в профиле"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29514,16 +30046,16 @@ msgstr "Изменить профиль"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "Введите ваше имÑ, чтобы люди, которых вы знаете, могли раÑпознать ваÑ"
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,8 +30088,8 @@ msgstr "Включить вклад в приватные проекты в мо
msgid "Profiles|Incoming email token was successfully reset"
msgstr "Токен входÑщей Ñлектронной почты был уÑпешно Ñброшен"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "ПовыÑьте безопаÑноÑÑ‚ÑŒ учётной запиÑи, включив двухфакторную аутентификацию (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
msgid "Profiles|Invalid password"
msgstr "Ðеверный пароль"
@@ -29643,14 +30175,14 @@ msgstr "Удалить аватар"
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
-msgstr "Вход через Ñоциальные Ñети"
+msgid "Profiles|Set your local time zone."
+msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "Ðекоторые параметры недоÑтупны Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ñ‹Ñ… запиÑей LDAP"
@@ -29658,8 +30190,8 @@ msgstr "Ðекоторые параметры недоÑтупны Ð´Ð»Ñ ÑƒÑ‡Ðµ
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "РаÑÑкажите о Ñебе иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼ÐµÐ½ÐµÐµ 250 Ñимволов"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
@@ -29667,17 +30199,17 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "МакÑимально допуÑтимый размер файла ÑоÑтавлÑет 200 Кбайт."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "Этот email будет отображатьÑÑ Ð² вашем профиле"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "Этот Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð²ÐµÐ±-операций, таких как редактирование и ÑлиÑние. %{commit_email_link_start}Узнайте больше%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Этот Ñмайл и Ñообщение поÑвÑÑ‚ÑÑ Ð² вашем профиле и во вÑем интерфейÑе."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ отображатьÑÑ Ð² вашем профиле"
+msgid "Profiles|This information will appear on your profile."
+msgstr ""
msgid "Profiles|Time settings"
msgstr "ÐаÑтройки времени"
@@ -29685,8 +30217,8 @@ msgstr "ÐаÑтройки времени"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
-msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ"
+msgid "Profiles|Two-factor authentication"
+msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Введите значение %{confirmationValue} Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ:"
@@ -29721,8 +30253,8 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "Как у Ð²Ð°Ñ Ð´ÐµÐ»Ð°?"
-msgid "Profiles|Who you represent or work for"
-msgstr "Кого вы предÑтавлÑете, или на кого работаете"
+msgid "Profiles|Who you represent or work for."
+msgstr ""
msgid "Profiles|You can change your avatar here"
msgstr "Ð’Ñ‹ можете изменить Ñвой аватар здеÑÑŒ"
@@ -29763,6 +30295,9 @@ msgstr "Ваше меÑтоположение было автоматичеÑкÐ
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "Ваше Ð¸Ð¼Ñ Ð±Ñ‹Ð»Ð¾ автоматичеÑки уÑтановлено на оÑнове вашей учетной запиÑи %{provider_label}, чтобы ваши знакомые могли Ð²Ð°Ñ ÑƒÐ·Ð½Ð°Ñ‚ÑŒ"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "Ваш ÑтатуÑ"
@@ -29841,8 +30376,8 @@ msgstr ""
msgid "Project URL"
msgstr "ÐÐ´Ñ€ÐµÑ ÐŸÑ€Ð¾ÐµÐºÑ‚Ð°"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
-msgstr "ДоÑтуп должен быть предоÑтавлен Ñвно каждому пользователю. ЕÑли проект ÑвлÑетÑÑ Ñ‡Ð°Ñтью группы, он наÑледует учаÑтников и их привилегии."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -29964,6 +30499,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Ðаименование"
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr "Что такое значки?"
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30759,7 +31303,7 @@ msgstr "СвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором, чтобы вклÑ
msgid "ProjectsNew|Create"
msgstr "Создать"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30819,8 +31363,8 @@ msgstr "ЗапуÑтить CI/CD Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ репозиториÑ"
msgid "ProjectsNew|Visibility Level"
msgstr "Уровень доÑтупа"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "Хотите размеÑтить неÑколько взаимоÑвÑзанных проектов в одном отдельном меÑте? %{link_start}Создать группу.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
msgid "PrometheusAlerts|exceeded"
msgstr ""
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr "Убрать рекламу диаграмм ÑгораниÑ"
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr "ПеремеÑтить"
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr "Перемещение в процеÑÑе"
@@ -31710,9 +32266,6 @@ 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 "Обновить"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31877,6 +32430,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32270,9 +32826,6 @@ msgstr ""
msgid "Replace"
msgstr "Заменить"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32300,6 +32853,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr "Ответ по Ñлектронной почте"
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "СброÑить ключ доÑтупа проверки работоÑпоÑобноÑти"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Повторить Ñто фоновое задание"
@@ -33304,6 +33860,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr "SAML Ð´Ð»Ñ %{group_name}"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34355,7 +34938,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,6 +34983,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35021,6 +35595,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35135,6 +35715,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35156,6 +35739,9 @@ msgstr "Выбор целевой ветки"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr "УÑтановить дату завершениÑ"
@@ -35444,6 +36027,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "ÐаÑтройте Ñвой проект, чтобы автоматичеÑки загружать и/или Ñкачивать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²/из другого репозиториÑ. Ветки, теги и коммиты будут ÑинхронизироватьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr "УÑтановить приоритет"
@@ -35772,6 +36361,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Показать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð²"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr ""
msgid "Showing all issues"
msgstr "Показаны вÑе обÑуждениÑ"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr "Показана поÑледнÑÑ Ð²ÐµÑ€ÑиÑ"
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37006,6 +37652,9 @@ msgstr "Хранилище:"
msgid "StorageSize|Unknown"
msgstr "ÐеизвеÑтный"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37027,7 +37676,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37045,6 +37694,9 @@ msgstr "Подгруппы"
msgid "Subgroups and projects"
msgstr "Подгруппы и проекты"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,6 +37760,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37414,7 +38069,10 @@ msgstr ""
msgid "Summary"
msgstr "Сводка"
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr "Поддержка"
@@ -37598,6 +38259,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr "СиÑтемное (%{default})"
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr "ID задачи: %{elastic_task}"
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr "%{rate}%{sign} показатель уÑпешноÑти"
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38312,9 +38994,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr "Группа \"%{group_path}\" позволÑет вам войти в ÑиÑтему Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ учетной запиÑи единого входа"
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "ИÑточник данных подключен, но нет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ. %{documentationLink}"
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr "Введённый вами домен запрещён."
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "МакÑимальный размер файла - %{size}."
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr "РаÑпиÑание Ñборочных линий может много
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr "ДоÑтуп к проекту может получить любой пользователь, вошедший в ÑиÑтему."
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr "ДоÑтуп к проекту может получить любой, незавиÑимо от аутентификации."
-
msgid "The project can be accessed without any authentication."
msgstr "ДоÑтуп к проекту возможен без какой-либо проверки подлинноÑти."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr "Проект доÑтупен только учаÑтникам проекта. ДоÑтуп должен быть предоÑтавлен Ñвно каждому пользователю."
-
msgid "The project is still being deleted. Please try again later."
msgstr "Проект вÑе еще удалÑетÑÑ. ПожалуйÑта, попробуйте позже."
@@ -38924,6 +39597,9 @@ msgstr "Пакетов пока нет"
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "Произошла ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð²Ð°ÑˆÐ¸Ð¼ уÑтройÑтвом."
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr "Это фоновое задание требует ручных дейÑ
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr "ВремÑ"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr "Time based: Да"
@@ -39833,9 +40509,6 @@ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´Ð¾ начала Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð²
msgid "Time before an issue starts implementation"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´Ð¾ начала работы над обÑуждением"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñозданием запроÑа ÑлиÑÐ½Ð¸Ñ Ð¸ ÑлиÑнием / закрытием"
@@ -39887,6 +40560,12 @@ msgstr "Оцен."
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Оценочно:"
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "Переключить боковую панель"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr "Показать/Ñкрыть панель производительноÑти"
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40477,9 +41165,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr "ТраÑÑировка"
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "Следите за обÑуждениÑми, Ñгруппированными по темам, Ñразу из неÑкольких проектов и Ñтапов"
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "УÑтранÑйте неполадки и Ñледите за ÑоÑтоÑнием Ñвоего Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ помощи траÑÑировки"
-
msgid "Trusted"
msgstr ""
@@ -40795,6 +41474,9 @@ msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ"
msgid "Two-factor authentication disabled"
msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°"
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° Ð´Ð»Ñ Ñтого пользователÑ"
@@ -40885,9 +41567,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr "Ðевозможно подключитьÑÑ Ðº Ñерверу Prometheus"
@@ -40897,9 +41576,6 @@ msgstr "Ðевозможно подключитьÑÑ Ðº Ñерверу:%{error}
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr "Ðевозможно подключитьÑÑ Ðº ÑкземплÑру Jira. ПожалуйÑта, проверьте наÑтройки интеграции Ñ Jira."
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr "Ðе удалоÑÑŒ найти проект Jira, из которого должны быть импортированы данные."
@@ -40942,6 +41615,9 @@ msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ отличиÑ. %{button_try_agai
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr "Ðевозможно Ñохранить итерацию. ПожалуйÑта, попробуйте Ñнова."
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr "ВоÑÑтановить проект"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41038,9 +41714,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr "ÐеизвеÑтный алгоритм шифрованиÑ: %{encrypted_strategy}!"
@@ -41092,12 +41765,6 @@ msgstr "ДиÑкуÑÑÐ¸Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°."
msgid "Unlocks the discussion."
msgstr "Разблокирует диÑкуÑÑию."
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41293,10 +41960,7 @@ msgstr ""
msgid "Upload object map"
msgstr "Загрузить карту объектов"
-msgid "UploadLink|click to upload"
-msgstr "кликните Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Купить дополнительные минуты"
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "Хранилище"
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42356,9 +43026,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr "Подробнее: %{details_url}"
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "Увидеть подходÑщих утверждающих"
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Мы хотим быть уверены, что Ñто вы, пожалуйÑта, подтвердите, что вы не робот."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,10 +44357,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr "Ð’Ñ‹ можете перенеÑти проект только в те проÑтранÑтва имен, которыми управлÑете."
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Ð’Ñ‹ можете разрешить конфликт ÑлиÑниÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»Ð¸Ð±Ð¾ интерактивный режим, выбрав кнопки %{use_ours} или %{use_theirs}, либо отредактировав файлы напрÑмую. Примите Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %{branch_name}"
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44417,18 +45100,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Ð’Ñ‹ получили Ñто Ñлектронное пиÑьмо из Ñвоей учетной запиÑи %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "Ð’Ñ‹ уже включили двухфакторную аутентификацию Ñ Ð¸Ñпользованием аутентификаторов Ñ Ð¾Ð´Ð½Ð¾Ñ€Ð°Ð·Ð¾Ð²Ñ‹Ð¼ паролем. Чтобы зарегиÑтрировать другое уÑтройÑтво, Ñначала необходимо отключить двухфакторную аутентификацию."
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr "Ваш новый перÑональный токен доÑтупа был Ñоздан."
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr "Ваш пароль не требуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтой Ñтраницы. ЕÑли запрашиваетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ или Ð»ÑŽÐ±Ð°Ñ Ð´Ñ€ÑƒÐ³Ð°Ñ Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ, обратитеÑÑŒ к админиÑтратору, чтобы Ñообщить о нарушении."
-
msgid "Your password reset token has expired."
msgstr "Ваш токен ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¸Ñтек."
@@ -44708,6 +45397,9 @@ msgstr "Ваш оÑновной Ð°Ð´Ñ€ÐµÑ Ñлектронной почты иÑ
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "Ваш лимит проектов - %{limit} проектов! ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ админиÑтратором, чтобы увеличить его"
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44876,6 +45574,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr "назначить ÑебÑ"
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr "под угрозой"
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr "невозможно включить, еÑли вÑе домены не
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr "Ð’Ñе проекты"
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr "закрыто"
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr "закрытое обÑуждение"
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr "поле container_name не может быть больше, чем %{max_length} Ñимволов"
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr ""
msgid "deleted"
msgstr "удалено"
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr "развернуть"
@@ -45589,6 +46305,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "Ð´Ð»Ñ %{link_to_merge_request} из %{link_to_merge_request_source_branch}"
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr "группы"
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45965,6 +46697,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr "Пароль Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвителен."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Одобрить"
@@ -46072,6 +46810,9 @@ msgstr[3] "Упоминает обÑуждениÑ"
msgid "mrWidget|Merge"
msgstr "Слить"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr "%{item}, и %{lastItem}"
msgid "on track"
msgstr "по плану"
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] "владельцы"
msgstr[2] "владельцы"
msgstr[3] "владельцы"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "пароль"
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr "pod_name может Ñодержать только латинÑкие буквы в нижнем региÑтре, цифры, знаки '-' и '.', а также должен начинатьÑÑ Ð¸ заканчиватьÑÑ Ð±ÑƒÐºÐ²Ð¾Ð¹ или цифрой."
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "pod_name не может быть больше, чем %{max_length} Ñимволов"
-
msgid "point"
msgid_plural "points"
msgstr[0] "бал"
@@ -46569,6 +47316,9 @@ msgstr "ÐеизвеÑтнаÑ"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46792,6 +47542,12 @@ msgstr "Ñ Ð¾ÑтавшимÑÑ Ð¸Ñтечением, неизменным на
msgid "yaml invalid"
msgstr "неверный YAML"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr "ваши наÑтройки"
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index 8f68f70d61e..ed815ec5ebd 100644
--- a/locale/si_LK/gitlab.po
+++ b/locale/si_LK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: si-LK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:14\n"
msgid " %{start} to %{end}"
msgstr " %{start} සිට %{end}"
@@ -29,10 +29,10 @@ msgid " Please sign in."
msgstr " කරුණà·à¶šà¶» ඇතුළු වන්න."
msgid " Try to %{action} this file again."
-msgstr ""
+msgstr " ගොනුව යළි %{action} බලන්න."
msgid " You need to do this before %{grace_period_deadline}."
-msgstr ""
+msgstr " %{grace_period_deadline} ට පෙර ඔබ මෙය කළ යුතුය."
msgid " and "
msgstr " සහ "
@@ -47,7 +47,7 @@ msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr ""
msgid " or %{emphasisStart}#id%{emphasisEnd}"
-msgstr ""
+msgstr " à·„à· %{emphasisStart}#à·„à·à¶³à·”.%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr ""
@@ -62,36 +62,36 @@ msgid " reacted with :%{name}:"
msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
-msgstr ""
+msgstr "\"%{ref}\" හි “%{path}\" නොපවතී"
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
msgstr ""
msgid "#%{issueIid} (closed)"
-msgstr ""
+msgstr "#%{issueIid} (වස෠ඇත)"
msgid "#general, #development"
-msgstr ""
+msgstr "#à·ƒà·à¶¸à·à¶±à·Šâ€à¶º, #සංවර්ධනය"
msgid "%d Alert"
msgid_plural "%d Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ඇඟවීම් %d"
+msgstr[1] "ඇඟවීම් %d"
msgid "%d Alert:"
msgid_plural "%d Alerts:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ඇඟවීම් %d:"
+msgstr[1] "ඇඟවීම් %d:"
msgid "%d Approval"
msgid_plural "%d Approvals"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අනුමà·à¶­à·’ %d"
+msgstr[1] "අනුමà·à¶­à·’ %d"
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ඒකක %d"
+msgstr[1] "ඒකක %d"
msgid "%d Other"
msgid_plural "%d Others"
@@ -105,18 +105,18 @@ msgstr[1] "ඇසුරුම් %d"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "පරිලà·à¶šà·’ත ඒ.à·ƒ.නි. %d"
+msgstr[1] "පරිලà·à¶šà·’ත ඒ.à·ƒ.නි. %d"
msgid "%d URL scanned"
msgid_plural "%d URLs scanned"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ඒ.à·ƒ.නි. %dක් පරිලà·à¶šà·’තයි"
+msgstr[1] "ඒ.à·ƒ.නි. %dක් පරිලà·à¶šà·’තයි"
msgid "%d additional approver"
msgid_plural "%d additional approvers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අතිරේක අනුමතකරුවන් %d"
+msgstr[1] "අතිරේක අනුමතකරුවන් %d"
msgid "%d additional assignee"
msgid_plural "%d additional assignees"
@@ -135,13 +135,13 @@ msgstr[1] ""
msgid "%d approver"
msgid_plural "%d approvers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අනුමතකරුවන් %d"
+msgstr[1] "අනුමතකරුවන් %d"
msgid "%d approver (you've approved)"
msgid_plural "%d approvers (you've approved)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අනුමතකරුවන් %d (ඔබ අනුමත කළà·)"
+msgstr[1] "අනුමතකරුවන් %d (ඔබ අනුමත කළà·)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
@@ -155,8 +155,8 @@ msgstr[1] "වෙනස්කළ ගොනු %d"
msgid "%d character remaining"
msgid_plural "%d characters remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අකුරු %d ක් ඉතිරිය"
+msgstr[1] "අකුරු %d ක් ඉතිරිය"
msgid "%d child epic"
msgid_plural "%d child epics"
@@ -180,8 +180,8 @@ msgstr[1] ""
msgid "%d commenter"
msgid_plural "%d commenters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අදහස්කරුවන් %d"
+msgstr[1] "අදහස්කරුවන් %d"
msgid "%d commit"
msgid_plural "%d commits"
@@ -210,8 +210,8 @@ msgstr[1] ""
msgid "%d contribution"
msgid_plural "%d contributions"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "දà·à¶ºà¶šà¶­à·Šà·€ %d"
+msgstr[1] "දà·à¶ºà¶šà¶­à·Šà·€ %d"
msgid "%d day"
msgid_plural "%d days"
@@ -230,8 +230,8 @@ msgstr[1] "දà·à·‚ %d"
msgid "%d exporter"
msgid_plural "%d exporters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "නිර්යà·à¶­à¶šà¶»à·”වන් %d"
+msgstr[1] "නිර්යà·à¶­à¶šà¶»à·”වන් %d"
msgid "%d failed"
msgid_plural "%d failed"
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "ස්ථර %d"
@@ -295,8 +300,8 @@ msgstr[1] "ස්ථර %d"
msgid "%d merge request"
msgid_plural "%d merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "සංයුක්ත ඉල්ලීම් %d"
+msgstr[1] "සංයුක්ත ඉල්ලීම් %d"
msgid "%d merge request that you don't have access to."
msgid_plural "%d merge requests that you don't have access to."
@@ -355,24 +360,34 @@ msgstr[1] "ව්â€à¶ºà·à¶´à·˜à¶­à·’ %d"
msgid "%d project selected"
msgid_plural "%d projects selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "තේරූ ව්â€à¶ºà·à¶´à·˜à¶­à·’ %d යි"
+msgstr[1] "තේරූ ව්â€à¶ºà·à¶´à·˜à¶­à·’ %d යි"
msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] "පිළිතුරු %d"
+msgstr[1] "පිළිතුරු %d"
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "තත්පර %d"
msgstr[1] "තත්පර %d"
-msgid "%d star"
-msgid_plural "%d stars"
+msgid "%d stage"
+msgid_plural "%d stages"
msgstr[0] ""
msgstr[1] ""
+msgid "%d star"
+msgid_plural "%d stars"
+msgstr[0] "තරු %d"
+msgstr[1] "තරු %d"
+
msgid "%d tag"
msgid_plural "%d tags"
msgstr[0] "අනන්â€à¶ºà¶± %d"
@@ -425,8 +440,8 @@ msgstr[1] ""
msgid "%d warning found:"
msgid_plural "%d warnings found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අවවà·à¶¯ %dක් හමුවිය:"
+msgstr[1] "අවවà·à¶¯ %dක් හමුවිය:"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -461,7 +476,7 @@ msgid "%{author} requested to merge %{source_branch} %{copy_button} into %{targe
msgstr ""
msgid "%{board_target} not found"
-msgstr ""
+msgstr "%{board_target} හමු නොවිණි"
msgid "%{bold_start}%{count}%{bold_end} issue"
msgid_plural "%{bold_start}%{count}%{bold_end} issues"
@@ -470,13 +485,13 @@ msgstr[1] ""
msgid "%{bold_start}%{count}%{bold_end} member"
msgid_plural "%{bold_start}%{count}%{bold_end} members"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "à·ƒà·à¶¸à·à¶¢à·’කයින් %{bold_start}%{count}%{bold_end}"
+msgstr[1] "à·ƒà·à¶¸à·à¶¢à·’කයින් %{bold_start}%{count}%{bold_end}"
msgid "%{bold_start}%{count}%{bold_end} opened merge request"
msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "විවෘත සංයුක්ත ඉල්ලීම් %{bold_start}%{count}%{bold_end}"
+msgstr[1] "විවෘත සංයුක්ත ඉල්ලීම් %{bold_start}%{count}%{bold_end}"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -518,11 +533,11 @@ msgstr ""
msgid "%{count} approval required from %{name}"
msgid_plural "%{count} approvals required from %{name}"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{name} වෙතින් අනුමà·à¶­à·’ %{count}ක් ඇවà·à·ƒà·’ය"
+msgstr[1] "%{name} වෙතින් අනුමà·à¶­à·’ %{count}ක් ඇවà·à·ƒà·’ය"
msgid "%{count} approvals from %{name}"
-msgstr ""
+msgstr "%{name} වෙතින් අනුමà·à¶­à·’ %{count}"
msgid "%{count} contact"
msgid_plural "%{count} contacts"
@@ -530,15 +545,15 @@ msgstr[0] "සබඳත෠%{count}"
msgstr[1] "සබඳත෠%{count}"
msgid "%{count} files touched"
-msgstr ""
+msgstr "ගොනු %{count}ක් ස්පර්à·à¶ºà·’"
msgid "%{count} item"
msgid_plural "%{count} items"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අථක %{count}"
+msgstr[1] "අථක %{count}"
msgid "%{count} items per page"
-msgstr ""
+msgstr "පිටුවකට අංග %{count}"
msgid "%{count} more"
msgstr "තවත් %{count}"
@@ -555,18 +570,18 @@ msgid "%{count} of %{required} approvals from %{name}"
msgstr ""
msgid "%{count} of %{total}"
-msgstr ""
+msgstr "%{count} / %{total}"
msgid "%{count} participant"
msgid_plural "%{count} participants"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "සහභà·à¶œà·“න් %{count}"
+msgstr[1] "සහභà·à¶œà·“න් %{count}"
msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr ""
msgid "%{count} selected"
-msgstr ""
+msgstr "තේරීම් %{count} කි"
msgid "%{count} total weight"
msgstr ""
@@ -575,7 +590,7 @@ msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} Hi
msgstr ""
msgid "%{dashboard_path} could not be found."
-msgstr ""
+msgstr "%{dashboard_path} සොය෠ගà·à¶±à·“මට නොහà·à¶šà·’යි."
msgid "%{days} days until tags are automatically removed"
msgstr ""
@@ -596,28 +611,28 @@ msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
msgstr ""
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
-msgstr ""
+msgstr "%{docs_link_start}විà·à·à¶½ ගොනු ආචයනය යනු කුමක්ද?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
-msgstr ""
+msgstr "%{docs_link_start}ද්වි à·ƒà·à¶°à¶š සත්â€à¶ºà·à¶´à¶±à¶º යනු කුමක්ද?%{docs_link_end}"
msgid "%{due_date} (Past due)"
msgstr ""
msgid "%{duration}ms"
-msgstr ""
+msgstr "මිලි ත. %{duration}"
msgid "%{edit_in_new_fork_notice} Try to cherry-pick this commit again."
msgstr ""
msgid "%{edit_in_new_fork_notice} Try to create a new directory again."
-msgstr ""
+msgstr "%{edit_in_new_fork_notice} යළි නව නà·à¶¸à·à·€à¶½à·’යක් සෑදීමට බලන්න."
msgid "%{edit_in_new_fork_notice} Try to revert this commit again."
msgstr ""
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
-msgstr ""
+msgstr "%{edit_in_new_fork_notice} යළි ගොනුවක් උඩුගත කිරීමට බලන්න."
msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@සමà·à¶œà¶¸.ලංකà·"
@@ -629,13 +644,13 @@ msgid "%{extra} more downstream pipelines"
msgstr ""
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} මà·à¶šà·’ණි"
msgid "%{firstLabel} +%{labelCount} more"
-msgstr ""
+msgstr "%{firstLabel} තවත් +%{labelCount}"
msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
-msgstr ""
+msgstr "%{firstMilestoneName} + තවත් %{numberOfOtherMilestones}"
msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
msgstr ""
@@ -662,7 +677,7 @@ msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
msgstr ""
msgid "%{hook_type} was deleted"
-msgstr ""
+msgstr "%{hook_type} මක෠ඇත"
msgid "%{hook_type} was scheduled for deletion"
msgstr ""
@@ -680,7 +695,7 @@ msgid "%{issuable}(s) already assigned"
msgstr ""
msgid "%{issueType} actions"
-msgstr ""
+msgstr "ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œ %{issueType}"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -703,20 +718,26 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
msgid "%{labelStart}File:%{labelEnd} %{file}"
-msgstr ""
+msgstr "%{labelStart}ගොනුව:%{labelEnd} %{file}"
msgid "%{labelStart}Image:%{labelEnd} %{image}"
-msgstr ""
+msgstr "%{labelStart}රූපය:%{labelEnd} %{image}"
msgid "%{labelStart}Method:%{labelEnd} %{method}"
-msgstr ""
+msgstr "%{labelStart}ක්â€à¶»à¶¸à¶º:%{labelEnd} %{method}"
msgid "%{labelStart}Namespace:%{labelEnd} %{namespace}"
msgstr ""
@@ -731,10 +752,10 @@ msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr ""
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr ""
+msgstr "%{labelStart}මෙවලම:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}අසංà·à·à¶°à·’ත ප්â€à¶»à¶­à·’චà·à¶»à¶º:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr ""
@@ -746,7 +767,7 @@ msgid "%{lessThan} 1 hour"
msgstr ""
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
-msgstr ""
+msgstr "%{lets_encrypt_link_start}ලෙට්'ස් එන්ක්â€à¶»à·’ප්ට්%{lets_encrypt_link_end} යනු අඩවි සඳහ෠HTTPS (SSL/TLS) ක්â€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට සංඛ්â€à¶ºà·à¶‚ක සහතික නිකුත් කරන නොමිලේ, ස්වයංක්â€à¶»à·“ය සහ විවෘත සහතික අධිකà·à¶»à·’යකි (CA)."
msgid "%{level_name} is not allowed in a %{group_level_name} group."
msgstr ""
@@ -779,13 +800,13 @@ msgid "%{message}. Your attention request was removed."
msgstr ""
msgid "%{milestone} (expired)"
-msgstr ""
+msgstr "%{milestone} (ඉකුත්ය)"
msgid "%{milliseconds}ms"
-msgstr ""
+msgstr "මි.තත්.%{milliseconds}"
msgid "%{minutesUsed} minutes"
-msgstr ""
+msgstr "විනà·à¶©à·’ %{minutesUsed}"
msgid "%{model_name} not found"
msgstr "%{model_name} හමු නොවිණි"
@@ -806,7 +827,7 @@ msgid "%{name} contained %{resultsString}"
msgstr ""
msgid "%{name} found %{resultsString}"
-msgstr ""
+msgstr "%{name} හමුවිය %{resultsString}"
msgid "%{name} is already being used for another emoji"
msgstr ""
@@ -818,7 +839,7 @@ msgid "%{name} is scheduled for %{action}"
msgstr ""
msgid "%{name}'s avatar"
-msgstr ""
+msgstr "%{name}ගේ ප්â€à¶»à¶­à·’රුව"
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 ""
@@ -830,7 +851,7 @@ msgid "%{name}, confirm your email address now!"
msgstr ""
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name}: %{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -856,7 +877,7 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr ""
msgid "%{percentageUsed}%% used"
-msgstr ""
+msgstr "භà·à·€à·’තය %{percentageUsed}%%"
msgid "%{percentage}%% issues closed"
msgstr ""
@@ -880,7 +901,7 @@ msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})
msgstr ""
msgid "%{project_name}"
-msgstr ""
+msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
@@ -894,7 +915,7 @@ msgstr[0] "නිකුතු %{releases}"
msgstr[1] "නිකුතු %{releases}"
msgid "%{remaining_approvals} left"
-msgstr ""
+msgstr "%{remaining_approvals} ඉතිරිය"
msgid "%{reportType} %{status}"
msgstr "%{reportType} %{status}"
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search} %{description} %{scope}"
-
msgid "%{seconds}s"
msgstr "තත්.%{seconds}"
@@ -982,8 +1000,8 @@ msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "à·à·à¶›à· %{strong_start}%{branch_count}%{strong_end}"
+msgstr[1] "à·à·à¶›à· %{strong_start}%{branch_count}%{strong_end}"
msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,11 +1066,14 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
msgid "%{title} changes"
-msgstr ""
+msgstr "%{title} වෙනස්කම්"
msgid "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} free)"
msgstr "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} නොමිලේ)"
@@ -1061,7 +1085,7 @@ msgid "%{totalWeight} total weight"
msgstr ""
msgid "%{total_warnings} warning(s) found:"
-msgstr ""
+msgstr "අවවà·à¶¯ %{total_warnings}ක් හමුවිය:"
msgid "%{total} remaining issue weight"
msgstr ""
@@ -1076,7 +1100,7 @@ msgid "%{userName} (cannot merge)"
msgstr "%{userName} (සංයුක්ත කළ නොහà·à¶šà·’ය)"
msgid "%{userName}'s avatar"
-msgstr ""
+msgstr "%{userName}ගේ ප්â€à¶»à¶­à·’රුව"
msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedule} in %{project}. "
msgstr ""
@@ -1097,7 +1121,7 @@ msgid "%{username} has asked for a GitLab account on your instance %{host}:"
msgstr ""
msgid "%{username}'s avatar"
-msgstr ""
+msgstr "%{username}ගේ ප්â€à¶»à¶­à·’රුව"
msgid "%{user} created a merge request: %{mr_link}"
msgstr ""
@@ -1177,7 +1201,7 @@ msgid "(%{value}) has already been taken"
msgstr "(%{value}) දà·à¶±à¶§à¶¸à¶­à·Š ගෙන ඇත"
msgid "(+%{count}&nbsp;rules)"
-msgstr ""
+msgstr "(නීති&nbsp;+%{count})"
msgid "(Group Managed Account)"
msgstr ""
@@ -1192,7 +1216,7 @@ msgid "(check progress)"
msgstr ""
msgid "(deleted)"
-msgstr ""
+msgstr "(මක෠ඇත)"
msgid "(expired)"
msgstr "(කල් ඉකුත්ය)"
@@ -1207,7 +1231,7 @@ msgid "(optional)"
msgstr "(වෛකල්පිතයි)"
msgid "(removed)"
-msgstr ""
+msgstr "(ඉවතල෠ඇත)"
msgid "(revoked)"
msgstr ""
@@ -1230,16 +1254,16 @@ msgid "*Required"
msgstr "*ඇවà·à·ƒà·’ය"
msgid "+ %{amount} more"
-msgstr ""
+msgstr "තවත් + %{amount}"
msgid "+ %{count} more"
-msgstr ""
+msgstr "තවත් + %{count}"
msgid "+ %{moreCount} more"
-msgstr ""
+msgstr "තවත් + %{moreCount}"
msgid "+ %{numberOfHiddenAssignees} more"
-msgstr ""
+msgstr "තවත් + %{numberOfHiddenAssignees}"
msgid "+%d more"
msgid_plural "+%d more"
@@ -1253,16 +1277,16 @@ msgid "+%{more_assignees_count} more assignees"
msgstr ""
msgid "+%{more_reviewers_count}"
-msgstr ""
+msgstr "+%{more_reviewers_count}"
msgid "+%{more_reviewers_count} more reviewers"
msgstr ""
msgid "+%{tags} more"
-msgstr ""
+msgstr "තවත් +%{tags}"
msgid ", "
-msgstr ""
+msgstr ", "
msgid ", or "
msgstr ", à·„à· "
@@ -1284,8 +1308,8 @@ msgstr ""
msgid "- Event"
msgid_plural "- Events"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "- සිදුවීම"
+msgstr[1] "- සිදුවීම්"
msgid "- Go to the Activity page for %{project_name}."
msgstr ""
@@ -1300,7 +1324,7 @@ msgid "- Push code to the repository."
msgstr ""
msgid "- Select -"
-msgstr ""
+msgstr "- තà·à¶»à¶±à·Šà¶± -"
msgid "- User"
msgid_plural "- Users"
@@ -1326,11 +1350,16 @@ msgid "/"
msgstr "/"
msgid "/day"
-msgstr ""
+msgstr "/දවස"
msgid "0 bytes"
msgstr "බයිට 0"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "දවස් 1"
@@ -1348,8 +1377,8 @@ msgstr[1] ""
msgid "1 closed merge request"
msgid_plural "%{merge_requests} closed merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "à·€à·à·ƒà·– සංයුක්ත ඉල්ලීම් 1කි"
+msgstr[1] "à·€à·à·ƒà·– සංයුක්ත ඉල්ලීම් %{merge_requests}කි"
msgid "1 day"
msgid_plural "%d days"
@@ -1358,13 +1387,13 @@ msgstr[1] "දවස් %d"
msgid "1 day remaining"
msgid_plural "%d days remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "දවසක් තිබේ"
+msgstr[1] "දවස් %d ක් තිබේ"
msgid "1 day selected"
msgid_plural "%d days selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "තේරූ දවස් 1 කි"
+msgstr[1] "තේරූ දවස් %d කි"
msgid "1 deploy key"
msgid_plural "%d deploy keys"
@@ -1393,13 +1422,13 @@ msgstr[1] ""
msgid "1 merge request selected"
msgid_plural "%d merge requests selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "තේරූ සංයුක්ත ඉල්ලීම් 1 කි"
+msgstr[1] "තේරූ සංයුක්ත ඉල්ලීම් %d කි"
msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 ක් සංයුක්ත කෙරිණි"
+msgstr[1] "%{merge_requests} ක් සංයුක්ත කෙරිණි"
msgid "1 minute"
msgid_plural "%d minutes"
@@ -1408,8 +1437,8 @@ msgstr[1] "විනà·à¶©à·’ %d"
msgid "1 month remaining"
msgid_plural "%d months remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "මà·à·ƒà¶ºà¶šà·Š තිබේ"
+msgstr[1] "මà·à·ƒ %d ක් තිබේ"
msgid "1 open issue"
msgid_plural "%{issues} open issues"
@@ -1418,8 +1447,8 @@ msgstr[1] ""
msgid "1 open merge request"
msgid_plural "%{merge_requests} open merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "විවෘත සංයුක්ත ඉල්ලීම් 1කි"
+msgstr[1] "විවෘත සංයුක්ත ඉල්ලීම් %{merge_requests}කි"
msgid "1 pipeline"
msgid_plural "%d pipelines"
@@ -1438,34 +1467,34 @@ msgstr[1] "පරිà·à·“ලකයින් %{num}"
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "සතියක් තිබේ"
+msgstr[1] "සති %d ක් තිබේ"
msgid "1 year remaining"
msgid_plural "%d years remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අවුරුදු 1 ක් තිබේ"
+msgstr[1] "අවුරුදු %d ක් තිබේ"
msgid "1-9 contributions"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶­à·Šà·€ 1-9"
msgid "10-19 contributions"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶­à·Šà·€ 10-19"
msgid "1000+"
msgstr "1000+"
msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
-msgstr ""
+msgstr "192.168.0.0/24 à·„à· 2001:0DB8:1234::/48"
msgid "1st contribution!"
-msgstr ""
+msgstr "පළමු දà·à¶ºà¶šà¶­à·Šà·€à¶º!"
msgid "20-29 contributions"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶­à·Šà·€ 20-29"
msgid "2FA"
-msgstr ""
+msgstr "2FA"
msgid "2FADevice|Registered On"
msgstr ""
@@ -1483,7 +1512,7 @@ msgid "30 minutes"
msgstr "විනà·à¶©à·’ 30"
msgid "30+ contributions"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶­à·Šà·€ 30+"
msgid "403|Please contact your GitLab administrator to get permission."
msgstr ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1555,13 +1587,13 @@ msgid "A default branch cannot be chosen for an empty project."
msgstr ""
msgid "A deleted user"
-msgstr ""
+msgstr "මකà·à¶¯à·à¶¸à·– පරිà·à·“ලකයෙකි"
msgid "A different reason"
msgstr "වෙනස් හේතුවක්"
msgid "A file has been changed."
-msgstr ""
+msgstr "ගොනුවක් වෙනස් වී ඇත."
msgid "A file was not found."
msgstr "ගොනුවක් හමු නොවිණි."
@@ -1570,10 +1602,10 @@ msgid "A file with '%{file_name}' already exists in %{branch} branch"
msgstr "'%{file_name}' සහිත ගොනුවක් දà·à¶±à¶§à¶¸à¶­à·Š %{branch} à·à·à¶›à·à·€ තුළ පවතී"
msgid "A file with this name already exists."
-msgstr ""
+msgstr "මෙම නම සහිත ගොනුවක් පවතී."
msgid "A group is a collection of several projects"
-msgstr ""
+msgstr "සමූහයක් යනු ව්â€à¶ºà·à¶´à·˜à¶­à·’ කිහිපයක එකතුවකි"
msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
msgstr ""
@@ -1615,7 +1647,7 @@ msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
msgid "A page with that title already exists"
-msgstr ""
+msgstr "මෙම සිරà·à·ƒà·’ය සහිත පිටුවක් පවතී"
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
@@ -1693,10 +1725,10 @@ msgid "APIFuzzing|Base URL of API testing target. For example, http://www.exampl
msgstr ""
msgid "APIFuzzing|Choose a method"
-msgstr ""
+msgstr "ක්â€à¶»à¶¸à¶ºà¶šà·Š තà·à¶»à¶±à·Šà¶±"
msgid "APIFuzzing|Choose a profile"
-msgstr ""
+msgstr "පà·à¶­à·’කඩක් තà·à¶»à¶±à·Šà¶±"
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -1735,16 +1767,16 @@ msgid "APIFuzzing|Predefined profiles"
msgstr ""
msgid "APIFuzzing|Scan mode"
-msgstr ""
+msgstr "සුපිරික්සන ආකà·à¶»à¶º"
msgid "APIFuzzing|Scan profile"
-msgstr ""
+msgstr "පà·à¶­à·’කඩ සුපිරික්සන්න"
msgid "APIFuzzing|Show code snippet for the profile"
msgstr ""
msgid "APIFuzzing|Target URL"
-msgstr ""
+msgstr "ඉලක්ක ඒ.ස.නි."
msgid "APIFuzzing|There are three ways to perform scans."
msgstr ""
@@ -1771,31 +1803,31 @@ msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
msgstr ""
msgid "APIFuzzing|folder/example.postman_collection.json"
-msgstr ""
+msgstr "බහà·à¶½à·”ම/example.postman_collection.json"
msgid "APIFuzzing|folder/example_fuzz.har"
-msgstr ""
+msgstr "බහà·à¶½à·”ම/example_fuzz.har"
msgid "APIFuzzing|folder/openapi.json"
-msgstr ""
+msgstr "බහà·à¶½à·”ම/openapi.Json"
msgid "AWS Access Key"
msgstr "AWS ප්â€à¶»à·€à·šà· යතුර"
msgid "AWS Secret Access Key"
-msgstr ""
+msgstr "AWS රහස් ප්â€à¶»à·€à·šà· යතුර"
msgid "AWS access key ID (Optional)"
-msgstr ""
+msgstr "AWS ප්â€à¶»à·€à·šà· යතුරු à·„à·à¶³à·”. (විකල්ප)"
msgid "AWS secret access key (Optional)"
-msgstr ""
+msgstr "AWS රහස් ප්â€à¶»à·€à·šà· යතුර (විකල්ප)"
msgid "AWS service error: %{error}"
-msgstr ""
+msgstr "AWS සේව෠දà·à·‚ය: %{error}"
msgid "Abort"
-msgstr ""
+msgstr "අත්හරින්න"
msgid "About GitLab"
msgstr "ගිට්ලà·à¶¶à·Š ගà·à¶±"
@@ -1807,7 +1839,7 @@ msgid "About this feature"
msgstr "මෙම විà·à·šà·‚à·à¶‚ගය ගà·à¶±"
msgid "About your company"
-msgstr ""
+msgstr "ඔබගේ සමà·à¶œà¶¸ ගà·à¶±"
msgid "Abuse Reports"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1837,10 +1872,10 @@ msgid "Access denied for your LDAP account."
msgstr ""
msgid "Access denied: %{error}"
-msgstr ""
+msgstr "ප්â€à¶»à·€à·šà·à¶º ප්â€à¶»à¶­à·’ක්â€à·‚ේපිතයි: %{error}"
msgid "Access expires"
-msgstr ""
+msgstr "ප්â€à¶»à·€à·šà·à¶º ඉකුත්වීම"
msgid "Access forbidden. Check your access level."
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr "නව"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "ගිණුම"
@@ -2002,16 +2043,16 @@ msgid "Activated on"
msgstr ""
msgid "Active"
-msgstr ""
+msgstr "සක්â€à¶»à·’යයි"
msgid "Active %{accessTokenTypePlural} (%{totalAccessTokens})"
msgstr ""
msgid "Active %{type} (%{token_length})"
-msgstr ""
+msgstr "සක්â€à¶»à·’ය %{type} (%{token_length})"
msgid "Active Sessions"
-msgstr ""
+msgstr "සක්â€à¶»à·’ය à·€à·à¶»"
msgid "Active chat names (%{count})"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2047,32 +2085,29 @@ msgid "Add LICENSE"
msgstr "බලපත්â€à¶»à¶ºà¶šà·Š එකතු කරන්න"
msgid "Add License"
-msgstr ""
+msgstr "බලපත්â€à¶»à¶ºà¶šà·Š යොදන්න"
msgid "Add New Site"
-msgstr ""
+msgstr "නව අඩවියක් යොදන්න"
msgid "Add README"
msgstr ""
msgid "Add Zoom meeting"
-msgstr ""
+msgstr "සූම් රà·à·ƒà·Šà·€à·“මක් යොදන්න"
msgid "Add a %{type}"
msgstr "%{type} ක් එකතු කරන්න"
msgid "Add a GCP region"
-msgstr ""
+msgstr "GCP කලà·à¶´à¶ºà¶šà·Š යොදන්න"
msgid "Add a GPG key"
-msgstr ""
+msgstr "GPG යතුරක් යොදන්න"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2131,7 +2163,7 @@ msgid "Add a to do"
msgstr ""
msgid "Add an SSH key"
-msgstr ""
+msgstr "SSH යතුරක් යොදන්න"
msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
@@ -2143,7 +2175,7 @@ msgid "Add an impersonation token"
msgstr ""
msgid "Add another link"
-msgstr ""
+msgstr "තව සබà·à¶³à·’යක් යොදන්න"
msgid "Add approval rule"
msgstr ""
@@ -2155,7 +2187,7 @@ msgid "Add attention request"
msgstr ""
msgid "Add broadcast message"
-msgstr ""
+msgstr "විකà·à·à¶± පණිවිඩයක් යොදන්න"
msgid "Add child epic to an epic"
msgstr ""
@@ -2167,7 +2199,7 @@ msgid "Add comment to design"
msgstr ""
msgid "Add comment..."
-msgstr ""
+msgstr "අදහසක් යොදන්න..."
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2194,7 +2226,7 @@ msgid "Add email participant(s)"
msgstr ""
msgid "Add environment"
-msgstr ""
+msgstr "පරිසරයක් යොදන්න"
msgid "Add existing confidential %{issuableType}"
msgstr ""
@@ -2206,25 +2238,25 @@ msgid "Add image comment"
msgstr ""
msgid "Add internal note"
-msgstr ""
+msgstr "අභ්â€à¶ºà¶±à·Šà¶­à¶» සටහන යොදන්න"
msgid "Add key"
-msgstr ""
+msgstr "යතුර යොදන්න"
msgid "Add label(s)"
-msgstr ""
+msgstr "නම්පත් යොදන්න"
msgid "Add list"
-msgstr ""
+msgstr "ලේඛනය යොදන්න"
msgid "Add new application"
-msgstr ""
+msgstr "නව යෙදුමක් එක් කරන්න"
msgid "Add new directory"
-msgstr ""
+msgstr "නව නà·à¶¸à·à·€à¶½à·’ය යොදන්න"
msgid "Add or remove a user."
-msgstr ""
+msgstr "පුද්ගලයෙක් එක්/ඉවත් කරන්න."
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2233,7 +2265,7 @@ msgid "Add or subtract spent time"
msgstr ""
msgid "Add people"
-msgstr ""
+msgstr "මිනිසුන් එක්කරන්න"
msgid "Add previously merged commits"
msgstr ""
@@ -2245,10 +2277,10 @@ msgid "Add projects"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ එකතු කරන්න"
msgid "Add reaction"
-msgstr ""
+msgstr "ප්â€à¶»à¶­à·’ක්â€à¶»à·’යà·à·€ එක්කරන්න"
msgid "Add request manually"
-msgstr ""
+msgstr "ඉල්ලීම අතින් යොදන්න"
msgid "Add suggestion to batch"
msgstr ""
@@ -2308,25 +2340,25 @@ msgid "AddContextCommits|Add previously merged commits"
msgstr ""
msgid "AddContextCommits|Add/remove"
-msgstr ""
+msgstr "එකතු/ඉවතට"
msgid "AddMember|Invite email is invalid"
-msgstr ""
+msgstr "ආරà·à¶°à¶±à· තà·à¶´à·‘ල වලංගු නොවේ"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
msgid "AddMember|Invites cannot be blank"
-msgstr ""
+msgstr "ඇරයුම් හිස්විය නොහà·à¶šà·’ය"
msgid "AddMember|No invite source provided."
msgstr ""
msgid "AddMember|No users specified."
-msgstr ""
+msgstr "පුද්ගලයින් දක්ව෠නà·à¶­."
msgid "AddMember|Too many users specified (limit is %{user_limit})"
-msgstr ""
+msgstr "පුද්ගලයින් බොහොමයක් දක්ව෠ඇත (සීමà·à·€ %{user_limit})"
msgid "Added"
msgstr "එකතු කෙරිණි"
@@ -2344,17 +2376,14 @@ msgid "Added an issue to an epic."
msgstr ""
msgid "Added for this merge request"
-msgstr ""
+msgstr "මෙම සංයුක්ත ඉල්ලීමෙහි ඇත"
msgid "Added in this version"
-msgstr ""
+msgstr "මෙම අනුවà·à¶¯à¶ºà·™à·„à·’ ඇත"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr "අතිරේක පà·à¶»-දත්ත"
-
msgid "Additional minutes"
msgstr "අතිරේක විනà·à¶©à·’"
@@ -2362,7 +2391,7 @@ msgid "Additional minutes:"
msgstr "අතිරේක විනà·à¶©à·’:"
msgid "Additional text"
-msgstr ""
+msgstr "අතිරේක පෙළ"
msgid "Additional text for the sign-in and Help page."
msgstr ""
@@ -2410,10 +2439,10 @@ msgid "Admin"
msgstr "පරිපà·à¶½à¶š"
msgid "Admin Area"
-msgstr ""
+msgstr "පරිපà·à¶½à¶± පෙදෙස"
msgid "Admin Mode"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š ආකà·à¶»à¶º"
msgid "Admin Note"
msgstr "පරිපà·à¶½à¶šà¶œà·š සටහන"
@@ -2425,19 +2454,19 @@ msgid "Admin Overview"
msgstr "පරිපà·à¶½à¶š දළ විà·à·Šà¶½à·šà·‚ණය"
msgid "Admin Section"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š අංà·à¶º"
msgid "Admin mode already enabled"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š ආකà·à¶»à¶º දà·à¶±à¶§à¶¸à¶­à·Š සබලයි"
msgid "Admin mode disabled"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š ආකà·à¶»à¶º අබලයි"
msgid "Admin mode enabled"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š ආකà·à¶»à¶º සබලයි"
msgid "Admin navigation"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š යà·à¶­à·Šâ€à¶»à¶«à¶º"
msgid "Admin notes"
msgstr "පරිපà·à¶½à¶šà¶œà·š සටහන්"
@@ -2446,7 +2475,7 @@ msgid "AdminArea|%{billable_users_link_start}Learn more%{billable_users_link_end
msgstr ""
msgid "AdminArea|Active users"
-msgstr ""
+msgstr "සක්â€à¶»à·’ය පරිà·à·“ලකයින්"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
@@ -2485,13 +2514,13 @@ msgid "AdminArea|Instance OAuth applications"
msgstr ""
msgid "AdminArea|Latest groups"
-msgstr ""
+msgstr "අවසà·à¶± සමූහ"
msgid "AdminArea|Latest projects"
-msgstr ""
+msgstr "නවතම ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "AdminArea|Latest users"
-msgstr ""
+msgstr "අවසà·à¶± පුද්ගලයින්"
msgid "AdminArea|Maintainer"
msgstr "නඩත්තුකරු"
@@ -2500,7 +2529,7 @@ msgid "AdminArea|Manage applications for your instance that can use GitLab as an
msgstr ""
msgid "AdminArea|Minimal access"
-msgstr ""
+msgstr "අවම ප්â€à¶»à·€à·šà·à¶º"
msgid "AdminArea|New group"
msgstr "නව සමූහය"
@@ -2512,7 +2541,7 @@ msgid "AdminArea|New user"
msgstr "නව පරිà·à·“ලක"
msgid "AdminArea|No applications found"
-msgstr ""
+msgstr "යෙදුම් හමු නොවිණි"
msgid "AdminArea|Owner"
msgstr "හිමිකරු"
@@ -2524,10 +2553,10 @@ msgid "AdminArea|Reporter"
msgstr "à·€à·à¶»à·Šà¶­à·à¶šà¶»à·”"
msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
-msgstr ""
+msgstr "ආරක්â€à·‚ණ යà·à·€à¶­à·Šà¶šà·à¶½ ගà·à¶± දà·à¶±à·”ම්දීම් ලබ෠ගà·à¶±à·“මට ගිට්ලà·à¶¶à·Š ආරක්â€à·‚ණ පුවත් පත්â€à¶»à·’කà·à·€ සඳහ෠ලියà·à¶´à¶¯à·’ංචි වන්න."
msgid "AdminArea|Sign up for the GitLab newsletter"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š පුවත් පත්â€à¶»à·’කà·à·€ සඳහ෠ලියà·à¶´à¶¯à·’ංචිය"
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2551,19 +2580,19 @@ msgid "AdminArea|Users statistics"
msgstr "පරිà·à·“ලක සංඛ්â€à¶ºà·à¶½à·šà¶›à¶±"
msgid "AdminArea|Users with highest role"
-msgstr ""
+msgstr "ඉහළම භූමිකà·à·€à¶šà·Š සහිත පුද්ගලයින්"
msgid "AdminArea|Users without a Group and Project"
-msgstr ""
+msgstr "සමූහයක් හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’යක් නà·à¶­à·’ පරිà·à·“ලකයින්"
msgid "AdminArea|View latest groups"
-msgstr ""
+msgstr "නවතම සමූහ බලන්න"
msgid "AdminArea|View latest projects"
-msgstr ""
+msgstr "නවතම ව්â€à¶ºà·à¶´à·˜à¶­à·’ බලන්න"
msgid "AdminArea|View latest users"
-msgstr ""
+msgstr "නවතම පරිà·à·“ලකයින් බලන්න"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
@@ -2584,10 +2613,10 @@ msgid "AdminProjects| You’re about to permanently delete the project %{project
msgstr ""
msgid "AdminProjects|Delete"
-msgstr ""
+msgstr "මකන්න"
msgid "AdminProjects|Delete Project %{projectName}?"
-msgstr ""
+msgstr "%{projectName} ව්â€à¶ºà·à¶´à·˜à¶­à·’ය මකන්නද?"
msgid "AdminSettings|%{strongStart}WARNING:%{strongEnd} Environment variable %{environment_variable} does not exist or is not pointing to a valid directory. %{icon_link}"
msgstr ""
@@ -2604,9 +2633,12 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
-msgid "AdminSettings|CI/CD limits"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr "CI/CD සීමà·"
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "ලෙට්'ස් එන්ක්â€à¶»à·’ප්ට් වින්â€à¶ºà·à·ƒà¶œà¶­ කරන්න"
@@ -2614,13 +2646,13 @@ msgid "AdminSettings|Configure when inactive projects should be automatically de
msgstr ""
msgid "AdminSettings|Delete inactive projects"
-msgstr ""
+msgstr "අක්â€à¶»à·’ය ව්â€à¶ºà·à¶´à·˜à¶­à·’ මකන්න"
msgid "AdminSettings|Delete inactive projects that exceed"
msgstr ""
msgid "AdminSettings|Delete project after"
-msgstr ""
+msgstr "මින්පසු ව්â€à¶ºà·à¶´à·˜à¶­à·’ය මකන්න"
msgid "AdminSettings|Disable Elasticsearch until indexing completes."
msgstr ""
@@ -2671,11 +2703,14 @@ msgid "AdminSettings|Enable smartcn custom analyzer: Search"
msgstr ""
msgid "AdminSettings|Enabled"
-msgstr ""
+msgstr "සබලයි"
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2785,7 +2820,7 @@ msgid "AdminSettings|Send email to maintainers after project is inactive for"
msgstr ""
msgid "AdminSettings|Send warning email"
-msgstr ""
+msgstr "අවවà·à¶¯ වි-තà·à¶´à·‘ල යවන්න"
msgid "AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}."
msgstr ""
@@ -2851,7 +2886,7 @@ msgid "AdminSettings|You can't delete projects before the warning email is sent.
msgstr ""
msgid "AdminStatistics|Active Users"
-msgstr ""
+msgstr "සක්â€à¶»à·’ය පුද්ගලයින්"
msgid "AdminStatistics|Forks"
msgstr ""
@@ -2896,12 +2931,12 @@ msgid "AdminUsers|(Pending approval)"
msgstr ""
msgid "AdminUsers|2FA Disabled"
-msgstr ""
+msgstr "2FA අබලයි"
msgid "AdminUsers|2FA Enabled"
-msgstr ""
+msgstr "2FA සබලයි"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,8 +2945,11 @@ msgstr "ප්â€à¶»à·€à·šà·à¶º"
msgid "AdminUsers|Access Git repositories"
msgstr "ගිට් කà·à·‚්ඨවලට ප්â€à¶»à·€à·šà·à¶º"
+msgid "AdminUsers|Access level"
+msgstr "ප්â€à¶»à·€à·šà· මට්ටම"
+
msgid "AdminUsers|Access the API"
-msgstr ""
+msgstr "යෙ.ක්â€à¶».මු. වෙත ප්â€à¶»à·€à·šà·à¶º"
msgid "AdminUsers|Activate"
msgstr ""
@@ -2929,7 +2967,7 @@ msgid "AdminUsers|Admin"
msgstr "පරිපà·à¶½à¶š"
msgid "AdminUsers|Administrator"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š"
msgid "AdminUsers|Admins"
msgstr "පරිපà·à¶½à¶šà¶ºà·’න්"
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr "ප්â€à¶»à¶­à·’රූපය"
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2974,11 +3015,14 @@ msgid "AdminUsers|Block user %{username}?"
msgstr ""
msgid "AdminUsers|Blocked"
-msgstr ""
+msgstr "අවහිරයි"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr "සමූහයක් සෑදිය à·„à·à¶šà·’ය"
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2989,7 +3033,7 @@ msgid "AdminUsers|Cohorts"
msgstr ""
msgid "AdminUsers|Confirm user"
-msgstr ""
+msgstr "පරිà·à·“ලක තහවුරුව"
msgid "AdminUsers|Confirm user %{username}?"
msgstr ""
@@ -3016,7 +3060,7 @@ msgid "AdminUsers|Delete User %{username}?"
msgstr ""
msgid "AdminUsers|Delete user"
-msgstr ""
+msgstr "පරිà·à·“ලකය෠මකන්න"
msgid "AdminUsers|Delete user and contributions"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr "ඒ ඔබයි!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr "සීමà·"
+
+msgid "AdminUsers|Linkedin"
+msgstr "ලින්ක්ඩින්"
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3106,43 +3162,49 @@ msgid "AdminUsers|Search by name, email or username"
msgstr ""
msgid "AdminUsers|Search users"
-msgstr ""
+msgstr "පරිà·à·“ලකයින් සොයන්න"
msgid "AdminUsers|Send email to users"
-msgstr ""
+msgstr "පුද්ගලයින්ට වි-තà·à¶´à·à¶½à·Š යවන්න"
+
+msgid "AdminUsers|Skype"
+msgstr "ස්කයිප්"
msgid "AdminUsers|Sort by"
+msgstr "අනුව පෙළගසන්න"
+
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
msgid "AdminUsers|The user can't log in."
-msgstr ""
+msgstr "පරිà·à·“ලකයà·à¶§ පිවිසීමට නොහà·à¶šà·’ය."
msgid "AdminUsers|The user has unlimited access to all groups, projects, users, and features."
-msgstr ""
+msgstr "පරිà·à·“ලකයà·à¶§ සියළුම සමූහ, ව්â€à¶ºà·à¶´à·˜à¶­à·’, පරිà·à·“ලකයින් සහ විà·à·šà·‚à·à¶‚ග වෙත අසීමිත ප්â€à¶»à·€à·šà·à¶ºà¶šà·Š ඇත."
msgid "AdminUsers|The user will be logged out"
-msgstr ""
+msgstr "පරිà·à·“ලකය෠නික්මෙනු ඇත"
msgid "AdminUsers|The user will not be able to access git repositories"
-msgstr ""
+msgstr "පරිà·à·“ලකයà·à¶§ ගිට් කà·à·‚්ඨ වෙත ප්â€à¶»à·€à·šà· වීමට නොහà·à¶šà·’ වේ"
msgid "AdminUsers|The user will not be able to access the API"
-msgstr ""
+msgstr "පරිà·à·“ලකයà·à¶§ යෙ.ක්â€à¶».මු. වෙත ප්â€à¶»à·€à·šà· වීමට නොහà·à¶šà·’ වේ"
msgid "AdminUsers|The user will not be able to use slash commands"
-msgstr ""
+msgstr "පරිà·à·“ලකයà·à¶§ ස්ලෑෂ් විධà·à¶± භà·à·€à·’ත෠කිරීමට නොහà·à¶šà·’ වේ"
msgid "AdminUsers|The user will not receive any notifications"
-msgstr ""
+msgstr "පරිà·à·“ලකයà·à¶§ කිසිදු දà·à¶±à·”ම්දීමක් නොලà·à¶¶à·™à¶±à·” ඇත"
msgid "AdminUsers|To confirm, type %{projectName}"
-msgstr ""
+msgstr "තහවුරු කිරීමට, %{projectName} ලියන්න"
msgid "AdminUsers|To confirm, type %{username}"
-msgstr ""
+msgstr "තහවුරු කිරීමට, %{username} ලියන්න"
msgid "AdminUsers|Unban user"
msgstr ""
@@ -3151,7 +3213,7 @@ msgid "AdminUsers|Unban user %{username}?"
msgstr ""
msgid "AdminUsers|Unblock"
-msgstr ""
+msgstr "අනවහිර"
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr "පරිà·à·“ලක පරිපà·à¶½à¶±à¶º"
-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"
msgstr ""
@@ -3172,25 +3231,28 @@ msgid "AdminUsers|User will not be able to login"
msgstr ""
msgid "AdminUsers|Users"
-msgstr ""
+msgstr "පරිà·à·“ලකයින්"
msgid "AdminUsers|Users can still be invited to your instance and/or add themselves if permitted based on your settings. They will not have access to your instance, nor count towards your subscribed seat count until you %{approve_link}."
msgstr ""
msgid "AdminUsers|Validate user account"
-msgstr ""
+msgstr "පරිà·à·“ලක ගිණුම වලංගුකරණය"
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr "අඩවියේ ඒ.ස.නි."
+
msgid "AdminUsers|What can I do?"
-msgstr ""
+msgstr "මට කුමක් කළ à·„à·à¶šà·’ද?"
msgid "AdminUsers|What does this mean?"
-msgstr ""
+msgstr "මෙයින් අදහස් වන්නේ කුමක්ද?"
msgid "AdminUsers|When banned:"
-msgstr ""
+msgstr "තහනම් කළ විට:"
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -3247,7 +3309,10 @@ msgid "AdminUsers|user cap"
msgstr ""
msgid "Administration"
-msgstr ""
+msgstr "පරිපà·à¶½à¶±à¶º"
+
+msgid "Administrators"
+msgstr "පරිපà·à¶½à¶šà¶ºà·’න්"
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 ""
@@ -3334,25 +3399,25 @@ msgid "AlertManagement|Activity feed"
msgstr ""
msgid "AlertManagement|Alert"
-msgstr ""
+msgstr "ඇඟවීම"
msgid "AlertManagement|Alert assignee(s): %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
-msgstr ""
+msgstr "ඇඟවීමේ විස්තර"
msgid "AlertManagement|Alert details"
-msgstr ""
+msgstr "ඇඟවීමේ විස්තර"
msgid "AlertManagement|Alert status: %{status}"
-msgstr ""
+msgstr "ඇඟවීමේ තත්â€à·€à¶º: %{status}"
msgid "AlertManagement|Alerts"
-msgstr ""
+msgstr "ඇඟවීම්"
msgid "AlertManagement|All alerts"
-msgstr ""
+msgstr "සියළු ඇඟවීම්"
msgid "AlertManagement|Assign status"
msgstr ""
@@ -3484,7 +3549,7 @@ msgid "AlertMappingBuilder|Payload alert key"
msgstr ""
msgid "AlertMappingBuilder|Select key"
-msgstr ""
+msgstr "යතුර තà·à¶»à¶±à·Šà¶±"
msgid "AlertMappingBuilder|Title is a required field for alerts in GitLab. Should the payload field you specified not be available, specifiy which field we should use instead. "
msgstr ""
@@ -3493,10 +3558,10 @@ msgid "AlertSettings|A webhook URL and authorization key is generated for the in
msgstr ""
msgid "AlertSettings|Add new integration"
-msgstr ""
+msgstr "නව අනුකලනයක් යොදන්න"
msgid "AlertSettings|Alert settings"
-msgstr ""
+msgstr "ඇඟවීමේ à·ƒà·à¶šà·ƒà·”ම්"
msgid "AlertSettings|Authorization key"
msgstr ""
@@ -3505,16 +3570,16 @@ msgid "AlertSettings|Configure details"
msgstr ""
msgid "AlertSettings|Current integrations"
-msgstr ""
+msgstr "වත්මන් අනුකලන"
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
-msgstr ""
+msgstr "අනුකලනය මකන්න"
msgid "AlertSettings|Edit integration"
-msgstr ""
+msgstr "අනුකලනය සංස්කරණය"
msgid "AlertSettings|Edit payload"
msgstr ""
@@ -3547,7 +3612,7 @@ msgid "AlertSettings|Integration successfully saved"
msgstr ""
msgid "AlertSettings|Name integration"
-msgstr ""
+msgstr "අනුකලනයේ නම"
msgid "AlertSettings|Parse payload fields"
msgstr ""
@@ -3556,7 +3621,7 @@ msgid "AlertSettings|Proceed with editing"
msgstr ""
msgid "AlertSettings|Prometheus"
-msgstr ""
+msgstr "ප්â€à¶»à·à¶¸à·’තියස්"
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
@@ -3580,13 +3645,13 @@ msgid "AlertSettings|Save integration & send"
msgstr ""
msgid "AlertSettings|Select integration type"
-msgstr ""
+msgstr "අනුකලන වර්ගය තà·à¶»à¶±à·Šà¶±"
msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|Send without saving"
-msgstr ""
+msgstr "සුරà·à¶šà·“මකින් තොරව යවන්න"
msgid "AlertSettings|The form has unsaved changes"
msgstr ""
@@ -3610,7 +3675,7 @@ msgid "AlertSettings|View URL and authorization key"
msgstr ""
msgid "AlertSettings|View credentials"
-msgstr ""
+msgstr "අක්තපත්â€à¶» බලන්න"
msgid "AlertSettings|Webhook URL"
msgstr ""
@@ -3622,7 +3687,7 @@ msgid "AlertSettings|{ \"events\": [{ \"application\": \"Name of application\" }
msgstr "{ \"සිදුවීම්\": [{ \"යෙදුම\": \"යෙදුමේ නම\" }] }"
msgid "Alerts"
-msgstr ""
+msgstr "ඇඟවීම්"
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr "ඇඟවීම් මෙම අනුකලනය හරහ෠සෑදෙනු ඇත"
@@ -3643,22 +3708,22 @@ msgid "AlertsIntegrations|No integrations have been added yet."
msgstr "තවම කිසිදු අනුකලනයක් එක් කර නà·à¶­."
msgid "AlertsIntegrations|The current integration could not be updated. Please try again."
-msgstr ""
+msgstr "වත්මන් අනුකලනය යà·à·€à¶­à·Šà¶šà·à¶½ කළ නොහà·à¶šà·’ය. යළි බලන්න."
msgid "AlertsIntegrations|The integration could not be added. Please try again."
-msgstr ""
+msgstr "අනුකලනය එක් කළ නොහà·à¶šà·’ විය. යළි බලන්න."
msgid "AlertsIntegrations|The integration could not be deleted. Please try again."
-msgstr ""
+msgstr "අනුකලනය මà·à¶šà·“මට නොහà·à¶šà·’ය. යළි බලන්න."
msgid "AlertsIntegrations|The integration is currently inactive. Enable the integration to send the test alert."
msgstr ""
msgid "AlertsIntegrations|The integration is deleted."
-msgstr ""
+msgstr "අනුකලනය මක෠දà·à¶¸à·’ණි."
msgid "AlertsIntegrations|The integration is saved."
-msgstr ""
+msgstr "අනුකලනය සුරà·à¶šà·’ණි."
msgid "AlertsIntegrations|The integration token could not be reset. Please try again."
msgstr ""
@@ -3670,22 +3735,22 @@ msgid "Algorithm"
msgstr ""
msgid "All"
-msgstr ""
+msgstr "සියල්ල"
msgid "All %{replicableType} are being scheduled for %{action}"
msgstr ""
msgid "All (default)"
-msgstr ""
+msgstr "සියළු (පෙරනිමි)"
msgid "All GitLab"
-msgstr ""
+msgstr "සියළු ගිට්ලà·à¶¶à·Š"
msgid "All Members"
-msgstr ""
+msgstr "සියළු à·ƒà·à¶¸à·à¶¢à·’කයින්"
msgid "All branches"
-msgstr ""
+msgstr "සියළු à·à·à¶›à·"
msgid "All changes are committed"
msgstr ""
@@ -3694,10 +3759,10 @@ msgid "All email addresses will be used to identify your commits."
msgstr ""
msgid "All environments"
-msgstr ""
+msgstr "සියළු පරිසර"
msgid "All groups and projects"
-msgstr ""
+msgstr "සියළු සමූහ හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "All issues"
msgstr ""
@@ -3712,7 +3777,7 @@ msgid "All merge conflicts were resolved. The merge request can now be merged."
msgstr ""
msgid "All merge request dependencies have been merged"
-msgstr ""
+msgstr "සියළුම සංයුක්ත ඉල්ලීම් පරà·à¶ºà¶­à·Šà¶­ ඒකà·à¶¶à¶¯à·Šà¶° කර ඇත"
msgid "All paths are relative to the GitLab URL. Do not include %{relative_url_link_start}relative URLs%{relative_url_link_end}."
msgstr ""
@@ -3721,7 +3786,7 @@ msgid "All projects"
msgstr "සියළුම ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "All projects selected"
-msgstr ""
+msgstr "සියළුම ව්â€à¶ºà·à¶´à·˜à¶­à·’ තà·à¶»à· ඇත"
msgid "All protected branches"
msgstr ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,17 +3809,11 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
-msgstr ""
+msgstr "පහත සමූහයේ à·ƒà·à¶¸à·à¶¢à·’කයින්ට ප්â€à¶»à·€à·šà·à¶ºà¶§ ඉඩදෙන්න"
msgid "Allow access to the following IP addresses"
-msgstr ""
+msgstr "පහත අ.ජà·.කෙ. ලිපින වෙත ප්â€à¶»à·€à·šà·à¶ºà¶§ ඉඩදෙන්න"
msgid "Allow commits from members who can merge to the target branch. %{link_start}About this feature.%{link_end}"
msgstr ""
@@ -3763,7 +3825,7 @@ msgid "Allow non-administrators access to the performance bar"
msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
-msgstr ""
+msgstr "ගිට් ප්â€à¶»à·€à·šà·à¶ºà¶§ තේරූ කෙටුම්පත් පමණක් භà·à·€à·’තයට ඉඩදෙන්න."
msgid "Allow owners to manage default branch protection per group."
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3817,7 +3873,10 @@ msgid "Allowed email domain restriction only permitted for top-level groups"
msgstr ""
msgid "Allowed to create:"
-msgstr ""
+msgstr "සෑදීමට ඉඩදී ඇත:"
+
+msgid "Allowed to delete projects"
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ මà·à¶šà·“මට ඉඩ දී ඇත"
msgid "Allowed to fail"
msgstr ""
@@ -3825,6 +3884,9 @@ msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3835,7 +3897,7 @@ msgid "Almost there..."
msgstr ""
msgid "Already blocked"
-msgstr ""
+msgstr "දà·à¶±à¶§à¶¸à¶­à·Š අවහිරයි"
msgid "Already have login and password?"
msgstr ""
@@ -3865,7 +3927,7 @@ msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
msgid "Amazon Web Services Logo"
-msgstr ""
+msgstr "ඇමසන් වෙබ් සර්විසස් ලà·à¶‚ඡනය"
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 ""
@@ -3895,7 +3957,7 @@ msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"
msgstr ""
msgid "An error has occurred"
-msgstr ""
+msgstr "දà·à·‚යක් සිදුවී ඇත"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4066,46 +4131,46 @@ msgid "An error occurred while getting issue counts"
msgstr ""
msgid "An error occurred while getting projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ ලබ෠ගà·à¶±à·“මේදී දà·à·‚යක් ඇති විය"
msgid "An error occurred while initializing path locks"
msgstr ""
msgid "An error occurred while loading a section of this page."
-msgstr ""
+msgstr "මෙම පිටුවේ කොටසක් පූරණය කිරීමේදී දà·à·‚යක් ඇති විය."
msgid "An error occurred while loading all the files."
-msgstr ""
+msgstr "සියළුම ගොනු පූරණය කිරීමේදී දà·à·‚යක් ඇති විය."
msgid "An error occurred while loading chart data"
-msgstr ""
+msgstr "ප්â€à¶»à·ƒà·Šà¶®à·à¶» දත්ත පූරණය කිරීමේදී දà·à·‚යක් ඇති විය"
msgid "An error occurred while loading code owners."
-msgstr ""
+msgstr "කේත හිමිකරුවන් පූරණය කිරීමේදී දà·à·‚යක් ඇති විය."
msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading designs. Please try again."
-msgstr ""
+msgstr "නිර්මà·à¶« පූරණය කිරීමේදී දà·à·‚යක් ඇති විය. පසුව බලන්න."
msgid "An error occurred while loading diff"
-msgstr ""
+msgstr "වෙනස පූරණයේදී දà·à·‚යක් ඇති විය"
msgid "An error occurred while loading filenames"
-msgstr ""
+msgstr "ගොනු නà·à¶¸ පූරණයේදී දà·à·‚යක් ඇති විය"
msgid "An error occurred while loading group members."
-msgstr ""
+msgstr "සමූහයේ à·ƒà·à¶¸à·à¶¢à·’කයින් පූරණයේදී දà·à·‚යක් සිදු විය."
msgid "An error occurred while loading issues"
msgstr ""
msgid "An error occurred while loading merge requests."
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම් පූරණය කිරීමේදී දà·à·‚යක් ඇති විය."
msgid "An error occurred while loading projects."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ පූරණය කිරීමේදී දà·à·‚යක් ඇති විය."
msgid "An error occurred while loading the Jobs tab."
msgstr ""
@@ -4123,34 +4188,34 @@ msgid "An error occurred while loading the blob controls."
msgstr ""
msgid "An error occurred while loading the data. Please try again."
-msgstr ""
+msgstr "දත්ත පූරණය කිරීමේදී දà·à·‚යක් ඇති විය. පසුව බලන්න."
msgid "An error occurred while loading the file"
-msgstr ""
+msgstr "ගොනුව පූරණය කිරීමේදී දà·à·‚යක් ඇති විය"
msgid "An error occurred while loading the file content."
-msgstr ""
+msgstr "ගොනුවේ අන්තර්ගතය පූරණයේදී දà·à·‚යකි."
msgid "An error occurred while loading the file."
-msgstr ""
+msgstr "ගොනුව පූරණයේදී දà·à·‚යකි."
msgid "An error occurred while loading the file. Please try again later."
-msgstr ""
+msgstr "ගොනුව පූරණයේදී දà·à·‚යකි. පසුව නà·à·€à¶­ උත්සà·à·„ කරන්න."
msgid "An error occurred while loading the file. Please try again."
-msgstr ""
+msgstr "ගොනුව පූරණයේදී දà·à·‚යකි. නà·à·€à¶­ උත්සà·à·„ කරන්න."
msgid "An error occurred while loading the merge request changes."
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීමෙහි වෙනස්කම් පූරණයේ දී දà·à·‚යකි."
msgid "An error occurred while loading the merge request version data."
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීමෙහි අනුවà·à¶¯ දත්ත පූරණයේ දී දà·à·‚යකි."
msgid "An error occurred while loading the merge request."
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම පූරණයේ දී දà·à·‚යකි."
msgid "An error occurred while loading the notification settings. Please try again."
-msgstr ""
+msgstr "දà·à¶±à·”ම්දීමේ à·ƒà·à¶šà·ƒà·”ම් පූරණයේ දී දà·à·‚යකි. නà·à·€à¶­ උත්සà·à·„ කරන්න."
msgid "An error occurred while loading the pipeline."
msgstr ""
@@ -4159,22 +4224,22 @@ msgid "An error occurred while loading the pipelines jobs."
msgstr ""
msgid "An error occurred while making the request."
-msgstr ""
+msgstr "ඉල්ලීම සිදු කිරීමේදී දà·à·‚යක් ඇති විය."
msgid "An error occurred while moving the issue."
msgstr ""
msgid "An error occurred while parsing recent searches"
-msgstr ""
+msgstr "මෑත සෙවුම් විග්â€à¶»à·„ කිරීමේදී දà·à·‚යක් ඇති විය"
msgid "An error occurred while parsing the file."
-msgstr ""
+msgstr "ගොනුව විග්â€à¶»à·„ කිරීමේදී දà·à·‚යක් ඇති විය."
msgid "An error occurred while pasting text in the editor. Please try again."
-msgstr ""
+msgstr "සංස්කරකයේ පෙළ ඇලවීමේදී දà·à·‚යක් ඇති විය. යළි බලන්න."
msgid "An error occurred while performing this action."
-msgstr ""
+msgstr "මෙම ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶º සිදු කිරීමේදී දà·à·‚යක් සිදු විය."
msgid "An error occurred while removing epics."
msgstr ""
@@ -4192,24 +4257,30 @@ msgid "An error occurred while reordering issues."
msgstr ""
msgid "An error occurred while retrieving calendar activity"
-msgstr ""
+msgstr "දිනදසුනෙහි ක්â€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š ගà·à¶±à·“මේදී දà·à·‚යකි"
msgid "An error occurred while retrieving diff"
-msgstr ""
+msgstr "වෙනස ගà·à¶±à·“මේදී දà·à·‚යකි"
msgid "An error occurred while retrieving diff files"
-msgstr ""
+msgstr "වෙනස් ගොනු ගà·à¶±à·“මේදී දà·à·‚යකි"
msgid "An error occurred while retrieving projects."
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ ගà·à¶±à·“මේදී දà·à·‚යකි."
+
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
msgstr ""
msgid "An error occurred while saving changes: %{error}"
-msgstr ""
+msgstr "වෙනස්කම් සුරà·à¶šà·“මේදී දà·à·‚යකි: %{error}"
msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "à·ƒà·à¶šà·ƒà·”ම සුරà·à¶šà·“මේදී දà·à·‚යක් ඇති විය"
+msgstr[1] "à·ƒà·à¶šà·ƒà·”ම් සුරà·à¶šà·“මේදී දà·à·‚යක් ඇති විය"
+
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4290,37 +4361,37 @@ msgid "An issue already exists"
msgstr ""
msgid "An unauthenticated user"
-msgstr ""
+msgstr "බලය නොලත් පුද්ගලයෙකි"
msgid "An unexpected error occurred"
-msgstr ""
+msgstr "අනපේක්â€à·‚ිත දà·à·‚යක් සිදු විය"
msgid "An unexpected error occurred while checking the project environment."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ පරිසරය පරීක්â€à·‚෠කිරීමේදී අනපේක්â€à·‚ිත දà·à·‚යක් සිදු විය."
msgid "An unexpected error occurred while checking the project runners."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ ධà·à·€à¶š පරීක්â€à·‚෠කිරීමේදී අනපේක්â€à·‚ිත දà·à·‚යක් සිදු විය."
msgid "An unexpected error occurred while communicating with the Web Terminal."
-msgstr ""
+msgstr "වියමන අග්â€à¶»à¶º සමඟ සන්නිවේදනය කිරීමේදී අනපේක්â€à·‚ිත දà·à·‚යක් සිදු විය."
msgid "An unexpected error occurred while loading the code quality diff."
-msgstr ""
+msgstr "කේත ගුණත්ව වෙනස පූරණය කිරීමේදී අනපේක්â€à·‚ිත දà·à·‚යක් සිදු විය."
msgid "An unexpected error occurred while starting the Web Terminal."
-msgstr ""
+msgstr "වියමන අග්â€à¶»à¶º ආරම්භ කිරීමේදී අනපේක්â€à·‚ිත දà·à·‚යක් සිදු විය."
msgid "An unexpected error occurred while stopping the Web Terminal."
-msgstr ""
+msgstr "වියමන අග්â€à¶»à¶º නතර කිරීමේදී අනපේක්â€à·‚ිත දà·à·‚යක් සිදු විය."
msgid "An unknown error occurred while loading this graph."
-msgstr ""
+msgstr "මෙම ප්â€à¶»à·ƒà·Šà¶®à·à¶»à¶º පූරණය කිරීමේදී නොදන්න෠දà·à·‚යක් සිදු විය."
msgid "An unknown error occurred."
-msgstr ""
+msgstr "නොදන්න෠දà·à·‚යක් සිදුවිය."
msgid "Analytics"
-msgstr ""
+msgstr "විà·à·Šà¶½à·šà·‚ණ"
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4359,13 +4430,13 @@ msgid "Anti-spam verification"
msgstr ""
msgid "Any"
-msgstr ""
+msgstr "ඕනෑම"
msgid "Any %{header}"
-msgstr ""
+msgstr "ඕනෑම %{header}"
msgid "Any Author"
-msgstr ""
+msgstr "ඕනෑම කතෘ"
msgid "Any Milestone"
msgstr ""
@@ -4374,7 +4445,7 @@ msgid "Any encrypted tokens"
msgstr ""
msgid "Any label"
-msgstr ""
+msgstr "ඕනෑම නම්පතක්"
msgid "Any member with at least Developer permissions on the project."
msgstr ""
@@ -4386,19 +4457,19 @@ msgid "Any namespace"
msgstr ""
msgid "Anyone can register for an account."
-msgstr ""
+msgstr "ඕනෑම අයෙකුට ගිණුමක් සෑදීමට à·„à·à¶šà·’ය."
msgid "App ID"
msgstr "යෙදුමේ à·„à·à¶³à·”."
msgid "Appearance"
-msgstr ""
+msgstr "පෙනුම"
msgid "Appearance was successfully created."
-msgstr ""
+msgstr "පෙනුම à·ƒà·à¶»à·Šà¶®à¶šà·€ සෑදිණි."
msgid "Appearance was successfully updated."
-msgstr ""
+msgstr "පෙනුම à·ƒà·à¶»à·Šà¶®à¶šà·€ යà·à·€à¶­à·Šà¶šà·à¶½ විය."
msgid "Append the comment with %{shrug}"
msgstr ""
@@ -4413,31 +4484,34 @@ msgid "Application ID"
msgstr "යෙදුමේ à·„à·à¶³à·”."
msgid "Application limits saved successfully"
-msgstr ""
+msgstr "යෙදුමේ සීම෠සà·à¶»à·Šà¶®à¶šà·€ සුරà·à¶šà·’ණි"
msgid "Application settings saved successfully"
+msgstr "යෙදුමේ à·ƒà·à¶šà·ƒà·”ම් à·ƒà·à¶»à·Šà¶®à¶šà·€ සුරà·à¶šà·’ණි"
+
+msgid "Application settings saved successfully."
msgstr ""
msgid "Application settings update failed"
-msgstr ""
+msgstr "යෙදුමේ à·ƒà·à¶šà·ƒà·”ම් යà·à·€à¶­à·Šà¶šà·à¶½à¶ºà¶§ අසමත්!"
msgid "Application uninstalled but failed to destroy: %{error_message}"
-msgstr ""
+msgstr "යෙදුම අස්ථà·à¶´à·’තයි නමුත් විනà·à·à¶ºà¶§ අසමත් විය: %{error_message}"
msgid "Application was successfully destroyed."
-msgstr ""
+msgstr "යෙදුම à·ƒà·à¶»à·Šà¶®à¶šà·€ විනà·à· විය."
msgid "Application was successfully updated."
-msgstr ""
+msgstr "යෙදුම à·ƒà·à¶»à·Šà¶®à¶šà·€ යà·à·€à¶­à·Šà¶šà·à¶½ විය."
msgid "Application: %{name}"
-msgstr ""
+msgstr "යෙදුම: %{name}"
msgid "ApplicationSettings|A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
msgstr ""
msgid "ApplicationSettings|Add a link to Grafana"
-msgstr ""
+msgstr "ග්â€à¶»à·à·†à·à¶±à· වෙත සබà·à¶³à·’යක් යොදන්න"
msgid "ApplicationSettings|After sign-up text"
msgstr ""
@@ -4446,7 +4520,7 @@ msgid "ApplicationSettings|After the instance reaches the user cap, any user who
msgstr ""
msgid "ApplicationSettings|Allowed domains for sign-ups"
-msgstr ""
+msgstr "ලියà·à¶´à¶¯à·’ංචියට ඉඩලත් වසම්"
msgid "ApplicationSettings|Any user that visits %{host} and creates an account must be explicitly approved by an administrator before they can sign in. Only effective if sign-ups are enabled."
msgstr ""
@@ -4460,7 +4534,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "ApplicationSettings|Approve users"
-msgstr ""
+msgstr "පුද්ගලයින් අනුමතය"
msgid "ApplicationSettings|Approve users in the pending approval status?"
msgstr ""
@@ -4546,39 +4620,39 @@ msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s
msgstr ""
msgid "ApplicationSettings|domain.com"
-msgstr ""
+msgstr "වසම.ලංකà·"
msgid "Applications"
msgstr "යෙදුම්"
msgid "Applied"
-msgstr ""
+msgstr "යෙදිණි"
msgid "Apply"
msgstr "යොදන්න"
msgid "Apply %d suggestion"
msgid_plural "Apply %d suggestions"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "යà·à¶¢à¶±à· %dක් යොදන්න"
+msgstr[1] "යà·à¶¢à¶±à· %dක් යොදන්න"
msgid "Apply a label"
-msgstr ""
+msgstr "නම්පතක් යොදන්න"
msgid "Apply a template"
-msgstr ""
+msgstr "අච්චුවක් යොදන්න"
msgid "Apply suggestion"
-msgstr ""
+msgstr "යà·à¶¢à¶±à·à·€ යොදන්න"
msgid "Apply template"
-msgstr ""
+msgstr "අච්චුව යොදන්න"
msgid "Apply this approval rule to all branches or a specific protected branch."
-msgstr ""
+msgstr "මෙම අනුමà·à¶­à·’ රීතිය සියළුම à·à·à¶›à· හ෠නිà·à·Šà¶ à·’ත ආරක්â€à·‚ිත à·à·à¶›à·à·€à¶šà¶§ යොදන්න."
msgid "Applying"
-msgstr ""
+msgstr "යෙදෙමින්"
msgid "Applying a template will replace the existing issue description. Any changes you have made will be lost."
msgstr ""
@@ -4590,27 +4664,27 @@ msgid "Applying command to %{commandDescription}"
msgstr ""
msgid "Applying multiple commands"
-msgstr ""
+msgstr "විධà·à¶± කිහිපයක් යෙදෙමින්"
msgid "Applying suggestion..."
-msgstr ""
+msgstr "යà·à¶¢à¶±à·à·€ යෙදෙමින්..."
msgid "Applying suggestions..."
-msgstr ""
+msgstr "යà·à¶¢à¶±à· යෙදෙමින්..."
msgid "Approval rules"
-msgstr ""
+msgstr "අනුමà·à¶­à·’ නීති"
msgid "Approval rules reset to project defaults"
msgstr ""
msgid "Approval settings"
-msgstr ""
+msgstr "අනුමà·à¶­à·’ à·ƒà·à¶šà·ƒà·”ම්"
msgid "ApprovalRuleRemove|%d member"
msgid_plural "ApprovalRuleRemove|%d members"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "à·ƒà·à¶¸à·à¶¢à·’කයින් %d"
+msgstr[1] "à·ƒà·à¶¸à·à¶¢à·’කයින් %d"
msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} member%{strongEnd}. Approvals from this member are not revoked."
msgid_plural "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} members%{strongEnd}. Approvals from these members are not revoked."
@@ -4619,8 +4693,8 @@ msgstr[1] ""
msgid "ApprovalRuleSummary|%d member"
msgid_plural "ApprovalRuleSummary|%d members"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "à·ƒà·à¶¸à·à¶¢à·’කයින් %d"
+msgstr[1] "à·ƒà·à¶¸à·à¶¢à·’කයින් %d"
msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
@@ -4643,16 +4717,16 @@ msgid "ApprovalRule|Approver Type"
msgstr ""
msgid "ApprovalRule|Approvers"
-msgstr ""
+msgstr "අනුමතකරුවන්"
msgid "ApprovalRule|Confirmed"
-msgstr ""
+msgstr "තහවුරුයි"
msgid "ApprovalRule|Dismissed"
msgstr ""
msgid "ApprovalRule|Examples: QA, Security."
-msgstr ""
+msgstr "නිදසුන්: QA, ආරක්â€à·‚à·à·€."
msgid "ApprovalRule|Improve your organization's code review with required approvals."
msgstr ""
@@ -4664,7 +4738,7 @@ msgid "ApprovalRule|Learn more about merge request approval rules."
msgstr ""
msgid "ApprovalRule|Name"
-msgstr ""
+msgstr "නම"
msgid "ApprovalRule|Newly detected"
msgstr ""
@@ -4679,16 +4753,16 @@ msgid "ApprovalRule|Resolved"
msgstr ""
msgid "ApprovalRule|Rule name"
-msgstr ""
+msgstr "නීතියේ නම"
msgid "ApprovalRule|Select eligible approvers by expertise or files changed."
msgstr ""
msgid "ApprovalRule|Target branch"
-msgstr ""
+msgstr "ඉලක්කගත à·à·à¶›à·à·€"
msgid "ApprovalRule|Try for free"
-msgstr ""
+msgstr "නොමිලේ උත්සà·à·„යට"
msgid "ApprovalSettings|Merge request approval settings have been updated."
msgstr ""
@@ -4736,16 +4810,16 @@ msgid "Approvals|Section: %section"
msgstr ""
msgid "Approve"
-msgstr ""
+msgstr "අනුමත"
msgid "Approve a merge request"
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම අනුමà·à¶­à·’ය"
msgid "Approve the current merge request."
-msgstr ""
+msgstr "වත්මන් සංයුක්ත ඉල්ලීමට අනුමà·à¶­à·’ය."
msgid "Approved"
-msgstr ""
+msgstr "අනුමතයි"
msgid "Approved MRs"
msgstr ""
@@ -4760,10 +4834,10 @@ msgid "Approved. Your attention request was removed."
msgstr ""
msgid "Approver"
-msgstr ""
+msgstr "අනුමතකරු"
msgid "Approvers"
-msgstr ""
+msgstr "අනුමතකරුවà·"
msgid "Approvers from private group(s) not shown"
msgstr ""
@@ -4784,13 +4858,13 @@ msgid "Archive jobs"
msgstr ""
msgid "Archive project"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය සංරක්â€à·‚ණය"
msgid "Archive test case"
msgstr ""
msgid "Archived"
-msgstr ""
+msgstr "සංරක්â€à·‚ිතයි"
msgid "Archived (%{movedToStart}moved%{movedToEnd})"
msgstr ""
@@ -4802,9 +4876,9 @@ msgid "Archived project! Repository and other project resources are read-only"
msgstr ""
msgid "Archived projects"
-msgstr ""
+msgstr "සංරක්â€à·‚ිත ව්â€à¶ºà·à¶´à·˜à¶­à·’"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4829,37 +4903,37 @@ msgid "Are you sure you want to approve %{user}?"
msgstr ""
msgid "Are you sure you want to attempt to merge?"
-msgstr ""
+msgstr "ඔබට සංයුක්ත කිරීමට තà·à¶­à·Š කිරීමට වුවමනà·à¶¯?"
msgid "Are you sure you want to cancel editing this %{commentType}?"
-msgstr ""
+msgstr "ඔබට මෙම %{commentType} සංස්කරණය අවලංගු කිරීමට වුවමනà·à¶¯?"
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
msgid "Are you sure you want to delete %{name}?"
-msgstr ""
+msgstr "ඔබට %{name} මà·à¶šà·“මට වුවමන෠ද?"
msgid "Are you sure you want to delete these artifacts?"
msgstr ""
msgid "Are you sure you want to delete this %{commentType}?"
-msgstr ""
+msgstr "ඔබට මෙම %{commentType} මà·à¶šà·“මට වුවමන෠ද?"
msgid "Are you sure you want to delete this SSH key?"
-msgstr ""
+msgstr "ඔබට මෙම SSH යතුර මà·à¶šà·“මට වුවමන෠ද?"
msgid "Are you sure you want to delete this comment?"
-msgstr ""
+msgstr "ඔබට මෙම අදහස මà·à¶šà·“මට වුවමන෠ද?"
msgid "Are you sure you want to delete this deploy key?"
msgstr ""
msgid "Are you sure you want to delete this device? This action cannot be undone."
-msgstr ""
+msgstr "ඔබට මෙම උපà·à¶‚ගය මà·à¶šà·“මට වුවමන෠ද? මෙම ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶º අප්â€à¶»à¶­à·’වර්ත්â€à¶ºà¶ºà·’."
msgid "Are you sure you want to delete this label?"
-msgstr ""
+msgstr "ඔබට මෙම නම්පත මà·à¶šà·“මට වුවමන෠ද?"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -4871,10 +4945,10 @@ msgid "Are you sure you want to deploy this environment?"
msgstr ""
msgid "Are you sure you want to discard this comment?"
-msgstr ""
+msgstr "ඔබට මෙම අදහස ඉවත දà·à¶¸à·“මට වුවමන෠ද?"
msgid "Are you sure you want to discard your changes?"
-msgstr ""
+msgstr "ඔබගේ වෙනස්කම් ඉවත දà·à¶¸à·“මට වුවමන෠ද?"
msgid "Are you sure you want to import %d repository?"
msgid_plural "Are you sure you want to import %d repositories?"
@@ -4882,19 +4956,19 @@ msgstr[0] ""
msgstr[1] ""
msgid "Are you sure you want to lock %{path}?"
-msgstr ""
+msgstr "ඔබට %{path} අගුළු දà·à¶¸à·“මට වුවමන෠ද?"
msgid "Are you sure you want to lock this directory?"
-msgstr ""
+msgstr "ඔබට මෙම නà·à¶¸à·à·€à¶½à·’ය අගුළු දà·à¶¸à·“මට වුවමන෠ද?"
msgid "Are you sure you want to lose unsaved changes?"
-msgstr ""
+msgstr "ඔබට නොසුරà·à¶šà·’ වෙනස්කම් ඉවතලීමට වුවමන෠ද?"
msgid "Are you sure you want to lose your issue information?"
msgstr ""
msgid "Are you sure you want to merge immediately?"
-msgstr ""
+msgstr "ඔබට වහà·à¶¸ සංයුක්ත කිරීමට වුවමන෠ද?"
msgid "Are you sure you want to re-deploy this environment?"
msgstr ""
@@ -4903,27 +4977,33 @@ msgid "Are you sure you want to reindex?"
msgstr ""
msgid "Are you sure you want to remove %{email}?"
-msgstr ""
+msgstr "ඔබට %{email} ඉවත් කිරීමට වුවමන෠ද?"
msgid "Are you sure you want to remove %{group_name}?"
+msgstr "ඔබට %{group_name} ඉවත් කිරීමට වුවමන෠ද?"
+
+msgid "Are you sure you want to remove %{topic_name}?"
msgstr ""
msgid "Are you sure you want to remove the attachment?"
-msgstr ""
+msgstr "ඔබට ඇමුණුම ඉවත් කිරීමට වුවමන෠ද?"
msgid "Are you sure you want to remove the license?"
-msgstr ""
+msgstr "ඔබට බලපත්â€à¶»à¶º ඉවත් කිරීමට වුවමන෠ද?"
msgid "Are you sure you want to remove this deploy key? If anything is still using this key, it will stop working."
msgstr ""
msgid "Are you sure you want to remove this identity?"
-msgstr ""
+msgstr "ඔබට මෙම අනන්â€à¶ºà¶­à·à·€ ඉවතලීමට වුවමන෠ද?"
msgid "Are you sure you want to remove this list?"
-msgstr ""
+msgstr "ඔබට මෙම ලේඛනය ඉවතලීමට වුවමන෠ද?"
msgid "Are you sure you want to remove this nickname?"
+msgstr "ඔබට මෙම අන්වර්ථ නà·à¶¸à¶º ඉවතලීමට වුවමන෠ද?"
+
+msgid "Are you sure you want to reset the error tracking access token?"
msgstr ""
msgid "Are you sure you want to reset the health check token?"
@@ -4936,10 +5016,10 @@ msgid "Are you sure you want to retry this migration?"
msgstr ""
msgid "Are you sure you want to revoke this %{accessTokenType}? This action cannot be undone."
-msgstr ""
+msgstr "ඔබට මෙම %{accessTokenType} අහà·à·ƒà·’ කිරීමට වුවමන෠ද? මෙම ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶º අප්â€à¶»à¶­à·’වර්ත්â€à¶ºà¶ºà·’."
msgid "Are you sure you want to revoke this %{type}? This action cannot be undone."
-msgstr ""
+msgstr "ඔබට මෙම %{type} අහà·à·ƒà·’ කිරීමට වුවමන෠ද? මෙම ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶º අප්â€à¶»à¶­à·’වර්ත්â€à¶ºà¶ºà·’."
msgid "Are you sure you want to revoke this personal access token? This action cannot be undone."
msgstr ""
@@ -4948,22 +5028,22 @@ msgid "Are you sure you want to revoke this project access token? This action ca
msgstr ""
msgid "Are you sure you want to stop this environment?"
-msgstr ""
+msgstr "ඔබට මෙම පරිසරය නà·à·€à¶­à·“මට වුවමන෠ද?"
msgid "Are you sure you want to unlock %{path_lock_path}?"
msgstr ""
msgid "Are you sure you want to unlock %{path}?"
-msgstr ""
+msgstr "ඔබට %{path} අගුළු ඇරීමට වුවමන෠ද?"
msgid "Are you sure you want to unlock this directory?"
-msgstr ""
+msgstr "ඔබට මෙම නà·à¶¸à·à·€à¶½à·’ය අගුළු ඇරීමට වුවමන෠ද?"
msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?"
msgstr ""
msgid "Are you sure?"
-msgstr ""
+msgstr "ඔබට විà·à·Šà·€à·à·ƒà¶¯?"
msgid "Are you sure? All commits that were signed with this GPG key will be unverified."
msgstr ""
@@ -5005,10 +5085,10 @@ msgid "AsanaService|User Personal Access Token. User must have access to the tas
msgstr ""
msgid "Ascending"
-msgstr ""
+msgstr "ආරà·à·„ණ"
msgid "Ask again later"
-msgstr ""
+msgstr "පසුව අසන්න"
msgid "Ask someone with write access to resolve it."
msgstr ""
@@ -5026,28 +5106,31 @@ msgid "Assets:"
msgstr ""
msgid "Assign"
-msgstr ""
+msgstr "පවරන්න"
msgid "Assign Iteration"
msgstr ""
msgid "Assign To"
-msgstr ""
+msgstr "වෙත පà·à·€à¶»à·“ම"
msgid "Assign custom color like #FF0000"
msgstr ""
msgid "Assign labels"
-msgstr ""
+msgstr "නම්පත් පà·à·€à¶»à·“ම"
msgid "Assign milestone"
msgstr ""
-msgid "Assign reviewer"
+msgid "Assign myself"
msgstr ""
+msgid "Assign reviewer"
+msgstr "සමà·à¶½à·à¶ à¶š පà·à·€à¶»à·“ම"
+
msgid "Assign reviewer(s)"
-msgstr ""
+msgstr "සමà·à¶½à·à¶ à¶šà¶ºà·’න් පà·à·€à¶»à·“ම"
msgid "Assign severity"
msgstr ""
@@ -5056,13 +5139,13 @@ msgid "Assign some issues to this milestone."
msgstr ""
msgid "Assign to"
-msgstr ""
+msgstr "වෙත පà·à·€à¶»à·“ම"
msgid "Assign to commenting user"
msgstr ""
msgid "Assign to me"
-msgstr ""
+msgstr "මට පවරන්න"
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5074,22 +5157,22 @@ msgid "Assigned Issues"
msgstr ""
msgid "Assigned merge requests"
-msgstr ""
+msgstr "පà·à·€à¶»à·– සංයුක්ත ඉල්ලීම්"
msgid "Assigned projects"
-msgstr ""
+msgstr "පà·à·€à¶»à·– ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "Assigned to %{assigneeName}"
-msgstr ""
+msgstr "%{assigneeName} වෙත පවර෠ඇත"
msgid "Assigned to %{assignee_name}"
-msgstr ""
+msgstr "%{assignee_name} වෙත පවර෠ඇත"
msgid "Assigned to me"
-msgstr ""
+msgstr "මට පවර෠ඇත"
msgid "Assigned to you"
-msgstr ""
+msgstr "ඔබට පà·à·€à¶»à·–"
msgid "Assigned user(s). Your attention request was removed."
msgstr ""
@@ -5136,24 +5219,21 @@ msgid "At risk"
msgstr ""
msgid "Attach a file"
-msgstr ""
-
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
+msgstr "ගොනුවක් අමුණන්න"
msgid "Attaching File - %{progress}"
-msgstr ""
+msgstr "ගොනුව අමුණමින් - %{progress}"
msgid "Attaching a file"
msgid_plural "Attaching %d files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ගොනුවක් අමුණමින්"
+msgstr[1] "ගොනු %d ක් අමුණමින්"
msgid "Attaching the file failed."
-msgstr ""
+msgstr "ගොනුව ඇමිණීමට අසමත්!."
msgid "Attention"
-msgstr ""
+msgstr "අවධà·à¶±à¶º"
msgid "Attention requested"
msgstr ""
@@ -5165,31 +5245,31 @@ msgid "Audit events"
msgstr ""
msgid "AuditLogs|(removed)"
-msgstr ""
+msgstr "(ඉවතලිණි)"
msgid "AuditLogs|Action"
-msgstr ""
+msgstr "ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶º"
msgid "AuditLogs|Author"
-msgstr ""
+msgstr "කතෘ"
msgid "AuditLogs|Date"
-msgstr ""
+msgstr "දිනය"
msgid "AuditLogs|Failed to find %{type}. Please search for another %{type}."
-msgstr ""
+msgstr "%{type} සොය෠ගà·à¶±à·“මට අසමත්!. අන් %{type} ක් සොයන්න."
msgid "AuditLogs|Failed to find %{type}. Please try again."
-msgstr ""
+msgstr "%{type} සොය෠ගà·à¶±à·“මට අසමත් විය. පසුව බලන්න."
msgid "AuditLogs|Group Events"
msgstr ""
msgid "AuditLogs|IP Address"
-msgstr ""
+msgstr "අ.ජà·.කෙ. ලිපිනය"
msgid "AuditLogs|Log"
-msgstr ""
+msgstr "සටහන"
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5198,20 +5278,23 @@ msgid "AuditLogs|No matching %{type} found."
msgstr ""
msgid "AuditLogs|Object"
-msgstr ""
+msgstr "වස්තුව"
msgid "AuditLogs|Project Events"
msgstr ""
msgid "AuditLogs|Target"
-msgstr ""
+msgstr "ඉලක්කය"
msgid "AuditLogs|This month"
-msgstr ""
+msgstr "මෙම මà·à·ƒà¶º"
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,15 +5319,24 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Custom HTTP headers"
msgstr ""
+msgid "AuditStreams|Delete %{link}"
+msgstr "%{link} මකන්න"
+
msgid "AuditStreams|Destination URL"
-msgstr ""
+msgstr "ගමනà·à¶±à·Šà¶­ ඒ.à·ƒ.නි."
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5252,7 +5344,7 @@ msgid "AuditStreams|Stream count icon"
msgstr ""
msgid "AuditStreams|Streams"
-msgstr ""
+msgstr "ප්â€à¶»à¶ à·à¶»"
msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr "අගය"
+
msgid "Aug"
msgstr "නිකිණි"
@@ -5327,10 +5422,10 @@ msgid "Authentication via WebAuthn device failed."
msgstr ""
msgid "Author"
-msgstr ""
+msgstr "කතෘ"
msgid "Author: %{author_name}"
-msgstr ""
+msgstr "කතෘ: %{author_name}"
msgid "Authored %{timeago}"
msgstr ""
@@ -5375,7 +5470,7 @@ msgid "AuthorizedApplication|Revoke application"
msgstr ""
msgid "Authors: %{authors}"
-msgstr ""
+msgstr "කතෘ: %{authors}"
msgid "Auto DevOps"
msgstr ""
@@ -5447,13 +5542,13 @@ msgid "AutoRollback|Enable automatic rollbacks"
msgstr ""
msgid "Autocomplete"
-msgstr ""
+msgstr "ස්වයං පිරවීම"
msgid "Autocomplete description"
msgstr ""
msgid "Autocomplete hint"
-msgstr ""
+msgstr "ස්වයං පිරවීම ඉඟිය"
msgid "Autocomplete usage hint"
msgstr ""
@@ -5480,7 +5575,7 @@ msgid "Automatically update this project's branches and tags from the upstream r
msgstr ""
msgid "Autosave|Note"
-msgstr ""
+msgstr "සටහන"
msgid "Available"
msgstr ""
@@ -5522,13 +5617,13 @@ msgid "AwardEmoji|No emojis found."
msgstr ""
msgid "Back"
-msgstr ""
+msgstr "ආපසු"
msgid "Back to page %{number}"
-msgstr ""
+msgstr "%{number} පිටුවට ආපසු"
msgid "Background Color"
-msgstr ""
+msgstr "පසුබිම් වර්ණය"
msgid "Background Jobs"
msgstr ""
@@ -5537,7 +5632,7 @@ msgid "Background Migrations"
msgstr ""
msgid "Background color"
-msgstr ""
+msgstr "පසුබිම් වර්ණය"
msgid "BackgroundMigrations|Background Migrations"
msgstr ""
@@ -5549,7 +5644,7 @@ msgid "BackgroundMigrations|Batch size"
msgstr ""
msgid "BackgroundMigrations|Database"
-msgstr ""
+msgstr "දත්ත සමුදà·à¶º"
msgid "BackgroundMigrations|Failed jobs:"
msgstr ""
@@ -5561,22 +5656,22 @@ msgid "BackgroundMigrations|Started at"
msgstr ""
msgid "Badges"
-msgstr ""
+msgstr "චිහ්න"
msgid "Badges|Add badge"
-msgstr ""
+msgstr "චිහ්නයක් යොදන්න"
msgid "Badges|Adding the badge failed, please check the entered URLs and try again."
-msgstr ""
+msgstr "චිහ්නය එක් කිරීම අසමත්! ඇතුල් කළ ඒ.à·ƒ.නි. පරීක්â€à·‚෠කර යළි උත්සà·à·„ කරන්න."
msgid "Badges|Badge image URL"
-msgstr ""
+msgstr "චිහ්න රූපයෙහි ඒ.ස.නි."
msgid "Badges|Badge image preview"
-msgstr ""
+msgstr "චිහ්න රූපයෙහි පෙරදසුන"
msgid "Badges|Badge saved."
-msgstr ""
+msgstr "චිහ්නට සුරà·à¶šà·’ණි."
msgid "Badges|Delete badge?"
msgstr ""
@@ -5585,73 +5680,73 @@ msgid "Badges|Deleting the badge failed, please try again."
msgstr ""
msgid "Badges|Enter a valid URL"
-msgstr ""
+msgstr "වලංගු ඒ.ස.නි. යොදන්න"
msgid "Badges|Example: %{exampleUrl}"
-msgstr ""
+msgstr "නිදසුන: %{exampleUrl}"
msgid "Badges|Group Badge"
msgstr ""
msgid "Badges|Link"
-msgstr ""
+msgstr "සබà·à¶³à·’ය"
msgid "Badges|Name"
-msgstr ""
+msgstr "නම"
msgid "Badges|New badge added."
-msgstr ""
+msgstr "නව චිහ්නයක් යෙදිණි."
msgid "Badges|No badge image"
-msgstr ""
+msgstr "චිහ්නයක රූපයක් නà·à¶­"
msgid "Badges|No image to preview"
-msgstr ""
+msgstr "පෙරදසුනට රූපයක් නà·à¶­"
msgid "Badges|Project Badge"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ චිහ්නය"
msgid "Badges|Reload badge image"
-msgstr ""
+msgstr "චිහ්නයේ රූපය යළි පූරණය"
msgid "Badges|Save changes"
-msgstr ""
+msgstr "වෙනස්කම් සුරකින්න"
msgid "Badges|Saving the badge failed, please check the entered URLs and try again."
-msgstr ""
+msgstr "චිහ්නය සුරà·à¶šà·“මට අසමත්! ඇතුල් කළ ඒ.à·ƒ.නි. පරීක්â€à·‚෠කර යළි උත්සà·à·„ කරන්න."
msgid "Badges|Supported %{docsLinkStart}variables%{docsLinkEnd}: %{placeholders}"
msgstr ""
msgid "Badges|The badge was deleted."
-msgstr ""
+msgstr "චිහ්නය මක෠දà·à¶¸à·’ණි."
msgid "Badges|This group has no badges"
-msgstr ""
+msgstr "මෙම සමූහයෙහි චිහ්න නà·à¶­"
msgid "Badges|This project has no badges"
-msgstr ""
+msgstr "මෙම ව්â€à¶ºà·à¶´à·˜à¶­à·’යෙහි චිහ්න නà·à¶­"
msgid "Badges|You are going to delete this badge. Deleted badges %{strongStart}cannot%{strongEnd} be restored."
-msgstr ""
+msgstr "ඔබ මෙම චිහ්නය මà·à¶šà·“මට à·ƒà·à¶»à·ƒà·™à¶ºà·’. මක෠දà·à¶¸à·– චිහ්න ප්â€à¶»à¶­à·Šâ€à¶ºà¶»à·Šà¶´à¶«à¶º කිරීමට %{strongStart}නොහà·à¶šà·’යි.%{strongEnd}"
msgid "Badges|Your badges"
-msgstr ""
+msgstr "ඔබගේ චිහ්න"
msgid "BambooService|Atlassian Bamboo"
msgstr ""
msgid "BambooService|Bamboo URL"
-msgstr ""
+msgstr "බà·à¶¸à·Šà¶¶à·– ඒ.à·ƒ.නි."
msgid "BambooService|Bamboo build plan key."
msgstr ""
msgid "BambooService|Bamboo service root URL."
-msgstr ""
+msgstr "බà·à¶¸à·Šà¶¶à·– සේවà·à·€à·š මූල ඒ.à·ƒ.නි."
msgid "BambooService|Enter new build key"
-msgstr ""
+msgstr "නව තà·à¶±à·“මේ යතුරක් යොදන්න"
msgid "BambooService|Leave blank to use your current build key."
msgstr ""
@@ -5681,7 +5776,7 @@ msgid "Batched Job|Batched Job (Id: %{id})"
msgstr ""
msgid "BatchedJob|Attempts"
-msgstr ""
+msgstr "තà·à¶­à·Š කිරීම්"
msgid "BatchedJob|Batch size"
msgstr ""
@@ -5723,10 +5818,10 @@ msgid "BatchedJob|Min value"
msgstr ""
msgid "BatchedJob|Next Status"
-msgstr ""
+msgstr "ඊළඟ තත්â€à·€à¶º"
msgid "BatchedJob|Next status"
-msgstr ""
+msgstr "ඊළඟ තත්â€à·€à¶º"
msgid "BatchedJob|Pause ms"
msgstr ""
@@ -5735,10 +5830,10 @@ msgid "BatchedJob|Pause time (ms)"
msgstr ""
msgid "BatchedJob|Previous Status"
-msgstr ""
+msgstr "කලින් තත්â€à·€à¶º"
msgid "BatchedJob|Previous status"
-msgstr ""
+msgstr "කලින් තත්â€à·€à¶º"
msgid "BatchedJob|Started at"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -5783,46 +5875,46 @@ msgid "Billable Users"
msgstr ""
msgid "Billing"
-msgstr ""
+msgstr "ලදුපත්"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
-msgstr ""
+msgstr "%{group_name} දà·à¶±à¶§ %{plan_name} භà·à·€à·’ත෠කරයි"
msgid "BillingPlans|10,000 CI/CD minutes per month"
-msgstr ""
+msgstr "මසකට CI/CD විනà·à¶©à·’ 10,000 ක්"
msgid "BillingPlans|10GB transfer per month"
msgstr ""
msgid "BillingPlans|400 CI/CD minutes per month"
-msgstr ""
+msgstr "මසකට CI/CD විනà·à¶©à·’ 400 ක්"
msgid "BillingPlans|5 users per namespace"
msgstr ""
msgid "BillingPlans|50,000 CI/CD minutes per month"
-msgstr ""
+msgstr "මසකට CI/CD විනà·à¶©à·’ 50,000 ක්"
msgid "BillingPlans|5GB storage"
-msgstr ""
+msgstr "ගි.බ. 5ක ආචයනය"
msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
-msgstr ""
+msgstr "@%{user_name} ඔබ දà·à¶±à¶§ %{plan_name} භà·à·€à·’ත෠කරයි."
msgid "BillingPlans|Advanced CI/CD"
-msgstr ""
+msgstr "CI/CD à·€à·à¶©à·’දුර"
msgid "BillingPlans|All plans have unlimited (private) repositories."
-msgstr ""
+msgstr "සියළුම à·ƒà·à¶½à·ƒà·”ම් සඳහ෠අසීමිත (පුද්ගලික) කà·à·‚්ඨ ඇත."
msgid "BillingPlans|All the features from Free"
-msgstr ""
+msgstr "නොමිලේ වෙතින් සියළුම විà·à·šà·‚à·à¶‚ග"
msgid "BillingPlans|All the features from Premium"
-msgstr ""
+msgstr "ආධික්â€à¶ºà¶º වෙතින් සියළුම විà·à·šà·‚à·à¶‚ග"
msgid "BillingPlans|Billed annually at %{price_per_year} USD"
-msgstr ""
+msgstr "à·€à·à¶»à·Šà·‚ිකව ඩොලර් %{price_per_year}"
msgid "BillingPlans|Check out all groups"
msgstr ""
@@ -5834,7 +5926,7 @@ msgid "BillingPlans|Congratulations, your free trial is activated."
msgstr ""
msgid "BillingPlans|End of availability for the Bronze Plan"
-msgstr ""
+msgstr "ලà·à¶šà¶© à·ƒà·à¶½à·ƒà·”මෙහි නිමà·à·€"
msgid "BillingPlans|Enhance team productivity and collaboration"
msgstr ""
@@ -5843,16 +5935,16 @@ msgid "BillingPlans|Enterprise agile planning"
msgstr ""
msgid "BillingPlans|Faster code reviews"
-msgstr ""
+msgstr "වේගවත් කේත සමà·à¶½à·à¶ à¶±"
msgid "BillingPlans|Free forever features for individual users"
-msgstr ""
+msgstr "තනි පරිà·à·“ලකයින්ට à·ƒà·à¶¸à¶¯à· නොමිලේ විà·à·šà·‚à·à¶‚ග"
msgid "BillingPlans|Free guest users"
msgstr ""
msgid "BillingPlans|Free upgrade!"
-msgstr ""
+msgstr "නොමිලේ උත්à·à·Šâ€à¶»à·šà¶«à·’!"
msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
msgstr ""
@@ -5861,7 +5953,7 @@ msgid "BillingPlans|Includes free static websites"
msgstr ""
msgid "BillingPlans|Learn more"
-msgstr ""
+msgstr "තව දà·à¶±à¶œà¶±à·Šà¶±"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
msgstr ""
@@ -5882,7 +5974,7 @@ msgid "BillingPlans|Not the group you're looking for? %{all_groups_link}."
msgstr ""
msgid "BillingPlans|Open Source - MIT License"
-msgstr ""
+msgstr "විවෘත මූලà·à·à·Šâ€à¶»à¶º - MIT බලපත්â€à¶»à¶º"
msgid "BillingPlans|Organization wide security, compliance and planning"
msgstr ""
@@ -5891,19 +5983,19 @@ msgid "BillingPlans|Portfolio management"
msgstr ""
msgid "BillingPlans|Premium"
-msgstr ""
+msgstr "ආධික්â€à¶ºà¶º"
msgid "BillingPlans|Pricing page"
-msgstr ""
+msgstr "මිලකරණ පිටුව"
msgid "BillingPlans|Ready to explore the value of the paid features today? Start a trial, no credit card required."
msgstr ""
msgid "BillingPlans|Recommended"
-msgstr ""
+msgstr "නිර්දේà·à·’තයි"
msgid "BillingPlans|Release controls"
-msgstr ""
+msgstr "නිකුතු පà·à¶½à¶±"
msgid "BillingPlans|Security risk mitigation"
msgstr ""
@@ -5921,10 +6013,10 @@ msgid "BillingPlans|Start a free Ultimate trial"
msgstr ""
msgid "BillingPlans|Still have questions?"
-msgstr ""
+msgstr "තවමත් ප්â€à¶»à·à·Šà¶± තිබේද?"
msgid "BillingPlans|Support"
-msgstr ""
+msgstr "සහà·à¶º"
msgid "BillingPlans|Talk to an expert today."
msgstr ""
@@ -5966,7 +6058,7 @@ msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can
msgstr ""
msgid "BillingPlans|Your current plan"
-msgstr ""
+msgstr "ඔබගේ වත්මන් à·ƒà·à¶½à·ƒà·”ම"
msgid "BillingPlans|billed annually at %{price_per_year}"
msgstr ""
@@ -5975,13 +6067,13 @@ msgid "BillingPlans|for the remainder of your subscription"
msgstr ""
msgid "BillingPlans|frequently asked questions"
-msgstr ""
+msgstr "නිති අසන පà·à¶«"
msgid "BillingPlans|group"
-msgstr ""
+msgstr "සමූහය"
msgid "BillingPlans|monthly"
-msgstr ""
+msgstr "මà·à·ƒà·’කව"
msgid "BillingPlans|per user"
msgstr ""
@@ -5990,13 +6082,13 @@ msgid "BillingPlans|per user/month"
msgstr ""
msgid "BillingPlan|Upgrade"
-msgstr ""
+msgstr "උත්à·à·Šâ€à¶»à·šà¶«à·’ය"
msgid "BillingPlan|Upgrade for free"
-msgstr ""
+msgstr "නොමිලේ උත්à·à·Šâ€à¶»à·šà¶«à·’ය"
msgid "Billings|%{planName} plan"
-msgstr ""
+msgstr "%{planName} à·ƒà·à¶½à·ƒà·”ම"
msgid "Billings|An error occurred while extending your trial."
msgstr ""
@@ -6101,7 +6193,7 @@ msgid "Billing|Cannot remove user"
msgstr ""
msgid "Billing|Direct memberships"
-msgstr ""
+msgstr "සෘජු à·ƒà·à¶¸à·à¶¢à·’කත්ව"
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -6157,14 +6249,20 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
-msgid "Bitbucket Server Import"
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
msgstr ""
-msgid "Bitbucket Server import"
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
msgstr ""
+msgid "Bitbucket Server Import"
+msgstr "බිට්බකට් සේවà·à¶¯à·à¶ºà¶šà¶º ආයà·à¶­à¶º"
+
+msgid "Bitbucket Server import"
+msgstr "බිට්බකට් සේවà·à¶¯à·à¶ºà¶šà¶º ආයà·à¶­à¶º"
+
msgid "Bitbucket import"
-msgstr ""
+msgstr "බිට්බකට් ආයà·à¶­à¶º"
msgid "Blame"
msgstr ""
@@ -6176,7 +6274,7 @@ msgid "Block user"
msgstr ""
msgid "Blocked"
-msgstr ""
+msgstr "අවහිරයි"
msgid "Blocked by %d issue"
msgid_plural "Blocked by %d issues"
@@ -6205,31 +6303,31 @@ msgid "Board scope affects which issues are displayed for anyone who visits this
msgstr ""
msgid "BoardNewEpic|Groups"
-msgstr ""
+msgstr "සමූහ"
msgid "BoardNewEpic|Loading groups"
-msgstr ""
+msgstr "සමූහ පූරණය වෙමින්"
msgid "BoardNewEpic|No matching results"
-msgstr ""
+msgstr "ගà·à·…පෙන ප්â€à¶»à¶­à·’ඵල නà·à¶­"
msgid "BoardNewEpic|Search groups"
-msgstr ""
+msgstr "සමූහ සෙà·à¶ºà¶±à·Šà¶±"
msgid "BoardNewEpic|Select a group"
-msgstr ""
+msgstr "සමූහයක් තà·à¶»à¶±à·Šà¶±"
msgid "BoardNewIssue|No matching results"
msgstr "ගà·à·…පෙන ප්â€à¶»à¶­à·’ඵල නà·à¶­"
msgid "BoardNewIssue|Projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "BoardNewIssue|Search projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ සොයන්න"
msgid "BoardNewIssue|Select a project"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යක් තà·à¶»à¶±à·Šà¶±"
msgid "BoardScope|%{iterationTitle} iteration in %{iterationCadence}"
msgstr ""
@@ -6256,13 +6354,13 @@ msgid "BoardScope|Any iteration"
msgstr ""
msgid "BoardScope|Any label"
-msgstr ""
+msgstr "ඕනෑම නම්පතක්"
msgid "BoardScope|Assignee"
msgstr ""
msgid "BoardScope|Choose labels"
-msgstr ""
+msgstr "නම්පතක් තà·à¶»à¶±à·Šà¶±"
msgid "BoardScope|Current iteration"
msgstr ""
@@ -6271,13 +6369,13 @@ msgid "BoardScope|Don't filter milestone"
msgstr ""
msgid "BoardScope|Edit"
-msgstr ""
+msgstr "සංස්කරණය"
msgid "BoardScope|Iteration"
msgstr ""
msgid "BoardScope|Labels"
-msgstr ""
+msgstr "නම්පත්"
msgid "BoardScope|Milestone"
msgstr ""
@@ -6301,7 +6399,7 @@ msgid "BoardScope|Select iteration"
msgstr ""
msgid "BoardScope|Select labels"
-msgstr ""
+msgstr "නම්පත් තà·à¶»à¶±à·Šà¶±"
msgid "BoardScope|Select milestone"
msgstr ""
@@ -6310,7 +6408,7 @@ msgid "BoardScope|Select weight"
msgstr ""
msgid "BoardScope|Started"
-msgstr ""
+msgstr "ඇරඹිණි"
msgid "BoardScope|Upcoming"
msgstr ""
@@ -6348,7 +6446,7 @@ 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 ""
+msgstr "නම්පත් ගà·à¶±à·“මේදී දà·à·‚යක් ඇති විය. පිටුව යළි පූරණය කරන්න."
msgid "Boards|An error occurred while fetching the board epics. Please reload the page."
msgstr ""
@@ -6366,7 +6464,7 @@ msgid "Boards|An error occurred while fetching the board. Please reload the page
msgstr ""
msgid "Boards|An error occurred while generating lists. Please reload the page."
-msgstr ""
+msgstr "ලේඛන උත්පà·à¶¯à¶±à¶ºà·šà¶¯à·“ දà·à·‚යක් ඇති විය. පිටුව යළි පූරණය කරන්න."
msgid "Boards|An error occurred while moving the epic. Please try again."
msgstr ""
@@ -6375,7 +6473,7 @@ msgid "Boards|An error occurred while moving the issue. Please try again."
msgstr ""
msgid "Boards|An error occurred while removing the list. Please try again."
-msgstr ""
+msgstr "ලේඛනය ඉවත් කිරීමේදී දà·à·‚යක් ඇති විය. යළි උත්සà·à·„ කරන්න."
msgid "Boards|An error occurred while updating the board list. Please try again."
msgstr ""
@@ -6386,13 +6484,13 @@ msgstr[0] ""
msgstr[1] ""
msgid "Boards|Collapse"
-msgstr ""
+msgstr "හකුළන්න"
msgid "Boards|Edit board"
msgstr ""
msgid "Boards|Expand"
-msgstr ""
+msgstr "දිගහරින්න"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
@@ -6449,13 +6547,16 @@ msgid "Board|Loading epics"
msgstr ""
msgid "Bold text"
+msgstr "තද පෙළ"
+
+msgid "Both SSH and HTTP(S)"
msgstr ""
msgid "Both project and dashboard_path are required"
msgstr ""
msgid "Branch"
-msgstr ""
+msgstr "à·à·à¶›à·à·€"
msgid "Branch %{branchName} was not found in this project's repository."
msgstr ""
@@ -6464,61 +6565,61 @@ msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab
msgstr ""
msgid "Branch already exists"
-msgstr ""
+msgstr "à·à·à¶›à·à·€ පවතී"
msgid "Branch changed"
-msgstr ""
+msgstr "à·à·à¶›à·à·€ වෙනස් විය"
msgid "Branch has been updated since the merge was requested."
msgstr ""
msgid "Branch is already taken"
-msgstr ""
+msgstr "à·à·à¶›à·à·€ ගෙන ඇත"
msgid "Branch name"
-msgstr ""
+msgstr "à·à·à¶›à·à·€à·š නම"
msgid "Branch not loaded - %{branchId}"
msgstr ""
msgid "Branch rules"
-msgstr ""
+msgstr "à·à·à¶›à·à·€à·š නීති"
msgid "Branches"
-msgstr ""
+msgstr "à·à·à¶›à·"
msgid "Branches|Active"
msgstr ""
msgid "Branches|Active branches"
-msgstr ""
+msgstr "සක්â€à¶»à·’ය à·à·à¶›à·"
msgid "Branches|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this branch."
msgstr ""
msgid "Branches|All"
-msgstr ""
+msgstr "සියල්ල"
msgid "Branches|Cancel, keep branch"
-msgstr ""
+msgstr "අවලංගු කර à·à·à¶›à·à·€ තබà·à¶œà¶±à·Šà¶±"
msgid "Branches|Can’t find HEAD commit for this branch"
msgstr ""
msgid "Branches|Compare"
-msgstr ""
+msgstr "සසඳන්න"
msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
msgstr ""
msgid "Branches|Delete branch"
-msgstr ""
+msgstr "à·à·à¶›à·à·€ මකන්න"
msgid "Branches|Delete branch. Are you ABSOLUTELY SURE?"
msgstr ""
msgid "Branches|Delete merged branches"
-msgstr ""
+msgstr "සංයුක්ත à·à·à¶›à· මකන්න"
msgid "Branches|Delete protected branch"
msgstr ""
@@ -6539,34 +6640,34 @@ msgid "Branches|Merged into %{default_branch}"
msgstr ""
msgid "Branches|New branch"
-msgstr ""
+msgstr "නව à·à·à¶›à·à·€"
msgid "Branches|No branches to show"
-msgstr ""
+msgstr "පෙන්වීමට à·à·à¶›à· නà·à¶­"
msgid "Branches|Only a project maintainer or owner can delete a protected branch"
msgstr ""
msgid "Branches|Overview"
-msgstr ""
+msgstr "විà·à·Šà¶½à·šà·‚ණය"
msgid "Branches|Please type the following to confirm:"
msgstr ""
msgid "Branches|Show active branches"
-msgstr ""
+msgstr "සක්â€à¶»à·’ය à·à·à¶›à· පෙන්වන්න"
msgid "Branches|Show all branches"
-msgstr ""
+msgstr "සියළු à·à·à¶›à· පෙන්වන්න"
msgid "Branches|Show more active branches"
-msgstr ""
+msgstr "තව සක්â€à¶»à·’ය à·à·à¶›à· පෙන්වන්න"
msgid "Branches|Show more stale branches"
msgstr ""
msgid "Branches|Show overview of the branches"
-msgstr ""
+msgstr "à·à·à¶›à·à·€à¶½ විà·à·Šà¶½à·šà·‚ණය පෙන්වන්න"
msgid "Branches|Show stale branches"
msgstr ""
@@ -6581,7 +6682,7 @@ msgid "Branches|The branch could not be updated automatically because it has div
msgstr ""
msgid "Branches|The default branch cannot be deleted"
-msgstr ""
+msgstr "පෙරනිමි à·à·à¶›à·à·€ මà·à¶šà·“මට නොහà·à¶šà·’ය"
msgid "Branches|This branch hasn't been merged into %{defaultBranchName}. To avoid data loss, consider merging this branch before deleting it."
msgstr ""
@@ -6593,7 +6694,7 @@ msgid "Branches|Unable to load branches"
msgstr ""
msgid "Branches|Yes, delete branch"
-msgstr ""
+msgstr "ඔව්, à·à·à¶›à·à·€ මකන්න"
msgid "Branches|Yes, delete protected branch"
msgstr ""
@@ -6608,7 +6709,7 @@ msgid "Branches|diverged from upstream"
msgstr ""
msgid "Branches|merged"
-msgstr ""
+msgstr "සංයුක්තයි"
msgid "Branches|protected"
msgstr ""
@@ -6626,22 +6727,22 @@ msgid "Broadcast Messages"
msgstr ""
msgid "Browse Directory"
-msgstr ""
+msgstr "නà·à¶¸à·à·€à¶½à·’ය පිරික්සන්න"
msgid "Browse File"
-msgstr ""
+msgstr "ගොනුව පිරික්සන්න"
msgid "Browse Files"
-msgstr ""
+msgstr "ගොනු පිරික්සන්න"
msgid "Browse artifacts"
msgstr ""
msgid "Browse files"
-msgstr ""
+msgstr "ගොනු පිරික්සන්න"
msgid "Browse templates"
-msgstr ""
+msgstr "අච්චු පිරික්සන්න"
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -6665,16 +6766,16 @@ msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
msgid "BulkImport|Destination"
-msgstr ""
+msgstr "ගමනà·à¶±à·Šà¶­à¶º"
msgid "BulkImport|Destination group"
-msgstr ""
+msgstr "ගමනà·à¶±à·Šà¶­ සමූහය"
msgid "BulkImport|Existing groups"
-msgstr ""
+msgstr "පවත්න෠සමූහ"
msgid "BulkImport|Filter by source group"
-msgstr ""
+msgstr "මූලà·à·à·Šâ€à¶» සමූහයට අනුව පෙරන්න"
msgid "BulkImport|Following data will not be migrated: %{bullets} Contact system administrator of %{host} to upgrade GitLab if you need this data in your migration"
msgstr ""
@@ -6686,13 +6787,13 @@ msgid "BulkImport|Group import history"
msgstr ""
msgid "BulkImport|History"
-msgstr ""
+msgstr "ඉතිහà·à·ƒà¶º"
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
msgid "BulkImport|Import groups from GitLab"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š වෙතින් සමූහ ආයà·à¶­ කරන්න"
msgid "BulkImport|Import is finished. Pick another name for re-import"
msgstr ""
@@ -6701,25 +6802,25 @@ msgid "BulkImport|Import selected"
msgstr ""
msgid "BulkImport|Importing the group failed."
-msgstr ""
+msgstr "සමූහය ආයà·à¶­à¶ºà¶§ අසමත් විය."
msgid "BulkImport|Last imported to %{link}"
msgstr ""
msgid "BulkImport|Name already exists."
-msgstr ""
+msgstr "නම දà·à¶±à¶§à¶¸à¶­à·Š පවතී."
msgid "BulkImport|Name already used as a target for another group."
-msgstr ""
+msgstr "අන් සමූහකට ඉලක්කයක් ලෙස නම භà·à·€à·’ත෠කර ඇත."
msgid "BulkImport|No additional information provided."
-msgstr ""
+msgstr "අතිරේක තොරතුරු සපය෠නà·à¶­."
msgid "BulkImport|No groups found"
-msgstr ""
+msgstr "සමූහ හමු නොවිණි"
msgid "BulkImport|No history is available"
-msgstr ""
+msgstr "ඉතිහà·à·ƒà¶ºà¶šà·Š නà·à¶­"
msgid "BulkImport|No parent"
msgstr ""
@@ -6728,7 +6829,7 @@ msgid "BulkImport|Only groups that you have the %{role} role for are listed as g
msgstr ""
msgid "BulkImport|Project import history"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය ආයà·à¶­ ඉතිහà·à·ƒà¶º"
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6743,16 +6844,16 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own matching filt
msgstr ""
msgid "BulkImport|Source"
-msgstr ""
+msgstr "මූලà·à·à·Šâ€à¶»à¶º"
msgid "BulkImport|Source group"
-msgstr ""
+msgstr "මූලà·à·à·Šâ€à¶» සමූහය"
msgid "BulkImport|Template / File-based import / GitLab Migration"
msgstr ""
msgid "BulkImport|To new group"
-msgstr ""
+msgstr "නව සමූහයකට"
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6791,7 +6895,7 @@ msgid "Business metrics (Custom)"
msgstr ""
msgid "Busy"
-msgstr ""
+msgstr "කà·à¶»à·Šà¶ºà¶¶à·„ුලයි"
msgid "Buy CI Minutes"
msgstr ""
@@ -6833,31 +6937,31 @@ msgid "CI configuration validated, including all configuration added with the %{
msgstr ""
msgid "CI settings"
-msgstr ""
+msgstr "CI à·ƒà·à¶šà·ƒà·”ම්"
msgid "CI variables"
msgstr ""
msgid "CI/CD"
-msgstr ""
+msgstr "CI/CD"
msgid "CI/CD Analytics"
-msgstr ""
+msgstr "CI/CD විà·à·Šà¶½à·šà·‚ණ"
msgid "CI/CD Settings"
-msgstr ""
+msgstr "CI/CD à·ƒà·à¶šà·ƒà·”ම්"
msgid "CI/CD configuration"
-msgstr ""
+msgstr "CI/CD වින්â€à¶ºà·à·ƒà¶º"
msgid "CI/CD configuration file"
-msgstr ""
+msgstr "CI/CD වින්â€à¶ºà·à·ƒ ගොනුව"
msgid "CI/CD limits"
-msgstr ""
+msgstr "CI/CD සීමà·"
msgid "CI/CD minutes"
-msgstr ""
+msgstr "CI/CD විනà·à¶©à·’"
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6882,14 +6989,14 @@ msgstr ""
msgid "CICDAnalytics|Release"
msgid_plural "CICDAnalytics|Releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "නිකුතුව"
+msgstr[1] "නිකුතු"
msgid "CICDAnalytics|Release statistics"
-msgstr ""
+msgstr "නිකුතු සංඛ්â€à¶ºà·à¶½à·šà¶›à¶±"
msgid "CICDAnalytics|Releases"
-msgstr ""
+msgstr "නිකුතු"
msgid "CICDAnalytics|Shared Runners Usage"
msgstr ""
@@ -6901,7 +7008,7 @@ msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
msgstr ""
msgid "CICDAnalytics|Shared runner usage"
-msgstr ""
+msgstr "බෙදà·à¶œà¶­à·Š ධà·à·€à¶šà¶º භà·à·€à·’තය"
msgid "CICDAnalytics|Shared runner usage is the total runtime of all jobs that ran on shared runners"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -6949,7 +7059,7 @@ msgid "CICD|Jobs"
msgstr ""
msgid "CICD|Limit"
-msgstr ""
+msgstr "සීමà·à·€"
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr ""
@@ -6973,16 +7083,16 @@ msgid "CICD|Use separate caches for protected branches"
msgstr ""
msgid "CICD|group enabled"
-msgstr ""
+msgstr "සමූහය සබලයි"
msgid "CICD|instance enabled"
msgstr ""
msgid "CLOSED"
-msgstr ""
+msgstr "වස෠ඇත"
msgid "CLOSED (MOVED)"
-msgstr ""
+msgstr "වස෠ඇත (ගෙන ගියà·)"
msgid "CODEOWNERS rule violation"
msgstr ""
@@ -6991,7 +7101,7 @@ msgid "CONTRIBUTING"
msgstr ""
msgid "CPU"
-msgstr ""
+msgstr "ම.à·ƒà·.ඒ."
msgid "CSV is being generated and will be emailed to you upon completion."
msgstr ""
@@ -7000,22 +7110,22 @@ msgid "CVE|As a maintainer, requesting a CVE for a vulnerability in your project
msgstr ""
msgid "CVE|CVE ID Request"
-msgstr ""
+msgstr "CVE à·„à·à¶³à·”. ඉල්ලීම"
msgid "CVE|Common Vulnerability Enumeration (CVE) identifiers are used to track distinct vulnerabilities in specific versions of code."
msgstr ""
msgid "CVE|Create CVE ID Request"
-msgstr ""
+msgstr "CVE à·„à·à¶³à·”. ඉල්ලීමක් à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "CVE|Enable CVE ID requests in the issue sidebar"
msgstr ""
msgid "CVE|Request CVE ID"
-msgstr ""
+msgstr "CVE à·„à·à¶³à·”. ඉල්ලන්න"
msgid "CVE|Why Request a CVE ID?"
-msgstr ""
+msgstr "CVE à·„à·à¶³à·”. ඉල්ලන්නේ ඇයි?"
msgid "Cadence is not automated"
msgstr ""
@@ -7054,7 +7164,7 @@ msgid "Can be overridden in each project."
msgstr ""
msgid "Can create groups:"
-msgstr ""
+msgstr "සමූහ සෑදිය à·„à·à¶šà·’ය:"
msgid "Can not delete primary training"
msgstr ""
@@ -7069,10 +7179,10 @@ msgid "Can't apply as this line was changed in a more recent version."
msgstr ""
msgid "Can't apply this suggestion."
-msgstr ""
+msgstr "යà·à¶¢à¶±à·à·€ යෙදීමට නොහà·à¶šà·’ය."
msgid "Can't be empty"
-msgstr ""
+msgstr "හිස් විය නොහà·à¶šà·’ය"
msgid "Can't create snippet: %{err}"
msgstr ""
@@ -7090,7 +7200,7 @@ msgid "Can't load mermaid module: %{err}"
msgstr ""
msgid "Can't scan the code?"
-msgstr ""
+msgstr "කේතය සුපිරික්සීමට නොහà·à¶šà·’ද?"
msgid "Can't update snippet: %{err}"
msgstr ""
@@ -7129,28 +7239,28 @@ msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{envi
msgstr ""
msgid "Cancel"
-msgstr ""
+msgstr "අවලංගු"
msgid "Cancel and close"
-msgstr ""
+msgstr "අවලංගු කර වසන්න"
msgid "Cancel downstream pipeline"
msgstr ""
msgid "Cancel editing"
-msgstr ""
+msgstr "සංස්කරණය ඉවතට"
msgid "Cancel index deletion"
msgstr ""
msgid "Cancel running"
-msgstr ""
+msgstr "ධà·à·€à¶±à¶º ඉවතට"
msgid "Cancel this job"
msgstr ""
msgid "Cancel your account"
-msgstr ""
+msgstr "ගිණුම ඉවතලන්න"
msgid "Cancel, keep project"
msgstr ""
@@ -7159,10 +7269,10 @@ msgid "Canceled deployment to"
msgstr ""
msgid "Cancelled"
-msgstr ""
+msgstr "අවලංගු කළà·"
msgid "Cancelling Preview"
-msgstr ""
+msgstr "පෙරදසුන අවලංගු වෙමින්"
msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
msgstr ""
@@ -7171,7 +7281,7 @@ msgid "Cannot assign an issue that does not belong under the same group (or desc
msgstr ""
msgid "Cannot be merged automatically"
-msgstr ""
+msgstr "ස්වයංක්â€à¶»à·“යව සංයුක්ත කළ නොහà·à¶šà·’ය"
msgid "Cannot create the abuse report. The reported user was invalid. Please try again or contact support."
msgstr ""
@@ -7234,6 +7344,9 @@ msgid "Card holder name"
msgstr ""
msgid "Card number:"
+msgstr "පතෙහි අංකය:"
+
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
msgstr ""
msgid "CascadingSettings|Enforce for all subgroups"
@@ -7261,16 +7374,16 @@ msgid "Certain user content will be moved to a system-wide \"Ghost User\" in ord
msgstr ""
msgid "Certificate"
-msgstr ""
+msgstr "සහතිකය"
msgid "Certificate (PEM)"
-msgstr ""
+msgstr "සහතිකය (PEM)"
msgid "Certificate Issuer"
-msgstr ""
+msgstr "සහතිකය නිකුත්කරු"
msgid "Certificate Subject"
-msgstr ""
+msgstr "සහතිකයේ මà·à¶­à·˜à¶šà·à·€"
msgid "Change Failure Rate"
msgstr ""
@@ -7285,10 +7398,10 @@ msgid "Change assignee(s)."
msgstr ""
msgid "Change branches"
-msgstr ""
+msgstr "à·à·à¶›à· සංà·à·à¶°à¶±à¶º"
msgid "Change label"
-msgstr ""
+msgstr "නම්පත සංà·à·à¶°à¶±à¶º"
msgid "Change made by"
msgstr ""
@@ -7297,7 +7410,7 @@ msgid "Change milestone"
msgstr ""
msgid "Change path"
-msgstr ""
+msgstr "පෙත සංà·à·à¶°à¶±à¶º"
msgid "Change reviewer(s)"
msgstr ""
@@ -7306,22 +7419,22 @@ msgid "Change reviewer(s)."
msgstr ""
msgid "Change role"
-msgstr ""
+msgstr "භූමිකà·à·€ සංà·à·à¶°à¶±à¶º"
msgid "Change status"
-msgstr ""
+msgstr "තත්â€à·€à¶º සංà·à·à¶°à¶±à¶º"
msgid "Change subscription"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶­à·Šà·€à¶º සංà·à·à¶°à¶±à¶º"
msgid "Change template"
-msgstr ""
+msgstr "අච්චුව සංà·à·à¶°à¶±à¶º"
msgid "Change title"
-msgstr ""
+msgstr "සිරà·à·ƒà·’ය සංà·à·à¶°à¶±à¶º"
msgid "Change your password"
-msgstr ""
+msgstr "මුරපදය සංà·à·à¶°à¶±à¶º"
msgid "Change your password or recover your current one"
msgstr ""
@@ -7363,7 +7476,7 @@ msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
msgstr ""
msgid "ChangeTypeAction|Switch branch"
-msgstr ""
+msgstr "à·à·à¶›à·à·€ මà·à¶»à·”à·€"
msgid "ChangeTypeAction|Switch project"
msgstr ""
@@ -7393,7 +7506,7 @@ msgid "Changed the title to \"%{title_param}\"."
msgstr ""
msgid "Changes"
-msgstr ""
+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 ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7417,7 +7527,7 @@ msgid "Changing any setting here requires an application restart"
msgstr ""
msgid "Characters left"
-msgstr ""
+msgstr "ඉතිරි අකුරු"
msgid "Characters over limit"
msgstr ""
@@ -7426,13 +7536,13 @@ msgid "Charts can't be displayed as the request for data has timed out. %{docume
msgstr ""
msgid "Chat"
-msgstr ""
+msgstr "සංවà·à¶¯à¶º"
msgid "ChatMessage|%{project_link}: Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status} in %{duration}"
msgstr ""
msgid "ChatMessage|Branch"
-msgstr ""
+msgstr "à·à·à¶›à·à·€"
msgid "ChatMessage|Commit"
msgstr ""
@@ -7453,7 +7563,7 @@ msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{use
msgstr ""
msgid "ChatMessage|Tag"
-msgstr ""
+msgstr "අනන්â€à¶ºà¶±à¶º"
msgid "ChatMessage|and [%{count} more](%{pipeline_failed_jobs_url})"
msgstr ""
@@ -7474,7 +7584,7 @@ msgid "ChatMessage|in %{project_link}"
msgstr ""
msgid "Check again"
-msgstr ""
+msgstr "නà·à·€à¶­ පරීක්â€à·‚à·à·€"
msgid "Check feature availability on namespace plan"
msgstr ""
@@ -7545,15 +7655,15 @@ msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} CI minutes"
-msgstr ""
+msgstr "CI විනà·à¶©à·’ %{quantity}"
msgid "Checkout|%{quantity} GB of storage"
-msgstr ""
+msgstr "ආචයනය ගි.බ. %{quantity}"
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ආචයන ඇසුරුම් %{quantity}"
+msgstr[1] "ආචයන ඇසුරුම් %{quantity}"
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -7598,7 +7708,7 @@ msgid "Checkout|Confirm purchase"
msgstr ""
msgid "Checkout|Confirming..."
-msgstr ""
+msgstr "තහවුරු වෙමින්..."
msgid "Checkout|Continue to billing"
msgstr ""
@@ -7607,7 +7717,7 @@ msgid "Checkout|Continue to payment"
msgstr ""
msgid "Checkout|Country"
-msgstr ""
+msgstr "රට"
msgid "Checkout|Create a new group"
msgstr "නව සමූහයක් à·ƒà·à¶¯à¶±à·Šà¶±"
@@ -7619,7 +7729,7 @@ msgid "Checkout|Credit card form failed to load: %{message}"
msgstr ""
msgid "Checkout|Edit"
-msgstr ""
+msgstr "සංස්කරණය"
msgid "Checkout|Enter a number greater than 0"
msgstr "0 ට වඩ෠වà·à¶©à·’ අංකයක් ඇතුල් කරන්න"
@@ -7646,52 +7756,58 @@ msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
msgid "Checkout|GB"
-msgstr ""
+msgstr "ගි.බ."
msgid "Checkout|GitLab group"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š සමූහය"
msgid "Checkout|GitLab plan"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š à·ƒà·à¶½à·ƒà·”ම"
msgid "Checkout|Group"
+msgstr "සමූහය"
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
msgstr ""
-msgid "Checkout|Name of company or organization using GitLab"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
msgstr ""
+msgid "Checkout|Name of company or organization using GitLab"
+msgstr "ගිට්ලà·à¶¶à·Š භà·à·€à·’ත෠කරන සමà·à¶œà¶¸à·š හ෠සංවිධà·à¶±à¶ºà·š නම"
+
msgid "Checkout|Name: %{errors}"
-msgstr ""
+msgstr "නම: %{errors}"
msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
msgstr ""
msgid "Checkout|Number of users"
-msgstr ""
+msgstr "පරිà·à·“ලකයින් ගණන"
msgid "Checkout|Payment method"
-msgstr ""
+msgstr "ගෙවීමේ ක්â€à¶»à¶¸à¶º"
msgid "Checkout|Please select a country"
-msgstr ""
+msgstr "රටක් තà·à¶»à¶±à·Šà¶±"
msgid "Checkout|Please select a state"
msgstr ""
msgid "Checkout|Purchase details"
-msgstr ""
+msgstr "මිලදී ගà·à¶±à·“මේ විස්තර"
msgid "Checkout|Select"
-msgstr ""
+msgstr "තà·à¶»à¶±à·Šà¶±"
msgid "Checkout|State"
msgstr ""
msgid "Checkout|Storage packs"
-msgstr ""
+msgstr "ආචයන ඇසුරුම්"
msgid "Checkout|Street address"
-msgstr ""
+msgstr "වීදියේ ලිපිනය"
msgid "Checkout|Submitting the credit card form failed with code %{errorCode}: %{errorMessage}"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7721,13 +7834,13 @@ msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
-msgstr ""
+msgstr "පරිà·à·“ලකයින්"
msgid "Checkout|You'll create your new group after checkout"
msgstr ""
msgid "Checkout|Your organization"
-msgstr ""
+msgstr "ඔබගේ සංවිධà·à¶±à¶º"
msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
msgstr ""
@@ -7742,10 +7855,10 @@ msgid "Checkout|a storage subscription"
msgstr ""
msgid "Checkout|company or team"
-msgstr ""
+msgstr "සමà·à¶œà¶¸ හ෠කණ්ඩà·à¶ºà¶¸"
msgid "Checkout|minutes"
-msgstr ""
+msgstr "විනà·à¶©à·’"
msgid "Checkout|x %{quantity} %{units} per pack"
msgstr ""
@@ -7774,32 +7887,35 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
msgid "Choose File..."
-msgstr ""
+msgstr "ගොනුව තà·à¶»à¶±à·Šà¶±..."
msgid "Choose a file"
-msgstr ""
+msgstr "ගොනුවක් තà·à¶»à¶±à·Šà¶±"
msgid "Choose a group"
-msgstr ""
+msgstr "සමූහයක් තà·à¶»à¶±à·Šà¶±"
msgid "Choose a template"
-msgstr ""
+msgstr "අච්චුවක් තà·à¶»à¶±à·Šà¶±"
msgid "Choose a template..."
-msgstr ""
+msgstr "අච්චුවක් තà·à¶»à¶±à·Šà¶±..."
msgid "Choose a type..."
-msgstr ""
+msgstr "වර්ගයක් තà·à¶»à¶±à·Šà¶±..."
msgid "Choose any color."
msgstr ""
msgid "Choose file…"
-msgstr ""
+msgstr "ගොනුව තà·à¶»à¶±à·Šà¶±â€¦"
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7823,19 +7939,19 @@ msgid "Choose your framework"
msgstr ""
msgid "CiCdAnalytics|Date range: %{range}"
-msgstr ""
+msgstr "දින පරà·à·ƒà¶º: %{range}"
msgid "CiStatusLabel|canceled"
msgstr ""
msgid "CiStatusLabel|created"
-msgstr ""
+msgstr "සෑදිණි"
msgid "CiStatusLabel|delayed"
msgstr ""
msgid "CiStatusLabel|failed"
-msgstr ""
+msgstr "අසමත් විය"
msgid "CiStatusLabel|manual action"
msgstr ""
@@ -7853,7 +7969,7 @@ msgid "CiStatusLabel|preparing"
msgstr ""
msgid "CiStatusLabel|skipped"
-msgstr ""
+msgstr "මඟ à·„à·à¶»à·’ණි"
msgid "CiStatusLabel|waiting for delayed job"
msgstr ""
@@ -7865,7 +7981,7 @@ msgid "CiStatusLabel|waiting for resource"
msgstr ""
msgid "CiStatusText|blocked"
-msgstr ""
+msgstr "අවහිරයි"
msgid "CiStatusText|canceled"
msgstr "අවලංගු කෙරිණි"
@@ -7892,13 +8008,13 @@ msgid "CiStatusText|preparing"
msgstr ""
msgid "CiStatusText|skipped"
-msgstr ""
+msgstr "මඟ à·„à·à¶»à·’ණි"
msgid "CiStatusText|waiting"
msgstr "රà·à¶³à·™à¶¸à·’න්"
msgid "CiStatus|running"
-msgstr ""
+msgstr "ධà·à·€à¶±à¶ºà·š"
msgid "CiVariables|Cannot use Masked Variable with current value"
msgstr ""
@@ -8002,16 +8118,16 @@ msgid "Clear health status"
msgstr ""
msgid "Clear recent searches"
-msgstr ""
+msgstr "මෑත සෙවුම් මකන්න"
msgid "Clear repository checks"
msgstr ""
msgid "Clear search"
-msgstr ""
+msgstr "සෙවුම මකන්න"
msgid "Clear search input"
-msgstr ""
+msgstr "සෙවුම් ආදà·à¶±à¶º මකන්න"
msgid "Clear start date"
msgstr ""
@@ -8062,7 +8178,7 @@ msgid "Click to expand text"
msgstr ""
msgid "Click to hide"
-msgstr ""
+msgstr "à·ƒà·à¶Ÿà·€à·“මට ඔබන්න"
msgid "Click to reveal"
msgstr ""
@@ -8113,19 +8229,19 @@ msgid "Clones this issue, without comments, to %{project}."
msgstr ""
msgid "Close"
-msgstr ""
+msgstr "වසන්න"
msgid "Close %{issueType}"
-msgstr ""
+msgstr "%{issueType} වසන්න"
msgid "Close %{noteable}"
msgstr "%{noteable} වසන්න"
msgid "Close %{tabname}"
-msgstr ""
+msgstr "%{tabname} වසන්න"
msgid "Close design"
-msgstr ""
+msgstr "නිර්මà·à¶«à¶º වසන්න"
msgid "Close epic"
msgstr ""
@@ -8140,7 +8256,7 @@ msgid "Close this %{quick_action_target}"
msgstr ""
msgid "Closed"
-msgstr ""
+msgstr "වස෠ඇත"
msgid "Closed %{epicTimeagoDate}"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8155,7 +8274,7 @@ msgid "Closed this %{quick_action_target}."
msgstr ""
msgid "Closed: %{closed}"
-msgstr ""
+msgstr "වස෠ඇත: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr ""
@@ -8164,8 +8283,125 @@ msgid "Cloud Run"
msgstr ""
msgid "Cloud Storage"
+msgstr "මේචආචයනය"
+
+msgid "CloudSeed|All"
+msgstr "සියල්ල"
+
+msgid "CloudSeed|AlloyDB for Postgres"
msgstr ""
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr "දත්තසමුදà·à¶º à·ƒà·à¶¯à¶±à·Šà¶±"
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr "දත්තසමුදà·à¶ºà·š අනුවà·à¶¯à¶º"
+
+msgid "CloudSeed|Description"
+msgstr "සවිස්තරය"
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr "පරිසරය"
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr "ගූගල් ක්ලවුඩ් ව්â€à¶ºà·à¶´à·˜à¶­à·’ය"
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr "සේවà·à·€"
+
+msgid "CloudSeed|Services"
+msgstr "සේවà·"
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr "අනුවà·à¶¯à¶º"
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8224,13 +8457,13 @@ msgid "ClusterAgents|Advanced installation methods"
msgstr ""
msgid "ClusterAgents|Agent"
-msgstr ""
+msgstr "නියà·à¶­à¶º"
msgid "ClusterAgents|Agent %{strongStart}connected%{strongEnd}"
-msgstr ""
+msgstr "නියà·à¶­à¶º %{strongStart}සම්බන්ධිතයි%{strongEnd}"
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
-msgstr ""
+msgstr "නියà·à¶­à¶º %{strongStart}විසන්ධි විය%{strongEnd}"
msgid "ClusterAgents|Agent access token:"
msgstr ""
@@ -8251,7 +8484,7 @@ msgid "ClusterAgents|Agent version update required"
msgstr ""
msgid "ClusterAgents|All"
-msgstr ""
+msgstr "සියල්ල"
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
@@ -8275,7 +8508,7 @@ msgid "ClusterAgents|Certificate"
msgstr "සහතිකය"
msgid "ClusterAgents|Configuration"
-msgstr ""
+msgstr "වින්â€à¶ºà·à·ƒà¶º"
msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
@@ -8293,13 +8526,13 @@ msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
msgid "ClusterAgents|Connected"
-msgstr ""
+msgstr "සම්බන්ධිතයි"
msgid "ClusterAgents|Connection status"
-msgstr ""
+msgstr "සම්බන්ධතà·à·€à·š තත්â€à·€à¶º"
msgid "ClusterAgents|Copy command"
-msgstr ""
+msgstr "විධà·à¶±à¶ºà·™à·„à·’ පිටපතක්"
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -8517,7 +8750,7 @@ msgid "ClusterIntegration|A service token scoped to %{code}kube-system%{end_code
msgstr ""
msgid "ClusterIntegration|API URL"
-msgstr ""
+msgstr "යෙ.ක්â€à¶».මු. ඒ.à·ƒ.නි."
msgid "ClusterIntegration|API URL should be a valid http/https url."
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,14 +9232,17 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
-msgid "ColorWidget|An error occurred while updating color."
+msgid "Color"
msgstr ""
+msgid "ColorWidget|An error occurred while updating color."
+msgstr "පà·à¶§ යà·à·€à¶­à·Šà¶šà·à¶½ කිරීමේදී දà·à·‚යක් සිදු විය."
+
msgid "ColorWidget|Assign epic color"
msgstr ""
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "පà·à¶§"
msgid "ColorWidget|Error fetching epic color."
msgstr ""
@@ -9134,7 +9379,7 @@ msgid "Committed by"
msgstr ""
msgid "Community forum"
-msgstr ""
+msgstr "ප්â€à¶»à¶¢à· සංසදය"
msgid "Company"
msgstr ""
@@ -9143,7 +9388,7 @@ msgid "Company Name"
msgstr ""
msgid "Compare"
-msgstr ""
+msgstr "සසඳන්න"
msgid "Compare %{oldCommitId}...%{newCommitId}"
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10001,7 +10246,7 @@ msgid "Continuous Integration and Deployment"
msgstr ""
msgid "Contribute to GitLab"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š වෙත දà·à¶ºà¶šà·€à¶±à·Šà¶±"
msgid "Contribution"
msgstr ""
@@ -10052,10 +10297,10 @@ msgid "Contributions per group member"
msgstr ""
msgid "Contributor"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶ºà·"
msgid "Contributors"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶ºà·’න්"
msgid "Control emails linked to your account"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -10757,7 +11005,7 @@ msgid "CreateValueStreamForm|Value Stream name"
msgstr ""
msgid "Created"
-msgstr ""
+msgstr "සෑදිණි"
msgid "Created %{epicTimeagoDate}"
msgstr ""
@@ -10790,7 +11038,7 @@ msgid "Created compliance violations if any were found"
msgstr ""
msgid "Created date"
-msgstr ""
+msgstr "සෑදූ දිනය"
msgid "Created issue %{issueLink}"
msgstr ""
@@ -11254,7 +11502,7 @@ msgid "DAST profiles"
msgstr ""
msgid "DNS"
-msgstr ""
+msgstr "à·€.නà·.ප."
msgid "DORA4Metrics|%{startDate} - %{endDate}"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11302,7 +11562,7 @@ msgid "DORA4Metrics|Something went wrong while getting lead time data."
msgstr ""
msgid "DORA4Metrics|Something went wrong while getting time to restore service data."
-msgstr ""
+msgstr "සේව෠දත්ත ප්â€à¶»à¶­à·Šâ€à¶ºà¶»à·Šà¶´à¶«à¶ºà¶§ කà·à¶½à¶º ගà·à¶±à·“මේදී යමක් à·€à·à¶»à¶¯à·“ ඇත."
msgid "DORA4Metrics|The chart displays the frequency of deployments to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
@@ -11311,7 +11571,7 @@ msgid "DORA4Metrics|The chart displays the median time between a merge request b
msgstr ""
msgid "DORA4Metrics|Time to restore service"
-msgstr ""
+msgstr "සේවà·à·€ ප්â€à¶»à¶­à·Šâ€à¶ºà¶»à·Šà¶´à¶«à¶ºà¶§ කà·à¶½à¶º"
msgid "DSN"
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11359,7 +11619,7 @@ msgid "DastProfiles|AJAX spider"
msgstr ""
msgid "DastProfiles|API"
-msgstr ""
+msgstr "යෙ.ක්â€à¶».මු."
msgid "DastProfiles|API endpoint URL"
msgstr ""
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11632,7 +11895,7 @@ msgid "DastProfiles|Turn on AJAX spider"
msgstr ""
msgid "DastProfiles|URL"
-msgstr ""
+msgstr "ඒ.ස.නි."
msgid "DastProfiles|URLs to skip during the authenticated scan."
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11802,7 +12068,7 @@ msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Use
msgstr ""
msgid "DatadogIntegration|Tags"
-msgstr ""
+msgstr "අනන්â€à¶ºà¶±"
msgid "DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}."
msgstr ""
@@ -11817,7 +12083,7 @@ msgid "Datasource name not found"
msgstr ""
msgid "Date"
-msgstr ""
+msgstr "දිනය"
msgid "Date merged"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12564,7 +12851,7 @@ msgid "Deploying to AWS is easy with GitLab"
msgstr ""
msgid "Deployment"
-msgstr ""
+msgstr "යෙදවීම"
msgid "Deployment Frequency"
msgstr ""
@@ -12645,7 +12932,7 @@ msgid "DeploymentTarget|Virtual machine (for example, EC2)"
msgstr ""
msgid "Deployments"
-msgstr ""
+msgstr "යෙදවීම්"
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13000,7 +13278,7 @@ msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|DAST"
-msgstr ""
+msgstr "DAST"
msgid "DevopsAdoption|DAST enabled for at least one project"
msgstr ""
@@ -13072,7 +13350,7 @@ msgid "DevopsAdoption|Runners"
msgstr ""
msgid "DevopsAdoption|SAST"
-msgstr ""
+msgstr "SAST"
msgid "DevopsAdoption|SAST enabled for at least one project"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,12 +13894,12 @@ msgstr ""
msgid "Edit"
msgstr "සංස්කරණය"
-msgid "Edit %{issuable}"
-msgstr "%{issuable} සංස්කරණය"
-
msgid "Edit %{name}"
msgstr "%{name} සංස්කරණය"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "අදහස සංස්කරණය"
@@ -13652,9 +13927,6 @@ msgstr "මුරපදය සංස්කරණය"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr "ගිට්පොඩ් සබල කරන්න"
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14268,10 +14531,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgstr ""
-
-msgid "Environment does not have deployments"
-msgstr ""
+msgstr "පරිසරය"
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14301,7 +14561,7 @@ msgid "EnvironmentDashboard|You are looking at the last updated environment"
msgstr ""
msgid "Environments"
-msgstr ""
+msgstr "පරිසර"
msgid "Environments Dashboard"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15063,7 +15299,7 @@ msgid "Events"
msgstr ""
msgid "Events API"
-msgstr ""
+msgstr "සිදුවීම් යෙ.ක්â€à¶».මු."
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15290,7 +15529,7 @@ msgid "Explore paid plans"
msgstr ""
msgid "Explore projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ ගවේà·à¶«à¶º"
msgid "Explore public groups"
msgstr ""
@@ -15302,7 +15541,7 @@ msgid "Explore snippets"
msgstr ""
msgid "Explore topics"
-msgstr ""
+msgstr "මà·à¶­à·˜à¶šà· ගවේà·à¶«à¶º"
msgid "Export"
msgstr ""
@@ -15311,7 +15550,7 @@ msgid "Export %{requirementsCount} requirements?"
msgstr ""
msgid "Export as CSV"
-msgstr ""
+msgstr "CSV ලෙස නිර්යà·à¶­à¶º"
msgid "Export commit custody report"
msgstr ""
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -15580,7 +15827,7 @@ msgid "Failed to load groups, users and deploy keys."
msgstr ""
msgid "Failed to load groups."
-msgstr ""
+msgstr "සමූහ පූරණයට අසමත් විය."
msgid "Failed to load iteration cadences."
msgstr ""
@@ -15771,7 +16018,7 @@ msgid "FeatureFlags|* (All Environments)"
msgstr ""
msgid "FeatureFlags|API URL"
-msgstr ""
+msgstr "යෙ.ක්â€à¶».මු. ඒ.à·ƒ.නි."
msgid "FeatureFlags|Active"
msgstr ""
@@ -15972,7 +16219,7 @@ msgid "Fetching incoming email"
msgstr ""
msgid "File"
-msgstr ""
+msgstr "ගොනුව"
msgid "File %{current} of %{total}"
msgstr ""
@@ -16026,7 +16273,7 @@ msgid "Filename"
msgstr ""
msgid "Files"
-msgstr ""
+msgstr "ගොනු"
msgid "Files API Rate Limits"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16392,7 +16642,7 @@ msgid "Frequently searched"
msgstr ""
msgid "Friday"
-msgstr ""
+msgstr "සිකුරà·à¶¯à·"
msgid "From"
msgstr ""
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17095,7 +17330,7 @@ msgid "Getting started with releases"
msgstr ""
msgid "Git"
-msgstr ""
+msgstr "ගිට්"
msgid "Git GC period"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17152,7 +17423,7 @@ msgid "GitLab / Unsubscribe"
msgstr ""
msgid "GitLab API"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š ඒ.à·ƒ.නි."
msgid "GitLab Account Request"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17167,7 +17441,7 @@ msgid "GitLab Issue"
msgstr ""
msgid "GitLab KAS"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š KAS"
msgid "GitLab Pages"
msgstr ""
@@ -17233,7 +17507,7 @@ msgid "GitLab is open source software to collaborate on code."
msgstr ""
msgid "GitLab is undergoing maintenance"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š නඩත්තු කරමින් පවතී"
msgid "GitLab logo"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17266,7 +17537,7 @@ msgid "GitLab.com"
msgstr ""
msgid "GitLab.com (SaaS)"
-msgstr ""
+msgstr "GitLab.com (SaaS)"
msgid "GitLab.com import"
msgstr ""
@@ -17311,7 +17582,7 @@ msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable th
msgstr ""
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "උප. ප්â€à¶»à¶¸à·à¶«à¶º (මෙ.බ.)"
msgid "GitLabPages|New Domain"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17437,7 +17711,7 @@ msgid "Gitpod|To use the integration, each user must also enable Gitpod on their
msgstr ""
msgid "Gitpod|https://gitpod.example.com"
-msgstr ""
+msgstr "https://ගිට්පොඩ්.උදà·à·„රණය.ලංකà·"
msgid "Given access %{time_ago}"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr "සමූහ"
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’"
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,18 +17776,24 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
-msgid "GlobalSearch|What are you searching for?"
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in group"
-msgstr ""
+msgid "GlobalSearch|all GitLab"
+msgstr "සියළුම ගිට්ලà·à¶¶à·Š"
+
+msgid "GlobalSearch|group"
+msgstr "සමූහය"
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
+msgid "GlobalSearch|project"
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය"
+
msgid "Globally-allowed IP ranges"
msgstr ""
@@ -17668,7 +17957,7 @@ msgid "Google Cloud"
msgstr ""
msgid "Google Cloud Project"
-msgstr ""
+msgstr "ගූගල් ක්ලවුඩ් ව්â€à¶ºà·à¶´à·˜à¶­à·’ය"
msgid "Google Cloud authorizations required"
msgstr ""
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,57 +18568,69 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
-msgstr ""
+msgid "GroupSettings|Number of projects"
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ ගණන"
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
msgstr ""
+msgid "GroupSettings|Reporting"
+msgstr "à·€à·à¶»à·Šà¶­à· කිරීම"
+
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
msgstr ""
-msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
+msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
+msgstr "මෙම සමූහයේ එක් එක් පිටු අඩවිවල ඇති සියළු අන්තර්ගත සඳහ෠ප්â€à¶»à¶¸à·à¶« සීමà·à·€à¶šà·Š සකසන්න. %{link_start}තව දà·à¶±à¶œà¶±à·Šà¶±.%{link_end}"
+
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18379,7 +18683,7 @@ msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name
msgstr ""
msgid "Groups"
-msgstr ""
+msgstr "සමූහ"
msgid "Groups (%{count})"
msgstr ""
@@ -18418,13 +18722,13 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "නව ව්â€à¶ºà·à¶´à·˜à¶­à·’යක් à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "නව උප සමූහයක් à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
-msgstr ""
+msgstr "බොහ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’ සහ à·ƒà·à¶¸à·à¶¢à·’කයින් කළමනà·à¶šà¶»à¶«à¶ºà¶§ හොඳම ක්â€à¶»à¶¸à¶º සමූහ වේ."
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
@@ -18433,7 +18737,7 @@ msgid "GroupsEmptyState|No groups found"
msgstr ""
msgid "GroupsEmptyState|No subgroups or projects."
-msgstr ""
+msgstr "උප සමූහ හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’ නà·à¶­."
msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
msgstr ""
@@ -18442,7 +18746,7 @@ msgid "GroupsEmptyState|You can manage your group member’s permissions and acc
msgstr ""
msgid "GroupsEmptyState|You do not have necessary permissions to create a subgroup or project in this group. Please contact an owner of this group to create a new subgroup or project."
-msgstr ""
+msgstr "මෙම සමූහය තුළ උප සමූහයක් හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’යක් සෑදීමට ඔබට අවà·à·Šâ€à¶º අවසර නà·à¶­. නව උප සමූහයක් හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’යක් සෑදීමට මෙම සමූහයේ හිමිකරුවෙකු අමතන්න."
msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
msgstr ""
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18809,7 +19110,7 @@ msgid "HelloMessage|Welcome to GitLab!"
msgstr ""
msgid "Help"
-msgstr ""
+msgstr "උදව්"
msgid "Help translate GitLab into your language"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19056,7 +19354,7 @@ msgid "ID:"
msgstr "à·„à·à¶³à·”.:"
msgid "IDE"
-msgstr ""
+msgstr "IDE"
msgid "IDE|Back"
msgstr ""
@@ -19089,7 +19387,7 @@ msgid "IDE|Review"
msgstr ""
msgid "IDE|Start a new merge request"
-msgstr ""
+msgstr "නව සංයුක්ත ඉල්ලීමක් අරඹන්න"
msgid "IDE|Successful commit"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20768,10 +21159,10 @@ msgid "Integrations|can't exceed %{recipients_limit}"
msgstr ""
msgid "IntelliJ IDEA (HTTPS)"
-msgstr ""
+msgstr "IntelliJ IDEA (HTTPS)"
msgid "IntelliJ IDEA (SSH)"
-msgstr ""
+msgstr "IntelliJ IDEA (SSH)"
msgid "Interactive mode"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr "දුරුතු"
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22214,22 +22622,22 @@ msgid "Key: %{key}"
msgstr ""
msgid "Keyboard shortcuts"
-msgstr ""
+msgstr "යතුරුපුවරුවේ කෙටිමං"
msgid "KeyboardKey|Alt"
-msgstr ""
+msgstr "Alt"
msgid "KeyboardKey|Ctrl"
-msgstr ""
+msgstr "Ctrl"
msgid "KeyboardKey|Ctrl+"
-msgstr ""
+msgstr "Ctrl+"
msgid "KeyboardKey|Enter"
msgstr ""
msgid "KeyboardKey|Esc"
-msgstr ""
+msgstr "Esc"
msgid "KeyboardKey|Shift"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22286,7 +22691,7 @@ msgid "Kubernetes error: %{error_code}"
msgstr ""
msgid "LDAP"
-msgstr ""
+msgstr "LDAP"
msgid "LDAP Synchronization"
msgstr ""
@@ -22310,7 +22715,7 @@ msgid "LDAP uid:"
msgstr ""
msgid "LFS"
-msgstr ""
+msgstr "LFS"
msgid "LFS objects"
msgstr ""
@@ -22325,11 +22730,16 @@ msgid "LICENSE"
msgstr ""
msgid "Label"
-msgstr ""
+msgstr "නම්පත"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22352,7 +22762,7 @@ msgid "LabelSelect|Labels"
msgstr ""
msgid "Labels"
-msgstr ""
+msgstr "නම්පත්"
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23173,7 +23580,7 @@ msgid "Locked"
msgstr ""
msgid "Locked Files"
-msgstr ""
+msgstr "අගුළු ලූ ගොනු"
msgid "Locked by %{fileLockUserName}"
msgstr ""
@@ -23200,7 +23607,7 @@ msgid "LoggedOutMarketingHeader|GitLab Learn"
msgstr ""
msgid "LoggedOutMarketingHeader|GitLab docs"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š ප්â€à¶»à¶½à·šà¶›à¶±"
msgid "LoggedOutMarketingHeader|GitLab: the DevOps platform"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23242,10 +23646,10 @@ msgid "Low vulnerabilities present"
msgstr ""
msgid "MB"
-msgstr ""
+msgstr "මෙ.බ."
msgid "MD5"
-msgstr ""
+msgstr "MD5"
msgid "MERGED"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23824,7 +24228,7 @@ msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or
msgstr ""
msgid "Members"
-msgstr ""
+msgstr "à·ƒà·à¶¸à·à¶¢à·’කයින්"
msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}"
msgstr ""
@@ -23969,19 +24373,19 @@ msgid "Menu"
msgstr ""
msgid "Merge"
-msgstr ""
+msgstr "සංයුක්ත"
msgid "Merge Conflicts"
msgstr ""
msgid "Merge Request"
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම"
msgid "Merge Request Analytics"
msgstr ""
msgid "Merge Requests"
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම්"
msgid "Merge Requests created"
msgstr ""
@@ -24035,7 +24439,7 @@ msgid "Merge options"
msgstr ""
msgid "Merge request"
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
@@ -24058,17 +24462,23 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
msgid "Merge requests"
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම්"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24909,10 +25319,10 @@ msgid "Modify merge commit"
msgstr ""
msgid "Monday"
-msgstr ""
+msgstr "සඳුදà·"
msgid "Monitor"
-msgstr ""
+msgstr "නිරීක්â€à·‚ණය"
msgid "Monitor Settings"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr "නව"
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,24 +25617,24 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
-msgstr ""
-
msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
+msgid "NavigationTheme|Gray"
+msgstr "අළු"
+
msgid "NavigationTheme|Green"
msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
-msgstr ""
-
msgid "NavigationTheme|Light Blue"
msgstr ""
+msgid "NavigationTheme|Light Gray"
+msgstr "ල෠අළු"
+
msgid "NavigationTheme|Light Green"
msgstr ""
@@ -25283,7 +25705,7 @@ msgid "New File"
msgstr ""
msgid "New Group"
-msgstr ""
+msgstr "නව සමූහය"
msgid "New Group Name"
msgstr ""
@@ -25365,17 +25787,14 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
-msgstr ""
+msgid "New group"
+msgstr "නව සමූහය"
msgid "New health check access token has been generated!"
msgstr ""
@@ -25402,7 +25821,7 @@ msgid "New list"
msgstr ""
msgid "New merge request"
-msgstr ""
+msgstr "නව සංයුක්ත ඉල්ලීම"
msgid "New milestone"
msgstr ""
@@ -25426,7 +25845,7 @@ msgid "New project pages"
msgstr ""
msgid "New project/repository"
-msgstr ""
+msgstr "නව ව්â€à¶ºà·à¶´à·˜à¶­à·’ය/කà·à·‚්ඨය"
msgid "New public deploy key"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr "ප්â€à¶»à¶­à·’ඵල නà·à¶­"
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr "දà·à¶±à·”ම්දීම් අක්â€à¶»à·’යයි."
+
+msgid "Notifications turned on."
+msgstr "දà·à¶±à·”ම්දීම් සක්â€à¶»à·’යයි."
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr "දà·à¶±à¶§ සහà·à¶º දක්වන භà·à·‚à·"
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "ඉල්"
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26692,7 +27177,7 @@ msgid "Oops, are you sure?"
msgstr ""
msgid "Open"
-msgstr ""
+msgstr "විවෘත"
msgid "Open Selection"
msgstr ""
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26866,7 +27357,7 @@ msgid "Overridden"
msgstr ""
msgid "Overview"
-msgstr ""
+msgstr "විà·à·Šà¶½à·šà·‚ණය"
msgid "Overwrite diverged branches"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr "හිමිකරුවන් හ෠පරිපà·à¶½à¶šà¶ºà·’න්"
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr "අතිරේක පà·à¶»à¶¯à¶­à·Šà¶­"
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr "ඇසුරුම් අනුපිටපත්"
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27127,19 +27621,19 @@ msgid "PackageRegistry|Generic"
msgstr ""
msgid "PackageRegistry|Gradle Groovy DSL"
-msgstr ""
+msgstr "ග්â€à¶»à·à¶©à·Šà¶½à·Š ග්â€à¶»à·à·€à·’ DSL"
msgid "PackageRegistry|Gradle Groovy DSL install command"
msgstr ""
msgid "PackageRegistry|Gradle Kotlin DSL"
-msgstr ""
+msgstr "ග්â€à¶»à·à¶©à·Šà¶½à·Š කෙà·à¶§à·Šà¶½à·’න් DSL"
msgid "PackageRegistry|Gradle Kotlin DSL install command"
msgstr ""
msgid "PackageRegistry|Helm"
-msgstr ""
+msgstr "හෙල්ම්"
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -27175,10 +27669,10 @@ msgid "PackageRegistry|Maven XML"
msgstr ""
msgid "PackageRegistry|NuGet"
-msgstr ""
+msgstr "නුගෙට්"
msgid "PackageRegistry|NuGet Command"
-msgstr ""
+msgstr "නුගෙට් විධà·à¶±à¶º"
msgid "PackageRegistry|Package Registry"
msgstr ""
@@ -27198,7 +27692,7 @@ msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, bu
msgstr ""
msgid "PackageRegistry|Pip Command"
-msgstr ""
+msgstr "Pip විධà·à¶±à¶º"
msgid "PackageRegistry|Project-level"
msgstr ""
@@ -27210,7 +27704,7 @@ msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
msgid "PackageRegistry|PyPI"
-msgstr ""
+msgstr "PyPI"
msgid "PackageRegistry|Recipe: %{recipe}"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27492,7 +27983,7 @@ msgid "Paste issue link"
msgstr ""
msgid "Paste link"
-msgstr ""
+msgstr "සබà·à¶³à·’ය අලවන්න"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
@@ -27537,13 +28028,13 @@ msgid "Pending"
msgstr ""
msgid "Pending Deletion"
-msgstr ""
+msgstr "මà·à¶šà·“මට තිබෙන"
msgid "Pending comments"
msgstr ""
msgid "Pending deletion"
-msgstr ""
+msgstr "මà·à¶šà·“මට තිබෙන"
msgid "Pending owner action"
msgstr ""
@@ -27675,7 +28166,7 @@ msgid "Personal project creation is not allowed. Please contact your administrat
msgstr ""
msgid "Personal projects"
-msgstr ""
+msgstr "පෞද්ගලික ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "Personal projects limit:"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28698,7 +29216,7 @@ msgid "Polling interval multiplier"
msgstr ""
msgid "Popularity"
-msgstr ""
+msgstr "ප්â€à¶»à¶ à¶½à·’ත්â€à·€à¶º"
msgid "Port"
msgstr ""
@@ -28716,7 +29234,7 @@ msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
-msgstr ""
+msgstr "අභිප්â€à¶»à·šà¶­"
msgid "Preferences saved."
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr "වර්ණ තේමà·à·€"
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29520,7 +30041,7 @@ msgid "Project info:"
msgstr ""
msgid "Project information"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ තොරතුරු"
msgid "Project is required when cluster_type is :project"
msgstr ""
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30192,7 +30719,7 @@ msgid "ProjectTemplates|.NET Core"
msgstr ""
msgid "ProjectTemplates|Android"
-msgstr ""
+msgstr "ඇන්ඩ්â€à¶»à·œà¶ºà·’ඩ්"
msgid "ProjectTemplates|GitLab Cluster Management"
msgstr ""
@@ -30237,10 +30764,10 @@ msgid "ProjectTemplates|Pages/GitBook"
msgstr ""
msgid "ProjectTemplates|Pages/Hexo"
-msgstr ""
+msgstr "පිටුව/හෙක්සà·"
msgid "ProjectTemplates|Pages/Hugo"
-msgstr ""
+msgstr "පිටුව/හූගà·"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
@@ -30258,7 +30785,7 @@ msgid "ProjectTemplates|Ruby on Rails"
msgstr ""
msgid "ProjectTemplates|SalesforceDX"
-msgstr ""
+msgstr "SalesforceDX"
msgid "ProjectTemplates|Sample GitLab Project"
msgstr ""
@@ -30273,7 +30800,7 @@ msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
msgid "ProjectTemplates|iOS (Swift)"
-msgstr ""
+msgstr "අයිඕඑස් (ස්විෆ්ට්)"
msgid "ProjectView|Activity"
msgstr ""
@@ -30285,7 +30812,7 @@ msgid "ProjectView|Readme"
msgstr ""
msgid "Projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "Projects (%{count})"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30882,7 +31418,7 @@ msgid "ProtectedEnvironment|Select an environment"
msgstr ""
msgid "ProtectedEnvironment|Select groups"
-msgstr ""
+msgstr "සමූහ තà·à¶»à¶±à·Šà¶±"
msgid "ProtectedEnvironment|Select users"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr "ප්â€à¶»à¶­à·’පà·à·‚ණ සපයන්න"
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31275,7 +31817,7 @@ msgid "Receive product marketing emails"
msgstr ""
msgid "Recent"
-msgstr ""
+msgstr "මෑත"
msgid "Recent Project Activity"
msgstr ""
@@ -31287,7 +31829,7 @@ msgid "Recent events"
msgstr ""
msgid "Recent searches"
-msgstr ""
+msgstr "මෑත සෙවීම්"
msgid "Recently used"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31482,8 +32021,8 @@ msgstr ""
msgid "Release"
msgid_plural "Releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "නිකුතුව"
+msgstr[1] "නිකුතු"
msgid "Release assets"
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31531,7 +32073,7 @@ msgid "Released date"
msgstr ""
msgid "Releases"
-msgstr ""
+msgstr "නිකුතු"
msgid "Releases are based on Git tags and mark specific points in a project's development history. They can contain information about the type of changes and can also deliver binaries, like compiled versions of your software."
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr "පිලිතුරු"
+
msgid "Reply by email"
msgstr ""
@@ -31942,7 +32484,7 @@ msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Report your license usage data to GitLab"
-msgstr ""
+msgstr "බලපත්â€à¶»à¶º භà·à·€à·’තය ගිට්ලà·à¶¶à·Š වෙත à·€à·à¶»à·Šà¶­à· කරන්න"
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32193,7 +32741,7 @@ msgid "RepositoriesAnalytics|There was an error fetching the projects."
msgstr ""
msgid "Repository"
-msgstr ""
+msgstr "කà·à·‚්ඨය"
msgid "Repository Analytics"
msgstr ""
@@ -32277,7 +32825,7 @@ msgid "RepositorySettingsAccessLevel|Select"
msgstr ""
msgid "Request"
-msgstr ""
+msgstr "ඉල්ලීම"
msgid "Request Access"
msgstr ""
@@ -32340,7 +32888,7 @@ msgid "Requested states are invalid"
msgstr ""
msgid "Requests"
-msgstr ""
+msgstr "ඉල්ලීම්"
msgid "Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32367,7 +32912,7 @@ msgid "Required only if you are not using role instance credentials."
msgstr ""
msgid "Requirement"
-msgstr ""
+msgstr "අවà·à·Šâ€à¶ºà¶­à·à·€"
msgid "Requirement %{reference} has been added"
msgstr ""
@@ -32385,7 +32930,7 @@ msgid "Requirement title cannot have more than %{limit} characters."
msgstr ""
msgid "Requirements"
-msgstr ""
+msgstr "අවà·à·Šâ€à¶ºà¶­à·"
msgid "Requirements can be based on users, stakeholders, system, software, or anything else you find important to capture."
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32766,7 +33308,7 @@ msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spa
msgstr ""
msgid "Runners|A new version is available"
-msgstr ""
+msgstr "නව අනුවà·à¶¯à¶ºà¶šà·Š තිබේ"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
msgstr ""
@@ -32870,7 +33412,7 @@ msgid "Runners|Download latest binary"
msgstr ""
msgid "Runners|Edit your search and try again"
-msgstr ""
+msgstr "සෙවුම සංස්කරණය කර යළි බලන්න"
msgid "Runners|Enable stale runner cleanup"
msgstr ""
@@ -32885,11 +33427,14 @@ msgid "Runners|Executor"
msgstr ""
msgid "Runners|Get started with runners"
-msgstr ""
+msgstr "ධà·à·€à¶š සමඟ පටන් ගන්න"
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32936,7 +33481,7 @@ msgid "Runners|New registration token generated!"
msgstr ""
msgid "Runners|No results found"
-msgstr ""
+msgstr "ප්â€à¶»à¶­à·’ඵල හමු නොවිණි"
msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33150,7 +33692,7 @@ msgid "Runners|This runner is available to all projects and subgroups in a group
msgstr ""
msgid "Runners|This runner is outdated, an upgrade is recommended"
-msgstr ""
+msgstr "මෙම ධà·à·€à¶šà¶º කල් ඉකුත්ය, උත්à·à·Šâ€à¶»à·šà¶«à·’ කිරීම නිර්දේà·à·’තයි"
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33222,10 +33773,10 @@ msgid "Runners|stale"
msgstr ""
msgid "Runners|upgrade available"
-msgstr ""
+msgstr "උත්à·à·Šâ€à¶»à·šà¶«à·’ කිරීමක් තිබේ"
msgid "Runners|upgrade recommended"
-msgstr ""
+msgstr "උත්à·à·Šâ€à¶»à·šà¶«à·’ කිරීම නිර්දේà·à·’තයි"
msgid "Running"
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33300,7 +33866,7 @@ msgid "Satisfied"
msgstr ""
msgid "Saturday"
-msgstr ""
+msgstr "සෙනසුරà·à¶¯à·"
msgid "Save"
msgstr ""
@@ -33435,10 +34001,10 @@ msgid "Scroll up"
msgstr ""
msgid "Search"
-msgstr ""
+msgstr "සොයන්න"
msgid "Search GitLab"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š à·„à·’ සොයන්න"
msgid "Search a group"
msgstr ""
@@ -33898,6 +34464,9 @@ msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request
msgstr ""
msgid "SecurityOrchestration|+%{count} more"
+msgstr "තවත් +%{count}"
+
+msgid "SecurityOrchestration|, and %{count} more"
msgstr ""
msgid "SecurityOrchestration|.yaml mode"
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34153,10 +34728,10 @@ msgid "SecurityOrchestration|This group"
msgstr ""
msgid "SecurityOrchestration|This is a group-level policy"
-msgstr ""
+msgstr "මෙය සමූහ මට්ටමේ ප්â€à¶»à¶­à·’පත්තියකි"
msgid "SecurityOrchestration|This is a project-level policy"
-msgstr ""
+msgstr "මෙය සමූහ මට්ටමේ ප්â€à¶»à¶­à·’පත්තියකි"
msgid "SecurityOrchestration|This policy is inherited from %{namespace}"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr "පà·à¶§à¶šà·Š තà·à¶»à¶±à·Šà¶±"
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr "මූලà·à·à·Šâ€à¶» ව්â€à¶ºà·à¶´à·˜à¶­à·’ය තà·à¶»à¶±à·Šà¶±"
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr "ඉලක්කගත ව්â€à¶ºà·à¶´à·˜à¶­à·’ය තà·à¶»à¶±à·Šà¶±"
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr "සූදà·à¶±à¶¸à·Š තත්â€à·€à¶º සකසන්න"
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35223,7 +35798,7 @@ msgid "Shimo|Shimo Workspace"
msgstr ""
msgid "Shimo|Shimo Workspace URL"
-msgstr ""
+msgstr "ෂිමො à·€à·à¶©à¶¶à·’ම ඒ.à·ƒ.නි."
msgid "Shimo|Shimo Workspace integration is enabled"
msgstr ""
@@ -35330,9 +35905,66 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
-msgid "Showing %{conflict}"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
msgstr ""
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
+msgid "Showing %{conflict}"
+msgstr "%{conflict} පෙන්වමින්"
+
msgid "Showing %{count} of %{total} projects"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36254,13 +36886,13 @@ msgid "StarProject|Star"
msgstr ""
msgid "Starred Projects"
-msgstr ""
+msgstr "තරු යෙදූ ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "Starred Projects' Activity"
msgstr ""
msgid "Starred projects"
-msgstr ""
+msgstr "තරු යෙදූ ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon. Then, you can find the project on this page."
msgstr ""
@@ -36386,7 +37018,7 @@ msgid "Statistics"
msgstr ""
msgid "Status"
-msgstr ""
+msgstr "තත්â€à·€à¶º"
msgid "Status was retried."
msgstr ""
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36620,7 +37258,7 @@ msgid "Submit as spam"
msgstr ""
msgid "Submit feedback"
-msgstr ""
+msgstr "ප්â€à¶»à¶­à·’පà·à·‚ණ යොමන්න"
msgid "Submit review"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr "යටකුර"
+
msgid "Subscription"
msgstr ""
@@ -36692,7 +37333,7 @@ msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionBanner|Upload new license"
-msgstr ""
+msgstr "නව බලපත්â€à¶»à¶º යොදන්න"
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36917,7 +37558,7 @@ msgid "SuggestedColors|Gray"
msgstr ""
msgid "SuggestedColors|Green"
-msgstr ""
+msgstr "කොළ"
msgid "SuggestedColors|Green screen"
msgstr ""
@@ -36938,7 +37579,7 @@ msgid "SuggestedColors|Orange"
msgstr ""
msgid "SuggestedColors|Purple"
-msgstr ""
+msgstr "දම්"
msgid "SuggestedColors|Red"
msgstr ""
@@ -36970,11 +37611,14 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
-msgstr ""
+msgid "Summary / note"
+msgstr "à·ƒà·à¶»à·à¶‚à·à¶º / සටහන"
+
+msgid "Summary comment (optional)"
+msgstr "à·ƒà·à¶»à·à¶‚෠අදහස (විකල්ප)"
msgid "Sunday"
-msgstr ""
+msgstr "ඉරිදà·"
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -37140,8 +37784,11 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr "උඩකුර"
+
msgid "Support"
-msgstr ""
+msgstr "සහà·à¶º"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37162,7 +37824,7 @@ msgid "Switch branch/tag"
msgstr ""
msgid "Switch to GitLab Next"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š නෙක්â€à·ƒà·Šà¶§à·Š මà·à¶»à·”à·€"
msgid "Switch to the source to copy the file contents"
msgstr ""
@@ -37198,7 +37860,7 @@ msgid "SynthaxHighlightingTheme|Light"
msgstr ""
msgid "SynthaxHighlightingTheme|Monokai"
-msgstr ""
+msgstr "මොනොකà·à¶ºà·’"
msgid "SynthaxHighlightingTheme|None"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37249,7 +37908,7 @@ msgid "Table of contents"
msgstr ""
msgid "Tag"
-msgstr ""
+msgstr "අනන්â€à¶ºà¶±à¶º"
msgid "Tag list:"
msgstr ""
@@ -37279,7 +37938,7 @@ msgid "Tagged this commit to %{tag_name}."
msgstr ""
msgid "Tags"
-msgstr ""
+msgstr "අනන්â€à¶ºà¶±"
msgid "Tags are deleted until the timeout is reached. Any remaining tags are included the next time the policy runs. To remove the time limit, set it to 0."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37480,25 +38145,25 @@ msgid "TemporaryStorage|Temporarily increase storage now?"
msgstr ""
msgid "Terminal"
-msgstr ""
+msgstr "අග්â€à¶»à¶º"
msgid "Terminal for environment"
-msgstr ""
+msgstr "පරිසරය සඳහ෠අග්â€à¶»à¶º"
msgid "Terminal sync service is running"
-msgstr ""
+msgstr "අග්â€à¶»à¶º සමමුහූර්ත සේවà·à·€ ධà·à·€à¶±à¶ºà·š"
msgid "Terms of Service Agreement and Privacy Policy"
-msgstr ""
+msgstr "සේවà·à·€à·š නියම ගිවිසුම හ෠රහස්â€à¶ºà¶­à· ප්â€à¶»à¶­à·’පත්තිය"
msgid "Terms of Service and Privacy Policy"
-msgstr ""
+msgstr "සේවà·à·€à·š නියම හ෠රහස්â€à¶ºà¶­à· ප්â€à¶»à¶­à·’පත්තිය"
msgid "Terms of service"
-msgstr ""
+msgstr "සේවà·à·€à·š නියම"
msgid "Terraform"
-msgstr ""
+msgstr "ටෙරà·à·†à·à¶¸à·Š"
msgid "TerraformBanner|Learn more about GitLab's Backend State"
msgstr ""
@@ -37548,7 +38213,7 @@ msgid "Terraform|A report was generated in your pipelines."
msgstr ""
msgid "Terraform|Actions"
-msgstr ""
+msgstr "ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œ"
msgid "Terraform|An error occurred while changing the state file"
msgstr ""
@@ -37560,10 +38225,10 @@ msgid "Terraform|Are you sure you want to remove the Terraform State %{name}?"
msgstr ""
msgid "Terraform|Cancel"
-msgstr ""
+msgstr "අවලංගු"
msgid "Terraform|Cannot remove a locked state"
-msgstr ""
+msgstr "අගුලු දà·à¶¸à·– තත්â€à·€à¶ºà¶šà·Š ඉවත් කළ නොහà·à¶šà·’ය"
msgid "Terraform|Copy Terraform init command"
msgstr ""
@@ -37572,10 +38237,10 @@ msgid "Terraform|Deletion in progress"
msgstr ""
msgid "Terraform|Details"
-msgstr ""
+msgstr "විස්තර"
msgid "Terraform|Download JSON"
-msgstr ""
+msgstr "JSON බà·à¶œà¶±à·Šà¶±"
msgid "Terraform|Failed to load Terraform reports"
msgstr ""
@@ -37653,7 +38318,7 @@ msgid "Terraform|To remove the State file and its versions, type %{name} to conf
msgstr ""
msgid "Terraform|Unknown User"
-msgstr ""
+msgstr "නොදන්න෠පරිà·à·“ලකයෙකි"
msgid "Terraform|Unlock"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37822,41 +38490,38 @@ msgid "Tests"
msgstr ""
msgid "Text (optional)"
-msgstr ""
+msgstr "පෙළ (විකල්ප)"
msgid "Text added to the body of all email messages. %{character_limit} character limit"
msgstr ""
msgid "Text style"
-msgstr ""
+msgstr "පෙළ à·à·›à¶½à·’ය"
msgid "Thank you for your business."
msgstr ""
msgid "Thank you for your feedback!"
-msgstr ""
+msgstr "ඔබගේ ප්â€à¶»à¶­à·’පà·à·‚ණයට ස්තූතියි!"
msgid "Thank you for your report. A GitLab administrator will look into it shortly."
-msgstr ""
+msgstr "ඔබගේ à·€à·à¶»à·Šà¶­à·à·€à¶§ ස්තූතියි. ගිට්ලà·à¶¶à·Š පරිපà·à¶½à¶šà¶ºà·™à¶šà·” විසින් එය සොය෠බලනු ඇත."
msgid "Thank you for your support request! We are tracking your request as ticket #%{issue_iid}, and will respond as soon as we can."
-msgstr ""
+msgstr "ඔබගේ සහà·à¶º ඉල්ලීමට ස්තූතියි! අපි ඔබගේ ඉල්ලීම #%{issue_iid} තුන්ඩුව යටතේ නිරීක්ෂණය කරමින් සිටින අතර à·„à·à¶šà·’ ඉක්මනින් ප්â€à¶»à¶­à·’චà·à¶» දක්වන්නෙමු."
msgid "Thanks for signing up to GitLab!"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š වෙත ලියà·à¶´à¶¯à·’ංචි වීමට තුති!"
msgid "Thanks for your purchase!"
-msgstr ""
+msgstr "ඔබගේ මිලදී ගà·à¶±à·“මට තුති!"
msgid "That's OK, I don't want to renew"
-msgstr ""
+msgstr "හරි, මට අළුත් කරන්න ඕන නෑ"
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37881,7 +38546,7 @@ msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
msgid "The ID of the application."
-msgstr ""
+msgstr "යෙදුමේ à·„à·à¶³à·”."
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -37896,7 +38561,7 @@ msgid "The Snowplow cookie domain."
msgstr ""
msgid "The URL of the Jenkins server."
-msgstr ""
+msgstr "ජෙන්කින්ස් සේවà·à¶¯à·à¶ºà¶šà¶ºà·š ඒ.à·ƒ.නි."
msgid "The URL should start with http:// or https://"
msgstr ""
@@ -37917,7 +38582,7 @@ msgid "The branch for this project has no active pipeline configuration."
msgstr ""
msgid "The branch or tag does not exist"
-msgstr ""
+msgstr "à·à·à¶›à·à·€ හ෠අනන්â€à¶ºà¶±à¶º නොපවතී"
msgid "The broadcast message displays only to users in projects and groups who have these roles."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37992,18 +38660,18 @@ msgid "The deployment of this job to %{environmentLink} did not succeed."
msgstr ""
msgid "The directory has been successfully created."
-msgstr ""
+msgstr "නà·à¶¸à·à·€à¶½à·’ය à·ƒà·à¶»à·Šà¶®à¶šà·€ à·ƒà·à¶¯à· ඇත."
msgid "The domain you entered is misformatted."
msgstr ""
msgid "The domain you entered is not allowed."
-msgstr ""
+msgstr "ඔබ ඇතුල් කළ වසමට ඉඩ නෙà·à¶¯à·š."
msgid "The download link will expire in 24 hours."
-msgstr ""
+msgstr "බà·à¶œà·à¶±à·“මේ සබà·à¶³à·’ය පà·à¶º 24 කින් කල් ඉකුත් වේ."
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38016,13 +38684,13 @@ msgid "The file could not be displayed because it is empty or larger than the ma
msgstr ""
msgid "The file has been successfully created."
-msgstr ""
+msgstr "ගොනුව à·ƒà·à¶»à·Šà¶®à¶šà·€ à·ƒà·à¶¯à· ඇත."
msgid "The file has been successfully deleted."
-msgstr ""
+msgstr "ගොනුව à·ƒà·à¶»à·Šà¶®à¶šà·€ මක෠දම෠ඇත."
msgid "The file name should have a .yml extension"
-msgstr ""
+msgstr "ගොනුවේ නමට .yml දිගුවක් තිබිය යුතුය"
msgid "The finding is not a vulnerability because it is part of a test or is test data."
msgstr ""
@@ -38104,16 +38772,16 @@ msgid "The invitation can not be found with the provided invite token."
msgstr ""
msgid "The invitation could not be accepted."
-msgstr ""
+msgstr "ආරà·à¶°à¶±à·à·€ පිළිගà·à¶±à·“මට නොහà·à¶šà·’ විය."
msgid "The invitation could not be declined."
-msgstr ""
+msgstr "ආරà·à¶°à¶±à·à·€ ප්â€à¶»à¶­à·’ක්â€à·‚ේප කළ නොහà·à¶šà·’ විය."
msgid "The invitation has already been accepted."
-msgstr ""
+msgstr "ආරà·à¶°à¶±à·à·€ දà·à¶±à¶§à¶¸à¶­à·Š පිළිගෙන ඇත."
msgid "The invitation was successfully resent."
-msgstr ""
+msgstr "ආරà·à¶°à¶±à·à·€ à·ƒà·à¶»à·Šà¶®à¶šà·€ නà·à·€à¶­ යවන ලදි."
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
@@ -38134,7 +38802,7 @@ msgid "The latest pipeline for this merge request has failed."
msgstr ""
msgid "The license key is invalid."
-msgstr ""
+msgstr "බලපත්â€à¶» යතුර වලංගු නොවේ."
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -38143,23 +38811,26 @@ msgid "The license was removed. GitLab has fallen back on the previous license."
msgstr ""
msgid "The license was removed. GitLab now no longer has a valid license."
-msgstr ""
+msgstr "බලපත්â€à¶»à¶º ඉවත් කෙරිණි. ගිට්ලà·à¶¶à·Š à·„à·’ දà·à¶±à·Š වලංගු බලපත්â€à¶»à¶ºà¶šà·Š නà·à¶­."
msgid "The license was successfully uploaded and is now active. You can see the details below."
-msgstr ""
+msgstr "බලපත්â€à¶»à¶º උඩුගත කර තිබෙන අතර දà·à¶±à·Š සක්â€à¶»à·’යයි. ඔබට පහත විස්තර බà·à¶½à·“මට à·„à·à¶šà·’ය."
msgid "The license was successfully uploaded and will be active from %{starts_at}. You can see the details below."
-msgstr ""
+msgstr "බලපත්â€à¶»à¶º උඩුගත කරන ලද අතර %{starts_at} සිට සක්â€à¶»à·’ය වනු ඇත. ඔබට පහත විස්තර බà·à¶½à·“මට à·„à·à¶šà·’ය."
msgid "The license you uploaded is invalid. If the issue persists, contact support at %{link}."
-msgstr ""
+msgstr "ඔබ උඩුගත කළ බලපත්â€à¶»à¶º වලංගු නà·à¶­. ගà·à¶§à¶½à·”à·€ දිගටම තිබේ නම්, %{link} à·„à·’ සහà·à¶º අමතන්න."
msgid "The list creation wizard is already open"
msgstr ""
-msgid "The maximum file size allowed is %{size}."
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum file size allowed is %{size}."
+msgstr "ඉඩ දෙන උපරිම ගොනුවක ප්â€à¶»à¶¸à·à¶«à¶º %{size}."
+
msgid "The maximum file size for job artifacts."
msgstr ""
@@ -38167,7 +38838,7 @@ msgid "The maximum file size in megabytes for individual job artifacts."
msgstr ""
msgid "The maximum file size is %{size}."
-msgstr ""
+msgstr "උපරිම ගොනුවක ප්â€à¶»à¶¸à·à¶«à¶º %{size}."
msgid "The maximum number of CI/CD minutes on shared runners that a group can use each month. 0 for unlimited."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,32 +38900,23 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
msgid "The project size exceeds the export limit."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ ප්â€à¶»à¶¸à·à¶«à¶º නිර්යà·à¶­ සීමà·à·€ ඉක්මවයි."
msgid "The project was successfully forked."
msgstr ""
msgid "The project was successfully imported."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය à·ƒà·à¶»à·Šà¶®à¶šà·€ ආයà·à¶­ කෙරිණි."
msgid "The related CI build failed."
msgstr ""
@@ -38269,25 +38928,25 @@ msgid "The remote mirror took to long to complete."
msgstr ""
msgid "The remote repository is being updated..."
-msgstr ""
+msgstr "දුරස්ථ කà·à·‚්ඨය යà·à·€à¶­à·Šà¶šà·à¶½ වෙමින් පවතී..."
msgid "The report artifact provided by the CI build couldn't be parsed."
msgstr ""
msgid "The report has been successfully prepared."
-msgstr ""
+msgstr "à·€à·à¶»à·Šà¶­à·à·€ à·ƒà·à¶»à·Šà¶®à¶šà·€ සූදà·à¶±à¶¸à·Š කර ඇත."
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
msgid "The repository for this project does not exist."
-msgstr ""
+msgstr "මෙම ව්â€à¶ºà·à¶´à·˜à¶­à·’ය සඳහ෠කà·à·‚්ඨය නොපවතී."
msgid "The repository for this project is empty"
-msgstr ""
+msgstr "මෙම ව්â€à¶ºà·à¶´à·˜à¶­à·’ය සඳහ෠වූ කà·à·‚්ඨය හිස්ය"
msgid "The repository is being updated..."
-msgstr ""
+msgstr "කà·à·‚්ඨය යà·à·€à¶­à·Šà¶šà·à¶½ වෙමින් පවතී..."
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
@@ -38299,7 +38958,7 @@ msgid "The same shared runner executes code from multiple projects, unless you c
msgstr ""
msgid "The scan has been created."
-msgstr ""
+msgstr "සුපිරික්සීම à·ƒà·à¶¯à· ඇත."
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -38314,7 +38973,7 @@ msgid "The snippet is visible to any logged in user except external users."
msgstr ""
msgid "The source project of this merge request has been removed."
-msgstr ""
+msgstr "මෙම සංයුක්ත ඉල්ලීමේ මූලà·à·à·Šâ€à¶» ව්â€à¶ºà·à¶´à·˜à¶­à·’ය ඉවත් කර ඇත."
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -38338,10 +38997,10 @@ msgid "The uploaded file was invalid. Supported file extensions are %{extensions
msgstr ""
msgid "The user is being deleted."
-msgstr ""
+msgstr "පරිà·à·“ලකය෠මක෠දà·à¶¸à·™à¶¸à·’න්."
msgid "The user map has been saved. Continue by selecting the projects you want to import."
-msgstr ""
+msgstr "පරිà·à·“ලක සිතියම සුරà·à¶šà·’ණි. ඔබට ආයà·à¶­ කිරීමට අවà·à·Šâ€à¶º ව්â€à¶ºà·à¶´à·˜à¶­à·’ තේරීමෙන් ඉදිරියට යන්න."
msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
msgstr ""
@@ -38353,7 +39012,7 @@ msgid "The user you are trying to deactivate has been active in the past %{minim
msgstr ""
msgid "The username for the Jenkins server."
-msgstr ""
+msgstr "ජෙන්කින්ස් සේවà·à¶¯à·à¶ºà¶šà¶º සඳහ෠පරිà·à·“ලක නà·à¶¸à¶º."
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -38371,16 +39030,16 @@ msgid "The vulnerability is no longer detected. Verify the vulnerability has bee
msgstr ""
msgid "Theme"
-msgstr ""
+msgstr "තේමà·à·€"
msgid "There are currently no events."
-msgstr ""
+msgstr "දà·à¶±à¶§ සිදුවීම් නà·à¶­."
msgid "There are merge conflicts"
-msgstr ""
+msgstr "සංයුක්ත à¶à¶§à·Šà¶§à¶± තිබේ"
msgid "There are no %{replicableTypeName} to show"
-msgstr ""
+msgstr "පෙන්වීමට කිසිදු %{replicableTypeName} නà·à¶­"
msgid "There are no GPG keys associated with this account."
msgstr ""
@@ -38395,13 +39054,13 @@ msgid "There are no SSH keys with access to your account."
msgstr ""
msgid "There are no Spam Logs"
-msgstr ""
+msgstr "අයà·à¶ à·’ත සටහන් නà·à¶­"
msgid "There are no abuse reports!"
msgstr ""
msgid "There are no archived projects yet"
-msgstr ""
+msgstr "තවම සංරක්â€à·‚ිත ව්â€à¶ºà·à¶´à·˜à¶­à·’ නà·à¶­"
msgid "There are no archived requirements"
msgstr ""
@@ -38410,10 +39069,10 @@ msgid "There are no archived test cases"
msgstr ""
msgid "There are no changes"
-msgstr ""
+msgstr "වෙනස්කම් නà·à¶­"
msgid "There are no charts configured for this page"
-msgstr ""
+msgstr "මෙම පිටුව සඳහ෠වින්â€à¶ºà·à·ƒà¶œà¶­ ප්â€à¶»à·ƒà·Šà¶®à·à¶» නà·à¶­"
msgid "There are no closed epics"
msgstr ""
@@ -38422,7 +39081,7 @@ msgid "There are no closed issues"
msgstr ""
msgid "There are no closed merge requests"
-msgstr ""
+msgstr "à·€à·à·ƒà·– සංයුක්ත ඉල්ලීම් නà·à¶­"
msgid "There are no commits yet."
msgstr ""
@@ -38434,10 +39093,10 @@ msgid "There are no issues to show"
msgstr ""
msgid "There are no issues with the selected labels"
-msgstr ""
+msgstr "තà·à¶»à·à¶œà¶­à·Š නම්පත්වල ගà·à¶§à·…à·” නà·à¶­"
msgid "There are no matching files"
-msgstr ""
+msgstr "ගà·à·…පෙන ගොනු නà·à¶­"
msgid "There are no open epics"
msgstr ""
@@ -38446,22 +39105,25 @@ msgid "There are no open issues"
msgstr ""
msgid "There are no open merge requests"
-msgstr ""
+msgstr "විවෘත සංයුක්ත ඉල්ලීම් නà·à¶­"
msgid "There are no open requirements"
-msgstr ""
+msgstr "විවෘත අවà·à·Šâ€à¶ºà¶­à· නà·à¶­"
msgid "There are no open test cases"
msgstr ""
msgid "There are no packages yet"
-msgstr ""
+msgstr "තවම ඇසුරුම් නà·à¶­"
msgid "There are no projects shared with this group yet"
+msgstr "මෙම සමූහය සමග තවම බෙද෠ගත් ව්â€à¶ºà·à¶´à·˜à¶­à·’ නà·à¶­"
+
+msgid "There are no secure files yet."
msgstr ""
msgid "There are no topics to show."
-msgstr ""
+msgstr "පෙන්වීමට මà·à¶­à·˜à¶šà· නà·à¶­."
msgid "There are no variables yet."
msgstr ""
@@ -38479,16 +39141,16 @@ msgid "There are several size limits in place."
msgstr ""
msgid "There is already a repository with that name on disk"
-msgstr ""
+msgstr "තà·à¶§à·’යේ එම නම සහිත කà·à·‚්ඨයක් දà·à¶±à¶§à¶¸à¶­à·Š ඇත"
msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
-msgstr ""
+msgstr "කිසිදු ප්â€à¶»à·ƒà·Šà¶®à·à¶» දත්තයක් නà·à¶­."
msgid "There is no data available."
-msgstr ""
+msgstr "කිසිදු දත්තයක් නà·à¶­."
msgid "There is no data available. Please change your selection."
msgstr ""
@@ -38497,7 +39159,7 @@ msgid "There is no seat left to activate the member"
msgstr ""
msgid "There is no table data available."
-msgstr ""
+msgstr "කිසිදු වගුවක දත්ත නොතිබේ."
msgid "There is too much data to calculate. Please change your selection."
msgstr ""
@@ -38505,23 +39167,29 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem fetching branches."
+msgid "There was a problem fetching CRM contacts."
msgstr ""
-msgid "There was a problem fetching emojis."
+msgid "There was a problem fetching CRM organizations."
msgstr ""
+msgid "There was a problem fetching branches."
+msgstr "à·à·à¶›à· ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
+
+msgid "There was a problem fetching emojis."
+msgstr "ඉමà·à¶¢à·’ ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
+
msgid "There was a problem fetching epics."
msgstr ""
msgid "There was a problem fetching groups."
-msgstr ""
+msgstr "සමූහ ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching iterations."
msgstr ""
msgid "There was a problem fetching labels."
-msgstr ""
+msgstr "නම්පත් ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching linked pipelines."
msgstr ""
@@ -38530,22 +39198,22 @@ msgid "There was a problem fetching milestones."
msgstr ""
msgid "There was a problem fetching project branches."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ à·à·à¶›à· ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching project tags."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ අනන්â€à¶ºà¶± ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching project users."
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ පරිà·à·“ලකයින් ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching recent groups."
-msgstr ""
+msgstr "මෑත සමූහ ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching recent projects."
-msgstr ""
+msgstr "මෑත ව්â€à¶ºà·à¶´à·˜à¶­à·’ ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching releases."
-msgstr ""
+msgstr "නිකුතු ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching the job token scope value"
msgstr ""
@@ -38560,16 +39228,16 @@ msgid "There was a problem fetching the pipeline stages."
msgstr ""
msgid "There was a problem fetching the projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි"
msgid "There was a problem fetching users."
-msgstr ""
+msgstr "පරිà·à·“ලකයින් ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem handling the pipeline data."
msgstr ""
msgid "There was a problem sending the confirmation email"
-msgstr ""
+msgstr "තහවුරු කිරීමේ වි-තà·à¶´à·‘ල යà·à·€à·“මේ දී ගà·à¶§à¶½à·”වකි"
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
@@ -38578,49 +39246,49 @@ msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
-msgstr ""
+msgstr "කළ යුතු දෙයක් එකතු කිරීමේදී දà·à·‚යකි."
msgid "There was an error creating the dashboard, branch name is invalid."
-msgstr ""
+msgstr "උපකරණ පුවරුව සෑදීමේදී දà·à·‚යකි, à·à·à¶›à·à·€à·š නම වලංගු නොවේ."
msgid "There was an error creating the dashboard, branch named: %{branch} already exists."
-msgstr ""
+msgstr "උපකරණ පුවරුව සෑදීමේදී දà·à·‚යකි, %{branch} à·à·à¶›à·à·€ දà·à¶±à¶§à¶¸à¶­à·Š පවතී."
msgid "There was an error creating the issue"
msgstr ""
msgid "There was an error deleting the To Do."
-msgstr ""
+msgstr "කළ යුතු දෑ මà·à¶šà·“මේ දී දà·à·‚යකි."
msgid "There was an error fetching configuration for charts"
-msgstr ""
+msgstr "ප්â€à¶»à·ƒà·Šà¶®à·à¶» සඳහ෠වින්â€à¶ºà·à·ƒà¶º ගà·à¶±à·“මේ දී දà·à·‚යකි"
msgid "There was an error fetching data for the selected stage"
-msgstr ""
+msgstr "තà·à¶»à·à¶œà¶­à·Š අදියර සඳහ෠දත්ත ගà·à¶±à·“මේ දී දà·à·‚යකි"
msgid "There was an error fetching data for the tasks by type chart"
msgstr ""
msgid "There was an error fetching label data for the selected group"
-msgstr ""
+msgstr "තà·à¶»à·à¶œà¶­à·Š සමූහය සඳහ෠නම්පත් දත්ත ගà·à¶±à·“මේ දී දà·à·‚යකි"
msgid "There was an error fetching median data for stages"
msgstr ""
msgid "There was an error fetching projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ ගà·à¶±à·“මේ දී දà·à·‚යකි"
msgid "There was an error fetching stage total counts"
msgstr ""
msgid "There was an error fetching the %{replicableType}"
-msgstr ""
+msgstr "%{replicableType} ගà·à¶±à·“මේ දී දà·à·‚යකි"
msgid "There was an error fetching the deploy freezes."
msgstr ""
msgid "There was an error fetching the environments information."
-msgstr ""
+msgstr "පරිසරයේ තොරතුරු ගà·à¶±à·“මේ දී දà·à·‚යකි."
msgid "There was an error fetching the jobs for your project."
msgstr ""
@@ -38635,25 +39303,25 @@ msgid "There was an error fetching value stream analytics stages."
msgstr ""
msgid "There was an error gathering the chart data"
-msgstr ""
+msgstr "ප්â€à¶»à·ƒà·Šà¶®à·à¶» දත්ත රà·à·ƒà·Š කිරීමේදී දà·à·‚යකි"
msgid "There was an error getting the epic participants."
msgstr ""
msgid "There was an error importing the Jira project."
-msgstr ""
+msgstr "ජිර෠ව්â€à¶ºà·à¶´à·˜à¶­à·’ය ආයà·à¶­ කිරීමේදී දà·à·‚යකි."
msgid "There was an error loading related feature flags"
msgstr ""
msgid "There was an error loading users activity calendar."
-msgstr ""
+msgstr "පරිà·à·“ලක ක්â€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š දිනදසුන පූරණය කිරීමේදී දà·à·‚යකි."
msgid "There was an error parsing the data for this graph."
msgstr ""
msgid "There was an error removing the e-mail."
-msgstr ""
+msgstr "වි-තà·à¶´à·‘ල ඉවත් කිරීමේදී දà·à·‚යකි."
msgid "There was an error resetting group pipeline minutes."
msgstr ""
@@ -38662,31 +39330,31 @@ msgid "There was an error resetting user pipeline minutes."
msgstr ""
msgid "There was an error retrieving the Jira users."
-msgstr ""
+msgstr "ජිර෠පරිà·à·“ලකයින් ලබ෠ගà·à¶±à·“මේ දà·à·‚යකි."
msgid "There was an error saving your changes."
-msgstr ""
+msgstr "ඔබගේ වෙනස්කම් සුරà·à¶šà·“මේ දà·à·‚යකි."
msgid "There was an error subscribing to this label."
msgstr ""
msgid "There was an error syncing project %{name}"
-msgstr ""
+msgstr "%{name} ව්â€à¶ºà·à¶´à·˜à¶­à·’ය සමමුහූර්ත වීමේ දà·à·‚යකි"
msgid "There was an error syncing the %{replicableType}"
-msgstr ""
+msgstr "%{replicableType} සමමුහූර්ත කිරීමේදී දà·à·‚යකි"
msgid "There was an error trying to validate your query"
msgstr ""
msgid "There was an error updating the Maintenance Mode Settings"
-msgstr ""
+msgstr "නඩත්තු ආකà·à¶»à¶ºà·š à·ƒà·à¶šà·ƒà·”ම් යà·à·€à¶­à·Šà¶šà·à¶½ කිරීමේදී දà·à·‚යක් ඇති විය"
msgid "There was an error updating the dashboard, branch name is invalid."
-msgstr ""
+msgstr "උපකරණ පුවරුව යà·à·€à¶­à·Šà¶šà·à¶½à¶ºà·šà¶¯à·“ දà·à·‚යක් ඇති විය, à·à·à¶›à·à·€à·š නම à·€à·à¶»à¶¯à·’ය."
msgid "There was an error updating the dashboard, branch named: %{branch} already exists."
-msgstr ""
+msgstr "උපකරණ පුවරුව යà·à·€à¶­à·Šà¶šà·à¶½à¶ºà·šà¶¯à·“ දà·à·‚යක් ඇති විය, %{branch} à·à·à¶›à·à·€ පවතී."
msgid "There was an error when reseting email token."
msgstr ""
@@ -38776,7 +39444,7 @@ msgid "This Project is currently archived and read-only. Please unarchive the pr
msgstr ""
msgid "This URL already exists."
-msgstr ""
+msgstr "මෙම ඒ.ස.නි. පවතී."
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -39016,7 +39684,7 @@ msgid "This is the number of %{billable_users_link_start}billable users%{link_en
msgstr ""
msgid "This is your current session"
-msgstr ""
+msgstr "මෙය ඔබගේ වත්මන් à·€à·à¶»à¶ºà¶ºà·’"
msgid "This issue cannot be assigned to a confidential epic because it is public."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39172,10 +39837,10 @@ msgid "This merge request is from an internal project to a public project."
msgstr ""
msgid "This merge request is locked."
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම අගුලු ල෠ඇත."
msgid "This merge request was merged. To apply this suggestion, edit this file directly."
-msgstr ""
+msgstr "සංයුක්ත ඉල්ලීම ඒකà·à¶¶à¶¯à·Šà¶°à¶ºà·’. මෙම යà·à¶¢à¶±à·à·€ යෙදීමට, ගොනුව සෘජුව සංස්කරණය කරන්න."
msgid "This namespace has already been taken! Please choose another one."
msgstr ""
@@ -39184,7 +39849,7 @@ msgid "This only applies to repository indexing operations."
msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
-msgstr ""
+msgstr "ඔබට ව්â€à¶ºà·à¶´à·˜à¶­à·’ කිහිපයක් හරහ෠තොරතුරු කියවීමට ඉඩ නà·à¶­à·’ නිස෠මෙම පිටුව නොතිබේ."
msgid "This page sends a payload. Go back to the events page to see a newly created event."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39283,7 +39951,7 @@ msgid "This suggestion already matches its content."
msgstr ""
msgid "This title already exists."
-msgstr ""
+msgstr "මෙම සිරà·à·ƒà·’ය පවතී."
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -39301,10 +39969,10 @@ msgid "This user has no active %{type}."
msgstr ""
msgid "This user has no identities"
-msgstr ""
+msgstr "මෙම පුද්ගලයà·à¶§ අනන්â€à¶ºà¶­à·à·€à¶šà·Š නà·à¶­"
msgid "This user has no personal projects."
-msgstr ""
+msgstr "මෙම පුද්ගලයà·à¶§ පුද්ගලික ව්â€à¶ºà·à¶´à·˜à¶­à·’ නà·à¶­."
msgid "This user has previously committed to the %{name} project."
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr "වේලà·à·€"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr "කà·à¶½à¶º පà·à¶¯à¶š: ඔව්"
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39605,7 +40270,7 @@ msgid "Title"
msgstr "සිරà·à·ƒà·’ය"
msgid "Title (required)"
-msgstr ""
+msgstr "සිරà·à·ƒà·’ය (අවà·à·Šâ€à¶ºà¶ºà·’)"
msgid "Title:"
msgstr "සිරà·à·ƒà·’ය:"
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39815,10 +40477,10 @@ msgid "To widen your search, change or remove filters above."
msgstr ""
msgid "To-Do"
-msgstr ""
+msgstr "කළ යුතු"
msgid "To-Do List"
-msgstr ""
+msgstr "කළ යුතු ලේඛනය"
msgid "To-do item successfully marked as done."
msgstr ""
@@ -39827,25 +40489,25 @@ msgid "Today"
msgstr "අද"
msgid "Todos count"
-msgstr ""
+msgstr "කළ යුතු ගණන"
msgid "Todos|Are you looking for things to do? Take a look at %{strongStart}%{openIssuesLinkStart}open issues%{openIssuesLinkEnd}%{strongEnd}, contribute to %{strongStart}%{mergeRequestLinkStart}a merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}, or mention someone in a comment to automatically assign them a new to-do item."
msgstr ""
msgid "Todos|Filter by author"
-msgstr ""
+msgstr "කතෘට අනුව පෙරන්න"
msgid "Todos|Filter by group"
-msgstr ""
+msgstr "සමූහය අනුව පෙරන්න"
msgid "Todos|Filter by project"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය අනුව පෙරන්න"
msgid "Todos|It's how you always know what to work on next."
msgstr ""
msgid "Todos|Mark all as done"
-msgstr ""
+msgstr "සියල්ල අහවර බව යොදන්න"
msgid "Todos|Nothing is on your to-do list. Nice work!"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr "බොහ෠පරිà·à·“ලකයින් හමු විය. ඉක්මන් ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œ බොහ෠දුරට %{max_count} දෙනෙකුට සීම෠වේ"
+
msgid "TopNav|Go back"
msgstr "ආපසු යන්න"
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr "1000+"
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40100,7 +40771,7 @@ msgid "TransferProject|You don't have permission to transfer this project."
msgstr ""
msgid "Tree view"
-msgstr ""
+msgstr "à·à·à¶›à·“ය දà·à¶šà·Šà¶¸"
msgid "Trending"
msgstr ""
@@ -40166,10 +40837,7 @@ msgid "Trial|Number of employees"
msgstr "සේවක සංඛ්â€à¶ºà·à·€"
msgid "Trial|Please select a country"
-msgstr ""
-
-msgid "Trial|Successful trial activation image"
-msgstr ""
+msgstr "රටක් තà·à¶»à¶±à·Šà¶±"
msgid "Trial|Telephone number"
msgstr "දුරකථන අංකය"
@@ -40235,10 +40903,7 @@ msgid "Trigger|Trigger user has insufficient permissions to project"
msgstr ""
msgid "Trigger|invalid"
-msgstr ""
-
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
+msgstr "වලංගු නà·à¶­"
msgid "Trusted"
msgstr "විà·à·Šà·€à·à·ƒà·“"
@@ -40247,10 +40912,10 @@ msgid "Trusted applications are automatically authorized on GitLab OAuth flow. I
msgstr ""
msgid "Try again"
-msgstr ""
+msgstr "යළි උත්සහය"
msgid "Try again?"
-msgstr ""
+msgstr "යළි උත්සහයක්ද?"
msgid "Try all GitLab features for free for 30 days. No credit card required."
msgstr ""
@@ -40259,7 +40924,7 @@ msgid "Try all GitLab has to offer for 30 days."
msgstr ""
msgid "Try changing or removing filters."
-msgstr ""
+msgstr "පෙරහන් සංà·à·à¶°à¶±à¶ºà¶§ හ෠ඉවතලීමට බලන්න."
msgid "Try grouping with different labels"
msgstr ""
@@ -40289,16 +40954,16 @@ msgid "Tuesday"
msgstr "අඟහරුවà·à¶¯à·"
msgid "Turn off"
-msgstr ""
+msgstr "අක්â€à¶»à·’ය කරන්න"
msgid "Turn off notifications"
-msgstr ""
+msgstr "දà·à¶±à·”ම්දීම් අක්â€à¶»à·’ය කරන්න"
msgid "Turn on"
-msgstr ""
+msgstr "සක්â€à¶»à·’ය කරන්න"
msgid "Turn on notifications"
-msgstr ""
+msgstr "දà·à¶±à·”ම්දීම් සක්â€à¶»à·’ය කරන්න"
msgid "Twitter"
msgstr "ට්විටර්"
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40346,7 +41014,7 @@ msgid "Type"
msgstr "වර්ගය"
msgid "U2F Devices (%{length})"
-msgstr ""
+msgstr "U2F උපà·à¶‚ග (%{length})"
msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details."
msgstr ""
@@ -40355,13 +41023,13 @@ msgid "URL"
msgstr "ඒ.ස.නි."
msgid "URL cannot be blank"
-msgstr ""
+msgstr "ඒ.à·ƒ.නි. හිස්විය නොහà·à¶šà·’ය"
msgid "URL is invalid"
-msgstr ""
+msgstr "ඒ.à·ƒ.නි. à·€à·à¶»à¶¯à·’ය"
msgid "URL is required"
-msgstr ""
+msgstr "ඒ.à·ƒ.නි. අවà·à·Šâ€à¶ºà¶ºà·’"
msgid "URL is triggered for each branch updated to the repository"
msgstr ""
@@ -40391,7 +41059,7 @@ msgid "URL of the external storage to serve the repository static objects."
msgstr ""
msgid "URL or request ID"
-msgstr ""
+msgstr "ඒ.à·ƒ.නි. / ඉල්ලීම් à·„à·à¶³à·”."
msgid "USER %{user_name} WILL BE REMOVED! Are you sure?"
msgstr ""
@@ -40412,26 +41080,20 @@ msgid "Unable to build Slack link."
msgstr ""
msgid "Unable to collect CPU info"
-msgstr ""
+msgstr "CPU තොරතුරු රà·à·ƒà·Š කළ නොහà·à¶šà·’ය"
msgid "Unable to collect memory info"
-msgstr ""
-
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
+msgstr "මතකයේ තොරතුරු රà·à·ƒà·Š කළ නොහà·à¶šà·’ය"
msgid "Unable to connect to Prometheus server"
-msgstr ""
+msgstr "ප්â€à¶»à·à¶¸à·’තියස් සේවà·à¶¯à·à¶ºà¶šà¶ºà¶§ සබà·à¶³à·“මට නොහà·à¶šà·’ය"
msgid "Unable to connect to server: %{error}"
-msgstr ""
+msgstr "සේවà·à¶¯à·à¶ºà¶šà¶ºà¶§ සබà·à¶³à·“මට නොහà·à¶šà·’ය: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය අසංරක්â€à·‚ණය"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40541,10 +41203,10 @@ msgid "Undo"
msgstr "පෙරසේ"
msgid "Undo Ignore"
-msgstr ""
+msgstr "නොසà·à¶½à¶šà·“ම අහà·à·ƒà·’ය"
msgid "Undo ignore"
-msgstr ""
+msgstr "නොසà·à¶½à¶šà·“ම අහà·à·ƒà·’ය"
msgid "Unexpected error"
msgstr "අනපේක්â€à·‚ිත දà·à·‚යකි"
@@ -40556,13 +41218,13 @@ msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
msgid "Unhappy?"
-msgstr ""
+msgstr "අසතුටුයිද?"
msgid "Units|ms"
-msgstr ""
+msgstr "මි.තත්."
msgid "Units|s"
-msgstr ""
+msgstr "තත්."
msgid "Unknown"
msgstr "නොදනී"
@@ -40570,9 +41232,6 @@ msgstr "නොදනී"
msgid "Unknown Error"
msgstr "නොදන්න෠දà·à·‚යකි"
-msgid "Unknown cache key"
-msgstr "නොදන්න෠නිහිත යතුරකි"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40580,10 +41239,10 @@ msgid "Unknown format"
msgstr "නොදන්න෠ආකෘතියකි"
msgid "Unknown response text"
-msgstr ""
+msgstr "නොදන්න෠ප්â€à¶»à¶­à·’චà·à¶» පෙළ"
msgid "Unknown screen"
-msgstr ""
+msgstr "නොදන්න෠තිරය"
msgid "Unknown user"
msgstr "නොදන්න෠පරිà·à·“ලකයෙකි"
@@ -40624,12 +41283,6 @@ msgstr "à·ƒà·à¶šà¶ à·Šà¶¡à·à·€ අගුළු à·„à·à¶» ඇත."
msgid "Unlocks the discussion."
msgstr "à·ƒà·à¶šà¶ à·Šà¶¡à·à·€ අගුළු හරියි."
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr "ළඟ෠විය නොහà·à¶šà·’ය"
@@ -40727,7 +41380,7 @@ msgid "Update broadcast message"
msgstr ""
msgid "Update failed"
-msgstr ""
+msgstr "යà·à·€à¶­à·Šà¶šà·à¶½à¶º අසමත්!"
msgid "Update it"
msgstr "එය යà·à·€à¶­à·Šà¶šà·à¶½ කරන්න"
@@ -40772,13 +41425,13 @@ msgid "UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes"
msgstr ""
msgid "Updated"
-msgstr ""
+msgstr "යà·à·€à¶­à·Šà¶šà·à¶½ විය"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
msgid "Updated date"
-msgstr ""
+msgstr "යà·à·€à¶­à·Šà¶šà·à¶½ කළ දිනය"
msgid "Updating"
msgstr "යà·à·€à¶­à·Šà¶šà·à¶½ වෙමින්"
@@ -40817,25 +41470,22 @@ msgid "Upload file"
msgstr "ගොනුව උඩුගත කරන්න"
msgid "Upload image"
-msgstr ""
+msgstr "රූපය යොදන්න"
msgid "Upload new file"
-msgstr ""
+msgstr "ගොනුව යෙà·à¶¯à¶±à·Šà¶±"
msgid "Upload object map"
-msgstr ""
+msgstr "වස්තු සිතියම යොදන්න"
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
-msgstr ""
+msgid "Uploaded date"
+msgstr "උඩුගත කළ දිනය"
msgid "Uploading changes to terminal"
-msgstr ""
+msgstr "අග්â€à¶»à¶ºà¶§ වෙනස්කම් උඩුගත වෙමින්"
msgid "Uploading..."
-msgstr ""
+msgstr "උඩුගත වෙමින්..."
msgid "Upstream"
msgstr ""
@@ -40850,7 +41500,7 @@ msgid "Usage Trends"
msgstr ""
msgid "Usage statistics"
-msgstr ""
+msgstr "භà·à·€à·’ත සංඛ්â€à¶ºà·à¶½à·šà¶›à¶±"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
@@ -40873,23 +41523,20 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
-msgstr ""
+msgstr "අතිිරේක විනà·à¶©à·’ මිලදී ගන්න"
msgid "UsageQuota|Buy storage"
-msgstr ""
+msgstr "ආචයනය මිලදී ගන්න"
msgid "UsageQuota|CI minutes usage by month"
-msgstr ""
+msgstr "මà·à·ƒà·’ක CI විනà·à¶©à·’ භà·à·€à·’තය"
msgid "UsageQuota|CI minutes usage by project"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යකට CI විනà·à¶©à·’ භà·à·€à·’තය"
msgid "UsageQuota|CI/CD minutes usage"
-msgstr ""
+msgstr "CI/CD විනà·à¶©à·’ භà·à·€à·’තය"
msgid "UsageQuota|CI/CD minutes usage since %{timeElapsed}"
msgstr ""
@@ -40904,7 +41551,7 @@ msgid "UsageQuota|Current period usage"
msgstr ""
msgid "UsageQuota|Dependency proxy"
-msgstr ""
+msgstr "පරà·à¶ºà¶­à·Šà¶­ ප්â€à¶»à¶­à·’යුක්තය"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
@@ -40928,7 +41575,7 @@ msgid "UsageQuota|Increase storage temporarily"
msgstr ""
msgid "UsageQuota|LFS storage"
-msgstr ""
+msgstr "LFS ආචයනය"
msgid "UsageQuota|Learn more about excess storage usage"
msgstr ""
@@ -40964,7 +41611,7 @@ msgid "UsageQuota|Purchase more storage"
msgstr ""
msgid "UsageQuota|Purchased storage"
-msgstr ""
+msgstr "මිලදී ගත් ආචයනය"
msgid "UsageQuota|Purchased storage available"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "ආචයනය"
@@ -41003,7 +41653,7 @@ msgid "UsageQuota|Storage type"
msgstr "ආචයන වර්ගය"
msgid "UsageQuota|Storage used"
-msgstr ""
+msgstr "භà·à·€à·’ත෠කළ ආචයනය"
msgid "UsageQuota|The table below shows current period usage"
msgstr ""
@@ -41114,7 +41764,7 @@ msgid "UsageTrends|Issues & merge requests"
msgstr ""
msgid "UsageTrends|Items"
-msgstr ""
+msgstr "අථක"
msgid "UsageTrends|Merge requests"
msgstr "සංයුක්ත ඉල්ලීම්"
@@ -41123,7 +41773,7 @@ msgid "UsageTrends|Month"
msgstr "මà·à·ƒà¶º"
msgid "UsageTrends|No data available."
-msgstr ""
+msgstr "දත්ත නොතිබේ."
msgid "UsageTrends|Pipelines"
msgstr ""
@@ -41243,7 +41893,7 @@ msgid "Use slash commands."
msgstr ""
msgid "Use template"
-msgstr ""
+msgstr "අච්චුව භà·à·€à·’තය"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
@@ -41414,22 +42064,22 @@ msgid "UserLists|Feature flag user list"
msgstr ""
msgid "UserLists|Get started with user lists"
-msgstr ""
+msgstr "පුද්ගල ලේඛන සමඟ අරඹන්න"
msgid "UserLists|Lists allow you to define a set of users to be used with feature flags. %{linkStart}Read more about feature flag lists.%{linkEnd}"
msgstr ""
msgid "UserLists|Loading user lists"
-msgstr ""
+msgstr "පුද්ගල ලේඛන පූරණය වෙමින්"
msgid "UserLists|Name"
msgstr "නම"
msgid "UserLists|New list"
-msgstr ""
+msgstr "නව ලේඛනය"
msgid "UserLists|New user list"
-msgstr ""
+msgstr "නව පුද්ගල ලේඛනය"
msgid "UserLists|Save"
msgstr "සුරකින්න"
@@ -41447,13 +42097,13 @@ msgid "UserLists|User IDs"
msgstr "පරිà·à·“ලක à·„à·à¶³à·”."
msgid "UserLists|User Lists"
-msgstr ""
+msgstr "පුද්ගල ලේඛන"
msgid "UserLists|User lists allow you to define a set of users to use with Feature Flags."
msgstr ""
msgid "UserList|Delete %{name}?"
-msgstr ""
+msgstr "%{name} මකන්නද?"
msgid "UserList|created %{timeago}"
msgstr ""
@@ -41528,7 +42178,7 @@ msgid "UserProfile|Star projects to track their progress and show your appreciat
msgstr ""
msgid "UserProfile|Starred projects"
-msgstr ""
+msgstr "තරු යෙදූ ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "UserProfile|Subscribe"
msgstr ""
@@ -41555,7 +42205,7 @@ msgid "UserProfile|This user isn't following other users."
msgstr ""
msgid "UserProfile|Unconfirmed user"
-msgstr ""
+msgstr "තහවුරු නොකළ පරිà·à·“ලක"
msgid "UserProfile|View all"
msgstr "සියල්ල දකින්න"
@@ -41597,7 +42247,7 @@ msgid "Username is already taken."
msgstr "පරිà·à·“ලක නà·à¶¸à¶º ගෙන ඇත."
msgid "Username is available."
-msgstr ""
+msgstr "පරිà·à·“ලක නà·à¶¸à¶º තිබේ."
msgid "Username or email"
msgstr "පරිà·à·“ලක නà·à¶¸à¶º හ෠වි-තà·à¶´à·‘ල"
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr "බලපත්â€à¶»à¶ºà·™à·„à·’ පරිà·à·“ලකයින්"
@@ -41630,7 +42286,7 @@ msgid "Users or groups set as approvers in the project's or merge request's sett
msgstr ""
msgid "Users over License"
-msgstr ""
+msgstr "බලපත්â€à¶»à¶º ඉක්මවූ ගණන"
msgid "Users requesting access to"
msgstr ""
@@ -41675,7 +42331,7 @@ msgid "Valid From"
msgstr ""
msgid "Validate"
-msgstr ""
+msgstr "වලංගුකරණය"
msgid "Validate your GitLab CI configuration"
msgstr ""
@@ -41708,7 +42364,7 @@ msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
-msgstr ""
+msgstr "අගය ධà·à¶»à·à·€"
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
@@ -41875,19 +42531,16 @@ msgid "Version %{versionNumber} (latest)"
msgstr ""
msgid "VersionCheck|Up to date"
-msgstr ""
+msgstr "යà·à·€à¶­à·Šà¶šà·à¶½à·“නයි"
msgid "VersionCheck|Update ASAP"
msgstr ""
msgid "VersionCheck|Update available"
-msgstr ""
+msgstr "යà·à·€à¶­à·Šà¶šà·à¶½à¶ºà¶šà·Š තිබේ"
msgid "VersionCheck|Your GitLab Version"
-msgstr ""
-
-msgid "View Documentation"
-msgstr ""
+msgstr "ඔබගේ ගිට්ලà·à¶¶à·Š අනුවà·à¶¯à¶º"
msgid "View Stage: %{title}"
msgstr ""
@@ -41899,7 +42552,7 @@ msgid "View alert details."
msgstr ""
msgid "View all environments."
-msgstr ""
+msgstr "සියළු පරිසර බලන්න."
msgid "View all issues"
msgstr ""
@@ -41925,16 +42578,13 @@ msgid "View deployment"
msgstr ""
msgid "View details"
-msgstr ""
+msgstr "විස්තර බලන්න"
msgid "View details: %{details_url}"
-msgstr ""
+msgstr "විස්තර බලන්න: %{details_url}"
msgid "View documentation"
-msgstr ""
-
-msgid "View downstream pipeline"
-msgstr ""
+msgstr "ප්â€à¶»à¶½à·šà¶›à¶±à¶º බලන්න"
msgid "View eligible approvers"
msgstr ""
@@ -41948,22 +42598,22 @@ msgstr[0] ""
msgstr[1] ""
msgid "View file @ "
-msgstr ""
+msgstr "@ ගොනුව බලන්න"
msgid "View file @ %{commitSha}"
-msgstr ""
+msgstr "ගොනුව බලන්න @ %{commitSha}"
msgid "View full dashboard"
-msgstr ""
+msgstr "උපකරණ පුවරුව බලන්න"
msgid "View full log"
-msgstr ""
+msgstr "පූර්ණ සටහන බලන්න"
msgid "View group in admin area"
msgstr ""
msgid "View group labels"
-msgstr ""
+msgstr "සමූහයේ නම්පත් බලන්න"
msgid "View group pipeline usage quota"
msgstr ""
@@ -41984,7 +42634,7 @@ msgid "View issues"
msgstr ""
msgid "View it on GitLab"
-msgstr ""
+msgstr "ගිට්ලà·à¶¶à·Š à·„à·’ බලන්න"
msgid "View job"
msgstr ""
@@ -41996,45 +42646,45 @@ msgid "View jobs"
msgstr ""
msgid "View labels"
-msgstr ""
+msgstr "නම්පත් බලන්න"
msgid "View log"
-msgstr ""
+msgstr "සටහන බලන්න"
msgid "View logs"
-msgstr ""
+msgstr "සටහන් බලන්න"
msgid "View milestones"
msgstr ""
msgid "View on %{url}"
-msgstr ""
+msgstr "%{url} හි බලන්න"
msgid "View open merge request"
msgstr ""
msgid "View page @ "
-msgstr ""
+msgstr "@ පිටුව බලන්න"
msgid "View performance dashboard."
msgstr ""
msgid "View project"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය බලන්න"
msgid "View project in admin area"
-msgstr ""
+msgstr "පරිපà·à¶½à¶š ප්â€à¶»à¶¯à·šà·à¶ºà·š ව්â€à¶ºà·à¶´à·˜à¶­à·’ය බලන්න"
msgid "View project labels"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ නම්පත් බලන්න"
msgid "View public GPG key"
msgid_plural "View public GPG keys"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "පොදු ජීපීජී යතුර බලන්න"
+msgstr[1] "පොදු ජීපීජී යතුරු බලන්න"
msgid "View replaced file @ "
-msgstr ""
+msgstr "ප්â€à¶»à¶­à·’ස්ථà·à¶´à·’ත ගොනුව බලන්න @ "
msgid "View seat usage"
msgstr ""
@@ -42046,7 +42696,7 @@ msgid "View the %{code_open}last_activity_at%{code_close} attribute for %{projec
msgstr ""
msgid "View the documentation"
-msgstr ""
+msgstr "ප්â€à¶»à¶½à·šà¶›à¶±à¶º බලන්න"
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -42055,10 +42705,10 @@ msgid "View the performance dashboard at"
msgstr ""
msgid "View usage details"
-msgstr ""
+msgstr "භà·à·€à·’ත විස්තර බලන්න"
msgid "View users statistics"
-msgstr ""
+msgstr "පරිà·à·“ලක සංඛ්â€à¶ºà·à¶½à·šà¶›à¶± බලන්න"
msgid "Viewed"
msgstr ""
@@ -42310,7 +42960,7 @@ msgid "Vulnerability|Bug Bounty"
msgstr ""
msgid "Vulnerability|CVSS v3"
-msgstr ""
+msgstr "CVSS අනු.3"
msgid "Vulnerability|Class"
msgstr ""
@@ -42337,7 +42987,7 @@ msgid "Vulnerability|Description"
msgstr "සවිස්තරය"
msgid "Vulnerability|Details"
-msgstr ""
+msgstr "විස්තර"
msgid "Vulnerability|Detected"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42580,10 +43230,10 @@ msgid "Web IDE"
msgstr ""
msgid "Web Terminal"
-msgstr ""
+msgstr "වියමන අග්â€à¶»à¶º"
msgid "Web terminal"
-msgstr ""
+msgstr "වියමන අග්â€à¶»à¶º"
msgid "WebAuthn Devices (%{length})"
msgstr ""
@@ -42793,7 +43443,7 @@ msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Website"
-msgstr ""
+msgstr "වියමන අඩවිය"
msgid "Website:"
msgstr "වියමන අඩවිය:"
@@ -43065,13 +43715,13 @@ msgid "WikiPage|Edit rich text"
msgstr ""
msgid "WikiPage|Edit source"
-msgstr ""
+msgstr "මූලà·à·à·Šâ€à¶»à¶º සංස්කරණය"
msgid "WikiPage|Format"
msgstr "ආකෘතිය"
msgid "WikiPage|Learn more."
-msgstr ""
+msgstr "තව දà·à¶±à¶œà¶±à·Šà¶±."
msgid "WikiPage|Page title"
msgstr "පිටුවේ සිරà·à·ƒà·’ය"
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43164,24 +43817,41 @@ msgid "Work in progress Limit"
msgstr ""
msgid "WorkItem|Add"
-msgstr ""
+msgstr "එකතු"
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
-msgstr ""
+msgstr "අවලංගු"
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr "වස෠ඇත"
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,14 +43863,14 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
-msgstr ""
-
msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
+msgid "WorkItem|Open"
+msgstr "විවෘත"
+
msgid "WorkItem|Select type"
-msgstr ""
+msgstr "වර්ගය තà·à¶»à¶±à·Šà¶±"
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -43218,7 +43888,7 @@ msgid "WorkItem|Something went wrong while updating the work item. Please try ag
msgstr ""
msgid "WorkItem|Type"
-msgstr ""
+msgstr "වර්ගය"
msgid "WorkItem|Work Items"
msgstr ""
@@ -43263,7 +43933,7 @@ msgid "Xcode"
msgstr ""
msgid "YYYY-MM-DD"
-msgstr ""
+msgstr "YYY-MM-DD"
msgid "Yes"
msgstr "ඔව්"
@@ -43278,7 +43948,7 @@ msgid "Yes, close issue"
msgstr ""
msgid "Yes, delete project"
-msgstr ""
+msgstr "ඔව්, ව්â€à¶ºà·à¶´à·˜à¶­à·’ය මකන්න"
msgid "Yesterday"
msgstr "ඊයේ"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43454,7 +44124,7 @@ msgid "You can check it in your in your personal access tokens settings %{pat_li
msgstr ""
msgid "You can create a new %{link}."
-msgstr ""
+msgstr "ඔබට නව %{link} සෑදීමට à·„à·à¶šà·’ය."
msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
msgstr ""
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43798,7 +44468,7 @@ msgid "You have successfully purchased a %{plan} plan subscription for %{seats}.
msgstr ""
msgid "You have unsaved changes"
-msgstr ""
+msgstr "ඔබට නොසුරà·à¶šà·’ වෙනස්කම් ඇත"
msgid "You left the \"%{membershipable_human_name}\" %{source_type}."
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44005,7 +44684,7 @@ msgid "Your DevOps Reports give an overview of how you are using GitLab from a f
msgstr ""
msgid "Your GPG keys (%{count})"
-msgstr ""
+msgstr "ඔබගේ ජීපීජී යතුරු (%{count})"
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
@@ -44035,7 +44714,7 @@ msgid "Your SSH key is expiring soon."
msgstr "ඔබගේ SSH යතුර ළඟදී කල් ඉකුත් වේ."
msgid "Your SSH key was deleted"
-msgstr ""
+msgstr "ඔබගේ SSH යතුර මක෠ඇත"
msgid "Your SSH keys (%{count})"
msgstr "ඔබගේ SSH යතුරු (%{count})"
@@ -44086,7 +44765,7 @@ msgid "Your applications (%{size})"
msgstr "ඔබගේ යෙදුම් (%{size})"
msgid "Your authorized applications"
-msgstr ""
+msgstr "ඔබගේ බලයලත් යෙදුම්"
msgid "Your browser does not support iFrames"
msgstr "ඔබගේ අතිරික්සුව අයිෆ්රේම්ස් සඳහ෠සහය නොදක්වයි"
@@ -44104,7 +44783,7 @@ msgid "Your changes have been committed. Commit %{commitId} %{commitStats}"
msgstr ""
msgid "Your changes have been saved"
-msgstr ""
+msgstr "ඔබගේ වෙනස්කම් සුරà·à¶šà·“ ඇත"
msgid "Your changes have been successfully committed."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr "ඔබගේ නව අදහස"
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr "ඔබගේ පà·à¶­à·’කඩ"
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr "ඔබගේ පරිà·à·“ලක නà·à¶¸à¶º %{username}."
@@ -44321,7 +45000,7 @@ msgid "ZentaoIntegration|Use ZenTao as this project's issue tracker."
msgstr ""
msgid "ZentaoIntegration|ZenTao"
-msgstr ""
+msgstr "සෙන්ටà·à¶•"
msgid "ZentaoIntegration|ZenTao API URL (optional)"
msgstr "සෙන්ටà·à¶• යෙ.ක්â€à¶».මු. ඒ.à·ƒ.නි. (වෛකල්පිතයි)"
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44544,8 +45241,8 @@ msgstr "සංයුක්ත කළ නොහà·à¶šà·’ය"
msgid "change"
msgid_plural "changes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "වෙනස"
+msgstr[1] "වෙනස්කම්"
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr "සියළු ව්â€à¶ºà·à¶´à·˜à¶­à·’"
@@ -44652,7 +45352,7 @@ msgid "ciReport|Cluster Image Scanning"
msgstr ""
msgid "ciReport|Code Quality"
-msgstr ""
+msgstr "කේත ගුණත්වය"
msgid "ciReport|Code Quality failed loading results"
msgstr ""
@@ -44701,16 +45401,16 @@ msgid "ciReport|Create issue"
msgstr ""
msgid "ciReport|DAST"
-msgstr ""
+msgstr "DAST"
msgid "ciReport|Dependency Scanning"
-msgstr ""
+msgstr "පරà·à¶ºà¶­à·Šà¶­ සුපිරික්සමින්"
msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
msgstr ""
msgid "ciReport|Dependency scanning"
-msgstr ""
+msgstr "පරà·à¶ºà¶­à·Šà¶­ සුපිරික්සමින්"
msgid "ciReport|Download patch to resolve"
msgstr ""
@@ -44737,10 +45437,10 @@ msgid "ciReport|Found %{issuesWithCount}"
msgstr ""
msgid "ciReport|Full Report"
-msgstr ""
+msgstr "පූර්ණ à·€à·à¶»à·Šà¶­à·à·€"
msgid "ciReport|IaC Scanning"
-msgstr ""
+msgstr "IaC සුපිරික්සමින්"
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
@@ -44778,7 +45478,7 @@ msgid "ciReport|Loading Code Quality report"
msgstr ""
msgid "ciReport|Manage Licenses"
-msgstr ""
+msgstr "බලපත්â€à¶» කළමනà·à¶šà¶»à¶«à¶º"
msgid "ciReport|Manage licenses"
msgstr "බලපත්â€à¶» කළමනà·à¶šà¶»à¶«à¶º"
@@ -44790,7 +45490,7 @@ msgid "ciReport|New"
msgstr "නව"
msgid "ciReport|No changes to Code Quality."
-msgstr ""
+msgstr "කේත ගුණත්වයට වෙනසක් නà·à¶­."
msgid "ciReport|No changes to code quality"
msgstr "කේතයේ ගුණත්වයට වෙනසක් නà·à¶­"
@@ -44799,22 +45499,22 @@ msgid "ciReport|No code quality issues found"
msgstr ""
msgid "ciReport|RPS"
-msgstr ""
+msgstr "RPS"
msgid "ciReport|Resolve with merge request"
msgstr ""
msgid "ciReport|SAST"
-msgstr ""
+msgstr "SAST"
msgid "ciReport|Secret Detection"
-msgstr ""
+msgstr "රහස් අනà·à·€à¶»à¶«à¶º"
msgid "ciReport|Secret Detection detects secrets and credentials vulnerabilities in your source code."
msgstr ""
msgid "ciReport|Secret detection"
-msgstr ""
+msgstr "රහස් අනà·à·€à¶»à¶«à¶º"
msgid "ciReport|Security reports failed loading results"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr "වස෠ඇත"
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44948,7 +45645,7 @@ msgid "data"
msgstr "දත්ත"
msgid "database"
-msgstr ""
+msgstr "දත්තසමුදà·à¶º"
msgid "date must not be after 9999-12-31"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr "පෙරනිමි à·à·à¶›à·à·€"
msgid "deleted"
msgstr "මක෠ඇත"
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr "සදහà·"
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr "සමූහ"
+msgid "groups and projects"
+msgstr "සමූහ හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’"
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45189,7 +45903,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "internal note"
-msgstr ""
+msgstr "අභ්â€à¶ºà¶±à·Šà¶­à¶» සටහන"
msgid "invalid milestone state `%{state}`"
msgstr ""
@@ -45312,19 +46026,19 @@ msgid "latest deployment"
msgstr ""
msgid "latest version"
-msgstr ""
+msgstr "අවසà·à¶± අනුවà·à¶¯à¶º"
msgid "leave %{group_name}"
msgstr "%{group_name} à·„à·à¶»à¶ºà¶±à·Šà¶±"
msgid "less than a minute"
-msgstr ""
+msgstr "විනà·à¶©à·’යකට වඩ෠අඩුය"
msgid "level: %{level}"
msgstr "මට්ටම: %{level}"
msgid "lfs objects"
-msgstr ""
+msgstr "lfs වස්තූන්"
msgid "limit of %{project_limit} reached"
msgstr ""
@@ -45349,8 +46063,8 @@ msgstr ""
msgid "member"
msgid_plural "members"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "à·ƒà·à¶¸à·à¶¢à·’කයà·"
+msgstr[1] "à·ƒà·à¶¸à·à¶¢à·’කයින්"
msgid "merge request"
msgid_plural "merge requests"
@@ -45447,6 +46161,12 @@ msgstr "අනුමà·à¶­à·’ය වෛකල්පිතයි"
msgid "mrWidget|Approval password is invalid."
msgstr "අනුමත මුරපදය වලංගු නොවේ."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "අනුමත"
@@ -45498,7 +46218,7 @@ msgid "mrWidget|Delete source branch"
msgstr ""
msgid "mrWidget|Deletes the source branch"
-msgstr ""
+msgstr "මූලà·à·à·Šâ€à¶» à·à·à¶›à·à·€ මක෠දමයි"
msgid "mrWidget|Deployment statistics are not available currently"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr "සංයුක්ත"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr "තව තොරතුරු"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr "%{item}, සහ %{lastItem}"
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "මුරපදය"
@@ -45852,7 +46587,7 @@ msgid "pending comment"
msgstr ""
msgid "pending deletion"
-msgstr ""
+msgstr "මà·à¶šà·“මට තිබෙන"
msgid "personal access token"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr "නොදනී"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "yaml වලංගු නොවේ"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr "ඔබගේ සමූහය (%{group_name})"
+
msgid "your settings"
msgstr "ඔබගේ à·ƒà·à¶šà·ƒà·”ම්"
@@ -46268,5 +47006,5 @@ msgid "{project}"
msgstr "{project}"
msgid "✔"
-msgstr ""
+msgstr "✔"
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index 48ec39b5d8a..569a5457348 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -374,6 +374,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -486,6 +500,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -865,9 +886,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1086,9 +1113,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1190,6 +1214,9 @@ msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1231,6 +1258,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1527,6 +1557,13 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1784,6 +1821,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2072,6 +2112,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2189,6 +2232,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2279,9 +2328,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2312,9 +2358,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2342,9 +2385,6 @@ 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 new issue"
msgstr ""
@@ -2594,9 +2634,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2846,6 +2883,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2918,6 +2958,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3143,7 +3186,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3152,6 +3195,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3194,6 +3240,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3221,6 +3270,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3296,6 +3348,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3323,6 +3381,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3341,6 +3402,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3353,9 +3417,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3404,9 +3474,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3425,6 +3492,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3491,6 +3561,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3971,6 +4044,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3983,12 +4059,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4031,9 +4101,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4046,9 +4113,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4061,12 +4125,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4226,6 +4296,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4445,6 +4518,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4455,6 +4531,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4662,6 +4741,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5062,7 +5144,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5168,6 +5250,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5186,6 +5271,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5303,6 +5391,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5400,9 +5491,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5476,6 +5564,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5500,6 +5591,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5509,6 +5603,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5524,6 +5624,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6016,9 +6119,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6421,6 +6521,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6721,6 +6827,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7042,6 +7151,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7138,6 +7250,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7181,6 +7296,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7508,6 +7626,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7679,9 +7800,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7933,6 +8051,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8050,6 +8171,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8426,6 +8550,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8444,6 +8571,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8453,9 +8697,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8823,9 +9064,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8865,6 +9103,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8910,9 +9151,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9090,10 +9328,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9270,6 +9520,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9661,6 +9914,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9697,10 +9953,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9892,9 +10148,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10120,9 +10373,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10858,6 +11111,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11552,6 +11808,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11585,6 +11844,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11633,13 +11901,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11771,6 +12039,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11981,6 +12252,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12186,12 +12460,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12204,9 +12472,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12300,9 +12568,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12348,6 +12613,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12459,6 +12727,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12600,13 +12895,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13235,6 +13518,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13716,9 +14002,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13935,10 +14218,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13968,9 +14251,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14121,9 +14401,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14262,9 +14539,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14280,6 +14554,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14463,9 +14737,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14586,9 +14857,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14688,12 +14956,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14730,9 +14992,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14742,9 +15001,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14754,12 +15010,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14769,10 +15019,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14781,18 +15028,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14808,13 +15049,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14949,6 +15187,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15580,7 +15827,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15766,6 +16016,13 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr ""
@@ -16449,7 +16706,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16458,6 +16718,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16659,7 +16919,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16901,9 +17161,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17213,9 +17464,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17459,6 +17704,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17576,9 +17860,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17675,6 +17956,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17780,9 +18064,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17798,6 +18088,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,16 +18112,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18104,6 +18403,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18257,6 +18559,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18266,7 +18571,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18533,18 +18838,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18575,25 +18877,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18602,37 +18904,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,9 +18958,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18674,7 +18988,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18806,9 +19120,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19296,10 +19607,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19473,15 +19781,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20760,9 +21149,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21013,6 +21405,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21154,6 +21555,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21166,15 +21570,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21217,9 +21612,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21388,6 +21780,13 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21499,6 +21898,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21682,15 +22084,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22048,9 +22441,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22411,12 +22816,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22672,6 +23089,13 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr ""
@@ -22898,9 +23322,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22916,9 +23337,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22979,19 +23397,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23036,22 +23454,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23078,9 +23502,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23678,9 +24096,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23690,9 +24105,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24418,12 +24836,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24589,7 +25013,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25446,6 +25882,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25470,9 +25909,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25561,10 +25997,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25573,10 +26009,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25733,16 +26169,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25838,9 +26271,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25895,6 +26325,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25925,6 +26358,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26042,6 +26475,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26461,21 +26903,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26975,6 +27468,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26999,7 +27495,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,22 +27504,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27059,10 +27558,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27158,6 +27657,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27176,6 +27678,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27482,6 +27987,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27642,6 +28153,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27681,9 +28195,6 @@ 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 ""
@@ -27774,18 +28285,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28833,6 +29368,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29040,12 +29578,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29121,13 +29653,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29169,9 +29704,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29436,7 +29965,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,7 +29992,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29478,6 +30007,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29505,7 +30037,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29514,16 +30046,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,7 +30088,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29643,13 +30175,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29658,7 +30190,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29667,16 +30199,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29685,7 +30217,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29721,7 +30253,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29763,6 +30295,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29841,7 +30376,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29964,6 +30499,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30759,7 +31303,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30819,7 +31363,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31710,9 +32266,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31877,6 +32430,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32270,9 +32826,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32300,6 +32853,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33304,6 +33860,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34355,7 +34938,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,6 +34983,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35021,6 +35595,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35135,6 +35715,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35156,6 +35739,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35444,6 +36027,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35772,6 +36361,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37006,6 +37652,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37027,7 +37676,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37045,6 +37694,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,6 +37760,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37414,7 +38069,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37598,6 +38259,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38312,9 +38994,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38924,6 +39597,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39833,9 +40509,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39887,6 +40560,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40477,9 +41165,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40795,6 +41474,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40885,9 +41567,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40897,9 +41576,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40942,6 +41615,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41038,9 +41714,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41092,12 +41765,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41293,10 +41960,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42356,9 +43026,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,10 +44357,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44417,18 +45100,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44708,6 +45397,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44876,6 +45574,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45589,6 +46305,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45965,6 +46697,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46072,6 +46810,9 @@ msgstr[3] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46569,6 +47316,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46792,6 +47542,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index f1c8bab68d3..3011882bd5b 100644
--- a/locale/sl_SI/gitlab.po
+++ b/locale/sl_SI/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:19\n"
+"PO-Revision-Date: 2022-07-14 17:05\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -374,6 +374,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -486,6 +500,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -865,9 +886,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1086,9 +1113,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1190,6 +1214,9 @@ msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1231,6 +1258,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1527,6 +1557,13 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1784,6 +1821,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2072,6 +2112,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2189,6 +2232,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2279,9 +2328,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2312,9 +2358,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2342,9 +2385,6 @@ 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 new issue"
msgstr ""
@@ -2594,9 +2634,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2846,6 +2883,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2918,6 +2958,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3143,7 +3186,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3152,6 +3195,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3194,6 +3240,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3221,6 +3270,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3296,6 +3348,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3323,6 +3381,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3341,6 +3402,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3353,9 +3417,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3404,9 +3474,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3425,6 +3492,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3491,6 +3561,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3971,6 +4044,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3983,12 +4059,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -4031,9 +4101,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -4046,9 +4113,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -4061,12 +4125,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4226,6 +4296,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4445,6 +4518,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4455,6 +4531,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4662,6 +4741,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -5062,7 +5144,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5168,6 +5250,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5186,6 +5271,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5303,6 +5391,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5400,9 +5491,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5476,6 +5564,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5500,6 +5591,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5509,6 +5603,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5524,6 +5624,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6016,9 +6119,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6421,6 +6521,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6721,6 +6827,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -7042,6 +7151,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7138,6 +7250,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7181,6 +7296,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7508,6 +7626,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7679,9 +7800,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7933,6 +8051,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -8050,6 +8171,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8426,6 +8550,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8444,6 +8571,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8453,9 +8697,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8823,9 +9064,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8865,6 +9103,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8910,9 +9151,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -9090,10 +9328,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9270,6 +9520,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9661,6 +9914,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9697,10 +9953,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9892,9 +10148,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -10120,9 +10373,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10858,6 +11111,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11552,6 +11808,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11585,6 +11844,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11633,13 +11901,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11771,6 +12039,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11981,6 +12252,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12186,12 +12460,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12204,9 +12472,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12300,9 +12568,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12348,6 +12613,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12459,6 +12727,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12600,13 +12895,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13235,6 +13518,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13716,9 +14002,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13935,10 +14218,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13968,9 +14251,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -14121,9 +14401,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14262,9 +14539,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14280,6 +14554,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14463,9 +14737,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14586,9 +14857,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14688,12 +14956,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14730,9 +14992,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14742,9 +15001,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14754,12 +15010,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14769,10 +15019,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14781,18 +15028,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14808,13 +15049,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14949,6 +15187,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15580,7 +15827,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15766,6 +16016,13 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr ""
@@ -16449,7 +16706,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16458,6 +16718,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16659,7 +16919,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16901,9 +17161,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17213,9 +17464,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17459,6 +17704,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17576,9 +17860,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17675,6 +17956,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17780,9 +18064,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17798,6 +18088,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,16 +18112,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -18104,6 +18403,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18257,6 +18559,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18266,7 +18571,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18533,18 +18838,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18575,25 +18877,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18602,37 +18904,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,9 +18958,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18674,7 +18988,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18806,9 +19120,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19296,10 +19607,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19473,15 +19781,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20760,9 +21149,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -21013,6 +21405,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21154,6 +21555,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -21166,15 +21570,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21217,9 +21612,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21388,6 +21780,13 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21499,6 +21898,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21682,15 +22084,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -22048,9 +22441,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22411,12 +22816,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22672,6 +23089,13 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr ""
@@ -22898,9 +23322,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22916,9 +23337,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22979,19 +23397,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -23036,22 +23454,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23078,9 +23502,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23678,9 +24096,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23690,9 +24105,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24418,12 +24836,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24589,7 +25013,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25446,6 +25882,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25470,9 +25909,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25561,10 +25997,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25573,10 +26009,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25733,16 +26169,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
-msgstr ""
-
-msgid "New group"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25838,9 +26271,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25895,6 +26325,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25925,6 +26358,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -26042,6 +26475,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26461,21 +26903,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26975,6 +27468,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26999,7 +27495,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,22 +27504,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -27059,10 +27558,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -27158,6 +27657,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -27176,6 +27678,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27482,6 +27987,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27642,6 +28153,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27681,9 +28195,6 @@ 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 ""
@@ -27774,18 +28285,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28833,6 +29368,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -29040,12 +29578,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -29121,13 +29653,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -29169,9 +29704,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29436,7 +29965,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,7 +29992,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29478,6 +30007,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29505,7 +30037,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29514,16 +30046,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,7 +30088,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29643,13 +30175,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29658,7 +30190,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29667,16 +30199,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29685,7 +30217,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29721,7 +30253,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29763,6 +30295,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29841,7 +30376,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29964,6 +30499,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30759,7 +31303,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30819,7 +31363,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31710,9 +32266,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31877,6 +32430,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32270,9 +32826,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32300,6 +32853,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33304,6 +33860,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34355,7 +34938,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,6 +34983,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -35021,6 +35595,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35135,6 +35715,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -35156,6 +35739,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35444,6 +36027,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35772,6 +36361,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -37006,6 +37652,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -37027,7 +37676,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -37045,6 +37694,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,6 +37760,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37414,7 +38069,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37598,6 +38259,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38312,9 +38994,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38924,6 +39597,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39833,9 +40509,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39887,6 +40560,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40477,9 +41165,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40795,6 +41474,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40885,9 +41567,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40897,9 +41576,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40942,6 +41615,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41038,9 +41714,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -41092,12 +41765,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41293,10 +41960,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42356,9 +43026,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,10 +44357,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44417,18 +45100,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44708,6 +45397,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44876,6 +45574,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45589,6 +46305,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45965,6 +46697,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -46072,6 +46810,9 @@ msgstr[3] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46569,6 +47316,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46792,6 +47542,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index fbf1e29d9f7..a93f583a5aa 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:19\n"
+"PO-Revision-Date: 2022-07-14 17:05\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 3292cd10f20..2089442eec9 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:25\n"
+"PO-Revision-Date: 2022-07-14 17:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -331,6 +331,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,12 +427,24 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -784,9 +802,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1003,9 +1027,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1099,6 +1120,9 @@ msgstr[2] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1138,6 +1162,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1429,6 +1456,12 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1663,6 +1696,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1951,6 +1987,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2068,6 +2107,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2158,9 +2203,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2191,9 +2233,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2221,9 +2260,6 @@ 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 new issue"
msgstr ""
@@ -2473,9 +2509,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2725,6 +2758,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2797,6 +2833,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3022,7 +3061,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3031,6 +3070,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3073,6 +3115,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3100,6 +3145,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3175,6 +3223,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3202,6 +3256,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3220,6 +3277,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3232,9 +3292,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3283,9 +3349,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3304,6 +3367,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3370,6 +3436,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3850,6 +3919,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3862,12 +3934,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3910,9 +3976,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3925,9 +3988,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3940,12 +4000,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4105,6 +4171,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4324,6 +4393,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4333,6 +4405,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4540,6 +4615,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4933,7 +5011,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5038,6 +5116,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5056,6 +5137,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5173,6 +5257,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5269,9 +5356,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5344,6 +5428,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5368,6 +5455,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5377,6 +5467,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5392,6 +5488,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5884,9 +5983,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6289,6 +6385,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6586,6 +6688,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6907,6 +7012,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7003,6 +7111,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7045,6 +7156,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7372,6 +7486,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7543,9 +7660,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7795,6 +7909,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7846,9 +7966,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7912,6 +8029,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8287,6 +8407,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8305,6 +8428,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8314,9 +8554,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8683,9 +8920,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8725,6 +8959,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8770,9 +9007,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8950,10 +9184,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9049,6 +9289,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9130,6 +9376,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9520,6 +9769,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9556,10 +9808,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9751,9 +10003,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9976,9 +10225,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9988,6 +10234,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10714,6 +10963,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11407,6 +11659,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11440,6 +11695,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11488,13 +11752,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11626,6 +11890,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11836,6 +12103,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12040,12 +12310,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12058,9 +12322,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12118,6 +12379,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12154,9 +12418,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12202,6 +12463,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12313,6 +12577,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12451,13 +12742,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12880,12 +13171,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12976,9 +13261,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13021,9 +13303,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13081,6 +13360,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13282,6 +13564,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13387,9 +13672,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13558,9 +13840,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13777,10 +14056,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13810,9 +14089,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13963,9 +14239,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14104,9 +14377,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14122,6 +14392,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14188,9 +14461,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14305,9 +14575,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14428,9 +14695,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14530,12 +14794,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14572,9 +14830,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14584,9 +14839,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14596,12 +14848,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14611,10 +14857,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14623,18 +14866,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14650,13 +14887,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14791,6 +15025,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15019,6 +15256,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15283,6 +15523,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15421,7 +15664,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15586,6 +15829,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15607,6 +15853,12 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Failed on"
msgstr ""
@@ -16288,7 +16540,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16297,6 +16552,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16429,9 +16687,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16498,7 +16753,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16738,9 +16993,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16945,15 +17197,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17050,9 +17296,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17101,9 +17344,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17296,6 +17536,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17323,6 +17599,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17413,9 +17692,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17512,6 +17788,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17617,9 +17896,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17635,6 +17920,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17656,16 +17944,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17941,6 +18235,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18094,6 +18391,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18103,7 +18403,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18370,18 +18670,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18412,25 +18709,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18439,37 +18736,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18478,7 +18778,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18487,9 +18790,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18511,7 +18820,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18643,9 +18952,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19129,10 +19435,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19144,9 +19450,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19306,15 +19609,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20428,9 +20782,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20443,12 +20803,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20461,6 +20839,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20590,9 +20974,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20734,6 +21115,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20746,10 +21130,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20842,6 +21229,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20857,6 +21247,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20902,6 +21295,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20983,6 +21379,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20995,15 +21394,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21046,9 +21436,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21058,15 +21445,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21202,6 +21586,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21217,6 +21604,12 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21328,6 +21721,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21511,15 +21907,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21838,9 +22228,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21877,9 +22264,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21898,6 +22291,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22201,6 +22597,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22240,12 +22639,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22270,6 +22675,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22306,6 +22717,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22423,9 +22837,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22501,6 +22912,12 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Label priority"
msgstr ""
@@ -22726,9 +23143,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22744,9 +23158,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22807,19 +23218,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22864,22 +23275,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22897,6 +23311,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22906,9 +23323,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23410,9 +23824,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23500,9 +23911,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23512,9 +23920,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23653,6 +24058,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23665,6 +24073,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24238,12 +24649,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24409,7 +24826,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24436,6 +24853,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24787,9 +25207,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25228,6 +25645,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25240,9 +25672,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25264,6 +25693,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25288,9 +25720,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25378,10 +25807,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25390,10 +25819,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25549,16 +25978,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25654,9 +26080,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25711,6 +26134,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25741,6 +26167,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25765,9 +26194,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25858,6 +26284,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25903,9 +26332,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25942,6 +26368,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26122,9 +26551,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26272,21 +26707,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26299,18 +26761,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26785,6 +27271,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26809,7 +27298,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26818,22 +27307,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26842,12 +27331,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26869,10 +27361,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26968,6 +27460,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26986,6 +27481,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27076,6 +27574,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27160,12 +27661,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27184,7 +27679,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27292,6 +27790,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27409,6 +27910,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27451,6 +27955,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27490,9 +27997,6 @@ 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 ""
@@ -27583,18 +28087,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28027,6 +28525,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28039,6 +28555,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28405,6 +28930,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28642,6 +29170,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28849,12 +29380,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28930,13 +29455,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28978,9 +29506,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29032,9 +29557,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29065,6 +29587,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29230,9 +29755,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29245,7 +29767,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29272,7 +29794,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29287,6 +29809,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29314,7 +29839,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29323,16 +29848,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29365,7 +29890,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29452,13 +29977,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29467,7 +29992,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29476,16 +30001,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29494,7 +30019,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29530,7 +30055,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29572,6 +30097,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29650,7 +30178,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29773,6 +30301,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29884,6 +30415,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29902,9 +30436,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30364,6 +30895,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30502,6 +31036,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30568,7 +31105,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30628,7 +31165,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30787,6 +31324,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30799,6 +31339,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31120,6 +31663,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31432,6 +31978,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31519,9 +32068,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31684,6 +32230,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32077,9 +32626,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32107,6 +32653,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32200,6 +32749,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32551,9 +33106,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32632,6 +33184,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32641,9 +33196,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32737,6 +33289,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32770,12 +33325,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33097,6 +33646,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33223,9 +33775,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33367,6 +33916,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33457,6 +34015,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34120,6 +34693,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34135,7 +34711,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34180,6 +34756,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34204,9 +34783,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34303,9 +34888,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34405,6 +34987,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34429,18 +35014,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34450,12 +35023,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34495,6 +35062,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34720,9 +35290,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34801,6 +35368,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34915,6 +35488,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34936,6 +35512,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35167,9 +35746,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35224,6 +35800,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35287,6 +35866,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35551,6 +36133,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35575,9 +36214,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35593,6 +36229,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35914,6 +36553,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36109,9 +36751,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36439,7 +37078,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36784,6 +37423,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36805,7 +37447,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36823,6 +37465,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36886,6 +37531,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37192,7 +37840,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37363,6 +38014,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37375,6 +38029,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37450,9 +38119,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37651,6 +38317,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38005,6 +38677,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38083,9 +38758,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38209,6 +38881,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38233,7 +38908,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38389,6 +39064,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38431,9 +39109,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38464,21 +39139,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38692,6 +39358,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38737,6 +39406,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39361,9 +40036,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39481,7 +40153,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39505,6 +40177,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39556,9 +40231,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39589,9 +40261,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39601,9 +40270,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39655,6 +40321,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39991,9 +40663,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40144,6 +40813,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40183,12 +40855,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40243,9 +40924,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40402,9 +41080,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40471,9 +41146,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40561,6 +41233,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40651,9 +41326,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40663,9 +41335,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40678,9 +41347,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40708,6 +41374,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40750,7 +41419,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40804,9 +41473,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40858,12 +41524,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41059,10 +41719,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41107,9 +41764,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41230,6 +41884,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41857,6 +42514,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42121,9 +42784,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42169,9 +42829,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42787,7 +43444,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43384,6 +44041,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43408,19 +44068,37 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43432,10 +44110,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43588,7 +44266,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43786,9 +44464,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43798,9 +44473,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43828,9 +44500,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43840,6 +44509,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43993,6 +44665,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44005,6 +44680,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44074,9 +44752,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44176,18 +44851,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44209,12 +44902,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44446,12 +45133,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44467,6 +45148,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44521,15 +45205,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44602,6 +45289,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44632,6 +45322,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44674,6 +45367,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44728,6 +45427,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44770,6 +45472,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44842,10 +45547,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44857,6 +45562,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45133,6 +45841,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45160,12 +45871,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45220,6 +45925,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45334,6 +46042,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45382,6 +46093,18 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45706,6 +46429,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45811,6 +46540,9 @@ msgstr[2] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45829,9 +46561,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45877,6 +46606,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46075,6 +46807,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46108,6 +46846,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46144,12 +46888,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46303,6 +47041,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46525,6 +47266,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index 61a7f76413d..375c1e995f6 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:19\n"
+"PO-Revision-Date: 2022-07-14 17:05\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -331,6 +331,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,12 +427,24 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -784,9 +802,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -1003,9 +1027,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1099,6 +1120,9 @@ msgstr[2] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1138,6 +1162,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1429,6 +1456,12 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1663,6 +1696,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1951,6 +1987,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -2068,6 +2107,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2158,9 +2203,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2191,9 +2233,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2221,9 +2260,6 @@ 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 new issue"
msgstr ""
@@ -2473,9 +2509,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2725,6 +2758,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2797,6 +2833,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -3022,7 +3061,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -3031,6 +3070,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -3073,6 +3115,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3100,6 +3145,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3175,6 +3223,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3202,6 +3256,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3220,6 +3277,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3232,9 +3292,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3283,9 +3349,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3304,6 +3367,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3370,6 +3436,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3850,6 +3919,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3862,12 +3934,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3910,9 +3976,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3925,9 +3988,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3940,12 +4000,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -4105,6 +4171,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4324,6 +4393,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4333,6 +4405,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4540,6 +4615,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4933,7 +5011,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5038,6 +5116,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -5056,6 +5137,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5173,6 +5257,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5269,9 +5356,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5344,6 +5428,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5368,6 +5455,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5377,6 +5467,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5392,6 +5488,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5884,9 +5983,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6289,6 +6385,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6586,6 +6688,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6907,6 +7012,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -7003,6 +7111,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -7045,6 +7156,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7372,6 +7486,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7543,9 +7660,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7795,6 +7909,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7846,9 +7966,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7912,6 +8029,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8287,6 +8407,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8305,6 +8428,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8314,9 +8554,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8683,9 +8920,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8725,6 +8959,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8770,9 +9007,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8950,10 +9184,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9049,6 +9289,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -9130,6 +9376,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9520,6 +9769,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9556,10 +9808,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9751,9 +10003,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9976,9 +10225,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9988,6 +10234,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10714,6 +10963,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11407,6 +11659,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11440,6 +11695,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11488,13 +11752,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11626,6 +11890,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11836,6 +12103,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -12040,12 +12310,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -12058,9 +12322,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -12118,6 +12379,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12154,9 +12418,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12202,6 +12463,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12313,6 +12577,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12451,13 +12742,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12880,12 +13171,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12976,9 +13261,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -13021,9 +13303,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -13081,6 +13360,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13282,6 +13564,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13387,9 +13672,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13558,9 +13840,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13777,10 +14056,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13810,9 +14089,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13963,9 +14239,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14104,9 +14377,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -14122,6 +14392,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14188,9 +14461,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14305,9 +14575,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14428,9 +14695,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14530,12 +14794,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14572,9 +14830,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14584,9 +14839,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14596,12 +14848,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14611,10 +14857,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14623,18 +14866,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14650,13 +14887,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14791,6 +15025,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15019,6 +15256,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15283,6 +15523,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15421,7 +15664,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15586,6 +15829,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15607,6 +15853,12 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Failed on"
msgstr ""
@@ -16288,7 +16540,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16297,6 +16552,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16429,9 +16687,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16498,7 +16753,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16738,9 +16993,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16945,15 +17197,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -17050,9 +17296,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -17101,9 +17344,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17296,6 +17536,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17323,6 +17599,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17413,9 +17692,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17512,6 +17788,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17617,9 +17896,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17635,6 +17920,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17656,16 +17944,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17941,6 +18235,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18094,6 +18391,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -18103,7 +18403,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18370,18 +18670,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18412,25 +18709,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18439,37 +18736,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
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|Project download rate limit"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr ""
+
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18478,7 +18778,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18487,9 +18790,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18511,7 +18820,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18643,9 +18952,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19129,10 +19435,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -19144,9 +19450,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19306,15 +19609,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20428,9 +20782,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20443,12 +20803,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20461,6 +20839,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20590,9 +20974,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20734,6 +21115,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20746,10 +21130,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20842,6 +21229,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20857,6 +21247,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20902,6 +21295,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20983,6 +21379,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20995,15 +21394,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -21046,9 +21436,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -21058,15 +21445,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21202,6 +21586,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21217,6 +21604,12 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21328,6 +21721,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21511,15 +21907,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21838,9 +22228,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21877,9 +22264,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21898,6 +22291,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22201,6 +22597,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22240,12 +22639,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22270,6 +22675,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22306,6 +22717,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22423,9 +22837,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22501,6 +22912,12 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Label priority"
msgstr ""
@@ -22726,9 +23143,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22744,9 +23158,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22807,19 +23218,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22864,22 +23275,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22897,6 +23311,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22906,9 +23323,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23410,9 +23824,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23500,9 +23911,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23512,9 +23920,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23653,6 +24058,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23665,6 +24073,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24238,12 +24649,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24409,7 +24826,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24436,6 +24853,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24787,9 +25207,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25228,6 +25645,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25240,9 +25672,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25264,6 +25693,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25288,9 +25720,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25378,10 +25807,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25390,10 +25819,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25549,16 +25978,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25654,9 +26080,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25711,6 +26134,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25741,6 +26167,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25765,9 +26194,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25858,6 +26284,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25903,9 +26332,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25942,6 +26368,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26122,9 +26551,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26272,21 +26707,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26299,18 +26761,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26785,6 +27271,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26809,7 +27298,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26818,22 +27307,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26842,12 +27331,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26869,10 +27361,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26968,6 +27460,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26986,6 +27481,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -27076,6 +27574,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27160,12 +27661,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27184,7 +27679,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27292,6 +27790,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27409,6 +27910,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27451,6 +27955,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27490,9 +27997,6 @@ 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 ""
@@ -27583,18 +28087,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -28027,6 +28525,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28039,6 +28555,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28405,6 +28930,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28642,6 +29170,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28849,12 +29380,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28930,13 +29455,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28978,9 +29506,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -29032,9 +29557,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29065,6 +29587,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29230,9 +29755,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29245,7 +29767,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29272,7 +29794,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29287,6 +29809,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29314,7 +29839,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29323,16 +29848,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29365,7 +29890,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29452,13 +29977,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29467,7 +29992,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29476,16 +30001,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29494,7 +30019,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29530,7 +30055,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29572,6 +30097,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29650,7 +30178,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29773,6 +30301,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29884,6 +30415,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29902,9 +30436,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30364,6 +30895,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30502,6 +31036,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30568,7 +31105,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30628,7 +31165,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30787,6 +31324,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30799,6 +31339,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31120,6 +31663,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31432,6 +31978,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31519,9 +32068,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31684,6 +32230,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -32077,9 +32626,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -32107,6 +32653,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32200,6 +32749,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32551,9 +33106,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32632,6 +33184,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32641,9 +33196,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32737,6 +33289,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32770,12 +33325,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -33097,6 +33646,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33223,9 +33775,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33367,6 +33916,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33457,6 +34015,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34120,6 +34693,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34135,7 +34711,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34180,6 +34756,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -34204,9 +34783,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34303,9 +34888,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34405,6 +34987,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34429,18 +35014,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34450,12 +35023,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34495,6 +35062,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34720,9 +35290,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34801,6 +35368,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34915,6 +35488,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34936,6 +35512,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -35167,9 +35746,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35224,6 +35800,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35287,6 +35866,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35551,6 +36133,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35575,9 +36214,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35593,6 +36229,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35914,6 +36553,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -36109,9 +36751,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36439,7 +37078,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36784,6 +37423,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36805,7 +37447,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36823,6 +37465,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36886,6 +37531,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -37192,7 +37840,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37363,6 +38014,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37375,6 +38029,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37450,9 +38119,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37651,6 +38317,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38005,6 +38677,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38083,9 +38758,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38209,6 +38881,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38233,7 +38908,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38389,6 +39064,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38431,9 +39109,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38464,21 +39139,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38692,6 +39358,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38737,6 +39406,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39361,9 +40036,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39481,7 +40153,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39505,6 +40177,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39556,9 +40231,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39589,9 +40261,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39601,9 +40270,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39655,6 +40321,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39991,9 +40663,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40144,6 +40813,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -40183,12 +40855,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40243,9 +40924,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40402,9 +41080,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40471,9 +41146,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40561,6 +41233,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40651,9 +41326,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40663,9 +41335,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40678,9 +41347,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40708,6 +41374,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40750,7 +41419,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40804,9 +41473,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40858,12 +41524,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41059,10 +41719,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -41107,9 +41764,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -41230,6 +41884,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41857,6 +42514,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42121,9 +42784,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -42169,9 +42829,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42787,7 +43444,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43384,6 +44041,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43408,19 +44068,37 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43432,10 +44110,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43588,7 +44266,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43786,9 +44464,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43798,9 +44473,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43828,9 +44500,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43840,6 +44509,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43993,6 +44665,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44005,6 +44680,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44074,9 +44752,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -44176,18 +44851,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -44209,12 +44902,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44446,12 +45133,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44467,6 +45148,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44521,15 +45205,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44602,6 +45289,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44632,6 +45322,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44674,6 +45367,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44728,6 +45427,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44770,6 +45472,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44842,10 +45547,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44857,6 +45562,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -45133,6 +45841,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -45160,12 +45871,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45220,6 +45925,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45334,6 +46042,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45382,6 +46093,18 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45706,6 +46429,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45811,6 +46540,9 @@ msgstr[2] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45829,9 +46561,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45877,6 +46606,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46075,6 +46807,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46108,6 +46846,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -46144,12 +46888,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46303,6 +47041,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46525,6 +47266,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 0aa68d56d8b..8820d7bffe2 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:19\n"
+"PO-Revision-Date: 2022-07-14 17:05\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d lager"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekund"
msgstr[1] "%d sekunder"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Bevis:%{labelEnd} %{evidence}"
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr "Lägg till en GPG-nyckel"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr "Gravatar aktiverat"
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index 2c90b0e4eaf..9d1bc615c8e 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:24\n"
+"PO-Revision-Date: 2022-07-14 17:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/ta_IN/gitlab.po b/locale/ta_IN/gitlab.po
index 606e655b300..646984380de 100644
--- a/locale/ta_IN/gitlab.po
+++ b/locale/ta_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ta\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/th_TH/gitlab.po b/locale/th_TH/gitlab.po
index af1779133b6..71614eb8017 100644
--- a/locale/th_TH/gitlab.po
+++ b/locale/th_TH/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: th\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:21\n"
+"PO-Revision-Date: 2022-07-14 17:07\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -622,9 +634,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -917,6 +932,9 @@ msgstr[0] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -952,6 +970,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1233,6 +1254,10 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1421,6 +1446,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1709,6 +1737,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1826,6 +1857,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -1916,9 +1953,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -1949,9 +1983,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ 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 new issue"
msgstr ""
@@ -2231,9 +2259,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -2990,9 +3042,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -4913,6 +4989,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8769,6 +9001,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,10 +9518,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9469,9 +9713,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,10 +13732,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13494,9 +13765,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14280,12 +14524,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14295,10 +14533,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14334,13 +14563,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,37 +18400,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,7 +18442,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22159,6 +22558,10 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,16 +25596,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25490,6 +25902,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28548,13 +29059,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28596,9 +29110,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -28863,7 +29371,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,7 +29398,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -28905,6 +29413,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,7 +29494,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29070,13 +29581,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29085,7 +29596,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29094,16 +29605,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29112,7 +29623,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29148,7 +29659,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29268,7 +29782,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36340,6 +36965,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -36929,6 +37569,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39191,6 +39843,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index afa658a3a2c..c2f8827d4f4 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 17:05\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ 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 job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d katman"
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d saniye"
msgstr[1] "%d saniye"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr "%{labelStart}Sınıf:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Çökme Adresi:%{labelEnd}%{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Çökme Durumu:%{labelEnd}%{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Bulgu:%{labelEnd}%{evidence}"
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr "%{seconds}sn"
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] "%{strong_start}%{release_count}%{strong_end} Sürüm"
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr "0 bayt"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 gün"
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr "Bu projede kullanım için kabul edilebilir"
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Erişim Anahtarları"
@@ -1947,6 +1982,12 @@ msgstr "Yeni"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Hesap"
@@ -2037,9 +2078,6 @@ msgstr "CHANGELOG ekle"
msgid "Add CONTRIBUTING"
msgstr "CONTRIBUTING ekle"
-msgid "Add Jaeger URL"
-msgstr "Jaeger URL ekle"
-
msgid "Add Kubernetes cluster"
msgstr "Kubernetes kümesi ekle"
@@ -2070,9 +2108,6 @@ msgstr "Bir GPG anahtarı ekle"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ msgstr "Bu %{noteableDisplayName} için 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 new issue"
msgstr "Yeni sorun ekle"
@@ -2352,9 +2384,6 @@ msgstr "Bu sürümde eklendi"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "GitLab örneğinizde yeni uygulamalar eklemek devre dışı bırakıldı. İzin almak için lütfen GitLab yöneticinize başvurun"
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "Ek dakika"
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Otomatik DevOps etki alanı"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr "2FA Devre dışı"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA Etkin"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr "EriÅŸim"
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr "Kullanıcıyı yasakla"
@@ -2979,6 +3020,9 @@ msgstr "Engellendi"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Kullanıcıyı engelleme aşağıdaki etkilere sahiptir:"
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "Oturum açamaz veya örnek bilgilerine erişemez"
@@ -3054,6 +3098,12 @@ msgstr "Bu sensin!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr "Kişisel projeler bırakılacak"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Kişisel projeler, grup ve kullanıcı geçmişi bozulmadan bırakılacak"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr "Kullanıcıları ara"
msgid "AdminUsers|Send email to users"
msgstr "Kullanıcılara e-posta gönder"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "Sıralama"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr "Kullanıcı git depolarına erişemeyecek"
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr "Yönetim"
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "\"%{group_name}\" grubunun oturum açmasına izin ver"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr "Bu gruptaki projelerin Git LFS'yi kullanmasına izin verin"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr "Kullanıcıların yayın mesajını kapatmalarına izin ver"
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "Kullanıcıların erişim isteğinde bulunmalarına izin ver (görünürlük genel veya dahili ise)"
-
msgid "Allowed"
msgstr "Ä°zin verildi"
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "Ä°zin verilmedi"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Kubernetes kümelerini eklemeye ve yönetmenize olanak tanır."
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Bildirimlere abone olunurken bir hata oluÅŸtu."
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr "Uygulama ayarları başarıyla kaydedildi"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "Uygulama ayarları güncellemesi başarısız oldu"
@@ -4804,7 +4878,7 @@ msgstr "Proje arşivlendi! Depo ve diğer proje kaynakları sadece okunur"
msgid "Archived projects"
msgstr "ArÅŸivlenmiÅŸ projeler"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr "%{email} e-postasını kaldırmak istediğinizden emin misiniz?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "%{group_name} grubunu silmek istediÄŸinizden emin misiniz?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Sağlık kontrolü erişim anahtarını sıfırlamak istediğinizden emin misiniz?"
@@ -5043,6 +5123,9 @@ msgstr "Etiket tanımla"
msgid "Assign milestone"
msgstr "Kilometre taşı ata"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr "Riskli"
msgid "Attach a file"
msgstr "Bir dosya ekle"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Sürükleyip bırakarak bir dosya ekle veya %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr "Kullanıcı Etkinlikleri"
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "AÄŸustos"
@@ -5752,9 +5847,6 @@ msgstr "Dikkatli olun. Projenin isim alanını değiştirmek, istenmeyen yan etk
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Dikkatli olun. Bir projenin deposunu yeniden isimlendirmenin istenmeyen yan etkileri olabilir."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr "Kart numarası:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr "Değişiklikler bastırıldı. Göstermek için tıkla."
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr "GitLab planı"
msgid "Checkout|Group"
msgstr "Grup"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "GitLab kullanan şirketin veya kuruluşun adı"
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr "Alt epik mevcut deÄŸil."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr "%{epicTimeagoDate} kapatıldı"
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Kapalı sorunlar"
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr "Küme"
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Ortamlarınızdan hangisinin bu kümeyi kullanacağını seçin."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr "Biliyor muydunuz?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr "Kod Ä°ncelemesi"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr "Kapsayıcı Kaydı"
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr "Yeni etiket oluÅŸtur"
msgid "Create new project"
msgstr "Yeni proje oluÅŸtur"
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr "Profilleri yönet"
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr "Varsayılan dal"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr "Sorunlar için varsayılan açıklama şablonu"
@@ -11912,9 +12172,6 @@ msgstr "Haftanın varsayılan ilk günü"
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr "Varsayılan proje silme koruması"
-
msgid "Default projects limit"
msgstr "Varsayılan proje limiti"
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr "Yorumu sil"
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr "Etiketi sil"
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr "Yorum"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "İstenen tasarım sürümü mevcut değil. Bunun yerine en son sürüm gösteriliyor"
@@ -12927,6 +13202,9 @@ msgstr "Ayrıntılar"
msgid "Details (default)"
msgstr "Ayrıntılar (varsayılan)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr "İki adımlı doğrulamayı devre dışı bırakın"
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,12 +13894,12 @@ msgstr ""
msgid "Edit"
msgstr "Düzenle"
-msgid "Edit %{issuable}"
-msgstr ""
-
msgid "Edit %{name}"
msgstr "%{name} düzenle"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "Yorumu düzenle"
@@ -13652,9 +13927,6 @@ msgstr "Şifreyi Düzenle"
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "Sürümü düzenle"
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr "BoÅŸ dosya"
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr "Ä°ÅŸlem"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr "Sil"
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "Ä°ÅŸ"
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Yeni ortam"
@@ -14438,12 +14686,6 @@ msgstr "Dağıtılmış ortam yok"
msgid "Environments|No deployments yet"
msgstr "Henüz dağıtım yok"
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,30 +14695,21 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
+msgid "Environments|Re-deploy environment"
msgstr ""
-msgid "Environments|Re-deploy"
-msgstr "Yeniden dağıt"
-
msgid "Environments|Re-deploy environment %{name}?"
msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr "Tümünü göster"
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr "Epikten sorun kaldırılırken bir şeyler ters gitti."
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "Etkin"
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr "Başarısız İşler"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,8 +16374,11 @@ msgstr "Yolu bul"
msgid "Find file"
msgstr "Dosya bul"
-msgid "Fingerprint"
-msgstr "Parmak izi"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
+msgstr ""
msgid "Fingerprints"
msgstr ""
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "Daha fazla bilgi için şu adrese gidin: "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr "DoÄŸrulama bekliyor"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr "Proje"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr "EÅŸitlendi:"
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr "Git sürümü"
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "GitLab içe aktarma"
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr "Doğrulanmadı"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr "Doğrulandı"
@@ -17454,9 +17728,15 @@ msgstr "Genel Kısayollar"
msgid "Global notification settings"
msgstr "Genel bildirim ayarları"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr "Gravatar etkinleÅŸtirildi"
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr "Grup başarıyla güncellendi."
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Grup için Otomatik DevOps iş hattı güncellendi"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr "Grubu içe aktar"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,12 +19263,12 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
-msgstr ""
-
msgid "Hook was successfully updated."
msgstr "Kanca başarıyla güncellendi."
+msgid "Horizontal rule"
+msgstr ""
+
msgid "Hostname"
msgstr "Sunucu adı"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "Saat (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr "Temizlik hizmeti"
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr "Bir alıntı ekle"
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr "Yorum ayrıntıları:"
msgid "Integrations|Comment settings:"
msgstr "Yorum ayarları:"
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr "Özel ayarları kullan"
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr "Geçersiz depo yolu"
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr "Oca"
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr "En alta kaydır"
msgid "Job|Scroll to top"
msgstr "En üste kaydır"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr "Etiket"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr "Daha fazlasını öğrenin"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr "Erişimi yönet"
-msgid "Manage all notifications"
-msgstr "Tüm bildirimleri yönet"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "GitLab'ı bir OAuth sağlayıcısı olarak kullanabilen uygulamaları ve hesabınızı kullanma yetkisi verdiğiniz uygulamaları yönetin."
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr "Tam değişiklik yüklenirken hata oluştu. Lütfen tekrar deneyin."
msgid "MergeRequest|No files found"
msgstr "Dosya bulunamadı"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "Y ekseni etiketi"
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,18 +25787,15 @@ msgstr "Yeni epik"
msgid "New epic title"
msgstr "Yeni epik başlığı"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Yeni dosya"
msgid "New group"
msgstr "Yeni grup"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25470,9 +25889,6 @@ msgstr "Yeni kullanıcılar harici olarak ayarlandı"
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr "Yeni..."
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr "Dal bulunamadı"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "DeÄŸiÅŸiklik yok"
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr "Depo bulunamadı"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr "Bu yorumu oluşturmayı iptal etmek istediğinizden emin misiniz?"
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr "Bildirimler kapalı"
msgid "Notifications on"
msgstr "Bildirimler açık"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "Kas"
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr "Seçenekler"
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr "Sahibi"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Üzgünüz, filtreniz sonuç vermedi"
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr "Ãœst epik yok."
msgid "Parent epic is not present."
msgstr "Ãœst epik mevcut deÄŸil."
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Oynat"
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,14 +29257,17 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Tarihlerin ve saatlerin nasıl görüntüleneceğini yapılandırın."
msgid "Preferences|Customize integrations with third party services."
msgstr "Üçüncü taraf hizmetleriyle entegrasyonları özelleştirin."
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "Uygulama başlığının ve gezinme kenar çubuğunun görünümünü özelleştirin."
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr ""
@@ -28787,9 +29308,6 @@ msgstr "Düzen genişliği"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "%{min} ile %{max} arasında bir sayı olmalıdır"
-msgid "Preferences|Navigation theme"
-msgstr "Gezinme teması"
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr "Önceki"
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr "Biçimlendirme Önizlemesi"
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr "Önizleme yükü"
@@ -29039,9 +29557,6 @@ msgstr "Hesap silinemedi. GitLab kimliğinizi doğrulayamadı."
msgid "Profiles|Account scheduled for removal."
msgstr "Hesabın kaldırılması planlandı."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Aşağıdaki hizmetlerden biriyle oturum açmayı etkinleştirin"
-
msgid "Profiles|Active"
msgstr "Etkin"
@@ -29054,8 +29569,8 @@ msgstr "Durum ifadesi ekle"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr "Kullanıcı adınız güncellenirken bir hata oluştu, lütfen tekrar deneyin."
-msgid "Profiles|An indicator appears next to your name and avatar"
-msgstr "Adınızın ve profil resminizin yanında bir gösterge belirir"
+msgid "Profiles|An indicator appears next to your name and avatar."
+msgstr ""
msgid "Profiles|Avatar cropper"
msgstr "Profil resmi kırpıcı"
@@ -29081,8 +29596,8 @@ msgstr "Kullanıcı adınızı değiştirmenin istenmeyen yan etkileri olabilir.
msgid "Profiles|Choose file..."
msgstr "Dosya seç..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "Herhangi bir proje, havuz veya kuruluş bilgisi olmadan özel projelerinizin genel profilindeki katkılarını göstermeyi seçin"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr ""
msgid "Profiles|City, country"
msgstr "Şehir, ülke"
@@ -29096,6 +29611,9 @@ msgstr "İşlem e-postası"
msgid "Profiles|Connect %{provider}"
msgstr "%{provider}'a baÄŸlan"
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "Bağlı Hesaplar"
@@ -29123,7 +29641,7 @@ msgstr "%{provider} bağlantısını kes"
msgid "Profiles|Do not show on profile"
msgstr "Profilde gösterme"
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr "Profili Düzenle"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-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 name, so people you know can recognize you."
+msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,8 +29692,8 @@ msgstr "Profilime özel katkıları ekle"
msgid "Profiles|Incoming email token was successfully reset"
msgstr "Gelen e-posta erişim anahtarı başarıyla sıfırlandı"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "İki Adımlı Kimlik Doğrulamayı (2FA) etkinleştirerek hesabınızın güvenliğini artırın"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr ""
msgid "Profiles|Invalid password"
msgstr "Geçersiz şifre"
@@ -29261,14 +29779,14 @@ msgstr "Profil resmini kaldır"
msgid "Profiles|Select a service to sign in with."
msgstr ""
+msgid "Profiles|Service sign-in"
+msgstr ""
+
msgid "Profiles|Set new profile picture"
msgstr "Yeni profil resmini ayarla"
-msgid "Profiles|Set your local time zone"
-msgstr "Yerel saat diliminizi ayarlayın"
-
-msgid "Profiles|Social sign-in"
-msgstr "Sosyal oturum açma"
+msgid "Profiles|Set your local time zone."
+msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "LDAP hesapları için bazı seçenekler kullanılamıyor"
@@ -29276,8 +29794,8 @@ msgstr "LDAP hesapları için bazı seçenekler kullanılamıyor"
msgid "Profiles|Static object token was successfully reset"
msgstr "Statik nesne erişim anahtarı başarıyla sıfırlandı"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "Bize 250 karakterden daha azı ile kendinizden bahsedin"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
@@ -29285,17 +29803,17 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "İzin verilen en yüksek dosya boyutu 200KB'dır."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "Bu e-posta, herkese açık profilinizde gösterilecek"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "Bu e-posta, düzenlemeler ve birleştirmeler gibi web tabanlı işlemler için kullanılacaktır. %{commit_email_link_start}Daha fazla bilgi edinin%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Bu ifade ve mesaj profilinizde ve arayüz boyunca görünecektir."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Bu bilgiler profilinizde görünecek"
+msgid "Profiles|This information will appear on your profile."
+msgstr ""
msgid "Profiles|Time settings"
msgstr "Zaman ayarları"
@@ -29303,8 +29821,8 @@ msgstr "Zaman ayarları"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
-msgstr "İki Aşamalı Kimlik Doğrulama"
+msgid "Profiles|Two-factor authentication"
+msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Onaylamak için kendi %{confirmationValue} yazınız:"
@@ -29339,8 +29857,8 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr "Durumunuz nedir?"
-msgid "Profiles|Who you represent or work for"
-msgstr "Kimleri temsil ediyor veya kimin için çalışıyorsunuz?"
+msgid "Profiles|Who you represent or work for."
+msgstr ""
msgid "Profiles|You can change your avatar here"
msgstr "Profil resminizi buradan deÄŸiÅŸtirebilirsiniz"
@@ -29381,6 +29899,9 @@ msgstr "Konumunuz, %{provider_label} hesabınıza göre otomatik olarak ayarland
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "Adınız, %{provider_label} hesabınıza göre otomatik olarak ayarlandı. Böylece tanıdığınız kişiler sizi tanıyabilir"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr "Durumunuz"
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr "Proje URL'si"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr "Sorumlu"
msgid "ProjectCreationLevel|No one"
msgstr "Hiç kimse"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Ä°sim"
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "%{group_name} ile paylaşılan projeler"
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr "OluÅŸtur"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,8 +30967,8 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr "Görünürlük Seviyesi"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "Aynı isim alanı altında birkaç bağımlı projeye ev sahipliği yapmak ister misiniz? %{link_start}Bir grup oluşturun.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
msgid "PrometheusAlerts|exceeded"
msgstr ""
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr "DeÄŸiÅŸtir"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr "E-posta ile yanıtla"
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "Sağlık kontrolü erişim anahtarını sıfırla"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr "Hedef dalı seç"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr "Saat dilimi seçin"
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "Varsayılanı ayarlayın ve görünürlük seviyelerini sınırlayın. İçe aktarma kaynaklarını ve git erişim protokolünü yapılandırın."
-
msgid "Set due date"
msgstr "Bitiş tarihi ayarlayın"
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr "Yeni ÅŸifre ayarla"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Boşluk değişikliklerini göster"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr "Tüm sorunlar gösteriliyor"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr "Bilinmeyen"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr "Alt gruplar"
msgid "Subgroups and projects"
msgstr "Alt gruplar ve projeler"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr "Özet"
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr "Destek"
@@ -37152,6 +37799,21 @@ msgstr "Destek sayfası URL'si"
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr "Sistem kancası başarıyla güncellendi."
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr "Henüz bu grupla paylaşılan proje yok."
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr "Görev için manuel işlem gerekiyor"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr "Bu, proje ile %{fork_source} arasındaki çatal ilişkisini kaldıracaktır."
@@ -39357,9 +40022,6 @@ msgstr "Zaman"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr "Bir sorunun planlanmasından önce geçen süre"
msgid "Time before an issue starts implementation"
msgstr "Bir sorunun uygulamaya başlamadan önceki zamanı"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "Birleştirme isteği oluşturma ve birleştirme/kapatma arasındaki süre"
@@ -39423,6 +40082,12 @@ msgstr "Tah"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Tahmini:"
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "Kenar çubuğunu aç/kapat"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr "Performans Çubuğunu aç/kapat"
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr "İki adımlı kimlik doğrulama"
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr "Bilinmeyen"
msgid "Unknown Error"
msgstr "Bilinmeyen Hata"
-msgid "Unknown cache key"
-msgstr "Bilinmeyen önbellek anahtarı"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr "Bilinmeyen ÅŸifreleme stratejisi: %{encrypted_strategy}!"
@@ -40624,12 +41283,6 @@ msgstr "Tartışmanın kilidi açıldı."
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "yüklemek için tıklayın"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Ek dakika satın al"
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "Depolama"
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr "Bu e-postayı %{host} üzerinde hesabınız nedeniyle alıyorsunuz."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Bu e-postayı %{host} üzerindeki hesabınız nedeniyle alıyorsunuz. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr "Bu e-postayı %{host} üzerindeki etkinliğiniz nedeniyle alıyorsunuz."
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr "Bu e-postayı %{host} üzerinde bir öğe atandığı için alıyorsunuz."
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "Bu e-postayı %{host} üzerinde sizden bahsedildiği için alıyorsunuz."
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr "%{host} hesabınıza yeni bir konumdan giriş yapıldı"
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr "Profiliniz"
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "silinmiş bir kullanıcı"
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr "kendinizi atayın"
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr "Tüm projeler"
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr "varsayılan dal"
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr "dağıt"
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr "takip ediliyor"
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Onayla"
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr "BirleÅŸtir"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr "Daha fazla bilgi"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] "ebeveyn"
msgstr[1] "ebeveyn"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "ÅŸifre"
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] "puan"
@@ -46037,6 +46766,9 @@ msgstr "Bilinmeyen"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "yaml geçersiz"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index 8a877b6cbc6..d0d0905592b 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 18:54\n"
msgid " %{start} to %{end}"
msgstr " %{start} до %{end}"
@@ -47,7 +47,7 @@ msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr " Чи %{emphasisStart}!код злиттÑ%{emphasisEnd}"
msgid " or %{emphasisStart}#id%{emphasisEnd}"
-msgstr ""
+msgstr " або %{emphasisStart}#ідентифікатор%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr " або %{emphasisStart}# ідентифікатор задачі%{emphasisEnd}"
@@ -103,10 +103,10 @@ msgstr[3] "%d Модулів"
msgid "%d Other"
msgid_plural "%d Others"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d Інше"
+msgstr[1] "%d Інших"
+msgstr[2] "%d Інших"
+msgstr[3] "%d Інших"
msgid "%d Package"
msgid_plural "%d Packages"
@@ -131,10 +131,10 @@ msgstr[3] "%d URL-Ð°Ð´Ñ€ÐµÑ Ð²Ñ–Ð´Ñкановано"
msgid "%d additional approver"
msgid_plural "%d additional approvers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d додаткова затверджуюча оÑоба"
+msgstr[1] "%d додаткові затверджуючі оÑоби"
+msgstr[2] "%d додаткових затверджуючих оÑіб"
+msgstr[3] "%d додаткових затверджуючих оÑіб"
msgid "%d additional assignee"
msgid_plural "%d additional assignees"
@@ -374,6 +374,13 @@ msgstr[1] "%d задачі уÑпішно імпортовані з міткою
msgstr[2] "%d задач уÑпішно імпортовані з міткою"
msgstr[3] "%d задач уÑпішно імпортовані з міткою"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d шар"
@@ -479,6 +486,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d Ñекунда"
@@ -486,6 +500,13 @@ msgstr[1] "%d Ñекунди"
msgstr[2] "%d Ñекунд"
msgstr[3] "%d Ñекунд"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -509,10 +530,10 @@ msgstr[3] "%d тегів відповідно до імені образу"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d непризначена задача"
+msgstr[1] "%d непризначені задачі"
+msgstr[2] "%d непризначених задач"
+msgstr[3] "%d непризначених задач"
msgid "%d unresolved thread"
msgid_plural "%d unresolved threads"
@@ -602,7 +623,7 @@ msgid "%{authorsName}'s thread"
msgstr "Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %{authorsName}"
msgid "%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}"
-msgstr ""
+msgstr "%{author} запрошує об'єднати %{source_branch} %{copy_button} в %{target_branch} %{created_at}"
msgid "%{board_target} not found"
msgstr "%{board_target} не знайдено"
@@ -657,7 +678,7 @@ msgid "%{completed} of %{total} issues closed"
msgstr "%{completed} з %{total} задач закрито"
msgid "%{completed} of %{total} weight completed"
-msgstr ""
+msgstr "%{completed} з %{total} ваги виконано"
msgid "%{cores} cores"
msgstr "%{cores} Ñдер"
@@ -785,7 +806,7 @@ msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@company.com"
msgid "%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload."
-msgstr ""
+msgstr "%{enable_service_ping_link_start}Увімкніть%{link_end} або %{generate_manually_link_start}генеруйте%{link_end} Службу Пінг Ð´Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду та Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про викориÑÑ‚Ð°Ð½Ð½Ñ Ñлужб."
msgid "%{extra} more downstream pipelines"
msgstr "Ще %{extra} наÑтупних конвеєрів"
@@ -839,7 +860,7 @@ msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} буде видалено! Ви впевнені?"
msgid "%{issuable}(s) already assigned"
-msgstr ""
+msgstr "%{issuable}(-у) вже призначено"
msgid "%{issueType} actions"
msgstr "%{issueType} дії"
@@ -865,9 +886,15 @@ msgstr "%{labelStart}КлаÑ:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}ÐдреÑа збою:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr "%{labelStart}Стан збою:%{labelEnd} %{crash_state}"
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}Стан збою:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Дані:%{labelEnd} %{evidence}"
@@ -1069,7 +1096,7 @@ msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnM
msgstr "%{reportType} виÑвив %{totalStart}%{total}%{totalEnd} потенціал %{vulnMessage}"
msgid "%{reportType} detected no %{totalStart}new%{totalEnd} vulnerabilities."
-msgstr ""
+msgstr "%{reportType} не виÑвив %{totalStart}нових%{totalEnd} вразливоÑтей."
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Спробуйте знову%{retryButtonEnd} або %{newFileButtonStart}прикріпити новий файл%{newFileButtonEnd}."
@@ -1086,9 +1113,6 @@ msgstr "%{runner} Ñтворено %{timeago}"
msgid "%{scope} results for term '%{term}'"
msgstr "%{scope} результати Ð´Ð»Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ \"%{term}\""
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search} %{description} %{scope}"
-
msgid "%{seconds}s"
msgstr "%{seconds}Ñ"
@@ -1150,7 +1174,7 @@ msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that
msgstr ""
msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "%{strongStart}Порада:%{strongEnd}Ви також можете перевірÑти запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾, %{linkStart}ДізнатиÑÑŒ більше%{linkEnd}"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1188,6 +1212,9 @@ msgstr[2] ""
msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
+msgstr "%{strong_start}%{human_size}%{strong_end} Сховище проєкту"
+
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
msgstr ""
msgid "%{strong_start}%{release_count}%{strong_end} Release"
@@ -1231,6 +1258,9 @@ msgstr "%{timebox_type} не підтримує графік згорÑннÑ"
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} повинні мати дату початку Ñ– завершеннÑ"
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -1250,7 +1280,7 @@ msgid "%{total_warnings} warning(s) found:"
msgstr "%{total_warnings} попереджень знайдено:"
msgid "%{total} remaining issue weight"
-msgstr ""
+msgstr "%{total} загальна вага відкритих задач"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total}знайдено Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ : показано перше%{warningsDisplayed}"
@@ -1337,13 +1367,13 @@ msgid "'%{level}' is not a valid visibility level"
msgstr "\"%{level}\" не Ñ” допуÑтимим рівнем видимоÑÑ‚Ñ–"
msgid "'%{name}' Value Stream created"
-msgstr "'%{name}' Value Stream Ñтворено"
+msgstr "'%{name}' Потік значень Ñтворено"
msgid "'%{name}' Value Stream deleted"
-msgstr "'%{name}' Value Stream видалено"
+msgstr "'%{name}' Потік значень видалено"
msgid "'%{name}' Value Stream saved"
-msgstr "'%{name}' Value Stream збережено"
+msgstr "'%{name}' Потік значень збережено"
msgid "'%{source}' is not a import source"
msgstr "\"%{source}\" не є джерелом імпорту"
@@ -1469,10 +1499,10 @@ msgid "- Available to run jobs."
msgstr "- ДоÑтупний Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку завдань."
msgid "- Create or close an issue."
-msgstr ""
+msgstr "- Створити або закрити задачу."
msgid "- Create, update, or delete a merge request."
-msgstr ""
+msgstr "- СтвореннÑ, Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на злиттÑ."
msgid "- Event"
msgid_plural "- Events"
@@ -1482,7 +1512,7 @@ msgstr[2] "- Подій"
msgstr[3] "- Подій"
msgid "- Go to the Activity page for %{project_name}."
-msgstr ""
+msgstr "- Перейдіть на Ñторінку активноÑÑ‚Ñ– Ð´Ð»Ñ %{project_name}."
msgid "- List the visible events for %{project_name} using the Events API %{events_api_link}."
msgstr ""
@@ -1491,7 +1521,7 @@ msgid "- Not available to run jobs."
msgstr "- ÐедоÑтупний Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку завдань."
msgid "- Push code to the repository."
-msgstr ""
+msgstr "- Відправити код у репозиторій."
msgid "- Select -"
msgstr "- Вибрати -"
@@ -1504,10 +1534,10 @@ msgstr[2] "- КориÑтувачів"
msgstr[3] "- КориÑтувачів"
msgid "- View the last_activity_at attribute for %{project_name} using the Project API %{projects_api_link}."
-msgstr ""
+msgstr "- ПереглÑньте атрибут last_activity_at Ð´Ð»Ñ %{project_name} викориÑтовуючи API проєкту %{projects_api_link}."
msgid "- of - issues closed"
-msgstr ""
+msgstr "- з - закритих задач"
msgid "- of - weight completed"
msgstr "- з - ваги виконано"
@@ -1522,11 +1552,18 @@ msgid "/"
msgstr "/"
msgid "/day"
-msgstr ""
+msgstr "/день"
msgid "0 bytes"
msgstr "0 байт"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "1 день"
@@ -1743,10 +1780,10 @@ msgid "404|Please contact your GitLab administrator if you think this is a mista
msgstr "Будь лаÑка, звернітьÑÑ Ð´Ð¾ адмініÑтратора GitLab, Ñкщо ви вважаєте, що це помилка."
msgid "409|Please contact your GitLab administrator if you think this is a mistake."
-msgstr ""
+msgstr "Будь лаÑка, звернітьÑÑ Ð´Ð¾ адмініÑтратора GitLab, Ñкщо ви вважаєте, що це помилка."
msgid "409|There was a conflict with your request."
-msgstr ""
+msgstr "Виник конфлікт із вашим запитом."
msgid "7 days"
msgstr "7 днів"
@@ -1784,6 +1821,9 @@ msgstr "Сайт Jekyll, Ñкий викориÑтовує Netlify Ð´Ð»Ñ CI/CD
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Ðе можливо отримати SSL Ñертифікат Let's Encrypt до того Ñк ваш домен буде перевірено."
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "Базова Ñторінка та Serverless функціÑ, що викориÑтовує AWS Lambda, AWS API Gateway та GitLab Pages"
@@ -1812,7 +1852,7 @@ msgid "A file with '%{file_name}' already exists in %{branch} branch"
msgstr "Файл з '%{file_name}' вже Ñ–Ñнує в гілці %{branch}"
msgid "A file with this name already exists."
-msgstr ""
+msgstr "Файл з таким ім'Ñм вже Ñ–Ñнує."
msgid "A group is a collection of several projects"
msgstr "Група — набір із декількох проєктів"
@@ -1842,13 +1882,13 @@ msgid "A new Release %{tag} for %{name} was published. Visit the Releases page t
msgstr "Опубліковано новий Реліз %{tag} Ð´Ð»Ñ %{name}. ПереглÑньте Ñторінку Релізів щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ:"
msgid "A new email address has been added to your GitLab account: %{email}"
-msgstr ""
+msgstr "Ðова адреÑа електронної пошти була додана до вашого облікового запиÑу GitLab: %{email}"
msgid "A new impersonation token has been created."
msgstr "Створено новий токен імітуваннÑ."
msgid "A new personal access token has been created"
-msgstr ""
+msgstr "Ðовий перÑональний токен доÑтупу було згенеровано"
msgid "A new personal access token, named %{token_name}, has been created."
msgstr "Ðовий перÑональний токен доÑтупу, названий %{token_name}, був Ñтворений."
@@ -1857,7 +1897,7 @@ msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "Ðеконфіденційний епік не може бути призначеним Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð´ÐµÐ½Ñ†Ñ–Ð¹Ð½Ð¾Ð³Ð¾ батьківÑького епіка"
msgid "A page with that title already exists"
-msgstr ""
+msgstr "Сторінка з таким заголовком вже Ñ–Ñнує"
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr "Сайт на HTML, Ñкий викориÑтовує Netlify Ð´Ð»Ñ CI/CD заміÑÑ‚ÑŒ GitLab, але вÑе ще з уÑіма іншими чудовими функціÑми GitLab"
@@ -1878,7 +1918,7 @@ msgid "A project’s repository name defines its URL (the one you use to access
msgstr "Ім'Ñ Ñховища проєкту визначає його URL-адреÑу (ту, Ñку ви викориÑтовуєте Ð´Ð»Ñ Ð´Ð¾Ñтупу до проєкту через браузер) та його міÑце на файловому диÑку, де вÑтановлено GitLab. %{link_start}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "A quarterly reconciliation is due on %{date}"
-msgstr ""
+msgstr "Щоквартальне ÑƒÐ»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚ÑŒÑÑ Ð½Ð° %{date}"
msgid "A ready-to-go template for use with Android apps"
msgstr "Готовий шаблон Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð· Android заÑтоÑунками"
@@ -1887,7 +1927,7 @@ msgid "A ready-to-go template for use with iOS Swift apps"
msgstr "Готовий шаблон Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð· iOS Swift заÑтоÑунками"
msgid "A rebase is already in progress."
-msgstr ""
+msgstr "ÐŸÐµÑ€ÐµÐ±Ð°Ð·ÑƒÐ²Ð°Ð½Ð½Ñ (rebase) вже в прогреÑÑ–."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Вхід до вашого облікового запиÑу був зроблений з наÑтупної IP-адреÑи: %{ip}"
@@ -1983,7 +2023,7 @@ msgid "APIFuzzing|Scan profile"
msgstr "Профіль ÑкануваннÑ"
msgid "APIFuzzing|Show code snippet for the profile"
-msgstr ""
+msgstr "Показати фрагмент коду Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ"
msgid "APIFuzzing|Target URL"
msgstr "Цільова URL -адреÑа"
@@ -2004,7 +2044,7 @@ msgid "APIFuzzing|To prevent a security leak, authentication info must be added
msgstr "Щоб запобігти витоку безпеки, інформацію Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— необхідно додати Ñк змінну %{ciVariablesLinkStart}CI%{ciVariablesLinkEnd}. КориÑтувач з правами доÑтупу керівника може керувати змінними CI в облаÑÑ‚Ñ– %{ciSettingsLinkStart}ÐалаштуваннÑ%{ciSettingsLinkEnd}. Ми виÑвили, що ви не Ñ” керівником. ЗафікÑуйте Ñвої зміни та призначте Ñ—Ñ… керівнику, щоб він оновив облікові дані перед об’єднаннÑм."
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 "Щоб запобігти витоку безпеки, інформацію Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— необхідно додати Ñк %{ciVariablesLinkStart}CI змінну%{ciVariablesLinkEnd}. Як кориÑтувач із правами доÑтупу керівника, ви можете керувати змінними CI в облаÑÑ‚Ñ– %{ciSettingsLinkStart}ÐалаштуваннÑ%{ciSettingsLinkEnd}."
msgid "APIFuzzing|Username for basic authentication"
msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ñ— аутентифікації"
@@ -2072,6 +2112,9 @@ msgstr "Дозволений Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² цьому прÐ
msgid "Access Git repositories or the API."
msgstr "ДоÑтуп до Git репозиторіїв або API."
+msgid "Access Token"
+msgstr "Токен доÑтупу"
+
msgid "Access Tokens"
msgstr "Токени доÑтупу"
@@ -2157,7 +2200,7 @@ msgid "AccessTokens|Static object token"
msgstr "Токен Ñтатичних об’єктів"
msgid "AccessTokens|The last time a token was used"
-msgstr ""
+msgstr "ОÑтанній раз був викориÑтаний токен"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Вони Ñ” єдиними актуальними паролÑми, коли увімкнено двофакторну автентифікцію (2FA)."
@@ -2189,6 +2232,12 @@ msgstr "Ðовий"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "Перевірка доÑтупноÑÑ‚Ñ– виÑвила помилку такого типу: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "Обліковий запиÑ"
@@ -2223,10 +2272,10 @@ msgid "AccountValidation|Validate your account"
msgstr "Перевірте ваш обліковий запиÑ"
msgid "AccountValidation|Verification is required to discourage and reduce the abuse on GitLab infrastructure. If you verify with a credit or debit card, %{strong_start}GitLab will not charge your card, it will only be used for validation.%{strong_end} %{learn_more_link}"
-msgstr ""
+msgstr "Потрібна перевірка, щоб запобігти та зменшити Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ñ€Ð°Ñтруктурою GitLab. Якщо ви підтверджуєте за допомогою кредитної або дебетової картки, %{strong_start}GitLab не зніме ÑÑ‚ÑÐ³Ð½ÐµÐ½Ð½Ñ Ð· вашої картки, вона викориÑтовуватиметьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ.%{strong_end} %{learn_more_link}"
msgid "Acknowledge"
-msgstr ""
+msgstr "Визнати"
msgid "Action"
msgstr "ДіÑ"
@@ -2247,7 +2296,7 @@ msgid "Active"
msgstr "Ðктивний"
msgid "Active %{accessTokenTypePlural} (%{totalAccessTokens})"
-msgstr ""
+msgstr "Ðктивні %{accessTokenTypePlural} (%{totalAccessTokens})"
msgid "Active %{type} (%{token_length})"
msgstr "Ðктивні %{type} (%{token_length})"
@@ -2279,9 +2328,6 @@ msgstr "Додати ÑпиÑок змін (CHANGELOG)"
msgid "Add CONTRIBUTING"
msgstr "Додати CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr "Додати URL-адреÑу Jaeger"
-
msgid "Add Kubernetes cluster"
msgstr "Додати Kubernetes-клаÑтер"
@@ -2304,7 +2350,7 @@ msgid "Add a %{type}"
msgstr "Додати %{type}"
msgid "Add a GCP region"
-msgstr ""
+msgstr "Додати регіон GCP"
msgid "Add a GPG key"
msgstr "Додати GPG ключ"
@@ -2312,9 +2358,6 @@ msgstr "Додати GPG ключ"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr "Додати ключ GPG Ð´Ð»Ñ Ð±ÐµÐ·Ð¿ÐµÑ‡Ð½Ð¾Ð³Ð¾ доÑтупу до GitLab. %{help_link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{help_link_end}"
-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 "Додайте URL-адреÑу Jaeger, щоб замінити цю Ñторінку поÑиланнÑм на ваш Ñервер Jaeger. Спочатку вам потрібно %{link_start_tag} вÑтановити Jaeger%{link_end_tag}."
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr "Додати угоду про умови Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ñлуг Ñ– політику конфіденційноÑÑ‚Ñ– Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів цього інÑтанÑа GitLab."
@@ -2342,9 +2385,6 @@ 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 new issue"
msgstr "Додати нову задачу"
@@ -2418,7 +2458,7 @@ msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
msgstr "Додати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñк коментарі до Ñ–Ñторій Pivotal Tracker. %{docs_link}"
msgid "Add customer relation contact(s)."
-msgstr ""
+msgstr "Додати контакт(и) по роботі з клієнтами."
msgid "Add customer relation contacts"
msgstr "Додати контакти по роботі з клієнтами."
@@ -2448,7 +2488,7 @@ msgid "Add image comment"
msgstr "Додати коментар до зображеннÑ"
msgid "Add internal note"
-msgstr ""
+msgstr "Додати внутрішню нотатку"
msgid "Add key"
msgstr "Додати ключ"
@@ -2541,7 +2581,7 @@ msgid "Add webhook"
msgstr "Додати вебхук"
msgid "Add your team members and others to GitLab."
-msgstr ""
+msgstr "Додайте членів вашої команди та інших у GitLab"
msgid "Add/remove"
msgstr "Додати/видалити"
@@ -2559,7 +2599,7 @@ msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "Перевищено ліміт запрошень: %{daily_invites} на день"
msgid "AddMember|Invites cannot be blank"
-msgstr ""
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð½Ðµ може бути пуÑтим"
msgid "AddMember|No invite source provided."
msgstr "ВідÑутнє джерело запрошеннÑ."
@@ -2594,9 +2634,6 @@ msgstr "Додано в цій верÑÑ–Ñ—"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ інÑтанÑу GitLab заборонено. ЗвернітьÑÑ Ð´Ð¾ Ñвого адмініÑтратора GitLab, щоб отримати дозвіл"
-msgid "Additional Metadata"
-msgstr "Додаткові метадані"
-
msgid "Additional minutes"
msgstr "Додаткові хвилини"
@@ -2640,7 +2677,7 @@ msgid "Adds email participant(s)."
msgstr "Додає учаÑника(ів)."
msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
-msgstr ""
+msgstr "Додайте цей %{issuable_type} Ñк пов'Ñзаний з %{issuable_type} Ñкщо він був Ñтворений"
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr "Ðалаштувати чаÑтоту оновлень інтерфейÑу Gitlab."
@@ -2724,7 +2761,7 @@ msgid "AdminArea|Included Free in license"
msgstr "Безкоштовно включені в ліцензію"
msgid "AdminArea|Instance OAuth applications"
-msgstr ""
+msgstr "ІнÑÑ‚Ð°Ð½Ñ Ð·Ð°ÑтоÑунків OAuth"
msgid "AdminArea|Latest groups"
msgstr "ОÑтанні групи"
@@ -2739,7 +2776,7 @@ msgid "AdminArea|Maintainer"
msgstr "Керівник"
msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
-msgstr ""
+msgstr "Керуйте заÑтоÑунками Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ інÑтанÑа, Ñкі можуть викориÑтовувати GitLab Ñк %{docs_link_start}провайдер OAuth%{docs_link_end}."
msgid "AdminArea|Minimal access"
msgstr "Мінімальний доÑтуп"
@@ -2754,7 +2791,7 @@ msgid "AdminArea|New user"
msgstr "Ðовий кориÑтувач"
msgid "AdminArea|No applications found"
-msgstr ""
+msgstr "ЗаÑтоÑунків не знайдено"
msgid "AdminArea|Owner"
msgstr "ВлаÑник"
@@ -2823,7 +2860,7 @@ msgid "AdminLabels|They can be used to categorize issues and merge requests."
msgstr "Їх можна викориÑтати Ð´Ð»Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ— задач та запитів на злиттÑ."
msgid "AdminProjects| You’re about to permanently delete the project %{projectName}, its repository, and all related resources, including issues and merge requests. After you confirm and press %{strong_start}Delete project%{strong_end}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Ви збираєтеÑÑ Ð½Ð°Ð·Ð°Ð²Ð¶Ð´Ð¸ видалити проєкт %{projectName}, його репозиторій та вÑÑ– пов'Ñзані реÑурÑи, включаючи задачі та запити на злиттÑ. ПіÑÐ»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° натиÑÐºÐ°Ð½Ð½Ñ %{strong_start} Видалити проєкт %{strong_end} це не можна буде ÑкаÑувати або відновити."
msgid "AdminProjects|Delete"
msgstr "Видалити"
@@ -2832,13 +2869,13 @@ msgid "AdminProjects|Delete Project %{projectName}?"
msgstr "Видалити проєкт %{projectName}?"
msgid "AdminSettings|%{strongStart}WARNING:%{strongEnd} Environment variable %{environment_variable} does not exist or is not pointing to a valid directory. %{icon_link}"
-msgstr ""
+msgstr "%{strongStart}ПОПЕРЕДЖЕÐÐЯ:%{strongEnd} Змінна Ñередовища %{environment_variable} не Ñ–Ñнує або не вказує на дійÑний каталог. %{icon_link}"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "Let's Encrypt буде налаштований Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інÑтанÑа GitLab за допомогою цієї адреÑи електронної пошти. Ви отримуватимете повідомленнÑ, Ñкі попереджають про Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії Ñертифікатів. %{link_start}ДізнайтеÑÑŒ більше. %{link_end}"
msgid "AdminSettings|Affects all new and existing groups."
-msgstr ""
+msgstr "Впливає на вÑÑ– нові та Ñ–Ñнуючі групи."
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr "Ð’ÑÑ– нові проєкти за замовчуваннÑм можуть викориÑтовувати загальні runner'и (Runner'и) інÑтанÑа."
@@ -2846,6 +2883,9 @@ msgstr "Ð’ÑÑ– нові проєкти за замовчуваннÑм можуÑ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Домен Auto DevOps"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ CI/CD"
@@ -2856,7 +2896,7 @@ msgid "AdminSettings|Configure when inactive projects should be automatically de
msgstr ""
msgid "AdminSettings|Delete inactive projects"
-msgstr ""
+msgstr "Видалити неактивні проєкти"
msgid "AdminSettings|Delete inactive projects that exceed"
msgstr ""
@@ -2865,7 +2905,7 @@ msgid "AdminSettings|Delete project after"
msgstr ""
msgid "AdminSettings|Disable Elasticsearch until indexing completes."
-msgstr ""
+msgstr "Вимкніть Elasticsearch до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑуваннÑ."
msgid "AdminSettings|Disable feed token"
msgstr "Вимкнути токен Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"
@@ -2913,11 +2953,14 @@ msgid "AdminSettings|Enable smartcn custom analyzer: Search"
msgstr ""
msgid "AdminSettings|Enabled"
-msgstr ""
+msgstr "Увімкнено"
msgid "AdminSettings|Feed token"
msgstr "Токен доÑтупу до каналів"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "Я прочитав Ñ– погоджуюÑÑŒ %{link_start}умовами викориÑтаннÑ%{link_end} (PDF)."
@@ -2940,10 +2983,10 @@ msgid "AdminSettings|Let's Encrypt email"
msgstr "електронна пошта Let's Encrypt"
msgid "AdminSettings|Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
+msgstr "Обмежити розмір проєкту на загальному, груповому та проєктному рівнÑÑ…. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{link_end}."
msgid "AdminSettings|Limit the number of namespaces and projects that can be indexed."
-msgstr ""
+msgstr "Обмежити кількіÑÑ‚ÑŒ проÑторів імен та проєктів, що можуть бути індекÑовані."
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr "МакÑимальна триваліÑÑ‚ÑŒ ÑеÑÑ–Ñ— Ð´Ð»Ñ Git операцій, коли 2FA увімкнена."
@@ -3051,7 +3094,7 @@ msgid "AdminSettings|Setting must be greater than 0."
msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
-msgstr ""
+msgstr "Розмір Ñ– параметри Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ Ð´Ð»Ñ Ñтатичних Ñайтів Сторінок."
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
@@ -3060,7 +3103,7 @@ msgid "AdminSettings|The latest artifacts for all jobs in the most recent succes
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 ""
+msgstr "Проєкти цієї групи можна вибрати Ñк шаблони Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів, Ñтворених в інÑтанÑÑ–. %{link_start}ДізнайтеÑÑŒ більше.%{link_end} "
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 "Шаблон Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾Ñ— конфігурації конвеєра може бути одним із шаблонів, наданих GitLab, або інший шаблон доданий до репозиторію шаблонів інÑтанÑу. %{link_start}Як Ñтворити шаблон інÑтанÑу?%{link_end}"
@@ -3143,8 +3186,8 @@ msgstr "2FA вимкнено"
msgid "AdminUsers|2FA Enabled"
msgstr "2FA увімкнено"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "КориÑтувач може перевірити Ñебе, ввівши кредитну/дебетову картку, або адмініÑтратор може вручну перевірÑти кориÑтувача."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr ""
msgid "AdminUsers|Access"
msgstr "ДоÑтуп"
@@ -3152,6 +3195,9 @@ msgstr "ДоÑтуп"
msgid "AdminUsers|Access Git repositories"
msgstr "ДоÑтуп до Git репозиторіїв"
+msgid "AdminUsers|Access level"
+msgstr "Рівень доÑтупу"
+
msgid "AdminUsers|Access the API"
msgstr "ДоÑтуп до API"
@@ -3194,6 +3240,9 @@ msgstr " Ðудитори мають доÑтуп тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "Ðвтоматично позначено Ñк внутрішній кориÑтувач за замовчуваннÑм"
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr "Забанити кориÑтувача"
@@ -3221,6 +3270,9 @@ msgstr "Заблоковано"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача має наÑтупні наÑлідки:"
+msgid "AdminUsers|Can create group"
+msgstr "Може Ñтворювати групи"
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "Ðе вдаєтьÑÑ Ð²Ð²Ñ–Ð¹Ñ‚Ð¸ або отримати доÑтуп до інформації"
@@ -3296,6 +3348,12 @@ msgstr "Це ви!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr "Докладніше про %{link_start}забанених кориÑтувачів.%{link_end}"
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr "Заблоковано"
@@ -3323,6 +3381,9 @@ msgstr "ПерÑональні проєкти буде збережено"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "ПерÑональні проєкти, групи, та Ñ–Ñторію кориÑтувача буде залишено без змін"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Повторна Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñтувача зробить:"
@@ -3341,6 +3402,9 @@ msgstr "Відхилити кориÑтувача %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "Відхилені кориÑтувачі:"
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Відновити доÑтуп кориÑтувача до облікового запиÑу, включаючи веб, Git та API."
@@ -3353,9 +3417,15 @@ msgstr "Пошук кориÑтувачів"
msgid "AdminUsers|Send email to users"
msgstr "Відправити Ð¿Ð¾Ð²Ñ–Ð´Ð¼Ð¾Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти кориÑтувачам"
+msgid "AdminUsers|Skype"
+msgstr "Skype"
+
msgid "AdminUsers|Sort by"
msgstr "Сортувати за"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr "КориÑтувач не може отримати доÑтуп до репозиторіїв git."
@@ -3404,9 +3474,6 @@ msgstr "Розблокувати кориÑтувача %{username}?"
msgid "AdminUsers|User administration"
msgstr " Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачами"
-msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr "КориÑтувач перевірений та може викориÑтовувати безкоштовні хвилини CI Ð´Ð»Ñ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ð¸Ñ… runner'ів."
-
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "КориÑтувач не зможе отримувати доÑтуп до репозиторіїв Git"
@@ -3425,6 +3492,9 @@ msgstr "Перевірити обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸ÑтувачÐ
msgid "AdminUsers|View pending member requests"
msgstr "ПереглÑнути запити учаÑників в очікуванні"
+msgid "AdminUsers|Website URL"
+msgstr "URL вебÑайту"
+
msgid "AdminUsers|What can I do?"
msgstr "Що Ñ Ð¼Ð¾Ð¶Ñƒ зробити?"
@@ -3491,6 +3561,9 @@ msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "Administration"
msgstr "ÐдмініÑтруваннÑ"
+msgid "Administrators"
+msgstr "ÐдмініÑтратори"
+
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 "Додаткові кориÑтувачі повинні бути перевірені та затверджені ÑиÑтемним адмініÑтратором. Докладніше про %{help_link_start} Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ%{help_link_end}."
@@ -3546,7 +3619,7 @@ msgid "After it expires, you can't use merge approvals, code quality, or many ot
msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many other features."
-msgstr ""
+msgstr "ПіÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ його дії ви не зможете викориÑтовувати Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ, епіків або багато інших функцій."
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
@@ -3828,7 +3901,7 @@ msgid "AlertSettings|Send test alert"
msgstr "ÐадіÑлати теÑтове попередженнÑ"
msgid "AlertSettings|Send without saving"
-msgstr ""
+msgstr "ÐадіÑлати без збереженнÑ"
msgid "AlertSettings|The form has unsaved changes"
msgstr ""
@@ -3966,9 +4039,12 @@ msgid "All projects selected"
msgstr "Ð’ÑÑ– проєкти вибрані"
msgid "All protected branches"
-msgstr ""
+msgstr "УÑÑ– захищені гілки"
msgid "All threads resolved!"
+msgstr "УÑÑ– Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð¾!"
+
+msgid "All users in this group must set up two-factor authentication"
msgstr ""
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
@@ -3983,12 +4059,6 @@ msgstr "Ð’ÑÑ– кориÑтувачі з картами, що збігаютьÑ
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Дозволити вхід через \"%{group_name}\""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr "Дозволити доÑтуп учаÑникам цієї групи"
@@ -3996,7 +4066,7 @@ msgid "Allow access to the following IP addresses"
msgstr "Дозволити доÑтуп до таких IP-адреÑ"
msgid "Allow commits from members who can merge to the target branch. %{link_start}About this feature.%{link_end}"
-msgstr ""
+msgstr "Дозволити коміти від учаÑників, Ñкі можуть об'єднувати в цільову гілку. %{link_start}Про цю функцію.%{link_end}"
msgid "Allow group owners to manage LDAP-related settings"
msgstr "Дозволити влаÑникам груп керувати налаштуваннÑми LDAP"
@@ -4031,9 +4101,6 @@ msgstr "Дозволити проєктам в цій групі викориÑÑ
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr "Дозволити публічний доÑтуп до конвеєрів Ñ– завдань, включно з логами та артефактами."
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "Дозволити підгрупам вÑтановлювати влаÑні правила двофакторної аутентифікації"
-
msgid "Allow this key to push to this repository"
msgstr "Дозволити відправлÑти ключ до цього репозиторію"
@@ -4046,9 +4113,6 @@ msgstr "Дозволити кориÑтувачам відхилÑти повіÐ
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Дозволити кориÑтувачам реєÑтрувати будь-Ñкі заÑтоÑунки Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ GitLab Ñк провайдера OAuth"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "Дозволити кориÑтувачам запрошувати доÑтуп, (Ñкщо видиміÑÑ‚ÑŒ загальнодоÑтупна або внутрішнÑ)"
-
msgid "Allowed"
msgstr "Дозволено"
@@ -4061,12 +4125,18 @@ msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ñ… доменів адреÑ
msgid "Allowed to create:"
msgstr "Дозволено Ñтворити:"
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "Ðевдача дозволена"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr "ДозволÑÑ” проєктам або підгрупам у цій групі перевизначати глобальне налаштуваннÑ."
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "ДозволÑÑ” додавати та керувати клаÑтерами Kubernetes."
@@ -4095,7 +4165,7 @@ msgid "Also unassign this user from related issues and merge requests"
msgstr "Також ÑкаÑуйте Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ кориÑтувача з пов’Ñзаних задачами та запитами на злиттÑ"
msgid "Alternate support URL for Help page and Help dropdown."
-msgstr ""
+msgstr "Ðльтернативна URL-адреÑа підтримки Ð´Ð»Ñ Ñторінки довідки та Ñпадного меню довідки."
msgid "Alternatively, you can convert your account to a managed account by the %{group_name} group."
msgstr "Крім того, ви можете перетворити Ñвій акаунт в акаунт, керований групою %{group_name}."
@@ -4226,6 +4296,9 @@ msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑ
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr "Помилка при отриманні гілок."
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "Помилка при отриманні гілок. Повторіть пошук."
@@ -4323,7 +4396,7 @@ msgid "An error occurred while loading chart data"
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… діаграми"
msgid "An error occurred while loading code owners."
-msgstr ""
+msgstr "Виникла помилка при завантаженні влаÑників коду."
msgid "An error occurred while loading commit signatures"
msgstr "ТрапилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні підпиÑів комітів"
@@ -4353,10 +4426,10 @@ msgid "An error occurred while loading the Jobs tab."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ завдань."
msgid "An error occurred while loading the Needs tab."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні необхідної вкладки."
msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
+msgstr "Виникла помилка при завантаженні вкладки зі звітами про теÑтуваннÑ."
msgid "An error occurred while loading the access tokens form, please try again."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ токенів доÑтупу. Повторіть Ñпробу."
@@ -4440,13 +4513,16 @@ msgid "An error occurred while retrieving diff"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні різниці"
msgid "An error occurred while retrieving diff files"
-msgstr ""
+msgstr "Виникла помилка при отриманні файлів відмінноÑтей."
msgid "An error occurred while retrieving projects."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… налаштувань. Перезавантажте Ñторінку, щоб Ñпробувати ще раз."
+
msgid "An error occurred while saving changes: %{error}"
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: %{error}"
msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
@@ -4455,6 +4531,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при збереженні ваших параметрів. Спробуйте зберегти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð¾Ð²Ñƒ."
+
msgid "An error occurred while subscribing to notifications."
msgstr "Помилка при підпиÑці на ÑповіщеннÑ."
@@ -4465,7 +4544,7 @@ msgid "An error occurred while trying to follow this user, please try again."
msgstr ""
msgid "An error occurred while trying to generate the report. Please try again later."
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ñпроби Ñтворити звіт ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте пізніше."
msgid "An error occurred while trying to run a new pipeline for this merge request."
msgstr "Помилка при запуÑку нового конвеєру Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ запиту на злиттÑ."
@@ -4528,7 +4607,7 @@ msgid "An incident has been triggered in %{project_path}."
msgstr "Інцидент ÑтавÑÑ Ð² %{project_path}."
msgid "An integer value is required for seconds"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñекунд потрібне ціліÑне значеннÑ"
msgid "An issue already exists"
msgstr "Ð¦Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° вже Ñ–Ñнує"
@@ -4662,6 +4741,9 @@ msgstr "Ліміти заÑтоÑунку уÑпішно збережено"
msgid "Application settings saved successfully"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°ÑтоÑунку уÑпішно збережено"
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ програми не вдалоÑÑ"
@@ -4678,13 +4760,13 @@ msgid "Application: %{name}"
msgstr "Додаток: %{name}"
msgid "ApplicationSettings|A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
+msgstr "Пункт меню ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¸ відображаєтьÑÑ Ð² розділі «Моніторинг в облаÑÑ‚Ñ– ÐдмініÑтратора»."
msgid "ApplicationSettings|Add a link to Grafana"
-msgstr ""
+msgstr "Додати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Grafana"
msgid "ApplicationSettings|After sign-up text"
-msgstr ""
+msgstr "ТекÑÑ‚ піÑÐ»Ñ Ñ€ÐµÑ”Ñтрації"
msgid "ApplicationSettings|After the instance reaches the user cap, any user who is added or requests access must be approved by an administrator. Leave blank for unlimited."
msgstr ""
@@ -4700,10 +4782,10 @@ msgstr ""
msgid "ApplicationSettings|Approve %d user"
msgid_plural "ApplicationSettings|Approve %d users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Затвердити %d кориÑтувача"
+msgstr[1] "Затвердити %d кориÑтувачів"
+msgstr[2] "Затвердити %d кориÑтувачів"
+msgstr[3] "Затвердити %d кориÑтувачів"
msgid "ApplicationSettings|Approve users"
msgstr "Схвалити кориÑтувачів"
@@ -4746,7 +4828,7 @@ msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
msgid "ApplicationSettings|Enable email restrictions for sign-ups"
-msgstr ""
+msgstr "Увімкнути Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації"
msgid "ApplicationSettings|Enter denylist manually"
msgstr "Введіть ÑпиÑок заборони вручну"
@@ -4767,13 +4849,13 @@ msgid "ApplicationSettings|Save changes"
msgstr "Зберегти зміни"
msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
-msgstr ""
+msgstr "Див.%{linkStart}Правила політики щодо паролів%{linkEnd} GitLab."
msgid "ApplicationSettings|Send confirmation email on sign-up"
msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
-msgstr ""
+msgstr "РеєÑтрацію увімкнено"
msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
@@ -4807,10 +4889,10 @@ msgstr "ЗаÑтоÑувати"
msgid "Apply %d suggestion"
msgid_plural "Apply %d suggestions"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "ЗаÑтоÑувати %d пропозицію"
+msgstr[1] "ЗаÑтоÑувати %d пропозиції"
+msgstr[2] "ЗаÑтоÑувати %d пропозицій"
+msgstr[3] "ЗаÑтоÑувати %d пропозицій"
msgid "Apply a label"
msgstr "ЗаÑтоÑувати мітку"
@@ -5062,7 +5144,7 @@ msgstr "Ðрхівований проєкт! Репозиторій та іншÑ
msgid "Archived projects"
msgstr "Заархівовані проєкти"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -5168,6 +5250,9 @@ msgstr "Ви впевнені, що хочете видалити %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Ви впевнені, що хочете видалити %{group_name}?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr "Ви впевнені, що хочете видалити %{topic_name}?"
+
msgid "Are you sure you want to remove the attachment?"
msgstr "Ви впевнені, що бажаєте видалити вкладеннÑ?"
@@ -5186,6 +5271,9 @@ msgstr "Ви впевнені, що хочете видалити цей ÑпиÑ
msgid "Are you sure you want to remove this nickname?"
msgstr "Ви впевнені, що хочете видалити цей пÑевдонім?"
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr "Ви дійÑно бажаєте Ñкинути токен доÑтупу відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº?"
+
msgid "Are you sure you want to reset the health check token?"
msgstr "Ви впевнені, що Ви хочете перегенерувати цей ключ перевірки працездатноÑÑ‚Ñ–?"
@@ -5196,7 +5284,7 @@ msgid "Are you sure you want to retry this migration?"
msgstr "Ви впевнені, що хочете повторити перенеÑеннÑ?"
msgid "Are you sure you want to revoke this %{accessTokenType}? This action cannot be undone."
-msgstr ""
+msgstr "Ви впевнені, що бажаєте видалити цей %{accessTokenType}? Ð¦Ñ Ð´Ñ–Ñ Ð½Ðµ може бути ÑкаÑована."
msgid "Are you sure you want to revoke this %{type}? This action cannot be undone."
msgstr "Ви впевнені, що бажаєте видалити цей %{type}? Ð¦Ñ Ð´Ñ–Ñ Ð½Ðµ може бути ÑкаÑована."
@@ -5232,7 +5320,7 @@ msgid "Are you sure? Removing this GPG key does not affect already signed commit
msgstr "Ви впевнені? Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ GPG ключа не впливає на коміти, що вже були підпиÑані."
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
-msgstr ""
+msgstr "Ви впевнені? ПриÑтрій буде виведено з GitLab, Ñ– вÑÑ– токени, що запам'Ñтовують мене, будуть відкликані."
msgid "Arrange charts"
msgstr "ВпорÑдкувати графіки"
@@ -5303,11 +5391,14 @@ msgstr "Призначити мітку"
msgid "Assign milestone"
msgstr "Призначити етап"
-msgid "Assign reviewer"
+msgid "Assign myself"
msgstr ""
+msgid "Assign reviewer"
+msgstr "Призначити оглÑдача"
+
msgid "Assign reviewer(s)"
-msgstr ""
+msgstr "Призначити оглÑдача(ів)"
msgid "Assign severity"
msgstr "Призначити рівень"
@@ -5319,7 +5410,7 @@ msgid "Assign to"
msgstr "Призначити"
msgid "Assign to commenting user"
-msgstr ""
+msgstr "Призначити кориÑтувача, Ñкий коментує"
msgid "Assign to me"
msgstr "Призначити Ñобі"
@@ -5377,7 +5468,7 @@ msgid "Assigns %{assignee_users_sentence}."
msgstr "Призначає %{assignee_users_sentence}."
msgid "Assigns %{reviewer_users_sentence} as %{reviewer_text}."
-msgstr "Призначено %{reviewer_users_sentence} Ñк %{reviewer_text}."
+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."
@@ -5400,9 +5491,6 @@ msgstr "З ризиком"
msgid "Attach a file"
msgstr "Прикріпити файл"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Прикріпити файл за допомогою перетÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr "ÐŸÑ€Ð¸ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ - %{progress}"
@@ -5426,7 +5514,7 @@ msgid "Audit Events"
msgstr "Події аудиту"
msgid "Audit events"
-msgstr ""
+msgstr "Події аудиту"
msgid "AuditLogs|(removed)"
msgstr "(видалено)"
@@ -5476,6 +5564,9 @@ msgstr "Цього міÑÑцÑ"
msgid "AuditLogs|User Events"
msgstr "Події кориÑтувача"
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr "Ðктивний"
@@ -5486,7 +5577,7 @@ msgid "AuditStreams|Add external stream destination"
msgstr ""
msgid "AuditStreams|Add stream"
-msgstr ""
+msgstr "Додати потік"
msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
msgstr ""
@@ -5498,17 +5589,26 @@ msgid "AuditStreams|An error occurred when fetching external audit event streams
msgstr ""
msgid "AuditStreams|Cancel editing"
+msgstr "СкаÑувати редагуваннÑ"
+
+msgid "AuditStreams|Custom HTTP headers"
msgstr ""
msgid "AuditStreams|Delete %{link}"
msgstr "Видалити %{link}"
msgid "AuditStreams|Destination URL"
-msgstr ""
+msgstr "URL-адреÑа призначеннÑ"
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr "Заголовок"
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5519,11 +5619,14 @@ msgid "AuditStreams|Streams"
msgstr ""
msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
-msgstr ""
+msgstr "Це може включати конфіденційну інформацію. ПереконайтеÑÑ, що ви довірÑєте кінцевій точці призначеннÑ."
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr "ЗначеннÑ"
+
msgid "Aug"
msgstr "Ñерп."
@@ -5696,7 +5799,7 @@ msgid "AutoRemediation|Auto-fix solutions"
msgstr ""
msgid "AutoRemediation|If you're using dependency and/or container scanning, and auto-fix is enabled, auto-fix automatically creates merge requests with fixes to vulnerabilities."
-msgstr ""
+msgstr "Якщо ви викориÑтовуєте ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей та/або контейнерів, Ñ– Ñкщо Ð°Ð²Ñ‚Ð¾Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¾, Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð°Ð²Ñ‚Ð¾Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ Ñтворює запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð· виправленнÑм вразливоÑÑ‚Ñ–."
msgid "AutoRemediation|Introducing GitLab auto-fix"
msgstr "ПредÑтавлÑємо GitLab автовиправленнÑ"
@@ -5780,7 +5883,7 @@ msgid "Award added"
msgstr ""
msgid "Award removed"
-msgstr ""
+msgstr "Ðагороду видалено"
msgid "AwardEmoji|No emojis found."
msgstr "Емоджі не знайдено."
@@ -5975,16 +6078,16 @@ msgid "BatchedJob|Finished at"
msgstr ""
msgid "BatchedJob|Max Value"
-msgstr ""
+msgstr "МакÑимальне значеннÑ"
msgid "BatchedJob|Max value"
-msgstr ""
+msgstr "МакÑимальне значеннÑ"
msgid "BatchedJob|Min Value"
-msgstr ""
+msgstr "Мінімальне значеннÑ"
msgid "BatchedJob|Min value"
-msgstr ""
+msgstr "Мінімальне значеннÑ"
msgid "BatchedJob|Next Status"
msgstr ""
@@ -6016,9 +6119,6 @@ msgstr "Будьте обережні. Зміна проÑтору імен пр
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Будьте обережні. ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ проєкту може мати небажані побічні ефекти."
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr "Перш ніж увімкнути цю інтеграцію, Ñтворіть вебхук Ð´Ð»Ñ ÐºÑ–Ð¼Ð½Ð°Ñ‚Ð¸ в Google Chat де ви хочете отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ цього проєкту. %{docs_link}"
@@ -6053,22 +6153,22 @@ msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
msgid "BillingPlans|10,000 CI/CD minutes per month"
-msgstr ""
+msgstr "10,000 хвилин CI/CD в міÑÑць"
msgid "BillingPlans|10GB transfer per month"
msgstr ""
msgid "BillingPlans|400 CI/CD minutes per month"
-msgstr ""
+msgstr "400 хвилин CI/CD в міÑÑць"
msgid "BillingPlans|5 users per namespace"
msgstr ""
msgid "BillingPlans|50,000 CI/CD minutes per month"
-msgstr ""
+msgstr "50,000 хвилин CI/CD в міÑÑць"
msgid "BillingPlans|5GB storage"
-msgstr ""
+msgstr "5 ГБ Ñховища"
msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
msgstr "@%{user_name} наразі ви викориÑтовуєте %{plan_name}."
@@ -6125,7 +6225,7 @@ msgid "BillingPlans|Includes free static websites"
msgstr ""
msgid "BillingPlans|Learn more"
-msgstr ""
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
msgstr "Вивчіть детальну інформацію про кожну підпиÑку за поÑиланнÑм %{faq_link} або розпочніть кориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·ÐºÐ¾ÑˆÑ‚Ð¾Ð²Ð½Ð¸Ð¼ 30-денним періодом GitLab.com Ultimate."
@@ -6134,7 +6234,7 @@ msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_li
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про кожен план перейшовши на %{pricing_page_link}."
msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}"
-msgstr ""
+msgstr "Шукаєте можливіÑÑ‚ÑŒ купівлі або ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñкою Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— групи? Перейдіть до вашої групи %{groups_link} та переглÑньте %{strong_open} ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок.%{strong_close}"
msgid "BillingPlans|Loved and trusted by our customers"
msgstr ""
@@ -6164,7 +6264,7 @@ msgid "BillingPlans|Ready to explore the value of the paid features today? Start
msgstr ""
msgid "BillingPlans|Recommended"
-msgstr ""
+msgstr "Рекомендовано"
msgid "BillingPlans|Release controls"
msgstr ""
@@ -6188,7 +6288,7 @@ msgid "BillingPlans|Still have questions?"
msgstr ""
msgid "BillingPlans|Support"
-msgstr ""
+msgstr "Підтримка"
msgid "BillingPlans|Talk to an expert today."
msgstr ""
@@ -6200,19 +6300,19 @@ msgid "BillingPlans|To manage the plan for this group, visit the billing section
msgstr "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ð»Ð°Ð½Ð¾Ð¼ цієї групи відвідайте Ñекцію оплати %{parent_billing_page_link}."
msgid "BillingPlans|Ultimate"
-msgstr ""
+msgstr "Ultimate"
msgid "BillingPlans|Upgrade to Premium"
msgstr ""
msgid "BillingPlans|Upgrade to Ultimate"
-msgstr ""
+msgstr "Оновити до Ultimate"
msgid "BillingPlans|Value stream management"
msgstr ""
msgid "BillingPlans|We're here to help."
-msgstr ""
+msgstr "Ми тут, щоб допомогти."
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "Ðе дивлÑчиÑÑŒ на те, що GitLab припинÑÑ” доÑтуп до Бронзового плану, ви можете продовжити бронзову підпиÑку ще один раз до %{eoa_bronze_plan_end_date}. Також ми пропонуємо обмежене за чаÑом безкоштовне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ Преміум плану (до 25 кориÑтувачів)! ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про зміни та пропозиції у нашому %{announcement_link}."
@@ -6224,7 +6324,7 @@ msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_lin
msgstr "Ви повинні %{move_link_start}переміÑтити цей проєкт%{move_link_end} до однієї з ваших груп."
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
-msgstr ""
+msgstr "Ваш пробний період GitLab.com %{plan} %{strong_open} закінчуєтьÑÑ Ñ‡ÐµÑ€ÐµÐ· %{expiration_date}%{strong_close}. Ви можете зберегти доÑтуп до переваг %{plan} шлÑхом Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ."
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
msgstr "Ваша пробна верÑÑ–Ñ GitLab.com закінчилаÑÑ %{expiration_date}. Ви можете відновити доÑтуп до функцій у будь-Ñкий момент виконавши Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ."
@@ -6260,25 +6360,25 @@ msgid "BillingPlan|Upgrade for free"
msgstr "Безкоштовно перейти на кращий тарифний план"
msgid "Billings|%{planName} plan"
-msgstr ""
+msgstr "%{planName} план"
msgid "Billings|An error occurred while extending your trial."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при Ñпробі продовжити ваш пробний період"
msgid "Billings|An error occurred while reactivating your trial."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ñ— активації пробного періоду."
msgid "Billings|By extending your trial, you will receive an additional 30 days of %{planName}. Your trial can be only extended once."
-msgstr ""
+msgstr "При продовженні пробного періоду ви отримаєте додаткові 30 днів %{planName}. Пробний період можна продовжити лише один раз."
msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
-msgstr ""
+msgstr "При повторній активації пробного періоду ви отримаєте додаткові 30 днів %{planName}. Пробний період можна повторно активувати лише один раз."
msgid "Billings|Error validating card details"
msgstr ""
msgid "Billings|Extend trial"
-msgstr ""
+msgstr "ÐŸÑ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð½Ð¾Ð³Ð¾ періоду"
msgid "Billings|Free groups are limited to %{number} seats."
msgstr ""
@@ -6287,7 +6387,7 @@ msgid "Billings|In a seat"
msgstr ""
msgid "Billings|Reactivate trial"
-msgstr ""
+msgstr "Повторно активувати пробну верÑÑ–ÑŽ"
msgid "Billings|Seats in use / Seats available"
msgstr ""
@@ -6296,7 +6396,7 @@ msgid "Billings|Seats in use / Seats in subscription"
msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
-msgstr ""
+msgstr "ДоÑтупні Runner'и будуть ввімкнені піÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ñ–Ð¹Ñної кредитної картки."
msgid "Billings|The last owner cannot be removed from a seat."
msgstr ""
@@ -6311,13 +6411,13 @@ msgid "Billings|To use free CI/CD minutes on shared runners, you’ll need to va
msgstr "Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ… хвилин CI/CD на Ñпільних runner'ах, вам необхідно перевірити ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° допомогою кредитної картки. Це необхідно Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ñ‚Ð° Ð·Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ñ€Ð°Ñтруктурою GitLab. %{strongStart} Gitlab не буде ÑÑ‚Ñгувати кошти з вашої картки, вона необхідна лише Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ облікового запиÑу. %{strongEnd}"
msgid "Billings|User validation required"
-msgstr ""
+msgstr "Ðеобхідна перевірка кориÑтувача."
msgid "Billings|Validate account"
msgstr "Підтвердити обліковий запиÑ"
msgid "Billings|Validate user account"
-msgstr ""
+msgstr "Перевірити обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "Billings|You can't change the seat status of a user who was invited via a group or project."
msgstr ""
@@ -6338,13 +6438,13 @@ msgid "Billing|Add seats"
msgstr ""
msgid "Billing|An email address is only visible for users with public emails."
-msgstr ""
+msgstr "Електронна адреÑа відображаєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів з публічними електронними адреÑами."
msgid "Billing|An error occurred while approving %{user}"
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ %{user}"
msgid "Billing|An error occurred while getting a billable member details."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при Ñпробі Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про учаÑника рахунку."
msgid "Billing|An error occurred while loading GitLab subscription details."
msgstr ""
@@ -6362,7 +6462,7 @@ msgid "Billing|Awaiting member signup"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації учаÑника"
msgid "Billing|Cannot remove user"
-msgstr ""
+msgstr "Ðеможливо видалити кориÑтувача"
msgid "Billing|Direct memberships"
msgstr "ПрÑме членÑтво"
@@ -6371,7 +6471,7 @@ msgid "Billing|Enter at least three characters to search."
msgstr "Введіть щонайменше три Ñимволи Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ."
msgid "Billing|Explore all plans"
-msgstr ""
+msgstr "ПереглÑнути вÑÑ– плани"
msgid "Billing|Export list"
msgstr "ЕкÑпортувати ÑпиÑок"
@@ -6380,7 +6480,7 @@ msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
msgstr ""
msgid "Billing|From June 22, 2022 (GitLab 15.1), free groups will be limited to 5 members"
-msgstr ""
+msgstr "З 22 Ñ‡ÐµÑ€Ð²Ð½Ñ 2022 року (GitLab 15.1) безкоштовні групи будуть обмежені до 5 учаÑників"
msgid "Billing|Group invite"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð² групу"
@@ -6421,6 +6521,12 @@ msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ кориÑтувача %{user
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr "Імпорт з Bitbucket Server"
@@ -6465,7 +6571,7 @@ msgid "Blog"
msgstr "Блог"
msgid "Board scope affects which epics are displayed for anyone who visits this board"
-msgstr ""
+msgstr "ОблаÑÑ‚ÑŒ видимоÑÑ‚Ñ– дошки впливає на те, Ñкі епіки відображаютьÑÑ Ð´Ð»Ñ Ð²ÑÑ–Ñ…, хто відвідує цю дошку"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "ОблаÑÑ‚ÑŒ видимоÑÑ‚Ñ– дошки впливає на те, Ñкі задачі відображаютьÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ñ…, хто Ñ—Ñ— переглÑдає"
@@ -6507,7 +6613,7 @@ msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÑ‚Ð°Ð¿Ñ–Ð² ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
msgid "BoardScope|An error occurred while searching for labels, please try again."
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ тегів ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, будь лаÑка, Ñпробуйте ще раз."
msgid "BoardScope|An error occurred while searching for users, please try again."
msgstr "Під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ кориÑтувачів ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
@@ -6721,6 +6827,9 @@ msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑ–Ð²"
msgid "Bold text"
msgstr "Жирний текÑÑ‚"
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6869,10 +6978,10 @@ msgid "Branches|Yes, delete protected branch"
msgstr "Так, видалити захищену гілку"
msgid "Branches|You're about to permanently delete the branch %{branchName}."
-msgstr ""
+msgstr "Ви збираєтеÑÑŒ назавжди видалити гілку %{branchName}."
msgid "Branches|You're about to permanently delete the protected branch %{branchName}."
-msgstr ""
+msgstr "Ви збираєтеÑÑŒ назавжди видалити захищену гілку %{branchName}."
msgid "Branches|diverged from upstream"
msgstr "розходитьÑÑ Ð· upstream"
@@ -6938,7 +7047,7 @@ msgid "BulkImport|Destination"
msgstr ""
msgid "BulkImport|Destination group"
-msgstr ""
+msgstr "Група призначеннÑ"
msgid "BulkImport|Existing groups"
msgstr "ІÑнуючі групи"
@@ -6956,7 +7065,7 @@ msgid "BulkImport|Group import history"
msgstr ""
msgid "BulkImport|History"
-msgstr ""
+msgstr "ІÑторіÑ"
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6968,13 +7077,13 @@ msgid "BulkImport|Import is finished. Pick another name for re-import"
msgstr ""
msgid "BulkImport|Import selected"
-msgstr ""
+msgstr "Імпорт обрано"
msgid "BulkImport|Importing the group failed."
msgstr "Ðе вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ групу."
msgid "BulkImport|Last imported to %{link}"
-msgstr ""
+msgstr "ВоÑтаннє імпортовано до %{link}"
msgid "BulkImport|Name already exists."
msgstr "Ім'Ñ Ð²Ð¶Ðµ Ñ–Ñнує."
@@ -7042,11 +7151,14 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr "повинен бути групою"
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr "Графік виконаннÑ"
msgid "BurndownChartLabel|Remaining"
-msgstr ""
+msgstr "ЗалишилоÑÑŒ"
msgid "Burnup chart"
msgstr ""
@@ -7076,7 +7188,7 @@ msgid "By %{user_name}"
msgstr "Від %{user_name}"
msgid "By authenticating with an account tied to an Enterprise e-mail address, it is understood that this account is an Enterprise User. "
-msgstr ""
+msgstr "Підтверджуючи обліковий запиÑ, прив'Ñзаний до електронної пошти Enterprise, можна зрозуміти, що цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ” кориÑтувачем Enterprise. "
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "За замовчуваннÑм уÑÑ– проєкти та групи будуть викориÑтовувати глобальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñповіщень."
@@ -7138,6 +7250,9 @@ msgstr "%{percent}%{percentSymbol}"
msgid "CICDAnalytics|All time"
msgstr "УвеÑÑŒ чаÑ"
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr "ЧаÑтота розгортаннÑ"
@@ -7181,6 +7296,9 @@ msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñпільних runner'ів - це загалÑ
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7221,7 +7339,7 @@ msgid "CICD|Jobs"
msgstr "ЗавданнÑ"
msgid "CICD|Limit"
-msgstr ""
+msgstr "Ліміт"
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr "Обмежити доÑтуп CI_JOB_TOKEN"
@@ -7308,7 +7426,7 @@ msgid "Campfire token"
msgstr ""
msgid "CampfireService|API authentication token from Campfire."
-msgstr ""
+msgstr "API Токен автентифікації від Campfire"
msgid "CampfireService|From the end of the room URL."
msgstr ""
@@ -7371,34 +7489,34 @@ msgid "Canary"
msgstr "Canary"
msgid "Canary Ingress does not exist in the environment."
-msgstr ""
+msgstr "Canary Ingress не Ñ–Ñнує в цьому Ñередовищі."
msgid "Canary weight must be specified and valid range (0..100)."
-msgstr ""
+msgstr "Ðеобхідно вказати вагу Canary та дійÑний діапазон (0..100)."
msgid "CanaryIngress|%{boldStart}Canary:%{boldEnd} %{canary}"
-msgstr ""
+msgstr "%{boldStart}Canary:%{boldEnd} %{canary}"
msgid "CanaryIngress|%{boldStart}Stable:%{boldEnd} %{stable}"
-msgstr ""
+msgstr "%{boldStart}Стабільний:%{boldEnd} %{stable}"
msgid "CanaryIngress|Canary"
msgstr "Canary"
msgid "CanaryIngress|Change ratio"
-msgstr ""
+msgstr "Змінити ÑпіввідношеннÑ"
msgid "CanaryIngress|Change the ratio of canary deployments?"
msgstr ""
msgid "CanaryIngress|Doing so will set a deployment change in progress. This temporarily blocks any further configuration until the deployment is finished."
-msgstr ""
+msgstr "Це внеÑе зміни в розгортаннÑ. Це тимчаÑово блокує будь-Ñку подальшу конфігурацію до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ."
msgid "CanaryIngress|Stable"
msgstr "Стабільний"
msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{environment} compared to the stable deployment to:"
-msgstr ""
+msgstr "Ви змінюєте ÑÐ¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ canary Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° %{environment} у порівнÑнні зі Ñтабільним розгортаннÑм на:"
msgid "Cancel"
msgstr "СкаÑувати"
@@ -7410,7 +7528,7 @@ msgid "Cancel downstream pipeline"
msgstr ""
msgid "Cancel editing"
-msgstr ""
+msgstr "Відмінити редагуваннÑ"
msgid "Cancel index deletion"
msgstr "СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу"
@@ -7470,7 +7588,7 @@ msgid "Cannot make the epic confidential if it contains non-confidential child e
msgstr "Ðе можна зробити конфіденційний ідентифікатор кориÑтувача, Ñкщо він міÑтить неконфіденційні дочірні епіки"
msgid "Cannot make the epic confidential if it contains non-confidential issues"
-msgstr ""
+msgstr "Ðе можна зробити епік конфіденційним, Ñкщо він міÑтить неконфіденційні задачі"
msgid "Cannot merge"
msgstr "Ðе може виконувати злиттÑ"
@@ -7488,10 +7606,10 @@ msgid "Cannot promote issue because it does not belong to a group."
msgstr "Ðеможливо переміÑтити задачу, тому що вона не належить групі."
msgid "Cannot promote issue due to insufficient permissions."
-msgstr ""
+msgstr "Ðе вдаєтьÑÑ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰Ð¸Ñ‚Ð¸ задачу через недоÑтатній доÑтуп."
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
-msgstr ""
+msgstr "Ðеможливо поÑилатиÑÑ Ð½Ð° групу %{timebox_type} за внутрішнім ідентифікатором!"
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr "Ðеможливо показати попередній переглÑд. Ð”Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду файлів Sketch, вони повинні мати формат, введений верÑією 43 або вище."
@@ -7508,6 +7626,9 @@ msgstr "Ім'Ñ Ð²Ð»Ð°Ñника картки"
msgid "Card number:"
msgstr "Ðомер картки:"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7572,10 +7693,10 @@ msgid "Change path"
msgstr "Змінити шлÑÑ…"
msgid "Change reviewer(s)"
-msgstr ""
+msgstr "Змінити оглÑдача(ів)"
msgid "Change reviewer(s)."
-msgstr ""
+msgstr "Змінити оглÑдача(ів)."
msgid "Change role"
msgstr "Змінити роль"
@@ -7599,10 +7720,10 @@ msgid "Change your password or recover your current one"
msgstr "Змініть пароль або відновіть поточний"
msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
+msgstr "ОглÑдача змінено з %{old} на %{new}"
msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
+msgstr "ОглÑдача змінено на %{new}"
msgid "ChangeReviewer|Unassigned"
msgstr "Ðепризначено"
@@ -7611,7 +7732,7 @@ msgid "ChangeTypeAction|Cherry-pick"
msgstr "Вибрати (cherry-pick)"
msgid "ChangeTypeAction|GitLab will create a branch in your fork and start a merge request."
-msgstr ""
+msgstr "GitLab Ñтворить гілку у вашому форку та почне запит на злиттÑ."
msgid "ChangeTypeAction|Pick into branch"
msgstr "Вибрати у гілці"
@@ -7656,7 +7777,7 @@ msgid "Changed merge method to %{merge_method}"
msgstr ""
msgid "Changed reviewer(s)."
-msgstr ""
+msgstr "Змінено оглÑдача(ів)."
msgid "Changed squash option to %{squash_option}"
msgstr ""
@@ -7679,9 +7800,6 @@ msgstr "Зміни приховано. ÐатиÑніть щоб показатÐ
msgid "Changes the title to \"%{title_param}\"."
msgstr "Змінює заголовок на \"%{title_param}\"."
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr "Зміни в заголовку не збережені"
@@ -7755,10 +7873,10 @@ msgid "Check out branch"
msgstr ""
msgid "Check out, review, and merge locally"
-msgstr ""
+msgstr "Перевірте, переглÑньте та об’єднайте локально"
msgid "Check the %{code_open}elasticsearch.log%{code_close} file to debug why the migration halted and make any changes before retrying the migration. When you fix the cause of the failure, select %{strong_open}Retry migration%{strong_close}, and the migration is scheduled to retry in the background."
-msgstr ""
+msgstr "Перевірте файл %{code_open}elasticsearch.log%{code_close}, щоб вирішити причину зупинки міграції, та внеÑÑ–Ñ‚ÑŒ будь-Ñкі зміни перед повторною Ñпробою міграції. Коли ви уÑунете причину збою, виберіть %{strong_open}Повторити міграцію%{strong_close}, Ñ– Ð¼Ñ–Ð³Ñ€Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ запланована Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ñ— Ñпроби у фоновому режимі."
msgid "Check the current instance configuration "
msgstr "Перевірте поточну конфігурацію інÑтанÑу "
@@ -7770,7 +7888,7 @@ msgid "Check your Docker images for known vulnerabilities."
msgstr "Перевірте Ñвої образи Docker на наÑвніÑÑ‚ÑŒ відомих вразливоÑтей."
msgid "Check your Kubernetes cluster images for known vulnerabilities."
-msgstr ""
+msgstr "Перевірте образи клаÑтера Kubernetes на наÑвніÑÑ‚ÑŒ відомих вразливоÑтей."
msgid "Checking %{text} availability…"
msgstr "Перевірка доÑтупноÑÑ‚Ñ– %{text}…"
@@ -7816,13 +7934,13 @@ msgid "Checkout|%{name}'s GitLab subscription"
msgstr "ПідпиÑка GitLab Ð´Ð»Ñ %{name}"
msgid "Checkout|%{name}'s storage subscription"
-msgstr ""
+msgstr " ПідпиÑка на Ñховище%{name}"
msgid "Checkout|%{quantity} CI minutes"
msgstr "%{quantity} СІ хвилин"
msgid "Checkout|%{quantity} GB of storage"
-msgstr ""
+msgstr "%{quantity} ГБ Ñховища"
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
@@ -7838,7 +7956,7 @@ msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
-msgstr ""
+msgstr "(може бути %{linkStart}знÑтий піÑÐ»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸%{linkEnd})"
msgid "Checkout|(x%{numberOfUsers})"
msgstr "(x%{numberOfUsers})"
@@ -7916,7 +8034,7 @@ msgid "Checkout|Failed to load states. Please try again."
msgstr ""
msgid "Checkout|Failed to load the payment form. Please try again."
-msgstr ""
+msgstr "Помилка при завантаженні форми оплати. Будь лаÑка, Ñпробуйте знову."
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати кредитну картку. Будь лаÑка, Ñпробуйте ще раз."
@@ -7933,11 +8051,17 @@ msgstr "GitLab план"
msgid "Checkout|Group"
msgstr "Група"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Ðазва компанії або організації, що викориÑтовує GitLab"
msgid "Checkout|Name: %{errors}"
-msgstr ""
+msgstr "Ðазва: %{errors}"
msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
msgstr "Потрібно більше кориÑтувачів? Придбайте GitLab Ð´Ð»Ñ %{company}."
@@ -7984,9 +8108,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr "Податки"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr "Ð’Ñього"
@@ -8024,10 +8145,10 @@ msgid "Checkout|minutes"
msgstr "хвилини"
msgid "Checkout|x %{quantity} %{units} per pack"
-msgstr ""
+msgstr "x %{quantity} %{units} за пакет"
msgid "Checkout|x %{quantity} %{units} per pack ="
-msgstr ""
+msgstr "x %{quantity} %{units} за пакет ="
msgid "Cherry-pick this commit"
msgstr "Вибрати (cherry-pick) цей коміт"
@@ -8050,6 +8171,9 @@ msgstr "Дочірній епік не Ñ–Ñнує."
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr "Дочірні елементи"
+
msgid "Chinese language support using"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¸Ñ‚Ð°Ð¹Ñької мови"
@@ -8078,7 +8202,7 @@ msgid "Choose file…"
msgstr "Виберіть файл…"
msgid "Choose the preferred Runner and populate the AWS CFT."
-msgstr ""
+msgstr "Виберіть потрібний Runner і заповніть AWS CFT."
msgid "Choose the top-level group for your repository imports."
msgstr "Оберіть групу найвищого Ñ€Ñ–Ð²Ð½Ñ Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ репозиторіїв."
@@ -8198,7 +8322,7 @@ msgid "CiVariables|Protected"
msgstr "Захищений"
msgid "CiVariables|Remove variable"
-msgstr ""
+msgstr "Видалити змінну"
msgid "CiVariables|Remove variable row"
msgstr "Видалити Ñ€Ñдок змінних"
@@ -8243,7 +8367,7 @@ msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr "не доÑтупно: %{reason}"
msgid "Clean up after running %{link_start}git filter-repo%{link_end} on the repository."
-msgstr ""
+msgstr "ОчиÑтити піÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку %{link_start}git filter-repo%{link_end} в репозиторії."
msgid "Cleanup policies are executed by background workers. This setting defines the maximum number of workers that can run concurrently. Set it to 0 to remove all workers and not execute the cleanup policies."
msgstr ""
@@ -8283,7 +8407,7 @@ msgid "Clear recent searches"
msgstr "ОчиÑтити недавні пошуки"
msgid "Clear repository checks"
-msgstr ""
+msgstr "ОчиÑтити перевірки репозиторію"
msgid "Clear search"
msgstr "ОчиÑтити пошук"
@@ -8322,16 +8446,16 @@ msgid "Clears weight."
msgstr "Очищає вагу."
msgid "Click %{link_start}here%{link_end} to view the request."
-msgstr ""
+msgstr "ÐатиÑніть %{link_start}тут%{link_end} , щоб переглÑнути запит."
msgid "Click %{link_to} to view the request."
-msgstr ""
+msgstr "ÐатиÑніть %{link_to} , щоб переглÑнути запит."
msgid "Click the link below to confirm your email address (%{email})"
-msgstr ""
+msgstr "ÐатиÑніть на поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ, щоб підтвердити Ñвою електронну пошту (%{email})"
msgid "Click the link below to confirm your email address."
-msgstr ""
+msgstr "ÐатиÑніть поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ, щоб підтвердити Ñвою адреÑу електронної пошти."
msgid "Click to expand it."
msgstr "ÐатиÑніть, щоб розгорнути його."
@@ -8376,19 +8500,19 @@ msgid "Clone with SSH"
msgstr "Клонувати з SSH"
msgid "CloneIssue|Cannot clone issue due to insufficient permissions!"
-msgstr ""
+msgstr "Ðеможливо клонувати задачу через недоÑтатній рівень дозволів!"
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr "Ðеможливо клонувати задачу до цільового проєкту, оÑкільки вона очікує на видаленнÑ."
msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
-msgstr ""
+msgstr "Ðеможливо клонувати задачі типу '%{issue_type}."
msgid "Cloned this issue to %{path_to_project}."
msgstr "Клоновано цю задачу до %{path_to_project}."
msgid "Clones this issue, without comments, to %{project}."
-msgstr ""
+msgstr "Клонує цю задачу без коментарів до %{project}."
msgid "Close"
msgstr "Закрити"
@@ -8426,6 +8550,9 @@ msgstr "Закрито %{epicTimeagoDate}"
msgid "Closed MRs"
msgstr "Закриті запити"
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "Закриті задачі"
@@ -8444,6 +8571,123 @@ msgstr "Cloud Run"
msgid "Cloud Storage"
msgstr "Хмарне Ñховище даних"
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr "Cloud SQL Ð´Ð»Ñ MySQL"
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr "ВерÑÑ–Ñ Ð±Ð°Ð·Ð¸ даних"
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr "Тип машини"
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr "ВерÑÑ–Ñ"
+
msgid "Cluster"
msgstr "КлаÑтер"
@@ -8453,11 +8697,8 @@ msgstr "Стан клаÑтера"
msgid "Cluster cache cleared."
msgstr "Кеш клаÑтера очищено."
-msgid "Cluster does not exist"
-msgstr "КлаÑтер не Ñ–Ñнує"
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
-msgstr ""
+msgstr "Ðеобхідний клаÑтер Ð´Ð»Ñ Stages::ClusterEndpointInserter "
msgid "Cluster level"
msgstr "Рівень клаÑтера"
@@ -8472,7 +8713,7 @@ msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} уÑпішно видалено"
msgid "ClusterAgents|%{name} successfully revoked"
-msgstr ""
+msgstr "%{name} уÑпішно відкликано"
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr "%{number} з %{total} агентів"
@@ -8535,10 +8776,10 @@ msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні вашого агента"
msgid "ClusterAgents|An error occurred while loading your agents"
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні ваших агентів"
msgid "ClusterAgents|An error occurred while retrieving agent activity. Reload the page to try again."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– агента. Перезавантажте Ñторінку, щоб Ñпробувати знову."
msgid "ClusterAgents|An unknown error occurred. Please try again."
msgstr "СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка, Ñпробуйте ще раз."
@@ -8547,7 +8788,7 @@ msgid "ClusterAgents|Are you sure you want to delete this agent? You cannot undo
msgstr "Ви впевнені, що хочете видалити цього агента? Ви не можете ÑкаÑовувати це."
msgid "ClusterAgents|Are you sure you want to revoke this token? You cannot undo this action."
-msgstr ""
+msgstr "Ви впевнені, що хочете відкликати цей токен? Цю дію не можна відмінити."
msgid "ClusterAgents|Certificate"
msgstr "Сертифікат"
@@ -8631,22 +8872,22 @@ msgid "ClusterAgents|From a terminal, connect to your cluster and run this comma
msgstr ""
msgid "ClusterAgents|GitLab agent"
-msgstr ""
+msgstr "Ðгент GitLab"
msgid "ClusterAgents|GitLab agent for Kubernetes"
-msgstr ""
+msgstr "Ðгент GitLab Ð´Ð»Ñ Kubernetes"
msgid "ClusterAgents|Give feedback"
msgstr "Ðадати відгук"
msgid "ClusterAgents|How do I register an agent?"
-msgstr ""
+msgstr "Як мені зареєÑтрувати агента?"
msgid "ClusterAgents|How to update an agent?"
msgstr "Як оновити агента?"
msgid "ClusterAgents|Install using Helm (recommended)"
-msgstr ""
+msgstr "Ð’Ñтановити за допомогою Helm (рекомендовано)"
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "ОÑтаннє Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %{timeAgo}."
@@ -8701,13 +8942,13 @@ msgid "ClusterAgents|Requires a Maintainer or greater role to perform these acti
msgstr "Потрібна роль Керівника або більша, Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ†Ð¸Ñ… дій"
msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
-msgstr ""
+msgstr "Потрібна роль Керівника або більша, Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— дій"
msgid "ClusterAgents|Revoke access token?"
-msgstr ""
+msgstr "Відкликати токен доÑтупу?"
msgid "ClusterAgents|Revoke token"
-msgstr ""
+msgstr "Відкликати токен"
msgid "ClusterAgents|Security"
msgstr "Безпека"
@@ -8722,7 +8963,7 @@ msgid "ClusterAgents|Tell us what you think"
msgstr "Розкажіть нам, що ви думаєте"
msgid "ClusterAgents|The GitLab agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab agent.%{linkEnd}"
-msgstr ""
+msgstr "GitLab agent забезпечує підвищений рівень безпеки при підключенні Kubernetes-клаÑтерів до GitLab. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про GitLab agent.%{linkEnd}"
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr "Ðгент не був підключений протÑгом тривалого чаÑу. Можливо, виникла проблема з підключеннÑм. ОÑтанній Ñ‡Ð°Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ² %{timeAgo}."
@@ -8740,7 +8981,7 @@ msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "Щоб видалити агента, введіть %{name} Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
msgid "ClusterAgents|To revoke the token, type %{name} to confirm:"
-msgstr ""
+msgstr "Щоб відкликати токен, введіть %{name} Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
msgid "ClusterAgents|Token created by %{userName}"
msgstr "Токен, Ñтворений %{userName}"
@@ -8823,9 +9064,6 @@ msgstr "Детальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— із ци
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Дозволити GitLab керувати проÑторами імен та Ñлужбовими обліковими запиÑами Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ клаÑтера."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr "ДозволÑÑ” GitLab виконувати запит до Ñпеціально налаштованого у клаÑтері Elasticsearch Ð´Ð»Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ–Ð² Pod."
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr "ДозволÑÑ” GitLab виконувати запит щодо метрик до Ñпеціально налаштованого Prometheus в клаÑтері."
@@ -8865,6 +9103,9 @@ msgstr "Перевірте Ñвій токен"
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Виберіть, Ñке із ваших Ñередовищ буде викориÑтовувати цей клаÑтер."
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "ОчиÑтити кеш клаÑтера"
@@ -8899,7 +9140,7 @@ msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Скопіювати Ñ–Ð¼â€™Ñ Kubernetes-клаÑтера"
msgid "ClusterIntegration|Create a Kubernetes cluster"
-msgstr ""
+msgstr "Створити Kubernetes-клаÑтер"
msgid "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."
msgstr "Розгортати кожне Ñередовище в Ñвій влаÑний проÑÑ‚Ñ–Ñ€ імен. Ð’ іншому випадку Ñередовища в межах проєкту поділÑÑŽÑ‚ÑŒ проÑÑ‚Ñ–Ñ€ імен по вÑьому проєкту. Зверніть увагу, що кожен, хто може викликати Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñтору імен може читати його Ñекрети. Якщо змінено, Ñ–Ñнуючі Ñередовища будуть викориÑтовувати Ñвої поточні проÑтори імен допоки кеш клаÑтерів не буде очищений."
@@ -8910,9 +9151,6 @@ msgstr "Чи знаєте ви?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes СервіÑ"
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr "Увімкнути інтеграцію з Elastic Stack"
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr "Увімкнути інтеграцію Prometheus"
@@ -8962,7 +9200,7 @@ msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr "GitLab не вдалоÑÑ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸."
msgid "ClusterIntegration|GitLab failed to connect to the cluster."
-msgstr ""
+msgstr "GitLab не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ клаÑтера."
msgid "ClusterIntegration|GitLab-managed cluster"
msgstr "КлаÑтер, що керуєтьÑÑ GitLab"
@@ -8980,10 +9218,10 @@ msgid "ClusterIntegration|HTTP Error"
msgstr "Помилка HTTP"
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
-msgstr ""
+msgstr "Якщо ви не хочете видалити вÑÑ– пов'Ñзані GitLab реÑурÑи, ви можете проÑто видалити інтеграцію."
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду Ñтану вашого клаÑтера, вам необхідно Ñпочатку увімкнути Prometheus на вкладці Інтеграції."
msgid "ClusterIntegration|Instance cluster"
msgstr "КлаÑтер інÑтанÑу"
@@ -9090,10 +9328,16 @@ msgstr "Сертифікат Kubernetes, що викориÑтовуєтьÑÑ Ð
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "URL-адреÑа, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð´Ð¾Ñтупу до Kubernetes API."
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr "СпоÑіб Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтерів до GitLab через Ñертифікати %{linkStart}заÑтарілий%{linkEnd} у GitLab 14.5."
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -9189,6 +9433,12 @@ msgstr "Перевірка коду"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr "Ðналітика перевірки коду відображає таблицю відкритих запитів на злиттÑ, Ñкі знаходÑÑ‚ÑŒÑÑ Ð½Ð° Ñтадії перевірки коду. Ðаразі Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту та/або фільтрів немає запитів на злиттÑ, що перевірÑÑŽÑ‚ÑŒÑÑ."
+msgid "Code block"
+msgstr "Блок коду"
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr "СтатиÑтика Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐ¾Ð´Ñƒ Ð´Ð»Ñ %{ref} %{start_date} - %{end_date}"
@@ -9270,14 +9520,17 @@ msgstr "Згортає цей файл (тільки Ð´Ð»Ñ Ð²Ð°Ñ), доки й
msgid "Collector hostname"
msgstr "Ім'Ñ Ñ…Ð¾Ñта колектора"
+msgid "Color"
+msgstr "Колір"
+
msgid "ColorWidget|An error occurred while updating color."
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
msgid "ColorWidget|Assign epic color"
msgstr ""
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "Колір"
msgid "ColorWidget|Error fetching epic color."
msgstr ""
@@ -9503,7 +9756,7 @@ msgid "Complete"
msgstr "Завершено"
msgid "Complete verification to sign in."
-msgstr ""
+msgstr "Пройдіть верифікацію, щоб зареєÑтруватиÑÑ."
msgid "Completed"
msgstr "Завершено"
@@ -9527,7 +9780,7 @@ msgid "ComplianceFrameworks|Cancel"
msgstr "СкаÑувати"
msgid "ComplianceFrameworks|Compliance framework deleted successfully"
-msgstr ""
+msgstr "Фреймворк відповідноÑÑ‚Ñ– уÑпішно видалено"
msgid "ComplianceFrameworks|Compliance pipeline configuration (optional)"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ– конвеєру (необов'Ñзково)"
@@ -9536,10 +9789,10 @@ msgid "ComplianceFrameworks|Configuration not found"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ знайдена"
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
-msgstr ""
+msgstr "Видалити фреймворк відповідноÑÑ‚Ñ– %{framework}"
msgid "ComplianceFrameworks|Delete framework"
-msgstr ""
+msgstr "Видалити фреймворк"
msgid "ComplianceFrameworks|Description"
msgstr "ОпиÑ"
@@ -9548,10 +9801,10 @@ msgid "ComplianceFrameworks|Description is required"
msgstr "Потрібен опиÑ"
msgid "ComplianceFrameworks|Edit framework"
-msgstr ""
+msgstr "Редагувати фреймворк"
msgid "ComplianceFrameworks|Error deleting the compliance framework. Please try again"
-msgstr ""
+msgstr "Помилка при видаленні фреймворку відповідноÑÑ‚Ñ– вимогам. Будь лаÑка, Ñпробуйте ще раз"
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page"
msgstr ""
@@ -9560,7 +9813,7 @@ msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please re
msgstr ""
msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
-msgstr ""
+msgstr "Додані фреймворки будуть з'ÑвлÑтиÑÑŒ тут."
msgid "ComplianceFrameworks|Invalid format"
msgstr "ÐедійÑний формат"
@@ -9578,7 +9831,7 @@ msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-
msgstr "Ðеобхідний формат: %{codeStart}шлÑÑ…/файл.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{linkEnd}"
msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ цей фреймворк відповідноÑÑ‚Ñ–. Будь лаÑка, Ñпробуйте ще раз"
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
@@ -9593,7 +9846,7 @@ msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName
msgstr ""
msgid "ComplianceFramework|Edit compliance framework"
-msgstr ""
+msgstr "Редагувати фреймворк відповідноÑÑ‚Ñ–"
msgid "ComplianceFramework|New compliance framework"
msgstr "Ðова оболонка Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ–"
@@ -9661,6 +9914,9 @@ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей в
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей в `.gitlab-ci.yml`, ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу, Ñкщо він ще не Ñ–Ñнує"
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr "Ðалаштувати GitLab"
@@ -9697,12 +9953,12 @@ msgstr "Ðалаштуйте виÑÐ²Ð»ÐµÐ½Ð½Ñ Secret Detection в `.gitlab-ci.
msgid "Configure Sentry integration for error tracking"
msgstr "Ðалаштуйте інтеграцію Sentry Ð´Ð»Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº"
-msgid "Configure Tracing"
-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 "Ðалаштуйте %{codeStart}.gitlab-webide.yml%{codeEnd} файл %{codeStart}.gitlab%{codeEnd} , щоб почати викориÑтовувати Веб-термінал. %{helpStart}Докладніше%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr "Ðалаштуйте розширені дозволи, Ñховище великих файлів, двофакторну автентифікацію та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD."
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr "Ðалаштуйте додаткові права, Ñховище великих файлів, двофакторну автентифікацію та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з клієнтами."
@@ -9710,19 +9966,19 @@ msgid "Configure existing installation"
msgstr "Ðалаштувати Ñ–Ñнуючу інÑталÑцію"
msgid "Configure pipeline"
-msgstr ""
+msgstr "Ðалаштувати конвеєр"
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr "Ðалаштуйте конвеєри Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ± заÑтоÑунків, Ñерверних поÑлуг, API та Ñтатичних реÑурÑів в Google Cloud"
msgid "Configure region"
-msgstr ""
+msgstr "Ðалаштувати регіон"
msgid "Configure region for environment"
-msgstr ""
+msgstr "Ðалаштуйте регіон Ð´Ð»Ñ Ñередовища"
msgid "Configure regions"
-msgstr ""
+msgstr "Ðалаштувати регіони"
msgid "Configure repository mirroring."
msgstr "Ðалаштувати Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð²."
@@ -9755,13 +10011,13 @@ msgid "Configure via Merge Request"
msgstr "Ðалаштувати через запит на злиттÑ"
msgid "Configure which lists are shown for anyone who visits this board"
-msgstr ""
+msgstr "Ðалаштуйте, Ñкі ÑпиÑки відображатимутьÑÑ Ð´Ð»Ñ Ð²ÑÑ–Ñ…, хто відвідує цю дошку"
msgid "Configure with a merge request"
msgstr ""
msgid "Configure your environments to be deployed to specific geographical regions"
-msgstr ""
+msgstr "Ðалаштуйте Ñвої Ñередовища Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² певних географічних регіонах"
msgid "Confirm"
msgstr "Підтвердити"
@@ -9842,10 +10098,10 @@ msgid "Connect"
msgstr "Підключити"
msgid "Connect a Kubernetes Cluster"
-msgstr ""
+msgstr "Підключити Kubernetes-клаÑтер"
msgid "Connect a cluster"
-msgstr ""
+msgstr "Підключити клаÑтер"
msgid "Connect all repositories"
msgstr "Підключити вÑÑ– репозиторії"
@@ -9892,9 +10148,6 @@ msgstr "РеєÑÑ‚Ñ€ Контейнерів"
msgid "Container Scanning"
msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ð°"
-msgid "Container does not exist"
-msgstr "Контейнер не Ñ–Ñнує"
-
msgid "Container must be a project or a group."
msgstr "Контейнер має бути проєктом або групою."
@@ -9946,7 +10199,7 @@ msgid "ContainerRegistry|CLI Commands"
msgstr "Команди CLI"
msgid "ContainerRegistry|Clean up image tags"
-msgstr ""
+msgstr "ОчиÑтити теги образів"
msgid "ContainerRegistry|Cleanup disabled"
msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾"
@@ -10042,7 +10295,7 @@ msgid "ContainerRegistry|Image repository temporarily cannot be marked for delet
msgstr ""
msgid "ContainerRegistry|Image repository will be deleted"
-msgstr ""
+msgstr "Репозиторій образів буде видалено"
msgid "ContainerRegistry|Image repository with no name located at the project URL."
msgstr ""
@@ -10120,9 +10373,6 @@ msgstr "Видалити теги Ñтарші ніж:"
msgid "ContainerRegistry|Remove these tags"
msgstr "Видалити ці теги"
-msgid "ContainerRegistry|Root image"
-msgstr "Кореневий образ"
-
msgid "ContainerRegistry|Run cleanup:"
msgstr "Виконати очищеннÑ:"
@@ -10132,6 +10382,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr "Показати повний шлÑÑ…"
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "ДеÑкі теги не були видалені"
@@ -10214,7 +10467,7 @@ msgid "ContainerRegistry|There are no container images stored for this project"
msgstr "Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту не збережено жодного образу контейнерів"
msgid "ContainerRegistry|There was an error during the deletion of this image repository, please try again."
-msgstr ""
+msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ репозиторію образів, будь лаÑка, Ñпробуйте знову."
msgid "ContainerRegistry|This image has no active tags"
msgstr "Образ не має активних тегів"
@@ -10268,19 +10521,19 @@ msgid "Contents of .gitlab-ci.yml"
msgstr "ВміÑÑ‚ .gitlab-ci.yml"
msgid "ContextCommits|Failed to create context commits. Please try again."
-msgstr ""
+msgstr "Помилка при Ñтворенні контекÑтних комітів. Будь лаÑка, Ñпробуйте знову."
msgid "ContextCommits|Failed to create/remove context commits. Please try again."
-msgstr ""
+msgstr "Помилка при Ñтворенні або видаленні контекÑтних комітів. Будь лаÑка, Ñпробуйте знову."
msgid "ContextCommits|Failed to delete context commits. Please try again."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ контекÑтні коміти. Будь лаÑка Ñпробуйте ще раз."
msgid "Continue"
msgstr "Продовжити"
msgid "Continue editing"
-msgstr ""
+msgstr "Продовжити редагуваннÑ"
msgid "Continue to the next step"
msgstr "Перейти до наÑтупного кроку"
@@ -10301,7 +10554,7 @@ msgid "ContributionAnalytics|%{created_count} created, %{closed_count} closed."
msgstr "%{created_count} Ñтворено, %{closed_count} закрито."
msgid "ContributionAnalytics|%{created_count} created, %{merged_count} merged, %{closed_count} closed."
-msgstr ""
+msgstr "%{created_count} Ñтворено, %{merged_count} об’єднано, %{closed_count} закрито."
msgid "ContributionAnalytics|%{pushes} pushes, more than %{commits} commits by %{people} contributors."
msgstr ""
@@ -10370,7 +10623,7 @@ msgid "Copy"
msgstr "Скопіювати"
msgid "Copy %{accessTokenType}"
-msgstr ""
+msgstr "Скопіювати %{accessTokenType}"
msgid "Copy %{http_label} clone URL"
msgstr "Скопіювати URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· %{http_label}"
@@ -10400,13 +10653,13 @@ msgid "Copy URL"
msgstr "Скопіювати URL"
msgid "Copy audio URL"
-msgstr ""
+msgstr "Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° аудіо"
msgid "Copy branch name"
msgstr "Скопіювати Ñ–Ð¼â€™Ñ Ð³Ñ–Ð»ÐºÐ¸"
msgid "Copy code"
-msgstr ""
+msgstr "Копіювати код"
msgid "Copy codes"
msgstr "Скопіювати коди"
@@ -10454,7 +10707,7 @@ msgid "Copy link"
msgstr "Скопіювати поÑиланнÑ"
msgid "Copy link URL"
-msgstr ""
+msgstr "Копіювати URL поÑиланнÑ"
msgid "Copy link to chart"
msgstr "Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° графік"
@@ -10469,7 +10722,7 @@ msgid "Copy source branch name"
msgstr "Копіювати назву гілки-джерела"
msgid "Copy the code below to implement tracking in your application:"
-msgstr ""
+msgstr "Скопіюйте наведений нижче код Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñƒ вашому заÑтоÑунку:"
msgid "Copy this registration token."
msgstr "Скопіювати цей токен реєÑтрації."
@@ -10487,7 +10740,7 @@ msgid "Copy value"
msgstr "Копіювати значеннÑ"
msgid "Copy video URL"
-msgstr ""
+msgstr "Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° відео"
msgid "Corpus Management"
msgstr ""
@@ -10610,7 +10863,7 @@ msgid "Could not draw the lines for job relationships"
msgstr ""
msgid "Could not fetch policy because existing policy YAML is invalid"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ політику, оÑкільки Ñ–Ñнуюча політика YAML неприпуÑтима"
msgid "Could not fetch training providers. Please refresh the page, or try again later."
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ тренінг-провайдери. Будь лаÑка, оновіть Ñторінку або Ñпробуйте пізніше."
@@ -10628,13 +10881,13 @@ msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
msgid "Could not load usage counts. Please refresh the page to try again."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ дані про викориÑтаннÑ.Будь лаÑка, оновіть Ñторінку, щоб Ñпробувати ще раз."
msgid "Could not remove %{user} from %{group}. Cannot remove last group owner."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %{user} з %{group}. Ðеможливо видалити оÑтаннього влаÑника групи."
msgid "Could not remove %{user} from %{group}. User is not a group member."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %{user} з %{group}. КориÑтувач не Ñ” учаÑником групи."
msgid "Could not remove the trigger."
msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ тригер."
@@ -10667,7 +10920,7 @@ msgid "Could not update the LDAP settings"
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ LDAP."
msgid "Could not update wiki page"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ вікі-Ñторінку"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ваші дизайни, оÑкільки один або кілька файлів, що завантажуютьÑÑ, не підтримуютьÑÑ."
@@ -10727,7 +10980,7 @@ msgid "Create a merge request"
msgstr "Створити запит на злиттÑ"
msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
-msgstr ""
+msgstr "Створити новий файл %{codeStart}.gitlab-ci.yml%{codeEnd} в кореневому каталозі репозиторію, щоб почати."
msgid "Create a new branch"
msgstr "Створити нову гілку"
@@ -10754,10 +11007,10 @@ msgid "Create an account using:"
msgstr "Створити обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° допомогою:"
msgid "Create an incident. Incidents are created for each alert triggered."
-msgstr ""
+msgstr "Створити інцидент. Інциденти ÑтворюютьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ попередженнÑ."
msgid "Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to import."
-msgstr ""
+msgstr "Створіть та надайте ваш GitHub %{link_start}перÑональний токен доÑтупу%{link_end}. Вам потрібно буде вибрати облаÑÑ‚ÑŒ дії %{code_open}репозиторію%{code_close}, щоб ми могли відображати ÑпиÑок ваших публічних Ñ– приватних репозиторіїв, доÑтупних Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ."
msgid "Create branch"
msgstr "Створити гілку"
@@ -10766,7 +11019,7 @@ msgid "Create commit"
msgstr "Створити коміт"
msgid "Create commit..."
-msgstr ""
+msgstr "Створити коміт..."
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10805,7 +11058,7 @@ msgid "Create issue"
msgstr "Створити задачу"
msgid "Create issue to resolve all threads"
-msgstr ""
+msgstr "Створити задачу Ð´Ð»Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… обговорень"
msgid "Create iteration"
msgstr "Створити ітерацію"
@@ -10835,13 +11088,13 @@ msgid "Create new %{name} by email"
msgstr "Створити новий %{name} за електронною поштою"
msgid "Create new Value Stream"
-msgstr "Створити нове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ"
+msgstr "Створити новий Потік значень"
msgid "Create new branch"
msgstr "Створити нову гілку"
msgid "Create new confidential %{issuableType}"
-msgstr ""
+msgstr "Створити новий конфіденційний %{issuableType}"
msgid "Create new directory"
msgstr "Створити новий каталог"
@@ -10858,11 +11111,14 @@ msgstr "Створити нову мітку"
msgid "Create new project"
msgstr "Створити новий проєкт"
-msgid "Create one"
+msgid "Create new..."
msgstr ""
+msgid "Create one"
+msgstr "Створити"
+
msgid "Create or close an issue."
-msgstr ""
+msgstr "Створити або закрити задачу."
msgid "Create or import your first project"
msgstr "Створіть або імпортуйте Ñвій перший проєкт"
@@ -10880,7 +11136,7 @@ msgid "Create requirement"
msgstr "Створити вимогу"
msgid "Create service account"
-msgstr ""
+msgstr "Створити ÑервіÑний обліковий запиÑ"
msgid "Create snippet"
msgstr "Створити Ñніпет"
@@ -10922,10 +11178,10 @@ msgid "CreateValueStreamForm|%{name} (default)"
msgstr "%{name} (за замовчуваннÑм)"
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
-msgstr ""
+msgstr "'%{name}' Потік значень Ñтворено"
msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
-msgstr ""
+msgstr "'%{name}' Потік значень збережено"
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -10943,10 +11199,10 @@ msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
-msgstr ""
+msgstr "Створити без шаблону"
msgid "CreateValueStreamForm|Create new Value Stream"
-msgstr ""
+msgstr "Створити новий потік значень"
msgid "CreateValueStreamForm|Create value stream"
msgstr "Створити потік значень"
@@ -10982,10 +11238,10 @@ msgid "CreateValueStreamForm|Issue stage end"
msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
-msgstr ""
+msgstr "МакÑимальна довжина %{maxLength} Ñимволів"
msgid "CreateValueStreamForm|Name is required"
-msgstr ""
+msgstr "Потрібна назва"
msgid "CreateValueStreamForm|New stage"
msgstr ""
@@ -11003,7 +11259,7 @@ msgid "CreateValueStreamForm|Recover hidden stage"
msgstr ""
msgid "CreateValueStreamForm|Restore defaults"
-msgstr ""
+msgstr "Відновити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм"
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
@@ -11153,10 +11409,10 @@ msgid "Crm|Contact"
msgstr ""
msgid "Crm|Contact has been added."
-msgstr ""
+msgstr "Контакт додано."
msgid "Crm|Contact has been updated."
-msgstr ""
+msgstr "Контакт оновлено."
msgid "Crm|Customer relations contacts"
msgstr ""
@@ -11189,10 +11445,10 @@ msgid "Crm|No organizations found"
msgstr "Організацій не знайдено"
msgid "Crm|Organization"
-msgstr ""
+msgstr "ОрганізаціÑ"
msgid "Crm|Organization has been added."
-msgstr ""
+msgstr "Організацію було додано."
msgid "Crm|Organization has been updated."
msgstr ""
@@ -11207,7 +11463,7 @@ msgid "Crowd"
msgstr ""
msgid "CsvParser|Failed to render the CSV file for the following reasons:"
-msgstr ""
+msgstr "Помилка при отриманні CSV файлу з наÑтупних причин:"
msgid "CsvParser|Quoted field unterminated"
msgstr ""
@@ -11222,7 +11478,7 @@ msgid "CsvParser|Trailing quote on quoted field is malformed"
msgstr ""
msgid "CsvParser|Unable to auto-detect delimiter; defaulted to \",\""
-msgstr ""
+msgstr "Ðе вдаєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ визначити розділювач; за замовчуваннÑм \",\""
msgid "Current"
msgstr "Поточний"
@@ -11246,7 +11502,7 @@ msgid "Current sign-in IP:"
msgstr "Поточна IP-адреÑа Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ:"
msgid "Current sign-in at:"
-msgstr ""
+msgstr "Поточний вхід в:"
msgid "Current sign-in ip"
msgstr "Поточний IP входу"
@@ -11321,7 +11577,7 @@ msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
-msgstr ""
+msgstr "Ðалаштуйте параметри CI/CD, зокрема Auto DevOps, Ñпільні Runner'и та артефакти завдань."
msgid "Customize colors"
msgstr "Параметри кольорів"
@@ -11552,6 +11808,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "Ð’ Ñередньому (оÑтанні %{days}d)"
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr "Дата"
@@ -11577,7 +11836,7 @@ msgid "DORA4Metrics|Median time an incident was open in a production environment
msgstr ""
msgid "DORA4Metrics|No incidents during this period"
-msgstr ""
+msgstr "Жодних інцидентів за цей період"
msgid "DORA4Metrics|No merge requests were deployed during this period"
msgstr "За цей період не було розгорнуто жодних запитів на злиттÑ"
@@ -11585,11 +11844,20 @@ msgstr "За цей період не було розгорнуто жодних
msgid "DORA4Metrics|Number of deployments"
msgstr "КількіÑÑ‚ÑŒ розгортань"
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про чаÑтоту розгортаннÑ."
msgid "DORA4Metrics|Something went wrong while getting lead time data."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ."
msgid "DORA4Metrics|Something went wrong while getting time to restore service data."
msgstr ""
@@ -11633,14 +11901,14 @@ msgstr "Ðе вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ %{invalidProjects}. Ð¦Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ Ð
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 "Ðалаштуйте параметри DAST відповідно до ваших вимог. Зміни конфігурації, зроблені тут, перевизначать налаштуваннÑ, надані GitLab, Ñ– не будуть оновлюватиÑÑ. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆ детальної інформації про додаткові Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñньте %{docsLinkStart}документацію GitLab DAST%{docsLinkEnd}."
-msgid "DastConfig|DAST Settings"
-msgstr "Параметри DAST"
+msgid "DastConfig|DAST CI/CD configuration"
+msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ DAST CI/CD"
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
-msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÑкануваннÑ"
+msgid "DastConfig|Generate code snippet"
+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-Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ (запити та відповіді), надіÑлані цільовому об’єкту. Ðктивне ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ñ‚Ð°ÐºÑƒÑ” цільовий об’єкт, щоб знайти потенційні вразливоÑÑ‚Ñ–."
@@ -11658,7 +11926,7 @@ msgid "DastProfiles|Active"
msgstr "Ðктивний"
msgid "DastProfiles|Additional request headers (optional)"
-msgstr ""
+msgstr "Додаткові заголовки запиту (необов'Ñзково)"
msgid "DastProfiles|Are you sure you want to delete this profile?"
msgstr "Ви впевнені, що хочете видалити цей профіль?"
@@ -11709,7 +11977,7 @@ msgid "DastProfiles|Could not fetch site profiles. Please refresh the page, or t
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ профілі Ñайту. Будь лаÑка, оновіть Ñторінку або Ñпробуйте ще раз пізніше."
msgid "DastProfiles|Could not update the scanner profile. Please try again."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ профіль Ñканера. Будь лаÑка, Ñпробуйте знову."
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ профіль Ñайту. Будь лаÑка, Ñпробуйте ще раз."
@@ -11745,10 +12013,10 @@ msgid "DastProfiles|Enable Authentication"
msgstr "Увімкнути автентифікацію"
msgid "DastProfiles|Enter URLs in a comma-separated list."
-msgstr ""
+msgstr "Введіть URL-адреÑи у ÑпиÑку, розділений комою."
msgid "DastProfiles|Enter headers in a comma-separated list."
-msgstr ""
+msgstr "Введіть заголовки в ÑпиÑку, розділений комою."
msgid "DastProfiles|Error Details"
msgstr "Помилка деталі"
@@ -11771,11 +12039,14 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr "Керувати профілÑми"
msgid "DastProfiles|Manage site profiles"
-msgstr ""
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»Ñми Ñайту"
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr "Мінімум = 0 (тайм-аут не ввімкнено), МакÑимум = 2880 хвилин"
@@ -11796,13 +12067,13 @@ msgid "DastProfiles|No scanner profile selected"
msgstr ""
msgid "DastProfiles|No scanner profiles created yet"
-msgstr ""
+msgstr "Профілі Ñканера ще не Ñтворені"
msgid "DastProfiles|No site profile selected"
msgstr ""
msgid "DastProfiles|No site profiles created yet"
-msgstr ""
+msgstr "Профілі Ñайту ще не Ñтворені"
msgid "DastProfiles|Not Validated"
msgstr "Ðе перевірено"
@@ -11814,7 +12085,7 @@ msgid "DastProfiles|Password"
msgstr "Пароль"
msgid "DastProfiles|Password form field"
-msgstr ""
+msgstr "Поле форми паролÑ"
msgid "DastProfiles|Profile is being used by this on-demand scan"
msgstr ""
@@ -11823,16 +12094,16 @@ msgid "DastProfiles|Profile name"
msgstr "Ім'Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ"
msgid "DastProfiles|Request header names and values. Headers are added to every request made by DAST."
-msgstr ""
+msgstr "Імена Ñ– Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² заголовку запиту додаютьÑÑ Ð´Ð¾ кожного запиту DAST."
msgid "DastProfiles|Request headers"
-msgstr ""
+msgstr "Заголовки запиту"
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
msgid "DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan."
-msgstr ""
+msgstr "Зберегти чаÑто викориÑтовувані конфігурації Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¸Ñ… Ñайтів та ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñпецифікацій у виглÑді профілів. ВикориÑтовуйте Ñ—Ñ… зі ÑкануваннÑм на вимогу."
msgid "DastProfiles|Save profile"
msgstr "Зберегти профіль"
@@ -11889,7 +12160,7 @@ msgid "DastProfiles|Site type"
msgstr "Тип Ñайту"
msgid "DastProfiles|Spider timeout"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð²ÑƒÐºÐ°"
msgid "DastProfiles|Submit button"
msgstr ""
@@ -11946,10 +12217,10 @@ msgid "DastProfiles|What does each method do?"
msgstr ""
msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
-msgstr ""
+msgstr "Ви можете вибрати паÑивне ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ перевірити цільовий Ñайт на Ñторінці ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÐµÐ¼ Ñайту. %{docsLinkStart}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про перевірку Ñайту.%{docsLinkEnd}"
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
-msgstr ""
+msgstr "Ви не можете запуÑтити активне ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐµÐ½Ð¾Ð³Ð¾ Ñайту."
msgid "DastProfiles|folder/dast_example.har or https://example.com/dast_example.har"
msgstr ""
@@ -11961,7 +12232,7 @@ msgid "DastProfiles|folder/openapi.json or https://example.com/openapi.json"
msgstr ""
msgid "DastSiteValidation|Copy HTTP header to clipboard"
-msgstr ""
+msgstr "Скопіюйте заголовок HTTP в буфер обміну"
msgid "DastSiteValidation|Copy Meta tag to clipboard"
msgstr ""
@@ -11970,25 +12241,28 @@ msgid "DastSiteValidation|Could not create validation token. Please try again."
msgstr ""
msgid "DastSiteValidation|Could not revoke validation. Please try again."
-msgstr ""
+msgstr "Ðе вдалоÑÑ ÑкаÑувати перевірку. Будь лаÑка, Ñпробуйте ще раз."
msgid "DastSiteValidation|Download validation text file"
-msgstr ""
+msgstr "Завантажити текÑтовий файл перевірки"
msgid "DastSiteValidation|Header validation"
msgstr "Перевірка заголовка"
msgid "DastSiteValidation|Meta tag validation"
+msgstr "Перевірка мета-тегу"
+
+msgid "DastSiteValidation|Not validated"
msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr "Повторити перевірку"
msgid "DastSiteValidation|Revoke validation"
-msgstr ""
+msgstr "Скаувати перевірку"
msgid "DastSiteValidation|Step 1 - Choose site validation method."
-msgstr ""
+msgstr "Крок 1 - Виберіть метод перевірки Ñайту."
msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
@@ -12009,13 +12283,13 @@ msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
-msgstr ""
+msgstr "Перевірка текÑтового файлу"
msgid "DastSiteValidation|The validation has failed. Please try again."
-msgstr ""
+msgstr "Помилка перевірки. Будь лаÑка, Ñпробуйте ще раз."
msgid "DastSiteValidation|The validation is in progress. Please wait..."
-msgstr ""
+msgstr "Перевірка триває. Будь лаÑка, зачекайте..."
msgid "DastSiteValidation|This will affect %d other profile targeting the same URL."
msgid_plural "DastSiteValidation|This will affect %d other profiles targeting the same URL."
@@ -12061,16 +12335,16 @@ msgid "Data type"
msgstr "Тип даних"
msgid "Database update failed"
-msgstr ""
+msgstr "Помилка Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних"
msgid "DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog."
-msgstr ""
+msgstr "%{linkOpen}Ключ API%{linkClose} викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— за допомогою Datadog."
msgid "DatadogIntegration|(Advanced) The full URL for your Datadog site."
msgstr ""
msgid "DatadogIntegration|API URL"
-msgstr ""
+msgstr "URL API"
msgid "DatadogIntegration|Custom tags in Datadog. Enter one tag per line in the %{codeOpen}key:value%{codeClose} format. %{linkOpen}How do I use tags?%{linkClose}"
msgstr ""
@@ -12082,7 +12356,7 @@ msgid "DatadogIntegration|For self-managed deployments, set the %{codeOpen}env%{
msgstr ""
msgid "DatadogIntegration|How do I set up this integration?"
-msgstr ""
+msgstr "Як налаштувати цю інтеграцію?"
msgid "DatadogIntegration|Send CI/CD pipeline information to Datadog to monitor for job failures and troubleshoot performance issues. %{docs_link}"
msgstr "ÐадіÑлати інформацію про конвеєр CI/CD до Datadog Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ збоїв у роботі та уÑÑƒÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ із продуктивніÑÑ‚ÑŽ. %{docs_link}"
@@ -12094,10 +12368,10 @@ msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Use
msgstr ""
msgid "DatadogIntegration|Tags"
-msgstr ""
+msgstr "Теги"
msgid "DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}."
-msgstr ""
+msgstr "Сайт Datadog Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…. Щоб надіÑлати дані на Ñайт ЄС, викориÑтовуйте %{codeOpen}datadoghq.eu%{codeClose}."
msgid "DatadogIntegration|Trace your GitLab pipelines with Datadog."
msgstr "ВідÑтежуйте конвеєри GitLab за допомогою Datadog."
@@ -12151,7 +12425,7 @@ msgid "Dear Administrator,"
msgstr "Шановний ÐдмініÑтратор,"
msgid "Debian package already exists in Distribution"
-msgstr ""
+msgstr "Пакет Debian вже Ñ–Ñнує в диÑтрибутиві"
msgid "Debug"
msgstr "Відладка"
@@ -12186,12 +12460,6 @@ msgstr "Гілка за замовчуваннÑм"
msgid "Default branch and protected branches"
msgstr "Гілка за замовчуваннÑм Ñ– захищені гілки"
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr "Стандартна затримка видаленнÑ"
-
msgid "Default description template for issues"
msgstr "Шаблон опиÑу задач за замовчуваннÑм"
@@ -12204,9 +12472,6 @@ msgstr "Перший день Ñ‚Ð¸Ð¶Ð½Ñ Ð·Ð° замовчуваннÑм"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Перший день Ñ‚Ð¸Ð¶Ð½Ñ Ð·Ð° замовчуваннÑм в календарÑÑ… та при виборі дати."
-msgid "Default project deletion protection"
-msgstr "ЗахиÑÑ‚ від Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ за замовчуваннÑм"
-
msgid "Default projects limit"
msgstr "Ліміт проєктів за замовчуваннÑм"
@@ -12250,10 +12515,10 @@ msgid "Define a custom pattern with cron syntax"
msgstr "Визначте влаÑний шаблон за допомогою ÑинтакÑиÑу cron"
msgid "Define custom rules for what constitutes spam, independent of Akismet"
-msgstr ""
+msgstr "Визначити влаÑні правила Ð´Ð»Ñ Ñпаму, незалежного від Akismet"
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
-msgstr ""
+msgstr "Визначте Ñередовища на Ñтадії Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² %{code_open}.gitlab-ci.yml%{code_close} Ð´Ð»Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½ÑŒ."
msgid "Define how approval rules are applied to merge requests."
msgstr ""
@@ -12264,6 +12529,9 @@ msgstr ""
msgid "Definition"
msgstr "ВизначеннÑ"
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr "Ви впевнені, що ви хочете запуÑтити %{jobName} відразу? Ð’ іншому випадку це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ виконано автоматично по завершенню таймера."
@@ -12298,10 +12566,7 @@ msgid "Delete Comment"
msgstr "Видалити коментар"
msgid "Delete File"
-msgstr ""
-
-msgid "Delete Internal Note"
-msgstr ""
+msgstr "Видалити файл"
msgid "Delete Key"
msgstr "Видалити ключ"
@@ -12310,7 +12575,7 @@ msgid "Delete Selected"
msgstr "Видалити вибране"
msgid "Delete Value Stream"
-msgstr ""
+msgstr "Видалити потік значень"
msgid "Delete account"
msgstr "Видалити обліковий запиÑ"
@@ -12346,6 +12611,9 @@ msgid "Delete image"
msgstr ""
msgid "Delete image repository"
+msgstr "Видалити репозиторій образів"
+
+msgid "Delete internal note"
msgstr ""
msgid "Delete label"
@@ -12421,10 +12689,10 @@ msgid "DeleteProject|Failed to remove wiki repository. Please try again or conta
msgstr "Помилка при видаленні вікі проєкту. Будь лаÑка, Ñпробуйте знову, або зв'ÑжітьÑÑ Ñ–Ð· адмініÑтратором."
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
-msgstr ""
+msgstr "'%{name}' Потік значень видалено"
msgid "DeleteValueStream|Are you sure you want to delete the \"%{name}\" Value Stream?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити потік значень%{name}"
msgid "DeleteValueStream|Delete %{name}"
msgstr "Видалити %{name}"
@@ -12436,29 +12704,56 @@ msgid "Deleted chat nickname: %{chat_name}!"
msgstr "Видалено пÑевдонім Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ñƒ: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
-msgstr ""
+msgstr "Видалені проєкти неможливо відновити!"
msgid "Deleted the source branch."
msgstr ""
msgid "Deletes the source branch"
-msgstr ""
+msgstr "ВидалÑÑ” гілку-джерело"
msgid "Deletes the source branch."
-msgstr ""
+msgstr "ВидалÑÑ” гілку-джерело."
msgid "Deleting"
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 ""
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ переводить його в Ñтан лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ %{date}, піÑÐ»Ñ Ñ‡Ð¾Ð³Ð¾ проєкт буде видалено назавжди. Ви ÐБСОЛЮТÐО впевнені?"
msgid "Deleting the project will delete its repository and all related resources, including issues and merge requests."
-msgstr ""
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ призведе до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ та вÑÑ–Ñ… пов'Ñзаних реÑурÑів, включаючи задачі та запити на злиттÑ."
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr "ОчікуєтьÑÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ. Цей проєкт буде видалено %{date}. Репозиторій та інші реÑурÑи проєкту доÑтупні лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr "Лише адмініÑтратори можуть видалÑти проєкти."
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr "ВлаÑники та адмініÑтратори можуть видалÑти проєкти."
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr "Відмовлено"
@@ -12514,7 +12809,7 @@ msgid "Dependencies|Component name"
msgstr "Ім'Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð°"
msgid "Dependencies|Dependency path"
-msgstr ""
+msgstr "ШлÑÑ… залежноÑÑ‚Ñ–"
msgid "Dependencies|Export as JSON"
msgstr "ЕкÑпортувати Ñк JSON"
@@ -12523,7 +12818,7 @@ msgid "Dependencies|Job failed to generate the dependency list"
msgstr "Завданню не вдалоÑÑ Ñтворити ÑпиÑок залежноÑтей"
msgid "Dependencies|Learn more about dependency paths"
-msgstr ""
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про шлÑхи залежноÑтей"
msgid "Dependencies|License"
msgstr "ЛіцензіÑ"
@@ -12600,15 +12895,15 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr "Увімкнути прокÑÑ– залежноÑтей"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
+msgstr ""
+
msgid "DependencyProxy|Image list"
msgstr "СпиÑок образів"
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
-msgid "DependencyProxy|Storage settings"
-msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñховища"
-
msgid "DependencyProxy|There are no images in the cache"
msgstr "Ðемає образів у кеші"
@@ -12883,7 +13178,7 @@ msgid "Deployment Target|Select the deployment target"
msgstr ""
msgid "Deployment frequency"
-msgstr ""
+msgstr "ЧаÑтота розгортаннÑ"
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -12913,10 +13208,10 @@ msgid "DeploymentApproval|Manual job: %{jobName}"
msgstr ""
msgid "DeploymentTarget|GitLab Pages"
-msgstr ""
+msgstr "GitLab Pages"
msgid "DeploymentTarget|Heroku"
-msgstr ""
+msgstr "Heroku"
msgid "DeploymentTarget|Infrastructure provider (Terraform, Cloudformation, and so on)"
msgstr ""
@@ -13033,12 +13328,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -13049,7 +13338,7 @@ msgid "Descending"
msgstr "За ÑпаданнÑм"
msgid "Describe the goal of the changes and what reviewers should be aware of."
-msgstr "Опишіть мету зміни та на що рецензент повинен звернути увагу."
+msgstr "Опишіть мету зміни та на що оглÑдач повинен звернути увагу."
msgid "Description"
msgstr "ОпиÑ"
@@ -13130,9 +13419,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr "Коментар"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "Ðе вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ новий коментар. Будь лаÑка, Ñпробуйте ще раз."
@@ -13175,9 +13461,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr "Залишити коментар"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ–Ð²"
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "Бажана верÑÑ–Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ñƒ не Ñ–Ñнує. ЗаміÑÑ‚ÑŒ неї відображаєтьÑÑ Ð¾ÑтаннÑ"
@@ -13188,7 +13471,7 @@ msgid "DesignManagement|Resolved Comments"
msgstr ""
msgid "DesignManagement|Save comment"
-msgstr ""
+msgstr "Зберегти коментар"
msgid "DesignManagement|Select all"
msgstr "Виділити уÑÑ–"
@@ -13235,6 +13518,9 @@ msgstr "Деталі"
msgid "Details (default)"
msgstr "Деталі (за замовчуваннÑм)"
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð² хоÑта"
@@ -13311,13 +13597,13 @@ msgid "DevopsAdoption|DAST"
msgstr "DAST"
msgid "DevopsAdoption|DAST enabled for at least one project"
-msgstr ""
+msgstr "DAST увімкнено принаймні Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ проєкту"
msgid "DevopsAdoption|Dependency Scanning"
msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей"
msgid "DevopsAdoption|Dependency Scanning enabled for at least one project"
-msgstr ""
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей увімкнено принаймні Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ проєкту"
msgid "DevopsAdoption|Deploys"
msgstr "РозгортаннÑ"
@@ -13359,7 +13645,7 @@ msgid "DevopsAdoption|Not adopted"
msgstr "Ðе прийнÑто"
msgid "DevopsAdoption|Ops"
-msgstr ""
+msgstr "Ops"
msgid "DevopsAdoption|Overall adoption"
msgstr ""
@@ -13371,10 +13657,10 @@ msgid "DevopsAdoption|Remove Group"
msgstr "Видалити групу"
msgid "DevopsAdoption|Remove Group from the table."
-msgstr ""
+msgstr "Видалити групу з таблиці."
msgid "DevopsAdoption|Runner configured for project/group"
-msgstr ""
+msgstr "Runner, налаштований Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ/групи"
msgid "DevopsAdoption|Runners"
msgstr "Runner'и"
@@ -13383,13 +13669,13 @@ msgid "DevopsAdoption|SAST"
msgstr "SAST"
msgid "DevopsAdoption|SAST enabled for at least one project"
-msgstr ""
+msgstr "SAST увімкнено принаймні Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ проєкту"
msgid "DevopsAdoption|Sec"
msgstr "Сек"
msgid "DevopsAdoption|There was an error enabling the current group. Please refresh the page."
-msgstr ""
+msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— поточної групи. Будь лаÑка, оновіть Ñторінку."
msgid "DevopsAdoption|There was an error fetching Group adoption data. Please refresh the page."
msgstr ""
@@ -13436,6 +13722,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr "Ваше викориÑтаннÑ"
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13518,7 +13807,7 @@ msgid "Direct members"
msgstr ""
msgid "Direct non-authenticated users to this page."
-msgstr ""
+msgstr "СпрÑмуйте неавтентифікованих кориÑтувачів на цю Ñторінку."
msgid "Direct users to this page after they sign out."
msgstr ""
@@ -13533,7 +13822,7 @@ msgid "Disable"
msgstr "Вимкнути"
msgid "Disable Two-factor Authentication"
-msgstr ""
+msgstr "Вимкнути двофакторну автентифікацію"
msgid "Disable What's new"
msgstr ""
@@ -13544,9 +13833,6 @@ msgstr "Вимкнути Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "Disable group runners"
msgstr "Вимкнути групові runner'и"
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr "Вимкнути двофакторну автентифікацію"
@@ -13581,7 +13867,7 @@ msgid "DiscordService|Discord Notifications"
msgstr "Discord СповіщеннÑ"
msgid "DiscordService|Send notifications about project events to a Discord channel."
-msgstr ""
+msgstr "ÐадÑилати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ події проєкту на канал Discord."
msgid "Discover"
msgstr ""
@@ -13626,7 +13912,7 @@ msgid "Discuss a specific suggestion or question."
msgstr "Обговорити конкретну пропозицію чи питаннÑ."
msgid "Discussion to reply to cannot be found"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ обговореннÑ, на Ñке потрібно відповіÑти"
msgid "Disk Usage"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð´Ð¸Ñку"
@@ -13648,7 +13934,7 @@ msgid "Dismiss merge request promotion"
msgstr ""
msgid "Dismiss selected"
-msgstr ""
+msgstr "Відхилити вибране"
msgid "Dismiss trial promotion"
msgstr "Відхилити пробну верÑÑ–ÑŽ"
@@ -13681,7 +13967,7 @@ msgid "Display name"
msgstr "Ð†Ð¼â€™Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
msgid "Display progress of child issues"
-msgstr ""
+msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑу дочірніх задач"
msgid "Display rendered file"
msgstr "Показувати перетворений файл"
@@ -13711,13 +13997,10 @@ msgid "Documentation for popular identity providers"
msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð´Ð»Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ… провайдерів ідентифікації"
msgid "Documentation pages URL"
-msgstr ""
+msgstr "URL Ñторінки документації"
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
-msgstr ""
-
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
+msgstr "Документів переіндекÑовано: %{processed_documents} (%{percentage}%%)"
msgid "Does not delete the source branch."
msgstr ""
@@ -13729,7 +14012,7 @@ msgid "Domain Name"
msgstr "Доменне ім'Ñ"
msgid "Don't have a group?"
-msgstr ""
+msgstr "Ðе маєте групи?"
msgid "Don't have an account yet?"
msgstr "Ще не зареєÑтровані?"
@@ -13819,13 +14102,13 @@ msgid "Draft"
msgstr "Чернетка"
msgid "Draft: %{filename}"
-msgstr ""
+msgstr "Чернетка: %{filename}"
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
-msgstr ""
+msgstr "ПеретÑгніть Ñвої проєкти Ñюди або %{linkStart}, щоб завантажити%{linkEnd}."
msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
-msgstr ""
+msgstr "Перекиньте або %{linkStart}завантажте%{linkEnd} файл, щоб прикріпити"
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -13834,7 +14117,7 @@ msgid "Drop your designs to start your upload."
msgstr ""
msgid "Drop your files to start your upload."
-msgstr ""
+msgstr "ПеретÑгніть файли, щоб почати завантаженнÑ."
msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
msgstr ""
@@ -13843,22 +14126,22 @@ msgid "DropdownWidget|Assign %{issuableAttribute}"
msgstr "Призначити %{issuableAttribute}"
msgid "DropdownWidget|Failed to fetch the %{issuableAttribute} for this %{issuableType}. Please try again."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ %{issuableAttribute} Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ %{issuableType}. Будь лаÑка, Ñпробуйте ще раз."
msgid "DropdownWidget|Failed to set %{issuableAttribute} on this %{issuableType}. Please try again."
msgstr ""
msgid "DropdownWidget|No %{issuableAttribute}"
-msgstr ""
+msgstr "Без %{issuableAttribute}"
msgid "DropdownWidget|No %{issuableAttribute} found"
-msgstr ""
+msgstr "Ðе знайдено %{issuableAttribute}"
msgid "DropdownWidget|No open %{issuableAttribute} found"
msgstr ""
msgid "Due Date"
-msgstr ""
+msgstr "Дата виконаннÑ"
msgid "Due date"
msgstr "Запланована дата завершеннÑ"
@@ -13879,7 +14162,7 @@ msgid "Duration"
msgstr "ТриваліÑÑ‚ÑŒ"
msgid "Duration (min)"
-msgstr ""
+msgstr "ТриваліÑÑ‚ÑŒ (хв)"
msgid "Duration|%s days"
msgstr ""
@@ -13930,17 +14213,17 @@ msgid "E-mail:"
msgstr "Електронна пошта:"
msgid "Each project can also have an issue tracker and a wiki."
-msgstr ""
+msgstr "Кожен проєкт може також мати трекер задач та вікі."
msgid "Edit"
msgstr "Редагувати"
-msgid "Edit %{issuable}"
-msgstr "Редагувати %{issuable}"
-
msgid "Edit %{name}"
msgstr "Редагувати %{name}"
+msgid "Edit %{profileType} profile"
+msgstr ""
+
msgid "Edit Comment"
msgstr "Редагувати коментар"
@@ -13968,9 +14251,6 @@ msgstr "Редагувати пароль"
msgid "Edit Pipeline Schedule"
msgstr "Редагувати розклад Конвеєра"
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "Редагувати Реліз"
@@ -13996,7 +14276,7 @@ msgid "Edit comment"
msgstr "Редагувати коментар"
msgid "Edit commit message"
-msgstr ""
+msgstr "Редагувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ"
msgid "Edit deploy freeze"
msgstr ""
@@ -14032,7 +14312,7 @@ msgid "Edit image description"
msgstr ""
msgid "Edit in pipeline editor"
-msgstr ""
+msgstr "Редагувати в редакторі конвеєра"
msgid "Edit in single-file editor"
msgstr ""
@@ -14044,10 +14324,10 @@ msgid "Edit issues"
msgstr "Редагувати задачі"
msgid "Edit link"
-msgstr ""
+msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑиланнÑ"
msgid "Edit merge requests"
-msgstr ""
+msgstr "Редагувати запити на злиттÑ"
msgid "Edit public deploy key"
msgstr "Редагувати публічний ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
@@ -14059,13 +14339,13 @@ msgid "Edit table"
msgstr "Редагувати таблицю"
msgid "Edit this file only."
-msgstr ""
+msgstr "Редагувати лише цей файл."
msgid "Edit this release"
msgstr "Редагувати цей реліз"
msgid "Edit title and description"
-msgstr ""
+msgstr "Редагувати назву та опиÑ"
msgid "Edit topic: %{topic_name}"
msgstr "Редагувати тему: %{topic_name}"
@@ -14095,7 +14375,7 @@ msgid "Editing"
msgstr "РедагуваннÑ"
msgid "Elapsed time"
-msgstr ""
+msgstr "Витрачений чаÑ"
msgid "Elasticsearch AWS IAM credentials"
msgstr "Параметри доÑтупу IAM Ð´Ð»Ñ Elasticsearch AWS"
@@ -14113,16 +14393,13 @@ msgid "Elasticsearch migration halted"
msgstr ""
msgid "Elasticsearch reindexing is already in progress"
-msgstr ""
+msgstr "ПереіндекÑÐ°Ñ†Ñ–Ñ Elasticsearch вже виконуєтьÑÑ"
msgid "Elasticsearch reindexing triggered"
-msgstr ""
+msgstr "ПереіндекÑÐ°Ñ†Ñ–Ñ Elasticsearch запущена"
msgid "Elasticsearch reindexing was not started: %{errors}"
-msgstr ""
-
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
+msgstr "ПереіндекÑÐ°Ñ†Ñ–Ñ Elasticsearch не була розпочата: %{errors}"
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -14152,7 +14429,7 @@ msgid "Email a new %{name} to this project"
msgstr ""
msgid "Email address suffix"
-msgstr ""
+msgstr "Ð¡ÑƒÑ„Ñ–ÐºÑ Ð°Ð´Ñ€ÐµÑи електронної пошти"
msgid "Email address to use for Support Desk"
msgstr ""
@@ -14173,7 +14450,7 @@ msgid "Email patch"
msgstr "Email-патч"
msgid "Email patches"
-msgstr ""
+msgstr "Email-патчі"
msgid "Email sent"
msgstr "ЛиÑта відправлено"
@@ -14221,10 +14498,10 @@ msgid "EmailParticipantsWarning|%{emails} will be notified of your comment."
msgstr ""
msgid "EmailParticipantsWarning|%{emails}, %{andMore} will be notified of your comment."
-msgstr ""
+msgstr "%{emails}, %{andMore} отримає ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ ваш коментар."
msgid "EmailParticipantsWarning|and %{moreCount} more"
-msgstr ""
+msgstr "і ще %{moreCount}"
msgid "Emails"
msgstr "ÐдреÑи електронної пошти"
@@ -14257,14 +14534,11 @@ msgid "EmailsOnPushService|Send notifications from the committer's email address
msgstr ""
msgid "EmailsOnPushService|tanuki@example.com gitlab@example.com"
-msgstr ""
+msgstr "tanuki@example.com gitlab@example.com"
msgid "Embed"
msgstr "Вбудувати"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr "Порожній файл"
@@ -14272,7 +14546,7 @@ msgid "Enable"
msgstr "Увімкнути"
msgid "Enable Akismet"
-msgstr ""
+msgstr "Увімкнути Akismet"
msgid "Enable Amazon EKS integration"
msgstr "Увімкнути інтеграцію Amazon EKS"
@@ -14280,6 +14554,9 @@ msgstr "Увімкнути інтеграцію Amazon EKS"
msgid "Enable Auto DevOps"
msgstr "Увімкнути Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr "Увімкнути Gitpod"
@@ -14287,7 +14564,7 @@ msgid "Enable Gitpod?"
msgstr "Увімкнути Gitpo?"
msgid "Enable Invisible Captcha during sign up"
-msgstr ""
+msgstr "Увімкніть невидиму капчу під Ñ‡Ð°Ñ Ñ€ÐµÑ”Ñтрації"
msgid "Enable Kroki"
msgstr "Увімкнути Kroki"
@@ -14302,10 +14579,10 @@ msgid "Enable SSL verification"
msgstr "Увімкнути перевірку SSL"
msgid "Enable Sentry error tracking"
-msgstr ""
+msgstr "Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº Sentry"
msgid "Enable Snowplow tracking"
-msgstr ""
+msgstr "Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Snowplow"
msgid "Enable Spam Check via external API endpoint"
msgstr ""
@@ -14329,13 +14606,13 @@ msgid "Enable authenticated API request rate limit"
msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
-msgstr ""
+msgstr "Увімкнути перевірене Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾ÑÑ‚Ñ– запитів Git LFS"
msgid "Enable authenticated web request rate limit"
msgstr ""
msgid "Enable authentication"
-msgstr ""
+msgstr "Увімкнути автентифікацію"
msgid "Enable automatic repository housekeeping"
msgstr ""
@@ -14346,9 +14623,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr "Увімкнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою"
@@ -14413,10 +14687,10 @@ msgid "Enable security training to help your developers learn how to fix vulnera
msgstr "Увімкніть Ñ‚Ñ€ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸, щоб допомогти вашим розробникам навчитиÑÑ Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»Ñти вразливоÑÑ‚Ñ–. Розробники можуть переглÑдати Ñ‚Ñ€ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ вибраних оÑвітніх провайдерів, що ÑтоÑуютьÑÑ Ð²Ð¸Ñвленої вразливоÑÑ‚Ñ–."
msgid "Enable shared runners for all projects and subgroups in this group."
-msgstr ""
+msgstr "Увімкнути загальні runner'и Ð´Ð»Ñ Ð²ÑÑ–Ñ… проєктів Ñ– підгруп у цій групі."
msgid "Enable shared runners for this group"
-msgstr ""
+msgstr "Увімкнути загальні Runner'и Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи"
msgid "Enable shared runners for this project"
msgstr "Увімкнути загальні runner'и Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
@@ -14425,7 +14699,7 @@ msgid "Enable two-factor authentication"
msgstr "Увімкнути двофакторну автентифікацію"
msgid "Enable unauthenticated API request rate limit"
-msgstr ""
+msgstr "Увімкнути Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñтоти запитів API без автентифікації"
msgid "Enable unauthenticated web request rate limit"
msgstr ""
@@ -14434,7 +14708,7 @@ msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
-msgstr ""
+msgstr "Увімкнути перевірку верÑÑ–Ñ—"
msgid "EnableReviewApp|%{stepStart}Step 1%{stepEnd}. Ensure you have Kubernetes set up and have a base domain for your %{linkStart}cluster%{linkEnd}."
msgstr "%{stepStart}Крок 1%{stepEnd}. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²Ð°Ð½Ð¾ Kubernetes Ñ– Ñ” базовий домен Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ %{linkStart}клаÑтера%{linkEnd}."
@@ -14443,7 +14717,7 @@ msgid "EnableReviewApp|%{stepStart}Step 2%{stepEnd}. Copy the following snippet:
msgstr ""
msgid "EnableReviewApp|%{stepStart}Step 3%{stepEnd}. Add it to the project %{linkStart}gitlab-ci.yml%{linkEnd} file."
-msgstr ""
+msgstr "%{stepStart}Крок 3%{stepEnd}. Додайте його до проєкту %{linkStart}gitlab-ci.yml%{linkEnd} файлу."
msgid "EnableReviewApp|%{stepStart}Step 4 (optional)%{stepEnd}. Enable Visual Reviews by following the %{linkStart}setup instructions%{linkEnd}."
msgstr ""
@@ -14461,10 +14735,7 @@ msgid "Enabled Git access protocols"
msgstr "Увімкнути протоколи доÑтупу до Git"
msgid "Enabled OAuth authentication sources"
-msgstr ""
-
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr "Ðктивовані джерела Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ коду під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ. OmniAuth має бути Ñконфігурована Ð´Ð»Ñ GitHub"
+msgstr "Увімкнено джерела автентифікації OAuth"
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14473,7 +14744,7 @@ msgid "End Time"
msgstr "Ð§Ð°Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ"
msgid "Ends"
-msgstr ""
+msgstr "ЗакінчуєтьÑÑ"
msgid "Ends at (UTC)"
msgstr "ЗавершуєтьÑÑ Ð¾ (за Грінвічем)"
@@ -14482,13 +14753,13 @@ msgid "Ends on"
msgstr ""
msgid "Ends: %{endsAt}"
-msgstr ""
+msgstr "ЗакінчуєтьÑÑ: %{endsAt}"
msgid "Enforce two-factor authentication"
-msgstr ""
+msgstr "ЗаÑтоÑовувати двофакторну аутентифікацію"
msgid "Enforce two-factor authentication for all user sign-ins."
-msgstr ""
+msgstr "ЗаÑтоÑовувати двофакторну автентифікацію Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, Ñкі входÑÑ‚ÑŒ в ÑиÑтему."
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
@@ -14554,22 +14825,22 @@ msgid "Enter the code from the two-factor app on your mobile device. If you've l
msgstr ""
msgid "Enter the following to confirm:"
-msgstr ""
+msgstr "Введіть наÑтупне, щоб підтвердити:"
msgid "Enter the name of your application, and we'll return a unique %{type}."
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 ""
+msgstr "Введіть кількіÑÑ‚ÑŒ Ñекунд або інший доÑтупний Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑÑ‚, наприклад \"1 година\". Цей Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” пріоритет над меншим чаÑом очікуваннÑм, вÑтановленими Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ."
msgid "Enter the password for password-protected Elasticsearch servers."
-msgstr ""
+msgstr "Введіть пароль Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… паролем Ñерверів Elasticsearch."
msgid "Enter the username for password-protected Elasticsearch servers."
-msgstr ""
+msgstr "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… паролем Ñерверів Elasticsearch."
msgid "Enter your Packagist server. Defaults to https://packagist.org."
-msgstr ""
+msgstr "Введіть Ñвій Ñервер Packagist. За замовчуваннÑм https://packagist.org."
msgid "Enter your Packagist token."
msgstr ""
@@ -14584,10 +14855,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgstr ""
-
-msgid "Environment does not have deployments"
-msgstr "Середовище не має розгортань"
+msgstr "Середовище"
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14653,7 +14921,7 @@ msgid "EnvironmentsDashboard|The environments dashboard provides a summary of ea
msgstr "Панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñередовищами міÑтить інформацію про Ñтан кожного із проєктних Ñередовищ включно зі Ñтаном конвеєрів та попереджень."
msgid "EnvironmentsDashboard|This dashboard displays 3 environments per project, and is linked to the Operations Dashboard. When you add or remove a project from one dashboard, GitLab adds or removes the project from the other. %{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "Ð¦Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ð¹Ð½Ð° панель відображає 3 Ñередовища Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ проєкту та пов’Ñзана з панеллю операцій. Коли ви додаєте або видалÑєте проєкт з однієї інформаційної панелі, GitLab додає або видалÑÑ” проєкт з іншої. %{linkStart}Детальніше%{linkEnd}"
msgid "Environments|An error occurred while canceling the auto stop, please try again"
msgstr "Виникла помилка під Ñ‡Ð°Ñ ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ¸, будь лаÑка, Ñпробуйте ще раз"
@@ -14688,12 +14956,6 @@ msgstr "Ðвтоматичні зупинки %{autoStopAt}"
msgid "Environments|Commit"
msgstr "Коміт"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr "Ðаразі відображаєтьÑÑ %{fetched} результатів."
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr "Видалити"
@@ -14730,9 +14992,6 @@ msgstr "Середовища — це міÑцÑ, куди можна розго
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr "ЗавданнÑ"
@@ -14742,9 +15001,6 @@ msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñередовища"
msgid "Environments|Learn more about stopping environments"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про зупинку Ñередовищ"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr "Логи від %{start} до %{end}."
-
msgid "Environments|New environment"
msgstr "Ðове Ñередовище"
@@ -14754,12 +15010,6 @@ msgstr "Ðемає розгорнутих Ñередовищ"
msgid "Environments|No deployments yet"
msgstr "Ще немає розгортань"
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr "Ðемає pod'ів Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Зверніть увагу, що Ñ†Ñ Ð´Ñ–Ñ Ð·ÑƒÐ¿Ð¸Ð½Ð¸Ñ‚ÑŒ Ñередовище, але це %{emphasisStart}не%{emphasisEnd} впливатиме на будь-Ñке Ñ–Ñнуюче Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· відÑутніÑÑ‚ÑŒ операції зупинки в файлі %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}."
@@ -14769,11 +15019,8 @@ msgstr "Відкрити"
msgid "Environments|Open live environment"
msgstr "Відкрити працююче Ñередовище"
-msgid "Environments|Pod name"
-msgstr "Ðазва pod'а"
-
-msgid "Environments|Re-deploy"
-msgstr "Повторно розгорнути"
+msgid "Environments|Re-deploy environment"
+msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
msgstr "Повторно розгорнути в Ñередовищі %{name}?"
@@ -14781,18 +15028,12 @@ msgstr "Повторно розгорнути в Ñередовищі %{name}?"
msgid "Environments|Re-deploy to environment"
msgstr "Повторно розгорнути в Ñередовищі"
-msgid "Environments|Rollback"
-msgstr "Відкотити"
-
msgid "Environments|Rollback environment"
msgstr "Відкотити Ñередовище"
msgid "Environments|Rollback environment %{name}?"
msgstr "Відкотити Ñередовище %{name}?"
-msgid "Environments|Select pod"
-msgstr "Виберіть pod"
-
msgid "Environments|Show all"
msgstr "Показати вÑÑ–"
@@ -14808,14 +15049,11 @@ msgstr "Зупинка %{environmentName}"
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr "Ще немає розгортань Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ñередовища. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½ÑŒ.%{linkEnd}"
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð»Ð¾Ð³Ñ–Ð². Будь лаÑка, Ñпробуйте ще раз."
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ запуÑтить Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ %{linkStart}%{commitId}%{linkEnd}, повертаючи Ñередовище до попередньої верÑÑ–Ñ—. Ви впевнені, що хочете продовжити?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
+msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
-msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð·Ð°Ð¿ÑƒÑтить Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ñ–Ð· іменем %{name} Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ %{linkStart}%{commitId}%{linkEnd} повертаючи Ñередовище до попередньої верÑÑ–Ñ—. Ви зможете повернути його шлÑхом повторного Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð¾Ñтанньої верÑÑ–Ñ— вашого заÑтоÑунку. Ви впевнені, що хочете продовжити?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr ""
msgid "Environments|Upcoming"
msgstr "Майбутнє"
@@ -14872,13 +15110,13 @@ msgid "Epics let you manage your portfolio of projects more efficiently and with
msgstr "Епіки дозволÑÑŽÑ‚ÑŒ керувати вашим портфелем проєктів ефективніше та з меншими зуÑиллÑми"
msgid "Epics, issues, and merge requests"
-msgstr ""
+msgstr "Епіки, задачі та запити на злиттÑ"
msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
+msgstr "%{startDate} – %{dueDate}"
msgid "Epics|%{startDate} – No due date"
-msgstr ""
+msgstr "%{startDate} – немає терміну"
msgid "Epics|Add a new epic"
msgstr "Додати новий епік"
@@ -14902,7 +15140,7 @@ msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
msgid "Epics|No start date – %{dueDate}"
-msgstr ""
+msgstr "Ðемає дати початку – %{dueDate}"
msgid "Epics|Remove epic"
msgstr "Видалити епік"
@@ -14949,6 +15187,9 @@ msgstr "Помилка при видаленні задачі із епіка."
msgid "Epics|Something went wrong while updating epics."
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑ–Ð²."
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -15076,7 +15317,7 @@ msgid "Error occurred when saving assignees"
msgstr "Помилка при збереженні виконавців"
msgid "Error occurred when saving reviewers"
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð³Ð»Ñдачів ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
msgid "Error occurred while updating the %{issuableType} status"
msgstr ""
@@ -15112,7 +15353,7 @@ msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
msgid "Error rendering Markdown preview"
-msgstr ""
+msgstr "Помилка при попередньому переглÑді Markdown"
msgid "Error saving label update."
msgstr "Помилка при збереженні мітки."
@@ -15177,6 +15418,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr "Токен доÑтупу %{token_in_code_tag}"
+
msgid "ErrorTracking|Active"
msgstr "Ðктивовано"
@@ -15199,7 +15443,7 @@ msgid "ErrorTracking|Error tracking backend"
msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
-msgstr ""
+msgstr "Якщо ви ÑамоÑтійно розміщуєте Sentry, введіть повну URL-адреÑу Ñвого інÑтанÑа Sentry. Якщо ви викориÑтовуєте розміщене Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Sentry, введіть https://sentry.io"
msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
msgstr ""
@@ -15241,7 +15485,7 @@ msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "Escalation policy"
-msgstr ""
+msgstr "Політика еÑкалації"
msgid "Escalation policy:"
msgstr "Політика еÑкалації:"
@@ -15262,7 +15506,7 @@ msgid "EscalationPolicies|A schedule is required for adding an escalation policy
msgstr ""
msgid "EscalationPolicies|A user is required for adding an escalation policy."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ еÑкалації необхідний кориÑтувач."
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
@@ -15277,7 +15521,7 @@ msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPoli
msgstr ""
msgid "EscalationPolicies|Create an escalation policy in GitLab"
-msgstr ""
+msgstr "Створити політику еÑкалації в GitLab"
msgid "EscalationPolicies|Delete escalation policy"
msgstr ""
@@ -15295,7 +15539,7 @@ msgid "EscalationPolicies|Escalation policies"
msgstr ""
msgid "EscalationPolicies|Escalation policy %{obstacle} in project %{project}"
-msgstr ""
+msgstr "Політика еÑкалації %{obstacle} в проєкті %{project}"
msgid "EscalationPolicies|Escalation rules"
msgstr ""
@@ -15313,7 +15557,7 @@ msgid "EscalationPolicies|Minutes must be between 0 and 1440."
msgstr "Хвилини мають бути від 0 до 1440."
msgid "EscalationPolicies|Remove escalation rule"
-msgstr ""
+msgstr "Видалити правило еÑкалації"
msgid "EscalationPolicies|Search for user"
msgstr "Пошук кориÑтувача"
@@ -15325,7 +15569,7 @@ msgid "EscalationPolicies|Set up escalation policies to define who is paged, and
msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{scheduleOrUser}"
-msgstr ""
+msgstr "ПОТІМ %{doAction} %{scheduleOrUser}"
msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
msgstr ""
@@ -15346,7 +15590,7 @@ msgid "Estimated"
msgstr "За оцінками"
msgid "Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
-msgstr ""
+msgstr "Ðавіть Ñкщо ви доÑÑгнете кількоÑÑ‚Ñ– міÑць у вашій підпиÑці, ви можете продовжувати додавати кориÑтувачів, Ñ– GitLab виÑтавить вам рахунок за перевищеннÑ."
msgid "EventFilterBy|Filter by all"
msgstr "Фільтрувати по вÑім"
@@ -15388,7 +15632,7 @@ msgid "Every 3 months"
msgstr "Кожні 3 міÑÑцÑ"
msgid "Every 3 months on the %{day} at %{time} %{timezone}"
-msgstr ""
+msgstr "Кожні 3 міÑÑці на %{day} в %{time} %{timezone}"
msgid "Every 6 months"
msgstr "Кожні 6 міÑÑцÑ"
@@ -15403,7 +15647,7 @@ msgid "Every day (at %{time})"
msgstr "Кожен день (в %{time})"
msgid "Every day at %{time} %{timezone}"
-msgstr ""
+msgstr "Кожен день в %{time} %{timezone}"
msgid "Every month"
msgstr "ЩоміÑÑцÑ"
@@ -15442,6 +15686,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr "Кожен, хто має доÑтуп"
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr "Кожен може зробити Ñвій внеÑок"
@@ -15458,10 +15705,10 @@ msgid "Everything you need to create a GitLab Pages site using Hexo"
msgstr ""
msgid "Everything you need to create a GitLab Pages site using Hugo"
-msgstr ""
+msgstr "Ð’Ñе, що потрібно Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñайту GitLab Pages за допомогою Hugo"
msgid "Everything you need to create a GitLab Pages site using Jekyll"
-msgstr ""
+msgstr "Ð’Ñе, що потрібно Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñайту GitLab Pages за допомогою Jekyll"
msgid "Everything you need to create a GitLab Pages site using Middleman"
msgstr ""
@@ -15470,7 +15717,7 @@ msgid "Everything you need to create a GitLab Pages site using Pelican"
msgstr ""
msgid "Everything you need to create a GitLab Pages site using plain HTML"
-msgstr ""
+msgstr "Ð’Ñе, що потрібно Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñайту на GitLab Pages за допомогою звичайного HTML"
msgid "Evidence collection"
msgstr "Збір даних"
@@ -15491,7 +15738,7 @@ msgid "Exceptions"
msgstr "ВинÑтки"
msgid "Excluding merge commits. Limited to %{limit} commits."
-msgstr ""
+msgstr "Без ÑƒÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð² злиттÑ. Обмежено до %{limit} комітів."
msgid "Excluding merge commits. Limited to 6,000 commits."
msgstr "Без комітів злиттÑ. Обмежено 6000 комітів."
@@ -15503,7 +15750,7 @@ msgid "Existing branch name, tag, or commit SHA"
msgstr "Ім'Ñ Ñ–Ñнуючої гілки, тега або SHA коміта"
msgid "Existing projects may be moved into a group"
-msgstr ""
+msgstr "ІÑнуючі проєкти можуть бути переміщені в групу"
msgid "Existing projects will be able to use expiration policies. Avoid enabling this if an external Container Registry is being used, as there is a performance risk if many images exist on one project."
msgstr "ІÑнуючі проєкти зможуть викориÑтовувати політику Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії. Ðе вмикайте цю функцію при викориÑтанні зовнішнього Container Registry, оÑкільки Ñ–Ñнує екÑплуатаційний ризик, Ñкщо в одному проєкті Ñ–Ñнує багато образів."
@@ -15542,10 +15789,10 @@ msgid "Expand milestones"
msgstr ""
msgid "Expand panel"
-msgstr ""
+msgstr "Розгорнути панель"
msgid "Expand settings section"
-msgstr ""
+msgstr "Розгорнути розділ налаштувань"
msgid "Expand sidebar"
msgstr "Розгорніть бічну панель"
@@ -15554,7 +15801,7 @@ msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
-msgstr ""
+msgstr "Повинен мати точно один із таких параметрів: КориÑтувач, проÑÑ‚Ñ–Ñ€ імен або проєкт."
msgid "Expiration"
msgstr "Термін дії"
@@ -15580,8 +15827,8 @@ msgstr "Термін дії закінчивÑÑ:"
msgid "Expires"
msgstr "ЗакінчуєтьÑÑ"
-msgid "Expires in %{expires_at}"
-msgstr "ЗакінчуєтьÑÑ %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr ""
msgid "Expires on"
msgstr "Діє до"
@@ -15605,7 +15852,7 @@ msgid "Explore groups"
msgstr "ОглÑд груп"
msgid "Explore paid plans"
-msgstr ""
+msgstr "ОглÑд платних планів"
msgid "Explore projects"
msgstr "ОглÑд проєктів"
@@ -15614,7 +15861,7 @@ msgid "Explore public groups"
msgstr "ПереглÑнути публічні групи"
msgid "Explore public projects"
-msgstr ""
+msgstr "ПереглÑнути публічні проєкти"
msgid "Explore snippets"
msgstr "ОглÑд Ñніпетів"
@@ -15653,7 +15900,7 @@ msgid "Export this group with all related data."
msgstr "ЕкÑпортуйте цю групу з уÑіма пов'Ñзаними даними."
msgid "Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "ЕкÑпортуйте цей проєкт з уÑіма пов’Ñзаними даними, щоб переміÑтити його в новий інÑÑ‚Ð°Ð½Ñ GitLab. Коли екÑпортований файл буде готовий, ви можете завантажити його з цієї Ñторінки або за поÑиланнÑм у Ñповіщенні електронною поштою, Ñке ви отримаєте. Потім ви можете імпортувати його під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ проєкту. %{link_start}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "Export variable to pipelines running on protected branches and tags only."
msgstr "ЕкÑпортувати змінну до конвеєрів, Ñкі працюють лише на захищених гілках Ñ– тегах."
@@ -15745,6 +15992,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr "Ð¦Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° Ñинхронізована з %{trackerName}"
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15752,7 +16002,7 @@ msgid "ExternalWikiService|External wiki URL"
msgstr ""
msgid "ExternalWikiService|Link to an external wiki from the sidebar."
-msgstr ""
+msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнішню вікі з бічної панелі."
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr "https://example.com/xxx/wiki/..."
@@ -15766,6 +16016,13 @@ msgstr "Ðевдало"
msgid "Failed Jobs"
msgstr "Провалені завданнÑ"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Failed on"
msgstr "Помилка на"
@@ -15807,7 +16064,7 @@ msgid "Failed to clone this issue because target project doesn't exist."
msgstr ""
msgid "Failed to clone this issue: wrong parameters."
-msgstr ""
+msgstr "Ðе вдалоÑÑ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ цю задачу: неправильні параметри."
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Ðе вдалоÑÑ Ñтворити гілку Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— задачі. Будь лаÑка, Ñпробуйте знову."
@@ -15816,7 +16073,7 @@ msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ñтворити фреймворк"
msgid "Failed to create import label for jira import."
msgstr ""
@@ -15852,10 +16109,10 @@ msgid "Failed to find users for %{missing}"
msgstr ""
msgid "Failed to generate export, please try again later."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ екÑпорт, будь лаÑка, Ñпробуйте ще раз пізніше."
msgid "Failed to generate report, please try again after sometime"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ звіт, будь лаÑка, Ñпробуйте знову через деÑкий чаÑ."
msgid "Failed to get ref."
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ref."
@@ -15864,7 +16121,7 @@ msgid "Failed to install."
msgstr "Ðе вдалоÑÑ Ð²Ñтановити."
msgid "Failed to load"
-msgstr ""
+msgstr "Ðеможливо завантажити"
msgid "Failed to load Roadmap"
msgstr ""
@@ -15900,7 +16157,7 @@ msgid "Failed to load groups, users and deploy keys."
msgstr ""
msgid "Failed to load groups."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ групи."
msgid "Failed to load iteration cadences."
msgstr ""
@@ -16014,7 +16271,7 @@ msgid "Failed to update environment!"
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ñередовище!"
msgid "Failed to update framework"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ фреймворк"
msgid "Failed to update issue status"
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð´Ð°Ñ‡Ñ–"
@@ -16038,7 +16295,7 @@ msgid "False positive"
msgstr ""
msgid "Fast timeout"
-msgstr ""
+msgstr "Швидкий тайм-аут"
msgid "Fast-forward merge without a merge commit"
msgstr "Fast-forward Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð±ÐµÐ· окремого коміту злиттÑ"
@@ -16062,7 +16319,7 @@ msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
-msgstr ""
+msgstr "Стан перемикача функцій"
msgid "Feature flag was not removed."
msgstr "Перемикач функцій не був видалений."
@@ -16081,13 +16338,13 @@ msgid "FeatureFlags|%{percent} by available ID"
msgstr ""
msgid "FeatureFlags|%{percent} by session ID"
-msgstr ""
+msgstr "%{percent} за ідентифікатором ÑеÑÑ–Ñ—"
msgid "FeatureFlags|%{percent} by user ID"
-msgstr ""
+msgstr "%{percent} за ідентифікатором кориÑтувача"
msgid "FeatureFlags|%{percent} randomly"
-msgstr ""
+msgstr "%{percent} випадковим чином"
msgid "FeatureFlags|* (All Environments)"
msgstr "* (УÑÑ– Ñередовища)"
@@ -16117,7 +16374,7 @@ msgid "FeatureFlags|Configure feature flags"
msgstr "Ðалаштувати перемикачі функцій"
msgid "FeatureFlags|Consider using the more flexible \"Percent rollout\" strategy instead."
-msgstr ""
+msgstr "Подумайте про викориÑÑ‚Ð°Ð½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆ гнучкої Ñтратегії \"ВідÑоток розгортаннÑ\"."
msgid "FeatureFlags|Create feature flag"
msgstr "Створити перемикач функції"
@@ -16213,16 +16470,16 @@ msgid "FeatureFlags|New feature flag"
msgstr "Ðовий перемикач функції"
msgid "FeatureFlags|No user list selected"
-msgstr ""
+msgstr "СпиÑок кориÑтувачів не вибрано"
msgid "FeatureFlags|Percent of users"
-msgstr ""
+msgstr "ВідÑоток кориÑтувачів"
msgid "FeatureFlags|Percent rollout"
msgstr ""
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
-msgstr ""
+msgstr "ВідÑоток Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” бути цілим чиÑлом від 0 до 100"
msgid "FeatureFlags|Remove"
msgstr "Видалити"
@@ -16258,7 +16515,7 @@ msgid "FeatureFlags|User Lists"
msgstr "СпиÑки кориÑтувачів"
msgid "FeatureFlags|View user lists"
-msgstr ""
+msgstr "ПереглÑд ÑпиÑків кориÑтувачів"
msgid "FeatureFlag|Percentage"
msgstr "ВідÑоток"
@@ -16270,13 +16527,13 @@ msgid "FeatureFlag|Select the environment scope for this feature flag"
msgstr ""
msgid "FeatureFlag|There are no configured user lists"
-msgstr ""
+msgstr "Ðемає налаштованих ÑпиÑків кориÑтувачів"
msgid "FeatureFlag|Type"
msgstr "Тип"
msgid "FeatureFlag|User IDs"
-msgstr ""
+msgstr "Ідентифікатори кориÑтувачів"
msgid "FeatureFlag|User List"
msgstr "СпиÑок кориÑтувачів"
@@ -16297,7 +16554,7 @@ msgid "File"
msgstr "Файл"
msgid "File %{current} of %{total}"
-msgstr ""
+msgstr "Файл %{current} з %{total}"
msgid "File Hooks"
msgstr ""
@@ -16369,13 +16626,13 @@ msgid "Filter"
msgstr "Фільтр"
msgid "Filter by"
-msgstr ""
+msgstr "Фільтрувати за"
msgid "Filter by %{page_context_word} that are currently open."
-msgstr ""
+msgstr "Відфільтрувати за %{page_context_word}, Ñкі зараз відкриті."
msgid "Filter by Git revision"
-msgstr ""
+msgstr "Фільтр за верÑією Git"
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -16387,10 +16644,10 @@ msgid "Filter by label"
msgstr "Фільтр за мітками"
msgid "Filter by merge requests that are currently closed and unmerged."
-msgstr ""
+msgstr "Фільтрувати за запитами на злиттÑ, Ñкі наразі закриті та не об’єднані."
msgid "Filter by merge requests that are currently merged."
-msgstr ""
+msgstr "Фільтрувати за запитами на злиттÑ, Ñкі наразі об’єднані."
msgid "Filter by milestone"
msgstr "Фільтр по етапу"
@@ -16449,8 +16706,11 @@ msgstr "Пошук по шлÑху"
msgid "Find file"
msgstr "Знайти файл"
-msgid "Fingerprint"
-msgstr "Відбиток"
+msgid "Fingerprint (MD5)"
+msgstr "Відбиток (MD5)"
+
+msgid "Fingerprint (SHA256)"
+msgstr "Відбиток (SHA256)"
msgid "Fingerprints"
msgstr "Відбитки пальців"
@@ -16458,6 +16718,9 @@ msgstr "Відбитки пальців"
msgid "Finish editing this message first!"
msgstr "Спочатку завершіть Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ повідомленнÑ!"
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16495,7 +16758,7 @@ msgid "FloC|Configure whether you want to participate in FloC."
msgstr ""
msgid "FloC|Enable FloC (Federated Learning of Cohorts)"
-msgstr ""
+msgstr "Увімкнути FloC (Федеративне Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð½Ð° оÑнові когорт)"
msgid "FloC|Federated Learning of Cohorts"
msgstr ""
@@ -16537,7 +16800,7 @@ msgid "Folder/%{name}"
msgstr "Папка/%{name}"
msgid "Follow"
-msgstr ""
+msgstr "Стежити"
msgid "Followed Users' Activity"
msgstr "ÐктивніÑÑ‚ÑŒ підпиÑаних кориÑтувачів"
@@ -16552,7 +16815,7 @@ msgid "Footer message"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² футері"
msgid "For a faster browsing experience, some files are collapsed by default."
-msgstr ""
+msgstr "Ð”Ð»Ñ ÑˆÐ²Ð¸Ð´ÑˆÐ¾Ð³Ð¾ переглÑду деÑкі файли згортаютьÑÑ Ð·Ð° замовчуваннÑм."
msgid "For additional information, review your %{link_to} or contact your group owner."
msgstr ""
@@ -16590,9 +16853,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації, відвідайте "
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16612,10 +16872,10 @@ msgid "Fork project?"
msgstr "Створити форк проєкту?"
msgid "ForkProject|A fork is a copy of a project."
-msgstr ""
+msgstr "Форк є копією проєкту."
msgid "ForkProject|An error occurred while forking the project. Please try again."
-msgstr ""
+msgstr "Виникла помилка при Ñтворенні форку проєкту. Будь лаÑка, Ñпробуйте ще раз."
msgid "ForkProject|Cancel"
msgstr "СкаÑувати"
@@ -16627,7 +16887,7 @@ msgid "ForkProject|Fork project"
msgstr "Форк проєкту"
msgid "ForkProject|Forking a repository allows you to make changes without affecting the original project."
-msgstr ""
+msgstr "Форк репозиторію дозволÑÑ” вноÑити зміни без впливу на оригінальний проєкт."
msgid "ForkProject|Internal"
msgstr "Внутрішній"
@@ -16659,8 +16919,8 @@ msgstr "Проєкт може бути доÑтупний без будь-Ñко
msgid "ForkProject|Visibility level"
msgstr "Рівень видимоÑÑ‚Ñ–"
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
-msgstr "Хочете розміÑтити декілька пов'Ñзаних проєктів в одному проÑторі імен?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
+msgstr ""
msgid "ForkSuggestion|Cancel"
msgstr "СкаÑувати"
@@ -16696,10 +16956,10 @@ msgid "Found errors in your .gitlab-ci.yml:"
msgstr "Знайдено помилки у вашому .gitlab-ci.yml:"
msgid "Framework successfully deleted"
-msgstr ""
+msgstr "Фреймворк уÑпішно видалено"
msgid "Free Trial of GitLab.com Ultimate"
-msgstr ""
+msgstr "Безкоштовна пробна верÑÑ–Ñ GitLab.com Ultimate"
msgid "Freeze end"
msgstr ""
@@ -16720,7 +16980,7 @@ msgid "From"
msgstr "Від"
msgid "From %{code_open}%{source_title}%{code_close} into"
-msgstr ""
+msgstr "З %{code_open}%{source_title}%{code_close} в"
msgid "From %{providerTitle}"
msgstr "З %{providerTitle}"
@@ -16741,13 +17001,13 @@ msgid "Full"
msgstr "Повний"
msgid "Full log"
-msgstr ""
+msgstr "Повний журнал"
msgid "Full name"
msgstr "Повне ім'Ñ"
msgid "GCP region configured"
-msgstr ""
+msgstr "GCP регіон налаштовано"
msgid "GPG Key ID:"
msgstr "Ідентифікатор ключа GPG:"
@@ -16777,7 +17037,7 @@ msgid "Generate a default set of labels"
msgstr "Створити Ñтандартний набір міток"
msgid "Generate group access tokens scoped to this group for your applications that need access to the GitLab API."
-msgstr ""
+msgstr "Створіть токени групового доÑтупу Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи, Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… програм, Ñким потрібен доÑтуп до GitLab API."
msgid "Generate new export"
msgstr "Створити новий екÑпорт"
@@ -16863,7 +17123,7 @@ msgid "Geo|%{title} checksum progress"
msgstr ""
msgid "Geo|Add New Site"
-msgstr ""
+msgstr "Додати новий Ñайт"
msgid "Geo|Add site"
msgstr "Додати Ñайт"
@@ -16901,26 +17161,23 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
-msgstr ""
+msgstr "Контрольна Ñума"
msgid "Geo|Choose specific groups or storage shards"
msgstr ""
msgid "Geo|Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
+msgstr "Розділений комами, напр. '1.1.1.1, 2.2.0/24'"
msgid "Geo|Configure various settings for your %{siteType} site. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Geo|Connection timeout"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ"
msgid "Geo|Connection timeout can't be blank"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ може бути пуÑтим"
msgid "Geo|Connection timeout must be a number"
msgstr ""
@@ -16932,7 +17189,7 @@ msgid "Geo|Consult Geo troubleshooting information"
msgstr ""
msgid "Geo|Container repositories synchronization concurrency limit"
-msgstr ""
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¾Ñ‡Ð°Ñних потоків Ñинхронізації репозиторіїв контейнерів"
msgid "Geo|Could not remove tracking entry for an existing project."
msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ–Ñнуючого проєкту."
@@ -16974,7 +17231,7 @@ msgid "Geo|Filter Geo sites"
msgstr ""
msgid "Geo|Filter by name"
-msgstr ""
+msgstr "Фільтр за назвою"
msgid "Geo|Filter by status"
msgstr "Фільтр за ÑтатуÑом"
@@ -17004,7 +17261,7 @@ msgid "Geo|Go to the primary site"
msgstr ""
msgid "Geo|Groups to synchronize"
-msgstr ""
+msgstr "Групи Ð´Ð»Ñ Ñинхронізації"
msgid "Geo|Healthy"
msgstr "Здоровий"
@@ -17025,7 +17282,7 @@ msgid "Geo|Internal URL"
msgstr ""
msgid "Geo|Internal URL (optional)"
-msgstr ""
+msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ URL-адреÑа (не обов’Ñзково)"
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -17046,7 +17303,7 @@ msgid "Geo|Last time verified"
msgstr "ОÑтанній Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
msgid "Geo|Learn more about Geo"
-msgstr ""
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Geo"
msgid "Geo|Learn more about Geo site statuses"
msgstr ""
@@ -17082,7 +17339,7 @@ msgid "Geo|Not synced yet"
msgstr "Ðе Ñинхронізовано"
msgid "Geo|Nothing found…"
-msgstr ""
+msgstr "Ðічого не знайдено…"
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -17108,15 +17365,9 @@ msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr "Первинний вузол"
-
msgid "Geo|Primary site"
msgstr "ОÑновний Ñайт"
-msgid "Geo|Project"
-msgstr "Проєкт"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "Проєкт (ID: %{project_id}) більше не Ñ–Ñнує на оÑновному вузлі. Поточний Ð·Ð°Ð¿Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð° безпечно видалити, оÑкільки це не видалÑÑ” жодних даних на диÑку."
@@ -17130,7 +17381,7 @@ msgid "Geo|Queued"
msgstr "Черга"
msgid "Geo|Re-verification interval"
-msgstr ""
+msgstr "Інтервал повторної перевірки"
msgid "Geo|Redownload"
msgstr "Повторне завантаженнÑ"
@@ -17181,7 +17432,7 @@ msgid "Geo|Resync"
msgstr "Повторна ÑинхронізаціÑ"
msgid "Geo|Resync all"
-msgstr ""
+msgstr "Повторна ÑинхронізаціÑ"
msgid "Geo|Resync all %{projects_count} projects"
msgstr ""
@@ -17213,23 +17464,20 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
msgid "Geo|Select groups to replicate"
-msgstr ""
+msgstr "Виберіть групи Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—"
msgid "Geo|Select shards to replicate"
-msgstr ""
+msgstr "Виберіть Ñегменти Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—"
msgid "Geo|Selective (%{syncLabel})"
msgstr ""
msgid "Geo|Selective synchronization"
-msgstr ""
+msgstr "Вибіркова ÑинхронізаціÑ"
msgid "Geo|Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -17264,9 +17512,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr "Синхронізовано"
-msgid "Geo|Synced at"
-msgstr "Синхронізовано"
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17316,10 +17561,10 @@ msgid "Geo|This will resync all %{replicableType}. It may take some time to comp
msgstr ""
msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
-msgstr ""
+msgstr "Це призведе до повторної Ñинхронізації вÑÑ–Ñ… проєктів. Ðа це може знадобитиÑÑ Ð´ÐµÑкий чаÑ. Ви впевнені, що хочете продовжити?"
msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
-msgstr ""
+msgstr "Це призведе до повторної перевірки вÑÑ–Ñ… проєктів. Ðа це може знадобитиÑÑ Ð´ÐµÑкий чаÑ. Ви впевнені, що хочете продовжити?"
msgid "Geo|Time in seconds"
msgstr ""
@@ -17337,7 +17582,7 @@ msgid "Geo|URL can't be blank"
msgstr ""
msgid "Geo|URL must be a valid url (ex: https://gitlab.com)"
-msgstr ""
+msgstr "URL-адреÑа повинна бути дійÑною URL-адреÑою (наприклад: https://gitlab.com)"
msgid "Geo|Undefined"
msgstr "Ðевизначено"
@@ -17459,6 +17704,42 @@ msgstr "Триває перенеÑÐµÐ½Ð½Ñ Git"
msgid "Git version"
msgstr "Git-верÑÑ–Ñ"
+msgid "GitAbuse|Excluded users"
+msgstr "Виключені кориÑтувачі"
+
+msgid "GitAbuse|Number of repositories"
+msgstr "ЧиÑло репозиторіїв"
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr "КількіÑÑ‚ÑŒ репозиторіїв не може бути пуÑтою. Ð’Ñтановіть 0 Ð´Ð»Ñ Ð±ÐµÐ·Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ."
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr "КількіÑÑ‚ÑŒ репозитаріїв має бути чиÑлом."
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr "КількіÑÑ‚ÑŒ репозитаріїв має бути між %{minNumRepos}-%{maxNumRepos}."
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr "Перевищено Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾ÑÑ‚Ñ– GitHub API. Спробуйте знову через %{reset_time}"
@@ -17486,6 +17767,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr "Команда оплати GitLab."
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr "Імпорт з GitLab"
@@ -17508,7 +17792,7 @@ msgid "GitLab Team Member"
msgstr "УчаÑник команди GitLab"
msgid "GitLab Ultimate trial"
-msgstr ""
+msgstr "Пробна верÑÑ–Ñ GitLab Ultimate"
msgid "GitLab User"
msgstr "GitLab КориÑтувач"
@@ -17517,7 +17801,7 @@ msgid "GitLab Workhorse"
msgstr ""
msgid "GitLab account request rejected"
-msgstr ""
+msgstr "Запит на обліковий Ð·Ð°Ð¿Ð¸Ñ GitLab відхилено"
msgid "GitLab and Google Cloud configuration seems to be incomplete. This probably can be fixed by your GitLab administration team. You may share these logs with them:"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ GitLab та Google Cloud незавершена. Можливо, ваша команда ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ GitLab зможе це владнати. Ви можете надіÑлати їм ці логи:"
@@ -17541,7 +17825,7 @@ msgid "GitLab informs you if a new version is available. %{link_start}What infor
msgstr ""
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
-msgstr ""
+msgstr "GitLab — це повноцінна платформа DevOps, Ñка поÑтачаєтьÑÑ Ñк єдиний заÑтоÑунок, кардинально змінюючи ÑпоÑіб Ñпівпраці команд розробників, безпеки та операцій."
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way%{br_tag}Development, Security, and Ops teams collaborate"
msgstr ""
@@ -17556,10 +17840,10 @@ msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This
msgstr "GitLab отримує SSL-Ñертифікат Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ домену від Let's Encrypt. Це може зайнÑти деÑкий чаÑ. Будь лаÑка, Ñпробуйте знову пізніше."
msgid "GitLab is open source software to collaborate on code."
-msgstr ""
+msgstr "GitLab — це програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð· відкритим вихідним кодом Ð´Ð»Ñ Ñпівпраці над кодом."
msgid "GitLab is undergoing maintenance"
-msgstr ""
+msgstr "GitLab проводить технічне обÑлуговуваннÑ"
msgid "GitLab logo"
msgstr "Логотип GitLab"
@@ -17571,16 +17855,13 @@ msgid "GitLab project export"
msgstr "ЕкÑпорт проєкту GitLab"
msgid "GitLab single sign-on URL"
-msgstr ""
+msgstr "URL-адреÑа єдиного входу GitLab"
msgid "GitLab username"
msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача GitLab"
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr "GitLab викориÑтовує %{jaeger_link} Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ розподілених ÑиÑтем."
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
-msgstr ""
+msgstr "GitLab викориÑтовує %{linkStart}Sidekiq%{linkEnd} Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ фонових завдань"
msgid "GitLab version"
msgstr "ВерÑÑ–Ñ GitLab"
@@ -17604,7 +17885,7 @@ msgid "GitLabPages|%{domain} is not verified. To learn how to verify ownership,
msgstr "%{domain} не підтведжено. Щоб дізнатиÑÑ Ñк підтвердити його належніÑÑ‚ÑŒ, переглÑньте вашу %{link_start}інформацію про домен%{link_end}."
msgid "GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information."
-msgstr ""
+msgstr "Контроль доÑтупу ввімкнено Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ веб-Ñайту Pages; тільки авторизовані кориÑтувачі матимуть доÑтуп до нього. Щоб зробити Ñвій веб-Ñайт загальнодоÑтупним, перейдіть до %{strong_start}Параметри &gt; Загальні &gt; ВидиміÑÑ‚ÑŒ%{strong_end} вашого проєкту та виберіть %{strong_start}УÑÑ–%{strong_end} у розділі Ñторінок. Прочитайте %{link_start}документацію%{link_end} Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
msgid "GitLabPages|Access pages"
msgstr "ДоÑтуп до Ñторінок"
@@ -17613,7 +17894,7 @@ msgid "GitLabPages|Are you sure?"
msgstr "Ви впевнені?"
msgid "GitLabPages|Can be overridden per project. For no limit, enter 0. To inherit the value, leave empty."
-msgstr ""
+msgstr "Може бути перевизначено Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ проєкту. Ð”Ð»Ñ Ð²Ñ–Ð´ÑутноÑÑ‚Ñ– Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ð²ÐµÐ´Ñ–Ñ‚ÑŒ 0. Ð”Ð»Ñ ÑƒÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð»Ð¸ÑˆÑ‚Ðµ поле порожнім."
msgid "GitLabPages|Certificate: %{subject}"
msgstr "Сертифікат: %{subject}"
@@ -17634,10 +17915,10 @@ msgid "GitLabPages|Force HTTPS (requires valid certificates)"
msgstr "Лише HTTPS (потрібні дійÑні Ñертифікати)"
msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable them on your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} page."
-msgstr ""
+msgstr "GitLab Сторінки вимкнено Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту. Ви можете ввімкнути Ñ—Ñ… на Ñторінці вашого проєкту %{strong_start}Параметри &gt; Загальні &gt; ВидиміÑÑ‚ÑŒ%{strong_end}."
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "МакÑимальний розмір (МБ)"
msgid "GitLabPages|New Domain"
msgstr "Ðовий домен"
@@ -17670,25 +17951,28 @@ msgid "GitLabPages|Something went wrong while obtaining the Let's Encrypt certif
msgstr "ЩоÑÑŒ пішло не так при отриманні Ñертифікату Let's Encrypt Ð´Ð»Ñ %{domain}. Перевірте %{link_start}деталі домену%{link_end}, щоб повторити Ñпробу."
msgid "GitLabPages|Support for domains and certificates is disabled. Ask your system's administrator to enable it."
-msgstr ""
+msgstr "Підтримка доменів Ñ– Ñертифікатів вимкнена. ПопроÑÑ–Ñ‚ÑŒ адмініÑтратора вашої ÑиÑтеми ввімкнути його."
msgid "GitLabPages|Unverified"
msgstr "Ðепідтверджено"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— ваших Ñторінок..."
+
msgid "GitLabPages|Verified"
msgstr "Підтверджено"
msgid "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}"
-msgstr ""
+msgstr "Якщо ввімкнено, уÑÑ– Ñпроби відвідати ваш вебÑайт через HTTP автоматично перенаправлÑÑŽÑ‚ÑŒÑÑ Ð½Ð° HTTPS за допомогою відповіді з кодом ÑтатуÑу 301. Потрібний дійÑний Ñертифікат Ð´Ð»Ñ Ð²ÑÑ–Ñ… доменів. %{docs_link_start}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
msgstr ""
msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "За допомогою GitLab Pages ви можете розміщувати Ñвій Ñтатичний вебÑайт безпоÑередньо зі Ñвого репозитарію GitLab. %{docs_link_start}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "GitLabPages|Your Pages site is not configured yet. See the %{docs_link_start}GitLab Pages documentation%{link_end} to learn how to upload your static site and have GitLab serve it. You can also take some inspiration from the %{samples_link_start}sample Pages projects%{link_end}."
-msgstr ""
+msgstr "Ваш Ñайт Ñторінок ще не налаштовано. ПереглÑньте документацію %{docs_link_start}GitLab Pages%{link_end} щоб дізнатиÑÑ, Ñк завантажити ваш Ñтатичний Ñайт Ñ– надати GitLab його обÑлуговуваннÑ. Ви також можете взÑти Ð½Ð°Ñ‚Ñ…Ð½ÐµÐ½Ð½Ñ Ð· %{samples_link_start}зразків проєктів Pages%{link_end}."
msgid "GitLabPages|Your pages are served under:"
msgstr "Ваші Ñторінки показуютьÑÑ Ð½Ð°:"
@@ -17697,7 +17981,7 @@ msgid "Gitaly Servers"
msgstr "Сервери Gitaly"
msgid "Gitaly relative path:"
-msgstr ""
+msgstr "ВідноÑний шлÑÑ… Gitaly:"
msgid "Gitaly storage name:"
msgstr "Ðазва Ñховища Gitaly:"
@@ -17736,7 +18020,7 @@ msgid "GithubIntegration|Repository URL"
msgstr "URL-адреÑа репозитарію"
msgid "GithubIntegration|Select this if you want GitHub to mark status checks as \"Required\". %{learn_more_link_start}Learn more%{learn_more_link_end}."
-msgstr ""
+msgstr "Виберіть це, Ñкщо ви хочете, щоб GitHub позначав перевірки ÑтатуÑу Ñк \"Обов'Ñзкові\". %{learn_more_link_start}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{learn_more_link_end}."
msgid "GithubIntegration|Static status check names (optional)"
msgstr ""
@@ -17754,13 +18038,13 @@ msgid "Gitpod|Gitpod URL"
msgstr "URL-адреÑа Gitpod"
msgid "Gitpod|The URL to your Gitpod instance configured to read your GitLab projects, such as https://gitpod.example.com."
-msgstr ""
+msgstr "URL-адреÑа вашого інÑтанÑа Gitpod, налаштованого на Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… проєктів GitLab, наприклад https://gitpod.example.com."
msgid "Gitpod|To use Gitpod you must first enable the feature in the integrations section of your %{linkStart}user preferences%{linkEnd}."
msgstr "Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Gitpod, Ñпочатку ви повинні увімкнути у розділі інтеграцій функцію ваших %{linkStart}налаштувань кориÑтувача%{linkEnd}."
msgid "Gitpod|To use the integration, each user must also enable Gitpod on their GitLab account. %{link_start}How do I enable it?%{link_end} "
-msgstr ""
+msgstr "Щоб викориÑтовувати інтеграцію, кожен кориÑтувач повинен також увімкнути Gitpod у Ñвоєму обліковому запиÑÑ– GitLab. %{link_start}Як увімкнути?%{link_end} "
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
@@ -17772,7 +18056,7 @@ msgid "Given epic is already related to this epic."
msgstr "Даний епік уже пов’Ñзаний із цим епіком."
msgid "Global Search is disabled for this scope"
-msgstr ""
+msgstr "Глобальний пошук Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— облаÑÑ‚Ñ– вимкнено"
msgid "Global Shortcuts"
msgstr "Глобальні комбінації клавіш"
@@ -17780,9 +18064,15 @@ msgstr "Глобальні комбінації клавіш"
msgid "Global notification settings"
msgstr "Загальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñповіщень"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr "%{search} %{description} %{scope}"
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "%{count} надано результати за замовчуваннÑм. ВикориÑтовуйте верхні та нижні клавіші зі Ñтрілками, щоб перейти до ÑпиÑку результатів пошуку."
+msgid "GlobalSearch|Groups"
+msgstr "Групи"
+
msgid "GlobalSearch|Issues I've created"
msgstr "Створені мною задачі"
@@ -17798,6 +18088,9 @@ msgstr "Запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ñ– Ð´Ð»Ñ Ð¼ÐµÐ½Ðµ"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Запити на злиттÑ, Ñкі Ñ Ð¾Ð³Ð»Ñдаю"
+msgid "GlobalSearch|Projects"
+msgstr "Проєкти"
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17819,17 +18112,23 @@ msgstr "Введіть та натиÑніть клавішу Enter Ð´Ð»Ñ Ð¿Ñ–Ð
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr "Введіть, щоб нижче з'ÑвилиÑÑ Ð½Ð¾Ð²Ñ– пропозиції."
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
-msgstr "У вÑьому GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
+msgstr "група"
-msgid "GlobalSearch|in group"
-msgstr "у групі"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
-msgid "GlobalSearch|in project"
-msgstr "В проєкті"
+msgid "GlobalSearch|project"
+msgstr "проєкт"
msgid "Globally-allowed IP ranges"
msgstr ""
@@ -17838,7 +18137,7 @@ msgid "Go Back"
msgstr "ПовернутиÑÑ"
msgid "Go Micro is a framework for micro service development"
-msgstr ""
+msgstr "Go Micro — це фреймворк Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±ÐºÐ¸ мікроÑервіÑів"
msgid "Go back"
msgstr "ПовернутиÑÑ"
@@ -17847,7 +18146,7 @@ msgid "Go back (while searching for files)"
msgstr "Перейти назад (продовжуючи пошук файлів)"
msgid "Go back to configuration"
-msgstr ""
+msgstr "ПовернутиÑÑ Ð´Ð¾ налаштувань"
msgid "Go full screen"
msgstr "Ðа повний екран"
@@ -17943,10 +18242,10 @@ msgid "Go to the %{b_open}Activity%{b_close} page for %{project_link}."
msgstr ""
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
-msgstr ""
+msgstr "Перейдіть в 'облаÑÑ‚ÑŒ ÐдмініÑтратора &gt; ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° реєÑтрацію' та перевірте 'Дозволені домени Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрацій'."
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
-msgstr ""
+msgstr "Зайдіть в 'облаÑÑ‚ÑŒ ÐдмініÑтратора' &gt; ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° реєÑтрацію' та перевірте 'ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° електронну пошту Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрацій'."
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
msgstr ""
@@ -18104,6 +18403,9 @@ msgstr "Gravatar увімкнено"
msgid "Group"
msgstr "Група"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -18222,7 +18524,7 @@ msgid "Group overview content"
msgstr "ВміÑÑ‚ оглÑдової Ñторінки групи"
msgid "Group owners can register group runners in the %{link}"
-msgstr ""
+msgstr "ВлаÑники групи можуть реєÑтрувати групові runner'и в %{link}"
msgid "Group path is already taken. We've suggested one that is available."
msgstr "ШлÑÑ… групи вже викориÑтовуєтьÑÑ. Ми пропонуємо доÑтупний."
@@ -18257,6 +18559,9 @@ msgstr "Групу уÑпішно оновлено."
msgid "Group wikis"
msgstr "Wiki-Ñторінки групи"
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr "Група: %{group_name}"
@@ -18266,8 +18571,8 @@ msgstr "Група: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
-msgstr "ОÑтанні 90 днів"
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr "За оÑтанні 30 днів"
msgid "GroupActivityMetrics|Members added"
msgstr "УчаÑники додані"
@@ -18321,7 +18626,7 @@ msgid "GroupRoadmap|Something went wrong while fetching epics"
msgstr "Проблема при завантаженні епіків"
msgid "GroupRoadmap|Something went wrong while fetching milestones"
-msgstr ""
+msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÑ‚Ð°Ð¿Ñ–Ð²"
msgid "GroupRoadmap|Sorry, no epics matched your search"
msgstr "Вибачте, жоден епік не задовольнÑÑ” критеріÑм вашого пошуку"
@@ -18360,10 +18665,10 @@ msgid "GroupSAML|Active SAML Group Links (%{count})"
msgstr ""
msgid "GroupSAML|An error occurred generating your SCIM token. Please try again."
-msgstr ""
+msgstr "Виникла помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ токену SCIM. Будь лаÑка, Ñпробуйте знову."
msgid "GroupSAML|An error occurred resetting your SCIM token. Please try again."
-msgstr ""
+msgstr "Виникла помилка під Ñ‡Ð°Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ токену SCIM. Будь лаÑка, Ñпробуйте знову."
msgid "GroupSAML|Are you sure you want to remove the SAML group link?"
msgstr ""
@@ -18480,7 +18785,7 @@ msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get thi
msgstr "SHA1-відбиток Ñертифікату Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу SAML токена. Отримайте його від провайдера ідентифікації, де він також може називатиÑÑ \"Thumbprint\"."
msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token again, you need to %{linkStart}reset it%{linkEnd}."
-msgstr ""
+msgstr "Токен SCIM зараз прихований. Щоб знову побачити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ñƒ, вам потрібно %{linkStart}Ñкинути його%{linkEnd}."
msgid "GroupSAML|The case-sensitive group name that will be sent by the SAML identity provider."
msgstr ""
@@ -18513,13 +18818,13 @@ msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSaml|Copy SCIM API endpoint URL"
-msgstr ""
+msgstr "Скопіювати URL-адреÑу кінцевої точки SCIM API"
msgid "GroupSaml|Copy SCIM token"
msgstr "Скопіювати токен SCIM"
msgid "GroupSaml|SCIM API endpoint URL"
-msgstr ""
+msgstr "URL-адреÑа кінцевої точки SCIM API"
msgid "GroupSaml|Your SCIM token"
msgstr "Ваш токен SCIM"
@@ -18533,18 +18838,15 @@ msgstr "Пошук груп"
msgid "GroupSelect|Select a group"
msgstr "Вибрати групу"
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr "Дозволити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ñƒ доÑтупу до проєкту та групи"
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr "ДозволÑÑ” Ñтворювати організації та контакти, Ñ– пов'Ñзувати Ñ—Ñ… з задачами."
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
-msgstr ""
+msgstr "ЗаÑтоÑовуєтьÑÑ Ð´Ð¾ вÑÑ–Ñ… підгруп, Ñкщо не змінено влаÑником групи. Групи, Ñкі вже додано до проєкту, втрачають доÑтуп."
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Конвеєр Auto DevOps оновлено Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18552,7 +18854,7 @@ msgid "GroupSettings|Badges"
msgstr "Значки"
msgid "GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}"
-msgstr ""
+msgstr "Будьте обережні. Зміна батьків групи може мати небажані наÑлідки. %{learn_more_link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{learn_more_link_end}"
msgid "GroupSettings|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
msgstr "Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ шлÑÑ… тому що в цій групі Ñ” проєкти із образами Docker у Ñвоїх РеєÑтрах контейнерів. Будь лаÑка, Ñпочатку видаліть ці образи з ваших проєктів Ñ– Ñпробуйте знову."
@@ -18561,40 +18863,40 @@ msgid "GroupSettings|Change group URL"
msgstr "Змінити URL-адреÑу групи"
msgid "GroupSettings|Changing a group's URL can have unintended side effects."
-msgstr ""
+msgstr "Зміна URL-адреÑи групи може мати небажані побічні ефекти."
msgid "GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores."
msgstr ""
msgid "GroupSettings|Compliance frameworks"
-msgstr ""
+msgstr "Фреймворки відповідноÑÑ‚Ñ–"
msgid "GroupSettings|Configure compliance frameworks to make them available to projects in this group. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Ðалаштуйте рамки відповідноÑÑ‚Ñ–, щоб зробити Ñ—Ñ… доÑтупними Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² цієї групи. %{linkStart}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{linkEnd}"
msgid "GroupSettings|Custom project templates"
msgstr "ВлаÑні шаблони проєктів"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr ""
+
msgid "GroupSettings|Customize this group's badges."
msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "ВикориÑтовувати за замовчуваннÑм конвеєри Auto DevOps Ð´Ð»Ñ ÑƒÑÑ–Ñ… проєктів цієї групи"
-msgid "GroupSettings|Disable email notifications"
-msgstr "Вимкнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою"
-
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
-msgstr "Увімкнути роботу з клієнтами"
+msgid "GroupSettings|Export group"
+msgstr "ЕкÑпортувати групу"
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
-msgstr "ЕкÑпортувати групу"
+msgid "GroupSettings|Group mentions are disabled"
+msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
msgstr ""
@@ -18602,6 +18904,18 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
+msgid "GroupSettings|Interval (seconds)"
+msgstr ""
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr ""
+
+msgid "GroupSettings|Number of projects"
+msgstr ""
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr ""
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18617,22 +18931,13 @@ 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 "Заборонити учаÑникам надÑилати Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð°Ð¼ за межами %{group} та Ñ—Ñ— підгруп"
-
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "Заборонити Ñпільний доÑтуп до проєкту в рамках %{group} з іншими групами"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr "Запобігає Ñповіщенню учаÑників групи у разі Ñ—Ñ— згадуваннÑ."
-
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
-msgstr "Проєкти будуть оÑтаточно видалені піÑÐ»Ñ %{waiting_period}денної затримки. УÑпадковано підгрупами."
+msgid "GroupSettings|Project download rate limit"
+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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18641,7 +18946,10 @@ msgstr "Виберіть підгрупу Ñк джерело Ð´Ð»Ñ Ð²Ð»Ð°ÑнÐ
msgid "GroupSettings|Select parent group"
msgstr "Вибери батьківÑьку групу"
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18650,11 +18958,17 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr "Конвеєр Auto DevOps запуÑкаєтьÑÑ, Ñкщо не знайдено жодного альтернативного файлу конфігурації CI."
+
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
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 ""
+msgstr "Проєкти у цій підгрупі можна вибрати Ñк шаблони Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів, Ñтворених у цій групі. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "GroupSettings|There was a problem updating Auto DevOps pipeline: %{error_messages}."
msgstr "Проблема при оновленні конвеєра Auto DevOps: %{error_messages}."
@@ -18674,17 +18988,17 @@ msgstr "Цей параметр заÑтоÑовано до %{ancestor_group}. Ð
msgid "GroupSettings|Transfer group"
msgstr "ПеренеÑти групу"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
-msgstr ""
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
+msgstr "КориÑтувачі можуть Ñтворювати %{link_start_project}токени доÑтупу до проєкту%{link_end} та %{link_start_group}токени доÑтупу до групи%{link_end} у цій групі"
msgid "GroupSettings|What are badges?"
msgstr "Що таке значки?"
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals."
-msgstr ""
+msgstr "Коли кількіÑÑ‚ÑŒ активних кориÑтувачів перевищує це чиÑло, додаткові кориÑтувачі повинні бути %{user_cap_docs_link_start}затверджені влаÑником%{user_cap_docs_link_end}. Залиште порожнім, Ñкщо ви не бажаєте заÑтоÑовувати затвердженнÑ."
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals. Increasing the user cap will not automatically approve pending users."
-msgstr ""
+msgstr "Коли кількіÑÑ‚ÑŒ активних кориÑтувачів перевищує це чиÑло, додаткові кориÑтувачі повинні бути %{user_cap_docs_link_start}затверджені влаÑником%{user_cap_docs_link_end}. Залиште порожнім, Ñкщо ви не бажаєте заÑтоÑовувати затвердженнÑ. Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾ÑÑ‚Ñ– кориÑтувачів не затверджуватиме автоматично кориÑтувачів, що очікують."
msgid "GroupSettings|You can only transfer the group to a group you manage."
msgstr "Ви можете перенеÑти цю групу тільки в групу, Ñкою ви керуєте."
@@ -18744,13 +19058,13 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Група — набір із декількох проєктів."
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "Створити новий проєкт"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "Створити нову підгрупу"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
-msgstr ""
+msgstr "Групи — це найкращий ÑпоÑіб керувати кількома проєктами та учаÑниками."
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Ð Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² у групі Ñхоже на Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² папці."
@@ -18759,28 +19073,28 @@ msgid "GroupsEmptyState|No groups found"
msgstr "Групи не знайдені"
msgid "GroupsEmptyState|No subgroups or projects."
-msgstr ""
+msgstr "Ðемає підгруп чи проєктів."
msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
-msgstr ""
+msgstr "Проєкти – це міÑце, де ви можете зберігати Ñвій код, задачі, вікі та інші функцій Gitlab."
msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
msgstr "Ви можете керувати правами доÑтупу членів групи мати доÑтуп до кожного проєкту в ній."
msgid "GroupsEmptyState|You do not have necessary permissions to create a subgroup or project in this group. Please contact an owner of this group to create a new subgroup or project."
-msgstr ""
+msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” необхідних прав Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð³Ñ€ÑƒÐ¿Ð¸ або проєкту в цій групі. Будь лаÑка, зв’ÑжітьÑÑ Ð· влаÑником цієї групи, щоб Ñтворити нову підгрупу або проєкт."
msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
-msgstr ""
+msgstr "%{linkStart}Групи%{linkEnd} дозволÑÑŽÑ‚ÑŒ вам керувати та Ñпівпрацювати з кількома проєктами. УчаÑники групи мають доÑтуп до вÑÑ–Ñ… Ñ—Ñ— проєктів."
msgid "GroupsNew|Assemble related projects together and grant members access to several projects at once."
-msgstr ""
+msgstr "Зберіть пов'Ñзані проєкти разом та надайте учаÑникам доÑтуп до кількох проєктів відразу."
msgid "GroupsNew|Connect instance"
msgstr "Підключити інÑтанÑ"
msgid "GroupsNew|Contact an administrator to enable options for importing your group."
-msgstr ""
+msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб увімкнути параметри Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ вашої групи."
msgid "GroupsNew|Create group"
msgstr "Створити групу"
@@ -18806,9 +19120,6 @@ msgstr "Імпортувати групу"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr "ÐœÐ¾Ñ Ð´Ð¸Ð²Ð¾Ð²Ð¸Ð¶Ð½Ð° група"
-
msgid "GroupsNew|No import options available"
msgstr "Ðемає доÑтупних параметрів імпорту"
@@ -19040,19 +19351,19 @@ msgid "HarborRegistry|With the Harbor Registry, every project can have its own s
msgstr ""
msgid "Hashed Storage must be enabled to use Geo"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Geo має бути включене хешоване Ñховище"
msgid "Hashed repository storage paths"
msgstr "Хешовані шлÑхи Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð²"
msgid "Hashed storage can't be disabled anymore for new projects"
-msgstr ""
+msgstr "Хешоване Ñховище більше не може бути відключено Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів"
msgid "Have a quick chat with us about your experience."
-msgstr ""
+msgstr "Швидкий чат з нами про ваш доÑвід."
msgid "Have more to say about GitLab?"
-msgstr ""
+msgstr "Вам Ñ” що розповіÑти про GitLab?"
msgid "Header logo"
msgstr "Логотип заголовка"
@@ -19061,7 +19372,7 @@ msgid "Header logo was successfully removed."
msgstr "Логотип в заголовку уÑпішно видалено."
msgid "Header logo will be removed. Are you sure?"
-msgstr ""
+msgstr "Логотип заголовка буде видалено. Ви впевнені?"
msgid "Header message"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°"
@@ -19169,7 +19480,7 @@ msgid "Hi %{username}!"
msgstr "Привіт %{username}!"
msgid "Hi %{username},"
-msgstr ""
+msgstr "Привіт %{username},"
msgid "Hidden"
msgstr "Прихований"
@@ -19209,7 +19520,7 @@ msgid "Hide list"
msgstr "Приховати ÑпиÑок"
msgid "Hide marketing-related entries from the Help page"
-msgstr ""
+msgstr "Приховати запиÑи, пов’Ñзані з маркетингом, на Ñторінці довідки"
msgid "Hide payload"
msgstr "Приховати кориÑне навантаженнÑ"
@@ -19237,13 +19548,13 @@ msgid "Hierarchy|Current structure"
msgstr "Поточна Ñтруктура"
msgid "Hierarchy|Deliver value more efficiently by breaking down necessary work into a hierarchical structure. This structure helps teams understand scope, priorities, and how work cascades up toward larger goals."
-msgstr ""
+msgstr "Ефективніше надавати цінніÑÑ‚ÑŒ, розбиваючи необхідну роботу на ієрархічну Ñтруктуру. Ð¦Ñ Ñтруктура допомагає командам розуміти маÑштаби, пріоритети та те, Ñк робота каÑкадом підноÑитьÑÑ Ð´Ð¾ більших цілей."
msgid "Hierarchy|Help us improve work items in GitLab!"
msgstr "Допоможіть нам покращити робочі елементи в GitLab!"
msgid "Hierarchy|Is there a framework or type of work item you wish you had access to in GitLab? Give us your feedback and help us build the experiences valuable to you."
-msgstr ""
+msgstr "Чи Ñ–Ñнує фреймворк або тип робочого елемента, до Ñкого ви хотіли б мати доÑтуп у GitLab? Залиште нам Ñвій відгук та допоможіть нам Ñтворити цінний Ð´Ð»Ñ Ð²Ð°Ñ Ð´Ð¾Ñвід."
msgid "Hierarchy|Planning hierarchy"
msgstr "Ð†Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ"
@@ -19296,12 +19607,12 @@ msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr "Ðевдале Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ…ÑƒÐºÐ°. ПереконайтеÑÑ, що Ñ†Ñ Ð³Ñ€ÑƒÐ¿Ð° має проєкт із комітами."
-msgid "Hook was successfully created."
-msgstr "Хук уÑпішно Ñтворено."
-
msgid "Hook was successfully updated."
msgstr "Хук уÑпішно оновлено."
+msgid "Horizontal rule"
+msgstr "Горизонтальна лінійка"
+
msgid "Hostname"
msgstr "Ім'Ñ Ñ…Ð¾Ñта"
@@ -19311,9 +19622,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr "Година (UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr "РозміÑÑ‚Ñ–Ñ‚ÑŒ Ñвої файли, плануйте Ñвою роботу, Ñпівпрацюйте над кодом тощо."
-
msgid "Housekeeping"
msgstr "ОчищеннÑ"
@@ -19321,19 +19629,19 @@ msgid "Housekeeping successfully started"
msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÑƒÑпішно розпочато"
msgid "How do I configure Akismet?"
-msgstr ""
+msgstr "Як налаштувати Akismet?"
msgid "How do I configure runners?"
-msgstr ""
+msgstr "Як налаштувати runner'и?"
msgid "How do I configure this integration?"
-msgstr ""
+msgstr "Як налаштувати цю інтеграцію?"
msgid "How do I generate it?"
-msgstr ""
+msgstr "Як це Ñтворити?"
msgid "How do I mirror repositories?"
-msgstr ""
+msgstr "Як дзеркально відобразити репозиторії?"
msgid "How do I rename an environment?"
msgstr ""
@@ -19345,10 +19653,10 @@ msgid "How do I set up this service?"
msgstr "Як налаштувати цей ÑервіÑ?"
msgid "How do I use a web terminal?"
-msgstr ""
+msgstr "Як викориÑтовувати веб-термінал?"
msgid "How do I use file templates?"
-msgstr ""
+msgstr "Як викориÑтовувати шаблони файлів?"
msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
@@ -19369,19 +19677,19 @@ msgid "I want to learn the basics of Git"
msgstr "Я хочу вивчити оÑнови Git"
msgid "I want to move my repository to GitLab from somewhere else"
-msgstr ""
+msgstr "Я хочу переміÑтити Ñвій репозиторій до GitLab з іншого міÑцÑ"
msgid "I want to store my code"
-msgstr ""
+msgstr "Я хочу зберегти Ñвій код"
msgid "I want to use GitLab CI with my existing repository"
msgstr "Я хочу викориÑтовувати GitLab CI зі Ñвоїм Ñ–Ñнуючим репозиторієм"
msgid "I'd like to receive updates about GitLab via email"
-msgstr ""
+msgstr "Я хотів би отримувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ GitLab електронною поштою"
msgid "I'm signing up for GitLab because:"
-msgstr ""
+msgstr "Я реєÑтруюÑÑ Ð² GitLab, тому що:"
msgid "ID"
msgstr "ID"
@@ -19423,7 +19731,7 @@ msgid "IDE|Review"
msgstr "ОглÑд"
msgid "IDE|Start a new merge request"
-msgstr ""
+msgstr "Почати новий запит на злиттÑ"
msgid "IDE|Successful commit"
msgstr "УÑпішний коміт"
@@ -19435,10 +19743,10 @@ msgid "IDE|This option is disabled because you don't have write permissions for
msgstr "Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð°, тому що ви не маєте дозволу на Ð·Ð°Ð¿Ð¸Ñ Ð² поточну гілку."
msgid "INFO: Your SSH key has expired. Please generate a new key."
-msgstr ""
+msgstr "ІÐФОРМÐЦІЯ: Термін дії вашого ключа SSH закінчивÑÑ. Згенеруйте новий ключ."
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
-msgstr ""
+msgstr "ІÐФОРМÐЦІЯ: термін дії вашого ключа SSH Ñкоро закінчуєтьÑÑ. Згенеруйте новий ключ."
msgid "IP Address"
msgstr "IP-адреÑа"
@@ -19456,7 +19764,7 @@ msgid "IP subnet restriction only allowed for top-level groups"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¼ÐµÑ€ÐµÐ¶ IP дозволÑєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ вищого рівнÑ"
msgid "Id"
-msgstr ""
+msgstr "Ідентифікатор"
msgid "Identifier"
msgstr "Ідентифікатор"
@@ -19473,21 +19781,72 @@ msgstr "Перш ніж Ñтворити Ñвій перший проєкт, вÐ
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr "Перш ніж Ñтворити Ñвою групу, вам потрібно підтвердити Ñвою оÑобу за допомогою дійÑного ÑпоÑобу оплати. З Ð²Ð°Ñ Ð½Ðµ ÑÑ‚ÑгуватиметьÑÑ Ð¿Ð»Ð°Ñ‚Ð° під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— операції. Якщо нам колиÑÑŒ буде потрібно ÑÑ‚Ñгнути з Ð²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñƒ, ми вам повідомимо."
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr "Створити проєкт"
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr "Підтвердити Ñвою оÑобу"
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
-msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
msgstr ""
-msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
msgstr ""
+msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
+msgstr "Якщо будь-Ñке проіндекÑоване поле перевищує це обмеженнÑ, воно обрізаєтьÑÑ Ð´Ð¾ цієї кількоÑÑ‚Ñ– Ñимволів. Решта вміÑту не індекÑуєтьÑÑ Ñ‚Ð° не підлÑгає пошуку. Це не ÑтоÑуєтьÑÑ Ñ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ та вікі. Ð”Ð»Ñ Ð½ÐµÐ¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¾Ñ— кількоÑÑ‚Ñ– Ñимволів вÑтановіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0."
+
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr "Якщо порожній, за замовчуваннÑм %{code_open}Повторити пізніше%{code_close}."
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -19501,16 +19860,16 @@ msgid "If disabled, a diverged local branch will not be automatically updated wi
msgstr ""
msgid "If disabled, only administrators can configure repository mirroring."
-msgstr ""
+msgstr "Якщо вимкнено, лише адмініÑтратори можуть налаштувати Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ."
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
msgid "If no options are selected, only administrators can register runners."
-msgstr ""
+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."
-msgstr ""
+msgstr "Якщо кількіÑÑ‚ÑŒ активних кориÑтувачів перевищує ліміт кориÑтувачів, то за наÑтупної звірки ліцензії з Ð²Ð°Ñ Ð±ÑƒÐ´Ðµ знÑто плату за кількіÑÑ‚ÑŒ %{users_over_license_link}."
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19629,10 +19988,10 @@ msgstr[3] ""
msgid "Import %d repository"
msgid_plural "Import %d repositories"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Імпортувати %d репозиторій"
+msgstr[1] "Імпортувати %d репозиторії"
+msgstr[2] "Імпортувати %d репозиторіїв"
+msgstr[3] "Імпортувати %d репозиторіїв"
msgid "Import CSV"
msgstr "Імпортувати CSV"
@@ -19786,10 +20145,10 @@ msgstr ""
msgid "Importing %d repository"
msgid_plural "Importing %d repositories"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %d репозиторію"
+msgstr[1] "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %d репозиторіїв"
+msgstr[2] "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %d репозиторіїв"
+msgstr[3] "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %d репозиторіїв"
msgid "Importing..."
msgstr "Імпорт..."
@@ -19816,7 +20175,7 @@ msgid "In the background, we're attempting to connect you again."
msgstr ""
msgid "In this page you will find information about the settings that are used in your current instance."
-msgstr ""
+msgstr "Ðа цій Ñторінці ви знайдете інформацію про налаштуваннÑ, Ñкі викориÑтовуютьÑÑ Ñƒ вашому поточному інÑтанÑÑ–."
msgid "In use"
msgstr ""
@@ -19834,7 +20193,7 @@ msgid "InProductMarketing|%{strong_start}Executive level insights%{strong_end} â
msgstr ""
msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
-msgstr ""
+msgstr "%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, Сан-ФранциÑко, ÐšÐ°Ð»Ñ–Ñ„Ð¾Ñ€Ð½Ñ–Ñ 94104, СШÐ"
msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
msgstr ""
@@ -19846,10 +20205,10 @@ msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
msgstr ""
msgid "InProductMarketing|...and you can get a free trial of GitLab Ultimate"
-msgstr ""
+msgstr "...Ñ– ви можете отримати безкоштовну пробну верÑÑ–ÑŽ GitLab Ultimate"
msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
-msgstr ""
+msgstr "3 ÑпоÑоби перейти до GitLab CI/CD"
msgid "InProductMarketing|A single application eliminates complex integrations, data chokepoints, and toolchain maintenance, resulting in greater productivity and lower cost."
msgstr ""
@@ -19861,10 +20220,10 @@ msgid "InProductMarketing|Access advanced features."
msgstr ""
msgid "InProductMarketing|Actually, GitLab makes the team work (better)"
-msgstr ""
+msgstr "ÐаÑправді GitLab змушує команду працювати (краще)"
msgid "InProductMarketing|And finally %{deploy_link} a Python application."
-msgstr ""
+msgstr "І нарешті, %{deploy_link} заÑтоÑунок Ð´Ð»Ñ Python."
msgid "InProductMarketing|And many more..."
msgstr "І багато іншого..."
@@ -19873,16 +20232,16 @@ msgid "InProductMarketing|Are your runners ready?"
msgstr "Чи готові ваші runner'и?"
msgid "InProductMarketing|Automated security scans directly within GitLab"
-msgstr ""
+msgstr "Ðвтоматичні ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ безпоÑередньо в GitLab"
msgid "InProductMarketing|Be a DevOps hero"
-msgstr ""
+msgstr "Будь героєм DevOps"
msgid "InProductMarketing|Beef up your security"
msgstr ""
msgid "InProductMarketing|Better code in less time"
-msgstr ""
+msgstr "Кращий код за менший чаÑ"
msgid "InProductMarketing|Blog"
msgstr "Блог"
@@ -19924,13 +20283,13 @@ msgid "InProductMarketing|Create a custom runner"
msgstr "Створити влаÑного runner"
msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
-msgstr ""
+msgstr "Створити проєкт у GitLab за 5 хвилин"
msgid "InProductMarketing|Create well-defined workflows by using scoped labels on issues, merge requests, and epics. Labels with the same scope cannot be used together, which prevents conflicts."
msgstr ""
msgid "InProductMarketing|Create your first project!"
-msgstr ""
+msgstr "Створити Ñвій перший проєкт!"
msgid "InProductMarketing|Define who owns specific files or directories, so the right reviewers are suggested when a merge request introduces changes to those files."
msgstr ""
@@ -19942,13 +20301,13 @@ msgid "InProductMarketing|Dependency scanning"
msgstr ""
msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
-msgstr ""
+msgstr "Чи знаєте ви, що команди, Ñкі викориÑтовують GitLab, набагато ефективніші?"
msgid "InProductMarketing|Difficult"
msgstr ""
msgid "InProductMarketing|Dig in and create a project and a repo"
-msgstr ""
+msgstr "Створити проєкт і репо"
msgid "InProductMarketing|Discover Premium & Ultimate"
msgstr ""
@@ -20008,7 +20367,7 @@ 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 ""
+msgstr "Швидко розпочніть роботу з CI/CD, викориÑтовуючи наш %{quick_start_link}. Почніть з доÑтупного runner'а, а потім Ñтворіть файл CI .yml – це дійÑно так проÑто."
msgid "InProductMarketing|Get our import guides"
msgstr "Отримайте наші поÑібники з імпорту"
@@ -20047,7 +20406,7 @@ msgid "InProductMarketing|GitLab's CI/CD makes software development easier. Don'
msgstr "GitLab's CI/CD Ñпрощує розробку програмного забезпеченнÑ. Ðе вірите нам? ОÑÑŒ вам три ÑпоÑоби Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð³Ð¾ (Ñ– приємного) теÑÑ‚-драйву:"
msgid "InProductMarketing|GitLab's premium tiers are designed to make you, your team and your application more efficient and more secure with features including but not limited to:"
-msgstr ""
+msgstr "Преміум рівні GitLab призначені Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб ви, ваша команда та ваш заÑтоÑунок були ефективнішими та безпечнішими за допомогою функцій, але не обмежені:"
msgid "InProductMarketing|Give us one minute..."
msgstr "Дайте нам одну хвилину..."
@@ -20077,7 +20436,7 @@ msgid "InProductMarketing|How to build and test faster"
msgstr "Як Ñтворювати та теÑтувати швидше"
msgid "InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}."
-msgstr ""
+msgstr "Якщо ви не хочете отримувати маркетингові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿Ð¾Ñередньо від GitLab, %{marketing_preference_link}."
msgid "InProductMarketing|If you no longer wish to receive marketing emails from us,"
msgstr "Якщо ви більше не хочете отримувати від Ð½Ð°Ñ Ð¼Ð°Ñ€ÐºÐµÑ‚Ð¸Ð½Ð³Ð¾Ð²Ñ– повідомленнÑ,"
@@ -20140,13 +20499,13 @@ msgid "InProductMarketing|Making the switch? It's easier than you think to impor
msgstr "Перемикаєте? Імпортувати проєкти в GitLab проÑтіше, ніж ви думаєте. ПереміÑÑ‚Ñ–Ñ‚ÑŒ %{github_link} або імпортуйте щоÑÑŒ %{bitbucket_link}."
msgid "InProductMarketing|Master the art of importing!"
-msgstr ""
+msgstr "Опануйте миÑтецтво імпорту!"
msgid "InProductMarketing|Merge request approval rule"
msgstr ""
msgid "InProductMarketing|Move on to easily creating a Pages website %{ci_template_link}"
-msgstr ""
+msgstr "Перейдіть до проÑтого ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²ÐµÐ±-Ñайту Pages %{ci_template_link}"
msgid "InProductMarketing|Multiple owners, confusing workstreams? We've got you covered"
msgstr ""
@@ -20155,7 +20514,7 @@ msgid "InProductMarketing|Multiple required approvers"
msgstr ""
msgid "InProductMarketing|Need an alternative to importing?"
-msgstr ""
+msgstr "Вам потрібна альтернатива імпорту?"
msgid "InProductMarketing|Neutral"
msgstr "Ðейтральний"
@@ -20164,16 +20523,16 @@ msgid "InProductMarketing|No credit card required."
msgstr "Кредитна картка непотрібна."
msgid "InProductMarketing|Our tool brings all the things together"
-msgstr ""
+msgstr "Ðаш інÑтрумент об'єднує вÑе"
msgid "InProductMarketing|Protect your web application by using DAST to examine for vulnerabilities in deployed environments."
msgstr ""
msgid "InProductMarketing|Rapid development, simplified"
-msgstr ""
+msgstr "Швидка розробка, Ñпрощена"
msgid "InProductMarketing|Reduce Security & Compliance Risk"
-msgstr ""
+msgstr "Зменште ризик безпеки та відповідноÑÑ‚Ñ–"
msgid "InProductMarketing|Require multiple approvers on a merge request, so you know it's in good shape before it's merged."
msgstr ""
@@ -20185,7 +20544,7 @@ msgid "InProductMarketing|Scoped labels"
msgstr ""
msgid "InProductMarketing|Security that's integrated into your development lifecycle"
-msgstr ""
+msgstr "Безпека, що інтегрована у ваш життєвий цикл розробки"
msgid "InProductMarketing|Sometimes you're not ready to make a full transition to a new tool. If you're not ready to fully commit, %{mirroring_link} gives you a safe way to try out GitLab in parallel with your current tool."
msgstr ""
@@ -20197,7 +20556,7 @@ msgid "InProductMarketing|Spin up an autoscaling runner in GitLab"
msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
-msgstr ""
+msgstr "Розпочніть пробну верÑÑ–ÑŽ GitLab Ultimate Ñьогодні менш ніж за одну хвилину, кредитна картка не потрібна."
msgid "InProductMarketing|Start a Self-Managed trial"
msgstr ""
@@ -20206,7 +20565,7 @@ msgid "InProductMarketing|Start a free trial"
msgstr ""
msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
-msgstr ""
+msgstr "Розпочніть безплатну пробну верÑÑ–ÑŽ GitLab Ultimate - кредитна картка не потрібна"
msgid "InProductMarketing|Start a trial"
msgstr "Розпочати пробну верÑÑ–ÑŽ"
@@ -20227,10 +20586,10 @@ msgid "InProductMarketing|Start your trial today to experience single applicatio
msgstr ""
msgid "InProductMarketing|Stop wondering and use GitLab to answer questions like:"
-msgstr ""
+msgstr "Ðе дивуйтеÑÑ Ñ– викориÑтовуйте GitLab, щоб відповіÑти на такі запитаннÑ:"
msgid "InProductMarketing|Streamline code review, know at a glance who's unavailable, communicate in comments or in email and integrate with Slack so everyone's on the same page."
-msgstr ""
+msgstr "Оптимізуйте переглÑд коду, дізнавайтеÑÑ Ð· першого поглÑду, хто недоÑтупний, ÑпілкуйтеÑÑ Ð² коментарÑÑ… або електронною поштою та інтегруйтеÑÑ Ð·Ñ– Slack, щоб уÑÑ– були на одній Ñторінці."
msgid "InProductMarketing|Take this 1-question survey!"
msgstr "Візьміть учаÑÑ‚ÑŒ у цьому опитуванні з 1 запитаннÑ!"
@@ -20239,13 +20598,13 @@ msgid "InProductMarketing|Take your first steps with GitLab"
msgstr "Зробіть перші кроки з GitLab"
msgid "InProductMarketing|Take your source code management to the next level"
-msgstr ""
+msgstr "Виведіть ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ð¼ кодом на новий рівень"
msgid "InProductMarketing|Team members collaborating"
msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
-msgstr ""
+msgstr "Об’єднайтеÑÑ Ð² GitLab Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ–"
msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
@@ -20269,10 +20628,10 @@ msgid "InProductMarketing|Tired of wrestling with disparate tool chains, informa
msgstr ""
msgid "InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб відмовитиÑÑ Ð²Ñ–Ð´ цих ознайомчих лиÑтів, %{unsubscribe_link}."
msgid "InProductMarketing|To understand and get the most out of GitLab, start at the beginning and %{project_link}. In GitLab, repositories are part of a project, so after you've created your project you can go ahead and %{repo_link}."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб зрозуміти та отримати макÑимальну кориÑÑ‚ÑŒ від роботи з GitLab, розпочніть з початку та %{project_link}. Репозиторії Ñ” чаÑтиною проєкту в GitLab, тож піÑÐ»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñвого проєкту, ви можете працювати далі та %{repo_link}."
msgid "InProductMarketing|Track completed issues in a chart, so you can see how a milestone is progressing at a glance."
msgstr ""
@@ -20365,7 +20724,7 @@ msgid "InProductMarketing|go to about.gitlab.com"
msgstr "перейдіть на about.gitlab.com"
msgid "InProductMarketing|how easy it is to get started"
-msgstr ""
+msgstr "Ñк легко почати"
msgid "InProductMarketing|quick start guide"
msgstr "коротка інÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ Ð· початку роботи"
@@ -20539,7 +20898,7 @@ msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
-msgstr ""
+msgstr "Покращте Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ†Ð¸Ð´ÐµÐ½Ñ‚Ñ–Ð² та налаштуйте інтеграції із зовнішніми інÑтрументами, щоб допомогти краще керувати інцидентами."
msgid "IncidentSettings|Grafana integration"
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Grafana"
@@ -20554,16 +20913,16 @@ msgid "IncidentSettings|Introduce a countdown timer in incident issues to better
msgstr ""
msgid "IncidentSettings|PagerDuty integration"
-msgstr ""
+msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð· PagerDuty"
msgid "IncidentSettings|Time limit"
-msgstr ""
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу"
msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
msgstr ""
msgid "IncidentSettings|Time limit must be a valid number."
-msgstr ""
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу має бути дійÑним чиÑлом."
msgid "IncidentSettings|Time limit must be greater than 0."
msgstr ""
@@ -20587,7 +20946,7 @@ msgid "Incidents|Add text or a link to display with your image. If you don't add
msgstr ""
msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
-msgstr ""
+msgstr "Перекиньте або %{linkStart}завантажте%{linkEnd} знімок екрана метрики, щоб прикріпити його до інциденту"
msgid "Incidents|Must start with http or https"
msgstr ""
@@ -20598,9 +20957,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr "Ви впевнені, що бажаєте видалити цю подію?"
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr "Видалити подію"
+
msgid "Incident|Delete image"
msgstr ""
@@ -20613,12 +20978,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr "Метрики"
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr "Зберегти та додати іншу подію"
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "ПідÑумок"
@@ -20631,6 +21014,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Вказати ім'Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° в тілі ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ електронній пошті"
@@ -20671,10 +21060,10 @@ msgid "Incompatible project"
msgstr "ÐеÑуміÑний проєкт"
msgid "Incomplete"
-msgstr ""
+msgstr "Ðе завершено"
msgid "Increase"
-msgstr ""
+msgstr "Збільшити"
msgid "Index"
msgstr "ІндекÑ"
@@ -20731,7 +21120,7 @@ msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr "У вашому проєкті немає модулів Terraform"
msgid "Inherited"
-msgstr ""
+msgstr "УÑпадковано"
msgid "Inherited:"
msgstr "УÑпадковано:"
@@ -20752,17 +21141,14 @@ msgid "Input host keys manually"
msgstr "Введіть ключі хоÑта вручну"
msgid "Input the remote repository URL"
-msgstr ""
+msgstr "Введіть URL-адреÑу віддаленого Ñховища"
msgid "Insert"
-msgstr ""
+msgstr "Ð’Ñтавити"
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr "Ð’Ñтавити блок коду"
-
msgid "Insert a quote"
msgstr "Ð’Ñтавити цитату"
@@ -20770,22 +21156,22 @@ msgid "Insert code"
msgstr "Ð’Ñтавити код"
msgid "Insert column after"
-msgstr ""
+msgstr "Ð’Ñтавити Ñтовпець піÑлÑ"
msgid "Insert column before"
-msgstr ""
+msgstr "Ð’Ñтавити Ñтовпець перед"
msgid "Insert image"
-msgstr ""
+msgstr "Ð’Ñтавити зображеннÑ"
msgid "Insert link"
-msgstr ""
+msgstr "Ð’Ñтавити поÑиланнÑ"
msgid "Insert row after"
-msgstr ""
+msgstr "Ð’Ñтавити Ñ€Ñдок піÑлÑ"
msgid "Insert row before"
-msgstr ""
+msgstr "Ð’Ñтавити Ñ€Ñдок перед"
msgid "Insert suggestion"
msgstr "Додати пропозицію"
@@ -20819,13 +21205,13 @@ msgid "Instance Configuration"
msgstr "Параметри інÑтанÑу"
msgid "Instance access request"
-msgstr ""
+msgstr "Запит на доÑтуп до інÑтанÑу"
msgid "Instance access request approved"
-msgstr ""
+msgstr "Запит на доÑтуп до інÑтанÑу Ñхвалено"
msgid "Instance access request rejected"
-msgstr ""
+msgstr "Запит на доÑтуп до інÑтанÑу відхилено"
msgid "Instance administrators group already exists"
msgstr "Група Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів інÑтанÑу вже Ñ–Ñнує"
@@ -20837,10 +21223,10 @@ msgid "Instance overview"
msgstr "ОглÑд інÑтанÑу"
msgid "Insufficient permissions"
-msgstr ""
+msgstr "ÐедоÑтатньо прав"
msgid "Insufficient permissions for dast_configuration keyword"
-msgstr ""
+msgstr "ÐедоÑтатньо прав Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ Ñлова dast_configuration"
msgid "Integration"
msgstr "ІнтеграціÑ"
@@ -20905,6 +21291,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20917,10 +21306,13 @@ msgstr "Деталі коментарÑ:"
msgid "Integrations|Comment settings:"
msgstr "Параметри коментарів:"
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr "Деталі підключеннÑ"
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20939,10 +21331,10 @@ msgid "Integrations|Default settings are inherited from the instance level."
msgstr ""
msgid "Integrations|Edit project alias"
-msgstr ""
+msgstr "Редагувати назву проєкту"
msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
-msgstr ""
+msgstr "Увімкнути команди GitLab.com у робочому проÑторі Slack."
msgid "Integrations|Enable SSL verification"
msgstr "Увімкнути перевірку SSL"
@@ -20951,13 +21343,13 @@ msgid "Integrations|Enable comments"
msgstr "Увімкнути коментарі"
msgid "Integrations|Enter your alias"
-msgstr ""
+msgstr "Введіть ваш пÑевдонім"
msgid "Integrations|Failed to link namespace. Please try again."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð²â€™Ñзати проÑÑ‚Ñ–Ñ€ імен. Будь лаÑка, Ñпробуйте ще раз."
msgid "Integrations|Failed to load namespaces. Please try again."
-msgstr ""
+msgstr "Помилка при завантаженні проÑторів імен. Будь лаÑка, Ñпробуйте ще раз."
msgid "Integrations|Failed to load subscriptions."
msgstr ""
@@ -20966,7 +21358,7 @@ msgid "Integrations|Failed to sign in to GitLab."
msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
-msgstr ""
+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 ""
@@ -20975,7 +21367,7 @@ msgid "Integrations|GitLab administrators can set up integrations that all proje
msgstr ""
msgid "Integrations|Group-level integration management"
-msgstr ""
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ”ÑŽ на рівні групи"
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
@@ -20990,10 +21382,10 @@ msgid "Integrations|Issues created in Jira are shown here once you have created
msgstr ""
msgid "Integrations|Keep your PHP dependencies updated on Packagist."
-msgstr ""
+msgstr "ОновлÑйте Ñвої залежноÑÑ‚Ñ– PHP на Packagist."
msgid "Integrations|Known limitations"
-msgstr ""
+msgstr "Відомі обмеженнÑ"
msgid "Integrations|Link namespaces"
msgstr ""
@@ -21013,6 +21405,9 @@ msgstr "Ðемає доÑтупних проÑторів імен."
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -21028,6 +21423,9 @@ msgstr "Скинути інтеграцію?"
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -21041,10 +21439,10 @@ msgid "Integrations|Saving will update the default settings for all projects tha
msgstr ""
msgid "Integrations|Search Jira issues"
-msgstr ""
+msgstr "Пошук задач Jira"
msgid "Integrations|Search ZenTao issues"
-msgstr ""
+msgstr "Пошук задач ZenTao"
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
@@ -21053,7 +21451,7 @@ msgid "Integrations|Send notifications about project events to a Unify Circuit c
msgstr ""
msgid "Integrations|Sign in to GitLab"
-msgstr ""
+msgstr "Увійти до GitLab"
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -21073,6 +21471,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -21095,7 +21496,7 @@ msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to us
msgstr ""
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Тепер ви повинні побачити активніÑÑ‚ÑŒ GitLab.com у ваших задачах в Jira Cloud. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{linkEnd}"
msgid "Integrations|You've activated every integration 🎉"
msgstr "Ви активували кожну інтеграцію 🎉"
@@ -21107,7 +21508,7 @@ msgid "Integrations|ZenTao issues display here when you create issues in your pr
msgstr ""
msgid "Integrations|can't exceed %{recipients_limit}"
-msgstr ""
+msgstr "Ðе може перевищувати %{recipients_limit}"
msgid "IntelliJ IDEA (HTTPS)"
msgstr ""
@@ -21131,7 +21532,7 @@ msgid "Internal - The project can be accessed by any logged in user except exter
msgstr ""
msgid "Internal error occurred while delivering this webhook."
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ð´Ð¾Ñтавки цього вебхука ÑталаÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
msgid "Internal note"
msgstr ""
@@ -21140,7 +21541,7 @@ msgid "Internal users"
msgstr "Внутрішні кориÑтувачі"
msgid "Internal users cannot be deactivated"
-msgstr ""
+msgstr "Внутрішні кориÑтувачі не можуть бути деактивовані"
msgid "Interval"
msgstr ""
@@ -21149,9 +21550,12 @@ msgid "Interval Pattern"
msgstr "Шаблон інтервалу"
msgid "Introduced in GitLab 13.1, before using %{reindexing_link_start}zero-downtime reindexing%{link_end} and %{migrations_link_start}Advanced Search migrations%{link_end}, you need to %{recreate_link_start}recreate your index%{link_end}."
-msgstr ""
+msgstr "Введено в GitLab 13.1, перш ніж викориÑтовувати %{reindexing_link_start}переіндекÑацію з нульовим проÑтоєм%{link_end} Ñ– %{migrations_link_start}міграції розширеного пошуку%{link_end}, вам потрібно %{recreate_link_start}відтворити Ñвій індекÑ%{link_end}."
msgid "Introducing Your DevOps Reports"
+msgstr "ПредÑтавлÑємо ваші DevOps звіти"
+
+msgid "Invalid"
msgstr ""
msgid "Invalid Insights config file detected"
@@ -21166,15 +21570,6 @@ msgstr "ÐедійÑна URL адреÑа"
msgid "Invalid URL: %{url}"
msgstr "ÐедійÑна URL-адреÑа: %{url}"
-msgid "Invalid container_name"
-msgstr "ÐеприпуÑтиме ім'Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ð°"
-
-msgid "Invalid cursor parameter"
-msgstr "Ðеправильний параметр курÑору"
-
-msgid "Invalid cursor value provided"
-msgstr "Ðадано неправильне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÑƒÑ€Ñора"
-
msgid "Invalid date"
msgstr "Ðеправильна дата"
@@ -21182,7 +21577,7 @@ msgid "Invalid date format. Please use UTC format as YYYY-MM-DD"
msgstr "ÐеприпуÑтимий формат дати. Будь лаÑка, викориÑтовуйте формат UTC у виглÑді РРРРР-ММ-ДД"
msgid "Invalid date range"
-msgstr ""
+msgstr "ÐедійÑний діапазон дат"
msgid "Invalid feature"
msgstr "ÐедійÑна функціÑ"
@@ -21191,7 +21586,7 @@ msgid "Invalid field"
msgstr "Ðеправильно заповнене поле"
msgid "Invalid file format with specified file type"
-msgstr ""
+msgstr "ÐеприпуÑтимий формат файлу із заданим типом файлу"
msgid "Invalid file."
msgstr "Ðеправильний файл."
@@ -21200,7 +21595,7 @@ msgid "Invalid format selected"
msgstr ""
msgid "Invalid hash"
-msgstr ""
+msgstr "ÐедійÑний хеш"
msgid "Invalid import params"
msgstr "Ðеправильні параметри імпорту"
@@ -21212,16 +21607,13 @@ msgid "Invalid login or password"
msgstr "Ðеправильний логін або пароль"
msgid "Invalid period"
-msgstr ""
+msgstr "ÐедійÑний період"
msgid "Invalid pin code."
-msgstr ""
-
-msgid "Invalid pod_name"
-msgstr "Ðекоректна назва pod_name"
+msgstr "ÐедійÑний PIN-код."
msgid "Invalid policy type"
-msgstr ""
+msgstr "ÐеприпуÑтимий тип політики"
msgid "Invalid repository bundle for snippet with id %{snippet_id}"
msgstr ""
@@ -21229,15 +21621,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr "Ðеправильний шлÑÑ… до репозиторію"
-msgid "Invalid search parameter"
-msgstr "ÐедопуÑтимий параметр пошуку"
+msgid "Invalid rule"
+msgstr ""
msgid "Invalid server response"
msgstr "Ðеправильна відповідь від Ñервера"
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr "ÐеприпуÑтимий ÑтатуÑ"
@@ -21248,22 +21637,22 @@ msgid "Invalid yaml"
msgstr "ÐедійÑний yaml"
msgid "Investigate vulnerability: %{title}"
-msgstr ""
+msgstr "ДоÑлідити вразливіÑÑ‚ÑŒ: %{title}"
msgid "Invisible Captcha"
-msgstr ""
+msgstr "Ðевидима капча"
msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
-msgstr ""
+msgstr "Ðевидима капча допомагає запобігти Ñтворенню Ñпамових облікових запиÑів. Вона додає поле honeypot та термінову форму Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ форми реєÑтрації облікового запиÑу."
msgid "Invitation"
msgstr "ЗапрошеннÑ"
msgid "Invitation declined"
-msgstr ""
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð¾"
msgid "Invite \"%{email}\" by email"
-msgstr ""
+msgstr "ЗапроÑити \"%{email}\" за електронною поштою"
msgid "Invite \"%{trimmed}\" by email"
msgstr "ЗапроÑити \"%{trimmed}\" за електронною поштою"
@@ -21281,22 +21670,22 @@ msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %
msgstr "%{inviter} запроÑив Ð²Ð°Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ %{project_or_group_name}%{project_or_group} у ролі %{role}"
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 ""
+msgstr "%{inviter} запроÑив Ð²Ð°Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} у ÑкоÑÑ‚Ñ– %{role}"
msgid "InviteEmail|%{project_or_group} details"
msgstr "деталі %{project_or_group}"
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
-msgstr ""
+msgstr "Групи збирають разом пов'Ñзані проєкти та надають учаÑникам доÑтуп до кількох проєктів відразу."
msgid "InviteEmail|Join now"
msgstr "ПриєднатиÑÑ Ð·Ð°Ñ€Ð°Ð·"
msgid "InviteEmail|Join your team on GitLab! %{inviter} invited you to %{project_or_group_name}"
-msgstr ""
+msgstr "ПриєднайтеÑÑ Ð´Ð¾ Ñвоєї команди на GitLab! %{inviter} запроÑив Ð²Ð°Ñ Ð´Ð¾ %{project_or_group_name}"
msgid "InviteEmail|Join your team on GitLab! You are invited to %{project_or_group_name}"
-msgstr ""
+msgstr "ПриєднайтеÑÑ Ð´Ð¾ Ñвоєї команди на GitLab! Ð’Ð°Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÑƒÑŽÑ‚ÑŒ до %{project_or_group_name}"
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 ""
@@ -21373,6 +21762,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr "УчаÑники були уÑпішно додані"
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Шукайте групу, щоб запроÑити"
@@ -21388,11 +21780,18 @@ msgstr "Виберіть учаÑників або введіть адреÑи Ð
msgid "InviteMembersModal|Something went wrong"
msgstr "ЩоÑÑŒ пішло не так"
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб призначити задачі новому учаÑнику команди, вам потрібен проєкт Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ñ‡. %{linkStart}Створити проєкт, щоб почати.%{linkEnd}"
msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
msgstr ""
@@ -21419,10 +21818,10 @@ msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{
msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} group."
-msgstr ""
+msgstr "Ви запрошуєте учаÑників до групи %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
-msgstr ""
+msgstr "Ви запрошуєте учаÑників до проєкту %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
msgstr ""
@@ -21437,7 +21836,7 @@ msgid "InviteMembers|Invite team members"
msgstr "ЗапроÑити учаÑників команди"
msgid "InviteMember|Add members to this project and start collaborating with your team."
-msgstr ""
+msgstr "Додайте учаÑників до цього проєкту та розпочніть Ñпівпрацю з вашою командою."
msgid "InviteMember|Invite Members (optional)"
msgstr "ЗапроÑити учаÑників (необов'Ñзково)"
@@ -21452,16 +21851,16 @@ msgid "InviteMember|Invite your team"
msgstr "ЗапроÑити Ñвою команду"
msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
-msgstr ""
+msgstr "Запрошені кориÑтувачі будуть додані з дозволами Ñ€Ñ–Ð²Ð½Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð½Ð¸ÐºÑ–Ð². %{linkStart}ПереглÑньте документацію%{linkEnd}, щоб зрозуміти, Ñк це змінити пізніше."
msgid "InviteReminderEmail|%{inviter} is still waiting for you to join GitLab"
-msgstr ""
+msgstr "%{inviter} вÑе ще чекає, щоб ви приєдналиÑÑ Ð´Ð¾ GitLab"
msgid "InviteReminderEmail|%{inviter} is waiting for you to join GitLab"
-msgstr ""
+msgstr "%{inviter} чекає, щоб ви приєдналиÑÑ Ð´Ð¾ GitLab"
msgid "InviteReminderEmail|%{inviter} is waiting for you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
-msgstr ""
+msgstr "%{inviter} чекає, щоб ви приєдналиÑÑ Ð´Ð¾ %{strong_start}%{project_or_group_name}%{strong_end}%{project_or_group} у ÑкоÑÑ‚Ñ– %{role}."
msgid "InviteReminderEmail|%{inviter}'s invitation to GitLab is pending"
msgstr "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ %{inviter} до GitLab очікує"
@@ -21499,6 +21898,9 @@ msgstr "Це дружнє Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ те, що %{inviter} з
msgid "Invited"
msgstr "Запрошені"
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr "Канали та кориÑтувачі розділені пробілами. %{recipients_docs_link}"
@@ -21512,10 +21914,10 @@ msgid "IrkerService|Recipients"
msgstr "Одержувачі"
msgid "IrkerService|Send update messages to an irker server."
-msgstr ""
+msgstr "ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° Ñервер irker."
msgid "IrkerService|Send update messages to an irker server. Before you can use this, you need to set up the irker daemon. %{docs_link}"
-msgstr ""
+msgstr "ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° Ñервер irker. Перш ніж ви зможете ÑкориÑтатиÑÑŒ ним, вам треба налаштувати демон irker. %{docs_link}"
msgid "IrkerService|Server host (optional)"
msgstr ""
@@ -21566,7 +21968,7 @@ msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}
msgstr "Задачу %{issue_reference} вже було додано до епіку %{epic_reference}."
msgid "Issue Analytics"
-msgstr ""
+msgstr "Ðналітика задач"
msgid "Issue Boards"
msgstr "Дошки Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡"
@@ -21581,7 +21983,7 @@ msgid "Issue cannot be found."
msgstr "Ðеможливо знайти задачу."
msgid "Issue created from vulnerability %{vulnerability_link}"
-msgstr ""
+msgstr "Задача Ñтворена через вразливіÑÑ‚ÑŒ %{vulnerability_link}"
msgid "Issue creation requests"
msgstr ""
@@ -21596,7 +21998,7 @@ msgid "Issue first deployed to production"
msgstr ""
msgid "Issue has been promoted to incident"
-msgstr ""
+msgstr "Задача була переведена в \"інцидент\""
msgid "Issue label"
msgstr "Мітка задачі"
@@ -21605,7 +22007,7 @@ msgid "Issue or merge request ID is required"
msgstr ""
msgid "Issue published on status page."
-msgstr ""
+msgstr "Задачу опубліковано на Ñторінці ÑтатуÑу."
msgid "Issue types"
msgstr "Типи задачі"
@@ -21677,22 +22079,16 @@ msgid "IssueTracker|Issue URL"
msgstr "URL-адреÑа задачі"
msgid "IssueTracker|New issue URL"
-msgstr ""
+msgstr "URL-адреÑа нової задачі"
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
-msgstr ""
-
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
+msgstr "URL-адреÑа Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡ у зовнішньому реєÑтрі задач."
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
-msgstr ""
+msgstr "URL-адреÑа Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду задачі у зовнішньому реєÑтрі задач. Має міÑтити %{colon_id}."
msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
msgstr ""
@@ -21734,7 +22130,7 @@ msgid "Issues and merge requests"
msgstr "Задачі та запити на злиттÑ"
msgid "Issues are being rebalanced at the moment, so manual reordering is disabled."
-msgstr ""
+msgstr "Ðаразі відновлюєтьÑÑ Ð±Ð°Ð»Ð°Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡, тому ручна зміна порÑдку вимкнена."
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Задачі можуть бути помилками, нагадуваннÑми чи ідеÑми Ð´Ð»Ñ Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ. Крім того, задачі доÑтупні Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ та фільтруваннÑ."
@@ -21746,13 +22142,13 @@ msgid "Issues exist in projects, so to create an issue, first create a project."
msgstr ""
msgid "Issues must match this scope to appear in this list."
-msgstr ""
+msgstr "Задачі мають відповідати цій облаÑÑ‚Ñ–, щоб з’ÑвитиÑÑ Ð² цьому ÑпиÑку."
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
msgstr "Задачі з коментарÑми, запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð· порівнÑннÑми (diff) та коментарÑми, мітки, етапи, Ñніпети та інші об'єкти в проєкті"
msgid "Issues with label %{label}"
-msgstr ""
+msgstr "Задачі з міткою %{label}"
msgid "Issues with no epic assigned"
msgstr "Задачі без призначеного епіку"
@@ -21791,7 +22187,7 @@ msgid "Issue|Title"
msgstr "Ðазва"
msgid "It is not possible to %{action} files that are stored in LFS using the web interface"
-msgstr ""
+msgstr "Ðеможливо %{action} файли, Ñкі зберігаютьÑÑ Ñƒ LFS за допомогою веб-інтерфейÑу"
msgid "It looks like you have some draft commits in this branch."
msgstr ""
@@ -21800,16 +22196,16 @@ msgid "It looks like you're attempting to activate your subscription. Use %{a_st
msgstr ""
msgid "It may be several days before you see feature usage data."
-msgstr ""
+msgstr "Може минути кілька днів, перш ніж ви побачите дані про викориÑÑ‚Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—."
msgid "It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected."
msgstr "Має ÑкладатиÑÑ Ñ–Ð· Ñ€Ñдка заголовка Ñ– мінімум двох колонок: перша — заголовок задачі, а друга — Ñ—Ñ— опиÑ. Розділювач визначаєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾."
msgid "It seems like the Dependency Scanning job ran successfully, but no dependencies have been detected in your project."
-msgstr ""
+msgstr "ЗдаєтьÑÑ, що робота ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей виконана уÑпішно, але залежноÑÑ‚Ñ– не були виÑвлені в вашому проєкті."
msgid "It seems that there is currently no available data for code coverage"
-msgstr ""
+msgstr "ЗдаєтьÑÑ, наразі немає доÑтупних даних Ð´Ð»Ñ Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐ¾Ð´Ñƒ"
msgid "It's you"
msgstr "Це ви"
@@ -21851,7 +22247,7 @@ msgid "Iterations|Can be converted"
msgstr ""
msgid "Iterations|Cancel"
-msgstr ""
+msgstr "СкаÑувати"
msgid "Iterations|Couldn't find iteration cadence"
msgstr ""
@@ -21872,10 +22268,10 @@ msgid "Iterations|Delete iteration?"
msgstr ""
msgid "Iterations|Description"
-msgstr ""
+msgstr "ОпиÑ"
msgid "Iterations|Done"
-msgstr ""
+msgstr "Готово"
msgid "Iterations|Due date"
msgstr ""
@@ -22009,9 +22405,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "не може перевищувати 500 років у майбутньому"
-msgid "Jaeger URL"
-msgstr "URL-адреÑа Jaeger"
-
msgid "Jan"
msgstr "Ñіч."
@@ -22043,14 +22436,20 @@ msgid "Jira user"
msgstr "КориÑтувач Jira"
msgid "Jira users have been imported from the configured Jira instance. They can be mapped by selecting a GitLab user from the dropdown in the \"GitLab username\" column. When the form appears, the dropdown defaults to the user conducting the import."
-msgstr ""
+msgstr "КориÑтувачів Jira було імпортовано із налаштованого інÑтанÑу Jira. Їх можна зіÑтавити, вибравши кориÑтувача GitLab з випадаючого ÑпиÑку в Ñтовпці Â«Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача GitLab». Коли з’ÑвитьÑÑ Ñ„Ð¾Ñ€Ð¼Ð°, у випадаючому ÑпиÑку за замовчуваннÑм відображаєтьÑÑ ÐºÐ¾Ñ€Ð¸Ñтувач, Ñкий виконує імпорт."
msgid "Jira-GitLab user mapping template"
msgstr "Шаблон зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів Jira-GitLab"
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr "Створити гілку Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– Jira %{jiraIssue}"
@@ -22069,6 +22468,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr "Ðова гілка була уÑпішно Ñтворена."
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "Зараз ви можете закрити це вікно та повернутиÑÑ Ð´Ð¾ Jira."
@@ -22085,7 +22487,7 @@ msgid "JiraRequest|An SSL error occurred while connecting to Jira: %{message}. T
msgstr "Виникла помилка SSL під Ñ‡Ð°Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Jira: %{message}. Повторіть Ñвій запит знову."
msgid "JiraRequest|An error occurred while requesting data from Jira. Check your %{docs_link_start}Jira integration configuration%{docs_link_end} and try again."
-msgstr ""
+msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ даних з Jira. Перевірте Ñвою %{docs_link_start}конфігурацію інтеграції Jira%{docs_link_end} та Ñпробуйте знову."
msgid "JiraRequest|An error occurred while requesting data from Jira: %{messages}. Check your %{docs_link_start}Jira integration configuration%{docs_link_end} and try again."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ даних з Jira: %{messages}. Перевірте Ñвою %{docs_link_start}конфігурацію інтеграції Jira%{docs_link_end} та Ñпробуйте знову."
@@ -22094,16 +22496,16 @@ msgid "JiraRequest|The Jira API URL for connecting to Jira is not valid. Check y
msgstr "URL-адреÑа API Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Jira не Ñ” дійÑною. Перевірте URL-адреÑу вашого Jira API та повторіть Ñпробу."
msgid "JiraRequest|The credentials for accessing Jira are not allowed to access the data. Check your %{docs_link_start}Jira integration credentials%{docs_link_end} and try again."
-msgstr ""
+msgstr "Облікові дані Ð´Ð»Ñ Ð´Ð¾Ñтупу до Jira не мають доÑтупу до даних. Перевірте Ñвої %{docs_link_start}облікові дані інтеграції Jira%{docs_link_end} та Ñпробуйте знову."
msgid "JiraRequest|The credentials for accessing Jira are not valid. Check your %{docs_link_start}Jira integration credentials%{docs_link_end} and try again."
-msgstr ""
+msgstr "Облікові дані Ð´Ð»Ñ Ð´Ð¾Ñтупу до Jira недійÑні. Перевірте Ñвої %{docs_link_start}облікові дані інтеграції Jira%{docs_link_end} та Ñпробуйте знову."
msgid "JiraService| on branch %{branch_link}"
msgstr " у гілці %{branch_link}"
msgid "JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab."
-msgstr ""
+msgstr "%{jiraDocsLinkStart}Увімкніть інтеграцію Jira%{jiraDocsLinkEnd}, щоб переглÑнути ваші задачі Jira в GitLab."
msgid "JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs_link_end} to view your Jira issues in GitLab."
msgstr "%{jira_docs_link_start}Увімкніть інтеграцію Jira%{jira_docs_link_end}, щоб переглÑнути ваші задачі Jira в GitLab."
@@ -22169,7 +22571,7 @@ msgid "JiraService|IDs must be a list of numbers that can be split with , or ;"
msgstr "Ідентифікатори повинні мати виглÑд ÑпиÑку чиÑел, Ñкі можна розділити , або ;"
msgid "JiraService|If different from Web URL."
-msgstr ""
+msgstr "Якщо відрізнÑєтьÑÑ Ð²Ñ–Ð´ URL-адреÑи Web."
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr "Задачі, Ñтворені із вразливоÑтей у цьому проєкті, будуть задачами Jira, навіть Ñкщо задачі GitLab будуть увімкнені."
@@ -22190,10 +22592,10 @@ msgid "JiraService|Jira project key"
msgstr "Ключ проєкту Jira"
msgid "JiraService|Leave blank to use your current password or API token."
-msgstr ""
+msgstr "Залиште порожнім, щоб викориÑтовувати Ñвій поточний пароль або API токен."
msgid "JiraService|Move to Done"
-msgstr ""
+msgstr "ПереміÑтити до завершеного"
msgid "JiraService|Open Jira"
msgstr "Відкрити Jira"
@@ -22316,7 +22718,7 @@ msgid "Jobs older than the configured time are considered expired and are archiv
msgstr ""
msgid "Jobs|All"
-msgstr ""
+msgstr "Ð’ÑÑ–"
msgid "Jobs|An error occurred while loading the Failed Jobs tab."
msgstr ""
@@ -22334,7 +22736,7 @@ msgid "Jobs|Filter jobs"
msgstr ""
msgid "Jobs|Finished"
-msgstr ""
+msgstr "Завершено"
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22372,6 +22774,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22394,7 +22799,7 @@ msgid "Job|Download"
msgstr "Завантажити"
msgid "Job|Erase job log and artifacts"
-msgstr ""
+msgstr "Стерти лог завдань та артефакти"
msgid "Job|Failed"
msgstr "Ðевдало"
@@ -22411,12 +22816,18 @@ msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ Ñтерте"
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr "Пошук в журналі завдань"
+
msgid "Job|Keep"
msgstr "Залишити"
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr "Ðічого не знайдено"
+
msgid "Job|Passed"
msgstr ""
@@ -22441,6 +22852,12 @@ msgstr "Прокрутити вниз"
msgid "Job|Scroll to top"
msgstr "Прокрутити вгору"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr "Показати повний неформатований"
@@ -22477,6 +22894,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr "Ми не змогли знайти цей елемент"
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22496,7 +22916,7 @@ msgid "Join Zoom meeting"
msgstr "ПриєднатиÑÑ Ð´Ð¾ зуÑтрічі в Zoom"
msgid "Join a project"
-msgstr ""
+msgstr "ДолучитиÑÑ Ð´Ð¾ проєкту"
msgid "Join your team on GitLab and contribute to an existing project"
msgstr ""
@@ -22532,7 +22952,7 @@ msgid "KEY"
msgstr "КЛЮЧ"
msgid "Keep"
-msgstr ""
+msgstr "Залишити"
msgid "Keep artifacts from most recent successful jobs"
msgstr ""
@@ -22594,9 +23014,6 @@ msgstr "Kroki"
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr "Kubernetes API повернуло код помилки: %{error_code}"
-
msgid "Kubernetes Cluster"
msgstr "КлаÑтер Kubernetes"
@@ -22672,6 +23089,13 @@ msgstr "Мітка"
msgid "Label actions dropdown"
msgstr "Випадаючий ÑпиÑок дій із мітками"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Label priority"
msgstr "Мітка пріоритет"
@@ -22721,7 +23145,7 @@ msgid "Language"
msgstr "Мова"
msgid "Language type"
-msgstr ""
+msgstr "Тип мови"
msgid "Large File Storage"
msgstr "Сховище великих файлів (LFS)"
@@ -22785,7 +23209,7 @@ msgid "Last edited %{date}"
msgstr "ОÑтанні зміни %{date}"
msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
-msgstr ""
+msgstr "ВоÑтаннє редаговано %{link_start}%{avatar} %{name}%{link_end}"
msgid "Last event"
msgstr ""
@@ -22794,7 +23218,7 @@ msgid "Last item before this page loaded in your browser:"
msgstr ""
msgid "Last modified"
-msgstr ""
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð°"
msgid "Last month"
msgstr "Минулий міÑÑць"
@@ -22812,10 +23236,10 @@ msgid "Last seen"
msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–ÑÑ‚ÑŒ"
msgid "Last sign-in"
-msgstr ""
+msgstr "ОÑтанній вхід"
msgid "Last sign-in IP:"
-msgstr ""
+msgstr "IP оÑтаннього входу:"
msgid "Last sign-in at:"
msgstr ""
@@ -22878,13 +23302,13 @@ msgid "Launch a ready-to-code development environment for your project."
msgstr "ЗапуÑÑ‚Ñ–Ñ‚ÑŒ Ñередовище Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±ÐºÐ¸ вашого проєкту."
msgid "Layout|Fixed"
-msgstr ""
+msgstr "ФікÑований"
msgid "Layout|Fluid"
-msgstr ""
+msgstr "Ðдаптивний"
msgid "Lead Time"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
msgid "Lead Time for Changes"
msgstr ""
@@ -22898,14 +23322,11 @@ msgstr "ДізнатиÑÑ Ð¿Ñ€Ð¾ GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ"
msgid "Learn More."
-msgstr ""
+msgstr "Прочитати більше."
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "ДізнайтеÑÑ Ñк %{link_start}зробити внеÑок до вбудованих шаблонів%{link_end}"
@@ -22916,9 +23337,6 @@ msgstr "ДізнайтеÑÑ Ñк %{no_packages_link_start}публікуватÐ
msgid "Learn more"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{link_start_tag}Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Jaeger%{link_end_tag}."
-
msgid "Learn more about %{username}"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{username}"
@@ -22944,7 +23362,7 @@ msgid "Learn more about custom project templates"
msgstr "Докладніше про влаÑні шаблони проєктів"
msgid "Learn more about deploying to AWS"
-msgstr ""
+msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² AWS"
msgid "Learn more about deploying to a cluster"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² клаÑтер"
@@ -22974,15 +23392,18 @@ msgid "Learn more."
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ."
msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
-msgstr ""
+msgstr "%{percentage}%{percentSymbol} завершено"
msgid "LearnGitLab|Add code owners"
msgstr "Додати влаÑників коду"
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
+msgstr "Спочатку завершіть ці завданнÑ, аби наÑолоджуватиÑÑ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñми GitLab у повній мірі:"
+
+msgid "LearnGitLab|Create a repository"
msgstr ""
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
@@ -22991,9 +23412,6 @@ msgstr ""
msgid "LearnGitLab|Create an issue"
msgstr "Створити задачу"
-msgid "LearnGitLab|Create or import a repository"
-msgstr ""
-
msgid "LearnGitLab|Create or import your first repository into your new project."
msgstr ""
@@ -23028,7 +23446,7 @@ msgid "LearnGitLab|Review and edit proposed changes to source code."
msgstr ""
msgid "LearnGitLab|Route code reviews to the right reviewers, every time."
-msgstr ""
+msgstr "Щоразу направлÑйте перевірку коду потрібним оглÑдачам."
msgid "LearnGitLab|Run a Security scan using CI/CD"
msgstr ""
@@ -23036,23 +23454,26 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr ""
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr ""
+
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
msgid "LearnGitLab|Set up CI/CD"
msgstr "Ðалаштувати CI/CD"
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
-msgstr "Ðалаштувати CI/CD"
-
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your workspace"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
-msgstr "ÐадіÑлати запит на злиттÑ"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
+msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
msgstr ""
@@ -23069,6 +23490,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -23076,10 +23500,7 @@ msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
msgid "LearnGitlab|Ok, let's go"
-msgstr ""
-
-msgid "LearnGitlab|Trial only"
-msgstr ""
+msgstr "Ок, поїхали"
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23379,7 +23800,7 @@ msgid "Link copied"
msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñкопійовано"
msgid "Link text"
-msgstr ""
+msgstr "ТекÑÑ‚ поÑиланнÑ"
msgid "Link title"
msgstr "Заголовок поÑиланнÑ"
@@ -23511,7 +23932,7 @@ msgid "Lock memberships to LDAP synchronization"
msgstr "ЗафікÑувати належноÑÑ‚Ñ– (до груп) через LDAP Ñинхронізацію"
msgid "Lock merge request"
-msgstr ""
+msgstr "Заблокувати запит на злиттÑ"
msgid "Lock not found"
msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ знайдено"
@@ -23547,10 +23968,10 @@ msgid "LoggedOutMarketingHeader|About GitLab"
msgstr "Про GitLab"
msgid "LoggedOutMarketingHeader|Explore GitLab"
-msgstr ""
+msgstr "ОглÑд GitLab"
msgid "LoggedOutMarketingHeader|Get started"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ"
msgid "LoggedOutMarketingHeader|GitLab Learn"
msgstr "ДізнайтеÑÑ Ð¿Ñ€Ð¾ GitLab"
@@ -23559,19 +23980,19 @@ msgid "LoggedOutMarketingHeader|GitLab docs"
msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ GitLab"
msgid "LoggedOutMarketingHeader|GitLab: the DevOps platform"
-msgstr ""
+msgstr "GitLab: платформа DevOps"
msgid "LoggedOutMarketingHeader|How GitLab compares"
msgstr ""
msgid "LoggedOutMarketingHeader|Install GitLab"
-msgstr ""
+msgstr "Ð’Ñтановити GitLab"
msgid "LoggedOutMarketingHeader|Pricing"
-msgstr ""
+msgstr "Ціни"
msgid "LoggedOutMarketingHeader|Talk to an expert"
-msgstr ""
+msgstr "Поговорити з екÑпертом"
msgid "Login"
msgstr "Увійти"
@@ -23588,9 +24009,6 @@ msgstr ""
msgid "Logs"
msgstr "Логи"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23613,7 +24031,7 @@ msgid "MR widget|See your pipeline in action"
msgstr "ПереглÑньте ваш конвеєр в дії"
msgid "MR widget|Take a look at our %{beginnerLinkStart}Beginner's Guide to Continuous Integration%{beginnerLinkEnd} and our %{exampleLinkStart}examples of GitLab CI/CD%{exampleLinkEnd} to learn more."
-msgstr ""
+msgstr "ПоглÑньте на наш %{beginnerLinkStart}ПоÑібник Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑ–Ð²Ñ†Ñ–Ð² з безперервної інтеграції%{beginnerLinkEnd} та на наші %{exampleLinkStart}приклади GitLab CI/CD%{exampleLinkEnd}, аби дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ."
msgid "MR widget|The pipeline will test your code on every commit. A %{codeQualityLinkStart}code quality report%{codeQualityLinkEnd} will appear in your merge requests to warn you about potential code degradations."
msgstr ""
@@ -23678,21 +24096,15 @@ msgstr "ПереконайтеÑÑ, що ви його зберегли, бо в
msgid "Makes this issue confidential."
msgstr "Робить цю задачу конфіденційною."
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
msgid "Manage Web IDE features."
-msgstr ""
+msgstr "Керувати функціÑми веб-IDE."
msgid "Manage access"
msgstr "Керувати доÑтупом"
-msgid "Manage all notifications"
-msgstr "Керувати вÑіма ÑповіщеннÑми"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "Керувати програмами, Ñкі можуть викориÑтовувати GitLab Ñк поÑтачальника OAuth, а також програми, Ñким ви Ñамі дозволили викориÑтовувати в вашому обліковому запиÑÑ–."
@@ -23712,7 +24124,7 @@ msgid "Manage labels"
msgstr "Керувати мітками"
msgid "Manage members"
-msgstr ""
+msgstr "Керувати учаÑниками"
msgid "Manage milestones"
msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÐµÑ‚Ð°Ð¿Ð°Ð¼Ð¸"
@@ -23721,19 +24133,19 @@ msgid "Manage project labels"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ°Ð¼Ð¸ проєкту"
msgid "Manage projects."
-msgstr ""
+msgstr "Керувати проєктами"
msgid "Manage two-factor authentication"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾ÑŽ автентифікацією"
msgid "Manage your license"
-msgstr ""
+msgstr "Керувати вашою ліцензією"
msgid "Manage your project's triggers"
msgstr ""
msgid "Managed Account"
-msgstr ""
+msgstr "Керований обліковий запиÑ"
msgid "Manifest"
msgstr "МаніфеÑÑ‚"
@@ -23787,34 +24199,34 @@ msgid "Markdown Help"
msgstr "Довідка по розмітці Markdown"
msgid "Markdown enabled."
-msgstr ""
+msgstr "Markdown активовано."
msgid "Markdown supported."
-msgstr ""
+msgstr "ПідтримуєтьÑÑ Markdown."
msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
-msgstr ""
+msgstr "Додати поÑÐ¸Ð»Ð°Ð½Ð½Ñ (%{modifierKey}К)"
msgid "MarkdownEditor|Add a link (%{modifier_key}K)"
-msgstr ""
+msgstr "Додати поÑÐ¸Ð»Ð°Ð½Ð½Ñ (%{modifier_key}К)"
msgid "MarkdownEditor|Add bold text (%{modifierKey}B)"
-msgstr ""
+msgstr "Додати жирний текÑÑ‚ (%{modifierKey}B)"
msgid "MarkdownEditor|Add bold text (%{modifier_key}B)"
-msgstr ""
+msgstr "Додати жирний текÑÑ‚ (%{modifier_key}B)"
msgid "MarkdownEditor|Add italic text (%{modifierKey}I)"
-msgstr ""
+msgstr "Додати курÑивний текÑÑ‚ (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
-msgstr ""
+msgstr "Додати курÑивний текÑÑ‚ (%{modifier_key}I)"
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
-msgstr ""
+msgstr "Додати закреÑлений текÑÑ‚ (%{modifierKey}⇧X)"
msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
-msgstr ""
+msgstr "Додати закреÑлений текÑÑ‚ (%{modifier_key}⇧X)"
msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
msgstr ""
@@ -23831,6 +24243,9 @@ msgstr "Позначено Ñк готове. Тепер Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð¾Ð·Ð²Ð¾
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr "Цю задачу позначено дублікатом %{duplicate_param}."
@@ -23843,6 +24258,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr "Позначає задачу Ñк дублікат %{duplicate_reference}."
@@ -23901,7 +24319,7 @@ msgid "Max 100,000 events"
msgstr "МакÑ. 100 000 подій"
msgid "Max Value"
-msgstr ""
+msgstr "МакÑимальне значеннÑ"
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23913,7 +24331,7 @@ msgid "Max role"
msgstr "МакÑимальна роль"
msgid "Max seats used"
-msgstr ""
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ викориÑтаних міÑць"
msgid "Max session time"
msgstr "МакÑимальний Ñ‡Ð°Ñ ÑеанÑу"
@@ -23952,13 +24370,13 @@ msgid "Maximum allowed lifetime for SSH keys (in days)"
msgstr ""
msgid "Maximum artifacts size"
-msgstr ""
+msgstr "МакÑимальний розмір артефактів"
msgid "Maximum artifacts size (MB)"
msgstr "МакÑимальний розмір артефактів (МБ)"
msgid "Maximum attachment size"
-msgstr ""
+msgstr "МакÑимальний розмір вкладеннÑ"
msgid "Maximum attachment size (MB)"
msgstr "МакÑимальний розмір Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ (МБ)"
@@ -23970,13 +24388,13 @@ msgid "Maximum authenticated web requests per rate limit period per user"
msgstr ""
msgid "Maximum bulk request size (MiB)"
-msgstr ""
+msgstr "МакÑимальний розмір маÑового запиту (MiB)"
msgid "Maximum capacity"
msgstr "МакÑимальна пропуÑкна здатніÑÑ‚ÑŒ"
msgid "Maximum character limit - %{limit}"
-msgstr ""
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ Ñимволів - %{limit}"
msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation."
msgstr ""
@@ -24027,13 +24445,13 @@ msgid "Maximum group import requests per minute"
msgstr ""
msgid "Maximum import size"
-msgstr ""
+msgstr "МакÑимальний розмір імпорту"
msgid "Maximum import size (MB)"
msgstr "МакÑимальний розмір Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ (МБ)"
msgid "Maximum job artifact size"
-msgstr ""
+msgstr "МакÑимальний розмір артефакту у завданні"
msgid "Maximum job timeout"
msgstr "МакÑимальний Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ"
@@ -24072,13 +24490,13 @@ msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr ""
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ запитів на хвилину Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ неформатованого шлÑху (за замовчуваннÑм 300). Ð’Ñтановіть 0, щоб вимкнути регулюваннÑ."
msgid "Maximum number of unique IP addresses per user."
-msgstr ""
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ унікальних IP-Ð°Ð´Ñ€ÐµÑ Ð½Ð° кориÑтувача."
msgid "Maximum of 255 characters"
-msgstr ""
+msgstr "МакÑимум 255 Ñимволів"
msgid "Maximum page reached"
msgstr ""
@@ -24105,7 +24523,7 @@ msgid "Maximum requests per 10 minutes per user"
msgstr ""
msgid "Maximum requests per minute"
-msgstr ""
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ запитів за хвилину"
msgid "Maximum running slices"
msgstr ""
@@ -24138,10 +24556,10 @@ msgid "Maximum time between updates that a mirror can have when scheduled to syn
msgstr "МакÑимальний можливий Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ оновленнÑми Ð´Ð»Ñ Ð´Ð·ÐµÑ€ÐºÐ°Ð»Ð° при запланованій Ñинхронізації."
msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
-msgstr ""
+msgstr "МакÑимальний чаÑ, протÑгом Ñкого кориÑтувачі можуть пропуÑкати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації (у годинах). Ð’Ñтановіть 0 (нуль), щоб заÑтоÑувати під Ñ‡Ð°Ñ Ð½Ð°Ñтупного входу."
msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
-msgstr ""
+msgstr "МакÑимальний Ñ‡Ð°Ñ Ñƒ Ñекундах Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ веб-терміналу. 0 - необмежений."
msgid "Maximum unauthenticated API requests per rate limit period per IP"
msgstr ""
@@ -24159,31 +24577,31 @@ msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
msgid "Medium timeout"
-msgstr ""
+msgstr "Середній Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ"
msgid "Medium vulnerabilities present"
msgstr "ПриÑутні вразливоÑÑ‚Ñ– низького рівнÑ"
msgid "Member since"
-msgstr ""
+msgstr "УчаÑник з"
msgid "Member since %{date}"
msgstr "УчаÑник з %{date}"
msgid "Member since:"
-msgstr ""
+msgstr "УчаÑник з:"
msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
-msgstr ""
+msgstr "%{member_name} запроÑив Ð²Ð°Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ GitLab"
msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or_group_name}"
-msgstr ""
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ %{project_or_group} %{project_or_group_name}"
msgid "Members"
msgstr "КориÑтувачі"
msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}"
-msgstr ""
+msgstr "%{i_open}Керівники%{i_close} або %{i_open}ВлаÑники%{i_close} можуть додавати нових учаÑників."
msgid "Members listed as CODEOWNERS of affected files."
msgstr ""
@@ -24221,10 +24639,10 @@ msgid "Members|%{time} by %{user}"
msgstr ""
msgid "Members|%{userName} is currently an LDAP user. Editing their permissions will override the settings from the LDAP group sync."
-msgstr ""
+msgstr "%{userName} наразі Ñ” кориÑтувачем LDAP. Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ—Ñ…Ð½Ñ–Ñ… дозволів замінить Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації групи LDAP."
msgid "Members|2FA"
-msgstr ""
+msgstr "двофакторна автентифікаціÑ"
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ñпроби увімкнути Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LDAP, будь лаÑка, Ñпробуйте знову."
@@ -24356,16 +24774,16 @@ msgid "Merge automatically (%{strategy})"
msgstr ""
msgid "Merge blocked: all merge request dependencies must be merged."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: уÑÑ– залежноÑÑ‚Ñ– запитів на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¼Ð°ÑŽÑ‚ÑŒ бути об’єднані."
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¼Ð°Ñ” бути позначений Ñк готовий. Він вÑе ще позначений Ñк чернетка."
msgid "Merge blocked: new changes were just added."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: щойно додані нові зміни."
msgid "Merge blocked: pipeline must succeed. It's waiting for a manual job to continue."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: конвеєр має бути уÑпішним. Він чекає ручної роботи, щоб продовжити."
msgid "Merge blocked: the source branch must be rebased onto the target branch."
msgstr ""
@@ -24418,10 +24836,16 @@ msgstr "ЗалежноÑÑ‚Ñ– запиту на злиттÑ"
msgid "Merge request events"
msgstr "Події запиту на злиттÑ"
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
+msgstr "Звіти по запиту на злиттÑ"
+
+msgid "Merge request unlocked."
msgstr ""
msgid "Merge request was scheduled to merge after pipeline succeeds"
@@ -24563,7 +24987,7 @@ msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{li
msgstr "розпочато Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ %{linkStart}%{commitDisplay}%{linkEnd}"
msgid "MergeRequest|Approved by @%{username}"
-msgstr ""
+msgstr "Затверджено @%{username}"
msgid "MergeRequest|Can't show this merge request because of an internal error. Contact your administrator."
msgstr "Ðе вдаєтьÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‡ÐµÑ€ÐµÐ· внутрішню помилку. ЗвернітьÑÑ Ð´Ð¾ Ñвого адмініÑтратора."
@@ -24589,7 +25013,7 @@ msgstr "Помилка при заванаженні повного порівн
msgid "MergeRequest|No files found"
msgstr "Файлів не знайдено"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24616,6 +25040,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr "БезпоÑереднє Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ рекомендуєтьÑÑ Ñ‚Ð°Ðº Ñк може негативно вплинути на Ñ–Ñнуючий ланцюжок змін. Прочитайте %{docsLinkStart}документацію%{docsLinkEnd} Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr "ПовідомленнÑ"
@@ -24644,7 +25071,7 @@ msgid "MetricChart|Selected"
msgstr "Вибрано"
msgid "MetricChart|There is no data available. Please change your selection."
-msgstr ""
+msgstr "Даних немає. Будь лаÑка, змініть Ñвій вибір."
msgid "MetricChart|There is too much data to calculate. Please change your selection."
msgstr ""
@@ -24791,7 +25218,7 @@ msgid "Metrics|Create your dashboard configuration file"
msgstr "Створити файл конфігурації панелі керуваннÑ"
msgid "Metrics|Current"
-msgstr ""
+msgstr "Поточні"
msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
msgstr ""
@@ -24968,9 +25395,6 @@ msgstr "ЗначеннÑ"
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "Ðазва оÑÑ– Y"
@@ -25030,7 +25454,7 @@ msgid "MilestoneCombobox|An error occurred while searching for milestones"
msgstr ""
msgid "MilestoneCombobox|Group milestones"
-msgstr ""
+msgstr "Групові етапи"
msgid "MilestoneCombobox|Milestone"
msgstr "Етап"
@@ -25039,7 +25463,7 @@ msgid "MilestoneCombobox|No matching results"
msgstr ""
msgid "MilestoneCombobox|No milestone"
-msgstr ""
+msgstr "Ðемає етапу"
msgid "MilestoneCombobox|Project milestones"
msgstr ""
@@ -25093,7 +25517,7 @@ msgid "MilestoneSidebar|Open:"
msgstr "Відкрити:"
msgid "MilestoneSidebar|Reference:"
-msgstr ""
+msgstr "ПоÑиланнÑ:"
msgid "MilestoneSidebar|Start date"
msgstr "Дата початку"
@@ -25123,7 +25547,7 @@ msgid "Milestones|Completed Issues (closed)"
msgstr "Виконані задачі (закриті)"
msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
-msgstr ""
+msgstr "Створити етап, щоб краще відÑтежувати ваші задачі та запитів на злиттÑ. %{learn_more_link}"
msgid "Milestones|Delete milestone"
msgstr "Видалити етап"
@@ -25168,7 +25592,7 @@ msgid "Milestones|There are no closed milestones"
msgstr ""
msgid "Milestones|There are no open milestones"
-msgstr ""
+msgstr "Ðемає відкритих етапів"
msgid "Milestones|This action cannot be reversed."
msgstr "Цю дію не можна ÑкаÑувати."
@@ -25180,7 +25604,7 @@ msgid "Milestones|Use milestones to track issues and merge requests over a fixed
msgstr ""
msgid "Min Value"
-msgstr ""
+msgstr "Мінімальне значеннÑ"
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr "Мінімальна доÑтупна пропуÑкна здатніÑÑ‚ÑŒ необхідна Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку попередньої Ñинхронізації дзеркал."
@@ -25297,7 +25721,7 @@ msgid "Months"
msgstr "МіÑÑці"
msgid "More Details"
-msgstr ""
+msgstr "Детальніше"
msgid "More Information"
msgstr "Більше інформації"
@@ -25410,6 +25834,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr "ДÑкуємо за Ваш відгук!"
+
msgid "Multi-project"
msgstr "Багатопроєкт"
@@ -25422,9 +25861,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr "Знайдено декілька типів моделей: %{model_types}"
@@ -25446,6 +25882,9 @@ msgstr "ÐœÐ¾Ñ Ñ‚ÐµÐ¼Ð°"
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr "ÐОВИЙ"
+
msgid "Name"
msgstr "Ім’Ñ"
@@ -25470,9 +25909,6 @@ msgstr "ПроÑÑ‚Ñ–Ñ€ імен"
msgid "Namespace ID:"
msgstr "ID проÑтору імен:"
-msgid "Namespace is empty"
-msgstr "ПроÑÑ‚Ñ–Ñ€ імен порожній"
-
msgid "Namespace:"
msgstr "ПроÑÑ‚Ñ–Ñ€ імен:"
@@ -25561,24 +25997,24 @@ msgstr "Панель навігації"
msgid "NavigationTheme|Blue"
msgstr "Синій"
-msgid "NavigationTheme|Dark"
-msgstr "Темний"
-
msgid "NavigationTheme|Dark Mode (alpha)"
msgstr "Темний режим (альфа-верÑÑ–Ñ)"
+msgid "NavigationTheme|Gray"
+msgstr "Сірий"
+
msgid "NavigationTheme|Green"
msgstr "Зелений"
msgid "NavigationTheme|Indigo"
msgstr "Індиго"
-msgid "NavigationTheme|Light"
-msgstr "Світлий"
-
msgid "NavigationTheme|Light Blue"
msgstr "Світло-Cиній"
+msgid "NavigationTheme|Light Gray"
+msgstr "Світло-Ñірий"
+
msgid "NavigationTheme|Light Green"
msgstr "Світло-Зелений"
@@ -25610,7 +26046,7 @@ msgid "Need your attention"
msgstr ""
msgid "Needs"
-msgstr ""
+msgstr "Потреби"
msgid "Needs attention"
msgstr "Потребує уваги"
@@ -25698,7 +26134,7 @@ msgid "New User"
msgstr "Ðовий КориÑтувач"
msgid "New application"
-msgstr ""
+msgstr "Ðовий заÑтоÑунок"
msgid "New branch"
msgstr "Ðова гілка"
@@ -25733,18 +26169,15 @@ msgstr "Ðовий епік"
msgid "New epic title"
msgstr "Заголовок нового епіка"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "Ðовий файл"
msgid "New group"
msgstr "Ðова група"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr "Ðова назва групи"
-
msgid "New health check access token has been generated!"
msgstr "Згенеровано новий токен Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ працездатноÑÑ‚Ñ–!"
@@ -25755,7 +26188,7 @@ msgid "New issue"
msgstr "Ðова задача"
msgid "New issue in %{project}"
-msgstr ""
+msgstr "Ðова задача у %{project}"
msgid "New issue title"
msgstr "Ðазва нової задачі"
@@ -25797,7 +26230,7 @@ msgid "New project/repository"
msgstr "Ðовий проєкт/репозиторій"
msgid "New public deploy key"
-msgstr ""
+msgstr "Ðовий публічний ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
msgid "New related %{issueType}"
msgstr ""
@@ -25838,9 +26271,6 @@ msgstr "Ðові кориÑтувачі Ñ” \"зовнішні по замовчÐ
msgid "New! Suggest changes directly"
msgstr "Ðовинка! Пропонуйте зміни безпоÑередньо"
-msgid "New..."
-msgstr "Ðовий..."
-
msgid "Newest first"
msgstr "Спочатку нові"
@@ -25895,6 +26325,9 @@ msgstr "Етап відÑутній"
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr "Ðе знайдено активного адмініÑтратора"
@@ -25925,6 +26358,9 @@ msgstr "Ðемає доÑтупних гілок"
msgid "No branches found"
msgstr "Гілок не знайдено"
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr "Ðемає змін"
@@ -25949,9 +26385,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Ðеможливо з'єднатиÑÑŒ із Ñервером Gitaly, будь лаÑка, перевірте логи!"
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr "Ðемає внеÑків"
@@ -26042,6 +26475,9 @@ msgstr "Ðемає ліцензії. Ð’ÑÑ– права захищені"
msgid "No matches found"
msgstr "Збігів не знайдено"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -26087,9 +26523,6 @@ msgstr "Ðемає батьківÑької групи"
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr "Ðемає доÑтупних pod'ів"
-
msgid "No policy matches this license"
msgstr ""
@@ -26126,6 +26559,9 @@ msgstr ""
msgid "No repository"
msgstr "Ðемає репозиторію"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -26151,7 +26587,7 @@ msgid "No start date"
msgstr "Ðемає дати початку"
msgid "No suggestions found"
-msgstr ""
+msgstr "Пропозицій не знайдено"
msgid "No tag selected"
msgstr ""
@@ -26293,7 +26729,7 @@ msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEn
msgstr ""
msgid "Notes"
-msgstr ""
+msgstr "Ðотатки"
msgid "Notes rate limit"
msgstr ""
@@ -26307,9 +26743,15 @@ msgstr "Ви впевнені, що хочете ÑкаÑувати цей коÐ
msgid "Notes|Collapse replies"
msgstr "Згорнути відповіді"
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26329,7 +26771,7 @@ msgid "Notes|This internal note will always remain confidential"
msgstr ""
msgid "Notes|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
-msgstr ""
+msgstr "Ви бачите лише %{boldStart}іншу активніÑÑ‚ÑŒ%{boldEnd} в каналі. Ð”Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ, виберіть одну з наÑтупних опцій."
msgid "Nothing to preview."
msgstr "Дані Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду відÑутні."
@@ -26461,13 +26903,37 @@ msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾"
msgid "Notifications on"
msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¾"
+msgid "Notifications turned off."
+msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾."
+
+msgid "Notifications turned on."
+msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¾."
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr "%{commit_link} в %{mr_link}"
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
+msgstr "Ðвтор: %{author_name}"
+
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ CI/CD"
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
msgstr ""
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
@@ -26476,6 +26942,9 @@ msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Auto DevOps"
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26488,18 +26957,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
+msgstr "Ви не маєте доÑтупу до цього проєкту"
+
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
msgstr ""
+msgid "Notify|currently supported languages"
+msgstr "Ðаразі підтримуютьÑÑ Ð¼Ð¾Ð²Ð¸"
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr "УÑпішно завершено %{jobs} у %{stages}."
+
msgid "Nov"
msgstr "лиÑÑ‚."
@@ -26534,7 +27027,7 @@ msgid "Number of commits per MR"
msgstr "КількіÑÑ‚ÑŒ комітів на запит на злиттÑ"
msgid "Number of employees"
-msgstr ""
+msgstr "КількіÑÑ‚ÑŒ працівників"
msgid "Number of events"
msgstr "КількіÑÑ‚ÑŒ подій"
@@ -26570,7 +27063,7 @@ msgid "Off"
msgstr "Вимк."
msgid "Offline"
-msgstr ""
+msgstr "Офлайн"
msgid "Oh no!"
msgstr "О ні!"
@@ -26615,7 +27108,7 @@ msgid "OnCallSchedules|Add a rotation"
msgstr ""
msgid "OnCallSchedules|Add a schedule"
-msgstr ""
+msgstr "Додати розклад"
msgid "OnCallSchedules|Add an additional schedule to your project"
msgstr ""
@@ -26975,6 +27468,9 @@ msgstr[1] "Ще %d елементи"
msgstr[2] "Ще %d елементів"
msgstr[3] "Ще %d елементів"
+msgid "One or more arguments are invalid: %{args}."
+msgstr "Один або кілька аргументів недійÑні: %{args}."
+
msgid "One or more contacts were successfully added."
msgstr "Один або більше контактів були уÑпішно додані."
@@ -26997,9 +27493,9 @@ msgid "One or more of your personal access tokens has expired."
msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
-msgstr ""
+msgstr "Термін дії одного або декількох ваших токенів оÑобиÑтого доÑтупу закінчитьÑÑ Ñ‡ÐµÑ€ÐµÐ· %{days_to_expire} днів або раніше:"
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -27008,23 +27504,23 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr "Тільки учаÑники проєкту"
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
-msgstr "Тільки адмініÑтратори можуть видалÑти проєкт"
+msgid "Only active projects show up in the search and on the dashboard."
+msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr ""
@@ -27032,12 +27528,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr "Політика включеннÑ:"
@@ -27054,19 +27553,19 @@ msgid "Only reCAPTCHA v2 is supported:"
msgstr ""
msgid "Only required if not using role instance credentials."
-msgstr ""
+msgstr "Ðеобхідний лише Ñкщо не викориÑтовуютьÑÑ Ñ€Ð¾Ð»ÑŒÐ¾Ð²Ñ– параметри доÑтупу до інÑтанÑу."
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
-msgstr ""
+msgstr "Лише ролі \"Репортер\" та вище на рівнÑÑ… Premium та вище можуть переглÑдати аналітику продуктивноÑÑ‚Ñ–."
msgid "Oops, are you sure?"
msgstr "Ой, а ви впевнені?"
@@ -27081,7 +27580,7 @@ msgid "Open errors"
msgstr "Відкрити помилки"
msgid "Open in Gitpod"
-msgstr ""
+msgstr "Відкрити у Gitpod"
msgid "Open in Web IDE"
msgstr "Відкрити у Web IDE"
@@ -27093,7 +27592,7 @@ msgid "Open in your IDE"
msgstr "Відкрити у вашому IDE"
msgid "Open new window"
-msgstr ""
+msgstr "Відкрити нове вікно"
msgid "Open raw"
msgstr "Відкрити в неформатованому виглÑді"
@@ -27120,7 +27619,7 @@ msgid "Opened issues"
msgstr "Відкриті задачі"
msgid "OpenedNDaysAgo|Created"
-msgstr ""
+msgstr "Створено"
msgid "Opens in a new window"
msgstr "ВідкриваєтьÑÑ Ñƒ новому вікні"
@@ -27158,6 +27657,9 @@ msgstr "Панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñми"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "Панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñми міÑтить інформацію про Ñтан кожного з проєктів разом зі Ñтаном його конвеєрів та попереджень."
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Оптимізувати ваш робочий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð° допомогою CI/CD конвеєрів"
@@ -27176,6 +27678,9 @@ msgstr "Параметри"
msgid "Or you can choose one of the suggested colors below"
msgstr "Ðбо ви можете вибрати один із запропонованих нижче кольорів"
+msgid "Ordered list"
+msgstr "УпорÑдкований ÑпиÑок"
+
msgid "Organizations"
msgstr "ОрганізаціÑ"
@@ -27213,13 +27718,13 @@ msgid "Out-of-compliance with this project's policies and should be removed"
msgstr ""
msgid "OutboundRequests|Allow requests to the local network from hooks and services."
-msgstr ""
+msgstr "Дозволити запити до локальної мережі із хуків та ÑервіÑів."
msgid "OutboundRequests|Allow requests to the local network from system hooks"
msgstr ""
msgid "OutboundRequests|Allow requests to the local network from web hooks and services"
-msgstr ""
+msgstr "Дозволити запити до локальної мережі із веб-хуків та ÑервіÑів"
msgid "OutboundRequests|Enforce DNS rebinding attack protection"
msgstr ""
@@ -27266,6 +27771,9 @@ msgstr "ВлаÑник:"
msgid "Owner"
msgstr "ВлаÑник"
+msgid "Owners and administrators"
+msgstr "ВлаÑники та адмініÑтратори"
+
msgid "Owners can modify this selection."
msgstr ""
@@ -27350,12 +27858,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -27374,7 +27876,10 @@ msgstr "Додати джерело NuGet"
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr "Додаткові метадані"
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27468,7 +27973,7 @@ msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
msgid "PackageRegistry|Debian"
-msgstr ""
+msgstr "Debian"
msgid "PackageRegistry|Delete Package File"
msgstr ""
@@ -27480,6 +27985,9 @@ msgid "PackageRegistry|Delete package"
msgstr "Видалити пакет"
msgid "PackageRegistry|Delete this package"
+msgstr "Видалити цей пакет"
+
+msgid "PackageRegistry|Duplicate packages"
msgstr ""
msgid "PackageRegistry|Error publishing"
@@ -27519,7 +28027,7 @@ msgid "PackageRegistry|Gradle Kotlin DSL install command"
msgstr ""
msgid "PackageRegistry|Helm"
-msgstr ""
+msgstr "Helm"
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "Якщо ви ще не зробили цього, вам потрібно буде додати розміщене нижче в Ñвій файл %{codeStart}.pypirc%{codeEnd}."
@@ -27552,7 +28060,7 @@ msgid "PackageRegistry|Maven Command"
msgstr "Команда Maven"
msgid "PackageRegistry|Maven XML"
-msgstr ""
+msgstr "Maven XML"
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -27600,6 +28108,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr "Параметри реєÑтру"
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr "Видалити пакет"
@@ -27637,11 +28148,14 @@ msgid "PackageRegistry|Something went wrong while deleting the package file."
msgstr ""
msgid "PackageRegistry|Something went wrong while deleting the package."
-msgstr ""
+msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð°."
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27681,20 +28195,17 @@ 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 ""
+msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %{name}, Ñ– Ñ†Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ñ” незворотною. Ви впевнені?"
msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?"
msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ верÑÑ–ÑŽ %{version} з %{name}. Ви впевнені?"
msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
-msgstr ""
+msgstr "Можливо, вам також потрібно буде налаштувати автентифікацію за допомогою токена автентифікації. %{linkStart}ПереглÑньте документацію%{linkEnd}, щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ."
msgid "PackageRegistry|npm"
msgstr "npm"
@@ -27709,7 +28220,7 @@ msgid "Page not found"
msgstr "Сторінку не знайдено"
msgid "PagerDutySettings|Active"
-msgstr ""
+msgstr "Ðктивні"
msgid "PagerDutySettings|Create a GitLab incident for each PagerDuty incident by %{linkStart}configuring a webhook in PagerDuty%{linkEnd}"
msgstr ""
@@ -27736,7 +28247,7 @@ msgid "Pages Domain"
msgstr "Домен Pages"
msgid "Pagination|First"
-msgstr ""
+msgstr "Перша"
msgid "Pagination|Go to first page"
msgstr "Перейти до першої Ñторінки"
@@ -27751,7 +28262,7 @@ msgid "Pagination|Go to previous page"
msgstr "Перейти до попередньої Ñторінки"
msgid "Pagination|Last"
-msgstr ""
+msgstr "ОÑтаннÑ"
msgid "Pagination|Last »"
msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Â»"
@@ -27774,18 +28285,12 @@ msgstr "Параметр \"job_id\" не може перевищувати доÐ
msgid "Parent"
msgstr "Джерело"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr "БатьківÑький епік не Ñ–Ñнує."
msgid "Parent epic is not present."
msgstr "БатьківÑький епік відÑутній."
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27874,7 +28379,7 @@ msgid "Paste issue link"
msgstr "Ð’Ñтавити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° задачу"
msgid "Paste link"
-msgstr ""
+msgstr "Ð’Ñтавити поÑиланнÑ"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
@@ -27907,7 +28412,7 @@ msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
-msgstr ""
+msgstr "Призупинено"
msgid "Paused runners don't accept new jobs"
msgstr ""
@@ -28218,6 +28723,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr "🚀 запуÑÑ‚Ñ–Ñ‚ÑŒ Ñвій перший конвеєр"
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -28230,6 +28753,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28596,6 +29128,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr "ВикориÑтовувати шаблон"
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr "Перевірка конфігурації GitLab CI…"
@@ -28833,6 +29368,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "Відтворити"
@@ -29040,12 +29578,6 @@ msgstr "Будь лаÑка, почекайте поки ми з’єднуємÐ
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Будь лаÑка, почекайте поки ми імпортуємо ваш репозиторій. Оновлюйте Ñторінку за бажаннÑм."
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr "Pod не знайдено"
-
msgid "Pods in use"
msgstr "Pod’и у викориÑтанні"
@@ -29080,7 +29612,7 @@ msgid "Polling interval multiplier"
msgstr ""
msgid "Popularity"
-msgstr ""
+msgstr "ПопулÑрніÑÑ‚ÑŒ"
msgid "Port"
msgstr ""
@@ -29113,34 +29645,37 @@ msgid "Preferences|Choose what content you want to see on a project’s overview
msgstr "Вибрати вміÑÑ‚ оглÑдової Ñторінки проєкту."
msgid "Preferences|Choose what content you want to see on your homepage."
-msgstr ""
+msgstr "Виберіть, Ñкий вміÑÑ‚ ви хочете бачити на Ñвоїй домашній Ñторінці."
msgid "Preferences|Color for added lines"
-msgstr ""
+msgstr "Колір Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð½Ð¸Ñ… Ñ€Ñдків"
msgid "Preferences|Color for removed lines"
+msgstr "Колір Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ… Ñ€Ñдків"
+
+msgid "Preferences|Color theme"
msgstr ""
msgid "Preferences|Configure how dates and times display for you."
-msgstr ""
+msgstr "Ðалаштуйте Ñк Ð´Ð»Ñ Ð²Ð°Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ‚Ð¸Ð¼ÑƒÑ‚ÑŒÑÑ Ð´Ð°Ñ‚Ð¸ Ñ– чаÑ."
msgid "Preferences|Customize integrations with third party services."
msgstr "Ðалаштуйте інтеграцію зі Ñторонніми Ñлужбами."
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "Ðалаштувати зовнішній виглÑд заголовку заÑтоÑунку та навігаційної бічної панелі."
+msgid "Preferences|Customize the color of GitLab."
+msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
-msgstr ""
+msgstr "Ðалаштувати кольори вилучених Ñ– доданих Ñ€Ñдків у відмінноÑÑ‚ÑÑ…."
msgid "Preferences|Diff colors"
-msgstr ""
+msgstr "Колір різниці"
msgid "Preferences|Display time in 24-hour format"
msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу у 24-годинному форматі"
msgid "Preferences|Enable Gitpod integration"
-msgstr ""
+msgstr "Увімкнути інтеграцію з Gitpod"
msgid "Preferences|Enable integrated code intelligence on code views"
msgstr ""
@@ -29169,11 +29704,8 @@ msgstr "Ширина макета"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Повинно бути чиÑлом від %{min} до %{max}"
-msgid "Preferences|Navigation theme"
-msgstr "Тема навігації"
-
msgid "Preferences|Preview"
-msgstr ""
+msgstr "Попередній переглÑд"
msgid "Preferences|Project overview content"
msgstr "ВміÑÑ‚ оглÑдової Ñторінки проєкту"
@@ -29200,7 +29732,7 @@ msgid "Preferences|Tab width"
msgstr "Ширина табулÑції"
msgid "Preferences|This feature is experimental and translations are not yet complete."
-msgstr ""
+msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ñ” екÑпериментальною Ñ– переклади ще не завершені."
msgid "Preferences|This setting allows you to customize the appearance of the syntax."
msgstr "Цей параметр дозволÑÑ” налаштувати зовнішній виглÑд ÑинтакÑиÑу."
@@ -29223,9 +29755,6 @@ msgstr ""
msgid "Prev"
msgstr "Ðазад"
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -29256,6 +29785,9 @@ msgstr "Попередній переглÑд Markdown"
msgid "Preview changes"
msgstr "Попередній переглÑд змін"
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr "Попередній переглÑд кориÑного навантаженнÑ"
@@ -29421,9 +29953,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð¿Ð»Ð°Ð½Ð¾Ð²Ð°Ð½Ð¸Ð¹ Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ."
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "Ðктивуйте вхід за допомогою однієї з наÑтупних Ñлужб"
-
msgid "Profiles|Active"
msgstr "Ðктивний"
@@ -29436,7 +29965,7 @@ msgstr "Додати Ñмайлик-ÑтатуÑ"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29463,8 +29992,8 @@ msgstr "Зміна імені кориÑтувача може мати небаÐ
msgid "Profiles|Choose file..."
msgstr "Вибрати файл..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "Виберіть Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ внеÑків до приватних репозиторіїв у вашому публічному профілі без інформації про проєкти, репозиторії або організації"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr "Виберіть Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ внеÑків до приватних репозиторіїв у вашому публічному профілі без інформації про проєкти, репозиторії або організації."
msgid "Profiles|City, country"
msgstr "МіÑто, країна"
@@ -29478,6 +30007,9 @@ msgstr "ÐдреÑа електронної пошти Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²"
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr "Підключені облікові запиÑи"
@@ -29505,8 +30037,8 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr "Ðе відображати у профілі"
-msgid "Profiles|Don't display activity-related personal information on your profile"
-msgstr ""
+msgid "Profiles|Don't display activity-related personal information on your profile."
+msgstr "Ðе показувати у моєму профілі оÑобиÑту інформацію, пов’Ñзану з діÑльніÑÑ‚ÑŽ."
msgid "Profiles|Edit Profile"
msgstr "Редагувати профіль"
@@ -29514,16 +30046,16 @@ msgstr "Редагувати профіль"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "Введіть ваше ім'Ñ, щоб люди, Ñких ви знаєте, могли Ð²Ð°Ñ ÑƒÐ¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸"
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr "Введіть ваше ім'Ñ, щоб люди, Ñких ви знаєте, могли Ð²Ð°Ñ ÑƒÐ¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸."
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29556,8 +30088,8 @@ msgstr "Включити приватні внеÑки до мого профіÐ
msgid "Profiles|Incoming email token was successfully reset"
msgstr "Токен Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… повідомлень електронної пошти було уÑпішно перегенеровано"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "Підвищити рівень безпеки вашого облікового запиÑу за допомогою ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr "Підвищити рівень безпеки вашого облікового запиÑу за допомогою ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації (2FA)."
msgid "Profiles|Invalid password"
msgstr "Ðеправильний пароль"
@@ -29641,25 +30173,25 @@ msgid "Profiles|Remove avatar"
msgstr "Видалити аватар"
msgid "Profiles|Select a service to sign in with."
+msgstr "Виберіть Ñлужбу Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ."
+
+msgid "Profiles|Service sign-in"
msgstr ""
msgid "Profiles|Set new profile picture"
msgstr "Ð’Ñтановити нове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ"
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set your local time zone."
msgstr ""
-msgid "Profiles|Social sign-in"
-msgstr "Вхід через Ñоціальні мережі"
-
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "ДеÑкі параметри недоÑтупні Ð´Ð»Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів LDAP"
msgid "Profiles|Static object token was successfully reset"
msgstr "Токен Ñтатичних об’єктів було уÑпішно перегенеровано"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "Розкажіть про Ñебе в межах 250 Ñимволів"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr "Розкажіть про Ñебе в межах 250 Ñимволів."
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
@@ -29667,17 +30199,17 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "МакÑимальний розмір файлу 200КБ."
-msgid "Profiles|This email will be displayed on your public profile"
-msgstr "Ð¦Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð° адреÑа буде відображатиÑÑ Ñƒ вашому публічному профілі"
+msgid "Profiles|This email will be displayed on your public profile."
+msgstr "Ð¦Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð° адреÑа буде відображатиÑÑ Ñƒ вашому публічному профілі."
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "Ð¦Ñ Ð°Ð´Ñ€ÐµÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð½Ð¸Ñ… операцій, таких Ñк Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° злиттÑ. %{commit_email_link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr "Ð¦Ñ Ð°Ð´Ñ€ÐµÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð½Ð¸Ñ… операцій, таких Ñк Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° злиттÑ. %{commit_email_link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{commit_email_link_end}"
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Цей Ñмайлик та Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ показані у вашому профілі та в інтерфейÑÑ–."
-msgid "Profiles|This information will appear on your profile"
-msgstr "Ð¦Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ відображатиÑÑ Ñƒ вашому профілі"
+msgid "Profiles|This information will appear on your profile."
+msgstr "Ð¦Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ відображатиÑÑ Ñƒ вашому профілі."
msgid "Profiles|Time settings"
msgstr "Параметри чаÑу"
@@ -29685,7 +30217,7 @@ msgstr "Параметри чаÑу"
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr "Двофакторна автентифікаціÑ"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29721,8 +30253,8 @@ msgstr "ÐдреÑа Ñайту"
msgid "Profiles|What's your status?"
msgstr "Який ваш ÑтатуÑ?"
-msgid "Profiles|Who you represent or work for"
-msgstr "Кого ви предÑтавлÑєте або на кого працюєте"
+msgid "Profiles|Who you represent or work for."
+msgstr "Кого ви предÑтавлÑєте або на кого працюєте."
msgid "Profiles|You can change your avatar here"
msgstr "Тут ви можете змінити Ñвій аватар"
@@ -29763,6 +30295,9 @@ msgstr "Ваше міÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ автоматичнÐ
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "Ваше Ñ–Ð¼â€™Ñ Ð±ÑƒÐ»Ð¾ автоматично вÑтановлено на оÑнові вашого облікового запиÑу %{provider_label} щоб люди могли Ð²Ð°Ñ Ð²Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr "Ваше Ñ–Ð¼â€™Ñ Ð±ÑƒÐ»Ð¾ автоматично вÑтановлено на оÑнові вашого облікового запиÑу %{provider_label}, щоб люди могли Ð²Ð°Ñ Ð²Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸."
+
msgid "Profiles|Your status"
msgstr "Ваш ÑтатуÑ"
@@ -29841,8 +30376,8 @@ msgstr ""
msgid "Project URL"
msgstr "URL-адреÑа проєкту"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
-msgstr "ДоÑтуп до проєкту повинен надаватиÑÑ ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñƒ кориÑтувачеві. Якщо цей проєкт Ñ” чаÑтиною групи, доÑтуп буде надано учаÑникам групи."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -29964,6 +30499,9 @@ msgstr "Керівники"
msgid "ProjectCreationLevel|No one"
msgstr "Ðіхто"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Ім'Ñ"
@@ -30034,7 +30572,7 @@ msgid "ProjectQualitySummary|Measure of how much of your code is covered by test
msgstr ""
msgid "ProjectQualitySummary|See full report"
-msgstr ""
+msgstr "ПереглÑнути повний звіт"
msgid "ProjectQualitySummary|See project Code Coverage Statistics"
msgstr ""
@@ -30075,6 +30613,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr "Виберіть проєкт"
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr "Помилка при отриманні проєктів"
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -30093,9 +30634,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30555,6 +31093,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30693,6 +31234,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Спільні проєкти з %{group_name}"
@@ -30759,8 +31303,8 @@ msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²
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 "Створити порожній проєкт Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñвоїх файлів, Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ та Ñпівпраці над кодом."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
+msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
msgstr "Створити проєкт попередньо заповнений необхідними файлами Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð³Ð¾ Ñтарту."
@@ -30819,17 +31363,17 @@ msgstr "ЗапуÑтити CI/CD Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ репозитоÑ
msgid "ProjectsNew|Visibility Level"
msgstr "Рівень видимоÑÑ‚Ñ–"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "Хочете розміÑтити декілька залежних проєктів в одному проÑторі імен? %{link_start}Створити групу.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
msgid "PrometheusAlerts|exceeded"
msgstr ""
msgid "PrometheusAlerts|is equal to"
-msgstr ""
+msgstr "дорівнює"
msgid "PrometheusAlerts|is less than"
-msgstr ""
+msgstr "менше ніж"
msgid "PrometheusService|%{exporters} with %{metrics} were found"
msgstr "було знайдено %{exporters} з %{metrics}"
@@ -30978,6 +31522,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30990,6 +31537,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -31108,10 +31658,10 @@ msgid "Protect"
msgstr "ЗахиÑтити"
msgid "Protect a tag"
-msgstr ""
+msgstr "Захищений тег"
msgid "Protect variable"
-msgstr ""
+msgstr "ЗахиÑтити змінну"
msgid "Protected"
msgstr "Захищено"
@@ -31264,7 +31814,7 @@ msgid "ProtectedEnvironment|Select an environment"
msgstr "Виберіть Ñередовище"
msgid "ProtectedEnvironment|Select groups"
-msgstr ""
+msgstr "Виберіть групи"
msgid "ProtectedEnvironment|Select users"
msgstr "Виберіть кориÑтувачів"
@@ -31311,6 +31861,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr "Ðадати відгук"
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31552,10 +32105,10 @@ msgid "Rails"
msgstr ""
msgid "Rake Tasks Help"
-msgstr ""
+msgstr "Довідка по завданнÑÑ… Rake"
msgid "Random"
-msgstr ""
+msgstr "Випадкове"
msgid "Rate Limits"
msgstr ""
@@ -31615,7 +32168,7 @@ msgid "Ready to merge by members who can write to the target branch."
msgstr ""
msgid "Ready to merge!"
-msgstr ""
+msgstr "Готовий до злиттÑ!"
msgid "Reauthenticating with SAML provider."
msgstr ""
@@ -31623,6 +32176,9 @@ msgstr ""
msgid "Rebase"
msgstr "Rebase"
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr "ВідбуваєтьÑÑ rebase"
@@ -31702,7 +32258,7 @@ msgid "Reduce this project’s visibility?"
msgstr "Знизити видиміÑÑ‚ÑŒ проєкту?"
msgid "Reference"
-msgstr ""
+msgstr "ПоÑиланнÑ"
msgid "References"
msgstr "ПоÑиланнÑ"
@@ -31710,9 +32266,6 @@ 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 "Оновити"
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31847,13 +32400,13 @@ msgid "Rejected (closed)"
msgstr "Відхилено (закрито)"
msgid "Relate to %{issuable_type} %{add_related_issue_link}"
-msgstr ""
+msgstr "ВідноÑитьÑÑ Ð´Ð¾ %{issuable_type} %{add_related_issue_link}"
msgid "Related feature flags"
msgstr ""
msgid "Related incidents or issues"
-msgstr ""
+msgstr "Пов'Ñзані інциденти або задачі"
msgid "Related issues"
msgstr "ПовʼÑзані задачі"
@@ -31877,6 +32430,9 @@ msgstr "РеÑурÑи релізу"
msgid "Release assets documentation"
msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿Ð¾ реÑурÑам релізу"
+msgid "Release date"
+msgstr "Дата релізу"
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31989,7 +32545,7 @@ msgid "Remove all or specific label(s)"
msgstr "Видалити уÑÑ– або певні мітки(-ку)"
msgid "Remove all or specific reviewer(s)"
-msgstr ""
+msgstr "Видалити уÑÑ–Ñ… або певного(них) оглÑдача(ів)"
msgid "Remove approvers"
msgstr "Видалити затверджуючих оÑіб"
@@ -32091,7 +32647,7 @@ msgid "Remove report"
msgstr ""
msgid "Remove reviewer"
-msgstr ""
+msgstr "Видалити оглÑдача"
msgid "Remove runner"
msgstr ""
@@ -32142,7 +32698,7 @@ msgid "Removed %{milestone_reference} milestone."
msgstr "Видалено етап %{milestone_reference}."
msgid "Removed %{reviewer_text} %{reviewer_references}."
-msgstr ""
+msgstr "Видалено %{reviewer_text} %{reviewer_references}."
msgid "Removed all labels."
msgstr "Видалено вÑÑ– мітки."
@@ -32196,7 +32752,7 @@ msgid "Removes %{milestone_reference} milestone."
msgstr "ВидалÑÑ” етап %{milestone_reference}."
msgid "Removes %{reviewer_text} %{reviewer_references}."
-msgstr ""
+msgstr "ВидалÑÑ” %{reviewer_text} %{reviewer_references}."
msgid "Removes all labels."
msgstr "ВидалÑÑ” вÑÑ– мітки."
@@ -32270,9 +32826,6 @@ msgstr "Повторно відкриває %{quick_action_target}."
msgid "Replace"
msgstr "Замінити"
-msgid "Replace %{blob_name}"
-msgstr "Замінити %{blob_name}"
-
msgid "Replace %{name}"
msgstr "Замінити %{name}"
@@ -32300,6 +32853,9 @@ msgstr "Замінює кореневу URL-адреÑу Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr "ВідповіÑти по електнонній пошті"
@@ -32316,7 +32872,7 @@ msgid "Reply…"
msgstr ""
msgid "Report abuse"
-msgstr ""
+msgstr "Повідомити про порушеннÑ"
msgid "Report abuse to admin"
msgstr "Повідомити адмініÑтратора про порушеннÑ"
@@ -32396,6 +32952,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr "Ðазва клаÑу"
+msgid "Reports|Copy failed test names to run locally"
+msgstr "Копіюйте назви невдалих теÑтів Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ запуÑку"
+
+msgid "Reports|Copy failed tests"
+msgstr "Копіювати невдалі теÑти"
+
msgid "Reports|Execution time"
msgstr "Ð§Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
@@ -32450,7 +33012,7 @@ msgid "Reports|Metrics reports failed to load results"
msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
-msgstr ""
+msgstr "Звіти про метрики: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgid "Reports|New"
msgstr ""
@@ -32751,9 +33313,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32792,17 +33351,17 @@ msgstr "Вимоги можуть базуватиÑÑ Ð½Ð° кориÑтувач
msgid "Requires %d approval from eligible users."
msgid_plural "Requires %d approvals from eligible users."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Ðеобхідно ще %d Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ відповідних кориÑтувачів."
+msgstr[1] "Ðеобхідно ще %d затверджень від відповідних кориÑтувачів."
+msgstr[2] "Ðеобхідно ще %d затверджень від відповідних кориÑтувачів."
+msgstr[3] "Ðеобхідно ще %d затверджень від відповідних кориÑтувачів."
msgid "Requires %{count} approval from %{names}."
msgid_plural "Requires %{count} approvals from %{names}."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Ðеобхідно ще %{count} Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %{names}."
+msgstr[1] "Ðеобхідно ще %{count} затверджень від %{names}."
+msgstr[2] "Ðеобхідно ще %{count} затверджень від %{names}."
+msgstr[3] "Ðеобхідно ще %{count} затверджень від %{names}."
msgid "Requires values to meet regular expression requirements."
msgstr ""
@@ -32834,6 +33393,9 @@ msgstr ""
msgid "Reset"
msgstr "Скинути"
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32843,9 +33405,6 @@ msgstr "Скинути фільтри"
msgid "Reset health check access token"
msgstr "Оновити токен доÑтупу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ працездатноÑÑ‚Ñ–"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32913,7 +33472,7 @@ msgid "Response metrics (NGINX)"
msgstr "Метрики відповідей (NGINX)"
msgid "Response text"
-msgstr ""
+msgstr "ТекÑÑ‚ відповіді"
msgid "Restart GitLab to apply changes."
msgstr ""
@@ -32939,6 +33498,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ запобіжить його видаленню в зазначений Ñ‡Ð°Ñ Ñ– поверне людÑм можливіÑÑ‚ÑŒ вноÑити до нього зміни."
+msgid "Restrict access by IP address"
+msgstr "Обмежити доÑтуп за IP адреÑою"
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32972,12 +33534,6 @@ msgstr "Повторити завданнÑ"
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr "Повторити це завданнÑ"
@@ -33007,7 +33563,7 @@ msgid "Review"
msgstr "Перевірка"
msgid "Review App|View app"
-msgstr ""
+msgstr "ПереглÑнути заÑтоÑунок"
msgid "Review App|View latest app"
msgstr ""
@@ -33038,16 +33594,16 @@ msgstr ""
msgid "Reviewer"
msgid_plural "%d Reviewers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "оглÑдач"
+msgstr[1] "%d оглÑдача"
+msgstr[2] "%d оглÑдачів"
+msgstr[3] "%d оглÑдачів"
msgid "Reviewer(s)"
-msgstr ""
+msgstr "оглÑдач(Ñ–)"
msgid "Reviewers"
-msgstr ""
+msgstr "ОглÑдачі"
msgid "Reviewing"
msgstr "Перевірка"
@@ -33178,7 +33734,7 @@ msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spa
msgstr ""
msgid "Runners|A new version is available"
-msgstr ""
+msgstr "ДоÑтупна нова верÑÑ–Ñ"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
msgstr ""
@@ -33284,7 +33840,7 @@ msgid "Runners|Download latest binary"
msgstr ""
msgid "Runners|Edit your search and try again"
-msgstr ""
+msgstr "Відредагуйте ваш пошук Ñ– Ñпробуйте знову"
msgid "Runners|Enable stale runner cleanup"
msgstr ""
@@ -33299,11 +33855,14 @@ msgid "Runners|Executor"
msgstr ""
msgid "Runners|Get started with runners"
-msgstr ""
+msgstr "Розпочати роботу з runner'ами"
msgid "Runners|Group"
msgstr "Група"
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr "IP-адреÑа"
@@ -33350,7 +33909,7 @@ msgid "Runners|New registration token generated!"
msgstr ""
msgid "Runners|No results found"
-msgstr ""
+msgstr "Ðе знайдено результатів"
msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
@@ -33371,7 +33930,7 @@ msgid "Runners|Offline:"
msgstr "Офлайн:"
msgid "Runners|Online"
-msgstr ""
+msgstr "Онлайн"
msgid "Runners|Online runners"
msgstr ""
@@ -33383,7 +33942,7 @@ msgid "Runners|Pause from accepting jobs"
msgstr ""
msgid "Runners|Paused"
-msgstr ""
+msgstr "Призупинено"
msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
@@ -33431,9 +33990,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr "ВерÑÑ–Ñ"
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33576,6 +34132,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33640,10 +34205,10 @@ msgid "Runners|stale"
msgstr ""
msgid "Runners|upgrade available"
-msgstr ""
+msgstr "доÑтупне оновленнÑ"
msgid "Runners|upgrade recommended"
-msgstr ""
+msgstr "РекомендуєтьÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸"
msgid "Running"
msgstr "ВиконуєтьÑÑ"
@@ -33666,6 +34231,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr "SAML Ð´Ð»Ñ %{group_name}"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr "Група \"%{group_path}\" дозволÑÑ” увійти за допомогою облікового запиÑу єдиного входу."
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -34340,6 +34920,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -34353,9 +34936,9 @@ msgid "SecurityOrchestration|Add rule"
msgstr "Додати правило"
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
-msgstr ""
+msgstr "ПіÑÐ»Ñ Ð²Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ, Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð½Ñ–ÐºÐ¾Ð»Ð¸ не буде відображатиÑÑŒ знову."
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -34400,9 +34983,12 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Direct"
msgstr ""
+msgid "SecurityOrchestration|Don't show the alert anymore"
+msgstr "Більше не показувати попередженнÑ"
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
@@ -34424,9 +35010,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34523,9 +35115,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34569,7 +35158,7 @@ msgid "SecurityOrchestration|Sorry, your filter produced no results."
msgstr ""
msgid "SecurityOrchestration|Source"
-msgstr ""
+msgstr "Джерело"
msgid "SecurityOrchestration|Status"
msgstr "СтатуÑ"
@@ -34625,6 +35214,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34649,18 +35241,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34670,12 +35250,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34715,6 +35289,9 @@ msgstr "Змінити ÑтатуÑ"
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Коментар додано до \"%{vulnerabilityName}\""
@@ -34863,7 +35440,7 @@ msgid "SecurityReports|Security reports help page link"
msgstr ""
msgid "SecurityReports|Security scans have run"
-msgstr ""
+msgstr "Перевірка безпеки виконана"
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
@@ -34940,9 +35517,6 @@ msgstr "ІнÑтрумент"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr "Відмінити відхиленнÑ"
@@ -35019,8 +35593,14 @@ msgid "Select Profile"
msgstr ""
msgid "Select a branch"
+msgstr "Вибрати гілку"
+
+msgid "Select a branch to compare"
msgstr ""
+msgid "Select a color"
+msgstr "Виберіть колір"
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -35121,13 +35701,13 @@ msgid "Select project to create %{type}"
msgstr ""
msgid "Select project to create issue"
-msgstr ""
+msgstr "Виберіть проєкт Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ–"
msgid "Select projects"
msgstr "Вибрати проєкти"
msgid "Select reviewer(s)"
-msgstr ""
+msgstr "Вибрати оглÑдача(ів)"
msgid "Select source"
msgstr "Виберіть джерело"
@@ -35135,6 +35715,9 @@ msgstr "Виберіть джерело"
msgid "Select source branch"
msgstr "Виберіть гілку-джерело"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr "Виберіть дату початку"
@@ -35156,14 +35739,17 @@ msgstr "Вибір цільової гілки"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr "Обрати чаÑовий поÑÑ"
msgid "Select type"
-msgstr ""
+msgstr "Виберіть тип"
msgid "Selected"
-msgstr ""
+msgstr "Вибрано"
msgid "Selected commits"
msgstr "Вибрані коміти"
@@ -35226,7 +35812,7 @@ msgid "SelfMonitoring|Self monitoring project successfully deleted."
msgstr ""
msgid "Send"
-msgstr ""
+msgstr "ÐадіÑлати"
msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
@@ -35387,9 +35973,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "Ð’Ñтановіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм Ñ– обмежте рівні видимоÑÑ‚Ñ–. Ðалаштуйте джерела імпорту Ñ– протокол доÑтупу git."
-
msgid "Set due date"
msgstr "Ð’Ñтановити дату завершеннÑ"
@@ -35444,6 +36027,9 @@ msgstr "Ð’Ñтановити цільову гілку"
msgid "Set target branch to %{branch_name}."
msgstr "Ð’Ñтановити цільову гілку %{branch_name}."
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35507,6 +36093,9 @@ msgstr "Ð’Ñтановити новий пароль"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Ðалаштуйте Ñвій проєкт, щоб автоматично відправлÑти/отримувати зміни з іншого репозиторію. Гілки, теги та коміти автоматично будуть ÑинхронізуватиÑÑ."
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr "Ð’Ñтановити вагу"
@@ -35740,7 +36329,7 @@ msgid "Show group milestones"
msgstr ""
msgid "Show labels"
-msgstr ""
+msgstr "Показати мітки"
msgid "Show latest version"
msgstr "Показати оÑтанню верÑÑ–ÑŽ"
@@ -35772,9 +36361,66 @@ msgstr ""
msgid "Show whitespace changes"
msgstr "Показати зміни пробілів"
-msgid "Showing %{conflict}"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
msgstr ""
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
+msgid "Showing %{conflict}"
+msgstr "Показано %{conflict}"
+
msgid "Showing %{count} of %{total} projects"
msgstr ""
@@ -35797,9 +36443,6 @@ msgstr "Показати вÑÑ– епіки"
msgid "Showing all issues"
msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÑƒÑÑ–Ñ… задач"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35815,6 +36458,9 @@ msgstr "Показано оÑтанню верÑÑ–ÑŽ"
msgid "Showing version #%{versionNumber}"
msgstr "Показана верÑÑ–Ñ #%{versionNumber}"
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr "Поруч"
@@ -35972,7 +36618,7 @@ msgid "Size"
msgstr "Розмір"
msgid "Size Limits"
-msgstr ""
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ"
msgid "Size limit per repository (MB)"
msgstr "МакÑимальний розмір Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ репозиторію (МБ)"
@@ -35987,7 +36633,7 @@ msgid "Skipped deployment to"
msgstr ""
msgid "Skype:"
-msgstr ""
+msgstr "Скайп:"
msgid "Slack application"
msgstr "заÑтоÑунок Slack"
@@ -36136,6 +36782,9 @@ msgstr ""
msgid "Snowplow"
msgstr "Snowplow"
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr "РішеннÑ"
@@ -36170,7 +36819,7 @@ msgid "Someone, hopefully you, has requested to reset the password for your GitL
msgstr ""
msgid "Something went wrong"
-msgstr ""
+msgstr "ЩоÑÑŒ пішло не так"
msgid "Something went wrong on our end"
msgstr "ЩоÑÑŒ пішло не так з нашого боку"
@@ -36254,7 +36903,7 @@ msgid "Something went wrong while fetching projects"
msgstr "Помилка при отриманні проєктів"
msgid "Something went wrong while fetching projects."
-msgstr ""
+msgstr "Помилка при отриманні проєктів."
msgid "Something went wrong while fetching related merge requests."
msgstr "Помилка при отриманні пов’Ñзаних запитів на злиттÑ."
@@ -36331,9 +36980,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Проблема, не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ %{project} до панелі керуваннÑ"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ проєкти до панелі"
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36542,10 +37188,10 @@ msgid "Source branch"
msgstr "Гілка-джерело"
msgid "Source branch will be deleted."
-msgstr ""
+msgstr "Гілку-джерело буде видалено"
msgid "Source branch will not be deleted."
-msgstr ""
+msgstr "Гілку-джерело не буде видалено"
msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}"
msgstr ""
@@ -36602,7 +37248,7 @@ msgid "SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourceg
msgstr "Увімкнути аналізатор коду %{link_start}Sourcegraph%{link_end} у вікнах коду та запитах на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñƒ вашому інÑтанÑÑ– Gitlab."
msgid "SourcegraphAdmin|Learn more."
-msgstr ""
+msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ."
msgid "SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph."
msgstr ""
@@ -36632,7 +37278,7 @@ msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{li
msgstr ""
msgid "Spam Check"
-msgstr ""
+msgstr "Перевірка Ñпаму"
msgid "Spam Check API key"
msgstr ""
@@ -36661,7 +37307,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36680,7 +37326,7 @@ msgid "Stage"
msgstr "СтадіÑ"
msgid "Stage:"
-msgstr ""
+msgstr "СтадіÑ:"
msgid "Standard"
msgstr "Стандарт"
@@ -36911,7 +37557,7 @@ msgid "StatusCheck|Status to check"
msgstr ""
msgid "StatusCheck|Target branch"
-msgstr ""
+msgstr "Цільова гілка"
msgid "StatusCheck|Update status check"
msgstr ""
@@ -37006,6 +37652,9 @@ msgstr "Сховище:"
msgid "StorageSize|Unknown"
msgstr "Ðевідомо"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr "Зберігайте файли, плануйте Ñвою роботу, Ñпівпрацюйте над кодом тощо."
+
msgid "Strikethrough"
msgstr ""
@@ -37027,8 +37676,8 @@ msgstr "Етап підгрупи"
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr "Дозволено Ñтворювати підгрупи"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
msgstr "Дозволено Ñтворювати підгрупи"
@@ -37045,6 +37694,9 @@ msgstr "Підгрупи"
msgid "Subgroups and projects"
msgstr "Підгрупи та проєкти"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -37108,11 +37760,14 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr "ПідпиÑує на %{quick_action_target}."
+msgid "Subscript"
+msgstr "Ðижній індекÑ"
+
msgid "Subscription"
msgstr "ПідпиÑка"
msgid "Subscription History"
-msgstr ""
+msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок"
msgid "Subscription deletion failed."
msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки пройшло неуÑпішно."
@@ -37136,7 +37791,7 @@ msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionBanner|Upload new license"
-msgstr ""
+msgstr "Завантажити нову ліцензію"
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -37361,7 +38016,7 @@ msgid "SuggestedColors|Gray"
msgstr "Сірий"
msgid "SuggestedColors|Green"
-msgstr ""
+msgstr "Зелений"
msgid "SuggestedColors|Green screen"
msgstr ""
@@ -37379,10 +38034,10 @@ msgid "SuggestedColors|Medium sea green"
msgstr ""
msgid "SuggestedColors|Orange"
-msgstr ""
+msgstr "Помаранчевий"
msgid "SuggestedColors|Purple"
-msgstr ""
+msgstr "Фіолетовий"
msgid "SuggestedColors|Red"
msgstr "Червоний"
@@ -37414,7 +38069,10 @@ msgstr "Ðабір"
msgid "Summary"
msgstr "Звіт"
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37586,6 +38244,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr "Верхній індекÑ"
+
msgid "Support"
msgstr "Підтримка"
@@ -37598,6 +38259,21 @@ msgstr "URL-адреÑа Ñторінки підтримки"
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr "Перемкнути гілки"
@@ -37638,16 +38314,16 @@ msgid "Syntax is incorrect."
msgstr ""
msgid "SynthaxHighlightingTheme|Dark"
-msgstr ""
+msgstr "Темна"
msgid "SynthaxHighlightingTheme|Light"
-msgstr ""
+msgstr "Світла"
msgid "SynthaxHighlightingTheme|Monokai"
msgstr ""
msgid "SynthaxHighlightingTheme|None"
-msgstr ""
+msgstr "Ðемає"
msgid "SynthaxHighlightingTheme|Solarized Dark"
msgstr ""
@@ -37673,9 +38349,6 @@ msgstr "СиÑтемне Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑÐ
msgid "System header and footer"
msgstr "Заголовок Ñ– футер ÑиÑтеми"
-msgid "System hook was successfully updated."
-msgstr "СиÑтемний хук уÑпішно оновлено."
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37704,7 +38377,7 @@ msgid "Tag name"
msgstr "Ðазва тегу"
msgid "Tag name is required."
-msgstr ""
+msgstr "Ðеобхідно вказати назву тегу."
msgid "Tag push"
msgstr ""
@@ -37874,6 +38547,12 @@ msgstr "ЗавданнÑ"
msgid "Task ID: %{elastic_task}"
msgstr "Ідентифікатор завданнÑ: %{elastic_task}"
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -38128,7 +38807,7 @@ msgid "Test"
msgstr "ТеÑÑ‚"
msgid "Test Cases"
-msgstr ""
+msgstr "ТеÑтові Ñценарій"
msgid "Test case"
msgstr ""
@@ -38234,6 +38913,9 @@ msgstr "%{rate}%{sign} рівень проходженнÑ"
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr "Скопіюйте назву теÑту Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ запуÑку локально"
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -38310,10 +38992,7 @@ msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
-msgstr ""
-
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr "Група \"%{group_path}\" дозволÑÑ” увійти за допомогою облікового запиÑу єдиного входу"
+msgstr "ОÑÑŒ Ñ– вÑе, молодець!"
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -38425,7 +39104,7 @@ msgid "The current epic"
msgstr ""
msgid "The current incident"
-msgstr ""
+msgstr "Поточний інцидент"
msgid "The current issue"
msgstr "Поточна задача"
@@ -38439,6 +39118,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "Джерело даних підключено, але даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ”. %{documentationLink}"
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38463,7 +39145,7 @@ msgstr "Введений вами домен Ñ” недопуÑтимим."
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38621,6 +39303,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "МакÑимальний розмір файлу — %{size}."
@@ -38631,7 +39316,7 @@ msgid "The maximum file size in megabytes for individual job artifacts."
msgstr ""
msgid "The maximum file size is %{size}."
-msgstr ""
+msgstr "МакÑимальний розмір файлу це %{size}."
msgid "The maximum number of CI/CD minutes on shared runners that a group can use each month. 0 for unlimited."
msgstr ""
@@ -38663,9 +39348,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38696,21 +39378,12 @@ msgstr "Розклад конвеєрів запуÑкає Ñ—Ñ… в майбутÐ
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr "ДоÑтуп до цього проєкту Ñ” в будь-Ñкого кориÑтувача, Ñкий увійшов у ÑиÑтему."
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr "ДоÑтуп до проєкту Ñ” в будь-кого, незалежно від автентифікації."
-
msgid "The project can be accessed without any authentication."
msgstr "ДоÑтуп до проєкту можливий без будь-Ñкої перевірки автентичноÑÑ‚Ñ–."
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr "Цей проєкт доÑтупний тільки Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ учаÑників. ДоÑтуп може бути надано тільки безпоÑередньо кожному кориÑтувачу."
-
msgid "The project is still being deleted. Please try again later."
msgstr "Проєкт вÑе ще видалÑєтьÑÑ. Будь лаÑка, Ñпробуйте знову."
@@ -38924,6 +39597,9 @@ msgstr "Ðаразі пакети відÑутні"
msgid "There are no projects shared with this group yet"
msgstr "Ще немає Ñпільних проєктів з цією групою"
+msgid "There are no secure files yet."
+msgstr "Ðемає захищених файлів."
+
msgid "There are no topics to show."
msgstr ""
@@ -38952,7 +39628,7 @@ msgid "There is no chart data available."
msgstr ""
msgid "There is no data available."
-msgstr ""
+msgstr "Ðемає даних"
msgid "There is no data available. Please change your selection."
msgstr "Даних немає. Будь лаÑка, змініть Ñвій вибір."
@@ -38969,6 +39645,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "Проблема Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ вашого приÑтрою."
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39393,7 +40075,7 @@ msgid "This feature requires local storage to be enabled"
msgstr "Ð¦Ñ Ñ„ÑƒÐ½Ñ†Ñ–Ð¾Ð½Ð°Ð»ÑŒÐ½Ñ–ÑÑ‚ÑŒ вимагає ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñховища"
msgid "This field is required"
-msgstr ""
+msgstr "Це поле Ñ” обов'Ñзковим Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ"
msgid "This field is required."
msgstr "Це поле Ñ” обов'Ñзковим."
@@ -39450,7 +40132,7 @@ msgid "This is a \"Ghost User\", created to hold all issues authored by users th
msgstr "Це — кориÑтувач \"Ghost User\", Ñкий було Ñтворено Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб він зібрав уÑÑ– задачі Ñтворені кориÑтувачами, що були видалені. Його неможливо видалити."
msgid "This is a Jira user."
-msgstr ""
+msgstr "Це кориÑтувач по імені Jira"
msgid "This is a confidential %{noteableTypeText}."
msgstr ""
@@ -39593,9 +40275,6 @@ msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” ручних дій"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr "Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑку цього Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ðµ ручне втручаннÑ. Перед його запуÑком можна додати змінні нижче Ð´Ð»Ñ Ð¾Ñтанніх змін у конфігурації."
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ запущено автоматично піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°. Зазвичай вони викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ–Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² production Ñередовище. У разі ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¾Ð½Ð¾ перетворитьÑÑ Ð½Ð° ручну операцію."
@@ -39713,7 +40392,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39737,6 +40416,9 @@ msgstr "Цей runner буде виконуватиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ на тих
msgid "This setting can be overridden in each project."
msgstr "Цей параметр можна перевизначати Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ проєкту."
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39768,7 +40450,7 @@ msgid "This user has no identities"
msgstr "Цей кориÑтувач не має ідентифікацій"
msgid "This user has no personal projects."
-msgstr ""
+msgstr "Цей кориÑтувач не має оÑобиÑтих проєктів."
msgid "This user has previously committed to the %{name} project."
msgstr ""
@@ -39788,9 +40470,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr "Це перенаправить Ð²Ð°Ñ Ð½Ð° зовнішню Ñторінку входу."
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39821,9 +40500,6 @@ msgstr "ЧаÑ"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr "Ðа оÑнові чаÑу: Так"
@@ -39833,9 +40509,6 @@ msgstr "Ð§Ð°Ñ Ð´Ð¾ початку потраплÑÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡ в план
msgid "Time before an issue starts implementation"
msgstr "Ð§Ð°Ñ Ð´Ð¾ початку роботи над задачою"
-msgid "Time before enforced"
-msgstr "Ð§Ð°Ñ Ð´Ð¾ примуÑового запуÑку"
-
msgid "Time between merge request creation and merge/close"
msgstr "Ð§Ð°Ñ Ð¼Ñ–Ð¶ ÑтвореннÑм запиту Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ– його виконаннÑм або закриттÑм"
@@ -39887,6 +40560,12 @@ msgstr "Запланований чаÑ"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "Запланований чаÑ:"
@@ -40225,9 +40904,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -40313,19 +40989,19 @@ msgid "Todos|It's how you always know what to work on next."
msgstr ""
msgid "Todos|Mark all as done"
-msgstr ""
+msgstr "Позначити вÑе Ñк виконане"
msgid "Todos|Nothing is on your to-do list. Nice work!"
msgstr ""
msgid "Todos|Undo mark all as done"
-msgstr ""
+msgstr "Відмінити позначити вÑе Ñк виконано"
msgid "Todos|When an issue or merge request is assigned to you, or when you receive a %{strongStart}@mention%{strongEnd} in a comment, this automatically triggers a new item in your To-Do List."
msgstr ""
msgid "Todos|You're all done!"
-msgstr ""
+msgstr "Ð’Ñе готово!"
msgid "Todos|Your To-Do List shows what to work on next"
msgstr ""
@@ -40378,6 +41054,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr "Перемикач бічної панелі"
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr "Увімкнути/вимкнути панель продуктивноÑÑ‚Ñ–"
@@ -40394,7 +41073,7 @@ msgid "Token Access"
msgstr ""
msgid "Token name"
-msgstr ""
+msgstr "Ðазва токену"
msgid "Token valid until revoked"
msgstr ""
@@ -40417,12 +41096,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr "Іконка теми"
@@ -40477,9 +41165,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr "ВідÑтеженнÑ"
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "ВідÑтежуйте групи задач зі Ñпільною темою з різних проєктів та етапів"
@@ -40496,7 +41181,7 @@ msgid "Track time with quick actions"
msgstr "ВідÑтежуйте Ñ‡Ð°Ñ Ð·Ð° допомогою швидких дій"
msgid "Training mode"
-msgstr ""
+msgstr "Режим тренуваннÑ"
msgid "Transfer"
msgstr "Передача"
@@ -40636,9 +41321,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40705,9 +41387,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "УÑÑƒÐ½ÐµÐ½Ð½Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´Ð¾Ðº Ñ– моніторинг вашого заÑтоÑунку за допомогою відÑтеженнÑ"
-
msgid "Trusted"
msgstr ""
@@ -40760,13 +41439,13 @@ msgid "Turn off"
msgstr "Вимкнути"
msgid "Turn off notifications"
-msgstr ""
+msgstr "Вимкнути ÑповіщеннÑ"
msgid "Turn on"
msgstr "Увімкнути"
msgid "Turn on notifications"
-msgstr ""
+msgstr "Увімкнути ÑповіщеннÑ"
msgid "Twitter"
msgstr "Twitter"
@@ -40795,6 +41474,9 @@ msgstr "Двофакторна автентифікаціÑ"
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40826,7 +41508,7 @@ msgid "URL cannot be blank"
msgstr ""
msgid "URL is invalid"
-msgstr ""
+msgstr "URL-адреÑа недійÑна"
msgid "URL is required"
msgstr "URL-адреÑа обов'Ñзкова"
@@ -40885,9 +41567,6 @@ msgstr "Ðе вдалоÑÑ Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ інформацію про ЦП"
msgid "Unable to collect memory info"
msgstr "Ðе вдалоÑÑ Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ інформацію про пам’ÑÑ‚ÑŒ"
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr "Ðеможливо з’єднатиÑÑŒ з Prometheus Ñервером"
@@ -40897,9 +41576,6 @@ msgstr "Ðе вдалоÑÑ Ð·Ð²â€™ÑзатиÑÑ Ñ–Ð· Ñервером: %{error
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40912,9 +41588,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ вразливі проєкти"
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40942,6 +41615,9 @@ msgstr "Ðеможливо завантажити порівнÑÐ½Ð½Ñ (diff). %
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ віджет запиту на злиттÑ. Спробуйте перезавантажити Ñторінку."
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ ітерацію. Будь лаÑка, Ñпробуйте ще раз"
@@ -40984,7 +41660,7 @@ msgstr ""
msgid "Unarchive project"
msgstr "Розархівувати проєкт"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -41018,7 +41694,7 @@ msgid "Unexpected error"
msgstr ""
msgid "Unfollow"
-msgstr ""
+msgstr "ВідпиÑатиÑÑ"
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "Ðа жаль, ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти до GitLab не може бути оброблено."
@@ -41038,9 +41714,6 @@ msgstr "Ðевідомо"
msgid "Unknown Error"
msgstr "Ðевідома помилка"
-msgid "Unknown cache key"
-msgstr "Ðевідомий ключ кешу"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr "Ðевідома ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ: %{encrypted_strategy}!"
@@ -41072,7 +41745,7 @@ msgid "Unlock account"
msgstr ""
msgid "Unlock merge request"
-msgstr ""
+msgstr "Розблокувати запит на злиттÑ"
msgid "Unlock more features with GitLab Ultimate"
msgstr ""
@@ -41092,12 +41765,6 @@ msgstr "ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾."
msgid "Unlocks the discussion."
msgstr "Розблоковує обговореннÑ."
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -41255,7 +41922,7 @@ msgid "Updating the attention request for %{username} failed."
msgstr ""
msgid "Updating…"
-msgstr ""
+msgstr "ОновленнÑ…"
msgid "Upgrade offers available!"
msgstr ""
@@ -41285,7 +41952,7 @@ msgid "Upload file"
msgstr "ÐадіÑлати файл"
msgid "Upload image"
-msgstr ""
+msgstr "Завантажити зображеннÑ"
msgid "Upload new file"
msgstr "Завантажити новий файл"
@@ -41293,11 +41960,8 @@ msgstr "Завантажити новий файл"
msgid "Upload object map"
msgstr "Завантажити файл відповідноÑÑ‚Ñ– об’єктів"
-msgid "UploadLink|click to upload"
-msgstr "ÐатиÑніть, щоб надіÑлати"
-
-msgid "Uploaded"
-msgstr "Завантажено"
+msgid "Uploaded date"
+msgstr "Дата завантаженнÑ"
msgid "Uploading changes to terminal"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ до терміналу"
@@ -41341,9 +42005,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr "Купити додаткові хвилини"
@@ -41464,6 +42125,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr "Сховище"
@@ -41954,7 +42618,7 @@ msgid "UserProfile|Followers"
msgstr "ПідпиÑники"
msgid "UserProfile|Following"
-msgstr "ПідпиÑник"
+msgstr "Читає"
msgid "UserProfile|Groups"
msgstr "Групи"
@@ -42056,7 +42720,7 @@ msgid "UserProfile|made a private contribution"
msgstr ""
msgid "Username"
-msgstr ""
+msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "Username (optional)"
msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача (необов'Ñзково)"
@@ -42091,6 +42755,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -42330,7 +43000,7 @@ msgid "Verify SAML Configuration"
msgstr "Перевірити конфігурацію SAML"
msgid "Verify code"
-msgstr ""
+msgstr "Підтвердити код"
msgid "Verify configuration"
msgstr "Перевірити конфігурацію"
@@ -42356,17 +43026,14 @@ msgstr "ДоÑтупне оновленнÑ"
msgid "VersionCheck|Your GitLab Version"
msgstr "Ваша верÑÑ–Ñ GitLab"
-msgid "View Documentation"
-msgstr "ПереглÑнути документацію"
-
msgid "View Stage: %{title}"
-msgstr ""
+msgstr "ПереглÑнути Ñтадію: %{title}"
msgid "View alert details at"
msgstr ""
msgid "View alert details."
-msgstr ""
+msgstr "ПереглÑнути деталі попередженнÑ."
msgid "View all environments."
msgstr ""
@@ -42405,9 +43072,6 @@ msgstr "ПереглÑнути деталі: %{details_url}"
msgid "View documentation"
msgstr "ПереглÑнути документацію"
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr "ПереглÑнути доÑтупних оÑіб Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ"
@@ -42537,7 +43201,7 @@ msgid "View users statistics"
msgstr "ПереглÑд ÑтатиÑтики кориÑтувачів"
msgid "Viewed"
-msgstr ""
+msgstr "ПереглÑнуто"
msgid "Viewing commit"
msgstr "ПереглÑд коміту"
@@ -43025,7 +43689,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Ми хочемо бути впевнені, що це ви, будь лаÑка, підтвердіть, що ви не робот."
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43543,7 +44207,7 @@ msgid "WikiPage|Edit rich text"
msgstr ""
msgid "WikiPage|Edit source"
-msgstr ""
+msgstr "Редагувати джерело"
msgid "WikiPage|Format"
msgstr "Формат"
@@ -43623,6 +44287,9 @@ msgstr ""
msgid "Will deploy to"
msgstr "Розгорне на"
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr "За допомогою вимог, ви можете вÑтановити Ñтандарти Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ñвоєї продукції."
@@ -43647,19 +44314,38 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr "Додати виконавцÑ"
+
+msgid "WorkItem|Add assignees"
+msgstr "Додати виконавців"
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] "Виконавець"
+msgstr[1] "Виконавці"
+msgstr[2] "Виконавців"
+msgstr[3] "Виконавців"
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43671,12 +44357,12 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
-msgstr "Ðове завданнÑ"
-
msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
+msgid "WorkItem|Open"
+msgstr ""
+
msgid "WorkItem|Select type"
msgstr "Вибрати тип"
@@ -43828,7 +44514,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -44026,9 +44712,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "Ви можете редагувати файли, лише перебуваючи у ÑкійÑÑŒ гілці"
@@ -44038,9 +44721,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr "Ви можете переміщувати проєкт тільки в проÑтори імен, Ñкими ви керуєте."
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Ви можете розв’Ñзати цей конфлікт Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð° допомогою інтерактивного режиму (викориÑтовуючи кнопки %{use_ours} та %{use_theirs}), або безпоÑередньо редагуючи файли. Закомітити зміни у %{branch_name}"
@@ -44068,9 +44748,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Ви не можете отримати доÑтуп до неформатованого файлу. Будь лаÑка, зачекайте хвилину."
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -44080,6 +44757,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr "Ви не можете імітувати заблокованого кориÑтувача"
@@ -44234,6 +44914,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -44246,6 +44929,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr "У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проÑтору імен"
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -44253,7 +44939,7 @@ msgid "You have insufficient permissions to update an on-call schedule for this
msgstr ""
msgid "You have insufficient permissions to update this HTTP integration"
-msgstr ""
+msgstr "У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інтеграції HTTP"
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
@@ -44315,9 +45001,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— функції Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¤Ð°Ð¹Ð»Ñ–Ð² вам потрібна інша ліцензіÑ"
@@ -44417,18 +45100,36 @@ msgstr "Вам не дозволÑєтьÑÑ Ð²Ð½Ð¾Ñити зміни до ць
msgid "You're receiving this email because of your account on %{host}."
msgstr "Ви отримали цей електронний лиÑÑ‚, оÑкільки ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð¸Ð¹ на %{host}."
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "Ви отримали це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr "Ви отримали цей електронний лиÑÑ‚ через Ñвою активніÑÑ‚ÑŒ на %{host}."
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr "Ви отримали цей лиÑÑ‚, тому що Ð²Ð°Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾ елемент на %{host}."
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "Ви отримали цей електронний лиÑÑ‚ через те, що Ð²Ð°Ñ Ð·Ð³Ð°Ð´Ð°Ð»Ð¸ на %{host}."
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "Ви уже увімкнули двофакторну автентифікацію за допомогою автентифікаторів одноразових паролів. Ð”Ð»Ñ Ñ€ÐµÑ”Ñтрації іншого приÑтрою ви повинні Ñпочатку вимкнути двофакторну автентифікацію."
@@ -44450,12 +45151,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44687,12 +45382,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr "Ваш новий перÑональний токен доÑтупу Ñтворено."
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr "Ваш пароль не потрібен Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду цієї Ñторінки. Якщо вимагаєтьÑÑ Ð²Ð²ÐµÑти пароль або будь-Ñкі інші оÑобиÑÑ‚Ñ– дані, зв’ÑжітьÑÑ Ð·Ñ– Ñвоїм адмініÑтратором, щоб повідомити про порушеннÑ."
-
msgid "Your password reset token has expired."
msgstr "Ваш токен Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ заÑтарів."
@@ -44708,6 +45397,9 @@ msgstr ""
msgid "Your profile"
msgstr "Ваш профіль"
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "Ваш ліміт проєктів Ñкладає %{limit}! Будь лаÑка, звернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб його збільшити"
@@ -44763,9 +45455,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
@@ -44773,6 +45462,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44845,6 +45540,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr "видалений кориÑтувач"
@@ -44876,6 +45574,9 @@ msgstr "попередженнÑ"
msgid "allowed to fail"
msgstr "невдача дозволена"
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44919,6 +45620,12 @@ msgstr "призначити Ñамому Ñобі"
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr "під загрозою"
@@ -44974,6 +45681,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -45016,6 +45726,9 @@ msgstr "не може бути активовано, Ñкщо не вÑÑ– дом
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -45089,10 +45802,10 @@ msgstr "%{reportType}: Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð·Ð²ÐµÐ»Ð¾ до помил
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -45104,6 +45817,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr "Ð’ÑÑ– проєкти"
@@ -45237,7 +45953,7 @@ msgid "ciReport|Found %{issuesWithCount}"
msgstr "Знайдено %{issuesWithCount}"
msgid "ciReport|Full Report"
-msgstr ""
+msgstr "Повний звіт"
msgid "ciReport|IaC Scanning"
msgstr ""
@@ -45259,10 +45975,10 @@ msgstr ""
msgid "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} change"
msgid_plural "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} changes"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Метрики теÑту продуктивноÑÑ‚Ñ– Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñвило %{strong_start}%{changesFound}%{strong_end} зміну"
+msgstr[1] "Метрики теÑту продуктивноÑÑ‚Ñ– Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñвило %{strong_start}%{changesFound}%{strong_end} зміни"
+msgstr[2] "Метрики теÑту продуктивноÑÑ‚Ñ– Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñвило %{strong_start}%{changesFound}%{strong_end} змін"
+msgstr[3] "Метрики теÑту продуктивноÑÑ‚Ñ– Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñвило %{strong_start}%{changesFound}%{strong_end} змін"
msgid "ciReport|Load performance test metrics results are being parsed"
msgstr ""
@@ -45385,6 +46101,9 @@ msgstr ""
msgid "closed"
msgstr "закрито"
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr "закрита задача"
@@ -45412,12 +46131,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr "container_name не може бути довше %{max_length} Ñимволів"
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -45473,6 +46186,9 @@ msgstr "гілка за замовчуваннÑм"
msgid "deleted"
msgstr "видалено"
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr "розгортаннÑ"
@@ -45587,6 +46303,9 @@ msgid "finding is not found or is already attached to a vulnerability"
msgstr "знахідку втрачено або вже закріплено за вразливіÑÑ‚ÑŽ"
msgid "following"
+msgstr "читає"
+
+msgid "for"
msgstr ""
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
@@ -45638,6 +46357,19 @@ msgstr ""
msgid "groups"
msgstr "групи"
+msgid "groups and projects"
+msgstr "групи та проєкти"
+
+msgid "groups only"
+msgstr "тільки групи"
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "has already been linked to another vulnerability"
msgstr "було прив’Ñзано до іншої вразливоÑÑ‚Ñ–"
@@ -45965,6 +46697,12 @@ msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²â€™Ñзкове"
msgid "mrWidget|Approval password is invalid."
msgstr "Пароль Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ” недійÑним."
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr "Затвердити"
@@ -46064,14 +46802,17 @@ msgstr ""
msgid "mrWidget|Mentions issue"
msgid_plural "mrWidget|Mentions issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Задача зі згадками"
+msgstr[1] "Задачі зі згадками"
+msgstr[2] "Задач зі згадками"
+msgstr[3] "Задач зі згадками"
msgid "mrWidget|Merge"
msgstr "Об'єднати"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -46090,9 +46831,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr "Заблоковано: цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¼Ð°Ñ” бути затверджений."
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -46138,6 +46876,9 @@ msgstr "ЗлиттÑ! Ми майже на міÑці…"
msgid "mrWidget|More information"
msgstr "Детальніше"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46336,6 +47077,12 @@ msgstr "%{item}, Ñ– %{lastItem}"
msgid "on track"
msgstr "по плану"
+msgid "only %{parent_types} can be parent of Task."
+msgstr "лише %{parent_types} може бути батьківÑьким завданнÑм."
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -46371,6 +47118,12 @@ msgstr[1] "батьківÑькі об’єкти"
msgstr[2] "батьківÑький об’єктів"
msgstr[3] "батьківÑький об’єктів"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr "пароль"
@@ -46407,12 +47160,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "pod_name не може бути довше %{max_length} Ñимволів"
-
msgid "point"
msgid_plural "points"
msgstr[0] "бал"
@@ -46569,6 +47316,9 @@ msgstr "Ðевідомий"
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr "має бути вищим або рівним %{access}, уÑпадкованому членÑтву з групи %{group_name}"
@@ -46792,6 +47542,12 @@ msgstr ""
msgid "yaml invalid"
msgstr "yaml недійÑний"
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr "ваші налаштуваннÑ"
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index cb316de7e64..e8244389c83 100644
--- a/locale/ur_PK/gitlab.po
+++ b/locale/ur_PK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ur-PK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index 3a1aef83934..029eb67552e 100644
--- a/locale/uz_UZ/gitlab.po
+++ b/locale/uz_UZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: uz\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -288,6 +288,11 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -363,11 +368,21 @@ msgid_plural "%d remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -703,9 +718,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -920,9 +941,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -1008,6 +1026,9 @@ msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -1045,6 +1066,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1331,6 +1355,11 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1542,6 +1571,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1830,6 +1862,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1947,6 +1982,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -2037,9 +2078,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2070,9 +2108,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -2100,9 +2135,6 @@ 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 new issue"
msgstr ""
@@ -2352,9 +2384,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2604,6 +2633,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2676,6 +2708,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2901,7 +2936,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2910,6 +2945,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2952,6 +2990,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2979,6 +3020,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -3054,6 +3098,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -3081,6 +3131,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3099,6 +3152,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -3111,9 +3167,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3162,9 +3224,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3183,6 +3242,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3249,6 +3311,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3729,6 +3794,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3741,12 +3809,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3789,9 +3851,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3804,9 +3863,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3819,12 +3875,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3984,6 +4046,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4203,6 +4268,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4211,6 +4279,9 @@ msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
msgstr[1] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4418,6 +4489,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4804,7 +4878,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4908,6 +4982,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4926,6 +5003,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -5043,6 +5123,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5138,9 +5221,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5212,6 +5292,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5236,6 +5319,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5245,6 +5331,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5260,6 +5352,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5752,9 +5847,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6157,6 +6249,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6451,6 +6549,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6772,6 +6873,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6868,6 +6972,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6909,6 +7016,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7236,6 +7346,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7407,9 +7520,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7657,6 +7767,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7708,9 +7824,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7774,6 +7887,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8148,6 +8264,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8166,6 +8285,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8175,9 +8411,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8543,9 +8776,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8585,6 +8815,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8630,9 +8863,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8810,10 +9040,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8909,6 +9145,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8990,6 +9232,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9379,6 +9624,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9415,10 +9663,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9610,9 +9858,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9832,9 +10077,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9844,6 +10086,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10570,6 +10815,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11262,6 +11510,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11295,6 +11546,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11343,13 +11603,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11481,6 +11741,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11691,6 +11954,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11894,12 +12160,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11912,9 +12172,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11972,6 +12229,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -12008,9 +12268,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -12056,6 +12313,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12167,6 +12427,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12302,13 +12589,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12727,12 +13014,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12822,9 +13103,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12867,9 +13145,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12927,6 +13202,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -13128,6 +13406,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13230,9 +13511,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13400,9 +13678,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13619,10 +13894,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13652,9 +13927,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13805,9 +14077,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13946,9 +14215,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13964,6 +14230,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -14030,9 +14299,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -14147,9 +14413,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14270,9 +14533,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14372,12 +14632,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14414,9 +14668,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14426,9 +14677,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14438,12 +14686,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14453,10 +14695,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14465,18 +14704,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14492,13 +14725,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr ""
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14633,6 +14863,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14861,6 +15094,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -15124,6 +15360,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15262,7 +15501,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15427,6 +15666,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15448,6 +15690,11 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed on"
msgstr ""
@@ -16127,7 +16374,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -16136,6 +16386,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16268,9 +16521,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16337,7 +16587,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16575,9 +16825,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16782,15 +17029,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16887,9 +17128,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16938,9 +17176,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -17133,6 +17368,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -17160,6 +17431,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17250,9 +17524,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17349,6 +17620,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17454,9 +17728,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17472,6 +17752,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17493,16 +17776,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|in %{scope}"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17778,6 +18067,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17931,6 +18223,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17940,7 +18235,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18207,18 +18502,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18249,25 +18541,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18276,37 +18568,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18315,7 +18610,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18324,9 +18622,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18348,7 +18652,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18480,9 +18784,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18962,10 +19263,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18977,9 +19278,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -19139,15 +19437,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20258,9 +20607,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20273,12 +20628,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20291,6 +20664,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20420,9 +20799,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20563,6 +20939,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20575,10 +20954,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20671,6 +21053,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20686,6 +21071,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20731,6 +21119,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20812,6 +21203,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20824,15 +21218,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20875,9 +21260,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20887,15 +21269,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -21031,6 +21410,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -21046,6 +21428,11 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -21157,6 +21544,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21340,15 +21730,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21667,9 +22051,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21706,9 +22087,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21727,6 +22114,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -22030,6 +22420,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -22069,12 +22462,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -22099,6 +22498,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -22135,6 +22540,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22252,9 +22660,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22330,6 +22735,11 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Label priority"
msgstr ""
@@ -22554,9 +22964,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22572,9 +22979,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22635,19 +23039,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22692,22 +23096,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22725,6 +23132,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22734,9 +23144,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23232,9 +23639,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23322,9 +23726,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23334,9 +23735,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23475,6 +23873,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23487,6 +23888,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -24058,12 +24462,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24229,7 +24639,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24256,6 +24666,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24606,9 +25019,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -25046,6 +25456,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -25058,9 +25483,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -25082,6 +25504,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -25106,9 +25531,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25195,10 +25617,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25207,10 +25629,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25365,16 +25787,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25470,9 +25889,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25527,6 +25943,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25557,6 +25976,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25581,9 +26003,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25674,6 +26093,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25719,9 +26141,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25758,6 +26177,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25937,9 +26359,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -26083,21 +26511,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -26110,18 +26565,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26595,6 +27074,9 @@ msgid_plural "%d more items"
msgstr[0] ""
msgstr[1] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26619,7 +27101,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26628,22 +27110,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26652,12 +27134,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26679,10 +27164,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26778,6 +27263,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26796,6 +27284,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26886,6 +27377,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26970,12 +27464,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26994,7 +27482,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -27102,6 +27593,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27218,6 +27712,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27260,6 +27757,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27299,9 +27799,6 @@ 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 ""
@@ -27392,18 +27889,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27836,6 +28327,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27848,6 +28357,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28214,6 +28732,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28451,6 +28972,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28658,12 +29182,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28739,13 +29257,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28787,9 +29308,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28841,9 +29359,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28874,6 +29389,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -29039,9 +29557,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -29054,7 +29569,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -29081,7 +29596,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -29096,6 +29611,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -29123,7 +29641,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -29132,16 +29650,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -29174,7 +29692,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29261,13 +29779,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29276,7 +29794,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29285,16 +29803,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29303,7 +29821,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29339,7 +29857,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29381,6 +29899,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29459,7 +29980,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29582,6 +30103,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29693,6 +30217,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29711,9 +30238,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -30173,6 +30697,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30311,6 +30838,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30377,7 +30907,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30437,7 +30967,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30596,6 +31126,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30608,6 +31141,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30929,6 +31465,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31241,6 +31780,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31328,9 +31870,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31491,6 +32030,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31884,9 +32426,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31914,6 +32453,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -32004,6 +32546,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32351,9 +32899,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32430,6 +32975,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32439,9 +32987,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32535,6 +33080,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32568,12 +33116,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32890,6 +33432,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -33015,9 +33560,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -33158,6 +33700,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33248,6 +33799,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33900,6 +34466,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33915,7 +34484,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33960,6 +34529,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33984,9 +34556,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -34083,9 +34661,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -34185,6 +34760,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -34209,18 +34787,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34230,12 +34796,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34275,6 +34835,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34500,9 +35063,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34581,6 +35141,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34695,6 +35261,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34716,6 +35285,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34947,9 +35519,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -35004,6 +35573,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -35067,6 +35639,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35330,6 +35905,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35353,9 +35985,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35371,6 +36000,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35692,6 +36324,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35887,9 +36522,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -36217,7 +36849,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36562,6 +37194,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36583,7 +37218,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36601,6 +37236,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36664,6 +37302,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36970,7 +37611,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -37140,6 +37784,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -37152,6 +37799,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37227,9 +37889,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37428,6 +38087,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37776,6 +38441,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37854,9 +38522,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37979,6 +38644,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -38003,7 +38671,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -38157,6 +38825,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -38199,9 +38870,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38232,21 +38900,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38460,6 +39119,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38505,6 +39167,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -39129,9 +39797,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39249,7 +39914,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39273,6 +39938,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39324,9 +39992,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39357,9 +40022,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39369,9 +40031,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39423,6 +40082,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39757,9 +40422,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39910,6 +40572,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39949,12 +40614,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -40009,9 +40683,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -40168,9 +40839,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40237,9 +40905,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40327,6 +40992,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40417,9 +41085,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40429,9 +41094,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40444,9 +41106,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40474,6 +41133,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40516,7 +41178,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40570,9 +41232,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40624,12 +41283,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40825,10 +41478,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40873,9 +41523,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40996,6 +41643,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41623,6 +42273,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41886,9 +42542,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41933,9 +42586,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42549,7 +43199,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -43145,6 +43795,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -43169,19 +43822,36 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -43193,10 +43863,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43348,7 +44018,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43546,9 +44216,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43558,9 +44225,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43588,9 +44252,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43600,6 +44261,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43752,6 +44416,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43764,6 +44431,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43833,9 +44503,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43935,18 +44602,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43968,12 +44653,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -44205,12 +44884,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -44226,6 +44899,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44279,14 +44955,17 @@ msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_
msgstr[0] ""
msgstr[1] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
msgstr[1] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44359,6 +45038,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44388,6 +45070,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44429,6 +45114,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44482,6 +45173,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44524,6 +45218,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44595,10 +45292,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44610,6 +45307,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44881,6 +45581,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44908,12 +45611,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44967,6 +45664,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -45079,6 +45779,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -45126,6 +45829,17 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45447,6 +46161,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45550,6 +46270,9 @@ msgstr[1] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45568,9 +46291,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45616,6 +46336,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45814,6 +46537,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45845,6 +46574,12 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45881,12 +46616,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -46037,6 +46766,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -46258,6 +46990,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index 2d589a5db63..c5806d85bc7 100644
--- a/locale/vi_VN/gitlab.po
+++ b/locale/vi_VN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:19\n"
+"PO-Revision-Date: 2022-07-14 17:05\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -622,9 +634,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -917,6 +932,9 @@ msgstr[0] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -952,6 +970,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1233,6 +1254,10 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1421,6 +1446,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1709,6 +1737,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
@@ -1826,6 +1857,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr ""
@@ -1916,9 +1953,6 @@ msgstr ""
msgid "Add CONTRIBUTING"
msgstr ""
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr ""
@@ -1949,9 +1983,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ 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 new issue"
msgstr ""
@@ -2231,9 +2259,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr ""
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -2990,9 +3042,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr ""
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -4913,6 +4989,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8769,6 +9001,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,10 +9518,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9469,9 +9713,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,10 +13732,10 @@ msgstr ""
msgid "Edit"
msgstr ""
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13494,9 +13765,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14280,12 +14524,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14295,10 +14533,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14334,13 +14563,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,37 +18400,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,7 +18442,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr ""
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22159,6 +22558,10 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,16 +25596,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25490,6 +25902,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28548,13 +29059,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28596,9 +29110,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -28863,7 +29371,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,7 +29398,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -28905,6 +29413,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,7 +29494,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29070,13 +29581,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29085,7 +29596,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29094,16 +29605,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29112,7 +29623,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29148,7 +29659,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29268,7 +29782,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36340,6 +36965,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -36929,6 +37569,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39191,6 +39843,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index aff38660b28..d63df751052 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -47,7 +47,7 @@ msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr "或%{emphasisStart}!åˆå¹¶è¯·æ±‚id%{emphasisEnd}"
msgid " or %{emphasisStart}#id%{emphasisEnd}"
-msgstr ""
+msgstr " 或 %{emphasisStart}#id%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr "或%{emphasisStart}#议题id%{emphasisEnd}"
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] "使用标记æˆåŠŸå¯¼å…¥%d个议题"
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] "%d 个作业"
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d 个层"
@@ -303,12 +307,20 @@ msgstr[0] "选择了%d个项目"
msgid "%d remaining"
msgid_plural "%d remaining"
-msgstr[0] ""
+msgstr[0] "剩余 %d"
+
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] "%d æ¡å›žå¤"
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d秒"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] "%d 个阶段"
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d 个星标"
@@ -386,7 +398,7 @@ msgid "%{authorsName}'s thread"
msgstr "%{authorsName}的主题"
msgid "%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}"
-msgstr ""
+msgstr "已请求%{author}å°†%{source_branch}%{copy_button}åˆå¹¶åˆ°%{target_branch}%{created_at}"
msgid "%{board_target} not found"
msgstr "找ä¸åˆ°%{board_target}"
@@ -622,9 +634,15 @@ msgstr "%{labelStart}类型: %{labelEnd}%{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}崩溃地å€:%{labelEnd} %{crash_address}"
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr "%{labelStart}崩溃状æ€ï¼š%{labelEnd}%{crash_state}"
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr "%{labelStart}崩溃状æ€:%{labelEnd} %{stacktrace_snippet}"
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr "%{labelStart}崩溃类型:%{labelEnd} %{crash_type}"
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}è¯æ®:%{labelEnd} %{evidence}"
@@ -695,7 +713,7 @@ msgid "%{message} showing first %{warnings_displayed}"
msgstr "%{message}显示第一个%{warnings_displayed}"
msgid "%{message}. Your attention request was removed."
-msgstr ""
+msgstr "%{message}。您关注的请求已删除。"
msgid "%{milestone} (expired)"
msgstr "%{milestone} (已过期)"
@@ -704,7 +722,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds}毫秒"
msgid "%{minutesUsed} minutes"
-msgstr ""
+msgstr "%{minutesUsed} 分钟"
msgid "%{model_name} not found"
msgstr "找ä¸åˆ° %{model_name}"
@@ -774,7 +792,7 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues}个开å¯ä¸­ï¼Œ %{closedIssues}个已关闭"
msgid "%{percentageUsed}%% used"
-msgstr ""
+msgstr "%{percentageUsed}%% 已被使用"
msgid "%{percentage}%% issues closed"
msgstr "%{percentage}%% 的议题已关闭"
@@ -798,7 +816,7 @@ msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})
msgstr "%{policy_link} (在 %{elapsed_time} 分钟åŽå‘出通知, 除éžçŠ¶æ€ä¸º %{status})"
msgid "%{project_name}"
-msgstr ""
+msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}"
msgstr "%{project_path} 是一个项目,您å¯ä»¥ä½¿ç”¨è¯¥é¡¹ç›®å°†è‡ªè¿°æ–‡ä»¶æ·»åŠ åˆ°æ‚¨çš„ GitLab é…置文件中,创建一个公共项目并使用 README åˆå§‹åŒ–仓库以开始使用。 %{help_link_start}了解更多。%{help_link_end}"
@@ -820,7 +838,7 @@ msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnM
msgstr "%{reportType}检测到%{totalStart}%{total}%{totalEnd}个潜在的%{vulnMessage}"
msgid "%{reportType} detected no %{totalStart}new%{totalEnd} vulnerabilities."
-msgstr ""
+msgstr "%{reportType}未检测到%{totalStart}æ–°çš„%{totalEnd}安全æ¼æ´žã€‚"
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}é‡è¯•%{retryButtonEnd}或%{newFileButtonStart}添加新文件%{newFileButtonEnd}。"
@@ -837,9 +855,6 @@ msgstr "%{runner} 已创建 %{timeago}"
msgid "%{scope} results for term '%{term}'"
msgstr "'%{term}' 的结果 %{scope} "
-msgid "%{search} %{description} %{scope}"
-msgstr "%{search} %{description} %{scope}"
-
msgid "%{seconds}s"
msgstr "%{seconds}秒"
@@ -915,7 +930,10 @@ msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge
msgstr[0] "%{strong_start}%{count}ä½æˆå‘˜%{strong_end}必须核准åŽæ‰å¯ä»¥åˆå¹¶ã€‚任何具有开å‘人员或更高æƒé™çš„用户都å¯ä»¥åˆå¹¶ã€‚"
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} 项目存储"
+
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr "%{strong_start}%{project_name}%{strong_end} 是个人项目,因此您无法å‡çº§åˆ°ä»˜è´¹ç‰ˆæˆ–开始å…费试用æ¥è§£é™¤è¿™äº›é™åˆ¶ã€‚我们建议 %{move_to_group_link}将此项目移至群组%{end_link} æ¥è§£é”这些选项。您å¯ä»¥ %{manage_members_link}管ç†æ­¤é¡¹ç›®çš„æˆå‘˜%{end_link},但ä¸è¦å¿˜è®°æ‚¨ä¸ªäººå‘½å空间 %{strong_start}%{namespace_name}%{strong_end} 中的全部独有æˆå‘˜éƒ½è®¡å…¥ä½¿ç”¨çš„总席ä½ã€‚"
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
@@ -952,6 +970,9 @@ msgstr "%{timebox_type}ä¸æ”¯æŒç‡ƒçƒ§å›¾"
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type}必须有开始日期和截止日期"
+msgid "%{time} UTC"
+msgstr "%{time} UTC"
+
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -971,7 +992,7 @@ msgid "%{total_warnings} warning(s) found:"
msgstr "找到%{total_warnings}个警告(s): "
msgid "%{total} remaining issue weight"
-msgstr ""
+msgstr "%{total}剩余议题æƒé‡"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "找到%{total}个警告: æ˜¾ç¤ºå‰ %{warningsDisplayed}"
@@ -1175,32 +1196,32 @@ msgid "- %{policy_name} (notifying after %{elapsed_time} minutes unless %{status
msgstr "- %{policy_name} (在 %{elapsed_time} 分钟åŽå‘出通知, 除éžçŠ¶æ€ä¸º %{status})"
msgid "- Add or remove a user."
-msgstr ""
+msgstr "- 添加或删除用户。"
msgid "- Available to run jobs."
msgstr "å¯ç”¨äºŽè¿è¡Œä½œä¸šã€‚"
msgid "- Create or close an issue."
-msgstr ""
+msgstr "- 创建或关闭议题。"
msgid "- Create, update, or delete a merge request."
-msgstr ""
+msgstr "- 创建ã€æ›´æ–°æˆ–删除åˆå¹¶è¯·æ±‚。"
msgid "- Event"
msgid_plural "- Events"
msgstr[0] "- 事件"
msgid "- Go to the Activity page for %{project_name}."
-msgstr ""
+msgstr "- 访问 %{project_name} 的活动页é¢ã€‚"
msgid "- List the visible events for %{project_name} using the Events API %{events_api_link}."
-msgstr ""
+msgstr "- 使用事件 API %{events_api_link} 列出 %{project_name} çš„å¯è§äº‹ä»¶ã€‚"
msgid "- Not available to run jobs."
msgstr "- ä¸å¯ç”¨äºŽè¿è¡Œä½œä¸šã€‚"
msgid "- Push code to the repository."
-msgstr ""
+msgstr "- 推é€ä»£ç åˆ°ä»“库。"
msgid "- Select -"
msgstr "- 选择 -"
@@ -1210,7 +1231,7 @@ msgid_plural "- Users"
msgstr[0] "- 用户"
msgid "- View the last_activity_at attribute for %{project_name} using the Project API %{projects_api_link}."
-msgstr ""
+msgstr "- 使用项目 API %{projects_api_link} 查看 %{project_name} 的 last_activity_at 属性。"
msgid "- of - issues closed"
msgstr "-/- 议题已关闭"
@@ -1233,6 +1254,10 @@ msgstr "/天"
msgid "0 bytes"
msgstr "0 字节"
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] "%d个代ç è´¨é‡é—®é¢˜"
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] "%d天"
@@ -1380,10 +1405,10 @@ msgid "404|Please contact your GitLab administrator if you think this is a mista
msgstr "如果您觉得这是一个错误的æ示信æ¯ï¼Œè¯·è”系您的 GitLab 管ç†å‘˜ã€‚"
msgid "409|Please contact your GitLab administrator if you think this is a mistake."
-msgstr ""
+msgstr "如果您认为这是信æ¯é”™è¯¯ï¼Œè¯·è”系您的管ç†å‘˜ã€‚"
msgid "409|There was a conflict with your request."
-msgstr ""
+msgstr "您的请求中有冲çª"
msgid "7 days"
msgstr "7天"
@@ -1421,6 +1446,9 @@ msgstr "一个Jekyll站点,它使用NetLifyæ¥ä»£æ›¿Gitlabçš„CI/CD,但ä»ç„¶
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "验è¯ä½ çš„域å之å‰ï¼Œæˆ‘ä»¬æ— æ³•èŽ·å– Encrype SSL è¯ä¹¦ã€‚"
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr "工作项å¯ä»¥æ˜¯çˆ¶é¡¹æˆ–å­é¡¹ï¼Œä½†ä¸èƒ½åŒæ—¶æ˜¯ä¸¤è€…。"
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "使用AWS Lambda,AWS API网关和GitLab Pages的基本页é¢å’Œæ— æœåŠ¡å™¨åŠŸèƒ½"
@@ -1449,7 +1477,7 @@ msgid "A file with '%{file_name}' already exists in %{branch} branch"
msgstr "文件å为%{file_name}的文件已ç»å­˜åœ¨äºŽ%{branch}分支中"
msgid "A file with this name already exists."
-msgstr ""
+msgstr "已存在åŒå的文件。"
msgid "A group is a collection of several projects"
msgstr "群组为多个项目的集åˆã€‚"
@@ -1709,6 +1737,9 @@ msgstr "å¯æŽ¥å—用于此项目"
msgid "Access Git repositories or the API."
msgstr "访问 Git 仓库或 API。"
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "访问令牌"
@@ -1794,7 +1825,7 @@ msgid "AccessTokens|Static object token"
msgstr "é™æ€å¯¹è±¡ä»¤ç‰Œ"
msgid "AccessTokens|The last time a token was used"
-msgstr ""
+msgstr "上次使用令牌的时间"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "当您å¯ç”¨ä¸¤æ­¥è®¤è¯(2FA)时,它们将是唯一å¯æŽ¥å—的密ç ã€‚"
@@ -1826,6 +1857,12 @@ msgstr "新增"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr "æ— éšœç¢æ€§æ‰«æå‘现以下类型的错误: %{code}"
+msgid "Accessible by any user who is logged in."
+msgstr "任何登录的用户都å¯ä»¥è®¿é—®ã€‚"
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr "任何人都å¯ä»¥è®¿é—®ï¼Œæ— è®ºæ˜¯å¦ç™»å½•ã€‚"
+
msgid "Account"
msgstr "å¸æˆ·"
@@ -1884,7 +1921,7 @@ msgid "Active"
msgstr "å¯ç”¨"
msgid "Active %{accessTokenTypePlural} (%{totalAccessTokens})"
-msgstr ""
+msgstr "å¯ç”¨%{accessTokenTypePlural} (%{totalAccessTokens})"
msgid "Active %{type} (%{token_length})"
msgstr "有效的%{type}(%{token_length})"
@@ -1916,9 +1953,6 @@ msgstr "添加更新日志"
msgid "Add CONTRIBUTING"
msgstr "添加贡献信æ¯"
-msgid "Add Jaeger URL"
-msgstr "增加 Jaeger 地å€"
-
msgid "Add Kubernetes cluster"
msgstr "添加 Kubernetes 集群"
@@ -1949,9 +1983,6 @@ msgstr "添加GPG密钥"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr "添加 GPG 密钥,安全访问 GitLab。%{help_link_start}了解更多。%{help_link_end}"
-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 "添加一个Jaeger URL,用指å‘您的JaegeræœåŠ¡å™¨çš„链接替æ¢æ­¤é¡µé¢ã€‚æ‚¨é¦–å…ˆéœ€è¦ %{link_start_tag}安装Jaeger%{link_end_tag}。"
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr "为此 GitLab 实例的用户添加æœåŠ¡æ¡æ¬¾å议和éšç§æ”¿ç­–。"
@@ -1968,7 +1999,7 @@ msgid "Add a comment to this line or drag for multiple lines"
msgstr "在此行添加评论或拖动以编辑多行"
msgid "Add a confidential internal note to this %{noteableDisplayName}."
-msgstr ""
+msgstr "添加内部ç§å¯†å¤‡æ³¨åˆ°%{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 "添加一个自定义消æ¯ï¼ŒåŒ…å«å®žä¾‹å…±äº«Runner的详细信æ¯ã€‚ 消æ¯åœ¨ç¾¤ç»„和项目 CI/CD 设置中å¯è§ï¼Œåœ¨Runner部分。支æŒMarkdown。"
@@ -1979,9 +2010,6 @@ msgstr "添加一般评论 %{noteableDisplayName}。"
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 new issue"
msgstr "添加一个新议题"
@@ -2085,7 +2113,7 @@ msgid "Add image comment"
msgstr "添加图片评论"
msgid "Add internal note"
-msgstr ""
+msgstr "添加内部备注"
msgid "Add key"
msgstr "添加密钥"
@@ -2103,7 +2131,7 @@ msgid "Add new directory"
msgstr "添加目录"
msgid "Add or remove a user."
-msgstr ""
+msgstr "增加或删除一个用户。"
msgid "Add or remove previously merged commits"
msgstr "添加或删除先å‰åˆå¹¶çš„æ交"
@@ -2231,9 +2259,6 @@ msgstr "此版本新增"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "当å‰GitLab实例ç¦æ­¢æ·»åŠ æ–°åº”用程åºã€‚请è”系您的GitLab管ç†å‘˜ä»¥èŽ·å¾—相关æƒé™ã€‚"
-msgid "Additional Metadata"
-msgstr "附加元数æ®"
-
msgid "Additional minutes"
msgstr "更多的分钟数"
@@ -2469,7 +2494,7 @@ msgid "AdminProjects|Delete Project %{projectName}?"
msgstr "删除项目 %{projectName}?"
msgid "AdminSettings|%{strongStart}WARNING:%{strongEnd} Environment variable %{environment_variable} does not exist or is not pointing to a valid directory. %{icon_link}"
-msgstr ""
+msgstr "%{strongStart}警告:%{strongEnd} 环境å˜é‡ %{environment_variable} ä¸å­˜åœ¨æˆ–未指å‘有效目录。%{icon_link}"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "我们将为此GitLab 实例使用此电å­é‚®ä»¶åœ°å€é…置一个Let's Encryptè´¦å·ã€‚ 您将收到电å­é‚®ä»¶è¯ä¹¦è¿‡æœŸè­¦å‘Šã€‚ %{link_start}了解更多信æ¯ã€‚%{link_end}"
@@ -2483,6 +2508,9 @@ msgstr "默认情况下,所有新项目都å¯ä»¥ä½¿ç”¨å®žä¾‹çš„共享Runner。
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps 域"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr "自动å°ç¦åœ¨ç‰¹å®šæ—¶é—´å†…下载超过指定数é‡çš„仓库的用户。"
+
msgid "AdminSettings|CI/CD limits"
msgstr "CI/CD é™åˆ¶"
@@ -2490,16 +2518,16 @@ msgid "AdminSettings|Configure Let's Encrypt"
msgstr "é…ç½® Let's Encrypt"
msgid "AdminSettings|Configure when inactive projects should be automatically deleted. %{linkStart}What are inactive projects?%{linkEnd}"
-msgstr ""
+msgstr "é…置何时自动删除ä¸æ´»è·ƒçš„项目。%{linkStart}什么是ä¸æ´»è·ƒçš„项目?%{linkEnd}"
msgid "AdminSettings|Delete inactive projects"
-msgstr ""
+msgstr "删除ä¸æ´»è·ƒçš„项目"
msgid "AdminSettings|Delete inactive projects that exceed"
-msgstr ""
+msgstr "删除超过时é™çš„ä¸æ´»è·ƒé¡¹ç›®"
msgid "AdminSettings|Delete project after"
-msgstr ""
+msgstr "删除项目å‰çš„éžæ´»è·ƒæ—¶é•¿"
msgid "AdminSettings|Disable Elasticsearch until indexing completes."
msgstr "ç¦ç”¨ Elasticsearch,直到索引完æˆã€‚"
@@ -2529,7 +2557,7 @@ msgid "AdminSettings|Enable Service Ping"
msgstr "å¯ç”¨æœåŠ¡Ping"
msgid "AdminSettings|Enable a Prometheus endpoint that exposes health and performance statistics. The Health Check menu item appears in the Monitoring section of the Admin Area. Restart required. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "å¯ç”¨å…¬å¼€è¿è¡ŒçŠ¶å†µå’Œæ€§èƒ½ç»Ÿè®¡ä¿¡æ¯çš„ Prometheus 端点。å¥åº·æ£€æŸ¥èœå•é¡¹å‡ºçŽ°åœ¨ç®¡ç†ä¸­å¿ƒçš„监控部分。需è¦é‡æ–°å¯åŠ¨ã€‚%{link_start}Learn more.%{link_end}"
msgid "AdminSettings|Enable kuromoji custom analyzer: Indexing"
msgstr "å¯ç”¨ kuromoji 自定义分æžå™¨ï¼šç´¢å¼•"
@@ -2555,6 +2583,9 @@ msgstr "å·²å¯ç”¨"
msgid "AdminSettings|Feed token"
msgstr "ä¿¡æ¯æµä»¤ç‰Œ"
+msgid "AdminSettings|Git abuse rate limit"
+msgstr "Git 滥用率é™åˆ¶"
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "我已ç»é˜…读并åŒæ„ %{link_start}æœåŠ¡æ¡æ¬¾%{link_end} (PDF)。"
@@ -2568,7 +2599,7 @@ msgid "AdminSettings|Import sources"
msgstr "导入æº"
msgid "AdminSettings|Inactive project deletion"
-msgstr ""
+msgstr "删除ä¸æ´»è·ƒçš„项目"
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "在最新æˆåŠŸçš„æµæ°´çº¿ä¸­ï¼Œä¿ç•™æ‰€æœ‰ä½œä¸šçš„最新产物"
@@ -2589,7 +2620,7 @@ msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
msgstr "作业å¯ä»¥æ‹¥æœ‰çš„ DAG ä¾èµ–项的最大数é‡"
msgid "AdminSettings|Maximum number of active pipelines per project"
-msgstr "æ¯ä¸ªé¡¹ç›®æ³¨å†Œçš„最大 runner æ•°é‡"
+msgstr "æ¯ä¸ªé¡¹ç›®çš„最大活跃æµæ°´çº¿çš„æ•°é‡"
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr "å•ä¸ªæµæ°´çº¿ä¸­ä½œä¸šçš„最大数é‡"
@@ -2607,7 +2638,7 @@ msgid "AdminSettings|Maximum number of runners registered per project"
msgstr "æ¯ä¸ªé¡¹ç›®æ³¨å†Œçš„最大 runner æ•°é‡"
msgid "AdminSettings|Minimum size must be at least 0."
-msgstr ""
+msgstr "最å°å¤§å°å¿…须至少为 0。"
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "项目和群组中的新 CI/CD å˜é‡é»˜è®¤ä¸ºå—ä¿æŠ¤ã€‚"
@@ -2640,7 +2671,7 @@ msgid "AdminSettings|Required pipeline configuration"
msgstr "强制æµæ°´çº¿é…ç½®"
msgid "AdminSettings|Requires %{linkStart}email notifications%{linkEnd}"
-msgstr ""
+msgstr "éœ€è¦ %{linkStart}电å­é‚®ä»¶é€šçŸ¥%{linkEnd}"
msgid "AdminSettings|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
msgstr "按 IP 地å€é™åˆ¶ç¾¤ç»„访问。%{link_start}了解更多%{link_end}。"
@@ -2661,10 +2692,10 @@ msgid "AdminSettings|Select to disable public access for Pages sites, which requ
msgstr "选择ç¦ç”¨Pages站点的公开访问æƒé™ï¼Œè¿™éœ€è¦ç”¨æˆ·ç™»å½•æ‰èƒ½è®¿é—®æ‚¨çš„Pages站点。 %{link_start}了解更多。%{link_end}"
msgid "AdminSettings|Send email to maintainers after project is inactive for"
-msgstr ""
+msgstr "在项目处于éžæ´»è·ƒçŠ¶æ€åŽå‘é€ç”µå­é‚®ä»¶ç»™ç»´æŠ¤è€…"
msgid "AdminSettings|Send warning email"
-msgstr ""
+msgstr "å‘é€è­¦å‘Šç”µå­é‚®ä»¶"
msgid "AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}."
msgstr "æœåŠ¡ping在é…置文件中被ç¦ç”¨ï¼Œæ— æ³•é€šè¿‡æ­¤è¡¨å•å¯ç”¨ã€‚有关更多信æ¯ï¼Œè¯·å‚阅有关%{link_start}åœç”¨æœåŠ¡ping%{link_end}的文档。"
@@ -2685,7 +2716,7 @@ msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unl
msgstr "设置æ¯ä¸ªé¡¹ç›®çš„GitLab Pagesçš„æœ€å¤§å¤§å° ï¼ˆ0表示无é™åˆ¶ï¼‰ã€‚%{link_start}了解更多信æ¯ã€‚%{link_end}"
msgid "AdminSettings|Setting must be greater than 0."
-msgstr ""
+msgstr "设置必须大于 0。"
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Pages é™æ€ç«™ç‚¹çš„大å°å’ŒåŸŸå设置。"
@@ -2721,13 +2752,13 @@ msgid "AdminSettings|When paused, GitLab still tracks the changes. This is usefu
msgstr "当暂åœæ—¶ï¼Œç³»ç»Ÿä»åœ¨è·Ÿè¸ªæ›´æ”¹ï¼Œå¯¹äºŽé›†ç¾¤/索引è¿ç§»æ˜¯æœ‰ç”¨çš„。"
msgid "AdminSettings|When to delete inactive projects"
-msgstr ""
+msgstr "何时删除ä¸æ´»è·ƒçš„项目"
msgid "AdminSettings|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 "您å¯ä»¥å¯ç”¨æ³¨å†ŒåŠŸèƒ½ï¼Œå› ä¸ºæœåŠ¡Pingå·²å¯ç”¨ã€‚ 为了将æ¥ç»§ç»­ä½¿ç”¨æ³¨å†ŒåŠŸèƒ½ï¼Œæ‚¨è¿˜éœ€è¦é€šè¿‡æ–°çš„云端许å¯æœåŠ¡åœ¨ GitLab 注册。"
msgid "AdminSettings|You can't delete projects before the warning email is sent."
-msgstr ""
+msgstr "在å‘é€è­¦å‘Šç”µå­é‚®ä»¶ä¹‹å‰ï¼Œæ‚¨æ— æ³•åˆ é™¤é¡¹ç›®ã€‚"
msgid "AdminStatistics|Active Users"
msgstr "激活用户"
@@ -2780,8 +2811,8 @@ msgstr "未å¯ç”¨åŒé‡è®¤è¯"
msgid "AdminUsers|2FA Enabled"
msgstr "å¯ç”¨åŒé‡è®¤è¯"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "用户å¯ä»¥è¾“入信用å¡/借记å¡è¿›è¡ŒéªŒè¯ï¼Œæˆ–者管ç†å‘˜å¯ä»¥æ‰‹åŠ¨éªŒè¯ç”¨æˆ·ã€‚"
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
+msgstr "用户å¯ä»¥è¾“入信用å¡/借记å¡ï¼Œæˆ–者管ç†å‘˜å¯ä»¥æ‰‹åŠ¨éªŒè¯ç”¨æˆ·ã€‚已验è¯çš„用户å¯ä»¥åœ¨å…±äº« runner 上使用å…费的 CI 分钟数。"
msgid "AdminUsers|Access"
msgstr "访问类型"
@@ -2789,6 +2820,9 @@ msgstr "访问类型"
msgid "AdminUsers|Access Git repositories"
msgstr "访问 Git 仓库"
+msgid "AdminUsers|Access level"
+msgstr "访问级别"
+
msgid "AdminUsers|Access the API"
msgstr "访问 API"
@@ -2831,6 +2865,9 @@ msgstr "审计员å¯ä»¥åªè¯»è®¿é—®æ‰€æœ‰ç¾¤ç»„ã€é¡¹ç›®å’Œç”¨æˆ·ã€‚"
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "自动标记为默认内部用户"
+msgid "AdminUsers|Avatar"
+msgstr "头åƒ"
+
msgid "AdminUsers|Ban user"
msgstr "å°ç¦ç”¨æˆ·"
@@ -2858,6 +2895,9 @@ msgstr "å·²ç¦ç”¨"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "ç¦ç”¨ç”¨æˆ·å…·æœ‰ä»¥ä¸‹æ•ˆæžœï¼š"
+msgid "AdminUsers|Can create group"
+msgstr "å¯ä»¥åˆ›å»ºç¾¤ç»„"
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "无法登录或访问实例信æ¯"
@@ -2933,6 +2973,12 @@ msgstr "自己ï¼"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr "了解更多关于 %{link_start}å°ç¦ç”¨æˆ·ã€‚%{link_end}"
+msgid "AdminUsers|Limits"
+msgstr "é™åˆ¶"
+
+msgid "AdminUsers|Linkedin"
+msgstr "Linkedin"
+
msgid "AdminUsers|Locked"
msgstr "å·²é”定"
@@ -2960,6 +3006,9 @@ msgstr "个人项目将被ä¿ç•™"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "个人项目ã€ç¾¤ç»„和用户历å²å°†ä¿æŒä¸å˜"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr "CI/CD 分钟数é…é¢"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "é‡æ–°æ¿€æ´»ç”¨æˆ·å°†ä¼šï¼š"
@@ -2978,6 +3027,9 @@ msgstr "æ‹’ç»ç”¨æˆ· %{username}?"
msgid "AdminUsers|Rejected users:"
msgstr "已拒ç»çš„用户: "
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr "将生æˆé‡ç½®é“¾æŽ¥å¹¶å‘é€ç»™ç”¨æˆ·ã€‚用户将被迫在首次登录时设置密ç ã€‚"
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "æ¢å¤ç”¨æˆ·è®¿é—®è´¦æˆ·ï¼ŒåŒ…括网页ã€Gitå’ŒAPI。"
@@ -2990,9 +3042,15 @@ msgstr "æœç´¢ç”¨æˆ·"
msgid "AdminUsers|Send email to users"
msgstr "å‘用户å‘é€ç”µå­é‚®ä»¶"
+msgid "AdminUsers|Skype"
+msgstr "Skype"
+
msgid "AdminUsers|Sort by"
msgstr "排åºæ–¹å¼"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr "群组æ¯æœˆå¯ä»¥åœ¨å…±äº« runner 上使用的最大 CI/CD 分钟数。设置为 0 表示无é™åˆ¶ã€‚设置为空表示继承全局设置 %{minutes}"
+
msgid "AdminUsers|The user can't access git repositories."
msgstr "用户无法访问 git 仓库。"
@@ -3041,9 +3099,6 @@ msgstr "确定解é”%{username}用户å—?"
msgid "AdminUsers|User administration"
msgstr "用户管ç†"
-msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr "用户已ç»è¿‡éªŒè¯ï¼Œå¯ä»¥åœ¨å…±äº«Runner上使用å…è´¹ CI 分钟。"
-
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "用户将无法访问git仓库"
@@ -3062,6 +3117,9 @@ msgstr "验è¯ç”¨æˆ·å¸æˆ·"
msgid "AdminUsers|View pending member requests"
msgstr "查看待处ç†çš„æˆå‘˜è¯·æ±‚"
+msgid "AdminUsers|Website URL"
+msgstr "网站 URL"
+
msgid "AdminUsers|What can I do?"
msgstr "我å¯ä»¥åšä»€ä¹ˆï¼Ÿ"
@@ -3128,6 +3186,9 @@ msgstr "用户上é™"
msgid "Administration"
msgstr "管ç†"
+msgid "Administrators"
+msgstr "管ç†å‘˜"
+
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 "新加入的用户必须ç»è¿‡ç³»ç»Ÿç®¡ç†å‘˜å®¡æ ¸ä¸Žæ‰¹å‡†ã€‚了解更多关于%{help_link_start}用户数å°é¡¶%{help_link_end}çš„ä¿¡æ¯ã€‚"
@@ -3168,7 +3229,7 @@ msgid "Advanced export options"
msgstr "高级导出选项"
msgid "AdvancedSearch|Elasticsearch version not compatible"
-msgstr ""
+msgstr "Elasticsearch 版本ä¸å…¼å®¹"
msgid "AdvancedSearch|Reindex required"
msgstr "需è¦é‡æ–°ç´¢å¼•"
@@ -3606,7 +3667,10 @@ msgid "All protected branches"
msgstr "所有å—ä¿æŠ¤çš„分支"
msgid "All threads resolved!"
-msgstr ""
+msgstr "所有主题已解决ï¼"
+
+msgid "All users in this group must set up two-factor authentication"
+msgstr "此群组中的所有用户必须设置åŒé‡éªŒè¯"
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr "所有用户必须接å—æœåŠ¡æ¡æ¬¾å’Œéšç§æ”¿ç­–æ‰èƒ½è®¿é—® GitLab"
@@ -3620,12 +3684,6 @@ msgstr "所有具有匹é…å¡ç‰‡çš„用户"
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "å…许“%{group_name}â€ä»¥æ‚¨çš„身份登录"
-msgid "Allow access only to members of this group"
-msgstr "åªå…许该群组的æˆå‘˜è®¿é—®"
-
-msgid "Allow access to everyone"
-msgstr "å…许所有人访问"
-
msgid "Allow access to members of the following group"
msgstr "å…许访问以下群组的æˆå‘˜"
@@ -3668,9 +3726,6 @@ msgstr "å…许该群组中的项目使用Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr "å…许所有人访问æµæ°´çº¿å’Œä½œä¸šè¯¦æƒ…,包括输出日志和产物。"
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr "å…许å­ç»„设置自己的åŒé‡è®¤è¯è§„则"
-
msgid "Allow this key to push to this repository"
msgstr "å…许此密钥推é€åˆ°è¿™ä¸ªä»“库"
@@ -3683,9 +3738,6 @@ msgstr "å…许用户关闭广播消æ¯"
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "å…许用户注册任何应用程åºï¼Œä½¿ç”¨ GitLab 作为 OAuth æ供者"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "å…许用户请求访问(如果å¯è§æ€§æ˜¯å…¬å¼€æˆ–内部的)"
-
msgid "Allowed"
msgstr "å·²å…许"
@@ -3698,12 +3750,18 @@ msgstr "å…许使用电å­é‚®ä»¶åŸŸåé™åˆ¶ä»…å¯ç”¨äºŽé¡¶çº§ç¾¤ç»„"
msgid "Allowed to create:"
msgstr "å…许创建:"
+msgid "Allowed to delete projects"
+msgstr "å…许删除项目"
+
msgid "Allowed to fail"
msgstr "å…许失败"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr "å…许该组中的项目或å­ç»„覆盖全局设置。"
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr "å…许项目使用 Opstrace 集æˆè·Ÿè¸ªé”™è¯¯ã€‚"
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "这里å¯ä»¥æ·»åŠ å’Œç®¡ç† Kubernetes 集群。"
@@ -3863,6 +3921,9 @@ msgstr "èŽ·å– Markdown 预览时出错"
msgid "An error occurred while fetching ancestors"
msgstr "获å–上级时å‘生错误"
+msgid "An error occurred while fetching branches."
+msgstr "获å–分支时å‘生错误。"
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "获å–分支时å‘生错误,请é‡è¯•æœç´¢ã€‚"
@@ -4082,6 +4143,9 @@ msgstr "获å–差异文件时å‘生错误"
msgid "An error occurred while retrieving projects."
msgstr "获å–项目时å‘生错误。"
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr "检索您的设置时出错。é‡æ–°åŠ è½½é¡µé¢ä»¥é‡è¯•ã€‚"
+
msgid "An error occurred while saving changes: %{error}"
msgstr "ä¿å­˜æ›´æ”¹æ—¶å‘生错误:%{error}"
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] "ä¿å­˜è®¾ç½®æ—¶å‘生错误。"
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr "ä¿å­˜æ‚¨çš„设置时å‘生错误。请å°è¯•å†æ¬¡ä¿å­˜ã€‚"
+
msgid "An error occurred while subscribing to notifications."
msgstr "订阅通知时å‘生错误。"
@@ -4096,7 +4163,7 @@ msgid "An error occurred while triggering the job."
msgstr "触å‘作业时å‘生错误。"
msgid "An error occurred while trying to follow this user, please try again."
-msgstr ""
+msgstr "试图关注这个用户时出错,请é‡è¯•ã€‚"
msgid "An error occurred while trying to generate the report. Please try again later."
msgstr "å°è¯•ç”ŸæˆæŠ¥å‘Šæ—¶å‡ºé”™ã€‚请ç¨åŽå†è¯•ã€‚"
@@ -4105,7 +4172,7 @@ msgid "An error occurred while trying to run a new pipeline for this merge reque
msgstr "å°è¯•ä¸ºæ­¤åˆå¹¶è¯·æ±‚è¿è¡Œæ–°æµæ°´çº¿æ—¶å‘生错误。"
msgid "An error occurred while trying to unfollow this user, please try again."
-msgstr ""
+msgstr "试图å–消关注这个用户时出错,请é‡è¯•ã€‚"
msgid "An error occurred while unsubscribing to notifications."
msgstr "å–消订阅通知时å‘生错误。"
@@ -4296,6 +4363,9 @@ msgstr "应用程åºé™åˆ¶ä¿å­˜æˆåŠŸ"
msgid "Application settings saved successfully"
msgstr "应用程åºè®¾ç½®ä¿å­˜æˆåŠŸ"
+msgid "Application settings saved successfully."
+msgstr "应用程åºè®¾ç½®å·²æˆåŠŸä¿å­˜ã€‚"
+
msgid "Application settings update failed"
msgstr "应用程åºè®¾ç½®æ›´æ–°å¤±è´¥"
@@ -4628,10 +4698,10 @@ msgid "Approved-By"
msgstr "已核准"
msgid "Approved. Your attention request was removed."
-msgstr ""
+msgstr "已核准。您的关注请求已被删除。"
msgid "Approver"
-msgstr "审批人"
+msgstr "核准人"
msgid "Approvers"
msgstr "核准人"
@@ -4675,7 +4745,7 @@ msgstr "已归档项目ï¼ä»“库和其他项目资æºå‡ä¸ºåªè¯»"
msgid "Archived projects"
msgstr "归档项目"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr "归档项目将使其完全åªè¯»ã€‚仪表æ¿ä¸­å’Œæœç´¢ç»“果中都ä¸ä¼šå‡ºçŽ°è¯¥é¡¹ç›®ã€‚%{strong_start}代ç å°†æ— æ³•æ交到仓库,也无法创建任何议题ã€è¯„论或其它对象。%{strong_end}%{link_start}了解详情。%{link_end}"
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4703,7 +4773,7 @@ msgid "Are you sure you want to attempt to merge?"
msgstr "您确定è¦å°è¯•åˆå¹¶å—?"
msgid "Are you sure you want to cancel editing this %{commentType}?"
-msgstr ""
+msgstr "您确定è¦å–消编辑这个%{commentType}å—?"
msgid "Are you sure you want to close this blocked issue?"
msgstr "您确定è¦å…³é—­æ­¤è¢«å—阻的议题å—?"
@@ -4715,7 +4785,7 @@ msgid "Are you sure you want to delete these artifacts?"
msgstr "确定è¦åˆ é™¤è¿™äº›äº§ç‰©å—?"
msgid "Are you sure you want to delete this %{commentType}?"
-msgstr ""
+msgstr "您确定è¦åˆ é™¤%{commentType}å—?"
msgid "Are you sure you want to delete this SSH key?"
msgstr "您确定è¦åˆ é™¤æ­¤SSH密钥å—?"
@@ -4778,6 +4848,9 @@ msgstr "您确定è¦åˆ é™¤ %{email}å—?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "确定移除群组 %{group_name} å—?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr "您确定è¦ç§»é™¤è¯é¢˜ %{topic_name} å—?"
+
msgid "Are you sure you want to remove the attachment?"
msgstr "您确定è¦åˆ é™¤æ­¤é™„件?"
@@ -4796,6 +4869,9 @@ msgstr "您确定è¦åˆ é™¤æ­¤åˆ—表å—?"
msgid "Are you sure you want to remove this nickname?"
msgstr "您确定è¦åˆ é™¤æ­¤æ˜µç§°å—?"
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "确定è¦é‡ç½®è¿è¡ŒçŠ¶å†µæ£€æŸ¥ä»¤ç‰Œå—?"
@@ -4806,7 +4882,7 @@ msgid "Are you sure you want to retry this migration?"
msgstr "确定è¦é‡è¯•æ­¤è¿ç§»å—?"
msgid "Are you sure you want to revoke this %{accessTokenType}? This action cannot be undone."
-msgstr ""
+msgstr "您确定è¦æ’¤é”€%{accessTokenType}嘛?此æ“作ä¸èƒ½æ’¤é”€ã€‚"
msgid "Are you sure you want to revoke this %{type}? This action cannot be undone."
msgstr "您确定è¦æ’¤é”€æ­¤%{type}å—?此æ“作ä¸å¯é€†ã€‚"
@@ -4913,6 +4989,9 @@ msgstr "指派标记"
msgid "Assign milestone"
msgstr "分é…里程碑"
+msgid "Assign myself"
+msgstr "指派给自己"
+
msgid "Assign reviewer"
msgstr "指派审核者"
@@ -4962,7 +5041,7 @@ msgid "Assigned to you"
msgstr "分é…给您的"
msgid "Assigned user(s). Your attention request was removed."
-msgstr ""
+msgstr "已指派用户。您的关注请求已被删除。"
msgid "Assignee"
msgid_plural "%d Assignees"
@@ -4996,10 +5075,10 @@ msgid "At least one of group_id or project_id must be specified"
msgstr "必须指定至少一个group_id或 project_id"
msgid "At least one of your Personal Access Tokens is expired. %{generate_new}"
-msgstr ""
+msgstr "您的个人访问令牌中至少有一个已过期。%{generate_new}"
msgid "At least one of your Personal Access Tokens will expire soon. %{generate_new}"
-msgstr ""
+msgstr "您的个人访问令牌中至少有一个å³å°†è¿‡æœŸã€‚%{generate_new}"
msgid "At risk"
msgstr "存在风险"
@@ -5007,9 +5086,6 @@ msgstr "存在风险"
msgid "Attach a file"
msgstr "添加附件"
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "拖放文件到此处或%{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr "附加文件中 - %{progress}"
@@ -5080,6 +5156,9 @@ msgstr "本月"
msgid "AuditLogs|User Events"
msgstr "用户事件"
+msgid "AuditStreams|A header with this name already exists."
+msgstr "æ­¤å称的 header 已存在。"
+
msgid "AuditStreams|Active"
msgstr "有效"
@@ -5104,6 +5183,9 @@ msgstr "获å–外部审计事件æµæ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
msgid "AuditStreams|Cancel editing"
msgstr "å–消编辑"
+msgid "AuditStreams|Custom HTTP headers"
+msgstr "自定义 HTTP headers"
+
msgid "AuditStreams|Delete %{link}"
msgstr "删除 %{link}"
@@ -5113,6 +5195,12 @@ msgstr "目的地 URL"
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "目的地接收所有审计事件数æ®"
+msgid "AuditStreams|Header"
+msgstr "Header"
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr "已达到最多 %{number} 个 HTTP headers。"
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "为审计事件设置事件æµ"
@@ -5128,6 +5216,9 @@ msgstr "å¯èƒ½åŒ…括æ•æ„Ÿä¿¡æ¯ï¼Œè¯·ç¡®ä¿æ‚¨ä¿¡ä»»ç›®çš„地端点。"
msgid "AuditStreams|This is great for keeping everything one place."
msgstr "éžå¸¸é€‚åˆå°†æ‰€æœ‰æ•°æ®ä¿å­˜åœ¨ä¸€ä¸ªåœ°æ–¹ã€‚"
+msgid "AuditStreams|Value"
+msgstr "值"
+
msgid "Aug"
msgstr "8月"
@@ -5408,25 +5499,25 @@ msgid "Background color"
msgstr "背景颜色"
msgid "BackgroundMigrations|Background Migrations"
-msgstr ""
+msgstr "åŽå°è¿ç§»"
msgid "BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "当一个数æ®è¿ç§»è¶…过我们指å—中的时间é™åˆ¶æ—¶ï¼Œä½¿ç”¨åŽå°è¿ç§»æ‰§è¡Œæ•°æ®è¿ç§»ã€‚%{linkStart}了解更多%{linkEnd}"
msgid "BackgroundMigrations|Batch size"
-msgstr ""
+msgstr "批处ç†å¤§å°"
msgid "BackgroundMigrations|Database"
-msgstr ""
+msgstr "æ•°æ®åº“"
msgid "BackgroundMigrations|Failed jobs:"
-msgstr ""
+msgstr "失败的作业:"
msgid "BackgroundMigrations|Finished at"
-msgstr ""
+msgstr "完æˆäºŽ"
msgid "BackgroundMigrations|Started at"
-msgstr ""
+msgstr "开始于"
msgid "Badges"
msgstr "徽章"
@@ -5519,10 +5610,10 @@ msgid "BambooService|Bamboo service root URL."
msgstr "BambooæœåŠ¡æ ¹URL。"
msgid "BambooService|Enter new build key"
-msgstr ""
+msgstr "输入新的构建密钥"
msgid "BambooService|Leave blank to use your current build key."
-msgstr ""
+msgstr "留空将使用您当å‰çš„构建密钥。"
msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo."
msgstr "用Atlassian Bambooè¿è¡ŒCI/CDæµæ°´çº¿ã€‚"
@@ -5543,76 +5634,76 @@ msgid "Batch size"
msgstr "批é‡å¤§å°"
msgid "Batched Job|Background Migrations"
-msgstr ""
+msgstr "åŽå°è¿ç§»"
msgid "Batched Job|Batched Job (Id: %{id})"
-msgstr ""
+msgstr "批处ç†ä½œä¸šï¼ˆID:%{id})"
msgid "BatchedJob|Attempts"
-msgstr ""
+msgstr "å°è¯•"
msgid "BatchedJob|Batch size"
-msgstr ""
+msgstr "批处ç†å¤§å°"
msgid "BatchedJob|Batched Jobs"
-msgstr ""
+msgstr "批处ç†ä½œä¸š"
msgid "BatchedJob|Created At"
-msgstr ""
+msgstr "创建于"
msgid "BatchedJob|Created at"
-msgstr ""
+msgstr "创建于"
msgid "BatchedJob|Exception Class"
-msgstr ""
+msgstr "异常类"
msgid "BatchedJob|Exception Message"
-msgstr ""
+msgstr "异常消æ¯"
msgid "BatchedJob|Exception class"
-msgstr ""
+msgstr "异常类"
msgid "BatchedJob|Exception message"
-msgstr ""
+msgstr "异常消æ¯"
msgid "BatchedJob|Finished at"
-msgstr ""
+msgstr "完æˆäºŽ"
msgid "BatchedJob|Max Value"
-msgstr ""
+msgstr "最大值"
msgid "BatchedJob|Max value"
-msgstr ""
+msgstr "最大值"
msgid "BatchedJob|Min Value"
-msgstr ""
+msgstr "最å°å€¼"
msgid "BatchedJob|Min value"
-msgstr ""
+msgstr "最å°å€¼"
msgid "BatchedJob|Next Status"
-msgstr ""
+msgstr "下一个状æ€"
msgid "BatchedJob|Next status"
-msgstr ""
+msgstr "下一个状æ€"
msgid "BatchedJob|Pause ms"
-msgstr ""
+msgstr "æš‚åœæ—¶é—´ï¼ˆæ¯«ç§’)"
msgid "BatchedJob|Pause time (ms)"
-msgstr ""
+msgstr "æš‚åœæ—¶é—´ï¼ˆæ¯«ç§’)"
msgid "BatchedJob|Previous Status"
-msgstr ""
+msgstr "上一个状æ€"
msgid "BatchedJob|Previous status"
-msgstr ""
+msgstr "上一个状æ€"
msgid "BatchedJob|Started at"
-msgstr ""
+msgstr "开始于"
msgid "BatchedJob|Transition logs:"
-msgstr ""
+msgstr "转æ¢æ—¥å¿—:"
msgid "Be careful. Changing the project's namespace can have unintended side effects."
msgstr "请注æ„,更改项目的命å空间å¯èƒ½ä¼šäº§ç”Ÿéžé¢„期的副作用。"
@@ -5620,9 +5711,6 @@ msgstr "请注æ„,更改项目的命å空间å¯èƒ½ä¼šäº§ç”Ÿéžé¢„期的副作
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "请注æ„,é‡å‘½å项目的仓库å¯èƒ½ä¼šäº§ç”Ÿéžé¢„期的副作用。"
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr "在å¯ç”¨æ­¤é›†æˆä¹‹å‰ï¼Œè¯·åœ¨ Google Chat 中为您希望从该项目接收通知的房间创建一个 webhook。 %{docs_link}"
@@ -5654,49 +5742,49 @@ msgid "Billing"
msgstr "计费"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
-msgstr ""
+msgstr "%{group_name} 正在使用 %{plan_name} 方案"
msgid "BillingPlans|10,000 CI/CD minutes per month"
-msgstr ""
+msgstr "æ¯æœˆ 10,000 CI/CD 分钟数"
msgid "BillingPlans|10GB transfer per month"
-msgstr ""
+msgstr "æ¯æœˆ 10GB 传输"
msgid "BillingPlans|400 CI/CD minutes per month"
-msgstr ""
+msgstr "æ¯æœˆ 400 CI/CD 分钟数"
msgid "BillingPlans|5 users per namespace"
-msgstr ""
+msgstr "æ¯ä¸ªå‘½å空间 5 个用户"
msgid "BillingPlans|50,000 CI/CD minutes per month"
-msgstr ""
+msgstr "æ¯æœˆ 50,000 CI/CD 分钟数"
msgid "BillingPlans|5GB storage"
-msgstr ""
+msgstr "5GB 存储空间"
msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
msgstr "%{user_name},您正在使用%{plan_name}计划。"
msgid "BillingPlans|Advanced CI/CD"
-msgstr ""
+msgstr "高级 CI/CD"
msgid "BillingPlans|All plans have unlimited (private) repositories."
-msgstr ""
+msgstr "所有方案都有无é™çš„(ç§æœ‰ï¼‰ä»“库。"
msgid "BillingPlans|All the features from Free"
-msgstr ""
+msgstr "å…费版æ供的所有功能"
msgid "BillingPlans|All the features from Premium"
-msgstr ""
+msgstr "专业版æ供的所有功能"
msgid "BillingPlans|Billed annually at %{price_per_year} USD"
-msgstr ""
+msgstr "æ¯å¹´ä»˜è´¹ %{price_per_year} USD"
msgid "BillingPlans|Check out all groups"
-msgstr ""
+msgstr "查看所有群组"
msgid "BillingPlans|Compliance"
-msgstr ""
+msgstr "åˆè§„"
msgid "BillingPlans|Congratulations, your free trial is activated."
msgstr "æ­å–œï¼Œæ‚¨çš„试用计划已å¯ç”¨ã€‚"
@@ -5705,19 +5793,19 @@ msgid "BillingPlans|End of availability for the Bronze Plan"
msgstr "Bronze方案已ä¸å¯ç”¨"
msgid "BillingPlans|Enhance team productivity and collaboration"
-msgstr ""
+msgstr "æ高团队效能和å作"
msgid "BillingPlans|Enterprise agile planning"
-msgstr ""
+msgstr "ä¼ä¸šæ•æ·è§„划"
msgid "BillingPlans|Faster code reviews"
-msgstr ""
+msgstr "更快的代ç è¯„审"
msgid "BillingPlans|Free forever features for individual users"
-msgstr ""
+msgstr "为个人用户永久æä¾›å…费功能"
msgid "BillingPlans|Free guest users"
-msgstr ""
+msgstr "å…费访客用户"
msgid "BillingPlans|Free upgrade!"
msgstr "å…è´¹å‡çº§ï¼"
@@ -5726,10 +5814,10 @@ msgid "BillingPlans|If you would like to downgrade your plan please contact %{su
msgstr "如果您想è¦é™çº§æ‚¨çš„订阅计划,请è”ç³»%{support_link_start}客户支æŒ%{support_link_end}。"
msgid "BillingPlans|Includes free static websites"
-msgstr ""
+msgstr "包括å…è´¹é™æ€ç½‘ç«™"
msgid "BillingPlans|Learn more"
-msgstr ""
+msgstr "了解更多"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
msgstr "å¯ä»¥é˜…读%{faq_link}了解更多付费方案细节,或者开始为期30天的旗舰版试用。"
@@ -5741,61 +5829,61 @@ msgid "BillingPlans|Looking to purchase or manage a subscription for your group?
msgstr "想è¦ä¸ºæ‚¨çš„群组购买或管ç†è®¢é˜…?导航到您的 %{groups_link} 并转到 %{strong_open}设置 &gt; 计费。%{strong_close}"
msgid "BillingPlans|Loved and trusted by our customers"
-msgstr ""
+msgstr "æ·±å—客户喜爱和信赖"
msgid "BillingPlans|Manage plan"
msgstr "管ç†è®¡åˆ’"
msgid "BillingPlans|Not the group you're looking for? %{all_groups_link}."
-msgstr ""
+msgstr "ä¸æ˜¯æ‚¨æƒ³è¦æ‰¾çš„群组? %{all_groups_link}。"
msgid "BillingPlans|Open Source - MIT License"
-msgstr ""
+msgstr "å¼€æº - MIT 许å¯è¯"
msgid "BillingPlans|Organization wide security, compliance and planning"
-msgstr ""
+msgstr "组织内的安全ã€åˆè§„和规划"
msgid "BillingPlans|Portfolio management"
-msgstr ""
+msgstr "组åˆç®¡ç†"
msgid "BillingPlans|Premium"
-msgstr ""
+msgstr "专业版"
msgid "BillingPlans|Pricing page"
msgstr "定价页é¢"
msgid "BillingPlans|Ready to explore the value of the paid features today? Start a trial, no credit card required."
-msgstr ""
+msgstr "准备好探索付费功能了å—?开始试用,无需信用å¡ã€‚"
msgid "BillingPlans|Recommended"
-msgstr ""
+msgstr "推è"
msgid "BillingPlans|Release controls"
-msgstr ""
+msgstr "å‘布控制"
msgid "BillingPlans|Security risk mitigation"
-msgstr ""
+msgstr "é™ä½Žå®‰å…¨é£Žé™©"
msgid "BillingPlans|See all %{plan_name} features"
msgstr "查看 %{plan_name} 计划中的功能"
msgid "BillingPlans|Self-managed reliability"
-msgstr ""
+msgstr "ç§æœ‰åŒ–部署的å¯é æ€§"
msgid "BillingPlans|Spans the DevOps lifecycle"
-msgstr ""
+msgstr "跨越 DevOps 生命周期"
msgid "BillingPlans|Start a free Ultimate trial"
-msgstr ""
+msgstr "开始å…费试用"
msgid "BillingPlans|Still have questions?"
-msgstr ""
+msgstr "还有问题?"
msgid "BillingPlans|Support"
-msgstr ""
+msgstr "支æŒ"
msgid "BillingPlans|Talk to an expert today."
-msgstr ""
+msgstr "今天与一å专家交谈。"
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "使用与其父项目一致的计划"
@@ -5804,19 +5892,19 @@ msgid "BillingPlans|To manage the plan for this group, visit the billing section
msgstr "访问%{parent_billing_page_link}的计费部分以管ç†è¯¥é¡¹ç›®çš„订阅计划。"
msgid "BillingPlans|Ultimate"
-msgstr ""
+msgstr "旗舰版"
msgid "BillingPlans|Upgrade to Premium"
-msgstr ""
+msgstr "å‡çº§åˆ°ä¸“业版"
msgid "BillingPlans|Upgrade to Ultimate"
-msgstr ""
+msgstr "å‡çº§åˆ°æ——舰版"
msgid "BillingPlans|Value stream management"
-msgstr ""
+msgstr "价值æµç®¡ç†"
msgid "BillingPlans|We're here to help."
-msgstr ""
+msgstr "我们éšæ—¶ä¸ºæ‚¨æ供帮助。"
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "虽然 GitLab å°†åœæ­¢ä½¿ç”¨ Bronze 方案,但您ä»ç„¶å¯ä»¥åœ¨ %{eoa_bronze_plan_end_date} 之å‰å†ç»­è®¢ä¸€æ¬¡ Bronze 订阅。 我们还æä¾›é™æ—¶å…è´¹å‡çº§åˆ°æˆ‘们的高级方案(最多 25 ä¸ªç”¨æˆ·ï¼‰ï¼ åœ¨æˆ‘ä»¬çš„ %{announcement_link} 中了解有关改å˜å’Œä¼˜æƒ çš„更多信æ¯ã€‚"
@@ -5834,7 +5922,7 @@ msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can
msgstr "您的GitLab.com试用已于%{expiration_date}到期。您å¯ä»¥é€šè¿‡ä»¥ä¸‹å‡çº§éšæ—¶æ¢å¤å¯¹åŠŸèƒ½çš„访问。"
msgid "BillingPlans|Your current plan"
-msgstr ""
+msgstr "您的当å‰è®¡åˆ’"
msgid "BillingPlans|billed annually at %{price_per_year}"
msgstr "æ¯å¹´æ”¯ä»˜%{price_per_year}"
@@ -5855,7 +5943,7 @@ msgid "BillingPlans|per user"
msgstr "æ¯ç”¨æˆ·"
msgid "BillingPlans|per user/month"
-msgstr ""
+msgstr "æ¯ä¸ªç”¨æˆ·/月"
msgid "BillingPlan|Upgrade"
msgstr "å‡çº§"
@@ -5885,10 +5973,10 @@ msgid "Billings|Extend trial"
msgstr "延长试用期"
msgid "Billings|Free groups are limited to %{number} seats."
-msgstr ""
+msgstr "å…费群组仅é™äºŽ %{number} 个席ä½ã€‚"
msgid "Billings|In a seat"
-msgstr ""
+msgstr "å ç”¨å¸­ä½"
msgid "Billings|Reactivate trial"
msgstr "é‡æ–°æ¿€æ´»è¯•ç”¨"
@@ -5903,10 +5991,10 @@ msgid "Billings|Shared runners cannot be enabled until a valid credit card is on
msgstr "Shared runners 无法å¯ç”¨ï¼Œç›´åˆ°æœ‰æ•ˆçš„信用å¡åœ¨æ¡£ã€‚"
msgid "Billings|The last owner cannot be removed from a seat."
-msgstr ""
+msgstr "ä¸èƒ½ç§»é™¤å¸­ä½ä¸­çš„最åŽä¸€ä½æ‹¥æœ‰è€…。"
msgid "Billings|To make this member active, you must first remove an existing active member, or toggle them to over limit."
-msgstr ""
+msgstr "è¦ä½¿æ­¤æˆå‘˜å¤„于å¯ç”¨çŠ¶æ€ï¼Œæ‚¨å¿…须先删除现有的活动æˆå‘˜ï¼Œæˆ–将其切æ¢ä¸ºè¶…出é™åˆ¶ã€‚"
msgid "Billings|To use free CI/CD minutes on shared runners, you’ll need to validate your account with a credit 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 your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr "è¦åœ¨ shared runners上使用å…è´¹ CI/CD 分钟,您需è¦ä½¿ç”¨ä¿¡ç”¨å¡éªŒè¯æ‚¨çš„å¸æˆ·ã€‚如果您ä¸æƒ³æ供,您å¯ä»¥é€šè¿‡ä¸ºæ‚¨çš„项目带æ¥è‡ªå·±çš„ runner 并ç¦ç”¨ shared runners æ¥è¿è¡Œæµæ°´çº¿ã€‚这是阻止和å‡å°‘对 GitLab 基础设施的滥用所必需的。 %{strongStart}GitLab ä¸ä¼šå¯¹æ‚¨çš„å¡å·æ‰£è´¹ï¼Œå®ƒåªä¼šç”¨äºŽéªŒè¯æ‚¨çš„身份。%{strongEnd} %{linkStart}了解更多%{linkEnd}"
@@ -5924,10 +6012,10 @@ msgid "Billings|Validate user account"
msgstr "验è¯ç”¨æˆ·å¸æˆ·"
msgid "Billings|You can't change the seat status of a user who was invited via a group or project."
-msgstr ""
+msgstr "您无法更改通过群组或项目邀请的用户的席ä½çŠ¶æ€ã€‚"
msgid "Billings|You can't remove yourself from a seat, but you can leave the group."
-msgstr ""
+msgstr "您无法将自己从席ä½ä¸Šç§»é™¤ï¼Œä½†æ‚¨å¯ä»¥ç¦»å¼€ç¾¤ç»„。"
msgid "Billings|You'll now be able to take advantage of free CI/CD minutes on shared runners."
msgstr "您现在å¯ä»¥åˆ©ç”¨å…±äº« runner çš„å…è´¹ CI/CD 分钟。"
@@ -5984,7 +6072,7 @@ msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
msgstr "GitLab 上的å…费群组é™åˆ¶ %{maxNamespaceSeats} 个席ä½"
msgid "Billing|From June 22, 2022 (GitLab 15.1), free groups will be limited to 5 members"
-msgstr ""
+msgstr "从 2022 å¹´ 6 月 22 日(15.1)开始,å…费群组将é™åˆ¶ä¸º 5 åæˆå‘˜"
msgid "Billing|Group invite"
msgstr "群组邀请"
@@ -6023,7 +6111,13 @@ msgid "Billing|You are about to remove user %{username} from your subscription.
msgstr "您将è¦ä»Žè®¢é˜…中删除用户%{username}。如果继续,该用户将从 %{namespace} 群组åŠå…¶æ‰€æœ‰å­ç»„和项目中删除。此æ“作无法撤消。"
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
-msgstr ""
+msgstr "您现在å¯ä»¥å¼€å§‹ç§»åŠ¨ %{namespaceName} 中的æˆå‘˜ã€‚当您关闭 %{strongStart}ä¸€ä¸ªå¸­ä½ %{strongEnd} 时,æˆå‘˜å°†å¤±åŽ»å¯¹ç¾¤ç»„çš„å­˜å–æƒé™ã€‚如果 2022 å¹´ 6 月 22 日之å‰å¯ç”¨äº†è¶…过 5 åæˆå‘˜çš„ %{strongStart}席ä½%{strongEnd},我们将选择 5 åæˆå‘˜ä¿æŒå­˜å–æƒé™ã€‚我们将首先计算具有拥有者和维护者角色的æˆå‘˜ï¼ŒæŽ¥ç€æ˜¯æœ€è¿‘活跃的æˆå‘˜ï¼Œç›´åˆ°è¾¾åˆ° 5 个æˆå‘˜ã€‚其余æˆå‘˜å°†å˜ä¸ºâ€œè¶…出é™åˆ¶â€çŠ¶æ€å¹¶å¤±åŽ»å¯¹è¯¥ç¾¤ç»„çš„å­˜å–æƒé™ã€‚"
+
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr "您的å…费群组现在é™åˆ¶ä¸º %{free_user_limit} åæˆå‘˜"
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr "您的群组最近更改为使用å…费版。å…费群组é™åˆ¶ä¸º %{free_user_limit} åæˆå‘˜ï¼Œå…¶ä½™æˆå‘˜å°†èŽ·å¾—超é™çŠ¶æ€å¹¶æ— æ³•è®¿é—®è¯¥ç¾¤ç»„。您å¯ä»¥é€šè¿‡åˆ é™¤ä¸å†éœ€è¦è®¿é—®æƒé™çš„æˆå‘˜ï¼Œæˆ–将其切æ¢ä¸ºè¶…é™ï¼Œæ¥ä¸ºæ–°æˆå‘˜é‡Šæ”¾ç©ºé—´ã€‚è¦èŽ·å¾—æ— é™æ•°é‡çš„æˆå‘˜ï¼Œæ‚¨å¯ä»¥%{link_start}å‡çº§%{link_end}到付费版。"
msgid "Bitbucket Server Import"
msgstr "BitbucketæœåŠ¡å™¨å¯¼å…¥"
@@ -6099,7 +6193,7 @@ msgid "BoardNewIssue|Select a project"
msgstr "选择一个项目"
msgid "BoardScope|%{iterationTitle} iteration in %{iterationCadence}"
-msgstr ""
+msgstr "%{iterationTitle} 迭代处于 %{iterationCadence}"
msgid "BoardScope|An error occurred while getting iterations. Please try again."
msgstr "获å–迭代时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -6135,7 +6229,7 @@ msgid "BoardScope|Current iteration"
msgstr "当å‰è¿­ä»£"
msgid "BoardScope|Don't filter milestone"
-msgstr ""
+msgstr "ä¸è¿‡æ»¤é‡Œç¨‹ç¢‘"
msgid "BoardScope|Edit"
msgstr "编辑"
@@ -6316,6 +6410,9 @@ msgstr "正在加载å²è¯—"
msgid "Bold text"
msgstr "加粗字体"
+msgid "Both SSH and HTTP(S)"
+msgstr "SSH 和 HTTP(S)"
+
msgid "Both project and dashboard_path are required"
msgstr "需è¦é¡¹ç›®å’Œä»ªè¡¨æ¿è·¯å¾„"
@@ -6347,7 +6444,7 @@ msgid "Branch not loaded - %{branchId}"
msgstr "分支未载入 - %{branchId}"
msgid "Branch rules"
-msgstr ""
+msgstr "分支规则"
msgid "Branches"
msgstr "分支"
@@ -6359,7 +6456,7 @@ msgid "Branches|Active branches"
msgstr "活跃分支"
msgid "Branches|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this branch."
-msgstr ""
+msgstr "确认并选择 %{strongStart}%{buttonText}%{strongEnd} åŽï¼Œæ‚¨æ— æ³•æ¢å¤æ­¤åˆ†æ”¯ã€‚"
msgid "Branches|All"
msgstr "全部"
@@ -6449,7 +6546,7 @@ msgid "Branches|The default branch cannot be deleted"
msgstr "无法删除默认分支"
msgid "Branches|This branch hasn't been merged into %{defaultBranchName}. To avoid data loss, consider merging this branch before deleting it."
-msgstr ""
+msgstr "此分支尚未åˆå¹¶åˆ° %{defaultBranchName} 中。为é¿å…æ•°æ®ä¸¢å¤±ï¼Œè¯·è€ƒè™‘在删除之å‰åˆå¹¶æ­¤åˆ†æ”¯ã€‚"
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
msgstr "è¦æ”¾å¼ƒæœ¬åœ°æ›´æ”¹å¹¶è¦†ç›–上游版本的分支,请在此处将其删除,然åŽé€‰æ‹©ä¸Šé¢çš„“立å³æ›´æ–°â€ã€‚"
@@ -6464,10 +6561,10 @@ msgid "Branches|Yes, delete protected branch"
msgstr "是的,删除å—ä¿æŠ¤çš„分支"
msgid "Branches|You're about to permanently delete the branch %{branchName}."
-msgstr ""
+msgstr "您将è¦æ°¸ä¹…删除分支 %{branchName}。"
msgid "Branches|You're about to permanently delete the protected branch %{branchName}."
-msgstr ""
+msgstr "您将è¦æ°¸ä¹…删除å—ä¿æŠ¤çš„分支 %{branchName}。"
msgid "Branches|diverged from upstream"
msgstr "与上游存在差异"
@@ -6581,7 +6678,7 @@ msgid "BulkImport|No additional information provided."
msgstr "未æ供其它信æ¯ã€‚"
msgid "BulkImport|No groups found"
-msgstr ""
+msgstr "未找到群组"
msgid "BulkImport|No history is available"
msgstr "没有历å²è®°å½•"
@@ -6590,7 +6687,7 @@ msgid "BulkImport|No parent"
msgstr "没有父级"
msgid "BulkImport|Only groups that you have the %{role} role for are listed as groups you can import."
-msgstr ""
+msgstr "åªæœ‰æ‚¨æœ‰ %{role} 角色的群组æ‰è¢«åˆ—为您å¯ä»¥å¯¼å…¥çš„群组。"
msgid "BulkImport|Project import history"
msgstr "项目导入历å²"
@@ -6602,10 +6699,10 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr "显示 %{start}-%{end} / %{total}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own from %{link}"
-msgstr ""
+msgstr "显示您在 %{link} 中拥有的 %{start}-%{end} / %{total}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} that you own matching filter \"%{filter}\" from %{link}"
-msgstr ""
+msgstr "显示您在 %{link} 中拥有的,且匹é…过滤器“%{filter}†的 %{start}-%{end} / %{total}"
msgid "BulkImport|Source"
msgstr "æº"
@@ -6637,11 +6734,14 @@ msgstr "需与项目关è”但是当å‰ä¸Žç¾¤ç»„å…³è”"
msgid "BulkImport|must be a group"
msgstr "必须为群组"
+msgid "Bullet list"
+msgstr "æ— åºåˆ—表"
+
msgid "Burndown chart"
msgstr "燃尽图"
msgid "BurndownChartLabel|Remaining"
-msgstr ""
+msgstr "剩余"
msgid "Burnup chart"
msgstr "燃起图"
@@ -6695,7 +6795,7 @@ msgid "CI Lint"
msgstr "CI Lint"
msgid "CI configuration validated, including all configuration added with the %{codeStart}include%{codeEnd} keyword. %{link}"
-msgstr ""
+msgstr "CI é…置已验è¯ï¼ŒåŒ…括使用 %{codeStart}include%{codeEnd} 关键字添加的所有é…置。%{link}"
msgid "CI settings"
msgstr "CI设置"
@@ -6719,7 +6819,7 @@ msgid "CI/CD configuration file"
msgstr "CI/CD é…置文件"
msgid "CI/CD limits"
-msgstr ""
+msgstr "CI/CD é™åˆ¶"
msgid "CI/CD minutes"
msgstr "CI/CD 分钟"
@@ -6733,6 +6833,9 @@ msgstr "%{percent}%{percentSymbol}"
msgid "CICDAnalytics|All time"
msgstr "全部时间"
+msgid "CICDAnalytics|Change failure rate"
+msgstr "更改失败率"
+
msgid "CICDAnalytics|Deployment frequency"
msgstr "部署频率"
@@ -6759,7 +6862,7 @@ msgid "CICDAnalytics|Shared Runners Usage"
msgstr "共享 Runner 的使用情况"
msgid "CICDAnalytics|Shared runner duration is the total runtime of all jobs that ran on shared runners"
-msgstr ""
+msgstr "共享 Runner 的时长是在共享 Runner 上è¿è¡Œçš„所有作业的总è¿è¡Œæ—¶é—´"
msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
msgstr "共享 runner æµæ°´çº¿åˆ†é’ŸæŒç»­æ—¶é—´ï¼ˆæŒ‰æœˆï¼‰"
@@ -6773,8 +6876,11 @@ msgstr "共享 Runner 的使用é‡æ˜¯åœ¨å…±äº« Runner 上è¿è¡Œçš„所有作业çš
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr "获å–å‘布统计信æ¯æ—¶å‡ºçŽ°é”™è¯¯"
+msgid "CICDAnalytics|Time to restore service"
+msgstr "æ¢å¤æœåŠ¡çš„时间"
+
msgid "CICDAnalytics|What is shared runner duration?"
-msgstr ""
+msgstr "什么是共享 Runner 的时长?"
msgid "CICDAnalytics|What is shared runner usage?"
msgstr "什么是共享 Runner 的使用情况?"
@@ -6813,7 +6919,7 @@ msgid "CICD|Jobs"
msgstr "作业"
msgid "CICD|Limit"
-msgstr ""
+msgstr "é™åˆ¶"
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr "é™åˆ¶ CI_JOB_TOKEN 访问"
@@ -6828,13 +6934,13 @@ msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration fil
msgstr "在未找到备用CIé…置文件时将使用Auto DevOpsæµæ°´çº¿ã€‚"
msgid "CICD|There are several CI/CD limits in place."
-msgstr ""
+msgstr "存在几个 CI/CD é™åˆ¶ã€‚"
msgid "CICD|Unprotected branches will not have access to the cache from protected branches."
-msgstr ""
+msgstr "未å—ä¿æŠ¤çš„分支将无法从å—ä¿æŠ¤çš„分支访问缓存。"
msgid "CICD|Use separate caches for protected branches"
-msgstr ""
+msgstr "为å—ä¿æŠ¤çš„分支使用å•ç‹¬çš„缓存"
msgid "CICD|group enabled"
msgstr "群组已å¯ç”¨"
@@ -7032,7 +7138,7 @@ msgid "Cannot assign a confidential epic to a non-confidential issue. Make the i
msgstr "无法将机密å²è¯—分é…ç»™éžæœºå¯†è®®é¢˜ã€‚请将此议题设置机密并é‡è¯•"
msgid "Cannot assign an issue that does not belong under the same group (or descendant) as the epic."
-msgstr ""
+msgstr "无法指派与å²è¯—ä¸å±žäºŽåŒä¸€ç¾¤ç»„(或下级)的议题。"
msgid "Cannot be merged automatically"
msgstr "无法自动åˆå¹¶"
@@ -7100,6 +7206,9 @@ msgstr "æŒå¡äººå§“å"
msgid "Card number:"
msgstr "å¡å·ï¼š"
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr "对所有å­ç»„强制实施删除ä¿æŠ¤"
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr "强制所有å­ç¾¤ç»„"
@@ -7137,7 +7246,7 @@ msgid "Certificate Subject"
msgstr "è¯ä¹¦ä¸»é¢˜"
msgid "Change Failure Rate"
-msgstr ""
+msgstr "更改失败率"
msgid "Change assignee"
msgstr "å˜æ›´æŒ‡æ´¾äºº"
@@ -7271,9 +7380,6 @@ msgstr "仅显示部分。点此显示全部。"
msgid "Changes the title to \"%{title_param}\"."
msgstr "将标题更改为“%{title_param}â€ã€‚"
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr "标题更改尚未ä¿å­˜"
@@ -7293,7 +7399,7 @@ msgid "Chat"
msgstr "å³æ—¶é€šè®¯"
msgid "ChatMessage|%{project_link}: Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status} in %{duration}"
-msgstr "%{project_link}:ç”±%{user_combined_name}%{humanized_status}触å‘çš„%{ref_type}%{ref_link}æµæ°´çº¿%{pipeline_link}耗时%{duration}"
+msgstr "%{project_link}:由%{user_combined_name}触å‘çš„%{ref_type} %{ref_link} æµæ°´çº¿ %{pipeline_link},状æ€ä¸º%{humanized_status},耗时 %{duration}"
msgid "ChatMessage|Branch"
msgstr "分支"
@@ -7519,11 +7625,17 @@ msgstr "GitLab计划"
msgid "Checkout|Group"
msgstr "群组"
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr "必须为 %{minimumNumberOfUsers} (使用中的席ä½æ•°ï¼‰æˆ–更多。"
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr "必须为 %{minimumNumberOfUsers} (使用中的席ä½æ•°ï¼‰æˆ–更多。è¦è´­ä¹°æ›´å°‘的席ä½ï¼Œè¯·ä»Žç¾¤ç»„中移除æˆå‘˜ã€‚"
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr "使用GitLabçš„å…¬å¸æˆ–组织的å称"
msgid "Checkout|Name: %{errors}"
-msgstr ""
+msgstr "å称:%{errors}"
msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
msgstr "需è¦æ›´å¤šç”¨æˆ·ï¼Ÿè¯·ä¸ºæ‚¨çš„%{company}采购GitLab 。"
@@ -7570,9 +7682,6 @@ msgstr "æˆåŠŸ: 订阅"
msgid "Checkout|Tax"
msgstr "税é¢"
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr "此数字必须为 %{minimumNumberOfUsers} (使用中的席ä½æ•°ï¼‰æˆ–更多。"
-
msgid "Checkout|Total"
msgstr "总计"
@@ -7636,6 +7745,9 @@ msgstr "å­å²è¯—ä¸å­˜åœ¨ã€‚"
msgid "Child issues and epics"
msgstr "å­è®®é¢˜å’Œå²è¯—"
+msgid "Children"
+msgstr "å„¿ç«¥"
+
msgid "Chinese language support using"
msgstr "中文支æŒä½¿ç”¨"
@@ -8009,6 +8121,9 @@ msgstr "关闭于%{epicTimeagoDate}"
msgid "Closed MRs"
msgstr "已关闭的åˆå¹¶è¯·æ±‚"
+msgid "Closed date"
+msgstr "关闭日期"
+
msgid "Closed issues"
msgstr "已关闭议题"
@@ -8027,6 +8142,123 @@ msgstr "Cloud Run"
msgid "Cloud Storage"
msgstr "云存储"
+msgid "CloudSeed|All"
+msgstr "全部"
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr "AlloyDB for Postgres"
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr "å¯ç”¨çš„æ•°æ®åº“æœåŠ¡å¯ä»¥é€šè¿‡è¿™äº›å®žä¾‹åˆ›å»º"
+
+msgid "CloudSeed|Cancel"
+msgstr "å–消"
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr "Cloud Firestore"
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr "Cloud SQL for MySQL"
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr "Cloud SQL for Postgres"
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr "Cloud SQL for SQL Server"
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr "CloudSQL 实例"
+
+msgid "CloudSeed|Create cluster"
+msgstr "创建集群"
+
+msgid "CloudSeed|Create database"
+msgstr "创建数æ®åº“"
+
+msgid "CloudSeed|Create instance"
+msgstr "创建实例"
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr "在选定的 Google 云项目中生æˆæ•°æ®åº“实例"
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr "与此项目相关的数æ®åº“实例"
+
+msgid "CloudSeed|Database version"
+msgstr "æ•°æ®åº“版本"
+
+msgid "CloudSeed|Description"
+msgstr "æè¿°"
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr "确定您的实例å¯ç”¨çš„内存和虚拟核数"
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr "通过将数æ®å˜é‡å­˜å‚¨åœ¨ secret 管ç†å™¨ä¸­æ¥å¢žå¼ºå®‰å…¨æ€§ - 了解更多关于 %{docLinkStart}secret 管ç†çš„ä¿¡æ¯%{docLinkEnd}"
+
+msgid "CloudSeed|Environment"
+msgstr "环境"
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr "用于客户端和æœåŠ¡å™¨ç«¯å¼€å‘çš„çµæ´»ã€å¯ç¼©æ”¾çš„ NoSQL 云数æ®åº“"
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr "针对高需求工作负载的完全托管的 PostgreSQL 兼容æœåŠ¡"
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr "é¢å‘ MySQL 的全托管关系数æ®åº“æœåŠ¡"
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr "é¢å‘ PostgreSQL 的全托管关系数æ®åº“æœåŠ¡"
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr "é¢å‘ SQL Server 的全托管关系数æ®åº“æœåŠ¡"
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr "已生æˆçš„æœåŠ¡å¸æˆ·å·²é“¾æŽ¥åˆ°æ‰€é€‰åˆ†æ”¯æˆ–标签"
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr "Google Cloud Project"
+
+msgid "CloudSeed|Google Cloud project"
+msgstr "Google Cloud Project"
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr "我接å—谷歌云的定价和管ç†æ•°æ®åº“实例的责任"
+
+msgid "CloudSeed|Instances"
+msgstr "实例"
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr "详细了解 %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}ã€%{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}ã€%{memorystorePricingStart}Memorystore%{memorystorePricingEnd} å’Œ %{firestorePricingStart}Firestore%{firestorePricingEnd} 的定价。"
+
+msgid "CloudSeed|Machine type"
+msgstr "主机类型"
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr "Redis 的内存存储"
+
+msgid "CloudSeed|No instances"
+msgstr "无实例"
+
+msgid "CloudSeed|Refs"
+msgstr "Refs"
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr "é¢å‘ Redis çš„å¯æ‰©å±•ã€å®‰å…¨ä¸”高å¯ç”¨çš„内存æœåŠ¡"
+
+msgid "CloudSeed|Service"
+msgstr "æœåŠ¡"
+
+msgid "CloudSeed|Services"
+msgstr "æœåŠ¡"
+
+msgid "CloudSeed|There are no instances to display."
+msgstr "没有å¯æ˜¾ç¤ºçš„实例。"
+
+msgid "CloudSeed|Version"
+msgstr "版本"
+
msgid "Cluster"
msgstr "集群"
@@ -8036,9 +8268,6 @@ msgstr "集群å¥åº·"
msgid "Cluster cache cleared."
msgstr "群集缓存已清除。"
-msgid "Cluster does not exist"
-msgstr "集群ä¸å­˜åœ¨"
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr "Stages::ClusterEndpointInserter需è¦é›†ç¾¤"
@@ -8403,9 +8632,6 @@ msgstr "Kubernetes集群集æˆçš„高级选项"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "å…许GitLab管ç†æ­¤é›†ç¾¤çš„命å空间和æœåŠ¡è´¦æˆ·ã€‚"
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr "å…许 GitLab 查询特定é…置的集群内建 Elasticsearchï¼Œä»¥èŽ·å– pod 日志。"
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr "å…许 GitLab 查询特定é…置的集群内建 Prometheus,以获å–指标。"
@@ -8445,6 +8671,9 @@ msgstr "检查您的令牌"
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "请选择使用此Kubernetes群集的环境。"
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr "Civo Kubernetes"
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr "清除集群缓存"
@@ -8490,9 +8719,6 @@ msgstr "你是å¦äº†è§£ï¼Ÿ"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service(EKS)"
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr "å¯ç”¨ Elastic Stack 集æˆ"
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr "å¯ç”¨ Prometheus 集æˆ"
@@ -8670,11 +8896,17 @@ msgstr "用于对群集进行身份验è¯çš„ Kubernetes è¯ä¹¦ã€‚"
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "用于访问 Kubernetes API 的 URL。"
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr "基于è¯ä¹¦çš„ Kubernetes 集æˆå·²è¢«å¼ƒç”¨ï¼Œå°†äºŽ 2022 å¹´ 11 月关闭,请%{linkStart}è¿ç§»åˆ°é€‚用于 Kubernetes 的代ç†%{linkEnd}或è”系技术支æŒã€‚"
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr "基于è¯ä¹¦çš„ Kubernetes 集æˆå·²è¢«å¼ƒç”¨ï¼Œå°†äºŽ 2022 å¹´ 11 月关闭,请%{linkStart}è¿ç§»åˆ°é€‚用于 Kubernetes 的代ç†%{linkEnd}。"
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr "将集群连接到 GitLab 的基于è¯ä¹¦çš„方法%{linkStart}弃用%{linkEnd}于 14.5 版本。"
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
-msgstr "与当å‰é¡¹ç›®ç›¸å…³è”的命å空间。用于部署看æ¿ã€pod日志和Web terminal。"
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
+msgstr "与当å‰é¡¹ç›®ç›¸å…³è”的命å空间。用于部署看æ¿å’Œ Web terminal。"
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
msgstr "群集身份验è¯æ—¶å‡ºçŽ°é—®é¢˜ã€‚请确ä¿æ‚¨çš„CAè¯ä¹¦å’Œä»¤ç‰Œæœ‰æ•ˆã€‚"
@@ -8769,6 +9001,12 @@ msgstr "代ç è¯„审"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr "代ç è¯„审分æžæ˜¾ç¤ºäº†ä¸€ä¸ªå¤„于代ç è¯„审阶段的开放åˆå¹¶è¯·æ±‚列表。 当å‰æ²¡æœ‰æ­¤é¡¹ç›®å’Œ/或筛选器的åˆå¹¶è¯·æ±‚。"
+msgid "Code block"
+msgstr "代ç å—"
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr "å¯ä»¥åœ¨é¡¹ç›®åˆ›å»ºæœŸé—´ä»Žå¯ç”¨çš„æºå¯¼å…¥ä»£ç ã€‚必须为 GitHub é…ç½® OmniAuth"
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr "%{ref} %{start_date} - %{end_date} 的代ç è¦†ç›–率统计"
@@ -8830,7 +9068,7 @@ msgid "Collapse issues"
msgstr "折å è®®é¢˜"
msgid "Collapse jobs"
-msgstr ""
+msgstr "折å ä½œä¸š"
msgid "Collapse milestones"
msgstr "折å é‡Œç¨‹ç¢‘"
@@ -8850,17 +9088,20 @@ msgstr "折å æ­¤æ–‡ä»¶ï¼ˆä»…适用于您),直到它å†æ¬¡å˜æ›´ã€‚"
msgid "Collector hostname"
msgstr "Collector主机å"
+msgid "Color"
+msgstr "颜色"
+
msgid "ColorWidget|An error occurred while updating color."
-msgstr ""
+msgstr "更新颜色时出错。"
msgid "ColorWidget|Assign epic color"
-msgstr ""
+msgstr "指定å²è¯—的颜色"
msgid "ColorWidget|Color"
-msgstr ""
+msgstr "颜色"
msgid "ColorWidget|Error fetching epic color."
-msgstr ""
+msgstr "获å–å²è¯—颜色时出错。"
msgid "Colorize messages"
msgstr "为消æ¯ç€è‰²"
@@ -9238,6 +9479,9 @@ msgstr "使用 GitLab 托管模æ¿åœ¨ `.gitlab-ci.yml` 中é…ç½®ä¾èµ–扫æ。æ
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "在`.gitlab-ci.yml`中é…ç½®ä¾èµ–扫æ,如果该文件ä¸å­˜åœ¨åˆ™åˆ›å»ºè¯¥æ–‡ä»¶"
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr "é…ç½® GitLab"
@@ -9274,12 +9518,12 @@ msgstr "在 `.gitlab-ci.yml` 中é…ç½® Secret Detection,如果该文件ä¸å­˜å
msgid "Configure Sentry integration for error tracking"
msgstr "é…ç½® Sentry 集æˆä»¥è¿›è¡Œé”™è¯¯è·Ÿè¸ª"
-msgid "Configure Tracing"
-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 "在%{codeStart}.gitlab%{codeEnd}目录中é…ç½®%{codeStart}gitlab-webide.yml%{codeEnd}文件以开始使用Web终端。 %{helpStart}了解更多。%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
+msgstr "é…置高级æƒé™ã€å¤§æ–‡ä»¶å­˜å‚¨ã€åŒé‡èº«ä»½éªŒè¯å’Œ CI/CD 设置。"
+
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
msgstr "调整高级æƒé™ã€å¤§æ–‡ä»¶å­˜å‚¨ã€åŒé‡è®¤è¯å’Œå®¢æˆ·å…³ç³»è®¾ç½®ã€‚"
@@ -9469,9 +9713,6 @@ msgstr "容器镜åƒåº“"
msgid "Container Scanning"
msgstr "容器扫æ"
-msgid "Container does not exist"
-msgstr "容器ä¸å­˜åœ¨"
-
msgid "Container must be a project or a group."
msgstr "容器必须是一个项目或一个群组。"
@@ -9517,7 +9758,7 @@ msgid "ContainerRegistry|CLI Commands"
msgstr "CLI命令"
msgid "ContainerRegistry|Clean up image tags"
-msgstr ""
+msgstr "清ç†é•œåƒæ ‡ç­¾"
msgid "ContainerRegistry|Cleanup disabled"
msgstr "清ç†å·²ç¦ç”¨"
@@ -9565,7 +9806,7 @@ msgid "ContainerRegistry|Copy build command"
msgstr "å¤åˆ¶æž„建命令"
msgid "ContainerRegistry|Copy image path"
-msgstr ""
+msgstr "å¤åˆ¶é•œåƒè·¯å¾„"
msgid "ContainerRegistry|Copy login command"
msgstr "å¤åˆ¶ç™»å½•å‘½ä»¤"
@@ -9655,7 +9896,7 @@ msgid "ContainerRegistry|Note: Any policy update will result in a change to the
msgstr "注æ„:任何策略更新都会导致对预定è¿è¡Œæ—¥æœŸå’Œæ—¶é—´çš„更改"
msgid "ContainerRegistry|Partial cleanup complete"
-msgstr ""
+msgstr "部分清ç†å®Œæˆ"
msgid "ContainerRegistry|Please try different search criteria"
msgstr "请å°è¯•ä¸åŒçš„æœç´¢æ¡ä»¶"
@@ -9688,18 +9929,18 @@ msgstr "删除早于以下时间的标签:"
msgid "ContainerRegistry|Remove these tags"
msgstr "删除这些标签"
-msgid "ContainerRegistry|Root image"
-msgstr "根镜åƒ"
-
msgid "ContainerRegistry|Run cleanup:"
msgstr "è¿è¡Œæ¸…ç†ï¼š"
msgid "ContainerRegistry|Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
-msgstr ""
+msgstr "通过自动从容器镜åƒåº“中删除标签,并ä¿ç•™æ‚¨æƒ³è¦çš„标签æ¥èŠ‚çœå­˜å‚¨ç©ºé—´ã€‚%{linkStart}清ç†å·¥ä½œå¦‚何进行?%{linkEnd}"
msgid "ContainerRegistry|Set up cleanup"
msgstr "设置清ç†"
+msgid "ContainerRegistry|Show full path"
+msgstr "显示完整路径"
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "部分标签未被删除"
@@ -9758,7 +9999,7 @@ msgid "ContainerRegistry|The cleanup policy timed out before it could delete all
msgstr "清ç†ç­–略在删除所有标签之å‰è¶…时。 管ç†å‘˜å¯ä»¥%{adminLinkStart}ç«‹å³æ‰§è¡Œæ‰‹åŠ¨æ¸…ç†%{adminLinkEnd}或者等待清ç†ç­–略下次自动è¿è¡Œã€‚%{docLinkStart}更多信æ¯%{docLinkEnd}"
msgid "ContainerRegistry|The cleanup will continue within %{time}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "在 %{time} 内将继续清ç†ã€‚%{linkStart}了解更多%{linkEnd}"
msgid "ContainerRegistry|The filter returned no results"
msgstr "过滤器没有返回结果"
@@ -9938,7 +10179,7 @@ msgid "Copy"
msgstr "å¤åˆ¶"
msgid "Copy %{accessTokenType}"
-msgstr ""
+msgstr "å¤åˆ¶ %{accessTokenType}"
msgid "Copy %{http_label} clone URL"
msgstr "å¤åˆ¶ %{http_label} 克隆地å€"
@@ -9968,7 +10209,7 @@ msgid "Copy URL"
msgstr "å¤åˆ¶é“¾æŽ¥"
msgid "Copy audio URL"
-msgstr ""
+msgstr "å¤åˆ¶éŸ³é¢‘ URL"
msgid "Copy branch name"
msgstr "å¤åˆ¶åˆ†æ”¯å称"
@@ -10004,7 +10245,7 @@ msgid "Copy file path"
msgstr "å¤åˆ¶æ–‡ä»¶è·¯å¾„"
msgid "Copy image URL"
-msgstr ""
+msgstr "å¤åˆ¶å›¾åƒ URL"
msgid "Copy issue URL to clipboard"
msgstr "å¤åˆ¶è®®é¢˜ URL 到剪贴æ¿"
@@ -10055,7 +10296,7 @@ msgid "Copy value"
msgstr "å¤åˆ¶å€¼"
msgid "Copy video URL"
-msgstr ""
+msgstr "å¤åˆ¶è§†é¢‘ URL"
msgid "Corpus Management"
msgstr "语料库管ç†"
@@ -10346,7 +10587,7 @@ msgid "Create confidential merge request and branch"
msgstr "创建ç§å¯†åˆå¹¶è¯·æ±‚åŠåˆ†æ”¯"
msgid "Create custom type"
-msgstr ""
+msgstr "创建自定义类型"
msgid "Create directory"
msgstr "创建目录"
@@ -10426,11 +10667,14 @@ msgstr "创建新标记"
msgid "Create new project"
msgstr "新建项目"
+msgid "Create new..."
+msgstr "创建新的..."
+
msgid "Create one"
msgstr "创建一个"
msgid "Create or close an issue."
-msgstr ""
+msgstr "创建或关闭议题。"
msgid "Create or import your first project"
msgstr "创建或导入您的第一个项目"
@@ -10472,7 +10716,7 @@ msgid "Create your group"
msgstr "创建您的群组"
msgid "Create, update, or delete a merge request."
-msgstr ""
+msgstr "创建ã€æ›´æ–°æˆ–删除åˆå¹¶è¯·æ±‚。"
msgid "Create/import your first project"
msgstr "创建/导入您的第一个项目"
@@ -10718,7 +10962,7 @@ msgid "Critical vulnerabilities present"
msgstr "存在严é‡æ¼æ´ž"
msgid "Crm|Contact"
-msgstr ""
+msgstr "è”系人"
msgid "Crm|Contact has been added."
msgstr "è”系人已添加。"
@@ -10751,13 +10995,13 @@ msgid "Crm|No contacts found"
msgstr "找ä¸åˆ°è”系人"
msgid "Crm|No organization"
-msgstr ""
+msgstr "无组织"
msgid "Crm|No organizations found"
msgstr "未找到组织"
msgid "Crm|Organization"
-msgstr ""
+msgstr "组织"
msgid "Crm|Organization has been added."
msgstr "已添加组织"
@@ -11018,7 +11262,7 @@ msgid "CycleAnalytics|Average time to completion"
msgstr "å¹³å‡å®Œæˆæ—¶é—´"
msgid "CycleAnalytics|Change Failure Rate"
-msgstr ""
+msgstr "更改失败率"
msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
msgstr "创建自定义价值æµï¼ŒæŸ¥çœ‹æœ‰å…³ç‰¹å®šäºŽæ‚¨çš„å¼€å‘æµç¨‹çš„阶段的指标。使用您的价值æµæ¥å¯è§†åŒ–您的 DevSecOps 生命周期,确定您的团队的速度,并识别低效的æµç¨‹ã€‚"
@@ -11082,7 +11326,7 @@ msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the cu
msgstr "没有å¯ç”¨çš„“总时间â€æ•°æ®ï¼Œè¯·è°ƒæ•´å½“å‰è¿‡æ»¤å™¨ã€‚"
msgid "CycleAnalytics|Time to Restore Service"
-msgstr ""
+msgstr "æ¢å¤æœåŠ¡çš„时间"
msgid "CycleAnalytics|Total time"
msgstr "总时间"
@@ -11117,11 +11361,14 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "å¹³å‡ï¼ˆæœ€è¿‘%{days}天)"
+msgid "DORA4Metrics|Change failure rate"
+msgstr "更改失败率"
+
msgid "DORA4Metrics|Date"
msgstr "日期"
msgid "DORA4Metrics|Days for an open incident"
-msgstr ""
+msgstr "事件开放的天数"
msgid "DORA4Metrics|Days from merge to deploy"
msgstr "从åˆå¹¶åˆ°éƒ¨ç½²çš„天数"
@@ -11136,13 +11383,13 @@ msgid "DORA4Metrics|Median (last %{days}d)"
msgstr "中值(最近%{days}天)"
msgid "DORA4Metrics|Median time (last %{days}d)"
-msgstr ""
+msgstr "中ä½æ—¶é—´ï¼ˆæœ€è¿‘ %{days} 天)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
-msgstr ""
+msgstr "在给定时间段内,事件在生产环境中的中ä½æ—¶é—´ã€‚"
msgid "DORA4Metrics|No incidents during this period"
-msgstr ""
+msgstr "在此期间没有事件"
msgid "DORA4Metrics|No merge requests were deployed during this period"
msgstr "在此期间没有部署åˆå¹¶è¯·æ±‚"
@@ -11150,6 +11397,15 @@ msgstr "在此期间没有部署åˆå¹¶è¯·æ±‚"
msgid "DORA4Metrics|Number of deployments"
msgstr "部署数é‡"
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr "给定时间段内事件数除以生产环境的部署数。"
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr "失败部署的百分比"
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr "获å–å˜æ›´å¤±è´¥çŽ‡æ•°æ®æ—¶å‡ºé”™ã€‚"
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr "获å–部署频率数æ®æ—¶å‡ºé”™ã€‚"
@@ -11157,7 +11413,7 @@ msgid "DORA4Metrics|Something went wrong while getting lead time data."
msgstr "获å–交付时间数æ®æ—¶å‡ºäº†é”™ã€‚"
msgid "DORA4Metrics|Something went wrong while getting time to restore service data."
-msgstr ""
+msgstr "æ¢å¤æœåŠ¡æ•°æ®æ—¶å‡ºé”™ã€‚"
msgid "DORA4Metrics|The chart displays the frequency of deployments to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr "该图表显示基于 %{linkStart}deployment_tier%{linkEnd} 值的生产环境部署频率。"
@@ -11166,7 +11422,7 @@ msgid "DORA4Metrics|The chart displays the median time between a merge request b
msgstr "该图表显示åˆå¹¶è¯·æ±‚被åˆå¹¶å’Œéƒ¨ç½²åˆ°ç”Ÿäº§çŽ¯å¢ƒä¹‹é—´çš„中间值时间,这些时间基于 %{linkStart}deployment_tier%{linkEnd} 值。"
msgid "DORA4Metrics|Time to restore service"
-msgstr ""
+msgstr "æ¢å¤æœåŠ¡çš„时间"
msgid "DSN"
msgstr "DSN"
@@ -11198,15 +11454,15 @@ msgstr "无法添加 %{invalidProjects}。此仪表æ¿å¯ç”¨äºŽå…¬å…±é¡¹ç›®å’Œå…
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 "自定义 DAST 设置以满足您的è¦æ±‚。此处所åšçš„é…置更改会覆盖 GitLab æ供的é…置更改,并从更新中排除。有关更高级é…置选项的详细信æ¯ï¼Œè¯·å‚阅 %{docsLinkStart}GitLab DAST 文档%{docsLinkEnd}。"
-msgid "DastConfig|DAST Settings"
-msgstr "DAST 设置"
+msgid "DastConfig|DAST CI/CD configuration"
+msgstr "DAST CI/CD é…ç½®"
+
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
+msgstr "å¯ç”¨ DAST,在 CI/CD æµæ°´çº¿ä¸­è‡ªåŠ¨æµ‹è¯•åœ¨æ‚¨çš„项目中è¿è¡Œçš„应用程åºã€ç½‘站或 API 中的æ¼æ´žã€‚é…置更改必须应用于您的 .gitlab-ci.yml 文件æ‰èƒ½ç”Ÿæ•ˆã€‚有关所有é…置选项的详细信æ¯ï¼Œè¯·å‚阅 %{linkStart}DAST 文档%{linkEnd}。"
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消æ¯(请求和å“应)。主动扫æ会对目标进行攻击以å‘现潜在æ¼æ´žã€‚"
@@ -11229,7 +11485,7 @@ msgid "DastProfiles|Are you sure you want to delete this profile?"
msgstr "您确定è¦åˆ é™¤æ­¤é…ç½®å—?"
msgid "DastProfiles|Attacks the target to find potential vulnerabilities. Active scans are potentially harmful to the site being scanned."
-msgstr ""
+msgstr "攻击目标æ¥å‘现潜在æ¼æ´žã€‚主动扫æå¯èƒ½å¯¹è¢«æ‰«æ的站点有害。"
msgid "DastProfiles|Authentication"
msgstr "身份验è¯"
@@ -11241,10 +11497,10 @@ msgid "DastProfiles|Branch missing"
msgstr "缺少分支"
msgid "DastProfiles|Change scanner profile"
-msgstr ""
+msgstr "更改扫æ器é…置文件"
msgid "DastProfiles|Change site profile"
-msgstr ""
+msgstr "更改站点é…置文件"
msgid "DastProfiles|Choose a scan method"
msgstr "选择扫æ方法"
@@ -11336,6 +11592,9 @@ msgstr "éšè—调试消æ¯"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr "在DAST控制å°è¾“出中包å«è°ƒè¯•æ¶ˆæ¯ã€‚"
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr "管ç†%{profileType}é…置文件"
+
msgid "DastProfiles|Manage profiles"
msgstr "管ç†é…ç½®"
@@ -11349,7 +11608,7 @@ msgid "DastProfiles|Minimum = 1 second, Maximum = 3600 seconds"
msgstr "æœ€å° = 1秒,最大 = 3600秒"
msgid "DastProfiles|Monitors all HTTP requests sent to the target to find potential vulnerabilities."
-msgstr ""
+msgstr "监控å‘é€åˆ°ç›®æ ‡çš„所有 HTTP 请求æ¥æŸ¥æ‰¾æ½œåœ¨æ¼æ´žã€‚"
msgid "DastProfiles|New scanner profile"
msgstr "新建扫æ工具é…ç½®"
@@ -11358,13 +11617,13 @@ msgid "DastProfiles|New site profile"
msgstr "新建站点é…ç½®"
msgid "DastProfiles|No scanner profile selected"
-msgstr ""
+msgstr "未选择扫æ器é…置文件"
msgid "DastProfiles|No scanner profiles created yet"
msgstr "尚未创建扫æ工具é…置文件"
msgid "DastProfiles|No site profile selected"
-msgstr ""
+msgstr "未选择站点é…置文件"
msgid "DastProfiles|No site profiles created yet"
msgstr "尚未创建站点é…置文件"
@@ -11382,7 +11641,7 @@ msgid "DastProfiles|Password form field"
msgstr "密ç è¡¨å•å­—段"
msgid "DastProfiles|Profile is being used by this on-demand scan"
-msgstr ""
+msgstr "此按需扫æ正在使用é…置文件"
msgid "DastProfiles|Profile name"
msgstr "é…ç½®å称"
@@ -11418,22 +11677,22 @@ msgid "DastProfiles|Scanner name"
msgstr "扫æ工具å称"
msgid "DastProfiles|Scanner profiles define the configuration details of a security scanner. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "扫æ器é…置文件定义了安全扫æ器的é…置详细信æ¯ã€‚%{linkStart}了解更多%{linkEnd}。"
msgid "DastProfiles|Select a scanner profile to run a DAST scan"
-msgstr ""
+msgstr "选择扫æ器é…置文件æ¥è¿è¡Œ DAST 扫æ"
msgid "DastProfiles|Select a site profile to run a DAST scan"
-msgstr ""
+msgstr "选择站点é…置文件æ¥è¿è¡Œ DAST 扫æ"
msgid "DastProfiles|Select branch"
msgstr "选择分支"
msgid "DastProfiles|Select scanner profile"
-msgstr ""
+msgstr "选择扫æ器é…置文件"
msgid "DastProfiles|Select site profile"
-msgstr ""
+msgstr "选择站点é…置文件"
msgid "DastProfiles|Show debug messages"
msgstr "显示调试消æ¯"
@@ -11448,7 +11707,7 @@ msgid "DastProfiles|Site name"
msgstr "站点å称"
msgid "DastProfiles|Site profiles define the attributes and configuration details of your deployed application, website, or API. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "站点é…置文件定义您部署的应用程åºã€ç½‘站或 API 的属性和é…置详细信æ¯ã€‚%{linkStart}了解更多%{linkEnd}。"
msgid "DastProfiles|Site type"
msgstr "站点类型"
@@ -11546,6 +11805,9 @@ msgstr "报头验è¯"
msgid "DastSiteValidation|Meta tag validation"
msgstr "Meta 标签验è¯"
+msgid "DastSiteValidation|Not validated"
+msgstr "未验è¯"
+
msgid "DastSiteValidation|Retry validation"
msgstr "é‡è¯•éªŒè¯"
@@ -11748,12 +12010,6 @@ msgstr "默认分支"
msgid "Default branch and protected branches"
msgstr "默认分支和å—ä¿æŠ¤çš„分支"
-msgid "Default delayed project deletion"
-msgstr "默认延迟删除项目"
-
-msgid "Default deletion delay"
-msgstr "默认删除延迟"
-
msgid "Default description template for issues"
msgstr "议题的默认æ述模æ¿"
@@ -11766,9 +12022,6 @@ msgstr "æ¯å‘¨çš„默认起始日"
msgid "Default first day of the week in calendars and date pickers."
msgstr "在日期选择器中显示æ¯å‘¨é»˜è®¤çš„起始日。"
-msgid "Default project deletion protection"
-msgstr "默认项目删除ä¿æŠ¤"
-
msgid "Default projects limit"
msgstr "默认项目é™åˆ¶"
@@ -11821,11 +12074,14 @@ msgid "Define how approval rules are applied to merge requests."
msgstr "定义审核规则如何应用于åˆå¹¶è¯·æ±‚。"
msgid "Define rules for who can push, merge, and the required approvals for each branch."
-msgstr ""
+msgstr "定义è°å¯ä»¥æŽ¨é€ã€åˆå¹¶ä»¥åŠæ¯ä¸ªåˆ†æ”¯æ‰€éœ€çš„批准规则。"
msgid "Definition"
msgstr "定义"
+msgid "Delay 2FA enforcement (hours)"
+msgstr "2FA 强制执行延迟(å°æ—¶ï¼‰"
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr "确定è¦ç«‹å³è¿è¡Œ%{jobName}å—?å¦åˆ™è¯¥ä½œä¸šå°†åœ¨è®¡æ—¶å™¨ç»“æŸåŽè‡ªåŠ¨è¿è¡Œã€‚"
@@ -11860,10 +12116,7 @@ msgid "Delete Comment"
msgstr "删除评论"
msgid "Delete File"
-msgstr ""
-
-msgid "Delete Internal Note"
-msgstr ""
+msgstr "删除文件"
msgid "Delete Key"
msgstr "删除密钥"
@@ -11881,7 +12134,7 @@ msgid "Delete artifacts"
msgstr "删除产物"
msgid "Delete audio"
-msgstr ""
+msgstr "删除音频"
msgid "Delete badge"
msgstr "删除徽章"
@@ -11905,11 +12158,14 @@ msgid "Delete file"
msgstr "删除文件"
msgid "Delete image"
-msgstr ""
+msgstr "删除镜åƒ"
msgid "Delete image repository"
msgstr "删除镜åƒä»“库"
+msgid "Delete internal note"
+msgstr "删除内部备注"
+
msgid "Delete label"
msgstr "删除标签"
@@ -11962,7 +12218,7 @@ msgid "Delete variable"
msgstr "删除å˜é‡"
msgid "Delete video"
-msgstr ""
+msgstr "删除视频"
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "删除事件失败。请é‡è¯•æˆ–è”系管ç†å‘˜ã€‚"
@@ -12021,6 +12277,33 @@ msgstr "删除该项目将删除其仓库和所有相关资æºï¼ŒåŒ…括议题和
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr "删除æ“作等待处ç†ã€‚此项目将于%{date}被删除。仓库和其他项目资æºä¸ºåªè¯»ã€‚"
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr "所有项目会立刻删除。"
+
+msgid "DeletionSettings|Deletion protection"
+msgstr "删除ä¿æŠ¤"
+
+msgid "DeletionSettings|Keep deleted"
+msgstr "ä¿æŒåˆ é™¤"
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr "将已删除的项目ä¿ç•™ %{number} 天"
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr "将已删除的项目ä¿ç•™ 1 天"
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr "å¦ï¼Œç«‹å³åˆ é™¤"
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr "åªæœ‰ç®¡ç†å‘˜æ‰å¯ä»¥åˆ é™¤é¡¹ç›®ã€‚"
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr "项目所有者和管ç†å‘˜å¯ä»¥åˆ é™¤é¡¹ç›®ã€‚"
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr "删除群组和项目的ä¿ç•™æœŸå°†ä¿æŒå¯æ¢å¤çŠ¶æ€ã€‚个人项目总是立å³åˆ é™¤ã€‚有些群组å¯ä»¥é€‰æ‹©å…¶é¡¹ç›®ã€‚"
+
msgid "Denied"
msgstr "已拒ç»"
@@ -12091,7 +12374,7 @@ msgid "Dependencies|Packager"
msgstr "包管ç†å·¥å…·"
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
-msgstr ""
+msgstr "è½¯ä»¶ç‰©æ–™æ¸…å• (SBOM) 基于%{linkStart}最新æˆåŠŸ%{linkEnd}的扫æ"
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "%{codeStartTag}dependency_scanning%{codeEndTag} 作业失败,无法生æˆåˆ—表。请确ä¿ä½œä¸šæ­£å¸¸è¿è¡Œå¹¶é‡å¯æµæ°´çº¿ã€‚"
@@ -12153,15 +12436,15 @@ msgstr "ä¾èµ–代ç†é•œåƒå‰ç¼€"
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr "å¯ç”¨ä¾èµ–代ç†"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
+msgstr "å¯ç”¨ä¾èµ–代ç†å’Œæ¸…除缓存的设置。"
+
msgid "DependencyProxy|Image list"
msgstr "é•œåƒåˆ—表"
msgid "DependencyProxy|Scheduled for deletion"
msgstr "计划删除"
-msgid "DependencyProxy|Storage settings"
-msgstr "存储设置"
-
msgid "DependencyProxy|There are no images in the cache"
msgstr "缓存中没有镜åƒ"
@@ -12187,7 +12470,7 @@ msgid "Deploy Keys"
msgstr "部署密钥"
msgid "Deploy Token"
-msgstr ""
+msgstr "部署令牌"
msgid "Deploy container based web apps on Google managed clusters"
msgstr "在 Google 托管的集群上部署基于容器的网络应用"
@@ -12569,16 +12852,10 @@ msgid "Deprecations|For information on a possible replacement %{epicStart} learn
msgstr "关于å¯èƒ½æ›¿æ¢çš„ä¿¡æ¯ï¼Œ%{epicStart}了解更多关于 Opstrace %{epicEnd}。"
msgid "Deprecations|For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
+msgstr "关于å¯èƒ½æ›¿æ¢çš„ä¿¡æ¯ï¼Œ%{opstrace_link_start}了解更多关于 Opstrace çš„ä¿¡æ¯%{link_end}。"
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr "在 14.7 版本中,日志和追踪功能已弃用,%{epicStart} 计划于 15.0 版本删除 %{epicEnd}。"
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr "在 14.7 版本中,日志和追踪功能已废弃,%{removal_link_start} 计划在 15.0 版本中删除 %{link_end} 。关于å¯èƒ½æ›¿ä»£æ–¹æ³•çš„ä¿¡æ¯ï¼Œ%{opstrace_link_start} 了解更多关于Opstrace %{link_end} çš„ä¿¡æ¯ã€‚"
+msgstr "在 14.7 版本中,日志和追踪功能也被废弃,%{removal_link_start} 计划在 15.0 版本中删除 %{link_end}。"
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr "14.7 版本中弃用了指标功能。"
@@ -12596,7 +12873,7 @@ msgid "Description"
msgstr "æè¿°"
msgid "Description (alt text)"
-msgstr ""
+msgstr "æ述(替代文本)"
msgid "Description (optional)"
msgstr "æè¿° (å¯é€‰)"
@@ -12668,9 +12945,6 @@ msgstr "å•å‡»æ‚¨è¦å¼€å§‹æ–°è®¨è®ºçš„图åƒ"
msgid "DesignManagement|Comment"
msgstr "评论"
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr "您解决的评论å¯ä»¥é€šè¿‡ä¸‹é¢çš„“已解决的评论â€éƒ¨åˆ†æŸ¥çœ‹å’Œæ”¹ä¸ºæœªè§£å†³"
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr "无法添加新评论。请å†è¯•ä¸€æ¬¡."
@@ -12713,9 +12987,6 @@ msgstr "ä¿ç•™æ›´æ”¹"
msgid "DesignManagement|Keep comment"
msgstr "ä¿ç•™è¯„论"
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr "了解更多关于解决评论的信æ¯"
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "请求的设计版本ä¸å­˜åœ¨ã€‚显示最新版本"
@@ -12773,6 +13044,9 @@ msgstr "详情"
msgid "Details (default)"
msgstr "详细信æ¯(默认)"
+msgid "Details block"
+msgstr "详细信æ¯å—"
+
msgid "Detect host keys"
msgstr "检测主机密钥"
@@ -12974,6 +13248,9 @@ msgstr "您的分数"
msgid "DevopsReport|Your usage"
msgstr "您的使用情况"
+msgid "Diagram (%{language})"
+msgstr "图表(%{language})"
+
msgid "Did not delete the source branch."
msgstr "ä¸è¦åˆ é™¤æºåˆ†æ”¯ã€‚"
@@ -13073,9 +13350,6 @@ msgstr "在此项目中ç¦ç”¨"
msgid "Disable group runners"
msgstr "ç¦ç”¨ç¾¤ç»„Runner"
-msgid "Disable the group-level wiki"
-msgstr "ç¦ç”¨ç¾¤ç»„级 wiki"
-
msgid "Disable two-factor authentication"
msgstr "ç¦ç”¨åŒé‡è®¤è¯"
@@ -13143,10 +13417,10 @@ msgid "Discover|Upgrade now"
msgstr "ç«‹å³å‡çº§"
msgid "Discuss a specific suggestion or question internally that needs to be resolved."
-msgstr ""
+msgstr "在内部讨论需è¦è§£å†³çš„特定建议或议题。"
msgid "Discuss a specific suggestion or question internally."
-msgstr ""
+msgstr "在内部讨论特定建议或议题。"
msgid "Discuss a specific suggestion or question that needs to be resolved."
msgstr "讨论需è¦è§£å†³çš„具体建议或问题。"
@@ -13242,9 +13516,6 @@ msgstr "文档页é¢URL"
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr "文档é‡å»ºç´¢å¼•: %{processed_documents} (%{percentage}%%)"
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr "ä¸é€‚用于个人命å空间中的项目,这些项目会根æ®è¦æ±‚ç«‹å³åˆ é™¤ã€‚"
-
msgid "Does not delete the source branch."
msgstr "ä¸åˆ é™¤æºåˆ†æ”¯ã€‚"
@@ -13390,13 +13661,13 @@ msgid "Due date"
msgstr "截止日期"
msgid "Due to inactivity, the %{project_link} project is scheduled to be deleted on %{b_open}%{deletion_date}%{b_close}. To unschedule the deletion of %{project_link}, perform some activity on it. For example:"
-msgstr ""
+msgstr "由于ä¸æ´»è·ƒï¼Œè®¡åˆ’于 %{b_open}%{deletion_date}%{b_close} 删除 %{project_link} 项目。è¦å–消 %{project_link} 的删除计划,请对其执行一些æ“作。例如:"
msgid "Due to inactivity, the %{project_name} (%{project_link}) project is scheduled to be deleted on %{deletion_date}. To unschedule the deletion of %{project_name}, perform some activity on it. For example:"
-msgstr ""
+msgstr "由于ä¸æ´»è·ƒï¼Œè®¡åˆ’于 %{deletion_date} 删除 %{project_name} (%{project_link}) 项目。è¦å–消 %{project_name} 的删除计划,请对其执行一些æ“作。例如:"
msgid "Due to inactivity, this project is scheduled to be deleted on %{deletion_date}. %{link_start}Why is this scheduled?%{link_end}"
-msgstr ""
+msgstr "由于ä¸æ´»è·ƒï¼Œæ­¤é¡¹ç›®è®¡åˆ’于 %{deletion_date} 删除。%{link_start}为什么è¦è¿™æ ·å®‰æŽ’?%{link_end}"
msgid "Duplicate page: %{error_message}"
msgstr "é‡å¤é¡µé¢ï¼š%{error_message}"
@@ -13461,12 +13732,12 @@ msgstr "æ¯ä¸ªé¡¹ç›®è¿˜å¯ä»¥æœ‰ä¸€ä¸ªè®®é¢˜è·Ÿè¸ªå™¨å’Œä¸€ä¸ª wiki。"
msgid "Edit"
msgstr "编辑"
-msgid "Edit %{issuable}"
-msgstr "编辑%{issuable}"
-
msgid "Edit %{name}"
msgstr "编辑%{name}"
+msgid "Edit %{profileType} profile"
+msgstr "编辑 %{profileType} 个人资料"
+
msgid "Edit Comment"
msgstr "编辑评论"
@@ -13494,9 +13765,6 @@ msgstr "编辑密ç "
msgid "Edit Pipeline Schedule"
msgstr "编辑æµæ°´çº¿è®¡åˆ’"
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr "编辑å‘布"
@@ -13516,7 +13784,7 @@ msgid "Edit application"
msgstr "编辑应用"
msgid "Edit audio description"
-msgstr ""
+msgstr "编辑音频æè¿°"
msgid "Edit comment"
msgstr "编辑评论"
@@ -13555,7 +13823,7 @@ msgid "Edit identity for %{user_name}"
msgstr "编辑 %{user_name} 的身份信æ¯"
msgid "Edit image description"
-msgstr ""
+msgstr "编辑图片æè¿°"
msgid "Edit in pipeline editor"
msgstr "在æµæ°´çº¿ç¼–辑器中编辑"
@@ -13600,7 +13868,7 @@ msgid "Edit user: %{user_name}"
msgstr "编辑用户:%{user_name}"
msgid "Edit video description"
-msgstr ""
+msgstr "编辑视频æè¿°"
msgid "Edit wiki page"
msgstr "编辑Wiki页é¢"
@@ -13647,9 +13915,6 @@ msgstr "Elasticsearché‡å»ºç´¢å¼•å·²è§¦å‘"
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr "Elasticsearch é‡å»ºç´¢å¼•å°šæœªå¼€å§‹ï¼š%{errors}"
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr "Elasticsearch返回状æ€ä»£ç : %{status_code}"
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr "Elasticsearchä¸åœæœºé‡å»ºç´¢å¼•"
@@ -13788,9 +14053,6 @@ msgstr "tanuki@example.com gitlab@example.com"
msgid "Embed"
msgstr "嵌入"
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr "在 GitLab 中嵌入现有 Jaeger æœåŠ¡å™¨çš„图åƒã€‚"
-
msgid "Empty file"
msgstr "空文件"
@@ -13806,6 +14068,9 @@ msgstr "å¯ç”¨ Amazon EKS 集æˆ"
msgid "Enable Auto DevOps"
msgstr "å¯ç”¨Auto DevOps"
+msgid "Enable GitLab Error Tracking"
+msgstr "å¯ç”¨é”™è¯¯è·Ÿè¸ª"
+
msgid "Enable Gitpod"
msgstr "å¯ç”¨Gitpod"
@@ -13872,9 +14137,6 @@ msgstr "为创建于早于GitLab 12.7版本的项目å¯ç”¨å®¹å™¨è¿‡æœŸå’Œä¿ç•™ç
msgid "Enable container expiration caching."
msgstr "å¯ç”¨å®¹å™¨è¿‡æœŸç¼“存。"
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr "默认情况下为新创建的群组å¯ç”¨å»¶è¿Ÿé¡¹ç›®åˆ é™¤ã€‚"
-
msgid "Enable email notification"
msgstr "å¯ç”¨ç”µå­é‚®ä»¶é€šçŸ¥"
@@ -13989,9 +14251,6 @@ msgstr "å¯ç”¨ Git 访问åè®®"
msgid "Enabled OAuth authentication sources"
msgstr "å¯ç”¨ OAuth 身份验è¯æº"
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr "è¦åœ¨é¡¹ç›®åˆ›å»ºæœŸé—´å¯ç”¨ä»£ç å¯¼å…¥æºã€‚必须为 GitHub é…ç½® OmniAuth"
-
msgid "Encountered an error while rendering: %{err}"
msgstr "渲染时出现错误: %{err}"
@@ -14112,9 +14371,6 @@ msgstr "ä¼ä¸š"
msgid "Environment"
msgstr "环境"
-msgid "Environment does not have deployments"
-msgstr "环境没有部署"
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr "Stages::MetricEndpointInter需è¦çŽ¯å¢ƒ"
@@ -14214,12 +14470,6 @@ msgstr "自动åœæ­¢äºŽ %{autoStopAt}"
msgid "Environments|Commit"
msgstr "æ交"
-msgid "Environments|Currently showing %{fetched} results."
-msgstr "当å‰æ˜¾ç¤º%{fetched}个结果。"
-
-msgid "Environments|Currently showing all results."
-msgstr "当å‰æ˜¾ç¤ºæ‰€æœ‰ç»“果。"
-
msgid "Environments|Delete"
msgstr "删除"
@@ -14256,9 +14506,6 @@ msgstr "环境是指部署代ç çš„ä½ç½®ï¼Œä¾‹å¦‚预å‘布或生产。"
msgid "Environments|How do I create an environment?"
msgstr "如何创建环境?"
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr "在群集上安装Elastic Stack,以å¯ç”¨é«˜çº§æŸ¥è¯¢åŠŸèƒ½ï¼Œä¾‹å¦‚全文æœç´¢ã€‚"
-
msgid "Environments|Job"
msgstr "作业"
@@ -14268,9 +14515,6 @@ msgstr "了解环境"
msgid "Environments|Learn more about stopping environments"
msgstr "了解更多关于如何终止环境的信æ¯"
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr "从%{start}到%{end}的日志。"
-
msgid "Environments|New environment"
msgstr "新建环境"
@@ -14280,12 +14524,6 @@ msgstr "没有已部署的环境"
msgid "Environments|No deployments yet"
msgstr "未部署"
-msgid "Environments|No pod selected"
-msgstr "未选择pod"
-
-msgid "Environments|No pods to display"
-msgstr "没有å¯æ˜¾ç¤ºçš„pod"
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "注æ„:继续æ“作将终止当å‰çŽ¯å¢ƒï¼ç”±äºŽæœªåœ¨%{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}文件中定义“终止环境æ“作â€ï¼Œå› æ­¤%{emphasisStart}ä¸ä¼š%{emphasisEnd}å½±å“å·²ç»å­˜åœ¨çš„部署。"
@@ -14295,11 +14533,8 @@ msgstr "打开"
msgid "Environments|Open live environment"
msgstr "打开è¿è¡Œä¸­çš„环境"
-msgid "Environments|Pod name"
-msgstr "Podå称"
-
-msgid "Environments|Re-deploy"
-msgstr "é‡æ–°éƒ¨ç½²"
+msgid "Environments|Re-deploy environment"
+msgstr "é‡æ–°éƒ¨ç½²çŽ¯å¢ƒ"
msgid "Environments|Re-deploy environment %{name}?"
msgstr "é‡æ–°éƒ¨ç½²çŽ¯å¢ƒ %{name}?"
@@ -14307,18 +14542,12 @@ msgstr "é‡æ–°éƒ¨ç½²çŽ¯å¢ƒ %{name}?"
msgid "Environments|Re-deploy to environment"
msgstr "é‡æ–°éƒ¨ç½²è‡³çŽ¯å¢ƒ"
-msgid "Environments|Rollback"
-msgstr "回滚"
-
msgid "Environments|Rollback environment"
msgstr "回滚环境"
msgid "Environments|Rollback environment %{name}?"
msgstr "回滚环境 %{name}?"
-msgid "Environments|Select pod"
-msgstr "选择pod"
-
msgid "Environments|Show all"
msgstr "显示全部"
@@ -14334,14 +14563,11 @@ msgstr "终止%{environmentName}"
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr "尚无此环境的部署。%{linkStart}了解有关设置部署的更多信æ¯ã€‚%{linkEnd}"
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr "获å–日志时出错。请é‡è¯•ã€‚"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
+msgstr "æ­¤æ“作将%{docsStart}é‡è¯•å¸¦æœ‰æ交 %{commitId} 的最新部署%{docsEnd} ,用于此环境。您确定è¦ç»§ç»­å—?"
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
-msgstr "æ­¤æ“作将é‡æ–°å¯åŠ¨æ交%{linkStart}%{commitId}%{linkEnd}的作业,将环境置于先å‰ç‰ˆæœ¬ä¸­ã€‚你确定你è¦ç»§ç»­å—?"
-
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
-msgstr "æ­¤æ“作将è¿è¡Œç”± %{name} 定义的作业,用于æ交 %{linkStart}%{commitId}%{linkEnd} 将环境置于先å‰ç‰ˆæœ¬ä¸­ã€‚您å¯ä»¥é€šè¿‡é‡æ–°éƒ¨ç½²æœ€æ–°ç‰ˆæœ¬çš„应用程åºæ¥è¿˜åŽŸå®ƒã€‚你确定你è¦ç»§ç»­å—?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
+msgstr "æ­¤æ“作将%{docsStart}将此环境%{docsEnd}回滚到先å‰æˆåŠŸéƒ¨ç½²çš„æ交 %{commitId}。您确定è¦ç»§ç»­å—?"
msgid "Environments|Upcoming"
msgstr "å³å°†æŽ¨å‡º"
@@ -14475,6 +14701,9 @@ msgstr "从å²è¯—中删除议题时出错。"
msgid "Epics|Something went wrong while updating epics."
msgstr "æ›´æ–°å²è¯—时出错。"
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr "å²è¯—在å¯è§†åŒ–时的颜色,例如在路线图时间线æ ä¸Šã€‚"
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr "这个å²è¯—和任何包å«å­å²è¯—çš„ä¿¡æ¯å‡ä¸ºç§å¯†ï¼Œåªèƒ½å¯¹æ‹¥æœ‰è‡³å°‘报告者访问æƒé™çš„团队æˆå‘˜å¯è§ã€‚"
@@ -14703,6 +14932,9 @@ msgstr "错误:无法删除部署冻结"
msgid "Error: Unable to find AWS role for current user"
msgstr "错误:找ä¸åˆ°å½“å‰ç”¨æˆ·çš„AWS角色"
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr "å¯ç”¨"
@@ -14872,7 +15104,7 @@ msgid "Estimated"
msgstr "预计"
msgid "Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
-msgstr ""
+msgstr "å³ä½¿æ‚¨è¾¾åˆ°è®¢é˜…的席ä½æ•°é‡ï¼Œæ‚¨ä¹Ÿå¯ä»¥ç»§ç»­æ·»åŠ ç”¨æˆ·ï¼Œç³»ç»Ÿå°†ä¼šæ”¶å–超é¢è´¹ç”¨ã€‚"
msgid "EventFilterBy|Filter by all"
msgstr "全部"
@@ -14905,7 +15137,7 @@ msgid "Events"
msgstr "事件"
msgid "Events API"
-msgstr ""
+msgstr "事件 API"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "所有 %{action} å°è¯•éƒ½å·²å¤±è´¥ï¼š %{job_error_message}。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -14965,6 +15197,9 @@ msgstr "æ¯å¹´åœ¨ %{day} çš„ %{time} %{timezone}"
msgid "Everyone With Access"
msgstr "具有访问æƒé™çš„任何人"
+msgid "Everyone can access the wiki."
+msgstr "æ¯ä¸ªäººéƒ½å¯ä»¥è®¿é—® wiki。"
+
msgid "Everyone can contribute"
msgstr "人人皆å¯è´¡çŒ®"
@@ -14990,7 +15225,7 @@ msgid "Everything you need to create a GitLab Pages site using Middleman"
msgstr "使用 Middleman 创建 GitLab Pages 站点所需的一切"
msgid "Everything you need to create a GitLab Pages site using Pelican"
-msgstr ""
+msgstr "使用 Pelican 创建 Pages 站点所需的一切"
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "使用纯HTML创建GitLab Pages网站所需的所有信æ¯"
@@ -15059,7 +15294,7 @@ msgid "Expand issues"
msgstr "展开议题"
msgid "Expand jobs"
-msgstr ""
+msgstr "展开作业"
msgid "Expand milestones"
msgstr "展开里程碑"
@@ -15103,8 +15338,8 @@ msgstr "过期时间:"
msgid "Expires"
msgstr "到期"
-msgid "Expires in %{expires_at}"
-msgstr "在 %{expires_at} 过期"
+msgid "Expires %{preposition} %{expires_at}"
+msgstr "过期 %{preposition} %{expires_at}"
msgid "Expires on"
msgstr "到期日期"
@@ -15268,6 +15503,9 @@ msgstr "åªèƒ½å­˜åœ¨ä¸€ä¸ªæœ‰æ•ˆçš„议题跟踪器集æˆã€‚请先ç¦ç”¨å½“å‰æœ‰
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr "此议题已与 %{trackerName} åŒæ­¥"
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr "输入外部 wiki 的 URL。"
+
msgid "ExternalWikiService|External wiki"
msgstr "外部Wiki"
@@ -15289,6 +15527,10 @@ msgstr "失败"
msgid "Failed Jobs"
msgstr "失败的作业"
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] "失败的作业"
+
msgid "Failed on"
msgstr "失败于"
@@ -15420,7 +15662,7 @@ msgid "Failed to load groups, users and deploy keys."
msgstr "无法加载群组,用户和部署密钥。"
msgid "Failed to load groups."
-msgstr ""
+msgstr "加载群组失败。"
msgid "Failed to load iteration cadences."
msgstr "加载迭代周期失败。"
@@ -15856,7 +16098,7 @@ msgid "File templates"
msgstr "文件模æ¿"
msgid "File too large. Secure Files must be less than %{limit} MB."
-msgstr ""
+msgstr "文件过大。安全文件必须å°äºŽ %{limit} MB。"
msgid "File upload error."
msgstr "文件上传错误。"
@@ -15966,8 +16208,11 @@ msgstr "按路径查找"
msgid "Find file"
msgstr "查找文件"
-msgid "Fingerprint"
-msgstr "指纹"
+msgid "Fingerprint (MD5)"
+msgstr "指纹(MD5)"
+
+msgid "Fingerprint (SHA256)"
+msgstr "指纹(SHA256)"
msgid "Fingerprints"
msgstr "指纹"
@@ -15975,6 +16220,9 @@ msgstr "指纹"
msgid "Finish editing this message first!"
msgstr "先完æˆæ­¤æ¶ˆæ¯çš„编辑ï¼"
+msgid "Finish review"
+msgstr "完æˆè¯„审"
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr "完æˆæ‚¨çš„%{group_name}专用å¸æˆ·è®¾ç½®ã€‚"
@@ -15997,7 +16245,7 @@ msgid "First seen"
msgstr "首次出现"
msgid "Fixed"
-msgstr ""
+msgstr "已修å¤"
msgid "Fixed burndown chart"
msgstr "固定燃尽图"
@@ -16018,7 +16266,7 @@ msgid "FloC|Federated Learning of Cohorts"
msgstr "FloC(Federated Learning of Cohorts)"
msgid "FlowdockService|Enter your Flowdock token."
-msgstr ""
+msgstr "输入您的 Flowdock 令牌。"
msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows."
msgstr "从 GitLab å‘é€äº‹ä»¶é€šçŸ¥åˆ° Flowdock æµã€‚"
@@ -16045,10 +16293,10 @@ msgid "FogBugz import"
msgstr "FogBugz导入"
msgid "Fogbugz|Fogbugz import failed due to an error: %{error}"
-msgstr ""
+msgstr "Fogbugz 导入失败,错误:%{error}"
msgid "Fogbugz|Project %{repo} could not be found"
-msgstr ""
+msgstr "无法找到项目 %{repo}"
msgid "Folder/%{name}"
msgstr "文件夹/%{name}"
@@ -16107,9 +16355,6 @@ msgstr "有关如何计算活跃用户数的更多信æ¯ï¼Œè¯·å‚è§æ–‡æ¡£ %{sel
msgid "For more information, go to the "
msgstr "如需了解详细信æ¯ï¼Œè¯·å‚阅"
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr "欲了解更多信æ¯ï¼Œè¯·å‚阅文件钩å­æ–‡æ¡£ã€‚"
@@ -16176,8 +16421,8 @@ msgstr "该项目无需任何身份验è¯å³å¯è®¿é—®ã€‚"
msgid "ForkProject|Visibility level"
msgstr "å¯è§æ€§çº§åˆ«"
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
-msgstr "想在åŒä¸€ä¸ªå‘½å空间下容纳多个ä¾èµ–项目?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
+msgstr "想在åŒä¸€ä¸ªå‘½å空间下阻止多个ä¾èµ–项目?"
msgid "ForkSuggestion|Cancel"
msgstr "å–消"
@@ -16246,7 +16491,7 @@ msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level
msgstr "从 2022 å¹´ 6 月 22 日(GitLab 15.1)开始,å…费的个人命å空间和顶级群组将é™åˆ¶ä¸º %{free_limit} 个æˆå‘˜"
msgid "From June 22, 2022 (GitLab 15.1), you can have a maximum of %{free_limit} unique members across all of your personal projects"
-msgstr ""
+msgstr "从 2022 å¹´ 6 月 22 日(15.1)开始,您的所有个人项目中最多å¯ä»¥æœ‰ %{free_limit} 个独特æˆå‘˜"
msgid "From issue creation until deploy to production"
msgstr "从创建议题到部署至生产环境"
@@ -16344,7 +16589,7 @@ msgid_plural "%d shards selected"
msgstr[0] "已选择 %d 个分片"
msgid "Geo|%{boldStart}Not applicable%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
-msgstr ""
+msgstr "%{boldStart}ä¸é€‚用%{boldEnd}:Geo 尚未验è¯æ­¤ç»„件。查看我们计划支æŒçš„ %{linkStart}æ•°æ®ç±»åž‹%{linkEnd}。"
msgid "Geo|%{component} synced"
msgstr "%{component} å·²åŒæ­¥"
@@ -16412,9 +16657,6 @@ msgstr "å…许的Geo IP应该介于1到255个字符之间"
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr "å…许的Geo IP应该包å«æœ‰æ•ˆçš„IP地å€"
-msgid "Geo|Beta"
-msgstr "Beta"
-
msgid "Geo|Checksummed"
msgstr "已校验"
@@ -16491,7 +16733,7 @@ msgid "Geo|Filter by status"
msgstr "按状æ€ç­›é€‰"
msgid "Geo|Full details"
-msgstr ""
+msgstr "完整详情"
msgid "Geo|Geo Settings"
msgstr "Geo设置"
@@ -16619,15 +16861,9 @@ msgstr "待验è¯"
msgid "Geo|Primary"
msgstr "主è¦èŠ‚点"
-msgid "Geo|Primary node"
-msgstr "主节点"
-
msgid "Geo|Primary site"
msgstr "主站点"
-msgid "Geo|Project"
-msgstr "项目"
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr "项目(ID: %{project_id})å·²ä¸å†å­˜åœ¨äºŽä¸»èŠ‚点。 当å‰é¡¹å¯ä»¥è¢«å®‰å…¨çš„删除,因为这并ä¸ä¼šåˆ é™¤ä»»ä½•ç£ç›˜ä¸Šçš„有用数æ®ã€‚"
@@ -16695,13 +16931,13 @@ msgid "Geo|Resync all"
msgstr "é‡æ–°åŒæ­¥æ‰€æœ‰"
msgid "Geo|Resync all %{projects_count} projects"
-msgstr ""
+msgstr "é‡æ–°åŒæ­¥æ‰€æœ‰ %{projects_count} 个项目"
msgid "Geo|Resync all %{total}%{replicableType}"
-msgstr ""
+msgstr "é‡æ–°åŒæ­¥æ‰€æœ‰ %{total} 个%{replicableType}"
msgid "Geo|Resync project"
-msgstr ""
+msgstr "é‡æ–°åŒæ­¥é¡¹ç›®"
msgid "Geo|Retry count"
msgstr "é‡è¯•è®¡æ•°"
@@ -16713,10 +16949,10 @@ msgid "Geo|Reverify all"
msgstr "é‡æ–°æ ¡éªŒæ‰€æœ‰"
msgid "Geo|Reverify all %{projects_count} projects"
-msgstr ""
+msgstr "é‡æ–°éªŒè¯æ‰€æœ‰ %{projects_count} 个项目"
msgid "Geo|Reverify project"
-msgstr ""
+msgstr "é‡æ–°éªŒè¯é¡¹ç›®"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr "查看å¤åˆ¶çŠ¶æ€å¹¶ä¸Žä¸»è¦ç«™ç‚¹é‡æ–°åŒæ­¥å’Œé‡æ–°éªŒè¯é¡¹ç›®ã€‚"
@@ -16724,9 +16960,6 @@ msgstr "查看å¤åˆ¶çŠ¶æ€å¹¶ä¸Žä¸»è¦ç«™ç‚¹é‡æ–°åŒæ­¥å’Œé‡æ–°éªŒè¯é¡¹ç›®ã€‚
msgid "Geo|Secondary"
msgstr "次è¦èŠ‚点"
-msgid "Geo|Secondary node"
-msgstr "次节点"
-
msgid "Geo|Secondary site"
msgstr "次è¦ç«™ç‚¹"
@@ -16755,7 +16988,7 @@ msgid "Geo|Shards to synchronize"
msgstr "需åŒæ­¥çš„存储分片"
msgid "Geo|Show more"
-msgstr ""
+msgstr "显示更多"
msgid "Geo|Site name can't be blank"
msgstr "站点å称ä¸èƒ½ä¸ºç©º"
@@ -16775,9 +17008,6 @@ msgstr "存储é…ç½®"
msgid "Geo|Synced"
msgstr "åŒæ­¥"
-msgid "Geo|Synced at"
-msgstr "åŒæ­¥äºŽ"
-
msgid "Geo|Synchronization"
msgstr "åŒæ­¥"
@@ -16970,6 +17200,42 @@ msgstr "Git传输正在进行中"
msgid "Git version"
msgstr "Git 版本"
+msgid "GitAbuse|Excluded users"
+msgstr "排除的用户"
+
+msgid "GitAbuse|Number of repositories"
+msgstr "仓库数é‡"
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr "仓库数ä¸èƒ½ä¸ºç©ºã€‚设置为 0 表示没有é™åˆ¶ã€‚"
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr "仓库数必须是数字。"
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr "仓库数é‡åº”介于 %{minNumRepos} - %{maxNumRepos} 之间。"
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr "报告时间段(秒)"
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr "报告时间段ä¸èƒ½ä¸ºç©ºã€‚设置为 0 表示没有é™åˆ¶ã€‚"
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr "报告时间段必须是数字。"
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr "报告时间长度应该在 %{minTimePeriod} - %{maxTimePeriod} 秒之间。"
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr "用户在被å°ç¦ä¹‹å‰ï¼Œåœ¨æŒ‡å®šæ—¶é—´æ®µå†…å¯ä»¥ä¸‹è½½çš„å•ä¸€ä»“库的最大数é‡ã€‚"
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr "被排除在 Git 滥用率é™åˆ¶ä¹‹å¤–的用户。"
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr "您ä¸èƒ½æŒ‡å®šè¶…过 %{maxExcludedUsers} 个排除的用户。"
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr "GitHub API速率超过é™åˆ¶ã€‚请在%{reset_time}åŽé‡è¯•"
@@ -16983,7 +17249,7 @@ msgid "GitLab"
msgstr "GitLab"
msgid "GitLab (self-managed)"
-msgstr ""
+msgstr "GitLab(ç§æœ‰åŒ–部署版)"
msgid "GitLab / Unsubscribe"
msgstr "å–消订阅"
@@ -16997,6 +17263,9 @@ msgstr "GitLabå¸æˆ·åˆ›å»ºè¯·æ±‚"
msgid "GitLab Billing Team."
msgstr "GitLab计费团队。"
+msgid "GitLab Error Tracking"
+msgstr "GitLab 错误跟踪"
+
msgid "GitLab Import"
msgstr "GitLab导入"
@@ -17043,7 +17312,7 @@ msgid "GitLab export"
msgstr "GitLab导出"
msgid "GitLab for Jira Cloud"
-msgstr ""
+msgstr "GitLab for Jira Cloud"
msgid "GitLab group: %{source_link}"
msgstr "GitLab 群组:%{source_link}"
@@ -17070,7 +17339,7 @@ msgid "GitLab is open source software to collaborate on code."
msgstr "GitLab 是用于代ç å作的开æºè½¯ä»¶ã€‚"
msgid "GitLab is undergoing maintenance"
-msgstr ""
+msgstr "系统正在进行维护"
msgid "GitLab logo"
msgstr "GitLab logo"
@@ -17087,9 +17356,6 @@ msgstr "GitLabå•ç‚¹ç™»å½•ç½‘å€"
msgid "GitLab username"
msgstr "GitLab用户å"
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr "GitLabå¯ä½¿ç”¨ %{jaeger_link}æ¥ç›‘控分布å¼ç³»ç»Ÿã€‚"
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr "GitLab 使用 %{linkStart}Sidekiq%{linkEnd} 处ç†åŽå°ä½œä¸š"
@@ -17103,7 +17369,7 @@ msgid "GitLab.com"
msgstr "GitLab.com"
msgid "GitLab.com (SaaS)"
-msgstr ""
+msgstr "GitLab.com (SaaS)"
msgid "GitLab.com import"
msgstr "从GitLab.com导入"
@@ -17124,7 +17390,7 @@ msgid "GitLabPages|Are you sure?"
msgstr "确定继续�"
msgid "GitLabPages|Can be overridden per project. For no limit, enter 0. To inherit the value, leave empty."
-msgstr ""
+msgstr "å¯ä»¥æŒ‰é¡¹ç›®è¦†ç›–。如果没有é™åˆ¶ï¼Œè¯·è¾“å…¥ 0。è¦ç»§æ‰¿è¯¥å€¼ï¼Œè¯·ç•™ç©ºã€‚"
msgid "GitLabPages|Certificate: %{subject}"
msgstr "è¯ä¹¦: %{subject}"
@@ -17148,7 +17414,7 @@ msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable th
msgstr "GitLab Pages在此项目中ç¦ç”¨ã€‚您å¯ä»¥åœ¨æ‚¨çš„项目的%{strong_start}设置 &gt; 常规 &gt; å¯è§æ€§%{strong_end}页é¢å¯ç”¨ã€‚"
msgid "GitLabPages|Maximum size (MB)"
-msgstr ""
+msgstr "最大大å°ï¼ˆMB)"
msgid "GitLabPages|New Domain"
msgstr "新域å"
@@ -17163,10 +17429,10 @@ msgid "GitLabPages|Remove"
msgstr "删除"
msgid "GitLabPages|Remove certificate"
-msgstr ""
+msgstr "移除è¯ä¹¦"
msgid "GitLabPages|Remove domain"
-msgstr ""
+msgstr "删除域å"
msgid "GitLabPages|Remove pages"
msgstr "删除页é¢"
@@ -17186,6 +17452,9 @@ msgstr "域åå’Œè¯ä¹¦æ”¯æŒå·²è¢«ç¦ç”¨ã€‚请系统管ç†å‘˜å¯ç”¨ã€‚"
msgid "GitLabPages|Unverified"
msgstr "未验è¯"
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr "正在更新您的页é¢é…ç½®..."
+
msgid "GitLabPages|Verified"
msgstr "已验è¯"
@@ -17291,14 +17560,20 @@ msgstr "全局快æ·é”®"
msgid "Global notification settings"
msgstr "全局通知设置"
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr "%{search} %{description} %{scope}"
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "æä¾› %{count} 个默认结果,使用上下箭头键导航æœç´¢ç»“果列表。"
+msgid "GlobalSearch|Groups"
+msgstr "群组"
+
msgid "GlobalSearch|Issues I've created"
msgstr "我创建的议题"
msgid "GlobalSearch|Issues assigned to me"
-msgstr "分é…给我的议题"
+msgstr "指派给我的议题"
msgid "GlobalSearch|Merge requests I've created"
msgstr "我创建的åˆå¹¶è¯·æ±‚"
@@ -17309,6 +17584,9 @@ msgstr "分é…给我的åˆå¹¶è¯·æ±‚"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "我作为审核者的åˆå¹¶è¯·æ±‚"
+msgid "GlobalSearch|Projects"
+msgstr "项目"
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "结果已更新, %{count} 个结果å¯ç”¨ï¼Œä½¿ç”¨ä¸Šä¸‹ç®­å¤´é”®æµè§ˆæœç´¢ç»“果列表,或使用 ENTER é”®æ交。"
@@ -17330,20 +17608,26 @@ msgstr "输入并按回车键æ交æœç´¢ã€‚"
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr "新建议在下é¢æ˜¾ç¤ºã€‚"
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr "使用快æ·é”® %{kbdOpen}/%{kbdClose} 开始æœç´¢"
+
msgid "GlobalSearch|What are you searching for?"
msgstr "您正在æœç´¢ä»€ä¹ˆï¼Ÿ"
-msgid "GlobalSearch|in all GitLab"
-msgstr "在整个 GitLab 实例中"
+msgid "GlobalSearch|all GitLab"
+msgstr "全局æœç´¢"
-msgid "GlobalSearch|in group"
-msgstr "在群组中"
+msgid "GlobalSearch|group"
+msgstr "群组"
-msgid "GlobalSearch|in project"
-msgstr "在项目中"
+msgid "GlobalSearch|in %{scope}"
+msgstr "在%{scope}中"
+
+msgid "GlobalSearch|project"
+msgstr "项目"
msgid "Globally-allowed IP ranges"
-msgstr ""
+msgstr "全局å…许的 IP 范围"
msgid "Go Back"
msgstr "返回"
@@ -17415,7 +17699,7 @@ msgid "Go to next page"
msgstr "转到下一页"
msgid "Go to next unresolved thread"
-msgstr ""
+msgstr "å‰å¾€ä¸‹ä¸€ä¸ªæœªè§£å†³çš„主题"
msgid "Go to page %{page}"
msgstr "å‰å¾€ %{page} 页"
@@ -17430,7 +17714,7 @@ msgid "Go to previous page"
msgstr "转到上一页"
msgid "Go to previous unresolved thread"
-msgstr ""
+msgstr "å‰å¾€ä¸Šä¸€ä¸ªæœªè§£å†³çš„主题"
msgid "Go to primary site"
msgstr "转到主站点"
@@ -17451,7 +17735,7 @@ msgid "Go to snippets"
msgstr "转到代ç ç‰‡æ®µ"
msgid "Go to the %{b_open}Activity%{b_close} page for %{project_link}."
-msgstr ""
+msgstr "转到 %{project_link} çš„%{b_open}动æ€%{b_close}页é¢ã€‚"
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
msgstr "转到“管ç†ä¸­å¿ƒ &gt; 注册é™åˆ¶â€ï¼Œç„¶åŽé€‰ä¸­â€œå…许注册的域â€ã€‚"
@@ -17615,6 +17899,9 @@ msgstr "å¯ç”¨ Gravatar"
msgid "Group"
msgstr "群组"
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr "群组“%{group_name}â€å·²æˆåŠŸæ›´æ–°ã€‚"
+
msgid "Group %{group_name} couldn't be exported."
msgstr "群组%{group_name}无法导出。"
@@ -17768,6 +18055,9 @@ msgstr "群组已æˆåŠŸæ›´æ–°ã€‚"
msgid "Group wikis"
msgstr "群组 Wiki"
+msgid "Group-level wiki is disabled."
+msgstr "å·²ç¦ç”¨ç¾¤ç»„ wiki。"
+
msgid "Group: %{group_name}"
msgstr "群组:%{group_name}"
@@ -17777,8 +18067,8 @@ msgstr "群组: %{name}"
msgid "GroupActivityMetrics|Issues created"
msgstr "议题已创建"
-msgid "GroupActivityMetrics|Last 90 days"
-msgstr "过去 90 天"
+msgid "GroupActivityMetrics|Last 30 days"
+msgstr "过去 30 天"
msgid "GroupActivityMetrics|Members added"
msgstr "添加新æˆå‘˜æ•°"
@@ -17922,7 +18212,7 @@ msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Id
msgstr "ç”Ÿæˆ SCIM 令牌以设置系统进行跨域身份管ç†ã€‚"
msgid "GroupSAML|Identifier"
-msgstr ""
+msgstr "标识符"
msgid "GroupSAML|Identity provider single sign-on URL"
msgstr "身份验è¯æ供商å•ç‚¹ç™»å½•URL"
@@ -18044,18 +18334,15 @@ msgstr "æœç´¢ç¾¤ç»„"
msgid "GroupSelect|Select a group"
msgstr "选择一个群组"
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr "å…许项目和群组访问令牌创建"
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr "å…许创建组织和è”系人,并将它们与议题相关è”。"
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr "应用到所有å­ç¾¤ç»„,除éžè¢«ç¾¤ç»„所有者覆盖。已添加到项目的群组将失去访问æƒé™ã€‚"
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "已为群组更新 Auto DevOps æµæ°´çº¿"
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr "自动å°ç¦åœ¨ç‰¹å®šé—´éš”内下载超过指定数é‡çš„项目的用户。"
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr "仅在顶级群组中å¯ç”¨ã€‚适用于所有å­ç»„。除éžæ‰‹åŠ¨åˆ é™¤ï¼Œå¦åˆ™ %{group} 以外的群组所共享的群组ä»ä¼šå…±äº«ã€‚"
@@ -18086,33 +18373,45 @@ msgstr "é…ç½®åˆè§„框架以æ供给此群组中的项目。 %{linkStart}了è§
msgid "GroupSettings|Custom project templates"
msgstr "自定义项目模æ¿"
+msgid "GroupSettings|Customer relations is enabled"
+msgstr "客户关系已å¯ç”¨"
+
msgid "GroupSettings|Customize this group's badges."
msgstr "自定义此群组的徽章。"
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "默认为此群组中所有项目的 Auto DevOps æµæ°´çº¿"
-msgid "GroupSettings|Disable email notifications"
-msgstr "ç¦ç”¨ç”µå­é‚®ä»¶é€šçŸ¥"
-
-msgid "GroupSettings|Disable group mentions"
-msgstr "ç¦ç”¨ç¾¤ç»„æåŠ"
-
-msgid "GroupSettings|Enable customer relations"
-msgstr "å¯ç”¨å®¢æˆ·å…³ç³»"
-
-msgid "GroupSettings|Enable delayed project deletion"
-msgstr "å¯ç”¨å»¶è¿Ÿé¡¹ç›®åˆ é™¤"
+msgid "GroupSettings|Email notifications are disabled"
+msgstr "电å­é‚®ä»¶é€šçŸ¥å·²ç¦ç”¨"
msgid "GroupSettings|Export group"
msgstr "导出群组"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
+msgstr "如果群组被æåŠï¼Œä¸é€šçŸ¥ç¾¤ç»„æˆå‘˜ã€‚"
+
+msgid "GroupSettings|Group mentions are disabled"
+msgstr "群组æåŠå·²ç¦ç”¨"
+
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
msgstr "如果未在群组或实例级别指定,则默认为 %{default_initial_branch_name}。ä¸å½±å“现有仓库。"
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr "如果父组的å¯è§æ€§ä½ŽäºŽè¯¥ç»„的当å‰å¯è§æ€§ï¼Œåˆ™å­ç»„和项目的å¯è§æ€§çº§åˆ«å°†æ›´æ”¹ï¼ŒåŒ¹é…新父组的å¯è§æ€§ã€‚"
+msgid "GroupSettings|Interval (seconds)"
+msgstr "间隔(秒)"
+
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
+msgstr "æˆå‘˜ä¸èƒ½é‚€è¯· %{group} åŠå…¶å­ç»„之外的群组"
+
+msgid "GroupSettings|Number of projects"
+msgstr "项目数"
+
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
+msgstr "组织和è”系人å¯ä»¥è¢«åˆ›å»ºå¹¶å…³è”到议题。"
+
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "覆盖群组ã€å­ç»„和项目所有æˆå‘˜çš„用户通知å好设置。"
@@ -18128,23 +18427,14 @@ 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 "ç¦æ­¢æˆå‘˜å‘é€é‚€è¯·åˆ° %{group} åŠå…¶å­ç¾¤ç»„。"
-
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr "ç¦æ­¢ä¸Žå…¶ä»–群组共享 %{group} 中的项目"
-
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr "阻止群组æˆå‘˜åœ¨æåŠç¾¤ç»„时得到通知。"
+msgid "GroupSettings|Project download rate limit"
+msgstr "项目下载速率é™åˆ¶"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
-msgstr "项目将在 %{waiting_period}天延迟åŽæ°¸ä¹…删除,由å­ç»„继承。"
+msgid "GroupSettings|Projects in %{group} cannot be shared with other groups"
+msgstr "%{group} 中的项目ä¸èƒ½ä¸Žå…¶ä»–群组共享"
-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 "项目将在%{waiting_period}天延迟åŽæ°¸ä¹…删除,此延迟在实例设置中%{link_start}å¯ä»¥ç”±ç®¡ç†å‘˜å®šä¹‰%{link_end} ,由å­ç¾¤ç»„继承。"
-
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
-msgstr "选择 %{code_start}.gitlab/insights.yml%{code_end} 文件的项目"
+msgid "GroupSettings|Reporting"
+msgstr "报告"
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr "选择一个å­ç»„用作该组的自定义项目模æ¿çš„æºã€‚"
@@ -18152,18 +18442,27 @@ msgstr "选择一个å­ç»„用作该组的自定义项目模æ¿çš„æºã€‚"
msgid "GroupSettings|Select parent group"
msgstr "选择父组"
-msgid "GroupSettings|Select the project that contains your custom Insights file."
-msgstr "选择包å«è‡ªå®šä¹‰Insight文件的项目。"
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr "é€‰æ‹©åŒ…å« %{code_start}.gitlab/insights.yml%{code_end} 文件的项目"
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
+msgstr "选择包å«è‡ªå®šä¹‰ Insights 文件的项目。%{help_link_start}什么是 Insight?%{help_link_end}"
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "为该群组中æ¯ä¸ª Pages 站点中的所有内容设置大å°é™åˆ¶ã€‚%{link_start}了解更多。%{link_end}"
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr "设置群组中创建的新仓库的默认分支的åˆå§‹å称和ä¿æŠ¤ã€‚"
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr "设置为 0 以ç¦ç”¨é™åˆ¶ã€‚"
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr "如果找ä¸åˆ°æ›¿ä»£ CI é…置文件,则Auto DevOps æµæ°´çº¿å°†è¿è¡Œã€‚"
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+msgstr "用户在被å°ç¦ä¹‹å‰ï¼Œå¯ä»¥åœ¨æŒ‡å®šçš„间隔内下载的项目的最大数é‡ã€‚设置为 0 以ç¦ç”¨é™åˆ¶ã€‚"
+
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 "å¯ä»¥é€‰æ‹©è¯¥å­ç»„中的项目作为该组中创建的新项目的模æ¿ã€‚ %{link_start}了解更多。%{link_end}"
@@ -18185,8 +18484,8 @@ msgstr "此设置已应用于 %{ancestor_group}。 您å¯ä»¥è¦†ç›–此设置或 %
msgid "GroupSettings|Transfer group"
msgstr "转移群组"
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
-msgstr "用户å¯ä»¥åœ¨è¯¥ç¾¤ç»„中创建 %{link_start_project}项目访问令牌%{link_end} å’Œ %{link_start_group}群组访问令牌%{link_end}。"
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
+msgstr "用户å¯ä»¥åœ¨è¯¥ç¾¤ç»„中创建%{link_start_project}项目访问令牌%{link_end}å’Œ%{link_start_group}群组访问令牌%{link_end}"
msgid "GroupSettings|What are badges?"
msgstr "什么是徽章?"
@@ -18255,13 +18554,13 @@ msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "群组是几个项目的集åˆã€‚"
msgid "GroupsEmptyState|Create new project"
-msgstr ""
+msgstr "创建新项目"
msgid "GroupsEmptyState|Create new subgroup"
-msgstr ""
+msgstr "创建新的å­ç»„"
msgid "GroupsEmptyState|Groups are the best way to manage multiple projects and members."
-msgstr ""
+msgstr "群组是管ç†å¤šä¸ªé¡¹ç›®å’Œæˆå‘˜çš„最佳方å¼ã€‚"
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "如果您在一个群组下组织项目,它的工作方å¼å°±åƒä¸€ä¸ªæ–‡ä»¶å¤¹ã€‚"
@@ -18270,16 +18569,16 @@ msgid "GroupsEmptyState|No groups found"
msgstr "找ä¸åˆ°ç¾¤ç»„"
msgid "GroupsEmptyState|No subgroups or projects."
-msgstr ""
+msgstr "没有å­ç»„或项目。"
msgid "GroupsEmptyState|Projects are where you can store your code, access issues, wiki, and other features of Gitlab."
-msgstr ""
+msgstr "项目是您用æ¥å­˜å‚¨æ‚¨çš„代ç ã€è®¿é—®è®®é¢˜ã€wiki 和其它功能的地方。"
msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
msgstr "您å¯ä»¥ç®¡ç†ç¾¤ç»„æˆå‘˜çš„æƒé™å¹¶è®¿é—®ç¾¤ç»„中的æ¯ä¸ªé¡¹ç›®ã€‚"
msgid "GroupsEmptyState|You do not have necessary permissions to create a subgroup or project in this group. Please contact an owner of this group to create a new subgroup or project."
-msgstr ""
+msgstr "您没有在该群组中创建å­ç»„或项目的必è¦æƒé™ã€‚请è”系该群组的所有者æ¥åˆ›å»ºæ–°çš„å­ç»„或项目。"
msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
msgstr "%{linkStart}群组%{linkEnd}å…许您在多个项目之间进行管ç†ä¸Žå作。群组的æˆå‘˜æ‹¥æœ‰è®¿é—®å…¶ä¸­æ‰€æœ‰é¡¹ç›®çš„æƒé™ã€‚"
@@ -18309,7 +18608,7 @@ msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{li
msgstr "通过创建 %{linkStart}å­ç»„%{linkEnd} 也å¯ä»¥åµŒå¥—群组。"
msgid "GroupsNew|Import a group and related data from another GitLab instance."
-msgstr ""
+msgstr "从å¦ä¸€ä¸ªå®žä¾‹å¯¼å…¥ç¾¤ç»„和相关数æ®ã€‚"
msgid "GroupsNew|Import group"
msgstr "导入群组"
@@ -18317,9 +18616,6 @@ msgstr "导入群组"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "从å¦ä¸€ä¸ªGitLab实例导入群组"
-msgid "GroupsNew|My Awesome Group"
-msgstr "My Awesome Group"
-
msgid "GroupsNew|No import options available"
msgstr "æ— å¯ç”¨çš„导入选项"
@@ -18450,7 +18746,7 @@ msgid "HarborIntegration|Base URL of the Harbor instance."
msgstr "Harbor 实例的基础 URL。"
msgid "HarborIntegration|Enter new Harbor password"
-msgstr ""
+msgstr "输入新的 Harbor 密ç "
msgid "HarborIntegration|Harbor URL"
msgstr "Harbor URL"
@@ -18465,7 +18761,7 @@ msgid "HarborIntegration|Harbor username"
msgstr "Harbor 用户å"
msgid "HarborIntegration|Leave blank to use your current password."
-msgstr ""
+msgstr "留空时,使用您当å‰çš„密ç ã€‚"
msgid "HarborIntegration|Password for your Harbor username."
msgstr "您的 Harbor 用户å的密ç ã€‚"
@@ -18647,7 +18943,7 @@ msgid "Help"
msgstr "帮助"
msgid "Help translate GitLab into your language"
-msgstr ""
+msgstr "帮助将 GitLab 翻译æˆæ‚¨çš„语言"
msgid "Helps prevent bots from brute-force attacks."
msgstr "有助于防止机器人暴力攻击。"
@@ -18674,7 +18970,7 @@ msgid "Hi %{username}!"
msgstr "%{username},您好!"
msgid "Hi %{username},"
-msgstr ""
+msgstr "%{username},您好,"
msgid "Hidden"
msgstr "éšè—"
@@ -18683,7 +18979,7 @@ msgid "Hide"
msgstr "éšè—"
msgid "Hide Live Preview"
-msgstr ""
+msgstr "éšè—实时预览"
msgid "Hide archived projects"
msgstr "éšè—已归档的项目"
@@ -18795,12 +19091,12 @@ msgstr "主页"
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr "Hook 执行失败。确ä¿ç¾¤ç»„有一个包å«æ交的项目。"
-msgid "Hook was successfully created."
-msgstr "Hook å·²æˆåŠŸåˆ›å»ºã€‚"
-
msgid "Hook was successfully updated."
msgstr "é’©å­å·²æˆåŠŸæ›´æ–°ã€‚"
+msgid "Horizontal rule"
+msgstr "水平规则"
+
msgid "Hostname"
msgstr "主机å"
@@ -18810,9 +19106,6 @@ msgstr "ç§äººæ交电å­é‚®ä»¶ä¸­ä½¿ç”¨çš„主机å。 %{learn_more}"
msgid "Hour (UTC)"
msgstr "å°æ—¶(UTC)"
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr "存放您的文件ã€è§„划您的工作ã€å作编写代ç ç­‰ç­‰ã€‚"
-
msgid "Housekeeping"
msgstr "例行维护"
@@ -18922,7 +19215,7 @@ msgid "IDE|Review"
msgstr "审阅"
msgid "IDE|Start a new merge request"
-msgstr ""
+msgstr "å¼€å¯æ–°çš„åˆå¹¶è¯·æ±‚"
msgid "IDE|Successful commit"
msgstr "æˆåŠŸæ交"
@@ -18972,15 +19265,66 @@ msgstr "在您创建第一个项目之å‰ï¼Œæˆ‘们需è¦æ‚¨ä½¿ç”¨æœ‰æ•ˆçš„付款
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr "在您创建群组之å‰ï¼Œæˆ‘们需è¦æ‚¨ä½¿ç”¨æœ‰æ•ˆçš„付款方å¼éªŒè¯æ‚¨çš„身份。在此步骤中ä¸ä¼šå‘您收费。如果我们需è¦å‘您收费,我们会通知您。"
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr "在您登录之å‰ï¼Œæˆ‘们需è¦éªŒè¯æ‚¨çš„身份。请在登录页é¢è¾“入以下验è¯ç ã€‚"
+
msgid "IdentityVerification|Create a project"
msgstr "创建项目"
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr "为了增加安全性,您需è¦éªŒè¯æ‚¨çš„èº«ä»½ã€‚æˆ‘ä»¬å·²å‘ %{email} å‘é€éªŒè¯ç "
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr "帮助我们ä¿æŠ¤æ‚¨çš„å¸æˆ·"
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr "如果您最近没有å°è¯•ç™»å½•ï¼Œæˆ‘们建议%{password_link_start}更改您的密ç %{link_end}å’Œ%{two_fa_link_start}设置åŒé‡èº«ä»½éªŒè¯%{link_end}æ¥ç¡®ä¿æ‚¨çš„å¸æˆ·å®‰å…¨ã€‚您的验è¯ç å°†åœ¨ %{expires_in_minutes} 分钟åŽè¿‡æœŸã€‚"
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr "如果您最近未å°è¯•ç™»å½•ï¼Œæˆ‘们建议您修改密ç ï¼ˆ%{password_link})并设置åŒé‡èº«ä»½è®¤è¯ï¼ˆ%{two_fa_link})æ¥ä¿è¯æ‚¨çš„å¸æˆ·å®‰å…¨ã€‚"
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr "如果您无法访问与此å¸æˆ·å…³è”的电å­é‚®ä»¶æˆ–验è¯ç æœ‰é—®é¢˜ï¼Œ%{link_start}这里是您å¯ä»¥é‡‡å–的其他一些步骤。%{link_end}"
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr "超过最大登录å°è¯•æ¬¡æ•°ã€‚等待 %{interval} åŽé‡è¯•ã€‚"
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr "请输入验è¯ç "
+
+msgid "IdentityVerification|Resend code"
+msgstr "é‡æ–°å‘é€éªŒè¯ç "
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr "验è¯ç å·²è¿‡æœŸã€‚é‡æ–°å‘é€æ–°éªŒè¯ç ç„¶åŽé‡è¯•ã€‚"
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr "验è¯ç ä¸æ­£ç¡®ã€‚å†æ¬¡è¾“入或é‡æ–°å‘é€æ–°éªŒè¯ç ã€‚"
+
+msgid "IdentityVerification|Verification code"
+msgstr "验è¯ç "
+
+msgid "IdentityVerification|Verification successful"
+msgstr "验è¯æˆåŠŸ"
+
+msgid "IdentityVerification|Verify code"
+msgstr "验è¯ç "
+
msgid "IdentityVerification|Verify your identity"
msgstr "验è¯æ‚¨çš„身份"
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr "您å¯ä»¥ç¨åŽéšæ—¶éªŒè¯æ‚¨çš„å¸æˆ·ï¼Œæ¥åˆ›å»ºä¸€ä¸ªç¾¤ç»„。"
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr "您已达到最大å°è¯•æ¬¡æ•°ã€‚等待 %{interval} 或é‡æ–°å‘é€æ–°ä»£ç ï¼Œç„¶åŽé‡è¯•ã€‚"
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr "您的å¸æˆ·å·²æˆåŠŸéªŒè¯ã€‚ç¨åŽæ‚¨å°†è¢«é‡å®šå‘到您的å¸æˆ·æˆ–%{redirect_url_start}å•å‡»æ­¤å¤„%{redirect_url_end}刷新。"
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr "您的验è¯ç å°†åœ¨ %{expires_in_minutes} 分钟åŽè¿‡æœŸã€‚"
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr "如果任何索引字段超过此é™åˆ¶ï¼Œåˆ™å°†å…¶æˆªæ–­ä¸ºæ­¤å­—符数。其余内容既ä¸ç¼–入索引也ä¸å¯æœç´¢ã€‚è¿™ä¸é€‚用于仓库和 wiki 索引。对于无é™å­—符,将此设置为 0。"
@@ -19018,10 +19362,10 @@ msgid "If this email was added in error, you can remove it here: %{profile_email
msgstr "如果此电å­é‚®ä»¶è¢«é”™è¯¯æ·»åŠ ï¼Œæ‚¨å¯ä»¥åœ¨è¿™é‡Œåˆ é™¤å®ƒï¼š %{profile_emails_url}"
msgid "If this is a mistake, you can %{link_start}unban them%{link_end}."
-msgstr ""
+msgstr "如果这是一个错误,您å¯ä»¥%{link_start}解除对他们的å°ç¦%{link_end}。"
msgid "If this is a mistake, you can unban them: %{url}."
-msgstr ""
+msgstr "如果这是一个错误,你å¯ä»¥è§£é™¤å¯¹ä»–们的å°ç¦ï¼š%{url}。"
msgid "If this was a mistake you can %{leave_link_start}leave the %{source_type}%{link_end}."
msgstr "如果这是一个错误,你å¯ä»¥%{leave_link_start}退出%{source_type}%{link_end}。"
@@ -19291,7 +19635,7 @@ msgid "Improve customer support with Service Desk"
msgstr "通过æœåŠ¡å°æ”¹å–„客户支æŒ"
msgid "In a seat"
-msgstr ""
+msgstr "å æœ‰å¸­ä½"
msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
msgstr "在拉å–é•œåƒçš„情况下,您的用户将æˆä¸ºæ´»åŠ¨æè¦ä¸­æ‰€æœ‰ä½œä¸ºæ›´æ–°ç»“果的事件的作者,例如创建新分支或将新æ交推é€åˆ°çŽ°æœ‰åˆ†æ”¯ã€‚"
@@ -19303,13 +19647,13 @@ msgid "In progress"
msgstr "进行中"
msgid "In the background, we're attempting to connect you again."
-msgstr ""
+msgstr "在åŽå°ï¼Œæˆ‘们正在å°è¯•å†æ¬¡è¿žæŽ¥æ‚¨ã€‚"
msgid "In this page you will find information about the settings that are used in your current instance."
msgstr "在此页é¢ä¸­ï¼Œæ‚¨å°†æ‰¾åˆ°æœ‰å…³å½“å‰å®žä¾‹ä¸­ä½¿ç”¨çš„设置的信æ¯ã€‚"
msgid "In use"
-msgstr ""
+msgstr "正在使用"
msgid "InProductMarketing|%{organization_name} logo"
msgstr "%{organization_name} 标志"
@@ -19381,7 +19725,7 @@ msgid "InProductMarketing|Break down silos to coordinate seamlessly across devel
msgstr "打破孤岛,在开å‘ã€è¿è¥å’Œå®‰å…¨ä¹‹é—´æ— ç¼å调,在整个开å‘生命周期中æ供一致的体验。"
msgid "InProductMarketing|Building for iOS? We've got you covered."
-msgstr ""
+msgstr "为 iOS 构建?我们会为您æä¾›ä¿éšœã€‚"
msgid "InProductMarketing|Burn up/down charts"
msgstr "燃起/燃尽图"
@@ -19732,7 +20076,7 @@ msgid "InProductMarketing|Take your source code management to the next level"
msgstr "让您的æºä»£ç ç®¡ç†æ›´ä¸Šä¸€å±‚楼"
msgid "InProductMarketing|Team members collaborating"
-msgstr ""
+msgstr "团队æˆå‘˜è¿›è¡Œå作"
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr "在 GitLab 中组队以æ高效率"
@@ -19807,7 +20151,7 @@ msgid "InProductMarketing|Visualize your epics and milestones in a timeline."
msgstr "在时间线上å¯è§†åŒ–您的å²è¯—和里程碑。"
msgid "InProductMarketing|Want to get your iOS app up and running, including publishing all the way to TestFlight? Follow our guide to set up GitLab and fastlane to publish iOS apps to the App Store."
-msgstr ""
+msgstr "想è¦å¯åŠ¨å¹¶è¿è¡Œæ‚¨çš„ iOS 应用程åºï¼ŒåŒ…括一直å‘布到 TestFlight?按照我们的指å—设置 GitLab å’Œ fastlane 以将 iOS 应用程åºå‘布到 App Store。"
msgid "InProductMarketing|Want to host GitLab on your servers?"
msgstr "想在您的æœåŠ¡å™¨ä¸Šæ‰˜ç®¡ GitLab?"
@@ -19927,7 +20271,7 @@ msgid "IncidentManagement|An error occurred while updating the incident status.
msgstr "更新事件状æ€æ—¶å‡ºé”™ã€‚请刷新页é¢ï¼Œç„¶åŽå†è¯•ä¸€æ¬¡ã€‚"
msgid "IncidentManagement|Assign paging status"
-msgstr "分é…分页状æ€"
+msgstr "指派呼å«çŠ¶æ€"
msgid "IncidentManagement|Assignees"
msgstr "指派人"
@@ -19993,7 +20337,7 @@ msgid "IncidentManagement|Resolved"
msgstr "已解决"
msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
-msgstr "当为事件选择å‡çº§ç­–略时,设置状æ€ä¸ºå·²ç¡®è®¤æˆ–已解决时åœæ­¢é€šçŸ¥ã€‚"
+msgstr "当为事件选择å‡çº§ç­–略时,设置状æ€ä¸ºå·²ç¡®è®¤æˆ–已解决时åœæ­¢å‘¼å«ã€‚"
msgid "IncidentManagement|Severity"
msgstr "严é‡æ€§"
@@ -20088,9 +20432,15 @@ msgstr "添加时间线事件"
msgid "Incident|Alert details"
msgstr "警报详情"
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr "您确定è¦åˆ é™¤æ­¤äº‹ä»¶å—?"
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr "您确定è¦åˆ é™¤æ­¤é•œåƒå—?"
+msgid "Incident|Delete event"
+msgstr "删除事件"
+
msgid "Incident|Delete image"
msgstr "删除镜åƒ"
@@ -20103,12 +20453,30 @@ msgstr "编辑镜åƒæ–‡æœ¬æˆ–链接"
msgid "Incident|Editing %{filename}"
msgstr "正在编辑 %{filename}"
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr "创建事件时间线事件时出错: %{error}"
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr "删除事件时间线事件时出错: %{error}"
+
msgid "Incident|Metrics"
msgstr "指标"
msgid "Incident|No timeline items have been added yet."
msgstr "尚未添加任何时间线事项。"
+msgid "Incident|Save and add another event"
+msgstr "ä¿å­˜å¹¶æ·»åŠ å…¶ä»–事件"
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr "创建事件时间线事件时出了错。"
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr "删除事件时间线事件时出错。"
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr "获å–事件(incident)时间线事件时出了错。"
+
msgid "Incident|Summary"
msgstr "摘è¦"
@@ -20121,6 +20489,12 @@ msgstr "加载事件数æ®æ—¶å‡ºçŽ°é—®é¢˜ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Incident|Timeline"
msgstr "时间线"
+msgid "Incident|Timeline text"
+msgstr "时间线文本"
+
+msgid "Incident|Timeline text..."
+msgstr "时间线文本..."
+
msgid "Include author name in notification email body"
msgstr "在通知电å­é‚®ä»¶æ­£æ–‡ä¸­åŒ…å«ä½œè€…姓å"
@@ -20250,9 +20624,6 @@ msgstr "æ’å…¥"
msgid "Insert a %{rows}x%{cols} table."
msgstr "æ’å…¥ %{rows}x%{cols} 的表格。"
-msgid "Insert a code block"
-msgstr "æ’入代ç å—"
-
msgid "Insert a quote"
msgstr "æ’入引用"
@@ -20336,31 +20707,31 @@ msgid "Integration Settings"
msgstr "集æˆè®¾ç½®"
msgid "IntegrationEvents|A comment is added on a confidential issue"
-msgstr ""
+msgstr "一æ¡è¯„论被添加到ç§å¯†è®®é¢˜ã€‚"
msgid "IntegrationEvents|A comment is added on an issue"
-msgstr ""
+msgstr "一æ¡è¯„论被添加到议题。"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
-msgstr ""
+msgstr "一个ç§å¯†è®®é¢˜å·²åˆ›å»ºã€æ›´æ–°æˆ–关闭"
msgid "IntegrationEvents|A merge request is created, updated, or merged"
-msgstr ""
+msgstr "一个åˆå¹¶è¯·æ±‚已创建ã€æ›´æ–°æˆ–åˆå¹¶"
msgid "IntegrationEvents|A pipeline status changes"
-msgstr ""
+msgstr "æµæ°´çº¿çŠ¶æ€å˜æ›´"
msgid "IntegrationEvents|A push is made to the repository"
-msgstr ""
+msgstr "有一个推é€åˆ°æ­¤ä»“库"
msgid "IntegrationEvents|A tag is pushed to the repository"
-msgstr ""
+msgstr "一个标签被推é€åˆ°ä»“库"
msgid "IntegrationEvents|A wiki page is created or updated"
-msgstr ""
+msgstr "已创建或更新 wiki 页é¢"
msgid "IntegrationEvents|An issue is created, updated, or closed"
-msgstr ""
+msgstr "一个议题已创建ã€æ›´æ–°æˆ–关闭"
msgid "Integrations"
msgstr "集æˆ"
@@ -20392,6 +20763,9 @@ msgstr "继承这些设置的所有项目也将被é‡ç½®ã€‚"
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr "使用自定义设置加载项目时å‘生错误。"
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr "å‘生以下任一情况时将触å‘事件。"
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr "è¦å‘é€é€šçŸ¥çš„分支"
@@ -20404,11 +20778,14 @@ msgstr "评论细节:"
msgid "Integrations|Comment settings:"
msgstr "评论设置:"
+msgid "Integrations|Configure the scope of notifications."
+msgstr "é…置通知范围。"
+
msgid "Integrations|Connection details"
msgstr "连接情况"
-msgid "Integrations|Connection failed. Please check your settings."
-msgstr "连接失败。请检查您的设置。"
+msgid "Integrations|Connection failed. Check your integration settings."
+msgstr "连接失败。请检查您的集æˆè®¾ç½®ã€‚"
msgid "Integrations|Connection successful."
msgstr "连接æˆåŠŸã€‚"
@@ -20447,7 +20824,7 @@ msgid "Integrations|Failed to load namespaces. Please try again."
msgstr "加载命å空间失败,请é‡è¯•ã€‚"
msgid "Integrations|Failed to load subscriptions."
-msgstr ""
+msgstr "加载订阅失败。"
msgid "Integrations|Failed to sign in to GitLab."
msgstr "无法登录 GitLab。"
@@ -20500,6 +20877,9 @@ msgstr "没有å¯ç”¨çš„命å空间。"
msgid "Integrations|No linked namespaces"
msgstr "没有链接的命å空间"
+msgid "Integrations|Notification settings"
+msgstr "通知设置"
+
msgid "Integrations|Projects using custom settings"
msgstr "使用自定义设置的项目"
@@ -20515,6 +20895,9 @@ msgstr "é‡ç½®é›†æˆå—?"
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr "é‡ç½®æ­¤é›†æˆå°†æ¸…除设置并åœç”¨æ­¤é›†æˆã€‚"
+msgid "Integrations|Restrict to branch (optional)"
+msgstr "ä»…é™äºŽåˆ†æ”¯ï¼ˆå¯é€‰ï¼‰"
+
msgid "Integrations|Return to GitLab for Jira"
msgstr "返回GitLab for Jira"
@@ -20560,6 +20943,9 @@ msgstr "此集æˆå’Œç»§æ‰¿é¡¹ç›®å·²è¢«é‡ç½®ã€‚"
msgid "Integrations|To keep this project going, create a new issue."
msgstr "为了ä¿æŒè¿™ä¸ªé¡¹ç›®çš„推进,请创建一个新的议题."
+msgid "Integrations|Trigger"
+msgstr "触å‘器"
+
msgid "Integrations|Use custom settings"
msgstr "使用自定义设置"
@@ -20597,10 +20983,10 @@ msgid "Integrations|can't exceed %{recipients_limit}"
msgstr "ä¸èƒ½è¶…过 %{recipients_limit}"
msgid "IntelliJ IDEA (HTTPS)"
-msgstr ""
+msgstr "IntelliJ IDEA (HTTPS)"
msgid "IntelliJ IDEA (SSH)"
-msgstr ""
+msgstr "IntelliJ IDEA (SSH)"
msgid "Interactive mode"
msgstr "交互模å¼"
@@ -20621,7 +21007,7 @@ msgid "Internal error occurred while delivering this webhook."
msgstr "ä¼ é€æ­¤ webhook æ—¶å‘生内部错误。"
msgid "Internal note"
-msgstr ""
+msgstr "内部备注"
msgid "Internal users"
msgstr "内部用户"
@@ -20641,6 +21027,9 @@ msgstr "从 13.1 版本起,您需è¦å…ˆ%{recreate_link_start}é‡å»ºç´¢å¼•%{lin
msgid "Introducing Your DevOps Reports"
msgstr "介ç»æ‚¨çš„ DevOps 报告"
+msgid "Invalid"
+msgstr "无效"
+
msgid "Invalid Insights config file detected"
msgstr "检测到无效的 Insights é…置文件"
@@ -20653,15 +21042,6 @@ msgstr "无效的网å€"
msgid "Invalid URL: %{url}"
msgstr "无效 URL:%{url}"
-msgid "Invalid container_name"
-msgstr "无效的container_name"
-
-msgid "Invalid cursor parameter"
-msgstr "无效的游标å‚æ•°"
-
-msgid "Invalid cursor value provided"
-msgstr "æ供的游标值无效"
-
msgid "Invalid date"
msgstr "无效日期"
@@ -20704,9 +21084,6 @@ msgstr "无效的周期"
msgid "Invalid pin code."
msgstr "无效的 pin ç ã€‚"
-msgid "Invalid pod_name"
-msgstr "无效的pod_name"
-
msgid "Invalid policy type"
msgstr "无效的策略类型"
@@ -20716,15 +21093,12 @@ msgstr "针对代ç ç‰‡æ®µ%{snippet_id}的无效仓库包"
msgid "Invalid repository path"
msgstr "无效的仓库路径"
-msgid "Invalid search parameter"
-msgstr "无效的æœç´¢å‚æ•°"
+msgid "Invalid rule"
+msgstr "无效规则"
msgid "Invalid server response"
msgstr "无效的æœåŠ¡å™¨å“应"
-msgid "Invalid start or end time format"
-msgstr "无效的开始时间或结æŸæ—¶é—´æ ¼å¼"
-
msgid "Invalid status"
msgstr "无效的状æ€"
@@ -20813,7 +21187,7 @@ msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this gr
msgstr "ç›®å‰æ‚¨è¿˜æ²¡æœ‰é‚€è¯·ä»»ä½•äººåŠ å…¥è¿™ä¸ªç¾¤ç»„。 您å¯ä»¥é‚€è¯·æ‚¨çš„åŒäº‹åˆ°ç¾¤ç»„ç§ï¼Œä»¥æ–¹ä¾¿è®¨è®ºé—®é¢˜ï¼Œåœ¨åˆå¹¶è¯·æ±‚中进行å作,以åŠåˆ†äº«æ‚¨çš„知识。"
msgid "InviteMembersModal| To get more members and access to additional paid features, an owner of this namespace can start a trial or upgrade to a paid tier."
-msgstr ""
+msgstr "è¦èŽ·å¾—更多æˆå‘˜ä»¥åŠè®¿é—®æ›´å¤šä»˜è´¹åŠŸèƒ½ï¼Œæ­¤å‘½å空间的所有者å¯ä»¥å¼€å§‹è¯•ç”¨ï¼Œæˆ–å‡çº§åˆ°ä»˜è´¹ç‰ˆã€‚"
msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
msgstr "%{linkStart}了解更多%{linkEnd}关于角色æƒé™çš„ä¿¡æ¯"
@@ -20837,7 +21211,7 @@ msgid "InviteMembersModal|Create issues for your new team member to work on (opt
msgstr "为您的新团队æˆå‘˜åˆ›å»ºè®®é¢˜ (å¯é€‰)"
msgid "InviteMembersModal|Explore paid plans"
-msgstr ""
+msgstr "探索付费方案"
msgid "InviteMembersModal|GitLab is better with colleagues!"
msgstr "GitLab 与åŒäº‹å…±å¤„æ›´ä½³ï¼"
@@ -20855,11 +21229,14 @@ msgid "InviteMembersModal|Invite members"
msgstr "邀请æˆå‘˜"
msgid "InviteMembersModal|Manage members"
-msgstr ""
+msgstr "管ç†æˆå‘˜"
msgid "InviteMembersModal|Members were successfully added"
msgstr "æˆå‘˜å·²æˆåŠŸæ·»åŠ "
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr "请检查邀请错误并é‡è¯•ï¼š"
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "æœç´¢è¦é‚€è¯·çš„群组"
@@ -20875,8 +21252,12 @@ msgstr "选择æˆå‘˜æˆ–输入电å­é‚®ä»¶åœ°å€"
msgid "InviteMembersModal|Something went wrong"
msgstr "出现错误"
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] "以下 %d 个æˆå‘˜æ— æ³•è¢«é‚€è¯·"
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
-msgstr ""
+msgstr "此功能被ç¦ç”¨ï¼Œç›´åˆ°è¯¥ç¾¤ç»„有更多æˆå‘˜çš„空间。"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr "è¦å‘新团队æˆå‘˜åˆ†é…议题,您需è¦ä¸€ä¸ªè®®é¢˜æ‰€å±žçš„项目。 %{linkStart}从创建一个项目开始。%{linkEnd}"
@@ -20885,19 +21266,19 @@ msgid "InviteMembersModal|To get more members an owner of this namespace can %{t
msgstr "è¦èŽ·å¾—更多æˆå‘˜ï¼Œæ­¤å‘½å空间的所有者å¯ä»¥ %{trialLinkStart}开始试用%{trialLinkEnd} 或 %{upgradeLinkStart}å‡çº§%{upgradeLinkEnd} 到付费计划。"
msgid "InviteMembersModal|To make more space, you can remove members who no longer need access."
-msgstr ""
+msgstr "为了创造更多空间,您å¯ä»¥ç§»é™¤ä¸å†éœ€è¦è®¿é—®çš„æˆå‘˜ã€‚"
msgid "InviteMembersModal|Username or email address"
-msgstr ""
+msgstr "用户å或电å­é‚®ä»¶åœ°å€"
msgid "InviteMembersModal|You cannot add more members, but you can remove members who no longer need access."
-msgstr ""
+msgstr "您ä¸èƒ½æ·»åŠ æ›´å¤šæˆå‘˜ï¼Œä½†æ‚¨å¯ä»¥åˆ é™¤ä¸å†éœ€è¦è®¿é—®çš„æˆå‘˜ã€‚"
msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
msgstr "在 %{name},您åªæœ‰ %{count} 个更多的 %{members} 的空间"
msgid "InviteMembersModal|You only have space for %{count} more %{members} in your personal projects"
-msgstr ""
+msgstr "您的个人项目中仅有 %{count} 个更多的 %{members} 的空间"
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "您正在邀请一个群组加入 %{strongStart}%{name}%{strongEnd} 群组。"
@@ -20915,7 +21296,7 @@ msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{na
msgstr "您已达到 %{name} çš„ %{count} 个 %{members} é™åˆ¶"
msgid "InviteMembersModal|You've reached your %{count} %{members} limit for your personal projects"
-msgstr ""
+msgstr "您已ç»è¾¾åˆ°äº†æ‚¨ä¸ªäººé¡¹ç›®çš„ %{count} 个 %{members} çš„é™åˆ¶"
msgid "InviteMembers|Invite a group"
msgstr "邀请群组"
@@ -20986,6 +21367,9 @@ msgstr "这是一个å‹æƒ…æ醒。%{inviter}邀请您作为%{role}加入%{stron
msgid "Invited"
msgstr "已邀请"
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr "对于å—邀群组å…许的电å­é‚®ä»¶åŸŸï¼Œå¿…须包å«æ ¹ç¾¤ç»„çš„å…许电å­é‚®ä»¶åŸŸçš„å­é›†ã€‚转到群组的“设置 &gt; 通用â€é¡µé¢ï¼Œå¹¶é€‰ä¸­â€œé€šè¿‡ç”µå­é‚®ä»¶åŸŸé™åˆ¶æˆå‘˜èµ„æ ¼â€ã€‚"
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr "用空格分隔的频é“和用户。 %{recipients_docs_link}"
@@ -21169,15 +21553,9 @@ msgstr "新建议题URL"
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr "在外部议题跟踪器中创建议题的 URL。"
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr "YouTrack 中项目的 URL。"
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr "外部议题跟踪器中项目的 URL。"
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr "用于查看 YouTrack 项目中议题的 URLã€‚å¿…é¡»åŒ…å« %{colon_id}。"
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr "在外部议题跟踪器中查看议题的 URLã€‚å¿…é¡»åŒ…å« %{colon_id}。"
@@ -21230,7 +21608,7 @@ msgid "Issues closed"
msgstr "关闭议题"
msgid "Issues exist in projects, so to create an issue, first create a project."
-msgstr ""
+msgstr "议题存在于项目中,所以è¦åˆ›å»ºè®®é¢˜ï¼Œé¦–å…ˆè¦åˆ›å»ºä¸€ä¸ªé¡¹ç›®ã€‚"
msgid "Issues must match this scope to appear in this list."
msgstr "议题必须与此范围匹é…æ‰èƒ½å‡ºçŽ°åœ¨æ­¤åˆ—表中。"
@@ -21335,7 +21713,7 @@ msgid "Iterations|Cadence name"
msgstr "周期å称"
msgid "Iterations|Can be converted"
-msgstr ""
+msgstr "å¯ä»¥è½¬æ¢"
msgid "Iterations|Cancel"
msgstr "å–消"
@@ -21383,7 +21761,7 @@ msgid "Iterations|Error loading iteration cadences."
msgstr "加载迭代周期时出错。"
msgid "Iterations|First iteration start date"
-msgstr ""
+msgstr "第一次迭代开始日期"
msgid "Iterations|Iteration cadences"
msgstr "迭代周期"
@@ -21395,10 +21773,10 @@ msgid "Iterations|Learn more about automatic scheduling"
msgstr "了解更多关于自动计划的信æ¯"
msgid "Iterations|Manual management of iterations will be deprecated in GitLab 15.6. Convert your manual cadence to use automated scheduling when you are ready."
-msgstr ""
+msgstr "手动管ç†è¿­ä»£å°†åœ¨ 15.6 版本中被废弃。在准备好时,将手动æ“作转æ¢ä¸ºä½¿ç”¨è‡ªåŠ¨è®¡åˆ’方法。"
msgid "Iterations|Move incomplete issues to the next iteration."
-msgstr ""
+msgstr "将未完æˆçš„议题移至下一次迭代。"
msgid "Iterations|New iteration"
msgstr "新建迭代"
@@ -21419,13 +21797,13 @@ msgid "Iterations|No iterations in cadence."
msgstr "周期中没有迭代。"
msgid "Iterations|No one can change this date after the cadence has begun."
-msgstr ""
+msgstr "在周期开始åŽï¼Œä»»ä½•äººéƒ½æ— æ³•æ›´æ”¹æ­¤æ—¥æœŸã€‚"
msgid "Iterations|No open iterations."
msgstr "没有开放的迭代。"
msgid "Iterations|Number of upcoming iterations that should be scheduled at a time."
-msgstr ""
+msgstr "一次性应计划的å³å°†åˆ°æ¥çš„迭代数。"
msgid "Iterations|Open"
msgstr "开放"
@@ -21434,7 +21812,7 @@ msgid "Iterations|Roll over issues"
msgstr "滚动议题"
msgid "Iterations|Save changes"
-msgstr "ä¿å­˜ä¿®æ”¹"
+msgstr "ä¿å­˜æ›´æ”¹"
msgid "Iterations|Select duration"
msgstr "选择æŒç»­æ—¶é—´"
@@ -21449,16 +21827,16 @@ msgid "Iterations|Start date"
msgstr "开始日期"
msgid "Iterations|The duration of each iteration (in weeks)."
-msgstr ""
+msgstr "æ¯æ¬¡è¿­ä»£çš„æŒç»­æ—¶é—´ï¼ˆä»¥å‘¨ä¸ºå•ä½ï¼‰"
msgid "Iterations|The iteration has been deleted."
msgstr "迭代已被删除。"
msgid "Iterations|The start date of the first iteration determines when your cadence begins."
-msgstr ""
+msgstr "第一次迭代的开始日期决定了您的周期何时开始。"
msgid "Iterations|This cadence can be converted to use automated scheduling"
-msgstr ""
+msgstr "å¯ä»¥å°†æ­¤å‘¨æœŸè½¬æ¢ä¸ºä½¿ç”¨è‡ªåŠ¨è®¡åˆ’"
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr "这将删除周期以åŠå…¶ä¸­çš„所有迭代。"
@@ -21470,7 +21848,7 @@ msgid "Iterations|Title"
msgstr "标题"
msgid "Iterations|To convert this cadence to automatic scheduling, add a duration and number of upcoming iterations. The upgrade is irreversible."
-msgstr ""
+msgstr "è¦å°†æ­¤å‘¨æœŸè½¬æ¢ä¸ºè‡ªåŠ¨è®¡åˆ’,请添加æŒç»­æ—¶é—´å’Œå³å°†è¿›è¡Œçš„迭代次数。å‡çº§æ˜¯ä¸å¯é€†çš„。"
msgid "Iterations|Unable to find iteration cadence."
msgstr "无法找到迭代周期。"
@@ -21482,10 +21860,10 @@ msgid "Iterations|Unable to save cadence. Please try again."
msgstr "无法ä¿å­˜å‘¨æœŸï¼Œè¯·é‡è¯•ã€‚"
msgid "Iterations|Upcoming iterations"
-msgstr ""
+msgstr "å³å°†è¿›è¡Œçš„迭代"
msgid "Iterations|Your manual cadence can be converted to use automated scheduling"
-msgstr ""
+msgstr "您的手动周期å¯ä»¥è½¬æ¢ä¸ºä½¿ç”¨è‡ªåŠ¨è®¡åˆ’"
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr "日期ä¸èƒ½ä¸Žè¯¥ç¾¤ç»„内的其它现有迭代é‡å "
@@ -21496,9 +21874,6 @@ msgstr "日期ä¸èƒ½ä¸Žæ­¤è¿­ä»£å‘¨æœŸå†…的其他现有迭代é‡å "
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "ä¸èƒ½è¶…过未æ¥çš„500å¹´"
-msgid "Jaeger URL"
-msgstr "Jaeger 地å€"
-
msgid "Jan"
msgstr "1月"
@@ -21535,8 +21910,14 @@ msgstr "已从é…置的Jira实例中导入了Jira用户。å¯ä»¥é€šè¿‡ä»Žâ€œ Git
msgid "Jira-GitLab user mapping template"
msgstr "Jira-GitLab用户映射模æ¿"
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr "找ä¸åˆ°å‘½å空间。确ä¿æ‚¨æœ‰è¶³å¤Ÿçš„æƒé™ã€‚"
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
-msgstr ""
+msgstr "é…置您的 Jira Connect Application ID。"
+
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr "无法从 Jira 获å–用户信æ¯ã€‚检查 Jira 中的æƒé™ï¼Œç„¶åŽé‡è¯•ã€‚"
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr "为Jira议题%{jiraIssue}创建分支"
@@ -21548,14 +21929,17 @@ msgid "JiraConnect|Failed to create branch. Please try again."
msgstr "创建分支失败。请é‡è¯•ã€‚"
msgid "JiraConnect|GitLab for Jira App"
-msgstr ""
+msgstr "GitLab for Jira App"
msgid "JiraConnect|Jira Connect Application ID"
-msgstr ""
+msgstr "Jira Connect Application ID"
msgid "JiraConnect|New branch was successfully created."
msgstr "æˆåŠŸåˆ›å»ºæ–°åˆ†æ”¯ã€‚"
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr "Jira 用户ä¸æ˜¯ç«™ç‚¹ç®¡ç†å‘˜ã€‚检查 Jira 中的æƒé™ï¼Œç„¶åŽé‡è¯•ã€‚"
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£å¹¶è¿”回Jira。"
@@ -21608,7 +21992,7 @@ msgid "JiraService|Base URL of the Jira instance."
msgstr "Jira 实例的基础 URL。"
msgid "JiraService|Change GitLab version"
-msgstr ""
+msgstr "更改 GitLab 版本"
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr "定义è¦ä»Žæ¼æ´žåˆ›å»ºçš„ Jira 议题的类型。"
@@ -21644,13 +22028,13 @@ msgid "JiraService|For example, AB"
msgstr "例如:AB"
msgid "JiraService|For example: https://gitlab.example.com"
-msgstr ""
+msgstr "例如:https://gitlab.example.com"
msgid "JiraService|GitLab for Jira Configuration"
msgstr "用于 Jira é…置的 GitLab"
msgid "JiraService|GitLab instance URL"
-msgstr ""
+msgstr "GitLab 实例 URL"
msgid "JiraService|IDs must be a list of numbers that can be split with , or ;"
msgstr "ID 必须是å¯ä»¥ç”¨ , 或 ; 分割的数字列表"
@@ -21701,7 +22085,7 @@ msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart
msgstr "ä½¿ç”¨è½¬æ¢ ID 设置自定义最终状æ€ã€‚ %{linkStart}äº†è§£è½¬æ¢ ID%{linkEnd}"
msgid "JiraService|Sign in to GitLab to link namespaces."
-msgstr ""
+msgstr "登录到 GitLab æ¥é“¾æŽ¥å‘½å空间。"
msgid "JiraService|Sign in to GitLab.com to get started."
msgstr "登录并开始使用。"
@@ -21737,10 +22121,10 @@ msgid "JiraService|Web URL"
msgstr "Web URL"
msgid "JiraService|Welcome to GitLab for Jira"
-msgstr ""
+msgstr "欢迎使用 GitLab for Jira"
msgid "JiraService|What version of GitLab are you using?"
-msgstr ""
+msgstr "您在使用什么版本的 GitLab?"
msgid "JiraService|When a Jira issue is mentioned in a commit or merge request, a remote link and comment (if enabled) will be created."
msgstr "在æ交或åˆå¹¶è¯·æ±‚中æåŠ Jira 议题时,将创建远程链接和评论(如果å¯ç”¨ï¼‰ã€‚"
@@ -21806,7 +22190,7 @@ msgid "Jobs|All"
msgstr "全部"
msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
+msgstr "加载失败的作业选项å¡æ—¶å‡ºé”™ã€‚"
msgid "Jobs|Are you sure you want to proceed?"
msgstr "确定è¦ç»§ç»­å—?"
@@ -21839,7 +22223,7 @@ msgid "Jobs|Status"
msgstr "状æ€"
msgid "Jobs|There was a problem fetching the failed jobs."
-msgstr ""
+msgstr "获å–失败的任务时出错。"
msgid "Jobs|Use jobs to automate your tasks"
msgstr "使用作业自动执行任务"
@@ -21859,6 +22243,9 @@ msgstr "对于从 %{source} 到 %{target} çš„ %{mrId} çš„ %{boldStart}æµæ°´çº¿%
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr "对于 %{ref} çš„ %{boldStart}æµæ°´çº¿%{boldEnd} %{id}"
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr "æ ¹æ®%{searchTerm}找到%{searchLength} 个结果"
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr "您确定è¦åˆ é™¤æ­¤ä½œä¸šæ—¥å¿—和产物å—?"
@@ -21898,12 +22285,18 @@ msgstr "作业已被删除"
msgid "Job|Job has been erased by %{userLink}"
msgstr "作业已被 %{userLink} 删除"
+msgid "Job|Job log search"
+msgstr "作业日志æœç´¢"
+
msgid "Job|Keep"
msgstr "ä¿æŒ"
msgid "Job|Manual"
msgstr "手动"
+msgid "Job|No search results found"
+msgstr "æ— æœç´¢ç»“æžœ"
+
msgid "Job|Passed"
msgstr "已通过"
@@ -21928,6 +22321,12 @@ msgstr "滚动到底部"
msgid "Job|Scroll to top"
msgstr "滚动到顶部"
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr "在作业日志输出中æœç´¢å­å­—符串。 ç›®å‰åªæ”¯æŒæœç´¢å¯è§çš„工作日志输出,而ä¸æ”¯æŒå› å¤§å°è€Œè¢«æˆªæ–­çš„任何日志输出。"
+
+msgid "Job|Search job log"
+msgstr "æœç´¢ä½œä¸šæ—¥å¿—"
+
msgid "Job|Show complete raw"
msgstr "显示完整æº"
@@ -21944,7 +22343,7 @@ msgid "Job|The artifacts will be removed"
msgstr "产物将被删除"
msgid "Job|There was a problem retrying the failed job."
-msgstr ""
+msgstr "é‡è¯•å¤±è´¥çš„作业时出现问题。"
msgid "Job|These artifacts are the latest. They will not be deleted (even if expired) until newer artifacts are available."
msgstr "这些产物为当å‰æœ€æ–°ã€‚在更新的产物å¯ç”¨ä¹‹å‰ï¼Œè¿™äº›äº§ç‰©å°†ä¸ä¼šè¢«åˆ é™¤(å³ä½¿å·²è¿‡æœŸ)。"
@@ -21953,7 +22352,7 @@ msgid "Job|This job failed because the necessary resources were not successfully
msgstr "此作业已失败, 因为未æˆåŠŸåˆ›å»ºå¿…è¦çš„资æºã€‚"
msgid "Job|This job is stuck because of one of the following problems. There are no active runners online, no runners for the %{linkStart}protected branch%{linkEnd}, or no runners that match all of the job's tags:"
-msgstr ""
+msgstr "由于以下问题之一,这个作业被å¡ä½ã€‚没有在线有效的 runner,没有%{linkStart}å—ä¿æŠ¤çš„分支%{linkEnd}çš„ runner,或者没有符åˆå…¨éƒ¨ä½œä¸šæ ‡ç­¾çš„ runner:"
msgid "Job|This job is stuck because the project doesn't have any runners online assigned to it."
msgstr "此作业已阻塞,因为该项目没有分é…任何å¯ç”¨Runner。"
@@ -21964,6 +22363,9 @@ msgstr "此作业已阻塞,因为没有å¯ç”¨çš„Runner处ç†æ­¤é¡¹ä½œä¸šã€‚"
msgid "Job|Waiting for resource"
msgstr "等待资æº"
+msgid "Job|We could not find this element"
+msgstr "找ä¸åˆ°æ­¤å…ƒç´ "
+
msgid "Job|allowed to fail"
msgstr "å…许失败"
@@ -21977,7 +22379,7 @@ msgid "Job|triggered"
msgstr "已触å‘"
msgid "Join GitLab today! You and your team can plan, build, and ship secure code all in one application. Get started here for free!"
-msgstr ""
+msgstr "ç«‹å³åŠ å…¥ï¼æ‚¨å’Œæ‚¨çš„团队将å¯ä»¥ä½¿ç”¨ä¸€ä¸ªåº”用,完æˆè§„划ã€æž„建和安全代ç çš„交付。现在就开始å…费使用ï¼"
msgid "Join Zoom meeting"
msgstr "加入Zoom会议"
@@ -22081,9 +22483,6 @@ msgstr "Kroki"
msgid "Kubernetes"
msgstr "Kubernetes"
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr "Kubinentes API 返回状æ€ä»£ç : %{error_code}"
-
msgid "Kubernetes Cluster"
msgstr "Kubernetes集群"
@@ -22159,6 +22558,10 @@ msgstr "标记"
msgid "Label actions dropdown"
msgstr "标记æ“作下拉èœå•"
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] "添加标记:%{labels}"
+
msgid "Label priority"
msgstr "标记优先级"
@@ -22208,7 +22611,7 @@ msgid "Language"
msgstr "语言"
msgid "Language type"
-msgstr ""
+msgstr "编程语言类型"
msgid "Large File Storage"
msgstr "大文件存储(LFS)"
@@ -22272,7 +22675,7 @@ msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
msgstr "最åŽä¸€æ¬¡ç”± %{link_start}%{avatar} %{name}%{link_end} 编辑"
msgid "Last event"
-msgstr ""
+msgstr "最近活动"
msgid "Last item before this page loaded in your browser:"
msgstr "此页é¢åœ¨æ‚¨çš„æµè§ˆå™¨ä¸­è½½å…¥å‰çš„最åŽä¸€ä¸ªé¡¹ç›®ï¼š"
@@ -22382,9 +22785,6 @@ msgstr "学习GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr "学习 GitLab - 旗舰版试用"
-msgid "Learn GitLab|Trial only"
-msgstr "ä»…é™è¯•ç”¨"
-
msgid "Learn More"
msgstr "了解更多"
@@ -22400,9 +22800,6 @@ msgstr "了解如何使用GitLab%{no_packages_link_start}å‘布和共享您的åŒ
msgid "Learn more"
msgstr "进一步了解"
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr "了解更多关于 %{link_start_tag}Jaeger é…ç½®%{link_end_tag}。"
-
msgid "Learn more about %{username}"
msgstr "进一步了解%{username}"
@@ -22463,21 +22860,21 @@ msgstr "%{percentage}%{percentSymbol} 已完æˆ"
msgid "LearnGitLab|Add code owners"
msgstr "添加代ç æ‰€æœ‰è€…"
-msgid "LearnGitLab|Add merge request approval"
-msgstr "添加åˆå¹¶è¯·æ±‚批准"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
+msgstr "使用 DAST 分æžæ‚¨çš„应用程åºçš„æ¼æ´ž"
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr "首先完æˆè¿™äº›ä»»åŠ¡ï¼Œä»¥ä¾¿æ‚¨å¯ä»¥å……åˆ†äº«å— GitLab 的功能:"
+msgid "LearnGitLab|Create a repository"
+msgstr "创建一个仓库"
+
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr "为您的新工作区创建工作æµï¼Œå¹¶äº†è§£ GitLab 功能如何ååŒå·¥ä½œï¼š"
msgid "LearnGitLab|Create an issue"
msgstr "创建议题"
-msgid "LearnGitLab|Create or import a repository"
-msgstr "创建或导入仓库"
-
msgid "LearnGitLab|Create or import your first repository into your new project."
msgstr "创建或导入您的第一个仓库到您的新项目中。"
@@ -22520,23 +22917,26 @@ msgstr "使用 CI/CD è¿è¡Œå®‰å…¨æ‰«æ"
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr "通过自动化您的集æˆå’Œéƒ¨ç½²ä»»åŠ¡æ¥èŠ‚çœæ—¶é—´ã€‚"
+msgid "LearnGitLab|Scan dependencies for licenses"
+msgstr "扫æä¾èµ–æ¥æŸ¥æ‰¾è®¸å¯è¯"
+
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
+msgstr "扫æä¾èµ–æ¥æŸ¥æ‰¾æ¼æ´ž"
+
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr "在部署之å‰æ‰«æ您的代ç ä»¥å‘现æ¼æ´žã€‚"
msgid "LearnGitLab|Set up CI/CD"
msgstr "设置 CI/CD"
+msgid "LearnGitLab|Set up your first project's CI/CD"
+msgstr "设置您的第一个项目的 CI/CD"
+
msgid "LearnGitLab|Set up your workspace"
msgstr "设置您的工作区"
-msgid "LearnGitLab|Set-up CI/CD"
-msgstr "设置 CI/CD"
-
-msgid "LearnGitLab|Start a free Ultimate trial"
-msgstr "开始å…费试用"
-
-msgid "LearnGitLab|Submit a merge request"
-msgstr "æ交åˆå¹¶è¯·æ±‚"
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
+msgstr "开始å…费试用旗舰版"
msgid "LearnGitLab|Submit a merge request (MR)"
msgstr "æ交åˆå¹¶è¯·æ±‚ (MR)"
@@ -22553,6 +22953,9 @@ msgstr "使用您的新 GitLab 工作æµç¨‹éƒ¨ç½²æ‚¨çš„应用程åºã€ç›‘控其è
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr "您的团队正在æˆé•¿ï¼æ‚¨å·²æˆåŠŸåœ°é‚€è¯·äº†æ–°çš„团队æˆå‘˜åˆ° %{projectName} 项目。"
+msgid "LearnGitlab|- Included in trial"
+msgstr "- 包括在试用中"
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr "请è”系您的管ç†å‘˜ï¼Œå¼€å§‹å…费的旗舰版试用。"
@@ -22562,9 +22965,6 @@ msgstr "正在创建您的入门体验..."
msgid "LearnGitlab|Ok, let's go"
msgstr "好的,让我们去å§"
-msgid "LearnGitlab|Trial only"
-msgstr "ä»…é™è¯•ç”¨"
-
msgid "LearnGitlab|View administrator list"
msgstr "查看管ç†å‘˜åˆ—表"
@@ -22815,7 +23215,7 @@ msgid "Limit the number of issues and epics per minute a user can create through
msgstr "é™åˆ¶ç”¨æˆ·æ¯åˆ†é’Ÿå¯ä»¥é€šè¿‡ Web å’Œ API 请求创建的议题和å²è¯—çš„æ•°é‡ã€‚"
msgid "Limit the number of pipeline creation requests per minute. This limit includes pipelines created through the UI, the API, and by background processing."
-msgstr ""
+msgstr "é™åˆ¶æ¯åˆ†é’Ÿçš„æµæ°´çº¿åˆ›å»ºè¯·æ±‚数。此é™åˆ¶åŒ…括通过 UIã€API å’ŒåŽå°å¤„ç†åˆ›å»ºçš„æµæ°´çº¿ã€‚"
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr "é™åˆ¶å­˜å‚¨åœ¨Redis中的Sidekiq作业的大å°ã€‚"
@@ -22896,7 +23296,7 @@ msgid "List of suitable GCP locations"
msgstr "åˆé€‚çš„ GCP ä½ç½®åˆ—表"
msgid "List of users who are allowed to exceed the rate limit. Example: username1, username2"
-msgstr ""
+msgstr "å…许超过费率é™åˆ¶çš„用户列表。例如:username1,username2"
msgid "List options"
msgstr "列表选项"
@@ -22908,7 +23308,7 @@ msgid "List the merge requests that must be merged before this one."
msgstr "列出在此之å‰å¿…é¡»åˆå¹¶çš„åˆå¹¶è¯·æ±‚。"
msgid "List the visible events for %{project_link} using the %{events_api_link}."
-msgstr ""
+msgstr "- 使用 %{events_api_link} 列出 %{project_link} çš„å¯è§äº‹ä»¶ã€‚"
msgid "List view"
msgstr "列表视图"
@@ -22947,7 +23347,7 @@ msgid "Loading the GitLab IDE..."
msgstr "加载GitLab IDE..."
msgid "Loading, please wait."
-msgstr ""
+msgstr "正在加载,请ç¨å€™ã€‚"
msgid "Loading..."
msgstr "正在加载..."
@@ -22977,7 +23377,7 @@ msgid "Lock memberships to LDAP synchronization"
msgstr "é”定æˆå‘˜èº«ä»½åˆ°LDAPåŒæ­¥"
msgid "Lock merge request"
-msgstr ""
+msgstr "é”定åˆå¹¶è¯·æ±‚"
msgid "Lock not found"
msgstr "未找到é”"
@@ -23054,9 +23454,6 @@ msgstr "Logo 将被删除,您确定å—?"
msgid "Logs"
msgstr "日志"
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr "è¦æŸ¥çœ‹æ—¥å¿—,请在环境中部署您的代ç ã€‚"
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr "似乎您已ç»è¾¾åˆ°äº† %{free_limit} %{strong_start}%{namespace_name}çš„%{strong_end} æˆå‘˜ä¸Šé™"
@@ -23136,7 +23533,7 @@ msgid "Make issue confidential"
msgstr "将议题设置为ç§å¯†ã€‚"
msgid "Make sure you have the correct permissions to link your project."
-msgstr ""
+msgstr "请确ä¿æ‚¨æœ‰æ­£ç¡®çš„æƒé™å…³è”您的项目。"
msgid "Make sure you save it - you won't be able to access it again."
msgstr "请确ä¿å¦¥å–„ä¿å­˜å®ƒ - 您无法å†æ¬¡è®¿é—®å®ƒçš„内容。"
@@ -23144,9 +23541,6 @@ msgstr "请确ä¿å¦¥å–„ä¿å­˜å®ƒ - 您无法å†æ¬¡è®¿é—®å®ƒçš„内容。"
msgid "Makes this issue confidential."
msgstr "将此议题设置为ç§å¯†."
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr "ç®¡ç† %{workspace} 标记"
@@ -23156,9 +23550,6 @@ msgstr "ç®¡ç† Web IDE 功能。"
msgid "Manage access"
msgstr "管ç†æƒé™"
-msgid "Manage all notifications"
-msgstr "管ç†å…¨éƒ¨é€šçŸ¥"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr "管ç†å¯ä»¥å°†GitLab用作OAuthæ供程åºçš„应用程åºï¼Œä»¥åŠæ‚¨å·²æŽˆæƒä½¿ç”¨æ‚¨çš„å¸æˆ·çš„应用程åºã€‚"
@@ -23283,7 +23674,7 @@ msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
msgstr "添加带删除线的文本(%{modifier_key}⇧X)"
msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
+msgstr "æ”¯æŒ %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr "标记删除于 - %{deletion_time}"
@@ -23297,6 +23688,9 @@ msgstr "标记为已准备好。现在å…许åˆå¹¶ã€‚"
msgid "Marked this %{noun} as a draft."
msgstr "已标记此%{noun}为è‰ç¨¿ã€‚"
+msgid "Marked this %{noun} as ready."
+msgstr "已将 %{noun} 标记为准备就绪。"
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr "标记这个议题为%{duplicate_param}çš„é‡å¤é¡¹ã€‚"
@@ -23309,6 +23703,9 @@ msgstr "将待办事项标记为已完æˆã€‚"
msgid "Marks this %{noun} as a draft."
msgstr "将标记此%{noun}为è‰ç¨¿ã€‚"
+msgid "Marks this %{noun} as ready."
+msgstr "将 %{noun} 标记为就绪。"
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr "将此议题标记为 %{duplicate_reference} çš„é‡å¤ã€‚"
@@ -23460,10 +23857,10 @@ msgid "Maximum duration of a session."
msgstr "会è¯çš„最大有效期é™ã€‚"
msgid "Maximum export size"
-msgstr ""
+msgstr "最大导出大å°"
msgid "Maximum export size (MB)"
-msgstr ""
+msgstr "最大导出大å°ï¼ˆMB)"
msgid "Maximum field length"
msgstr "最大字段长度"
@@ -23529,7 +23926,7 @@ msgid "Maximum number of projects."
msgstr "最大项目数é‡ã€‚"
msgid "Maximum number of requests per minute"
-msgstr ""
+msgstr "æ¯åˆ†é’Ÿæœ€å¤§è¯·æ±‚æ•°"
msgid "Maximum number of requests per minute for an authenticated user"
msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„用户æ¯åˆ†é’Ÿçš„最大请求数"
@@ -23544,7 +23941,7 @@ msgid "Maximum number of unique IP addresses per user."
msgstr "æ¯ä¸ªç”¨æˆ·çš„最大唯一 IP 地å€æ•°ã€‚"
msgid "Maximum of 255 characters"
-msgstr ""
+msgstr "最多使用 255 个字符"
msgid "Maximum page reached"
msgstr "已达到最大页é¢"
@@ -23586,7 +23983,7 @@ msgid "Maximum size of Elasticsearch bulk indexing requests."
msgstr "Elasticsearch批é‡ç´¢å¼•è¯·æ±‚的最大大å°ã€‚"
msgid "Maximum size of export files."
-msgstr ""
+msgstr "导出文件的最大大å°ã€‚"
msgid "Maximum size of import files."
msgstr "导入文件的最大大å°ã€‚"
@@ -23878,12 +24275,18 @@ msgstr "åˆå¹¶è¯·æ±‚ä¾èµ–"
msgid "Merge request events"
msgstr "åˆå¹¶è¯·æ±‚事件"
+msgid "Merge request locked."
+msgstr "åˆå¹¶è¯·æ±‚å·²é”定。"
+
msgid "Merge request not merged"
msgstr "åˆå¹¶è¯·æ±‚未åˆå¹¶"
msgid "Merge request reports"
msgstr "åˆå¹¶è¯·æ±‚报告"
+msgid "Merge request unlocked."
+msgstr "åˆå¹¶è¯·æ±‚已解é”。"
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr "åˆå¹¶è¯·æ±‚已安排在æµæ°´çº¿æˆåŠŸåŽåˆå¹¶"
@@ -24049,8 +24452,8 @@ msgstr "加载完整差异时出错。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "MergeRequest|No files found"
msgstr "未找到任何文件"
-msgid "MergeRequest|Search files (%{modifier_key}P)"
-msgstr "æœç´¢æ–‡ä»¶(%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgstr "æœç´¢ï¼ˆä¾‹å¦‚ *.vue)(%{modifier_key}P)"
msgid "Merged"
msgstr "å·²åˆå¹¶"
@@ -24076,6 +24479,9 @@ msgstr "ç«‹å³åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚。"
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr "ä¸å»ºè®®ç«‹å³åˆå¹¶ï¼Œå› ä¸ºå®ƒå¯èƒ½å¯¹çŽ°æœ‰åˆå¹¶åˆ—车产生ä¸åˆ©å½±å“。请查阅%{docsLinkStart}文档%{docsLinkEnd}以了解更多信æ¯ã€‚"
+msgid "Mermaid diagram"
+msgstr "Mermaid 图表"
+
msgid "Message"
msgstr "消æ¯"
@@ -24425,9 +24831,6 @@ msgstr "值"
msgid "Metrics|View documentation"
msgstr "查看文档"
-msgid "Metrics|View logs"
-msgstr "查看日志"
-
msgid "Metrics|Y-axis label"
msgstr "Y轴标签"
@@ -24784,7 +25187,7 @@ msgid "More topics"
msgstr "更多主题"
msgid "Most common"
-msgstr ""
+msgstr "最常è§çš„"
msgid "Most relevant"
msgstr "相关度最高"
@@ -24864,6 +25267,21 @@ msgstr "请求审核者 %{name} 的关注"
msgid "MrList|Review requested from %{name}"
msgstr "审核æ¥è‡ª %{name} 的请求"
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr "如果继续,您确认å“应将用于改进 GitLab å¹¶ç¬¦åˆ %{linkStart}GitLab éšç§æ”¿ç­–%{linkEnd}。"
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr "您对åˆå¹¶è¯·æ±‚çš„%{strongStart}速度/性能%{strongEnd}感到满æ„å—?"
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr "åˆå¹¶è¯·æ±‚体验调查"
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr "总体而言,您对åˆå¹¶è¯·æ±‚的满æ„度如何?"
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr "感谢您的å馈ï¼"
+
msgid "Multi-project"
msgstr "多项目"
@@ -24876,9 +25294,6 @@ msgstr "支æŒå¤šä¸ªIP地å€èŒƒå›´ã€‚"
msgid "Multiple Prometheus integrations are not supported"
msgstr "ä¸æ”¯æŒå¤šä¸ªPrometheus集æˆ"
-msgid "Multiple domains are supported."
-msgstr "支æŒå¤šä¸ªåŸŸå。"
-
msgid "Multiple model types found: %{model_types}"
msgstr "找到多个模型类型: %{model_types}"
@@ -24900,6 +25315,9 @@ msgstr "我的主题"
msgid "My-Reaction"
msgstr "我的å应"
+msgid "NEW"
+msgstr "新建"
+
msgid "Name"
msgstr "å称"
@@ -24924,9 +25342,6 @@ msgstr "命å空间"
msgid "Namespace ID:"
msgstr "命å空间ID:"
-msgid "Namespace is empty"
-msgstr "命å空间为空"
-
msgid "Namespace:"
msgstr "命å空间:"
@@ -25012,24 +25427,24 @@ msgstr "导航æ "
msgid "NavigationTheme|Blue"
msgstr "è“色"
-msgid "NavigationTheme|Dark"
-msgstr "深色"
-
msgid "NavigationTheme|Dark Mode (alpha)"
msgstr "深色模å¼ï¼ˆalpha)"
+msgid "NavigationTheme|Gray"
+msgstr "ç°è‰²"
+
msgid "NavigationTheme|Green"
msgstr "绿色"
msgid "NavigationTheme|Indigo"
msgstr "é›è“"
-msgid "NavigationTheme|Light"
-msgstr "浅色"
-
msgid "NavigationTheme|Light Blue"
msgstr "æµ…è“"
+msgid "NavigationTheme|Light Gray"
+msgstr "æµ…ç°è‰²"
+
msgid "NavigationTheme|Light Green"
msgstr "浅绿"
@@ -25181,18 +25596,15 @@ msgstr "新建å²è¯—"
msgid "New epic title"
msgstr "æ–°å²è¯—标题"
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "新建文件"
msgid "New group"
msgstr "新建群组"
-msgid "New group URL"
-msgstr "新建群组URL"
-
-msgid "New group name"
-msgstr "新建群组å称"
-
msgid "New health check access token has been generated!"
msgstr "已生æˆæ–°çš„è¿è¡ŒçŠ¶å†µæ£€æŸ¥è®¿é—®ä»¤ç‰Œï¼"
@@ -25286,9 +25698,6 @@ msgstr "新用户设置为外部"
msgid "New! Suggest changes directly"
msgstr "新特性ï¼ç›´æŽ¥å»ºè®®å˜æ›´å†…容"
-msgid "New..."
-msgstr "新建..."
-
msgid "Newest first"
msgstr "最新在å‰"
@@ -25343,6 +25752,9 @@ msgstr "没有里程碑"
msgid "No Scopes"
msgstr "无范围"
+msgid "No Work Item Link found"
+msgstr "未找到工作项链接"
+
msgid "No active admin user found"
msgstr "没有找到活动的管ç†å‘˜ç”¨æˆ·"
@@ -25373,6 +25785,9 @@ msgstr "没有å¯ç”¨çš„分支"
msgid "No branches found"
msgstr "未å‘现分支"
+msgid "No change to this %{noun}'s draft status."
+msgstr "%{noun} çš„è‰ç¨¿çŠ¶æ€æ²¡æœ‰å˜æ›´ã€‚"
+
msgid "No changes"
msgstr "æ— å˜æ›´å†…容"
@@ -25397,9 +25812,6 @@ msgstr "没有收到确认邮件?检查您的垃圾邮件文件夹或 %{reques
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "无法连接到GitalyæœåŠ¡å™¨ï¼Œè¯·æ£€æŸ¥ç›¸å…³æ—¥å¿—ï¼"
-msgid "No containers available"
-msgstr "没有å¯ç”¨çš„容器"
-
msgid "No contributions"
msgstr "无贡献"
@@ -25490,6 +25902,9 @@ msgstr "未设定许å¯è¯ã€‚版æƒæ‰€æœ‰ã€‚"
msgid "No matches found"
msgstr "没有找到匹é…项"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr "æœªæ‰¾åˆ°åŒ¹é… %{issuable} 的地å€ã€‚请确ä¿æ‚¨æ­£åœ¨æ·»åŠ ä¸€ä¸ªæœ‰æ•ˆçš„ %{issuable} ID。"
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr "æœªæ‰¾åˆ°åŒ¹é… %{issuable} 的地å€ã€‚请确ä¿æ‚¨æ­£åœ¨æ·»åŠ ä¸€ä¸ªæœ‰æ•ˆçš„ %{issuable} URL。"
@@ -25535,9 +25950,6 @@ msgstr "父群组ä¸å­˜åœ¨"
msgid "No plan"
msgstr "没有计划"
-msgid "No pods available"
-msgstr "没有å¯ç”¨çš„pod"
-
msgid "No policy matches this license"
msgstr "没有匹é…此许å¯è¯çš„政策"
@@ -25551,7 +25963,7 @@ msgid "No project subscribes to the pipelines in this project."
msgstr "没有项目订阅此项目中的æµæ°´çº¿ã€‚"
msgid "No projects available."
-msgstr ""
+msgstr "没有å¯ç”¨çš„项目。"
msgid "No projects found"
msgstr "未找到项目"
@@ -25574,6 +25986,9 @@ msgstr "未找到相关的åˆå¹¶è¯·æ±‚。"
msgid "No repository"
msgstr "无仓库"
+msgid "No results"
+msgstr "没有结果"
+
msgid "No runner executable"
msgstr "æ— runnerå¯æ‰§è¡Œæ–‡ä»¶"
@@ -25617,7 +26032,7 @@ msgid "No triggers exist yet. Use the form above to create one."
msgstr "尚无触å‘器。使用上é¢çš„表å•åˆ›å»ºä¸€ä¸ªã€‚"
msgid "No user provided"
-msgstr ""
+msgstr "未指定用户"
msgid "No vulnerabilities present"
msgstr "æ— æ¼æ´ž"
@@ -25672,7 +26087,7 @@ msgid "Not all data has been processed yet, the accuracy of the chart for the se
msgstr "尚未处ç†æ‰€æœ‰æ•°æ®ï¼Œå› æ­¤æ‰€é€‰æ—¶é—´èŒƒå›´å†…图表的ä¸ä¸€å®šå®Œå…¨å‡†ç¡®ã€‚"
msgid "Not applicable."
-msgstr ""
+msgstr "ä¸é€‚用。"
msgid "Not available"
msgstr "æ•°æ®ä¸è¶³"
@@ -25735,7 +26150,7 @@ msgid "NoteForm|Note"
msgstr "注æ„"
msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
+msgstr "æ”¯æŒ %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}。对于 %{quickActionsDocsLinkStart}快速æ“作%{quickActionsDocsLinkEnd},请输入 %{keyboardStart}/%{keyboardEnd}。"
msgid "Notes"
msgstr "备注"
@@ -25744,7 +26159,7 @@ msgid "Notes rate limit"
msgstr "Notes 速率é™åˆ¶"
msgid "Notes|Are you sure you want to cancel creating this %{commentType}?"
-msgstr ""
+msgstr "您确定è¦å–消创建这个 %{commentType} å—?"
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "确定è¦å–消此评论å—?"
@@ -25752,11 +26167,17 @@ msgstr "确定è¦å–消此评论å—?"
msgid "Notes|Collapse replies"
msgstr "收起回å¤"
+msgid "Notes|Expand replies"
+msgstr "展开回å¤"
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
-msgstr ""
+msgstr "内部备注åªå¯¹ä½œè€…ã€æŒ‡æ´¾äººå’Œå…·æœ‰æŠ¥å‘Šäººæˆ–更高角色的æˆå‘˜å¯è§"
+
+msgid "Notes|Last reply by %{name}"
+msgstr "最åŽå›žå¤è€…为 %{name}"
msgid "Notes|Make this an internal note"
-msgstr ""
+msgstr "将此作为内部备注"
msgid "Notes|Show all activity"
msgstr "显示所有活动"
@@ -25771,7 +26192,7 @@ msgid "Notes|This comment has changed since you started editing, please review t
msgstr "自您开始编辑以æ¥ï¼Œæ­¤è¯„论已更改,请查看 %{open_link}更新过的评论%{close_link} 以确ä¿ä¿¡æ¯ä¸ä¼šä¸¢å¤±"
msgid "Notes|This internal note will always remain confidential"
-msgstr ""
+msgstr "此内部备注将始终是ç§å¯†çš„"
msgid "Notes|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
msgstr "您åªèƒ½åœ¨ä¿¡æ¯æµä¸­çœ‹åˆ°%{boldStart}其他活动%{boldEnd} 。è¦æ·»åŠ è¯„论,请切æ¢åˆ°ä»¥ä¸‹é€‰é¡¹ä¹‹ä¸€ã€‚"
@@ -25894,21 +26315,48 @@ msgstr "ç¦ç”¨é€šçŸ¥"
msgid "Notifications on"
msgstr "å¯ç”¨é€šçŸ¥"
+msgid "Notifications turned off."
+msgstr "通知已关闭。"
+
+msgid "Notifications turned on."
+msgstr "通知已开å¯ã€‚"
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr "无法识别登录ä½ç½®æ—¶é€šè¿‡ç”µå­é‚®ä»¶é€šçŸ¥ç”¨æˆ·ã€‚"
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr "%{author_link} 的议题 %{issue_reference_link} å³å°†åˆ°æœŸã€‚"
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr "%{mr_link} 中的 %{commit_link}"
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr "指派人从 %{fromNames} 更改为 %{toNames}"
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr "指派人更改为 %{toNames}"
+
msgid "Notify|Author: %{author_name}"
msgstr "作者:%{author_name}"
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr "%{project} çš„ Auto DevOps æµæ°´çº¿è¢«ç¦ç”¨"
+
+msgid "Notify|CI/CD project settings"
+msgstr "CI/CD 项目设置"
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr "如果您ä¸å†æƒ³åœ¨ Pages 中使用这个域å,请从您的项目中删除它,并删除任何相关的DNS记录。"
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr "议题的状æ€ç”± %{updated_by} 更改为 %{issue_status}"
msgid "Notify|Issue was moved to another project."
msgstr "议题已移动到å¦ä¸€ä¸ªé¡¹ç›®ã€‚"
+msgid "Notify|Learn more about Auto DevOps"
+msgstr "了解有关 Auto DevOps 的更多信æ¯"
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr "åˆå¹¶è¯·æ±‚ %{merge_request} 由于冲çªæ— æ³•åˆå¹¶ã€‚"
@@ -25921,18 +26369,42 @@ msgstr "åˆå¹¶è¯·æ±‚ %{merge_request} 的状æ€ç”± %{updated_by} å˜æ›´ä¸º %{mr_
msgid "Notify|Merge request %{merge_request} was merged"
msgstr "åˆå¹¶è¯·æ±‚ %{merge_request} 已完æˆ"
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr "åˆå¹¶è¯·æ±‚ %{mr_link} 被 %{closed_by} 关闭"
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr "åˆå¹¶è¯·æ±‚ URL:%{merge_request_url}"
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr "里程碑已更改为 %{milestone}"
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr "新建议题:%{project_issue_url}"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr "æµæ°´çº¿ %{pipeline_link} 的触å‘者为"
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr "æµæ°´çº¿ %{pipeline_link} çš„ Auto DevOps æµæ°´çº¿å¤±è´¥ï¼Œå·²åœ¨ %{project_link} 中被ç¦ç”¨ã€‚为了使用 Auto DevOps æµæ°´çº¿å’Œæ‚¨çš„项目,请查看 %{supported_langs_link},相应调整您的项目,并在您的 %{settings_link} 内开å¯Auto DevOps æµæ°´çº¿ã€‚"
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr "此议题到期时间:%{issue_due_date}"
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr "除éžæ‚¨é€šè¿‡ %{time_start}%{time}%{time_end} 验è¯æ‚¨çš„域,å¦åˆ™å®ƒå°†ä»Žæ‚¨çš„项目中删除。"
+
msgid "Notify|You don't have access to the project."
msgstr "您没有访问此项目的æƒé™ã€‚"
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr "您加入 %{target_to_join} %{target_type} 的请求状æ€ä¸º %{denied_tag}。"
+
+msgid "Notify|currently supported languages"
+msgstr "当å‰æ”¯æŒçš„语言"
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr "在 %{stages} 中,%{jobs} å·²æˆåŠŸå®Œæˆã€‚"
+
msgid "Nov"
msgstr "11月"
@@ -26003,7 +26475,7 @@ msgid "Off"
msgstr "关闭"
msgid "Offline"
-msgstr ""
+msgstr "离线"
msgid "Oh no!"
msgstr "哦ä¸ï¼"
@@ -26192,7 +26664,7 @@ msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{lear
msgstr "%{learnMoreLinkStart}了解有关按需扫æ的更多信æ¯%{learnMoreLinkEnd}。"
msgid "OnDemandScans|%{profileType} profile library"
-msgstr ""
+msgstr "%{profileType} é…置文件库"
msgid "OnDemandScans|Add a schedule to run this scan at a specified date and time or on a recurring basis. Scheduled scans are automatically saved to scan library."
msgstr "添加日程表以在指定的日期和时间或ç»å¸¸æ€§çš„基础上è¿è¡Œæ‰«æ。 计划扫æ自动ä¿å­˜åˆ°æ‰«æ库。"
@@ -26246,7 +26718,7 @@ msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
msgstr "动æ€åº”用程åºå®‰å…¨æ€§æµ‹è¯•(DAST)"
msgid "OnDemandScans|Edit %{profileType} profile"
-msgstr ""
+msgstr "编辑 %{profileType} é…置文件"
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr "编辑按需扫æDAST"
@@ -26273,7 +26745,7 @@ msgid "OnDemandScans|My daily scan"
msgstr "我的æ¯æ—¥æ‰«æ"
msgid "OnDemandScans|New %{profileType} profile"
-msgstr ""
+msgstr "新建 %{profileType} é…置文件"
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "新建按需扫æDAST"
@@ -26282,13 +26754,13 @@ msgid "OnDemandScans|New on-demand scan"
msgstr "新建按需扫æ"
msgid "OnDemandScans|New profile"
-msgstr ""
+msgstr "新建é…置文件"
msgid "OnDemandScans|New scan"
msgstr "新建扫æ"
msgid "OnDemandScans|No %{profileType} profiles found for DAST"
-msgstr ""
+msgstr "未找到 DAST çš„ %{profileType} é…置文件"
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
msgstr "å°šæ— é…置文件。如需创建新扫æ,需è¦è‡³å°‘有一个完整的扫æ工具é…置文件。"
@@ -26348,7 +26820,7 @@ msgid "OnDemandScans|Site profile"
msgstr "站点é…ç½®"
msgid "OnDemandScans|Start by creating a new profile. Profiles make it easy to save and reuse configuration details for GitLab’s security tools."
-msgstr ""
+msgstr "开始创建一个新的é…置文件。é…置文件å¯ä»¥æ–¹ä¾¿ä¿å­˜å’Œé‡ç”¨å®‰å…¨å·¥å…·çš„é…置细节。"
msgid "OnDemandScans|Start time"
msgstr "开始时间"
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] "其余%d项"
+msgid "One or more arguments are invalid: %{args}."
+msgstr "一个或多个å‚数无效: %{args}。"
+
msgid "One or more contacts were successfully added."
msgstr "å·²æˆåŠŸæ·»åŠ ä¸€ä½æˆ–多ä½è”系人。"
@@ -26429,8 +26904,8 @@ msgstr "您的一个或多个个人访问令牌已过期。"
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr "您的一个或多个个人访问令牌将在 %{days_to_expire} 天或更短的时间内到期:"
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
-msgstr ""
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
+msgstr "åªæœ‰å…·æœ‰%{permissions}æƒé™çš„%{workspaceType}æˆå‘˜ï¼Œå¯ä»¥æŸ¥çœ‹æˆ–收到关于这个%{issuableType}的通知。"
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
msgstr "åªæœ‰åœ¨ä¸“业版åŠä»¥ä¸Šç‰ˆæœ¬ä¸­ï¼Œâ€œæŠ¥å‘Šè€…â€åŠä»¥ä¸Šè§’色æ‰èƒ½çœ‹åˆ°ä»·å€¼æµåˆ†æžã€‚"
@@ -26438,36 +26913,39 @@ msgstr "åªæœ‰åœ¨ä¸“业版åŠä»¥ä¸Šç‰ˆæœ¬ä¸­ï¼Œâ€œæŠ¥å‘Šè€…â€åŠä»¥ä¸Šè§’色æ‰
msgid "Only 1 appearances row can exist"
msgstr "åªèƒ½å­˜åœ¨ä¸€ä¸ªå¤–观行"
+msgid "Only HTTP(S)"
+msgstr "ä»… HTTP(S)"
+
msgid "Only Issue ID or merge request ID is required"
msgstr "仅需è¦è®®é¢˜ ID 或åˆå¹¶è¯·æ±‚ ID"
-msgid "Only Issue can be parent of Task."
-msgstr ""
-
msgid "Only Project Members"
msgstr "仅项目æˆå‘˜"
-msgid "Only Task can be assigned as a child in hierarchy."
-msgstr ""
+msgid "Only SSH"
+msgstr "ä»… SSH"
+
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
+msgstr "åªæœ‰%{membersPageLinkStart}项目æˆå‘˜%{membersPageLinkEnd}å¯ä»¥è®¿é—®ã€‚æˆå‘˜èµ„格必须明确授予æ¯ä¸ªç”¨æˆ·ã€‚"
msgid "Only active projects show up in the search and on the dashboard."
msgstr "仅活动的项目显示在æœç´¢å’Œä»ªè¡¨æ¿ä¸Šã€‚"
-msgid "Only admins can delete project"
-msgstr "åªæœ‰ç®¡ç†å‘˜å¯ä»¥åˆ é™¤é¡¹ç›®"
-
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
msgstr "åªå…许任何人在您打算被任何人使用的 GitLab 实例上注册å¸æˆ·ã€‚å…许任何人注册会使 GitLab 实例更容易å—到攻击。"
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr "仅在å¯ç”¨è¿œç¨‹å­˜å‚¨æ—¶æœ‰æ•ˆã€‚设置为 0 表示没有大å°é™åˆ¶ã€‚"
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
-msgstr ""
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
+msgstr "åªæœ‰å…·æœ‰è‡³å°‘报告者角色的群组æˆå‘˜å¯ä»¥æŸ¥çœ‹æˆ–收到关于这个å²è¯—的通知。"
msgid "Only include features new to your current subscription tier."
msgstr "仅包括您当å‰è®¢é˜…级别的新功能。"
+msgid "Only members of this group can access the wiki."
+msgstr "åªæœ‰è¯¥ç¾¤ç»„çš„æˆå‘˜æ‰èƒ½è®¿é—® wiki。"
+
msgid "Only policy:"
msgstr "ä»…ä»…(Only)æ¡ä»¶ï¼š"
@@ -26489,11 +26967,11 @@ msgstr "仅当ä¸ä½¿ç”¨è§’色实例凭æ®æ—¶æ‰éœ€è¦ã€‚"
msgid "Only use lowercase letters, numbers, and underscores."
msgstr "仅使用å°å†™å­—æ¯ã€æ•°å­—和下划线。"
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr "åªæœ‰æ¥è‡ªæŒ‡å®š IP 地å€èŒƒå›´çš„用户æ‰èƒ½è®¿é—®æ­¤ç¾¤ç»„,包括所有å­ç»„ã€é¡¹ç›®å’Œ Git 仓库。"
-msgid "Only verified users with an email address in any of these domains can be added to the group."
-msgstr "åªæœ‰å…·æœ‰è¿™äº›åŸŸå电å­é‚®ä»¶åœ°å€çš„已验è¯ç”¨æˆ·æ‰èƒ½æ·»åŠ åˆ°ç¾¤ç»„。"
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
+msgstr "åªæœ‰å…·æœ‰è¿™äº›åŸŸå的电å­é‚®ä»¶åœ°å€çš„已验è¯ç”¨æˆ·æ‰èƒ½æ·»åŠ åˆ°ç¾¤ç»„。支æŒå¤šåŸŸå。"
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
msgstr "åªæœ‰åœ¨ä¸“业版åŠä»¥ä¸Šç‰ˆæœ¬ä¸­ï¼Œâ€œæŠ¥å‘Šè€…â€åŠä»¥ä¸Šè§’色æ‰èƒ½çœ‹åˆ°ç”Ÿäº§åŠ›åˆ†æžã€‚"
@@ -26523,7 +27001,7 @@ msgid "Open in your IDE"
msgstr "在您的IDE中打开"
msgid "Open new window"
-msgstr ""
+msgstr "打开新窗å£"
msgid "Open raw"
msgstr "打开原始文件"
@@ -26588,6 +27066,9 @@ msgstr "è¿ç»´é¢æ¿"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "è¿ç»´ä»ªè¡¨æ¿æä¾›æ¯ä¸ªé¡¹ç›®çš„è¿è¡ŒçŠ¶å†µçš„摘è¦ï¼ŒåŒ…括æµæ°´çº¿å’Œè­¦æŠ¥çŠ¶æ€ã€‚"
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr "用于错误跟踪集æˆçš„ Opstrace 端点"
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "使用 CI/CD æµæ°´çº¿ä¼˜åŒ–您的工作æµç¨‹"
@@ -26606,6 +27087,9 @@ msgstr "æ“作"
msgid "Or you can choose one of the suggested colors below"
msgstr "或者您å¯ä»¥é€‰æ‹©ä¸‹é¢çš„建议颜色之一"
+msgid "Ordered list"
+msgstr "有åºåˆ—表"
+
msgid "Organizations"
msgstr "组织"
@@ -26696,6 +27180,9 @@ msgstr "拥有者:"
msgid "Owner"
msgstr "所有者"
+msgid "Owners and administrators"
+msgstr "所有者和管ç†å‘˜"
+
msgid "Owners can modify this selection."
msgstr "所有者å¯ä»¥ä¿®æ”¹æ­¤é€‰æ‹©ã€‚"
@@ -26780,12 +27267,6 @@ msgstr "包类型必须是PyPi"
msgid "Package type must be RubyGems"
msgstr "包类型必须是 RubyGems"
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr "%{boldStart}å…许é‡å¤%{boldEnd} - 接å—具有相åŒå称和版本的软件包。"
-
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
-msgstr "%{boldStart}ä¸å…许é‡å¤%{boldEnd} - æ‹’ç»å…·æœ‰ç›¸åŒå称和版本的软件包"
-
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr "%{name}的版本%{version}最åˆåˆ›å»ºäºŽ%{datetime}"
@@ -26804,8 +27285,11 @@ msgstr "添加Nugetæº"
msgid "PackageRegistry|Add composer registry"
msgstr "添加composer注册表"
-msgid "PackageRegistry|Allow duplicates"
-msgstr "å…许é‡å¤"
+msgid "PackageRegistry|Additional metadata"
+msgstr "其他元数æ®"
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
+msgstr "å…许具有相åŒå称和版本的软件包上传到库。安装时总是使用最新版本的软件包。"
msgid "PackageRegistry|App group: %{group}"
msgstr "应用分组: %{group}"
@@ -26912,6 +27396,9 @@ msgstr "删除软件包"
msgid "PackageRegistry|Delete this package"
msgstr "删除此软件包"
+msgid "PackageRegistry|Duplicate packages"
+msgstr "é‡å¤çš„软件包"
+
msgid "PackageRegistry|Error publishing"
msgstr "å‘布错误"
@@ -27027,6 +27514,9 @@ msgstr "æž„æˆ: %{recipe}"
msgid "PackageRegistry|Registry setup"
msgstr "仓库设置"
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr "æ‹’ç»å…·æœ‰ç›¸åŒå称和版本的软件包"
+
msgid "PackageRegistry|Remove package"
msgstr "删除软件包"
@@ -27067,7 +27557,10 @@ msgid "PackageRegistry|Something went wrong while deleting the package."
msgstr "删除软件包时出错。"
msgid "PackageRegistry|Something went wrong while fetching the package history."
-msgstr ""
+msgstr "获å–软件包历å²æ—¶å‡ºé”™ã€‚"
+
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr "获å–软件包元数æ®æ—¶å‡ºé”™ã€‚"
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ç¬¦åˆç­›é€‰å™¨çš„任何结果"
@@ -27108,9 +27601,6 @@ 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 "使用 GitLab 作为常è§åŒ…æ ¼å¼çš„ç§æœ‰ä»“库。 %{linkStart}了解更多。%{linkEnd}"
-
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
msgstr "您将è¦åˆ é™¤ %{filename}。这是一ç§ç ´å性æ“作,å¯èƒ½ä¼šä½¿æ‚¨çš„包无法使用。您确定å—?"
@@ -27201,18 +27691,12 @@ msgstr "å‚æ•°\"job_id\"ä¸èƒ½è¶…过%{job_id_max_size}的长度"
msgid "Parent"
msgstr "父级"
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr "父å²è¯—ä¸å­˜åœ¨ã€‚"
msgid "Parent epic is not present."
msgstr "父å²è¯—ä¸å­˜åœ¨ã€‚"
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr "å‚æ•°:embed_json解æžé”™è¯¯ã€‚%{message}"
@@ -27268,16 +27752,16 @@ msgid "Passwords should be unique and not used for any other sites or services."
msgstr "密ç åº”唯一并未用于任何其他网站或æœåŠ¡ã€‚"
msgid "Password|requires at least one lowercase letter"
-msgstr ""
+msgstr "至少需è¦ä¸€ä¸ªå°å†™å­—æ¯"
msgid "Password|requires at least one number"
-msgstr ""
+msgstr "至少需è¦ä¸€ä¸ªæ•°å­—"
msgid "Password|requires at least one symbol character"
-msgstr ""
+msgstr "需è¦è‡³å°‘一个符å·å­—符"
msgid "Password|requires at least one uppercase letter"
-msgstr ""
+msgstr "需è¦è‡³å°‘一个大写字æ¯"
msgid "Past due"
msgstr "逾期"
@@ -27301,7 +27785,7 @@ msgid "Paste issue link"
msgstr "粘贴议题链接"
msgid "Paste link"
-msgstr ""
+msgstr "粘贴链接"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr "粘贴项目路径(å³gitlab-org/gitlab)"
@@ -27328,7 +27812,7 @@ msgid "Pause"
msgstr "æš‚åœ"
msgid "Pause indexing and upgrade Elasticsearch to a supported version."
-msgstr ""
+msgstr "æš‚åœç´¢å¼•å¹¶å°† Elasticsearch å‡çº§åˆ°å—支æŒçš„版本。"
msgid "Pause time (ms)"
msgstr "æš‚åœæ—¶é—´ï¼ˆæ¯«ç§’)"
@@ -27355,7 +27839,7 @@ msgid "Pending deletion"
msgstr "等待删除"
msgid "Pending owner action"
-msgstr ""
+msgstr "待处ç†çš„所有者æ“作"
msgid "Pending sync…"
msgstr "等待åŒæ­¥â€¦"
@@ -27367,7 +27851,7 @@ msgid "People without permission will never get a notification."
msgstr "无相关æƒé™çš„用户将ä¸ä¼šæ”¶åˆ°é€šçŸ¥ã€‚"
msgid "Per your subscription agreement with GitLab, you must report your license usage data on a monthly basis. GitLab uses this data to keep your subscription up to date. To report your license usage data, export your license usage file and email it to %{renewal_service_email}. If you need an updated license, GitLab will send the license to the email address registered in the %{customers_dot}, and you can upload this license to your instance."
-msgstr ""
+msgstr "æ ¹æ®æ‚¨ä¸Ž GitLab 的订阅å议,您必须æ¯æœˆæŠ¥å‘Šæ‚¨çš„许å¯è¯ä½¿ç”¨æ•°æ®ï¼ŒGitLab 使用这些数æ®æ¥æ›´æ–°æ‚¨çš„订阅。è¦æŠ¥å‘Šæ‚¨çš„许å¯è¯ä½¿ç”¨æ•°æ®ï¼Œè¯·å¯¼å‡ºæ‚¨çš„许å¯è¯ä½¿ç”¨æƒ…况文件并将其å‘é€åˆ° %{renewal_service_email}。如果您需è¦æ–°çš„许å¯è¯ï¼ŒGitLab 会将许å¯è¯å‘é€åˆ°åœ¨ %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ï¼Œä»¥ä¾¿æ‚¨å°†æ­¤è®¸å¯è¯åº”用到您的实例。"
msgid "Percent rollout must be an integer number between 0 and 100"
msgstr "百分比上线必须是0-100之间的整数"
@@ -27535,7 +28019,7 @@ msgid "Pipeline URL"
msgstr "æµæ°´çº¿ URL"
msgid "Pipeline creation rate limits"
-msgstr ""
+msgstr "æµæ°´çº¿åˆ›å»ºé€ŸçŽ‡é™åˆ¶"
msgid "Pipeline durations for the last 30 commits"
msgstr "最近 30 次æ交的æµæ°´çº¿æŒç»­æ—¶é—´"
@@ -27645,6 +28129,24 @@ msgstr "💡 æ示:å¯è§†åŒ–并验è¯æ‚¨çš„æµæ°´çº¿"
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr "🚀 è¿è¡Œæ‚¨çš„第一个æµæ°´çº¿"
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr "编辑选项å¡ä¸­çš„当å‰å†…容将用于模拟。"
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr "Git 推é€äº‹ä»¶åˆ°é»˜è®¤åˆ†æ”¯"
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr "其他æµæ°´çº¿æ¥æºå°šä¸å¯ç”¨ã€‚"
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr "æµæ°´çº¿æº"
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr "将模拟æµæ°´çº¿è¡Œä¸ºï¼ŒåŒ…括 %{codeStart}rules%{codeEnd}ã€%{codeStart}only%{codeEnd}ã€%{codeStart}except%{codeEnd} å’Œ %{codeStart}needs%{codeEnd} 作业ä¾èµ–项。"
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr "将模拟æµæ°´çº¿è¡Œä¸ºï¼ŒåŒ…括 %{codeStart}rules%{codeEnd}ã€%{codeStart}only%{codeEnd}ã€%{codeStart}except%{codeEnd} å’Œ %{codeStart}needs%{codeEnd} 作业ä¾èµ–项。%{linkStart}了解更多%{linkEnd}"
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr "æŒç»­éªŒè¯ CI/CD é…置。当 CI/CD é…置文件ä¸ä¸ºç©ºæ—¶ï¼Œä¼šæ˜¾ç¤ºé”™è¯¯å’Œè­¦å‘Šã€‚"
@@ -27657,6 +28159,15 @@ msgstr "当 CI/CD é…置文件具有有效语法时显示æµæ°´çº¿å¯è§†åŒ–。"
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr "当 CI/CD é…置文件使用有效语法填写时,此选项å¡å°†å¯ç”¨ã€‚"
+msgid "PipelineEditor|Validate pipeline"
+msgstr "验è¯æµæ°´çº¿"
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr "在选定æ¡ä»¶ä¸‹éªŒè¯æµæ°´çº¿"
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr "在模拟æ¡ä»¶ä¸‹éªŒè¯æµæ°´çº¿"
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr "自定义(%{linkStart}Cron 语法%{linkEnd})"
@@ -27799,10 +28310,10 @@ msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr "使用 GitLab CI 实现 \"Hello world\""
msgid "Pipelines|1. Set up a runner"
-msgstr ""
+msgstr "1. 设置一个 runner"
msgid "Pipelines|2. Configure deployment pipeline"
-msgstr ""
+msgstr "2. é…置部署æµæ°´çº¿"
msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr "GitLab Runner 是一个使用 GitLab CI/CD 在æµæ°´çº¿ä¸­è¿è¡Œä½œä¸šçš„应用程åºã€‚安装 GitLab Runner 并注册您自己的 runner æ¥å¼€å§‹ä½¿ç”¨ CI/CD。"
@@ -27817,13 +28328,13 @@ msgid "Pipelines|Auto DevOps"
msgstr "Auto DevOps"
msgid "Pipelines|Based on your project, we recommend this template:"
-msgstr ""
+msgstr "基于您的项目,我们推è此模æ¿ï¼š"
msgid "Pipelines|Build with confidence"
msgstr "自信地构建"
msgid "Pipelines|Building for iOS?"
-msgstr ""
+msgstr "为 iOS 构建?"
msgid "Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?"
msgstr "通过撤销触å‘器将会影å“任何正在调用它的应用。您确定å—?"
@@ -27841,10 +28352,10 @@ msgid "Pipelines|Configuration validation currently not available."
msgstr "é…置验è¯ç›®å‰ä¸å¯ç”¨ã€‚"
msgid "Pipelines|Configure pipeline"
-msgstr ""
+msgstr "é…ç½®æµæ°´çº¿"
msgid "Pipelines|Continuous integration and deployment template to test and deploy your %{name} project."
-msgstr ""
+msgstr "æŒç»­é›†æˆå’Œéƒ¨ç½²æ¨¡æ¿ï¼Œç”¨äºŽæµ‹è¯•å’Œéƒ¨ç½²æ‚¨çš„ %{name} 项目。"
msgid "Pipelines|Copy trigger token"
msgstr "å¤åˆ¶è§¦å‘令牌"
@@ -27859,7 +28370,7 @@ msgid "Pipelines|Description"
msgstr "æè¿°"
msgid "Pipelines|Don't need a guide? Jump in right away with a template."
-msgstr ""
+msgstr "ä¸éœ€è¦æŒ‡å—?立å³ä½¿ç”¨æ¨¡æ¿è¿›è¡Œæ“作。"
msgid "Pipelines|Edit"
msgstr "编辑"
@@ -27868,7 +28379,7 @@ msgid "Pipelines|Editor"
msgstr "编辑器"
msgid "Pipelines|Follow these instructions to install GitLab Runner on macOS."
-msgstr ""
+msgstr "按照这些说明在 macOS 上安装 Runner。"
msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr "通过设置一个è¿è¡Œ \"Hello world\" 脚本的简å•æµæ°´çº¿æ¥ç†Ÿæ‚‰ GitLab CI 语法,查看它如何è¿è¡Œï¼ŒæŽ¢ç´¢ CI/CD 的工作方å¼ã€‚"
@@ -27880,7 +28391,7 @@ msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your cod
msgstr "GitLab CI/CDå¯ä»¥è‡ªåŠ¨æž„建,测试和部署您的代ç ã€‚让GitLab处ç†è´¹æ—¶çš„任务,您就有花更多的时间进行创造性的工作。"
msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline."
-msgstr ""
+msgstr "Runner 是一个与 CI/CD é…åˆä½¿ç”¨ï¼Œåœ¨æµæ°´çº¿ä¸­è¿è¡Œä½œä¸šçš„应用程åºã€‚"
msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr "GitLab Runner 是一个与 GitLab CI/CD åˆä½œåœ¨æµæ°´çº¿ä¸­è¿è¡Œä½œä¸šçš„应用程åºã€‚现在有å¯ç”¨çš„ runner å¯ä»¥è¿è¡Œæ‚¨çš„作业。您å¯ä»¥%{settingsLinkStart}é…置您的 runner%{settingsLinkEnd} 或%{docsLinkStart}了解更多关于 runner çš„ä¿¡æ¯%{docsLinkEnd}。"
@@ -27901,7 +28412,7 @@ msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr "学习æµæ°´çº¿å’Œ .yml 文件的基础知识"
msgid "Pipelines|Let's get that runner set up! %{emojiStart}tada%{emojiEnd}"
-msgstr ""
+msgstr "让我们开始那个 runner 的设置! %{emojiStart}tada%{emojiEnd}"
msgid "Pipelines|Lint"
msgstr "Lint"
@@ -27919,7 +28430,7 @@ msgid "Pipelines|More Information"
msgstr "更多信æ¯"
msgid "Pipelines|Need more information to set up your runner? %{linkStart}Check out our documentation%{linkEnd}."
-msgstr ""
+msgstr "需è¦æ›´å¤šä¿¡æ¯æ¥è®¾ç½®æ‚¨çš„ runner å—? %{linkStart}查看我们的文档%{linkEnd}。"
msgid "Pipelines|No runners detected"
msgstr "未检测到 runner"
@@ -27928,7 +28439,7 @@ msgid "Pipelines|No triggers have been created yet. Add one using the form above
msgstr "尚未创建触å‘器。请使用上é¢çš„表å•æ·»åŠ è§¦å‘器。"
msgid "Pipelines|Not building for iOS or not what you're looking for? %{linkStart}See what else%{linkEnd} GitLab CI/CD has to offer."
-msgstr ""
+msgstr "ä¸æ˜¯ä¸º iOS 构建或者ä¸æ˜¯æ‚¨è¦æ‰¾çš„?%{linkStart}查看%{linkEnd} GitLab CI/CD 还æ供什么。"
msgid "Pipelines|Owner"
msgstr "所有者"
@@ -27949,7 +28460,7 @@ msgid "Pipelines|Runners are available to run your jobs now"
msgstr "Runner 现在å¯ä»¥è¿è¡Œæ‚¨çš„作业"
msgid "Pipelines|Set up a runner"
-msgstr ""
+msgstr "设置一个 runner"
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "清ç†runner缓存时å‘生错误。"
@@ -28023,6 +28534,9 @@ msgstr "使用基于您的项目语言或框架的模æ¿å¼€å§‹ä½¿ç”¨ GitLab CI/C
msgid "Pipelines|Use template"
msgstr "使用模æ¿"
+msgid "Pipelines|Validate"
+msgstr "验è¯"
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr "验è¯GitLab CIé…置中…"
@@ -28033,13 +28547,13 @@ msgid "Pipelines|Visualize"
msgstr "å¯è§†åŒ–"
msgid "Pipelines|We'll guide you through a simple pipeline set-up."
-msgstr ""
+msgstr "我们将指导您完æˆä¸€ä¸ªç®€å•çš„æµæ°´çº¿è®¾ç½®ã€‚"
msgid "Pipelines|We'll walk you through how to deploy to iOS in two easy steps."
-msgstr ""
+msgstr "我们会带您通过两个简å•çš„步骤部署到 iOS 。"
msgid "Pipelines|You have runners available to run your job now. No need to do anything else."
-msgstr ""
+msgstr "您现在å¯ä»¥è¿è¡Œæ‚¨çš„作业。无需åšä»»ä½•å…¶ä»–事情。"
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "您的更改已æˆåŠŸæ交,现在é‡å®šå‘到新的åˆå¹¶è¯·æ±‚页é¢ã€‚"
@@ -28260,6 +28774,9 @@ msgstr "PlantUML"
msgid "PlantUML URL"
msgstr "PlantUML URL"
+msgid "PlantUML diagram"
+msgstr "PlantUML 图表"
+
msgid "Play"
msgstr "è¿è¡Œ"
@@ -28467,12 +28984,6 @@ msgstr "连接代ç ä»“库中,请ç¨å€™ã€‚å¯åœ¨ä»»æ„时刻刷新以获å–当
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "导入代ç ä»“库中,请ç¨å€™ã€‚å¯åœ¨ä»»æ„时刻刷新以获å–当å‰çŠ¶æ€ã€‚"
-msgid "Pod does not exist"
-msgstr "Podä¸å­˜åœ¨"
-
-msgid "Pod not found"
-msgstr "未找到Pod"
-
msgid "Pods in use"
msgstr "正在使用的Pod"
@@ -28486,7 +28997,7 @@ msgid "Policy '%{escalation_policy_name}' does not exist."
msgstr "策略“%{escalation_policy_name}â€ä¸å­˜åœ¨ã€‚"
msgid "Policy management project does not have any policies in %{policy_path}"
-msgstr ""
+msgstr "策略管ç†é¡¹ç›®åœ¨ %{policy_path} 中没有任何策略"
msgid "Policy project doesn't exist"
msgstr "策略项目ä¸å­˜åœ¨"
@@ -28548,14 +29059,17 @@ msgstr "添加行的颜色"
msgid "Preferences|Color for removed lines"
msgstr "删除行的颜色"
+msgid "Preferences|Color theme"
+msgstr "颜色主题"
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "é…置日期和时间的显示方å¼ã€‚"
msgid "Preferences|Customize integrations with third party services."
msgstr "自定义与第三方æœåŠ¡çš„集æˆã€‚"
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
-msgstr "自定义应用程åºé¡¶éƒ¨å’Œå¯¼èˆªä¾§è¾¹æ çš„外观。"
+msgid "Preferences|Customize the color of GitLab."
+msgstr "自定义系统颜色。"
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr "自定义差异中删除行和添加行的颜色。"
@@ -28596,9 +29110,6 @@ msgstr "布局宽度"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "必须为%{min}到%{max}之间的数字"
-msgid "Preferences|Navigation theme"
-msgstr "导航主题"
-
msgid "Preferences|Preview"
msgstr "预览"
@@ -28627,7 +29138,7 @@ msgid "Preferences|Tab width"
msgstr "制表符宽度"
msgid "Preferences|This feature is experimental and translations are not yet complete."
-msgstr ""
+msgstr "此功能是实验性的,翻译尚未完æˆã€‚"
msgid "Preferences|This setting allows you to customize the appearance of the syntax."
msgstr "此设置å…许您自定义基于语法的外观。"
@@ -28650,9 +29161,6 @@ msgstr "准备扫æ报告。"
msgid "Prev"
msgstr "上一页"
-msgid "Prevent adding new members to projects within this group"
-msgstr "ç¦æ­¢å‘该群组内的项目添加新æˆå‘˜"
-
msgid "Prevent auto-stopping"
msgstr "防止自动åœæ­¢"
@@ -28683,6 +29191,9 @@ msgstr "Markdown预览"
msgid "Preview changes"
msgstr "预览更改"
+msgid "Preview diagram"
+msgstr "预览图"
+
msgid "Preview payload"
msgstr "预览有效数æ®"
@@ -28848,9 +29359,6 @@ msgstr "å¸æˆ·æ— æ³•åˆ é™¤ï¼ŒGitLab 无法验è¯æ‚¨çš„身份。"
msgid "Profiles|Account scheduled for removal."
msgstr "å¸æˆ·å·²å®‰æŽ’被删除。"
-msgid "Profiles|Activate signin with one of the following services"
-msgstr "使用以下æœåŠ¡ä¹‹ä¸€æ¿€æ´»ç™»å½•"
-
msgid "Profiles|Active"
msgstr "活动"
@@ -28863,8 +29371,8 @@ msgstr "在状æ€ä¸­æ·»åŠ è¡¨æƒ…符å·"
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr "更新您的用户å时出错,请é‡è¯•ã€‚"
-msgid "Profiles|An indicator appears next to your name and avatar"
-msgstr "在您的å字和头åƒæ—边显示一个指示器"
+msgid "Profiles|An indicator appears next to your name and avatar."
+msgstr "在您的å字和头åƒæ—边显示一个指示器。"
msgid "Profiles|Avatar cropper"
msgstr "头åƒè£å‰ª"
@@ -28890,8 +29398,8 @@ msgstr "更改您的用户åå¯èƒ½ä¼šäº§ç”Ÿæ„想ä¸åˆ°çš„副作用。"
msgid "Profiles|Choose file..."
msgstr "选择文件..."
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr "选择在公开个人资料中显示ç§æœ‰é¡¹ç›®çš„贡献,但ä¸æ˜¾ç¤ºä»»ä½•é¡¹ç›®ï¼Œä»“库或组织信æ¯"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
+msgstr "选择在您的公开个人资料上显示ç§æœ‰é¡¹ç›®çš„贡献,无需任何项目ã€ä»“库或组织信æ¯ã€‚"
msgid "Profiles|City, country"
msgstr "城市,国家"
@@ -28905,6 +29413,9 @@ msgstr "æ交邮件"
msgid "Profiles|Connect %{provider}"
msgstr "连接%{provider}"
+msgid "Profiles|Connect a service for sign-in."
+msgstr "选择用于登录的æœåŠ¡ã€‚"
+
msgid "Profiles|Connected Accounts"
msgstr "å…³è”账户"
@@ -28932,8 +29443,8 @@ msgstr "与%{provider}断开连接"
msgid "Profiles|Do not show on profile"
msgstr "ä¸åœ¨ä¸ªäººèµ„料中显示"
-msgid "Profiles|Don't display activity-related personal information on your profile"
-msgstr "ä¸è¦åœ¨æ‚¨çš„个人资料中显示与活动相关的个人信æ¯"
+msgid "Profiles|Don't display activity-related personal information on your profile."
+msgstr "ä¸è¦åœ¨æ‚¨çš„个人资料中显示与活动相关的个人信æ¯ã€‚"
msgid "Profiles|Edit Profile"
msgstr "编辑个人资料"
@@ -28941,17 +29452,17 @@ msgstr "编辑个人资料"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr "ç¡®ä¿æ‚¨å°†åŒé‡èº«ä»½éªŒè¯æ¢å¤ç å­˜å‚¨åœ¨å®‰å…¨çš„地方。"
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
-msgstr "输入您姓åçš„å‘音以帮助人们正确称呼您"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
+msgstr "输入您姓åçš„å‘音以帮助人们正确称呼您。"
-msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr "输入您的姓å,以便大家认识您"
+msgid "Profiles|Enter your name, so people you know can recognize you."
+msgstr "输入您的姓å,以便大家认识您。"
msgid "Profiles|Enter your password to confirm the email change"
msgstr "输入您的密ç ä»¥ç¡®è®¤ç”µå­é‚®ä»¶æ›´æ”¹"
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
-msgstr "输入您的代è¯ï¼Œè®©äººä»¬çŸ¥é“如何称呼您"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
+msgstr "输入您的人称代è¯ï¼Œè®©äººä»¬çŸ¥é“如何称呼您。"
msgid "Profiles|Example: MacBook key"
msgstr "例如:MacBook Key"
@@ -28975,7 +29486,7 @@ msgid "Profiles|GitLab is unable to verify your identity automatically. For secu
msgstr "GitLab 无法自动验è¯æ‚¨çš„身份。为了安全起è§ï¼Œæ‚¨å¿…须通过 %{openingTag}é‡ç½®æ‚¨çš„密ç %{closingTag} 进行密ç è®¾ç½®æ¥åˆ é™¤æ‚¨çš„è´¦å·ã€‚"
msgid "Profiles|If after setting a password, the option to delete your account is still not available, please %{link_start}submit a request%{link_end} to begin the account deletion process."
-msgstr ""
+msgstr "如果设置密ç åŽï¼Œåˆ é™¤æ‚¨çš„账户的选项ä»ç„¶ä¸å¯ç”¨ã€‚ 请 %{link_start}æ交请求%{link_end},开始å¸æˆ·åˆ é™¤è¿‡ç¨‹ã€‚"
msgid "Profiles|Include private contributions on my profile"
msgstr "在个人资料中包å«éžå…¬å¼€è´¡çŒ®"
@@ -28983,8 +29494,8 @@ msgstr "在个人资料中包å«éžå…¬å¼€è´¡çŒ®"
msgid "Profiles|Incoming email token was successfully reset"
msgstr "接收邮件令牌已é‡ç½®"
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "å¯ç”¨åŒé‡èº«ä»½è®¤è¯ï¼ˆ2FA),æ高账户安全性"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
+msgstr "å¯ç”¨åŒé‡èº«ä»½è®¤è¯ï¼ˆ2FA),æ高å¸æˆ·å®‰å…¨æ€§"
msgid "Profiles|Invalid password"
msgstr "密ç æ— æ•ˆ"
@@ -29070,14 +29581,14 @@ msgstr "删除头åƒ"
msgid "Profiles|Select a service to sign in with."
msgstr "选择è¦ç™»å½•çš„æœåŠ¡ã€‚"
+msgid "Profiles|Service sign-in"
+msgstr "æœåŠ¡ç™»å½•"
+
msgid "Profiles|Set new profile picture"
msgstr "设置新个人资料图片"
-msgid "Profiles|Set your local time zone"
-msgstr "设置本地时区"
-
-msgid "Profiles|Social sign-in"
-msgstr "社交登录"
+msgid "Profiles|Set your local time zone."
+msgstr "设置您的本地时区。"
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "æŸäº›é€‰é¡¹å¯¹äºŽ LDAP å¸æˆ·ä¸å¯ç”¨"
@@ -29085,8 +29596,8 @@ msgstr "æŸäº›é€‰é¡¹å¯¹äºŽ LDAP å¸æˆ·ä¸å¯ç”¨"
msgid "Profiles|Static object token was successfully reset"
msgstr "é™æ€å¯¹è±¡ä»¤ç‰ŒæˆåŠŸé‡ç½®"
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr "请用少于250字符æ述您自己"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
+msgstr "用少于 250 个字符å‘我们介ç»æ‚¨è‡ªå·±ã€‚"
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr "姓å更新功能已被管ç†å‘˜ç¦ç”¨ã€‚"
@@ -29094,17 +29605,17 @@ msgstr "姓å更新功能已被管ç†å‘˜ç¦ç”¨ã€‚"
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "å…许的最大文件大å°ä¸º200KB。"
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr "此电å­é‚®ä»¶å°†æ˜¾ç¤ºåœ¨æ‚¨çš„公开个人资料中。"
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
-msgstr "此电å­é‚®ä»¶å°†ç”¨äºŽåŸºäºŽWebçš„æ“作,例如编辑和åˆå¹¶ã€‚ %{commit_email_link_start}更多信æ¯%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
+msgstr "此电å­é‚®ä»¶å°†ç”¨äºŽåŸºäºŽ Web çš„æ“作,例如编辑和åˆå¹¶ã€‚%{commit_email_link_start}了解更多。%{commit_email_link_end}"
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "此表情符å·å’Œæ¶ˆæ¯ä¼šæ˜¾ç¤ºåœ¨æ‚¨çš„个人资料和界é¢ä¸­ã€‚"
-msgid "Profiles|This information will appear on your profile"
-msgstr "此信æ¯å°†æ˜¾ç¤ºåœ¨æ‚¨çš„个人资料中"
+msgid "Profiles|This information will appear on your profile."
+msgstr "此信æ¯å°†å‡ºçŽ°åœ¨æ‚¨çš„个人资料中。"
msgid "Profiles|Time settings"
msgstr "时间设置"
@@ -29112,8 +29623,8 @@ msgstr "时间设置"
msgid "Profiles|Title"
msgstr "标题"
-msgid "Profiles|Two-Factor Authentication"
-msgstr "åŒé‡è®¤è¯"
+msgid "Profiles|Two-factor authentication"
+msgstr "åŒé‡èº«ä»½éªŒè¯"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "键入您的 %{confirmationValue} 以确认:"
@@ -29148,8 +29659,8 @@ msgstr "网站 URL"
msgid "Profiles|What's your status?"
msgstr "您当å‰çš„状æ€ï¼Ÿ"
-msgid "Profiles|Who you represent or work for"
-msgstr "您代表或工作的å•ä½ç»„织"
+msgid "Profiles|Who you represent or work for."
+msgstr "您代表è°æˆ–为è°å·¥ä½œã€‚"
msgid "Profiles|You can change your avatar here"
msgstr "å¯ä»¥åœ¨è¿™é‡Œä¿®æ”¹æ‚¨çš„头åƒ"
@@ -29190,6 +29701,9 @@ msgstr "您的ä½ç½®æ˜¯åŸºäºŽæ‚¨çš„ %{provider_label} å¸æˆ·è‡ªåŠ¨è®¾ç½®çš„。"
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr "您的姓å是根æ®æ‚¨çš„ %{provider_label} å¸æˆ·è‡ªåŠ¨è®¾ç½®çš„,以便大家认识您"
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr "您的姓å是根æ®æ‚¨çš„ %{provider_label} å¸æˆ·è‡ªåŠ¨è®¾ç½®çš„,因此您认识的人å¯ä»¥è¯†åˆ«æ‚¨ã€‚"
+
msgid "Profiles|Your status"
msgstr "您当å‰çš„状æ€ï¼Ÿ"
@@ -29268,8 +29782,8 @@ msgstr "项目模æ¿"
msgid "Project URL"
msgstr "项目 URL"
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
-msgstr "项目访问必须明确授予æ¯ä¸ªç”¨æˆ·ã€‚ 如果此项目是在一个群组中,群组æˆå‘˜å°†ä¼šèŽ·å¾—访问æƒé™ã€‚"
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
+msgstr "项目访问æƒé™å¿…须明确授予æ¯ä¸ªç”¨æˆ·ã€‚如果此项目是一个群组的一部分,访问æƒé™å°†æŽˆäºˆè¯¥ç¾¤ç»„çš„æˆå‘˜ã€‚"
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
msgstr "项目访问令牌创建在此群组中被ç¦ç”¨ã€‚您ä»ç„¶å¯ä»¥ä½¿ç”¨å’Œç®¡ç†çŽ°æœ‰ä»¤ç‰Œã€‚ %{link_start}了解更多信æ¯ã€‚%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr "维护者"
msgid "ProjectCreationLevel|No one"
msgstr "ç¦æ­¢"
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr "å…许创建项目的角色"
+
msgid "ProjectFileTree|Name"
msgstr "å称"
@@ -29502,6 +30019,9 @@ msgstr "æœç´¢é¡¹ç›®"
msgid "ProjectSelect|Select a project"
msgstr "选择一个项目"
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr "获å–项目时出错"
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr "获å–项目时出错。请é‡è¯•ã€‚"
@@ -29520,9 +30040,6 @@ msgstr "输入新密ç ã€‚"
msgid "ProjectService|Enter new token"
msgstr "输入新令牌"
-msgid "ProjectService|Issue URL"
-msgstr "议题 URL"
-
msgid "ProjectService|Jenkins server URL"
msgstr "Jenkins æœåŠ¡å™¨ URL"
@@ -29530,7 +30047,7 @@ msgid "ProjectService|Leave blank to use your current API key"
msgstr "留空时,使用您当å‰çš„ API 密钥"
msgid "ProjectService|Leave blank to use your current API key."
-msgstr ""
+msgstr "留空时,使用您当å‰çš„ API 密钥。"
msgid "ProjectService|Leave blank to use your current password"
msgstr "留空时,使用您当å‰çš„密ç "
@@ -29620,13 +30137,13 @@ msgid "ProjectSettings|%{link_start}What variables can I use?%{link_end}"
msgstr "%{link_start}我å¯ä»¥ä½¿ç”¨å“ªäº›å˜é‡ï¼Ÿ%{link_end}"
msgid "ProjectSettings|Additional options"
-msgstr ""
+msgstr "其他选项"
msgid "ProjectSettings|Additional settings that influence how and when merges are done."
msgstr "å½±å“åˆå¹¶å®Œæˆçš„æ–¹å¼å’Œæ—¶é—´çš„其他设置。"
msgid "ProjectSettings|All threads must be resolved"
-msgstr ""
+msgstr "必须解决所有主题"
msgid "ProjectSettings|Allow"
msgstr "å…许"
@@ -29638,7 +30155,7 @@ msgid "ProjectSettings|Analytics"
msgstr "分æž"
msgid "ProjectSettings|Automatically resolve merge request diff threads when they become outdated"
-msgstr ""
+msgstr "自动解决åˆå¹¶è¯·æ±‚差异主题过期时的åˆå¹¶è¯·æ±‚"
msgid "ProjectSettings|Badges"
msgstr "徽章"
@@ -29701,7 +30218,7 @@ msgid "ProjectSettings|Every project can have its own space to store its Docker
msgstr "æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å…¶Dockeré•œåƒ"
msgid "ProjectSettings|Every project can have its own space to store its packages."
-msgstr ""
+msgstr "æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å®ƒçš„软件包。"
msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr "æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å®ƒçš„软件包。注æ„:当一个项目是公开时,软件包库总是å¯è§çš„。"
@@ -29743,7 +30260,7 @@ msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and
msgstr "例行维护ã€å¯¼å‡ºã€å½’æ¡£ã€æ›´æ”¹è·¯å¾„ã€ä¼ è¾“和删除。"
msgid "ProjectSettings|How do they differ?"
-msgstr ""
+msgstr "它们之间有何差异?"
msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
msgstr "如果å¯ç”¨äº†åˆå¹¶é˜Ÿåˆ—,则åªæœ‰åœ¨å¯ä»¥é‡æ–°è®¾ç½®åˆ†æ”¯è€Œä¸å‘生冲çªçš„情况下æ‰èƒ½è¿›è¡Œåˆå¹¶ã€‚"
@@ -29821,7 +30338,7 @@ msgid "ProjectSettings|Override user notification preferences for all project me
msgstr "覆盖所有项目æˆå‘˜çš„用户通知首选项。"
msgid "ProjectSettings|Package registry"
-msgstr ""
+msgstr "软件包库"
msgid "ProjectSettings|Packages"
msgstr "软件包"
@@ -29836,7 +30353,7 @@ msgid "ProjectSettings|Pipelines must succeed"
msgstr "æµæ°´çº¿å¿…é¡»æˆåŠŸ"
msgid "ProjectSettings|Prevents direct linking to potentially sensitive media files"
-msgstr ""
+msgstr "阻止直接链接到潜在的æ•æ„Ÿåª’体文件"
msgid "ProjectSettings|Private"
msgstr "ç§æœ‰"
@@ -29857,7 +30374,7 @@ msgid "ProjectSettings|Require an associated issue from Jira"
msgstr "需è¦æ¥è‡ª Jira 的相关议题"
msgid "ProjectSettings|Require authentication to view media files"
-msgstr ""
+msgstr "需è¦éªŒè¯æ‰èƒ½æŸ¥çœ‹åª’体文件"
msgid "ProjectSettings|Requirements"
msgstr "需求"
@@ -29982,6 +30499,9 @@ msgstr "什么是徽章?"
msgid "ProjectSettings|What are merge trains?"
msgstr "什么是åˆå¹¶é˜Ÿåˆ—?"
+msgid "ProjectSettings|What is squashing?"
+msgstr "什么是压缩?"
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr "在 CI/CD é…置文件中å¯ç”¨åˆå¹¶è¯·æ±‚æµæ°´çº¿æ—¶ï¼Œæµæ°´çº¿ä¼šéªŒè¯æºåˆ†æ”¯å’Œç›®æ ‡åˆ†æ”¯çš„组åˆç»“果。%{link_start}如何é…ç½®åˆå¹¶è¯·æ±‚æµæ°´çº¿ï¼Ÿ%{link_end}"
@@ -30016,7 +30536,7 @@ msgid "ProjectTemplates|HIPAA Audit Protocol"
msgstr "HIPAA审计åè®®"
msgid "ProjectTemplates|Jsonnet for Dynamic Child Pipelines"
-msgstr ""
+msgstr "用于动æ€å­æµæ°´çº¿çš„ Jsonnet"
msgid "ProjectTemplates|Kotlin Native for Linux"
msgstr "Linuxçš„Kotlin Native"
@@ -30058,7 +30578,7 @@ msgid "ProjectTemplates|Pages/Middleman"
msgstr "Pages/Middleman"
msgid "ProjectTemplates|Pages/Pelican"
-msgstr ""
+msgstr "Pages/Pelican"
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/Plain HTML"
@@ -30100,7 +30620,7 @@ msgid "Projects (%{count})"
msgstr "项目 (%{count})"
msgid "Projects API"
-msgstr ""
+msgstr "项目 API"
msgid "Projects Successfully Retrieved"
msgstr "项目æˆåŠŸè¯»å–"
@@ -30120,6 +30640,9 @@ msgstr "贡献的项目"
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr "项目å¯å¸®åŠ©æ‚¨ç»„织工作。它们包å«æ‚¨çš„文件仓库ã€è®®é¢˜ã€åˆå¹¶è¯·æ±‚等等。"
+msgid "Projects in this group can use Git LFS"
+msgstr "此群组中的项目å¯ä»¥ä½¿ç”¨ Git LFS"
+
msgid "Projects shared with %{group_name}"
msgstr "与 %{group_name} 共享的项目"
@@ -30186,7 +30709,7 @@ msgstr "è”系管ç†å‘˜å¯ç”¨å¯¼å…¥é¡¹ç›®çš„选项。"
msgid "ProjectsNew|Create"
msgstr "创建"
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr "创建一个空白项目æ¥å­˜æ”¾æ‚¨çš„文件,规划您的工作,并在代ç ç­‰æ–¹é¢è¿›è¡Œå作。"
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,8 +30769,8 @@ msgstr "为外部仓库è¿è¡ŒCI/CD"
msgid "ProjectsNew|Visibility Level"
msgstr "å¯è§æ€§çº§åˆ«"
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "想è¦åœ¨åŒä¸€å‘½å空间下存放几个ä¾èµ–项目?请%{link_start}创建一个群组。%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr "想è¦åœ¨åŒä¸€å‘½å空间下阻止几个ä¾èµ–项目?%{link_start}创建一个群组。%{link_end}"
msgid "PrometheusAlerts|exceeded"
msgstr "超过"
@@ -30405,6 +30928,9 @@ msgstr "è´­ä¹°ä¼ä¸šç‰ˆ"
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr "è´­ä¹°GitLabä¼ä¸šç‰ˆ"
+msgid "Promotions|Configure Service Desk"
+msgstr "é…ç½®æœåŠ¡å°"
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr "请è”ç³»%{namespace_name}群组的所有者æ¥å‡çº§è®¡åˆ’。"
@@ -30417,6 +30943,9 @@ msgstr "请与管ç†å‘˜è”系以å‡çº§è®¸å¯è¯ã€‚"
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr "æ述模æ¿å…许您为项目的议题和åˆå¹¶è¯·æ±‚æ述字段定义特定上下文的模æ¿ã€‚"
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr "关闭æœåŠ¡å°ä¿ƒé”€"
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr "关闭燃尽图æ示"
@@ -30670,7 +31199,7 @@ msgid "ProtectedEnvironment|Environment"
msgstr "环境"
msgid "ProtectedEnvironment|Only specified groups can execute deployments in protected environments."
-msgstr ""
+msgstr "åªæœ‰æŒ‡å®šçš„群组æ‰èƒ½åœ¨å—ä¿æŠ¤çš„环境中执行部署。"
msgid "ProtectedEnvironment|Only specified users can execute deployments in a protected environment."
msgstr "åªæœ‰æŒ‡å®šçš„用户æ‰èƒ½åœ¨å—ä¿æŠ¤çš„环境中执行部署。"
@@ -30691,7 +31220,7 @@ msgid "ProtectedEnvironment|Select an environment"
msgstr "选择一个环境"
msgid "ProtectedEnvironment|Select groups"
-msgstr ""
+msgstr "选择群组"
msgid "ProtectedEnvironment|Select users"
msgstr "选择用户"
@@ -30738,6 +31267,9 @@ msgstr "默认"
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr "æ示:%{linkStart}Auto DevOps%{linkEnd} 使用 Kubernetes 集群æ¥éƒ¨ç½²æ‚¨çš„代ç ï¼"
+msgid "Provide Feedback"
+msgstr "æä¾›å馈"
+
msgid "Provide a number our sales team can use to call you."
msgstr "æ供一个我们的销售团队å¯ä»¥ç»™æ‚¨æ‰“电è¯çš„å·ç ã€‚"
@@ -30826,7 +31358,7 @@ msgid "Push an existing folder"
msgstr "推é€çŽ°æœ‰æ–‡ä»¶å¤¹"
msgid "Push code to the repository."
-msgstr ""
+msgstr "推é€ä»£ç åˆ°ä»“库。"
msgid "Push commits to the source branch or add previously merged commits to review them."
msgstr "推é€æ交到æºåˆ†æ”¯æˆ–添加先å‰åˆå¹¶çš„æ交以进行审核。"
@@ -30907,7 +31439,7 @@ msgid "PushoverService|%{user_name} pushed new branch \"%{ref}\"."
msgstr "%{user_name} 已推é€æ–°åˆ†æ”¯ \"%{ref}\"。"
msgid "PushoverService|Enter new user key"
-msgstr ""
+msgstr "输入新的用户密钥"
msgid "PushoverService|Enter your application key."
msgstr "输入您的应用程åºå¯†é’¥ã€‚"
@@ -30925,7 +31457,7 @@ msgid "PushoverService|Leave blank for all active devices."
msgstr "留空为所有活动设备."
msgid "PushoverService|Leave blank to use your current user key."
-msgstr ""
+msgstr "留空时,使用您当å‰çš„用户密钥。"
msgid "PushoverService|Low priority"
msgstr "低优先级"
@@ -31050,6 +31582,9 @@ msgstr "正在与 SAML æ供商é‡æ–°éªŒè¯ã€‚"
msgid "Rebase"
msgstr "å˜åŸº"
+msgid "Rebase completed"
+msgstr "å˜åŸºå·²å®Œæˆ"
+
msgid "Rebase in progress"
msgstr "Rebase正在进行中"
@@ -31137,9 +31672,6 @@ msgstr "引用"
msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
msgstr "优化您的æœç´¢æ¡ä»¶ï¼ˆå°½å¯èƒ½é€‰æ‹© %{strong_open}群组%{strong_close} å’Œ %{strong_open}项目%{strong_close}"
-msgid "Refresh"
-msgstr "刷新"
-
msgid "Refresh the page and try again."
msgstr "刷新页é¢ç„¶åŽé‡è¯•ã€‚"
@@ -31277,7 +31809,7 @@ msgid "Related feature flags"
msgstr "相关的功能标志"
msgid "Related incidents or issues"
-msgstr ""
+msgstr "相关的事件或议题"
msgid "Related issues"
msgstr "相关议题"
@@ -31298,6 +31830,9 @@ msgstr "å‘布资æº"
msgid "Release assets documentation"
msgstr "å‘布资æºæ–‡æ¡£"
+msgid "Release date"
+msgstr "å‘布日期"
+
msgid "Release does not have the same project as the milestone"
msgstr "å‘布与里程碑的项目ä¸åŒ"
@@ -31353,10 +31888,10 @@ msgid "Releases|New Release"
msgstr "新版本"
msgid "Releases|Tag message"
-msgstr ""
+msgstr "标记消æ¯"
msgid "Release|Include message from the annotated tag."
-msgstr ""
+msgstr "包å«æ¥è‡ªæ³¨é‡Šæ ‡ç­¾çš„消æ¯ã€‚"
msgid "Release|Something went wrong while creating a new release."
msgstr "创建新å‘布时出错。"
@@ -31368,10 +31903,10 @@ msgid "Release|Something went wrong while saving the release details."
msgstr "ä¿å­˜å‘布详细信æ¯æ—¶å‡ºé”™ã€‚"
msgid "Release|Unable to fetch the tag notes."
-msgstr ""
+msgstr "无法获å–标签备注。"
msgid "Release|You can edit the content later by editing the release. %{linkStart}How do I edit a release?%{linkEnd}"
-msgstr ""
+msgstr "您å¯ä»¥ç¨åŽé€šè¿‡ç¼–辑å‘布æ¥ç¼–辑内容。%{linkStart}我如何编辑å‘布?%{linkEnd}"
msgid "Reload page"
msgstr "é‡æ–°åŠ è½½é¡µé¢"
@@ -31691,9 +32226,6 @@ msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
msgid "Replace"
msgstr "替æ¢"
-msgid "Replace %{blob_name}"
-msgstr "æ›¿æ¢ %{blob_name}"
-
msgid "Replace %{name}"
msgstr "æ›¿æ¢ %{name}"
@@ -31701,16 +32233,16 @@ msgid "Replace all label(s)"
msgstr "替æ¢æ‰€æœ‰æ ‡è®°"
msgid "Replace audio"
-msgstr ""
+msgstr "替æ¢éŸ³é¢‘"
msgid "Replace file"
msgstr "替æ¢æ–‡ä»¶"
msgid "Replace image"
-msgstr ""
+msgstr "替æ¢å›¾åƒ"
msgid "Replace video"
-msgstr ""
+msgstr "替æ¢è§†é¢‘"
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr "已将所有标记替æ¢ä¸º%{label_references}%{label_text}。"
@@ -31721,11 +32253,14 @@ msgstr "替æ¢å…‹éš†URL根地å€ã€‚"
msgid "Replication"
msgstr "å¤åˆ¶"
+msgid "Reply"
+msgstr "回å¤"
+
msgid "Reply by email"
msgstr "通过电å­é‚®ä»¶å›žå¤"
msgid "Reply internally"
-msgstr ""
+msgstr "内部回å¤"
msgid "Reply to comment"
msgstr "回å¤è¯„论"
@@ -31749,7 +32284,7 @@ msgid "Report for the scan has been removed from the database."
msgstr "扫æ报告已从数æ®åº“中删除。"
msgid "Report your license usage data to GitLab"
-msgstr ""
+msgstr "报告您的许å¯è¯ä½¿ç”¨æ•°æ®"
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "由%{reportedBy}报告于%{timeAgo}"
@@ -31808,6 +32343,12 @@ msgstr "基础报告分æžé”™è¯¯ï¼š"
msgid "Reports|Classname"
msgstr "ç±»å"
+msgid "Reports|Copy failed test names to run locally"
+msgstr "å¤åˆ¶å¤±è´¥çš„测试å称到本地è¿è¡Œ"
+
+msgid "Reports|Copy failed tests"
+msgstr "å¤åˆ¶å¤±è´¥çš„测试"
+
msgid "Reports|Execution time"
msgstr "执行时间"
@@ -31826,7 +32367,7 @@ msgid "Reports|Filename"
msgstr "文件å"
msgid "Reports|Fixed"
-msgstr ""
+msgstr "已修å¤"
msgid "Reports|Full report"
msgstr "完整报告"
@@ -31904,7 +32445,7 @@ msgid "Repositories Analytics"
msgstr "仓库分æž"
msgid "RepositoriesAnalytics|Analyze repositories for projects in %{groupName}. Data doesn't include projects in subgroups. %{learnMoreLink}."
-msgstr ""
+msgstr "%{groupName} 中的项目分æžåº“。数æ®ä¸åŒ…括å­ç»„中的项目。%{learnMoreLink}。"
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr "作业的平å‡è¦†ç›–率"
@@ -31913,7 +32454,7 @@ msgid "RepositoriesAnalytics|Average coverage"
msgstr "å¹³å‡è¦†ç›–率"
msgid "RepositoriesAnalytics|Average test coverage"
-msgstr ""
+msgstr "å¹³å‡æµ‹è¯•è¦†ç›–率"
msgid "RepositoriesAnalytics|Code Coverage: %{averageCoverage}"
msgstr "代ç è¦†ç›–范围: %{averageCoverage}"
@@ -31938,14 +32479,14 @@ msgstr "历å²æµ‹è¯•è¦†ç›–率数æ®åŽŸå§‹æ ¼å¼(.csv)已就绪,å¯ä¾›è¿›ä¸€æ­¥
msgid "RepositoriesAnalytics|In the last day, %{metricValue} job has code coverage."
msgid_plural "RepositoriesAnalytics|In the last day, %{metricValue} jobs have code coverage."
-msgstr[0] ""
+msgstr[0] "在最åŽä¸€å¤©ï¼Œ%{metricValue} 个作业有代ç è¦†ç›–率。"
msgid "RepositoriesAnalytics|In the last day, %{metricValue} project in %{groupName} has code coverage enabled."
msgid_plural "RepositoriesAnalytics|In the last day, %{metricValue} projects in %{groupName} have code coverage enabled."
-msgstr[0] ""
+msgstr[0] "在最åŽä¸€å¤©ï¼Œåœ¨ %{groupName} 中的 %{metricValue} 个项目已å¯ç”¨ä»£ç è¦†ç›–率。"
msgid "RepositoriesAnalytics|In the last day, on average, %{metricValue} of all jobs are covered."
-msgstr ""
+msgstr "在最åŽä¸€å¤©ï¼Œæ‰€æœ‰ä½œä¸šä¸­å¹³å‡æœ‰ %{metricValue} 个作业被覆盖。"
msgid "RepositoriesAnalytics|Jobs with Coverage"
msgstr "覆盖范围内的作业"
@@ -31954,19 +32495,19 @@ msgid "RepositoriesAnalytics|Jobs with Coverage: %{coverageCount}"
msgstr "覆盖范围的作业: %{coverageCount}"
msgid "RepositoriesAnalytics|Last 30 days"
-msgstr ""
+msgstr "过去 30 天"
msgid "RepositoriesAnalytics|Last Update"
msgstr "最新更新"
msgid "RepositoriesAnalytics|Last updated %{timeAgo}"
-msgstr ""
+msgstr "最åŽæ›´æ–°äºŽ %{timeAgo}"
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr "最新测试覆盖率结果"
msgid "RepositoriesAnalytics|Latest test coverage results for all projects in %{groupName} (excluding projects in subgroups)."
-msgstr ""
+msgstr "%{groupName} 中所有项目的最新测试覆盖率(ä¸åŒ…括å­ç»„中的项目)。"
msgid "RepositoriesAnalytics|No test coverage to display"
msgstr "没有è¦æ˜¾ç¤ºçš„测试覆盖率"
@@ -31984,7 +32525,7 @@ msgid "RepositoriesAnalytics|Projects with Coverage: %{projectCount}"
msgstr "覆盖范围的项目: %{projectCount}"
msgid "RepositoriesAnalytics|Repositories Analytics"
-msgstr ""
+msgstr "仓库分æž"
msgid "RepositoriesAnalytics|Test Code Coverage"
msgstr "测试代ç è¦†ç›–率"
@@ -32008,7 +32549,7 @@ msgid "Repository already read-only"
msgstr "存储库已ç»æ˜¯åªè¯»"
msgid "Repository by URL"
-msgstr ""
+msgstr "使用 URL 定ä½ä»“库"
msgid "Repository check"
msgstr "仓库检查"
@@ -32068,7 +32609,7 @@ msgid "Repository update events"
msgstr "仓库更新事件"
msgid "Repository usage recalculation started"
-msgstr ""
+msgstr "已开始é‡æ–°è®¡ç®—仓库使用情况"
msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
msgstr "仓库: %{counter_repositories} / Wikis: %{counter_wikis} / 构建产物: %{counter_build_artifacts} / æµæ°´çº¿äº§ç‰©ï¼š%{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / 代ç ç‰‡æ®µ: %{counter_snippets} / 软件包: %{counter_packages} / 上传文件: %{counter_uploads}"
@@ -32095,7 +32636,7 @@ msgid "Request attention from assignee(s) or reviewer(s)"
msgstr "æ¥è‡ªæŒ‡æ´¾äººæˆ–审核者的请求关注"
msgid "Request data is too large"
-msgstr ""
+msgstr "请求数æ®è¿‡å¤§"
msgid "Request details"
msgstr "请求详情"
@@ -32125,7 +32666,7 @@ msgid "Requested attention from @%{username}"
msgstr "请求æ¥è‡ª @%{username} 的注æ„事项"
msgid "Requested attention from @%{username}. Your own attention request was removed."
-msgstr ""
+msgstr "已请求@%{username}的关注。您自己的关注请求已被删除。"
msgid "Requested design version does not exist."
msgstr "请求的设计版本ä¸å­˜åœ¨."
@@ -32134,7 +32675,7 @@ msgid "Requested review"
msgstr "请求审核"
msgid "Requested review. Your attention request was removed."
-msgstr ""
+msgstr "已请求审核。您的关注请求已被删除。"
msgid "Requested states are invalid"
msgstr "请求的状æ€æ— æ•ˆ"
@@ -32151,9 +32692,6 @@ msgstr "æ¯ä¸ªå‘¨æœŸçš„请求"
msgid "Require additional authentication for administrative tasks."
msgstr "需è¦å¯¹ç®¡ç†ä»»åŠ¡è¿›è¡Œé¢å¤–的身份验è¯ã€‚"
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr "è¦æ±‚此群组中的所有用户都设置åŒé‡è®¤è¯"
-
msgid "Required approvals (%{approvals_given} given)"
msgstr "必需的核准(%{approvals_given}已完æˆ)"
@@ -32228,6 +32766,9 @@ msgstr "é‡æ–°å‘é€è§£é”说明"
msgid "Reset"
msgstr "é‡ç½®"
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr "é‡ç½®æ–‡ä»¶"
@@ -32237,9 +32778,6 @@ msgstr "é‡ç½®ç­›é€‰å™¨"
msgid "Reset health check access token"
msgstr "é‡ç½®è¿è¡ŒçŠ¶å†µæ£€æŸ¥è®¿é—®ä»¤ç‰Œ"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr "将生æˆé‡ç½®é“¾æŽ¥å¹¶å‘é€ç»™ç”¨æˆ·ã€‚ %{break} 用户将被迫在首次登录时设置密ç ã€‚"
-
msgid "Reset password"
msgstr "é‡ç½®å¯†ç "
@@ -32333,11 +32871,14 @@ msgstr "æ¢å¤è¯¥ç¾¤ç»„将防止该群组åŠå…¶å­ç¾¤ç»„和项目在此日期被
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr "æ¢å¤è¯¥é¡¹ç›®å°†é˜²æ­¢é¡¹ç›®åœ¨æ­¤æ—¥æœŸè¢«åˆ é™¤å¹¶æ¢å¤ç”¨æˆ·å¯¹å…¶è¿›è¡Œæ›´æ”¹çš„能力。"
+msgid "Restrict access by IP address"
+msgstr "通过 IP 地å€é™åˆ¶è®¿é—®"
+
msgid "Restrict membership by email domain"
msgstr "通过电å­é‚®ä»¶åŸŸé™åˆ¶æˆå‘˜èµ„æ ¼"
msgid "Restrict projects for this runner"
-msgstr "é™åˆ¶é€‚用于该Runner的项目"
+msgstr "é™åˆ¶é€‚用于该 runner 的项目"
msgid "Restricted shift times are not available for hourly shifts"
msgstr "é™åˆ¶è½®ç­æ—¶é—´ä¸é€‚用于æ¯å°æ—¶è½®ç­"
@@ -32366,12 +32907,6 @@ msgstr "é‡è¯•ä½œä¸š"
msgid "Retry migration"
msgstr "é‡è¯•è¿ç§»"
-msgid "Retry the downstream pipeline"
-msgstr "é‡è¯•ä¸‹æ¸¸æµæ°´çº¿"
-
-msgid "Retry the trigger job"
-msgstr "é‡è¯•è§¦å‘器作业"
-
msgid "Retry this job"
msgstr "é‡è¯•å½“å‰ä½œä¸š"
@@ -32560,22 +33095,22 @@ msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spa
msgstr "容é‡ä¸º 1,通过自动扩展组é‡æ–°ç”Ÿæˆå¯ç”¨æš– HA。容é‡ä¸º 2,å¯ç”¨çƒ­ HA,因为å³ä½¿èŠ‚点丢失,该æœåŠ¡ä¹Ÿå¯ç”¨ã€‚容é‡ä¸º 3 个或更多,å¯ç”¨çƒ­ HA 和手动扩展 runner 队列。"
msgid "Runners|A new version is available"
-msgstr ""
+msgstr "有新版本å¯ç”¨"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
-msgstr ""
+msgstr "一个周期性的åŽå°ä»»åŠ¡åˆ é™¤ runner,这些 runner 在超过 %{elapsedTime} åŽæœªè”ç³» GitLab 。%{linkStart}我å¯ä»¥æŸ¥çœ‹æœ‰å¤šå°‘ runner 被删除了?%{linkEnd}"
msgid "Runners|Active"
msgstr "å¯ç”¨"
msgid "Runners|Add notes, like who owns the runner or what it should be used for."
-msgstr ""
+msgstr "添加备注,比如è°æ‹¥æœ‰ runner,或者它应该用于什么目的。"
msgid "Runners|All"
msgstr "全部"
msgid "Runners|All group runners that have not contacted GitLab in more than %{elapsedTime} are deleted permanently. This task runs periodically in the background."
-msgstr ""
+msgstr "所有未è”ç³» GitLab 超过 %{elapsedTime} 的群组 runner 被永久删除。此任务在åŽå°å®šæœŸè¿è¡Œã€‚"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr "Amazon Linux 2 Docker HA,具有手动扩展和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚ %{percentage} 点。"
@@ -32663,13 +33198,13 @@ msgid "Runners|Download latest binary"
msgstr "下载最新的二进制文件"
msgid "Runners|Edit your search and try again"
-msgstr ""
+msgstr "编辑您的æœç´¢å¹¶é‡è¯•"
msgid "Runners|Enable stale runner cleanup"
-msgstr ""
+msgstr "å¯ç”¨é™ˆæ—§çš„ runner 清ç†"
msgid "Runners|Enable stale runner cleanup?"
-msgstr ""
+msgstr "å¯ç”¨é™ˆæ—§çš„ runner 清ç†ï¼Ÿ"
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
msgstr "输入秒数。此超时时间优先级高于为项目设定的较低超时时间。"
@@ -32678,11 +33213,14 @@ msgid "Runners|Executor"
msgstr "执行器"
msgid "Runners|Get started with runners"
-msgstr ""
+msgstr "Runner 入门"
msgid "Runners|Group"
msgstr "群组"
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr "我们如何å‡çº§ GitLab runner?"
+
msgid "Runners|IP Address"
msgstr "IP地å€"
@@ -32702,7 +33240,7 @@ msgid "Runners|Locked to this project"
msgstr "é”定到此项目"
msgid "Runners|Maintenance note"
-msgstr ""
+msgstr "维护备注"
msgid "Runners|Maximum job timeout"
msgstr "最大作业超时"
@@ -32729,7 +33267,7 @@ msgid "Runners|New registration token generated!"
msgstr "已生æˆæ–°çš„注册令牌ï¼"
msgid "Runners|No results found"
-msgstr ""
+msgstr "未找到结果"
msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr "未å‘现。Windows Shell executor 的默认选择。"
@@ -32807,9 +33345,6 @@ msgstr "æ¢å¤æŽ¥å—作业"
msgid "Runners|Revision"
msgstr "版本"
-msgid "Runners|Rocket launch illustration"
-msgstr "ç«ç®­å‘射图"
-
msgid "Runners|Runner"
msgstr "Runner"
@@ -32874,13 +33409,13 @@ msgid "Runners|Runners"
msgstr "Runner"
msgid "Runners|Runners are the agents that run your CI/CD jobs. Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
+msgstr "Runners 是è¿è¡Œ CI/CD 作业的代ç†ã€‚按照 %{linkStart}安装和注册指å—%{linkEnd} æ¥è®¾ç½®ä¸€ä¸ª runner。"
msgid "Runners|Runs untagged jobs"
msgstr "è¿è¡Œæœªæ ‡è®°çš„作业"
msgid "Runners|Select projects to assign to this runner"
-msgstr ""
+msgstr "选择è¦åˆ†é…给此 runner 的项目"
msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr "在此选择您的首选选项。在下一步中,您å¯ä»¥åœ¨ AWS CloudFormation 控制å°ä¸­é€‰æ‹©æ‚¨çš„ runner 能力。"
@@ -32926,10 +33461,10 @@ msgstr "Runner 将被永久删除,ä¸å†é€‚用于项目或群组。您确定è¦
msgid "Runners|This group currently has 1 stale runner."
msgid_plural "Runners|This group currently has %d stale runners."
-msgstr[0] ""
+msgstr[0] "此群组目å‰æœ‰ %d 个陈旧的 runner。"
msgid "Runners|This group currently has no stale runners."
-msgstr ""
+msgstr "此群组当å‰æ²¡æœ‰é™ˆæ—§çš„ runner。"
msgid "Runners|This runner has not run any jobs."
msgstr "æ­¤ runner 没有è¿è¡Œä»»ä½•ä½œä¸šã€‚"
@@ -32941,7 +33476,7 @@ msgid "Runners|This runner is available to all projects and subgroups in a group
msgstr "æ­¤Runner适用于一个群组中的所有项目和å­ç¾¤ç»„。"
msgid "Runners|This runner is outdated, an upgrade is recommended"
-msgstr ""
+msgstr "这个 runner å·²ç»è¿‡æ—¶äº†ï¼Œå»ºè®®å‡çº§"
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
msgstr "è¦åœ¨ Kubernetes 中安装Runner,请éµå¾ª GitLab 文档中æ述的说明。"
@@ -32949,6 +33484,15 @@ msgstr "è¦åœ¨ Kubernetes 中安装Runner,请éµå¾ª GitLab 文档中æè¿°çš„è
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr "è¦åœ¨å®¹å™¨ä¸­å®‰è£…Runner,请éµå¾ª GitLab 文档中æ述的说明。"
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr "å‡çº§ GitLab Runner 以匹é…您正在è¿è¡Œçš„ GitLab 版本。%{linkStart}大版本和å°ç‰ˆæœ¬%{linkEnd} 都应该匹é…。"
+
+msgid "Runners|Upgrade available"
+msgstr "有å‡çº§å¯ç”¨"
+
+msgid "Runners|Upgrade recommended"
+msgstr "推èå‡çº§"
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr "当您希望群组中的所有项目都å¯ä»¥è®¿é—®ä¸€ç»„Runner时,请使用群组Runner。"
@@ -32977,7 +33521,7 @@ msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. N
msgstr "具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½çš„ Windows 2019 Shell。Non-spot。"
msgid "Runners|Yes, start deleting stale runners"
-msgstr ""
+msgstr "是的,开始删除过期的 runner"
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr "您å¯ä»¥è®¾ç½®ä¸€ä¸ªç‰¹å®šçš„Runner供多个项目使用,但是您ä¸èƒ½è®©å®ƒæˆä¸ºä¸€ä¸ªå…±äº«çš„Runner。"
@@ -33013,10 +33557,10 @@ msgid "Runners|stale"
msgstr "stale"
msgid "Runners|upgrade available"
-msgstr ""
+msgstr "å‡çº§å¯ç”¨"
msgid "Runners|upgrade recommended"
-msgstr ""
+msgstr "推èå‡çº§"
msgid "Running"
msgstr "è¿è¡Œä¸­"
@@ -33039,6 +33583,21 @@ msgstr "SAMLå‘现令牌"
msgid "SAML for %{group_name}"
msgstr "%{group_name} çš„ SAML"
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr "选择“授æƒâ€ä¼šå°†æ‚¨çš„ GitLab 账户“%{username}â€(%{email}) 的所有æƒè½¬ç§»ç»™æ‚¨çš„组织。"
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr "登录 GitLab 以连接您组织的å¸æˆ·"
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr "群组“%{group_path}â€å…许您使用 SSO æ¥ç™»å½•å¸æˆ·ã€‚"
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr "è¦è®¿é—®â€œ%{group_name}â€ï¼Œæ‚¨å¿…须使用您的å•ç‚¹ç™»å½•å¸æˆ·é€šè¿‡å¤–部登录页é¢ç™»å½•ã€‚"
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr "您的组织的 SSO 已连接到您的 GitLab å¸æˆ·"
+
msgid "SAST Configuration"
msgstr "SASTé…ç½®"
@@ -33100,13 +33659,13 @@ msgid "Save %{name} size limits"
msgstr "ä¿å­˜%{name}大å°é™åˆ¶"
msgid "Save Changes"
-msgstr "ä¿å­˜ä¿®æ”¹"
+msgstr "ä¿å­˜æ›´æ”¹"
msgid "Save application"
msgstr "ä¿å­˜åº”用"
msgid "Save changes"
-msgstr "ä¿å­˜ä¿®æ”¹"
+msgstr "ä¿å­˜æ›´æ”¹"
msgid "Save changes before testing"
msgstr "测试å‰ä¿å­˜æ›´æ”¹"
@@ -33118,7 +33677,7 @@ msgid "Save deploy freeze"
msgstr "ä¿å­˜éƒ¨ç½²å†»ç»“"
msgid "Save internal note"
-msgstr ""
+msgstr "ä¿å­˜å†…部备注"
msgid "Save password"
msgstr "ä¿å­˜å¯†ç "
@@ -33319,7 +33878,7 @@ msgid "Search or filter results…"
msgstr "æœç´¢æˆ–筛选结果…"
msgid "Search page"
-msgstr ""
+msgstr "æœç´¢é¡µ"
msgid "Search project"
msgstr "æœç´¢é¡¹ç›®"
@@ -33361,7 +33920,7 @@ msgid "SearchAutocomplete|Issues I've created"
msgstr "我创建的议题"
msgid "SearchAutocomplete|Issues assigned to me"
-msgstr "分é…给我的议题"
+msgstr "指派给我的议题"
msgid "SearchAutocomplete|Merge requests I've created"
msgstr "我创建的åˆå¹¶è¯·æ±‚"
@@ -33480,13 +34039,13 @@ msgid "Secure token that identifies an external storage request."
msgstr "识别外部存储请求的安全令牌。"
msgid "SecureFiles|Delete %{name}?"
-msgstr ""
+msgstr "删除 %{name} å—?"
msgid "SecureFiles|Delete secure file"
-msgstr ""
+msgstr "删除安全文件"
msgid "SecureFiles|Secure File %{name} will be permanently deleted. Are you sure?"
-msgstr ""
+msgstr "安全文件 %{name} 将被永久删除。您确定å—?"
msgid "Security"
msgstr "安全"
@@ -33660,7 +34219,7 @@ msgid "SecurityConfiguration|Vulnerability details and statistics in the merge r
msgstr "åˆå¹¶è¯·æ±‚中的æ¼æ´žè¯¦ç»†ä¿¡æ¯å’Œç»Ÿè®¡"
msgid "SecurityOrchestration| and "
-msgstr ""
+msgstr "和 "
msgid "SecurityOrchestration| or "
msgstr "或 "
@@ -33678,7 +34237,10 @@ msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request
msgstr "针对 %{branches} 的开放åˆå¹¶è¯·æ±‚中的 %{scanners} %{severities}。"
msgid "SecurityOrchestration|+%{count} more"
-msgstr ""
+msgstr "+%{count} 更多"
+
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ",和 %{count} 个更多"
msgid "SecurityOrchestration|.yaml mode"
msgstr ".yaml 模å¼"
@@ -33695,8 +34257,8 @@ msgstr "添加规则"
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr "解除警报åŽï¼Œè¯¥ä¿¡æ¯å°†ä¸å†æ˜¾ç¤ºã€‚"
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
-msgstr ""
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
+msgstr "å¯ç”¨ç¾¤ç»„级策略åŽï¼Œè¯¥ç­–略自动应用于该群组中的所有项目和å­ç»„。"
msgid "SecurityOrchestration|All policies"
msgstr "所有策略"
@@ -33740,6 +34302,9 @@ msgstr "删除策略:%{policy}"
msgid "SecurityOrchestration|Description"
msgstr "æè¿°"
+msgid "SecurityOrchestration|Direct"
+msgstr "直接"
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr "ä¸å†æ˜¾ç¤ºè­¦æŠ¥"
@@ -33764,11 +34329,17 @@ msgstr "å¯ç”¨"
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr "强制此项目的安全性。 %{linkStart}更多信æ¯ã€‚%{linkEnd}"
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr "加载集群代ç†å¤±è´¥ã€‚"
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr "如果任何扫æ器在针对主分支的开放åˆå¹¶è¯·æ±‚中å‘现新检测的严é‡æ¼æ´žï¼Œç„¶åŽéœ€è¦ä»»ä½• App security æˆå‘˜çš„两次批准。"
+msgid "SecurityOrchestration|Inherited"
+msgstr "继承"
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
-msgstr ""
+msgstr "继承自 %{namespace}"
msgid "SecurityOrchestration|Invalid policy type"
msgstr "无效的策略类型"
@@ -33863,9 +34434,6 @@ msgstr "扫æ执行策略åªèƒ½ç”±é¡¹ç›®æ‰€æœ‰è€…创建。"
msgid "SecurityOrchestration|Scan execution policy"
msgstr "扫æ执行策略"
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr "扫æ执行策略å…许创建在特定时间强制对特定分支进行安全扫æ的规则。支æŒçš„类型是 SASTã€DASTã€Secret 检测ã€å®¹å™¨æ‰«æã€è®¸å¯è¯æ‰«æã€API 模糊测试ã€è¦†ç›–引导模糊测试。"
-
msgid "SecurityOrchestration|Scan result"
msgstr "扫æ结果"
@@ -33909,7 +34477,7 @@ msgid "SecurityOrchestration|Sorry, your filter produced no results."
msgstr "对ä¸èµ·ï¼Œæ‚¨çš„过滤器没有产生任何结果。"
msgid "SecurityOrchestration|Source"
-msgstr ""
+msgstr "æ¥æº"
msgid "SecurityOrchestration|Status"
msgstr "状æ€"
@@ -33930,22 +34498,22 @@ msgid "SecurityOrchestration|There was a problem creating the new security polic
msgstr "创建新的安全策略时出现问题"
msgid "SecurityOrchestration|This group"
-msgstr ""
+msgstr "此群组"
msgid "SecurityOrchestration|This is a group-level policy"
-msgstr ""
+msgstr "这是一个群组级策略"
msgid "SecurityOrchestration|This is a project-level policy"
-msgstr ""
+msgstr "这是一个项目级策略"
msgid "SecurityOrchestration|This policy is inherited from %{namespace}"
-msgstr ""
+msgstr "此策略继承自 %{namespace}"
msgid "SecurityOrchestration|This policy is inherited from the %{linkStart}namespace%{linkEnd} and must be edited there"
-msgstr ""
+msgstr "此策略是从 %{linkStart}命å空间%{linkEnd} 继承的,必须在此处编辑"
msgid "SecurityOrchestration|This project"
-msgstr ""
+msgstr "此项目"
msgid "SecurityOrchestration|This project does not contain any security policies."
msgstr "此项目ä¸åŒ…å«ä»»ä½•å®‰å…¨ç­–略。"
@@ -33965,6 +34533,9 @@ msgstr "å–消链接安全项目会移除在链接的安全项目中存储的所
msgid "SecurityOrchestration|Update scan policies"
msgstr "更新扫æç­–ç•¥"
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr "使用扫æ执行策略,创建在特定时间强制对特定分支进行安全扫æ的规则。支æŒçš„类型是 SASTã€DASTã€Secret 检测ã€å®¹å™¨æ‰«æ。"
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr "使用扫æ结果策略创建规则,确ä¿åœ¨åˆå¹¶åˆå¹¶è¯·æ±‚之å‰æ£€æŸ¥å®‰å…¨é—®é¢˜ã€‚"
@@ -33989,18 +34560,6 @@ msgstr "分支"
msgid "SecurityOrchestration|branches"
msgstr "分支"
-msgid "SecurityOrchestration|members of groups"
-msgstr "群组æˆå‘˜"
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr "带有 ID 的群组æˆå‘˜"
-
-msgid "SecurityOrchestration|members of the group"
-msgstr "群组æˆå‘˜"
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr "带有 ID 的群组æˆå‘˜"
-
msgid "SecurityOrchestration|scanner finds"
msgstr "扫æ器å‘现"
@@ -34010,12 +34569,6 @@ msgstr "扫æ器å‘现"
msgid "SecurityOrchestration|the %{branches}"
msgstr "%{branches}"
-msgid "SecurityOrchestration|user with id"
-msgstr "带 ID 的用户"
-
-msgid "SecurityOrchestration|users with ids"
-msgstr "带 ID 的用户"
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr "æ¼æ´ž"
@@ -34055,6 +34608,9 @@ msgstr "更改状æ€"
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr "解æžä»¥ä¸‹å®‰å…¨æŠ¥å‘Šæ—¶æ£€æŸ¥ç”Ÿæˆçš„消æ¯ï¼Œå› ä¸ºå®ƒä»¬å¯èƒ½ä¼šé˜»æ­¢ GitLab 获å–结果。确ä¿å®‰å…¨æŠ¥å‘Šç¬¦åˆæ”¯æŒçš„ %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}。"
+msgid "SecurityReports|Cluster"
+msgstr "集群"
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "评论已添加到'%{vulnerabilityName}'"
@@ -34101,7 +34657,7 @@ msgid "SecurityReports|Ensure that %{trackingStart}issue tracking%{trackingEnd}
msgstr "请确ä¿æ­¤é¡¹ç›®å¯ç”¨%{trackingStart}议题跟踪%{trackingEnd}并且您有%{permissionsStart}æƒé™åˆ›å»ºæ–°è®®é¢˜%{permissionsEnd}。"
msgid "SecurityReports|Error fetching the vulnerabilities over time. Please check your network connection and try again."
-msgstr ""
+msgstr "获å–æ¼æ´žæ•°é‡æ—¶è¶…时。请检查您的网络连接,然åŽé‡è¯•ã€‚"
msgid "SecurityReports|Error fetching the vulnerability counts. Please check your network connection and try again."
msgstr "获å–æ¼æ´žæ•°é‡æ—¶å‡ºé”™ã€‚请检查您的网络连接,然åŽé‡è¯•ã€‚"
@@ -34188,7 +34744,7 @@ msgid "SecurityReports|Report has expired"
msgstr "报告已过期"
msgid "SecurityReports|Results show vulnerabilities introduced by the merge request, in addition to existing vulnerabilities from the latest successful pipeline in your project's default branch."
-msgstr ""
+msgstr "结果显示åˆå¹¶è¯·æ±‚引入的æ¼æ´žï¼Œæ­¤å¤–还有从您项目的默认分支中最新æˆåŠŸæµæ°´çº¿ä¸­å­˜åœ¨çš„æ¼æ´žã€‚"
msgid "SecurityReports|Scan details"
msgstr "扫æ详情"
@@ -34280,9 +34836,6 @@ msgstr "工具"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr "无法添加%{invalidProjectsMessage}: %{errorMessage}"
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr "无法添加%{invalidProjects}"
-
msgid "SecurityReports|Undo dismiss"
msgstr "å–消忽略"
@@ -34356,11 +34909,17 @@ msgid "Select Page"
msgstr "选择页é¢"
msgid "Select Profile"
-msgstr ""
+msgstr "选择个人资料"
msgid "Select a branch"
msgstr "选择分支"
+msgid "Select a branch to compare"
+msgstr "选择一个分支进行比较"
+
+msgid "Select a color"
+msgstr "选择颜色"
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr "选择适用于该项目的åˆè§„框架。 %{linkStart}这些是如何添加的?%{linkEnd}"
@@ -34475,6 +35034,9 @@ msgstr "选择æº"
msgid "Select source branch"
msgstr "选择æºåˆ†æ”¯"
+msgid "Select source project"
+msgstr "选择æºé¡¹ç›®"
+
msgid "Select start date"
msgstr "选择开始日期"
@@ -34496,6 +35058,9 @@ msgstr "选择目标分支"
msgid "Select target branch or tag"
msgstr "选择目标分支或标签"
+msgid "Select target project"
+msgstr "选择目标项目"
+
msgid "Select timezone"
msgstr "选择时区"
@@ -34509,10 +35074,10 @@ msgid "Selected commits"
msgstr "选定的æ交"
msgid "Selected for all items."
-msgstr ""
+msgstr "已选中所有项目。"
msgid "Selected for some items."
-msgstr ""
+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 "éžç®¡ç†å‘˜ç”¨æˆ·æ— æ³•ä¸ºç¾¤ç»„ã€é¡¹ç›®æˆ–代ç ç‰‡æ®µä½¿ç”¨æ‰€é€‰çº§åˆ«ã€‚如果公共级别å—到é™åˆ¶ï¼Œåˆ™ç”¨æˆ·é…置文件仅对登录用户å¯è§ã€‚"
@@ -34521,7 +35086,7 @@ msgid "Selected projects"
msgstr "选定项目"
msgid "Selected tag is already in use. Choose another option."
-msgstr ""
+msgstr "所选标签已在使用中。选择å¦ä¸€ä¸ªé€‰é¡¹ã€‚"
msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By %{link_open}@johnsmith%{link_close}\"). It will also associate and/or assign these issues and comments with the selected user."
msgstr "选择GitLab用户将在议题和评论的æ述中加入指å‘该GitLab用户的链接(例如“由%{link_open}@johnsmith%{link_close}â€)。它还将与所选用户关è”å’Œ/或分é…这些议题和评论。"
@@ -34727,9 +35292,6 @@ msgstr "设置此令牌的访问æƒé™ã€‚"
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr "将任何速率é™åˆ¶è®¾ç½®ä¸º %{code_open}0%{code_close} 以ç¦ç”¨è¯¥é™åˆ¶ã€‚"
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr "设定缺çœåŠå—é™å¯è§æ€§çº§åˆ«ã€‚é…置导入æ¥æºåŠgit访问å议。"
-
msgid "Set due date"
msgstr "设置截止日期"
@@ -34784,6 +35346,9 @@ msgstr "设置目标分支"
msgid "Set target branch to %{branch_name}."
msgstr "设置目标分支为%{branch_name}。"
+msgid "Set the Ready status"
+msgstr "设置就绪状æ€"
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr "设置此项目的默认分支。除éžæ‚¨æŒ‡å®šä¸åŒçš„分支,å¦åˆ™æ‰€æœ‰åˆå¹¶è¯·æ±‚å’Œæ交都是针对此分支进行的。"
@@ -34821,7 +35386,7 @@ msgid "Set time estimate to %{time_estimate}."
msgstr "将时间估计设置为%{time_estimate}。"
msgid "Set to 0 for no size limit."
-msgstr ""
+msgstr "设置为 0 表示没有大å°é™åˆ¶ã€‚"
msgid "Set up CI/CD"
msgstr "é…ç½® CI/CD"
@@ -34847,6 +35412,9 @@ msgstr "设置新密ç "
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "设置项目以自动推é€å’Œ/或从å¦ä¸€ä¸ªä»“库中æå–更改。分支,标签和æ交将自动åŒæ­¥ã€‚"
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr "设置项目内容的å¯è§æ€§ã€‚é…置导入æºå’Œ Git 访问å议。"
+
msgid "Set weight"
msgstr "设置æƒé‡"
@@ -35109,8 +35677,65 @@ msgstr "显示主题"
msgid "Show whitespace changes"
msgstr "显示空白å˜æ›´å†…容"
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr "访问æ¼æ´žç®¡ç†çš„专用区域,包括安全仪表盘ã€æ¼æ´žæŠ¥å‘Šå’Œè®¾ç½®ã€‚"
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr "审计基于 Docker 的应用程åºã€‚扫æ您的代ç æ‰€åœ¨çš„ Docker é•œåƒä¸­çš„已知æ¼æ´žã€‚"
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr "容器扫æ"
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr "ä¾èµ–扫æ"
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr "动æ€åº”用程åºå®‰å…¨æµ‹è¯•ï¼ˆDAST)"
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr "动æ€æ£€æŸ¥æ‚¨çš„应用程åºåœ¨å·²éƒ¨ç½²çŽ¯å¢ƒä¸­æ˜¯å¦å­˜åœ¨æ¼æ´žã€‚"
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr "å¯ç”¨ SAST"
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr "å¯ç”¨ Secret 检测"
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr "å¯ç”¨é™æ€åº”用安全测试(SAST)"
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr "了解您的外部库是å¦å®‰å…¨ã€‚è¿è¡Œä¾èµ–扫æ作业,检查您外部库中的已知æ¼æ´žã€‚"
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr "ç«‹å³è¯†åˆ«ä»£ç ä¸­çš„æ¼æ´ž"
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr "扫æ您的代ç ï¼Œæ£€æµ‹æ— æ„æ交的 secrets,例如密钥ã€å¯†ç å’Œ API 令牌。"
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr "在部署å‰ä½¿ç”¨ CI/CD 扫æ您的æºä»£ç å’Œæš´éœ²æ¼æ´žã€‚"
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr "开始å…费的 30 天 旗舰版试用或å‡çº§æ‚¨çš„实例,访问组织范围的安全性和åˆè§„性功能。查看旗舰版方案的其他功能。"
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr "开始å…费试用"
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr "让您的安全更上一层楼"
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr "ç«‹å³å‡çº§"
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr "使用 CI/CD 分æžæ‚¨çš„æºä»£ç ä¸­çš„已知æ¼æ´žã€‚比较æºåˆ†æ”¯å’Œç›®æ ‡åˆ†æ”¯ä¹‹é—´å‘现的æ¼æ´žã€‚"
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr "æ¼æ´žç®¡ç†"
+
msgid "Showing %{conflict}"
-msgstr ""
+msgstr "显示 %{conflict}"
msgid "Showing %{count} of %{total} projects"
msgstr "显示%{count}个项目,共计%{total} 个"
@@ -35131,9 +35756,6 @@ msgstr "显示所有å²è¯—"
msgid "Showing all issues"
msgstr "已显示全部议题"
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr "显示群组 “%{group_name}†从 2019 å¹´ 11 月 1 日到 2019 å¹´ 12 月 31 日的数æ®"
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr "显示在此日期范围内创建的工作æµäº‹é¡¹çš„æ•°æ®ã€‚日期范围最多 %{maxDateRange} 天。"
@@ -35149,6 +35771,9 @@ msgstr "显示最新版本"
msgid "Showing version #%{versionNumber}"
msgstr "显示版本#%{versionNumber}"
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr "为群组 “%{group_name}†显示从 2019 年 11 月 1 日到 2019 年 12 月 31 日的议题和 %{labels_count} 个标记"
+
msgid "Side-by-side"
msgstr "并排"
@@ -35336,10 +35961,10 @@ msgid "SlackIntegration|Are you sure you want to remove this project from the Sl
msgstr "您确定è¦ä»Ž Slack 应用程åºä¸­åˆ é™¤æ­¤é¡¹ç›®å—?"
msgid "SlackIntegration|Client ID"
-msgstr ""
+msgstr "客户端 ID"
msgid "SlackIntegration|Client secret"
-msgstr ""
+msgstr "客户端 secret"
msgid "SlackIntegration|GitLab for Slack"
msgstr "GitLab for Slack"
@@ -35348,19 +35973,19 @@ msgid "SlackIntegration|GitLab for Slack was successfully installed."
msgstr "GitLab for Slack å·²æˆåŠŸå®‰è£…。"
msgid "SlackIntegration|Install Slack app"
-msgstr ""
+msgstr "安装 Slack 应用程åº"
msgid "SlackIntegration|Project alias"
msgstr "项目别å"
msgid "SlackIntegration|Reinstall Slack app"
-msgstr ""
+msgstr "é‡æ–°å®‰è£… Slack 应用程åº"
msgid "SlackIntegration|Remove project"
msgstr "删除项目"
msgid "SlackIntegration|See the list of available commands in Slack after setting up this integration by entering"
-msgstr ""
+msgstr "设置此集æˆåŽï¼Œè¯·è¾“入以下内容,查看 Slack 中å¯ç”¨å‘½ä»¤çš„列表:"
msgid "SlackIntegration|Select a GitLab project to link with your Slack workspace."
msgstr "选择一个è¦è¿žæŽ¥åˆ°ä½ çš„ Slack 工作区的项目。"
@@ -35369,22 +35994,22 @@ msgid "SlackIntegration|Sends notifications about project events to Slack channe
msgstr "å‘ Slack 频é“å‘é€æœ‰å…³é¡¹ç›®äº‹ä»¶çš„通知。"
msgid "SlackIntegration|Signing secret"
-msgstr ""
+msgstr "ç­¾å secret"
msgid "SlackIntegration|Team name"
msgstr "团队å称"
msgid "SlackIntegration|This integration allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr ""
+msgstr "此集æˆå…许用户通过在 Slack 中输入指令æ¥å¯¹è¯¥é¡¹ç›®æ‰§è¡Œå¸¸ç”¨æ“作。"
msgid "SlackIntegration|Verification token"
-msgstr ""
+msgstr "验è¯ä»¤ç‰Œ"
msgid "SlackIntegration|You can now close this window and go to your Slack workspace."
msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£å¹¶è½¬åˆ°æ‚¨çš„ Slack 工作区。"
msgid "SlackIntegration|You may need to reinstall the Slack application when we %{linkStart}make updates or change permissions%{linkEnd}."
-msgstr ""
+msgstr "%{linkStart}更新或更改æƒé™%{linkEnd}时,您å¯èƒ½éœ€è¦é‡æ–°å®‰è£… Slack 应用程åºã€‚"
msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr "1. %{slash_command_link_start}在您的Slack团队中使用此信æ¯æ·»åŠ ä¸€ä¸ªæ–œæ å‘½ä»¤%{slash_command_link_end}:"
@@ -35465,11 +36090,14 @@ msgid "Snippets|Optionally add a description about what your snippet does or how
msgstr "å¯é€‰æ·»åŠ æ述你的代ç ç‰‡æ®µåšä»€ä¹ˆæˆ–如何使用它…"
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
-msgstr ""
+msgstr "代ç ç‰‡æ®µä¸èƒ½åŒ…å«ç©ºæ–‡ä»¶ã€‚ç¡®ä¿æ‰€æœ‰æ–‡ä»¶éƒ½åŒ…å«å†…容,或删除。"
msgid "Snowplow"
msgstr "Snowplow"
+msgid "Solid"
+msgstr "实心"
+
msgid "Solution"
msgstr "解决方案"
@@ -35665,9 +36293,6 @@ msgstr "自动更新订阅时出了错。"
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "å°†%{project} 添加到仪表æ¿æ—¶å‡ºé”™"
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr "出错了,无法将项目添加到仪表æ¿"
-
msgid "Something went wrong, unable to delete project"
msgstr "å‘生错误,无法删除项目"
@@ -35987,7 +36612,7 @@ msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "无法使用指定的URL:“%{reason}â€"
msgid "Specify IP ranges that are always allowed for inbound traffic, for use with group-level IP restrictions. Runner and Pages daemon internal IPs should be listed here so that they can access project artifacts."
-msgstr ""
+msgstr "指定始终å…许入站æµé‡çš„ IP 范围,用于群组级 IP é™åˆ¶ã€‚应在此处列出 Runner å’Œ Pages 守护进程内部 IP,以便它们å¯ä»¥è®¿é—®é¡¹ç›®äº§ç‰©ã€‚"
msgid "Specify an email address regex pattern to identify default internal users."
msgstr "指定电å­é‚®ä»¶åœ°å€æ­£åˆ™è¡¨è¾¾å¼æ¨¡å¼ä»¥æ ‡è¯†é»˜è®¤å†…部用户。"
@@ -35995,7 +36620,7 @@ msgstr "指定电å­é‚®ä»¶åœ°å€æ­£åˆ™è¡¨è¾¾å¼æ¨¡å¼ä»¥æ ‡è¯†é»˜è®¤å†…部用户
msgid "Speed up your pipelines with Needs relationships"
msgstr "通过Needs关系加速您的æµæ°´çº¿"
-msgid "Spent At"
+msgid "Spent at"
msgstr "花费在"
msgid "Squash commit message"
@@ -36014,7 +36639,7 @@ msgid "Stage"
msgstr "阶段"
msgid "Stage:"
-msgstr ""
+msgstr "阶段:"
msgid "Standard"
msgstr "标准"
@@ -36092,7 +36717,7 @@ msgid "Start inputting changes and we will generate a YAML-file for you to add t
msgstr "开始输入更改,我们将生æˆä¸€ä¸ª YAML 文件供您添加到您的仓库"
msgid "Start internal thread"
-msgstr ""
+msgstr "å¼€å¯å†…部主题"
msgid "Start merge train"
msgstr "å¯åŠ¨åˆå¹¶é˜Ÿåˆ—"
@@ -36340,6 +36965,9 @@ msgstr "存储:"
msgid "StorageSize|Unknown"
msgstr "未知"
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr "存放您的文件ã€è§„划您的工作ã€å作编写代ç ç­‰ç­‰ã€‚"
+
msgid "Strikethrough"
msgstr "删除线"
@@ -36347,7 +36975,7 @@ msgid "Strikethrough text"
msgstr "删除线文本"
msgid "Sub-batch size"
-msgstr ""
+msgstr "å­æ‰¹æ¬¡å¤§å°"
msgid "Subdomains of the Pages root domain %{root_domain} are reserved and cannot be used as custom Pages domains."
msgstr "Pages 根域å %{root_domain} çš„å­åŸŸå被ä¿ç•™ï¼Œä¸èƒ½ä½œä¸ºè‡ªå®šä¹‰ Pages 域å。"
@@ -36361,8 +36989,8 @@ msgstr "å­ç¾¤ç»„里程碑"
msgid "Subgroup navigation"
msgstr "å­ç»„导航"
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr "å…许创建å­ç¾¤ç»„"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
+msgstr "å…许创建å­ç»„的角色"
msgid "SubgroupCreationlevel|Allowed to create subgroups"
msgstr "å…许创建å­ç¾¤ç»„"
@@ -36379,6 +37007,9 @@ msgstr "å­ç¾¤ç»„"
msgid "Subgroups and projects"
msgstr "å­ç»„和项目"
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr "å­ç»„å¯ä»¥è®¾ç½®è‡ªå·±çš„åŒé‡èº«ä»½è®¤è¯è§„则"
+
msgid "Subject Key Identifier:"
msgstr "主题密钥标识符:"
@@ -36442,6 +37073,9 @@ msgstr "已订阅此项目"
msgid "Subscribes to this %{quick_action_target}."
msgstr "订阅%{quick_action_target}。"
+msgid "Subscript"
+msgstr "下标"
+
msgid "Subscription"
msgstr "订阅"
@@ -36470,7 +37104,7 @@ msgid "SubscriptionBanner|Export license usage file"
msgstr "导出许å¯è¯ä½¿ç”¨æ–‡ä»¶"
msgid "SubscriptionBanner|Upload new license"
-msgstr ""
+msgstr "上传新许å¯è¯"
msgid "SubscriptionTable|Add seats"
msgstr "添加席ä½"
@@ -36695,7 +37329,7 @@ msgid "SuggestedColors|Gray"
msgstr "ç°è‰²"
msgid "SuggestedColors|Green"
-msgstr ""
+msgstr "绿色"
msgid "SuggestedColors|Green screen"
msgstr "绿å±"
@@ -36716,7 +37350,7 @@ msgid "SuggestedColors|Orange"
msgstr "橙色"
msgid "SuggestedColors|Purple"
-msgstr ""
+msgstr "建议颜色|紫色"
msgid "SuggestedColors|Red"
msgstr "红色"
@@ -36748,8 +37382,11 @@ msgstr "测试集"
msgid "Summary"
msgstr "概览"
-msgid "Summary / Note"
-msgstr "摘è¦/注释"
+msgid "Summary / note"
+msgstr "摘è¦/备注"
+
+msgid "Summary comment (optional)"
+msgstr "摘è¦è¯„论(å¯é€‰ï¼‰"
msgid "Sunday"
msgstr "星期日"
@@ -36770,7 +37407,7 @@ msgid "SuperSonics|Buy subscription"
msgstr "购买订阅"
msgid "SuperSonics|Cannot activate instance due to a connectivity issue."
-msgstr ""
+msgstr "由于连接问题,无法激活实例。"
msgid "SuperSonics|Cloud licensing"
msgstr "云授æƒ"
@@ -36851,7 +37488,7 @@ msgid "SuperSonics|This is the number of %{billableUsersLinkStart}billable users
msgstr "这是 %{billableUsersLinkStart}计费用户%{billableUsersLinkEnd} çš„æ•°é‡ï¼Œä¹Ÿæ˜¯æ‚¨ç»­è®¢è®¸å¯è¯æ—¶éœ€è¦è´­ä¹°çš„最å°æ•°é‡ã€‚"
msgid "SuperSonics|To activate your subscription, your instance needs to connect to GitLab. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}."
-msgstr ""
+msgstr "è¦æ¿€æ´»æ‚¨çš„订阅,您的实例需è¦è¿žæŽ¥åˆ° GitLab。%{learnMoreLinkStart}了解更多%{learnMoreLinkEnd}。"
msgid "SuperSonics|User in subscription"
msgid_plural "SuperSonics|Users in subscription"
@@ -36867,7 +37504,7 @@ msgid "SuperSonics|Users with a Guest role or those who don't belong to a Projec
msgstr "具有访客角色的用户或ä¸å±žäºŽé¡¹ç›®æˆ–组的用户将ä¸ä¼šä½¿ç”¨æ‚¨çš„许å¯è¯ä¸­çš„席ä½ã€‚"
msgid "SuperSonics|You can %{purchaseSubscriptionLinkStart}purchase a new subscription%{purchaseSubscriptionLinkEnd} and try again. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
-msgstr ""
+msgstr "您å¯ä»¥%{purchaseSubscriptionLinkStart}购买新订阅%{purchaseSubscriptionLinkEnd}并é‡è¯•ã€‚如果您需è¦æ›´å¤šå¸®åŠ©ï¼Œè¯·%{supportLinkStart}è”系技术支æŒ%{supportLinkEnd}。"
msgid "SuperSonics|You can no longer sync your subscription details with GitLab. Get help for the most common connectivity issues by %{connectivityHelpLinkStart}troubleshooting the activation code%{connectivityHelpLinkEnd}."
msgstr "您无法å†å°†è®¢é˜…详细信æ¯ä¸Ž GitLab åŒæ­¥ã€‚ %{connectivityHelpLinkStart}通过对激活ç è¿›è¡Œæ•…障排除%{connectivityHelpLinkEnd},获å–有关最常è§è¿žæŽ¥é—®é¢˜çš„帮助。"
@@ -36903,7 +37540,7 @@ msgid "SuperSonics|Your subscription details will sync shortly."
msgstr "您的订阅信æ¯å°†å¾ˆå¿«åŒæ­¥"
msgid "SuperSonics|Your subscription is expired."
-msgstr ""
+msgstr "您的订阅已过期。"
msgid "SuperSonics|Your subscription was successfully activated. You can see the details below."
msgstr "您的订阅已æˆåŠŸæ¿€æ´»ã€‚您å¯ä»¥åœ¨ä¸‹é¢æŸ¥çœ‹è¯¦ç»†ä¿¡æ¯ã€‚"
@@ -36917,6 +37554,9 @@ msgstr "未æ¥çš„订阅"
msgid "SuperSonics|past subscriptions"
msgstr "以å‰çš„订阅"
+msgid "Superscript"
+msgstr "上标"
+
msgid "Support"
msgstr "支æŒ"
@@ -36929,6 +37569,21 @@ msgstr "支æŒé¡µé¢ç½‘å€"
msgid "Survey Response"
msgstr "é—®å·è°ƒæŸ¥ç­”å¤"
+msgid "Surveys|Delighted"
+msgstr "高兴"
+
+msgid "Surveys|Happy"
+msgstr "开心"
+
+msgid "Surveys|Neutral"
+msgstr "一般"
+
+msgid "Surveys|Sad"
+msgstr "难过"
+
+msgid "Surveys|Unhappy"
+msgstr "ä¸å¼€å¿ƒ"
+
msgid "Switch Branches"
msgstr "切æ¢åˆ†æ”¯"
@@ -37004,9 +37659,6 @@ msgstr "系统默认值(%{default})"
msgid "System header and footer"
msgstr "系统页头和页脚"
-msgid "System hook was successfully updated."
-msgstr "系统钩å­å·²æˆåŠŸæ›´æ–°ã€‚"
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr "系统钩å­æ˜¯åœ¨ä¸€ç³»åˆ—事件上触å‘的,例如创建项目或添加 SSH 密钥。您还å¯ä»¥å¯ç”¨é¢å¤–的触å‘器,例如推é€äº‹ä»¶ã€‚"
@@ -37035,7 +37687,7 @@ msgid "Tag name"
msgstr "标签å称"
msgid "Tag name is required."
-msgstr ""
+msgstr "标签å称为必填项。"
msgid "Tag push"
msgstr "标签推é€"
@@ -37074,7 +37726,7 @@ msgid "Tags:"
msgstr "标签:"
msgid "TagsPage|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this tag."
-msgstr ""
+msgstr "确认并选择 %{strongStart}%{buttonText} åŽ%{strongEnd},您无法æ¢å¤æ­¤æ ‡ç­¾ã€‚"
msgid "TagsPage|Browse commits"
msgstr "æµè§ˆæ交"
@@ -37089,25 +37741,25 @@ msgid "TagsPage|Cancel"
msgstr "å–消"
msgid "TagsPage|Cancel, keep tag"
-msgstr ""
+msgstr "å–消,ä¿ç•™æ ‡ç­¾"
msgid "TagsPage|Create tag"
msgstr "创建标签"
msgid "TagsPage|Delete protected tag"
-msgstr ""
+msgstr "删除å—ä¿æŠ¤çš„标签"
msgid "TagsPage|Delete protected tag. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "删除å—ä¿æŠ¤çš„标签。您ç»å¯¹ç¡®å®šå—?"
msgid "TagsPage|Delete tag"
msgstr "删除标签"
msgid "TagsPage|Delete tag. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "删除标签。您ç»å¯¹ç¡®å®šå—?"
msgid "TagsPage|Deleting the %{strongStart}%{tagName}%{strongEnd} tag cannot be undone. Are you sure?"
-msgstr ""
+msgstr "删除 %{strongStart}%{tagName}%{strongEnd} 标记无法撤消。您确定å—?"
msgid "TagsPage|Edit release notes"
msgstr "编辑å‘行说明"
@@ -37125,7 +37777,7 @@ msgid "TagsPage|New tag"
msgstr "新建标签"
msgid "TagsPage|Only a project maintainer or owner can delete a protected tag"
-msgstr ""
+msgstr "åªæœ‰é¡¹ç›®ç»´æŠ¤è€…或所有者æ‰èƒ½åˆ é™¤å—ä¿æŠ¤çš„标签"
msgid "TagsPage|Optionally, add a message to the tag. Leaving this blank creates a %{link_start}lightweight tag.%{link_end}"
msgstr "也å¯ä»¥æ·»åŠ æ¶ˆæ¯åˆ°æ ‡ç­¾ã€‚ä¿ç•™ç©ºç™½åˆ™åˆ›å»º %{link_start}è½»é‡æ ‡ç­¾%{link_end}。"
@@ -37134,7 +37786,7 @@ msgid "TagsPage|Optionally, create a public Release of your project, based on th
msgstr "å¯é€‰ï¼ŒåŸºäºŽæ­¤æ ‡ç­¾åˆ›å»ºé¡¹ç›®å…¬å¼€å‘布。 å‘布说明会显示在%{releases_page_link_start}å‘布%{link_end}页é¢ã€‚ %{docs_link_start}更多信æ¯%{link_end}"
msgid "TagsPage|Please type the following to confirm:"
-msgstr ""
+msgstr "请输入以下内容进行确认:"
msgid "TagsPage|Release notes"
msgstr "å‘行说明"
@@ -37164,16 +37816,16 @@ msgid "TagsPage|Write your release notes or drag files here…"
msgstr "编写å‘行说明(Release Notes)或将文件拖动到此处..."
msgid "TagsPage|Yes, delete protected tag"
-msgstr ""
+msgstr "是,删除å—ä¿æŠ¤çš„标签"
msgid "TagsPage|Yes, delete tag"
-msgstr ""
+msgstr "是,删除标签"
msgid "TagsPage|You're about to permanently delete the protected tag %{strongStart}%{tagName}.%{strongEnd}"
-msgstr ""
+msgstr "您将è¦æ°¸ä¹…删除å—ä¿æŠ¤çš„标签 %{strongStart}%{tagName}%{strongEnd}"
msgid "TagsPage|You're about to permanently delete the tag %{strongStart}%{tagName}.%{strongEnd}"
-msgstr ""
+msgstr "您将è¦æ°¸ä¹…删除标签 %{strongStart}%{tagName}。%{strongEnd}"
msgid "TagsPage|protected"
msgstr "å·²ä¿æŠ¤"
@@ -37205,11 +37857,17 @@ msgstr "任务"
msgid "Task ID: %{elastic_task}"
msgstr "任务ID: %{elastic_task}"
+msgid "Task list"
+msgstr "任务列表"
+
+msgid "Task with ID: %{id} could not be found."
+msgstr "无法找到 ID 为 %{id} 的任务。"
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr "创建/导入代ç åˆ°é¡¹ç›®ï¼ˆä»“库)"
msgid "TasksToBeDone|Create/import issues (tickets) to collaborate on ideas and plan work"
-msgstr "创建/导议题(工å•ï¼‰ä»¥å作想法和规划工作"
+msgstr "创建/导入议题(工å•ï¼‰ï¼Œå作想法和规划工作"
msgid "TasksToBeDone|Set up CI/CD pipelines to build, test, deploy, and monitor code"
msgstr "设置 CI/CD æµæ°´çº¿æ¥æž„建ã€æµ‹è¯•ã€éƒ¨ç½²å’Œç›‘视代ç "
@@ -37336,13 +37994,13 @@ msgid "Terraform|Cancel"
msgstr "å–消"
msgid "Terraform|Cannot remove a locked state"
-msgstr ""
+msgstr "无法删除é”定的状æ€"
msgid "Terraform|Copy Terraform init command"
msgstr "å¤åˆ¶ Terraform init 命令"
msgid "Terraform|Deletion in progress"
-msgstr ""
+msgstr "正在删除"
msgid "Terraform|Details"
msgstr "详细信æ¯"
@@ -37390,7 +38048,7 @@ msgid "Terraform|Remove state file and versions"
msgstr "删除状æ€æ–‡ä»¶å’Œç‰ˆæœ¬"
msgid "Terraform|Removed"
-msgstr ""
+msgstr "已删除"
msgid "Terraform|Removing"
msgstr "正在删除"
@@ -37438,7 +38096,7 @@ msgid "Terraform|You are about to remove the state file %{name}. This will perma
msgstr "您将è¦åˆ é™¤ state 文件 %{name}。这将永久删除所有 State 版本和历å²è®°å½•ã€‚之å‰é…置的基础架构将ä¿æŒä¸å˜ï¼Œå¹¶ä¸”åªä¼šåˆ é™¤åŒ…å«æ‰€æœ‰ç‰ˆæœ¬çš„ state 文件。此æ“作无法撤消。"
msgid "Terraform|You have insufficient permissions to delete this state"
-msgstr ""
+msgstr "您没有足够的æƒé™åˆ é™¤æ­¤çŠ¶æ€"
msgid "Terraform|Your project doesn't have any Terraform state files"
msgstr "您的项目没有任何Terraform state文件"
@@ -37547,8 +38205,11 @@ msgstr "%{rate}%{sign}æˆåŠŸçŽ‡"
msgid "TestReports|Attachment"
msgstr "附件"
+msgid "TestReports|Copy test name to rerun locally"
+msgstr "å¤åˆ¶æµ‹è¯•æŠ¥å‘Šå称到本地é‡æ–°è¿è¡Œ"
+
msgid "TestReports|Job artifacts are expired"
-msgstr ""
+msgstr "作业产物已过期"
msgid "TestReports|Jobs"
msgstr "作业"
@@ -37563,7 +38224,7 @@ msgid "TestReports|No test cases were found in the test report."
msgstr "在测试报告中没有找到测试用例。"
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "测试报告需è¦äº§ç‰©ï¼Œä½†æ‰€æœ‰äº§ç‰©å·²è¿‡æœŸã€‚%{linkStart}了解更多%{linkEnd}"
msgid "TestReports|Tests"
msgstr "测试"
@@ -37625,9 +38286,6 @@ msgstr "好的,我ä¸å¸Œæœ›ç»­çº¦"
msgid "That's it, well done!"
msgstr "就是这样,åšå¾—好ï¼"
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr "群组“%{group_path}â€å…许您使用SSO以登录å¸æˆ·"
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr "%{link_start}校准模å¼%{link_end}å…许有é¢å¤–用户,这些é¢å¤–用户在更新订阅时将会产生追溯费用。"
@@ -37705,7 +38363,7 @@ msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr "由于存在åˆå¹¶å†²çªï¼Œå¯¹æ¯”视图å¯èƒ½ä¸å‡†ç¡®ã€‚"
msgid "The complete DevOps platform. One application with endless possibilities. Organizations rely on GitLab’s source code management, CI/CD, security, and more to deliver software rapidly."
-msgstr ""
+msgstr "完整的 DevOps å¹³å°ã€‚一个具有无é™å¯èƒ½æ€§çš„应用程åºã€‚组织ä¾é æºä»£ç ç®¡ç†ï¼ŒCI/CD,安全,以åŠæ›´å¤šæ¥å¿«é€Ÿäº¤ä»˜è½¯ä»¶ã€‚"
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr "åˆè§„报告显示åˆå¹¶è¯·æ±‚在å—ä¿æŠ¤çš„环境中åˆå¹¶ã€‚"
@@ -37735,7 +38393,7 @@ msgid "The current epic"
msgstr "当å‰å²è¯—"
msgid "The current incident"
-msgstr ""
+msgstr "当å‰äº‹ä»¶"
msgid "The current issue"
msgstr "当å‰è®®é¢˜"
@@ -37749,6 +38407,9 @@ msgstr "æ­¤æµæ°´çº¿ä¸­çš„æ•°æ®å¤ªæ—§ï¼Œæ— æ³•å‘ˆçŽ°ä¸ºå›¾å½¢ã€‚请检查作业
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "æ•°æ®æºå·²è¿žæŽ¥ï¼Œä½†æ²¡æœ‰å¯æ˜¾ç¤ºçš„æ•°æ®ã€‚ %{documentationLink}"
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr "å‘布准备就绪的日期。具有未æ¥æ—¥æœŸçš„版本被标记为%{linkStart}å³å°†åˆ°æ¥çš„å‘布%{linkEnd}。"
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr "新项目的默认 CI/CD é…置文件和路径。"
@@ -37773,8 +38434,8 @@ msgstr "您输入的域åä¸è¢«å…许。"
msgid "The download link will expire in 24 hours."
msgstr "下载链接将于24å°æ—¶åŽè¿‡æœŸã€‚"
-msgid "The environment tier must be one of %{environment_tiers}."
-msgstr "环境级别必须是%{environment_tiers}之一。"
+msgid "The environment tiers must be from %{environment_tiers}."
+msgstr "环境级别必须æ¥è‡ª %{environment_tiers}。"
msgid "The errors we encountered were:"
msgstr "我们é‡åˆ°çš„错误是:"
@@ -37824,7 +38485,7 @@ msgstr "派生关系已被删除。"
msgid "The form contains the following error:"
msgid_plural "The form contains the following errors:"
-msgstr[0] ""
+msgstr[0] "表å•åŒ…å«ä»¥ä¸‹é”™è¯¯ï¼š"
msgid "The form contains the following warning:"
msgstr "该表格包å«ä»¥ä¸‹è­¦å‘Šï¼š"
@@ -37887,7 +38548,7 @@ msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr "该问题被æˆåŠŸæå‡ä¸ºå²è¯—。é‡å®šå‘到å²è¯—..."
msgid "The last owner cannot be set to awaiting"
-msgstr ""
+msgstr "最åŽä¸€ä¸ªæ‰€æœ‰è€…ä¸èƒ½è®¾ç½®ä¸ºç­‰å¾…"
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr "将存储由最近æˆåŠŸæµæ°´çº¿ä¸­çš„作业创建的最新产物。"
@@ -37925,6 +38586,9 @@ msgstr "您上传的许å¯è¯æ— æ•ˆã€‚如果问题ä»ç„¶å­˜åœ¨ï¼Œè¯·é€šè¿‡ %{lin
msgid "The list creation wizard is already open"
msgstr "列表创建å‘导已打开"
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr "强制用户必须设置åŒé‡èº«ä»½éªŒè¯ä¹‹å‰çš„最长时间。"
+
msgid "The maximum file size allowed is %{size}."
msgstr "å…许的最大文件大å°ä¸º %{size}。"
@@ -37967,9 +38631,6 @@ msgstr "Jenkins 项目的å称。将 URL 末尾的å称å¤åˆ¶åˆ°é¡¹ç›®ä¸­ã€‚"
msgid "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"
msgstr "克隆仓库时è¦ä»Ž GitLab 获å–的更改数é‡ï¼Œè¾ƒä½Žçš„值å¯ä»¥åŠ é€Ÿæµæ°´çº¿æ‰§è¡Œã€‚ 设置为 %{code_open}0%{code_close} 或空白以获å–æ¯ä¸ªä½œä¸šçš„所有分支和标签"
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr "æ¯æœˆåˆå¹¶çš„åˆå¹¶è¯·æ±‚æ•°"
@@ -38000,26 +38661,17 @@ msgstr "æµæ°´çº¿è®¡åˆ’会在特定分支或标签上自动定期è¿è¡Œæµæ°´çº¿
msgid "The project can be accessed by any logged in user except external users."
msgstr "除外部用户外,任何登录用户å‡å¯è®¿é—®è¯¥é¡¹ç›®ã€‚"
-msgid "The project can be accessed by any user who is logged in."
-msgstr "任何登录的用户都å¯ä»¥è®¿é—®è¯¥é¡¹ç›®ã€‚"
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr "任何人都å¯ä»¥è®¿é—®è¯¥é¡¹ç›®ï¼Œä¸è®ºç”¨æˆ·æ˜¯å¦è®¤è¯ã€‚"
-
msgid "The project can be accessed without any authentication."
msgstr "该项目å…许任何人访问。"
msgid "The project has already been added to your dashboard."
msgstr "此项目已被添加到您的仪表æ¿ã€‚"
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr "项目åªèƒ½ç”±é¡¹ç›®æˆå‘˜è®¿é—®ã€‚必须明确地å‘æ¯ä¸ªç”¨æˆ·æŽˆäºˆè®¿é—®æƒé™ã€‚"
-
msgid "The project is still being deleted. Please try again later."
msgstr "该项目ä»åœ¨åˆ é™¤ä¸­ã€‚请ç¨åŽå†è¯•ã€‚"
msgid "The project size exceeds the export limit."
-msgstr ""
+msgstr "项目大å°è¶…过导出é™åˆ¶ã€‚"
msgid "The project was successfully forked."
msgstr "该项目æˆåŠŸæ´¾ç”Ÿã€‚"
@@ -38228,6 +38880,9 @@ msgstr "还没有包"
msgid "There are no projects shared with this group yet"
msgstr "当å‰å°šæ— åˆ†äº«ç»™è¯¥ç¾¤ç»„的项目"
+msgid "There are no secure files yet."
+msgstr "尚无安全文件。"
+
msgid "There are no topics to show."
msgstr "没有è¦æ˜¾ç¤ºçš„主题。"
@@ -38262,7 +38917,7 @@ msgid "There is no data available. Please change your selection."
msgstr "没有å¯ç”¨æ•°æ®ã€‚请更改选择。"
msgid "There is no seat left to activate the member"
-msgstr ""
+msgstr "没有剩余的席ä½å¯ä»¥å¯ç”¨æˆå‘˜"
msgid "There is no table data available."
msgstr "没有å¯ç”¨çš„表数æ®ã€‚"
@@ -38273,6 +38928,12 @@ msgstr "æ•°æ®å¤ªå¤šæ— æ³•è®¡ç®—。请更改您的选择。"
msgid "There was a problem communicating with your device."
msgstr "与您的设备通信时出现问题。"
+msgid "There was a problem fetching CRM contacts."
+msgstr "èŽ·å– CRM è”系人时出错。"
+
+msgid "There was a problem fetching CRM organizations."
+msgstr "èŽ·å– CRM 组织时出错。"
+
msgid "There was a problem fetching branches."
msgstr "获å–分支时出现问题。"
@@ -38661,10 +39322,10 @@ msgid "This domain is not verified. You will need to verify ownership before acc
msgstr "此域å未ç»è¿‡éªŒè¯ã€‚在å¯ç”¨è®¿é—®æƒé™ä¹‹å‰ï¼Œæ‚¨éœ€è¦éªŒè¯æ‰€æœ‰æƒã€‚"
msgid "This email supersedes any previous emails about scheduled deletion you may have received for %{project_link}."
-msgstr ""
+msgstr "此电å­é‚®ä»¶å–代了以å‰ä»»ä½•æ‚¨å¯èƒ½å·²ç»æ”¶åˆ°çš„ %{project_link} 计划删除的电å­é‚®ä»¶ã€‚"
msgid "This email supersedes any previous emails about scheduled deletion you may have received for %{project_name}."
-msgstr ""
+msgstr "此电å­é‚®ä»¶å–代了以å‰ä»»ä½•æ‚¨å¯èƒ½å·²ç»æ”¶åˆ°çš„ %{project_name} 计划删除的电å­é‚®ä»¶ã€‚"
msgid "This endpoint has been requested too many times. Try again later."
msgstr "此端点请求次数过多。请ç¨åŽå†è¯•ã€‚"
@@ -38897,9 +39558,6 @@ msgstr "作业需手动æ“作"
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr "此作业需è¦æ‰‹åŠ¨å¹²é¢„æ‰èƒ½å¼€å§‹ã€‚在å¯åŠ¨æ¬¡ä½œä¸šä¹‹å‰ï¼Œæ‚¨å¯ä»¥åœ¨ä¸‹é¢æ·»åŠ å˜é‡ï¼Œè¿›è¡Œæœ€åŽæ—¶åˆ»çš„é…置更改。"
-msgid "This job triggers a downstream pipeline"
-msgstr "此作业触å‘下游æµæ°´çº¿"
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "该作业将在计时器完æˆåŽè‡ªåŠ¨è¿è¡Œã€‚它们通常用于生产环境的增é‡éƒ¨ç½²ã€‚未计划时,它会转æ¢ä¸ºæ‰‹åŠ¨æ“作。"
@@ -39017,7 +39675,7 @@ msgstr "此项目将于 %{date} 删除"
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
msgstr "此项目将于 %{date} 删除,因为它的父组 '%{parent_group_name}'已计划删除。"
-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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr "该项目将存在于您的群组%{strong_open}%{namespace}%{strong_close}中。在项目中,您å¯ä»¥å­˜æ”¾æ–‡ä»¶(仓库),计划工作(议题),å‘布文档(Wiki)等等。"
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr "æ­¤Runner仅在å—ä¿æŠ¤åˆ†æ”¯ä¸Šè§¦å‘çš„æµæ°´çº¿ä¸Šè¿è¡Œ"
msgid "This setting can be overridden in each project."
msgstr "当å‰è®¾ç½®å¯åœ¨æ¯ä¸ªé¡¹ç›®ä¸­è¿›è¡Œæ›´æ”¹è¦†ç›–。"
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr "此设置已在实例级别é…置,ä¸èƒ½æŒ‰ç¾¤ç»„覆盖"
+
msgid "This setting is allowed for forked projects only"
msgstr "此设置仅适用于派生项目"
@@ -39063,7 +39724,7 @@ msgid "This user has an unconfirmed email address. You may force a confirmation.
msgstr "此用户有一个未ç»ç¡®è®¤çš„电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å¼ºåˆ¶ç¡®è®¤ã€‚"
msgid "This user has no active %{accessTokenTypePlural}."
-msgstr ""
+msgstr "此用户没有有效的%{accessTokenTypePlural}。"
msgid "This user has no active %{type}."
msgstr "此用户没有有效的%{type}。"
@@ -39092,9 +39753,6 @@ msgstr "这会使您注册的应用程åºå’Œ U2F / WebAuthn 设备无效。"
msgid "This will invalidate your registered applications and U2F devices."
msgstr "这将使您的注册应用程åºå’Œ U2F 设备无效。"
-msgid "This will redirect you to an external sign in page."
-msgstr "这会将您é‡å®šå‘到外部登录页é¢ã€‚"
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr "这将删除该项目和%{fork_source}之间的派生关系。"
@@ -39125,9 +39783,6 @@ msgstr "时间"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr "å…许用户跳过强制é…ç½®åŒé‡è®¤è¯çš„时间(以å°æ—¶ä¸ºå•ä½ï¼‰"
-msgid "Time Spent"
-msgstr "耗时"
-
msgid "Time based: Yes"
msgstr "基于时间:是"
@@ -39137,9 +39792,6 @@ msgstr "议题被列入日程表的时间"
msgid "Time before an issue starts implementation"
msgstr "开始进行编ç å‰çš„时间"
-msgid "Time before enforced"
-msgstr "宽容时间"
-
msgid "Time between merge request creation and merge/close"
msgstr "从创建åˆå¹¶è¯·æ±‚到被åˆå¹¶æˆ–关闭的时间"
@@ -39165,7 +39817,7 @@ msgid "Time spent"
msgstr "花费的时间"
msgid "Time to Restore Service"
-msgstr ""
+msgstr "æ¢å¤æœåŠ¡æ—¶é—´"
msgid "Time to merge"
msgstr "åˆå¹¶æ—¶é—´"
@@ -39191,6 +39843,12 @@ msgstr "预计"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr "%{spentStart}花费:%{spentEnd}"
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr "删除时间日志时出错。"
+
+msgid "TimeTracking|Delete time spent"
+msgstr "删除时间花费"
+
msgid "TimeTracking|Estimated:"
msgstr "预计:"
@@ -39371,7 +40029,7 @@ msgid "Title"
msgstr "标题"
msgid "Title (required)"
-msgstr ""
+msgstr "标题(必填)"
msgid "Title:"
msgstr "标题:"
@@ -39446,10 +40104,10 @@ msgid "To enable Registration Features, first enable Service Ping."
msgstr "è¦å¯ç”¨æ³¨å†ŒåŠŸèƒ½ï¼Œè¯·å…ˆå¯ç”¨Service Ping。"
msgid "To ensure %{project_link} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
-msgstr ""
+msgstr "ä¸ºç¡®ä¿ %{project_link} 未计划删除,请检查是å¦å·²è®°å½•æ´»åŠ¨ã€‚例如:"
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
-msgstr ""
+msgstr "ä¸ºç¡®ä¿ %{project_name} 未计划删除,请检查是å¦å·²è®°å½•æ´»åŠ¨ã€‚例如:"
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "为ä¿è¯ä¸ªäººå†…容ä¸ä¸¢å¤±ï¼Œæœ¬è´¦å·ä»…用于与 %{group_name}相关的事项。"
@@ -39491,7 +40149,7 @@ msgid "To learn more about this project, read %{link_to_wiki}"
msgstr "è¦äº†è§£æ›´å¤šå…³äºŽæ­¤é¡¹ç›®çš„ä¿¡æ¯ï¼Œè¯·é˜…读 %{link_to_wiki}"
msgid "To manage all members associated with this group and its subgroups and projects, visit the %{link_start}usage quotas page%{link_end}."
-msgstr ""
+msgstr "è¦ç®¡ç†ä¸Žæ­¤ç»„åŠå…¶å­ç»„和项目相关的所有æˆå‘˜ï¼Œè¯·è®¿é—® %{link_start}使用é…é¢é¡µé¢%{link_end}。"
msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
msgstr "如需将整个GitLab项目从å¦ä¸€ä¸ªGitLabæœåŠ¡å™¨ç§»åŠ¨æˆ–å¤åˆ¶åˆ°æ­¤æœåŠ¡å™¨ï¼Œè¯·è®¿é—®åŽŸé¡¹ç›®çš„设置页é¢ï¼Œç”Ÿæˆå¯¼å‡ºæ–‡ä»¶ï¼Œç„¶åŽåœ¨æ­¤å¤„上载。"
@@ -39523,9 +40181,6 @@ msgstr "è¦é‡æ–°æ¿€æ´»æ‚¨çš„å¸æˆ·ï¼Œ %{gitlab_link_start}登录到 GitLab。%{
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr "è¦é‡æ–°æ¿€æ´»æ‚¨çš„å¸æˆ·ï¼Œè¯·åœ¨ %{gitlab_url}登录 GitLab。"
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr "è‹¥è¦æ›´æ–°ï¼Œè¯·å°†æ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¯¼å‡ºå¹¶å‘é€ç”µå­é‚®ä»¶è‡³ %{renewal_service_email}。 新的许å¯è¯å°†å‘é€åˆ°åœ¨ %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯æ·»åŠ åˆ°æ‚¨çš„实例。"
-
msgid "To resolve this, try to:"
msgstr "è¦è§£å†³æ­¤é—®é¢˜ï¼Œè¯·å°è¯•ï¼š"
@@ -39572,7 +40227,7 @@ msgid "To view all %{scannedResourcesCount} scanned URLs, %{linkStart}please dow
msgstr "如需查看所有%{scannedResourcesCount}已扫æ网å€ï¼Œ%{linkStart}请下载CSV文件%{linkEnd}"
msgid "To view usage, refresh this page in a few minutes."
-msgstr ""
+msgstr "è¦æŸ¥çœ‹ä½¿ç”¨é‡ï¼Œè¯·åœ¨å‡ åˆ†é’ŸåŽåˆ·æ–°æ­¤é¡µé¢ã€‚"
msgid "To widen your search, change or remove filters above"
msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除上é¢çš„筛选器"
@@ -39581,7 +40236,7 @@ msgid "To widen your search, change or remove filters above."
msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除上é¢çš„筛选器。"
msgid "To-Do"
-msgstr ""
+msgstr "待办"
msgid "To-Do List"
msgstr "待办事项列表"
@@ -39676,6 +40331,9 @@ msgstr "切æ¢å¿«æ·é”®"
msgid "Toggle sidebar"
msgstr "切æ¢è¾¹æ "
+msgid "Toggle the Draft status"
+msgstr "切æ¢è‰ç¨¿çŠ¶æ€"
+
msgid "Toggle the Performance Bar"
msgstr "切æ¢æ€§èƒ½æ "
@@ -39715,12 +40373,21 @@ msgstr "å¯ç”¨äº†å¤ªå¤šçš„命å空间,通过控制å°æˆ–API管ç†å®ƒä»¬ã€‚"
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr "å¯ç”¨äº†å¤ªå¤šçš„项目,通过控制å°æˆ– API 管ç†å®ƒä»¬ã€‚"
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr "引用太多。快速æ“作仅é™äºŽæœ€å¤š %{max_count} 个用户引用"
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr "找到了太多用户。快速æ“作仅é™äºŽæœ€å¤š %{max_count} 个用户"
+
msgid "TopNav|Go back"
msgstr "返回"
msgid "Topic %{topic_name} was successfully created."
msgstr "主题 %{topic_name} å·²æˆåŠŸåˆ›å»ºã€‚"
+msgid "Topic %{topic_name} was successfully removed."
+msgstr "主题 %{topic_name} å·²æˆåŠŸåˆ é™¤ã€‚"
+
msgid "Topic avatar"
msgstr "主题头åƒ"
@@ -39728,7 +40395,7 @@ msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr "%{name} 的主题头åƒå°†è¢«åˆ é™¤ã€‚æ­¤æ“作无法撤消。"
msgid "Topic slug (name)"
-msgstr "主题缩写(å称)"
+msgstr "主题标识串(å称)"
msgid "Topic title"
msgstr "主题标题"
@@ -39775,9 +40442,6 @@ msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
msgstr "1000+"
-msgid "Tracing"
-msgstr "跟踪"
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "在ä¸åŒé¡¹ç›®å’Œé‡Œç¨‹ç¢‘中跟踪具有åŒä¸€ä¸»é¢˜çš„议题组"
@@ -39934,9 +40598,6 @@ msgstr "员工人数"
msgid "Trial|Please select a country"
msgstr "请选择国家"
-msgid "Trial|Successful trial activation image"
-msgstr "å·²æˆåŠŸæ¿€æ´»é•œåƒ"
-
msgid "Trial|Telephone number"
msgstr "电è¯å·ç "
@@ -39962,7 +40623,7 @@ msgid "Trigger cluster reindexing. Only use this with an index that was created
msgstr "触å‘集群é‡å»ºã€‚仅使用 13.0 或更高版本创建的索引。"
msgid "Trigger job"
-msgstr ""
+msgstr "触å‘作业"
msgid "Trigger manual job"
msgstr "触å‘手动作业"
@@ -40003,9 +40664,6 @@ msgstr "触å‘用户没有足够的项目æƒé™"
msgid "Trigger|invalid"
msgstr "无效"
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr "使用跟踪对应用程åºè¿›è¡Œæ•…障排除与监控"
-
msgid "Trusted"
msgstr "å¯ä¿¡çš„"
@@ -40058,13 +40716,13 @@ msgid "Turn off"
msgstr "关闭"
msgid "Turn off notifications"
-msgstr ""
+msgstr "关闭通知"
msgid "Turn on"
msgstr "打开"
msgid "Turn on notifications"
-msgstr ""
+msgstr "打开通知"
msgid "Twitter"
msgstr "Twitter"
@@ -40093,6 +40751,9 @@ msgstr "åŒé‡è®¤è¯"
msgid "Two-factor authentication disabled"
msgstr "åŒé‡è®¤è¯å·²ç¦ç”¨"
+msgid "Two-factor authentication grace period"
+msgstr "åŒé‡éªŒè¯å®½é™æœŸ"
+
msgid "Two-factor authentication has been disabled for this user"
msgstr "此用户已ç¦ç”¨åŒé‡è®¤è¯"
@@ -40183,9 +40844,6 @@ msgstr "无法收集CPUä¿¡æ¯"
msgid "Unable to collect memory info"
msgstr "无法收集内存信æ¯"
-msgid "Unable to connect to Elasticsearch"
-msgstr "无法连接到Elasticsearch"
-
msgid "Unable to connect to Prometheus server"
msgstr "无法连接到PrometheusæœåŠ¡å™¨"
@@ -40195,9 +40853,6 @@ msgstr "无法连接到æœåŠ¡å™¨: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr "无法连接到JiraæœåŠ¡å™¨ã€‚请检查您的Jira集æˆé…置。"
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr "无法将Kubernetes日志编ç è½¬æ¢ä¸ºUTF-8"
-
msgid "Unable to create link to vulnerability"
msgstr "无法创建到æ¼æ´žçš„链接"
@@ -40210,9 +40865,6 @@ msgstr "无法获å–分支列表,请关闭表å•å¹¶é‡è¯•"
msgid "Unable to fetch upstream and downstream pipelines."
msgstr "无法获å–上游和下游æµæ°´çº¿ã€‚"
-msgid "Unable to fetch vulnerable projects"
-msgstr "无法获å–å¯èƒ½å­˜åœ¨æ¼æ´žçš„项目"
-
msgid "Unable to find Jira project to import data from."
msgstr "无法找到è¦å¯¼å…¥æ•°æ®çš„Jira项目。"
@@ -40240,6 +40892,9 @@ msgstr "无法加载差异。 %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "无法加载åˆå¹¶è¯·æ±‚部件。请å°è¯•é‡æ–°åŠ è½½é¡µé¢ã€‚"
+msgid "Unable to parse the vulnerability report's options."
+msgstr "无法解æžæ¼æ´žæŠ¥å‘Šçš„选项。"
+
msgid "Unable to save iteration. Please try again"
msgstr "无法ä¿å­˜è¿­ä»£ã€‚请é‡è¯•"
@@ -40282,8 +40937,8 @@ msgstr "å·²å–消批准当å‰åˆå¹¶è¯·æ±‚。"
msgid "Unarchive project"
msgstr "å–消归档项目"
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "å–消归档项目将æ¢å¤å…¶æˆå‘˜å¯¹å…¶è¿›è¡Œæ›´æ”¹çš„能力。å¯ä»¥æ交仓库,并且å¯ä»¥åˆ›å»ºè®®é¢˜ã€è¯„论和其他实体。 %{strong_start}一旦激活,该项目就会显示在æœç´¢å’Œä»ªè¡¨æ¿ä¸Šã€‚%{strong_end} %{link_start}了解更多。%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr "å–消归档项目将æ¢å¤å…¶æˆå‘˜æ交ã€åˆ›å»ºè®®é¢˜ã€è¯„论和其他的能力。%{strong_start}å–消归档项目åŽï¼Œå®ƒä¼šæ˜¾ç¤ºåœ¨æœç´¢å’Œä»ªè¡¨ç›˜ä¸Šã€‚%{strong_end} %{link_start}了解更多。%{link_end}"
msgid "Unassign from commenting user"
msgstr "å–消分é…给评论用户"
@@ -40336,9 +40991,6 @@ msgstr "未知的"
msgid "Unknown Error"
msgstr "未知错误"
-msgid "Unknown cache key"
-msgstr "未知的缓存键"
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr "未知的加密策略: %{encrypted_strategy}!"
@@ -40370,7 +41022,7 @@ msgid "Unlock account"
msgstr "解é”账户"
msgid "Unlock merge request"
-msgstr ""
+msgstr "解é”åˆå¹¶è¯·æ±‚"
msgid "Unlock more features with GitLab Ultimate"
msgstr "使用旗舰版解é”更多功能"
@@ -40390,12 +41042,6 @@ msgstr "解é”讨论。"
msgid "Unlocks the discussion."
msgstr "解é”讨论。"
-msgid "Unmarked this %{noun} as a draft."
-msgstr "å·²å–消标记此%{noun}为è‰ç¨¿ã€‚"
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr "å–消标记此%{noun}为è‰ç¨¿ã€‚"
-
msgid "Unreachable"
msgstr "无法访问"
@@ -40591,17 +41237,14 @@ msgstr "上传新文件"
msgid "Upload object map"
msgstr "上传对象图"
-msgid "UploadLink|click to upload"
-msgstr "点击上传"
-
-msgid "Uploaded"
-msgstr "已上传"
+msgid "Uploaded date"
+msgstr "上传日期"
msgid "Uploading changes to terminal"
msgstr "正在将å˜æ›´å†…容上传到终端"
msgid "Uploading..."
-msgstr ""
+msgstr "正在上传..."
msgid "Upstream"
msgstr "上游"
@@ -40622,7 +41265,7 @@ msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled,
msgstr "%{help_link_start}共享Runner%{help_link_end}å·²ç¦ç”¨ï¼Œæ‰€ä»¥æµæ°´çº¿ä½¿ç”¨æ²¡æœ‰è®¾ç½®é™åˆ¶"
msgid "UsageQuota|%{linkStart}Shared runners%{linkEnd} are disabled, so there are no limits set on pipeline usage"
-msgstr ""
+msgstr "%{linkStart}共享 runner%{linkEnd} å·²ç¦ç”¨ï¼Œå› æ­¤å¯¹æµæ°´çº¿ä½¿ç”¨æ²¡æœ‰é™åˆ¶"
msgid "UsageQuota|%{linkTitle} help link"
msgstr "%{linkTitle} 帮助链接"
@@ -40639,14 +41282,11 @@ msgstr "产物是构建产物和æµæ°´çº¿äº§ç‰©çš„总和。"
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "音频样本ã€è§†é¢‘ã€æ•°æ®é›†å’Œå›¾å½¢ã€‚"
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr "由于已知问题,æŸäº›é¡¹ç›®çš„产物总数å¯èƒ½ä¸æ­£ç¡®ã€‚有关更多详细信æ¯ï¼Œè¯·é˜…读 %{warningLinkStart}å²è¯—%{warningLinkEnd}。"
-
msgid "UsageQuota|Buy additional minutes"
msgstr "购买更多分钟数"
msgid "UsageQuota|Buy storage"
-msgstr ""
+msgstr "购买存储"
msgid "UsageQuota|CI minutes usage by month"
msgstr "CI 分钟使用é‡ï¼ˆæŒ‰æœˆï¼‰"
@@ -40664,28 +41304,28 @@ msgid "UsageQuota|Code packages and container images."
msgstr "代ç åŒ…和容器镜åƒã€‚"
msgid "UsageQuota|Container Registry"
-msgstr ""
+msgstr "容器镜åƒåº“"
msgid "UsageQuota|Current period usage"
msgstr "当å‰å‘¨æœŸä½¿ç”¨é‡"
msgid "UsageQuota|Dependency proxy"
-msgstr ""
+msgstr "ä¾èµ–代ç†"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr "文件附件和较å°çš„设计图表。"
msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. You are currently using %{used_storage} of namespace storage. View and manage your usage from %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
-msgstr ""
+msgstr "从 %{storage_enforcement_date},存储é™åˆ¶å°†åº”用于此命å空间。您当å‰æ­£åœ¨ä½¿ç”¨ %{used_storage} 个命å空间存储。从 %{strong_start}%{namespace_type} 设置 &gt; 使用é…é¢%{strong_end},查看和管ç†æ‚¨çš„使用情况。"
msgid "UsageQuota|Git repository."
msgstr "Git仓库。"
msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images."
-msgstr ""
+msgstr "存储 Docker é•œåƒçš„ Gitlab-integrated Docker Container Registry。"
msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images. %{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "存储 Docker é•œåƒçš„ Gitlab-integrated Docker Container Registry。%{linkStart}更多信æ¯%{linkEnd}"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "包括产物ã€ä»“库ã€wikiã€ä¸Šä¼ æ–‡ä»¶å’Œå…¶å®ƒäº‹é¡¹ã€‚"
@@ -40703,13 +41343,13 @@ msgid "UsageQuota|Learn more about usage quotas"
msgstr "了解有关使用é…é¢çš„更多信æ¯"
msgid "UsageQuota|Learn more about usage quotas."
-msgstr ""
+msgstr "了解有关使用é…é¢çš„更多信æ¯ã€‚"
msgid "UsageQuota|Local proxy used for frequently-accessed upstream Docker images. %{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "ç»å¸¸è®¿é—®çš„ Docker 上游镜åƒä½¿ç”¨çš„本地代ç†ã€‚%{linkStart}更多信æ¯%{linkEnd}"
msgid "UsageQuota|Namespace storage used"
-msgstr ""
+msgstr "已使用的命å空间存储"
msgid "UsageQuota|No CI minutes usage data available."
msgstr "æ— å¯ç”¨çš„ CI 分钟使用数æ®ã€‚"
@@ -40730,16 +41370,16 @@ msgid "UsageQuota|Purchase more storage"
msgstr "购买更多存储空间"
msgid "UsageQuota|Purchased storage"
-msgstr ""
+msgstr "购买的存储"
msgid "UsageQuota|Purchased storage available"
msgstr "购买的存储空间å¯ç”¨"
msgid "UsageQuota|Purchased storage used"
-msgstr ""
+msgstr "已使用的购买的存储"
msgid "UsageQuota|Recalculate repository usage"
-msgstr ""
+msgstr "é‡æ–°è®¡ç®—仓库使用情况"
msgid "UsageQuota|Repository"
msgstr "仓库"
@@ -40751,17 +41391,20 @@ msgid "UsageQuota|Shared bits of code and text."
msgstr "代ç å’Œæ–‡æœ¬çš„共享bits。"
msgid "UsageQuota|Shared runner duration"
-msgstr ""
+msgstr "共享 runner 时长"
msgid "UsageQuota|Snippets"
msgstr "代ç ç‰‡æ®µ"
msgid "UsageQuota|Something went wrong while fetching pipeline statistics"
-msgstr ""
+msgstr "获å–æµæ°´çº¿ç»Ÿè®¡æ—¶å‡ºçŽ°é”™è¯¯"
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr "获å–项目存储统计时出现错误"
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr "加载使用详情时出错"
+
msgid "UsageQuota|Storage"
msgstr "存储"
@@ -40772,10 +41415,10 @@ msgid "UsageQuota|Storage used"
msgstr "已使用存储"
msgid "UsageQuota|The table below shows current period usage"
-msgstr ""
+msgstr "下表显示当å‰æ—¶é—´æ®µä½¿ç”¨æƒ…况"
msgid "UsageQuota|The table below shows usage since %{timeElapsed}"
-msgstr ""
+msgstr "下表显示 %{timeElapsed} 以æ¥çš„使用情况"
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr "这是此å称空间中所有项目使用的存储空间总和。"
@@ -40790,10 +41433,10 @@ msgid "UsageQuota|This namespace has no projects which use shared runners"
msgstr "此命å空间没有使用共享Runner的项目"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
-msgstr ""
+msgstr "这个命å空间没有在当å‰é˜¶æ®µä½¿ç”¨å…±äº« runner 的项目"
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
-msgstr ""
+msgstr "此表çœç•¥ä½¿ç”¨ 0 CI/CD 分钟或 0 共享 runner 时长"
msgid "UsageQuota|Total excess storage used"
msgstr "已使用超é‡å­˜å‚¨ç©ºé—´æ€»è®¡"
@@ -40835,7 +41478,7 @@ msgid "UsageQuota|Usage quotas help link"
msgstr "使用é…é¢å¸®åŠ©é“¾æŽ¥"
msgid "UsageQuota|Usage since %{usageSince}"
-msgstr ""
+msgstr "从 %{usageSince} 以æ¥çš„使用情况"
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr "当您购买更多的存储空间时,我们会自动解é”达到%{actualRepositorySizeLimit}é™åˆ¶æ—¶è¢«é”定的项目。"
@@ -40988,7 +41631,7 @@ msgid "Use hashed storage"
msgstr "使用哈希存储"
msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "对新创建和é‡å‘½å的仓库使用哈希存储路径。自 13.0 起始终å¯ç”¨ã€‚%{link_start}了解更多。%{link_end}"
msgid "Use issue count"
msgstr "使用议题计数"
@@ -41389,6 +42032,12 @@ msgstr "用户å¯ä»¥é€šè¿‡ç™»å½•é‡æ–°æ¿€æ´»ä»–们的å¸æˆ·ã€‚ %{link_start}了è
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr "用户å¯ä»¥ä½¿ç”¨ Kroki 在 AsciiDocã€Markdownã€reStructuredText å’Œ Textile 文档中渲染图表。"
+msgid "Users can request access (if visibility is public or internal)"
+msgstr "用户å¯ä»¥è¯·æ±‚访问(如果å¯è§æ€§æ˜¯å…¬å¼€æˆ–内部)"
+
+msgid "Users cannot be added to projects in this group"
+msgstr "用户ä¸èƒ½è¢«æ·»åŠ åˆ°æ­¤ç¾¤ç»„中的项目"
+
msgid "Users in License"
msgstr "许å¯è¯ä¸­çš„用户数"
@@ -41484,7 +42133,7 @@ msgstr "%{stageCount}+ 项"
msgid "ValueStreamAnalytics|%{subjectFilterText} and %{selectedLabelsCount} label"
msgid_plural "ValueStreamAnalytics|%{subjectFilterText} and %{selectedLabelsCount} labels"
-msgstr[0] ""
+msgstr[0] "%{subjectFilterText} 和 %{selectedLabelsCount} 标记"
msgid "ValueStreamAnalytics|%{value}M"
msgstr "%{value}月"
@@ -41508,7 +42157,7 @@ msgid "ValueStreamAnalytics|Average number of deployments to production per day.
msgstr "æ¯å¤©ç”Ÿäº§çŽ¯å¢ƒéƒ¨ç½²çš„å¹³å‡æ•°ã€‚"
msgid "ValueStreamAnalytics|DORA metrics"
-msgstr ""
+msgstr "DORA 指标"
msgid "ValueStreamAnalytics|Dashboard"
msgstr "仪表盘"
@@ -41517,10 +42166,10 @@ msgid "ValueStreamAnalytics|Go to docs"
msgstr "转到文档"
msgid "ValueStreamAnalytics|Key metrics"
-msgstr ""
+msgstr "关键指标"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
-msgstr ""
+msgstr "在给定时间段内,事件在生产环境中开放的中ä½æ—¶é—´ã€‚"
msgid "ValueStreamAnalytics|Median time between merge request merge and deployment to a production environment for all MRs deployed in the given time period."
msgstr "对于在给定时间内部署的所有管ç†ä¿¡æ¯ç³»ç»Ÿï¼Œä»Žåˆå¹¶è¯·æ±‚åˆå¹¶åˆ°éƒ¨ç½²åˆ°ç”Ÿäº§çŽ¯å¢ƒä¹‹é—´çš„中ä½æ—¶é—´ã€‚"
@@ -41538,16 +42187,16 @@ msgid "ValueStreamAnalytics|Number of new issues created."
msgstr "创建新议题的数é‡"
msgid "ValueStreamAnalytics|Percentage of deployments that cause an incident in production."
-msgstr ""
+msgstr "导致生产事故的部署百分比。"
msgid "ValueStreamAnalytics|Shows %{selectedFiltersDescription} for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
-msgstr ""
+msgstr "显示群组 “%{groupName}†的 %{selectedFiltersDescription} 和从 %{createdAfter} 到 %{createdBefore} 的 %{selectedProjectCount} 个项目"
msgid "ValueStreamAnalytics|Shows %{selectedFiltersDescription} for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
-msgstr ""
+msgstr "为群组 “%{groupName}“ 显示从 %{createdAfter} 到 %{createdBefore} 的 %{selectedFiltersDescription}"
msgid "ValueStreamAnalytics|Tasks by type"
-msgstr ""
+msgstr "按类型划分任务"
msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
msgstr "获å–价值æµåˆ†æž %{requestTypeName} æ•°æ®æ—¶å‡ºçŽ°é”™è¯¯ã€‚"
@@ -41556,7 +42205,7 @@ msgid "ValueStreamAnalytics|Total number of deploys to production."
msgstr "生产环境部署的总数。"
msgid "ValueStreamAnalytics|Value stream"
-msgstr ""
+msgstr "价值æµ"
msgid "ValueStreamEvent|Items in stage"
msgstr "阶段中的事项"
@@ -41651,9 +42300,6 @@ msgstr "æ›´æ–°å¯ç”¨"
msgid "VersionCheck|Your GitLab Version"
msgstr "您的 GitLab 版本"
-msgid "View Documentation"
-msgstr "查看文档"
-
msgid "View Stage: %{title}"
msgstr "查看阶段: %{title}"
@@ -41670,7 +42316,7 @@ msgid "View all issues"
msgstr "查看所有议题"
msgid "View all personal projects"
-msgstr ""
+msgstr "查看所有个人项目"
msgid "View blame"
msgstr "查看 blame"
@@ -41697,9 +42343,6 @@ msgstr "查看详细信æ¯: %{details_url}"
msgid "View documentation"
msgstr "查看文档"
-msgid "View downstream pipeline"
-msgstr "查看下游æµæ°´çº¿"
-
msgid "View eligible approvers"
msgstr "查看具备相关资格的核准人"
@@ -41805,7 +42448,7 @@ msgid "View supported languages and frameworks"
msgstr "查看支æŒçš„语言和框架"
msgid "View the %{code_open}last_activity_at%{code_close} attribute for %{project_link} using the %{projects_api_link}."
-msgstr ""
+msgstr "使用 %{projects_api_link} 查看 %{project_link} 的 %{code_open}last_activity_at%{code_close} 属性。"
msgid "View the documentation"
msgstr "查看文档"
@@ -42288,7 +42931,7 @@ msgid "We invite you to %{featureLinkStart}request a feature%{featureLinkEnd}, %
msgstr "我们邀请您加入 %{featureLinkStart}请求功能%{featureLinkEnd}, %{bugLinkStart}报告错误%{bugLinkEnd} 或 %{feedbackLinkStart}分享å馈%{feedbackLinkEnd}"
msgid "We recommend a work email address."
-msgstr ""
+msgstr "我们推è工作电å­é‚®ä»¶åœ°å€ã€‚"
msgid "We recommend cloud-based mobile authenticator apps such as Authy, Duo Mobile, and LastPass. They can restore access if you lose your hardware device."
msgstr "我们推è基于云端的移动身份验è¯å™¨åº”用,例如Authyã€Duo Mobileå’ŒLastPas。如果您丢失了硬件设备,他们å¯ä»¥æ¢å¤è®¿é—®ã€‚"
@@ -42311,8 +42954,8 @@ msgstr "我们å°è¯•äºŽ%{expires_on}自动将%{strong}%{namespace_name}%{strong_
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "我们è¦ç¡®å®šæ‚¨æ˜¯ä¸æ˜¯æœºå™¨äººã€‚"
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
-msgstr ""
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgstr "我们想è¦è®©æ‚¨çŸ¥é“ %{username} 已在%{scope}中被å°ç¦ï¼Œå› ä¸ºå®ƒä»¬åœ¨ %{within_minutes} 分钟内下载了超过 %{max_project_downloads} 个项目仓库。"
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
msgstr "我们会通知%{inviter} ,您拒ç»äº†æ³¨å†ŒGitLab的邀请。您将ä¸ä¼šç»§ç»­æ”¶åˆ°æ醒。"
@@ -42330,10 +42973,10 @@ msgid "We're experiencing difficulties and this tab content is currently unavail
msgstr "我们é‡åˆ°äº†å›°éš¾ï¼Œæ­¤æ ‡ç­¾å†…容目å‰ä¸å¯ç”¨ã€‚"
msgid "We've detected some unusual activity"
-msgstr ""
+msgstr "我们检测到æŸäº›å¼‚常活动"
msgid "We've detected unusual activity"
-msgstr ""
+msgstr "我们检测到异常活动"
msgid "We've found no vulnerabilities"
msgstr "未å‘现安全æ¼æ´ž"
@@ -42609,7 +43252,7 @@ msgid "What is Markdown?"
msgstr "什么是 Markdown?"
msgid "What is listed here?"
-msgstr ""
+msgstr "这里列出了什么?"
msgid "What is repository mirroring?"
msgstr "什么是仓库镜åƒï¼Ÿ"
@@ -42906,6 +43549,9 @@ msgstr "将被映射到"
msgid "Will deploy to"
msgstr "将部署到"
+msgid "Wireframe"
+msgstr "线框图"
+
msgid "With requirements, you can set criteria to check your products against."
msgstr "æ过需求,您å¯ä»¥è®¾ç½®æ ‡å‡†æ¥æ£€æŸ¥æ‚¨çš„产å“。"
@@ -42925,25 +43571,41 @@ msgid "Work in progress Limit"
msgstr "“进行中â€é™åˆ¶"
msgid "WorkItem|Add"
-msgstr ""
+msgstr "添加"
msgid "WorkItem|Add a child"
-msgstr ""
+msgstr "添加å­é¡¹"
+
+msgid "WorkItem|Add assignee"
+msgstr "添加指派人"
+
+msgid "WorkItem|Add assignees"
+msgstr "添加指派人"
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr "您确定è¦å–消编辑å—?"
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr "确定è¦åˆ é™¤å·¥ä½œé¡¹å—?此æ“作无法撤消。"
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] "指派人"
+
msgid "WorkItem|Cancel"
-msgstr ""
+msgstr "å–消"
msgid "WorkItem|Child items"
-msgstr ""
+msgstr "å­é¡¹"
+
+msgid "WorkItem|Closed"
+msgstr "已关闭"
msgid "WorkItem|Collapse child items"
-msgstr ""
+msgstr "折å å­é¡¹"
-msgid "WorkItem|Convert to work item"
-msgstr "转æ¢ä¸ºå·¥ä½œé¡¹"
+msgid "WorkItem|Create task"
+msgstr "创建任务"
msgid "WorkItem|Create work item"
msgstr "创建工作项"
@@ -42952,13 +43614,13 @@ msgid "WorkItem|Delete work item"
msgstr "删除工作项"
msgid "WorkItem|Expand child items"
-msgstr ""
-
-msgid "WorkItem|New Task"
-msgstr "新建任务"
+msgstr "展开å­é¡¹"
msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
-msgstr ""
+msgstr "ç›®å‰æ²¡æœ‰æŒ‡æ´¾å­é¡¹ã€‚使用å­é¡¹æ¥æŽ’列您的团队应该完æˆçš„任务的优先级,实现您的目标ï¼"
+
+msgid "WorkItem|Open"
+msgstr "开放"
msgid "WorkItem|Select type"
msgstr "选择类型"
@@ -43009,7 +43671,7 @@ msgid "Write a description…"
msgstr "写说明..."
msgid "Write an internal note or drag your files here…"
-msgstr ""
+msgstr "编写内部备注或将文件拖到此处…"
msgid "Write milestone description..."
msgstr "写入里程碑æè¿°..."
@@ -43088,7 +43750,7 @@ msgid "You are connected to the Prometheus server, but there is currently no dat
msgstr "您已连接到PrometheusæœåŠ¡å™¨ï¼Œä½†å½“å‰æ²¡æœ‰æ•°æ®å¯æ˜¾ç¤ºã€‚"
msgid "You are currently offline, or the GitLab instance is not reachable."
-msgstr ""
+msgstr "您当å‰å¤„于离线状æ€ï¼Œæˆ–者 GitLab 实例ä¸å¯è®¿é—®ã€‚"
msgid "You are going to delete %{project_full_name}. Deleted projects CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "å³å°†è¦åˆ é™¤%{project_full_name}。已删除的项目无法æ¢å¤ï¼ç¡®å®šç»§ç»­å—?"
@@ -43108,8 +43770,8 @@ msgstr "您将è¦å°† %{project_full_name} 转移到å¦ä¸€ä¸ªå称空间。您å®
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr "å³å°†å…³é—­ç§å¯†æ€§ã€‚这将使得%{strongStart}所有用户%{strongEnd}都å¯ä»¥æŸ¥çœ‹å¹¶ä¸”评论当å‰%{issuableType}。"
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
-msgstr ""
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
+msgstr "您将开å¯ç§å¯†åŠŸèƒ½ã€‚仅有具有至少%{strongStart}%{permissions}%{strongEnd}çš„%{context}æˆå‘˜å¯ä»¥æŸ¥çœ‹æˆ–收到关于 %{issuableType} 的通知。"
msgid "You are not allowed to %{action} a user"
msgstr "您无æƒ%{action}一å用户"
@@ -43172,10 +43834,10 @@ msgid "You can %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
msgstr "您å¯ä»¥ %{resolveLocallyStart}在本地解决它%{resolveLocallyEnd}。"
msgid "You can adjust rules on auto-banning %{link_start}here%{link_end}."
-msgstr ""
+msgstr "您å¯ä»¥%{link_start}在此处%{link_end}调整自动å°ç¦çš„规则。"
msgid "You can adjust rules on auto-banning here: %{url}."
-msgstr ""
+msgstr "您å¯ä»¥åœ¨æ­¤å¤„调整自动ç¦æ­¢è§„则:%{url}。"
msgid "You can also create a project from the command line."
msgstr "您也å¯ä»¥é€šè¿‡å‘½ä»¤è¡Œæ¥åˆ›å»ºæ–°é¡¹ç›®ã€‚"
@@ -43268,7 +43930,7 @@ msgid "You can group test cases using labels. To learn about the future directio
msgstr "您å¯ä»¥ä½¿ç”¨æ ‡ç­¾å¯¹æµ‹è¯•ç”¨ä¾‹è¿›è¡Œåˆ†ç»„。è¦äº†è§£æ­¤åŠŸèƒ½çš„未æ¥å‘展方å‘,请访问 %{linkStart}è´¨é‡ç®¡ç†æ–¹å‘页%{linkEnd}。"
msgid "You can have a maximum of %{free_limit} unique members across all of your personal projects. To view and manage members, check the members page for each project in your namespace. We recommend you %{move_link_start}move your projects to a group%{move_link_end} so you can easily manage users and features."
-msgstr ""
+msgstr "在您的所有个人项目中,您最多å¯ä»¥æœ‰ %{free_limit} 个唯一æˆå‘˜ã€‚è¦æŸ¥çœ‹å’Œç®¡ç†æˆå‘˜ï¼Œè¯·æ£€æŸ¥å‘½å空间中æ¯ä¸ªé¡¹ç›®çš„æˆå‘˜é¡µé¢ã€‚我们建议您 %{move_link_start}将您的项目移动到群组%{move_link_end},以便您å¯ä»¥è½»æ¾ç®¡ç†ç”¨æˆ·å’ŒåŠŸèƒ½ã€‚"
msgid "You can invite a new member to %{project_name} or invite another group."
msgstr "您å¯ä»¥é‚€è¯·ä¸€ä¸ªæ–°æˆå‘˜æˆ–å¦ä¸€ä¸ªç¾¤ç»„加入%{project_name}。"
@@ -43306,9 +43968,6 @@ msgstr "当处于分支时,您åªèƒ½ %{action} 文件"
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr "您一次最多åªèƒ½æ·»åŠ  %{max_contacts} 个è”系人"
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr "åªèƒ½åœ¨åˆ†æ”¯ä¸Šç¼–辑文件"
@@ -43318,9 +43977,6 @@ msgstr "解决以上问题åŽï¼Œæ‚¨æ‰èƒ½åˆå¹¶ã€‚"
msgid "You can only transfer the project to namespaces you manage."
msgstr "您åªèƒ½å°†é¡¹ç›®è½¬ç§»åˆ°æ‚¨ç®¡ç†çš„命å空间。"
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr "通过拖放到现有设计的方å¼ï¼Œæ‚¨æ¯æ¬¡åªèƒ½ä¸Šä¼ ä¸€ä¸ªè®¾è®¡ã€‚"
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "您å¯ä»¥ä½¿ç”¨äº¤äº’模å¼ï¼Œé€šè¿‡é€‰æ‹© %{use_ours} 或 %{use_theirs} 按钮æ¥è§£å†³åˆå¹¶å†²çªã€‚也å¯ä»¥é€šè¿‡ç›´æŽ¥ç¼–辑文件æ¥è§£å†³åˆå¹¶å†²çªã€‚然åŽå°†è¿™äº›æ›´æ”¹æ交到 %{branch_name}"
@@ -43348,18 +44004,18 @@ msgstr "您ä¸èƒ½ %{action} %{state} 用户。"
msgid "You cannot access the raw file. Please wait a minute."
msgstr "您ä¸èƒ½è®¿é—®åŽŸå§‹æ–‡ä»¶ã€‚请ç¨å€™ã€‚"
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr "您ä¸èƒ½æ‰¹å‡†æ‚¨è‡ªå·±çš„部署。"
msgid "You cannot change the start date after the cadence has started. Please create a new cadence."
-msgstr ""
+msgstr "在周期已ç»å¼€å§‹åŽï¼Œæ‚¨æ— æ³•è°ƒæ•´å¼€å§‹æ—¥æœŸã€‚请创建一个新周期。"
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr "您ä¸èƒ½å°† replace_ids 与 add_ids 或 remove_ids 结åˆä½¿ç”¨"
+msgid "You cannot edit this timeline event."
+msgstr "您无法编辑此时间线事件。"
+
msgid "You cannot impersonate a blocked user"
msgstr "您无法使用被ç¦ç”¨ç”¨æˆ·çš„身份"
@@ -43376,7 +44032,7 @@ msgid "You cannot rename an environment after it's created."
msgstr "环境创建åŽä¸èƒ½é‡å‘½å。"
msgid "You cannot set yourself to awaiting"
-msgstr ""
+msgstr "您ä¸èƒ½å°†è‡ªå·±è®¾ç½®ä¸ºç­‰å¾…"
msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
msgstr "您ä¸èƒ½å†™å…¥åªè¯»çš„æ¬¡è¦ GitLab Geo 实例。请改用%{link_to_primary_node}。"
@@ -43391,7 +44047,7 @@ msgid "You could not create a new trigger."
msgstr "您无法创建新的触å‘器。"
msgid "You currently have more than %{free_limit} members across all your personal projects. From June 22, 2022, the %{free_limit} most recently active members will remain active, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access. To view and manage members, check the members page for each project in your namespace. We recommend you %{move_link_start}move your project to a group%{move_link_end} so you can easily manage users and features."
-msgstr ""
+msgstr "您所有的个人项目中目å‰æœ‰è¶…过 %{free_limit} 个æˆå‘˜ã€‚自 2022 å¹´ 6 月22 日起,%{free_limit} 个最近活跃的æˆå‘˜å°†ç»§ç»­æ´»è·ƒï¼Œå…¶ä½™æˆå‘˜å°†èŽ·å¾—%{link_start}超过é™åˆ¶çš„状æ€%{link_end}并无法访问。è¦æŸ¥çœ‹å’Œç®¡ç†æˆå‘˜ï¼Œè¯·æ£€æŸ¥æ‚¨å‘½å空间中æ¯ä¸ªé¡¹ç›®çš„æˆå‘˜é¡µé¢ã€‚我们推è您 %{move_link_start}将您的项目移动到一个群组%{move_link_end} ,以便您å¯ä»¥è½»æ¾åœ°ç®¡ç†ç”¨æˆ·å’ŒåŠŸèƒ½ã€‚"
msgid "You do not have any Google Cloud projects. Please create a Google Cloud project and then reload this page."
msgstr "您没有任何 Google Cloud 项目。请创建一个 Google Cloud 项目,然åŽé‡æ–°åŠ è½½æ­¤é¡µé¢ã€‚"
@@ -43415,7 +44071,7 @@ msgid "You do not have permission to run the Web Terminal. Please contact a proj
msgstr "您无æƒè¿è¡ŒWeb终端。请è”系项目管ç†å‘˜ã€‚"
msgid "You do not have permission to set a member awaiting"
-msgstr ""
+msgstr "您没有æƒé™è®¾ç½®ä¸€ä¸ªæˆå‘˜ä¸ºç­‰å¾…状æ€ã€‚"
msgid "You do not have permission to update the environment."
msgstr "您没有更新此环境的æƒé™ã€‚"
@@ -43451,13 +44107,13 @@ msgid "You don't have permission to review this deployment. Contact the project
msgstr "您无æƒæŸ¥çœ‹æ­¤éƒ¨ç½²ã€‚è”系项目或群组所有者寻求帮助。"
msgid "You don't have permissions to create this project"
-msgstr ""
+msgstr "您无æƒåˆ›å»ºé¡¹ç›®"
msgid "You don't have sufficient permission to perform this action."
msgstr "你没有足够的æƒé™æ¥æ‰§è¡Œæ­¤æ“作。"
msgid "You don't have the %{role} role for any groups in this instance."
-msgstr ""
+msgstr "在此实例中,您没有任何群组的 %{role} 角色。"
msgid "You don't have write access to the source branch."
msgstr "您没有对æºåˆ†æ”¯çš„写æƒé™ã€‚"
@@ -43511,6 +44167,9 @@ msgstr "您没有足够的æƒé™ä¸ºæ­¤é¡¹ç›®åˆ›å»ºHTTP集æˆ"
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr "您没有足够的æƒé™æ¥åˆ›å»ºæ­¤é¡¹ç›®çš„待命计划"
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr "您没有足够的æƒé™æ¥ç®¡ç†æ­¤äº‹ä»¶çš„资æºé“¾æŽ¥"
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr "您没有足够的æƒé™ç®¡ç†æ­¤äº‹ä»¶çš„时间线事件"
@@ -43523,6 +44182,9 @@ msgstr "您没有足够的æƒé™ä»Žæ­¤é¡¹ç›®ä¸­åˆ é™¤ on-call 计划"
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr "您没有足够的æƒé™åˆ é™¤æ­¤HTTP集æˆ"
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr "您没有足够的æƒé™åˆ é™¤æ­¤å‘½å空间å°ç¦"
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr "您没有足够的æƒé™ä¸ºæ­¤è®®é¢˜è®¾ç½®å®¢æˆ·å…³ç³»è”系人"
@@ -43592,9 +44254,6 @@ msgstr "您必须登录æ‰èƒ½æœç´¢ç‰¹å®šäº‹é¡¹ã€‚"
msgid "You must solve the CAPTCHA in order to submit"
msgstr "您必须解决验è¯ç æ‰èƒ½æ交"
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr "当拖放到现有设计时,您必须上传具有相åŒæ–‡ä»¶å的文件。"
-
msgid "You need a different license to enable FileLocks feature"
msgstr "需è¦ä½¿ç”¨ä¸Žå½“å‰ä¸åŒçš„许å¯(license) æ‰èƒ½å¯ç”¨FileLocks功能"
@@ -43694,23 +44353,41 @@ msgstr "您ä¸èƒ½ç›´æŽ¥å¯¹æ­¤é¡¹ç›®è¿›è¡Œæ›´æ”¹ã€‚此项目的派生项目正在
msgid "You're receiving this email because of your account on %{host}."
msgstr "您收到这å°ç”µå­é‚®ä»¶ï¼Œæ˜¯å› ä¸ºæ‚¨åœ¨ %{host} 拥有å¸æˆ·ã€‚"
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºä½ åœ¨ %{host} 拥有å¸æˆ·ã€‚ %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºæ‚¨åœ¨ %{host}上的å¸æˆ·ã€‚%{manage_label_subscriptions_link_start}管ç†æ ‡è®°è®¢é˜…%{manage_label_subscriptions_link_end} &middot; %{help_link_start}帮助%{help_link_end}"
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºæ‚¨åœ¨ %{host}上的å¸æˆ·ã€‚%{manage_notifications_link_start}管ç†æ‰€æœ‰é€šçŸ¥%{manage_notifications_link_end} &middot; %{help_link_start}帮助%{help_link_end}"
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºæ‚¨åœ¨ %{host}上的å¸æˆ·ã€‚从此主题%{unsubscribe_link_start}å–消订阅%{unsubscribe_link_end} &middot; %{manage_notifications_link_start}管ç†æ‰€æœ‰é€šçŸ¥%{manage_notifications_link_end} &middot; %{help_link_start}帮助%{help_link_end}"
msgid "You're receiving this email because of your activity on %{host}."
msgstr "您在%{host}上有活动,因此收到此电å­é‚®ä»¶ã€‚"
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºæ‚¨åœ¨ %{host}上的活动。从此主题%{unsubscribe_link_start}å–消订阅%{unsubscribe_link_end} &middot; %{manage_notifications_link_start}管ç†æ‰€æœ‰é€šçŸ¥%{manage_notifications_link_end} &middot; %{help_link_start}帮助%{help_link_end}"
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr "您收到此电å­é‚®ä»¶æ˜¯å› ä¸º%{host}上有æŸä¸ªé¡¹ç›®æŒ‡æ´¾ç»™æ‚¨ã€‚"
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºæ‚¨åœ¨ %{host} 上指派了一个事项。从此主题%{unsubscribe_link_start}å–消订阅%{unsubscribe_link_end} &middot; %{manage_notifications_link_start}管ç†æ‰€æœ‰é€šçŸ¥%{manage_notifications_link_end} &middot; %{help_link_start}帮助%{help_link_end}"
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "您收到此电å­é‚®ä»¶æ˜¯å› ä¸º%{host}上æåŠäº†æ‚¨ã€‚"
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºæ‚¨åœ¨ %{host} 上被æåŠã€‚%{manage_notifications_link_start}管ç†æ‰€æœ‰é€šçŸ¥%{manage_notifications_link_end} &middot; %{help_link_start}帮助%{help_link_end}"
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºæ‚¨åœ¨ %{host} 上指派了一个事项。从此主题%{unsubscribe_link_start}å–消订阅%{unsubscribe_link_end} &middot; %{manage_notifications_link_start}管ç†æ‰€æœ‰é€šçŸ¥%{manage_notifications_link_end} &middot; %{help_link_start}帮助%{help_link_end}"
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "您已ç»ä½¿ç”¨ä¸€æ¬¡å¯†ç éªŒè¯å™¨å¯ç”¨äº†åŒé‡è®¤è¯ã€‚如果您è¦æ³¨å†Œä¸åŒçš„设备,您必须先ç¦ç”¨åŒé‡è®¤è¯ã€‚"
msgid "You've reached your %{free_limit} member limit across all of your personal projects"
-msgstr ""
+msgstr "您已ç»è¾¾åˆ°æ‚¨æ‰€æœ‰ä¸ªäººé¡¹ç›®çš„ %{free_limit} æˆå‘˜é™åˆ¶"
msgid "You've rejected %{user}"
msgstr "您拒ç»äº† %{user}"
@@ -43727,12 +44404,6 @@ msgstr "您的%{group}æˆå‘˜èµ„格将在%{days}天内到期。"
msgid "Your %{host} account was signed in to from a new location"
msgstr "您在%{host}上的å¸æˆ·å·²ä»Žä¸€ä¸ªæ–°çš„ä½ç½®ç™»å½•"
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr "您的 %{plan} 订阅已于 %{expiry_date} 到期"
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr "您的 %{plan} 订阅于 %{expiry_date} 到期"
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr "您的 %{spammable_entity_type} 涉åŠåžƒåœ¾ä¿¡æ¯ï¼Œå·²è¢«ä¸¢å¼ƒã€‚"
@@ -43950,10 +44621,10 @@ msgid "Your name"
msgstr "您的åå­—"
msgid "Your new %{accessTokenType}"
-msgstr ""
+msgstr "您的新 %{accessTokenType}"
msgid "Your new %{accessTokenType} has been created."
-msgstr ""
+msgstr "您的新 %{accessTokenType} 已创建。"
msgid "Your new %{type}"
msgstr "您的新%{type}"
@@ -43964,12 +44635,6 @@ msgstr "您的新访问令牌已创建。"
msgid "Your new comment"
msgstr "您的新评论"
-msgid "Your new personal access token has been created."
-msgstr "您的新个人访问令牌已创建。"
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr "查看此页é¢ä¸éœ€è¦å¯†ç ã€‚如果è¦æ±‚输入密ç æˆ–其他任何个人详细信æ¯ï¼Œè¯·ä¸Žç®¡ç†å‘˜è”系以举报滥用行为。"
-
msgid "Your password reset token has expired."
msgstr "您的密ç é‡ç½®ä»¤ç‰Œå·²è¿‡æœŸã€‚"
@@ -43985,6 +44650,9 @@ msgstr "您的主è¦ç”µå­é‚®ä»¶ç”¨äºŽå¤´åƒæ£€æµ‹ã€‚您å¯ä»¥åœ¨æ‚¨çš„ %{openin
msgid "Your profile"
msgstr "个人资料"
+msgid "Your project has limited quotas and features"
+msgstr "您的项目的é…é¢å’ŒåŠŸèƒ½æœ‰é™"
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "您的被é™åˆ¶ä¸ºæœ€å¤§ %{limit} 个项目ï¼è¯·ä¸Žæ‚¨çš„管ç†å‘˜è”系以增加它"
@@ -44035,15 +44703,18 @@ msgstr "您的订阅已过期ï¼"
msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seat remaining."
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
-msgstr[0] ""
-
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr "您的订阅现已过期。è¦ç»­è®¢ï¼Œè¯·å¯¼å‡ºæ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¹¶å°†å…¶é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ° %{renewal_service_email}。新的许å¯è¯å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ°åœ¨ %{customers_dot}中注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯æ·»åŠ åˆ°æ‚¨çš„实例。è¦ä½¿ç”¨å…费版,请删除您当å‰çš„许å¯è¯ã€‚"
+msgstr[0] "您的订阅共有 %{total_seat_count} 个席ä½ï¼Œè¿˜å‰©ä¸‹ %{remaining_seat_count} 个。"
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] "您的订阅将在 %{remaining_days} 天åŽåˆ°æœŸã€‚"
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr "您的更新失败。通过拖放到现有设计的方å¼ï¼Œæ‚¨æ¯æ¬¡åªèƒ½ä¸Šä¼ ä¸€ä¸ªè®¾è®¡ã€‚"
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr "您的更新失败。当拖放到现有设计时,您必须上传具有相åŒæ–‡ä»¶å的文件。"
+
msgid "Your username is %{username}."
msgstr "您的用户å是%{username}。"
@@ -44116,6 +44787,9 @@ msgstr "`end_time` ä¸åº”超过 `start_time` åŽçš„一个月"
msgid "`start_time` should precede `end_time`"
msgstr "`start_time` 应该在 `end_time` 之å‰"
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr "此项目ç¦ç”¨ `work_items_rivy` 功能标志"
+
msgid "a deleted user"
msgstr "已删除的用户"
@@ -44144,6 +44818,9 @@ msgstr "警报"
msgid "allowed to fail"
msgstr "å…许失败"
+msgid "already banned from namespace"
+msgstr "已在命å空间中å°ç¦"
+
msgid "already being used for another group or project %{timebox_name}."
msgstr "已用于å¦ä¸€ç¾¤ç§Ÿæˆ–项目%{timebox_name}。"
@@ -44184,6 +44861,12 @@ msgstr "分é…给自己"
msgid "at"
msgstr "于"
+msgid "at least the Reporter role"
+msgstr "至少有报告者角色"
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr "至少是报告者角色ã€ä½œè€…或指派人"
+
msgid "at risk"
msgstr "存在风险"
@@ -44236,6 +44919,9 @@ msgstr "åªèƒ½ç”±ç¾¤ç»„管ç†å‘˜æ›´æ”¹ã€‚"
msgid "can only have one escalation policy"
msgstr "åªèƒ½æœ‰ä¸€ä¸ªå‡çº§ç­–ç•¥"
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr "ç¦ç”¨å»¶è¿Ÿç¾¤ç»„删除时无法å¯ç”¨"
+
msgid "can't be nil"
msgstr "ä¸èƒ½ä¸º nil"
@@ -44278,6 +44964,9 @@ msgstr "除éžæ‰€æœ‰åŸŸéƒ½å…·æœ‰TLSè¯ä¹¦ï¼Œå¦åˆ™æ— æ³•å¯ç”¨"
msgid "cannot be enabled until a valid credit card is on file"
msgstr "在有效的信用å¡å­˜æ¡£ä¹‹å‰æ— æ³•å¯ç”¨"
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr "无法使用,因为它属于已æŸåçš„ç§é’¥ã€‚åœæ­¢ä½¿ç”¨æ­¤å¯†é’¥å¹¶ç”Ÿæˆä¸€ä¸ªæ–°å¯†é’¥ã€‚"
+
msgid "cannot be used for user namespace"
msgstr "ä¸èƒ½ç”¨äºŽç”¨æˆ·å‘½å空间"
@@ -44348,11 +45037,11 @@ msgstr "%{reportType}:å‘生一个错误"
msgid "ciReport|%{sameNum} same"
msgstr "相åŒ%{sameNum}"
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
-msgstr ""
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
+msgstr "%{scanner} 检测到 %{strong_start}%{number} 个%{strong_end}新的潜在%{vulnStr}"
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
-msgstr ""
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
+msgstr "%{scanner} 没有检测到%{strong_start}新的%{strong_end} %{vulnStr}"
msgid "ciReport|: Loading resulted in an error"
msgstr ": 加载导致错误"
@@ -44363,6 +45052,9 @@ msgstr "API模糊测试"
msgid "ciReport|API fuzzing"
msgstr "API 模糊测试"
+msgid "ciReport|All clusters"
+msgstr "所有集群"
+
msgid "ciReport|All projects"
msgstr "所有项目"
@@ -44414,11 +45106,11 @@ msgstr "æ­£åœ¨è§£æž Code Quality 测试指标结果"
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
-msgstr[0] ""
+msgstr[0] "代ç è´¨é‡å›  %d 个新问题而下é™"
msgid "ciReport|Code quality improved due to 1 resolved issue"
msgid_plural "ciReport|Code quality improved due to %d resolved issues"
-msgstr[0] ""
+msgstr[0] "代ç è´¨é‡å›  %d 个新问题而æå‡"
msgid "ciReport|Code quality scanning detected %{issueCount} changes in merged results"
msgstr "代ç è´¨é‡æ‰«æ在åˆå¹¶ç»“果中检测到 %{issueCount} 个更改"
@@ -44487,7 +45179,7 @@ msgid "ciReport|Found %{issuesWithCount}"
msgstr "找到%{issuesWithCount}"
msgid "ciReport|Full Report"
-msgstr ""
+msgstr "完整报告"
msgid "ciReport|IaC Scanning"
msgstr "IaC 扫æ"
@@ -44527,7 +45219,7 @@ msgid "ciReport|Loading Code Quality report"
msgstr "加载代ç è´¨é‡æŠ¥å‘Š"
msgid "ciReport|Manage Licenses"
-msgstr ""
+msgstr "管ç†è®¸å¯è¯"
msgid "ciReport|Manage licenses"
msgstr "管ç†è®¸å¯è¯"
@@ -44566,7 +45258,7 @@ msgid "ciReport|Secret detection"
msgstr "密ç æ£€æµ‹"
msgid "ciReport|Security reports failed loading results"
-msgstr ""
+msgstr "安全报告加载结果失败"
msgid "ciReport|Security scanning"
msgstr "安全扫æ"
@@ -44575,7 +45267,7 @@ msgid "ciReport|Security scanning failed loading any results"
msgstr "安全扫æ无法加载任何结果"
msgid "ciReport|Security scanning is loading"
-msgstr ""
+msgstr "安全扫æ加载中"
msgid "ciReport|Showing %{fetchedItems} of %{totalItems} items"
msgstr "显示 %{fetchedItems} 项,共 %{totalItems}项"
@@ -44618,7 +45310,7 @@ msgid "ciReport|View full report"
msgstr "查看完整报告"
msgid "ciReport|in"
-msgstr ""
+msgstr "于"
msgid "ciReport|is loading"
msgstr "正在加载"
@@ -44629,6 +45321,9 @@ msgstr "正在加载,加载结果时出错"
msgid "closed"
msgstr "已关闭"
+msgid "closed %{timeago}"
+msgstr "已关闭于 %{timeago}"
+
msgid "closed issue"
msgstr "已关闭议题"
@@ -44656,12 +45351,6 @@ msgstr "è”系人åªèƒ½æ·»åŠ åˆ°æ ¹ç¾¤ç»„"
msgid "container registry images"
msgstr "容器镜åƒåº“é•œåƒ"
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr "container_nameåªèƒ½åŒ…å«å°å†™å­—æ¯ï¼Œæ•°å­—,'-'å’Œ'.',并且必须以字æ¯å’Œæ•°å­—字符开头和结尾"
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr "container_nameä¸èƒ½è¶…过%{max_length}个字符"
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr "包å«è¶…过 1024 个字符é™åˆ¶çš„ URL (%{urls})"
@@ -44714,6 +45403,9 @@ msgstr "默认分支"
msgid "deleted"
msgstr "已删除"
+msgid "denied"
+msgstr "已拒ç»"
+
msgid "deploy"
msgstr "部署"
@@ -44824,6 +45516,9 @@ msgstr "结果无法找到或已与æ¼æ´žå…³è”。"
msgid "following"
msgstr "已关注"
+msgid "for"
+msgstr "对于"
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "使用%{link_to_merge_request}于%{link_to_merge_request_source_branch}"
@@ -44870,6 +45565,16 @@ msgstr "群组 CI/CD 设置。"
msgid "groups"
msgstr "群组"
+msgid "groups and projects"
+msgstr "群组和项目"
+
+msgid "groups only"
+msgstr "ä»…é™ç¾¤ç»„"
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] "有 %{count} 个失败的作业"
+
msgid "has already been linked to another vulnerability"
msgstr "å·²ç»é“¾æŽ¥åˆ°å¦ä¸€ä¸ªæ¼æ´ž"
@@ -44932,7 +45637,7 @@ msgid_plural "instances completed"
msgstr[0] "实例已完æˆ"
msgid "internal note"
-msgstr ""
+msgstr "内部备注"
msgid "invalid milestone state `%{state}`"
msgstr "æ— æ•ˆçš„é‡Œç¨‹ç¢‘çŠ¶æ€ `%{state}`"
@@ -45108,7 +45813,7 @@ msgid "missing"
msgstr "丢失"
msgid "months"
-msgstr ""
+msgstr "月"
msgid "most recent deployment"
msgstr "最近的部署"
@@ -45188,6 +45893,12 @@ msgstr "核准为å¯é€‰"
msgid "mrWidget|Approval password is invalid."
msgstr "批准密ç æ— æ•ˆ"
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr "审批规则 %{rules} 无效。系统已自动批准此规则æ¥è§£é™¤é˜»å¡žåˆå¹¶è¯·æ±‚。%{link}"
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr "审批规则 %{rules} 无效。系统已自动批准这些规则æ¥è§£é™¤é˜»å¡žåˆå¹¶è¯·æ±‚。%{link}"
+
msgid "mrWidget|Approve"
msgstr "批准"
@@ -45289,6 +46000,9 @@ msgstr[0] "æåŠè®®é¢˜"
msgid "mrWidget|Merge"
msgstr "åˆå¹¶"
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šå¿…须获得所有è¦æ±‚的批准。"
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šå¿…须解决所有主题。"
@@ -45307,9 +46021,6 @@ msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šæµæ°´çº¿å¿…é¡»æˆåŠŸã€‚等待手动完æˆæ“作。"
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr "åˆå¹¶å—阻:æµæ°´çº¿å¿…é¡»æˆåŠŸã€‚推é€ä¸€ä¸ªä¿®å¤å¤±è´¥çš„æ交,或者%{linkStart}了解其它解决方案。%{linkEnd}"
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šå¿…须批准此åˆå¹¶è¯·æ±‚。"
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr "åˆå¹¶é˜»å¡žï¼šè§£å†³ä¸Šè¿°é—®é¢˜åŽæ‰èƒ½åˆå¹¶ã€‚"
@@ -45355,6 +46066,9 @@ msgstr "正在åˆå¹¶ï¼æˆ‘们快完æˆäº†â€¦"
msgid "mrWidget|More information"
msgstr "更多信æ¯"
+msgid "mrWidget|No users match the rule's criteria."
+msgstr "没有用户符åˆè¯¥è§„则的标准。"
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "请还原它或使用ä¸åŒçš„ %{type} 分支。"
@@ -45553,6 +46267,12 @@ msgstr "%{item},和 %{lastItem}"
msgid "on track"
msgstr "按计划进行"
+msgid "only %{parent_types} can be parent of Task."
+msgstr "åªæœ‰ %{parent_types} å¯ä»¥æ˜¯ä»»åŠ¡çš„上级。"
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr "åªæœ‰ä»»åŠ¡å¯ä»¥è¢«åˆ†é…为层次结构中的å­é¡¹ã€‚"
+
msgid "only available on top-level groups."
msgstr "åªèƒ½åœ¨æœ€é¡¶çº§ç¾¤ç»„中使用。"
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "上级"
+msgid "parent already has maximum number of children."
+msgstr "上级已ç»æ‹¥æœ‰æœ€å¤§æ•°é‡çš„下级。"
+
+msgid "parent must be in the same project as child."
+msgstr "上级必须与下级在åŒä¸€ä¸ªé¡¹ç›®ä¸­ã€‚"
+
msgid "password"
msgstr "密ç "
@@ -45616,13 +46342,7 @@ msgid "pipelineEditorWalkthrough|Use the %{boldStart}commit changes%{boldEnd} bu
msgstr "使用页é¢åº•éƒ¨çš„ %{boldStart}æ交修改%{boldEnd} 按钮æ¥è¿è¡Œæµæ°´çº¿ã€‚"
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr "pod_nameåªèƒ½åŒ…å«å°å†™å­—æ¯ï¼Œæ•°å­—,'-'å’Œ'.',并且必须以字æ¯å’Œæ•°å­—字符开头和结尾"
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr "pod_nameä¸èƒ½å¤§äºŽ%{max_length}个字符"
+msgstr "您å¯ä»¥ä½¿ç”¨æ–‡ä»¶æ ‘查看您的æµæ°´çº¿é…置文件。%{linkStart}了解更多%{linkEnd}"
msgid "point"
msgid_plural "points"
@@ -45771,6 +46491,9 @@ msgstr "未知"
msgid "should be an array of %{object_name} objects"
msgstr "应该是%{object_name}对象的数组"
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr "应该是现有用户å的数组。%{invalid}ä¸å­˜åœ¨"
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr "应该从高于或等于从%{group_name} 群组继承的æˆå‘˜èº«ä»½%{access}"
@@ -45850,7 +46573,7 @@ msgid "the following epic(s)"
msgstr "下列å²è¯—"
msgid "the following incident(s) or issue(s)"
-msgstr ""
+msgstr "下列事件或议题"
msgid "the following issue(s)"
msgstr "下列议题"
@@ -45868,7 +46591,7 @@ msgid "time summary"
msgstr "时间总计"
msgid "today"
-msgstr ""
+msgstr "今天"
msgid "toggle collapse"
msgstr "切æ¢æŠ˜å "
@@ -45991,6 +46714,12 @@ msgstr "过期时间ä¿æŒä¸å˜äºŽ%{old_expiry}"
msgid "yaml invalid"
msgstr "yaml无效"
+msgid "your GitLab instance"
+msgstr "您的 GitLab 实例"
+
+msgid "your group (%{group_name})"
+msgstr "您的群组(%{group_name})"
+
msgid "your settings"
msgstr "您的设置"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index 60c869d0320..2a97269afa5 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:26\n"
+"PO-Revision-Date: 2022-07-14 17:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -245,6 +245,10 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
+msgid "%d job"
+msgid_plural "%d jobs"
+msgstr[0] ""
+
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d 個圖層"
@@ -305,10 +309,18 @@ msgid "%d remaining"
msgid_plural "%d remaining"
msgstr[0] ""
+msgid "%d reply"
+msgid_plural "%d replies"
+msgstr[0] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -622,9 +634,15 @@ msgstr ""
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
+msgstr ""
+
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
+msgstr ""
+
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -837,9 +855,6 @@ msgstr ""
msgid "%{scope} results for term '%{term}'"
msgstr ""
-msgid "%{search} %{description} %{scope}"
-msgstr ""
-
msgid "%{seconds}s"
msgstr ""
@@ -917,6 +932,9 @@ msgstr[0] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
msgstr ""
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
+msgstr ""
+
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
msgstr[0] ""
@@ -952,6 +970,9 @@ msgstr ""
msgid "%{timebox_type} must have a start and due date"
msgstr ""
+msgid "%{time} UTC"
+msgstr ""
+
msgid "%{title} %{operator} %{threshold}"
msgstr ""
@@ -1233,6 +1254,10 @@ msgstr ""
msgid "0 bytes"
msgstr ""
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
+
msgid "1 Day"
msgid_plural "%d Days"
msgstr[0] ""
@@ -1421,6 +1446,9 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1709,6 +1737,9 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "å­˜å–憑證 (access token)"
@@ -1826,6 +1857,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "帳戶"
@@ -1916,9 +1953,6 @@ msgstr "新增 CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr "新增 CONTRIBUTING"
-msgid "Add Jaeger URL"
-msgstr ""
-
msgid "Add Kubernetes cluster"
msgstr "增加 Kubernetes å¢é›†"
@@ -1949,9 +1983,6 @@ msgstr ""
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ 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 new issue"
msgstr ""
@@ -2231,9 +2259,6 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "é¡å¤–的筆記"
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr ""
msgid "AdminUsers|2FA Enabled"
msgstr ""
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr "å·²å°éŽ–"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr ""
@@ -2990,9 +3042,15 @@ msgstr ""
msgid "AdminUsers|Send email to users"
msgstr ""
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr ""
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr ""
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr "容許本項目採用 Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr ""
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "å…許您增加和管ç†Kuberneteså¢é›†ã€‚"
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "訂閱通知時出錯"
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr ""
msgid "Archived projects"
msgstr ""
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr ""
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr "確定è¦é‡ç½®å¥åº·æª¢æŸ¥ä»¤ç‰Œå—Žï¼Ÿ"
@@ -4913,6 +4989,9 @@ msgstr "指派標籤"
msgid "Assign milestone"
msgstr "指派里程碑"
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "拖放文件到此處或者 %{upload_link}"
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "八月"
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7271,9 +7380,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr "將標題改為「%{title_param}ã€ã€‚"
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr "已關閉議題"
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8769,6 +9001,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,10 +9518,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9469,9 +9713,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr "建立新標籤"
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr "詳情"
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,9 +13350,6 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,10 +13732,10 @@ msgstr ""
msgid "Edit"
msgstr "編輯"
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13494,9 +13765,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14280,12 +14524,6 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
@@ -14295,10 +14533,7 @@ msgstr ""
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14334,13 +14563,10 @@ msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
msgstr ""
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
-
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr "按路徑查找"
msgid "Find file"
msgstr "查找文件"
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18086,25 +18373,25 @@ msgstr ""
msgid "GroupSettings|Custom project templates"
msgstr ""
-msgid "GroupSettings|Customize this group's badges."
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
-msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgid "GroupSettings|Customize this group's badges."
msgstr ""
-msgid "GroupSettings|Disable email notifications"
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,37 +18400,40 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
@@ -18152,7 +18442,10 @@ msgstr ""
msgid "GroupSettings|Select parent group"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18185,7 +18484,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr "一月"
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22159,6 +22558,10 @@ msgstr "標籤"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr "管ç†æ‰€æœ‰é€šçŸ¥"
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,18 +25596,15 @@ msgstr ""
msgid "New epic title"
msgstr ""
+msgid "New error tracking access token has been generated!"
+msgstr ""
+
msgid "New file"
msgstr "新增文件"
msgid "New group"
msgstr "新群組"
-msgid "New group URL"
-msgstr ""
-
-msgid "New group name"
-msgstr ""
-
msgid "New health check access token has been generated!"
msgstr ""
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25490,6 +25902,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr "沒有存儲庫"
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr "關閉通知"
msgid "Notifications on"
msgstr "開啟通知"
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "å一月"
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr "æ“作"
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr "所有者"
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr ""
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28548,13 +29059,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28596,9 +29110,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -28863,7 +29371,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,7 +29398,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -28905,6 +29413,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,7 +29494,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29070,13 +29581,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29085,7 +29596,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29094,16 +29605,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29112,7 +29623,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29148,7 +29659,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29268,7 +29782,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "å稱"
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr "å–代"
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr "é‡ç½®å¥åº·æª¢æŸ¥è¨ªå•ä»¤ç‰Œ"
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr "é¸æ“‡ä¾†æºåˆ†æ”¯"
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr "é¸æ“‡ç›®æ¨™åˆ†æ”¯"
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,7 +36620,7 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
@@ -36340,6 +36965,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -36929,6 +37569,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr "該項目å…許任何人訪å•ã€‚"
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr "議題被列入日程表的時間"
msgid "Time before an issue starts implementation"
msgstr "開始進行編碼å‰çš„時間"
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr "從創建åˆä½µè«‹æ±‚到被åˆä½µæˆ–關閉的時間"
@@ -39191,6 +39843,12 @@ msgstr "é ä¼°"
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr "é ä¼°ï¼š"
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr "點擊上傳"
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr "你收到此電å­éƒµä»¶æ˜¯å› ç‚ºä½ çš„帳戶在 %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "父級"
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index 26586a5a2ba..98f774356e0 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-06-10 15:20\n"
+"PO-Revision-Date: 2022-07-14 17:06\n"
msgid " %{start} to %{end}"
msgstr " %{start} 到 %{end}"
@@ -50,7 +50,7 @@ msgid " or %{emphasisStart}#id%{emphasisEnd}"
msgstr ""
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
-msgstr ""
+msgstr " 或 %{emphasisStart} #å•é¡ŒID%{emphasisEnd}"
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
msgstr " 或 %{emphasisStart}&epic id%{emphasisEnd}"
@@ -65,7 +65,7 @@ msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "「%{ref}ã€ä¸Šæ²’有「%{path}ã€"
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
-msgstr ""
+msgstr "\"%{repository_name}\" 的檔案大å°ï¼ˆ%{repository_size})大於 %{limit} é™åˆ¶ã€‚"
msgid "#%{issueIid} (closed)"
msgstr "#%{issueIid}(已關閉)"
@@ -95,7 +95,7 @@ msgstr[0] "%d 其他"
msgid "%d Package"
msgid_plural "%d Packages"
-msgstr[0] ""
+msgstr[0] "%d 個套件"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
@@ -107,19 +107,19 @@ msgstr[0] "已掃æ %d 個網å€"
msgid "%d additional approver"
msgid_plural "%d additional approvers"
-msgstr[0] ""
+msgstr[0] "%d ä½é¡å¤–核准者"
msgid "%d additional assignee"
msgid_plural "%d additional assignees"
-msgstr[0] ""
+msgstr[0] "%d ä½é¡å¤–指派者"
msgid "%d additional commenter"
msgid_plural "%d additional commenters"
-msgstr[0] ""
+msgstr[0] "%d ä½é¡å¤–評論者"
msgid "%d additional committer"
msgid_plural "%d additional committers"
-msgstr[0] ""
+msgstr[0] "%d ä½é¡å¤–çš„æ交者"
msgid "%d approver"
msgid_plural "%d approvers"
@@ -131,7 +131,7 @@ msgstr[0] "%d ä½æ ¸å‡†è€… (你已批准)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
-msgstr[0] ""
+msgstr[0] "%d 個已指派的議題"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -179,7 +179,7 @@ msgstr[0] "%d 次æ交,"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] ""
+msgstr[0] "%d 個完æˆçš„è­°é¡Œ"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -187,11 +187,11 @@ msgstr[0] "%d 個貢ç»"
msgid "%d day"
msgid_plural "%d days"
-msgstr[0] ""
+msgstr[0] "%d 天"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] ""
+msgstr[0] "%d 個å²è©©"
msgid "%d error"
msgid_plural "%d errors"
@@ -223,7 +223,7 @@ msgstr[0] "%d 個分支"
msgid "%d group"
msgid_plural "%d groups"
-msgstr[0] ""
+msgstr[0] "%d 個群組"
msgid "%d hour"
msgid_plural "%d hours"
@@ -239,10 +239,14 @@ msgstr[0] "%d 個議題"
msgid "%d issue in this group"
msgid_plural "%d issues in this group"
-msgstr[0] ""
+msgstr[0] "ç›®å‰çµ„織有 %d 個議題"
msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
+msgstr[0] "用標籤æˆåŠŸåŒ¯å…¥ %d 個議題"
+
+msgid "%d job"
+msgid_plural "%d jobs"
msgstr[0] ""
msgid "%d layer"
@@ -259,7 +263,7 @@ msgstr[0] "%d 個您無法存å–çš„åˆä½µè«‹æ±‚。"
msgid "%d merge requests"
msgid_plural "%d merge requests"
-msgstr[0] ""
+msgstr[0] "%d 個åˆä½µè«‹æ±‚"
msgid "%d metric"
msgid_plural "%d metrics"
@@ -267,7 +271,7 @@ msgstr[0] "%d 個指標"
msgid "%d milestone"
msgid_plural "%d milestones"
-msgstr[0] ""
+msgstr[0] "%d 個里程碑"
msgid "%d minute"
msgid_plural "%d minutes"
@@ -287,7 +291,7 @@ msgstr[0] "%d 項個人專案將會永久移除,無法復原。"
msgid "%d point"
msgid_plural "%d points"
-msgstr[0] ""
+msgstr[0] "%d 分"
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
@@ -303,15 +307,23 @@ msgstr[0] "é¸æ“‡äº†%d 個專案"
msgid "%d remaining"
msgid_plural "%d remaining"
+msgstr[0] "剩餘 %d"
+
+msgid "%d reply"
+msgid_plural "%d replies"
msgstr[0] ""
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d秒"
+msgid "%d stage"
+msgid_plural "%d stages"
+msgstr[0] ""
+
msgid "%d star"
msgid_plural "%d stars"
-msgstr[0] ""
+msgstr[0] "%d 個收è—"
msgid "%d tag"
msgid_plural "%d tags"
@@ -319,43 +331,43 @@ msgstr[0] "%d 個標籤"
msgid "%d tag per image name"
msgid_plural "%d tags per image name"
-msgstr[0] ""
+msgstr[0] "æ¯å€‹åœ–片å稱 %d 標籤"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
-msgstr[0] ""
+msgstr[0] "%d 個尚未分é…çš„è­°é¡Œ"
msgid "%d unresolved thread"
msgid_plural "%d unresolved threads"
-msgstr[0] ""
+msgstr[0] "%d 個未解決話題"
msgid "%d vulnerability"
msgid_plural "%d vulnerabilities"
-msgstr[0] ""
+msgstr[0] "%d 個æ¼æ´ž"
msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
-msgstr[0] ""
+msgstr[0] "已忽略 %d 個æ¼æ´ž"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
+msgstr[0] "%d 個æ¼æ´žè¨­ç½®ç‚ºå·²ç¢ºèª"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
-msgstr[0] ""
+msgstr[0] "%d個æ¼æ´žè¨­ç½®ç‚ºå¿½ç•¥"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
-msgstr[0] ""
+msgstr[0] "%d 個æ¼æ´žè¨­ç½®ç‚ºéœ€è¦è¨ºæ–·"
msgid "%d vulnerability set to resolved"
msgid_plural "%d vulnerabilities set to resolved"
-msgstr[0] ""
+msgstr[0] "%d個æ¼æ´žè¨­ç½®ç‚ºå·²è§£æ±º"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
-msgstr[0] ""
+msgstr[0] "找到 %d 個警告:"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -365,77 +377,77 @@ msgid "%{actionText} & %{openOrClose} %{noteable}"
msgstr "%{actionText} 和 %{openOrClose} %{noteable}"
msgid "%{actionText} & close %{noteable}"
-msgstr ""
+msgstr "%{actionText} & 關閉 %{noteable}"
msgid "%{actionText} & reopen %{noteable}"
-msgstr ""
+msgstr "%{actionText} & é‡æ–°é–‹å•Ÿ %{noteable}"
msgid "%{address} is an invalid IP address range"
-msgstr ""
+msgstr "%{address}是無效的 IP ä½å€ç¯„åœ"
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
-msgstr ""
+msgstr "%{author_link}將 %{original_issue}複製到 %{new_issue}。"
msgid "%{author_link} cloned %{original_issue}. You don't have access to the new project."
-msgstr ""
+msgstr "%{author_link} 複製了 %{original_issue}。您沒有權é™å­˜å–新專案。"
msgid "%{author_link} wrote:"
-msgstr ""
+msgstr "%{author_link} 說:"
msgid "%{authorsName}'s thread"
msgstr "%{authorsName} 的話題"
msgid "%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}"
-msgstr ""
+msgstr "%{author} 請求將 %{source_branch} %{copy_button} åˆä½µåˆ° %{target_branch} %{created_at}"
msgid "%{board_target} not found"
-msgstr ""
+msgstr "%{board_target}未找到。"
msgid "%{bold_start}%{count}%{bold_end} issue"
msgid_plural "%{bold_start}%{count}%{bold_end} issues"
-msgstr[0] ""
+msgstr[0] "%{bold_start}%{count}%{bold_end} å•é¡Œ"
msgid "%{bold_start}%{count}%{bold_end} member"
msgid_plural "%{bold_start}%{count}%{bold_end} members"
-msgstr[0] ""
+msgstr[0] "%{bold_start}%{count}%{bold_end} 個æˆå“¡"
msgid "%{bold_start}%{count}%{bold_end} opened merge request"
msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
-msgstr[0] ""
+msgstr[0] "%{bold_start}%{count}%{bold_end} 個已開啟的åˆä½µè«‹æ±‚"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
-msgstr ""
+msgstr "%{code_open}éš±è—:%{code_close} éš±è—於作業日誌之中。必須符åˆéš±è—è¦å®šã€‚"
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
-msgstr ""
+msgstr "%{code_open}å—ä¿è­·çš„:%{code_close} 僅公開於å—ä¿è­·çš„分支或標籤。"
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
-msgstr ""
+msgstr "由 %{commit_author_link} 於 %{commit_authored_timeago} 建立"
msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
-msgstr ""
+msgstr "ç”± %{commit_author_link} æ–¼ %{commit_authored_timeago} å»ºç«‹åŠ %{commit_committer_avatar} %{commit_committer_link} æ–¼ %{commit_committer_timeago} æ交"
msgid "%{completedCount} completed weight"
-msgstr ""
+msgstr "%{completedCount} 完æˆé‡æ¬Š"
msgid "%{completedCount} of %{count} task completed"
msgid_plural "%{completedCount} of %{count} tasks completed"
-msgstr[0] ""
+msgstr[0] "%{completedCount}/%{count} 的任務已完æˆ"
msgid "%{completedWeight} of %{totalWeight} weight completed"
-msgstr ""
+msgstr "完æˆçš„權é‡%{completedWeight}%{totalWeight}"
msgid "%{completed} of %{total} issues closed"
-msgstr ""
+msgstr "%{total} 個議題中的 %{completed} 個已關閉"
msgid "%{completed} of %{total} weight completed"
-msgstr ""
+msgstr "%{total} 個權é‡ä¸­ï¼Œ%{completed} 個權é‡å·²å®Œæˆ"
msgid "%{cores} cores"
msgstr "%{cores} 核心"
msgid "%{count} %{scope} for term '%{term}'"
-msgstr ""
+msgstr "%{count} 個 %{scope} 關於 '%{term}'"
msgid "%{count} LOC/commit"
msgstr "%{count} 程å¼ç¢¼è¡Œæ•¸/æ交"
@@ -449,17 +461,17 @@ msgstr "來自 %{name} 的 %{count} 個核准"
msgid "%{count} contact"
msgid_plural "%{count} contacts"
-msgstr[0] ""
+msgstr[0] "%{count} è¯çµ¡äºº"
msgid "%{count} files touched"
msgstr "å·²é¸æ“‡ %{count} 個檔案"
msgid "%{count} item"
msgid_plural "%{count} items"
-msgstr[0] ""
+msgstr[0] "%{count} 個項目"
msgid "%{count} items per page"
-msgstr ""
+msgstr "æ¯é %{count} 個項目"
msgid "%{count} more"
msgstr "其餘 %{count} 項"
@@ -485,43 +497,43 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count} 個相關的 %{pluralized_subject}:%{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "å·²é¸å– %{count} 個"
msgid "%{count} total weight"
-msgstr ""
+msgstr "ç¸½æ¬Šé‡ %{count}"
msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
-msgstr ""
+msgstr "%{criticalStart}%{critical}個嚴é‡%{criticalEnd},%{highStart}%{high}個高å±éšª%{highEnd}以åŠ%{otherStart}%{otherMessage}%{otherEnd}"
msgid "%{dashboard_path} could not be found."
-msgstr ""
+msgstr "找ä¸åˆ° %{dashboard_path}。"
msgid "%{days} days until tags are automatically removed"
msgstr "%{days}天,直到標籤被自動刪除"
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}使用範本部署到 ECS%{deployLinkEnd},或使用 Docker 映åƒæª” %{commandsLinkStart} 在 GitLab CI/CD 中執行 AWS 命令%{commandsLinkEnd}。"
msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last seen: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
msgstr "%{description}- Sentry 事件:%{errorUrl}- 首次出ç¾ï¼š%{firstSeen}- 最後出ç¾ï¼š%{lastSeen} %{countLabel}:%{count}%{userCountLabel}:%{userCount}"
msgid "%{doc_link_start}Advanced search%{doc_link_end} is disabled since %{ref_elem} is not the default branch. %{docs_link}"
-msgstr ""
+msgstr "%{doc_link_start}進階æœå°‹%{doc_link_end} 被ç¦ç”¨ï¼Œå› ç‚º %{ref_elem} ä¸æ˜¯é è¨­åˆ†æ”¯ã€‚ %{docs_link}"
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
-msgstr ""
+msgstr "%{doc_link_start}進階æœå°‹%{doc_link_end} 已啟用。"
msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
-msgstr ""
+msgstr "%{docs_link_start}暸解能見度等級%{docs_link_end}"
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
-msgstr ""
+msgstr "%{docs_link_start}甚麼是大型檔案儲存空間?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
-msgstr ""
+msgstr "%{docs_link_start}什麼是兩步驟驗證?%{docs_link_end}"
msgid "%{due_date} (Past due)"
-msgstr ""
+msgstr "%{due_date} (å·²éŽæœŸ)"
msgid "%{duration}ms"
msgstr "%{duration} 毫秒"
@@ -539,10 +551,10 @@ msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} è«‹å†æ¬¡å˜—試上傳檔案。"
msgid "%{emailPrefix}@company.com"
-msgstr ""
+msgstr "%{emailPrefix}@company.com"
msgid "%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload."
-msgstr ""
+msgstr "%{enable_service_ping_link_start}啟用%{link_end} 或 %{generate_manually_link_start}產生%{link_end} Service Ping 以é è¦½å’Œä¸‹è¼‰æ‰€ä½¿ç”¨æœå‹™çš„有效負載資料。"
msgid "%{extra} more downstream pipelines"
msgstr "還有 %{extra} 個下游æµæ°´ç·š"
@@ -554,118 +566,124 @@ msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} 還有 %{labelCount} 個"
msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
-msgstr ""
+msgstr "%{firstMilestoneName} + 其餘 %{numberOfOtherMilestones} 項"
msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
-msgstr ""
+msgstr "%{gitlab_experience_text}。ä¸ç”¨æ“”心,該信æ¯ä¸æœƒåœ¨æ‚¨è‡ªå·±ç®¡ç†çš„GitLab實例之外共享。"
msgid "%{gitlab_experience_text}. We won't share this information with anyone."
-msgstr ""
+msgstr "%{gitlab_experience_text}。我們ä¸æœƒèˆ‡ä»»ä½•äººå…±äº«æ­¤ä¿¡æ¯ã€‚"
msgid "%{global_id} is not a valid ID for %{expected_types}."
-msgstr ""
+msgstr "%{global_id} ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„ID %{expected_types}。"
msgid "%{group_name} activity"
-msgstr ""
+msgstr "%{group_name} 活動"
msgid "%{group_name} group members"
-msgstr ""
+msgstr "%{group_name} 群組æˆå“¡"
msgid "%{group_name} is approaching the limit of available seats"
-msgstr ""
+msgstr "%{group_name} 接近å¯ç”¨å¸­ä½çš„é™åˆ¶"
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
msgstr "%{group_name} 使用群組管ç†å¸³æˆ¶ã€‚您需è¦å»ºç«‹ä¸€å€‹æ–°çš„ GitLab 帳戶,該帳戶將由 %{group_name} 群組管ç†ã€‚"
msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
-msgstr ""
+msgstr "%{group_name}&%{epic_iid} &middot; %{epic_created} 由%{author}創建"
msgid "%{hook_type} was deleted"
-msgstr ""
+msgstr "%{hook_type}已被刪除"
msgid "%{hook_type} was scheduled for deletion"
-msgstr ""
+msgstr "%{hook_type}已安排刪除"
msgid "%{host} sign-in from new location"
-msgstr ""
+msgstr "%{host} 從新ä½ç½®ç™»å…¥"
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 ""
+msgstr "%{integrations_link_start}æ•´åˆ%{link_end}能讓你將第三方應用程å¼æˆç‚º GitLab工作æµç¨‹çš„一部分。若當å‰å¯ç”¨çš„æ•´åˆç„¡æ³•æ»¿è¶³ä½ çš„需求,å¯ä»¥è€ƒæ…®ä½¿ç”¨ %{webhooks_link_start}webhook%{link_end}。"
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} 將被刪除ï¼æ‚¨ç¢ºå®šå—Žï¼Ÿ"
msgid "%{issuable}(s) already assigned"
-msgstr ""
+msgstr "%{issuable} 已分é…"
msgid "%{issueType} actions"
-msgstr ""
+msgstr "%{issueType}動作"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issuesSize} 上é™ç‚º %{maxIssueCount}"
msgid "%{italic_start}What's new%{italic_end} is inactive and cannot be viewed."
-msgstr ""
+msgstr "%{italic_start}新增功能%{italic_end} 處於éžæ´»å‹•ç‹€æ…‹ï¼Œç„¡æ³•æŸ¥çœ‹ã€‚"
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{itemsCount} 個議題,上é™ç‚º %{maxIssueCount} 個"
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}實際響應:%{labelEnd} %{headers}"
msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
-msgstr ""
+msgstr "%{labelStart}斷言:%{labelEnd} %{assertion}"
msgid "%{labelStart}Class:%{labelEnd} %{class}"
-msgstr ""
+msgstr "%{labelStart}類別: %{labelEnd}%{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
+msgstr "%{labelStart}崩潰地å€ï¼š%{labelEnd} %{crash_address}"
+
+msgid "%{labelStart}Crash State:%{labelEnd} %{crash_state}"
msgstr ""
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
+msgstr "%{labelStart}崩潰狀態:%{labelEnd} %{stacktrace_snippet}"
+
+msgid "%{labelStart}Crash Type:%{labelEnd} %{crash_type}"
msgstr ""
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
-msgstr ""
+msgstr "%{labelStart}證據:%{labelEnd} %{evidence}"
msgid "%{labelStart}File:%{labelEnd} %{file}"
-msgstr ""
+msgstr "%{labelStart}檔案:%{labelEnd} %{file}"
msgid "%{labelStart}Image:%{labelEnd} %{image}"
-msgstr ""
+msgstr "%{labelStart}圖片:%{labelEnd} %{image}"
msgid "%{labelStart}Method:%{labelEnd} %{method}"
-msgstr ""
+msgstr "%{labelStart}方法:%{labelEnd} %{method}"
msgid "%{labelStart}Namespace:%{labelEnd} %{namespace}"
-msgstr ""
+msgstr "%{labelStart}命å空間:%{labelEnd} %{namespace}"
msgid "%{labelStart}Scanner:%{labelEnd} %{scanner}"
-msgstr ""
+msgstr "%{labelStart}掃æ器:%{labelEnd} %{scanner}"
msgid "%{labelStart}Sent request:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}已發é€è«‹æ±‚:%{labelEnd} %{headers}"
msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
-msgstr ""
+msgstr "%{labelStart}åš´é‡ç¨‹åº¦ï¼š%{labelEnd} %{severity}"
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr ""
+msgstr "%{labelStart}工具:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}未更改的回應:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} 無法使用"
msgid "%{learn_more_link}."
-msgstr ""
+msgstr "%{learn_more_link}。"
msgid "%{lessThan} 1 hour"
-msgstr ""
+msgstr "%{lessThan} 1 å°æ™‚"
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
-msgstr ""
+msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} 是一個å…費的ã€è‡ªå‹•åŒ–且開放的憑證簽發機構 (CA)。其所簽發之數ä½æ†‘證,讓網站得以啟用 HTTPS (SSL/TLS)。"
msgid "%{level_name} is not allowed in a %{group_level_name} group."
msgstr "%{group_level_name} 群組ä¸å…許 %{level_name} 。"
@@ -674,16 +692,16 @@ msgid "%{level_name} is not allowed since the fork source project has lower visi
msgstr "由於分å‰çš„æºé …ç›®å¯è¦‹æ€§è¼ƒä½Žï¼Œå› æ­¤ä¸å…許使用 %{level_name}。"
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 draft from merging before it's ready."
-msgstr ""
+msgstr "在標題å‰é¢åŠ ä¸Š %{link_start} %{draft_snippet}%{link_end} ,以防止åˆä½µè«‹æ±‚è‰ç¨¿åœ¨æº–備就緒之å‰è¢«åˆä½µã€‚"
msgid "%{listToShow}, and %{awardsListLength} more"
-msgstr ""
+msgstr "%{listToShow}個,還有 %{awardsListLength} 個。"
msgid "%{location} is missing required keys: %{keys}"
-msgstr ""
+msgstr "%{location}缺少需è¦çš„金鑰: %{keys}"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} 被 GitLab 使用者 %{lock_user_id} 鎖定"
@@ -692,34 +710,34 @@ msgid "%{mergeLength}/%{usersLength} can merge"
msgstr "%{mergeLength}/%{usersLength} å¯ä»¥åˆä½µ"
msgid "%{message} showing first %{warnings_displayed}"
-msgstr ""
+msgstr "%{message} 顯示第一個 %{warnings_displayed}"
msgid "%{message}. Your attention request was removed."
-msgstr ""
+msgstr "%{message}. 您的關注請求已被移除。"
msgid "%{milestone} (expired)"
-msgstr ""
+msgstr "%{milestone} (å·²éŽæœŸ)"
msgid "%{milliseconds}ms"
-msgstr ""
+msgstr "%{milliseconds} 毫秒"
msgid "%{minutesUsed} minutes"
-msgstr ""
+msgstr "%{minutesUsed} 分"
msgid "%{model_name} not found"
-msgstr ""
+msgstr "%{model_name}未找到。"
msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText},此議題將自動關閉。"
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 ""
+msgstr "%{name_with_link} 命å空間剩下ä¸åˆ° %{percent} 分é˜çš„共用執行器æµæ°´ç·šé¡åº¦ã€‚用完é¡åº¦å¾Œå°±ä¸æœƒç¹¼çºŒåŸ·è¡Œå°ˆæ¡ˆä¸­æ–°å¢žçš„作業或æµæ°´ç·šã€‚"
msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes. No new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "%{name_with_link} 命å空間已用盡共用執行器æµæ°´ç·šé¡åº¦ã€‚å°‡ä¸åŸ·è¡Œå°ˆæ¡ˆä¸­æ–°å¢žçš„作業或æµæ°´ç·šã€‚"
msgid "%{name} (Busy)"
-msgstr ""
+msgstr "%{name} (忙碌)"
msgid "%{name} contained %{resultsString}"
msgstr "%{name} åŒ…å« %{resultsString}"
@@ -728,44 +746,44 @@ msgid "%{name} found %{resultsString}"
msgstr "%{name} 找到了 %{resultsString}"
msgid "%{name} is already being used for another emoji"
-msgstr ""
+msgstr "%{name} 已用於å¦ä¸€å€‹è¡¨æƒ…符號"
msgid "%{name} is reserved for %{type} report type"
-msgstr ""
+msgstr "%{name} 被ä¿ç•™ç‚º %{type} 報告類型"
msgid "%{name} is scheduled for %{action}"
-msgstr ""
+msgstr "%{name} å·²é ç´„ %{action}"
msgid "%{name}'s avatar"
msgstr "%{name} 的大頭貼"
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 ""
+msgstr "%{name}(%{url}) 命å空間剩餘%{percent} 或更少的共享執行器(Runner)æµæ°´ç®¡é“分é˜æ•¸ã€‚一旦用完,其專案中的新作業或æµæ°´ç®¡é“將無法é‹è¡Œã€‚"
msgid "%{name}(%{url}) namespace has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "%{name}(%{url}) 命å空間已用完共享執行器的æµæ°´ç·šåˆ†é˜æ•¸ï¼Œå…¶å°ˆæ¡ˆä¸­çš„新作業或æµæ°´ç®¡ç·šå°‡ç„¡æ³•é‹è¡Œã€‚"
msgid "%{name}, confirm your email address now!"
-msgstr ""
+msgstr "%{name},立å³ç¢ºèªæ‚¨çš„é›»å­éƒµä»¶åœ°å€ï¼"
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name}: %{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
-msgstr[0] ""
+msgstr[0] "%{no_of_days} æ—¥"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} 個è½å¾Œæ–¼ %{default_branch} 分支的æ交,%{number_commits_ahead} 個領先æ交"
msgid "%{oneMonthAgo} - %{today}"
-msgstr ""
+msgstr "%{oneMonthAgo} - %{today}"
msgid "%{oneWeekAgo} - %{today}"
-msgstr ""
+msgstr "%{oneWeekAgo} - %{today}"
msgid "%{oneYearAgo} - %{today}"
-msgstr ""
+msgstr "%{oneYearAgo} - %{today}"
msgid "%{openedEpics} open, %{closedEpics} closed"
msgstr "%{openedEpics} 個開放,%{closedEpics} 個關閉"
@@ -774,13 +792,13 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues} 個開放,%{closedIssues} 個關閉"
msgid "%{percentageUsed}%% used"
-msgstr ""
+msgstr "%{percentageUsed}%% 已使用"
msgid "%{percentage}%% issues closed"
-msgstr ""
+msgstr "%{percentage}%% 的議題已關閉"
msgid "%{percentage}%% weight completed"
-msgstr ""
+msgstr "完æˆäº† %{percentage}%%"
msgid "%{percent}%% complete"
msgstr "å·²å®Œæˆ %{percent}%%"
@@ -789,41 +807,41 @@ msgid "%{percent}%{percentSymbol} complete"
msgstr "%{percent}%{percentSymbol} 完æˆ"
msgid "%{placeholder} is not a valid color scheme"
-msgstr ""
+msgstr "%{placeholder} ä¸æ˜¯æœ‰æ•ˆçš„色彩é…ç½®"
msgid "%{placeholder} is not a valid theme"
-msgstr ""
+msgstr "%{placeholder} 是無效的主題"
msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})"
-msgstr ""
+msgstr "%{policy_link} (在 %{elapsed_time} 分é˜å¾Œç™¼å‡ºé€šçŸ¥, 除éžç‹€æ…‹ç‚º %{status})"
msgid "%{project_name}"
-msgstr ""
+msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}"
-msgstr ""
+msgstr "%{project_path} 是一個專案項目,å¯ç”¨æ–¼å°‡ README 添加到 GitLab é…置文件。創建一個公共項目並使用自述文件åˆå§‹åŒ–儲存庫以開始使用。 %{help_link_start}了解更多。%{help_link_end}"
msgid "%{ref} cannot be added: %{error}"
-msgstr ""
+msgstr "%{ref} 無法添加: %{error}"
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} 個發布版"
msgid "%{remaining_approvals} left"
-msgstr ""
+msgstr "還剩 %{remaining_approvals} 個"
msgid "%{reportType} %{status}"
-msgstr ""
+msgstr "%{reportType} %{status}"
msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
-msgstr ""
+msgstr "%{reportType}檢測到%{totalStart}%{total}%{totalEnd}個潛在的%{vulnMessage}"
msgid "%{reportType} detected no %{totalStart}new%{totalEnd} vulnerabilities."
-msgstr ""
+msgstr "%{reportType} 未檢測到 %{totalStart}æ–°%{totalEnd} æ¼æ´žã€‚"
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
-msgstr ""
+msgstr "%{retryButtonStart}è«‹é‡è©¦%{retryButtonEnd}或%{newFileButtonStart}附加一個新的檔案%{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 ""
@@ -832,16 +850,13 @@ msgid "%{rotation} has been recalculated with the remaining participants. Please
msgstr ""
msgid "%{runner} created %{timeago}"
-msgstr ""
+msgstr "%{runner} 建立 %{timeago}"
msgid "%{scope} results for term '%{term}'"
-msgstr ""
-
-msgid "%{search} %{description} %{scope}"
-msgstr ""
+msgstr "「%{term}ã€ä¸€è©žçš„ %{scope} 個çµæžœ"
msgid "%{seconds}s"
-msgstr ""
+msgstr "%{seconds} 秒"
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}"
@@ -849,10 +864,10 @@ msgstr[0] ""
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[0] "%{securityScanner}並無çµæžœï¼Œå› ç‚ºè‡ªå•Ÿç”¨ä»¥ä¾†å°šæœªåŸ·è¡Œæµæ°´ç·šã€‚%{linkStart}執行æµæ°´ç·š%{linkEnd}"
msgid "%{size} %{unit}"
-msgstr ""
+msgstr "%{size} %{unit}"
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -867,7 +882,7 @@ msgid "%{size} bytes"
msgstr "%{size} ä½å…ƒçµ„"
msgid "%{sourceBranch} into %{targetBranch}"
-msgstr ""
+msgstr "%{sourceBranch} 到 %{targetBranch}"
msgid "%{spammable_titlecase} was submitted to Akismet successfully."
msgstr "%{spammable_titlecase} æˆåŠŸåœ°æ交給 Akismet。"
@@ -883,16 +898,16 @@ msgstr "%{start} 到 %{end}"
msgid "%{strongOpen}%{errors}%{strongClose} point"
msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
-msgstr[0] ""
+msgstr[0] "%{strongOpen}%{errors}%{strongClose} 點"
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
-msgstr ""
+msgstr "%{strongStart}請注æ„%{strongEnd} ,因您為指派人或審閱者,此åˆä½µè«‹æ±‚需您的åŒæ„æ–¹å¯ç¹¼çºŒä¸‹ä¸€æ­¥"
msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "%{strongStart}æ示:%{strongEnd} 您也å¯ä»¥åœ¨æœ¬åœ°ç«¯æŸ¥çœ‹åˆä½µè«‹æ±‚。%{linkStart}了解更多%{linkEnd}"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -904,7 +919,7 @@ msgstr[0] "%{strong_start}%{commit_count}%{strong_end} 次æ交"
msgid "%{strong_start}%{count} approval rule%{strong_end} requires eligible members to approve before merging."
msgid_plural "%{strong_start}%{count} approval rules%{strong_end} require eligible members to approve before merging."
-msgstr[0] ""
+msgstr[0] "å…±%{strong_start}%{count}æ¢æ ¸å‡†è¦å‰‡%{strong_end}需è¦å…·æ¬Šé™ä¹‹ä½¿ç”¨è€…核准後æ‰å¯åˆä½µã€‚"
msgid "%{strong_start}%{count} eligible member%{strong_end} must approve to merge."
msgid_plural "%{strong_start}%{count} eligible members%{strong_end} must approve to merge."
@@ -912,9 +927,12 @@ msgstr[0] ""
msgid "%{strong_start}%{count} member%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{count}ä½æˆå“¡%{strong_end}需核准æ‰å¯åˆä½µã€‚任何具有開發人員或更高權é™çš„使用者å¯é€²è¡Œæ ¸å‡†ã€‚"
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
+msgstr "%{strong_start}%{human_size}%{strong_end} 專案儲存"
+
+msgid "%{strong_start}%{project_name}%{strong_end} is a personal project, so you can’t upgrade to a paid plan or start a free trial to lift these limits. We recommend %{move_to_group_link}moving this project to a group%{end_link} to unlock these options. You can %{manage_members_link}manage the members of this project%{end_link}, but don’t forget that all unique members in your personal namespace %{strong_start}%{namespace_name}%{strong_end} count towards total seats in use."
msgstr ""
msgid "%{strong_start}%{release_count}%{strong_end} Release"
@@ -935,7 +953,7 @@ msgid "%{tags} tags per image name"
msgstr "æ¯å€‹æ˜ åƒæª”å稱具有 %{tags} 個標籤"
msgid "%{tag}-%{evidence}-%{filename}"
-msgstr ""
+msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} 為未知或無效"
@@ -944,12 +962,15 @@ msgid "%{text} is available"
msgstr "%{text} å¯ç”¨"
msgid "%{timebox_name} should belong either to a project or a group."
-msgstr ""
+msgstr "%{timebox_name} 應該屬於一個專案或一個群組。"
msgid "%{timebox_type} does not support burnup charts"
-msgstr ""
+msgstr "%{timebox_type}ä¸æ”¯æ´ç‡ƒç›¡åœ–"
msgid "%{timebox_type} must have a start and due date"
+msgstr "%{timebox_type} 必須有開始日期和截止日期"
+
+msgid "%{time} UTC"
msgstr ""
msgid "%{title} %{operator} %{threshold}"
@@ -959,25 +980,25 @@ msgid "%{title} changes"
msgstr "%{title} 變更"
msgid "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} free)"
-msgstr ""
+msgstr "%{totalCpu} (剩餘%{freeSpacePercentage}%{percentSymbol})"
msgid "%{totalMemory} (%{freeSpacePercentage}%{percentSymbol} free)"
-msgstr ""
+msgstr "%{totalMemory} (剩餘%{freeSpacePercentage}%{percentSymbol})"
msgid "%{totalWeight} total weight"
msgstr "%{totalWeight} 總權é‡"
msgid "%{total_warnings} warning(s) found:"
-msgstr ""
+msgstr "ç™¼ç¾ %{total_warnings} 個警告:"
msgid "%{total} remaining issue weight"
-msgstr ""
+msgstr "%{total} 剩餘議題權é‡"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
-msgstr ""
+msgstr "ç™¼ç¾ %{total} 個警告訊æ¯ï¼šæ­£åœ¨é¡¯ç¤ºé–‹é ­çš„ %{warningsDisplayed} 個警告訊æ¯"
msgid "%{type} only supports %{name} name"
-msgstr ""
+msgstr "%{type} åªæ”¯æŒ %{name} åå­—"
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (無法åˆä½µ)"
@@ -989,16 +1010,16 @@ msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedul
msgstr ""
msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project_link}: "
-msgstr ""
+msgstr "%{user_name} (%{user_username}) 已從 %{project_link}çš„å‡ç´šç­–略中刪除 "
msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project}:"
-msgstr ""
+msgstr "%{user_name} (%{user_username}) 已從 %{project}çš„å‡ç´šç­–略中刪除"
msgid "%{user_name} profile page"
msgstr "%{user_name} 的個人資料"
msgid "%{username} changed the draft status of merge request %{mr_link}"
-msgstr ""
+msgstr "%{username} 更改了åˆä½µè«‹æ±‚ %{mr_link}"
msgid "%{username} has asked for a GitLab account on your instance %{host}:"
msgstr ""
@@ -1007,31 +1028,31 @@ msgid "%{username}'s avatar"
msgstr "%{username} 的大頭貼"
msgid "%{user} created a merge request: %{mr_link}"
-msgstr ""
+msgstr "%{user} 建立了åˆä½µè«‹æ±‚: %{mr_link}"
msgid "%{user} created an epic: %{epic_link}"
msgstr ""
msgid "%{user} created an issue: %{issue_link}"
-msgstr ""
+msgstr "%{user} 建立了一個議題: %{issue_link}"
msgid "%{value} is not included in the list"
-msgstr ""
+msgstr "%{value} 未包å«åœ¨åˆ—表中"
msgid "%{value} s"
-msgstr ""
+msgstr "%{value} 秒"
msgid "%{verb} %{time_spent_value} spent time."
msgstr "%{verb} 耗時 %{time_spent_value}"
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project."
-msgstr ""
+msgstr "%{webhooks_link_start}%{webhook_type}%{link_end}å…許您在群組或專案中發é€é€šçŸ¥è‡³ web 應用程å¼ä½œç‚ºäº‹ä»¶çš„回應。"
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
-msgstr ""
+msgstr "%{webhooks_link_start}%{webhook_type}%{link_end}å…許您在群組或專案中發é€é€šçŸ¥è‡³ web 應用程å¼ä½œç‚ºäº‹ä»¶çš„回應。比起 webhook ,我們建議你使用%{integrations_link_start}æ•´åˆ%{link_end}。"
msgid "%{widget} options"
-msgstr ""
+msgstr "%{widget} é¸é …"
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
@@ -1086,7 +1107,7 @@ msgid "(+%{count}&nbsp;rules)"
msgstr ""
msgid "(Group Managed Account)"
-msgstr ""
+msgstr "(由群組管ç†çš„帳號)"
msgid "(No changes)"
msgstr "(無變更)"
@@ -1098,16 +1119,16 @@ msgid "(check progress)"
msgstr "(檢查進度)"
msgid "(deleted)"
-msgstr ""
+msgstr "(已刪除)"
msgid "(expired)"
-msgstr ""
+msgstr "(到期)"
msgid "(leave blank if you don't want to change it)"
-msgstr ""
+msgstr "(如果您ä¸æƒ³æ›´æ”¹ï¼Œè«‹ç•™ç©ºï¼‰"
msgid "(max size 15 MB)"
-msgstr ""
+msgstr "(最大15 MB)"
msgid "(optional)"
msgstr ""
@@ -1120,10 +1141,10 @@ msgstr ""
msgid "(squashes %d commit)"
msgid_plural "(squashes %d commits)"
-msgstr[0] ""
+msgstr[0] "(åˆä½µ%d個æ交)"
msgid "(this user)"
-msgstr ""
+msgstr "(此使用者)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
@@ -1175,42 +1196,42 @@ msgid "- %{policy_name} (notifying after %{elapsed_time} minutes unless %{status
msgstr ""
msgid "- Add or remove a user."
-msgstr ""
+msgstr "- 增加或移除使用者"
msgid "- Available to run jobs."
msgstr ""
msgid "- Create or close an issue."
-msgstr ""
+msgstr "- 新建或關閉議題"
msgid "- Create, update, or delete a merge request."
-msgstr ""
+msgstr "- 新建ã€æ›´æ–°ï¼Œæˆ–刪除åˆä½µè«‹æ±‚"
msgid "- Event"
msgid_plural "- Events"
msgstr[0] "- 事件"
msgid "- Go to the Activity page for %{project_name}."
-msgstr ""
+msgstr "- å‰å¾€ %{project_name} 專案的動態é é¢ã€‚"
msgid "- List the visible events for %{project_name} using the Events API %{events_api_link}."
-msgstr ""
+msgstr "- 使用事件 API %{events_api_link} 列出 %{project_name} çš„å¯è¦‹äº‹ä»¶ã€‚"
msgid "- Not available to run jobs."
-msgstr ""
+msgstr "無法用於執行工作。"
msgid "- Push code to the repository."
-msgstr ""
+msgstr "- 推é€ç¨‹å¼ç¢¼åˆ°ç‰ˆæœ¬åº«"
msgid "- Select -"
-msgstr ""
+msgstr "- å·²é¸æ“‡ -"
msgid "- User"
msgid_plural "- Users"
msgstr[0] "- 使用者"
msgid "- View the last_activity_at attribute for %{project_name} using the Project API %{projects_api_link}."
-msgstr ""
+msgstr "- 使用專案 API %{projects_api_link} 查看 %{project_name} 的 last_activity_at 屬性。"
msgid "- of - issues closed"
msgstr ""
@@ -1222,16 +1243,20 @@ msgid "- show less"
msgstr "- 顯示較少內容"
msgid "."
-msgstr ""
+msgstr "."
msgid "/"
-msgstr ""
+msgstr "/"
msgid "/day"
-msgstr ""
+msgstr "/天"
msgid "0 bytes"
-msgstr ""
+msgstr "0 ä½å…ƒçµ„"
+
+msgid "1 Code quality finding"
+msgid_plural "%d Code quality findings"
+msgstr[0] ""
msgid "1 Day"
msgid_plural "%d Days"
@@ -1239,7 +1264,7 @@ msgstr[0] "%d天"
msgid "1 Issue"
msgid_plural "%d Issues"
-msgstr[0] ""
+msgstr[0] "%d 個議題"
msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
@@ -1255,19 +1280,19 @@ msgstr[0] "%d天"
msgid "1 day remaining"
msgid_plural "%d days remaining"
-msgstr[0] ""
+msgstr[0] "剩餘 %d 天"
msgid "1 day selected"
msgid_plural "%d days selected"
-msgstr[0] ""
+msgstr[0] "å·²é¸å– %d 天"
msgid "1 deploy key"
msgid_plural "%d deploy keys"
-msgstr[0] ""
+msgstr[0] "%d 個部署金鑰"
msgid "1 follower"
msgid_plural "%{count} followers"
-msgstr[0] ""
+msgstr[0] "%{count} ä½é—œæ³¨è€…"
msgid "1 group"
msgid_plural "%d groups"
@@ -1279,11 +1304,11 @@ msgstr[0] "%d時"
msgid "1 issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
+msgstr[0] "å·²é¸å– %d 個議題"
msgid "1 merge request selected"
msgid_plural "%d merge requests selected"
-msgstr[0] ""
+msgstr[0] "å·²é¸å– %d 個åˆä½µè«‹æ±‚"
msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
@@ -1295,7 +1320,7 @@ msgstr[0] "%d分"
msgid "1 month remaining"
msgid_plural "%d months remaining"
-msgstr[0] ""
+msgstr[0] "剩餘 %d 個月"
msgid "1 open issue"
msgid_plural "%{issues} open issues"
@@ -1319,11 +1344,11 @@ msgstr[0] "%{num} ä½ä½¿ç”¨è€…"
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
-msgstr[0] ""
+msgstr[0] "剩餘 %d 週"
msgid "1 year remaining"
msgid_plural "%d years remaining"
-msgstr[0] ""
+msgstr[0] "剩餘 %d 年"
msgid "1-9 contributions"
msgstr "1-9 é …è²¢ç»"
@@ -1332,10 +1357,10 @@ msgid "10-19 contributions"
msgstr "10-19 é …è²¢ç»"
msgid "1000+"
-msgstr ""
+msgstr "1000+"
msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
-msgstr ""
+msgstr "192.168.0.0/24 或 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "您的第一次貢ç»ï¼"
@@ -1356,7 +1381,7 @@ msgid "3 hours"
msgstr "3å°æ™‚"
msgid "30 days"
-msgstr ""
+msgstr "30 天"
msgid "30 minutes"
msgstr "30分é˜"
@@ -1380,47 +1405,50 @@ msgid "404|Please contact your GitLab administrator if you think this is a mista
msgstr "如果您覺得這是失誤,請è¯çµ¡æ‚¨çš„ GitLab 管ç†å“¡ã€‚"
msgid "409|Please contact your GitLab administrator if you think this is a mistake."
-msgstr ""
+msgstr "如果您èªç‚ºé€™æ˜¯ä¸€å€‹éŒ¯èª¤ï¼Œè«‹è¯ç¹«æ‚¨çš„ GitLab 管ç†å“¡ã€‚"
msgid "409|There was a conflict with your request."
-msgstr ""
+msgstr "與您的請求有è¡çªã€‚"
msgid "7 days"
-msgstr ""
+msgstr "7 天"
msgid "8 hours"
msgstr "8å°æ™‚"
msgid ":%{startLine} to %{endLine}"
-msgstr ""
+msgstr ":%{startLine}到%{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
-msgstr ""
+msgstr "%{incident_docs_start}修改了%{incident_docs_end}個議題以解決事件發生的å•é¡Œã€‚"
msgid "A .NET Core console application template, customizable for any .NET Core project"
msgstr ".NET Core 控制å°æ‡‰ç”¨ç¨‹å¼ç¯„本,å¯é‡å°ä»»ä½• .NET Core 專案自訂"
msgid "A CI/CD pipeline must run and be successful before merge."
-msgstr ""
+msgstr "åˆä½µå‰ï¼ŒCI/CD æµç¨‹å¿…須先執行æˆåŠŸã€‚"
msgid "A GitBook site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr ""
+msgstr "GitBook 網站使用 Netlify 來å–代 Gitlab çš„ CI/CD,但ä»ä¿±å‚™å®Œæ•´çš„ GitLab 其他優秀功能"
msgid "A Gitpod configured Webapplication in Spring and Java"
-msgstr ""
+msgstr "Gitpod é€éŽ Spring 與 Java é…ç½® Web 應用程å¼"
msgid "A Hexo site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr ""
+msgstr "Hexo 網站使用 NetLify æ¥å–代 Gitlab çš„ CI/CD,但ä»ä¿±å‚™å®Œæ•´çš„ 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 "Hugo 網站使用 NetLify æ¥å–代 Gitlab çš„ CI/CD,但ä»ä¿±å‚™å®Œæ•´çš„ 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 "Jekyll 網站使用 NetLify æ¥å–代 Gitlab çš„ CI/CD,但ä»ä¿±å‚™å®Œæ•´çš„ GitLab 其他優秀功能"
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "在網域驗證之å‰ï¼Œæˆ‘們無法å–å¾— Encrype SSL 憑證。"
+msgid "A Work Item can be a parent or a child, but not both."
+msgstr ""
+
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "使用 AWS Lambdaã€AWS API é–˜é“åŠ GitLab Pages 的基本é é¢å’Œç„¡ä¼ºæœå™¨åŠŸèƒ½"
@@ -1428,7 +1456,7 @@ msgid "A basic template for developing Linux programs using Kotlin Native"
msgstr ""
msgid "A complete DevOps platform"
-msgstr ""
+msgstr "一個完整的 DevOps å¹³å°"
msgid "A default branch cannot be chosen for an empty project."
msgstr "無法設定空專案的é è¨­åˆ†æ”¯ã€‚"
@@ -1437,25 +1465,25 @@ msgid "A deleted user"
msgstr "已刪除的使用者"
msgid "A different reason"
-msgstr ""
+msgstr "ä¸åŒçš„原因"
msgid "A file has been changed."
-msgstr ""
+msgstr "檔案已被變更。"
msgid "A file was not found."
-msgstr ""
+msgstr "找ä¸åˆ°æª”案。"
msgid "A file with '%{file_name}' already exists in %{branch} branch"
msgstr "「%{file_name}ã€æª”å已經在 %{branch} 分支"
msgid "A file with this name already exists."
-msgstr ""
+msgstr "該檔案å稱已存在。"
msgid "A group is a collection of several projects"
-msgstr ""
+msgstr "群組是數個專案的集åˆã€‚"
msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
-msgstr ""
+msgstr "群組代表您在GitLab中的組織。群組使您å¯ä»¥ç®¡ç†æ•¸å€‹ä½¿ç”¨è€…並跨多個專案進行å”åŒåˆä½œã€‚"
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
@@ -1464,13 +1492,13 @@ msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a p
msgstr ""
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 "被組織所採用的管ç†ã€æ“作或技術控制 (å³ä¿éšœæŽªæ–½æˆ–å°ç­–) åŒæ™‚å¯ç‚ºè³‡è¨Šç³»çµ±æ供相等或類似的ä¿è­·ã€‚"
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "濫用審查團隊æˆå“¡å°‡æœƒå„˜å¿«æª¢é–±æ‚¨çš„報告。"
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
-msgstr ""
+msgstr "新的自動 DevOps æµæ°´ç·šå·²è¢«å»ºç«‹ï¼Œè«‹å‰å¾€æµæ°´ç·šé é¢æŸ¥çœ‹è©³ç´°è¨Šæ¯ã€‚"
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 "%{name} 的新版本 %{tag} å·²ç¶“ç™¼å¸ƒã€‚è«‹å­˜å– %{release_link_start}發布版é é¢%{release_link_end} 了解更多資訊。"
@@ -1479,7 +1507,7 @@ msgid "A new Release %{tag} for %{name} was published. Visit the Releases page t
msgstr "%{name} 的新版本 %{tag} 已經發布。請存å–發布版é é¢äº†è§£æ›´å¤šè³‡è¨Šã€‚"
msgid "A new email address has been added to your GitLab account: %{email}"
-msgstr ""
+msgstr "一個新的電å­éƒµä»¶åœ°å€å·²å¢žåŠ åˆ°æ‚¨çš„ GitLab 帳號: %{email}"
msgid "A new impersonation token has been created."
msgstr "已建立新的身份模擬權æ–。"
@@ -1494,19 +1522,19 @@ msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
msgid "A page with that title already exists"
-msgstr ""
+msgstr "該標題é é¢å·²å­˜åœ¨"
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 "ç´” HTML 網站使用 NetLify æ¥å–代 Gitlab çš„ CI/CD,但ä»ä¿±å‚™å®Œæ•´çš„ GitLab 其他優秀功能"
msgid "A platform value can be web, mob or app."
msgstr ""
msgid "A project boilerplate for Salesforce App development with Salesforce Developer tools"
-msgstr ""
+msgstr "使用 Salesforce Developer 工具開發 Salesforce App 的專案樣æ¿"
msgid "A project boilerplate for Tencent Serverless Framework that uses Next.js SSR"
-msgstr ""
+msgstr "使用 Next.js SSR 的騰訊無伺æœå™¨æž¶æ§‹çš„專案樣æ¿"
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 ""
@@ -1623,13 +1651,13 @@ msgid "APIFuzzing|Show code snippet for the profile"
msgstr ""
msgid "APIFuzzing|Target URL"
-msgstr ""
+msgstr "目標URL"
msgid "APIFuzzing|There are three ways to perform scans."
msgstr ""
msgid "APIFuzzing|Tip: Insert the following variables anywhere below stages and include"
-msgstr ""
+msgstr "Tip:在階段以下的任何ä½ç½®æ’入以下變é‡ï¼Œä¸¦åŒ…括"
msgid "APIFuzzing|Tip: Insert this part below all include"
msgstr ""
@@ -1709,11 +1737,14 @@ msgstr ""
msgid "Access Git repositories or the API."
msgstr ""
+msgid "Access Token"
+msgstr ""
+
msgid "Access Tokens"
msgstr "å­˜å–憑證"
msgid "Access denied for your LDAP account."
-msgstr ""
+msgstr "您的 LDAP 帳號被拒絕存å–。"
msgid "Access denied: %{error}"
msgstr ""
@@ -1826,6 +1857,12 @@ msgstr ""
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
+msgid "Accessible by any user who is logged in."
+msgstr ""
+
+msgid "Accessible by anyone, regardless of authentication."
+msgstr ""
+
msgid "Account"
msgstr "帳戶"
@@ -1848,19 +1885,19 @@ msgid "AccountValidation|I'll bring my own runners"
msgstr ""
msgid "AccountValidation|In order to use free CI/CD minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
-msgstr ""
+msgstr "為了在共享執行器上使用å…費的CI/CD時數,您需è¦ä½¿ç”¨é©—è­‰é¸é …中的其中一項來驗證您的帳號。 如果您ä¸é¡˜æ供驗證,您å¯ä»¥é€éŽè‡ªå·±çš„執行器æ¥é‹è¡Œæµæ°´ç·šä¸¦ç‚ºæ‚¨çš„專案ç¦ç”¨å…±äº«åŸ·è¡Œå™¨ã€‚"
msgid "AccountValidation|Learn more."
-msgstr ""
+msgstr "了解更多。"
msgid "AccountValidation|Looks like you’ll need to validate your account to use free CI/CD minutes"
-msgstr ""
+msgstr "您需è¦é©—證您的帳號æ‰èƒ½ä½¿ç”¨å…費的 CI/CD 時數"
msgid "AccountValidation|Validate your account"
-msgstr ""
+msgstr "驗證您的帳號"
msgid "AccountValidation|Verification is required to discourage and reduce the abuse on GitLab infrastructure. If you verify with a credit or debit card, %{strong_start}GitLab will not charge your card, it will only be used for validation.%{strong_end} %{learn_more_link}"
-msgstr ""
+msgstr "驗證是為了阻止並減少 GitLab 基礎設施上的濫用。如果您使用信用å¡æˆ–金èžå¡é€²è¡Œé©—證,%{strong_start}GitLab å°‡ä¸æœƒæ”¶å–費用或儲存您的å¡ç‰‡è³‡è¨Šï¼Œåƒ…使用於驗證上,%{strong_end} %{learn_more_link}"
msgid "Acknowledge"
msgstr ""
@@ -1887,7 +1924,7 @@ msgid "Active %{accessTokenTypePlural} (%{totalAccessTokens})"
msgstr ""
msgid "Active %{type} (%{token_length})"
-msgstr ""
+msgstr "使用中 %{type}(%{token_length})"
msgid "Active Sessions"
msgstr "使用中的工作階段"
@@ -1916,9 +1953,6 @@ msgstr "加入變更記錄"
msgid "Add CONTRIBUTING"
msgstr "加入貢ç»è³‡è¨Š"
-msgid "Add Jaeger URL"
-msgstr "加入 Jaeger 網å€"
-
msgid "Add Kubernetes cluster"
msgstr "加入 Kubernetes å¢é›†"
@@ -1949,9 +1983,6 @@ msgstr "加入 GPG 金鑰"
msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
msgstr ""
-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 ""
-
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
msgstr ""
@@ -1979,9 +2010,6 @@ msgstr "加入一般留言至 %{noteableDisplayName}。"
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 new issue"
msgstr ""
@@ -1992,7 +2020,7 @@ msgid "Add a related epic"
msgstr ""
msgid "Add a related issue"
-msgstr ""
+msgstr "增加一個相關議題"
msgid "Add a suffix to Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -2022,7 +2050,7 @@ msgid "Add an impersonation token"
msgstr ""
msgid "Add another link"
-msgstr ""
+msgstr "加入其他éˆæŽ¥"
msgid "Add approval rule"
msgstr "加入核准è¦å‰‡"
@@ -2049,13 +2077,13 @@ msgid "Add comment..."
msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
-msgstr ""
+msgstr "增加æ交訊æ¯ä½œç‚º Asana 任務的留言。%{docs_link}"
msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
-msgstr ""
+msgstr "增加æ交訊æ¯ä½œç‚º Pivotal Tracker 的留言。%{docs_link}"
msgid "Add customer relation contact(s)."
-msgstr ""
+msgstr "新增客戶關係è¯çµ¡äººã€‚"
msgid "Add customer relation contacts"
msgstr ""
@@ -2070,10 +2098,10 @@ msgid "Add email address"
msgstr "加入電å­éƒµä»¶åœ°å€"
msgid "Add email participant(s)"
-msgstr ""
+msgstr "新增電å­éƒµä»¶åƒèˆ‡è€…"
msgid "Add environment"
-msgstr ""
+msgstr "增加環境"
msgid "Add existing confidential %{issuableType}"
msgstr ""
@@ -2157,7 +2185,7 @@ msgid "Add to tree"
msgstr "加入到樹"
msgid "Add topics to projects to help users find them."
-msgstr ""
+msgstr "加入主題到專案以幫助使用者尋找。"
msgid "Add trigger"
msgstr ""
@@ -2172,7 +2200,7 @@ msgid "Add variable"
msgstr ""
msgid "Add vulnerability finding"
-msgstr ""
+msgstr "新增發ç¾çš„æ¼æ´ž"
msgid "Add webhook"
msgstr "加入 Webhook"
@@ -2184,19 +2212,19 @@ msgid "Add/remove"
msgstr ""
msgid "AddContextCommits|Add previously merged commits"
-msgstr ""
+msgstr "加入先å‰å·²åˆä½µçš„æ交紀錄"
msgid "AddContextCommits|Add/remove"
-msgstr ""
+msgstr "新增/移除"
msgid "AddMember|Invite email is invalid"
-msgstr ""
+msgstr "邀請的電å­éƒµä»¶åœ°å€ç„¡æ•ˆ"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
-msgstr ""
+msgstr "超éŽæ¯å¤©é‚€è«‹ %{daily_invites} 次的é™åˆ¶"
msgid "AddMember|Invites cannot be blank"
-msgstr ""
+msgstr "邀請ä¸å¯ç‚ºç©º"
msgid "AddMember|No invite source provided."
msgstr ""
@@ -2231,9 +2259,6 @@ msgstr "此版本新增"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "ç›®å‰çš„ GitLab 實體ä¸å…許加入新應用程å¼ã€‚è«‹è¯çµ¡æ‚¨çš„ GitLab 管ç†å“¡ä»¥ç²å¾—相關權é™ã€‚"
-msgid "Additional Metadata"
-msgstr ""
-
msgid "Additional minutes"
msgstr "é¡å¤–分é˜"
@@ -2283,7 +2308,7 @@ msgid "Adjust how frequently the GitLab UI polls for updates."
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 "在上方調整您的篩é¸/æœå°‹æ¢ä»¶ã€‚如果您èªç‚ºé€™å¯èƒ½æ˜¯ä¸€å€‹éŒ¯èª¤ï¼Œè«‹åƒè€ƒ %{linkStart}Geo故障排除%{linkEnd} 文件以了解更多資訊。"
msgid "Admin"
msgstr ""
@@ -2349,13 +2374,13 @@ msgid "AdminArea|Features"
msgstr ""
msgid "AdminArea|Get security updates from GitLab and stay up to date"
-msgstr ""
+msgstr "從 GitLab å–得安全更新並ä¿æŒæœ€æ–°ç‹€æ…‹"
msgid "AdminArea|Groups"
msgstr ""
msgid "AdminArea|Guest"
-msgstr ""
+msgstr "訪客"
msgid "AdminArea|Included Free in license"
msgstr ""
@@ -2483,6 +2508,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps 網域"
+msgid "AdminSettings|Automatically ban users who download more than a specified number of repositories in a given time."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2555,6 +2583,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|Git abuse rate limit"
+msgstr ""
+
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr ""
@@ -2780,7 +2811,7 @@ msgstr "未啟用兩步驟驗證"
msgid "AdminUsers|2FA Enabled"
msgstr "已啟用兩步驟驗證"
-msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user. Validated users can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|Access"
@@ -2789,6 +2820,9 @@ msgstr ""
msgid "AdminUsers|Access Git repositories"
msgstr ""
+msgid "AdminUsers|Access level"
+msgstr ""
+
msgid "AdminUsers|Access the API"
msgstr ""
@@ -2831,6 +2865,9 @@ msgstr ""
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
+msgid "AdminUsers|Avatar"
+msgstr ""
+
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2858,6 +2895,9 @@ msgstr "å·²å°éŽ–"
msgid "AdminUsers|Blocking user has the following effects:"
msgstr "å°éŽ–使用者具有以下效果:"
+msgid "AdminUsers|Can create group"
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2933,6 +2973,12 @@ msgstr "這就是你ï¼"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
+msgid "AdminUsers|Limits"
+msgstr ""
+
+msgid "AdminUsers|Linkedin"
+msgstr ""
+
msgid "AdminUsers|Locked"
msgstr ""
@@ -2960,6 +3006,9 @@ msgstr "將會ä¿ç•™å€‹äººå°ˆæ¡ˆ"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "個人專案ã€ç¾¤çµ„和使用者歷å²è¨˜éŒ„將維æŒä¸è®Š"
+msgid "AdminUsers|Quota of CI/CD minutes"
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "å–消å‡çµä½¿ç”¨è€…將會:"
@@ -2978,6 +3027,9 @@ msgstr ""
msgid "AdminUsers|Rejected users:"
msgstr ""
+msgid "AdminUsers|Reset link will be generated and sent to the user. User will be forced to set the password on first sign in."
+msgstr ""
+
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "還原使用者存å–帳戶的權é™ï¼ŒåŒ…括網é ã€Git å’Œ API。"
@@ -2990,9 +3042,15 @@ msgstr "æœå°‹ä½¿ç”¨è€…"
msgid "AdminUsers|Send email to users"
msgstr "å‘使用者傳é€é›»å­éƒµä»¶"
+msgid "AdminUsers|Skype"
+msgstr ""
+
msgid "AdminUsers|Sort by"
msgstr "排åºæ–¹å¼"
+msgid "AdminUsers|The maximum number of CI/CD minutes on shared runners that a group can use each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
+
msgid "AdminUsers|The user can't access git repositories."
msgstr ""
@@ -3041,9 +3099,6 @@ msgstr ""
msgid "AdminUsers|User administration"
msgstr ""
-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"
msgstr "ä½¿ç”¨è€…å°‡ç„¡æ³•å­˜å– git 版本庫"
@@ -3062,6 +3117,9 @@ msgstr ""
msgid "AdminUsers|View pending member requests"
msgstr ""
+msgid "AdminUsers|Website URL"
+msgstr ""
+
msgid "AdminUsers|What can I do?"
msgstr ""
@@ -3128,6 +3186,9 @@ msgstr ""
msgid "Administration"
msgstr ""
+msgid "Administrators"
+msgstr ""
+
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 ""
@@ -3608,6 +3669,9 @@ msgstr ""
msgid "All threads resolved!"
msgstr ""
+msgid "All users in this group must set up two-factor authentication"
+msgstr ""
+
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
msgstr ""
@@ -3620,12 +3684,6 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "å…許「%{group_name}ã€ä»¥æ‚¨çš„身份登入"
-msgid "Allow access only to members of this group"
-msgstr ""
-
-msgid "Allow access to everyone"
-msgstr ""
-
msgid "Allow access to members of the following group"
msgstr ""
@@ -3668,9 +3726,6 @@ msgstr "å…許該群組內的專案使用 Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
-msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
-
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3683,9 +3738,6 @@ msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "å…許使用者註冊任何應用程å¼ï¼Œä½¿ç”¨ GitLab 作為 OAuth æ供者"
-msgid "Allow users to request access (if visibility is public or internal)"
-msgstr "å…許使用者請求存å–(如果å¯è¦‹æ€§æ˜¯å…¬é–‹æˆ–內部)"
-
msgid "Allowed"
msgstr ""
@@ -3698,12 +3750,18 @@ msgstr "åªå…許頂層群組使用電å­éƒµä»¶ç¶²åŸŸé™åˆ¶"
msgid "Allowed to create:"
msgstr ""
+msgid "Allowed to delete projects"
+msgstr ""
+
msgid "Allowed to fail"
msgstr "å…許失敗"
msgid "Allows projects or subgroups in this group to override the global setting."
msgstr ""
+msgid "Allows projects to track errors using an Opstrace integration."
+msgstr ""
+
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "讓你能加入åŠç®¡ç† Kubernetes å¢é›†ã€‚"
@@ -3863,6 +3921,9 @@ msgstr ""
msgid "An error occurred while fetching ancestors"
msgstr ""
+msgid "An error occurred while fetching branches."
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4082,6 +4143,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while retrieving your settings. Reload the page to try again."
+msgstr ""
+
msgid "An error occurred while saving changes: %{error}"
msgstr ""
@@ -4089,6 +4153,9 @@ msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
msgstr[0] ""
+msgid "An error occurred while saving your settings. Try saving them again."
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "訂閱通知時發生錯誤。"
@@ -4288,7 +4355,7 @@ msgid "Application"
msgstr ""
msgid "Application ID"
-msgstr ""
+msgstr "æ‡‰ç”¨ç¨‹å¼ ID"
msgid "Application limits saved successfully"
msgstr ""
@@ -4296,6 +4363,9 @@ msgstr ""
msgid "Application settings saved successfully"
msgstr ""
+msgid "Application settings saved successfully."
+msgstr ""
+
msgid "Application settings update failed"
msgstr ""
@@ -4675,7 +4745,7 @@ msgstr "已歸檔專案ï¼ç‰ˆæœ¬åº«å’Œå…¶ä»–專案資æºå‡ç‚ºå”¯è®€"
msgid "Archived projects"
msgstr "歸檔專案"
-msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
@@ -4778,6 +4848,9 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr "您確定è¦ç§»é™¤ %{group_name} 嗎?"
+msgid "Are you sure you want to remove %{topic_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove the attachment?"
msgstr "您確定è¦ç§»é™¤æ­¤é™„件嗎?"
@@ -4796,6 +4869,9 @@ msgstr ""
msgid "Are you sure you want to remove this nickname?"
msgstr ""
+msgid "Are you sure you want to reset the error tracking access token?"
+msgstr ""
+
msgid "Are you sure you want to reset the health check token?"
msgstr ""
@@ -4913,6 +4989,9 @@ msgstr ""
msgid "Assign milestone"
msgstr ""
+msgid "Assign myself"
+msgstr ""
+
msgid "Assign reviewer"
msgstr ""
@@ -5007,9 +5086,6 @@ msgstr ""
msgid "Attach a file"
msgstr ""
-msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr ""
-
msgid "Attaching File - %{progress}"
msgstr ""
@@ -5080,6 +5156,9 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|A header with this name already exists."
+msgstr ""
+
msgid "AuditStreams|Active"
msgstr ""
@@ -5104,6 +5183,9 @@ msgstr ""
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Custom HTTP headers"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5113,6 +5195,12 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
+msgid "AuditStreams|Header"
+msgstr ""
+
+msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -5128,6 +5216,9 @@ msgstr ""
msgid "AuditStreams|This is great for keeping everything one place."
msgstr ""
+msgid "AuditStreams|Value"
+msgstr ""
+
msgid "Aug"
msgstr "8月"
@@ -5459,7 +5550,7 @@ msgid "Badges|Example: %{exampleUrl}"
msgstr ""
msgid "Badges|Group Badge"
-msgstr ""
+msgstr "群組徽章"
msgid "Badges|Link"
msgstr ""
@@ -5620,9 +5711,6 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr ""
-msgid "Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
-msgstr ""
-
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -6025,6 +6113,12 @@ msgstr ""
msgid "Billing|You can begin moving members in %{namespaceName} now. A member loses access to the group when you turn off %{strongStart}In a seat%{strongEnd}. If over 5 members have %{strongStart}In a seat%{strongEnd} enabled after June 22, 2022, we'll select the 5 members who maintain access. We'll first count members that have Owner and Maintainer roles, then the most recently active members until we reach 5 members. The remaining members will get a status of Over limit and lose access to the group."
msgstr ""
+msgid "Billing|Your free group is now limited to %{free_user_limit} members"
+msgstr ""
+
+msgid "Billing|Your group recently changed to use the Free plan. Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group. You can free up space for new members by removing those who no longer need access or toggling them to over-limit. To get an unlimited number of members, you can %{link_start}upgrade%{link_end} to a paid tier."
+msgstr ""
+
msgid "Bitbucket Server Import"
msgstr ""
@@ -6044,7 +6138,7 @@ msgid "Block user"
msgstr ""
msgid "Blocked"
-msgstr ""
+msgstr "å·²å°éŽ–"
msgid "Blocked by %d issue"
msgid_plural "Blocked by %d issues"
@@ -6090,7 +6184,7 @@ msgid "BoardNewIssue|No matching results"
msgstr ""
msgid "BoardNewIssue|Projects"
-msgstr ""
+msgstr "專案"
msgid "BoardNewIssue|Search projects"
msgstr ""
@@ -6316,6 +6410,9 @@ msgstr ""
msgid "Bold text"
msgstr ""
+msgid "Both SSH and HTTP(S)"
+msgstr ""
+
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -6341,7 +6438,7 @@ msgid "Branch is already taken"
msgstr ""
msgid "Branch name"
-msgstr ""
+msgstr "分支å稱"
msgid "Branch not loaded - %{branchId}"
msgstr ""
@@ -6637,6 +6734,9 @@ msgstr ""
msgid "BulkImport|must be a group"
msgstr ""
+msgid "Bullet list"
+msgstr ""
+
msgid "Burndown chart"
msgstr ""
@@ -6733,6 +6833,9 @@ msgstr ""
msgid "CICDAnalytics|All time"
msgstr ""
+msgid "CICDAnalytics|Change failure rate"
+msgstr ""
+
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -6773,6 +6876,9 @@ msgstr ""
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
+msgid "CICDAnalytics|Time to restore service"
+msgstr ""
+
msgid "CICDAnalytics|What is shared runner duration?"
msgstr ""
@@ -7100,6 +7206,9 @@ msgstr ""
msgid "Card number:"
msgstr ""
+msgid "CascadingSettings|Enforce deletion protection for all subgroups"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7125,7 +7234,7 @@ msgid "Certain user content will be moved to a system-wide \"Ghost User\" in ord
msgstr ""
msgid "Certificate"
-msgstr ""
+msgstr "憑證"
msgid "Certificate (PEM)"
msgstr ""
@@ -7257,7 +7366,7 @@ msgid "Changed the title to \"%{title_param}\"."
msgstr ""
msgid "Changes"
-msgstr ""
+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 ""
@@ -7271,9 +7380,6 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
-msgid "Changes to free tier open source projects"
-msgstr ""
-
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7519,6 +7625,12 @@ msgstr ""
msgid "Checkout|Group"
msgstr ""
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all over limit members) or more. To buy fewer seats, remove members from the group."
+msgstr ""
+
msgid "Checkout|Name of company or organization using GitLab"
msgstr ""
@@ -7570,9 +7682,6 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
-msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
-msgstr ""
-
msgid "Checkout|Total"
msgstr ""
@@ -7636,6 +7745,9 @@ msgstr ""
msgid "Child issues and epics"
msgstr ""
+msgid "Children"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7869,7 +7981,7 @@ msgid "Clear repository checks"
msgstr ""
msgid "Clear search"
-msgstr ""
+msgstr "清除æœå°‹"
msgid "Clear search input"
msgstr ""
@@ -8009,6 +8121,9 @@ msgstr ""
msgid "Closed MRs"
msgstr ""
+msgid "Closed date"
+msgstr ""
+
msgid "Closed issues"
msgstr ""
@@ -8027,6 +8142,123 @@ msgstr ""
msgid "Cloud Storage"
msgstr ""
+msgid "CloudSeed|All"
+msgstr ""
+
+msgid "CloudSeed|AlloyDB for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Available database services through which instances may be created"
+msgstr ""
+
+msgid "CloudSeed|Cancel"
+msgstr ""
+
+msgid "CloudSeed|Cloud Firestore"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for Postgres"
+msgstr ""
+
+msgid "CloudSeed|Cloud SQL for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|CloudSQL Instance"
+msgstr ""
+
+msgid "CloudSeed|Create cluster"
+msgstr ""
+
+msgid "CloudSeed|Create database"
+msgstr ""
+
+msgid "CloudSeed|Create instance"
+msgstr ""
+
+msgid "CloudSeed|Database instance is generated within the selected Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|Database instances associated with this project"
+msgstr ""
+
+msgid "CloudSeed|Database version"
+msgstr ""
+
+msgid "CloudSeed|Description"
+msgstr ""
+
+msgid "CloudSeed|Determines memory and virtual cores available to your instance"
+msgstr ""
+
+msgid "CloudSeed|Enhance security by storing database variables in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "CloudSeed|Environment"
+msgstr ""
+
+msgid "CloudSeed|Flexible, scalable NoSQL cloud database for client- and server-side development"
+msgstr ""
+
+msgid "CloudSeed|Fully managed PostgreSQL-compatible service for high-demand workloads"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for MySQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for PostgreSQL"
+msgstr ""
+
+msgid "CloudSeed|Fully managed relational database service for SQL Server"
+msgstr ""
+
+msgid "CloudSeed|Generated database instance is linked to the selected branch or tag"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud Project"
+msgstr ""
+
+msgid "CloudSeed|Google Cloud project"
+msgstr ""
+
+msgid "CloudSeed|I accept Google Cloud pricing and responsibilities involved with managing database instances"
+msgstr ""
+
+msgid "CloudSeed|Instances"
+msgstr ""
+
+msgid "CloudSeed|Learn more about pricing for %{cloudsqlPricingStart}Cloud SQL%{cloudsqlPricingEnd}, %{alloydbPricingStart}Alloy DB%{alloydbPricingEnd}, %{memorystorePricingStart}Memorystore%{memorystorePricingEnd} and %{firestorePricingStart}Firestore%{firestorePricingEnd}."
+msgstr ""
+
+msgid "CloudSeed|Machine type"
+msgstr ""
+
+msgid "CloudSeed|Memorystore for Redis"
+msgstr ""
+
+msgid "CloudSeed|No instances"
+msgstr ""
+
+msgid "CloudSeed|Refs"
+msgstr ""
+
+msgid "CloudSeed|Scalable, secure, and highly available in-memory service for Redis"
+msgstr ""
+
+msgid "CloudSeed|Service"
+msgstr ""
+
+msgid "CloudSeed|Services"
+msgstr ""
+
+msgid "CloudSeed|There are no instances to display."
+msgstr ""
+
+msgid "CloudSeed|Version"
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -8036,9 +8268,6 @@ msgstr ""
msgid "Cluster cache cleared."
msgstr ""
-msgid "Cluster does not exist"
-msgstr ""
-
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
@@ -8403,9 +8632,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
-
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
@@ -8445,6 +8671,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Civo Kubernetes"
+msgstr ""
+
msgid "ClusterIntegration|Clear cluster cache"
msgstr ""
@@ -8490,9 +8719,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable Prometheus integration"
msgstr ""
@@ -8670,10 +8896,16 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd} or reach out to GitLab support."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of November 2022. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgstr ""
+
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
msgstr ""
-msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
msgstr ""
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
@@ -8758,7 +8990,7 @@ msgid "Code Owner"
msgstr ""
msgid "Code Owners"
-msgstr ""
+msgstr "程å¼ç¢¼æ‰€æœ‰è€…"
msgid "Code Quality"
msgstr ""
@@ -8769,6 +9001,12 @@ msgstr ""
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
msgstr ""
+msgid "Code block"
+msgstr ""
+
+msgid "Code can be imported from enabled sources during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8850,6 +9088,9 @@ msgstr ""
msgid "Collector hostname"
msgstr ""
+msgid "Color"
+msgstr ""
+
msgid "ColorWidget|An error occurred while updating color."
msgstr ""
@@ -8884,7 +9125,7 @@ msgid "Commands did not apply"
msgstr ""
msgid "Comment"
-msgstr ""
+msgstr "è©•è«–"
msgid "Comment & resolve thread"
msgstr ""
@@ -9238,6 +9479,9 @@ msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
+msgid "Configure Error Tracking"
+msgstr ""
+
msgid "Configure GitLab"
msgstr ""
@@ -9274,10 +9518,10 @@ msgstr ""
msgid "Configure Sentry integration for error tracking"
msgstr ""
-msgid "Configure Tracing"
+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 a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and CI/CD settings."
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
@@ -9469,9 +9713,6 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
-msgid "Container does not exist"
-msgstr ""
-
msgid "Container must be a project or a group."
msgstr ""
@@ -9688,9 +9929,6 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
-msgid "ContainerRegistry|Root image"
-msgstr ""
-
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -9700,6 +9938,9 @@ msgstr ""
msgid "ContainerRegistry|Set up cleanup"
msgstr ""
+msgid "ContainerRegistry|Show full path"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9911,10 +10152,10 @@ msgid "Contributor"
msgstr ""
msgid "Contributors"
-msgstr ""
+msgstr "è²¢ç»è€…"
msgid "Control emails linked to your account"
-msgstr ""
+msgstr "控制與您帳號關è¯çš„é›»å­éƒµä»¶"
msgid "Control how the GitLab Package Registry functions."
msgstr ""
@@ -10019,7 +10260,7 @@ msgid "Copy labels and milestone from other issue or merge request in this proje
msgstr ""
msgid "Copy link"
-msgstr ""
+msgstr "複製連çµ"
msgid "Copy link URL"
msgstr ""
@@ -10367,7 +10608,7 @@ msgid "Create group"
msgstr ""
msgid "Create group label"
-msgstr ""
+msgstr "建立群組標籤"
msgid "Create issue"
msgstr ""
@@ -10426,6 +10667,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create new..."
+msgstr ""
+
msgid "Create one"
msgstr ""
@@ -10799,7 +11043,7 @@ msgid "Current Branch"
msgstr ""
msgid "Current Project"
-msgstr ""
+msgstr "ç›®å‰å°ˆæ¡ˆ"
msgid "Current forks will keep their visibility level."
msgstr ""
@@ -11117,6 +11361,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Change failure rate"
+msgstr ""
+
msgid "DORA4Metrics|Date"
msgstr ""
@@ -11150,6 +11397,15 @@ msgstr ""
msgid "DORA4Metrics|Number of deployments"
msgstr ""
+msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of failed deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting change failure rate data."
+msgstr ""
+
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -11198,13 +11454,13 @@ 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"
+msgid "DastConfig|DAST CI/CD configuration"
msgstr ""
-msgid "DastConfig|Generate code snippet"
+msgid "DastConfig|Enable DAST to automatically test for vulnerabilities in your project's running application, website, or API, in the CI/CD pipeline. Configuration changes must be applied to your .gitlab-ci.yml file to take effect. For details of all configuration options, see the %{linkStart}GitLab DAST documentation%{linkEnd}."
msgstr ""
-msgid "DastConfig|Scan Configuration"
+msgid "DastConfig|Generate code snippet"
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."
@@ -11336,6 +11592,9 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
+msgid "DastProfiles|Manage %{profileType} profiles"
+msgstr ""
+
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11546,6 +11805,9 @@ msgstr ""
msgid "DastSiteValidation|Meta tag validation"
msgstr ""
+msgid "DastSiteValidation|Not validated"
+msgstr ""
+
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -11748,12 +12010,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default delayed project deletion"
-msgstr ""
-
-msgid "Default deletion delay"
-msgstr ""
-
msgid "Default description template for issues"
msgstr ""
@@ -11766,9 +12022,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default project deletion protection"
-msgstr ""
-
msgid "Default projects limit"
msgstr ""
@@ -11826,6 +12079,9 @@ msgstr ""
msgid "Definition"
msgstr ""
+msgid "Delay 2FA enforcement (hours)"
+msgstr ""
+
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr ""
@@ -11862,9 +12118,6 @@ msgstr ""
msgid "Delete File"
msgstr ""
-msgid "Delete Internal Note"
-msgstr ""
-
msgid "Delete Key"
msgstr ""
@@ -11910,6 +12163,9 @@ msgstr ""
msgid "Delete image repository"
msgstr ""
+msgid "Delete internal note"
+msgstr ""
+
msgid "Delete label"
msgstr ""
@@ -12021,6 +12277,33 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
+msgid "DeletionSettings|All projects are deleted immediately."
+msgstr ""
+
+msgid "DeletionSettings|Deletion protection"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr ""
+
+msgid "DeletionSettings|Keep deleted projects for 1 day"
+msgstr ""
+
+msgid "DeletionSettings|None, delete immediately"
+msgstr ""
+
+msgid "DeletionSettings|Only administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Owners and administrators can delete projects."
+msgstr ""
+
+msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
+msgstr ""
+
msgid "Denied"
msgstr ""
@@ -12153,13 +12436,13 @@ msgstr ""
msgid "DependencyProxy|Enable Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Image list"
+msgid "DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache."
msgstr ""
-msgid "DependencyProxy|Scheduled for deletion"
+msgid "DependencyProxy|Image list"
msgstr ""
-msgid "DependencyProxy|Storage settings"
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|There are no images in the cache"
@@ -12574,12 +12857,6 @@ msgstr ""
msgid "Deprecations|The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
-
-msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
@@ -12668,9 +12945,6 @@ msgstr ""
msgid "DesignManagement|Comment"
msgstr ""
-msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
-
msgid "DesignManagement|Could not add a new comment. Please try again."
msgstr ""
@@ -12713,9 +12987,6 @@ msgstr ""
msgid "DesignManagement|Keep comment"
msgstr ""
-msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
-
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
@@ -12773,6 +13044,9 @@ msgstr ""
msgid "Details (default)"
msgstr ""
+msgid "Details block"
+msgstr ""
+
msgid "Detect host keys"
msgstr ""
@@ -12974,6 +13248,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Diagram (%{language})"
+msgstr ""
+
msgid "Did not delete the source branch."
msgstr ""
@@ -13073,14 +13350,11 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
-msgid "Disable the group-level wiki"
-msgstr ""
-
msgid "Disable two-factor authentication"
msgstr ""
msgid "Disabled"
-msgstr ""
+msgstr "å·²åœç”¨"
msgid "Disabled by %{parent} owner"
msgstr ""
@@ -13242,9 +13516,6 @@ msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
-msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr ""
-
msgid "Does not delete the source branch."
msgstr ""
@@ -13461,10 +13732,10 @@ msgstr ""
msgid "Edit"
msgstr "編輯"
-msgid "Edit %{issuable}"
+msgid "Edit %{name}"
msgstr ""
-msgid "Edit %{name}"
+msgid "Edit %{profileType} profile"
msgstr ""
msgid "Edit Comment"
@@ -13494,9 +13765,6 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
-msgid "Edit Profile"
-msgstr ""
-
msgid "Edit Release"
msgstr ""
@@ -13647,9 +13915,6 @@ msgstr ""
msgid "Elasticsearch reindexing was not started: %{errors}"
msgstr ""
-msgid "Elasticsearch returned status code: %{status_code}"
-msgstr ""
-
msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
@@ -13753,7 +14018,7 @@ msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
msgid "Emails"
-msgstr ""
+msgstr "é›»å­éƒµä»¶"
msgid "Emails sent from Service Desk have this name."
msgstr ""
@@ -13788,9 +14053,6 @@ msgstr ""
msgid "Embed"
msgstr ""
-msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
-
msgid "Empty file"
msgstr ""
@@ -13806,6 +14068,9 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable GitLab Error Tracking"
+msgstr ""
+
msgid "Enable Gitpod"
msgstr ""
@@ -13872,9 +14137,6 @@ msgstr ""
msgid "Enable container expiration caching."
msgstr ""
-msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
-
msgid "Enable email notification"
msgstr ""
@@ -13989,9 +14251,6 @@ msgstr ""
msgid "Enabled OAuth authentication sources"
msgstr ""
-msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -14112,9 +14371,6 @@ msgstr ""
msgid "Environment"
msgstr ""
-msgid "Environment does not have deployments"
-msgstr ""
-
msgid "Environment is required for Stages::MetricEndpointInserter"
msgstr ""
@@ -14214,12 +14470,6 @@ msgstr ""
msgid "Environments|Commit"
msgstr ""
-msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
-
-msgid "Environments|Currently showing all results."
-msgstr ""
-
msgid "Environments|Delete"
msgstr ""
@@ -14256,9 +14506,6 @@ msgstr ""
msgid "Environments|How do I create an environment?"
msgstr ""
-msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
-msgstr ""
-
msgid "Environments|Job"
msgstr ""
@@ -14268,9 +14515,6 @@ msgstr ""
msgid "Environments|Learn more about stopping environments"
msgstr ""
-msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14280,25 +14524,16 @@ msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|No pod selected"
-msgstr ""
-
-msgid "Environments|No pods to display"
-msgstr ""
-
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
-msgstr ""
+msgstr "注æ„:繼續æ“作將終止目å‰ç’°å¢ƒï¼ç”±æ–¼æœªåœ¨%{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}文件中定義「終止環境æ“作ã€ï¼Œå› æ­¤%{emphasisStart}ä¸æœƒ%{emphasisEnd}影響已經存在的部署。"
msgid "Environments|Open"
-msgstr ""
+msgstr "é–‹å•Ÿ"
msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Pod name"
-msgstr ""
-
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy environment"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
@@ -14307,18 +14542,12 @@ msgstr ""
msgid "Environments|Re-deploy to environment"
msgstr ""
-msgid "Environments|Rollback"
-msgstr ""
-
msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Rollback environment %{name}?"
msgstr ""
-msgid "Environments|Select pod"
-msgstr ""
-
msgid "Environments|Show all"
msgstr ""
@@ -14332,25 +14561,22 @@ msgid "Environments|Stopping %{environmentName}"
msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
-msgstr ""
-
-msgid "Environments|There was an error fetching the logs. Please try again."
-msgstr ""
+msgstr "尚無此環境的部署。 %{linkStart} 了解更多關於設定部署。%{linkEnd}"
-msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}retry the latest deployment%{docsEnd} with the commit %{commitId}, for this environment. Are you sure you want to continue?"
msgstr ""
-msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgid "Environments|This action will %{docsStart}roll back this environment%{docsEnd} to a previously successful deployment for commit %{commitId}. Are you sure you want to continue?"
msgstr ""
msgid "Environments|Upcoming"
-msgstr ""
+msgstr "å³å°‡åˆ°ä¾†"
msgid "Environments|Upcoming deployment"
-msgstr ""
+msgstr "å³å°‡éƒ¨ç½²"
msgid "Environments|Updated"
-msgstr ""
+msgstr "已更新"
msgid "Environments|You don't have any environments."
msgstr ""
@@ -14475,6 +14701,9 @@ msgstr ""
msgid "Epics|Something went wrong while updating epics."
msgstr ""
+msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
+msgstr ""
+
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -14587,10 +14816,10 @@ msgid "Error loading project data. Please try again."
msgstr ""
msgid "Error loading template types."
-msgstr ""
+msgstr "載入範本類型時發生錯誤。"
msgid "Error loading template."
-msgstr ""
+msgstr "載入範本時發生錯誤。"
msgid "Error loading viewer"
msgstr ""
@@ -14703,6 +14932,9 @@ msgstr ""
msgid "Error: Unable to find AWS role for current user"
msgstr ""
+msgid "ErrorTracking|Access token is %{token_in_code_tag}"
+msgstr ""
+
msgid "ErrorTracking|Active"
msgstr ""
@@ -14965,6 +15197,9 @@ msgstr ""
msgid "Everyone With Access"
msgstr ""
+msgid "Everyone can access the wiki."
+msgstr ""
+
msgid "Everyone can contribute"
msgstr ""
@@ -15103,7 +15338,7 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires in %{expires_at}"
+msgid "Expires %{preposition} %{expires_at}"
msgstr ""
msgid "Expires on"
@@ -15268,6 +15503,9 @@ msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
+msgid "ExternalWikiService|Enter the URL to the external wiki."
+msgstr ""
+
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15289,6 +15527,10 @@ msgstr ""
msgid "Failed Jobs"
msgstr ""
+msgid "Failed job"
+msgid_plural "Failed jobs"
+msgstr[0] ""
+
msgid "Failed on"
msgstr ""
@@ -15853,7 +16095,7 @@ msgid "File suppressed by a .gitattributes entry or the file's encoding is unsup
msgstr ""
msgid "File templates"
-msgstr ""
+msgstr "檔案範本"
msgid "File too large. Secure Files must be less than %{limit} MB."
msgstr ""
@@ -15966,7 +16208,10 @@ msgstr ""
msgid "Find file"
msgstr ""
-msgid "Fingerprint"
+msgid "Fingerprint (MD5)"
+msgstr ""
+
+msgid "Fingerprint (SHA256)"
msgstr ""
msgid "Fingerprints"
@@ -15975,6 +16220,9 @@ msgstr ""
msgid "Finish editing this message first!"
msgstr ""
+msgid "Finish review"
+msgstr ""
+
msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
@@ -16107,9 +16355,6 @@ msgstr ""
msgid "For more information, go to the "
msgstr ""
-msgid "For more information, see the %{faq_link}."
-msgstr ""
-
msgid "For more information, see the File Hooks documentation."
msgstr ""
@@ -16176,7 +16421,7 @@ msgstr ""
msgid "ForkProject|Visibility level"
msgstr ""
-msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgid "ForkProject|Want to organize several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
@@ -16282,7 +16527,7 @@ msgid "General"
msgstr ""
msgid "General Settings"
-msgstr ""
+msgstr "一般設定"
msgid "General pipelines"
msgstr ""
@@ -16412,9 +16657,6 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
-msgid "Geo|Beta"
-msgstr ""
-
msgid "Geo|Checksummed"
msgstr ""
@@ -16619,15 +16861,9 @@ msgstr ""
msgid "Geo|Primary"
msgstr ""
-msgid "Geo|Primary node"
-msgstr ""
-
msgid "Geo|Primary site"
msgstr ""
-msgid "Geo|Project"
-msgstr ""
-
msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
msgstr ""
@@ -16724,9 +16960,6 @@ msgstr ""
msgid "Geo|Secondary"
msgstr ""
-msgid "Geo|Secondary node"
-msgstr ""
-
msgid "Geo|Secondary site"
msgstr ""
@@ -16775,9 +17008,6 @@ msgstr ""
msgid "Geo|Synced"
msgstr ""
-msgid "Geo|Synced at"
-msgstr ""
-
msgid "Geo|Synchronization"
msgstr ""
@@ -16970,6 +17200,42 @@ msgstr ""
msgid "Git version"
msgstr ""
+msgid "GitAbuse|Excluded users"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories"
+msgstr ""
+
+msgid "GitAbuse|Number of repositories can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories must be a number."
+msgstr ""
+
+msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNumRepos}."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period (seconds)"
+msgstr ""
+
+msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period must be a number."
+msgstr ""
+
+msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
+msgstr ""
+
+msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
+msgstr ""
+
+msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
+msgstr ""
+
+msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
+msgstr ""
+
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
msgstr ""
@@ -16997,6 +17263,9 @@ msgstr ""
msgid "GitLab Billing Team."
msgstr ""
+msgid "GitLab Error Tracking"
+msgstr ""
+
msgid "GitLab Import"
msgstr ""
@@ -17087,9 +17356,6 @@ msgstr ""
msgid "GitLab username"
msgstr ""
-msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
-
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
@@ -17186,6 +17452,9 @@ msgstr ""
msgid "GitLabPages|Unverified"
msgstr ""
+msgid "GitLabPages|Updating your Pages configuration..."
+msgstr ""
+
msgid "GitLabPages|Verified"
msgstr ""
@@ -17291,9 +17560,15 @@ msgstr ""
msgid "Global notification settings"
msgstr ""
+msgid "GlobalSearch| %{search} %{description} %{scope}"
+msgstr ""
+
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Groups"
+msgstr ""
+
msgid "GlobalSearch|Issues I've created"
msgstr ""
@@ -17309,6 +17584,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Projects"
+msgstr ""
+
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
@@ -17330,16 +17608,22 @@ msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a search"
+msgstr ""
+
msgid "GlobalSearch|What are you searching for?"
msgstr ""
-msgid "GlobalSearch|in all GitLab"
+msgid "GlobalSearch|all GitLab"
msgstr ""
-msgid "GlobalSearch|in group"
+msgid "GlobalSearch|group"
msgstr ""
-msgid "GlobalSearch|in project"
+msgid "GlobalSearch|in %{scope}"
+msgstr ""
+
+msgid "GlobalSearch|project"
msgstr ""
msgid "Globally-allowed IP ranges"
@@ -17615,6 +17899,9 @@ msgstr ""
msgid "Group"
msgstr ""
+msgid "Group \"%{group_name}\" was successfully updated."
+msgstr ""
+
msgid "Group %{group_name} couldn't be exported."
msgstr ""
@@ -17768,6 +18055,9 @@ msgstr ""
msgid "Group wikis"
msgstr ""
+msgid "Group-level wiki is disabled."
+msgstr ""
+
msgid "Group: %{group_name}"
msgstr ""
@@ -17777,7 +18067,7 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 90 days"
+msgid "GroupActivityMetrics|Last 30 days"
msgstr ""
msgid "GroupActivityMetrics|Members added"
@@ -17829,7 +18119,7 @@ msgid "GroupRoadmap|No start date – %{dateWord}"
msgstr ""
msgid "GroupRoadmap|Something went wrong while fetching epics"
-msgstr ""
+msgstr "è®€å– å²è©© 時發生錯誤"
msgid "GroupRoadmap|Something went wrong while fetching milestones"
msgstr ""
@@ -17838,7 +18128,7 @@ msgid "GroupRoadmap|Sorry, no epics matched your search"
msgstr ""
msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
-msgstr ""
+msgstr "開發è—圖顯示了å²è©© 沿著時間軸的進展情æ³"
msgid "GroupRoadmap|This quarter"
msgstr ""
@@ -17859,7 +18149,7 @@ msgid "GroupRoadmap|To widen your search, change or remove filters; from %{start
msgstr ""
msgid "GroupRoadmap|Within 3 years"
-msgstr ""
+msgstr "3 年之內"
msgid "GroupSAML|\"persistent\" recommended"
msgstr ""
@@ -17871,19 +18161,19 @@ msgid "GroupSAML|Active SAML Group Links (%{count})"
msgstr ""
msgid "GroupSAML|An error occurred generating your SCIM token. Please try again."
-msgstr ""
+msgstr "ç”Ÿæˆ SCIM 憑證時發生錯誤。請é‡è©¦ã€‚"
msgid "GroupSAML|An error occurred resetting your SCIM token. Please try again."
-msgstr ""
+msgstr "é‡è¨­æ‚¨çš„ SCIM 憑證時發生錯誤。請é‡è©¦ã€‚"
msgid "GroupSAML|Are you sure you want to remove the SAML group link?"
-msgstr ""
+msgstr "您確定è¦ç§»é™¤ SAML 群組連çµï¼Ÿ"
msgid "GroupSAML|Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
msgstr ""
msgid "GroupSAML|Before enforcing SSO, enable SAML authentication."
-msgstr ""
+msgstr "在執行 SSO 之å‰ï¼Œå•Ÿç”¨ SAML èªè­‰ã€‚"
msgid "GroupSAML|Before enforcing SSO-only authentication for Git activity, enable SSO-only authentication for web activity."
msgstr ""
@@ -17892,10 +18182,10 @@ msgid "GroupSAML|Certificate fingerprint"
msgstr ""
msgid "GroupSAML|Configuration"
-msgstr ""
+msgstr "設定"
msgid "GroupSAML|Copy SAML Response XML"
-msgstr ""
+msgstr "複製SAML回應XML"
msgid "GroupSAML|Could not create SAML group link: %{errors}."
msgstr ""
@@ -17916,10 +18206,10 @@ msgid "GroupSAML|Enforce users to have dedicated group-managed accounts for this
msgstr ""
msgid "GroupSAML|Generate a SCIM token"
-msgstr ""
+msgstr "ç”Ÿæˆ SCIM 權æ–"
msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Identity Management."
-msgstr ""
+msgstr "ç”Ÿæˆ SCIM 權æ–以設定系統進行跨域身份管ç†ã€‚"
msgid "GroupSAML|Identifier"
msgstr ""
@@ -17958,10 +18248,10 @@ msgid "GroupSAML|Reset SCIM token"
msgstr ""
msgid "GroupSAML|Role to assign members of this SAML group."
-msgstr ""
+msgstr "指派此 SAML 群組æˆå“¡çš„角色。"
msgid "GroupSAML|SAML Group Links"
-msgstr ""
+msgstr "SAML 群組連çµ"
msgid "GroupSAML|SAML Group Name"
msgstr ""
@@ -17982,13 +18272,13 @@ msgid "GroupSAML|SAML Single Sign On Settings"
msgstr ""
msgid "GroupSAML|SAML group link was successfully removed."
-msgstr ""
+msgstr "SAML 群組連çµå·²æˆåŠŸç§»é™¤ã€‚"
msgid "GroupSAML|SCIM Token"
-msgstr ""
+msgstr "SCIM 權æ–"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
-msgstr ""
+msgstr "SAML權æ–ç°½å憑證的SHA1指紋。請從身份驗證æ供商處抓å–(也å¯ä»¥è¢«ç¨±ç‚ºã€Œæ‹‡æŒ‡ç´‹ã€ï¼‰ã€‚"
msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token again, you need to %{linkStart}reset it%{linkEnd}."
msgstr ""
@@ -18021,16 +18311,16 @@ msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user
msgstr ""
msgid "GroupSAML|recommend persistent ID instead of email"
-msgstr ""
+msgstr "建議使用永久性 ID ,ä¸è¦ä½¿ç”¨é›»å­éƒµä»¶"
msgid "GroupSaml|Copy SCIM API endpoint URL"
-msgstr ""
+msgstr "複製 SCIM API 端點 URL"
msgid "GroupSaml|Copy SCIM token"
msgstr ""
msgid "GroupSaml|SCIM API endpoint URL"
-msgstr ""
+msgstr "SCIM API 端點 URL"
msgid "GroupSaml|Your SCIM token"
msgstr ""
@@ -18044,18 +18334,15 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
-msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
-
-msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
-
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
-msgstr ""
+msgstr "應用於所有å­ç¾¤çµ„,除éžè¢«ç¾¤çµ„所有者覆寫。已加到專案中的群組將失去存å–權é™ã€‚"
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Automatically ban users who download more than the specified number of projects within the specified interval."
+msgstr ""
+
msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
@@ -18066,7 +18353,7 @@ msgid "GroupSettings|Be careful. Changing a group's parent can have unintended s
msgstr ""
msgid "GroupSettings|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
-msgstr ""
+msgstr "無法更新路徑。因為此群組下的專案包å«äº†å®¹å™¨æ˜ åƒåº«çš„Docker映åƒã€‚請先從您的專案中移除映åƒå¾Œé‡è©¦ã€‚"
msgid "GroupSettings|Change group URL"
msgstr ""
@@ -18084,6 +18371,9 @@ msgid "GroupSettings|Configure compliance frameworks to make them available to p
msgstr ""
msgid "GroupSettings|Custom project templates"
+msgstr "自訂專案範本"
+
+msgid "GroupSettings|Customer relations is enabled"
msgstr ""
msgid "GroupSettings|Customize this group's badges."
@@ -18092,19 +18382,16 @@ msgstr ""
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr ""
-msgid "GroupSettings|Disable email notifications"
-msgstr ""
-
-msgid "GroupSettings|Disable group mentions"
+msgid "GroupSettings|Email notifications are disabled"
msgstr ""
-msgid "GroupSettings|Enable customer relations"
+msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|Enable delayed project deletion"
+msgid "GroupSettings|Group members are not notified if the group is mentioned."
msgstr ""
-msgid "GroupSettings|Export group"
+msgid "GroupSettings|Group mentions are disabled"
msgstr ""
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
@@ -18113,46 +18400,52 @@ msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
-msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgid "GroupSettings|Interval (seconds)"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
msgstr ""
-msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgid "GroupSettings|Number of projects"
msgstr ""
-msgid "GroupSettings|Prevent forking outside of the group"
+msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
-msgid "GroupSettings|Prevent forking setting was not saved"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
msgstr ""
-msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgid "GroupSettings|Prevent forking outside of the group"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr "防止分å‰è¨­å®šæœªå„²å­˜"
+
+msgid "GroupSettings|Project download rate limit"
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|Projects in %{group} cannot be shared with other groups"
msgstr ""
-msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgid "GroupSettings|Reporting"
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr ""
msgid "GroupSettings|Select parent group"
+msgstr "é¸æ“‡ä¸Šå±¤ç¾¤çµ„"
+
+msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
msgstr ""
-msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -18161,9 +18454,15 @@ msgstr ""
msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
+msgid "GroupSettings|Set to 0 to disable limiting."
+msgstr ""
+
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The maximum number of unique projects a user can download within the specified interval before they're banned. Set to 0 to disable limiting."
+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 ""
@@ -18174,10 +18473,10 @@ msgid "GroupSettings|There was a problem updating the pipeline settings: %{error
msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "此設定已經應用於 %{ancestor_group},並已覆蓋此å­ç¾¤çµ„的設定。"
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "此設定已應用於 %{ancestor_group}。若è¦èˆ‡å…¶å®ƒç¾¤çµ„共享此群組中的的專案,請è¯çµ¡æ‰€æœ‰è€…覆蓋此設定或者 %{remove_ancestor_share_with_group_lock}。"
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
@@ -18185,7 +18484,7 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
-msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
msgid "GroupSettings|What are badges?"
@@ -18317,9 +18616,6 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
-msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18795,10 +19091,10 @@ msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
msgstr ""
-msgid "Hook was successfully created."
+msgid "Hook was successfully updated."
msgstr ""
-msgid "Hook was successfully updated."
+msgid "Horizontal rule"
msgstr ""
msgid "Hostname"
@@ -18810,9 +19106,6 @@ msgstr ""
msgid "Hour (UTC)"
msgstr ""
-msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
-
msgid "Housekeeping"
msgstr ""
@@ -18972,15 +19265,66 @@ msgstr ""
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
+msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
+msgstr ""
+
msgid "IdentityVerification|Create a project"
msgstr ""
+msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
+msgstr ""
+
+msgid "IdentityVerification|Help us protect your account"
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
+msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
+msgstr ""
+
+msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
+msgstr ""
+
+msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
+msgstr ""
+
+msgid "IdentityVerification|Please enter a valid code"
+msgstr ""
+
+msgid "IdentityVerification|Resend code"
+msgstr ""
+
+msgid "IdentityVerification|The code has expired. Resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|The code is incorrect. Enter it again, or resend a new code."
+msgstr ""
+
+msgid "IdentityVerification|Verification code"
+msgstr ""
+
+msgid "IdentityVerification|Verification successful"
+msgstr ""
+
+msgid "IdentityVerification|Verify code"
+msgstr ""
+
msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or resend a new code and try again."
+msgstr ""
+
+msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment or %{redirect_url_start}click here%{redirect_url_end} to refresh."
+msgstr ""
+
+msgid "IdentityVerification|Your verification code expires after %{expires_in_minutes} minutes."
+msgstr ""
+
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -20088,9 +20432,15 @@ msgstr ""
msgid "Incident|Alert details"
msgstr ""
+msgid "Incident|Are you sure you want to delete this event?"
+msgstr ""
+
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
+msgid "Incident|Delete event"
+msgstr ""
+
msgid "Incident|Delete image"
msgstr ""
@@ -20103,12 +20453,30 @@ msgstr ""
msgid "Incident|Editing %{filename}"
msgstr ""
+msgid "Incident|Error creating incident timeline event: %{error}"
+msgstr ""
+
+msgid "Incident|Error deleting incident timeline event: %{error}"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
msgid "Incident|No timeline items have been added yet."
msgstr ""
+msgid "Incident|Save and add another event"
+msgstr ""
+
+msgid "Incident|Something went wrong while creating the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while deleting the incident timeline event."
+msgstr ""
+
+msgid "Incident|Something went wrong while fetching incident timeline events."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20121,6 +20489,12 @@ msgstr ""
msgid "Incident|Timeline"
msgstr ""
+msgid "Incident|Timeline text"
+msgstr ""
+
+msgid "Incident|Timeline text..."
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20250,9 +20624,6 @@ msgstr ""
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
-msgid "Insert a code block"
-msgstr ""
-
msgid "Insert a quote"
msgstr ""
@@ -20392,6 +20763,9 @@ msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
msgstr ""
+msgid "Integrations|An event will be triggered when one of the following items happen."
+msgstr ""
+
msgid "Integrations|Branches for which notifications are to be sent"
msgstr ""
@@ -20404,10 +20778,13 @@ msgstr ""
msgid "Integrations|Comment settings:"
msgstr ""
+msgid "Integrations|Configure the scope of notifications."
+msgstr ""
+
msgid "Integrations|Connection details"
msgstr ""
-msgid "Integrations|Connection failed. Please check your settings."
+msgid "Integrations|Connection failed. Check your integration settings."
msgstr ""
msgid "Integrations|Connection successful."
@@ -20500,6 +20877,9 @@ msgstr ""
msgid "Integrations|No linked namespaces"
msgstr ""
+msgid "Integrations|Notification settings"
+msgstr ""
+
msgid "Integrations|Projects using custom settings"
msgstr ""
@@ -20515,6 +20895,9 @@ msgstr ""
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
msgstr ""
+msgid "Integrations|Restrict to branch (optional)"
+msgstr ""
+
msgid "Integrations|Return to GitLab for Jira"
msgstr ""
@@ -20560,6 +20943,9 @@ msgstr ""
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
+msgid "Integrations|Trigger"
+msgstr ""
+
msgid "Integrations|Use custom settings"
msgstr ""
@@ -20641,6 +21027,9 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
+msgid "Invalid"
+msgstr ""
+
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20653,15 +21042,6 @@ msgstr ""
msgid "Invalid URL: %{url}"
msgstr ""
-msgid "Invalid container_name"
-msgstr ""
-
-msgid "Invalid cursor parameter"
-msgstr ""
-
-msgid "Invalid cursor value provided"
-msgstr ""
-
msgid "Invalid date"
msgstr ""
@@ -20704,9 +21084,6 @@ msgstr ""
msgid "Invalid pin code."
msgstr ""
-msgid "Invalid pod_name"
-msgstr ""
-
msgid "Invalid policy type"
msgstr ""
@@ -20716,15 +21093,12 @@ msgstr ""
msgid "Invalid repository path"
msgstr ""
-msgid "Invalid search parameter"
+msgid "Invalid rule"
msgstr ""
msgid "Invalid server response"
msgstr ""
-msgid "Invalid start or end time format"
-msgstr ""
-
msgid "Invalid status"
msgstr ""
@@ -20860,6 +21234,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Review the invite errors and try again:"
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20875,6 +21252,10 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+msgid "InviteMembersModal|The following member couldn't be invited"
+msgid_plural "InviteMembersModal|The following %d members couldn't be invited"
+msgstr[0] ""
+
msgid "InviteMembersModal|This feature is disabled until this group has space for more members."
msgstr ""
@@ -20986,6 +21367,9 @@ msgstr ""
msgid "Invited"
msgstr ""
+msgid "Invited group allowed email domains must contain a subset of the allowed email domains of the root ancestor group. Go to the group's 'Settings &gt; General' page and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,15 +21553,9 @@ msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
-
msgid "IssueTracker|The URL to the project in the external issue tracker."
msgstr ""
-msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
-
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
msgstr ""
@@ -21496,9 +21874,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "Jaeger URL"
-msgstr ""
-
msgid "Jan"
msgstr "1月"
@@ -21535,9 +21910,15 @@ msgstr ""
msgid "Jira-GitLab user mapping template"
msgstr ""
+msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
+msgstr ""
+
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr ""
+msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
@@ -21556,6 +21937,9 @@ msgstr ""
msgid "JiraConnect|New branch was successfully created."
msgstr ""
+msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgstr ""
+
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr ""
@@ -21859,6 +22243,9 @@ msgstr ""
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
+msgid "Job|%{searchLength} results found for %{searchTerm}"
+msgstr ""
+
msgid "Job|Are you sure you want to erase this job log and artifacts?"
msgstr ""
@@ -21898,12 +22285,18 @@ msgstr ""
msgid "Job|Job has been erased by %{userLink}"
msgstr ""
+msgid "Job|Job log search"
+msgstr ""
+
msgid "Job|Keep"
msgstr ""
msgid "Job|Manual"
msgstr ""
+msgid "Job|No search results found"
+msgstr ""
+
msgid "Job|Passed"
msgstr ""
@@ -21928,6 +22321,12 @@ msgstr ""
msgid "Job|Scroll to top"
msgstr ""
+msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
+msgstr ""
+
+msgid "Job|Search job log"
+msgstr ""
+
msgid "Job|Show complete raw"
msgstr ""
@@ -21964,6 +22363,9 @@ msgstr ""
msgid "Job|Waiting for resource"
msgstr ""
+msgid "Job|We could not find this element"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22081,9 +22483,6 @@ msgstr ""
msgid "Kubernetes"
msgstr ""
-msgid "Kubernetes API returned status code: %{error_code}"
-msgstr ""
-
msgid "Kubernetes Cluster"
msgstr ""
@@ -22159,6 +22558,10 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label added: %{labels}"
+msgid_plural "Labels added: %{labels}"
+msgstr[0] ""
+
msgid "Label priority"
msgstr ""
@@ -22382,9 +22785,6 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
-msgid "Learn GitLab|Trial only"
-msgstr ""
-
msgid "Learn More"
msgstr ""
@@ -22400,9 +22800,6 @@ msgstr ""
msgid "Learn more"
msgstr ""
-msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
-msgstr ""
-
msgid "Learn more about %{username}"
msgstr ""
@@ -22463,19 +22860,19 @@ msgstr ""
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Add merge request approval"
+msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr ""
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
-msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgid "LearnGitLab|Create a repository"
msgstr ""
-msgid "LearnGitLab|Create an issue"
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
msgstr ""
-msgid "LearnGitLab|Create or import a repository"
+msgid "LearnGitLab|Create an issue"
msgstr ""
msgid "LearnGitLab|Create or import your first repository into your new project."
@@ -22520,22 +22917,25 @@ msgstr ""
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
-msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgid "LearnGitLab|Scan dependencies for licenses"
msgstr ""
-msgid "LearnGitLab|Set up CI/CD"
+msgid "LearnGitLab|Scan dependencies for vulnerabilities"
msgstr ""
-msgid "LearnGitLab|Set up your workspace"
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
-msgid "LearnGitLab|Set-up CI/CD"
+msgid "LearnGitLab|Set up CI/CD"
msgstr ""
-msgid "LearnGitLab|Start a free Ultimate trial"
+msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr ""
-msgid "LearnGitLab|Submit a merge request"
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Start a free trial of GitLab Ultimate"
msgstr ""
msgid "LearnGitLab|Submit a merge request (MR)"
@@ -22553,6 +22953,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|- Included in trial"
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -22562,9 +22965,6 @@ msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
-msgid "LearnGitlab|Trial only"
-msgstr ""
-
msgid "LearnGitlab|View administrator list"
msgstr ""
@@ -23054,9 +23454,6 @@ msgstr ""
msgid "Logs"
msgstr ""
-msgid "Logs|To see the logs, deploy your code to an environment."
-msgstr ""
-
msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
msgstr ""
@@ -23144,9 +23541,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23156,9 +23550,6 @@ msgstr ""
msgid "Manage access"
msgstr ""
-msgid "Manage all notifications"
-msgstr ""
-
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -23297,6 +23688,9 @@ msgstr ""
msgid "Marked this %{noun} as a draft."
msgstr ""
+msgid "Marked this %{noun} as ready."
+msgstr ""
+
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23309,6 +23703,9 @@ msgstr ""
msgid "Marks this %{noun} as a draft."
msgstr ""
+msgid "Marks this %{noun} as ready."
+msgstr ""
+
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23878,12 +24275,18 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request locked."
+msgstr ""
+
msgid "Merge request not merged"
msgstr ""
msgid "Merge request reports"
msgstr ""
+msgid "Merge request unlocked."
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -24049,7 +24452,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
msgstr ""
msgid "Merged"
@@ -24076,6 +24479,9 @@ msgstr ""
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
+msgid "Mermaid diagram"
+msgstr ""
+
msgid "Message"
msgstr ""
@@ -24425,9 +24831,6 @@ msgstr ""
msgid "Metrics|View documentation"
msgstr ""
-msgid "Metrics|View logs"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
@@ -24583,16 +24986,16 @@ msgid "Milestones|Delete milestone"
msgstr ""
msgid "Milestones|Delete milestone %{milestoneTitle}?"
-msgstr ""
+msgstr "刪除里程碑 %{milestoneTitle} ?"
msgid "Milestones|Failed to delete milestone %{milestoneTitle}"
-msgstr ""
+msgstr "刪除里程碑 %{milestoneTitle} 時發生錯誤"
msgid "Milestones|Group Milestone"
msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
-msgstr ""
+msgstr "找ä¸åˆ°é‡Œç¨‹ç¢‘ %{milestoneTitle}"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -24604,7 +25007,7 @@ msgid "Milestones|Project Milestone"
msgstr ""
msgid "Milestones|Promote %{milestoneTitle} to group milestone?"
-msgstr ""
+msgstr "å°‡ %{milestoneTitle} å‡ç´šç‚ºç¾¤çµ„里程碑?"
msgid "Milestones|Promote Milestone"
msgstr ""
@@ -24864,6 +25267,21 @@ msgstr ""
msgid "MrList|Review requested from %{name}"
msgstr ""
+msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
+msgstr ""
+
+msgid "MrSurvey|How satisfied are you with %{strongStart}speed/performance%{strongEnd} of merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Merge request experience survey"
+msgstr ""
+
+msgid "MrSurvey|Overall, how satisfied are you with merge requests?"
+msgstr ""
+
+msgid "MrSurvey|Thank you for your feedback!"
+msgstr ""
+
msgid "Multi-project"
msgstr ""
@@ -24876,9 +25294,6 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple domains are supported."
-msgstr ""
-
msgid "Multiple model types found: %{model_types}"
msgstr ""
@@ -24900,6 +25315,9 @@ msgstr ""
msgid "My-Reaction"
msgstr ""
+msgid "NEW"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -24924,9 +25342,6 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
-msgid "Namespace is empty"
-msgstr ""
-
msgid "Namespace:"
msgstr ""
@@ -25012,10 +25427,10 @@ msgstr ""
msgid "NavigationTheme|Blue"
msgstr ""
-msgid "NavigationTheme|Dark"
+msgid "NavigationTheme|Dark Mode (alpha)"
msgstr ""
-msgid "NavigationTheme|Dark Mode (alpha)"
+msgid "NavigationTheme|Gray"
msgstr ""
msgid "NavigationTheme|Green"
@@ -25024,10 +25439,10 @@ msgstr ""
msgid "NavigationTheme|Indigo"
msgstr ""
-msgid "NavigationTheme|Light"
+msgid "NavigationTheme|Light Blue"
msgstr ""
-msgid "NavigationTheme|Light Blue"
+msgid "NavigationTheme|Light Gray"
msgstr ""
msgid "NavigationTheme|Light Green"
@@ -25181,16 +25596,13 @@ msgstr ""
msgid "New epic title"
msgstr ""
-msgid "New file"
+msgid "New error tracking access token has been generated!"
msgstr ""
-msgid "New group"
-msgstr ""
-
-msgid "New group URL"
+msgid "New file"
msgstr ""
-msgid "New group name"
+msgid "New group"
msgstr ""
msgid "New health check access token has been generated!"
@@ -25286,9 +25698,6 @@ msgstr ""
msgid "New! Suggest changes directly"
msgstr ""
-msgid "New..."
-msgstr ""
-
msgid "Newest first"
msgstr ""
@@ -25343,6 +25752,9 @@ msgstr ""
msgid "No Scopes"
msgstr ""
+msgid "No Work Item Link found"
+msgstr ""
+
msgid "No active admin user found"
msgstr ""
@@ -25373,6 +25785,9 @@ msgstr ""
msgid "No branches found"
msgstr ""
+msgid "No change to this %{noun}'s draft status."
+msgstr ""
+
msgid "No changes"
msgstr ""
@@ -25397,9 +25812,6 @@ msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
-msgid "No containers available"
-msgstr ""
-
msgid "No contributions"
msgstr ""
@@ -25490,6 +25902,9 @@ msgstr ""
msgid "No matches found"
msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID."
+msgstr ""
+
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
@@ -25535,9 +25950,6 @@ msgstr ""
msgid "No plan"
msgstr ""
-msgid "No pods available"
-msgstr ""
-
msgid "No policy matches this license"
msgstr ""
@@ -25574,6 +25986,9 @@ msgstr ""
msgid "No repository"
msgstr ""
+msgid "No results"
+msgstr ""
+
msgid "No runner executable"
msgstr ""
@@ -25752,9 +26167,15 @@ msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
+msgid "Notes|Expand replies"
+msgstr ""
+
msgid "Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher"
msgstr ""
+msgid "Notes|Last reply by %{name}"
+msgstr ""
+
msgid "Notes|Make this an internal note"
msgstr ""
@@ -25894,21 +26315,48 @@ msgstr ""
msgid "Notifications on"
msgstr ""
+msgid "Notifications turned off."
+msgstr ""
+
+msgid "Notifications turned on."
+msgstr ""
+
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
msgstr ""
+msgid "Notify|%{commit_link} in %{mr_link}"
+msgstr ""
+
+msgid "Notify|Assignee changed from %{fromNames} to %{toNames}"
+msgstr ""
+
+msgid "Notify|Assignee changed to %{toNames}"
+msgstr ""
+
msgid "Notify|Author: %{author_name}"
msgstr ""
+msgid "Notify|Auto DevOps pipeline was disabled for %{project}"
+msgstr ""
+
+msgid "Notify|CI/CD project settings"
+msgstr ""
+
+msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
+msgstr ""
+
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr ""
msgid "Notify|Issue was moved to another project."
msgstr ""
+msgid "Notify|Learn more about Auto DevOps"
+msgstr ""
+
msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
msgstr ""
@@ -25921,18 +26369,42 @@ msgstr ""
msgid "Notify|Merge request %{merge_request} was merged"
msgstr ""
+msgid "Notify|Merge request %{mr_link} was closed by %{closed_by}"
+msgstr ""
+
msgid "Notify|Merge request URL: %{merge_request_url}"
msgstr ""
+msgid "Notify|Milestone changed to %{milestone}"
+msgstr ""
+
msgid "Notify|New issue: %{project_issue_url}"
msgstr ""
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
+msgstr ""
+
msgid "Notify|This issue is due on: %{issue_due_date}"
msgstr ""
+msgid "Notify|Unless you verify your domain by %{time_start}%{time}%{time_end} it will be removed from your GitLab project."
+msgstr ""
+
msgid "Notify|You don't have access to the project."
msgstr ""
+msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
+msgstr ""
+
+msgid "Notify|currently supported languages"
+msgstr ""
+
+msgid "Notify|successfully completed %{jobs} in %{stages}."
+msgstr ""
+
msgid "Nov"
msgstr "11月"
@@ -26405,6 +26877,9 @@ msgid "One more item"
msgid_plural "%d more items"
msgstr[0] ""
+msgid "One or more arguments are invalid: %{args}."
+msgstr ""
+
msgid "One or more contacts were successfully added."
msgstr ""
@@ -26429,7 +26904,7 @@ msgstr ""
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
-msgid "Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}."
+msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
msgstr ""
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
@@ -26438,22 +26913,22 @@ msgstr ""
msgid "Only 1 appearances row can exist"
msgstr ""
-msgid "Only Issue ID or merge request ID is required"
+msgid "Only HTTP(S)"
msgstr ""
-msgid "Only Issue can be parent of Task."
+msgid "Only Issue ID or merge request ID is required"
msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only Task can be assigned as a child in hierarchy."
+msgid "Only SSH"
msgstr ""
-msgid "Only active projects show up in the search and on the dashboard."
+msgid "Only accessible by %{membersPageLinkStart}project members%{membersPageLinkEnd}. Membership must be explicitly granted to each user."
msgstr ""
-msgid "Only admins can delete project"
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
@@ -26462,12 +26937,15 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only group members with at least Reporter role can view or be notified about this epic."
+msgid "Only group members with at least the Reporter role can view or be notified about this epic"
msgstr ""
msgid "Only include features new to your current subscription tier."
msgstr ""
+msgid "Only members of this group can access the wiki."
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -26489,10 +26967,10 @@ msgstr ""
msgid "Only use lowercase letters, numbers, and underscores."
msgstr ""
-msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgid "Only users from the specified IP address ranges can reach this group, including all subgroups, projects, and Git repositories."
msgstr ""
-msgid "Only verified users with an email address in any of these domains can be added to the group."
+msgid "Only verified users with an email address in any of these domains can be added to the group. Multiple domains are supported."
msgstr ""
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
@@ -26588,6 +27066,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr ""
+msgid "Opstrace endpoint for Error Tracking integration"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26606,6 +27087,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
+msgid "Ordered list"
+msgstr ""
+
msgid "Organizations"
msgstr ""
@@ -26696,6 +27180,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners and administrators"
+msgstr ""
+
msgid "Owners can modify this selection."
msgstr ""
@@ -26780,12 +27267,6 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
-msgstr ""
-
-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}"
msgstr ""
@@ -26804,7 +27285,10 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
-msgid "PackageRegistry|Allow duplicates"
+msgid "PackageRegistry|Additional metadata"
+msgstr ""
+
+msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr ""
msgid "PackageRegistry|App group: %{group}"
@@ -26912,6 +27396,9 @@ msgstr ""
msgid "PackageRegistry|Delete this package"
msgstr ""
+msgid "PackageRegistry|Duplicate packages"
+msgstr ""
+
msgid "PackageRegistry|Error publishing"
msgstr ""
@@ -27027,6 +27514,9 @@ msgstr ""
msgid "PackageRegistry|Registry setup"
msgstr ""
+msgid "PackageRegistry|Reject packages with the same name and version"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -27069,6 +27559,9 @@ msgstr ""
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr ""
+msgid "PackageRegistry|Something went wrong while fetching the package metadata."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -27108,9 +27601,6 @@ 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 ""
@@ -27201,18 +27691,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent already has maximum number of children."
-msgstr ""
-
msgid "Parent epic doesn't exist."
msgstr ""
msgid "Parent epic is not present."
msgstr ""
-msgid "Parent must be in the same project as child."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -27645,6 +28129,24 @@ msgstr ""
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
+msgid "PipelineEditor|Current content in the Edit tab will be used for the simulation."
+msgstr ""
+
+msgid "PipelineEditor|Git push event to the default branch"
+msgstr ""
+
+msgid "PipelineEditor|Other pipeline sources are not available yet."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline Source"
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies."
+msgstr ""
+
+msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}except%{codeEnd} and %{codeStart}needs%{codeEnd} job dependencies. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -27657,6 +28159,15 @@ msgstr ""
msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
msgstr ""
+msgid "PipelineEditor|Validate pipeline"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under selected conditions"
+msgstr ""
+
+msgid "PipelineEditor|Validate pipeline under simulated conditions"
+msgstr ""
+
msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
msgstr ""
@@ -28023,6 +28534,9 @@ msgstr ""
msgid "Pipelines|Use template"
msgstr ""
+msgid "Pipelines|Validate"
+msgstr ""
+
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -28260,6 +28774,9 @@ msgstr ""
msgid "PlantUML URL"
msgstr ""
+msgid "PlantUML diagram"
+msgstr ""
+
msgid "Play"
msgstr "執行"
@@ -28467,12 +28984,6 @@ msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
-msgid "Pod does not exist"
-msgstr ""
-
-msgid "Pod not found"
-msgstr ""
-
msgid "Pods in use"
msgstr ""
@@ -28525,7 +29036,7 @@ msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
-msgstr ""
+msgstr "å好設定"
msgid "Preferences saved."
msgstr ""
@@ -28548,13 +29059,16 @@ msgstr ""
msgid "Preferences|Color for removed lines"
msgstr ""
+msgid "Preferences|Color theme"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
msgid "Preferences|Customize integrations with third party services."
msgstr ""
-msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgid "Preferences|Customize the color of GitLab."
msgstr ""
msgid "Preferences|Customize the colors of removed and added lines in diffs."
@@ -28596,9 +29110,6 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
-msgid "Preferences|Navigation theme"
-msgstr ""
-
msgid "Preferences|Preview"
msgstr ""
@@ -28650,9 +29161,6 @@ msgstr ""
msgid "Prev"
msgstr ""
-msgid "Prevent adding new members to projects within this group"
-msgstr ""
-
msgid "Prevent auto-stopping"
msgstr ""
@@ -28683,6 +29191,9 @@ msgstr ""
msgid "Preview changes"
msgstr ""
+msgid "Preview diagram"
+msgstr ""
+
msgid "Preview payload"
msgstr ""
@@ -28848,9 +29359,6 @@ msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
-msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
-
msgid "Profiles|Active"
msgstr ""
@@ -28863,7 +29371,7 @@ msgstr ""
msgid "Profiles|An error occurred while updating your username, please try again."
msgstr ""
-msgid "Profiles|An indicator appears next to your name and avatar"
+msgid "Profiles|An indicator appears next to your name and avatar."
msgstr ""
msgid "Profiles|Avatar cropper"
@@ -28890,7 +29398,7 @@ msgstr ""
msgid "Profiles|Choose file..."
msgstr ""
-msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
msgstr ""
msgid "Profiles|City, country"
@@ -28905,6 +29413,9 @@ msgstr ""
msgid "Profiles|Connect %{provider}"
msgstr ""
+msgid "Profiles|Connect a service for sign-in."
+msgstr ""
+
msgid "Profiles|Connected Accounts"
msgstr ""
@@ -28932,7 +29443,7 @@ msgstr ""
msgid "Profiles|Do not show on profile"
msgstr ""
-msgid "Profiles|Don't display activity-related personal information on your profile"
+msgid "Profiles|Don't display activity-related personal information on your profile."
msgstr ""
msgid "Profiles|Edit Profile"
@@ -28941,16 +29452,16 @@ msgstr ""
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
msgstr ""
-msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly."
msgstr ""
-msgid "Profiles|Enter your name, so people you know can recognize you"
+msgid "Profiles|Enter your name, so people you know can recognize you."
msgstr ""
msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
-msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr ""
msgid "Profiles|Example: MacBook key"
@@ -28983,7 +29494,7 @@ msgstr ""
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
-msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgid "Profiles|Increase your account's security by enabling two-factor authentication (2FA)."
msgstr ""
msgid "Profiles|Invalid password"
@@ -29070,13 +29581,13 @@ msgstr ""
msgid "Profiles|Select a service to sign in with."
msgstr ""
-msgid "Profiles|Set new profile picture"
+msgid "Profiles|Service sign-in"
msgstr ""
-msgid "Profiles|Set your local time zone"
+msgid "Profiles|Set new profile picture"
msgstr ""
-msgid "Profiles|Social sign-in"
+msgid "Profiles|Set your local time zone."
msgstr ""
msgid "Profiles|Some options are unavailable for LDAP accounts"
@@ -29085,7 +29596,7 @@ msgstr ""
msgid "Profiles|Static object token was successfully reset"
msgstr ""
-msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgid "Profiles|Tell us about yourself in fewer than 250 characters."
msgstr ""
msgid "Profiles|The ability to update your name has been disabled by your administrator."
@@ -29094,16 +29605,16 @@ msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr ""
-msgid "Profiles|This email will be displayed on your public profile"
+msgid "Profiles|This email will be displayed on your public profile."
msgstr ""
-msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more.%{commit_email_link_end}"
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This information will appear on your profile"
+msgid "Profiles|This information will appear on your profile."
msgstr ""
msgid "Profiles|Time settings"
@@ -29112,7 +29623,7 @@ msgstr ""
msgid "Profiles|Title"
msgstr ""
-msgid "Profiles|Two-Factor Authentication"
+msgid "Profiles|Two-factor authentication"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
@@ -29148,7 +29659,7 @@ msgstr ""
msgid "Profiles|What's your status?"
msgstr ""
-msgid "Profiles|Who you represent or work for"
+msgid "Profiles|Who you represent or work for."
msgstr ""
msgid "Profiles|You can change your avatar here"
@@ -29190,6 +29701,9 @@ msgstr ""
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you."
+msgstr ""
+
msgid "Profiles|Your status"
msgstr ""
@@ -29268,7 +29782,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access is granted to members of the group."
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
@@ -29391,6 +29905,9 @@ msgstr ""
msgid "ProjectCreationLevel|No one"
msgstr ""
+msgid "ProjectCreationLevel|Roles allowed to create projects"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -29502,6 +30019,9 @@ msgstr ""
msgid "ProjectSelect|Select a project"
msgstr ""
+msgid "ProjectSelect|Something went wrong while fetching projects"
+msgstr ""
+
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
msgstr ""
@@ -29520,9 +30040,6 @@ msgstr ""
msgid "ProjectService|Enter new token"
msgstr ""
-msgid "ProjectService|Issue URL"
-msgstr ""
-
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -29982,6 +30499,9 @@ msgstr ""
msgid "ProjectSettings|What are merge trains?"
msgstr ""
+msgid "ProjectSettings|What is squashing?"
+msgstr ""
+
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
@@ -30120,6 +30640,9 @@ msgstr ""
msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
+msgid "Projects in this group can use Git LFS"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -30186,7 +30709,7 @@ msgstr ""
msgid "ProjectsNew|Create"
msgstr ""
-msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgid "ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things."
msgstr ""
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
@@ -30246,7 +30769,7 @@ msgstr ""
msgid "ProjectsNew|Visibility Level"
msgstr ""
-msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
msgid "PrometheusAlerts|exceeded"
@@ -30405,6 +30928,9 @@ msgstr ""
msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
+msgid "Promotions|Configure Service Desk"
+msgstr ""
+
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr ""
@@ -30417,6 +30943,9 @@ msgstr ""
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
+msgid "Promotions|Dismiss Service Desk promotion"
+msgstr ""
+
msgid "Promotions|Dismiss burndown charts promotion"
msgstr ""
@@ -30738,6 +31267,9 @@ msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "Provide Feedback"
+msgstr ""
+
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -31050,6 +31582,9 @@ msgstr ""
msgid "Rebase"
msgstr ""
+msgid "Rebase completed"
+msgstr ""
+
msgid "Rebase in progress"
msgstr ""
@@ -31137,9 +31672,6 @@ 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 ""
-
msgid "Refresh the page and try again."
msgstr ""
@@ -31298,6 +31830,9 @@ msgstr ""
msgid "Release assets documentation"
msgstr ""
+msgid "Release date"
+msgstr ""
+
msgid "Release does not have the same project as the milestone"
msgstr ""
@@ -31691,9 +32226,6 @@ msgstr ""
msgid "Replace"
msgstr ""
-msgid "Replace %{blob_name}"
-msgstr ""
-
msgid "Replace %{name}"
msgstr ""
@@ -31721,6 +32253,9 @@ msgstr ""
msgid "Replication"
msgstr ""
+msgid "Reply"
+msgstr ""
+
msgid "Reply by email"
msgstr ""
@@ -31808,6 +32343,12 @@ msgstr ""
msgid "Reports|Classname"
msgstr ""
+msgid "Reports|Copy failed test names to run locally"
+msgstr ""
+
+msgid "Reports|Copy failed tests"
+msgstr ""
+
msgid "Reports|Execution time"
msgstr ""
@@ -32151,9 +32692,6 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -32228,6 +32766,9 @@ msgstr ""
msgid "Reset"
msgstr ""
+msgid "Reset error tracking access token"
+msgstr ""
+
msgid "Reset file"
msgstr ""
@@ -32237,9 +32778,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
-msgstr ""
-
msgid "Reset password"
msgstr ""
@@ -32333,6 +32871,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict access by IP address"
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -32366,12 +32907,6 @@ msgstr ""
msgid "Retry migration"
msgstr ""
-msgid "Retry the downstream pipeline"
-msgstr ""
-
-msgid "Retry the trigger job"
-msgstr ""
-
msgid "Retry this job"
msgstr ""
@@ -32683,6 +33218,9 @@ msgstr ""
msgid "Runners|Group"
msgstr ""
+msgid "Runners|How do we upgrade GitLab runner?"
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
@@ -32807,9 +33345,6 @@ msgstr ""
msgid "Runners|Revision"
msgstr ""
-msgid "Runners|Rocket launch illustration"
-msgstr ""
-
msgid "Runners|Runner"
msgstr ""
@@ -32949,6 +33484,15 @@ msgstr ""
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
msgstr ""
+msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
+msgstr ""
+
+msgid "Runners|Upgrade available"
+msgstr ""
+
+msgid "Runners|Upgrade recommended"
+msgstr ""
+
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
msgstr ""
@@ -33039,6 +33583,21 @@ msgstr ""
msgid "SAML for %{group_name}"
msgstr ""
+msgid "SAML|Selecting \"Authorize\" will transfer ownership of your GitLab account \"%{username}\" (%{email}) to your organization."
+msgstr ""
+
+msgid "SAML|Sign in to GitLab to connect your organization's account"
+msgstr ""
+
+msgid "SAML|The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account."
+msgstr ""
+
+msgid "SAML|To access \"%{group_name}\" you must sign in with your Single Sign-On account, through an external sign-in page."
+msgstr ""
+
+msgid "SAML|Your organization's SSO has been connected to your GitLab account"
+msgstr ""
+
msgid "SAST Configuration"
msgstr ""
@@ -33226,7 +33785,7 @@ msgid "Scroll up"
msgstr ""
msgid "Search"
-msgstr ""
+msgstr "æœå°‹"
msgid "Search GitLab"
msgstr ""
@@ -33307,7 +33866,7 @@ msgid "Search merge requests"
msgstr ""
msgid "Search milestones"
-msgstr ""
+msgstr "æœå°‹é‡Œç¨‹ç¢‘"
msgid "Search or create tag"
msgstr ""
@@ -33322,7 +33881,7 @@ msgid "Search page"
msgstr ""
msgid "Search project"
-msgstr ""
+msgstr "æœå°‹å°ˆæ¡ˆ"
msgid "Search projects"
msgstr ""
@@ -33680,6 +34239,9 @@ msgstr ""
msgid "SecurityOrchestration|+%{count} more"
msgstr ""
+msgid "SecurityOrchestration|, and %{count} more"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml mode"
msgstr ""
@@ -33695,7 +34257,7 @@ msgstr ""
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
msgstr ""
-msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects in this group."
+msgid "SecurityOrchestration|After enabling a group-level policy, this policy automatically applies to all projects and sub-groups in this group."
msgstr ""
msgid "SecurityOrchestration|All policies"
@@ -33740,6 +34302,9 @@ msgstr ""
msgid "SecurityOrchestration|Description"
msgstr ""
+msgid "SecurityOrchestration|Direct"
+msgstr ""
+
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
@@ -33764,9 +34329,15 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Failed to load cluster agents."
+msgstr ""
+
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr ""
+msgid "SecurityOrchestration|Inherited"
+msgstr ""
+
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
@@ -33863,9 +34434,6 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
msgstr ""
-msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
-msgstr ""
-
msgid "SecurityOrchestration|Scan result"
msgstr ""
@@ -33965,6 +34533,9 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan execution policy to create rules which enforce security scans for particular branches at a certain time. Supported types are SAST, DAST, Secret detection, and Container scanning."
+msgstr ""
+
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr ""
@@ -33989,18 +34560,6 @@ msgstr ""
msgid "SecurityOrchestration|branches"
msgstr ""
-msgid "SecurityOrchestration|members of groups"
-msgstr ""
-
-msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group"
-msgstr ""
-
-msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
-
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -34010,12 +34569,6 @@ msgstr ""
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
-msgid "SecurityOrchestration|user with id"
-msgstr ""
-
-msgid "SecurityOrchestration|users with ids"
-msgstr ""
-
msgid "SecurityOrchestration|vulnerabilities"
msgstr ""
@@ -34055,6 +34608,9 @@ msgstr ""
msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
+msgid "SecurityReports|Cluster"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -34280,9 +34836,6 @@ msgstr ""
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
-msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
-
msgid "SecurityReports|Undo dismiss"
msgstr ""
@@ -34361,6 +34914,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
+msgid "Select a branch to compare"
+msgstr ""
+
+msgid "Select a color"
+msgstr ""
+
msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -34475,6 +35034,9 @@ msgstr ""
msgid "Select source branch"
msgstr ""
+msgid "Select source project"
+msgstr ""
+
msgid "Select start date"
msgstr ""
@@ -34496,6 +35058,9 @@ msgstr ""
msgid "Select target branch or tag"
msgstr ""
+msgid "Select target project"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34727,9 +35292,6 @@ msgstr ""
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
-msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
-msgstr ""
-
msgid "Set due date"
msgstr ""
@@ -34784,6 +35346,9 @@ msgstr ""
msgid "Set target branch to %{branch_name}."
msgstr ""
+msgid "Set the Ready status"
+msgstr ""
+
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
@@ -34847,6 +35412,9 @@ msgstr ""
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr ""
+msgid "Set visibility of project contents. Configure import sources and Git access protocols."
+msgstr ""
+
msgid "Set weight"
msgstr ""
@@ -35109,6 +35677,63 @@ msgstr ""
msgid "Show whitespace changes"
msgstr ""
+msgid "ShowcaseSecurity|Access a dedicated area for vulnerability management. This includes a security dashboard, vulnerability report, and settings."
+msgstr ""
+
+msgid "ShowcaseSecurity|Audit your Docker-based app. Scan for known vulnerabilities in the Docker images where your code is shipped."
+msgstr ""
+
+msgid "ShowcaseSecurity|Container scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dependency scanning"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Dynamically examine your application for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable SAST"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Secret Detection"
+msgstr ""
+
+msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "ShowcaseSecurity|Identify vulnerabilities in your code now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your code to detect unintentionally committed secrets, like keys, passwords, and API tokens."
+msgstr ""
+
+msgid "ShowcaseSecurity|Scan your source code using GitLab CI/CD and uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free 30-day Ultimate trial or upgrade your instance to access organization-wide security and compliance features. See the other features of the Ultimate plan."
+msgstr ""
+
+msgid "ShowcaseSecurity|Start a free trial"
+msgstr ""
+
+msgid "ShowcaseSecurity|Take your security to the next level"
+msgstr ""
+
+msgid "ShowcaseSecurity|Upgrade now"
+msgstr ""
+
+msgid "ShowcaseSecurity|Use GitLab CI/CD to analyze your source code for known vulnerabilities. Compare the found vulnerabilities between your source and target branches."
+msgstr ""
+
+msgid "ShowcaseSecurity|Vulnerability management"
+msgstr ""
+
msgid "Showing %{conflict}"
msgstr ""
@@ -35131,9 +35756,6 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
-msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
-msgstr ""
-
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
msgstr ""
@@ -35149,6 +35771,9 @@ msgstr ""
msgid "Showing version #%{versionNumber}"
msgstr ""
+msgid "Shows issues and %{labels_count} labels for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Side-by-side"
msgstr ""
@@ -35470,6 +36095,9 @@ msgstr ""
msgid "Snowplow"
msgstr ""
+msgid "Solid"
+msgstr ""
+
msgid "Solution"
msgstr ""
@@ -35665,9 +36293,6 @@ msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr ""
-msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
-
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -35995,14 +36620,14 @@ msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
-msgid "Spent At"
+msgid "Spent at"
msgstr ""
msgid "Squash commit message"
msgstr ""
msgid "Squash commits"
-msgstr ""
+msgstr "åˆä½µæ交"
msgid "Stack trace"
msgstr ""
@@ -36340,6 +36965,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Store your files, plan your work, collaborate on code, and more."
+msgstr ""
+
msgid "Strikethrough"
msgstr ""
@@ -36361,7 +36989,7 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Allowed to create subgroups"
@@ -36379,6 +37007,9 @@ msgstr ""
msgid "Subgroups and projects"
msgstr ""
+msgid "Subgroups can set up their own two-factor authentication rules"
+msgstr ""
+
msgid "Subject Key Identifier:"
msgstr ""
@@ -36442,6 +37073,9 @@ msgstr ""
msgid "Subscribes to this %{quick_action_target}."
msgstr ""
+msgid "Subscript"
+msgstr ""
+
msgid "Subscription"
msgstr ""
@@ -36748,7 +37382,10 @@ msgstr ""
msgid "Summary"
msgstr ""
-msgid "Summary / Note"
+msgid "Summary / note"
+msgstr ""
+
+msgid "Summary comment (optional)"
msgstr ""
msgid "Sunday"
@@ -36917,6 +37554,9 @@ msgstr ""
msgid "SuperSonics|past subscriptions"
msgstr ""
+msgid "Superscript"
+msgstr ""
+
msgid "Support"
msgstr ""
@@ -36929,6 +37569,21 @@ msgstr ""
msgid "Survey Response"
msgstr ""
+msgid "Surveys|Delighted"
+msgstr ""
+
+msgid "Surveys|Happy"
+msgstr ""
+
+msgid "Surveys|Neutral"
+msgstr ""
+
+msgid "Surveys|Sad"
+msgstr ""
+
+msgid "Surveys|Unhappy"
+msgstr ""
+
msgid "Switch Branches"
msgstr ""
@@ -37004,9 +37659,6 @@ msgstr ""
msgid "System header and footer"
msgstr ""
-msgid "System hook was successfully updated."
-msgstr ""
-
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -37205,6 +37857,12 @@ msgstr ""
msgid "Task ID: %{elastic_task}"
msgstr ""
+msgid "Task list"
+msgstr ""
+
+msgid "Task with ID: %{id} could not be found."
+msgstr ""
+
msgid "TasksToBeDone|Create/import code into a project (repository)"
msgstr ""
@@ -37547,6 +38205,9 @@ msgstr ""
msgid "TestReports|Attachment"
msgstr ""
+msgid "TestReports|Copy test name to rerun locally"
+msgstr ""
+
msgid "TestReports|Job artifacts are expired"
msgstr ""
@@ -37625,9 +38286,6 @@ msgstr ""
msgid "That's it, well done!"
msgstr ""
-msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
-
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -37749,6 +38407,9 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
+msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
+msgstr ""
+
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
@@ -37773,7 +38434,7 @@ msgstr ""
msgid "The download link will expire in 24 hours."
msgstr ""
-msgid "The environment tier must be one of %{environment_tiers}."
+msgid "The environment tiers must be from %{environment_tiers}."
msgstr ""
msgid "The errors we encountered were:"
@@ -37925,6 +38586,9 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -37967,9 +38631,6 @@ msgstr ""
msgid "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"
msgstr ""
-msgid "The number of days that must pass between marking an entity for deletion and actually removing it. The delay can be between 0 and 90 days."
-msgstr ""
-
msgid "The number of merge requests merged by month."
msgstr ""
@@ -38000,21 +38661,12 @@ msgstr ""
msgid "The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "The project can be accessed by any user who is logged in."
-msgstr ""
-
-msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
-
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
msgstr ""
-msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
-msgstr ""
-
msgid "The project is still being deleted. Please try again later."
msgstr ""
@@ -38228,6 +38880,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no secure files yet."
+msgstr ""
+
msgid "There are no topics to show."
msgstr ""
@@ -38273,6 +38928,12 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
+msgid "There was a problem fetching CRM contacts."
+msgstr ""
+
+msgid "There was a problem fetching CRM organizations."
+msgstr ""
+
msgid "There was a problem fetching branches."
msgstr ""
@@ -38897,9 +39558,6 @@ msgstr ""
msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
msgstr ""
-msgid "This job triggers a downstream pipeline"
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -39017,7 +39675,7 @@ msgstr ""
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."
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
@@ -39041,6 +39699,9 @@ msgstr ""
msgid "This setting can be overridden in each project."
msgstr ""
+msgid "This setting has been configured at the instance level and cannot be overridden per group"
+msgstr ""
+
msgid "This setting is allowed for forked projects only"
msgstr ""
@@ -39092,9 +39753,6 @@ msgstr ""
msgid "This will invalidate your registered applications and U2F devices."
msgstr ""
-msgid "This will redirect you to an external sign in page."
-msgstr ""
-
msgid "This will remove the fork relationship between this project and %{fork_source}."
msgstr ""
@@ -39125,9 +39783,6 @@ msgstr ""
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
-msgid "Time Spent"
-msgstr ""
-
msgid "Time based: Yes"
msgstr ""
@@ -39137,9 +39792,6 @@ msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
-msgid "Time before enforced"
-msgstr ""
-
msgid "Time between merge request creation and merge/close"
msgstr ""
@@ -39191,6 +39843,12 @@ msgstr ""
msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
+msgid "TimeTracking|An error occurred while removing the timelog."
+msgstr ""
+
+msgid "TimeTracking|Delete time spent"
+msgstr ""
+
msgid "TimeTracking|Estimated:"
msgstr ""
@@ -39210,7 +39868,7 @@ msgid "Timeago|%s days remaining"
msgstr ""
msgid "Timeago|%s hours ago"
-msgstr ""
+msgstr "%s å°æ™‚å‰"
msgid "Timeago|%s hours remaining"
msgstr ""
@@ -39523,9 +40181,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
-msgstr ""
-
msgid "To resolve this, try to:"
msgstr ""
@@ -39676,6 +40331,9 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+msgid "Toggle the Draft status"
+msgstr ""
+
msgid "Toggle the Performance Bar"
msgstr ""
@@ -39715,12 +40373,21 @@ msgstr ""
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
+msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
+msgstr ""
+
+msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
+msgstr ""
+
msgid "TopNav|Go back"
msgstr ""
msgid "Topic %{topic_name} was successfully created."
msgstr ""
+msgid "Topic %{topic_name} was successfully removed."
+msgstr ""
+
msgid "Topic avatar"
msgstr ""
@@ -39775,9 +40442,6 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
-msgid "Tracing"
-msgstr ""
-
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -39934,9 +40598,6 @@ msgstr ""
msgid "Trial|Please select a country"
msgstr ""
-msgid "Trial|Successful trial activation image"
-msgstr ""
-
msgid "Trial|Telephone number"
msgstr ""
@@ -40003,9 +40664,6 @@ msgstr ""
msgid "Trigger|invalid"
msgstr ""
-msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -40093,6 +40751,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication grace period"
+msgstr ""
+
msgid "Two-factor authentication has been disabled for this user"
msgstr ""
@@ -40183,9 +40844,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Elasticsearch"
-msgstr ""
-
msgid "Unable to connect to Prometheus server"
msgstr ""
@@ -40195,9 +40853,6 @@ msgstr ""
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr ""
-msgid "Unable to convert Kubernetes logs encoding to UTF-8"
-msgstr ""
-
msgid "Unable to create link to vulnerability"
msgstr ""
@@ -40210,9 +40865,6 @@ msgstr ""
msgid "Unable to fetch upstream and downstream pipelines."
msgstr ""
-msgid "Unable to fetch vulnerable projects"
-msgstr ""
-
msgid "Unable to find Jira project to import data from."
msgstr ""
@@ -40240,6 +40892,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to parse the vulnerability report's options."
+msgstr ""
+
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40282,7 +40937,7 @@ msgstr ""
msgid "Unarchive project"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Unassign from commenting user"
@@ -40336,9 +40991,6 @@ msgstr ""
msgid "Unknown Error"
msgstr ""
-msgid "Unknown cache key"
-msgstr ""
-
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -40390,12 +41042,6 @@ msgstr ""
msgid "Unlocks the discussion."
msgstr ""
-msgid "Unmarked this %{noun} as a draft."
-msgstr ""
-
-msgid "Unmarks this %{noun} as a draft."
-msgstr ""
-
msgid "Unreachable"
msgstr ""
@@ -40591,10 +41237,7 @@ msgstr ""
msgid "Upload object map"
msgstr ""
-msgid "UploadLink|click to upload"
-msgstr ""
-
-msgid "Uploaded"
+msgid "Uploaded date"
msgstr ""
msgid "Uploading changes to terminal"
@@ -40639,9 +41282,6 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
-msgstr ""
-
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -40762,6 +41402,9 @@ msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
+msgid "UsageQuota|Something went wrong while loading usage details"
+msgstr ""
+
msgid "UsageQuota|Storage"
msgstr ""
@@ -41389,6 +42032,12 @@ msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
+msgid "Users can request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Users cannot be added to projects in this group"
+msgstr ""
+
msgid "Users in License"
msgstr ""
@@ -41651,9 +42300,6 @@ msgstr ""
msgid "VersionCheck|Your GitLab Version"
msgstr ""
-msgid "View Documentation"
-msgstr ""
-
msgid "View Stage: %{title}"
msgstr ""
@@ -41697,9 +42343,6 @@ msgstr ""
msgid "View documentation"
msgstr ""
-msgid "View downstream pipeline"
-msgstr ""
-
msgid "View eligible approvers"
msgstr ""
@@ -42311,7 +42954,7 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
-msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
+msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes."
msgstr ""
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
@@ -42906,6 +43549,9 @@ msgstr ""
msgid "Will deploy to"
msgstr ""
+msgid "Wireframe"
+msgstr ""
+
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -42930,19 +43576,35 @@ msgstr ""
msgid "WorkItem|Add a child"
msgstr ""
+msgid "WorkItem|Add assignee"
+msgstr ""
+
+msgid "WorkItem|Add assignees"
+msgstr ""
+
+msgid "WorkItem|Are you sure you want to cancel editing?"
+msgstr ""
+
msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Assignee"
+msgid_plural "WorkItem|Assignees"
+msgstr[0] ""
+
msgid "WorkItem|Cancel"
msgstr ""
msgid "WorkItem|Child items"
msgstr ""
+msgid "WorkItem|Closed"
+msgstr ""
+
msgid "WorkItem|Collapse child items"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Create task"
msgstr ""
msgid "WorkItem|Create work item"
@@ -42954,10 +43616,10 @@ msgstr ""
msgid "WorkItem|Expand child items"
msgstr ""
-msgid "WorkItem|New Task"
+msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
msgstr ""
-msgid "WorkItem|No child items are currently assigned. Use child items to prioritize tasks that your team should complete in order to accomplish your goals!"
+msgid "WorkItem|Open"
msgstr ""
msgid "WorkItem|Select type"
@@ -43108,7 +43770,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}at least Reporter role%{strongEnd} can view or be notified about this %{issuableType}."
+msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
msgstr ""
msgid "You are not allowed to %{action} a user"
@@ -43306,9 +43968,6 @@ msgstr ""
msgid "You can only add up to %{max_contacts} contacts at one time"
msgstr ""
-msgid "You can only approve an indivdual user, member, or all members"
-msgstr ""
-
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -43318,9 +43977,6 @@ msgstr ""
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
-msgid "You can only upload one design when dropping onto an existing design."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -43348,9 +44004,6 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
-msgid "You cannot approve all pending members on a free plan"
-msgstr ""
-
msgid "You cannot approve your own deployment."
msgstr ""
@@ -43360,6 +44013,9 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
+msgid "You cannot edit this timeline event."
+msgstr ""
+
msgid "You cannot impersonate a blocked user"
msgstr ""
@@ -43511,6 +44167,9 @@ msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
+msgid "You have insufficient permissions to manage resource links for this incident"
+msgstr ""
+
msgid "You have insufficient permissions to manage timeline events for this incident"
msgstr ""
@@ -43523,6 +44182,9 @@ msgstr ""
msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
+msgid "You have insufficient permissions to remove this Namespace Ban"
+msgstr ""
+
msgid "You have insufficient permissions to set customer relations contacts for this issue"
msgstr ""
@@ -43592,9 +44254,6 @@ msgstr ""
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
-
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -43694,18 +44353,36 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}."
msgstr ""
-msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
msgid "You're receiving this email because of your activity on %{host}."
msgstr ""
+msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr ""
+msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
+msgstr ""
+
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
@@ -43727,12 +44404,6 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{plan} subscription expired on %{expiry_date}"
-msgstr ""
-
-msgid "Your %{plan} subscription expires on %{expiry_date}"
-msgstr ""
-
msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
msgstr ""
@@ -43964,12 +44635,6 @@ msgstr ""
msgid "Your new comment"
msgstr ""
-msgid "Your new personal access token has been created."
-msgstr ""
-
-msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
-
msgid "Your password reset token has expired."
msgstr ""
@@ -43985,6 +44650,9 @@ msgstr ""
msgid "Your profile"
msgstr ""
+msgid "Your project has limited quotas and features"
+msgstr ""
+
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
@@ -44037,13 +44705,16 @@ msgid "Your subscription has %{remaining_seat_count} out of %{total_seat_count}
msgid_plural "Your subscription has %{remaining_seat_count} out of %{total_seat_count} seats remaining."
msgstr[0] ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
-msgstr ""
-
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
msgstr[0] ""
+msgid "Your update failed. You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "Your update failed. You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
msgid "Your username is %{username}."
msgstr ""
@@ -44116,6 +44787,9 @@ msgstr ""
msgid "`start_time` should precede `end_time`"
msgstr ""
+msgid "`work_items_hierarchy` feature flag disabled for this project"
+msgstr ""
+
msgid "a deleted user"
msgstr ""
@@ -44144,6 +44818,9 @@ msgstr ""
msgid "allowed to fail"
msgstr ""
+msgid "already banned from namespace"
+msgstr ""
+
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
@@ -44184,6 +44861,12 @@ msgstr ""
msgid "at"
msgstr ""
+msgid "at least the Reporter role"
+msgstr ""
+
+msgid "at least the Reporter role, the author, and assignees"
+msgstr ""
+
msgid "at risk"
msgstr ""
@@ -44236,6 +44919,9 @@ msgstr ""
msgid "can only have one escalation policy"
msgstr ""
+msgid "can't be enabled when delayed group deletion is disabled"
+msgstr ""
+
msgid "can't be nil"
msgstr ""
@@ -44278,6 +44964,9 @@ msgstr ""
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
+msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
+msgstr ""
+
msgid "cannot be used for user namespace"
msgstr ""
@@ -44348,10 +45037,10 @@ msgstr ""
msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
+msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
msgstr ""
-msgid "ciReport|%{scanner} detected no new %{vulnStr}"
+msgid "ciReport|%{scanner} detected no %{strong_start}new%{strong_end} %{vulnStr}"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
@@ -44363,6 +45052,9 @@ msgstr ""
msgid "ciReport|API fuzzing"
msgstr ""
+msgid "ciReport|All clusters"
+msgstr ""
+
msgid "ciReport|All projects"
msgstr ""
@@ -44629,6 +45321,9 @@ msgstr ""
msgid "closed"
msgstr ""
+msgid "closed %{timeago}"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -44656,12 +45351,6 @@ msgstr ""
msgid "container registry images"
msgstr ""
-msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "contains URLs that exceed the 1024 character limit (%{urls})"
msgstr ""
@@ -44714,6 +45403,9 @@ msgstr ""
msgid "deleted"
msgstr ""
+msgid "denied"
+msgstr ""
+
msgid "deploy"
msgstr ""
@@ -44824,6 +45516,9 @@ msgstr ""
msgid "following"
msgstr ""
+msgid "for"
+msgstr ""
+
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -44870,6 +45565,16 @@ msgstr ""
msgid "groups"
msgstr ""
+msgid "groups and projects"
+msgstr ""
+
+msgid "groups only"
+msgstr ""
+
+msgid "had %{count} failed job"
+msgid_plural "had %{count} failed jobs"
+msgstr[0] ""
+
msgid "has already been linked to another vulnerability"
msgstr ""
@@ -45019,7 +45724,7 @@ msgid "issues at risk"
msgstr ""
msgid "issues need attention"
-msgstr ""
+msgstr "需è¦é—œæ³¨çš„è­°é¡Œ"
msgid "issues on track"
msgstr ""
@@ -45188,6 +45893,12 @@ msgstr ""
msgid "mrWidget|Approval password is invalid."
msgstr ""
+msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
+msgstr ""
+
+msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
+msgstr ""
+
msgid "mrWidget|Approve"
msgstr ""
@@ -45289,6 +46000,9 @@ msgstr[0] ""
msgid "mrWidget|Merge"
msgstr ""
+msgid "mrWidget|Merge blocked: all required approvals must be given."
+msgstr ""
+
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
@@ -45307,9 +46021,6 @@ msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
msgstr ""
-msgid "mrWidget|Merge blocked: this merge request must be approved."
-msgstr ""
-
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
msgstr ""
@@ -45355,6 +46066,9 @@ msgstr ""
msgid "mrWidget|More information"
msgstr ""
+msgid "mrWidget|No users match the rule's criteria."
+msgstr ""
+
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45553,6 +46267,12 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only %{parent_types} can be parent of Task."
+msgstr ""
+
+msgid "only Task can be assigned as a child in hierarchy."
+msgstr ""
+
msgid "only available on top-level groups."
msgstr ""
@@ -45582,6 +46302,12 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] ""
+msgid "parent already has maximum number of children."
+msgstr ""
+
+msgid "parent must be in the same project as child."
+msgstr ""
+
msgid "password"
msgstr ""
@@ -45618,12 +46344,6 @@ msgstr ""
msgid "pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
-
-msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
-
msgid "point"
msgid_plural "points"
msgstr[0] ""
@@ -45771,6 +46491,9 @@ msgstr ""
msgid "should be an array of %{object_name} objects"
msgstr ""
+msgid "should be an array of existing usernames. %{invalid} does not exist"
+msgstr ""
+
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
msgstr ""
@@ -45991,6 +46714,12 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
+msgid "your GitLab instance"
+msgstr ""
+
+msgid "your group (%{group_name})"
+msgstr ""
+
msgid "your settings"
msgstr ""
diff --git a/metrics_server/dependencies.rb b/metrics_server/dependencies.rb
index 3f188658ba2..233511eb505 100644
--- a/metrics_server/dependencies.rb
+++ b/metrics_server/dependencies.rb
@@ -20,6 +20,7 @@ require_relative '../lib/prometheus/cleanup_multiproc_dir_service'
require_relative '../lib/gitlab/metrics/prometheus'
require_relative '../lib/gitlab/metrics'
require_relative '../lib/gitlab/metrics/system'
+require_relative '../lib/gitlab/metrics/memory'
require_relative '../lib/gitlab/metrics/samplers/base_sampler'
require_relative '../lib/gitlab/metrics/samplers/ruby_sampler'
require_relative '../lib/gitlab/metrics/exporter/base_exporter'
diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb
index a5c448b5105..d1a64aa5b79 100644
--- a/metrics_server/metrics_server.rb
+++ b/metrics_server/metrics_server.rb
@@ -56,6 +56,11 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
env['GME_LOG_LEVEL'] = 'quiet'
end
+ if settings['tls_enabled']
+ env['GME_CERT_FILE'] = settings['tls_cert_path']
+ env['GME_CERT_KEY'] = settings['tls_key_path']
+ end
+
Process.spawn(env, cmd, err: $stderr, out: $stdout, pgroup: true).tap do |pid|
Process.detach(pid)
end
diff --git a/package.json b/package.json
index f1589d5d37f..2924ef910d3 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
"file-coverage": "scripts/frontend/file_test_coverage.js",
"lint-docs": "scripts/lint-doc.sh",
"internal:eslint": "eslint --cache --max-warnings 0 --report-unused-disable-directives --ext .js,.vue,.graphql",
- "internal:stylelint": "stylelint -q '{ee/,}app/assets/stylesheets/**/*.{css,scss}'",
+ "internal:stylelint": "stylelint -q --rd '{ee/,}app/assets/stylesheets/**/*.{css,scss}'",
"prejest": "yarn check-dependencies",
"jest": "jest --config jest.config.js",
"jest-debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
@@ -41,7 +41,6 @@
"storybook:install": "yarn --cwd ./storybook install",
"storybook:build": "yarn --cwd ./storybook build",
"storybook:start": "./scripts/frontend/start_storybook.sh",
- "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",
"webpack-prod": "NODE_OPTIONS=\"--max-old-space-size=3584\" NODE_ENV=production webpack --config config/webpack.config.js"
@@ -52,8 +51,8 @@
"@babel/preset-env": "^7.18.2",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/svgs": "2.21.0",
- "@gitlab/ui": "41.10.0",
+ "@gitlab/svgs": "2.28.0",
+ "@gitlab/ui": "42.22.0",
"@gitlab/visual-review-tools": "1.7.3",
"@rails/actioncable": "6.1.4-7",
"@rails/ujs": "6.1.4-7",
@@ -103,7 +102,7 @@
"codesandbox-api": "0.0.23",
"compression-webpack-plugin": "^5.0.2",
"copy-webpack-plugin": "^6.4.1",
- "core-js": "^3.23.1",
+ "core-js": "^3.23.5",
"cron-validator": "^1.1.1",
"cronstrue": "^1.122.0",
"cropper": "^2.3.0",
@@ -114,7 +113,7 @@
"dateformat": "^5.0.1",
"deckar01-task_list": "^2.3.1",
"diff": "^3.4.0",
- "dompurify": "^2.3.8",
+ "dompurify": "^2.3.9",
"dropzone": "^4.2.0",
"editorconfig": "^0.15.3",
"emoji-regex": "^10.0.0",
@@ -123,8 +122,7 @@
"fuzzaldrin-plus": "^0.6.0",
"graphql": "^15.7.2",
"graphql-tag": "^2.11.0",
- "hast-util-to-string": "^2.0.0",
- "highlight.js": "^11.3.1",
+ "highlight.js": "^11.5.1",
"immer": "^7.0.7",
"ipaddr.js": "^1.9.1",
"jed": "^1.1.1",
@@ -136,10 +134,11 @@
"jszip-utils": "^0.0.2",
"katex": "^0.13.2",
"lodash": "^4.17.20",
- "lowlight": "^2.5.0",
+ "lowlight": "^2.6.1",
"marked": "^0.3.12",
"mathjax": "3",
"mermaid": "^9.1.1",
+ "micromatch": "^4.0.5",
"minimatch": "^3.0.4",
"monaco-editor": "^0.25.2",
"monaco-editor-webpack-plugin": "^4.0.0",
@@ -151,7 +150,7 @@
"pikaday": "^1.8.0",
"popper.js": "^1.16.1",
"portal-vue": "^2.1.7",
- "postcss": "8.4.5",
+ "postcss": "8.4.14",
"prismjs": "^1.21.0",
"prosemirror-markdown": "1.8.0",
"prosemirror-model": "^1.16.1",
@@ -170,7 +169,7 @@
"sortablejs": "^1.10.2",
"string-hash": "1.1.3",
"style-loader": "^2.0.0",
- "swagger-ui-dist": "4.8.0",
+ "swagger-ui-dist": "4.12.0",
"three": "^0.84.0",
"three-orbit-controls": "^82.1.0",
"three-stl-loader": "^1.0.4",
@@ -200,9 +199,9 @@
"yaml": "^2.0.0-10"
},
"devDependencies": {
- "@gitlab/eslint-plugin": "12.1.0",
- "@gitlab/stylelint-config": "4.0.0",
- "@graphql-eslint/eslint-plugin": "3.10.4",
+ "@gitlab/eslint-plugin": "13.1.0",
+ "@gitlab/stylelint-config": "4.1.0",
+ "@graphql-eslint/eslint-plugin": "3.10.6",
"@testing-library/dom": "^7.16.2",
"@types/jest": "^26.0.24",
"@vue/test-utils": "1.3.0",
@@ -247,11 +246,11 @@
"prosemirror-test-builder": "^1.0.6",
"purgecss": "^4.0.3",
"purgecss-from-html": "^4.0.3",
- "sass": "^1.32.12",
- "stylelint": "^14.3.0",
+ "sass": "^1.49.9",
+ "stylelint": "^14.9.1",
"timezone-mock": "^1.0.8",
"vue-jest": "4.0.1",
- "webpack-dev-server": "4.9.2",
+ "webpack-dev-server": "4.9.3",
"xhr-mock": "^2.5.1",
"yarn-check-webpack-plugin": "^1.2.0",
"yarn-deduplicate": "^5.0.0"
diff --git a/public/robots.txt b/public/robots.txt
index 81b7ac50c2b..6c0513fd6c4 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -28,6 +28,7 @@ Disallow: /-/ide/
Disallow: /-/experiment
# Restrict allowed routes to avoid very ugly search results
Allow: /users/sign_in
+Allow: /users/sign_up
Allow: /users/*/snippets
# Generic resource routes like new, edit, raw
diff --git a/qa/Dockerfile b/qa/Dockerfile
index 5d046636984..9611b3653eb 100644
--- a/qa/Dockerfile
+++ b/qa/Dockerfile
@@ -1,12 +1,15 @@
ARG DOCKER_VERSION=20.10.14
ARG CHROME_VERSION=101
+ARG QA_BUILD_TARGET=qa
-FROM registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23
+FROM registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23 AS qa
LABEL maintainer="GitLab Quality Department <quality@gitlab.com>"
ENV DEBIAN_FRONTEND="noninteractive"
# Override config path to make sure local config doesn't override it when building image locally
ENV BUNDLE_APP_CONFIG=/home/gitlab/.bundle
+# Use webdriver preinstalled in the base image
+ENV WD_INSTALL_DIR=/usr/local/bin
##
# Install system libs
@@ -34,20 +37,13 @@ COPY ./qa/Gemfile* /home/gitlab/qa/
RUN bundle config set --local without development \
&& bundle install --retry=3
-##
-# 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)
COPY VERSION ./ee/app/models/license.r[b] /home/gitlab/ee/app/models/
-COPY ./config/bundler_setup.rb /home/gitlab/config/
+COPY VERSION ./ee/config/feature_flag[s] /home/gitlab/ee/config/feature_flags/
COPY ./config/feature_flags /home/gitlab/config/feature_flags
+COPY ./config/bundler_setup.rb /home/gitlab/config/
COPY ./lib/gitlab_edition.rb /home/gitlab/lib/
COPY ./lib/gitlab/utils.rb /home/gitlab/lib/gitlab/
COPY ./INSTALLATION_TYPE ./VERSION /home/gitlab/
@@ -55,3 +51,11 @@ COPY ./INSTALLATION_TYPE ./VERSION /home/gitlab/
COPY ./qa /home/gitlab/qa
ENTRYPOINT ["bin/test"]
+
+# Add JH files when pass the parameter: `--build-arg QA_BUILD_TARGET=jhqa`
+FROM qa AS jhqa
+ONBUILD COPY ./jh/qa /home/gitlab/jh/qa
+ONBUILD COPY ./jh/lib /home/gitlab/jh/lib
+ONBUILD COPY ./jh/config/feature_flags /home/gitlab/jh/config/feature_flags
+
+FROM $QA_BUILD_TARGET
diff --git a/qa/lib/gitlab/page/admin/subscription.rb b/qa/lib/gitlab/page/admin/subscription.rb
index b90a49abf4b..1538384f6ed 100644
--- a/qa/lib/gitlab/page/admin/subscription.rb
+++ b/qa/lib/gitlab/page/admin/subscription.rb
@@ -10,6 +10,8 @@ module Gitlab
text_field :activation_code
button :activate
label :terms_of_services, text: /I agree that/
+ link :remove_license, 'data-testid': 'license-remove-action'
+ button :confirm_ok_button
p :plan
p :started
p :name
@@ -21,6 +23,9 @@ module Gitlab
h2 :users_over_subscription
table :subscription_history
+ span :no_valid_license_alert, text: /no longer has a valid license/
+ h3 :no_active_subscription_title, text: /do not have an active subscription/
+
def accept_terms
terms_of_services_element.click # workaround for hidden checkbox
end
@@ -39,7 +44,7 @@ module Gitlab
# @param license_type [Hash] Type of the license
# @option license_type [String] 'license file'
# @option license_type [String] 'cloud license'
- # @return [Boolean] True if record exsists, false if not
+ # @return [Boolean] True if record exists, false if not
def has_subscription_record?(plan, users_in_license, license_type)
# find any records that have a matching plan and seats and type
subscription_history_element.hashes.any? do |record|
diff --git a/qa/qa.rb b/qa/qa.rb
index 8d358aa2efe..7d2f363143b 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -17,10 +17,16 @@ require 'active_support/core_ext/hash'
require 'active_support/core_ext/object/blank'
require 'rainbow/refinement'
+require_relative 'qa/support/fips'
+
module QA
root = "#{__dir__}/qa"
loader = Zeitwerk::Loader.new
+
+ # require jh/qa/qa.rb first, to load JH module make prepend module works
+ require '../jh/qa/qa' if GitlabEdition.jh?
+
loader.push_dir(root, namespace: QA)
loader.ignore("#{root}/specs/features")
diff --git a/qa/qa/fixtures/software_licenses/GFDL-1.2-only b/qa/qa/fixtures/software_licenses/GFDL-1.2-only
new file mode 100644
index 00000000000..4421c2a496a
--- /dev/null
+++ b/qa/qa/fixtures/software_licenses/GFDL-1.2-only
@@ -0,0 +1,397 @@
+GNU Free Documentation License
+Version 1.2, November 2002
+
+
+Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+Preserve the Title of the section, and preserve in the section all
+the substance and tone of each of the contributor acknowledgements
+and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+https://www.gnu.org/licenses/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+Copyright (c) YEAR YOUR NAME.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled "GNU
+Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+with the Invariant Sections being LIST THEIR TITLES, with the
+Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/qa/qa/fixtures/software_licenses/bsd-3-clause b/qa/qa/fixtures/software_licenses/bsd-3-clause
new file mode 100644
index 00000000000..3deb7c523fb
--- /dev/null
+++ b/qa/qa/fixtures/software_licenses/bsd-3-clause
@@ -0,0 +1,11 @@
+Copyright 2022 Joe Bloggs
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/qa/qa/flow/login.rb b/qa/qa/flow/login.rb
index b60f74fe9bf..05f114acbc5 100644
--- a/qa/qa/flow/login.rb
+++ b/qa/qa/flow/login.rb
@@ -40,8 +40,14 @@ module QA
sign_in(as: Runtime::User.admin, address: address, admin: true)
end
- def sign_in_unless_signed_in(as: nil, address: :gitlab)
- sign_in(as: as, address: address) unless Page::Main::Menu.perform(&:signed_in?)
+ def sign_in_unless_signed_in(user: nil, address: :gitlab)
+ if user
+ sign_in(as: user, address: address) unless Page::Main::Menu.perform do |menu|
+ menu.signed_in_as_user?(user)
+ end
+ else
+ sign_in(address: address) unless Page::Main::Menu.perform(&:signed_in?)
+ end
end
end
end
diff --git a/qa/qa/git/repository.rb b/qa/qa/git/repository.rb
index 2244a78b9e5..f132d7b7885 100644
--- a/qa/qa/git/repository.rb
+++ b/qa/qa/git/repository.rb
@@ -163,7 +163,7 @@ module QA
ssh
end
- env_vars << %(GIT_SSH_COMMAND="ssh -i #{ssh.private_key_file.path} -o UserKnownHostsFile=#{ssh.known_hosts_file.path}")
+ env_vars << %(GIT_SSH_COMMAND="ssh -i #{ssh.private_key_file.path} -o UserKnownHostsFile=#{ssh.known_hosts_file.path} -o IdentitiesOnly=yes")
end
def delete_ssh_key
@@ -218,6 +218,31 @@ module QA
run_git('git --no-pager branch --list --remotes --format="%(refname:lstrip=3)"').to_s.split("\n")
end
+ # Gets the size of the repository using `git rev-list --all --objects --use-bitmap-index --disk-usage` as
+ # Gitaly does (see https://gitlab.com/gitlab-org/gitlab/-/issues/357680)
+ def local_size
+ internal_refs = %w[
+ refs/keep-around/
+ refs/merge-requests/
+ refs/pipelines/
+ refs/remotes/
+ refs/tmp/
+ refs/environments/
+ ]
+ cmd = <<~CMD
+ git rev-list #{internal_refs.map { |r| "--exclude='#{r}*'" }.join(' ')} \
+ --not --alternate-refs --not \
+ --all --objects --use-bitmap-index --disk-usage
+ CMD
+
+ run_git(cmd).to_i
+ end
+
+ # Performs garbage collection
+ def run_gc
+ run_git('git gc')
+ end
+
private
attr_reader :uri, :username, :password, :ssh, :use_lfs
diff --git a/qa/qa/page/alert/free_trial.rb b/qa/qa/page/alert/free_trial.rb
index 4a48d4ca277..ec8d8e8abde 100644
--- a/qa/qa/page/alert/free_trial.rb
+++ b/qa/qa/page/alert/free_trial.rb
@@ -4,8 +4,7 @@ module QA
module Page
module Alert
class FreeTrial < Chemlab::Page
- # TODO: Supplant with data-qa-selectors
- h4 :trial_activated_message, class: 'gl-banner-title'
+ element :trial_activated_message
end
end
end
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 775a5ead5f7..d7e0101ff2c 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -53,8 +53,20 @@ module QA
wait_for_requests(skip_finished_loading_check: skip_finished_loading_check)
end
- def wait_until(max_duration: 60, sleep_interval: 0.1, reload: true, raise_on_failure: true, skip_finished_loading_check_on_refresh: false)
- Support::Waiter.wait_until(max_duration: max_duration, sleep_interval: sleep_interval, raise_on_failure: raise_on_failure) do
+ def wait_until(
+ max_duration: 60,
+ sleep_interval: 0.1,
+ reload: true,
+ raise_on_failure: true,
+ skip_finished_loading_check_on_refresh: false,
+ message: nil
+ )
+ Support::Waiter.wait_until(
+ max_duration: max_duration,
+ sleep_interval: sleep_interval,
+ raise_on_failure: raise_on_failure,
+ message: message
+ ) do
yield || (reload && refresh(skip_finished_loading_check: skip_finished_loading_check_on_refresh) && false)
end
end
@@ -80,7 +92,7 @@ module QA
)
end
- def scroll_to(selector, text: nil)
+ def scroll_to(selector, text: nil, &block)
wait_for_requests
page.execute_script <<~JS
@@ -94,7 +106,7 @@ module QA
}
JS
- page.within(selector) { yield } if block_given?
+ page.within(selector, &block) if block
end
# Returns true if successfully GETs the given URL
diff --git a/qa/qa/page/blame/show.rb b/qa/qa/page/blame/show.rb
new file mode 100644
index 00000000000..cbe8ef600dc
--- /dev/null
+++ b/qa/qa/page/blame/show.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Blame
+ class Show < Page::Base
+ view 'app/views/projects/blob/_header_content.html.haml' do
+ element :file_name_content
+ end
+
+ view 'app/views/projects/blame/show.html.haml' do
+ element :blame_file_content
+ end
+
+ def has_file?(file_name)
+ within_element(:file_name_content) { has_text?(file_name) }
+ end
+
+ def has_no_file?(file_name)
+ within_element(:file_name_content) do
+ has_no_text?(file_name)
+ end
+ end
+
+ def has_file_content?(file_content)
+ within_element(:blame_file_content) { has_text?(file_content) }
+ end
+
+ def has_no_file_content?(file_content)
+ within_element(:blame_file_content) do
+ has_no_text?(file_content)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/component/access_tokens.rb b/qa/qa/page/component/access_tokens.rb
index 28ca77aba24..f143e5b9e1f 100644
--- a/qa/qa/page/component/access_tokens.rb
+++ b/qa/qa/page/component/access_tokens.rb
@@ -1,4 +1,5 @@
# frozen_string_literal: true
+require 'date'
module QA
module Page
diff --git a/qa/qa/page/component/blob_content.rb b/qa/qa/page/component/blob_content.rb
index c2a1687ccfc..b6001cf39b5 100644
--- a/qa/qa/page/component/blob_content.rb
+++ b/qa/qa/page/component/blob_content.rb
@@ -25,14 +25,6 @@ module QA
base.view 'app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue' do
element :blob_viewer_file_content
end
-
- base.view 'app/views/projects/blob/_header_content.html.haml' do
- element :file_name_content
- end
-
- base.view 'app/views/shared/_file_highlight.html.haml' do
- element :file_content
- end
end
def has_file?(name)
@@ -44,21 +36,21 @@ module QA
end
def has_file_name?(file_name, file_number = nil)
- within_file_by_number(file_name_element, file_number) { has_text?(file_name) }
+ within_file_by_number(:file_title_content, file_number) { has_text?(file_name) }
end
def has_no_file_name?(file_name)
- within_element(file_name_element) do
+ within_element(:file_title_content) do
has_no_text?(file_name)
end
end
def has_file_content?(file_content, file_number = nil)
- within_file_by_number(file_content_element, file_number) { has_text?(file_content) }
+ within_file_by_number(:blob_viewer_file_content, file_number) { has_text?(file_content) }
end
def has_no_file_content?(file_content)
- within_element(file_content_element) do
+ within_element(:blob_viewer_file_content) do
has_no_text?(file_content)
end
end
@@ -80,14 +72,6 @@ module QA
private
- def file_content_element
- feature_flag_controlled_element(:refactor_blob_viewer, :blob_viewer_file_content, :file_content)
- end
-
- def file_name_element
- feature_flag_controlled_element(:refactor_blob_viewer, :file_title_content, :file_name_content)
- end
-
def within_file_by_number(element, file_number)
if file_number
within_element_by_index(element, file_number - 1) { yield }
diff --git a/qa/qa/page/component/design_management.rb b/qa/qa/page/component/design_management.rb
index 73ba5713bda..90c86688882 100644
--- a/qa/qa/page/component/design_management.rb
+++ b/qa/qa/page/component/design_management.rb
@@ -54,8 +54,9 @@ module QA
# We'll check for the annotation in a test, but here we'll at least
# wait for the "Save comment" button to disappear
saved = has_no_element?(:save_comment_button)
+ return if saved
- raise RSpec::Expectations::ExpectationNotMetError, %q(There was a problem while adding the annotation) unless saved
+ raise RSpec::Expectations::ExpectationNotMetError, %q(There was a problem while adding the annotation)
end
def add_design(design_file_path)
@@ -69,15 +70,11 @@ module QA
filename = ::File.basename(design_file_path)
- found = wait_until(reload: false, sleep_interval: 1) do
+ wait_until(reload: false, sleep_interval: 1, message: "Design upload") do
image = find_element(:design_image, filename: filename)
- has_element?(:design_file_name, text: filename) &&
- image["complete"] &&
- image["naturalWidth"].to_i > 0
+ has_element?(:design_file_name, text: filename) && image["complete"] && image["naturalWidth"].to_i > 0
end
-
- raise ElementNotFound, %Q(Attempted to attach design "#{filename}" but it did not appear) unless found
end
def update_design(filename)
diff --git a/qa/qa/page/component/invite_members_modal.rb b/qa/qa/page/component/invite_members_modal.rb
index 18747c19aee..5c39cfd3695 100644
--- a/qa/qa/page/component/invite_members_modal.rb
+++ b/qa/qa/page/component/invite_members_modal.rb
@@ -17,6 +17,7 @@ module QA
base.view 'app/assets/javascripts/invite_members/components/group_select.vue' do
element :group_select_dropdown_search_field
+ element :group_select_dropdown_item
end
base.view 'app/assets/javascripts/invite_members/components/members_token_select.vue' do
@@ -59,12 +60,16 @@ module QA
within_element(:invite_members_modal_content) do
click_button 'Select a group'
- # Helps stabilize race condition with concurrent group API calls while searching
- # TODO: Replace with `fill_element :group_select_dropdown_search_field, group_name` when this bug is resolved: https://gitlab.com/gitlab-org/gitlab/-/issues/349379
- send_keys_to_element(:group_select_dropdown_search_field, group_name)
+ Support::Waiter.wait_until { has_element?(:group_select_dropdown_item) }
+
+ # Workaround for race condition with concurrent group API calls while searching
+ # Remove Retrier after https://gitlab.com/gitlab-org/gitlab/-/issues/349379 is resolved
+ Support::Retrier.retry_on_exception do
+ fill_element :group_select_dropdown_search_field, group_name
+ Support::WaitForRequests.wait_for_requests
+ click_button group_name
+ end
- Support::WaitForRequests.wait_for_requests
- click_button group_name
set_access_level(access_level)
end
diff --git a/qa/qa/page/component/issuable/common.rb b/qa/qa/page/component/issuable/common.rb
index 0d056afd7f0..768a15a4551 100644
--- a/qa/qa/page/component/issuable/common.rb
+++ b/qa/qa/page/component/issuable/common.rb
@@ -10,22 +10,8 @@ module QA
def self.included(base)
super
- base.view 'app/assets/javascripts/issues/show/components/title.vue' do
- element :edit_button
- element :title, required: true
- end
-
- base.view 'app/assets/javascripts/issues/show/components/fields/title.vue' do
- element :title_input
- end
-
- base.view 'app/assets/javascripts/issues/show/components/fields/description.vue' do
- element :description_textarea
- end
-
- base.view 'app/assets/javascripts/issues/show/components/edit_actions.vue' do
- element :save_button
- element :delete_button
+ base.view 'app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue' do
+ element :title_content, required: true
end
end
end
diff --git a/qa/qa/page/component/issuable/sidebar.rb b/qa/qa/page/component/issuable/sidebar.rb
index 921647eb4cc..4131731111f 100644
--- a/qa/qa/page/component/issuable/sidebar.rb
+++ b/qa/qa/page/component/issuable/sidebar.rb
@@ -117,7 +117,7 @@ module QA
end
end
- click_element(:title) # to blur dropdown
+ click_element(:title_content) # to blur dropdown
end
def toggle_more_assignees_link
diff --git a/qa/qa/page/component/note.rb b/qa/qa/page/component/note.rb
index 7c733a231f1..8494518723d 100644
--- a/qa/qa/page/component/note.rb
+++ b/qa/qa/page/component/note.rb
@@ -168,7 +168,7 @@ module QA
def select_filter_with_text(text)
retry_on_exception do
- click_element(:title)
+ click_element(:title_content)
click_element :discussion_filter_dropdown
find_element(:filter_menu_item, text: text).click
diff --git a/qa/qa/page/component/visibility_setting.rb b/qa/qa/page/component/visibility_setting.rb
index 4370cfb4564..f07b9c1c455 100644
--- a/qa/qa/page/component/visibility_setting.rb
+++ b/qa/qa/page/component/visibility_setting.rb
@@ -15,7 +15,7 @@ module QA
end
def set_visibility(visibility)
- choose_element("#{visibility.downcase}_radio", false, true)
+ find('label', text: visibility.capitalize).click
end
end
end
diff --git a/qa/qa/page/file/show.rb b/qa/qa/page/file/show.rb
index 7d6d81cf869..581aa835ada 100644
--- a/qa/qa/page/file/show.rb
+++ b/qa/qa/page/file/show.rb
@@ -19,10 +19,6 @@ module QA
element :delete_button, '_("Delete")' # rubocop:disable QA/ElementWithPattern
end
- view 'app/views/projects/blob/_remove.html.haml' do
- element :delete_file_button, "button_tag 'Delete file'" # rubocop:disable QA/ElementWithPattern
- end
-
view 'app/assets/javascripts/vue_shared/components/web_ide_link.vue' do
element :edit_button
end
diff --git a/qa/qa/page/group/menu.rb b/qa/qa/page/group/menu.rb
index be877e56713..783fbd25929 100644
--- a/qa/qa/page/group/menu.rb
+++ b/qa/qa/page/group/menu.rb
@@ -76,6 +76,14 @@ module QA
end
end
+ def go_to_access_token_settings
+ hover_group_settings do
+ within_submenu do
+ click_element(:sidebar_menu_item_link, menu_item: 'Access Tokens')
+ end
+ end
+ end
+
private
def hover_settings
diff --git a/qa/qa/page/group/new.rb b/qa/qa/page/group/new.rb
index c24712b9418..09a9af7aaf7 100644
--- a/qa/qa/page/group/new.rb
+++ b/qa/qa/page/group/new.rb
@@ -6,7 +6,7 @@ module QA
class New < Page::Base
include Page::Component::VisibilitySetting
- view 'app/views/shared/_group_form.html.haml' do
+ view 'app/assets/javascripts/groups/components/group_name_and_path.vue' do
element :group_path_field
element :group_name_field
end
diff --git a/qa/qa/page/group/settings/access_tokens.rb b/qa/qa/page/group/settings/access_tokens.rb
new file mode 100644
index 00000000000..705988285ce
--- /dev/null
+++ b/qa/qa/page/group/settings/access_tokens.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Group
+ module Settings
+ class AccessTokens < Page::Base
+ include Page::Component::AccessTokens
+ include Page::Component::ConfirmModal
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/group/settings/package_registries.rb b/qa/qa/page/group/settings/package_registries.rb
index 433872a378a..35186159dc9 100644
--- a/qa/qa/page/group/settings/package_registries.rb
+++ b/qa/qa/page/group/settings/package_registries.rb
@@ -8,8 +8,8 @@ module QA
view 'app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue' do
element :package_registry_settings_content
- element :allow_duplicates_toggle
- element :allow_duplicates_label
+ element :reject_duplicates_toggle
+ element :reject_duplicates_label
end
view 'app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue' do
@@ -17,39 +17,39 @@ module QA
element :dependency_proxy_setting_toggle
end
- def set_allow_duplicates_disabled
- expand_content :package_registry_settings_content do
- click_on_allow_duplicates_button if duplicates_enabled?
+ def set_reject_duplicates_disabled
+ within_element :package_registry_settings_content do
+ click_on_reject_duplicates_button if duplicates_disabled?
end
end
- def set_allow_duplicates_enabled
- expand_content :package_registry_settings_content do
- click_on_allow_duplicates_button unless duplicates_enabled?
+ def set_reject_duplicates_enabled
+ within_element :package_registry_settings_content do
+ click_on_reject_duplicates_button unless duplicates_disabled?
end
end
- def click_on_allow_duplicates_button
- with_allow_duplicates_button do |button|
+ def click_on_reject_duplicates_button
+ with_reject_duplicates_button do |button|
button.click
end
end
- def duplicates_enabled?
- with_allow_duplicates_button do |button|
+ def duplicates_disabled?
+ with_reject_duplicates_button do |button|
button[:class].include?('is-checked')
end
end
- def with_allow_duplicates_button
- within_element :allow_duplicates_toggle do
+ def with_reject_duplicates_button
+ within_element :reject_duplicates_toggle do
toggle = find('button.gl-toggle:not(.is-disabled)')
yield(toggle)
end
end
def has_dependency_proxy_enabled?
- expand_content :dependency_proxy_settings_content do
+ within_element :dependency_proxy_settings_content do
within_element :dependency_proxy_setting_toggle do
toggle = find('button.gl-toggle')
toggle[:class].include?('is-checked')
diff --git a/qa/qa/page/issuable/new.rb b/qa/qa/page/issuable/new.rb
index ca1219cb7fc..0c95f722080 100644
--- a/qa/qa/page/issuable/new.rb
+++ b/qa/qa/page/issuable/new.rb
@@ -13,7 +13,7 @@ module QA
end
view 'app/views/shared/form_elements/_description.html.haml' do
- element :issuable_form_description
+ element :issuable_form_description_field
end
view 'app/views/shared/issuable/_milestone_dropdown.html.haml' do
@@ -37,7 +37,7 @@ module QA
end
def fill_description(description)
- fill_element :issuable_form_description, description
+ fill_element :issuable_form_description_field, description
end
def choose_milestone(milestone)
diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb
index 0bb74455f81..90b419f8cef 100644
--- a/qa/qa/page/main/menu.rb
+++ b/qa/qa/page/main/menu.rb
@@ -113,6 +113,14 @@ module QA
has_personal_area?(wait: 0)
end
+ def signed_in_as_user?(user)
+ return false if has_no_personal_area?
+
+ within_user_menu do
+ has_element?(:user_profile_link, text: /#{user.username}/)
+ end
+ end
+
def not_signed_in?
return true if Page::Main::Login.perform(&:on_login_page?)
@@ -202,7 +210,7 @@ module QA
def within_user_menu(&block)
within_top_menu do
- click_element :user_avatar
+ click_element :user_avatar unless has_element?(:user_profile_link, wait: 1)
within_element(:user_menu, &block)
end
diff --git a/qa/qa/page/mattermost/login.rb b/qa/qa/page/mattermost/login.rb
index 38a88b42992..ab711746459 100644
--- a/qa/qa/page/mattermost/login.rb
+++ b/qa/qa/page/mattermost/login.rb
@@ -12,7 +12,7 @@ module QA
view 'app/views/projects/mattermosts/new.html.haml'
def sign_in_using_oauth
- click_link class: 'btn btn-custom-login gitlab'
+ click_link 'gitlab'
if page.has_content?('Authorize GitLab Mattermost to use your account?')
click_button 'Authorize'
diff --git a/qa/qa/page/merge_request/new.rb b/qa/qa/page/merge_request/new.rb
index b19a0d1a830..79eb4f2d51b 100644
--- a/qa/qa/page/merge_request/new.rb
+++ b/qa/qa/page/merge_request/new.rb
@@ -8,10 +8,6 @@ module QA
element :issuable_create_button, required: true
end
- view 'app/views/shared/form_elements/_description.html.haml' do
- element :issuable_form_description
- end
-
view 'app/views/projects/merge_requests/creations/_new_compare.html.haml' do
element :compare_branches_button
element :source_branch_dropdown
@@ -40,10 +36,6 @@ module QA
click_element(:issuable_create_button, Page::MergeRequest::Show)
end
- def has_description?(description)
- has_element?(:issuable_form_description, text: description)
- end
-
def click_diffs_tab
click_element(:diffs_tab)
click_element(:dismiss_popover_button) if has_element?(:dismiss_popover_button, wait: 1)
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index a0bebf6bd7a..27c12a4e21f 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -222,7 +222,7 @@ module QA
def has_pipeline_status?(text)
# Pipelines can be slow, so we wait a bit longer than the usual 10 seconds
wait_until(max_duration: 120, sleep_interval: 5, reload: true) do
- has_element?(:merge_request_pipeline_info_content, text: text, wait: 15 )
+ has_element?(:merge_request_pipeline_info_content, text: text, wait: 15)
end
end
@@ -277,6 +277,11 @@ module QA
has_element?(:merge_button, disabled: false)
end
+ # Waits up 10 seconds and returns false if the Revert button is not enabled
+ def revertible?
+ has_element?(:revert_button, disabled: false, wait: 10)
+ end
+
# Waits up 60 seconds and raises an error if unable to merge.
#
# If a state is encountered in which a user would typically refresh the page, this will refresh the page and
@@ -318,11 +323,15 @@ module QA
end
def merge_immediately!
- if has_element?(:merge_moment_dropdown)
- click_element(:merge_moment_dropdown, skip_finished_loading_check: true)
- click_element(:merge_immediately_menu_item, skip_finished_loading_check: true)
- else
- click_element(:merge_button, skip_finished_loading_check: true)
+ retry_until(reload: true, sleep_interval: 1, max_attempts: 12) do
+ if has_element?(:merge_moment_dropdown)
+ click_element(:merge_moment_dropdown, skip_finished_loading_check: true)
+ click_element(:merge_immediately_menu_item, skip_finished_loading_check: true)
+ else
+ click_element(:merge_button, skip_finished_loading_check: true)
+ end
+
+ merged?
end
end
diff --git a/qa/qa/page/project/issue/show.rb b/qa/qa/page/project/issue/show.rb
index fe468de60cd..b1417d9b9db 100644
--- a/qa/qa/page/project/issue/show.rb
+++ b/qa/qa/page/project/issue/show.rb
@@ -5,7 +5,6 @@ module QA
module Project
module Issue
class Show < Page::Base
- include Page::Component::Issuable::Common
include Page::Component::Note
include Page::Component::DesignManagement
include Page::Component::Issuable::Sidebar
@@ -22,6 +21,10 @@ module QA
element :delete_issue_button
end
+ view 'app/assets/javascripts/issues/show/components/title.vue' do
+ element :title_content, required: true
+ end
+
view 'app/assets/javascripts/related_issues/components/add_issuable_form.vue' do
element :add_issue_button
end
@@ -79,7 +82,10 @@ module QA
def delete_issue
click_element(:issue_actions_ellipsis_dropdown)
- click_element(:delete_issue_button, Page::Modal::DeleteIssue)
+
+ click_element(:delete_issue_button,
+ Page::Modal::DeleteIssue,
+ wait: Support::Repeater::DEFAULT_MAX_WAIT_TIME)
Page::Modal::DeleteIssue.perform(&:confirm_delete_issue)
diff --git a/qa/qa/page/project/new.rb b/qa/qa/page/project/new.rb
index 7da763ca0e6..7864e664429 100644
--- a/qa/qa/page/project/new.rb
+++ b/qa/qa/page/project/new.rb
@@ -76,7 +76,7 @@ module QA
end
def set_visibility(visibility)
- choose visibility.capitalize
+ find('label', text: visibility.capitalize).click
end
# Disable experiment for SAST at project creation https://gitlab.com/gitlab-org/gitlab/-/issues/333196
diff --git a/qa/qa/page/project/settings/access_tokens.rb b/qa/qa/page/project/settings/access_tokens.rb
index 47afa26191c..69a8bdeaab8 100644
--- a/qa/qa/page/project/settings/access_tokens.rb
+++ b/qa/qa/page/project/settings/access_tokens.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'date'
-
module QA
module Page
module Project
diff --git a/qa/qa/page/project/settings/deploy_keys.rb b/qa/qa/page/project/settings/deploy_keys.rb
index 467799a14fb..297d29550e3 100644
--- a/qa/qa/page/project/settings/deploy_keys.rb
+++ b/qa/qa/page/project/settings/deploy_keys.rb
@@ -23,7 +23,7 @@ module QA
view 'app/assets/javascripts/deploy_keys/components/key.vue' do
element :key_container
element :key_title_content
- element :key_md5_fingerprint_content
+ element :key_sha256_fingerprint_content
end
def add_key
@@ -38,17 +38,17 @@ module QA
fill_element(:deploy_key_field, key)
end
- def find_md5_fingerprint(title)
+ def find_sha256_fingerprint(title)
within_project_deploy_keys do
find_element(:key_container, text: title)
- .find(element_selector_css(:key_md5_fingerprint_content)).text.delete_prefix('MD5:')
+ .find(element_selector_css(:key_sha256_fingerprint_content)).text
end
end
- def has_key?(title, md5_fingerprint)
+ def has_key?(title, sha256_fingerprint)
within_project_deploy_keys do
find_element(:key_container, text: title)
- .has_css?(element_selector_css(:key_md5_fingerprint_content), text: "MD5:#{md5_fingerprint}")
+ .has_css?(element_selector_css(:key_sha256_fingerprint_content), text: sha256_fingerprint)
end
end
diff --git a/qa/qa/page/project/settings/integrations.rb b/qa/qa/page/project/settings/integrations.rb
index 420dcb63918..0d5515aacdf 100644
--- a/qa/qa/page/project/settings/integrations.rb
+++ b/qa/qa/page/project/settings/integrations.rb
@@ -8,12 +8,17 @@ module QA
view 'app/assets/javascripts/integrations/index/components/integrations_table.vue' do
element :prometheus_link, %q(:data-qa-selector="`${item.name}_link`") # rubocop:disable QA/ElementWithPattern
element :jira_link, %q(:data-qa-selector="`${item.name}_link`") # rubocop:disable QA/ElementWithPattern
+ element :pipelines_email_link, %q(:data-qa-selector="`${item.name}_link`") # rubocop:disable QA/ElementWithPattern
end
def click_on_prometheus_integration
click_element :prometheus_link
end
+ def click_pipelines_email_link
+ click_element :pipelines_email_link
+ end
+
def click_jira_link
click_element :jira_link
end
diff --git a/qa/qa/page/project/settings/services/pipeline_status_emails.rb b/qa/qa/page/project/settings/services/pipeline_status_emails.rb
new file mode 100644
index 00000000000..2f78577e3d5
--- /dev/null
+++ b/qa/qa/page/project/settings/services/pipeline_status_emails.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Project
+ module Settings
+ module Services
+ class PipelineStatusEmails < QA::Page::Base
+ view 'app/assets/javascripts/integrations/edit/components/integration_form.vue' do
+ element :recipients_div, %q(:data-qa-selector="`${field.name}_div`") # rubocop:disable QA/ElementWithPattern
+ element :notify_only_broken_pipelines_div, %q(:data-qa-selector="`${field.name}_div`") # rubocop:disable QA/ElementWithPattern
+ element :save_changes_button
+ end
+
+ def set_recipients(emails)
+ within_element :recipients_div do
+ fill_in 'Recipients', with: emails.join(',')
+ end
+ end
+
+ def toggle_notify_broken_pipelines
+ within_element :notify_only_broken_pipelines_div do
+ uncheck 'Notify only broken pipelines', allow_label_click: true
+ end
+ end
+
+ def click_save_button
+ click_element(:save_changes_button)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb
index 9983ee2a33d..022e08215be 100644
--- a/qa/qa/page/project/show.rb
+++ b/qa/qa/page/project/show.rb
@@ -44,6 +44,7 @@ module QA
end
view 'app/views/projects/_files.html.haml' do
+ element :project_buttons
element :tree_holder, '.tree-holder' # rubocop:disable QA/ElementWithPattern
end
@@ -193,6 +194,12 @@ module QA
has_element?(:badge_image_link, link_url: link_url)
end
end
+
+ def has_license?(name)
+ within_element(:project_buttons) do
+ has_link?(name)
+ end
+ end
end
end
end
diff --git a/qa/qa/page/project/web_ide/edit.rb b/qa/qa/page/project/web_ide/edit.rb
index 3901eff0bcb..bc6c839bfe2 100644
--- a/qa/qa/page/project/web_ide/edit.rb
+++ b/qa/qa/page/project/web_ide/edit.rb
@@ -192,7 +192,7 @@ module QA
find_element(:commit_sha_content).text
end
- def commit_changes(commit_message = nil, open_merge_request: false)
+ def commit_changes(commit_message = nil, open_merge_request: false, wait_for_success: true)
# Clicking :begin_commit_button switches from the
# edit to the commit view
click_element(:begin_commit_button)
@@ -226,13 +226,17 @@ module QA
end
click_element(:commit_button) if has_element?(:commit_button)
+ break unless wait_for_success
+
# If this is the first commit, the commit SHA only appears after reloading
wait_until(reload: true) do
active_element?(:edit_mode_tab) && commit_sha != original_commit
end
end
- raise "The changes do not appear to have been committed successfully." unless commit_success
+ if wait_for_success
+ raise "The changes do not appear to have been committed successfully." unless commit_success
+ end
end
end
diff --git a/qa/qa/resource/deploy_key.rb b/qa/qa/resource/deploy_key.rb
index c06671be77d..b194f97ef1b 100644
--- a/qa/qa/resource/deploy_key.rb
+++ b/qa/qa/resource/deploy_key.rb
@@ -7,10 +7,10 @@ module QA
attribute :id
- attribute :md5_fingerprint do
+ attribute :sha256_fingerprint do
Page::Project::Settings::Repository.perform do |setting|
setting.expand_deploy_keys do |key|
- key.find_md5_fingerprint(title)
+ key.find_sha256_fingerprint(title)
end
end
end
diff --git a/qa/qa/resource/design.rb b/qa/qa/resource/design.rb
index 182985f2d9f..4a3214f3c0e 100644
--- a/qa/qa/resource/design.rb
+++ b/qa/qa/resource/design.rb
@@ -3,19 +3,20 @@
module QA
module Resource
class Design < Base
- attr_reader :id
- attr_accessor :filename
-
attribute :issue do
Issue.fabricate_via_api!
end
+ attributes :id,
+ :filename,
+ :full_path,
+ :image
+
def initialize
@update = false
@filename = 'banana_sample.gif'
end
- # TODO This will be replaced as soon as file uploads over GraphQL are implemented
def fabricate!
issue.visit!
@@ -24,10 +25,51 @@ module QA
end
end
+ def api_get_path
+ '/graphql'
+ end
+
+ alias_method :api_post_path, :api_get_path
+
+ # Fetch design
+ #
+ # @return [Hash]
+ def api_get
+ process_api_response(
+ api_post_to(
+ api_get_path,
+ <<~GQL
+ query {
+ issue(id: "gid://gitlab/Issue/#{issue.id}") {
+ designCollection {
+ design(filename: "#{filename}") {
+ id
+ fullPath
+ image
+ filename
+ }
+ }
+ }
+ }
+ GQL
+ )
+ )
+ end
+
+ # Graphql mutation for design creation
+ #
+ # @return [String]
+ def api_post_body
+ # TODO: design creation requires file upload via multipart/form-data request type with file passed in mutation
+ # which currently isn't supported by our api implementation
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/366592
+ raise NotImplementedError, "File uploads are not supported"
+ end
+
private
def filepath
- ::File.absolute_path(::File.join('qa', 'fixtures', 'designs', @filename))
+ ::File.absolute_path(::File.join('qa', 'fixtures', 'designs', filename))
end
end
end
diff --git a/qa/qa/resource/group_access_token.rb b/qa/qa/resource/group_access_token.rb
new file mode 100644
index 00000000000..934348a1737
--- /dev/null
+++ b/qa/qa/resource/group_access_token.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'date'
+
+module QA
+ module Resource
+ class GroupAccessToken < Base
+ attr_writer :name
+
+ attribute :id
+ attribute :group do
+ Group.fabricate!
+ end
+
+ attribute :token do
+ Page::Group::Settings::AccessTokens.perform(&:created_access_token)
+ end
+
+ def api_get_path
+ "/groups/#{group.id}/access_tokens"
+ end
+
+ def api_post_path
+ api_get_path
+ end
+
+ def name
+ @name || 'api-group-access-token'
+ end
+
+ def api_post_body
+ {
+ name: name,
+ scopes: ["api"]
+ }
+ end
+
+ def api_delete_path
+ "/groups/#{group.id}/access_tokens/#{id}"
+ end
+
+ def resource_web_url(resource)
+ super
+ rescue ResourceURLMissingError
+ # this particular resource does not expose a web_url property
+ end
+
+ def revoke_via_ui!
+ Page::Group::Settings::AccessTokens.perform do |tokens_page|
+ tokens_page.revoke_first_token_with_name(name)
+ end
+ end
+
+ def fabricate!
+ Flow::Login.sign_in_unless_signed_in
+
+ group.visit!
+
+ Page::Group::Menu.perform(&:go_to_access_token_settings)
+
+ Page::Group::Settings::AccessTokens.perform do |token_page|
+ token_page.fill_token_name(name || 'api-project-access-token')
+ token_page.check_api
+ # 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
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/personal_access_token.rb b/qa/qa/resource/personal_access_token.rb
index d992d7987b4..a12c210ea0e 100644
--- a/qa/qa/resource/personal_access_token.rb
+++ b/qa/qa/resource/personal_access_token.rb
@@ -30,7 +30,7 @@ module QA
fabricate!
end
- QA::Resource::PersonalAccessTokenCache.set_token_for_username(user.username, token)
+ QA::Resource::PersonalAccessTokenCache.set_token_for_username(user.username, token) if @user
resource
end
@@ -61,7 +61,7 @@ module QA
end
def fabricate!
- Flow::Login.sign_in_unless_signed_in(as: user)
+ Flow::Login.sign_in_unless_signed_in(user: user)
Page::Main::Menu.perform(&:click_edit_profile_link)
Page::Profile::Menu.perform(&:click_access_tokens)
diff --git a/qa/qa/resource/personal_access_token_cache.rb b/qa/qa/resource/personal_access_token_cache.rb
index 617779173bd..3e9dc3fd7df 100644
--- a/qa/qa/resource/personal_access_token_cache.rb
+++ b/qa/qa/resource/personal_access_token_cache.rb
@@ -10,6 +10,7 @@ module QA
end
def self.set_token_for_username(username, token)
+ QA::Runtime::Logger.info(%Q[Caching token for username: #{username}, last six chars of token:#{token[-6..]}])
@personal_access_tokens[username] = token
end
end
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index 59964c5833d..825041cbead 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -224,6 +224,10 @@ module QA
"#{api_get_path}/releases"
end
+ def api_housekeeping_path
+ "/projects/#{id}/housekeeping"
+ end
+
def api_post_body
post_body = {
name: name,
@@ -447,6 +451,31 @@ module QA
end
end
+ # Calls the API endpoint that triggers the backend service that performs repository housekeeping (garbage
+ # collection and similar tasks).
+ def perform_housekeeping
+ Runtime::Logger.debug("Calling API endpoint #{api_housekeeping_path}")
+
+ response = post(request_url(api_housekeeping_path), nil)
+
+ unless response.code == HTTP_STATUS_CREATED
+ raise ResourceQueryError,
+ "Could not perform housekeeping. Request returned (#{response.code}): `#{response.body}`."
+ end
+ end
+
+ # Gets project statistics.
+ #
+ # @return [Hash] the project usage data including repository size.
+ def statistics
+ response = get(request_url("#{api_get_path}?statistics=true"))
+ data = parse_body(response)
+
+ raise "Could not get project usage statistics" unless data.key?(:statistics)
+
+ data[:statistics]
+ end
+
protected
# Return subset of fields for comparing projects
diff --git a/qa/qa/resource/runner.rb b/qa/qa/resource/runner.rb
index 278bdd1cabd..6d5ff71b2ba 100644
--- a/qa/qa/resource/runner.rb
+++ b/qa/qa/resource/runner.rb
@@ -74,12 +74,7 @@ module QA
def list_of_runners(tag_list: nil)
url = tag_list ? "#{api_post_path}?tag_list=#{tag_list.compact.join(',')}" : api_post_path
- response = get(request_url(url, per_page: '100'))
-
- # Capturing 500 error code responses to log this issue better. We can consider cleaning it up once https://gitlab.com/gitlab-org/gitlab/-/issues/331753 is addressed.
- raise "Response returned a #{response.code} error code. #{response.body}" if response.code == Support::API::HTTP_STATUS_SERVER_ERROR
-
- parse_body(response)
+ auto_paginated_response(request_url(url))
end
def reload!
diff --git a/qa/qa/resource/ssh_key.rb b/qa/qa/resource/ssh_key.rb
index 9e178a425dd..dd475d7fa66 100644
--- a/qa/qa/resource/ssh_key.rb
+++ b/qa/qa/resource/ssh_key.rb
@@ -10,7 +10,7 @@ module QA
attribute :id
- def_delegators :key, :private_key, :public_key, :md5_fingerprint
+ def_delegators :key, :private_key, :public_key, :md5_fingerprint, :sha256_fingerprint
def initialize
self.title = Time.now.to_f
@@ -39,7 +39,7 @@ module QA
end
def api_delete
- QA::Runtime::Logger.debug("Deleting SSH key with title '#{title}' and fingerprint '#{md5_fingerprint}'")
+ QA::Runtime::Logger.debug("Deleting SSH key with title '#{title}' and fingerprint '#{sha256_fingerprint}'")
super
end
diff --git a/qa/qa/resource/user.rb b/qa/qa/resource/user.rb
index eab428a61e7..2fb8b18b71f 100644
--- a/qa/qa/resource/user.rb
+++ b/qa/qa/resource/user.rb
@@ -104,12 +104,6 @@ module QA
false
end
- def api_delete
- super
-
- QA::Runtime::Logger.debug("Deleted user '#{username}'")
- end
-
def api_delete_path
"/users/#{id}?hard_delete=#{hard_delete_on_api_removal}"
rescue NoValueError
@@ -163,6 +157,20 @@ module QA
end
end
+ # Get users from the API
+ #
+ # @param [Integer] per_page the number of pages to traverse (used for pagination)
+ # @return [Array<Hash>] parsed response body
+ def self.all(per_page: 100)
+ response = nil
+ Resource::User.init do |user|
+ response = user.get(Runtime::API::Request.new(Runtime::API::Client.as_admin,
+ '/users',
+ per_page: per_page.to_s).url)
+ raise ResourceQueryError unless response.code == 200
+ end.parse_body(response)
+ end
+
def approve!
response = post(Runtime::API::Request.new(api_client, api_approve_path).url, nil)
return if response.code == 201
diff --git a/qa/qa/runtime/api/request.rb b/qa/qa/runtime/api/request.rb
index c1df5e84f6c..bc1c5fd71ac 100644
--- a/qa/qa/runtime/api/request.rb
+++ b/qa/qa/runtime/api/request.rb
@@ -46,7 +46,7 @@ module QA
if query_string.any?
full_path << (path.include?('?') ? '&' : '?')
- full_path << query_string.map { |k, v| "#{k}=#{CGI.escape(v)}" }.join('&')
+ full_path << query_string.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')
end
full_path
diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb
index 03178661826..f705fe54b97 100644
--- a/qa/qa/runtime/browser.rb
+++ b/qa/qa/runtime/browser.rb
@@ -16,7 +16,7 @@ module QA
NotRespondingError = Class.new(RuntimeError)
- CAPYBARA_MAX_WAIT_TIME = 10
+ CAPYBARA_MAX_WAIT_TIME = Env.max_capybara_wait_time
def self.blank_page?
['', 'about:blank', 'data:,'].include?(Capybara.current_session.driver.browser.current_url)
diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb
index 8ad5b107c08..f7aca2571c9 100644
--- a/qa/qa/runtime/env.rb
+++ b/qa/qa/runtime/env.rb
@@ -263,14 +263,6 @@ module QA
ENV['GITLAB_QA_PASSWORD_6']
end
- def gitlab_qa_2fa_owner_username_1
- ENV['GITLAB_QA_2FA_OWNER_USERNAME_1'] || 'gitlab-qa-2fa-owner-user1'
- end
-
- def gitlab_qa_2fa_owner_password_1
- ENV['GITLAB_QA_2FA_OWNER_PASSWORD_1']
- end
-
def gitlab_qa_1p_email
ENV['GITLAB_QA_1P_EMAIL']
end
@@ -469,6 +461,29 @@ module QA
enabled?(ENV['QA_SKIP_SMOKE_RELIABLE'], default: false)
end
+ # ENV variables for authenticating against a private container registry
+ # These need to be set if using the
+ # Service::DockerRun::Mixins::ThirdPartyDocker module
+ def third_party_docker_registry
+ ENV['QA_THIRD_PARTY_DOCKER_REGISTRY']
+ end
+
+ def third_party_docker_repository
+ ENV['QA_THIRD_PARTY_DOCKER_REPOSITORY']
+ end
+
+ def third_party_docker_user
+ ENV['QA_THIRD_PARTY_DOCKER_USER']
+ end
+
+ def third_party_docker_password
+ ENV['QA_THIRD_PARTY_DOCKER_PASSWORD']
+ end
+
+ def max_capybara_wait_time
+ ENV.fetch('MAX_CAPYBARA_WAIT_TIME', 10).to_i
+ end
+
private
def remote_grid_credentials
diff --git a/qa/qa/runtime/feature.rb b/qa/qa/runtime/feature.rb
index db3a59b0549..5e1dd696405 100644
--- a/qa/qa/runtime/feature.rb
+++ b/qa/qa/runtime/feature.rb
@@ -59,10 +59,15 @@ module QA
feature['state'] == 'conditional' && scopes.present? && enabled_scope?(feature['gates'], **scopes)
else
# The feature wasn't found via the API so we check for a default value.
- file = Pathname.new('../config/feature_flags')
- .expand_path(Runtime::Path.qa_root)
- .glob("**/#{key}.yml")
- .first
+ # We expand the path include both ee and jh.
+
+ pattern = if GitlabEdition.jh?
+ "#{File.expand_path('../{ee/,jh/,}config/feature_flags', QA::Runtime::Path.qa_root)}/**/#{key}.yml"
+ else
+ "#{File.expand_path('../{ee/,}config/feature_flags', QA::Runtime::Path.qa_root)}/**/#{key}.yml"
+ end
+
+ file = Dir.glob(pattern).first
raise UnknownFeatureFlagError, "No feature flag found named '#{key}'" unless file
diff --git a/qa/qa/runtime/key/base.rb b/qa/qa/runtime/key/base.rb
index 72d1673438a..4ed2ebd3706 100644
--- a/qa/qa/runtime/key/base.rb
+++ b/qa/qa/runtime/key/base.rb
@@ -4,7 +4,7 @@ module QA
module Runtime
module Key
class Base
- attr_reader :name, :bits, :private_key, :public_key, :md5_fingerprint
+ attr_reader :name, :bits, :private_key, :public_key, :md5_fingerprint, :sha256_fingerprint
def initialize(name, bits)
@name = name
@@ -26,11 +26,15 @@ module QA
Service::Shellout.shell(cmd)
end
+ def fingerprint(path, hash_alg)
+ `ssh-keygen -l -E #{hash_alg} -f #{path} | cut -d' ' -f2 | cut -d: -f2-`.chomp
+ end
+
def populate_key_data(path)
@private_key = ::File.binread(path)
@public_key = ::File.binread("#{path}.pub")
- @md5_fingerprint =
- `ssh-keygen -l -E md5 -f #{path} | cut -d' ' -f2 | cut -d: -f2-`.chomp
+ @md5_fingerprint = fingerprint(path, :md5)
+ @sha256_fingerprint = fingerprint(path, :sha256)
end
end
end
diff --git a/qa/qa/scenario/template.rb b/qa/qa/scenario/template.rb
index 99906ca44d9..56ab4e14352 100644
--- a/qa/qa/scenario/template.rb
+++ b/qa/qa/scenario/template.rb
@@ -86,3 +86,5 @@ module QA
end
end
end
+
+QA::Scenario::Template.prepend_mod_with('Scenario::Template', namespace: QA)
diff --git a/qa/qa/service/docker_run/base.rb b/qa/qa/service/docker_run/base.rb
index 53980b8e051..c91f68d31a0 100644
--- a/qa/qa/service/docker_run/base.rb
+++ b/qa/qa/service/docker_run/base.rb
@@ -6,11 +6,34 @@ module QA
class Base
include Service::Shellout
+ def self.authenticated_registries
+ @authenticated_registries ||= {}
+ end
+
def initialize
@network = Runtime::Scenario.attributes[:network] || 'test'
@runner_network = Runtime::Scenario.attributes[:runner_network] || @network
end
+ # Authenticate against a container registry
+ # If authentication is successful, will cache registry
+ #
+ # @param registry [String] registry to authenticate against
+ # @param user [String]
+ # @param password [String]
+ # @param force [Boolean] force authentication if already authenticated
+ # @return [Void]
+ def login(registry, user:, password:, force: false)
+ return if self.class.authenticated_registries[registry] && !force
+
+ shell(
+ %(docker login --username "#{user}" --password "#{password}" #{registry}),
+ mask_secrets: [password]
+ )
+
+ self.class.authenticated_registries[registry] = true
+ end
+
def logs
shell "docker logs #{@name}"
end
diff --git a/qa/qa/service/docker_run/mixins/third_party_docker.rb b/qa/qa/service/docker_run/mixins/third_party_docker.rb
new file mode 100644
index 00000000000..b8c66d75d6b
--- /dev/null
+++ b/qa/qa/service/docker_run/mixins/third_party_docker.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+module QA
+ module Service
+ module DockerRun
+ ThirdPartyValidationError = Class.new(StandardError)
+
+ module Mixins
+ # Mixin for classes that inherit from Service::DockerRun::Base
+ #
+ # Helper for authenticating against private repositories.
+ # registry.gitlab.com/gitlab-org/quality/third-party-docker-images
+ module ThirdPartyDocker
+ # @return [Void]
+ def authenticate_third_party(force: false)
+ raise_validation_error unless can_authenticate_third_party?
+
+ login(
+ third_party_registry,
+ user: third_party_registry_user,
+ password: third_party_registry_password,
+ force: force
+ )
+ end
+
+ def third_party_registry
+ Runtime::Env.third_party_docker_registry
+ end
+
+ def third_party_repository
+ Runtime::Env.third_party_docker_repository
+ end
+
+ def third_party_registry_user
+ Runtime::Env.third_party_docker_user
+ end
+
+ def third_party_registry_password
+ Runtime::Env.third_party_docker_password
+ end
+
+ private
+
+ def raise_validation_error
+ raise ThirdPartyValidationError, 'Third party docker environment variable(s) are not set'
+ end
+
+ def can_authenticate_third_party?
+ [
+ :third_party_registry,
+ :third_party_registry_user,
+ :third_party_registry_password
+ ].all? { |method| send(method).present? }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/service/shellout.rb b/qa/qa/service/shellout.rb
index 376e4f74845..9b93297f6ff 100644
--- a/qa/qa/service/shellout.rb
+++ b/qa/qa/service/shellout.rb
@@ -14,7 +14,7 @@ module QA
def shell(command, stdin_data: nil, fail_on_exception: true, stream_progress: true, mask_secrets: []) # rubocop:disable Metrics/CyclomaticComplexity
cmd_string = Array(command).join(' ')
- QA::Runtime::Logger.info("Executing: `#{cmd_string.cyan}`")
+ QA::Runtime::Logger.info("Executing: `#{mask_secrets_on_string(cmd_string, mask_secrets).cyan}`")
Open3.popen2e(*command) do |stdin, out, wait|
stdin.puts(stdin_data) if stdin_data
diff --git a/qa/qa/specs/features/api/1_manage/group_access_token_spec.rb b/qa/qa/specs/features/api/1_manage/group_access_token_spec.rb
new file mode 100644
index 00000000000..7d3916641aa
--- /dev/null
+++ b/qa/qa/specs/features/api/1_manage/group_access_token_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Manage' do
+ describe 'Group access token' do
+ let(:group_access_token) { QA::Resource::GroupAccessToken.fabricate_via_api! }
+ let(:api_client) { Runtime::API::Client.new(:gitlab, personal_access_token: group_access_token.token) }
+ let(:project) do
+ Resource::Project.fabricate! do |project|
+ project.name = 'project-for-group-access-token'
+ project.group = group_access_token.group
+ project.initialize_with_readme = true
+ end
+ end
+
+ it(
+ 'can be used to create a file via the project API',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/367064'
+ ) do
+ expect do
+ Resource::File.fabricate_via_api! do |file|
+ file.api_client = api_client
+ file.project = project
+ file.branch = "new_branch_#{SecureRandom.hex(8)}"
+ file.commit_message = 'Add new file'
+ file.name = "text-#{SecureRandom.hex(8)}.txt"
+ file.content = 'New file'
+ end
+ end.not_to raise_error
+ end
+
+ it(
+ 'can be used to commit via the API',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/367067'
+ ) do
+ expect do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.api_client = api_client
+ commit.project = project
+ commit.branch = "new_branch_#{SecureRandom.hex(8)}"
+ commit.start_branch = project.default_branch
+ commit.commit_message = 'Add new file'
+ commit.add_files([
+ { file_path: "text-#{SecureRandom.hex(8)}.txt", content: 'new file' }
+ ])
+ end
+ end.not_to raise_error
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb
index 6585d08d2ac..c47afbd23f0 100644
--- a/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb
@@ -1,11 +1,10 @@
# frozen_string_literal: true
+# Lifesize project import test executed from https://gitlab.com/gitlab-org/manage/import/import-metrics
+
# rubocop:disable Rails/Pluck
module QA
- # Only executes in custom job/pipeline
- # https://gitlab.com/gitlab-org/manage/import/import-github-performance
- #
- RSpec.describe 'Manage', :github, :requires_admin, only: { job: 'large-github-import' } do
+ RSpec.describe 'Manage', :github, requires_admin: 'creates users', only: { job: 'large-github-import' } do
describe 'Project import' do
let(:logger) { Runtime::Logger.logger }
let(:differ) { RSpec::Support::Differ.new(color: true) }
@@ -108,7 +107,6 @@ module QA
# rubocop:disable RSpec/InstanceVariable
after do |example|
- user.remove_via_api! unless example.exception
next unless defined?(@import_time)
# save data for comparison notification creation
@@ -117,6 +115,7 @@ module QA
{
importer: :github,
import_time: @import_time,
+ errors: imported_project.project_import_status[:failed_relations],
reported_stats: @stats,
source: {
name: "GitHub",
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb
index bb4b0472398..74a00e1c74c 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb
@@ -7,27 +7,27 @@ module QA
describe 'Gitlab migration' do
include_context 'with gitlab project migration'
- context 'with project issues' do
- let!(:source_issue) do
- Resource::Issue.fabricate_via_api! do |issue|
- issue.api_client = api_client
- issue.project = source_project
- issue.labels = %w[label_one label_two]
- end
+ let!(:source_issue) do
+ Resource::Issue.fabricate_via_api! do |issue|
+ issue.api_client = api_client
+ issue.project = source_project
+ issue.labels = %w[label_one label_two]
end
+ end
- let!(:source_comment) { source_issue.add_comment(body: 'This is a test comment!') }
-
- let(:imported_issues) { imported_projects.first.issues }
+ let(:imported_issues) { imported_projects.first.issues }
- let(:imported_issue) do
- issue = imported_issues.first
- Resource::Issue.init do |resource|
- resource.api_client = api_client
- resource.project = imported_projects.first
- resource.iid = issue[:iid]
- end
+ let(:imported_issue) do
+ issue = imported_issues.first
+ Resource::Issue.init do |resource|
+ resource.api_client = api_client
+ resource.project = imported_projects.first
+ resource.iid = issue[:iid]
end
+ end
+
+ context 'with project issues' do
+ let!(:source_comment) { source_issue.add_comment(body: 'This is a test comment!') }
let(:imported_comments) { imported_issue.comments }
@@ -46,6 +46,34 @@ module QA
end
end
end
+
+ context "with designs" do
+ let!(:source_design) do
+ Flow::Login.sign_in(as: user)
+
+ Resource::Design.fabricate_via_browser_ui! do |design|
+ design.api_client = api_client
+ design.issue = source_issue
+ end.reload!
+ end
+
+ let(:imported_design) do
+ Resource::Design.init do |design|
+ design.api_client = api_client
+ design.issue = imported_issue.reload!
+ end.reload!
+ end
+
+ it(
+ 'successfully imports design',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366449'
+ ) do
+ expect_import_finished
+ expect(imported_issues.count).to eq(1)
+
+ expect(imported_design.full_path).to eq(source_design.full_path)
+ end
+ end
end
end
end
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
index 89150c73069..83cc44f9958 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
@@ -1,16 +1,16 @@
# frozen_string_literal: true
+# Lifesize project import test executed from https://gitlab.com/gitlab-org/manage/import/import-metrics
+
# rubocop:disable Rails/Pluck, Layout/LineLength, RSpec/MultipleMemoizedHelpers
module QA
- RSpec.describe "Manage", requires_admin: 'uses admin API client for resource creation',
- feature_flag: { name: 'bulk_import_projects', scope: :global },
- only: { job: 'large-gitlab-import' } do
+ RSpec.describe "Manage", requires_admin: 'creates users', only: { job: 'large-gitlab-import' } do
describe "Gitlab migration" do
let(:logger) { Runtime::Logger.logger }
let(:differ) { RSpec::Support::Differ.new(color: true) }
let(:gitlab_group) { ENV['QA_LARGE_IMPORT_GROUP'] || 'gitlab-migration' }
let(:gitlab_project) { ENV['QA_LARGE_IMPORT_REPO'] || 'dri' }
- let(:gitlab_source_address) { 'https://staging.gitlab.com' }
+ let(:gitlab_source_address) { ENV['QA_LARGE_IMPORT_SOURCE_URL'] || 'https://staging.gitlab.com' }
let(:import_wait_duration) do
{
@@ -99,8 +99,6 @@ module QA
let(:issues) { fetch_issues(imported_project, target_api_client) }
before do
- Runtime::Feature.enable(:bulk_import_projects)
-
destination_group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
end
@@ -114,6 +112,7 @@ module QA
{
importer: :gitlab,
import_time: @import_time,
+ errors: imported_group.import_details.sum([]) { |details| details[:failures] },
source: {
name: "GitLab Source",
project_name: source_project.path_with_namespace,
@@ -146,7 +145,7 @@ module QA
issue_comments: issues.sum { |_k, v| v[:comments].length }
}
},
- not_imported: {
+ diff: {
mrs: @mr_diff,
issues: @issue_diff
}
@@ -256,11 +255,12 @@ module QA
count_msg = "Expected to contain same amount of #{type}s. Source: #{expected.length}, Target: #{actual.length}"
expect(actual.length).to eq(expected.length), count_msg
- missing_comments = verify_comments(type, actual, expected)
+ comment_diff = verify_comments(type, actual, expected)
{
- "#{type}s": (expected.keys - actual.keys).map { |it| actual[it]&.slice(:title, :url) }.compact,
- "#{type}_comments": missing_comments
+ "missing_#{type}s": (expected.keys - actual.keys).map { |it| actual[it]&.slice(:title, :url) }.compact,
+ "extra_#{type}s": (actual.keys - expected.keys).map { |it| expected[it]&.slice(:title, :url) }.compact,
+ "#{type}_comments": comment_diff
}
end
@@ -271,7 +271,7 @@ module QA
# @param [Hash] expected
# @return [Hash]
def verify_comments(type, actual, expected)
- actual.each_with_object([]) do |(key, actual_item), missing_comments|
+ actual.each_with_object([]) do |(key, actual_item), diff|
expected_item = expected[key]
title = actual_item[:title]
msg = "expected #{type} with title '#{title}' to have"
@@ -305,16 +305,18 @@ module QA
expect(actual_comments.length).to eq(expected_comments.length), comment_count_msg
expect(actual_comments).to match_array(expected_comments)
- # Save missing comments
+ # Save comment diff
#
- comment_diff = expected_comments - actual_comments
- next if comment_diff.empty?
+ missing_comments = expected_comments - actual_comments
+ extra_comments = actual_comments - expected_comments
+ next if missing_comments.empty? && extra_comments.empty?
- missing_comments << {
+ diff << {
title: title,
target_url: actual_item[:url],
source_url: expected_item[:url],
- missing_comments: comment_diff
+ missing_comments: missing_comments,
+ extra_comments: extra_comments
}
end
end
@@ -379,10 +381,17 @@ module QA
#
# @return [Regex]
def created_by_pattern
- @created_by_pattern ||= /\n\n \*By gitlab-migration on \S+ \(imported from GitLab\)\*/
+ @created_by_pattern ||= /\n\n \*By #{importer_username_pattern} on \S+ \(imported from GitLab\)\*/
+ end
+
+ # Username of importer user for removal from comments and descriptions
+ #
+ # @return [String]
+ def importer_username_pattern
+ @importer_username_pattern ||= ENV['QA_LARGE_IMPORT_USER_PATTERN'] || "(gitlab-migration|GitLab QA Bot)"
end
- # Remove added prefixes and legacy diff format from comments
+ # Remove added prefixes from comments
#
# @param [String] body
# @return [String]
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb
index 5a9cef6fded..3581ad3d207 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb
@@ -68,7 +68,7 @@ module QA
imported_group # trigger import
expect { imported_group.import_status }.to eventually_eq('finished').within(import_wait_duration)
- expect(imported_projects.count).to eq(1), 'Expected to have 1 imported project'
+ expect(imported_projects.count).to eq(1), "Expected to have 1 imported project. Found: #{imported_projects.count}"
end
before do
diff --git a/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb b/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb
new file mode 100644
index 00000000000..406ff191f95
--- /dev/null
+++ b/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create' do
+ describe 'Repository Usage Quota', :skip_live_env, feature_flag: {
+ name: 'gitaly_revlist_for_repo_size',
+ scope: :global
+ } do
+ let(:project_name) { "repository-usage-#{SecureRandom.hex(8)}" }
+ let!(:flag_enabled) { Runtime::Feature.enabled?(:gitaly_revlist_for_repo_size) }
+
+ before do
+ Runtime::Feature.enable(:gitaly_revlist_for_repo_size)
+ end
+
+ after do
+ Runtime::Feature.set({ gitaly_revlist_for_repo_size: flag_enabled })
+ end
+
+ # Previously, GitLab could report a size many times larger than a cloned copy. For example, 37Gb reported for a
+ # repo that is 2Gb when cloned.
+ #
+ # After changing Gitaly to use `git rev-list` to determine the size of a repo, the reported size is much more
+ # accurate. Nonetheless, the size of a clone is still not necessarily the same as the original. We can't do a
+ # precise comparison because of the non-deterministic nature of how git packs files. Depending on the history of
+ # the repository the sizes can vary considerably. For example, at the time of writing this a clone of
+ # www-gitlab-com was 5.27Gb, about 5% smaller than the size GitLab reported, 5.51Gb.
+ #
+ # There are unit tests to verify the accuracy of GitLab's determination of repo size, so for this test we
+ # attempt to detect large differences that could indicate a regression to previous behavior.
+ it 'matches cloned repo usage to reported usage',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/365196' do
+ project = Resource::Project.fabricate_via_api! do |project|
+ project.name = project_name
+ end
+
+ shared_data = SecureRandom.random_bytes(500000)
+
+ Resource::Repository::ProjectPush.fabricate! do |push|
+ push.project = project
+ push.file_name = 'data.dat'
+ push.file_content = SecureRandom.random_bytes(500000) + shared_data
+ push.commit_message = 'Add file'
+ end
+
+ local_size = Git::Repository.perform do |repository|
+ repository.uri = project.repository_http_location.uri
+ repository.use_default_credentials
+ repository.clone
+ repository.configure_identity('GitLab QA', 'root@gitlab.com')
+ # These two commits add a total of 1mb, but half of that is the same as content that has already been added to
+ # the repository, so garbage collection will deduplicate it.
+ repository.commit_file("new-data", SecureRandom.random_bytes(500000), "Add file")
+ repository.commit_file("redudant-data", shared_data, "Add file")
+ repository.run_gc
+ repository.push_changes
+ repository.local_size
+ end
+
+ # The size of the remote repository after all content has been added.
+ initial_size = project.statistics[:repository_size].to_i
+
+ # This is an async process and as a user we have no way to know when it's complete unless the statistics are
+ # updated
+ Support::Retrier.retry_until(max_duration: 60, sleep_interval: 5) do
+ # This should perform the same deduplication as in the local repo
+ project.perform_housekeeping
+
+ project.statistics[:repository_size].to_i != initial_size
+ end
+
+ twentyfive_percent = local_size.to_i * 0.25
+ expect(project.statistics[:repository_size].to_i).to be_within(twentyfive_percent).of(local_size)
+ end
+ end
+ end
+end
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 d7207803d45..79384e374d7 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
@@ -3,8 +3,9 @@
require 'airborne'
module QA
- RSpec.describe 'Package', only: { subdomain: %i[staging pre] }, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/360466', type: :investigating } do
+ RSpec.describe 'Package', only: { subdomain: %i[staging pre] } do
include Support::API
+ include Support::Helpers::MaskToken
describe 'Container Registry' do
let(:api_client) { Runtime::API::Client.new(:gitlab) }
@@ -17,6 +18,12 @@ module QA
end
end
+ let!(:project_access_token) do
+ QA::Resource::ProjectAccessToken.fabricate_via_api! do |pat|
+ pat.project = project
+ end
+ end
+
let(:registry) do
Resource::RegistryRepository.init do |repository|
repository.name = project.path_with_namespace
@@ -25,45 +32,47 @@ module QA
end
end
+ let(:masked_token) do
+ use_ci_variable(name: 'PAT', value: project_access_token.token, project: project)
+ end
+
let(:gitlab_ci_yaml) do
<<~YAML
- stages:
- - build
- - test
-
- build:
- image: docker:19.03.12
- stage: build
- services:
- - docker:19.03.12-dind
- variables:
- IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
- 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
- script:
- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- - docker build -t $IMAGE_TAG .
- - docker push $IMAGE_TAG
- - docker pull $IMAGE_TAG
-
- test:
- image: dwdraju/alpine-curl-jq:latest
- stage: test
- variables:
- MEDIA_TYPE: 'application/vnd.docker.distribution.manifest.v2+json'
- before_script:
- - token=$(curl -u "$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD" "https://$CI_SERVER_HOST/jwt/auth?service=container_registry&scope=repository:$CI_PROJECT_PATH:pull,push,delete" | jq -r '.token')
- script:
- - 'digest=$(curl -L -H "Authorization: Bearer $token" -H "Accept: $MEDIA_TYPE" "https://$CI_REGISTRY/v2/$CI_PROJECT_PATH/manifests/master" | jq -r ".layers[0].digest")'
- - 'curl -L -X DELETE -H "Authorization: Bearer $token" -H "Accept: $MEDIA_TYPE" "https://$CI_REGISTRY/v2/$CI_PROJECT_PATH/blobs/$digest"'
- - 'curl -L --head -H "Authorization: Bearer $token" -H "Accept: $MEDIA_TYPE" "https://$CI_REGISTRY/v2/$CI_PROJECT_PATH/blobs/$digest"'
- - 'digest=$(curl -L -H "Authorization: Bearer $token" -H "Accept: $MEDIA_TYPE" "https://$CI_REGISTRY/v2/$CI_PROJECT_PATH/manifests/master" | jq -r ".config.digest")'
- - 'curl -L -X DELETE -H "Authorization: Bearer $token" -H "Accept: $MEDIA_TYPE" "https://$CI_REGISTRY/v2/$CI_PROJECT_PATH/manifests/$digest"'
- - 'curl -L --head -H "Authorization: Bearer $token" -H "Accept: $MEDIA_TYPE" "https://$CI_REGISTRY/v2/$CI_PROJECT_PATH/manifests/$digest"'
+ stages:
+ - build
+ - test
+
+ build:
+ image: docker:19.03.12
+ stage: build
+ services:
+ - docker:19.03.12-dind
+ variables:
+ IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
+ 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
+ script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+ - docker build -t $IMAGE_TAG .
+ - docker push $IMAGE_TAG
+ - docker pull $IMAGE_TAG
+
+ test:
+ image: dwdraju/alpine-curl-jq:latest
+ stage: test
+ script:
+ - 'id=$(curl --header "PRIVATE-TOKEN: #{masked_token}" "https://${CI_SERVER_HOST}/api/v4/projects/#{project.id}/registry/repositories" | jq ".[0].id")'
+ - echo $id
+ - 'tag_count=$(curl --header "PRIVATE-TOKEN: #{masked_token}" "https://${CI_SERVER_HOST}/api/v4/projects/#{project.id}/registry/repositories/$id/tags" | jq ". | length")'
+ - if [ $tag_count -ne 1 ]; then exit 1; fi;
+ - 'status_code=$(curl --request DELETE --head --output /dev/null --write-out "%{http_code}\n" --header "PRIVATE-TOKEN: #{masked_token}" "https://${CI_SERVER_HOST}/api/v4/projects/#{project.id}/registry/repositories/$id/tags/master")'
+ - if [ $status_code -ne 200 ]; then exit 1; fi;
+ - 'status_code=$(curl --head --output /dev/null --write-out "%{http_code}\n" --header "PRIVATE-TOKEN: #{masked_token}" "https://${CI_SERVER_HOST}/api/v4/projects/#{project.id}/registry/repositories/$id/tags/master")'
+ - if [ $status_code -ne 404 ]; then exit 1; fi;
YAML
end
@@ -71,7 +80,7 @@ module QA
registry&.remove_via_api!
end
- it 'pushes, pulls image to the registry and deletes image blob, manifest and tag', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348001' do
+ it 'pushes, pulls image to the registry and deletes tag', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348001' do
Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.api_client = api_client
@@ -89,14 +98,6 @@ module QA
Support::Retrier.retry_until(max_duration: 300, sleep_interval: 5) do
latest_pipeline_succeed?
end
-
- expect(job_log).to have_content '404 Not Found'
-
- expect(registry).to have_tag('master')
-
- registry.delete_tag
-
- expect(registry).not_to have_tag('master')
end
private
@@ -109,20 +110,6 @@ module QA
latest_pipeline = project.pipelines.first
latest_pipeline[:status] == 'success'
end
-
- def job_log
- pipeline = project.pipelines.first
- pipeline_id = pipeline[:id]
-
- jobs = get Runtime::API::Request.new(api_client, "/projects/#{project.id}/pipelines/#{pipeline_id}/jobs").url
- test_job = parse_body(jobs).first
- test_job_id = test_job[:id]
-
- log = get Runtime::API::Request.new(api_client, "/projects/#{project.id}/jobs/#{test_job_id}/trace").url
- QA::Runtime::Logger.debug(" \n\n ------- Test job log: ------- \n\n #{log} \n -------")
-
- log
- end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/group_access_token_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/group_access_token_spec.rb
new file mode 100644
index 00000000000..9f39d376baf
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/1_manage/group/group_access_token_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Manage' do
+ describe 'Group access tokens' do
+ let(:group_access_token) { QA::Resource::GroupAccessToken.fabricate_via_browser_ui! }
+
+ it(
+ 'can be created and revoked via the UI',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/367044'
+ ) do
+ expect(group_access_token.token).not_to be_nil
+
+ group_access_token.revoke_via_ui!
+ expect(page).to have_text("Revoked access token #{group_access_token.name}!")
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
index c86a649f179..f459c0c71eb 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
@@ -1,10 +1,12 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Manage', :requires_admin, :skip_live_env do
+ RSpec.describe 'Manage', :requires_admin, :skip_live_env, :reliable do
describe '2FA' do
let(:owner_user) do
- Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_2fa_owner_username_1, Runtime::Env.gitlab_qa_2fa_owner_password_1)
+ Resource::User.fabricate_via_api! do |usr|
+ usr.api_client = admin_api_client
+ end
end
let(:developer_user) do
@@ -32,7 +34,10 @@ module QA
group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER)
end
- it 'allows using 2FA recovery code once only', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347937' do
+ it(
+ 'allows using 2FA recovery code once only',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347937'
+ ) do
recovery_code = enable_2fa_for_user_and_fetch_recovery_code(developer_user)
Flow::Login.sign_in(as: developer_user, skip_page_validation: true)
@@ -56,13 +61,6 @@ module QA
expect(page).to have_text('Invalid two-factor code')
end
- after do
- group.set_require_two_factor_authentication(value: 'false')
- group.remove_via_api!
- sandbox_group.remove_via_api!
- developer_user.remove_via_api!
- end
-
def admin_api_client
@admin_api_client ||= Runtime::API::Client.as_admin
end
@@ -74,9 +72,9 @@ module QA
def enable_2fa_for_user_and_fetch_recovery_code(user)
Flow::Login.while_signed_in(as: user) do
Page::Profile::TwoFactorAuth.perform do |two_fa_auth|
- @otp = QA::Support::OTP.new(two_fa_auth.otp_secret_content)
+ otp = QA::Support::OTP.new(two_fa_auth.otp_secret_content)
- two_fa_auth.set_pin_code(@otp.fresh_otp)
+ two_fa_auth.set_pin_code(otp.fresh_otp)
two_fa_auth.set_current_password(user.password)
two_fa_auth.click_register_2fa_app_button
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
index 64614ed654f..c5efa833f04 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
@@ -3,13 +3,15 @@
module QA
RSpec.describe 'Manage', :requires_admin, :skip_live_env do
describe '2FA' do
- let(:owner_user) do
- Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_2fa_owner_username_1, Runtime::Env.gitlab_qa_2fa_owner_password_1)
+ let!(:owner_user) do
+ Resource::User.fabricate_via_api! do |usr|
+ usr.api_client = admin_api_client
+ end
end
let(:sandbox_group) do
Resource::Sandbox.fabricate! do |sandbox_group|
- sandbox_group.path = "gitlab-qa-2fa-sandbox-group"
+ sandbox_group.path = "gitlab-qa-2fa-sandbox-group-#{SecureRandom.hex(8)}"
sandbox_group.api_client = owner_api_client
end
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 5487ecff028..85ab466078a 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
@@ -86,7 +86,10 @@ module QA
end
after do
- @recreated_user&.remove_via_api!
+ if @recreated_user
+ @recreated_user.api_client = admin_api_client
+ @recreated_user.remove_via_api!
+ end
end
def admin_api_client
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 44cae31f5d8..b1d59b90e9c 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
@@ -2,49 +2,45 @@
module QA
RSpec.describe 'Manage' do
- describe 'Check for broken images', :requires_admin do
- before(:context) do
- @api_client = Runtime::API::Client.as_admin
- @new_user = Resource::User.fabricate_via_api! do |user|
- user.api_client = @api_client
- end
- @new_admin = Resource::User.fabricate_via_api! do |user|
- user.admin = true
- user.api_client = @api_client
- end
+ shared_examples 'loads all images' do |admin|
+ let(:api_client) { Runtime::API::Client.as_admin }
- Page::Main::Menu.perform(&:sign_out_if_signed_in)
+ let(:user) do
+ Resource::User.fabricate_via_api! do |resource|
+ resource.admin = admin
+ resource.api_client = api_client
+ end
end
- after(:context) do
- @new_user.remove_via_api!
- @new_admin.remove_via_api!
+ after do
+ user.remove_via_api!
end
- shared_examples 'loads all images' do
- it 'loads all images' do
- Runtime::Browser.visit(:gitlab, Page::Main::Login)
- Page::Main::Login.perform { |login| login.sign_in_using_credentials(user: new_user) }
+ it 'loads all images' do
+ Flow::Login.sign_in(as: user)
- Page::Dashboard::Welcome.perform do |welcome|
- expect(welcome).to have_welcome_title("Welcome to GitLab")
+ Page::Dashboard::Welcome.perform do |welcome|
+ expect(welcome).to have_welcome_title("Welcome to GitLab")
- # This would be better if it were a visual validation test
- expect(welcome).to have_loaded_all_images
- end
+ # This would be better if it were a visual validation test
+ expect(welcome).to have_loaded_all_images
end
end
+ end
- context 'when logged in as a new user', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347885' do
- it_behaves_like 'loads all images' do
- let(:new_user) { @new_user }
- end
+ describe 'Check for broken images', :requires_admin, :reliable do
+ context(
+ 'when logged in as a new user',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347885'
+ ) do
+ it_behaves_like 'loads all images', false
end
- context 'when logged in as a new admin', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347884' do
- it_behaves_like 'loads all images' do
- let(:new_user) { @new_admin }
- end
+ context(
+ 'when logged in as a new admin',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347884'
+ ) do
+ it_behaves_like 'loads all images', true
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb
index dd27e85af3c..8201e2772aa 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb
@@ -1,8 +1,7 @@
# frozen_string_literal: true
module QA
- # Tagging with issue for a transient invite group modal search bug, but does not require quarantine at this time
- RSpec.describe 'Manage', :transient, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/349379' do
+ RSpec.describe 'Manage' do
describe 'Invite group' do
shared_examples 'invites group to project' do
it 'verifies group is added and members can access project with correct access level' do
@@ -13,7 +12,7 @@ module QA
expect(project_members).to have_group(group.path)
end
- Flow::Login.sign_in(as: @user)
+ Flow::Login.sign_in(as: user)
Page::Dashboard::Projects.perform do |projects|
projects.filter_by_name(project.name)
@@ -29,13 +28,11 @@ module QA
end
end
- before(:context) do
- @user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
- end
+ let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
before do
Flow::Login.sign_in
- group.add_member(@user, Resource::Members::AccessLevel::MAINTAINER)
+ group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
project.visit!
end
@@ -75,11 +72,6 @@ module QA
it_behaves_like 'invites group to project'
end
-
- after do
- project&.remove_via_api!
- group&.remove_via_api!
- end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb
deleted file mode 100644
index fb486ab1532..00000000000
--- a/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb
+++ /dev/null
@@ -1,94 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Manage' do
- describe 'Personal project permissions', :reliable do
- let!(:owner) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
-
- let!(:owner_api_client) { Runtime::API::Client.new(:gitlab, user: owner) }
-
- let!(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.api_client = owner_api_client
- project.name = 'qa-owner-personal-project'
- project.personal_namespace = owner.username
- end
- end
-
- after do
- project&.remove_via_api!
- end
-
- context 'when user is added as Owner' do
- let(:issue) do
- Resource::Issue.fabricate_via_api! do |issue|
- issue.api_client = owner_api_client
- issue.project = project
- issue.title = 'Test Owner deletes issue'
- end
- end
-
- before do
- Flow::Login.sign_in(as: owner)
- end
-
- it "has Owner role with Owner permissions", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352542' do
- Page::Dashboard::Projects.perform do |projects|
- projects.filter_by_name(project.name)
-
- expect(projects).to have_project_with_access_role(project.name, 'Owner')
- end
-
- expect_owner_permissions_allow_delete_issue
- end
- end
-
- context 'when user is added as Maintainer' do
- let(:maintainer) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) }
-
- let(:issue) do
- Resource::Issue.fabricate_via_api! do |issue|
- issue.api_client = owner_api_client
- issue.project = project
- issue.title = 'Test Maintainer deletes issue'
- end
- end
-
- before do
- project.add_member(maintainer, Resource::Members::AccessLevel::MAINTAINER)
- Flow::Login.sign_in(as: maintainer)
- end
-
- it "has Maintainer role without Owner permissions", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352607' do
- Page::Dashboard::Projects.perform do |projects|
- projects.filter_by_name(project.name)
-
- expect(projects).to have_project_with_access_role(project.name, 'Maintainer')
- end
-
- expect_maintainer_permissions_do_not_allow_delete_issue
- end
- end
-
- private
-
- def expect_owner_permissions_allow_delete_issue
- issue.visit!
-
- Page::Project::Issue::Show.perform(&:delete_issue)
-
- Page::Project::Issue::Index.perform do |index|
- expect(index).not_to have_issue(issue)
- end
- end
-
- def expect_maintainer_permissions_do_not_allow_delete_issue
- issue.visit!
-
- Page::Project::Issue::Show.perform do |issue|
- expect(issue).not_to have_delete_issue_button
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb
new file mode 100644
index 00000000000..2f148c4051c
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Manage' do
+ describe 'Project owner permissions' do
+ let!(:owner) do
+ Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
+ end
+
+ let!(:owner_api_client) { Runtime::API::Client.new(:gitlab, user: owner) }
+
+ let!(:maintainer) do
+ Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2)
+ end
+
+ shared_examples 'when user is added as owner' do |project_type, testcase|
+ let!(:issue) do
+ Resource::Issue.fabricate_via_api! do |issue|
+ issue.api_client = owner_api_client
+ issue.project = project
+ issue.title = 'Test Owner Deletes Issue'
+ end
+ end
+
+ before do
+ project.add_member(owner, Resource::Members::AccessLevel::OWNER) if project_type == :group_project
+ Flow::Login.sign_in(as: owner)
+ end
+
+ it "has owner role with owner permissions", testcase: testcase do
+ Page::Dashboard::Projects.perform do |projects|
+ projects.filter_by_name(project.name)
+
+ expect(projects).to have_project_with_access_role(project.name, 'Owner')
+ end
+
+ issue.visit!
+
+ Page::Project::Issue::Show.perform(&:delete_issue)
+
+ Page::Project::Issue::Index.perform do |index|
+ expect(index).not_to have_issue(issue)
+ end
+ end
+ end
+
+ shared_examples 'when user is added as maintainer' do |testcase|
+ let!(:issue) do
+ Resource::Issue.fabricate_via_api! do |issue|
+ issue.api_client = owner_api_client
+ issue.project = project
+ issue.title = 'Test Maintainer Deletes Issue'
+ end
+ end
+
+ before do
+ project.add_member(maintainer, Resource::Members::AccessLevel::MAINTAINER)
+ Flow::Login.sign_in(as: maintainer)
+ end
+
+ it "has maintainer role without owner permissions", testcase: testcase do
+ Page::Dashboard::Projects.perform do |projects|
+ projects.filter_by_name(project.name)
+
+ expect(projects).to have_project_with_access_role(project.name, 'Maintainer')
+ end
+
+ issue.visit!
+
+ Page::Project::Issue::Show.perform do |issue|
+ expect(issue).not_to have_delete_issue_button
+ end
+ end
+ end
+
+ context 'for personal projects' do
+ let!(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.api_client = owner_api_client
+ project.name = 'qa-owner-personal-project'
+ project.personal_namespace = owner.username
+ end
+ end
+
+ it_behaves_like 'when user is added as owner', :personal_project, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352542'
+ it_behaves_like 'when user is added as maintainer', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352607'
+ end
+
+ context 'for group projects' do
+ let!(:group) { Resource::Group.fabricate_via_api! }
+
+ let!(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'qa-owner-group-project'
+ end
+ end
+
+ it_behaves_like 'when user is added as owner', :group_project, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366436'
+ it_behaves_like 'when user is added as maintainer', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366435'
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb
index 11cf4f60a80..a384dc16064 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb
@@ -24,6 +24,7 @@ module QA
let(:group) do
group = QA::Resource::Group.fabricate_via_api! do |group|
group.path = "group_for_follow_user_activity_#{SecureRandom.hex(8)}"
+ group.api_client = admin_api_client
end
group.add_member(followed_user, Resource::Members::AccessLevel::MAINTAINER)
group
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 f41e5985622..b815186cd49 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
@@ -46,19 +46,22 @@ module QA
total = mailhog_data.dig('total')
subjects = mailhog_data.dig('items')
.map(&method(:mailhog_item_subject))
- .join("\n")
Runtime::Logger.debug(%Q[Total number of emails: #{total}])
- Runtime::Logger.debug(%Q[Subjects:\n#{subjects}])
+ Runtime::Logger.debug(%Q[Subjects:\n#{subjects.join("\n")}])
# Expect at least two invitation messages: group and project
- mailhog_data if total >= 2
+ mailhog_data if mailhog_project_message_count(subjects) >= 1
end
end
def mailhog_item_subject(item)
item.dig('Content', 'Headers', 'Subject', 0)
end
+
+ def mailhog_project_message_count(subjects)
+ subjects.count { |subject| subject.include?('project was granted') }
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
index 9c90cf6ae3d..66e2309e173 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Plan', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/293699', type: :bug } do
+ RSpec.describe 'Plan' do
describe 'Assignees' do
let(:user1) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
let(:user2) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) }
diff --git a/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb b/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb
index 5f896c7bf10..71415c4bb57 100644
--- a/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb
@@ -1,7 +1,11 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/366839',
+ type: :test_environment,
+ only: { job: 'review-qa-*' }
+ } do
context 'Design Management' do
let(:issue) { Resource::Issue.fabricate_via_api! }
let(:design_filename) { 'banana_sample.gif' }
diff --git a/qa/qa/specs/features/browser_ui/3_create/design_management/archive_design_content_spec.rb b/qa/qa/specs/features/browser_ui/3_create/design_management/archive_design_content_spec.rb
index de7c95841d6..9b969f563a2 100644
--- a/qa/qa/specs/features/browser_ui/3_create/design_management/archive_design_content_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/design_management/archive_design_content_spec.rb
@@ -1,7 +1,11 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/366839',
+ type: :test_environment,
+ only: { job: 'review-qa-*' }
+ } do
context 'Design Management' do
let(:first_design) { Resource::Design.fabricate! }
@@ -13,7 +17,7 @@ module QA
end
let(:third_design) do
- Resource::Design.fabricate! do |design|
+ Resource::Design.fabricate_via_browser_ui! do |design|
design.issue = second_design.issue
design.filename = 'testfile.png'
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb b/qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb
index 726e86ccdb4..6a0c51245ad 100644
--- a/qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb
@@ -1,10 +1,14 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/366839',
+ type: :test_environment,
+ only: { job: 'review-qa-*' }
+ } do
context 'Design Management' do
let(:design) do
- Resource::Design.fabricate! do |design|
+ Resource::Design.fabricate_via_browser_ui! do |design|
design.filename = 'testfile.png'
end
end
@@ -13,7 +17,10 @@ module QA
Flow::Login.sign_in
end
- it 'user adds a design and modifies it', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347712' do
+ it(
+ 'user adds a design and modifies it',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347712'
+ ) do
design.issue.visit!
Page::Project::Issue::Show.perform do |issue|
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb
index f4ed9f28dac..25dec82b74c 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb
@@ -24,6 +24,7 @@ module QA
Resource::MergeRequest.fabricate_via_browser_ui! do |merge_request|
merge_request.project = project
merge_request.title = merge_request_title
+ merge_request.assignee = 'me'
merge_request.description = merge_request_description
end
@@ -53,6 +54,7 @@ module QA
merge_request.description = merge_request_description
merge_request.project = project
merge_request.milestone = milestone
+ merge_request.assignee = 'me'
merge_request.labels.push(label)
end
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 d66895de9c1..948aedf5aae 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
@@ -9,7 +9,7 @@ module QA
end
end
- let(:revertable_merge_request) do
+ let(:revertible_merge_request) do
Resource::MergeRequest.fabricate_via_api! do |merge_request|
merge_request.project = project
end
@@ -20,10 +20,11 @@ module QA
end
it 'can be reverted', :can_use_large_setup, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347709' do
- revertable_merge_request.visit!
+ revertible_merge_request.visit!
Page::MergeRequest::Show.perform do |merge_request|
merge_request.merge!
+ expect(merge_request).to be_revertible, 'Expected merge request to be in a state to be reverted.'
merge_request.revert_change!
end
@@ -31,7 +32,7 @@ module QA
Page::MergeRequest::Show.perform do |merge_request|
merge_request.click_diffs_tab
- expect(merge_request).to have_file(revertable_merge_request.file_name)
+ expect(merge_request).to have_file(revertible_merge_request.file_name)
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/license_detecton_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/license_detecton_spec.rb
new file mode 100644
index 00000000000..8074e1fa992
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/license_detecton_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create' do
+ describe 'Repository License Detection' do
+ after do
+ project.remove_via_api!
+ end
+
+ let(:project) { Resource::Project.fabricate_via_api! }
+
+ shared_examples 'project license detection' do
+ it 'displays the name of the license on the repository' do
+ license_path = File.expand_path("../../../../../fixtures/software_licenses/#{license_file_name}", __dir__)
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.add_files([{ file_path: 'LICENSE', content: File.read(license_path) }])
+ end
+
+ project.visit!
+
+ Page::Project::Show.perform do |show|
+ expect(show).to have_license(rendered_license_name)
+ end
+ end
+ end
+
+ context 'on a project with a commonly used LICENSE',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366842' do
+ it_behaves_like 'project license detection' do
+ let(:license_file_name) {'bsd-3-clause'}
+ let(:rendered_license_name) {'BSD 3-Clause "New" or "Revised" License'}
+ end
+ end
+
+ context 'on a project with a less commonly used LICENSE',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366843' do
+ it_behaves_like 'project license detection' do
+ let(:license_file_name) {'GFDL-1.2-only'}
+ let(:rendered_license_name) {'Other'}
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb
index 4228c3ed352..9ab322df824 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb
@@ -1,7 +1,11 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/352525',
+ type: :test_environment,
+ only: { job: 'review-qa-*' }
+ } do
describe 'Push mirror a repository over HTTP' do
it 'configures and syncs LFS objects for a (push) mirrored repository', :aggregate_failures, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347847' do
Runtime::Browser.visit(:gitlab, Page::Main::Login)
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb
index 18a77bd5ae3..0323448878b 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'SSH key support', :skip_fips_env do
+ describe 'SSH key support' do
# Note: If you run these tests against GDK make sure you've enabled sshd
# See: https://gitlab.com/gitlab-org/gitlab-qa/blob/master/docs/run_qa_against_gdk.md
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb
index a1a795ce0f3..f374ecff3f2 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'SSH keys support', :smoke, :skip_fips_env do
+ describe 'SSH keys support', :smoke do
key_title = "key for ssh tests #{Time.now.to_f}"
key = nil
@@ -16,7 +16,7 @@ module QA
end
expect(page).to have_content(key.title)
- expect(page).to have_content(key.md5_fingerprint)
+ expect(page).to have_content(key.sha256_fingerprint)
end
# Note this context ensures that the example it contains is executed after the example above. Be aware of the order of execution if you add new examples in either context.
@@ -29,7 +29,7 @@ module QA
end
expect(page).not_to have_content("Title: #{key.title}")
- expect(page).not_to have_content(key.md5_fingerprint)
+ expect(page).not_to have_content(key.sha256_fingerprint)
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb
index 7a0b4674581..8f22a28628f 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Version control for personal snippets', :skip_fips_env do
+ describe 'Version control for personal snippets' do
let(:new_file) { 'new_snippet_file' }
let(:changed_content) { 'changes' }
let(:commit_message) { 'Changes to snippets' }
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb
index d269e02e26d..9a5fe44c927 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Version control for project snippets', :skip_fips_env do
+ describe 'Version control for project snippets' do
let(:new_file) { 'new_snippet_file' }
let(:changed_content) { 'changes' }
let(:commit_message) { 'Changes to snippets' }
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
new file mode 100644
index 00000000000..ac2d374b0ed
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create', :skip_live_env, except: { job: 'review-qa-*' } do
+ describe 'Git Server Hooks' do
+ let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', 'README.md')) }
+
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ # Projects that have names that include pattern 'reject-prereceive' trigger a server hook on orchestrated env
+ # that returns an error string using GL-HOOK-ERR
+ project.name = "project-reject-prereceive-#{SecureRandom.hex(8)}"
+ end
+ end
+
+ before do
+ Flow::Login.sign_in
+ project.visit!
+ end
+
+ context 'Custom error messages' do
+ it 'renders preconfigured error message when user hook failed on commit in WebIDE',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/364751' do
+ Page::Project::Show.perform(&:open_web_ide_via_shortcut)
+ Page::Project::WebIDE::Edit.perform do |ide|
+ ide.upload_file(file_path)
+ ide.commit_changes(wait_for_success: false)
+ expect(ide).to have_text('Custom error message rejecting prereceive hook for projects with GL_PROJECT_PATH')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_lint_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_lint_spec.rb
index 23f212e110b..02ee94381b2 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_lint_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_lint_spec.rb
@@ -2,7 +2,12 @@
module QA
RSpec.describe 'Verify' do
- describe 'Pipeline editor', :reliable do
+ # TODO: Remove this test when feature flag is removed
+ # Flag rollout issue https://gitlab.com/gitlab-org/gitlab/-/issues/364257
+ describe 'Pipeline editor', :reliable, feature_flag: {
+ name: :simulate_pipeline,
+ scope: :global
+ } do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'pipeline-editor-project'
@@ -37,6 +42,8 @@ module QA
end
before do
+ Runtime::Feature.disable(:simulate_pipeline) if Runtime::Feature.enabled?(:simulate_pipeline)
+
Flow::Login.sign_in
project.visit!
Page::Project::Menu.perform(&:go_to_pipeline_editor)
@@ -50,7 +57,7 @@ module QA
it 'shows valid validations', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349128' do
Page::Project::PipelineEditor::Show.perform do |show|
aggregate_failures do
- expect(show.ci_syntax_validate_message).to have_content('CI configuration is valid')
+ expect(show.ci_syntax_validate_message).to have_content('Pipeline syntax is correct')
show.go_to_visualize_tab
{ stage1: 'job1', stage2: 'job2' }.each_pair do |stage, job|
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_status_emails_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_status_emails_spec.rb
new file mode 100644
index 00000000000..f4794b3a904
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_status_emails_spec.rb
@@ -0,0 +1,134 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_examples 'notifies on a pipeline' do |exit_code|
+ before do
+ push_commit(exit_code: exit_code)
+ end
+
+ it 'sends an email' do
+ meta = exit_code_meta(exit_code)
+
+ project.visit!
+ Flow::Pipeline.wait_for_latest_pipeline(status: meta[:status])
+
+ messages = mail_hog_messages(mail_hog)
+ subjects = messages.map(&:subject)
+ targets = messages.map(&:to)
+
+ aggregate_failures do
+ expect(subjects).to include(meta[:email_subject])
+ expect(subjects).to include(/#{Regexp.escape(project.name)}/)
+ expect(targets).to include(*emails)
+ end
+ end
+ end
+
+ RSpec.describe 'Verify', :orchestrated, :runner, :requires_admin, :smtp do
+ describe 'Pipeline status emails' do
+ let(:executor) { "qa-runner-#{Time.now.to_i}" }
+ let(:emails) { %w[foo@bar.com baz@buzz.com] }
+
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'pipeline-status-project'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.project = project
+ runner.name = executor
+ runner.tags = [executor]
+ end
+ end
+
+ let(:mail_hog) { Vendor::MailHog::API.new }
+
+ before(:all) do
+ Runtime::ApplicationSettings.set_application_settings(allow_local_requests_from_web_hooks_and_services: true)
+ end
+
+ before do
+ setup_pipeline_emails(emails)
+ end
+
+ describe 'when pipeline passes', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366240' do
+ include_examples 'notifies on a pipeline', 0
+ end
+
+ describe 'when pipeline fails', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366241' do
+ include_examples 'notifies on a pipeline', 1
+ end
+
+ def push_commit(exit_code: 0)
+ 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: gitlab_ci_yaml(exit_code: exit_code)
+ }
+ ]
+ )
+ end
+ end
+
+ def setup_pipeline_emails(emails)
+ page.visit Runtime::Scenario.gitlab_address
+ Flow::Login.sign_in_unless_signed_in
+
+ project.visit!
+
+ Page::Project::Menu.perform(&:go_to_integrations_settings)
+ QA::Page::Project::Settings::Integrations.perform(&:click_pipelines_email_link)
+
+ QA::Page::Project::Settings::Services::PipelineStatusEmails.perform do |pipeline_status_emails|
+ pipeline_status_emails.toggle_notify_broken_pipelines # notify on pass and fail
+ pipeline_status_emails.set_recipients(emails)
+ pipeline_status_emails.click_save_button
+ end
+ end
+
+ def gitlab_ci_yaml(exit_code: 0, tag: executor)
+ <<~YAML
+ test-pipeline-email:
+ tags:
+ - #{tag}
+ script: sleep 5; exit #{exit_code};
+ YAML
+ end
+
+ private
+
+ def exit_code_meta(exit_code)
+ {
+ 0 => { status: 'passed', email_subject: /Successful pipeline/ },
+ 1 => { status: 'failed', email_subject: /Failed pipeline/ }
+ }[exit_code]
+ end
+
+ def mail_hog_messages(mail_hog_api)
+ Support::Retrier.retry_until(sleep_interval: 1) do
+ Runtime::Logger.debug('Fetching email...')
+
+ messages = mail_hog_api.fetch_messages
+ logs = messages.map { |m| "#{m.to}: #{m.subject}" }
+
+ Runtime::Logger.debug("MailHog Logs: #{logs.join("\n")}")
+
+ # for failing pipelines we have three messages
+ # one for the owner
+ # and one for each recipient
+ messages if mail_hog_pipeline_count(messages) >= 2
+ end
+ end
+
+ def mail_hog_pipeline_count(messages)
+ messages.count { |message| message.subject.include?('pipeline') }
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
index dacfc6c801b..fca14a55468 100644
--- a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
@@ -172,7 +172,7 @@ module QA
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)
+ expect(registry).to have_registry_repository(project.name)
registry.click_on_image(project.path_with_namespace)
expect(registry).to have_tag('master')
@@ -230,7 +230,7 @@ module QA
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)
+ expect(registry).to have_registry_repository(project.name)
registry.click_on_image(project.path_with_namespace)
diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb
index 27b11d697cc..6918c087a4e 100644
--- a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb
@@ -77,9 +77,9 @@ module QA
Page::Project::Menu.perform(&:go_to_container_registry)
Page::Project::Registry::Show.perform do |registry|
- expect(registry).to have_registry_repository(registry_repository.name)
+ expect(registry).to have_registry_repository(project.name)
- registry.click_on_image(registry_repository.name)
+ registry.click_on_image(project.name)
expect(registry).to have_tag('master')
registry.click_delete
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb
index 921b36b34af..180910e85a0 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb
@@ -142,7 +142,7 @@ module QA
Page::Group::Menu.perform(&:go_to_package_settings)
end
- context 'when disabled' do
+ context 'when enabled' do
where do
{
'using a personal access token' => {
@@ -176,7 +176,7 @@ module QA
end
before do
- Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_disabled)
+ Page::Group::Settings::PackageRegistries.perform(&:set_reject_duplicates_enabled)
end
it 'prevents users from publishing group level Maven packages duplicates', testcase: params[:testcase] do
@@ -195,7 +195,7 @@ module QA
end
end
- context 'when enabled' do
+ context 'when disabled' do
where do
{
'using a personal access token' => {
@@ -229,7 +229,7 @@ module QA
end
before do
- Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_enabled)
+ Page::Group::Settings::PackageRegistries.perform(&:set_reject_duplicates_disabled)
end
it 'allows users to publish group level Maven packages duplicates', testcase: params[:testcase] do
diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb
index 1661fec03be..8b7b827de91 100644
--- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb
+++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Release' do
- describe 'Deploy key creation', :skip_fips_env do
+ describe 'Deploy key creation' do
it 'user adds a deploy key', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348023' do
Flow::Login.sign_in
@@ -15,11 +15,11 @@ module QA
resource.key = deploy_key_value
end
- expect(deploy_key.md5_fingerprint).to eq key.md5_fingerprint
+ expect(deploy_key.sha256_fingerprint).to eq key.sha256_fingerprint
Page::Project::Settings::Repository.perform do |setting|
setting.expand_deploy_keys do |keys|
- expect(keys).to have_key(deploy_key_title, key.md5_fingerprint)
+ expect(keys).to have_key(deploy_key_title, key.sha256_fingerprint)
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
index ff8dc686991..1f5a431938c 100644
--- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
+++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
@@ -4,7 +4,7 @@ require 'digest/sha1'
module QA
RSpec.describe 'Release', :runner do
- describe 'Git clone using a deploy key', :skip_fips_env do
+ describe 'Git clone using a deploy key' do
let(:runner_name) { "qa-runner-#{SecureRandom.hex(4)}" }
let(:repository_location) { project.repository_ssh_location }
@@ -33,12 +33,19 @@ module QA
end
keys = [
- ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348022', Runtime::Key::RSA, 8192],
- ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348021', Runtime::Key::ECDSA, 521],
- ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348020', Runtime::Key::ED25519]
+ ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348022', Runtime::Key::RSA, 8192, true],
+ ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348021', Runtime::Key::ECDSA, 521, true],
+ ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348020', Runtime::Key::ED25519, false]
]
- keys.each do |(testcase, key_class, bits)|
+ supported_keys =
+ if QA::Support::FIPS.enabled?
+ keys.select { |(_, _, _, allowed_in_fips)| allowed_in_fips }
+ else
+ keys
+ end
+
+ supported_keys.each do |(testcase, key_class, bits, _)|
it "user sets up a deploy key with #{key_class}(#{bits}) to clone code using pipelines", testcase: testcase do
key = key_class.new(*bits)
diff --git a/qa/qa/specs/features/sanity/feature_flags_spec.rb b/qa/qa/specs/features/sanity/feature_flags_spec.rb
index 7e68c70ee09..f771978802e 100644
--- a/qa/qa/specs/features/sanity/feature_flags_spec.rb
+++ b/qa/qa/specs/features/sanity/feature_flags_spec.rb
@@ -20,11 +20,13 @@ module QA
describe 'feature flag definition files' do
let(:file) do
- path = Pathname.new('../config/feature_flags/development').expand_path(Runtime::Path.qa_root)
+ path = Pathname.new("#{root}/config/feature_flags/development").expand_path(Runtime::Path.qa_root)
+ path.mkpath
Tempfile.new(%w[ff-test .yml], path)
end
let(:flag) { Pathname.new(file.path).basename('.yml').to_s }
+ let(:root) { '..'}
before do
definition = <<~YAML
@@ -39,33 +41,47 @@ module QA
file.close!
end
- context 'with a default disabled feature flag' do
- let(:flag_enabled) { 'false' }
+ shared_examples 'gets flag value' do
+ context 'with a default disabled feature flag' do
+ let(:flag_enabled) { 'false' }
- it 'reads the flag as disabled' do
- expect(QA::Runtime::Feature.enabled?(flag)).to be false
- end
+ it 'reads the flag as disabled' do
+ expect(QA::Runtime::Feature.enabled?(flag)).to be false
+ end
- it 'reads as enabled after the flag is enabled' do
- QA::Runtime::Feature.enable(flag)
+ it 'reads as enabled after the flag is enabled' do
+ QA::Runtime::Feature.enable(flag)
- expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_truthy
+ expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_truthy
+ .within(max_duration: 60, sleep_interval: 5)
+ end
end
- end
- context 'with a default enabled feature flag' do
- let(:flag_enabled) { 'true' }
+ context 'with a default enabled feature flag' do
+ let(:flag_enabled) { 'true' }
- it 'reads the flag as enabled' do
- expect(QA::Runtime::Feature.enabled?(flag)).to be true
- end
+ it 'reads the flag as enabled' do
+ expect(QA::Runtime::Feature.enabled?(flag)).to be true
+ end
- it 'reads as disabled after the flag is disabled' do
- QA::Runtime::Feature.disable(flag)
+ it 'reads as disabled after the flag is disabled' do
+ QA::Runtime::Feature.disable(flag)
- expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_falsey
+ expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_falsey
+ .within(max_duration: 60, sleep_interval: 5)
+ end
end
end
+
+ context 'with a CE feature flag' do
+ include_examples 'gets flag value'
+ end
+
+ context 'with an EE feature flag' do
+ let(:root) { '../ee'}
+
+ include_examples 'gets flag value'
+ end
end
end
end
diff --git a/qa/qa/support/fips.rb b/qa/qa/support/fips.rb
new file mode 100644
index 00000000000..f5ebce4fa9c
--- /dev/null
+++ b/qa/qa/support/fips.rb
@@ -0,0 +1,14 @@
+# rubocop: disable Naming/FileName
+# frozen_string_literal: true
+
+module QA
+ module Support
+ class FIPS
+ def self.enabled?
+ %(1 true yes).include?(ENV['FIPS'].to_s)
+ end
+ end
+ end
+end
+
+# rubocop: enable Naming/FileName
diff --git a/qa/qa/support/run.rb b/qa/qa/support/run.rb
index a91e7dfd2cb..242293f9eef 100644
--- a/qa/qa/support/run.rb
+++ b/qa/qa/support/run.rb
@@ -15,6 +15,10 @@ module QA
def success?
exitstatus == 0 && !response.include?('Error encountered')
end
+
+ def to_i
+ response.to_i
+ end
end
def run(command_str, env: [], max_attempts: 1, log_prefix: '')
diff --git a/qa/qa/support/waiter.rb b/qa/qa/support/waiter.rb
index 6dbbd197b01..4a8fbaf1c4e 100644
--- a/qa/qa/support/waiter.rb
+++ b/qa/qa/support/waiter.rb
@@ -13,7 +13,8 @@ module QA
sleep_interval: 0.1,
raise_on_failure: true,
retry_on_exception: false,
- log: true
+ log: true,
+ message: nil
)
result = nil
repeat_until(
@@ -22,7 +23,8 @@ module QA
sleep_interval: sleep_interval,
raise_on_failure: raise_on_failure,
retry_on_exception: retry_on_exception,
- log: log
+ log: log,
+ message: message
) do
result = yield
end
diff --git a/qa/qa/tools/test_resources_handler.rb b/qa/qa/tools/test_resources_handler.rb
index f968fb8b26c..0030a47ed55 100644
--- a/qa/qa/tools/test_resources_handler.rb
+++ b/qa/qa/tools/test_resources_handler.rb
@@ -31,7 +31,8 @@ module QA
'QA::Resource::CiVariable',
'QA::Resource::Repository::Commit',
'QA::EE::Resource::GroupIteration',
- 'QA::EE::Resource::Settings::Elasticsearch'
+ 'QA::EE::Resource::Settings::Elasticsearch',
+ 'QA::EE::Resource::VulnerabilityItem'
].freeze
PROJECT = 'gitlab-qa-resources'
diff --git a/qa/qa/vendor/mail_hog/api.rb b/qa/qa/vendor/mail_hog/api.rb
new file mode 100644
index 00000000000..85eb0631624
--- /dev/null
+++ b/qa/qa/vendor/mail_hog/api.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+module QA
+ module Vendor
+ module MailHog
+ # Represents a Set of messages from a MailHog response
+ class Messages
+ include Enumerable
+
+ attr_reader :data
+
+ def initialize(data)
+ @data = data
+ end
+
+ def total
+ data.dig('total')
+ end
+
+ def each
+ data.dig('items')&.each do |item|
+ yield MessageItem.new(item)
+ end
+ end
+ end
+
+ # Represents an email item from a MailHog response
+ class MessageItem
+ attr_reader :data
+
+ def initialize(data)
+ @data = data
+ end
+
+ def to
+ data.dig('Content', 'Headers', 'To', 0)
+ end
+
+ def subject
+ data.dig('Content', 'Headers', 'Subject', 0)
+ end
+ end
+
+ class API
+ include Support::API
+
+ attr_reader :hostname
+
+ def initialize(hostname: QA::Runtime::Env.mailhog_hostname || 'localhost')
+ @hostname = hostname
+ end
+
+ def base_url
+ "http://#{hostname}:8025"
+ end
+
+ def api_messages_url(version: 2)
+ "#{base_url}/api/v#{version}/messages"
+ end
+
+ def delete_messages
+ delete(api_messages_url(version: 1))
+ end
+
+ def fetch_messages
+ Messages.new(JSON.parse(fetch_messages_json))
+ end
+
+ def fetch_messages_json
+ get(api_messages_url).body
+ end
+ end
+ end
+ end
+end
diff --git a/qa/spec/runtime/api/request_spec.rb b/qa/spec/runtime/api/request_spec.rb
index a1de71d31f0..ea142cfc52e 100644
--- a/qa/spec/runtime/api/request_spec.rb
+++ b/qa/spec/runtime/api/request_spec.rb
@@ -43,12 +43,13 @@ RSpec.describe QA::Runtime::API::Request do
.to eq '/api/v4/users?access_token=otoken'
end
- it 'respects query parameters' do
+ it 'respects query parameters', :aggregate_failures do
expect(request.request_path('/users?page=1')).to eq '/api/v4/users?page=1'
expect(request.request_path('/users', private_token: 'token', foo: 'bar/baz'))
.to eq '/api/v4/users?private_token=token&foo=bar%2Fbaz'
expect(request.request_path('/users?page=1', private_token: 'token', foo: 'bar/baz'))
.to eq '/api/v4/users?page=1&private_token=token&foo=bar%2Fbaz'
+ expect(request.request_path('/users', per_page: 100)).to eq '/api/v4/users?per_page=100'
end
it 'uses a different api version' do
diff --git a/qa/spec/service/docker_run/base_spec.rb b/qa/spec/service/docker_run/base_spec.rb
new file mode 100644
index 00000000000..4c6638cdcf5
--- /dev/null
+++ b/qa/spec/service/docker_run/base_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe Service::DockerRun::Base do
+ context 'when authenticating' do
+ let(:instance_one) { Service::DockerRun::Base.new }
+ let(:instance_two) { Service::DockerRun::Base.new }
+
+ before do
+ # reset singleton registry state
+ Service::DockerRun::Base.authenticated_registries.transform_values! { |_v| false }
+ end
+
+ it 'caches the the registry' do
+ expect(instance_one).to receive(:shell).once.and_return(nil)
+ expect(instance_two).not_to receive(:shell)
+
+ instance_one.login('registry.foobar.com', user: 'foobar', password: 'secret')
+ instance_two.login('registry.foobar.com', user: 'foobar', password: 'secret')
+ end
+
+ it 'forces authentication if the registry is cached' do
+ expect(instance_one).to receive(:shell).once.and_return(nil)
+ expect(instance_two).to receive(:shell).once.and_return(nil)
+
+ instance_one.login('registry.foobar.com', user: 'foobar', password: 'secret')
+ instance_two.login('registry.foobar.com', user: 'foobar', password: 'secret', force: true)
+ end
+ end
+ end
+end
diff --git a/qa/spec/service/docker_run/mixins/third_party_docker_spec.rb b/qa/spec/service/docker_run/mixins/third_party_docker_spec.rb
new file mode 100644
index 00000000000..5488dca4c40
--- /dev/null
+++ b/qa/spec/service/docker_run/mixins/third_party_docker_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe QA::Service::DockerRun::Mixins::ThirdPartyDocker do
+ include QA::Support::Helpers::StubEnv
+
+ let(:klass) do
+ Class.new(Service::DockerRun::Base) do
+ include Service::DockerRun::Mixins::ThirdPartyDocker
+
+ def initialize(repo: Runtime::Env.third_party_docker_repository)
+ @image = "#{repo}/some-image:latest"
+ end
+ end
+ end
+
+ let(:service) { klass.new }
+
+ before do
+ Service::DockerRun::Base.authenticated_registries.transform_values! { |_v| false }
+ end
+
+ context 'with environment set' do
+ before do
+ stub_env('QA_THIRD_PARTY_DOCKER_REGISTRY', 'registry.foobar.com')
+ stub_env('QA_THIRD_PARTY_DOCKER_REPOSITORY', 'registry.foobar.com/some/path')
+ stub_env('QA_THIRD_PARTY_DOCKER_USER', 'username')
+ stub_env('QA_THIRD_PARTY_DOCKER_PASSWORD', 'secret')
+ end
+
+ it 'resolves the registry from the environment' do
+ expect(service.third_party_registry).to eql('registry.foobar.com')
+ end
+
+ it 'sends a command to authenticate against the registry' do
+ expect(service).to receive(:shell)
+ .with(
+ 'docker login --username "username" --password "secret" registry.foobar.com',
+ mask_secrets: ['secret']
+ )
+ .and_return(nil)
+
+ service.authenticate_third_party
+ end
+ end
+
+ context 'without environment set' do
+ before do
+ stub_env('QA_THIRD_PARTY_DOCKER_REGISTRY', nil)
+ stub_env('QA_THIRD_PARTY_DOCKER_USER', 'username')
+ stub_env('QA_THIRD_PARTY_DOCKER_PASSWORD', 'secret')
+ end
+
+ it 'resolving the registry returns nil' do
+ expect(service.third_party_registry).to be(nil)
+ end
+
+ it 'throws if environment is missing' do
+ expect(service).not_to receive(:shell)
+
+ expect { service.authenticate_third_party }.to raise_error do |err|
+ expect(err.class).to be(Service::DockerRun::ThirdPartyValidationError)
+ expect(err.message).to eql('Third party docker environment variable(s) are not set')
+ end
+ end
+ end
+ end
+end
diff --git a/qa/spec/service/shellout_spec.rb b/qa/spec/service/shellout_spec.rb
index 9d7adeb0e94..52f095f165a 100644
--- a/qa/spec/service/shellout_spec.rb
+++ b/qa/spec/service/shellout_spec.rb
@@ -13,6 +13,12 @@ module QA
allow(Open3).to receive(:popen2e).and_yield(stdin, stdout, wait_thread)
end
+ it 'masks secrets when logging the command itself' do
+ expect(Runtime::Logger).to receive(:info).with('Executing: `docker login -u **** -p ****`')
+ expect(wait_thread).to receive(:value).twice.and_return(non_errored_wait)
+ subject.shell('docker login -u user -p secret', mask_secrets: %w[secret user])
+ end
+
it 'masks command secrets on CommandError' do
expect(wait_thread).to receive(:value).twice.and_return(errored_wait)
diff --git a/rubocop/cop/database/rescue_query_canceled.rb b/rubocop/cop/database/rescue_query_canceled.rb
new file mode 100644
index 00000000000..1238f9ed911
--- /dev/null
+++ b/rubocop/cop/database/rescue_query_canceled.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module Database
+ # Checks for `rescue` blocks targeting the `ActiveRecord::QueryCanceled` class.
+ #
+ # @example
+ #
+ # # bad
+ #
+ # begin
+ # run_an_expensive_long_query
+ # rescue ActiveRecord::QueryCanceled
+ # try_something_else
+ # end
+ #
+ # @example
+ #
+ # # good
+ #
+ # run_cheap_queries_with_each_batch
+ class RescueQueryCanceled < RuboCop::Cop::Cop
+ MSG = <<~EOF
+ Avoid rescuing the `ActiveRecord::QueryCanceled` class.
+
+ Using this pattern should be a very rare exception or a temporary patch only.
+ Consider refactoring using less expensive queries and `each_batch`.
+ EOF
+
+ def on_resbody(node)
+ return unless node.children.first
+
+ rescue_args = node.children.first.children
+ return unless rescue_args.any? { |a| targets_exception?(a) }
+
+ add_offense(node)
+ end
+
+ def targets_exception?(rescue_arg_node)
+ rescue_arg_node.const_name == 'ActiveRecord::QueryCanceled'
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/database/rescue_statement_timeout.rb b/rubocop/cop/database/rescue_statement_timeout.rb
new file mode 100644
index 00000000000..0b75a441e29
--- /dev/null
+++ b/rubocop/cop/database/rescue_statement_timeout.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module Database
+ # Checks for `rescue` blocks targeting the `ActiveRecord::StatementTimeout` class.
+ #
+ # @example
+ #
+ # # bad
+ #
+ # begin
+ # run_an_expensive_long_query
+ # rescue ActiveRecord::StatementTimeout
+ # try_something_else
+ # end
+ #
+ # @example
+ #
+ # # good
+ #
+ # run_cheap_queries_with_each_batch
+ class RescueStatementTimeout < RuboCop::Cop::Cop
+ MSG = <<~EOF
+ Avoid rescuing the `ActiveRecord::StatementTimeout` class.
+
+ Using this pattern should be a very rare exception or a temporary patch only.
+ Consider refactoring using less expensive queries and `each_batch`.
+ EOF
+
+ def on_resbody(node)
+ return unless node.children.first
+
+ rescue_args = node.children.first.children
+ return unless rescue_args.any? { |a| targets_exception?(a) }
+
+ add_offense(node)
+ end
+
+ def targets_exception?(rescue_arg_node)
+ rescue_arg_node.const_name == 'ActiveRecord::StatementTimeout'
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/gitlab/namespaced_class.rb b/rubocop/cop/gitlab/namespaced_class.rb
index ce46e055c21..07e3fb8975f 100644
--- a/rubocop/cop/gitlab/namespaced_class.rb
+++ b/rubocop/cop/gitlab/namespaced_class.rb
@@ -34,7 +34,7 @@ module RuboCop
#
# class Gitlab::MyDomain::MyClass
# end
- class NamespacedClass < RuboCop::Cop::Cop
+ class NamespacedClass < RuboCop::Cop::Base
MSG = 'Classes must be declared inside a module indicating a product domain namespace. For more info: https://gitlab.com/gitlab-org/gitlab/-/issues/321982'
# These namespaces are considered top-level semantically.
@@ -51,7 +51,7 @@ module RuboCop
# Remove class name because it's not a domain namespace.
add_potential_domain_namespace(node) { _1.pop }
- add_offense(node) if domain_namespaces.none?
+ add_offense(node.loc.name) if domain_namespaces.none?
end
private
diff --git a/scripts/checkout-mr-source-sha b/scripts/checkout-mr-source-sha
new file mode 100755
index 00000000000..962e3f1348d
--- /dev/null
+++ b/scripts/checkout-mr-source-sha
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+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 code is in sync with gitlab images built upstream."
+ echo "See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results for more details."
+ git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA}
+fi
diff --git a/scripts/decomposition/generate-loose-foreign-key b/scripts/decomposition/generate-loose-foreign-key
index 35f84c64ce1..3f4c510020a 100755
--- a/scripts/decomposition/generate-loose-foreign-key
+++ b/scripts/decomposition/generate-loose-foreign-key
@@ -6,10 +6,8 @@
require 'optparse'
$options = {
- milestone: "#{Gitlab.version_info.major}.#{Gitlab.version_info.minor}",
cross_schema: false,
dry_run: false,
- branch: true,
rspec: true
}
@@ -24,18 +22,10 @@ OptionParser.new do |opts|
$options[:dry_run] = v
end
- opts.on("-b", "--[no-]branch", "Create or not a new branch") do |v|
- $options[:branch] = v
- end
-
opts.on("-r", "--[no-]rspec", "Create or not a rspecs automatically") do |v|
$options[:rspec] = v
end
- opts.on("-m", "--milestone MILESTONE", "Specify custom milestone (current: #{$options[:milestone]})") do |v|
- $options[:milestone] = v
- end
-
opts.on("-h", "--help", "Prints this help") do
puts opts
exit
@@ -50,9 +40,7 @@ unless system("git diff --quiet")
raise "There are uncommitted changes. Commit to continue."
end
-if Gitlab::Database.database_base_models.many?
- raise 'Cannot run in multiple-databases mode. Use only `main:` in `config/database.yml`.'
-end
+$files_affected = []
puts "Re-creating current test database"
ActiveRecord::Tasks::DatabaseTasks.drop_current
@@ -86,6 +74,18 @@ def exec_cmd(*args, fail: nil)
false
end
+def write_file(file_path, content)
+ $files_affected << file_path
+ File.write(file_path, content)
+end
+
+def print_files_affected
+ puts "The following files have been generated/modified:"
+ $files_affected.each do |filepath|
+ puts filepath
+ end
+end
+
def has_lfk?(definition)
Gitlab::Database::LooseForeignKeys.definitions.any? do |lfk_definition|
lfk_definition.from_table == definition.from_table &&
@@ -147,12 +147,10 @@ def add_definition_to_yaml(definition)
end
# emulate existing formatting
- File.write(
+ write_file(
Rails.root.join('config/gitlab_loose_foreign_keys.yml'),
content.to_yaml.gsub(/^([- ] )/, ' \1')
)
-
- exec_cmd("git", "add", "config/gitlab_loose_foreign_keys.yml")
end
def generate_migration(definition)
@@ -185,12 +183,9 @@ def generate_migration(definition)
end
EOF
- File.write(migration_name, content)
+ write_file(migration_name, content)
- exec_cmd("git", "add", migration_name, fail: "Failed to add migration file.")
exec_cmd("bin/rails", "db:migrate", fail: "Failed to run db:migrate.")
- exec_cmd("git", "add", "db/schema_migrations/#{timestamp}", "db/structure.sql", fail: "There are uncommitted changes. We should not have any.")
- exec_cmd("git diff --exit-code --name-only", fail: "There are uncommitted changes. We should not have any.")
end
def class_by_table_name
@@ -232,33 +227,7 @@ def add_test_to_specs(definition)
lines = File.readlines(spec_path)
insert_line = lines.count - 1
lines.insert(insert_line, "\n", *spec_test.lines)
- File.write(spec_path, lines.join(""))
-
- # find a matching line
- test_lines = (1..lines.count).select do |line|
- lines[line-1].include?("it_behaves_like 'cleanup by a loose foreign key' do")
- end.join(":")
-
- loop do
- if system("bin/rspec", "#{spec_path}:#{test_lines}")
- puts "Test seems fine?"
- break
- end
-
- puts "--------------------------------------------------"
- puts "Test failed:"
- puts "Edit: vim #{spec_path} (lines #{test_lines})"
- puts "Re-run: bin/rspec #{spec_path}:#{test_lines}"
- puts "--------------------------------------------------"
- puts "Running bash. To exit do 'Ctrl-D' to re-run, or do 'Ctrl-C' to break (and ignore failure)."
- puts
-
- unless exec_cmd("bash")
- break
- end
- end
-
- exec_cmd("git", "add", spec_path, fail: "There are uncommitted changes. We should not have any.")
+ write_file(spec_path, lines.join(""))
end
def update_no_cross_db_foreign_keys_spec(definition)
@@ -274,76 +243,7 @@ def update_no_cross_db_foreign_keys_spec(definition)
return
end
- File.write(spec_path, updated.join(""))
- exec_cmd("git", "add", spec_path, fail: "Failed to add changes from #{spec_path}")
-end
-
-def commit_changes(definition)
- branch_name = "remove-#{definition.to_table}_#{definition.from_table}_#{definition.column}-fk"
- commit_title = "Swap FK #{definition.from_table} to #{definition.to_table} for LFK"
- mr_title = "Swap FK #{definition.from_table}.#{definition.column} to #{definition.to_table} for LFK"
- description = <<-EOF.strip_heredoc
- Swaps FK for #{definition.from_table}.#{definition.column} to #{definition.to_table}
-
- Changelog: changed
- EOF
-
- commit_message = "#{commit_title}\n\n#{description}"
-
- existing_branch = %x[git rev-parse --abbrev-ref HEAD].strip
-
- if $options[:branch]
- unless exec_cmd("git", "checkout", "-b", branch_name)
- raise "Failed to create branch: #{branch_name}"
- end
- end
-
- unless exec_cmd("git", "commit", "-m", commit_message)
- raise "Failed to commit changes."
- end
-
- if $options[:branch]
- exec_cmd("git", "push", "origin", "-u", "HEAD",
- "-o", "merge_request.create",
- "-o", "merge_request.target=#{existing_branch}",
- "-o", "merge_request.milestone=#{$options[:milestone]}",
- "-o", "merge_request.title=#{mr_title}"
- )
-
- puts
- puts "--------------------------------------------------"
- puts "Put this as MR description:"
- puts "--------------------------------------------------"
- puts <<-EOF.strip_heredoc
- ## What does this MR do and why?
-
- Per https://gitlab.com/groups/gitlab-org/-/epics/7249
-
- As part of our CI "decomposition" efforts we need to remove all foreign keys that are cross-database (ie. between the planned \`main\` and \`ci\` databases). We are going to replace them all with ["loose foreign keys"](https://docs.gitlab.com/ee/development/database/loose_foreign_keys.html).
-
- Related: <DETAIL>
-
- ## Validations
-
- - **Best team to review (check off when reviewed):** TBD
- - [ ] No way for user to access once parent is deleted. Please explain: <DETAIL>
- - [ ] Possible to access once parent deleted but low user impact. Please explain: <DETAIL>
- - [ ] Possible Sidekiq workers that may load directly and possibly lead to exceptions. Please explain: <DETAIL>
- - [ ] Possible user impact to be evaluated or mitigated. Please explain: <DETAIL>
- - [ ] Is this FK safe to be removed to avoid LOCKing problems? (Explanation: https://gitlab.com/groups/gitlab-org/-/epics/7249#note_819662046). Please explain: <DETAIL>
-
- ## MR acceptance checklist
-
- This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
- * [ ] I have evaluated the [MR acceptance checklist](https://docs.gitlab.com/ee/development/code_review.html#acceptance-checklist) for this MR.
-
- /label ~"ci-decomposition::phase4" ~"database::review pending" ~"devops::enablement" ~"group::sharding" ~"section::enablement" ~"sharding::active" ~"type::feature" ~"workflow::in dev" ~backend ~"ci-decomposition" ~database ~"Category:Sharding"
- /milestone %"#{$options[:milestone]}"
- /assign_reviewer @ahegyi
- EOF
- puts "--------------------------------------------------"
- end
+ write_file(spec_path, updated.join(""))
end
all_foreign_keys = ActiveRecord::Base.connection.tables.flat_map do |table|
@@ -400,6 +300,8 @@ all_foreign_keys.each_with_index do |definition, idx|
generate_migration(definition)
add_test_to_specs(definition)
update_no_cross_db_foreign_keys_spec(definition)
- commit_changes(definition)
end
+
+print_files_affected
+
puts
diff --git a/scripts/determine-qa-tests b/scripts/determine-qa-tests
new file mode 100755
index 00000000000..b1e9d8e9312
--- /dev/null
+++ b/scripts/determine-qa-tests
@@ -0,0 +1,106 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'optparse'
+
+# This script returns end-to-end tests or test directories. The returned value is stored in QA_TESTS
+# variable for executing only those tests.
+
+class DetermineQATests # rubocop:disable Gitlab/NamespacedClass
+ def initialize(options)
+ @changed_files = options.delete(:changed_files)
+ @mr_labels = options.delete(:mr_labels) || []
+ end
+
+ def execute
+ # If only e2e test files have changed, run only those tests
+ qa_tests = if has_qa_spec_only_changes?
+ changed_files
+
+ # If only non qa files have changed, use the devops MR label to run the files in the related directory
+ # However, if a feature flag file has changed, do not return any specific test/test directory
+ elsif has_non_qa_only_changes? && mr_labels.any? && !has_dev_ops_feature_flag_changes?
+ devops_stage = devops_stage_from_mr_labels
+
+ qa_spec_directories_for_devops_stage(devops_stage) if devops_stage
+ end
+
+ trim_path(qa_tests).join(' ') if qa_tests
+ end
+
+ private
+
+ attr_reader :changed_files, :mr_labels
+
+ # Are the changed files only qa specs?
+ #
+ # @return [Boolean] whether the changes files are only qa specs
+ def has_qa_spec_only_changes?
+ changed_files.all? { |file_path| file_path =~ %r{^qa/qa/specs/features/} }
+ end
+
+ # Are the changed files only outside the qa directory?
+ #
+ # @return [Boolean] whether the changes files are outside of qa directory
+ def has_non_qa_only_changes?
+ changed_files.none? { |file_path| file_path =~ %r{^qa/} }
+ end
+
+ # Are the changed files for development and ops feature flags?
+ #
+ # @return [Boolean] whether the changes files are for development and ops feature flags
+ def has_dev_ops_feature_flag_changes?
+ changed_files.any? { |file_path| file_path =~ %r{/feature_flags/(development|ops)/.*\.yml} }
+ end
+
+ # Remove the leading `qa/` from the file or directory paths
+ #
+ # @param [Array] paths Array of file or directory paths
+ # @return [Array] Array of files or directories with the first occurance of `qa/` removed
+ def trim_path(paths)
+ paths.map { |path| path.delete_prefix("qa/") }
+ end
+
+ # Extract devops stage from MR labels
+ #
+ # @return [String] a devops stage
+ def devops_stage_from_mr_labels
+ mr_labels.find { |label| label =~ /^devops::/ }&.delete_prefix('devops::')
+ end
+
+ # Get qa spec directories for devops stage
+ #
+ # @param [String] devops_stage a devops stage
+ # @return [Array] qa spec directories
+ def qa_spec_directories_for_devops_stage(devops_stage)
+ Dir.glob("qa/qa/specs/**/*/").select { |dir| dir =~ %r{\d+_#{devops_stage}/$} }
+ end
+end
+
+if $0 == __FILE__
+ options = {}
+
+ OptionParser.new do |opts|
+ opts.on("-f", "--files CHANGED_FILES_PATH", String,
+ "A path to a file containing a list of changed files") do |value|
+ changed_files_path = value
+ abort("ERROR: The specified changed files path does not exist") unless File.exist?(changed_files_path)
+
+ changed_files = File.read(changed_files_path).split(' ')
+ abort("ERROR: There are no changed files") if changed_files.empty?
+
+ options[:changed_files] = changed_files
+ end
+
+ opts.on("-l", "--labels MR_LABELS", String, "A comma separated list of MR labels") do |value|
+ options[:mr_labels] = Array(value&.split(',')).compact
+ end
+
+ opts.on("-h", "--help", "Prints this help") do
+ puts opts
+ exit
+ end
+ end.parse!
+
+ puts DetermineQATests.new(options).execute
+end
diff --git a/scripts/frontend/stylelint/stylelint_duplicate_selectors.js b/scripts/frontend/stylelint/stylelint_duplicate_selectors.js
deleted file mode 100644
index 77c1f1292b7..00000000000
--- a/scripts/frontend/stylelint/stylelint_duplicate_selectors.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const stylelint = require('stylelint');
-const utils = require('./stylelint_utils');
-
-const ruleName = 'stylelint-gitlab/duplicate-selectors';
-
-const messages = stylelint.utils.ruleMessages(ruleName, {
- expected: (selector1, selector2) => {
- return `"${selector1}" and "${selector2}" have the same properties.`;
- },
-});
-
-module.exports = stylelint.createPlugin(ruleName, (enabled) => {
- if (!enabled) {
- return;
- }
-
- // eslint-disable-next-line consistent-return
- return (root, result) => {
- const selectorGroups = {};
- utils.createPropertiesHashmap(root, result, ruleName, messages, selectorGroups, true);
- };
-});
-
-module.exports.ruleName = ruleName;
-module.exports.messages = messages;
diff --git a/scripts/frontend/stylelint/stylelint_utility_classes.js b/scripts/frontend/stylelint/stylelint_utility_classes.js
deleted file mode 100644
index ad2b2ddbb20..00000000000
--- a/scripts/frontend/stylelint/stylelint_utility_classes.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const stylelint = require('stylelint');
-const utils = require('./stylelint_utils');
-const utilityClasses = require('./utility_classes_map');
-
-const ruleName = 'stylelint-gitlab/utility-classes';
-
-const messages = stylelint.utils.ruleMessages(ruleName, {
- expected: (selector1, selector2) => {
- return `"${selector1}" has the same properties as our BS4 utility class "${selector2}" so please use that instead.`;
- },
-});
-
-module.exports = stylelint.createPlugin(ruleName, (enabled) => {
- if (!enabled) {
- return;
- }
-
- // eslint-disable-next-line consistent-return
- return (root, result) => {
- utils.createPropertiesHashmap(root, result, ruleName, messages, utilityClasses, false);
- };
-});
-
-module.exports.ruleName = ruleName;
-module.exports.messages = messages;
diff --git a/scripts/frontend/stylelint/stylelint_utility_map.js b/scripts/frontend/stylelint/stylelint_utility_map.js
deleted file mode 100644
index 187b2065823..00000000000
--- a/scripts/frontend/stylelint/stylelint_utility_map.js
+++ /dev/null
@@ -1,64 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-const postcss = require('postcss');
-const prettier = require('prettier');
-const sass = require('sass');
-
-const utils = require('./stylelint_utils');
-
-const ROOT_PATH = path.resolve(__dirname, '../../..');
-const hashMapPath = path.resolve(__dirname, './utility_classes_map.js');
-
-//
-// This creates a JS based hash map (saved in utility_classes_map.js) of the different values in the utility classes
-//
-sass.render(
- {
- data: `
- @import './functions';
- @import './variables';
- @import './mixins';
- @import './utilities';
- `,
- includePaths: [path.resolve(ROOT_PATH, 'node_modules/bootstrap/scss')],
- },
- (err, result) => {
- if (err) {
- return console.error('Error ', err);
- }
-
- const cssResult = result.css.toString();
-
- // We just use postcss to create a CSS tree
- return postcss([])
- .process(cssResult, {
- // This suppresses a postcss warning
- from: undefined,
- })
- .then((processedResult) => {
- const selectorGroups = {};
- utils.createPropertiesHashmap(
- processedResult.root,
- processedResult,
- null,
- null,
- selectorGroups,
- true,
- );
-
- const prettierOptions = prettier.resolveConfig.sync(hashMapPath);
- const prettyHashmap = prettier.format(
- `module.exports = ${JSON.stringify(selectorGroups)};`,
- prettierOptions,
- );
-
- fs.writeFile(hashMapPath, prettyHashmap, (e) => {
- if (e) {
- return console.log(e);
- }
-
- return console.log('The file was saved!');
- });
- });
- },
-);
diff --git a/scripts/frontend/stylelint/stylelint_utils.js b/scripts/frontend/stylelint/stylelint_utils.js
deleted file mode 100644
index c9d9c7d9aad..00000000000
--- a/scripts/frontend/stylelint/stylelint_utils.js
+++ /dev/null
@@ -1,78 +0,0 @@
-const md5 = require('md5');
-const stylelint = require('stylelint');
-
-module.exports.createPropertiesHashmap = (
- ruleRoot,
- result,
- ruleName,
- messages,
- selectorGroups,
- addSelectors,
-) => {
- ruleRoot.walkRules((rule) => {
- const selector = rule.selector.replace(/(?:\r\n|\r|\n)/g, ' ');
-
- if (
- rule &&
- rule.parent &&
- rule.parent.type !== 'atrule' &&
- !(
- selector.includes('-webkit-') ||
- selector.includes('-moz-') ||
- selector.includes('-o-') ||
- selector.includes('-ms-') ||
- selector.includes(':')
- )
- ) {
- let cssArray = [];
- rule.nodes.forEach((property) => {
- const { prop, value } = property;
- if (property && value) {
- const propval = `${prop}${value}${property.important ? '!important' : ''}`;
- cssArray.push(propval);
- }
- });
-
- cssArray = cssArray.sort();
- const cssContent = cssArray.toString();
-
- if (cssContent) {
- const hashValue = md5(cssContent);
- const selObj = selectorGroups[hashValue];
-
- const selectorLine = `${selector} (${
- rule.source.input.file ? `${rule.source.input.file} -` : ''
- }${rule.source.start.line}:${rule.source.start.column})`;
-
- if (selObj) {
- if (selectorGroups[hashValue].selectors.indexOf(selector) === -1) {
- let lastSelector =
- selectorGroups[hashValue].selectors[selectorGroups[hashValue].selectors.length - 1];
-
- // So we have nicer formatting if it is the same file, we remove the filename
- lastSelector = lastSelector.replace(`${rule.source.input.file} - `, '');
-
- if (messages) {
- stylelint.utils.report({
- result,
- ruleName,
- message: messages.expected(selector, lastSelector),
- node: rule,
- word: rule.node,
- });
- }
-
- if (addSelectors) {
- selectorGroups[hashValue].selectors.push(selectorLine);
- }
- }
- } else if (addSelectors) {
- // eslint-disable-next-line no-param-reassign
- selectorGroups[hashValue] = {
- selectors: [selectorLine],
- };
- }
- }
- }
- });
-};
diff --git a/scripts/frontend/stylelint/utility_classes_map.js b/scripts/frontend/stylelint/utility_classes_map.js
deleted file mode 100644
index a174812ff93..00000000000
--- a/scripts/frontend/stylelint/utility_classes_map.js
+++ /dev/null
@@ -1,259 +0,0 @@
-module.exports = {
- '99097f29a9473b56eacdb9ff0681c366': { selectors: ['.align-baseline (1:1)'] },
- d969b318bb994e104e8c965006d71cb7: { selectors: ['.align-top (5:1)'] },
- '8cd54ab97b9cc43cb9d13d2ea7c601c7': { selectors: ['.align-middle (9:1)'] },
- dd06eb6c49e979b7a9fdaa7119aa0a0b: { selectors: ['.align-bottom (13:1)'] },
- '0af1e90cbc468615e299ec9f49e97c4a': { selectors: ['.align-text-bottom (17:1)'] },
- '50af706df238cf59bdc634fc684ba0c9': { selectors: ['.align-text-top (21:1)'] },
- c968922e6e47445362129a684b5913c0: { selectors: ['.bg-primary (25:1)'] },
- '3c397f9786c24cff4779a11cf5b3d7e7': { selectors: ['.bg-secondary (35:1)'] },
- '659677469a4477267fabc1788f7cad4e': { selectors: ['.bg-success (45:1)'] },
- '56d246d5b6a708a4c6f78dbd2444106c': { selectors: ['.bg-info (55:1)'] },
- '6bec0a33df3a6380c30103db5c273455': { selectors: ['.bg-warning (65:1)'] },
- '0ce5d074c8667ce6c32360658f428d5d': { selectors: ['.bg-danger (75:1)'] },
- '0d0269c62a01e97caa9039d227a25d12': { selectors: ['.bg-light (85:1)'] },
- '3a56309ad8c5b46ebcc3b13fe1987ac1': { selectors: ['.bg-dark (95:1)'] },
- '0e252f8dd392a33343d3d5efc1e3194a': { selectors: ['.bg-white (105:1)'] },
- '3af6f52f0ed4f98e797d5f10a35ca6bc': { selectors: ['.bg-transparent (109:1)'] },
- '16da7fdce74577ceab356509db565612': { selectors: ['.border (113:1)'] },
- '929622517ca05efde3b51e5f1a57064e': { selectors: ['.border-top (117:1)'] },
- '7283090353df54f1d515a6ceddfb9693': { selectors: ['.border-right (121:1)'] },
- bd5670d71332c652b46db82949042e31: { selectors: ['.border-bottom (125:1)'] },
- fa71e003d04734a898a85cc5285e3cbb: { selectors: ['.border-left (129:1)'] },
- ed482cea071e316f29d78fd93c3f3644: { selectors: ['.border-0 (133:1)'] },
- '90cb661baf21e10be6e479cb0544b1a7': { selectors: ['.border-top-0 (137:1)'] },
- '8a32707eaa09fc998bf8cc915710b60c': { selectors: ['.border-right-0 (141:1)'] },
- a6f01957e142a000e7742b31ac6c2331: { selectors: ['.border-bottom-0 (145:1)'] },
- c740fe952cc1985ee14f7d1c7a359a29: { selectors: ['.border-left-0 (149:1)'] },
- af9dd93e9780306ffa4bb25a6384902f: { selectors: ['.border-primary (153:1)'] },
- afa290dfe58cca06be5924ceae1b019b: { selectors: ['.border-secondary (157:1)'] },
- '9b1ac460bdddf1e0164d7bf988cc2da8': { selectors: ['.border-success (161:1)'] },
- '091cbf41d6be12061382fa571ee1ce82': { selectors: ['.border-info (165:1)'] },
- '3ada321d4a387901dad6d80e1b6be3fd': { selectors: ['.border-warning (169:1)'] },
- '13b4713dd52c1e359d1b43dd658cb249': { selectors: ['.border-danger (173:1)'] },
- '0048e110875ea22b04104d55e764a367': { selectors: ['.border-light (177:1)'] },
- a900b6b567c9a911326cdd0e19f40f8e: { selectors: ['.border-dark (181:1)'] },
- '78bcd867ac9677c743c2bc33b872f27b': { selectors: ['.border-white (185:1)'] },
- '35ef133b860874a5879e9451c491bc1c': { selectors: ['.rounded-sm (189:1)'] },
- e0fc10c49c7b7f4d1924336d21a4f64e: { selectors: ['.rounded (193:1)'] },
- '1b74b9d0a7d6a59281b5b5cae43c859a': { selectors: ['.rounded-top (197:1)'] },
- '20b75f55f39e662e038d51a6442c03df': { selectors: ['.rounded-right (202:1)'] },
- '83ea6db794873239c21f44af25618677': { selectors: ['.rounded-bottom (207:1)'] },
- '8464e9e8001e65dfc06397436a5eebd7': { selectors: ['.rounded-left (212:1)'] },
- a1148f40e8c509b2bcc829e2181c7582: { selectors: ['.rounded-lg (217:1)'] },
- '59c2f788287fa43caf5891adfc5c796e': { selectors: ['.rounded-circle (221:1)'] },
- '7f35b0a4b74ee7174b13cb841df0bdb3': { selectors: ['.rounded-pill (225:1)'] },
- '31a632ba94f8c41558bd6044458f1459': { selectors: ['.rounded-0 (229:1)'] },
- '16aaf53ab29d6b248b0257f2fa413914': { selectors: ['.d-none (239:1)'] },
- '4f42736ac9217039ed791b4306e60aeb': { selectors: ['.d-inline (243:1)'] },
- '067efa04b76649e8afcdceb9f5f7e870': { selectors: ['.d-inline-block (247:1)'] },
- de54f49149fb9b512aa79ad9ada838f2: { selectors: ['.d-block (251:1)'] },
- '80fc32acbc0c28ee890a160c23529d26': { selectors: ['.d-table (255:1)'] },
- '6a87b1db48298ca94cbe5dee79a6eed1': { selectors: ['.d-table-row (259:1)'] },
- b9896f0d94760bf5920f47904e9f7512: { selectors: ['.d-table-cell (263:1)'] },
- d25c51f38c4d057209b96c664de68c44: { selectors: ['.d-flex (267:1)'] },
- e72d46b636d5b8e17e771daa95793f33: { selectors: ['.d-inline-flex (271:1)'] },
- '2c433b7c14a5ae32cfa8ec7867ee8526': { selectors: ['.embed-responsive (460:1)'] },
- '56b318b8d8eb845b769d60cefcd131bb': {
- selectors: [
- '.embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video (471:1)',
- ],
- },
- c5009af89633c4d2f71a0a9fa333630d: { selectors: ['.flex-row (501:1)'] },
- '7b06a3d956579cd64b6f5b1a57255369': { selectors: ['.flex-column (505:1)'] },
- '21744a8c4dc6ed1519903b4236b00af4': { selectors: ['.flex-row-reverse (509:1)'] },
- '18d903735f9c71070b6d8166aa1112f1': { selectors: ['.flex-column-reverse (513:1)'] },
- e2a57aa8196347d4da84f33a4f551325: { selectors: ['.flex-wrap (517:1)'] },
- b6b29f75b174b5609f9e7d5eef457b70: { selectors: ['.flex-nowrap (521:1)'] },
- '839230fc7c0abacb6418b49d8f10b27f': { selectors: ['.flex-wrap-reverse (525:1)'] },
- '924d9b261944a8e8ff684d5b519062bb': { selectors: ['.flex-fill (529:1)'] },
- '5ed396aeb08464b7df8fc37d29455319': { selectors: ['.flex-grow-0 (533:1)'] },
- '94251dc4d012339a3e37df6196fc79bb': { selectors: ['.flex-grow-1 (537:1)'] },
- '0eeed7dabca0452a46574776a4485e6e': { selectors: ['.flex-shrink-0 (541:1)'] },
- c69e60d5e51a1b74d22b172ab98ef9d5: { selectors: ['.flex-shrink-1 (545:1)'] },
- '03401c1a81eb6d4639f020f76dd60176': { selectors: ['.justify-content-start (549:1)'] },
- '39e3d2c344e78869c98ef099249e717d': { selectors: ['.justify-content-end (553:1)'] },
- '3b2d00c0bea857ab78a71b0872842980': { selectors: ['.justify-content-center (557:1)'] },
- b1c3c9edd20ed7c08b43863d38ebee40: { selectors: ['.justify-content-between (561:1)'] },
- a11b4b1d983c5fa75777f273e998f73e: { selectors: ['.justify-content-around (565:1)'] },
- '50e33f29f65bfffa6a3591fcb6045ca9': { selectors: ['.align-items-start (569:1)'] },
- e44b276e47415ec19b74cc16740ada1d: { selectors: ['.align-items-end (573:1)'] },
- '4a9d2716bca651758564059dceed1271': { selectors: ['.align-items-center (577:1)'] },
- fd970b017f7f558f30cb273bf71ede7d: { selectors: ['.align-items-baseline (581:1)'] },
- '7204b6b00b69f8af1e4a24c9b6e7f7f9': { selectors: ['.align-items-stretch (585:1)'] },
- '350fbb74eb70bd05f9438067c3990e9f': { selectors: ['.align-content-start (589:1)'] },
- '74d61397b4fcbf608f3dba39ab3b2a1b': { selectors: ['.align-content-end (593:1)'] },
- eed1ab4ee9e5b327a434512176741548: { selectors: ['.align-content-center (597:1)'] },
- '19878ab832978ef7e1746ac2fe4084b2': { selectors: ['.align-content-between (601:1)'] },
- dded333d0522692809517039f5a727c1: { selectors: ['.align-content-around (605:1)'] },
- '5cbb83ea2af7e9db8ef13f4c7d6db875': { selectors: ['.align-content-stretch (609:1)'] },
- dc3df46d3c023184d375a63a71916646: { selectors: ['.align-self-auto (613:1)'] },
- '0c6d2d8c9732c571f9cf61a4b1d2877f': { selectors: ['.align-self-start (617:1)'] },
- fe7c6071e3e17214df1bdd38850d9ff0: { selectors: ['.align-self-end (621:1)'] },
- '9611bbad74d72d50cf238088576a5089': { selectors: ['.align-self-center (625:1)'] },
- '4bc5edddf5981866946175bfedb7247f': { selectors: ['.align-self-baseline (629:1)'] },
- '4fffdd27ec60120ec9ed16fd7feef801': { selectors: ['.align-self-stretch (633:1)'] },
- '39e658501f5502b35919f02fa9591360': { selectors: ['.float-left (1185:1)'] },
- b51436c537ffc4269b1533e44d7c3467: { selectors: ['.float-right (1189:1)'] },
- c4597a87d2c793a6d696cfe06f6c95ce: { selectors: ['.float-none (1193:1)'] },
- '16b2e7e5b666b69b9581be6a44947d6f': { selectors: ['.user-select-all (1249:1)'] },
- f5c4d8f25b8338031e719edc77659558: { selectors: ['.user-select-auto (1253:1)'] },
- '71ba65d43dcc2b1c3f47ac2578983e83': { selectors: ['.user-select-none (1257:1)'] },
- '5902adc842d83ad70b89ece99b82a7a9': { selectors: ['.overflow-auto (1261:1)'] },
- bfb19f18b91fa46f0502e32153287cc4: { selectors: ['.overflow-hidden (1265:1)'] },
- aaf8dc6e0768e59f3098a98a5c144d66: { selectors: ['.position-static (1269:1)'] },
- '79592de2383045d15ab57d35aa1dab95': { selectors: ['.position-relative (1273:1)'] },
- a7c272f53d0368730bde4c2740ffb5c3: { selectors: ['.position-absolute (1277:1)'] },
- dad0bb92d53f17cf8affc10f77824b7f: { selectors: ['.position-fixed (1281:1)'] },
- '6da0f6a7354a75fe6c95b08a4cabc06f': { selectors: ['.position-sticky (1285:1)'] },
- '66602e21eea7b673883155c8f42b9590': { selectors: ['.fixed-top (1289:1)'] },
- '33ea70eb6db7f6ab3469680f182abb19': { selectors: ['.fixed-bottom (1297:1)'] },
- '947009e63b4547795ef7cc873f4e4ae9': { selectors: ['.sr-only (1313:1)'] },
- '9220ad156a70c2586b15fe2b9b6108b2': { selectors: ['.shadow-sm (1334:1)'] },
- b1b8c0ff70767ca2160811a026766982: { selectors: ['.shadow (1338:1)'] },
- da0792abe99964acb6692a03c61d6dd8: { selectors: ['.shadow-lg (1342:1)'] },
- bb2173057af1cf20e687469b2d9cbb3c: { selectors: ['.shadow-none (1346:1)'] },
- '6d8abb6519a186483b25429ab8b9765e': { selectors: ['.w-25 (1350:1)'] },
- a087c1ffdf8ead76cdd37445b414d63e: { selectors: ['.w-50 (1354:1)'] },
- '28180742013a90275be5633e6ec0dd51': { selectors: ['.w-75 (1358:1)'] },
- '195a03bc95a0af0ba6c8824db97a0b2f': { selectors: ['.w-100 (1362:1)'] },
- e67c74b650d6236b03be9dfc10c78e32: { selectors: ['.w-auto (1366:1)'] },
- c1b6262b3ee069addc1fbe46f64aac4e: { selectors: ['.h-25 (1370:1)'] },
- a520396ae349bef86145e0761aa0699e: { selectors: ['.h-50 (1374:1)'] },
- '7c53b57d54beb087fd7ab8b669c5fe60': { selectors: ['.h-75 (1378:1)'] },
- ad74f1972cb745b7a78b03e16a387f21: { selectors: ['.h-100 (1382:1)'] },
- '2cd49c3d63d260ba4f0b23c559ad05e0': { selectors: ['.h-auto (1386:1)'] },
- '0b43071a67efc45ee1735fdc2491313c': { selectors: ['.mw-100 (1390:1)'] },
- eac31a6f08e5c935e24b97df0fdad579: { selectors: ['.mh-100 (1394:1)'] },
- bd5f5d687d100d127abeb044fc78a3fd: { selectors: ['.min-vw-100 (1398:1)'] },
- '8dec7662784b943d3ca0615df59d7970': { selectors: ['.min-vh-100 (1402:1)'] },
- eacc17f16197f6c0291ced3e7cfc067e: { selectors: ['.vw-100 (1406:1)'] },
- '1a2ec1c9ad7db8d4156ca76a81416c49': { selectors: ['.vh-100 (1410:1)'] },
- cfdb4f497b16074959bfd3deb7ea9c42: { selectors: ['.m-0 (1414:1)'] },
- '4d666c270ba50524312d97c4b937d153': { selectors: ['.mt-0, .my-0 (1418:1)'] },
- eccf47ccd76ceffb4b139cb6c080b5ac: { selectors: ['.mr-0, .mx-0 (1423:1)'] },
- '9bc513e73c0bdc6efdf170cb31de16d1': { selectors: ['.mb-0, .my-0 (1428:1)'] },
- e99cfc55b03f0e67f11628b19889ad7b: { selectors: ['.ml-0, .mx-0 (1433:1)'] },
- e1c39484d90d2acaa00973531f47f738: { selectors: ['.m-1 (1438:1)'] },
- '63791bc02eccfdfa2c01621a801e565f': { selectors: ['.mt-1, .my-1 (1442:1)'] },
- bcb27ab9d7dcfdd0d7cacad02709966c: { selectors: ['.mr-1, .mx-1 (1447:1)'] },
- cb5d1c4328e25b5bc93be9a252973690: { selectors: ['.mb-1, .my-1 (1452:1)'] },
- b80b1010c7dcfbb30bed9015c4f2e969: { selectors: ['.ml-1, .mx-1 (1457:1)'] },
- ecab1c9cdf8a562e3c0f70307aeafa89: { selectors: ['.m-2 (1462:1)'] },
- '6505fe17fbbd88b1884113a754aa82ab': { selectors: ['.mt-2, .my-2 (1466:1)'] },
- '6f0c7d09d1e729f332c4671ccc2b48c0': { selectors: ['.mr-2, .mx-2 (1471:1)'] },
- '70ef7b668b382b3c747b2d73e08cdbed': { selectors: ['.mb-2, .my-2 (1476:1)'] },
- '2d7f277cc78ed324a8fc1f71ab281e1f': { selectors: ['.ml-2, .mx-2 (1481:1)'] },
- '8ebcfe52fd4024861082ffb1735747a7': { selectors: ['.m-3 (1486:1)'] },
- '9965fb516bdb72b87023a533123a8035': { selectors: ['.mt-3, .my-3 (1490:1)'] },
- b1fcbbb1dc6226f6da6000830088e051: { selectors: ['.mr-3, .mx-3 (1495:1)'] },
- '02204826cfbe3da98535c0d802870940': { selectors: ['.mb-3, .my-3 (1500:1)'] },
- '0259859060250ae6b730218733e7a437': { selectors: ['.ml-3, .mx-3 (1505:1)'] },
- '8cf300dab2a4994a105eeddda826f2e6': { selectors: ['.m-4 (1510:1)'] },
- '1ba62fdddd3349f52a452050688905c7': { selectors: ['.mt-4, .my-4 (1514:1)'] },
- '66a104129fa13db5a0829567fba6ee41': { selectors: ['.mr-4, .mx-4 (1519:1)'] },
- eefcc4c10b79e70e8e8a5a66fb2b7aa1: { selectors: ['.mb-4, .my-4 (1524:1)'] },
- eb1503656dc920d15a31116956fdffa4: { selectors: ['.ml-4, .mx-4 (1529:1)'] },
- '79cbb6e5c9b73fd0be29d4fc5733a099': { selectors: ['.m-5 (1534:1)'] },
- '67d8671699df706a428e7da42a7141cb': { selectors: ['.mt-5, .my-5 (1538:1)'] },
- e9cb4a0a8a60ff018c87a0b7efa9de29: { selectors: ['.mr-5, .mx-5 (1543:1)'] },
- '93f579214354dbd8cb60209c068f0086': { selectors: ['.mb-5, .my-5 (1548:1)'] },
- '2a789d4af97d2b87fd0bf2b4626120cd': { selectors: ['.ml-5, .mx-5 (1553:1)'] },
- '64a89d28e8287c1a0ac153001082644c': { selectors: ['.p-0 (1558:1)'] },
- b03aa6db5ddf110bbdbefbbec43fda30: { selectors: ['.pt-0, .py-0 (1562:1)'] },
- e38192ca32a98888d4c4876880f4fece: { selectors: ['.pr-0, .px-0 (1567:1)'] },
- '70fe8ef50e999ddd29506f672c107069': { selectors: ['.pb-0, .py-0 (1572:1)'] },
- '9355e8cd9109049726475ba356661bcf': { selectors: ['.pl-0, .px-0 (1577:1)'] },
- '0d4c53468c2658c5324b9ec7a8ca6de2': { selectors: ['.p-1 (1582:1)'] },
- d74e430b2a56b3a4e20065c972b7fa3f: { selectors: ['.pt-1, .py-1 (1586:1)'] },
- '21e4644967aedd19888b6f4a700b629b': { selectors: ['.pr-1, .px-1 (1591:1)'] },
- e315a7b9b7a1d0df3ea7d95af5203a0b: { selectors: ['.pb-1, .py-1 (1596:1)'] },
- '14630ca122e1d9830a9ef5591c4097d0': { selectors: ['.pl-1, .px-1 (1601:1)'] },
- '5b1c65e5139e86e5f4755824f8b77d13': { selectors: ['.p-2 (1606:1)'] },
- '244af70950a1e200d3849f75ce51d707': { selectors: ['.pt-2, .py-2 (1610:1)'] },
- b583832738cad724c7c23e5c14ac9bfb: { selectors: ['.pr-2, .px-2 (1615:1)'] },
- e1e633c4f1375e8276154192d8899e39: { selectors: ['.pb-2, .py-2 (1620:1)'] },
- '676b01e25f0dbb3f7d2f2529231cda08': { selectors: ['.pl-2, .px-2 (1625:1)'] },
- '9b5165e3333b22801f2287f7983d7516': { selectors: ['.p-3 (1630:1)'] },
- '5bcaa9df87a507f6cd14659ea176bdc5': { selectors: ['.pt-3, .py-3 (1634:1)'] },
- f706637180776c5589385599705a2409: { selectors: ['.pr-3, .px-3 (1639:1)'] },
- '41157cfbcf47990b383b5b0379386ab2': { selectors: ['.pb-3, .py-3 (1644:1)'] },
- cac1e7a204bb6a1f42707b684ad46238: { selectors: ['.pl-3, .px-3 (1649:1)'] },
- '43e0671cd41a4b7590284888b607a134': { selectors: ['.p-4 (1654:1)'] },
- '116b0f95ebde1ff8907e488413a88854': { selectors: ['.pt-4, .py-4 (1658:1)'] },
- ecb06765fe691d892df000eebbb23dcc: { selectors: ['.pr-4, .px-4 (1663:1)'] },
- '1331503a48d36025c861e660bc615048': { selectors: ['.pb-4, .py-4 (1668:1)'] },
- f8665f7e547e499abd7ac63813b274f5: { selectors: ['.pl-4, .px-4 (1673:1)'] },
- '4160a315459f1b5a98255863f42136fe': { selectors: ['.p-5 (1678:1)'] },
- f55a6b2de6a434ec7b4375f06f4fad75: { selectors: ['.pt-5, .py-5 (1682:1)'] },
- '19391dc45c8d7730a86d521c28f52c3f': { selectors: ['.pr-5, .px-5 (1687:1)'] },
- '15898bcb7ff74a60006f9931422b4ad3': { selectors: ['.pb-5, .py-5 (1692:1)'] },
- '6290bdc6355aed1e9b27379003aa4828': { selectors: ['.pl-5, .px-5 (1697:1)'] },
- '04a144abd49b1402e3588fb4ec237ec0': { selectors: ['.m-n1 (1702:1)'] },
- b81793fb475f7cc3a0698aa92ae41777: { selectors: ['.mt-n1, .my-n1 (1706:1)'] },
- '3c39187fca578a65e7aa2d704208cde8': { selectors: ['.mr-n1, .mx-n1 (1711:1)'] },
- c6c24440dd9edef71c7bc7da951dccd5: { selectors: ['.mb-n1, .my-n1 (1716:1)'] },
- '8b528f327ea3e562fc61d13c9f3901d8': { selectors: ['.ml-n1, .mx-n1 (1721:1)'] },
- '4a1926d211f81e5c96d4c9c4f2097774': { selectors: ['.m-n2 (1726:1)'] },
- f78f1986440a943aeb5553cb11b2f23c: { selectors: ['.mt-n2, .my-n2 (1730:1)'] },
- '941a9ea73cc97224a3f55ef65ab727c9': { selectors: ['.mr-n2, .mx-n2 (1735:1)'] },
- '074441007089a0c89cda9bfcb31c763a': { selectors: ['.mb-n2, .my-n2 (1740:1)'] },
- '7f9e45f6286b38eec32d471b7c1b28b6': { selectors: ['.ml-n2, .mx-n2 (1745:1)'] },
- c322ab87c4e181d835e6c17a1ca179ad: { selectors: ['.m-n3 (1750:1)'] },
- dee7caca54972db68f956a7cfd5d372b: { selectors: ['.mt-n3, .my-n3 (1754:1)'] },
- '60c8b6aa0702bbc3eed911f7483876ce': { selectors: ['.mr-n3, .mx-n3 (1759:1)'] },
- '595290cc6428614c03bac4631fe3fc12': { selectors: ['.mb-n3, .my-n3 (1764:1)'] },
- '7b968bc3150d9768117e099261cf23df': { selectors: ['.ml-n3, .mx-n3 (1769:1)'] },
- '90ca4942944fbc4dd543a821244daa31': { selectors: ['.m-n4 (1774:1)'] },
- '1716842c880f907fc62889f928273e0c': { selectors: ['.mt-n4, .my-n4 (1778:1)'] },
- '087ab1596162227935a974af5e856174': { selectors: ['.mr-n4, .mx-n4 (1783:1)'] },
- f53133714696eaf034f3efe057ac82fe: { selectors: ['.mb-n4, .my-n4 (1788:1)'] },
- ce56811b70ca493d65e3f63acfa2d9df: { selectors: ['.ml-n4, .mx-n4 (1793:1)'] },
- '7f52135983abe2eccfbb72e5d16a6a20': { selectors: ['.m-n5 (1798:1)'] },
- de8fc351c8c23bd867cf10a14642899a: { selectors: ['.mt-n5, .my-n5 (1802:1)'] },
- b134cecaa2883916d516ae6a2b1a3891: { selectors: ['.mr-n5, .mx-n5 (1807:1)'] },
- '124ccc6a210fadb889b2742eb0f9b540': { selectors: ['.mb-n5, .my-n5 (1812:1)'] },
- c3948b63b7b0c864f4f78faf640fd9a0: { selectors: ['.ml-n5, .mx-n5 (1817:1)'] },
- e57ec4fe9e8ed36e38f1c50041fc9f47: { selectors: ['.m-auto (1822:1)'] },
- f10380665932186d1effe0674a74ba12: { selectors: ['.mt-auto, .my-auto (1826:1)'] },
- '2ce71a27023eb50a47c24a99399faa28': { selectors: ['.mr-auto, .mx-auto (1831:1)'] },
- '196c77d357d314678cd3a99cfacbea96': { selectors: ['.mb-auto, .my-auto (1836:1)'] },
- ca007ce268b463a6bf42145cf5ce3685: { selectors: ['.ml-auto, .mx-auto (1841:1)'] },
- '695821b1faf108a559486730b246876a': { selectors: ['.text-monospace (3590:1)'] },
- a8fc5ca823f51d72673577064387a029: { selectors: ['.text-justify (3594:1)'] },
- '04e83ef005e9c653fb368008f8ae8a33': { selectors: ['.text-wrap (3598:1)'] },
- '0bb94dfab7ca2c9892ebbd993b2baf0f': { selectors: ['.text-nowrap (3602:1)'] },
- aea4958ce85ddc0cbffca1015c3a7eba: { selectors: ['.text-truncate (3606:1)'] },
- '52b9443947b6b94a5c7e1b837da115e2': { selectors: ['.text-left (3612:1)'] },
- baaf5136fc6e1c54ba29b6040f166d5f: { selectors: ['.text-right (3616:1)'] },
- '282aa4319bee75af06cc2632b7124e26': { selectors: ['.text-center (3620:1)'] },
- '1cb1c8ad9b560eca25ebcefe95c1b7fa': { selectors: ['.text-lowercase (3676:1)'] },
- '45234533eac658ba2857e9c4d3bc78a5': { selectors: ['.text-uppercase (3680:1)'] },
- f9e3f64237f2e81b6aed84223a0ceb1d: { selectors: ['.text-capitalize (3684:1)'] },
- '09caca3d36aa9f3ef815e0da7e1a16b4': { selectors: ['.font-weight-light (3688:1)'] },
- '23544682bb214a76e383e032d4056be4': { selectors: ['.font-weight-lighter (3692:1)'] },
- '25189f4fad18eaeef19e349c6680834c': { selectors: ['.font-weight-normal (3696:1)'] },
- b2a9507678ec557603eb8ec077f0eb1f: { selectors: ['.font-weight-bold (3700:1)'] },
- '9d05a94a577558235edce4c8fd9ab639': { selectors: ['.font-weight-bolder (3704:1)'] },
- '7d2da06b621a98a8599e5ec82e39eac8': { selectors: ['.font-italic (3708:1)'] },
- '0020d10e4fce033b418aace7c3143b82': { selectors: ['.text-white (3712:1)'] },
- '34ad81e372a038e6f78ae4f22bd4813d': { selectors: ['.text-primary (3716:1)'] },
- '9fde9a179d24755438ace2a874dda817': {
- selectors: ['.text-secondary (3724:1)', '.text-muted (3784:1)'],
- },
- '9ffcb1532b3fb397c0e818850683da29': { selectors: ['.text-success (3732:1)'] },
- f28fd089809bcd15d5684b158a0af98d: { selectors: ['.text-info (3740:1)'] },
- '6cac1cb5ee5149e91e45d15d0bdae310': { selectors: ['.text-warning (3748:1)'] },
- '2faab1e0abf22b20fdf05b9b01fff29b': { selectors: ['.text-danger (3756:1)'] },
- '46b52fea531aaaf29b63c40be2356849': { selectors: ['.text-light (3764:1)'] },
- '78f31d1ab6529decf28e0366a8ee81aa': { selectors: ['.text-dark (3772:1)'] },
- '45330b41b77e8880ad7680c51e0f61c4': { selectors: ['.text-body (3780:1)'] },
- '60d93588f62b5e85eb4f11dfd3461897': { selectors: ['.text-black-50 (3788:1)'] },
- '7dea35658553032ff7b7cc0287613b7c': { selectors: ['.text-white-50 (3792:1)'] },
- '61bf92980cac3d51d0cf1ba24c948fa1': { selectors: ['.text-hide (3796:1)'] },
- '187bfde85cb4d8bdaa41735f54f5c4f8': { selectors: ['.text-decoration-none (3804:1)'] },
- fd57878967b8dce947091cdc114efd83: { selectors: ['.text-break (3808:1)'] },
- '43b8d67240c3b09505d94522a62a977c': { selectors: ['.text-reset (3813:1)'] },
- '7dcad258820769677bc60871fafe9b93': { selectors: ['.visible (3817:1)'] },
- '0f8833af4e2f4a6fc785bd7edc1e75b3': { selectors: ['.invisible (3821:1)'] },
-};
diff --git a/scripts/glfm/run-snapshot-tests.sh b/scripts/glfm/run-snapshot-tests.sh
index 70fdae60edc..59a7c8f06b0 100755
--- a/scripts/glfm/run-snapshot-tests.sh
+++ b/scripts/glfm/run-snapshot-tests.sh
@@ -24,10 +24,9 @@ printf "\nStarting GLFM snapshot example tests. See https://docs.gitlab.com/ee/d
printf "Set 'FOCUSED_MARKDOWN_EXAMPLES=example_name_1[,...]' for focused examples, with example name(s) from https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#glfm_specificationexample_snapshotsexamples_indexyml.\n"
printf "${Color_Off}"
-# This section can be uncommented as soon as this is merged: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89953
-#printf "\n${BBlue}Running frontend 'yarn jest spec/frontend/content_editor/markdown_snapshot_spec.js'...${Color_Off}\n\n"
-#yarn jest spec/frontend/content_editor/markdown_snapshot_spec.js
-#printf "\n${BBlue}'yarn jest spec/frontend/content_editor/markdown_snapshot_spec.js' passed!${Color_Off}\n\n"
+printf "\n${BBlue}Running frontend 'yarn jest spec/frontend/content_editor/markdown_snapshot_spec.js'...${Color_Off}\n\n"
+yarn jest spec/frontend/content_editor/markdown_snapshot_spec.js
+printf "\n${BBlue}'yarn jest spec/frontend/content_editor/markdown_snapshot_spec.js' passed!${Color_Off}\n\n"
printf "\n${BBlue}Running backend 'bundle exec rspec spec/requests/api/markdown_snapshot_spec.rb'...${Color_Off}\n\n"
bundle exec rspec spec/requests/api/markdown_snapshot_spec.rb
diff --git a/scripts/lib/glfm/constants.rb b/scripts/lib/glfm/constants.rb
index e5917fc5cdb..42977248c0d 100644
--- a/scripts/lib/glfm/constants.rb
+++ b/scripts/lib/glfm/constants.rb
@@ -21,7 +21,7 @@ module Glfm
GLFM_SPEC_TXT_PATH = specification_path.join('output/spec.txt')
# Example Snapshot (ES) files
- es_fixtures_path = File.expand_path("../../../spec/fixtures/glfm/example_snapshots", __dir__)
+ es_fixtures_path = File.expand_path("../../../glfm_specification/example_snapshots", __dir__)
ES_EXAMPLES_INDEX_YML_PATH = File.join(es_fixtures_path, 'examples_index.yml')
ES_MARKDOWN_YML_PATH = File.join(es_fixtures_path, 'markdown.yml')
ES_HTML_YML_PATH = File.join(es_fixtures_path, 'html.yml')
diff --git a/scripts/lib/glfm/parse_examples.rb b/scripts/lib/glfm/parse_examples.rb
index 1c6afb800c3..14634bcfb3e 100644
--- a/scripts/lib/glfm/parse_examples.rb
+++ b/scripts/lib/glfm/parse_examples.rb
@@ -13,7 +13,11 @@
# 1. Capture all nested headers, not just the most recent.
# 2. Raise an exception if an unexpected state is encountered.
#
-# Comments indicate where changes or additions were made.
+# Comments indicate where changes, deletions, or additions were made.
+#
+# See more detailed documentation of rules regarding the handling of headers
+# in the comments at the top of `Glfm::UpdateExampleSnapshots#add_example_names`,
+# in `scripts/lib/glfm/update_example_snapshots.rb`
module Glfm
module ParseExamples
REGULAR_TEXT = 0
@@ -51,22 +55,29 @@ module Glfm
state = REGULAR_TEXT
example_number += 1
end_line = line_number
- unless extensions.include?('disabled')
- tests <<
- {
- markdown: markdown_lines.join.tr('→', "\t"),
- html: html_lines.join.tr('→', "\t"),
- example: example_number,
- start_line: start_line,
- end_line: end_line,
- section: headertext,
- extensions: extensions,
- headers: headers.dup # new logic compared to original Python code
- }
- start_line = 0
- markdown_lines = []
- html_lines = []
- end
+
+ # NOTE: The original implementation completely excludes disabled examples, but we need
+ # to include them in order to correctly count the header numbering, so we set a flag
+ # instead. This will need to be accounted for when we run conformance testing.
+
+ # unless extensions.include?('disabled') # commented logic compared to original Python code
+ tests <<
+ {
+ markdown: markdown_lines.join.tr('→', "\t"),
+ html: html_lines.join.tr('→', "\t"),
+ example: example_number,
+ start_line: start_line,
+ end_line: end_line,
+ section: headertext,
+ extensions: extensions,
+ headers: headers.dup, # new logic compared to original Python code
+ disabled: extensions.include?('disabled') # new logic compared to original Python code
+ }
+ # end # commented logic compared to original Python code
+
+ start_line = 0
+ markdown_lines = []
+ html_lines = []
elsif stripped_line == "."
# Else if the example divider line...
state = HTML_OUTPUT
@@ -80,19 +91,23 @@ module Glfm
html_lines.append(line)
elsif state == REGULAR_TEXT && line =~ header_regex
# Else if we are in regular text and it is a header line
- # NOTE: This assumes examples are only nested up to 2 levels deep (H2)
+ # NOTE: This assumes examples are within the section under
+ # Heading level 2 with Heading levels above 2 ignored
# Extract the header text from the line
headertext = line.gsub(header_regex, '').strip
+ # The 'headers' array is new logic compared to the original Python code
+
# reset the headers array if we found a new H1
- headers = [] if line =~ h1_regex # new logic compared to original Python code
+ headers = [] if line =~ h1_regex
- # pop the last entry from the headers array if we found a new H2
- headers.pop if headers.length == 2 && line =~ h2_regex # new logic compared to original Python code
+ # headers should be size 2 or less [<H1_headertext>, <H2_headertext>]
+ # pop the last entry from the headers array if we are in an H2 and found a new H2
+ headers.pop if headers.length == 2 && line =~ h2_regex
# push the new header text to the headers array
- headers << headertext # New logic compared to original Python code
+ headers << headertext if line =~ h1_regex || line =~ h2_regex
else
# Else if we are in regular text...
diff --git a/scripts/lib/glfm/render_wysiwyg_html_and_json.js b/scripts/lib/glfm/render_wysiwyg_html_and_json.js
index 58b440d7ab2..ed8bfdb4638 100644
--- a/scripts/lib/glfm/render_wysiwyg_html_and_json.js
+++ b/scripts/lib/glfm/render_wysiwyg_html_and_json.js
@@ -1,117 +1,7 @@
import fs from 'fs';
-import { DOMSerializer } from 'prosemirror-model';
import jsYaml from 'js-yaml';
-// TODO: DRY up duplication with spec/frontend/content_editor/services/markdown_serializer_spec.js
-// See https://gitlab.com/groups/gitlab-org/-/epics/7719#plan
-import Blockquote from '~/content_editor/extensions/blockquote';
-import Bold from '~/content_editor/extensions/bold';
-import BulletList from '~/content_editor/extensions/bullet_list';
-import Code from '~/content_editor/extensions/code';
-import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
-import DescriptionItem from '~/content_editor/extensions/description_item';
-import DescriptionList from '~/content_editor/extensions/description_list';
-import Details from '~/content_editor/extensions/details';
-import DetailsContent from '~/content_editor/extensions/details_content';
-import Division from '~/content_editor/extensions/division';
-import Emoji from '~/content_editor/extensions/emoji';
-import Figure from '~/content_editor/extensions/figure';
-import FigureCaption from '~/content_editor/extensions/figure_caption';
-import FootnoteDefinition from '~/content_editor/extensions/footnote_definition';
-import FootnoteReference from '~/content_editor/extensions/footnote_reference';
-import FootnotesSection from '~/content_editor/extensions/footnotes_section';
-import HardBreak from '~/content_editor/extensions/hard_break';
-import Heading from '~/content_editor/extensions/heading';
-import HorizontalRule from '~/content_editor/extensions/horizontal_rule';
-import Image from '~/content_editor/extensions/image';
-import InlineDiff from '~/content_editor/extensions/inline_diff';
-import Italic from '~/content_editor/extensions/italic';
-import Link from '~/content_editor/extensions/link';
-import ListItem from '~/content_editor/extensions/list_item';
-import OrderedList from '~/content_editor/extensions/ordered_list';
-import Strike from '~/content_editor/extensions/strike';
-import Table from '~/content_editor/extensions/table';
-import TableCell from '~/content_editor/extensions/table_cell';
-import TableHeader from '~/content_editor/extensions/table_header';
-import TableRow from '~/content_editor/extensions/table_row';
-import TaskItem from '~/content_editor/extensions/task_item';
-import TaskList from '~/content_editor/extensions/task_list';
-import createMarkdownDeserializer from '~/content_editor/services/remark_markdown_deserializer';
-import { createTestEditor } from 'jest/content_editor/test_utils';
import { setTestTimeout } from 'jest/__helpers__/timeout';
-
-const tiptapEditor = createTestEditor({
- extensions: [
- Blockquote,
- Bold,
- BulletList,
- Code,
- CodeBlockHighlight,
- DescriptionItem,
- DescriptionList,
- Details,
- DetailsContent,
- Division,
- Emoji,
- FootnoteDefinition,
- FootnoteReference,
- FootnotesSection,
- Figure,
- FigureCaption,
- HardBreak,
- Heading,
- HorizontalRule,
- Image,
- InlineDiff,
- Italic,
- Link,
- ListItem,
- OrderedList,
- Strike,
- Table,
- TableCell,
- TableHeader,
- TableRow,
- TaskItem,
- TaskList,
- ],
-});
-
-async function renderMarkdownToHTMLAndJSON(markdown, schema, deserializer) {
- let prosemirrorDocument;
- try {
- const { document } = await deserializer.deserialize({ schema, content: markdown });
- prosemirrorDocument = document;
- } catch (e) {
- const errorMsg = `Error - check implementation:\n${e.message}`;
- return {
- html: errorMsg,
- json: errorMsg,
- };
- }
-
- const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(
- prosemirrorDocument.content,
- );
- const htmlString = documentFragment.firstChild.outerHTML;
-
- const json = prosemirrorDocument.toJSON();
- const jsonString = JSON.stringify(json, null, 2);
- return { html: htmlString, json: jsonString };
-}
-
-function renderHtmlAndJsonForAllExamples(markdownExamples) {
- const { schema } = tiptapEditor;
- const deserializer = createMarkdownDeserializer();
- const exampleNames = Object.keys(markdownExamples);
-
- return exampleNames.reduce(async (promisedExamples, exampleName) => {
- const markdown = markdownExamples[exampleName];
- const htmlAndJson = await renderMarkdownToHTMLAndJSON(markdown, schema, deserializer);
- const examples = await promisedExamples;
- examples[exampleName] = htmlAndJson;
- return examples;
- }, Promise.resolve({}));
-}
+import { renderHtmlAndJsonForAllExamples } from 'jest/content_editor/render_html_and_json_for_all_examples';
/* eslint-disable no-undef */
jest.mock('~/emoji');
diff --git a/scripts/lib/glfm/update_example_snapshots.rb b/scripts/lib/glfm/update_example_snapshots.rb
index 9ffa54cd5d4..893d8d9c014 100644
--- a/scripts/lib/glfm/update_example_snapshots.rb
+++ b/scripts/lib/glfm/update_example_snapshots.rb
@@ -40,18 +40,27 @@ module Glfm
add_example_names(all_examples)
+ reject_disabled_examples(all_examples)
+
write_snapshot_example_files(all_examples, skip_static_and_wysiwyg: skip_static_and_wysiwyg)
end
private
def add_example_names(all_examples)
- # NOTE: This method assumes:
+ # NOTE: This method and the parse_examples method assume:
# 1. Section 2 is the first section which contains examples
- # 2. Examples are always nested exactly than 2 levels deep in an H2
- # 3. We assume that the Appendix doesn't ever contain any examples, so it doesn't show up
+ # 2. Examples are always nested exactly 2 levels deep in an H2
+ # 3. There may exist H3 headings with no examples (e.g. "Motivation" in the GLFM spec.txt)
+ # 4. The Appendix doesn't ever contain any examples, so it doesn't show up
# in the H1 header count. So, even though due to the concatenation it appears before the
# GitLab examples sections, it doesn't result in their header counts being off by +1.
+ # 5. If an example contains the 'disabled' string extension, it is skipped (and will thus
+ # result in a skip in the `spec_txt_example_position`). This behavior is taken from the
+ # GFM `spec_test.py` script (but it's NOT in the original CommonMark `spec_test.py`).
+ # 6. If a section contains ONLY disabled examples, the section numbering will still be
+ # incremented to match the rendered HTML specification section numbering.
+ # 7. Every H2 must contain at least one example, but it is allowed that they are all disabled.
h1_count = 1 # examples start in H1 section 2; section 1 is the overview with no examples.
h2_count = 0
@@ -86,6 +95,10 @@ module Glfm
end
end
+ def reject_disabled_examples(all_examples)
+ all_examples.reject! { |example| example[:disabled] }
+ end
+
def write_snapshot_example_files(all_examples, skip_static_and_wysiwyg:)
output("Reading #{GLFM_EXAMPLE_STATUS_YML_PATH}...")
glfm_examples_statuses = YAML.safe_load(File.open(GLFM_EXAMPLE_STATUS_YML_PATH))
@@ -231,7 +244,7 @@ module Glfm
name = example.fetch(:name)
json = if glfm_examples_statuses.dig(name, 'skip_update_example_snapshot_prosemirror_json')
- existing_hash.dig(name)
+ existing_hash[name]
else
wysiwyg_html_and_json_hash.dig(name, 'json')
end
diff --git a/scripts/pipeline_test_report_builder.rb b/scripts/pipeline_test_report_builder.rb
index 2101decf59a..649b68427ea 100755
--- a/scripts/pipeline_test_report_builder.rb
+++ b/scripts/pipeline_test_report_builder.rb
@@ -72,6 +72,10 @@ class PipelineTestReportBuilder
# Please see for more info: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69053#note_709939709
def test_report_for_build(pipeline, build_id)
fetch("#{pipeline['web_url']}/tests/suite.json?build_ids[]=#{build_id}")
+ rescue Net::HTTPServerException => e
+ raise e unless e.response.code.to_i == 404
+
+ puts "Artifacts not found. They may have expired. Skipping this build."
end
def build_test_report_json_for_pipeline(pipeline)
@@ -92,7 +96,8 @@ class PipelineTestReportBuilder
test_report['suites'] ||= []
failed_builds_for_test_stage.each do |failed_build|
- test_report['suites'] << test_report_for_build(pipeline, failed_build['id'])
+ suite = test_report_for_build(pipeline, failed_build['id'])
+ test_report['suites'] << suite if suite
end
end
diff --git a/scripts/review_apps/gcp_cleanup.sh b/scripts/review_apps/gcp_cleanup.sh
index 3225631e8c7..114ac6f7ec0 100755
--- a/scripts/review_apps/gcp_cleanup.sh
+++ b/scripts/review_apps/gcp_cleanup.sh
@@ -3,7 +3,7 @@
source scripts/utils.sh
function setup_gcp_dependencies() {
- apk add jq
+ apt-get update && apt-get install -y jq
gcloud auth activate-service-account --key-file="${REVIEW_APPS_GCP_CREDENTIALS}"
gcloud config set project "${REVIEW_APPS_GCP_PROJECT}"
diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh
index 8a868edce3a..b6ac7b4281b 100755
--- a/scripts/review_apps/review-apps.sh
+++ b/scripts/review_apps/review-apps.sh
@@ -248,6 +248,7 @@ function download_chart() {
helm repo add gitlab https://charts.gitlab.io
echoinfo "Building the gitlab chart's dependencies..."
+ helm dependency build "gitlab-${GITLAB_HELM_CHART_REF}"
}
function base_config_changed() {
diff --git a/scripts/rspec_helpers.sh b/scripts/rspec_helpers.sh
index af09d6d0edd..b31e3663eaa 100644
--- a/scripts/rspec_helpers.sh
+++ b/scripts/rspec_helpers.sh
@@ -304,12 +304,15 @@ function retry_failed_rspec_examples() {
# Disable Crystalball on retry to not overwrite the existing report
export CRYSTALBALL="false"
+ # Disable simplecov so retried tests don't override test coverage report
+ export SIMPLECOV=0
+
# Retry only the tests that failed on first try
rspec_simple_job "--only-failures --pattern \"${KNAPSACK_TEST_FILE_PATTERN}\"" "${JUNIT_RETRY_FILE}"
rspec_run_status=$?
# Merge the JUnit report from retry into the first-try report
- junit_merge "${JUNIT_RETRY_FILE}" "${JUNIT_RESULT_FILE}"
+ junit_merge "${JUNIT_RETRY_FILE}" "${JUNIT_RESULT_FILE}" --update-only
exit $rspec_run_status
}
diff --git a/scripts/undercoverage b/scripts/undercoverage
index d6e6197911e..b9266b015a7 100755
--- a/scripts/undercoverage
+++ b/scripts/undercoverage
@@ -1,3 +1,25 @@
-#!/usr/bin/env bash
+#!/usr/bin/env ruby
-bundle exec undercover -c "${1:-$(git merge-base origin/master HEAD)}"
+# frozen_string_literal: true
+
+require 'undercover'
+
+module Undercover
+ class Changeset
+ # Rugged merge_base complains when graft/shallow
+ # (https://github.com/libgit2/rugged/issues/846)
+ #
+ # So we assume we provide the merge-base ourself. Modified from
+ # https://github.com/grodowski/undercover/blob/32e62f66682ee566032b5970437ed2934ef29701/lib/undercover/changeset.rb#L74-L78
+ def compare_base_obj
+ return unless compare_base
+
+ repo.lookup(compare_base.to_s)
+ end
+ end
+end
+
+compare_base = ARGV[0]
+compare_base ||= IO.popen(%w(git merge-base origin/master HEAD)) { |p| p.read.chomp }
+
+Undercover::CLI.run(%W(-c #{compare_base}))
diff --git a/scripts/utils.sh b/scripts/utils.sh
index 4f339bbc850..d9205921963 100644
--- a/scripts/utils.sh
+++ b/scripts/utils.sh
@@ -38,11 +38,12 @@ function bundle_install_script() {
exit 1;
fi;
- gem install bundler --no-document --conservative --version 2.3.15
+ gem --version
bundle --version
+ gem install bundler --no-document --conservative --version 2.3.15
+ test -d jh && bundle config set --local gemfile 'jh/Gemfile'
bundle config set path "$(pwd)/vendor"
bundle config set clean 'true'
- test -d jh && bundle config set --local gemfile 'jh/Gemfile'
echo "${BUNDLE_WITHOUT}"
bundle config
diff --git a/spec/channels/application_cable/connection_spec.rb b/spec/channels/application_cable/connection_spec.rb
index affde0095cf..f5b2cdd2fca 100644
--- a/spec/channels/application_cable/connection_spec.rb
+++ b/spec/channels/application_cable/connection_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe ApplicationCable::Connection, :clean_gitlab_redis_sessions do
context 'when user is logged in' do
let(:user) { create(:user) }
- let(:session_hash) { { 'warden.user.user.key' => [[user.id], user.encrypted_password[0, 29]] } }
+ let(:session_hash) { { 'warden.user.user.key' => [[user.id], user.authenticatable_salt] } }
it 'sets current_user' do
connect
@@ -21,7 +21,7 @@ RSpec.describe ApplicationCable::Connection, :clean_gitlab_redis_sessions do
end
context 'with a stale password' do
- let(:partial_password_hash) { build(:user, password: 'some_old_password').encrypted_password[0, 29] }
+ let(:partial_password_hash) { build(:user, password: 'some_old_password').authenticatable_salt }
let(:session_hash) { { 'warden.user.user.key' => [[user.id], partial_password_hash] } }
it 'sets current_user to nil' do
diff --git a/spec/channels/awareness_channel_spec.rb b/spec/channels/awareness_channel_spec.rb
new file mode 100644
index 00000000000..8d6dc36f6bd
--- /dev/null
+++ b/spec/channels/awareness_channel_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe AwarenessChannel, :clean_gitlab_redis_shared_state, type: :channel do
+ before do
+ stub_action_cable_connection(current_user: user)
+ end
+
+ context "with user" do
+ let(:user) { create(:user) }
+
+ describe "when no path parameter given" do
+ it "rejects subscription" do
+ subscribe path: nil
+
+ expect(subscription).to be_rejected
+ end
+ end
+
+ describe "with valid path parameter" do
+ it "successfully subscribes" do
+ subscribe path: "/test"
+
+ session = AwarenessSession.for("/test")
+
+ expect(subscription).to be_confirmed
+ # check if we can use session object instead
+ expect(subscription).to have_stream_from("awareness:#{session.to_param}")
+ end
+
+ it "broadcasts set of collaborators when subscribing" do
+ session = AwarenessSession.for("/test")
+
+ freeze_time do
+ collaborator = {
+ id: user.id,
+ name: user.name,
+ avatar_url: user.avatar_url(size: 36),
+ last_activity: Time.zone.now,
+ last_activity_humanized: ActionController::Base.helpers.distance_of_time_in_words(
+ Time.zone.now, Time.zone.now
+ )
+ }
+
+ expect do
+ subscribe path: "/test"
+ end.to have_broadcasted_to("awareness:#{session.to_param}")
+ .with(collaborators: [collaborator])
+ end
+ end
+
+ it "transmits payload when user is touched" do
+ subscribe path: "/test"
+
+ perform :touch
+
+ expect(transmissions.size).to be 1
+ end
+
+ it "unsubscribes from channel" do
+ subscribe path: "/test"
+ session = AwarenessSession.for("/test")
+
+ expect { subscription.unsubscribe_from_channel }
+ .to change { session.size}.by(-1)
+ end
+ end
+ end
+
+ context "with guest" do
+ let(:user) { nil }
+
+ it "rejects subscription" do
+ subscribe path: "/test"
+
+ expect(subscription).to be_rejected
+ end
+ end
+end
diff --git a/spec/components/pajamas/alert_component_spec.rb b/spec/components/pajamas/alert_component_spec.rb
index 1e2845c44a8..c60724c7b78 100644
--- a/spec/components/pajamas/alert_component_spec.rb
+++ b/spec/components/pajamas/alert_component_spec.rb
@@ -14,11 +14,11 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
end
it 'renders alert body' do
- expect(rendered_component).to have_content(body)
+ expect(page).to have_content(body)
end
it 'renders actions' do
- expect(rendered_component).to have_content(actions)
+ expect(page).to have_content(actions)
end
end
@@ -28,20 +28,20 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
end
it 'does not set a title' do
- expect(rendered_component).not_to have_selector('.gl-alert-title')
- expect(rendered_component).to have_selector('.gl-alert-icon-no-title')
+ expect(page).not_to have_selector('.gl-alert-title')
+ expect(page).to have_selector('.gl-alert-icon-no-title')
end
it 'renders the default variant' do
- expect(rendered_component).to have_selector('.gl-alert-info')
- expect(rendered_component).to have_selector("[data-testid='information-o-icon']")
- expect(rendered_component).not_to have_selector('.gl-alert-no-icon')
+ expect(page).to have_selector('.gl-alert-info')
+ expect(page).to have_selector("[data-testid='information-o-icon']")
+ expect(page).not_to have_selector('.gl-alert-no-icon')
end
it 'renders a dismiss button' do
- expect(rendered_component).to have_selector('.gl-dismiss-btn.js-close')
- expect(rendered_component).to have_selector("[data-testid='close-icon']")
- expect(rendered_component).not_to have_selector('.gl-alert-not-dismissible')
+ expect(page).to have_selector('.gl-dismiss-btn.js-close')
+ expect(page).to have_selector("[data-testid='close-icon']")
+ expect(page).not_to have_selector('.gl-alert-not-dismissible')
end
end
@@ -61,17 +61,17 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
end
it 'sets the title' do
- expect(rendered_component).to have_selector('.gl-alert-title')
- expect(rendered_component).to have_content('_title_')
- expect(rendered_component).not_to have_selector('.gl-alert-icon-no-title')
+ expect(page).to have_selector('.gl-alert-title')
+ expect(page).to have_content('_title_')
+ expect(page).not_to have_selector('.gl-alert-icon-no-title')
end
it 'sets the alert_class' do
- expect(rendered_component).to have_selector('._alert_class_')
+ expect(page).to have_selector('._alert_class_')
end
it 'sets the alert_data' do
- expect(rendered_component).to have_selector('[data-feature-id="_feature_id_"][data-dismiss-endpoint="_dismiss_endpoint_"]')
+ expect(page).to have_selector('[data-feature-id="_feature_id_"][data-dismiss-endpoint="_dismiss_endpoint_"]')
end
end
@@ -81,12 +81,12 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
end
it 'has the "not dismissible" class' do
- expect(rendered_component).to have_selector('.gl-alert-not-dismissible')
+ expect(page).to have_selector('.gl-alert-not-dismissible')
end
it 'does not render the dismiss button' do
- expect(rendered_component).not_to have_selector('.gl-dismiss-btn.js-close')
- expect(rendered_component).not_to have_selector("[data-testid='close-icon']")
+ expect(page).not_to have_selector('.gl-dismiss-btn.js-close')
+ expect(page).not_to have_selector("[data-testid='close-icon']")
end
end
@@ -96,12 +96,12 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
end
it 'has the hidden icon class' do
- expect(rendered_component).to have_selector('.gl-alert-no-icon')
+ expect(page).to have_selector('.gl-alert-no-icon')
end
it 'does not render the icon' do
- expect(rendered_component).not_to have_selector('.gl-alert-icon')
- expect(rendered_component).not_to have_selector("[data-testid='information-o-icon']")
+ expect(page).not_to have_selector('.gl-alert-icon')
+ expect(page).not_to have_selector("[data-testid='information-o-icon']")
end
end
@@ -118,13 +118,13 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
end
it 'does not have "not dismissible" class' do
- expect(rendered_component).not_to have_selector('.gl-alert-not-dismissible')
+ expect(page).not_to have_selector('.gl-alert-not-dismissible')
end
it 'renders a dismiss button and data' do
- expect(rendered_component).to have_selector('.gl-dismiss-btn.js-close._close_button_class_')
- expect(rendered_component).to have_selector("[data-testid='close-icon']")
- expect(rendered_component).to have_selector('[data-testid="_close_button_testid_"]')
+ expect(page).to have_selector('.gl-dismiss-btn.js-close._close_button_class_')
+ expect(page).to have_selector("[data-testid='close-icon']")
+ expect(page).to have_selector('[data-testid="_close_button_testid_"]')
end
end
@@ -137,8 +137,8 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
with_them do
it 'renders the variant' do
- expect(rendered_component).to have_selector(".gl-alert-#{variant}")
- expect(rendered_component).to have_selector("[data-testid='#{described_class::ICONS[variant]}-icon']")
+ expect(page).to have_selector(".gl-alert-#{variant}")
+ expect(page).to have_selector("[data-testid='#{described_class::ICONS[variant]}-icon']")
end
end
end
diff --git a/spec/components/pajamas/banner_component_spec.rb b/spec/components/pajamas/banner_component_spec.rb
index 5969f06dbad..26468d80c77 100644
--- a/spec/components/pajamas/banner_component_spec.rb
+++ b/spec/components/pajamas/banner_component_spec.rb
@@ -19,22 +19,22 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
end
it 'renders its content' do
- expect(rendered_component).to have_text content
+ expect(page).to have_text content
end
it 'renders its title' do
- expect(rendered_component).to have_css "h1[class='gl-banner-title']", text: title
+ expect(page).to have_css "h1[class='gl-banner-title']", text: title
end
it 'renders a close button' do
- expect(rendered_component).to have_css "button.gl-banner-close"
+ expect(page).to have_css "button.gl-banner-close"
end
describe 'button_text and button_link' do
let(:options) { { button_text: 'Learn more', button_link: '/learn-more' } }
it 'define the primary action' do
- expect(rendered_component).to have_css "a.btn-confirm.gl-button[href='/learn-more']", text: 'Learn more'
+ expect(page).to have_css "a.btn-confirm.gl-button[href='/learn-more']", text: 'Learn more'
end
end
@@ -42,14 +42,14 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
let(:options) { { banner_options: { class: "baz", data: { foo: "bar" } } } }
it 'are on the banner' do
- expect(rendered_component).to have_css ".gl-banner.baz[data-foo='bar']"
+ expect(page).to have_css ".gl-banner.baz[data-foo='bar']"
end
context 'with custom classes' do
let(:options) { { variant: :introduction, banner_options: { class: 'extra special' } } }
it 'don\'t conflict with internal banner_classes' do
- expect(rendered_component).to have_css '.extra.special.gl-banner-introduction.gl-banner'
+ expect(page).to have_css '.extra.special.gl-banner-introduction.gl-banner'
end
end
end
@@ -58,14 +58,14 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
let(:options) { { close_options: { class: "js-foo", data: { uid: "123" } } } }
it 'are on the close button' do
- expect(rendered_component).to have_css "button.gl-banner-close.js-foo[data-uid='123']"
+ expect(page).to have_css "button.gl-banner-close.js-foo[data-uid='123']"
end
end
describe 'embedded' do
context 'by default (false)' do
it 'keeps the banner\'s borders' do
- expect(rendered_component).not_to have_css ".gl-banner.gl-border-none"
+ expect(page).not_to have_css ".gl-banner.gl-border-none"
end
end
@@ -73,7 +73,7 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
let(:options) { { embedded: true } }
it 'removes the banner\'s borders' do
- expect(rendered_component).to have_css ".gl-banner.gl-border-none"
+ expect(page).to have_css ".gl-banner.gl-border-none"
end
end
end
@@ -81,7 +81,7 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
describe 'variant' do
context 'by default (promotion)' do
it 'applies no variant class' do
- expect(rendered_component).to have_css "[class='gl-banner']"
+ expect(page).to have_css "[class='gl-banner']"
end
end
@@ -89,11 +89,11 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
let(:options) { { variant: :introduction } }
it "applies the introduction class to the banner" do
- expect(rendered_component).to have_css ".gl-banner.gl-banner-introduction"
+ expect(page).to have_css ".gl-banner.gl-banner-introduction"
end
it "applies the confirm class to the close button" do
- expect(rendered_component).to have_css ".gl-banner-close.btn-confirm.btn-confirm-tertiary"
+ expect(page).to have_css ".gl-banner-close.btn-confirm.btn-confirm-tertiary"
end
end
@@ -101,21 +101,21 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
let(:options) { { variant: :foobar } }
it 'ignores the unknown variant' do
- expect(rendered_component).to have_css "[class='gl-banner']"
+ expect(page).to have_css "[class='gl-banner']"
end
end
end
describe 'illustration' do
it 'has none by default' do
- expect(rendered_component).not_to have_css ".gl-banner-illustration"
+ expect(page).not_to have_css ".gl-banner-illustration"
end
context 'with svg_path' do
let(:options) { { svg_path: 'logo.svg' } }
it 'renders an image as illustration' do
- expect(rendered_component).to have_css ".gl-banner-illustration img"
+ expect(page).to have_css ".gl-banner-illustration img"
end
end
end
@@ -131,15 +131,15 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
end
it 'renders the slot content as illustration' do
- expect(rendered_component).to have_css ".gl-banner-illustration svg"
+ expect(page).to have_css ".gl-banner-illustration svg"
end
context 'and conflicting svg_path' do
let(:options) { { svg_path: 'logo.svg' } }
it 'uses the slot content' do
- expect(rendered_component).to have_css ".gl-banner-illustration svg"
- expect(rendered_component).not_to have_css ".gl-banner-illustration img"
+ expect(page).to have_css ".gl-banner-illustration svg"
+ expect(page).not_to have_css ".gl-banner-illustration img"
end
end
end
@@ -154,15 +154,15 @@ RSpec.describe Pajamas::BannerComponent, type: :component do
end
it 'renders the slot content as the primary action' do
- expect(rendered_component).to have_css "a.special", text: 'Special'
+ expect(page).to have_css "a.special", text: 'Special'
end
context 'and conflicting button_text and button_link' do
let(:options) { { button_text: 'Not special', button_link: '/' } }
it 'uses the slot content' do
- expect(rendered_component).to have_css "a.special[href='#']", text: 'Special'
- expect(rendered_component).not_to have_css "a.btn[href='/']"
+ expect(page).to have_css "a.special[href='#']", text: 'Special'
+ expect(page).not_to have_css "a.btn[href='/']"
end
end
end
diff --git a/spec/components/pajamas/button_component_spec.rb b/spec/components/pajamas/button_component_spec.rb
index 60c2a2e5a06..a8c96042580 100644
--- a/spec/components/pajamas/button_component_spec.rb
+++ b/spec/components/pajamas/button_component_spec.rb
@@ -17,25 +17,25 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
end
it 'renders its content' do
- expect(rendered_component).to have_text content
+ expect(page).to have_text content
end
it 'adds default styling' do
- expect(rendered_component).to have_css ".btn.btn-default.btn-md.gl-button"
+ expect(page).to have_css ".btn.btn-default.btn-md.gl-button"
end
describe 'button_options' do
let(:options) { { button_options: { id: 'baz', data: { foo: 'bar' } } } }
it 'are added to the button' do
- expect(rendered_component).to have_css ".gl-button#baz[data-foo='bar']"
+ expect(page).to have_css ".gl-button#baz[data-foo='bar']"
end
context 'with custom classes' do
let(:options) { { variant: :danger, category: :tertiary, button_options: { class: 'custom-class' } } }
it 'don\'t conflict with internal button_classes' do
- expect(rendered_component).to have_css '.gl-button.btn-danger.btn-danger-tertiary.custom-class'
+ expect(page).to have_css '.gl-button.btn-danger.btn-danger-tertiary.custom-class'
end
end
@@ -43,7 +43,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { button_options: { type: 'submit' } } }
it 'overrides type' do
- expect(rendered_component).to have_css '[type="submit"]'
+ expect(page).to have_css '[type="submit"]'
end
end
end
@@ -52,14 +52,14 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { button_text_classes: 'custom-text-class' } }
it 'is added to the button text' do
- expect(rendered_component).to have_css ".gl-button-text.custom-text-class"
+ expect(page).to have_css ".gl-button-text.custom-text-class"
end
end
describe 'disabled' do
context 'by default (false)' do
it 'does not have disabled styling and behavior' do
- expect(rendered_component).not_to have_css ".disabled[disabled='disabled'][aria-disabled='true']"
+ expect(page).not_to have_css ".disabled[disabled='disabled'][aria-disabled='true']"
end
end
@@ -67,7 +67,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { disabled: true } }
it 'has disabled styling and behavior' do
- expect(rendered_component).to have_css ".disabled[disabled='disabled'][aria-disabled='true']"
+ expect(page).to have_css ".disabled[disabled='disabled'][aria-disabled='true']"
end
end
end
@@ -75,11 +75,11 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
describe 'loading' do
context 'by default (false)' do
it 'is not disabled' do
- expect(rendered_component).not_to have_css ".disabled[disabled='disabled']"
+ expect(page).not_to have_css ".disabled[disabled='disabled']"
end
it 'does not render a spinner' do
- expect(rendered_component).not_to have_css ".gl-spinner[aria-label='Loading']"
+ expect(page).not_to have_css ".gl-spinner[aria-label='Loading']"
end
end
@@ -87,11 +87,11 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { loading: true } }
it 'is disabled' do
- expect(rendered_component).to have_css ".disabled[disabled='disabled']"
+ expect(page).to have_css ".disabled[disabled='disabled']"
end
it 'renders a spinner' do
- expect(rendered_component).to have_css ".gl-spinner[aria-label='Loading']"
+ expect(page).to have_css ".gl-spinner[aria-label='Loading']"
end
end
end
@@ -99,7 +99,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
describe 'block' do
context 'by default (false)' do
it 'is inline' do
- expect(rendered_component).not_to have_css ".btn-block"
+ expect(page).not_to have_css ".btn-block"
end
end
@@ -107,7 +107,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { block: true } }
it 'is block element' do
- expect(rendered_component).to have_css ".btn-block"
+ expect(page).to have_css ".btn-block"
end
end
end
@@ -115,7 +115,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
describe 'selected' do
context 'by default (false)' do
it 'does not have selected styling and behavior' do
- expect(rendered_component).not_to have_css ".selected"
+ expect(page).not_to have_css ".selected"
end
end
@@ -123,7 +123,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { selected: true } }
it 'has selected styling and behavior' do
- expect(rendered_component).to have_css ".selected"
+ expect(page).to have_css ".selected"
end
end
end
@@ -136,8 +136,8 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
with_them do
it 'renders the button in correct variant && category' do
- expect(rendered_component).to have_css(".#{described_class::VARIANT_CLASSES[variant]}")
- expect(rendered_component).to have_css(".#{described_class::VARIANT_CLASSES[variant]}-tertiary")
+ expect(page).to have_css(".#{described_class::VARIANT_CLASSES[variant]}")
+ expect(page).to have_css(".#{described_class::VARIANT_CLASSES[variant]}-tertiary")
end
end
end
@@ -149,8 +149,8 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
with_them do
it 'renders the button in correct variant && category' do
- expect(rendered_component).to have_css(".#{described_class::VARIANT_CLASSES[variant]}")
- expect(rendered_component).not_to have_css(".#{described_class::VARIANT_CLASSES[variant]}-tertiary")
+ expect(page).to have_css(".#{described_class::VARIANT_CLASSES[variant]}")
+ expect(page).not_to have_css(".#{described_class::VARIANT_CLASSES[variant]}-tertiary")
end
end
end
@@ -162,8 +162,8 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
with_them do
it 'renders the button in correct variant && category' do
- expect(rendered_component).to have_css(".#{described_class::VARIANT_CLASSES[variant]}")
- expect(rendered_component).not_to have_css(".#{described_class::VARIANT_CLASSES[variant]}-primary")
+ expect(page).to have_css(".#{described_class::VARIANT_CLASSES[variant]}")
+ expect(page).not_to have_css(".#{described_class::VARIANT_CLASSES[variant]}-primary")
end
end
end
@@ -172,7 +172,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
describe 'size' do
context 'by default (medium)' do
it 'applies medium class' do
- expect(rendered_component).to have_css ".btn-md"
+ expect(page).to have_css ".btn-md"
end
end
@@ -180,22 +180,22 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { size: :small } }
it "applies the small class to the button" do
- expect(rendered_component).to have_css ".btn-sm"
+ expect(page).to have_css ".btn-sm"
end
end
end
describe 'icon' do
it 'has none by default' do
- expect(rendered_component).not_to have_css ".gl-icon"
+ expect(page).not_to have_css ".gl-icon"
end
context 'with icon' do
let(:options) { { icon: 'star-o', icon_classes: 'custom-icon' } }
it 'renders an icon with custom CSS class' do
- expect(rendered_component).to have_css "svg.gl-icon.gl-button-icon.custom-icon[data-testid='star-o-icon']"
- expect(rendered_component).not_to have_css ".btn-icon"
+ expect(page).to have_css "svg.gl-icon.gl-button-icon.custom-icon[data-testid='star-o-icon']"
+ expect(page).not_to have_css ".btn-icon"
end
end
@@ -204,7 +204,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { icon: 'star-o' } }
it 'adds a "btn-icon" CSS class' do
- expect(rendered_component).to have_css ".btn.btn-icon"
+ expect(page).to have_css ".btn.btn-icon"
end
end
@@ -213,8 +213,8 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { icon: 'star-o', loading: true } }
it 'renders only a loading icon' do
- expect(rendered_component).not_to have_css "svg.gl-icon.gl-button-icon.custom-icon[data-testid='star-o-icon']"
- expect(rendered_component).to have_css ".gl-spinner[aria-label='Loading']"
+ expect(page).not_to have_css "svg.gl-icon.gl-button-icon.custom-icon[data-testid='star-o-icon']"
+ expect(page).to have_css ".gl-spinner[aria-label='Loading']"
end
end
end
@@ -222,7 +222,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
describe 'type' do
context 'by default (without href)' do
it 'has type "button"' do
- expect(rendered_component).to have_css "button[type='button']"
+ expect(page).to have_css "button[type='button']"
end
end
@@ -233,7 +233,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
with_them do
it 'has the correct type' do
- expect(rendered_component).to have_css "button[type='#{type}']"
+ expect(page).to have_css "button[type='#{type}']"
end
end
end
@@ -242,7 +242,7 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { type: :madeup } }
it 'has type "button"' do
- expect(rendered_component).to have_css "button[type='button']"
+ expect(page).to have_css "button[type='button']"
end
end
@@ -250,22 +250,22 @@ RSpec.describe Pajamas::ButtonComponent, type: :component do
let(:options) { { href: 'https://example.com', type: :reset } }
it 'ignores type' do
- expect(rendered_component).not_to have_css "[type]"
+ expect(page).not_to have_css "[type]"
end
end
end
describe 'link button' do
it 'renders a button tag with type="button" when "href" is not set' do
- expect(rendered_component).to have_css "button[type='button']"
+ expect(page).to have_css "button[type='button']"
end
context 'when "href" is provided' do
let(:options) { { href: 'https://gitlab.com', target: '_blank' } }
it "renders a link instead of the button" do
- expect(rendered_component).not_to have_css "button[type='button']"
- expect(rendered_component).to have_css "a[href='https://gitlab.com'][target='_blank']"
+ expect(page).not_to have_css "button[type='button']"
+ expect(page).to have_css "a[href='https://gitlab.com'][target='_blank']"
end
end
end
diff --git a/spec/components/pajamas/card_component_spec.rb b/spec/components/pajamas/card_component_spec.rb
index 65522a9023f..38d23cfca9c 100644
--- a/spec/components/pajamas/card_component_spec.rb
+++ b/spec/components/pajamas/card_component_spec.rb
@@ -16,15 +16,15 @@ RSpec.describe Pajamas::CardComponent, :aggregate_failures, type: :component do
end
it 'renders card header' do
- expect(rendered_component).to have_content(header)
+ expect(page).to have_content(header)
end
it 'renders card body' do
- expect(rendered_component).to have_content(body)
+ expect(page).to have_content(body)
end
it 'renders footer' do
- expect(rendered_component).to have_content(footer)
+ expect(page).to have_content(footer)
end
end
@@ -34,13 +34,13 @@ RSpec.describe Pajamas::CardComponent, :aggregate_failures, type: :component do
end
it 'does not have a header or footer' do
- expect(rendered_component).not_to have_selector('.gl-card-header')
- expect(rendered_component).not_to have_selector('.gl-card-footer')
+ expect(page).not_to have_selector('.gl-card-header')
+ expect(page).not_to have_selector('.gl-card-footer')
end
it 'renders the card and body' do
- expect(rendered_component).to have_selector('.gl-card')
- expect(rendered_component).to have_selector('.gl-card-body')
+ expect(page).to have_selector('.gl-card')
+ expect(page).to have_selector('.gl-card-body')
end
end
@@ -58,23 +58,23 @@ RSpec.describe Pajamas::CardComponent, :aggregate_failures, type: :component do
end
it 'renders card options' do
- expect(rendered_component).to have_selector('._card_class_')
- expect(rendered_component).to have_selector('[data-testid="_card_testid_"]')
+ expect(page).to have_selector('._card_class_')
+ expect(page).to have_selector('[data-testid="_card_testid_"]')
end
it 'renders header options' do
- expect(rendered_component).to have_selector('._header_class_')
- expect(rendered_component).to have_selector('[data-testid="_header_testid_"]')
+ expect(page).to have_selector('._header_class_')
+ expect(page).to have_selector('[data-testid="_header_testid_"]')
end
it 'renders body options' do
- expect(rendered_component).to have_selector('._body_class_')
- expect(rendered_component).to have_selector('[data-testid="_body_testid_"]')
+ expect(page).to have_selector('._body_class_')
+ expect(page).to have_selector('[data-testid="_body_testid_"]')
end
it 'renders footer options' do
- expect(rendered_component).to have_selector('._footer_class_')
- expect(rendered_component).to have_selector('[data-testid="_footer_testid_"]')
+ expect(page).to have_selector('._footer_class_')
+ expect(page).to have_selector('[data-testid="_footer_testid_"]')
end
end
end
diff --git a/spec/components/pajamas/checkbox_component_spec.rb b/spec/components/pajamas/checkbox_component_spec.rb
index b2f3a84fbfe..d79c537a30e 100644
--- a/spec/components/pajamas/checkbox_component_spec.rb
+++ b/spec/components/pajamas/checkbox_component_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Pajamas::CheckboxComponent, :aggregate_failures, type: :component
RSpec.shared_examples 'it renders unchecked checkbox with value of `1`' do
it 'renders unchecked checkbox with value of `1`' do
- expect(rendered_component).to have_unchecked_field(label, with: '1')
+ expect(page).to have_unchecked_field(label, with: '1')
end
end
@@ -31,7 +31,7 @@ RSpec.describe Pajamas::CheckboxComponent, :aggregate_failures, type: :component
include_examples 'it does not render help text'
it 'renders hidden input with value of `0`' do
- expect(rendered_component).to have_field('user[view_diffs_file_by_file]', type: 'hidden', with: '0')
+ expect(page).to have_field('user[view_diffs_file_by_file]', type: 'hidden', with: '0')
end
end
@@ -61,15 +61,15 @@ RSpec.describe Pajamas::CheckboxComponent, :aggregate_failures, type: :component
include_examples 'it renders help text'
it 'renders checked checkbox with value of `yes`' do
- expect(rendered_component).to have_checked_field(label, with: checked_value, class: checkbox_options[:class])
+ expect(page).to have_checked_field(label, with: checked_value, class: checkbox_options[:class])
end
it 'adds CSS class to label' do
- expect(rendered_component).to have_selector('label.label-foo-bar')
+ expect(page).to have_selector('label.label-foo-bar')
end
it 'renders hidden input with value of `no`' do
- expect(rendered_component).to have_field('user[view_diffs_file_by_file]', type: 'hidden', with: unchecked_value)
+ expect(page).to have_field('user[view_diffs_file_by_file]', type: 'hidden', with: unchecked_value)
end
end
diff --git a/spec/components/pajamas/radio_component_spec.rb b/spec/components/pajamas/radio_component_spec.rb
index 3885d101c7a..8df432746d0 100644
--- a/spec/components/pajamas/radio_component_spec.rb
+++ b/spec/components/pajamas/radio_component_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Pajamas::RadioComponent, :aggregate_failures, type: :component do
RSpec.shared_examples 'it renders unchecked radio' do
it 'renders unchecked radio' do
- expect(rendered_component).to have_unchecked_field(label)
+ expect(page).to have_unchecked_field(label)
end
end
@@ -58,11 +58,11 @@ RSpec.describe Pajamas::RadioComponent, :aggregate_failures, type: :component do
include_examples 'it renders help text'
it 'renders checked radio' do
- expect(rendered_component).to have_checked_field(label, class: radio_options[:class])
+ expect(page).to have_checked_field(label, class: radio_options[:class])
end
it 'adds CSS class to label' do
- expect(rendered_component).to have_selector('label.label-foo-bar')
+ expect(page).to have_selector('label.label-foo-bar')
end
end
diff --git a/spec/components/pajamas/spinner_component_spec.rb b/spec/components/pajamas/spinner_component_spec.rb
new file mode 100644
index 00000000000..9aac9a0085c
--- /dev/null
+++ b/spec/components/pajamas/spinner_component_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+require "spec_helper"
+
+RSpec.describe Pajamas::SpinnerComponent, type: :component do
+ let(:options) { {} }
+
+ before do
+ render_inline(described_class.new(**options))
+ end
+
+ describe 'class' do
+ let(:options) { { class: 'gl-my-6' } }
+
+ it 'has the correct custom class' do
+ expect(page).to have_css '.gl-spinner-container.gl-my-6'
+ end
+ end
+
+ describe 'color' do
+ context 'by default' do
+ it 'is dark' do
+ expect(page).to have_css '.gl-spinner.gl-spinner-dark'
+ end
+ end
+
+ context 'set to light' do
+ let(:options) { { color: :light } }
+
+ it 'is light' do
+ expect(page).to have_css '.gl-spinner.gl-spinner-light'
+ end
+ end
+ end
+
+ describe 'inline' do
+ context 'by default' do
+ it 'renders a div' do
+ expect(page).to have_css 'div.gl-spinner'
+ end
+ end
+
+ context 'set to true' do
+ let(:options) { { inline: true } }
+
+ it 'renders a span' do
+ expect(page).to have_css 'span.gl-spinner'
+ end
+ end
+ end
+
+ describe 'label' do
+ context 'by default' do
+ it 'has "Loading" as aria-label' do
+ expect(page).to have_css '.gl-spinner[aria-label="Loading"]'
+ end
+ end
+
+ context 'when set to something else' do
+ let(:options) { { label: "Sending" } }
+
+ it 'has a custom aria-label' do
+ expect(page).to have_css '.gl-spinner[aria-label="Sending"]'
+ end
+ end
+ end
+
+ describe 'size' do
+ let(:options) { { size: :lg } }
+
+ it 'has the correct size class' do
+ expect(page).to have_css '.gl-spinner.gl-spinner-lg'
+ end
+ end
+end
diff --git a/spec/components/pajamas/toggle_component_spec.rb b/spec/components/pajamas/toggle_component_spec.rb
index b2727dec318..6b0a2d26979 100644
--- a/spec/components/pajamas/toggle_component_spec.rb
+++ b/spec/components/pajamas/toggle_component_spec.rb
@@ -8,31 +8,31 @@ RSpec.describe Pajamas::ToggleComponent, type: :component do
end
it 'renders a toggle container with provided class' do
- expect(rendered_component).to have_selector "[class='js-feature-toggle']"
+ expect(page).to have_selector "[class='js-feature-toggle']"
end
it 'does not set a name' do
- expect(rendered_component).not_to have_selector('[data-name]')
+ expect(page).not_to have_selector('[data-name]')
end
it 'sets default is-checked attributes' do
- expect(rendered_component).to have_selector('[data-is-checked="false"]')
+ expect(page).to have_selector('[data-is-checked="false"]')
end
it 'sets default disabled attributes' do
- expect(rendered_component).to have_selector('[data-disabled="false"]')
+ expect(page).to have_selector('[data-disabled="false"]')
end
it 'sets default is-loading attributes' do
- expect(rendered_component).to have_selector('[data-is-loading="false"]')
+ expect(page).to have_selector('[data-is-loading="false"]')
end
it 'does not set a label' do
- expect(rendered_component).not_to have_selector('[data-label]')
+ expect(page).not_to have_selector('[data-label]')
end
it 'does not set a label position' do
- expect(rendered_component).not_to have_selector('[data-label-position]')
+ expect(page).not_to have_selector('[data-label-position]')
end
end
@@ -52,35 +52,35 @@ RSpec.describe Pajamas::ToggleComponent, type: :component do
end
it 'sets the custom class' do
- expect(rendered_component).to have_selector('.js-custom-gl-toggle')
+ expect(page).to have_selector('.js-custom-gl-toggle')
end
it 'sets the custom name' do
- expect(rendered_component).to have_selector('[data-name="toggle-name"]')
+ expect(page).to have_selector('[data-name="toggle-name"]')
end
it 'sets the custom is-checked attributes' do
- expect(rendered_component).to have_selector('[data-is-checked="true"]')
+ expect(page).to have_selector('[data-is-checked="true"]')
end
it 'sets the custom disabled attributes' do
- expect(rendered_component).to have_selector('[data-disabled="true"]')
+ expect(page).to have_selector('[data-disabled="true"]')
end
it 'sets the custom is-loading attributes' do
- expect(rendered_component).to have_selector('[data-is-loading="true"]')
+ expect(page).to have_selector('[data-is-loading="true"]')
end
it 'sets the custom label' do
- expect(rendered_component).to have_selector('[data-label="Custom label"]')
+ expect(page).to have_selector('[data-label="Custom label"]')
end
it 'sets the custom label position' do
- expect(rendered_component).to have_selector('[data-label-position="top"]')
+ expect(page).to have_selector('[data-label-position="top"]')
end
it 'sets custom data attributes' do
- expect(rendered_component).to have_selector('[data-foo="bar"]')
+ expect(page).to have_selector('[data-foo="bar"]')
end
end
@@ -101,7 +101,7 @@ RSpec.describe Pajamas::ToggleComponent, type: :component do
end
with_them do
- it { expect(rendered_component).to have_selector("[data-label-position='#{position}']", count: count) }
+ it { expect(page).to have_selector("[data-label-position='#{position}']", count: count) }
end
end
end
diff --git a/spec/contracts/consumer/endpoints/project/pipelines.js b/spec/contracts/consumer/endpoints/project/pipelines.js
new file mode 100644
index 00000000000..33758dee75b
--- /dev/null
+++ b/spec/contracts/consumer/endpoints/project/pipelines.js
@@ -0,0 +1,16 @@
+import { request } from 'axios';
+
+export function getProjectPipelines(endpoint) {
+ const { url } = endpoint;
+
+ return request({
+ method: 'GET',
+ baseURL: url,
+ url: '/gitlab-org/gitlab-qa/-/pipelines.json',
+ headers: { Accept: '*/*' },
+ params: {
+ scope: 'all',
+ page: 1,
+ },
+ }).then((response) => response.data);
+}
diff --git a/spec/contracts/consumer/fixtures/project/pipeline/get_list_project_pipelines.fixture.js b/spec/contracts/consumer/fixtures/project/pipeline/get_list_project_pipelines.fixture.js
new file mode 100644
index 00000000000..8a7663325b9
--- /dev/null
+++ b/spec/contracts/consumer/fixtures/project/pipeline/get_list_project_pipelines.fixture.js
@@ -0,0 +1,243 @@
+/* eslint-disable @gitlab/require-i18n-strings */
+
+import { Matchers } from '@pact-foundation/pact';
+import {
+ URL,
+ URL_PATH,
+ PIPELINE_GROUPS,
+ PIPELINE_LABELS,
+ PIPELINE_SOURCES,
+ PIPELINE_STATUSES,
+ PIPELINE_TEXTS,
+ USER_STATES,
+} from '../../../helpers/common_regex_patterns';
+
+const body = {
+ pipelines: Matchers.eachLike({
+ id: Matchers.integer(564173401),
+ iid: Matchers.integer(8197225),
+ user: {
+ id: Matchers.integer(1781152),
+ username: Matchers.string('gitlab-bot'),
+ name: Matchers.string('🤖 GitLab Bot 🤖'),
+ state: Matchers.term({
+ matcher: USER_STATES,
+ generate: 'active',
+ }),
+ avatar_url: Matchers.term({
+ matcher: URL,
+ generate: 'https://gitlab.com/uploads/-/system/user/avatar/1516152/avatar.png',
+ }),
+ web_url: Matchers.term({
+ matcher: URL,
+ generate: 'https://gitlab.com/gitlab-bot',
+ }),
+ show_status: Matchers.boolean(false),
+ path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-bot',
+ }),
+ },
+ active: Matchers.boolean(true),
+ source: Matchers.term({
+ matcher: PIPELINE_SOURCES,
+ generate: 'schedule',
+ }),
+ created_at: Matchers.iso8601DateTimeWithMillis('2022-06-11T00:05:21.558Z'),
+ updated_at: Matchers.iso8601DateTimeWithMillis('2022-06-11T00:05:34.258Z'),
+ path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/pipelines/561224401',
+ }),
+ flags: {
+ stuck: Matchers.boolean(false),
+ auto_devops: Matchers.boolean(false),
+ merge_request: Matchers.boolean(false),
+ yaml_errors: Matchers.boolean(false),
+ retryable: Matchers.boolean(false),
+ cancelable: Matchers.boolean(false),
+ failure_reason: Matchers.boolean(false),
+ detached_merge_request_pipeline: Matchers.boolean(false),
+ merge_request_pipeline: Matchers.boolean(false),
+ merge_train_pipeline: Matchers.boolean(false),
+ latest: Matchers.boolean(true),
+ },
+ details: {
+ status: {
+ icon: Matchers.term({
+ matcher: PIPELINE_STATUSES,
+ generate: 'status_running',
+ }),
+ text: Matchers.term({
+ matcher: PIPELINE_TEXTS,
+ generate: 'running',
+ }),
+ label: Matchers.term({
+ matcher: PIPELINE_LABELS,
+ generate: 'running',
+ }),
+ group: Matchers.term({
+ matcher: PIPELINE_GROUPS,
+ generate: 'running',
+ }),
+ tooltip: Matchers.term({
+ matcher: PIPELINE_LABELS,
+ generate: 'passed',
+ }),
+ has_details: Matchers.boolean(true),
+ details_path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/pipelines/566374401',
+ }),
+ illustration: null,
+ favicon: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/assets/ci_favicons/favicon_status_running.png',
+ }),
+ },
+ stages: Matchers.eachLike({
+ name: Matchers.string('sync'),
+ title: Matchers.string('sync: passed'),
+ status: {
+ icon: Matchers.term({
+ matcher: PIPELINE_STATUSES,
+ generate: 'status_success',
+ }),
+ text: Matchers.term({
+ matcher: PIPELINE_TEXTS,
+ generate: 'passed',
+ }),
+ label: Matchers.term({
+ matcher: PIPELINE_LABELS,
+ generate: 'passed',
+ }),
+ group: Matchers.term({
+ matcher: PIPELINE_GROUPS,
+ generate: 'success',
+ }),
+ tooltip: Matchers.term({
+ matcher: PIPELINE_LABELS,
+ generate: 'passed',
+ }),
+ has_details: Matchers.boolean(true),
+ details_path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/pipelines/561174401#sync',
+ }),
+ illustration: null,
+ favicon: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/assets/ci_favicons/favicon_status_success.png',
+ }),
+ },
+ path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/pipelines/561124401#sync',
+ }),
+ dropdown_path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/pipelines/561174401/stage.json?stage=sync',
+ }),
+ }),
+ duration: Matchers.integer(25),
+ finished_at: Matchers.iso8601DateTimeWithMillis('2022-06-11T00:55:21.558Z'),
+ name: Matchers.string('Pipeline'),
+ manual_actions: Matchers.eachLike({
+ name: Matchers.string('review-docs-deploy'),
+ playable: Matchers.boolean(true),
+ scheduled: Matchers.boolean(false),
+ }),
+ scheduled_actions: Matchers.eachLike({
+ name: Matchers.string('review-docs-schedule'),
+ playable: Matchers.boolean(true),
+ scheduled: Matchers.boolean(false),
+ }),
+ },
+ ref: {
+ name: Matchers.string('master'),
+ path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/commits/master',
+ }),
+ tag: Matchers.boolean(false),
+ branch: Matchers.boolean(true),
+ merge_request: Matchers.boolean(false),
+ },
+ commit: {
+ id: Matchers.string('e6d797385144b955c6d4ecfa00e9656dc33efd2b'),
+ short_id: Matchers.string('e6d79738'),
+ created_at: Matchers.iso8601DateTimeWithMillis('2022-06-10T22:02:10.000+00:00'),
+ parent_ids: Matchers.eachLike(Matchers.string('3b0e053a24958174eaa7e3b183c7263432890d1c')),
+ title: Matchers.string("Merge branch 'ee-test' into 'master'"),
+ message: Matchers.string("Merge branch 'ee-test' into 'master'\nThis is a test."),
+ author_name: Matchers.string('John Doe'),
+ author_email: Matchers.email('jdoe@gitlab.com'),
+ authored_date: Matchers.iso8601DateTimeWithMillis('2022-06-10T22:02:10.000+00:00'),
+ committer_name: Matchers.string('John Doe'),
+ committer_email: Matchers.email('jdoe@gitlab.com'),
+ committed_date: Matchers.iso8601DateTimeWithMillis('2022-06-10T22:02:10.000+00:00'),
+ trailers: {},
+ web_url: Matchers.term({
+ matcher: URL,
+ generate: 'https://gitlab.com/gitlab-org/gitlab/-/commit/f559253c514d9ab707c66e',
+ }),
+ author: null,
+ author_gravatar_url: Matchers.term({
+ matcher: URL,
+ generate:
+ 'https://secure.gravatar.com/avatar/d85e45af29611ac2c1395e3c3d6ec5d6?s=80\u0026d=identicon',
+ }),
+ commit_url: Matchers.term({
+ matcher: URL,
+ generate:
+ 'https://gitlab.com/gitlab-org/gitlab/-/commit/dc7522f559253c514d9ab707c66e7a1026abca5a',
+ }),
+ commit_path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/commit/dc7522f559253c514d9ab707c66e7a1026abca5a',
+ }),
+ },
+ project: {
+ id: Matchers.integer(253964),
+ name: Matchers.string('GitLab'),
+ full_path: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab',
+ }),
+ full_name: Matchers.string('GitLab.org / GitLab'),
+ },
+ triggered_by: null,
+ triggered: [],
+ }),
+ count: {
+ all: Matchers.string('1,000+'),
+ },
+};
+
+const ProjectPipelines = {
+ body: Matchers.extractPayload(body),
+
+ success: {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json; charset=utf-8',
+ },
+ body,
+ },
+
+ request: {
+ uponReceiving: 'a request for a list of project pipelines',
+ withRequest: {
+ method: 'GET',
+ path: '/gitlab-org/gitlab-qa/-/pipelines.json',
+ headers: {
+ Accept: '*/*',
+ },
+ query: 'scope=all&page=1',
+ },
+ },
+};
+
+export { ProjectPipelines };
+
+/* eslint-enable @gitlab/require-i18n-strings */
diff --git a/spec/contracts/consumer/fixtures/project/pipeline/get_pipeline_header_data.fixture.js b/spec/contracts/consumer/fixtures/project/pipeline/get_pipeline_header_data.fixture.js
new file mode 100644
index 00000000000..f51ed9c2c74
--- /dev/null
+++ b/spec/contracts/consumer/fixtures/project/pipeline/get_pipeline_header_data.fixture.js
@@ -0,0 +1,99 @@
+/* eslint-disable @gitlab/require-i18n-strings */
+
+import { Matchers } from '@pact-foundation/pact';
+import {
+ JOB_STATUSES,
+ PIPELINE_GROUPS,
+ PIPELINE_STATUSES,
+ PIPELINE_TEXTS,
+ URL,
+ URL_PATH,
+} from '../../../helpers/common_regex_patterns';
+
+const body = {
+ data: {
+ project: {
+ id: Matchers.string('gid://gitlab/Project/278964'),
+ pipeline: {
+ id: Matchers.string('gid://gitlab/Ci::Pipeline/577266584'),
+ iid: Matchers.string('1175084'),
+ status: Matchers.term({
+ matcher: JOB_STATUSES,
+ generate: 'RUNNING',
+ }),
+ retryable: Matchers.boolean(false),
+ cancelable: Matchers.boolean(true),
+ userPermissions: {
+ destroyPipeline: Matchers.boolean(false),
+ updatePipeline: Matchers.boolean(true),
+ },
+ detailedStatus: {
+ id: Matchers.string('running-577266584-577266584'),
+ detailsPath: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-org/gitlab/-/pipelines/577266584',
+ }),
+ icon: Matchers.term({
+ matcher: PIPELINE_STATUSES,
+ generate: 'status_running',
+ }),
+ group: Matchers.term({
+ matcher: PIPELINE_GROUPS,
+ generate: 'running',
+ }),
+ text: Matchers.term({
+ matcher: PIPELINE_TEXTS,
+ generate: 'running',
+ }),
+ },
+ createdAt: Matchers.iso8601DateTime('2022-06-30T16:58:59Z'),
+ user: {
+ id: Matchers.string('gid://gitlab/User/194645'),
+ name: Matchers.string('John Doe'),
+ username: Matchers.string('jdoe'),
+ webPath: Matchers.term({
+ matcher: URL_PATH,
+ generate: '/gitlab-bot',
+ }),
+ webUrl: Matchers.term({
+ matcher: URL,
+ generate: 'https://gitlab.com/gitlab-bot',
+ }),
+ email: null,
+ avatarUrl: Matchers.term({
+ matcher: URL,
+ generate:
+ 'https://www.gravatar.com/avatar/10fc7f102be8de7657fb4d80898bbfe3?s=80&d=identicon',
+ }),
+ status: null,
+ },
+ },
+ },
+ },
+};
+
+const PipelineHeaderData = {
+ body: Matchers.extractPayload(body),
+
+ success: {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json; charset=utf-8',
+ },
+ body,
+ },
+
+ request: {
+ method: 'POST',
+ path: '/api/graphql',
+ },
+
+ variables: {
+ fullPath: 'gitlab-org/gitlab-qa',
+ iid: 1,
+ },
+};
+
+export { PipelineHeaderData };
+
+/* eslint-enable @gitlab/require-i18n-strings */
diff --git a/spec/contracts/consumer/helpers/common_regex_patterns.js b/spec/contracts/consumer/helpers/common_regex_patterns.js
new file mode 100644
index 00000000000..664a71ab8a9
--- /dev/null
+++ b/spec/contracts/consumer/helpers/common_regex_patterns.js
@@ -0,0 +1,24 @@
+/**
+ * Important note: These regex patterns need to use Ruby format because the underlying Pact mock service is written in Ruby.
+ */
+export const URL = '^(http|https)://[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$';
+export const URL_PATH = '^/[a-zA-Z0-9#-=?_]+$';
+
+// Pipelines
+export const PIPELINE_GROUPS =
+ '^(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|success_warning|waiting-for-resource)$';
+export const PIPELINE_LABELS =
+ '^(canceled|created|delayed|failed|manual action|passed|pending|preparing|running|skipped|passed with warnings|waiting for resource)$';
+export const PIPELINE_SOURCES =
+ '^(push|web|trigger|schedule|api|external|pipeline|chat|webide|merge_request_event|external_pull_request_event|parent_pipeline|ondemand_dast_scan|ondemand_dast_validation)$';
+export const PIPELINE_STATUSES =
+ '^status_(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|warning)$';
+export const PIPELINE_TEXTS =
+ '^(canceled|created|delayed|failed|manual|passed|pending|preparing|running|skipped|waiting)$';
+
+// Jobs
+export const JOB_STATUSES =
+ '^(CANCELED|CREATED|FAILED|MANUAL|PENDING|PREPARING|RUNNING|SCHEDULED|SKIPPED|SUCCESS|WAITING_FOR_RESOURCE)$';
+
+// Users
+export const USER_STATES = '^(active|blocked)$';
diff --git a/spec/contracts/consumer/helpers/graphql_query_extractor.js b/spec/contracts/consumer/helpers/graphql_query_extractor.js
new file mode 100644
index 00000000000..884fa2cf528
--- /dev/null
+++ b/spec/contracts/consumer/helpers/graphql_query_extractor.js
@@ -0,0 +1,8 @@
+import { readFile } from 'fs/promises';
+import path from 'path';
+
+export async function extractGraphQLQuery(fileLocation) {
+ const file = path.resolve(__dirname, '..', '..', '..', '..', fileLocation);
+
+ return readFile(file, { encoding: 'UTF-8' });
+}
diff --git a/spec/contracts/consumer/resources/graphql/pipelines.js b/spec/contracts/consumer/resources/graphql/pipelines.js
new file mode 100644
index 00000000000..4f7ce58891c
--- /dev/null
+++ b/spec/contracts/consumer/resources/graphql/pipelines.js
@@ -0,0 +1,25 @@
+import axios from 'axios';
+
+import { extractGraphQLQuery } from '../../helpers/graphql_query_extractor';
+
+export async function getPipelineHeaderDataRequest(endpoint) {
+ const { url } = endpoint;
+ const query = await extractGraphQLQuery(
+ 'app/assets/javascripts/pipelines/graphql/queries/get_pipeline_header_data.query.graphql',
+ );
+ const graphqlQuery = {
+ query,
+ variables: {
+ fullPath: 'gitlab-org/gitlab-qa',
+ iid: 1,
+ },
+ };
+
+ return axios({
+ baseURL: url,
+ url: '/api/graphql',
+ method: 'POST',
+ headers: { Accept: '*/*' },
+ data: graphqlQuery,
+ });
+}
diff --git a/spec/contracts/consumer/specs/project/pipeline/index.spec.js b/spec/contracts/consumer/specs/project/pipeline/index.spec.js
new file mode 100644
index 00000000000..1c0358a3e28
--- /dev/null
+++ b/spec/contracts/consumer/specs/project/pipeline/index.spec.js
@@ -0,0 +1,44 @@
+/* eslint-disable @gitlab/require-i18n-strings */
+
+import { pactWith } from 'jest-pact';
+
+import { ProjectPipelines } from '../../../fixtures/project/pipeline/get_list_project_pipelines.fixture';
+import { getProjectPipelines } from '../../../endpoints/project/pipelines';
+
+const CONSUMER_NAME = 'Pipelines#index';
+const CONSUMER_LOG = '../logs/consumer.log';
+const CONTRACT_DIR = '../contracts/project/pipeline/index';
+const PROVIDER_NAME = 'GET List project pipelines';
+
+// API endpoint: /pipelines.json
+pactWith(
+ {
+ consumer: CONSUMER_NAME,
+ provider: PROVIDER_NAME,
+ log: CONSUMER_LOG,
+ dir: CONTRACT_DIR,
+ },
+
+ (provider) => {
+ describe(PROVIDER_NAME, () => {
+ beforeEach(() => {
+ const interaction = {
+ state: 'a few pipelines for a project exists',
+ ...ProjectPipelines.request,
+ willRespondWith: ProjectPipelines.success,
+ };
+ provider.addInteraction(interaction);
+ });
+
+ it('returns a successful body', () => {
+ return getProjectPipelines({
+ url: provider.mockService.baseUrl,
+ }).then((pipelines) => {
+ expect(pipelines).toEqual(ProjectPipelines.body);
+ });
+ });
+ });
+ },
+);
+
+/* eslint-enable @gitlab/require-i18n-strings */
diff --git a/spec/contracts/consumer/specs/project/pipeline/show.spec.js b/spec/contracts/consumer/specs/project/pipeline/show.spec.js
new file mode 100644
index 00000000000..0f1cc1c3108
--- /dev/null
+++ b/spec/contracts/consumer/specs/project/pipeline/show.spec.js
@@ -0,0 +1,53 @@
+/* eslint-disable @gitlab/require-i18n-strings */
+
+import { pactWith } from 'jest-pact';
+import { GraphQLInteraction } from '@pact-foundation/pact';
+
+import { extractGraphQLQuery } from '../../../helpers/graphql_query_extractor';
+
+import { PipelineHeaderData } from '../../../fixtures/project/pipeline/get_pipeline_header_data.fixture';
+import { getPipelineHeaderDataRequest } from '../../../resources/graphql/pipelines';
+
+const CONSUMER_NAME = 'Pipelines#show';
+const CONSUMER_LOG = '../logs/consumer.log';
+const CONTRACT_DIR = '../contracts/project/pipeline/show';
+const PROVIDER_NAME = 'GET pipeline header data';
+
+// GraphQL query: getPipelineHeaderData
+pactWith(
+ {
+ consumer: CONSUMER_NAME,
+ provider: PROVIDER_NAME,
+ log: CONSUMER_LOG,
+ dir: CONTRACT_DIR,
+ },
+
+ (provider) => {
+ describe(PROVIDER_NAME, () => {
+ beforeEach(async () => {
+ const query = await extractGraphQLQuery(
+ 'app/assets/javascripts/pipelines/graphql/queries/get_pipeline_header_data.query.graphql',
+ );
+ const graphqlQuery = new GraphQLInteraction()
+ .given('a pipeline for a project exists')
+ .uponReceiving('a request for the pipeline header data')
+ .withQuery(query)
+ .withRequest(PipelineHeaderData.request)
+ .withVariables(PipelineHeaderData.variables)
+ .willRespondWith(PipelineHeaderData.success);
+
+ provider.addInteraction(graphqlQuery);
+ });
+
+ it('returns a successful body', async () => {
+ const pipelineHeaderData = await getPipelineHeaderDataRequest({
+ url: provider.mockService.baseUrl,
+ });
+
+ expect(pipelineHeaderData.data).toEqual(PipelineHeaderData.body);
+ });
+ });
+ },
+);
+
+/* eslint-enable @gitlab/require-i18n-strings */
diff --git a/spec/contracts/consumer/yarn.lock b/spec/contracts/consumer/yarn.lock
new file mode 100644
index 00000000000..754541b56ae
--- /dev/null
+++ b/spec/contracts/consumer/yarn.lock
@@ -0,0 +1,4775 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.1.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
+ integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.1.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
+ integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+ dependencies:
+ "@babel/highlight" "^7.16.7"
+
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471"
+ integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==
+
+"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000"
+ integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.18.2"
+ "@babel/helper-compilation-targets" "^7.18.2"
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helpers" "^7.18.2"
+ "@babel/parser" "^7.18.5"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.18.5"
+ "@babel/types" "^7.18.4"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.1"
+ semver "^6.3.0"
+
+"@babel/generator@^7.18.2", "@babel/generator@^7.7.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d"
+ integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==
+ dependencies:
+ "@babel/types" "^7.18.2"
+ "@jridgewell/gen-mapping" "^0.3.0"
+ jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862"
+ integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b"
+ integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b"
+ integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==
+ dependencies:
+ "@babel/compat-data" "^7.17.10"
+ "@babel/helper-validator-option" "^7.16.7"
+ browserslist "^4.20.2"
+ semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19"
+ integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-member-expression-to-functions" "^7.17.7"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/helper-replace-supers" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+
+"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd"
+ integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ regexpu-core "^5.0.1"
+
+"@babel/helper-define-polyfill-provider@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665"
+ integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==
+ 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-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd"
+ integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==
+
+"@babel/helper-explode-assignable-expression@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a"
+ integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12"
+ integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-hoist-variables@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
+ integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-member-expression-to-functions@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4"
+ integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==
+ dependencies:
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
+ integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-transforms@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd"
+ integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-simple-access" "^7.17.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.18.0"
+ "@babel/types" "^7.18.0"
+
+"@babel/helper-optimise-call-expression@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2"
+ integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@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.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96"
+ integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==
+
+"@babel/helper-remap-async-to-generator@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3"
+ integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-wrap-function" "^7.16.8"
+ "@babel/types" "^7.16.8"
+
+"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0"
+ integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.2"
+ "@babel/helper-member-expression-to-functions" "^7.17.7"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/traverse" "^7.18.2"
+ "@babel/types" "^7.18.2"
+
+"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9"
+ integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==
+ dependencies:
+ "@babel/types" "^7.18.2"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09"
+ integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==
+ dependencies:
+ "@babel/types" "^7.16.0"
+
+"@babel/helper-split-export-declaration@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
+ integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-validator-identifier@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
+ integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+
+"@babel/helper-validator-option@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
+ integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
+
+"@babel/helper-wrap-function@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200"
+ integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==
+ dependencies:
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.16.8"
+ "@babel/types" "^7.16.8"
+
+"@babel/helpers@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384"
+ integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.18.2"
+ "@babel/types" "^7.18.2"
+
+"@babel/highlight@^7.16.7":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351"
+ integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.5":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c"
+ integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e"
+ integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753"
+ integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.17.12"
+
+"@babel/plugin-proposal-async-generator-functions@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03"
+ integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-remap-async-to-generator" "^7.16.8"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4"
+ integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-proposal-class-static-block@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710"
+ integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-proposal-dynamic-import@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2"
+ integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-namespace-from@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378"
+ integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664"
+ integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23"
+ integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be"
+ integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9"
+ integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8"
+ integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==
+ dependencies:
+ "@babel/compat-data" "^7.17.10"
+ "@babel/helper-compilation-targets" "^7.17.10"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.17.12"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf"
+ integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174"
+ integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c"
+ integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-proposal-private-property-in-object@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d"
+ integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d"
+ integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@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-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3":
+ 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.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@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-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-import-assertions@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd"
+ integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-syntax-import-meta@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@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-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+ 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", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+ 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":
+ 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.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b"
+ integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-arrow-functions@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45"
+ integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-async-to-generator@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832"
+ integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-remap-async-to-generator" "^7.16.8"
+
+"@babel/plugin-transform-block-scoped-functions@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620"
+ integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-block-scoping@^7.17.12":
+ version "7.18.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz#7988627b3e9186a13e4d7735dc9c34a056613fb9"
+ integrity sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-classes@^7.17.12":
+ version "7.18.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz#51310b812a090b846c784e47087fa6457baef814"
+ integrity sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-environment-visitor" "^7.18.2"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-replace-supers" "^7.18.2"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f"
+ integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-destructuring@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858"
+ integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241"
+ integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-duplicate-keys@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c"
+ integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-exponentiation-operator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b"
+ integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-for-of@^7.18.1":
+ version "7.18.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036"
+ integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-function-name@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf"
+ integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-literals@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae"
+ integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-member-expression-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384"
+ integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-modules-amd@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed"
+ integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e"
+ integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-simple-access" "^7.18.2"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.18.0":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz#87f11c44fbfd3657be000d4897e192d9cb535996"
+ integrity sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f"
+ integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931"
+ integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-new-target@^7.17.12":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz#8c228c4a07501dd12c95c5f23d1622131cc23931"
+ integrity sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-object-super@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94"
+ integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-replace-supers" "^7.16.7"
+
+"@babel/plugin-transform-parameters@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766"
+ integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-property-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55"
+ integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-regenerator@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5"
+ integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ regenerator-transform "^0.15.0"
+
+"@babel/plugin-transform-reserved-words@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f"
+ integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-shorthand-properties@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a"
+ integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-spread@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5"
+ integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+
+"@babel/plugin-transform-sticky-regex@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660"
+ integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-template-literals@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28"
+ integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-typeof-symbol@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889"
+ integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-unicode-escapes@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3"
+ integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-unicode-regex@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2"
+ integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/preset-env@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a"
+ integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==
+ dependencies:
+ "@babel/compat-data" "^7.17.10"
+ "@babel/helper-compilation-targets" "^7.18.2"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-validator-option" "^7.16.7"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12"
+ "@babel/plugin-proposal-async-generator-functions" "^7.17.12"
+ "@babel/plugin-proposal-class-properties" "^7.17.12"
+ "@babel/plugin-proposal-class-static-block" "^7.18.0"
+ "@babel/plugin-proposal-dynamic-import" "^7.16.7"
+ "@babel/plugin-proposal-export-namespace-from" "^7.17.12"
+ "@babel/plugin-proposal-json-strings" "^7.17.12"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12"
+ "@babel/plugin-proposal-numeric-separator" "^7.16.7"
+ "@babel/plugin-proposal-object-rest-spread" "^7.18.0"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
+ "@babel/plugin-proposal-optional-chaining" "^7.17.12"
+ "@babel/plugin-proposal-private-methods" "^7.17.12"
+ "@babel/plugin-proposal-private-property-in-object" "^7.17.12"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.17.12"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.17.12"
+ "@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.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-transform-arrow-functions" "^7.17.12"
+ "@babel/plugin-transform-async-to-generator" "^7.17.12"
+ "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
+ "@babel/plugin-transform-block-scoping" "^7.17.12"
+ "@babel/plugin-transform-classes" "^7.17.12"
+ "@babel/plugin-transform-computed-properties" "^7.17.12"
+ "@babel/plugin-transform-destructuring" "^7.18.0"
+ "@babel/plugin-transform-dotall-regex" "^7.16.7"
+ "@babel/plugin-transform-duplicate-keys" "^7.17.12"
+ "@babel/plugin-transform-exponentiation-operator" "^7.16.7"
+ "@babel/plugin-transform-for-of" "^7.18.1"
+ "@babel/plugin-transform-function-name" "^7.16.7"
+ "@babel/plugin-transform-literals" "^7.17.12"
+ "@babel/plugin-transform-member-expression-literals" "^7.16.7"
+ "@babel/plugin-transform-modules-amd" "^7.18.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.18.2"
+ "@babel/plugin-transform-modules-systemjs" "^7.18.0"
+ "@babel/plugin-transform-modules-umd" "^7.18.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12"
+ "@babel/plugin-transform-new-target" "^7.17.12"
+ "@babel/plugin-transform-object-super" "^7.16.7"
+ "@babel/plugin-transform-parameters" "^7.17.12"
+ "@babel/plugin-transform-property-literals" "^7.16.7"
+ "@babel/plugin-transform-regenerator" "^7.18.0"
+ "@babel/plugin-transform-reserved-words" "^7.17.12"
+ "@babel/plugin-transform-shorthand-properties" "^7.16.7"
+ "@babel/plugin-transform-spread" "^7.17.12"
+ "@babel/plugin-transform-sticky-regex" "^7.16.7"
+ "@babel/plugin-transform-template-literals" "^7.18.2"
+ "@babel/plugin-transform-typeof-symbol" "^7.17.12"
+ "@babel/plugin-transform-unicode-escapes" "^7.16.7"
+ "@babel/plugin-transform-unicode-regex" "^7.16.7"
+ "@babel/preset-modules" "^0.1.5"
+ "@babel/types" "^7.18.2"
+ babel-plugin-polyfill-corejs2 "^0.3.0"
+ babel-plugin-polyfill-corejs3 "^0.5.0"
+ babel-plugin-polyfill-regenerator "^0.3.0"
+ core-js-compat "^3.22.1"
+ semver "^6.3.0"
+
+"@babel/preset-modules@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
+ integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
+ 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/runtime@^7.8.4":
+ version "7.18.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4"
+ integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.16.7", "@babel/template@^7.3.3":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
+ integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/parser" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5", "@babel/traverse@^7.7.2":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd"
+ integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.18.2"
+ "@babel/helper-environment-visitor" "^7.18.2"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/parser" "^7.18.5"
+ "@babel/types" "^7.18.4"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.18.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354"
+ integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@hapi/bourne@^2.0.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020"
+ integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==
+
+"@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/console@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba"
+ integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+
+"@jest/core@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626"
+ integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/reporters" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^27.5.1"
+ jest-config "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-resolve-dependencies "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ jest-watcher "^27.5.1"
+ micromatch "^4.0.4"
+ rimraf "^3.0.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74"
+ integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==
+ dependencies:
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+
+"@jest/fake-timers@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74"
+ integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@sinonjs/fake-timers" "^8.0.1"
+ "@types/node" "*"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+"@jest/globals@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b"
+ integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ expect "^27.5.1"
+
+"@jest/reporters@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04"
+ integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.2"
+ graceful-fs "^4.2.9"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^5.1.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.1.3"
+ jest-haste-map "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ slash "^3.0.0"
+ source-map "^0.6.0"
+ string-length "^4.0.1"
+ terminal-link "^2.0.0"
+ v8-to-istanbul "^8.1.0"
+
+"@jest/schemas@^28.0.2":
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613"
+ integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==
+ dependencies:
+ "@sinclair/typebox" "^0.23.3"
+
+"@jest/source-map@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf"
+ integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==
+ dependencies:
+ callsites "^3.0.0"
+ graceful-fs "^4.2.9"
+ source-map "^0.6.0"
+
+"@jest/test-result@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb"
+ integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b"
+ integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-runtime "^27.5.1"
+
+"@jest/transform@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409"
+ integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==
+ dependencies:
+ "@babel/core" "^7.1.0"
+ "@jest/types" "^27.5.1"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-util "^27.5.1"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ source-map "^0.6.1"
+ write-file-atomic "^3.0.0"
+
+"@jest/transform@^28.1.1":
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.1.tgz#83541f2a3f612077c8501f49cc4e205d4e4a6b27"
+ integrity sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@jest/types" "^28.1.1"
+ "@jridgewell/trace-mapping" "^0.3.7"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^28.1.1"
+ jest-regex-util "^28.0.2"
+ jest-util "^28.1.1"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ write-file-atomic "^4.0.1"
+
+"@jest/types@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
+ integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^16.0.0"
+ chalk "^4.0.0"
+
+"@jest/types@^28.1.1":
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b"
+ integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==
+ dependencies:
+ "@jest/schemas" "^28.0.2"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^17.0.8"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
+ integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9"
+ integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe"
+ integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==
+
+"@jridgewell/set-array@^1.0.0":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea"
+ integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c"
+ integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==
+
+"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea"
+ integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@pact-foundation/pact-node@^10.17.2":
+ version "10.17.4"
+ resolved "https://registry.yarnpkg.com/@pact-foundation/pact-node/-/pact-node-10.17.4.tgz#3a36fd2fe4b37fbb79be7d2ee3d31a9154305caa"
+ integrity sha512-KnK2V0cEyCqNA/LJxVUEu1yJ0gSBBHbvflqbuTwJ5cSv5AqN8KilSTwi1QvQ7HWGScdQci0ibUX1CORyAfEwhg==
+ dependencies:
+ "@types/needle" "^2.5.1"
+ "@types/pino" "^6.3.5"
+ "@types/q" "1.0.7"
+ "@types/request" "2.48.2"
+ chalk "2.3.1"
+ check-types "7.3.0"
+ cross-spawn "^7.0.1"
+ libnpmconfig "^1.2.1"
+ mkdirp "1.0.0"
+ needle "^2.6.0"
+ pino "^6.11.0"
+ pino-pretty "^4.1.0"
+ q "1.5.1"
+ rimraf "2.6.2"
+ sumchecker "^2.0.2"
+ tar "^6.1.11"
+ underscore "1.12.1"
+ unixify "1.0.0"
+ unzipper "^0.10.10"
+ url-join "^4.0.0"
+
+"@pact-foundation/pact@^9.17.2":
+ version "9.17.3"
+ resolved "https://registry.yarnpkg.com/@pact-foundation/pact/-/pact-9.17.3.tgz#9621e23e6803385841a3ab29a4162a90b6bcac3e"
+ integrity sha512-AVcScLZsxDDKlO1AuyN7m26Z2EqIt5AA4P8cPGEkokyHf97vbbWlHOPZsgZgzxZXQRnvjNyQnyMwHR69hQ1hew==
+ dependencies:
+ "@pact-foundation/pact-node" "^10.17.2"
+ "@types/bluebird" "^3.5.20"
+ "@types/express" "^4.17.11"
+ bluebird "~3.5.1"
+ body-parser "^1.18.2"
+ cli-color "^1.1.0"
+ es6-object-assign "^1.1.0"
+ es6-promise "^4.1.1"
+ express "^4.17.1"
+ graphql "^14.0.0"
+ graphql-tag "^2.9.1"
+ http-proxy "^1.18.1"
+ lodash "^4.17.21"
+ lodash.isfunction "3.0.8"
+ lodash.isnil "4.0.0"
+ lodash.isundefined "3.0.1"
+ lodash.omit "^4.5.0"
+ lodash.omitby "4.6.0"
+ pino "^6.5.1"
+ pino-pretty "^4.1.0"
+ pkginfo "^0.4.1"
+ popsicle "^9.2.0"
+
+"@sinclair/typebox@^0.23.3":
+ version "0.23.5"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d"
+ integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^8.0.1":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7"
+ integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@tootallnate/once@1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
+ version "7.1.19"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
+ integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.6.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
+ integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
+ integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
+ version "7.17.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314"
+ integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==
+ dependencies:
+ "@babel/types" "^7.3.0"
+
+"@types/bluebird@^3.5.20":
+ version "3.5.36"
+ resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.36.tgz#00d9301d4dc35c2f6465a8aec634bb533674c652"
+ integrity sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==
+
+"@types/body-parser@*":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
+ integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
+ dependencies:
+ "@types/connect" "*"
+ "@types/node" "*"
+
+"@types/caseless@*":
+ version "0.12.2"
+ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8"
+ integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==
+
+"@types/connect@*":
+ version "3.4.35"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+ integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/express-serve-static-core@^4.17.18":
+ version "4.17.29"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c"
+ integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+
+"@types/express@^4.17.11":
+ version "4.17.13"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
+ integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.18"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3":
+ 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/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
+ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
+
+"@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.1"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
+ integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/mime@^1":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+
+"@types/needle@^2.5.1":
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/@types/needle/-/needle-2.5.3.tgz#cc64f46411b811df260171b68756e67d36890ea1"
+ integrity sha512-RwgTwMRaedfyCBe5SSWMpm1Yqzc5UPZEMw0eAd09OSyV93nLRj9/evMGZmgFeHKzUOd4xxtHvgtc+rjcBjI1Qg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*":
+ version "18.0.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
+ integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
+
+"@types/pino-pretty@*":
+ version "4.7.5"
+ resolved "https://registry.yarnpkg.com/@types/pino-pretty/-/pino-pretty-4.7.5.tgz#e4ade1e42b78b8b0c1c28010ff7eb6c439278b19"
+ integrity sha512-rfHe6VIknk14DymxGqc9maGsRe8/HQSvM2u46EAz2XrS92qsAJnW16dpdFejBuZKD8cRJX6Aw6uVZqIQctMpAg==
+ dependencies:
+ "@types/node" "*"
+ "@types/pino" "6.3"
+
+"@types/pino-std-serializers@*":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz#f8bd52a209c8b3c97d1533b1ba27f57c816382bf"
+ integrity sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/pino@6.3", "@types/pino@^6.3.5":
+ version "6.3.12"
+ resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.12.tgz#4425db6ced806109c3df957100cba9dfcd73c228"
+ integrity sha512-dsLRTq8/4UtVSpJgl9aeqHvbh6pzdmjYD3C092SYgLD2TyoCqHpTJk6vp8DvCTGGc7iowZ2MoiYiVUUCcu7muw==
+ dependencies:
+ "@types/node" "*"
+ "@types/pino-pretty" "*"
+ "@types/pino-std-serializers" "*"
+ sonic-boom "^2.1.0"
+
+"@types/prettier@^2.1.5":
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a"
+ integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==
+
+"@types/q@1.0.7":
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.0.7.tgz#afd4c610f16f6386d320e0738ec38ba7d3431917"
+ integrity sha512-0WS7XU7sXzQ7J1nbnMKKYdjrrFoO3YtZYgUzeV8JFXffPnHfvSJQleR70I8BOAsOm14i4dyaAZ3YzqIl1YhkXQ==
+
+"@types/qs@*":
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+ integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/range-parser@*":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
+
+"@types/request@2.48.2":
+ version "2.48.2"
+ resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.2.tgz#936374cbe1179d7ed529fc02543deb4597450fed"
+ integrity sha512-gP+PSFXAXMrd5PcD7SqHeUjdGshAI8vKQ3+AvpQr3ht9iQea+59LOKvKITcQI+Lg+1EIkDP6AFSBUJPWG8GDyA==
+ dependencies:
+ "@types/caseless" "*"
+ "@types/node" "*"
+ "@types/tough-cookie" "*"
+ form-data "^2.5.0"
+
+"@types/serve-static@*":
+ version "1.13.10"
+ resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
+ integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
+ dependencies:
+ "@types/mime" "^1"
+ "@types/node" "*"
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
+ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+
+"@types/tough-cookie@*":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397"
+ integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==
+
+"@types/yargs-parser@*":
+ version "21.0.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
+ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
+
+"@types/yargs@^16.0.0":
+ version "16.0.4"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977"
+ integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@types/yargs@^17.0.8":
+ version "17.0.10"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a"
+ integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+abab@^2.0.3, abab@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
+ integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-globals@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+ integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+
+acorn-walk@^7.1.1:
+ 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@^7.1.1:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.2.4:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+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.0.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-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+anymatch@^3.0.3:
+ 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"
+
+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"
+
+args@^5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/args/-/args-5.0.3.tgz#943256db85021a85684be2f0882f25d796278702"
+ integrity sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==
+ dependencies:
+ camelcase "5.0.0"
+ chalk "2.4.2"
+ leven "2.1.0"
+ mri "1.1.4"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+atomic-sleep@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b"
+ integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==
+
+axios@^0.26.0:
+ version "0.26.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
+ integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
+ dependencies:
+ follow-redirects "^1.14.8"
+
+babel-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444"
+ integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==
+ dependencies:
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+babel-jest@^28.1.1:
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.1.tgz#2a3a4ae50964695b2d694ccffe4bec537c5a3586"
+ integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw==
+ dependencies:
+ "@jest/transform" "^28.1.1"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^28.1.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+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-istanbul@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^5.0.4"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e"
+ integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.0.0"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-plugin-jest-hoist@^28.1.1:
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11"
+ integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.1.14"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-plugin-polyfill-corejs2@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
+ integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
+ dependencies:
+ "@babel/compat-data" "^7.13.11"
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+ semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
+ integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+ core-js-compat "^3.21.0"
+
+babel-plugin-polyfill-regenerator@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
+ integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+
+babel-preset-current-node-syntax@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
+ integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.8.3"
+ "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@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-top-level-await" "^7.8.3"
+
+babel-preset-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81"
+ integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==
+ dependencies:
+ babel-plugin-jest-hoist "^27.5.1"
+ babel-preset-current-node-syntax "^1.0.0"
+
+babel-preset-jest@^28.1.1:
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4"
+ integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g==
+ dependencies:
+ babel-plugin-jest-hoist "^28.1.1"
+ babel-preset-current-node-syntax "^1.0.0"
+
+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==
+
+big-integer@^1.6.17:
+ version "1.6.51"
+ resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
+ integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
+
+binary@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79"
+ integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==
+ dependencies:
+ buffers "~0.1.1"
+ chainsaw "~0.1.0"
+
+bluebird@~3.4.1:
+ version "3.4.7"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
+ integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==
+
+bluebird@~3.5.1:
+ version "3.5.5"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
+ integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
+
+body-parser@1.20.0, body-parser@^1.18.2:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"
+ integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.10.3"
+ raw-body "2.5.1"
+ type-is "~1.6.18"
+ unpipe "1.0.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@^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"
+
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
+browserslist@^4.20.2, browserslist@^4.20.4:
+ version "4.20.4"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477"
+ integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==
+ dependencies:
+ caniuse-lite "^1.0.30001349"
+ electron-to-chromium "^1.4.147"
+ escalade "^3.1.1"
+ node-releases "^2.0.5"
+ picocolors "^1.0.0"
+
+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.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-indexof-polyfill@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c"
+ integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==
+
+buffers@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
+ integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind@^1.0.0:
+ 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"
+
+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==
+
+camelcase@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
+ integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
+
+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==
+
+camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001349:
+ version "1.0.30001355"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001355.tgz#e240b7177443ed0198c737a7f609536976701c77"
+ integrity sha512-Sd6pjJHF27LzCB7pT7qs+kuX2ndurzCzkpJl6Qct7LPSZ9jn0bkOA8mdgMgmqnQAWLVOOGjLpc+66V57eLtb1g==
+
+chainsaw@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
+ integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==
+ dependencies:
+ traverse ">=0.3.0 <0.4"
+
+chalk@2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796"
+ integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==
+ dependencies:
+ ansi-styles "^3.2.0"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.2.0"
+
+chalk@2.4.2, chalk@^2.0.0:
+ 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@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+check-types@7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.3.0.tgz#468f571a4435c24248f5fd0cb0e8d87c3c341e7d"
+ integrity sha512-bzDMlwEIZFtyK70RHwQhMCvXpPyJZgOCCKlvH9oAJz4quUQse8ZynYE5RQzKpY7b5PoL6G+jQMcZzUPD4p6tFg==
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+ci-info@^3.2.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128"
+ integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==
+
+cjs-module-lexer@^1.0.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
+ integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
+
+cli-color@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f"
+ integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==
+ dependencies:
+ ansi-regex "^2.1.1"
+ d "1"
+ es5-ext "^0.10.46"
+ es6-iterator "^2.0.3"
+ memoizee "^0.4.14"
+ timers-ext "^0.1.5"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
+ integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
+
+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 sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+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==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8:
+ 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"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concat-stream@^1.4.7:
+ 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"
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+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.6.0, convert-source-map@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ 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 sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
+ integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+
+core-js-compat@^3.21.0, core-js-compat@^3.22.1:
+ version "3.23.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.1.tgz#23d44d9f209086e60dabf9130cea7719af6e199b"
+ integrity sha512-KeYrEc8t6FJsKYB2qnDwRHWaC0cJNaqlHfCpMe5q3j/W1nje3moib/txNklddLPCtGb+etcBIyJ8zuMa/LN5/A==
+ dependencies:
+ browserslist "^4.20.4"
+ semver "7.0.0"
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cross-spawn@^7.0.1, 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"
+
+cssom@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+ integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+
+cssom@~0.3.6:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+ dependencies:
+ cssom "~0.3.6"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+data-urls@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+ integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+ dependencies:
+ abab "^2.0.3"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.0.0"
+
+dateformat@^4.5.1:
+ version "4.6.3"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5"
+ integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==
+
+debug@2.6.9, debug@^2.2.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@4, debug@^4.1.0, debug@^4.1.1:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^3.2.6:
+ 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"
+
+decimal.js@^10.2.1:
+ version "10.3.1"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
+ integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+ integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==
+
+deep-is@~0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+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.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
+ integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.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 sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
+domexception@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+ integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+ dependencies:
+ webidl-conversions "^5.0.0"
+
+duplexer2@~0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+ integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==
+ dependencies:
+ readable-stream "^2.0.2"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+electron-to-chromium@^1.4.147:
+ version "1.4.159"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.159.tgz#458f8c36736680f0369adc0d9ea601f1f2da06cd"
+ integrity sha512-D0NfhJzv5GgN3L7bzy5VUD90yKXnNFdCy+fH6jox+5UyJJSFmDC2d1mUxc9yi3bpTaOA1MJ6BkuVjn+GZTaZwg==
+
+emittery@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860"
+ integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==
+
+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==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+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"
+
+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"
+
+es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
+ version "0.10.61"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269"
+ integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-object-assign@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
+ integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==
+
+es6-promise@^4.1.1:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+es6-weak-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
+ integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.46"
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.1"
+
+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 sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+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 sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+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==
+
+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"
+
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+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 sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+event-emitter@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+eventemitter3@^4.0.0:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
+
+expect@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74"
+ integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+
+express@^4.17.1:
+ version "4.18.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
+ integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.0"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.5.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.2.0"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.7"
+ qs "6.10.3"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.18.0"
+ serve-static "1.15.0"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+ext@^1.1.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
+ integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
+ dependencies:
+ type "^2.5.0"
+
+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 sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-redact@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.1.tgz#790fcff8f808c2e12fabbfb2be5cb2deda448fa0"
+ integrity sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A==
+
+fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.0.8:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
+ integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
+
+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==
+
+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.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.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@^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"
+
+flatstr@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931"
+ integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==
+
+follow-redirects@^1.0.0, follow-redirects@^1.14.8:
+ version "1.15.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
+ integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
+
+form-data@^2.0.0, form-data@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
+ integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+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"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+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.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@^2.3.2:
+ 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.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==
+
+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.5:
+ 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.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
+ integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.3"
+
+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-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+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==
+
+graceful-fs@^4.1.2, graceful-fs@^4.2.2, graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+graphql-tag@^2.9.1:
+ version "2.12.6"
+ resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1"
+ integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==
+ dependencies:
+ tslib "^2.1.0"
+
+graphql@^14.0.0:
+ version "14.7.0"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72"
+ integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==
+ dependencies:
+ iterall "^1.2.2"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+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-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-symbols@^1.0.1, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+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"
+
+html-encoding-sniffer@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+ integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+ dependencies:
+ whatwg-encoding "^1.0.5"
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-proxy-agent@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+ integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+ dependencies:
+ "@tootallnate/once" "1"
+ agent-base "6"
+ debug "4"
+
+http-proxy@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+ integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+ dependencies:
+ eventemitter3 "^4.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+iconv-lite@0.4.24, iconv-lite@^0.4.4:
+ 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"
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.0, 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==
+
+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==
+
+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-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-core-module@^2.8.1:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
+ dependencies:
+ has "^1.0.3"
+
+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-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
+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-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+is-promise@^2.2.2:
+ 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-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
+ integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
+
+istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f"
+ integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==
+ dependencies:
+ "@babel/core" "^7.12.3"
+ "@babel/parser" "^7.14.7"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^6.3.0"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
+ integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^3.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c"
+ integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+iterall@^1.2.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
+ integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
+
+jest-changed-files@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5"
+ integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ execa "^5.0.0"
+ throat "^6.0.1"
+
+jest-circus@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc"
+ integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ dedent "^0.7.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+ throat "^6.0.1"
+
+jest-cli@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145"
+ integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ import-local "^3.0.2"
+ jest-config "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ prompts "^2.0.1"
+ yargs "^16.2.0"
+
+jest-config@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41"
+ integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==
+ dependencies:
+ "@babel/core" "^7.8.0"
+ "@jest/test-sequencer" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ babel-jest "^27.5.1"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.1"
+ graceful-fs "^4.2.9"
+ jest-circus "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-jasmine2 "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ micromatch "^4.0.4"
+ parse-json "^5.2.0"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-docblock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0"
+ integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e"
+ integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-environment-jsdom@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546"
+ integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+ jsdom "^16.6.0"
+
+jest-environment-node@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e"
+ integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-haste-map@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
+ integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/graceful-fs" "^4.1.2"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^27.5.1"
+ jest-serializer "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ micromatch "^4.0.4"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-haste-map@^28.1.1:
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3"
+ integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ==
+ dependencies:
+ "@jest/types" "^28.1.1"
+ "@types/graceful-fs" "^4.1.3"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^28.0.2"
+ jest-util "^28.1.1"
+ jest-worker "^28.1.1"
+ micromatch "^4.0.4"
+ walker "^1.0.8"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-jasmine2@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4"
+ integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ throat "^6.0.1"
+
+jest-leak-detector@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8"
+ integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==
+ dependencies:
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-matcher-utils@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-message-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
+ integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^27.5.1"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-mock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6"
+ integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+
+jest-pact@^0.9.1:
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/jest-pact/-/jest-pact-0.9.4.tgz#c13f3d28cbe6288bbb0920e6b69857a9e1a042e9"
+ integrity sha512-vmBISe3DSGxOuMnjJJHdK0winrkBSpgD/Z3iMCaBUBBYG9bSPsBfGqBzAF0eYLGmQ7yUaoYlI798e515DGnzQw==
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
+ integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
+
+jest-regex-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
+ integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==
+
+jest-regex-util@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead"
+ integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==
+
+jest-resolve-dependencies@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8"
+ integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-snapshot "^27.5.1"
+
+jest-resolve@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384"
+ integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ resolve "^1.20.0"
+ resolve.exports "^1.1.0"
+ slash "^3.0.0"
+
+jest-runner@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5"
+ integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ graceful-fs "^4.2.9"
+ jest-docblock "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-leak-detector "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ source-map-support "^0.5.6"
+ throat "^6.0.1"
+
+jest-runtime@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af"
+ integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/globals" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ cjs-module-lexer "^1.0.0"
+ collect-v8-coverage "^1.0.0"
+ execa "^5.0.0"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-serializer@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64"
+ integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==
+ dependencies:
+ "@types/node" "*"
+ graceful-fs "^4.2.9"
+
+jest-snapshot@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1"
+ integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==
+ dependencies:
+ "@babel/core" "^7.7.2"
+ "@babel/generator" "^7.7.2"
+ "@babel/plugin-syntax-typescript" "^7.7.2"
+ "@babel/traverse" "^7.7.2"
+ "@babel/types" "^7.0.0"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/babel__traverse" "^7.0.4"
+ "@types/prettier" "^2.1.5"
+ babel-preset-current-node-syntax "^1.0.0"
+ chalk "^4.0.0"
+ expect "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ natural-compare "^1.4.0"
+ pretty-format "^27.5.1"
+ semver "^7.3.2"
+
+jest-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
+ integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-util@^28.1.1:
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05"
+ integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==
+ dependencies:
+ "@jest/types" "^28.1.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-validate@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067"
+ integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ camelcase "^6.2.0"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ leven "^3.1.0"
+ pretty-format "^27.5.1"
+
+jest-watcher@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2"
+ integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ jest-util "^27.5.1"
+ string-length "^4.0.1"
+
+jest-worker@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest-worker@^28.1.1:
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28"
+ integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc"
+ integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ import-local "^3.0.2"
+ jest-cli "^27.5.1"
+
+jmespath@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217"
+ integrity sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==
+
+joycon@^2.2.5:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615"
+ integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==
+
+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"
+
+jsdom@^16.6.0:
+ version "16.7.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
+ integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+ dependencies:
+ abab "^2.0.5"
+ acorn "^8.2.4"
+ acorn-globals "^6.0.0"
+ cssom "^0.4.4"
+ cssstyle "^2.3.0"
+ data-urls "^2.0.0"
+ decimal.js "^10.2.1"
+ domexception "^2.0.1"
+ escodegen "^2.0.0"
+ form-data "^3.0.0"
+ html-encoding-sniffer "^2.0.1"
+ http-proxy-agent "^4.0.1"
+ https-proxy-agent "^5.0.0"
+ is-potential-custom-element-name "^1.0.1"
+ nwsapi "^2.2.0"
+ parse5 "6.0.1"
+ saxes "^5.0.1"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.0.0"
+ w3c-hr-time "^1.0.2"
+ w3c-xmlserializer "^2.0.0"
+ webidl-conversions "^6.1.0"
+ whatwg-encoding "^1.0.5"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.5.0"
+ ws "^7.4.6"
+ xml-name-validator "^3.0.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 sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+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==
+
+json5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+
+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==
+
+leven@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+ integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+libnpmconfig@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0"
+ integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==
+ dependencies:
+ figgy-pudding "^3.5.1"
+ find-up "^3.0.0"
+ ini "^1.3.5"
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+listenercount@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937"
+ integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==
+
+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"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.isfunction@3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz#4db709fc81bc4a8fd7127a458a5346c5cdce2c6b"
+ integrity sha512-WQj3vccQSW5IKeRl8F0bezPlZH5/LFXtNPICsbZLsv+HmVfWAfrzy2ZajGqmNLonIjPIcPOk3uXOGv5jgPgTyg==
+
+lodash.isnil@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz#49e28cd559013458c814c5479d3c663a21bfaa6c"
+ integrity sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==
+
+lodash.isundefined@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48"
+ integrity sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==
+
+lodash.omit@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60"
+ integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==
+
+lodash.omitby@4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.omitby/-/lodash.omitby-4.6.0.tgz#5c15ff4754ad555016b53c041311e8f079204791"
+ integrity sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==
+
+lodash@^4.17.21, lodash@^4.7.0:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+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"
+
+lru-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+ integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==
+ dependencies:
+ es5-ext "~0.10.2"
+
+make-dir@^3.0.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"
+
+make-error-cause@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d"
+ integrity sha512-4TO2Y3HkBnis4c0dxhAgD/jprySYLACf7nwN6V0HAHDx59g12WlRpUmFy1bRHamjGUEEBrEvCq6SUpsEE2lhUg==
+ dependencies:
+ make-error "^1.2.0"
+
+make-error@^1.2.0:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memoizee@^0.4.14:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72"
+ integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.53"
+ es6-weak-map "^2.0.3"
+ event-emitter "^0.3.5"
+ is-promise "^2.2.2"
+ lru-queue "^0.1.0"
+ next-tick "^1.1.0"
+ timers-ext "^0.1.7"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
+
+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==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.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==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+minimatch@^3.0.4, minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+minipass@^3.0.0:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
+ integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
+ 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"
+
+mkdirp@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.0.tgz#8487b07699b70c9b06fce47b3ce28d8176c13c75"
+ integrity sha512-4Pb+8NJ5DdvaWD797hKOM28wMXsObb4HppQdIwKUHFiB69ICZ4wktOE+qsGGBy7GtwgYNizp0R9KEy4zKYBLMg==
+
+"mkdirp@>=0.5 0":
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+mkdirp@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mri@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a"
+ integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+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.3, 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==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+needle@^2.6.0:
+ version "2.9.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684"
+ integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==
+ dependencies:
+ debug "^3.2.6"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+next-tick@1, next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
+
+node-releases@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666"
+ integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+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==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nwsapi@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+ integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+
+object-inspect@^1.9.0:
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
+ integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
+
+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.assign@^4.1.0:
+ 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"
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ 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 sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+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"
+
+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-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-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==
+
+parse-json@^5.2.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"
+
+parse5@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+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==
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+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 sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.0.0, 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.7:
+ 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 sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pino-pretty@^4.1.0:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.8.0.tgz#f2f3055bf222456217b14ffb04d8be0a0cc17fce"
+ integrity sha512-mhQfHG4rw5ZFpWL44m0Utjo4GC2+HMfdNvxyA8lLw0sIqn6fCf7uQe6dPckUcW/obly+OQHD7B/MTso6LNizYw==
+ dependencies:
+ "@hapi/bourne" "^2.0.0"
+ args "^5.0.1"
+ chalk "^4.0.0"
+ dateformat "^4.5.1"
+ fast-safe-stringify "^2.0.7"
+ jmespath "^0.15.0"
+ joycon "^2.2.5"
+ pump "^3.0.0"
+ readable-stream "^3.6.0"
+ rfdc "^1.3.0"
+ split2 "^3.1.1"
+ strip-json-comments "^3.1.1"
+
+pino-std-serializers@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671"
+ integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==
+
+pino@^6.11.0, pino@^6.5.1:
+ version "6.14.0"
+ resolved "https://registry.yarnpkg.com/pino/-/pino-6.14.0.tgz#b745ea87a99a6c4c9b374e4f29ca7910d4c69f78"
+ integrity sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==
+ dependencies:
+ fast-redact "^3.0.0"
+ fast-safe-stringify "^2.0.8"
+ flatstr "^1.0.12"
+ pino-std-serializers "^3.1.0"
+ process-warning "^1.0.0"
+ quick-format-unescaped "^4.0.3"
+ sonic-boom "^1.0.2"
+
+pirates@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
+ integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
+
+pkg-dir@^4.2.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"
+
+pkginfo@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
+ integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==
+
+popsicle@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/popsicle/-/popsicle-9.2.0.tgz#adc9fc808644739b360ff063426545cdfe58e0b4"
+ integrity sha512-petRj39w05GvH1WKuGFmzxR9+k+R9E7zX5XWTFee7P/qf88hMuLT7aAO/RsmldpQMtJsWQISkTQlfMRECKlxhw==
+ dependencies:
+ concat-stream "^1.4.7"
+ form-data "^2.0.0"
+ make-error-cause "^1.2.1"
+ tough-cookie "^2.0.0"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
+
+prettier@^2.5.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
+ integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
+
+pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+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-warning@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616"
+ integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==
+
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+psl@^1.1.28, psl@^1.1.33:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+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"
+
+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==
+
+q@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
+
+qs@6.10.3:
+ version "6.10.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
+ integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+ dependencies:
+ side-channel "^1.0.4"
+
+quick-format-unescaped@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7"
+ integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==
+
+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.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
+ integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+react-is@^17.0.1:
+ 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==
+
+readable-stream@^2.0.2, readable-stream@^2.2.2, 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.0.0, 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"
+
+regenerate-unicode-properties@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
+ integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==
+ dependencies:
+ regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+ 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:
+ version "0.13.9"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+regenerator-transform@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
+ integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regexpu-core@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3"
+ integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==
+ dependencies:
+ regenerate "^1.4.2"
+ regenerate-unicode-properties "^10.0.1"
+ regjsgen "^0.6.0"
+ regjsparser "^0.8.2"
+ unicode-match-property-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.0.0"
+
+regjsgen@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d"
+ integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==
+
+regjsparser@^0.8.2:
+ version "0.8.4"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f"
+ integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==
+ dependencies:
+ jsesc "~0.5.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 sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+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.exports@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9"
+ integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==
+
+resolve@^1.14.2, resolve@^1.20.0:
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
+ integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+ dependencies:
+ is-core-module "^2.8.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rfdc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
+ integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
+
+rimraf@2:
+ 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@2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@^3.0.0:
+ 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"
+
+safe-buffer@5.2.1, 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-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==
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+saxes@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+ integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+ dependencies:
+ xmlchars "^2.2.0"
+
+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:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ dependencies:
+ lru-cache "^6.0.0"
+
+send@0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serve-static@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.18.0"
+
+setimmediate@~1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+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@^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==
+
+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.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+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@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+sonic-boom@^1.0.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e"
+ integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==
+ dependencies:
+ atomic-sleep "^1.0.0"
+ flatstr "^1.0.12"
+
+sonic-boom@^2.1.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611"
+ integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==
+ dependencies:
+ atomic-sleep "^1.0.0"
+
+source-map-support@^0.5.6:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@^0.6.1, 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.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
+ integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
+split2@^3.1.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
+ integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
+ dependencies:
+ readable-stream "^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 sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stack-utils@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
+ integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+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.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+sumchecker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e"
+ integrity sha512-16O54scwFPgX60Of/+QJSufmklGqnHZyBK6uewBvtcp3VxT5RM65c/OnGCeEPnjBF8TJoO5Pf6gHAOXfxIjNpA==
+ dependencies:
+ debug "^2.2.0"
+
+supports-color@^5.2.0, supports-color@^5.3.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@^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"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-hyperlinks@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
+ integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+tar@^6.1.11:
+ version "6.1.11"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
+ integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
+ 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"
+
+terminal-link@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
+ integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ supports-hyperlinks "^2.0.0"
+
+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"
+
+throat@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375"
+ integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==
+
+timers-ext@^0.1.5, timers-ext@^0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
+ integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
+ dependencies:
+ es5-ext "~0.10.46"
+ next-tick "1"
+
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+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 sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+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"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tough-cookie@^2.0.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"
+
+tough-cookie@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+ integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.1.2"
+
+tr46@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240"
+ integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
+ dependencies:
+ punycode "^2.1.1"
+
+"traverse@>=0.3.0 <0.4":
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
+ integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==
+
+tslib@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+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"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.5.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
+ integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
+
+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 sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+
+unicode-match-property-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^2.0.0"
+ unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
+ integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
+ integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
+
+universalify@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unixify@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090"
+ integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==
+ dependencies:
+ normalize-path "^2.1.1"
+
+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 sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+unzipper@^0.10.10:
+ version "0.10.11"
+ resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e"
+ integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==
+ dependencies:
+ big-integer "^1.6.17"
+ binary "~0.3.0"
+ bluebird "~3.4.1"
+ buffer-indexof-polyfill "~1.0.0"
+ duplexer2 "~0.1.4"
+ fstream "^1.0.12"
+ graceful-fs "^4.2.2"
+ listenercount "~1.0.1"
+ readable-stream "~2.3.6"
+ setimmediate "~1.0.4"
+
+url-join@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7"
+ integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+v8-to-istanbul@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed"
+ integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^1.6.0"
+ source-map "^0.7.3"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+w3c-hr-time@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+ dependencies:
+ browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+ integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+ dependencies:
+ xml-name-validator "^3.0.0"
+
+walker@^1.0.7, walker@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
+webidl-conversions@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+ integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+ integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
+whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^8.0.0, whatwg-url@^8.5.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
+ integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
+ dependencies:
+ lodash "^4.7.0"
+ tr46 "^2.1.0"
+ webidl-conversions "^6.1.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"
+
+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==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+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"
+
+write-file-atomic@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
+ integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.7"
+
+ws@^7.4.6:
+ version "7.5.8"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a"
+ integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+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==
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
diff --git a/spec/contracts/contracts/project/pipeline/index/pipelines#index-get_list_project_pipelines.json b/spec/contracts/contracts/project/pipeline/index/pipelines#index-get_list_project_pipelines.json
new file mode 100644
index 00000000000..b725ae400a7
--- /dev/null
+++ b/spec/contracts/contracts/project/pipeline/index/pipelines#index-get_list_project_pipelines.json
@@ -0,0 +1,472 @@
+{
+ "consumer": {
+ "name": "Pipelines#index"
+ },
+ "provider": {
+ "name": "GET List project pipelines"
+ },
+ "interactions": [
+ {
+ "description": "a request for a list of project pipelines",
+ "providerState": "a few pipelines for a project exists",
+ "request": {
+ "method": "GET",
+ "path": "/gitlab-org/gitlab-qa/-/pipelines.json",
+ "query": "scope=all&page=1",
+ "headers": {
+ "Accept": "*/*"
+ }
+ },
+ "response": {
+ "status": 200,
+ "headers": {
+ "Content-Type": "application/json; charset=utf-8"
+ },
+ "body": {
+ "pipelines": [
+ {
+ "id": 564173401,
+ "iid": 8197225,
+ "user": {
+ "id": 1781152,
+ "username": "gitlab-bot",
+ "name": "🤖 GitLab Bot 🤖",
+ "state": "active",
+ "avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/1516152/avatar.png",
+ "web_url": "https://gitlab.com/gitlab-bot",
+ "show_status": false,
+ "path": "/gitlab-bot"
+ },
+ "active": true,
+ "source": "schedule",
+ "created_at": "2022-06-11T00:05:21.558Z",
+ "updated_at": "2022-06-11T00:05:34.258Z",
+ "path": "/gitlab-org/gitlab/-/pipelines/561224401",
+ "flags": {
+ "stuck": false,
+ "auto_devops": false,
+ "merge_request": false,
+ "yaml_errors": false,
+ "retryable": false,
+ "cancelable": false,
+ "failure_reason": false,
+ "detached_merge_request_pipeline": false,
+ "merge_request_pipeline": false,
+ "merge_train_pipeline": false,
+ "latest": true
+ },
+ "details": {
+ "status": {
+ "icon": "status_running",
+ "text": "running",
+ "label": "running",
+ "group": "running",
+ "tooltip": "passed",
+ "has_details": true,
+ "details_path": "/gitlab-org/gitlab/-/pipelines/566374401",
+ "illustration": null,
+ "favicon": "/assets/ci_favicons/favicon_status_running.png"
+ },
+ "stages": [
+ {
+ "name": "sync",
+ "title": "sync: passed",
+ "status": {
+ "icon": "status_success",
+ "text": "passed",
+ "label": "passed",
+ "group": "success",
+ "tooltip": "passed",
+ "has_details": true,
+ "details_path": "/gitlab-org/gitlab/-/pipelines/561174401#sync",
+ "illustration": null,
+ "favicon": "/assets/ci_favicons/favicon_status_success.png"
+ },
+ "path": "/gitlab-org/gitlab/-/pipelines/561124401#sync",
+ "dropdown_path": "/gitlab-org/gitlab/-/pipelines/561174401/stage.json?stage=sync"
+ }
+ ],
+ "duration": 25,
+ "finished_at": "2022-06-11T00:55:21.558Z",
+ "name": "Pipeline",
+ "manual_actions": [
+ {
+ "name": "review-docs-deploy",
+ "playable": true,
+ "scheduled": false
+ }
+ ],
+ "scheduled_actions": [
+ {
+ "name": "review-docs-schedule",
+ "playable": true,
+ "scheduled": false
+ }
+ ]
+ },
+ "ref": {
+ "name": "master",
+ "path": "/gitlab-org/gitlab/-/commits/master",
+ "tag": false,
+ "branch": true,
+ "merge_request": false
+ },
+ "commit": {
+ "id": "e6d797385144b955c6d4ecfa00e9656dc33efd2b",
+ "short_id": "e6d79738",
+ "created_at": "2022-06-10T22:02:10.000+00:00",
+ "parent_ids": [
+ "3b0e053a24958174eaa7e3b183c7263432890d1c"
+ ],
+ "title": "Merge branch 'ee-test' into 'master'",
+ "message": "Merge branch 'ee-test' into 'master'\nThis is a test.",
+ "author_name": "John Doe",
+ "author_email": "jdoe@gitlab.com",
+ "authored_date": "2022-06-10T22:02:10.000+00:00",
+ "committer_name": "John Doe",
+ "committer_email": "jdoe@gitlab.com",
+ "committed_date": "2022-06-10T22:02:10.000+00:00",
+ "trailers": {
+ },
+ "web_url": "https://gitlab.com/gitlab-org/gitlab/-/commit/f559253c514d9ab707c66e",
+ "author": null,
+ "author_gravatar_url": "https://secure.gravatar.com/avatar/d85e45af29611ac2c1395e3c3d6ec5d6?s=80&d=identicon",
+ "commit_url": "https://gitlab.com/gitlab-org/gitlab/-/commit/dc7522f559253c514d9ab707c66e7a1026abca5a",
+ "commit_path": "/gitlab-org/gitlab/-/commit/dc7522f559253c514d9ab707c66e7a1026abca5a"
+ },
+ "project": {
+ "id": 253964,
+ "name": "GitLab",
+ "full_path": "/gitlab-org/gitlab",
+ "full_name": "GitLab.org / GitLab"
+ },
+ "triggered_by": null,
+ "triggered": [
+
+ ]
+ }
+ ],
+ "count": {
+ "all": "1,000+"
+ }
+ },
+ "matchingRules": {
+ "$.body.pipelines": {
+ "min": 1
+ },
+ "$.body.pipelines[*].*": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].id": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].iid": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].user.id": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].user.username": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].user.name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].user.state": {
+ "match": "regex",
+ "regex": "^(active|blocked)$"
+ },
+ "$.body.pipelines[*].user.avatar_url": {
+ "match": "regex",
+ "regex": "^(http|https):\\/\\/[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$"
+ },
+ "$.body.pipelines[*].user.web_url": {
+ "match": "regex",
+ "regex": "^(http|https):\\/\\/[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$"
+ },
+ "$.body.pipelines[*].user.show_status": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].user.path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].active": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].source": {
+ "match": "regex",
+ "regex": "^(push|web|trigger|schedule|api|external|pipeline|chat|webide|merge_request_event|external_pull_request_event|parent_pipeline|ondemand_dast_scan|ondemand_dast_validation)$"
+ },
+ "$.body.pipelines[*].created_at": {
+ "match": "regex",
+ "regex": "^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d(:?[0-5]\\d)?|Z)$"
+ },
+ "$.body.pipelines[*].updated_at": {
+ "match": "regex",
+ "regex": "^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d(:?[0-5]\\d)?|Z)$"
+ },
+ "$.body.pipelines[*].path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].flags.stuck": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.auto_devops": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.merge_request": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.yaml_errors": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.retryable": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.cancelable": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.failure_reason": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.detached_merge_request_pipeline": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.merge_request_pipeline": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.merge_train_pipeline": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].flags.latest": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.status.icon": {
+ "match": "regex",
+ "regex": "^status_(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|warning)$"
+ },
+ "$.body.pipelines[*].details.status.text": {
+ "match": "regex",
+ "regex": "^(canceled|created|delayed|failed|manual|passed|pending|preparing|running|skipped|waiting)$"
+ },
+ "$.body.pipelines[*].details.status.label": {
+ "match": "regex",
+ "regex": "^(canceled|created|delayed|failed|manual action|passed|pending|preparing|running|skipped|passed with warnings|waiting for resource)$"
+ },
+ "$.body.pipelines[*].details.status.group": {
+ "match": "regex",
+ "regex": "^(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|success_warning|waiting-for-resource)$"
+ },
+ "$.body.pipelines[*].details.status.tooltip": {
+ "match": "regex",
+ "regex": "^(canceled|created|delayed|failed|manual action|passed|pending|preparing|running|skipped|passed with warnings|waiting for resource)$"
+ },
+ "$.body.pipelines[*].details.status.has_details": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.status.details_path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].details.status.favicon": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].details.stages": {
+ "min": 1
+ },
+ "$.body.pipelines[*].details.stages[*].*": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.stages[*].name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.stages[*].title": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.stages[*].status.icon": {
+ "match": "regex",
+ "regex": "^status_(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|warning)$"
+ },
+ "$.body.pipelines[*].details.stages[*].status.text": {
+ "match": "regex",
+ "regex": "^(canceled|created|delayed|failed|manual|passed|pending|preparing|running|skipped|waiting)$"
+ },
+ "$.body.pipelines[*].details.stages[*].status.label": {
+ "match": "regex",
+ "regex": "^(canceled|created|delayed|failed|manual action|passed|pending|preparing|running|skipped|passed with warnings|waiting for resource)$"
+ },
+ "$.body.pipelines[*].details.stages[*].status.group": {
+ "match": "regex",
+ "regex": "^(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|success_warning|waiting-for-resource)$"
+ },
+ "$.body.pipelines[*].details.stages[*].status.tooltip": {
+ "match": "regex",
+ "regex": "^(canceled|created|delayed|failed|manual action|passed|pending|preparing|running|skipped|passed with warnings|waiting for resource)$"
+ },
+ "$.body.pipelines[*].details.stages[*].status.has_details": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.stages[*].status.details_path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].details.stages[*].status.favicon": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].details.stages[*].path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].details.stages[*].dropdown_path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].details.duration": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.finished_at": {
+ "match": "regex",
+ "regex": "^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d(:?[0-5]\\d)?|Z)$"
+ },
+ "$.body.pipelines[*].details.name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.manual_actions": {
+ "min": 1
+ },
+ "$.body.pipelines[*].details.manual_actions[*].*": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.manual_actions[*].name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.manual_actions[*].playable": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.manual_actions[*].scheduled": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.scheduled_actions": {
+ "min": 1
+ },
+ "$.body.pipelines[*].details.scheduled_actions[*].*": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.scheduled_actions[*].name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.scheduled_actions[*].playable": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].details.scheduled_actions[*].scheduled": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].ref.name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].ref.path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].ref.tag": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].ref.branch": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].ref.merge_request": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.id": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.short_id": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.created_at": {
+ "match": "regex",
+ "regex": "^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d(:?[0-5]\\d)?|Z)$"
+ },
+ "$.body.pipelines[*].commit.parent_ids": {
+ "min": 1
+ },
+ "$.body.pipelines[*].commit.parent_ids[*].*": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.parent_ids[*]": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.title": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.message": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.author_name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.author_email": {
+ "match": "regex",
+ "regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$"
+ },
+ "$.body.pipelines[*].commit.authored_date": {
+ "match": "regex",
+ "regex": "^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d(:?[0-5]\\d)?|Z)$"
+ },
+ "$.body.pipelines[*].commit.committer_name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].commit.committer_email": {
+ "match": "regex",
+ "regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$"
+ },
+ "$.body.pipelines[*].commit.committed_date": {
+ "match": "regex",
+ "regex": "^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d(:?[0-5]\\d)?|Z)$"
+ },
+ "$.body.pipelines[*].commit.web_url": {
+ "match": "regex",
+ "regex": "^(http|https):\\/\\/[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$"
+ },
+ "$.body.pipelines[*].commit.author_gravatar_url": {
+ "match": "regex",
+ "regex": "^(http|https):\\/\\/[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$"
+ },
+ "$.body.pipelines[*].commit.commit_url": {
+ "match": "regex",
+ "regex": "^(http|https):\\/\\/[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$"
+ },
+ "$.body.pipelines[*].commit.commit_path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].project.id": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].project.name": {
+ "match": "type"
+ },
+ "$.body.pipelines[*].project.full_path": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.pipelines[*].project.full_name": {
+ "match": "type"
+ },
+ "$.body.count.all": {
+ "match": "type"
+ }
+ }
+ }
+ }
+ ],
+ "metadata": {
+ "pactSpecification": {
+ "version": "2.0.0"
+ }
+ }
+} \ No newline at end of file
diff --git a/spec/contracts/contracts/project/pipeline/show/pipelines#show-get_pipeline_header_data.json b/spec/contracts/contracts/project/pipeline/show/pipelines#show-get_pipeline_header_data.json
new file mode 100644
index 00000000000..2d775dc0f61
--- /dev/null
+++ b/spec/contracts/contracts/project/pipeline/show/pipelines#show-get_pipeline_header_data.json
@@ -0,0 +1,152 @@
+{
+ "consumer": {
+ "name": "Pipelines#show"
+ },
+ "provider": {
+ "name": "GET pipeline header data"
+ },
+ "interactions": [
+ {
+ "description": "a request for the pipeline header data",
+ "providerState": "a pipeline for a project exists",
+ "request": {
+ "method": "POST",
+ "path": "/api/graphql",
+ "headers": {
+ "content-type": "application/json"
+ },
+ "body": {
+ "query": "query getPipelineHeaderData($fullPath: ID!, $iid: ID!) {\n project(fullPath: $fullPath) {\n id\n pipeline(iid: $iid) {\n id\n iid\n status\n retryable\n cancelable\n userPermissions {\n destroyPipeline\n updatePipeline\n }\n detailedStatus {\n id\n detailsPath\n icon\n group\n text\n }\n createdAt\n user {\n id\n name\n username\n webPath\n webUrl\n email\n avatarUrl\n status {\n message\n emoji\n }\n }\n }\n }\n}\n",
+ "variables": {
+ "fullPath": "gitlab-org/gitlab-qa",
+ "iid": 1
+ }
+ },
+ "matchingRules": {
+ "$.body.query": {
+ "match": "regex",
+ "regex": "query\\s*getPipelineHeaderData\\(\\$fullPath:\\s*ID!,\\s*\\$iid:\\s*ID!\\)\\s*\\{\\s*project\\(fullPath:\\s*\\$fullPath\\)\\s*\\{\\s*id\\s*pipeline\\(iid:\\s*\\$iid\\)\\s*\\{\\s*id\\s*iid\\s*status\\s*retryable\\s*cancelable\\s*userPermissions\\s*\\{\\s*destroyPipeline\\s*updatePipeline\\s*\\}\\s*detailedStatus\\s*\\{\\s*id\\s*detailsPath\\s*icon\\s*group\\s*text\\s*\\}\\s*createdAt\\s*user\\s*\\{\\s*id\\s*name\\s*username\\s*webPath\\s*webUrl\\s*email\\s*avatarUrl\\s*status\\s*\\{\\s*message\\s*emoji\\s*\\}\\s*\\}\\s*\\}\\s*\\}\\s*\\}\\s*"
+ }
+ }
+ },
+ "response": {
+ "status": 200,
+ "headers": {
+ "Content-Type": "application/json; charset=utf-8"
+ },
+ "body": {
+ "data": {
+ "project": {
+ "id": "gid://gitlab/Project/278964",
+ "pipeline": {
+ "id": "gid://gitlab/Ci::Pipeline/577266584",
+ "iid": "1175084",
+ "status": "RUNNING",
+ "retryable": false,
+ "cancelable": true,
+ "userPermissions": {
+ "destroyPipeline": false,
+ "updatePipeline": true
+ },
+ "detailedStatus": {
+ "id": "running-577266584-577266584",
+ "detailsPath": "/gitlab-org/gitlab/-/pipelines/577266584",
+ "icon": "status_running",
+ "group": "running",
+ "text": "running"
+ },
+ "createdAt": "2022-06-30T16:58:59Z",
+ "user": {
+ "id": "gid://gitlab/User/194645",
+ "name": "John Doe",
+ "username": "jdoe",
+ "webPath": "/gitlab-bot",
+ "webUrl": "https://gitlab.com/gitlab-bot",
+ "email": null,
+ "avatarUrl": "https://www.gravatar.com/avatar/10fc7f102be8de7657fb4d80898bbfe3?s=80&d=identicon",
+ "status": null
+ }
+ }
+ }
+ }
+ },
+ "matchingRules": {
+ "$.body.data.project.id": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.id": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.iid": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.status": {
+ "match": "regex",
+ "regex": "^(CANCELED|CREATED|FAILED|MANUAL|PENDING|PREPARING|RUNNING|SCHEDULED|SKIPPED|SUCCESS|WAITING_FOR_RESOURCE)$"
+ },
+ "$.body.data.project.pipeline.retryable": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.cancelable": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.userPermissions.destroyPipeline": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.userPermissions.updatePipeline": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.detailedStatus.id": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.detailedStatus.detailsPath": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.data.project.pipeline.detailedStatus.icon": {
+ "match": "regex",
+ "regex": "^status_(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|warning)$"
+ },
+ "$.body.data.project.pipeline.detailedStatus.group": {
+ "match": "regex",
+ "regex": "^(canceled|created|failed|manual|pending|preparing|running|scheduled|skipped|success|success_warning|waiting-for-resource)$"
+ },
+ "$.body.data.project.pipeline.detailedStatus.text": {
+ "match": "regex",
+ "regex": "^(canceled|created|delayed|failed|manual|passed|pending|preparing|running|skipped|waiting)$"
+ },
+ "$.body.data.project.pipeline.createdAt": {
+ "match": "regex",
+ "regex": "^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)$"
+ },
+ "$.body.data.project.pipeline.user.id": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.user.name": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.user.username": {
+ "match": "type"
+ },
+ "$.body.data.project.pipeline.user.webPath": {
+ "match": "regex",
+ "regex": "^\\/[a-zA-Z0-9#-=?_]+$"
+ },
+ "$.body.data.project.pipeline.user.webUrl": {
+ "match": "regex",
+ "regex": "^(http|https):\\/\\/[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$"
+ },
+ "$.body.data.project.pipeline.user.avatarUrl": {
+ "match": "regex",
+ "regex": "^(http|https):\\/\\/[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$"
+ }
+ }
+ }
+ }
+ ],
+ "metadata": {
+ "pactSpecification": {
+ "version": "2.0.0"
+ }
+ }
+} \ No newline at end of file
diff --git a/spec/contracts/provider/pact_helpers/project/pipeline/get_list_project_pipelines_helper.rb b/spec/contracts/provider/pact_helpers/project/pipeline/get_list_project_pipelines_helper.rb
new file mode 100644
index 00000000000..5307468b7c6
--- /dev/null
+++ b/spec/contracts/provider/pact_helpers/project/pipeline/get_list_project_pipelines_helper.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require_relative '../../../spec_helper'
+require_relative '../../../states/project/pipeline/pipelines_state'
+
+module Provider
+ module GetListProjectPipelinesHelper
+ Pact.service_provider "GET List project pipelines" do
+ app { Environments::Test.app }
+
+ honours_pact_with 'Pipelines#index' do
+ pact_uri '../contracts/project/project/pipeline/index/pipelines#index-get_list_project_pipelines.json'
+ end
+ end
+ end
+end
diff --git a/spec/contracts/provider/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb b/spec/contracts/provider/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb
new file mode 100644
index 00000000000..abb2781f987
--- /dev/null
+++ b/spec/contracts/provider/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require_relative '../../../spec_helper'
+require_relative '../../../states/project/pipeline/pipeline_state'
+
+module Provider
+ module GetPipelinesHeaderDataHelper
+ Pact.service_provider "GET pipeline header data" do
+ app { Environments::Test.app }
+
+ honours_pact_with 'Pipelines#show' do
+ pact_uri '../contracts/project/pipeline/show/pipelines#show-get_project_pipeline_header_data.json'
+ end
+ end
+ end
+end
diff --git a/spec/contracts/provider/states/project/pipeline/pipeline_state.rb b/spec/contracts/provider/states/project/pipeline/pipeline_state.rb
new file mode 100644
index 00000000000..d1a4cd34bdd
--- /dev/null
+++ b/spec/contracts/provider/states/project/pipeline/pipeline_state.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+Pact.provider_states_for "Pipelines#show" do
+ provider_state "a pipeline for a project exists" do
+ set_up do
+ user = User.find_by(name: Provider::UsersHelper::CONTRACT_USER_NAME)
+ namespace = create(:namespace, name: 'gitlab-org')
+ project = create(:project, :repository, name: 'gitlab-qa', namespace: namespace, creator: user)
+ scheduled_job = create(:ci_build, :scheduled)
+ manual_job = create(:ci_build, :manual)
+
+ project.add_maintainer(user)
+
+ create(
+ :ci_pipeline,
+ :with_job,
+ :success,
+ iid: 1,
+ project: project,
+ user: user,
+ duration: 10,
+ finished_at: '2022-06-01T02:47:31.432Z',
+ builds: [scheduled_job, manual_job]
+ )
+ end
+ end
+end
diff --git a/spec/contracts/provider/states/project/pipeline/pipelines_state.rb b/spec/contracts/provider/states/project/pipeline/pipelines_state.rb
new file mode 100644
index 00000000000..639c25e9894
--- /dev/null
+++ b/spec/contracts/provider/states/project/pipeline/pipelines_state.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+Pact.provider_states_for "Pipelines#index" do
+ provider_state "a few pipelines for a project exists" do
+ set_up do
+ user = User.find_by(name: Provider::UsersHelper::CONTRACT_USER_NAME)
+ namespace = create(:namespace, name: 'gitlab-org')
+ project = create(:project, :repository, name: 'gitlab-qa', namespace: namespace, creator: user)
+ scheduled_job = create(:ci_build, :scheduled)
+ manual_job = create(:ci_build, :manual)
+
+ project.add_maintainer(user)
+
+ create(
+ :ci_pipeline,
+ :with_job,
+ :success,
+ project: project,
+ user: user,
+ duration: 10,
+ finished_at: '2022-06-01T02:47:31.432Z',
+ builds: [scheduled_job, manual_job]
+ )
+ end
+ end
+end
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index 4a92911f914..e02589ddc83 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -382,6 +382,24 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
+ describe 'PUT #reset_error_tracking_access_token' do
+ before do
+ sign_in(admin)
+ end
+
+ subject { put :reset_error_tracking_access_token }
+
+ it 'resets error_tracking_access_token' do
+ expect { subject }.to change { ApplicationSetting.current.error_tracking_access_token }
+ end
+
+ it 'redirects the user to application settings page' do
+ subject
+
+ expect(response).to redirect_to(general_admin_application_settings_path)
+ end
+ end
+
describe 'GET #lets_encrypt_terms_of_service' do
include LetsEncryptHelpers
diff --git a/spec/controllers/admin/hooks_controller_spec.rb b/spec/controllers/admin/hooks_controller_spec.rb
index 17c4222530d..14f4a2f40e7 100644
--- a/spec/controllers/admin/hooks_controller_spec.rb
+++ b/spec/controllers/admin/hooks_controller_spec.rb
@@ -17,16 +17,46 @@ RSpec.describe Admin::HooksController do
url: "http://example.com",
push_events: true,
- tag_push_events: true,
+ tag_push_events: false,
repository_update_events: true,
- merge_requests_events: true
+ merge_requests_events: false,
+ url_variables: [{ key: 'token', value: 'some secret value' }]
}
post :create, params: { hook: hook_params }
expect(response).to have_gitlab_http_status(:found)
expect(SystemHook.all.size).to eq(1)
- expect(SystemHook.first).to have_attributes(hook_params)
+ expect(SystemHook.first).to have_attributes(hook_params.except(:url_variables))
+ expect(SystemHook.first).to have_attributes(url_variables: { 'token' => 'some secret value' })
+ end
+ end
+
+ describe 'POST #update' do
+ let!(:hook) { create(:system_hook) }
+
+ it 'sets all parameters' do
+ hook.update!(url_variables: { 'foo' => 'bar', 'baz' => 'woo' })
+
+ hook_params = {
+ url: 'http://example.com/{baz}?token={token}',
+ enable_ssl_verification: false,
+ url_variables: [
+ { key: 'token', value: 'some secret value' },
+ { key: 'foo', value: nil }
+ ]
+ }
+
+ put :update, params: { id: hook.id, hook: hook_params }
+
+ hook.reload
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(flash[:notice]).to include('successfully updated')
+ expect(hook).to have_attributes(hook_params.except(:url_variables))
+ expect(hook).to have_attributes(
+ url_variables: { 'token' => 'some secret value', 'baz' => 'woo' }
+ )
end
end
diff --git a/spec/controllers/admin/topics_controller_spec.rb b/spec/controllers/admin/topics_controller_spec.rb
index 67943525687..ee36d5f1def 100644
--- a/spec/controllers/admin/topics_controller_spec.rb
+++ b/spec/controllers/admin/topics_controller_spec.rb
@@ -151,4 +151,26 @@ RSpec.describe Admin::TopicsController do
end
end
end
+
+ describe 'DELETE #destroy' do
+ it 'removes topic' do
+ delete :destroy, params: { id: topic.id }
+
+ expect(response).to redirect_to(admin_topics_path)
+ expect { topic.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ context 'as a normal user' do
+ before do
+ sign_in(user)
+ end
+
+ it 'renders a 404 error' do
+ delete :destroy, params: { id: topic.id }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect { topic.reload }.not_to raise_error
+ end
+ end
+ end
end
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index c5306fda0a5..1e28ef4ba93 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -559,6 +559,28 @@ RSpec.describe ApplicationController do
expect(controller.last_payload[:target_duration_s]).to eq(0.25)
end
end
+
+ it 'logs response length' do
+ sign_in user
+
+ get :index
+
+ expect(controller.last_payload[:response_bytes]).to eq('authenticated'.bytesize)
+ end
+
+ context 'with log_response_length disabled' do
+ before do
+ stub_feature_flags(log_response_length: false)
+ end
+
+ it 'logs response length' do
+ sign_in user
+
+ get :index
+
+ expect(controller.last_payload).not_to include(:response_bytes)
+ end
+ end
end
describe '#access_denied' do
diff --git a/spec/controllers/concerns/harbor/artifact_spec.rb b/spec/controllers/concerns/harbor/artifact_spec.rb
new file mode 100644
index 00000000000..6716d615a3b
--- /dev/null
+++ b/spec/controllers/concerns/harbor/artifact_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Harbor::Artifact do
+ controller(ActionController::Base) do
+ include ::Harbor::Artifact
+ end
+ it_behaves_like 'raises NotImplementedError when calling #container'
+end
diff --git a/spec/controllers/concerns/harbor/repository_spec.rb b/spec/controllers/concerns/harbor/repository_spec.rb
new file mode 100644
index 00000000000..cae038ceed2
--- /dev/null
+++ b/spec/controllers/concerns/harbor/repository_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Harbor::Repository do
+ controller(ActionController::Base) do
+ include ::Harbor::Repository
+ end
+ it_behaves_like 'raises NotImplementedError when calling #container'
+end
diff --git a/spec/controllers/concerns/harbor/tag_spec.rb b/spec/controllers/concerns/harbor/tag_spec.rb
new file mode 100644
index 00000000000..0d72ef303b0
--- /dev/null
+++ b/spec/controllers/concerns/harbor/tag_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Harbor::Tag do
+ controller(ActionController::Base) do
+ include ::Harbor::Tag
+ end
+ it_behaves_like 'raises NotImplementedError when calling #container'
+end
diff --git a/spec/controllers/graphql_controller_spec.rb b/spec/controllers/graphql_controller_spec.rb
index e85f5b7a972..1d2f1085d3c 100644
--- a/spec/controllers/graphql_controller_spec.rb
+++ b/spec/controllers/graphql_controller_spec.rb
@@ -27,6 +27,18 @@ RSpec.describe GraphqlController do
)
end
+ it 'handles a timeout nicely' do
+ allow(subject).to receive(:execute) do
+ raise ActiveRecord::QueryCanceled, '**taps wristwatch**'
+ end
+
+ post :execute
+
+ expect(json_response).to include(
+ 'errors' => include(a_hash_including('message' => /Request timed out/))
+ )
+ end
+
it 'handles StandardError' do
allow(subject).to receive(:execute) do
raise StandardError, message
diff --git a/spec/controllers/groups/group_links_controller_spec.rb b/spec/controllers/groups/group_links_controller_spec.rb
index 28febd786de..7322ca5e522 100644
--- a/spec/controllers/groups/group_links_controller_spec.rb
+++ b/spec/controllers/groups/group_links_controller_spec.rb
@@ -131,8 +131,24 @@ RSpec.describe Groups::GroupLinksController do
expect { subject }.to change(GroupGroupLink, :count).by(-1)
end
- it 'updates project permissions', :sidekiq_inline do
- expect { subject }.to change { group_member.can?(:create_release, project) }.from(true).to(false)
+ context 'with skip_group_share_unlink_auth_refresh feature flag disabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: false)
+ end
+
+ it 'updates project permissions', :sidekiq_inline do
+ expect { subject }.to change { group_member.can?(:create_release, project) }.from(true).to(false)
+ end
+ end
+
+ context 'with skip_group_share_unlink_auth_refresh feature flag enabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: true)
+ end
+
+ it 'maintains project authorization', :sidekiq_inline do
+ expect(Ability.allowed?(user, :read_project, project)).to be_truthy
+ end
end
end
diff --git a/spec/controllers/groups/variables_controller_spec.rb b/spec/controllers/groups/variables_controller_spec.rb
index 8c0aa83b9c4..6dbe75bb1df 100644
--- a/spec/controllers/groups/variables_controller_spec.rb
+++ b/spec/controllers/groups/variables_controller_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Groups::VariablesController do
before do
sign_in(user)
- group.add_user(user, access_level)
+ group.add_member(user, access_level)
end
describe 'GET #show' do
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index aabceda7187..c4e4eeec953 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -1112,9 +1112,11 @@ RSpec.describe GroupsController, factory_default: :keep do
before do
sign_in(admin)
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:group_export][:threshold].call + 1)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy)
+ .to receive(:increment)
+ .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:group_export][:threshold].call + 1)
+ end
end
it 'throttles the endpoint' do
@@ -1194,9 +1196,11 @@ RSpec.describe GroupsController, factory_default: :keep do
before do
sign_in(admin)
- allow(Gitlab::ApplicationRateLimiter)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy)
.to receive(:increment)
.and_return(Gitlab::ApplicationRateLimiter.rate_limits[:group_download_export][:threshold].call + 1)
+ end
end
it 'throttles the endpoint' do
diff --git a/spec/controllers/import/available_namespaces_controller_spec.rb b/spec/controllers/import/available_namespaces_controller_spec.rb
index 0f98d649338..26ea1d92189 100644
--- a/spec/controllers/import/available_namespaces_controller_spec.rb
+++ b/spec/controllers/import/available_namespaces_controller_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe Import::AvailableNamespacesController do
it "does not include group with access level #{params[:role]} in list" do
group = create(:group, project_creation_level: group_project_creation_level)
- group.add_user(user, role)
+ group.add_member(user, role)
get :index
expect(response).to have_gitlab_http_status(:ok)
@@ -52,7 +52,7 @@ RSpec.describe Import::AvailableNamespacesController do
it "does not include group with access level #{params[:role]} in list" do
group = create(:group, project_creation_level: group_project_creation_level)
- group.add_user(user, role)
+ group.add_member(user, role)
get :index
expect(response).to have_gitlab_http_status(:ok)
@@ -81,7 +81,7 @@ RSpec.describe Import::AvailableNamespacesController do
it "#{params[:is_visible] ? 'includes' : 'does not include'} group with access level #{params[:role]} in list" do
group = create(:group, project_creation_level: project_creation_level)
- group.add_user(user, :developer)
+ group.add_member(user, :developer)
get :index
diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb
index 6d24830af27..af220e2d515 100644
--- a/spec/controllers/import/bitbucket_controller_spec.rb
+++ b/spec/controllers/import/bitbucket_controller_spec.rb
@@ -45,24 +45,27 @@ RSpec.describe Import::BitbucketController do
end
context "when auth state param is valid" do
+ let(:expires_at) { Time.current + 1.day }
+ let(:expires_in) { 1.day }
+ let(:access_token) do
+ double(token: token,
+ secret: secret,
+ expires_at: expires_at,
+ expires_in: expires_in,
+ refresh_token: refresh_token)
+ end
+
before do
session[:bitbucket_auth_state] = 'state'
end
it "updates access token" do
- expires_at = Time.current + 1.day
- expires_in = 1.day
- access_token = double(token: token,
- secret: secret,
- expires_at: expires_at,
- expires_in: expires_in,
- refresh_token: refresh_token)
allow_any_instance_of(OAuth2::Client)
.to receive(:get_token)
.with(hash_including(
'grant_type' => 'authorization_code',
'code' => code,
- redirect_uri: users_import_bitbucket_callback_url),
+ 'redirect_uri' => users_import_bitbucket_callback_url),
{})
.and_return(access_token)
stub_omniauth_provider('bitbucket')
@@ -75,6 +78,18 @@ RSpec.describe Import::BitbucketController do
expect(session[:bitbucket_expires_in]).to eq(expires_in)
expect(controller).to redirect_to(status_import_bitbucket_url)
end
+
+ it "passes namespace_id query param to status if provided" do
+ namespace_id = 30
+
+ allow_any_instance_of(OAuth2::Client)
+ .to receive(:get_token)
+ .and_return(access_token)
+
+ get :callback, params: { code: code, state: 'state', namespace_id: namespace_id }
+
+ expect(controller).to redirect_to(status_import_bitbucket_url(namespace_id: namespace_id))
+ end
end
end
@@ -82,7 +97,6 @@ RSpec.describe Import::BitbucketController do
before do
@repo = double(name: 'vim', slug: 'vim', owner: 'asd', full_name: 'asd/vim', clone_url: 'http://test.host/demo/url.git', 'valid?' => true)
@invalid_repo = double(name: 'mercurialrepo', slug: 'mercurialrepo', owner: 'asd', full_name: 'asd/mercurialrepo', clone_url: 'http://test.host/demo/mercurialrepo.git', 'valid?' => false)
- allow(controller).to receive(:provider_url).and_return('http://demobitbucket.org')
end
context "when token does not exists" do
@@ -109,10 +123,6 @@ RSpec.describe Import::BitbucketController do
end
it_behaves_like 'import controller status' do
- before do
- allow(controller).to receive(:provider_url).and_return('http://demobitbucket.org')
- end
-
let(:repo) { @repo }
let(:repo_id) { @repo.full_name }
let(:import_source) { @repo.full_name }
diff --git a/spec/controllers/import/bitbucket_server_controller_spec.rb b/spec/controllers/import/bitbucket_server_controller_spec.rb
index d5f94be65b6..ac56d3af54f 100644
--- a/spec/controllers/import/bitbucket_server_controller_spec.rb
+++ b/spec/controllers/import/bitbucket_server_controller_spec.rb
@@ -134,6 +134,15 @@ RSpec.describe Import::BitbucketServerController do
expect(response).to have_gitlab_http_status(:found)
expect(response).to redirect_to(status_import_bitbucket_server_path)
end
+
+ it 'passes namespace_id to status page if provided' do
+ namespace_id = 5
+ allow(controller).to receive(:allow_local_requests?).and_return(true)
+
+ post :configure, params: { personal_access_token: token, bitbucket_server_username: username, bitbucket_server_url: url, namespace_id: namespace_id }
+
+ expect(response).to redirect_to(status_import_bitbucket_server_path(namespace_id: namespace_id))
+ end
end
describe 'GET status' do
@@ -160,6 +169,14 @@ RSpec.describe Import::BitbucketServerController do
expect(json_response.dig("provider_repos", 0, "id")).to eq(@repo.full_name)
end
+ it 'redirects to connection form if session is missing auth data' do
+ session[:bitbucket_server_url] = nil
+
+ get :status, format: :html
+
+ expect(response).to redirect_to(new_import_bitbucket_server_path)
+ end
+
it_behaves_like 'import controller status' do
let(:repo) { @repo }
let(:repo_id) { "#{@repo.project_key}/#{@repo.slug}" }
diff --git a/spec/controllers/import/bulk_imports_controller_spec.rb b/spec/controllers/import/bulk_imports_controller_spec.rb
index a7089005abf..7177c8c10a6 100644
--- a/spec/controllers/import/bulk_imports_controller_spec.rb
+++ b/spec/controllers/import/bulk_imports_controller_spec.rb
@@ -48,15 +48,25 @@ RSpec.describe Import::BulkImportsController do
expect(session[:bulk_import_gitlab_access_token]).to eq(token)
expect(controller).to redirect_to(status_import_bulk_imports_url)
end
+
+ it 'passes namespace_id to status' do
+ namespace_id = 5
+ token = 'token'
+ url = 'https://gitlab.example'
+
+ post :configure, params: { bulk_import_gitlab_access_token: token, bulk_import_gitlab_url: url, namespace_id: namespace_id }
+
+ expect(controller).to redirect_to(status_import_bulk_imports_url(namespace_id: namespace_id))
+ end
end
describe 'GET status' do
- def get_status(params_override = {})
+ def get_status(params_override = {}, format = :json)
params = { page: 1, per_page: 20, filter: '' }.merge(params_override)
get :status,
params: params,
- format: :json,
+ format: format,
session: {
bulk_import_gitlab_url: 'https://gitlab.example.com',
bulk_import_gitlab_access_token: 'demo-pat'
@@ -169,6 +179,25 @@ RSpec.describe Import::BulkImportsController do
end
end
end
+
+ context 'when namespace_id is provided' do
+ let_it_be(:group) { create(:group) }
+
+ it 'renders 404 if user does not have access to namespace' do
+ get_status({ namespace_id: group.id }, :html)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'passes namespace to template' do
+ group.add_owner(user)
+
+ get_status({ namespace_id: group.id }, :html)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:namespace)).to eq(group)
+ end
+ end
end
context 'when connection error occurs' do
diff --git a/spec/controllers/import/fogbugz_controller_spec.rb b/spec/controllers/import/fogbugz_controller_spec.rb
index 8f8cc9590a5..ed2a588eadf 100644
--- a/spec/controllers/import/fogbugz_controller_spec.rb
+++ b/spec/controllers/import/fogbugz_controller_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Import::FogbugzController do
let(:user) { create(:user) }
let(:token) { FFaker::Lorem.characters(8) }
let(:uri) { 'https://example.com' }
+ let(:namespace_id) { 5 }
before do
sign_in(user)
@@ -16,9 +17,11 @@ RSpec.describe Import::FogbugzController do
describe 'POST #callback' do
let(:xml_response) { %Q(<?xml version=\"1.0\" encoding=\"UTF-8\"?><response><token><![CDATA[#{token}]]></token></response>) }
- it 'attempts to contact Fogbugz server' do
+ before do
stub_request(:post, "https://example.com/api.asp").to_return(status: 200, body: xml_response, headers: {})
+ end
+ it 'attempts to contact Fogbugz server' do
post :callback, params: { uri: uri, email: 'test@example.com', password: 'mypassword' }
expect(session[:fogbugz_token]).to eq(token)
@@ -26,6 +29,29 @@ RSpec.describe Import::FogbugzController do
expect(response).to redirect_to(new_user_map_import_fogbugz_path)
end
+ it 'preserves namespace_id query param on success' do
+ post :callback, params: { uri: uri, email: 'test@example.com', password: 'mypassword', namespace_id: namespace_id }
+
+ expect(response).to redirect_to(new_user_map_import_fogbugz_path(namespace_id: namespace_id))
+ end
+
+ it 'redirects to new page maintaining namespace_id when client raises standard error' do
+ namespace_id = 5
+ allow(::Gitlab::FogbugzImport::Client).to receive(:new).and_raise(StandardError)
+
+ post :callback, params: { uri: uri, email: 'test@example.com', password: 'mypassword', namespace_id: namespace_id }
+
+ expect(response).to redirect_to(new_import_fogbugz_url(namespace_id: namespace_id))
+ end
+
+ it 'redirects to new page form when client raises authentication exception' do
+ allow(::Gitlab::FogbugzImport::Client).to receive(:new).and_raise(::Fogbugz::AuthenticationException)
+
+ post :callback, params: { uri: uri, email: 'test@example.com', password: 'mypassword' }
+
+ expect(response).to redirect_to(new_import_fogbugz_url)
+ end
+
context 'verify url' do
shared_examples 'denies local request' do |reason|
it 'does not allow requests' do
@@ -76,6 +102,16 @@ RSpec.describe Import::FogbugzController do
expect(session[:fogbugz_user_map]).to eq(user_map)
expect(response).to redirect_to(status_import_fogbugz_path)
end
+
+ it 'preserves namespace_id query param' do
+ client = double(user_map: {})
+ expect(controller).to receive(:client).and_return(client)
+
+ post :create_user_map, params: { users: user_map, namespace_id: namespace_id }
+
+ expect(session[:fogbugz_user_map]).to eq(user_map)
+ expect(response).to redirect_to(status_import_fogbugz_path(namespace_id: namespace_id))
+ end
end
describe 'GET status' do
@@ -84,11 +120,19 @@ RSpec.describe Import::FogbugzController do
id: 'demo', name: 'vim', safe_name: 'vim', path: 'vim')
end
- before do
- stub_client(valid?: true)
+ it 'redirects to new page form when client is invalid' do
+ stub_client(valid?: false)
+
+ get :status
+
+ expect(response).to redirect_to(new_import_fogbugz_path)
end
it_behaves_like 'import controller status' do
+ before do
+ stub_client(valid?: true)
+ end
+
let(:repo_id) { repo.id }
let(:import_source) { repo.name }
let(:provider_name) { 'fogbugz' }
diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb
index 56e55c45e66..46160aac0c1 100644
--- a/spec/controllers/import/github_controller_spec.rb
+++ b/spec/controllers/import/github_controller_spec.rb
@@ -83,11 +83,10 @@ RSpec.describe Import::GithubController do
expect(flash[:alert]).to eq('Access denied to your GitHub account.')
end
- it "includes namespace_id from session if it is present" do
+ it "includes namespace_id from query params if it is present" do
namespace_id = 1
- session[:namespace_id] = 1
- get :callback, params: { state: valid_auth_state }
+ get :callback, params: { state: valid_auth_state, namespace_id: namespace_id }
expect(controller).to redirect_to(status_import_github_url(namespace_id: namespace_id))
end
diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb
index 117c934ad5d..7b3978297fb 100644
--- a/spec/controllers/import/gitlab_controller_spec.rb
+++ b/spec/controllers/import/gitlab_controller_spec.rb
@@ -38,21 +38,47 @@ RSpec.describe Import::GitlabController do
expect(controller.send(:importable_repos)).to be_an_instance_of(Array)
end
+
+ it "passes namespace_id query param to status if provided" do
+ namespace_id = 30
+
+ allow_next_instance_of(Gitlab::GitlabImport::Client) do |instance|
+ allow(instance).to receive(:get_token).and_return(token)
+ end
+
+ get :callback, params: { namespace_id: namespace_id }
+
+ expect(controller).to redirect_to(status_import_gitlab_url(namespace_id: namespace_id))
+ end
end
describe "GET status" do
let(:repo_fake) { Struct.new(:id, :path, :path_with_namespace, :web_url, keyword_init: true) }
let(:repo) { repo_fake.new(id: 1, path: 'vim', path_with_namespace: 'asd/vim', web_url: 'https://gitlab.com/asd/vim') }
- before do
- assign_session_token
+ context 'when session contains access token' do
+ before do
+ assign_session_token
+ end
+
+ it_behaves_like 'import controller status' do
+ let(:repo_id) { repo.id }
+ let(:import_source) { repo.path_with_namespace }
+ let(:provider_name) { 'gitlab' }
+ let(:client_repos_field) { :projects }
+ end
end
- it_behaves_like 'import controller status' do
- let(:repo_id) { repo.id }
- let(:import_source) { repo.path_with_namespace }
- let(:provider_name) { 'gitlab' }
- let(:client_repos_field) { :projects }
+ it 'redirects to auth if session does not contain access token' do
+ remote_gitlab_url = 'https://test.host/auth/gitlab'
+
+ allow(Gitlab::GitlabImport::Client)
+ .to receive(:new)
+ .and_return(double(authorize_url: remote_gitlab_url))
+
+ get :status
+
+ expect(response).to redirect_to(remote_gitlab_url)
end
end
diff --git a/spec/controllers/profiles/emails_controller_spec.rb b/spec/controllers/profiles/emails_controller_spec.rb
index b63db831462..818aba77354 100644
--- a/spec/controllers/profiles/emails_controller_spec.rb
+++ b/spec/controllers/profiles/emails_controller_spec.rb
@@ -20,9 +20,9 @@ RSpec.describe Profiles::EmailsController do
before do
allowed_threshold = Gitlab::ApplicationRateLimiter.rate_limits[action][:threshold]
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(allowed_threshold + 1)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy).to receive(:increment).and_return(allowed_threshold + 1)
+ end
end
it 'does not send any email' do
diff --git a/spec/controllers/profiles/personal_access_tokens_controller_spec.rb b/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
index 48c747bf074..aafea0050d3 100644
--- a/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
+++ b/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
@@ -65,5 +65,42 @@ RSpec.describe Profiles::PersonalAccessTokensController do
scopes: contain_exactly(:api, :read_user)
)
end
+
+ context "access_token_pagination feature flag is enabled" do
+ before do
+ stub_feature_flags(access_token_pagination: true)
+ allow(Kaminari.config).to receive(:default_per_page).and_return(1)
+ create(:personal_access_token, user: user)
+ end
+
+ it "returns paginated response" do
+ get :index, params: { page: 1 }
+ expect(assigns(:active_personal_access_tokens).count).to eq(1)
+ end
+
+ it 'adds appropriate headers' do
+ get :index, params: { page: 1 }
+ expect_header('X-Per-Page', '1')
+ expect_header('X-Page', '1')
+ expect_header('X-Next-Page', '2')
+ expect_header('X-Total', '2')
+ end
+ end
+
+ context "access_token_pagination feature flag is disabled" do
+ before do
+ stub_feature_flags(access_token_pagination: false)
+ create(:personal_access_token, user: user)
+ end
+
+ it "returns all tokens in system" do
+ get :index, params: { page: 1 }
+ expect(assigns(:active_personal_access_tokens).count).to eq(2)
+ end
+ end
+ end
+
+ def expect_header(header_name, header_val)
+ expect(response.headers[header_name]).to eq(header_val)
end
end
diff --git a/spec/controllers/projects/hooks_controller_spec.rb b/spec/controllers/projects/hooks_controller_spec.rb
index ebcf35a7ecd..a275bc28631 100644
--- a/spec/controllers/projects/hooks_controller_spec.rb
+++ b/spec/controllers/projects/hooks_controller_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Projects::HooksController do
+ include AfterNextHelpers
+
let_it_be(:project) { create(:project) }
let(:user) { project.first_owner }
@@ -20,6 +22,36 @@ RSpec.describe Projects::HooksController do
end
end
+ describe '#update' do
+ let_it_be(:hook) { create(:project_hook, project: project) }
+
+ let(:params) do
+ { namespace_id: project.namespace, project_id: project, id: hook.id }
+ end
+
+ it 'adds, updates and deletes URL variables' do
+ hook.update!(url_variables: { 'a' => 'bar', 'b' => 'woo' })
+
+ params[:hook] = {
+ url_variables: [
+ { key: 'a', value: 'updated' },
+ { key: 'b', value: nil },
+ { key: 'c', value: 'new' }
+ ]
+ }
+
+ put :update, params: params
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(flash[:notice]).to include('successfully updated')
+
+ expect(hook.reload.url_variables).to eq(
+ 'a' => 'updated',
+ 'c' => 'new'
+ )
+ end
+ end
+
describe '#edit' do
let_it_be(:hook) { create(:project_hook, project: project) }
@@ -87,14 +119,30 @@ RSpec.describe Projects::HooksController do
job_events: true,
pipeline_events: true,
wiki_page_events: true,
- deployment_events: true
+ deployment_events: true,
+
+ url_variables: [{ key: 'token', value: 'some secret value' }]
}
post :create, params: { namespace_id: project.namespace, project_id: project, hook: hook_params }
expect(response).to have_gitlab_http_status(:found)
- expect(ProjectHook.all.size).to eq(1)
- expect(ProjectHook.first).to have_attributes(hook_params)
+ expect(flash[:alert]).to be_blank
+ expect(ProjectHook.count).to eq(1)
+ expect(ProjectHook.first).to have_attributes(hook_params.except(:url_variables))
+ expect(ProjectHook.first).to have_attributes(url_variables: { 'token' => 'some secret value' })
+ end
+
+ it 'alerts the user if the new hook is invalid' do
+ hook_params = {
+ token: "TEST\nTOKEN",
+ url: "http://example.com"
+ }
+
+ post :create, params: { namespace_id: project.namespace, project_id: project, hook: hook_params }
+
+ expect(flash[:alert]).to be_present
+ expect(ProjectHook.count).to eq(0)
end
end
@@ -109,6 +157,45 @@ RSpec.describe Projects::HooksController do
describe '#test' do
let(:hook) { create(:project_hook, project: project) }
+ context 'when the hook executes successfully' do
+ before do
+ stub_request(:post, hook.url).to_return(status: 200)
+ end
+
+ it 'informs the user' do
+ post :test, params: { namespace_id: project.namespace, project_id: project, id: hook }
+
+ expect(flash[:notice]).to include('executed successfully')
+ expect(flash[:notice]).to include('HTTP 200')
+ end
+ end
+
+ context 'when the hook runs, but fails' do
+ before do
+ stub_request(:post, hook.url).to_return(status: 400)
+ end
+
+ it 'informs the user' do
+ post :test, params: { namespace_id: project.namespace, project_id: project, id: hook }
+
+ expect(flash[:alert]).to include('executed successfully but')
+ expect(flash[:alert]).to include('HTTP 400')
+ end
+ end
+
+ context 'when the hook fails completely' do
+ before do
+ allow_next(::TestHooks::ProjectService)
+ .to receive(:execute).and_return({ message: 'All is woe' })
+ end
+
+ it 'informs the user' do
+ post :test, params: { namespace_id: project.namespace, project_id: project, id: hook }
+
+ expect(flash[:alert]).to include('failed: All is woe')
+ end
+ end
+
context 'when the endpoint receives requests above the limit', :freeze_time, :clean_gitlab_redis_rate_limiting do
before do
allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 1305693372c..badac688229 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -1818,7 +1818,7 @@ RSpec.describe Projects::IssuesController do
context 'user is allowed access' do
before do
- project.add_user(user, :maintainer)
+ project.add_member(user, :maintainer)
end
it 'displays all available notes' do
diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb
index 107eb1ed3a3..e4e3151dd12 100644
--- a/spec/controllers/projects/jobs_controller_spec.rb
+++ b/spec/controllers/projects/jobs_controller_spec.rb
@@ -752,28 +752,6 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do
end
end
- describe 'GET status.json' do
- let(:job) { create(:ci_build, pipeline: pipeline) }
- let(:status) { job.detailed_status(double('user')) }
-
- before do
- get :status, params: {
- namespace_id: project.namespace,
- project_id: project,
- id: job.id
- },
- format: :json
- end
-
- it 'return a detailed job status in json' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['text']).to eq status.text
- expect(json_response['label']).to eq status.label
- expect(json_response['icon']).to eq status.icon
- expect(json_response['favicon']).to match_asset_path "/assets/ci_favicons/#{status.favicon}.png"
- end
- end
-
describe 'POST retry' do
before do
project.add_developer(user)
diff --git a/spec/controllers/projects/logs_controller_spec.rb b/spec/controllers/projects/logs_controller_spec.rb
deleted file mode 100644
index 1c81ae93b42..00000000000
--- a/spec/controllers/projects/logs_controller_spec.rb
+++ /dev/null
@@ -1,214 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::LogsController do
- include KubernetesHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
-
- let_it_be(:environment) do
- create(:environment, name: 'production', project: project)
- end
-
- let(:pod_name) { "foo" }
- let(:container) { 'container-1' }
-
- before do
- sign_in(user)
- end
-
- describe 'GET #index' do
- let(:empty_project) { create(:project) }
-
- it 'returns 404 with reporter access' do
- project.add_reporter(user)
-
- get :index, params: environment_params
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- it 'renders empty logs page if no environment exists' do
- empty_project.add_developer(user)
-
- get :index, params: { namespace_id: empty_project.namespace, project_id: empty_project }
-
- expect(response).to be_ok
- expect(response).to render_template 'empty_logs'
- end
-
- it 'renders index template' do
- project.add_developer(user)
-
- get :index, params: environment_params
-
- expect(response).to be_ok
- expect(response).to render_template 'index'
- end
-
- context 'with feature flag disabled' do
- before do
- stub_feature_flags(monitor_logging: false)
- end
-
- it 'returns 404 with reporter access' do
- project.add_developer(user)
-
- get :index, params: environment_params
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- shared_examples 'pod logs service' do |endpoint, service|
- let(:service_result) do
- {
- status: :success,
- logs: ['Log 1', 'Log 2', 'Log 3'],
- pods: [pod_name],
- pod_name: pod_name,
- container_name: container
- }
- end
-
- let(:service_result_json) { Gitlab::Json.parse(service_result.to_json) }
-
- let_it_be(:cluster) { create(:cluster, :provided_by_gcp, environment_scope: '*', projects: [project]) }
-
- before do
- allow_next_instance_of(service) do |instance|
- allow(instance).to receive(:execute).and_return(service_result)
- end
- end
-
- it 'returns 404 with reporter access' do
- project.add_reporter(user)
-
- get endpoint, params: environment_params(pod_name: pod_name, format: :json)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- context 'with developer access' do
- before do
- project.add_developer(user)
- end
-
- it 'returns the service result' do
- get endpoint, params: environment_params(pod_name: pod_name, format: :json)
-
- expect(response).to have_gitlab_http_status(:success)
- expect(json_response).to eq(service_result_json)
- end
- end
-
- context 'with maintainer access' do
- before do
- project.add_maintainer(user)
- end
-
- it 'returns the service result' do
- get endpoint, params: environment_params(pod_name: pod_name, format: :json)
-
- expect(response).to have_gitlab_http_status(:success)
- expect(json_response).to eq(service_result_json)
- end
-
- it 'sets the polling header' do
- get endpoint, params: environment_params(pod_name: pod_name, format: :json)
-
- expect(response).to have_gitlab_http_status(:success)
- expect(response.headers['Poll-Interval']).to eq('3000')
- end
-
- context 'with gitlab managed apps logs' do
- it 'uses cluster finder services to select cluster', :aggregate_failures do
- cluster_list = [cluster]
- service_params = { params: ActionController::Parameters.new(pod_name: pod_name).permit! }
- request_params = {
- namespace_id: project.namespace,
- project_id: project,
- cluster_id: cluster.id,
- pod_name: pod_name,
- format: :json
- }
-
- expect_next_instance_of(ClusterAncestorsFinder, project, user) do |finder|
- expect(finder).to receive(:execute).and_return(cluster_list)
- expect(cluster_list).to receive(:find).and_call_original
- end
-
- expect_next_instance_of(service, cluster, Gitlab::Kubernetes::Helm::NAMESPACE, service_params) do |instance|
- expect(instance).to receive(:execute).and_return(service_result)
- end
-
- get endpoint, params: request_params
-
- expect(response).to have_gitlab_http_status(:success)
- expect(json_response).to eq(service_result_json)
- end
- end
-
- context 'when service is processing' do
- let(:service_result) { nil }
-
- it 'returns a 202' do
- get endpoint, params: environment_params(pod_name: pod_name, format: :json)
-
- expect(response).to have_gitlab_http_status(:accepted)
- end
- end
-
- shared_examples 'unsuccessful execution response' do |message|
- let(:service_result) do
- {
- status: :error,
- message: message
- }
- end
-
- it 'returns the error' do
- get endpoint, params: environment_params(pod_name: pod_name, format: :json)
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response).to eq(service_result_json)
- end
- end
-
- context 'when service is failing' do
- it_behaves_like 'unsuccessful execution response', 'some error'
- end
-
- context 'when cluster is nil' do
- let!(:cluster) { nil }
-
- it_behaves_like 'unsuccessful execution response', 'Environment does not have deployments'
- end
-
- context 'when namespace is empty' do
- before do
- allow(environment).to receive(:deployment_namespace).and_return('')
- end
-
- it_behaves_like 'unsuccessful execution response', 'Environment does not have deployments'
- end
- end
- end
-
- describe 'GET #k8s' do
- it_behaves_like 'pod logs service', :k8s, PodLogs::KubernetesService
- end
-
- describe 'GET #elasticsearch' do
- it_behaves_like 'pod logs service', :elasticsearch, PodLogs::ElasticsearchService
- end
-
- def environment_params(opts = {})
- opts.reverse_merge(namespace_id: project.namespace,
- project_id: project,
- environment_name: environment.name)
- end
-end
diff --git a/spec/controllers/projects/mirrors_controller_spec.rb b/spec/controllers/projects/mirrors_controller_spec.rb
index 686effd799e..d33bc215cfc 100644
--- a/spec/controllers/projects/mirrors_controller_spec.rb
+++ b/spec/controllers/projects/mirrors_controller_spec.rb
@@ -211,7 +211,7 @@ RSpec.describe Projects::MirrorsController do
context 'data in the cache' do
let(:ssh_key) { 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAfuCHKVTjquxvt6CM6tdG4SLp1Btn/nOeHHE5UOzRdf' }
- let(:ssh_fp) { { type: 'ed25519', bits: 256, fingerprint: '2e:65:6a:c8:cf:bf:b2:8b:9a:bd:6d:9f:11:5c:12:16', index: 0 } }
+ let(:ssh_fp) { { type: 'ed25519', bits: 256, fingerprint: '2e:65:6a:c8:cf:bf:b2:8b:9a:bd:6d:9f:11:5c:12:16', fingerprint_sha256: 'SHA256:eUXGGm1YGsMAS7vkcx6JOJdOGHPem5gQp4taiCfCLB8', index: 0 } }
it 'returns the data with a 200 response' do
stub_reactive_cache(cache, known_hosts: ssh_key)
diff --git a/spec/controllers/projects/pipelines/tests_controller_spec.rb b/spec/controllers/projects/pipelines/tests_controller_spec.rb
index 2db54dbe671..ddcab8b048e 100644
--- a/spec/controllers/projects/pipelines/tests_controller_spec.rb
+++ b/spec/controllers/projects/pipelines/tests_controller_spec.rb
@@ -45,11 +45,26 @@ RSpec.describe Projects::Pipelines::TestsController do
pipeline.job_artifacts.first.update!(expire_at: Date.yesterday)
end
+ it 'renders test suite', :aggregate_failures do
+ get_tests_show_json(build_ids)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['name']).to eq('test')
+ expect(json_response['total_count']).to eq(3)
+ expect(json_response['test_cases'].size).to eq(3)
+ end
+ end
+
+ context 'when artifacts do not exist' do
+ before do
+ pipeline.job_artifacts.each(&:destroy)
+ end
+
it 'renders not_found errors', :aggregate_failures do
get_tests_show_json(build_ids)
expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response['errors']).to eq('Test report artifacts have expired')
+ expect(json_response['errors']).to eq('Test report artifacts not found')
end
end
@@ -68,7 +83,6 @@ RSpec.describe Projects::Pipelines::TestsController do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq('test')
- expect(json_response['artifacts_expired']).to be_falsey
# Each test failure in this pipeline has a matching failure in the default branch
recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] }
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index b3b803649d1..06930d8727b 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -827,6 +827,14 @@ RSpec.describe Projects::PipelinesController do
{
chart_param: 'lead-time',
event: 'p_analytics_ci_cd_lead_time'
+ },
+ {
+ chart_param: 'time-to-restore-service',
+ event: 'p_analytics_ci_cd_time_to_restore_service'
+ },
+ {
+ chart_param: 'change-failure-rate',
+ event: 'p_analytics_ci_cd_change_failure_rate'
}
].each do |tab|
it_behaves_like 'tracking unique visits', :charts do
diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb
index 9bb34a38005..46eb340cbba 100644
--- a/spec/controllers/projects/project_members_controller_spec.rb
+++ b/spec/controllers/projects/project_members_controller_spec.rb
@@ -68,27 +68,6 @@ RSpec.describe Projects::ProjectMembersController do
end
end
- context 'group links' do
- let_it_be(:project_group_link) { create(:project_group_link, project: project, group: group) }
-
- it 'lists group links' do
- get :index, params: { namespace_id: project.namespace, project_id: project }
-
- expect(assigns(:group_links).map(&:id)).to contain_exactly(project_group_link.id)
- end
-
- context 'when `search_groups` param is present' do
- let(:group_2) { create(:group, :public, name: 'group_2') }
- let!(:project_group_link_2) { create(:project_group_link, project: project, group: group_2) }
-
- it 'lists group links that match search' do
- get :index, params: { namespace_id: project.namespace, project_id: project, search_groups: 'group_2' }
-
- expect(assigns(:group_links).map(&:id)).to contain_exactly(project_group_link_2.id)
- end
- end
- end
-
context 'invited members' do
let_it_be(:invited_member) { create(:project_member, :invited, project: project) }
diff --git a/spec/controllers/projects/service_ping_controller_spec.rb b/spec/controllers/projects/service_ping_controller_spec.rb
index fa92efee079..22fb18edc80 100644
--- a/spec/controllers/projects/service_ping_controller_spec.rb
+++ b/spec/controllers/projects/service_ping_controller_spec.rb
@@ -80,16 +80,24 @@ RSpec.describe Projects::ServicePingController do
it_behaves_like 'counter is not increased'
it_behaves_like 'counter is increased', 'WEB_IDE_PREVIEWS_SUCCESS_COUNT'
- context 'when the user has access to the project' do
+ context 'when the user has access to the project', :snowplow do
let(:user) { project.owner }
it 'increases the live preview view counter' do
- expect(Gitlab::UsageDataCounters::EditorUniqueCounter).to receive(:track_live_preview_edit_action).with(author: user)
+ expect(Gitlab::UsageDataCounters::EditorUniqueCounter).to receive(:track_live_preview_edit_action).with(author: user, project: project)
subject
expect(response).to have_gitlab_http_status(:ok)
end
+
+ it_behaves_like 'Snowplow event tracking' do
+ let(:project) { create(:project) }
+ let(:category) { 'ide_edit' }
+ let(:action) { 'g_edit_by_live_preview' }
+ let(:namespace) { project.namespace }
+ let(:feature_flag_name) { :route_hll_to_snowplow_phase2 }
+ end
end
end
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
index d50f1aa1dd8..e5ae1b04a86 100644
--- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
@@ -8,305 +8,294 @@ RSpec.describe Projects::Settings::CiCdController do
let(:project) { project_auto_devops.project }
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- describe 'GET show' do
- let_it_be(:parent_group) { create(:group) }
- let_it_be(:group) { create(:group, parent: parent_group) }
- let_it_be(:other_project) { create(:project, group: group) }
+ context 'as a maintainer' do
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
- it 'renders show with 200 status code' do
- get :show, params: { namespace_id: project.namespace, project_id: project }
+ describe 'GET show' do
+ let_it_be(:parent_group) { create(:group) }
+ let_it_be(:group) { create(:group, parent: parent_group) }
+ let_it_be(:other_project) { create(:project, group: group) }
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
- end
+ it 'renders show with 200 status code' do
+ get :show, params: { namespace_id: project.namespace, project_id: project }
- context 'with CI/CD disabled' do
- before do
- project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED)
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:show)
end
- it 'renders show with 404 status code' do
- get :show, params: { namespace_id: project.namespace, project_id: project }
- expect(response).to have_gitlab_http_status(:not_found)
+ context 'with CI/CD disabled' do
+ before do
+ project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED)
+ end
+
+ it 'renders show with 404 status code' do
+ get :show, params: { namespace_id: project.namespace, project_id: project }
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
- end
- context 'with group runners' do
- let_it_be(:group_runner) { create(:ci_runner, :group, groups: [group]) }
- let_it_be(:project_runner) { create(:ci_runner, :project, projects: [other_project]) }
- let_it_be(:shared_runner) { create(:ci_runner, :instance) }
+ context 'with group runners' do
+ let_it_be(:group_runner) { create(:ci_runner, :group, groups: [group]) }
+ let_it_be(:project_runner) { create(:ci_runner, :project, projects: [other_project]) }
+ let_it_be(:shared_runner) { create(:ci_runner, :instance) }
- it 'sets assignable project runners only' do
- group.add_maintainer(user)
+ it 'sets assignable project runners only' do
+ group.add_maintainer(user)
- get :show, params: { namespace_id: project.namespace, project_id: project }
+ get :show, params: { namespace_id: project.namespace, project_id: project }
- expect(assigns(:assignable_runners)).to contain_exactly(project_runner)
+ expect(assigns(:assignable_runners)).to contain_exactly(project_runner)
+ end
end
- end
- context 'prevents N+1 queries for tags' do
- render_views
+ context 'prevents N+1 queries for tags' do
+ render_views
- def show
- get :show, params: { namespace_id: project.namespace, project_id: project }
- end
+ def show
+ get :show, params: { namespace_id: project.namespace, project_id: project }
+ end
- it 'has the same number of queries with one tag or with many tags', :request_store do
- group.add_maintainer(user)
+ it 'has the same number of queries with one tag or with many tags', :request_store do
+ group.add_maintainer(user)
- show # warmup
+ show # warmup
- # with one tag
- create(:ci_runner, :instance, tag_list: %w(shared_runner))
- create(:ci_runner, :project, projects: [other_project], tag_list: %w(project_runner))
- create(:ci_runner, :group, groups: [group], tag_list: %w(group_runner))
- control = ActiveRecord::QueryRecorder.new { show }
+ # with one tag
+ create(:ci_runner, :instance, tag_list: %w(shared_runner))
+ create(:ci_runner, :project, projects: [other_project], tag_list: %w(project_runner))
+ create(:ci_runner, :group, groups: [group], tag_list: %w(group_runner))
+ control = ActiveRecord::QueryRecorder.new { show }
- # with several tags
- create(:ci_runner, :instance, tag_list: %w(shared_runner tag2 tag3))
- create(:ci_runner, :project, projects: [other_project], tag_list: %w(project_runner tag2 tag3))
- create(:ci_runner, :group, groups: [group], tag_list: %w(group_runner tag2 tag3))
+ # with several tags
+ create(:ci_runner, :instance, tag_list: %w(shared_runner tag2 tag3))
+ create(:ci_runner, :project, projects: [other_project], tag_list: %w(project_runner tag2 tag3))
+ create(:ci_runner, :group, groups: [group], tag_list: %w(group_runner tag2 tag3))
- expect { show }.not_to exceed_query_limit(control)
+ expect { show }.not_to exceed_query_limit(control)
+ end
end
end
- end
- describe '#reset_cache' do
- before do
- sign_in(user)
-
- project.add_maintainer(user)
+ describe '#reset_cache' do
+ before do
+ sign_in(user)
- allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(true)
- end
+ project.add_maintainer(user)
- subject { post :reset_cache, params: { namespace_id: project.namespace, project_id: project }, format: :json }
+ allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(true)
+ end
- it 'calls reset project cache service' do
- expect(ResetProjectCacheService).to receive_message_chain(:new, :execute)
+ subject { post :reset_cache, params: { namespace_id: project.namespace, project_id: project }, format: :json }
- subject
- end
+ it 'calls reset project cache service' do
+ expect(ResetProjectCacheService).to receive_message_chain(:new, :execute)
- context 'when service returns successfully' do
- it 'returns a success header' do
subject
-
- expect(response).to have_gitlab_http_status(:ok)
end
- end
- context 'when service does not return successfully' do
- before do
- allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(false)
+ context 'when service returns successfully' do
+ it 'returns a success header' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
end
- it 'returns an error header' do
- subject
+ context 'when service does not return successfully' do
+ before do
+ allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(false)
+ end
- expect(response).to have_gitlab_http_status(:bad_request)
+ it 'returns an error header' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
end
end
- end
- describe 'PUT #reset_registration_token' do
- subject { put :reset_registration_token, params: { namespace_id: project.namespace, project_id: project } }
+ describe 'PUT #reset_registration_token' do
+ subject { put :reset_registration_token, params: { namespace_id: project.namespace, project_id: project } }
- it 'resets runner registration token' do
- expect { subject }.to change { project.reload.runners_token }
- expect(flash[:toast]).to eq('New runners registration token has been generated!')
- end
+ it 'resets runner registration token' do
+ expect { subject }.to change { project.reload.runners_token }
+ expect(flash[:toast]).to eq('New runners registration token has been generated!')
+ end
- it 'redirects the user to admin runners page' do
- subject
+ it 'redirects the user to admin runners page' do
+ subject
- expect(response).to redirect_to(namespace_project_settings_ci_cd_path)
+ expect(response).to redirect_to(namespace_project_settings_ci_cd_path)
+ end
end
- end
- describe 'PATCH update' do
- let(:params) { { ci_config_path: '' } }
-
- subject do
- patch :update,
- params: {
- namespace_id: project.namespace.to_param,
- project_id: project,
- project: params
- }
- end
+ describe 'PATCH update' do
+ let(:params) { { ci_config_path: '' } }
- it 'redirects to the settings page' do
- subject
+ subject do
+ patch :update,
+ params: {
+ namespace_id: project.namespace.to_param,
+ project_id: project,
+ project: params
+ }
+ end
- expect(response).to have_gitlab_http_status(:found)
- expect(flash[:toast]).to eq("Pipelines settings for '#{project.name}' were successfully updated.")
- end
+ it 'redirects to the settings page' do
+ subject
- context 'when updating the auto_devops settings' do
- let(:params) { { auto_devops_attributes: { enabled: '' } } }
+ expect(response).to have_gitlab_http_status(:found)
+ expect(flash[:toast]).to eq("Pipelines settings for '#{project.name}' were successfully updated.")
+ end
- context 'following the instance default' do
+ context 'when updating the auto_devops settings' do
let(:params) { { auto_devops_attributes: { enabled: '' } } }
- it 'allows enabled to be set to nil' do
- subject
- project_auto_devops.reload
+ context 'following the instance default' do
+ let(:params) { { auto_devops_attributes: { enabled: '' } } }
- expect(project_auto_devops.enabled).to be_nil
- end
- end
+ it 'allows enabled to be set to nil' do
+ subject
+ project_auto_devops.reload
- context 'when run_auto_devops_pipeline is true' do
- before do
- expect_next_instance_of(Projects::UpdateService) do |instance|
- expect(instance).to receive(:run_auto_devops_pipeline?).and_return(true)
+ expect(project_auto_devops.enabled).to be_nil
end
end
- context 'when the project repository is empty' do
- it 'sets a notice flash' do
- subject
-
- expect(controller).to set_flash[:notice]
+ context 'when run_auto_devops_pipeline is true' do
+ before do
+ expect_next_instance_of(Projects::UpdateService) do |instance|
+ expect(instance).to receive(:run_auto_devops_pipeline?).and_return(true)
+ end
end
- it 'does not queue a CreatePipelineWorker' do
- expect(CreatePipelineWorker).not_to receive(:perform_async).with(project.id, user.id, project.default_branch, :web, any_args)
+ context 'when the project repository is empty' do
+ it 'sets a notice flash' do
+ subject
- subject
+ expect(controller).to set_flash[:notice]
+ end
+
+ it 'does not queue a CreatePipelineWorker' do
+ expect(CreatePipelineWorker).not_to receive(:perform_async).with(project.id, user.id, project.default_branch, :web, any_args)
+
+ subject
+ end
end
- end
- context 'when the project repository is not empty' do
- let(:project) { create(:project, :repository) }
+ context 'when the project repository is not empty' do
+ let(:project) { create(:project, :repository) }
- it 'displays a toast message' do
- allow(CreatePipelineWorker).to receive(:perform_async).with(project.id, user.id, project.default_branch, :web, any_args)
+ it 'displays a toast message' do
+ allow(CreatePipelineWorker).to receive(:perform_async).with(project.id, user.id, project.default_branch, :web, any_args)
- subject
+ subject
- expect(controller).to set_flash[:toast]
- end
+ expect(controller).to set_flash[:toast]
+ end
- it 'queues a CreatePipelineWorker' do
- expect(CreatePipelineWorker).to receive(:perform_async).with(project.id, user.id, project.default_branch, :web, any_args)
+ it 'queues a CreatePipelineWorker' do
+ expect(CreatePipelineWorker).to receive(:perform_async).with(project.id, user.id, project.default_branch, :web, any_args)
- subject
- end
+ subject
+ end
- it 'creates a pipeline', :sidekiq_inline do
- project.repository.create_file(user, 'Gemfile', 'Gemfile contents',
- message: 'Add Gemfile',
- branch_name: 'master')
+ it 'creates a pipeline', :sidekiq_inline do
+ project.repository.create_file(user, 'Gemfile', 'Gemfile contents',
+ message: 'Add Gemfile',
+ branch_name: 'master')
- expect { subject }.to change { Ci::Pipeline.count }.by(1)
+ expect { subject }.to change { Ci::Pipeline.count }.by(1)
+ end
end
end
- end
- context 'when run_auto_devops_pipeline is not true' do
- before do
- expect_next_instance_of(Projects::UpdateService) do |instance|
- expect(instance).to receive(:run_auto_devops_pipeline?).and_return(false)
+ context 'when run_auto_devops_pipeline is not true' do
+ before do
+ expect_next_instance_of(Projects::UpdateService) do |instance|
+ expect(instance).to receive(:run_auto_devops_pipeline?).and_return(false)
+ end
end
- end
- it 'does not queue a CreatePipelineWorker' do
- expect(CreatePipelineWorker).not_to receive(:perform_async).with(project.id, user.id, :web, any_args)
+ it 'does not queue a CreatePipelineWorker' do
+ expect(CreatePipelineWorker).not_to receive(:perform_async).with(project.id, user.id, :web, any_args)
- subject
+ subject
+ end
end
end
- end
- context 'when updating general settings' do
- context 'when build_timeout_human_readable is not specified' do
- let(:params) { { build_timeout_human_readable: '' } }
+ context 'when updating general settings' do
+ context 'when build_timeout_human_readable is not specified' do
+ let(:params) { { build_timeout_human_readable: '' } }
- it 'set default timeout' do
- subject
+ it 'set default timeout' do
+ subject
- project.reload
- expect(project.build_timeout).to eq(3600)
+ project.reload
+ expect(project.build_timeout).to eq(3600)
+ end
end
- end
- context 'when build_timeout_human_readable is specified' do
- let(:params) { { build_timeout_human_readable: '1h 30m' } }
+ context 'when build_timeout_human_readable is specified' do
+ let(:params) { { build_timeout_human_readable: '1h 30m' } }
- it 'set specified timeout' do
- subject
+ it 'set specified timeout' do
+ subject
- project.reload
- expect(project.build_timeout).to eq(5400)
+ project.reload
+ expect(project.build_timeout).to eq(5400)
+ end
end
- end
-
- context 'when build_timeout_human_readable is invalid' do
- let(:params) { { build_timeout_human_readable: '5m' } }
- it 'set specified timeout' do
- subject
-
- expect(controller).to set_flash[:alert]
- expect(response).to redirect_to(namespace_project_settings_ci_cd_path)
- end
- end
+ context 'when build_timeout_human_readable is invalid' do
+ let(:params) { { build_timeout_human_readable: '5m' } }
- context 'when default_git_depth is not specified' do
- let(:params) { { ci_cd_settings_attributes: { default_git_depth: 10 } } }
+ it 'set specified timeout' do
+ subject
- before do
- project.ci_cd_settings.update!(default_git_depth: nil)
+ expect(controller).to set_flash[:alert]
+ expect(response).to redirect_to(namespace_project_settings_ci_cd_path)
+ end
end
- it 'set specified git depth' do
- subject
+ context 'when default_git_depth is not specified' do
+ let(:params) { { ci_cd_settings_attributes: { default_git_depth: 10 } } }
- project.reload
- expect(project.ci_default_git_depth).to eq(10)
- end
- end
+ before do
+ project.ci_cd_settings.update!(default_git_depth: nil)
+ end
- context 'when forward_deployment_enabled is not specified' do
- let(:params) { { ci_cd_settings_attributes: { forward_deployment_enabled: false } } }
+ it 'set specified git depth' do
+ subject
- before do
- project.ci_cd_settings.update!(forward_deployment_enabled: nil)
+ project.reload
+ expect(project.ci_default_git_depth).to eq(10)
+ end
end
- it 'sets forward deployment enabled' do
- subject
-
- project.reload
- expect(project.ci_forward_deployment_enabled).to eq(false)
- end
- end
+ context 'when forward_deployment_enabled is not specified' do
+ let(:params) { { ci_cd_settings_attributes: { forward_deployment_enabled: false } } }
- context 'when max_artifacts_size is specified' do
- let(:params) { { max_artifacts_size: 10 } }
+ before do
+ project.ci_cd_settings.update!(forward_deployment_enabled: nil)
+ end
- context 'and user is not an admin' do
- it 'does not set max_artifacts_size' do
+ it 'sets forward deployment enabled' do
subject
project.reload
- expect(project.max_artifacts_size).to be_nil
+ expect(project.ci_forward_deployment_enabled).to eq(false)
end
end
- context 'and user is an admin' do
- let(:user) { create(:admin) }
+ context 'when max_artifacts_size is specified' do
+ let(:params) { { max_artifacts_size: 10 } }
- context 'with admin mode disabled' do
+ context 'and user is not an admin' do
it 'does not set max_artifacts_size' do
subject
@@ -315,33 +304,81 @@ RSpec.describe Projects::Settings::CiCdController do
end
end
- context 'with admin mode enabled', :enable_admin_mode do
- it 'sets max_artifacts_size' do
- subject
+ context 'and user is an admin' do
+ let(:user) { create(:admin) }
- project.reload
- expect(project.max_artifacts_size).to eq(10)
+ context 'with admin mode disabled' do
+ it 'does not set max_artifacts_size' do
+ subject
+
+ project.reload
+ expect(project.max_artifacts_size).to be_nil
+ end
+ end
+
+ context 'with admin mode enabled', :enable_admin_mode do
+ it 'sets max_artifacts_size' do
+ subject
+
+ project.reload
+ expect(project.max_artifacts_size).to eq(10)
+ end
end
end
end
end
end
+
+ describe 'GET #runner_setup_scripts' do
+ it 'renders the setup scripts' do
+ get :runner_setup_scripts, params: { os: 'linux', arch: 'amd64', namespace_id: project.namespace, project_id: project }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to have_key("install")
+ expect(json_response).to have_key("register")
+ end
+
+ it 'renders errors if they occur' do
+ get :runner_setup_scripts, params: { os: 'foo', arch: 'bar', namespace_id: project.namespace, project_id: project }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response).to have_key("errors")
+ end
+ end
end
- describe 'GET #runner_setup_scripts' do
- it 'renders the setup scripts' do
- get :runner_setup_scripts, params: { os: 'linux', arch: 'amd64', namespace_id: project.namespace, project_id: project }
+ context 'as a developer' do
+ before do
+ sign_in(user)
+ project.add_developer(user)
+ get :show, params: { namespace_id: project.namespace, project_id: project }
+ end
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to have_key("install")
- expect(json_response).to have_key("register")
+ it 'responds with 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
end
+ end
- it 'renders errors if they occur' do
- get :runner_setup_scripts, params: { os: 'foo', arch: 'bar', namespace_id: project.namespace, project_id: project }
+ context 'as a reporter' do
+ before do
+ sign_in(user)
+ project.add_reporter(user)
+ get :show, params: { namespace_id: project.namespace, project_id: project }
+ end
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response).to have_key("errors")
+ it 'responds with 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'as an unauthenticated user' do
+ before do
+ get :show, params: { namespace_id: project.namespace, project_id: project }
+ end
+
+ it 'redirects to sign in' do
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response).to redirect_to('/users/sign_in')
end
end
end
diff --git a/spec/controllers/projects/settings/integrations_controller_spec.rb b/spec/controllers/projects/settings/integrations_controller_spec.rb
index e6ca088a533..8ee9f22aa7f 100644
--- a/spec/controllers/projects/settings/integrations_controller_spec.rb
+++ b/spec/controllers/projects/settings/integrations_controller_spec.rb
@@ -138,7 +138,7 @@ RSpec.describe Projects::Settings::IntegrationsController do
end
end
- context 'when unsuccessful' do
+ context 'when unsuccessful', :clean_gitlab_redis_rate_limiting 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)
@@ -148,7 +148,7 @@ RSpec.describe Projects::Settings::IntegrationsController do
expect(response).to be_successful
expect(json_response).to eq(
'error' => true,
- 'message' => 'Connection failed. Please check your settings.',
+ 'message' => 'Connection failed. Check your integration settings.',
'service_response' => '',
'test_failed' => true
)
@@ -163,7 +163,7 @@ RSpec.describe Projects::Settings::IntegrationsController do
expect(response).to be_successful
expect(json_response).to eq(
'error' => true,
- 'message' => 'Connection failed. Please check your settings.',
+ 'message' => 'Connection failed. Check your integration settings.',
'service_response' => "URL 'http://127.0.0.1' is blocked: Requests to localhost are not allowed",
'test_failed' => true
)
@@ -177,13 +177,33 @@ RSpec.describe Projects::Settings::IntegrationsController do
expect(response).to be_successful
expect(json_response).to eq(
'error' => true,
- 'message' => 'Connection failed. Please check your settings.',
+ 'message' => 'Connection failed. Check your integration settings.',
'service_response' => 'Connection refused',
'test_failed' => true
)
end
end
end
+
+ context 'when the endpoint receives requests above the limit', :freeze_time, :clean_gitlab_redis_rate_limiting do
+ before do
+ allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
+ .and_return(project_testing_integration: { threshold: 1, interval: 1.minute })
+ end
+
+ it 'prevents making test requests' do
+ stub_jira_integration_test
+
+ expect_next_instance_of(::Integrations::Test::ProjectService) do |service|
+ expect(service).to receive(:execute).and_return(http_status: 200)
+ end
+
+ 2.times { post :test, params: project_params(service: integration_params) }
+
+ expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.'))
+ expect(response).to have_gitlab_http_status(:too_many_requests)
+ end
+ end
end
describe 'PUT #update' do
diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb
index c1fa91e9f8b..76d8191e342 100644
--- a/spec/controllers/projects/settings/operations_controller_spec.rb
+++ b/spec/controllers/projects/settings/operations_controller_spec.rb
@@ -437,108 +437,6 @@ RSpec.describe Projects::Settings::OperationsController do
end
end
- context 'tracing integration' do
- describe 'GET #show' do
- context 'with existing setting' do
- let_it_be(:setting) do
- create(:project_tracing_setting, project: project)
- end
-
- it 'loads existing setting' do
- get :show, params: project_params(project)
-
- expect(controller.helpers.tracing_setting).to eq(setting)
- end
- end
-
- context 'without an existing setting' do
- it 'builds a new setting' do
- get :show, params: project_params(project)
-
- expect(controller.helpers.tracing_setting).to be_new_record
- end
- end
- end
-
- describe 'PATCH #update' do
- let_it_be(:external_url) { 'https://gitlab.com' }
-
- let(:params) do
- {
- tracing_setting_attributes: {
- external_url: external_url
- }
- }
- end
-
- it_behaves_like 'PATCHable'
-
- describe 'gitlab tracking', :snowplow do
- shared_examples 'event tracking' do
- it 'tracks an event' do
- expect_snowplow_event(
- category: 'project:operations:tracing',
- action: 'external_url_populated',
- user: user,
- project: project,
- namespace: project.namespace
- )
- end
- end
-
- shared_examples 'no event tracking' do
- it 'does not track an event' do
- expect_no_snowplow_event
- end
- end
-
- before do
- make_request
- end
-
- subject(:make_request) do
- patch :update, params: project_params(project, params), format: :json
- end
-
- context 'without existing setting' do
- context 'when creating a new setting' do
- it_behaves_like 'event tracking'
- end
-
- context 'with invalid external_url' do
- let_it_be(:external_url) { nil }
-
- it_behaves_like 'no event tracking'
- end
- end
-
- context 'with existing setting' do
- let_it_be(:existing_setting) do
- create(:project_tracing_setting,
- project: project,
- external_url: external_url)
- end
-
- context 'when changing external_url' do
- let_it_be(:external_url) { 'https://example.com' }
-
- it_behaves_like 'no event tracking'
- end
-
- context 'with unchanged external_url' do
- it_behaves_like 'no event tracking'
- end
-
- context 'with invalid external_url' do
- let_it_be(:external_url) { nil }
-
- it_behaves_like 'no event tracking'
- end
- end
- end
- end
- end
-
private
def project_params(project, params = {})
diff --git a/spec/controllers/projects/tracings_controller_spec.rb b/spec/controllers/projects/tracings_controller_spec.rb
deleted file mode 100644
index 80e21349e20..00000000000
--- a/spec/controllers/projects/tracings_controller_spec.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::TracingsController do
- let_it_be(:user) { create(:user) }
-
- describe 'GET show' do
- shared_examples 'user with read access' do |visibility_level|
- let(:project) { create(:project, visibility_level) }
-
- %w[developer maintainer].each do |role|
- context "with a #{visibility_level} project and #{role} role" do
- before do
- project.add_role(user, role)
- end
-
- it 'renders OK' do
- get :show, params: { namespace_id: project.namespace, project_id: project }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
- end
- end
- end
- end
-
- shared_examples 'user without read access' do |visibility_level|
- let(:project) { create(:project, visibility_level) }
-
- %w[guest reporter].each do |role|
- context "with a #{visibility_level} project and #{role} role" do
- before do
- project.add_role(user, role)
- end
-
- it 'returns 404' do
- get :show, params: { namespace_id: project.namespace, project_id: project }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
- end
-
- before do
- sign_in(user)
- end
-
- context 'with maintainer role' do
- it_behaves_like 'user with read access', :public
- it_behaves_like 'user with read access', :internal
- it_behaves_like 'user with read access', :private
-
- context 'feature flag disabled' do
- before do
- stub_feature_flags(monitor_tracing: false)
- end
-
- it_behaves_like 'user without read access', :public
- it_behaves_like 'user without read access', :internal
- it_behaves_like 'user without read access', :private
- end
- end
-
- context 'without maintainer role' do
- it_behaves_like 'user without read access', :public
- it_behaves_like 'user without read access', :internal
- it_behaves_like 'user without read access', :private
- end
- end
-end
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 537f7aa5fee..34477a7bb68 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -409,7 +409,7 @@ RSpec.describe ProjectsController do
before do
project.update!(visibility: project_visibility.to_s)
- project.team.add_user(user, :guest) if user_type == :member
+ project.team.add_member(user, :guest) if user_type == :member
sign_in(user) unless user_type == :anonymous
end
@@ -1432,9 +1432,11 @@ RSpec.describe ProjectsController do
shared_examples 'rate limits project export endpoint' do
before do
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(Gitlab::ApplicationRateLimiter.rate_limits["project_#{action}".to_sym][:threshold].call + 1)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy)
+ .to receive(:increment)
+ .and_return(Gitlab::ApplicationRateLimiter.rate_limits["project_#{action}".to_sym][:threshold].call + 1)
+ end
end
it 'prevents requesting project export' do
@@ -1546,9 +1548,11 @@ RSpec.describe ProjectsController do
context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_rate_limiting do
before do
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:project_download_export][:threshold].call + 1)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy)
+ .to receive(:increment)
+ .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:project_download_export][:threshold].call + 1)
+ end
end
it 'prevents requesting project export' do
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 36b230103db..c5a97812d1f 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -178,7 +178,8 @@ RSpec.describe RegistrationsController do
category: 'RegistrationsController',
action: 'accepted',
label: 'invite_email',
- property: member.id.to_s
+ property: member.id.to_s,
+ user: member.reload.user
)
end
end
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index 4abcd414e51..b4d4e01e972 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -67,7 +67,7 @@ RSpec.describe SearchController do
end
end
- describe 'GET #show' do
+ describe 'GET #show', :snowplow do
it_behaves_like 'when the user cannot read cross project', :show, { search: 'hello' } do
it 'still allows accessing the search page' do
get :show
@@ -257,6 +257,16 @@ RSpec.describe SearchController do
end
end
+ it_behaves_like 'Snowplow event tracking' do
+ subject { get :show, params: { group_id: namespace.id, scope: 'blobs', search: 'term' } }
+
+ let(:project) { nil }
+ let(:category) { described_class.to_s }
+ let(:action) { 'i_search_total' }
+ let(:namespace) { create(:group) }
+ let(:feature_flag_name) { :route_hll_to_snowplow_phase2 }
+ end
+
context 'on restricted projects' do
context 'when signed out' do
before do
@@ -398,10 +408,11 @@ RSpec.describe SearchController do
expect(payload[:metadata]['meta.search.filters.confidential']).to eq('true')
expect(payload[:metadata]['meta.search.filters.state']).to eq('true')
expect(payload[:metadata]['meta.search.project_ids']).to eq(%w(456 789))
- expect(payload[:metadata]['meta.search.search_level']).to eq('multi-project')
+ expect(payload[:metadata]['meta.search.type']).to eq('basic')
+ expect(payload[:metadata]['meta.search.level']).to eq('global')
end
- get :show, params: { scope: 'issues', search: 'hello world', group_id: '123', project_id: '456', project_ids: %w(456 789), search_level: 'multi-project', confidential: true, state: true, force_search_results: true }
+ get :show, params: { scope: 'issues', search: 'hello world', group_id: '123', project_id: '456', project_ids: %w(456 789), confidential: true, state: true, force_search_results: true }
end
it 'appends the default scope in meta.search.scope' do
@@ -413,6 +424,16 @@ RSpec.describe SearchController do
get :show, params: { search: 'hello world', group_id: '123', project_id: '456' }
end
+
+ it 'appends the search time based on the search' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata][:global_search_duration_s]).to be_a_kind_of(Numeric)
+ end
+
+ get :show, params: { search: 'hello world', group_id: '123', project_id: '456' }
+ end
end
context 'abusive searches', :aggregate_failures do
@@ -430,18 +451,6 @@ RSpec.describe SearchController do
make_abusive_request
expect(response).to have_gitlab_http_status(:ok)
end
-
- context 'when the feature flag is disabled' do
- before do
- stub_feature_flags(prevent_abusive_searches: false)
- end
-
- it 'returns a regular search result' do
- expect(Gitlab::EmptySearchResults).not_to receive(:new)
- make_abusive_request
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
end
end
diff --git a/spec/db/docs_spec.rb b/spec/db/docs_spec.rb
index 20746e107fb..ad3705c3dbe 100644
--- a/spec/db/docs_spec.rb
+++ b/spec/db/docs_spec.rb
@@ -4,8 +4,11 @@ require 'spec_helper'
RSpec.describe 'Database Documentation' do
context 'for each table' do
+ # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/366834
+ let(:database_base_models) { Gitlab::Database.database_base_models.select { |k, _| k != 'geo' } }
+
let(:all_tables) do
- Gitlab::Database.database_base_models.flat_map { |_, m| m.connection.tables }.sort.uniq
+ database_base_models.flat_map { |_, m| m.connection.tables }.sort.uniq
end
let(:metadata_required_fields) do
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 8070e17b7af..bd13f86034a 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -114,11 +114,17 @@ RSpec.describe 'Database schema' do
context 'all foreign keys' do
# for index to be effective, the FK constraint has to be at first place
it 'are indexed' do
- first_indexed_column = indexes.map(&:columns).map do |columns|
+ first_indexed_column = indexes.filter_map do |index|
+ columns = index.columns
+
# In cases of complex composite indexes, a string is returned eg:
# "lower((extern_uid)::text), group_id"
columns = columns.split(',') if columns.is_a?(String)
- columns.first.chomp
+ column = columns.first.chomp
+
+ # A partial index is not suitable for a foreign key column, unless
+ # the only condition is for the presence of the foreign key itself
+ column if index.where.nil? || index.where == "(#{column} IS NOT NULL)"
end
foreign_keys_columns = all_foreign_keys.map(&:column)
required_indexed_columns = foreign_keys_columns - ignored_index_columns(table)
diff --git a/spec/events/pages/page_deleted_event_spec.rb b/spec/events/pages/page_deleted_event_spec.rb
index ee05b770c48..8fcd807eeb4 100644
--- a/spec/events/pages/page_deleted_event_spec.rb
+++ b/spec/events/pages/page_deleted_event_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Pages::PageDeletedEvent do
where(:data, :valid) do
[
[{ project_id: 1, namespace_id: 2 }, true],
+ [{ project_id: 1, namespace_id: 2, root_namespace_id: 3 }, true],
[{ project_id: 1 }, false],
[{ namespace_id: 1 }, false],
[{ project_id: 'foo', namespace_id: 2 }, false],
diff --git a/spec/events/pages/page_deployed_event_spec.rb b/spec/events/pages/page_deployed_event_spec.rb
new file mode 100644
index 00000000000..0c33a95b281
--- /dev/null
+++ b/spec/events/pages/page_deployed_event_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Pages::PageDeployedEvent do
+ where(:data, :valid) do
+ [
+ [{ project_id: 1, namespace_id: 2, root_namespace_id: 3 }, true],
+ [{ project_id: 1 }, false],
+ [{ namespace_id: 1 }, false],
+ [{ project_id: 'foo', namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: 'foo' }, false],
+ [{ project_id: [], namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: [] }, false],
+ [{ project_id: {}, namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: {} }, false],
+ ['foo', false],
+ [123, false],
+ [[], false]
+ ]
+ end
+
+ with_them do
+ it 'validates data' do
+ constructor = -> { described_class.new(data: data) }
+
+ if valid
+ expect { constructor.call }.not_to raise_error
+ else
+ expect { constructor.call }.to raise_error(Gitlab::EventStore::InvalidEvent)
+ end
+ end
+ end
+end
diff --git a/spec/events/projects/project_created_event_spec.rb b/spec/events/projects/project_created_event_spec.rb
new file mode 100644
index 00000000000..d70c737afb0
--- /dev/null
+++ b/spec/events/projects/project_created_event_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ProjectCreatedEvent do
+ where(:data, :valid) do
+ [
+ [{ project_id: 1, namespace_id: 2, root_namespace_id: 3 }, true],
+ [{ project_id: 1 }, false],
+ [{ namespace_id: 1 }, false],
+ [{ project_id: 'foo', namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: 'foo' }, false],
+ [{ project_id: [], namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: [] }, false],
+ [{ project_id: {}, namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: {} }, false],
+ ['foo', false],
+ [123, false],
+ [[], false]
+ ]
+ end
+
+ with_them do
+ it 'validates data' do
+ constructor = -> { described_class.new(data: data) }
+
+ if valid
+ expect { constructor.call }.not_to raise_error
+ else
+ expect { constructor.call }.to raise_error(Gitlab::EventStore::InvalidEvent)
+ end
+ end
+ end
+end
diff --git a/spec/events/projects/project_deleted_event_spec.rb b/spec/events/projects/project_deleted_event_spec.rb
index fd8cec7271b..c3de2b22224 100644
--- a/spec/events/projects/project_deleted_event_spec.rb
+++ b/spec/events/projects/project_deleted_event_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Projects::ProjectDeletedEvent do
where(:data, :valid) do
[
[{ project_id: 1, namespace_id: 2 }, true],
+ [{ project_id: 1, namespace_id: 2, root_namespace_id: 3 }, true],
[{ project_id: 1 }, false],
[{ namespace_id: 1 }, false],
[{ project_id: 'foo', namespace_id: 2 }, false],
diff --git a/spec/events/projects/project_path_changed_event_spec.rb b/spec/events/projects/project_path_changed_event_spec.rb
new file mode 100644
index 00000000000..a157428de04
--- /dev/null
+++ b/spec/events/projects/project_path_changed_event_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ProjectPathChangedEvent do
+ where(:data, :valid) do
+ valid_event = {
+ project_id: 1,
+ namespace_id: 2,
+ root_namespace_id: 3,
+ old_path: 'old',
+ new_path: 'new'
+ }
+
+ # All combinations of missing keys
+ with_missing_keys = 0.upto(valid_event.size - 1)
+ .flat_map { |size| valid_event.keys.combination(size).to_a }
+ .map { |keys| [valid_event.slice(*keys), false] }
+
+ [
+ [valid_event, true],
+ *with_missing_keys,
+ [{ project_id: 'foo', namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: 'foo' }, false],
+ [{ project_id: [], namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: [] }, false],
+ [{ project_id: {}, namespace_id: 2 }, false],
+ [{ project_id: 1, namespace_id: {} }, false],
+ ['foo', false],
+ [123, false],
+ [[], false]
+ ]
+ end
+
+ with_them do
+ it 'validates data' do
+ constructor = -> { described_class.new(data: data) }
+
+ if valid
+ expect { constructor.call }.not_to raise_error
+ else
+ expect { constructor.call }.to raise_error(Gitlab::EventStore::InvalidEvent)
+ end
+ end
+ end
+end
diff --git a/spec/factories/ci/runner_versions.rb b/spec/factories/ci/runner_versions.rb
new file mode 100644
index 00000000000..69127aa6e54
--- /dev/null
+++ b/spec/factories/ci/runner_versions.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ci_runner_version, class: 'Ci::RunnerVersion' do
+ sequence(:version) { |n| "1.0.#{n}" }
+ end
+end
diff --git a/spec/factories/ci/stages.rb b/spec/factories/ci/stages.rb
index 4751c04584e..41297b01f92 100644
--- a/spec/factories/ci/stages.rb
+++ b/spec/factories/ci/stages.rb
@@ -1,24 +1,7 @@
# frozen_string_literal: true
FactoryBot.define do
- factory :ci_stage, class: 'Ci::LegacyStage' do
- skip_create
-
- transient do
- name { 'test' }
- status { nil }
- warnings { nil }
- pipeline factory: :ci_empty_pipeline
- end
-
- initialize_with do
- Ci::LegacyStage.new(pipeline, name: name,
- status: status,
- warnings: warnings)
- end
- end
-
- factory :ci_stage_entity, class: 'Ci::Stage' do
+ factory :ci_stage, class: 'Ci::Stage' do
project factory: :project
pipeline factory: :ci_empty_pipeline
diff --git a/spec/factories/clusters/applications/helm.rb b/spec/factories/clusters/applications/helm.rb
index 919b45e57e2..6a21df943f5 100644
--- a/spec/factories/clusters/applications/helm.rb
+++ b/spec/factories/clusters/applications/helm.rb
@@ -103,10 +103,6 @@ FactoryBot.define do
cluster factory: %i(cluster with_installed_helm provided_by_gcp)
end
- factory :clusters_applications_elastic_stack, class: 'Clusters::Applications::ElasticStack' do
- cluster factory: %i(cluster with_installed_helm provided_by_gcp)
- end
-
factory :clusters_applications_crossplane, class: 'Clusters::Applications::Crossplane' do
stack { 'gcp' }
cluster factory: %i(cluster with_installed_helm provided_by_gcp)
diff --git a/spec/factories/clusters/clusters.rb b/spec/factories/clusters/clusters.rb
index 7666533691e..72424a3c321 100644
--- a/spec/factories/clusters/clusters.rb
+++ b/spec/factories/clusters/clusters.rb
@@ -100,7 +100,6 @@ FactoryBot.define do
application_runner factory: %i(clusters_applications_runner installed)
application_jupyter factory: %i(clusters_applications_jupyter installed)
application_knative factory: %i(clusters_applications_knative installed)
- application_elastic_stack factory: %i(clusters_applications_elastic_stack installed)
application_cilium factory: %i(clusters_applications_cilium installed)
end
diff --git a/spec/factories/clusters/integrations/elastic_stack.rb b/spec/factories/clusters/integrations/elastic_stack.rb
deleted file mode 100644
index 1ab3256845b..00000000000
--- a/spec/factories/clusters/integrations/elastic_stack.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- factory :clusters_integrations_elastic_stack, class: 'Clusters::Integrations::ElasticStack' do
- cluster factory: %i(cluster provided_by_gcp)
- enabled { true }
-
- trait :disabled do
- enabled { false }
- end
- end
-end
diff --git a/spec/factories/error_tracking/open_api.rb b/spec/factories/error_tracking/open_api.rb
new file mode 100644
index 00000000000..ad134701fd0
--- /dev/null
+++ b/spec/factories/error_tracking/open_api.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :error_tracking_open_api_error, class: 'ErrorTrackingOpenAPI::Error' do
+ fingerprint { 1 }
+ project_id { 2 }
+ name { 'ActionView::MissingTemplate' }
+ description { 'Missing template posts/edit' }
+ actor { 'PostsController#edit' }
+ event_count { 3 }
+ approximated_user_count { 4 }
+ first_seen_at { Time.now.iso8601 }
+ last_seen_at { Time.now.iso8601 }
+ status { 'unresolved' }
+
+ skip_create
+ end
+
+ factory :error_tracking_open_api_error_event, class: 'ErrorTrackingOpenAPI::ErrorEvent' do
+ fingerprint { 1 }
+ project_id { 2 }
+ payload { File.read(Rails.root.join('spec/fixtures/error_tracking/parsed_event.json')) }
+ name { 'ActionView::MissingTemplate' }
+ description { 'Missing template posts/edit' }
+ actor { 'PostsController#edit' }
+ environment { 'development' }
+ platform { 'ruby' }
+
+ trait :golang do
+ payload { File.read(Rails.root.join('spec/fixtures/error_tracking/go_parsed_event.json')) }
+ platform { 'go' }
+ end
+
+ trait :browser do
+ payload { File.read(Rails.root.join('spec/fixtures/error_tracking/browser_event.json')) }
+ platform { 'javascript' }
+ end
+
+ skip_create
+ end
+end
diff --git a/spec/factories/gitlab/database/postgres_autovacuum_activity.rb b/spec/factories/gitlab/database/postgres_autovacuum_activity.rb
new file mode 100644
index 00000000000..a770da19a43
--- /dev/null
+++ b/spec/factories/gitlab/database/postgres_autovacuum_activity.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :postgres_autovacuum_activity, class: 'Gitlab::Database::PostgresAutovacuumActivity' do
+ table_identifier { "#{schema}.#{table}" }
+ schema { 'public' }
+ table { 'projects' }
+ vacuum_start { Time.zone.now - 3.minutes }
+ end
+end
diff --git a/spec/factories/import_states.rb b/spec/factories/import_states.rb
index 4dca78b1059..0c73082be57 100644
--- a/spec/factories/import_states.rb
+++ b/spec/factories/import_states.rb
@@ -34,6 +34,10 @@ FactoryBot.define do
status { :failed }
end
+ trait :canceled do
+ status { :canceled }
+ end
+
after(:create) do |import_state, evaluator|
columns = {}
columns[:import_url] = evaluator.import_url unless evaluator.import_url.blank?
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index 3945637c2c3..5ac26b7a260 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -233,7 +233,7 @@ FactoryBot.define do
factory :harbor_integration, class: 'Integrations::Harbor' do
project
active { true }
- type { 'HarborService' }
+ type { 'Integrations::Harbor' }
url { 'https://demo.goharbor.io' }
project_name { 'testproject' }
diff --git a/spec/factories/keys.rb b/spec/factories/keys.rb
index a7478ce2657..f6f06a99494 100644
--- a/spec/factories/keys.rb
+++ b/spec/factories/keys.rb
@@ -3,8 +3,13 @@
FactoryBot.define do
factory :key do
title
- key { SSHData::PrivateKey::RSA.generate(1024, unsafe_allow_small_key: true).public_key.openssh(comment: 'dummy@gitlab.com') }
-
+ key do
+ # Larger keys take longer to generate, and since this factory gets called frequently,
+ # let's only create the smallest one we need.
+ SSHData::PrivateKey::RSA.generate(
+ ::Gitlab::SSHPublicKey.supported_sizes(:rsa).min, unsafe_allow_small_key: true
+ ).public_key.openssh(comment: 'dummy@gitlab.com')
+ end
trait :expired do
to_create { |key| key.save!(validate: false) }
expires_at { 2.days.ago }
@@ -15,8 +20,14 @@ FactoryBot.define do
expires_at { Date.today.beginning_of_day + 3.hours }
end
+ trait :without_md5_fingerprint do
+ after(:create) do |key|
+ key.update_column(:fingerprint, nil)
+ end
+ end
+
factory :key_without_comment do
- key { SSHData::PrivateKey::RSA.generate(1024, unsafe_allow_small_key: true).public_key.openssh }
+ key { SSHData::PrivateKey::RSA.generate(3072, unsafe_allow_small_key: true).public_key.openssh }
end
factory :deploy_key, class: 'DeployKey'
diff --git a/spec/factories/oauth_access_tokens.rb b/spec/factories/oauth_access_tokens.rb
index 8d1075dacbb..8fd8aef9b49 100644
--- a/spec/factories/oauth_access_tokens.rb
+++ b/spec/factories/oauth_access_tokens.rb
@@ -5,6 +5,7 @@ FactoryBot.define do
resource_owner
application
token { Doorkeeper::OAuth::Helpers::UniqueToken.generate }
+ refresh_token { Doorkeeper::OAuth::Helpers::UniqueToken.generate }
scopes { application.scopes }
end
end
diff --git a/spec/factories/project_group_links.rb b/spec/factories/project_group_links.rb
index b1b0f04d84c..84c590e3ea1 100644
--- a/spec/factories/project_group_links.rb
+++ b/spec/factories/project_group_links.rb
@@ -13,7 +13,7 @@ FactoryBot.define do
trait(:maintainer) { group_access { Gitlab::Access::MAINTAINER } }
after(:create) do |project_group_link, evaluator|
- project_group_link.group.refresh_members_authorized_projects
+ AuthorizedProjectUpdate::ProjectRecalculateService.new(project_group_link.project).execute
end
end
end
diff --git a/spec/factories/project_hooks.rb b/spec/factories/project_hooks.rb
index e0b61526ba0..dbb5c357acb 100644
--- a/spec/factories/project_hooks.rb
+++ b/spec/factories/project_hooks.rb
@@ -7,7 +7,7 @@ FactoryBot.define do
project
trait :token do
- token { SecureRandom.hex(10) }
+ token { generate(:token) }
end
trait :all_events_enabled do
@@ -29,5 +29,9 @@ FactoryBot.define do
trait :with_push_branch_filter do
push_events_branch_filter { 'my-branch-*' }
end
+
+ trait :permanently_disabled do
+ recent_failures { WebHook::FAILURE_THRESHOLD + 1 }
+ end
end
end
diff --git a/spec/factories/project_tracing_settings.rb b/spec/factories/project_tracing_settings.rb
deleted file mode 100644
index 05c1529c18e..00000000000
--- a/spec/factories/project_tracing_settings.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- factory :project_tracing_setting do
- project
- external_url { 'https://example.com' }
- end
-end
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index 86321350962..d60512e2b2a 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -98,7 +98,9 @@ FactoryBot.define do
project.add_owner(project.first_owner)
end
- project.group&.refresh_members_authorized_projects
+ if project.group
+ AuthorizedProjectUpdate::ProjectRecalculateService.new(project).execute
+ end
# assign the delegated `#ci_cd_settings` attributes after create
project.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil?
@@ -151,6 +153,10 @@ FactoryBot.define do
import_status { :failed }
end
+ trait :import_canceled do
+ import_status { :canceled }
+ end
+
trait :jira_dvcs_cloud do
before(:create) do |project|
create(:project_feature_usage, :dvcs_cloud, project: project)
@@ -328,9 +334,10 @@ FactoryBot.define do
trait :test_repo do
after :create do |project|
- TestEnv.copy_repo(project,
- bare_repo: TestEnv.factory_repo_path_bare,
- refs: TestEnv::BRANCH_SHA)
+ # There are various tests that rely on there being no repository cache.
+ # Using raw avoids caching.
+ repo = Gitlab::GlRepository::PROJECT.repository_for(project).raw
+ repo.create_from_bundle(TestEnv.factory_repo_bundle_path)
end
end
@@ -428,9 +435,10 @@ FactoryBot.define do
path { 'forked-gitlabhq' }
after :create do |project|
- TestEnv.copy_repo(project,
- bare_repo: TestEnv.forked_repo_path_bare,
- refs: TestEnv::FORKED_BRANCH_SHA)
+ # There are various tests that rely on there being no repository cache.
+ # Using raw avoids caching.
+ repo = Gitlab::GlRepository::PROJECT.repository_for(project).raw
+ repo.create_from_bundle(TestEnv.forked_repo_bundle_path)
end
end
diff --git a/spec/factories/projects/import_export/export_relation.rb b/spec/factories/projects/import_export/export_relation.rb
new file mode 100644
index 00000000000..2b6419dcecb
--- /dev/null
+++ b/spec/factories/projects/import_export/export_relation.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :project_relation_export, class: 'Projects::ImportExport::RelationExport' do
+ project_export_job factory: :project_export_job
+
+ relation { 'labels' }
+ status { 0 }
+ sequence(:jid) { |n| "project_relation_export_#{n}" }
+ end
+end
diff --git a/spec/factories/sequences.rb b/spec/factories/sequences.rb
index c10fab8588d..fd7f9223965 100644
--- a/spec/factories/sequences.rb
+++ b/spec/factories/sequences.rb
@@ -22,4 +22,5 @@ FactoryBot.define do
sequence(:job_name) { |n| "job #{n}" }
sequence(:work_item_type_name) { |n| "bug#{n}" }
sequence(:short_text) { |n| "someText#{n}" }
+ sequence(:token) { SecureRandom.hex(10) }
end
diff --git a/spec/factories/snippets.rb b/spec/factories/snippets.rb
index 21e1d911f96..75e2ef3db02 100644
--- a/spec/factories/snippets.rb
+++ b/spec/factories/snippets.rb
@@ -9,6 +9,10 @@ FactoryBot.define do
file_name { generate(:filename) }
secret { false }
+ transient do
+ repository_storage { 'default' }
+ end
+
trait :public do
visibility_level { Snippet::PUBLIC }
end
@@ -23,12 +27,13 @@ FactoryBot.define do
# Test repository - https://gitlab.com/gitlab-org/gitlab-test
trait :repository do
- after :create do |snippet|
- TestEnv.copy_repo(snippet,
- bare_repo: TestEnv.factory_repo_path_bare,
- refs: TestEnv::BRANCH_SHA)
+ after :create do |snippet, evaluator|
+ snippet.track_snippet_repository(evaluator.repository_storage)
- snippet.track_snippet_repository(snippet.repository.storage)
+ # There are various tests that rely on there being no repository cache.
+ # Using raw avoids caching.
+ repo = Gitlab::GlRepository::SNIPPET.repository_for(snippet).raw
+ repo.create_from_bundle(TestEnv.factory_repo_bundle_path)
end
end
diff --git a/spec/factories/usage_data.rb b/spec/factories/usage_data.rb
index 316e0c2b8d6..0e944b90d0c 100644
--- a/spec/factories/usage_data.rb
+++ b/spec/factories/usage_data.rb
@@ -59,9 +59,6 @@ FactoryBot.define do
create(:alert_management_http_integration, project: projects[0], name: 'DataCat')
create(:alert_management_http_integration, :inactive, project: projects[1], name: 'DataFox')
- # Tracing
- create(:project_tracing_setting, project: projects[0])
-
# Alert Issues
create(:alert_management_alert, issue: issues[0], project: projects[0])
create(:alert_management_alert, issue: alert_bot_issues[0], project: projects[0])
@@ -86,7 +83,6 @@ FactoryBot.define do
# Cluster Integrations
create(:clusters_integrations_prometheus, cluster: gcp_cluster)
- create(:clusters_integrations_elastic_stack, cluster: gcp_cluster)
create(:grafana_integration, project: projects[0], enabled: true)
create(:grafana_integration, project: projects[1], enabled: true)
diff --git a/spec/factories/users/namespace_user_callouts.rb b/spec/factories/users/namespace_user_callouts.rb
new file mode 100644
index 00000000000..fded63d0cce
--- /dev/null
+++ b/spec/factories/users/namespace_user_callouts.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :namespace_callout, class: 'Users::NamespaceCallout' do
+ feature_name { :invite_members_banner }
+
+ user
+ namespace
+ end
+end
diff --git a/spec/factories/work_items.rb b/spec/factories/work_items.rb
index e80aa9cc008..81c9fb6ed87 100644
--- a/spec/factories/work_items.rb
+++ b/spec/factories/work_items.rb
@@ -14,5 +14,10 @@ FactoryBot.define do
issue_type { :task }
association :work_item_type, :default, :task
end
+
+ trait :incident do
+ issue_type { :incident }
+ association :work_item_type, :default, :incident
+ end
end
end
diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb
index 2d541a34f62..040c6a65b7c 100644
--- a/spec/features/admin/admin_groups_spec.rb
+++ b/spec/features/admin/admin_groups_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe 'Admin Groups' do
let_it_be(:user) { create :user }
let_it_be(:group) { create :group }
- let_it_be(:current_user) { create(:admin) }
+ let_it_be_with_reload(:current_user) { create(:admin) }
before do
sign_in(current_user)
@@ -231,11 +231,33 @@ RSpec.describe 'Admin Groups' do
it_behaves_like 'adds user into a group' do
let(:user_selector) { user.email }
end
+
+ context 'when membership is set to expire' do
+ it 'renders relative time' do
+ expire_time = Time.current + 2.days
+ current_user.update!(time_display_relative: true)
+ group.add_member(user, Gitlab::Access::REPORTER, expires_at: expire_time)
+
+ visit admin_group_path(group)
+
+ expect(page).to have_content(/Expires in \d day/)
+ end
+
+ it 'renders absolute time' do
+ expire_time = Time.current.tomorrow.middle_of_day
+ current_user.update!(time_display_relative: false)
+ group.add_member(user, Gitlab::Access::REPORTER, expires_at: expire_time)
+
+ visit admin_group_path(group)
+
+ expect(page).to have_content("Expires on #{expire_time.strftime('%b %-d')}")
+ end
+ end
end
describe 'add admin himself to a group' do
before do
- group.add_user(:user, Gitlab::Access::OWNER)
+ group.add_member(:user, Gitlab::Access::OWNER)
end
it 'adds admin a to a group as developer', :js do
@@ -252,7 +274,7 @@ RSpec.describe 'Admin Groups' do
describe 'admin removes themself from a group', :js do
it 'removes admin from the group' do
- group.add_user(current_user, Gitlab::Access::DEVELOPER)
+ group.add_member(current_user, Gitlab::Access::DEVELOPER)
visit group_group_members_path(group)
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
index 2166edf65ff..6b147b01991 100644
--- a/spec/features/admin/admin_projects_spec.rb
+++ b/spec/features/admin/admin_projects_spec.rb
@@ -7,15 +7,37 @@ RSpec.describe "Admin::Projects" do
include Spec::Support::Helpers::Features::InviteMembersModalHelper
include Spec::Support::Helpers::ModalHelpers
- let(:user) { create :user }
- let(:project) { create(:project, :with_namespace_settings) }
- let(:current_user) { create(:admin) }
+ let_it_be_with_reload(:user) { create :user }
+ let_it_be_with_reload(:project) { create(:project, :with_namespace_settings) }
+ let_it_be_with_reload(:current_user) { create(:admin) }
before do
sign_in(current_user)
gitlab_enable_admin_mode_sign_in(current_user)
end
+ describe 'when membership is set to expire', :js do
+ it 'renders relative time' do
+ expire_time = Time.current + 2.days
+ current_user.update!(time_display_relative: true)
+ project.add_member(user, Gitlab::Access::REPORTER, expires_at: expire_time)
+
+ visit admin_project_path(project)
+
+ expect(page).to have_content(/Expires in \d day/)
+ end
+
+ it 'renders absolute time' do
+ expire_time = Time.current.tomorrow.middle_of_day
+ current_user.update!(time_display_relative: false)
+ project.add_member(user, Gitlab::Access::REPORTER, expires_at: expire_time)
+
+ visit admin_project_path(project)
+
+ expect(page).to have_content("Expires on #{expire_time.strftime('%b %-d')}")
+ end
+ end
+
describe "GET /admin/projects" do
let!(:archived_project) { create :project, :public, :archived }
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index d312965f6cf..44fd21e510a 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe "Admin Runners" do
let_it_be(:namespace) { create(:namespace) }
let_it_be(:project) { create(:project, namespace: namespace, creator: user) }
- context "runners registration" do
+ describe "runners registration" do
before do
visit admin_runners_path
end
@@ -164,7 +164,9 @@ RSpec.describe "Admin Runners" do
end
describe 'filter by status' do
- let!(:never_contacted) { create(:ci_runner, :instance, description: 'runner-never-contacted', contacted_at: nil) }
+ let!(:never_contacted) do
+ create(:ci_runner, :instance, description: 'runner-never-contacted', contacted_at: nil)
+ end
before do
create(:ci_runner, :instance, description: 'runner-1', contacted_at: Time.zone.now)
@@ -326,13 +328,15 @@ RSpec.describe "Admin Runners" do
visit admin_runners_path
page.within('[data-testid="runner-type-tabs"]') do
click_on 'Instance'
-
- expect(page).to have_link('Instance', class: 'active')
end
end
it_behaves_like 'shows no runners found'
+ it 'shows active tab' do
+ expect(page).to have_link('Instance', class: 'active')
+ end
+
it 'shows no runner' do
expect(page).not_to have_content 'runner-project'
expect(page).not_to have_content 'runner-group'
@@ -402,8 +406,8 @@ RSpec.describe "Admin Runners" do
end
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')
+ create(:ci_runner, :instance, description: 'runner-1', contacted_at: '2018-07-12')
+ create(:ci_runner, :instance, description: 'runner-2', contacted_at: '2018-07-13')
visit admin_runners_path
@@ -448,13 +452,13 @@ RSpec.describe "Admin Runners" do
it 'updates ACTIVE runner status to paused=false' do
visit admin_runners_path('status[]': 'ACTIVE')
- expect(page).to have_current_path(admin_runners_path('paused[]': 'false') )
+ expect(page).to have_current_path(admin_runners_path('paused[]': 'false'))
end
it 'updates PAUSED runner status to paused=true' do
visit admin_runners_path('status[]': 'PAUSED')
- expect(page).to have_current_path(admin_runners_path('paused[]': 'true') )
+ expect(page).to have_current_path(admin_runners_path('paused[]': 'true'))
end
end
end
@@ -477,7 +481,9 @@ RSpec.describe "Admin Runners" do
describe 'runner show page breadcrumbs' do
it 'contains the current runner id and token' do
page.within '[data-testid="breadcrumb-links"]' do
- expect(page.find('[data-testid="breadcrumb-current-link"]')).to have_link("##{runner.id} (#{runner.short_sha})")
+ expect(page.find('[data-testid="breadcrumb-current-link"]')).to have_link(
+ "##{runner.id} (#{runner.short_sha})"
+ )
end
end
end
@@ -515,16 +521,16 @@ RSpec.describe "Admin Runners" do
describe "Runner edit page" do
let(:runner) { create(:ci_runner, :project) }
+ let!(:project1) { create(:project) }
+ let!(:project2) { create(:project) }
before do
- @project1 = create(:project)
- @project2 = create(:project)
visit edit_admin_runner_path(runner)
wait_for_requests
end
- describe 'runner edit page breadcrumbs' do
+ describe 'breadcrumbs' do
it 'contains the current runner id and token' do
page.within '[data-testid="breadcrumb-links"]' do
expect(page).to have_link("##{runner.id} (#{runner.short_sha})")
@@ -539,7 +545,7 @@ RSpec.describe "Admin Runners" do
end
end
- describe 'when a runner is updated', :js do
+ context 'when a runner is updated', :js do
before do
click_on _('Save changes')
wait_for_requests
@@ -556,21 +562,21 @@ RSpec.describe "Admin Runners" do
describe 'projects' do
it 'contains project names' do
- expect(page).to have_content(@project1.full_name)
- expect(page).to have_content(@project2.full_name)
+ expect(page).to have_content(project1.full_name)
+ expect(page).to have_content(project2.full_name)
end
end
describe 'search' do
before do
search_form = find('#runner-projects-search')
- search_form.fill_in 'search', with: @project1.name
+ search_form.fill_in 'search', with: project1.name
search_form.click_button 'Search'
end
it 'contains name of correct project' do
- expect(page).to have_content(@project1.full_name)
- expect(page).not_to have_content(@project2.full_name)
+ expect(page).to have_content(project1.full_name)
+ expect(page).not_to have_content(project2.full_name)
end
end
@@ -584,12 +590,12 @@ RSpec.describe "Admin Runners" do
assigned_project = page.find('[data-testid="assigned-projects"]')
expect(page).to have_content('Runner assigned to project.')
- expect(assigned_project).to have_content(@project2.path)
+ expect(assigned_project).to have_content(project2.path)
end
end
context 'with specific runner' do
- let(:runner) { create(:ci_runner, :project, projects: [@project1]) }
+ let(:runner) { create(:ci_runner, :project, projects: [project1]) }
before do
visit edit_admin_runner_path(runner)
@@ -599,7 +605,7 @@ RSpec.describe "Admin Runners" do
end
context 'with locked runner' do
- let(:runner) { create(:ci_runner, :project, projects: [@project1], locked: true) }
+ let(:runner) { create(:ci_runner, :project, projects: [project1], locked: true) }
before do
visit edit_admin_runner_path(runner)
@@ -610,7 +616,7 @@ RSpec.describe "Admin Runners" do
end
describe 'disable/destroy' do
- let(:runner) { create(:ci_runner, :project, projects: [@project1]) }
+ let(:runner) { create(:ci_runner, :project, projects: [project1]) }
before do
visit edit_admin_runner_path(runner)
@@ -624,7 +630,7 @@ RSpec.describe "Admin Runners" do
new_runner_project = page.find('[data-testid="unassigned-projects"]')
expect(page).to have_content('Runner unassigned from project.')
- expect(new_runner_project).to have_content(@project1.path)
+ expect(new_runner_project).to have_content(project1.path)
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 8edddcf9a9b..faf13374719 100644
--- a/spec/features/admin/admin_sees_background_migrations_spec.rb
+++ b/spec/features/admin/admin_sees_background_migrations_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe "Admin > Admin sees background migrations" do
let_it_be(:admin) { create(:admin) }
+ let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
let_it_be(:active_migration) { create(:batched_background_migration, :active, table_name: 'active') }
let_it_be(:failed_migration) { create(:batched_background_migration, :failed, table_name: 'failed', total_tuple_count: 100) }
@@ -107,7 +108,8 @@ RSpec.describe "Admin > Admin sees background migrations" do
anything,
batch_min_value: 6,
batch_size: 5,
- job_arguments: failed_migration.job_arguments
+ job_arguments: failed_migration.job_arguments,
+ job_class: job_class
).and_return([6, 10])
end
end
diff --git a/spec/features/admin/admin_system_info_spec.rb b/spec/features/admin/admin_system_info_spec.rb
index 2225f25aa1e..8ff31dfded7 100644
--- a/spec/features/admin/admin_system_info_spec.rb
+++ b/spec/features/admin/admin_system_info_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'Admin System Info' do
expect(page).to have_content 'CPU 2 cores'
expect(page).to have_content 'Memory Usage 4 GB / 16 GB'
expect(page).to have_content 'Disk Usage'
- expect(page).to have_content 'Uptime'
+ expect(page).to have_content 'System started'
end
end
@@ -39,7 +39,7 @@ RSpec.describe 'Admin System Info' do
expect(page).to have_content 'CPU Unable to collect CPU info'
expect(page).to have_content 'Memory Usage 4 GB / 16 GB'
expect(page).to have_content 'Disk Usage'
- expect(page).to have_content 'Uptime'
+ expect(page).to have_content 'System started'
end
end
@@ -54,7 +54,7 @@ RSpec.describe 'Admin System Info' do
expect(page).to have_content 'CPU 2 cores'
expect(page).to have_content 'Memory Usage Unable to collect memory info'
expect(page).to have_content 'Disk Usage'
- expect(page).to have_content 'Uptime'
+ expect(page).to have_content 'System started'
end
end
end
diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb
index 18bb03f4617..bc88b90a2dd 100644
--- a/spec/features/admin/users/user_spec.rb
+++ b/spec/features/admin/users/user_spec.rb
@@ -372,8 +372,8 @@ RSpec.describe 'Admin::Users::User' do
describe 'show user keys', :js do
it do
- key1 = create(:key, user: user, title: 'ssh-rsa Key1', key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4FIEBXGi4bPU8kzxMefudPIJ08/gNprdNTaO9BR/ndy3+58s2HCTw2xCHcsuBmq+TsAqgEidVq4skpqoTMB+Uot5Uzp9z4764rc48dZiI661izoREoKnuRQSsRqUTHg5wrLzwxlQbl1MVfRWQpqiz/5KjBC7yLEb9AbusjnWBk8wvC1bQPQ1uLAauEA7d836tgaIsym9BrLsMVnR4P1boWD3Xp1B1T/ImJwAGHvRmP/ycIqmKdSpMdJXwxcb40efWVj0Ibbe7ii9eeoLdHACqevUZi6fwfbymdow+FeqlkPoHyGg3Cu4vD/D8+8cRc7mE/zGCWcQ15Var83Tczour Key1')
- key2 = create(:key, user: user, title: 'ssh-rsa Key2', key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQSTWXhJAX/He+nG78MiRRRn7m0Pb0XbcgTxE0etArgoFoh9WtvDf36HG6tOSg/0UUNcp0dICsNAmhBKdncp6cIyPaXJTURPRAGvhI0/VDk4bi27bRnccGbJ/hDaUxZMLhhrzY0r22mjVf8PF6dvv5QUIQVm1/LeaWYsHHvLgiIjwrXirUZPnFrZw6VLREoBKG8uWvfSXw1L5eapmstqfsME8099oi+vWLR8MgEysZQmD28M73fgW4zek6LDQzKQyJx9nB+hJkKUDvcuziZjGmRFlNgSA2mguERwL1OXonD8WYUrBDGKroIvBT39zS5d9tQDnidEJZ9Y8gv5ViYP7x Key2')
+ key1 = create(:key, user: user, title: 'ssh-rsa Key1')
+ key2 = create(:key, user: user, title: 'ssh-rsa Key2')
visit admin_user_path(user)
diff --git a/spec/features/dashboard/todos/todos_spec.rb b/spec/features/dashboard/todos/todos_spec.rb
index adb43d60306..e02cd182b2c 100644
--- a/spec/features/dashboard/todos/todos_spec.rb
+++ b/spec/features/dashboard/todos/todos_spec.rb
@@ -60,6 +60,21 @@ RSpec.describe 'Dashboard Todos' do
end
end
+ context 'when todo references an issue of type task' do
+ let(:task) { create(:issue, :task, project: project) }
+ let!(:task_todo) { create(:todo, :mentioned, user: user, project: project, target: task, author: author) }
+
+ before do
+ sign_in(user)
+
+ visit dashboard_todos_path
+ end
+
+ it 'displays the correct issue type name' do
+ expect(page).to have_content('mentioned you on task')
+ end
+ end
+
context 'user has an unauthorized todo' do
before do
sign_in(user)
@@ -85,6 +100,10 @@ RSpec.describe 'Dashboard Todos' do
visit dashboard_todos_path
end
+ it 'displays the correct issue type name' do
+ expect(page).to have_content('mentioned you on issue')
+ end
+
it 'has todo present' do
expect(page).to have_selector('.todos-list .todo', count: 1)
end
diff --git a/spec/features/file_uploads/multipart_invalid_uploads_spec.rb b/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
index 91c8e100e6a..cff8b4e61a5 100644
--- a/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
+++ b/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe 'Invalid uploads that must be rejected', :api, :js do
# These keys are rejected directly by rack itself.
# The request will not be received by multipart.rb (can't use the 'handling file uploads' shared example)
- it_behaves_like 'rejecting invalid keys', key_name: 'x' * 11000, message: 'Puma caught this error: exceeded available parameter key space (RangeError)'
+ it_behaves_like 'rejecting invalid keys', key_name: 'x' * 11000, message: 'Puma caught this error: exceeded available parameter key space (Rack::QueryParser::ParamsTooDeepError)'
it_behaves_like 'rejecting invalid keys', key_name: 'package[]test', status: 400, message: 'Bad Request'
it_behaves_like 'handling file uploads', 'by rejecting uploads with an invalid key'
diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb
index a60b8a60da0..a129db6cb6f 100644
--- a/spec/features/groups/group_runners_spec.rb
+++ b/spec/features/groups/group_runners_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe "Group Runners" do
describe "Group runners page", :js do
let!(:group_registration_token) { group.runners_token }
- context "runners registration" do
+ describe "runners registration" do
before do
visit group_runners_path(group)
end
@@ -128,7 +128,7 @@ RSpec.describe "Group Runners" do
end
end
- context 'filtered search' do
+ describe 'filtered search' do
before do
visit group_runners_path(group)
end
@@ -182,5 +182,45 @@ RSpec.describe "Group Runners" do
end
end
end
+
+ context 'when group_runner_view_ui is enabled' do
+ before do
+ stub_feature_flags(group_runner_view_ui: true)
+ end
+
+ it 'user views runner details' do
+ visit group_runner_path(group, runner)
+
+ expect(page).to have_content "#{s_('Runners|Description')} runner-foo"
+ end
+
+ it 'user edits the runner to be protected' do
+ visit edit_group_runner_path(group, runner)
+
+ expect(page.find_field('runner[access_level]')).not_to be_checked
+
+ check 'runner_access_level'
+ click_button _('Save changes')
+
+ expect(page).to have_content "#{s_('Runners|Configuration')} #{s_('Runners|Protected')}"
+ end
+
+ context 'when a runner has a tag' do
+ before do
+ runner.update!(tag_list: ['tag'])
+ end
+
+ it 'user edits runner not to run untagged jobs' do
+ visit edit_group_runner_path(group, runner)
+
+ page.find_field('runner[tag_list]').set('tag, tag2')
+
+ uncheck 'runner_run_untagged'
+ click_button _('Save changes')
+
+ expect(page).to have_content "#{s_('Runners|Tags')} tag tag2"
+ end
+ end
+ end
end
end
diff --git a/spec/features/groups/group_settings_spec.rb b/spec/features/groups/group_settings_spec.rb
index 019b094ccb5..2f599d24b01 100644
--- a/spec/features/groups/group_settings_spec.rb
+++ b/spec/features/groups/group_settings_spec.rb
@@ -89,7 +89,7 @@ RSpec.describe 'Edit group settings' do
it 'shows the selection menu' do
visit edit_group_path(group)
- expect(page).to have_content('Allowed to create projects')
+ expect(page).to have_content('Roles allowed to create projects')
end
end
@@ -97,7 +97,7 @@ RSpec.describe 'Edit group settings' do
it 'shows the selection menu' do
visit edit_group_path(group)
- expect(page).to have_content('Allowed to create subgroups')
+ expect(page).to have_content('Roles allowed to create subgroups')
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 3d23451feef..b69b8bf2c19 100644
--- a/spec/features/groups/import_export/import_file_spec.rb
+++ b/spec/features/groups/import_export/import_file_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe 'Import/Export - Group Import', :js do
visit new_group_path
click_link 'Import group'
- fill_in :import_group_name, with: group_name
+ fill_in s_('Groups|Group name'), with: group_name
expect(page).to have_content 'Import group from file'
attach_file(file) do
@@ -41,10 +41,12 @@ RSpec.describe 'Import/Export - Group Import', :js do
group = Group.find_by(name: group_name)
- expect(group).not_to be_nil
- expect(group.description).to eq 'A voluptate non sequi temporibus quam at.'
- expect(group.path).to eq 'test-group-import'
- expect(group.import_state.status).to eq GroupImportState.state_machine.states[:finished].value
+ aggregate_failures do
+ expect(group).not_to be_nil
+ expect(group.description).to eq 'A voluptate non sequi temporibus quam at.'
+ expect(group.path).to eq 'test-group-import'
+ expect(group.import_state.status).to eq GroupImportState.state_machine.states[:finished].value
+ end
end
end
@@ -53,9 +55,9 @@ RSpec.describe 'Import/Export - Group Import', :js do
visit new_group_path
click_link 'Import group'
- fill_in :import_group_name, with: 'Test Group Import'
+ fill_in s_('Groups|Group name'), with: 'Test Group Import'
- fill_in :import_group_path, with: 'custom-path'
+ fill_in s_('Groups|Group URL'), with: 'custom-path'
attach_file(file) do
find('.js-filepicker-button').click
end
@@ -76,8 +78,10 @@ RSpec.describe 'Import/Export - Group Import', :js do
visit new_group_path
click_link 'Import group'
- fill_in :import_group_path, with: 'test-group-import'
- expect(page).to have_content "Group path is already taken. We've suggested one that is available."
+ fill_in s_('Groups|Group URL'), with: 'test-group-import'
+ expect(page).to have_content s_(
+ 'Groups|Group path is unavailable. Path has been replaced with a suggested available path.'
+ )
end
end
end
@@ -89,7 +93,7 @@ RSpec.describe 'Import/Export - Group Import', :js do
visit new_group_path
click_link 'Import group'
- fill_in :import_group_name, with: 'Test Group Import'
+ fill_in s_('Groups|Group name'), with: 'Test Group Import'
attach_file(file) do
find('.js-filepicker-button').click
end
diff --git a/spec/features/groups/merge_requests_spec.rb b/spec/features/groups/merge_requests_spec.rb
index 7541e54f014..be1db970e9d 100644
--- a/spec/features/groups/merge_requests_spec.rb
+++ b/spec/features/groups/merge_requests_spec.rb
@@ -86,7 +86,7 @@ RSpec.describe 'Group merge requests page' do
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')
+ expect(page).to have_selector('.issues-filters')
end
context 'with no open merge requests' do
diff --git a/spec/features/groups/settings/packages_and_registries_spec.rb b/spec/features/groups/settings/packages_and_registries_spec.rb
index d3141da9160..98dc534f54e 100644
--- a/spec/features/groups/settings/packages_and_registries_spec.rb
+++ b/spec/features/groups/settings/packages_and_registries_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'Group Packages & Registries settings' do
sign_in(user)
end
- context 'when packges feature is disabled on the group' do
+ context 'when packages feature is disabled on the group' do
before do
stub_packages_setting(enabled: false)
end
@@ -56,26 +56,26 @@ RSpec.describe 'Group Packages & Registries settings' do
expect(sidebar).to have_link _('Packages & Registries')
end
- it 'has a Package Registry section', :js do
+ it 'has a Duplicate packages section', :js do
visit_settings_page
- expect(page).to have_content('Package Registry')
- expect(page).to have_button('Collapse')
+ expect(page).to have_content('Duplicate packages')
end
it 'automatically saves changes to the server', :js do
visit_settings_page
within '[data-testid="maven-settings"]' do
- expect(page).to have_content('Allow duplicates')
+ expect(page).to have_content('Reject packages with the same name and version')
+ expect(page).not_to have_content('Exceptions')
find('.gl-toggle').click
- expect(page).to have_content('Do not allow duplicates')
+ expect(page).to have_content('Exceptions')
visit_settings_page
- expect(page).to have_content('Do not allow duplicates')
+ expect(page).to have_content('Exceptions')
end
end
@@ -83,12 +83,10 @@ RSpec.describe 'Group Packages & Registries settings' do
visit_settings_page
within '[data-testid="maven-settings"]' do
- expect(page).to have_content('Allow duplicates')
+ expect(page).to have_content('Reject packages with the same name and version')
find('.gl-toggle').click
- expect(page).to have_content('Do not allow duplicates')
-
fill_in 'Exceptions', with: ')'
# simulate blur event
@@ -103,11 +101,11 @@ RSpec.describe 'Group Packages & Registries settings' do
visit_sub_group_settings_page
within '[data-testid="maven-settings"]' do
- expect(page).to have_content('Allow duplicates')
+ expect(page).to have_content('Reject packages with the same name and version')
find('.gl-toggle').click
- expect(page).to have_content('Do not allow duplicates')
+ expect(page).to have_content('Exceptions')
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 c7b7b25caa7..998c3d2ca3f 100644
--- a/spec/features/groups/settings/user_searches_in_settings_spec.rb
+++ b/spec/features/groups/settings/user_searches_in_settings_spec.rb
@@ -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', 'Use GitLab as a private registry'
+ it_behaves_like 'can highlight results', 'Allow packages with the same name and version'
end
end
diff --git a/spec/features/groups/show_spec.rb b/spec/features/groups/show_spec.rb
index fa8db1befb5..9a1e216c6d2 100644
--- a/spec/features/groups/show_spec.rb
+++ b/spec/features/groups/show_spec.rb
@@ -97,6 +97,31 @@ RSpec.describe 'Group show page' do
end
end
+ context 'when a public project is shared with a private group' do
+ let_it_be(:private_group) { create(:group, :private) }
+ let_it_be(:public_project) { create(:project, :public) }
+ let_it_be(:project_group_link) { create(:project_group_link, group: private_group, project: public_project) }
+
+ before do
+ private_group.add_owner(user)
+ sign_in(user)
+ end
+
+ it 'shows warning popover', :js do
+ visit group_path(private_group)
+
+ click_link _('Shared projects')
+
+ wait_for_requests
+
+ page.within("[data-testid=\"group-overview-item-#{public_project.id}\"]") do
+ click_button _('Less restrictive visibility')
+ end
+
+ expect(page).to have_content _('Project visibility level is less restrictive than the group settings.')
+ end
+ end
+
context 'when user does not have permissions to create new subgroups or projects', :js do
before do
group.add_reporter(user)
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index 31390b110e7..ece6167b193 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'Group' do
end
describe 'as a non-admin' do
- it 'creates a group and persists visibility radio selection', :js, :saas do
+ it 'creates a group and persists visibility radio selection', :js do
stub_application_setting(default_group_visibility: :private)
fill_in 'Group name', with: 'test-group'
@@ -499,8 +499,6 @@ RSpec.describe 'Group' do
let_it_be_with_refind(:user) { create(:user) }
before do
- stub_feature_flags(namespace_storage_limit_bypass_date_check: false)
-
group.add_owner(user)
sign_in(user)
end
@@ -509,8 +507,8 @@ RSpec.describe 'Group' do
let_it_be(:storage_enforcement_date) { Date.today + 30 }
before do
- allow_next_found_instance_of(Group) do |g|
- allow(g).to receive(:storage_enforcement_date).and_return(storage_enforcement_date)
+ allow_next_found_instance_of(Group) do |grp|
+ allow(grp).to receive(:storage_enforcement_date).and_return(storage_enforcement_date)
end
end
@@ -520,8 +518,8 @@ RSpec.describe 'Group' do
end
it 'does not display the banner in a paid group page' do
- allow_next_found_instance_of(Group) do |g|
- allow(g).to receive(:paid?).and_return(true)
+ allow_next_found_instance_of(Group) do |grp|
+ allow(grp).to receive(:paid?).and_return(true)
end
visit group_path(group)
expect_page_not_to_have_storage_enforcement_banner
@@ -531,12 +529,13 @@ RSpec.describe 'Group' do
visit group_path(group)
expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
find('.js-storage-enforcement-banner [data-testid="close-icon"]').click
+ wait_for_requests
page.refresh
expect_page_not_to_have_storage_enforcement_banner
storage_enforcement_date = Date.today + 13
- allow_next_found_instance_of(Group) do |g|
- allow(g).to receive(:storage_enforcement_date).and_return(storage_enforcement_date)
+ allow_next_found_instance_of(Group) do |grp|
+ allow(grp).to receive(:storage_enforcement_date).and_return(storage_enforcement_date)
end
page.refresh
expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
@@ -547,6 +546,7 @@ RSpec.describe 'Group' do
# This test should break and be rewritten after the implementation of the storage_enforcement_date
# TBD: https://gitlab.com/gitlab-org/gitlab/-/issues/350632
it 'does not display the banner in the group page' do
+ stub_feature_flags(namespace_storage_limit_bypass_date_check: false)
visit group_path(group)
expect_page_not_to_have_storage_enforcement_banner
end
diff --git a/spec/features/incidents/incident_details_spec.rb b/spec/features/incidents/incident_details_spec.rb
index dad3dfd3440..7c24943eb6f 100644
--- a/spec/features/incidents/incident_details_spec.rb
+++ b/spec/features/incidents/incident_details_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Incident details', :js do
let_it_be(:project) { create(:project) }
let_it_be(:developer) { create(:user) }
let_it_be(:incident) { create(:incident, project: project, author: developer, description: 'description') }
+ let_it_be(:issue) { create(:issue, project: project, author: developer, description: 'Issue description') }
let_it_be(:escalation_status) { create(:incident_management_issuable_escalation_status, issue: incident) }
before_all do
@@ -14,23 +15,24 @@ RSpec.describe 'Incident details', :js do
before do
sign_in(developer)
-
- visit project_issues_incident_path(project, incident)
- wait_for_requests
end
context 'when a developer+ displays the incident' do
- it 'shows the incident' do
+ before do
+ visit project_issues_incident_path(project, incident)
+ wait_for_requests
+ end
+
+ it 'shows correct elements on the page', :aggregate_failures do
+ # shows the incident
page.within('.issuable-details') do
expect(find('h1')).to have_content(incident.title)
end
- end
- it 'does not show design management' do
+ # does not show design management
expect(page).not_to have_selector('.js-design-management')
- end
- it 'shows the incident tabs' do
+ # shows the incident tabs
page.within('.issuable-details') do
incident_tabs = find('[data-testid="incident-tabs"]')
@@ -38,9 +40,8 @@ RSpec.describe 'Incident details', :js do
expect(incident_tabs).to have_content('Summary')
expect(incident_tabs).to have_content(incident.description)
end
- end
- it 'shows the right sidebar mounted with type issue' do
+ # shows the right sidebar mounted with type issue
page.within('.layout-page') do
sidebar = find('.right-sidebar')
@@ -51,12 +52,12 @@ RSpec.describe 'Incident details', :js do
end
end
- context 'escalation status' do
+ describe 'escalation status' do
let(:sidebar) { page.find('.right-sidebar') }
let(:widget) { sidebar.find('[data-testid="escalation_status_container"]') }
let(:expected_dropdown_options) { escalation_status.class::STATUSES.keys.take(3).map { |key| key.to_s.titleize } }
- it 'has an interactable escalation status widget' do
+ it 'has an interactable escalation status widget', :aggregate_failures do
expect(current_status).to have_text(escalation_status.status_name.to_s.titleize)
# list the available statuses
@@ -87,41 +88,41 @@ RSpec.describe 'Incident details', :js do
end
end
- context 'when an incident `issue_type` is edited by a signed in user' do
- it 'routes the user to the incident details page when the `issue_type` is set to incident' do
- wait_for_requests
- project_path = "/#{project.full_path}"
- click_button 'Edit title and description'
- wait_for_requests
+ it 'routes the user to the incident details page when the `issue_type` is set to incident' do
+ visit project_issue_path(project, issue)
+ wait_for_requests
+
+ project_path = "/#{project.full_path}"
+ click_button 'Edit title and description'
+ wait_for_requests
- page.within('[data-testid="issuable-form"]') do
- click_button 'Incident'
- click_button 'Issue'
- click_button 'Save changes'
+ page.within('[data-testid="issuable-form"]') do
+ click_button 'Issue'
+ click_button 'Incident'
+ click_button 'Save changes'
- wait_for_requests
+ wait_for_requests
- expect(page).to have_current_path("#{project_path}/-/issues/#{incident.iid}")
- end
+ expect(page).to have_current_path("#{project_path}/-/issues/incident/#{issue.iid}")
end
end
- context 'when incident details are edited by a signed in user' do
- it 'routes the user to the incident details page when the `issue_type` is set to incident' do
- wait_for_requests
- project_path = "/#{project.full_path}"
- click_button 'Edit title and description'
- wait_for_requests
+ it 'routes the user to the issue details page when the `issue_type` is set to issue' do
+ visit project_issues_incident_path(project, incident)
+ wait_for_requests
- page.within('[data-testid="issuable-form"]') do
- click_button 'Incident'
- click_button 'Issue'
- click_button 'Save changes'
+ project_path = "/#{project.full_path}"
+ click_button 'Edit title and description'
+ wait_for_requests
- wait_for_requests
+ page.within('[data-testid="issuable-form"]') do
+ click_button 'Incident'
+ click_button 'Issue'
+ click_button 'Save changes'
- expect(page).to have_current_path("#{project_path}/-/issues/#{incident.iid}")
- end
+ wait_for_requests
+
+ expect(page).to have_current_path("#{project_path}/-/issues/#{incident.iid}")
end
end
end
diff --git a/spec/features/incidents/incident_timeline_events_spec.rb b/spec/features/incidents/incident_timeline_events_spec.rb
new file mode 100644
index 00000000000..e39f348013c
--- /dev/null
+++ b/spec/features/incidents/incident_timeline_events_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Incident timeline events', :js do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:incident) { create(:incident, project: project) }
+
+ before_all do
+ project.add_developer(developer)
+ end
+
+ before do
+ stub_feature_flags(incident_timeline: true)
+ sign_in(developer)
+
+ visit project_issues_incident_path(project, incident)
+ wait_for_requests
+ click_link 'Timeline'
+ end
+
+ context 'when add event is clicked' do
+ it 'submits event data when save is clicked' do
+ click_button 'Add new timeline event'
+
+ expect(page).to have_selector('.common-note-form')
+
+ fill_in 'Description', with: 'Event note goes here'
+ fill_in 'timeline-input-hours', with: '07'
+ fill_in 'timeline-input-minutes', with: '25'
+
+ click_button 'Save'
+
+ expect(page).to have_selector('.incident-timeline-events')
+
+ page.within '.timeline-event-note' do
+ expect(page).to have_content('Event note goes here')
+ expect(page).to have_content('07:25')
+ end
+ end
+ end
+
+ context 'when delete event is clicked' do
+ before do
+ click_button 'Add new timeline event'
+ fill_in 'Description', with: 'Event note to delete'
+ click_button 'Save'
+ end
+
+ it 'shows the confirmation modal and deletes the event' do
+ click_button 'More actions'
+
+ page.within '.gl-new-dropdown-item-text-wrapper' do
+ expect(page).to have_content('Delete')
+ page.find('.gl-new-dropdown-item-text-primary', text: 'Delete').click
+ end
+
+ page.within '.modal' do
+ expect(page).to have_content('Delete event')
+ end
+
+ click_button 'Delete event'
+
+ wait_for_requests
+
+ expect(page).to have_content('No timeline items have been added yet.')
+ end
+ end
+end
diff --git a/spec/features/invites_spec.rb b/spec/features/invites_spec.rb
index 965e97baadd..fe804dc52d7 100644
--- a/spec/features/invites_spec.rb
+++ b/spec/features/invites_spec.rb
@@ -72,7 +72,7 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures do
end
end
- context 'when invite is sent before account is created - ldap or social sign in for manual acceptance edge case' do
+ context 'when invite is sent before account is created - ldap or service sign in for manual acceptance edge case' do
let(:user) { create(:user, email: 'user@example.com') }
context 'when invite clicked and not signed in' do
@@ -221,7 +221,8 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures do
category: 'RegistrationsController',
action: 'accepted',
label: 'invite_email',
- property: group_invite.id.to_s
+ property: group_invite.id.to_s,
+ user: group_invite.reload.user
)
end
end
diff --git a/spec/features/issuables/issuable_list_spec.rb b/spec/features/issuables/issuable_list_spec.rb
index 0fa2d238b0a..a1e80586c05 100644
--- a/spec/features/issuables/issuable_list_spec.rb
+++ b/spec/features/issuables/issuable_list_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'issuable list', :js do
issuable_types = [:issue, :merge_request]
before do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
sign_in(user)
issuable_types.each { |type| create_issuables(type) }
end
diff --git a/spec/features/issues/filtered_search/visual_tokens_spec.rb b/spec/features/issues/filtered_search/visual_tokens_spec.rb
index 7a367723609..c44181a60e4 100644
--- a/spec/features/issues/filtered_search/visual_tokens_spec.rb
+++ b/spec/features/issues/filtered_search/visual_tokens_spec.rb
@@ -15,8 +15,8 @@ RSpec.describe 'Visual tokens', :js do
let_it_be(:issue) { create(:issue, project: project) }
before do
- project.add_user(user, :maintainer)
- project.add_user(user_rock, :maintainer)
+ project.add_member(user, :maintainer)
+ project.add_member(user_rock, :maintainer)
sign_in(user)
visit project_issues_path(project)
diff --git a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
index 1c707466b51..5ba09703852 100644
--- a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
+++ b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
@@ -20,25 +20,11 @@ RSpec.describe 'User creates branch and merge request on issue page', :js do
context 'when signed in' do
before do
- project.add_user(user, membership_level)
+ project.add_member(user, membership_level)
sign_in(user)
end
- context 'when ’Create merge request’ button is clicked' do
- before do
- visit project_issue_path(project, issue)
-
- wait_for_requests
-
- click_button('Create merge request')
-
- wait_for_requests
- end
-
- it_behaves_like 'merge request author auto assign'
- end
-
context 'when interacting with the dropdown' do
before do
visit project_issue_path(project, issue)
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
index f03c812ebb5..fafaea8ac68 100644
--- a/spec/features/merge_request/batch_comments_spec.rb
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -45,25 +45,13 @@ RSpec.describe 'Merge request > Batch comments', :js do
expect(page).to have_selector('.note:not(.draft-note)', text: 'Line is wrong')
end
- it 'publishes single comment' do
- write_diff_comment
-
- click_button 'Add comment now'
-
- wait_for_requests
-
- expect(page).not_to have_selector('.draft-note-component', text: 'Line is wrong')
-
- expect(page).to have_selector('.note:not(.draft-note)', text: 'Line is wrong')
- end
-
it 'deletes draft note' do
write_diff_comment
find('.js-note-delete').click
page.within('.modal') do
- click_button('Delete Comment', match: :first)
+ click_button('Delete comment', match: :first)
end
wait_for_requests
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 06b29969775..f21929e5275 100644
--- a/spec/features/merge_request/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -253,7 +253,7 @@ RSpec.describe 'User comments on a diff', :js do
end
page.within('.modal') do
- click_button('Delete Comment', match: :first)
+ click_button('Delete comment', match: :first)
end
page.within('.merge-request-tabs') do
diff --git a/spec/features/merge_request/user_creates_merge_request_spec.rb b/spec/features/merge_request/user_creates_merge_request_spec.rb
index 2bf8e9ba6a4..c8b22bb3125 100644
--- a/spec/features/merge_request/user_creates_merge_request_spec.rb
+++ b/spec/features/merge_request/user_creates_merge_request_spec.rb
@@ -15,39 +15,27 @@ RSpec.describe "User creates a merge request", :js do
sign_in(user)
end
- context 'when completed the compare branches form' do
- before do
- visit(project_new_merge_request_path(project))
+ it "creates a merge request" do
+ visit(project_new_merge_request_path(project))
- find(".js-source-branch").click
- click_link("fix")
+ find(".js-source-branch").click
+ click_link("fix")
- find(".js-target-branch").click
- click_link("feature")
+ find(".js-target-branch").click
+ click_link("feature")
- click_button("Compare branches")
- end
+ click_button("Compare branches")
- it "shows merge request form" do
- page.within('.merge-request-form') do
- expect(page.find('#merge_request_description')['placeholder']).to eq 'Describe the goal of the changes and what reviewers should be aware of.'
- end
+ page.within('.merge-request-form') do
+ expect(page.find('#merge_request_description')['placeholder']).to eq 'Describe the goal of the changes and what reviewers should be aware of.'
end
- context "when completed the merge request form" do
- before do
- fill_in("Title", with: title)
- click_button("Create merge request")
- end
+ fill_in("Title", with: title)
+ click_button("Create merge request")
- it "creates a merge request" do
- page.within(".merge-request") do
- expect(page).to have_content(title)
- end
- end
+ page.within(".merge-request") do
+ expect(page).to have_content(title)
end
-
- it_behaves_like 'merge request author auto assign'
end
context "XSS branch name exists" do
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 8a310aba77b..d461170c990 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -103,7 +103,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
it 'allows commenting' do
should_allow_commenting(find_by_scrolling('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]'))
- accept_gl_confirm(button_text: 'Delete Comment') do
+ accept_gl_confirm(button_text: 'Delete comment') do
first('button.more-actions-toggle').click
first('.js-note-delete').click
end
diff --git a/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb b/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb
index 56517a97716..60ea168940a 100644
--- a/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb
+++ b/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb
@@ -73,7 +73,7 @@ RSpec.describe 'Merge request > User scrolls to note on load', :js do
note_element = find(collapsed_fragment_id)
expect(note_element.visible?).to eq(true)
- expect(note_element.sibling('.replies-toggle')[:class]).to include('expanded')
+ expect(note_element.sibling('li:nth-child(2)')).to have_button s_('Notes|Collapse replies')
end
end
end
diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
index 0e9ff98c3e1..8225fcbfd89 100644
--- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
@@ -124,7 +124,7 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
it 'removes avatar when note is deleted' do
open_more_actions_dropdown(note)
- accept_gl_confirm(button_text: 'Delete Comment') do
+ accept_gl_confirm(button_text: 'Delete comment') do
find(".note-row-#{note.id} .js-note-delete").click
end
diff --git a/spec/features/merge_request/user_sees_deployment_widget_spec.rb b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
index 81034caaee2..e045f11c0d8 100644
--- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
before do
merge_request.update!(merge_commit_sha: sha)
- project.add_user(user, role)
+ project.add_member(user, role)
sign_in(user)
end
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 2dafd66b406..1d3effd4a2a 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -591,14 +591,14 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when a new failures exists' do
let(:base_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
end
let(:head_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_failed)
end
@@ -639,14 +639,14 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when an existing failure exists' do
let(:base_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_failed)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
end
let(:head_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_failed)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
@@ -686,14 +686,14 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when a resolved failure exists' do
let(:base_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_failed)
end
end
let(:head_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
@@ -732,14 +732,14 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when a new error exists' do
let(:base_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
end
let(:head_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_error)
end
@@ -779,14 +779,14 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when an existing error exists' do
let(:base_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_error)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
end
let(:head_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_error)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
@@ -825,14 +825,14 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when a resolved error exists' do
let(:base_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_error)
end
end
let(:head_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
reports.get_suite('junit').add_test_case(create_test_case_java_success)
end
@@ -871,7 +871,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'properly truncates the report' do
let(:base_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
10.times do |index|
reports.get_suite('rspec').add_test_case(
create_test_case_rspec_failed(index))
@@ -882,7 +882,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
end
let(:head_reports) do
- Gitlab::Ci::Reports::TestReports.new.tap do |reports|
+ Gitlab::Ci::Reports::TestReport.new.tap do |reports|
10.times do |index|
reports.get_suite('rspec').add_test_case(
create_test_case_rspec_failed(index))
diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb
index 9696b1ff551..16b1de0393f 100644
--- a/spec/features/merge_request/user_sees_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_spec.rb
@@ -123,10 +123,6 @@ RSpec.describe 'Merge request > User sees pipelines', :js do
context 'when actor is a developer in parent project' do
let(:actor) { developer_in_parent }
- before do
- stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: false)
- end
-
it 'creates a pipeline in the parent project when user proceeds with the warning' do
visit project_merge_request_path(parent_project, merge_request)
diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb
index 4465d7e29be..2c2a2dfd4a8 100644
--- a/spec/features/merge_request/user_sees_versions_spec.rb
+++ b/spec/features/merge_request/user_sees_versions_spec.rb
@@ -24,23 +24,21 @@ RSpec.describe 'Merge request > User sees versions', :js do
visit diffs_project_merge_request_path(project, merge_request, params)
end
- shared_examples 'allows commenting' do |file_id:, line_code:, comment:|
+ shared_examples 'allows commenting' do |file_name:, line_text:, comment:|
it do
- diff_file_selector = ".diff-file[id='#{file_id}']"
- line_code = "#{file_id}_#{line_code}"
+ page.within find_by_scrolling('.diff-file', text: file_name) do
+ line_code_element = page.find('.diff-grid-row', text: line_text)
- page.within find_by_scrolling(diff_file_selector) do
- line_code_element = first("[id='#{line_code}']")
# scrolling to element's bottom is required in order for .hover action to work
# otherwise, the element could be hidden underneath a sticky header
scroll_to_elements_bottom(line_code_element)
line_code_element.hover
- first("[id='#{line_code}'] [role='button']").click
+ page.find("[data-testid='left-comment-button']", visible: true).click
- page.within("form[data-line-code='#{line_code}']") do
- fill_in "note[note]", with: comment
- click_button('Add comment now')
- end
+ expect(page).to have_selector("form", count: 1)
+
+ fill_in("note[note]", with: comment)
+ click_button('Add comment now')
wait_for_requests
@@ -59,8 +57,8 @@ RSpec.describe 'Merge request > User sees versions', :js do
end
it_behaves_like 'allows commenting',
- file_id: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44',
- line_code: '1_1',
+ file_name: '.gitmodules',
+ line_text: '[submodule "six"]',
comment: 'Typo, please fix.'
end
@@ -107,8 +105,8 @@ RSpec.describe 'Merge request > User sees versions', :js do
end
it_behaves_like 'allows commenting',
- file_id: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44',
- line_code: '2_2',
+ file_name: '.gitmodules',
+ line_text: 'path = six',
comment: 'Typo, please fix.'
end
@@ -174,9 +172,9 @@ RSpec.describe 'Merge request > User sees versions', :js do
end
it_behaves_like 'allows commenting',
- file_id: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44',
- line_code: '4_4',
- comment: 'Typo, please fix.'
+ file_name: '.gitmodules',
+ line_text: '[submodule "gitlab-shell"]',
+ comment: 'Typo, please fix.'
end
describe 'compare with same version' do
@@ -241,8 +239,8 @@ RSpec.describe 'Merge request > User sees versions', :js do
end
it_behaves_like 'allows commenting',
- file_id: '2f6fcd96b88b36ce98c38da085c795a27d92a3dd',
- line_code: '6_6',
+ file_name: 'files/ruby/popen.rb',
+ line_text: 'RuntimeError',
comment: 'Typo, please fix.'
end
end
diff --git a/spec/features/milestone_spec.rb b/spec/features/milestone_spec.rb
index 5bbd89f1b88..2a1ea1a4e73 100644
--- a/spec/features/milestone_spec.rb
+++ b/spec/features/milestone_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe 'Milestone' do
end
find('input[name="commit"]').click
- expect(find('.alert-danger')).to have_content('already being used for another group or project milestone.')
+ expect(find('.gl-alert-danger')).to have_content('already being used for another group or project milestone.')
end
it 'displays validation message when there is a group milestone with same title' do
diff --git a/spec/features/monitor_sidebar_link_spec.rb b/spec/features/monitor_sidebar_link_spec.rb
index 3c59cd65cdb..b888e2f4171 100644
--- a/spec/features/monitor_sidebar_link_spec.rb
+++ b/spec/features/monitor_sidebar_link_spec.rb
@@ -45,7 +45,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures do
expect(page).not_to have_link('Alerts', href: project_alert_management_index_path(project))
expect(page).not_to have_link('Error Tracking', href: project_error_tracking_index_path(project))
expect(page).not_to have_link('Product Analytics', href: project_product_analytics_path(project))
- expect(page).not_to have_link('Logs', href: project_logs_path(project))
expect(page).not_to have_link('Kubernetes', href: project_clusters_path(project))
end
@@ -78,7 +77,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures do
expect(page).not_to have_link('Alerts', href: project_alert_management_index_path(project))
expect(page).not_to have_link('Error Tracking', href: project_error_tracking_index_path(project))
expect(page).not_to have_link('Product Analytics', href: project_product_analytics_path(project))
- expect(page).not_to have_link('Logs', href: project_logs_path(project))
expect(page).not_to have_link('Kubernetes', href: project_clusters_path(project))
end
@@ -96,7 +94,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures do
expect(page).to have_link('Product Analytics', href: project_product_analytics_path(project))
expect(page).not_to have_link('Alerts', href: project_alert_management_index_path(project))
- expect(page).not_to have_link('Logs', href: project_logs_path(project))
expect(page).not_to have_link('Kubernetes', href: project_clusters_path(project))
end
@@ -113,7 +110,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures do
expect(page).to have_link('Environments', href: project_environments_path(project))
expect(page).to have_link('Error Tracking', href: project_error_tracking_index_path(project))
expect(page).to have_link('Product Analytics', href: project_product_analytics_path(project))
- expect(page).to have_link('Logs', href: project_logs_path(project))
expect(page).to have_link('Kubernetes', href: project_clusters_path(project))
end
@@ -130,7 +126,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures do
expect(page).to have_link('Environments', href: project_environments_path(project))
expect(page).to have_link('Error Tracking', href: project_error_tracking_index_path(project))
expect(page).to have_link('Product Analytics', href: project_product_analytics_path(project))
- expect(page).to have_link('Logs', href: project_logs_path(project))
expect(page).to have_link('Kubernetes', href: project_clusters_path(project))
end
diff --git a/spec/features/nav/top_nav_responsive_spec.rb b/spec/features/nav/top_nav_responsive_spec.rb
index d571327e4b5..4f8e47b5068 100644
--- a/spec/features/nav/top_nav_responsive_spec.rb
+++ b/spec/features/nav/top_nav_responsive_spec.rb
@@ -41,7 +41,7 @@ RSpec.describe 'top nav responsive', :js do
end
it 'has new dropdown', :aggregate_failures do
- click_button('Create new')
+ click_button('Create new...')
expect(page).to have_link('New project', href: new_project_path)
expect(page).to have_link('New group', href: new_group_path)
diff --git a/spec/features/nav/top_nav_tooltip_spec.rb b/spec/features/nav/top_nav_tooltip_spec.rb
index 58bfe1caf65..73e4571e7a2 100644
--- a/spec/features/nav/top_nav_tooltip_spec.rb
+++ b/spec/features/nav/top_nav_tooltip_spec.rb
@@ -15,10 +15,10 @@ RSpec.describe 'top nav tooltips', :js do
page.find(btn).hover
- expect(page).to have_content('Create new')
+ expect(page).to have_content('Create new...')
page.find(btn).click
- expect(page).not_to have_content('Create new')
+ expect(page).not_to have_content('Create new...')
end
end
diff --git a/spec/features/profiles/account_spec.rb b/spec/features/profiles/account_spec.rb
index 6a4a1fca008..4fe0c3d035e 100644
--- a/spec/features/profiles/account_spec.rb
+++ b/spec/features/profiles/account_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'Profile > Account', :js do
sign_in(user)
end
- describe 'Social sign-in' do
+ describe 'Service sign-in' do
context 'when an identity does not exist' do
before do
allow(Devise).to receive_messages(omniauth_configs: { google_oauth2: {} })
diff --git a/spec/features/profiles/oauth_applications_spec.rb b/spec/features/profiles/oauth_applications_spec.rb
index ee1daf69f62..7d8cd2dc6ca 100644
--- a/spec/features/profiles/oauth_applications_spec.rb
+++ b/spec/features/profiles/oauth_applications_spec.rb
@@ -35,9 +35,61 @@ RSpec.describe 'Profile > Applications' do
expect(page).to have_content('Your applications (0)')
expect(page).to have_content('Authorized applications (0)')
end
+ end
+
+ describe 'Authorized applications', :js do
+ let(:other_user) { create(:user) }
+ let(:application) { create(:oauth_application, owner: user) }
+ let(:created_at) { 2.days.ago }
+ let(:token) { create(:oauth_access_token, application: application, resource_owner: user) }
+ let(:anonymous_token) { create(:oauth_access_token, resource_owner: user) }
+
+ context 'with multiple access token types and multiple owners' do
+ let!(:token2) { create(:oauth_access_token, application: application, resource_owner: user) }
+ let!(:other_user_token) { create(:oauth_access_token, application: application, resource_owner: other_user) }
+
+ before do
+ token.update_column(:created_at, created_at)
+ token2.update_column(:created_at, created_at - 1.day)
+ anonymous_token.update_columns(application_id: nil, created_at: 1.day.ago)
+ end
+
+ it 'displays the correct authorized applications' do
+ visit oauth_applications_path
+
+ expect(page).to have_content('Authorized applications (2)')
+
+ page.within('div.oauth-authorized-applications') do
+ # Ensure the correct user's token details are displayed
+ # when the application has more than one token
+ page.within("tr#application_#{application.id}") do
+ expect(page).to have_content(created_at)
+ end
+
+ expect(page).to have_content('Anonymous')
+ expect(page).not_to have_content(other_user_token.created_at)
+ end
+ end
+ end
it 'deletes an authorized application' do
- create(:oauth_access_token, resource_owner: user)
+ token
+ visit oauth_applications_path
+
+ page.within('div.oauth-authorized-applications') do
+ page.within("tr#application_#{application.id}") do
+ click_button 'Revoke'
+ end
+ end
+
+ accept_gl_confirm(button_text: 'Revoke application')
+
+ expect(page).to have_content('The application was revoked access.')
+ expect(page).to have_content('Authorized applications (0)')
+ end
+
+ it 'deletes an anonymous authorized application' do
+ anonymous_token
visit oauth_applications_path
page.within('.oauth-authorized-applications') do
@@ -48,7 +100,6 @@ RSpec.describe 'Profile > Applications' do
accept_gl_confirm(button_text: 'Revoke application')
expect(page).to have_content('The application was revoked access.')
- expect(page).to have_content('Your applications (0)')
expect(page).to have_content('Authorized applications (0)')
end
end
diff --git a/spec/features/profiles/password_spec.rb b/spec/features/profiles/password_spec.rb
index 7eadb74d2d4..07dfbca8cbd 100644
--- a/spec/features/profiles/password_spec.rb
+++ b/spec/features/profiles/password_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'Profile > Password' do
it 'shows an error message' do
fill_passwords('mypassword', 'mypassword2')
- page.within('.alert-danger') do
+ page.within('.gl-alert-danger') do
expect(page).to have_content("Password confirmation doesn't match Password")
end
end
diff --git a/spec/features/projects/blobs/blame_spec.rb b/spec/features/projects/blobs/blame_spec.rb
index bb3b5cd931c..3b2b74b469e 100644
--- a/spec/features/projects/blobs/blame_spec.rb
+++ b/spec/features/projects/blobs/blame_spec.rb
@@ -49,6 +49,12 @@ RSpec.describe 'File blame', :js do
expect(page).to have_css('#L3')
expect(find('.page-link.active')).to have_text('2')
end
+
+ it 'correctly redirects to the prior blame page' do
+ find('.version-link').click
+
+ expect(find('.page-link.active')).to have_text('2')
+ end
end
context 'when feature flag disabled' do
@@ -64,4 +70,37 @@ RSpec.describe 'File blame', :js do
end
end
end
+
+ context 'when blob length is over global max page limit' do
+ before do
+ stub_const('Projects::BlameService::PER_PAGE', 200)
+ end
+
+ let(:path) { 'files/markdown/ruby-style-guide.md' }
+
+ it 'displays two hundred lines of the file with pagination' do
+ visit_blob_blame(path)
+
+ expect(page).to have_css('.blame-commit')
+ expect(page).to have_css('.gl-pagination')
+
+ expect(page).to have_css('#L1')
+ expect(page).not_to have_css('#L201')
+ expect(find('.page-link.active')).to have_text('1')
+ end
+
+ context 'when user clicks on the next button' do
+ before do
+ visit_blob_blame(path)
+
+ find('.js-next-button').click
+ end
+
+ it 'displays next two hundred lines of the file with pagination' do
+ expect(page).not_to have_css('#L1')
+ expect(page).to have_css('#L201')
+ expect(find('.page-link.active')).to have_text('2')
+ end
+ end
+ end
end
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb
index 76baad63cc2..f5cafa2b2ec 100644
--- a/spec/features/projects/blobs/blob_show_spec.rb
+++ b/spec/features/projects/blobs/blob_show_spec.rb
@@ -29,176 +29,162 @@ RSpec.describe 'File blob', :js do
).execute
end
- context 'with refactor_blob_viewer feature flag enabled' do
- context 'Ruby file' do
+ context 'Ruby file' do
+ before do
+ visit_blob('files/ruby/popen.rb')
+
+ wait_for_requests
+ end
+
+ it 'displays the blob' do
+ aggregate_failures do
+ # shows highlighted Ruby code
+ expect(page).to have_css(".js-syntax-highlight")
+ expect(page).to have_content("require 'fileutils'")
+
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
+
+ # shows an enabled copy button
+ expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
+
+ # shows a raw button
+ expect(page).to have_link('Open raw')
+ end
+ end
+
+ it 'displays file actions on all screen sizes' do
+ file_actions_selector = '.file-actions'
+
+ resize_screen_sm
+ expect(page).to have_selector(file_actions_selector, visible: true)
+
+ resize_screen_xs
+ expect(page).to have_selector(file_actions_selector, visible: true)
+ end
+ end
+
+ context 'Markdown file' do
+ context 'visiting directly' do
before do
- visit_blob('files/ruby/popen.rb')
+ visit_blob('files/markdown/ruby-style-guide.md')
wait_for_requests
end
- it 'displays the blob' do
+ it 'displays the blob using the rich viewer' do
aggregate_failures do
- # shows highlighted Ruby code
- expect(page).to have_css(".js-syntax-highlight")
- expect(page).to have_content("require 'fileutils'")
+ # hides the simple viewer
+ expect(page).not_to have_selector('.blob-viewer[data-type="simple"]')
+ expect(page).to have_selector('.blob-viewer[data-type="rich"]')
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
+ # shows rendered Markdown
+ expect(page).to have_link("PEP-8")
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
+ # shows a viewer switcher
+ expect(page).to have_selector('.js-blob-viewer-switcher')
+
+ # shows a disabled copy button
+ expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
# shows a raw button
expect(page).to have_link('Open raw')
end
end
- it 'displays file actions on all screen sizes' do
- file_actions_selector = '.file-actions'
-
- resize_screen_sm
- expect(page).to have_selector(file_actions_selector, visible: true)
-
- resize_screen_xs
- expect(page).to have_selector(file_actions_selector, visible: true)
- end
- end
-
- context 'Markdown file' do
- context 'visiting directly' do
+ context 'switching to the simple viewer' do
before do
- visit_blob('files/markdown/ruby-style-guide.md')
+ find('.js-blob-viewer-switch-btn[data-viewer=simple]').click
wait_for_requests
end
- it 'displays the blob using the rich viewer' do
+ it 'displays the blob using the simple viewer' do
aggregate_failures do
- # hides the simple viewer
- expect(page).not_to have_selector('.blob-viewer[data-type="simple"]')
- expect(page).to have_selector('.blob-viewer[data-type="rich"]')
-
- # shows rendered Markdown
- expect(page).to have_link("PEP-8")
-
- # shows a viewer switcher
- expect(page).to have_selector('.js-blob-viewer-switcher')
+ # hides the rich viewer
+ expect(page).to have_selector('.blob-viewer[data-type="simple"]')
+ expect(page).not_to have_selector('.blob-viewer[data-type="rich"]')
- # shows a disabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
+ # shows highlighted Markdown code
+ expect(page).to have_css(".js-syntax-highlight")
+ expect(page).to have_content("[PEP-8](http://www.python.org/dev/peps/pep-0008/)")
- # shows a raw button
- expect(page).to have_link('Open raw')
+ # shows an enabled copy button
+ expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
end
end
- context 'switching to the simple viewer' do
+ context 'switching to the rich viewer again' do
before do
- find('.js-blob-viewer-switch-btn[data-viewer=simple]').click
+ find('.js-blob-viewer-switch-btn[data-viewer=rich]').click
wait_for_requests
end
- it 'displays the blob using the simple viewer' do
+ it 'displays the blob using the rich viewer' do
aggregate_failures do
- # hides the rich viewer
- expect(page).to have_selector('.blob-viewer[data-type="simple"]')
- expect(page).not_to have_selector('.blob-viewer[data-type="rich"]')
+ # hides the simple viewer
+ expect(page).not_to have_selector('.blob-viewer[data-type="simple"]')
+ expect(page).to have_selector('.blob-viewer[data-type="rich"]')
- # shows highlighted Markdown code
- expect(page).to have_css(".js-syntax-highlight")
- expect(page).to have_content("[PEP-8](http://www.python.org/dev/peps/pep-0008/)")
-
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
- end
- end
-
- context 'switching to the rich viewer again' do
- before do
- find('.js-blob-viewer-switch-btn[data-viewer=rich]').click
-
- wait_for_requests
- end
-
- it 'displays the blob using the rich viewer' do
- aggregate_failures do
- # hides the simple viewer
- expect(page).not_to have_selector('.blob-viewer[data-type="simple"]')
- expect(page).to have_selector('.blob-viewer[data-type="rich"]')
-
- # shows a disabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
- end
+ # shows a disabled copy button
+ expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
end
end
end
end
+ end
- context 'when ref switch' do
- def switch_ref_to(ref_name)
- first('.qa-branches-select').click # rubocop:disable QA/SelectorUsage
+ context 'when ref switch' do
+ def switch_ref_to(ref_name)
+ first('.qa-branches-select').click # rubocop:disable QA/SelectorUsage
- page.within '.project-refs-form' do
- click_link ref_name
- wait_for_requests
- end
+ page.within '.project-refs-form' do
+ click_link ref_name
+ wait_for_requests
end
+ end
- it 'displays no highlighted number of different ref' do
- Files::UpdateService.new(
- project,
- project.first_owner,
- commit_message: 'Update',
- start_branch: 'feature',
- branch_name: 'feature',
- file_path: 'files/js/application.js',
- file_content: 'new content'
- ).execute
+ it 'displays no highlighted number of different ref' do
+ Files::UpdateService.new(
+ project,
+ project.first_owner,
+ commit_message: 'Update',
+ start_branch: 'feature',
+ branch_name: 'feature',
+ file_path: 'files/js/application.js',
+ file_content: 'new content'
+ ).execute
- project.commit('feature').diffs.diff_files.first
+ project.commit('feature').diffs.diff_files.first
- visit_blob('files/js/application.js', anchor: 'L3')
- switch_ref_to('feature')
+ visit_blob('files/js/application.js', anchor: 'L3')
+ switch_ref_to('feature')
- page.within '.blob-content' do
- expect(page).not_to have_css('.hll')
- end
+ page.within '.blob-content' do
+ expect(page).not_to have_css('.hll')
end
+ end
- context 'successfully change ref of similar name' do
- before do
- project.repository.create_branch('dev')
- project.repository.create_branch('development')
- end
-
- it 'switch ref from longer to shorter ref name' do
- visit_blob('files/js/application.js', ref: 'development')
- switch_ref_to('dev')
-
- aggregate_failures do
- expect(page.find('.file-title-name').text).to eq('application.js')
- expect(page).not_to have_css('flash-container')
- end
- end
+ context 'successfully change ref of similar name' do
+ before do
+ project.repository.create_branch('dev')
+ project.repository.create_branch('development')
+ end
- it 'switch ref from shorter to longer ref name' do
- visit_blob('files/js/application.js', ref: 'dev')
- switch_ref_to('development')
+ it 'switch ref from longer to shorter ref name' do
+ visit_blob('files/js/application.js', ref: 'development')
+ switch_ref_to('dev')
- aggregate_failures do
- expect(page.find('.file-title-name').text).to eq('application.js')
- expect(page).not_to have_css('flash-container')
- end
+ aggregate_failures do
+ expect(page.find('.file-title-name').text).to eq('application.js')
+ expect(page).not_to have_css('flash-container')
end
end
- it 'successfully changes ref when the ref name matches the project name' do
- project.repository.create_branch(project.name)
-
- visit_blob('files/js/application.js', ref: project.name)
- switch_ref_to('master')
+ it 'switch ref from shorter to longer ref name' do
+ visit_blob('files/js/application.js', ref: 'dev')
+ switch_ref_to('development')
aggregate_failures do
expect(page.find('.file-title-name').text).to eq('application.js')
@@ -206,133 +192,216 @@ RSpec.describe 'File blob', :js do
end
end
end
+
+ it 'successfully changes ref when the ref name matches the project name' do
+ project.repository.create_branch(project.name)
+
+ visit_blob('files/js/application.js', ref: project.name)
+ switch_ref_to('master')
+
+ aggregate_failures do
+ expect(page.find('.file-title-name').text).to eq('application.js')
+ expect(page).not_to have_css('flash-container')
+ end
+ end
+ end
+ end
+
+ context 'Markdown rendering' do
+ before do
+ project.add_maintainer(project.creator)
+
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add RedCarpet and CommonMark Markdown ",
+ file_path: 'files/commonmark/file.md',
+ file_content: "1. one\n - sublist\n"
+ ).execute
end
- context 'Markdown rendering' do
+ context 'when rendering default markdown' do
before do
- project.add_maintainer(project.creator)
+ visit_blob('files/commonmark/file.md')
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add RedCarpet and CommonMark Markdown ",
- file_path: 'files/commonmark/file.md',
- file_content: "1. one\n - sublist\n"
- ).execute
+ wait_for_requests
end
- context 'when rendering default markdown' do
- before do
- visit_blob('files/commonmark/file.md')
-
- wait_for_requests
+ it 'renders using CommonMark' do
+ aggregate_failures do
+ expect(page).to have_content("sublist")
+ expect(page).not_to have_xpath("//ol//li//ul")
end
+ end
+ end
+ end
- it 'renders using CommonMark' do
- aggregate_failures do
- expect(page).to have_content("sublist")
- expect(page).not_to have_xpath("//ol//li//ul")
- end
+ context 'Markdown file (stored in LFS)' do
+ before do
+ project.add_maintainer(project.creator)
+
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add Markdown in LFS",
+ file_path: 'files/lfs/file.md',
+ file_content: project.repository.blob_at('master', 'files/lfs/lfs_object.iso').data
+ ).execute
+ end
+
+ context 'when LFS is enabled on the project' do
+ before do
+ allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
+ project.update_attribute(:lfs_enabled, true)
+
+ visit_blob('files/lfs/file.md')
+
+ wait_for_requests
+ end
+
+ it 'displays an error' do
+ aggregate_failures do
+ # hides the simple viewer
+ expect(page).not_to have_selector('.blob-viewer[data-type="simple"]')
+ expect(page).not_to have_selector('.blob-viewer[data-type="rich"]')
+
+ # shows an error message
+ expect(page).to have_content('This content could not be displayed because it is stored in LFS. You can download it instead.')
+
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
+
+ # does not show a copy button
+ expect(page).not_to have_selector('.js-copy-blob-source-btn')
+
+ # shows a download button
+ expect(page).to have_link('Download')
end
end
end
- context 'Markdown file (stored in LFS)' do
+ context 'when LFS is disabled on the project' do
before do
- project.add_maintainer(project.creator)
+ visit_blob('files/lfs/file.md')
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add Markdown in LFS",
- file_path: 'files/lfs/file.md',
- file_content: project.repository.blob_at('master', 'files/lfs/lfs_object.iso').data
- ).execute
+ wait_for_requests
end
- context 'when LFS is enabled on the project' do
- before do
- allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
- project.update_attribute(:lfs_enabled, true)
+ it 'displays the blob' do
+ aggregate_failures do
+ # shows text
+ expect(page).to have_content('size 1575078')
+
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
- visit_blob('files/lfs/file.md')
+ # shows an enabled copy button
+ expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
- wait_for_requests
+ # shows a raw button
+ expect(page).to have_link('Open raw')
end
+ end
+ end
+ end
- it 'displays an error' do
- aggregate_failures do
- # hides the simple viewer
- expect(page).not_to have_selector('.blob-viewer[data-type="simple"]')
- expect(page).not_to have_selector('.blob-viewer[data-type="rich"]')
+ context 'PDF file' do
+ before do
+ project.add_maintainer(project.creator)
- # shows an error message
- expect(page).to have_content('This content could not be displayed because it is stored in LFS. You can download it instead.')
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add PDF",
+ file_path: 'files/test.pdf',
+ file_content: project.repository.blob_at('add-pdf-file', 'files/pdf/test.pdf').data
+ ).execute
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
+ visit_blob('files/test.pdf')
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
+ wait_for_requests
+ end
- # shows a download button
- expect(page).to have_link('Download')
- end
- end
+ it 'displays the blob' do
+ aggregate_failures do
+ # shows rendered PDF
+ expect(page).to have_selector('.js-pdf-viewer')
+
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
+
+ # does not show a copy button
+ expect(page).not_to have_selector('.js-copy-blob-source-btn')
+
+ # shows a download button
+ expect(page).to have_link('Download')
end
+ end
+ end
- context 'when LFS is disabled on the project' do
- before do
- visit_blob('files/lfs/file.md')
+ context 'Jupiter Notebook file' do
+ before do
+ project.add_maintainer(project.creator)
- wait_for_requests
- end
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add Jupiter Notebook",
+ file_path: 'files/basic.ipynb',
+ file_content: project.repository.blob_at('add-ipython-files', 'files/ipython/basic.ipynb').data
+ ).execute
- it 'displays the blob' do
- aggregate_failures do
- # shows text
- expect(page).to have_content('size 1575078')
+ visit_blob('files/basic.ipynb')
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
+ wait_for_requests
+ end
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
+ it 'displays the blob' do
+ aggregate_failures do
+ # shows rendered notebook
+ expect(page).to have_selector('.js-notebook-viewer-mounted')
- # shows a raw button
- expect(page).to have_link('Open raw')
- end
- end
+ # does show a viewer switcher
+ expect(page).to have_selector('.js-blob-viewer-switcher')
+
+ # show a disabled copy button
+ expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
+
+ # shows a raw button
+ expect(page).to have_link('Open raw')
+
+ # shows a download button
+ expect(page).to have_link('Download')
+
+ # shows the rendered notebook
+ expect(page).to have_content('test')
end
end
+ end
- context 'PDF file' do
+ context 'ISO file (stored in LFS)' do
+ context 'when LFS is enabled on the project' do
before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add PDF",
- file_path: 'files/test.pdf',
- file_content: project.repository.blob_at('add-pdf-file', 'files/pdf/test.pdf').data
- ).execute
+ allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
+ project.update_attribute(:lfs_enabled, true)
- visit_blob('files/test.pdf')
+ visit_blob('files/lfs/lfs_object.iso')
wait_for_requests
end
it 'displays the blob' do
aggregate_failures do
- # shows rendered PDF
- expect(page).to have_selector('.js-pdf-viewer')
+ # shows a download link
+ expect(page).to have_link('Download (1.50 MiB)')
# does not show a viewer switcher
expect(page).not_to have_selector('.js-blob-viewer-switcher')
@@ -346,126 +415,108 @@ RSpec.describe 'File blob', :js do
end
end
- context 'Jupiter Notebook file' do
+ context 'when LFS is disabled on the project' do
before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add Jupiter Notebook",
- file_path: 'files/basic.ipynb',
- file_content: project.repository.blob_at('add-ipython-files', 'files/ipython/basic.ipynb').data
- ).execute
-
- visit_blob('files/basic.ipynb')
+ visit_blob('files/lfs/lfs_object.iso')
wait_for_requests
end
it 'displays the blob' do
aggregate_failures do
- # shows rendered notebook
- expect(page).to have_selector('.js-notebook-viewer-mounted')
+ # shows text
+ expect(page).to have_content('size 1575078')
- # does show a viewer switcher
- expect(page).to have_selector('.js-blob-viewer-switcher')
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
- # show a disabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
+ # shows an enabled copy button
+ expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
# shows a raw button
expect(page).to have_link('Open raw')
-
- # shows a download button
- expect(page).to have_link('Download')
-
- # shows the rendered notebook
- expect(page).to have_content('test')
end
end
end
+ end
- context 'ISO file (stored in LFS)' do
- context 'when LFS is enabled on the project' do
- before do
- allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
- project.update_attribute(:lfs_enabled, true)
-
- visit_blob('files/lfs/lfs_object.iso')
+ context 'ZIP file' do
+ before do
+ visit_blob('Gemfile.zip')
- wait_for_requests
- end
+ wait_for_requests
+ end
- it 'displays the blob' do
- aggregate_failures do
- # shows a download link
- expect(page).to have_link('Download (1.50 MiB)')
+ it 'displays the blob' do
+ aggregate_failures do
+ # shows a download link
+ expect(page).to have_link('Download (2.11 KiB)')
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
+ # does not show a copy button
+ expect(page).not_to have_selector('.js-copy-blob-source-btn')
- # shows a download button
- expect(page).to have_link('Download')
- end
- end
+ # shows a download button
+ expect(page).to have_link('Download')
end
+ end
+ end
- context 'when LFS is disabled on the project' do
- before do
- visit_blob('files/lfs/lfs_object.iso')
+ context 'binary file that appears to be text in the first 1024 bytes' do
+ before do
+ visit_blob('encoding/binary-1.bin', ref: 'binary-encoding')
+ end
- wait_for_requests
- end
+ it 'displays the blob' do
+ expect(page).to have_link('Download (23.81 KiB)')
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
+ expect(page).not_to have_selector('.js-copy-blob-source-btn:not(.disabled)')
+ expect(page).not_to have_link('Open raw')
+ end
+ end
- it 'displays the blob' do
- aggregate_failures do
- # shows text
- expect(page).to have_content('size 1575078')
+ context 'empty file' do
+ before do
+ project.add_maintainer(project.creator)
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add empty file",
+ file_path: 'files/empty.md',
+ file_content: ''
+ ).execute
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
+ visit_blob('files/empty.md')
- # shows a raw button
- expect(page).to have_link('Open raw')
- end
- end
- end
+ wait_for_requests
end
- context 'ZIP file' do
- before do
- visit_blob('Gemfile.zip')
+ it 'displays an error' do
+ aggregate_failures do
+ # shows an error message
+ expect(page).to have_content('Empty file')
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows a download link
- expect(page).to have_link('Download (2.11 KiB)')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
+ # does not show a viewer switcher
+ expect(page).not_to have_selector('.js-blob-viewer-switcher')
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
+ # does not show a copy button
+ expect(page).not_to have_selector('.js-copy-blob-source-btn')
- # shows a download button
- expect(page).to have_link('Download')
- end
+ # does not show a download or raw button
+ expect(page).not_to have_link('Download')
+ expect(page).not_to have_link('Open raw')
end
end
+ end
- context 'empty file' do
+ context 'files with auxiliary viewers' do
+ describe '.gitlab-ci.yml' do
before do
project.add_maintainer(project.creator)
@@ -474,660 +525,586 @@ RSpec.describe 'File blob', :js do
project.creator,
start_branch: 'master',
branch_name: 'master',
- commit_message: "Add empty file",
- file_path: 'files/empty.md',
- file_content: ''
+ commit_message: "Add .gitlab-ci.yml",
+ file_path: '.gitlab-ci.yml',
+ file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
).execute
- visit_blob('files/empty.md')
-
- wait_for_requests
+ visit_blob('.gitlab-ci.yml')
end
- it 'displays an error' do
+ it 'displays an auxiliary viewer' do
aggregate_failures do
- # shows an error message
- expect(page).to have_content('Empty file')
+ # shows that configuration is valid
+ expect(page).to have_content('This GitLab CI configuration is valid.')
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
-
- # does not show a download or raw button
- expect(page).not_to have_link('Download')
- expect(page).not_to have_link('Open raw')
+ # shows a learn more link
+ expect(page).to have_link('Learn more')
end
end
end
- context 'files with auxiliary viewers' do
- describe '.gitlab-ci.yml' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab-ci.yml",
- file_path: '.gitlab-ci.yml',
- file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
- ).execute
-
- visit_blob('.gitlab-ci.yml')
- end
+ describe '.gitlab/route-map.yml' do
+ before do
+ project.add_maintainer(project.creator)
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that configuration is valid
- expect(page).to have_content('This GitLab CI configuration is valid.')
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add .gitlab/route-map.yml",
+ file_path: '.gitlab/route-map.yml',
+ file_content: <<-MAP.strip_heredoc
+ # Team data
+ - source: 'data/team.yml'
+ public: 'team/'
+ MAP
+ ).execute
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
+ visit_blob('.gitlab/route-map.yml')
end
- describe '.gitlab/route-map.yml' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab/route-map.yml",
- file_path: '.gitlab/route-map.yml',
- file_content: <<-MAP.strip_heredoc
- # Team data
- - source: 'data/team.yml'
- public: 'team/'
- MAP
- ).execute
-
- visit_blob('.gitlab/route-map.yml')
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ # shows that map is valid
+ expect(page).to have_content('This Route Map is valid.')
+
+ # shows a learn more link
+ expect(page).to have_link('Learn more')
end
+ end
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that map is valid
- expect(page).to have_content('This Route Map is valid.')
+ describe '.gitlab/dashboards/custom-dashboard.yml' do
+ before do
+ project.add_maintainer(project.creator)
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add .gitlab/dashboards/custom-dashboard.yml",
+ file_path: '.gitlab/dashboards/custom-dashboard.yml',
+ file_content: file_content
+ ).execute
end
- describe '.gitlab/dashboards/custom-dashboard.yml' do
+ context 'with metrics_dashboard_exhaustive_validations feature flag off' do
before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab/dashboards/custom-dashboard.yml",
- file_path: '.gitlab/dashboards/custom-dashboard.yml',
- file_content: file_content
- ).execute
+ stub_feature_flags(metrics_dashboard_exhaustive_validations: false)
+ visit_blob('.gitlab/dashboards/custom-dashboard.yml')
end
- context 'with metrics_dashboard_exhaustive_validations feature flag off' do
- before do
- stub_feature_flags(metrics_dashboard_exhaustive_validations: false)
- visit_blob('.gitlab/dashboards/custom-dashboard.yml')
- end
+ context 'valid dashboard file' do
+ let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) }
- context 'valid dashboard file' do
- let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) }
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is valid
- expect(page).to have_content('Metrics Dashboard YAML definition is valid.')
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ # shows that dashboard yaml is valid
+ expect(page).to have_content('Metrics Dashboard YAML definition is valid.')
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
+ # shows a learn more link
+ expect(page).to have_link('Learn more')
end
end
+ end
- context 'invalid dashboard file' do
- let(:file_content) { "dashboard: 'invalid'" }
+ context 'invalid dashboard file' do
+ let(:file_content) { "dashboard: 'invalid'" }
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is invalid
- expect(page).to have_content('Metrics Dashboard YAML definition is invalid:')
- expect(page).to have_content("panel_groups: should be an array of panel_groups objects")
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ # shows that dashboard yaml is invalid
+ expect(page).to have_content('Metrics Dashboard YAML definition is invalid:')
+ expect(page).to have_content("panel_groups: should be an array of panel_groups objects")
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
+ # shows a learn more link
+ expect(page).to have_link('Learn more')
end
end
end
+ end
- context 'with metrics_dashboard_exhaustive_validations feature flag on' do
- before do
- stub_feature_flags(metrics_dashboard_exhaustive_validations: true)
- visit_blob('.gitlab/dashboards/custom-dashboard.yml')
- end
+ context 'with metrics_dashboard_exhaustive_validations feature flag on' do
+ before do
+ stub_feature_flags(metrics_dashboard_exhaustive_validations: true)
+ visit_blob('.gitlab/dashboards/custom-dashboard.yml')
+ end
- context 'valid dashboard file' do
- let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) }
+ context 'valid dashboard file' do
+ let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) }
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is valid
- expect(page).to have_content('Metrics Dashboard YAML definition is valid.')
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ # shows that dashboard yaml is valid
+ expect(page).to have_content('Metrics Dashboard YAML definition is valid.')
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
+ # shows a learn more link
+ expect(page).to have_link('Learn more')
end
end
+ end
- context 'invalid dashboard file' do
- let(:file_content) { "dashboard: 'invalid'" }
+ context 'invalid dashboard file' do
+ let(:file_content) { "dashboard: 'invalid'" }
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is invalid
- expect(page).to have_content('Metrics Dashboard YAML definition is invalid:')
- expect(page).to have_content("root is missing required keys: panel_groups")
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ # shows that dashboard yaml is invalid
+ expect(page).to have_content('Metrics Dashboard YAML definition is invalid:')
+ expect(page).to have_content("root is missing required keys: panel_groups")
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
+ # shows a learn more link
+ expect(page).to have_link('Learn more')
end
end
end
end
+ end
- context 'LICENSE' do
- before do
- visit_blob('LICENSE')
- end
+ context 'LICENSE' do
+ before do
+ visit_blob('LICENSE')
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows license
- expect(page).to have_content('This project is licensed under the MIT License.')
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ # shows license
+ expect(page).to have_content('This project is licensed under the MIT License.')
- # shows a learn more link
- expect(page).to have_link('Learn more', href: 'http://choosealicense.com/licenses/mit/')
- end
+ # shows a learn more link
+ expect(page).to have_link('Learn more', href: 'http://choosealicense.com/licenses/mit/')
end
end
+ end
- context '*.gemspec' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add activerecord.gemspec",
- file_path: 'activerecord.gemspec',
- file_content: <<-SPEC.strip_heredoc
- Gem::Specification.new do |s|
- s.platform = Gem::Platform::RUBY
- s.name = "activerecord"
- end
- SPEC
- ).execute
-
- visit_blob('activerecord.gemspec')
- end
+ context '*.gemspec' do
+ before do
+ project.add_maintainer(project.creator)
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows names of dependency manager and package
- expect(page).to have_content('This project manages its dependencies using RubyGems.')
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add activerecord.gemspec",
+ file_path: 'activerecord.gemspec',
+ file_content: <<-SPEC.strip_heredoc
+ Gem::Specification.new do |s|
+ s.platform = Gem::Platform::RUBY
+ s.name = "activerecord"
+ end
+ SPEC
+ ).execute
- # shows a learn more link
- expect(page).to have_link('Learn more', href: 'https://rubygems.org/')
- end
- end
+ visit_blob('activerecord.gemspec')
end
- context 'CONTRIBUTING.md' do
- before do
- file_name = 'CONTRIBUTING.md'
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ # shows names of dependency manager and package
+ expect(page).to have_content('This project manages its dependencies using RubyGems.')
- create_file(file_name, '## Contribution guidelines')
- visit_blob(file_name)
+ # shows a learn more link
+ expect(page).to have_link('Learn more', href: 'https://rubygems.org/')
end
+ end
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("After you've reviewed these contribution guidelines, you'll be all set to contribute to this project.")
- end
+ context 'CONTRIBUTING.md' do
+ before do
+ file_name = 'CONTRIBUTING.md'
+
+ create_file(file_name, '## Contribution guidelines')
+ visit_blob(file_name)
+ end
+
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("After you've reviewed these contribution guidelines, you'll be all set to contribute to this project.")
end
end
+ end
- context 'CHANGELOG.md' do
- before do
- file_name = 'CHANGELOG.md'
+ context 'CHANGELOG.md' do
+ before do
+ file_name = 'CHANGELOG.md'
- create_file(file_name, '## Changelog for v1.0.0')
- visit_blob(file_name)
- end
+ create_file(file_name, '## Changelog for v1.0.0')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("To find the state of this project's repository at the time of any of these versions, check out the tags.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("To find the state of this project's repository at the time of any of these versions, check out the tags.")
end
end
+ end
- context 'Cargo.toml' do
- before do
- file_name = 'Cargo.toml'
-
- create_file(file_name, '
- [package]
- name = "hello_world" # the name of the package
- version = "0.1.0" # the current version, obeying semver
- authors = ["Alice <a@example.com>", "Bob <b@example.com>"]
- ')
- visit_blob(file_name)
- end
+ context 'Cargo.toml' do
+ before do
+ file_name = 'Cargo.toml'
+
+ create_file(file_name, '
+ [package]
+ name = "hello_world" # the name of the package
+ version = "0.1.0" # the current version, obeying semver
+ authors = ["Alice <a@example.com>", "Bob <b@example.com>"]
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Cargo.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using Cargo.")
end
end
+ end
- context 'Cartfile' do
- before do
- file_name = 'Cartfile'
+ context 'Cartfile' do
+ before do
+ file_name = 'Cartfile'
- create_file(file_name, '
- gitlab "Alamofire/Alamofire" == 4.9.0
- gitlab "Alamofire/AlamofireImage" ~> 3.4
- ')
- visit_blob(file_name)
- end
+ create_file(file_name, '
+ gitlab "Alamofire/Alamofire" == 4.9.0
+ gitlab "Alamofire/AlamofireImage" ~> 3.4
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Carthage.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using Carthage.")
end
end
+ end
- context 'composer.json' do
- before do
- file_name = 'composer.json'
-
- create_file(file_name, '
- {
- "license": "MIT"
- }
- ')
- visit_blob(file_name)
- end
+ context 'composer.json' do
+ before do
+ file_name = 'composer.json'
+
+ create_file(file_name, '
+ {
+ "license": "MIT"
+ }
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Composer.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using Composer.")
end
end
+ end
- context 'Gemfile' do
- before do
- file_name = 'Gemfile'
+ context 'Gemfile' do
+ before do
+ file_name = 'Gemfile'
- create_file(file_name, '
- source "https://rubygems.org"
+ create_file(file_name, '
+ source "https://rubygems.org"
- # Gems here
- ')
- visit_blob(file_name)
- end
+ # Gems here
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Bundler.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using Bundler.")
end
end
+ end
- context 'Godeps.json' do
- before do
- file_name = 'Godeps.json'
-
- create_file(file_name, '
- {
- "GoVersion": "go1.6"
- }
- ')
- visit_blob(file_name)
- end
+ context 'Godeps.json' do
+ before do
+ file_name = 'Godeps.json'
+
+ create_file(file_name, '
+ {
+ "GoVersion": "go1.6"
+ }
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using godep.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using godep.")
end
end
+ end
- context 'go.mod' do
- before do
- file_name = 'go.mod'
+ context 'go.mod' do
+ before do
+ file_name = 'go.mod'
- create_file(file_name, '
- module example.com/mymodule
+ create_file(file_name, '
+ module example.com/mymodule
- go 1.14
- ')
- visit_blob(file_name)
- end
+ go 1.14
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Go Modules.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using Go Modules.")
end
end
+ end
- context 'package.json' do
- before do
- file_name = 'package.json'
-
- create_file(file_name, '
- {
- "name": "my-awesome-package",
- "version": "1.0.0"
- }
- ')
- visit_blob(file_name)
- end
+ context 'package.json' do
+ before do
+ file_name = 'package.json'
+
+ create_file(file_name, '
+ {
+ "name": "my-awesome-package",
+ "version": "1.0.0"
+ }
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using npm.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using npm.")
end
end
+ end
- context 'podfile' do
- before do
- file_name = 'podfile'
+ context 'podfile' do
+ before do
+ file_name = 'podfile'
- create_file(file_name, 'platform :ios, "8.0"')
- visit_blob(file_name)
- end
+ create_file(file_name, 'platform :ios, "8.0"')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using CocoaPods.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using CocoaPods.")
end
end
+ end
- context 'test.podspec' do
- before do
- file_name = 'test.podspec'
-
- create_file(file_name, '
- Pod::Spec.new do |s|
- s.name = "TensorFlowLiteC"
- ')
- visit_blob(file_name)
- end
+ context 'test.podspec' do
+ before do
+ file_name = 'test.podspec'
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using CocoaPods.")
- end
- end
+ create_file(file_name, '
+ Pod::Spec.new do |s|
+ s.name = "TensorFlowLiteC"
+ ')
+ visit_blob(file_name)
end
- context 'JSON.podspec.json' do
- before do
- file_name = 'JSON.podspec.json'
-
- create_file(file_name, '
- {
- "name": "JSON"
- }
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using CocoaPods.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using CocoaPods.")
end
end
+ end
- context 'requirements.txt' do
- before do
- file_name = 'requirements.txt'
-
- create_file(file_name, 'Project requirements')
- visit_blob(file_name)
- end
+ context 'JSON.podspec.json' do
+ before do
+ file_name = 'JSON.podspec.json'
+
+ create_file(file_name, '
+ {
+ "name": "JSON"
+ }
+ ')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using pip.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using CocoaPods.")
end
end
+ end
- context 'yarn.lock' do
- before do
- file_name = 'yarn.lock'
+ context 'requirements.txt' do
+ before do
+ file_name = 'requirements.txt'
- create_file(file_name, '
- # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
- # yarn lockfile v1
- ')
- visit_blob(file_name)
- end
+ create_file(file_name, 'Project requirements')
+ visit_blob(file_name)
+ end
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Yarn.")
- end
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using pip.")
end
end
+ end
- context 'openapi.yml' do
- before do
- file_name = 'openapi.yml'
-
- create_file(file_name, '
- swagger: \'2.0\'
- info:
- title: Classic API Resource Documentation
- description: |
- <div class="foo-bar" style="background-color: red;" data-foo-bar="baz">
- <h1>Swagger API documentation</h1>
- </div>
- version: production
- basePath: /JSSResource/
- produces:
- - application/xml
- - application/json
- consumes:
- - application/xml
- - application/json
- security:
- - basicAuth: []
- paths:
- /accounts:
- get:
- responses:
- \'200\':
- description: No response was specified
- tags:
- - accounts
- operationId: findAccounts
- summary: Finds all accounts
- ')
- visit_blob(file_name, useUnsafeMarkdown: '1')
- click_button('Display rendered file')
+ context 'yarn.lock' do
+ before do
+ file_name = 'yarn.lock'
- wait_for_requests
- end
+ create_file(file_name, '
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+ # yarn lockfile v1
+ ')
+ visit_blob(file_name)
+ end
- it 'removes `style`, `class`, and `data-*`` attributes from HTML' do
- expect(page).to have_css('h1', text: 'Swagger API documentation')
- expect(page).not_to have_css('.foo-bar')
- expect(page).not_to have_css('[style="background-color: red;"]')
- expect(page).not_to have_css('[data-foo-bar="baz"]')
+ it 'displays an auxiliary viewer' do
+ aggregate_failures do
+ expect(page).to have_content("This project manages its dependencies using Yarn.")
end
end
end
- context 'realtime pipelines' do
+ context 'openapi.yml' do
before do
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'feature',
- branch_name: 'feature',
- commit_message: "Add ruby file",
- file_path: 'files/ruby/test.rb',
- file_content: "# Awesome content"
- ).execute
+ file_name = 'openapi.yml'
+
+ create_file(file_name, '
+ swagger: \'2.0\'
+ info:
+ title: Classic API Resource Documentation
+ description: |
+ <div class="foo-bar" style="background-color: red;" data-foo-bar="baz">
+ <h1>Swagger API documentation</h1>
+ </div>
+ version: production
+ basePath: /JSSResource/
+ produces:
+ - application/xml
+ - application/json
+ consumes:
+ - application/xml
+ - application/json
+ security:
+ - basicAuth: []
+ paths:
+ /accounts:
+ get:
+ responses:
+ \'200\':
+ description: No response was specified
+ tags:
+ - accounts
+ operationId: findAccounts
+ summary: Finds all accounts
+ ')
+ visit_blob(file_name, useUnsafeMarkdown: '1')
+ click_button('Display rendered file')
- create(:ci_pipeline, status: 'running', project: project, ref: 'feature', sha: project.commit('feature').sha)
- visit_blob('files/ruby/test.rb', ref: 'feature')
+ wait_for_requests
end
- it 'shows the realtime pipeline status' do
- page.within('.commit-actions') do
- expect(page).to have_css('.ci-status-icon')
- expect(page).to have_css('.ci-status-icon-running')
- expect(page).to have_css('.js-ci-status-icon-running')
- end
+ it 'removes `style`, `class`, and `data-*`` attributes from HTML' do
+ expect(page).to have_css('h1', text: 'Swagger API documentation')
+ expect(page).not_to have_css('.foo-bar')
+ expect(page).not_to have_css('[style="background-color: red;"]')
+ expect(page).not_to have_css('[data-foo-bar="baz"]')
end
end
+ end
- context 'for subgroups' do
- let(:group) { create(:group) }
- let(:subgroup) { create(:group, parent: group) }
- let(:project) { create(:project, :public, :repository, group: subgroup) }
-
- it 'renders tree table without errors' do
- visit_blob('README.md')
+ context 'realtime pipelines' do
+ before do
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'feature',
+ branch_name: 'feature',
+ commit_message: "Add ruby file",
+ file_path: 'files/ruby/test.rb',
+ file_content: "# Awesome content"
+ ).execute
+
+ create(:ci_pipeline, status: 'running', project: project, ref: 'feature', sha: project.commit('feature').sha)
+ visit_blob('files/ruby/test.rb', ref: 'feature')
+ end
- expect(page).to have_selector('.file-content')
- expect(page).not_to have_selector('[data-testid="alert-danger"]')
+ it 'shows the realtime pipeline status' do
+ page.within('.commit-actions') do
+ expect(page).to have_css('.ci-status-icon')
+ expect(page).to have_css('.ci-status-icon-running')
+ expect(page).to have_css('.js-ci-status-icon-running')
end
+ end
+ end
- it 'displays a GPG badge' do
- visit_blob('CONTRIBUTING.md', ref: '33f3729a45c02fc67d00adb1b8bca394b0e761d9')
+ context 'for subgroups' do
+ let(:group) { create(:group) }
+ let(:subgroup) { create(:group, parent: group) }
+ let(:project) { create(:project, :public, :repository, group: subgroup) }
- expect(page).not_to have_selector '.gpg-status-box.js-loading-gpg-badge'
- expect(page).to have_selector '.gpg-status-box.invalid'
- end
+ it 'renders tree table without errors' do
+ visit_blob('README.md')
+
+ expect(page).to have_selector('.file-content')
+ expect(page).not_to have_selector('[data-testid="alert-danger"]')
end
- context 'on signed merge commit' do
- it 'displays a GPG badge' do
- visit_blob('conflicting-file.md', ref: '6101e87e575de14b38b4e1ce180519a813671e10')
+ it 'displays a GPG badge' do
+ visit_blob('CONTRIBUTING.md', ref: '33f3729a45c02fc67d00adb1b8bca394b0e761d9')
- expect(page).not_to have_selector '.gpg-status-box.js-loading-gpg-badge'
- expect(page).to have_selector '.gpg-status-box.invalid'
- end
+ expect(page).not_to have_selector '.gpg-status-box.js-loading-gpg-badge'
+ expect(page).to have_selector '.gpg-status-box.invalid'
end
+ end
- context 'when static objects external storage is enabled' do
- before do
- stub_application_setting(static_objects_external_storage_url: 'https://cdn.gitlab.com')
- end
+ context 'on signed merge commit' do
+ it 'displays a GPG badge' do
+ visit_blob('conflicting-file.md', ref: '6101e87e575de14b38b4e1ce180519a813671e10')
- context 'private project' do
- let_it_be(:project) { create(:project, :repository, :private) }
- let_it_be(:user) { create(:user, static_object_token: 'ABCD1234') }
+ expect(page).not_to have_selector '.gpg-status-box.js-loading-gpg-badge'
+ expect(page).to have_selector '.gpg-status-box.invalid'
+ end
+ end
- before do
- project.add_developer(user)
+ context 'when static objects external storage is enabled' do
+ before do
+ stub_application_setting(static_objects_external_storage_url: 'https://cdn.gitlab.com')
+ end
- sign_in(user)
- visit_blob('README.md')
- end
+ context 'private project' do
+ let_it_be(:project) { create(:project, :repository, :private) }
+ let_it_be(:user) { create(:user, static_object_token: 'ABCD1234') }
- it 'shows open raw and download buttons with external storage URL prepended and user token appended to their href' do
- path = project_raw_path(project, 'master/README.md')
- raw_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}"
- download_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}&inline=false"
+ before do
+ project.add_developer(user)
- aggregate_failures do
- expect(page).to have_link 'Open raw', href: raw_uri
- expect(page).to have_link 'Download', href: download_uri
- end
- end
+ sign_in(user)
+ visit_blob('README.md')
end
- context 'public project' do
- before do
- visit_blob('README.md')
- end
+ it 'shows open raw and download buttons with external storage URL prepended and user token appended to their href' do
+ path = project_raw_path(project, 'master/README.md')
+ raw_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}"
+ download_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}&inline=false"
- it 'shows open raw and download buttons with external storage URL prepended to their href' do
- path = project_raw_path(project, 'master/README.md')
- raw_uri = "https://cdn.gitlab.com#{path}"
- download_uri = "https://cdn.gitlab.com#{path}?inline=false"
-
- aggregate_failures do
- expect(page).to have_link 'Open raw', href: raw_uri
- expect(page).to have_link 'Download', href: download_uri
- end
+ aggregate_failures do
+ expect(page).to have_link 'Open raw', href: raw_uri
+ expect(page).to have_link 'Download', href: download_uri
end
end
end
- end
-
- context 'with refactor_blob_viewer feature flag disabled' do
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- context 'binary file that appears to be text in the first 1024 bytes' do
- # We need to unsre that this test runs with the refactor_blob_viewer feature flag enabled
- # This will be addressed in https://gitlab.com/gitlab-org/gitlab/-/issues/351559
+ context 'public project' do
before do
- visit_blob('encoding/binary-1.bin', ref: 'binary-encoding')
+ visit_blob('README.md')
end
- it 'displays the blob' do
+
+ it 'shows open raw and download buttons with external storage URL prepended to their href' do
+ path = project_raw_path(project, 'master/README.md')
+ raw_uri = "https://cdn.gitlab.com#{path}"
+ download_uri = "https://cdn.gitlab.com#{path}?inline=false"
+
aggregate_failures do
- # shows a download link
- expect(page).to have_link('Download (23.8 KB)')
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
- # The specs below verify an arguably incorrect result, but since we only
- # learn that the file is not actually text once the text viewer content
- # is loaded asynchronously, there is no straightforward way to get these
- # synchronously loaded elements to display correctly.
- #
- # Clicking the copy button will result in nothing being copied.
- # Clicking the raw button will result in the binary file being downloaded,
- # as expected.
- # shows an enabled copy button, incorrectly
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
- # shows a raw button, incorrectly
- expect(page).to have_link('Open raw')
+ expect(page).to have_link 'Open raw', href: raw_uri
+ expect(page).to have_link 'Download', href: download_uri
end
end
end
diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb
index d906bb396be..727f9aa486e 100644
--- a/spec/features/projects/branches_spec.rb
+++ b/spec/features/projects/branches_spec.rb
@@ -233,6 +233,8 @@ RSpec.describe 'Branches' do
end
context 'with one or more pipeline', :js do
+ let(:project) { create(:project, :public, :empty_repo) }
+
before do
sha = create_file(branch_name: "branch")
create(:ci_pipeline,
diff --git a/spec/features/projects/ci/secure_files_spec.rb b/spec/features/projects/ci/secure_files_spec.rb
index a0e9d663d35..412330eb5d6 100644
--- a/spec/features/projects/ci/secure_files_spec.rb
+++ b/spec/features/projects/ci/secure_files_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe 'Secure Files', :js do
it 'user sees the Secure Files list component' do
visit project_ci_secure_files_path(project)
- expect(page).to have_content('There are no records to show')
+ expect(page).to have_content('There are no secure files yet.')
end
it 'prompts the user to confirm before deleting a file' do
@@ -37,7 +37,7 @@ RSpec.describe 'Secure Files', :js do
it 'displays an uploaded file in the file list' do
visit project_ci_secure_files_path(project)
- expect(page).to have_content('There are no records to show')
+ expect(page).to have_content('There are no secure files yet.')
page.attach_file('spec/fixtures/ci_secure_files/upload-keystore.jks') do
click_button 'Upload File'
diff --git a/spec/features/projects/commits/multi_view_diff_spec.rb b/spec/features/projects/commits/multi_view_diff_spec.rb
index 282112a3767..5af2e367aed 100644
--- a/spec/features/projects/commits/multi_view_diff_spec.rb
+++ b/spec/features/projects/commits/multi_view_diff_spec.rb
@@ -46,28 +46,28 @@ RSpec.describe 'Multiple view Diffs', :js do
end
context 'opening a diff with ipynb' do
- it 'loads the rendered diff as hidden' do
+ it 'loads the raw diff as hidden' do
diff = page.find('.diff-file, .file-holder', match: :first)
- expect(diff).not_to have_selector '[data-diff-toggle-entity="toHide"]'
- expect(diff).to have_selector '[data-diff-toggle-entity="toShow"]'
+ expect(diff).not_to have_selector '[data-diff-toggle-entity="rawViewer"]'
+ expect(diff).to have_selector '[data-diff-toggle-entity="renderedViewer"]'
- expect(classes_for_element(diff, 'toHide', visible: false)).to include('hidden')
- expect(classes_for_element(diff, 'toShow')).not_to include('hidden')
+ expect(classes_for_element(diff, 'rawViewer', visible: false)).to include('hidden')
+ expect(classes_for_element(diff, 'renderedViewer')).not_to include('hidden')
- expect(classes_for_element(diff, 'toShowBtn')).to include('selected')
- expect(classes_for_element(diff, 'toHideBtn')).not_to include('selected')
+ expect(classes_for_element(diff, 'renderedButton')).to include('selected')
+ expect(classes_for_element(diff, 'rawButton')).not_to include('selected')
end
- it 'displays the rendered diff and hides after selection changes' do
+ it 'displays the raw diff and hides after selection changes' do
diff = page.find('.diff-file, .file-holder', match: :first)
- diff.find('[data-diff-toggle-entity="toShowBtn"]').click
+ diff.find('[data-diff-toggle-entity="rawButton"]').click
- expect(diff).to have_selector '[data-diff-toggle-entity="toShow"]'
- expect(diff).not_to have_selector '[data-diff-toggle-entity="toHide"]'
+ expect(diff).to have_selector '[data-diff-toggle-entity="rawViewer"]'
+ expect(diff).not_to have_selector '[data-diff-toggle-entity="renderedViewer"]'
- expect(classes_for_element(diff, 'toHideBtn')).not_to include('selected')
- expect(classes_for_element(diff, 'toShowBtn')).to include('selected')
+ expect(classes_for_element(diff, 'renderedButton')).not_to include('selected')
+ expect(classes_for_element(diff, 'rawButton')).to include('selected')
end
it 'transforms the diff' do
diff --git a/spec/features/projects/deploy_keys_spec.rb b/spec/features/projects/deploy_keys_spec.rb
index bf705cf875b..06462263f5a 100644
--- a/spec/features/projects/deploy_keys_spec.rb
+++ b/spec/features/projects/deploy_keys_spec.rb
@@ -3,22 +3,38 @@
require 'spec_helper'
RSpec.describe 'Project deploy keys', :js do
- let(:user) { create(:user) }
- let(:project) { create(:project_empty_repo) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project_empty_repo) }
+ let_it_be(:deploy_keys_project) { create(:deploy_keys_project, project: project) }
+ let_it_be(:deploy_key) { deploy_keys_project.deploy_key }
before do
project.add_maintainer(user)
sign_in(user)
end
+ context 'editing key' do
+ it 'shows fingerprints' do
+ visit edit_project_deploy_key_path(project, deploy_key)
+
+ expect(page).to have_content('Fingerprint (SHA256)')
+ expect(find('#deploy_key_fingerprint_sha256').value).to eq(deploy_key.fingerprint_sha256)
+
+ if Gitlab::FIPS.enabled?
+ expect(page).not_to have_content('Fingerprint (MD5)')
+ else
+ expect(page).to have_content('Fingerprint (MD5)')
+ expect(find('#deploy_key_fingerprint').value).to eq(deploy_key.fingerprint)
+ end
+ end
+ end
+
describe 'removing key' do
before do
- create(:deploy_keys_project, project: project)
+ visit project_settings_repository_path(project)
end
it 'removes association between project and deploy key' do
- visit project_settings_repository_path(project)
-
page.within(find('.rspec-deploy-keys-settings')) do
expect(page).to have_selector('.deploy-key', count: 1)
diff --git a/spec/features/projects/diffs/diff_show_spec.rb b/spec/features/projects/diffs/diff_show_spec.rb
index 56506ada3ce..dcd6f1239bb 100644
--- a/spec/features/projects/diffs/diff_show_spec.rb
+++ b/spec/features/projects/diffs/diff_show_spec.rb
@@ -169,8 +169,8 @@ RSpec.describe 'Diff file viewer', :js, :with_clean_rails_cache do
wait_for_requests
end
- it 'shows there is no preview' do
- expect(page).to have_content('No preview for this file type')
+ it 'shows that file was added' do
+ expect(page).to have_content('File added')
end
end
end
diff --git a/spec/features/projects/environments_pod_logs_spec.rb b/spec/features/projects/environments_pod_logs_spec.rb
deleted file mode 100644
index 531eae1d638..00000000000
--- a/spec/features/projects/environments_pod_logs_spec.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Environment > Pod Logs', :js, :kubeclient do
- include KubernetesHelpers
-
- let(:pod_names) { %w(kube-pod) }
- let(:pod_name) { pod_names.first }
- let(:project) { create(:project, :repository) }
- let(:environment) { create(:environment, project: project) }
- let(:service) { create(:cluster_platform_kubernetes, :configured) }
-
- before do
- cluster = create(:cluster, :provided_by_gcp, environment_scope: '*', projects: [project])
- create(:deployment, :success, environment: environment)
-
- stub_kubeclient_pods(environment.deployment_namespace)
- stub_kubeclient_logs(pod_name, environment.deployment_namespace, container: 'container-0')
- stub_kubeclient_deployments(environment.deployment_namespace)
- stub_kubeclient_ingresses(environment.deployment_namespace)
- stub_kubeclient_nodes_and_nodes_metrics(cluster.platform.api_url)
-
- sign_in(project.first_owner)
- end
-
- it "shows environments in dropdown" do
- create(:environment, project: project)
-
- visit project_logs_path(environment.project, environment_name: environment.name, pod_name: pod_name)
-
- wait_for_requests
-
- page.within('.js-environments-dropdown') do
- toggle = find(".dropdown-toggle:not([disabled])")
-
- expect(toggle).to have_content(environment.name)
-
- toggle.click
-
- dropdown_items = find(".dropdown-menu").all(".dropdown-item")
- expect(dropdown_items.first).to have_content(environment.name)
- expect(dropdown_items.size).to eq(2)
- end
- end
-
- context 'with logs', :use_clean_rails_memory_store_caching do
- it "shows pod logs", :sidekiq_might_not_need_inline do
- visit project_logs_path(environment.project, environment_name: environment.name, pod_name: pod_name)
-
- wait_for_requests
-
- page.within('.qa-pods-dropdown') do # rubocop:disable QA/SelectorUsage
- find(".dropdown-toggle:not([disabled])").click
-
- dropdown_items = find(".dropdown-menu").all(".dropdown-item:not([disabled])")
- expect(dropdown_items.size).to eq(1)
-
- dropdown_items.each_with_index do |item, i|
- expect(item.text).to eq(pod_names[i])
- end
- end
- expect(page).to have_content("kube-pod | Log 1")
- expect(page).to have_content("kube-pod | Log 2")
- expect(page).to have_content("kube-pod | Log 3")
- end
- end
-end
diff --git a/spec/features/projects/files/dockerfile_dropdown_spec.rb b/spec/features/projects/files/dockerfile_dropdown_spec.rb
index 3a0cc61d9c6..dd1635c900e 100644
--- a/spec/features/projects/files/dockerfile_dropdown_spec.rb
+++ b/spec/features/projects/files/dockerfile_dropdown_spec.rb
@@ -26,6 +26,6 @@ RSpec.describe 'Projects > Files > User wants to add a Dockerfile file', :js do
wait_for_requests
expect(page).to have_css('.dockerfile-selector .dropdown-toggle-text', text: 'Apply a template')
- expect(editor_get_value).to have_content('COPY ./ /usr/local/apache2/htdocs/')
+ expect(find('.monaco-editor')).to have_content('COPY ./ /usr/local/apache2/htdocs/')
end
end
diff --git a/spec/features/projects/files/gitignore_dropdown_spec.rb b/spec/features/projects/files/gitignore_dropdown_spec.rb
index 4a92216f46c..a86adf951d8 100644
--- a/spec/features/projects/files/gitignore_dropdown_spec.rb
+++ b/spec/features/projects/files/gitignore_dropdown_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe 'Projects > Files > User wants to add a .gitignore file', :js do
wait_for_requests
expect(page).to have_css('.gitignore-selector .dropdown-toggle-text', text: 'Apply a template')
- expect(editor_get_value).to have_content('/.bundle')
- expect(editor_get_value).to have_content('config/initializers/secret_token.rb')
+ expect(find('.monaco-editor')).to have_content('/.bundle')
+ expect(find('.monaco-editor')).to have_content('config/initializers/secret_token.rb')
end
end
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 cdf6c219ea5..46ac0dee7eb 100644
--- a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
+++ b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
@@ -30,8 +30,8 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js
wait_for_requests
expect(page).to have_css('.gitlab-ci-yml-selector .dropdown-toggle-text', text: 'Apply a template')
- expect(editor_get_value).to have_content('This file is a template, and might need editing before it works on your project')
- expect(editor_get_value).to have_content('jekyll build -d test')
+ expect(find('.monaco-editor')).to have_content('This file is a template, and might need editing before it works on your project')
+ expect(find('.monaco-editor')).to have_content('jekyll build -d test')
end
context 'when template param is provided' do
@@ -41,8 +41,8 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js
wait_for_requests
expect(page).to have_css('.gitlab-ci-yml-selector .dropdown-toggle-text', text: 'Apply a template')
- expect(editor_get_value).to have_content('This file is a template, and might need editing before it works on your project')
- expect(editor_get_value).to have_content('jekyll build -d test')
+ expect(find('.monaco-editor')).to have_content('This file is a template, and might need editing before it works on your project')
+ expect(find('.monaco-editor')).to have_content('jekyll build -d test')
end
end
@@ -53,7 +53,7 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js
wait_for_requests
expect(page).to have_css('.gitlab-ci-yml-selector .dropdown-toggle-text', text: 'Apply a template')
- expect(editor_get_value).to have_content('')
+ expect(find('.monaco-editor')).to have_content('')
end
end
@@ -64,7 +64,7 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js
it 'leaves the editor empty' do
wait_for_requests
- expect(editor_get_value).to have_content('')
+ expect(find('.monaco-editor')).to have_content('')
end
end
end
diff --git a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
index 0e87622d3c2..6b1e60db5b1 100644
--- a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
+++ b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
@@ -22,8 +22,10 @@ RSpec.describe 'Projects > Files > Project owner sees a link to create a license
select_template('MIT License')
- expect(ide_editor_value).to have_content('MIT License')
- expect(ide_editor_value).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}")
+ file_content = "Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}"
+
+ expect(find('.monaco-editor')).to have_content('MIT License')
+ expect(find('.monaco-editor')).to have_content(file_content)
ide_commit
@@ -33,7 +35,7 @@ RSpec.describe 'Projects > Files > Project owner sees a link to create a license
license_file = project.repository.blob_at('master', 'LICENSE').data
expect(license_file).to have_content('MIT License')
- expect(license_file).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}")
+ expect(license_file).to have_content(file_content)
end
def select_template(template)
diff --git a/spec/features/projects/jobs/permissions_spec.rb b/spec/features/projects/jobs/permissions_spec.rb
index a904ba770dd..b6019944071 100644
--- a/spec/features/projects/jobs/permissions_spec.rb
+++ b/spec/features/projects/jobs/permissions_spec.rb
@@ -12,8 +12,6 @@ RSpec.describe 'Project Jobs Permissions' do
let_it_be(:job) { create(:ci_build, :running, :coverage, :trace_artifact, pipeline: pipeline) }
before do
- stub_feature_flags(jobs_table_vue: false)
-
sign_in(user)
project.enable_ci
@@ -96,8 +94,8 @@ RSpec.describe 'Project Jobs Permissions' do
end
it_behaves_like 'project jobs page responds with status', 200 do
- it 'renders job' do
- page.within('.build') do
+ it 'renders job', :js do
+ page.within('[data-testid="jobs-table"]') do
expect(page).to have_content("##{job.id}")
.and have_content(job.sha[0..7])
.and have_content(job.ref)
diff --git a/spec/features/projects/jobs/user_browses_job_spec.rb b/spec/features/projects/jobs/user_browses_job_spec.rb
index 6a2d2c36521..6a0cfcde812 100644
--- a/spec/features/projects/jobs/user_browses_job_spec.rb
+++ b/spec/features/projects/jobs/user_browses_job_spec.rb
@@ -90,4 +90,27 @@ RSpec.describe 'User browses a job', :js do
end
end
end
+
+ context 'job log search' do
+ before do
+ visit(project_job_path(project, build))
+ wait_for_all_requests
+ end
+
+ it 'searches for supplied substring' do
+ find('[data-testid="job-log-search-box"] input').set('GroupsHelper')
+
+ find('[data-testid="search-button"]').click
+
+ expect(page).to have_content('26 results found for GroupsHelper')
+ end
+
+ it 'shows no results for supplied substring' do
+ find('[data-testid="job-log-search-box"] input').set('YouWontFindMe')
+
+ find('[data-testid="search-button"]').click
+
+ expect(page).to have_content('No search results found')
+ end
+ end
end
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index 07b7a54974a..bb44b70bb3a 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -9,48 +9,11 @@ def visit_jobs_page
end
RSpec.describe 'User browses jobs' do
- describe 'with jobs_table_vue feature flag turned off' do
- let!(:build) { create(:ci_build, :coverage, pipeline: pipeline) }
- let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.sha, ref: 'master') }
- let(:project) { create(:project, :repository, namespace: user.namespace) }
- let(:user) { create(:user) }
-
- before do
- stub_feature_flags(jobs_table_vue: false)
- project.add_maintainer(user)
- project.enable_ci
- build.update!(coverage_regex: '/Coverage (\d+)%/')
-
- sign_in(user)
-
- visit(project_jobs_path(project))
- end
-
- it 'shows the coverage' do
- page.within('td.coverage') do
- expect(page).to have_content('99.9%')
- end
- end
-
- context 'with a failed job' do
- let!(:build) { create(:ci_build, :coverage, :failed, pipeline: pipeline) }
-
- it 'displays a tooltip with the failure reason' do
- page.within('.ci-table') do
- failed_job_link = page.find('.ci-failed')
- expect(failed_job_link[:title]).to eq('Failed - (unknown failure)')
- end
- end
- end
- end
-
- describe 'with jobs_table_vue feature flag turned on', :js do
+ describe 'Jobs', :js do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
before do
- stub_feature_flags(jobs_table_vue: true)
-
project.add_maintainer(user)
project.enable_ci
@@ -135,6 +98,26 @@ RSpec.describe 'User browses jobs' do
end
end
+ context 'with a coverage job' do
+ let!(:job) do
+ create(:ci_build, :coverage, pipeline: pipeline)
+ end
+
+ before do
+ job.update!(coverage_regex: '/Coverage (\d+)%/')
+
+ visit_jobs_page
+
+ wait_for_requests
+ end
+
+ it 'shows the coverage' do
+ page.within('[data-testid="job-coverage"]') do
+ expect(page).to have_content('99.9%')
+ end
+ end
+ end
+
context 'with a scheduled job' do
let!(:scheduled_job) { create(:ci_build, :scheduled, pipeline: pipeline, name: 'build') }
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index f0d41c1dd11..84c75752bc1 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -20,7 +20,6 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
end
before do
- stub_feature_flags(jobs_table_vue: false)
project.add_role(user, user_access_level)
sign_in(user)
end
@@ -29,9 +28,11 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
context 'with no jobs' do
before do
visit project_jobs_path(project)
+
+ wait_for_requests
end
- it 'shows the empty state page' do
+ it 'shows the empty state page', :js do
expect(page).to have_content('Use jobs to automate your tasks')
expect(page).to have_link('Create CI/CD configuration file', href: project_ci_pipeline_editor_path(project))
end
@@ -40,59 +41,6 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
context 'with a job' do
let!(:job) { create(:ci_build, pipeline: pipeline) }
- context "Pending scope" do
- before do
- visit project_jobs_path(project, scope: :pending)
- end
-
- it "shows Pending tab jobs" do
- expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Pending')
- expect(page).to have_content job.short_sha
- expect(page).to have_content job.ref
- expect(page).to have_content job.name
- end
- end
-
- context "Running scope" do
- before do
- job.run!
- visit project_jobs_path(project, scope: :running)
- end
-
- it "shows Running tab jobs" do
- expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Running')
- expect(page).to have_content job.short_sha
- expect(page).to have_content job.ref
- expect(page).to have_content job.name
- end
- end
-
- context "Finished scope" do
- before do
- job.run!
- visit project_jobs_path(project, scope: :finished)
- end
-
- it "shows Finished tab jobs" do
- expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Finished')
- expect(page).to have_content('Use jobs to automate your tasks')
- end
- end
-
- context "All jobs" do
- before do
- project.builds.running_or_pending.each(&:success)
- visit project_jobs_path(project)
- end
-
- it "shows All tab jobs" do
- expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'All')
- expect(page).to have_content job.short_sha
- expect(page).to have_content job.ref
- expect(page).to have_content job.name
- end
- end
-
context "when visiting old URL" do
let(:jobs_url) do
project_jobs_path(project)
@@ -1207,22 +1155,4 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
it { expect(page.status_code).to eq(404) }
end
end
-
- describe "GET /:project/jobs/:id/status" do
- context "Job from project" do
- before do
- visit status_project_job_path(project, job)
- end
-
- it { expect(page.status_code).to eq(200) }
- end
-
- context "Job from other project" do
- before do
- visit status_project_job_path(project, job2)
- end
-
- it { expect(page.status_code).to eq(404) }
- end
- end
end
diff --git a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
index bd0874316ac..c92e8bc2954 100644
--- a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
+++ b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe 'Projects > Members > Maintainer adds member with expiration date
end
it 'changes expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: three_days_from_now)
+ project.team.add_members([new_member.id], :developer, expires_at: three_days_from_now)
visit project_project_members_path(project)
page.within find_member_row(new_member) do
@@ -46,7 +46,7 @@ RSpec.describe 'Projects > Members > Maintainer adds member with expiration date
end
it 'clears expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: five_days_from_now)
+ project.team.add_members([new_member.id], :developer, expires_at: five_days_from_now)
visit project_project_members_path(project)
page.within find_member_row(new_member) do
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index 023601b0b1e..e07a5d09405 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -49,7 +49,7 @@ RSpec.describe 'Project navbar' do
stub_config(pages: { enabled: true })
insert_after_sub_nav_item(
- _('CI/CD'),
+ _('Packages & Registries'),
within: _('Settings'),
new_sub_nav_item_name: _('Pages')
)
@@ -60,18 +60,22 @@ RSpec.describe 'Project navbar' do
it_behaves_like 'verified navigation bar'
end
+ context 'when package registry is available' do
+ before do
+ stub_config(packages: { enabled: true })
+
+ 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
- insert_after_sub_nav_item(
- _('CI/CD'),
- within: _('Settings'),
- new_sub_nav_item_name: _('Packages & Registries')
- )
-
visit project_path(project)
end
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index a1e92a79516..9d2d1454d77 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -61,15 +61,15 @@ RSpec.describe 'New project', :js do
expect(page).to have_link('GitLab export')
end
- describe 'github import option' do
+ shared_examples 'renders importer link' do |params|
context 'with user namespace' do
before do
visit new_project_path
click_link 'Import project'
end
- it 'renders link to github importer' do
- expect(page).to have_link(href: new_import_github_path)
+ it "renders link to #{params[:name]} importer" do
+ expect(page).to have_link(href: Rails.application.routes.url_helpers.send(params[:route]))
end
end
@@ -82,21 +82,56 @@ RSpec.describe 'New project', :js do
click_link 'Import project'
end
- it 'renders link to github importer including namespace id' do
- expect(page).to have_link(href: new_import_github_path(namespace_id: group.id))
+ it "renders link to #{params[:name]} importer including namespace id" do
+ expect(page).to have_link(href: Rails.application.routes.url_helpers.send(params[:route], namespace_id: group.id))
end
end
end
- describe 'manifest import option' do
- before do
- visit new_project_path
+ describe 'importer links' do
+ shared_examples 'link to importers' do
+ let(:importer_routes) do
+ {
+ 'github': :new_import_github_path,
+ 'bitbucket': :status_import_bitbucket_path,
+ 'bitbucket server': :status_import_bitbucket_server_path,
+ 'gitlab.com': :status_import_gitlab_path,
+ 'fogbugz': :new_import_fogbugz_path,
+ 'gitea': :new_import_gitea_path,
+ 'manifest': :new_import_manifest_path,
+ 'phabricator': :new_import_phabricator_path
+ }
+ end
+
+ it 'renders links to several importers', :aggregate_failures do
+ importer_routes.each_value do |route|
+ expect(page).to have_link(href: Rails.application.routes.url_helpers.send(route, link_params))
+ end
+ end
+ end
- click_link 'Import project'
+ context 'with user namespace' do
+ let(:link_params) { {} }
+
+ before do
+ visit new_project_path
+ click_link 'Import project'
+ end
+
+ include_examples 'link to importers'
end
- it 'has Manifest file' do
- expect(page).to have_link('Manifest file')
+ context 'with group namespace' do
+ let(:group) { create(:group, :private) }
+ let(:link_params) { { namespace_id: group.id } }
+
+ before do
+ group.add_owner(user)
+ visit new_project_path(namespace_id: group.id)
+ click_link 'Import project'
+ end
+
+ include_examples 'link to importers'
end
end
diff --git a/spec/features/projects/pipelines/legacy_pipelines_spec.rb b/spec/features/projects/pipelines/legacy_pipelines_spec.rb
index 3f89e344c51..15d889933bf 100644
--- a/spec/features/projects/pipelines/legacy_pipelines_spec.rb
+++ b/spec/features/projects/pipelines/legacy_pipelines_spec.rb
@@ -357,6 +357,10 @@ RSpec.describe 'Pipelines', :js do
end
it 'enqueues the delayed job', :js do
+ find('[data-testid="mini-pipeline-graph-dropdown"]').click
+
+ within('[data-testid="mini-pipeline-graph-dropdown"]') { find('.ci-status-icon-pending') }
+
expect(delayed_job.reload).to be_pending
end
end
diff --git a/spec/features/projects/releases/user_creates_release_spec.rb b/spec/features/projects/releases/user_creates_release_spec.rb
index 9e428a0623d..10c4395da81 100644
--- a/spec/features/projects/releases/user_creates_release_spec.rb
+++ b/spec/features/projects/releases/user_creates_release_spec.rb
@@ -111,6 +111,27 @@ RSpec.describe 'User creates release', :js do
end
end
+ context 'when tag name supplied in the parameters' do
+ let(:new_page_url) { new_project_release_path(project, tag_name: 'v1.1.0') }
+
+ it 'creates release with preselected tag' do
+ page.within '[data-testid="tag-name-field"]' do
+ expect(page).to have_text('v1.1.0')
+ end
+
+ expect(page).not_to have_selector('[data-testid="create-from-field"]')
+
+ fill_release_title("test release")
+ click_button('Create release')
+
+ wait_for_all_requests
+
+ release = project.releases.last
+
+ expect(release.tag).to eq('v1.1.0')
+ end
+ end
+
def fill_out_form_and_submit
select_new_tag_name(tag_name)
diff --git a/spec/features/projects/settings/registry_settings_spec.rb b/spec/features/projects/settings/registry_settings_spec.rb
index ff28d59ed08..9468540736f 100644
--- a/spec/features/projects/settings/registry_settings_spec.rb
+++ b/spec/features/projects/settings/registry_settings_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration policy', :js do
+RSpec.describe 'Project > Settings > Packages & Registries > Container registry tag expiration policy', :js do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) }
@@ -23,14 +23,15 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p
it 'shows available section' do
subject
- settings_block = find('[data-testid="registry-settings-app"]')
+ settings_block = find('[data-testid="container-expiration-policy-project-settings"]')
expect(settings_block).to have_text 'Clean up image tags'
end
it 'saves cleanup policy submit the form' do
subject
- within '[data-testid="registry-settings-app"]' do
+ within '[data-testid="container-expiration-policy-project-settings"]' do
+ click_button('Expand')
select('Every day', from: 'Run cleanup')
select('50 tags per image name', from: 'Keep the most recent:')
fill_in('Keep tags matching:', with: 'stable')
@@ -48,7 +49,8 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p
it 'does not save cleanup policy submit form with invalid regex' do
subject
- within '[data-testid="registry-settings-app"]' do
+ within '[data-testid="container-expiration-policy-project-settings"]' do
+ click_button('Expand')
fill_in('Remove tags matching:', with: '*-production')
submit_button = find('[data-testid="save-button"')
@@ -73,7 +75,8 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p
it 'displays the related section' do
subject
- within '[data-testid="registry-settings-app"]' do
+ within '[data-testid="container-expiration-policy-project-settings"]' do
+ click_button('Expand')
expect(find('[data-testid="enable-toggle"]')).to have_content('Disabled - Tags will not be automatically deleted.')
end
end
@@ -87,7 +90,8 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p
it 'does not display the related section' do
subject
- within '[data-testid="registry-settings-app"]' do
+ within '[data-testid="container-expiration-policy-project-settings"]' do
+ click_button('Expand')
expect(find('.gl-alert-title')).to have_content('Cleanup policy for tags is disabled')
end
end
@@ -100,7 +104,7 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p
it 'does not exists' do
subject
- expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
+ expect(page).not_to have_selector('[data-testid="container-expiration-policy-project-settings"]')
end
end
@@ -110,7 +114,7 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p
it 'does not exists' do
subject
- expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
+ expect(page).not_to have_selector('[data-testid="container-expiration-policy-project-settings"]')
end
end
end
diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb
index 72ada356225..ddfed73e2ca 100644
--- a/spec/features/projects/settings/repository_settings_spec.rb
+++ b/spec/features/projects/settings/repository_settings_spec.rb
@@ -179,7 +179,6 @@ RSpec.describe 'Projects > Settings > Repository settings' do
expect(page).to have_css(".js-mirror-url-hidden[value=\"#{ssh_url}\"]", visible: false)
select 'SSH public key', from: 'Authentication method'
-
select_direction
Sidekiq::Testing.fake! do
diff --git a/spec/features/projects/settings/secure_files_settings_spec.rb b/spec/features/projects/settings/secure_files_settings_spec.rb
deleted file mode 100644
index c7c9cafc420..00000000000
--- a/spec/features/projects/settings/secure_files_settings_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Secure Files Settings' do
- let_it_be(:maintainer) { create(:user) }
- let_it_be(:project) { create(:project, creator_id: maintainer.id) }
-
- before_all do
- project.add_maintainer(maintainer)
- end
-
- context 'when the :ci_secure_files feature flag is enabled' do
- before do
- stub_feature_flags(ci_secure_files: true)
-
- sign_in(user)
- visit project_settings_ci_cd_path(project)
- end
-
- context 'authenticated user with admin permissions' do
- let(:user) { maintainer }
-
- it 'shows the secure files settings' do
- expect(page).to have_content('Secure Files')
- end
- end
- end
-
- context 'when the :ci_secure_files feature flag is disabled' do
- before do
- stub_feature_flags(ci_secure_files: false)
-
- sign_in(user)
- visit project_settings_ci_cd_path(project)
- end
-
- context 'authenticated user with admin permissions' do
- let(:user) { maintainer }
-
- it 'does not shows the secure files settings' do
- expect(page).not_to have_content('Secure Files')
- end
- end
- end
-end
diff --git a/spec/features/projects/settings/secure_files_spec.rb b/spec/features/projects/settings/secure_files_spec.rb
new file mode 100644
index 00000000000..ee38acf1953
--- /dev/null
+++ b/spec/features/projects/settings/secure_files_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Secure Files', :js do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+
+ before do
+ stub_feature_flags(ci_secure_files_read_only: false)
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ context 'when the :ci_secure_files feature flag is enabled' do
+ before do
+ stub_feature_flags(ci_secure_files: true)
+
+ visit project_settings_ci_cd_path(project)
+ end
+
+ context 'authenticated user with admin permissions' do
+ it 'shows the secure files settings' do
+ expect(page).to have_content('Secure Files')
+ end
+ end
+ end
+
+ context 'when the :ci_secure_files feature flag is disabled' do
+ before do
+ stub_feature_flags(ci_secure_files: false)
+
+ visit project_settings_ci_cd_path(project)
+ end
+
+ context 'authenticated user with admin permissions' do
+ it 'does not shows the secure files settings' do
+ expect(page).not_to have_content('Secure Files')
+ end
+ end
+ end
+
+ it 'user sees the Secure Files list component' do
+ visit project_settings_ci_cd_path(project)
+
+ within '#js-secure-files' do
+ expect(page).to have_content('There are no secure files yet.')
+ end
+ end
+
+ it 'prompts the user to confirm before deleting a file' do
+ file = create(:ci_secure_file, project: project)
+
+ visit project_settings_ci_cd_path(project)
+
+ within '#js-secure-files' do
+ expect(page).to have_content(file.name)
+
+ find('button.btn-danger-secondary').click
+ end
+
+ expect(page).to have_content("Delete #{file.name}?")
+
+ click_on('Delete secure file')
+
+ visit project_settings_ci_cd_path(project)
+
+ within '#js-secure-files' do
+ expect(page).not_to have_content(file.name)
+ end
+ end
+
+ it 'displays an uploaded file in the file list' do
+ visit project_settings_ci_cd_path(project)
+
+ within '#js-secure-files' do
+ expect(page).to have_content('There are no secure files yet.')
+
+ page.attach_file('spec/fixtures/ci_secure_files/upload-keystore.jks') do
+ click_button 'Upload File'
+ end
+
+ expect(page).to have_content('upload-keystore.jks')
+ end
+ end
+
+ it 'displays an error when a duplicate file upload is attempted' do
+ create(:ci_secure_file, project: project, name: 'upload-keystore.jks')
+ visit project_settings_ci_cd_path(project)
+
+ within '#js-secure-files' do
+ expect(page).to have_content('upload-keystore.jks')
+
+ page.attach_file('spec/fixtures/ci_secure_files/upload-keystore.jks') do
+ click_button 'Upload File'
+ end
+
+ expect(page).to have_content('A file with this name already exists.')
+ end
+ end
+end
diff --git a/spec/features/projects/settings/visibility_settings_spec.rb b/spec/features/projects/settings/visibility_settings_spec.rb
index becb30c02b7..fc78b5b5769 100644
--- a/spec/features/projects/settings/visibility_settings_spec.rb
+++ b/spec/features/projects/settings/visibility_settings_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'Projects > Settings > Visibility settings', :js do
visibility_select_container = find('.project-visibility-setting')
expect(visibility_select_container.find('select').value).to eq project.visibility_level.to_s
- expect(visibility_select_container).to have_content 'The project can be accessed by anyone, regardless of authentication.'
+ expect(visibility_select_container).to have_content 'Accessible by anyone, regardless of authentication.'
end
it 'project visibility description updates on change' do
@@ -25,7 +25,7 @@ RSpec.describe 'Projects > Settings > Visibility settings', :js do
visibility_select.select('Private')
expect(visibility_select.value).to eq '0'
- expect(visibility_select_container).to have_content 'Access must be granted explicitly to each user.'
+ expect(visibility_select_container).to have_content 'Only accessible by project members. Membership must be explicitly granted to each user.'
end
context 'merge requests select' do
@@ -86,7 +86,7 @@ RSpec.describe 'Projects > Settings > Visibility settings', :js do
visibility_select_container = find('.project-visibility-setting')
expect(visibility_select_container).to have_selector 'select[name="project[visibility_level]"]:disabled'
- expect(visibility_select_container).to have_content 'The project can be accessed by anyone, regardless of authentication.'
+ expect(visibility_select_container).to have_content 'Accessible by anyone, regardless of authentication.'
end
context 'disable email notifications' do
diff --git a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
index 59f1bc94226..262885e09b3 100644
--- a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
+++ b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'Project > Show > User interacts with auto devops implicitly enab
let(:user) { create(:user) }
before do
- project.add_user(user, role)
+ project.add_member(user, role)
sign_in(user)
end
diff --git a/spec/features/projects/show/user_sees_collaboration_links_spec.rb b/spec/features/projects/show/user_sees_collaboration_links_spec.rb
index 552f068ecc7..fb2f0539558 100644
--- a/spec/features/projects/show/user_sees_collaboration_links_spec.rb
+++ b/spec/features/projects/show/user_sees_collaboration_links_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe 'Projects > Show > Collaboration links', :js do
with_them do
before do
project.project_feature.update!({ merge_requests_access_level: merge_requests_access_level })
- project.add_user(user, user_level)
+ project.add_member(user, user_level)
visit project_path(project)
end
diff --git a/spec/features/projects/tags/user_edits_tags_spec.rb b/spec/features/projects/tags/user_edits_tags_spec.rb
index 17080043b6d..c8438b73dc3 100644
--- a/spec/features/projects/tags/user_edits_tags_spec.rb
+++ b/spec/features/projects/tags/user_edits_tags_spec.rb
@@ -5,17 +5,58 @@ require 'spec_helper'
RSpec.describe 'Project > Tags', :js do
include DropzoneHelper
- let(:user) { create(:user) }
- let(:role) { :developer }
- let(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:role) { :developer }
+ let_it_be(:project) { create(:project, :repository) }
before do
sign_in(user)
project.add_role(user, role)
end
+ shared_examples "can create and update release" do
+ it 'can create new release' do
+ visit page_url
+ page.find("a[href=\"#{new_project_release_path(project, tag_name: 'v1.1.0')}\"]").click
+
+ fill_in "Release notes", with: "new release from tag"
+ expect(page).not_to have_field("Create from")
+ click_button "Create release"
+
+ expect(page).to have_current_path(project_release_path(project, 'v1.1.0'))
+ expect(Release.last.description).to eq("new release from tag")
+ end
+
+ it 'can edit existing release' do
+ release = create(:release, project: project, tag: 'v1.1.0')
+
+ visit page_url
+ page.find("a[href=\"#{edit_project_release_path(project, release)}\"]").click
+
+ fill_in "Release notes", with: "updated release desc"
+ click_button "Save changes"
+
+ expect(page).to have_current_path(project_release_path(project, 'v1.1.0'))
+ expect(release.reload.description).to eq("updated release desc")
+ end
+ end
+
+ context 'when visiting tags index page' do
+ let(:page_url) { project_tags_path(project) }
+
+ include_examples "can create and update release"
+ end
+
+ context 'when visiting individual tag page' do
+ let(:page_url) { project_tag_path(project, 'v1.1.0') }
+
+ include_examples "can create and update release"
+ end
+
+ # TODO: remove most of these together with FF https://gitlab.com/gitlab-org/gitlab/-/issues/366244
describe 'when opening project tags' do
before do
+ stub_feature_flags(edit_tag_release_notes_via_release_page: false)
visit project_tags_path(project)
end
diff --git a/spec/features/projects/tracings_spec.rb b/spec/features/projects/tracings_spec.rb
deleted file mode 100644
index b79a0427ef6..00000000000
--- a/spec/features/projects/tracings_spec.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Tracings Content Security Policy' do
- include ContentSecurityPolicyHelpers
-
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
-
- subject { response_headers['Content-Security-Policy'] }
-
- before_all do
- project.add_maintainer(user)
- end
-
- before do
- sign_in(user)
- end
-
- context 'when there is no global config' do
- before do
- setup_csp_for_controller(Projects::TracingsController)
- end
-
- it 'does not add CSP directives' do
- visit project_tracing_path(project)
-
- is_expected.to be_blank
- end
- end
-
- context 'when a global CSP config exists' do
- before do
- csp = ActionDispatch::ContentSecurityPolicy.new do |p|
- p.frame_src 'https://global-policy.com'
- end
-
- setup_existing_csp_for_controller(Projects::TracingsController, csp)
- end
-
- context 'when external_url is set' do
- let!(:project_tracing_setting) { create(:project_tracing_setting, project: project) }
-
- it 'overwrites frame-src' do
- visit project_tracing_path(project)
-
- is_expected.to eq("frame-src https://example.com")
- end
- end
-
- context 'when external_url is not set' do
- it 'uses global policy' do
- visit project_tracing_path(project)
-
- is_expected.to eq("frame-src https://global-policy.com")
- end
- end
- end
-end
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index db64f84aa76..f6f9c7f0d3c 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -440,6 +440,99 @@ RSpec.describe 'Project' do
end
end
+ describe 'storage_enforcement_banner', :js do
+ let_it_be(:group) { create(:group) }
+ let_it_be_with_refind(:user) { create(:user) }
+ let_it_be(:project) { create(:project, group: group) }
+
+ before do
+ group.add_maintainer(user)
+ sign_in(user)
+ end
+
+ context 'with storage_enforcement_date set' do
+ let_it_be(:storage_enforcement_date) { Date.today + 30 }
+
+ before do
+ allow_next_found_instance_of(Group) do |grp|
+ allow(grp).to receive(:storage_enforcement_date).and_return(storage_enforcement_date)
+ end
+ end
+
+ it 'displays the banner in the project page' do
+ visit project_path(project)
+ expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
+ end
+
+ context 'when in a subgroup project page' do
+ let_it_be(:subgroup) { create(:group, parent: group) }
+ let_it_be(:project) { create(:project, namespace: subgroup) }
+
+ it 'displays the banner' do
+ visit project_path(project)
+ expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
+ end
+ end
+
+ context 'when in a user namespace project page' do
+ let_it_be(:project) { create(:project, namespace: user.namespace) }
+
+ before do
+ allow_next_found_instance_of(Namespaces::UserNamespace) do |namspace|
+ allow(namspace).to receive(:storage_enforcement_date).and_return(storage_enforcement_date)
+ end
+ end
+
+ it 'displays the banner' do
+ visit project_path(project)
+ expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
+ end
+ end
+
+ it 'does not display the banner in a paid group project page' do
+ allow_next_found_instance_of(Group) do |grp|
+ allow(grp).to receive(:paid?).and_return(true)
+ end
+ visit project_path(project)
+ expect_page_not_to_have_storage_enforcement_banner
+ end
+
+ it 'does not display the banner if user has previously closed unless threshold has changed' do
+ visit project_path(project)
+ expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
+ find('.js-storage-enforcement-banner [data-testid="close-icon"]').click
+ wait_for_requests
+ page.refresh
+ expect_page_not_to_have_storage_enforcement_banner
+
+ storage_enforcement_date = Date.today + 13
+ allow_next_found_instance_of(Group) do |grp|
+ allow(grp).to receive(:storage_enforcement_date).and_return(storage_enforcement_date)
+ end
+ page.refresh
+ expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
+ end
+ end
+
+ context 'with storage_enforcement_date not set' do
+ # This test should break and be rewritten after the implementation of the storage_enforcement_date
+ # TBD: https://gitlab.com/gitlab-org/gitlab/-/issues/350632
+ it 'does not display the banner in the group page' do
+ stub_feature_flags(namespace_storage_limit_bypass_date_check: false)
+ visit project_path(project)
+ expect_page_not_to_have_storage_enforcement_banner
+ end
+ end
+ end
+
+ def expect_page_to_have_storage_enforcement_banner(storage_enforcement_date)
+ expect(page).to have_text "From #{storage_enforcement_date} storage limits will apply to this namespace"
+ end
+
+ def expect_page_not_to_have_storage_enforcement_banner
+ expect(page).not_to have_text "storage limits will apply to this namespace"
+ end
+
def remove_with_confirm(button_text, confirm_with, confirm_button_text = 'Confirm')
click_button button_text
fill_in 'confirm_name_input', with: confirm_with
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_line_permalink_updater_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_line_permalink_updater_spec.rb
deleted file mode 100644
index e8c026a254e..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_line_permalink_updater_spec.rb
+++ /dev/null
@@ -1,103 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Blob button line permalinks (BlobLinePermalinkUpdater)', :js do
- include TreeHelper
-
- let(:project) { create(:project, :public, :repository) }
- let(:path) { 'CHANGELOG' }
- let(:sha) { project.repository.commit.sha }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- describe 'On a file(blob)' do
- def get_absolute_url(path = "")
- "http://#{page.server.host}:#{page.server.port}#{path}"
- end
-
- def visit_blob(fragment = nil)
- visit project_blob_path(project, tree_join('master', path), anchor: fragment)
- end
-
- describe 'Click "Permalink" button' do
- it 'works with no initial line number fragment hash' do
- visit_blob
-
- expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path))))
- end
-
- it 'maintains intitial fragment hash' do
- fragment = "L3"
-
- visit_blob(fragment)
-
- expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: fragment)))
- end
-
- it 'changes fragment hash if line number clicked' do
- ending_fragment = "L5"
-
- visit_blob
-
- find('#L3').click
- find("##{ending_fragment}").click
-
- expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: ending_fragment)))
- end
-
- it 'with initial fragment hash, changes fragment hash if line number clicked' do
- fragment = "L1"
- ending_fragment = "L5"
-
- visit_blob(fragment)
-
- find('#L3').click
- find("##{ending_fragment}").click
-
- expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: ending_fragment)))
- end
- end
-
- describe 'Click "Blame" button' do
- it 'works with no initial line number fragment hash' do
- visit_blob
-
- expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path))))
- end
-
- it 'maintains intitial fragment hash' do
- fragment = "L3"
-
- visit_blob(fragment)
-
- expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path), anchor: fragment)))
- end
-
- it 'changes fragment hash if line number clicked' do
- ending_fragment = "L5"
-
- visit_blob
-
- find('#L3').click
- find("##{ending_fragment}").click
-
- expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path), anchor: ending_fragment)))
- end
-
- it 'with initial fragment hash, changes fragment hash if line number clicked' do
- fragment = "L1"
- ending_fragment = "L5"
-
- visit_blob(fragment)
-
- find('#L3').click
- find("##{ending_fragment}").click
-
- expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path), anchor: ending_fragment)))
- end
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb
deleted file mode 100644
index 5574b4da383..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb
+++ /dev/null
@@ -1,1201 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'File blob', :js do
- include MobileHelpers
-
- let(:project) { create(:project, :public, :repository) }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- def visit_blob(path, anchor: nil, ref: 'master', **additional_args)
- visit project_blob_path(project, File.join(ref, path), anchor: anchor, **additional_args)
-
- wait_for_requests
- end
-
- def create_file(file_name, content)
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add #{file_name}",
- file_path: file_name,
- file_content: <<-SPEC.strip_heredoc
- #{content}
- SPEC
- ).execute
- end
-
- context 'Ruby file' do
- before do
- visit_blob('files/ruby/popen.rb')
-
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows highlighted Ruby code
- expect(page).to have_css(".js-syntax-highlight")
- expect(page).to have_content("require 'fileutils'")
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
-
- # shows a raw button
- expect(page).to have_link('Open raw')
- end
- end
-
- it 'displays file actions on all screen sizes' do
- file_actions_selector = '.file-actions'
-
- resize_screen_sm
- expect(page).to have_selector(file_actions_selector, visible: true)
-
- resize_screen_xs
- expect(page).to have_selector(file_actions_selector, visible: true)
- end
- end
-
- context 'Markdown file' do
- context 'visiting directly' do
- before do
- visit_blob('files/markdown/ruby-style-guide.md')
-
- wait_for_requests
- end
-
- it 'displays the blob using the rich viewer' do
- aggregate_failures do
- # hides the simple viewer
- expect(page).to have_selector('.blob-viewer[data-type="simple"]', visible: false)
- expect(page).to have_selector('.blob-viewer[data-type="rich"]')
-
- # shows rendered Markdown
- expect(page).to have_link("PEP-8")
-
- # shows a viewer switcher
- expect(page).to have_selector('.js-blob-viewer-switcher')
-
- # shows a disabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
-
- # shows a raw button
- expect(page).to have_link('Open raw')
- end
- end
-
- context 'switching to the simple viewer' do
- before do
- find('.js-blob-viewer-switch-btn[data-viewer=simple]').click
-
- wait_for_requests
- end
-
- it 'displays the blob using the simple viewer' do
- aggregate_failures do
- # hides the rich viewer
- expect(page).to have_selector('.blob-viewer[data-type="simple"]')
- expect(page).to have_selector('.blob-viewer[data-type="rich"]', visible: false)
-
- # shows highlighted Markdown code
- expect(page).to have_css(".js-syntax-highlight")
- expect(page).to have_content("[PEP-8](http://www.python.org/dev/peps/pep-0008/)")
-
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
- end
- end
-
- context 'switching to the rich viewer again' do
- before do
- find('.js-blob-viewer-switch-btn[data-viewer=rich]').click
-
- wait_for_requests
- end
-
- it 'displays the blob using the rich viewer' do
- aggregate_failures do
- # hides the simple viewer
- expect(page).to have_selector('.blob-viewer[data-type="simple"]', visible: false)
- expect(page).to have_selector('.blob-viewer[data-type="rich"]')
-
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
- end
- end
- end
- end
- end
-
- context 'when ref switch' do
- def switch_ref_to(ref_name)
- first('.qa-branches-select').click # rubocop:disable QA/SelectorUsage
-
- page.within '.project-refs-form' do
- click_link ref_name
- wait_for_requests
- end
- end
-
- it 'displays single highlighted line number of different ref' do
- visit_blob('files/js/application.js', anchor: 'L1')
-
- switch_ref_to('feature')
-
- page.within '.blob-content' do
- expect(find_by_id('LC1')[:class]).to include("hll")
- end
- end
-
- it 'displays multiple highlighted line numbers of different ref' do
- visit_blob('files/js/application.js', anchor: 'L1-3')
-
- switch_ref_to('feature')
-
- page.within '.blob-content' do
- expect(find_by_id('LC1')[:class]).to include("hll")
- expect(find_by_id('LC2')[:class]).to include("hll")
- expect(find_by_id('LC3')[:class]).to include("hll")
- end
- end
-
- it 'displays no highlighted number of different ref' do
- Files::UpdateService.new(
- project,
- project.first_owner,
- commit_message: 'Update',
- start_branch: 'feature',
- branch_name: 'feature',
- file_path: 'files/js/application.js',
- file_content: 'new content'
- ).execute
-
- project.commit('feature').diffs.diff_files.first
-
- visit_blob('files/js/application.js', anchor: 'L3')
- switch_ref_to('feature')
-
- page.within '.blob-content' do
- expect(page).not_to have_css('.hll')
- end
- end
-
- context 'successfully change ref of similar name' do
- before do
- project.repository.create_branch('dev')
- project.repository.create_branch('development')
- end
-
- it 'switch ref from longer to shorter ref name' do
- visit_blob('files/js/application.js', ref: 'development')
- switch_ref_to('dev')
-
- aggregate_failures do
- expect(page.find('.file-title-name').text).to eq('application.js')
- expect(page).not_to have_css('flash-container')
- end
- end
-
- it 'switch ref from shorter to longer ref name' do
- visit_blob('files/js/application.js', ref: 'dev')
- switch_ref_to('development')
-
- aggregate_failures do
- expect(page.find('.file-title-name').text).to eq('application.js')
- expect(page).not_to have_css('flash-container')
- end
- end
- end
-
- it 'successfully changes ref when the ref name matches the project name' do
- project.repository.create_branch(project.name)
-
- visit_blob('files/js/application.js', ref: project.name)
- switch_ref_to('master')
-
- aggregate_failures do
- expect(page.find('.file-title-name').text).to eq('application.js')
- expect(page).not_to have_css('flash-container')
- end
- end
- end
-
- context 'visiting with a line number anchor' do
- before do
- visit_blob('files/markdown/ruby-style-guide.md', anchor: 'L1')
- end
-
- it 'displays the blob using the simple viewer' do
- aggregate_failures do
- # hides the rich viewer
- expect(page).to have_selector('.blob-viewer[data-type="simple"]')
- expect(page).to have_selector('.blob-viewer[data-type="rich"]', visible: false)
-
- # highlights the line in question
- expect(page).to have_selector('#LC1.hll')
-
- # shows highlighted Markdown code
- expect(page).to have_css(".js-syntax-highlight")
- expect(page).to have_content("[PEP-8](http://www.python.org/dev/peps/pep-0008/)")
-
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
- end
- end
- end
- end
-
- context 'Markdown rendering' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add RedCarpet and CommonMark Markdown ",
- file_path: 'files/commonmark/file.md',
- file_content: "1. one\n - sublist\n"
- ).execute
- end
-
- context 'when rendering default markdown' do
- before do
- visit_blob('files/commonmark/file.md')
-
- wait_for_requests
- end
-
- it 'renders using CommonMark' do
- aggregate_failures do
- expect(page).to have_content("sublist")
- expect(page).not_to have_xpath("//ol//li//ul")
- end
- end
- end
- end
-
- context 'Markdown file (stored in LFS)' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add Markdown in LFS",
- file_path: 'files/lfs/file.md',
- file_content: project.repository.blob_at('master', 'files/lfs/lfs_object.iso').data
- ).execute
- end
-
- context 'when LFS is enabled on the project' do
- before do
- allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
- project.update_attribute(:lfs_enabled, true)
-
- visit_blob('files/lfs/file.md')
-
- wait_for_requests
- end
-
- it 'displays an error' do
- aggregate_failures do
- # hides the simple viewer
- expect(page).to have_selector('.blob-viewer[data-type="simple"]', visible: false)
- expect(page).to have_selector('.blob-viewer[data-type="rich"]')
-
- # shows an error message
- expect(page).to have_content('The rendered file could not be displayed because it is stored in LFS. You can download it instead.')
-
- # shows a viewer switcher
- expect(page).to have_selector('.js-blob-viewer-switcher')
-
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
-
- # shows a download button
- expect(page).to have_link('Download')
- end
- end
-
- context 'switching to the simple viewer' do
- before do
- find('.js-blob-viewer-switcher .js-blob-viewer-switch-btn[data-viewer=simple]').click
-
- wait_for_requests
- end
-
- it 'displays an error' do
- aggregate_failures do
- # hides the rich viewer
- expect(page).to have_selector('.blob-viewer[data-type="simple"]')
- expect(page).to have_selector('.blob-viewer[data-type="rich"]', visible: false)
-
- # shows an error message
- expect(page).to have_content('The source could not be displayed because it is stored in LFS. You can download it instead.')
-
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
- end
- end
- end
- end
-
- context 'when LFS is disabled on the project' do
- before do
- visit_blob('files/lfs/file.md')
-
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows text
- expect(page).to have_content('size 1575078')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
-
- # shows a raw button
- expect(page).to have_link('Open raw')
- end
- end
- end
- end
-
- context 'PDF file' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add PDF",
- file_path: 'files/test.pdf',
- file_content: project.repository.blob_at('add-pdf-file', 'files/pdf/test.pdf').data
- ).execute
-
- visit_blob('files/test.pdf')
-
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows rendered PDF
- expect(page).to have_selector('.js-pdf-viewer')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
-
- # shows a download button
- expect(page).to have_link('Download')
- end
- end
- end
-
- context 'Jupiter Notebook file' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add Jupiter Notebook",
- file_path: 'files/basic.ipynb',
- file_content: project.repository.blob_at('add-ipython-files', 'files/ipython/basic.ipynb').data
- ).execute
-
- visit_blob('files/basic.ipynb')
-
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows rendered notebook
- expect(page).to have_selector('.js-notebook-viewer-mounted')
-
- # does show a viewer switcher
- expect(page).to have_selector('.js-blob-viewer-switcher')
-
- # show a disabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn.disabled')
-
- # shows a raw button
- expect(page).to have_link('Open raw')
-
- # shows a download button
- expect(page).to have_link('Download')
-
- # shows the rendered notebook
- expect(page).to have_content('test')
- end
- end
- end
-
- context 'ISO file (stored in LFS)' do
- context 'when LFS is enabled on the project' do
- before do
- allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
- project.update_attribute(:lfs_enabled, true)
-
- visit_blob('files/lfs/lfs_object.iso')
-
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows a download link
- expect(page).to have_link('Download (1.5 MB)')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
-
- # shows a download button
- expect(page).to have_link('Download')
- end
- end
- end
-
- context 'when LFS is disabled on the project' do
- before do
- visit_blob('files/lfs/lfs_object.iso')
-
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows text
- expect(page).to have_content('size 1575078')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # shows an enabled copy button
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
-
- # shows a raw button
- expect(page).to have_link('Open raw')
- end
- end
- end
- end
-
- context 'ZIP file' do
- before do
- visit_blob('Gemfile.zip')
-
- wait_for_requests
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows a download link
- expect(page).to have_link('Download (2.11 KB)')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
-
- # shows a download button
- expect(page).to have_link('Download')
- end
- end
- end
-
- context 'empty file' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add empty file",
- file_path: 'files/empty.md',
- file_content: ''
- ).execute
-
- visit_blob('files/empty.md')
-
- wait_for_requests
- end
-
- it 'displays an error' do
- aggregate_failures do
- # shows an error message
- expect(page).to have_content('Empty file')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # does not show a copy button
- expect(page).not_to have_selector('.js-copy-blob-source-btn')
-
- # does not show a download or raw button
- expect(page).not_to have_link('Download')
- expect(page).not_to have_link('Open raw')
- end
- end
- end
-
- context 'binary file that appears to be text in the first 1024 bytes' do
- before do
- visit_blob('encoding/binary-1.bin', ref: 'binary-encoding')
- end
-
- it 'displays the blob' do
- aggregate_failures do
- # shows a download link
- expect(page).to have_link('Download (23.8 KB)')
-
- # does not show a viewer switcher
- expect(page).not_to have_selector('.js-blob-viewer-switcher')
-
- # The specs below verify an arguably incorrect result, but since we only
- # learn that the file is not actually text once the text viewer content
- # is loaded asynchronously, there is no straightforward way to get these
- # synchronously loaded elements to display correctly.
- #
- # Clicking the copy button will result in nothing being copied.
- # Clicking the raw button will result in the binary file being downloaded,
- # as expected.
-
- # shows an enabled copy button, incorrectly
- expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)')
-
- # shows a raw button, incorrectly
- expect(page).to have_link('Open raw')
- end
- end
- end
-
- context 'files with auxiliary viewers' do
- describe '.gitlab-ci.yml' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab-ci.yml",
- file_path: '.gitlab-ci.yml',
- file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
- ).execute
-
- visit_blob('.gitlab-ci.yml')
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that configuration is valid
- expect(page).to have_content('This GitLab CI configuration is valid.')
-
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
- end
-
- describe '.gitlab/route-map.yml' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab/route-map.yml",
- file_path: '.gitlab/route-map.yml',
- file_content: <<-MAP.strip_heredoc
- # Team data
- - source: 'data/team.yml'
- public: 'team/'
- MAP
- ).execute
-
- visit_blob('.gitlab/route-map.yml')
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that map is valid
- expect(page).to have_content('This Route Map is valid.')
-
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
- end
-
- describe '.gitlab/dashboards/custom-dashboard.yml' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab/dashboards/custom-dashboard.yml",
- file_path: '.gitlab/dashboards/custom-dashboard.yml',
- file_content: file_content
- ).execute
- end
-
- context 'with metrics_dashboard_exhaustive_validations feature flag off' do
- before do
- stub_feature_flags(metrics_dashboard_exhaustive_validations: false)
- visit_blob('.gitlab/dashboards/custom-dashboard.yml')
- end
-
- context 'valid dashboard file' do
- let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) }
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is valid
- expect(page).to have_content('Metrics Dashboard YAML definition is valid.')
-
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
- end
-
- context 'invalid dashboard file' do
- let(:file_content) { "dashboard: 'invalid'" }
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is invalid
- expect(page).to have_content('Metrics Dashboard YAML definition is invalid:')
- expect(page).to have_content("panel_groups: should be an array of panel_groups objects")
-
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
- end
- end
-
- context 'with metrics_dashboard_exhaustive_validations feature flag on' do
- before do
- stub_feature_flags(metrics_dashboard_exhaustive_validations: true)
- visit_blob('.gitlab/dashboards/custom-dashboard.yml')
- end
-
- context 'valid dashboard file' do
- let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) }
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is valid
- expect(page).to have_content('Metrics Dashboard YAML definition is valid.')
-
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
- end
-
- context 'invalid dashboard file' do
- let(:file_content) { "dashboard: 'invalid'" }
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows that dashboard yaml is invalid
- expect(page).to have_content('Metrics Dashboard YAML definition is invalid:')
- expect(page).to have_content("root is missing required keys: panel_groups")
-
- # shows a learn more link
- expect(page).to have_link('Learn more')
- end
- end
- end
- end
- end
-
- context 'LICENSE' do
- before do
- visit_blob('LICENSE')
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows license
- expect(page).to have_content('This project is licensed under the MIT License.')
-
- # shows a learn more link
- expect(page).to have_link('Learn more', href: 'http://choosealicense.com/licenses/mit/')
- end
- end
- end
-
- context '*.gemspec' do
- before do
- project.add_maintainer(project.creator)
-
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add activerecord.gemspec",
- file_path: 'activerecord.gemspec',
- file_content: <<-SPEC.strip_heredoc
- Gem::Specification.new do |s|
- s.platform = Gem::Platform::RUBY
- s.name = "activerecord"
- end
- SPEC
- ).execute
-
- visit_blob('activerecord.gemspec')
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- # shows names of dependency manager and package
- expect(page).to have_content('This project manages its dependencies using RubyGems.')
-
- # shows a learn more link
- expect(page).to have_link('Learn more', href: 'https://rubygems.org/')
- end
- end
- end
-
- context 'CONTRIBUTING.md' do
- before do
- file_name = 'CONTRIBUTING.md'
-
- create_file(file_name, '## Contribution guidelines')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("After you've reviewed these contribution guidelines, you'll be all set to contribute to this project.")
- end
- end
- end
-
- context 'CHANGELOG.md' do
- before do
- file_name = 'CHANGELOG.md'
-
- create_file(file_name, '## Changelog for v1.0.0')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("To find the state of this project's repository at the time of any of these versions, check out the tags.")
- end
- end
- end
-
- context 'Cargo.toml' do
- before do
- file_name = 'Cargo.toml'
-
- create_file(file_name, '
- [package]
- name = "hello_world" # the name of the package
- version = "0.1.0" # the current version, obeying semver
- authors = ["Alice <a@example.com>", "Bob <b@example.com>"]
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Cargo.")
- end
- end
- end
-
- context 'Cartfile' do
- before do
- file_name = 'Cartfile'
-
- create_file(file_name, '
- gitlab "Alamofire/Alamofire" == 4.9.0
- gitlab "Alamofire/AlamofireImage" ~> 3.4
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Carthage.")
- end
- end
- end
-
- context 'composer.json' do
- before do
- file_name = 'composer.json'
-
- create_file(file_name, '
- {
- "license": "MIT"
- }
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Composer.")
- end
- end
- end
-
- context 'Gemfile' do
- before do
- file_name = 'Gemfile'
-
- create_file(file_name, '
- source "https://rubygems.org"
-
- # Gems here
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Bundler.")
- end
- end
- end
-
- context 'Godeps.json' do
- before do
- file_name = 'Godeps.json'
-
- create_file(file_name, '
- {
- "GoVersion": "go1.6"
- }
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using godep.")
- end
- end
- end
-
- context 'go.mod' do
- before do
- file_name = 'go.mod'
-
- create_file(file_name, '
- module example.com/mymodule
-
- go 1.14
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Go Modules.")
- end
- end
- end
-
- context 'package.json' do
- before do
- file_name = 'package.json'
-
- create_file(file_name, '
- {
- "name": "my-awesome-package",
- "version": "1.0.0"
- }
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using npm.")
- end
- end
- end
-
- context 'podfile' do
- before do
- file_name = 'podfile'
-
- create_file(file_name, 'platform :ios, "8.0"')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using CocoaPods.")
- end
- end
- end
-
- context 'test.podspec' do
- before do
- file_name = 'test.podspec'
-
- create_file(file_name, '
- Pod::Spec.new do |s|
- s.name = "TensorFlowLiteC"
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using CocoaPods.")
- end
- end
- end
-
- context 'JSON.podspec.json' do
- before do
- file_name = 'JSON.podspec.json'
-
- create_file(file_name, '
- {
- "name": "JSON"
- }
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using CocoaPods.")
- end
- end
- end
-
- context 'requirements.txt' do
- before do
- file_name = 'requirements.txt'
-
- create_file(file_name, 'Project requirements')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using pip.")
- end
- end
- end
-
- context 'yarn.lock' do
- before do
- file_name = 'yarn.lock'
-
- create_file(file_name, '
- # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
- # yarn lockfile v1
- ')
- visit_blob(file_name)
- end
-
- it 'displays an auxiliary viewer' do
- aggregate_failures do
- expect(page).to have_content("This project manages its dependencies using Yarn.")
- end
- end
- end
-
- context 'openapi.yml' do
- before do
- file_name = 'openapi.yml'
-
- create_file(file_name, '
- swagger: \'2.0\'
- info:
- title: Classic API Resource Documentation
- description: |
- <div class="foo-bar" style="background-color: red;" data-foo-bar="baz">
- <h1>Swagger API documentation</h1>
- </div>
- version: production
- basePath: /JSSResource/
- produces:
- - application/xml
- - application/json
- consumes:
- - application/xml
- - application/json
- security:
- - basicAuth: []
- paths:
- /accounts:
- get:
- responses:
- \'200\':
- description: No response was specified
- tags:
- - accounts
- operationId: findAccounts
- summary: Finds all accounts
- ')
- visit_blob(file_name, useUnsafeMarkdown: '1')
- click_button('Display rendered file')
-
- wait_for_requests
- end
-
- it 'removes `style`, `class`, and `data-*`` attributes from HTML' do
- expect(page).to have_css('h1', text: 'Swagger API documentation')
- expect(page).not_to have_css('.foo-bar')
- expect(page).not_to have_css('[style="background-color: red;"]')
- expect(page).not_to have_css('[data-foo-bar="baz"]')
- end
- end
- end
-
- context 'realtime pipelines' do
- before do
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'feature',
- branch_name: 'feature',
- commit_message: "Add ruby file",
- file_path: 'files/ruby/test.rb',
- file_content: "# Awesome content"
- ).execute
-
- create(:ci_pipeline, status: 'running', project: project, ref: 'feature', sha: project.commit('feature').sha)
- visit_blob('files/ruby/test.rb', ref: 'feature')
- end
-
- it 'shows the realtime pipeline status' do
- page.within('.commit-actions') do
- expect(page).to have_css('.ci-status-icon')
- expect(page).to have_css('.ci-status-icon-running')
- expect(page).to have_css('.js-ci-status-icon-running')
- end
- end
- end
-
- context 'for subgroups' do
- let(:group) { create(:group) }
- let(:subgroup) { create(:group, parent: group) }
- let(:project) { create(:project, :public, :repository, group: subgroup) }
-
- it 'renders tree table without errors' do
- visit_blob('README.md')
-
- expect(page).to have_selector('.file-content')
- expect(page).not_to have_selector('[data-testid="alert-danger"]')
- end
-
- it 'displays a GPG badge' do
- visit_blob('CONTRIBUTING.md', ref: '33f3729a45c02fc67d00adb1b8bca394b0e761d9')
-
- expect(page).not_to have_selector '.gpg-status-box.js-loading-gpg-badge'
- expect(page).to have_selector '.gpg-status-box.invalid'
- end
- end
-
- context 'on signed merge commit' do
- it 'displays a GPG badge' do
- visit_blob('conflicting-file.md', ref: '6101e87e575de14b38b4e1ce180519a813671e10')
-
- expect(page).not_to have_selector '.gpg-status-box.js-loading-gpg-badge'
- expect(page).to have_selector '.gpg-status-box.invalid'
- end
- end
-
- context 'when static objects external storage is enabled' do
- before do
- stub_application_setting(static_objects_external_storage_url: 'https://cdn.gitlab.com')
- end
-
- context 'private project' do
- let_it_be(:project) { create(:project, :repository, :private) }
- let_it_be(:user) { create(:user) }
-
- before do
- project.add_developer(user)
-
- sign_in(user)
- visit_blob('README.md')
- end
-
- it 'shows open raw and download buttons with external storage URL prepended and user token appended to their href' do
- path = project_raw_path(project, 'master/README.md')
- raw_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}"
- download_uri = "https://cdn.gitlab.com#{path}?inline=false&token=#{user.static_object_token}"
-
- aggregate_failures do
- expect(page).to have_link 'Open raw', href: raw_uri
- expect(page).to have_link 'Download', href: download_uri
- end
- end
- end
-
- context 'public project' do
- before do
- visit_blob('README.md')
- end
-
- it 'shows open raw and download buttons with external storage URL prepended to their href' do
- path = project_raw_path(project, 'master/README.md')
- raw_uri = "https://cdn.gitlab.com#{path}"
- download_uri = "https://cdn.gitlab.com#{path}?inline=false"
-
- aggregate_failures do
- expect(page).to have_link 'Open raw', href: raw_uri
- expect(page).to have_link 'Download', href: download_uri
- end
- end
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb
deleted file mode 100644
index f5b9947b29e..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb
+++ /dev/null
@@ -1,213 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Editing file blob', :js do
- include TreeHelper
- include BlobSpecHelpers
-
- let(:project) { create(:project, :public, :repository) }
- let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') }
- let(:branch) { 'master' }
- let(:file_path) { project.repository.ls_files(project.repository.root_ref)[1] }
- let(:readme_file_path) { 'README.md' }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- context 'as a developer' do
- let(:user) { create(:user) }
- let(:role) { :developer }
-
- before do
- project.add_role(user, role)
- sign_in(user)
- end
-
- def edit_and_commit(commit_changes: true, is_diff: false)
- set_default_button('edit')
- refresh
- wait_for_requests
-
- if is_diff
- first('.js-diff-more-actions').click
- click_link('Edit in single-file editor')
- else
- click_link('Edit')
- end
-
- fill_editor(content: 'class NextFeature\\nend\\n')
-
- if commit_changes
- click_button 'Commit changes'
- end
- end
-
- def fill_editor(content: 'class NextFeature\\nend\\n')
- wait_for_requests
- execute_script("monaco.editor.getModels()[0].setValue('#{content}')")
- end
-
- context 'from MR diff' do
- before do
- visit diffs_project_merge_request_path(project, merge_request)
- edit_and_commit(is_diff: true)
- end
-
- it 'returns me to the mr' do
- expect(page).to have_content(merge_request.title)
- end
- end
-
- it 'updates the content of file with a number as file path' do
- project.repository.create_file(user, '1', 'test', message: 'testing', branch_name: branch)
- visit project_blob_path(project, tree_join(branch, '1'))
-
- edit_and_commit
-
- expect(page).to have_content 'NextFeature'
- end
-
- it 'editing a template file in a sub directory does not change path' do
- project.repository.create_file(user, 'ci/.gitlab-ci.yml', 'test', message: 'testing', branch_name: branch)
- visit project_edit_blob_path(project, tree_join(branch, 'ci/.gitlab-ci.yml'))
-
- expect(find_by_id('file_path').value).to eq('ci/.gitlab-ci.yml')
- end
-
- it 'updating file path updates syntax highlighting' do
- visit project_edit_blob_path(project, tree_join(branch, readme_file_path))
- expect(find('#editor')['data-mode-id']).to eq('markdown')
-
- find('#file_path').send_keys('foo.txt') do
- expect(find('#editor')['data-mode-id']).to eq('plaintext')
- end
- end
-
- context 'from blob file path' do
- before do
- visit project_blob_path(project, tree_join(branch, file_path))
- end
-
- it 'updates content' do
- edit_and_commit
-
- expect(page).to have_content 'successfully committed'
- expect(page).to have_content 'NextFeature'
- end
-
- it 'previews content' do
- edit_and_commit(commit_changes: false)
- click_link 'Preview changes'
- wait_for_requests
-
- old_line_count = page.all('.line_holder.old').size
- new_line_count = page.all('.line_holder.new').size
-
- expect(old_line_count).to be > 0
- expect(new_line_count).to be > 0
- end
- end
-
- context 'when rendering the preview' do
- it 'renders content with CommonMark' do
- visit project_edit_blob_path(project, tree_join(branch, readme_file_path))
- fill_editor(content: '1. one\\n - sublist\\n')
- click_link 'Preview'
- wait_for_requests
-
- # the above generates two separate lists (not embedded) in CommonMark
- expect(page).to have_content('sublist')
- expect(page).not_to have_xpath('//ol//li//ul')
- end
- end
- end
-
- context 'visit blob edit' do
- context 'redirects to sign in and returns' do
- context 'as developer' do
- let(:user) { create(:user) }
-
- before do
- project.add_developer(user)
- visit project_edit_blob_path(project, tree_join(branch, file_path))
- end
-
- it 'redirects to sign in and returns' do
- expect(page).to have_current_path(new_user_session_path)
-
- gitlab_sign_in(user)
-
- expect(page).to have_current_path(project_edit_blob_path(project, tree_join(branch, file_path)))
- end
- end
-
- context 'as guest' do
- let(:user) { create(:user) }
-
- before do
- visit project_edit_blob_path(project, tree_join(branch, file_path))
- end
-
- it 'redirects to sign in and returns' do
- expect(page).to have_current_path(new_user_session_path)
-
- gitlab_sign_in(user)
-
- expect(page).to have_current_path(project_blob_path(project, tree_join(branch, file_path)))
- end
- end
- end
-
- context 'as developer' do
- let(:user) { create(:user) }
- let(:protected_branch) { 'protected-branch' }
-
- before do
- project.add_developer(user)
- project.repository.add_branch(user, protected_branch, 'master')
- create(:protected_branch, project: project, name: protected_branch)
- sign_in(user)
- end
-
- context 'on some branch' do
- before do
- visit project_edit_blob_path(project, tree_join(branch, file_path))
- end
-
- it 'shows blob editor with same branch' do
- expect(page).to have_current_path(project_edit_blob_path(project, tree_join(branch, file_path)))
- expect(find('.js-branch-name').value).to eq(branch)
- end
- end
-
- context 'with protected branch' do
- it 'shows blob editor with patch branch' do
- freeze_time do
- visit project_edit_blob_path(project, tree_join(protected_branch, file_path))
-
- epoch = Time.zone.now.strftime('%s%L').last(5)
-
- expect(find('.js-branch-name').value).to eq "#{user.username}-protected-branch-patch-#{epoch}"
- end
- end
- end
- end
-
- context 'as maintainer' do
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- visit project_edit_blob_path(project, tree_join(branch, file_path))
- end
-
- it 'shows blob editor with same branch' do
- expect(page).to have_current_path(project_edit_blob_path(project, tree_join(branch, file_path)))
- expect(find('.js-branch-name').value).to eq(branch)
- end
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/shortcuts_blob_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/shortcuts_blob_spec.rb
deleted file mode 100644
index fe0b217992e..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/shortcuts_blob_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Blob shortcuts', :js do
- include TreeHelper
- let(:project) { create(:project, :public, :repository) }
- let(:path) { project.repository.ls_files(project.repository.root_ref)[0] }
- let(:sha) { project.repository.commit.sha }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- describe 'On a file(blob)', :js do
- def get_absolute_url(path = "")
- "http://#{page.server.host}:#{page.server.port}#{path}"
- end
-
- def visit_blob(fragment = nil)
- visit project_blob_path(project, tree_join('master', path), anchor: fragment)
- end
-
- describe 'pressing "y"' do
- it 'redirects to permalink with commit sha' do
- visit_blob
- wait_for_requests
-
- find('body').native.send_key('y')
-
- expect(page).to have_current_path(get_absolute_url(project_blob_path(project, tree_join(sha, path))), url: true)
- end
-
- it 'maintains fragment hash when redirecting' do
- fragment = "L1"
- visit_blob(fragment)
- wait_for_requests
-
- find('body').native.send_key('y')
-
- expect(page).to have_current_path(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: fragment)), url: true)
- end
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_creates_new_blob_in_new_project_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_creates_new_blob_in_new_project_spec.rb
deleted file mode 100644
index fe38659f60b..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_creates_new_blob_in_new_project_spec.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'User creates new blob', :js do
- include WebIdeSpecHelpers
-
- let(:user) { create(:user) }
- let(:project) { create(:project, :empty_repo) }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- shared_examples 'creating a file' do
- it 'allows the user to add a new file in Web IDE' do
- visit project_path(project)
-
- click_link 'New file'
-
- wait_for_requests
-
- ide_create_new_file('dummy-file', content: "Hello world\n")
-
- ide_commit
-
- expect(page).to have_content('All changes are committed')
- expect(project.repository.blob_at('master', 'dummy-file').data).to eql("Hello world\n")
- end
- end
-
- describe 'as a maintainer' do
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- it_behaves_like 'creating a file'
- end
-
- describe 'as an admin' do
- let(:user) { create(:user, :admin) }
-
- before do
- sign_in(user)
- gitlab_enable_admin_mode_sign_in(user)
- end
-
- it_behaves_like 'creating a file'
- end
-
- describe 'as a developer' do
- before do
- project.add_developer(user)
- sign_in(user)
- visit project_path(project)
- end
-
- it 'does not allow pushing to the default branch' do
- expect(page).not_to have_content('New file')
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb
deleted file mode 100644
index 4290df08e66..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled', :js do
- include CookieHelper
-
- let(:project) { create(:project, :empty_repo) }
- let(:user) { project.first_owner }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- describe 'viewing the new blob page' do
- before do
- sign_in(user)
- end
-
- context 'when the page is loaded from the link using the suggest_gitlab_ci_yml param' do
- before do
- visit namespace_project_new_blob_path(namespace_id: project.namespace, project_id: project, id: 'master', suggest_gitlab_ci_yml: 'true')
- end
-
- it 'pre-fills .gitlab-ci.yml for file name' do
- file_name = page.find_by_id('file_name')
-
- expect(file_name.value).to have_content('.gitlab-ci.yml')
- end
-
- it 'chooses the .gitlab-ci.yml Template Type' do
- template_type = page.find(:css, '.template-type-selector .dropdown-toggle-text')
-
- expect(template_type.text).to have_content('.gitlab-ci.yml')
- end
-
- it 'displays suggest_gitlab_ci_yml popover' do
- page.find(:css, '.gitlab-ci-yml-selector').click
-
- popover_selector = '.suggest-gitlab-ci-yml'
-
- expect(page).to have_css(popover_selector, visible: true)
-
- page.within(popover_selector) do
- expect(page).to have_content('1/2: Choose a template')
- end
- end
-
- it 'sets the commit cookie when the Commit button is clicked' do
- click_button 'Commit changes'
-
- expect(get_cookie("suggest_gitlab_ci_yml_commit_#{project.id}")).to be_present
- end
- end
-
- context 'when the page is visited without the param' do
- before do
- visit namespace_project_new_blob_path(namespace_id: project.namespace, project_id: project, id: 'master')
- end
-
- it 'does not pre-fill .gitlab-ci.yml for file name' do
- file_name = page.find_by_id('file_name')
-
- expect(file_name.value).not_to have_content('.gitlab-ci.yml')
- end
-
- it 'does not choose the .gitlab-ci.yml Template Type' do
- template_type = page.find(:css, '.template-type-selector .dropdown-toggle-text')
-
- expect(template_type.text).to have_content('Select a template type')
- end
-
- it 'does not display suggest_gitlab_ci_yml popover' do
- popover_selector = '.b-popover.suggest-gitlab-ci-yml'
-
- expect(page).not_to have_css(popover_selector, visible: true)
- end
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_views_pipeline_editor_button_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_views_pipeline_editor_button_spec.rb
deleted file mode 100644
index a00e1eaa551..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/user_views_pipeline_editor_button_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'User views pipeline editor button on root ci config file', :js do
- include BlobSpecHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public, :repository) }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- end
-
- context "when the ci config is the root file" do
- before do
- project.add_developer(user)
- sign_in(user)
- end
-
- it 'shows the button to the Pipeline Editor' do
- project.update!(ci_config_path: '.my-config.yml')
- project.repository.create_file(user, project.ci_config_path_or_default, 'test', message: 'testing', branch_name: 'master')
- visit project_blob_path(project, File.join('master', '.my-config.yml'))
-
- expect(page).to have_content('Edit in pipeline editor')
- end
-
- it 'does not shows the Pipeline Editor button' do
- project.repository.create_file(user, '.my-sub-config.yml', 'test', message: 'testing', branch_name: 'master')
- visit project_blob_path(project, File.join('master', '.my-sub-config.yml'))
-
- expect(page).not_to have_content('Edit in pipeline editor')
- end
- end
-
- context "when user cannot collaborate" do
- before do
- sign_in(user)
- end
- it 'does not shows the Pipeline Editor button' do
- visit project_blob_path(project, File.join('master', '.my-config.yml'))
- expect(page).not_to have_content('Edit in pipeline editor')
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/files/editing_a_file_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/files/editing_a_file_spec.rb
deleted file mode 100644
index c32fb1aa4d3..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/files/editing_a_file_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Projects > Files > User wants to edit a file' do
- let(:project) { create(:project, :repository) }
- let(:user) { project.first_owner }
- let(:commit_params) do
- {
- start_branch: project.default_branch,
- branch_name: project.default_branch,
- commit_message: "Committing First Update",
- file_path: ".gitignore",
- file_content: "First Update",
- last_commit_sha: Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch,
- ".gitignore").sha
- }
- end
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- sign_in user
- visit project_edit_blob_path(project,
- File.join(project.default_branch, '.gitignore'))
- end
-
- it 'file has been updated since the user opened the edit page' do
- Files::UpdateService.new(project, user, commit_params).execute
-
- click_button 'Commit changes'
-
- expect(page).to have_content 'Someone edited the file the same time you did.'
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/files/find_file_keyboard_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/files/find_file_keyboard_spec.rb
deleted file mode 100644
index 9ba5f5a9b57..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/files/find_file_keyboard_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Projects > Files > Find file keyboard shortcuts', :js do
- let(:project) { create(:project, :repository) }
- let(:user) { project.first_owner }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- sign_in user
-
- visit project_find_file_path(project, project.repository.root_ref)
-
- wait_for_requests
- end
-
- it 'opens file when pressing enter key' do
- fill_in 'file_find', with: 'CHANGELOG'
-
- find('#file_find').native.send_keys(:enter)
-
- expect(page).to have_selector('.blob-content-holder')
-
- page.within('.js-file-title') do
- expect(page).to have_content('CHANGELOG')
- end
- end
-
- it 'navigates files with arrow keys' do
- fill_in 'file_find', with: 'application.'
-
- find('#file_find').native.send_keys(:down)
- find('#file_find').native.send_keys(:enter)
-
- expect(page).to have_selector('.blob-content-holder')
-
- page.within('.js-file-title') do
- expect(page).to have_content('application.js')
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/files/project_owner_creates_license_file_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/files/project_owner_creates_license_file_spec.rb
deleted file mode 100644
index ab920504100..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/files/project_owner_creates_license_file_spec.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Projects > Files > Project owner creates a license file', :js do
- let(:project) { create(:project, :repository) }
- let(:project_maintainer) { project.first_owner }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- project.repository.delete_file(project_maintainer, 'LICENSE',
- message: 'Remove LICENSE', branch_name: 'master')
- sign_in(project_maintainer)
- visit project_path(project)
- end
-
- it 'project maintainer creates a license file manually from a template' do
- visit project_tree_path(project, project.repository.root_ref)
- find('.add-to-tree').click
- click_link 'New file'
-
- fill_in :file_name, with: 'LICENSE'
-
- expect(page).to have_selector('.license-selector')
-
- select_template('MIT License')
-
- file_content = first('.file-editor')
- expect(file_content).to have_content('MIT License')
- expect(file_content).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}")
-
- fill_in :commit_message, with: 'Add a LICENSE file', visible: true
- click_button 'Commit changes'
-
- expect(page).to have_current_path(
- project_blob_path(project, 'master/LICENSE'), ignore_query: true)
- expect(page).to have_content('MIT License')
- expect(page).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}")
- end
-
- it 'project maintainer creates a license file from the "Add license" link' do
- click_link 'Add LICENSE'
-
- expect(page).to have_content('New file')
- expect(page).to have_current_path(
- project_new_blob_path(project, 'master'), ignore_query: true)
- expect(find('#file_name').value).to eq('LICENSE')
- expect(page).to have_selector('.license-selector')
-
- select_template('MIT License')
-
- file_content = first('.file-editor')
- expect(file_content).to have_content('MIT License')
- expect(file_content).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}")
-
- fill_in :commit_message, with: 'Add a LICENSE file', visible: true
- click_button 'Commit changes'
-
- expect(page).to have_current_path(
- project_blob_path(project, 'master/LICENSE'), ignore_query: true)
- expect(page).to have_content('MIT License')
- expect(page).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}")
- end
-
- def select_template(template)
- page.within('.js-license-selector-wrap') do
- click_button 'Apply a template'
- click_link template
- wait_for_requests
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb
deleted file mode 100644
index 5abdad905fd..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb
+++ /dev/null
@@ -1,377 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-RSpec.describe "User browses files", :js do
- include RepoHelpers
-
- let(:fork_message) do
- "You're not allowed to make changes to this project directly. "\
- "A fork of this project has been created that you can make changes in, so you can submit a merge request."
- end
-
- let(:project) { create(:project, :repository, name: "Shop") }
- let(:project2) { create(:project, :repository, name: "Another Project", path: "another-project") }
- let(:tree_path_root_ref) { project_tree_path(project, project.repository.root_ref) }
- let(:user) { project.first_owner }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- sign_in(user)
- end
-
- it "shows last commit for current directory", :js do
- visit(tree_path_root_ref)
-
- click_link("files")
-
- last_commit = project.repository.last_commit_for_path(project.default_branch, "files")
-
- page.within(".commit-detail") do
- expect(page).to have_content(last_commit.short_id).and have_content(last_commit.author_name)
- end
- end
-
- context "when browsing the master branch", :js do
- before do
- visit(tree_path_root_ref)
- end
-
- it "shows files from a repository" do
- expect(page).to have_content("VERSION")
- .and have_content(".gitignore")
- .and have_content("LICENSE")
- end
-
- it "shows the `Browse Directory` link" do
- click_link("files")
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('files')
- end
-
- click_link("History")
-
- expect(page).to have_link("Browse Directory").and have_no_link("Browse Code")
- end
-
- it "shows the `Browse File` link" do
- page.within(".tree-table") do
- click_link("README.md")
- end
-
- click_link("History")
-
- expect(page).to have_link("Browse File").and have_no_link("Browse Files")
- end
-
- it "shows the `Browse Files` link" do
- click_link("History")
-
- expect(page).to have_link("Browse Files").and have_no_link("Browse Directory")
- end
-
- it "redirects to the permalink URL" do
- click_link(".gitignore")
- click_link("Permalink")
-
- permalink_path = project_blob_path(project, "#{project.repository.commit.sha}/.gitignore")
-
- expect(page).to have_current_path(permalink_path, ignore_query: true)
- end
- end
-
- context "when browsing the `markdown` branch", :js do
- context "when browsing the root" do
- before do
- visit(project_tree_path(project, "markdown"))
- end
-
- it "shows correct files and links" do
- expect(page).to have_current_path(project_tree_path(project, "markdown"), ignore_query: true)
- expect(page).to have_content("README.md")
- .and have_content("CHANGELOG")
- .and have_content("Welcome to GitLab GitLab is a free project and repository management application")
- .and have_link("GitLab API doc")
- .and have_link("GitLab API website")
- .and have_link("Rake tasks")
- .and have_link("backup and restore procedure")
- .and have_link("GitLab API doc directory")
- .and have_link("Maintenance")
- .and have_header_with_correct_id_and_link(2, "Application details", "application-details")
- .and have_link("empty", href: "")
- .and have_link("#id", href: "#id")
- .and have_link("/#id", href: project_blob_path(project, "markdown/README.md", anchor: "id"))
- .and have_link("README.md#id", href: project_blob_path(project, "markdown/README.md", anchor: "id"))
- .and have_link("d/README.md#id", href: project_blob_path(project, "markdown/db/README.md", anchor: "id"))
- end
-
- it "shows correct content of file" do
- click_link("GitLab API doc")
-
- expect(page).to have_current_path(project_blob_path(project, "markdown/doc/api/README.md"), ignore_query: true)
- expect(page).to have_content("All API requests require authentication")
- .and have_content("Contents")
- .and have_link("Users")
- .and have_link("Rake tasks")
- .and have_header_with_correct_id_and_link(1, "GitLab API", "gitlab-api")
-
- click_link("Users")
-
- expect(page).to have_current_path(project_blob_path(project, "markdown/doc/api/users.md"), ignore_query: true)
- expect(page).to have_content("Get a list of users.")
-
- page.go_back
-
- click_link("Rake tasks")
-
- expect(page).to have_current_path(project_tree_path(project, "markdown/doc/raketasks"), ignore_query: true)
- expect(page).to have_content("backup_restore.md").and have_content("maintenance.md")
-
- click_link("maintenance.md")
-
- expect(page).to have_current_path(project_blob_path(project, "markdown/doc/raketasks/maintenance.md"), ignore_query: true)
- expect(page).to have_content("bundle exec rake gitlab:env:info RAILS_ENV=production")
-
- click_link("shop")
-
- page.within(".tree-table") do
- click_link("README.md")
- end
-
- page.go_back
-
- page.within(".tree-table") do
- click_link("d")
- end
-
- expect(page).to have_link("..", href: project_tree_path(project, "markdown/"))
-
- page.within(".tree-table") do
- click_link("README.md")
- end
-
- expect(page).to have_link("empty", href: "")
- end
-
- it "shows correct content of directory" do
- click_link("GitLab API doc directory")
-
- expect(page).to have_current_path(project_tree_path(project, "markdown/doc/api"), ignore_query: true)
- expect(page).to have_content("README.md").and have_content("users.md")
-
- click_link("Users")
-
- expect(page).to have_current_path(project_blob_path(project, "markdown/doc/api/users.md"), ignore_query: true)
- expect(page).to have_content("List users").and have_content("Get a list of users.")
- end
- end
- end
-
- context 'when commit message has markdown', :js do
- before do
- project.repository.create_file(user, 'index', 'test', message: ':star: testing', branch_name: 'master')
-
- visit(project_tree_path(project, "master"))
- end
-
- it 'renders emojis' do
- expect(page).to have_selector('gl-emoji', count: 2)
- end
- end
-
- context "when browsing a `improve/awesome` branch", :js do
- before do
- visit(project_tree_path(project, "improve/awesome"))
- end
-
- it "shows files from a repository" do
- expect(page).to have_content("VERSION")
- .and have_content(".gitignore")
- .and have_content("LICENSE")
-
- click_link("files")
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('files')
- end
-
- click_link("html")
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('html')
- end
-
- expect(page).to have_link('500.html')
- end
- end
-
- context "when browsing a `Ääh-test-utf-8` branch", :js do
- before do
- project.repository.create_branch('Ääh-test-utf-8', project.repository.root_ref)
- visit(project_tree_path(project, "Ääh-test-utf-8"))
- end
-
- it "shows files from a repository" do
- expect(page).to have_content("VERSION")
- .and have_content(".gitignore")
- .and have_content("LICENSE")
-
- click_link("files")
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('files')
- end
-
- click_link("html")
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('html')
- end
-
- expect(page).to have_link('500.html')
- end
- end
-
- context "when browsing a `test-#` branch", :js do
- before do
- project.repository.create_branch('test-#', project.repository.root_ref)
- visit(project_tree_path(project, "test-#"))
- end
-
- it "shows files from a repository" do
- expect(page).to have_content("VERSION")
- .and have_content(".gitignore")
- .and have_content("LICENSE")
-
- click_link("files")
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('files')
- end
-
- click_link("html")
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('html')
- end
-
- expect(page).to have_link('500.html')
- end
- end
-
- context "when browsing a specific ref", :js do
- let(:ref) { project_tree_path(project, "6d39438") }
-
- before do
- visit(ref)
- end
-
- it "shows files from a repository for `6d39438`" do
- expect(page).to have_current_path(ref, ignore_query: true)
- expect(page).to have_content(".gitignore").and have_content("LICENSE")
- end
-
- it "shows files from a repository with apostroph in its name" do
- first(".js-project-refs-dropdown").click
-
- page.within(".project-refs-form") do
- click_link("'test'")
- end
-
- expect(page).to have_selector(".dropdown-toggle-text", text: "'test'")
-
- visit(project_tree_path(project, "'test'"))
-
- expect(page).not_to have_selector(".tree-commit .animation-container")
- end
-
- it "shows the code with a leading dot in the directory" do
- first(".js-project-refs-dropdown").click
-
- page.within(".project-refs-form") do
- click_link("fix")
- end
-
- visit(project_tree_path(project, "fix/.testdir"))
-
- expect(page).not_to have_selector(".tree-commit .animation-container")
- end
-
- it "does not show the permalink link" do
- click_link(".gitignore")
-
- expect(page).not_to have_link("permalink")
- end
- end
-
- context "when browsing a file content", :js do
- before do
- visit(tree_path_root_ref)
- wait_for_requests
-
- click_link(".gitignore")
- end
-
- it "shows a file content" do
- expect(page).to have_content("*.rbc")
- end
-
- it "is possible to blame" do
- click_link("Blame")
-
- expect(page).to have_content("*.rb")
- .and have_content("Dmitriy Zaporozhets")
- .and have_content("Initial commit")
- .and have_content("Ignore DS files")
-
- previous_commit_anchor = "//a[@title='Ignore DS files']/parent::span/following-sibling::span/a"
- find(:xpath, previous_commit_anchor).click
-
- expect(page).to have_content("*.rb")
- .and have_content("Dmitriy Zaporozhets")
- .and have_content("Initial commit")
-
- expect(page).not_to have_content("Ignore DS files")
- end
- end
-
- context "when browsing a file with pathspec characters" do
- let(:filename) { ':wq' }
- let(:newrev) { project.repository.commit('master').sha }
-
- before do
- create_file_in_repo(project, 'master', 'master', filename, 'Test file')
- path = File.join('master', filename)
-
- visit(project_blob_path(project, path))
- wait_for_requests
- end
-
- it "shows raw file content in a new tab" do
- new_tab = window_opened_by {click_link 'Open raw'}
-
- within_window new_tab do
- expect(page).to have_content("Test file")
- end
- end
- end
-
- context "when browsing a raw file" do
- before do
- visit(tree_path_root_ref)
- wait_for_requests
-
- click_link(".gitignore")
- wait_for_requests
- end
-
- it "shows raw file content in a new tab" do
- new_tab = window_opened_by {click_link 'Open raw'}
-
- within_window new_tab do
- expect(page).to have_content("*.rbc")
- end
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_lfs_files_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_lfs_files_spec.rb
deleted file mode 100644
index 2d9b6b3a903..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_lfs_files_spec.rb
+++ /dev/null
@@ -1,86 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Projects > Files > User browses LFS files' do
- let(:project) { create(:project, :repository) }
- let(:user) { project.first_owner }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- sign_in(user)
- end
-
- context 'when LFS is disabled', :js do
- before do
- allow_next_found_instance_of(Project) do |project|
- allow(project).to receive(:lfs_enabled?).and_return(false)
- end
-
- visit project_tree_path(project, 'lfs')
- wait_for_requests
- end
-
- it 'is possible to see raw content of LFS pointer' do
- click_link 'files'
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('files')
- end
-
- click_link 'lfs'
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('lfs')
- end
-
- click_link 'lfs_object.iso'
-
- expect(page).to have_content 'version https://git-lfs.github.com/spec/v1'
- expect(page).to have_content 'oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897'
- expect(page).to have_content 'size 1575078'
- expect(page).not_to have_content 'Download (1.5 MB)'
- end
- end
-
- context 'when LFS is enabled', :js do
- before do
- allow_next_found_instance_of(Project) do |project|
- allow(project).to receive(:lfs_enabled?).and_return(true)
- end
-
- visit project_tree_path(project, 'lfs')
- wait_for_requests
- end
-
- it 'shows an LFS object' do
- click_link('files')
-
- page.within('.repo-breadcrumb') do
- expect(page).to have_link('files')
- end
-
- click_link('lfs')
- click_link('lfs_object.iso')
-
- expect(page).to have_content('Download (1.5 MB)')
- expect(page).not_to have_content('version https://git-lfs.github.com/spec/v1')
- expect(page).not_to have_content('oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897')
- expect(page).not_to have_content('size 1575078')
-
- page.within('.content') do
- expect(page).to have_content('Delete')
- expect(page).to have_content('History')
- expect(page).to have_content('Permalink')
- expect(page).to have_content('Replace')
- expect(page).to have_link('Download')
-
- expect(page).not_to have_content('Annotate')
- expect(page).not_to have_content('Blame')
-
- expect(page).not_to have_selector(:link_or_button, text: /^Edit$/)
- expect(page).to have_selector(:link_or_button, 'Open in Web IDE')
- end
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/files/user_deletes_files_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/files/user_deletes_files_spec.rb
deleted file mode 100644
index d503c9b1192..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/files/user_deletes_files_spec.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Projects > Files > User deletes files', :js do
- let(:fork_message) do
- "You're not allowed to make changes to this project directly. "\
- "A fork of this project has been created that you can make changes in, so you can submit a merge request."
- end
-
- let(:project) { create(:project, :repository, name: 'Shop') }
- let(:project2) { create(:project, :repository, name: 'Another Project', path: 'another-project') }
- let(:project_tree_path_root_ref) { project_tree_path(project, project.repository.root_ref) }
- let(:project2_tree_path_root_ref) { project_tree_path(project2, project2.repository.root_ref) }
- let(:user) { create(:user) }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- sign_in(user)
- end
-
- context 'when an user has write access' do
- before do
- project.add_maintainer(user)
- visit(project_tree_path_root_ref)
- wait_for_requests
- end
-
- it 'deletes the file', :js do
- click_link('.gitignore')
-
- expect(page).to have_content('.gitignore')
-
- click_on('Delete')
- fill_in(:commit_message, with: 'New commit message', visible: true)
- click_button('Delete file')
-
- expect(page).to have_current_path(project_tree_path(project, 'master/'), ignore_query: true)
- expect(page).not_to have_content('.gitignore')
- end
- end
-
- context 'when an user does not have write access', :js do
- before do
- project2.add_reporter(user)
- visit(project2_tree_path_root_ref)
- wait_for_requests
- end
-
- it 'deletes the file in a forked project', :js, :sidekiq_might_not_need_inline do
- click_link('.gitignore')
-
- expect(page).to have_content('.gitignore')
-
- click_on('Delete')
-
- expect(page).to have_link('Fork')
- expect(page).to have_button('Cancel')
-
- click_link('Fork')
-
- expect(page).to have_content(fork_message)
-
- click_on('Delete')
- fill_in(:commit_message, with: 'New commit message', visible: true)
- click_button('Delete file')
-
- fork = user.fork_of(project2.reload)
-
- expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true)
- expect(page).to have_content('New commit message')
- end
- end
-end
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/files/user_edits_files_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/files/user_edits_files_spec.rb
deleted file mode 100644
index 7a70d67d8ca..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/files/user_edits_files_spec.rb
+++ /dev/null
@@ -1,226 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Projects > Files > User edits files', :js do
- include ProjectForksHelper
- include BlobSpecHelpers
-
- let(:project) { create(:project, :repository, name: 'Shop') }
- let(:project2) { create(:project, :repository, name: 'Another Project', path: 'another-project') }
- let(:project_tree_path_root_ref) { project_tree_path(project, project.repository.root_ref) }
- let(:project2_tree_path_root_ref) { project_tree_path(project2, project2.repository.root_ref) }
- let(:user) { create(:user) }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- sign_in(user)
- end
-
- after do
- unset_default_button
- end
-
- shared_examples 'unavailable for an archived project' do
- it 'does not show the edit link for an archived project', :js do
- project.update!(archived: true)
- visit project_tree_path(project, project.repository.root_ref)
-
- click_link('.gitignore')
-
- aggregate_failures 'available edit buttons' do
- expect(page).not_to have_text('Edit')
- expect(page).not_to have_text('Web IDE')
-
- expect(page).not_to have_text('Replace')
- expect(page).not_to have_text('Delete')
- end
- end
- end
-
- context 'when an user has write access', :js do
- before do
- project.add_maintainer(user)
- visit(project_tree_path_root_ref)
- wait_for_requests
- end
-
- it 'inserts a content of a file' do
- set_default_button('edit')
- click_link('.gitignore')
- click_link_or_button('Edit')
- find('.file-editor', match: :first)
-
- find('#editor')
- set_editor_value('*.rbca')
-
- expect(editor_value).to eq('*.rbca')
- end
-
- it 'does not show the edit link if a file is binary' do
- binary_file = File.join(project.repository.root_ref, 'files/images/logo-black.png')
- visit(project_blob_path(project, binary_file))
- wait_for_requests
-
- page.within '.content' do
- expect(page).not_to have_link('edit')
- end
- end
-
- it 'commits an edited file' do
- set_default_button('edit')
- click_link('.gitignore')
- click_link_or_button('Edit')
- find('.file-editor', match: :first)
-
- find('#editor')
- set_editor_value('*.rbca')
- fill_in(:commit_message, with: 'New commit message', visible: true)
- click_button('Commit changes')
-
- expect(page).to have_current_path(project_blob_path(project, 'master/.gitignore'), ignore_query: true)
-
- wait_for_requests
-
- expect(page).to have_content('*.rbca')
- end
-
- it 'commits an edited file to a new branch' do
- set_default_button('edit')
- click_link('.gitignore')
- click_link_or_button('Edit')
-
- find('.file-editor', match: :first)
-
- find('#editor')
- set_editor_value('*.rbca')
- fill_in(:commit_message, with: 'New commit message', visible: true)
- fill_in(:branch_name, with: 'new_branch_name', visible: true)
- click_button('Commit changes')
-
- expect(page).to have_current_path(project_new_merge_request_path(project), ignore_query: true)
-
- click_link('Changes')
-
- expect(page).to have_content('*.rbca')
- end
-
- it 'shows the diff of an edited file' do
- set_default_button('edit')
- click_link('.gitignore')
- click_link_or_button('Edit')
- find('.file-editor', match: :first)
-
- find('#editor')
- set_editor_value('*.rbca')
- click_link('Preview changes')
-
- expect(page).to have_css('.line_holder.new')
- end
-
- it_behaves_like 'unavailable for an archived project'
- end
-
- context 'when an user does not have write access', :js do
- before do
- project2.add_reporter(user)
- visit(project2_tree_path_root_ref)
- wait_for_requests
- end
-
- def expect_fork_prompt
- expect(page).to have_selector(:link_or_button, 'Fork')
- expect(page).to have_selector(:link_or_button, 'Cancel')
- expect(page).to have_content(
- "You can’t edit files directly in this project. "\
- "Fork this project and submit a merge request with your changes."
- )
- end
-
- def expect_fork_status
- expect(page).to have_content(
- "You're not allowed to make changes to this project directly. "\
- "A fork of this project has been created that you can make changes in, so you can submit a merge request."
- )
- end
-
- it 'inserts a content of a file in a forked project', :sidekiq_might_not_need_inline do
- set_default_button('edit')
- click_link('.gitignore')
- click_link_or_button('Edit')
-
- expect_fork_prompt
-
- click_link_or_button('Fork project')
-
- expect_fork_status
-
- find('.file-editor', match: :first)
-
- find('#editor')
- set_editor_value('*.rbca')
-
- expect(editor_value).to eq('*.rbca')
- end
-
- it 'commits an edited file in a forked project', :sidekiq_might_not_need_inline do
- set_default_button('edit')
- click_link('.gitignore')
- click_link_or_button('Edit')
-
- expect_fork_prompt
- click_link_or_button('Fork project')
-
- find('.file-editor', match: :first)
-
- find('#editor')
- set_editor_value('*.rbca')
- fill_in(:commit_message, with: 'New commit message', visible: true)
- click_button('Commit changes')
-
- fork = user.fork_of(project2.reload)
-
- expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true)
-
- wait_for_requests
-
- expect(page).to have_content('New commit message')
- end
-
- context 'when the user already had a fork of the project', :js do
- let!(:forked_project) { fork_project(project2, user, namespace: user.namespace, repository: true) }
-
- before do
- visit(project2_tree_path_root_ref)
- wait_for_requests
- end
-
- it 'links to the forked project for editing', :sidekiq_might_not_need_inline do
- set_default_button('edit')
- click_link('.gitignore')
- click_link_or_button('Edit')
-
- expect(page).not_to have_link('Fork project')
-
- find('#editor')
- set_editor_value('*.rbca')
- fill_in(:commit_message, with: 'Another commit', visible: true)
- click_button('Commit changes')
-
- fork = user.fork_of(project2)
-
- expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true)
-
- wait_for_requests
-
- expect(page).to have_content('Another commit')
- expect(page).to have_content("From #{forked_project.full_path}")
- expect(page).to have_content("into #{project2.full_path}")
- end
-
- it_behaves_like 'unavailable for an archived project' do
- let(:project) { project2 }
- end
- end
- end
-end
diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb
index 7350a54e8df..1523586ab26 100644
--- a/spec/features/search/user_uses_header_search_field_spec.rb
+++ b/spec/features/search/user_uses_header_search_field_spec.rb
@@ -153,6 +153,7 @@ RSpec.describe 'User uses header search field', :js do
it 'displays search options' do
fill_in_search('test')
+
expect(page).to have_selector(scoped_search_link('test', search_code: true))
expect(page).to have_selector(scoped_search_link('test', group_id: group.id, search_code: true))
expect(page).to have_selector(scoped_search_link('test', project_id: project.id, group_id: group.id, search_code: true))
@@ -167,6 +168,7 @@ RSpec.describe 'User uses header search field', :js do
it 'displays search options' do
fill_in_search('test')
+ sleep 0.5
expect(page).to have_selector(scoped_search_link('test', search_code: true, repository_ref: 'master'))
expect(page).not_to have_selector(scoped_search_link('test', search_code: true, group_id: project.namespace_id, repository_ref: 'master'))
expect(page).to have_selector(scoped_search_link('test', search_code: true, project_id: project.id, repository_ref: 'master'))
@@ -184,7 +186,7 @@ RSpec.describe 'User uses header search field', :js do
fill_in_search('Feature')
within(dashboard_search_options_popup_menu) do
- expect(page).to have_text('"Feature" in all GitLab')
+ expect(page).to have_text('Feature in all GitLab')
expect(page).to have_no_text('Feature Flags')
end
end
diff --git a/spec/features/tags/developer_updates_tag_spec.rb b/spec/features/tags/developer_updates_tag_spec.rb
index b2fc28b8493..531ed91c057 100644
--- a/spec/features/tags/developer_updates_tag_spec.rb
+++ b/spec/features/tags/developer_updates_tag_spec.rb
@@ -2,6 +2,7 @@
require 'spec_helper'
+# TODO: remove this file together with FF https://gitlab.com/gitlab-org/gitlab/-/issues/366244
RSpec.describe 'Developer updates tag' do
let(:user) { create(:user) }
let(:group) { create(:group) }
@@ -10,6 +11,7 @@ RSpec.describe 'Developer updates tag' do
before do
project.add_developer(user)
sign_in(user)
+ stub_feature_flags(edit_tag_release_notes_via_release_page: false)
visit project_tags_path(project)
end
diff --git a/spec/features/unsubscribe_links_spec.rb b/spec/features/unsubscribe_links_spec.rb
index 3fe276ce162..5317f586390 100644
--- a/spec/features/unsubscribe_links_spec.rb
+++ b/spec/features/unsubscribe_links_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe 'Unsubscribe links', :sidekiq_might_not_need_inline do
let(:mail) { ActionMailer::Base.deliveries.last }
let(:body) { Capybara::Node::Simple.new(mail.default_part_body.to_s) }
let(:header_link) { mail.header['List-Unsubscribe'].to_s[1..-2] } # Strip angle brackets
- let(:body_link) { body.find_link('unsubscribe')['href'] }
+ let(:body_link) { body.find_link('Unsubscribe')['href'] }
before do
perform_enqueued_jobs { issue }
diff --git a/spec/features/users/email_verification_on_login_spec.rb b/spec/features/users/email_verification_on_login_spec.rb
new file mode 100644
index 00000000000..0833f7f6f8e
--- /dev/null
+++ b/spec/features/users/email_verification_on_login_spec.rb
@@ -0,0 +1,357 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Email Verification On Login', :clean_gitlab_redis_rate_limiting do
+ include EmailHelpers
+
+ let_it_be(:user) { create(:user) }
+
+ let(:require_email_verification_enabled) { user }
+
+ before do
+ stub_feature_flags(require_email_verification: require_email_verification_enabled)
+ end
+
+ shared_examples 'email verification required' do
+ before do
+ allow(Gitlab::AppLogger).to receive(:info)
+ end
+
+ it 'requires email verification before being able to access GitLab' do
+ perform_enqueued_jobs do
+ # When logging in
+ gitlab_sign_in(user)
+ expect_log_message(message: "Account Locked: username=#{user.username}")
+ expect_log_message('Instructions Sent')
+
+ # Expect the user to be locked and the unlock_token to be set
+ user.reload
+ expect(user.locked_at).not_to be_nil
+ expect(user.unlock_token).not_to be_nil
+
+ # Expect to see the verification form on the login page
+ expect(page).to have_current_path(new_user_session_path)
+ expect(page).to have_content('Help us protect your account')
+
+ # Expect an instructions email to be sent with a code
+ code = expect_instructions_email_and_extract_code
+
+ # Signing in again prompts for the code and doesn't send a new one
+ gitlab_sign_in(user)
+ expect(page).to have_current_path(new_user_session_path)
+ expect(page).to have_content('Help us protect your account')
+
+ # Verify the code
+ verify_code(code)
+ expect_log_message('Successful')
+ expect_log_message(message: "Successful Login: username=#{user.username} "\
+ "ip=127.0.0.1 method=standard admin=false")
+
+ # Expect the user to be unlocked
+ expect_user_to_be_unlocked
+
+ # Expect a confirmation page with a meta refresh tag for 3 seconds to the root
+ expect(page).to have_current_path(users_successful_verification_path)
+ expect(page).to have_content('Verification successful')
+ expect(page).to have_selector("meta[http-equiv='refresh'][content='3; url=#{root_path}']", visible: false)
+ end
+ end
+
+ describe 'resending a new code' do
+ it 'resends a new code' do
+ perform_enqueued_jobs do
+ # When logging in
+ gitlab_sign_in(user)
+
+ # Expect an instructions email to be sent with a code
+ code = expect_instructions_email_and_extract_code
+
+ # Request a new code
+ click_link 'Resend code'
+ expect_log_message('Instructions Sent', 2)
+ new_code = expect_instructions_email_and_extract_code
+
+ # Verify the old code is different from the new code
+ expect(code).not_to eq(new_code)
+ end
+ end
+
+ it 'rate limits resends' do
+ # When logging in
+ gitlab_sign_in(user)
+
+ # It shows a resend button
+ expect(page).to have_link 'Resend code'
+
+ # Resend more than the rate limited amount of times
+ 10.times do
+ click_link 'Resend code'
+ end
+
+ # Expect the link to be gone
+ expect(page).not_to have_link 'Resend code'
+
+ # Wait for 1 hour
+ travel 1.hour
+
+ # Now it's visible again
+ gitlab_sign_in(user)
+ expect(page).to have_link 'Resend code'
+ end
+ end
+
+ describe 'verification errors' do
+ it 'rate limits verifications' do
+ perform_enqueued_jobs do
+ # When logging in
+ gitlab_sign_in(user)
+
+ # Expect an instructions email to be sent with a code
+ code = expect_instructions_email_and_extract_code
+
+ # Verify an invalid token more than the rate limited amount of times
+ 11.times do
+ verify_code('123456')
+ end
+
+ # Expect an error message
+ expect_log_message('Failed Attempt', reason: 'rate_limited')
+ expect(page).to have_content("You've reached the maximum amount of tries. "\
+ 'Wait 10 minutes or resend a new code and try again.')
+
+ # Wait for 10 minutes
+ travel 10.minutes
+
+ # Now it works again
+ verify_code(code)
+ expect_log_message('Successful')
+ end
+ end
+
+ it 'verifies invalid codes' do
+ # When logging in
+ gitlab_sign_in(user)
+
+ # Verify an invalid code
+ verify_code('123456')
+
+ # Expect an error message
+ expect_log_message('Failed Attempt', reason: 'invalid')
+ expect(page).to have_content('The code is incorrect. Enter it again, or resend a new code.')
+ end
+
+ it 'verifies expired codes' do
+ perform_enqueued_jobs do
+ # When logging in
+ gitlab_sign_in(user)
+
+ # Expect an instructions email to be sent with a code
+ code = expect_instructions_email_and_extract_code
+
+ # Wait for the code to expire before verifying
+ travel VerifiesWithEmail::TOKEN_VALID_FOR_MINUTES.minutes + 1.second
+ verify_code(code)
+
+ # Expect an error message
+ expect_log_message('Failed Attempt', reason: 'expired')
+ expect(page).to have_content('The code has expired. Resend a new code and try again.')
+ end
+ end
+ end
+ end
+
+ shared_examples 'no email verification required' do |**login_args|
+ it 'does not lock the user and redirects to the root page after logging in' do
+ gitlab_sign_in(user, **login_args)
+
+ expect_user_to_be_unlocked
+
+ expect(page).to have_current_path(root_path)
+ end
+ end
+
+ shared_examples 'no email verification required when 2fa enabled or ff disabled' do
+ context 'when 2FA is enabled' do
+ let_it_be(:user) { create(:user, :two_factor) }
+
+ it_behaves_like 'no email verification required', two_factor_auth: true
+ end
+
+ context 'when the feature flag is disabled' do
+ let(:require_email_verification_enabled) { false }
+
+ it_behaves_like 'no email verification required'
+ end
+ end
+
+ describe 'when failing to login the maximum allowed number of times' do
+ before do
+ # See comment in RequireEmailVerification::MAXIMUM_ATTEMPTS on why this is divided by 2
+ (RequireEmailVerification::MAXIMUM_ATTEMPTS / 2).times do
+ gitlab_sign_in(user, password: 'wrong_password')
+ end
+ end
+
+ it 'locks the user, but does not set the unlock token', :aggregate_failures do
+ user.reload
+ expect(user.locked_at).not_to be_nil
+ expect(user.unlock_token).to be_nil # The unlock token is only set after logging in with valid credentials
+ expect(user.failed_attempts).to eq(RequireEmailVerification::MAXIMUM_ATTEMPTS)
+ end
+
+ it_behaves_like 'email verification required'
+ it_behaves_like 'no email verification required when 2fa enabled or ff disabled'
+
+ describe 'when waiting for the auto unlock time' do
+ before do
+ travel User::UNLOCK_IN + 1.second
+ end
+
+ it_behaves_like 'no email verification required'
+ end
+ end
+
+ describe 'when no previous authentication event exists' do
+ it_behaves_like 'no email verification required'
+ end
+
+ describe 'when a previous authentication event exists for another ip address' do
+ before do
+ create(:authentication_event, :successful, user: user, ip_address: '1.2.3.4')
+ end
+
+ it_behaves_like 'email verification required'
+ it_behaves_like 'no email verification required when 2fa enabled or ff disabled'
+ end
+
+ describe 'when a previous authentication event exists for the same ip address' do
+ before do
+ create(:authentication_event, :successful, user: user)
+ end
+
+ it_behaves_like 'no email verification required'
+ end
+
+ describe 'rate limiting password guessing' do
+ before do
+ 5.times { gitlab_sign_in(user, password: 'wrong_password') }
+ gitlab_sign_in(user)
+ end
+
+ it 'shows an error message on on the login page' do
+ expect(page).to have_current_path(new_user_session_path)
+ expect(page).to have_content('Maximum login attempts exceeded. Wait 10 minutes and try again.')
+ end
+ end
+
+ describe 'inconsistent states' do
+ context 'when the feature flag is toggled off after being prompted for a verification token' do
+ before do
+ create(:authentication_event, :successful, user: user, ip_address: '1.2.3.4')
+ end
+
+ it 'still accepts the token' do
+ perform_enqueued_jobs do
+ # The user is prompted for a verification code
+ gitlab_sign_in(user)
+ expect(page).to have_content('Help us protect your account')
+ code = expect_instructions_email_and_extract_code
+
+ # We toggle the feature flag off
+ stub_feature_flags(require_email_verification: false)
+
+ # Resending and veryfying the code work as expected
+ click_link 'Resend code'
+ new_code = expect_instructions_email_and_extract_code
+
+ verify_code(code)
+ expect(page).to have_content('The code is incorrect. Enter it again, or resend a new code.')
+
+ travel VerifiesWithEmail::TOKEN_VALID_FOR_MINUTES.minutes + 1.second
+
+ verify_code(new_code)
+ expect(page).to have_content('The code has expired. Resend a new code and try again.')
+
+ click_link 'Resend code'
+ another_code = expect_instructions_email_and_extract_code
+
+ verify_code(another_code)
+ expect_user_to_be_unlocked
+ expect(page).to have_current_path(users_successful_verification_path)
+ end
+ end
+ end
+
+ context 'when the feature flag is toggled on after Devise sent unlock instructions' do
+ let(:require_email_verification_enabled) { false }
+
+ before do
+ perform_enqueued_jobs do
+ (User.maximum_attempts / 2).times do
+ gitlab_sign_in(user, password: 'wrong_password')
+ end
+ end
+ end
+
+ it 'the unlock link still works' do
+ # The user is locked and unlock instructions are sent
+ expect(page).to have_content('Invalid login or password.')
+ user.reload
+ expect(user.locked_at).not_to be_nil
+ expect(user.unlock_token).not_to be_nil
+ mail = find_email_for(user)
+
+ expect(mail.to).to match_array([user.email])
+ expect(mail.subject).to eq('Unlock instructions')
+ unlock_url = mail.body.parts.first.to_s[/http.*/]
+
+ # We toggle the feature flag on
+ stub_feature_flags(require_email_verification: true)
+
+ # Unlocking works as expected
+ visit unlock_url
+ expect_user_to_be_unlocked
+ expect(page).to have_current_path(new_user_session_path)
+ expect(page).to have_content('Your account has been unlocked successfully')
+
+ gitlab_sign_in(user)
+ expect(page).to have_current_path(root_path)
+ end
+ end
+ end
+
+ def expect_user_to_be_unlocked
+ user.reload
+
+ aggregate_failures do
+ expect(user.locked_at).to be_nil
+ expect(user.unlock_token).to be_nil
+ expect(user.failed_attempts).to eq(0)
+ end
+ end
+
+ def expect_instructions_email_and_extract_code
+ mail = find_email_for(user)
+ expect(mail.to).to match_array([user.email])
+ expect(mail.subject).to eq('Verify your identity')
+ code = mail.body.parts.first.to_s[/\d{#{VerifiesWithEmail::TOKEN_LENGTH}}/]
+ reset_delivered_emails!
+ code
+ end
+
+ def verify_code(code)
+ fill_in 'Verification code', with: code
+ click_button 'Verify code'
+ end
+
+ def expect_log_message(event = nil, times = 1, reason: '', message: nil)
+ expect(Gitlab::AppLogger).to have_received(:info)
+ .exactly(times).times
+ .with(message || hash_including(message: 'Email Verification',
+ event: event,
+ username: user.username,
+ ip: '127.0.0.1',
+ reason: reason))
+ end
+end
diff --git a/spec/features/users/google_analytics_csp_spec.rb b/spec/features/users/google_analytics_csp_spec.rb
new file mode 100644
index 00000000000..46a9b3be22f
--- /dev/null
+++ b/spec/features/users/google_analytics_csp_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Google Analytics 4 content security policy' do
+ it 'includes the GA4 content security policy headers' do
+ visit root_path
+
+ expect(response_headers['Content-Security-Policy']).to include(
+ '*.googletagmanager.com',
+ '*.google-analytics.com',
+ '*.analytics.google.com'
+ )
+ end
+end
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index efb7c98d63a..3ba3650b608 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -579,9 +579,9 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions do
context 'group setting' do
before do
group1 = create :group, name: 'Group 1', require_two_factor_authentication: true
- group1.add_user(user, GroupMember::DEVELOPER)
+ group1.add_member(user, GroupMember::DEVELOPER)
group2 = create :group, name: 'Group 2', require_two_factor_authentication: true
- group2.add_user(user, GroupMember::DEVELOPER)
+ group2.add_member(user, GroupMember::DEVELOPER)
end
context 'with grace period defined' do
diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb
index cb395846b96..2a444dad486 100644
--- a/spec/features/users/show_spec.rb
+++ b/spec/features/users/show_spec.rb
@@ -9,6 +9,12 @@ RSpec.describe 'User page' do
subject(:visit_profile) { visit(user_path(user)) }
+ it 'shows user id' do
+ subject
+
+ expect(page).to have_content("User ID: #{user.id}")
+ end
+
context 'with public profile' do
it 'shows all the tabs' do
subject
diff --git a/spec/finders/autocomplete/users_finder_spec.rb b/spec/finders/autocomplete/users_finder_spec.rb
index 9b3421d1b4f..de031041e18 100644
--- a/spec/finders/autocomplete/users_finder_spec.rb
+++ b/spec/finders/autocomplete/users_finder_spec.rb
@@ -62,7 +62,7 @@ RSpec.describe Autocomplete::UsersFinder do
let_it_be(:group) { create(:group, :public) }
before_all do
- group.add_users([user1], GroupMember::DEVELOPER)
+ group.add_members([user1], GroupMember::DEVELOPER)
end
it { is_expected.to match_array([user1]) }
diff --git a/spec/finders/branches_finder_spec.rb b/spec/finders/branches_finder_spec.rb
index 11b7ab08fb2..9314f616c44 100644
--- a/spec/finders/branches_finder_spec.rb
+++ b/spec/finders/branches_finder_spec.rb
@@ -181,17 +181,17 @@ RSpec.describe BranchesFinder do
it 'filters branches' do
result = subject
- expect(result.map(&:name)).to eq(%w(feature_conflict fix))
+ expect(result.map(&:name)).to eq(%w(feature_conflict few-commits))
end
end
context 'by next page_token and per_page' do
- let(:params) { { page_token: 'fix', per_page: 2 } }
+ let(:params) { { page_token: 'few-commits', per_page: 2 } }
it 'filters branches' do
result = subject
- expect(result.map(&:name)).to eq(%w(flatten-dir gitattributes))
+ expect(result.map(&:name)).to eq(%w(fix flatten-dir))
end
end
@@ -254,7 +254,7 @@ RSpec.describe BranchesFinder do
it 'falls back to default execute and ignore paginations' do
result = subject
- expect(result.map(&:name)).to eq(%w(feature feature_conflict fix flatten-dir))
+ expect(result.map(&:name)).to eq(%w(feature feature_conflict few-commits fix flatten-dir))
end
end
end
diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb
index e7ec4f01995..aeab5a51766 100644
--- a/spec/finders/ci/runners_finder_spec.rb
+++ b/spec/finders/ci/runners_finder_spec.rb
@@ -49,6 +49,67 @@ RSpec.describe Ci::RunnersFinder do
end
end
+ context 'by upgrade status' do
+ let(:upgrade_status) {}
+
+ let_it_be(:runner1) { create(:ci_runner, version: 'a') }
+ let_it_be(:runner2) { create(:ci_runner, version: 'b') }
+ let_it_be(:runner3) { create(:ci_runner, version: 'c') }
+ let_it_be(:runner_version_recommended) do
+ create(:ci_runner_version, version: 'a', status: :recommended)
+ end
+
+ let_it_be(:runner_version_not_available) do
+ create(:ci_runner_version, version: 'b', status: :not_available)
+ end
+
+ let_it_be(:runner_version_available) do
+ create(:ci_runner_version, version: 'c', status: :available)
+ end
+
+ def execute
+ described_class.new(current_user: admin, params: { upgrade_status: upgrade_status }).execute
+ end
+
+ Ci::RunnerVersion.statuses.keys.map(&:to_sym).each do |status|
+ context "set to :#{status}" do
+ let(:upgrade_status) { status }
+
+ it "calls with_upgrade_status scope with corresponding :#{status} status" do
+ if [:available, :not_available, :recommended].include?(status)
+ expected_result = Ci::Runner.with_upgrade_status(status)
+ end
+
+ expect(Ci::Runner).to receive(:with_upgrade_status).with(status).and_call_original
+
+ result = execute
+
+ expect(result).to match_array(expected_result) if expected_result
+ end
+ end
+ end
+
+ context 'set to an invalid value' do
+ let(:upgrade_status) { :some_invalid_status }
+
+ it 'does not call with_upgrade_status' do
+ expect(Ci::Runner).not_to receive(:with_upgrade_status)
+
+ expect(execute).to match_array(Ci::Runner.all)
+ end
+ end
+
+ context 'set to nil' do
+ let(:upgrade_status) { nil }
+
+ it 'does not call with_upgrade_status' do
+ expect(Ci::Runner).not_to receive(:with_upgrade_status)
+
+ expect(execute).to match_array(Ci::Runner.all)
+ end
+ end
+ end
+
context 'by status' do
Ci::Runner::AVAILABLE_STATUSES.each do |status|
it "calls the corresponding :#{status} scope on Ci::Runner" do
diff --git a/spec/finders/contributed_projects_finder_spec.rb b/spec/finders/contributed_projects_finder_spec.rb
index 86d3e7f8f19..e8ce02122a1 100644
--- a/spec/finders/contributed_projects_finder_spec.rb
+++ b/spec/finders/contributed_projects_finder_spec.rb
@@ -23,9 +23,15 @@ RSpec.describe ContributedProjectsFinder do
end
describe 'activity without a current user' do
- subject { finder.execute }
+ it 'does only return public projects' do
+ projects = finder.execute
+ expect(projects).to match_array([public_project])
+ end
- it { is_expected.to match_array([public_project]) }
+ it 'does return all projects when visibility gets ignored' do
+ projects = finder.execute(ignore_visibility: true)
+ expect(projects).to match_array([private_project, internal_project, public_project])
+ end
end
describe 'activity with a current user' do
diff --git a/spec/finders/groups/user_groups_finder_spec.rb b/spec/finders/groups/user_groups_finder_spec.rb
index a4a9b8d16d0..9339741da79 100644
--- a/spec/finders/groups/user_groups_finder_spec.rb
+++ b/spec/finders/groups/user_groups_finder_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe Groups::UserGroupsFinder do
let_it_be(:private_maintainer_group) { create(:group, :private, name: 'b private maintainer', path: 'b-private-maintainer') }
let_it_be(:public_developer_group) { create(:group, project_creation_level: nil, name: 'c public developer', path: 'c-public-developer') }
let_it_be(:public_maintainer_group) { create(:group, name: 'a public maintainer', path: 'a-public-maintainer') }
+ let_it_be(:public_owner_group) { create(:group, name: 'a public owner', path: 'a-public-owner') }
subject { described_class.new(current_user, target_user, arguments).execute }
@@ -21,12 +22,14 @@ RSpec.describe Groups::UserGroupsFinder do
private_maintainer_group.add_maintainer(user)
public_developer_group.add_developer(user)
public_maintainer_group.add_maintainer(user)
+ public_owner_group.add_owner(user)
end
it 'returns all groups where the user is a direct member' do
is_expected.to match(
[
public_maintainer_group,
+ public_owner_group,
private_maintainer_group,
public_developer_group,
guest_group
@@ -53,6 +56,7 @@ RSpec.describe Groups::UserGroupsFinder do
is_expected.to match(
[
public_maintainer_group,
+ public_owner_group,
private_maintainer_group,
public_developer_group
]
@@ -73,6 +77,32 @@ RSpec.describe Groups::UserGroupsFinder do
end
end
+ context 'when permission is :transfer_projects' do
+ let(:arguments) { { permission_scope: :transfer_projects } }
+
+ specify do
+ is_expected.to match(
+ [
+ public_maintainer_group,
+ public_owner_group,
+ private_maintainer_group
+ ]
+ )
+ end
+
+ context 'when search is provided' do
+ let(:arguments) { { permission_scope: :transfer_projects, search: 'owner' } }
+
+ specify do
+ is_expected.to match(
+ [
+ public_owner_group
+ ]
+ )
+ end
+ end
+ end
+
context 'when search is provided' do
let(:arguments) { { search: 'maintainer' } }
diff --git a/spec/finders/joined_groups_finder_spec.rb b/spec/finders/joined_groups_finder_spec.rb
index 058db735708..feb1b11d159 100644
--- a/spec/finders/joined_groups_finder_spec.rb
+++ b/spec/finders/joined_groups_finder_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe JoinedGroupsFinder do
context 'if profile visitor is in one of the private group projects' do
before do
project = create(:project, :private, group: private_group, name: 'B', path: 'B')
- project.add_user(profile_visitor, Gitlab::Access::DEVELOPER)
+ project.add_member(profile_visitor, Gitlab::Access::DEVELOPER)
end
it 'shows group' do
diff --git a/spec/finders/packages/conan/package_finder_spec.rb b/spec/finders/packages/conan/package_finder_spec.rb
index 6848786818b..f25a62225a8 100644
--- a/spec/finders/packages/conan/package_finder_spec.rb
+++ b/spec/finders/packages/conan/package_finder_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe ::Packages::Conan::PackageFinder do
before do
project.update_column(:visibility_level, Gitlab::VisibilityLevel.string_options[visibility.to_s])
- project.add_user(user, role) unless role == :anonymous
+ project.add_member(user, role) unless role == :anonymous
end
it { is_expected.to eq(expected_packages) }
diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb
index 954db6481cd..90a8cd3c57f 100644
--- a/spec/finders/packages/group_packages_finder_spec.rb
+++ b/spec/finders/packages/group_packages_finder_spec.rb
@@ -98,8 +98,8 @@ RSpec.describe Packages::GroupPackagesFinder do
)
unless role == :anonymous
- project.add_user(user, role)
- subproject.add_user(user, role)
+ project.add_member(user, role)
+ subproject.add_member(user, role)
end
end
diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb
index d26180bbf94..3bef4d85b33 100644
--- a/spec/finders/projects_finder_spec.rb
+++ b/spec/finders/projects_finder_spec.rb
@@ -177,6 +177,35 @@ RSpec.describe ProjectsFinder do
end
end
+ describe 'filter by topic_id' do
+ let_it_be(:topic1) { create(:topic) }
+ let_it_be(:topic2) { create(:topic) }
+
+ before do
+ public_project.reload
+ public_project.topics << topic1
+ public_project.save!
+ end
+
+ context 'topic with assigned projects' do
+ let(:params) { { topic_id: topic1.id } }
+
+ it { is_expected.to eq([public_project]) }
+ end
+
+ context 'topic without assigned projects' do
+ let(:params) { { topic_id: topic2.id } }
+
+ it { is_expected.to eq([]) }
+ end
+
+ context 'non-existing topic' do
+ let(:params) { { topic_id: non_existing_record_id } }
+
+ it { is_expected.to eq([]) }
+ end
+ end
+
describe 'filter by personal' do
let!(:personal_project) { create(:project, namespace: user.namespace) }
let(:params) { { personal: true } }
diff --git a/spec/finders/user_recent_events_finder_spec.rb b/spec/finders/user_recent_events_finder_spec.rb
index d7f7bb9cebe..dbd52ec4d18 100644
--- a/spec/finders/user_recent_events_finder_spec.rb
+++ b/spec/finders/user_recent_events_finder_spec.rb
@@ -18,266 +18,248 @@ RSpec.describe UserRecentEventsFinder do
subject(:finder) { described_class.new(current_user, project_owner, nil, params) }
- shared_examples 'UserRecentEventsFinder examples' do
- describe '#execute' do
- context 'when profile is public' do
- it 'returns all the events' do
- expect(finder.execute).to include(private_event, internal_event, public_event)
- end
- end
-
- context 'when profile is private' do
- it 'returns no event' do
- allow(Ability).to receive(:allowed?).and_call_original
- allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, project_owner).and_return(false)
-
- expect(finder.execute).to be_empty
- end
+ describe '#execute' do
+ context 'when profile is public' do
+ it 'returns all the events' do
+ expect(finder.execute).to include(private_event, internal_event, public_event)
end
+ end
- it 'does not include the events if the user cannot read cross project' do
+ context 'when profile is private' do
+ it 'returns no event' do
allow(Ability).to receive(:allowed?).and_call_original
- expect(Ability).to receive(:allowed?).with(current_user, :read_cross_project) { false }
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, project_owner).and_return(false)
expect(finder.execute).to be_empty
end
+ end
+
+ it 'does not include the events if the user cannot read cross project' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ expect(Ability).to receive(:allowed?).with(current_user, :read_cross_project) { false }
- 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) }
+ expect(finder.execute).to be_empty
+ end
- let_it_be(:internal_project_second_user) { create(:project, :internal, creator: second_user) }
- let_it_be(:public_project_second_user) { create(:project, :public, creator: second_user) }
- let_it_be(:private_event_second_user) { create(:event, project: private_project_second_user, author: second_user) }
- let_it_be(:internal_event_second_user) { create(:event, project: internal_project_second_user, author: second_user) }
- let_it_be(:public_event_second_user) { create(:event, project: public_project_second_user, author: second_user) }
+ 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) }
- it 'includes events from all users', :aggregate_failures do
- events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
+ let_it_be(:internal_project_second_user) { create(:project, :internal, creator: second_user) }
+ let_it_be(:public_project_second_user) { create(:project, :public, creator: second_user) }
+ let_it_be(:private_event_second_user) { create(:event, project: private_project_second_user, author: second_user) }
+ let_it_be(:internal_event_second_user) { create(:event, project: internal_project_second_user, author: second_user) }
+ let_it_be(:public_event_second_user) { create(:event, project: public_project_second_user, author: second_user) }
- expect(events).to include(private_event, internal_event, public_event)
- expect(events).to include(private_event_second_user, internal_event_second_user, public_event_second_user)
- expect(events.size).to eq(6)
- end
+ it 'includes events from all users', :aggregate_failures do
+ events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
- context 'selected events' do
- using RSpec::Parameterized::TableSyntax
-
- let_it_be(:push_event1) { create(:push_event, project: public_project, author: project_owner) }
- let_it_be(:push_event2) { create(:push_event, project: public_project_second_user, author: second_user) }
- let_it_be(:merge_event1) { create(:event, :merged, target_type: MergeRequest.to_s, project: public_project, author: project_owner) }
- let_it_be(:merge_event2) { create(:event, :merged, target_type: MergeRequest.to_s, project: public_project_second_user, author: second_user) }
- let_it_be(:comment_event1) { create(:event, :commented, target_type: Note.to_s, project: public_project, author: project_owner) }
- let_it_be(:comment_event2) { create(:event, :commented, target_type: DiffNote.to_s, project: public_project, author: project_owner) }
- let_it_be(:comment_event3) { create(:event, :commented, target_type: DiscussionNote.to_s, project: public_project_second_user, author: second_user) }
- let_it_be(:issue_event1) { create(:event, :created, project: public_project, target: issue, author: project_owner) }
- let_it_be(:issue_event2) { create(:event, :updated, project: public_project, target: issue, author: project_owner) }
- let_it_be(:issue_event3) { create(:event, :closed, project: public_project_second_user, target: issue, author: second_user) }
- let_it_be(:wiki_event1) { create(:wiki_page_event, project: public_project, author: project_owner) }
- let_it_be(:wiki_event2) { create(:wiki_page_event, project: public_project_second_user, author: second_user) }
- let_it_be(:design_event1) { create(:design_event, project: public_project, author: project_owner) }
- let_it_be(:design_event2) { create(:design_updated_event, project: public_project_second_user, author: second_user) }
-
- where(:event_filter, :ordered_expected_events) do
- EventFilter.new(EventFilter::PUSH) | lazy { [push_event1, push_event2] }
- EventFilter.new(EventFilter::MERGED) | lazy { [merge_event1, merge_event2] }
- EventFilter.new(EventFilter::COMMENTS) | lazy { [comment_event1, comment_event2, comment_event3] }
- EventFilter.new(EventFilter::TEAM) | lazy { [private_event, internal_event, public_event, private_event_second_user, internal_event_second_user, public_event_second_user] }
- EventFilter.new(EventFilter::ISSUE) | lazy { [issue_event1, issue_event2, issue_event3] }
- EventFilter.new(EventFilter::WIKI) | lazy { [wiki_event1, wiki_event2] }
- EventFilter.new(EventFilter::DESIGNS) | lazy { [design_event1, design_event2] }
- end
+ expect(events).to include(private_event, internal_event, public_event)
+ expect(events).to include(private_event_second_user, internal_event_second_user, public_event_second_user)
+ expect(events.size).to eq(6)
+ end
+
+ context 'selected events' do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:push_event1) { create(:push_event, project: public_project, author: project_owner) }
+ let_it_be(:push_event2) { create(:push_event, project: public_project_second_user, author: second_user) }
+ let_it_be(:merge_event1) { create(:event, :merged, target_type: MergeRequest.to_s, project: public_project, author: project_owner) }
+ let_it_be(:merge_event2) { create(:event, :merged, target_type: MergeRequest.to_s, project: public_project_second_user, author: second_user) }
+ let_it_be(:comment_event1) { create(:event, :commented, target_type: Note.to_s, project: public_project, author: project_owner) }
+ let_it_be(:comment_event2) { create(:event, :commented, target_type: DiffNote.to_s, project: public_project, author: project_owner) }
+ let_it_be(:comment_event3) { create(:event, :commented, target_type: DiscussionNote.to_s, project: public_project_second_user, author: second_user) }
+ let_it_be(:issue_event1) { create(:event, :created, project: public_project, target: issue, author: project_owner) }
+ let_it_be(:issue_event2) { create(:event, :updated, project: public_project, target: issue, author: project_owner) }
+ let_it_be(:issue_event3) { create(:event, :closed, project: public_project_second_user, target: issue, author: second_user) }
+ let_it_be(:wiki_event1) { create(:wiki_page_event, project: public_project, author: project_owner) }
+ let_it_be(:wiki_event2) { create(:wiki_page_event, project: public_project_second_user, author: second_user) }
+ let_it_be(:design_event1) { create(:design_event, project: public_project, author: project_owner) }
+ let_it_be(:design_event2) { create(:design_updated_event, project: public_project_second_user, author: second_user) }
+
+ where(:event_filter, :ordered_expected_events) do
+ EventFilter.new(EventFilter::PUSH) | lazy { [push_event1, push_event2] }
+ EventFilter.new(EventFilter::MERGED) | lazy { [merge_event1, merge_event2] }
+ EventFilter.new(EventFilter::COMMENTS) | lazy { [comment_event1, comment_event2, comment_event3] }
+ EventFilter.new(EventFilter::TEAM) | lazy { [private_event, internal_event, public_event, private_event_second_user, internal_event_second_user, public_event_second_user] }
+ EventFilter.new(EventFilter::ISSUE) | lazy { [issue_event1, issue_event2, issue_event3] }
+ EventFilter.new(EventFilter::WIKI) | lazy { [wiki_event1, wiki_event2] }
+ EventFilter.new(EventFilter::DESIGNS) | lazy { [design_event1, design_event2] }
+ end
- with_them do
- it 'only returns selected events from all users (id DESC)' do
- events = described_class.new(current_user, [project_owner, second_user], event_filter, params).execute
+ with_them do
+ it 'only returns selected events from all users (id DESC)' do
+ events = described_class.new(current_user, [project_owner, second_user], event_filter, params).execute
- expect(events).to eq(ordered_expected_events.reverse)
- end
+ expect(events).to eq(ordered_expected_events.reverse)
end
end
+ end
- it 'does not include events from users with private profile', :aggregate_failures do
- allow(Ability).to receive(:allowed?).and_call_original
- allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, second_user).and_return(false)
+ it 'does not include events from users with private profile', :aggregate_failures do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, second_user).and_return(false)
- events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
+ events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
- expect(events).to contain_exactly(private_event, internal_event, public_event)
- end
+ expect(events).to contain_exactly(private_event, internal_event, public_event)
+ end
- context 'with pagination params' do
- using RSpec::Parameterized::TableSyntax
+ context 'with pagination params' do
+ using RSpec::Parameterized::TableSyntax
- where(:limit, :offset, :ordered_expected_events) do
- nil | nil | lazy { [public_event_second_user, internal_event_second_user, private_event_second_user, public_event, internal_event, private_event] }
- 2 | nil | lazy { [public_event_second_user, internal_event_second_user] }
- nil | 4 | lazy { [internal_event, private_event] }
- 2 | 2 | lazy { [private_event_second_user, public_event] }
- end
+ where(:limit, :offset, :ordered_expected_events) do
+ nil | nil | lazy { [public_event_second_user, internal_event_second_user, private_event_second_user, public_event, internal_event, private_event] }
+ 2 | nil | lazy { [public_event_second_user, internal_event_second_user] }
+ nil | 4 | lazy { [internal_event, private_event] }
+ 2 | 2 | lazy { [private_event_second_user, public_event] }
+ end
- with_them do
- let(:params) { { limit: limit, offset: offset }.compact }
+ with_them do
+ let(:params) { { limit: limit, offset: offset }.compact }
- it 'returns paginated events sorted by id (DESC)' do
- events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
+ it 'returns paginated events sorted by id (DESC)' do
+ events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
- expect(events).to eq(ordered_expected_events)
- end
+ expect(events).to eq(ordered_expected_events)
end
end
end
+ end
+
+ context 'filter activity events' do
+ let_it_be(:push_event) { create(:push_event, project: public_project, author: project_owner) }
+ let_it_be(:merge_event) { create(:event, :merged, project: public_project, author: project_owner) }
+ let_it_be(:issue_event) { create(:event, :closed, project: public_project, target: issue, author: project_owner) }
+ let_it_be(:comment_event) { create(:event, :commented, project: public_project, author: project_owner) }
+ let_it_be(:wiki_event) { create(:wiki_page_event, project: public_project, author: project_owner) }
+ let_it_be(:design_event) { create(:design_event, project: public_project, author: project_owner) }
+ let_it_be(:team_event) { create(:event, :joined, project: public_project, author: project_owner) }
+
+ it 'includes all events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::ALL)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
+
+ expect(events).to include(private_event, internal_event, public_event)
+ expect(events).to include(push_event, merge_event, issue_event, comment_event, wiki_event, design_event, team_event)
+ expect(events.size).to eq(10)
+ end
- context 'filter activity events' do
- let_it_be(:push_event) { create(:push_event, project: public_project, author: project_owner) }
- let_it_be(:merge_event) { create(:event, :merged, project: public_project, author: project_owner) }
- let_it_be(:issue_event) { create(:event, :closed, project: public_project, target: issue, author: project_owner) }
- let_it_be(:comment_event) { create(:event, :commented, project: public_project, author: project_owner) }
- let_it_be(:wiki_event) { create(:wiki_page_event, project: public_project, author: project_owner) }
- let_it_be(:design_event) { create(:design_event, project: public_project, author: project_owner) }
- let_it_be(:team_event) { create(:event, :joined, project: public_project, author: project_owner) }
+ context 'when unknown filter is given' do
+ it 'includes returns all events', :aggregate_failures do
+ event_filter = EventFilter.new('unknown')
+ allow(event_filter).to receive(:filter).and_return('unknown')
- it 'includes all events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::ALL)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ events = described_class.new(current_user, [project_owner], event_filter, params).execute
expect(events).to include(private_event, internal_event, public_event)
expect(events).to include(push_event, merge_event, issue_event, comment_event, wiki_event, design_event, team_event)
expect(events.size).to eq(10)
end
+ end
- context 'when unknown filter is given' do
- it 'includes returns all events', :aggregate_failures do
- event_filter = EventFilter.new('unknown')
- allow(event_filter).to receive(:filter).and_return('unknown')
+ it 'only includes push events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::PUSH)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- events = described_class.new(current_user, [project_owner], event_filter, params).execute
+ expect(events).to include(push_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(private_event, internal_event, public_event)
- expect(events).to include(push_event, merge_event, issue_event, comment_event, wiki_event, design_event, team_event)
- expect(events.size).to eq(10)
- end
- end
+ it 'only includes merge events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::MERGED)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes push events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::PUSH)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(merge_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(push_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes issue events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::ISSUE)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes merge events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::MERGED)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(issue_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(merge_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes comments events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::COMMENTS)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes issue events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::ISSUE)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(comment_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(issue_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes wiki events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::WIKI)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes comments events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::COMMENTS)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(wiki_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(comment_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes design events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::DESIGNS)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes wiki events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::WIKI)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(design_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(wiki_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes team events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::TEAM)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes design events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::DESIGNS)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(private_event, internal_event, public_event, team_event)
+ expect(events.size).to eq(4)
+ end
+ end
- expect(events).to include(design_event)
- expect(events.size).to eq(1)
- end
+ describe 'issue activity events' do
+ let(:issue) { create(:issue, project: public_project) }
+ let(:note) { create(:note_on_issue, noteable: issue, project: public_project) }
+ let!(:event_a) { create(:event, :commented, target: note, author: project_owner) }
+ let!(:event_b) { create(:event, :closed, target: issue, author: project_owner) }
- it 'only includes team events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::TEAM)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ it 'includes all issue related events', :aggregate_failures do
+ events = finder.execute
- expect(events).to include(private_event, internal_event, public_event, team_event)
- expect(events.size).to eq(4)
- end
+ expect(events).to include(event_a)
+ expect(events).to include(event_b)
end
+ end
- describe 'issue activity events' do
- let(:issue) { create(:issue, project: public_project) }
- let(:note) { create(:note_on_issue, noteable: issue, project: public_project) }
- let!(:event_a) { create(:event, :commented, target: note, author: project_owner) }
- let!(:event_b) { create(:event, :closed, target: issue, author: project_owner) }
-
- it 'includes all issue related events', :aggregate_failures do
- events = finder.execute
+ context 'limits' do
+ before do
+ stub_const("#{described_class}::DEFAULT_LIMIT", 1)
+ stub_const("#{described_class}::MAX_LIMIT", 3)
+ end
- expect(events).to include(event_a)
- expect(events).to include(event_b)
+ context 'when limit is not set' do
+ it 'returns events limited to DEFAULT_LIMIT' do
+ expect(finder.execute.size).to eq(described_class::DEFAULT_LIMIT)
end
end
- context 'limits' do
- before do
- stub_const("#{described_class}::DEFAULT_LIMIT", 1)
- stub_const("#{described_class}::MAX_LIMIT", 3)
- end
+ context 'when limit is set' do
+ let(:limit) { 2 }
- context 'when limit is not set' do
- it 'returns events limited to DEFAULT_LIMIT' do
- expect(finder.execute.size).to eq(described_class::DEFAULT_LIMIT)
- end
+ it 'returns events limited to specified limit' do
+ expect(finder.execute.size).to eq(limit)
end
+ end
- context 'when limit is set' do
- let(:limit) { 2 }
+ context 'when limit is set to a number that exceeds maximum limit' do
+ let(:limit) { 4 }
- it 'returns events limited to specified limit' do
- expect(finder.execute.size).to eq(limit)
- end
+ before do
+ create(:event, project: public_project, author: project_owner)
end
- context 'when limit is set to a number that exceeds maximum limit' do
- let(:limit) { 4 }
-
- before do
- create(:event, project: public_project, author: project_owner)
- end
-
- it 'returns events limited to MAX_LIMIT' do
- expect(finder.execute.size).to eq(described_class::MAX_LIMIT)
- end
+ it 'returns events limited to MAX_LIMIT' do
+ expect(finder.execute.size).to eq(described_class::MAX_LIMIT)
end
end
end
end
-
- context 'when the optimized_followed_users_queries FF is on' do
- before do
- stub_feature_flags(optimized_followed_users_queries: true)
- end
-
- it_behaves_like 'UserRecentEventsFinder examples'
- end
-
- context 'when the optimized_followed_users_queries FF is off' do
- before do
- stub_feature_flags(optimized_followed_users_queries: false)
- end
-
- it_behaves_like 'UserRecentEventsFinder examples'
- end
end
diff --git a/spec/fixtures/api/schemas/entities/commit.json b/spec/fixtures/api/schemas/entities/commit.json
index 324702e3f94..ed08c35f89b 100644
--- a/spec/fixtures/api/schemas/entities/commit.json
+++ b/spec/fixtures/api/schemas/entities/commit.json
@@ -11,7 +11,7 @@
"author"
],
"properties": {
- "author_gravatar_url": { "type": "string" },
+ "author_gravatar_url": { "type": [ "string", "null" ] },
"commit_url": { "type": "string" },
"commit_path": { "type": "string" },
"author": {
diff --git a/spec/fixtures/api/schemas/entities/github/user.json b/spec/fixtures/api/schemas/entities/github/user.json
index 3d772a0c648..23db912ad5c 100644
--- a/spec/fixtures/api/schemas/entities/github/user.json
+++ b/spec/fixtures/api/schemas/entities/github/user.json
@@ -5,7 +5,7 @@
"id": { "type": "integer" },
"login": { "type": "string" },
"url": { "type": "string" },
- "avatar_url": { "type": "string" },
+ "avatar_url": { "type": [ "string", "null" ] },
"html_url": { "type": "string" }
},
"additionalProperties": false
diff --git a/spec/fixtures/api/schemas/entities/member.json b/spec/fixtures/api/schemas/entities/member.json
index 88f7d87b269..24a4863df9b 100644
--- a/spec/fixtures/api/schemas/entities/member.json
+++ b/spec/fixtures/api/schemas/entities/member.json
@@ -62,7 +62,7 @@
"required": ["email", "avatar_url", "can_resend", "user_state"],
"properties": {
"email": { "type": "string" },
- "avatar_url": { "type": "string" },
+ "avatar_url": { "type": [ "string", "null" ] },
"can_resend": { "type": "boolean" },
"user_state": { "type": "string" }
},
diff --git a/spec/fixtures/api/schemas/entities/merge_request_basic.json b/spec/fixtures/api/schemas/entities/merge_request_basic.json
index b061176f6a7..bda9f6573ea 100644
--- a/spec/fixtures/api/schemas/entities/merge_request_basic.json
+++ b/spec/fixtures/api/schemas/entities/merge_request_basic.json
@@ -7,6 +7,7 @@
"source_branch_exists": { "type": "boolean" },
"merge_error": { "type": ["string", "null"] },
"rebase_in_progress": { "type": "boolean" },
+ "should_be_rebased": { "type": "boolean" },
"allow_collaboration": { "type": "boolean"},
"allow_maintainer_to_push": { "type": "boolean"},
"assignees": {
diff --git a/spec/fixtures/api/schemas/entities/note_user_entity.json b/spec/fixtures/api/schemas/entities/note_user_entity.json
index e2bbaad7201..f5d28dd7b71 100644
--- a/spec/fixtures/api/schemas/entities/note_user_entity.json
+++ b/spec/fixtures/api/schemas/entities/note_user_entity.json
@@ -11,7 +11,7 @@
"properties": {
"id": { "type": "integer" },
"state": { "type": "string" },
- "avatar_url": { "type": "string" },
+ "avatar_url": { "type": [ "string", "null" ] },
"path": { "type": "string" },
"name": { "type": "string" },
"username": { "type": "string" },
diff --git a/spec/fixtures/api/schemas/entities/user.json b/spec/fixtures/api/schemas/entities/user.json
index 3252a37c82a..984b7184d36 100644
--- a/spec/fixtures/api/schemas/entities/user.json
+++ b/spec/fixtures/api/schemas/entities/user.json
@@ -12,7 +12,7 @@
"properties": {
"id": { "type": "integer" },
"state": { "type": "string" },
- "avatar_url": { "type": "string" },
+ "avatar_url": { "type": [ "string", "null" ] },
"web_url": { "type": "string" },
"path": { "type": "string" },
"name": { "type": "string" },
diff --git a/spec/fixtures/api/schemas/public_api/v4/commit/basic.json b/spec/fixtures/api/schemas/public_api/v4/commit/basic.json
index 227b5a20af3..da7a9fcb7f3 100644
--- a/spec/fixtures/api/schemas/public_api/v4/commit/basic.json
+++ b/spec/fixtures/api/schemas/public_api/v4/commit/basic.json
@@ -19,7 +19,7 @@
"id": { "type": ["string", "null"] },
"short_id": { "type": ["string", "null"] },
"title": { "type": "string" },
- "created_at": { "type": "string", "format": "date-time" },
+ "created_at": { "type": "string" },
"parent_ids": {
"type": ["array", "null"],
"items": {
@@ -30,10 +30,10 @@
"message": { "type": "string" },
"author_name": { "type": "string" },
"author_email": { "type": "string" },
- "authored_date": { "type": "string", "format": "date-time" },
+ "authored_date": { "type": "string" },
"committer_name": { "type": "string" },
"committer_email": { "type": "string" },
- "committed_date": { "type": "string", "format": "date-time" },
+ "committed_date": { "type": "string" },
"web_url": { "type": "string" }
}
}
diff --git a/spec/fixtures/api/schemas/public_api/v4/deploy_key.json b/spec/fixtures/api/schemas/public_api/v4/deploy_key.json
index 3dbdfcc95a1..99e57a4c218 100644
--- a/spec/fixtures/api/schemas/public_api/v4/deploy_key.json
+++ b/spec/fixtures/api/schemas/public_api/v4/deploy_key.json
@@ -6,7 +6,7 @@
"created_at",
"expires_at",
"key",
- "fingerprint",
+ "fingerprint_sha256",
"projects_with_write_access"
],
"properties": {
@@ -16,6 +16,7 @@
"expires_at": { "type": ["string", "null"], "format": "date-time" },
"key": { "type": "string" },
"fingerprint": { "type": "string" },
+ "fingerprint_sha256": { "type": "string" },
"projects_with_write_access": {
"type": "array",
"items": { "$ref": "project/identity.json" }
diff --git a/spec/fixtures/api/schemas/public_api/v4/environment.json b/spec/fixtures/api/schemas/public_api/v4/environment.json
index 3a4c18343e3..21888d88598 100644
--- a/spec/fixtures/api/schemas/public_api/v4/environment.json
+++ b/spec/fixtures/api/schemas/public_api/v4/environment.json
@@ -25,10 +25,7 @@
"state": { "type": "string" },
"created_at": { "type": "string", "format": "date-time" },
"updated_at": { "type": "string", "format": "date-time" },
- "project": { "$ref": "project.json" },
- "enable_advanced_logs_querying": { "type": "boolean" },
- "logs_api_path": { "type": "string" },
- "gitlab_managed_apps_logs_path": { "type": "string" }
+ "project": { "$ref": "project.json" }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/public_api/v4/metadata.json b/spec/fixtures/api/schemas/public_api/v4/metadata.json
new file mode 100644
index 00000000000..fd219b95df8
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/metadata.json
@@ -0,0 +1,26 @@
+{
+ "type": "object",
+ "required": [
+ "version",
+ "revision",
+ "kas"
+ ],
+ "properties": {
+ "version": { "type": "string" },
+ "revision": { "type": "string" },
+ "kas": {
+ "type": "object",
+ "required": [
+ "enabled",
+ "externalUrl",
+ "version"
+ ],
+ "properties": {
+ "enabled": { "type": "boolean" },
+ "externalUrl": { "type": ["string", "null"] },
+ "version": { "type": ["string", "null"] }
+ }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/terraform/modules/v1/single_version.json b/spec/fixtures/api/schemas/public_api/v4/packages/terraform/modules/v1/single_version.json
new file mode 100644
index 00000000000..689b9427f38
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/terraform/modules/v1/single_version.json
@@ -0,0 +1,55 @@
+{
+ "type": "object",
+ "required": [
+ "name",
+ "provider",
+ "providers",
+ "root",
+ "source",
+ "submodules",
+ "version",
+ "versions"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "providers": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "root": {
+ "type": "object",
+ "required": [
+ "dependencies"
+ ],
+ "properties": {
+ "dependencies": {
+ "type": "array",
+ "maxItems": 0
+ }
+ }
+ },
+ "source": {
+ "type": "string"
+ },
+ "submodules": {
+ "type": "array",
+ "maxItems": 0
+ },
+ "version": {
+ "type": "string"
+ },
+ "versions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/project_hook.json b/spec/fixtures/api/schemas/public_api/v4/project_hook.json
new file mode 100644
index 00000000000..6070f3a55f9
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/project_hook.json
@@ -0,0 +1,62 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "url",
+ "created_at",
+ "push_events",
+ "push_events_branch_filter",
+ "tag_push_events",
+ "merge_requests_events",
+ "repository_update_events",
+ "enable_ssl_verification",
+ "project_id",
+ "issues_events",
+ "confidential_issues_events",
+ "note_events",
+ "confidential_note_events",
+ "pipeline_events",
+ "wiki_page_events",
+ "job_events",
+ "deployment_events",
+ "releases_events",
+ "alert_status",
+ "disabled_until",
+ "url_variables"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "project_id": { "type": "integer" },
+ "url": { "type": "string" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "push_events": { "type": "boolean" },
+ "push_events_branch_filter": { "type": ["string", "null"] },
+ "tag_push_events": { "type": "boolean" },
+ "merge_requests_events": { "type": "boolean" },
+ "repository_update_events": { "type": "boolean" },
+ "enable_ssl_verification": { "type": "boolean" },
+ "issues_events": { "type": "boolean" },
+ "confidential_issues_events": { "type": ["boolean", "null"] },
+ "note_events": { "type": "boolean" },
+ "confidential_note_events": { "type": ["boolean", "null"] },
+ "pipeline_events": { "type": "boolean" },
+ "wiki_page_events": { "type": "boolean" },
+ "job_events": { "type": "boolean" },
+ "deployment_events": { "type": "boolean" },
+ "releases_events": { "type": "boolean" },
+ "alert_status": { "type": "string", "enum": ["executable","disabled","temporarily_disabled"] },
+ "disabled_until": { "type": ["string", "null"] },
+ "url_variables": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["key"],
+ "properties": {
+ "key": { "type": "string" }
+ }
+ }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/project_hooks.json b/spec/fixtures/api/schemas/public_api/v4/project_hooks.json
new file mode 100644
index 00000000000..8c542ebe3ad
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/project_hooks.json
@@ -0,0 +1,10 @@
+{
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties" : {
+ "$ref": "./project_hook.json"
+ }
+ }
+}
+
diff --git a/spec/fixtures/api/schemas/public_api/v4/system_hook.json b/spec/fixtures/api/schemas/public_api/v4/system_hook.json
index 3fe3e0d658e..b6f56b948a0 100644
--- a/spec/fixtures/api/schemas/public_api/v4/system_hook.json
+++ b/spec/fixtures/api/schemas/public_api/v4/system_hook.json
@@ -10,7 +10,8 @@
"repository_update_events",
"enable_ssl_verification",
"alert_status",
- "disabled_until"
+ "disabled_until",
+ "url_variables"
],
"properties": {
"id": { "type": "integer" },
@@ -22,7 +23,18 @@
"repository_update_events": { "type": "boolean" },
"enable_ssl_verification": { "type": "boolean" },
"alert_status": { "type": "string", "enum": ["executable", "disabled", "temporarily_disabled"] },
- "disabled_until": { "type": ["string", "null"] }
+ "disabled_until": { "type": ["string", "null"] },
+ "url_variables": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["key"],
+ "properties": {
+ "key": { "type": "string" }
+ }
+ }
+ }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/public_api/v4/user/basic.json b/spec/fixtures/api/schemas/public_api/v4/user/basic.json
index 2d815be32a6..d8286f0d84c 100644
--- a/spec/fixtures/api/schemas/public_api/v4/user/basic.json
+++ b/spec/fixtures/api/schemas/public_api/v4/user/basic.json
@@ -13,7 +13,7 @@
"name": { "type": "string" },
"username": { "type": "string" },
"state": { "type": "string" },
- "avatar_url": { "type": "string" },
+ "avatar_url": { "type": [ "string", "null" ] },
"web_url": { "type": "string" }
}
}
diff --git a/spec/fixtures/api/schemas/public_api/v4/user/public.json b/spec/fixtures/api/schemas/public_api/v4/user/public.json
index 0955c70aef0..c4549e3ef63 100644
--- a/spec/fixtures/api/schemas/public_api/v4/user/public.json
+++ b/spec/fixtures/api/schemas/public_api/v4/user/public.json
@@ -39,7 +39,7 @@
"type": "string",
"enum": ["active", "blocked"]
},
- "avatar_url": { "type": "string" },
+ "avatar_url": { "type": [ "string", "null" ] },
"web_url": { "type": "string" },
"created_at": { "type": "string", "format": "date-time" },
"bio": { "type": ["string", "null"] },
diff --git a/spec/fixtures/csv_complex.csv b/spec/fixtures/csv_complex.csv
new file mode 100644
index 00000000000..60d8aa5d6f7
--- /dev/null
+++ b/spec/fixtures/csv_complex.csv
@@ -0,0 +1,6 @@
+title,description,due date
+Issue in 中文,Test description,
+"Hello","World",
+"Title with quote""","Description
+/assign @csv_assignee
+/estimate 1h",2022-06-28
diff --git a/spec/fixtures/emails/service_desk.eml b/spec/fixtures/emails/service_desk.eml
index 0db1270bc64..102f29542ae 100644
--- a/spec/fixtures/emails/service_desk.eml
+++ b/spec/fixtures/emails/service_desk.eml
@@ -6,6 +6,7 @@ Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
Date: Thu, 13 Jun 2013 17:03:48 -0400
From: Jake the Dog <jake@adventuretime.ooo>
To: incoming+email-test-project_id-issue-@appmail.adventuretime.ooo
+Cc: Carbon Copy <cc@example.com>, kk@example.org
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
Subject: The message subject! @all
Mime-Version: 1.0
diff --git a/spec/fixtures/gitlab/git/gitattributes b/spec/fixtures/gitlab/git/gitattributes
new file mode 100644
index 00000000000..bfe9c8e4ed2
--- /dev/null
+++ b/spec/fixtures/gitlab/git/gitattributes
@@ -0,0 +1,16 @@
+# This is a comment, it should be ignored.
+
+*.txt text
+*.jpg -text
+*.sh eol=lf gitlab-language=shell
+*.haml.* gitlab-language=haml
+foo/bar.* foo
+*.cgi key=value?p1=v1&p2=v2
+/*.png gitlab-language=png
+*.binary binary
+/custom-highlighting/*.gitlab-custom gitlab-language=ruby
+/custom-highlighting/*.gitlab-cgi gitlab-language=erb?parent=json
+
+# This uses a tab instead of spaces to ensure the parser also supports this.
+*.md gitlab-language=markdown
+bla/bla.txt
diff --git a/spec/fixtures/gitlab/git/gitattributes_invalid b/spec/fixtures/gitlab/git/gitattributes_invalid
new file mode 100644
index 00000000000..57e0e8e0d3b
--- /dev/null
+++ b/spec/fixtures/gitlab/git/gitattributes_invalid
Binary files differ
diff --git a/spec/fixtures/gitlab/import_export/labels.tar.gz b/spec/fixtures/gitlab/import_export/labels.tar.gz
new file mode 100644
index 00000000000..8329dcf3b4a
--- /dev/null
+++ b/spec/fixtures/gitlab/import_export/labels.tar.gz
Binary files differ
diff --git a/spec/fixtures/glfm/example_snapshots/examples_index.yml b/spec/fixtures/glfm/example_snapshots/examples_index.yml
deleted file mode 100644
index 08f6f88af9e..00000000000
--- a/spec/fixtures/glfm/example_snapshots/examples_index.yml
+++ /dev/null
@@ -1,2017 +0,0 @@
----
-02_01__preliminaries__tabs__001:
- spec_txt_example_position: 1
- source_specification: commonmark
-02_01__preliminaries__tabs__002:
- spec_txt_example_position: 2
- source_specification: commonmark
-02_01__preliminaries__tabs__003:
- spec_txt_example_position: 3
- source_specification: commonmark
-02_01__preliminaries__tabs__004:
- spec_txt_example_position: 4
- source_specification: commonmark
-02_01__preliminaries__tabs__005:
- spec_txt_example_position: 5
- source_specification: commonmark
-02_01__preliminaries__tabs__006:
- spec_txt_example_position: 6
- source_specification: commonmark
-02_01__preliminaries__tabs__007:
- spec_txt_example_position: 7
- source_specification: commonmark
-02_01__preliminaries__tabs__008:
- spec_txt_example_position: 8
- source_specification: commonmark
-02_01__preliminaries__tabs__009:
- spec_txt_example_position: 9
- source_specification: commonmark
-02_01__preliminaries__tabs__010:
- spec_txt_example_position: 10
- source_specification: commonmark
-02_01__preliminaries__tabs__011:
- spec_txt_example_position: 11
- source_specification: commonmark
-03_01__blocks_and_inlines__precedence__001:
- spec_txt_example_position: 12
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__001:
- spec_txt_example_position: 13
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__002:
- spec_txt_example_position: 14
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__003:
- spec_txt_example_position: 15
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__004:
- spec_txt_example_position: 16
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__005:
- spec_txt_example_position: 17
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__006:
- spec_txt_example_position: 18
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__007:
- spec_txt_example_position: 19
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__008:
- spec_txt_example_position: 20
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__009:
- spec_txt_example_position: 21
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__010:
- spec_txt_example_position: 22
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__011:
- spec_txt_example_position: 23
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__012:
- spec_txt_example_position: 24
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__013:
- spec_txt_example_position: 25
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__014:
- spec_txt_example_position: 26
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__015:
- spec_txt_example_position: 27
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__016:
- spec_txt_example_position: 28
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__017:
- spec_txt_example_position: 29
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__018:
- spec_txt_example_position: 30
- source_specification: commonmark
-04_01__leaf_blocks__thematic_breaks__019:
- spec_txt_example_position: 31
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__001:
- spec_txt_example_position: 32
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__002:
- spec_txt_example_position: 33
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__003:
- spec_txt_example_position: 34
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__004:
- spec_txt_example_position: 35
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__005:
- spec_txt_example_position: 36
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__006:
- spec_txt_example_position: 37
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__007:
- spec_txt_example_position: 38
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__008:
- spec_txt_example_position: 39
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__009:
- spec_txt_example_position: 40
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__010:
- spec_txt_example_position: 41
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__011:
- spec_txt_example_position: 42
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__012:
- spec_txt_example_position: 43
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__013:
- spec_txt_example_position: 44
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__014:
- spec_txt_example_position: 45
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__015:
- spec_txt_example_position: 46
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__016:
- spec_txt_example_position: 47
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__017:
- spec_txt_example_position: 48
- source_specification: commonmark
-04_02__leaf_blocks__atx_headings__018:
- spec_txt_example_position: 49
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__001:
- spec_txt_example_position: 50
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__002:
- spec_txt_example_position: 51
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__003:
- spec_txt_example_position: 52
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__004:
- spec_txt_example_position: 53
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__005:
- spec_txt_example_position: 54
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__006:
- spec_txt_example_position: 55
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__007:
- spec_txt_example_position: 56
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__008:
- spec_txt_example_position: 57
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__009:
- spec_txt_example_position: 58
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__010:
- spec_txt_example_position: 59
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__011:
- spec_txt_example_position: 60
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__012:
- spec_txt_example_position: 61
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__013:
- spec_txt_example_position: 62
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__014:
- spec_txt_example_position: 63
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__015:
- spec_txt_example_position: 64
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__016:
- spec_txt_example_position: 65
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__017:
- spec_txt_example_position: 66
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__018:
- spec_txt_example_position: 67
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__019:
- spec_txt_example_position: 68
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__020:
- spec_txt_example_position: 69
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__021:
- spec_txt_example_position: 70
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__022:
- spec_txt_example_position: 71
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__023:
- spec_txt_example_position: 72
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__024:
- spec_txt_example_position: 73
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__025:
- spec_txt_example_position: 74
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__026:
- spec_txt_example_position: 75
- source_specification: commonmark
-04_03__leaf_blocks__setext_headings__027:
- spec_txt_example_position: 76
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__001:
- spec_txt_example_position: 77
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__002:
- spec_txt_example_position: 78
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__003:
- spec_txt_example_position: 79
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__004:
- spec_txt_example_position: 80
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__005:
- spec_txt_example_position: 81
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__006:
- spec_txt_example_position: 82
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__007:
- spec_txt_example_position: 83
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__008:
- spec_txt_example_position: 84
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__009:
- spec_txt_example_position: 85
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__010:
- spec_txt_example_position: 86
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__011:
- spec_txt_example_position: 87
- source_specification: commonmark
-04_04__leaf_blocks__indented_code_blocks__012:
- spec_txt_example_position: 88
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__001:
- spec_txt_example_position: 89
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__002:
- spec_txt_example_position: 90
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__003:
- spec_txt_example_position: 91
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__004:
- spec_txt_example_position: 92
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__005:
- spec_txt_example_position: 93
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__006:
- spec_txt_example_position: 94
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__007:
- spec_txt_example_position: 95
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__008:
- spec_txt_example_position: 96
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__009:
- spec_txt_example_position: 97
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__010:
- spec_txt_example_position: 98
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__011:
- spec_txt_example_position: 99
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__012:
- spec_txt_example_position: 100
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__013:
- spec_txt_example_position: 101
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__014:
- spec_txt_example_position: 102
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__015:
- spec_txt_example_position: 103
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__016:
- spec_txt_example_position: 104
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__017:
- spec_txt_example_position: 105
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__018:
- spec_txt_example_position: 106
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__019:
- spec_txt_example_position: 107
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__020:
- spec_txt_example_position: 108
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__021:
- spec_txt_example_position: 109
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__022:
- spec_txt_example_position: 110
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__023:
- spec_txt_example_position: 111
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__024:
- spec_txt_example_position: 112
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__025:
- spec_txt_example_position: 113
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__026:
- spec_txt_example_position: 114
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__027:
- spec_txt_example_position: 115
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__028:
- spec_txt_example_position: 116
- source_specification: commonmark
-04_05__leaf_blocks__fenced_code_blocks__029:
- spec_txt_example_position: 117
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__001:
- spec_txt_example_position: 118
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__002:
- spec_txt_example_position: 119
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__003:
- spec_txt_example_position: 120
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__004:
- spec_txt_example_position: 121
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__005:
- spec_txt_example_position: 122
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__006:
- spec_txt_example_position: 123
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__007:
- spec_txt_example_position: 124
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__008:
- spec_txt_example_position: 125
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__009:
- spec_txt_example_position: 126
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__010:
- spec_txt_example_position: 127
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__011:
- spec_txt_example_position: 128
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__012:
- spec_txt_example_position: 129
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__013:
- spec_txt_example_position: 130
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__014:
- spec_txt_example_position: 131
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__015:
- spec_txt_example_position: 132
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__016:
- spec_txt_example_position: 133
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__017:
- spec_txt_example_position: 134
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__018:
- spec_txt_example_position: 135
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__019:
- spec_txt_example_position: 136
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__020:
- spec_txt_example_position: 137
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__021:
- spec_txt_example_position: 138
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__022:
- spec_txt_example_position: 139
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__023:
- spec_txt_example_position: 140
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__024:
- spec_txt_example_position: 141
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__025:
- spec_txt_example_position: 142
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__026:
- spec_txt_example_position: 143
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__027:
- spec_txt_example_position: 144
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__028:
- spec_txt_example_position: 145
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__029:
- spec_txt_example_position: 146
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__030:
- spec_txt_example_position: 147
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__031:
- spec_txt_example_position: 148
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__032:
- spec_txt_example_position: 149
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__033:
- spec_txt_example_position: 150
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__034:
- spec_txt_example_position: 151
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__035:
- spec_txt_example_position: 152
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__036:
- spec_txt_example_position: 153
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__037:
- spec_txt_example_position: 154
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__038:
- spec_txt_example_position: 155
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__039:
- spec_txt_example_position: 156
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__040:
- spec_txt_example_position: 157
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__041:
- spec_txt_example_position: 158
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__042:
- spec_txt_example_position: 159
- source_specification: commonmark
-04_06__leaf_blocks__html_blocks__043:
- spec_txt_example_position: 160
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__001:
- spec_txt_example_position: 161
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__002:
- spec_txt_example_position: 162
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__003:
- spec_txt_example_position: 163
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__004:
- spec_txt_example_position: 164
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__005:
- spec_txt_example_position: 165
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__006:
- spec_txt_example_position: 166
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__007:
- spec_txt_example_position: 167
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__008:
- spec_txt_example_position: 168
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__009:
- spec_txt_example_position: 169
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__010:
- spec_txt_example_position: 170
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__011:
- spec_txt_example_position: 171
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__012:
- spec_txt_example_position: 172
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__013:
- spec_txt_example_position: 173
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__014:
- spec_txt_example_position: 174
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__015:
- spec_txt_example_position: 175
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__016:
- spec_txt_example_position: 176
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__017:
- spec_txt_example_position: 177
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__018:
- spec_txt_example_position: 178
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__019:
- spec_txt_example_position: 179
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__020:
- spec_txt_example_position: 180
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__021:
- spec_txt_example_position: 181
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__022:
- spec_txt_example_position: 182
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__023:
- spec_txt_example_position: 183
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__024:
- spec_txt_example_position: 184
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__025:
- spec_txt_example_position: 185
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__026:
- spec_txt_example_position: 186
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__027:
- spec_txt_example_position: 187
- source_specification: commonmark
-04_07__leaf_blocks__link_reference_definitions__028:
- spec_txt_example_position: 188
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__001:
- spec_txt_example_position: 189
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__002:
- spec_txt_example_position: 190
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__003:
- spec_txt_example_position: 191
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__004:
- spec_txt_example_position: 192
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__005:
- spec_txt_example_position: 193
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__006:
- spec_txt_example_position: 194
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__007:
- spec_txt_example_position: 195
- source_specification: commonmark
-04_08__leaf_blocks__paragraphs__008:
- spec_txt_example_position: 196
- source_specification: commonmark
-04_09__leaf_blocks__blank_lines__001:
- spec_txt_example_position: 197
- source_specification: commonmark
-04_10__leaf_blocks__tables_extension__001:
- spec_txt_example_position: 198
- source_specification: github
-04_10__leaf_blocks__tables_extension__002:
- spec_txt_example_position: 199
- source_specification: github
-04_10__leaf_blocks__tables_extension__003:
- spec_txt_example_position: 200
- source_specification: github
-04_10__leaf_blocks__tables_extension__004:
- spec_txt_example_position: 201
- source_specification: github
-04_10__leaf_blocks__tables_extension__005:
- spec_txt_example_position: 202
- source_specification: github
-04_10__leaf_blocks__tables_extension__006:
- spec_txt_example_position: 203
- source_specification: github
-04_10__leaf_blocks__tables_extension__007:
- spec_txt_example_position: 204
- source_specification: github
-04_10__leaf_blocks__tables_extension__008:
- spec_txt_example_position: 205
- source_specification: github
-05_01__container_blocks__block_quotes__001:
- spec_txt_example_position: 206
- source_specification: commonmark
-05_01__container_blocks__block_quotes__002:
- spec_txt_example_position: 207
- source_specification: commonmark
-05_01__container_blocks__block_quotes__003:
- spec_txt_example_position: 208
- source_specification: commonmark
-05_01__container_blocks__block_quotes__004:
- spec_txt_example_position: 209
- source_specification: commonmark
-05_01__container_blocks__block_quotes__005:
- spec_txt_example_position: 210
- source_specification: commonmark
-05_01__container_blocks__block_quotes__006:
- spec_txt_example_position: 211
- source_specification: commonmark
-05_01__container_blocks__block_quotes__007:
- spec_txt_example_position: 212
- source_specification: commonmark
-05_01__container_blocks__block_quotes__008:
- spec_txt_example_position: 213
- source_specification: commonmark
-05_01__container_blocks__block_quotes__009:
- spec_txt_example_position: 214
- source_specification: commonmark
-05_01__container_blocks__block_quotes__010:
- spec_txt_example_position: 215
- source_specification: commonmark
-05_01__container_blocks__block_quotes__011:
- spec_txt_example_position: 216
- source_specification: commonmark
-05_01__container_blocks__block_quotes__012:
- spec_txt_example_position: 217
- source_specification: commonmark
-05_01__container_blocks__block_quotes__013:
- spec_txt_example_position: 218
- source_specification: commonmark
-05_01__container_blocks__block_quotes__014:
- spec_txt_example_position: 219
- source_specification: commonmark
-05_01__container_blocks__block_quotes__015:
- spec_txt_example_position: 220
- source_specification: commonmark
-05_01__container_blocks__block_quotes__016:
- spec_txt_example_position: 221
- source_specification: commonmark
-05_01__container_blocks__block_quotes__017:
- spec_txt_example_position: 222
- source_specification: commonmark
-05_01__container_blocks__block_quotes__018:
- spec_txt_example_position: 223
- source_specification: commonmark
-05_01__container_blocks__block_quotes__019:
- spec_txt_example_position: 224
- source_specification: commonmark
-05_01__container_blocks__block_quotes__020:
- spec_txt_example_position: 225
- source_specification: commonmark
-05_01__container_blocks__block_quotes__021:
- spec_txt_example_position: 226
- source_specification: commonmark
-05_01__container_blocks__block_quotes__022:
- spec_txt_example_position: 227
- source_specification: commonmark
-05_01__container_blocks__block_quotes__023:
- spec_txt_example_position: 228
- source_specification: commonmark
-05_01__container_blocks__block_quotes__024:
- spec_txt_example_position: 229
- source_specification: commonmark
-05_01__container_blocks__block_quotes__025:
- spec_txt_example_position: 230
- source_specification: commonmark
-05_02__container_blocks__list_items__001:
- spec_txt_example_position: 231
- source_specification: commonmark
-05_02__container_blocks__list_items__002:
- spec_txt_example_position: 232
- source_specification: commonmark
-05_02__container_blocks__list_items__003:
- spec_txt_example_position: 233
- source_specification: commonmark
-05_02__container_blocks__list_items__004:
- spec_txt_example_position: 234
- source_specification: commonmark
-05_02__container_blocks__list_items__005:
- spec_txt_example_position: 235
- source_specification: commonmark
-05_02__container_blocks__list_items__006:
- spec_txt_example_position: 236
- source_specification: commonmark
-05_02__container_blocks__list_items__007:
- spec_txt_example_position: 237
- source_specification: commonmark
-05_02__container_blocks__list_items__008:
- spec_txt_example_position: 238
- source_specification: commonmark
-05_02__container_blocks__list_items__009:
- spec_txt_example_position: 239
- source_specification: commonmark
-05_02__container_blocks__list_items__010:
- spec_txt_example_position: 240
- source_specification: commonmark
-05_02__container_blocks__list_items__011:
- spec_txt_example_position: 241
- source_specification: commonmark
-05_02__container_blocks__list_items__012:
- spec_txt_example_position: 242
- source_specification: commonmark
-05_02__container_blocks__list_items__013:
- spec_txt_example_position: 243
- source_specification: commonmark
-05_02__container_blocks__list_items__014:
- spec_txt_example_position: 244
- source_specification: commonmark
-05_02__container_blocks__list_items__015:
- spec_txt_example_position: 245
- source_specification: commonmark
-05_02__container_blocks__list_items__016:
- spec_txt_example_position: 246
- source_specification: commonmark
-05_02__container_blocks__list_items__017:
- spec_txt_example_position: 247
- source_specification: commonmark
-05_02__container_blocks__list_items__018:
- spec_txt_example_position: 248
- source_specification: commonmark
-05_02__container_blocks__list_items__019:
- spec_txt_example_position: 249
- source_specification: commonmark
-05_02__container_blocks__list_items__020:
- spec_txt_example_position: 250
- source_specification: commonmark
-05_02__container_blocks__list_items__021:
- spec_txt_example_position: 251
- source_specification: commonmark
-05_02__container_blocks__list_items__022:
- spec_txt_example_position: 252
- source_specification: commonmark
-05_02__container_blocks__list_items__023:
- spec_txt_example_position: 253
- source_specification: commonmark
-05_02__container_blocks__list_items__024:
- spec_txt_example_position: 254
- source_specification: commonmark
-05_02__container_blocks__list_items__025:
- spec_txt_example_position: 255
- source_specification: commonmark
-05_02__container_blocks__list_items__026:
- spec_txt_example_position: 256
- source_specification: commonmark
-05_02__container_blocks__list_items__027:
- spec_txt_example_position: 257
- source_specification: commonmark
-05_02__container_blocks__list_items__028:
- spec_txt_example_position: 258
- source_specification: commonmark
-05_02__container_blocks__list_items__029:
- spec_txt_example_position: 259
- source_specification: commonmark
-05_02__container_blocks__list_items__030:
- spec_txt_example_position: 260
- source_specification: commonmark
-05_02__container_blocks__list_items__031:
- spec_txt_example_position: 261
- source_specification: commonmark
-05_02__container_blocks__list_items__032:
- spec_txt_example_position: 262
- source_specification: commonmark
-05_02__container_blocks__list_items__033:
- spec_txt_example_position: 263
- source_specification: commonmark
-05_02__container_blocks__list_items__034:
- spec_txt_example_position: 264
- source_specification: commonmark
-05_02__container_blocks__list_items__035:
- spec_txt_example_position: 265
- source_specification: commonmark
-05_02__container_blocks__list_items__036:
- spec_txt_example_position: 266
- source_specification: commonmark
-05_02__container_blocks__list_items__037:
- spec_txt_example_position: 267
- source_specification: commonmark
-05_02__container_blocks__list_items__038:
- spec_txt_example_position: 268
- source_specification: commonmark
-05_02__container_blocks__list_items__039:
- spec_txt_example_position: 269
- source_specification: commonmark
-05_02__container_blocks__list_items__040:
- spec_txt_example_position: 270
- source_specification: commonmark
-05_02__container_blocks__list_items__041:
- spec_txt_example_position: 271
- source_specification: commonmark
-05_02__container_blocks__list_items__042:
- spec_txt_example_position: 272
- source_specification: commonmark
-05_02__container_blocks__list_items__043:
- spec_txt_example_position: 273
- source_specification: commonmark
-05_02__container_blocks__list_items__044:
- spec_txt_example_position: 274
- source_specification: commonmark
-05_02__container_blocks__list_items__045:
- spec_txt_example_position: 275
- source_specification: commonmark
-05_02__container_blocks__list_items__046:
- spec_txt_example_position: 276
- source_specification: commonmark
-05_02__container_blocks__list_items__047:
- spec_txt_example_position: 277
- source_specification: commonmark
-05_02__container_blocks__list_items__048:
- spec_txt_example_position: 278
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__049:
- spec_txt_example_position: 281
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__050:
- spec_txt_example_position: 282
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__051:
- spec_txt_example_position: 283
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__052:
- spec_txt_example_position: 284
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__053:
- spec_txt_example_position: 285
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__054:
- spec_txt_example_position: 286
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__055:
- spec_txt_example_position: 287
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__056:
- spec_txt_example_position: 288
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__057:
- spec_txt_example_position: 289
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__058:
- spec_txt_example_position: 290
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__059:
- spec_txt_example_position: 291
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__060:
- spec_txt_example_position: 292
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__061:
- spec_txt_example_position: 293
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__062:
- spec_txt_example_position: 294
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__063:
- spec_txt_example_position: 295
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__064:
- spec_txt_example_position: 296
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__065:
- spec_txt_example_position: 297
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__066:
- spec_txt_example_position: 298
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__067:
- spec_txt_example_position: 299
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__068:
- spec_txt_example_position: 300
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__069:
- spec_txt_example_position: 301
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__070:
- spec_txt_example_position: 302
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__071:
- spec_txt_example_position: 303
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__072:
- spec_txt_example_position: 304
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__073:
- spec_txt_example_position: 305
- source_specification: commonmark
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__074:
- spec_txt_example_position: 306
- source_specification: commonmark
-06_01__inlines__001:
- spec_txt_example_position: 307
- source_specification: commonmark
-06_02__inlines__backslash_escapes__001:
- spec_txt_example_position: 308
- source_specification: commonmark
-06_02__inlines__backslash_escapes__002:
- spec_txt_example_position: 309
- source_specification: commonmark
-06_02__inlines__backslash_escapes__003:
- spec_txt_example_position: 310
- source_specification: commonmark
-06_02__inlines__backslash_escapes__004:
- spec_txt_example_position: 311
- source_specification: commonmark
-06_02__inlines__backslash_escapes__005:
- spec_txt_example_position: 312
- source_specification: commonmark
-06_02__inlines__backslash_escapes__006:
- spec_txt_example_position: 313
- source_specification: commonmark
-06_02__inlines__backslash_escapes__007:
- spec_txt_example_position: 314
- source_specification: commonmark
-06_02__inlines__backslash_escapes__008:
- spec_txt_example_position: 315
- source_specification: commonmark
-06_02__inlines__backslash_escapes__009:
- spec_txt_example_position: 316
- source_specification: commonmark
-06_02__inlines__backslash_escapes__010:
- spec_txt_example_position: 317
- source_specification: commonmark
-06_02__inlines__backslash_escapes__011:
- spec_txt_example_position: 318
- source_specification: commonmark
-06_02__inlines__backslash_escapes__012:
- spec_txt_example_position: 319
- source_specification: commonmark
-06_02__inlines__backslash_escapes__013:
- spec_txt_example_position: 320
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__001:
- spec_txt_example_position: 321
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__002:
- spec_txt_example_position: 322
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__003:
- spec_txt_example_position: 323
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__004:
- spec_txt_example_position: 324
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__005:
- spec_txt_example_position: 325
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__006:
- spec_txt_example_position: 326
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__007:
- spec_txt_example_position: 327
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__008:
- spec_txt_example_position: 328
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__009:
- spec_txt_example_position: 329
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__010:
- spec_txt_example_position: 330
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__011:
- spec_txt_example_position: 331
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__012:
- spec_txt_example_position: 332
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__013:
- spec_txt_example_position: 333
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__014:
- spec_txt_example_position: 334
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__015:
- spec_txt_example_position: 335
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__016:
- spec_txt_example_position: 336
- source_specification: commonmark
-06_03__inlines__entity_and_numeric_character_references__017:
- spec_txt_example_position: 337
- source_specification: commonmark
-06_04__inlines__code_spans__001:
- spec_txt_example_position: 338
- source_specification: commonmark
-06_04__inlines__code_spans__002:
- spec_txt_example_position: 339
- source_specification: commonmark
-06_04__inlines__code_spans__003:
- spec_txt_example_position: 340
- source_specification: commonmark
-06_04__inlines__code_spans__004:
- spec_txt_example_position: 341
- source_specification: commonmark
-06_04__inlines__code_spans__005:
- spec_txt_example_position: 342
- source_specification: commonmark
-06_04__inlines__code_spans__006:
- spec_txt_example_position: 343
- source_specification: commonmark
-06_04__inlines__code_spans__007:
- spec_txt_example_position: 344
- source_specification: commonmark
-06_04__inlines__code_spans__008:
- spec_txt_example_position: 345
- source_specification: commonmark
-06_04__inlines__code_spans__009:
- spec_txt_example_position: 346
- source_specification: commonmark
-06_04__inlines__code_spans__010:
- spec_txt_example_position: 347
- source_specification: commonmark
-06_04__inlines__code_spans__011:
- spec_txt_example_position: 348
- source_specification: commonmark
-06_04__inlines__code_spans__012:
- spec_txt_example_position: 349
- source_specification: commonmark
-06_04__inlines__code_spans__013:
- spec_txt_example_position: 350
- source_specification: commonmark
-06_04__inlines__code_spans__014:
- spec_txt_example_position: 351
- source_specification: commonmark
-06_04__inlines__code_spans__015:
- spec_txt_example_position: 352
- source_specification: commonmark
-06_04__inlines__code_spans__016:
- spec_txt_example_position: 353
- source_specification: commonmark
-06_04__inlines__code_spans__017:
- spec_txt_example_position: 354
- source_specification: commonmark
-06_04__inlines__code_spans__018:
- spec_txt_example_position: 355
- source_specification: commonmark
-06_04__inlines__code_spans__019:
- spec_txt_example_position: 356
- source_specification: commonmark
-06_04__inlines__code_spans__020:
- spec_txt_example_position: 357
- source_specification: commonmark
-06_04__inlines__code_spans__021:
- spec_txt_example_position: 358
- source_specification: commonmark
-06_04__inlines__code_spans__022:
- spec_txt_example_position: 359
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__001:
- spec_txt_example_position: 360
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__002:
- spec_txt_example_position: 361
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__003:
- spec_txt_example_position: 362
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__004:
- spec_txt_example_position: 363
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__005:
- spec_txt_example_position: 364
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__006:
- spec_txt_example_position: 365
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__007:
- spec_txt_example_position: 366
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__008:
- spec_txt_example_position: 367
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__009:
- spec_txt_example_position: 368
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__010:
- spec_txt_example_position: 369
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__011:
- spec_txt_example_position: 370
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__012:
- spec_txt_example_position: 371
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__013:
- spec_txt_example_position: 372
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__014:
- spec_txt_example_position: 373
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__015:
- spec_txt_example_position: 374
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__016:
- spec_txt_example_position: 375
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__017:
- spec_txt_example_position: 376
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__018:
- spec_txt_example_position: 377
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__019:
- spec_txt_example_position: 378
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__020:
- spec_txt_example_position: 379
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__021:
- spec_txt_example_position: 380
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__022:
- spec_txt_example_position: 381
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__023:
- spec_txt_example_position: 382
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__024:
- spec_txt_example_position: 383
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__025:
- spec_txt_example_position: 384
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__026:
- spec_txt_example_position: 385
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__027:
- spec_txt_example_position: 386
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__028:
- spec_txt_example_position: 387
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__029:
- spec_txt_example_position: 388
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__030:
- spec_txt_example_position: 389
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__031:
- spec_txt_example_position: 390
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__032:
- spec_txt_example_position: 391
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__033:
- spec_txt_example_position: 392
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__034:
- spec_txt_example_position: 393
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__035:
- spec_txt_example_position: 394
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__036:
- spec_txt_example_position: 395
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__037:
- spec_txt_example_position: 396
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__038:
- spec_txt_example_position: 397
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__039:
- spec_txt_example_position: 398
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__040:
- spec_txt_example_position: 399
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__041:
- spec_txt_example_position: 400
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__042:
- spec_txt_example_position: 401
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__043:
- spec_txt_example_position: 402
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__044:
- spec_txt_example_position: 403
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__045:
- spec_txt_example_position: 404
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__046:
- spec_txt_example_position: 405
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__047:
- spec_txt_example_position: 406
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__048:
- spec_txt_example_position: 407
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__049:
- spec_txt_example_position: 408
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__050:
- spec_txt_example_position: 409
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__051:
- spec_txt_example_position: 410
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__052:
- spec_txt_example_position: 411
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__053:
- spec_txt_example_position: 412
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__054:
- spec_txt_example_position: 413
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__055:
- spec_txt_example_position: 414
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__056:
- spec_txt_example_position: 415
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__057:
- spec_txt_example_position: 416
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__058:
- spec_txt_example_position: 417
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__059:
- spec_txt_example_position: 418
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__060:
- spec_txt_example_position: 419
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__061:
- spec_txt_example_position: 420
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__062:
- spec_txt_example_position: 421
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__063:
- spec_txt_example_position: 422
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__064:
- spec_txt_example_position: 423
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__065:
- spec_txt_example_position: 424
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__066:
- spec_txt_example_position: 425
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__067:
- spec_txt_example_position: 426
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__068:
- spec_txt_example_position: 427
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__069:
- spec_txt_example_position: 428
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__070:
- spec_txt_example_position: 429
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__071:
- spec_txt_example_position: 430
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__072:
- spec_txt_example_position: 431
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__073:
- spec_txt_example_position: 432
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__074:
- spec_txt_example_position: 433
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__075:
- spec_txt_example_position: 434
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__076:
- spec_txt_example_position: 435
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__077:
- spec_txt_example_position: 436
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__078:
- spec_txt_example_position: 437
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__079:
- spec_txt_example_position: 438
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__080:
- spec_txt_example_position: 439
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__081:
- spec_txt_example_position: 440
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__082:
- spec_txt_example_position: 441
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__083:
- spec_txt_example_position: 442
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__084:
- spec_txt_example_position: 443
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__085:
- spec_txt_example_position: 444
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__086:
- spec_txt_example_position: 445
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__087:
- spec_txt_example_position: 446
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__088:
- spec_txt_example_position: 447
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__089:
- spec_txt_example_position: 448
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__090:
- spec_txt_example_position: 449
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__091:
- spec_txt_example_position: 450
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__092:
- spec_txt_example_position: 451
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__093:
- spec_txt_example_position: 452
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__094:
- spec_txt_example_position: 453
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__095:
- spec_txt_example_position: 454
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__096:
- spec_txt_example_position: 455
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__097:
- spec_txt_example_position: 456
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__098:
- spec_txt_example_position: 457
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__099:
- spec_txt_example_position: 458
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__100:
- spec_txt_example_position: 459
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__101:
- spec_txt_example_position: 460
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__102:
- spec_txt_example_position: 461
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__103:
- spec_txt_example_position: 462
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__104:
- spec_txt_example_position: 463
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__105:
- spec_txt_example_position: 464
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__106:
- spec_txt_example_position: 465
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__107:
- spec_txt_example_position: 466
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__108:
- spec_txt_example_position: 467
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__109:
- spec_txt_example_position: 468
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__110:
- spec_txt_example_position: 469
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__111:
- spec_txt_example_position: 470
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__112:
- spec_txt_example_position: 471
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__113:
- spec_txt_example_position: 472
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__114:
- spec_txt_example_position: 473
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__115:
- spec_txt_example_position: 474
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__116:
- spec_txt_example_position: 475
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__117:
- spec_txt_example_position: 476
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__118:
- spec_txt_example_position: 477
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__119:
- spec_txt_example_position: 478
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__120:
- spec_txt_example_position: 479
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__121:
- spec_txt_example_position: 480
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__122:
- spec_txt_example_position: 481
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__123:
- spec_txt_example_position: 482
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__124:
- spec_txt_example_position: 483
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__125:
- spec_txt_example_position: 484
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__126:
- spec_txt_example_position: 485
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__127:
- spec_txt_example_position: 486
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__128:
- spec_txt_example_position: 487
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__129:
- spec_txt_example_position: 488
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__130:
- spec_txt_example_position: 489
- source_specification: commonmark
-06_05__inlines__emphasis_and_strong_emphasis__131:
- spec_txt_example_position: 490
- source_specification: commonmark
-06_06__inlines__strikethrough_extension__001:
- spec_txt_example_position: 491
- source_specification: github
-06_06__inlines__strikethrough_extension__002:
- spec_txt_example_position: 492
- source_specification: github
-06_07__inlines__links__001:
- spec_txt_example_position: 493
- source_specification: commonmark
-06_07__inlines__links__002:
- spec_txt_example_position: 494
- source_specification: commonmark
-06_07__inlines__links__003:
- spec_txt_example_position: 495
- source_specification: commonmark
-06_07__inlines__links__004:
- spec_txt_example_position: 496
- source_specification: commonmark
-06_07__inlines__links__005:
- spec_txt_example_position: 497
- source_specification: commonmark
-06_07__inlines__links__006:
- spec_txt_example_position: 498
- source_specification: commonmark
-06_07__inlines__links__007:
- spec_txt_example_position: 499
- source_specification: commonmark
-06_07__inlines__links__008:
- spec_txt_example_position: 500
- source_specification: commonmark
-06_07__inlines__links__009:
- spec_txt_example_position: 501
- source_specification: commonmark
-06_07__inlines__links__010:
- spec_txt_example_position: 502
- source_specification: commonmark
-06_07__inlines__links__011:
- spec_txt_example_position: 503
- source_specification: commonmark
-06_07__inlines__links__012:
- spec_txt_example_position: 504
- source_specification: commonmark
-06_07__inlines__links__013:
- spec_txt_example_position: 505
- source_specification: commonmark
-06_07__inlines__links__014:
- spec_txt_example_position: 506
- source_specification: commonmark
-06_07__inlines__links__015:
- spec_txt_example_position: 507
- source_specification: commonmark
-06_07__inlines__links__016:
- spec_txt_example_position: 508
- source_specification: commonmark
-06_07__inlines__links__017:
- spec_txt_example_position: 509
- source_specification: commonmark
-06_07__inlines__links__018:
- spec_txt_example_position: 510
- source_specification: commonmark
-06_07__inlines__links__019:
- spec_txt_example_position: 511
- source_specification: commonmark
-06_07__inlines__links__020:
- spec_txt_example_position: 512
- source_specification: commonmark
-06_07__inlines__links__021:
- spec_txt_example_position: 513
- source_specification: commonmark
-06_07__inlines__links__022:
- spec_txt_example_position: 514
- source_specification: commonmark
-06_07__inlines__links__023:
- spec_txt_example_position: 515
- source_specification: commonmark
-06_07__inlines__links__024:
- spec_txt_example_position: 516
- source_specification: commonmark
-06_07__inlines__links__025:
- spec_txt_example_position: 517
- source_specification: commonmark
-06_07__inlines__links__026:
- spec_txt_example_position: 518
- source_specification: commonmark
-06_07__inlines__links__027:
- spec_txt_example_position: 519
- source_specification: commonmark
-06_07__inlines__links__028:
- spec_txt_example_position: 520
- source_specification: commonmark
-06_07__inlines__links__029:
- spec_txt_example_position: 521
- source_specification: commonmark
-06_07__inlines__links__030:
- spec_txt_example_position: 522
- source_specification: commonmark
-06_07__inlines__links__031:
- spec_txt_example_position: 523
- source_specification: commonmark
-06_07__inlines__links__032:
- spec_txt_example_position: 524
- source_specification: commonmark
-06_07__inlines__links__033:
- spec_txt_example_position: 525
- source_specification: commonmark
-06_07__inlines__links__034:
- spec_txt_example_position: 526
- source_specification: commonmark
-06_07__inlines__links__035:
- spec_txt_example_position: 527
- source_specification: commonmark
-06_07__inlines__links__036:
- spec_txt_example_position: 528
- source_specification: commonmark
-06_07__inlines__links__037:
- spec_txt_example_position: 529
- source_specification: commonmark
-06_07__inlines__links__038:
- spec_txt_example_position: 530
- source_specification: commonmark
-06_07__inlines__links__039:
- spec_txt_example_position: 531
- source_specification: commonmark
-06_07__inlines__links__040:
- spec_txt_example_position: 532
- source_specification: commonmark
-06_07__inlines__links__041:
- spec_txt_example_position: 533
- source_specification: commonmark
-06_07__inlines__links__042:
- spec_txt_example_position: 534
- source_specification: commonmark
-06_07__inlines__links__043:
- spec_txt_example_position: 535
- source_specification: commonmark
-06_07__inlines__links__044:
- spec_txt_example_position: 536
- source_specification: commonmark
-06_07__inlines__links__045:
- spec_txt_example_position: 537
- source_specification: commonmark
-06_07__inlines__links__046:
- spec_txt_example_position: 538
- source_specification: commonmark
-06_07__inlines__links__047:
- spec_txt_example_position: 539
- source_specification: commonmark
-06_07__inlines__links__048:
- spec_txt_example_position: 540
- source_specification: commonmark
-06_07__inlines__links__049:
- spec_txt_example_position: 541
- source_specification: commonmark
-06_07__inlines__links__050:
- spec_txt_example_position: 542
- source_specification: commonmark
-06_07__inlines__links__051:
- spec_txt_example_position: 543
- source_specification: commonmark
-06_07__inlines__links__052:
- spec_txt_example_position: 544
- source_specification: commonmark
-06_07__inlines__links__053:
- spec_txt_example_position: 545
- source_specification: commonmark
-06_07__inlines__links__054:
- spec_txt_example_position: 546
- source_specification: commonmark
-06_07__inlines__links__055:
- spec_txt_example_position: 547
- source_specification: commonmark
-06_07__inlines__links__056:
- spec_txt_example_position: 548
- source_specification: commonmark
-06_07__inlines__links__057:
- spec_txt_example_position: 549
- source_specification: commonmark
-06_07__inlines__links__058:
- spec_txt_example_position: 550
- source_specification: commonmark
-06_07__inlines__links__059:
- spec_txt_example_position: 551
- source_specification: commonmark
-06_07__inlines__links__060:
- spec_txt_example_position: 552
- source_specification: commonmark
-06_07__inlines__links__061:
- spec_txt_example_position: 553
- source_specification: commonmark
-06_07__inlines__links__062:
- spec_txt_example_position: 554
- source_specification: commonmark
-06_07__inlines__links__063:
- spec_txt_example_position: 555
- source_specification: commonmark
-06_07__inlines__links__064:
- spec_txt_example_position: 556
- source_specification: commonmark
-06_07__inlines__links__065:
- spec_txt_example_position: 557
- source_specification: commonmark
-06_07__inlines__links__066:
- spec_txt_example_position: 558
- source_specification: commonmark
-06_07__inlines__links__067:
- spec_txt_example_position: 559
- source_specification: commonmark
-06_07__inlines__links__068:
- spec_txt_example_position: 560
- source_specification: commonmark
-06_07__inlines__links__069:
- spec_txt_example_position: 561
- source_specification: commonmark
-06_07__inlines__links__070:
- spec_txt_example_position: 562
- source_specification: commonmark
-06_07__inlines__links__071:
- spec_txt_example_position: 563
- source_specification: commonmark
-06_07__inlines__links__072:
- spec_txt_example_position: 564
- source_specification: commonmark
-06_07__inlines__links__073:
- spec_txt_example_position: 565
- source_specification: commonmark
-06_07__inlines__links__074:
- spec_txt_example_position: 566
- source_specification: commonmark
-06_07__inlines__links__075:
- spec_txt_example_position: 567
- source_specification: commonmark
-06_07__inlines__links__076:
- spec_txt_example_position: 568
- source_specification: commonmark
-06_07__inlines__links__077:
- spec_txt_example_position: 569
- source_specification: commonmark
-06_07__inlines__links__078:
- spec_txt_example_position: 570
- source_specification: commonmark
-06_07__inlines__links__079:
- spec_txt_example_position: 571
- source_specification: commonmark
-06_07__inlines__links__080:
- spec_txt_example_position: 572
- source_specification: commonmark
-06_07__inlines__links__081:
- spec_txt_example_position: 573
- source_specification: commonmark
-06_07__inlines__links__082:
- spec_txt_example_position: 574
- source_specification: commonmark
-06_07__inlines__links__083:
- spec_txt_example_position: 575
- source_specification: commonmark
-06_07__inlines__links__084:
- spec_txt_example_position: 576
- source_specification: commonmark
-06_07__inlines__links__085:
- spec_txt_example_position: 577
- source_specification: commonmark
-06_07__inlines__links__086:
- spec_txt_example_position: 578
- source_specification: commonmark
-06_07__inlines__links__087:
- spec_txt_example_position: 579
- source_specification: commonmark
-06_08__inlines__images__001:
- spec_txt_example_position: 580
- source_specification: commonmark
-06_08__inlines__images__002:
- spec_txt_example_position: 581
- source_specification: commonmark
-06_08__inlines__images__003:
- spec_txt_example_position: 582
- source_specification: commonmark
-06_08__inlines__images__004:
- spec_txt_example_position: 583
- source_specification: commonmark
-06_08__inlines__images__005:
- spec_txt_example_position: 584
- source_specification: commonmark
-06_08__inlines__images__006:
- spec_txt_example_position: 585
- source_specification: commonmark
-06_08__inlines__images__007:
- spec_txt_example_position: 586
- source_specification: commonmark
-06_08__inlines__images__008:
- spec_txt_example_position: 587
- source_specification: commonmark
-06_08__inlines__images__009:
- spec_txt_example_position: 588
- source_specification: commonmark
-06_08__inlines__images__010:
- spec_txt_example_position: 589
- source_specification: commonmark
-06_08__inlines__images__011:
- spec_txt_example_position: 590
- source_specification: commonmark
-06_08__inlines__images__012:
- spec_txt_example_position: 591
- source_specification: commonmark
-06_08__inlines__images__013:
- spec_txt_example_position: 592
- source_specification: commonmark
-06_08__inlines__images__014:
- spec_txt_example_position: 593
- source_specification: commonmark
-06_08__inlines__images__015:
- spec_txt_example_position: 594
- source_specification: commonmark
-06_08__inlines__images__016:
- spec_txt_example_position: 595
- source_specification: commonmark
-06_08__inlines__images__017:
- spec_txt_example_position: 596
- source_specification: commonmark
-06_08__inlines__images__018:
- spec_txt_example_position: 597
- source_specification: commonmark
-06_08__inlines__images__019:
- spec_txt_example_position: 598
- source_specification: commonmark
-06_08__inlines__images__020:
- spec_txt_example_position: 599
- source_specification: commonmark
-06_08__inlines__images__021:
- spec_txt_example_position: 600
- source_specification: commonmark
-06_08__inlines__images__022:
- spec_txt_example_position: 601
- source_specification: commonmark
-06_09__inlines__autolinks__001:
- spec_txt_example_position: 602
- source_specification: commonmark
-06_09__inlines__autolinks__002:
- spec_txt_example_position: 603
- source_specification: commonmark
-06_09__inlines__autolinks__003:
- spec_txt_example_position: 604
- source_specification: commonmark
-06_09__inlines__autolinks__004:
- spec_txt_example_position: 605
- source_specification: commonmark
-06_09__inlines__autolinks__005:
- spec_txt_example_position: 606
- source_specification: commonmark
-06_09__inlines__autolinks__006:
- spec_txt_example_position: 607
- source_specification: commonmark
-06_09__inlines__autolinks__007:
- spec_txt_example_position: 608
- source_specification: commonmark
-06_09__inlines__autolinks__008:
- spec_txt_example_position: 609
- source_specification: commonmark
-06_09__inlines__autolinks__009:
- spec_txt_example_position: 610
- source_specification: commonmark
-06_09__inlines__autolinks__010:
- spec_txt_example_position: 611
- source_specification: commonmark
-06_09__inlines__autolinks__011:
- spec_txt_example_position: 612
- source_specification: commonmark
-06_09__inlines__autolinks__012:
- spec_txt_example_position: 613
- source_specification: commonmark
-06_09__inlines__autolinks__013:
- spec_txt_example_position: 614
- source_specification: commonmark
-06_09__inlines__autolinks__014:
- spec_txt_example_position: 615
- source_specification: commonmark
-06_09__inlines__autolinks__015:
- spec_txt_example_position: 616
- source_specification: commonmark
-06_09__inlines__autolinks__016:
- spec_txt_example_position: 617
- source_specification: commonmark
-06_09__inlines__autolinks__017:
- spec_txt_example_position: 618
- source_specification: commonmark
-06_09__inlines__autolinks__018:
- spec_txt_example_position: 619
- source_specification: commonmark
-06_09__inlines__autolinks__019:
- spec_txt_example_position: 620
- source_specification: commonmark
-06_10__inlines__autolinks_extension__001:
- spec_txt_example_position: 621
- source_specification: github
-06_10__inlines__autolinks_extension__002:
- spec_txt_example_position: 622
- source_specification: github
-06_10__inlines__autolinks_extension__003:
- spec_txt_example_position: 623
- source_specification: github
-06_10__inlines__autolinks_extension__004:
- spec_txt_example_position: 624
- source_specification: github
-06_10__inlines__autolinks_extension__005:
- spec_txt_example_position: 625
- source_specification: github
-06_10__inlines__autolinks_extension__006:
- spec_txt_example_position: 626
- source_specification: github
-06_10__inlines__autolinks_extension__007:
- spec_txt_example_position: 627
- source_specification: github
-06_10__inlines__autolinks_extension__008:
- spec_txt_example_position: 628
- source_specification: github
-06_10__inlines__autolinks_extension__009:
- spec_txt_example_position: 629
- source_specification: github
-06_10__inlines__autolinks_extension__010:
- spec_txt_example_position: 630
- source_specification: github
-06_10__inlines__autolinks_extension__011:
- spec_txt_example_position: 631
- source_specification: github
-06_11__inlines__raw_html__001:
- spec_txt_example_position: 632
- source_specification: commonmark
-06_11__inlines__raw_html__002:
- spec_txt_example_position: 633
- source_specification: commonmark
-06_11__inlines__raw_html__003:
- spec_txt_example_position: 634
- source_specification: commonmark
-06_11__inlines__raw_html__004:
- spec_txt_example_position: 635
- source_specification: commonmark
-06_11__inlines__raw_html__005:
- spec_txt_example_position: 636
- source_specification: commonmark
-06_11__inlines__raw_html__006:
- spec_txt_example_position: 637
- source_specification: commonmark
-06_11__inlines__raw_html__007:
- spec_txt_example_position: 638
- source_specification: commonmark
-06_11__inlines__raw_html__008:
- spec_txt_example_position: 639
- source_specification: commonmark
-06_11__inlines__raw_html__009:
- spec_txt_example_position: 640
- source_specification: commonmark
-06_11__inlines__raw_html__010:
- spec_txt_example_position: 641
- source_specification: commonmark
-06_11__inlines__raw_html__011:
- spec_txt_example_position: 642
- source_specification: commonmark
-06_11__inlines__raw_html__012:
- spec_txt_example_position: 643
- source_specification: commonmark
-06_11__inlines__raw_html__013:
- spec_txt_example_position: 644
- source_specification: commonmark
-06_11__inlines__raw_html__014:
- spec_txt_example_position: 645
- source_specification: commonmark
-06_11__inlines__raw_html__015:
- spec_txt_example_position: 646
- source_specification: commonmark
-06_11__inlines__raw_html__016:
- spec_txt_example_position: 647
- source_specification: commonmark
-06_11__inlines__raw_html__017:
- spec_txt_example_position: 648
- source_specification: commonmark
-06_11__inlines__raw_html__018:
- spec_txt_example_position: 649
- source_specification: commonmark
-06_11__inlines__raw_html__019:
- spec_txt_example_position: 650
- source_specification: commonmark
-06_11__inlines__raw_html__020:
- spec_txt_example_position: 651
- source_specification: commonmark
-06_11__inlines__raw_html__021:
- spec_txt_example_position: 652
- source_specification: commonmark
-06_12__inlines__disallowed_raw_html_extension__001:
- spec_txt_example_position: 653
- source_specification: github
-06_13__inlines__hard_line_breaks__001:
- spec_txt_example_position: 654
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__002:
- spec_txt_example_position: 655
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__003:
- spec_txt_example_position: 656
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__004:
- spec_txt_example_position: 657
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__005:
- spec_txt_example_position: 658
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__006:
- spec_txt_example_position: 659
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__007:
- spec_txt_example_position: 660
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__008:
- spec_txt_example_position: 661
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__009:
- spec_txt_example_position: 662
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__010:
- spec_txt_example_position: 663
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__011:
- spec_txt_example_position: 664
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__012:
- spec_txt_example_position: 665
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__013:
- spec_txt_example_position: 666
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__014:
- spec_txt_example_position: 667
- source_specification: commonmark
-06_13__inlines__hard_line_breaks__015:
- spec_txt_example_position: 668
- source_specification: commonmark
-06_14__inlines__soft_line_breaks__001:
- spec_txt_example_position: 669
- source_specification: commonmark
-06_14__inlines__soft_line_breaks__002:
- spec_txt_example_position: 670
- source_specification: commonmark
-06_15__inlines__textual_content__001:
- spec_txt_example_position: 671
- source_specification: commonmark
-06_15__inlines__textual_content__002:
- spec_txt_example_position: 672
- source_specification: commonmark
-06_15__inlines__textual_content__003:
- spec_txt_example_position: 673
- source_specification: commonmark
-07_01__gitlab_specific_markdown__footnotes__001:
- spec_txt_example_position: 674
- source_specification: gitlab
diff --git a/spec/fixtures/glfm/example_snapshots/html.yml b/spec/fixtures/glfm/example_snapshots/html.yml
deleted file mode 100644
index b9deadcb4cb..00000000000
--- a/spec/fixtures/glfm/example_snapshots/html.yml
+++ /dev/null
@@ -1,7479 +0,0 @@
----
-02_01__preliminaries__tabs__001:
- canonical: "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n"
- static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
- data-sourcepos=\"1:2-1:13\" class=\"code highlight js-syntax-highlight language-plaintext\"
- lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
- class=\"line\" lang=\"plaintext\">foo\tbaz\t\tbim</span></code></pre>\n<copy-code></copy-code>\n</div>"
- wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>foo\tbaz\t\tbim</code></pre>"
-02_01__preliminaries__tabs__002:
- canonical: "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n"
- static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
- data-sourcepos=\"1:4-1:15\" class=\"code highlight js-syntax-highlight language-plaintext\"
- lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
- class=\"line\" lang=\"plaintext\">foo\tbaz\t\tbim</span></code></pre>\n<copy-code></copy-code>\n</div>"
- wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>foo\tbaz\t\tbim</code></pre>"
-02_01__preliminaries__tabs__003:
- canonical: "<pre><code>a\ta\ná½\ta\n</code></pre>\n"
- static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
- data-sourcepos=\"1:5-2:9\" class=\"code highlight js-syntax-highlight language-plaintext\"
- lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
- class=\"line\" lang=\"plaintext\">a\ta</span>\n<span id=\"LC2\" class=\"line\"
- lang=\"plaintext\">á½\ta</span></code></pre>\n<copy-code></copy-code>\n</div>"
- wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>a\ta\ná½\ta</code></pre>"
-02_01__preliminaries__tabs__004:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <p>bar</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:3-3:4" dir="auto">
- <li data-sourcepos="1:3-3:4">
- <p data-sourcepos="1:5-1:7">foo</p>
- <p data-sourcepos="3:2-3:4">bar</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
-02_01__preliminaries__tabs__005:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <pre><code> bar
- </code></pre>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-3:5" dir="auto">
- <li data-sourcepos="1:1-3:5">
- <p data-sourcepos="1:3-1:5">foo</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:2-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code> bar</code></pre></li></ul>
-02_01__preliminaries__tabs__006:
- canonical: |
- <blockquote>
- <pre><code> foo
- </code></pre>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-1:6" dir="auto">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:3-1:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code> foo</code></pre></blockquote>
-02_01__preliminaries__tabs__007:
- canonical: |
- <ul>
- <li>
- <pre><code> foo
- </code></pre>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-1:6" dir="auto">
- <li data-sourcepos="1:1-1:6">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:3-1:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code> foo</code></pre></li></ul>
-02_01__preliminaries__tabs__008:
- canonical: |
- <pre><code>foo
- bar
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-2:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span>
- <span id="LC2" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>foo
- bar</code></pre>
-02_01__preliminaries__tabs__009:
- canonical: |
- <ul>
- <li>foo
- <ul>
- <li>bar
- <ul>
- <li>baz</li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:2-3:7" dir="auto">
- <li data-sourcepos="1:2-3:7">foo
- <ul data-sourcepos="2:4-3:7">
- <li data-sourcepos="2:4-3:7">bar
- <ul data-sourcepos="3:3-3:7">
- <li data-sourcepos="3:3-3:7">baz</li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p><ul bullet="*"><li><p>baz</p></li></ul></li></ul></li></ul>
-02_01__preliminaries__tabs__010:
- canonical: |
- <h1>Foo</h1>
- static: |-
- <h1 data-sourcepos="1:1-1:5" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
- wysiwyg: |-
- <h1>Foo</h1>
-02_01__preliminaries__tabs__011:
- canonical: |
- <hr />
- static: |-
- <hr data-sourcepos="1:1-1:6">
- wysiwyg: |-
- <hr>
-03_01__blocks_and_inlines__precedence__001:
- canonical: |
- <ul>
- <li>`one</li>
- <li>two`</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-2:6" dir="auto">
- <li data-sourcepos="1:1-1:6">`one</li>
- <li data-sourcepos="2:1-2:6">two`</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>`one</p></li><li><p>two`</p></li></ul>
-04_01__leaf_blocks__thematic_breaks__001:
- canonical: |
- <hr />
- <hr />
- <hr />
- static: |-
- <hr data-sourcepos="1:1-1:3">
- <hr data-sourcepos="2:1-2:3">
- <hr data-sourcepos="3:1-3:3">
- wysiwyg: |-
- <hr>
-04_01__leaf_blocks__thematic_breaks__002:
- canonical: |
- <p>+++</p>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">+++</p>
- wysiwyg: |-
- <p>+++</p>
-04_01__leaf_blocks__thematic_breaks__003:
- canonical: |
- <p>===</p>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">===</p>
- wysiwyg: |-
- <p>===</p>
-04_01__leaf_blocks__thematic_breaks__004:
- canonical: |
- <p>--
- **
- __</p>
- static: |-
- <p data-sourcepos="1:1-3:2" dir="auto">--
- **
- __</p>
- wysiwyg: |-
- <p>--
- **
- __</p>
-04_01__leaf_blocks__thematic_breaks__005:
- canonical: |
- <hr />
- <hr />
- <hr />
- static: |-
- <hr data-sourcepos="1:2-1:4">
- <hr data-sourcepos="2:3-2:5">
- <hr data-sourcepos="3:4-3:6">
- wysiwyg: |-
- <hr>
-04_01__leaf_blocks__thematic_breaks__006:
- canonical: |
- <pre><code>***
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>***</code></pre>
-04_01__leaf_blocks__thematic_breaks__007:
- canonical: |
- <p>Foo
- ***</p>
- static: |-
- <p data-sourcepos="1:1-2:7" dir="auto">Foo
- ***</p>
- wysiwyg: |-
- <p>Foo
- ***</p>
-04_01__leaf_blocks__thematic_breaks__008:
- canonical: |
- <hr />
- static: |-
- <hr data-sourcepos="1:1-1:37">
- wysiwyg: |-
- <hr>
-04_01__leaf_blocks__thematic_breaks__009:
- canonical: |
- <hr />
- static: |-
- <hr data-sourcepos="1:2-1:6">
- wysiwyg: |-
- <hr>
-04_01__leaf_blocks__thematic_breaks__010:
- canonical: |
- <hr />
- static: |-
- <hr data-sourcepos="1:2-1:19">
- wysiwyg: |-
- <hr>
-04_01__leaf_blocks__thematic_breaks__011:
- canonical: |
- <hr />
- static: |-
- <hr data-sourcepos="1:1-1:21">
- wysiwyg: |-
- <hr>
-04_01__leaf_blocks__thematic_breaks__012:
- canonical: |
- <hr />
- static: |-
- <hr data-sourcepos="1:1-1:11">
- wysiwyg: |-
- <hr>
-04_01__leaf_blocks__thematic_breaks__013:
- canonical: |
- <p>_ _ _ _ a</p>
- <p>a------</p>
- <p>---a---</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">_ _ _ _ a</p>
- <p data-sourcepos="3:1-3:7" dir="auto">a------</p>
- <p data-sourcepos="5:1-5:7" dir="auto">---a---</p>
- wysiwyg: |-
- <p>_ _ _ _ a</p>
-04_01__leaf_blocks__thematic_breaks__014:
- canonical: |
- <p><em>-</em></p>
- static: |-
- <p data-sourcepos="1:2-1:4" dir="auto"><em>-</em></p>
- wysiwyg: |-
- <p><em>-</em></p>
-04_01__leaf_blocks__thematic_breaks__015:
- canonical: |
- <ul>
- <li>foo</li>
- </ul>
- <hr />
- <ul>
- <li>bar</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-1:5" dir="auto">
- <li data-sourcepos="1:1-1:5">foo</li>
- </ul>
- <hr data-sourcepos="2:1-2:3">
- <ul data-sourcepos="3:1-3:5" dir="auto">
- <li data-sourcepos="3:1-3:5">bar</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li></ul>
-04_01__leaf_blocks__thematic_breaks__016:
- canonical: |
- <p>Foo</p>
- <hr />
- <p>bar</p>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
- <hr data-sourcepos="2:1-2:3">
- <p data-sourcepos="3:1-3:3" dir="auto">bar</p>
- wysiwyg: |-
- <p>Foo</p>
-04_01__leaf_blocks__thematic_breaks__017:
- canonical: |
- <h2>Foo</h2>
- <p>bar</p>
- static: |-
- <h2 data-sourcepos="1:1-3:3" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
- <p data-sourcepos="3:1-3:3" dir="auto">bar</p>
- wysiwyg: |-
- <h2>Foo</h2>
-04_01__leaf_blocks__thematic_breaks__018:
- canonical: |
- <ul>
- <li>Foo</li>
- </ul>
- <hr />
- <ul>
- <li>Bar</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-1:5" dir="auto">
- <li data-sourcepos="1:1-1:5">Foo</li>
- </ul>
- <hr data-sourcepos="2:1-2:5">
- <ul data-sourcepos="3:1-3:5" dir="auto">
- <li data-sourcepos="3:1-3:5">Bar</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>Foo</p></li></ul>
-04_01__leaf_blocks__thematic_breaks__019:
- canonical: |
- <ul>
- <li>Foo</li>
- <li>
- <hr />
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-2:7" dir="auto">
- <li data-sourcepos="1:1-1:5">Foo</li>
- <li data-sourcepos="2:1-2:7">
- <hr data-sourcepos="2:3-2:7">
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>Foo</p></li><li><p></p><hr></li></ul>
-04_02__leaf_blocks__atx_headings__001:
- canonical: |
- <h1>foo</h1>
- <h2>foo</h2>
- <h3>foo</h3>
- <h4>foo</h4>
- <h5>foo</h5>
- <h6>foo</h6>
- static: |-
- <h1 data-sourcepos="1:1-1:5" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>
- <h2 data-sourcepos="2:1-2:6" dir="auto">
- <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h2>
- <h3 data-sourcepos="3:1-3:7" dir="auto">
- <a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>foo</h3>
- <h4 data-sourcepos="4:1-4:8" dir="auto">
- <a id="user-content-foo-3" class="anchor" href="#foo-3" aria-hidden="true"></a>foo</h4>
- <h5 data-sourcepos="5:1-5:9" dir="auto">
- <a id="user-content-foo-4" class="anchor" href="#foo-4" aria-hidden="true"></a>foo</h5>
- <h6 data-sourcepos="6:1-6:10" dir="auto">
- <a id="user-content-foo-5" class="anchor" href="#foo-5" aria-hidden="true"></a>foo</h6>
- wysiwyg: |-
- <h1>foo</h1>
-04_02__leaf_blocks__atx_headings__002:
- canonical: |
- <p>####### foo</p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto">####### foo</p>
- wysiwyg: |-
- <p>####### foo</p>
-04_02__leaf_blocks__atx_headings__003:
- canonical: |
- <p>#5 bolt</p>
- <p>#hashtag</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">#5 bolt</p>
- <p data-sourcepos="3:1-3:8" dir="auto">#hashtag</p>
- wysiwyg: |-
- <p>#5 bolt</p>
-04_02__leaf_blocks__atx_headings__004:
- canonical: |
- <p>## foo</p>
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto"><span>#</span># foo</p>
- wysiwyg: |-
- <p>## foo</p>
-04_02__leaf_blocks__atx_headings__005:
- canonical: |
- <h1>foo <em>bar</em> *baz*</h1>
- static: |-
- <h1 data-sourcepos="1:1-1:19" dir="auto">
- <a id="user-content-foo-bar-baz" class="anchor" href="#foo-bar-baz" aria-hidden="true"></a>foo <em>bar</em> *baz*</h1>
- wysiwyg: |-
- <h1>foo <em>bar</em> *baz*</h1>
-04_02__leaf_blocks__atx_headings__006:
- canonical: |
- <h1>foo</h1>
- static: |-
- <h1 data-sourcepos="1:1-1:22" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>
- wysiwyg: |-
- <h1>foo</h1>
-04_02__leaf_blocks__atx_headings__007:
- canonical: |
- <h3>foo</h3>
- <h2>foo</h2>
- <h1>foo</h1>
- static: |-
- <h3 data-sourcepos="1:2-1:8" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h3>
- <h2 data-sourcepos="2:3-2:8" dir="auto">
- <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h2>
- <h1 data-sourcepos="3:4-3:8" dir="auto">
- <a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>foo</h1>
- wysiwyg: |-
- <h3>foo</h3>
-04_02__leaf_blocks__atx_headings__008:
- canonical: |
- <pre><code># foo
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code># foo</code></pre>
-04_02__leaf_blocks__atx_headings__009:
- canonical: |
- <p>foo
- # bar</p>
- static: |-
- <p data-sourcepos="1:1-2:9" dir="auto">foo
- # bar</p>
- wysiwyg: |-
- <p>foo
- # bar</p>
-04_02__leaf_blocks__atx_headings__010:
- canonical: |
- <h2>foo</h2>
- <h3>bar</h3>
- static: |-
- <h2 data-sourcepos="1:1-1:6" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>
- <h3 data-sourcepos="2:3-2:11" dir="auto">
- <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h3>
- wysiwyg: |-
- <h2>foo</h2>
-04_02__leaf_blocks__atx_headings__011:
- canonical: |
- <h1>foo</h1>
- <h5>foo</h5>
- static: |-
- <h1 data-sourcepos="1:1-1:5" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>
- <h5 data-sourcepos="2:1-2:9" dir="auto">
- <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h5>
- wysiwyg: |-
- <h1>foo</h1>
-04_02__leaf_blocks__atx_headings__012:
- canonical: |
- <h3>foo</h3>
- static: |-
- <h3 data-sourcepos="1:1-1:7" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h3>
- wysiwyg: |-
- <h3>foo</h3>
-04_02__leaf_blocks__atx_headings__013:
- canonical: |
- <h3>foo ### b</h3>
- static: |-
- <h3 data-sourcepos="1:1-1:13" dir="auto">
- <a id="user-content-foo-b" class="anchor" href="#foo-b" aria-hidden="true"></a>foo ### b</h3>
- wysiwyg: |-
- <h3>foo ### b</h3>
-04_02__leaf_blocks__atx_headings__014:
- canonical: |
- <h1>foo#</h1>
- static: |-
- <h1 data-sourcepos="1:1-1:6" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo#</h1>
- wysiwyg: |-
- <h1>foo#</h1>
-04_02__leaf_blocks__atx_headings__015:
- canonical: |
- <h3>foo ###</h3>
- <h2>foo ###</h2>
- <h1>foo #</h1>
- static: |-
- <h3 data-sourcepos="1:1-1:32" dir="auto">
- <a id="user-content-foo-" class="anchor" href="#foo-" aria-hidden="true"></a>foo <span>#</span>##</h3>
- <h2 data-sourcepos="2:1-2:31" dir="auto">
- <a id="user-content-foo--1" class="anchor" href="#foo--1" aria-hidden="true"></a>foo #<span>#</span>#</h2>
- <h1 data-sourcepos="3:1-3:28" dir="auto">
- <a id="user-content-foo--2" class="anchor" href="#foo--2" aria-hidden="true"></a>foo <span>#</span>
- </h1>
- wysiwyg: |-
- <h3>foo ###</h3>
-04_02__leaf_blocks__atx_headings__016:
- canonical: |
- <hr />
- <h2>foo</h2>
- <hr />
- static: |-
- <hr data-sourcepos="1:1-1:4">
- <h2 data-sourcepos="2:1-2:6" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>
- <hr data-sourcepos="3:1-3:4">
- wysiwyg: |-
- <hr>
-04_02__leaf_blocks__atx_headings__017:
- canonical: |
- <p>Foo bar</p>
- <h1>baz</h1>
- <p>Bar foo</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">Foo bar</p>
- <h1 data-sourcepos="2:1-2:5" dir="auto">
- <a id="user-content-baz" class="anchor" href="#baz" aria-hidden="true"></a>baz</h1>
- <p data-sourcepos="3:1-3:7" dir="auto">Bar foo</p>
- wysiwyg: |-
- <p>Foo bar</p>
-04_02__leaf_blocks__atx_headings__018:
- canonical: |
- <h2></h2>
- <h1></h1>
- <h3></h3>
- static: |-
- <h2 data-sourcepos="1:1-1:3" dir="auto"></h2>
- <h1 data-sourcepos="2:1-2:1" dir="auto"></h1>
- <h3 data-sourcepos="3:1-3:3" dir="auto"></h3>
- wysiwyg: |-
- <h2></h2>
-04_03__leaf_blocks__setext_headings__001:
- canonical: |
- <h1>Foo <em>bar</em></h1>
- <h2>Foo <em>bar</em></h2>
- static: |-
- <h1 data-sourcepos="1:1-3:0" dir="auto">
- <a id="user-content-foo-bar" class="anchor" href="#foo-bar" aria-hidden="true"></a>Foo <em>bar</em>
- </h1>
- <h2 data-sourcepos="4:1-5:9" dir="auto">
- <a id="user-content-foo-bar-1" class="anchor" href="#foo-bar-1" aria-hidden="true"></a>Foo <em>bar</em>
- </h2>
- wysiwyg: |-
- <h1>Foo <em>bar</em></h1>
-04_03__leaf_blocks__setext_headings__002:
- canonical: |
- <h1>Foo <em>bar
- baz</em></h1>
- static: |-
- <h1 data-sourcepos="1:1-3:4" dir="auto">
- <a id="user-content-foo-barbaz" class="anchor" href="#foo-barbaz" aria-hidden="true"></a>Foo <em>bar
- baz</em>
- </h1>
- wysiwyg: |-
- <h1>Foo <em>bar
- baz</em></h1>
-04_03__leaf_blocks__setext_headings__003:
- canonical: |
- <h1>Foo <em>bar
- baz</em></h1>
- static: |-
- <h1 data-sourcepos="1:3-3:4" dir="auto">
- <a id="user-content-foo-barbaz" class="anchor" href="#foo-barbaz" aria-hidden="true"></a>Foo <em>bar
- baz</em>
- </h1>
- wysiwyg: |-
- <h1>Foo <em>bar
- baz</em></h1>
-04_03__leaf_blocks__setext_headings__004:
- canonical: |
- <h2>Foo</h2>
- <h1>Foo</h1>
- static: |-
- <h2 data-sourcepos="1:1-3:0" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
- <h1 data-sourcepos="4:1-5:1" dir="auto">
- <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>Foo</h1>
- wysiwyg: |-
- <h2>Foo</h2>
-04_03__leaf_blocks__setext_headings__005:
- canonical: |
- <h2>Foo</h2>
- <h2>Foo</h2>
- <h1>Foo</h1>
- static: |-
- <h2 data-sourcepos="1:4-3:0" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
- <h2 data-sourcepos="4:3-6:0" dir="auto">
- <a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>Foo</h2>
- <h1 data-sourcepos="7:3-8:5" dir="auto">
- <a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>Foo</h1>
- wysiwyg: |-
- <h2>Foo</h2>
-04_03__leaf_blocks__setext_headings__006:
- canonical: |
- <pre><code>Foo
- ---
-
- Foo
- </code></pre>
- <hr />
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-4:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span>
- <span id="LC2" class="line" lang="plaintext">---</span>
- <span id="LC3" class="line" lang="plaintext"></span>
- <span id="LC4" class="line" lang="plaintext">Foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- <hr data-sourcepos="5:1-5:3">
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>Foo
- ---
-
- Foo</code></pre>
-04_03__leaf_blocks__setext_headings__007:
- canonical: |
- <h2>Foo</h2>
- static: |-
- <h2 data-sourcepos="1:1-2:13" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
- wysiwyg: |-
- <h2>Foo</h2>
-04_03__leaf_blocks__setext_headings__008:
- canonical: |
- <p>Foo
- ---</p>
- static: |-
- <p data-sourcepos="1:1-2:7" dir="auto">Foo
- ---</p>
- wysiwyg: |-
- <p>Foo
- ---</p>
-04_03__leaf_blocks__setext_headings__009:
- canonical: |
- <p>Foo
- = =</p>
- <p>Foo</p>
- <hr />
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">Foo
- = =</p>
- <p data-sourcepos="4:1-4:3" dir="auto">Foo</p>
- <hr data-sourcepos="5:1-5:5">
- wysiwyg: |-
- <p>Foo
- = =</p>
-04_03__leaf_blocks__setext_headings__010:
- canonical: |
- <h2>Foo</h2>
- static: |-
- <h2 data-sourcepos="1:1-2:5" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>
- wysiwyg: |-
- <h2>Foo</h2>
-04_03__leaf_blocks__setext_headings__011:
- canonical: |
- <h2>Foo\</h2>
- static: |-
- <h2 data-sourcepos="1:1-2:4" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo\</h2>
- wysiwyg: |-
- <h2>Foo\</h2>
-04_03__leaf_blocks__setext_headings__012:
- canonical: |
- <h2>`Foo</h2>
- <p>`</p>
- <h2>&lt;a title=&quot;a lot</h2>
- <p>of dashes&quot;/&gt;</p>
- static: |-
- <h2 data-sourcepos="1:1-3:1" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>`Foo</h2>
- <p data-sourcepos="3:1-3:1" dir="auto">`</p>
- <h2 data-sourcepos="5:1-7:12" dir="auto">
- <a id="user-content-a-titlea-lot" class="anchor" href="#a-titlea-lot" aria-hidden="true"></a>&lt;a title="a lot</h2>
- <p data-sourcepos="7:1-7:12" dir="auto">of dashes"/&gt;</p>
- wysiwyg: |-
- <h2>`Foo</h2>
-04_03__leaf_blocks__setext_headings__013:
- canonical: |
- <blockquote>
- <p>Foo</p>
- </blockquote>
- <hr />
- static: |-
- <blockquote data-sourcepos="1:1-1:5" dir="auto">
- <p data-sourcepos="1:3-1:5">Foo</p>
- </blockquote>
- <hr data-sourcepos="2:1-2:3">
- wysiwyg: |-
- <blockquote multiline="false"><p>Foo</p></blockquote>
-04_03__leaf_blocks__setext_headings__014:
- canonical: |
- <blockquote>
- <p>foo
- bar
- ===</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:3" dir="auto">
- <p data-sourcepos="1:3-3:3">foo
- bar
- ===</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>foo
- bar
- ===</p></blockquote>
-04_03__leaf_blocks__setext_headings__015:
- canonical: |
- <ul>
- <li>Foo</li>
- </ul>
- <hr />
- static: |-
- <ul data-sourcepos="1:1-1:5" dir="auto">
- <li data-sourcepos="1:1-1:5">Foo</li>
- </ul>
- <hr data-sourcepos="2:1-2:3">
- wysiwyg: |-
- <ul bullet="*"><li><p>Foo</p></li></ul>
-04_03__leaf_blocks__setext_headings__016:
- canonical: |
- <h2>Foo
- Bar</h2>
- static: |-
- <h2 data-sourcepos="1:1-3:3" dir="auto">
- <a id="user-content-foobar" class="anchor" href="#foobar" aria-hidden="true"></a>Foo
- Bar</h2>
- wysiwyg: |-
- <h2>Foo
- Bar</h2>
-04_03__leaf_blocks__setext_headings__017:
- canonical: |
- <hr />
- <h2>Foo</h2>
- <h2>Bar</h2>
- <p>Baz</p>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-yaml" lang="yaml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="yaml"><span class="s">Foo</span></span></code></pre>
- <copy-code></copy-code>
- </div>
- <h2 data-sourcepos="4:1-6:3" dir="auto">
- <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>Bar</h2>
- <p data-sourcepos="6:1-6:3" dir="auto">Baz</p>
- wysiwyg: |-
- <hr>
-04_03__leaf_blocks__setext_headings__018:
- canonical: |
- <p>====</p>
- static: |-
- <p data-sourcepos="2:1-2:4" dir="auto">====</p>
- wysiwyg: |-
- <p>====</p>
-04_03__leaf_blocks__setext_headings__019:
- canonical: |
- <hr />
- <hr />
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-2:3" class="code highlight js-syntax-highlight language-yaml" lang="yaml" data-lang-params="frontmatter" v-pre="true"><code></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <hr>
-04_03__leaf_blocks__setext_headings__020:
- canonical: |
- <ul>
- <li>foo</li>
- </ul>
- <hr />
- static: |-
- <ul data-sourcepos="1:1-1:5" dir="auto">
- <li data-sourcepos="1:1-1:5">foo</li>
- </ul>
- <hr data-sourcepos="2:1-2:5">
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li></ul>
-04_03__leaf_blocks__setext_headings__021:
- canonical: |
- <pre><code>foo
- </code></pre>
- <hr />
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- <hr data-sourcepos="2:1-2:3">
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
-04_03__leaf_blocks__setext_headings__022:
- canonical: |
- <blockquote>
- <p>foo</p>
- </blockquote>
- <hr />
- static: |-
- <blockquote data-sourcepos="1:1-1:5" dir="auto">
- <p data-sourcepos="1:3-1:5">foo</p>
- </blockquote>
- <hr data-sourcepos="2:1-2:5">
- wysiwyg: |-
- <blockquote multiline="false"><p>foo</p></blockquote>
-04_03__leaf_blocks__setext_headings__023:
- canonical: |
- <h2>&gt; foo</h2>
- static: |-
- <h2 data-sourcepos="1:1-2:6" dir="auto">
- <a id="user-content--foo" class="anchor" href="#-foo" aria-hidden="true"></a>&gt; foo</h2>
- wysiwyg: |-
- <h2>&gt; foo</h2>
-04_03__leaf_blocks__setext_headings__024:
- canonical: |
- <p>Foo</p>
- <h2>bar</h2>
- <p>baz</p>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
- <h2 data-sourcepos="3:1-5:3" dir="auto">
- <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h2>
- <p data-sourcepos="5:1-5:3" dir="auto">baz</p>
- wysiwyg: |-
- <p>Foo</p>
-04_03__leaf_blocks__setext_headings__025:
- canonical: |
- <p>Foo
- bar</p>
- <hr />
- <p>baz</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">Foo
- bar</p>
- <hr data-sourcepos="4:1-5:0">
- <p data-sourcepos="6:1-6:3" dir="auto">baz</p>
- wysiwyg: |-
- <p>Foo
- bar</p>
-04_03__leaf_blocks__setext_headings__026:
- canonical: |
- <p>Foo
- bar</p>
- <hr />
- <p>baz</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">Foo
- bar</p>
- <hr data-sourcepos="3:1-3:5">
- <p data-sourcepos="4:1-4:3" dir="auto">baz</p>
- wysiwyg: |-
- <p>Foo
- bar</p>
-04_03__leaf_blocks__setext_headings__027:
- canonical: |
- <p>Foo
- bar
- ---
- baz</p>
- static: |-
- <p data-sourcepos="1:1-4:3" dir="auto">Foo
- bar
- ---
- baz</p>
- wysiwyg: |-
- <p>Foo
- bar
- ---
- baz</p>
-04_04__leaf_blocks__indented_code_blocks__001:
- canonical: |
- <pre><code>a simple
- indented code block
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-2:25" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a simple</span>
- <span id="LC2" class="line" lang="plaintext"> indented code block</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>a simple
- indented code block</code></pre>
-04_04__leaf_blocks__indented_code_blocks__002:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <p>bar</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:3-3:7" dir="auto">
- <li data-sourcepos="1:3-3:7">
- <p data-sourcepos="1:5-1:7">foo</p>
- <p data-sourcepos="3:5-3:7">bar</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
-04_04__leaf_blocks__indented_code_blocks__003:
- canonical: |
- <ol>
- <li>
- <p>foo</p>
- <ul>
- <li>bar</li>
- </ul>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-3:9" dir="auto">
- <li data-sourcepos="1:1-3:9">
- <p data-sourcepos="1:5-1:7">foo</p>
- <ul data-sourcepos="3:5-3:9">
- <li data-sourcepos="3:5-3:9">bar</li>
- </ul>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>foo</p><ul bullet="*"><li><p>bar</p></li></ul></li></ol>
-04_04__leaf_blocks__indented_code_blocks__004:
- canonical: |
- <pre><code>&lt;a/&gt;
- *hi*
-
- - one
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-4:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;a/&gt;</span>
- <span id="LC2" class="line" lang="plaintext">*hi*</span>
- <span id="LC3" class="line" lang="plaintext"></span>
- <span id="LC4" class="line" lang="plaintext">- one</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>&lt;a/&gt;
- *hi*
-
- - one</code></pre>
-04_04__leaf_blocks__indented_code_blocks__005:
- canonical: |
- <pre><code>chunk1
-
- chunk2
-
-
-
- chunk3
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-7:10" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">chunk1</span>
- <span id="LC2" class="line" lang="plaintext"></span>
- <span id="LC3" class="line" lang="plaintext">chunk2</span>
- <span id="LC4" class="line" lang="plaintext"></span>
- <span id="LC5" class="line" lang="plaintext"></span>
- <span id="LC6" class="line" lang="plaintext"></span>
- <span id="LC7" class="line" lang="plaintext">chunk3</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>chunk1
-
- chunk2
-
-
-
- chunk3</code></pre>
-04_04__leaf_blocks__indented_code_blocks__006:
- canonical: "<pre><code>chunk1\n \n chunk2\n</code></pre>\n"
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-3:12" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">chunk1</span>
- <span id="LC2" class="line" lang="plaintext"> </span>
- <span id="LC3" class="line" lang="plaintext"> chunk2</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>chunk1\n
- \ \n chunk2</code></pre>"
-04_04__leaf_blocks__indented_code_blocks__007:
- canonical: |
- <p>Foo
- bar</p>
- static: |-
- <p data-sourcepos="1:1-2:7" dir="auto">Foo
- bar</p>
- wysiwyg: |-
- <p>Foo
- bar</p>
-04_04__leaf_blocks__indented_code_blocks__008:
- canonical: |
- <pre><code>foo
- </code></pre>
- <p>bar</p>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="2:1-2:3" dir="auto">bar</p>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
-04_04__leaf_blocks__indented_code_blocks__009:
- canonical: |
- <h1>Heading</h1>
- <pre><code>foo
- </code></pre>
- <h2>Heading</h2>
- <pre><code>foo
- </code></pre>
- <hr />
- static: |-
- <h1 data-sourcepos="1:1-1:9" dir="auto">
- <a id="user-content-heading" class="anchor" href="#heading" aria-hidden="true"></a>Heading</h1>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="2:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- <h2 data-sourcepos="3:1-5:7" dir="auto">
- <a id="user-content-heading-1" class="anchor" href="#heading-1" aria-hidden="true"></a>Heading</h2>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:5-5:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- <hr data-sourcepos="6:1-6:4">
- wysiwyg: |-
- <h1>Heading</h1>
-04_04__leaf_blocks__indented_code_blocks__010:
- canonical: |
- <pre><code> foo
- bar
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span>
- <span id="LC2" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code> foo
- bar</code></pre>
-04_04__leaf_blocks__indented_code_blocks__011:
- canonical: |
- <pre><code>foo
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:5-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
-04_04__leaf_blocks__indented_code_blocks__012:
- canonical: "<pre><code>foo \n</code></pre>\n"
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>foo </code></pre>
-04_05__leaf_blocks__fenced_code_blocks__001:
- canonical: |
- <pre><code>&lt;
- &gt;
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;</span>
- <span id="LC2" class="line" lang="plaintext"> &gt;</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>&lt;
- &gt;</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__002:
- canonical: |
- <pre><code>&lt;
- &gt;
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;</span>
- <span id="LC2" class="line" lang="plaintext"> &gt;</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>&lt;
- &gt;</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__003:
- canonical: |
- <p><code>foo</code></p>
- static: |-
- <p data-sourcepos="1:1-3:2" dir="auto"><code>foo</code></p>
- wysiwyg: |-
- <p><code>foo</code></p>
-04_05__leaf_blocks__fenced_code_blocks__004:
- canonical: |
- <pre><code>aaa
- ~~~
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext">~~~</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- ~~~</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__005:
- canonical: |
- <pre><code>aaa
- ```
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext">```</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- ```</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__006:
- canonical: |
- <pre><code>aaa
- ```
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext">```</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- ```</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__007:
- canonical: |
- <pre><code>aaa
- ~~~
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext">~~~</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- ~~~</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__008:
- canonical: |
- <pre><code></code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-1:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
-04_05__leaf_blocks__fenced_code_blocks__009:
- canonical: |
- <pre><code>
- ```
- aaa
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>
- <span id="LC2" class="line" lang="plaintext">```</span>
- <span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>
- ```
- aaa</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__010:
- canonical: |
- <blockquote>
- <pre><code>aaa
- </code></pre>
- </blockquote>
- <p>bbb</p>
- static: |-
- <blockquote data-sourcepos="1:1-2:5" dir="auto">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:3-3:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- </blockquote>
- <p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
- wysiwyg: |-
- <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre></blockquote>
-04_05__leaf_blocks__fenced_code_blocks__011:
- canonical: "<pre><code>\n \n</code></pre>\n"
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>
- <span id="LC2" class="line" lang="plaintext"> </span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>
- </code></pre>
-04_05__leaf_blocks__fenced_code_blocks__012:
- canonical: |
- <pre><code></code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-2:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
-04_05__leaf_blocks__fenced_code_blocks__013:
- canonical: |
- <pre><code>aaa
- aaa
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:2-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- aaa</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__014:
- canonical: |
- <pre><code>aaa
- aaa
- aaa
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:3-5:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext">aaa</span>
- <span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- aaa
- aaa</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__015:
- canonical: |
- <pre><code>aaa
- aaa
- aaa
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:4-5:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext"> aaa</span>
- <span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- aaa
- aaa</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__016:
- canonical: |
- <pre><code>```
- aaa
- ```
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-3:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span>
- <span id="LC2" class="line" lang="plaintext">aaa</span>
- <span id="LC3" class="line" lang="plaintext">```</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>```
- aaa
- ```</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__017:
- canonical: |
- <pre><code>aaa
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__018:
- canonical: |
- <pre><code>aaa
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:4-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__019:
- canonical: |
- <pre><code>aaa
- ```
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext"> ```</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- ```</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__020:
- canonical: |
- <p><code> </code>
- aaa</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto"><code> </code>
- aaa</p>
- wysiwyg: |-
- <p><code>
- aaa</code></p>
-04_05__leaf_blocks__fenced_code_blocks__021:
- canonical: |
- <pre><code>aaa
- ~~~ ~~
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>
- <span id="LC2" class="line" lang="plaintext">~~~ ~~</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa
- ~~~ ~~</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__022:
- canonical: |
- <p>foo</p>
- <pre><code>bar
- </code></pre>
- <p>baz</p>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">foo</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="2:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="5:1-5:3" dir="auto">baz</p>
- wysiwyg: |-
- <p>foo</p>
-04_05__leaf_blocks__fenced_code_blocks__023:
- canonical: |
- <h2>foo</h2>
- <pre><code>bar
- </code></pre>
- <h1>baz</h1>
- static: |-
- <h2 data-sourcepos="1:1-3:3" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:1-5:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- <h1 data-sourcepos="6:1-6:5" dir="auto">
- <a id="user-content-baz" class="anchor" href="#baz" aria-hidden="true"></a>baz</h1>
- wysiwyg: |-
- <h2>foo</h2>
-04_05__leaf_blocks__fenced_code_blocks__024:
- canonical: |
- <pre><code class="language-ruby">def foo(x)
- return 3
- end
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-5:3" class="code highlight js-syntax-highlight language-ruby" lang="ruby" v-pre="true"><code><span id="LC1" class="line" lang="ruby"><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></span>
- <span id="LC2" class="line" lang="ruby"> <span class="k">return</span> <span class="mi">3</span></span>
- <span id="LC3" class="line" lang="ruby"><span class="k">end</span></span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre language="ruby" class="content-editor-code-block undefined code highlight"><code>def foo(x)
- return 3
- end</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__025:
- canonical: |
- <pre><code class="language-ruby">def foo(x)
- return 3
- end
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-5:7" class="code highlight js-syntax-highlight language-ruby" lang="ruby" v-pre="true"><code><span id="LC1" class="line" lang="ruby"><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></span>
- <span id="LC2" class="line" lang="ruby"> <span class="k">return</span> <span class="mi">3</span></span>
- <span id="LC3" class="line" lang="ruby"><span class="k">end</span></span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre language="ruby" class="content-editor-code-block undefined code highlight"><code>def foo(x)
- return 3
- end</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__026:
- canonical: |
- <pre><code class="language-;"></code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-2:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang=";" v-pre="true"><code></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre language=";" class="content-editor-code-block undefined code highlight"><code></code></pre>
-04_05__leaf_blocks__fenced_code_blocks__027:
- canonical: |
- <p><code>aa</code>
- foo</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto"><code>aa</code>
- foo</p>
- wysiwyg: |-
- <p><code>aa</code>
- foo</p>
-04_05__leaf_blocks__fenced_code_blocks__028:
- canonical: |
- <pre><code class="language-aa">foo
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="aa" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre language="aa" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
-04_05__leaf_blocks__fenced_code_blocks__029:
- canonical: |
- <pre><code>``` aaa
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``` aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>``` aaa</code></pre>
-04_06__leaf_blocks__html_blocks__001:
- canonical: |
- <table><tr><td>
- <pre>
- **Hello**,
- <p><em>world</em>.
- </pre></p>
- </td></tr></table>
- static: |-
- <table dir="auto"><tr><td>
- <pre>
- **Hello**,
- <p data-sourcepos="5:1-6:6"><em>world</em>.
- </p></pre>
- </td></tr></table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__002:
- canonical: |
- <table>
- <tr>
- <td>
- hi
- </td>
- </tr>
- </table>
- <p>okay.</p>
- static: |-
- <table dir="auto">
- <tr>
- <td>
- hi
- </td>
- </tr>
- </table>
- <p data-sourcepos="9:1-9:5" dir="auto">okay.</p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__003:
- canonical: |2
- <div>
- *hello*
- <foo><a>
- static: |2-
- <div>
- *hello*
- <a></a>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__004:
- canonical: |
- </div>
- *foo*
- static: |2-
-
- *foo*
- wysiwyg: |-
- <p>
- *foo*</p>
-04_06__leaf_blocks__html_blocks__005:
- canonical: |
- <DIV CLASS="foo">
- <p><em>Markdown</em></p>
- </DIV>
- static: |-
- <div>
- <p data-sourcepos="3:1-3:10"><em>Markdown</em></p>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__006:
- canonical: |
- <div id="foo"
- class="bar">
- </div>
- static: |-
- <div>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__007:
- canonical: |
- <div id="foo" class="bar
- baz">
- </div>
- static: |-
- <div>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__008:
- canonical: |
- <div>
- *foo*
- <p><em>bar</em></p>
- static: |-
- <div>
- *foo*
- <p data-sourcepos="4:1-4:5"><em>bar</em></p>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__009:
- canonical: |
- <div id="foo"
- *hi*
- static: |-
- <div></div>
- wysiwyg: |-
- <p></p>
-04_06__leaf_blocks__html_blocks__010:
- canonical: |
- <div class
- foo
- static: |-
- <div></div>
- wysiwyg: |-
- <p></p>
-04_06__leaf_blocks__html_blocks__011:
- canonical: |
- <div *???-&&&-<---
- *foo*
- static: |-
- <div></div>
- wysiwyg: |-
- <p></p>
-04_06__leaf_blocks__html_blocks__012:
- canonical: |
- <div><a href="bar">*foo*</a></div>
- static: |-
- <div><a href="bar">*foo*</a></div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__013:
- canonical: |
- <table><tr><td>
- foo
- </td></tr></table>
- static: |-
- <table dir="auto"><tr><td>
- foo
- </td></tr></table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__014:
- canonical: |
- <div></div>
- ``` c
- int x = 33;
- ```
- static: |-
- <div></div>
- ``` c
- int x = 33;
- ```
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__015:
- canonical: |
- <a href="foo">
- *bar*
- </a>
- static: |-
- <a href="foo">
- *bar*
- </a>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo">
- *bar*
- </a></p>
-04_06__leaf_blocks__html_blocks__016:
- canonical: |
- <Warning>
- *bar*
- </Warning>
- static: |2
-
- *bar*
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "warning" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__017:
- canonical: |
- <i class="foo">
- *bar*
- </i>
- static: |-
- <i>
- *bar*
- </i>
- wysiwyg: |-
- <p><em>
- *bar*
- </em></p>
-04_06__leaf_blocks__html_blocks__018:
- canonical: |
- </ins>
- *bar*
- static: |2-
-
- *bar*
- wysiwyg: |-
- <p>
- *bar*</p>
-04_06__leaf_blocks__html_blocks__019:
- canonical: |
- <del>
- *foo*
- </del>
- static: |-
- <del>
- *foo*
- </del>
- wysiwyg: |-
- <p><s>
- *foo*
- </s></p>
-04_06__leaf_blocks__html_blocks__020:
- canonical: |
- <del>
- <p><em>foo</em></p>
- </del>
- static: |-
- <del>
- <p data-sourcepos="3:1-3:5"><em>foo</em></p>
- </del>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-04_06__leaf_blocks__html_blocks__021:
- canonical: |
- <p><del><em>foo</em></del></p>
- static: |-
- <p data-sourcepos="1:1-1:16" dir="auto"><del><em>foo</em></del></p>
- wysiwyg: |-
- <p><em><s>foo</s></em></p>
-04_06__leaf_blocks__html_blocks__022:
- canonical: |
- <pre language="haskell"><code>
- import Text.HTML.TagSoup
-
- main :: IO ()
- main = print $ parseTags tags
- </code></pre>
- <p>okay</p>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>
- <span id="LC2" class="line" lang="plaintext">import Text.HTML.TagSoup</span>
- <span id="LC3" class="line" lang="plaintext"></span>
- <span id="LC4" class="line" lang="plaintext">main :: IO ()</span>
- <span id="LC5" class="line" lang="plaintext">main = print $ parseTags tags</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="7:1-7:4" dir="auto">okay</p>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>
- import Text.HTML.TagSoup
-
- main :: IO ()
- main = print $ parseTags tags</code></pre>
-04_06__leaf_blocks__html_blocks__023:
- canonical: |
- <script type="text/javascript">
- // JavaScript example
-
- document.getElementById("demo").innerHTML = "Hello JavaScript!";
- </script>
- <p>okay</p>
- static: |2-
-
- <p data-sourcepos="6:1-6:4" dir="auto">okay</p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "script" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__024:
- canonical: |
- <style
- type="text/css">
- h1 {color:red;}
-
- p {color:blue;}
- </style>
- <p>okay</p>
- static: |2-
-
- h1 {color:red;}
-
- p {color:blue;}
-
- <p data-sourcepos="7:1-7:4" dir="auto">okay</p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "style" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__025:
- canonical: |
- <style
- type="text/css">
-
- foo
- static: |2-
-
-
- foo
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "style" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__026:
- canonical: |
- <blockquote>
- <div>
- foo
- </blockquote>
- <p>bar</p>
- static: |-
- <blockquote data-sourcepos="1:1-2:5" dir="auto">
- <div>
- foo
-
- <p data-sourcepos="4:1-4:3">bar</p>
- </div>
- </blockquote>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__027:
- canonical: |
- <ul>
- <li>
- <div>
- </li>
- <li>foo</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-2:5" dir="auto">
- <li data-sourcepos="1:1-1:7">
- <div>
-
- <li data-sourcepos="2:1-2:5">foo</li>
- </div>
- </li>
- </ul>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__028:
- canonical: |
- <style>p{color:red;}</style>
- <p><em>foo</em></p>
- static: |-
- p{color:red;}
- <p data-sourcepos="2:1-2:5" dir="auto"><em>foo</em></p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "style" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__029:
- canonical: |
- <!-- foo -->*bar*
- <p><em>baz</em></p>
- static: |-
- *bar*
- <p data-sourcepos="2:1-2:5" dir="auto"><em>baz</em></p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__030:
- canonical: |
- <script>
- foo
- </script>1. *bar*
- static: |-
- 1. *bar*
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "script" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__031:
- canonical: |
- <!-- Foo
-
- bar
- baz -->
- <p>okay</p>
- static: |2-
-
- <p data-sourcepos="5:1-5:4" dir="auto">okay</p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__032:
- canonical: |
- <?php
-
- echo '>';
-
- ?>
- <p>okay</p>
- static: |-
- <?php echo '>';
-
- ?&gt;
- <p data-sourcepos="6:1-6:4" dir="auto">okay</p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__033:
- canonical: |
- <!DOCTYPE html>
- static: ""
- wysiwyg: |-
- <p></p>
-04_06__leaf_blocks__html_blocks__034:
- canonical: |
- <![CDATA[
- function matchwo(a,b)
- {
- if (a < b && a < 0) then {
- return 1;
-
- } else {
-
- return 0;
- }
- }
- ]]>
- <p>okay</p>
- static: |2-
- &lt;![CDATA[
- function matchwo(a,b)
- {
- if (a &lt; b &amp;&amp; a &lt; 0) then {
- return 1;
-
- } else {
-
- return 0;
- }
- }
- ]]&gt;
- <p data-sourcepos="13:1-13:4" dir="auto">okay</p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__035:
- canonical: |2
- <!-- foo -->
- <pre><code>&lt;!-- foo --&gt;
- </code></pre>
- static: " \n<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
- data-sourcepos=\"3:5-3:16\" class=\"code highlight js-syntax-highlight language-plaintext\"
- lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
- class=\"line\" lang=\"plaintext\">&lt;!-- foo --&gt;</span></code></pre>\n<copy-code></copy-code>\n</div>"
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__036:
- canonical: |2
- <div>
- <pre><code>&lt;div&gt;
- </code></pre>
- static: |2-
- <div>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:5-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;div&gt;</span></code></pre>
- <copy-code></copy-code>
- </div>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__037:
- canonical: |
- <p>Foo</p>
- <div>
- bar
- </div>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
- <div>
- bar
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__038:
- canonical: |
- <div>
- bar
- </div>
- *foo*
- static: |-
- <div>
- bar
- </div>
- *foo*
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__039:
- canonical: |
- <p>Foo
- <a href="bar">
- baz</p>
- static: |-
- <p data-sourcepos="1:1-3:3" dir="auto">Foo
- <a href="bar">
- baz</a></p>
- wysiwyg: |-
- <p>Foo
- <a target="_blank" rel="noopener noreferrer nofollow" href="bar">
- baz</a></p>
-04_06__leaf_blocks__html_blocks__040:
- canonical: |
- <div>
- <p><em>Emphasized</em> text.</p>
- </div>
- static: |-
- <div>
- <p data-sourcepos="3:1-3:18"><em>Emphasized</em> text.</p>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__041:
- canonical: |
- <div>
- *Emphasized* text.
- </div>
- static: |-
- <div>
- *Emphasized* text.
- </div>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__042:
- canonical: |
- <table>
- <tr>
- <td>
- Hi
- </td>
- </tr>
- </table>
- static: |-
- <table dir="auto">
- <tr>
- <td>
- Hi
- </td>
- </tr>
- </table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__043:
- canonical: |
- <table>
- <tr>
- <pre><code>&lt;td&gt;
- Hi
- &lt;/td&gt;
- </code></pre>
- </tr>
- </table>
- static: |-
- <table dir="auto">
- <tr>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:5-8:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;td&gt;</span>
- <span id="LC2" class="line" lang="plaintext"> Hi</span>
- <span id="LC3" class="line" lang="plaintext">&lt;/td&gt;</span></code></pre>
- <copy-code></copy-code>
- </div>
- </tr>
- </table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_07__leaf_blocks__link_reference_definitions__001:
- canonical: |
- <p><a href="/url" title="title">foo</a></p>
- static: |-
- <p data-sourcepos="3:1-3:5" dir="auto"><a href="/url" title="title">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__002:
- canonical: |
- <p><a href="/url" title="the title">foo</a></p>
- static: |-
- <p data-sourcepos="5:1-5:5" dir="auto"><a href="/url" title="the title">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="the title">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__003:
- canonical: |
- <p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
- static: |-
- <p data-sourcepos="3:1-3:11" dir="auto"><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
-04_07__leaf_blocks__link_reference_definitions__004:
- canonical: |
- <p><a href="my%20url" title="title">Foo bar</a></p>
- static: |-
- <p data-sourcepos="5:1-5:9" dir="auto"><a href="my%20url" title="title">Foo bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="my%20url" title="title">Foo bar</a></p>
-04_07__leaf_blocks__link_reference_definitions__005:
- canonical: |
- <p><a href="/url" title="
- title
- line1
- line2
- ">foo</a></p>
- static: |-
- <p data-sourcepos="7:1-7:5" dir="auto"><a href="/url" title="
- title
- line1
- line2
- ">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="
- title
- line1
- line2
- ">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__006:
- canonical: |
- <p>[foo]: /url 'title</p>
- <p>with blank line'</p>
- <p>[foo]</p>
- static: |-
- <p data-sourcepos="1:1-1:18" dir="auto">[foo]: /url 'title</p>
- <p data-sourcepos="3:1-3:16" dir="auto">with blank line'</p>
- <p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
- wysiwyg: |-
- <p>[foo]: /url 'title</p>
-04_07__leaf_blocks__link_reference_definitions__007:
- canonical: |
- <p><a href="/url">foo</a></p>
- static: |-
- <p data-sourcepos="4:1-4:5" dir="auto"><a href="/url">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__008:
- canonical: |
- <p>[foo]:</p>
- <p>[foo]</p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto">[foo]:</p>
- <p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
- wysiwyg: |-
- <p>[foo]:</p>
-04_07__leaf_blocks__link_reference_definitions__009:
- canonical: |
- <p><a href="">foo</a></p>
- static: |-
- <p data-sourcepos="3:1-3:5" dir="auto"><a href="">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__010:
- canonical: |
- <p>[foo]: <bar>(baz)</p>
- <p>[foo]</p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">[foo]: (baz)</p>
- <p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "bar" not supported by this converter. Please, provide an specification.
-04_07__leaf_blocks__link_reference_definitions__011:
- canonical: |
- <p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
- static: |-
- <p data-sourcepos="3:1-3:5" dir="auto"><a href="/url%5Cbar*baz" title='foo"bar\baz'>foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__012:
- canonical: |
- <p><a href="url">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><a href="url">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="url">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__013:
- canonical: |
- <p><a href="first">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><a href="first">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="first">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__014:
- canonical: |
- <p><a href="/url">Foo</a></p>
- static: |-
- <p data-sourcepos="3:1-3:5" dir="auto"><a href="/url">Foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__015:
- canonical: |
- <p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
- static: |-
- <p data-sourcepos="3:1-3:8" dir="auto"><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/%CF%86%CE%BF%CF%85">αγω</a></p>
-04_07__leaf_blocks__link_reference_definitions__016:
- canonical: ""
- static: ""
- wysiwyg: |-
- <p></p>
-04_07__leaf_blocks__link_reference_definitions__017:
- canonical: |
- <p>bar</p>
- static: |-
- <p data-sourcepos="1:1-4:3" dir="auto">bar</p>
- wysiwyg: |-
- <p>bar</p>
-04_07__leaf_blocks__link_reference_definitions__018:
- canonical: |
- <p>[foo]: /url &quot;title&quot; ok</p>
- static: |-
- <p data-sourcepos="1:1-1:22" dir="auto">[foo]: /url "title" ok</p>
- wysiwyg: |-
- <p>[foo]: /url "title" ok</p>
-04_07__leaf_blocks__link_reference_definitions__019:
- canonical: |
- <p>&quot;title&quot; ok</p>
- static: |-
- <p data-sourcepos="1:1-2:10" dir="auto">"title" ok</p>
- wysiwyg: |-
- <p>"title" ok</p>
-04_07__leaf_blocks__link_reference_definitions__020:
- canonical: |
- <pre><code>[foo]: /url &quot;title&quot;
- </code></pre>
- <p>[foo]</p>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url "title"</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>[foo]: /url "title"</code></pre>
-04_07__leaf_blocks__link_reference_definitions__021:
- canonical: |
- <pre><code>[foo]: /url
- </code></pre>
- <p>[foo]</p>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>[foo]: /url</code></pre>
-04_07__leaf_blocks__link_reference_definitions__022:
- canonical: |
- <p>Foo
- [bar]: /baz</p>
- <p>[bar]</p>
- static: |-
- <p data-sourcepos="1:1-2:11" dir="auto">Foo
- [bar]: /baz</p>
- <p data-sourcepos="4:1-4:5" dir="auto">[bar]</p>
- wysiwyg: |-
- <p>Foo
- [bar]: /baz</p>
-04_07__leaf_blocks__link_reference_definitions__023:
- canonical: |
- <h1><a href="/url">Foo</a></h1>
- <blockquote>
- <p>bar</p>
- </blockquote>
- static: |-
- <h1 data-sourcepos="1:1-1:7" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a><a href="/url">Foo</a>
- </h1>
- <blockquote data-sourcepos="3:1-3:5" dir="auto">
- <p data-sourcepos="3:3-3:5">bar</p>
- </blockquote>
- wysiwyg: |-
- <h1><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></h1>
-04_07__leaf_blocks__link_reference_definitions__024:
- canonical: |
- <h1>bar</h1>
- <p><a href="/url">foo</a></p>
- static: |-
- <h1 data-sourcepos="1:1-4:5" dir="auto">
- <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h1>
- <p data-sourcepos="4:1-4:5" dir="auto"><a href="/url">foo</a></p>
- wysiwyg: |-
- <h1>bar</h1>
-04_07__leaf_blocks__link_reference_definitions__025:
- canonical: |
- <p>===
- <a href="/url">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-3:5" dir="auto">===
- <a href="/url">foo</a></p>
- wysiwyg: |-
- <p>===
- <a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__026:
- canonical: |
- <p><a href="/foo-url" title="foo">foo</a>,
- <a href="/bar-url" title="bar">bar</a>,
- <a href="/baz-url">baz</a></p>
- static: |-
- <p data-sourcepos="6:1-8:5" dir="auto"><a href="/foo-url" title="foo">foo</a>,
- <a href="/bar-url" title="bar">bar</a>,
- <a href="/baz-url">baz</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/foo-url" title="foo">foo</a>,
- <a target="_blank" rel="noopener noreferrer nofollow" href="/bar-url" title="bar">bar</a>,
- <a target="_blank" rel="noopener noreferrer nofollow" href="/baz-url">baz</a></p>
-04_07__leaf_blocks__link_reference_definitions__027:
- canonical: |
- <p><a href="/url">foo</a></p>
- <blockquote>
- </blockquote>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><a href="/url">foo</a></p>
- <blockquote data-sourcepos="3:1-3:13" dir="auto">
- </blockquote>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
-04_07__leaf_blocks__link_reference_definitions__028:
- canonical: ""
- static: ""
- wysiwyg: |-
- <p></p>
-04_08__leaf_blocks__paragraphs__001:
- canonical: |
- <p>aaa</p>
- <p>bbb</p>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">aaa</p>
- <p data-sourcepos="3:1-3:3" dir="auto">bbb</p>
- wysiwyg: |-
- <p>aaa</p>
-04_08__leaf_blocks__paragraphs__002:
- canonical: |
- <p>aaa
- bbb</p>
- <p>ccc
- ddd</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">aaa
- bbb</p>
- <p data-sourcepos="4:1-5:3" dir="auto">ccc
- ddd</p>
- wysiwyg: |-
- <p>aaa
- bbb</p>
-04_08__leaf_blocks__paragraphs__003:
- canonical: |
- <p>aaa</p>
- <p>bbb</p>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">aaa</p>
- <p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
- wysiwyg: |-
- <p>aaa</p>
-04_08__leaf_blocks__paragraphs__004:
- canonical: |
- <p>aaa
- bbb</p>
- static: |-
- <p data-sourcepos="1:3-2:4" dir="auto">aaa
- bbb</p>
- wysiwyg: |-
- <p>aaa
- bbb</p>
-04_08__leaf_blocks__paragraphs__005:
- canonical: |
- <p>aaa
- bbb
- ccc</p>
- static: |-
- <p data-sourcepos="1:1-3:42" dir="auto">aaa
- bbb
- ccc</p>
- wysiwyg: |-
- <p>aaa
- bbb
- ccc</p>
-04_08__leaf_blocks__paragraphs__006:
- canonical: |
- <p>aaa
- bbb</p>
- static: |-
- <p data-sourcepos="1:4-2:3" dir="auto">aaa
- bbb</p>
- wysiwyg: |-
- <p>aaa
- bbb</p>
-04_08__leaf_blocks__paragraphs__007:
- canonical: |
- <pre><code>aaa
- </code></pre>
- <p>bbb</p>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="2:1-2:3" dir="auto">bbb</p>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
-04_08__leaf_blocks__paragraphs__008:
- canonical: |
- <p>aaa<br />
- bbb</p>
- static: |-
- <p data-sourcepos="1:1-2:8" dir="auto">aaa<br>
- bbb</p>
- wysiwyg: |-
- <p>aaa<br>
- bbb</p>
-04_09__leaf_blocks__blank_lines__001:
- canonical: |
- <p>aaa</p>
- <h1>aaa</h1>
- static: |-
- <p data-sourcepos="3:1-3:3" dir="auto">aaa</p>
- <h1 data-sourcepos="6:1-6:5" dir="auto">
- <a id="user-content-aaa" class="anchor" href="#aaa" aria-hidden="true"></a>aaa</h1>
- wysiwyg: |-
- <p>aaa</p>
-04_10__leaf_blocks__tables_extension__001:
- canonical: |
- <table>
- <thead>
- <tr>
- <th>foo</th>
- <th>bar</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>baz</td>
- <td>bim</td>
- </tr>
- </tbody>
- </table>
- static: |-
- <table data-sourcepos="1:1-3:13" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:13">
- <th data-sourcepos="1:2-1:6">foo</th>
- <th data-sourcepos="1:8-1:12">bar</th>
- </tr>
- </thead>
- <tbody>
- <tr data-sourcepos="3:1-3:13">
- <td data-sourcepos="3:2-3:6">baz</td>
- <td data-sourcepos="3:8-3:12">bim</td>
- </tr>
- </tbody>
- </table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__002:
- canonical: |
- <table>
- <thead>
- <tr>
- <th align="center">abc</th>
- <th align="right">defghi</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td align="center">bar</td>
- <td align="right">baz</td>
- </tr>
- </tbody>
- </table>
- static: |-
- <table data-sourcepos="1:1-3:9" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:16">
- <th align="center" data-sourcepos="1:2-1:6">abc</th>
- <th align="right" data-sourcepos="1:8-1:15">defghi</th>
- </tr>
- </thead>
- <tbody>
- <tr data-sourcepos="3:1-3:9">
- <td align="center" data-sourcepos="3:1-3:4">bar</td>
- <td align="right" data-sourcepos="3:6-3:9">baz</td>
- </tr>
- </tbody>
- </table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__003:
- canonical: |
- <table>
- <thead>
- <tr>
- <th>f|oo</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>b <code>|</code> az</td>
- </tr>
- <tr>
- <td>b <strong>|</strong> im</td>
- </tr>
- </tbody>
- </table>
- static: |-
- <table data-sourcepos="1:1-4:15" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:10">
- <th data-sourcepos="1:2-1:9">f|oo</th>
- </tr>
- </thead>
- <tbody>
- <tr data-sourcepos="3:1-3:13">
- <td data-sourcepos="3:2-3:12">b <code>|</code> az</td>
- </tr>
- <tr data-sourcepos="4:1-4:15">
- <td data-sourcepos="4:2-4:14">b <strong>|</strong> im</td>
- </tr>
- </tbody>
- </table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__004:
- canonical: |
- <table>
- <thead>
- <tr>
- <th>abc</th>
- <th>def</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>bar</td>
- <td>baz</td>
- </tr>
- </tbody>
- </table>
- <blockquote>
- <p>bar</p>
- </blockquote>
- static: |-
- <table data-sourcepos="1:1-3:13" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:13">
- <th data-sourcepos="1:2-1:6">abc</th>
- <th data-sourcepos="1:8-1:12">def</th>
- </tr>
- </thead>
- <tbody>
- <tr data-sourcepos="3:1-3:13">
- <td data-sourcepos="3:2-3:6">bar</td>
- <td data-sourcepos="3:8-3:12">baz</td>
- </tr>
- </tbody>
- </table>
- <blockquote data-sourcepos="4:1-4:5" dir="auto">
- <p data-sourcepos="4:3-4:5">bar</p>
- </blockquote>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__005:
- canonical: |
- <table>
- <thead>
- <tr>
- <th>abc</th>
- <th>def</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>bar</td>
- <td>baz</td>
- </tr>
- <tr>
- <td>bar</td>
- <td></td>
- </tr>
- </tbody>
- </table>
- <p>bar</p>
- static: |-
- <table data-sourcepos="1:1-4:3" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:13">
- <th data-sourcepos="1:2-1:6">abc</th>
- <th data-sourcepos="1:8-1:12">def</th>
- </tr>
- </thead>
- <tbody>
- <tr data-sourcepos="3:1-3:13">
- <td data-sourcepos="3:2-3:6">bar</td>
- <td data-sourcepos="3:8-3:12">baz</td>
- </tr>
- <tr data-sourcepos="4:1-4:3">
- <td data-sourcepos="4:1-4:3">bar</td>
- <td data-sourcepos="4:0-4:0"></td>
- </tr>
- </tbody>
- </table>
- <p data-sourcepos="6:1-6:3" dir="auto">bar</p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__006:
- canonical: |
- <p>| abc | def |
- | --- |
- | bar |</p>
- static: |-
- <p data-sourcepos="1:1-3:7" dir="auto">| abc | def |
- | --- |
- | bar |</p>
- wysiwyg: |-
- <p>| abc | def |
- | --- |
- | bar |</p>
-04_10__leaf_blocks__tables_extension__007:
- canonical: |
- <table>
- <thead>
- <tr>
- <th>abc</th>
- <th>def</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>bar</td>
- <td></td>
- </tr>
- <tr>
- <td>bar</td>
- <td>baz</td>
- </tr>
- </tbody>
- </table>
- static: |-
- <table data-sourcepos="1:1-4:19" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:13">
- <th data-sourcepos="1:2-1:6">abc</th>
- <th data-sourcepos="1:8-1:12">def</th>
- </tr>
- </thead>
- <tbody>
- <tr data-sourcepos="3:1-3:7">
- <td data-sourcepos="3:2-3:6">bar</td>
- <td data-sourcepos="3:0-3:0"></td>
- </tr>
- <tr data-sourcepos="4:1-4:19">
- <td data-sourcepos="4:2-4:6">bar</td>
- <td data-sourcepos="4:8-4:12">baz</td>
- </tr>
- </tbody>
- </table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__008:
- canonical: |
- <table>
- <thead>
- <tr>
- <th>abc</th>
- <th>def</th>
- </tr>
- </thead>
- </table>
- static: |-
- <table data-sourcepos="1:1-2:13" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:13">
- <th data-sourcepos="1:2-1:6">abc</th>
- <th data-sourcepos="1:8-1:12">def</th>
- </tr>
- </thead>
- </table>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-05_01__container_blocks__block_quotes__001:
- canonical: |
- <blockquote>
- <h1>Foo</h1>
- <p>bar
- baz</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:5" dir="auto">
- <h1 data-sourcepos="1:3-1:7">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
- <p data-sourcepos="2:3-3:5">bar
- baz</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><h1>Foo</h1><p>bar
- baz</p></blockquote>
-05_01__container_blocks__block_quotes__002:
- canonical: |
- <blockquote>
- <h1>Foo</h1>
- <p>bar
- baz</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:5" dir="auto">
- <h1 data-sourcepos="1:2-1:6">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
- <p data-sourcepos="2:2-3:5">bar
- baz</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><h1>Foo</h1><p>bar
- baz</p></blockquote>
-05_01__container_blocks__block_quotes__003:
- canonical: |
- <blockquote>
- <h1>Foo</h1>
- <p>bar
- baz</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:4-3:6" dir="auto">
- <h1 data-sourcepos="1:6-1:10">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
- <p data-sourcepos="2:6-3:6">bar
- baz</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><h1>Foo</h1><p>bar
- baz</p></blockquote>
-05_01__container_blocks__block_quotes__004:
- canonical: |
- <pre><code>&gt; # Foo
- &gt; bar
- &gt; baz
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&gt; # Foo</span>
- <span id="LC2" class="line" lang="plaintext">&gt; bar</span>
- <span id="LC3" class="line" lang="plaintext">&gt; baz</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>&gt; # Foo
- &gt; bar
- &gt; baz</code></pre>
-05_01__container_blocks__block_quotes__005:
- canonical: |
- <blockquote>
- <h1>Foo</h1>
- <p>bar
- baz</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:3" dir="auto">
- <h1 data-sourcepos="1:3-1:7">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
- <p data-sourcepos="2:3-3:3">bar
- baz</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><h1>Foo</h1><p>bar
- baz</p></blockquote>
-05_01__container_blocks__block_quotes__006:
- canonical: |
- <blockquote>
- <p>bar
- baz
- foo</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:5" dir="auto">
- <p data-sourcepos="1:3-3:5">bar
- baz
- foo</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>bar
- baz
- foo</p></blockquote>
-05_01__container_blocks__block_quotes__007:
- canonical: |
- <blockquote>
- <p>foo</p>
- </blockquote>
- <hr />
- static: |-
- <blockquote data-sourcepos="1:1-1:5" dir="auto">
- <p data-sourcepos="1:3-1:5">foo</p>
- </blockquote>
- <hr data-sourcepos="2:1-2:3">
- wysiwyg: |-
- <blockquote multiline="false"><p>foo</p></blockquote>
-05_01__container_blocks__block_quotes__008:
- canonical: |
- <blockquote>
- <ul>
- <li>foo</li>
- </ul>
- </blockquote>
- <ul>
- <li>bar</li>
- </ul>
- static: |-
- <blockquote data-sourcepos="1:1-1:7" dir="auto">
- <ul data-sourcepos="1:3-1:7">
- <li data-sourcepos="1:3-1:7">foo</li>
- </ul>
- </blockquote>
- <ul data-sourcepos="2:1-2:5" dir="auto">
- <li data-sourcepos="2:1-2:5">bar</li>
- </ul>
- wysiwyg: |-
- <blockquote multiline="false"><ul bullet="*"><li><p>foo</p></li></ul></blockquote>
-05_01__container_blocks__block_quotes__009:
- canonical: |
- <blockquote>
- <pre><code>foo
- </code></pre>
- </blockquote>
- <pre><code>bar
- </code></pre>
- static: |-
- <blockquote data-sourcepos="1:1-1:9" dir="auto">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:7-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- </blockquote>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="2:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre></blockquote>
-05_01__container_blocks__block_quotes__010:
- canonical: |
- <blockquote>
- <pre><code></code></pre>
- </blockquote>
- <p>foo</p>
- <pre><code></code></pre>
- static: |-
- <blockquote data-sourcepos="1:1-1:5" dir="auto">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:3-2:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
- <copy-code></copy-code>
- </div>
- </blockquote>
- <p data-sourcepos="2:1-2:3" dir="auto">foo</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code></code></pre></blockquote>
-05_01__container_blocks__block_quotes__011:
- canonical: |
- <blockquote>
- <p>foo
- - bar</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-2:9" dir="auto">
- <p data-sourcepos="1:3-2:9">foo
- - bar</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>foo
- - bar</p></blockquote>
-05_01__container_blocks__block_quotes__012:
- canonical: |
- <blockquote>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-1:1" dir="auto">
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p></p></blockquote>
-05_01__container_blocks__block_quotes__013:
- canonical: |
- <blockquote>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:2" dir="auto">
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p></p></blockquote>
-05_01__container_blocks__block_quotes__014:
- canonical: |
- <blockquote>
- <p>foo</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:3" dir="auto">
- <p data-sourcepos="2:3-2:5">foo</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>foo</p></blockquote>
-05_01__container_blocks__block_quotes__015:
- canonical: |
- <blockquote>
- <p>foo</p>
- </blockquote>
- <blockquote>
- <p>bar</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-1:5" dir="auto">
- <p data-sourcepos="1:3-1:5">foo</p>
- </blockquote>
- <blockquote data-sourcepos="3:1-3:5" dir="auto">
- <p data-sourcepos="3:3-3:5">bar</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>foo</p></blockquote>
-05_01__container_blocks__block_quotes__016:
- canonical: |
- <blockquote>
- <p>foo
- bar</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-2:5" dir="auto">
- <p data-sourcepos="1:3-2:5">foo
- bar</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>foo
- bar</p></blockquote>
-05_01__container_blocks__block_quotes__017:
- canonical: |
- <blockquote>
- <p>foo</p>
- <p>bar</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:5" dir="auto">
- <p data-sourcepos="1:3-1:5">foo</p>
- <p data-sourcepos="3:3-3:5">bar</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>foo</p><p>bar</p></blockquote>
-05_01__container_blocks__block_quotes__018:
- canonical: |
- <p>foo</p>
- <blockquote>
- <p>bar</p>
- </blockquote>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">foo</p>
- <blockquote data-sourcepos="2:1-2:5" dir="auto">
- <p data-sourcepos="2:3-2:5">bar</p>
- </blockquote>
- wysiwyg: |-
- <p>foo</p>
-05_01__container_blocks__block_quotes__019:
- canonical: |
- <blockquote>
- <p>aaa</p>
- </blockquote>
- <hr />
- <blockquote>
- <p>bbb</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-1:5" dir="auto">
- <p data-sourcepos="1:3-1:5">aaa</p>
- </blockquote>
- <hr data-sourcepos="2:1-2:3">
- <blockquote data-sourcepos="3:1-3:5" dir="auto">
- <p data-sourcepos="3:3-3:5">bbb</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>aaa</p></blockquote>
-05_01__container_blocks__block_quotes__020:
- canonical: |
- <blockquote>
- <p>bar
- baz</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-2:3" dir="auto">
- <p data-sourcepos="1:3-2:3">bar
- baz</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><p>bar
- baz</p></blockquote>
-05_01__container_blocks__block_quotes__021:
- canonical: |
- <blockquote>
- <p>bar</p>
- </blockquote>
- <p>baz</p>
- static: |-
- <blockquote data-sourcepos="1:1-1:5" dir="auto">
- <p data-sourcepos="1:3-1:5">bar</p>
- </blockquote>
- <p data-sourcepos="3:1-3:3" dir="auto">baz</p>
- wysiwyg: |-
- <blockquote multiline="false"><p>bar</p></blockquote>
-05_01__container_blocks__block_quotes__022:
- canonical: |
- <blockquote>
- <p>bar</p>
- </blockquote>
- <p>baz</p>
- static: |-
- <blockquote data-sourcepos="1:1-2:1" dir="auto">
- <p data-sourcepos="1:3-1:5">bar</p>
- </blockquote>
- <p data-sourcepos="3:1-3:3" dir="auto">baz</p>
- wysiwyg: |-
- <blockquote multiline="false"><p>bar</p></blockquote>
-05_01__container_blocks__block_quotes__023:
- canonical: |
- <blockquote>
- <blockquote>
- <blockquote>
- <p>foo
- bar</p>
- </blockquote>
- </blockquote>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-2:3" dir="auto">
- <blockquote data-sourcepos="1:3-2:3">
- <blockquote data-sourcepos="1:5-2:3">
- <p data-sourcepos="1:7-2:3">foo
- bar</p>
- </blockquote>
- </blockquote>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><blockquote multiline="false"><blockquote multiline="false"><p>foo
- bar</p></blockquote></blockquote></blockquote>
-05_01__container_blocks__block_quotes__024:
- canonical: |
- <blockquote>
- <blockquote>
- <blockquote>
- <p>foo
- bar
- baz</p>
- </blockquote>
- </blockquote>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:5" dir="auto">
- <blockquote data-sourcepos="1:2-3:5">
- <blockquote data-sourcepos="1:3-3:5">
- <p data-sourcepos="1:5-3:5">foo
- bar
- baz</p>
- </blockquote>
- </blockquote>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><blockquote multiline="false"><blockquote multiline="false"><p>foo
- bar
- baz</p></blockquote></blockquote></blockquote>
-05_01__container_blocks__block_quotes__025:
- canonical: |
- <blockquote>
- <pre><code>code
- </code></pre>
- </blockquote>
- <blockquote>
- <p>not code</p>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-1:10" dir="auto">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:7-1:10" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code</span></code></pre>
- <copy-code></copy-code>
- </div>
- </blockquote>
- <blockquote data-sourcepos="3:1-3:13" dir="auto">
- <p data-sourcepos="3:6-3:13">not code</p>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>code</code></pre></blockquote>
-05_02__container_blocks__list_items__001:
- canonical: |
- <p>A paragraph
- with two lines.</p>
- <pre><code>indented code
- </code></pre>
- <blockquote>
- <p>A block quote.</p>
- </blockquote>
- static: |-
- <p data-sourcepos="1:1-2:15" dir="auto">A paragraph
- with two lines.</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="4:5-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <blockquote data-sourcepos="6:1-6:16" dir="auto">
- <p data-sourcepos="6:3-6:16">A block quote.</p>
- </blockquote>
- wysiwyg: |-
- <p>A paragraph
- with two lines.</p>
-05_02__container_blocks__list_items__002:
- canonical: |
- <ol>
- <li>
- <p>A paragraph
- with two lines.</p>
- <pre><code>indented code
- </code></pre>
- <blockquote>
- <p>A block quote.</p>
- </blockquote>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-6:20" dir="auto">
- <li data-sourcepos="1:1-6:20">
- <p data-sourcepos="1:5-2:19">A paragraph
- with two lines.</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="4:9-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <blockquote data-sourcepos="6:5-6:20">
- <p data-sourcepos="6:7-6:20">A block quote.</p>
- </blockquote>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>A paragraph
- with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
-05_02__container_blocks__list_items__003:
- canonical: |
- <ul>
- <li>one</li>
- </ul>
- <p>two</p>
- static: |-
- <ul data-sourcepos="1:1-2:0" dir="auto">
- <li data-sourcepos="1:1-2:0">one</li>
- </ul>
- <p data-sourcepos="3:2-3:4" dir="auto">two</p>
- wysiwyg: |-
- <ul bullet="*"><li><p>one</p></li></ul>
-05_02__container_blocks__list_items__004:
- canonical: |
- <ul>
- <li>
- <p>one</p>
- <p>two</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-3:5" dir="auto">
- <li data-sourcepos="1:1-3:5">
- <p data-sourcepos="1:3-1:5">one</p>
- <p data-sourcepos="3:3-3:5">two</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>one</p><p>two</p></li></ul>
-05_02__container_blocks__list_items__005:
- canonical: |
- <ul>
- <li>one</li>
- </ul>
- <pre><code> two
- </code></pre>
- static: |-
- <ul data-sourcepos="1:2-2:0" dir="auto">
- <li data-sourcepos="1:2-2:0">one</li>
- </ul>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:5-3:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> two</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <ul bullet="*"><li><p>one</p></li></ul>
-05_02__container_blocks__list_items__006:
- canonical: |
- <ul>
- <li>
- <p>one</p>
- <p>two</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:2-3:9" dir="auto">
- <li data-sourcepos="1:2-3:9">
- <p data-sourcepos="1:7-1:9">one</p>
- <p data-sourcepos="3:7-3:9">two</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>one</p><p>two</p></li></ul>
-05_02__container_blocks__list_items__007:
- canonical: |
- <blockquote>
- <blockquote>
- <ol>
- <li>
- <p>one</p>
- <p>two</p>
- </li>
- </ol>
- </blockquote>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:4-3:10" dir="auto">
- <blockquote data-sourcepos="1:6-3:10">
- <ol data-sourcepos="1:8-3:10">
- <li data-sourcepos="1:8-3:10">
- <p data-sourcepos="1:12-1:14">one</p>
- <p data-sourcepos="3:8-3:10">two</p>
- </li>
- </ol>
- </blockquote>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><blockquote multiline="false"><ol parens="false"><li><p>one</p><p>two</p></li></ol></blockquote></blockquote>
-05_02__container_blocks__list_items__008:
- canonical: |
- <blockquote>
- <blockquote>
- <ul>
- <li>one</li>
- </ul>
- <p>two</p>
- </blockquote>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-3:10" dir="auto">
- <blockquote data-sourcepos="1:2-3:10">
- <ul data-sourcepos="1:3-2:2">
- <li data-sourcepos="1:3-2:2">one</li>
- </ul>
- <p data-sourcepos="3:8-3:10">two</p>
- </blockquote>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><blockquote multiline="false"><ul bullet="*"><li><p>one</p></li></ul><p>two</p></blockquote></blockquote>
-05_02__container_blocks__list_items__009:
- canonical: |
- <p>-one</p>
- <p>2.two</p>
- static: |-
- <p data-sourcepos="1:1-1:4" dir="auto">-one</p>
- <p data-sourcepos="3:1-3:5" dir="auto">2.two</p>
- wysiwyg: |-
- <p>-one</p>
-05_02__container_blocks__list_items__010:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <p>bar</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:5" dir="auto">
- <li data-sourcepos="1:1-4:5">
- <p data-sourcepos="1:3-1:5">foo</p>
- <p data-sourcepos="4:3-4:5">bar</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
-05_02__container_blocks__list_items__011:
- canonical: |
- <ol>
- <li>
- <p>foo</p>
- <pre><code>bar
- </code></pre>
- <p>baz</p>
- <blockquote>
- <p>bam</p>
- </blockquote>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-9:9" dir="auto">
- <li data-sourcepos="1:1-9:9">
- <p data-sourcepos="1:5-1:7">foo</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:5-5:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="7:5-7:7">baz</p>
- <blockquote data-sourcepos="9:5-9:9">
- <p data-sourcepos="9:7-9:9">bam</p>
- </blockquote>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre><p>baz</p><blockquote multiline="false"><p>bam</p></blockquote></li></ol>
-05_02__container_blocks__list_items__012:
- canonical: |
- <ul>
- <li>
- <p>Foo</p>
- <pre><code>bar
-
-
- baz
- </code></pre>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-6:9" dir="auto">
- <li data-sourcepos="1:1-6:9">
- <p data-sourcepos="1:3-1:5">Foo</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:7-6:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span>
- <span id="LC2" class="line" lang="plaintext"></span>
- <span id="LC3" class="line" lang="plaintext"></span>
- <span id="LC4" class="line" lang="plaintext">baz</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>Foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar
-
-
- baz</code></pre></li></ul>
-05_02__container_blocks__list_items__013:
- canonical: |
- <ol start="123456789">
- <li>ok</li>
- </ol>
- static: |-
- <ol start="123456789" data-sourcepos="1:1-1:13" dir="auto">
- <li data-sourcepos="1:1-1:13">ok</li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>ok</p></li></ol>
-05_02__container_blocks__list_items__014:
- canonical: |
- <p>1234567890. not ok</p>
- static: |-
- <p data-sourcepos="1:1-1:18" dir="auto">1234567890. not ok</p>
- wysiwyg: |-
- <p>1234567890. not ok</p>
-05_02__container_blocks__list_items__015:
- canonical: |
- <ol start="0">
- <li>ok</li>
- </ol>
- static: |-
- <ol start="0" data-sourcepos="1:1-1:5" dir="auto">
- <li data-sourcepos="1:1-1:5">ok</li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>ok</p></li></ol>
-05_02__container_blocks__list_items__016:
- canonical: |
- <ol start="3">
- <li>ok</li>
- </ol>
- static: |-
- <ol start="3" data-sourcepos="1:1-1:7" dir="auto">
- <li data-sourcepos="1:1-1:7">ok</li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>ok</p></li></ol>
-05_02__container_blocks__list_items__017:
- canonical: |
- <p>-1. not ok</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">-1. not ok</p>
- wysiwyg: |-
- <p>-1. not ok</p>
-05_02__container_blocks__list_items__018:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <pre><code>bar
- </code></pre>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-3:9" dir="auto">
- <li data-sourcepos="1:1-3:9">
- <p data-sourcepos="1:3-1:5">foo</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:7-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ul>
-05_02__container_blocks__list_items__019:
- canonical: |
- <ol start="10">
- <li>
- <p>foo</p>
- <pre><code>bar
- </code></pre>
- </li>
- </ol>
- static: |-
- <ol start="10" data-sourcepos="1:3-3:14" dir="auto">
- <li data-sourcepos="1:3-3:14">
- <p data-sourcepos="1:8-1:10">foo</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:12-3:14" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>foo</p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ol>
-05_02__container_blocks__list_items__020:
- canonical: |
- <pre><code>indented code
- </code></pre>
- <p>paragraph</p>
- <pre><code>more code
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="3:1-3:9" dir="auto">paragraph</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:5-5:13" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
-05_02__container_blocks__list_items__021:
- canonical: |
- <ol>
- <li>
- <pre><code>indented code
- </code></pre>
- <p>paragraph</p>
- <pre><code>more code
- </code></pre>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-5:16" dir="auto">
- <li data-sourcepos="1:1-5:16">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:8-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="3:4-3:12">paragraph</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:8-5:16" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><p>paragraph</p><pre class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
-05_02__container_blocks__list_items__022:
- canonical: |
- <ol>
- <li>
- <pre><code> indented code
- </code></pre>
- <p>paragraph</p>
- <pre><code>more code
- </code></pre>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-5:16" dir="auto">
- <li data-sourcepos="1:1-5:16">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:8-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="3:4-3:12">paragraph</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:8-5:16" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code> indented code</code></pre><p>paragraph</p><pre class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
-05_02__container_blocks__list_items__023:
- canonical: |
- <p>foo</p>
- <p>bar</p>
- static: |-
- <p data-sourcepos="1:4-1:6" dir="auto">foo</p>
- <p data-sourcepos="3:1-3:3" dir="auto">bar</p>
- wysiwyg: |-
- <p>foo</p>
-05_02__container_blocks__list_items__024:
- canonical: |
- <ul>
- <li>foo</li>
- </ul>
- <p>bar</p>
- static: |-
- <ul data-sourcepos="1:1-2:0" dir="auto">
- <li data-sourcepos="1:1-2:0">foo</li>
- </ul>
- <p data-sourcepos="3:3-3:5" dir="auto">bar</p>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li></ul>
-05_02__container_blocks__list_items__025:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <p>bar</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-3:6" dir="auto">
- <li data-sourcepos="1:1-3:6">
- <p data-sourcepos="1:4-1:6">foo</p>
- <p data-sourcepos="3:4-3:6">bar</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
-05_02__container_blocks__list_items__026:
- canonical: |
- <ul>
- <li>foo</li>
- <li>
- <pre><code>bar
- </code></pre>
- </li>
- <li>
- <pre><code>baz
- </code></pre>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-8:9" dir="auto">
- <li data-sourcepos="1:1-2:5">foo</li>
- <li data-sourcepos="3:1-6:5">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="4:3-6:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- <li data-sourcepos="7:1-8:9">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="8:7-8:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">baz</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>baz</code></pre></li></ul>
-05_02__container_blocks__list_items__027:
- canonical: |
- <ul>
- <li>foo</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-2:5" dir="auto">
- <li data-sourcepos="1:1-2:5">foo</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li></ul>
-05_02__container_blocks__list_items__028:
- canonical: |
- <ul>
- <li></li>
- </ul>
- <p>foo</p>
- static: |-
- <ul data-sourcepos="1:1-2:0" dir="auto">
- <li data-sourcepos="1:1-1:1">
- </li>
- </ul>
- <p data-sourcepos="3:3-3:5" dir="auto">foo</p>
- wysiwyg: |-
- <ul bullet="*"><li><p></p></li></ul>
-05_02__container_blocks__list_items__029:
- canonical: |
- <ul>
- <li>foo</li>
- <li></li>
- <li>bar</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-3:5" dir="auto">
- <li data-sourcepos="1:1-1:5">foo</li>
- <li data-sourcepos="2:1-2:1">
- </li>
- <li data-sourcepos="3:1-3:5">bar</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li><li><p></p></li><li><p>bar</p></li></ul>
-05_02__container_blocks__list_items__030:
- canonical: |
- <ul>
- <li>foo</li>
- <li></li>
- <li>bar</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-3:5" dir="auto">
- <li data-sourcepos="1:1-1:5">foo</li>
- <li data-sourcepos="2:1-2:4">
- </li>
- <li data-sourcepos="3:1-3:5">bar</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li><li><p></p></li><li><p>bar</p></li></ul>
-05_02__container_blocks__list_items__031:
- canonical: |
- <ol>
- <li>foo</li>
- <li></li>
- <li>bar</li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-3:6" dir="auto">
- <li data-sourcepos="1:1-1:6">foo</li>
- <li data-sourcepos="2:1-2:2">
- </li>
- <li data-sourcepos="3:1-3:6">bar</li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>foo</p></li><li><p></p></li><li><p>bar</p></li></ol>
-05_02__container_blocks__list_items__032:
- canonical: |
- <ul>
- <li></li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-1:1" dir="auto">
- <li data-sourcepos="1:1-1:1">
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p></p></li></ul>
-05_02__container_blocks__list_items__033:
- canonical: |
- <p>foo
- *</p>
- <p>foo
- 1.</p>
- static: |-
- <p data-sourcepos="1:1-2:1" dir="auto">foo
- *</p>
- <p data-sourcepos="4:1-5:2" dir="auto">foo
- 1.</p>
- wysiwyg: |-
- <p>foo
- *</p>
-05_02__container_blocks__list_items__034:
- canonical: |
- <ol>
- <li>
- <p>A paragraph
- with two lines.</p>
- <pre><code>indented code
- </code></pre>
- <blockquote>
- <p>A block quote.</p>
- </blockquote>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:2-6:21" dir="auto">
- <li data-sourcepos="1:2-6:21">
- <p data-sourcepos="1:6-2:20">A paragraph
- with two lines.</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="4:10-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <blockquote data-sourcepos="6:6-6:21">
- <p data-sourcepos="6:8-6:21">A block quote.</p>
- </blockquote>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>A paragraph
- with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
-05_02__container_blocks__list_items__035:
- canonical: |
- <ol>
- <li>
- <p>A paragraph
- with two lines.</p>
- <pre><code>indented code
- </code></pre>
- <blockquote>
- <p>A block quote.</p>
- </blockquote>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:3-6:22" dir="auto">
- <li data-sourcepos="1:3-6:22">
- <p data-sourcepos="1:7-2:21">A paragraph
- with two lines.</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="4:11-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <blockquote data-sourcepos="6:7-6:22">
- <p data-sourcepos="6:9-6:22">A block quote.</p>
- </blockquote>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>A paragraph
- with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
-05_02__container_blocks__list_items__036:
- canonical: |
- <ol>
- <li>
- <p>A paragraph
- with two lines.</p>
- <pre><code>indented code
- </code></pre>
- <blockquote>
- <p>A block quote.</p>
- </blockquote>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:4-6:23" dir="auto">
- <li data-sourcepos="1:4-6:23">
- <p data-sourcepos="1:8-2:22">A paragraph
- with two lines.</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="4:12-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <blockquote data-sourcepos="6:8-6:23">
- <p data-sourcepos="6:10-6:23">A block quote.</p>
- </blockquote>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>A paragraph
- with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
-05_02__container_blocks__list_items__037:
- canonical: |
- <pre><code>1. A paragraph
- with two lines.
-
- indented code
-
- &gt; A block quote.
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-6:24" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. A paragraph</span>
- <span id="LC2" class="line" lang="plaintext"> with two lines.</span>
- <span id="LC3" class="line" lang="plaintext"></span>
- <span id="LC4" class="line" lang="plaintext"> indented code</span>
- <span id="LC5" class="line" lang="plaintext"></span>
- <span id="LC6" class="line" lang="plaintext"> &gt; A block quote.</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>1. A paragraph
- with two lines.
-
- indented code
-
- &gt; A block quote.</code></pre>
-05_02__container_blocks__list_items__038:
- canonical: |
- <ol>
- <li>
- <p>A paragraph
- with two lines.</p>
- <pre><code>indented code
- </code></pre>
- <blockquote>
- <p>A block quote.</p>
- </blockquote>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:3-6:22" dir="auto">
- <li data-sourcepos="1:3-6:22">
- <p data-sourcepos="1:7-2:15">A paragraph
- with two lines.</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="4:11-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>
- <copy-code></copy-code>
- </div>
- <blockquote data-sourcepos="6:7-6:22">
- <p data-sourcepos="6:9-6:22">A block quote.</p>
- </blockquote>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>A paragraph
- with two lines.</p><pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote multiline="false"><p>A block quote.</p></blockquote></li></ol>
-05_02__container_blocks__list_items__039:
- canonical: |
- <ol>
- <li>A paragraph
- with two lines.</li>
- </ol>
- static: |-
- <ol data-sourcepos="1:3-2:19" dir="auto">
- <li data-sourcepos="1:3-2:19">A paragraph
- with two lines.</li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>A paragraph
- with two lines.</p></li></ol>
-05_02__container_blocks__list_items__040:
- canonical: |
- <blockquote>
- <ol>
- <li>
- <blockquote>
- <p>Blockquote
- continued here.</p>
- </blockquote>
- </li>
- </ol>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-2:15" dir="auto">
- <ol data-sourcepos="1:3-2:15">
- <li data-sourcepos="1:3-2:15">
- <blockquote data-sourcepos="1:6-2:15">
- <p data-sourcepos="1:8-2:15">Blockquote
- continued here.</p>
- </blockquote>
- </li>
- </ol>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><ol parens="false"><li><p></p><blockquote multiline="false"><p>Blockquote
- continued here.</p></blockquote></li></ol></blockquote>
-05_02__container_blocks__list_items__041:
- canonical: |
- <blockquote>
- <ol>
- <li>
- <blockquote>
- <p>Blockquote
- continued here.</p>
- </blockquote>
- </li>
- </ol>
- </blockquote>
- static: |-
- <blockquote data-sourcepos="1:1-2:17" dir="auto">
- <ol data-sourcepos="1:3-2:17">
- <li data-sourcepos="1:3-2:17">
- <blockquote data-sourcepos="1:6-2:17">
- <p data-sourcepos="1:8-2:17">Blockquote
- continued here.</p>
- </blockquote>
- </li>
- </ol>
- </blockquote>
- wysiwyg: |-
- <blockquote multiline="false"><ol parens="false"><li><p></p><blockquote multiline="false"><p>Blockquote
- continued here.</p></blockquote></li></ol></blockquote>
-05_02__container_blocks__list_items__042:
- canonical: |
- <ul>
- <li>foo
- <ul>
- <li>bar
- <ul>
- <li>baz
- <ul>
- <li>boo</li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:11" dir="auto">
- <li data-sourcepos="1:1-4:11">foo
- <ul data-sourcepos="2:3-4:11">
- <li data-sourcepos="2:3-4:11">bar
- <ul data-sourcepos="3:5-4:11">
- <li data-sourcepos="3:5-4:11">baz
- <ul data-sourcepos="4:7-4:11">
- <li data-sourcepos="4:7-4:11">boo</li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p><ul bullet="*"><li><p>baz</p><ul bullet="*"><li><p>boo</p></li></ul></li></ul></li></ul></li></ul>
-05_02__container_blocks__list_items__043:
- canonical: |
- <ul>
- <li>foo</li>
- <li>bar</li>
- <li>baz</li>
- <li>boo</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:8" dir="auto">
- <li data-sourcepos="1:1-1:5">foo</li>
- <li data-sourcepos="2:2-2:6">bar</li>
- <li data-sourcepos="3:3-3:7">baz</li>
- <li data-sourcepos="4:4-4:8">boo</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li><li><p>baz</p></li><li><p>boo</p></li></ul>
-05_02__container_blocks__list_items__044:
- canonical: |
- <ol start="10">
- <li>foo
- <ul>
- <li>bar</li>
- </ul>
- </li>
- </ol>
- static: |-
- <ol start="10" data-sourcepos="1:1-2:9" dir="auto">
- <li data-sourcepos="1:1-2:9">foo
- <ul data-sourcepos="2:5-2:9">
- <li data-sourcepos="2:5-2:9">bar</li>
- </ul>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>foo</p><ul bullet="*"><li><p>bar</p></li></ul></li></ol>
-05_02__container_blocks__list_items__045:
- canonical: |
- <ol start="10">
- <li>foo</li>
- </ol>
- <ul>
- <li>bar</li>
- </ul>
- static: |-
- <ol start="10" data-sourcepos="1:1-1:7" dir="auto">
- <li data-sourcepos="1:1-1:7">foo</li>
- </ol>
- <ul data-sourcepos="2:4-2:8" dir="auto">
- <li data-sourcepos="2:4-2:8">bar</li>
- </ul>
- wysiwyg: |-
- <ol parens="false"><li><p>foo</p></li></ol>
-05_02__container_blocks__list_items__046:
- canonical: |
- <ul>
- <li>
- <ul>
- <li>foo</li>
- </ul>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-1:7" dir="auto">
- <li data-sourcepos="1:1-1:7">
- <ul data-sourcepos="1:3-1:7">
- <li data-sourcepos="1:3-1:7">foo</li>
- </ul>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p></p><ul bullet="*"><li><p>foo</p></li></ul></li></ul>
-05_02__container_blocks__list_items__047:
- canonical: |
- <ol>
- <li>
- <ul>
- <li>
- <ol start="2">
- <li>foo</li>
- </ol>
- </li>
- </ul>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-1:11" dir="auto">
- <li data-sourcepos="1:1-1:11">
- <ul data-sourcepos="1:4-1:11">
- <li data-sourcepos="1:4-1:11">
- <ol start="2" data-sourcepos="1:6-1:11">
- <li data-sourcepos="1:6-1:11">foo</li>
- </ol>
- </li>
- </ul>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p></p><ul bullet="*"><li><p></p><ol parens="false"><li><p>foo</p></li></ol></li></ul></li></ol>
-05_02__container_blocks__list_items__048:
- canonical: |
- <ul>
- <li>
- <h1>Foo</h1>
- </li>
- <li>
- <h2>Bar</h2>
- baz</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:5" dir="auto">
- <li data-sourcepos="1:1-1:7">
- <h1 data-sourcepos="1:3-1:7">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
- </li>
- <li data-sourcepos="2:1-4:5">
- <h2 data-sourcepos="2:3-4:5">
- <a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>Bar</h2>
- baz</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p></p><h1>Foo</h1></li><li><p></p><h2>Bar
- baz</h2></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__049:
- canonical: |
- <ul>
- <li><input disabled="" type="checkbox"> foo</li>
- <li><input checked="" disabled="" type="checkbox"> bar</li>
- </ul>
- <ul>
- <li><input checked="" disabled="" type="checkbox"> foo
- <ul>
- <li><input disabled="" type="checkbox"> bar</li>
- <li><input checked="" disabled="" type="checkbox"> baz</li>
- </ul>
- </li>
- <li><input disabled="" type="checkbox"> bim</li>
- </ul>
- <ul>
- <li>foo</li>
- <li>bar</li>
- </ul>
- <ul>
- <li>baz</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-8:5" class="task-list" dir="auto">
- <li data-sourcepos="1:1-1:9" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> foo</li>
- <li data-sourcepos="2:1-2:9" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> bar</li>
- <li data-sourcepos="3:1-5:11" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> foo
- <ul data-sourcepos="4:3-5:11" class="task-list">
- <li data-sourcepos="4:3-4:11" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> bar</li>
- <li data-sourcepos="5:3-5:11" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> baz</li>
- </ul>
- </li>
- <li data-sourcepos="6:1-6:9" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> bim</li>
- <li data-sourcepos="7:1-7:5">foo</li>
- <li data-sourcepos="8:1-8:5">bar</li>
- </ul>
- <ul data-sourcepos="9:1-9:5" dir="auto">
- <li data-sourcepos="9:1-9:5">baz</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>baz</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__050:
- canonical: |
- <ol>
- <li>foo</li>
- <li>bar</li>
- </ol>
- <ol start="3">
- <li>baz</li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-2:6" dir="auto">
- <li data-sourcepos="1:1-1:6">foo</li>
- <li data-sourcepos="2:1-2:6">bar</li>
- </ol>
- <ol start="3" data-sourcepos="3:1-3:6" dir="auto">
- <li data-sourcepos="3:1-3:6">baz</li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>foo</p></li><li><p>bar</p></li></ol>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__051:
- canonical: |
- <p>Foo</p>
- <ul>
- <li>bar</li>
- <li>baz</li>
- </ul>
- static: |-
- <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>
- <ul data-sourcepos="2:1-3:5" dir="auto">
- <li data-sourcepos="2:1-2:5">bar</li>
- <li data-sourcepos="3:1-3:5">baz</li>
- </ul>
- wysiwyg: |-
- <p>Foo</p>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__052:
- canonical: |
- <p>The number of windows in my house is
- 14. The number of doors is 6.</p>
- static: |-
- <p data-sourcepos="1:1-2:30" dir="auto">The number of windows in my house is
- 14. The number of doors is 6.</p>
- wysiwyg: |-
- <p>The number of windows in my house is
- 14. The number of doors is 6.</p>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__053:
- canonical: |
- <p>The number of windows in my house is</p>
- <ol>
- <li>The number of doors is 6.</li>
- </ol>
- static: |-
- <p data-sourcepos="1:1-1:36" dir="auto">The number of windows in my house is</p>
- <ol data-sourcepos="2:1-2:29" dir="auto">
- <li data-sourcepos="2:1-2:29">The number of doors is 6.</li>
- </ol>
- wysiwyg: |-
- <p>The number of windows in my house is</p>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__054:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- </li>
- <li>
- <p>bar</p>
- </li>
- <li>
- <p>baz</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-6:5" dir="auto">
- <li data-sourcepos="1:1-2:0">
- <p data-sourcepos="1:3-1:5">foo</p>
- </li>
- <li data-sourcepos="3:1-5:0">
- <p data-sourcepos="3:3-3:5">bar</p>
- </li>
- <li data-sourcepos="6:1-6:5">
- <p data-sourcepos="6:3-6:5">baz</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li><li><p>baz</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__055:
- canonical: |
- <ul>
- <li>foo
- <ul>
- <li>bar
- <ul>
- <li>
- <p>baz</p>
- <p>bim</p>
- </li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-6:9" dir="auto">
- <li data-sourcepos="1:1-6:9">foo
- <ul data-sourcepos="2:3-6:9">
- <li data-sourcepos="2:3-6:9">bar
- <ul data-sourcepos="3:5-6:9">
- <li data-sourcepos="3:5-6:9">
- <p data-sourcepos="3:7-3:9">baz</p>
- <p data-sourcepos="6:7-6:9">bim</p>
- </li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p><ul bullet="*"><li><p>baz</p><p>bim</p></li></ul></li></ul></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__056:
- canonical: |
- <ul>
- <li>foo</li>
- <li>bar</li>
- </ul>
- <!-- -->
- <ul>
- <li>baz</li>
- <li>bim</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-3:0" dir="auto">
- <li data-sourcepos="1:1-1:5">foo</li>
- <li data-sourcepos="2:1-3:0">bar</li>
- </ul>
-
- <ul data-sourcepos="6:1-7:5" dir="auto">
- <li data-sourcepos="6:1-6:5">baz</li>
- <li data-sourcepos="7:1-7:5">bim</li>
- </ul>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__057:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <p>notcode</p>
- </li>
- <li>
- <p>foo</p>
- </li>
- </ul>
- <!-- -->
- <pre><code>code
- </code></pre>
- static: |-
- <ul data-sourcepos="1:1-6:0" dir="auto">
- <li data-sourcepos="1:1-4:0">
- <p data-sourcepos="1:5-1:7">foo</p>
- <p data-sourcepos="3:5-3:11">notcode</p>
- </li>
- <li data-sourcepos="5:1-6:0">
- <p data-sourcepos="5:5-5:7">foo</p>
- </li>
- </ul>
-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="9:5-9:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__058:
- canonical: |
- <ul>
- <li>a</li>
- <li>b</li>
- <li>c</li>
- <li>d</li>
- <li>e</li>
- <li>f</li>
- <li>g</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-7:3" dir="auto">
- <li data-sourcepos="1:1-1:3">a</li>
- <li data-sourcepos="2:2-2:4">b</li>
- <li data-sourcepos="3:3-3:5">c</li>
- <li data-sourcepos="4:4-4:6">d</li>
- <li data-sourcepos="5:3-5:5">e</li>
- <li data-sourcepos="6:2-6:4">f</li>
- <li data-sourcepos="7:1-7:3">g</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li><li><p>d</p></li><li><p>e</p></li><li><p>f</p></li><li><p>g</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__059:
- canonical: |
- <ol>
- <li>
- <p>a</p>
- </li>
- <li>
- <p>b</p>
- </li>
- <li>
- <p>c</p>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-5:7" dir="auto">
- <li data-sourcepos="1:1-2:0">
- <p data-sourcepos="1:4-1:4">a</p>
- </li>
- <li data-sourcepos="3:3-4:0">
- <p data-sourcepos="3:6-3:6">b</p>
- </li>
- <li data-sourcepos="5:4-5:7">
- <p data-sourcepos="5:7-5:7">c</p>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li></ol>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__060:
- canonical: |
- <ul>
- <li>a</li>
- <li>b</li>
- <li>c</li>
- <li>d
- - e</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-5:7" dir="auto">
- <li data-sourcepos="1:1-1:3">a</li>
- <li data-sourcepos="2:2-2:4">b</li>
- <li data-sourcepos="3:3-3:5">c</li>
- <li data-sourcepos="4:4-5:7">d
- - e</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li><li><p>d
- - e</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__061:
- canonical: |
- <ol>
- <li>
- <p>a</p>
- </li>
- <li>
- <p>b</p>
- </li>
- </ol>
- <pre><code>3. c
- </code></pre>
- static: |-
- <ol data-sourcepos="1:1-4:0" dir="auto">
- <li data-sourcepos="1:1-2:0">
- <p data-sourcepos="1:4-1:4">a</p>
- </li>
- <li data-sourcepos="3:3-4:0">
- <p data-sourcepos="3:6-3:6">b</p>
- </li>
- </ol>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:5-5:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">3. c</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <ol parens="false"><li><p>a</p></li><li><p>b</p></li></ol>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__062:
- canonical: |
- <ul>
- <li>
- <p>a</p>
- </li>
- <li>
- <p>b</p>
- </li>
- <li>
- <p>c</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:3" dir="auto">
- <li data-sourcepos="1:1-1:3">
- <p data-sourcepos="1:3-1:3">a</p>
- </li>
- <li data-sourcepos="2:1-3:0">
- <p data-sourcepos="2:3-2:3">b</p>
- </li>
- <li data-sourcepos="4:1-4:3">
- <p data-sourcepos="4:3-4:3">c</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__063:
- canonical: |
- <ul>
- <li>
- <p>a</p>
- </li>
- <li></li>
- <li>
- <p>c</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:3" dir="auto">
- <li data-sourcepos="1:1-1:3">
- <p data-sourcepos="1:3-1:3">a</p>
- </li>
- <li data-sourcepos="2:1-2:1">
- </li>
- <li data-sourcepos="4:1-4:3">
- <p data-sourcepos="4:3-4:3">c</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li><li><p></p></li><li><p>c</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__064:
- canonical: |
- <ul>
- <li>
- <p>a</p>
- </li>
- <li>
- <p>b</p>
- <p>c</p>
- </li>
- <li>
- <p>d</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-5:3" dir="auto">
- <li data-sourcepos="1:1-1:3">
- <p data-sourcepos="1:3-1:3">a</p>
- </li>
- <li data-sourcepos="2:1-4:3">
- <p data-sourcepos="2:3-2:3">b</p>
- <p data-sourcepos="4:3-4:3">c</p>
- </li>
- <li data-sourcepos="5:1-5:3">
- <p data-sourcepos="5:3-5:3">d</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li><li><p>b</p><p>c</p></li><li><p>d</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__065:
- canonical: |
- <ul>
- <li>
- <p>a</p>
- </li>
- <li>
- <p>b</p>
- </li>
- <li>
- <p>d</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-5:3" dir="auto">
- <li data-sourcepos="1:1-1:3">
- <p data-sourcepos="1:3-1:3">a</p>
- </li>
- <li data-sourcepos="2:1-4:13">
- <p data-sourcepos="2:3-2:3">b</p>
- </li>
- <li data-sourcepos="5:1-5:3">
- <p data-sourcepos="5:3-5:3">d</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li><li><p>b</p></li><li><p>d</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__066:
- canonical: |
- <ul>
- <li>a</li>
- <li>
- <pre><code>b
-
-
- </code></pre>
- </li>
- <li>c</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-7:3" dir="auto">
- <li data-sourcepos="1:1-1:3">a</li>
- <li data-sourcepos="2:1-6:5">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="2:3-6:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">b</span>
- <span id="LC2" class="line" lang="plaintext"></span>
- <span id="LC3" class="line" lang="plaintext"></span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- <li data-sourcepos="7:1-7:3">c</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>b
-
- </code></pre></li><li><p>c</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__067:
- canonical: |
- <ul>
- <li>a
- <ul>
- <li>
- <p>b</p>
- <p>c</p>
- </li>
- </ul>
- </li>
- <li>d</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-5:3" dir="auto">
- <li data-sourcepos="1:1-4:5">a
- <ul data-sourcepos="2:3-4:5">
- <li data-sourcepos="2:3-4:5">
- <p data-sourcepos="2:5-2:5">b</p>
- <p data-sourcepos="4:5-4:5">c</p>
- </li>
- </ul>
- </li>
- <li data-sourcepos="5:1-5:3">d</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p><ul bullet="*"><li><p>b</p><p>c</p></li></ul></li><li><p>d</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__068:
- canonical: |
- <ul>
- <li>a
- <blockquote>
- <p>b</p>
- </blockquote>
- </li>
- <li>c</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:3" dir="auto">
- <li data-sourcepos="1:1-3:3">a
- <blockquote data-sourcepos="2:3-3:3">
- <p data-sourcepos="2:5-2:5">b</p>
- </blockquote>
- </li>
- <li data-sourcepos="4:1-4:3">c</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p><blockquote multiline="false"><p>b</p></blockquote></li><li><p>c</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__069:
- canonical: |
- <ul>
- <li>a
- <blockquote>
- <p>b</p>
- </blockquote>
- <pre><code>c
- </code></pre>
- </li>
- <li>d</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-6:3" dir="auto">
- <li data-sourcepos="1:1-5:5">a
- <blockquote data-sourcepos="2:3-2:5">
- <p data-sourcepos="2:5-2:5">b</p>
- </blockquote>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="3:3-5:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">c</span></code></pre>
- <copy-code></copy-code>
- </div>
- </li>
- <li data-sourcepos="6:1-6:3">d</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p><blockquote multiline="false"><p>b</p></blockquote><pre class="content-editor-code-block undefined code highlight"><code>c</code></pre></li><li><p>d</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__070:
- canonical: |
- <ul>
- <li>a</li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-1:3" dir="auto">
- <li data-sourcepos="1:1-1:3">a</li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__071:
- canonical: |
- <ul>
- <li>a
- <ul>
- <li>b</li>
- </ul>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-2:5" dir="auto">
- <li data-sourcepos="1:1-2:5">a
- <ul data-sourcepos="2:3-2:5">
- <li data-sourcepos="2:3-2:5">b</li>
- </ul>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p><ul bullet="*"><li><p>b</p></li></ul></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__072:
- canonical: |
- <ol>
- <li>
- <pre><code>foo
- </code></pre>
- <p>bar</p>
- </li>
- </ol>
- static: |-
- <ol data-sourcepos="1:1-5:6" dir="auto">
- <li data-sourcepos="1:1-5:6">
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:4-3:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- <p data-sourcepos="5:4-5:6">bar</p>
- </li>
- </ol>
- wysiwyg: |-
- <ol parens="false"><li><p></p><pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre><p>bar</p></li></ol>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__073:
- canonical: |
- <ul>
- <li>
- <p>foo</p>
- <ul>
- <li>bar</li>
- </ul>
- <p>baz</p>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-4:5" dir="auto">
- <li data-sourcepos="1:1-4:5">
- <p data-sourcepos="1:3-1:5">foo</p>
- <ul data-sourcepos="2:3-3:0">
- <li data-sourcepos="2:3-3:0">bar</li>
- </ul>
- <p data-sourcepos="4:3-4:5">baz</p>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>foo</p><ul bullet="*"><li><p>bar</p></li></ul><p>baz</p></li></ul>
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__074:
- canonical: |
- <ul>
- <li>
- <p>a</p>
- <ul>
- <li>b</li>
- <li>c</li>
- </ul>
- </li>
- <li>
- <p>d</p>
- <ul>
- <li>e</li>
- <li>f</li>
- </ul>
- </li>
- </ul>
- static: |-
- <ul data-sourcepos="1:1-7:5" dir="auto">
- <li data-sourcepos="1:1-4:0">
- <p data-sourcepos="1:3-1:3">a</p>
- <ul data-sourcepos="2:3-4:0">
- <li data-sourcepos="2:3-2:5">b</li>
- <li data-sourcepos="3:3-4:0">c</li>
- </ul>
- </li>
- <li data-sourcepos="5:1-7:5">
- <p data-sourcepos="5:3-5:3">d</p>
- <ul data-sourcepos="6:3-7:5">
- <li data-sourcepos="6:3-6:5">e</li>
- <li data-sourcepos="7:3-7:5">f</li>
- </ul>
- </li>
- </ul>
- wysiwyg: |-
- <ul bullet="*"><li><p>a</p><ul bullet="*"><li><p>b</p></li><li><p>c</p></li></ul></li><li><p>d</p><ul bullet="*"><li><p>e</p></li><li><p>f</p></li></ul></li></ul>
-06_01__inlines__001:
- canonical: |
- <p><code>hi</code>lo`</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><code>hi</code>lo`</p>
- wysiwyg: |-
- <p><code>hi</code>lo`</p>
-06_02__inlines__backslash_escapes__001:
- canonical: |
- <p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
- static: |-
- <p data-sourcepos="1:1-1:224" dir="auto"><span>!</span>"<span>#</span><span>$</span><span>%</span><span>&amp;</span>'()*+,-./:;&lt;=&gt;?<span>@</span>[\]<span>^</span>_`{|}<span>~</span></p>
- wysiwyg: |-
- <p>!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
-06_02__inlines__backslash_escapes__002:
- canonical: "<p>\\\t\\A\\a\\ \\3\\φ\\«</p>\n"
- static: "<p data-sourcepos=\"1:1-1:16\" dir=\"auto\">\\\t\\A\\a\\ \\3\\φ\\«</p>"
- wysiwyg: "<p>\\\t\\A\\a\\ \\3\\φ\\«</p>"
-06_02__inlines__backslash_escapes__003:
- canonical: |
- <p>*not emphasized*
- &lt;br/&gt; not a tag
- [not a link](/foo)
- `not code`
- 1. not a list
- * not a list
- # not a heading
- [foo]: /url &quot;not a reference&quot;
- &amp;ouml; not a character entity</p>
- static: |-
- <p data-sourcepos="1:1-9:50" dir="auto">*not emphasized*
- &lt;br/&gt; not a tag
- <a href="/foo">not a link</a>
- `not code`
- 1. not a list
- * not a list
- <span>#</span> not a heading
- [foo]: /url "not a reference"
- <span>&amp;</span>ouml; not a character entity</p>
- wysiwyg: |-
- <p>*not emphasized*
- &lt;br/&gt; not a tag
- [not a link](/foo)
- `not code`
- 1. not a list
- * not a list
- # not a heading
- [foo]: /url "not a reference"
- &amp;ouml; not a character entity</p>
-06_02__inlines__backslash_escapes__004:
- canonical: |
- <p>\<em>emphasis</em></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">\<em>emphasis</em></p>
- wysiwyg: |-
- <p>\<em>emphasis</em></p>
-06_02__inlines__backslash_escapes__005:
- canonical: |
- <p>foo<br />
- bar</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
- bar</p>
- wysiwyg: |-
- <p>foo<br>
- bar</p>
-06_02__inlines__backslash_escapes__006:
- canonical: |
- <p><code>\[\`</code></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><code>\[\`</code></p>
- wysiwyg: |-
- <p><code>\[\`</code></p>
-06_02__inlines__backslash_escapes__007:
- canonical: |
- <pre><code>\[\]
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\[\]</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>\[\]</code></pre>
-06_02__inlines__backslash_escapes__008:
- canonical: |
- <pre><code>\[\]
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\[\]</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>\[\]</code></pre>
-06_02__inlines__backslash_escapes__009:
- canonical: |
- <p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
- static: |-
- <p data-sourcepos="1:1-1:28" dir="auto"><a href="http://example.com?find=%5C*" rel="nofollow noreferrer noopener" target="_blank">http://example.com?find=\*</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
-06_02__inlines__backslash_escapes__010:
- canonical: |
- <a href="/bar\/)">
- static: |-
- <a href="/bar%5C/)" rel="nofollow noreferrer noopener" target="_blank"></a>
- wysiwyg: |-
- <p></p>
-06_02__inlines__backslash_escapes__011:
- canonical: |
- <p><a href="/bar*" title="ti*tle">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:23" dir="auto"><a href="/bar*" title="ti*tle">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
-06_02__inlines__backslash_escapes__012:
- canonical: |
- <p><a href="/bar*" title="ti*tle">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><a href="/bar*" title="ti*tle">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
-06_02__inlines__backslash_escapes__013:
- canonical: |
- <pre><code class="language-foo+bar">foo
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="foo+bar" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre language="foo+bar" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
-06_03__inlines__entity_and_numeric_character_references__001:
- canonical: |
- <p>  &amp; © Æ Ď
- ¾ ℋ ⅆ
- ∲ ≧̸</p>
- static: |-
- <p data-sourcepos="1:1-3:32" dir="auto">  &amp; © Æ Ď
- ¾ ℋ ⅆ
- ∲ ≧̸</p>
- wysiwyg: |-
- <p>&nbsp; &amp; © Æ Ď
- ¾ ℋ ⅆ
- ∲ ≧̸</p>
-06_03__inlines__entity_and_numeric_character_references__002:
- canonical: |
- <p># Ӓ Ϡ �</p>
- static: |-
- <p data-sourcepos="1:1-1:25" dir="auto"># Ӓ Ϡ �</p>
- wysiwyg: |-
- <p># Ӓ Ϡ �</p>
-06_03__inlines__entity_and_numeric_character_references__003:
- canonical: |
- <p>&quot; ആ ಫ</p>
- static: |-
- <p data-sourcepos="1:1-1:22" dir="auto">" ആ ಫ</p>
- wysiwyg: |-
- <p>" ആ ಫ</p>
-06_03__inlines__entity_and_numeric_character_references__004:
- canonical: |
- <p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
- &amp;#987654321;
- &amp;#abcdef0;
- &amp;ThisIsNotDefined; &amp;hi?;</p>
- static: |-
- <p data-sourcepos="1:1-4:24" dir="auto">&amp;nbsp &amp;x; &amp;#; &amp;#x;
- &amp;#987654321;
- &amp;#abcdef0;
- &amp;ThisIsNotDefined; &amp;hi?;</p>
- wysiwyg: |-
- <p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
- &amp;#987654321;
- &amp;#abcdef0;
- &amp;ThisIsNotDefined; &amp;hi?;</p>
-06_03__inlines__entity_and_numeric_character_references__005:
- canonical: |
- <p>&amp;copy</p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto">&amp;copy</p>
- wysiwyg: |-
- <p>&amp;copy</p>
-06_03__inlines__entity_and_numeric_character_references__006:
- canonical: |
- <p>&amp;MadeUpEntity;</p>
- static: |-
- <p data-sourcepos="1:1-1:14" dir="auto">&amp;MadeUpEntity;</p>
- wysiwyg: |-
- <p>&amp;MadeUpEntity;</p>
-06_03__inlines__entity_and_numeric_character_references__007:
- canonical: |
- <a href="&ouml;&ouml;.html">
- static: |-
- <a href="%C3%B6%C3%B6.html" rel="nofollow noreferrer noopener" target="_blank"></a>
- wysiwyg: |-
- <p></p>
-06_03__inlines__entity_and_numeric_character_references__008:
- canonical: |
- <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:37" dir="auto"><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
-06_03__inlines__entity_and_numeric_character_references__009:
- canonical: |
- <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
-06_03__inlines__entity_and_numeric_character_references__010:
- canonical: |
- <pre><code class="language-föö">foo
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="föö" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre language="föö" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
-06_03__inlines__entity_and_numeric_character_references__011:
- canonical: |
- <p><code>f&amp;ouml;&amp;ouml;</code></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><code>f&amp;ouml;&amp;ouml;</code></p>
- wysiwyg: |-
- <p><code>f&amp;ouml;&amp;ouml;</code></p>
-06_03__inlines__entity_and_numeric_character_references__012:
- canonical: |
- <pre><code>f&amp;ouml;f&amp;ouml;
- </code></pre>
- static: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:5-1:18" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">f&amp;ouml;f&amp;ouml;</span></code></pre>
- <copy-code></copy-code>
- </div>
- wysiwyg: |-
- <pre class="content-editor-code-block undefined code highlight"><code>f&amp;ouml;f&amp;ouml;</code></pre>
-06_03__inlines__entity_and_numeric_character_references__013:
- canonical: |
- <p>*foo*
- <em>foo</em></p>
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto">*foo*
- <em>foo</em></p>
- wysiwyg: |-
- <p>*foo*
- <em>foo</em></p>
-06_03__inlines__entity_and_numeric_character_references__014:
- canonical: |
- <p>* foo</p>
- <ul>
- <li>foo</li>
- </ul>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">* foo</p>
- <ul data-sourcepos="3:1-3:5" dir="auto">
- <li data-sourcepos="3:1-3:5">foo</li>
- </ul>
- wysiwyg: |-
- <p>* foo</p>
-06_03__inlines__entity_and_numeric_character_references__015:
- canonical: |
- <p>foo
-
- bar</p>
- static: |-
- <p data-sourcepos="1:1-1:16" dir="auto">foo
-
- bar</p>
- wysiwyg: |-
- <p>foo
-
- bar</p>
-06_03__inlines__entity_and_numeric_character_references__016:
- canonical: "<p>\tfoo</p>\n"
- static: "<p data-sourcepos=\"1:1-1:7\" dir=\"auto\">\tfoo</p>"
- wysiwyg: "<p>\tfoo</p>"
-06_03__inlines__entity_and_numeric_character_references__017:
- canonical: |
- <p>[a](url &quot;tit&quot;)</p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto"><a href="url" title="tit">a</a></p>
- wysiwyg: |-
- <p>[a](url "tit")</p>
-06_04__inlines__code_spans__001:
- canonical: |
- <p><code>foo</code></p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><code>foo</code></p>
- wysiwyg: |-
- <p><code>foo</code></p>
-06_04__inlines__code_spans__002:
- canonical: |
- <p><code>foo ` bar</code></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><code>foo ` bar</code></p>
- wysiwyg: |-
- <p><code>foo ` bar</code></p>
-06_04__inlines__code_spans__003:
- canonical: |
- <p><code>``</code></p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto"><code>``</code></p>
- wysiwyg: |-
- <p><code>``</code></p>
-06_04__inlines__code_spans__004:
- canonical: |
- <p><code> `` </code></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><code> `` </code></p>
- wysiwyg: |-
- <p><code> `` </code></p>
-06_04__inlines__code_spans__005:
- canonical: |
- <p><code> a</code></p>
- static: |-
- <p data-sourcepos="1:1-1:4" dir="auto"><code> a</code></p>
- wysiwyg: |-
- <p><code> a</code></p>
-06_04__inlines__code_spans__006:
- canonical: |
- <p><code> b </code></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><code> b </code></p>
- wysiwyg: |-
- <p><code>&nbsp;b&nbsp;</code></p>
-06_04__inlines__code_spans__007:
- canonical: |
- <p><code> </code>
- <code> </code></p>
- static: |-
- <p data-sourcepos="1:1-2:4" dir="auto"><code> </code>
- <code> </code></p>
- wysiwyg: |-
- <p></p>
-06_04__inlines__code_spans__008:
- canonical: |
- <p><code>foo bar baz</code></p>
- static: |-
- <p data-sourcepos="1:1-5:2" dir="auto"><code>foo bar baz</code></p>
- wysiwyg: |-
- <p><code>foo bar baz</code></p>
-06_04__inlines__code_spans__009:
- canonical: |
- <p><code>foo </code></p>
- static: |-
- <p data-sourcepos="1:1-3:2" dir="auto"><code>foo </code></p>
- wysiwyg: |-
- <p><code>foo </code></p>
-06_04__inlines__code_spans__010:
- canonical: |
- <p><code>foo bar baz</code></p>
- static: |-
- <p data-sourcepos="1:1-2:4" dir="auto"><code>foo bar baz</code></p>
- wysiwyg: |-
- <p><code>foo bar baz</code></p>
-06_04__inlines__code_spans__011:
- canonical: |
- <p><code>foo\</code>bar`</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><code>foo\</code>bar`</p>
- wysiwyg: |-
- <p><code>foo\</code>bar`</p>
-06_04__inlines__code_spans__012:
- canonical: |
- <p><code>foo`bar</code></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><code>foo`bar</code></p>
- wysiwyg: |-
- <p><code>foo`bar</code></p>
-06_04__inlines__code_spans__013:
- canonical: |
- <p><code>foo `` bar</code></p>
- static: |-
- <p data-sourcepos="1:1-1:14" dir="auto"><code>foo `` bar</code></p>
- wysiwyg: |-
- <p><code>foo `` bar</code></p>
-06_04__inlines__code_spans__014:
- canonical: |
- <p>*foo<code>*</code></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">*foo<code>*</code></p>
- wysiwyg: |-
- <p>*foo<code>*</code></p>
-06_04__inlines__code_spans__015:
- canonical: |
- <p>[not a <code>link](/foo</code>)</p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto">[not a <code>link](/foo</code>)</p>
- wysiwyg: |-
- <p>[not a <code>link](/foo</code>)</p>
-06_04__inlines__code_spans__016:
- canonical: |
- <p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>
- static: |-
- <p data-sourcepos="1:1-1:14" dir="auto"><code>&lt;a href="</code>"&gt;`</p>
- wysiwyg: |-
- <p><code>&lt;a href="</code>"&gt;`</p>
-06_04__inlines__code_spans__017:
- canonical: |
- <p><a href="`">`</p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><a href="%60" rel="nofollow noreferrer noopener" target="_blank">`</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="`">`</a></p>
-06_04__inlines__code_spans__018:
- canonical: |
- <p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
- static: |-
- <p data-sourcepos="1:1-1:23" dir="auto"><code>&lt;http://foo.bar.</code>baz&gt;`</p>
- wysiwyg: |-
- <p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
-06_04__inlines__code_spans__019:
- canonical: |
- <p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
- static: |-
- <p data-sourcepos="1:1-1:22" dir="auto"><a href="http://foo.bar.%60baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.`baz</a>`</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
-06_04__inlines__code_spans__020:
- canonical: |
- <p>```foo``</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">```foo``</p>
- wysiwyg: |-
- <p>```foo``</p>
-06_04__inlines__code_spans__021:
- canonical: |
- <p>`foo</p>
- static: |-
- <p data-sourcepos="1:1-1:4" dir="auto">`foo</p>
- wysiwyg: |-
- <p>`foo</p>
-06_04__inlines__code_spans__022:
- canonical: |
- <p>`foo<code>bar</code></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto">`foo<code>bar</code></p>
- wysiwyg: |-
- <p>`foo<code>bar</code></p>
-06_05__inlines__emphasis_and_strong_emphasis__001:
- canonical: |
- <p><em>foo bar</em></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><em>foo bar</em></p>
- wysiwyg: |-
- <p><em>foo bar</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__002:
- canonical: |
- <p>a * foo bar*</p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">a * foo bar*</p>
- wysiwyg: |-
- <p>a * foo bar*</p>
-06_05__inlines__emphasis_and_strong_emphasis__003:
- canonical: |
- <p>a*&quot;foo&quot;*</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">a*"foo"*</p>
- wysiwyg: |-
- <p>a*"foo"*</p>
-06_05__inlines__emphasis_and_strong_emphasis__004:
- canonical: |
- <p>* a *</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">* a *</p>
- wysiwyg: |-
- <p>*&nbsp;a&nbsp;*</p>
-06_05__inlines__emphasis_and_strong_emphasis__005:
- canonical: |
- <p>foo<em>bar</em></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">foo<em>bar</em></p>
- wysiwyg: |-
- <p>foo<em>bar</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__006:
- canonical: |
- <p>5<em>6</em>78</p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto">5<em>6</em>78</p>
- wysiwyg: |-
- <p>5<em>6</em>78</p>
-06_05__inlines__emphasis_and_strong_emphasis__007:
- canonical: |
- <p><em>foo bar</em></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><em>foo bar</em></p>
- wysiwyg: |-
- <p><em>foo bar</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__008:
- canonical: |
- <p>_ foo bar_</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">_ foo bar_</p>
- wysiwyg: |-
- <p>_ foo bar_</p>
-06_05__inlines__emphasis_and_strong_emphasis__009:
- canonical: |
- <p>a_&quot;foo&quot;_</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">a_"foo"_</p>
- wysiwyg: |-
- <p>a_"foo"_</p>
-06_05__inlines__emphasis_and_strong_emphasis__010:
- canonical: |
- <p>foo_bar_</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">foo_bar_</p>
- wysiwyg: |-
- <p>foo_bar_</p>
-06_05__inlines__emphasis_and_strong_emphasis__011:
- canonical: |
- <p>5_6_78</p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto">5_6_78</p>
- wysiwyg: |-
- <p>5_6_78</p>
-06_05__inlines__emphasis_and_strong_emphasis__012:
- canonical: |
- <p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
- static: |-
- <p data-sourcepos="1:1-1:38" dir="auto">приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
- wysiwyg: |-
- <p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
-06_05__inlines__emphasis_and_strong_emphasis__013:
- canonical: |
- <p>aa_&quot;bb&quot;_cc</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">aa_"bb"_cc</p>
- wysiwyg: |-
- <p>aa_"bb"_cc</p>
-06_05__inlines__emphasis_and_strong_emphasis__014:
- canonical: |
- <p>foo-<em>(bar)</em></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto">foo-<em>(bar)</em></p>
- wysiwyg: |-
- <p>foo-<em>(bar)</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__015:
- canonical: |
- <p>_foo*</p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto">_foo*</p>
- wysiwyg: |-
- <p>_foo*</p>
-06_05__inlines__emphasis_and_strong_emphasis__016:
- canonical: |
- <p>*foo bar *</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">*foo bar *</p>
- wysiwyg: |-
- <p>*foo bar *</p>
-06_05__inlines__emphasis_and_strong_emphasis__017:
- canonical: |
- <p>*foo bar
- *</p>
- static: |-
- <p data-sourcepos="1:1-2:1" dir="auto">*foo bar
- *</p>
- wysiwyg: |-
- <p>*foo bar
- *</p>
-06_05__inlines__emphasis_and_strong_emphasis__018:
- canonical: |
- <p>*(*foo)</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">*(*foo)</p>
- wysiwyg: |-
- <p>*(*foo)</p>
-06_05__inlines__emphasis_and_strong_emphasis__019:
- canonical: |
- <p><em>(<em>foo</em>)</em></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><em>(<em>foo</em>)</em></p>
- wysiwyg: |-
- <p><em>(foo</em>)</p>
-06_05__inlines__emphasis_and_strong_emphasis__020:
- canonical: |
- <p><em>foo</em>bar</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>bar</p>
- wysiwyg: |-
- <p><em>foo</em>bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__021:
- canonical: |
- <p>_foo bar _</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">_foo bar _</p>
- wysiwyg: |-
- <p>_foo bar _</p>
-06_05__inlines__emphasis_and_strong_emphasis__022:
- canonical: |
- <p>_(_foo)</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">_(_foo)</p>
- wysiwyg: |-
- <p>_(_foo)</p>
-06_05__inlines__emphasis_and_strong_emphasis__023:
- canonical: |
- <p><em>(<em>foo</em>)</em></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><em>(<em>foo</em>)</em></p>
- wysiwyg: |-
- <p><em>(foo</em>)</p>
-06_05__inlines__emphasis_and_strong_emphasis__024:
- canonical: |
- <p>_foo_bar</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">_foo_bar</p>
- wysiwyg: |-
- <p>_foo_bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__025:
- canonical: |
- <p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
- static: |-
- <p data-sourcepos="1:1-1:38" dir="auto">_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
- wysiwyg: |-
- <p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
-06_05__inlines__emphasis_and_strong_emphasis__026:
- canonical: |
- <p><em>foo_bar_baz</em></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><em>foo_bar_baz</em></p>
- wysiwyg: |-
- <p><em>foo_bar_baz</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__027:
- canonical: |
- <p><em>(bar)</em>.</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><em>(bar)</em>.</p>
- wysiwyg: |-
- <p><em>(bar)</em>.</p>
-06_05__inlines__emphasis_and_strong_emphasis__028:
- canonical: |
- <p><strong>foo bar</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><strong>foo bar</strong></p>
- wysiwyg: |-
- <p><strong>foo bar</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__029:
- canonical: |
- <p>** foo bar**</p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">** foo bar**</p>
- wysiwyg: |-
- <p>** foo bar**</p>
-06_05__inlines__emphasis_and_strong_emphasis__030:
- canonical: |
- <p>a**&quot;foo&quot;**</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">a**"foo"**</p>
- wysiwyg: |-
- <p>a**"foo"**</p>
-06_05__inlines__emphasis_and_strong_emphasis__031:
- canonical: |
- <p>foo<strong>bar</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">foo<strong>bar</strong></p>
- wysiwyg: |-
- <p>foo<strong>bar</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__032:
- canonical: |
- <p><strong>foo bar</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><strong>foo bar</strong></p>
- wysiwyg: |-
- <p><strong>foo bar</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__033:
- canonical: |
- <p>__ foo bar__</p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">__ foo bar__</p>
- wysiwyg: |-
- <p>__ foo bar__</p>
-06_05__inlines__emphasis_and_strong_emphasis__034:
- canonical: |
- <p>__
- foo bar__</p>
- static: |-
- <p data-sourcepos="1:1-2:9" dir="auto">__
- foo bar__</p>
- wysiwyg: |-
- <p>__
- foo bar__</p>
-06_05__inlines__emphasis_and_strong_emphasis__035:
- canonical: |
- <p>a__&quot;foo&quot;__</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">a__"foo"__</p>
- wysiwyg: |-
- <p>a__"foo"__</p>
-06_05__inlines__emphasis_and_strong_emphasis__036:
- canonical: |
- <p>foo__bar__</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">foo__bar__</p>
- wysiwyg: |-
- <p>foo__bar__</p>
-06_05__inlines__emphasis_and_strong_emphasis__037:
- canonical: |
- <p>5__6__78</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">5__6__78</p>
- wysiwyg: |-
- <p>5__6__78</p>
-06_05__inlines__emphasis_and_strong_emphasis__038:
- canonical: |
- <p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
- static: |-
- <p data-sourcepos="1:1-1:40" dir="auto">приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
- wysiwyg: |-
- <p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
-06_05__inlines__emphasis_and_strong_emphasis__039:
- canonical: |
- <p><strong>foo, <strong>bar</strong>, baz</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto"><strong>foo, <strong>bar</strong>, baz</strong></p>
- wysiwyg: |-
- <p><strong>foo, bar</strong>, baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__040:
- canonical: |
- <p>foo-<strong>(bar)</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">foo-<strong>(bar)</strong></p>
- wysiwyg: |-
- <p>foo-<strong>(bar)</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__041:
- canonical: |
- <p>**foo bar **</p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">**foo bar **</p>
- wysiwyg: |-
- <p>**foo bar **</p>
-06_05__inlines__emphasis_and_strong_emphasis__042:
- canonical: |
- <p>**(**foo)</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">**(**foo)</p>
- wysiwyg: |-
- <p>**(**foo)</p>
-06_05__inlines__emphasis_and_strong_emphasis__043:
- canonical: |
- <p><em>(<strong>foo</strong>)</em></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><em>(<strong>foo</strong>)</em></p>
- wysiwyg: |-
- <p><em>(</em><strong>foo</strong>)</p>
-06_05__inlines__emphasis_and_strong_emphasis__044:
- canonical: |
- <p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
- <em>Asclepias physocarpa</em>)</strong></p>
- static: |-
- <p data-sourcepos="1:1-2:25" dir="auto"><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
- <em>Asclepias physocarpa</em>)</strong></p>
- wysiwyg: |-
- <p><strong>Gomphocarpus (</strong><em>Gomphocarpus physocarpus</em>, syn.
- <em>Asclepias physocarpa</em>)</p>
-06_05__inlines__emphasis_and_strong_emphasis__045:
- canonical: |
- <p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:19" dir="auto"><strong>foo "<em>bar</em>" foo</strong></p>
- wysiwyg: |-
- <p><strong>foo "</strong><em>bar</em>" foo</p>
-06_05__inlines__emphasis_and_strong_emphasis__046:
- canonical: |
- <p><strong>foo</strong>bar</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><strong>foo</strong>bar</p>
- wysiwyg: |-
- <p><strong>foo</strong>bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__047:
- canonical: |
- <p>__foo bar __</p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">__foo bar __</p>
- wysiwyg: |-
- <p>__foo bar __</p>
-06_05__inlines__emphasis_and_strong_emphasis__048:
- canonical: |
- <p>__(__foo)</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">__(__foo)</p>
- wysiwyg: |-
- <p>__(__foo)</p>
-06_05__inlines__emphasis_and_strong_emphasis__049:
- canonical: |
- <p><em>(<strong>foo</strong>)</em></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><em>(<strong>foo</strong>)</em></p>
- wysiwyg: |-
- <p><em>(</em><strong>foo</strong>)</p>
-06_05__inlines__emphasis_and_strong_emphasis__050:
- canonical: |
- <p>__foo__bar</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">__foo__bar</p>
- wysiwyg: |-
- <p>__foo__bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__051:
- canonical: |
- <p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
- static: |-
- <p data-sourcepos="1:1-1:40" dir="auto">__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
- wysiwyg: |-
- <p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
-06_05__inlines__emphasis_and_strong_emphasis__052:
- canonical: |
- <p><strong>foo__bar__baz</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><strong>foo__bar__baz</strong></p>
- wysiwyg: |-
- <p><strong>foo__bar__baz</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__053:
- canonical: |
- <p><strong>(bar)</strong>.</p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><strong>(bar)</strong>.</p>
- wysiwyg: |-
- <p><strong>(bar)</strong>.</p>
-06_05__inlines__emphasis_and_strong_emphasis__054:
- canonical: |
- <p><em>foo <a href="/url">bar</a></em></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><em>foo <a href="/url">bar</a></em></p>
- wysiwyg: |-
- <p><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar</a></p>
-06_05__inlines__emphasis_and_strong_emphasis__055:
- canonical: |
- <p><em>foo
- bar</em></p>
- static: |-
- <p data-sourcepos="1:1-2:4" dir="auto"><em>foo
- bar</em></p>
- wysiwyg: |-
- <p><em>foo
- bar</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__056:
- canonical: |
- <p><em>foo <strong>bar</strong> baz</em></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><em>foo <strong>bar</strong> baz</em></p>
- wysiwyg: |-
- <p><em>foo </em><strong>bar</strong> baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__057:
- canonical: |
- <p><em>foo <em>bar</em> baz</em></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><em>foo <em>bar</em> baz</em></p>
- wysiwyg: |-
- <p><em>foo bar</em> baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__058:
- canonical: |
- <p><em><em>foo</em> bar</em></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><em><em>foo</em> bar</em></p>
- wysiwyg: |-
- <p><em>foo</em> bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__059:
- canonical: |
- <p><em>foo <em>bar</em></em></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><em>foo <em>bar</em></em></p>
- wysiwyg: |-
- <p><em>foo bar</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__060:
- canonical: |
- <p><em>foo <strong>bar</strong> baz</em></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><em>foo <strong>bar</strong> baz</em></p>
- wysiwyg: |-
- <p><em>foo </em><strong>bar</strong> baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__061:
- canonical: |
- <p><em>foo<strong>bar</strong>baz</em></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><em>foo<strong>bar</strong>baz</em></p>
- wysiwyg: |-
- <p><em>foo</em><strong>bar</strong>baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__062:
- canonical: |
- <p><em>foo**bar</em></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><em>foo**bar</em></p>
- wysiwyg: |-
- <p><em>foo**bar</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__063:
- canonical: |
- <p><em><strong>foo</strong> bar</em></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><em><strong>foo</strong> bar</em></p>
- wysiwyg: |-
- <p><strong><em>foo</em></strong> bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__064:
- canonical: |
- <p><em>foo <strong>bar</strong></em></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><em>foo <strong>bar</strong></em></p>
- wysiwyg: |-
- <p><em>foo </em><strong>bar</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__065:
- canonical: |
- <p><em>foo<strong>bar</strong></em></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto"><em>foo<strong>bar</strong></em></p>
- wysiwyg: |-
- <p><em>foo</em><strong>bar</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__066:
- canonical: |
- <p>foo<em><strong>bar</strong></em>baz</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">foo<em><strong>bar</strong></em>baz</p>
- wysiwyg: |-
- <p>foo<strong><em>bar</em></strong>baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__067:
- canonical: |
- <p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto">foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
- wysiwyg: |-
- <p>foo<strong>bar</strong>***baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__068:
- canonical: |
- <p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto"><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
- wysiwyg: |-
- <p><em>foo </em><strong>bar </strong><em>baz</em> bim bop</p>
-06_05__inlines__emphasis_and_strong_emphasis__069:
- canonical: |
- <p><em>foo <a href="/url"><em>bar</em></a></em></p>
- static: |-
- <p data-sourcepos="1:1-1:19" dir="auto"><em>foo <a href="/url"><em>bar</em></a></em></p>
- wysiwyg: |-
- <p><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
-06_05__inlines__emphasis_and_strong_emphasis__070:
- canonical: |
- <p>** is not an empty emphasis</p>
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto">** is not an empty emphasis</p>
- wysiwyg: |-
- <p>** is not an empty emphasis</p>
-06_05__inlines__emphasis_and_strong_emphasis__071:
- canonical: |
- <p>**** is not an empty strong emphasis</p>
- static: |-
- <p data-sourcepos="1:1-1:36" dir="auto">**** is not an empty strong emphasis</p>
- wysiwyg: |-
- <p>**** is not an empty strong emphasis</p>
-06_05__inlines__emphasis_and_strong_emphasis__072:
- canonical: |
- <p><strong>foo <a href="/url">bar</a></strong></p>
- static: |-
- <p data-sourcepos="1:1-1:19" dir="auto"><strong>foo <a href="/url">bar</a></strong></p>
- wysiwyg: |-
- <p><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar</a></p>
-06_05__inlines__emphasis_and_strong_emphasis__073:
- canonical: |
- <p><strong>foo
- bar</strong></p>
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto"><strong>foo
- bar</strong></p>
- wysiwyg: |-
- <p><strong>foo
- bar</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__074:
- canonical: |
- <p><strong>foo <em>bar</em> baz</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><strong>foo <em>bar</em> baz</strong></p>
- wysiwyg: |-
- <p><strong>foo </strong><em>bar</em> baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__075:
- canonical: |
- <p><strong>foo <strong>bar</strong> baz</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:19" dir="auto"><strong>foo <strong>bar</strong> baz</strong></p>
- wysiwyg: |-
- <p><strong>foo bar</strong> baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__076:
- canonical: |
- <p><strong><strong>foo</strong> bar</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><strong><strong>foo</strong> bar</strong></p>
- wysiwyg: |-
- <p><strong>foo</strong> bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__077:
- canonical: |
- <p><strong>foo <strong>bar</strong></strong></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><strong>foo <strong>bar</strong></strong></p>
- wysiwyg: |-
- <p><strong>foo bar</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__078:
- canonical: |
- <p><strong>foo <em>bar</em> baz</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><strong>foo <em>bar</em> baz</strong></p>
- wysiwyg: |-
- <p><strong>foo </strong><em>bar</em> baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__079:
- canonical: |
- <p><strong>foo<em>bar</em>baz</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><strong>foo<em>bar</em>baz</strong></p>
- wysiwyg: |-
- <p><strong>foo</strong><em>bar</em>baz</p>
-06_05__inlines__emphasis_and_strong_emphasis__080:
- canonical: |
- <p><strong><em>foo</em> bar</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><strong><em>foo</em> bar</strong></p>
- wysiwyg: |-
- <p><strong><em>foo</em></strong> bar</p>
-06_05__inlines__emphasis_and_strong_emphasis__081:
- canonical: |
- <p><strong>foo <em>bar</em></strong></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><strong>foo <em>bar</em></strong></p>
- wysiwyg: |-
- <p><strong>foo </strong><em>bar</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__082:
- canonical: |
- <p><strong>foo <em>bar <strong>baz</strong>
- bim</em> bop</strong></p>
- static: |-
- <p data-sourcepos="1:1-2:10" dir="auto"><strong>foo <em>bar <strong>baz</strong>
- bim</em> bop</strong></p>
- wysiwyg: |-
- <p><strong>foo </strong><em>bar </em><strong>baz</strong>
- bim bop</p>
-06_05__inlines__emphasis_and_strong_emphasis__083:
- canonical: |
- <p><strong>foo <a href="/url"><em>bar</em></a></strong></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto"><strong>foo <a href="/url"><em>bar</em></a></strong></p>
- wysiwyg: |-
- <p><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
-06_05__inlines__emphasis_and_strong_emphasis__084:
- canonical: |
- <p>__ is not an empty emphasis</p>
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto">__ is not an empty emphasis</p>
- wysiwyg: |-
- <p>__ is not an empty emphasis</p>
-06_05__inlines__emphasis_and_strong_emphasis__085:
- canonical: |
- <p>____ is not an empty strong emphasis</p>
- static: |-
- <p data-sourcepos="1:1-1:36" dir="auto">____ is not an empty strong emphasis</p>
- wysiwyg: |-
- <p>____ is not an empty strong emphasis</p>
-06_05__inlines__emphasis_and_strong_emphasis__086:
- canonical: |
- <p>foo ***</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">foo ***</p>
- wysiwyg: |-
- <p>foo ***</p>
-06_05__inlines__emphasis_and_strong_emphasis__087:
- canonical: |
- <p>foo <em>*</em></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">foo <em>*</em></p>
- wysiwyg: |-
- <p>foo <em>*</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__088:
- canonical: |
- <p>foo <em>_</em></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">foo <em>_</em></p>
- wysiwyg: |-
- <p>foo <em>_</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__089:
- canonical: |
- <p>foo *****</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">foo *****</p>
- wysiwyg: |-
- <p>foo *****</p>
-06_05__inlines__emphasis_and_strong_emphasis__090:
- canonical: |
- <p>foo <strong>*</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">foo <strong>*</strong></p>
- wysiwyg: |-
- <p>foo <strong>*</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__091:
- canonical: |
- <p>foo <strong>_</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">foo <strong>_</strong></p>
- wysiwyg: |-
- <p>foo <strong>_</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__092:
- canonical: |
- <p>*<em>foo</em></p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto">*<em>foo</em></p>
- wysiwyg: |-
- <p>*<em>foo</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__093:
- canonical: |
- <p><em>foo</em>*</p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto"><em>foo</em>*</p>
- wysiwyg: |-
- <p><em>foo</em>*</p>
-06_05__inlines__emphasis_and_strong_emphasis__094:
- canonical: |
- <p>*<strong>foo</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">*<strong>foo</strong></p>
- wysiwyg: |-
- <p>*<strong>foo</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__095:
- canonical: |
- <p>***<em>foo</em></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">***<em>foo</em></p>
- wysiwyg: |-
- <p>***<em>foo</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__096:
- canonical: |
- <p><strong>foo</strong>*</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><strong>foo</strong>*</p>
- wysiwyg: |-
- <p><strong>foo</strong>*</p>
-06_05__inlines__emphasis_and_strong_emphasis__097:
- canonical: |
- <p><em>foo</em>***</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>***</p>
- wysiwyg: |-
- <p><em>foo</em>***</p>
-06_05__inlines__emphasis_and_strong_emphasis__098:
- canonical: |
- <p>foo ___</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">foo ___</p>
- wysiwyg: |-
- <p>foo ___</p>
-06_05__inlines__emphasis_and_strong_emphasis__099:
- canonical: |
- <p>foo <em>_</em></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">foo <em>_</em></p>
- wysiwyg: |-
- <p>foo <em>_</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__100:
- canonical: |
- <p>foo <em>*</em></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">foo <em>*</em></p>
- wysiwyg: |-
- <p>foo <em>*</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__101:
- canonical: |
- <p>foo _____</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">foo _____</p>
- wysiwyg: |-
- <p>foo _____</p>
-06_05__inlines__emphasis_and_strong_emphasis__102:
- canonical: |
- <p>foo <strong>_</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">foo <strong>_</strong></p>
- wysiwyg: |-
- <p>foo <strong>_</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__103:
- canonical: |
- <p>foo <strong>*</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">foo <strong>*</strong></p>
- wysiwyg: |-
- <p>foo <strong>*</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__104:
- canonical: |
- <p>_<em>foo</em></p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto">_<em>foo</em></p>
- wysiwyg: |-
- <p>_<em>foo</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__105:
- canonical: |
- <p><em>foo</em>_</p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto"><em>foo</em>_</p>
- wysiwyg: |-
- <p><em>foo</em>_</p>
-06_05__inlines__emphasis_and_strong_emphasis__106:
- canonical: |
- <p>_<strong>foo</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">_<strong>foo</strong></p>
- wysiwyg: |-
- <p>_<strong>foo</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__107:
- canonical: |
- <p>___<em>foo</em></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">___<em>foo</em></p>
- wysiwyg: |-
- <p>___<em>foo</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__108:
- canonical: |
- <p><strong>foo</strong>_</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><strong>foo</strong>_</p>
- wysiwyg: |-
- <p><strong>foo</strong>_</p>
-06_05__inlines__emphasis_and_strong_emphasis__109:
- canonical: |
- <p><em>foo</em>___</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>___</p>
- wysiwyg: |-
- <p><em>foo</em>___</p>
-06_05__inlines__emphasis_and_strong_emphasis__110:
- canonical: |
- <p><strong>foo</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><strong>foo</strong></p>
- wysiwyg: |-
- <p><strong>foo</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__111:
- canonical: |
- <p><em><em>foo</em></em></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><em><em>foo</em></em></p>
- wysiwyg: |-
- <p><em>foo</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__112:
- canonical: |
- <p><strong>foo</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><strong>foo</strong></p>
- wysiwyg: |-
- <p><strong>foo</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__113:
- canonical: |
- <p><em><em>foo</em></em></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><em><em>foo</em></em></p>
- wysiwyg: |-
- <p><em>foo</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__114:
- canonical: |
- <p><strong><strong>foo</strong></strong></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><strong><strong>foo</strong></strong></p>
- wysiwyg: |-
- <p><strong>foo</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__115:
- canonical: |
- <p><strong><strong>foo</strong></strong></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><strong><strong>foo</strong></strong></p>
- wysiwyg: |-
- <p><strong>foo</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__116:
- canonical: |
- <p><strong><strong><strong>foo</strong></strong></strong></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><strong><strong><strong>foo</strong></strong></strong></p>
- wysiwyg: |-
- <p><strong>foo</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__117:
- canonical: |
- <p><em><strong>foo</strong></em></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><em><strong>foo</strong></em></p>
- wysiwyg: |-
- <p><strong><em>foo</em></strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__118:
- canonical: |
- <p><em><strong><strong>foo</strong></strong></em></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><em><strong><strong>foo</strong></strong></em></p>
- wysiwyg: |-
- <p><strong><em>foo</em></strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__119:
- canonical: |
- <p><em>foo _bar</em> baz_</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><em>foo _bar</em> baz_</p>
- wysiwyg: |-
- <p><em>foo _bar</em> baz_</p>
-06_05__inlines__emphasis_and_strong_emphasis__120:
- canonical: |
- <p><em>foo <strong>bar *baz bim</strong> bam</em></p>
- static: |-
- <p data-sourcepos="1:1-1:26" dir="auto"><em>foo <strong>bar *baz bim</strong> bam</em></p>
- wysiwyg: |-
- <p><em>foo </em><strong>bar *baz bim</strong> bam</p>
-06_05__inlines__emphasis_and_strong_emphasis__121:
- canonical: |
- <p>**foo <strong>bar baz</strong></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">**foo <strong>bar baz</strong></p>
- wysiwyg: |-
- <p>**foo <strong>bar baz</strong></p>
-06_05__inlines__emphasis_and_strong_emphasis__122:
- canonical: |
- <p>*foo <em>bar baz</em></p>
- static: |-
- <p data-sourcepos="1:1-1:14" dir="auto">*foo <em>bar baz</em></p>
- wysiwyg: |-
- <p>*foo <em>bar baz</em></p>
-06_05__inlines__emphasis_and_strong_emphasis__123:
- canonical: |
- <p>*<a href="/url">bar*</a></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">*<a href="/url">bar*</a></p>
- wysiwyg: |-
- <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar*</a></p>
-06_05__inlines__emphasis_and_strong_emphasis__124:
- canonical: |
- <p>_foo <a href="/url">bar_</a></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">_foo <a href="/url">bar_</a></p>
- wysiwyg: |-
- <p>_foo <a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar_</a></p>
-06_05__inlines__emphasis_and_strong_emphasis__125:
- canonical: |
- <p>*<img src="foo" title="*"/></p>
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto">*<a class="no-attachment-icon" href="foo" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" title="*" decoding="async" class="lazy" data-src="foo"></a></p>
- wysiwyg: |-
- <p>*<img src="foo" title="*"></p>
-06_05__inlines__emphasis_and_strong_emphasis__126:
- canonical: |
- <p>**<a href="**"></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">**<a href="**"></a></p>
- wysiwyg: |-
- <p>**</p>
-06_05__inlines__emphasis_and_strong_emphasis__127:
- canonical: |
- <p>__<a href="__"></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">__<a href="__"></a></p>
- wysiwyg: |-
- <p>__</p>
-06_05__inlines__emphasis_and_strong_emphasis__128:
- canonical: |
- <p><em>a <code>*</code></em></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><em>a <code>*</code></em></p>
- wysiwyg: |-
- <p><em>a </em><code>*</code></p>
-06_05__inlines__emphasis_and_strong_emphasis__129:
- canonical: |
- <p><em>a <code>_</code></em></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><em>a <code>_</code></em></p>
- wysiwyg: |-
- <p><em>a </em><code>_</code></p>
-06_05__inlines__emphasis_and_strong_emphasis__130:
- canonical: |
- <p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
- static: |-
- <p data-sourcepos="1:1-1:25" dir="auto">**a<a href="http://foo.bar/?q=**" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar/?q=**</a></p>
- wysiwyg: |-
- <p>**a<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
-06_05__inlines__emphasis_and_strong_emphasis__131:
- canonical: |
- <p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
- static: |-
- <p data-sourcepos="1:1-1:25" dir="auto">__a<a href="http://foo.bar/?q=__" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar/?q=__</a></p>
- wysiwyg: |-
- <p>__a<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
-06_06__inlines__strikethrough_extension__001:
- canonical: |
- <p><del>Hi</del> Hello, world!</p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto"><del>Hi</del> Hello, world!</p>
- wysiwyg: |-
- <p><s>Hi</s> Hello, world!</p>
-06_06__inlines__strikethrough_extension__002:
- canonical: |
- <p>This ~~has a</p>
- <p>new paragraph~~.</p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">This ~~has a</p>
- <p data-sourcepos="3:1-3:16" dir="auto">new paragraph~~.</p>
- wysiwyg: |-
- <p>This ~~has a</p>
-06_07__inlines__links__001:
- canonical: |
- <p><a href="/uri" title="title">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto"><a href="/uri" title="title">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
-06_07__inlines__links__002:
- canonical: |
- <p><a href="/uri">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto"><a href="/uri">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link</a></p>
-06_07__inlines__links__003:
- canonical: |
- <p><a href="">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><a href="">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
-06_07__inlines__links__004:
- canonical: |
- <p><a href="">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><a href="">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
-06_07__inlines__links__005:
- canonical: |
- <p>[link](/my uri)</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><a href="/my%20uri">link</a></p>
- wysiwyg: |-
- <p>[link](/my uri)</p>
-06_07__inlines__links__006:
- canonical: |
- <p><a href="/my%20uri">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><a href="/my%20uri">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/my%20uri">link</a></p>
-06_07__inlines__links__007:
- canonical: |
- <p>[link](foo
- bar)</p>
- static: |-
- <p data-sourcepos="1:1-2:4" dir="auto">[link](foo
- bar)</p>
- wysiwyg: |-
- <p>[link](foo
- bar)</p>
-06_07__inlines__links__008:
- canonical: |
- <p>[link](<foo
- bar>)</p>
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto">[link]()</p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "foo" not supported by this converter. Please, provide an specification.
-06_07__inlines__links__009:
- canonical: |
- <p><a href="b)c">a</a></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><a href="b)c">a</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="b)c">a</a></p>
-06_07__inlines__links__010:
- canonical: |
- <p>[link](&lt;foo&gt;)</p>
- static: |-
- <p data-sourcepos="1:1-1:14" dir="auto"><a href="%3Cfoo%3E">link</a></p>
- wysiwyg: |-
- <p>[link](&lt;foo&gt;)</p>
-06_07__inlines__links__011:
- canonical: |
- <p>[a](&lt;b)c
- [a](&lt;b)c&gt;
- [a](<b>c)</p>
- static: |-
- <p data-sourcepos="1:1-3:9" dir="auto"><a href="%3Cb">a</a>c
- <a href="%3Cb">a</a>c&gt;
- [a](<b>c)</b></p>
- wysiwyg: |-
- <p>[a](&lt;b)c
- [a](&lt;b)c&gt;
- [a](<strong>c)</strong></p>
-06_07__inlines__links__012:
- canonical: |
- <p><a href="(foo)">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><a href="(foo)">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="(foo)">link</a></p>
-06_07__inlines__links__013:
- canonical: |
- <p><a href="foo(and(bar))">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto"><a href="foo(and(bar))">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar))">link</a></p>
-06_07__inlines__links__014:
- canonical: |
- <p><a href="foo(and(bar)">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:23" dir="auto"><a href="foo(and(bar)">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
-06_07__inlines__links__015:
- canonical: |
- <p><a href="foo(and(bar)">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:22" dir="auto"><a href="foo(and(bar)">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
-06_07__inlines__links__016:
- canonical: |
- <p><a href="foo):">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><a>link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo):">link</a></p>
-06_07__inlines__links__017:
- canonical: |
- <p><a href="#fragment">link</a></p>
- <p><a href="http://example.com#fragment">link</a></p>
- <p><a href="http://example.com?foo=3#frag">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><a href="#fragment">link</a></p>
- <p data-sourcepos="3:1-3:35" dir="auto"><a href="http://example.com#fragment" rel="nofollow noreferrer noopener" target="_blank">link</a></p>
- <p data-sourcepos="5:1-5:37" dir="auto"><a href="http://example.com?foo=3#frag" rel="nofollow noreferrer noopener" target="_blank">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="#fragment">link</a></p>
-06_07__inlines__links__018:
- canonical: |
- <p><a href="foo%5Cbar">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><a href="foo%5Cbar">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo%5Cbar">link</a></p>
-06_07__inlines__links__019:
- canonical: |
- <p><a href="foo%20b%C3%A4">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto"><a href="foo%20b%C3%A4">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo%20b%C3%A4">link</a></p>
-06_07__inlines__links__020:
- canonical: |
- <p><a href="%22title%22">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><a href="%22title%22">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="%22title%22">link</a></p>
-06_07__inlines__links__021:
- canonical: |
- <p><a href="/url" title="title">link</a>
- <a href="/url" title="title">link</a>
- <a href="/url" title="title">link</a></p>
- static: |-
- <p data-sourcepos="1:1-3:20" dir="auto"><a href="/url" title="title">link</a>
- <a href="/url" title="title">link</a>
- <a href="/url" title="title">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">linklinklink</a></p>
-06_07__inlines__links__022:
- canonical: |
- <p><a href="/url" title="title &quot;&quot;">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:29" dir="auto"><a href="/url" title='title ""'>link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;&quot;">link</a></p>
-06_07__inlines__links__023:
- canonical: |
- <p><a href="/url%C2%A0%22title%22">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto"><a href="/url%C2%A0%22title%22">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url%C2%A0%22title%22">link</a></p>
-06_07__inlines__links__024:
- canonical: |
- <p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>
- static: |-
- <p data-sourcepos="1:1-1:32" dir="auto">[link](/url "title "and" title")</p>
- wysiwyg: |-
- <p>[link](/url "title "and" title")</p>
-06_07__inlines__links__025:
- canonical: |
- <p><a href="/url" title="title &quot;and&quot; title">link</a></p>
- static: |-
- <p data-sourcepos="1:1-1:32" dir="auto"><a href="/url" title='title "and" title'>link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;and&quot; title">link</a></p>
-06_07__inlines__links__026:
- canonical: |
- <p><a href="/uri" title="title">link</a></p>
- static: |-
- <p data-sourcepos="1:1-2:12" dir="auto"><a href="/uri" title="title">link</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
-06_07__inlines__links__027:
- canonical: |
- <p>[link] (/uri)</p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">[link] (/uri)</p>
- wysiwyg: |-
- <p>[link] (/uri)</p>
-06_07__inlines__links__028:
- canonical: |
- <p><a href="/uri">link [foo [bar]]</a></p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto"><a href="/uri">link [foo [bar]]</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [foo [bar]]</a></p>
-06_07__inlines__links__029:
- canonical: |
- <p>[link] bar](/uri)</p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">[link] bar](/uri)</p>
- wysiwyg: |-
- <p>[link] bar](/uri)</p>
-06_07__inlines__links__030:
- canonical: |
- <p>[link <a href="/uri">bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">[link <a href="/uri">bar</a></p>
- wysiwyg: |-
- <p>[link <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a></p>
-06_07__inlines__links__031:
- canonical: |
- <p><a href="/uri">link [bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:18" dir="auto"><a href="/uri">link [bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [bar</a></p>
-06_07__inlines__links__032:
- canonical: |
- <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
- static: |-
- <p data-sourcepos="1:1-1:30" dir="auto"><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link </a><em>foo </em><strong>bar</strong><code>#</code></p>
-06_07__inlines__links__033:
- canonical: |
- <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
- static: |-
- <p data-sourcepos="1:1-1:25" dir="auto"><a href="/uri"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="moon" decoding="async" class="lazy" data-src="moon.jpg"></a></p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_07__inlines__links__034:
- canonical: |
- <p>[foo <a href="/uri">bar</a>](/uri)</p>
- static: |-
- <p data-sourcepos="1:1-1:23" dir="auto">[foo <a href="/uri">bar</a>](/uri)</p>
- wysiwyg: |-
- <p>[foo <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a>](/uri)</p>
-06_07__inlines__links__035:
- canonical: |
- <p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
- static: |-
- <p data-sourcepos="1:1-1:37" dir="auto">[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
- wysiwyg: |-
- <p>[foo <em>[bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">baz</a>](/uri)](/uri)</p>
-06_07__inlines__links__036:
- canonical: |
- <p><img src="uri3" alt="[foo](uri2)" /></p>
- static: |-
- <p data-sourcepos="1:1-1:28" dir="auto"><a class="no-attachment-icon" href="uri3" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="[foo](uri2)" decoding="async" class="lazy" data-src="uri3"></a></p>
- wysiwyg: |-
- <p><img src="uri3" alt="[foo](uri2)"></p>
-06_07__inlines__links__037:
- canonical: |
- <p>*<a href="/uri">foo*</a></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">*<a href="/uri">foo*</a></p>
- wysiwyg: |-
- <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo*</a></p>
-06_07__inlines__links__038:
- canonical: |
- <p><a href="baz*">foo *bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:16" dir="auto"><a href="baz*">foo *bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="baz*">foo *bar</a></p>
-06_07__inlines__links__039:
- canonical: |
- <p><em>foo [bar</em> baz]</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><em>foo [bar</em> baz]</p>
- wysiwyg: |-
- <p><em>foo [bar</em> baz]</p>
-06_07__inlines__links__040:
- canonical: |
- <p>[foo <bar attr="](baz)"></p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto">[foo </p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "bar" not supported by this converter. Please, provide an specification.
-06_07__inlines__links__041:
- canonical: |
- <p>[foo<code>](/uri)</code></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">[foo<code>](/uri)</code></p>
- wysiwyg: |-
- <p>[foo<code>](/uri)</code></p>
-06_07__inlines__links__042:
- canonical: |
- <p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
- static: |-
- <p data-sourcepos="1:1-1:39" dir="auto">[foo<a href="http://example.com/?search=%5D(uri)" rel="nofollow noreferrer noopener" target="_blank">http://example.com/?search=](uri)</a></p>
- wysiwyg: |-
- <p>[foo<a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
-06_07__inlines__links__043:
- canonical: |
- <p><a href="/url" title="title">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><a href="/url" title="title">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
-06_07__inlines__links__044:
- canonical: |
- <p><a href="/uri">link [foo [bar]]</a></p>
- static: |-
- <p data-sourcepos="1:1-1:23" dir="auto"><a href="/uri">link [foo [bar]]</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [foo [bar]]</a></p>
-06_07__inlines__links__045:
- canonical: |
- <p><a href="/uri">link [bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><a href="/uri">link [bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [bar</a></p>
-06_07__inlines__links__046:
- canonical: |
- <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
- static: |-
- <p data-sourcepos="1:1-1:29" dir="auto"><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link </a><em>foo </em><strong>bar</strong><code>#</code></p>
-06_07__inlines__links__047:
- canonical: |
- <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto"><a href="/uri"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="moon" decoding="async" class="lazy" data-src="moon.jpg"></a></p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_07__inlines__links__048:
- canonical: |
- <p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
- static: |-
- <p data-sourcepos="1:1-1:22" dir="auto">[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
- wysiwyg: |-
- <p>[foo <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a>]<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">ref</a></p>
-06_07__inlines__links__049:
- canonical: |
- <p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto">[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
- wysiwyg: |-
- <p>[foo <em>bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">baz</a>]<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">ref</a></p>
-06_07__inlines__links__050:
- canonical: |
- <p>*<a href="/uri">foo*</a></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">*<a href="/uri">foo*</a></p>
- wysiwyg: |-
- <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo*</a></p>
-06_07__inlines__links__051:
- canonical: |
- <p><a href="/uri">foo *bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><a href="/uri">foo *bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo *bar</a></p>
-06_07__inlines__links__052:
- canonical: |
- <p>[foo <bar attr="][ref]"></p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto">[foo </p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "bar" not supported by this converter. Please, provide an specification.
-06_07__inlines__links__053:
- canonical: |
- <p>[foo<code>][ref]</code></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto">[foo<code>][ref]</code></p>
- wysiwyg: |-
- <p>[foo<code>][ref]</code></p>
-06_07__inlines__links__054:
- canonical: |
- <p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
- static: |-
- <p data-sourcepos="1:1-1:39" dir="auto">[foo<a href="http://example.com/?search=%5D%5Bref%5D" rel="nofollow noreferrer noopener" target="_blank">http://example.com/?search=][ref]</a></p>
- wysiwyg: |-
- <p>[foo<a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
-06_07__inlines__links__055:
- canonical: |
- <p><a href="/url" title="title">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><a href="/url" title="title">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
-06_07__inlines__links__056:
- canonical: |
- <p><a href="/url">Толпой</a> is a Russian word.</p>
- static: |-
- <p data-sourcepos="1:1-1:47" dir="auto"><a href="/url">Толпой</a> is a Russian word.</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Толпой</a> is a Russian word.</p>
-06_07__inlines__links__057:
- canonical: |
- <p><a href="/url">Baz</a></p>
- static: |-
- <p data-sourcepos="4:1-4:14" dir="auto"><a href="/url">Baz</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Baz</a></p>
-06_07__inlines__links__058:
- canonical: |
- <p>[foo] <a href="/url" title="title">bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto">[foo] <a href="/url" title="title">bar</a></p>
- wysiwyg: |-
- <p>[foo] <a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">bar</a></p>
-06_07__inlines__links__059:
- canonical: |
- <p>[foo]
- <a href="/url" title="title">bar</a></p>
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto">[foo]
- <a href="/url" title="title">bar</a></p>
- wysiwyg: |-
- <p>[foo]
- <a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">bar</a></p>
-06_07__inlines__links__060:
- canonical: |
- <p><a href="/url1">bar</a></p>
- static: |-
- <p data-sourcepos="5:1-5:10" dir="auto"><a href="/url1">bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">bar</a></p>
-06_07__inlines__links__061:
- canonical: |
- <p>[bar][foo!]</p>
- static: |-
- <p data-sourcepos="1:1-1:32" dir="auto">[bar][foo<span>!</span>]</p>
- wysiwyg: |-
- <p>[bar][foo!]</p>
-06_07__inlines__links__062:
- canonical: |
- <p>[foo][ref[]</p>
- <p>[ref[]: /uri</p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto">[foo][ref[]</p>
- <p data-sourcepos="3:1-3:12" dir="auto">[ref[]: /uri</p>
- wysiwyg: |-
- <p>[foo][ref[]</p>
-06_07__inlines__links__063:
- canonical: |
- <p>[foo][ref[bar]]</p>
- <p>[ref[bar]]: /uri</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">[foo][ref[bar]]</p>
- <p data-sourcepos="3:1-3:16" dir="auto">[ref[bar]]: /uri</p>
- wysiwyg: |-
- <p>[foo][ref[bar]]</p>
-06_07__inlines__links__064:
- canonical: |
- <p>[[[foo]]]</p>
- <p>[[[foo]]]: /url</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">[[[foo]]]</p>
- <p data-sourcepos="3:1-3:15" dir="auto">[[[foo]]]: /url</p>
- wysiwyg: |-
- <p>[[[foo]]]</p>
-06_07__inlines__links__065:
- canonical: |
- <p><a href="/uri">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto"><a href="/uri">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo</a></p>
-06_07__inlines__links__066:
- canonical: |
- <p><a href="/uri">bar\</a></p>
- static: |-
- <p data-sourcepos="3:1-3:7" dir="auto"><a href="/uri">bar\</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar\</a></p>
-06_07__inlines__links__067:
- canonical: |
- <p>[]</p>
- <p>[]: /uri</p>
- static: |-
- <p data-sourcepos="1:1-1:2" dir="auto">[]</p>
- <p data-sourcepos="3:1-3:8" dir="auto">[]: /uri</p>
- wysiwyg: |-
- <p>[]</p>
-06_07__inlines__links__068:
- canonical: |
- <p>[
- ]</p>
- <p>[
- ]: /uri</p>
- static: |-
- <p data-sourcepos="1:1-2:2" dir="auto">[
- ]</p>
- <p data-sourcepos="4:1-5:8" dir="auto">[
- ]: /uri</p>
- wysiwyg: |-
- <p>[
- ]</p>
-06_07__inlines__links__069:
- canonical: |
- <p><a href="/url" title="title">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><a href="/url" title="title">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
-06_07__inlines__links__070:
- canonical: |
- <p><a href="/url" title="title"><em>foo</em> bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><a href="/url" title="title"><em>foo</em> bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em></a> bar</p>
-06_07__inlines__links__071:
- canonical: |
- <p><a href="/url" title="title">Foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><a href="/url" title="title">Foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">Foo</a></p>
-06_07__inlines__links__072:
- canonical: |
- <p><a href="/url" title="title">foo</a>
- []</p>
- static: |-
- <p data-sourcepos="1:1-2:2" dir="auto"><a href="/url" title="title">foo</a>
- []</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a>
- []</p>
-06_07__inlines__links__073:
- canonical: |
- <p><a href="/url" title="title">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><a href="/url" title="title">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
-06_07__inlines__links__074:
- canonical: |
- <p><a href="/url" title="title"><em>foo</em> bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><a href="/url" title="title"><em>foo</em> bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em></a> bar</p>
-06_07__inlines__links__075:
- canonical: |
- <p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
- wysiwyg: |-
- <p>[<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em></a> bar]</p>
-06_07__inlines__links__076:
- canonical: |
- <p>[[bar <a href="/url">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto">[[bar <a href="/url">foo</a></p>
- wysiwyg: |-
- <p>[[bar <a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
-06_07__inlines__links__077:
- canonical: |
- <p><a href="/url" title="title">Foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto"><a href="/url" title="title">Foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">Foo</a></p>
-06_07__inlines__links__078:
- canonical: |
- <p><a href="/url">foo</a> bar</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><a href="/url">foo</a> bar</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a> bar</p>
-06_07__inlines__links__079:
- canonical: |
- <p>[foo]</p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto">[foo]</p>
- wysiwyg: |-
- <p>[foo]</p>
-06_07__inlines__links__080:
- canonical: |
- <p>*<a href="/url">foo*</a></p>
- static: |-
- <p data-sourcepos="3:1-3:7" dir="auto">*<a href="/url">foo*</a></p>
- wysiwyg: |-
- <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo*</a></p>
-06_07__inlines__links__081:
- canonical: |
- <p><a href="/url2">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:10" dir="auto"><a href="/url2">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url2">foo</a></p>
-06_07__inlines__links__082:
- canonical: |
- <p><a href="/url1">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><a href="/url1">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">foo</a></p>
-06_07__inlines__links__083:
- canonical: |
- <p><a href="">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><a href="">foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="">foo</a></p>
-06_07__inlines__links__084:
- canonical: |
- <p><a href="/url1">foo</a>(not a link)</p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><a href="/url1">foo</a>(not a link)</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">foo</a>(not a link)</p>
-06_07__inlines__links__085:
- canonical: |
- <p>[foo]<a href="/url">bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">[foo]<a href="/url">bar</a></p>
- wysiwyg: |-
- <p>[foo]<a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar</a></p>
-06_07__inlines__links__086:
- canonical: |
- <p><a href="/url2">foo</a><a href="/url1">baz</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto"><a href="/url2">foo</a><a href="/url1">baz</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url2">foo</a><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">baz</a></p>
-06_07__inlines__links__087:
- canonical: |
- <p>[foo]<a href="/url1">bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">[foo]<a href="/url1">bar</a></p>
- wysiwyg: |-
- <p>[foo]<a target="_blank" rel="noopener noreferrer nofollow" href="/url1">bar</a></p>
-06_08__inlines__images__001:
- canonical: |
- <p><img src="/url" alt="foo" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="foo" title="title"></p>
-06_08__inlines__images__002:
- canonical: |
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
- wysiwyg: |-
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
-06_08__inlines__images__003:
- canonical: |
- <p><img src="/url2" alt="foo bar" /></p>
- static: |-
- <p data-sourcepos="1:1-1:26" dir="auto"><a class="no-attachment-icon" href="/url2" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" decoding="async" class="lazy" data-src="/url2"></a></p>
- wysiwyg: |-
- <p><img src="/url2" alt="foo bar"></p>
-06_08__inlines__images__004:
- canonical: |
- <p><img src="/url2" alt="foo bar" /></p>
- static: |-
- <p data-sourcepos="1:1-1:25" dir="auto"><a class="no-attachment-icon" href="/url2" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" decoding="async" class="lazy" data-src="/url2"></a></p>
- wysiwyg: |-
- <p><img src="/url2" alt="foo bar"></p>
-06_08__inlines__images__005:
- canonical: |
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
- static: |-
- <p data-sourcepos="1:1-1:14" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
- wysiwyg: |-
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
-06_08__inlines__images__006:
- canonical: |
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
- wysiwyg: |-
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
-06_08__inlines__images__007:
- canonical: |
- <p><img src="train.jpg" alt="foo" /></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="train.jpg"></a></p>
- wysiwyg: |-
- <p><img src="train.jpg" alt="foo"></p>
-06_08__inlines__images__008:
- canonical: |
- <p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:45" dir="auto">My <a class="no-attachment-icon" href="/path/to/train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="title" decoding="async" class="lazy" data-src="/path/to/train.jpg"></a></p>
- wysiwyg: |-
- <p>My <img src="/path/to/train.jpg" alt="foo bar" title="title"></p>
-06_08__inlines__images__009:
- canonical: |
- <p><img src="url" alt="foo" /></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><a class="no-attachment-icon" href="url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="url"></a></p>
- wysiwyg: |-
- <p><img src="url" alt="foo"></p>
-06_08__inlines__images__010:
- canonical: |
- <p><img src="/url" alt="" /></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt=""></p>
-06_08__inlines__images__011:
- canonical: |
- <p><img src="/url" alt="foo" /></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="foo"></p>
-06_08__inlines__images__012:
- canonical: |
- <p><img src="/url" alt="foo" /></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="foo"></p>
-06_08__inlines__images__013:
- canonical: |
- <p><img src="/url" alt="foo" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="foo" title="title"></p>
-06_08__inlines__images__014:
- canonical: |
- <p><img src="/url" alt="foo bar" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:14" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="foo bar" title="title"></p>
-06_08__inlines__images__015:
- canonical: |
- <p><img src="/url" alt="Foo" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="Foo" title="title"></p>
-06_08__inlines__images__016:
- canonical: |
- <p><img src="/url" alt="foo" title="title" />
- []</p>
- static: |-
- <p data-sourcepos="1:1-2:2" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a>
- []</p>
- wysiwyg: |-
- <p><img src="/url" alt="foo" title="title">
- []</p>
-06_08__inlines__images__017:
- canonical: |
- <p><img src="/url" alt="foo" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="foo" title="title"></p>
-06_08__inlines__images__018:
- canonical: |
- <p><img src="/url" alt="foo bar" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="foo bar" title="title"></p>
-06_08__inlines__images__019:
- canonical: |
- <p>![[foo]]</p>
- <p>[[foo]]: /url &quot;title&quot;</p>
- static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">![[foo]]</p>
- <p data-sourcepos="3:1-3:21" dir="auto">[[foo]]: /url "title"</p>
- wysiwyg: |-
- <p>![[foo]]</p>
-06_08__inlines__images__020:
- canonical: |
- <p><img src="/url" alt="Foo" title="title" /></p>
- static: |-
- <p data-sourcepos="1:1-1:6" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
- wysiwyg: |-
- <p><img src="/url" alt="Foo" title="title"></p>
-06_08__inlines__images__021:
- canonical: |
- <p>![foo]</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">![foo]</p>
- wysiwyg: |-
- <p>![foo]</p>
-06_08__inlines__images__022:
- canonical: |
- <p>!<a href="/url" title="title">foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto"><span>!</span><a href="/url" title="title">foo</a></p>
- wysiwyg: |-
- <p>!<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
-06_09__inlines__autolinks__001:
- canonical: |
- <p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto"><a href="http://foo.bar.baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.baz</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.baz">http://foo.bar.baz</a></p>
-06_09__inlines__autolinks__002:
- canonical: |
- <p><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
- static: |-
- <p data-sourcepos="1:1-1:47" dir="auto"><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
-06_09__inlines__autolinks__003:
- canonical: |
- <p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto"><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
-06_09__inlines__autolinks__004:
- canonical: |
- <p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto"><a href="mailto:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
-06_09__inlines__autolinks__005:
- canonical: |
- <p><a href="a+b+c:d">a+b+c:d</a></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><a href="a+b+c:d">a+b+c:d</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="a+b+c:d">a+b+c:d</a></p>
-06_09__inlines__autolinks__006:
- canonical: |
- <p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
- static: |-
- <p data-sourcepos="1:1-1:26" dir="auto"><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
-06_09__inlines__autolinks__007:
- canonical: |
- <p><a href="http://../">http://../</a></p>
- static: |-
- <p data-sourcepos="1:1-1:12" dir="auto"><a href="http://../" rel="nofollow noreferrer noopener" target="_blank">http://../</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://../">http://../</a></p>
-06_09__inlines__autolinks__008:
- canonical: |
- <p><a href="localhost:5001/foo">localhost:5001/foo</a></p>
- static: |-
- <p data-sourcepos="1:1-1:20" dir="auto"><a href="localhost:5001/foo">localhost:5001/foo</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="localhost:5001/foo">localhost:5001/foo</a></p>
-06_09__inlines__autolinks__009:
- canonical: |
- <p>&lt;http://foo.bar/baz bim&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto">&lt;<a href="http://foo.bar/baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar/baz</a> bim&gt;</p>
- wysiwyg: |-
- <p>&lt;<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/baz">http://foo.bar/baz</a> bim&gt;</p>
-06_09__inlines__autolinks__010:
- canonical: |
- <p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto"><a href="http://example.com/%5C%5B%5C" rel="nofollow noreferrer noopener" target="_blank">http://example.com/\[\</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
-06_09__inlines__autolinks__011:
- canonical: |
- <p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto"><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
-06_09__inlines__autolinks__012:
- canonical: |
- <p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
- static: |-
- <p data-sourcepos="1:1-1:30" dir="auto"><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
-06_09__inlines__autolinks__013:
- canonical: |
- <p>&lt;foo+@bar.example.com&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:23" dir="auto">&lt;<a href="mailto:foo+@bar.example.com">foo+@bar.example.com</a>&gt;</p>
- wysiwyg: |-
- Error - check implementation:
- Cannot read properties of undefined (reading 'end')
-06_09__inlines__autolinks__014:
- canonical: |
- <p>&lt;&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:2" dir="auto">&lt;&gt;</p>
- wysiwyg: |-
- <p>&lt;&gt;</p>
-06_09__inlines__autolinks__015:
- canonical: |
- <p>&lt; http://foo.bar &gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:18" dir="auto">&lt; <a href="http://foo.bar" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar</a> &gt;</p>
- wysiwyg: |-
- <p>&lt; <a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar">http://foo.bar</a> &gt;</p>
-06_09__inlines__autolinks__016:
- canonical: |
- <p>&lt;m:abc&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:7" dir="auto">&lt;m:abc&gt;</p>
- wysiwyg: |-
- <p>&lt;m:abc&gt;</p>
-06_09__inlines__autolinks__017:
- canonical: |
- <p>&lt;foo.bar.baz&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">&lt;foo.bar.baz&gt;</p>
- wysiwyg: |-
- <p>&lt;foo.bar.baz&gt;</p>
-06_09__inlines__autolinks__018:
- canonical: |
- <p>http://example.com</p>
- static: |-
- <p data-sourcepos="1:1-1:18" dir="auto"><a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com">http://example.com</a></p>
-06_09__inlines__autolinks__019:
- canonical: |
- <p>foo@bar.example.com</p>
- static: |-
- <p data-sourcepos="1:1-1:19" dir="auto"><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
-06_10__inlines__autolinks_extension__001:
- canonical: |
- <p><a href="http://www.commonmark.org">www.commonmark.org</a></p>
- static: |-
- <p data-sourcepos="1:1-1:18" dir="auto"><a href="http://www.commonmark.org" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a></p>
-06_10__inlines__autolinks_extension__002:
- canonical: |
- <p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
- static: |-
- <p data-sourcepos="1:1-1:51" dir="auto">Visit <a href="http://www.commonmark.org/help" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/help</a> for more information.</p>
- wysiwyg: |-
- <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
-06_10__inlines__autolinks_extension__003:
- canonical: |
- <p>Visit <a href="http://www.commonmark.org">www.commonmark.org</a>.</p>
- <p>Visit <a href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p>
- static: |-
- <p data-sourcepos="1:1-1:25" dir="auto">Visit <a href="http://www.commonmark.org" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org</a>.</p>
- <p data-sourcepos="3:1-3:29" dir="auto">Visit <a href="http://www.commonmark.org/a.b" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/a.b</a>.</p>
- wysiwyg: |-
- <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a>.</p>
-06_10__inlines__autolinks_extension__004:
- canonical: |
- <p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
- <p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p>
- <p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p>
- <p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
- static: |-
- <p data-sourcepos="1:1-1:41" dir="auto"><a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a></p>
- <p data-sourcepos="3:1-3:43" dir="auto"><a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a>))</p>
- <p data-sourcepos="5:1-5:43" dir="auto">(<a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a>)</p>
- <p data-sourcepos="7:1-7:42" dir="auto">(<a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
-06_10__inlines__autolinks_extension__005:
- canonical: |
- <p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
- static: |-
- <p data-sourcepos="1:1-1:38" dir="auto"><a href="http://www.google.com/search?q=(business))+ok" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=(business))+ok</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
-06_10__inlines__autolinks_extension__006:
- canonical: |
- <p><a href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
- <p><a href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&amp;hl;</p>
- static: |-
- <p data-sourcepos="1:1-1:40" dir="auto"><a href="http://www.google.com/search?q=commonmark&amp;hl=en" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=commonmark&amp;hl=en</a></p>
- <p data-sourcepos="3:1-3:38" dir="auto"><a href="http://www.google.com/search?q=commonmark" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=commonmark</a>&amp;hl;</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
-06_10__inlines__autolinks_extension__007:
- canonical: |
- <p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
- static: |-
- <p data-sourcepos="1:1-1:24" dir="auto"><a href="http://www.commonmark.org/he" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/he</a>&lt;lp</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
-06_10__inlines__autolinks_extension__008:
- canonical: |
- <p><a href="http://commonmark.org">http://commonmark.org</a></p>
- <p>(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
- <p>Anonymous FTP is available at <a href="ftp://foo.bar.baz">ftp://foo.bar.baz</a>.</p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto"><a href="http://commonmark.org" rel="nofollow noreferrer noopener" target="_blank">http://commonmark.org</a></p>
- <p data-sourcepos="3:1-3:63" dir="auto">(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
- <p data-sourcepos="5:1-5:48" dir="auto">Anonymous FTP is available at <a href="ftp://foo.bar.baz/">ftp://foo.bar.baz</a>.</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://commonmark.org">http://commonmark.org</a></p>
-06_10__inlines__autolinks_extension__009:
- canonical: |
- <p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.baz">foo@bar.baz</a></p>
-06_10__inlines__autolinks_extension__010:
- canonical: |
- <p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
- static: |-
- <p data-sourcepos="1:1-1:66" dir="auto">hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
- wysiwyg: |-
- <p>hello@mail+xyz.example isn't valid, but <a target="_blank" rel="noopener noreferrer nofollow" href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
-06_10__inlines__autolinks_extension__011:
- canonical: |
- <p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
- <p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
- <p>a.b-c_d@a.b-</p>
- <p>a.b-c_d@a.b_</p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
- <p data-sourcepos="3:1-3:12" dir="auto"><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
- <p data-sourcepos="5:1-5:12" dir="auto">a.b-c_d@a.b-</p>
- <p data-sourcepos="7:1-7:12" dir="auto">a.b-c_d@a.b_</p>
- wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
-06_11__inlines__raw_html__001:
- canonical: |
- <p><a><bab><c2c></p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto"><a></a></p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "bab" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__002:
- canonical: |
- <p><a/><b2/></p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto"><a></a></p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "b2" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__003:
- canonical: |
- <p><a /><b2
- data="foo" ></p>
- static: |-
- <p data-sourcepos="1:1-2:12" dir="auto"><a></a></p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "b2" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__004:
- canonical: |
- <p><a foo="bar" bam = 'baz <em>"</em>'
- _boolean zoop:33=zoop:33 /></p>
- static: |-
- <p data-sourcepos="1:1-2:27" dir="auto"><a></a></p>
- wysiwyg: |-
- <p></p>
-06_11__inlines__raw_html__005:
- canonical: |
- <p>Foo <responsive-image src="foo.jpg" /></p>
- static: |-
- <p data-sourcepos="1:1-1:38" dir="auto">Foo </p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "responsive-image" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__006:
- canonical: |
- <p>&lt;33&gt; &lt;__&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:9" dir="auto">&lt;33&gt; &lt;__&gt;</p>
- wysiwyg: |-
- <p>&lt;33&gt; &lt;__&gt;</p>
-06_11__inlines__raw_html__007:
- canonical: |
- <p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">&lt;a h*#ref="hi"&gt;</p>
- wysiwyg: |-
- <p>&lt;a h*#ref="hi"&gt;</p>
-06_11__inlines__raw_html__008:
- canonical: |
- <p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:26" dir="auto">&lt;a href="hi'&gt; &lt;a href=hi'&gt;</p>
- wysiwyg: |-
- <p>&lt;a href="hi'&gt; &lt;a href=hi'&gt;</p>
-06_11__inlines__raw_html__009:
- canonical: |
- <p>&lt; a&gt;&lt;
- foo&gt;&lt;bar/ &gt;
- &lt;foo bar=baz
- bim!bop /&gt;</p>
- static: |-
- <p data-sourcepos="1:1-4:10" dir="auto">&lt; a&gt;&lt;
- foo&gt;&lt;bar/ &gt;
- &lt;foo bar=baz
- bim!bop /&gt;</p>
- wysiwyg: |-
- <p>&lt; a&gt;&lt;
- foo&gt;&lt;bar/ &gt;
- &lt;foo bar=baz
- bim!bop /&gt;</p>
-06_11__inlines__raw_html__010:
- canonical: |
- <p>&lt;a href='bar'title=title&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:25" dir="auto">&lt;a href='bar'title=title&gt;</p>
- wysiwyg: |-
- <p>&lt;a href='bar'title=title&gt;</p>
-06_11__inlines__raw_html__011:
- canonical: |
- <p></a></foo ></p>
- static: |-
- <p data-sourcepos="1:1-1:11" dir="auto"></p>
- wysiwyg: |-
- <p></p>
-06_11__inlines__raw_html__012:
- canonical: |
- <p>&lt;/a href=&quot;foo&quot;&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">&lt;/a href="foo"&gt;</p>
- wysiwyg: |-
- <p>&lt;/a href="foo"&gt;</p>
-06_11__inlines__raw_html__013:
- canonical: |
- <p>foo <!-- this is a
- comment - with hyphen --></p>
- static: |-
- <p data-sourcepos="1:1-2:25" dir="auto">foo </p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__014:
- canonical: |
- <p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:41" dir="auto">foo &lt;!-- not a comment -- two hyphens --&gt;</p>
- wysiwyg: |-
- <p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
-06_11__inlines__raw_html__015:
- canonical: |
- <p>foo &lt;!--&gt; foo --&gt;</p>
- <p>foo &lt;!-- foo---&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">foo &lt;!--&gt; foo --&gt;</p>
- <p data-sourcepos="3:1-3:16" dir="auto">foo &lt;!-- foo---&gt;</p>
- wysiwyg: |-
- <p>foo &lt;!--&gt; foo --&gt;</p>
-06_11__inlines__raw_html__016:
- canonical: |
- <p>foo <?php echo $a; ?></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto">foo <?php echo $a; ?></p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__017:
- canonical: |
- <p>foo <!ELEMENT br EMPTY></p>
- static: |-
- <p data-sourcepos="1:1-1:23" dir="auto">foo &lt;!ELEMENT br EMPTY&gt;</p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__018:
- canonical: |
- <p>foo <![CDATA[>&<]]></p>
- static: |-
- <p data-sourcepos="1:1-1:19" dir="auto">foo &lt;![CDATA[&gt;&amp;&lt;]]&gt;</p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__019:
- canonical: |
- <p>foo <a href="&ouml;"></p>
- static: |-
- <p data-sourcepos="1:1-1:21" dir="auto">foo <a href="%C3%B6" rel="nofollow noreferrer noopener" target="_blank"></a></p>
- wysiwyg: |-
- <p>foo </p>
-06_11__inlines__raw_html__020:
- canonical: |
- <p>foo <a href="\*"></p>
- static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">foo <a href="%5C*" rel="nofollow noreferrer noopener" target="_blank"></a></p>
- wysiwyg: |-
- <p>foo </p>
-06_11__inlines__raw_html__021:
- canonical: |
- <p>&lt;a href=&quot;&quot;&quot;&gt;</p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">&lt;a href="""&gt;</p>
- wysiwyg: |-
- <p>&lt;a href="""&gt;</p>
-06_12__inlines__disallowed_raw_html_extension__001:
- canonical: |
- <p><strong> &lt;title> &lt;style> <em></p>
- <blockquote>
- &lt;xmp> is disallowed. &lt;XMP> is also disallowed.
- </blockquote>
- static: |-
- <p data-sourcepos="1:1-1:29" dir="auto"><strong> &lt;em&gt;&lt;/p&gt;
- &lt;blockquote&gt;
- &lt;xmp&gt; is disallowed. &lt;XMP&gt; is also disallowed.
- &lt;/blockquote&gt;</strong></p>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "title" not supported by this converter. Please, provide an specification.
-06_13__inlines__hard_line_breaks__001:
- canonical: |
- <p>foo<br />
- baz</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
- baz</p>
- wysiwyg: |-
- <p>foo<br>
- baz</p>
-06_13__inlines__hard_line_breaks__002:
- canonical: |
- <p>foo<br />
- baz</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
- baz</p>
- wysiwyg: |-
- <p>foo<br>
- baz</p>
-06_13__inlines__hard_line_breaks__003:
- canonical: |
- <p>foo<br />
- baz</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">foo<br>
- baz</p>
- wysiwyg: |-
- <p>foo<br>
- baz</p>
-06_13__inlines__hard_line_breaks__004:
- canonical: |
- <p>foo<br />
- bar</p>
- static: |-
- <p data-sourcepos="1:1-2:8" dir="auto">foo<br>
- bar</p>
- wysiwyg: |-
- <p>foo<br>
- bar</p>
-06_13__inlines__hard_line_breaks__005:
- canonical: |
- <p>foo<br />
- bar</p>
- static: |-
- <p data-sourcepos="1:1-2:8" dir="auto">foo<br>
- bar</p>
- wysiwyg: |-
- <p>foo<br>
- bar</p>
-06_13__inlines__hard_line_breaks__006:
- canonical: |
- <p><em>foo<br />
- bar</em></p>
- static: |-
- <p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>
- bar</em></p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_13__inlines__hard_line_breaks__007:
- canonical: |
- <p><em>foo<br />
- bar</em></p>
- static: |-
- <p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>
- bar</em></p>
- wysiwyg: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_13__inlines__hard_line_breaks__008:
- canonical: |
- <p><code>code span</code></p>
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto"><code>code span</code></p>
- wysiwyg: |-
- <p><code>code span</code></p>
-06_13__inlines__hard_line_breaks__009:
- canonical: |
- <p><code>code\ span</code></p>
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto"><code>code\ span</code></p>
- wysiwyg: |-
- <p><code>code\ span</code></p>
-06_13__inlines__hard_line_breaks__010:
- canonical: "<p><a href=\"foo \nbar\"></p>\n"
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto"><a href="foo%20%20%0Abar" rel="nofollow noreferrer noopener" target="_blank"></a></p>
- wysiwyg: |-
- <p></p>
-06_13__inlines__hard_line_breaks__011:
- canonical: |
- <p><a href="foo\
- bar"></p>
- static: |-
- <p data-sourcepos="1:1-2:5" dir="auto"><a href="foo%5C%0Abar" rel="nofollow noreferrer noopener" target="_blank"></a></p>
- wysiwyg: |-
- <p></p>
-06_13__inlines__hard_line_breaks__012:
- canonical: |
- <p>foo\</p>
- static: |-
- <p data-sourcepos="1:1-1:4" dir="auto">foo\</p>
- wysiwyg: |-
- <p>foo\</p>
-06_13__inlines__hard_line_breaks__013:
- canonical: |
- <p>foo</p>
- static: |-
- <p data-sourcepos="1:1-1:5" dir="auto">foo</p>
- wysiwyg: |-
- <p>foo</p>
-06_13__inlines__hard_line_breaks__014:
- canonical: |
- <h3>foo\</h3>
- static: |-
- <h3 data-sourcepos="1:1-1:8" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo\</h3>
- wysiwyg: |-
- <h3>foo\</h3>
-06_13__inlines__hard_line_breaks__015:
- canonical: |
- <h3>foo</h3>
- static: |-
- <h3 data-sourcepos="1:1-1:7" dir="auto">
- <a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h3>
- wysiwyg: |-
- <h3>foo</h3>
-06_14__inlines__soft_line_breaks__001:
- canonical: |
- <p>foo
- baz</p>
- static: |-
- <p data-sourcepos="1:1-2:3" dir="auto">foo
- baz</p>
- wysiwyg: |-
- <p>foo
- baz</p>
-06_14__inlines__soft_line_breaks__002:
- canonical: |
- <p>foo
- baz</p>
- static: |-
- <p data-sourcepos="1:1-2:4" dir="auto">foo
- baz</p>
- wysiwyg: |-
- <p>foo
- baz</p>
-06_15__inlines__textual_content__001:
- canonical: |
- <p>hello $.;'there</p>
- static: |-
- <p data-sourcepos="1:1-1:15" dir="auto">hello $.;'there</p>
- wysiwyg: |-
- <p>hello $.;'there</p>
-06_15__inlines__textual_content__002:
- canonical: |
- <p>Foo χÏῆν</p>
- static: |-
- <p data-sourcepos="1:1-1:13" dir="auto">Foo χÏῆν</p>
- wysiwyg: |-
- <p>Foo χÏῆν</p>
-06_15__inlines__textual_content__003:
- canonical: |
- <p>Multiple spaces</p>
- static: |-
- <p data-sourcepos="1:1-1:19" dir="auto">Multiple spaces</p>
- wysiwyg: |-
- <p>Multiple spaces</p>
-07_01__gitlab_specific_markdown__footnotes__001:
- canonical: ""
- static: |-
- <p data-sourcepos="1:1-1:27" dir="auto">footnote reference tag <sup class="footnote-ref"><a href="#fn-1-2118" id="fnref-1-2118" data-footnote-ref>1</a></sup></p>
- <section data-footnotes class="footnotes">
- <ol>
- <li id="fn-1-2118">
- <p data-sourcepos="3:7-3:19">footnote text <a href="#fnref-1-2118" data-footnote-backref aria-label="Back to content" class="footnote-backref"><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
- </li>
- </ol>
- </section>
- wysiwyg: |-
- Error - check implementation:
- Hast node of type "sup" not supported by this converter. Please, provide an specification.
diff --git a/spec/fixtures/glfm/example_snapshots/markdown.yml b/spec/fixtures/glfm/example_snapshots/markdown.yml
deleted file mode 100644
index d1fd16b10ce..00000000000
--- a/spec/fixtures/glfm/example_snapshots/markdown.yml
+++ /dev/null
@@ -1,2201 +0,0 @@
----
-02_01__preliminaries__tabs__001: "\tfoo\tbaz\t\tbim\n"
-02_01__preliminaries__tabs__002: " \tfoo\tbaz\t\tbim\n"
-02_01__preliminaries__tabs__003: " a\ta\n á½\ta\n"
-02_01__preliminaries__tabs__004: " - foo\n\n\tbar\n"
-02_01__preliminaries__tabs__005: "- foo\n\n\t\tbar\n"
-02_01__preliminaries__tabs__006: ">\t\tfoo\n"
-02_01__preliminaries__tabs__007: "-\t\tfoo\n"
-02_01__preliminaries__tabs__008: " foo\n\tbar\n"
-02_01__preliminaries__tabs__009: " - foo\n - bar\n\t - baz\n"
-02_01__preliminaries__tabs__010: "#\tFoo\n"
-02_01__preliminaries__tabs__011: "*\t*\t*\t\n"
-03_01__blocks_and_inlines__precedence__001: |
- - `one
- - two`
-04_01__leaf_blocks__thematic_breaks__001: |
- ***
- ---
- ___
-04_01__leaf_blocks__thematic_breaks__002: |
- +++
-04_01__leaf_blocks__thematic_breaks__003: |
- ===
-04_01__leaf_blocks__thematic_breaks__004: |
- --
- **
- __
-04_01__leaf_blocks__thematic_breaks__005: |2
- ***
- ***
- ***
-04_01__leaf_blocks__thematic_breaks__006: |2
- ***
-04_01__leaf_blocks__thematic_breaks__007: |
- Foo
- ***
-04_01__leaf_blocks__thematic_breaks__008: |
- _____________________________________
-04_01__leaf_blocks__thematic_breaks__009: |2
- - - -
-04_01__leaf_blocks__thematic_breaks__010: |2
- ** * ** * ** * **
-04_01__leaf_blocks__thematic_breaks__011: |
- - - - -
-04_01__leaf_blocks__thematic_breaks__012: "- - - - \n"
-04_01__leaf_blocks__thematic_breaks__013: |
- _ _ _ _ a
-
- a------
-
- ---a---
-04_01__leaf_blocks__thematic_breaks__014: |2
- *-*
-04_01__leaf_blocks__thematic_breaks__015: |
- - foo
- ***
- - bar
-04_01__leaf_blocks__thematic_breaks__016: |
- Foo
- ***
- bar
-04_01__leaf_blocks__thematic_breaks__017: |
- Foo
- ---
- bar
-04_01__leaf_blocks__thematic_breaks__018: |
- * Foo
- * * *
- * Bar
-04_01__leaf_blocks__thematic_breaks__019: |
- - Foo
- - * * *
-04_02__leaf_blocks__atx_headings__001: |
- # foo
- ## foo
- ### foo
- #### foo
- ##### foo
- ###### foo
-04_02__leaf_blocks__atx_headings__002: |
- ####### foo
-04_02__leaf_blocks__atx_headings__003: |
- #5 bolt
-
- #hashtag
-04_02__leaf_blocks__atx_headings__004: |
- \## foo
-04_02__leaf_blocks__atx_headings__005: |
- # foo *bar* \*baz\*
-04_02__leaf_blocks__atx_headings__006: "# foo \n"
-04_02__leaf_blocks__atx_headings__007: |2
- ### foo
- ## foo
- # foo
-04_02__leaf_blocks__atx_headings__008: |2
- # foo
-04_02__leaf_blocks__atx_headings__009: |
- foo
- # bar
-04_02__leaf_blocks__atx_headings__010: |
- ## foo ##
- ### bar ###
-04_02__leaf_blocks__atx_headings__011: |
- # foo ##################################
- ##### foo ##
-04_02__leaf_blocks__atx_headings__012: "### foo ### \n"
-04_02__leaf_blocks__atx_headings__013: |
- ### foo ### b
-04_02__leaf_blocks__atx_headings__014: |
- # foo#
-04_02__leaf_blocks__atx_headings__015: |
- ### foo \###
- ## foo #\##
- # foo \#
-04_02__leaf_blocks__atx_headings__016: |
- ****
- ## foo
- ****
-04_02__leaf_blocks__atx_headings__017: |
- Foo bar
- # baz
- Bar foo
-04_02__leaf_blocks__atx_headings__018: "## \n#\n### ###\n"
-04_03__leaf_blocks__setext_headings__001: |
- Foo *bar*
- =========
-
- Foo *bar*
- ---------
-04_03__leaf_blocks__setext_headings__002: |
- Foo *bar
- baz*
- ====
-04_03__leaf_blocks__setext_headings__003: " Foo *bar\nbaz*\t\n====\n"
-04_03__leaf_blocks__setext_headings__004: |
- Foo
- -------------------------
-
- Foo
- =
-04_03__leaf_blocks__setext_headings__005: |2
- Foo
- ---
-
- Foo
- -----
-
- Foo
- ===
-04_03__leaf_blocks__setext_headings__006: |2
- Foo
- ---
-
- Foo
- ---
-04_03__leaf_blocks__setext_headings__007: "Foo\n ---- \n"
-04_03__leaf_blocks__setext_headings__008: |
- Foo
- ---
-04_03__leaf_blocks__setext_headings__009: |
- Foo
- = =
-
- Foo
- --- -
-04_03__leaf_blocks__setext_headings__010: "Foo \n-----\n"
-04_03__leaf_blocks__setext_headings__011: |
- Foo\
- ----
-04_03__leaf_blocks__setext_headings__012: |
- `Foo
- ----
- `
-
- <a title="a lot
- ---
- of dashes"/>
-04_03__leaf_blocks__setext_headings__013: |
- > Foo
- ---
-04_03__leaf_blocks__setext_headings__014: |
- > foo
- bar
- ===
-04_03__leaf_blocks__setext_headings__015: |
- - Foo
- ---
-04_03__leaf_blocks__setext_headings__016: |
- Foo
- Bar
- ---
-04_03__leaf_blocks__setext_headings__017: |
- ---
- Foo
- ---
- Bar
- ---
- Baz
-04_03__leaf_blocks__setext_headings__018: |2
-
- ====
-04_03__leaf_blocks__setext_headings__019: |
- ---
- ---
-04_03__leaf_blocks__setext_headings__020: |
- - foo
- -----
-04_03__leaf_blocks__setext_headings__021: |2
- foo
- ---
-04_03__leaf_blocks__setext_headings__022: |
- > foo
- -----
-04_03__leaf_blocks__setext_headings__023: |
- \> foo
- ------
-04_03__leaf_blocks__setext_headings__024: |
- Foo
-
- bar
- ---
- baz
-04_03__leaf_blocks__setext_headings__025: |
- Foo
- bar
-
- ---
-
- baz
-04_03__leaf_blocks__setext_headings__026: |
- Foo
- bar
- * * *
- baz
-04_03__leaf_blocks__setext_headings__027: |
- Foo
- bar
- \---
- baz
-04_04__leaf_blocks__indented_code_blocks__001: |2
- a simple
- indented code block
-04_04__leaf_blocks__indented_code_blocks__002: |2
- - foo
-
- bar
-04_04__leaf_blocks__indented_code_blocks__003: |
- 1. foo
-
- - bar
-04_04__leaf_blocks__indented_code_blocks__004: |2
- <a/>
- *hi*
-
- - one
-04_04__leaf_blocks__indented_code_blocks__005: " chunk1\n\n chunk2\n \n \n
- \n chunk3\n"
-04_04__leaf_blocks__indented_code_blocks__006: " chunk1\n \n chunk2\n"
-04_04__leaf_blocks__indented_code_blocks__007: |+
- Foo
- bar
-
-04_04__leaf_blocks__indented_code_blocks__008: |2
- foo
- bar
-04_04__leaf_blocks__indented_code_blocks__009: |
- # Heading
- foo
- Heading
- ------
- foo
- ----
-04_04__leaf_blocks__indented_code_blocks__010: |2
- foo
- bar
-04_04__leaf_blocks__indented_code_blocks__011: "\n \n foo\n \n\n"
-04_04__leaf_blocks__indented_code_blocks__012: " foo \n"
-04_05__leaf_blocks__fenced_code_blocks__001: |
- ```
- <
- >
- ```
-04_05__leaf_blocks__fenced_code_blocks__002: |
- ~~~
- <
- >
- ~~~
-04_05__leaf_blocks__fenced_code_blocks__003: |
- ``
- foo
- ``
-04_05__leaf_blocks__fenced_code_blocks__004: |
- ```
- aaa
- ~~~
- ```
-04_05__leaf_blocks__fenced_code_blocks__005: |
- ~~~
- aaa
- ```
- ~~~
-04_05__leaf_blocks__fenced_code_blocks__006: |
- ````
- aaa
- ```
- ``````
-04_05__leaf_blocks__fenced_code_blocks__007: |
- ~~~~
- aaa
- ~~~
- ~~~~
-04_05__leaf_blocks__fenced_code_blocks__008: |
- ```
-04_05__leaf_blocks__fenced_code_blocks__009: |
- `````
-
- ```
- aaa
-04_05__leaf_blocks__fenced_code_blocks__010: |
- > ```
- > aaa
-
- bbb
-04_05__leaf_blocks__fenced_code_blocks__011: "```\n\n \n```\n"
-04_05__leaf_blocks__fenced_code_blocks__012: |
- ```
- ```
-04_05__leaf_blocks__fenced_code_blocks__013: |2
- ```
- aaa
- aaa
- ```
-04_05__leaf_blocks__fenced_code_blocks__014: |2
- ```
- aaa
- aaa
- aaa
- ```
-04_05__leaf_blocks__fenced_code_blocks__015: |2
- ```
- aaa
- aaa
- aaa
- ```
-04_05__leaf_blocks__fenced_code_blocks__016: |2
- ```
- aaa
- ```
-04_05__leaf_blocks__fenced_code_blocks__017: |
- ```
- aaa
- ```
-04_05__leaf_blocks__fenced_code_blocks__018: |2
- ```
- aaa
- ```
-04_05__leaf_blocks__fenced_code_blocks__019: |
- ```
- aaa
- ```
-04_05__leaf_blocks__fenced_code_blocks__020: |
- ``` ```
- aaa
-04_05__leaf_blocks__fenced_code_blocks__021: |
- ~~~~~~
- aaa
- ~~~ ~~
-04_05__leaf_blocks__fenced_code_blocks__022: |
- foo
- ```
- bar
- ```
- baz
-04_05__leaf_blocks__fenced_code_blocks__023: |
- foo
- ---
- ~~~
- bar
- ~~~
- # baz
-04_05__leaf_blocks__fenced_code_blocks__024: |
- ```ruby
- def foo(x)
- return 3
- end
- ```
-04_05__leaf_blocks__fenced_code_blocks__025: |
- ~~~~ ruby startline=3 $%@#$
- def foo(x)
- return 3
- end
- ~~~~~~~
-04_05__leaf_blocks__fenced_code_blocks__026: |
- ````;
- ````
-04_05__leaf_blocks__fenced_code_blocks__027: |
- ``` aa ```
- foo
-04_05__leaf_blocks__fenced_code_blocks__028: |
- ~~~ aa ``` ~~~
- foo
- ~~~
-04_05__leaf_blocks__fenced_code_blocks__029: |
- ```
- ``` aaa
- ```
-04_06__leaf_blocks__html_blocks__001: |
- <table><tr><td>
- <pre>
- **Hello**,
-
- _world_.
- </pre>
- </td></tr></table>
-04_06__leaf_blocks__html_blocks__002: |
- <table>
- <tr>
- <td>
- hi
- </td>
- </tr>
- </table>
-
- okay.
-04_06__leaf_blocks__html_blocks__003: |2
- <div>
- *hello*
- <foo><a>
-04_06__leaf_blocks__html_blocks__004: |
- </div>
- *foo*
-04_06__leaf_blocks__html_blocks__005: |
- <DIV CLASS="foo">
-
- *Markdown*
-
- </DIV>
-04_06__leaf_blocks__html_blocks__006: |
- <div id="foo"
- class="bar">
- </div>
-04_06__leaf_blocks__html_blocks__007: |
- <div id="foo" class="bar
- baz">
- </div>
-04_06__leaf_blocks__html_blocks__008: |
- <div>
- *foo*
-
- *bar*
-04_06__leaf_blocks__html_blocks__009: |
- <div id="foo"
- *hi*
-04_06__leaf_blocks__html_blocks__010: |
- <div class
- foo
-04_06__leaf_blocks__html_blocks__011: |
- <div *???-&&&-<---
- *foo*
-04_06__leaf_blocks__html_blocks__012: |
- <div><a href="bar">*foo*</a></div>
-04_06__leaf_blocks__html_blocks__013: |
- <table><tr><td>
- foo
- </td></tr></table>
-04_06__leaf_blocks__html_blocks__014: |
- <div></div>
- ``` c
- int x = 33;
- ```
-04_06__leaf_blocks__html_blocks__015: |
- <a href="foo">
- *bar*
- </a>
-04_06__leaf_blocks__html_blocks__016: |
- <Warning>
- *bar*
- </Warning>
-04_06__leaf_blocks__html_blocks__017: |
- <i class="foo">
- *bar*
- </i>
-04_06__leaf_blocks__html_blocks__018: |
- </ins>
- *bar*
-04_06__leaf_blocks__html_blocks__019: |
- <del>
- *foo*
- </del>
-04_06__leaf_blocks__html_blocks__020: |
- <del>
-
- *foo*
-
- </del>
-04_06__leaf_blocks__html_blocks__021: |
- <del>*foo*</del>
-04_06__leaf_blocks__html_blocks__022: |
- <pre language="haskell"><code>
- import Text.HTML.TagSoup
-
- main :: IO ()
- main = print $ parseTags tags
- </code></pre>
- okay
-04_06__leaf_blocks__html_blocks__023: |
- <script type="text/javascript">
- // JavaScript example
-
- document.getElementById("demo").innerHTML = "Hello JavaScript!";
- </script>
- okay
-04_06__leaf_blocks__html_blocks__024: |
- <style
- type="text/css">
- h1 {color:red;}
-
- p {color:blue;}
- </style>
- okay
-04_06__leaf_blocks__html_blocks__025: |
- <style
- type="text/css">
-
- foo
-04_06__leaf_blocks__html_blocks__026: |
- > <div>
- > foo
-
- bar
-04_06__leaf_blocks__html_blocks__027: |
- - <div>
- - foo
-04_06__leaf_blocks__html_blocks__028: |
- <style>p{color:red;}</style>
- *foo*
-04_06__leaf_blocks__html_blocks__029: |
- <!-- foo -->*bar*
- *baz*
-04_06__leaf_blocks__html_blocks__030: |
- <script>
- foo
- </script>1. *bar*
-04_06__leaf_blocks__html_blocks__031: |
- <!-- Foo
-
- bar
- baz -->
- okay
-04_06__leaf_blocks__html_blocks__032: |
- <?php
-
- echo '>';
-
- ?>
- okay
-04_06__leaf_blocks__html_blocks__033: |
- <!DOCTYPE html>
-04_06__leaf_blocks__html_blocks__034: |
- <![CDATA[
- function matchwo(a,b)
- {
- if (a < b && a < 0) then {
- return 1;
-
- } else {
-
- return 0;
- }
- }
- ]]>
- okay
-04_06__leaf_blocks__html_blocks__035: |2
- <!-- foo -->
-
- <!-- foo -->
-04_06__leaf_blocks__html_blocks__036: |2
- <div>
-
- <div>
-04_06__leaf_blocks__html_blocks__037: |
- Foo
- <div>
- bar
- </div>
-04_06__leaf_blocks__html_blocks__038: |
- <div>
- bar
- </div>
- *foo*
-04_06__leaf_blocks__html_blocks__039: |
- Foo
- <a href="bar">
- baz
-04_06__leaf_blocks__html_blocks__040: |
- <div>
-
- *Emphasized* text.
-
- </div>
-04_06__leaf_blocks__html_blocks__041: |
- <div>
- *Emphasized* text.
- </div>
-04_06__leaf_blocks__html_blocks__042: |
- <table>
-
- <tr>
-
- <td>
- Hi
- </td>
-
- </tr>
-
- </table>
-04_06__leaf_blocks__html_blocks__043: |
- <table>
-
- <tr>
-
- <td>
- Hi
- </td>
-
- </tr>
-
- </table>
-04_07__leaf_blocks__link_reference_definitions__001: |
- [foo]: /url "title"
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__002: " [foo]: \n /url \n 'the
- title' \n\n[foo]\n"
-04_07__leaf_blocks__link_reference_definitions__003: |
- [Foo*bar\]]:my_(url) 'title (with parens)'
-
- [Foo*bar\]]
-04_07__leaf_blocks__link_reference_definitions__004: |
- [Foo bar]:
- <my url>
- 'title'
-
- [Foo bar]
-04_07__leaf_blocks__link_reference_definitions__005: |
- [foo]: /url '
- title
- line1
- line2
- '
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__006: |
- [foo]: /url 'title
-
- with blank line'
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__007: |
- [foo]:
- /url
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__008: |
- [foo]:
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__009: |
- [foo]: <>
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__010: |
- [foo]: <bar>(baz)
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__011: |
- [foo]: /url\bar\*baz "foo\"bar\baz"
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__012: |
- [foo]
-
- [foo]: url
-04_07__leaf_blocks__link_reference_definitions__013: |
- [foo]
-
- [foo]: first
- [foo]: second
-04_07__leaf_blocks__link_reference_definitions__014: |
- [FOO]: /url
-
- [Foo]
-04_07__leaf_blocks__link_reference_definitions__015: |
- [ΑΓΩ]: /φου
-
- [αγω]
-04_07__leaf_blocks__link_reference_definitions__016: |
- [foo]: /url
-04_07__leaf_blocks__link_reference_definitions__017: |
- [
- foo
- ]: /url
- bar
-04_07__leaf_blocks__link_reference_definitions__018: |
- [foo]: /url "title" ok
-04_07__leaf_blocks__link_reference_definitions__019: |
- [foo]: /url
- "title" ok
-04_07__leaf_blocks__link_reference_definitions__020: |2
- [foo]: /url "title"
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__021: |
- ```
- [foo]: /url
- ```
-
- [foo]
-04_07__leaf_blocks__link_reference_definitions__022: |
- Foo
- [bar]: /baz
-
- [bar]
-04_07__leaf_blocks__link_reference_definitions__023: |
- # [Foo]
- [foo]: /url
- > bar
-04_07__leaf_blocks__link_reference_definitions__024: |
- [foo]: /url
- bar
- ===
- [foo]
-04_07__leaf_blocks__link_reference_definitions__025: |
- [foo]: /url
- ===
- [foo]
-04_07__leaf_blocks__link_reference_definitions__026: |
- [foo]: /foo-url "foo"
- [bar]: /bar-url
- "bar"
- [baz]: /baz-url
-
- [foo],
- [bar],
- [baz]
-04_07__leaf_blocks__link_reference_definitions__027: |
- [foo]
-
- > [foo]: /url
-04_07__leaf_blocks__link_reference_definitions__028: |
- [foo]: /url
-04_08__leaf_blocks__paragraphs__001: |
- aaa
-
- bbb
-04_08__leaf_blocks__paragraphs__002: |
- aaa
- bbb
-
- ccc
- ddd
-04_08__leaf_blocks__paragraphs__003: |
- aaa
-
-
- bbb
-04_08__leaf_blocks__paragraphs__004: |2
- aaa
- bbb
-04_08__leaf_blocks__paragraphs__005: |
- aaa
- bbb
- ccc
-04_08__leaf_blocks__paragraphs__006: |2
- aaa
- bbb
-04_08__leaf_blocks__paragraphs__007: |2
- aaa
- bbb
-04_08__leaf_blocks__paragraphs__008: "aaa \nbbb \n"
-04_09__leaf_blocks__blank_lines__001: " \n\naaa\n \n\n# aaa\n\n \n"
-04_10__leaf_blocks__tables_extension__001: |
- | foo | bar |
- | --- | --- |
- | baz | bim |
-04_10__leaf_blocks__tables_extension__002: |
- | abc | defghi |
- :-: | -----------:
- bar | baz
-04_10__leaf_blocks__tables_extension__003: |
- | f\|oo |
- | ------ |
- | b `\|` az |
- | b **\|** im |
-04_10__leaf_blocks__tables_extension__004: |
- | abc | def |
- | --- | --- |
- | bar | baz |
- > bar
-04_10__leaf_blocks__tables_extension__005: |
- | abc | def |
- | --- | --- |
- | bar | baz |
- bar
-
- bar
-04_10__leaf_blocks__tables_extension__006: |
- | abc | def |
- | --- |
- | bar |
-04_10__leaf_blocks__tables_extension__007: |
- | abc | def |
- | --- | --- |
- | bar |
- | bar | baz | boo |
-04_10__leaf_blocks__tables_extension__008: |
- | abc | def |
- | --- | --- |
-05_01__container_blocks__block_quotes__001: |
- > # Foo
- > bar
- > baz
-05_01__container_blocks__block_quotes__002: |
- ># Foo
- >bar
- > baz
-05_01__container_blocks__block_quotes__003: |2
- > # Foo
- > bar
- > baz
-05_01__container_blocks__block_quotes__004: |2
- > # Foo
- > bar
- > baz
-05_01__container_blocks__block_quotes__005: |
- > # Foo
- > bar
- baz
-05_01__container_blocks__block_quotes__006: |
- > bar
- baz
- > foo
-05_01__container_blocks__block_quotes__007: |
- > foo
- ---
-05_01__container_blocks__block_quotes__008: |
- > - foo
- - bar
-05_01__container_blocks__block_quotes__009: |
- > foo
- bar
-05_01__container_blocks__block_quotes__010: |
- > ```
- foo
- ```
-05_01__container_blocks__block_quotes__011: |
- > foo
- - bar
-05_01__container_blocks__block_quotes__012: |
- >
-05_01__container_blocks__block_quotes__013: ">\n> \n> \n"
-05_01__container_blocks__block_quotes__014: ">\n> foo\n> \n"
-05_01__container_blocks__block_quotes__015: |
- > foo
-
- > bar
-05_01__container_blocks__block_quotes__016: |
- > foo
- > bar
-05_01__container_blocks__block_quotes__017: |
- > foo
- >
- > bar
-05_01__container_blocks__block_quotes__018: |
- foo
- > bar
-05_01__container_blocks__block_quotes__019: |
- > aaa
- ***
- > bbb
-05_01__container_blocks__block_quotes__020: |
- > bar
- baz
-05_01__container_blocks__block_quotes__021: |
- > bar
-
- baz
-05_01__container_blocks__block_quotes__022: |
- > bar
- >
- baz
-05_01__container_blocks__block_quotes__023: |
- > > > foo
- bar
-05_01__container_blocks__block_quotes__024: |
- >>> foo
- > bar
- >>baz
-05_01__container_blocks__block_quotes__025: |
- > code
-
- > not code
-05_02__container_blocks__list_items__001: |
- A paragraph
- with two lines.
-
- indented code
-
- > A block quote.
-05_02__container_blocks__list_items__002: |
- 1. A paragraph
- with two lines.
-
- indented code
-
- > A block quote.
-05_02__container_blocks__list_items__003: |
- - one
-
- two
-05_02__container_blocks__list_items__004: |
- - one
-
- two
-05_02__container_blocks__list_items__005: |2
- - one
-
- two
-05_02__container_blocks__list_items__006: |2
- - one
-
- two
-05_02__container_blocks__list_items__007: |2
- > > 1. one
- >>
- >> two
-05_02__container_blocks__list_items__008: |
- >>- one
- >>
- > > two
-05_02__container_blocks__list_items__009: |
- -one
-
- 2.two
-05_02__container_blocks__list_items__010: |
- - foo
-
-
- bar
-05_02__container_blocks__list_items__011: |
- 1. foo
-
- ```
- bar
- ```
-
- baz
-
- > bam
-05_02__container_blocks__list_items__012: |
- - Foo
-
- bar
-
-
- baz
-05_02__container_blocks__list_items__013: |
- 123456789. ok
-05_02__container_blocks__list_items__014: |
- 1234567890. not ok
-05_02__container_blocks__list_items__015: |
- 0. ok
-05_02__container_blocks__list_items__016: |
- 003. ok
-05_02__container_blocks__list_items__017: |
- -1. not ok
-05_02__container_blocks__list_items__018: |
- - foo
-
- bar
-05_02__container_blocks__list_items__019: |2
- 10. foo
-
- bar
-05_02__container_blocks__list_items__020: |2
- indented code
-
- paragraph
-
- more code
-05_02__container_blocks__list_items__021: |
- 1. indented code
-
- paragraph
-
- more code
-05_02__container_blocks__list_items__022: |
- 1. indented code
-
- paragraph
-
- more code
-05_02__container_blocks__list_items__023: |2
- foo
-
- bar
-05_02__container_blocks__list_items__024: |
- - foo
-
- bar
-05_02__container_blocks__list_items__025: |
- - foo
-
- bar
-05_02__container_blocks__list_items__026: |
- -
- foo
- -
- ```
- bar
- ```
- -
- baz
-05_02__container_blocks__list_items__027: "- \n foo\n"
-05_02__container_blocks__list_items__028: |
- -
-
- foo
-05_02__container_blocks__list_items__029: |
- - foo
- -
- - bar
-05_02__container_blocks__list_items__030: "- foo\n- \n- bar\n"
-05_02__container_blocks__list_items__031: |
- 1. foo
- 2.
- 3. bar
-05_02__container_blocks__list_items__032: |
- *
-05_02__container_blocks__list_items__033: |
- foo
- *
-
- foo
- 1.
-05_02__container_blocks__list_items__034: |2
- 1. A paragraph
- with two lines.
-
- indented code
-
- > A block quote.
-05_02__container_blocks__list_items__035: |2
- 1. A paragraph
- with two lines.
-
- indented code
-
- > A block quote.
-05_02__container_blocks__list_items__036: |2
- 1. A paragraph
- with two lines.
-
- indented code
-
- > A block quote.
-05_02__container_blocks__list_items__037: |2
- 1. A paragraph
- with two lines.
-
- indented code
-
- > A block quote.
-05_02__container_blocks__list_items__038: |2
- 1. A paragraph
- with two lines.
-
- indented code
-
- > A block quote.
-05_02__container_blocks__list_items__039: |2
- 1. A paragraph
- with two lines.
-05_02__container_blocks__list_items__040: |
- > 1. > Blockquote
- continued here.
-05_02__container_blocks__list_items__041: |
- > 1. > Blockquote
- > continued here.
-05_02__container_blocks__list_items__042: |
- - foo
- - bar
- - baz
- - boo
-05_02__container_blocks__list_items__043: |
- - foo
- - bar
- - baz
- - boo
-05_02__container_blocks__list_items__044: |
- 10) foo
- - bar
-05_02__container_blocks__list_items__045: |
- 10) foo
- - bar
-05_02__container_blocks__list_items__046: |
- - - foo
-05_02__container_blocks__list_items__047: |
- 1. - 2. foo
-05_02__container_blocks__list_items__048: |
- - # Foo
- - Bar
- ---
- baz
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__049: |
- - [ ] foo
- - [x] bar
- - [x] foo
- - [ ] bar
- - [x] baz
- - [ ] bim
- - foo
- - bar
- + baz
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__050: |
- 1. foo
- 2. bar
- 3) baz
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__051: |
- Foo
- - bar
- - baz
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__052: |
- The number of windows in my house is
- 14. The number of doors is 6.
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__053: |
- The number of windows in my house is
- 1. The number of doors is 6.
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__054: |
- - foo
-
- - bar
-
-
- - baz
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__055: |
- - foo
- - bar
- - baz
-
-
- bim
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__056: |
- - foo
- - bar
-
- <!-- -->
-
- - baz
- - bim
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__057: |
- - foo
-
- notcode
-
- - foo
-
- <!-- -->
-
- code
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__058: |
- - a
- - b
- - c
- - d
- - e
- - f
- - g
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__059: |
- 1. a
-
- 2. b
-
- 3. c
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__060: |
- - a
- - b
- - c
- - d
- - e
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__061: |
- 1. a
-
- 2. b
-
- 3. c
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__062: |
- - a
- - b
-
- - c
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__063: |
- * a
- *
-
- * c
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__064: |
- - a
- - b
-
- c
- - d
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__065: |
- - a
- - b
-
- [ref]: /url
- - d
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__066: |
- - a
- - ```
- b
-
-
- ```
- - c
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__067: |
- - a
- - b
-
- c
- - d
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__068: |
- * a
- > b
- >
- * c
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__069: |
- - a
- > b
- ```
- c
- ```
- - d
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__070: |
- - a
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__071: |
- - a
- - b
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__072: |
- 1. ```
- foo
- ```
-
- bar
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__073: |
- * foo
- * bar
-
- baz
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__074: |
- - a
- - b
- - c
-
- - d
- - e
- - f
-06_01__inlines__001: |
- `hi`lo`
-06_02__inlines__backslash_escapes__001: |
- \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
-06_02__inlines__backslash_escapes__002: "\\\t\\A\\a\\ \\3\\φ\\«\n"
-06_02__inlines__backslash_escapes__003: |
- \*not emphasized*
- \<br/> not a tag
- \[not a link](/foo)
- \`not code`
- 1\. not a list
- \* not a list
- \# not a heading
- \[foo]: /url "not a reference"
- \&ouml; not a character entity
-06_02__inlines__backslash_escapes__004: |
- \\*emphasis*
-06_02__inlines__backslash_escapes__005: |
- foo\
- bar
-06_02__inlines__backslash_escapes__006: |
- `` \[\` ``
-06_02__inlines__backslash_escapes__007: |2
- \[\]
-06_02__inlines__backslash_escapes__008: |
- ~~~
- \[\]
- ~~~
-06_02__inlines__backslash_escapes__009: |
- <http://example.com?find=\*>
-06_02__inlines__backslash_escapes__010: |
- <a href="/bar\/)">
-06_02__inlines__backslash_escapes__011: |
- [foo](/bar\* "ti\*tle")
-06_02__inlines__backslash_escapes__012: |
- [foo]
-
- [foo]: /bar\* "ti\*tle"
-06_02__inlines__backslash_escapes__013: |
- ``` foo\+bar
- foo
- ```
-06_03__inlines__entity_and_numeric_character_references__001: |
- &nbsp; &amp; &copy; &AElig; &Dcaron;
- &frac34; &HilbertSpace; &DifferentialD;
- &ClockwiseContourIntegral; &ngE;
-06_03__inlines__entity_and_numeric_character_references__002: |
- &#35; &#1234; &#992; &#0;
-06_03__inlines__entity_and_numeric_character_references__003: |
- &#X22; &#XD06; &#xcab;
-06_03__inlines__entity_and_numeric_character_references__004: |
- &nbsp &x; &#; &#x;
- &#987654321;
- &#abcdef0;
- &ThisIsNotDefined; &hi?;
-06_03__inlines__entity_and_numeric_character_references__005: |
- &copy
-06_03__inlines__entity_and_numeric_character_references__006: |
- &MadeUpEntity;
-06_03__inlines__entity_and_numeric_character_references__007: |
- <a href="&ouml;&ouml;.html">
-06_03__inlines__entity_and_numeric_character_references__008: |
- [foo](/f&ouml;&ouml; "f&ouml;&ouml;")
-06_03__inlines__entity_and_numeric_character_references__009: |
- [foo]
-
- [foo]: /f&ouml;&ouml; "f&ouml;&ouml;"
-06_03__inlines__entity_and_numeric_character_references__010: |
- ``` f&ouml;&ouml;
- foo
- ```
-06_03__inlines__entity_and_numeric_character_references__011: |
- `f&ouml;&ouml;`
-06_03__inlines__entity_and_numeric_character_references__012: |2
- f&ouml;f&ouml;
-06_03__inlines__entity_and_numeric_character_references__013: |
- &#42;foo&#42;
- *foo*
-06_03__inlines__entity_and_numeric_character_references__014: |
- &#42; foo
-
- * foo
-06_03__inlines__entity_and_numeric_character_references__015: |
- foo&#10;&#10;bar
-06_03__inlines__entity_and_numeric_character_references__016: |
- &#9;foo
-06_03__inlines__entity_and_numeric_character_references__017: |
- [a](url &quot;tit&quot;)
-06_04__inlines__code_spans__001: |
- `foo`
-06_04__inlines__code_spans__002: |
- `` foo ` bar ``
-06_04__inlines__code_spans__003: |
- ` `` `
-06_04__inlines__code_spans__004: |
- ` `` `
-06_04__inlines__code_spans__005: |
- ` a`
-06_04__inlines__code_spans__006: |
- ` b `
-06_04__inlines__code_spans__007: |
- ` `
- ` `
-06_04__inlines__code_spans__008: "``\nfoo\nbar \nbaz\n``\n"
-06_04__inlines__code_spans__009: "``\nfoo \n``\n"
-06_04__inlines__code_spans__010: "`foo bar \nbaz`\n"
-06_04__inlines__code_spans__011: |
- `foo\`bar`
-06_04__inlines__code_spans__012: |
- ``foo`bar``
-06_04__inlines__code_spans__013: |
- ` foo `` bar `
-06_04__inlines__code_spans__014: |
- *foo`*`
-06_04__inlines__code_spans__015: |
- [not a `link](/foo`)
-06_04__inlines__code_spans__016: |
- `<a href="`">`
-06_04__inlines__code_spans__017: |
- <a href="`">`
-06_04__inlines__code_spans__018: |
- `<http://foo.bar.`baz>`
-06_04__inlines__code_spans__019: |
- <http://foo.bar.`baz>`
-06_04__inlines__code_spans__020: |
- ```foo``
-06_04__inlines__code_spans__021: |
- `foo
-06_04__inlines__code_spans__022: |
- `foo``bar``
-06_05__inlines__emphasis_and_strong_emphasis__001: |
- *foo bar*
-06_05__inlines__emphasis_and_strong_emphasis__002: |
- a * foo bar*
-06_05__inlines__emphasis_and_strong_emphasis__003: |
- a*"foo"*
-06_05__inlines__emphasis_and_strong_emphasis__004: |
- * a *
-06_05__inlines__emphasis_and_strong_emphasis__005: |
- foo*bar*
-06_05__inlines__emphasis_and_strong_emphasis__006: |
- 5*6*78
-06_05__inlines__emphasis_and_strong_emphasis__007: |
- _foo bar_
-06_05__inlines__emphasis_and_strong_emphasis__008: |
- _ foo bar_
-06_05__inlines__emphasis_and_strong_emphasis__009: |
- a_"foo"_
-06_05__inlines__emphasis_and_strong_emphasis__010: |
- foo_bar_
-06_05__inlines__emphasis_and_strong_emphasis__011: |
- 5_6_78
-06_05__inlines__emphasis_and_strong_emphasis__012: |
- приÑтанÑм_ÑтремÑÑ‚ÑÑ_
-06_05__inlines__emphasis_and_strong_emphasis__013: |
- aa_"bb"_cc
-06_05__inlines__emphasis_and_strong_emphasis__014: |
- foo-_(bar)_
-06_05__inlines__emphasis_and_strong_emphasis__015: |
- _foo*
-06_05__inlines__emphasis_and_strong_emphasis__016: |
- *foo bar *
-06_05__inlines__emphasis_and_strong_emphasis__017: |
- *foo bar
- *
-06_05__inlines__emphasis_and_strong_emphasis__018: |
- *(*foo)
-06_05__inlines__emphasis_and_strong_emphasis__019: |
- *(*foo*)*
-06_05__inlines__emphasis_and_strong_emphasis__020: |
- *foo*bar
-06_05__inlines__emphasis_and_strong_emphasis__021: |
- _foo bar _
-06_05__inlines__emphasis_and_strong_emphasis__022: |
- _(_foo)
-06_05__inlines__emphasis_and_strong_emphasis__023: |
- _(_foo_)_
-06_05__inlines__emphasis_and_strong_emphasis__024: |
- _foo_bar
-06_05__inlines__emphasis_and_strong_emphasis__025: |
- _приÑтанÑм_ÑтремÑÑ‚ÑÑ
-06_05__inlines__emphasis_and_strong_emphasis__026: |
- _foo_bar_baz_
-06_05__inlines__emphasis_and_strong_emphasis__027: |
- _(bar)_.
-06_05__inlines__emphasis_and_strong_emphasis__028: |
- **foo bar**
-06_05__inlines__emphasis_and_strong_emphasis__029: |
- ** foo bar**
-06_05__inlines__emphasis_and_strong_emphasis__030: |
- a**"foo"**
-06_05__inlines__emphasis_and_strong_emphasis__031: |
- foo**bar**
-06_05__inlines__emphasis_and_strong_emphasis__032: |
- __foo bar__
-06_05__inlines__emphasis_and_strong_emphasis__033: |
- __ foo bar__
-06_05__inlines__emphasis_and_strong_emphasis__034: |
- __
- foo bar__
-06_05__inlines__emphasis_and_strong_emphasis__035: |
- a__"foo"__
-06_05__inlines__emphasis_and_strong_emphasis__036: |
- foo__bar__
-06_05__inlines__emphasis_and_strong_emphasis__037: |
- 5__6__78
-06_05__inlines__emphasis_and_strong_emphasis__038: |
- приÑтанÑм__ÑтремÑÑ‚ÑÑ__
-06_05__inlines__emphasis_and_strong_emphasis__039: |
- __foo, __bar__, baz__
-06_05__inlines__emphasis_and_strong_emphasis__040: |
- foo-__(bar)__
-06_05__inlines__emphasis_and_strong_emphasis__041: |
- **foo bar **
-06_05__inlines__emphasis_and_strong_emphasis__042: |
- **(**foo)
-06_05__inlines__emphasis_and_strong_emphasis__043: |
- *(**foo**)*
-06_05__inlines__emphasis_and_strong_emphasis__044: |
- **Gomphocarpus (*Gomphocarpus physocarpus*, syn.
- *Asclepias physocarpa*)**
-06_05__inlines__emphasis_and_strong_emphasis__045: |
- **foo "*bar*" foo**
-06_05__inlines__emphasis_and_strong_emphasis__046: |
- **foo**bar
-06_05__inlines__emphasis_and_strong_emphasis__047: |
- __foo bar __
-06_05__inlines__emphasis_and_strong_emphasis__048: |
- __(__foo)
-06_05__inlines__emphasis_and_strong_emphasis__049: |
- _(__foo__)_
-06_05__inlines__emphasis_and_strong_emphasis__050: |
- __foo__bar
-06_05__inlines__emphasis_and_strong_emphasis__051: |
- __приÑтанÑм__ÑтремÑÑ‚ÑÑ
-06_05__inlines__emphasis_and_strong_emphasis__052: |
- __foo__bar__baz__
-06_05__inlines__emphasis_and_strong_emphasis__053: |
- __(bar)__.
-06_05__inlines__emphasis_and_strong_emphasis__054: |
- *foo [bar](/url)*
-06_05__inlines__emphasis_and_strong_emphasis__055: |
- *foo
- bar*
-06_05__inlines__emphasis_and_strong_emphasis__056: |
- _foo __bar__ baz_
-06_05__inlines__emphasis_and_strong_emphasis__057: |
- _foo _bar_ baz_
-06_05__inlines__emphasis_and_strong_emphasis__058: |
- __foo_ bar_
-06_05__inlines__emphasis_and_strong_emphasis__059: |
- *foo *bar**
-06_05__inlines__emphasis_and_strong_emphasis__060: |
- *foo **bar** baz*
-06_05__inlines__emphasis_and_strong_emphasis__061: |
- *foo**bar**baz*
-06_05__inlines__emphasis_and_strong_emphasis__062: |
- *foo**bar*
-06_05__inlines__emphasis_and_strong_emphasis__063: |
- ***foo** bar*
-06_05__inlines__emphasis_and_strong_emphasis__064: |
- *foo **bar***
-06_05__inlines__emphasis_and_strong_emphasis__065: |
- *foo**bar***
-06_05__inlines__emphasis_and_strong_emphasis__066: |
- foo***bar***baz
-06_05__inlines__emphasis_and_strong_emphasis__067: |
- foo******bar*********baz
-06_05__inlines__emphasis_and_strong_emphasis__068: |
- *foo **bar *baz* bim** bop*
-06_05__inlines__emphasis_and_strong_emphasis__069: |
- *foo [*bar*](/url)*
-06_05__inlines__emphasis_and_strong_emphasis__070: |
- ** is not an empty emphasis
-06_05__inlines__emphasis_and_strong_emphasis__071: |
- **** is not an empty strong emphasis
-06_05__inlines__emphasis_and_strong_emphasis__072: |
- **foo [bar](/url)**
-06_05__inlines__emphasis_and_strong_emphasis__073: |
- **foo
- bar**
-06_05__inlines__emphasis_and_strong_emphasis__074: |
- __foo _bar_ baz__
-06_05__inlines__emphasis_and_strong_emphasis__075: |
- __foo __bar__ baz__
-06_05__inlines__emphasis_and_strong_emphasis__076: |
- ____foo__ bar__
-06_05__inlines__emphasis_and_strong_emphasis__077: |
- **foo **bar****
-06_05__inlines__emphasis_and_strong_emphasis__078: |
- **foo *bar* baz**
-06_05__inlines__emphasis_and_strong_emphasis__079: |
- **foo*bar*baz**
-06_05__inlines__emphasis_and_strong_emphasis__080: |
- ***foo* bar**
-06_05__inlines__emphasis_and_strong_emphasis__081: |
- **foo *bar***
-06_05__inlines__emphasis_and_strong_emphasis__082: |
- **foo *bar **baz**
- bim* bop**
-06_05__inlines__emphasis_and_strong_emphasis__083: |
- **foo [*bar*](/url)**
-06_05__inlines__emphasis_and_strong_emphasis__084: |
- __ is not an empty emphasis
-06_05__inlines__emphasis_and_strong_emphasis__085: |
- ____ is not an empty strong emphasis
-06_05__inlines__emphasis_and_strong_emphasis__086: |
- foo ***
-06_05__inlines__emphasis_and_strong_emphasis__087: |
- foo *\**
-06_05__inlines__emphasis_and_strong_emphasis__088: |
- foo *_*
-06_05__inlines__emphasis_and_strong_emphasis__089: |
- foo *****
-06_05__inlines__emphasis_and_strong_emphasis__090: |
- foo **\***
-06_05__inlines__emphasis_and_strong_emphasis__091: |
- foo **_**
-06_05__inlines__emphasis_and_strong_emphasis__092: |
- **foo*
-06_05__inlines__emphasis_and_strong_emphasis__093: |
- *foo**
-06_05__inlines__emphasis_and_strong_emphasis__094: |
- ***foo**
-06_05__inlines__emphasis_and_strong_emphasis__095: |
- ****foo*
-06_05__inlines__emphasis_and_strong_emphasis__096: |
- **foo***
-06_05__inlines__emphasis_and_strong_emphasis__097: |
- *foo****
-06_05__inlines__emphasis_and_strong_emphasis__098: |
- foo ___
-06_05__inlines__emphasis_and_strong_emphasis__099: |
- foo _\__
-06_05__inlines__emphasis_and_strong_emphasis__100: |
- foo _*_
-06_05__inlines__emphasis_and_strong_emphasis__101: |
- foo _____
-06_05__inlines__emphasis_and_strong_emphasis__102: |
- foo __\___
-06_05__inlines__emphasis_and_strong_emphasis__103: |
- foo __*__
-06_05__inlines__emphasis_and_strong_emphasis__104: |
- __foo_
-06_05__inlines__emphasis_and_strong_emphasis__105: |
- _foo__
-06_05__inlines__emphasis_and_strong_emphasis__106: |
- ___foo__
-06_05__inlines__emphasis_and_strong_emphasis__107: |
- ____foo_
-06_05__inlines__emphasis_and_strong_emphasis__108: |
- __foo___
-06_05__inlines__emphasis_and_strong_emphasis__109: |
- _foo____
-06_05__inlines__emphasis_and_strong_emphasis__110: |
- **foo**
-06_05__inlines__emphasis_and_strong_emphasis__111: |
- *_foo_*
-06_05__inlines__emphasis_and_strong_emphasis__112: |
- __foo__
-06_05__inlines__emphasis_and_strong_emphasis__113: |
- _*foo*_
-06_05__inlines__emphasis_and_strong_emphasis__114: |
- ****foo****
-06_05__inlines__emphasis_and_strong_emphasis__115: |
- ____foo____
-06_05__inlines__emphasis_and_strong_emphasis__116: |
- ******foo******
-06_05__inlines__emphasis_and_strong_emphasis__117: |
- ***foo***
-06_05__inlines__emphasis_and_strong_emphasis__118: |
- _____foo_____
-06_05__inlines__emphasis_and_strong_emphasis__119: |
- *foo _bar* baz_
-06_05__inlines__emphasis_and_strong_emphasis__120: |
- *foo __bar *baz bim__ bam*
-06_05__inlines__emphasis_and_strong_emphasis__121: |
- **foo **bar baz**
-06_05__inlines__emphasis_and_strong_emphasis__122: |
- *foo *bar baz*
-06_05__inlines__emphasis_and_strong_emphasis__123: |
- *[bar*](/url)
-06_05__inlines__emphasis_and_strong_emphasis__124: |
- _foo [bar_](/url)
-06_05__inlines__emphasis_and_strong_emphasis__125: |
- *<img src="foo" title="*"/>
-06_05__inlines__emphasis_and_strong_emphasis__126: |
- **<a href="**">
-06_05__inlines__emphasis_and_strong_emphasis__127: |
- __<a href="__">
-06_05__inlines__emphasis_and_strong_emphasis__128: |
- *a `*`*
-06_05__inlines__emphasis_and_strong_emphasis__129: |
- _a `_`_
-06_05__inlines__emphasis_and_strong_emphasis__130: |
- **a<http://foo.bar/?q=**>
-06_05__inlines__emphasis_and_strong_emphasis__131: |
- __a<http://foo.bar/?q=__>
-06_06__inlines__strikethrough_extension__001: |
- ~~Hi~~ Hello, world!
-06_06__inlines__strikethrough_extension__002: |
- This ~~has a
-
- new paragraph~~.
-06_07__inlines__links__001: |
- [link](/uri "title")
-06_07__inlines__links__002: |
- [link](/uri)
-06_07__inlines__links__003: |
- [link]()
-06_07__inlines__links__004: |
- [link](<>)
-06_07__inlines__links__005: |
- [link](/my uri)
-06_07__inlines__links__006: |
- [link](</my uri>)
-06_07__inlines__links__007: |
- [link](foo
- bar)
-06_07__inlines__links__008: |
- [link](<foo
- bar>)
-06_07__inlines__links__009: |
- [a](<b)c>)
-06_07__inlines__links__010: |
- [link](<foo\>)
-06_07__inlines__links__011: |
- [a](<b)c
- [a](<b)c>
- [a](<b>c)
-06_07__inlines__links__012: |
- [link](\(foo\))
-06_07__inlines__links__013: |
- [link](foo(and(bar)))
-06_07__inlines__links__014: |
- [link](foo\(and\(bar\))
-06_07__inlines__links__015: |
- [link](<foo(and(bar)>)
-06_07__inlines__links__016: |
- [link](foo\)\:)
-06_07__inlines__links__017: |
- [link](#fragment)
-
- [link](http://example.com#fragment)
-
- [link](http://example.com?foo=3#frag)
-06_07__inlines__links__018: |
- [link](foo\bar)
-06_07__inlines__links__019: |
- [link](foo%20b&auml;)
-06_07__inlines__links__020: |
- [link]("title")
-06_07__inlines__links__021: |
- [link](/url "title")
- [link](/url 'title')
- [link](/url (title))
-06_07__inlines__links__022: |
- [link](/url "title \"&quot;")
-06_07__inlines__links__023: |
- [link](/url "title")
-06_07__inlines__links__024: |
- [link](/url "title "and" title")
-06_07__inlines__links__025: |
- [link](/url 'title "and" title')
-06_07__inlines__links__026: |
- [link]( /uri
- "title" )
-06_07__inlines__links__027: |
- [link] (/uri)
-06_07__inlines__links__028: |
- [link [foo [bar]]](/uri)
-06_07__inlines__links__029: |
- [link] bar](/uri)
-06_07__inlines__links__030: |
- [link [bar](/uri)
-06_07__inlines__links__031: |
- [link \[bar](/uri)
-06_07__inlines__links__032: |
- [link *foo **bar** `#`*](/uri)
-06_07__inlines__links__033: |
- [![moon](moon.jpg)](/uri)
-06_07__inlines__links__034: |
- [foo [bar](/uri)](/uri)
-06_07__inlines__links__035: |
- [foo *[bar [baz](/uri)](/uri)*](/uri)
-06_07__inlines__links__036: |
- ![[[foo](uri1)](uri2)](uri3)
-06_07__inlines__links__037: |
- *[foo*](/uri)
-06_07__inlines__links__038: |
- [foo *bar](baz*)
-06_07__inlines__links__039: |
- *foo [bar* baz]
-06_07__inlines__links__040: |
- [foo <bar attr="](baz)">
-06_07__inlines__links__041: |
- [foo`](/uri)`
-06_07__inlines__links__042: |
- [foo<http://example.com/?search=](uri)>
-06_07__inlines__links__043: |
- [foo][bar]
-
- [bar]: /url "title"
-06_07__inlines__links__044: |
- [link [foo [bar]]][ref]
-
- [ref]: /uri
-06_07__inlines__links__045: |
- [link \[bar][ref]
-
- [ref]: /uri
-06_07__inlines__links__046: |
- [link *foo **bar** `#`*][ref]
-
- [ref]: /uri
-06_07__inlines__links__047: |
- [![moon](moon.jpg)][ref]
-
- [ref]: /uri
-06_07__inlines__links__048: |
- [foo [bar](/uri)][ref]
-
- [ref]: /uri
-06_07__inlines__links__049: |
- [foo *bar [baz][ref]*][ref]
-
- [ref]: /uri
-06_07__inlines__links__050: |
- *[foo*][ref]
-
- [ref]: /uri
-06_07__inlines__links__051: |
- [foo *bar][ref]
-
- [ref]: /uri
-06_07__inlines__links__052: |
- [foo <bar attr="][ref]">
-
- [ref]: /uri
-06_07__inlines__links__053: |
- [foo`][ref]`
-
- [ref]: /uri
-06_07__inlines__links__054: |
- [foo<http://example.com/?search=][ref]>
-
- [ref]: /uri
-06_07__inlines__links__055: |
- [foo][BaR]
-
- [bar]: /url "title"
-06_07__inlines__links__056: |
- [Толпой][Толпой] is a Russian word.
-
- [ТОЛПОЙ]: /url
-06_07__inlines__links__057: |
- [Foo
- bar]: /url
-
- [Baz][Foo bar]
-06_07__inlines__links__058: |
- [foo] [bar]
-
- [bar]: /url "title"
-06_07__inlines__links__059: |
- [foo]
- [bar]
-
- [bar]: /url "title"
-06_07__inlines__links__060: |
- [foo]: /url1
-
- [foo]: /url2
-
- [bar][foo]
-06_07__inlines__links__061: |
- [bar][foo\!]
-
- [foo!]: /url
-06_07__inlines__links__062: |
- [foo][ref[]
-
- [ref[]: /uri
-06_07__inlines__links__063: |
- [foo][ref[bar]]
-
- [ref[bar]]: /uri
-06_07__inlines__links__064: |
- [[[foo]]]
-
- [[[foo]]]: /url
-06_07__inlines__links__065: |
- [foo][ref\[]
-
- [ref\[]: /uri
-06_07__inlines__links__066: |
- [bar\\]: /uri
-
- [bar\\]
-06_07__inlines__links__067: |
- []
-
- []: /uri
-06_07__inlines__links__068: |
- [
- ]
-
- [
- ]: /uri
-06_07__inlines__links__069: |
- [foo][]
-
- [foo]: /url "title"
-06_07__inlines__links__070: |
- [*foo* bar][]
-
- [*foo* bar]: /url "title"
-06_07__inlines__links__071: |
- [Foo][]
-
- [foo]: /url "title"
-06_07__inlines__links__072: "[foo] \n[]\n\n[foo]: /url \"title\"\n"
-06_07__inlines__links__073: |
- [foo]
-
- [foo]: /url "title"
-06_07__inlines__links__074: |
- [*foo* bar]
-
- [*foo* bar]: /url "title"
-06_07__inlines__links__075: |
- [[*foo* bar]]
-
- [*foo* bar]: /url "title"
-06_07__inlines__links__076: |
- [[bar [foo]
-
- [foo]: /url
-06_07__inlines__links__077: |
- [Foo]
-
- [foo]: /url "title"
-06_07__inlines__links__078: |
- [foo] bar
-
- [foo]: /url
-06_07__inlines__links__079: |
- \[foo]
-
- [foo]: /url "title"
-06_07__inlines__links__080: |
- [foo*]: /url
-
- *[foo*]
-06_07__inlines__links__081: |
- [foo][bar]
-
- [foo]: /url1
- [bar]: /url2
-06_07__inlines__links__082: |
- [foo][]
-
- [foo]: /url1
-06_07__inlines__links__083: |
- [foo]()
-
- [foo]: /url1
-06_07__inlines__links__084: |
- [foo](not a link)
-
- [foo]: /url1
-06_07__inlines__links__085: |
- [foo][bar][baz]
-
- [baz]: /url
-06_07__inlines__links__086: |
- [foo][bar][baz]
-
- [baz]: /url1
- [bar]: /url2
-06_07__inlines__links__087: |
- [foo][bar][baz]
-
- [baz]: /url1
- [foo]: /url2
-06_08__inlines__images__001: |
- ![foo](/url "title")
-06_08__inlines__images__002: |
- ![foo *bar*]
-
- [foo *bar*]: train.jpg "train & tracks"
-06_08__inlines__images__003: |
- ![foo ![bar](/url)](/url2)
-06_08__inlines__images__004: |
- ![foo [bar](/url)](/url2)
-06_08__inlines__images__005: |
- ![foo *bar*][]
-
- [foo *bar*]: train.jpg "train & tracks"
-06_08__inlines__images__006: |
- ![foo *bar*][foobar]
-
- [FOOBAR]: train.jpg "train & tracks"
-06_08__inlines__images__007: |
- ![foo](train.jpg)
-06_08__inlines__images__008: |
- My ![foo bar](/path/to/train.jpg "title" )
-06_08__inlines__images__009: |
- ![foo](<url>)
-06_08__inlines__images__010: |
- ![](/url)
-06_08__inlines__images__011: |
- ![foo][bar]
-
- [bar]: /url
-06_08__inlines__images__012: |
- ![foo][bar]
-
- [BAR]: /url
-06_08__inlines__images__013: |
- ![foo][]
-
- [foo]: /url "title"
-06_08__inlines__images__014: |
- ![*foo* bar][]
-
- [*foo* bar]: /url "title"
-06_08__inlines__images__015: |
- ![Foo][]
-
- [foo]: /url "title"
-06_08__inlines__images__016: "![foo] \n[]\n\n[foo]: /url \"title\"\n"
-06_08__inlines__images__017: |
- ![foo]
-
- [foo]: /url "title"
-06_08__inlines__images__018: |
- ![*foo* bar]
-
- [*foo* bar]: /url "title"
-06_08__inlines__images__019: |
- ![[foo]]
-
- [[foo]]: /url "title"
-06_08__inlines__images__020: |
- ![Foo]
-
- [foo]: /url "title"
-06_08__inlines__images__021: |
- !\[foo]
-
- [foo]: /url "title"
-06_08__inlines__images__022: |
- \![foo]
-
- [foo]: /url "title"
-06_09__inlines__autolinks__001: |
- <http://foo.bar.baz>
-06_09__inlines__autolinks__002: |
- <http://foo.bar.baz/test?q=hello&id=22&boolean>
-06_09__inlines__autolinks__003: |
- <irc://foo.bar:2233/baz>
-06_09__inlines__autolinks__004: |
- <MAILTO:FOO@BAR.BAZ>
-06_09__inlines__autolinks__005: |
- <a+b+c:d>
-06_09__inlines__autolinks__006: |
- <made-up-scheme://foo,bar>
-06_09__inlines__autolinks__007: |
- <http://../>
-06_09__inlines__autolinks__008: |
- <localhost:5001/foo>
-06_09__inlines__autolinks__009: |
- <http://foo.bar/baz bim>
-06_09__inlines__autolinks__010: |
- <http://example.com/\[\>
-06_09__inlines__autolinks__011: |
- <foo@bar.example.com>
-06_09__inlines__autolinks__012: |
- <foo+special@Bar.baz-bar0.com>
-06_09__inlines__autolinks__013: |
- <foo\+@bar.example.com>
-06_09__inlines__autolinks__014: |
- <>
-06_09__inlines__autolinks__015: |
- < http://foo.bar >
-06_09__inlines__autolinks__016: |
- <m:abc>
-06_09__inlines__autolinks__017: |
- <foo.bar.baz>
-06_09__inlines__autolinks__018: |
- http://example.com
-06_09__inlines__autolinks__019: |
- foo@bar.example.com
-06_10__inlines__autolinks_extension__001: |
- www.commonmark.org
-06_10__inlines__autolinks_extension__002: |
- Visit www.commonmark.org/help for more information.
-06_10__inlines__autolinks_extension__003: |
- Visit www.commonmark.org.
-
- Visit www.commonmark.org/a.b.
-06_10__inlines__autolinks_extension__004: |
- www.google.com/search?q=Markup+(business)
-
- www.google.com/search?q=Markup+(business)))
-
- (www.google.com/search?q=Markup+(business))
-
- (www.google.com/search?q=Markup+(business)
-06_10__inlines__autolinks_extension__005: |
- www.google.com/search?q=(business))+ok
-06_10__inlines__autolinks_extension__006: |
- www.google.com/search?q=commonmark&hl=en
-
- www.google.com/search?q=commonmark&hl;
-06_10__inlines__autolinks_extension__007: |
- www.commonmark.org/he<lp
-06_10__inlines__autolinks_extension__008: |
- http://commonmark.org
-
- (Visit https://encrypted.google.com/search?q=Markup+(business))
-
- Anonymous FTP is available at ftp://foo.bar.baz.
-06_10__inlines__autolinks_extension__009: |
- foo@bar.baz
-06_10__inlines__autolinks_extension__010: |
- hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.
-06_10__inlines__autolinks_extension__011: |
- a.b-c_d@a.b
-
- a.b-c_d@a.b.
-
- a.b-c_d@a.b-
-
- a.b-c_d@a.b_
-06_11__inlines__raw_html__001: |
- <a><bab><c2c>
-06_11__inlines__raw_html__002: |
- <a/><b2/>
-06_11__inlines__raw_html__003: |
- <a /><b2
- data="foo" >
-06_11__inlines__raw_html__004: |
- <a foo="bar" bam = 'baz <em>"</em>'
- _boolean zoop:33=zoop:33 />
-06_11__inlines__raw_html__005: |
- Foo <responsive-image src="foo.jpg" />
-06_11__inlines__raw_html__006: |
- <33> <__>
-06_11__inlines__raw_html__007: |
- <a h*#ref="hi">
-06_11__inlines__raw_html__008: |
- <a href="hi'> <a href=hi'>
-06_11__inlines__raw_html__009: |
- < a><
- foo><bar/ >
- <foo bar=baz
- bim!bop />
-06_11__inlines__raw_html__010: |
- <a href='bar'title=title>
-06_11__inlines__raw_html__011: |
- </a></foo >
-06_11__inlines__raw_html__012: |
- </a href="foo">
-06_11__inlines__raw_html__013: |
- foo <!-- this is a
- comment - with hyphen -->
-06_11__inlines__raw_html__014: |
- foo <!-- not a comment -- two hyphens -->
-06_11__inlines__raw_html__015: |
- foo <!--> foo -->
-
- foo <!-- foo--->
-06_11__inlines__raw_html__016: |
- foo <?php echo $a; ?>
-06_11__inlines__raw_html__017: |
- foo <!ELEMENT br EMPTY>
-06_11__inlines__raw_html__018: |
- foo <![CDATA[>&<]]>
-06_11__inlines__raw_html__019: |
- foo <a href="&ouml;">
-06_11__inlines__raw_html__020: |
- foo <a href="\*">
-06_11__inlines__raw_html__021: |
- <a href="\"">
-06_12__inlines__disallowed_raw_html_extension__001: |
- <strong> <title> <style> <em>
-
- <blockquote>
- <xmp> is disallowed. <XMP> is also disallowed.
- </blockquote>
-06_13__inlines__hard_line_breaks__001: "foo \nbaz\n"
-06_13__inlines__hard_line_breaks__002: |
- foo\
- baz
-06_13__inlines__hard_line_breaks__003: "foo \nbaz\n"
-06_13__inlines__hard_line_breaks__004: "foo \n bar\n"
-06_13__inlines__hard_line_breaks__005: |
- foo\
- bar
-06_13__inlines__hard_line_breaks__006: "*foo \nbar*\n"
-06_13__inlines__hard_line_breaks__007: |
- *foo\
- bar*
-06_13__inlines__hard_line_breaks__008: "`code \nspan`\n"
-06_13__inlines__hard_line_breaks__009: |
- `code\
- span`
-06_13__inlines__hard_line_breaks__010: "<a href=\"foo \nbar\">\n"
-06_13__inlines__hard_line_breaks__011: |
- <a href="foo\
- bar">
-06_13__inlines__hard_line_breaks__012: |
- foo\
-06_13__inlines__hard_line_breaks__013: "foo \n"
-06_13__inlines__hard_line_breaks__014: |
- ### foo\
-06_13__inlines__hard_line_breaks__015: "### foo \n"
-06_14__inlines__soft_line_breaks__001: |
- foo
- baz
-06_14__inlines__soft_line_breaks__002: "foo \n baz\n"
-06_15__inlines__textual_content__001: |
- hello $.;'there
-06_15__inlines__textual_content__002: |
- Foo χÏῆν
-06_15__inlines__textual_content__003: |
- Multiple spaces
-07_01__gitlab_specific_markdown__footnotes__001: |
- footnote reference tag [^1]
-
- [^1]: footnote text
diff --git a/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml b/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml
deleted file mode 100644
index 04196c26af0..00000000000
--- a/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml
+++ /dev/null
@@ -1,17018 +0,0 @@
----
-02_01__preliminaries__tabs__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo\tbaz\t\tbim"
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo\tbaz\t\tbim"
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "a\ta\ná½\ta"
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": " foo"
- }
- ]
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": " foo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo\nbar"
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- }
-02_01__preliminaries__tabs__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- }
- ]
- }
-03_01__blocks_and_inlines__precedence__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "`one"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "two`"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "+++"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "==="
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "--\n**\n__"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "***"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\n***"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_ _ _ _ a"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a------"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "---a---"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "-"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-04_01__leaf_blocks__thematic_breaks__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 4
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 5
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 6
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "####### foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "#5 bolt"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "#hashtag"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "## foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": " *baz*"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "# foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\n# bar"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 5
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "foo ### b"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "foo#"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "foo ###"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "foo ###"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "foo #"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo bar"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Bar foo"
- }
- ]
- }
- ]
- }
-04_02__leaf_blocks__atx_headings__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- }
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- }
- },
- {
- "type": "heading",
- "attrs": {
- "level": 3
- }
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar\nbaz"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar\nbaz"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "Foo\n---\n\nFoo"
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\n---"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\n= ="
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo\\"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "`Foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "`"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "<a title=\"a lot"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "of dashes\"/>"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\nbar\n==="
- }
- ]
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo\nBar"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Bar"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Baz"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "===="
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "horizontalRule"
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__023: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "> foo"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__024: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__025: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\nbar"
- }
- ]
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__026: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\nbar"
- }
- ]
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-04_03__leaf_blocks__setext_headings__027: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\nbar\n---\nbaz"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "a simple\n indented code block"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "<a/>\n*hi*\n\n- one"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "chunk1\n\nchunk2\n\n\n\nchunk3"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "chunk1\n \n chunk2"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\nbar"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Heading"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Heading"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": " foo\nbar"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_04__leaf_blocks__indented_code_blocks__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo "
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "<\n >"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "<\n >"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\n~~~"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\n```"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\n```"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\n~~~"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- }
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "\n```\naaa"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bbb"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "\n "
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- }
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\naaa"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\naaa\naaa"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\n aaa\naaa"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "```\naaa\n```"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\n ```"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "\naaa"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa\n~~~ ~~"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__023: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__024: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": "ruby",
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "def foo(x)\n return 3\nend"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__025: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": "ruby",
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "def foo(x)\n return 3\nend"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__026: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": ";",
- "class": "code highlight"
- }
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__027: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "aa"
- },
- {
- "type": "text",
- "text": "\nfoo"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__028: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": "aa",
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_05__leaf_blocks__fenced_code_blocks__029: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "``` aaa"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__001: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__002: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__003: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "\n*foo*"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__005: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__006: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__007: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__008: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__012: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__013: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__014: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "foo",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "\n*bar*\n"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__016: |-
- Error - check implementation:
- Hast node of type "warning" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "\n*bar*\n"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "\n*bar*"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "strike"
- }
- ],
- "text": "\n*foo*\n"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__020: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-04_06__leaf_blocks__html_blocks__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- },
- {
- "type": "strike"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "\nimport Text.HTML.TagSoup\n\nmain :: IO ()\nmain = print $ parseTags tags"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "okay"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__023: |-
- Error - check implementation:
- Hast node of type "script" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__024: |-
- Error - check implementation:
- Hast node of type "style" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__025: |-
- Error - check implementation:
- Hast node of type "style" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__026: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__027: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__028: |-
- Error - check implementation:
- Hast node of type "style" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__029: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__030: |-
- Error - check implementation:
- Hast node of type "script" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__031: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__032: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__033: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__034: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__035: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-04_06__leaf_blocks__html_blocks__036: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__037: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__038: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__039: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\n"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "bar",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "\nbaz"
- }
- ]
- }
- ]
- }
-04_06__leaf_blocks__html_blocks__040: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__041: |-
- Error - check implementation:
- Hast node of type "div" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__042: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_06__leaf_blocks__html_blocks__043: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_07__leaf_blocks__link_reference_definitions__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "the title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "my_(url)",
- "target": "_blank",
- "class": null,
- "title": "title (with parens)",
- "canonicalSrc": null
- }
- }
- ],
- "text": "Foo*bar]"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "my%20url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "Foo bar"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "\ntitle\nline1\nline2\n",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]: /url 'title"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "with blank line'"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]:"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__010: |-
- Error - check implementation:
- Hast node of type "bar" not supported by this converter. Please, provide an specification.
-04_07__leaf_blocks__link_reference_definitions__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url%5Cbar*baz",
- "target": "_blank",
- "class": null,
- "title": "foo\"bar\\baz",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "first",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "Foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/%CF%86%CE%BF%CF%85",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "αγω"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]: /url \"title\" ok"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "\"title\" ok"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "[foo]: /url \"title\""
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "[foo]: /url"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo\n[bar]: /baz"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[bar]"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__023: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "Foo"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__024: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__025: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "===\n"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__026: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/foo-url",
- "target": "_blank",
- "class": null,
- "title": "foo",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": ",\n"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/bar-url",
- "target": "_blank",
- "class": null,
- "title": "bar",
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": ",\n"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/baz-url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "baz"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__027: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
- ]
- }
-04_07__leaf_blocks__link_reference_definitions__028: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bbb"
- }
- ]
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa\nbbb"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "ccc\nddd"
- }
- ]
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bbb"
- }
- ]
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa\nbbb"
- }
- ]
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa\nbbb\nccc"
- }
- ]
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa\nbbb"
- }
- ]
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bbb"
- }
- ]
- }
- ]
- }
-04_08__leaf_blocks__paragraphs__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa"
- },
- {
- "type": "hardBreak"
- },
- {
- "type": "text",
- "text": "\nbbb"
- }
- ]
- }
- ]
- }
-04_09__leaf_blocks__blank_lines__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- }
- ]
- }
-04_10__leaf_blocks__tables_extension__001: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__002: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__003: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__004: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__005: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "| abc | def |\n| --- |\n| bar |"
- }
- ]
- }
- ]
- }
-04_10__leaf_blocks__tables_extension__007: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-04_10__leaf_blocks__tables_extension__008: |-
- Error - check implementation:
- Hast node of type "table" not supported by this converter. Please, provide an specification.
-05_01__container_blocks__block_quotes__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "> # Foo\n> bar\n> baz"
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar\nbaz\nfoo"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- }
- ]
- }
-05_01__container_blocks__block_quotes__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- }
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- }
- }
- ]
- }
-05_01__container_blocks__block_quotes__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\n- bar"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\nbar"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aaa"
- }
- ]
- }
- ]
- },
- {
- "type": "horizontalRule"
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bbb"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__023: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\nbar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__024: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\nbar\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_01__container_blocks__block_quotes__025: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "code"
- }
- ]
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "not code"
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A paragraph\nwith two lines."
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A block quote."
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A paragraph\nwith two lines."
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A block quote."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "one"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "two"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "one"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "two"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "one"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": " two"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "one"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "two"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "one"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "two"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "one"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "two"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "-one"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "2.two"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bam"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar\n\n\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "ok"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "1234567890. not ok"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "ok"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "ok"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "-1. not ok"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "paragraph"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "more code"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "paragraph"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "more code"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": " indented code"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "paragraph"
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "more code"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__023: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__024: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__025: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__026: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__027: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__028: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__029: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__030: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__031: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__032: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__033: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\n*"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\n1."
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__034: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A paragraph\nwith two lines."
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A block quote."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__035: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A paragraph\nwith two lines."
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A block quote."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__036: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A paragraph\nwith two lines."
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A block quote."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__037: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "1. A paragraph\n with two lines.\n\n indented code\n\n > A block quote."
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__038: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A paragraph\nwith two lines."
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "indented code"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A block quote."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__039: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "A paragraph\nwith two lines."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__040: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Blockquote\ncontinued here."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__041: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Blockquote\ncontinued here."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__042: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "boo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__043: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "boo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__044: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__045: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__046: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__047: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__048: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "heading",
- "attrs": {
- "level": 1
- },
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "heading",
- "attrs": {
- "level": 2
- },
- "content": [
- {
- "type": "text",
- "text": "Bar\nbaz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__049: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__050: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__051: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__052: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "The number of windows in my house is\n14. The number of doors is 6."
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__053: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "The number of windows in my house is"
- }
- ]
- },
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "The number of doors is 6."
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__054: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__055: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bim"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__056: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__057: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__058: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "d"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "e"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "f"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "g"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__059: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__060: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "d\n- e"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__061: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "3. c"
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__062: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__063: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__064: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "d"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__065: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "d"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__066: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "b\n\n"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__067: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "d"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__068: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__069: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- },
- {
- "type": "blockquote",
- "attrs": {
- "multiline": false
- },
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "d"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__070: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__071: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__072: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "orderedList",
- "attrs": {
- "start": 1,
- "parens": false
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph"
- },
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__073: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__074: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "b"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "c"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "d"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "e"
- }
- ]
- }
- ]
- },
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "f"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-06_01__inlines__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "hi"
- },
- {
- "type": "text",
- "text": "lo`"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "\\\t\\A\\a\\ \\3\\φ\\«"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*not emphasized*\n<br/> not a tag\n[not a link](/foo)\n`not code`\n1. not a list\n* not a list\n# not a heading\n[foo]: /url \"not a reference\"\n&ouml; not a character entity"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "\\"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "emphasis"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "hardBreak"
- },
- {
- "type": "text",
- "text": "\nbar"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "\\[\\`"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "\\[\\]"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "\\[\\]"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://example.com?find=%5C*",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://example.com?find=\\*"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-06_02__inlines__backslash_escapes__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/bar*",
- "target": "_blank",
- "class": null,
- "title": "ti*tle",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/bar*",
- "target": "_blank",
- "class": null,
- "title": "ti*tle",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_02__inlines__backslash_escapes__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": "foo+bar",
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "  & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "# Ӓ Ϡ �"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "\" ആ ಫ"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "&nbsp &x; &#; &#x;\n&#987654321;\n&#abcdef0;\n&ThisIsNotDefined; &hi?;"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "&copy"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "&MadeUpEntity;"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/f%C3%B6%C3%B6",
- "target": "_blank",
- "class": null,
- "title": "föö",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/f%C3%B6%C3%B6",
- "target": "_blank",
- "class": null,
- "title": "föö",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": "föö",
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "f&ouml;&ouml;"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "codeBlock",
- "attrs": {
- "language": null,
- "class": "code highlight"
- },
- "content": [
- {
- "type": "text",
- "text": "f&ouml;f&ouml;"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*foo*\n"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "* foo"
- }
- ]
- },
- {
- "type": "bulletList",
- "attrs": {
- "bullet": "*"
- },
- "content": [
- {
- "type": "listItem",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\n\nbar"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "\tfoo"
- }
- ]
- }
- ]
- }
-06_03__inlines__entity_and_numeric_character_references__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[a](url \"tit\")"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo ` bar"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "``"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": " `` "
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": " a"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": " b "
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-06_04__inlines__code_spans__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo bar baz"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo "
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo bar baz"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo\\"
- },
- {
- "type": "text",
- "text": "bar`"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo`bar"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "foo `` bar"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "*"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[not a "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "link](/foo"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "<a href=\""
- },
- {
- "type": "text",
- "text": "\">`"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "`",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "`"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "<http://foo.bar."
- },
- {
- "type": "text",
- "text": "baz>`"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://foo.bar.%60baz",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://foo.bar.`baz"
- },
- {
- "type": "text",
- "text": "`"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "```foo``"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "`foo"
- }
- ]
- }
- ]
- }
-06_04__inlines__code_spans__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "`foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a * foo bar*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a*\"foo\"*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "* a *"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "5"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "6"
- },
- {
- "type": "text",
- "text": "78"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_ foo bar_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a_\"foo\"_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo_bar_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "5_6_78"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "приÑтанÑм_ÑтремÑÑ‚ÑÑ_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "aa_\"bb\"_cc"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo-"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "(bar)"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_foo*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*foo bar *"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*foo bar\n*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*(*foo)"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "(foo"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_foo bar _"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_(_foo)"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__023: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "(foo"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__024: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_foo_bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__025: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_приÑтанÑм_ÑтремÑÑ‚ÑÑ"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__026: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo_bar_baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__027: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "(bar)"
- },
- {
- "type": "text",
- "text": "."
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__028: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__029: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "** foo bar**"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__030: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a**\"foo\"**"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__031: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__032: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__033: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__ foo bar__"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__034: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__\nfoo bar__"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__035: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a__\"foo\"__"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__036: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo__bar__"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__037: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "5__6__78"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__038: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "приÑтанÑм__ÑтремÑÑ‚ÑÑ__"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__039: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo, bar"
- },
- {
- "type": "text",
- "text": ", baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__040: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo-"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "(bar)"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__041: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "**foo bar **"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__042: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "**(**foo)"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__043: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "("
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__044: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "Gomphocarpus ("
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "Gomphocarpus physocarpus"
- },
- {
- "type": "text",
- "text": ", syn.\n"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "Asclepias physocarpa"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__045: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo \""
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": "\" foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__046: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__047: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__foo bar __"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__048: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__(__foo)"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__049: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "("
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__050: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__foo__bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__051: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__приÑтанÑм__ÑтремÑÑ‚ÑÑ"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__052: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo__bar__baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__053: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "(bar)"
- },
- {
- "type": "text",
- "text": "."
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__054: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__055: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo\nbar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__056: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": " baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__057: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo bar"
- },
- {
- "type": "text",
- "text": " baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__058: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__059: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__060: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": " baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__061: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__062: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo**bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__063: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- },
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__064: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__065: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__066: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- },
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__067: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": "***baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__068: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "baz"
- },
- {
- "type": "text",
- "text": " bim bop"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__069: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- },
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__070: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "** is not an empty emphasis"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__071: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "**** is not an empty strong emphasis"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__072: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__073: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo\nbar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__074: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": " baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__075: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo bar"
- },
- {
- "type": "text",
- "text": " baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__076: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__077: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__078: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": " baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__079: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": "baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__080: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- },
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__081: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__082: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "baz"
- },
- {
- "type": "text",
- "text": "\nbim bop"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__083: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- },
- {
- "type": "italic"
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__084: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__ is not an empty emphasis"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__085: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "____ is not an empty strong emphasis"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__086: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo ***"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__087: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__088: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__089: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo *****"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__090: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__091: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__092: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__093: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__094: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__095: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "***"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__096: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__097: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "***"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__098: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo ___"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__099: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__100: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__101: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo _____"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__102: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__103: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__104: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__105: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__106: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__107: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "___"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__108: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__109: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "___"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__110: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__111: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__112: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__113: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__114: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__115: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__116: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__117: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- },
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__118: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- },
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__119: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo _bar"
- },
- {
- "type": "text",
- "text": " baz_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__120: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar *baz bim"
- },
- {
- "type": "text",
- "text": " bam"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__121: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "**foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__122: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar baz"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__123: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__124: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "_foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__125: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*"
- },
- {
- "type": "image",
- "attrs": {
- "src": "foo",
- "alt": null,
- "title": "*",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__126: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "**"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__127: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__128: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "a "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "*"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__129: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "a "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "_"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__130: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "**a"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://foo.bar/?q=**",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://foo.bar/?q=**"
- }
- ]
- }
- ]
- }
-06_05__inlines__emphasis_and_strong_emphasis__131: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "__a"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://foo.bar/?q=__",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://foo.bar/?q=__"
- }
- ]
- }
- ]
- }
-06_06__inlines__strikethrough_extension__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "strike"
- }
- ],
- "text": "Hi"
- },
- {
- "type": "text",
- "text": " Hello, world!"
- }
- ]
- }
- ]
- }
-06_06__inlines__strikethrough_extension__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "This ~~has a"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "new paragraph~~."
- }
- ]
- }
- ]
- }
-06_07__inlines__links__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[link](/my uri)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/my%20uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[link](foo\nbar)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__008: |-
- Error - check implementation:
- Hast node of type "foo" not supported by this converter. Please, provide an specification.
-06_07__inlines__links__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "b)c",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "a"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[link](<foo>)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[a](<b)c\n[a](<b)c>\n[a]("
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "c)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "(foo)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "foo(and(bar))",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "foo(and(bar)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "foo(and(bar)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "foo):",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "#fragment",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://example.com#fragment",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://example.com?foo=3#frag",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "foo%5Cbar",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "foo%20b%C3%A4",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "%22title%22",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "linklinklink"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title \"\"",
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__023: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url%C2%A0%22title%22",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__024: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[link](/url \"title \"and\" title\")"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__025: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title \"and\" title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__026: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "link"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__027: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[link] (/uri)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__028: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link [foo [bar]]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__029: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[link] bar](/uri)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__030: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[link "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__031: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link [bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__032: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "#"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__033: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_07__inlines__links__034: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": "](/uri)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__035: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "[bar "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "baz"
- },
- {
- "type": "text",
- "text": "](/uri)](/uri)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__036: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "uri3",
- "alt": "[foo](uri2)",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_07__inlines__links__037: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo*"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__038: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "baz*",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo *bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__039: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo [bar"
- },
- {
- "type": "text",
- "text": " baz]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__040: |-
- Error - check implementation:
- Hast node of type "bar" not supported by this converter. Please, provide an specification.
-06_07__inlines__links__041: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "](/uri)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__042: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://example.com/?search=%5D(uri)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://example.com/?search=](uri)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__043: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__044: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link [foo [bar]]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__045: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link [bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__046: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "link "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "bold"
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "#"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__047: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_07__inlines__links__048: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- },
- {
- "type": "text",
- "text": "]"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "ref"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__049: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "italic"
- }
- ],
- "text": "bar "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "baz"
- },
- {
- "type": "text",
- "text": "]"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "ref"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__050: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo*"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__051: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo *bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__052: |-
- Error - check implementation:
- Hast node of type "bar" not supported by this converter. Please, provide an specification.
-06_07__inlines__links__053: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "][ref]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__054: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://example.com/?search=%5D%5Bref%5D",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://example.com/?search=][ref]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__055: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__056: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "Толпой"
- },
- {
- "type": "text",
- "text": " is a Russian word."
- }
- ]
- }
- ]
- }
-06_07__inlines__links__057: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "Baz"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__058: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo] "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__059: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]\n"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__060: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url1",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__061: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[bar][foo!]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__062: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo][ref[]"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[ref[]: /uri"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__063: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo][ref[bar]]"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[ref[bar]]: /uri"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__064: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[[[foo]]]"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[[[foo]]]: /url"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__065: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__066: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/uri",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar\\"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__067: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[]"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[]: /uri"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__068: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[\n]"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[\n]: /uri"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__069: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__070: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- },
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__071: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "Foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__072: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "\n[]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__073: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__074: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- },
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__075: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "["
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- },
- {
- "type": "italic"
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__076: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[[bar "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__077: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "Foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__078: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": " bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__079: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__080: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "*"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo*"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__081: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url2",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__082: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url1",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__083: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__084: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url1",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "text": "(not a link)"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__085: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__086: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url2",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url1",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "baz"
- }
- ]
- }
- ]
- }
-06_07__inlines__links__087: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[foo]"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url1",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "bar"
- }
- ]
- }
- ]
- }
-06_08__inlines__images__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "train.jpg",
- "alt": "foo bar",
- "title": "train & tracks",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url2",
- "alt": "foo bar",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url2",
- "alt": "foo bar",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "train.jpg",
- "alt": "foo bar",
- "title": "train & tracks",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "train.jpg",
- "alt": "foo bar",
- "title": "train & tracks",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "train.jpg",
- "alt": "foo",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "My "
- },
- {
- "type": "image",
- "attrs": {
- "src": "/path/to/train.jpg",
- "alt": "foo bar",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "url",
- "alt": "foo",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo",
- "title": null,
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo bar",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "Foo",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- },
- {
- "type": "text",
- "text": "\n[]"
- }
- ]
- }
- ]
- }
-06_08__inlines__images__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "foo bar",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "![[foo]]"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "[[foo]]: /url \"title\""
- }
- ]
- }
- ]
- }
-06_08__inlines__images__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "image",
- "attrs": {
- "src": "/url",
- "alt": "Foo",
- "title": "title",
- "uploading": false,
- "canonicalSrc": null
- }
- }
- ]
- }
- ]
- }
-06_08__inlines__images__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "![foo]"
- }
- ]
- }
- ]
- }
-06_08__inlines__images__022: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "!"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "/url",
- "target": "_blank",
- "class": null,
- "title": "title",
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://foo.bar.baz",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://foo.bar.baz"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://foo.bar.baz/test?q=hello&id=22&boolean",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://foo.bar.baz/test?q=hello&id=22&boolean"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "irc://foo.bar:2233/baz",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "irc://foo.bar:2233/baz"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "MAILTO:FOO@BAR.BAZ",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "MAILTO:FOO@BAR.BAZ"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "a+b+c:d",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "a+b+c:d"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "made-up-scheme://foo,bar",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "made-up-scheme://foo,bar"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://../",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://../"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "localhost:5001/foo",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "localhost:5001/foo"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<"
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://foo.bar/baz",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://foo.bar/baz"
- },
- {
- "type": "text",
- "text": " bim>"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://example.com/%5C%5B%5C",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://example.com/\\[\\"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "mailto:foo@bar.example.com",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo@bar.example.com"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "mailto:foo+special@Bar.baz-bar0.com",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo+special@Bar.baz-bar0.com"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__013: |-
- Error - check implementation:
- Cannot read properties of undefined (reading 'end')
-06_09__inlines__autolinks__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<>"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "< "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://foo.bar",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://foo.bar"
- },
- {
- "type": "text",
- "text": " >"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__016: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<m:abc>"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__017: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<foo.bar.baz>"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__018: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://example.com",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://example.com"
- }
- ]
- }
- ]
- }
-06_09__inlines__autolinks__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "mailto:foo@bar.example.com",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo@bar.example.com"
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.commonmark.org",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.commonmark.org"
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Visit "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.commonmark.org/help",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.commonmark.org/help"
- },
- {
- "type": "text",
- "text": " for more information."
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Visit "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.commonmark.org",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.commonmark.org"
- },
- {
- "type": "text",
- "text": "."
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Visit "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.commonmark.org/a.b",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.commonmark.org/a.b"
- },
- {
- "type": "text",
- "text": "."
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.google.com/search?q=Markup+(business)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.google.com/search?q=Markup+(business)"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.google.com/search?q=Markup+(business)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.google.com/search?q=Markup+(business)"
- },
- {
- "type": "text",
- "text": "))"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "("
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.google.com/search?q=Markup+(business)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.google.com/search?q=Markup+(business)"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "("
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.google.com/search?q=Markup+(business)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.google.com/search?q=Markup+(business)"
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.google.com/search?q=(business))+ok",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.google.com/search?q=(business))+ok"
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.google.com/search?q=commonmark&hl=en",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.google.com/search?q=commonmark&hl=en"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.google.com/search?q=commonmark",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.google.com/search?q=commonmark"
- },
- {
- "type": "text",
- "text": "&hl;"
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://www.commonmark.org/he",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "www.commonmark.org/he"
- },
- {
- "type": "text",
- "text": "<lp"
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "http://commonmark.org",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "http://commonmark.org"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "(Visit "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "https://encrypted.google.com/search?q=Markup+(business)",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "https://encrypted.google.com/search?q=Markup+(business)"
- },
- {
- "type": "text",
- "text": ")"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Anonymous FTP is available at ftp://foo.bar.baz."
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "mailto:foo@bar.baz",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "foo@bar.baz"
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "hello@mail+xyz.example isn't valid, but "
- },
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "mailto:hello+xyz@mail.example",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "hello+xyz@mail.example"
- },
- {
- "type": "text",
- "text": " is."
- }
- ]
- }
- ]
- }
-06_10__inlines__autolinks_extension__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "mailto:a.b-c_d@a.b",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "a.b-c_d@a.b"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "link",
- "attrs": {
- "href": "mailto:a.b-c_d@a.b",
- "target": "_blank",
- "class": null,
- "title": null,
- "canonicalSrc": null
- }
- }
- ],
- "text": "a.b-c_d@a.b"
- },
- {
- "type": "text",
- "text": "."
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a.b-c_d@a.b-"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "a.b-c_d@a.b_"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__001: |-
- Error - check implementation:
- Hast node of type "bab" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__002: |-
- Error - check implementation:
- Hast node of type "b2" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__003: |-
- Error - check implementation:
- Hast node of type "b2" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-06_11__inlines__raw_html__005: |-
- Error - check implementation:
- Hast node of type "responsive-image" not supported by this converter. Please, provide an specification.
-06_11__inlines__raw_html__006: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<33> <__>"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__007: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<a h*#ref=\"hi\">"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<a href=\"hi'> <a href=hi'>"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "< a><\nfoo><bar/ >\n<foo bar=baz\nbim!bop />"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<a href='bar'title=title>"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-06_11__inlines__raw_html__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "</a href=\"foo\">"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__013: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo <!-- not a comment -- two hyphens -->"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo <!--> foo -->"
- }
- ]
- },
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo <!-- foo--->"
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__016: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__017: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__018: |-
- Error - check implementation:
- Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
-06_11__inlines__raw_html__019: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__020: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo "
- }
- ]
- }
- ]
- }
-06_11__inlines__raw_html__021: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "<a href=\"\"\">"
- }
- ]
- }
- ]
- }
-06_12__inlines__disallowed_raw_html_extension__001: |-
- Error - check implementation:
- Hast node of type "title" not supported by this converter. Please, provide an specification.
-06_13__inlines__hard_line_breaks__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "hardBreak"
- },
- {
- "type": "text",
- "text": "\nbaz"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "hardBreak"
- },
- {
- "type": "text",
- "text": "\nbaz"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "hardBreak"
- },
- {
- "type": "text",
- "text": "\nbaz"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__004: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "hardBreak"
- },
- {
- "type": "text",
- "text": "\nbar"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__005: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- },
- {
- "type": "hardBreak"
- },
- {
- "type": "text",
- "text": "\nbar"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__006: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_13__inlines__hard_line_breaks__007: |-
- Error - check implementation:
- Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
-06_13__inlines__hard_line_breaks__008: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "code span"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__009: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "code"
- }
- ],
- "text": "code\\ span"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__010: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-06_13__inlines__hard_line_breaks__011: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph"
- }
- ]
- }
-06_13__inlines__hard_line_breaks__012: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\\"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__013: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__014: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "foo\\"
- }
- ]
- }
- ]
- }
-06_13__inlines__hard_line_breaks__015: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "heading",
- "attrs": {
- "level": 3
- },
- "content": [
- {
- "type": "text",
- "text": "foo"
- }
- ]
- }
- ]
- }
-06_14__inlines__soft_line_breaks__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\nbaz"
- }
- ]
- }
- ]
- }
-06_14__inlines__soft_line_breaks__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "foo\nbaz"
- }
- ]
- }
- ]
- }
-06_15__inlines__textual_content__001: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "hello $.;'there"
- }
- ]
- }
- ]
- }
-06_15__inlines__textual_content__002: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Foo χÏῆν"
- }
- ]
- }
- ]
- }
-06_15__inlines__textual_content__003: |-
- {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Multiple spaces"
- }
- ]
- }
- ]
- }
-07_01__gitlab_specific_markdown__footnotes__001: |-
- Error - check implementation:
- Hast node of type "sup" not supported by this converter. Please, provide an specification.
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index e721525f00c..12dbabf833b 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -2361,14 +2361,53 @@
"releases": [
{
"id": 1,
+ "tag": "release-1.0",
+ "description": "Some release notes",
+ "project_id": 5,
+ "created_at": "2019-12-25T10:17:14.621Z",
+ "updated_at": "2019-12-25T10:17:14.621Z",
+ "author_id": null,
+ "name": "release-1.0",
+ "sha": "902de3a8bd5573f4a049b1457d28bc1592baaa2e",
+ "released_at": "2019-12-25T10:17:14.615Z",
+ "links": [
+ {
+ "id": 1,
+ "release_id": 1,
+ "url": "http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download",
+ "name": "release-1.0.dmg",
+ "created_at": "2019-12-25T10:17:14.621Z",
+ "updated_at": "2019-12-25T10:17:14.621Z"
+ }
+ ],
+ "milestone_releases": [
+ {
+ "milestone_id": 1349,
+ "release_id": 9172,
+ "milestone": {
+ "id": 1,
+ "title": "test milestone",
+ "project_id": 8,
+ "description": "test milestone",
+ "due_date": null,
+ "created_at": "2016-06-14T15:02:04.415Z",
+ "updated_at": "2016-06-14T15:02:04.415Z",
+ "state": "active",
+ "iid": 1
+ }
+ }
+ ]
+ },
+ {
+ "id": 2,
"tag": "release-1.1",
"description": "Some release notes",
"project_id": 5,
"created_at": "2019-12-26T10:17:14.621Z",
"updated_at": "2019-12-26T10:17:14.621Z",
- "author_id": 1,
+ "author_id": 16,
"name": "release-1.1",
- "sha": "901de3a8bd5573f4a049b1457d28bc1592ba6bf9",
+ "sha": "902de3a8bd5573f4a049b1457d28bc1592ba6bg9",
"released_at": "2019-12-26T10:17:14.615Z",
"links": [
{
@@ -2397,6 +2436,45 @@
}
}
]
+ },
+ {
+ "id": 3,
+ "tag": "release-1.2",
+ "description": "Some release notes",
+ "project_id": 5,
+ "created_at": "2019-12-27T10:17:14.621Z",
+ "updated_at": "2019-12-27T10:17:14.621Z",
+ "author_id": 1,
+ "name": "release-1.2",
+ "sha": "903de3a8bd5573f4a049b1457d28bc1592ba6bf9",
+ "released_at": "2019-12-27T10:17:14.615Z",
+ "links": [
+ {
+ "id": 1,
+ "release_id": 1,
+ "url": "http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download",
+ "name": "release-1.2.dmg",
+ "created_at": "2019-12-27T10:17:14.621Z",
+ "updated_at": "2019-12-27T10:17:14.621Z"
+ }
+ ],
+ "milestone_releases": [
+ {
+ "milestone_id": 1349,
+ "release_id": 9172,
+ "milestone": {
+ "id": 1,
+ "title": "test milestone",
+ "project_id": 8,
+ "description": "test milestone",
+ "due_date": null,
+ "created_at": "2016-06-14T15:02:04.415Z",
+ "updated_at": "2016-06-14T15:02:04.415Z",
+ "state": "active",
+ "iid": 1
+ }
+ }
+ ]
}
],
"project_members": [
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/releases.ndjson b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/releases.ndjson
index a194898cb5a..dfbde1f2598 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/releases.ndjson
+++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/releases.ndjson
@@ -1 +1,3 @@
-{"id":1,"tag":"release-1.1","description":"Some release notes","project_id":5,"created_at":"2019-12-26T10:17:14.621Z","updated_at":"2019-12-26T10:17:14.621Z","author_id":1,"name":"release-1.1","sha":"901de3a8bd5573f4a049b1457d28bc1592ba6bf9","released_at":"2019-12-26T10:17:14.615Z","links":[{"id":1,"release_id":1,"url":"http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download","name":"release-1.1.dmg","created_at":"2019-12-26T10:17:14.621Z","updated_at":"2019-12-26T10:17:14.621Z"}],"milestone_releases":[{"milestone_id":1349,"release_id":9172,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1}}]}
+{"id":1,"tag":"release-1.0","description":"Some release notes","project_id":5,"created_at":"2019-12-25T10:17:14.621Z","updated_at":"2019-12-25T10:17:14.621Z","author_id":null,"name":"release-1.0","sha":"901de3a8bd5573f4a049b1457d28bc1592baaa2e","released_at":"2019-12-25T10:17:14.615Z","links":[{"id":1,"release_id":1,"url":"http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download","name":"release-1.0.dmg","created_at":"2019-12-25T10:17:14.621Z","updated_at":"2019-12-25T10:17:14.621Z"}],"milestone_releases":[{"milestone_id":1349,"release_id":9172,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1}}]}
+{"id":2,"tag":"release-1.1","description":"Some release notes","project_id":5,"created_at":"2019-12-26T10:17:14.621Z","updated_at":"2019-12-26T10:17:14.621Z","author_id":16,"name":"release-1.1","sha":"902de3a8bd5573f4a049b1457d28bc1592ba6bg9","released_at":"2019-12-26T10:17:14.615Z","links":[{"id":1,"release_id":1,"url":"http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download","name":"release-1.1.dmg","created_at":"2019-12-26T10:17:14.621Z","updated_at":"2019-12-26T10:17:14.621Z"}],"milestone_releases":[{"milestone_id":1349,"release_id":9172,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1}}]}
+{"id":3,"tag":"release-1.2","description":"Some release notes","project_id":5,"created_at":"2019-12-27T10:17:14.621Z","updated_at":"2019-12-27T10:17:14.621Z","author_id":1,"name":"release-1.2","sha":"903de3a8bd5573f4a049b1457d28bc1592ba6bf9","released_at":"2019-12-27T10:17:14.615Z","links":[{"id":1,"release_id":1,"url":"http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download","name":"release-1.2.dmg","created_at":"2019-12-27T10:17:14.621Z","updated_at":"2019-12-27T10:17:14.621Z"}],"milestone_releases":[{"milestone_id":1349,"release_id":9172,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1}}]}
diff --git a/spec/fixtures/product_intelligence/survey_response_schema.json b/spec/fixtures/product_intelligence/survey_response_schema.json
deleted file mode 100644
index 03d2d170137..00000000000
--- a/spec/fixtures/product_intelligence/survey_response_schema.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "description": "Schema for a Gitlab survey_response event",
- "self": {
- "vendor": "com.gitlab",
- "name": "survey_response",
- "version": "1-0-1",
- "format": "jsonschema"
- },
- "type": "object",
- "additionalProperties": false,
- "required": ["survey_id", "response"],
- "properties": {
- "survey_id": {
- "description": "Survey ID",
- "type": "integer",
- "minimum": 0,
- "maximum": 2147483647
- },
- "response": {
- "description": "Response",
- "type": "string",
- "maxLength": 10000
- },
- "instance_id": {
- "description": "Instance ID",
- "type": ["integer", "null"],
- "minimum": 0,
- "maximum": 2147483647
- },
- "user_id": {
- "description": "User ID",
- "type": ["integer", "null"],
- "minimum": 0,
- "maximum": 2147483647
- },
- "email": {
- "description": "Email",
- "type": ["string", "null"],
- "maxLength": 255
- },
- "name": {
- "description": "Name",
- "type": ["string", "null"],
- "maxLength": 255
- },
- "username": {
- "description": "Username",
- "type": ["string", "null"],
- "maxLength": 255
- },
- "onboarding_progress": {
- "description": "Onboarding progress",
- "type": ["integer", "null"],
- "minimum": 0,
- "maximum": 2147483647
- }
- }
-}
diff --git a/spec/frontend/__helpers__/init_vue_mr_page_helper.js b/spec/frontend/__helpers__/init_vue_mr_page_helper.js
index 6b719a32480..83ed0a869dc 100644
--- a/spec/frontend/__helpers__/init_vue_mr_page_helper.js
+++ b/spec/frontend/__helpers__/init_vue_mr_page_helper.js
@@ -1,7 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import initMRPage from '~/mr_notes';
-import diffFileMockData from '../diffs/mock_data/diff_file';
+import { getDiffFileMock } from '../diffs/mock_data/diff_file';
import { userDataMock, notesDataMock, noteableDataMock } from '../notes/mock_data';
export default function initVueMRPage() {
@@ -39,7 +39,7 @@ export default function initVueMRPage() {
const mock = new MockAdapter(axios);
mock.onGet(diffsAppEndpoint).reply(200, {
branch_name: 'foo',
- diff_files: [diffFileMockData],
+ diff_files: [getDiffFileMock()],
});
initMRPage();
diff --git a/spec/frontend/__helpers__/matchers/index.js b/spec/frontend/__helpers__/matchers/index.js
index 9b83ced10e1..5da6676cdc1 100644
--- a/spec/frontend/__helpers__/matchers/index.js
+++ b/spec/frontend/__helpers__/matchers/index.js
@@ -2,3 +2,4 @@ export * from './to_have_sprite_icon';
export * from './to_have_tracking_attributes';
export * from './to_match_interpolated_text';
export * from './to_validate_json_schema';
+export * from './to_match_expected_for_markdown';
diff --git a/spec/frontend/__helpers__/matchers/to_match_expected_for_markdown.js b/spec/frontend/__helpers__/matchers/to_match_expected_for_markdown.js
new file mode 100644
index 00000000000..829f6ba9770
--- /dev/null
+++ b/spec/frontend/__helpers__/matchers/to_match_expected_for_markdown.js
@@ -0,0 +1,60 @@
+export function toMatchExpectedForMarkdown(
+ received,
+ deserializationTarget,
+ name,
+ markdown,
+ errMsg,
+ expected,
+) {
+ const options = {
+ comment: `Markdown deserialization to ${deserializationTarget}`,
+ isNot: this.isNot,
+ promise: this.promise,
+ };
+
+ const EXPECTED_LABEL = 'Expected';
+ const RECEIVED_LABEL = 'Received';
+ const isExpand = (expand) => expand !== false;
+ const forMarkdownName = `for Markdown example '${name}':\n${markdown}`;
+ const matcherName = `toMatchExpected${
+ deserializationTarget === 'HTML' ? 'Html' : 'Json'
+ }ForMarkdown`;
+
+ let pass;
+
+ // If both expected and received are deserialization errors, force pass = true,
+ // because the actual error messages can vary across environments and cause
+ // false failures (e.g. due to jest '--coverage' being passed in CI).
+ const errMsgRegExp = new RegExp(errMsg);
+ const errMsgRegExp2 = new RegExp(errMsg);
+
+ if (errMsgRegExp.test(expected) && errMsgRegExp2.test(received)) {
+ pass = true;
+ } else {
+ pass = received === expected;
+ }
+
+ const message = pass
+ ? () =>
+ // eslint-disable-next-line prefer-template
+ this.utils.matcherHint(matcherName, undefined, undefined, options) +
+ '\n\n' +
+ `Expected HTML to NOT match:\n${expected}\n\n${forMarkdownName}`
+ : () => {
+ return (
+ // eslint-disable-next-line prefer-template
+ this.utils.matcherHint(matcherName, undefined, undefined, options) +
+ '\n\n' +
+ this.utils.printDiffOrStringify(
+ expected,
+ received,
+ EXPECTED_LABEL,
+ RECEIVED_LABEL,
+ isExpand(this.expand),
+ ) +
+ `\n\n${forMarkdownName}`
+ );
+ };
+
+ return { actual: received, expected, message, name: matcherName, pass };
+}
diff --git a/spec/frontend/__helpers__/mock_user_callout_dismisser.js b/spec/frontend/__helpers__/mock_user_callout_dismisser.js
index 652f36028dc..f115e2289af 100644
--- a/spec/frontend/__helpers__/mock_user_callout_dismisser.js
+++ b/spec/frontend/__helpers__/mock_user_callout_dismisser.js
@@ -1,3 +1,5 @@
+import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
+
/**
* Mock factory for the UserCalloutDismisser component.
* @param {slotProps} The slot props to pass to the default slot content.
@@ -6,11 +8,24 @@
export const makeMockUserCalloutDismisser = ({
dismiss = () => {},
shouldShowCallout = true,
+ isLoadingQuery = false,
} = {}) => ({
+ props: UserCalloutDismisser.props,
+ data() {
+ return {
+ isLoadingQuery,
+ shouldShowCallout,
+ dismiss,
+ };
+ },
+ mounted() {
+ this.$emit('queryResult', { shouldShowCallout });
+ },
render() {
return this.$scopedSlots.default({
dismiss,
shouldShowCallout,
+ isLoadingQuery,
});
},
});
diff --git a/spec/frontend/__helpers__/performance.js b/spec/frontend/__helpers__/performance.js
new file mode 100644
index 00000000000..3bdf163c22b
--- /dev/null
+++ b/spec/frontend/__helpers__/performance.js
@@ -0,0 +1,8 @@
+// FIXME(vslobodin): Remove this stub once we have migrated to Jest 28.
+// NOTE: Do not try to optimize these stubs as Jest 27 overwrites
+// the "global.performance" object in every suite where fake timers are enabled.
+export const stubPerformanceWebAPI = () => {
+ global.performance.getEntriesByName = () => [];
+ global.performance.mark = () => {};
+ global.performance.measure = () => {};
+};
diff --git a/spec/frontend/__helpers__/set_window_location_helper.js b/spec/frontend/__helpers__/set_window_location_helper.js
index 573a089f111..d81c502b337 100644
--- a/spec/frontend/__helpers__/set_window_location_helper.js
+++ b/spec/frontend/__helpers__/set_window_location_helper.js
@@ -30,7 +30,7 @@
* // window.location.href is now 'http://test.host/a/b/foo.html?bar=1#qux
*
* Both approaches also automatically update the rest of the properties on
- * `window.locaton`. For instance:
+ * `window.location`. For instance:
*
* setWindowLocation('http://test.host/a/b/foo.html?bar=1#qux');
* // window.location.origin is now 'http://test.host'
diff --git a/spec/frontend/__helpers__/shared_test_setup.js b/spec/frontend/__helpers__/shared_test_setup.js
index 011e1142c76..4d6486544ca 100644
--- a/spec/frontend/__helpers__/shared_test_setup.js
+++ b/spec/frontend/__helpers__/shared_test_setup.js
@@ -15,6 +15,7 @@ import '~/commons/bootstrap';
// This module has some fairly decent visual test coverage in it's own repository.
jest.mock('@gitlab/favicon-overlay');
+jest.mock('~/lib/utils/axios_utils', () => jest.requireActual('helpers/mocks/axios_utils'));
process.on('unhandledRejection', global.promiseRejectionHandler);
diff --git a/spec/frontend/__helpers__/web_worker_fake.js b/spec/frontend/__helpers__/web_worker_fake.js
index 041a9bd8540..fb37e41a853 100644
--- a/spec/frontend/__helpers__/web_worker_fake.js
+++ b/spec/frontend/__helpers__/web_worker_fake.js
@@ -14,8 +14,7 @@ const createRelativeRequire = (filename) => {
const rel = path.relative(__dirname, path.dirname(filename));
const base = path.resolve(__dirname, rel);
- // reason: Dynamic require should be fine here since the code is dynamically evaluated anyways.
- // eslint-disable-next-line import/no-dynamic-require, global-require
+ // eslint-disable-next-line global-require
return (pathArg) => require(transformRequirePath(base, pathArg));
};
diff --git a/spec/frontend/access_tokens/components/access_token_table_app_spec.js b/spec/frontend/access_tokens/components/access_token_table_app_spec.js
index b45abe418e4..6013fa3ec39 100644
--- a/spec/frontend/access_tokens/components/access_token_table_app_spec.js
+++ b/spec/frontend/access_tokens/components/access_token_table_app_spec.js
@@ -1,4 +1,4 @@
-import { GlPagination, GlTable } from '@gitlab/ui';
+import { GlButton, GlPagination, GlTable } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import AccessTokenTableApp from '~/access_tokens/components/access_token_table_app.vue';
@@ -164,8 +164,8 @@ describe('~/access_tokens/components/access_token_table_app', () => {
expect(cells.at(3).text()).toBe(__('Never'));
expect(cells.at(4).text()).toBe(__('Never'));
expect(cells.at(5).text()).toBe('Maintainer');
- let anchor = cells.at(6).find('a');
- expect(anchor.attributes()).toMatchObject({
+ let button = cells.at(6).findComponent(GlButton);
+ expect(button.attributes()).toMatchObject({
'aria-label': __('Revoke'),
'data-qa-selector': __('revoke_button'),
href: '/-/profile/personal_access_tokens/1/revoke',
@@ -176,8 +176,7 @@ describe('~/access_tokens/components/access_token_table_app', () => {
{ accessTokenType },
),
});
-
- expect(anchor.classes()).toContain('btn-danger-secondary');
+ expect(button.props('category')).toBe('tertiary');
// Second row
expect(cells.at(7).text()).toBe('b');
@@ -186,9 +185,9 @@ describe('~/access_tokens/components/access_token_table_app', () => {
expect(cells.at(10).text()).not.toBe(__('Never'));
expect(cells.at(11).text()).toBe(__('Expired'));
expect(cells.at(12).text()).toBe('Maintainer');
- anchor = cells.at(13).find('a');
- expect(anchor.attributes('href')).toBe('/-/profile/personal_access_tokens/2/revoke');
- expect(anchor.classes()).toEqual(['btn', 'btn-danger', 'btn-md', 'gl-button', 'btn-icon']);
+ button = cells.at(13).findComponent(GlButton);
+ expect(button.attributes('href')).toBe('/-/profile/personal_access_tokens/2/revoke');
+ expect(button.props('category')).toBe('tertiary');
});
it('sorts rows alphabetically', async () => {
diff --git a/spec/frontend/access_tokens/components/projects_field_spec.js b/spec/frontend/access_tokens/components/projects_field_spec.js
index a9e0799d114..1c4fe7bb168 100644
--- a/spec/frontend/access_tokens/components/projects_field_spec.js
+++ b/spec/frontend/access_tokens/components/projects_field_spec.js
@@ -1,3 +1,4 @@
+import { nextTick } from 'vue';
import { within, fireEvent } from '@testing-library/dom';
import { mount } from '@vue/test-utils';
import ProjectsField from '~/access_tokens/components/projects_field.vue';
@@ -118,11 +119,10 @@ describe('ProjectsField', () => {
});
describe('when radio is changed back to "All projects"', () => {
- beforeEach(() => {
- fireEvent.click(findAllProjectsRadio());
- });
+ it('removes the hidden input value', async () => {
+ fireEvent.change(findAllProjectsRadio());
+ await nextTick();
- it('removes the hidden input value', () => {
expect(findHiddenInput().attributes('value')).toBe('');
});
});
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 3fdbacb6efa..2c2151bfb41 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
@@ -25,7 +25,7 @@ exports[`AddContextCommitsModal renders modal with 2 tabs 1`] = `
>
<div
- class="mt-2"
+ class="gl-mt-3"
>
<gl-search-box-by-type-stub
clearbuttontitle="Clear"
diff --git a/spec/frontend/admin/analytics/devops_score/components/devops_score_spec.js b/spec/frontend/admin/analytics/devops_score/components/devops_score_spec.js
index 14f94e671a4..d6c5c5f963a 100644
--- a/spec/frontend/admin/analytics/devops_score/components/devops_score_spec.js
+++ b/spec/frontend/admin/analytics/devops_score/components/devops_score_spec.js
@@ -52,7 +52,7 @@ describe('DevopsScore', () => {
it('contains a link to the feature documentation', () => {
expect(findDocsLink().exists()).toBe(true);
expect(findDocsLink().attributes('href')).toBe(
- '/help/user/admin_area/analytics/dev_ops_report',
+ '/help/user/admin_area/analytics/dev_ops_reports',
);
});
});
diff --git a/spec/frontend/admin/deploy_keys/components/table_spec.js b/spec/frontend/admin/deploy_keys/components/table_spec.js
index 49bda7100fb..a18506c0916 100644
--- a/spec/frontend/admin/deploy_keys/components/table_spec.js
+++ b/spec/frontend/admin/deploy_keys/components/table_spec.js
@@ -27,6 +27,7 @@ describe('DeployKeysTable', () => {
const deployKey = responseBody[0];
const deployKey2 = responseBody[1];
+ const deployKeyWithoutMd5Fingerprint = responseBody[2];
const createComponent = (provide = {}) => {
wrapper = mountExtended(DeployKeysTable, {
@@ -57,9 +58,10 @@ describe('DeployKeysTable', () => {
const timeAgoTooltip = findTimeAgoTooltip(expectedRowIndex);
expect(wrapper.findByText(expectedDeployKey.title).exists()).toBe(true);
- expect(wrapper.findByText(expectedDeployKey.fingerprint, { selector: 'code' }).exists()).toBe(
- true,
- );
+
+ expect(
+ wrapper.findByText(expectedDeployKey.fingerprint_sha256, { selector: 'span' }).exists(),
+ ).toBe(true);
expect(timeAgoTooltip.exists()).toBe(true);
expect(timeAgoTooltip.props('time')).toBe(expectedDeployKey.created_at);
expect(editButton.exists()).toBe(true);
@@ -67,6 +69,13 @@ describe('DeployKeysTable', () => {
expect(findRemoveButton(expectedRowIndex).exists()).toBe(true);
};
+ const expectDeployKeyWithFingerprintIsRendered = (expectedDeployKey, expectedRowIndex) => {
+ expect(wrapper.findByText(expectedDeployKey.fingerprint, { selector: 'span' }).exists()).toBe(
+ true,
+ );
+ expectDeployKeyIsRendered(expectedDeployKey, expectedRowIndex);
+ };
+
const itRendersTheEmptyState = () => {
it('renders empty state', () => {
const emptyState = wrapper.findComponent(GlEmptyState);
@@ -127,8 +136,12 @@ describe('DeployKeysTable', () => {
});
it('renders deploy keys in table', () => {
- expectDeployKeyIsRendered(deployKey, 0);
- expectDeployKeyIsRendered(deployKey2, 1);
+ expectDeployKeyWithFingerprintIsRendered(deployKey, 0);
+ expectDeployKeyWithFingerprintIsRendered(deployKey2, 1);
+ });
+
+ it('renders deploy keys that do not have an MD5 fingerprint', () => {
+ expectDeployKeyIsRendered(deployKeyWithoutMd5Fingerprint, 2);
});
describe('when delete button is clicked', () => {
@@ -157,7 +170,7 @@ describe('DeployKeysTable', () => {
beforeEach(() => {
Api.deployKeys.mockResolvedValueOnce({
data: [deployKey],
- headers: { 'x-total': '2' },
+ headers: { 'x-total': '3' },
});
createComponent();
@@ -179,7 +192,7 @@ describe('DeployKeysTable', () => {
describe('when pagination is changed', () => {
it('calls API with `page` parameter', async () => {
const pagination = findPagination();
- expectDeployKeyIsRendered(deployKey, 0);
+ expectDeployKeyWithFingerprintIsRendered(deployKey, 0);
Api.deployKeys.mockResolvedValue({
data: [deployKey2],
@@ -199,7 +212,7 @@ describe('DeployKeysTable', () => {
page: 2,
public: true,
});
- expectDeployKeyIsRendered(deployKey2, 0);
+ expectDeployKeyWithFingerprintIsRendered(deployKey2, 0);
});
});
});
diff --git a/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js b/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js
index 5b4f954b672..31a0c2b07e4 100644
--- a/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js
+++ b/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js
@@ -1,6 +1,6 @@
import { GlButton, GlModal } from '@gitlab/ui';
-import { within, fireEvent } from '@testing-library/dom';
-import { shallowMount, mount } from '@vue/test-utils';
+import { within } from '@testing-library/dom';
+import { shallowMount, mount, createWrapper } from '@vue/test-utils';
import { stubComponent } from 'helpers/stub_component';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import SignupForm from '~/pages/admin/application_settings/general/components/signup_form.vue';
@@ -121,7 +121,7 @@ describe('Signup Form', () => {
describe('when user clicks on file radio', () => {
beforeEach(() => {
- fireEvent.click(findDenyListFileRadio());
+ createWrapper(findDenyListFileRadio()).setChecked(true);
});
it('has raw list not selected', () => {
@@ -165,7 +165,7 @@ describe('Signup Form', () => {
describe('when user clicks on raw list radio', () => {
beforeEach(() => {
- fireEvent.click(findDenyListRawRadio());
+ createWrapper(findDenyListRawRadio()).setChecked(true);
});
it('has raw list selected', () => {
diff --git a/spec/frontend/admin/signup_restrictions/mock_data.js b/spec/frontend/admin/signup_restrictions/mock_data.js
index 135fc8caae0..9e001e122a4 100644
--- a/spec/frontend/admin/signup_restrictions/mock_data.js
+++ b/spec/frontend/admin/signup_restrictions/mock_data.js
@@ -18,6 +18,10 @@ export const rawMockData = {
emailRestrictions: 'user1@domain.com, user2@domain.com',
afterSignUpText: 'Congratulations on your successful sign-up!',
pendingUserCount: '0',
+ passwordNumberRequired: 'true',
+ passwordLowercaseRequired: 'true',
+ passwordUppercaseRequired: 'true',
+ passwordSymbolRequired: 'true',
};
export const mockData = {
@@ -40,4 +44,8 @@ export const mockData = {
emailRestrictions: 'user1@domain.com, user2@domain.com',
afterSignUpText: 'Congratulations on your successful sign-up!',
pendingUserCount: '0',
+ passwordNumberRequired: true,
+ passwordLowercaseRequired: true,
+ passwordUppercaseRequired: true,
+ passwordSymbolRequired: true,
};
diff --git a/spec/frontend/admin/signup_restrictions/utils_spec.js b/spec/frontend/admin/signup_restrictions/utils_spec.js
index fd5c4c3317b..f07e14430f9 100644
--- a/spec/frontend/admin/signup_restrictions/utils_spec.js
+++ b/spec/frontend/admin/signup_restrictions/utils_spec.js
@@ -14,6 +14,10 @@ describe('utils', () => {
'domainDenylistEnabled',
'denylistTypeRawSelected',
'emailRestrictionsEnabled',
+ 'passwordNumberRequired',
+ 'passwordLowercaseRequired',
+ 'passwordUppercaseRequired',
+ 'passwordSymbolRequired',
],
}),
).toEqual(mockData);
diff --git a/spec/frontend/admin/statistics_panel/components/app_spec.js b/spec/frontend/admin/statistics_panel/components/app_spec.js
index 3cfb6feeb86..bac542e72fb 100644
--- a/spec/frontend/admin/statistics_panel/components/app_spec.js
+++ b/spec/frontend/admin/statistics_panel/components/app_spec.js
@@ -64,7 +64,7 @@ describe('Admin statistics app', () => {
createComponent();
expect(findStats(index).text()).toContain(label);
- expect(findStats(index).text()).toContain(count);
+ expect(findStats(index).text()).toContain(count.toString());
});
});
});
diff --git a/spec/frontend/admin/users/components/user_actions_spec.js b/spec/frontend/admin/users/components/user_actions_spec.js
index b90a30b5b89..e04c43ae3f2 100644
--- a/spec/frontend/admin/users/components/user_actions_spec.js
+++ b/spec/frontend/admin/users/components/user_actions_spec.js
@@ -77,12 +77,6 @@ describe('AdminUserActions component', () => {
expect(findActionsDropdown().exists()).toBe(true);
});
- it('renders the tooltip', () => {
- const tooltip = getBinding(findActionsDropdown().element, 'gl-tooltip');
-
- expect(tooltip.value).toBe(I18N_USER_ACTIONS.userAdministration);
- });
-
describe('when there are actions that require confirmation', () => {
beforeEach(() => {
initComponent({ actions: CONFIRMATION_ACTIONS });
diff --git a/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap b/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap
index ec5b6a5597b..4693d5a47e4 100644
--- a/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap
+++ b/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap
@@ -17,6 +17,7 @@ exports[`Alert integration settings form default state should match the default
<gl-form-checkbox-stub
checked="true"
data-qa-selector="create_issue_checkbox"
+ id="2"
>
<span>
Create an incident. Incidents are created for each alert triggered.
@@ -87,7 +88,9 @@ exports[`Alert integration settings form default state should match the default
labeldescription=""
optionaltext="(optional)"
>
- <gl-form-checkbox-stub>
+ <gl-form-checkbox-stub
+ id="3"
+ >
<span>
Send a single email notification to Owners and Maintainers for new alerts.
</span>
@@ -101,6 +104,7 @@ exports[`Alert integration settings form default state should match the default
>
<gl-form-checkbox-stub
checked="true"
+ id="4"
>
<span>
Automatically close associated incident when a recovery alert notification resolves an alert
diff --git a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
index 018303fcae7..7d9d2875cf8 100644
--- a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
@@ -265,7 +265,6 @@ describe('AlertsSettingsForm', () => {
});
it('should not allow a user to test invalid JSON', async () => {
- jest.useFakeTimers();
await findJsonTextArea().setValue('Invalid JSON');
jest.runAllTimers();
@@ -278,7 +277,6 @@ describe('AlertsSettingsForm', () => {
});
it('should allow for the form to be automatically saved if the test payload is successfully submitted', async () => {
- jest.useFakeTimers();
await findJsonTextArea().setValue('{ "value": "value" }');
jest.runAllTimers();
diff --git a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
index 2691e11e616..ba8215f4e00 100644
--- a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
+++ b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
@@ -7,6 +7,7 @@ exports[`Keep latest artifact checkbox when application keep latest artifact set
<b-form-checkbox-stub
checked="true"
class="gl-form-checkbox"
+ id="4"
value="true"
>
<strong
diff --git a/spec/frontend/batch_comments/components/draft_note_spec.js b/spec/frontend/batch_comments/components/draft_note_spec.js
index 6a997ebaaa8..ccca4a2c3e9 100644
--- a/spec/frontend/batch_comments/components/draft_note_spec.js
+++ b/spec/frontend/batch_comments/components/draft_note_spec.js
@@ -33,13 +33,16 @@ describe('Batch comments draft note component', () => {
const findSubmitReviewButton = () => wrapper.findComponent(PublishButton);
const findAddCommentButton = () => wrapper.findComponent(GlButton);
- const createComponent = (propsData = { draft }) => {
+ const createComponent = (propsData = { draft }, glFeatures = {}) => {
wrapper = shallowMount(DraftNote, {
store,
propsData,
stubs: {
NoteableNote: NoteableNoteStub,
},
+ provide: {
+ glFeatures,
+ },
});
jest.spyOn(wrapper.vm.$store, 'dispatch').mockImplementation();
@@ -96,6 +99,12 @@ describe('Batch comments draft note component', () => {
expect(publishNowButton.props().disabled).toBe(true);
expect(publishNowButton.props().loading).toBe(false);
});
+
+ it('hides button when mr_review_submit_comment is enabled', () => {
+ createComponent({ draft }, { mrReviewSubmitComment: true });
+
+ expect(findAddCommentButton().exists()).toBe(false);
+ });
});
describe('submit review', () => {
diff --git a/spec/frontend/batch_comments/components/preview_dropdown_spec.js b/spec/frontend/batch_comments/components/preview_dropdown_spec.js
index bf3bbf4de26..079b64225e4 100644
--- a/spec/frontend/batch_comments/components/preview_dropdown_spec.js
+++ b/spec/frontend/batch_comments/components/preview_dropdown_spec.js
@@ -1,8 +1,15 @@
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { TEST_HOST } from 'helpers/test_constants';
+import { visitUrl } from '~/lib/utils/url_utility';
import PreviewDropdown from '~/batch_comments/components/preview_dropdown.vue';
+jest.mock('~/lib/utils/url_utility', () => ({
+ visitUrl: jest.fn(),
+ setUrlParams: jest.requireActual('~/lib/utils/url_utility').setUrlParams,
+}));
+
Vue.use(Vuex);
let wrapper;
@@ -27,6 +34,11 @@ function factory({ viewDiffsFileByFile = false, draftsCount = 1, sortedDrafts =
actions: { scrollToDraft },
getters: { draftsCount: () => draftsCount, sortedDrafts: () => sortedDrafts },
},
+ notes: {
+ getters: {
+ getNoteableData: () => ({ diff_head_sha: '123' }),
+ },
+ },
},
});
@@ -67,5 +79,19 @@ describe('Batch comments preview dropdown', () => {
expect(scrollToDraft).toHaveBeenCalledWith(expect.anything(), { id: 1 });
});
+
+ it('changes window location to navigate to commit', async () => {
+ factory({
+ viewDiffsFileByFile: false,
+ sortedDrafts: [{ id: 1, position: { head_sha: '1234' } }],
+ });
+
+ wrapper.findByTestId('preview-item').vm.$emit('click');
+
+ await nextTick();
+
+ expect(scrollToDraft).not.toHaveBeenCalled();
+ expect(visitUrl).toHaveBeenCalledWith(`${TEST_HOST}/?commit_id=1234#note_1`);
+ });
});
});
diff --git a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
index 172b510645d..9f50b12bac2 100644
--- a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
+++ b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
@@ -298,14 +298,18 @@ describe('Batch comments store actions', () => {
const draft = {
discussion_id: '1',
id: '2',
+ file_path: 'lib/example.js',
};
actions.scrollToDraft({ dispatch, rootGetters }, draft);
- expect(dispatch.mock.calls[0]).toEqual([
- 'expandDiscussion',
- { discussionId: '1' },
- { root: true },
+ expect(dispatch.mock.calls).toEqual([
+ [
+ 'diffs/setFileCollapsedAutomatically',
+ { filePath: draft.file_path, collapsed: false },
+ { root: true },
+ ],
+ ['expandDiscussion', { discussionId: '1' }, { root: true }],
]);
expect(window.mrTabs.tabShown).toHaveBeenCalledWith('diffs');
diff --git a/spec/frontend/behaviors/shortcuts/keybindings_spec.js b/spec/frontend/behaviors/shortcuts/keybindings_spec.js
index 3ad44a16ae1..1f7e1b24e78 100644
--- a/spec/frontend/behaviors/shortcuts/keybindings_spec.js
+++ b/spec/frontend/behaviors/shortcuts/keybindings_spec.js
@@ -11,9 +11,7 @@ import {
} from '~/behaviors/shortcuts/keybindings';
describe('~/behaviors/shortcuts/keybindings', () => {
- beforeAll(() => {
- useLocalStorageSpy();
- });
+ useLocalStorageSpy();
const setupCustomizations = (customizationsAsString) => {
localStorage.clear();
diff --git a/spec/frontend/blob/viewer/index_spec.js b/spec/frontend/blob/viewer/index_spec.js
deleted file mode 100644
index b2559af182b..00000000000
--- a/spec/frontend/blob/viewer/index_spec.js
+++ /dev/null
@@ -1,189 +0,0 @@
-/* eslint-disable no-new */
-
-import MockAdapter from 'axios-mock-adapter';
-import $ from 'jquery';
-import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
-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;
-
- const jQueryMock = {
- tooltip: jest.fn(),
- };
-
- setTestTimeout(2000);
-
- beforeEach(() => {
- window.gon.features = { refactorBlobViewer: false }; // This file is based on the old (non-refactored) blob viewer
- jest.spyOn(window, 'requestIdleCallback').mockImplementation(execImmediately);
- $.fn.extend(jQueryMock);
- mock = new MockAdapter(axios);
-
- loadHTMLFixture('blob/show_readme.html');
- $('#modal-upload-blob').remove();
-
- mock.onGet(/blob\/.+\/README\.md/).reply(200, {
- html: '<div>testing</div>',
- });
-
- blob = new BlobViewer();
- });
-
- afterEach(() => {
- mock.restore();
- window.location.hash = '';
-
- resetHTMLFixture();
- });
-
- it('loads source file after switching views', async () => {
- document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
-
- await axios.waitForAll();
-
- expect(
- document
- .querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]')
- .classList.contains('hidden'),
- ).toBeFalsy();
- });
-
- it('loads source file when line number is in hash', async () => {
- window.location.hash = '#L1';
-
- new BlobViewer();
-
- await axios.waitForAll();
-
- expect(
- document
- .querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]')
- .classList.contains('hidden'),
- ).toBeFalsy();
- });
-
- it('doesnt reload file if already loaded', () => {
- const asyncClick = async () => {
- document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
-
- await axios.waitForAll();
- };
-
- return asyncClick()
- .then(() => asyncClick())
- .then(() => {
- expect(document.querySelector('.blob-viewer[data-type="simple"]').dataset.loaded).toBe(
- 'true',
- );
- });
- });
-
- describe('copy blob button', () => {
- let copyButton;
- let copyButtonTooltip;
-
- beforeEach(() => {
- copyButton = document.querySelector('.js-copy-blob-source-btn');
- copyButtonTooltip = document.querySelector('.js-copy-blob-source-btn-tooltip');
- });
-
- it('disabled on load', () => {
- expect(copyButton.classList.contains('disabled')).toBeTruthy();
- });
-
- it('has tooltip when disabled', () => {
- expect(copyButtonTooltip.getAttribute('title')).toBe(
- 'Switch to the source to copy the file contents',
- );
- });
-
- it('is blurred when clicked and disabled', () => {
- jest.spyOn(copyButton, 'blur').mockImplementation(() => {});
-
- copyButton.click();
-
- expect(copyButton.blur).toHaveBeenCalled();
- });
-
- it('is not blurred when clicked and not disabled', () => {
- jest.spyOn(copyButton, 'blur').mockImplementation(() => {});
-
- copyButton.classList.remove('disabled');
- copyButton.click();
-
- expect(copyButton.blur).not.toHaveBeenCalled();
- });
-
- it('enables after switching to simple view', async () => {
- document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
-
- await axios.waitForAll();
-
- expect(copyButton.classList.contains('disabled')).toBeFalsy();
- });
-
- it('updates tooltip after switching to simple view', async () => {
- document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
-
- await axios.waitForAll();
-
- expect(copyButtonTooltip.getAttribute('title')).toBe('Copy file contents');
- });
- });
-
- describe('switchToViewer', () => {
- it('removes active class from old viewer button', () => {
- blob.switchToViewer('simple');
-
- expect(
- document.querySelector('.js-blob-viewer-switch-btn.active[data-viewer="rich"]'),
- ).toBeNull();
- });
-
- it('adds active class to new viewer button', () => {
- const simpleBtn = document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]');
-
- jest.spyOn(simpleBtn, 'blur').mockImplementation(() => {});
-
- blob.switchToViewer('simple');
-
- expect(simpleBtn.classList.contains('selected')).toBeTruthy();
-
- expect(simpleBtn.blur).toHaveBeenCalled();
- });
-
- it('makes request for initial view', () => {
- expect(mock.history).toMatchObject({
- get: [{ url: expect.stringMatching(/README\.md\?.*viewer=rich/) }],
- });
- });
-
- describe.each`
- views
- ${['simple']}
- ${['simple', 'rich']}
- `('when view switches to $views', ({ views }) => {
- beforeEach(async () => {
- views.forEach((view) => blob.switchToViewer(view));
- await axios.waitForAll();
- });
-
- it('sends 1 AJAX request for new view', async () => {
- expect(mock.history).toMatchObject({
- get: [
- { url: expect.stringMatching(/README\.md\?.*viewer=rich/) },
- { url: expect.stringMatching(/README\.md\?.*viewer=simple/) },
- ],
- });
- });
- });
- });
-});
diff --git a/spec/frontend/boards/components/board_card_spec.js b/spec/frontend/boards/components/board_card_spec.js
index aad89cf8261..17a5383a31e 100644
--- a/spec/frontend/boards/components/board_card_spec.js
+++ b/spec/frontend/boards/components/board_card_spec.js
@@ -6,7 +6,7 @@ import Vuex from 'vuex';
import BoardCard from '~/boards/components/board_card.vue';
import BoardCardInner from '~/boards/components/board_card_inner.vue';
import { inactiveId } from '~/boards/constants';
-import { mockLabelList, mockIssue } from '../mock_data';
+import { mockLabelList, mockIssue, DEFAULT_COLOR } from '../mock_data';
describe('Board card', () => {
let wrapper;
@@ -180,4 +180,40 @@ describe('Board card', () => {
expect(wrapper.classes()).toContain('gl-cursor-grab');
});
});
+
+ describe('when Epic colors are enabled', () => {
+ it('applies the correct color', () => {
+ window.gon.features = { epicColorHighlight: true };
+ createStore();
+ mountComponent({
+ item: {
+ ...mockIssue,
+ color: DEFAULT_COLOR,
+ },
+ });
+
+ expect(wrapper.classes()).toEqual(
+ expect.arrayContaining(['gl-pl-4', 'gl-border-l-solid', 'gl-border-4']),
+ );
+ expect(wrapper.attributes('style')).toContain(`border-color: ${DEFAULT_COLOR}`);
+ });
+ });
+
+ describe('when Epic colors are not enabled', () => {
+ it('applies the correct color', () => {
+ window.gon.features = { epicColorHighlight: false };
+ createStore();
+ mountComponent({
+ item: {
+ ...mockIssue,
+ color: DEFAULT_COLOR,
+ },
+ });
+
+ expect(wrapper.classes()).not.toEqual(
+ expect.arrayContaining(['gl-pl-4', 'gl-border-l-solid', 'gl-border-4']),
+ );
+ expect(wrapper.attributes('style')).toBeUndefined();
+ });
+ });
});
diff --git a/spec/frontend/boards/components/config_toggle_spec.js b/spec/frontend/boards/components/config_toggle_spec.js
new file mode 100644
index 00000000000..47d4692453d
--- /dev/null
+++ b/spec/frontend/boards/components/config_toggle_spec.js
@@ -0,0 +1,59 @@
+import Vuex from 'vuex';
+import Vue from 'vue';
+import { shallowMount } from '@vue/test-utils';
+import { GlButton } from '@gitlab/ui';
+import ConfigToggle from '~/boards/components/config_toggle.vue';
+import eventHub from '~/boards/eventhub';
+import store from '~/boards/stores';
+import { mockTracking } from 'helpers/tracking_helper';
+
+describe('ConfigToggle', () => {
+ let wrapper;
+
+ Vue.use(Vuex);
+
+ const createComponent = (provide = {}) =>
+ shallowMount(ConfigToggle, {
+ store,
+ provide: {
+ canAdminList: true,
+ ...provide,
+ },
+ });
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a button with label `View scope` when `canAdminList` is `false`', () => {
+ wrapper = createComponent({ canAdminList: false });
+ expect(findButton().text()).toBe('View scope');
+ });
+
+ it('renders a button with label `Edit board` when `canAdminList` is `true`', () => {
+ wrapper = createComponent();
+ expect(findButton().text()).toBe('Edit board');
+ });
+
+ it('emits `showBoardModal` when button is clicked', () => {
+ const eventHubSpy = jest.spyOn(eventHub, '$emit');
+ wrapper = createComponent();
+
+ findButton().vm.$emit('click', { preventDefault: () => {} });
+
+ expect(eventHubSpy).toHaveBeenCalledWith('showBoardModal', 'edit');
+ });
+
+ it('tracks clicking the button', () => {
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ wrapper = createComponent();
+
+ findButton().vm.$emit('click', { preventDefault: () => {} });
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_button', {
+ label: 'edit_board',
+ });
+ });
+});
diff --git a/spec/frontend/boards/components/toggle_focus_spec.js b/spec/frontend/boards/components/toggle_focus_spec.js
new file mode 100644
index 00000000000..3cbaac91f8d
--- /dev/null
+++ b/spec/frontend/boards/components/toggle_focus_spec.js
@@ -0,0 +1,47 @@
+import { GlButton } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import ToggleFocus from '~/boards/components/toggle_focus.vue';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
+describe('ToggleFocus', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(ToggleFocus, {
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ attachTo: document.body,
+ });
+ };
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a button with `maximize` icon', () => {
+ createComponent();
+
+ expect(findButton().props('icon')).toBe('maximize');
+ expect(findButton().attributes('aria-label')).toBe(ToggleFocus.i18n.toggleFocusMode);
+ });
+
+ it('contains a tooltip with title', () => {
+ createComponent();
+ const tooltip = getBinding(findButton().element, 'gl-tooltip');
+
+ expect(tooltip).toBeDefined();
+ expect(findButton().attributes('title')).toBe(ToggleFocus.i18n.toggleFocusMode);
+ });
+
+ it('toggles the icon when the button is clicked', async () => {
+ createComponent();
+ findButton().vm.$emit('click');
+ await nextTick();
+
+ expect(findButton().props('icon')).toBe('minimize');
+ });
+});
diff --git a/spec/frontend/boards/mock_data.js b/spec/frontend/boards/mock_data.js
index 6ec39be5d29..1ee05d81f37 100644
--- a/spec/frontend/boards/mock_data.js
+++ b/spec/frontend/boards/mock_data.js
@@ -790,3 +790,5 @@ export const epicBoardListQueryResponse = (totalWeight = 5) => ({
},
},
});
+
+export const DEFAULT_COLOR = '#1068bf';
diff --git a/spec/frontend/boards/project_select_spec.js b/spec/frontend/boards/project_select_spec.js
index bd79060c54f..c45cd545155 100644
--- a/spec/frontend/boards/project_select_spec.js
+++ b/spec/frontend/boards/project_select_spec.js
@@ -1,16 +1,16 @@
import {
GlDropdown,
GlDropdownItem,
+ GlFormInput,
GlSearchBoxByType,
GlLoadingIcon,
- GlFormInput,
} from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
-import waitForPromises from 'helpers/wait_for_promises';
import ProjectSelect from '~/boards/components/project_select.vue';
import defaultState from '~/boards/stores/state';
+import waitForPromises from 'helpers/wait_for_promises';
import { mockList, mockActiveGroupProjects } from './mock_data';
@@ -21,7 +21,7 @@ describe('ProjectSelect component', () => {
let store;
const findLabel = () => wrapper.find("[data-testid='header-label']");
- const findGlDropdown = () => wrapper.find(GlDropdown);
+ const findGlDropdown = () => wrapper.findComponent(GlDropdown);
const findGlDropdownLoadingIcon = () =>
findGlDropdown().find('button:first-child').find(GlLoadingIcon);
const findGlSearchBoxByType = () => wrapper.find(GlSearchBoxByType);
@@ -137,7 +137,7 @@ describe('ProjectSelect component', () => {
await nextTick();
const searchInput = findGlDropdown().findComponent(GlFormInput).element;
- expect(document.activeElement).toEqual(searchInput);
+ expect(document.activeElement).toBe(searchInput);
});
});
diff --git a/spec/frontend/ci_lint/mock_data.js b/spec/frontend/ci_lint/mock_data.js
index 28ea0f55bf8..660b2ad6e8b 100644
--- a/spec/frontend/ci_lint/mock_data.js
+++ b/spec/frontend/ci_lint/mock_data.js
@@ -1,5 +1,16 @@
import { mockJobs } from 'jest/pipeline_editor/mock_data';
+export const mockLintDataError = {
+ data: {
+ lintCI: {
+ errors: ['Error message'],
+ warnings: ['Warning message'],
+ valid: false,
+ jobs: mockJobs,
+ },
+ },
+};
+
export const mockLintDataValid = {
data: {
lintCI: {
diff --git a/spec/frontend/ci_secure_files/components/secure_files_list_spec.js b/spec/frontend/ci_secure_files/components/secure_files_list_spec.js
index ad5f8a56ced..04d38a3281a 100644
--- a/spec/frontend/ci_secure_files/components/secure_files_list_spec.js
+++ b/spec/frontend/ci_secure_files/components/secure_files_list_spec.js
@@ -1,10 +1,12 @@
-import { GlLoadingIcon } from '@gitlab/ui';
+import { GlLoadingIcon, GlModal } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
import { mount } from '@vue/test-utils';
import axios from '~/lib/utils/axios_utils';
import SecureFilesList from '~/ci_secure_files/components/secure_files_list.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import Api from '~/api';
import { secureFiles } from '../mock_data';
@@ -22,15 +24,18 @@ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${dummyProj
describe('SecureFilesList', () => {
let wrapper;
let mock;
+ let trackingSpy;
beforeEach(() => {
originalGon = window.gon;
+ trackingSpy = mockTracking(undefined, undefined, jest.spyOn);
window.gon = { ...dummyGon };
});
afterEach(() => {
wrapper.destroy();
mock.restore();
+ unmockTracking();
window.gon = originalGon;
});
@@ -52,7 +57,9 @@ describe('SecureFilesList', () => {
const findPagination = () => wrapper.findAll('ul.pagination');
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findUploadButton = () => wrapper.findAll('span.gl-button-text');
- const findDeleteButton = () => wrapper.findAll('tbody tr td button.btn-danger');
+ const findDeleteModal = () => wrapper.findComponent(GlModal);
+ const findUploadInput = () => wrapper.findAll('input[type="file"]').at(0);
+ const findDeleteButton = () => wrapper.findAll('[data-testid="delete-button"]');
describe('when secure files exist in a project', () => {
beforeEach(async () => {
@@ -64,7 +71,7 @@ describe('SecureFilesList', () => {
});
it('displays a table with expected headers', () => {
- const headers = ['Filename', 'Uploaded'];
+ const headers = ['File name', 'Uploaded date'];
headers.forEach((header, i) => {
expect(findHeaderAt(i).text()).toBe(header);
});
@@ -78,6 +85,30 @@ describe('SecureFilesList', () => {
expect(findCell(0, 0).text()).toBe(secureFile.name);
expect(findCell(0, 1).find(TimeAgoTooltip).props('time')).toBe(secureFile.created_at);
});
+
+ describe('event tracking', () => {
+ it('sends tracking information on list load', () => {
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'render_secure_files_list', {});
+ });
+
+ it('sends tracking information on file upload', async () => {
+ Api.uploadProjectSecureFile = jest.fn().mockResolvedValue();
+ Object.defineProperty(findUploadInput().element, 'files', { value: [{}] });
+ findUploadInput().trigger('change');
+
+ await waitForPromises();
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'upload_secure_file', {});
+ });
+
+ it('sends tracking information on file deletion', async () => {
+ Api.deleteProjectSecureFile = jest.fn().mockResolvedValue();
+ findDeleteModal().vm.$emit('ok');
+ await waitForPromises();
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'delete_secure_file', {});
+ });
+ });
});
describe('when no secure files exist in a project', () => {
@@ -90,14 +121,14 @@ describe('SecureFilesList', () => {
});
it('displays a table with expected headers', () => {
- const headers = ['Filename', 'Uploaded'];
+ const headers = ['File name', 'Uploaded date'];
headers.forEach((header, i) => {
expect(findHeaderAt(i).text()).toBe(header);
});
});
it('displays a table with a no records message', () => {
- expect(findCell(0, 0).text()).toBe('There are no records to show');
+ expect(findCell(0, 0).text()).toBe('There are no secure files yet.');
});
});
diff --git a/spec/frontend/clusters_list/components/agent_table_spec.js b/spec/frontend/clusters_list/components/agent_table_spec.js
index 2a43b45a2f5..b78f0a3686c 100644
--- a/spec/frontend/clusters_list/components/agent_table_spec.js
+++ b/spec/frontend/clusters_list/components/agent_table_spec.js
@@ -70,10 +70,10 @@ describe('AgentTable', () => {
});
it.each`
- status | iconName | lineNumber
- ${'Never connected'} | ${'status-neutral'} | ${0}
- ${'Connected'} | ${'status-success'} | ${1}
- ${'Not connected'} | ${'severity-critical'} | ${2}
+ status | iconName | lineNumber
+ ${'Never connected'} | ${'status-neutral'} | ${0}
+ ${'Connected'} | ${'status-success'} | ${1}
+ ${'Not connected'} | ${'status-alert'} | ${2}
`(
'displays agent connection status as "$status" at line $lineNumber',
({ status, iconName, lineNumber }) => {
diff --git a/spec/frontend/clusters_list/components/clusters_spec.js b/spec/frontend/clusters_list/components/clusters_spec.js
index c150a7f05d0..5c7635c1617 100644
--- a/spec/frontend/clusters_list/components/clusters_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_spec.js
@@ -103,11 +103,9 @@ describe('Clusters', () => {
});
describe('when is loaded as a child component', () => {
- beforeEach(() => {
+ it("shouldn't render pagination buttons", () => {
createWrapper({ limit: 6 });
- });
- it("shouldn't render pagination buttons", () => {
expect(findPaginatedButtons().exists()).toBe(false);
});
});
diff --git a/spec/frontend/content_editor/components/bubble_menus/code_block_spec.js b/spec/frontend/content_editor/components/bubble_menus/code_block_spec.js
index 646d068e795..154035a46ed 100644
--- a/spec/frontend/content_editor/components/bubble_menus/code_block_spec.js
+++ b/spec/frontend/content_editor/components/bubble_menus/code_block_spec.js
@@ -44,6 +44,12 @@ describe('content_editor/components/bubble_menus/code_block', () => {
});
};
+ const preTag = ({ language, content = 'test' } = {}) => {
+ const languageAttr = language ? ` lang="${language}"` : '';
+
+ return `<pre class="js-syntax-highlight"${languageAttr}>${content}</pre>`;
+ };
+
const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
const findDropdownItemsData = () =>
findDropdownItems().wrappers.map((x) => ({
@@ -62,7 +68,7 @@ describe('content_editor/components/bubble_menus/code_block', () => {
});
it('renders bubble menu component', async () => {
- tiptapEditor.commands.insertContent('<pre>test</pre>');
+ tiptapEditor.commands.insertContent(preTag());
bubbleMenu = wrapper.findComponent(BubbleMenu);
await emitEditorEvent({ event: 'transaction', tiptapEditor });
@@ -72,7 +78,7 @@ describe('content_editor/components/bubble_menus/code_block', () => {
});
it('selects plaintext language by default', async () => {
- tiptapEditor.commands.insertContent('<pre>test</pre>');
+ tiptapEditor.commands.insertContent(preTag());
bubbleMenu = wrapper.findComponent(BubbleMenu);
await emitEditorEvent({ event: 'transaction', tiptapEditor });
@@ -81,7 +87,7 @@ describe('content_editor/components/bubble_menus/code_block', () => {
});
it('selects appropriate language based on the code block', async () => {
- tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+ tiptapEditor.commands.insertContent(preTag({ language: 'javascript' }));
bubbleMenu = wrapper.findComponent(BubbleMenu);
await emitEditorEvent({ event: 'transaction', tiptapEditor });
@@ -90,7 +96,7 @@ describe('content_editor/components/bubble_menus/code_block', () => {
});
it('selects diagram sytnax for mermaid', async () => {
- tiptapEditor.commands.insertContent('<pre lang="mermaid">test</pre>');
+ tiptapEditor.commands.insertContent(preTag({ language: 'mermaid' }));
bubbleMenu = wrapper.findComponent(BubbleMenu);
await emitEditorEvent({ event: 'transaction', tiptapEditor });
@@ -99,7 +105,7 @@ describe('content_editor/components/bubble_menus/code_block', () => {
});
it("selects Custom (syntax) if the language doesn't exist in the list", async () => {
- tiptapEditor.commands.insertContent('<pre lang="nomnoml">test</pre>');
+ tiptapEditor.commands.insertContent(preTag({ language: 'nomnoml' }));
bubbleMenu = wrapper.findComponent(BubbleMenu);
await emitEditorEvent({ event: 'transaction', tiptapEditor });
@@ -109,19 +115,20 @@ describe('content_editor/components/bubble_menus/code_block', () => {
describe('copy button', () => {
it('copies the text of the code block', async () => {
+ const content = 'var a = Math.PI / 2;';
jest.spyOn(navigator.clipboard, 'writeText');
- tiptapEditor.commands.insertContent('<pre lang="javascript">var a = Math.PI / 2;</pre>');
+ tiptapEditor.commands.insertContent(preTag({ language: 'javascript', content }));
await wrapper.findByTestId('copy-code-block').vm.$emit('click');
- expect(navigator.clipboard.writeText).toHaveBeenCalledWith('var a = Math.PI / 2;');
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith(content);
});
});
describe('delete button', () => {
it('deletes the code block', async () => {
- tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+ tiptapEditor.commands.insertContent(preTag({ language: 'javascript' }));
await wrapper.findByTestId('delete-code-block').vm.$emit('click');
@@ -164,7 +171,7 @@ describe('content_editor/components/bubble_menus/code_block', () => {
describe('when opened and search is changed', () => {
beforeEach(async () => {
- tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+ tiptapEditor.commands.insertContent(preTag({ language: 'javascript' }));
wrapper.findComponent(GlSearchBoxByType).vm.$emit('input', 'js');
diff --git a/spec/frontend/content_editor/components/bubble_menus/formatting_spec.js b/spec/frontend/content_editor/components/bubble_menus/formatting_spec.js
index 6479c0ba008..1e2f58d9e40 100644
--- a/spec/frontend/content_editor/components/bubble_menus/formatting_spec.js
+++ b/spec/frontend/content_editor/components/bubble_menus/formatting_spec.js
@@ -46,12 +46,14 @@ describe('content_editor/components/bubble_menus/formatting', () => {
});
describe.each`
- testId | controlProps
- ${'bold'} | ${{ contentType: 'bold', iconName: 'bold', label: 'Bold text', editorCommand: 'toggleBold', size: 'medium', category: 'tertiary' }}
- ${'italic'} | ${{ contentType: 'italic', iconName: 'italic', label: 'Italic text', editorCommand: 'toggleItalic', size: 'medium', category: 'tertiary' }}
- ${'strike'} | ${{ contentType: 'strike', iconName: 'strikethrough', label: 'Strikethrough', editorCommand: 'toggleStrike', size: 'medium', category: 'tertiary' }}
- ${'code'} | ${{ contentType: 'code', iconName: 'code', label: 'Code', editorCommand: 'toggleCode', size: 'medium', category: 'tertiary' }}
- ${'link'} | ${{ contentType: 'link', iconName: 'link', label: 'Insert link', editorCommand: 'toggleLink', editorCommandParams: { href: '' }, size: 'medium', category: 'tertiary' }}
+ 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' }}
+ ${'superscript'} | ${{ contentType: 'superscript', iconName: 'superscript', label: 'Superscript', editorCommand: 'toggleSuperscript' }}
+ ${'subscript'} | ${{ contentType: 'subscript', iconName: 'subscript', label: 'Subscript', editorCommand: 'toggleSubscript' }}
+ ${'link'} | ${{ contentType: 'link', iconName: 'link', label: 'Insert link', editorCommand: 'toggleLink', editorCommandParams: { href: '' } }}
`('given a $testId toolbar control', ({ testId, controlProps }) => {
beforeEach(() => {
buildWrapper();
@@ -60,9 +62,13 @@ describe('content_editor/components/bubble_menus/formatting', () => {
it('renders the toolbar control with the provided properties', () => {
expect(wrapper.findByTestId(testId).exists()).toBe(true);
- Object.keys(controlProps).forEach((propName) => {
- expect(wrapper.findByTestId(testId).props(propName)).toEqual(controlProps[propName]);
- });
+ expect(wrapper.findByTestId(testId).props()).toEqual(
+ expect.objectContaining({
+ ...controlProps,
+ size: 'medium',
+ category: 'tertiary',
+ }),
+ );
});
it('tracks the execution of toolbar controls', () => {
diff --git a/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js b/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js
index 0334a18c9a1..351fd967719 100644
--- a/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js
+++ b/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js
@@ -2,22 +2,26 @@ import { mountExtended } from 'helpers/vue_test_utils_helper';
import ToolbarMoreDropdown from '~/content_editor/components/toolbar_more_dropdown.vue';
import Diagram from '~/content_editor/extensions/diagram';
import HorizontalRule from '~/content_editor/extensions/horizontal_rule';
-import { createTestEditor, mockChainedCommands } from '../test_utils';
+import eventHubFactory from '~/helpers/event_hub_factory';
+import { createTestEditor, mockChainedCommands, emitEditorEvent } from '../test_utils';
describe('content_editor/components/toolbar_more_dropdown', () => {
let wrapper;
let tiptapEditor;
+ let eventHub;
const buildEditor = () => {
tiptapEditor = createTestEditor({
extensions: [Diagram, HorizontalRule],
});
+ eventHub = eventHubFactory();
};
const buildWrapper = (propsData = {}) => {
wrapper = mountExtended(ToolbarMoreDropdown, {
provide: {
tiptapEditor,
+ eventHub,
},
propsData,
});
@@ -33,19 +37,30 @@ describe('content_editor/components/toolbar_more_dropdown', () => {
});
describe.each`
- label | contentType | data
- ${'Mermaid diagram'} | ${'diagram'} | ${{ language: 'mermaid' }}
- ${'PlantUML diagram'} | ${'diagram'} | ${{ language: 'plantuml' }}
- ${'Horizontal rule'} | ${'horizontalRule'} | ${undefined}
- `('when option $label is clicked', ({ label, contentType, data }) => {
- it(`inserts a ${contentType}`, async () => {
- const commands = mockChainedCommands(tiptapEditor, ['setNode', 'focus', 'run']);
+ name | contentType | command | params
+ ${'Code block'} | ${'codeBlock'} | ${'setNode'} | ${['codeBlock']}
+ ${'Details block'} | ${'details'} | ${'toggleList'} | ${['details', 'detailsContent']}
+ ${'Bullet list'} | ${'bulletList'} | ${'toggleList'} | ${['bulletList', 'listItem']}
+ ${'Ordered list'} | ${'orderedList'} | ${'toggleList'} | ${['orderedList', 'listItem']}
+ ${'Task list'} | ${'taskList'} | ${'toggleList'} | ${['taskList', 'taskItem']}
+ ${'Mermaid diagram'} | ${'diagram'} | ${'setNode'} | ${['diagram', { language: 'mermaid' }]}
+ ${'PlantUML diagram'} | ${'diagram'} | ${'setNode'} | ${['diagram', { language: 'plantuml' }]}
+ ${'Horizontal rule'} | ${'horizontalRule'} | ${'setHorizontalRule'} | ${[]}
+ `('when option $label is clicked', ({ name, command, contentType, params }) => {
+ let commands;
+ let btn;
+
+ beforeEach(async () => {
+ commands = mockChainedCommands(tiptapEditor, [command, 'focus', 'run']);
+ btn = wrapper.findByRole('menuitem', { name });
+ });
- const btn = wrapper.findByRole('menuitem', { name: label });
+ it(`inserts a ${contentType}`, async () => {
await btn.trigger('click');
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
expect(commands.focus).toHaveBeenCalled();
- expect(commands.setNode).toHaveBeenCalledWith(contentType, data);
+ expect(commands[command]).toHaveBeenCalledWith(...params);
expect(commands.run).toHaveBeenCalled();
expect(wrapper.emitted('execute')).toEqual([[{ contentType }]]);
diff --git a/spec/frontend/content_editor/components/top_toolbar_spec.js b/spec/frontend/content_editor/components/top_toolbar_spec.js
index d98a9a52aff..2acb6e14ce0 100644
--- a/spec/frontend/content_editor/components/top_toolbar_spec.js
+++ b/spec/frontend/content_editor/components/top_toolbar_spec.js
@@ -24,17 +24,15 @@ describe('content_editor/components/top_toolbar', () => {
describe.each`
testId | controlProps
+ ${'text-styles'} | ${{}}
${'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' }}
+ ${'code'} | ${{ contentType: 'code', iconName: 'code', label: 'Code', editorCommand: 'toggleCode' }}
+ ${'link'} | ${{}}
${'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' }}
- ${'details'} | ${{ contentType: 'details', iconName: 'details-block', label: 'Add a collapsible section', editorCommand: 'toggleDetails' }}
- ${'code-block'} | ${{ contentType: 'codeBlock', iconName: 'doc-code', label: 'Insert a code block', editorCommand: 'toggleCodeBlock' }}
- ${'text-styles'} | ${{}}
- ${'link'} | ${{}}
+ ${'task-list'} | ${{ contentType: 'taskList', iconName: 'list-task', label: 'Add a task list', editorCommand: 'toggleTaskList' }}
${'image'} | ${{}}
${'table'} | ${{}}
${'more'} | ${{}}
diff --git a/spec/frontend/content_editor/extensions/html_nodes_spec.js b/spec/frontend/content_editor/extensions/html_nodes_spec.js
new file mode 100644
index 00000000000..24c68239025
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/html_nodes_spec.js
@@ -0,0 +1,42 @@
+import HTMLNodes from '~/content_editor/extensions/html_nodes';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/html_nodes', () => {
+ let tiptapEditor;
+ let doc;
+ let div;
+ let pre;
+ let p;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({ extensions: [...HTMLNodes] });
+
+ ({
+ builders: { doc, p, pre, div },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ ...HTMLNodes.reduce(
+ (builders, htmlNode) => ({
+ ...builders,
+ [htmlNode.name]: { nodeType: htmlNode.name },
+ }),
+ {},
+ ),
+ },
+ }));
+ });
+
+ it.each`
+ input | insertedNodes
+ ${'<div><p>foo</p></div>'} | ${() => div(p('foo'))}
+ ${'<pre><p>foo</p></pre>'} | ${() => pre(p('foo'))}
+ `('parses and creates nodes for $input', ({ input, insertedNodes }) => {
+ const expectedDoc = doc(insertedNodes());
+
+ tiptapEditor.commands.setContent(input);
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ expect(tiptapEditor.getHTML()).toEqual(input);
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/paste_markdown_spec.js b/spec/frontend/content_editor/extensions/paste_markdown_spec.js
index 5d46c2c0650..53efda6aee2 100644
--- a/spec/frontend/content_editor/extensions/paste_markdown_spec.js
+++ b/spec/frontend/content_editor/extensions/paste_markdown_spec.js
@@ -14,7 +14,7 @@ import {
import waitForPromises from 'helpers/wait_for_promises';
import { createTestEditor, createDocBuilder, waitUntilNextDocTransaction } from '../test_utils';
-const CODE_BLOCK_HTML = '<pre lang="javascript">var a = 2;</pre>';
+const CODE_BLOCK_HTML = '<pre class="js-syntax-highlight" lang="javascript">var a = 2;</pre>';
const DIAGRAM_HTML =
'<img data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,WzxmcmFtZT5EZWNvcmF0b3IgcGF0dGVybl0=">';
const FRONTMATTER_HTML = '<pre lang="yaml" data-lang-params="frontmatter">key: value</pre>';
diff --git a/spec/frontend/content_editor/markdown_snapshot_spec.js b/spec/frontend/content_editor/markdown_snapshot_spec.js
new file mode 100644
index 00000000000..63ca66172e6
--- /dev/null
+++ b/spec/frontend/content_editor/markdown_snapshot_spec.js
@@ -0,0 +1,10 @@
+import path from 'path';
+import { describeMarkdownSnapshots } from 'jest/content_editor/markdown_snapshot_spec_helper';
+
+jest.mock('~/emoji');
+
+const glfmSpecificationDir = path.join(__dirname, '..', '..', '..', 'glfm_specification');
+
+// See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
+// for documentation on this spec.
+describeMarkdownSnapshots('CE markdown snapshots in ContentEditor', glfmSpecificationDir);
diff --git a/spec/frontend/content_editor/markdown_snapshot_spec_helper.js b/spec/frontend/content_editor/markdown_snapshot_spec_helper.js
new file mode 100644
index 00000000000..05fa8e6a6b2
--- /dev/null
+++ b/spec/frontend/content_editor/markdown_snapshot_spec_helper.js
@@ -0,0 +1,102 @@
+// See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
+// for documentation on this spec.
+
+import fs from 'fs';
+import path from 'path';
+import jsYaml from 'js-yaml';
+import { pick } from 'lodash';
+import {
+ IMPLEMENTATION_ERROR_MSG,
+ renderHtmlAndJsonForAllExamples,
+} from './render_html_and_json_for_all_examples';
+
+const filterExamples = (examples) => {
+ const focusedMarkdownExamples = process.env.FOCUSED_MARKDOWN_EXAMPLES?.split(',') || [];
+ if (!focusedMarkdownExamples.length) {
+ return examples;
+ }
+ return pick(examples, focusedMarkdownExamples);
+};
+
+const loadExamples = (dir, fileName) => {
+ const yaml = fs.readFileSync(path.join(dir, fileName));
+ const examples = jsYaml.safeLoad(yaml, {});
+ return filterExamples(examples);
+};
+
+// eslint-disable-next-line jest/no-export
+export const describeMarkdownSnapshots = (description, glfmSpecificationDir) => {
+ let actualHtmlAndJsonExamples;
+ let skipRunningSnapshotWysiwygHtmlTests;
+ let skipRunningSnapshotProsemirrorJsonTests;
+
+ const exampleStatuses = loadExamples(
+ path.join(glfmSpecificationDir, 'input', 'gitlab_flavored_markdown'),
+ 'glfm_example_status.yml',
+ );
+ const glfmExampleSnapshotsDir = path.join(glfmSpecificationDir, 'example_snapshots');
+ const markdownExamples = loadExamples(glfmExampleSnapshotsDir, 'markdown.yml');
+ const expectedHtmlExamples = loadExamples(glfmExampleSnapshotsDir, 'html.yml');
+ const expectedProseMirrorJsonExamples = loadExamples(
+ glfmExampleSnapshotsDir,
+ 'prosemirror_json.yml',
+ );
+
+ beforeAll(async () => {
+ return renderHtmlAndJsonForAllExamples(markdownExamples).then((examples) => {
+ actualHtmlAndJsonExamples = examples;
+ });
+ });
+
+ describe(description, () => {
+ const exampleNames = Object.keys(markdownExamples);
+
+ describe.each(exampleNames)('%s', (name) => {
+ const exampleNamePrefix = 'verifies conversion of GLFM to';
+ skipRunningSnapshotWysiwygHtmlTests =
+ exampleStatuses[name]?.skip_running_snapshot_wysiwyg_html_tests;
+ skipRunningSnapshotProsemirrorJsonTests =
+ exampleStatuses[name]?.skip_running_snapshot_prosemirror_json_tests;
+
+ const markdown = markdownExamples[name];
+
+ if (skipRunningSnapshotWysiwygHtmlTests) {
+ it.todo(`${exampleNamePrefix} HTML: ${skipRunningSnapshotWysiwygHtmlTests}`);
+ } else {
+ it(`${exampleNamePrefix} HTML`, async () => {
+ const expectedHtml = expectedHtmlExamples[name].wysiwyg;
+ const { html: actualHtml } = actualHtmlAndJsonExamples[name];
+
+ // noinspection JSUnresolvedFunction (required to avoid RubyMine type inspection warning, because custom matchers auto-imported via Jest test setup are not automatically resolved - see https://youtrack.jetbrains.com/issue/WEB-42350/matcher-for-jest-is-not-recognized-but-it-is-runable)
+ expect(actualHtml).toMatchExpectedForMarkdown(
+ 'HTML',
+ name,
+ markdown,
+ IMPLEMENTATION_ERROR_MSG,
+ expectedHtml,
+ );
+ });
+ }
+
+ if (skipRunningSnapshotProsemirrorJsonTests) {
+ it.todo(
+ `${exampleNamePrefix} ProseMirror JSON: ${skipRunningSnapshotProsemirrorJsonTests}`,
+ );
+ } else {
+ it(`${exampleNamePrefix} ProseMirror JSON`, async () => {
+ const expectedJson = expectedProseMirrorJsonExamples[name];
+ const { json: actualJson } = actualHtmlAndJsonExamples[name];
+
+ // noinspection JSUnresolvedFunction
+ expect(actualJson).toMatchExpectedForMarkdown(
+ 'JSON',
+ name,
+ markdown,
+ IMPLEMENTATION_ERROR_MSG,
+ expectedJson,
+ );
+ });
+ }
+ });
+ });
+};
diff --git a/spec/frontend/content_editor/remark_markdown_processing_spec.js b/spec/frontend/content_editor/remark_markdown_processing_spec.js
index 60dc540e192..48adceaab58 100644
--- a/spec/frontend/content_editor/remark_markdown_processing_spec.js
+++ b/spec/frontend/content_editor/remark_markdown_processing_spec.js
@@ -6,6 +6,7 @@ import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight
import FootnoteDefinition from '~/content_editor/extensions/footnote_definition';
import FootnoteReference from '~/content_editor/extensions/footnote_reference';
import HardBreak from '~/content_editor/extensions/hard_break';
+import HTMLNodes from '~/content_editor/extensions/html_nodes';
import Heading from '~/content_editor/extensions/heading';
import HorizontalRule from '~/content_editor/extensions/horizontal_rule';
import Image from '~/content_editor/extensions/image';
@@ -52,6 +53,7 @@ const tiptapEditor = createTestEditor({
TableCell,
TaskList,
TaskItem,
+ ...HTMLNodes,
],
});
@@ -64,6 +66,7 @@ const {
bulletList,
code,
codeBlock,
+ div,
footnoteDefinition,
footnoteReference,
hardBreak,
@@ -74,6 +77,7 @@ const {
link,
listItem,
orderedList,
+ pre,
strike,
table,
tableRow,
@@ -108,14 +112,21 @@ const {
tableRow: { nodeType: TableRow.name },
taskItem: { nodeType: TaskItem.name },
taskList: { nodeType: TaskList.name },
+ ...HTMLNodes.reduce(
+ (builders, htmlNode) => ({
+ ...builders,
+ [htmlNode.name]: { nodeType: htmlNode.name },
+ }),
+ {},
+ ),
},
});
describe('Client side Markdown processing', () => {
- const deserialize = async (content) => {
+ const deserialize = async (markdown) => {
const { document } = await remarkMarkdownDeserializer().deserialize({
schema: tiptapEditor.schema,
- content,
+ markdown,
});
return document;
@@ -127,8 +138,8 @@ describe('Client side Markdown processing', () => {
pristineDoc: document,
});
- const sourceAttrs = (sourceMapKey, sourceMarkdown) => ({
- sourceMapKey,
+ const source = (sourceMarkdown) => ({
+ sourceMapKey: expect.any(String),
sourceMarkdown,
});
@@ -136,63 +147,48 @@ describe('Client side Markdown processing', () => {
{
markdown: '__bold text__',
expectedDoc: doc(
- paragraph(
- sourceAttrs('0:13', '__bold text__'),
- bold(sourceAttrs('0:13', '__bold text__'), 'bold text'),
- ),
+ paragraph(source('__bold text__'), bold(source('__bold text__'), 'bold text')),
),
},
{
markdown: '**bold text**',
expectedDoc: doc(
- paragraph(
- sourceAttrs('0:13', '**bold text**'),
- bold(sourceAttrs('0:13', '**bold text**'), 'bold text'),
- ),
+ paragraph(source('**bold text**'), bold(source('**bold text**'), 'bold text')),
),
},
{
markdown: '<strong>bold text</strong>',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:26', '<strong>bold text</strong>'),
- bold(sourceAttrs('0:26', '<strong>bold text</strong>'), 'bold text'),
+ source('<strong>bold text</strong>'),
+ bold(source('<strong>bold text</strong>'), 'bold text'),
),
),
},
{
markdown: '<b>bold text</b>',
expectedDoc: doc(
- paragraph(
- sourceAttrs('0:16', '<b>bold text</b>'),
- bold(sourceAttrs('0:16', '<b>bold text</b>'), 'bold text'),
- ),
+ paragraph(source('<b>bold text</b>'), bold(source('<b>bold text</b>'), 'bold text')),
),
},
{
markdown: '_italic text_',
expectedDoc: doc(
- paragraph(
- sourceAttrs('0:13', '_italic text_'),
- italic(sourceAttrs('0:13', '_italic text_'), 'italic text'),
- ),
+ paragraph(source('_italic text_'), italic(source('_italic text_'), 'italic text')),
),
},
{
markdown: '*italic text*',
expectedDoc: doc(
- paragraph(
- sourceAttrs('0:13', '*italic text*'),
- italic(sourceAttrs('0:13', '*italic text*'), 'italic text'),
- ),
+ paragraph(source('*italic text*'), italic(source('*italic text*'), 'italic text')),
),
},
{
markdown: '<em>italic text</em>',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:20', '<em>italic text</em>'),
- italic(sourceAttrs('0:20', '<em>italic text</em>'), 'italic text'),
+ source('<em>italic text</em>'),
+ italic(source('<em>italic text</em>'), 'italic text'),
),
),
},
@@ -200,28 +196,25 @@ describe('Client side Markdown processing', () => {
markdown: '<i>italic text</i>',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:18', '<i>italic text</i>'),
- italic(sourceAttrs('0:18', '<i>italic text</i>'), 'italic text'),
+ source('<i>italic text</i>'),
+ italic(source('<i>italic text</i>'), 'italic text'),
),
),
},
{
markdown: '`inline code`',
expectedDoc: doc(
- paragraph(
- sourceAttrs('0:13', '`inline code`'),
- code(sourceAttrs('0:13', '`inline code`'), 'inline code'),
- ),
+ paragraph(source('`inline code`'), code(source('`inline code`'), 'inline code')),
),
},
{
markdown: '**`inline code bold`**',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:22', '**`inline code bold`**'),
+ source('**`inline code bold`**'),
bold(
- sourceAttrs('0:22', '**`inline code bold`**'),
- code(sourceAttrs('2:20', '`inline code bold`'), 'inline code bold'),
+ source('**`inline code bold`**'),
+ code(source('`inline code bold`'), 'inline code bold'),
),
),
),
@@ -230,10 +223,10 @@ describe('Client side Markdown processing', () => {
markdown: '_`inline code italics`_',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:23', '_`inline code italics`_'),
+ source('_`inline code italics`_'),
italic(
- sourceAttrs('0:23', '_`inline code italics`_'),
- code(sourceAttrs('1:22', '`inline code italics`'), 'inline code italics'),
+ source('_`inline code italics`_'),
+ code(source('`inline code italics`'), 'inline code italics'),
),
),
),
@@ -246,8 +239,8 @@ describe('Client side Markdown processing', () => {
`,
expectedDoc: doc(
paragraph(
- sourceAttrs('0:28', '<i class="foo">\n *bar*\n</i>'),
- italic(sourceAttrs('0:28', '<i class="foo">\n *bar*\n</i>'), '\n *bar*\n'),
+ source('<i class="foo">\n *bar*\n</i>'),
+ italic(source('<i class="foo">\n *bar*\n</i>'), '\n *bar*\n'),
),
),
},
@@ -259,8 +252,8 @@ describe('Client side Markdown processing', () => {
`,
expectedDoc: doc(
paragraph(
- sourceAttrs('0:27', '<img src="bar" alt="foo" />'),
- image({ ...sourceAttrs('0:27', '<img src="bar" alt="foo" />'), alt: 'foo', src: 'bar' }),
+ source('<img src="bar" alt="foo" />'),
+ image({ ...source('<img src="bar" alt="foo" />'), alt: 'foo', src: 'bar' }),
),
),
},
@@ -273,15 +266,12 @@ describe('Client side Markdown processing', () => {
`,
expectedDoc: doc(
bulletList(
- sourceAttrs('0:13', '- List item 1'),
- listItem(
- sourceAttrs('0:13', '- List item 1'),
- paragraph(sourceAttrs('2:13', 'List item 1'), 'List item 1'),
- ),
+ source('- List item 1'),
+ listItem(source('- List item 1'), paragraph(source('List item 1'), 'List item 1')),
),
paragraph(
- sourceAttrs('15:42', '<img src="bar" alt="foo" />'),
- image({ ...sourceAttrs('15:42', '<img src="bar" alt="foo" />'), alt: 'foo', src: 'bar' }),
+ source('<img src="bar" alt="foo" />'),
+ image({ ...source('<img src="bar" alt="foo" />'), alt: 'foo', src: 'bar' }),
),
),
},
@@ -289,10 +279,10 @@ describe('Client side Markdown processing', () => {
markdown: '[GitLab](https://gitlab.com "Go to GitLab")',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:43', '[GitLab](https://gitlab.com "Go to GitLab")'),
+ source('[GitLab](https://gitlab.com "Go to GitLab")'),
link(
{
- ...sourceAttrs('0:43', '[GitLab](https://gitlab.com "Go to GitLab")'),
+ ...source('[GitLab](https://gitlab.com "Go to GitLab")'),
href: 'https://gitlab.com',
title: 'Go to GitLab',
},
@@ -305,12 +295,12 @@ describe('Client side Markdown processing', () => {
markdown: '**[GitLab](https://gitlab.com "Go to GitLab")**',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:47', '**[GitLab](https://gitlab.com "Go to GitLab")**'),
+ source('**[GitLab](https://gitlab.com "Go to GitLab")**'),
bold(
- sourceAttrs('0:47', '**[GitLab](https://gitlab.com "Go to GitLab")**'),
+ source('**[GitLab](https://gitlab.com "Go to GitLab")**'),
link(
{
- ...sourceAttrs('2:45', '[GitLab](https://gitlab.com "Go to GitLab")'),
+ ...source('[GitLab](https://gitlab.com "Go to GitLab")'),
href: 'https://gitlab.com',
title: 'Go to GitLab',
},
@@ -324,10 +314,10 @@ describe('Client side Markdown processing', () => {
markdown: 'www.commonmark.org',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:18', 'www.commonmark.org'),
+ source('www.commonmark.org'),
link(
{
- ...sourceAttrs('0:18', 'www.commonmark.org'),
+ ...source('www.commonmark.org'),
href: 'http://www.commonmark.org',
},
'www.commonmark.org',
@@ -339,11 +329,11 @@ describe('Client side Markdown processing', () => {
markdown: 'Visit www.commonmark.org/help for more information.',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:51', 'Visit www.commonmark.org/help for more information.'),
+ source('Visit www.commonmark.org/help for more information.'),
'Visit ',
link(
{
- ...sourceAttrs('6:29', 'www.commonmark.org/help'),
+ ...source('www.commonmark.org/help'),
href: 'http://www.commonmark.org/help',
},
'www.commonmark.org/help',
@@ -356,11 +346,11 @@ describe('Client side Markdown processing', () => {
markdown: 'hello@mail+xyz.example isn’t valid, but hello+xyz@mail.example is.',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:66', 'hello@mail+xyz.example isn’t valid, but hello+xyz@mail.example is.'),
+ source('hello@mail+xyz.example isn’t valid, but hello+xyz@mail.example is.'),
'hello@mail+xyz.example isn’t valid, but ',
link(
{
- ...sourceAttrs('40:62', 'hello+xyz@mail.example'),
+ ...source('hello+xyz@mail.example'),
href: 'mailto:hello+xyz@mail.example',
},
'hello+xyz@mail.example',
@@ -373,11 +363,12 @@ describe('Client side Markdown processing', () => {
markdown: '[https://gitlab.com>',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:20', '[https://gitlab.com>'),
+ source('[https://gitlab.com>'),
'[',
link(
{
- ...sourceAttrs(),
+ sourceMapKey: null,
+ sourceMarkdown: null,
href: 'https://gitlab.com',
},
'https://gitlab.com',
@@ -392,9 +383,9 @@ This is a paragraph with a\\
hard line break`,
expectedDoc: doc(
paragraph(
- sourceAttrs('0:43', 'This is a paragraph with a\\\nhard line break'),
+ source('This is a paragraph with a\\\nhard line break'),
'This is a paragraph with a',
- hardBreak(sourceAttrs('26:28', '\\\n')),
+ hardBreak(source('\\\n')),
'\nhard line break',
),
),
@@ -403,9 +394,9 @@ hard line break`,
markdown: '![GitLab Logo](https://gitlab.com/logo.png "GitLab Logo")',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:57', '![GitLab Logo](https://gitlab.com/logo.png "GitLab Logo")'),
+ source('![GitLab Logo](https://gitlab.com/logo.png "GitLab Logo")'),
image({
- ...sourceAttrs('0:57', '![GitLab Logo](https://gitlab.com/logo.png "GitLab Logo")'),
+ ...source('![GitLab Logo](https://gitlab.com/logo.png "GitLab Logo")'),
alt: 'GitLab Logo',
src: 'https://gitlab.com/logo.png',
title: 'GitLab Logo',
@@ -415,49 +406,43 @@ hard line break`,
},
{
markdown: '---',
- expectedDoc: doc(horizontalRule(sourceAttrs('0:3', '---'))),
+ expectedDoc: doc(horizontalRule(source('---'))),
},
{
markdown: '***',
- expectedDoc: doc(horizontalRule(sourceAttrs('0:3', '***'))),
+ expectedDoc: doc(horizontalRule(source('***'))),
},
{
markdown: '___',
- expectedDoc: doc(horizontalRule(sourceAttrs('0:3', '___'))),
+ expectedDoc: doc(horizontalRule(source('___'))),
},
{
markdown: '<hr>',
- expectedDoc: doc(horizontalRule(sourceAttrs('0:4', '<hr>'))),
+ expectedDoc: doc(horizontalRule(source('<hr>'))),
},
{
markdown: '# Heading 1',
- expectedDoc: doc(heading({ ...sourceAttrs('0:11', '# Heading 1'), level: 1 }, 'Heading 1')),
+ expectedDoc: doc(heading({ ...source('# Heading 1'), level: 1 }, 'Heading 1')),
},
{
markdown: '## Heading 2',
- expectedDoc: doc(heading({ ...sourceAttrs('0:12', '## Heading 2'), level: 2 }, 'Heading 2')),
+ expectedDoc: doc(heading({ ...source('## Heading 2'), level: 2 }, 'Heading 2')),
},
{
markdown: '### Heading 3',
- expectedDoc: doc(heading({ ...sourceAttrs('0:13', '### Heading 3'), level: 3 }, 'Heading 3')),
+ expectedDoc: doc(heading({ ...source('### Heading 3'), level: 3 }, 'Heading 3')),
},
{
markdown: '#### Heading 4',
- expectedDoc: doc(
- heading({ ...sourceAttrs('0:14', '#### Heading 4'), level: 4 }, 'Heading 4'),
- ),
+ expectedDoc: doc(heading({ ...source('#### Heading 4'), level: 4 }, 'Heading 4')),
},
{
markdown: '##### Heading 5',
- expectedDoc: doc(
- heading({ ...sourceAttrs('0:15', '##### Heading 5'), level: 5 }, 'Heading 5'),
- ),
+ expectedDoc: doc(heading({ ...source('##### Heading 5'), level: 5 }, 'Heading 5')),
},
{
markdown: '###### Heading 6',
- expectedDoc: doc(
- heading({ ...sourceAttrs('0:16', '###### Heading 6'), level: 6 }, 'Heading 6'),
- ),
+ expectedDoc: doc(heading({ ...source('###### Heading 6'), level: 6 }, 'Heading 6')),
},
{
markdown: `
@@ -465,9 +450,7 @@ Heading
one
======
`,
- expectedDoc: doc(
- heading({ ...sourceAttrs('0:18', 'Heading\none\n======'), level: 1 }, 'Heading\none'),
- ),
+ expectedDoc: doc(heading({ ...source('Heading\none\n======'), level: 1 }, 'Heading\none')),
},
{
markdown: `
@@ -475,9 +458,7 @@ Heading
two
-------
`,
- expectedDoc: doc(
- heading({ ...sourceAttrs('0:19', 'Heading\ntwo\n-------'), level: 2 }, 'Heading\ntwo'),
- ),
+ expectedDoc: doc(heading({ ...source('Heading\ntwo\n-------'), level: 2 }, 'Heading\ntwo')),
},
{
markdown: `
@@ -486,15 +467,9 @@ two
`,
expectedDoc: doc(
bulletList(
- sourceAttrs('0:27', '- List item 1\n- List item 2'),
- listItem(
- sourceAttrs('0:13', '- List item 1'),
- paragraph(sourceAttrs('2:13', 'List item 1'), 'List item 1'),
- ),
- listItem(
- sourceAttrs('14:27', '- List item 2'),
- paragraph(sourceAttrs('16:27', 'List item 2'), 'List item 2'),
- ),
+ source('- List item 1\n- List item 2'),
+ listItem(source('- List item 1'), paragraph(source('List item 1'), 'List item 1')),
+ listItem(source('- List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
},
@@ -505,15 +480,9 @@ two
`,
expectedDoc: doc(
bulletList(
- sourceAttrs('0:27', '* List item 1\n* List item 2'),
- listItem(
- sourceAttrs('0:13', '* List item 1'),
- paragraph(sourceAttrs('2:13', 'List item 1'), 'List item 1'),
- ),
- listItem(
- sourceAttrs('14:27', '* List item 2'),
- paragraph(sourceAttrs('16:27', 'List item 2'), 'List item 2'),
- ),
+ source('* List item 1\n* List item 2'),
+ listItem(source('* List item 1'), paragraph(source('List item 1'), 'List item 1')),
+ listItem(source('* List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
},
@@ -524,15 +493,9 @@ two
`,
expectedDoc: doc(
bulletList(
- sourceAttrs('0:27', '+ List item 1\n+ List item 2'),
- listItem(
- sourceAttrs('0:13', '+ List item 1'),
- paragraph(sourceAttrs('2:13', 'List item 1'), 'List item 1'),
- ),
- listItem(
- sourceAttrs('14:27', '+ List item 2'),
- paragraph(sourceAttrs('16:27', 'List item 2'), 'List item 2'),
- ),
+ source('+ List item 1\n+ List item 2'),
+ listItem(source('+ List item 1'), paragraph(source('List item 1'), 'List item 1')),
+ listItem(source('+ List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
},
@@ -543,15 +506,9 @@ two
`,
expectedDoc: doc(
orderedList(
- sourceAttrs('0:29', '1. List item 1\n1. List item 2'),
- listItem(
- sourceAttrs('0:14', '1. List item 1'),
- paragraph(sourceAttrs('3:14', 'List item 1'), 'List item 1'),
- ),
- listItem(
- sourceAttrs('15:29', '1. List item 2'),
- paragraph(sourceAttrs('18:29', 'List item 2'), 'List item 2'),
- ),
+ source('1. List item 1\n1. List item 2'),
+ listItem(source('1. List item 1'), paragraph(source('List item 1'), 'List item 1')),
+ listItem(source('1. List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
},
@@ -562,15 +519,9 @@ two
`,
expectedDoc: doc(
orderedList(
- sourceAttrs('0:29', '1. List item 1\n2. List item 2'),
- listItem(
- sourceAttrs('0:14', '1. List item 1'),
- paragraph(sourceAttrs('3:14', 'List item 1'), 'List item 1'),
- ),
- listItem(
- sourceAttrs('15:29', '2. List item 2'),
- paragraph(sourceAttrs('18:29', 'List item 2'), 'List item 2'),
- ),
+ source('1. List item 1\n2. List item 2'),
+ listItem(source('1. List item 1'), paragraph(source('List item 1'), 'List item 1')),
+ listItem(source('2. List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
},
@@ -581,15 +532,9 @@ two
`,
expectedDoc: doc(
orderedList(
- sourceAttrs('0:29', '1) List item 1\n2) List item 2'),
- listItem(
- sourceAttrs('0:14', '1) List item 1'),
- paragraph(sourceAttrs('3:14', 'List item 1'), 'List item 1'),
- ),
- listItem(
- sourceAttrs('15:29', '2) List item 2'),
- paragraph(sourceAttrs('18:29', 'List item 2'), 'List item 2'),
- ),
+ source('1) List item 1\n2) List item 2'),
+ listItem(source('1) List item 1'), paragraph(source('List item 1'), 'List item 1')),
+ listItem(source('2) List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
},
@@ -600,15 +545,15 @@ two
`,
expectedDoc: doc(
bulletList(
- sourceAttrs('0:33', '- List item 1\n - Sub list item 1'),
+ source('- List item 1\n - Sub list item 1'),
listItem(
- sourceAttrs('0:33', '- List item 1\n - Sub list item 1'),
- paragraph(sourceAttrs('2:13', 'List item 1'), 'List item 1'),
+ source('- List item 1\n - Sub list item 1'),
+ paragraph(source('List item 1'), 'List item 1'),
bulletList(
- sourceAttrs('16:33', '- Sub list item 1'),
+ source('- Sub list item 1'),
listItem(
- sourceAttrs('16:33', '- Sub list item 1'),
- paragraph(sourceAttrs('18:33', 'Sub list item 1'), 'Sub list item 1'),
+ source('- Sub list item 1'),
+ paragraph(source('Sub list item 1'), 'Sub list item 1'),
),
),
),
@@ -624,19 +569,13 @@ two
`,
expectedDoc: doc(
bulletList(
- sourceAttrs(
- '0:66',
- '- List item 1 paragraph 1\n\n List item 1 paragraph 2\n- List item 2',
- ),
- listItem(
- sourceAttrs('0:52', '- List item 1 paragraph 1\n\n List item 1 paragraph 2'),
- paragraph(sourceAttrs('2:25', 'List item 1 paragraph 1'), 'List item 1 paragraph 1'),
- paragraph(sourceAttrs('29:52', 'List item 1 paragraph 2'), 'List item 1 paragraph 2'),
- ),
+ source('- List item 1 paragraph 1\n\n List item 1 paragraph 2\n- List item 2'),
listItem(
- sourceAttrs('53:66', '- List item 2'),
- paragraph(sourceAttrs('55:66', 'List item 2'), 'List item 2'),
+ source('- List item 1 paragraph 1\n\n List item 1 paragraph 2'),
+ paragraph(source('List item 1 paragraph 1'), 'List item 1 paragraph 1'),
+ paragraph(source('List item 1 paragraph 2'), 'List item 1 paragraph 2'),
),
+ listItem(source('- List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
},
@@ -646,13 +585,13 @@ two
`,
expectedDoc: doc(
bulletList(
- sourceAttrs('0:41', '- List item with an image ![bar](foo.png)'),
+ source('- List item with an image ![bar](foo.png)'),
listItem(
- sourceAttrs('0:41', '- List item with an image ![bar](foo.png)'),
+ source('- List item with an image ![bar](foo.png)'),
paragraph(
- sourceAttrs('2:41', 'List item with an image ![bar](foo.png)'),
+ source('List item with an image ![bar](foo.png)'),
'List item with an image',
- image({ ...sourceAttrs('26:41', '![bar](foo.png)'), alt: 'bar', src: 'foo.png' }),
+ image({ ...source('![bar](foo.png)'), alt: 'bar', src: 'foo.png' }),
),
),
),
@@ -664,8 +603,8 @@ two
`,
expectedDoc: doc(
blockquote(
- sourceAttrs('0:22', '> This is a blockquote'),
- paragraph(sourceAttrs('2:22', 'This is a blockquote'), 'This is a blockquote'),
+ source('> This is a blockquote'),
+ paragraph(source('This is a blockquote'), 'This is a blockquote'),
),
),
},
@@ -676,17 +615,11 @@ two
`,
expectedDoc: doc(
blockquote(
- sourceAttrs('0:31', '> - List item 1\n> - List item 2'),
+ source('> - List item 1\n> - List item 2'),
bulletList(
- sourceAttrs('2:31', '- List item 1\n> - List item 2'),
- listItem(
- sourceAttrs('2:15', '- List item 1'),
- paragraph(sourceAttrs('4:15', 'List item 1'), 'List item 1'),
- ),
- listItem(
- sourceAttrs('18:31', '- List item 2'),
- paragraph(sourceAttrs('20:31', 'List item 2'), 'List item 2'),
- ),
+ source('- List item 1\n> - List item 2'),
+ listItem(source('- List item 1'), paragraph(source('List item 1'), 'List item 1')),
+ listItem(source('- List item 2'), paragraph(source('List item 2'), 'List item 2')),
),
),
),
@@ -699,10 +632,10 @@ code block
`,
expectedDoc: doc(
- paragraph(sourceAttrs('0:10', 'code block'), 'code block'),
+ paragraph(source('code block'), 'code block'),
codeBlock(
{
- ...sourceAttrs('12:42', " const fn = () => 'GitLab';"),
+ ...source(" const fn = () => 'GitLab';"),
class: 'code highlight',
language: null,
},
@@ -719,7 +652,7 @@ const fn = () => 'GitLab';
expectedDoc: doc(
codeBlock(
{
- ...sourceAttrs('0:44', "```javascript\nconst fn = () => 'GitLab';\n```"),
+ ...source("```javascript\nconst fn = () => 'GitLab';\n```"),
class: 'code highlight',
language: 'javascript',
},
@@ -736,7 +669,7 @@ const fn = () => 'GitLab';
expectedDoc: doc(
codeBlock(
{
- ...sourceAttrs('0:44', "~~~javascript\nconst fn = () => 'GitLab';\n~~~"),
+ ...source("~~~javascript\nconst fn = () => 'GitLab';\n~~~"),
class: 'code highlight',
language: 'javascript',
},
@@ -752,7 +685,7 @@ const fn = () => 'GitLab';
expectedDoc: doc(
codeBlock(
{
- ...sourceAttrs('0:7', '```\n```'),
+ ...source('```\n```'),
class: 'code highlight',
language: null,
},
@@ -770,7 +703,7 @@ const fn = () => 'GitLab';
expectedDoc: doc(
codeBlock(
{
- ...sourceAttrs('0:45', "```javascript\nconst fn = () => 'GitLab';\n\n```"),
+ ...source("```javascript\nconst fn = () => 'GitLab';\n\n```"),
class: 'code highlight',
language: 'javascript',
},
@@ -782,8 +715,8 @@ const fn = () => 'GitLab';
markdown: '~~Strikedthrough text~~',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:23', '~~Strikedthrough text~~'),
- strike(sourceAttrs('0:23', '~~Strikedthrough text~~'), 'Strikedthrough text'),
+ source('~~Strikedthrough text~~'),
+ strike(source('~~Strikedthrough text~~'), 'Strikedthrough text'),
),
),
},
@@ -791,8 +724,8 @@ const fn = () => 'GitLab';
markdown: '<del>Strikedthrough text</del>',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:30', '<del>Strikedthrough text</del>'),
- strike(sourceAttrs('0:30', '<del>Strikedthrough text</del>'), 'Strikedthrough text'),
+ source('<del>Strikedthrough text</del>'),
+ strike(source('<del>Strikedthrough text</del>'), 'Strikedthrough text'),
),
),
},
@@ -800,11 +733,8 @@ const fn = () => 'GitLab';
markdown: '<strike>Strikedthrough text</strike>',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:36', '<strike>Strikedthrough text</strike>'),
- strike(
- sourceAttrs('0:36', '<strike>Strikedthrough text</strike>'),
- 'Strikedthrough text',
- ),
+ source('<strike>Strikedthrough text</strike>'),
+ strike(source('<strike>Strikedthrough text</strike>'), 'Strikedthrough text'),
),
),
},
@@ -812,8 +742,8 @@ const fn = () => 'GitLab';
markdown: '<s>Strikedthrough text</s>',
expectedDoc: doc(
paragraph(
- sourceAttrs('0:26', '<s>Strikedthrough text</s>'),
- strike(sourceAttrs('0:26', '<s>Strikedthrough text</s>'), 'Strikedthrough text'),
+ source('<s>Strikedthrough text</s>'),
+ strike(source('<s>Strikedthrough text</s>'), 'Strikedthrough text'),
),
),
},
@@ -826,21 +756,21 @@ const fn = () => 'GitLab';
taskList(
{
numeric: false,
- ...sourceAttrs('0:45', '- [ ] task list item 1\n- [ ] task list item 2'),
+ ...source('- [ ] task list item 1\n- [ ] task list item 2'),
},
taskItem(
{
checked: false,
- ...sourceAttrs('0:22', '- [ ] task list item 1'),
+ ...source('- [ ] task list item 1'),
},
- paragraph(sourceAttrs('6:22', 'task list item 1'), 'task list item 1'),
+ paragraph(source('task list item 1'), 'task list item 1'),
),
taskItem(
{
checked: false,
- ...sourceAttrs('23:45', '- [ ] task list item 2'),
+ ...source('- [ ] task list item 2'),
},
- paragraph(sourceAttrs('29:45', 'task list item 2'), 'task list item 2'),
+ paragraph(source('task list item 2'), 'task list item 2'),
),
),
),
@@ -854,21 +784,21 @@ const fn = () => 'GitLab';
taskList(
{
numeric: false,
- ...sourceAttrs('0:45', '- [x] task list item 1\n- [x] task list item 2'),
+ ...source('- [x] task list item 1\n- [x] task list item 2'),
},
taskItem(
{
checked: true,
- ...sourceAttrs('0:22', '- [x] task list item 1'),
+ ...source('- [x] task list item 1'),
},
- paragraph(sourceAttrs('6:22', 'task list item 1'), 'task list item 1'),
+ paragraph(source('task list item 1'), 'task list item 1'),
),
taskItem(
{
checked: true,
- ...sourceAttrs('23:45', '- [x] task list item 2'),
+ ...source('- [x] task list item 2'),
},
- paragraph(sourceAttrs('29:45', 'task list item 2'), 'task list item 2'),
+ paragraph(source('task list item 2'), 'task list item 2'),
),
),
),
@@ -882,21 +812,21 @@ const fn = () => 'GitLab';
taskList(
{
numeric: true,
- ...sourceAttrs('0:47', '1. [ ] task list item 1\n2. [ ] task list item 2'),
+ ...source('1. [ ] task list item 1\n2. [ ] task list item 2'),
},
taskItem(
{
checked: false,
- ...sourceAttrs('0:23', '1. [ ] task list item 1'),
+ ...source('1. [ ] task list item 1'),
},
- paragraph(sourceAttrs('7:23', 'task list item 1'), 'task list item 1'),
+ paragraph(source('task list item 1'), 'task list item 1'),
),
taskItem(
{
checked: false,
- ...sourceAttrs('24:47', '2. [ ] task list item 2'),
+ ...source('2. [ ] task list item 2'),
},
- paragraph(sourceAttrs('31:47', 'task list item 2'), 'task list item 2'),
+ paragraph(source('task list item 2'), 'task list item 2'),
),
),
),
@@ -909,16 +839,16 @@ const fn = () => 'GitLab';
`,
expectedDoc: doc(
table(
- sourceAttrs('0:29', '| a | b |\n|---|---|\n| c | d |'),
+ source('| a | b |\n|---|---|\n| c | d |'),
tableRow(
- sourceAttrs('0:9', '| a | b |'),
- tableHeader(sourceAttrs('0:5', '| a |'), paragraph(sourceAttrs('2:3', 'a'), 'a')),
- tableHeader(sourceAttrs('5:9', ' b |'), paragraph(sourceAttrs('6:7', 'b'), 'b')),
+ source('| a | b |'),
+ tableHeader(source('| a |'), paragraph(source('a'), 'a')),
+ tableHeader(source(' b |'), paragraph(source('b'), 'b')),
),
tableRow(
- sourceAttrs('20:29', '| c | d |'),
- tableCell(sourceAttrs('20:25', '| c |'), paragraph(sourceAttrs('22:23', 'c'), 'c')),
- tableCell(sourceAttrs('25:29', ' d |'), paragraph(sourceAttrs('26:27', 'd'), 'd')),
+ source('| c | d |'),
+ tableCell(source('| c |'), paragraph(source('c'), 'c')),
+ tableCell(source(' d |'), paragraph(source('d'), 'd')),
),
),
),
@@ -936,30 +866,29 @@ const fn = () => 'GitLab';
`,
expectedDoc: doc(
table(
- sourceAttrs(
- '0:132',
+ source(
'<table>\n <tr>\n <th colspan="2" rowspan="5">Header</th>\n </tr>\n <tr>\n <td colspan="2" rowspan="5">Body</td>\n </tr>\n</table>',
),
tableRow(
- sourceAttrs('10:66', '<tr>\n <th colspan="2" rowspan="5">Header</th>\n </tr>'),
+ source('<tr>\n <th colspan="2" rowspan="5">Header</th>\n </tr>'),
tableHeader(
{
- ...sourceAttrs('19:58', '<th colspan="2" rowspan="5">Header</th>'),
+ ...source('<th colspan="2" rowspan="5">Header</th>'),
colspan: 2,
rowspan: 5,
},
- paragraph(sourceAttrs('47:53', 'Header'), 'Header'),
+ paragraph(source('Header'), 'Header'),
),
),
tableRow(
- sourceAttrs('69:123', '<tr>\n <td colspan="2" rowspan="5">Body</td>\n </tr>'),
+ source('<tr>\n <td colspan="2" rowspan="5">Body</td>\n </tr>'),
tableCell(
{
- ...sourceAttrs('78:115', '<td colspan="2" rowspan="5">Body</td>'),
+ ...source('<td colspan="2" rowspan="5">Body</td>'),
colspan: 2,
rowspan: 5,
},
- paragraph(sourceAttrs('106:110', 'Body'), 'Body'),
+ paragraph(source('Body'), 'Body'),
),
),
),
@@ -977,24 +906,177 @@ Paragraph
`,
expectedDoc: doc(
paragraph(
- sourceAttrs('0:30', 'This is a footnote [^footnote]'),
+ source('This is a footnote [^footnote]'),
'This is a footnote ',
footnoteReference({
- ...sourceAttrs('19:30', '[^footnote]'),
+ ...source('[^footnote]'),
identifier: 'footnote',
label: 'footnote',
}),
),
- paragraph(sourceAttrs('32:41', 'Paragraph'), 'Paragraph'),
+ paragraph(source('Paragraph'), 'Paragraph'),
footnoteDefinition(
{
- ...sourceAttrs('43:75', '[^footnote]: Footnote definition'),
+ ...source('[^footnote]: Footnote definition'),
identifier: 'footnote',
label: 'footnote',
},
- paragraph(sourceAttrs('56:75', 'Footnote definition'), 'Footnote definition'),
+ paragraph(source('Footnote definition'), 'Footnote definition'),
+ ),
+ paragraph(source('Paragraph'), 'Paragraph'),
+ ),
+ },
+ {
+ markdown: `
+<div>div</div>
+`,
+ expectedDoc: doc(div(source('<div>div</div>'), paragraph(source('div'), 'div'))),
+ },
+ {
+ markdown: `
+[![moon](moon.jpg)](/uri)
+`,
+ expectedDoc: doc(
+ paragraph(
+ source('[![moon](moon.jpg)](/uri)'),
+ link(
+ { ...source('[![moon](moon.jpg)](/uri)'), href: '/uri' },
+ image({ ...source('![moon](moon.jpg)'), src: 'moon.jpg', alt: 'moon' }),
+ ),
+ ),
+ ),
+ },
+ {
+ markdown: `
+<del>
+
+*foo*
+
+</del>
+`,
+ expectedDoc: doc(
+ paragraph(
+ source('*foo*'),
+ strike(source('<del>\n\n*foo*\n\n</del>'), italic(source('*foo*'), 'foo')),
+ ),
+ ),
+ expectedMarkdown: '*foo*',
+ },
+ {
+ markdown: `
+~[moon](moon.jpg) and [sun](sun.jpg)~
+`,
+ expectedDoc: doc(
+ paragraph(
+ source('~[moon](moon.jpg) and [sun](sun.jpg)~'),
+ strike(
+ source('~[moon](moon.jpg) and [sun](sun.jpg)~'),
+ link({ ...source('[moon](moon.jpg)'), href: 'moon.jpg' }, 'moon'),
+ ),
+ strike(source('~[moon](moon.jpg) and [sun](sun.jpg)~'), ' and '),
+ strike(
+ source('~[moon](moon.jpg) and [sun](sun.jpg)~'),
+ link({ ...source('[sun](sun.jpg)'), href: 'sun.jpg' }, 'sun'),
+ ),
+ ),
+ ),
+ },
+ {
+ markdown: `
+<del>
+
+**Paragraph 1**
+
+_Paragraph 2_
+
+</del>
+ `,
+ expectedDoc: doc(
+ paragraph(
+ source('**Paragraph 1**'),
+ strike(
+ source('<del>\n\n**Paragraph 1**\n\n_Paragraph 2_\n\n</del>'),
+ bold(source('**Paragraph 1**'), 'Paragraph 1'),
+ ),
+ ),
+ paragraph(
+ source('_Paragraph 2_'),
+ strike(
+ source('<del>\n\n**Paragraph 1**\n\n_Paragraph 2_\n\n</del>'),
+ italic(source('_Paragraph 2_'), 'Paragraph 2'),
+ ),
+ ),
+ ),
+ expectedMarkdown: `**Paragraph 1**
+
+_Paragraph 2_`,
+ },
+ /* TODO
+ * Implement proper editing support for HTML comments in the Content Editor
+ * https://gitlab.com/gitlab-org/gitlab/-/issues/342173
+ */
+ {
+ markdown: '<!-- HTML comment -->',
+ expectedDoc: doc(paragraph()),
+ expectedMarkdown: '',
+ },
+ {
+ markdown: `
+<![CDATA[
+function matchwo(a,b)
+{
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+}
+]]>
+ `,
+ expectedDoc: doc(paragraph()),
+ expectedMarkdown: '',
+ },
+ {
+ markdown: `
+<!-- foo -->*bar*
+*baz*
+ `,
+ expectedDoc: doc(
+ paragraph(source('*bar*'), '*bar*\n'),
+ paragraph(source('*baz*'), italic(source('*baz*'), 'baz')),
+ ),
+ expectedMarkdown: `*bar*
+
+*baz*`,
+ },
+ {
+ markdown: `
+<table><tr><td>
+<pre>
+**Hello**,
+
+_world_.
+</pre>
+</td></tr></table>
+`,
+ expectedDoc: doc(
+ table(
+ source('<table><tr><td>\n<pre>\n**Hello**,\n\n_world_.\n</pre>\n</td></tr></table>'),
+ tableRow(
+ source('<tr><td>\n<pre>\n**Hello**,\n\n_world_.\n</pre>\n</td></tr>'),
+ tableCell(
+ source('<td>\n<pre>\n**Hello**,\n\n_world_.\n</pre>\n</td>'),
+ pre(
+ source('<pre>\n**Hello**,\n\n_world_.\n</pre>'),
+ paragraph(source('**Hello**,'), '**Hello**,\n'),
+ paragraph(source('_world_.\n'), italic(source('_world_'), 'world'), '.\n'),
+ ),
+ paragraph(),
+ ),
+ ),
),
- paragraph(sourceAttrs('77:86', 'Paragraph'), 'Paragraph'),
),
},
];
@@ -1002,12 +1084,75 @@ Paragraph
const runOnly = examples.find((example) => example.only === true);
const runExamples = runOnly ? [runOnly] : examples;
- it.each(runExamples)('processes %s correctly', async ({ markdown, expectedDoc }) => {
- const trimmed = markdown.trim();
- const document = await deserialize(trimmed);
+ it.each(runExamples)(
+ 'processes %s correctly',
+ async ({ markdown, expectedDoc, expectedMarkdown }) => {
+ const trimmed = markdown.trim();
+ const document = await deserialize(trimmed);
- expect(expectedDoc).not.toBeFalsy();
- expect(document.toJSON()).toEqual(expectedDoc.toJSON());
- expect(serialize(document)).toEqual(trimmed);
- });
+ expect(expectedDoc).not.toBeFalsy();
+ expect(document.toJSON()).toEqual(expectedDoc.toJSON());
+ expect(serialize(document)).toEqual(expectedMarkdown ?? trimmed);
+ },
+ );
+
+ /**
+ * DISCLAIMER: THIS IS A SECURITY ORIENTED TEST THAT ENSURES
+ * THE CLIENT-SIDE PARSER IGNORES DANGEROUS TAGS THAT ARE NOT
+ * EXPLICITELY SUPPORTED.
+ *
+ * PLEASE CONSIDER THIS INFORMATION WHILE MODIFYING THESE TESTS
+ */
+ it.each([
+ {
+ markdown: `
+<script>
+alert("Hello world")
+</script>
+ `,
+ expectedHtml: '<p></p>',
+ },
+ {
+ markdown: `
+<foo>Hello</foo>
+ `,
+ expectedHtml: '<p></p>',
+ },
+ {
+ markdown: `
+<h1 class="heading-with-class">Header</h1>
+ `,
+ expectedHtml: '<h1>Header</h1>',
+ },
+ {
+ markdown: `
+<a id="link-id">Header</a> and other text
+ `,
+ expectedHtml:
+ '<p><a target="_blank" rel="noopener noreferrer nofollow">Header</a> and other text</p>',
+ },
+ {
+ markdown: `
+<style>
+body {
+ display: none;
+}
+</style>
+ `,
+ expectedHtml: '<p></p>',
+ },
+ {
+ markdown: '<div style="transform">div</div>',
+ expectedHtml: '<div><p>div</p></div>',
+ },
+ ])(
+ 'removes unknown tags and unsupported attributes from HTML output',
+ async ({ markdown, expectedHtml }) => {
+ const document = await deserialize(markdown);
+
+ tiptapEditor.commands.setContent(document.toJSON());
+
+ expect(tiptapEditor.getHTML()).toEqual(expectedHtml);
+ },
+ );
});
diff --git a/spec/frontend/content_editor/render_html_and_json_for_all_examples.js b/spec/frontend/content_editor/render_html_and_json_for_all_examples.js
new file mode 100644
index 00000000000..116a26cf7d5
--- /dev/null
+++ b/spec/frontend/content_editor/render_html_and_json_for_all_examples.js
@@ -0,0 +1,115 @@
+import { DOMSerializer } from 'prosemirror-model';
+// TODO: DRY up duplication with spec/frontend/content_editor/services/markdown_serializer_spec.js
+// See https://gitlab.com/groups/gitlab-org/-/epics/7719#plan
+import Blockquote from '~/content_editor/extensions/blockquote';
+import Bold from '~/content_editor/extensions/bold';
+import BulletList from '~/content_editor/extensions/bullet_list';
+import Code from '~/content_editor/extensions/code';
+import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+import DescriptionItem from '~/content_editor/extensions/description_item';
+import DescriptionList from '~/content_editor/extensions/description_list';
+import Details from '~/content_editor/extensions/details';
+import DetailsContent from '~/content_editor/extensions/details_content';
+import Emoji from '~/content_editor/extensions/emoji';
+import Figure from '~/content_editor/extensions/figure';
+import FigureCaption from '~/content_editor/extensions/figure_caption';
+import FootnoteDefinition from '~/content_editor/extensions/footnote_definition';
+import FootnoteReference from '~/content_editor/extensions/footnote_reference';
+import FootnotesSection from '~/content_editor/extensions/footnotes_section';
+import HardBreak from '~/content_editor/extensions/hard_break';
+import Heading from '~/content_editor/extensions/heading';
+import HorizontalRule from '~/content_editor/extensions/horizontal_rule';
+import HTMLNodes from '~/content_editor/extensions/html_nodes';
+import Image from '~/content_editor/extensions/image';
+import InlineDiff from '~/content_editor/extensions/inline_diff';
+import Italic from '~/content_editor/extensions/italic';
+import Link from '~/content_editor/extensions/link';
+import ListItem from '~/content_editor/extensions/list_item';
+import OrderedList from '~/content_editor/extensions/ordered_list';
+import Strike from '~/content_editor/extensions/strike';
+import Table from '~/content_editor/extensions/table';
+import TableCell from '~/content_editor/extensions/table_cell';
+import TableHeader from '~/content_editor/extensions/table_header';
+import TableRow from '~/content_editor/extensions/table_row';
+import TaskItem from '~/content_editor/extensions/task_item';
+import TaskList from '~/content_editor/extensions/task_list';
+import createMarkdownDeserializer from '~/content_editor/services/remark_markdown_deserializer';
+import { createTestEditor } from 'jest/content_editor/test_utils';
+
+const tiptapEditor = createTestEditor({
+ extensions: [
+ Blockquote,
+ Bold,
+ BulletList,
+ Code,
+ CodeBlockHighlight,
+ DescriptionItem,
+ DescriptionList,
+ Details,
+ DetailsContent,
+ Emoji,
+ FootnoteDefinition,
+ FootnoteReference,
+ FootnotesSection,
+ Figure,
+ FigureCaption,
+ HardBreak,
+ Heading,
+ HorizontalRule,
+ ...HTMLNodes,
+ Image,
+ InlineDiff,
+ Italic,
+ Link,
+ ListItem,
+ OrderedList,
+ Strike,
+ Table,
+ TableCell,
+ TableHeader,
+ TableRow,
+ TaskItem,
+ TaskList,
+ ],
+});
+
+export const IMPLEMENTATION_ERROR_MSG = 'Error - check implementation';
+
+async function renderMarkdownToHTMLAndJSON(markdown, schema, deserializer) {
+ let prosemirrorDocument;
+ try {
+ const { document } = await deserializer.deserialize({ schema, markdown });
+ prosemirrorDocument = document;
+ } catch (e) {
+ const errorMsg = `${IMPLEMENTATION_ERROR_MSG}:\n${e.message}`;
+ return {
+ html: errorMsg,
+ json: errorMsg,
+ };
+ }
+
+ const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(
+ prosemirrorDocument.content,
+ );
+ const htmlString = Array.from(documentFragment.children)
+ .map((el) => el.outerHTML)
+ .join('\n');
+
+ const json = prosemirrorDocument.toJSON();
+ const jsonString = JSON.stringify(json, null, 2);
+ return { html: htmlString, json: jsonString };
+}
+
+export function renderHtmlAndJsonForAllExamples(markdownExamples) {
+ const { schema } = tiptapEditor;
+ const deserializer = createMarkdownDeserializer();
+ const exampleNames = Object.keys(markdownExamples);
+
+ return exampleNames.reduce(async (promisedExamples, exampleName) => {
+ const markdown = markdownExamples[exampleName];
+ const htmlAndJson = await renderMarkdownToHTMLAndJSON(markdown, schema, deserializer);
+ const examples = await promisedExamples;
+ examples[exampleName] = htmlAndJson;
+ return examples;
+ }, Promise.resolve({}));
+}
diff --git a/spec/frontend/content_editor/services/markdown_serializer_spec.js b/spec/frontend/content_editor/services/markdown_serializer_spec.js
index 13e9efaea59..509cda3046c 100644
--- a/spec/frontend/content_editor/services/markdown_serializer_spec.js
+++ b/spec/frontend/content_editor/services/markdown_serializer_spec.js
@@ -7,7 +7,6 @@ import DescriptionItem from '~/content_editor/extensions/description_item';
import DescriptionList from '~/content_editor/extensions/description_list';
import Details from '~/content_editor/extensions/details';
import DetailsContent from '~/content_editor/extensions/details_content';
-import Division from '~/content_editor/extensions/division';
import Emoji from '~/content_editor/extensions/emoji';
import Figure from '~/content_editor/extensions/figure';
import FigureCaption from '~/content_editor/extensions/figure_caption';
@@ -16,6 +15,8 @@ import FootnoteReference from '~/content_editor/extensions/footnote_reference';
import HardBreak from '~/content_editor/extensions/hard_break';
import Heading from '~/content_editor/extensions/heading';
import HorizontalRule from '~/content_editor/extensions/horizontal_rule';
+import HTMLMarks from '~/content_editor/extensions/html_marks';
+import HTMLNodes from '~/content_editor/extensions/html_nodes';
import Image from '~/content_editor/extensions/image';
import InlineDiff from '~/content_editor/extensions/inline_diff';
import Italic from '~/content_editor/extensions/italic';
@@ -48,7 +49,6 @@ const tiptapEditor = createTestEditor({
DescriptionList,
Details,
DetailsContent,
- Division,
Emoji,
FootnoteDefinition,
FootnoteReference,
@@ -71,6 +71,8 @@ const tiptapEditor = createTestEditor({
TableRow,
TaskItem,
TaskList,
+ ...HTMLMarks,
+ ...HTMLNodes,
],
});
@@ -84,7 +86,7 @@ const {
codeBlock,
details,
detailsContent,
- division,
+ div,
descriptionItem,
descriptionList,
emoji,
@@ -120,7 +122,6 @@ const {
codeBlock: { nodeType: CodeBlockHighlight.name },
details: { nodeType: Details.name },
detailsContent: { nodeType: DetailsContent.name },
- division: { nodeType: Division.name },
descriptionItem: { nodeType: DescriptionItem.name },
descriptionList: { nodeType: DescriptionList.name },
emoji: { markType: Emoji.name },
@@ -145,6 +146,13 @@ const {
tableRow: { nodeType: TableRow.name },
taskItem: { nodeType: TaskItem.name },
taskList: { nodeType: TaskList.name },
+ ...HTMLNodes.reduce(
+ (builders, htmlNode) => ({
+ ...builders,
+ [htmlNode.name]: { nodeType: htmlNode.name },
+ }),
+ {},
+ ),
},
});
@@ -725,8 +733,8 @@ _inception_
it('correctly renders div', () => {
expect(
serialize(
- division(paragraph('just a paragraph in a div')),
- division(paragraph('just some ', bold('styled'), ' ', italic('content'), ' in a div')),
+ div(paragraph('just a paragraph in a div')),
+ div(paragraph('just some ', bold('styled'), ' ', italic('content'), ' in a div')),
),
).toBe(
'<div>just a paragraph in a div</div>\n<div>\n\njust some **styled** _content_ in a div\n\n</div>',
@@ -1169,7 +1177,7 @@ Oranges are orange [^1]
};
it.each`
- mark | content | modifiedContent | editAction
+ mark | markdown | modifiedMarkdown | editAction
${'bold'} | ${'**bold**'} | ${'**bold modified**'} | ${defaultEditAction}
${'bold'} | ${'__bold__'} | ${'__bold modified__'} | ${defaultEditAction}
${'bold'} | ${'<strong>bold</strong>'} | ${'<strong>bold modified</strong>'} | ${defaultEditAction}
@@ -1205,10 +1213,10 @@ Oranges are orange [^1]
${'taskList'} | ${'2) [x] task list item'} | ${'2) [x] task list item modified'} | ${defaultEditAction}
`(
'preserves original $mark syntax when sourceMarkdown is available for $content',
- async ({ content, modifiedContent, editAction }) => {
+ async ({ markdown, modifiedMarkdown, editAction }) => {
const { document } = await remarkMarkdownDeserializer().deserialize({
schema: tiptapEditor.schema,
- content,
+ markdown,
});
editAction(document);
@@ -1218,7 +1226,7 @@ Oranges are orange [^1]
doc: tiptapEditor.state.doc,
});
- expect(serialized).toEqual(modifiedContent);
+ expect(serialized).toEqual(modifiedMarkdown);
},
);
});
diff --git a/spec/frontend/content_editor/services/markdown_sourcemap_spec.js b/spec/frontend/content_editor/services/markdown_sourcemap_spec.js
index 8a304c73163..2efc73ddef8 100644
--- a/spec/frontend/content_editor/services/markdown_sourcemap_spec.js
+++ b/spec/frontend/content_editor/services/markdown_sourcemap_spec.js
@@ -77,7 +77,7 @@ describe('content_editor/services/markdown_sourcemap', () => {
render: () => BULLET_LIST_HTML,
}).deserialize({
schema: tiptapEditor.schema,
- content: BULLET_LIST_MARKDOWN,
+ markdown: BULLET_LIST_MARKDOWN,
});
const expected = doc(
diff --git a/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js b/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js
index 2001f5c1441..bd4ed950f9d 100644
--- a/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js
+++ b/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js
@@ -1,3 +1,4 @@
+import { nextTick } from 'vue';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import { TEST_HOST } from 'helpers/test_constants';
@@ -148,6 +149,7 @@ describe('custom metrics form fields component', () => {
it('expect loading message to display', async () => {
const queryInput = wrapper.find(`input[name="${queryInputName}"]`);
queryInput.setValue('query');
+ await nextTick();
expect(wrapper.text()).toContain('Validating query');
});
diff --git a/spec/frontend/cycle_analytics/path_navigation_spec.js b/spec/frontend/cycle_analytics/path_navigation_spec.js
index e8c4ebd3a38..fa9eadbd071 100644
--- a/spec/frontend/cycle_analytics/path_navigation_spec.js
+++ b/spec/frontend/cycle_analytics/path_navigation_spec.js
@@ -85,7 +85,7 @@ describe('Project PathNavigation', () => {
const result = findPathNavigationTitles();
transformedProjectStagePathData.forEach(({ title, metric }, index) => {
expect(result[index]).toContain(title);
- expect(result[index]).toContain(metric);
+ expect(result[index]).toContain(metric.toString());
});
});
diff --git a/spec/frontend/cycle_analytics/value_stream_metrics_spec.js b/spec/frontend/cycle_analytics/value_stream_metrics_spec.js
index df86b10cba3..23e41f35b00 100644
--- a/spec/frontend/cycle_analytics/value_stream_metrics_spec.js
+++ b/spec/frontend/cycle_analytics/value_stream_metrics_spec.js
@@ -55,10 +55,10 @@ describe('ValueStreamMetrics', () => {
describe('with successful requests', () => {
beforeEach(() => {
mockGetValueStreamSummaryMetrics = jest.fn().mockResolvedValue({ data: metricsData });
- wrapper = createComponent();
});
it('will display a loader with pending requests', async () => {
+ wrapper = createComponent();
await nextTick();
expect(wrapper.findComponent(GlSkeletonLoader).exists()).toBe(true);
@@ -66,6 +66,7 @@ describe('ValueStreamMetrics', () => {
describe('with data loaded', () => {
beforeEach(async () => {
+ wrapper = createComponent();
await waitForPromises();
});
diff --git a/spec/frontend/design_management/components/design_sidebar_spec.js b/spec/frontend/design_management/components/design_sidebar_spec.js
index 40968d9204a..f13796138bd 100644
--- a/spec/frontend/design_management/components/design_sidebar_spec.js
+++ b/spec/frontend/design_management/components/design_sidebar_spec.js
@@ -1,7 +1,6 @@
-import { GlCollapse, GlPopover } from '@gitlab/ui';
+import { GlAccordionItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
-import Cookies from '~/lib/utils/cookies';
import DesignDiscussion from '~/design_management/components/design_notes/design_discussion.vue';
import DesignNoteSignedOut from '~/design_management/components/design_notes/design_note_signed_out.vue';
import DesignSidebar from '~/design_management/components/design_sidebar.vue';
@@ -27,8 +26,6 @@ const $route = {
},
};
-const cookieKey = 'hide_design_resolved_comments_popover';
-
const mutate = jest.fn().mockResolvedValue();
describe('Design management design sidebar component', () => {
@@ -40,9 +37,7 @@ describe('Design management design sidebar component', () => {
const findUnresolvedDiscussions = () => wrapper.findAll('[data-testid="unresolved-discussion"]');
const findResolvedDiscussions = () => wrapper.findAll('[data-testid="resolved-discussion"]');
const findParticipants = () => wrapper.find(Participants);
- const findCollapsible = () => wrapper.find(GlCollapse);
- const findToggleResolvedCommentsButton = () => wrapper.find('[data-testid="resolved-comments"]');
- const findPopover = () => wrapper.find(GlPopover);
+ const findResolvedCommentsToggle = () => wrapper.find(GlAccordionItem);
const findNewDiscussionDisclaimer = () =>
wrapper.find('[data-testid="new-discussion-disclaimer"]');
@@ -61,7 +56,6 @@ describe('Design management design sidebar component', () => {
mutate,
},
},
- stubs: { GlPopover },
provide: {
registerPath: '/users/sign_up?redirect_to_referer=yes',
signInPath: '/users/sign_in?redirect_to_referer=yes',
@@ -119,7 +113,6 @@ describe('Design management design sidebar component', () => {
describe('when has discussions', () => {
beforeEach(() => {
- Cookies.set(cookieKey, true);
createComponent();
});
@@ -131,26 +124,23 @@ describe('Design management design sidebar component', () => {
expect(findResolvedDiscussions()).toHaveLength(1);
});
- it('has resolved comments collapsible collapsed', () => {
- expect(findCollapsible().attributes('visible')).toBeUndefined();
+ it('has resolved comments accordion item collapsed', () => {
+ expect(findResolvedCommentsToggle().props('visible')).toBe(false);
});
- it('emits toggleResolveComments event on resolve comments button click', () => {
- findToggleResolvedCommentsButton().vm.$emit('click');
+ it('emits toggleResolveComments event on resolve comments button click', async () => {
+ findResolvedCommentsToggle().vm.$emit('input', true);
+ await nextTick();
expect(wrapper.emitted('toggleResolvedComments')).toHaveLength(1);
});
- it('opens a collapsible when resolvedDiscussionsExpanded prop changes to true', async () => {
- expect(findCollapsible().attributes('visible')).toBeUndefined();
+ it('opens the accordion item when resolvedDiscussionsExpanded prop changes to true', async () => {
+ expect(findResolvedCommentsToggle().props('visible')).toBe(false);
wrapper.setProps({
resolvedDiscussionsExpanded: true,
});
await nextTick();
- expect(findCollapsible().attributes('visible')).toBe('true');
- });
-
- it('does not popover about resolved comments', () => {
- expect(findPopover().exists()).toBe(false);
+ expect(findResolvedCommentsToggle().props('visible')).toBe(true);
});
it('sends a mutation to set an active discussion when clicking on a discussion', () => {
@@ -232,36 +222,6 @@ describe('Design management design sidebar component', () => {
});
});
- describe('when showing resolved discussions for the first time', () => {
- beforeEach(() => {
- Cookies.set(cookieKey, false);
- createComponent();
- });
-
- it('renders a popover if we show resolved comments collapsible for the first time', () => {
- expect(findPopover().exists()).toBe(true);
- });
-
- it('scrolls to resolved threads link', () => {
- expect(scrollIntoViewMock).toHaveBeenCalled();
- });
-
- it('dismisses a popover on the outside click', async () => {
- wrapper.trigger('click');
- await nextTick();
- expect(findPopover().exists()).toBe(false);
- });
-
- it(`sets a ${cookieKey} cookie on clicking outside the popover`, () => {
- jest.spyOn(Cookies, 'set');
- wrapper.trigger('click');
- expect(Cookies.set).toHaveBeenCalledWith(cookieKey, 'true', {
- expires: 365 * 10,
- secure: false,
- });
- });
- });
-
describe('when user is not logged in', () => {
const findDesignNoteSignedOut = () => wrapper.findComponent(DesignNoteSignedOut);
@@ -292,7 +252,6 @@ describe('Design management design sidebar component', () => {
describe('design has discussions', () => {
beforeEach(() => {
- Cookies.set(cookieKey, true);
createComponent();
});
diff --git a/spec/frontend/design_management/components/image_spec.js b/spec/frontend/design_management/components/image_spec.js
index e27b2bc9fa5..65ee0ae6238 100644
--- a/spec/frontend/design_management/components/image_spec.js
+++ b/spec/frontend/design_management/components/image_spec.js
@@ -1,6 +1,7 @@
import { GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import DesignImage from '~/design_management/components/image.vue';
describe('Design management large image component', () => {
@@ -15,6 +16,10 @@ describe('Design management large image component', () => {
wrapper.setData(data);
}
+ beforeEach(() => {
+ stubPerformanceWebAPI();
+ });
+
afterEach(() => {
wrapper.destroy();
});
diff --git a/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap b/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap
index be736184e60..9997f02cd01 100644
--- a/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap
+++ b/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap
@@ -7,6 +7,8 @@ exports[`Design management index page designs renders error 1`] = `
>
<!---->
+ <!---->
+
<div
class="gl-mt-6"
>
@@ -39,6 +41,8 @@ exports[`Design management index page designs renders loading icon 1`] = `
>
<!---->
+ <!---->
+
<div
class="gl-mt-6"
>
diff --git a/spec/frontend/design_management/pages/design/__snapshots__/index_spec.js.snap b/spec/frontend/design_management/pages/design/__snapshots__/index_spec.js.snap
index 0f2857821ea..3177a5e016c 100644
--- a/spec/frontend/design_management/pages/design/__snapshots__/index_spec.js.snap
+++ b/spec/frontend/design_management/pages/design/__snapshots__/index_spec.js.snap
@@ -88,57 +88,26 @@ exports[`Design management design index page renders design index 1`] = `
signinpath=""
/>
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- class="link-inherit-color gl-text-body gl-text-decoration-none gl-font-weight-bold gl-mb-4"
- data-testid="resolved-comments"
- icon="chevron-right"
- id="resolved-comments"
- size="medium"
- variant="link"
+ <gl-accordion-stub
+ class="gl-mb-5"
+ headerlevel="3"
>
- Resolved Comments (1)
-
- </gl-button-stub>
-
- <gl-popover-stub
- container="popovercontainer"
- cssclasses=""
- placement="top"
- show="true"
- target="resolved-comments"
- title="Resolved Comments"
- >
- <p>
-
- Comments you resolve can be viewed and unresolved by going to the "Resolved Comments" section below
-
- </p>
-
- <a
- href="https://docs.gitlab.com/ee/user/project/issues/design_management.html#resolve-design-threads"
- rel="noopener noreferrer"
- target="_blank"
+ <gl-accordion-item-stub
+ headerclass="gl-mb-5!"
+ title="Resolved Comments (1)"
>
- Learn more about resolving comments
- </a>
- </gl-popover-stub>
-
- <gl-collapse-stub
- class="gl-mt-3"
- >
- <design-discussion-stub
- data-testid="resolved-discussion"
- designid="gid::/gitlab/Design/1"
- discussion="[object Object]"
- discussionwithopenform=""
- markdownpreviewpath="/project-path/preview_markdown?target_type=Issue"
- noteableid="gid::/gitlab/Design/1"
- registerpath=""
- signinpath=""
- />
- </gl-collapse-stub>
+ <design-discussion-stub
+ data-testid="resolved-discussion"
+ designid="gid::/gitlab/Design/1"
+ discussion="[object Object]"
+ discussionwithopenform=""
+ markdownpreviewpath="/project-path/preview_markdown?target_type=Issue"
+ noteableid="gid::/gitlab/Design/1"
+ registerpath=""
+ signinpath=""
+ />
+ </gl-accordion-item-stub>
+ </gl-accordion-stub>
</div>
</div>
diff --git a/spec/frontend/design_management/pages/index_spec.js b/spec/frontend/design_management/pages/index_spec.js
index 087655d10f7..21be7bd148b 100644
--- a/spec/frontend/design_management/pages/index_spec.js
+++ b/spec/frontend/design_management/pages/index_spec.js
@@ -1,5 +1,4 @@
import { GlEmptyState } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo, { ApolloMutation } from 'vue-apollo';
@@ -9,6 +8,7 @@ import VueDraggable from 'vuedraggable';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import permissionsQuery from 'shared_queries/design_management/design_permissions.query.graphql';
import getDesignListQuery from 'shared_queries/design_management/get_design_list.query.graphql';
import DeleteButton from '~/design_management/components/delete_button.vue';
@@ -23,6 +23,7 @@ import * as utils from '~/design_management/utils/design_management_utils';
import {
EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE,
EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE,
+ UPLOAD_DESIGN_ERROR,
} from '~/design_management/utils/error_messages';
import {
DESIGN_TRACKING_PAGE_NAME,
@@ -101,20 +102,20 @@ describe('Design management index page', () => {
let moveDesignHandler;
const findDesignCheckboxes = () => wrapper.findAll('.design-checkbox');
- const findSelectAllButton = () => wrapper.find('[data-testid="select-all-designs-button"');
- const findToolbar = () => wrapper.find('.qa-selector-toolbar');
- const findDesignCollectionIsCopying = () =>
- wrapper.find('[data-testid="design-collection-is-copying"');
- const findDeleteButton = () => wrapper.find(DeleteButton);
- const findDropzone = () => wrapper.findAll(DesignDropzone).at(0);
+ const findSelectAllButton = () => wrapper.findByTestId('select-all-designs-button');
+ const findToolbar = () => wrapper.findByTestId('design-selector-toolbar');
+ const findDesignCollectionIsCopying = () => wrapper.findByTestId('design-collection-is-copying');
+ const findDeleteButton = () => wrapper.findComponent(DeleteButton);
+ const findDropzone = () => wrapper.findAllComponents(DesignDropzone).at(0);
const dropzoneClasses = () => findDropzone().classes();
- const findDropzoneWrapper = () => wrapper.find('[data-testid="design-dropzone-wrapper"]');
- const findFirstDropzoneWithDesign = () => wrapper.findAll(DesignDropzone).at(1);
- const findDesignsWrapper = () => wrapper.find('[data-testid="designs-root"]');
+ const findDropzoneWrapper = () => wrapper.findByTestId('design-dropzone-wrapper');
+ const findFirstDropzoneWithDesign = () => wrapper.findAllComponents(DesignDropzone).at(1);
+ const findDesignsWrapper = () => wrapper.findByTestId('designs-root');
const findDesigns = () => wrapper.findAll(Design);
const draggableAttributes = () => wrapper.find(VueDraggable).vm.$attrs;
- const findDesignUploadButton = () => wrapper.find('[data-testid="design-upload-button"]');
- const findDesignToolbarWrapper = () => wrapper.find('[data-testid="design-toolbar-wrapper"]');
+ const findDesignUploadButton = () => wrapper.findByTestId('design-upload-button');
+ const findDesignToolbarWrapper = () => wrapper.findByTestId('design-toolbar-wrapper');
+ const findDesignUpdateAlert = () => wrapper.findByTestId('design-update-alert');
async function moveDesigns(localWrapper) {
await waitForPromises();
@@ -149,7 +150,7 @@ describe('Design management index page', () => {
mutate,
};
- wrapper = shallowMount(Index, {
+ wrapper = shallowMountExtended(Index, {
data() {
return {
allVersions,
@@ -185,7 +186,7 @@ describe('Design management index page', () => {
];
fakeApollo = createMockApollo(requestHandlers, {}, { addTypename: true });
- wrapper = shallowMount(Index, {
+ wrapper = shallowMountExtended(Index, {
apolloProvider: fakeApollo,
router,
stubs: { VueDraggable },
@@ -412,7 +413,8 @@ describe('Design management index page', () => {
await nextTick();
expect(wrapper.vm.filesToBeSaved).toEqual([]);
expect(wrapper.vm.isSaving).toBeFalsy();
- expect(createFlash).toHaveBeenCalled();
+ expect(findDesignUpdateAlert().exists()).toBe(true);
+ expect(findDesignUpdateAlert().text()).toBe(UPLOAD_DESIGN_ERROR);
});
it('does not call mutation if createDesign is false', () => {
@@ -431,19 +433,23 @@ describe('Design management index page', () => {
wrapper.vm.onUploadDesign(new Array(MAXIMUM_FILE_UPLOAD_LIMIT).fill(mockDesigns[0]));
- expect(createFlash).not.toHaveBeenCalled();
+ expect(findDesignUpdateAlert().exists()).toBe(false);
});
- it('warns when too many files are uploaded', () => {
+ it('warns when too many files are uploaded', async () => {
createComponent();
wrapper.vm.onUploadDesign(new Array(MAXIMUM_FILE_UPLOAD_LIMIT + 1).fill(mockDesigns[0]));
+ await nextTick();
- expect(createFlash).toHaveBeenCalled();
+ expect(findDesignUpdateAlert().exists()).toBe(true);
+ expect(findDesignUpdateAlert().text()).toBe(
+ 'The maximum number of designs allowed to be uploaded is 10. Please try again.',
+ );
});
});
- it('flashes warning if designs are skipped', async () => {
+ it('displays warning if designs are skipped', async () => {
createComponent({
mockMutate: () =>
Promise.resolve({
@@ -458,11 +464,8 @@ describe('Design management index page', () => {
]);
await uploadDesign;
- expect(createFlash).toHaveBeenCalledTimes(1);
- expect(createFlash).toHaveBeenCalledWith({
- message: 'Upload skipped. test.jpg did not change.',
- types: 'warning',
- });
+ expect(findDesignUpdateAlert().exists()).toBe(true);
+ expect(findDesignUpdateAlert().text()).toBe('Upload skipped. test.jpg did not change.');
});
describe('dragging onto an existing design', () => {
@@ -495,13 +498,17 @@ describe('Design management index page', () => {
description | eventPayload | message
${'> 1 file'} | ${[{ name: 'test' }, { name: 'test-2' }]} | ${EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE}
${'different filename'} | ${[{ name: 'wrong-name' }]} | ${EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE}
- `('calls createFlash when upload has $description', ({ eventPayload, message }) => {
- const designDropzone = findFirstDropzoneWithDesign();
- designDropzone.vm.$emit('change', eventPayload);
-
- expect(createFlash).toHaveBeenCalledTimes(1);
- expect(createFlash).toHaveBeenCalledWith({ message });
- });
+ `(
+ 'displays GlAlert component when upload has $description',
+ async ({ eventPayload, message }) => {
+ expect(findDesignUpdateAlert().exists()).toBe(false);
+ const designDropzone = findFirstDropzoneWithDesign();
+ await designDropzone.vm.$emit('change', eventPayload);
+
+ expect(findDesignUpdateAlert().exists()).toBe(true);
+ expect(findDesignUpdateAlert().text()).toBe(message);
+ },
+ );
});
describe('tracking', () => {
@@ -804,7 +811,7 @@ describe('Design management index page', () => {
expect(createFlash).toHaveBeenCalledWith({ message: 'Houston, we have a problem' });
});
- it('displays flash if mutation had a non-recoverable error', async () => {
+ it('displays alert if mutation had a non-recoverable error', async () => {
createComponentWithApollo({
moveHandler: jest.fn().mockRejectedValue('Error'),
});
@@ -812,9 +819,10 @@ describe('Design management index page', () => {
await moveDesigns(wrapper);
await waitForPromises();
- expect(createFlash).toHaveBeenCalledWith({
- message: 'Something went wrong when reordering designs. Please try again',
- });
+ expect(findDesignUpdateAlert().exists()).toBe(true);
+ expect(findDesignUpdateAlert().text()).toBe(
+ 'Something went wrong when reordering designs. Please try again',
+ );
});
});
});
diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index 76e4a944d87..96f2ac1692c 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -18,6 +18,7 @@ import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
import axios from '~/lib/utils/axios_utils';
import * as urlUtils from '~/lib/utils/url_utility';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import createDiffsStore from '../create_diffs_store';
import diffsMockData from '../mock_data/merge_request_diffs';
@@ -79,6 +80,7 @@ describe('diffs/components/app', () => {
}
beforeEach(() => {
+ stubPerformanceWebAPI();
// setup globals (needed for component to mount :/)
window.mrTabs = {
resetViewContainer: jest.fn(),
diff --git a/spec/frontend/diffs/components/collapsed_files_warning_spec.js b/spec/frontend/diffs/components/collapsed_files_warning_spec.js
index 8cc342e45a7..cc4f13ab0cf 100644
--- a/spec/frontend/diffs/components/collapsed_files_warning_spec.js
+++ b/spec/frontend/diffs/components/collapsed_files_warning_spec.js
@@ -6,7 +6,7 @@ import { 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';
+import { getDiffFileMock } from '../mock_data/diff_file';
const propsData = {
limited: true,
@@ -15,7 +15,7 @@ const propsData = {
};
async function files(store, count) {
- const copies = Array(count).fill(file);
+ const copies = Array(count).fill(getDiffFileMock());
store.state.diffs.diffFiles.push(...copies);
await nextTick();
diff --git a/spec/frontend/diffs/components/diff_code_quality_spec.js b/spec/frontend/diffs/components/diff_code_quality_spec.js
new file mode 100644
index 00000000000..81a817c47dc
--- /dev/null
+++ b/spec/frontend/diffs/components/diff_code_quality_spec.js
@@ -0,0 +1,66 @@
+import { GlIcon } from '@gitlab/ui';
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import DiffCodeQuality from '~/diffs/components/diff_code_quality.vue';
+import { SEVERITY_CLASSES, SEVERITY_ICONS } from '~/reports/codequality_report/constants';
+import { multipleFindingsArr } from '../mock_data/diff_code_quality';
+
+let wrapper;
+
+const findIcon = () => wrapper.findComponent(GlIcon);
+
+describe('DiffCodeQuality', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const createWrapper = (codeQuality, mountFunction = mountExtended) => {
+ return mountFunction(DiffCodeQuality, {
+ propsData: {
+ expandedLines: [],
+ line: 1,
+ codeQuality,
+ },
+ });
+ };
+
+ it('hides details and throws hideCodeQualityFindings event on close click', async () => {
+ wrapper = createWrapper(multipleFindingsArr);
+ expect(wrapper.findByTestId('diff-codequality').exists()).toBe(true);
+
+ await wrapper.findByTestId('diff-codequality-close').trigger('click');
+
+ expect(wrapper.emitted('hideCodeQualityFindings').length).toBe(1);
+ expect(wrapper.emitted().hideCodeQualityFindings[0][0]).toBe(wrapper.props('line'));
+ });
+
+ it('renders correct amount of list items for codequality array and their description', async () => {
+ wrapper = createWrapper(multipleFindingsArr);
+ const listItems = wrapper.findAll('li');
+
+ expect(wrapper.findAll('li').length).toBe(3);
+
+ listItems.wrappers.map((e, i) => {
+ return expect(e.text()).toEqual(multipleFindingsArr[i].description);
+ });
+ });
+
+ it.each`
+ severity
+ ${'info'}
+ ${'minor'}
+ ${'major'}
+ ${'critical'}
+ ${'blocker'}
+ ${'unknown'}
+ `('shows icon for $severity degradation', ({ severity }) => {
+ wrapper = createWrapper([{ severity }], shallowMountExtended);
+
+ expect(findIcon().exists()).toBe(true);
+
+ expect(findIcon().attributes()).toMatchObject({
+ class: `codequality-severity-icon ${SEVERITY_CLASSES[severity]}`,
+ name: SEVERITY_ICONS[severity],
+ size: '12',
+ });
+ });
+});
diff --git a/spec/frontend/diffs/components/diff_content_spec.js b/spec/frontend/diffs/components/diff_content_spec.js
index 7d2afe105a5..6844e6e497a 100644
--- a/spec/frontend/diffs/components/diff_content_spec.js
+++ b/spec/frontend/diffs/components/diff_content_spec.js
@@ -10,7 +10,7 @@ import { diffViewerModes } from '~/ide/constants';
import NoteForm from '~/notes/components/note_form.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 diffFileMockData from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
Vue.use(Vuex);
@@ -28,7 +28,7 @@ describe('DiffContent', () => {
const getCommentFormForDiffFileGetterMock = jest.fn();
const defaultProps = {
- diffFile: JSON.parse(JSON.stringify(diffFileMockData)),
+ diffFile: getDiffFileMock(),
};
const createComponent = ({ props, state, provide } = {}) => {
@@ -70,7 +70,7 @@ describe('DiffContent', () => {
isInlineView: isInlineViewGetterMock,
isParallelView: isParallelViewGetterMock,
getCommentFormForDiffFile: getCommentFormForDiffFileGetterMock,
- diffLines: () => () => [...diffFileMockData.parallel_diff_lines],
+ diffLines: () => () => [...getDiffFileMock().parallel_diff_lines],
fileLineCodequality: () => () => [],
},
actions: {
diff --git a/spec/frontend/diffs/components/diff_expansion_cell_spec.js b/spec/frontend/diffs/components/diff_expansion_cell_spec.js
index 5ff0728b358..34bb73ccf26 100644
--- a/spec/frontend/diffs/components/diff_expansion_cell_spec.js
+++ b/spec/frontend/diffs/components/diff_expansion_cell_spec.js
@@ -1,10 +1,9 @@
import { mount } from '@vue/test-utils';
-import { cloneDeep } from 'lodash';
import DiffExpansionCell from '~/diffs/components/diff_expansion_cell.vue';
import { INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
import { getPreviousLineIndex } from '~/diffs/store/utils';
import { createStore } from '~/mr_notes/stores';
-import diffFileMockData from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
const EXPAND_UP_CLASS = '.js-unfold';
const EXPAND_DOWN_CLASS = '.js-unfold-down';
@@ -26,7 +25,7 @@ function makeLoadMoreLinesPayload({
isExpandDown = false,
}) {
return {
- endpoint: diffFileMockData.context_lines_path,
+ endpoint: getDiffFileMock().context_lines_path,
params: {
since: sinceLine,
to: toLine,
@@ -57,7 +56,7 @@ describe('DiffExpansionCell', () => {
let store;
beforeEach(() => {
- mockFile = cloneDeep(diffFileMockData);
+ mockFile = getDiffFileMock();
mockLine = getLine(mockFile, INLINE_DIFF_VIEW_TYPE, 8);
store = createStore();
store.state.diffs.diffFiles = [mockFile];
@@ -117,102 +116,102 @@ describe('DiffExpansionCell', () => {
});
describe('any row', () => {
- [
- { diffViewType: INLINE_DIFF_VIEW_TYPE, lineIndex: 8, file: cloneDeep(diffFileMockData) },
- ].forEach(({ diffViewType, file, lineIndex }) => {
- describe(`with diffViewType (${diffViewType})`, () => {
- beforeEach(() => {
- mockLine = getLine(mockFile, diffViewType, lineIndex);
- store.state.diffs.diffFiles = [{ ...mockFile, ...file }];
- store.state.diffs.diffViewType = diffViewType;
- });
-
- it('does not initially dispatch anything', () => {
- expect(store.dispatch).not.toHaveBeenCalled();
- });
-
- it('on expand all clicked, dispatch loadMoreLines', () => {
- const oldLineNumber = mockLine.meta_data.old_pos;
- const newLineNumber = mockLine.meta_data.new_pos;
- const previousIndex = getPreviousLineIndex(mockFile, {
- oldLineNumber,
- newLineNumber,
+ [{ diffViewType: INLINE_DIFF_VIEW_TYPE, lineIndex: 8, file: getDiffFileMock() }].forEach(
+ ({ diffViewType, file, lineIndex }) => {
+ describe(`with diffViewType (${diffViewType})`, () => {
+ beforeEach(() => {
+ mockLine = getLine(mockFile, diffViewType, lineIndex);
+ store.state.diffs.diffFiles = [{ ...mockFile, ...file }];
+ store.state.diffs.diffViewType = diffViewType;
});
- const wrapper = createComponent({ file, lineCountBetween: 10 });
-
- findExpandAll(wrapper).trigger('click');
+ it('does not initially dispatch anything', () => {
+ expect(store.dispatch).not.toHaveBeenCalled();
+ });
- expect(store.dispatch).toHaveBeenCalledWith(
- 'diffs/loadMoreLines',
- makeLoadMoreLinesPayload({
- fileHash: mockFile.file_hash,
- toLine: newLineNumber - 1,
- sinceLine: previousIndex,
+ it('on expand all clicked, dispatch loadMoreLines', () => {
+ const oldLineNumber = mockLine.meta_data.old_pos;
+ const newLineNumber = mockLine.meta_data.new_pos;
+ const previousIndex = getPreviousLineIndex(mockFile, {
oldLineNumber,
- }),
- );
- });
+ newLineNumber,
+ });
+
+ const wrapper = createComponent({ file, lineCountBetween: 10 });
+
+ findExpandAll(wrapper).trigger('click');
+
+ expect(store.dispatch).toHaveBeenCalledWith(
+ 'diffs/loadMoreLines',
+ makeLoadMoreLinesPayload({
+ fileHash: mockFile.file_hash,
+ toLine: newLineNumber - 1,
+ sinceLine: previousIndex,
+ oldLineNumber,
+ }),
+ );
+ });
- it('on expand up clicked, dispatch loadMoreLines', () => {
- mockLine.meta_data.old_pos = 200;
- mockLine.meta_data.new_pos = 200;
+ it('on expand up clicked, dispatch loadMoreLines', () => {
+ mockLine.meta_data.old_pos = 200;
+ mockLine.meta_data.new_pos = 200;
- const oldLineNumber = mockLine.meta_data.old_pos;
- const newLineNumber = mockLine.meta_data.new_pos;
+ const oldLineNumber = mockLine.meta_data.old_pos;
+ const newLineNumber = mockLine.meta_data.new_pos;
- const wrapper = createComponent({ file });
+ const wrapper = createComponent({ file });
- findExpandUp(wrapper).trigger('click');
+ findExpandUp(wrapper).trigger('click');
- expect(store.dispatch).toHaveBeenCalledWith(
- 'diffs/loadMoreLines',
- makeLoadMoreLinesPayload({
- fileHash: mockFile.file_hash,
- toLine: newLineNumber - 1,
- sinceLine: 179,
- oldLineNumber,
- diffViewType,
- unfold: true,
- }),
- );
- });
+ expect(store.dispatch).toHaveBeenCalledWith(
+ 'diffs/loadMoreLines',
+ makeLoadMoreLinesPayload({
+ fileHash: mockFile.file_hash,
+ toLine: newLineNumber - 1,
+ sinceLine: 179,
+ oldLineNumber,
+ diffViewType,
+ unfold: true,
+ }),
+ );
+ });
- it('on expand down clicked, dispatch loadMoreLines', () => {
- mockFile[lineSources[diffViewType]][lineIndex + 1] = cloneDeep(
- mockFile[lineSources[diffViewType]][lineIndex],
- );
- const nextLine = getLine(mockFile, diffViewType, lineIndex + 1);
-
- nextLine.meta_data.old_pos = 300;
- nextLine.meta_data.new_pos = 300;
- mockLine.meta_data.old_pos = 200;
- mockLine.meta_data.new_pos = 200;
-
- const wrapper = createComponent({ file });
-
- findExpandDown(wrapper).trigger('click');
-
- expect(store.dispatch).toHaveBeenCalledWith('diffs/loadMoreLines', {
- endpoint: diffFileMockData.context_lines_path,
- params: {
- since: 1,
- to: 21, // the load amount, plus 1 line
- offset: 0,
- unfold: true,
- bottom: true,
- },
- lineNumbers: {
- // when expanding down, these are based on the previous line, 0, in this case
- oldLineNumber: 0,
- newLineNumber: 0,
- },
- nextLineNumbers: { old_line: 200, new_line: 200 },
- fileHash: mockFile.file_hash,
- isExpandDown: true,
+ it('on expand down clicked, dispatch loadMoreLines', () => {
+ mockFile[lineSources[diffViewType]][lineIndex + 1] = getDiffFileMock()[
+ lineSources[diffViewType]
+ ][lineIndex];
+ const nextLine = getLine(mockFile, diffViewType, lineIndex + 1);
+
+ nextLine.meta_data.old_pos = 300;
+ nextLine.meta_data.new_pos = 300;
+ mockLine.meta_data.old_pos = 200;
+ mockLine.meta_data.new_pos = 200;
+
+ const wrapper = createComponent({ file });
+
+ findExpandDown(wrapper).trigger('click');
+
+ expect(store.dispatch).toHaveBeenCalledWith('diffs/loadMoreLines', {
+ endpoint: mockFile.context_lines_path,
+ params: {
+ since: 1,
+ to: 21, // the load amount, plus 1 line
+ offset: 0,
+ unfold: true,
+ bottom: true,
+ },
+ lineNumbers: {
+ // when expanding down, these are based on the previous line, 0, in this case
+ oldLineNumber: 0,
+ newLineNumber: 0,
+ },
+ nextLineNumbers: { old_line: 200, new_line: 200 },
+ fileHash: mockFile.file_hash,
+ isExpandDown: true,
+ });
});
});
- });
- });
+ },
+ );
});
});
diff --git a/spec/frontend/diffs/components/diff_file_spec.js b/spec/frontend/diffs/components/diff_file_spec.js
index a0aa4c784bf..9e8d9e1ca29 100644
--- a/spec/frontend/diffs/components/diff_file_spec.js
+++ b/spec/frontend/diffs/components/diff_file_spec.js
@@ -20,7 +20,7 @@ import axios from '~/lib/utils/axios_utils';
import { scrollToElement } from '~/lib/utils/common_utils';
import httpStatus from '~/lib/utils/http_status';
import createNotesStore from '~/notes/stores/modules';
-import diffFileMockDataReadable from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
import diffFileMockDataUnreadable from '../mock_data/diff_file_unreadable';
jest.mock('~/lib/utils/common_utils');
@@ -106,7 +106,7 @@ 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 getReadableFile = () => JSON.parse(JSON.stringify(diffFileMockDataReadable));
+const getReadableFile = () => getDiffFileMock();
const getUnreadableFile = () => JSON.parse(JSON.stringify(diffFileMockDataUnreadable));
const makeFileAutomaticallyCollapsed = (store, index = 0) =>
diff --git a/spec/frontend/diffs/components/diff_line_note_form_spec.js b/spec/frontend/diffs/components/diff_line_note_form_spec.js
index b59043168b8..542d61c4680 100644
--- a/spec/frontend/diffs/components/diff_line_note_form_spec.js
+++ b/spec/frontend/diffs/components/diff_line_note_form_spec.js
@@ -1,200 +1,207 @@
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import Vuex from 'vuex';
+import Autosave from '~/autosave';
import DiffLineNoteForm from '~/diffs/components/diff_line_note_form.vue';
-import { createStore } from '~/mr_notes/stores';
+import { createModules } from '~/mr_notes/stores';
import NoteForm from '~/notes/components/note_form.vue';
+import MultilineCommentForm from '~/notes/components/multiline_comment_form.vue';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import { noteableDataMock } from 'jest/notes/mock_data';
-import diffFileMockData from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
-jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal', () => {
- return {
- confirmAction: jest.fn(),
- };
-});
+jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal');
+jest.mock('~/autosave');
describe('DiffLineNoteForm', () => {
let wrapper;
let diffFile;
let diffLines;
- const getDiffFileMock = () => ({ ...diffFileMockData });
+ let actions;
+ let store;
- const createComponent = (args = {}) => {
- diffFile = getDiffFileMock();
- diffLines = diffFile.highlighted_diff_lines;
- const store = createStore();
+ const getSelectedLine = () => {
+ const lineCode = diffLines[1].line_code;
+ return diffFile.highlighted_diff_lines.find((l) => l.line_code === lineCode);
+ };
+
+ const createStore = (state) => {
+ const modules = createModules();
+ modules.diffs.actions = {
+ ...modules.diffs.actions,
+ saveDiffDiscussion: jest.fn(() => Promise.resolve()),
+ };
+ modules.diffs.getters = {
+ ...modules.diffs.getters,
+ diffCompareDropdownTargetVersions: jest.fn(),
+ diffCompareDropdownSourceVersions: jest.fn(),
+ selectedSourceIndex: jest.fn(),
+ };
+ modules.notes.getters = {
+ ...modules.notes.getters,
+ noteableType: jest.fn(),
+ };
+ actions = modules.diffs.actions;
+
+ store = new Vuex.Store({ modules });
store.state.notes.userData.id = 1;
store.state.notes.noteableData = noteableDataMock;
+
+ store.replaceState({ ...store.state, ...state });
+ };
+
+ const createComponent = ({ props, state } = {}) => {
+ wrapper?.destroy();
+ diffFile = getDiffFileMock();
+ diffLines = diffFile.highlighted_diff_lines;
+
+ createStore(state);
store.state.diffs.diffFiles = [diffFile];
- store.replaceState({ ...store.state, ...args.state });
+ const propsData = {
+ diffFileHash: diffFile.file_hash,
+ diffLines,
+ line: diffLines[1],
+ range: { start: diffLines[0], end: diffLines[1] },
+ noteTargetLine: diffLines[1],
+ ...props,
+ };
- return shallowMount(DiffLineNoteForm, {
+ wrapper = shallowMount(DiffLineNoteForm, {
store,
- propsData: {
- ...{
- diffFileHash: diffFile.file_hash,
- diffLines,
- line: diffLines[1],
- range: { start: diffLines[0], end: diffLines[1] },
- noteTargetLine: diffLines[1],
- },
- ...(args.props || {}),
- },
+ propsData,
});
};
const findNoteForm = () => wrapper.findComponent(NoteForm);
+ const findCommentForm = () => wrapper.findComponent(MultilineCommentForm);
- describe('methods', () => {
- beforeEach(() => {
- wrapper = createComponent();
- });
-
- describe('handleCancelCommentForm', () => {
- afterEach(() => {
- confirmAction.mockReset();
- });
-
- it('should ask for confirmation when shouldConfirm and isDirty passed as truthy', () => {
- confirmAction.mockResolvedValueOnce(false);
-
- findNoteForm().vm.$emit('cancelForm', true, true);
-
- expect(confirmAction).toHaveBeenCalled();
- });
+ beforeEach(() => {
+ Autosave.mockClear();
+ createComponent();
+ });
- it('should only ask for confirmation once', () => {
- // Never resolve so we can test what happens when triggered while "confirmAction" is loading
- confirmAction.mockImplementation(() => new Promise(() => {}));
+ it('shows note form', () => {
+ expect(wrapper.find(NoteForm).exists()).toBe(true);
+ });
- findNoteForm().vm.$emit('cancelForm', true, true);
- findNoteForm().vm.$emit('cancelForm', true, true);
+ it('passes the provided range of lines to comment form', () => {
+ expect(findCommentForm().props('lineRange')).toMatchObject({
+ start: diffLines[0],
+ end: diffLines[1],
+ });
+ });
- expect(confirmAction).toHaveBeenCalledTimes(1);
- });
+ it('respects empty range when passing a range of lines', () => {
+ createComponent({ props: { range: null } });
+ expect(findCommentForm().props('lineRange')).toMatchObject({
+ start: diffLines[1],
+ end: diffLines[1],
+ });
+ });
- it('should not ask for confirmation when one of the params false', () => {
- confirmAction.mockResolvedValueOnce(false);
+ it('should init autosave', () => {
+ expect(Autosave).toHaveBeenCalledWith({}, [
+ 'Note',
+ 'Issue',
+ 98,
+ undefined,
+ 'DiffNote',
+ undefined,
+ '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
+ ]);
+ });
- findNoteForm().vm.$emit('cancelForm', true, false);
+ describe('when cancelling form', () => {
+ afterEach(() => {
+ confirmAction.mockReset();
+ });
- expect(confirmAction).not.toHaveBeenCalled();
+ it('should only ask for confirmation once', () => {
+ let finalizePromise;
+ confirmAction.mockImplementation(
+ () =>
+ new Promise((resolve) => {
+ finalizePromise = resolve;
+ }),
+ );
- findNoteForm().vm.$emit('cancelForm', false, true);
+ findNoteForm().vm.$emit('cancelForm', true, true);
+ findNoteForm().vm.$emit('cancelForm', true, true);
- expect(confirmAction).not.toHaveBeenCalled();
- });
+ expect(confirmAction).toHaveBeenCalledTimes(1);
+ finalizePromise();
+ });
- it('should call cancelCommentForm with lineCode', async () => {
+ describe('with confirmation', () => {
+ beforeEach(() => {
confirmAction.mockResolvedValueOnce(true);
- jest.spyOn(wrapper.vm, 'cancelCommentForm').mockImplementation(() => {});
- jest.spyOn(wrapper.vm, 'resetAutoSave').mockImplementation(() => {});
+ });
+ it('should ask form confirmation and hide form for a line', async () => {
findNoteForm().vm.$emit('cancelForm', true, true);
-
await nextTick();
-
expect(confirmAction).toHaveBeenCalled();
-
await nextTick();
- expect(wrapper.vm.cancelCommentForm).toHaveBeenCalledWith({
- lineCode: diffLines[1].line_code,
- fileHash: wrapper.vm.diffFileHash,
- });
- expect(wrapper.vm.resetAutoSave).toHaveBeenCalled();
+ expect(getSelectedLine().hasForm).toBe(false);
+ expect(Autosave.mock.instances[0].reset).toHaveBeenCalled();
});
});
- describe('saveNoteForm', () => {
- it('should call saveNote action with proper params', async () => {
- const saveDiffDiscussionSpy = jest
- .spyOn(wrapper.vm, 'saveDiffDiscussion')
- .mockReturnValue(Promise.resolve());
-
- const lineRange = {
- start: {
- line_code: wrapper.vm.commentLineStart.line_code,
- type: wrapper.vm.commentLineStart.type,
- new_line: 2,
- old_line: null,
- },
- end: {
- line_code: wrapper.vm.line.line_code,
- type: wrapper.vm.line.type,
- new_line: 2,
- old_line: null,
- },
- };
-
- const formData = {
- ...wrapper.vm.formData,
- lineRange,
- };
-
- await wrapper.vm.handleSaveNote('note body');
- expect(saveDiffDiscussionSpy).toHaveBeenCalledWith({
- note: 'note body',
- formData,
- });
+ describe('without confirmation', () => {
+ beforeEach(() => {
+ confirmAction.mockResolvedValueOnce(false);
});
- });
- });
- describe('created', () => {
- it('should use the provided `range` of lines', () => {
- wrapper = createComponent();
+ it('should ask for confirmation when shouldConfirm and isDirty passed as truthy', () => {
+ findNoteForm().vm.$emit('cancelForm', true, true);
- expect(wrapper.vm.lines.start).toBe(diffLines[0]);
- expect(wrapper.vm.lines.end).toBe(diffLines[1]);
- });
+ expect(confirmAction).toHaveBeenCalled();
+ });
- it("should fill the internal `lines` data with the provided `line` if there's no provided `range", () => {
- wrapper = createComponent({ props: { range: null } });
+ it('should not ask for confirmation when one of the params false', () => {
+ findNoteForm().vm.$emit('cancelForm', true, false);
- expect(wrapper.vm.lines.start).toBe(diffLines[1]);
- expect(wrapper.vm.lines.end).toBe(diffLines[1]);
- });
- });
+ expect(confirmAction).not.toHaveBeenCalled();
- describe('mounted', () => {
- it('should init autosave', () => {
- const key = 'autosave/Note/Issue/98//DiffNote//1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2';
- wrapper = createComponent();
+ findNoteForm().vm.$emit('cancelForm', false, true);
- expect(wrapper.vm.autosave).toBeDefined();
- expect(wrapper.vm.autosave.key).toEqual(key);
+ expect(confirmAction).not.toHaveBeenCalled();
+ });
});
+ });
- it('should set selectedCommentPosition', () => {
- wrapper = createComponent();
- let startLineCode = wrapper.vm.commentLineStart.line_code;
- let lineCode = wrapper.vm.line.line_code;
-
- expect(startLineCode).toEqual(lineCode);
- wrapper.destroy();
-
- const state = {
- notes: {
- selectedCommentPosition: {
- start: {
- line_code: 'test',
- },
- },
+ describe('saving note', () => {
+ it('should save original line', async () => {
+ const lineRange = {
+ start: {
+ line_code: diffLines[1].line_code,
+ type: diffLines[1].type,
+ new_line: 2,
+ old_line: null,
+ },
+ end: {
+ line_code: diffLines[1].line_code,
+ type: diffLines[1].type,
+ new_line: 2,
+ old_line: null,
},
};
- wrapper = createComponent({ state });
- startLineCode = wrapper.vm.commentLineStart.line_code;
- lineCode = state.notes.selectedCommentPosition.start.line_code;
- expect(startLineCode).toEqual(lineCode);
+ await findNoteForm().vm.$emit('handleFormUpdate', 'note body');
+ expect(actions.saveDiffDiscussion.mock.calls[0][1].formData).toMatchObject({
+ lineRange,
+ });
});
- });
- describe('template', () => {
- it('should have note form', () => {
- wrapper = createComponent();
- expect(wrapper.find(NoteForm).exists()).toBe(true);
+ it('should save selected line from the store', async () => {
+ const lineCode = 'test';
+ store.state.notes.selectedCommentPosition = { start: { line_code: lineCode } };
+ createComponent({ state: store.state });
+ await findNoteForm().vm.$emit('handleFormUpdate', 'note body');
+ expect(actions.saveDiffDiscussion.mock.calls[0][1].formData.lineRange.start.line_code).toBe(
+ lineCode,
+ );
});
});
});
diff --git a/spec/frontend/diffs/components/diff_row_spec.js b/spec/frontend/diffs/components/diff_row_spec.js
index 4c5ce429c9d..be81508213b 100644
--- a/spec/frontend/diffs/components/diff_row_spec.js
+++ b/spec/frontend/diffs/components/diff_row_spec.js
@@ -6,7 +6,7 @@ import DiffRow from '~/diffs/components/diff_row.vue';
import { mapParallel } from '~/diffs/components/diff_row_utils';
import diffsModule from '~/diffs/store/modules';
import { findInteropAttributes } from '../find_interop_attributes';
-import diffFileMockData from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
const showCommentForm = jest.fn();
const enterdragging = jest.fn();
@@ -210,6 +210,7 @@ describe('DiffRow', () => {
});
describe('sets coverage title and class', () => {
+ const diffFileMockData = getDiffFileMock();
const thisLine = diffFileMockData.parallel_diff_lines[2];
const rightLine = diffFileMockData.parallel_diff_lines[2].right;
diff --git a/spec/frontend/diffs/components/diff_stats_spec.js b/spec/frontend/diffs/components/diff_stats_spec.js
index 4ef1ec55cb0..09fe69e97de 100644
--- a/spec/frontend/diffs/components/diff_stats_spec.js
+++ b/spec/frontend/diffs/components/diff_stats_spec.js
@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import DiffStats from '~/diffs/components/diff_stats.vue';
-import mockDiffFile from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
const TEST_ADDED_LINES = 100;
const TEST_REMOVED_LINES = 200;
@@ -48,6 +48,7 @@ describe('diff_stats', () => {
const getBytesContainer = () => wrapper.find('.diff-stats > div:first-child');
beforeEach(() => {
+ const mockDiffFile = getDiffFileMock();
file = {
...mockDiffFile,
viewer: {
diff --git a/spec/frontend/diffs/components/diff_view_spec.js b/spec/frontend/diffs/components/diff_view_spec.js
index dfbe30e460b..15923a1c6de 100644
--- a/spec/frontend/diffs/components/diff_view_spec.js
+++ b/spec/frontend/diffs/components/diff_view_spec.js
@@ -1,7 +1,9 @@
import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
+import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import DiffView from '~/diffs/components/diff_view.vue';
+import DiffCodeQuality from '~/diffs/components/diff_code_quality.vue';
+import { diffCodeQuality } from '../mock_data/diff_code_quality';
describe('DiffView', () => {
const DiffExpansionCell = { template: `<div/>` };
@@ -12,7 +14,7 @@ describe('DiffView', () => {
const setSelectedCommentPosition = jest.fn();
const getDiffRow = (wrapper) => wrapper.findComponent(DiffRow).vm;
- const createWrapper = (props) => {
+ const createWrapper = (props, provide = {}) => {
Vue.use(Vuex);
const batchComments = {
@@ -46,9 +48,33 @@ describe('DiffView', () => {
...props,
};
const stubs = { DiffExpansionCell, DiffRow, DiffCommentCell, DraftNote };
- return shallowMount(DiffView, { propsData, store, stubs });
+ return shallowMount(DiffView, { propsData, store, stubs, provide });
};
+ it('does not render a codeQuality diff view when there is no finding', () => {
+ const wrapper = createWrapper();
+ expect(wrapper.findComponent(DiffCodeQuality).exists()).toBe(false);
+ });
+
+ it('does render a codeQuality diff view with the correct props when there is a finding & refactorCodeQualityInlineFindings flag is true ', async () => {
+ const wrapper = createWrapper(diffCodeQuality, {
+ glFeatures: { refactorCodeQualityInlineFindings: true },
+ });
+ wrapper.findComponent(DiffRow).vm.$emit('toggleCodeQualityFindings', 2);
+ await nextTick();
+ expect(wrapper.findComponent(DiffCodeQuality).exists()).toBe(true);
+ expect(wrapper.findComponent(DiffCodeQuality).props().codeQuality.length).not.toBe(0);
+ });
+
+ it('does not render a codeQuality diff view when there is a finding & refactorCodeQualityInlineFindings flag is false ', async () => {
+ const wrapper = createWrapper(diffCodeQuality, {
+ glFeatures: { refactorCodeQualityInlineFindings: false },
+ });
+ wrapper.findComponent(DiffRow).vm.$emit('toggleCodeQualityFindings', 2);
+ await nextTick();
+ expect(wrapper.findComponent(DiffCodeQuality).exists()).toBe(false);
+ });
+
it.each`
type | side | container | sides | total
${'parallel'} | ${'left'} | ${'.old'} | ${{ left: { lineDraft: {}, renderDiscussion: true }, right: { lineDraft: {}, renderDiscussion: true } }} | ${2}
diff --git a/spec/frontend/diffs/components/settings_dropdown_spec.js b/spec/frontend/diffs/components/settings_dropdown_spec.js
index 693fc5bfd8f..2ec11ba86fd 100644
--- a/spec/frontend/diffs/components/settings_dropdown_spec.js
+++ b/spec/frontend/diffs/components/settings_dropdown_spec.js
@@ -1,6 +1,5 @@
import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import SettingsDropdown from '~/diffs/components/settings_dropdown.vue';
@@ -139,9 +138,7 @@ describe('Diff settings dropdown component', () => {
const checkbox = wrapper.findByTestId('show-whitespace');
const { checked } = checkbox.element;
- checkbox.trigger('click');
-
- await nextTick();
+ await checkbox.setChecked(false);
expect(store.dispatch).toHaveBeenCalledWith('diffs/setShowWhitespace', {
showWhitespace: !checked,
@@ -182,9 +179,7 @@ describe('Diff settings dropdown component', () => {
Object.assign(origStore.state.diffs, { viewDiffsFileByFile: start }),
});
- getFileByFileCheckbox(wrapper).trigger('click');
-
- await nextTick();
+ await getFileByFileCheckbox(wrapper).setChecked(setting);
expect(store.dispatch).toHaveBeenCalledWith('diffs/setFileByFile', {
fileByFile: setting,
diff --git a/spec/frontend/diffs/components/tree_list_spec.js b/spec/frontend/diffs/components/tree_list_spec.js
index 963805f4792..931a9562d36 100644
--- a/spec/frontend/diffs/components/tree_list_spec.js
+++ b/spec/frontend/diffs/components/tree_list_spec.js
@@ -50,6 +50,19 @@ describe('Diffs tree list component', () => {
type: 'blob',
parentPath: 'app',
},
+ 'test.rb': {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'test.rb',
+ name: 'test.rb',
+ path: 'app/test.rb',
+ removedLines: 0,
+ tempFile: true,
+ type: 'blob',
+ parentPath: 'app',
+ },
app: {
key: 'app',
path: 'app',
@@ -85,6 +98,23 @@ describe('Diffs tree list component', () => {
createComponent();
});
+ describe('search by file extension', () => {
+ it.each`
+ extension | itemSize
+ ${'*.md'} | ${0}
+ ${'*.js'} | ${1}
+ ${'index.js'} | ${1}
+ ${'app/*.js'} | ${1}
+ ${'*.js, *.rb'} | ${2}
+ `('it returns $itemSize item for $extension', async ({ extension, itemSize }) => {
+ wrapper.find('[data-testid="diff-tree-search"]').setValue(extension);
+
+ await nextTick();
+
+ expect(getFileRows()).toHaveLength(itemSize);
+ });
+ });
+
it('renders tree', () => {
expect(getFileRows()).toHaveLength(2);
expect(getFileRows().at(0).html()).toContain('index.js');
@@ -120,7 +150,7 @@ describe('Diffs tree list component', () => {
wrapper.vm.$store.state.diffs.renderTreeList = false;
await nextTick();
- expect(getFileRows()).toHaveLength(1);
+ expect(getFileRows()).toHaveLength(2);
});
it('renders file paths when renderTreeList is false', async () => {
diff --git a/spec/frontend/diffs/mock_data/diff_code_quality.js b/spec/frontend/diffs/mock_data/diff_code_quality.js
new file mode 100644
index 00000000000..2ca421a20b4
--- /dev/null
+++ b/spec/frontend/diffs/mock_data/diff_code_quality.js
@@ -0,0 +1,62 @@
+export const multipleFindingsArr = [
+ {
+ severity: 'minor',
+ description: 'Unexpected Debugger Statement.',
+ line: 2,
+ },
+ {
+ severity: 'major',
+ description:
+ 'Function `aVeryLongFunction` has 52 lines of code (exceeds 25 allowed). Consider refactoring.',
+ line: 3,
+ },
+ {
+ severity: 'minor',
+ description: 'Arrow function has too many statements (52). Maximum allowed is 30.',
+ line: 3,
+ },
+];
+
+export const multipleFindings = {
+ filePath: 'index.js',
+ codequality: multipleFindingsArr,
+};
+
+export const singularFinding = {
+ filePath: 'index.js',
+ codequality: [multipleFindingsArr[0]],
+};
+
+export const diffCodeQuality = {
+ diffFile: { file_hash: '123' },
+ diffLines: [
+ {
+ left: {
+ type: 'old',
+ old_line: 1,
+ new_line: null,
+ codequality: [],
+ lineDraft: {},
+ },
+ },
+ {
+ left: {
+ type: null,
+ old_line: 2,
+ new_line: 1,
+ codequality: [],
+ lineDraft: {},
+ },
+ },
+ {
+ left: {
+ type: 'new',
+ old_line: null,
+ new_line: 2,
+
+ codequality: [multipleFindingsArr[0]],
+ lineDraft: {},
+ },
+ },
+ ],
+};
diff --git a/spec/frontend/diffs/mock_data/diff_file.js b/spec/frontend/diffs/mock_data/diff_file.js
index 9ebcd5ef26b..dd200b0248c 100644
--- a/spec/frontend/diffs/mock_data/diff_file.js
+++ b/spec/frontend/diffs/mock_data/diff_file.js
@@ -1,4 +1,4 @@
-export default {
+export const getDiffFileMock = () => ({
submodule: false,
submodule_link: null,
blob: {
@@ -305,4 +305,4 @@ export default {
],
discussions: [],
renderingLines: false,
-};
+});
diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js
index cc595e58dda..346e43e5a72 100644
--- a/spec/frontend/diffs/store/actions_spec.js
+++ b/spec/frontend/diffs/store/actions_spec.js
@@ -3,7 +3,7 @@ import Cookies from '~/lib/utils/cookies';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
-import mockDiffFile from 'jest/diffs/mock_data/diff_file';
+import { getDiffFileMock } from 'jest/diffs/mock_data/diff_file';
import {
DIFF_VIEW_COOKIE_NAME,
INLINE_DIFF_VIEW_TYPE,
@@ -754,7 +754,7 @@ describe('DiffsStoreActions', () => {
it('dispatches actions', () => {
const commitId = 'something';
const formData = {
- diffFile: { ...mockDiffFile },
+ diffFile: getDiffFileMock(),
noteableData: {},
};
const note = {};
diff --git a/spec/frontend/diffs/store/mutations_spec.js b/spec/frontend/diffs/store/mutations_spec.js
index 57e623b843d..031e4fe2be2 100644
--- a/spec/frontend/diffs/store/mutations_spec.js
+++ b/spec/frontend/diffs/store/mutations_spec.js
@@ -3,7 +3,7 @@ import createState from '~/diffs/store/modules/diff_state';
import * as types from '~/diffs/store/mutation_types';
import mutations from '~/diffs/store/mutations';
import * as utils from '~/diffs/store/utils';
-import diffFileMockData from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
describe('DiffsStoreMutations', () => {
describe('SET_BASE_CONFIG', () => {
@@ -71,6 +71,7 @@ describe('DiffsStoreMutations', () => {
describe('SET_DIFF_METADATA', () => {
it('should overwrite state with the camelCased data that is passed in', () => {
+ const diffFileMockData = getDiffFileMock();
const state = {
diffFiles: [],
};
@@ -94,7 +95,7 @@ describe('DiffsStoreMutations', () => {
it('should set diff data batch type properly', () => {
const state = { diffFiles: [] };
const diffMock = {
- diff_files: [diffFileMockData],
+ diff_files: [getDiffFileMock()],
};
mutations[types.SET_DIFF_DATA_BATCH](state, diffMock);
diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js
index 6f55f76d7b5..8852c6c62c5 100644
--- a/spec/frontend/diffs/store/utils_spec.js
+++ b/spec/frontend/diffs/store/utils_spec.js
@@ -1,4 +1,3 @@
-import { clone } from 'lodash';
import {
LINE_POSITION_LEFT,
LINE_POSITION_RIGHT,
@@ -14,10 +13,9 @@ import {
import * as utils from '~/diffs/store/utils';
import { MERGE_REQUEST_NOTEABLE_TYPE } from '~/notes/constants';
import { noteableDataMock } from 'jest/notes/mock_data';
-import diffFileMockData from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
import { diffMetadata } from '../mock_data/diff_metadata';
-const getDiffFileMock = () => JSON.parse(JSON.stringify(diffFileMockData));
const getDiffMetadataMock = () => JSON.parse(JSON.stringify(diffMetadata));
describe('DiffsStoreUtils', () => {
@@ -47,7 +45,7 @@ describe('DiffsStoreUtils', () => {
let diffFile;
beforeEach(() => {
- diffFile = { ...clone(diffFileMockData) };
+ diffFile = getDiffFileMock();
});
it('should return the correct previous line number', () => {
diff --git a/spec/frontend/diffs/utils/diff_file_spec.js b/spec/frontend/diffs/utils/diff_file_spec.js
index 778897be3ba..b062a156216 100644
--- a/spec/frontend/diffs/utils/diff_file_spec.js
+++ b/spec/frontend/diffs/utils/diff_file_spec.js
@@ -6,7 +6,7 @@ import {
match,
} from '~/diffs/utils/diff_file';
import { diffViewerModes } from '~/ide/constants';
-import mockDiffFile from '../mock_data/diff_file';
+import { getDiffFileMock } from '../mock_data/diff_file';
function getDiffFiles() {
const loadFull = 'namespace/project/-/merge_requests/12345/diff_for_path?file_identifier=abc';
@@ -210,7 +210,7 @@ describe('diff_file utilities', () => {
];
const validFile = [
'computes the correct stats from a file',
- mockDiffFile,
+ getDiffFileMock(),
{
changed: 1024,
percent: 100,
@@ -223,7 +223,7 @@ describe('diff_file utilities', () => {
const negativeChange = [
'computed the correct states from a file with a negative size change',
{
- ...mockDiffFile,
+ ...getDiffFileMock(),
new_size: 0,
old_size: 1024,
},
diff --git a/spec/frontend/dirty_submit/dirty_submit_form_spec.js b/spec/frontend/dirty_submit/dirty_submit_form_spec.js
index bcbe824bd9f..f24bb7374a3 100644
--- a/spec/frontend/dirty_submit/dirty_submit_form_spec.js
+++ b/spec/frontend/dirty_submit/dirty_submit_form_spec.js
@@ -55,7 +55,6 @@ describe('DirtySubmitForm', () => {
describe('throttling tests', () => {
beforeEach(() => {
throttle.mockImplementation(lodash.throttle);
- jest.useFakeTimers();
});
afterEach(() => {
diff --git a/spec/frontend/emoji/awards_app/store/actions_spec.js b/spec/frontend/emoji/awards_app/store/actions_spec.js
index 0761256ed23..cd3dfab30d4 100644
--- a/spec/frontend/emoji/awards_app/store/actions_spec.js
+++ b/spec/frontend/emoji/awards_app/store/actions_spec.js
@@ -8,10 +8,6 @@ jest.mock('@sentry/browser');
jest.mock('~/vue_shared/plugins/global_toast');
describe('Awards app actions', () => {
- afterEach(() => {
- window.gon = {};
- });
-
describe('setInitialData', () => {
it('commits SET_INITIAL_DATA', async () => {
await testAction(
@@ -52,8 +48,6 @@ describe('Awards app actions', () => {
});
it('commits FETCH_AWARDS_SUCCESS', async () => {
- window.gon.current_user_id = 1;
-
await testAction(
actions.fetchAwards,
'1',
@@ -62,10 +56,6 @@ describe('Awards app actions', () => {
[{ type: 'fetchAwards', payload: '2' }],
);
});
-
- it('does not commit FETCH_AWARDS_SUCCESS when user signed out', async () => {
- await testAction(actions.fetchAwards, '1', { path: '/awards' }, [], []);
- });
});
});
@@ -75,8 +65,6 @@ describe('Awards app actions', () => {
});
it('calls Sentry.captureException', async () => {
- window.gon = { current_user_id: 1 };
-
await testAction(actions.fetchAwards, null, { path: '/awards' }, [], [], () => {
expect(Sentry.captureException).toHaveBeenCalled();
});
diff --git a/spec/frontend/environment.js b/spec/frontend/environment.js
index 8465b57c660..dc1c1dfbe4a 100644
--- a/spec/frontend/environment.js
+++ b/spec/frontend/environment.js
@@ -67,12 +67,6 @@ class CustomEnvironment extends JSDOMEnvironment {
// Expose the jsdom (created in super class) to the global so that we can call reconfigure({ url: '' }) to properly set `window.location`
this.global.jsdom = this.dom;
- Object.assign(this.global.performance, {
- mark: () => null,
- measure: () => null,
- getEntriesByName: () => [],
- });
-
//
// Monaco-related environment variables
//
diff --git a/spec/frontend/environments/canary_update_modal_spec.js b/spec/frontend/environments/canary_update_modal_spec.js
index 22d13558a84..16792dcda1e 100644
--- a/spec/frontend/environments/canary_update_modal_spec.js
+++ b/spec/frontend/environments/canary_update_modal_spec.js
@@ -47,7 +47,7 @@ describe('/environments/components/canary_update_modal.vue', () => {
modalId: 'confirm-canary-change',
actionPrimary: {
text: 'Change ratio',
- attributes: [{ variant: 'info' }],
+ attributes: [{ variant: 'confirm' }],
},
actionCancel: { text: 'Cancel' },
});
diff --git a/spec/frontend/environments/confirm_rollback_modal_spec.js b/spec/frontend/environments/confirm_rollback_modal_spec.js
index b8dcb7c0d08..c4763933468 100644
--- a/spec/frontend/environments/confirm_rollback_modal_spec.js
+++ b/spec/frontend/environments/confirm_rollback_modal_spec.js
@@ -2,6 +2,7 @@ import { GlModal, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
+import { trimText } from 'helpers/text_helper';
import ConfirmRollbackModal from '~/environments/components/confirm_rollback_modal.vue';
import createMockApollo from 'helpers/mock_apollo_helper';
import eventHub from '~/environments/event_hub';
@@ -76,9 +77,9 @@ describe('Confirm Rollback Modal Component', () => {
expect(modal.attributes('title')).toContain('Rollback');
expect(modal.attributes('title')).toContain('test');
- expect(modal.props('actionPrimary').text).toBe('Rollback');
+ expect(modal.props('actionPrimary').text).toBe('Rollback environment');
expect(modal.props('actionPrimary').attributes).toEqual(primaryPropsAttrs);
- expect(modal.text()).toContain('commit abc0123');
+ expect(trimText(modal.text())).toContain('commit abc0123');
expect(modal.text()).toContain('Are you sure you want to continue?');
});
@@ -95,8 +96,8 @@ describe('Confirm Rollback Modal Component', () => {
expect(modal.attributes('title')).toContain('Re-deploy');
expect(modal.attributes('title')).toContain('test');
- expect(modal.props('actionPrimary').text).toBe('Re-deploy');
- expect(modal.text()).toContain('commit abc0123');
+ expect(modal.props('actionPrimary').text).toBe('Re-deploy environment');
+ expect(trimText(modal.text())).toContain('commit abc0123');
expect(modal.text()).toContain('Are you sure you want to continue?');
});
@@ -156,7 +157,7 @@ describe('Confirm Rollback Modal Component', () => {
);
const modal = component.find(GlModal);
- expect(modal.text()).toContain('commit abc0123');
+ expect(trimText(modal.text())).toContain('commit abc0123');
expect(modal.text()).toContain('Are you sure you want to continue?');
});
@@ -180,7 +181,7 @@ describe('Confirm Rollback Modal Component', () => {
expect(modal.attributes('title')).toContain('Rollback');
expect(modal.attributes('title')).toContain('test');
- expect(modal.props('actionPrimary').text).toBe('Rollback');
+ expect(modal.props('actionPrimary').text).toBe('Rollback environment');
expect(modal.props('actionPrimary').attributes).toEqual(primaryPropsAttrs);
});
@@ -204,7 +205,7 @@ describe('Confirm Rollback Modal Component', () => {
expect(modal.attributes('title')).toContain('Re-deploy');
expect(modal.attributes('title')).toContain('test');
- expect(modal.props('actionPrimary').text).toBe('Re-deploy');
+ expect(modal.props('actionPrimary').text).toBe('Re-deploy environment');
});
it('should commit the "rollback" mutation when "ok" is clicked', async () => {
diff --git a/spec/frontend/environments/deploy_board_component_spec.js b/spec/frontend/environments/deploy_board_component_spec.js
index 6bf87f7b07f..4d63648dd48 100644
--- a/spec/frontend/environments/deploy_board_component_spec.js
+++ b/spec/frontend/environments/deploy_board_component_spec.js
@@ -3,11 +3,9 @@ import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import CanaryIngress from '~/environments/components/canary_ingress.vue';
import DeployBoard from '~/environments/components/deploy_board.vue';
-import { deployBoardMockData, environment } from './mock_data';
+import { deployBoardMockData } from './mock_data';
import { rolloutStatus } from './graphql/mock_data';
-const logsPath = `gitlab-org/gitlab-test/-/logs?environment_name=${environment.name}`;
-
describe('Deploy Board', () => {
let wrapper;
@@ -17,7 +15,6 @@ describe('Deploy Board', () => {
deployBoardData: deployBoardMockData,
isLoading: false,
isEmpty: false,
- logsPath,
...props,
},
});
@@ -132,7 +129,6 @@ describe('Deploy Board', () => {
deployBoardData: {},
isLoading: false,
isEmpty: true,
- logsPath,
});
return nextTick();
});
@@ -151,7 +147,6 @@ describe('Deploy Board', () => {
deployBoardData: {},
isLoading: true,
isEmpty: false,
- logsPath,
});
return nextTick();
});
@@ -167,7 +162,6 @@ describe('Deploy Board', () => {
wrapper = createComponent({
isLoading: false,
isEmpty: false,
- logsPath: environment.log_path,
deployBoardData: deployBoardMockData,
});
({ statuses } = wrapper.vm);
diff --git a/spec/frontend/environments/environment_item_spec.js b/spec/frontend/environments/environment_item_spec.js
index 0761d04229c..1c86a66d9b8 100644
--- a/spec/frontend/environments/environment_item_spec.js
+++ b/spec/frontend/environments/environment_item_spec.js
@@ -68,7 +68,7 @@ describe('Environment item', () => {
describe('With deployment', () => {
it('should render deployment internal id', () => {
expect(wrapper.find('.deployment-column span').text()).toContain(
- environment.last_deployment.iid,
+ environment.last_deployment.iid.toString(),
);
expect(wrapper.find('.deployment-column span').text()).toContain('#');
@@ -400,7 +400,7 @@ describe('Environment item', () => {
});
it('should render the number of children in a badge', () => {
- expect(wrapper.find('.folder-name .badge').text()).toContain(folder.size);
+ expect(wrapper.find('.folder-name .badge').text()).toContain(folder.size.toString());
});
it('should not render the "Upcoming deployment" column', () => {
diff --git a/spec/frontend/environments/environment_table_spec.js b/spec/frontend/environments/environment_table_spec.js
index 666e87c748e..aff6b1327f0 100644
--- a/spec/frontend/environments/environment_table_spec.js
+++ b/spec/frontend/environments/environment_table_spec.js
@@ -64,7 +64,6 @@ describe('Environment table', () => {
name: 'review',
size: 1,
environment_path: 'url',
- logs_path: 'url',
id: 1,
hasDeployBoard: true,
deployBoardData: deployBoardMockData,
@@ -92,7 +91,6 @@ describe('Environment table', () => {
name: 'review',
size: 1,
environment_path: 'url',
- logs_path: 'url',
id: 1,
isFolder: true,
isOpen: true,
@@ -161,7 +159,6 @@ describe('Environment table', () => {
name: 'review',
size: 1,
environment_path: 'url',
- logs_path: 'url',
id: 1,
hasDeployBoard: true,
deployBoardData: deployBoardMockData,
diff --git a/spec/frontend/environments/environments_app_spec.js b/spec/frontend/environments/environments_app_spec.js
index 91b75c850bd..57f98c81124 100644
--- a/spec/frontend/environments/environments_app_spec.js
+++ b/spec/frontend/environments/environments_app_spec.js
@@ -204,9 +204,9 @@ describe('~/environments/components/environments_app.vue', () => {
const [available, stopped] = wrapper.findAllByRole('tab').wrappers;
expect(available.text()).toContain(__('Available'));
- expect(available.text()).toContain(resolvedEnvironmentsApp.availableCount);
+ expect(available.text()).toContain(resolvedEnvironmentsApp.availableCount.toString());
expect(stopped.text()).toContain(__('Stopped'));
- expect(stopped.text()).toContain(resolvedEnvironmentsApp.stoppedCount);
+ expect(stopped.text()).toContain(resolvedEnvironmentsApp.stoppedCount.toString());
});
it('should change the requested scope on tab change', async () => {
diff --git a/spec/frontend/error_tracking/components/error_tracking_list_spec.js b/spec/frontend/error_tracking/components/error_tracking_list_spec.js
index 5e0f0ca9bef..23d448f3964 100644
--- a/spec/frontend/error_tracking/components/error_tracking_list_spec.js
+++ b/spec/frontend/error_tracking/components/error_tracking_list_spec.js
@@ -398,6 +398,30 @@ describe('ErrorTrackingList', () => {
});
describe('When pagination is required', () => {
+ describe('and previous cursor is not available', () => {
+ beforeEach(async () => {
+ store.state.list.loading = false;
+ delete store.state.list.pagination.previous;
+ mountComponent();
+ });
+
+ it('disables Prev button in the pagination', async () => {
+ expect(findPagination().props('prevPage')).toBe(null);
+ expect(findPagination().props('nextPage')).not.toBe(null);
+ });
+ });
+ describe('and next cursor is not available', () => {
+ beforeEach(async () => {
+ store.state.list.loading = false;
+ delete store.state.list.pagination.next;
+ mountComponent();
+ });
+
+ it('disables Next button in the pagination', async () => {
+ expect(findPagination().props('prevPage')).not.toBe(null);
+ expect(findPagination().props('nextPage')).toBe(null);
+ });
+ });
describe('and the user is not on the first page', () => {
describe('and the previous button is clicked', () => {
beforeEach(async () => {
diff --git a/spec/frontend/fixtures/api_deploy_keys.rb b/spec/frontend/fixtures/api_deploy_keys.rb
index 7027b8c975b..5ffc726f086 100644
--- a/spec/frontend/fixtures/api_deploy_keys.rb
+++ b/spec/frontend/fixtures/api_deploy_keys.rb
@@ -11,6 +11,7 @@ RSpec.describe API::DeployKeys, '(JavaScript fixtures)', type: :request do
let_it_be(:project2) { create(:project) }
let_it_be(:deploy_key) { create(:deploy_key, public: true) }
let_it_be(:deploy_key2) { create(:deploy_key, public: true) }
+ let_it_be(:deploy_key_without_fingerprint) { create(:deploy_key, :without_md5_fingerprint, public: true) }
let_it_be(:deploy_keys_project) { create(:deploy_keys_project, :write_access, project: project, deploy_key: deploy_key) }
let_it_be(:deploy_keys_project2) { create(:deploy_keys_project, :write_access, project: project2, deploy_key: deploy_key) }
let_it_be(:deploy_keys_project3) { create(:deploy_keys_project, :write_access, project: project, deploy_key: deploy_key2) }
diff --git a/spec/frontend/fixtures/blob.rb b/spec/frontend/fixtures/blob.rb
index af548823886..b2bbdd2749e 100644
--- a/spec/frontend/fixtures/blob.rb
+++ b/spec/frontend/fixtures/blob.rb
@@ -12,7 +12,6 @@ RSpec.describe Projects::BlobController, '(JavaScript fixtures)', type: :control
render_views
before do
- stub_feature_flags(refactor_blob_viewer: false) # This fixture is only used by the legacy (non-refactored) blob viewer
sign_in(user)
allow(SecureRandom).to receive(:hex).and_return('securerandomhex:thereisnospoon')
end
diff --git a/spec/frontend/fixtures/deploy_keys.rb b/spec/frontend/fixtures/deploy_keys.rb
index bed6c798793..154084e0181 100644
--- a/spec/frontend/fixtures/deploy_keys.rb
+++ b/spec/frontend/fixtures/deploy_keys.rb
@@ -27,9 +27,9 @@ RSpec.describe Projects::DeployKeysController, '(JavaScript fixtures)', type: :c
render_views
it 'deploy_keys/keys.json' do
- create(:rsa_deploy_key_2048, public: true)
- project_key = create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCdMHEHyhRjbhEZVddFn6lTWdgEy5Q6Bz4nwGB76xWZI5YT/1WJOMEW+sL5zYd31kk7sd3FJ5L9ft8zWMWrr/iWXQikC2cqZK24H1xy+ZUmrRuJD4qGAaIVoyyzBL+avL+lF8J5lg6YSw8gwJY/lX64/vnJHUlWw2n5BF8IFOWhiw== dummy@gitlab.com')
- internal_key = create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNd/UJWhPrpb+b/G5oL109y57yKuCxE+WUGJGYaj7WQKsYRJmLYh1mgjrl+KVyfsWpq4ylOxIfFSnN9xBBFN8mlb0Fma5DC7YsSsibJr3MZ19ZNBprwNcdogET7aW9I0In7Wu5f2KqI6e5W/spJHCy4JVxzVMUvk6Myab0LnJ2iQ== dummy@gitlab.com')
+ create(:rsa_deploy_key_5120, public: true)
+ project_key = create(:deploy_key)
+ internal_key = create(:deploy_key)
create(:deploy_keys_project, project: project, deploy_key: project_key)
create(:deploy_keys_project, project: project2, deploy_key: internal_key)
create(:deploy_keys_project, project: project3, deploy_key: project_key)
diff --git a/spec/frontend/fixtures/jobs.rb b/spec/frontend/fixtures/jobs.rb
index 3cc87432655..2e15eefdce6 100644
--- a/spec/frontend/fixtures/jobs.rb
+++ b/spec/frontend/fixtures/jobs.rb
@@ -2,40 +2,94 @@
require 'spec_helper'
-RSpec.describe Projects::JobsController, '(JavaScript fixtures)', type: :controller do
+RSpec.describe 'Jobs (JavaScript fixtures)' do
+ include ApiHelpers
include JavaScriptFixturesHelpers
+ include GraphqlHelpers
let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
let(:project) { create(:project, :repository, namespace: namespace, path: 'builds-project') }
let(:user) { project.first_owner }
let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.id) }
- let!(:build_with_artifacts) { create(:ci_build, :success, :artifacts, :trace_artifact, pipeline: pipeline, stage: 'test', artifacts_expire_at: Time.now + 18.months) }
- let!(:failed_build) { create(:ci_build, :failed, pipeline: pipeline, stage: 'build') }
- let!(:pending_build) { create(:ci_build, :pending, pipeline: pipeline, stage: 'deploy') }
- let!(:delayed_job) do
- create(:ci_build, :scheduled,
- pipeline: pipeline,
- name: 'delayed job',
- stage: 'test')
+
+ after do
+ remove_repository(project)
end
- render_views
+ describe Projects::JobsController, type: :controller do
+ let!(:delayed) { create(:ci_build, :scheduled, pipeline: pipeline, name: 'delayed job') }
- before do
- sign_in(user)
- end
+ before do
+ sign_in(user)
+ end
- after do
- remove_repository(project)
+ it 'jobs/delayed.json' do
+ get :show, params: {
+ namespace_id: project.namespace.to_param,
+ project_id: project,
+ id: delayed.to_param
+ }, format: :json
+
+ expect(response).to be_successful
+ end
end
- it 'jobs/delayed.json' do
- get :show, params: {
- namespace_id: project.namespace.to_param,
- project_id: project,
- id: delayed_job.to_param
- }, format: :json
+ describe GraphQL::Query, type: :request do
+ let(:artifact) { create(:ci_job_artifact, file_type: :archive, file_format: :zip) }
+
+ let!(:build) { create(:ci_build, :success, name: 'build', pipeline: pipeline) }
+ let!(:cancelable) { create(:ci_build, :cancelable, name: 'cancelable', pipeline: pipeline) }
+ let!(:created_by_tag) { create(:ci_build, :success, name: 'created_by_tag', tag: true, pipeline: pipeline) }
+ let!(:pending) { create(:ci_build, :pending, name: 'pending', pipeline: pipeline) }
+ let!(:playable) { create(:ci_build, :playable, name: 'playable', pipeline: pipeline) }
+ let!(:retryable) { create(:ci_build, :retryable, name: 'retryable', pipeline: pipeline) }
+ let!(:scheduled) { create(:ci_build, :scheduled, name: 'scheduled', pipeline: pipeline) }
+ let!(:with_artifact) { create(:ci_build, :success, name: 'with_artifact', job_artifacts: [artifact], pipeline: pipeline) }
+ let!(:with_coverage) { create(:ci_build, :success, name: 'with_coverage', coverage: 40.0, pipeline: pipeline) }
+
+ fixtures_path = 'graphql/jobs/'
+ get_jobs_query = 'get_jobs.query.graphql'
+ full_path = 'frontend-fixtures/builds-project'
+
+ let_it_be(:query) do
+ get_graphql_query_as_string("jobs/components/table/graphql/queries/#{get_jobs_query}")
+ end
+
+ it "#{fixtures_path}#{get_jobs_query}.json" do
+ post_graphql(query, current_user: user, variables: {
+ fullPath: full_path
+ })
+
+ expect_graphql_errors_to_be_empty
+ end
+
+ it "#{fixtures_path}#{get_jobs_query}.as_guest.json" do
+ guest = create(:user)
+ project.add_guest(guest)
+
+ post_graphql(query, current_user: guest, variables: {
+ fullPath: full_path
+ })
+
+ expect_graphql_errors_to_be_empty
+ end
+
+ it "#{fixtures_path}#{get_jobs_query}.paginated.json" do
+ post_graphql(query, current_user: user, variables: {
+ fullPath: full_path,
+ first: 2
+ })
+
+ expect_graphql_errors_to_be_empty
+ end
+
+ it "#{fixtures_path}#{get_jobs_query}.empty.json" do
+ post_graphql(query, current_user: user, variables: {
+ fullPath: full_path,
+ first: 0
+ })
- expect(response).to be_successful
+ expect_graphql_errors_to_be_empty
+ end
end
end
diff --git a/spec/frontend/fixtures/runner.rb b/spec/frontend/fixtures/runner.rb
index a79982fa647..36281af0219 100644
--- a/spec/frontend/fixtures/runner.rb
+++ b/spec/frontend/fixtures/runner.rb
@@ -29,7 +29,7 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
before do
allow(Gitlab::Ci::RunnerUpgradeCheck.instance)
.to receive(:check_runner_upgrade_status)
- .and_return(:not_available)
+ .and_return({ not_available: nil })
end
describe do
@@ -39,19 +39,19 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
end
describe GraphQL::Query, type: :request do
- admin_runners_query = 'list/admin_runners.query.graphql'
+ all_runners_query = 'list/all_runners.query.graphql'
let_it_be(:query) do
- get_graphql_query_as_string("#{query_path}#{admin_runners_query}")
+ get_graphql_query_as_string("#{query_path}#{all_runners_query}")
end
- it "#{fixtures_path}#{admin_runners_query}.json" do
+ it "#{fixtures_path}#{all_runners_query}.json" do
post_graphql(query, current_user: admin, variables: {})
expect_graphql_errors_to_be_empty
end
- it "#{fixtures_path}#{admin_runners_query}.paginated.json" do
+ it "#{fixtures_path}#{all_runners_query}.paginated.json" do
post_graphql(query, current_user: admin, variables: { first: 2 })
expect_graphql_errors_to_be_empty
@@ -59,13 +59,13 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
end
describe GraphQL::Query, type: :request do
- admin_runners_count_query = 'list/admin_runners_count.query.graphql'
+ all_runners_count_query = 'list/all_runners_count.query.graphql'
let_it_be(:query) do
- get_graphql_query_as_string("#{query_path}#{admin_runners_count_query}")
+ get_graphql_query_as_string("#{query_path}#{all_runners_count_query}")
end
- it "#{fixtures_path}#{admin_runners_count_query}.json" do
+ it "#{fixtures_path}#{all_runners_count_query}.json" do
post_graphql(query, current_user: admin, variables: {})
expect_graphql_errors_to_be_empty
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index 552377e3381..072cf34d0ef 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -738,7 +738,7 @@ describe('GfmAutoComplete', () => {
$textarea.trigger('focus').val(text).caret('pos', -1);
$textarea.trigger('keyup');
- return new Promise(window.requestAnimationFrame);
+ jest.runOnlyPendingTimers();
};
const getDropdownItems = () => {
@@ -747,10 +747,11 @@ describe('GfmAutoComplete', () => {
return [].map.call(items, (item) => item.textContent.trim());
};
- const expectLabels = ({ input, output }) =>
- triggerDropdown(input).then(() => {
- expect(getDropdownItems()).toEqual(output.map((label) => label.title));
- });
+ const expectLabels = ({ input, output }) => {
+ triggerDropdown(input);
+
+ expect(getDropdownItems()).toEqual(output.map((label) => label.title));
+ };
describe('with no labels assigned', () => {
beforeEach(() => {
diff --git a/spec/frontend/gitlab_pages/new/pages/pages_pipeline_wizard_spec.js b/spec/frontend/gitlab_pages/new/pages/pages_pipeline_wizard_spec.js
new file mode 100644
index 00000000000..685b5144a95
--- /dev/null
+++ b/spec/frontend/gitlab_pages/new/pages/pages_pipeline_wizard_spec.js
@@ -0,0 +1,102 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import waitForPromises from 'helpers/wait_for_promises';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import PagesPipelineWizard, { i18n } from '~/gitlab_pages/components/pages_pipeline_wizard.vue';
+import PipelineWizard from '~/pipeline_wizard/pipeline_wizard.vue';
+import pagesTemplate from '~/pipeline_wizard/templates/pages.yml';
+import pagesMarkOnboardingComplete from '~/gitlab_pages/queries/mark_onboarding_complete.graphql';
+import { redirectTo } from '~/lib/utils/url_utility';
+
+Vue.use(VueApollo);
+
+jest.mock('~/lib/utils/url_utility');
+
+describe('PagesPipelineWizard', () => {
+ const markOnboardingCompleteMutationHandler = jest.fn();
+ let wrapper;
+ const props = {
+ projectPath: '/user/repo',
+ defaultBranch: 'main',
+ redirectToWhenDone: './',
+ };
+
+ const findPipelineWizardWrapper = () => wrapper.findComponent(PipelineWizard);
+ const createMockApolloProvider = () => {
+ return createMockApollo([
+ [
+ pagesMarkOnboardingComplete,
+ markOnboardingCompleteMutationHandler.mockResolvedValue({
+ data: {
+ pagesMarkOnboardingComplete: {
+ onboardingComplete: true,
+ errors: [],
+ },
+ },
+ }),
+ ],
+ ]);
+ };
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(PagesPipelineWizard, {
+ apolloProvider: createMockApolloProvider(),
+ propsData: props,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('shows the pipeline wizard', () => {
+ expect(findPipelineWizardWrapper().exists()).toBe(true);
+ });
+
+ it('passes the appropriate props', () => {
+ const pipelineWizardWrapperProps = findPipelineWizardWrapper().props();
+
+ expect(pipelineWizardWrapperProps.template).toBe(pagesTemplate);
+ expect(pipelineWizardWrapperProps.projectPath).toBe(props.projectPath);
+ expect(pipelineWizardWrapperProps.defaultBranch).toBe(props.defaultBranch);
+ });
+
+ describe('after the steps are complete', () => {
+ const mockDone = () => findPipelineWizardWrapper().vm.$emit('done');
+
+ it('shows a loading screen during the update', async () => {
+ mockDone();
+
+ await nextTick();
+
+ const loadingScreenWrapper = wrapper.findByTestId('onboarding-mutation-loading');
+ expect(loadingScreenWrapper.exists()).toBe(true);
+ expect(loadingScreenWrapper.text()).toBe(i18n.loadingMessage);
+ });
+
+ it('calls pagesMarkOnboardingComplete mutation when done', async () => {
+ mockDone();
+
+ await waitForPromises();
+
+ expect(markOnboardingCompleteMutationHandler).toHaveBeenCalledWith({
+ input: {
+ projectPath: props.projectPath,
+ },
+ });
+ });
+
+ it('navigates to the path defined in redirectToWhenDone when done', async () => {
+ mockDone();
+
+ await waitForPromises();
+
+ expect(redirectTo).toHaveBeenCalledWith(props.redirectToWhenDone);
+ });
+ });
+});
diff --git a/spec/frontend/google_cloud/components/app_spec.js b/spec/frontend/google_cloud/components/app_spec.js
deleted file mode 100644
index 0cafe6d3b9d..00000000000
--- a/spec/frontend/google_cloud/components/app_spec.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { mapValues } from 'lodash';
-import App from '~/google_cloud/components/app.vue';
-import Home from '~/google_cloud/components/home.vue';
-import IncubationBanner from '~/google_cloud/components/incubation_banner.vue';
-import ServiceAccountsForm from '~/google_cloud/components/service_accounts_form.vue';
-import GcpError from '~/google_cloud/components/errors/gcp_error.vue';
-import NoGcpProjects from '~/google_cloud/components/errors/no_gcp_projects.vue';
-
-const BASE_FEEDBACK_URL =
- 'https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new';
-const SCREEN_COMPONENTS = {
- Home,
- ServiceAccountsForm,
- GcpError,
- NoGcpProjects,
-};
-const SERVICE_ACCOUNTS_FORM_PROPS = {
- gcpProjects: [1, 2, 3],
- refs: [4, 5, 6],
- cancelPath: '',
-};
-const HOME_PROPS = {
- serviceAccounts: [{}, {}],
- gcpRegions: [{}, {}],
- createServiceAccountUrl: '#url-create-service-account',
- configureGcpRegionsUrl: '#url-configure-gcp-regions',
- emptyIllustrationUrl: '#url-empty-illustration',
- enableCloudRunUrl: '#url-enable-cloud-run',
- enableCloudStorageUrl: '#enableCloudStorageUrl',
- revokeOauthUrl: '#revokeOauthUrl',
-};
-
-describe('google_cloud App component', () => {
- let wrapper;
-
- const findIncubationBanner = () => wrapper.findComponent(IncubationBanner);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe.each`
- screen | extraProps | componentName
- ${'gcp_error'} | ${{ error: 'mock_gcp_client_error' }} | ${'GcpError'}
- ${'no_gcp_projects'} | ${{}} | ${'NoGcpProjects'}
- ${'service_accounts_form'} | ${SERVICE_ACCOUNTS_FORM_PROPS} | ${'ServiceAccountsForm'}
- ${'home'} | ${HOME_PROPS} | ${'Home'}
- `('for screen=$screen', ({ screen, extraProps, componentName }) => {
- const component = SCREEN_COMPONENTS[componentName];
-
- beforeEach(() => {
- wrapper = shallowMount(App, { propsData: { screen, ...extraProps } });
- });
-
- it(`renders only ${componentName}`, () => {
- const existences = mapValues(SCREEN_COMPONENTS, (x) => wrapper.findComponent(x).exists());
-
- expect(existences).toEqual({
- ...mapValues(SCREEN_COMPONENTS, () => false),
- [componentName]: true,
- });
- });
-
- it(`renders the ${componentName} with props`, () => {
- expect(wrapper.findComponent(component).props()).toEqual(extraProps);
- });
-
- it('renders incubation banner', () => {
- expect(findIncubationBanner().props()).toEqual({
- shareFeedbackUrl: `${BASE_FEEDBACK_URL}?issuable_template=general_feedback`,
- reportBugUrl: `${BASE_FEEDBACK_URL}?issuable_template=report_bug`,
- featureRequestUrl: `${BASE_FEEDBACK_URL}?issuable_template=feature_request`,
- });
- });
- });
-});
diff --git a/spec/frontend/google_cloud/components/deployments_service_table_spec.js b/spec/frontend/google_cloud/components/deployments_service_table_spec.js
deleted file mode 100644
index 882376547c4..00000000000
--- a/spec/frontend/google_cloud/components/deployments_service_table_spec.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { GlButton, GlTable } from '@gitlab/ui';
-import DeploymentsServiceTable from '~/google_cloud/components/deployments_service_table.vue';
-
-describe('google_cloud DeploymentsServiceTable component', () => {
- let wrapper;
-
- const findTable = () => wrapper.findComponent(GlTable);
- const findButtons = () => findTable().findAllComponents(GlButton);
- const findCloudRunButton = () => findButtons().at(0);
- const findCloudStorageButton = () => findButtons().at(1);
-
- beforeEach(() => {
- const propsData = {
- cloudRunUrl: '#url-enable-cloud-run',
- cloudStorageUrl: '#url-enable-cloud-storage',
- };
- wrapper = mount(DeploymentsServiceTable, { propsData });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('should contain a table', () => {
- expect(findTable().exists()).toBe(true);
- });
-
- it('should contain configure cloud run button', () => {
- const cloudRunButton = findCloudRunButton();
- expect(cloudRunButton.exists()).toBe(true);
- expect(cloudRunButton.attributes('href')).toBe('#url-enable-cloud-run');
- });
-
- it('should contain configure cloud storage button', () => {
- const cloudStorageButton = findCloudStorageButton();
- expect(cloudStorageButton.exists()).toBe(true);
- expect(cloudStorageButton.props().disabled).toBe(true);
- expect(cloudStorageButton.attributes('href')).toBe('#url-enable-cloud-storage');
- });
-});
diff --git a/spec/frontend/google_cloud/components/errors/gcp_error_spec.js b/spec/frontend/google_cloud/components/errors/gcp_error_spec.js
deleted file mode 100644
index 4062a8b902a..00000000000
--- a/spec/frontend/google_cloud/components/errors/gcp_error_spec.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { GlAlert } from '@gitlab/ui';
-import GcpError from '~/google_cloud/components/errors/gcp_error.vue';
-
-describe('GcpError component', () => {
- let wrapper;
-
- const findAlert = () => wrapper.findComponent(GlAlert);
- const findBlockquote = () => wrapper.find('blockquote');
-
- const propsData = { error: 'IAM and CloudResourceManager API disabled' };
-
- beforeEach(() => {
- wrapper = shallowMount(GcpError, { propsData });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('contains alert', () => {
- expect(findAlert().exists()).toBe(true);
- });
-
- it('contains relevant text', () => {
- const alertText = findAlert().text();
- expect(findAlert().props('title')).toBe(GcpError.i18n.title);
- expect(alertText).toContain(GcpError.i18n.description);
- });
-
- it('contains error stacktrace', () => {
- expect(findBlockquote().text()).toBe(propsData.error);
- });
-});
diff --git a/spec/frontend/google_cloud/components/errors/no_gcp_projects_spec.js b/spec/frontend/google_cloud/components/errors/no_gcp_projects_spec.js
deleted file mode 100644
index e1e20377880..00000000000
--- a/spec/frontend/google_cloud/components/errors/no_gcp_projects_spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { GlAlert, GlButton } from '@gitlab/ui';
-import NoGcpProjects from '~/google_cloud/components/errors/no_gcp_projects.vue';
-
-describe('NoGcpProjects component', () => {
- let wrapper;
-
- const findAlert = () => wrapper.findComponent(GlAlert);
- const findButton = () => wrapper.findComponent(GlButton);
-
- beforeEach(() => {
- wrapper = mount(NoGcpProjects);
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('contains alert', () => {
- expect(findAlert().exists()).toBe(true);
- });
-
- it('contains relevant text', () => {
- expect(findAlert().props('title')).toBe(NoGcpProjects.i18n.title);
- expect(findAlert().text()).toContain(NoGcpProjects.i18n.description);
- });
-
- it('contains create gcp project button', () => {
- const button = findButton();
- expect(button.text()).toBe(NoGcpProjects.i18n.createLabel);
- expect(button.attributes('href')).toBe('https://console.cloud.google.com/projectcreate');
- });
-});
diff --git a/spec/frontend/google_cloud/components/gcp_regions_form_spec.js b/spec/frontend/google_cloud/components/gcp_regions_form_spec.js
deleted file mode 100644
index a8b7593e7c8..00000000000
--- a/spec/frontend/google_cloud/components/gcp_regions_form_spec.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { GlButton, GlFormGroup, GlFormSelect } from '@gitlab/ui';
-import GcpRegionsForm from '~/google_cloud/components/gcp_regions_form.vue';
-
-describe('GcpRegionsForm component', () => {
- let wrapper;
-
- const findHeader = () => wrapper.find('header');
- const findAllFormGroups = () => wrapper.findAllComponents(GlFormGroup);
- const findAllFormSelects = () => wrapper.findAllComponents(GlFormSelect);
- const findAllButtons = () => wrapper.findAllComponents(GlButton);
-
- const propsData = { availableRegions: [], refs: [], cancelPath: '#cancel-url' };
-
- beforeEach(() => {
- wrapper = shallowMount(GcpRegionsForm, { propsData });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('contains header', () => {
- expect(findHeader().exists()).toBe(true);
- });
-
- it('contains Regions form group', () => {
- const formGroup = findAllFormGroups().at(0);
- expect(formGroup.exists()).toBe(true);
- });
-
- it('contains Regions dropdown', () => {
- const select = findAllFormSelects().at(0);
- expect(select.exists()).toBe(true);
- });
-
- it('contains Refs form group', () => {
- const formGroup = findAllFormGroups().at(1);
- expect(formGroup.exists()).toBe(true);
- });
-
- it('contains Refs dropdown', () => {
- const select = findAllFormSelects().at(1);
- expect(select.exists()).toBe(true);
- });
-
- it('contains Submit button', () => {
- const button = findAllButtons().at(0);
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe(GcpRegionsForm.i18n.submitLabel);
- });
-
- it('contains Cancel button', () => {
- const button = findAllButtons().at(1);
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe(GcpRegionsForm.i18n.cancelLabel);
- expect(button.attributes('href')).toBe('#cancel-url');
- });
-});
diff --git a/spec/frontend/google_cloud/components/gcp_regions_list_spec.js b/spec/frontend/google_cloud/components/gcp_regions_list_spec.js
deleted file mode 100644
index ab0c17451e8..00000000000
--- a/spec/frontend/google_cloud/components/gcp_regions_list_spec.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { GlButton, GlEmptyState, GlTable } from '@gitlab/ui';
-import GcpRegionsList from '~/google_cloud/components/gcp_regions_list.vue';
-
-describe('GcpRegions component', () => {
- describe('when the project does not have any configured regions', () => {
- let wrapper;
-
- const findEmptyState = () => wrapper.findComponent(GlEmptyState);
- const findButtonInEmptyState = () => findEmptyState().findComponent(GlButton);
-
- beforeEach(() => {
- const propsData = {
- list: [],
- createUrl: '#create-url',
- emptyIllustrationUrl: '#empty-illustration-url',
- };
- wrapper = mount(GcpRegionsList, { propsData });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('shows the empty state component', () => {
- expect(findEmptyState().exists()).toBe(true);
- });
- it('shows the link to create new service accounts', () => {
- const button = findButtonInEmptyState();
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe('Configure regions');
- expect(button.attributes('href')).toBe('#create-url');
- });
- });
-
- describe('when three gcp regions are passed via props', () => {
- let wrapper;
-
- const findTitle = () => wrapper.find('h2');
- const findDescription = () => wrapper.find('p');
- const findTable = () => wrapper.findComponent(GlTable);
- const findRows = () => findTable().findAll('tr');
- const findButton = () => wrapper.findComponent(GlButton);
-
- beforeEach(() => {
- const propsData = {
- list: [{}, {}, {}],
- createUrl: '#create-url',
- emptyIllustrationUrl: '#empty-illustration-url',
- };
- wrapper = mount(GcpRegionsList, { propsData });
- });
-
- it('shows the title', () => {
- expect(findTitle().text()).toBe('Regions');
- });
-
- it('shows the description', () => {
- expect(findDescription().text()).toBe(
- 'Configure your environments to be deployed to specific geographical regions',
- );
- });
-
- it('shows the table', () => {
- expect(findTable().exists()).toBe(true);
- });
-
- it('table must have three rows + header row', () => {
- expect(findRows()).toHaveLength(4);
- });
-
- it('shows the link to create new service accounts', () => {
- const button = findButton();
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe('Configure regions');
- expect(button.attributes('href')).toBe('#create-url');
- });
- });
-});
diff --git a/spec/frontend/google_cloud/components/google_cloud_menu_spec.js b/spec/frontend/google_cloud/components/google_cloud_menu_spec.js
new file mode 100644
index 00000000000..4809ea37045
--- /dev/null
+++ b/spec/frontend/google_cloud/components/google_cloud_menu_spec.js
@@ -0,0 +1,40 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import GoogleCloudMenu from '~/google_cloud/components/google_cloud_menu.vue';
+
+describe('google_cloud/components/google_cloud_menu', () => {
+ let wrapper;
+
+ const props = {
+ active: 'configuration',
+ configurationUrl: 'configuration-url',
+ deploymentsUrl: 'deployments-url',
+ databasesUrl: 'databases-url',
+ };
+
+ beforeEach(() => {
+ wrapper = mountExtended(GoogleCloudMenu, { propsData: props });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains active configuration link', () => {
+ const link = wrapper.findByTestId('configurationLink');
+ expect(link.text()).toBe(GoogleCloudMenu.i18n.configuration.title);
+ expect(link.attributes('href')).toBe(props.configurationUrl);
+ expect(link.element.classList.contains('gl-tab-nav-item-active')).toBe(true);
+ });
+
+ it('contains deployments link', () => {
+ const link = wrapper.findByTestId('deploymentsLink');
+ expect(link.text()).toBe(GoogleCloudMenu.i18n.deployments.title);
+ expect(link.attributes('href')).toBe(props.deploymentsUrl);
+ });
+
+ it('contains databases link', () => {
+ const link = wrapper.findByTestId('databasesLink');
+ expect(link.text()).toBe(GoogleCloudMenu.i18n.databases.title);
+ expect(link.attributes('href')).toBe(props.databasesUrl);
+ });
+});
diff --git a/spec/frontend/google_cloud/components/home_spec.js b/spec/frontend/google_cloud/components/home_spec.js
deleted file mode 100644
index 42e3d72577d..00000000000
--- a/spec/frontend/google_cloud/components/home_spec.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { GlTab, GlTabs } from '@gitlab/ui';
-import Home from '~/google_cloud/components/home.vue';
-import ServiceAccountsList from '~/google_cloud/components/service_accounts_list.vue';
-
-describe('google_cloud Home component', () => {
- let wrapper;
-
- const findTabs = () => wrapper.findComponent(GlTabs);
- const findTabItems = () => findTabs().findAllComponents(GlTab);
- const findTabItemsModel = () =>
- findTabs()
- .findAllComponents(GlTab)
- .wrappers.map((x) => ({
- title: x.attributes('title'),
- disabled: x.attributes('disabled'),
- }));
-
- const TEST_HOME_PROPS = {
- serviceAccounts: [{}, {}],
- gcpRegions: [{}, {}],
- createServiceAccountUrl: '#url-create-service-account',
- configureGcpRegionsUrl: '#url-configure-gcp-regions',
- emptyIllustrationUrl: '#url-empty-illustration',
- enableCloudRunUrl: '#url-enable-cloud-run',
- enableCloudStorageUrl: '#enableCloudStorageUrl',
- revokeOauthUrl: '#revokeOauthUrl',
- };
-
- beforeEach(() => {
- const propsData = {
- screen: 'home',
- ...TEST_HOME_PROPS,
- };
- wrapper = shallowMount(Home, { propsData });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('google_cloud App tabs', () => {
- it('should contain tabs', () => {
- expect(findTabs().exists()).toBe(true);
- });
-
- it('should contain three tab items', () => {
- expect(findTabItemsModel()).toEqual([
- { title: 'Configuration', disabled: undefined },
- { title: 'Deployments', disabled: undefined },
- { title: 'Services', disabled: '' },
- ]);
- });
-
- describe('configuration tab', () => {
- it('should contain service accounts component', () => {
- const serviceAccounts = findTabItems().at(0).findComponent(ServiceAccountsList);
- expect(serviceAccounts.props()).toEqual({
- list: TEST_HOME_PROPS.serviceAccounts,
- createUrl: TEST_HOME_PROPS.createServiceAccountUrl,
- emptyIllustrationUrl: TEST_HOME_PROPS.emptyIllustrationUrl,
- });
- });
- });
- });
-});
diff --git a/spec/frontend/google_cloud/components/incubation_banner_spec.js b/spec/frontend/google_cloud/components/incubation_banner_spec.js
index 89517be4ef1..09a4d92dca2 100644
--- a/spec/frontend/google_cloud/components/incubation_banner_spec.js
+++ b/spec/frontend/google_cloud/components/incubation_banner_spec.js
@@ -2,7 +2,7 @@ import { mount } from '@vue/test-utils';
import { GlAlert, GlLink } from '@gitlab/ui';
import IncubationBanner from '~/google_cloud/components/incubation_banner.vue';
-describe('IncubationBanner component', () => {
+describe('google_cloud/components/incubation_banner', () => {
let wrapper;
const findAlert = () => wrapper.findComponent(GlAlert);
@@ -12,12 +12,7 @@ describe('IncubationBanner component', () => {
const findShareFeedbackLink = () => findLinks().at(2);
beforeEach(() => {
- const propsData = {
- shareFeedbackUrl: 'url_general_feedback',
- reportBugUrl: 'url_report_bug',
- featureRequestUrl: 'url_feature_request',
- };
- wrapper = mount(IncubationBanner, { propsData });
+ wrapper = mount(IncubationBanner);
});
afterEach(() => {
@@ -41,20 +36,26 @@ describe('IncubationBanner component', () => {
it('contains feature request link', () => {
const link = findFeatureRequestLink();
+ const expected =
+ 'https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new?issuable_template=feature_request';
expect(link.text()).toBe('request a feature');
- expect(link.attributes('href')).toBe('url_feature_request');
+ expect(link.attributes('href')).toBe(expected);
});
it('contains report bug link', () => {
const link = findReportBugLink();
+ const expected =
+ 'https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new?issuable_template=report_bug';
expect(link.text()).toBe('report a bug');
- expect(link.attributes('href')).toBe('url_report_bug');
+ expect(link.attributes('href')).toBe(expected);
});
it('contains share feedback link', () => {
const link = findShareFeedbackLink();
+ const expected =
+ 'https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new?issuable_template=general_feedback';
expect(link.text()).toBe('share feedback');
- expect(link.attributes('href')).toBe('url_general_feedback');
+ expect(link.attributes('href')).toBe(expected);
});
});
});
diff --git a/spec/frontend/google_cloud/components/revoke_oauth_spec.js b/spec/frontend/google_cloud/components/revoke_oauth_spec.js
index 87580dbf6de..faaec07fc35 100644
--- a/spec/frontend/google_cloud/components/revoke_oauth_spec.js
+++ b/spec/frontend/google_cloud/components/revoke_oauth_spec.js
@@ -5,7 +5,7 @@ import RevokeOauth, {
GOOGLE_CLOUD_REVOKE_DESCRIPTION,
} from '~/google_cloud/components/revoke_oauth.vue';
-describe('RevokeOauth component', () => {
+describe('google_cloud/components/revoke_oauth', () => {
let wrapper;
const findTitle = () => wrapper.find('h2');
diff --git a/spec/frontend/google_cloud/components/service_accounts_form_spec.js b/spec/frontend/google_cloud/components/service_accounts_form_spec.js
deleted file mode 100644
index 38602d4e8cc..00000000000
--- a/spec/frontend/google_cloud/components/service_accounts_form_spec.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { GlButton, GlFormGroup, GlFormSelect, GlFormCheckbox } from '@gitlab/ui';
-import ServiceAccountsForm from '~/google_cloud/components/service_accounts_form.vue';
-
-describe('ServiceAccountsForm component', () => {
- let wrapper;
-
- const findHeader = () => wrapper.find('header');
- const findAllFormGroups = () => wrapper.findAllComponents(GlFormGroup);
- const findAllFormSelects = () => wrapper.findAllComponents(GlFormSelect);
- const findAllButtons = () => wrapper.findAllComponents(GlButton);
- const findCheckbox = () => wrapper.findComponent(GlFormCheckbox);
-
- const propsData = { gcpProjects: [], refs: [], cancelPath: '#cancel-url' };
-
- beforeEach(() => {
- wrapper = shallowMount(ServiceAccountsForm, { propsData, stubs: { GlFormCheckbox } });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('contains header', () => {
- expect(findHeader().exists()).toBe(true);
- });
-
- it('contains GCP project form group', () => {
- const formGroup = findAllFormGroups().at(0);
- expect(formGroup.exists()).toBe(true);
- });
-
- it('contains GCP project dropdown', () => {
- const select = findAllFormSelects().at(0);
- expect(select.exists()).toBe(true);
- });
-
- it('contains Environments form group', () => {
- const formGroup = findAllFormGroups().at(1);
- expect(formGroup.exists()).toBe(true);
- });
-
- it('contains Environments dropdown', () => {
- const select = findAllFormSelects().at(1);
- expect(select.exists()).toBe(true);
- });
-
- it('contains Submit button', () => {
- const button = findAllButtons().at(0);
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe(ServiceAccountsForm.i18n.submitLabel);
- });
-
- it('contains Cancel button', () => {
- const button = findAllButtons().at(1);
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe(ServiceAccountsForm.i18n.cancelLabel);
- expect(button.attributes('href')).toBe('#cancel-url');
- });
-
- it('contains Confirmation checkbox', () => {
- const checkbox = findCheckbox();
- expect(checkbox.text()).toBe(ServiceAccountsForm.i18n.checkboxLabel);
- });
-
- it('checkbox must be required', () => {
- const checkbox = findCheckbox();
- expect(checkbox.attributes('required')).toBe('true');
- });
-});
diff --git a/spec/frontend/google_cloud/components/service_accounts_list_spec.js b/spec/frontend/google_cloud/components/service_accounts_list_spec.js
deleted file mode 100644
index f7051c8a53d..00000000000
--- a/spec/frontend/google_cloud/components/service_accounts_list_spec.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { GlAlert, GlButton, GlEmptyState, GlTable } from '@gitlab/ui';
-import ServiceAccountsList from '~/google_cloud/components/service_accounts_list.vue';
-
-describe('ServiceAccounts component', () => {
- describe('when the project does not have any service accounts', () => {
- let wrapper;
-
- const findEmptyState = () => wrapper.findComponent(GlEmptyState);
- const findButtonInEmptyState = () => findEmptyState().findComponent(GlButton);
-
- beforeEach(() => {
- const propsData = {
- list: [],
- createUrl: '#create-url',
- emptyIllustrationUrl: '#empty-illustration-url',
- };
- wrapper = mount(ServiceAccountsList, { propsData });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('shows the empty state component', () => {
- expect(findEmptyState().exists()).toBe(true);
- });
- it('shows the link to create new service accounts', () => {
- const button = findButtonInEmptyState();
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe(ServiceAccountsList.i18n.createServiceAccount);
- expect(button.attributes('href')).toBe('#create-url');
- });
- });
-
- describe('when three service accounts are passed via props', () => {
- let wrapper;
-
- const findTitle = () => wrapper.find('h2');
- const findDescription = () => wrapper.find('p');
- const findTable = () => wrapper.findComponent(GlTable);
- const findRows = () => findTable().findAll('tr');
- const findButton = () => wrapper.findComponent(GlButton);
- const findSecretManagerTip = () => wrapper.findComponent(GlAlert);
-
- beforeEach(() => {
- const propsData = {
- list: [{}, {}, {}],
- createUrl: '#create-url',
- emptyIllustrationUrl: '#empty-illustration-url',
- };
- wrapper = mount(ServiceAccountsList, { propsData });
- });
-
- it('shows the title', () => {
- expect(findTitle().text()).toBe(ServiceAccountsList.i18n.serviceAccountsTitle);
- });
-
- it('shows the description', () => {
- expect(findDescription().text()).toBe(ServiceAccountsList.i18n.serviceAccountsDescription);
- });
-
- it('shows the table', () => {
- expect(findTable().exists()).toBe(true);
- });
-
- it('table must have three rows + header row', () => {
- expect(findRows().length).toBe(4);
- });
-
- it('shows the link to create new service accounts', () => {
- const button = findButton();
- expect(button.exists()).toBe(true);
- expect(button.text()).toBe(ServiceAccountsList.i18n.createServiceAccount);
- expect(button.attributes('href')).toBe('#create-url');
- });
-
- it('must contain secret managers tip', () => {
- const tip = findSecretManagerTip();
- const expectedText = ServiceAccountsList.i18n.secretManagersDescription.substr(0, 48);
- expect(tip.text()).toContain(expectedText);
- });
- });
-});
diff --git a/spec/frontend/google_cloud/configuration/panel_spec.js b/spec/frontend/google_cloud/configuration/panel_spec.js
new file mode 100644
index 00000000000..79eb4cb4918
--- /dev/null
+++ b/spec/frontend/google_cloud/configuration/panel_spec.js
@@ -0,0 +1,65 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import Panel from '~/google_cloud/configuration/panel.vue';
+import IncubationBanner from '~/google_cloud/components/incubation_banner.vue';
+import GoogleCloudMenu from '~/google_cloud/components/google_cloud_menu.vue';
+import ServiceAccountsList from '~/google_cloud/service_accounts/list.vue';
+import GcpRegionsList from '~/google_cloud/gcp_regions/list.vue';
+import RevokeOauth from '~/google_cloud/components/revoke_oauth.vue';
+
+describe('google_cloud/configuration/panel', () => {
+ let wrapper;
+
+ const props = {
+ configurationUrl: 'configuration-url',
+ deploymentsUrl: 'deployments-url',
+ databasesUrl: 'databases-url',
+ serviceAccounts: [],
+ createServiceAccountUrl: 'create-service-account-url',
+ emptyIllustrationUrl: 'empty-illustration-url',
+ gcpRegions: [],
+ configureGcpRegionsUrl: 'configure-gcp-regions-url',
+ revokeOauthUrl: 'revoke-oauth-url',
+ };
+
+ beforeEach(() => {
+ wrapper = shallowMountExtended(Panel, { propsData: props });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains incubation banner', () => {
+ const target = wrapper.findComponent(IncubationBanner);
+ expect(target.exists()).toBe(true);
+ });
+
+ it('contains google cloud menu with `configuration` active', () => {
+ const target = wrapper.findComponent(GoogleCloudMenu);
+ expect(target.exists()).toBe(true);
+ expect(target.props('active')).toBe('configuration');
+ expect(target.props('configurationUrl')).toBe(props.configurationUrl);
+ expect(target.props('deploymentsUrl')).toBe(props.deploymentsUrl);
+ expect(target.props('databasesUrl')).toBe(props.databasesUrl);
+ });
+
+ it('contains service accounts list', () => {
+ const target = wrapper.findComponent(ServiceAccountsList);
+ expect(target.exists()).toBe(true);
+ expect(target.props('list')).toBe(props.serviceAccounts);
+ expect(target.props('createUrl')).toBe(props.createServiceAccountUrl);
+ expect(target.props('emptyIllustrationUrl')).toBe(props.emptyIllustrationUrl);
+ });
+
+ it('contains gcp regions list', () => {
+ const target = wrapper.findComponent(GcpRegionsList);
+ expect(target.props('list')).toBe(props.gcpRegions);
+ expect(target.props('createUrl')).toBe(props.configureGcpRegionsUrl);
+ expect(target.props('emptyIllustrationUrl')).toBe(props.emptyIllustrationUrl);
+ });
+
+ it('contains revoke oauth', () => {
+ const target = wrapper.findComponent(RevokeOauth);
+ expect(target.props('url')).toBe(props.revokeOauthUrl);
+ });
+});
diff --git a/spec/frontend/google_cloud/databases/cloudsql/create_instance_form_spec.js b/spec/frontend/google_cloud/databases/cloudsql/create_instance_form_spec.js
new file mode 100644
index 00000000000..48e4b0ca1ad
--- /dev/null
+++ b/spec/frontend/google_cloud/databases/cloudsql/create_instance_form_spec.js
@@ -0,0 +1,103 @@
+import { GlFormCheckbox } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import InstanceForm from '~/google_cloud/databases/cloudsql/create_instance_form.vue';
+
+describe('google_cloud/databases/cloudsql/create_instance_form', () => {
+ let wrapper;
+
+ const findByTestId = (id) => wrapper.findByTestId(id);
+ const findCancelButton = () => findByTestId('cancel-button');
+ const findCheckbox = () => wrapper.findComponent(GlFormCheckbox);
+ const findHeader = () => wrapper.find('header');
+ const findSubmitButton = () => findByTestId('submit-button');
+
+ const propsData = {
+ gcpProjects: [],
+ refs: [],
+ cancelPath: '#cancel-url',
+ formTitle: 'mock form title',
+ formDescription: 'mock form description',
+ databaseVersions: [],
+ tiers: [],
+ };
+
+ beforeEach(() => {
+ wrapper = shallowMountExtended(InstanceForm, { propsData, stubs: { GlFormCheckbox } });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains header', () => {
+ expect(findHeader().exists()).toBe(true);
+ });
+
+ it('contains GCP project form group', () => {
+ const formGroup = findByTestId('form_group_gcp_project');
+ expect(formGroup.exists()).toBe(true);
+ expect(formGroup.attributes('label')).toBe(InstanceForm.i18n.gcpProjectLabel);
+ expect(formGroup.attributes('description')).toBe(InstanceForm.i18n.gcpProjectDescription);
+ });
+
+ it('contains GCP project dropdown', () => {
+ const select = findByTestId('select_gcp_project');
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Environments form group', () => {
+ const formGroup = findByTestId('form_group_environments');
+ expect(formGroup.exists()).toBe(true);
+ expect(formGroup.attributes('label')).toBe(InstanceForm.i18n.refsLabel);
+ expect(formGroup.attributes('description')).toBe(InstanceForm.i18n.refsDescription);
+ });
+
+ it('contains Environments dropdown', () => {
+ const select = findByTestId('select_environments');
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Tier form group', () => {
+ const formGroup = findByTestId('form_group_tier');
+ expect(formGroup.exists()).toBe(true);
+ expect(formGroup.attributes('label')).toBe(InstanceForm.i18n.tierLabel);
+ expect(formGroup.attributes('description')).toBe(InstanceForm.i18n.tierDescription);
+ });
+
+ it('contains Tier dropdown', () => {
+ const select = findByTestId('select_tier');
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Database Version form group', () => {
+ const formGroup = findByTestId('form_group_database_version');
+ expect(formGroup.exists()).toBe(true);
+ expect(formGroup.attributes('label')).toBe(InstanceForm.i18n.databaseVersionLabel);
+ });
+
+ it('contains Database Version dropdown', () => {
+ const select = findByTestId('select_database_version');
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Submit button', () => {
+ expect(findSubmitButton().exists()).toBe(true);
+ expect(findSubmitButton().text()).toBe(InstanceForm.i18n.submitLabel);
+ });
+
+ it('contains Cancel button', () => {
+ expect(findCancelButton().exists()).toBe(true);
+ expect(findCancelButton().text()).toBe(InstanceForm.i18n.cancelLabel);
+ expect(findCancelButton().attributes('href')).toBe('#cancel-url');
+ });
+
+ it('contains Confirmation checkbox', () => {
+ const checkbox = findCheckbox();
+ expect(checkbox.text()).toBe(InstanceForm.i18n.checkboxLabel);
+ });
+
+ it('checkbox must be required', () => {
+ const checkbox = findCheckbox();
+ expect(checkbox.attributes('required')).toBe('true');
+ });
+});
diff --git a/spec/frontend/google_cloud/databases/cloudsql/instance_table_spec.js b/spec/frontend/google_cloud/databases/cloudsql/instance_table_spec.js
new file mode 100644
index 00000000000..a5736d0a524
--- /dev/null
+++ b/spec/frontend/google_cloud/databases/cloudsql/instance_table_spec.js
@@ -0,0 +1,65 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlEmptyState, GlTable } from '@gitlab/ui';
+import InstanceTable from '~/google_cloud/databases/cloudsql/instance_table.vue';
+
+describe('google_cloud/databases/cloudsql/instance_table', () => {
+ let wrapper;
+
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findTable = () => wrapper.findComponent(GlTable);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when there are no instances', () => {
+ beforeEach(() => {
+ const propsData = {
+ cloudsqlInstances: [],
+ emptyIllustrationUrl: '#empty-illustration-url',
+ };
+ wrapper = shallowMount(InstanceTable, { propsData });
+ });
+
+ it('should depict empty state', () => {
+ const emptyState = findEmptyState();
+ expect(emptyState.exists()).toBe(true);
+ expect(emptyState.attributes('title')).toBe(InstanceTable.i18n.noInstancesTitle);
+ expect(emptyState.attributes('description')).toBe(InstanceTable.i18n.noInstancesDescription);
+ });
+ });
+
+ describe('when there are three instances', () => {
+ beforeEach(() => {
+ const propsData = {
+ cloudsqlInstances: [
+ {
+ ref: '*',
+ gcp_project: 'test-gcp-project',
+ instance_name: 'postgres-14-instance',
+ version: 'POSTGRES_14',
+ },
+ {
+ ref: 'production',
+ gcp_project: 'prod-gcp-project',
+ instance_name: 'postgres-14-instance',
+ version: 'POSTGRES_14',
+ },
+ {
+ ref: 'staging',
+ gcp_project: 'test-gcp-project',
+ instance_name: 'postgres-14-instance',
+ version: 'POSTGRES_14',
+ },
+ ],
+ emptyIllustrationUrl: '#empty-illustration-url',
+ };
+ wrapper = shallowMount(InstanceTable, { propsData });
+ });
+
+ it('should contain a table', () => {
+ const table = findTable();
+ expect(table.exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/google_cloud/databases/panel_spec.js b/spec/frontend/google_cloud/databases/panel_spec.js
new file mode 100644
index 00000000000..490c0136651
--- /dev/null
+++ b/spec/frontend/google_cloud/databases/panel_spec.js
@@ -0,0 +1,36 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import Panel from '~/google_cloud/databases/panel.vue';
+import IncubationBanner from '~/google_cloud/components/incubation_banner.vue';
+import GoogleCloudMenu from '~/google_cloud/components/google_cloud_menu.vue';
+
+describe('google_cloud/databases/panel', () => {
+ let wrapper;
+
+ const props = {
+ configurationUrl: 'configuration-url',
+ deploymentsUrl: 'deployments-url',
+ databasesUrl: 'databases-url',
+ };
+
+ beforeEach(() => {
+ wrapper = shallowMountExtended(Panel, { propsData: props });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains incubation banner', () => {
+ const target = wrapper.findComponent(IncubationBanner);
+ expect(target.exists()).toBe(true);
+ });
+
+ it('contains google cloud menu with `databases` active', () => {
+ const target = wrapper.findComponent(GoogleCloudMenu);
+ expect(target.exists()).toBe(true);
+ expect(target.props('active')).toBe('databases');
+ expect(target.props('configurationUrl')).toBe(props.configurationUrl);
+ expect(target.props('deploymentsUrl')).toBe(props.deploymentsUrl);
+ expect(target.props('databasesUrl')).toBe(props.databasesUrl);
+ });
+});
diff --git a/spec/frontend/google_cloud/databases/service_table_spec.js b/spec/frontend/google_cloud/databases/service_table_spec.js
new file mode 100644
index 00000000000..4a622e544e1
--- /dev/null
+++ b/spec/frontend/google_cloud/databases/service_table_spec.js
@@ -0,0 +1,44 @@
+import { GlTable } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import ServiceTable from '~/google_cloud/databases/service_table.vue';
+
+describe('google_cloud/databases/service_table', () => {
+ let wrapper;
+
+ const findTable = () => wrapper.findComponent(GlTable);
+
+ beforeEach(() => {
+ const propsData = {
+ cloudsqlPostgresUrl: '#url-cloudsql-postgres',
+ cloudsqlMysqlUrl: '#url-cloudsql-mysql',
+ cloudsqlSqlserverUrl: '#url-cloudsql-sqlserver',
+ alloydbPostgresUrl: '#url-alloydb-postgres',
+ memorystoreRedisUrl: '#url-memorystore-redis',
+ firestoreUrl: '#url-firestore',
+ };
+ wrapper = mountExtended(ServiceTable, { propsData });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('should contain a table', () => {
+ expect(findTable().exists()).toBe(true);
+ });
+
+ it.each`
+ name | testId | url
+ ${'cloudsql-postgres'} | ${'button-cloudsql-postgres'} | ${'#url-cloudsql-postgres'}
+ ${'cloudsql-mysql'} | ${'button-cloudsql-mysql'} | ${'#url-cloudsql-mysql'}
+ ${'cloudsql-sqlserver'} | ${'button-cloudsql-sqlserver'} | ${'#url-cloudsql-sqlserver'}
+ ${'alloydb-postgres'} | ${'button-alloydb-postgres'} | ${'#url-alloydb-postgres'}
+ ${'memorystore-redis'} | ${'button-memorystore-redis'} | ${'#url-memorystore-redis'}
+ ${'firestore'} | ${'button-firestore'} | ${'#url-firestore'}
+ `('renders $name button with correct url', ({ testId, url }) => {
+ const button = wrapper.findByTestId(testId);
+
+ expect(button.exists()).toBe(true);
+ expect(button.attributes('href')).toBe(url);
+ });
+});
diff --git a/spec/frontend/google_cloud/deployments/panel_spec.js b/spec/frontend/google_cloud/deployments/panel_spec.js
new file mode 100644
index 00000000000..729db1707a7
--- /dev/null
+++ b/spec/frontend/google_cloud/deployments/panel_spec.js
@@ -0,0 +1,46 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import Panel from '~/google_cloud/deployments/panel.vue';
+import IncubationBanner from '~/google_cloud/components/incubation_banner.vue';
+import GoogleCloudMenu from '~/google_cloud/components/google_cloud_menu.vue';
+import ServiceTable from '~/google_cloud/deployments/service_table.vue';
+
+describe('google_cloud/deployments/panel', () => {
+ let wrapper;
+
+ const props = {
+ configurationUrl: 'configuration-url',
+ deploymentsUrl: 'deployments-url',
+ databasesUrl: 'databases-url',
+ enableCloudRunUrl: 'cloud-run-url',
+ enableCloudStorageUrl: 'cloud-storage-url',
+ };
+
+ beforeEach(() => {
+ wrapper = shallowMountExtended(Panel, { propsData: props });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains incubation banner', () => {
+ const target = wrapper.findComponent(IncubationBanner);
+ expect(target.exists()).toBe(true);
+ });
+
+ it('contains google cloud menu with `deployments` active', () => {
+ const target = wrapper.findComponent(GoogleCloudMenu);
+ expect(target.exists()).toBe(true);
+ expect(target.props('active')).toBe('deployments');
+ expect(target.props('configurationUrl')).toBe(props.configurationUrl);
+ expect(target.props('deploymentsUrl')).toBe(props.deploymentsUrl);
+ expect(target.props('databasesUrl')).toBe(props.databasesUrl);
+ });
+
+ it('contains service-table', () => {
+ const target = wrapper.findComponent(ServiceTable);
+ expect(target.exists()).toBe(true);
+ expect(target.props('cloudRunUrl')).toBe(props.enableCloudRunUrl);
+ expect(target.props('cloudStorageUrl')).toBe(props.enableCloudStorageUrl);
+ });
+});
diff --git a/spec/frontend/google_cloud/deployments/service_table_spec.js b/spec/frontend/google_cloud/deployments/service_table_spec.js
new file mode 100644
index 00000000000..8faad64e313
--- /dev/null
+++ b/spec/frontend/google_cloud/deployments/service_table_spec.js
@@ -0,0 +1,41 @@
+import { mount } from '@vue/test-utils';
+import { GlButton, GlTable } from '@gitlab/ui';
+import DeploymentsServiceTable from '~/google_cloud/deployments/service_table.vue';
+
+describe('google_cloud/deployments/service_table', () => {
+ let wrapper;
+
+ const findTable = () => wrapper.findComponent(GlTable);
+ const findButtons = () => findTable().findAllComponents(GlButton);
+ const findCloudRunButton = () => findButtons().at(0);
+ const findCloudStorageButton = () => findButtons().at(1);
+
+ beforeEach(() => {
+ const propsData = {
+ cloudRunUrl: '#url-enable-cloud-run',
+ cloudStorageUrl: '#url-enable-cloud-storage',
+ };
+ wrapper = mount(DeploymentsServiceTable, { propsData });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('should contain a table', () => {
+ expect(findTable().exists()).toBe(true);
+ });
+
+ it('should contain configure cloud run button', () => {
+ const cloudRunButton = findCloudRunButton();
+ expect(cloudRunButton.exists()).toBe(true);
+ expect(cloudRunButton.attributes('href')).toBe('#url-enable-cloud-run');
+ });
+
+ it('should contain configure cloud storage button', () => {
+ const cloudStorageButton = findCloudStorageButton();
+ expect(cloudStorageButton.exists()).toBe(true);
+ expect(cloudStorageButton.props().disabled).toBe(true);
+ expect(cloudStorageButton.attributes('href')).toBe('#url-enable-cloud-storage');
+ });
+});
diff --git a/spec/frontend/google_cloud/gcp_regions/form_spec.js b/spec/frontend/google_cloud/gcp_regions/form_spec.js
new file mode 100644
index 00000000000..1030e9c8a18
--- /dev/null
+++ b/spec/frontend/google_cloud/gcp_regions/form_spec.js
@@ -0,0 +1,59 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlButton, GlFormGroup, GlFormSelect } from '@gitlab/ui';
+import GcpRegionsForm from '~/google_cloud/gcp_regions/form.vue';
+
+describe('google_cloud/gcp_regions/form', () => {
+ let wrapper;
+
+ const findHeader = () => wrapper.find('header');
+ const findAllFormGroups = () => wrapper.findAllComponents(GlFormGroup);
+ const findAllFormSelects = () => wrapper.findAllComponents(GlFormSelect);
+ const findAllButtons = () => wrapper.findAllComponents(GlButton);
+
+ const propsData = { availableRegions: [], refs: [], cancelPath: '#cancel-url' };
+
+ beforeEach(() => {
+ wrapper = shallowMount(GcpRegionsForm, { propsData });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains header', () => {
+ expect(findHeader().exists()).toBe(true);
+ });
+
+ it('contains Regions form group', () => {
+ const formGroup = findAllFormGroups().at(0);
+ expect(formGroup.exists()).toBe(true);
+ });
+
+ it('contains Regions dropdown', () => {
+ const select = findAllFormSelects().at(0);
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Refs form group', () => {
+ const formGroup = findAllFormGroups().at(1);
+ expect(formGroup.exists()).toBe(true);
+ });
+
+ it('contains Refs dropdown', () => {
+ const select = findAllFormSelects().at(1);
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Submit button', () => {
+ const button = findAllButtons().at(0);
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe(GcpRegionsForm.i18n.submitLabel);
+ });
+
+ it('contains Cancel button', () => {
+ const button = findAllButtons().at(1);
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe(GcpRegionsForm.i18n.cancelLabel);
+ expect(button.attributes('href')).toBe('#cancel-url');
+ });
+});
diff --git a/spec/frontend/google_cloud/gcp_regions/list_spec.js b/spec/frontend/google_cloud/gcp_regions/list_spec.js
new file mode 100644
index 00000000000..6d8c389e5a1
--- /dev/null
+++ b/spec/frontend/google_cloud/gcp_regions/list_spec.js
@@ -0,0 +1,79 @@
+import { mount } from '@vue/test-utils';
+import { GlButton, GlEmptyState, GlTable } from '@gitlab/ui';
+import GcpRegionsList from '~/google_cloud/gcp_regions/list.vue';
+
+describe('google_cloud/gcp_regions/list', () => {
+ describe('when the project does not have any configured regions', () => {
+ let wrapper;
+
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findButtonInEmptyState = () => findEmptyState().findComponent(GlButton);
+
+ beforeEach(() => {
+ const propsData = {
+ list: [],
+ createUrl: '#create-url',
+ emptyIllustrationUrl: '#empty-illustration-url',
+ };
+ wrapper = mount(GcpRegionsList, { propsData });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('shows the empty state component', () => {
+ expect(findEmptyState().exists()).toBe(true);
+ });
+ it('shows the link to create new service accounts', () => {
+ const button = findButtonInEmptyState();
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe('Configure regions');
+ expect(button.attributes('href')).toBe('#create-url');
+ });
+ });
+
+ describe('when three gcp regions are passed via props', () => {
+ let wrapper;
+
+ const findTitle = () => wrapper.find('h2');
+ const findDescription = () => wrapper.find('p');
+ const findTable = () => wrapper.findComponent(GlTable);
+ const findRows = () => findTable().findAll('tr');
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ beforeEach(() => {
+ const propsData = {
+ list: [{}, {}, {}],
+ createUrl: '#create-url',
+ emptyIllustrationUrl: '#empty-illustration-url',
+ };
+ wrapper = mount(GcpRegionsList, { propsData });
+ });
+
+ it('shows the title', () => {
+ expect(findTitle().text()).toBe('Regions');
+ });
+
+ it('shows the description', () => {
+ expect(findDescription().text()).toBe(
+ 'Configure your environments to be deployed to specific geographical regions',
+ );
+ });
+
+ it('shows the table', () => {
+ expect(findTable().exists()).toBe(true);
+ });
+
+ it('table must have three rows + header row', () => {
+ expect(findRows()).toHaveLength(4);
+ });
+
+ it('shows the link to create new service accounts', () => {
+ const button = findButton();
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe('Configure regions');
+ expect(button.attributes('href')).toBe('#create-url');
+ });
+ });
+});
diff --git a/spec/frontend/google_cloud/service_accounts/form_spec.js b/spec/frontend/google_cloud/service_accounts/form_spec.js
new file mode 100644
index 00000000000..8be481774fa
--- /dev/null
+++ b/spec/frontend/google_cloud/service_accounts/form_spec.js
@@ -0,0 +1,70 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlButton, GlFormGroup, GlFormSelect, GlFormCheckbox } from '@gitlab/ui';
+import ServiceAccountsForm from '~/google_cloud/service_accounts/form.vue';
+
+describe('google_cloud/service_accounts/form', () => {
+ let wrapper;
+
+ const findHeader = () => wrapper.find('header');
+ const findAllFormGroups = () => wrapper.findAllComponents(GlFormGroup);
+ const findAllFormSelects = () => wrapper.findAllComponents(GlFormSelect);
+ const findAllButtons = () => wrapper.findAllComponents(GlButton);
+ const findCheckbox = () => wrapper.findComponent(GlFormCheckbox);
+
+ const propsData = { gcpProjects: [], refs: [], cancelPath: '#cancel-url' };
+
+ beforeEach(() => {
+ wrapper = shallowMount(ServiceAccountsForm, { propsData, stubs: { GlFormCheckbox } });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains header', () => {
+ expect(findHeader().exists()).toBe(true);
+ });
+
+ it('contains GCP project form group', () => {
+ const formGroup = findAllFormGroups().at(0);
+ expect(formGroup.exists()).toBe(true);
+ });
+
+ it('contains GCP project dropdown', () => {
+ const select = findAllFormSelects().at(0);
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Environments form group', () => {
+ const formGroup = findAllFormGroups().at(1);
+ expect(formGroup.exists()).toBe(true);
+ });
+
+ it('contains Environments dropdown', () => {
+ const select = findAllFormSelects().at(1);
+ expect(select.exists()).toBe(true);
+ });
+
+ it('contains Submit button', () => {
+ const button = findAllButtons().at(0);
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe(ServiceAccountsForm.i18n.submitLabel);
+ });
+
+ it('contains Cancel button', () => {
+ const button = findAllButtons().at(1);
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe(ServiceAccountsForm.i18n.cancelLabel);
+ expect(button.attributes('href')).toBe('#cancel-url');
+ });
+
+ it('contains Confirmation checkbox', () => {
+ const checkbox = findCheckbox();
+ expect(checkbox.text()).toBe(ServiceAccountsForm.i18n.checkboxLabel);
+ });
+
+ it('checkbox must be required', () => {
+ const checkbox = findCheckbox();
+ expect(checkbox.attributes('required')).toBe('true');
+ });
+});
diff --git a/spec/frontend/google_cloud/service_accounts/list_spec.js b/spec/frontend/google_cloud/service_accounts/list_spec.js
new file mode 100644
index 00000000000..7a76a893757
--- /dev/null
+++ b/spec/frontend/google_cloud/service_accounts/list_spec.js
@@ -0,0 +1,84 @@
+import { mount } from '@vue/test-utils';
+import { GlAlert, GlButton, GlEmptyState, GlTable } from '@gitlab/ui';
+import ServiceAccountsList from '~/google_cloud/service_accounts/list.vue';
+
+describe('google_cloud/service_accounts/list', () => {
+ describe('when the project does not have any service accounts', () => {
+ let wrapper;
+
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findButtonInEmptyState = () => findEmptyState().findComponent(GlButton);
+
+ beforeEach(() => {
+ const propsData = {
+ list: [],
+ createUrl: '#create-url',
+ emptyIllustrationUrl: '#empty-illustration-url',
+ };
+ wrapper = mount(ServiceAccountsList, { propsData });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('shows the empty state component', () => {
+ expect(findEmptyState().exists()).toBe(true);
+ });
+ it('shows the link to create new service accounts', () => {
+ const button = findButtonInEmptyState();
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe(ServiceAccountsList.i18n.createServiceAccount);
+ expect(button.attributes('href')).toBe('#create-url');
+ });
+ });
+
+ describe('when three service accounts are passed via props', () => {
+ let wrapper;
+
+ const findTitle = () => wrapper.find('h2');
+ const findDescription = () => wrapper.find('p');
+ const findTable = () => wrapper.findComponent(GlTable);
+ const findRows = () => findTable().findAll('tr');
+ const findButton = () => wrapper.findComponent(GlButton);
+ const findSecretManagerTip = () => wrapper.findComponent(GlAlert);
+
+ beforeEach(() => {
+ const propsData = {
+ list: [{}, {}, {}],
+ createUrl: '#create-url',
+ emptyIllustrationUrl: '#empty-illustration-url',
+ };
+ wrapper = mount(ServiceAccountsList, { propsData });
+ });
+
+ it('shows the title', () => {
+ expect(findTitle().text()).toBe(ServiceAccountsList.i18n.serviceAccountsTitle);
+ });
+
+ it('shows the description', () => {
+ expect(findDescription().text()).toBe(ServiceAccountsList.i18n.serviceAccountsDescription);
+ });
+
+ it('shows the table', () => {
+ expect(findTable().exists()).toBe(true);
+ });
+
+ it('table must have three rows + header row', () => {
+ expect(findRows().length).toBe(4);
+ });
+
+ it('shows the link to create new service accounts', () => {
+ const button = findButton();
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe(ServiceAccountsList.i18n.createServiceAccount);
+ expect(button.attributes('href')).toBe('#create-url');
+ });
+
+ it('must contain secret managers tip', () => {
+ const tip = findSecretManagerTip();
+ const expectedText = ServiceAccountsList.i18n.secretManagersDescription.substr(0, 48);
+ expect(tip.text()).toContain(expectedText);
+ });
+ });
+});
diff --git a/spec/frontend/google_tag_manager/index_spec.js b/spec/frontend/google_tag_manager/index_spec.js
index 50811f43fc3..6a7eb1fd9f1 100644
--- a/spec/frontend/google_tag_manager/index_spec.js
+++ b/spec/frontend/google_tag_manager/index_spec.js
@@ -10,6 +10,7 @@ import {
trackSaasTrialGroup,
trackSaasTrialProject,
trackSaasTrialGetStarted,
+ trackTrialAcceptTerms,
trackCheckout,
trackTransaction,
trackAddToCartUsageTab,
@@ -255,6 +256,16 @@ describe('~/google_tag_manager/index', () => {
expect(logError).not.toHaveBeenCalled();
});
+ it('when trackTrialAcceptTerms is invoked', () => {
+ expect(spy).not.toHaveBeenCalled();
+
+ trackTrialAcceptTerms();
+
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy).toHaveBeenCalledWith({ event: 'saasTrialAcceptTerms' });
+ expect(logError).not.toHaveBeenCalled();
+ });
+
describe('when trackCheckout is invoked', () => {
it('with selectedPlan: 2c92a00d76f0d5060176f2fb0a5029ff', () => {
expect(spy).not.toHaveBeenCalled();
diff --git a/spec/frontend/groups/components/group_folder_spec.js b/spec/frontend/groups/components/group_folder_spec.js
index 98b7c2dd6c6..f223333360d 100644
--- a/spec/frontend/groups/components/group_folder_spec.js
+++ b/spec/frontend/groups/components/group_folder_spec.js
@@ -1,65 +1,50 @@
-import Vue, { nextTick } from 'vue';
-
-import groupFolderComponent from '~/groups/components/group_folder.vue';
-import groupItemComponent from '~/groups/components/group_item.vue';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import GroupFolder from '~/groups/components/group_folder.vue';
+import GroupItem from '~/groups/components/group_item.vue';
+import { MAX_CHILDREN_COUNT } from '~/groups/constants';
import { mockGroups, mockParentGroupItem } from '../mock_data';
-const createComponent = (groups = mockGroups, parentGroup = mockParentGroupItem) => {
- const Component = Vue.extend(groupFolderComponent);
-
- return new Component({
- propsData: {
- groups,
- parentGroup,
- },
- });
-};
+describe('GroupFolder component', () => {
+ let wrapper;
-describe('GroupFolderComponent', () => {
- let vm;
+ Vue.component('GroupItem', GroupItem);
- beforeEach(async () => {
- Vue.component('GroupItem', groupItemComponent);
+ const findLink = () => wrapper.find('a');
- vm = createComponent();
- vm.$mount();
-
- await nextTick();
- });
+ const createComponent = ({ groups = mockGroups, parentGroup = mockParentGroupItem } = {}) =>
+ shallowMount(GroupFolder, {
+ propsData: {
+ groups,
+ parentGroup,
+ },
+ });
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
- describe('computed', () => {
- describe('hasMoreChildren', () => {
- it('should return false when childrenCount of group is less than MAX_CHILDREN_COUNT', () => {
- expect(vm.hasMoreChildren).toBeFalsy();
- });
- });
+ it('does not render more children stats link when children count of group is under limit', () => {
+ wrapper = createComponent();
- describe('moreChildrenStats', () => {
- it('should return message with count of excess children over MAX_CHILDREN_COUNT limit', () => {
- expect(vm.moreChildrenStats).toBe('3 more items');
- });
- });
+ expect(findLink().exists()).toBe(false);
});
- describe('template', () => {
- it('should render component template correctly', () => {
- expect(vm.$el.classList.contains('group-list-tree')).toBeTruthy();
- expect(vm.$el.querySelectorAll('li.group-row').length).toBe(7);
+ it('renders text of count of excess children when children count of group is over limit', () => {
+ const childrenCount = MAX_CHILDREN_COUNT + 1;
+ wrapper = createComponent({
+ parentGroup: {
+ ...mockParentGroupItem,
+ childrenCount,
+ },
});
- it('should render more children link when groups list has children over MAX_CHILDREN_COUNT limit', () => {
- const parentGroup = { ...mockParentGroupItem };
- parentGroup.childrenCount = 21;
+ expect(findLink().text()).toBe(`${childrenCount} more items`);
+ });
- const newVm = createComponent(mockGroups, parentGroup);
- newVm.$mount();
+ it('renders group items', () => {
+ wrapper = createComponent();
- expect(newVm.$el.querySelector('li.group-row a.has-more-items')).toBeDefined();
- newVm.$destroy();
- });
+ expect(wrapper.findAllComponents(GroupItem)).toHaveLength(7);
});
});
diff --git a/spec/frontend/groups/components/group_item_spec.js b/spec/frontend/groups/components/group_item_spec.js
index 8ea7e54aef4..0bc80df6535 100644
--- a/spec/frontend/groups/components/group_item_spec.js
+++ b/spec/frontend/groups/components/group_item_spec.js
@@ -1,4 +1,4 @@
-import { mount } from '@vue/test-utils';
+import { GlPopover } from '@gitlab/ui';
import waitForPromises from 'helpers/wait_for_promises';
import GroupFolder from '~/groups/components/group_folder.vue';
import GroupItem from '~/groups/components/group_item.vue';
@@ -6,14 +6,25 @@ import ItemActions from '~/groups/components/item_actions.vue';
import eventHub from '~/groups/event_hub';
import { getGroupItemMicrodata } from '~/groups/store/utils';
import * as urlUtilities from '~/lib/utils/url_utility';
+import {
+ ITEM_TYPE,
+ VISIBILITY_INTERNAL,
+ VISIBILITY_PRIVATE,
+ VISIBILITY_PUBLIC,
+} from '~/groups/constants';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { mockParentGroupItem, mockChildren } from '../mock_data';
const createComponent = (
propsData = { group: mockParentGroupItem, parentGroup: mockChildren[0] },
+ provide = {
+ currentGroupVisibility: VISIBILITY_PRIVATE,
+ },
) => {
- return mount(GroupItem, {
+ return mountExtended(GroupItem, {
propsData,
components: { GroupFolder },
+ provide,
});
};
@@ -276,4 +287,90 @@ describe('GroupItemComponent', () => {
});
});
});
+
+ describe('visibility warning popover', () => {
+ const findPopover = () => wrapper.findComponent(GlPopover);
+
+ const itDoesNotRenderVisibilityWarningPopover = () => {
+ it('does not render visibility warning popover', () => {
+ expect(findPopover().exists()).toBe(false);
+ });
+ };
+
+ describe('when showing groups', () => {
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ itDoesNotRenderVisibilityWarningPopover();
+ });
+
+ describe('when `action` prop is not `shared`', () => {
+ beforeEach(() => {
+ wrapper = createComponent({
+ group: mockParentGroupItem,
+ parentGroup: mockChildren[0],
+ action: 'subgroups_and_projects',
+ });
+ });
+
+ itDoesNotRenderVisibilityWarningPopover();
+ });
+
+ describe('when showing projects', () => {
+ describe.each`
+ itemVisibility | currentGroupVisibility | isPopoverShown
+ ${VISIBILITY_PRIVATE} | ${VISIBILITY_PUBLIC} | ${false}
+ ${VISIBILITY_INTERNAL} | ${VISIBILITY_PUBLIC} | ${false}
+ ${VISIBILITY_PUBLIC} | ${VISIBILITY_PUBLIC} | ${false}
+ ${VISIBILITY_PRIVATE} | ${VISIBILITY_PRIVATE} | ${false}
+ ${VISIBILITY_INTERNAL} | ${VISIBILITY_PRIVATE} | ${true}
+ ${VISIBILITY_PUBLIC} | ${VISIBILITY_PRIVATE} | ${true}
+ `(
+ 'when item visibility is $itemVisibility and parent group visibility is $currentGroupVisibility',
+ ({ itemVisibility, currentGroupVisibility, isPopoverShown }) => {
+ beforeEach(() => {
+ wrapper = createComponent(
+ {
+ group: {
+ ...mockParentGroupItem,
+ visibility: itemVisibility,
+ type: ITEM_TYPE.PROJECT,
+ },
+ parentGroup: mockChildren[0],
+ action: 'shared',
+ },
+ {
+ currentGroupVisibility,
+ },
+ );
+ });
+
+ if (isPopoverShown) {
+ it('renders visibility warning popover', () => {
+ expect(findPopover().exists()).toBe(true);
+ });
+ } else {
+ itDoesNotRenderVisibilityWarningPopover();
+ }
+ },
+ );
+ });
+
+ it('sets up popover `target` prop correctly', () => {
+ wrapper = createComponent({
+ group: {
+ ...mockParentGroupItem,
+ visibility: VISIBILITY_PUBLIC,
+ type: ITEM_TYPE.PROJECT,
+ },
+ parentGroup: mockChildren[0],
+ action: 'shared',
+ });
+
+ expect(findPopover().props('target')()).toEqual(
+ wrapper.findByRole('button', { name: GroupItem.i18n.popoverTitle }).element,
+ );
+ });
+ });
});
diff --git a/spec/frontend/groups/components/group_name_and_path_spec.js b/spec/frontend/groups/components/group_name_and_path_spec.js
index eaa0801ab50..9c9bdead6fa 100644
--- a/spec/frontend/groups/components/group_name_and_path_spec.js
+++ b/spec/frontend/groups/components/group_name_and_path_spec.js
@@ -1,3 +1,4 @@
+import { nextTick } from 'vue';
import { merge } from 'lodash';
import { GlAlert } from '@gitlab/ui';
import { mountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper';
@@ -50,17 +51,17 @@ describe('GroupNameAndPath', () => {
const findAlert = () => extendedWrapper(wrapper.findComponent(GlAlert));
const apiMockAvailablePath = () => {
- getGroupPathAvailability.mockResolvedValue({
+ getGroupPathAvailability.mockResolvedValueOnce({
data: { exists: false, suggests: [] },
});
};
const apiMockUnavailablePath = (suggests = [mockGroupUrlSuggested]) => {
- getGroupPathAvailability.mockResolvedValue({
+ getGroupPathAvailability.mockResolvedValueOnce({
data: { exists: true, suggests },
});
};
const apiMockLoading = () => {
- getGroupPathAvailability.mockImplementation(() => new Promise(() => {}));
+ getGroupPathAvailability.mockImplementationOnce(() => new Promise(() => {}));
};
const expectLoadingMessageExists = () => {
@@ -169,7 +170,7 @@ describe('GroupNameAndPath', () => {
describe('when API call fails', () => {
it('calls `createAlert`', async () => {
- getGroupPathAvailability.mockRejectedValue({});
+ getGroupPathAvailability.mockRejectedValueOnce({});
createComponent();
@@ -184,14 +185,20 @@ describe('GroupNameAndPath', () => {
describe('when multiple API calls are in-flight', () => {
it('aborts the first API call and resolves second API call', async () => {
- apiMockLoading();
+ getGroupPathAvailability.mockRejectedValueOnce({ __CANCEL__: true });
apiMockUnavailablePath();
+
const abortSpy = jest.spyOn(AbortController.prototype, 'abort');
createComponent();
await findGroupNameField().setValue('Foo');
await findGroupNameField().setValue(mockGroupName);
+
+ // Wait for re-render to ensure loading message is still there
+ await nextTick();
+ expectLoadingMessageExists();
+
await waitForPromises();
expect(createAlert).not.toHaveBeenCalled();
diff --git a/spec/frontend/groups/components/groups_spec.js b/spec/frontend/groups/components/groups_spec.js
index 590b4fb3d57..48a2319cf96 100644
--- a/spec/frontend/groups/components/groups_spec.js
+++ b/spec/frontend/groups/components/groups_spec.js
@@ -1,45 +1,55 @@
-import Vue, { nextTick } from 'vue';
+import Vue from 'vue';
-import mountComponent from 'helpers/vue_mount_component_helper';
-import groupFolderComponent from '~/groups/components/group_folder.vue';
-import groupItemComponent from '~/groups/components/group_item.vue';
-import groupsComponent from '~/groups/components/groups.vue';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import GroupFolderComponent from '~/groups/components/group_folder.vue';
+import GroupItemComponent from '~/groups/components/group_item.vue';
+import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
+import GroupsComponent from '~/groups/components/groups.vue';
import eventHub from '~/groups/event_hub';
+import { VISIBILITY_PRIVATE } from '~/groups/constants';
import { mockGroups, mockPageInfo } from '../mock_data';
-const createComponent = (searchEmpty = false) => {
- const Component = Vue.extend(groupsComponent);
+describe('GroupsComponent', () => {
+ let wrapper;
- return mountComponent(Component, {
+ const defaultPropsData = {
groups: mockGroups,
pageInfo: mockPageInfo,
searchEmptyMessage: 'No matching results',
- searchEmpty,
- });
-};
+ searchEmpty: false,
+ };
-describe('GroupsComponent', () => {
- let vm;
-
- beforeEach(async () => {
- Vue.component('GroupFolder', groupFolderComponent);
- Vue.component('GroupItem', groupItemComponent);
+ const createComponent = ({ propsData } = {}) => {
+ wrapper = mountExtended(GroupsComponent, {
+ propsData: {
+ ...defaultPropsData,
+ ...propsData,
+ },
+ provide: {
+ currentGroupVisibility: VISIBILITY_PRIVATE,
+ },
+ });
+ };
- vm = createComponent();
+ const findPaginationLinks = () => wrapper.findComponent(PaginationLinks);
- await nextTick();
+ beforeEach(async () => {
+ Vue.component('GroupFolder', GroupFolderComponent);
+ Vue.component('GroupItem', GroupItemComponent);
});
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
describe('methods', () => {
describe('change', () => {
it('should emit `fetchPage` event when page is changed via pagination', () => {
+ createComponent();
+
jest.spyOn(eventHub, '$emit').mockImplementation();
- vm.change(2);
+ findPaginationLinks().props('change')(2);
expect(eventHub.$emit).toHaveBeenCalledWith('fetchPage', {
page: 2,
@@ -52,18 +62,18 @@ describe('GroupsComponent', () => {
});
describe('template', () => {
- it('should render component template correctly', async () => {
- await nextTick();
- expect(vm.$el.querySelector('.groups-list-tree-container')).toBeDefined();
- expect(vm.$el.querySelector('.group-list-tree')).toBeDefined();
- expect(vm.$el.querySelector('.gl-pagination')).toBeDefined();
- expect(vm.$el.querySelectorAll('.has-no-search-results').length).toBe(0);
+ it('should render component template correctly', () => {
+ createComponent();
+
+ expect(wrapper.findComponent(GroupFolderComponent).exists()).toBe(true);
+ expect(findPaginationLinks().exists()).toBe(true);
+ expect(wrapper.findByText(defaultPropsData.searchEmptyMessage).exists()).toBe(false);
});
- it('should render empty search message when `searchEmpty` is `true`', async () => {
- vm.searchEmpty = true;
- await nextTick();
- expect(vm.$el.querySelector('.has-no-search-results')).toBeDefined();
+ it('should render empty search message when `searchEmpty` is `true`', () => {
+ createComponent({ propsData: { searchEmpty: true } });
+
+ expect(wrapper.findByText(defaultPropsData.searchEmptyMessage).exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/groups/mock_data.js b/spec/frontend/groups/mock_data.js
index 603cb27deec..9a325776374 100644
--- a/spec/frontend/groups/mock_data.js
+++ b/spec/frontend/groups/mock_data.js
@@ -5,26 +5,6 @@ export const ITEM_TYPE = {
GROUP: 'group',
};
-export const GROUP_VISIBILITY_TYPE = {
- public: 'Public - The group and any public projects can be viewed without any authentication.',
- internal:
- 'Internal - The group and any internal projects can be viewed by any logged in user except external users.',
- private: 'Private - The group and its projects can only be viewed by members.',
-};
-
-export const PROJECT_VISIBILITY_TYPE = {
- public: 'Public - The project can be accessed without any authentication.',
- internal: 'Internal - The project can be accessed by any logged in user except external users.',
- private:
- 'Private - Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group.',
-};
-
-export const VISIBILITY_TYPE_ICON = {
- public: 'earth',
- internal: 'shield',
- private: 'lock',
-};
-
export const mockParentGroupItem = {
id: 55,
name: 'hardware',
@@ -49,6 +29,7 @@ export const mockParentGroupItem = {
isChildrenLoading: false,
isBeingRemoved: false,
updatedAt: '2017-04-09T18:40:39.101Z',
+ lastActivityAt: '2017-04-09T18:40:39.101Z',
};
export const mockRawChildren = [
diff --git a/spec/frontend/header_search/components/app_spec.js b/spec/frontend/header_search/components/app_spec.js
index f0de5b083ae..d89218f5542 100644
--- a/spec/frontend/header_search/components/app_spec.js
+++ b/spec/frontend/header_search/components/app_spec.js
@@ -1,22 +1,32 @@
-import { GlSearchBoxByType } from '@gitlab/ui';
+import { GlSearchBoxByType, GlToken, GlIcon } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { s__, sprintf } from '~/locale';
import HeaderSearchApp from '~/header_search/components/app.vue';
import HeaderSearchAutocompleteItems from '~/header_search/components/header_search_autocomplete_items.vue';
import HeaderSearchDefaultItems from '~/header_search/components/header_search_default_items.vue';
import HeaderSearchScopedItems from '~/header_search/components/header_search_scoped_items.vue';
-import { SEARCH_INPUT_DESCRIPTION, SEARCH_RESULTS_DESCRIPTION } from '~/header_search/constants';
+import {
+ SEARCH_INPUT_DESCRIPTION,
+ SEARCH_RESULTS_DESCRIPTION,
+ SEARCH_BOX_INDEX,
+ ICON_PROJECT,
+ ICON_GROUP,
+ ICON_SUBGROUP,
+ SCOPE_TOKEN_MAX_LENGTH,
+} from '~/header_search/constants';
import DropdownKeyboardNavigation from '~/vue_shared/components/dropdown_keyboard_navigation.vue';
import { ENTER_KEY } from '~/lib/utils/keys';
import { visitUrl } from '~/lib/utils/url_utility';
+import { truncate } from '~/lib/utils/text_utility';
import {
MOCK_SEARCH,
MOCK_SEARCH_QUERY,
MOCK_USERNAME,
MOCK_DEFAULT_SEARCH_OPTIONS,
MOCK_SCOPED_SEARCH_OPTIONS,
- MOCK_SORTED_AUTOCOMPLETE_OPTIONS,
+ MOCK_SEARCH_CONTEXT_FULL,
} from '../mock_data';
Vue.use(Vuex);
@@ -52,11 +62,27 @@ describe('HeaderSearchApp', () => {
});
};
+ const formatScopeName = (scopeName) => {
+ if (!scopeName) {
+ return false;
+ }
+ const searchResultsScope = s__('GlobalSearch|in %{scope}');
+ return truncate(
+ sprintf(searchResultsScope, {
+ scope: scopeName,
+ }),
+ SCOPE_TOKEN_MAX_LENGTH,
+ );
+ };
+
afterEach(() => {
wrapper.destroy();
});
+ const findHeaderSearchForm = () => wrapper.findByTestId('header-search-form');
const findHeaderSearchInput = () => wrapper.findComponent(GlSearchBoxByType);
+ const findScopeToken = () => wrapper.findComponent(GlToken);
+ const findHeaderSearchInputKBD = () => wrapper.find('.keyboard-shortcut-helper');
const findHeaderSearchDropdown = () => wrapper.findByTestId('header-search-dropdown-menu');
const findHeaderSearchDefaultItems = () => wrapper.findComponent(HeaderSearchDefaultItems);
const findHeaderSearchScopedItems = () => wrapper.findComponent(HeaderSearchScopedItems);
@@ -76,6 +102,14 @@ describe('HeaderSearchApp', () => {
expect(findHeaderSearchInput().exists()).toBe(true);
});
+ it('Header Search Input KBD hint', () => {
+ expect(findHeaderSearchInputKBD().exists()).toBe(true);
+ expect(findHeaderSearchInputKBD().text()).toContain('/');
+ expect(findHeaderSearchInputKBD().attributes('title')).toContain(
+ 'Use the shortcut key <kbd>/</kbd> to start a search',
+ );
+ });
+
it('Search Input Description', () => {
expect(findSearchInputDescription().exists()).toBe(true);
});
@@ -106,53 +140,38 @@ describe('HeaderSearchApp', () => {
});
describe.each`
- search | showDefault | showScoped | showAutocomplete | showDropdownNavigation
- ${null} | ${true} | ${false} | ${false} | ${true}
- ${''} | ${true} | ${false} | ${false} | ${true}
- ${'1'} | ${false} | ${false} | ${false} | ${false}
- ${')'} | ${false} | ${false} | ${false} | ${false}
- ${'t'} | ${false} | ${false} | ${true} | ${true}
- ${'te'} | ${false} | ${true} | ${true} | ${true}
- ${'tes'} | ${false} | ${true} | ${true} | ${true}
- ${MOCK_SEARCH} | ${false} | ${true} | ${true} | ${true}
- `(
- 'Header Search Dropdown Items',
- ({ search, showDefault, showScoped, showAutocomplete, showDropdownNavigation }) => {
- describe(`when search is ${search}`, () => {
- beforeEach(() => {
- window.gon.current_username = MOCK_USERNAME;
- createComponent(
- { search },
- {
- autocompleteGroupedSearchOptions: () =>
- search.match(/^[A-Za-z]+$/g) ? MOCK_SORTED_AUTOCOMPLETE_OPTIONS : [],
- },
- );
- findHeaderSearchInput().vm.$emit('click');
- });
+ search | showDefault | showScoped | showAutocomplete
+ ${null} | ${true} | ${false} | ${false}
+ ${''} | ${true} | ${false} | ${false}
+ ${'t'} | ${false} | ${false} | ${true}
+ ${'te'} | ${false} | ${false} | ${true}
+ ${'tes'} | ${false} | ${true} | ${true}
+ ${MOCK_SEARCH} | ${false} | ${true} | ${true}
+ `('Header Search Dropdown Items', ({ search, showDefault, showScoped, showAutocomplete }) => {
+ describe(`when search is ${search}`, () => {
+ beforeEach(() => {
+ window.gon.current_username = MOCK_USERNAME;
+ createComponent({ search }, {});
+ findHeaderSearchInput().vm.$emit('click');
+ });
- it(`should${showDefault ? '' : ' not'} render the Default Dropdown Items`, () => {
- expect(findHeaderSearchDefaultItems().exists()).toBe(showDefault);
- });
+ it(`should${showDefault ? '' : ' not'} render the Default Dropdown Items`, () => {
+ expect(findHeaderSearchDefaultItems().exists()).toBe(showDefault);
+ });
- it(`should${showScoped ? '' : ' not'} render the Scoped Dropdown Items`, () => {
- expect(findHeaderSearchScopedItems().exists()).toBe(showScoped);
- });
+ it(`should${showScoped ? '' : ' not'} render the Scoped Dropdown Items`, () => {
+ expect(findHeaderSearchScopedItems().exists()).toBe(showScoped);
+ });
- it(`should${
- showAutocomplete ? '' : ' not'
- } render the Autocomplete Dropdown Items`, () => {
- expect(findHeaderSearchAutocompleteItems().exists()).toBe(showAutocomplete);
- });
+ it(`should${showAutocomplete ? '' : ' not'} render the Autocomplete Dropdown Items`, () => {
+ expect(findHeaderSearchAutocompleteItems().exists()).toBe(showAutocomplete);
+ });
- it(`should${
- showDropdownNavigation ? '' : ' not'
- } render the Dropdown Navigation Component`, () => {
- expect(findDropdownKeyboardNavigation().exists()).toBe(showDropdownNavigation);
- });
+ it(`should render the Dropdown Navigation Component`, () => {
+ expect(findDropdownKeyboardNavigation().exists()).toBe(true);
});
- },
- );
+ });
+ });
describe.each`
username | showDropdown | expectedDesc
@@ -185,12 +204,18 @@ describe('HeaderSearchApp', () => {
`(
'Search Results Description',
({ username, showDropdown, search, loading, searchOptions, expectedDesc }) => {
- describe(`search is ${search}, loading is ${loading}, and showSearchDropdown is ${
- Boolean(username) && showDropdown
- }`, () => {
+ describe(`search is "${search}", loading is ${loading}, and showSearchDropdown is ${showDropdown}`, () => {
beforeEach(() => {
window.gon.current_username = username;
- createComponent({ search, loading }, { searchOptions: () => searchOptions });
+ createComponent(
+ {
+ search,
+ loading,
+ },
+ {
+ searchOptions: () => searchOptions,
+ },
+ );
findHeaderSearchInput().vm.$emit(showDropdown ? 'click' : '');
});
@@ -200,6 +225,121 @@ describe('HeaderSearchApp', () => {
});
},
);
+
+ describe('input box', () => {
+ describe.each`
+ search | searchOptions | hasToken
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[0]]} | ${true}
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[1]]} | ${true}
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[2]]} | ${true}
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[3]]} | ${true}
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[4]]} | ${true}
+ ${'te'} | ${[MOCK_SCOPED_SEARCH_OPTIONS[5]]} | ${false}
+ ${'x'} | ${[]} | ${false}
+ `('token', ({ search, searchOptions, hasToken }) => {
+ beforeEach(() => {
+ window.gon.current_username = MOCK_USERNAME;
+ createComponent(
+ { search },
+ {
+ searchOptions: () => searchOptions,
+ },
+ );
+ });
+
+ it(`${hasToken ? 'is' : 'is NOT'} rendered when data set has type "${
+ searchOptions[0]?.html_id
+ }"`, () => {
+ expect(findScopeToken().exists()).toBe(hasToken);
+ });
+
+ it(`text ${hasToken ? 'is correctly' : 'is NOT'} rendered when text is "${
+ searchOptions[0]?.scope || searchOptions[0]?.description
+ }"`, () => {
+ expect(findScopeToken().exists() && findScopeToken().text()).toBe(
+ formatScopeName(searchOptions[0]?.scope || searchOptions[0]?.description),
+ );
+ });
+ });
+ });
+
+ describe('form wrapper', () => {
+ describe.each`
+ searchContext | search | searchOptions
+ ${MOCK_SEARCH_CONTEXT_FULL} | ${null} | ${[]}
+ ${MOCK_SEARCH_CONTEXT_FULL} | ${MOCK_SEARCH} | ${[]}
+ ${MOCK_SEARCH_CONTEXT_FULL} | ${MOCK_SEARCH} | ${MOCK_SCOPED_SEARCH_OPTIONS}
+ ${null} | ${MOCK_SEARCH} | ${MOCK_SCOPED_SEARCH_OPTIONS}
+ ${null} | ${null} | ${MOCK_SCOPED_SEARCH_OPTIONS}
+ ${null} | ${null} | ${[]}
+ `('', ({ searchContext, search, searchOptions }) => {
+ beforeEach(() => {
+ window.gon.current_username = MOCK_USERNAME;
+
+ createComponent({ search, searchContext }, { searchOptions: () => searchOptions });
+
+ findHeaderSearchInput().vm.$emit('click');
+ });
+
+ const hasIcon = Boolean(searchContext?.group);
+ const isSearching = Boolean(search);
+ const isActive = Boolean(searchOptions.length > 0);
+
+ it(`${hasIcon ? 'with' : 'without'} search context classes contain "${
+ hasIcon ? 'has-icon' : 'has-no-icon'
+ }"`, () => {
+ const iconClassRegex = hasIcon ? 'has-icon' : 'has-no-icon';
+ expect(findHeaderSearchForm().classes()).toContain(iconClassRegex);
+ });
+
+ it(`${isSearching ? 'with' : 'without'} search string classes contain "${
+ isSearching ? 'is-searching' : 'is-not-searching'
+ }"`, () => {
+ const iconClassRegex = isSearching ? 'is-searching' : 'is-not-searching';
+ expect(findHeaderSearchForm().classes()).toContain(iconClassRegex);
+ });
+
+ it(`${isActive ? 'with' : 'without'} search results classes contain "${
+ isActive ? 'is-active' : 'is-not-active'
+ }"`, () => {
+ const iconClassRegex = isActive ? 'is-active' : 'is-not-active';
+ expect(findHeaderSearchForm().classes()).toContain(iconClassRegex);
+ });
+ });
+ });
+
+ describe.each`
+ search | searchOptions | hasIcon | iconName
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[0]]} | ${true} | ${ICON_PROJECT}
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[2]]} | ${true} | ${ICON_GROUP}
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[3]]} | ${true} | ${ICON_SUBGROUP}
+ ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[4]]} | ${false} | ${false}
+ `('token', ({ search, searchOptions, hasIcon, iconName }) => {
+ beforeEach(() => {
+ window.gon.current_username = MOCK_USERNAME;
+ createComponent(
+ { search },
+ {
+ searchOptions: () => searchOptions,
+ },
+ );
+ });
+
+ it(`icon for data set type "${searchOptions[0]?.html_id}" ${
+ hasIcon ? 'is' : 'is NOT'
+ } rendered`, () => {
+ expect(findScopeToken().findComponent(GlIcon).exists()).toBe(hasIcon);
+ });
+
+ it(`render ${iconName ? `"${iconName}"` : 'NO'} icon for data set type "${
+ searchOptions[0]?.html_id
+ }"`, () => {
+ expect(
+ findScopeToken().findComponent(GlIcon).exists() &&
+ findScopeToken().findComponent(GlIcon).attributes('name'),
+ ).toBe(iconName);
+ });
+ });
});
describe('events', () => {
@@ -285,18 +425,20 @@ describe('HeaderSearchApp', () => {
});
describe('computed', () => {
- describe('currentFocusedOption', () => {
- const MOCK_INDEX = 1;
-
+ describe.each`
+ MOCK_INDEX | search
+ ${1} | ${null}
+ ${SEARCH_BOX_INDEX} | ${'test'}
+ ${2} | ${'test1'}
+ `('currentFocusedOption', ({ MOCK_INDEX, search }) => {
beforeEach(() => {
- createComponent();
+ createComponent({ search });
window.gon.current_username = MOCK_USERNAME;
findHeaderSearchInput().vm.$emit('click');
});
- it(`when currentFocusIndex changes to ${MOCK_INDEX} updates the data to searchOptions[${MOCK_INDEX}]`, async () => {
+ it(`when currentFocusIndex changes to ${MOCK_INDEX} updates the data to searchOptions[${MOCK_INDEX}]`, () => {
findDropdownKeyboardNavigation().vm.$emit('change', MOCK_INDEX);
- await nextTick();
expect(wrapper.vm.currentFocusedOption).toBe(MOCK_DEFAULT_SEARCH_OPTIONS[MOCK_INDEX]);
});
});
@@ -308,15 +450,25 @@ describe('HeaderSearchApp', () => {
createComponent();
});
- it('onKey-enter submits a search', async () => {
+ it('onKey-enter submits a search', () => {
findHeaderSearchInput().vm.$emit('keydown', new KeyboardEvent({ key: ENTER_KEY }));
- await nextTick();
-
expect(visitUrl).toHaveBeenCalledWith(MOCK_SEARCH_QUERY);
});
});
+ describe('with less than min characters and no dropdown results', () => {
+ beforeEach(() => {
+ createComponent({ search: 'x' });
+ });
+
+ it('onKey-enter will NOT submit a search', () => {
+ findHeaderSearchInput().vm.$emit('keydown', new KeyboardEvent({ key: ENTER_KEY }));
+
+ expect(visitUrl).not.toHaveBeenCalledWith(MOCK_SEARCH_QUERY);
+ });
+ });
+
describe('with currentFocusedOption', () => {
const MOCK_INDEX = 1;
@@ -326,9 +478,9 @@ describe('HeaderSearchApp', () => {
findHeaderSearchInput().vm.$emit('click');
});
- it('onKey-enter clicks the selected dropdown item rather than submitting a search', async () => {
+ it('onKey-enter clicks the selected dropdown item rather than submitting a search', () => {
findDropdownKeyboardNavigation().vm.$emit('change', MOCK_INDEX);
- await nextTick();
+
findHeaderSearchInput().vm.$emit('keydown', new KeyboardEvent({ key: ENTER_KEY }));
expect(visitUrl).toHaveBeenCalledWith(MOCK_DEFAULT_SEARCH_OPTIONS[MOCK_INDEX].url);
});
diff --git a/spec/frontend/header_search/components/header_search_scoped_items_spec.js b/spec/frontend/header_search/components/header_search_scoped_items_spec.js
index 8788fb23458..2db9f71d702 100644
--- a/spec/frontend/header_search/components/header_search_scoped_items_spec.js
+++ b/spec/frontend/header_search/components/header_search_scoped_items_spec.js
@@ -1,9 +1,11 @@
-import { GlDropdownItem, GlDropdownDivider } from '@gitlab/ui';
+import { GlDropdownItem, GlToken, GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import { trimText } from 'helpers/text_helper';
import HeaderSearchScopedItems from '~/header_search/components/header_search_scoped_items.vue';
+import { truncate } from '~/lib/utils/text_utility';
+import { MSG_IN_ALL_GITLAB, SCOPE_TOKEN_MAX_LENGTH } from '~/header_search/constants';
import {
MOCK_SEARCH,
MOCK_SCOPED_SEARCH_OPTIONS,
@@ -41,9 +43,12 @@ describe('HeaderSearchScopedItems', () => {
});
const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findGlDropdownDivider = () => wrapper.findComponent(GlDropdownDivider);
const findFirstDropdownItem = () => findDropdownItems().at(0);
const findDropdownItemTitles = () => findDropdownItems().wrappers.map((w) => trimText(w.text()));
+ const findScopeTokens = () => wrapper.findAllComponents(GlToken);
+ const findScopeTokensText = () => findScopeTokens().wrappers.map((w) => trimText(w.text()));
+ const findScopeTokensIcons = () =>
+ findScopeTokens().wrappers.map((w) => w.findAllComponents(GlIcon));
const findDropdownItemAriaLabels = () =>
findDropdownItems().wrappers.map((w) => trimText(w.attributes('aria-label')));
const findDropdownItemLinks = () => findDropdownItems().wrappers.map((w) => w.attributes('href'));
@@ -59,15 +64,31 @@ describe('HeaderSearchScopedItems', () => {
});
it('renders titles correctly', () => {
+ findDropdownItemTitles().forEach((title) => expect(title).toContain(MOCK_SEARCH));
+ });
+
+ it('renders scope names correctly', () => {
const expectedTitles = MOCK_SCOPED_SEARCH_OPTIONS.map((o) =>
- trimText(`"${MOCK_SEARCH}" ${o.description} ${o.scope || ''}`),
+ truncate(trimText(`in ${o.description || o.scope}`), SCOPE_TOKEN_MAX_LENGTH),
);
- expect(findDropdownItemTitles()).toStrictEqual(expectedTitles);
+
+ expect(findScopeTokensText()).toStrictEqual(expectedTitles);
+ });
+
+ it('renders scope icons correctly', () => {
+ findScopeTokensIcons().forEach((icon, i) => {
+ const w = icon.wrappers[0];
+ expect(w?.attributes('name')).toBe(MOCK_SCOPED_SEARCH_OPTIONS[i].icon);
+ });
+ });
+
+ it(`renders scope ${MSG_IN_ALL_GITLAB} correctly`, () => {
+ expect(findScopeTokens().at(-1).findComponent(GlIcon).exists()).toBe(false);
});
it('renders aria-labels correctly', () => {
const expectedLabels = MOCK_SCOPED_SEARCH_OPTIONS.map((o) =>
- trimText(`${MOCK_SEARCH} ${o.description} ${o.scope || ''}`),
+ trimText(`${MOCK_SEARCH} ${o.description || o.icon} ${o.scope || ''}`),
);
expect(findDropdownItemAriaLabels()).toStrictEqual(expectedLabels);
});
@@ -98,21 +119,5 @@ describe('HeaderSearchScopedItems', () => {
});
});
});
-
- describe.each`
- autosuggestResults | showDivider
- ${[]} | ${false}
- ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS} | ${true}
- `('scoped search items', ({ autosuggestResults, showDivider }) => {
- describe(`when when we have ${autosuggestResults.length} auto-sugest results`, () => {
- beforeEach(() => {
- createComponent({}, { autocompleteGroupedSearchOptions: () => autosuggestResults }, {});
- });
-
- it(`divider should${showDivider ? '' : ' not'} be shown`, () => {
- expect(findGlDropdownDivider().exists()).toBe(showDivider);
- });
- });
- });
});
});
diff --git a/spec/frontend/header_search/init_spec.js b/spec/frontend/header_search/init_spec.js
new file mode 100644
index 00000000000..9515ca8c812
--- /dev/null
+++ b/spec/frontend/header_search/init_spec.js
@@ -0,0 +1,74 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+
+import initHeaderSearch, { eventHandler, cleanEventListeners } from '~/header_search/init';
+
+describe('Header Search EventListener', () => {
+ beforeEach(() => {
+ jest.resetModules();
+ jest.restoreAllMocks();
+ setHTMLFixture(`
+ <div class="js-header-content">
+ <div class="header-search" id="js-header-search" data-autocomplete-path="/search/autocomplete" data-issues-path="/dashboard/issues" data-mr-path="/dashboard/merge_requests" data-search-context="{}" data-search-path="/search">
+ <input autocomplete="off" class="form-control gl-form-input gl-search-box-by-type-input" data-qa-selector="search_box" id="search" name="search" placeholder="Search GitLab" type="text">
+ </div>
+ </div>`);
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ jest.clearAllMocks();
+ });
+
+ it('attached event listener', () => {
+ const searchInputBox = document?.querySelector('#search');
+ const addEventListenerSpy = jest.spyOn(searchInputBox, 'addEventListener');
+ initHeaderSearch();
+
+ expect(addEventListenerSpy).toBeCalledTimes(2);
+ });
+
+ it('removes event listener ', async () => {
+ const searchInputBox = document?.querySelector('#search');
+ const removeEventListenerSpy = jest.spyOn(searchInputBox, 'removeEventListener');
+ jest.mock('~/header_search', () => ({ initHeaderSearchApp: jest.fn() }));
+ await eventHandler.apply(
+ {
+ newHeaderSearchFeatureFlag: true,
+ searchInputBox: document.querySelector('#search'),
+ },
+ [cleanEventListeners],
+ );
+
+ expect(removeEventListenerSpy).toBeCalledTimes(2);
+ });
+
+ it('attaches new vue dropdown when feature flag is enabled', async () => {
+ const mockVueApp = jest.fn();
+ jest.mock('~/header_search', () => ({ initHeaderSearchApp: mockVueApp }));
+ await eventHandler.apply(
+ {
+ newHeaderSearchFeatureFlag: true,
+ searchInputBox: document.querySelector('#search'),
+ },
+ () => {},
+ );
+
+ expect(mockVueApp).toBeCalled();
+ });
+
+ it('attaches old vue dropdown when feature flag is disabled', async () => {
+ const mockLegacyApp = jest.fn(() => ({
+ onSearchInputFocus: jest.fn(),
+ }));
+ jest.mock('~/search_autocomplete', () => mockLegacyApp);
+ await eventHandler.apply(
+ {
+ newHeaderSearchFeatureFlag: false,
+ searchInputBox: document.querySelector('#search'),
+ },
+ () => {},
+ );
+
+ expect(mockLegacyApp).toBeCalled();
+ });
+});
diff --git a/spec/frontend/header_search/mock_data.js b/spec/frontend/header_search/mock_data.js
index b6f0fdcc29d..8ccd7fb17e3 100644
--- a/spec/frontend/header_search/mock_data.js
+++ b/spec/frontend/header_search/mock_data.js
@@ -4,9 +4,12 @@ import {
MSG_MR_ASSIGNED_TO_ME,
MSG_MR_IM_REVIEWER,
MSG_MR_IVE_CREATED,
- MSG_IN_PROJECT,
- MSG_IN_GROUP,
MSG_IN_ALL_GITLAB,
+ PROJECTS_CATEGORY,
+ ICON_PROJECT,
+ GROUPS_CATEGORY,
+ ICON_GROUP,
+ ICON_SUBGROUP,
} from '~/header_search/constants';
export const MOCK_USERNAME = 'anyone';
@@ -27,12 +30,24 @@ export const MOCK_PROJECT = {
path: '/mock-project',
};
+export const MOCK_PROJECT_LONG = {
+ id: 124,
+ name: 'Mock Project Name That Is Ridiculously Long And It Goes Forever',
+ path: '/mock-project-name-that-is-ridiculously-long-and-it-goes-forever',
+};
+
export const MOCK_GROUP = {
id: 321,
name: 'MockGroup',
path: '/mock-group',
};
+export const MOCK_SUBGROUP = {
+ id: 322,
+ name: 'MockSubGroup',
+ path: `${MOCK_GROUP}/mock-subgroup`,
+};
+
export const MOCK_SEARCH_QUERY = 'http://gitlab.com/search?search=test';
export const MOCK_SEARCH = 'test';
@@ -44,6 +59,20 @@ export const MOCK_SEARCH_CONTEXT = {
group_metadata: {},
};
+export const MOCK_SEARCH_CONTEXT_FULL = {
+ group: {
+ id: 31,
+ name: 'testGroup',
+ full_name: 'testGroup',
+ },
+ group_metadata: {
+ group_path: 'testGroup',
+ name: 'testGroup',
+ issues_path: '/groups/testGroup/-/issues',
+ mr_path: '/groups/testGroup/-/merge_requests',
+ },
+};
+
export const MOCK_DEFAULT_SEARCH_OPTIONS = [
{
html_id: 'default-issues-assigned',
@@ -76,13 +105,51 @@ export const MOCK_SCOPED_SEARCH_OPTIONS = [
{
html_id: 'scoped-in-project',
scope: MOCK_PROJECT.name,
- description: MSG_IN_PROJECT,
+ scopeCategory: PROJECTS_CATEGORY,
+ icon: ICON_PROJECT,
+ url: MOCK_PROJECT.path,
+ },
+ {
+ html_id: 'scoped-in-project-long',
+ scope: MOCK_PROJECT_LONG.name,
+ scopeCategory: PROJECTS_CATEGORY,
+ icon: ICON_PROJECT,
+ url: MOCK_PROJECT_LONG.path,
+ },
+ {
+ html_id: 'scoped-in-group',
+ scope: MOCK_GROUP.name,
+ scopeCategory: GROUPS_CATEGORY,
+ icon: ICON_GROUP,
+ url: MOCK_GROUP.path,
+ },
+ {
+ html_id: 'scoped-in-subgroup',
+ scope: MOCK_SUBGROUP.name,
+ scopeCategory: GROUPS_CATEGORY,
+ icon: ICON_SUBGROUP,
+ url: MOCK_SUBGROUP.path,
+ },
+ {
+ html_id: 'scoped-in-all',
+ description: MSG_IN_ALL_GITLAB,
+ url: MOCK_ALL_PATH,
+ },
+];
+
+export const MOCK_SCOPED_SEARCH_OPTIONS_DEF = [
+ {
+ html_id: 'scoped-in-project',
+ scope: MOCK_PROJECT.name,
+ scopeCategory: PROJECTS_CATEGORY,
+ icon: ICON_PROJECT,
url: MOCK_PROJECT.path,
},
{
html_id: 'scoped-in-group',
scope: MOCK_GROUP.name,
- description: MSG_IN_GROUP,
+ scopeCategory: GROUPS_CATEGORY,
+ icon: ICON_GROUP,
url: MOCK_GROUP.path,
},
{
diff --git a/spec/frontend/header_search/store/getters_spec.js b/spec/frontend/header_search/store/getters_spec.js
index d3510de1439..c76be3c0360 100644
--- a/spec/frontend/header_search/store/getters_spec.js
+++ b/spec/frontend/header_search/store/getters_spec.js
@@ -9,6 +9,7 @@ import {
MOCK_SEARCH_CONTEXT,
MOCK_DEFAULT_SEARCH_OPTIONS,
MOCK_SCOPED_SEARCH_OPTIONS,
+ MOCK_SCOPED_SEARCH_OPTIONS_DEF,
MOCK_PROJECT,
MOCK_GROUP,
MOCK_ALL_PATH,
@@ -284,7 +285,7 @@ describe('Header Search Store Getters', () => {
it('returns the correct array', () => {
expect(getters.scopedSearchOptions(state, mockGetters)).toStrictEqual(
- MOCK_SCOPED_SEARCH_OPTIONS,
+ MOCK_SCOPED_SEARCH_OPTIONS_DEF,
);
});
});
@@ -308,6 +309,11 @@ describe('Header Search Store Getters', () => {
${MOCK_SEARCH} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${MOCK_SCOPED_SEARCH_OPTIONS} | ${[]} | ${MOCK_SCOPED_SEARCH_OPTIONS}
${MOCK_SEARCH} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${[]} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS} | ${MOCK_SORTED_AUTOCOMPLETE_OPTIONS}
${MOCK_SEARCH} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${MOCK_SCOPED_SEARCH_OPTIONS} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS} | ${MOCK_SCOPED_SEARCH_OPTIONS.concat(MOCK_SORTED_AUTOCOMPLETE_OPTIONS)}
+ ${1} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${[]} | ${[]} | ${[]}
+ ${'('} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${[]} | ${[]} | ${[]}
+ ${'t'} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${MOCK_SCOPED_SEARCH_OPTIONS} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS} | ${MOCK_SORTED_AUTOCOMPLETE_OPTIONS}
+ ${'te'} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${MOCK_SCOPED_SEARCH_OPTIONS} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS} | ${MOCK_SORTED_AUTOCOMPLETE_OPTIONS}
+ ${'tes'} | ${MOCK_DEFAULT_SEARCH_OPTIONS} | ${MOCK_SCOPED_SEARCH_OPTIONS} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS} | ${MOCK_SCOPED_SEARCH_OPTIONS.concat(MOCK_SORTED_AUTOCOMPLETE_OPTIONS)}
`(
'searchOptions',
({
diff --git a/spec/frontend/header_spec.js b/spec/frontend/header_spec.js
index 19849fba63c..4e2fb70a2cb 100644
--- a/spec/frontend/header_spec.js
+++ b/spec/frontend/header_spec.js
@@ -1,4 +1,3 @@
-import $ from 'jquery';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import initTodoToggle, { initNavUserDropdownTracking } from '~/header';
import { loadHTMLFixture, setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
@@ -9,11 +8,17 @@ describe('Header', () => {
const fixtureTemplate = 'issues/open-issue.html';
function isTodosCountHidden() {
- return $(todosPendingCount).hasClass('hidden');
+ return document.querySelector(todosPendingCount).classList.contains('hidden');
}
function triggerToggle(newCount) {
- $(document).trigger('todo:toggle', newCount);
+ const event = new CustomEvent('todo:toggle', {
+ detail: {
+ count: newCount,
+ },
+ });
+
+ document.dispatchEvent(event);
}
beforeEach(() => {
@@ -28,7 +33,7 @@ describe('Header', () => {
it('should update todos-count after receiving the todo:toggle event', () => {
triggerToggle(5);
- expect($(todosPendingCount).text()).toEqual('5');
+ expect(document.querySelector(todosPendingCount).textContent).toEqual('5');
});
it('should hide todos-count when it is 0', () => {
@@ -53,7 +58,7 @@ describe('Header', () => {
});
it('should show 99+ for todos-count', () => {
- expect($(todosPendingCount).text()).toEqual('99+');
+ expect(document.querySelector(todosPendingCount).textContent).toEqual('99+');
});
});
});
@@ -67,7 +72,11 @@ describe('Header', () => {
<a class="js-buy-pipeline-minutes-link" data-track-action="click_buy_ci_minutes" data-track-label="free" data-track-property="user_dropdown">Buy Pipeline minutes</a>
</li>`);
- trackingSpy = mockTracking('_category_', $('.js-nav-user-dropdown').element, jest.spyOn);
+ trackingSpy = mockTracking(
+ '_category_',
+ document.querySelector('.js-nav-user-dropdown').element,
+ jest.spyOn,
+ );
document.body.dataset.page = 'some:page';
initNavUserDropdownTracking();
@@ -79,7 +88,8 @@ describe('Header', () => {
});
it('sends a tracking event when the dropdown is opened and contains Buy Pipeline minutes link', () => {
- $('.js-nav-user-dropdown').trigger('shown.bs.dropdown');
+ const event = new CustomEvent('shown.bs.dropdown');
+ document.querySelector('.js-nav-user-dropdown').dispatchEvent(event);
expect(trackingSpy).toHaveBeenCalledWith('some:page', 'show_buy_ci_minutes', {
label: 'free',
diff --git a/spec/frontend/ide/components/commit_sidebar/empty_state_spec.js b/spec/frontend/ide/components/commit_sidebar/empty_state_spec.js
index 4f81c0aa5d3..7c48c0e6f95 100644
--- a/spec/frontend/ide/components/commit_sidebar/empty_state_spec.js
+++ b/spec/frontend/ide/components/commit_sidebar/empty_state_spec.js
@@ -1,29 +1,21 @@
-import Vue from 'vue';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
-import emptyState from '~/ide/components/commit_sidebar/empty_state.vue';
+import { shallowMount } from '@vue/test-utils';
+import EmptyState from '~/ide/components/commit_sidebar/empty_state.vue';
import { createStore } from '~/ide/stores';
-describe('IDE commit panel empty state', () => {
- let vm;
- let store;
+describe('IDE commit panel EmptyState component', () => {
+ let wrapper;
beforeEach(() => {
- store = createStore();
-
- const Component = Vue.extend(emptyState);
-
- Vue.set(store.state, 'noChangesStateSvgPath', 'no-changes');
-
- vm = createComponentWithStore(Component, store);
-
- vm.$mount();
+ const store = createStore();
+ store.state.noChangesStateSvgPath = 'no-changes';
+ wrapper = shallowMount(EmptyState, { store });
});
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
it('renders no changes text when last commit message is empty', () => {
- expect(vm.$el.textContent).toContain('No changes');
+ expect(wrapper.find('h4').text()).toBe('No changes');
});
});
diff --git a/spec/frontend/ide/components/commit_sidebar/list_spec.js b/spec/frontend/ide/components/commit_sidebar/list_spec.js
index 1d42512c9ee..81c81fc0a9f 100644
--- a/spec/frontend/ide/components/commit_sidebar/list_spec.js
+++ b/spec/frontend/ide/components/commit_sidebar/list_spec.js
@@ -1,51 +1,47 @@
-import Vue, { nextTick } from 'vue';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
-import commitSidebarList from '~/ide/components/commit_sidebar/list.vue';
-import { createStore } from '~/ide/stores';
+import { shallowMount } from '@vue/test-utils';
+import CommitSidebarList from '~/ide/components/commit_sidebar/list.vue';
+import ListItem from '~/ide/components/commit_sidebar/list_item.vue';
import { file } from '../../helpers';
describe('Multi-file editor commit sidebar list', () => {
- let store;
- let vm;
-
- beforeEach(() => {
- store = createStore();
-
- const Component = Vue.extend(commitSidebarList);
-
- vm = createComponentWithStore(Component, store, {
- title: 'Staged',
- fileList: [],
- action: 'stageAllChanges',
- actionBtnText: 'stage all',
- actionBtnIcon: 'history',
- activeFileKey: 'staged-testing',
- keyPrefix: 'staged',
+ let wrapper;
+
+ const mountComponent = ({ fileList }) =>
+ shallowMount(CommitSidebarList, {
+ propsData: {
+ title: 'Staged',
+ fileList,
+ action: 'stageAllChanges',
+ actionBtnText: 'stage all',
+ actionBtnIcon: 'history',
+ activeFileKey: 'staged-testing',
+ keyPrefix: 'staged',
+ },
});
- vm.$mount();
- });
-
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
describe('with a list of files', () => {
beforeEach(async () => {
const f = file('file name');
f.changed = true;
- vm.fileList.push(f);
- await nextTick();
+ wrapper = mountComponent({ fileList: [f] });
});
it('renders list', () => {
- expect(vm.$el.querySelectorAll('.multi-file-commit-list > li').length).toBe(1);
+ expect(wrapper.findAllComponents(ListItem)).toHaveLength(1);
});
});
- describe('empty files array', () => {
- it('renders no changes text when empty', () => {
- expect(vm.$el.textContent).toContain('No changes');
+ describe('with empty files array', () => {
+ beforeEach(() => {
+ wrapper = mountComponent({ fileList: [] });
+ });
+
+ it('renders no changes text ', () => {
+ expect(wrapper.text()).toContain('No changes');
});
});
});
diff --git a/spec/frontend/ide/components/commit_sidebar/success_message_spec.js b/spec/frontend/ide/components/commit_sidebar/success_message_spec.js
index 52e35bdbb73..63d51953915 100644
--- a/spec/frontend/ide/components/commit_sidebar/success_message_spec.js
+++ b/spec/frontend/ide/components/commit_sidebar/success_message_spec.js
@@ -1,32 +1,22 @@
-import Vue, { nextTick } from 'vue';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
-import successMessage from '~/ide/components/commit_sidebar/success_message.vue';
+import { shallowMount } from '@vue/test-utils';
+import SuccessMessage from '~/ide/components/commit_sidebar/success_message.vue';
import { createStore } from '~/ide/stores';
describe('IDE commit panel successful commit state', () => {
- let vm;
- let store;
+ let wrapper;
beforeEach(() => {
- store = createStore();
-
- const Component = Vue.extend(successMessage);
-
- vm = createComponentWithStore(Component, store, {
- committedStateSvgPath: 'committed-state',
- });
-
- vm.$mount();
+ const store = createStore();
+ store.state.committedStateSvgPath = 'committed-state';
+ store.state.lastCommitMsg = 'testing commit message';
+ wrapper = shallowMount(SuccessMessage, { store });
});
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
- it('renders last commit message when it exists', async () => {
- vm.$store.state.lastCommitMsg = 'testing commit message';
-
- await nextTick();
- expect(vm.$el.textContent).toContain('testing commit message');
+ it('renders last commit message when it exists', () => {
+ expect(wrapper.text()).toContain('testing commit message');
});
});
diff --git a/spec/frontend/ide/components/ide_spec.js b/spec/frontend/ide/components/ide_spec.js
index 37b42001a80..9172c69b10e 100644
--- a/spec/frontend/ide/components/ide_spec.js
+++ b/spec/frontend/ide/components/ide_spec.js
@@ -2,6 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import waitForPromises from 'helpers/wait_for_promises';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import CannotPushCodeAlert from '~/ide/components/cannot_push_code_alert.vue';
import ErrorMessage from '~/ide/components/error_message.vue';
import Ide from '~/ide/components/ide.vue';
@@ -40,6 +41,8 @@ describe('WebIDE', () => {
const findAlert = () => wrapper.findComponent(CannotPushCodeAlert);
beforeEach(() => {
+ stubPerformanceWebAPI();
+
store = createStore();
});
diff --git a/spec/frontend/ide/components/ide_tree_list_spec.js b/spec/frontend/ide/components/ide_tree_list_spec.js
index a85c52f5e86..0f61aa80e53 100644
--- a/spec/frontend/ide/components/ide_tree_list_spec.js
+++ b/spec/frontend/ide/components/ide_tree_list_spec.js
@@ -1,82 +1,72 @@
-import Vue, { nextTick } from 'vue';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
+import { GlSkeletonLoader } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
import IdeTreeList from '~/ide/components/ide_tree_list.vue';
import { createStore } from '~/ide/stores';
+import FileTree from '~/vue_shared/components/file_tree.vue';
import { file } from '../helpers';
import { projectData } from '../mock_data';
-describe('IDE tree list', () => {
- const Component = Vue.extend(IdeTreeList);
- const normalBranchTree = [file('fileName')];
- const emptyBranchTree = [];
- let vm;
- let store;
+describe('IdeTreeList component', () => {
+ let wrapper;
- const bootstrapWithTree = (tree = normalBranchTree) => {
+ const mountComponent = ({ tree, loading = false } = {}) => {
+ const store = createStore();
store.state.currentProjectId = 'abcproject';
store.state.currentBranchId = 'main';
store.state.projects.abcproject = { ...projectData };
- Vue.set(store.state.trees, 'abcproject/main', {
- tree,
- loading: false,
- });
+ Vue.set(store.state.trees, 'abcproject/main', { tree, loading });
- vm = createComponentWithStore(Component, store, {
- viewerType: 'edit',
+ wrapper = shallowMount(IdeTreeList, {
+ propsData: {
+ viewerType: 'edit',
+ },
+ store,
});
};
- beforeEach(() => {
- store = createStore();
- });
-
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
describe('normal branch', () => {
- beforeEach(() => {
- bootstrapWithTree();
-
- jest.spyOn(vm, '$emit').mockImplementation(() => {});
-
- vm.$mount();
- });
+ const tree = [file('fileName')];
it('emits tree-ready event', () => {
- expect(vm.$emit).toHaveBeenCalledTimes(1);
- expect(vm.$emit).toHaveBeenCalledWith('tree-ready');
+ mountComponent({ tree });
+
+ expect(wrapper.emitted('tree-ready')).toEqual([[]]);
});
- it('renders loading indicator', async () => {
- store.state.trees['abcproject/main'].loading = true;
+ it('renders loading indicator', () => {
+ mountComponent({ tree, loading: true });
- await nextTick();
- expect(vm.$el.querySelector('.multi-file-loading-container')).not.toBeNull();
- expect(vm.$el.querySelectorAll('.multi-file-loading-container').length).toBe(3);
+ expect(wrapper.findAllComponents(GlSkeletonLoader)).toHaveLength(3);
});
it('renders list of files', () => {
- expect(vm.$el.textContent).toContain('fileName');
+ mountComponent({ tree });
+
+ expect(wrapper.findAllComponents(FileTree)).toHaveLength(1);
+ expect(wrapper.findComponent(FileTree).props('file')).toEqual(tree[0]);
});
});
describe('empty-branch state', () => {
beforeEach(() => {
- bootstrapWithTree(emptyBranchTree);
-
- jest.spyOn(vm, '$emit').mockImplementation(() => {});
+ mountComponent({ tree: [] });
+ });
- vm.$mount();
+ it('emits tree-ready event', () => {
+ expect(wrapper.emitted('tree-ready')).toEqual([[]]);
});
- it('still emits tree-ready event', () => {
- expect(vm.$emit).toHaveBeenCalledWith('tree-ready');
+ it('does not render files', () => {
+ expect(wrapper.findAllComponents(FileTree)).toHaveLength(0);
});
- it('does not load files if the branch is empty', () => {
- expect(vm.$el.textContent).not.toContain('fileName');
- expect(vm.$el.textContent).toContain('No files');
+ it('renders empty state text', () => {
+ expect(wrapper.text()).toBe('No files');
});
});
});
diff --git a/spec/frontend/ide/components/nav_dropdown_button_spec.js b/spec/frontend/ide/components/nav_dropdown_button_spec.js
index 1c14685df68..8eebcdd9e08 100644
--- a/spec/frontend/ide/components/nav_dropdown_button_spec.js
+++ b/spec/frontend/ide/components/nav_dropdown_button_spec.js
@@ -1,81 +1,74 @@
-import Vue, { nextTick } from 'vue';
import { trimText } from 'helpers/text_helper';
-import { mountComponentWithStore } from 'helpers/vue_mount_component_helper';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import NavDropdownButton from '~/ide/components/nav_dropdown_button.vue';
import { createStore } from '~/ide/stores';
+import { __ } from '~/locale';
-describe('NavDropdown', () => {
+describe('NavDropdownButton component', () => {
const TEST_BRANCH_ID = 'lorem-ipsum-dolar';
const TEST_MR_ID = '12345';
- let store;
- let vm;
-
- beforeEach(() => {
- store = createStore();
- });
+ let wrapper;
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
- const createComponent = (props = {}) => {
- vm = mountComponentWithStore(Vue.extend(NavDropdownButton), { props, store });
- vm.$mount();
+ const createComponent = ({ props = {}, state = {} } = {}) => {
+ const store = createStore();
+ store.replaceState(state);
+ wrapper = mountExtended(NavDropdownButton, { propsData: props, store });
};
- const findIcon = (name) => vm.$el.querySelector(`[data-testid="${name}-icon"]`);
- const findMRIcon = () => findIcon('merge-request');
- const findBranchIcon = () => findIcon('branch');
+ const findMRIcon = () => wrapper.findByLabelText(__('Merge request'));
+ const findBranchIcon = () => wrapper.findByLabelText(__('Current Branch'));
describe('normal', () => {
- beforeEach(() => {
+ it('renders empty placeholders, if state is falsey', () => {
createComponent();
- });
- it('renders empty placeholders, if state is falsey', () => {
- expect(trimText(vm.$el.textContent)).toEqual('- -');
+ expect(trimText(wrapper.text())).toBe('- -');
});
- it('renders branch name, if state has currentBranchId', async () => {
- vm.$store.state.currentBranchId = TEST_BRANCH_ID;
+ it('renders branch name, if state has currentBranchId', () => {
+ createComponent({ state: { currentBranchId: TEST_BRANCH_ID } });
- await nextTick();
- expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} -`);
+ expect(trimText(wrapper.text())).toBe(`${TEST_BRANCH_ID} -`);
});
- it('renders mr id, if state has currentMergeRequestId', async () => {
- vm.$store.state.currentMergeRequestId = TEST_MR_ID;
+ it('renders mr id, if state has currentMergeRequestId', () => {
+ createComponent({ state: { currentMergeRequestId: TEST_MR_ID } });
- await nextTick();
- expect(trimText(vm.$el.textContent)).toEqual(`- !${TEST_MR_ID}`);
+ expect(trimText(wrapper.text())).toBe(`- !${TEST_MR_ID}`);
});
- it('renders branch and mr, if state has both', async () => {
- vm.$store.state.currentBranchId = TEST_BRANCH_ID;
- vm.$store.state.currentMergeRequestId = TEST_MR_ID;
+ it('renders branch and mr, if state has both', () => {
+ createComponent({
+ state: { currentBranchId: TEST_BRANCH_ID, currentMergeRequestId: TEST_MR_ID },
+ });
- await nextTick();
- expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} !${TEST_MR_ID}`);
+ expect(trimText(wrapper.text())).toBe(`${TEST_BRANCH_ID} !${TEST_MR_ID}`);
});
it('shows icons', () => {
- expect(findBranchIcon()).toBeTruthy();
- expect(findMRIcon()).toBeTruthy();
+ createComponent();
+
+ expect(findBranchIcon().exists()).toBe(true);
+ expect(findMRIcon().exists()).toBe(true);
});
});
- describe('with showMergeRequests false', () => {
+ describe('when showMergeRequests=false', () => {
beforeEach(() => {
- createComponent({ showMergeRequests: false });
+ createComponent({ props: { showMergeRequests: false } });
});
it('shows single empty placeholder, if state is falsey', () => {
- expect(trimText(vm.$el.textContent)).toEqual('-');
+ expect(trimText(wrapper.text())).toBe('-');
});
it('shows only branch icon', () => {
- expect(findBranchIcon()).toBeTruthy();
- expect(findMRIcon()).toBe(null);
+ expect(findBranchIcon().exists()).toBe(true);
+ expect(findMRIcon().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/ide/components/new_dropdown/modal_spec.js b/spec/frontend/ide/components/new_dropdown/modal_spec.js
index e8635444801..68cc08d2ebc 100644
--- a/spec/frontend/ide/components/new_dropdown/modal_spec.js
+++ b/spec/frontend/ide/components/new_dropdown/modal_spec.js
@@ -1,209 +1,419 @@
-import Vue, { nextTick } from 'vue';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
+import { GlButton, GlModal } from '@gitlab/ui';
+import { nextTick } from 'vue';
import createFlash from '~/flash';
-import modal from '~/ide/components/new_dropdown/modal.vue';
+import Modal from '~/ide/components/new_dropdown/modal.vue';
import { createStore } from '~/ide/stores';
+import { stubComponent } from 'helpers/stub_component';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { createEntriesFromPaths } from '../../helpers';
jest.mock('~/flash');
+const NEW_NAME = 'babar';
+
describe('new file modal component', () => {
- const Component = Vue.extend(modal);
- let vm;
+ const showModal = jest.fn();
+ const toggleModal = jest.fn();
+
+ let store;
+ let wrapper;
+
+ const findForm = () => wrapper.findByTestId('file-name-form');
+ const findGlModal = () => wrapper.findComponent(GlModal);
+ const findInput = () => wrapper.findByTestId('file-name-field');
+ const findTemplateButtons = () => wrapper.findAllComponents(GlButton);
+ const findTemplateButtonsModel = () =>
+ findTemplateButtons().wrappers.map((x) => ({
+ text: x.text(),
+ variant: x.props('variant'),
+ category: x.props('category'),
+ }));
+
+ const open = (type, path) => {
+ // TODO: This component can not be passed props
+ // We have to interact with the open() method?
+ wrapper.vm.open(type, path);
+ };
+ const triggerSubmitForm = () => {
+ findForm().trigger('submit');
+ };
+ const triggerSubmitModal = () => {
+ findGlModal().vm.$emit('primary');
+ };
+ const triggerCancel = () => {
+ findGlModal().vm.$emit('cancel');
+ };
+
+ const mountComponent = () => {
+ const GlModalStub = stubComponent(GlModal);
+ jest.spyOn(GlModalStub.methods, 'show').mockImplementation(showModal);
+ jest.spyOn(GlModalStub.methods, 'toggle').mockImplementation(toggleModal);
+
+ wrapper = shallowMountExtended(Modal, {
+ store,
+ stubs: {
+ GlModal: GlModalStub,
+ },
+ // We need to attach to document for "focus" to work
+ attachTo: document.body,
+ });
+ };
+
+ beforeEach(() => {
+ store = createStore();
+
+ Object.assign(
+ store.state.entries,
+ createEntriesFromPaths([
+ 'README.md',
+ 'src',
+ 'src/deleted.js',
+ 'src/parent_dir',
+ 'src/parent_dir/foo.js',
+ ]),
+ );
+ Object.assign(store.state.entries['src/deleted.js'], { deleted: true });
+
+ jest.spyOn(store, 'dispatch').mockImplementation();
+ });
afterEach(() => {
- vm.$destroy();
+ store = null;
+ wrapper.destroy();
+ document.body.innerHTML = '';
});
- describe.each`
- entryType | modalTitle | btnTitle | showsFileTemplates
- ${'tree'} | ${'Create new directory'} | ${'Create directory'} | ${false}
- ${'blob'} | ${'Create new file'} | ${'Create file'} | ${true}
- `('$entryType', ({ entryType, modalTitle, btnTitle, showsFileTemplates }) => {
+ describe('default', () => {
beforeEach(async () => {
- const store = createStore();
-
- vm = createComponentWithStore(Component, store).$mount();
- vm.open(entryType);
- vm.name = 'testing';
+ mountComponent();
+ // Not necessarily needed, but used to ensure that nothing extra is happening after the tick
await nextTick();
});
- afterEach(() => {
- vm.close();
+ it('renders modal', () => {
+ expect(findGlModal().props()).toMatchObject({
+ actionCancel: {
+ attributes: [{ variant: 'default' }],
+ text: 'Cancel',
+ },
+ actionPrimary: {
+ attributes: [{ variant: 'confirm' }],
+ text: 'Create file',
+ },
+ actionSecondary: null,
+ size: 'lg',
+ modalId: 'ide-new-entry',
+ title: 'Create new file',
+ });
});
- it(`sets modal title as ${entryType}`, () => {
- expect(document.querySelector('.modal-title').textContent.trim()).toBe(modalTitle);
+ it('renders name label', () => {
+ expect(wrapper.find('label').text()).toBe('Name');
});
- it(`sets button label as ${entryType}`, () => {
- expect(document.querySelector('.btn-confirm').textContent.trim()).toBe(btnTitle);
+ it('renders template buttons', () => {
+ const actual = findTemplateButtonsModel();
+
+ expect(actual.length).toBeGreaterThan(0);
+ expect(actual).toEqual(
+ store.getters['fileTemplates/templateTypes'].map((template) => ({
+ category: 'secondary',
+ text: template.name,
+ variant: 'dashed',
+ })),
+ );
});
- it(`sets form label as ${entryType}`, () => {
- expect(document.querySelector('.label-bold').textContent.trim()).toBe('Name');
+ // These negative ".not.toHaveBeenCalled" assertions complement the positive "toHaveBeenCalled"
+ // assertions that show up later in this spec. Without these, we're not guaranteed the "act"
+ // actually caused the change in behavior.
+ it('does not dispatch actions by default', () => {
+ expect(store.dispatch).not.toHaveBeenCalled();
});
- it(`shows file templates: ${showsFileTemplates}`, () => {
- const templateFilesEl = document.querySelector('.file-templates');
- expect(Boolean(templateFilesEl)).toBe(showsFileTemplates);
+ it('does not trigger modal by default', () => {
+ expect(showModal).not.toHaveBeenCalled();
+ expect(toggleModal).not.toHaveBeenCalled();
});
- });
- describe('rename entry', () => {
- beforeEach(() => {
- const store = createStore();
- store.state.entries = {
- 'test-path': {
- name: 'test',
- type: 'blob',
- path: 'test-path',
- },
- };
-
- vm = createComponentWithStore(Component, store).$mount();
+ it('does not focus input by default', () => {
+ expect(document.activeElement).toBe(document.body);
});
+ });
- it.each`
- entryType | modalTitle | btnTitle
- ${'tree'} | ${'Rename folder'} | ${'Rename folder'}
- ${'blob'} | ${'Rename file'} | ${'Rename file'}
- `(
- 'renders title and button for renaming $entryType',
- async ({ entryType, modalTitle, btnTitle }) => {
- vm.$store.state.entries['test-path'].type = entryType;
- vm.open('rename', 'test-path');
+ describe.each`
+ entryType | path | modalTitle | btnTitle | showsFileTemplates | inputValue | inputPlaceholder
+ ${'tree'} | ${''} | ${'Create new directory'} | ${'Create directory'} | ${false} | ${''} | ${'dir/'}
+ ${'blob'} | ${''} | ${'Create new file'} | ${'Create file'} | ${true} | ${''} | ${'dir/file_name'}
+ ${'blob'} | ${'foo/bar'} | ${'Create new file'} | ${'Create file'} | ${true} | ${'foo/bar/'} | ${'dir/file_name'}
+ `(
+ 'when opened as $entryType with path "$path"',
+ ({
+ entryType,
+ path,
+ modalTitle,
+ btnTitle,
+ showsFileTemplates,
+ inputValue,
+ inputPlaceholder,
+ }) => {
+ beforeEach(async () => {
+ mountComponent();
+
+ open(entryType, path);
await nextTick();
- expect(document.querySelector('.modal-title').textContent.trim()).toBe(modalTitle);
- expect(document.querySelector('.btn-confirm').textContent.trim()).toBe(btnTitle);
- },
- );
+ });
- describe('entryName', () => {
- it('returns entries name', () => {
- vm.open('rename', 'test-path');
+ it('sets modal props', () => {
+ expect(findGlModal().props()).toMatchObject({
+ title: modalTitle,
+ actionPrimary: {
+ attributes: [{ variant: 'confirm' }],
+ text: btnTitle,
+ },
+ });
+ });
- expect(vm.entryName).toBe('test-path');
+ it('sets input attributes', () => {
+ expect(findInput().element.value).toBe(inputValue);
+ expect(findInput().attributes('placeholder')).toBe(inputPlaceholder);
});
- it('does not reset entryName to its old value if empty', () => {
- vm.entryName = 'hello';
- vm.entryName = '';
+ it(`shows file templates: ${showsFileTemplates}`, () => {
+ const actual = findTemplateButtonsModel().length > 0;
- expect(vm.entryName).toBe('');
+ expect(actual).toBe(showsFileTemplates);
+ });
+
+ it('shows modal', () => {
+ expect(showModal).toHaveBeenCalled();
});
- });
- describe('open', () => {
- it('sets entryName to path provided if modalType is rename', () => {
- vm.open('rename', 'test-path');
+ it('focus on input', () => {
+ expect(document.activeElement).toBe(findInput().element);
+ });
+
+ it('resets when canceled', async () => {
+ triggerCancel();
+
+ await nextTick();
- expect(vm.entryName).toBe('test-path');
+ // Resets input value
+ expect(findInput().element.value).toBe('');
+ // Resets to blob mode
+ expect(findGlModal().props('title')).toBe('Create new file');
});
+ },
+ );
+
+ describe.each`
+ modalType | name | expectedName
+ ${'blob'} | ${'foo/bar.js'} | ${'foo/bar.js'}
+ ${'blob'} | ${'foo /bar.js'} | ${'foo/bar.js'}
+ ${'tree'} | ${'foo/dir'} | ${'foo/dir'}
+ ${'tree'} | ${'foo /dir'} | ${'foo/dir'}
+ `('when submitting as $modalType with "$name"', ({ modalType, name, expectedName }) => {
+ describe('when using the modal primary button', () => {
+ beforeEach(async () => {
+ mountComponent();
+
+ open(modalType, '');
+ await nextTick();
- it("appends '/' to the path if modalType isn't rename", () => {
- vm.open('blob', 'test-path');
+ findInput().setValue(name);
+ triggerSubmitModal();
+ });
- expect(vm.entryName).toBe('test-path/');
+ it('triggers createTempEntry action', () => {
+ expect(store.dispatch).toHaveBeenCalledWith('createTempEntry', {
+ name: expectedName,
+ type: modalType,
+ });
});
+ });
+
+ describe('when triggering form submit (pressing enter)', () => {
+ beforeEach(async () => {
+ mountComponent();
+
+ open(modalType, '');
+ await nextTick();
- it('leaves entryName blank if no path is provided', () => {
- vm.open('blob');
+ findInput().setValue(name);
+ triggerSubmitForm();
+ });
- expect(vm.entryName).toBe('');
+ it('triggers createTempEntry action', () => {
+ expect(store.dispatch).toHaveBeenCalledWith('createTempEntry', {
+ name: expectedName,
+ type: modalType,
+ });
});
});
});
- describe('createFromTemplate', () => {
- let store;
+ describe('when creating from template type', () => {
+ beforeEach(async () => {
+ mountComponent();
- beforeEach(() => {
- store = createStore();
- store.state.entries = {
- 'test-path/test': {
- name: 'test',
- deleted: false,
- },
- };
+ open('blob', 'some_dir');
- vm = createComponentWithStore(Component, store).$mount();
- vm.open('blob');
+ await nextTick();
- jest.spyOn(vm, 'createTempEntry').mockImplementation();
+ // Set input, then trigger button
+ findInput().setValue('some_dir/foo.js');
+ findTemplateButtons().at(1).vm.$emit('click');
});
- it.each`
- entryName | newFilePath
- ${''} | ${'.gitignore'}
- ${'README.md'} | ${'.gitignore'}
- ${'test-path/test/'} | ${'test-path/test/.gitignore'}
- ${'test-path/test'} | ${'test-path/.gitignore'}
- ${'test-path/test/abc.md'} | ${'test-path/test/.gitignore'}
- `(
- 'creates a new file with the given template name in appropriate directory for path: $path',
- ({ entryName, newFilePath }) => {
- vm.entryName = entryName;
+ it('triggers createTempEntry action', () => {
+ const { name: expectedName } = store.getters['fileTemplates/templateTypes'][1];
- vm.createFromTemplate({ name: '.gitignore' });
+ expect(store.dispatch).toHaveBeenCalledWith('createTempEntry', {
+ name: `some_dir/${expectedName}`,
+ type: 'blob',
+ });
+ });
- expect(vm.createTempEntry).toHaveBeenCalledWith({
- name: newFilePath,
- type: 'blob',
- });
- },
- );
+ it('toggles modal', () => {
+ expect(toggleModal).toHaveBeenCalled();
+ });
});
- describe('submitForm', () => {
- let store;
+ describe.each`
+ origPath | title | inputValue | inputSelectionStart
+ ${'src/parent_dir'} | ${'Rename folder'} | ${'src/parent_dir'} | ${'src/'.length}
+ ${'README.md'} | ${'Rename file'} | ${'README.md'} | ${0}
+ `('when renaming for $origPath', ({ origPath, title, inputValue, inputSelectionStart }) => {
+ beforeEach(async () => {
+ mountComponent();
+
+ open('rename', origPath);
+
+ await nextTick();
+ });
- beforeEach(() => {
- store = createStore();
- store.state.entries = {
- 'test-path/test': {
- name: 'test',
- deleted: false,
+ it('sets modal props for renaming', () => {
+ expect(findGlModal().props()).toMatchObject({
+ title,
+ actionPrimary: {
+ attributes: [{ variant: 'confirm' }],
+ text: title,
},
- };
+ });
+ });
+
+ it('sets input value', () => {
+ expect(findInput().element.value).toBe(inputValue);
+ });
- vm = createComponentWithStore(Component, store).$mount();
+ it(`does not show file templates`, () => {
+ expect(findTemplateButtonsModel()).toHaveLength(0);
});
- it('throws an error when target entry exists', () => {
- vm.open('rename', 'test-path/test');
+ it('shows modal when renaming', () => {
+ expect(showModal).toHaveBeenCalled();
+ });
- expect(createFlash).not.toHaveBeenCalled();
+ it('focus on input when renaming', () => {
+ expect(document.activeElement).toBe(findInput().element);
+ });
+
+ it('selects name part of the input', () => {
+ expect(findInput().element.selectionStart).toBe(inputSelectionStart);
+ expect(findInput().element.selectionEnd).toBe(origPath.length);
+ });
+
+ describe('when renames is submitted successfully', () => {
+ describe('when using the modal primary button', () => {
+ beforeEach(() => {
+ findInput().setValue(NEW_NAME);
+ triggerSubmitModal();
+ });
+
+ it('dispatches renameEntry event', () => {
+ expect(store.dispatch).toHaveBeenCalledWith('renameEntry', {
+ path: origPath,
+ parentPath: '',
+ name: NEW_NAME,
+ });
+ });
+
+ it('does not trigger flash', () => {
+ expect(createFlash).not.toHaveBeenCalled();
+ });
+ });
- vm.submitForm();
+ describe('when triggering form submit (pressing enter)', () => {
+ beforeEach(() => {
+ findInput().setValue(NEW_NAME);
+ triggerSubmitForm();
+ });
+ it('dispatches renameEntry event', () => {
+ expect(store.dispatch).toHaveBeenCalledWith('renameEntry', {
+ path: origPath,
+ parentPath: '',
+ name: NEW_NAME,
+ });
+ });
+
+ it('does not trigger flash', () => {
+ expect(createFlash).not.toHaveBeenCalled();
+ });
+ });
+ });
+ });
+
+ describe('when renaming and file already exists', () => {
+ beforeEach(async () => {
+ mountComponent();
+
+ open('rename', 'src/parent_dir');
+
+ await nextTick();
+
+ // Set to something that already exists!
+ findInput().setValue('src');
+ triggerSubmitModal();
+ });
+
+ it('creates flash', () => {
expect(createFlash).toHaveBeenCalledWith({
- message: 'The name "test-path/test" is already taken in this directory.',
+ message: 'The name "src" is already taken in this directory.',
fadeTransition: false,
addBodyClass: true,
});
});
- it('does not throw error when target entry does not exist', () => {
- jest.spyOn(vm, 'renameEntry').mockImplementation();
+ it('does not dispatch event', () => {
+ expect(store.dispatch).not.toHaveBeenCalled();
+ });
+ });
- vm.open('rename', 'test-path/test');
- vm.entryName = 'test-path/test2';
- vm.submitForm();
+ describe('when renaming and file has been deleted', () => {
+ beforeEach(async () => {
+ mountComponent();
- expect(createFlash).not.toHaveBeenCalled();
- });
+ open('rename', 'src/parent_dir/foo.js');
- it('removes leading/trailing found in the new name', () => {
- vm.open('rename', 'test-path/test');
+ await nextTick();
- vm.entryName = 'test-path /test';
+ findInput().setValue('src/deleted.js');
+ triggerSubmitModal();
+ });
- vm.submitForm();
+ it('does not create flash', () => {
+ expect(createFlash).not.toHaveBeenCalled();
+ });
- expect(vm.entryName).toBe('test-path/test');
+ it('dispatches event', () => {
+ expect(store.dispatch).toHaveBeenCalledWith('renameEntry', {
+ path: 'src/parent_dir/foo.js',
+ name: 'deleted.js',
+ parentPath: 'src',
+ });
});
});
});
diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js
index b44651481e9..7a0bcda1b7a 100644
--- a/spec/frontend/ide/components/repo_editor_spec.js
+++ b/spec/frontend/ide/components/repo_editor_spec.js
@@ -1,3 +1,4 @@
+import { GlTab } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
import { editor as monacoEditor, Range } from 'monaco-editor';
import Vue, { nextTick } from 'vue';
@@ -5,6 +6,7 @@ import Vuex from 'vuex';
import { shallowMount } from '@vue/test-utils';
import '~/behaviors/markdown/render_gfm';
import waitForPromises from 'helpers/wait_for_promises';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import { exampleConfigs, exampleFiles } from 'jest/ide/lib/editorconfig/mock_data';
import { EDITOR_CODE_INSTANCE_FN, EDITOR_DIFF_INSTANCE_FN } from '~/editor/constants';
import { EditorMarkdownExtension } from '~/editor/extensions/source_editor_markdown_ext';
@@ -125,10 +127,12 @@ describe('RepoEditor', () => {
};
const findEditor = () => wrapper.find('[data-testid="editor-container"]');
- const findTabs = () => wrapper.findAll('.ide-mode-tabs .nav-links li');
+ const findTabs = () => wrapper.findAllComponents(GlTab);
const findPreviewTab = () => wrapper.find('[data-testid="preview-tab"]');
beforeEach(() => {
+ stubPerformanceWebAPI();
+
createInstanceSpy = jest.spyOn(SourceEditor.prototype, EDITOR_CODE_INSTANCE_FN);
createDiffInstanceSpy = jest.spyOn(SourceEditor.prototype, EDITOR_DIFF_INSTANCE_FN);
createModelSpy = jest.spyOn(monacoEditor, 'createModel');
@@ -201,12 +205,12 @@ describe('RepoEditor', () => {
const tabs = findTabs();
expect(tabs).toHaveLength(2);
- expect(tabs.at(0).text()).toBe('Edit');
- expect(tabs.at(1).text()).toBe('Preview Markdown');
+ expect(tabs.at(0).element.dataset.testid).toBe('edit-tab');
+ expect(tabs.at(1).element.dataset.testid).toBe('preview-tab');
});
it('renders markdown for tempFile', async () => {
- findPreviewTab().trigger('click');
+ findPreviewTab().vm.$emit('click');
await waitForPromises();
expect(wrapper.find(ContentViewer).html()).toContain(dummyFile.text.content);
});
diff --git a/spec/frontend/ide/ide_router_spec.js b/spec/frontend/ide/ide_router_spec.js
index cd10812f8ea..adbdba1b11e 100644
--- a/spec/frontend/ide/ide_router_spec.js
+++ b/spec/frontend/ide/ide_router_spec.js
@@ -1,4 +1,5 @@
import waitForPromises from 'helpers/wait_for_promises';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import { createRouter } from '~/ide/ide_router';
import { createStore } from '~/ide/stores';
@@ -12,6 +13,8 @@ describe('IDE router', () => {
let router;
beforeEach(() => {
+ stubPerformanceWebAPI();
+
window.history.replaceState({}, '', '/');
store = createStore();
router = createRouter(store, DEFAULT_BRANCH);
diff --git a/spec/frontend/ide/stores/actions/file_spec.js b/spec/frontend/ide/stores/actions/file_spec.js
index 45d1beea3f8..6c1dee1e5ca 100644
--- a/spec/frontend/ide/stores/actions/file_spec.js
+++ b/spec/frontend/ide/stores/actions/file_spec.js
@@ -7,6 +7,7 @@ import { createStore } from '~/ide/stores';
import * as actions from '~/ide/stores/actions/file';
import * as types from '~/ide/stores/mutation_types';
import axios from '~/lib/utils/axios_utils';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import { file, createTriggerRenameAction, createTriggerUpdatePayload } from '../../helpers';
const ORIGINAL_CONTENT = 'original content';
@@ -19,6 +20,8 @@ describe('IDE store file actions', () => {
let router;
beforeEach(() => {
+ stubPerformanceWebAPI();
+
mock = new MockAdapter(axios);
originalGon = window.gon;
window.gon = {
diff --git a/spec/frontend/ide/stores/actions/merge_request_spec.js b/spec/frontend/ide/stores/actions/merge_request_spec.js
index 5592e2664c4..abc3ba5b0a2 100644
--- a/spec/frontend/ide/stores/actions/merge_request_spec.js
+++ b/spec/frontend/ide/stores/actions/merge_request_spec.js
@@ -1,5 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import { range } from 'lodash';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
import createFlash from '~/flash';
@@ -35,6 +36,8 @@ describe('IDE store merge request actions', () => {
let mock;
beforeEach(() => {
+ stubPerformanceWebAPI();
+
store = createStore();
mock = new MockAdapter(axios);
diff --git a/spec/frontend/ide/stores/actions/tree_spec.js b/spec/frontend/ide/stores/actions/tree_spec.js
index fc44cbb21ae..d43393875eb 100644
--- a/spec/frontend/ide/stores/actions/tree_spec.js
+++ b/spec/frontend/ide/stores/actions/tree_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
import { createRouter } from '~/ide/ide_router';
@@ -24,6 +25,8 @@ describe('Multi-file store tree actions', () => {
};
beforeEach(() => {
+ stubPerformanceWebAPI();
+
store = createStore();
router = createRouter(store);
jest.spyOn(router, 'push').mockImplementation();
diff --git a/spec/frontend/ide/stores/actions_spec.js b/spec/frontend/ide/stores/actions_spec.js
index 3889c4f11c3..f6d54491d77 100644
--- a/spec/frontend/ide/stores/actions_spec.js
+++ b/spec/frontend/ide/stores/actions_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import testAction from 'helpers/vuex_action_helper';
import eventHub from '~/ide/eventhub';
import { createRouter } from '~/ide/ide_router';
@@ -34,6 +35,8 @@ describe('Multi-file store actions', () => {
let router;
beforeEach(() => {
+ stubPerformanceWebAPI();
+
store = createStore();
router = createRouter(store);
diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
index 0279ad454d2..cdc508a0033 100644
--- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
@@ -50,13 +50,13 @@ describe('import table', () => {
const findPaginationDropdownText = () => findPaginationDropdown().find('button').text();
const findSelectionCount = () => wrapper.find('[data-test-id="selection-count"]');
- const triggerSelectAllCheckbox = () =>
- wrapper.find('thead input[type=checkbox]').trigger('click');
+ const triggerSelectAllCheckbox = (checked = true) =>
+ wrapper.find('thead input[type=checkbox]').setChecked(checked);
const selectRow = (idx) =>
- wrapper.findAll('tbody td input[type=checkbox]').at(idx).trigger('click');
+ wrapper.findAll('tbody td input[type=checkbox]').at(idx).setChecked(true);
- const createComponent = ({ bulkImportSourceGroups, importGroups }) => {
+ const createComponent = ({ bulkImportSourceGroups, importGroups, defaultTargetNamespace }) => {
apolloProvider = createMockApollo([], {
Query: {
availableNamespaces: () => availableNamespacesFixture,
@@ -73,6 +73,7 @@ describe('import table', () => {
jobsPath: '/fake_job_path',
sourceUrl: SOURCE_URL,
historyPath: '/fake_history_path',
+ defaultTargetNamespace,
},
apolloProvider,
});
@@ -165,6 +166,27 @@ describe('import table', () => {
expect(targetNamespaceDropdownButton.text()).toBe('No parent');
});
+ it('respects default namespace if provided', async () => {
+ const targetNamespace = availableNamespacesFixture[1];
+
+ createComponent({
+ bulkImportSourceGroups: () => ({
+ nodes: FAKE_GROUPS,
+ pageInfo: FAKE_PAGE_INFO,
+ versionValidation: FAKE_VERSION_VALIDATION,
+ }),
+ defaultTargetNamespace: targetNamespace.id,
+ });
+
+ await waitForPromises();
+
+ const firstRow = wrapper.find('tbody tr');
+ const targetNamespaceDropdownButton = findTargetNamespaceDropdown(firstRow).find(
+ '[aria-haspopup]',
+ );
+ expect(targetNamespaceDropdownButton.text()).toBe(targetNamespace.fullPath);
+ });
+
it('does not render status string when result list is empty', async () => {
createComponent({
bulkImportSourceGroups: jest.fn().mockResolvedValue({
@@ -388,7 +410,7 @@ describe('import table', () => {
expect(findSelectionCount().text()).toMatchInterpolatedText('0 selected');
await triggerSelectAllCheckbox();
expect(findSelectionCount().text()).toMatchInterpolatedText('2 selected');
- await triggerSelectAllCheckbox();
+ await triggerSelectAllCheckbox(false);
expect(findSelectionCount().text()).toMatchInterpolatedText('0 selected');
});
diff --git a/spec/frontend/integrations/edit/components/active_checkbox_spec.js b/spec/frontend/integrations/edit/components/active_checkbox_spec.js
index 633389578a0..1f7a5f0dbc9 100644
--- a/spec/frontend/integrations/edit/components/active_checkbox_spec.js
+++ b/spec/frontend/integrations/edit/components/active_checkbox_spec.js
@@ -1,7 +1,6 @@
import { GlFormCheckbox } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
import ActiveCheckbox from '~/integrations/edit/components/active_checkbox.vue';
import { createStore } from '~/integrations/edit/store';
@@ -74,22 +73,13 @@ describe('ActiveCheckbox', () => {
expect(findGlFormCheckbox().vm.$attrs.checked).toBe(true);
});
- describe('on checkbox click', () => {
- it('switches the form value', async () => {
- findInputInCheckbox().trigger('click');
-
- await nextTick();
- expect(findGlFormCheckbox().vm.$attrs.checked).toBe(false);
- });
- });
-
it('emits `toggle-integration-active` event with `true` on mount', () => {
expect(wrapper.emitted('toggle-integration-active')[0]).toEqual([true]);
});
describe('on checkbox `change` event', () => {
- it('emits `toggle-integration-active` event', () => {
- findGlFormCheckbox().vm.$emit('change', false);
+ it('emits `toggle-integration-active` event', async () => {
+ await findInputInCheckbox().setChecked(false);
expect(wrapper.emitted('toggle-integration-active')[1]).toEqual([false]);
});
diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js
index a2bdece821f..21e57a2e33c 100644
--- a/spec/frontend/integrations/edit/components/integration_form_spec.js
+++ b/spec/frontend/integrations/edit/components/integration_form_spec.js
@@ -596,37 +596,42 @@ describe('IntegrationForm', () => {
});
describe.each`
- scenario | replyStatus | errorMessage | expectToast | expectSentry
- ${'when "test settings" request fails'} | ${httpStatus.INTERNAL_SERVER_ERROR} | ${undefined} | ${I18N_DEFAULT_ERROR_MESSAGE} | ${true}
- ${'when "test settings" returns an error'} | ${httpStatus.OK} | ${'an error'} | ${'an error'} | ${false}
- ${'when "test settings" succeeds'} | ${httpStatus.OK} | ${undefined} | ${I18N_SUCCESSFUL_CONNECTION_MESSAGE} | ${false}
- `('$scenario', ({ replyStatus, errorMessage, expectToast, expectSentry }) => {
- beforeEach(async () => {
- mockAxios.onPut(mockTestPath).replyOnce(replyStatus, {
- error: Boolean(errorMessage),
- message: errorMessage,
+ scenario | replyStatus | errorMessage | serviceResponse | expectToast | expectSentry
+ ${'when "test settings" request fails'} | ${httpStatus.INTERNAL_SERVER_ERROR} | ${undefined} | ${undefined} | ${I18N_DEFAULT_ERROR_MESSAGE} | ${true}
+ ${'when "test settings" returns an error'} | ${httpStatus.OK} | ${'an error'} | ${undefined} | ${'an error'} | ${false}
+ ${'when "test settings" returns an error with details'} | ${httpStatus.OK} | ${'an error.'} | ${'extra info'} | ${'an error. extra info'} | ${false}
+ ${'when "test settings" succeeds'} | ${httpStatus.OK} | ${undefined} | ${undefined} | ${I18N_SUCCESSFUL_CONNECTION_MESSAGE} | ${false}
+ `(
+ '$scenario',
+ ({ replyStatus, errorMessage, serviceResponse, expectToast, expectSentry }) => {
+ beforeEach(async () => {
+ mockAxios.onPut(mockTestPath).replyOnce(replyStatus, {
+ error: Boolean(errorMessage),
+ message: errorMessage,
+ service_response: serviceResponse,
+ });
+
+ await findTestButton().vm.$emit('click', new Event('click'));
+ await waitForPromises();
});
- await findTestButton().vm.$emit('click', new Event('click'));
- await waitForPromises();
- });
-
- it(`calls toast with '${expectToast}'`, () => {
- expect(mockToastShow).toHaveBeenCalledWith(expectToast);
- });
+ it(`calls toast with '${expectToast}'`, () => {
+ expect(mockToastShow).toHaveBeenCalledWith(expectToast);
+ });
- it('sets `loading` prop of test button to `false`', () => {
- expect(findTestButton().props('loading')).toBe(false);
- });
+ it('sets `loading` prop of test button to `false`', () => {
+ expect(findTestButton().props('loading')).toBe(false);
+ });
- it('sets save button `disabled` prop to `false`', () => {
- expect(findProjectSaveButton().props('disabled')).toBe(false);
- });
+ it('sets save button `disabled` prop to `false`', () => {
+ expect(findProjectSaveButton().props('disabled')).toBe(false);
+ });
- it(`${expectSentry ? 'does' : 'does not'} capture exception in Sentry`, () => {
- expect(Sentry.captureException).toHaveBeenCalledTimes(expectSentry ? 1 : 0);
- });
- });
+ it(`${expectSentry ? 'does' : 'does not'} capture exception in Sentry`, () => {
+ expect(Sentry.captureException).toHaveBeenCalledTimes(expectSentry ? 1 : 0);
+ });
+ },
+ );
});
});
diff --git a/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js b/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js
index 49fbebb9396..6011b3e6edc 100644
--- a/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js
+++ b/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js
@@ -115,9 +115,8 @@ describe('JiraTriggerFields', () => {
const checkbox = findIssueTransitionEnabled();
expect(checkbox.element.checked).toBe(false);
- checkbox.trigger('click');
+ await checkbox.setChecked(true);
- await nextTick();
const [radio1, radio2] = findIssueTransitionModeRadios().wrappers;
expect(radio1.element.checked).toBe(true);
expect(radio2.element.checked).toBe(false);
diff --git a/spec/frontend/invite_members/components/import_a_project_modal_spec.js b/spec/frontend/invite_members/components/import_a_project_modal_spec.js
deleted file mode 100644
index 6db881d5c75..00000000000
--- a/spec/frontend/invite_members/components/import_a_project_modal_spec.js
+++ /dev/null
@@ -1,168 +0,0 @@
-import { GlFormGroup, GlSprintf, GlModal } from '@gitlab/ui';
-import MockAdapter from 'axios-mock-adapter';
-import { nextTick } from 'vue';
-import { stubComponent } from 'helpers/stub_component';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import waitForPromises from 'helpers/wait_for_promises';
-import * as ProjectsApi from '~/api/projects_api';
-import ImportAProjectModal from '~/invite_members/components/import_a_project_modal.vue';
-import ProjectSelect from '~/invite_members/components/project_select.vue';
-import axios from '~/lib/utils/axios_utils';
-
-let wrapper;
-let mock;
-
-const projectId = '1';
-const projectName = 'test name';
-const projectToBeImported = { id: '2' };
-const $toast = {
- show: jest.fn(),
-};
-
-const createComponent = () => {
- wrapper = shallowMountExtended(ImportAProjectModal, {
- propsData: {
- projectId,
- projectName,
- },
- stubs: {
- GlModal: stubComponent(GlModal, {
- template:
- '<div><slot name="modal-title"></slot><slot></slot><slot name="modal-footer"></slot></div>',
- }),
- GlSprintf,
- GlFormGroup: stubComponent(GlFormGroup, {
- props: ['state', 'invalidFeedback'],
- }),
- },
- mocks: {
- $toast,
- },
- });
-};
-
-beforeEach(() => {
- gon.api_version = 'v4';
- mock = new MockAdapter(axios);
-});
-
-afterEach(() => {
- wrapper.destroy();
- mock.restore();
-});
-
-describe('ImportAProjectModal', () => {
- const findIntroText = () => wrapper.find({ ref: 'modalIntro' }).text();
- const findCancelButton = () => wrapper.findByTestId('cancel-button');
- const findImportButton = () => wrapper.findByTestId('import-button');
- const clickImportButton = () => findImportButton().vm.$emit('click');
- const clickCancelButton = () => findCancelButton().vm.$emit('click');
- const findFormGroup = () => wrapper.findByTestId('form-group');
- const formGroupInvalidFeedback = () => findFormGroup().props('invalidFeedback');
- const formGroupErrorState = () => findFormGroup().props('state');
- const findProjectSelect = () => wrapper.findComponent(ProjectSelect);
-
- describe('rendering the modal', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders the modal with the correct title', () => {
- expect(wrapper.findComponent(GlModal).props('title')).toBe(
- 'Import members from another project',
- );
- });
-
- it('renders the Cancel button text correctly', () => {
- expect(findCancelButton().text()).toBe('Cancel');
- });
-
- it('renders the Import button text correctly', () => {
- expect(findImportButton().text()).toBe('Import project members');
- });
-
- it('renders the modal intro text correctly', () => {
- expect(findIntroText()).toBe("You're importing members to the test name project.");
- });
-
- it('renders the Import button modal without isLoading', () => {
- expect(findImportButton().props('loading')).toBe(false);
- });
-
- it('sets isLoading to true when the Invite button is clicked', async () => {
- clickImportButton();
-
- await nextTick();
-
- expect(findImportButton().props('loading')).toBe(true);
- });
- });
-
- describe('submitting the import form', () => {
- describe('when the import is successful', () => {
- beforeEach(() => {
- createComponent();
-
- findProjectSelect().vm.$emit('input', projectToBeImported);
-
- jest.spyOn(ProjectsApi, 'importProjectMembers').mockResolvedValue();
-
- clickImportButton();
- });
-
- it('calls Api importProjectMembers', () => {
- expect(ProjectsApi.importProjectMembers).toHaveBeenCalledWith(
- projectId,
- projectToBeImported.id,
- );
- });
-
- it('displays the successful toastMessage', () => {
- expect($toast.show).toHaveBeenCalledWith(
- 'Successfully imported',
- wrapper.vm.$options.toastOptions,
- );
- });
-
- it('sets isLoading to false after success', () => {
- expect(findImportButton().props('loading')).toBe(false);
- });
- });
-
- describe('when the import fails', () => {
- beforeEach(async () => {
- createComponent();
-
- findProjectSelect().vm.$emit('input', projectToBeImported);
-
- jest
- .spyOn(ProjectsApi, 'importProjectMembers')
- .mockRejectedValue({ response: { data: { success: false } } });
-
- clickImportButton();
- await waitForPromises();
- });
-
- it('displays the generic error message', () => {
- expect(formGroupInvalidFeedback()).toBe('Unable to import project members');
- expect(formGroupErrorState()).toBe(false);
- });
-
- it('sets isLoading to false after error', () => {
- expect(findImportButton().props('loading')).toBe(false);
- });
-
- it('clears the error when the modal is closed with an error', async () => {
- expect(formGroupInvalidFeedback()).toBe('Unable to import project members');
- expect(formGroupErrorState()).toBe(false);
-
- clickCancelButton();
-
- await nextTick();
-
- expect(formGroupInvalidFeedback()).toBe('');
- expect(formGroupErrorState()).not.toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/invite_members/components/import_project_members_modal_spec.js b/spec/frontend/invite_members/components/import_project_members_modal_spec.js
new file mode 100644
index 00000000000..b4d42d90d99
--- /dev/null
+++ b/spec/frontend/invite_members/components/import_project_members_modal_spec.js
@@ -0,0 +1,170 @@
+import { GlFormGroup, GlSprintf, GlModal } from '@gitlab/ui';
+import MockAdapter from 'axios-mock-adapter';
+import { nextTick } from 'vue';
+import { stubComponent } from 'helpers/stub_component';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import * as ProjectsApi from '~/api/projects_api';
+import ImportProjectMembersModal from '~/invite_members/components/import_project_members_modal.vue';
+import ProjectSelect from '~/invite_members/components/project_select.vue';
+import axios from '~/lib/utils/axios_utils';
+
+let wrapper;
+let mock;
+
+const projectId = '1';
+const projectName = 'test name';
+const projectToBeImported = { id: '2' };
+const $toast = {
+ show: jest.fn(),
+};
+
+const createComponent = () => {
+ wrapper = shallowMountExtended(ImportProjectMembersModal, {
+ propsData: {
+ projectId,
+ projectName,
+ },
+ stubs: {
+ GlModal: stubComponent(GlModal, {
+ template:
+ '<div><slot name="modal-title"></slot><slot></slot><slot name="modal-footer"></slot></div>',
+ }),
+ GlSprintf,
+ GlFormGroup: stubComponent(GlFormGroup, {
+ props: ['state', 'invalidFeedback'],
+ }),
+ },
+ mocks: {
+ $toast,
+ },
+ });
+};
+
+beforeEach(() => {
+ gon.api_version = 'v4';
+ mock = new MockAdapter(axios);
+});
+
+afterEach(() => {
+ wrapper.destroy();
+ mock.restore();
+});
+
+describe('ImportProjectMembersModal', () => {
+ const findGlModal = () => wrapper.findComponent(GlModal);
+ const findIntroText = () => wrapper.find({ ref: 'modalIntro' }).text();
+ const clickImportButton = () => findGlModal().vm.$emit('primary', { preventDefault: jest.fn() });
+ const closeModal = () => findGlModal().vm.$emit('hidden', { preventDefault: jest.fn() });
+ const findFormGroup = () => wrapper.findByTestId('form-group');
+ const formGroupInvalidFeedback = () => findFormGroup().props('invalidFeedback');
+ const formGroupErrorState = () => findFormGroup().props('state');
+ const findProjectSelect = () => wrapper.findComponent(ProjectSelect);
+
+ describe('rendering the modal', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders the modal with the correct title', () => {
+ expect(findGlModal().props('title')).toBe('Import members from another project');
+ });
+
+ it('renders the Cancel button text correctly', () => {
+ expect(findGlModal().props('actionCancel')).toMatchObject({
+ text: 'Cancel',
+ });
+ });
+
+ it('renders the Import button text correctly', () => {
+ expect(findGlModal().props('actionPrimary')).toMatchObject({
+ text: 'Import project members',
+ attributes: {
+ variant: 'confirm',
+ disabled: true,
+ loading: false,
+ },
+ });
+ });
+
+ it('renders the modal intro text correctly', () => {
+ expect(findIntroText()).toBe("You're importing members to the test name project.");
+ });
+
+ it('sets isLoading to true when the Invite button is clicked', async () => {
+ clickImportButton();
+
+ await nextTick();
+
+ expect(findGlModal().props('actionPrimary').attributes.loading).toBe(true);
+ });
+ });
+
+ describe('submitting the import', () => {
+ describe('when the import is successful', () => {
+ beforeEach(() => {
+ createComponent();
+
+ findProjectSelect().vm.$emit('input', projectToBeImported);
+
+ jest.spyOn(ProjectsApi, 'importProjectMembers').mockResolvedValue();
+
+ clickImportButton();
+ });
+
+ it('calls Api importProjectMembers', () => {
+ expect(ProjectsApi.importProjectMembers).toHaveBeenCalledWith(
+ projectId,
+ projectToBeImported.id,
+ );
+ });
+
+ it('displays the successful toastMessage', () => {
+ expect($toast.show).toHaveBeenCalledWith(
+ 'Successfully imported',
+ wrapper.vm.$options.toastOptions,
+ );
+ });
+
+ it('sets isLoading to false after success', () => {
+ expect(findGlModal().props('actionPrimary').attributes.loading).toBe(false);
+ });
+ });
+
+ describe('when the import fails', () => {
+ beforeEach(async () => {
+ createComponent();
+
+ findProjectSelect().vm.$emit('input', projectToBeImported);
+
+ jest
+ .spyOn(ProjectsApi, 'importProjectMembers')
+ .mockRejectedValue({ response: { data: { success: false } } });
+
+ clickImportButton();
+ await waitForPromises();
+ });
+
+ it('displays the generic error message', () => {
+ expect(formGroupInvalidFeedback()).toBe('Unable to import project members');
+ expect(formGroupErrorState()).toBe(false);
+ });
+
+ it('sets isLoading to false after error', () => {
+ expect(findGlModal().props('actionPrimary').attributes.loading).toBe(false);
+ });
+
+ it('clears the error when the modal is closed with an error', async () => {
+ expect(formGroupInvalidFeedback()).toBe('Unable to import project members');
+ expect(formGroupErrorState()).toBe(false);
+
+ closeModal();
+
+ await nextTick();
+
+ expect(formGroupInvalidFeedback()).toBe('');
+ expect(formGroupErrorState()).not.toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/invite_members/components/import_project_members_trigger_spec.js b/spec/frontend/invite_members/components/import_project_members_trigger_spec.js
new file mode 100644
index 00000000000..b6375fcfa22
--- /dev/null
+++ b/spec/frontend/invite_members/components/import_project_members_trigger_spec.js
@@ -0,0 +1,49 @@
+import { GlButton } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import ImportProjectMembersTrigger from '~/invite_members/components/import_project_members_trigger.vue';
+import eventHub from '~/invite_members/event_hub';
+
+const displayText = 'Import Project Members';
+
+const createComponent = (props = {}) => {
+ return mount(ImportProjectMembersTrigger, {
+ propsData: {
+ displayText,
+ ...props,
+ },
+ });
+};
+
+describe('ImportProjectMembersTrigger', () => {
+ let wrapper;
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ describe('displayText', () => {
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ it('includes the correct displayText for the link', () => {
+ expect(findButton().text()).toBe(displayText);
+ });
+ });
+
+ describe('when button is clicked', () => {
+ beforeEach(() => {
+ eventHub.$emit = jest.fn();
+
+ wrapper = createComponent();
+
+ findButton().trigger('click');
+ });
+
+ it('emits event that triggers opening the modal', () => {
+ expect(eventHub.$emit).toHaveBeenLastCalledWith('openProjectMembersModal');
+ });
+ });
+});
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 13985ce7d74..045a454e63a 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -35,6 +35,7 @@ import {
user2,
user3,
user4,
+ user5,
GlEmoji,
} from '../mock_data/member_modal';
@@ -93,6 +94,11 @@ describe('InviteMembersModal', () => {
const findModal = () => wrapper.findComponent(GlModal);
const findBase = () => wrapper.findComponent(InviteModalBase);
const findIntroText = () => wrapper.findByTestId('modal-base-intro-text').text();
+ const findMemberErrorAlert = () => wrapper.findByTestId('alert-member-error');
+ const findMemberErrorMessage = (element) =>
+ `${Object.keys(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[element]}: ${
+ Object.values(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[element]
+ }`;
const emitEventFromModal = (eventName) => () =>
findModal().vm.$emit(eventName, { preventDefault: jest.fn() });
const clickInviteButton = emitEventFromModal('primary');
@@ -123,6 +129,10 @@ describe('InviteMembersModal', () => {
findBase().vm.$emit('access-level', val);
await nextTick();
};
+ const removeMembersToken = async (val) => {
+ findMembersSelect().vm.$emit('token-remove', val);
+ await nextTick();
+ };
describe('rendering the tasks to be done', () => {
const setupComponent = async (props = {}, urlParameter = ['invite_members_for_task']) => {
@@ -431,17 +441,20 @@ describe('InviteMembersModal', () => {
});
it('clears the error when the list of members to invite is cleared', async () => {
- expect(membersFormGroupInvalidFeedback()).toBe(
+ expect(findMemberErrorAlert().exists()).toBe(true);
+ expect(findMemberErrorAlert().text()).toContain(
Object.values(invitationsApiResponse.EMAIL_TAKEN.message)[0],
);
- expect(findMembersSelect().props('validationState')).toBe(false);
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
findMembersSelect().vm.$emit('clear');
await nextTick();
+ expect(findMemberErrorAlert().exists()).toBe(false);
expect(membersFormGroupInvalidFeedback()).toBe('');
- expect(findMembersSelect().props('validationState')).not.toBe(false);
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
});
it('clears the error when the cancel button is clicked', async () => {
@@ -450,7 +463,7 @@ describe('InviteMembersModal', () => {
await nextTick();
expect(membersFormGroupInvalidFeedback()).toBe('');
- expect(findMembersSelect().props('validationState')).not.toBe(false);
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
});
it('clears the error when the modal is hidden', async () => {
@@ -458,33 +471,12 @@ describe('InviteMembersModal', () => {
await nextTick();
+ expect(findMemberErrorAlert().exists()).toBe(false);
expect(membersFormGroupInvalidFeedback()).toBe('');
- expect(findMembersSelect().props('validationState')).not.toBe(false);
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
});
});
- it('clears the invalid state and message once the list of members to invite is cleared', async () => {
- mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_TAKEN);
-
- clickInviteButton();
-
- await waitForPromises();
-
- expect(membersFormGroupInvalidFeedback()).toBe(
- Object.values(invitationsApiResponse.EMAIL_TAKEN.message)[0],
- );
- expect(findMembersSelect().props('validationState')).toBe(false);
- expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
-
- findMembersSelect().vm.$emit('clear');
-
- await waitForPromises();
-
- expect(membersFormGroupInvalidFeedback()).toBe('');
- expect(findMembersSelect().props('validationState')).toBe(null);
- expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
- });
-
it('displays the generic error for http server error', async () => {
mockInvitationsApi(
httpStatus.INTERNAL_SERVER_ERROR,
@@ -496,6 +488,7 @@ describe('InviteMembersModal', () => {
await waitForPromises();
expect(membersFormGroupInvalidFeedback()).toBe('Something went wrong');
+ expect(findMembersSelect().props('exceptionState')).toBe(false);
});
it('displays the restricted user api message for response with bad request', async () => {
@@ -505,20 +498,31 @@ describe('InviteMembersModal', () => {
await waitForPromises();
- expect(membersFormGroupInvalidFeedback()).toBe(expectedEmailRestrictedError);
+ expect(findMemberErrorAlert().exists()).toBe(true);
+ expect(findMemberErrorAlert().text()).toContain(expectedEmailRestrictedError);
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
});
- it('displays the first part of the error when multiple existing users are restricted by email', async () => {
+ it('displays all errors when there are multiple existing users that are restricted by email', async () => {
mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.MULTIPLE_RESTRICTED);
clickInviteButton();
await waitForPromises();
- expect(membersFormGroupInvalidFeedback()).toBe(
- "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.",
+ expect(findMemberErrorAlert().exists()).toBe(true);
+ expect(findMemberErrorAlert().text()).toContain(
+ Object.values(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[0],
+ );
+ expect(findMemberErrorAlert().text()).toContain(
+ Object.values(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[1],
);
- expect(findMembersSelect().props('validationState')).toBe(false);
+ expect(findMemberErrorAlert().text()).toContain(
+ Object.values(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[2],
+ );
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
});
});
});
@@ -573,10 +577,30 @@ describe('InviteMembersModal', () => {
await waitForPromises();
expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
- expect(findMembersSelect().props('validationState')).toBe(false);
+ expect(findMembersSelect().props('exceptionState')).toBe(false);
expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
});
+ it('clears the error when the modal is hidden', async () => {
+ mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
+
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
+ expect(findMembersSelect().props('exceptionState')).toBe(false);
+ expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
+
+ findModal().vm.$emit('hidden');
+
+ await nextTick();
+
+ expect(findMemberErrorAlert().exists()).toBe(false);
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
+ });
+
it('displays the restricted email error when restricted email is invited', async () => {
mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_RESTRICTED);
@@ -584,20 +608,32 @@ describe('InviteMembersModal', () => {
await waitForPromises();
- expect(membersFormGroupInvalidFeedback()).toContain(expectedEmailRestrictedError);
- expect(findMembersSelect().props('validationState')).toBe(false);
+ expect(findMemberErrorAlert().exists()).toBe(true);
+ expect(findMemberErrorAlert().text()).toContain(expectedEmailRestrictedError);
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
});
- it('displays the first error message when multiple emails return a restricted error message', async () => {
+ it('displays all errors when there are multiple emails that return a restricted error message', async () => {
mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.MULTIPLE_RESTRICTED);
clickInviteButton();
await waitForPromises();
- expect(membersFormGroupInvalidFeedback()).toContain(expectedEmailRestrictedError);
- expect(findMembersSelect().props('validationState')).toBe(false);
+ expect(findMemberErrorAlert().exists()).toBe(true);
+ expect(findMemberErrorAlert().text()).toContain(
+ Object.values(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[0],
+ );
+ expect(findMemberErrorAlert().text()).toContain(
+ Object.values(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[1],
+ );
+ expect(findMemberErrorAlert().text()).toContain(
+ Object.values(invitationsApiResponse.MULTIPLE_RESTRICTED.message)[2],
+ );
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ expect(findMembersSelect().props('exceptionState')).not.toBe(false);
});
it('displays the invalid syntax error for bad request', async () => {
@@ -608,7 +644,7 @@ describe('InviteMembersModal', () => {
await waitForPromises();
expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
- expect(findMembersSelect().props('validationState')).toBe(false);
+ expect(findMembersSelect().props('exceptionState')).toBe(false);
});
});
@@ -617,14 +653,51 @@ describe('InviteMembersModal', () => {
createInviteMembersToGroupWrapper();
await triggerMembersTokenSelect([user3, user4]);
- mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.ERROR_EMAIL_INVALID);
+ mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.ERROR_EMAIL_INVALID);
clickInviteButton();
await waitForPromises();
expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
- expect(findMembersSelect().props('validationState')).toBe(false);
+ expect(findMembersSelect().props('exceptionState')).toBe(false);
+ });
+
+ it('displays errors for multiple and allows clearing', async () => {
+ createInviteMembersToGroupWrapper();
+
+ await triggerMembersTokenSelect([user3, user4, user5]);
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.MULTIPLE_RESTRICTED);
+
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(findMemberErrorAlert().exists()).toBe(true);
+ expect(findMemberErrorAlert().props('title')).toContain(
+ "The following 3 members couldn't be invited",
+ );
+ expect(findMemberErrorAlert().text()).toContain(findMemberErrorMessage(0));
+ expect(findMemberErrorAlert().text()).toContain(findMemberErrorMessage(1));
+ expect(findMemberErrorAlert().text()).toContain(findMemberErrorMessage(2));
+
+ await removeMembersToken(user3);
+
+ expect(findMemberErrorAlert().props('title')).toContain(
+ "The following 2 members couldn't be invited",
+ );
+ expect(findMemberErrorAlert().text()).not.toContain(findMemberErrorMessage(0));
+
+ await removeMembersToken(user4);
+
+ expect(findMemberErrorAlert().props('title')).toContain(
+ "The following member couldn't be invited",
+ );
+ expect(findMemberErrorAlert().text()).not.toContain(findMemberErrorMessage(1));
+
+ await removeMembersToken(user5);
+
+ expect(findMemberErrorAlert().exists()).toBe(false);
});
});
});
@@ -675,24 +748,6 @@ describe('InviteMembersModal', () => {
});
});
});
-
- describe('when any invite failed for any reason', () => {
- beforeEach(async () => {
- createInviteMembersToGroupWrapper();
-
- await triggerMembersTokenSelect([user1, user3]);
-
- mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
-
- clickInviteButton();
- });
-
- it('displays the first error message', async () => {
- await waitForPromises();
-
- expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
- });
- });
});
describe('tracking', () => {
diff --git a/spec/frontend/invite_members/components/invite_modal_base_spec.js b/spec/frontend/invite_members/components/invite_modal_base_spec.js
index cc19e90a5fa..b55eeb72471 100644
--- a/spec/frontend/invite_members/components/invite_modal_base_spec.js
+++ b/spec/frontend/invite_members/components/invite_modal_base_spec.js
@@ -254,7 +254,7 @@ describe('InviteModalBase', () => {
expect(wrapper.findComponent(GlModal).props('actionPrimary').attributes.loading).toBe(true);
});
- it('with invalidFeedbackMessage, set members form group validation state', () => {
+ it('with invalidFeedbackMessage, set members form group exception state', () => {
createComponent({
invalidFeedbackMessage: 'invalid message!',
});
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 bf5564e4d63..6375d0f7e2e 100644
--- a/spec/frontend/invite_members/components/members_token_select_spec.js
+++ b/spec/frontend/invite_members/components/members_token_select_spec.js
@@ -16,6 +16,7 @@ const createComponent = (props) => {
return shallowMount(MembersTokenSelect, {
propsData: {
ariaLabelledby: label,
+ invalidMembers: {},
placeholder,
...props,
},
@@ -124,12 +125,14 @@ describe('MembersTokenSelect', () => {
findTokenSelector().vm.$emit('token-remove', [user1]);
expect(wrapper.emitted('clear')).toEqual([[]]);
+ expect(wrapper.emitted('token-remove')).toBeUndefined();
});
- it('does not emit `clear` event when there are still tokens selected', () => {
+ it('emits `token-remove` event with the token when there are still tokens selected', () => {
findTokenSelector().vm.$emit('input', [user1, user2]);
findTokenSelector().vm.$emit('token-remove', [user1]);
+ expect(wrapper.emitted('token-remove')).toEqual([[[user1]]]);
expect(wrapper.emitted('clear')).toBeUndefined();
});
});
diff --git a/spec/frontend/invite_members/mock_data/member_modal.js b/spec/frontend/invite_members/mock_data/member_modal.js
index 474234cfacb..7d675b6206c 100644
--- a/spec/frontend/invite_members/mock_data/member_modal.js
+++ b/spec/frontend/invite_members/mock_data/member_modal.js
@@ -26,13 +26,17 @@ export const user2 = { id: 2, name: 'Name Two', username: 'one_2', avatar_url: '
export const user3 = {
id: 'user-defined-token',
name: 'email@example.com',
- username: 'one_2',
avatar_url: '',
};
export const user4 = {
- id: 'user-defined-token',
+ id: 'user-defined-token2',
name: 'email4@example.com',
- username: 'one_4',
+ avatar_url: '',
+};
+export const user5 = {
+ id: '3',
+ username: 'root',
+ name: 'root',
avatar_url: '',
};
diff --git a/spec/frontend/invite_members/utils/member_utils_spec.js b/spec/frontend/invite_members/utils/member_utils_spec.js
new file mode 100644
index 00000000000..eb76c9845d4
--- /dev/null
+++ b/spec/frontend/invite_members/utils/member_utils_spec.js
@@ -0,0 +1,12 @@
+import { memberName } from '~/invite_members/utils/member_utils';
+
+describe('Member Name', () => {
+ it.each([
+ [{ username: '_username_', name: '_name_' }, '_username_'],
+ [{ username: '_username_' }, '_username_'],
+ [{ name: '_name_' }, '_name_'],
+ [{}, undefined],
+ ])(`returns name from supplied member token: %j`, (member, result) => {
+ expect(memberName(member)).toBe(result);
+ });
+});
diff --git a/spec/frontend/invite_members/utils/response_message_parser_spec.js b/spec/frontend/invite_members/utils/response_message_parser_spec.js
index 8b2064df374..92f38c54c99 100644
--- a/spec/frontend/invite_members/utils/response_message_parser_spec.js
+++ b/spec/frontend/invite_members/utils/response_message_parser_spec.js
@@ -1,5 +1,5 @@
import {
- responseMessageFromSuccess,
+ responseFromSuccess,
responseMessageFromError,
} from '~/invite_members/utils/response_message_parser';
import { invitationsApiResponse } from '../mock_data/api_responses';
@@ -11,12 +11,12 @@ describe('Response message parser', () => {
const exampleKeyedMsg = { 'email@example.com': expectedMessage };
it.each([
- [{ data: { message: expectedMessage } }],
- [{ data: { error: expectedMessage } }],
- [{ data: { message: [expectedMessage] } }],
- [{ data: { message: exampleKeyedMsg } }],
- ])(`returns "${expectedMessage}" from success response: %j`, (successResponse) => {
- expect(responseMessageFromSuccess(successResponse)).toBe(expectedMessage);
+ [{ data: { message: expectedMessage } }, { error: true, message: expectedMessage }],
+ [{ data: { error: expectedMessage } }, { error: true, message: expectedMessage }],
+ [{ data: { message: [expectedMessage] } }, { error: true, message: expectedMessage }],
+ [{ data: { message: exampleKeyedMsg } }, { error: true, message: { ...exampleKeyedMsg } }],
+ ])(`returns "${expectedMessage}" from success response: %j`, (successResponse, result) => {
+ expect(responseFromSuccess(successResponse)).toStrictEqual(result);
});
});
@@ -30,15 +30,18 @@ describe('Response message parser', () => {
});
});
- describe('displaying only the first error when a response has messages for multiple users', () => {
- const expected =
- "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.";
-
+ describe('displaying all errors when a response has messages for multiple users', () => {
it.each([
- [{ data: invitationsApiResponse.MULTIPLE_RESTRICTED }],
- [{ data: invitationsApiResponse.EMAIL_RESTRICTED }],
- ])(`returns "${expectedMessage}" from success response: %j`, (restrictedResponse) => {
- expect(responseMessageFromSuccess(restrictedResponse)).toBe(expected);
+ [
+ { data: invitationsApiResponse.MULTIPLE_RESTRICTED },
+ { error: true, message: { ...invitationsApiResponse.MULTIPLE_RESTRICTED.message } },
+ ],
+ [
+ { data: invitationsApiResponse.EMAIL_RESTRICTED },
+ { error: true, message: { ...invitationsApiResponse.EMAIL_RESTRICTED.message } },
+ ],
+ ])(`returns "${expectedMessage}" from success response: %j`, (restrictedResponse, result) => {
+ expect(responseFromSuccess(restrictedResponse)).toStrictEqual(result);
});
});
});
diff --git a/spec/frontend/issuable/issuable_form_spec.js b/spec/frontend/issuable/issuable_form_spec.js
index a1583076b41..d844f3394d5 100644
--- a/spec/frontend/issuable/issuable_form_spec.js
+++ b/spec/frontend/issuable/issuable_form_spec.js
@@ -47,6 +47,25 @@ describe('IssuableForm', () => {
});
});
+ describe('resetAutosave', () => {
+ it('resets autosave on elements with the .js-reset-autosave class', () => {
+ setHTMLFixture(`
+ <form>
+ <input name="[title]" />
+ <textarea name="[description]"></textarea>
+ <a class="js-reset-autosave">Cancel</a>
+ </form>
+ `);
+ const $form = $('form');
+ const resetAutosave = jest.spyOn(IssuableForm.prototype, 'resetAutosave');
+ createIssuable($form);
+
+ $form.find('.js-reset-autosave').trigger('click');
+
+ expect(resetAutosave).toHaveBeenCalled();
+ });
+ });
+
describe('removeWip', () => {
it.each`
prefix
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 3f2c3c3ec5f..3d3dbfa6853 100644
--- a/spec/frontend/issues/list/components/issues_list_app_spec.js
+++ b/spec/frontend/issues/list/components/issues_list_app_spec.js
@@ -29,6 +29,7 @@ import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_ro
import { IssuableListTabs, IssuableStates } from '~/vue_shared/issuable/list/constants';
import IssuesListApp from '~/issues/list/components/issues_list_app.vue';
import NewIssueDropdown from '~/issues/list/components/new_issue_dropdown.vue';
+
import {
CREATED_DESC,
RELATIVE_POSITION,
@@ -98,6 +99,7 @@ describe('CE IssuesListApp component', () => {
};
let defaultQueryResponse = getIssuesQueryResponse;
+ let router;
if (IS_EE) {
defaultQueryResponse = cloneDeep(getIssuesQueryResponse);
defaultQueryResponse.data.project.issues.nodes[0].blockingCount = 1;
@@ -133,9 +135,11 @@ describe('CE IssuesListApp component', () => {
[setSortPreferenceMutation, sortPreferenceMutationResponse],
];
+ router = new VueRouter({ mode: 'history' });
+
return mountFn(IssuesListApp, {
apolloProvider: createMockApollo(requestHandlers),
- router: new VueRouter({ mode: 'history' }),
+ router,
provide: {
...defaultProvide,
...provide,
@@ -736,7 +740,7 @@ describe('CE IssuesListApp component', () => {
describe('when "click-tab" event is emitted by IssuableList', () => {
beforeEach(() => {
wrapper = mountComponent();
- jest.spyOn(wrapper.vm.$router, 'push');
+ router.push = jest.fn();
findIssuableList().vm.$emit('click-tab', IssuableStates.Closed);
});
@@ -746,16 +750,26 @@ describe('CE IssuesListApp component', () => {
});
it('updates url to the new tab', () => {
- expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ expect(router.push).toHaveBeenCalledWith({
query: expect.objectContaining({ state: IssuableStates.Closed }),
});
});
});
describe.each`
- event | params
- ${'next-page'} | ${{ page_after: 'endCursor', page_before: undefined, first_page_size: 20, last_page_size: undefined }}
- ${'previous-page'} | ${{ page_after: undefined, page_before: 'startCursor', first_page_size: undefined, last_page_size: 20 }}
+ event | params
+ ${'next-page'} | ${{
+ page_after: 'endCursor',
+ page_before: undefined,
+ first_page_size: 20,
+ last_page_size: undefined,
+}}
+ ${'previous-page'} | ${{
+ page_after: undefined,
+ page_before: 'startCursor',
+ first_page_size: undefined,
+ last_page_size: 20,
+}}
`('when "$event" event is emitted by IssuableList', ({ event, params }) => {
beforeEach(() => {
wrapper = mountComponent({
@@ -766,7 +780,7 @@ describe('CE IssuesListApp component', () => {
},
},
});
- jest.spyOn(wrapper.vm.$router, 'push');
+ router.push = jest.fn();
findIssuableList().vm.$emit(event);
});
@@ -776,7 +790,7 @@ describe('CE IssuesListApp component', () => {
});
it(`updates url`, () => {
- expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ expect(router.push).toHaveBeenCalledWith({
query: expect.objectContaining(params),
});
});
@@ -888,13 +902,13 @@ describe('CE IssuesListApp component', () => {
'updates to the new sort when payload is `%s`',
async (sortKey) => {
wrapper = mountComponent();
- jest.spyOn(wrapper.vm.$router, 'push');
+ router.push = jest.fn();
findIssuableList().vm.$emit('sort', sortKey);
jest.runOnlyPendingTimers();
await nextTick();
- expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ expect(router.push).toHaveBeenCalledWith({
query: expect.objectContaining({ sort: urlSortParams[sortKey] }),
});
},
@@ -907,13 +921,13 @@ describe('CE IssuesListApp component', () => {
wrapper = mountComponent({
provide: { initialSort, isIssueRepositioningDisabled: true },
});
- jest.spyOn(wrapper.vm.$router, 'push');
+ router.push = jest.fn();
findIssuableList().vm.$emit('sort', RELATIVE_POSITION_ASC);
});
it('does not update the sort to manual', () => {
- expect(wrapper.vm.$router.push).not.toHaveBeenCalled();
+ expect(router.push).not.toHaveBeenCalled();
});
it('shows an alert to tell the user that manual reordering is disabled', () => {
@@ -978,12 +992,12 @@ describe('CE IssuesListApp component', () => {
describe('when "filter" event is emitted by IssuableList', () => {
it('updates IssuableList with url params', async () => {
wrapper = mountComponent();
- jest.spyOn(wrapper.vm.$router, 'push');
+ router.push = jest.fn();
findIssuableList().vm.$emit('filter', filteredTokens);
await nextTick();
- expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ expect(router.push).toHaveBeenCalledWith({
query: expect.objectContaining(urlParams),
});
});
@@ -993,13 +1007,13 @@ describe('CE IssuesListApp component', () => {
wrapper = mountComponent({
provide: { isAnonymousSearchDisabled: true, isSignedIn: false },
});
- jest.spyOn(wrapper.vm.$router, 'push');
+ router.push = jest.fn();
findIssuableList().vm.$emit('filter', filteredTokens);
});
it('does not update url params', () => {
- expect(wrapper.vm.$router.push).not.toHaveBeenCalled();
+ expect(router.push).not.toHaveBeenCalled();
});
it('shows an alert to tell the user they must be signed in to search', () => {
@@ -1030,4 +1044,19 @@ describe('CE IssuesListApp component', () => {
expect(mockQuery).toHaveBeenCalledWith(expect.objectContaining({ hideUsers }));
});
});
+
+ describe('when "page-size-change" event is emitted by IssuableList', () => {
+ it('updates url params with new page size', async () => {
+ wrapper = mountComponent();
+ router.push = jest.fn();
+
+ findIssuableList().vm.$emit('page-size-change', 50);
+ await nextTick();
+
+ expect(router.push).toHaveBeenCalledTimes(1);
+ expect(router.push).toHaveBeenCalledWith({
+ query: expect.objectContaining({ first_page_size: 50 }),
+ });
+ });
+ });
});
diff --git a/spec/frontend/issues/list/mock_data.js b/spec/frontend/issues/list/mock_data.js
index 42f2d08082e..4347c580a4d 100644
--- a/spec/frontend/issues/list/mock_data.js
+++ b/spec/frontend/issues/list/mock_data.js
@@ -32,6 +32,7 @@ export const getIssuesQueryResponse = {
state: 'opened',
title: 'Issue title',
updatedAt: '2021-05-22T04:08:01Z',
+ closedAt: null,
upvotes: 3,
userDiscussionsCount: 4,
webPath: 'project/-/issues/789',
diff --git a/spec/frontend/issues/list/utils_spec.js b/spec/frontend/issues/list/utils_spec.js
index e8ffba9bc80..3c6332d5728 100644
--- a/spec/frontend/issues/list/utils_spec.js
+++ b/spec/frontend/issues/list/utils_spec.js
@@ -10,12 +10,7 @@ import {
urlParams,
urlParamsWithSpecialValues,
} from 'jest/issues/list/mock_data';
-import {
- PAGE_SIZE,
- PAGE_SIZE_MANUAL,
- RELATIVE_POSITION_ASC,
- urlSortParams,
-} from '~/issues/list/constants';
+import { PAGE_SIZE, urlSortParams } from '~/issues/list/constants';
import {
convertToApiParams,
convertToSearchQuery,
@@ -29,52 +24,30 @@ import {
import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants';
describe('getInitialPageParams', () => {
- it.each(Object.keys(urlSortParams))(
- 'returns the correct page params for sort key %s',
- (sortKey) => {
- const firstPageSize = sortKey === RELATIVE_POSITION_ASC ? PAGE_SIZE_MANUAL : PAGE_SIZE;
+ it('returns page params with a default page size when no arguments are given', () => {
+ expect(getInitialPageParams()).toEqual({ firstPageSize: PAGE_SIZE });
+ });
- expect(getInitialPageParams(sortKey)).toEqual({ firstPageSize });
- },
- );
+ it('returns page params with the given page size', () => {
+ const pageSize = 100;
+ expect(getInitialPageParams(pageSize)).toEqual({ firstPageSize: pageSize });
+ });
- it.each(Object.keys(urlSortParams))(
- 'returns the correct page params for sort key %s with afterCursor',
- (sortKey) => {
- const firstPageSize = sortKey === RELATIVE_POSITION_ASC ? PAGE_SIZE_MANUAL : PAGE_SIZE;
- const lastPageSize = undefined;
- const afterCursor = 'randomCursorString';
- const beforeCursor = undefined;
- const pageParams = getInitialPageParams(
- sortKey,
- firstPageSize,
- lastPageSize,
- afterCursor,
- beforeCursor,
- );
-
- expect(pageParams).toEqual({ firstPageSize, afterCursor });
- },
- );
+ it('does not return firstPageSize when lastPageSize is provided', () => {
+ const firstPageSize = 100;
+ const lastPageSize = 50;
+ const afterCursor = undefined;
+ const beforeCursor = 'randomCursorString';
+ const pageParams = getInitialPageParams(
+ 100,
+ firstPageSize,
+ lastPageSize,
+ afterCursor,
+ beforeCursor,
+ );
- it.each(Object.keys(urlSortParams))(
- 'returns the correct page params for sort key %s with beforeCursor',
- (sortKey) => {
- const firstPageSize = undefined;
- const lastPageSize = PAGE_SIZE;
- const afterCursor = undefined;
- const beforeCursor = 'anotherRandomCursorString';
- const pageParams = getInitialPageParams(
- sortKey,
- firstPageSize,
- lastPageSize,
- afterCursor,
- beforeCursor,
- );
-
- expect(pageParams).toEqual({ lastPageSize, beforeCursor });
- },
- );
+ expect(pageParams).toEqual({ lastPageSize, beforeCursor });
+ });
});
describe('getSortKey', () => {
@@ -97,10 +70,10 @@ describe('isSortKey', () => {
describe('getSortOptions', () => {
describe.each`
hasIssueWeightsFeature | hasBlockedIssuesFeature | length | containsWeight | containsBlocking
- ${false} | ${false} | ${9} | ${false} | ${false}
- ${true} | ${false} | ${10} | ${true} | ${false}
- ${false} | ${true} | ${10} | ${false} | ${true}
- ${true} | ${true} | ${11} | ${true} | ${true}
+ ${false} | ${false} | ${10} | ${false} | ${false}
+ ${true} | ${false} | ${11} | ${true} | ${false}
+ ${false} | ${true} | ${11} | ${false} | ${true}
+ ${true} | ${true} | ${12} | ${true} | ${true}
`(
'when hasIssueWeightsFeature=$hasIssueWeightsFeature and hasBlockedIssuesFeature=$hasBlockedIssuesFeature',
({
diff --git a/spec/frontend/issues/new/components/__snapshots__/type_popover_spec.js.snap b/spec/frontend/issues/new/components/__snapshots__/type_popover_spec.js.snap
index 881dcda126f..1a199ed2ee9 100644
--- a/spec/frontend/issues/new/components/__snapshots__/type_popover_spec.js.snap
+++ b/spec/frontend/issues/new/components/__snapshots__/type_popover_spec.js.snap
@@ -2,10 +2,11 @@
exports[`Issue type info popover renders 1`] = `
<span
+ class="gl-ml-2"
id="popovercontainer"
>
<gl-icon-stub
- class="gl-ml-5 gl-text-gray-500"
+ class="gl-text-blue-600"
id="issue-type-info"
name="question-o"
size="16"
diff --git a/spec/frontend/issues/show/components/description_spec.js b/spec/frontend/issues/show/components/description_spec.js
index 2cc27309e59..8ee57f97754 100644
--- a/spec/frontend/issues/show/components/description_spec.js
+++ b/spec/frontend/issues/show/components/description_spec.js
@@ -15,10 +15,15 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import Description from '~/issues/show/components/description.vue';
import { updateHistory } from '~/lib/utils/url_utility';
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
+import workItemTypesQuery from '~/work_items/graphql/project_work_item_types.query.graphql';
+import createWorkItemFromTaskMutation from '~/work_items/graphql/create_work_item_from_task.mutation.graphql';
import TaskList from '~/task_list';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
import { TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
-import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
+import {
+ projectWorkItemTypesQueryResponse,
+ createWorkItemFromTaskMutationResponse,
+} from 'jest/work_items/mock_data';
import {
descriptionProps as initialProps,
descriptionHtmlWithCheckboxes,
@@ -46,6 +51,10 @@ const workItemQueryResponse = {
};
const queryHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
+const workItemTypesQueryHandler = jest.fn().mockResolvedValue(projectWorkItemTypesQueryResponse);
+const createWorkItemFromTaskSuccessHandler = jest
+ .fn()
+ .mockResolvedValue(createWorkItemFromTaskMutationResponse);
describe('Description component', () => {
let wrapper;
@@ -60,18 +69,24 @@ describe('Description component', () => {
const findTooltips = () => wrapper.findAllComponents(GlTooltip);
const findModal = () => wrapper.findComponent(GlModal);
- const findCreateWorkItem = () => wrapper.findComponent(CreateWorkItem);
const findWorkItemDetailModal = () => wrapper.findComponent(WorkItemDetailModal);
- function createComponent({ props = {}, provide = {} } = {}) {
+ function createComponent({ props = {}, provide } = {}) {
wrapper = shallowMountExtended(Description, {
propsData: {
issueId: 1,
...initialProps,
...props,
},
- provide,
- apolloProvider: createMockApollo([[workItemQuery, queryHandler]]),
+ provide: {
+ fullPath: 'gitlab-org/gitlab-test',
+ ...provide,
+ },
+ apolloProvider: createMockApollo([
+ [workItemQuery, queryHandler],
+ [workItemTypesQuery, workItemTypesQueryHandler],
+ [createWorkItemFromTaskMutation, createWorkItemFromTaskSuccessHandler],
+ ]),
mocks: {
$toast,
},
@@ -299,24 +314,16 @@ describe('Description component', () => {
});
it('does not show a modal by default', () => {
- expect(findModal().props('visible')).toBe(false);
+ expect(findModal().exists()).toBe(false);
});
- it('opens a modal when a button is clicked and displays correct title', async () => {
- await findConvertToTaskButton().trigger('click');
- expect(findCreateWorkItem().props('initialTitle').trim()).toBe('todo 1');
- });
+ it('emits `updateDescription` after creating new work item', async () => {
+ const newDescription = `<p>New description</p>`;
- it('closes the modal on `closeCreateTaskModal` event', async () => {
await findConvertToTaskButton().trigger('click');
- findCreateWorkItem().vm.$emit('closeModal');
- expect(hideModal).toHaveBeenCalled();
- });
- it('emits `updateDescription` on `onCreate` event', () => {
- const newDescription = `<p>New description</p>`;
- findCreateWorkItem().vm.$emit('onCreate', newDescription);
- expect(hideModal).toHaveBeenCalled();
+ await waitForPromises();
+
expect(wrapper.emitted('updateDescription')).toEqual([[newDescription]]);
});
@@ -325,7 +332,7 @@ describe('Description component', () => {
findWorkItemDetailModal().vm.$emit('workItemDeleted', newDesc);
expect(wrapper.emitted('updateDescription')).toEqual([[newDesc]]);
- expect($toast.show).toHaveBeenCalledWith('Work item deleted');
+ expect($toast.show).toHaveBeenCalledWith('Task deleted');
});
});
diff --git a/spec/frontend/issues/show/components/edited_spec.js b/spec/frontend/issues/show/components/edited_spec.js
index 8a8fe23230a..8a240c38b5f 100644
--- a/spec/frontend/issues/show/components/edited_spec.js
+++ b/spec/frontend/issues/show/components/edited_spec.js
@@ -1,49 +1,50 @@
-import Vue from 'vue';
-import edited from '~/issues/show/components/edited.vue';
-
-function formatText(text) {
- return text.trim().replace(/\s\s+/g, ' ');
-}
-
-describe('edited', () => {
- const EditedComponent = Vue.extend(edited);
-
- it('should render an edited at+by string', () => {
- const editedComponent = new EditedComponent({
- propsData: {
- updatedAt: '2017-05-15T12:31:04.428Z',
- updatedByName: 'Some User',
- updatedByPath: '/some_user',
- },
- }).$mount();
-
- expect(formatText(editedComponent.$el.innerText)).toMatch(/Edited[\s\S]+?by Some User/);
- expect(editedComponent.$el.querySelector('.author-link').href).toMatch(/\/some_user$/);
- expect(editedComponent.$el.querySelector('time')).toBeTruthy();
+import { shallowMount } from '@vue/test-utils';
+import Edited from '~/issues/show/components/edited.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+describe('Edited component', () => {
+ let wrapper;
+
+ const findAuthorLink = () => wrapper.find('a');
+ const findTimeAgoTooltip = () => wrapper.findComponent(TimeAgoTooltip);
+ const formatText = (text) => text.trim().replace(/\s\s+/g, ' ');
+
+ const mountComponent = (propsData) => shallowMount(Edited, { propsData });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders an edited at+by string', () => {
+ wrapper = mountComponent({
+ updatedAt: '2017-05-15T12:31:04.428Z',
+ updatedByName: 'Some User',
+ updatedByPath: '/some_user',
+ });
+
+ expect(formatText(wrapper.text())).toBe('Edited by Some User');
+ expect(findAuthorLink().attributes('href')).toBe('/some_user');
+ expect(findTimeAgoTooltip().exists()).toBe(true);
});
it('if no updatedAt is provided, no time element will be rendered', () => {
- const editedComponent = new EditedComponent({
- propsData: {
- updatedByName: 'Some User',
- updatedByPath: '/some_user',
- },
- }).$mount();
-
- expect(formatText(editedComponent.$el.innerText)).toMatch(/Edited by Some User/);
- expect(editedComponent.$el.querySelector('.author-link').href).toMatch(/\/some_user$/);
- expect(editedComponent.$el.querySelector('time')).toBeFalsy();
+ wrapper = mountComponent({
+ updatedByName: 'Some User',
+ updatedByPath: '/some_user',
+ });
+
+ expect(formatText(wrapper.text())).toBe('Edited by Some User');
+ expect(findAuthorLink().attributes('href')).toBe('/some_user');
+ expect(findTimeAgoTooltip().exists()).toBe(false);
});
it('if no updatedByName and updatedByPath is provided, no user element will be rendered', () => {
- const editedComponent = new EditedComponent({
- propsData: {
- updatedAt: '2017-05-15T12:31:04.428Z',
- },
- }).$mount();
-
- expect(formatText(editedComponent.$el.innerText)).not.toMatch(/by Some User/);
- expect(editedComponent.$el.querySelector('.author-link')).toBeFalsy();
- expect(editedComponent.$el.querySelector('time')).toBeTruthy();
+ wrapper = mountComponent({
+ updatedAt: '2017-05-15T12:31:04.428Z',
+ });
+
+ expect(formatText(wrapper.text())).toBe('Edited');
+ expect(findAuthorLink().exists()).toBe(false);
+ expect(findTimeAgoTooltip().exists()).toBe(true);
});
});
diff --git a/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js b/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js
index a4910d63bb5..155ae703e48 100644
--- a/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js
+++ b/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js
@@ -74,7 +74,7 @@ describe('Highlight Bar', () => {
});
it('renders a number of alert events', () => {
- expect(wrapper.text()).toContain(alert.eventCount);
+ expect(wrapper.text()).toContain(alert.eventCount.toString());
});
});
diff --git a/spec/frontend/issues/show/components/incidents/mock_data.js b/spec/frontend/issues/show/components/incidents/mock_data.js
index b5346a6089a..afc6099caf4 100644
--- a/spec/frontend/issues/show/components/incidents/mock_data.js
+++ b/spec/frontend/issues/show/components/incidents/mock_data.js
@@ -70,3 +70,36 @@ export const timelineEventsQueryEmptyResponse = {
},
},
};
+
+export const timelineEventsCreateEventResponse = {
+ timelineEvent: {
+ ...mockEvents[0],
+ },
+ errors: [],
+};
+
+export const timelineEventsCreateEventError = {
+ data: {
+ timelineEventCreate: {
+ timelineEvent: {
+ ...mockEvents[0],
+ },
+ errors: ['Create error'],
+ },
+ },
+};
+
+const timelineEventDeleteData = (errors = []) => {
+ return {
+ data: {
+ timelineEventDestroy: {
+ timelineEvent: { ...mockEvents[0] },
+ errors,
+ },
+ },
+ };
+};
+
+export const timelineEventsDeleteEventResponse = timelineEventDeleteData();
+
+export const timelineEventsDeleteEventError = timelineEventDeleteData(['Item does not exist']);
diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js
new file mode 100644
index 00000000000..620cdfc53b0
--- /dev/null
+++ b/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js
@@ -0,0 +1,181 @@
+import VueApollo from 'vue-apollo';
+import Vue, { nextTick } from 'vue';
+import { GlDatepicker } from '@gitlab/ui';
+import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import IncidentTimelineEventForm from '~/issues/show/components/incidents/timeline_events_form.vue';
+import createTimelineEventMutation from '~/issues/show/components/incidents/graphql/queries/create_timeline_event.mutation.graphql';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { createAlert } from '~/flash';
+import { useFakeDate } from 'helpers/fake_date';
+import { timelineEventsCreateEventResponse, timelineEventsCreateEventError } from './mock_data';
+
+Vue.use(VueApollo);
+
+jest.mock('~/flash');
+
+const addEventResponse = jest.fn().mockResolvedValue(timelineEventsCreateEventResponse);
+
+function createMockApolloProvider(response = addEventResponse) {
+ const requestHandlers = [[createTimelineEventMutation, response]];
+ return createMockApollo(requestHandlers);
+}
+
+describe('Timeline events form', () => {
+ // July 8 2020
+ useFakeDate(2020, 6, 8);
+ let wrapper;
+
+ const mountComponent = ({ mockApollo, mountMethod = shallowMountExtended, stubs }) => {
+ wrapper = mountMethod(IncidentTimelineEventForm, {
+ propsData: {
+ hasTimelineEvents: true,
+ },
+ provide: {
+ fullPath: 'group/project',
+ issuableId: '1',
+ },
+ apolloProvider: mockApollo,
+ stubs,
+ });
+ };
+
+ afterEach(() => {
+ addEventResponse.mockReset();
+ createAlert.mockReset();
+ if (wrapper) {
+ wrapper.destroy();
+ }
+ });
+
+ const findSubmitButton = () => wrapper.findByText('Save');
+ const findSubmitAndAddButton = () => wrapper.findByText('Save and add another event');
+ const findCancelButton = () => wrapper.findByText('Cancel');
+ const findDatePicker = () => wrapper.findComponent(GlDatepicker);
+ const findDatePickerInput = () => wrapper.findByTestId('input-datepicker');
+ const findHourInput = () => wrapper.findByTestId('input-hours');
+ const findMinuteInput = () => wrapper.findByTestId('input-minutes');
+ const setDatetime = () => {
+ findDatePicker().vm.$emit('input', new Date('2021-08-12'));
+ findHourInput().vm.$emit('input', 5);
+ findMinuteInput().vm.$emit('input', 45);
+ };
+
+ const submitForm = async () => {
+ findSubmitButton().trigger('click');
+ await waitForPromises();
+ };
+ const submitFormAndAddAnother = async () => {
+ findSubmitAndAddButton().trigger('click');
+ await waitForPromises();
+ };
+ const cancelForm = async () => {
+ findCancelButton().trigger('click');
+ await waitForPromises();
+ };
+
+ describe('form button behaviour', () => {
+ const closeFormEvent = { 'hide-incident-timeline-event-form': [[]] };
+ beforeEach(() => {
+ mountComponent({ mockApollo: createMockApolloProvider(), mountMethod: mountExtended });
+ });
+
+ it('should close the form on submit', async () => {
+ await submitForm();
+ expect(wrapper.emitted()).toEqual(closeFormEvent);
+ });
+
+ it('should not close the form on "submit and add another"', async () => {
+ await submitFormAndAddAnother();
+ expect(wrapper.emitted()).toEqual({});
+ });
+
+ it('should close the form on cancel', async () => {
+ await cancelForm();
+ expect(wrapper.emitted()).toEqual(closeFormEvent);
+ });
+
+ it('should clear the form', async () => {
+ setDatetime();
+ await nextTick();
+
+ expect(findDatePickerInput().element.value).toBe('2021-08-12');
+ expect(findHourInput().element.value).toBe('5');
+ expect(findMinuteInput().element.value).toBe('45');
+
+ wrapper.vm.clear();
+ await nextTick();
+
+ expect(findDatePickerInput().element.value).toBe('2020-07-08');
+ expect(findHourInput().element.value).toBe('0');
+ expect(findMinuteInput().element.value).toBe('0');
+ });
+ });
+
+ describe('addTimelineEventQuery', () => {
+ const expectedData = {
+ input: {
+ incidentId: 'gid://gitlab/Issue/1',
+ note: '',
+ occurredAt: '2020-07-08T00:00:00.000Z',
+ },
+ };
+
+ let mockApollo;
+
+ beforeEach(() => {
+ mockApollo = createMockApolloProvider();
+ mountComponent({ mockApollo, mountMethod: mountExtended });
+ });
+
+ it('should call the mutation with the right variables', async () => {
+ await submitForm();
+
+ expect(addEventResponse).toHaveBeenCalledWith(expectedData);
+ });
+
+ it('should call the mutation with user selected variables', async () => {
+ const expectedUserSelectedData = {
+ input: {
+ ...expectedData.input,
+ occurredAt: '2021-08-12T05:45:00.000Z',
+ },
+ };
+
+ setDatetime();
+
+ await nextTick();
+ await submitForm();
+
+ expect(addEventResponse).toHaveBeenCalledWith(expectedUserSelectedData);
+ });
+ });
+
+ describe('error handling', () => {
+ it('should show an error when submission returns an error', async () => {
+ const expectedAlertArgs = {
+ message: 'Error creating incident timeline event: Create error',
+ };
+ addEventResponse.mockResolvedValueOnce(timelineEventsCreateEventError);
+ mountComponent({ mockApollo: createMockApolloProvider(), mountMethod: mountExtended });
+
+ await submitForm();
+
+ expect(createAlert).toHaveBeenCalledWith(expectedAlertArgs);
+ });
+
+ it('should show an error when submission fails', async () => {
+ const expectedAlertArgs = {
+ captureError: true,
+ error: new Error(),
+ message: 'Something went wrong while creating the incident timeline event.',
+ };
+ addEventResponse.mockRejectedValueOnce();
+ mountComponent({ mockApollo: createMockApolloProvider(), mountMethod: mountExtended });
+
+ await submitForm();
+
+ expect(createAlert).toHaveBeenCalledWith(expectedAlertArgs);
+ });
+ });
+});
diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_list_item_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_list_item_spec.js
index 7e51219ffa7..e686f2eb4ec 100644
--- a/spec/frontend/issues/show/components/incidents/timeline_events_list_item_spec.js
+++ b/spec/frontend/issues/show/components/incidents/timeline_events_list_item_spec.js
@@ -1,6 +1,6 @@
import timezoneMock from 'timezone-mock';
-import merge from 'lodash/merge';
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlDropdown } from '@gitlab/ui';
+import { nextTick } from 'vue';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import IncidentTimelineEventListItem from '~/issues/show/components/incidents/timeline_events_list_item.vue';
import { mockEvents } from './mock_data';
@@ -8,25 +8,28 @@ import { mockEvents } from './mock_data';
describe('IncidentTimelineEventList', () => {
let wrapper;
- const mountComponent = (propsData) => {
+ const mountComponent = ({ propsData, provide } = {}) => {
const { action, noteHtml, occurredAt } = mockEvents[0];
- wrapper = mountExtended(
- IncidentTimelineEventListItem,
- merge({
- propsData: {
- action,
- noteHtml,
- occurredAt,
- isLastItem: false,
- ...propsData,
- },
- }),
- );
+ wrapper = mountExtended(IncidentTimelineEventListItem, {
+ propsData: {
+ action,
+ noteHtml,
+ occurredAt,
+ isLastItem: false,
+ ...propsData,
+ },
+ provide: {
+ canUpdate: false,
+ ...provide,
+ },
+ });
};
const findCommentIcon = () => wrapper.findComponent(GlIcon);
const findTextContainer = () => wrapper.findByTestId('event-text-container');
const findEventTime = () => wrapper.findByTestId('event-time');
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDeleteButton = () => wrapper.findByText('Delete');
describe('template', () => {
it('shows comment icon', () => {
@@ -55,7 +58,7 @@ describe('IncidentTimelineEventList', () => {
});
it('does not show a bottom border when the last item', () => {
- mountComponent({ isLastItem: true });
+ mountComponent({ propsData: { isLastItem: true } });
expect(wrapper.classes()).not.toContain('gl-border-1');
});
@@ -83,5 +86,31 @@ describe('IncidentTimelineEventList', () => {
});
});
});
+
+ describe('action dropdown', () => {
+ it('does not show the action dropdown by default', () => {
+ mountComponent();
+
+ expect(findDropdown().exists()).toBe(false);
+ expect(findDeleteButton().exists()).toBe(false);
+ });
+
+ it('shows dropdown and delete item when user has update permission', () => {
+ mountComponent({ provide: { canUpdate: true } });
+
+ expect(findDropdown().exists()).toBe(true);
+ expect(findDeleteButton().exists()).toBe(true);
+ });
+
+ it('triggers a delete when the delete button is clicked', async () => {
+ mountComponent({ provide: { canUpdate: true } });
+
+ findDeleteButton().trigger('click');
+
+ await nextTick();
+
+ expect(wrapper.emitted().delete).toBeTruthy();
+ });
+ });
});
});
diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_list_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_list_spec.js
index 6610ea0b832..ae07237cf7d 100644
--- a/spec/frontend/issues/show/components/incidents/timeline_events_list_spec.js
+++ b/spec/frontend/issues/show/components/incidents/timeline_events_list_spec.js
@@ -1,41 +1,81 @@
import timezoneMock from 'timezone-mock';
-import merge from 'lodash/merge';
-import { shallowMountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper';
+import VueApollo from 'vue-apollo';
+import Vue from 'vue';
+import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import IncidentTimelineEventList from '~/issues/show/components/incidents/timeline_events_list.vue';
-import { mockEvents } from './mock_data';
+import IncidentTimelineEventListItem from '~/issues/show/components/incidents/timeline_events_list_item.vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import deleteTimelineEventMutation from '~/issues/show/components/incidents/graphql/queries/delete_timeline_event.mutation.graphql';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { createAlert } from '~/flash';
+import {
+ mockEvents,
+ timelineEventsDeleteEventResponse,
+ timelineEventsDeleteEventError,
+} from './mock_data';
+
+Vue.use(VueApollo);
+
+jest.mock('~/flash');
+jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal');
+
+const deleteEventResponse = jest.fn();
+
+function createMockApolloProvider() {
+ deleteEventResponse.mockResolvedValue(timelineEventsDeleteEventResponse);
+ const requestHandlers = [[deleteTimelineEventMutation, deleteEventResponse]];
+ return createMockApollo(requestHandlers);
+}
+
+const mockConfirmAction = ({ confirmed }) => {
+ confirmAction.mockResolvedValueOnce(confirmed);
+};
describe('IncidentTimelineEventList', () => {
let wrapper;
- const mountComponent = () => {
- wrapper = shallowMountExtended(
- IncidentTimelineEventList,
- merge({
- provide: {
- fullPath: 'group/project',
- issuableId: '1',
- },
- propsData: {
- timelineEvents: mockEvents,
- },
- }),
- );
+ const mountComponent = (mockApollo) => {
+ const apollo = mockApollo ? { apolloProvider: mockApollo } : {};
+
+ wrapper = shallowMountExtended(IncidentTimelineEventList, {
+ provide: {
+ fullPath: 'group/project',
+ issuableId: '1',
+ },
+ propsData: {
+ timelineEvents: mockEvents,
+ },
+ ...apollo,
+ });
};
- const findGroups = () => wrapper.findAllByTestId('timeline-group');
- const findItems = (base = wrapper) => base.findAllByTestId('timeline-event');
- const findFirstGroup = () => extendedWrapper(findGroups().at(0));
- const findSecondGroup = () => extendedWrapper(findGroups().at(1));
+ const findTimelineEventGroups = () => wrapper.findAllByTestId('timeline-group');
+ const findItems = (base = wrapper) => base.findAll(IncidentTimelineEventListItem);
+ const findFirstTimelineEventGroup = () => findTimelineEventGroups().at(0);
+ const findSecondTimelineEventGroup = () => findTimelineEventGroups().at(1);
const findDates = () => wrapper.findAllByTestId('event-date');
+ const clickFirstDeleteButton = async () => {
+ findItems()
+ .at(0)
+ .vm.$emit('delete', { ...mockEvents[0] });
+ await waitForPromises();
+ };
+
+ afterEach(() => {
+ confirmAction.mockReset();
+ deleteEventResponse.mockReset();
+ wrapper.destroy();
+ });
describe('template', () => {
it('groups items correctly', () => {
mountComponent();
- expect(findGroups()).toHaveLength(2);
+ expect(findTimelineEventGroups()).toHaveLength(2);
- expect(findItems(findFirstGroup())).toHaveLength(1);
- expect(findItems(findSecondGroup())).toHaveLength(2);
+ expect(findItems(findFirstTimelineEventGroup())).toHaveLength(1);
+ expect(findItems(findSecondTimelineEventGroup())).toHaveLength(2);
});
it('sets the isLastItem prop correctly', () => {
@@ -83,5 +123,48 @@ describe('IncidentTimelineEventList', () => {
});
});
});
+
+ describe('delete functionality', () => {
+ beforeEach(() => {
+ mockConfirmAction({ confirmed: true });
+ });
+
+ it('should delete when button is clicked', async () => {
+ const expectedVars = { input: { id: mockEvents[0].id } };
+
+ mountComponent(createMockApolloProvider());
+
+ await clickFirstDeleteButton();
+
+ expect(deleteEventResponse).toHaveBeenCalledWith(expectedVars);
+ });
+
+ it('should show an error when delete returns an error', async () => {
+ const expectedError = {
+ message: 'Error deleting incident timeline event: Item does not exist',
+ };
+
+ mountComponent(createMockApolloProvider());
+ deleteEventResponse.mockResolvedValue(timelineEventsDeleteEventError);
+
+ await clickFirstDeleteButton();
+
+ expect(createAlert).toHaveBeenCalledWith(expectedError);
+ });
+
+ it('should show an error when delete fails', async () => {
+ const expectedAlertArgs = {
+ captureError: true,
+ error: new Error(),
+ message: 'Something went wrong while deleting the incident timeline event.',
+ };
+ mountComponent(createMockApolloProvider());
+ deleteEventResponse.mockRejectedValueOnce();
+
+ await clickFirstDeleteButton();
+
+ expect(createAlert).toHaveBeenCalledWith(expectedAlertArgs);
+ });
+ });
});
});
diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js
index cf81f4cdf66..2d87851a761 100644
--- a/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js
+++ b/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js
@@ -1,13 +1,15 @@
-import { GlEmptyState, GlLoadingIcon } from '@gitlab/ui';
+import { GlLoadingIcon, GlEmptyState } from '@gitlab/ui';
import VueApollo from 'vue-apollo';
import Vue from 'vue';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import TimelineEventsTab from '~/issues/show/components/incidents/timeline_events_tab.vue';
import IncidentTimelineEventsList from '~/issues/show/components/incidents/timeline_events_list.vue';
+import IncidentTimelineEventForm from '~/issues/show/components/incidents/timeline_events_form.vue';
import timelineEventsQuery from '~/issues/show/components/incidents/graphql/queries/get_timeline_events.query.graphql';
import createMockApollo from 'helpers/mock_apollo_helper';
import { createAlert } from '~/flash';
+import { timelineTabI18n } from '~/issues/show/components/incidents/constants';
import { timelineEventsQueryListResponse, timelineEventsQueryEmptyResponse } from './mock_data';
Vue.use(VueApollo);
@@ -28,14 +30,17 @@ describe('TimelineEventsTab', () => {
let wrapper;
const mountComponent = (options = {}) => {
- const { mockApollo, mountMethod = shallowMountExtended } = options;
+ const { mockApollo, mountMethod = shallowMountExtended, stubs, provide } = options;
wrapper = mountMethod(TimelineEventsTab, {
provide: {
fullPath: 'group/project',
issuableId: '1',
+ canUpdate: true,
+ ...provide,
},
apolloProvider: mockApollo,
+ stubs,
});
};
@@ -48,6 +53,8 @@ describe('TimelineEventsTab', () => {
const findLoadingSpinner = () => wrapper.findComponent(GlLoadingIcon);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
const findTimelineEventsList = () => wrapper.findComponent(IncidentTimelineEventsList);
+ const findTimelineEventForm = () => wrapper.findComponent(IncidentTimelineEventForm);
+ const findAddEventButton = () => wrapper.findByText(timelineTabI18n.addEventButton);
describe('Timeline events tab', () => {
describe('empty state', () => {
@@ -82,24 +89,85 @@ describe('TimelineEventsTab', () => {
describe('timelineEventsQuery', () => {
let mockApollo;
- beforeEach(() => {
+ const setup = () => {
mockApollo = createMockApolloProvider();
mountComponent({ mockApollo });
- });
+ };
it('should request data', () => {
+ setup();
+
expect(listResponse).toHaveBeenCalled();
});
it('should show the loading state', () => {
+ setup();
+
expect(findEmptyState().exists()).toBe(false);
expect(findLoadingSpinner().exists()).toBe(true);
});
it('should render the list', async () => {
+ setup();
await waitForPromises();
+
expect(findEmptyState().exists()).toBe(false);
expect(findTimelineEventsList().props('timelineEvents')).toHaveLength(3);
});
});
+
+ describe('add new event form', () => {
+ beforeEach(async () => {
+ mountComponent({
+ mockApollo: createMockApolloProvider(emptyResponse),
+ mountMethod: mountExtended,
+ stubs: {
+ 'incident-timeline-events-list': true,
+ 'gl-tab': true,
+ },
+ });
+ await waitForPromises();
+ });
+
+ it('should show a button when user can update', () => {
+ expect(findAddEventButton().exists()).toBe(true);
+ });
+
+ it('should not show a button when user cannot update', () => {
+ mountComponent({
+ mockApollo: createMockApolloProvider(emptyResponse),
+ provide: { canUpdate: false },
+ });
+
+ expect(findAddEventButton().exists()).toBe(false);
+ });
+
+ it('should not show a form by default', () => {
+ expect(findTimelineEventForm().isVisible()).toBe(false);
+ });
+
+ it('should show a form when button is clicked', async () => {
+ await findAddEventButton().trigger('click');
+
+ expect(findTimelineEventForm().isVisible()).toBe(true);
+ });
+
+ it('should clear the form when button is clicked', async () => {
+ const mockClear = jest.fn();
+ wrapper.vm.$refs.eventForm.clear = mockClear;
+
+ await findAddEventButton().trigger('click');
+
+ expect(mockClear).toHaveBeenCalled();
+ });
+
+ it('should hide the form when the hide event is emitted', async () => {
+ // open the form
+ await findAddEventButton().trigger('click');
+
+ await findTimelineEventForm().vm.$emit('hide-incident-timeline-event-form');
+
+ expect(findTimelineEventForm().isVisible()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/issues/show/components/incidents/utils_spec.js b/spec/frontend/issues/show/components/incidents/utils_spec.js
index e6f7082d280..0da0114c654 100644
--- a/spec/frontend/issues/show/components/incidents/utils_spec.js
+++ b/spec/frontend/issues/show/components/incidents/utils_spec.js
@@ -1,4 +1,9 @@
-import { displayAndLogError, getEventIcon } from '~/issues/show/components/incidents/utils';
+import timezoneMock from 'timezone-mock';
+import {
+ displayAndLogError,
+ getEventIcon,
+ getUtcShiftedDateNow,
+} from '~/issues/show/components/incidents/utils';
import { createAlert } from '~/flash';
jest.mock('~/flash');
@@ -19,13 +24,31 @@ describe('incident utils', () => {
describe('get event icon', () => {
it('should display a matching event icon name', () => {
- const name = 'comment';
-
- expect(getEventIcon(name)).toBe(name);
+ ['comment', 'issues', 'status'].forEach((name) => {
+ expect(getEventIcon(name)).toBe(name);
+ });
});
it('should return a default icon name', () => {
expect(getEventIcon('non-existent-icon-name')).toBe('comment');
});
});
+
+ describe('getUtcShiftedDateNow', () => {
+ beforeEach(() => {
+ timezoneMock.register('US/Pacific');
+ });
+
+ afterEach(() => {
+ timezoneMock.unregister();
+ });
+
+ it('should shift the date by the timezone offset', () => {
+ const date = new Date();
+
+ const shiftedDate = getUtcShiftedDateNow();
+
+ expect(shiftedDate > date).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/jobs/bridge/app_spec.js b/spec/frontend/jobs/bridge/app_spec.js
deleted file mode 100644
index 210dcfa364b..00000000000
--- a/spec/frontend/jobs/bridge/app_spec.js
+++ /dev/null
@@ -1,146 +0,0 @@
-import Vue, { nextTick } from 'vue';
-import { shallowMount } from '@vue/test-utils';
-
-import { GlBreakpointInstance } from '@gitlab/ui/dist/utils';
-import { GlLoadingIcon } from '@gitlab/ui';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import getPipelineQuery from '~/jobs/bridge/graphql/queries/pipeline.query.graphql';
-import waitForPromises from 'helpers/wait_for_promises';
-import BridgeApp from '~/jobs/bridge/app.vue';
-import BridgeEmptyState from '~/jobs/bridge/components/empty_state.vue';
-import BridgeSidebar from '~/jobs/bridge/components/sidebar.vue';
-import CiHeader from '~/vue_shared/components/header_ci_component.vue';
-import {
- MOCK_BUILD_ID,
- MOCK_PIPELINE_IID,
- MOCK_PROJECT_FULL_PATH,
- mockPipelineQueryResponse,
-} from './mock_data';
-
-describe('Bridge Show Page', () => {
- let wrapper;
- let mockApollo;
- let mockPipelineQuery;
-
- const createComponent = (options) => {
- wrapper = shallowMount(BridgeApp, {
- provide: {
- buildId: MOCK_BUILD_ID,
- projectFullPath: MOCK_PROJECT_FULL_PATH,
- pipelineIid: MOCK_PIPELINE_IID,
- },
- mocks: {
- $apollo: {
- queries: {
- pipeline: {
- loading: true,
- },
- },
- },
- },
- ...options,
- });
- };
-
- const createComponentWithApollo = () => {
- const handlers = [[getPipelineQuery, mockPipelineQuery]];
- Vue.use(VueApollo);
- mockApollo = createMockApollo(handlers);
-
- createComponent({
- apolloProvider: mockApollo,
- mocks: {},
- });
- };
-
- const findCiHeader = () => wrapper.findComponent(CiHeader);
- const findEmptyState = () => wrapper.findComponent(BridgeEmptyState);
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findSidebar = () => wrapper.findComponent(BridgeSidebar);
-
- beforeEach(() => {
- mockPipelineQuery = jest.fn();
- });
-
- afterEach(() => {
- mockPipelineQuery.mockReset();
- wrapper.destroy();
- });
-
- describe('while pipeline query is loading', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders loading icon', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- });
- });
-
- describe('after pipeline query is loaded', () => {
- beforeEach(async () => {
- mockPipelineQuery.mockResolvedValue(mockPipelineQueryResponse);
- createComponentWithApollo();
- await waitForPromises();
- });
-
- it('query is called with correct variables', async () => {
- expect(mockPipelineQuery).toHaveBeenCalledTimes(1);
- expect(mockPipelineQuery).toHaveBeenCalledWith({
- fullPath: MOCK_PROJECT_FULL_PATH,
- iid: MOCK_PIPELINE_IID,
- });
- });
-
- it('renders CI header state', () => {
- expect(findCiHeader().exists()).toBe(true);
- });
-
- it('renders empty state', () => {
- expect(findEmptyState().exists()).toBe(true);
- });
-
- it('renders sidebar', () => {
- expect(findSidebar().exists()).toBe(true);
- });
- });
-
- describe('sidebar expansion', () => {
- beforeEach(async () => {
- mockPipelineQuery.mockResolvedValue(mockPipelineQueryResponse);
- createComponentWithApollo();
- await waitForPromises();
- });
-
- describe('on resize', () => {
- it.each`
- breakpoint | isSidebarExpanded
- ${'xs'} | ${false}
- ${'sm'} | ${false}
- ${'md'} | ${true}
- ${'lg'} | ${true}
- ${'xl'} | ${true}
- `(
- 'sets isSidebarExpanded to `$isSidebarExpanded` when the breakpoint is "$breakpoint"',
- async ({ breakpoint, isSidebarExpanded }) => {
- jest.spyOn(GlBreakpointInstance, 'getBreakpointSize').mockReturnValue(breakpoint);
-
- window.dispatchEvent(new Event('resize'));
- await nextTick();
-
- expect(findSidebar().exists()).toBe(isSidebarExpanded);
- },
- );
- });
-
- it('toggles expansion on button click', async () => {
- expect(findSidebar().exists()).toBe(true);
-
- wrapper.vm.toggleSidebar();
- await nextTick();
-
- expect(findSidebar().exists()).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/jobs/bridge/components/empty_state_spec.js b/spec/frontend/jobs/bridge/components/empty_state_spec.js
deleted file mode 100644
index 38c55b296f0..00000000000
--- a/spec/frontend/jobs/bridge/components/empty_state_spec.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import BridgeEmptyState from '~/jobs/bridge/components/empty_state.vue';
-import { MOCK_EMPTY_ILLUSTRATION_PATH, MOCK_PATH_TO_DOWNSTREAM } from '../mock_data';
-
-describe('Bridge Empty State', () => {
- let wrapper;
-
- const createComponent = ({ downstreamPipelinePath }) => {
- wrapper = shallowMount(BridgeEmptyState, {
- provide: {
- emptyStateIllustrationPath: MOCK_EMPTY_ILLUSTRATION_PATH,
- },
- propsData: {
- downstreamPipelinePath,
- },
- });
- };
-
- const findSvg = () => wrapper.find('img');
- const findTitle = () => wrapper.find('h1');
- const findLinkBtn = () => wrapper.findComponent(GlButton);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('template', () => {
- beforeEach(() => {
- createComponent({ downstreamPipelinePath: MOCK_PATH_TO_DOWNSTREAM });
- });
-
- it('renders illustration', () => {
- expect(findSvg().exists()).toBe(true);
- });
-
- it('renders title', () => {
- expect(findTitle().exists()).toBe(true);
- expect(findTitle().text()).toBe(wrapper.vm.$options.i18n.title);
- });
-
- it('renders CTA button', () => {
- expect(findLinkBtn().exists()).toBe(true);
- expect(findLinkBtn().text()).toBe(wrapper.vm.$options.i18n.linkBtnText);
- expect(findLinkBtn().attributes('href')).toBe(MOCK_PATH_TO_DOWNSTREAM);
- });
- });
-
- describe('without downstream pipeline', () => {
- beforeEach(() => {
- createComponent({ downstreamPipelinePath: undefined });
- });
-
- it('does not render CTA button', () => {
- expect(findLinkBtn().exists()).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/jobs/bridge/components/sidebar_spec.js b/spec/frontend/jobs/bridge/components/sidebar_spec.js
deleted file mode 100644
index 5006d4f08a6..00000000000
--- a/spec/frontend/jobs/bridge/components/sidebar_spec.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import { GlButton, GlDropdown } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import BridgeSidebar from '~/jobs/bridge/components/sidebar.vue';
-import CommitBlock from '~/jobs/components/commit_block.vue';
-import { mockCommit, mockJob } from '../mock_data';
-
-describe('Bridge Sidebar', () => {
- let wrapper;
-
- const MockHeaderEl = {
- getBoundingClientRect() {
- return {
- bottom: '40',
- };
- },
- };
-
- const createComponent = ({ featureFlag } = {}) => {
- wrapper = shallowMount(BridgeSidebar, {
- provide: {
- glFeatures: {
- triggerJobRetryAction: featureFlag,
- },
- },
- propsData: {
- bridgeJob: mockJob,
- commit: mockCommit,
- },
- });
- };
-
- const findJobTitle = () => wrapper.find('h4');
- const findCommitBlock = () => wrapper.findComponent(CommitBlock);
- const findRetryDropdown = () => wrapper.find(GlDropdown);
- const findToggleBtn = () => wrapper.findComponent(GlButton);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('template', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders job name', () => {
- expect(findJobTitle().text()).toBe(mockJob.name);
- });
-
- it('renders commit information', () => {
- expect(findCommitBlock().exists()).toBe(true);
- });
- });
-
- describe('styles', () => {
- beforeEach(async () => {
- jest.spyOn(document, 'querySelector').mockReturnValue(MockHeaderEl);
- createComponent();
- });
-
- it('calculates root styles correctly', () => {
- expect(wrapper.attributes('style')).toBe('width: 290px; top: 40px;');
- });
- });
-
- describe('sidebar expansion', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('emits toggle sidebar event on button click', async () => {
- expect(wrapper.emitted('toggleSidebar')).toBe(undefined);
-
- findToggleBtn().vm.$emit('click');
-
- expect(wrapper.emitted('toggleSidebar')).toHaveLength(1);
- });
- });
-
- describe('retry action', () => {
- describe('when feature flag is ON', () => {
- beforeEach(() => {
- createComponent({ featureFlag: true });
- });
-
- it('renders retry dropdown', () => {
- expect(findRetryDropdown().exists()).toBe(true);
- });
- });
-
- describe('when feature flag is OFF', () => {
- it('does not render retry dropdown', () => {
- createComponent({ featureFlag: false });
-
- expect(findRetryDropdown().exists()).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/jobs/bridge/mock_data.js b/spec/frontend/jobs/bridge/mock_data.js
deleted file mode 100644
index 4084bb54163..00000000000
--- a/spec/frontend/jobs/bridge/mock_data.js
+++ /dev/null
@@ -1,102 +0,0 @@
-export const MOCK_EMPTY_ILLUSTRATION_PATH = '/path/to/svg';
-export const MOCK_PATH_TO_DOWNSTREAM = '/path/to/downstream/pipeline';
-export const MOCK_BUILD_ID = '1331';
-export const MOCK_PIPELINE_IID = '174';
-export const MOCK_PROJECT_FULL_PATH = '/root/project/';
-export const MOCK_SHA = '38f3d89147765427a7ce58be28cd76d14efa682a';
-
-export const mockCommit = {
- id: `gid://gitlab/CommitPresenter/${MOCK_SHA}`,
- shortId: '38f3d891',
- title: 'Update .gitlab-ci.yml file',
- webPath: `/root/project/-/commit/${MOCK_SHA}`,
- __typename: 'Commit',
-};
-
-export const mockJob = {
- createdAt: '2021-12-10T09:05:45Z',
- id: 'gid://gitlab/Ci::Build/1331',
- name: 'triggerJobName',
- scheduledAt: null,
- startedAt: '2021-12-10T09:13:43Z',
- status: 'SUCCESS',
- triggered: null,
- detailedStatus: {
- id: '1',
- detailsPath: '/root/project/-/jobs/1331',
- icon: 'status_success',
- group: 'success',
- text: 'passed',
- tooltip: 'passed',
- __typename: 'DetailedStatus',
- },
- downstreamPipeline: {
- id: '1',
- path: '/root/project/-/pipelines/175',
- },
- stage: {
- id: '1',
- name: 'build',
- __typename: 'CiStage',
- },
- __typename: 'CiJob',
-};
-
-export const mockUser = {
- id: 'gid://gitlab/User/1',
- avatarUrl: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- name: 'Administrator',
- username: 'root',
- webPath: '/root',
- webUrl: 'http://gdk.test:3000/root',
- status: {
- message: 'making great things',
- __typename: 'UserStatus',
- },
- __typename: 'UserCore',
-};
-
-export const mockStage = {
- id: '1',
- name: 'build',
- jobs: {
- nodes: [mockJob],
- __typename: 'CiJobConnection',
- },
- __typename: 'CiStage',
-};
-
-export const mockPipelineQueryResponse = {
- data: {
- project: {
- id: '1',
- pipeline: {
- commit: mockCommit,
- id: 'gid://gitlab/Ci::Pipeline/174',
- iid: '88',
- path: '/root/project/-/pipelines/174',
- sha: MOCK_SHA,
- ref: 'main',
- refPath: 'path/to/ref',
- user: mockUser,
- detailedStatus: {
- id: '1',
- icon: 'status_failed',
- group: 'failed',
- __typename: 'DetailedStatus',
- },
- stages: {
- edges: [
- {
- node: mockStage,
- __typename: 'CiStageEdge',
- },
- ],
- __typename: 'CiStageConnection',
- },
- __typename: 'Pipeline',
- },
- __typename: 'Project',
- },
- },
-};
diff --git a/spec/frontend/jobs/components/job_app_spec.js b/spec/frontend/jobs/components/job_app_spec.js
index fc308766ab9..b4b5bc4669d 100644
--- a/spec/frontend/jobs/components/job_app_spec.js
+++ b/spec/frontend/jobs/components/job_app_spec.js
@@ -22,7 +22,6 @@ describe('Job App', () => {
let store;
let wrapper;
let mock;
- let origGon;
const initSettings = {
endpoint: `${TEST_HOST}jobs/123.json`,
@@ -80,17 +79,11 @@ 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/job_log_controllers_spec.js b/spec/frontend/jobs/components/job_log_controllers_spec.js
index cd3ee734466..cc97d111c06 100644
--- a/spec/frontend/jobs/components/job_log_controllers_spec.js
+++ b/spec/frontend/jobs/components/job_log_controllers_spec.js
@@ -1,6 +1,11 @@
+import { GlSearchBoxByClick } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import JobLogControllers from '~/jobs/components/job_log_controllers.vue';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
+import { mockJobLog } from '../mock_data';
+
+const mockToastShow = jest.fn();
describe('Job log controllers', () => {
let wrapper;
@@ -19,14 +24,30 @@ describe('Job log controllers', () => {
isScrollBottomDisabled: false,
isScrollingDown: true,
isJobLogSizeVisible: true,
+ jobLog: mockJobLog,
};
- const createWrapper = (props) => {
+ const createWrapper = (props, jobLogSearch = false) => {
wrapper = mount(JobLogControllers, {
propsData: {
...defaultProps,
...props,
},
+ provide: {
+ glFeatures: {
+ jobLogSearch,
+ },
+ },
+ data() {
+ return {
+ searchTerm: '82',
+ };
+ },
+ mocks: {
+ $toast: {
+ show: mockToastShow,
+ },
+ },
});
};
@@ -35,6 +56,8 @@ describe('Job log controllers', () => {
const findRawLinkController = () => wrapper.find('[data-testid="job-raw-link-controller"]');
const findScrollTop = () => wrapper.find('[data-testid="job-controller-scroll-top"]');
const findScrollBottom = () => wrapper.find('[data-testid="job-controller-scroll-bottom"]');
+ const findJobLogSearch = () => wrapper.findComponent(GlSearchBoxByClick);
+ const findSearchHelp = () => wrapper.findComponent(HelpPopover);
describe('Truncate information', () => {
describe('with isJobLogSizeVisible', () => {
@@ -179,4 +202,40 @@ describe('Job log controllers', () => {
});
});
});
+
+ describe('Job log search', () => {
+ describe('with feature flag off', () => {
+ it('does not display job log search', () => {
+ createWrapper();
+
+ expect(findJobLogSearch().exists()).toBe(false);
+ expect(findSearchHelp().exists()).toBe(false);
+ });
+ });
+
+ describe('with feature flag on', () => {
+ beforeEach(() => {
+ createWrapper({}, { jobLogSearch: true });
+ });
+
+ it('displays job log search', () => {
+ expect(findJobLogSearch().exists()).toBe(true);
+ expect(findSearchHelp().exists()).toBe(true);
+ });
+
+ it('emits search results', () => {
+ const expectedSearchResults = [[[mockJobLog[6].lines[1], mockJobLog[6].lines[2]]]];
+
+ findJobLogSearch().vm.$emit('submit');
+
+ expect(wrapper.emitted('searchResults')).toEqual(expectedSearchResults);
+ });
+
+ it('clears search results', () => {
+ findJobLogSearch().vm.$emit('clear');
+
+ expect(wrapper.emitted('searchResults')).toEqual([[[]]]);
+ });
+ });
+ });
});
diff --git a/spec/frontend/jobs/components/job_sidebar_details_container_spec.js b/spec/frontend/jobs/components/job_sidebar_details_container_spec.js
index cc9a5e4ee25..4046f0269dd 100644
--- a/spec/frontend/jobs/components/job_sidebar_details_container_spec.js
+++ b/spec/frontend/jobs/components/job_sidebar_details_container_spec.js
@@ -42,7 +42,7 @@ describe('Job Sidebar Details Container', () => {
expect(wrapper.html()).toBe('');
});
- it.each(['duration', 'erased_at', 'finished_at', 'queued', 'runner', 'coverage'])(
+ it.each(['duration', 'erased_at', 'finished_at', 'queued_at', 'runner', 'coverage'])(
'should not render %s details when missing',
async (detail) => {
await store.dispatch('receiveJobSuccess', { [detail]: undefined });
@@ -59,7 +59,7 @@ describe('Job Sidebar Details Container', () => {
['duration', 'Elapsed time: 6 seconds'],
['erased_at', 'Erased: 3 weeks ago'],
['finished_at', 'Finished: 3 weeks ago'],
- ['queued', 'Queued: 9 seconds'],
+ ['queued_duration', 'Queued: 9 seconds'],
['runner', 'Runner: #1 (ABCDEFGH) local ci runner'],
['coverage', 'Coverage: 20%'],
])('uses %s to render job-%s', async (detail, value) => {
diff --git a/spec/frontend/jobs/components/jobs_container_spec.js b/spec/frontend/jobs/components/jobs_container_spec.js
index 1cde72682a2..127570b8184 100644
--- a/spec/frontend/jobs/components/jobs_container_spec.js
+++ b/spec/frontend/jobs/components/jobs_container_spec.js
@@ -106,7 +106,7 @@ describe('Jobs List block', () => {
});
expect(findJob().text()).toBe(job.name);
- expect(findJob().text()).not.toContain(job.id);
+ expect(findJob().text()).not.toContain(job.id.toString());
});
it('renders job id when job name is not available', () => {
diff --git a/spec/frontend/jobs/components/log/collapsible_section_spec.js b/spec/frontend/jobs/components/log/collapsible_section_spec.js
index 2ab7f5fe22d..646935568b1 100644
--- a/spec/frontend/jobs/components/log/collapsible_section_spec.js
+++ b/spec/frontend/jobs/components/log/collapsible_section_spec.js
@@ -5,7 +5,6 @@ import { collapsibleSectionClosed, collapsibleSectionOpened } from './mock_data'
describe('Job Log Collapsible Section', () => {
let wrapper;
- let origGon;
const jobLogEndpoint = 'jobs/335';
@@ -20,16 +19,8 @@ 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 d184696cd1f..bf80d90e299 100644
--- a/spec/frontend/jobs/components/log/line_spec.js
+++ b/spec/frontend/jobs/components/log/line_spec.js
@@ -179,4 +179,46 @@ describe('Job Log Line', () => {
expect(findLink().exists()).toBe(false);
});
});
+
+ describe('job log search', () => {
+ const mockSearchResults = [
+ {
+ offset: 1533,
+ content: [{ text: '$ echo "82.71"', style: 'term-fg-l-green term-bold' }],
+ section: 'step-script',
+ lineNumber: 20,
+ },
+ { offset: 1560, content: [{ text: '82.71' }], section: 'step-script', lineNumber: 21 },
+ ];
+
+ it('applies highlight class to search result elements', () => {
+ createComponent({
+ line: {
+ offset: 1560,
+ content: [{ text: '82.71' }],
+ section: 'step-script',
+ lineNumber: 21,
+ },
+ path: '/root/ci-project/-/jobs/1089',
+ searchResults: mockSearchResults,
+ });
+
+ expect(wrapper.classes()).toContain('gl-bg-gray-500');
+ });
+
+ it('does not apply highlight class to search result elements', () => {
+ createComponent({
+ line: {
+ offset: 1560,
+ content: [{ text: 'docker' }],
+ section: 'step-script',
+ lineNumber: 29,
+ },
+ path: '/root/ci-project/-/jobs/1089',
+ searchResults: mockSearchResults,
+ });
+
+ expect(wrapper.classes()).not.toContain('gl-bg-gray-500');
+ });
+ });
});
diff --git a/spec/frontend/jobs/components/log/log_spec.js b/spec/frontend/jobs/components/log/log_spec.js
index 9cc56cce9b3..c933ed5c3e1 100644
--- a/spec/frontend/jobs/components/log/log_spec.js
+++ b/spec/frontend/jobs/components/log/log_spec.js
@@ -2,7 +2,7 @@ import { mount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import Log from '~/jobs/components/log/log.vue';
-import { logLinesParserLegacy, logLinesParser } from '~/jobs/store/utils';
+import { logLinesParser } from '~/jobs/store/utils';
import { jobLog } from './mock_data';
describe('Job Log', () => {
@@ -10,7 +10,6 @@ describe('Job Log', () => {
let actions;
let state;
let store;
- let origGon;
Vue.use(Vuex);
@@ -25,12 +24,8 @@ describe('Job Log', () => {
toggleCollapsibleLine: () => {},
};
- origGon = window.gon;
-
- window.gon = { features: { infinitelyCollapsibleSections: false } };
-
state = {
- jobLog: logLinesParserLegacy(jobLog),
+ jobLog: logLinesParser(jobLog),
jobLogEndpoint: 'jobs/id',
};
@@ -44,88 +39,6 @@ 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.jobLogEndpoint}#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="chevron-lg-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;
-
- Vue.use(Vuex);
-
- const createComponent = () => {
- wrapper = mount(Log, {
- store,
- });
- };
-
- beforeEach(() => {
- actions = {
- toggleCollapsibleLine: () => {},
- };
-
- origGon = window.gon;
-
- window.gon = { features: { infinitelyCollapsibleSections: true } };
-
- state = {
- jobLog: logLinesParser(jobLog).parsedLines,
- jobLogEndpoint: '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 3ff0bd73581..eb8c4fe8bc9 100644
--- a/spec/frontend/jobs/components/log/mock_data.js
+++ b/spec/frontend/jobs/components/log/mock_data.js
@@ -58,80 +58,6 @@ 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 backwardsCompatibilityTrace = [
- {
- offset: 2365,
- content: [],
- section: 'download-artifacts',
- section_duration: '00:01',
- },
-];
-
export const originalTrace = [
{
offset: 1,
diff --git a/spec/frontend/jobs/components/table/cells/actions_cell_spec.js b/spec/frontend/jobs/components/table/cells/actions_cell_spec.js
index 976b128532d..7cc008f332d 100644
--- a/spec/frontend/jobs/components/table/cells/actions_cell_spec.js
+++ b/spec/frontend/jobs/components/table/cells/actions_cell_spec.js
@@ -12,17 +12,12 @@ import JobRetryMutation from '~/jobs/components/table/graphql/mutations/job_retr
import JobUnscheduleMutation from '~/jobs/components/table/graphql/mutations/job_unschedule.mutation.graphql';
import JobCancelMutation from '~/jobs/components/table/graphql/mutations/job_cancel.mutation.graphql';
import {
- playableJob,
- retryableJob,
- cancelableJob,
- scheduledJob,
- cannotRetryJob,
- cannotPlayJob,
- cannotPlayScheduledJob,
- retryMutationResponse,
+ mockJobsNodes,
+ mockJobsNodesAsGuest,
playMutationResponse,
- cancelMutationResponse,
+ retryMutationResponse,
unscheduleMutationResponse,
+ cancelMutationResponse,
} from '../../../mock_data';
jest.mock('~/lib/utils/url_utility');
@@ -32,6 +27,22 @@ Vue.use(VueApollo);
describe('Job actions cell', () => {
let wrapper;
+ const findMockJob = (jobName, nodes = mockJobsNodes) => {
+ const job = nodes.find(({ name }) => name === jobName);
+ expect(job).toBeDefined(); // ensure job is present
+ return job;
+ };
+
+ const mockJob = findMockJob('build');
+ const cancelableJob = findMockJob('cancelable');
+ const playableJob = findMockJob('playable');
+ const retryableJob = findMockJob('retryable');
+ const scheduledJob = findMockJob('scheduled');
+ const jobWithArtifact = findMockJob('with_artifact');
+ const cannotPlayJob = findMockJob('playable', mockJobsNodesAsGuest);
+ const cannotRetryJob = findMockJob('retryable', mockJobsNodesAsGuest);
+ const cannotPlayScheduledJob = findMockJob('scheduled', mockJobsNodesAsGuest);
+
const findRetryButton = () => wrapper.findByTestId('retry');
const findPlayButton = () => wrapper.findByTestId('play');
const findCancelButton = () => wrapper.findByTestId('cancel-button');
@@ -55,10 +66,10 @@ describe('Job actions cell', () => {
return createMockApollo(requestHandlers);
};
- const createComponent = (jobType, requestHandlers, props = {}) => {
+ const createComponent = (job, requestHandlers, props = {}) => {
wrapper = shallowMountExtended(ActionsCell, {
propsData: {
- job: jobType,
+ job,
...props,
},
apolloProvider: createMockApolloProvider(requestHandlers),
@@ -73,15 +84,15 @@ describe('Job actions cell', () => {
});
it('displays the artifacts download button with correct link', () => {
- createComponent(playableJob);
+ createComponent(jobWithArtifact);
expect(findDownloadArtifactsButton().attributes('href')).toBe(
- playableJob.artifacts.nodes[0].downloadPath,
+ jobWithArtifact.artifacts.nodes[0].downloadPath,
);
});
it('does not display an artifacts download button', () => {
- createComponent(retryableJob);
+ createComponent(mockJob);
expect(findDownloadArtifactsButton().exists()).toBe(false);
});
@@ -101,7 +112,7 @@ describe('Job actions cell', () => {
button | action | jobType
${findPlayButton} | ${'play'} | ${playableJob}
${findRetryButton} | ${'retry'} | ${retryableJob}
- ${findDownloadArtifactsButton} | ${'download artifacts'} | ${playableJob}
+ ${findDownloadArtifactsButton} | ${'download artifacts'} | ${jobWithArtifact}
${findCancelButton} | ${'cancel'} | ${cancelableJob}
`('displays the $action button', ({ button, jobType }) => {
createComponent(jobType);
diff --git a/spec/frontend/jobs/components/table/cells/job_cell_spec.js b/spec/frontend/jobs/components/table/cells/job_cell_spec.js
index fc4e5586349..ddc196129a7 100644
--- a/spec/frontend/jobs/components/table/cells/job_cell_spec.js
+++ b/spec/frontend/jobs/components/table/cells/job_cell_spec.js
@@ -2,16 +2,22 @@ import { shallowMount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import JobCell from '~/jobs/components/table/cells/job_cell.vue';
-import { mockJobsInTable } from '../../../mock_data';
-
-const mockJob = mockJobsInTable[0];
-const mockJobCreatedByTag = mockJobsInTable[1];
-const mockJobLimitedAccess = mockJobsInTable[2];
-const mockStuckJob = mockJobsInTable[3];
+import { mockJobsNodes, mockJobsNodesAsGuest } from '../../../mock_data';
describe('Job Cell', () => {
let wrapper;
+ const findMockJob = (jobName, nodes = mockJobsNodes) => {
+ const job = nodes.find(({ name }) => name === jobName);
+ expect(job).toBeDefined(); // ensure job is present
+ return job;
+ };
+
+ const mockJob = findMockJob('build');
+ const jobCreatedByTag = findMockJob('created_by_tag');
+ const pendingJob = findMockJob('pending');
+ const jobAsGuest = findMockJob('build', mockJobsNodesAsGuest);
+
const findJobIdLink = () => wrapper.findByTestId('job-id-link');
const findJobIdNoLink = () => wrapper.findByTestId('job-id-limited-access');
const findJobRef = () => wrapper.findByTestId('job-ref');
@@ -23,11 +29,11 @@ describe('Job Cell', () => {
const findBadgeById = (id) => wrapper.findByTestId(id);
- const createComponent = (jobData = mockJob) => {
+ const createComponent = (job = mockJob) => {
wrapper = extendedWrapper(
shallowMount(JobCell, {
propsData: {
- job: jobData,
+ job,
},
}),
);
@@ -49,9 +55,9 @@ describe('Job Cell', () => {
});
it('display the job id with no link', () => {
- createComponent(mockJobLimitedAccess);
+ createComponent(jobAsGuest);
- const expectedJobId = `#${getIdFromGraphQLId(mockJobLimitedAccess.id)}`;
+ const expectedJobId = `#${getIdFromGraphQLId(jobAsGuest.id)}`;
expect(findJobIdNoLink().text()).toBe(expectedJobId);
expect(findJobIdNoLink().exists()).toBe(true);
@@ -75,7 +81,7 @@ describe('Job Cell', () => {
});
it('displays label icon when job is created by a tag', () => {
- createComponent(mockJobCreatedByTag);
+ createComponent(jobCreatedByTag);
expect(findLabelIcon().exists()).toBe(true);
expect(findForkIcon().exists()).toBe(false);
@@ -130,8 +136,8 @@ describe('Job Cell', () => {
expect(findStuckIcon().exists()).toBe(false);
});
- it('stuck icon is shown if job is stuck', () => {
- createComponent(mockStuckJob);
+ it('stuck icon is shown if job is pending', () => {
+ createComponent(pendingJob);
expect(findStuckIcon().exists()).toBe(true);
expect(findStuckIcon().attributes('name')).toBe('warning');
diff --git a/spec/frontend/jobs/components/table/job_table_app_spec.js b/spec/frontend/jobs/components/table/job_table_app_spec.js
index 986fba21fb9..374768c3ee4 100644
--- a/spec/frontend/jobs/components/table/job_table_app_spec.js
+++ b/spec/frontend/jobs/components/table/job_table_app_spec.js
@@ -6,7 +6,7 @@ import {
GlLoadingIcon,
} from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
+import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import { s__ } from '~/locale';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -18,8 +18,8 @@ import JobsTableApp from '~/jobs/components/table/jobs_table_app.vue';
import JobsTableTabs from '~/jobs/components/table/jobs_table_tabs.vue';
import JobsFilteredSearch from '~/jobs/components/filtered_search/jobs_filtered_search.vue';
import {
- mockJobsQueryResponse,
- mockJobsQueryEmptyResponse,
+ mockJobsResponsePaginated,
+ mockJobsResponseEmpty,
mockFailedSearchToken,
} from '../../mock_data';
@@ -30,11 +30,10 @@ jest.mock('~/flash');
describe('Job table app', () => {
let wrapper;
- let jobsTableVueSearch = true;
- const successHandler = jest.fn().mockResolvedValue(mockJobsQueryResponse);
+ const successHandler = jest.fn().mockResolvedValue(mockJobsResponsePaginated);
const failedHandler = jest.fn().mockRejectedValue(new Error('GraphQL error'));
- const emptyHandler = jest.fn().mockResolvedValue(mockJobsQueryEmptyResponse);
+ const emptyHandler = jest.fn().mockResolvedValue(mockJobsResponseEmpty);
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findLoadingSpinner = () => wrapper.findComponent(GlLoadingIcon);
@@ -66,7 +65,6 @@ describe('Job table app', () => {
},
provide: {
fullPath: projectPath,
- glFeatures: { jobsTableVueSearch },
},
apolloProvider: createMockApolloProvider(handler),
});
@@ -77,17 +75,17 @@ describe('Job table app', () => {
});
describe('loading state', () => {
- beforeEach(() => {
+ it('should display skeleton loader when loading', () => {
createComponent();
- });
- it('should display skeleton loader when loading', () => {
expect(findSkeletonLoader().exists()).toBe(true);
expect(findTable().exists()).toBe(false);
expect(findLoadingSpinner().exists()).toBe(false);
});
it('when switching tabs only the skeleton loader should show', () => {
+ createComponent();
+
findTabs().vm.$emit('fetchJobsByStatus', null);
expect(findSkeletonLoader().exists()).toBe(true);
@@ -119,24 +117,29 @@ describe('Job table app', () => {
});
describe('when infinite scrolling is triggered', () => {
- beforeEach(() => {
+ it('does not display a skeleton loader', () => {
triggerInfiniteScroll();
- });
- it('does not display a skeleton loader', () => {
expect(findSkeletonLoader().exists()).toBe(false);
});
it('handles infinite scrolling by calling fetch more', async () => {
+ triggerInfiniteScroll();
+
+ await nextTick();
+
+ const pageSize = 30;
+
expect(findLoadingSpinner().exists()).toBe(true);
await waitForPromises();
expect(findLoadingSpinner().exists()).toBe(false);
- expect(successHandler).toHaveBeenCalledWith({
- after: 'eyJpZCI6IjIzMTcifQ',
- fullPath: 'gitlab-org/gitlab',
+ expect(successHandler).toHaveBeenLastCalledWith({
+ first: pageSize,
+ fullPath: projectPath,
+ after: mockJobsResponsePaginated.data.project.jobs.pageInfo.endCursor,
});
});
});
@@ -227,13 +230,5 @@ describe('Job table app', () => {
expect(createFlash).toHaveBeenCalledWith(expectedWarning);
expect(wrapper.vm.$apollo.queries.jobs.refetch).toHaveBeenCalledTimes(0);
});
-
- it('should not display filtered search', () => {
- jobsTableVueSearch = false;
-
- createComponent();
-
- expect(findFilteredSearch().exists()).toBe(false);
- });
});
});
diff --git a/spec/frontend/jobs/components/table/jobs_table_spec.js b/spec/frontend/jobs/components/table/jobs_table_spec.js
index ac8bef675f8..803df3df37f 100644
--- a/spec/frontend/jobs/components/table/jobs_table_spec.js
+++ b/spec/frontend/jobs/components/table/jobs_table_spec.js
@@ -3,7 +3,7 @@ import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import JobsTable from '~/jobs/components/table/jobs_table.vue';
import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
-import { mockJobsInTable } from '../../mock_data';
+import { mockJobsNodes } from '../../mock_data';
describe('Jobs Table', () => {
let wrapper;
@@ -19,7 +19,7 @@ describe('Jobs Table', () => {
wrapper = extendedWrapper(
mount(JobsTable, {
propsData: {
- jobs: mockJobsInTable,
+ jobs: mockJobsNodes,
...props,
},
}),
@@ -39,7 +39,7 @@ describe('Jobs Table', () => {
});
it('displays correct number of job rows', () => {
- expect(findTableRows()).toHaveLength(mockJobsInTable.length);
+ expect(findTableRows()).toHaveLength(mockJobsNodes.length);
});
it('displays job status', () => {
@@ -47,14 +47,14 @@ describe('Jobs Table', () => {
});
it('displays the job stage and name', () => {
- const firstJob = mockJobsInTable[0];
+ const firstJob = mockJobsNodes[0];
expect(findJobStage().text()).toBe(firstJob.stage.name);
expect(findJobName().text()).toBe(firstJob.name);
});
it('displays the coverage for only jobs that have coverage', () => {
- const jobsThatHaveCoverage = mockJobsInTable.filter((job) => job.coverage !== null);
+ const jobsThatHaveCoverage = mockJobsNodes.filter((job) => job.coverage !== null);
jobsThatHaveCoverage.forEach((job, index) => {
expect(findAllCoverageJobs().at(index).text()).toBe(`${job.coverage}%`);
diff --git a/spec/frontend/jobs/mock_data.js b/spec/frontend/jobs/mock_data.js
index 4676635cce0..bf238b2e39a 100644
--- a/spec/frontend/jobs/mock_data.js
+++ b/spec/frontend/jobs/mock_data.js
@@ -1,8 +1,18 @@
+import mockJobsEmpty from 'test_fixtures/graphql/jobs/get_jobs.query.graphql.empty.json';
+import mockJobsPaginated from 'test_fixtures/graphql/jobs/get_jobs.query.graphql.paginated.json';
+import mockJobs from 'test_fixtures/graphql/jobs/get_jobs.query.graphql.json';
+import mockJobsAsGuest from 'test_fixtures/graphql/jobs/get_jobs.query.graphql.as_guest.json';
import { TEST_HOST } from 'spec/test_constants';
const threeWeeksAgo = new Date();
threeWeeksAgo.setDate(threeWeeksAgo.getDate() - 21);
+// Fixtures generated at spec/frontend/fixtures/jobs.rb
+export const mockJobsResponsePaginated = mockJobsPaginated;
+export const mockJobsResponseEmpty = mockJobsEmpty;
+export const mockJobsNodes = mockJobs.data.project.jobs.nodes;
+export const mockJobsNodesAsGuest = mockJobsAsGuest.data.project.jobs.nodes;
+
export const stages = [
{
name: 'build',
@@ -924,7 +934,7 @@ export default {
created_at: threeWeeksAgo.toISOString(),
updated_at: threeWeeksAgo.toISOString(),
finished_at: threeWeeksAgo.toISOString(),
- queued: 9.54,
+ queued_duration: 9.54,
status: {
icon: 'status_success',
text: 'passed',
@@ -1283,602 +1293,6 @@ export const mockPipelineDetached = {
},
};
-export const mockJobsInTable = [
- {
- detailedStatus: {
- icon: 'status_manual',
- label: 'manual play action',
- text: 'manual',
- tooltip: 'manual action',
- action: {
- buttonTitle: 'Trigger this manual action',
- icon: 'play',
- method: 'post',
- path: '/root/ci-project/-/jobs/2004/play',
- title: 'Play',
- __typename: 'StatusAction',
- },
- detailsPath: '/root/ci-project/-/jobs/2004',
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/2004',
- refName: 'main',
- refPath: '/root/ci-project/-/commits/main',
- tags: [],
- shortSha: '2d5d8323',
- commitPath: '/root/ci-project/-/commit/2d5d83230bdea0e003d83ef4c16d2bf9a8808ebe',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/423',
- path: '/root/ci-project/-/pipelines/423',
- user: {
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'User',
- },
- __typename: 'Pipeline',
- },
- stage: { name: 'test', __typename: 'CiStage' },
- name: 'test_manual_job',
- duration: null,
- finishedAt: null,
- coverage: null,
- createdByTag: false,
- retryable: false,
- playable: true,
- cancelable: false,
- active: false,
- stuck: false,
- userPermissions: { readBuild: true, __typename: 'JobPermissions' },
- __typename: 'CiJob',
- },
- {
- detailedStatus: {
- icon: 'status_skipped',
- label: 'skipped',
- text: 'skipped',
- tooltip: 'skipped',
- action: null,
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/2021',
- refName: 'main',
- refPath: '/root/ci-project/-/commits/main',
- tags: [],
- shortSha: '2d5d8323',
- commitPath: '/root/ci-project/-/commit/2d5d83230bdea0e003d83ef4c16d2bf9a8808ebe',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/425',
- path: '/root/ci-project/-/pipelines/425',
- user: {
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'User',
- },
- __typename: 'Pipeline',
- },
- stage: { name: 'test', __typename: 'CiStage' },
- name: 'coverage_job',
- duration: null,
- finishedAt: null,
- coverage: null,
- createdByTag: true,
- retryable: false,
- playable: false,
- cancelable: false,
- active: false,
- stuck: false,
- userPermissions: { readBuild: true, __typename: 'JobPermissions' },
- __typename: 'CiJob',
- },
- {
- detailedStatus: {
- icon: 'status_success',
- label: 'passed',
- text: 'passed',
- tooltip: 'passed',
- action: {
- buttonTitle: 'Retry this job',
- icon: 'retry',
- method: 'post',
- path: '/root/ci-project/-/jobs/2015/retry',
- title: 'Retry',
- __typename: 'StatusAction',
- },
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/2015',
- refName: 'main',
- refPath: '/root/ci-project/-/commits/main',
- tags: [],
- shortSha: '2d5d8323',
- commitPath: '/root/ci-project/-/commit/2d5d83230bdea0e003d83ef4c16d2bf9a8808ebe',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/424',
- path: '/root/ci-project/-/pipelines/424',
- user: {
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'User',
- },
- __typename: 'Pipeline',
- },
- stage: { name: 'deploy', __typename: 'CiStage' },
- name: 'artifact_job',
- duration: 2,
- finishedAt: '2021-04-01T17:36:18Z',
- coverage: 82.71,
- createdByTag: false,
- retryable: true,
- playable: false,
- cancelable: false,
- active: false,
- stuck: false,
- userPermissions: { readBuild: false, __typename: 'JobPermissions' },
- __typename: 'CiJob',
- },
- {
- artifacts: { nodes: [], __typename: 'CiJobArtifactConnection' },
- allowFailure: false,
- status: 'PENDING',
- scheduledAt: null,
- manualJob: false,
- triggered: null,
- createdByTag: false,
- detailedStatus: {
- detailsPath: '/root/ci-project/-/jobs/2391',
- group: 'pending',
- icon: 'status_pending',
- label: 'pending',
- text: 'pending',
- tooltip: 'pending',
- action: {
- buttonTitle: 'Cancel this job',
- icon: 'cancel',
- method: 'post',
- path: '/root/ci-project/-/jobs/2391/cancel',
- title: 'Cancel',
- __typename: 'StatusAction',
- },
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/2391',
- refName: 'master',
- refPath: '/root/ci-project/-/commits/master',
- tags: [],
- shortSha: '916330b4',
- commitPath: '/root/ci-project/-/commit/916330b4fda5dae226524ceb51c756c0ed26679d',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/482',
- path: '/root/ci-project/-/pipelines/482',
- user: {
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'UserCore',
- },
- __typename: 'Pipeline',
- },
- stage: { name: 'build', __typename: 'CiStage' },
- name: 'build_job',
- duration: null,
- finishedAt: null,
- coverage: null,
- retryable: false,
- playable: false,
- cancelable: true,
- active: true,
- stuck: true,
- userPermissions: { readBuild: true, __typename: 'JobPermissions' },
- __typename: 'CiJob',
- },
-];
-
-export const mockJobsQueryResponse = {
- data: {
- project: {
- id: '1',
- jobs: {
- count: 1,
- pageInfo: {
- endCursor: 'eyJpZCI6IjIzMTcifQ',
- hasNextPage: true,
- hasPreviousPage: false,
- startCursor: 'eyJpZCI6IjIzMzYifQ',
- __typename: 'PageInfo',
- },
- nodes: [
- {
- artifacts: {
- nodes: [
- {
- downloadPath: '/root/ci-project/-/jobs/2336/artifacts/download?file_type=trace',
- fileType: 'TRACE',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath:
- '/root/ci-project/-/jobs/2336/artifacts/download?file_type=metadata',
- fileType: 'METADATA',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath: '/root/ci-project/-/jobs/2336/artifacts/download?file_type=archive',
- fileType: 'ARCHIVE',
- __typename: 'CiJobArtifact',
- },
- ],
- __typename: 'CiJobArtifactConnection',
- },
- allowFailure: false,
- status: 'SUCCESS',
- scheduledAt: null,
- manualJob: false,
- triggered: null,
- createdByTag: false,
- detailedStatus: {
- id: 'status-1',
- detailsPath: '/root/ci-project/-/jobs/2336',
- group: 'success',
- icon: 'status_success',
- label: 'passed',
- text: 'passed',
- tooltip: 'passed',
- action: {
- id: 'action-1',
- buttonTitle: 'Retry this job',
- icon: 'retry',
- method: 'post',
- path: '/root/ci-project/-/jobs/2336/retry',
- title: 'Retry',
- __typename: 'StatusAction',
- },
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/2336',
- refName: 'main',
- refPath: '/root/ci-project/-/commits/main',
- tags: [],
- shortSha: '4408fa2a',
- commitPath: '/root/ci-project/-/commit/4408fa2a27aaadfdf42d8dda3d6a9c01ce6cad78',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/473',
- path: '/root/ci-project/-/pipelines/473',
- user: {
- id: 'user-1',
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'UserCore',
- },
- __typename: 'Pipeline',
- },
- stage: {
- id: 'stage-1',
- name: 'deploy',
- __typename: 'CiStage',
- },
- name: 'artifact_job',
- duration: 3,
- finishedAt: '2021-04-29T14:19:50Z',
- coverage: null,
- retryable: true,
- playable: false,
- cancelable: false,
- active: false,
- stuck: false,
- userPermissions: {
- readBuild: true,
- readJobArtifacts: true,
- updateBuild: true,
- __typename: 'JobPermissions',
- },
- __typename: 'CiJob',
- },
- ],
- __typename: 'CiJobConnection',
- },
- __typename: 'Project',
- },
- },
-};
-
-export const mockJobsQueryEmptyResponse = {
- data: {
- project: {
- id: '1',
- jobs: [],
- },
- },
-};
-
-export const retryableJob = {
- artifacts: {
- nodes: [
- {
- downloadPath: '/root/ci-project/-/jobs/847/artifacts/download?file_type=trace',
- fileType: 'TRACE',
- __typename: 'CiJobArtifact',
- },
- ],
- __typename: 'CiJobArtifactConnection',
- },
- allowFailure: false,
- status: 'SUCCESS',
- scheduledAt: null,
- manualJob: false,
- triggered: null,
- createdByTag: false,
- detailedStatus: {
- detailsPath: '/root/test-job-artifacts/-/jobs/1981',
- group: 'success',
- icon: 'status_success',
- label: 'passed',
- text: 'passed',
- tooltip: 'passed',
- action: {
- buttonTitle: 'Retry this job',
- icon: 'retry',
- method: 'post',
- path: '/root/test-job-artifacts/-/jobs/1981/retry',
- title: 'Retry',
- __typename: 'StatusAction',
- },
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/1981',
- refName: 'main',
- refPath: '/root/test-job-artifacts/-/commits/main',
- tags: [],
- shortSha: '75daf01b',
- commitPath: '/root/test-job-artifacts/-/commit/75daf01b465e7eab5a04a315e44660c9a17c8055',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/288',
- path: '/root/test-job-artifacts/-/pipelines/288',
- user: {
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'UserCore',
- },
- __typename: 'Pipeline',
- },
- stage: { name: 'test', __typename: 'CiStage' },
- name: 'hello_world',
- duration: 7,
- finishedAt: '2021-08-30T20:33:56Z',
- coverage: null,
- retryable: true,
- playable: false,
- cancelable: false,
- active: false,
- stuck: false,
- userPermissions: { readBuild: true, updateBuild: true, __typename: 'JobPermissions' },
- __typename: 'CiJob',
-};
-
-export const cancelableJob = {
- artifacts: {
- nodes: [],
- __typename: 'CiJobArtifactConnection',
- },
- allowFailure: false,
- status: 'PENDING',
- scheduledAt: null,
- manualJob: false,
- triggered: null,
- createdByTag: false,
- detailedStatus: {
- id: 'pending-1305-1305',
- detailsPath: '/root/lots-of-jobs-project/-/jobs/1305',
- group: 'pending',
- icon: 'status_pending',
- label: 'pending',
- text: 'pending',
- tooltip: 'pending',
- action: {
- id: 'Ci::Build-pending-1305',
- buttonTitle: 'Cancel this job',
- icon: 'cancel',
- method: 'post',
- path: '/root/lots-of-jobs-project/-/jobs/1305/cancel',
- title: 'Cancel',
- __typename: 'StatusAction',
- },
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/1305',
- refName: 'main',
- refPath: '/root/lots-of-jobs-project/-/commits/main',
- tags: [],
- shortSha: '750605f2',
- commitPath: '/root/lots-of-jobs-project/-/commit/750605f29530778cf0912779eba6d073128962a5',
- stage: {
- id: 'gid://gitlab/Ci::Stage/181',
- name: 'deploy',
- __typename: 'CiStage',
- },
- name: 'job_212',
- duration: null,
- finishedAt: null,
- coverage: null,
- retryable: false,
- playable: false,
- cancelable: true,
- active: true,
- stuck: false,
- userPermissions: {
- readBuild: true,
- readJobArtifacts: true,
- updateBuild: true,
- __typename: 'JobPermissions',
- },
- __typename: 'CiJob',
-};
-
-export const cannotRetryJob = {
- ...retryableJob,
- userPermissions: { readBuild: true, updateBuild: false, __typename: 'JobPermissions' },
-};
-
-export const playableJob = {
- artifacts: {
- nodes: [
- {
- downloadPath: '/root/ci-project/-/jobs/621/artifacts/download?file_type=archive',
- fileType: 'ARCHIVE',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath: '/root/ci-project/-/jobs/621/artifacts/download?file_type=metadata',
- fileType: 'METADATA',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath: '/root/ci-project/-/jobs/621/artifacts/download?file_type=trace',
- fileType: 'TRACE',
- __typename: 'CiJobArtifact',
- },
- ],
- __typename: 'CiJobArtifactConnection',
- },
- allowFailure: false,
- status: 'SUCCESS',
- scheduledAt: null,
- manualJob: true,
- triggered: null,
- createdByTag: false,
- detailedStatus: {
- detailsPath: '/root/test-job-artifacts/-/jobs/1982',
- group: 'success',
- icon: 'status_success',
- label: 'manual play action',
- text: 'passed',
- tooltip: 'passed',
- action: {
- buttonTitle: 'Trigger this manual action',
- icon: 'play',
- method: 'post',
- path: '/root/test-job-artifacts/-/jobs/1982/play',
- title: 'Play',
- __typename: 'StatusAction',
- },
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/1982',
- refName: 'main',
- refPath: '/root/test-job-artifacts/-/commits/main',
- tags: [],
- shortSha: '75daf01b',
- commitPath: '/root/test-job-artifacts/-/commit/75daf01b465e7eab5a04a315e44660c9a17c8055',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/288',
- path: '/root/test-job-artifacts/-/pipelines/288',
- user: {
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'UserCore',
- },
- __typename: 'Pipeline',
- },
- stage: { name: 'test', __typename: 'CiStage' },
- name: 'hello_world_delayed',
- duration: 6,
- finishedAt: '2021-08-30T20:36:12Z',
- coverage: null,
- retryable: true,
- playable: true,
- cancelable: false,
- active: false,
- stuck: false,
- userPermissions: {
- readBuild: true,
- readJobArtifacts: true,
- updateBuild: true,
- __typename: 'JobPermissions',
- },
- __typename: 'CiJob',
-};
-
-export const cannotPlayJob = {
- ...playableJob,
- userPermissions: {
- readBuild: true,
- readJobArtifacts: true,
- updateBuild: false,
- __typename: 'JobPermissions',
- },
-};
-
-export const scheduledJob = {
- artifacts: { nodes: [], __typename: 'CiJobArtifactConnection' },
- allowFailure: false,
- status: 'SCHEDULED',
- scheduledAt: '2021-08-31T22:36:05Z',
- manualJob: true,
- triggered: null,
- createdByTag: false,
- detailedStatus: {
- detailsPath: '/root/test-job-artifacts/-/jobs/1986',
- group: 'scheduled',
- icon: 'status_scheduled',
- label: 'unschedule action',
- text: 'delayed',
- tooltip: 'delayed manual action (%{remainingTime})',
- action: {
- buttonTitle: 'Unschedule job',
- icon: 'time-out',
- method: 'post',
- path: '/root/test-job-artifacts/-/jobs/1986/unschedule',
- title: 'Unschedule',
- __typename: 'StatusAction',
- },
- __typename: 'DetailedStatus',
- },
- id: 'gid://gitlab/Ci::Build/1986',
- refName: 'main',
- refPath: '/root/test-job-artifacts/-/commits/main',
- tags: [],
- shortSha: '75daf01b',
- commitPath: '/root/test-job-artifacts/-/commit/75daf01b465e7eab5a04a315e44660c9a17c8055',
- pipeline: {
- id: 'gid://gitlab/Ci::Pipeline/290',
- path: '/root/test-job-artifacts/-/pipelines/290',
- user: {
- webPath: '/root',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- __typename: 'UserCore',
- },
- __typename: 'Pipeline',
- },
- stage: { name: 'test', __typename: 'CiStage' },
- name: 'hello_world_delayed',
- duration: null,
- finishedAt: null,
- coverage: null,
- retryable: false,
- playable: true,
- cancelable: false,
- active: false,
- stuck: false,
- userPermissions: { readBuild: true, updateBuild: true, __typename: 'JobPermissions' },
- __typename: 'CiJob',
-};
-
-export const cannotPlayScheduledJob = {
- ...scheduledJob,
- userPermissions: {
- readBuild: true,
- readJobArtifacts: true,
- updateBuild: false,
- __typename: 'JobPermissions',
- },
-};
-
export const CIJobConnectionIncomingCache = {
__typename: 'CiJobConnection',
pageInfo: {
@@ -2000,3 +1414,167 @@ export const unscheduleMutationResponse = {
},
},
};
+
+export const mockJobLog = [
+ { offset: 0, content: [{ text: 'Running with gitlab-runner 15.0.0 (febb2a09)' }], lineNumber: 0 },
+ { offset: 54, content: [{ text: ' on colima-docker EwM9WzgD' }], lineNumber: 1 },
+ {
+ isClosed: false,
+ isHeader: true,
+ line: {
+ offset: 91,
+ content: [{ text: 'Resolving secrets', style: 'term-fg-l-cyan term-bold' }],
+ section: 'resolve-secrets',
+ section_header: true,
+ lineNumber: 2,
+ section_duration: '00:00',
+ },
+ lines: [],
+ },
+ {
+ isClosed: false,
+ isHeader: true,
+ line: {
+ offset: 218,
+ content: [{ text: 'Preparing the "docker" executor', style: 'term-fg-l-cyan term-bold' }],
+ section: 'prepare-executor',
+ section_header: true,
+ lineNumber: 4,
+ section_duration: '00:01',
+ },
+ lines: [
+ {
+ offset: 317,
+ content: [{ text: 'Using Docker executor with image ruby:2.7 ...' }],
+ section: 'prepare-executor',
+ lineNumber: 5,
+ },
+ {
+ offset: 372,
+ content: [{ text: 'Pulling docker image ruby:2.7 ...' }],
+ section: 'prepare-executor',
+ lineNumber: 6,
+ },
+ {
+ offset: 415,
+ content: [
+ {
+ text:
+ 'Using docker image sha256:55106bf6ba7f452c38d01ea760affc6ceb67d4b60068ffadab98d1b7b007668c for ruby:2.7 with digest ruby@sha256:23d08a4bae1a12ee3fce017f83204fcf9a02243443e4a516e65e5ff73810a449 ...',
+ },
+ ],
+ section: 'prepare-executor',
+ lineNumber: 7,
+ },
+ ],
+ },
+ {
+ isClosed: false,
+ isHeader: true,
+ line: {
+ offset: 665,
+ content: [{ text: 'Preparing environment', style: 'term-fg-l-cyan term-bold' }],
+ section: 'prepare-script',
+ section_header: true,
+ lineNumber: 9,
+ section_duration: '00:01',
+ },
+ lines: [
+ {
+ offset: 752,
+ content: [
+ { text: 'Running on runner-ewm9wzgd-project-20-concurrent-0 via 8ea689ec6969...' },
+ ],
+ section: 'prepare-script',
+ lineNumber: 10,
+ },
+ ],
+ },
+ {
+ isClosed: false,
+ isHeader: true,
+ line: {
+ offset: 865,
+ content: [{ text: 'Getting source from Git repository', style: 'term-fg-l-cyan term-bold' }],
+ section: 'get-sources',
+ section_header: true,
+ lineNumber: 12,
+ section_duration: '00:01',
+ },
+ lines: [
+ {
+ offset: 962,
+ content: [
+ {
+ text: 'Fetching changes with git depth set to 20...',
+ style: 'term-fg-l-green term-bold',
+ },
+ ],
+ section: 'get-sources',
+ lineNumber: 13,
+ },
+ {
+ offset: 1019,
+ content: [
+ { text: 'Reinitialized existing Git repository in /builds/root/ci-project/.git/' },
+ ],
+ section: 'get-sources',
+ lineNumber: 14,
+ },
+ {
+ offset: 1090,
+ content: [{ text: 'Checking out e0f63d76 as main...', style: 'term-fg-l-green term-bold' }],
+ section: 'get-sources',
+ lineNumber: 15,
+ },
+ {
+ offset: 1136,
+ content: [{ text: 'Skipping Git submodules setup', style: 'term-fg-l-green term-bold' }],
+ section: 'get-sources',
+ lineNumber: 16,
+ },
+ ],
+ },
+ {
+ isClosed: false,
+ isHeader: true,
+ line: {
+ offset: 1217,
+ content: [
+ {
+ text: 'Executing "step_script" stage of the job script',
+ style: 'term-fg-l-cyan term-bold',
+ },
+ ],
+ section: 'step-script',
+ section_header: true,
+ lineNumber: 18,
+ section_duration: '00:00',
+ },
+ lines: [
+ {
+ offset: 1327,
+ content: [
+ {
+ text:
+ 'Using docker image sha256:55106bf6ba7f452c38d01ea760affc6ceb67d4b60068ffadab98d1b7b007668c for ruby:2.7 with digest ruby@sha256:23d08a4bae1a12ee3fce017f83204fcf9a02243443e4a516e65e5ff73810a449 ...',
+ },
+ ],
+ section: 'step-script',
+ lineNumber: 19,
+ },
+ {
+ offset: 1533,
+ content: [{ text: '$ echo "82.71"', style: 'term-fg-l-green term-bold' }],
+ section: 'step-script',
+ lineNumber: 20,
+ },
+ { offset: 1560, content: [{ text: '82.71' }], section: 'step-script', lineNumber: 21 },
+ ],
+ },
+ {
+ offset: 1605,
+ content: [{ text: 'Job succeeded', style: 'term-fg-l-green term-bold' }],
+ lineNumber: 23,
+ },
+];
diff --git a/spec/frontend/jobs/store/mutations_spec.js b/spec/frontend/jobs/store/mutations_spec.js
index b73aa8abf4e..ea1ec383d6e 100644
--- a/spec/frontend/jobs/store/mutations_spec.js
+++ b/spec/frontend/jobs/store/mutations_spec.js
@@ -4,21 +4,12 @@ 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', () => {
@@ -276,88 +267,3 @@ 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_JOB_LOG_SUCCESS', () => {
- describe('with new job log', () => {
- describe('log.lines', () => {
- describe('when append is true', () => {
- it('sets the parsed log ', () => {
- mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
- append: true,
- size: 511846,
- complete: true,
- lines: [
- {
- offset: 1,
- content: [{ text: 'Running with gitlab-runner 11.12.1 (5a147c92)' }],
- },
- ],
- });
-
- expect(stateCopy.jobLog).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_JOB_LOG_SUCCESS](stateCopy, {
- append: false,
- size: 511846,
- complete: true,
- lines: [
- { offset: 0, content: [{ text: 'Running with gitlab-runner 11.11.1 (5a147c92)' }] },
- ],
- });
-
- expect(stateCopy.jobLog).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_JOB_LOG_SUCCESS](stateCopy, {
- append: true,
- html,
- size: 511846,
- complete: false,
- lines: null,
- });
-
- expect(stateCopy.jobLog).toEqual([]);
- });
- });
- });
- });
- });
-});
diff --git a/spec/frontend/jobs/store/utils_spec.js b/spec/frontend/jobs/store/utils_spec.js
index 92ac33c8792..9458c2184f5 100644
--- a/spec/frontend/jobs/store/utils_spec.js
+++ b/spec/frontend/jobs/store/utils_spec.js
@@ -1,6 +1,5 @@
import {
logLinesParser,
- logLinesParserLegacy,
updateIncrementalJobLog,
parseHeaderLine,
parseLine,
@@ -18,8 +17,6 @@ import {
headerTraceIncremental,
collapsibleTrace,
collapsibleTraceIncremental,
- multipleCollapsibleSectionsMockData,
- backwardsCompatibilityTrace,
} from '../components/log/mock_data';
describe('Jobs Store Utils', () => {
@@ -178,11 +175,11 @@ describe('Jobs Store Utils', () => {
expect(isCollapsibleSection()).toEqual(false);
});
});
- describe('logLinesParserLegacy', () => {
+ describe('logLinesParser', () => {
let result;
beforeEach(() => {
- result = logLinesParserLegacy(utilsMockData);
+ result = logLinesParser(utilsMockData);
});
describe('regular line', () => {
@@ -219,102 +216,6 @@ 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('backwards compatibility', () => {
- beforeEach(() => {
- result = logLinesParser(backwardsCompatibilityTrace);
- });
-
- it('should return an object with a parsedLines prop', () => {
- expect(result).toEqual(
- expect.objectContaining({
- parsedLines: expect.any(Array),
- }),
- );
- expect(result.parsedLines).toHaveLength(1);
- });
- });
- });
-
describe('findOffsetAndRemove', () => {
describe('when last item is header', () => {
const existingLog = [
@@ -490,7 +391,7 @@ describe('Jobs Store Utils', () => {
describe('updateIncrementalJobLog', () => {
describe('without repeated section', () => {
it('concats and parses both arrays', () => {
- const oldLog = logLinesParserLegacy(originalTrace);
+ const oldLog = logLinesParser(originalTrace);
const result = updateIncrementalJobLog(regularIncremental, oldLog);
expect(result).toEqual([
@@ -518,7 +419,7 @@ describe('Jobs Store Utils', () => {
describe('with regular line repeated offset', () => {
it('updates the last line and formats with the incremental part', () => {
- const oldLog = logLinesParserLegacy(originalTrace);
+ const oldLog = logLinesParser(originalTrace);
const result = updateIncrementalJobLog(regularIncrementalRepeated, oldLog);
expect(result).toEqual([
@@ -537,7 +438,7 @@ describe('Jobs Store Utils', () => {
describe('with header line repeated', () => {
it('updates the header line and formats with the incremental part', () => {
- const oldLog = logLinesParserLegacy(headerTrace);
+ const oldLog = logLinesParser(headerTrace);
const result = updateIncrementalJobLog(headerTraceIncremental, oldLog);
expect(result).toEqual([
@@ -563,7 +464,7 @@ describe('Jobs Store Utils', () => {
describe('with collapsible line repeated', () => {
it('updates the collapsible line and formats with the incremental part', () => {
- const oldLog = logLinesParserLegacy(collapsibleTrace);
+ const oldLog = logLinesParser(collapsibleTrace);
const result = updateIncrementalJobLog(collapsibleTraceIncremental, oldLog);
expect(result).toEqual([
diff --git a/spec/frontend/lib/dompurify_spec.js b/spec/frontend/lib/dompurify_spec.js
index 34325dad6a1..b585c69e911 100644
--- a/spec/frontend/lib/dompurify_spec.js
+++ b/spec/frontend/lib/dompurify_spec.js
@@ -34,6 +34,17 @@ const unsafeUrls = [
`${absoluteGon.sprite_file_icons}/../../https://evil.url`,
];
+/* eslint-disable no-script-url */
+const invalidProtocolUrls = [
+ 'javascript:alert(1)',
+ 'jAvascript:alert(1)',
+ 'data:text/html,<script>alert(1);</script>',
+ ' javascript:',
+ 'javascript :',
+];
+/* eslint-enable no-script-url */
+const validProtocolUrls = ['slack://open', 'x-devonthink-item://90909', 'x-devonthink-item:90909'];
+
const forbiddenDataAttrs = ['data-remote', 'data-url', 'data-type', 'data-method'];
const acceptedDataAttrs = ['data-random', 'data-custom'];
@@ -150,4 +161,16 @@ describe('~/lib/dompurify', () => {
expect(sanitize(htmlHref)).toBe(`<a ${attrWithValue}>hello</a>`);
});
});
+
+ describe('with non-http links', () => {
+ it.each(validProtocolUrls)('should allow %s', (url) => {
+ const html = `<a href="${url}">internal link</a>`;
+ expect(sanitize(html)).toBe(`<a href="${url}">internal link</a>`);
+ });
+
+ it.each(invalidProtocolUrls)('should not allow %s', (url) => {
+ const html = `<a href="${url}">internal link</a>`;
+ expect(sanitize(html)).toBe(`<a>internal link</a>`);
+ });
+ });
});
diff --git a/spec/frontend/lib/gfm/index_spec.js b/spec/frontend/lib/gfm/index_spec.js
index 7aab0072364..b722315d63a 100644
--- a/spec/frontend/lib/gfm/index_spec.js
+++ b/spec/frontend/lib/gfm/index_spec.js
@@ -1,11 +1,12 @@
import { render } from '~/lib/gfm';
describe('gfm', () => {
- const markdownToAST = async (markdown) => {
+ const markdownToAST = async (markdown, skipRendering = []) => {
let result;
await render({
markdown,
+ skipRendering,
renderer: (tree) => {
result = tree;
},
@@ -58,36 +59,62 @@ describe('gfm', () => {
expect(result).toEqual(rendered);
});
- it('transforms footnotes into footnotedefinition and footnotereference tags', async () => {
- const result = await markdownToAST(
- `footnote reference [^footnote]
+ describe('when skipping the rendering of footnote reference and definition nodes', () => {
+ it('transforms footnotes into footnotedefinition and footnotereference tags', async () => {
+ const result = await markdownToAST(
+ `footnote reference [^footnote]
[^footnote]: Footnote definition`,
- );
+ ['footnoteReference', 'footnoteDefinition'],
+ );
- expectInRoot(
- result,
- expect.objectContaining({
- children: expect.arrayContaining([
- expect.objectContaining({
- type: 'element',
- tagName: 'footnotereference',
- properties: {
- identifier: 'footnote',
- label: 'footnote',
- },
- }),
- ]),
- }),
+ expectInRoot(
+ result,
+ expect.objectContaining({
+ children: expect.arrayContaining([
+ expect.objectContaining({
+ type: 'element',
+ tagName: 'footnotereference',
+ properties: {
+ identifier: 'footnote',
+ label: 'footnote',
+ },
+ }),
+ ]),
+ }),
+ );
+
+ expectInRoot(
+ result,
+ expect.objectContaining({
+ tagName: 'footnotedefinition',
+ properties: {
+ identifier: 'footnote',
+ label: 'footnote',
+ },
+ }),
+ );
+ });
+ });
+ });
+
+ describe('when skipping the rendering of code blocks', () => {
+ it('transforms code nodes into codeblock html tags', async () => {
+ const result = await markdownToAST(
+ `
+\`\`\`javascript
+console.log('Hola');
+\`\`\`\
+ `,
+ ['code'],
);
expectInRoot(
result,
expect.objectContaining({
- tagName: 'footnotedefinition',
+ tagName: 'codeblock',
properties: {
- identifier: 'footnote',
- label: 'footnote',
+ language: 'javascript',
},
}),
);
diff --git a/spec/frontend/lib/utils/common_utils_spec.js b/spec/frontend/lib/utils/common_utils_spec.js
index 8e499844406..7cf101a5e59 100644
--- a/spec/frontend/lib/utils/common_utils_spec.js
+++ b/spec/frontend/lib/utils/common_utils_spec.js
@@ -88,6 +88,28 @@ describe('common_utils', () => {
expectGetElementIdToHaveBeenCalledWith('user-content-definição');
});
+ it(`does not scroll when ${commonUtils.NO_SCROLL_TO_HASH_CLASS} is set on target`, () => {
+ jest.spyOn(window, 'scrollBy');
+
+ document.body.innerHTML += `
+ <div id="parent">
+ <a href="#test">Link</a>
+ <div style="height: 2000px;"></div>
+ <div id="test" style="height: 2000px;" class="${commonUtils.NO_SCROLL_TO_HASH_CLASS}"></div>
+ </div>
+ `;
+
+ window.history.pushState({}, null, '#test');
+ commonUtils.handleLocationHash();
+ jest.runOnlyPendingTimers();
+
+ try {
+ expect(window.scrollBy).not.toHaveBeenCalled();
+ } finally {
+ document.getElementById('parent').remove();
+ }
+ });
+
it('scrolls element into view', () => {
document.body.innerHTML += `
<div id="parent">
diff --git a/spec/frontend/lib/utils/navigation_utility_spec.js b/spec/frontend/lib/utils/navigation_utility_spec.js
index 632a8904578..6d3a871eb33 100644
--- a/spec/frontend/lib/utils/navigation_utility_spec.js
+++ b/spec/frontend/lib/utils/navigation_utility_spec.js
@@ -81,8 +81,6 @@ describe('initPrefetchLinks', () => {
const mouseOverEvent = new Event('mouseover');
beforeEach(() => {
- jest.useFakeTimers();
-
jest.spyOn(global, 'setTimeout');
jest.spyOn(newLink, 'removeEventListener');
});
diff --git a/spec/frontend/lib/utils/rails_ujs_spec.js b/spec/frontend/lib/utils/rails_ujs_spec.js
index 00c29b72e73..c10301523c9 100644
--- a/spec/frontend/lib/utils/rails_ujs_spec.js
+++ b/spec/frontend/lib/utils/rails_ujs_spec.js
@@ -8,7 +8,7 @@ beforeAll(async () => {
// that jQuery isn't available *before* we import @rails/ujs.
delete global.jQuery;
- const { initRails } = await import('~/lib/utils/rails_ujs.js');
+ const { initRails } = await import('~/lib/utils/rails_ujs');
initRails();
});
diff --git a/spec/frontend/lib/utils/text_utility_spec.js b/spec/frontend/lib/utils/text_utility_spec.js
index 9570d2a831c..8e31fc792c5 100644
--- a/spec/frontend/lib/utils/text_utility_spec.js
+++ b/spec/frontend/lib/utils/text_utility_spec.js
@@ -384,4 +384,17 @@ describe('text_utility', () => {
);
});
});
+
+ describe('limitedCounterWithDelimiter', () => {
+ it('returns 1,000+ for count greater than 1000', () => {
+ const expectedOutput = '1,000+';
+
+ expect(textUtils.limitedCounterWithDelimiter(1001)).toBe(expectedOutput);
+ expect(textUtils.limitedCounterWithDelimiter(2300)).toBe(expectedOutput);
+ });
+
+ it('returns exact number for count less than 1000', () => {
+ expect(textUtils.limitedCounterWithDelimiter(120)).toBe(120);
+ });
+ });
});
diff --git a/spec/frontend/logs/components/environment_logs_spec.js b/spec/frontend/logs/components/environment_logs_spec.js
deleted file mode 100644
index 84dc0bdf6cd..00000000000
--- a/spec/frontend/logs/components/environment_logs_spec.js
+++ /dev/null
@@ -1,370 +0,0 @@
-import { GlSprintf, GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import { scrollDown } from '~/lib/utils/scroll_utils';
-import EnvironmentLogs from '~/logs/components/environment_logs.vue';
-
-import { createStore } from '~/logs/stores';
-import {
- mockEnvName,
- mockEnvironments,
- mockPods,
- mockLogsResult,
- mockTrace,
- mockEnvironmentsEndpoint,
- mockDocumentationPath,
-} from '../mock_data';
-
-jest.mock('~/lib/utils/scroll_utils');
-
-const module = 'environmentLogs';
-
-jest.mock('lodash/throttle', () =>
- jest.fn((func) => {
- return func;
- }),
-);
-
-describe('EnvironmentLogs', () => {
- let store;
- let dispatch;
- let wrapper;
- let state;
-
- const propsData = {
- environmentName: mockEnvName,
- environmentsPath: mockEnvironmentsEndpoint,
- clusterApplicationsDocumentationPath: mockDocumentationPath,
- clustersPath: '/gitlab-org',
- };
-
- const updateControlBtnsMock = jest.fn();
- const LogControlButtonsStub = {
- template: '<div/>',
- methods: {
- update: updateControlBtnsMock,
- },
- props: {
- scrollDownButtonDisabled: false,
- },
- };
-
- const findEnvironmentsDropdown = () => wrapper.find('.js-environments-dropdown');
-
- const findSimpleFilters = () => wrapper.find({ ref: 'log-simple-filters' });
- const findAdvancedFilters = () => wrapper.find({ ref: 'log-advanced-filters' });
- const findElasticsearchNotice = () => wrapper.find({ ref: 'elasticsearchNotice' });
- const findLogControlButtons = () => wrapper.find(LogControlButtonsStub);
-
- const findInfiniteScroll = () => wrapper.find({ ref: 'infiniteScroll' });
- const findLogTrace = () => wrapper.find({ ref: 'logTrace' });
- const findLogFooter = () => wrapper.find({ ref: 'logFooter' });
- const getInfiniteScrollAttr = (attr) => parseInt(findInfiniteScroll().attributes(attr), 10);
-
- const mockSetInitData = () => {
- state.pods.options = mockPods;
- state.environments.current = mockEnvName;
- [state.pods.current] = state.pods.options;
-
- state.logs.lines = [];
- };
-
- const mockShowPodLogs = () => {
- state.pods.options = mockPods;
- [state.pods.current] = mockPods;
-
- state.logs.lines = mockLogsResult;
- };
-
- const mockFetchEnvs = () => {
- state.environments.options = mockEnvironments;
- };
-
- const initWrapper = () => {
- wrapper = shallowMount(EnvironmentLogs, {
- propsData,
- store,
- stubs: {
- LogControlButtons: LogControlButtonsStub,
- GlInfiniteScroll: {
- name: 'gl-infinite-scroll',
- template: `
- <div>
- <slot name="header"></slot>
- <slot name="items"></slot>
- <slot></slot>
- </div>
- `,
- },
- GlSprintf,
- },
- });
- };
-
- beforeEach(() => {
- store = createStore();
- state = store.state.environmentLogs;
-
- jest.spyOn(store, 'dispatch').mockResolvedValue();
-
- dispatch = store.dispatch;
- });
-
- afterEach(() => {
- store.dispatch.mockReset();
-
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
- it('displays UI elements', () => {
- initWrapper();
-
- expect(findEnvironmentsDropdown().is(GlDropdown)).toBe(true);
- expect(findSimpleFilters().exists()).toBe(true);
- expect(findLogControlButtons().exists()).toBe(true);
-
- expect(findInfiniteScroll().exists()).toBe(true);
- expect(findLogTrace().exists()).toBe(true);
- });
-
- it('mounted inits data', () => {
- initWrapper();
-
- expect(dispatch).toHaveBeenCalledWith(`${module}/setInitData`, {
- timeRange: expect.objectContaining({
- default: true,
- }),
- environmentName: mockEnvName,
- podName: null,
- });
-
- expect(dispatch).toHaveBeenCalledWith(`${module}/fetchEnvironments`, mockEnvironmentsEndpoint);
- });
-
- describe('loading state', () => {
- beforeEach(() => {
- state.pods.options = [];
-
- state.logs.lines = [];
- state.logs.isLoading = true;
-
- state.environments = {
- options: [],
- isLoading: true,
- };
-
- initWrapper();
- });
-
- it('does not display an alert to upgrade to ES', () => {
- expect(findElasticsearchNotice().exists()).toBe(false);
- });
-
- it('displays a disabled environments dropdown', () => {
- expect(findEnvironmentsDropdown().attributes('disabled')).toBe('true');
- expect(findEnvironmentsDropdown().findAll(GlDropdownItem).length).toBe(0);
- });
-
- it('does not update buttons state', () => {
- expect(updateControlBtnsMock).not.toHaveBeenCalled();
- });
-
- it('shows an infinite scroll with no content', () => {
- expect(getInfiniteScrollAttr('fetched-items')).toBe(0);
- });
-
- it('shows an infinite scroll container with no set max-height ', () => {
- expect(findInfiniteScroll().attributes('max-list-height')).toBeUndefined();
- });
-
- it('shows a logs trace', () => {
- expect(findLogTrace().text()).toBe('');
- expect(findLogTrace().find('.js-build-loader-animation').isVisible()).toBe(true);
- });
- });
-
- describe('k8s environment', () => {
- beforeEach(() => {
- state.pods.options = [];
-
- state.logs.lines = [];
- state.logs.isLoading = false;
-
- state.environments = {
- options: mockEnvironments,
- current: 'staging',
- isLoading: false,
- };
-
- initWrapper();
- });
-
- it('displays an alert to upgrade to ES', () => {
- expect(findElasticsearchNotice().exists()).toBe(true);
- });
-
- it('displays simple filters for kubernetes logs API', () => {
- expect(findSimpleFilters().exists()).toBe(true);
- expect(findAdvancedFilters().exists()).toBe(false);
- });
- });
-
- describe('state with data', () => {
- beforeEach(() => {
- dispatch.mockImplementation((actionName) => {
- if (actionName === `${module}/setInitData`) {
- mockSetInitData();
- } else if (actionName === `${module}/showPodLogs`) {
- mockShowPodLogs();
- } else if (actionName === `${module}/fetchEnvironments`) {
- mockFetchEnvs();
- mockShowPodLogs();
- }
- });
-
- initWrapper();
- });
-
- afterEach(() => {
- scrollDown.mockReset();
- updateControlBtnsMock.mockReset();
- });
-
- it('does not display an alert to upgrade to ES', () => {
- expect(findElasticsearchNotice().exists()).toBe(false);
- });
-
- it('populates environments dropdown', () => {
- const items = findEnvironmentsDropdown().findAll(GlDropdownItem);
- expect(findEnvironmentsDropdown().props('text')).toBe(mockEnvName);
- expect(items.length).toBe(mockEnvironments.length);
- mockEnvironments.forEach((env, i) => {
- const item = items.at(i);
- expect(item.text()).toBe(env.name);
- });
- });
-
- it('dropdown has one environment selected', () => {
- const items = findEnvironmentsDropdown().findAll(GlDropdownItem);
- mockEnvironments.forEach((env, i) => {
- const item = items.at(i);
-
- if (item.text() !== mockEnvName) {
- expect(item.find(GlDropdownItem).attributes('ischecked')).toBeFalsy();
- } else {
- expect(item.find(GlDropdownItem).attributes('ischecked')).toBeTruthy();
- }
- });
- });
-
- it('displays advanced filters for elasticsearch logs API', () => {
- expect(findSimpleFilters().exists()).toBe(false);
- expect(findAdvancedFilters().exists()).toBe(true);
- });
-
- it('shows infinite scroll with content', () => {
- expect(getInfiniteScrollAttr('fetched-items')).toBe(mockTrace.length);
- });
-
- it('populates logs trace', () => {
- const trace = findLogTrace();
- expect(trace.text().split('\n').length).toBe(mockTrace.length);
- expect(trace.text().split('\n')).toEqual(mockTrace);
- });
-
- it('populates footer', () => {
- const footer = findLogFooter().text();
-
- expect(footer).toContain(`${mockLogsResult.length} results`);
- });
-
- describe('when user clicks', () => {
- it('environment name, trace is refreshed', () => {
- const items = findEnvironmentsDropdown().findAll(GlDropdownItem);
- const index = 1; // any env
-
- expect(dispatch).not.toHaveBeenCalledWith(`${module}/showEnvironment`, expect.anything());
-
- items.at(index).vm.$emit('click');
-
- expect(dispatch).toHaveBeenCalledWith(
- `${module}/showEnvironment`,
- mockEnvironments[index].name,
- );
- });
-
- it('refresh button, trace is refreshed', () => {
- expect(dispatch).not.toHaveBeenCalledWith(`${module}/refreshPodLogs`, undefined);
-
- findLogControlButtons().vm.$emit('refresh');
-
- expect(dispatch).toHaveBeenCalledWith(`${module}/refreshPodLogs`, undefined);
- });
- });
- });
-
- describe('listeners', () => {
- beforeEach(() => {
- initWrapper();
- });
-
- it('attaches listeners in components', () => {
- expect(findInfiniteScroll().vm.$listeners).toEqual({
- topReached: expect.any(Function),
- scroll: expect.any(Function),
- });
- });
-
- it('`topReached` when not loading', () => {
- expect(store.dispatch).not.toHaveBeenCalledWith(`${module}/fetchMoreLogsPrepend`, undefined);
-
- findInfiniteScroll().vm.$emit('topReached');
-
- expect(store.dispatch).toHaveBeenCalledWith(`${module}/fetchMoreLogsPrepend`, undefined);
- });
-
- it('`topReached` does not fetches more logs when already loading', () => {
- state.logs.isLoading = true;
- findInfiniteScroll().vm.$emit('topReached');
-
- expect(store.dispatch).not.toHaveBeenCalledWith(`${module}/fetchMoreLogsPrepend`, undefined);
- });
-
- it('`topReached` fetches more logs', () => {
- state.logs.isLoading = true;
- findInfiniteScroll().vm.$emit('topReached');
-
- expect(store.dispatch).not.toHaveBeenCalledWith(`${module}/fetchMoreLogsPrepend`, undefined);
- });
-
- it('`scroll` on a scrollable target results in enabled scroll buttons', async () => {
- const target = { scrollTop: 10, clientHeight: 10, scrollHeight: 21 };
-
- state.logs.isLoading = true;
- findInfiniteScroll().vm.$emit('scroll', { target });
-
- await nextTick();
- expect(findLogControlButtons().props('scrollDownButtonDisabled')).toEqual(false);
- });
-
- it('`scroll` on a non-scrollable target in disabled scroll buttons', async () => {
- const target = { scrollTop: 10, clientHeight: 10, scrollHeight: 20 };
-
- state.logs.isLoading = true;
- findInfiniteScroll().vm.$emit('scroll', { target });
-
- await nextTick();
- expect(findLogControlButtons().props('scrollDownButtonDisabled')).toEqual(true);
- });
-
- it('`scroll` on no target results in disabled scroll buttons', async () => {
- state.logs.isLoading = true;
- findInfiniteScroll().vm.$emit('scroll', { target: undefined });
-
- await nextTick();
- expect(findLogControlButtons().props('scrollDownButtonDisabled')).toEqual(true);
- });
- });
-});
diff --git a/spec/frontend/logs/components/log_advanced_filters_spec.js b/spec/frontend/logs/components/log_advanced_filters_spec.js
deleted file mode 100644
index 4e4052eb4d8..00000000000
--- a/spec/frontend/logs/components/log_advanced_filters_spec.js
+++ /dev/null
@@ -1,175 +0,0 @@
-import { GlFilteredSearch } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import LogAdvancedFilters from '~/logs/components/log_advanced_filters.vue';
-import { TOKEN_TYPE_POD_NAME } from '~/logs/constants';
-import { createStore } from '~/logs/stores';
-import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
-import { defaultTimeRange } from '~/vue_shared/constants';
-import { mockPods, mockSearch } from '../mock_data';
-
-const module = 'environmentLogs';
-
-describe('LogAdvancedFilters', () => {
- let store;
- let dispatch;
- let wrapper;
- let state;
-
- const findFilteredSearch = () => wrapper.find(GlFilteredSearch);
- const findTimeRangePicker = () => wrapper.find({ ref: 'dateTimePicker' });
- const getSearchToken = (type) =>
- findFilteredSearch()
- .props('availableTokens')
- .filter((token) => token.type === type)[0];
-
- const mockStateLoading = () => {
- state.timeRange.selected = defaultTimeRange;
- state.timeRange.current = convertToFixedRange(defaultTimeRange);
- state.pods.options = [];
- state.pods.current = null;
- state.logs.isLoading = true;
- };
-
- const mockStateWithData = () => {
- state.timeRange.selected = defaultTimeRange;
- state.timeRange.current = convertToFixedRange(defaultTimeRange);
- state.pods.options = mockPods;
- state.pods.current = null;
- state.logs.isLoading = false;
- };
-
- const initWrapper = (propsData = {}) => {
- wrapper = shallowMount(LogAdvancedFilters, {
- propsData: {
- ...propsData,
- },
- store,
- });
- };
-
- beforeEach(() => {
- store = createStore();
- state = store.state.environmentLogs;
-
- jest.spyOn(store, 'dispatch').mockResolvedValue();
-
- dispatch = store.dispatch;
- });
-
- afterEach(() => {
- store.dispatch.mockReset();
-
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
- it('displays UI elements', () => {
- initWrapper();
-
- expect(findFilteredSearch().exists()).toBe(true);
- expect(findTimeRangePicker().exists()).toBe(true);
- });
-
- it('displays search tokens', () => {
- initWrapper();
-
- expect(getSearchToken(TOKEN_TYPE_POD_NAME)).toMatchObject({
- title: 'Pod name',
- unique: true,
- operators: OPERATOR_IS_ONLY,
- });
- });
-
- describe('disabled state', () => {
- beforeEach(() => {
- mockStateLoading();
- initWrapper({
- disabled: true,
- });
- });
-
- it('displays disabled filters', () => {
- expect(findFilteredSearch().attributes('disabled')).toBeTruthy();
- expect(findTimeRangePicker().attributes('disabled')).toBeTruthy();
- });
- });
-
- describe('when the state is loading', () => {
- beforeEach(() => {
- mockStateLoading();
- initWrapper();
- });
-
- it('displays a disabled search', () => {
- expect(findFilteredSearch().attributes('disabled')).toBeTruthy();
- });
-
- it('displays an enable date filter', () => {
- expect(findTimeRangePicker().attributes('disabled')).toBeFalsy();
- });
-
- it('displays no pod options when no pods are available, so suggestions can be displayed', () => {
- expect(getSearchToken(TOKEN_TYPE_POD_NAME).options).toBe(null);
- expect(getSearchToken(TOKEN_TYPE_POD_NAME).loading).toBe(true);
- });
- });
-
- describe('when the state has data', () => {
- beforeEach(() => {
- mockStateWithData();
- initWrapper();
- });
-
- it('displays a single token for pods', () => {
- initWrapper();
-
- const tokens = findFilteredSearch().props('availableTokens');
-
- expect(tokens).toHaveLength(1);
- expect(tokens[0].type).toBe(TOKEN_TYPE_POD_NAME);
- });
-
- it('displays a enabled filters', () => {
- expect(findFilteredSearch().attributes('disabled')).toBeFalsy();
- expect(findTimeRangePicker().attributes('disabled')).toBeFalsy();
- });
-
- it('displays options in the pods token', () => {
- const { options } = getSearchToken(TOKEN_TYPE_POD_NAME);
-
- expect(options).toHaveLength(mockPods.length);
- });
-
- it('displays options in date time picker', () => {
- const options = findTimeRangePicker().props('options');
-
- expect(options).toEqual(expect.any(Array));
- expect(options.length).toBeGreaterThan(0);
- });
-
- describe('when the user interacts', () => {
- it('clicks on the search button, showFilteredLogs is dispatched', () => {
- findFilteredSearch().vm.$emit('submit', null);
-
- expect(dispatch).toHaveBeenCalledWith(`${module}/showFilteredLogs`, null);
- });
-
- it('clicks on the search button, showFilteredLogs is dispatched with null', () => {
- findFilteredSearch().vm.$emit('submit', [mockSearch]);
-
- expect(dispatch).toHaveBeenCalledWith(`${module}/showFilteredLogs`, [mockSearch]);
- });
-
- it('selects a new time range', () => {
- expect(findTimeRangePicker().attributes('disabled')).toBeFalsy();
-
- const mockRange = { start: 'START_DATE', end: 'END_DATE' };
- findTimeRangePicker().vm.$emit('input', mockRange);
-
- expect(dispatch).toHaveBeenCalledWith(`${module}/setTimeRange`, mockRange);
- });
- });
- });
-});
diff --git a/spec/frontend/logs/components/log_control_buttons_spec.js b/spec/frontend/logs/components/log_control_buttons_spec.js
deleted file mode 100644
index e249272b87d..00000000000
--- a/spec/frontend/logs/components/log_control_buttons_spec.js
+++ /dev/null
@@ -1,88 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import LogControlButtons from '~/logs/components/log_control_buttons.vue';
-
-describe('LogControlButtons', () => {
- let wrapper;
-
- const findScrollToTop = () => wrapper.find('.js-scroll-to-top');
- const findScrollToBottom = () => wrapper.find('.js-scroll-to-bottom');
- const findRefreshBtn = () => wrapper.find('.js-refresh-log');
-
- const initWrapper = (opts) => {
- wrapper = shallowMount(LogControlButtons, {
- listeners: {
- scrollUp: () => {},
- scrollDown: () => {},
- },
- ...opts,
- });
- };
-
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
- it('displays UI elements', () => {
- initWrapper();
-
- expect(findScrollToTop().is(GlButton)).toBe(true);
- expect(findScrollToBottom().is(GlButton)).toBe(true);
- expect(findRefreshBtn().is(GlButton)).toBe(true);
- });
-
- it('emits a `refresh` event on click on `refresh` button', async () => {
- initWrapper();
-
- // An `undefined` value means no event was emitted
- expect(wrapper.emitted('refresh')).toBe(undefined);
-
- findRefreshBtn().vm.$emit('click');
-
- await nextTick();
- expect(wrapper.emitted('refresh')).toHaveLength(1);
- });
-
- describe('when scrolling actions are enabled', () => {
- beforeEach(async () => {
- // mock scrolled to the middle of a long page
- initWrapper();
- await nextTick();
- });
-
- it('click on "scroll to top" scrolls up', () => {
- expect(findScrollToTop().attributes('disabled')).toBeUndefined();
-
- findScrollToTop().vm.$emit('click');
-
- expect(wrapper.emitted('scrollUp')).toHaveLength(1);
- });
-
- it('click on "scroll to bottom" scrolls down', () => {
- expect(findScrollToBottom().attributes('disabled')).toBeUndefined();
-
- findScrollToBottom().vm.$emit('click');
-
- expect(wrapper.emitted('scrollDown')).toHaveLength(1);
- });
- });
-
- describe('when scrolling actions are disabled', () => {
- beforeEach(async () => {
- initWrapper({ listeners: {} });
- await nextTick();
- });
-
- it('buttons are disabled', async () => {
- await nextTick();
- expect(findScrollToTop().exists()).toBe(false);
- expect(findScrollToBottom().exists()).toBe(false);
- // This should be enabled when gitlab-ui contains:
- // https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/1149
- // expect(findScrollToBottom().is('[disabled]')).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/logs/components/log_simple_filters_spec.js b/spec/frontend/logs/components/log_simple_filters_spec.js
deleted file mode 100644
index 04ad2e03542..00000000000
--- a/spec/frontend/logs/components/log_simple_filters_spec.js
+++ /dev/null
@@ -1,134 +0,0 @@
-import { GlDropdownItem } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import LogSimpleFilters from '~/logs/components/log_simple_filters.vue';
-import { createStore } from '~/logs/stores';
-import { mockPods, mockPodName } from '../mock_data';
-
-const module = 'environmentLogs';
-
-describe('LogSimpleFilters', () => {
- let store;
- let dispatch;
- let wrapper;
- let state;
-
- const findPodsDropdown = () => wrapper.find({ ref: 'podsDropdown' });
- const findPodsNoPodsText = () => wrapper.find({ ref: 'noPodsMsg' });
- const findPodsDropdownItems = () =>
- findPodsDropdown()
- .findAll(GlDropdownItem)
- .filter((item) => !('disabled' in item.attributes()));
-
- const mockPodsLoading = () => {
- state.pods.options = [];
- state.pods.current = null;
- };
-
- const mockPodsLoaded = () => {
- state.pods.options = mockPods;
- state.pods.current = mockPodName;
- };
-
- const initWrapper = (propsData = {}) => {
- wrapper = shallowMount(LogSimpleFilters, {
- propsData: {
- ...propsData,
- },
- store,
- });
- };
-
- beforeEach(() => {
- store = createStore();
- state = store.state.environmentLogs;
-
- jest.spyOn(store, 'dispatch').mockResolvedValue();
-
- dispatch = store.dispatch;
- });
-
- afterEach(() => {
- store.dispatch.mockReset();
-
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
- it('displays UI elements', () => {
- initWrapper();
-
- expect(findPodsDropdown().exists()).toBe(true);
- });
-
- describe('disabled state', () => {
- beforeEach(() => {
- mockPodsLoading();
- initWrapper({
- disabled: true,
- });
- });
-
- it('displays a disabled pods dropdown', () => {
- expect(findPodsDropdown().props('text')).toBe('No pod selected');
- expect(findPodsDropdown().attributes('disabled')).toBeTruthy();
- });
- });
-
- describe('loading state', () => {
- beforeEach(() => {
- mockPodsLoading();
- initWrapper();
- });
-
- it('displays an enabled pods dropdown', () => {
- expect(findPodsDropdown().attributes('disabled')).toBeFalsy();
- expect(findPodsDropdown().props('text')).toBe('No pod selected');
- });
-
- it('displays an empty pods dropdown', () => {
- expect(findPodsNoPodsText().exists()).toBe(true);
- expect(findPodsDropdownItems()).toHaveLength(0);
- });
- });
-
- describe('pods available state', () => {
- beforeEach(() => {
- mockPodsLoaded();
- initWrapper();
- });
-
- it('displays an enabled pods dropdown', () => {
- expect(findPodsDropdown().attributes('disabled')).toBeFalsy();
- expect(findPodsDropdown().props('text')).toBe(mockPods[0]);
- });
-
- it('displays a pods dropdown with items', () => {
- expect(findPodsNoPodsText().exists()).toBe(false);
- expect(findPodsDropdownItems()).toHaveLength(mockPods.length);
- });
-
- it('dropdown has one pod selected', () => {
- const items = findPodsDropdownItems();
- mockPods.forEach((pod, i) => {
- const item = items.at(i);
- if (item.text() !== mockPodName) {
- expect(item.find(GlDropdownItem).attributes('ischecked')).toBeFalsy();
- } else {
- expect(item.find(GlDropdownItem).attributes('ischecked')).toBeTruthy();
- }
- });
- });
-
- it('when the user clicks on a pod, showPodLogs is dispatched', () => {
- const items = findPodsDropdownItems();
- const index = 2; // any pod
-
- expect(dispatch).not.toHaveBeenCalledWith(`${module}/showPodLogs`, expect.anything());
-
- items.at(index).vm.$emit('click');
-
- expect(dispatch).toHaveBeenCalledWith(`${module}/showPodLogs`, mockPods[index]);
- });
- });
-});
diff --git a/spec/frontend/logs/components/tokens/token_with_loading_state_spec.js b/spec/frontend/logs/components/tokens/token_with_loading_state_spec.js
deleted file mode 100644
index f667a590a36..00000000000
--- a/spec/frontend/logs/components/tokens/token_with_loading_state_spec.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import { GlFilteredSearchToken, GlLoadingIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-
-import TokenWithLoadingState from '~/logs/components/tokens/token_with_loading_state.vue';
-
-describe('TokenWithLoadingState', () => {
- let wrapper;
-
- const findFilteredSearchToken = () => wrapper.find(GlFilteredSearchToken);
- const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
-
- const initWrapper = (props = {}, options) => {
- wrapper = shallowMount(TokenWithLoadingState, {
- propsData: {
- cursorPosition: 'start',
- ...props,
- },
- ...options,
- });
- };
-
- beforeEach(() => {});
-
- it('passes entire config correctly', () => {
- const config = {
- icon: 'pod',
- type: 'pod',
- title: 'Pod name',
- unique: true,
- };
-
- initWrapper({ config });
-
- expect(findFilteredSearchToken().props('config')).toEqual(config);
- });
-
- describe('suggestions are replaced', () => {
- let mockNoOptsText;
- let config;
- let stubs;
-
- beforeEach(() => {
- mockNoOptsText = 'No suggestions available';
- config = {
- loading: false,
- noOptionsText: mockNoOptsText,
- };
- stubs = {
- GlFilteredSearchToken: {
- template: `<div><slot name="suggestions"></slot></div>`,
- },
- };
- });
-
- it('renders a loading icon', () => {
- config.loading = true;
-
- initWrapper({ config }, { stubs });
-
- expect(findLoadingIcon().exists()).toBe(true);
- expect(wrapper.text()).toBe('');
- });
-
- it('renders an empty results message', () => {
- initWrapper({ config }, { stubs });
-
- expect(findLoadingIcon().exists()).toBe(false);
- expect(wrapper.text()).toBe(mockNoOptsText);
- });
- });
-});
diff --git a/spec/frontend/logs/mock_data.js b/spec/frontend/logs/mock_data.js
deleted file mode 100644
index 14c8f7a2ba2..00000000000
--- a/spec/frontend/logs/mock_data.js
+++ /dev/null
@@ -1,71 +0,0 @@
-const mockProjectPath = 'root/autodevops-deploy';
-
-export const mockEnvName = 'production';
-export const mockEnvironmentsEndpoint = `${mockProjectPath}/environments.json`;
-export const mockEnvId = '99';
-export const mockDocumentationPath = '/documentation.md';
-export const mockLogsEndpoint = '/dummy_logs_path.json';
-export const mockCursor = 'MOCK_CURSOR';
-export const mockNextCursor = 'MOCK_NEXT_CURSOR';
-
-const makeMockEnvironment = (id, name, advancedQuerying) => ({
- id,
- project_path: mockProjectPath,
- name,
- logs_api_path: mockLogsEndpoint,
- enable_advanced_logs_querying: advancedQuerying,
-});
-
-export const mockEnvironment = makeMockEnvironment(mockEnvId, mockEnvName, true);
-export const mockEnvironments = [
- mockEnvironment,
- makeMockEnvironment(101, 'staging', false),
- makeMockEnvironment(102, 'review/a-feature', false),
-];
-
-export const mockPodName = 'production-764c58d697-aaaaa';
-export const mockPods = [
- mockPodName,
- 'production-764c58d697-bbbbb',
- 'production-764c58d697-ccccc',
- 'production-764c58d697-ddddd',
-];
-
-export const mockLogsResult = [
- {
- timestamp: '2019-12-13T13:43:18.2760123Z',
- message: 'log line 1',
- pod: 'foo',
- },
- {
- timestamp: '2019-12-13T13:43:18.2760123Z',
- message: 'log line A',
- pod: 'bar',
- },
- {
- timestamp: '2019-12-13T13:43:26.8420123Z',
- message: 'log line 2',
- pod: 'foo',
- },
- {
- timestamp: '2019-12-13T13:43:26.8420123Z',
- message: 'log line B',
- pod: 'bar',
- },
-];
-
-export const mockTrace = [
- 'Dec 13 13:43:18.276 | foo | log line 1',
- 'Dec 13 13:43:18.276 | bar | log line A',
- 'Dec 13 13:43:26.842 | foo | log line 2',
- 'Dec 13 13:43:26.842 | bar | log line B',
-];
-
-export const mockResponse = {
- pod_name: mockPodName,
- pods: mockPods,
- logs: mockLogsResult,
- cursor: mockNextCursor,
-};
-
-export const mockSearch = 'foo +bar';
diff --git a/spec/frontend/logs/stores/actions_spec.js b/spec/frontend/logs/stores/actions_spec.js
deleted file mode 100644
index 46ef1500a20..00000000000
--- a/spec/frontend/logs/stores/actions_spec.js
+++ /dev/null
@@ -1,521 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import testAction from 'helpers/vuex_action_helper';
-import axios from '~/lib/utils/axios_utils';
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import { TOKEN_TYPE_POD_NAME } from '~/logs/constants';
-import {
- setInitData,
- showFilteredLogs,
- showPodLogs,
- fetchEnvironments,
- fetchLogs,
- fetchMoreLogsPrepend,
-} from '~/logs/stores/actions';
-import * as types from '~/logs/stores/mutation_types';
-import logsPageState from '~/logs/stores/state';
-import Tracking from '~/tracking';
-
-import { defaultTimeRange } from '~/vue_shared/constants';
-
-import {
- mockPodName,
- mockEnvironmentsEndpoint,
- mockEnvironments,
- mockPods,
- mockLogsResult,
- mockEnvName,
- mockSearch,
- mockLogsEndpoint,
- mockResponse,
- mockCursor,
- mockNextCursor,
-} from '../mock_data';
-
-jest.mock('~/lib/utils/datetime_range');
-jest.mock('~/logs/utils');
-
-const mockDefaultRange = {
- start: '2020-01-10T18:00:00.000Z',
- end: '2020-01-10T19:00:00.000Z',
-};
-const mockFixedRange = {
- start: '2020-01-09T18:06:20.000Z',
- end: '2020-01-09T18:36:20.000Z',
-};
-const mockRollingRange = {
- duration: 120,
-};
-const mockRollingRangeAsFixed = {
- start: '2020-01-10T18:00:00.000Z',
- end: '2020-01-10T17:58:00.000Z',
-};
-
-describe('Logs Store actions', () => {
- let state;
- let mock;
-
- const latestGetParams = () => mock.history.get[mock.history.get.length - 1].params;
-
- convertToFixedRange.mockImplementation((range) => {
- if (range === defaultTimeRange) {
- return { ...mockDefaultRange };
- }
- if (range === mockFixedRange) {
- return { ...mockFixedRange };
- }
- if (range === mockRollingRange) {
- return { ...mockRollingRangeAsFixed };
- }
- throw new Error('Invalid time range');
- });
-
- beforeEach(() => {
- state = logsPageState();
- });
-
- describe('setInitData', () => {
- it('should commit environment and pod name mutation', () =>
- testAction(
- setInitData,
- { timeRange: mockFixedRange, environmentName: mockEnvName, podName: mockPodName },
- state,
- [
- { type: types.SET_TIME_RANGE, payload: mockFixedRange },
- { type: types.SET_PROJECT_ENVIRONMENT, payload: mockEnvName },
- { type: types.SET_CURRENT_POD_NAME, payload: mockPodName },
- ],
- ));
- });
-
- describe('showFilteredLogs', () => {
- it('empty search should filter with defaults', () =>
- testAction(
- showFilteredLogs,
- undefined,
- state,
- [
- { type: types.SET_CURRENT_POD_NAME, payload: null },
- { type: types.SET_SEARCH, payload: '' },
- ],
- [{ type: 'fetchLogs', payload: 'used_search_bar' }],
- ));
-
- it('text search should filter with a search term', () =>
- testAction(
- showFilteredLogs,
- [mockSearch],
- state,
- [
- { type: types.SET_CURRENT_POD_NAME, payload: null },
- { type: types.SET_SEARCH, payload: mockSearch },
- ],
- [{ type: 'fetchLogs', payload: 'used_search_bar' }],
- ));
-
- it('pod search should filter with a search term', () =>
- testAction(
- showFilteredLogs,
- [{ type: TOKEN_TYPE_POD_NAME, value: { data: mockPodName, operator: '=' } }],
- state,
- [
- { type: types.SET_CURRENT_POD_NAME, payload: mockPodName },
- { type: types.SET_SEARCH, payload: '' },
- ],
- [{ type: 'fetchLogs', payload: 'used_search_bar' }],
- ));
-
- it('pod search should filter with a pod selection and a search term', () =>
- testAction(
- showFilteredLogs,
- [{ type: TOKEN_TYPE_POD_NAME, value: { data: mockPodName, operator: '=' } }, mockSearch],
- state,
- [
- { type: types.SET_CURRENT_POD_NAME, payload: mockPodName },
- { type: types.SET_SEARCH, payload: mockSearch },
- ],
- [{ type: 'fetchLogs', payload: 'used_search_bar' }],
- ));
-
- it('pod search should filter with a pod selection and two search terms', () =>
- testAction(
- showFilteredLogs,
- ['term1', 'term2'],
- state,
- [
- { type: types.SET_CURRENT_POD_NAME, payload: null },
- { type: types.SET_SEARCH, payload: `term1 term2` },
- ],
- [{ type: 'fetchLogs', payload: 'used_search_bar' }],
- ));
-
- it('pod search should filter with a pod selection and a search terms before and after', () =>
- testAction(
- showFilteredLogs,
- [
- 'term1',
- { type: TOKEN_TYPE_POD_NAME, value: { data: mockPodName, operator: '=' } },
- 'term2',
- ],
- state,
- [
- { type: types.SET_CURRENT_POD_NAME, payload: mockPodName },
- { type: types.SET_SEARCH, payload: `term1 term2` },
- ],
- [{ type: 'fetchLogs', payload: 'used_search_bar' }],
- ));
- });
-
- describe('showPodLogs', () => {
- it('should commit pod name', () =>
- testAction(
- showPodLogs,
- mockPodName,
- state,
- [{ type: types.SET_CURRENT_POD_NAME, payload: mockPodName }],
- [{ type: 'fetchLogs', payload: 'pod_log_changed' }],
- ));
- });
-
- describe('fetchEnvironments', () => {
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- it('should commit RECEIVE_ENVIRONMENTS_DATA_SUCCESS mutation on correct data', () => {
- mock.onGet(mockEnvironmentsEndpoint).replyOnce(200, mockEnvironments);
- return testAction(
- fetchEnvironments,
- mockEnvironmentsEndpoint,
- state,
- [
- { type: types.REQUEST_ENVIRONMENTS_DATA },
- { type: types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS, payload: mockEnvironments },
- ],
- [{ type: 'fetchLogs', payload: 'environment_selected' }],
- );
- });
-
- it('should commit RECEIVE_ENVIRONMENTS_DATA_ERROR on wrong data', () => {
- mock.onGet(mockEnvironmentsEndpoint).replyOnce(500);
- return testAction(
- fetchEnvironments,
- mockEnvironmentsEndpoint,
- state,
- [
- { type: types.REQUEST_ENVIRONMENTS_DATA },
- { type: types.RECEIVE_ENVIRONMENTS_DATA_ERROR },
- ],
- [],
- );
- });
- });
-
- describe('when the backend responds succesfully', () => {
- let expectedMutations;
- let expectedActions;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mock.onGet(mockLogsEndpoint).reply(200, mockResponse);
- mock.onGet(mockLogsEndpoint).replyOnce(202); // mock reactive cache
-
- state.environments.options = mockEnvironments;
- state.environments.current = mockEnvName;
- });
-
- afterEach(() => {
- mock.reset();
- });
-
- describe('fetchLogs', () => {
- beforeEach(() => {
- expectedMutations = [
- { type: types.REQUEST_LOGS_DATA },
- {
- type: types.RECEIVE_LOGS_DATA_SUCCESS,
- payload: { logs: mockLogsResult, cursor: mockNextCursor },
- },
- { type: types.SET_CURRENT_POD_NAME, payload: mockPodName },
- { type: types.RECEIVE_PODS_DATA_SUCCESS, payload: mockPods },
- ];
-
- expectedActions = [];
- });
-
- it('should commit logs and pod data when there is pod name defined', () => {
- state.pods.current = mockPodName;
- state.timeRange.current = mockFixedRange;
-
- return testAction(fetchLogs, null, state, expectedMutations, expectedActions, () => {
- expect(latestGetParams()).toMatchObject({
- pod_name: mockPodName,
- });
- });
- });
-
- it('should commit logs and pod data when there is pod name defined and a non-default date range', () => {
- state.pods.current = mockPodName;
- state.timeRange.current = mockFixedRange;
- state.logs.cursor = mockCursor;
-
- return testAction(fetchLogs, null, state, expectedMutations, expectedActions, () => {
- expect(latestGetParams()).toEqual({
- pod_name: mockPodName,
- start_time: mockFixedRange.start,
- end_time: mockFixedRange.end,
- cursor: mockCursor,
- });
- });
- });
-
- it('should commit logs and pod data when there is pod name and search and a faulty date range', () => {
- state.pods.current = mockPodName;
- state.search = mockSearch;
- state.timeRange.current = 'INVALID_TIME_RANGE';
-
- expectedMutations.splice(1, 0, {
- type: types.SHOW_TIME_RANGE_INVALID_WARNING,
- });
-
- return testAction(fetchLogs, null, state, expectedMutations, expectedActions, () => {
- expect(latestGetParams()).toEqual({
- pod_name: mockPodName,
- search: mockSearch,
- });
- });
- });
-
- it('should commit logs and pod data when no pod name defined', () => {
- state.timeRange.current = defaultTimeRange;
-
- return testAction(fetchLogs, null, state, expectedMutations, expectedActions, () => {
- expect(latestGetParams()).toEqual({
- start_time: expect.any(String),
- end_time: expect.any(String),
- });
- });
- });
- });
-
- describe('fetchMoreLogsPrepend', () => {
- beforeEach(() => {
- expectedMutations = [
- { type: types.REQUEST_LOGS_DATA_PREPEND },
- {
- type: types.RECEIVE_LOGS_DATA_PREPEND_SUCCESS,
- payload: { logs: mockLogsResult, cursor: mockNextCursor },
- },
- ];
-
- expectedActions = [];
- });
-
- it('should commit logs and pod data when there is pod name defined', () => {
- state.pods.current = mockPodName;
- state.timeRange.current = mockFixedRange;
-
- expectedActions = [];
-
- return testAction(
- fetchMoreLogsPrepend,
- null,
- state,
- expectedMutations,
- expectedActions,
- () => {
- expect(latestGetParams()).toMatchObject({
- pod_name: mockPodName,
- });
- },
- );
- });
-
- it('should commit logs and pod data when there is pod name defined and a non-default date range', () => {
- state.pods.current = mockPodName;
- state.timeRange.current = mockFixedRange;
- state.logs.cursor = mockCursor;
-
- return testAction(
- fetchMoreLogsPrepend,
- null,
- state,
- expectedMutations,
- expectedActions,
- () => {
- expect(latestGetParams()).toEqual({
- pod_name: mockPodName,
- start_time: mockFixedRange.start,
- end_time: mockFixedRange.end,
- cursor: mockCursor,
- });
- },
- );
- });
-
- it('should commit logs and pod data when there is pod name and search and a faulty date range', () => {
- state.pods.current = mockPodName;
- state.search = mockSearch;
- state.timeRange.current = 'INVALID_TIME_RANGE';
-
- expectedMutations.splice(1, 0, {
- type: types.SHOW_TIME_RANGE_INVALID_WARNING,
- });
-
- return testAction(
- fetchMoreLogsPrepend,
- null,
- state,
- expectedMutations,
- expectedActions,
- () => {
- expect(latestGetParams()).toEqual({
- pod_name: mockPodName,
- search: mockSearch,
- });
- },
- );
- });
-
- it('should commit logs and pod data when no pod name defined', () => {
- state.timeRange.current = defaultTimeRange;
-
- return testAction(
- fetchMoreLogsPrepend,
- null,
- state,
- expectedMutations,
- expectedActions,
- () => {
- expect(latestGetParams()).toEqual({
- start_time: expect.any(String),
- end_time: expect.any(String),
- });
- },
- );
- });
-
- it('should not commit logs or pod data when it has reached the end', () => {
- state.logs.isComplete = true;
- state.logs.cursor = null;
-
- return testAction(
- fetchMoreLogsPrepend,
- null,
- state,
- [], // no mutations done
- [], // no actions dispatched
- () => {
- expect(mock.history.get).toHaveLength(0);
- },
- );
- });
- });
- });
-
- describe('when the backend responds with an error', () => {
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mock.onGet(mockLogsEndpoint).reply(500);
- });
-
- afterEach(() => {
- mock.reset();
- });
-
- it('fetchLogs should commit logs and pod errors', () => {
- state.environments.options = mockEnvironments;
- state.environments.current = mockEnvName;
- state.timeRange.current = defaultTimeRange;
-
- return testAction(
- fetchLogs,
- null,
- state,
- [
- { type: types.REQUEST_LOGS_DATA },
- { type: types.RECEIVE_PODS_DATA_ERROR },
- { type: types.RECEIVE_LOGS_DATA_ERROR },
- ],
- [],
- () => {
- expect(mock.history.get[0].url).toBe(mockLogsEndpoint);
- },
- );
- });
-
- it('fetchMoreLogsPrepend should commit logs and pod errors', () => {
- state.environments.options = mockEnvironments;
- state.environments.current = mockEnvName;
- state.timeRange.current = defaultTimeRange;
-
- return testAction(
- fetchMoreLogsPrepend,
- null,
- state,
- [
- { type: types.REQUEST_LOGS_DATA_PREPEND },
- { type: types.RECEIVE_LOGS_DATA_PREPEND_ERROR },
- ],
- [],
- () => {
- expect(mock.history.get[0].url).toBe(mockLogsEndpoint);
- },
- );
- });
- });
-});
-
-describe('Tracking user interaction', () => {
- let commit;
- let dispatch;
- let state;
- let mock;
-
- beforeEach(() => {
- jest.spyOn(Tracking, 'event');
- commit = jest.fn();
- dispatch = jest.fn();
- state = logsPageState();
- state.environments.options = mockEnvironments;
- state.environments.current = mockEnvName;
-
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.reset();
- });
-
- describe('Logs with data', () => {
- beforeEach(() => {
- mock.onGet(mockLogsEndpoint).reply(200, mockResponse);
- mock.onGet(mockLogsEndpoint).replyOnce(202); // mock reactive cache
- });
-
- it('tracks fetched logs with data', () => {
- return fetchLogs({ state, commit, dispatch }, 'environment_selected').then(() => {
- expect(Tracking.event).toHaveBeenCalledWith(document.body.dataset.page, 'logs_view', {
- label: 'environment_selected',
- property: 'count',
- value: 1,
- });
- });
- });
- });
-
- describe('Logs without data', () => {
- beforeEach(() => {
- mock.onGet(mockLogsEndpoint).reply(200, {
- ...mockResponse,
- logs: [],
- });
- mock.onGet(mockLogsEndpoint).replyOnce(202); // mock reactive cache
- });
-
- it('does not track empty log responses', () => {
- return fetchLogs({ state, commit, dispatch }).then(() => {
- expect(Tracking.event).not.toHaveBeenCalled();
- });
- });
- });
-});
diff --git a/spec/frontend/logs/stores/getters_spec.js b/spec/frontend/logs/stores/getters_spec.js
deleted file mode 100644
index 9d213d8c01f..00000000000
--- a/spec/frontend/logs/stores/getters_spec.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import { trace, showAdvancedFilters } from '~/logs/stores/getters';
-import logsPageState from '~/logs/stores/state';
-
-import { mockLogsResult, mockTrace, mockEnvName, mockEnvironments } from '../mock_data';
-
-describe('Logs Store getters', () => {
- let state;
-
- beforeEach(() => {
- state = logsPageState();
- });
-
- describe('trace', () => {
- describe('when state is initialized', () => {
- it('returns an empty string', () => {
- expect(trace(state)).toEqual('');
- });
- });
-
- describe('when state logs are empty', () => {
- beforeEach(() => {
- state.logs.lines = [];
- });
-
- it('returns an empty string', () => {
- expect(trace(state)).toEqual('');
- });
- });
-
- describe('when state logs are set', () => {
- beforeEach(() => {
- state.logs.lines = mockLogsResult;
- });
-
- it('returns an empty string', () => {
- expect(trace(state)).toEqual(mockTrace.join('\n'));
- });
- });
- });
-
- describe('showAdvancedFilters', () => {
- describe('when no environments are set', () => {
- beforeEach(() => {
- state.environments.current = mockEnvName;
- state.environments.options = [];
- });
-
- it('returns false', () => {
- expect(showAdvancedFilters(state)).toBe(false);
- });
- });
-
- describe('when the environment supports filters', () => {
- beforeEach(() => {
- state.environments.current = mockEnvName;
- state.environments.options = mockEnvironments;
- });
-
- it('returns true', () => {
- expect(showAdvancedFilters(state)).toBe(true);
- });
- });
-
- describe('when the environment does not support filters', () => {
- beforeEach(() => {
- state.environments.options = mockEnvironments;
- state.environments.current = mockEnvironments[1].name;
- });
-
- it('returns true', () => {
- expect(showAdvancedFilters(state)).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/logs/stores/mutations_spec.js b/spec/frontend/logs/stores/mutations_spec.js
deleted file mode 100644
index 988197a8350..00000000000
--- a/spec/frontend/logs/stores/mutations_spec.js
+++ /dev/null
@@ -1,257 +0,0 @@
-import * as types from '~/logs/stores/mutation_types';
-import mutations from '~/logs/stores/mutations';
-
-import logsPageState from '~/logs/stores/state';
-import {
- mockEnvName,
- mockEnvironments,
- mockPods,
- mockPodName,
- mockLogsResult,
- mockSearch,
- mockCursor,
- mockNextCursor,
-} from '../mock_data';
-
-describe('Logs Store Mutations', () => {
- let state;
-
- beforeEach(() => {
- state = logsPageState();
- });
-
- it('ensures mutation types are correctly named', () => {
- Object.keys(types).forEach((k) => {
- expect(k).toEqual(types[k]);
- });
- });
-
- describe('SET_PROJECT_ENVIRONMENT', () => {
- it('sets the environment', () => {
- mutations[types.SET_PROJECT_ENVIRONMENT](state, mockEnvName);
- expect(state.environments.current).toEqual(mockEnvName);
- });
- });
-
- describe('SET_SEARCH', () => {
- it('sets the search', () => {
- mutations[types.SET_SEARCH](state, mockSearch);
- expect(state.search).toEqual(mockSearch);
- });
- });
-
- describe('REQUEST_ENVIRONMENTS_DATA', () => {
- it('inits data', () => {
- mutations[types.REQUEST_ENVIRONMENTS_DATA](state);
- expect(state.environments.options).toEqual([]);
- expect(state.environments.isLoading).toEqual(true);
- });
- });
-
- describe('RECEIVE_ENVIRONMENTS_DATA_SUCCESS', () => {
- it('receives environments data and stores it as options', () => {
- expect(state.environments.options).toEqual([]);
-
- mutations[types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS](state, mockEnvironments);
-
- expect(state.environments.options).toEqual(mockEnvironments);
- expect(state.environments.isLoading).toEqual(false);
- });
- });
-
- describe('RECEIVE_ENVIRONMENTS_DATA_ERROR', () => {
- it('captures an error loading environments', () => {
- mutations[types.RECEIVE_ENVIRONMENTS_DATA_ERROR](state);
-
- expect(state.environments).toEqual({
- options: [],
- isLoading: false,
- current: null,
- fetchError: true,
- });
- });
- });
-
- describe('REQUEST_LOGS_DATA', () => {
- it('starts loading for logs', () => {
- mutations[types.REQUEST_LOGS_DATA](state);
-
- expect(state.timeRange.current).toEqual({
- start: expect.any(String),
- end: expect.any(String),
- });
-
- expect(state.logs).toEqual({
- lines: [],
- cursor: null,
- fetchError: false,
- isLoading: true,
- isComplete: false,
- });
- });
- });
-
- describe('RECEIVE_LOGS_DATA_SUCCESS', () => {
- it('receives logs lines and cursor', () => {
- mutations[types.RECEIVE_LOGS_DATA_SUCCESS](state, {
- logs: mockLogsResult,
- cursor: mockCursor,
- });
-
- expect(state.logs).toEqual({
- lines: mockLogsResult,
- isLoading: false,
- cursor: mockCursor,
- isComplete: false,
- fetchError: false,
- });
- });
-
- it('receives logs lines and a null cursor to indicate the end', () => {
- mutations[types.RECEIVE_LOGS_DATA_SUCCESS](state, {
- logs: mockLogsResult,
- cursor: null,
- });
-
- expect(state.logs).toEqual({
- lines: mockLogsResult,
- isLoading: false,
- cursor: null,
- isComplete: true,
- fetchError: false,
- });
- });
- });
-
- describe('RECEIVE_LOGS_DATA_ERROR', () => {
- it('receives log data error and stops loading', () => {
- mutations[types.RECEIVE_LOGS_DATA_ERROR](state);
-
- expect(state.logs).toEqual({
- lines: [],
- isLoading: false,
- cursor: null,
- isComplete: false,
- fetchError: true,
- });
- });
- });
-
- describe('REQUEST_LOGS_DATA_PREPEND', () => {
- it('receives logs lines and cursor', () => {
- mutations[types.REQUEST_LOGS_DATA_PREPEND](state);
-
- expect(state.logs.isLoading).toBe(true);
- });
- });
-
- describe('RECEIVE_LOGS_DATA_PREPEND_SUCCESS', () => {
- it('receives logs lines and cursor', () => {
- mutations[types.RECEIVE_LOGS_DATA_PREPEND_SUCCESS](state, {
- logs: mockLogsResult,
- cursor: mockCursor,
- });
-
- expect(state.logs).toEqual({
- lines: mockLogsResult,
- isLoading: false,
- cursor: mockCursor,
- isComplete: false,
- fetchError: false,
- });
- });
-
- it('receives additional logs lines and a new cursor', () => {
- mutations[types.RECEIVE_LOGS_DATA_PREPEND_SUCCESS](state, {
- logs: mockLogsResult,
- cursor: mockCursor,
- });
-
- mutations[types.RECEIVE_LOGS_DATA_PREPEND_SUCCESS](state, {
- logs: mockLogsResult,
- cursor: mockNextCursor,
- });
-
- expect(state.logs).toEqual({
- lines: [...mockLogsResult, ...mockLogsResult],
- isLoading: false,
- cursor: mockNextCursor,
- isComplete: false,
- fetchError: false,
- });
- });
-
- it('receives logs lines and a null cursor to indicate is complete', () => {
- mutations[types.RECEIVE_LOGS_DATA_PREPEND_SUCCESS](state, {
- logs: mockLogsResult,
- cursor: null,
- });
-
- expect(state.logs).toEqual({
- lines: mockLogsResult,
- isLoading: false,
- cursor: null,
- isComplete: true,
- fetchError: false,
- });
- });
- });
-
- describe('RECEIVE_LOGS_DATA_PREPEND_ERROR', () => {
- it('receives logs lines and cursor', () => {
- mutations[types.RECEIVE_LOGS_DATA_PREPEND_ERROR](state);
-
- expect(state.logs.isLoading).toBe(false);
- expect(state.logs.fetchError).toBe(true);
- });
- });
-
- describe('SET_CURRENT_POD_NAME', () => {
- it('set current pod name', () => {
- mutations[types.SET_CURRENT_POD_NAME](state, mockPodName);
-
- expect(state.pods.current).toEqual(mockPodName);
- });
- });
-
- describe('SET_TIME_RANGE', () => {
- it('sets a default range', () => {
- expect(state.timeRange.selected).toEqual(expect.any(Object));
- expect(state.timeRange.current).toEqual(expect.any(Object));
- });
-
- it('sets a time range', () => {
- const mockRange = {
- start: '2020-01-10T18:00:00.000Z',
- end: '2020-01-10T10:00:00.000Z',
- };
- mutations[types.SET_TIME_RANGE](state, mockRange);
-
- expect(state.timeRange.selected).toEqual(mockRange);
- expect(state.timeRange.current).toEqual(mockRange);
- });
- });
-
- describe('RECEIVE_PODS_DATA_SUCCESS', () => {
- it('receives pods data success', () => {
- mutations[types.RECEIVE_PODS_DATA_SUCCESS](state, mockPods);
-
- expect(state.pods).toEqual(
- expect.objectContaining({
- options: mockPods,
- }),
- );
- });
- });
- describe('RECEIVE_PODS_DATA_ERROR', () => {
- it('receives pods data error', () => {
- mutations[types.RECEIVE_PODS_DATA_ERROR](state);
-
- expect(state.pods).toEqual(
- expect.objectContaining({
- options: [],
- }),
- );
- });
- });
-});
diff --git a/spec/frontend/merge_request_tabs_spec.js b/spec/frontend/merge_request_tabs_spec.js
index f0f051cbc8b..2001bb5f95e 100644
--- a/spec/frontend/merge_request_tabs_spec.js
+++ b/spec/frontend/merge_request_tabs_spec.js
@@ -2,6 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initMrPage from 'helpers/init_vue_mr_page_helper';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import axios from '~/lib/utils/axios_utils';
import MergeRequestTabs from '~/merge_request_tabs';
import '~/lib/utils/common_utils';
@@ -24,6 +25,8 @@ describe('MergeRequestTabs', () => {
};
beforeEach(() => {
+ stubPerformanceWebAPI();
+
initMrPage();
testContext.class = new MergeRequestTabs({ stubLocation });
@@ -331,6 +334,8 @@ describe('MergeRequestTabs', () => {
${'diffs'} | ${true} | ${'hides'}
${'commits'} | ${true} | ${'hides'}
`('it $hidesText expand button on $tab tab', ({ tab, hides }) => {
+ window.gon = { features: { movedMrSidebar: true } };
+
const expandButton = document.createElement('div');
expandButton.classList.add('js-expand-sidebar');
@@ -344,16 +349,16 @@ describe('MergeRequestTabs', () => {
testContext.class = new MergeRequestTabs({ stubLocation });
testContext.class.tabShown(tab, 'foobar');
- expect(testContext.class.expandSidebar.classList.contains('gl-display-none!')).toBe(hides);
+ testContext.class.expandSidebar.forEach((el) => {
+ expect(el.classList.contains('gl-display-none!')).toBe(hides);
+ });
+
+ window.gon = {};
});
describe('when switching tabs', () => {
const SCROLL_TOP = 100;
- beforeAll(() => {
- jest.useFakeTimers();
- });
-
beforeEach(() => {
jest.spyOn(window, 'scrollTo').mockImplementation(() => {});
testContext.class.mergeRequestTabs = document.createElement('div');
@@ -362,10 +367,6 @@ describe('MergeRequestTabs', () => {
testContext.class.scrollPositions = { newTab: SCROLL_TOP };
});
- afterAll(() => {
- jest.useRealTimers();
- });
-
it('scrolls to the stored position, if one is stored', () => {
testContext.class.tabShown('newTab');
diff --git a/spec/frontend/milestones/components/delete_milestone_modal_spec.js b/spec/frontend/milestones/components/delete_milestone_modal_spec.js
index b9ba0833c4f..6692a3b9347 100644
--- a/spec/frontend/milestones/components/delete_milestone_modal_spec.js
+++ b/spec/frontend/milestones/components/delete_milestone_modal_spec.js
@@ -1,44 +1,59 @@
-import Vue from 'vue';
+import { GlSprintf, GlModal } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
import { TEST_HOST } from 'helpers/test_constants';
-import mountComponent from 'helpers/vue_mount_component_helper';
import axios from '~/lib/utils/axios_utils';
-import { redirectTo } from '~/lib/utils/url_utility';
-import deleteMilestoneModal from '~/milestones/components/delete_milestone_modal.vue';
+import DeleteMilestoneModal from '~/milestones/components/delete_milestone_modal.vue';
import eventHub from '~/milestones/event_hub';
+import { redirectTo } from '~/lib/utils/url_utility';
+import { createAlert } from '~/flash';
-jest.mock('~/lib/utils/url_utility', () => ({
- ...jest.requireActual('~/lib/utils/url_utility'),
- redirectTo: jest.fn(),
-}));
+jest.mock('~/lib/utils/url_utility');
+jest.mock('~/flash');
-describe('delete_milestone_modal.vue', () => {
- const Component = Vue.extend(deleteMilestoneModal);
- const props = {
+describe('Delete milestone modal', () => {
+ let wrapper;
+ const mockProps = {
issueCount: 1,
mergeRequestCount: 2,
milestoneId: 3,
milestoneTitle: 'my milestone title',
milestoneUrl: `${TEST_HOST}/delete_milestone_modal.vue/milestone`,
};
- let vm;
+
+ const findModal = () => wrapper.findComponent(GlModal);
+
+ const createComponent = (props) => {
+ wrapper = shallowMount(DeleteMilestoneModal, {
+ propsData: {
+ ...mockProps,
+ ...props,
+ },
+ stubs: {
+ GlSprintf,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
describe('onSubmit', () => {
beforeEach(() => {
- vm = mountComponent(Component, props);
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
});
it('deletes milestone and redirects to overview page', async () => {
const responseURL = `${TEST_HOST}/delete_milestone_modal.vue/milestoneOverview`;
jest.spyOn(axios, 'delete').mockImplementation((url) => {
- expect(url).toBe(props.milestoneUrl);
+ expect(url).toBe(mockProps.milestoneUrl);
expect(eventHub.$emit).toHaveBeenCalledWith(
'deleteMilestoneModal.requestStarted',
- props.milestoneUrl,
+ mockProps.milestoneUrl,
);
eventHub.$emit.mockReset();
return Promise.resolve({
@@ -47,55 +62,71 @@ describe('delete_milestone_modal.vue', () => {
},
});
});
-
- await vm.onSubmit();
+ await findModal().vm.$emit('primary');
expect(redirectTo).toHaveBeenCalledWith(responseURL);
expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
- milestoneUrl: props.milestoneUrl,
+ milestoneUrl: mockProps.milestoneUrl,
successful: true,
});
});
- it('displays error if deleting milestone failed', async () => {
- const dummyError = new Error('deleting milestone failed');
- dummyError.response = { status: 418 };
- jest.spyOn(axios, 'delete').mockImplementation((url) => {
- expect(url).toBe(props.milestoneUrl);
- expect(eventHub.$emit).toHaveBeenCalledWith(
- 'deleteMilestoneModal.requestStarted',
- props.milestoneUrl,
- );
- eventHub.$emit.mockReset();
- return Promise.reject(dummyError);
- });
+ it.each`
+ statusCode | alertMessage
+ ${418} | ${`Failed to delete milestone ${mockProps.milestoneTitle}`}
+ ${404} | ${`Milestone ${mockProps.milestoneTitle} was not found`}
+ `(
+ 'displays error if deleting milestone failed with code $statusCode',
+ async ({ statusCode, alertMessage }) => {
+ const dummyError = new Error('deleting milestone failed');
+ dummyError.response = { status: statusCode };
+ jest.spyOn(axios, 'delete').mockImplementation((url) => {
+ expect(url).toBe(mockProps.milestoneUrl);
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'deleteMilestoneModal.requestStarted',
+ mockProps.milestoneUrl,
+ );
+ eventHub.$emit.mockReset();
+ return Promise.reject(dummyError);
+ });
- await expect(vm.onSubmit()).rejects.toEqual(dummyError);
- expect(redirectTo).not.toHaveBeenCalled();
- expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
- milestoneUrl: props.milestoneUrl,
- successful: false,
- });
- });
+ await expect(wrapper.vm.onSubmit()).rejects.toEqual(dummyError);
+ expect(createAlert).toHaveBeenCalledWith({
+ message: alertMessage,
+ });
+ expect(redirectTo).not.toHaveBeenCalled();
+ expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
+ milestoneUrl: mockProps.milestoneUrl,
+ successful: false,
+ });
+ },
+ );
});
- describe('text', () => {
- it('contains the issue and milestone count', () => {
- vm = mountComponent(Component, props);
- const value = vm.text;
+ describe('Modal title and description', () => {
+ const emptyDescription = `You’re about to permanently delete the milestone ${mockProps.milestoneTitle}. This milestone is not currently used in any issues or merge requests.`;
+ const description = `You’re about to permanently delete the milestone ${mockProps.milestoneTitle} and remove it from 1 issue and 2 merge requests. Once deleted, it cannot be undone or recovered.`;
+ const title = `Delete milestone ${mockProps.milestoneTitle}?`;
- expect(value).toContain('remove it from 1 issue and 2 merge requests');
+ it('renders proper title', () => {
+ const value = findModal().props('title');
+ expect(value).toBe(title);
});
- it('contains neither issue nor milestone count', () => {
- vm = mountComponent(Component, {
- ...props,
- issueCount: 0,
- mergeRequestCount: 0,
- });
-
- const value = vm.text;
+ it.each`
+ statement | descriptionText | issueCount | mergeRequestCount
+ ${'1 issue and 2 merge requests'} | ${description} | ${1} | ${2}
+ ${'no issues and merge requests'} | ${emptyDescription} | ${0} | ${0}
+ `(
+ 'renders proper description when the milestone contains $statement',
+ ({ issueCount, mergeRequestCount, descriptionText }) => {
+ createComponent({
+ issueCount,
+ mergeRequestCount,
+ });
- expect(value).toContain('is not currently used');
- });
+ const value = findModal().text();
+ expect(value).toBe(descriptionText);
+ },
+ );
});
});
diff --git a/spec/frontend/milestones/components/milestone_combobox_spec.js b/spec/frontend/milestones/components/milestone_combobox_spec.js
index afd85fb78ce..a8e3d13dca0 100644
--- a/spec/frontend/milestones/components/milestone_combobox_spec.js
+++ b/spec/frontend/milestones/components/milestone_combobox_spec.js
@@ -154,9 +154,9 @@ describe('Milestone combobox component', () => {
};
describe('initialization behavior', () => {
- beforeEach(createComponent);
-
it('initializes the dropdown with milestones when mounted', () => {
+ createComponent();
+
return waitForRequests().then(() => {
expect(projectMilestonesApiCallSpy).toHaveBeenCalledTimes(1);
expect(groupMilestonesApiCallSpy).toHaveBeenCalledTimes(1);
@@ -164,6 +164,8 @@ describe('Milestone combobox component', () => {
});
it('shows a spinner while network requests are in progress', () => {
+ createComponent();
+
expect(findLoadingIcon().exists()).toBe(true);
return waitForRequests().then(() => {
@@ -172,6 +174,8 @@ describe('Milestone combobox component', () => {
});
it('shows additional links', () => {
+ createComponent();
+
const links = wrapper.findAll('[data-testid="milestone-combobox-extra-links"]');
links.wrappers.forEach((item, idx) => {
expect(item.text()).toBe(extraLinks[idx].text);
diff --git a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
index a9f37f90561..14f04d9b767 100644
--- a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
+++ b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
@@ -35,7 +35,7 @@ exports[`Dashboard template matches the default snapshot 1`] = `
class="prometheus-graphs-header d-sm-flex flex-sm-wrap pt-2 pr-1 pb-0 pl-2 border-bottom bg-gray-light"
>
<div
- class="mb-2 mr-2 d-flex d-sm-block"
+ class="gl-mb-3 gl-mr-3 gl-display-flex gl-sm-display-block"
>
<dashboards-dropdown-stub
class="flex-grow-1"
diff --git a/spec/frontend/monitoring/components/dashboard_panel_spec.js b/spec/frontend/monitoring/components/dashboard_panel_spec.js
index 1f9eb03b5d4..7c54a4742ac 100644
--- a/spec/frontend/monitoring/components/dashboard_panel_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_panel_spec.js
@@ -5,7 +5,6 @@ import Vuex from 'vuex';
import { nextTick } from 'vue';
import { setTestTimeout } from 'helpers/timeout';
import axios from '~/lib/utils/axios_utils';
-import invalidUrl from '~/lib/utils/invalid_url';
import MonitorAnomalyChart from '~/monitoring/components/charts/anomaly.vue';
import MonitorBarChart from '~/monitoring/components/charts/bar.vue';
@@ -27,13 +26,7 @@ import {
heatmapGraphData,
barGraphData,
} from '../graph_data';
-import {
- mockLogsHref,
- mockLogsPath,
- mockNamespace,
- mockNamespacedData,
- mockTimeRange,
-} from '../mock_data';
+import { mockNamespace, mockNamespacedData, mockTimeRange } from '../mock_data';
const mocks = {
$toast: {
@@ -65,7 +58,6 @@ describe('Dashboard Panel', () => {
},
store,
mocks,
- provide: { glFeatures: { monitorLogging: true } },
...options,
});
};
@@ -335,86 +327,6 @@ describe('Dashboard Panel', () => {
});
});
- describe('View Logs dropdown item', () => {
- const findViewLogsLink = () => wrapper.find({ ref: 'viewLogsLink' });
-
- beforeEach(async () => {
- createWrapper();
- await nextTick();
- });
-
- it('is not present by default', async () => {
- await nextTick();
- expect(findViewLogsLink().exists()).toBe(false);
- });
-
- it('is not present if a time range is not set', async () => {
- state.logsPath = mockLogsPath;
- state.timeRange = null;
-
- await nextTick();
- expect(findViewLogsLink().exists()).toBe(false);
- });
-
- it('is not present if the logs path is default', async () => {
- state.logsPath = invalidUrl;
- state.timeRange = mockTimeRange;
-
- await nextTick();
- expect(findViewLogsLink().exists()).toBe(false);
- });
-
- it('is not present if the logs path is not set', async () => {
- state.logsPath = null;
- state.timeRange = mockTimeRange;
-
- await nextTick();
- expect(findViewLogsLink().exists()).toBe(false);
- });
-
- it('is present when logs path and time a range is present', async () => {
- state.logsPath = mockLogsPath;
- state.timeRange = mockTimeRange;
-
- await nextTick();
- expect(findViewLogsLink().attributes('href')).toMatch(mockLogsHref);
- });
-
- describe(':monitor_logging feature flag', () => {
- it.each`
- flagState | logsState | expected
- ${true} | ${'shows'} | ${true}
- ${false} | ${'hides'} | ${false}
- `('$logsState logs when flag state is $flagState', async ({ flagState, expected }) => {
- createWrapper({}, { provide: { glFeatures: { monitorLogging: flagState } } });
- state.logsPath = mockLogsPath;
- state.timeRange = mockTimeRange;
- await nextTick();
-
- expect(findViewLogsLink().exists()).toBe(expected);
- });
- });
-
- it('it is overridden when a datazoom event is received', async () => {
- state.logsPath = mockLogsPath;
- state.timeRange = mockTimeRange;
-
- const zoomedTimeRange = {
- start: '2020-01-01T00:00:00.000Z',
- end: '2020-01-01T01:00:00.000Z',
- };
-
- findTimeChart().vm.$emit('datazoom', zoomedTimeRange);
-
- await nextTick();
- const start = encodeURIComponent(zoomedTimeRange.start);
- const end = encodeURIComponent(zoomedTimeRange.end);
- expect(findViewLogsLink().attributes('href')).toMatch(
- `${mockLogsPath}?start=${start}&end=${end}`,
- );
- });
- });
-
describe('when clipboard data is available', () => {
const clipboardText = 'A value to copy.';
@@ -507,14 +419,6 @@ describe('Dashboard Panel', () => {
createWrapper({ namespace: mockNamespace });
});
- it('handles namespaced time range and logs path state', async () => {
- store.state[mockNamespace].timeRange = mockTimeRange;
- store.state[mockNamespace].logsPath = mockLogsPath;
-
- await nextTick();
- expect(wrapper.find({ ref: 'viewLogsLink' }).attributes().href).toBe(mockLogsHref);
- });
-
it('handles namespaced deployment data state', async () => {
store.state[mockNamespace].deploymentData = mockDeploymentData;
diff --git a/spec/frontend/monitoring/components/dashboard_spec.js b/spec/frontend/monitoring/components/dashboard_spec.js
index 6c5972e1140..90171cfc65e 100644
--- a/spec/frontend/monitoring/components/dashboard_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_spec.js
@@ -75,6 +75,7 @@ describe('Dashboard', () => {
if (store.dispatch.mockReset) {
store.dispatch.mockReset();
}
+ wrapper.destroy();
});
describe('request information to the server', () => {
@@ -569,28 +570,37 @@ describe('Dashboard', () => {
const findDraggablePanels = () => wrapper.findAll('.js-draggable-panel');
const findRearrangeButton = () => wrapper.find('.js-rearrange-button');
- beforeEach(async () => {
+ const setup = async () => {
// call original dispatch
store.dispatch.mockRestore();
createShallowWrapper({ hasMetrics: true });
setupStoreWithData(store);
await nextTick();
- });
+ };
+
+ it('wraps vuedraggable', async () => {
+ await setup();
- it('wraps vuedraggable', () => {
expect(findDraggablePanels().exists()).toBe(true);
expect(findDraggablePanels().length).toEqual(metricsDashboardPanelCount);
});
- it('is disabled by default', () => {
+ it('is disabled by default', async () => {
+ await setup();
+
expect(findRearrangeButton().exists()).toBe(false);
expect(findEnabledDraggables().length).toBe(0);
});
describe('when rearrange is enabled', () => {
beforeEach(async () => {
- wrapper.setProps({ rearrangePanelsAvailable: true });
+ // call original dispatch
+ store.dispatch.mockRestore();
+
+ createShallowWrapper({ hasMetrics: true, rearrangePanelsAvailable: true });
+ setupStoreWithData(store);
+
await nextTick();
});
@@ -602,17 +612,18 @@ describe('Dashboard', () => {
const findFirstDraggableRemoveButton = () =>
findDraggablePanels().at(0).find('.js-draggable-remove');
- beforeEach(async () => {
+ it('it enables draggables', async () => {
findRearrangeButton().vm.$emit('click');
await nextTick();
- });
- it('it enables draggables', () => {
expect(findRearrangeButton().attributes('pressed')).toBeTruthy();
expect(findEnabledDraggables().wrappers).toEqual(findDraggables().wrappers);
});
it('metrics can be swapped', async () => {
+ findRearrangeButton().vm.$emit('click');
+ await nextTick();
+
const firstDraggable = findDraggables().at(0);
const mockMetrics = [...metricsDashboardViewModel.panelGroups[0].panels];
@@ -624,6 +635,7 @@ describe('Dashboard', () => {
firstDraggable.vm.$emit('input', mockMetrics);
await nextTick();
+
const { panels } = wrapper.vm.dashboard.panelGroups[0];
expect(panels[1].title).toEqual(firstTitle);
@@ -631,18 +643,23 @@ describe('Dashboard', () => {
});
it('shows a remove button, which removes a panel', async () => {
+ findRearrangeButton().vm.$emit('click');
+ await nextTick();
+
expect(findFirstDraggableRemoveButton().find('a').exists()).toBe(true);
expect(findDraggablePanels().length).toEqual(metricsDashboardPanelCount);
- findFirstDraggableRemoveButton().trigger('click');
+ await findFirstDraggableRemoveButton().trigger('click');
- await nextTick();
expect(findDraggablePanels().length).toEqual(metricsDashboardPanelCount - 1);
});
it('it disables draggables when clicked again', async () => {
findRearrangeButton().vm.$emit('click');
await nextTick();
+
+ findRearrangeButton().vm.$emit('click');
+ await nextTick();
expect(findRearrangeButton().attributes('pressed')).toBeFalsy();
expect(findEnabledDraggables().length).toBe(0);
});
diff --git a/spec/frontend/monitoring/store/mutations_spec.js b/spec/frontend/monitoring/store/mutations_spec.js
index ae1a4e16b30..49e8ab9ebd4 100644
--- a/spec/frontend/monitoring/store/mutations_spec.js
+++ b/spec/frontend/monitoring/store/mutations_spec.js
@@ -180,11 +180,6 @@ describe('Monitoring mutations', () => {
});
it('should not remove previously set properties', () => {
- const defaultLogsPath = stateCopy.logsPath;
-
- mutations[types.SET_INITIAL_STATE](stateCopy, {
- logsPath: defaultLogsPath,
- });
mutations[types.SET_INITIAL_STATE](stateCopy, {
dashboardEndpoint: 'dashboard.json',
});
@@ -196,7 +191,6 @@ describe('Monitoring mutations', () => {
});
expect(stateCopy).toMatchObject({
- logsPath: defaultLogsPath,
dashboardEndpoint: 'dashboard.json',
projectPath: '/gitlab-org/gitlab-foss',
currentEnvironmentName: 'canary',
@@ -227,11 +221,6 @@ describe('Monitoring mutations', () => {
});
it('should not remove previously set properties', () => {
- const defaultLogsPath = stateCopy.logsPath;
-
- mutations[types.SET_ENDPOINTS](stateCopy, {
- logsPath: defaultLogsPath,
- });
mutations[types.SET_ENDPOINTS](stateCopy, {
dashboardEndpoint: 'dashboard.json',
});
@@ -240,7 +229,6 @@ describe('Monitoring mutations', () => {
});
expect(stateCopy).toMatchObject({
- logsPath: defaultLogsPath,
dashboardEndpoint: 'dashboard.json',
projectPath: '/gitlab-org/gitlab-foss',
});
diff --git a/spec/frontend/new_branch_spec.js b/spec/frontend/new_branch_spec.js
index e4f4b3fa5b5..5a09598059d 100644
--- a/spec/frontend/new_branch_spec.js
+++ b/spec/frontend/new_branch_spec.js
@@ -1,4 +1,3 @@
-import $ from 'jquery';
import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import NewBranchForm from '~/new_branch_form';
@@ -11,17 +10,19 @@ describe('Branch', () => {
describe('create a new branch', () => {
function fillNameWith(value) {
- $('.js-branch-name').val(value).trigger('blur');
+ document.querySelector('.js-branch-name').value = value;
+ const event = new CustomEvent('blur');
+ document.querySelector('.js-branch-name').dispatchEvent(event);
}
function expectToHaveError(error) {
- expect($('.js-branch-name-error span').text()).toEqual(error);
+ expect(document.querySelector('.js-branch-name-error').textContent).toEqual(error);
}
beforeEach(() => {
loadHTMLFixture('branches/new_branch.html');
- $('form').on('submit', (e) => e.preventDefault());
- testContext.form = new NewBranchForm($('.js-create-branch-form'), []);
+ document.querySelector('form').addEventListener('submit', (e) => e.preventDefault());
+ testContext.form = new NewBranchForm(document.querySelector('.js-create-branch-form'), []);
});
afterEach(() => {
@@ -171,34 +172,34 @@ describe('Branch', () => {
it('removes the error message when is a valid name', () => {
fillNameWith('foo?bar');
- expect($('.js-branch-name-error span').length).toEqual(1);
+ expect(document.querySelector('.js-branch-name-error').textContent).not.toEqual('');
fillNameWith('foobar');
- expect($('.js-branch-name-error span').length).toEqual(0);
+ expect(document.querySelector('.js-branch-name-error').textContent).toEqual('');
});
it('can have dashes anywhere', () => {
fillNameWith('-foo-bar-zoo-');
- expect($('.js-branch-name-error span').length).toEqual(0);
+ expect(document.querySelector('.js-branch-name-error').textContent).toEqual('');
});
it('can have underscores anywhere', () => {
fillNameWith('_foo_bar_zoo_');
- expect($('.js-branch-name-error span').length).toEqual(0);
+ expect(document.querySelector('.js-branch-name-error').textContent).toEqual('');
});
it('can have numbers anywhere', () => {
fillNameWith('1foo2bar3zoo4');
- expect($('.js-branch-name-error span').length).toEqual(0);
+ expect(document.querySelector('.js-branch-name-error').textContent).toEqual('');
});
it('can be only letters', () => {
fillNameWith('foo');
- expect($('.js-branch-name-error span').length).toEqual(0);
+ expect(document.querySelector('.js-branch-name-error').textContent).toEqual('');
});
});
});
diff --git a/spec/frontend/notebook/cells/code_spec.js b/spec/frontend/notebook/cells/code_spec.js
index 9a2db061278..10762a1c3a2 100644
--- a/spec/frontend/notebook/cells/code_spec.js
+++ b/spec/frontend/notebook/cells/code_spec.js
@@ -1,89 +1,73 @@
-import Vue, { nextTick } from 'vue';
+import { mount } from '@vue/test-utils';
import fixture from 'test_fixtures/blob/notebook/basic.json';
-import CodeComponent from '~/notebook/cells/code.vue';
-
-const Component = Vue.extend(CodeComponent);
+import Code from '~/notebook/cells/code.vue';
describe('Code component', () => {
- let vm;
-
+ let wrapper;
let json;
+ const mountComponent = (cell) => mount(Code, { propsData: { cell } });
+
beforeEach(() => {
// Clone fixture as it could be modified by tests
json = JSON.parse(JSON.stringify(fixture));
});
- const setupComponent = (cell) => {
- const comp = new Component({
- propsData: {
- cell,
- },
- });
- comp.$mount();
- return comp;
- };
+ afterEach(() => {
+ wrapper.destroy();
+ });
describe('without output', () => {
beforeEach(() => {
- vm = setupComponent(json.cells[0]);
-
- return nextTick();
+ wrapper = mountComponent(json.cells[0]);
});
it('does not render output prompt', () => {
- expect(vm.$el.querySelectorAll('.prompt').length).toBe(1);
+ expect(wrapper.findAll('.prompt')).toHaveLength(1);
});
});
describe('with output', () => {
beforeEach(() => {
- vm = setupComponent(json.cells[2]);
-
- return nextTick();
+ wrapper = mountComponent(json.cells[2]);
});
it('does not render output prompt', () => {
- expect(vm.$el.querySelectorAll('.prompt').length).toBe(2);
+ expect(wrapper.findAll('.prompt')).toHaveLength(2);
});
it('renders output cell', () => {
- expect(vm.$el.querySelector('.output')).toBeDefined();
+ expect(wrapper.find('.output').exists()).toBe(true);
});
});
describe('with string for output', () => {
// NBFormat Version 4.1 allows outputs.text to be a string
- beforeEach(async () => {
+ beforeEach(() => {
const cell = json.cells[2];
cell.outputs[0].text = cell.outputs[0].text.join('');
- vm = setupComponent(cell);
- await nextTick();
+ wrapper = mountComponent(cell);
});
it('does not render output prompt', () => {
- expect(vm.$el.querySelectorAll('.prompt').length).toBe(2);
+ expect(wrapper.findAll('.prompt')).toHaveLength(2);
});
it('renders output cell', () => {
- expect(vm.$el.querySelector('.output')).toBeDefined();
+ expect(wrapper.find('.output').exists()).toBe(true);
});
});
describe('with string for cell.source', () => {
- beforeEach(async () => {
+ beforeEach(() => {
const cell = json.cells[0];
cell.source = cell.source.join('');
-
- vm = setupComponent(cell);
- await nextTick();
+ wrapper = mountComponent(cell);
});
it('renders the same input as when cell.source is an array', () => {
- const expected = "console.log('test')";
-
- expect(vm.$el.querySelector('.input').innerText).toContain(expected);
+ expect(wrapper.find('.input').text()).toContain("console.log('test')");
});
});
});
diff --git a/spec/frontend/notebook/cells/markdown_spec.js b/spec/frontend/notebook/cells/markdown_spec.js
index de415b5bfe0..c757b55faf4 100644
--- a/spec/frontend/notebook/cells/markdown_spec.js
+++ b/spec/frontend/notebook/cells/markdown_spec.js
@@ -130,7 +130,7 @@ describe('Markdown component', () => {
expect(columns[0].innerHTML).toContain('<img src="data:image/jpeg;base64');
expect(columns[1].innerHTML).toContain('<img src="data:image/png;base64');
expect(columns[2].innerHTML).toContain('<img src="data:image/jpeg;base64');
- expect(columns[3].innerHTML).toContain('<img>');
+ expect(columns[3].innerHTML).toContain('<img src="attachment:bogus">');
expect(columns[4].innerHTML).toContain('<img src="https://www.google.com/');
});
});
diff --git a/spec/frontend/notebook/cells/output/index_spec.js b/spec/frontend/notebook/cells/output/index_spec.js
index 8e04e4c146c..4d1d03e5e34 100644
--- a/spec/frontend/notebook/cells/output/index_spec.js
+++ b/spec/frontend/notebook/cells/output/index_spec.js
@@ -1,36 +1,35 @@
-import Vue, { nextTick } from 'vue';
+import { mount } from '@vue/test-utils';
import json from 'test_fixtures/blob/notebook/basic.json';
-import CodeComponent from '~/notebook/cells/output/index.vue';
-
-const Component = Vue.extend(CodeComponent);
+import Output from '~/notebook/cells/output/index.vue';
describe('Output component', () => {
- let vm;
+ let wrapper;
const createComponent = (output) => {
- vm = new Component({
+ wrapper = mount(Output, {
propsData: {
outputs: [].concat(output),
count: 1,
},
});
- vm.$mount();
};
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
describe('text output', () => {
beforeEach(() => {
const textType = json.cells[2];
createComponent(textType.outputs[0]);
-
- return nextTick();
});
it('renders as plain text', () => {
- expect(vm.$el.querySelector('pre')).not.toBeNull();
+ expect(wrapper.find('pre').exists()).toBe(true);
});
it('renders prompt', () => {
- expect(vm.$el.querySelector('.prompt span')).not.toBeNull();
+ expect(wrapper.find('.prompt span').exists()).toBe(true);
});
});
@@ -38,12 +37,10 @@ describe('Output component', () => {
beforeEach(() => {
const imageType = json.cells[3];
createComponent(imageType.outputs[0]);
-
- return nextTick();
});
it('renders as an image', () => {
- expect(vm.$el.querySelector('img')).not.toBeNull();
+ expect(wrapper.find('img').exists()).toBe(true);
});
});
@@ -52,16 +49,15 @@ describe('Output component', () => {
const htmlType = json.cells[4];
createComponent(htmlType.outputs[0]);
- expect(vm.$el.querySelector('p')).not.toBeNull();
- expect(vm.$el.querySelectorAll('p')).toHaveLength(1);
- expect(vm.$el.textContent.trim()).toContain('test');
+ expect(wrapper.findAll('p')).toHaveLength(1);
+ expect(wrapper.text()).toContain('test');
});
it('renders multiple raw HTML outputs', () => {
const htmlType = json.cells[4];
createComponent([htmlType.outputs[0], htmlType.outputs[0]]);
- expect(vm.$el.querySelectorAll('p')).toHaveLength(2);
+ expect(wrapper.findAll('p')).toHaveLength(2);
});
});
@@ -77,7 +73,7 @@ describe('Output component', () => {
};
createComponent(output);
- expect(vm.$el.querySelector('.MathJax')).not.toBeNull();
+ expect(wrapper.find('.MathJax').exists()).toBe(true);
});
});
@@ -85,12 +81,10 @@ describe('Output component', () => {
beforeEach(() => {
const svgType = json.cells[5];
createComponent(svgType.outputs[0]);
-
- return nextTick();
});
it('renders as an svg', () => {
- expect(vm.$el.querySelector('svg')).not.toBeNull();
+ expect(wrapper.find('svg').exists()).toBe(true);
});
});
@@ -98,27 +92,23 @@ describe('Output component', () => {
beforeEach(() => {
const unknownType = json.cells[6];
createComponent(unknownType.outputs[0]);
-
- return nextTick();
});
it('renders as plain text', () => {
- expect(vm.$el.querySelector('pre')).not.toBeNull();
- expect(vm.$el.textContent.trim()).toContain('testing');
+ expect(wrapper.find('pre').exists()).toBe(true);
+ expect(wrapper.text()).toContain('testing');
});
- it('renders promot', () => {
- expect(vm.$el.querySelector('.prompt span')).not.toBeNull();
+ it('renders prompt', () => {
+ expect(wrapper.find('.prompt span').exists()).toBe(true);
});
- it("renders as plain text when doesn't recognise other types", async () => {
+ it("renders as plain text when doesn't recognise other types", () => {
const unknownType = json.cells[7];
createComponent(unknownType.outputs[0]);
- await nextTick();
-
- expect(vm.$el.querySelector('pre')).not.toBeNull();
- expect(vm.$el.textContent.trim()).toContain('testing');
+ expect(wrapper.find('pre').exists()).toBe(true);
+ expect(wrapper.text()).toContain('testing');
});
});
});
diff --git a/spec/frontend/notebook/cells/prompt_spec.js b/spec/frontend/notebook/cells/prompt_spec.js
index 89b2d7b2b90..0cda0c5bc2b 100644
--- a/spec/frontend/notebook/cells/prompt_spec.js
+++ b/spec/frontend/notebook/cells/prompt_spec.js
@@ -1,52 +1,40 @@
-import Vue, { nextTick } from 'vue';
-import PromptComponent from '~/notebook/cells/prompt.vue';
-
-const Component = Vue.extend(PromptComponent);
+import { shallowMount } from '@vue/test-utils';
+import Prompt from '~/notebook/cells/prompt.vue';
describe('Prompt component', () => {
- let vm;
+ let wrapper;
+
+ const mountComponent = ({ type }) => shallowMount(Prompt, { propsData: { type, count: 1 } });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
describe('input', () => {
beforeEach(() => {
- vm = new Component({
- propsData: {
- type: 'In',
- count: 1,
- },
- });
- vm.$mount();
-
- return nextTick();
+ wrapper = mountComponent({ type: 'In' });
});
it('renders in label', () => {
- expect(vm.$el.textContent.trim()).toContain('In');
+ expect(wrapper.text()).toContain('In');
});
it('renders count', () => {
- expect(vm.$el.textContent.trim()).toContain('1');
+ expect(wrapper.text()).toContain('1');
});
});
describe('output', () => {
beforeEach(() => {
- vm = new Component({
- propsData: {
- type: 'Out',
- count: 1,
- },
- });
- vm.$mount();
-
- return nextTick();
+ wrapper = mountComponent({ type: 'Out' });
});
it('renders in label', () => {
- expect(vm.$el.textContent.trim()).toContain('Out');
+ expect(wrapper.text()).toContain('Out');
});
it('renders count', () => {
- expect(vm.$el.textContent.trim()).toContain('1');
+ expect(wrapper.text()).toContain('1');
});
});
});
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js
index 116016ecae2..463787c148b 100644
--- a/spec/frontend/notes/components/comment_form_spec.js
+++ b/spec/frontend/notes/components/comment_form_spec.js
@@ -550,98 +550,74 @@ describe('issue_comment_form component', () => {
});
describe('confidential notes checkbox', () => {
- describe('when confidentialNotes feature flag is `false`', () => {
- const features = { confidentialNotes: false };
+ it('should render checkbox as unchecked by default', () => {
+ mountComponent({
+ mountFunction: mount,
+ initialData: { note: 'confidential note' },
+ noteableData: { ...notableDataMockCanUpdateIssuable },
+ });
- it('should not render checkbox', () => {
+ const checkbox = findConfidentialNoteCheckbox();
+ expect(checkbox.exists()).toBe(true);
+ expect(checkbox.element.checked).toBe(false);
+ });
+
+ it.each`
+ noteableType | rendered | message
+ ${'Issue'} | ${true} | ${'render'}
+ ${'Epic'} | ${true} | ${'render'}
+ ${'MergeRequest'} | ${false} | ${'not render'}
+ `(
+ 'should $message checkbox when noteableType is $noteableType',
+ ({ noteableType, rendered }) => {
mountComponent({
mountFunction: mount,
- initialData: { note: 'confidential note' },
- noteableData: { ...notableDataMockCanUpdateIssuable },
- features,
+ noteableType,
+ initialData: { note: 'internal note' },
+ noteableData: { ...notableDataMockCanUpdateIssuable, noteableType },
});
- const checkbox = findConfidentialNoteCheckbox();
- expect(checkbox.exists()).toBe(false);
- });
- });
-
- describe('when confidentialNotes feature flag is `true`', () => {
- const features = { confidentialNotes: true };
+ expect(findConfidentialNoteCheckbox().exists()).toBe(rendered);
+ },
+ );
- it('should render checkbox as unchecked by default', () => {
+ describe.each`
+ shouldCheckboxBeChecked
+ ${true}
+ ${false}
+ `('when checkbox value is `$shouldCheckboxBeChecked`', ({ shouldCheckboxBeChecked }) => {
+ it(`sets \`confidential\` to \`${shouldCheckboxBeChecked}\``, async () => {
mountComponent({
mountFunction: mount,
initialData: { note: 'confidential note' },
noteableData: { ...notableDataMockCanUpdateIssuable },
- features,
});
- const checkbox = findConfidentialNoteCheckbox();
- expect(checkbox.exists()).toBe(true);
- expect(checkbox.element.checked).toBe(false);
- });
+ jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue({});
- it.each`
- noteableType | rendered | message
- ${'Issue'} | ${true} | ${'render'}
- ${'Epic'} | ${true} | ${'render'}
- ${'MergeRequest'} | ${false} | ${'not render'}
- `(
- 'should $message checkbox when noteableType is $noteableType',
- ({ noteableType, rendered }) => {
- mountComponent({
- mountFunction: mount,
- noteableType,
- initialData: { note: 'internal note' },
- noteableData: { ...notableDataMockCanUpdateIssuable, noteableType },
- features,
- });
-
- expect(findConfidentialNoteCheckbox().exists()).toBe(rendered);
- },
- );
-
- describe.each`
- shouldCheckboxBeChecked
- ${true}
- ${false}
- `('when checkbox value is `$shouldCheckboxBeChecked`', ({ shouldCheckboxBeChecked }) => {
- it(`sets \`confidential\` to \`${shouldCheckboxBeChecked}\``, async () => {
- mountComponent({
- mountFunction: mount,
- initialData: { note: 'confidential note' },
- noteableData: { ...notableDataMockCanUpdateIssuable },
- features,
- });
-
- jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue({});
-
- const checkbox = findConfidentialNoteCheckbox();
+ const checkbox = findConfidentialNoteCheckbox();
- // check checkbox
- checkbox.element.checked = shouldCheckboxBeChecked;
- checkbox.trigger('change');
- await nextTick();
+ // check checkbox
+ checkbox.element.checked = shouldCheckboxBeChecked;
+ checkbox.trigger('change');
+ await nextTick();
- // submit comment
- findCommentButton().trigger('click');
+ // submit comment
+ findCommentButton().trigger('click');
- const [providedData] = wrapper.vm.saveNote.mock.calls[0];
- expect(providedData.data.note.confidential).toBe(shouldCheckboxBeChecked);
- });
+ const [providedData] = wrapper.vm.saveNote.mock.calls[0];
+ expect(providedData.data.note.confidential).toBe(shouldCheckboxBeChecked);
});
+ });
- describe('when user cannot update issuable', () => {
- it('should not render checkbox', () => {
- mountComponent({
- mountFunction: mount,
- noteableData: { ...notableDataMockCannotUpdateIssuable },
- features,
- });
-
- expect(findConfidentialNoteCheckbox().exists()).toBe(false);
+ describe('when user cannot update issuable', () => {
+ it('should not render checkbox', () => {
+ mountComponent({
+ mountFunction: mount,
+ noteableData: { ...notableDataMockCannotUpdateIssuable },
});
+
+ expect(findConfidentialNoteCheckbox().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/notes/components/note_signed_out_widget_spec.js b/spec/frontend/notes/components/note_signed_out_widget_spec.js
index e217a2caa73..84f20e4ad58 100644
--- a/spec/frontend/notes/components/note_signed_out_widget_spec.js
+++ b/spec/frontend/notes/components/note_signed_out_widget_spec.js
@@ -1,41 +1,30 @@
-import Vue from 'vue';
-import noteSignedOut from '~/notes/components/note_signed_out_widget.vue';
+import { shallowMount } from '@vue/test-utils';
+import NoteSignedOutWidget from '~/notes/components/note_signed_out_widget.vue';
import createStore from '~/notes/stores';
import { notesDataMock } from '../mock_data';
-describe('note_signed_out_widget component', () => {
- let store;
- let vm;
+describe('NoteSignedOutWidget component', () => {
+ let wrapper;
beforeEach(() => {
- const Component = Vue.extend(noteSignedOut);
- store = createStore();
+ const store = createStore();
store.dispatch('setNotesData', notesDataMock);
-
- vm = new Component({
- store,
- }).$mount();
+ wrapper = shallowMount(NoteSignedOutWidget, { store });
});
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
- it('should render sign in link provided in the store', () => {
- expect(vm.$el.querySelector(`a[href="${notesDataMock.newSessionPath}"]`).textContent).toEqual(
- 'sign in',
- );
+ it('renders sign in link provided in the store', () => {
+ expect(wrapper.find(`a[href="${notesDataMock.newSessionPath}"]`).text()).toBe('sign in');
});
- it('should render register link provided in the store', () => {
- expect(vm.$el.querySelector(`a[href="${notesDataMock.registerPath}"]`).textContent).toEqual(
- 'register',
- );
+ it('renders register link provided in the store', () => {
+ expect(wrapper.find(`a[href="${notesDataMock.registerPath}"]`).text()).toBe('register');
});
- it('should render information text', () => {
- expect(vm.$el.textContent.replace(/\s+/g, ' ').trim()).toEqual(
- 'Please register or sign in to reply',
- );
+ it('renders information text', () => {
+ expect(wrapper.text()).toContain('Please register or sign in to reply');
});
});
diff --git a/spec/frontend/notes/components/noteable_discussion_spec.js b/spec/frontend/notes/components/noteable_discussion_spec.js
index ddfa77117ca..603db56a098 100644
--- a/spec/frontend/notes/components/noteable_discussion_spec.js
+++ b/spec/frontend/notes/components/noteable_discussion_spec.js
@@ -2,7 +2,7 @@ import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import discussionWithTwoUnresolvedNotes from 'test_fixtures/merge_requests/resolved_diff_discussion.json';
import { trimText } from 'helpers/text_helper';
-import mockDiffFile from 'jest/diffs/mock_data/diff_file';
+import { getDiffFileMock } from 'jest/diffs/mock_data/diff_file';
import DiscussionNotes from '~/notes/components/discussion_notes.vue';
import ReplyPlaceholder from '~/notes/components/discussion_reply_placeholder.vue';
import ResolveWithIssueButton from '~/notes/components/discussion_resolve_with_issue_button.vue';
@@ -45,7 +45,7 @@ describe('noteable_discussion component', () => {
it('should render thread header', async () => {
const discussion = { ...discussionMock };
- discussion.diff_file = mockDiffFile;
+ discussion.diff_file = getDiffFileMock();
discussion.diff_discussion = true;
discussion.expanded = false;
@@ -57,7 +57,7 @@ describe('noteable_discussion component', () => {
it('should hide actions when diff refs do not exists', async () => {
const discussion = { ...discussionMock };
- discussion.diff_file = { ...mockDiffFile, diff_refs: null };
+ discussion.diff_file = { ...getDiffFileMock(), diff_refs: null };
discussion.diff_discussion = true;
discussion.expanded = false;
diff --git a/spec/frontend/notes/components/noteable_note_spec.js b/spec/frontend/notes/components/noteable_note_spec.js
index 385edc59eb6..3350609bb90 100644
--- a/spec/frontend/notes/components/noteable_note_spec.js
+++ b/spec/frontend/notes/components/noteable_note_spec.js
@@ -1,20 +1,15 @@
import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
-
+import { GlAvatar } from '@gitlab/ui';
import waitForPromises from 'helpers/wait_for_promises';
-
import DiffsModule from '~/diffs/store/modules';
-
import NoteActions from '~/notes/components/note_actions.vue';
import NoteBody from '~/notes/components/note_body.vue';
import NoteHeader from '~/notes/components/note_header.vue';
import issueNote from '~/notes/components/noteable_note.vue';
import NotesModule from '~/notes/stores/modules';
import { NOTEABLE_TYPE_MAPPING } from '~/notes/constants';
-
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-
import { noteableDataMock, notesDataMock, note } from '../mock_data';
Vue.use(Vuex);
@@ -205,19 +200,21 @@ describe('issue_note', () => {
await nextTick();
- expect(wrapper.findComponent(UserAvatarLink).props('imgSize')).toBe(24);
+ const avatar = wrapper.findComponent(GlAvatar);
+ const avatarProps = avatar.props();
+ expect(avatarProps.size).toBe(24);
});
});
- it('should render user information', () => {
+ it('should render user avatar', () => {
const { author } = note;
- const avatar = wrapper.findComponent(UserAvatarLink);
+ const avatar = wrapper.findComponent(GlAvatar);
const avatarProps = avatar.props();
- expect(avatarProps.linkHref).toBe(author.path);
- expect(avatarProps.imgSrc).toBe(author.avatar_url);
- expect(avatarProps.imgAlt).toBe(author.name);
- expect(avatarProps.imgSize).toBe(40);
+ expect(avatarProps.src).toBe(author.avatar_url);
+ expect(avatarProps.entityName).toBe(author.username);
+ expect(avatarProps.alt).toBe(author.name);
+ expect(avatarProps.size).toEqual({ default: 24, md: 32 });
});
it('should render note header content', () => {
diff --git a/spec/frontend/notes/components/notes_app_spec.js b/spec/frontend/notes/components/notes_app_spec.js
index f4eb69e0d49..36a68118fa7 100644
--- a/spec/frontend/notes/components/notes_app_spec.js
+++ b/spec/frontend/notes/components/notes_app_spec.js
@@ -44,22 +44,6 @@ describe('note_app', () => {
.wrappers.map((node) => (node.is(CommentForm) ? TYPE_COMMENT_FORM : TYPE_NOTES_LIST));
};
- /**
- * waits for fetchNotes() to complete
- */
- const waitForDiscussionsRequest = () =>
- new Promise((resolve) => {
- const { vm } = wrapper.find(NotesApp);
- const unwatch = vm.$watch('isFetching', (isFetching) => {
- if (isFetching) {
- return;
- }
-
- unwatch();
- resolve();
- });
- });
-
beforeEach(() => {
$('body').attr('data-page', 'projects:merge_requests:show');
@@ -95,7 +79,7 @@ describe('note_app', () => {
axiosMock.onAny().reply(200, []);
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
afterEach(() => {
@@ -129,7 +113,7 @@ describe('note_app', () => {
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
afterEach(() => {
@@ -172,7 +156,7 @@ describe('note_app', () => {
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
store.state.commentsDisabled = true;
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
afterEach(() => {
@@ -197,7 +181,7 @@ describe('note_app', () => {
store.state.isTimelineEnabled = true;
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
afterEach(() => {
@@ -210,15 +194,13 @@ describe('note_app', () => {
});
describe('while fetching data', () => {
- beforeEach(() => {
+ beforeEach(async () => {
setHTMLFixture('<div class="js-discussions-count"></div>');
- axiosMock.onAny().reply(200, []);
wrapper = mountComponent();
});
afterEach(() => {
- waitForDiscussionsRequest();
- resetHTMLFixture();
+ return waitForPromises().then(() => resetHTMLFixture());
});
it('renders skeleton notes', () => {
@@ -242,7 +224,7 @@ describe('note_app', () => {
beforeEach(() => {
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
wrapper = mountComponent();
- return waitForDiscussionsRequest().then(() => {
+ return waitForPromises().then(() => {
wrapper.find('.js-note-edit').trigger('click');
});
});
@@ -264,7 +246,7 @@ describe('note_app', () => {
beforeEach(() => {
axiosMock.onAny().reply(mockData.getDiscussionNoteResponse);
wrapper = mountComponent();
- return waitForDiscussionsRequest().then(() => {
+ return waitForPromises().then(() => {
wrapper.find('.js-note-edit').trigger('click');
});
});
@@ -287,7 +269,7 @@ describe('note_app', () => {
beforeEach(() => {
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
it('should render markdown docs url', () => {
@@ -309,7 +291,7 @@ describe('note_app', () => {
beforeEach(() => {
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
it('should render markdown docs url', async () => {
@@ -337,7 +319,7 @@ describe('note_app', () => {
beforeEach(() => {
axiosMock.onAny().reply(200, []);
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
it('dispatches toggleAward after toggleAward event', () => {
@@ -373,7 +355,7 @@ describe('note_app', () => {
beforeEach(() => {
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
wrapper = mountComponent();
- return waitForDiscussionsRequest();
+ return waitForPromises();
});
it('should listen hashchange event', () => {
@@ -471,7 +453,7 @@ describe('note_app', () => {
wrapper = shallowMount(NotesApp, { propsData, store: createStore() });
await waitForPromises();
- expect(axiosMock.history.get[0].params).toBeUndefined();
+ expect(axiosMock.history.get[0].params).toEqual({ per_page: 20 });
});
});
@@ -496,14 +478,14 @@ describe('note_app', () => {
wrapper = mountWithNotesFilter(undefined);
await waitForPromises();
- expect(axiosMock.history.get[0].params).toBeUndefined();
+ expect(axiosMock.history.get[0].params).toEqual({ per_page: 20 });
});
it('does not include extra query params when filter is already set to default', async () => {
wrapper = mountWithNotesFilter(constants.DISCUSSION_FILTERS_DEFAULT_VALUE);
await waitForPromises();
- expect(axiosMock.history.get[0].params).toBeUndefined();
+ expect(axiosMock.history.get[0].params).toEqual({ per_page: 20 });
});
it('includes extra query params when filter is not set to default', async () => {
@@ -512,6 +494,7 @@ describe('note_app', () => {
expect(axiosMock.history.get[0].params).toEqual({
notes_filter: constants.DISCUSSION_FILTERS_DEFAULT_VALUE,
+ per_page: 20,
persist_filter: false,
});
});
diff --git a/spec/frontend/notes/components/toggle_replies_widget_spec.js b/spec/frontend/notes/components/toggle_replies_widget_spec.js
index 409e1bc3951..8c3696e88b7 100644
--- a/spec/frontend/notes/components/toggle_replies_widget_spec.js
+++ b/spec/frontend/notes/components/toggle_replies_widget_spec.js
@@ -1,13 +1,14 @@
-import Vue from 'vue';
-import mountComponent from 'helpers/vue_mount_component_helper';
-import toggleRepliesWidget from '~/notes/components/toggle_replies_widget.vue';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import ToggleRepliesWidget from '~/notes/components/toggle_replies_widget.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import { note } from '../mock_data';
-const deepCloneObject = (obj) => JSON.parse(JSON.stringify(obj));
-
describe('toggle replies widget for notes', () => {
- let vm;
- let ToggleRepliesWidget;
+ let wrapper;
+
+ const deepCloneObject = (obj) => JSON.parse(JSON.stringify(obj));
+
const noteFromOtherUser = deepCloneObject(note);
noteFromOtherUser.author.username = 'fatihacet';
@@ -17,62 +18,62 @@ describe('toggle replies widget for notes', () => {
const replies = [note, note, note, noteFromOtherUser, noteFromAnotherUser];
- beforeEach(() => {
- ToggleRepliesWidget = Vue.extend(toggleRepliesWidget);
- });
+ const findCollapseToggleButton = () =>
+ wrapper.findByRole('button', { text: ToggleRepliesWidget.i18n.collapseReplies });
+ const findExpandToggleButton = () =>
+ wrapper.findByRole('button', { text: ToggleRepliesWidget.i18n.expandReplies });
+ const findRepliesButton = () => wrapper.findByRole('button', { text: '5 replies' });
+ const findTimeAgoTooltip = () => wrapper.findComponent(TimeAgoTooltip);
+ const findUserAvatarLink = () => wrapper.findAllComponents(UserAvatarLink);
+ const findUserLink = () => wrapper.findByRole('link', { text: noteFromAnotherUser.author.name });
+
+ const mountComponent = ({ collapsed = false }) =>
+ mountExtended(ToggleRepliesWidget, { propsData: { replies, collapsed } });
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
describe('collapsed state', () => {
beforeEach(() => {
- vm = mountComponent(ToggleRepliesWidget, {
- replies,
- collapsed: true,
- });
+ wrapper = mountComponent({ collapsed: true });
});
- it('should render the collapsed', () => {
- const vmTextContent = vm.$el.textContent.replace(/\s\s+/g, ' ');
-
- expect(vm.$el.classList.contains('collapsed')).toEqual(true);
- expect(vm.$el.querySelectorAll('.user-avatar-link').length).toEqual(3);
- expect(vm.$el.querySelector('time')).not.toBeNull();
- expect(vmTextContent).toContain('5 replies');
- expect(vmTextContent).toContain(`Last reply by ${noteFromAnotherUser.author.name}`);
+ it('renders collapsed state elements', () => {
+ expect(findExpandToggleButton().exists()).toBe(true);
+ expect(findUserAvatarLink()).toHaveLength(3);
+ expect(findRepliesButton().exists()).toBe(true);
+ expect(wrapper.text()).toContain('Last reply by');
+ expect(findUserLink().exists()).toBe(true);
+ expect(findTimeAgoTooltip().exists()).toBe(true);
});
- it('should emit toggle event when the replies text clicked', () => {
- const spy = jest.spyOn(vm, '$emit');
+ it('emits "toggle" event when expand toggle button is clicked', () => {
+ findExpandToggleButton().trigger('click');
+
+ expect(wrapper.emitted('toggle')).toEqual([[]]);
+ });
- vm.$el.querySelector('.js-replies-text').click();
+ it('emits "toggle" event when replies button is clicked', () => {
+ findRepliesButton().trigger('click');
- expect(spy).toHaveBeenCalledWith('toggle');
+ expect(wrapper.emitted('toggle')).toEqual([[]]);
});
});
describe('expanded state', () => {
beforeEach(() => {
- vm = mountComponent(ToggleRepliesWidget, {
- replies,
- collapsed: false,
- });
+ wrapper = mountComponent({ collapsed: false });
});
- it('should render expanded state', () => {
- const vmTextContent = vm.$el.textContent.replace(/\s\s+/g, ' ');
-
- expect(vm.$el.querySelector('.collapse-replies-btn')).not.toBeNull();
- expect(vmTextContent).toContain('Collapse replies');
+ it('renders expanded state elements', () => {
+ expect(findCollapseToggleButton().exists()).toBe(true);
});
- it('should emit toggle event when the collapse replies text called', () => {
- const spy = jest.spyOn(vm, '$emit');
-
- vm.$el.querySelector('.js-collapse-replies').click();
+ it('emits "toggle" event when collapse toggle button is clicked', () => {
+ findCollapseToggleButton().trigger('click');
- expect(spy).toHaveBeenCalledWith('toggle');
+ expect(wrapper.emitted('toggle')).toEqual([[]]);
});
});
});
diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js
index 38f29ac2559..02b27eca196 100644
--- a/spec/frontend/notes/stores/actions_spec.js
+++ b/spec/frontend/notes/stores/actions_spec.js
@@ -15,6 +15,7 @@ import * as utils from '~/notes/stores/utils';
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 mrWidgetEventHub from '~/vue_merge_request_widget/event_hub';
+import waitForPromises from 'helpers/wait_for_promises';
import { resetStore } from '../helpers';
import {
discussionMock,
@@ -254,9 +255,7 @@ describe('Actions Notes Store', () => {
jest.advanceTimersByTime(time);
}
- return new Promise((resolve) => {
- requestAnimationFrame(resolve);
- });
+ return waitForPromises();
};
const advanceXMoreIntervals = async (number) => {
const timeoutLength = pollInterval * number;
@@ -365,7 +364,6 @@ describe('Actions Notes Store', () => {
});
it('hides the error display if it exists on success', async () => {
- jest.mock();
failureMock();
await startPolling();
@@ -668,7 +666,6 @@ describe('Actions Notes Store', () => {
describe('updateOrCreateNotes', () => {
it('Prevents `fetchDiscussions` being called multiple times within time limit', () => {
- jest.useFakeTimers();
const note = { id: 1234, type: notesConstants.DIFF_NOTE };
const getters = { notesById: {} };
state = { discussions: [note], notesData: { discussionsPath: '' } };
@@ -1351,7 +1348,7 @@ describe('Actions Notes Store', () => {
return testAction(
actions.fetchDiscussions,
{},
- null,
+ { noteableType: notesConstants.MERGE_REQUEST_NOTEABLE_TYPE },
[
{ type: mutationTypes.ADD_OR_UPDATE_DISCUSSIONS, payload: { discussion } },
{ type: mutationTypes.SET_FETCHING_DISCUSSIONS, payload: false },
@@ -1360,13 +1357,11 @@ describe('Actions Notes Store', () => {
);
});
- it('dispatches `fetchDiscussionsBatch` action if `paginatedIssueDiscussions` feature flag is enabled', () => {
- window.gon = { features: { paginatedIssueDiscussions: true } };
-
+ it('dispatches `fetchDiscussionsBatch` action if noteable is an Issue', () => {
return testAction(
actions.fetchDiscussions,
{ path: 'test-path', filter: 'test-filter', persistFilter: 'test-persist-filter' },
- null,
+ { noteableType: notesConstants.ISSUE_NOTEABLE_TYPE },
[],
[
{
@@ -1389,7 +1384,7 @@ describe('Actions Notes Store', () => {
return testAction(
actions.fetchDiscussions,
{ path: 'test-path', filter: 'test-filter', persistFilter: 'test-persist-filter' },
- null,
+ { noteableType: notesConstants.MERGE_REQUEST_NOTEABLE_TYPE },
[],
[
{
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/details_header_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/details_header_spec.js
index ca666e38291..9982286c625 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/details_header_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/details_header_spec.js
@@ -18,7 +18,6 @@ import {
CLEANUP_SCHEDULED_TOOLTIP,
CLEANUP_ONGOING_TOOLTIP,
CLEANUP_UNFINISHED_TOOLTIP,
- ROOT_IMAGE_TEXT,
ROOT_IMAGE_TOOLTIP,
} from '~/packages_and_registries/container_registry/explorer/constants';
import getContainerRepositoryMetadata from '~/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_metadata.query.graphql';
@@ -35,6 +34,7 @@ describe('Details Header', () => {
canDelete: true,
project: {
visibility: 'public',
+ path: 'path',
containerExpirationPolicy: {
enabled: false,
},
@@ -98,8 +98,8 @@ describe('Details Header', () => {
return waitForPromises();
});
- it('root image ', () => {
- expect(findTitle().text()).toBe(ROOT_IMAGE_TEXT);
+ it('root image shows project path name', () => {
+ expect(findTitle().text()).toBe('path');
});
it('has an icon', () => {
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status_spec.js
index 0581a40b6a2..a5b2b1d7cf8 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status_spec.js
@@ -109,5 +109,17 @@ describe('cleanup_status', () => {
expect(findPopover().findComponent(GlLink).exists()).toBe(true);
expect(findPopover().findComponent(GlLink).attributes('href')).toBe(cleanupPolicyHelpPage);
});
+
+ it('id matches popover target attribute', () => {
+ mountComponent({
+ status: UNFINISHED_STATUS,
+ next_run_at: '2063-04-08T01:44:03Z',
+ });
+
+ const id = findExtraInfoIcon().attributes('id');
+
+ expect(id).toMatch(/status-info-[0-9]+/);
+ expect(findPopover().props('target')).toEqual(id);
+ });
});
});
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
index 979e1500d7d..d12933526bc 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
@@ -1,6 +1,7 @@
-import { GlIcon, GlSprintf, GlSkeletonLoader } from '@gitlab/ui';
+import { GlIcon, GlSprintf, GlSkeletonLoader, GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { mockTracking } from 'helpers/tracking_helper';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import DeleteButton from '~/packages_and_registries/container_registry/explorer/components/delete_button.vue';
import CleanupStatus from '~/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue';
@@ -12,7 +13,6 @@ import {
IMAGE_DELETE_SCHEDULED_STATUS,
IMAGE_MIGRATING_STATE,
SCHEDULED_STATUS,
- ROOT_IMAGE_TEXT,
COPY_IMAGE_PATH_TITLE,
} from '~/packages_and_registries/container_registry/explorer/constants';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
@@ -31,13 +31,15 @@ describe('Image List Row', () => {
const findCleanupStatus = () => wrapper.findComponent(CleanupStatus);
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findListItemComponent = () => wrapper.findComponent(ListItem);
+ const findShowFullPathButton = () => wrapper.findComponent(GlButton);
- const mountComponent = (props) => {
+ const mountComponent = (props, features = {}) => {
wrapper = shallowMount(Component, {
stubs: {
RouterLink,
GlSprintf,
ListItem,
+ GlButton,
},
propsData: {
item,
@@ -45,6 +47,9 @@ describe('Image List Row', () => {
},
provide: {
config: {},
+ glFeatures: {
+ ...features,
+ },
},
directives: {
GlTooltip: createMockDirective(),
@@ -96,10 +101,10 @@ describe('Image List Row', () => {
});
});
- it(`when the image has no name appends ${ROOT_IMAGE_TEXT} to the path`, () => {
+ it('when the image has no name lists the path', () => {
mountComponent({ item: { ...item, name: '' } });
- expect(findDetailsLink().text()).toBe(`${item.path}/ ${ROOT_IMAGE_TEXT}`);
+ expect(findDetailsLink().text()).toBe(item.path);
});
it('contains a clipboard button', () => {
@@ -144,6 +149,35 @@ describe('Image List Row', () => {
expect(findClipboardButton().attributes('disabled')).toBe('true');
});
});
+
+ describe('when containerRegistryShowShortenedPath feature enabled', () => {
+ let trackingSpy;
+
+ beforeEach(() => {
+ mountComponent({}, { containerRegistryShowShortenedPath: true });
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ it('renders shortened name of image', () => {
+ expect(findShowFullPathButton().exists()).toBe(true);
+ expect(findDetailsLink().text()).toBe('gitlab-test/rails-12009');
+ });
+
+ it('clicking on shortened name of image hides the button & shows full path', async () => {
+ const btn = findShowFullPathButton();
+ const mockFocusFn = jest.fn();
+ wrapper.vm.$refs.imageName.$el.focus = mockFocusFn;
+
+ await btn.trigger('click');
+
+ expect(findShowFullPathButton().exists()).toBe(false);
+ expect(findDetailsLink().text()).toBe(item.path);
+ expect(mockFocusFn).toHaveBeenCalled();
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_show_full_path', {
+ label: 'registry_image_list',
+ });
+ });
+ });
});
describe('delete button', () => {
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js b/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js
index 7e6f88fe5bc..f9739509ef9 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js
@@ -11,6 +11,10 @@ export const imagesListResponse = [
createdAt: '2020-11-03T13:29:21Z',
expirationPolicyStartedAt: null,
expirationPolicyCleanupStatus: 'UNSCHEDULED',
+ project: {
+ id: 'gid://gitlab/Project/22',
+ path: 'gitlab-test',
+ },
},
{
__typename: 'ContainerRepository',
@@ -24,6 +28,10 @@ export const imagesListResponse = [
createdAt: '2020-09-21T06:57:43Z',
expirationPolicyStartedAt: null,
expirationPolicyCleanupStatus: 'UNSCHEDULED',
+ project: {
+ id: 'gid://gitlab/Project/22',
+ path: 'gitlab-test',
+ },
},
];
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/pages/details_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/pages/details_spec.js
index 59ca47bee50..1d161888a4d 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/pages/details_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/pages/details_spec.js
@@ -20,7 +20,6 @@ import {
ALERT_DANGER_IMAGE,
ALERT_DANGER_IMPORTING,
MISSING_OR_DELETED_IMAGE_BREADCRUMB,
- ROOT_IMAGE_TEXT,
MISSING_OR_DELETED_IMAGE_TITLE,
MISSING_OR_DELETED_IMAGE_MESSAGE,
} from '~/packages_and_registries/container_registry/explorer/constants';
@@ -482,7 +481,7 @@ describe('Details Page', () => {
expect(breadCrumbState.updateName).toHaveBeenCalledWith(MISSING_OR_DELETED_IMAGE_BREADCRUMB);
});
- it(`when the image has no name set the breadcrumb to ${ROOT_IMAGE_TEXT}`, async () => {
+ it(`when the image has no name set the breadcrumb to project name`, async () => {
mountComponent({
resolver: jest
.fn()
@@ -491,7 +490,7 @@ describe('Details Page', () => {
await waitForApolloRequestRender();
- expect(breadCrumbState.updateName).toHaveBeenCalledWith(ROOT_IMAGE_TEXT);
+ expect(breadCrumbState.updateName).toHaveBeenCalledWith('gitlab-test');
});
});
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
index fe4a2c06f1c..f2901148e17 100644
--- a/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
+++ b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
@@ -38,6 +38,8 @@ const dummyGon = {
let originalGon;
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${dummyGrouptId}/dependency_proxy/cache`;
+Vue.use(VueApollo);
+
describe('DependencyProxyApp', () => {
let wrapper;
let apolloProvider;
@@ -51,8 +53,6 @@ describe('DependencyProxyApp', () => {
};
function createComponent({ provide = provideDefaults } = {}) {
- Vue.use(VueApollo);
-
const requestHandlers = [[getDependencyProxyDetailsQuery, resolver]];
apolloProvider = createMockApollo(requestHandlers);
@@ -103,19 +103,21 @@ describe('DependencyProxyApp', () => {
describe('when the dependency proxy is available', () => {
describe('when is loading', () => {
- beforeEach(() => {
+ it('renders the skeleton loader', () => {
createComponent();
- });
- it('renders the skeleton loader', () => {
expect(findSkeletonLoader().exists()).toBe(true);
});
it('does not render a form group with label', () => {
+ createComponent();
+
expect(findFormGroup().exists()).toBe(false);
});
it('does not show the main section', () => {
+ createComponent();
+
expect(findMainArea().exists()).toBe(false);
});
});
@@ -215,23 +217,26 @@ describe('DependencyProxyApp', () => {
});
describe('triggering page event on list', () => {
- beforeEach(async () => {
+ it('re-renders the skeleton loader', async () => {
findManifestList().vm.$emit('next-page');
-
await nextTick();
- });
- it('re-renders the skeleton loader', () => {
expect(findSkeletonLoader().exists()).toBe(true);
});
- it('renders form group with label', () => {
+ it('renders form group with label', async () => {
+ findManifestList().vm.$emit('next-page');
+ await nextTick();
+
expect(findFormGroup().attributes('label')).toEqual(
expect.stringMatching(DependencyProxyApp.i18n.proxyImagePrefix),
);
});
- it('does not show the main section', () => {
+ it('does not show the main section', async () => {
+ findManifestList().vm.$emit('next-page');
+ await nextTick();
+
expect(findMainArea().exists()).toBe(false);
});
});
diff --git a/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js
index e60989b0949..9d4c7f4737b 100644
--- a/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js
@@ -6,13 +6,15 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import component from '~/packages_and_registries/settings/group/components/dependency_proxy_settings.vue';
-import { DEPENDENCY_PROXY_HEADER } from '~/packages_and_registries/settings/group/constants';
+import {
+ DEPENDENCY_PROXY_HEADER,
+ DEPENDENCY_PROXY_DESCRIPTION,
+} from '~/packages_and_registries/settings/group/constants';
import updateDependencyProxySettings from '~/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql';
import updateDependencyProxyImageTtlGroupPolicy from '~/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_image_ttl_group_policy.mutation.graphql';
import getGroupPackagesSettingsQuery from '~/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql';
import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
-import SettingsTitles from '~/packages_and_registries/settings/group/components/settings_titles.vue';
import {
updateGroupDependencyProxySettingsOptimisticResponse,
updateDependencyProxyImageTtlGroupPolicyOptimisticResponse,
@@ -36,7 +38,6 @@ describe('DependencyProxySettings', () => {
let updateTtlPoliciesMutationResolver;
const defaultProvide = {
- defaultExpanded: false,
groupPath: 'foo_group_path',
groupDependencyProxyPath: 'group_dependency_proxy_path',
};
@@ -86,7 +87,6 @@ describe('DependencyProxySettings', () => {
});
const findSettingsBlock = () => wrapper.findComponent(SettingsBlock);
- const findSettingsTitles = () => wrapper.findComponent(SettingsTitles);
const findEnableProxyToggle = () => wrapper.findByTestId('dependency-proxy-setting-toggle');
const findEnableTtlPoliciesToggle = () =>
wrapper.findByTestId('dependency-proxy-ttl-policies-toggle');
@@ -108,16 +108,11 @@ describe('DependencyProxySettings', () => {
expect(findSettingsBlock().exists()).toBe(true);
});
- it('passes the correct props to settings block', () => {
- mountComponent();
-
- expect(findSettingsBlock().props('defaultExpanded')).toBe(false);
- });
-
- it('has the correct header text', () => {
+ it('has the correct header text and description', () => {
mountComponent();
expect(wrapper.text()).toContain(DEPENDENCY_PROXY_HEADER);
+ expect(wrapper.text()).toContain(DEPENDENCY_PROXY_DESCRIPTION);
});
describe('enable toggle', () => {
@@ -158,14 +153,6 @@ describe('DependencyProxySettings', () => {
});
describe('storage settings', () => {
- it('the component has the settings title', () => {
- mountComponent();
-
- expect(findSettingsTitles().props()).toMatchObject({
- title: component.i18n.storageSettingsTitle,
- });
- });
-
describe('enable proxy ttl policies', () => {
it('exists', () => {
mountComponent();
diff --git a/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js
index 79c2f811c08..3eecdeb5b1f 100644
--- a/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js
@@ -4,8 +4,6 @@ import component from '~/packages_and_registries/settings/group/components/dupli
import {
DUPLICATES_TOGGLE_LABEL,
- DUPLICATES_ALLOWED_ENABLED,
- DUPLICATES_ALLOWED_DISABLED,
DUPLICATES_SETTING_EXCEPTION_TITLE,
DUPLICATES_SETTINGS_EXCEPTION_LEGEND,
} from '~/packages_and_registries/settings/group/constants';
@@ -36,7 +34,6 @@ describe('Duplicates Settings', () => {
});
const findToggle = () => wrapper.findComponent(GlToggle);
- const findToggleLabel = () => wrapper.find('[data-testid="toggle-label"');
const findInputGroup = () => wrapper.findComponent(GlFormGroup);
const findInput = () => wrapper.findComponent(GlFormInput);
@@ -47,7 +44,7 @@ describe('Duplicates Settings', () => {
expect(findToggle().exists()).toBe(true);
expect(findToggle().props()).toMatchObject({
label: DUPLICATES_TOGGLE_LABEL,
- value: defaultProps.duplicatesAllowed,
+ value: !defaultProps.duplicatesAllowed,
});
});
@@ -57,18 +54,11 @@ describe('Duplicates Settings', () => {
findToggle().vm.$emit('change', false);
expect(wrapper.emitted('update')).toStrictEqual([
- [{ [defaultProps.modelNames.allowed]: false }],
+ [{ [defaultProps.modelNames.allowed]: true }],
]);
});
describe('when the duplicates are disabled', () => {
- it('the toggle has the disabled message', () => {
- mountComponent();
-
- expect(findToggleLabel().exists()).toBe(true);
- expect(findToggleLabel().text()).toMatchInterpolatedText(DUPLICATES_ALLOWED_DISABLED);
- });
-
it('shows a form group with an input field', () => {
mountComponent();
@@ -130,13 +120,6 @@ describe('Duplicates Settings', () => {
});
describe('when the duplicates are enabled', () => {
- it('has the correct toggle label', () => {
- mountComponent({ ...defaultProps, duplicatesAllowed: true });
-
- expect(findToggleLabel().exists()).toBe(true);
- expect(findToggleLabel().text()).toMatchInterpolatedText(DUPLICATES_ALLOWED_ENABLED);
- });
-
it('hides the form input group', () => {
mountComponent({ ...defaultProps, duplicatesAllowed: 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 635195ff0a4..31fc3ad419c 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
@@ -26,7 +26,6 @@ describe('Group Settings App', () => {
let show;
const defaultProvide = {
- defaultExpanded: false,
groupPath: 'foo_group_path',
};
diff --git a/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js
index d92d42e7834..274930ce668 100644
--- a/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js
@@ -1,4 +1,3 @@
-import { GlSprintf, GlLink } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
@@ -11,7 +10,6 @@ import MavenSettings from '~/packages_and_registries/settings/group/components/m
import {
PACKAGE_SETTINGS_HEADER,
PACKAGE_SETTINGS_DESCRIPTION,
- PACKAGES_DOCS_PATH,
} from '~/packages_and_registries/settings/group/constants';
import updateNamespacePackageSettings from '~/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql';
@@ -33,7 +31,6 @@ describe('Packages Settings', () => {
let apolloProvider;
const defaultProvide = {
- defaultExpanded: false,
groupPath: 'foo_group_path',
};
@@ -53,7 +50,6 @@ describe('Packages Settings', () => {
packageSettings: packageSettings(),
},
stubs: {
- GlSprintf,
SettingsBlock,
MavenSettings,
GenericSettings,
@@ -67,7 +63,6 @@ describe('Packages Settings', () => {
const findSettingsBlock = () => wrapper.findComponent(SettingsBlock);
const findDescription = () => wrapper.findByTestId('description');
- const findLink = () => wrapper.findComponent(GlLink);
const findMavenSettings = () => wrapper.findComponent(MavenSettings);
const findMavenDuplicatedSettings = () => findMavenSettings().findComponent(DuplicatesSettings);
const findGenericSettings = () => wrapper.findComponent(GenericSettings);
@@ -97,12 +92,6 @@ describe('Packages Settings', () => {
expect(findSettingsBlock().exists()).toBe(true);
});
- it('passes the correct props to settings block', () => {
- mountComponent();
-
- expect(findSettingsBlock().props('defaultExpanded')).toBe(false);
- });
-
it('has the correct header text', () => {
mountComponent();
@@ -115,16 +104,6 @@ describe('Packages Settings', () => {
expect(findDescription().text()).toMatchInterpolatedText(PACKAGE_SETTINGS_DESCRIPTION);
});
- it('has the correct link', () => {
- mountComponent();
-
- expect(findLink().attributes()).toMatchObject({
- href: PACKAGES_DOCS_PATH,
- target: '_blank',
- });
- expect(findLink().text()).toBe('Learn more.');
- });
-
describe('maven settings', () => {
it('exists', () => {
mountComponent();
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/container_expiration_policy_form_spec.js.snap b/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/container_expiration_policy_form_spec.js.snap
index faa313118f3..108d9478788 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/container_expiration_policy_form_spec.js.snap
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/container_expiration_policy_form_spec.js.snap
@@ -4,6 +4,7 @@ exports[`Container Expiration Policy Settings Form Cadence matches snapshot 1`]
<expiration-dropdown-stub
class="gl-mr-7 gl-mb-0!"
data-testid="cadence-dropdown"
+ description=""
formoptions="[object Object],[object Object],[object Object],[object Object],[object Object]"
label="Run cleanup:"
name="cadence"
@@ -22,6 +23,7 @@ exports[`Container Expiration Policy Settings Form Enable matches snapshot 1`] =
exports[`Container Expiration Policy Settings Form Keep N matches snapshot 1`] = `
<expiration-dropdown-stub
data-testid="keep-n-dropdown"
+ description=""
formoptions="[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
label="Keep the most recent:"
name="keep-n"
@@ -44,6 +46,7 @@ exports[`Container Expiration Policy Settings Form Keep Regex matches snapshot 1
exports[`Container Expiration Policy Settings Form OlderThan matches snapshot 1`] = `
<expiration-dropdown-stub
data-testid="older-than-dropdown"
+ description=""
formoptions="[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
label="Remove tags older than:"
name="older-than"
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/container_expiration_policy_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/container_expiration_policy_spec.js
index aa3506771fa..d83c717da6a 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/container_expiration_policy_spec.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/container_expiration_policy_spec.js
@@ -43,11 +43,6 @@ describe('Container expiration policy project settings', () => {
GlSprintf,
SettingsBlock,
},
- mocks: {
- $toast: {
- show: jest.fn(),
- },
- },
provide,
...config,
});
@@ -98,7 +93,7 @@ describe('Container expiration policy project settings', () => {
await waitForPromises();
expect(findFormComponent().exists()).toBe(true);
- expect(findSettingsBlock().props('collapsible')).toBe(false);
+ expect(findSettingsBlock().exists()).toBe(true);
});
describe('the form is disabled', () => {
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/expiration_dropdown_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/expiration_dropdown_spec.js
index 5c9ade7f785..8b99ac6b06c 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/expiration_dropdown_spec.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/expiration_dropdown_spec.js
@@ -16,6 +16,7 @@ describe('ExpirationDropdown', () => {
const findFormSelect = () => wrapper.find(GlFormSelect);
const findFormGroup = () => wrapper.find(GlFormGroup);
+ const findDescription = () => wrapper.find('[data-testid="description"]');
const findOptions = () => wrapper.findAll('[data-testid="option"]');
const mountComponent = (props) => {
@@ -47,6 +48,14 @@ describe('ExpirationDropdown', () => {
expect(findOptions()).toHaveLength(defaultProps.formOptions.length);
});
+
+ it('renders the description if passed', () => {
+ mountComponent({
+ description: 'test description',
+ });
+
+ expect(findDescription().html()).toContain('test description');
+ });
});
describe('model', () => {
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_form_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_form_spec.js
new file mode 100644
index 00000000000..86f45d78bae
--- /dev/null
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_form_spec.js
@@ -0,0 +1,267 @@
+import VueApollo from 'vue-apollo';
+import Vue from 'vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { GlLoadingIcon } from 'jest/packages_and_registries/shared/stubs';
+import component from '~/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue';
+import {
+ UPDATE_SETTINGS_ERROR_MESSAGE,
+ UPDATE_SETTINGS_SUCCESS_MESSAGE,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_LABEL,
+ KEEP_N_DUPLICATED_PACKAGE_FILES_DESCRIPTION,
+} from '~/packages_and_registries/settings/project/constants';
+import updatePackagesCleanupPolicyMutation from '~/packages_and_registries/settings/project/graphql/mutations/update_packages_cleanup_policy.mutation.graphql';
+import Tracking from '~/tracking';
+import { packagesCleanupPolicyPayload, packagesCleanupPolicyMutationPayload } from '../mock_data';
+
+Vue.use(VueApollo);
+
+describe('Packages Cleanup Policy Settings Form', () => {
+ let wrapper;
+ let fakeApollo;
+
+ const defaultProvidedValues = {
+ projectPath: 'path',
+ };
+
+ const {
+ data: {
+ project: { packagesCleanupPolicy },
+ },
+ } = packagesCleanupPolicyPayload();
+
+ const defaultProps = {
+ value: { ...packagesCleanupPolicy },
+ };
+
+ const trackingPayload = {
+ label: 'packages_cleanup_policies',
+ };
+
+ const findForm = () => wrapper.find({ ref: 'form-element' });
+ const findSaveButton = () => wrapper.findByTestId('save-button');
+ const findKeepNDuplicatedPackageFilesDropdown = () =>
+ wrapper.findByTestId('keep-n-duplicated-package-files-dropdown');
+
+ const submitForm = async () => {
+ findForm().trigger('submit');
+ return waitForPromises();
+ };
+
+ const mountComponent = ({
+ props = defaultProps,
+ data,
+ config,
+ provide = defaultProvidedValues,
+ } = {}) => {
+ wrapper = shallowMountExtended(component, {
+ stubs: {
+ GlLoadingIcon,
+ },
+ propsData: { ...props },
+ provide,
+ data() {
+ return {
+ ...data,
+ };
+ },
+ mocks: {
+ $toast: {
+ show: jest.fn(),
+ },
+ },
+ ...config,
+ });
+ };
+
+ const mountComponentWithApollo = ({
+ provide = defaultProvidedValues,
+ mutationResolver,
+ queryPayload = packagesCleanupPolicyPayload(),
+ } = {}) => {
+ const requestHandlers = [[updatePackagesCleanupPolicyMutation, mutationResolver]];
+
+ fakeApollo = createMockApollo(requestHandlers);
+
+ const {
+ data: {
+ project: { packagesCleanupPolicy: value },
+ },
+ } = queryPayload;
+
+ mountComponent({
+ provide,
+ props: {
+ ...defaultProps,
+ value,
+ },
+ config: {
+ apolloProvider: fakeApollo,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ jest.spyOn(Tracking, 'event');
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ fakeApollo = null;
+ });
+
+ describe('keepNDuplicatedPackageFiles', () => {
+ it('renders dropdown', () => {
+ mountComponent();
+
+ const element = findKeepNDuplicatedPackageFilesDropdown();
+
+ expect(element.exists()).toBe(true);
+ expect(element.props('label')).toMatchInterpolatedText(KEEP_N_DUPLICATED_PACKAGE_FILES_LABEL);
+ expect(element.props('description')).toEqual(KEEP_N_DUPLICATED_PACKAGE_FILES_DESCRIPTION);
+ });
+
+ it('input event triggers a model update', () => {
+ mountComponent();
+
+ findKeepNDuplicatedPackageFilesDropdown().vm.$emit('input', 'foo');
+ expect(wrapper.emitted('input')[0][0]).toMatchObject({
+ keepNDuplicatedPackageFiles: 'foo',
+ });
+ });
+
+ it('shows the default option when none are selected', () => {
+ mountComponent({ props: { value: {} } });
+ expect(findKeepNDuplicatedPackageFilesDropdown().props('value')).toEqual('ALL_PACKAGE_FILES');
+ });
+
+ it.each`
+ isLoading | mutationLoading
+ ${true} | ${false}
+ ${true} | ${true}
+ ${false} | ${true}
+ `(
+ 'is disabled when is loading is $isLoading and mutationLoading is $mutationLoading',
+ ({ isLoading, mutationLoading }) => {
+ mountComponent({
+ props: { isLoading, value: {} },
+ data: { mutationLoading },
+ });
+ expect(findKeepNDuplicatedPackageFilesDropdown().props('disabled')).toEqual(true);
+ },
+ );
+
+ it('has the correct formOptions', () => {
+ mountComponent();
+ expect(findKeepNDuplicatedPackageFilesDropdown().props('formOptions')).toEqual(
+ wrapper.vm.$options.formOptions.keepNDuplicatedPackageFiles,
+ );
+ });
+ });
+
+ describe('form', () => {
+ describe('actions', () => {
+ describe('submit button', () => {
+ it('has type submit', () => {
+ mountComponent();
+
+ expect(findSaveButton().attributes('type')).toBe('submit');
+ });
+
+ it.each`
+ isLoading | mutationLoading | disabled
+ ${true} | ${true} | ${true}
+ ${true} | ${false} | ${true}
+ ${false} | ${true} | ${true}
+ ${false} | ${false} | ${false}
+ `(
+ 'when isLoading is $isLoading and mutationLoading is $mutationLoading is disabled',
+ ({ isLoading, mutationLoading, disabled }) => {
+ mountComponent({
+ props: { ...defaultProps, isLoading },
+ data: { mutationLoading },
+ });
+
+ expect(findSaveButton().props('disabled')).toBe(disabled);
+ expect(findKeepNDuplicatedPackageFilesDropdown().props('disabled')).toBe(disabled);
+ },
+ );
+
+ it.each`
+ isLoading | mutationLoading | showLoading
+ ${true} | ${true} | ${true}
+ ${true} | ${false} | ${true}
+ ${false} | ${true} | ${true}
+ ${false} | ${false} | ${false}
+ `(
+ 'when isLoading is $isLoading and mutationLoading is $mutationLoading is $showLoading that the loading icon is shown',
+ ({ isLoading, mutationLoading, showLoading }) => {
+ mountComponent({
+ props: { ...defaultProps, isLoading },
+ data: { mutationLoading },
+ });
+
+ expect(findSaveButton().props('loading')).toBe(showLoading);
+ },
+ );
+ });
+ });
+
+ describe('form submit event', () => {
+ it('dispatches the correct apollo mutation', () => {
+ const mutationResolver = jest
+ .fn()
+ .mockResolvedValue(packagesCleanupPolicyMutationPayload());
+ mountComponentWithApollo({
+ mutationResolver,
+ });
+
+ findForm().trigger('submit');
+
+ expect(mutationResolver).toHaveBeenCalledWith({
+ input: {
+ keepNDuplicatedPackageFiles: 'ALL_PACKAGE_FILES',
+ projectPath: 'path',
+ },
+ });
+ });
+
+ it('tracks the submit event', () => {
+ mountComponentWithApollo({
+ mutationResolver: jest.fn().mockResolvedValue(packagesCleanupPolicyMutationPayload()),
+ });
+
+ findForm().trigger('submit');
+
+ expect(Tracking.event).toHaveBeenCalledWith(
+ undefined,
+ 'submit_packages_cleanup_form',
+ trackingPayload,
+ );
+ });
+
+ it('show a success toast when submit succeed', async () => {
+ mountComponentWithApollo({
+ mutationResolver: jest.fn().mockResolvedValue(packagesCleanupPolicyMutationPayload()),
+ });
+
+ await submitForm();
+
+ expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(UPDATE_SETTINGS_SUCCESS_MESSAGE);
+ });
+
+ describe('when submit fails', () => {
+ it('shows an error', async () => {
+ mountComponentWithApollo({
+ mutationResolver: jest.fn().mockRejectedValue(packagesCleanupPolicyMutationPayload()),
+ });
+
+ await submitForm();
+
+ expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(UPDATE_SETTINGS_ERROR_MESSAGE);
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_spec.js
new file mode 100644
index 00000000000..6dfeeca6862
--- /dev/null
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/packages_cleanup_policy_spec.js
@@ -0,0 +1,81 @@
+import { GlAlert, GlSprintf } 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 component from '~/packages_and_registries/settings/project/components/packages_cleanup_policy.vue';
+import PackagesCleanupPolicyForm from '~/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue';
+import { FETCH_SETTINGS_ERROR_MESSAGE } from '~/packages_and_registries/settings/project/constants';
+import packagesCleanupPolicyQuery from '~/packages_and_registries/settings/project/graphql/queries/get_packages_cleanup_policy.query.graphql';
+import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
+
+import { packagesCleanupPolicyPayload, packagesCleanupPolicyData } from '../mock_data';
+
+Vue.use(VueApollo);
+
+describe('Packages cleanup policy project settings', () => {
+ let wrapper;
+ let fakeApollo;
+
+ const defaultProvidedValues = {
+ projectPath: 'path',
+ };
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findFormComponent = () => wrapper.findComponent(PackagesCleanupPolicyForm);
+ const findSettingsBlock = () => wrapper.findComponent(SettingsBlock);
+
+ const mountComponent = (provide = defaultProvidedValues, config) => {
+ wrapper = shallowMount(component, {
+ stubs: {
+ GlSprintf,
+ SettingsBlock,
+ },
+ provide,
+ ...config,
+ });
+ };
+
+ const mountComponentWithApollo = ({ provide = defaultProvidedValues, resolver } = {}) => {
+ const requestHandlers = [[packagesCleanupPolicyQuery, resolver]];
+
+ fakeApollo = createMockApollo(requestHandlers);
+ mountComponent(provide, {
+ apolloProvider: fakeApollo,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ fakeApollo = null;
+ });
+
+ it('renders the setting form', async () => {
+ mountComponentWithApollo({
+ resolver: jest.fn().mockResolvedValue(packagesCleanupPolicyPayload()),
+ });
+ await waitForPromises();
+
+ expect(findFormComponent().exists()).toBe(true);
+ expect(findFormComponent().props('value')).toEqual(packagesCleanupPolicyData);
+ expect(findSettingsBlock().exists()).toBe(true);
+ });
+
+ describe('fetchSettingsError', () => {
+ beforeEach(async () => {
+ mountComponentWithApollo({
+ resolver: jest.fn().mockRejectedValue(new Error('GraphQL error')),
+ });
+ await waitForPromises();
+ });
+
+ it('the form is hidden', () => {
+ expect(findFormComponent().exists()).toBe(false);
+ });
+
+ it('shows an alert', () => {
+ expect(findAlert().html()).toContain(FETCH_SETTINGS_ERROR_MESSAGE);
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js
index 337991dfae0..f576bc79eae 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js
@@ -1,19 +1,41 @@
import { shallowMount } from '@vue/test-utils';
import component from '~/packages_and_registries/settings/project/components/registry_settings_app.vue';
import ContainerExpirationPolicy from '~/packages_and_registries/settings/project/components/container_expiration_policy.vue';
+import PackagesCleanupPolicy from '~/packages_and_registries/settings/project/components/packages_cleanup_policy.vue';
describe('Registry Settings app', () => {
let wrapper;
+
const findContainerExpirationPolicy = () => wrapper.find(ContainerExpirationPolicy);
+ const findPackagesCleanupPolicy = () => wrapper.find(PackagesCleanupPolicy);
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
- it('renders container expiration policy component', () => {
- wrapper = shallowMount(component);
+ const mountComponent = (provide) => {
+ wrapper = shallowMount(component, {
+ provide,
+ });
+ };
- expect(findContainerExpirationPolicy().exists()).toBe(true);
- });
+ it.each`
+ showContainerRegistrySettings | showPackageRegistrySettings
+ ${true} | ${false}
+ ${true} | ${true}
+ ${false} | ${true}
+ ${false} | ${false}
+ `(
+ 'container expiration policy $showContainerRegistrySettings and package cleanup policy is $showPackageRegistrySettings',
+ ({ showContainerRegistrySettings, showPackageRegistrySettings }) => {
+ mountComponent({
+ showContainerRegistrySettings,
+ showPackageRegistrySettings,
+ });
+
+ expect(findContainerExpirationPolicy().exists()).toBe(showContainerRegistrySettings);
+ expect(findPackagesCleanupPolicy().exists()).toBe(showPackageRegistrySettings);
+ },
+ );
});
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/mock_data.js b/spec/frontend/packages_and_registries/settings/project/settings/mock_data.js
index 33406c98f4b..d4b6c66ddeb 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/mock_data.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/mock_data.js
@@ -40,3 +40,33 @@ export const expirationPolicyMutationPayload = ({ override, errors = [] } = {})
},
},
});
+
+export const packagesCleanupPolicyData = {
+ keepNDuplicatedPackageFiles: 'ALL_PACKAGE_FILES',
+ nextRunAt: '2020-11-19T07:37:03.941Z',
+};
+
+export const packagesCleanupPolicyPayload = (override) => ({
+ data: {
+ project: {
+ id: '1',
+ packagesCleanupPolicy: {
+ __typename: 'PackagesCleanupPolicy',
+ ...packagesCleanupPolicyData,
+ ...override,
+ },
+ },
+ },
+});
+
+export const packagesCleanupPolicyMutationPayload = ({ override, errors = [] } = {}) => ({
+ data: {
+ updatePackagesCleanupPolicy: {
+ packagesCleanupPolicy: {
+ ...packagesCleanupPolicyData,
+ ...override,
+ },
+ errors,
+ },
+ },
+});
diff --git a/spec/frontend/packages_and_registries/shared/components/settings_block_spec.js b/spec/frontend/packages_and_registries/shared/components/settings_block_spec.js
new file mode 100644
index 00000000000..a4c1b989dac
--- /dev/null
+++ b/spec/frontend/packages_and_registries/shared/components/settings_block_spec.js
@@ -0,0 +1,43 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import SettingsBlock from '~/packages_and_registries/shared/components/settings_block.vue';
+
+describe('SettingsBlock', () => {
+ let wrapper;
+
+ const mountComponent = (propsData) => {
+ wrapper = shallowMountExtended(SettingsBlock, {
+ propsData,
+ slots: {
+ title: '<div data-testid="title-slot"></div>',
+ description: '<div data-testid="description-slot"></div>',
+ default: '<div data-testid="default-slot"></div>',
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findDefaultSlot = () => wrapper.findByTestId('default-slot');
+ const findTitleSlot = () => wrapper.findByTestId('title-slot');
+ const findDescriptionSlot = () => wrapper.findByTestId('description-slot');
+
+ it('has a default slot', () => {
+ mountComponent();
+
+ expect(findDefaultSlot().exists()).toBe(true);
+ });
+
+ it('has a title slot', () => {
+ mountComponent();
+
+ expect(findTitleSlot().exists()).toBe(true);
+ });
+
+ it('has a description slot', () => {
+ mountComponent();
+
+ expect(findDescriptionSlot().exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/pages/dashboard/todos/index/todos_spec.js b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
index 3a9b59f291c..03aed7454e3 100644
--- a/spec/frontend/pages/dashboard/todos/index/todos_spec.js
+++ b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
@@ -1,5 +1,4 @@
import MockAdapter from 'axios-mock-adapter';
-import $ from 'jquery';
import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import '~/lib/utils/common_utils';
@@ -54,22 +53,28 @@ describe('Todos', () => {
let metakeyEvent;
beforeEach(() => {
- metakeyEvent = $.Event('click', { keyCode: 91, ctrlKey: true });
+ metakeyEvent = new MouseEvent('click', { ctrlKey: true });
windowOpenSpy = jest.spyOn(window, 'open').mockImplementation(() => {});
});
it('opens the todo url in another tab', () => {
const todoLink = todoItem.dataset.url;
- $('.todos-list .todo').trigger(metakeyEvent);
+ document.querySelectorAll('.todos-list .todo').forEach((el) => {
+ el.dispatchEvent(metakeyEvent);
+ });
expect(visitUrl).not.toHaveBeenCalled();
expect(windowOpenSpy).toHaveBeenCalledWith(todoLink, '_blank');
});
it('run native funcionality when avatar is clicked', () => {
- $('.todos-list a').on('click', (e) => e.preventDefault());
- $('.todos-list img').trigger(metakeyEvent);
+ document.querySelectorAll('.todos-list a').forEach((el) => {
+ el.addEventListener('click', (e) => e.preventDefault());
+ });
+ document.querySelectorAll('.todos-list img').forEach((el) => {
+ el.dispatchEvent(metakeyEvent);
+ });
expect(visitUrl).not.toHaveBeenCalled();
expect(windowOpenSpy).not.toHaveBeenCalled();
@@ -88,7 +93,7 @@ describe('Todos', () => {
.onDelete(path)
.replyOnce(200, { count: TEST_COUNT_BIG, done_count: TEST_DONE_COUNT_BIG });
onToggleSpy = jest.fn();
- $(document).on('todo:toggle', onToggleSpy);
+ document.addEventListener('todo:toggle', onToggleSpy);
// Act
el.click();
@@ -98,7 +103,13 @@ describe('Todos', () => {
});
it('dispatches todo:toggle', () => {
- expect(onToggleSpy).toHaveBeenCalledWith(expect.anything(), TEST_COUNT_BIG);
+ expect(onToggleSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ detail: {
+ count: TEST_COUNT_BIG,
+ },
+ }),
+ );
});
it('updates pending text', () => {
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 efbfd83a071..2a0fde45384 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
@@ -400,10 +400,6 @@ describe('ForkForm component', () => {
);
};
- beforeEach(() => {
- setupComponent();
- });
-
const selectedMockNamespaceIndex = 1;
const namespaceId = MOCK_NAMESPACES_RESPONSE[selectedMockNamespaceIndex].id;
@@ -425,10 +421,14 @@ describe('ForkForm component', () => {
it('does not make POST request', async () => {
jest.spyOn(axios, 'post');
+ setupComponent();
+
expect(axios.post).not.toHaveBeenCalled();
});
it('does not redirect the current page', async () => {
+ setupComponent();
+
await submitForm();
expect(urlUtility.redirectTo).not.toHaveBeenCalled();
@@ -452,13 +452,10 @@ describe('ForkForm component', () => {
});
describe('with valid form', () => {
- beforeEach(() => {
- fillForm();
- });
-
it('make POST request with project param', async () => {
jest.spyOn(axios, 'post');
+ setupComponent();
await submitForm();
const {
@@ -486,6 +483,7 @@ describe('ForkForm component', () => {
const webUrl = `new/fork-project`;
jest.spyOn(axios, 'post').mockResolvedValue({ data: { web_url: webUrl } });
+ setupComponent();
await submitForm();
expect(urlUtility.redirectTo).toHaveBeenCalledWith(webUrl);
@@ -496,6 +494,7 @@ describe('ForkForm component', () => {
jest.spyOn(axios, 'post').mockRejectedValue(dummyError);
+ setupComponent();
await submitForm();
expect(urlUtility.redirectTo).not.toHaveBeenCalled();
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap
index 005b8968383..aab78c99190 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap
+++ b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap
@@ -85,8 +85,6 @@ exports[`Learn GitLab renders correctly 1`] = `
<div
class="gl-mb-4"
>
- <!---->
-
<div
class="flex align-items-center"
>
@@ -105,7 +103,8 @@ exports[`Learn GitLab renders correctly 1`] = `
</svg>
Invite your colleagues
-
+
+ <!---->
</span>
<!---->
@@ -114,8 +113,6 @@ exports[`Learn GitLab renders correctly 1`] = `
<div
class="gl-mb-4"
>
- <!---->
-
<div
class="flex align-items-center"
>
@@ -133,8 +130,9 @@ exports[`Learn GitLab renders correctly 1`] = `
/>
</svg>
- Create or import a repository
-
+ Create a repository
+
+ <!---->
</span>
<!---->
@@ -143,23 +141,23 @@ exports[`Learn GitLab renders correctly 1`] = `
<div
class="gl-mb-4"
>
- <!---->
-
<div
class="flex align-items-center"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Set up CI/CD"
- href="http://example.com/"
- target="_self"
- >
-
- Set up CI/CD
-
- </a>
+ <div>
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="set_up_your_first_project_s_ci_cd"
+ href="http://example.com/"
+ target="_self"
+ >
+ Set up your first project's CI/CD
+ </a>
+
+ <!---->
+ </div>
<!---->
</div>
@@ -167,24 +165,24 @@ exports[`Learn GitLab renders correctly 1`] = `
<div
class="gl-mb-4"
>
- <!---->
-
<div
class="flex align-items-center"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Start a free Ultimate trial"
- href="http://example.com/"
- rel="noopener noreferrer"
- target="_blank"
- >
-
- Start a free Ultimate trial
-
- </a>
+ <div>
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="start_a_free_trial_of_gitlab_ultimate"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Start a free trial of GitLab Ultimate
+ </a>
+
+ <!---->
+ </div>
<!---->
</div>
@@ -193,30 +191,30 @@ exports[`Learn GitLab renders correctly 1`] = `
class="gl-mb-4"
>
<div
- class="gl-font-style-italic gl-text-gray-500"
- data-testid="trial-only"
- >
-
- Trial only
-
- </div>
-
- <div
class="flex align-items-center"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Add code owners"
- href="http://example.com/"
- rel="noopener noreferrer"
- target="_blank"
- >
-
- Add code owners
-
- </a>
+ <div>
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="add_code_owners"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Add code owners
+ </a>
+
+ <span
+ class="gl-font-style-italic gl-text-gray-500"
+ data-testid="trial-only"
+ >
+
+ - Included in trial
+
+ </span>
+ </div>
<!---->
</div>
@@ -225,30 +223,30 @@ exports[`Learn GitLab renders correctly 1`] = `
class="gl-mb-4"
>
<div
- class="gl-font-style-italic gl-text-gray-500"
- data-testid="trial-only"
- >
-
- Trial only
-
- </div>
-
- <div
class="flex align-items-center"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Add merge request approval"
- href="http://example.com/"
- rel="noopener noreferrer"
- target="_blank"
- >
-
- Add merge request approval
-
- </a>
+ <div>
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="enable_require_merge_approvals"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Enable require merge approvals
+ </a>
+
+ <span
+ class="gl-font-style-italic gl-text-gray-500"
+ data-testid="trial-only"
+ >
+
+ - Included in trial
+
+ </span>
+ </div>
<!---->
</div>
@@ -290,23 +288,23 @@ exports[`Learn GitLab renders correctly 1`] = `
<div
class="gl-mb-4"
>
- <!---->
-
<div
class="flex align-items-center"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Create an issue"
- href="http://example.com/"
- target="_self"
- >
-
- Create an issue
-
- </a>
+ <div>
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="create_an_issue"
+ href="http://example.com/"
+ target="_self"
+ >
+ Create an issue
+ </a>
+
+ <!---->
+ </div>
<!---->
</div>
@@ -314,23 +312,23 @@ exports[`Learn GitLab renders correctly 1`] = `
<div
class="gl-mb-4"
>
- <!---->
-
<div
class="flex align-items-center"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Submit a merge request"
- href="http://example.com/"
- target="_self"
- >
-
- Submit a merge request
-
- </a>
+ <div>
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="submit_a_merge_request_mr"
+ href="http://example.com/"
+ target="_self"
+ >
+ Submit a merge request (MR)
+ </a>
+
+ <!---->
+ </div>
<!---->
</div>
@@ -372,24 +370,24 @@ exports[`Learn GitLab renders correctly 1`] = `
<div
class="gl-mb-4"
>
- <!---->
-
<div
class="flex align-items-center"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Run a Security scan using CI/CD"
- href="https://docs.gitlab.com/ee/foobar/"
- rel="noopener noreferrer"
- target="_blank"
- >
-
- Run a Security scan using CI/CD
-
- </a>
+ <div>
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="run_a_security_scan_using_ci_cd"
+ href="https://docs.gitlab.com/ee/foobar/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Run a Security scan using CI/CD
+ </a>
+
+ <!---->
+ </div>
<!---->
</div>
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js
deleted file mode 100644
index ad4bc826a9d..00000000000
--- a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import LearnGitlabInfoCard from '~/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue';
-
-const defaultProps = {
- title: 'Create Repository',
- description: 'Some description',
- actionLabel: 'Create Repository now',
- url: 'https://example.com',
- completed: false,
- svg: 'https://example.com/illustration.svg',
-};
-
-describe('Learn GitLab Info Card', () => {
- let wrapper;
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const createWrapper = (props = {}) => {
- wrapper = shallowMount(LearnGitlabInfoCard, {
- propsData: { ...defaultProps, ...props },
- });
- };
-
- it('renders no icon when not completed', () => {
- createWrapper({ completed: false });
-
- expect(wrapper.find('[data-testid="completed-icon"]').exists()).toBe(false);
- });
-
- it('renders the completion icon when completed', () => {
- createWrapper({ completed: true });
-
- expect(wrapper.find('[data-testid="completed-icon"]').exists()).toBe(true);
- });
-
- it('renders no trial only when it is not required', () => {
- createWrapper();
-
- expect(wrapper.find('[data-testid="trial-only"]').exists()).toBe(false);
- });
-
- it('renders trial only when trial is required', () => {
- createWrapper({ trialRequired: true });
-
- expect(wrapper.find('[data-testid="trial-only"]').exists()).toBe(true);
- });
-
- it('renders completion icon when completed a trial-only feature', () => {
- createWrapper({ trialRequired: true, completed: true });
-
- expect(wrapper.find('[data-testid="trial-only"]').exists()).toBe(false);
- expect(wrapper.find('[data-testid="completed-icon"]').exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
index d9aff37f703..897cbf5eaa4 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
@@ -119,7 +119,7 @@ describe('Learn GitLab Section Link', () => {
findUncompletedLink().trigger('click');
expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_link', {
- label: 'Run a Security scan using CI/CD',
+ label: 'run_a_security_scan_using_ci_cd',
});
unmockTracking();
@@ -164,7 +164,7 @@ describe('Learn GitLab Section Link', () => {
triggerEvent(openInviteMembesrModalLink().element);
expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_link', {
- label: 'Invite your colleagues',
+ label: 'invite_your_colleagues',
property: 'Growth::Activation::Experiment::InviteForHelpContinuousOnboarding',
});
@@ -203,7 +203,7 @@ describe('Learn GitLab Section Link', () => {
videoTutorialLink().trigger('click');
expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_video_link', {
- label: 'Add code owners',
+ label: 'add_code_owners',
property: 'Growth::Conversion::Experiment::LearnGitLab',
context: {
data: {
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_trial_card_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_trial_card_spec.js
new file mode 100644
index 00000000000..6ab57e31fed
--- /dev/null
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_trial_card_spec.js
@@ -0,0 +1,12 @@
+import { shallowMount } from '@vue/test-utils';
+import IncludedInTrialIndicator from '~/pages/projects/learn_gitlab/components/included_in_trial_indicator.vue';
+
+describe('Learn GitLab Trial Card', () => {
+ it('renders correctly', () => {
+ const wrapper = shallowMount(IncludedInTrialIndicator);
+
+ expect(wrapper.text()).toEqual('- Included in trial');
+
+ wrapper.destroy();
+ });
+});
diff --git a/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js b/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
index d5b4b3c22d8..99df5b58d90 100644
--- a/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
+++ b/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
@@ -31,10 +31,10 @@ describe('Interval Pattern Input Component', () => {
wrapper.findAll('input[type="radio"]').wrappers.find((x) => x.element.checked);
const findIcon = () => wrapper.findComponent(GlIcon);
const findSelectedRadioKey = () => findSelectedRadio()?.attributes('data-testid');
- const selectEveryDayRadio = () => findEveryDayRadio().trigger('click');
- const selectEveryWeekRadio = () => findEveryWeekRadio().trigger('click');
- const selectEveryMonthRadio = () => findEveryMonthRadio().trigger('click');
- const selectCustomRadio = () => findCustomRadio().trigger('click');
+ const selectEveryDayRadio = () => findEveryDayRadio().setChecked(true);
+ const selectEveryWeekRadio = () => findEveryWeekRadio().setChecked(true);
+ const selectEveryMonthRadio = () => findEveryMonthRadio().setChecked(true);
+ const selectCustomRadio = () => findCustomRadio().setChecked(true);
const createWrapper = (props = {}, data = {}) => {
if (wrapper) {
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 46f83ac89e5..85660d09baa 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
@@ -51,6 +51,7 @@ const defaultProps = {
requestCveAvailable: true,
confirmationPhrase: 'my-fake-project',
showVisibilityConfirmModal: false,
+ membersPagePath: '/my-fake-project/-/project_members',
};
const FEATURE_ACCESS_LEVEL_ANONYMOUS = 30;
@@ -59,7 +60,7 @@ describe('Settings Panel', () => {
let wrapper;
const mountComponent = (
- { currentSettings = {}, glFeatures = {}, ...customProps } = {},
+ { currentSettings = {}, glFeatures = {}, stubs = {}, ...customProps } = {},
mountFn = shallowMount,
) => {
const propsData = {
@@ -76,6 +77,7 @@ describe('Settings Panel', () => {
...glFeatures,
},
},
+ stubs,
});
};
@@ -176,7 +178,7 @@ describe('Settings Panel', () => {
);
it('should set the visibility level description based upon the selected visibility level', () => {
- wrapper = mountComponent();
+ wrapper = mountComponent({ stubs: { GlSprintf } });
findProjectVisibilityLevelInput().setValue(visibilityOptions.INTERNAL);
diff --git a/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js b/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
index 365bb878485..108f816fe01 100644
--- a/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
+++ b/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
@@ -7,8 +7,10 @@ import { renderGFM } from '~/pages/shared/wikis/render_gfm_facade';
import axios from '~/lib/utils/axios_utils';
import httpStatus from '~/lib/utils/http_status';
import waitForPromises from 'helpers/wait_for_promises';
+import { handleLocationHash } from '~/lib/utils/common_utils';
jest.mock('~/pages/shared/wikis/render_gfm_facade');
+jest.mock('~/lib/utils/common_utils');
describe('pages/shared/wikis/components/wiki_content', () => {
const PATH = '/test';
@@ -76,6 +78,12 @@ describe('pages/shared/wikis/components/wiki_content', () => {
expect(renderGFM).toHaveBeenCalledWith(wrapper.element);
});
+
+ it('handles hash after render', async () => {
+ await nextTick();
+
+ expect(handleLocationHash).toHaveBeenCalled();
+ });
});
describe('when loading content fails', () => {
diff --git a/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js b/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
index d7f8dc3c98e..a5db10d106d 100644
--- a/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
+++ b/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
@@ -1,12 +1,14 @@
import { nextTick } from 'vue';
-import { GlAlert, GlButton } from '@gitlab/ui';
+import { GlAlert, GlButton, GlFormInput, GlFormGroup } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { mockTracking } from 'helpers/tracking_helper';
+import { stubComponent } from 'helpers/stub_component';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import ContentEditor from '~/content_editor/components/content_editor.vue';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import WikiForm from '~/pages/shared/wikis/components/wiki_form.vue';
import {
CONTENT_EDITOR_LOADED_ACTION,
@@ -37,6 +39,7 @@ describe('WikiForm', () => {
const findMarkdownHelpLink = () => wrapper.findByTestId('wiki-markdown-help-link');
const findContentEditor = () => wrapper.findComponent(ContentEditor);
const findClassicEditor = () => wrapper.findComponent(MarkdownField);
+ const findLocalStorageSync = () => wrapper.find(LocalStorageSync);
const setFormat = (value) => {
const format = findFormat();
@@ -103,6 +106,9 @@ describe('WikiForm', () => {
MarkdownField,
GlAlert,
GlButton,
+ LocalStorageSync: stubComponent(LocalStorageSync),
+ GlFormInput,
+ GlFormGroup,
},
}),
);
@@ -128,7 +134,7 @@ describe('WikiForm', () => {
`(
'updates the commit message to $message when title is $title and persisted=$persisted',
async ({ title, message, persisted }) => {
- createWrapper({ persisted });
+ createWrapper({ persisted, mountFn: mount });
await findTitle().setValue(title);
@@ -137,7 +143,7 @@ describe('WikiForm', () => {
);
it('sets the commit message to "Update My page" when the page first loads when persisted', async () => {
- createWrapper({ persisted: true });
+ createWrapper({ persisted: true, mountFn: mount });
await nextTick();
@@ -157,7 +163,7 @@ describe('WikiForm', () => {
${'asciidoc'} | ${false} | ${'hides'}
${'org'} | ${false} | ${'hides'}
`('$action preview in the markdown field when format is $format', async ({ format, enabled }) => {
- createWrapper();
+ createWrapper({ mountFn: mount });
await setFormat(format);
@@ -254,7 +260,7 @@ describe('WikiForm', () => {
`(
"when title='$title', content='$content', then the button is $buttonState'",
async ({ title, content, disabledAttr }) => {
- createWrapper();
+ createWrapper({ mountFn: mount });
await findTitle().setValue(title);
await findContent().setValue(content);
@@ -291,7 +297,7 @@ describe('WikiForm', () => {
describe('toggle editing mode control', () => {
beforeEach(() => {
- createWrapper();
+ createWrapper({ mountFn: mount });
});
it.each`
@@ -330,6 +336,19 @@ describe('WikiForm', () => {
});
});
+ describe('markdown editor type persistance', () => {
+ it('loads content editor by default if it is persisted in local storage', async () => {
+ expect(findClassicEditor().exists()).toBe(true);
+ expect(findContentEditor().exists()).toBe(false);
+
+ // enable content editor
+ await findLocalStorageSync().vm.$emit('input', true);
+
+ expect(findContentEditor().exists()).toBe(true);
+ expect(findClassicEditor().exists()).toBe(false);
+ });
+ });
+
describe('when content editor is active', () => {
let mockContentEditor;
@@ -374,7 +393,7 @@ describe('WikiForm', () => {
});
describe('wiki content editor', () => {
- describe('clicking "use new editor": editor fails to load', () => {
+ describe('clicking "Edit rich text": editor fails to load', () => {
beforeEach(async () => {
createWrapper({ mountFn: mount });
mock.onPost(/preview-markdown/).reply(400);
@@ -401,7 +420,7 @@ describe('WikiForm', () => {
});
});
- describe('clicking "use new editor": editor loads successfully', () => {
+ describe('clicking "Edit rich text": editor loads successfully', () => {
beforeEach(async () => {
createWrapper({ persisted: true, mountFn: mount });
diff --git a/spec/frontend/pdf/index_spec.js b/spec/frontend/pdf/index_spec.js
index 2b0932493bb..98946412264 100644
--- a/spec/frontend/pdf/index_spec.js
+++ b/spec/frontend/pdf/index_spec.js
@@ -1,48 +1,33 @@
-import Vue from 'vue';
-
+import { shallowMount } from '@vue/test-utils';
import { FIXTURES_PATH } from 'spec/test_constants';
import PDFLab from '~/pdf/index.vue';
-jest.mock('pdfjs-dist/webpack', () => {
- return { default: jest.requireActual('pdfjs-dist/build/pdf') };
-});
-
-const pdf = `${FIXTURES_PATH}/blob/pdf/test.pdf`;
+describe('PDFLab component', () => {
+ let wrapper;
-const Component = Vue.extend(PDFLab);
+ const mountComponent = ({ pdf }) => shallowMount(PDFLab, { propsData: { pdf } });
-describe('PDF component', () => {
- let vm;
+ afterEach(() => {
+ wrapper.destroy();
+ });
describe('without PDF data', () => {
beforeEach(() => {
- vm = new Component({
- propsData: {
- pdf: '',
- },
- });
-
- vm.$mount();
+ wrapper = mountComponent({ pdf: '' });
});
it('does not render', () => {
- expect(vm.$el.tagName).toBeUndefined();
+ expect(wrapper.isVisible()).toBe(false);
});
});
describe('with PDF data', () => {
beforeEach(() => {
- vm = new Component({
- propsData: {
- pdf,
- },
- });
-
- vm.$mount();
+ wrapper = mountComponent({ pdf: `${FIXTURES_PATH}/blob/pdf/test.pdf` });
});
- it('renders pdf component', () => {
- expect(vm.$el.tagName).toBeDefined();
+ it('renders', () => {
+ expect(wrapper.isVisible()).toBe(true);
});
});
});
diff --git a/spec/frontend/pipeline_editor/components/lint/ci_lint_results_spec.js b/spec/frontend/pipeline_editor/components/lint/ci_lint_results_spec.js
index ae19ed9ab02..82ac390971d 100644
--- a/spec/frontend/pipeline_editor/components/lint/ci_lint_results_spec.js
+++ b/spec/frontend/pipeline_editor/components/lint/ci_lint_results_spec.js
@@ -152,4 +152,26 @@ describe('CI Lint Results', () => {
expect(findAfterScripts()).toHaveLength(filterEmptyScripts('afterScript').length);
});
});
+
+ describe('Hide Alert', () => {
+ it('hides alert on success if hide-alert prop is true', async () => {
+ await createComponent({ dryRun: true, hideAlert: true }, mount);
+
+ expect(findStatus().exists()).toBe(false);
+ });
+
+ it('hides alert on error if hide-alert prop is true', async () => {
+ await createComponent(
+ {
+ hideAlert: true,
+ isValid: false,
+ errors: mockErrors,
+ warnings: mockWarnings,
+ },
+ mount,
+ );
+
+ expect(findStatus().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js b/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
index 3ecf6472544..87a7f07f7d4 100644
--- a/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
+++ b/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
@@ -1,6 +1,8 @@
-import { GlAlert, GlLoadingIcon, GlTabs } from '@gitlab/ui';
-import { shallowMount, mount } from '@vue/test-utils';
+import { GlAlert, GlBadge, GlLoadingIcon, GlTabs } from '@gitlab/ui';
+import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
import Vue, { nextTick } from 'vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
import setWindowLocation from 'helpers/set_window_location_helper';
import CiConfigMergedPreview from '~/pipeline_editor/components/editor/ci_config_merged_preview.vue';
import CiLint from '~/pipeline_editor/components/lint/ci_lint.vue';
@@ -15,9 +17,21 @@ import {
EDITOR_APP_STATUS_INVALID,
EDITOR_APP_STATUS_VALID,
TAB_QUERY_PARAM,
+ VALIDATE_TAB,
+ VALIDATE_TAB_BADGE_DISMISSED_KEY,
} from '~/pipeline_editor/constants';
import PipelineGraph from '~/pipelines/components/pipeline_graph/pipeline_graph.vue';
-import { mockLintResponse, mockLintResponseWithoutMerged, mockCiYml } from '../mock_data';
+import getBlobContent from '~/pipeline_editor/graphql/queries/blob_content.query.graphql';
+import {
+ mockBlobContentQueryResponse,
+ mockCiLintPath,
+ mockCiYml,
+ mockLintResponse,
+ mockLintResponseWithoutMerged,
+} from '../mock_data';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
Vue.config.ignoredElements = ['gl-emoji'];
@@ -33,11 +47,13 @@ describe('Pipeline editor tabs component', () => {
provide = {},
appStatus = EDITOR_APP_STATUS_VALID,
mountFn = shallowMount,
+ options = {},
} = {}) => {
wrapper = mountFn(PipelineEditorTabs, {
propsData: {
ciConfigData: mockLintResponse,
ciFileContent: mockCiYml,
+ currentTab: CREATE_TAB,
isNewCiConfigFile: true,
showDrawer: false,
...props,
@@ -47,12 +63,34 @@ describe('Pipeline editor tabs component', () => {
appStatus,
};
},
- provide: { ...provide },
+ provide: {
+ ciLintPath: mockCiLintPath,
+ ...provide,
+ },
stubs: {
TextEditor: MockTextEditor,
EditorTab,
},
listeners,
+ ...options,
+ });
+ };
+
+ let mockBlobContentData;
+ let mockApollo;
+
+ const createComponentWithApollo = ({ props, provide = {}, mountFn = shallowMount } = {}) => {
+ const handlers = [[getBlobContent, mockBlobContentData]];
+ mockApollo = createMockApollo(handlers);
+
+ createComponent({
+ props,
+ provide,
+ mountFn,
+ options: {
+ localVue,
+ apolloProvider: mockApollo,
+ },
});
};
@@ -63,6 +101,7 @@ describe('Pipeline editor tabs component', () => {
const findVisualizationTab = () => wrapper.find('[data-testid="visualization-tab"]');
const findAlert = () => wrapper.findComponent(GlAlert);
+ const findBadge = () => wrapper.findComponent(GlBadge);
const findCiLint = () => wrapper.findComponent(CiLint);
const findCiValidate = () => wrapper.findComponent(CiValidate);
const findGlTabs = () => wrapper.findComponent(GlTabs);
@@ -72,6 +111,10 @@ describe('Pipeline editor tabs component', () => {
const findMergedPreview = () => wrapper.findComponent(CiConfigMergedPreview);
const findWalkthroughPopover = () => wrapper.findComponent(WalkthroughPopover);
+ beforeEach(() => {
+ mockBlobContentData = jest.fn();
+ });
+
afterEach(() => {
wrapper.destroy();
});
@@ -114,37 +157,73 @@ describe('Pipeline editor tabs component', () => {
describe('validate tab', () => {
describe('with simulatePipeline feature flag ON', () => {
- describe('while loading', () => {
+ describe('after loading', () => {
beforeEach(() => {
createComponent({
- appStatus: EDITOR_APP_STATUS_LOADING,
- provide: {
- glFeatures: {
- simulatePipeline: true,
- },
- },
+ provide: { glFeatures: { simulatePipeline: true } },
});
});
- it('displays a loading icon if the lint query is loading', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- });
-
- it('does not display the validate component', () => {
- expect(findCiValidate().exists()).toBe(false);
+ it('displays the tab and the validate component', () => {
+ expect(findValidateTab().exists()).toBe(true);
+ expect(findCiValidate().exists()).toBe(true);
});
});
- describe('after loading', () => {
- beforeEach(() => {
- createComponent({
- provide: { glFeatures: { simulatePipeline: true } },
+ describe('NEW badge', () => {
+ describe('default', () => {
+ beforeEach(() => {
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
+ createComponentWithApollo({
+ mountFn: mount,
+ props: {
+ currentTab: VALIDATE_TAB,
+ },
+ provide: {
+ glFeatures: { simulatePipeline: true },
+ ciConfigPath: '/path/to/ci-config',
+ currentBranch: 'main',
+ projectFullPath: '/path/to/project',
+ simulatePipelineHelpPagePath: 'path/to/help/page',
+ validateTabIllustrationPath: 'path/to/svg',
+ },
+ });
+ });
+
+ it('renders badge by default', () => {
+ expect(findBadge().exists()).toBe(true);
+ expect(findBadge().text()).toBe(wrapper.vm.$options.i18n.new);
+ });
+
+ it('hides badge when moving away from the validate tab', async () => {
+ expect(findBadge().exists()).toBe(true);
+
+ await findEditorTab().vm.$emit('click');
+
+ expect(findBadge().exists()).toBe(false);
});
});
- it('displays the tab and the validate component', () => {
- expect(findValidateTab().exists()).toBe(true);
- expect(findCiValidate().exists()).toBe(true);
+ describe('if badge has been dismissed before', () => {
+ beforeEach(() => {
+ localStorage.setItem(VALIDATE_TAB_BADGE_DISMISSED_KEY, 'true');
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
+ createComponentWithApollo({
+ mountFn: mount,
+ provide: {
+ glFeatures: { simulatePipeline: true },
+ ciConfigPath: '/path/to/ci-config',
+ currentBranch: 'main',
+ projectFullPath: '/path/to/project',
+ simulatePipelineHelpPagePath: 'path/to/help/page',
+ validateTabIllustrationPath: 'path/to/svg',
+ },
+ });
+ });
+
+ it('does not render badge if it has been dismissed before', () => {
+ expect(findBadge().exists()).toBe(false);
+ });
});
});
});
@@ -181,7 +260,6 @@ describe('Pipeline editor tabs component', () => {
expect(findCiLint().exists()).toBe(false);
});
});
-
describe('after loading', () => {
beforeEach(() => {
createComponent();
diff --git a/spec/frontend/pipeline_editor/components/popovers/validate_pipeline_popover_spec.js b/spec/frontend/pipeline_editor/components/popovers/validate_pipeline_popover_spec.js
new file mode 100644
index 00000000000..97f785a71bc
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/popovers/validate_pipeline_popover_spec.js
@@ -0,0 +1,43 @@
+import { GlLink, GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ValidatePopover from '~/pipeline_editor/components/popovers/validate_pipeline_popover.vue';
+import { VALIDATE_TAB_FEEDBACK_URL } from '~/pipeline_editor/constants';
+import { mockSimulatePipelineHelpPagePath } from '../../mock_data';
+
+describe('ValidatePopover component', () => {
+ let wrapper;
+
+ const createComponent = ({ stubs } = {}) => {
+ wrapper = shallowMountExtended(ValidatePopover, {
+ provide: {
+ simulatePipelineHelpPagePath: mockSimulatePipelineHelpPagePath,
+ },
+ stubs,
+ });
+ };
+
+ const findHelpLink = () => wrapper.findByTestId('help-link');
+ const findFeedbackLink = () => wrapper.findByTestId('feedback-link');
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('template', () => {
+ beforeEach(async () => {
+ createComponent({
+ stubs: { GlLink, GlSprintf },
+ });
+ });
+
+ it('renders help link', () => {
+ expect(findHelpLink().exists()).toBe(true);
+ expect(findHelpLink().attributes('href')).toBe(mockSimulatePipelineHelpPagePath);
+ });
+
+ it('renders feedback link', () => {
+ expect(findFeedbackLink().exists()).toBe(true);
+ expect(findFeedbackLink().attributes('href')).toBe(VALIDATE_TAB_FEEDBACK_URL);
+ });
+ });
+});
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 6206a0f6aed..3a40ce32a24 100644
--- a/spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js
+++ b/spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js
@@ -1,4 +1,4 @@
-import { GlAlert, GlTabs } from '@gitlab/ui';
+import { GlAlert, GlBadge, GlTabs } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import EditorTab from '~/pipeline_editor/components/ui/editor_tab.vue';
@@ -30,10 +30,10 @@ describe('~/pipeline_editor/components/ui/editor_tab.vue', () => {
},
template: `
<gl-tabs>
- <editor-tab :title-link-attributes="{ 'data-testid': 'tab1-btn' }" :lazy="true">
+ <editor-tab title="Tab 1" :title-link-attributes="{ 'data-testid': 'tab1-btn' }" :lazy="true">
<mock-child content="${mockContent1}"/>
</editor-tab>
- <editor-tab :title-link-attributes="{ 'data-testid': 'tab2-btn' }" :lazy="true">
+ <editor-tab title="Tab 2" :title-link-attributes="{ 'data-testid': 'tab2-btn' }" :lazy="true" badge-title="NEW">
<mock-child content="${mockContent2}"/>
</editor-tab>
</gl-tabs>
@@ -46,7 +46,10 @@ describe('~/pipeline_editor/components/ui/editor_tab.vue', () => {
const createWrapper = ({ props } = {}) => {
wrapper = mount(EditorTab, {
- propsData: props,
+ propsData: {
+ title: 'Tab 1',
+ ...props,
+ },
slots: {
default: MockSourceEditor,
},
@@ -55,6 +58,7 @@ describe('~/pipeline_editor/components/ui/editor_tab.vue', () => {
const findSlotComponent = () => wrapper.findComponent(MockSourceEditor);
const findAlert = () => wrapper.findComponent(GlAlert);
+ const findBadges = () => wrapper.findAll(GlBadge);
beforeEach(() => {
mockChildMounted = jest.fn();
@@ -182,4 +186,15 @@ describe('~/pipeline_editor/components/ui/editor_tab.vue', () => {
expect(mockChildMounted).toHaveBeenNthCalledWith(2, mockContent2);
});
});
+
+ describe('valid state', () => {
+ beforeEach(() => {
+ createMockedWrapper();
+ });
+
+ it('renders correct number of badges', async () => {
+ expect(findBadges()).toHaveLength(1);
+ expect(findBadges().at(0).text()).toBe('NEW');
+ });
+ });
});
diff --git a/spec/frontend/pipeline_editor/components/validate/ci_validate_spec.js b/spec/frontend/pipeline_editor/components/validate/ci_validate_spec.js
index 25972317593..f5f01b675b2 100644
--- a/spec/frontend/pipeline_editor/components/validate/ci_validate_spec.js
+++ b/spec/frontend/pipeline_editor/components/validate/ci_validate_spec.js
@@ -1,40 +1,279 @@
-import { GlButton, GlDropdown } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlAlert, GlDropdown, GlIcon, GlLoadingIcon, GlPopover } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import CiLintResults from '~/pipeline_editor/components/lint/ci_lint_results.vue';
import CiValidate, { i18n } from '~/pipeline_editor/components/validate/ci_validate.vue';
+import ValidatePipelinePopover from '~/pipeline_editor/components/popovers/validate_pipeline_popover.vue';
+import getBlobContent from '~/pipeline_editor/graphql/queries/blob_content.query.graphql';
+import lintCIMutation from '~/pipeline_editor/graphql/mutations/client/lint_ci.mutation.graphql';
+import {
+ mockBlobContentQueryResponse,
+ mockCiLintPath,
+ mockCiYml,
+ mockSimulatePipelineHelpPagePath,
+} from '../../mock_data';
+import { mockLintDataError, mockLintDataValid } from '../../../ci_lint/mock_data';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
describe('Pipeline Editor Validate Tab', () => {
let wrapper;
+ let mockApollo;
+ let mockBlobContentData;
- const createComponent = ({ stubs } = {}) => {
- wrapper = shallowMount(CiValidate, {
+ const createComponent = ({
+ props,
+ stubs,
+ options,
+ isBlobLoading = false,
+ isSimulationLoading = false,
+ } = {}) => {
+ wrapper = shallowMountExtended(CiValidate, {
+ propsData: {
+ ciFileContent: mockCiYml,
+ ...props,
+ },
provide: {
+ ciConfigPath: '/path/to/ci-config',
+ ciLintPath: mockCiLintPath,
+ currentBranch: 'main',
+ projectFullPath: '/path/to/project',
validateTabIllustrationPath: '/path/to/img',
+ simulatePipelineHelpPagePath: mockSimulatePipelineHelpPagePath,
+ },
+ stubs,
+ mocks: {
+ $apollo: {
+ queries: {
+ initialBlobContent: {
+ loading: isBlobLoading,
+ },
+ },
+ mutations: {
+ lintCiMutation: {
+ loading: isSimulationLoading,
+ },
+ },
+ },
},
+ ...options,
+ });
+ };
+
+ const createComponentWithApollo = ({ props, stubs } = {}) => {
+ const handlers = [[getBlobContent, mockBlobContentData]];
+ mockApollo = createMockApollo(handlers);
+
+ createComponent({
+ props,
stubs,
+ options: {
+ localVue,
+ apolloProvider: mockApollo,
+ mocks: {},
+ },
});
};
- const findCta = () => wrapper.findComponent(GlButton);
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findCancelBtn = () => wrapper.findByTestId('cancel-simulation');
+ const findContentChangeStatus = () => wrapper.findByTestId('content-status');
+ const findCta = () => wrapper.findByTestId('simulate-pipeline-button');
+ const findDisabledCtaTooltip = () => wrapper.findByTestId('cta-tooltip');
+ const findHelpIcon = () => wrapper.findComponent(GlIcon);
+ const findIllustration = () => wrapper.findByRole('img');
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findPipelineSource = () => wrapper.findComponent(GlDropdown);
+ const findPopover = () => wrapper.findComponent(GlPopover);
+ const findCiLintResults = () => wrapper.findComponent(CiLintResults);
+ const findResultsCta = () => wrapper.findByTestId('resimulate-pipeline-button');
+
+ beforeEach(() => {
+ mockBlobContentData = jest.fn();
+ });
afterEach(() => {
wrapper.destroy();
});
- describe('template', () => {
+ describe('while initial CI content is loading', () => {
beforeEach(() => {
- createComponent();
+ createComponent({ isBlobLoading: true });
+ });
+
+ it('renders disabled CTA with tooltip', () => {
+ expect(findCta().props('disabled')).toBe(true);
+ expect(findDisabledCtaTooltip().exists()).toBe(true);
+ });
+ });
+
+ describe('after initial CI content is loaded', () => {
+ beforeEach(async () => {
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
+ await createComponentWithApollo({ stubs: { GlPopover, ValidatePipelinePopover } });
});
it('renders disabled pipeline source dropdown', () => {
expect(findPipelineSource().exists()).toBe(true);
expect(findPipelineSource().attributes('text')).toBe(i18n.pipelineSourceDefault);
- expect(findPipelineSource().attributes('disabled')).toBe('true');
+ expect(findPipelineSource().props('disabled')).toBe(true);
});
- it('renders CTA', () => {
+ it('renders enabled CTA without tooltip', () => {
expect(findCta().exists()).toBe(true);
- expect(findCta().text()).toBe(i18n.cta);
+ expect(findCta().props('disabled')).toBe(false);
+ expect(findDisabledCtaTooltip().exists()).toBe(false);
+ });
+
+ it('popover is set to render when hovering over help icon', () => {
+ expect(findPopover().props('target')).toBe(findHelpIcon().attributes('id'));
+ expect(findPopover().props('triggers')).toBe('hover focus');
+ });
+ });
+
+ describe('simulating the pipeline', () => {
+ beforeEach(async () => {
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
+ await createComponentWithApollo();
+
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockLintDataValid);
+ });
+
+ it('renders loading state while simulation is ongoing', async () => {
+ findCta().vm.$emit('click');
+ await nextTick();
+
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(findCancelBtn().exists()).toBe(true);
+ expect(findCta().props('loading')).toBe(true);
+ });
+
+ it('calls mutation with the correct input', async () => {
+ await findCta().vm.$emit('click');
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledTimes(1);
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: lintCIMutation,
+ variables: {
+ dry_run: true,
+ content: mockCiYml,
+ endpoint: mockCiLintPath,
+ },
+ });
+ });
+
+ describe('when results are successful', () => {
+ beforeEach(async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockLintDataValid);
+ await findCta().vm.$emit('click');
+ });
+
+ it('renders success alert', () => {
+ expect(findAlert().exists()).toBe(true);
+ expect(findAlert().attributes('variant')).toBe('success');
+ expect(findAlert().attributes('title')).toBe(i18n.successAlertTitle);
+ });
+
+ it('does not render content change status or CTA for results page', () => {
+ expect(findContentChangeStatus().exists()).toBe(false);
+ expect(findResultsCta().exists()).toBe(false);
+ });
+
+ it('renders CI lint results with correct props', () => {
+ expect(findCiLintResults().exists()).toBe(true);
+ expect(findCiLintResults().props()).toMatchObject({
+ dryRun: true,
+ hideAlert: true,
+ isValid: true,
+ jobs: mockLintDataValid.data.lintCI.jobs,
+ });
+ });
+ });
+
+ describe('when results have errors', () => {
+ beforeEach(async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockLintDataError);
+ await findCta().vm.$emit('click');
+ });
+
+ it('renders error alert', () => {
+ expect(findAlert().exists()).toBe(true);
+ expect(findAlert().attributes('variant')).toBe('danger');
+ expect(findAlert().attributes('title')).toBe(i18n.errorAlertTitle);
+ });
+
+ it('renders CI lint results with correct props', () => {
+ expect(findCiLintResults().exists()).toBe(true);
+ expect(findCiLintResults().props()).toMatchObject({
+ dryRun: true,
+ hideAlert: true,
+ isValid: false,
+ errors: mockLintDataError.data.lintCI.errors,
+ warnings: mockLintDataError.data.lintCI.warnings,
+ });
+ });
+ });
+ });
+
+ describe('when CI content has changed after a simulation', () => {
+ beforeEach(async () => {
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
+ await createComponentWithApollo();
+
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockLintDataValid);
+ await findCta().vm.$emit('click');
+ });
+
+ it('renders content change status', async () => {
+ await wrapper.setProps({ ciFileContent: 'new yaml content' });
+
+ expect(findContentChangeStatus().exists()).toBe(true);
+ expect(findResultsCta().exists()).toBe(true);
+ });
+
+ it('calls mutation with new content', async () => {
+ await wrapper.setProps({ ciFileContent: 'new yaml content' });
+ await findResultsCta().vm.$emit('click');
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledTimes(2);
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: lintCIMutation,
+ variables: {
+ dry_run: true,
+ content: 'new yaml content',
+ endpoint: mockCiLintPath,
+ },
+ });
+ });
+ });
+
+ describe('canceling a simulation', () => {
+ beforeEach(async () => {
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
+ await createComponentWithApollo();
+ });
+
+ it('returns to init state', async () => {
+ // init state
+ expect(findIllustration().exists()).toBe(true);
+ expect(findCiLintResults().exists()).toBe(false);
+
+ // mutations should have successful results
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockLintDataValid);
+ findCta().vm.$emit('click');
+ await nextTick();
+
+ // cancel before simulation succeeds
+ expect(findCancelBtn().exists()).toBe(true);
+ await findCancelBtn().vm.$emit('click');
+
+ // should still render init state
+ expect(findIllustration().exists()).toBe(true);
+ expect(findCiLintResults().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/pipeline_editor/mock_data.js b/spec/frontend/pipeline_editor/mock_data.js
index 560b2820fae..2ea580b7b53 100644
--- a/spec/frontend/pipeline_editor/mock_data.js
+++ b/spec/frontend/pipeline_editor/mock_data.js
@@ -7,11 +7,13 @@ export const mockProjectFullPath = `${mockProjectNamespace}/${mockProjectPath}`;
export const mockDefaultBranch = 'main';
export const mockNewBranch = 'new-branch';
export const mockNewMergeRequestPath = '/-/merge_requests/new';
+export const mockCiLintPath = '/-/ci/lint';
export const mockCommitSha = 'aabbccdd';
export const mockCommitNextSha = 'eeffgghh';
export const mockIncludesHelpPagePath = '/-/includes/help';
export const mockLintHelpPagePath = '/-/lint-help';
export const mockLintUnavailableHelpPagePath = '/-/pipeline-editor/troubleshoot';
+export const mockSimulatePipelineHelpPagePath = '/-/simulate-pipeline-help';
export const mockYmlHelpPagePath = '/-/yml-help';
export const mockCommitMessage = 'My commit message';
diff --git a/spec/frontend/pipeline_wizard/components/widgets/checklist_spec.js b/spec/frontend/pipeline_wizard/components/widgets/checklist_spec.js
new file mode 100644
index 00000000000..43719595c5c
--- /dev/null
+++ b/spec/frontend/pipeline_wizard/components/widgets/checklist_spec.js
@@ -0,0 +1,110 @@
+import { GlFormCheckbox, GlFormCheckboxGroup } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ChecklistWidget from '~/pipeline_wizard/components/widgets/checklist.vue';
+
+describe('Pipeline Wizard - Checklist Widget', () => {
+ let wrapper;
+ const props = {
+ title: 'Foobar',
+ items: [
+ 'foo bar baz', // simple, text-only content
+ {
+ text: 'abc',
+ help: 'def',
+ },
+ ],
+ };
+
+ const getLastUpdateValidEvent = () => {
+ const eventArray = wrapper.emitted('update:valid');
+ return eventArray[eventArray.length - 1];
+ };
+ const findItem = (atIndex = 0) => wrapper.findAllComponents(GlFormCheckbox).at(atIndex);
+ const getGlFormCheckboxGroup = () => wrapper.getComponent(GlFormCheckboxGroup);
+
+ // The item.ids *can* be passed inside props.items, but are usually
+ // autogenerated by lodash.uniqueId() inside the component. So to
+ // get the actual value that the component expects to be emitted in
+ // GlFormCheckboxGroup's `v-model`, we need to obtain the value that is
+ // actually passed to GlFormCheckbox.
+ const getAllItemIds = () => props.items.map((_, i) => findItem(i).attributes().value);
+
+ const createComponent = (mountFn = shallowMountExtended) => {
+ wrapper = mountFn(ChecklistWidget, {
+ propsData: {
+ ...props,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('creates the component', () => {
+ createComponent();
+ expect(wrapper.exists()).toBe(true);
+ });
+
+ it('displays the item', () => {
+ createComponent();
+ expect(findItem().exists()).toBe(true);
+ });
+
+ it("displays the item's text", () => {
+ createComponent();
+ expect(findItem().text()).toBe(props.items[0]);
+ });
+
+ it('displays an item with a help text', () => {
+ createComponent();
+ const { text, help } = props.items[1];
+
+ const itemWrapper = findItem(1);
+ const itemText = itemWrapper.text();
+ // Unfortunately there is no wrapper.slots() accessor in vue_test_utils.
+ // To make sure the help text is being passed to the correct slot, we need to
+ // access the slot internally.
+ // This selector accesses the text of the first slot named "help" in itemWrapper
+ const helpText = itemWrapper.vm.$slots?.help[0]?.text?.trim();
+
+ expect(itemText).toBe(text);
+ expect(helpText).toBe(help);
+ });
+
+ it("emits a 'update:valid' event after all boxes have been checked", async () => {
+ createComponent();
+ // initially, `valid` should be false
+ expect(wrapper.emitted('update:valid')).toEqual([[false]]);
+ const values = getAllItemIds();
+ // this mocks checking all the boxes
+ getGlFormCheckboxGroup().vm.$emit('input', values);
+
+ await nextTick();
+
+ expect(wrapper.emitted('update:valid')).toEqual([[false], [true]]);
+ });
+
+ it('emits a invalid event after a box has been unchecked', async () => {
+ createComponent();
+ // initially, `valid` should be false
+ expect(wrapper.emitted('update:valid')).toEqual([[false]]);
+
+ // checking all the boxes first
+ const values = getAllItemIds();
+ getGlFormCheckboxGroup().vm.$emit('input', values);
+ await nextTick();
+
+ // ensure the test later doesn't just pass because it doesn't emit
+ // `true` to begin with
+ expect(getLastUpdateValidEvent()).toEqual([true]);
+
+ // Now we're unchecking the last box.
+ values.pop();
+ getGlFormCheckboxGroup().vm.$emit('input', values);
+ await nextTick();
+
+ expect(getLastUpdateValidEvent()).toEqual([false]);
+ });
+});
diff --git a/spec/frontend/pipeline_wizard/pipeline_wizard_spec.js b/spec/frontend/pipeline_wizard/pipeline_wizard_spec.js
index dd0304518a3..3f689ffdbc8 100644
--- a/spec/frontend/pipeline_wizard/pipeline_wizard_spec.js
+++ b/spec/frontend/pipeline_wizard/pipeline_wizard_spec.js
@@ -99,4 +99,12 @@ describe('PipelineWizard', () => {
parseDocument(template).get('description').toString(),
);
});
+
+ it('bubbles the done event upwards', () => {
+ createComponent();
+
+ wrapper.findComponent(PipelineWizardWrapper).vm.$emit('done');
+
+ expect(wrapper.emitted().done.length).toBe(1);
+ });
});
diff --git a/spec/frontend/pipeline_wizard/templates/pages_spec.js b/spec/frontend/pipeline_wizard/templates/pages_spec.js
new file mode 100644
index 00000000000..f89e8f05475
--- /dev/null
+++ b/spec/frontend/pipeline_wizard/templates/pages_spec.js
@@ -0,0 +1,89 @@
+import { Document, parseDocument } from 'yaml';
+import PagesWizardTemplate from '~/pipeline_wizard/templates/pages.yml';
+import { merge } from '~/lib/utils/yaml';
+
+const VAR_BUILD_IMAGE = '$BUILD_IMAGE';
+const VAR_INSTALLATION_STEPS = '$INSTALLATION_STEPS';
+const VAR_BUILD_STEPS = '$BUILD_STEPS';
+
+const getYaml = () => parseDocument(PagesWizardTemplate);
+const getFinalTemplate = () => {
+ const merged = new Document();
+ const yaml = getYaml();
+ yaml.toJS().steps.forEach((_, i) => {
+ merge(merged, yaml.getIn(['steps', i, 'template']));
+ });
+ return merged;
+};
+
+describe('Pages Template', () => {
+ it('is valid yaml', () => {
+ // Testing equality to an empty array (as opposed to just comparing
+ // errors.length) will cause jest to print the underlying error
+ expect(getYaml().errors).toEqual([]);
+ });
+
+ it('includes all `target`s in the respective `template`', () => {
+ const yaml = getYaml();
+ const actual = yaml.toJS().steps.map((x, i) => ({
+ inputs: x.inputs,
+ template: yaml.getIn(['steps', i, 'template']).toString(),
+ }));
+
+ expect(actual).toEqual([
+ {
+ inputs: [
+ expect.objectContaining({
+ label: 'Select your build image',
+ target: VAR_BUILD_IMAGE,
+ }),
+ expect.objectContaining({
+ widget: 'checklist',
+ title: 'Before we begin, please check:',
+ }),
+ ],
+ template: expect.stringContaining(VAR_BUILD_IMAGE),
+ },
+ {
+ inputs: [
+ expect.objectContaining({
+ label: 'Installation Steps',
+ target: VAR_INSTALLATION_STEPS,
+ }),
+ ],
+ template: expect.stringContaining(VAR_INSTALLATION_STEPS),
+ },
+ {
+ inputs: [
+ expect.objectContaining({
+ label: 'Build Steps',
+ target: VAR_BUILD_STEPS,
+ }),
+ ],
+ template: expect.stringContaining(VAR_BUILD_STEPS),
+ },
+ ]);
+ });
+
+ it('addresses all relevant instructions for a pages pipeline', () => {
+ const fullTemplate = getFinalTemplate();
+
+ expect(fullTemplate.toString()).toEqual(
+ `# The Docker image that will be used to build your app
+image: ${VAR_BUILD_IMAGE}
+# Functions that should be executed before the build script is run
+before_script: ${VAR_INSTALLATION_STEPS}
+pages:
+ script: ${VAR_BUILD_STEPS}
+ artifacts:
+ paths:
+ # The folder that contains the files to be exposed at the Page URL
+ - public
+ rules:
+ # This ensures that only pushes to the default branch will trigger
+ # a pages deploy
+ - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
+`,
+ );
+ });
+});
diff --git a/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js b/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
index 3b5632a8a4e..bfbb5f934b9 100644
--- a/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
+++ b/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
@@ -49,15 +49,15 @@ describe('Failed Jobs App', () => {
});
describe('loading spinner', () => {
- beforeEach(() => {
+ it('displays loading spinner when fetching failed jobs', () => {
createComponent(resolverSpy);
- });
- it('displays loading spinner when fetching failed jobs', () => {
expect(findLoadingSpinner().exists()).toBe(true);
});
it('hides loading spinner after the failed jobs have been fetched', async () => {
+ createComponent(resolverSpy);
+
await waitForPromises();
expect(findLoadingSpinner().exists()).toBe(false);
diff --git a/spec/frontend/pipelines/components/jobs/jobs_app_spec.js b/spec/frontend/pipelines/components/jobs/jobs_app_spec.js
index 81e19a6c221..89b6f764b2f 100644
--- a/spec/frontend/pipelines/components/jobs/jobs_app_spec.js
+++ b/spec/frontend/pipelines/components/jobs/jobs_app_spec.js
@@ -50,20 +50,23 @@ describe('Jobs app', () => {
});
describe('loading spinner', () => {
- beforeEach(async () => {
+ const setup = async () => {
createComponent(resolverSpy);
await waitForPromises();
triggerInfiniteScroll();
- });
+ };
+
+ it('displays loading spinner when fetching more jobs', async () => {
+ await setup();
- it('displays loading spinner when fetching more jobs', () => {
expect(findLoadingSpinner().exists()).toBe(true);
expect(findSkeletonLoader().exists()).toBe(false);
});
it('hides loading spinner after jobs have been fetched', async () => {
+ await setup();
await waitForPromises();
expect(findLoadingSpinner().exists()).toBe(false);
diff --git a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
index 49d64c6eac0..3eaf06e0656 100644
--- a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
@@ -5,6 +5,7 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import waitForPromises from 'helpers/wait_for_promises';
import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
import getUserCallouts from '~/graphql_shared/queries/get_user_callouts.query.graphql';
@@ -29,10 +30,16 @@ import * as Api from '~/pipelines/components/graph_shared/api';
import LinksLayer from '~/pipelines/components/graph_shared/links_layer.vue';
import * as parsingUtils from '~/pipelines/components/parsing_utils';
import getPipelineHeaderData from '~/pipelines/graphql/queries/get_pipeline_header_data.query.graphql';
+import getPerformanceInsights from '~/pipelines/graphql/queries/get_performance_insights.query.graphql';
import * as sentryUtils from '~/pipelines/utils';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { mockRunningPipelineHeaderData } from '../mock_data';
-import { mapCallouts, mockCalloutsResponse, mockPipelineResponse } from './mock_data';
+import {
+ mapCallouts,
+ mockCalloutsResponse,
+ mockPipelineResponse,
+ mockPerformanceInsightsResponse,
+} from './mock_data';
const defaultProvide = {
graphqlResourceEtag: 'frog/amphibirama/etag/',
@@ -88,11 +95,15 @@ describe('Pipeline graph wrapper', () => {
const callouts = mapCallouts(calloutsList);
const getUserCalloutsHandler = jest.fn().mockResolvedValue(mockCalloutsResponse(callouts));
const getPipelineHeaderDataHandler = jest.fn().mockResolvedValue(mockRunningPipelineHeaderData);
+ const getPerformanceInsightsHandler = jest
+ .fn()
+ .mockResolvedValue(mockPerformanceInsightsResponse);
const requestHandlers = [
[getPipelineHeaderData, getPipelineHeaderDataHandler],
[getPipelineDetails, getPipelineDetailsHandler],
[getUserCallouts, getUserCalloutsHandler],
+ [getPerformanceInsights, getPerformanceInsightsHandler],
];
const apolloProvider = createMockApollo(requestHandlers);
@@ -502,9 +513,7 @@ describe('Pipeline graph wrapper', () => {
describe('when no duration is obtained', () => {
beforeEach(async () => {
- jest.spyOn(window.performance, 'getEntriesByName').mockImplementation(() => {
- return [];
- });
+ stubPerformanceWebAPI();
createComponentWithApollo({
provide: {
diff --git a/spec/frontend/pipelines/graph/graph_view_selector_spec.js b/spec/frontend/pipelines/graph/graph_view_selector_spec.js
index f574f4dccc5..1397500bdc7 100644
--- a/spec/frontend/pipelines/graph/graph_view_selector_spec.js
+++ b/spec/frontend/pipelines/graph/graph_view_selector_spec.js
@@ -1,10 +1,19 @@
import { GlAlert, GlButton, GlButtonGroup, GlLoadingIcon } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import { LAYER_VIEW, STAGE_VIEW } from '~/pipelines/components/graph/constants';
import GraphViewSelector from '~/pipelines/components/graph/graph_view_selector.vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import getPerformanceInsights from '~/pipelines/graphql/queries/get_performance_insights.query.graphql';
+import { mockPerformanceInsightsResponse } from './mock_data';
+
+Vue.use(VueApollo);
describe('the graph view selector component', () => {
let wrapper;
+ let trackingSpy;
const findDependenciesToggle = () => wrapper.find('[data-testid="show-links-toggle"]');
const findViewTypeSelector = () => wrapper.findComponent(GlButtonGroup);
@@ -13,11 +22,13 @@ describe('the graph view selector component', () => {
const findSwitcherLoader = () => wrapper.find('[data-testid="switcher-loading-state"]');
const findToggleLoader = () => findDependenciesToggle().find(GlLoadingIcon);
const findHoverTip = () => wrapper.findComponent(GlAlert);
+ const findPipelineInsightsBtn = () => wrapper.find('[data-testid="pipeline-insights-btn"]');
const defaultProps = {
showLinks: false,
tipPreviouslyDismissed: false,
type: STAGE_VIEW,
+ isPipelineComplete: true,
};
const defaultData = {
@@ -27,6 +38,14 @@ describe('the graph view selector component', () => {
showLinksActive: false,
};
+ const getPerformanceInsightsHandler = jest
+ .fn()
+ .mockResolvedValue(mockPerformanceInsightsResponse);
+
+ const requestHandlers = [[getPerformanceInsights, getPerformanceInsightsHandler]];
+
+ const apolloProvider = createMockApollo(requestHandlers);
+
const createComponent = ({ data = {}, mountFn = shallowMount, props = {} } = {}) => {
wrapper = mountFn(GraphViewSelector, {
propsData: {
@@ -39,6 +58,7 @@ describe('the graph view selector component', () => {
...data,
};
},
+ apolloProvider,
});
};
@@ -91,7 +111,6 @@ describe('the graph view selector component', () => {
describe('events', () => {
beforeEach(() => {
- jest.useFakeTimers();
createComponent({
mountFn: mount,
props: {
@@ -203,5 +222,44 @@ describe('the graph view selector component', () => {
expect(findHoverTip().exists()).toBe(false);
});
});
+
+ describe('pipeline insights', () => {
+ it.each`
+ isPipelineComplete | shouldShow
+ ${true} | ${true}
+ ${false} | ${false}
+ `(
+ 'button should display $shouldShow if isPipelineComplete is $isPipelineComplete ',
+ ({ isPipelineComplete, shouldShow }) => {
+ createComponent({
+ props: {
+ isPipelineComplete,
+ },
+ });
+
+ expect(findPipelineInsightsBtn().exists()).toBe(shouldShow);
+ },
+ );
+ });
+
+ describe('tracking', () => {
+ beforeEach(() => {
+ createComponent();
+
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ afterEach(() => {
+ unmockTracking();
+ });
+
+ it('tracks performance insights button click', () => {
+ findPipelineInsightsBtn().vm.$emit('click');
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_insights_button', {
+ label: 'performance_insights',
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/pipelines/graph/job_group_dropdown_spec.js b/spec/frontend/pipelines/graph/job_group_dropdown_spec.js
index 5d8e70bac31..d8afb33e148 100644
--- a/spec/frontend/pipelines/graph/job_group_dropdown_spec.js
+++ b/spec/frontend/pipelines/graph/job_group_dropdown_spec.js
@@ -79,7 +79,7 @@ describe('job group dropdown component', () => {
it('renders button with group name and size', () => {
expect(findButton().text()).toContain(group.name);
- expect(findButton().text()).toContain(group.size);
+ expect(findButton().text()).toContain(group.size.toString());
});
it('renders dropdown with jobs', () => {
diff --git a/spec/frontend/pipelines/graph/linked_pipeline_spec.js b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
index fd97c2dbe77..cdeaa0db61d 100644
--- a/spec/frontend/pipelines/graph/linked_pipeline_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
@@ -103,7 +103,7 @@ describe('Linked pipeline', () => {
expect(findCardTooltip().text()).toContain(mockPipeline.project.name);
expect(findCardTooltip().text()).toContain(mockPipeline.status.label);
expect(findCardTooltip().text()).toContain(mockPipeline.sourceJob.name);
- expect(findCardTooltip().text()).toContain(mockPipeline.id);
+ expect(findCardTooltip().text()).toContain(mockPipeline.id.toString());
});
it('should display multi-project label when pipeline project id is not the same as triggered pipeline project id', () => {
diff --git a/spec/frontend/pipelines/graph/mock_data.js b/spec/frontend/pipelines/graph/mock_data.js
index 6124d67af09..959bbcefc98 100644
--- a/spec/frontend/pipelines/graph/mock_data.js
+++ b/spec/frontend/pipelines/graph/mock_data.js
@@ -1038,3 +1038,245 @@ export const triggerJob = {
action: null,
},
};
+
+export const mockPerformanceInsightsResponse = {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 'gid://gitlab/Project/20',
+ pipeline: {
+ __typename: 'Pipeline',
+ id: 'gid://gitlab/Ci::Pipeline/97',
+ jobs: {
+ __typename: 'CiJobConnection',
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: false,
+ },
+ nodes: [
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Bridge/2502',
+ duration: null,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2502-2502',
+ detailsPath: '/root/lots-of-jobs-project/-/pipelines/98',
+ },
+ name: 'trigger_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/303',
+ name: 'deploy',
+ },
+ startedAt: null,
+ queuedDuration: 424850.376278,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2501',
+ duration: 10,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2501-2501',
+ detailsPath: '/root/ci-project/-/jobs/2501',
+ },
+ name: 'artifact_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/303',
+ name: 'deploy',
+ },
+ startedAt: '2022-07-01T16:31:41Z',
+ queuedDuration: 2.621553,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2500',
+ duration: 4,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2500-2500',
+ detailsPath: '/root/ci-project/-/jobs/2500',
+ },
+ name: 'coverage_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/302',
+ name: 'test',
+ },
+ startedAt: '2022-07-01T16:31:33Z',
+ queuedDuration: 14.388869,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2499',
+ duration: 4,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2499-2499',
+ detailsPath: '/root/ci-project/-/jobs/2499',
+ },
+ name: 'test_job_two',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/302',
+ name: 'test',
+ },
+ startedAt: '2022-07-01T16:31:28Z',
+ queuedDuration: 15.792664,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2498',
+ duration: 4,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2498-2498',
+ detailsPath: '/root/ci-project/-/jobs/2498',
+ },
+ name: 'test_job_one',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/302',
+ name: 'test',
+ },
+ startedAt: '2022-07-01T16:31:17Z',
+ queuedDuration: 8.317072,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2497',
+ duration: 5,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'failed-2497-2497',
+ detailsPath: '/root/ci-project/-/jobs/2497',
+ },
+ name: 'allow_failure_test_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/302',
+ name: 'test',
+ },
+ startedAt: '2022-07-01T16:31:22Z',
+ queuedDuration: 3.547553,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2496',
+ duration: null,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'manual-2496-2496',
+ detailsPath: '/root/ci-project/-/jobs/2496',
+ },
+ name: 'test_manual_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/302',
+ name: 'test',
+ },
+ startedAt: null,
+ queuedDuration: null,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2495',
+ duration: 5,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2495-2495',
+ detailsPath: '/root/ci-project/-/jobs/2495',
+ },
+ name: 'large_log_output',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/301',
+ name: 'build',
+ },
+ startedAt: '2022-07-01T16:31:11Z',
+ queuedDuration: 79.128625,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2494',
+ duration: 5,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2494-2494',
+ detailsPath: '/root/ci-project/-/jobs/2494',
+ },
+ name: 'build_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/301',
+ name: 'build',
+ },
+ startedAt: '2022-07-01T16:31:05Z',
+ queuedDuration: 73.286895,
+ },
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Build/2493',
+ duration: 16,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2493-2493',
+ detailsPath: '/root/ci-project/-/jobs/2493',
+ },
+ name: 'wait_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/301',
+ name: 'build',
+ },
+ startedAt: '2022-07-01T16:30:48Z',
+ queuedDuration: 56.258856,
+ },
+ ],
+ },
+ },
+ },
+ },
+};
+
+export const mockPerformanceInsightsNextPageResponse = {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 'gid://gitlab/Project/20',
+ pipeline: {
+ __typename: 'Pipeline',
+ id: 'gid://gitlab/Ci::Pipeline/97',
+ jobs: {
+ __typename: 'CiJobConnection',
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: true,
+ },
+ nodes: [
+ {
+ __typename: 'CiJob',
+ id: 'gid://gitlab/Ci::Bridge/2502',
+ duration: null,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'success-2502-2502',
+ detailsPath: '/root/lots-of-jobs-project/-/pipelines/98',
+ },
+ name: 'trigger_job',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/303',
+ name: 'deploy',
+ },
+ startedAt: null,
+ queuedDuration: 424850.376278,
+ },
+ ],
+ },
+ },
+ },
+ },
+};
diff --git a/spec/frontend/pipelines/header_component_spec.js b/spec/frontend/pipelines/header_component_spec.js
index 5cc11adf696..859be8d342c 100644
--- a/spec/frontend/pipelines/header_component_spec.js
+++ b/spec/frontend/pipelines/header_component_spec.js
@@ -205,7 +205,7 @@ describe('Pipeline details header', () => {
});
it('should call deletePipeline Mutation with pipeline id when modal is submitted', () => {
- findDeleteModal().vm.$emit('ok');
+ findDeleteModal().vm.$emit('primary');
expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
mutation: deletePipelineMutation,
@@ -223,7 +223,7 @@ describe('Pipeline details header', () => {
},
});
- findDeleteModal().vm.$emit('ok');
+ findDeleteModal().vm.$emit('primary');
await waitForPromises();
expect(findAlert().text()).toBe(failureMessage);
diff --git a/spec/frontend/pipelines/performance_insights_modal_spec.js b/spec/frontend/pipelines/performance_insights_modal_spec.js
new file mode 100644
index 00000000000..b745eb1d78e
--- /dev/null
+++ b/spec/frontend/pipelines/performance_insights_modal_spec.js
@@ -0,0 +1,122 @@
+import { GlAlert, GlLink, GlModal } from '@gitlab/ui';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import waitForPromises from 'helpers/wait_for_promises';
+import PerformanceInsightsModal from '~/pipelines/components/performance_insights_modal.vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { trimText } from 'helpers/text_helper';
+import getPerformanceInsights from '~/pipelines/graphql/queries/get_performance_insights.query.graphql';
+import {
+ mockPerformanceInsightsResponse,
+ mockPerformanceInsightsNextPageResponse,
+} from './graph/mock_data';
+
+Vue.use(VueApollo);
+
+describe('Performance insights modal', () => {
+ let wrapper;
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findQueuedCardData = () => wrapper.findByTestId('insights-queued-card-data');
+ const findQueuedCardLink = () => wrapper.findByTestId('insights-queued-card-link');
+ const findExecutedCardData = () => wrapper.findByTestId('insights-executed-card-data');
+ const findExecutedCardLink = () => wrapper.findByTestId('insights-executed-card-link');
+ const findSlowJobsStage = (index) => wrapper.findAllByTestId('insights-slow-job-stage').at(index);
+ const findSlowJobsLink = (index) => wrapper.findAllByTestId('insights-slow-job-link').at(index);
+
+ const getPerformanceInsightsHandler = jest
+ .fn()
+ .mockResolvedValue(mockPerformanceInsightsResponse);
+
+ const getPerformanceInsightsNextPageHandler = jest
+ .fn()
+ .mockResolvedValue(mockPerformanceInsightsNextPageResponse);
+
+ const requestHandlers = [[getPerformanceInsights, getPerformanceInsightsHandler]];
+
+ const createComponent = (handlers = requestHandlers) => {
+ wrapper = shallowMountExtended(PerformanceInsightsModal, {
+ provide: {
+ pipelineIid: '1',
+ pipelineProjectPath: 'root/ci-project',
+ },
+ apolloProvider: createMockApollo(handlers),
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('without next page', () => {
+ beforeEach(async () => {
+ createComponent();
+
+ await waitForPromises();
+ });
+
+ it('displays modal', () => {
+ expect(findModal().exists()).toBe(true);
+ });
+
+ it('does not dispaly alert', () => {
+ expect(findAlert().exists()).toBe(false);
+ });
+
+ describe('queued duration card', () => {
+ it('displays card data', () => {
+ expect(trimText(findQueuedCardData().text())).toBe('4.9 days');
+ });
+ it('displays card link', () => {
+ expect(findQueuedCardLink().attributes('href')).toBe(
+ '/root/lots-of-jobs-project/-/pipelines/98',
+ );
+ });
+ });
+
+ describe('executed duration card', () => {
+ it('displays card data', () => {
+ expect(trimText(findExecutedCardData().text())).toBe('trigger_job');
+ });
+ it('displays card link', () => {
+ expect(findExecutedCardLink().attributes('href')).toBe(
+ '/root/lots-of-jobs-project/-/pipelines/98',
+ );
+ });
+ });
+
+ describe('slow jobs', () => {
+ it.each`
+ index | expectedStage | expectedName | expectedLink
+ ${0} | ${'build'} | ${'wait_job'} | ${'/root/ci-project/-/jobs/2493'}
+ ${1} | ${'deploy'} | ${'artifact_job'} | ${'/root/ci-project/-/jobs/2501'}
+ ${2} | ${'test'} | ${'allow_failure_test_job'} | ${'/root/ci-project/-/jobs/2497'}
+ ${3} | ${'build'} | ${'large_log_output'} | ${'/root/ci-project/-/jobs/2495'}
+ ${4} | ${'build'} | ${'build_job'} | ${'/root/ci-project/-/jobs/2494'}
+ `(
+ 'should display slow job correctly',
+ ({ index, expectedStage, expectedName, expectedLink }) => {
+ expect(findSlowJobsStage(index).text()).toBe(expectedStage);
+ expect(findSlowJobsLink(index).text()).toBe(expectedName);
+ expect(findSlowJobsLink(index).attributes('href')).toBe(expectedLink);
+ },
+ );
+ });
+ });
+
+ describe('limit alert', () => {
+ it('displays limit alert when there is a next page', async () => {
+ createComponent([[getPerformanceInsights, getPerformanceInsightsNextPageHandler]]);
+
+ await waitForPromises();
+
+ expect(findAlert().exists()).toBe(true);
+ expect(findLink().attributes('href')).toBe(
+ 'https://gitlab.com/gitlab-org/gitlab/-/issues/365902',
+ );
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index de9f394db43..ad6d650670a 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -665,7 +665,6 @@ describe('Pipelines', () => {
it('stops polling & restarts polling', async () => {
findStagesDropdownToggle().trigger('click');
-
await waitForPromises();
expect(cancelMock).not.toHaveBeenCalled();
diff --git a/spec/frontend/pipelines/test_reports/stores/mutations_spec.js b/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
index 6ab479a257c..f9b9da01a2b 100644
--- a/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
+++ b/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
@@ -49,7 +49,7 @@ describe('Mutations TestReports Store', () => {
describe('set suite error', () => {
it('should set the error message in state if provided', () => {
- const message = 'Test report artifacts have expired';
+ const message = 'Test report artifacts not found';
mutations[types.SET_SUITE_ERROR](mockState, {
response: { data: { errors: message } },
diff --git a/spec/frontend/pipelines/test_reports/test_case_details_spec.js b/spec/frontend/pipelines/test_reports/test_case_details_spec.js
index 29c07e5e9f8..f194864447c 100644
--- a/spec/frontend/pipelines/test_reports/test_case_details_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_case_details_spec.js
@@ -3,6 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import TestCaseDetails from '~/pipelines/components/test_reports/test_case_details.vue';
import CodeBlock from '~/vue_shared/components/code_block.vue';
+import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
describe('Test case details', () => {
let wrapper;
@@ -19,6 +20,7 @@ describe('Test case details', () => {
system_output: 'Line 42 is broken',
};
+ const findCopyFileBtn = () => wrapper.findComponent(ModalCopyButton);
const findModal = () => wrapper.findComponent(GlModal);
const findName = () => wrapper.findByTestId('test-case-name');
const findFile = () => wrapper.findByTestId('test-case-file');
@@ -66,6 +68,10 @@ describe('Test case details', () => {
expect(findFileLink().attributes('href')).toBe(defaultTestCase.filePath);
});
+ it('renders copy button for test case file', () => {
+ expect(findCopyFileBtn().attributes('text')).toBe(defaultTestCase.file);
+ });
+
it('renders the test case duration', () => {
expect(findDuration().text()).toBe(defaultTestCase.formattedTime);
});
diff --git a/spec/frontend/pipelines/test_reports/test_reports_spec.js b/spec/frontend/pipelines/test_reports/test_reports_spec.js
index e0daf8cb4b5..3c3143b1865 100644
--- a/spec/frontend/pipelines/test_reports/test_reports_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_reports_spec.js
@@ -31,18 +31,30 @@ describe('Test reports app', () => {
const createComponent = ({ state = {} } = {}) => {
store = new Vuex.Store({
- state: {
- isLoading: false,
- selectedSuiteIndex: null,
- testReports,
- ...state,
+ modules: {
+ testReports: {
+ namespaced: true,
+ state: {
+ isLoading: false,
+ selectedSuiteIndex: null,
+ testReports,
+ ...state,
+ },
+ actions: actionSpies,
+ getters,
+ },
},
- actions: actionSpies,
- getters,
});
+ jest.spyOn(store, 'registerModule').mockReturnValue(null);
+
wrapper = extendedWrapper(
shallowMount(TestReports, {
+ provide: {
+ blobPath: '/blob/path',
+ summaryEndpoint: '/summary.json',
+ suiteEndpoint: '/suite.json',
+ },
store,
}),
);
diff --git a/spec/frontend/pipelines/test_reports/test_suite_table_spec.js b/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
index 25650b24705..c372ac06c35 100644
--- a/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
@@ -34,22 +34,32 @@ describe('Test reports suite table', () => {
const createComponent = ({ suite = testSuite, perPage = 20, errorMessage } = {}) => {
store = new Vuex.Store({
- state: {
- blobPath,
+ modules: {
testReports: {
- test_suites: [suite],
+ namespaced: true,
+ state: {
+ blobPath,
+ testReports: {
+ test_suites: [suite],
+ },
+ selectedSuiteIndex: 0,
+ pageInfo: {
+ page: 1,
+ perPage,
+ },
+ errorMessage,
+ },
+ getters,
},
- selectedSuiteIndex: 0,
- pageInfo: {
- page: 1,
- perPage,
- },
- errorMessage,
},
- getters,
});
wrapper = shallowMountExtended(SuiteTable, {
+ provide: {
+ blobPath: '/blob/path',
+ summaryEndpoint: '/summary.json',
+ suiteEndpoint: '/suite.json',
+ },
store,
stubs: { GlFriendlyWrap },
});
diff --git a/spec/frontend/pipelines/test_reports/test_summary_table_spec.js b/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
index 1598d5c337f..0e1229f7067 100644
--- a/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
@@ -20,13 +20,23 @@ describe('Test reports summary table', () => {
const createComponent = (reports = null) => {
store = new Vuex.Store({
- state: {
- testReports: reports || testReports,
+ modules: {
+ testReports: {
+ namespaced: true,
+ state: {
+ testReports: reports || testReports,
+ },
+ getters,
+ },
},
- getters,
});
wrapper = mount(SummaryTable, {
+ provide: {
+ blobPath: '/blob/path',
+ summaryEndpoint: '/summary.json',
+ suiteEndpoint: '/suite.json',
+ },
propsData: defaultProps,
store,
});
diff --git a/spec/frontend/pipelines/utils_spec.js b/spec/frontend/pipelines/utils_spec.js
index 1c23a7e4fcf..a82390fae22 100644
--- a/spec/frontend/pipelines/utils_spec.js
+++ b/spec/frontend/pipelines/utils_spec.js
@@ -8,10 +8,14 @@ import {
removeOrphanNodes,
getMaxNodes,
} from '~/pipelines/components/parsing_utils';
-import { createNodeDict } from '~/pipelines/utils';
+import { createNodeDict, calculateJobStats, calculateSlowestFiveJobs } from '~/pipelines/utils';
import { mockParsedGraphQLNodes, missingJob } from './components/dag/mock_data';
-import { generateResponse, mockPipelineResponse } from './graph/mock_data';
+import {
+ generateResponse,
+ mockPipelineResponse,
+ mockPerformanceInsightsResponse,
+} from './graph/mock_data';
describe('DAG visualization parsing utilities', () => {
const nodeDict = createNodeDict(mockParsedGraphQLNodes);
@@ -158,4 +162,40 @@ describe('DAG visualization parsing utilities', () => {
expect(columns).toMatchSnapshot();
});
});
+
+ describe('performance insights', () => {
+ const {
+ data: {
+ project: {
+ pipeline: { jobs },
+ },
+ },
+ } = mockPerformanceInsightsResponse;
+
+ describe('calculateJobStats', () => {
+ const expectedJob = jobs.nodes[0];
+
+ it('returns the job that spent this longest time queued', () => {
+ expect(calculateJobStats(jobs, 'queuedDuration')).toEqual(expectedJob);
+ });
+
+ it('returns the job that was executed last', () => {
+ expect(calculateJobStats(jobs, 'startedAt')).toEqual(expectedJob);
+ });
+ });
+
+ describe('calculateSlowestFiveJobs', () => {
+ it('returns the slowest five jobs of the pipeline', () => {
+ const expectedJobs = [
+ jobs.nodes[9],
+ jobs.nodes[1],
+ jobs.nodes[5],
+ jobs.nodes[7],
+ jobs.nodes[8],
+ ];
+
+ expect(calculateSlowestFiveJobs(jobs)).toEqual(expectedJobs);
+ });
+ });
+ });
});
diff --git a/spec/frontend/projects/new/components/new_project_url_select_spec.js b/spec/frontend/projects/new/components/new_project_url_select_spec.js
index ba22622e1f7..b6d4ee32cf5 100644
--- a/spec/frontend/projects/new/components/new_project_url_select_spec.js
+++ b/spec/frontend/projects/new/components/new_project_url_select_spec.js
@@ -4,6 +4,7 @@ import {
GlDropdownItem,
GlDropdownSectionHeader,
GlSearchBoxByType,
+ GlTruncate,
} from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
@@ -15,7 +16,6 @@ import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import eventHub from '~/projects/new/event_hub';
import NewProjectUrlSelect from '~/projects/new/components/new_project_url_select.vue';
import searchQuery from '~/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql';
-import { s__ } from '~/locale';
describe('NewProjectUrlSelect component', () => {
let wrapper;
@@ -90,6 +90,7 @@ describe('NewProjectUrlSelect component', () => {
const findButtonLabel = () => wrapper.findComponent(GlButton);
const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findSelectedPath = () => wrapper.findComponent(GlTruncate);
const findInput = () => wrapper.findComponent(GlSearchBoxByType);
const findHiddenNamespaceInput = () => wrapper.find('[name="project[namespace_id]"]');
@@ -121,14 +122,15 @@ describe('NewProjectUrlSelect component', () => {
describe('when namespaceId is provided', () => {
beforeEach(() => {
- wrapper = mountComponent();
+ wrapper = mountComponent({ mountFn: mount });
});
it('renders a dropdown with the given namespace full path as the text', () => {
- const dropdownProps = findDropdown().props();
+ expect(findSelectedPath().props('text')).toBe(defaultProvide.namespaceFullPath);
+ });
- expect(dropdownProps.text).toBe(defaultProvide.namespaceFullPath);
- expect(dropdownProps.toggleClass).not.toContain('gl-text-gray-500!');
+ it('renders a dropdown without the class', () => {
+ expect(findDropdown().props('toggleClass')).not.toContain('gl-text-gray-500!');
});
it('renders a hidden input with the given namespace id', () => {
@@ -150,14 +152,15 @@ describe('NewProjectUrlSelect component', () => {
};
beforeEach(() => {
- wrapper = mountComponent({ provide });
+ wrapper = mountComponent({ provide, mountFn: mount });
});
it("renders a dropdown with the user's namespace full path as the text", () => {
- const dropdownProps = findDropdown().props();
+ expect(findSelectedPath().props('text')).toBe('Pick a group or namespace');
+ });
- expect(dropdownProps.text).toBe(s__('ProjectsNew|Pick a group or namespace'));
- expect(dropdownProps.toggleClass).toContain('gl-text-gray-500!');
+ it('renders a dropdown with the class', () => {
+ expect(findDropdown().props('toggleClass')).toContain('gl-text-gray-500!');
});
it("renders a hidden input with the user's namespace id", () => {
@@ -236,8 +239,8 @@ describe('NewProjectUrlSelect component', () => {
expect(listItems.at(2).text()).toBe(data.currentUser.groups.nodes[2].fullPath);
});
- it('sets the selection to the group', async () => {
- expect(findDropdown().props('text')).toBe(fullPath);
+ it('sets the selection to the group', () => {
+ expect(findSelectedPath().props('text')).toBe(fullPath);
});
});
diff --git a/spec/frontend/projects/pipelines/charts/components/app_spec.js b/spec/frontend/projects/pipelines/charts/components/app_spec.js
index 98c7856a61a..7b9011fa3d9 100644
--- a/spec/frontend/projects/pipelines/charts/components/app_spec.js
+++ b/spec/frontend/projects/pipelines/charts/components/app_spec.js
@@ -14,6 +14,7 @@ jest.mock('~/lib/utils/url_utility');
const DeploymentFrequencyChartsStub = { name: 'DeploymentFrequencyCharts', render: () => {} };
const LeadTimeChartsStub = { name: 'LeadTimeCharts', render: () => {} };
const TimeToRestoreServiceChartsStub = { name: 'TimeToRestoreServiceCharts', render: () => {} };
+const ChangeFailureRateChartsStub = { name: 'ChangeFailureRateCharts', render: () => {} };
const ProjectQualitySummaryStub = { name: 'ProjectQualitySummary', render: () => {} };
describe('ProjectsPipelinesChartsApp', () => {
@@ -33,6 +34,7 @@ describe('ProjectsPipelinesChartsApp', () => {
DeploymentFrequencyCharts: DeploymentFrequencyChartsStub,
LeadTimeCharts: LeadTimeChartsStub,
TimeToRestoreServiceCharts: TimeToRestoreServiceChartsStub,
+ ChangeFailureRateCharts: ChangeFailureRateChartsStub,
ProjectQualitySummary: ProjectQualitySummaryStub,
},
},
@@ -50,6 +52,7 @@ describe('ProjectsPipelinesChartsApp', () => {
const findGlTabAtIndex = (index) => findAllGlTabs().at(index);
const findLeadTimeCharts = () => wrapper.find(LeadTimeChartsStub);
const findTimeToRestoreServiceCharts = () => wrapper.find(TimeToRestoreServiceChartsStub);
+ const findChangeFailureRateCharts = () => wrapper.find(ChangeFailureRateChartsStub);
const findDeploymentFrequencyCharts = () => wrapper.find(DeploymentFrequencyChartsStub);
const findPipelineCharts = () => wrapper.find(PipelineCharts);
const findProjectQualitySummary = () => wrapper.find(ProjectQualitySummaryStub);
@@ -59,58 +62,49 @@ describe('ProjectsPipelinesChartsApp', () => {
createComponent();
});
- it('renders tabs', () => {
- expect(findGlTabs().exists()).toBe(true);
+ describe.each`
+ title | finderFn | index
+ ${'Pipelines'} | ${findPipelineCharts} | ${0}
+ ${'Deployment frequency'} | ${findDeploymentFrequencyCharts} | ${1}
+ ${'Lead time'} | ${findLeadTimeCharts} | ${2}
+ ${'Time to restore service'} | ${findTimeToRestoreServiceCharts} | ${3}
+ ${'Change failure rate'} | ${findChangeFailureRateCharts} | ${4}
+ ${'Project quality'} | ${findProjectQualitySummary} | ${5}
+ `('Tabs', ({ title, finderFn, index }) => {
+ it(`renders tab with a title ${title} at index ${index}`, () => {
+ expect(findGlTabAtIndex(index).attributes('title')).toBe(title);
+ });
- expect(findGlTabAtIndex(0).attributes('title')).toBe('Pipelines');
- expect(findGlTabAtIndex(1).attributes('title')).toBe('Deployment frequency');
- expect(findGlTabAtIndex(2).attributes('title')).toBe('Lead time');
- expect(findGlTabAtIndex(3).attributes('title')).toBe('Time to restore service');
- });
+ it(`renders the ${title} chart`, () => {
+ expect(finderFn().exists()).toBe(true);
+ });
- it('renders the pipeline charts', () => {
- expect(findPipelineCharts().exists()).toBe(true);
- });
+ it(`updates the current tab and url when the ${title} tab is clicked`, async () => {
+ let chartsPath;
+ const tabName = title.toLowerCase().replace(/\s/g, '-');
- it('renders the deployment frequency charts', () => {
- expect(findDeploymentFrequencyCharts().exists()).toBe(true);
- });
+ setWindowLocation(`${TEST_HOST}/gitlab-org/gitlab-test/-/pipelines/charts`);
- it('renders the lead time charts', () => {
- expect(findLeadTimeCharts().exists()).toBe(true);
- });
+ mergeUrlParams.mockImplementation(({ chart }, path) => {
+ expect(chart).toBe(tabName);
+ expect(path).toBe(window.location.pathname);
+ chartsPath = `${path}?chart=${chart}`;
+ return chartsPath;
+ });
- it('renders the time to restore service charts', () => {
- expect(findTimeToRestoreServiceCharts().exists()).toBe(true);
- });
+ updateHistory.mockImplementation(({ url }) => {
+ expect(url).toBe(chartsPath);
+ });
+ const tabs = findGlTabs();
- it('renders the project quality summary', () => {
- expect(findProjectQualitySummary().exists()).toBe(true);
- });
+ expect(tabs.attributes('value')).toBe('0');
- it('sets the tab and url when a tab is clicked', async () => {
- let chartsPath;
- setWindowLocation(`${TEST_HOST}/gitlab-org/gitlab-test/-/pipelines/charts`);
+ tabs.vm.$emit('input', index);
- mergeUrlParams.mockImplementation(({ chart }, path) => {
- expect(chart).toBe('deployment-frequency');
- expect(path).toBe(window.location.pathname);
- chartsPath = `${path}?chart=${chart}`;
- return chartsPath;
- });
+ await nextTick();
- updateHistory.mockImplementation(({ url }) => {
- expect(url).toBe(chartsPath);
+ expect(tabs.attributes('value')).toBe(index.toString());
});
- const tabs = findGlTabs();
-
- expect(tabs.attributes('value')).toBe('0');
-
- tabs.vm.$emit('input', 1);
-
- await nextTick();
-
- expect(tabs.attributes('value')).toBe('1');
});
it('should not try to push history if the tab does not change', async () => {
@@ -136,6 +130,7 @@ describe('ProjectsPipelinesChartsApp', () => {
${'deployment-frequency-tab'} | ${'p_analytics_ci_cd_deployment_frequency'}
${'lead-time-tab'} | ${'p_analytics_ci_cd_lead_time'}
${'time-to-restore-service-tab'} | ${'p_analytics_ci_cd_time_to_restore_service'}
+ ${'change-failure-rate-tab'} | ${'p_analytics_ci_cd_change_failure_rate'}
`('tracks the $event event when clicked', ({ testId, event }) => {
jest.spyOn(API, 'trackRedisHllUserEvent');
@@ -151,6 +146,7 @@ describe('ProjectsPipelinesChartsApp', () => {
describe('when provided with a query param', () => {
it.each`
chart | tab
+ ${'change-failure-rate'} | ${'4'}
${'time-to-restore-service'} | ${'3'}
${'lead-time'} | ${'2'}
${'deployment-frequency'} | ${'1'}
diff --git a/spec/frontend/projects/settings/components/new_access_dropdown_spec.js b/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
index a42891423cd..1db48ce05d7 100644
--- a/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
+++ b/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
@@ -29,9 +29,20 @@ jest.mock('~/projects/settings/api/access_dropdown_api', () => ({
}),
getDeployKeys: jest.fn().mockResolvedValue({
data: [
- { id: 10, title: 'key10', fingerprint: 'abcdefghijklmnop', owner: { name: 'user1' } },
- { id: 11, title: 'key11', fingerprint: 'abcdefghijklmnop', owner: { name: 'user2' } },
- { id: 12, title: 'key12', fingerprint: 'abcdefghijklmnop', owner: { name: 'user3' } },
+ {
+ id: 10,
+ title: 'key10',
+ fingerprint: 'md5-abcdefghijklmnop',
+ fingerprint_sha256: 'sha256-abcdefghijklmnop',
+ owner: { name: 'user1' },
+ },
+ {
+ id: 11,
+ title: 'key11',
+ fingerprint_sha256: 'sha256-abcdefghijklmnop',
+ owner: { name: 'user2' },
+ },
+ { id: 12, title: 'key12', fingerprint: 'md5-abcdefghijklmnop', owner: { name: 'user3' } },
],
}),
}));
@@ -279,6 +290,7 @@ describe('Access Level Dropdown', () => {
{ id: 115, type: 'group', group_id: 5 },
{ id: 118, type: 'user', user_id: 8, name: 'user2' },
{ id: 121, type: 'deploy_key', deploy_key_id: 11 },
+ { id: 122, type: 'deploy_key', deploy_key_id: 12 },
];
const findSelected = (type) =>
@@ -309,8 +321,9 @@ describe('Access Level Dropdown', () => {
it('should set selected deploy keys as intersection between the server response and preselected mapping some keys', () => {
const selectedDeployKeys = findSelected(LEVEL_TYPES.DEPLOY_KEY);
- expect(selectedDeployKeys).toHaveLength(1);
- expect(selectedDeployKeys.at(0).text()).toContain('key11 (abcdefghijklmn...)');
+ expect(selectedDeployKeys).toHaveLength(2);
+ expect(selectedDeployKeys.at(0).text()).toContain('key11 (sha256-abcdefg...)');
+ expect(selectedDeployKeys.at(1).text()).toContain('key12 (md5-abcdefghij...)');
});
});
diff --git a/spec/frontend/protected_branches/protected_branch_edit_spec.js b/spec/frontend/protected_branches/protected_branch_edit_spec.js
index d842e00d850..6ef1b58a956 100644
--- a/spec/frontend/protected_branches/protected_branch_edit_spec.js
+++ b/spec/frontend/protected_branches/protected_branch_edit_spec.js
@@ -114,27 +114,30 @@ describe('ProtectedBranchEdit', () => {
});
describe('when clicked', () => {
- beforeEach(() => {
+ beforeEach(async () => {
mock.onPatch(TEST_URL, { protected_branch: { [patchParam]: true } }).replyOnce(200, {});
-
- toggle.click();
});
- it('checks and disables button', () => {
+ it('checks and disables button', async () => {
+ await toggle.click();
+
expect(toggle).toHaveClass(IS_CHECKED_CLASS);
expect(toggle.querySelector(IS_LOADING_SELECTOR)).not.toBe(null);
expect(toggle).toHaveClass(IS_DISABLED_CLASS);
});
- it('sends update to BE', () =>
- axios.waitForAll().then(() => {
- // Args are asserted in the `.onPatch` call
- expect(mock.history.patch).toHaveLength(1);
+ it('sends update to BE', async () => {
+ await toggle.click();
+
+ await axios.waitForAll();
- expect(toggle).not.toHaveClass(IS_DISABLED_CLASS);
- expect(toggle.querySelector(IS_LOADING_SELECTOR)).toBe(null);
- expect(createFlash).not.toHaveBeenCalled();
- }));
+ // Args are asserted in the `.onPatch` call
+ expect(mock.history.patch).toHaveLength(1);
+
+ expect(toggle).not.toHaveClass(IS_DISABLED_CLASS);
+ expect(toggle.querySelector(IS_LOADING_SELECTOR)).toBe(null);
+ expect(createFlash).not.toHaveBeenCalled();
+ });
});
describe('when clicked and BE error', () => {
@@ -143,10 +146,11 @@ describe('ProtectedBranchEdit', () => {
toggle.click();
});
- it('flashes error', () =>
- axios.waitForAll().then(() => {
- expect(createFlash).toHaveBeenCalled();
- }));
+ it('flashes error', async () => {
+ await axios.waitForAll();
+
+ expect(createFlash).toHaveBeenCalled();
+ });
});
});
});
diff --git a/spec/frontend/ref/components/ref_selector_spec.js b/spec/frontend/ref/components/ref_selector_spec.js
index e1fc60f0d92..882cb2c1199 100644
--- a/spec/frontend/ref/components/ref_selector_spec.js
+++ b/spec/frontend/ref/components/ref_selector_spec.js
@@ -162,9 +162,9 @@ describe('Ref selector component', () => {
});
describe('initialization behavior', () => {
- beforeEach(createComponent);
-
it('initializes the dropdown with branches and tags when mounted', () => {
+ createComponent();
+
return waitForRequests().then(() => {
expect(branchesApiCallSpy).toHaveBeenCalledTimes(1);
expect(tagsApiCallSpy).toHaveBeenCalledTimes(1);
@@ -173,6 +173,8 @@ describe('Ref selector component', () => {
});
it('shows a spinner while network requests are in progress', () => {
+ createComponent();
+
expect(findLoadingIcon().exists()).toBe(true);
return waitForRequests().then(() => {
diff --git a/spec/frontend/releases/__snapshots__/util_spec.js.snap b/spec/frontend/releases/__snapshots__/util_spec.js.snap
index fd2a8eec4d4..90a33152877 100644
--- a/spec/frontend/releases/__snapshots__/util_spec.js.snap
+++ b/spec/frontend/releases/__snapshots__/util_spec.js.snap
@@ -57,7 +57,7 @@ Object {
"evidences": Array [],
"milestones": Array [],
"name": "The second release",
- "releasedAt": "2019-01-10T00:00:00Z",
+ "releasedAt": 2019-01-10T00:00:00.000Z,
"tagName": "v1.2",
"tagPath": "/releases-namespace/releases-project/-/tags/v1.2",
"upcomingRelease": true,
@@ -188,7 +188,7 @@ Object {
},
],
"name": "The first release",
- "releasedAt": "2018-12-10T00:00:00Z",
+ "releasedAt": 2018-12-10T00:00:00.000Z,
"tagName": "v1.1",
"tagPath": "/releases-namespace/releases-project/-/tags/v1.1",
"upcomingRelease": true,
@@ -196,10 +196,10 @@ Object {
],
"paginationInfo": Object {
"__typename": "PageInfo",
- "endCursor": "eyJyZWxlYXNlZF9hdCI6IjIwMTgtMTItMTAgMDA6MDA6MDAuMDAwMDAwMDAwIFVUQyIsImlkIjoiMSJ9",
+ "endCursor": "eyJyZWxlYXNlZF9hdCI6IjIwMTgtMTItMTAgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwIiwiaWQiOiIxIn0",
"hasNextPage": false,
"hasPreviousPage": false,
- "startCursor": "eyJyZWxlYXNlZF9hdCI6IjIwMTktMDEtMTAgMDA6MDA6MDAuMDAwMDAwMDAwIFVUQyIsImlkIjoiMiJ9",
+ "startCursor": "eyJyZWxlYXNlZF9hdCI6IjIwMTktMDEtMTAgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwIiwiaWQiOiIyIn0",
},
}
`;
@@ -267,7 +267,9 @@ Object {
},
],
"name": "The first release",
+ "releasedAt": 2018-12-10T00:00:00.000Z,
"tagName": "v1.1",
+ "tagPath": "/releases-namespace/releases-project/-/tags/v1.1",
},
}
`;
@@ -400,7 +402,7 @@ Object {
},
],
"name": "The first release",
- "releasedAt": "2018-12-10T00:00:00Z",
+ "releasedAt": 2018-12-10T00:00:00.000Z,
"tagName": "v1.1",
"tagPath": "/releases-namespace/releases-project/-/tags/v1.1",
"upcomingRelease": true,
diff --git a/spec/frontend/releases/components/app_edit_new_spec.js b/spec/frontend/releases/components/app_edit_new_spec.js
index 80be27c92ff..cb044b9e891 100644
--- a/spec/frontend/releases/components/app_edit_new_spec.js
+++ b/spec/frontend/releases/components/app_edit_new_spec.js
@@ -1,21 +1,24 @@
-import { mount } from '@vue/test-utils';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { merge } from 'lodash';
import Vuex from 'vuex';
import { nextTick } from 'vue';
-import { GlFormCheckbox } from '@gitlab/ui';
-import originalRelease from 'test_fixtures/api/releases/release.json';
+import { GlDatepicker, GlFormCheckbox } from '@gitlab/ui';
+import originalOneReleaseForEditingQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json';
+import { convertOneReleaseGraphQLResponse } from '~/releases/util';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
-import * as commonUtils from '~/lib/utils/common_utils';
import ReleaseEditNewApp from '~/releases/components/app_edit_new.vue';
import AssetLinksForm from '~/releases/components/asset_links_form.vue';
+import ConfirmDeleteModal from '~/releases/components/confirm_delete_modal.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
+const originalRelease = originalOneReleaseForEditingQueryResponse.data.project.release;
const originalMilestones = originalRelease.milestones;
const releasesPagePath = 'path/to/releases/page';
+const upcomingReleaseDocsPath = 'path/to/upcoming/release/docs';
describe('Release edit/new component', () => {
let wrapper;
@@ -28,22 +31,24 @@ describe('Release edit/new component', () => {
const factory = async ({ featureFlags = {}, store: storeUpdates = {} } = {}) => {
state = {
release,
+ isExistingRelease: true,
markdownDocsPath: 'path/to/markdown/docs',
releasesPagePath,
projectId: '8',
groupId: '42',
groupMilestonesAvailable: true,
+ upcomingReleaseDocsPath,
};
actions = {
initializeRelease: jest.fn(),
saveRelease: jest.fn(),
addEmptyAssetLink: jest.fn(),
+ deleteRelease: jest.fn(),
};
getters = {
isValid: () => true,
- isExistingRelease: () => true,
validationErrors: () => ({
assets: {
links: [],
@@ -68,7 +73,7 @@ describe('Release edit/new component', () => {
),
);
- wrapper = mount(ReleaseEditNewApp, {
+ wrapper = mountExtended(ReleaseEditNewApp, {
store,
provide: {
glFeatures: featureFlags,
@@ -88,7 +93,7 @@ describe('Release edit/new component', () => {
mock.onGet('/api/v4/projects/8/milestones').reply(200, originalMilestones);
- release = commonUtils.convertObjectPropsToCamelCase(originalRelease, { deep: true });
+ release = convertOneReleaseGraphQLResponse(originalOneReleaseForEditingQueryResponse).data;
});
afterEach(() => {
@@ -128,6 +133,18 @@ describe('Release edit/new component', () => {
expect(wrapper.find('#release-title').element.value).toBe(release.name);
});
+ it('renders the released at date in the "Released at" datepicker', () => {
+ expect(wrapper.findComponent(GlDatepicker).props('value')).toBe(release.releasedAt);
+ });
+
+ it('links to the documentation on upcoming releases in the "Released at" description', () => {
+ const link = wrapper.findByRole('link', { name: 'Upcoming Release' });
+
+ expect(link.exists()).toBe(true);
+
+ expect(link.attributes('href')).toBe(upcomingReleaseDocsPath);
+ });
+
it('renders the release notes in the "Release notes" textarea', () => {
expect(wrapper.find('#release-notes').element.value).toBe(release.description);
});
@@ -191,9 +208,7 @@ describe('Release edit/new component', () => {
store: {
modules: {
editNew: {
- getters: {
- isExistingRelease: () => false,
- },
+ state: { isExistingRelease: false },
},
},
},
@@ -274,4 +289,31 @@ describe('Release edit/new component', () => {
});
});
});
+
+ describe('delete', () => {
+ const findConfirmDeleteModal = () => wrapper.findComponent(ConfirmDeleteModal);
+
+ it('calls the deleteRelease action on confirmation', async () => {
+ await factory();
+ findConfirmDeleteModal().vm.$emit('delete');
+
+ expect(actions.deleteRelease).toHaveBeenCalled();
+ });
+
+ it('is hidden if this is a new release', async () => {
+ await factory({
+ store: {
+ modules: {
+ editNew: {
+ state: {
+ isExistingRelease: false,
+ },
+ },
+ },
+ },
+ });
+
+ expect(findConfirmDeleteModal().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/releases/components/app_index_spec.js b/spec/frontend/releases/components/app_index_spec.js
index 63ce4c8bb17..f64f07de90e 100644
--- a/spec/frontend/releases/components/app_index_spec.js
+++ b/spec/frontend/releases/components/app_index_spec.js
@@ -8,6 +8,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql';
import createFlash from '~/flash';
import { historyPushState } from '~/lib/utils/common_utils';
+import { sprintf, __ } from '~/locale';
import ReleasesIndexApp from '~/releases/components/app_index.vue';
import ReleaseBlock from '~/releases/components/release_block.vue';
import ReleaseSkeletonLoader from '~/releases/components/release_skeleton_loader.vue';
@@ -15,6 +16,7 @@ import ReleasesEmptyState from '~/releases/components/releases_empty_state.vue';
import ReleasesPagination from '~/releases/components/releases_pagination.vue';
import ReleasesSort from '~/releases/components/releases_sort.vue';
import { PAGE_SIZE, CREATED_ASC, DEFAULT_SORT } from '~/releases/constants';
+import { deleteReleaseSessionKey } from '~/releases/util';
Vue.use(VueApollo);
@@ -44,6 +46,7 @@ describe('app_index.vue', () => {
let singleRelease;
let noReleases;
let queryMock;
+ let toast;
const createComponent = ({
singleResponse = Promise.resolve(singleRelease),
@@ -58,12 +61,17 @@ describe('app_index.vue', () => {
],
]);
+ toast = jest.fn();
+
wrapper = shallowMountExtended(ReleasesIndexApp, {
apolloProvider,
provide: {
newReleasePath,
projectPath,
},
+ mocks: {
+ $toast: { show: toast },
+ },
});
};
@@ -395,4 +403,27 @@ describe('app_index.vue', () => {
},
);
});
+
+ describe('after deleting', () => {
+ const release = 'fake release';
+ const key = deleteReleaseSessionKey(projectPath);
+
+ beforeEach(async () => {
+ window.sessionStorage.setItem(key, release);
+
+ await createComponent();
+ });
+
+ it('shows a toast', async () => {
+ expect(toast).toHaveBeenCalledWith(
+ sprintf(__('Release %{release} has been successfully deleted.'), {
+ release,
+ }),
+ );
+ });
+
+ it('clears session storage', async () => {
+ expect(window.sessionStorage.getItem(key)).toBe(null);
+ });
+ });
});
diff --git a/spec/frontend/releases/components/confirm_delete_modal_spec.js b/spec/frontend/releases/components/confirm_delete_modal_spec.js
new file mode 100644
index 00000000000..f7c526c1ced
--- /dev/null
+++ b/spec/frontend/releases/components/confirm_delete_modal_spec.js
@@ -0,0 +1,89 @@
+import Vue, { nextTick } from 'vue';
+import Vuex from 'vuex';
+import { GlModal } from '@gitlab/ui';
+import originalOneReleaseForEditingQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json';
+import { convertOneReleaseGraphQLResponse } from '~/releases/util';
+import ConfirmDeleteModal from '~/releases/components/confirm_delete_modal.vue';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { __, sprintf } from '~/locale';
+
+Vue.use(Vuex);
+
+const release = convertOneReleaseGraphQLResponse(originalOneReleaseForEditingQueryResponse).data;
+const deleteReleaseDocsPath = 'path/to/delete/release/docs';
+
+describe('~/releases/components/confirm_delete_modal.vue', () => {
+ let wrapper;
+ let state;
+
+ const factory = async () => {
+ state = {
+ release,
+ deleteReleaseDocsPath,
+ };
+
+ const store = new Vuex.Store({
+ modules: {
+ editNew: {
+ namespaced: true,
+ state,
+ },
+ },
+ });
+
+ wrapper = mountExtended(ConfirmDeleteModal, {
+ store,
+ });
+
+ await nextTick();
+ };
+
+ beforeEach(() => {
+ factory();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('button', () => {
+ it('should open the modal on click', async () => {
+ await wrapper.findByRole('button', { name: 'Delete' }).trigger('click');
+
+ const title = wrapper.findByText(
+ sprintf(__('Delete release %{release}?'), { release: release.name }),
+ );
+
+ expect(title.exists()).toBe(true);
+ });
+ });
+
+ describe('modal', () => {
+ beforeEach(async () => {
+ await wrapper.findByRole('button', { name: 'Delete' }).trigger('click');
+ });
+
+ it('confirms the user wants to delete the release', () => {
+ const text = wrapper.findByText(__('Are you sure you want to delete this release?'));
+
+ expect(text.exists()).toBe(true);
+ });
+
+ it('links to the tag', () => {
+ const tagPath = wrapper.findByRole('link', { name: release.tagName });
+ expect(tagPath.attributes('href')).toBe(release.tagPath);
+ });
+
+ it('links to the docs on deleting releases', () => {
+ const docsPath = wrapper.findByRole('link', { name: 'Deleting a release' });
+
+ expect(docsPath.attributes('href')).toBe(deleteReleaseDocsPath);
+ });
+
+ it('emits a delete event on action primary', () => {
+ wrapper.findComponent(GlModal).vm.$emit('primary');
+
+ expect(wrapper.emitted('delete')).toEqual([[]]);
+ });
+ });
+});
diff --git a/spec/frontend/releases/components/release_block_footer_spec.js b/spec/frontend/releases/components/release_block_footer_spec.js
index b095e9e1d78..848e802df4b 100644
--- a/spec/frontend/releases/components/release_block_footer_spec.js
+++ b/spec/frontend/releases/components/release_block_footer_spec.js
@@ -2,14 +2,16 @@ import { GlLink, GlIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { cloneDeep } from 'lodash';
import { nextTick } from 'vue';
-import originalRelease from 'test_fixtures/api/releases/release.json';
+import originalOneReleaseQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release.query.graphql.json';
+import { convertOneReleaseGraphQLResponse } from '~/releases/util';
import { trimText } from 'helpers/text_helper';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import ReleaseBlockFooter from '~/releases/components/release_block_footer.vue';
// TODO: Encapsulate date helpers https://gitlab.com/gitlab-org/gitlab/-/issues/320883
const MONTHS_IN_MS = 1000 * 60 * 60 * 24 * 31;
-const mockFutureDate = new Date(new Date().getTime() + MONTHS_IN_MS).toISOString();
+const mockFutureDate = new Date(new Date().getTime() + MONTHS_IN_MS);
+
+const originalRelease = convertOneReleaseGraphQLResponse(originalOneReleaseQueryResponse).data;
describe('Release block footer', () => {
let wrapper;
@@ -18,7 +20,7 @@ describe('Release block footer', () => {
const factory = async (props = {}) => {
wrapper = mount(ReleaseBlockFooter, {
propsData: {
- ...convertObjectPropsToCamelCase(release, { deep: true }),
+ ...originalRelease,
...props,
},
});
@@ -55,8 +57,8 @@ describe('Release block footer', () => {
const commitLink = commitInfoSectionLink();
expect(commitLink.exists()).toBe(true);
- expect(commitLink.text()).toBe(release.commit.short_id);
- expect(commitLink.attributes('href')).toBe(release.commit_path);
+ expect(commitLink.text()).toBe(release.commit.shortId);
+ expect(commitLink.attributes('href')).toBe(release.commitPath);
});
it('renders the tag icon', () => {
@@ -70,8 +72,8 @@ describe('Release block footer', () => {
const commitLink = tagInfoSection().find(GlLink);
expect(commitLink.exists()).toBe(true);
- expect(commitLink.text()).toBe(release.tag_name);
- expect(commitLink.attributes('href')).toBe(release.tag_path);
+ expect(commitLink.text()).toBe(release.tagName);
+ expect(commitLink.attributes('href')).toBe(release.tagPath);
});
it('renders the author and creation time info', () => {
@@ -114,14 +116,14 @@ describe('Release block footer', () => {
const avatarImg = authorDateInfoSection().find('img');
expect(avatarImg.exists()).toBe(true);
- expect(avatarImg.attributes('src')).toBe(release.author.avatar_url);
+ expect(avatarImg.attributes('src')).toBe(release.author.avatarUrl);
});
it("renders a link to the author's profile", () => {
const authorLink = authorDateInfoSection().find(GlLink);
expect(authorLink.exists()).toBe(true);
- expect(authorLink.attributes('href')).toBe(release.author.web_url);
+ expect(authorLink.attributes('href')).toBe(release.author.webUrl);
});
});
@@ -138,7 +140,7 @@ describe('Release block footer', () => {
it('renders the commit SHA as plain text (instead of a link)', () => {
expect(commitInfoSectionLink().exists()).toBe(false);
- expect(commitInfoSection().text()).toBe(release.commit.short_id);
+ expect(commitInfoSection().text()).toBe(release.commit.shortId);
});
});
@@ -155,7 +157,7 @@ describe('Release block footer', () => {
it('renders the tag name as plain text (instead of a link)', () => {
expect(tagInfoSectionLink().exists()).toBe(false);
- expect(tagInfoSection().text()).toBe(release.tag_name);
+ expect(tagInfoSection().text()).toBe(release.tagName);
});
});
diff --git a/spec/frontend/releases/components/release_block_spec.js b/spec/frontend/releases/components/release_block_spec.js
index c4910ae9b2f..17e2af687a6 100644
--- a/spec/frontend/releases/components/release_block_spec.js
+++ b/spec/frontend/releases/components/release_block_spec.js
@@ -1,7 +1,8 @@
import { mount } from '@vue/test-utils';
import $ from 'jquery';
import { nextTick } from 'vue';
-import originalRelease from 'test_fixtures/api/releases/release.json';
+import originalOneReleaseQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release.query.graphql.json';
+import { convertOneReleaseGraphQLResponse } from '~/releases/util';
import * as commonUtils from '~/lib/utils/common_utils';
import * as urlUtility from '~/lib/utils/url_utility';
import EvidenceBlock from '~/releases/components/evidence_block.vue';
@@ -34,7 +35,7 @@ describe('Release block', () => {
beforeEach(() => {
jest.spyOn($.fn, 'renderGFM');
- release = commonUtils.convertObjectPropsToCamelCase(originalRelease, { deep: true });
+ release = convertOneReleaseGraphQLResponse(originalOneReleaseQueryResponse).data;
});
afterEach(() => {
diff --git a/spec/frontend/releases/components/tag_field_spec.js b/spec/frontend/releases/components/tag_field_spec.js
index db08f874959..e7b9aa4abbb 100644
--- a/spec/frontend/releases/components/tag_field_spec.js
+++ b/spec/frontend/releases/components/tag_field_spec.js
@@ -9,14 +9,14 @@ describe('releases/components/tag_field', () => {
let store;
let wrapper;
- const createComponent = ({ tagName }) => {
+ const createComponent = ({ isExistingRelease }) => {
store = createStore({
modules: {
editNew: createEditNewModule({}),
},
});
- store.state.editNew.tagName = tagName;
+ store.state.editNew.isExistingRelease = isExistingRelease;
wrapper = shallowMount(TagField, { store });
};
@@ -31,7 +31,7 @@ describe('releases/components/tag_field', () => {
describe('when an existing release is being edited', () => {
beforeEach(() => {
- createComponent({ tagName: 'v1.0' });
+ createComponent({ isExistingRelease: true });
});
it('renders the TagFieldExisting component', () => {
@@ -45,7 +45,7 @@ describe('releases/components/tag_field', () => {
describe('when a new release is being created', () => {
beforeEach(() => {
- createComponent({ tagName: null });
+ createComponent({ isExistingRelease: false });
});
it('renders the TagFieldNew component', () => {
diff --git a/spec/frontend/releases/stores/modules/detail/actions_spec.js b/spec/frontend/releases/stores/modules/detail/actions_spec.js
index 41653f62ebf..ce3b690213c 100644
--- a/spec/frontend/releases/stores/modules/detail/actions_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/actions_spec.js
@@ -9,10 +9,15 @@ import { ASSET_LINK_TYPE } from '~/releases/constants';
import createReleaseAssetLinkMutation from '~/releases/graphql/mutations/create_release_link.mutation.graphql';
import deleteReleaseAssetLinkMutation from '~/releases/graphql/mutations/delete_release_link.mutation.graphql';
import updateReleaseMutation from '~/releases/graphql/mutations/update_release.mutation.graphql';
+import deleteReleaseMutation from '~/releases/graphql/mutations/delete_release.mutation.graphql';
import * as actions from '~/releases/stores/modules/edit_new/actions';
import * as types from '~/releases/stores/modules/edit_new/mutation_types';
import createState from '~/releases/stores/modules/edit_new/state';
-import { gqClient, convertOneReleaseGraphQLResponse } from '~/releases/util';
+import {
+ gqClient,
+ convertOneReleaseGraphQLResponse,
+ deleteReleaseSessionKey,
+} from '~/releases/util';
jest.mock('~/api/tags_api');
@@ -37,19 +42,15 @@ describe('Release edit/new actions', () => {
let error;
const setupState = (updates = {}) => {
- const getters = {
- isExistingRelease: true,
- };
-
state = {
...createState({
projectId: '18',
+ isExistingRelease: true,
tagName: releaseResponse.tag_name,
releasesPagePath: 'path/to/releases/page',
markdownDocsPath: 'path/to/markdown/docs',
markdownPreviewPath: 'path/to/markdown/preview',
}),
- ...getters,
...updates,
};
};
@@ -168,6 +169,15 @@ describe('Release edit/new actions', () => {
});
});
+ describe('updateReleasedAt', () => {
+ it(`commits ${types.UPDATE_RELEASED_AT} with the updated date`, () => {
+ const newDate = new Date();
+ return testAction(actions.updateReleasedAt, newDate, state, [
+ { type: types.UPDATE_RELEASED_AT, payload: newDate },
+ ]);
+ });
+ });
+
describe('updateCreateFrom', () => {
it(`commits ${types.UPDATE_CREATE_FROM} with the updated ref`, () => {
const newRef = 'my-feature-branch';
@@ -177,6 +187,15 @@ describe('Release edit/new actions', () => {
});
});
+ describe('updateShowCreateFrom', () => {
+ it(`commits ${types.UPDATE_SHOW_CREATE_FROM} with the updated ref`, () => {
+ const newRef = 'my-feature-branch';
+ return testAction(actions.updateShowCreateFrom, newRef, state, [
+ { type: types.UPDATE_SHOW_CREATE_FROM, payload: newRef },
+ ]);
+ });
+ });
+
describe('updateReleaseTitle', () => {
it(`commits ${types.UPDATE_RELEASE_TITLE} with the updated release title`, () => {
const newTitle = 'The new release title';
@@ -572,6 +591,133 @@ describe('Release edit/new actions', () => {
});
});
+ describe('deleteRelease', () => {
+ let getters;
+ let dispatch;
+ let commit;
+ let release;
+
+ beforeEach(() => {
+ getters = {
+ releaseDeleteMutationVariables: {
+ input: {
+ projectPath: 'test-org/test',
+ tagName: 'v1.0',
+ },
+ },
+ };
+
+ release = convertOneReleaseGraphQLResponse(releaseResponse).data;
+
+ setupState({
+ release,
+ originalRelease: release,
+ ...getters,
+ });
+
+ dispatch = jest.fn();
+ commit = jest.fn();
+
+ gqClient.mutate.mockResolvedValue({
+ data: {
+ releaseDelete: {
+ errors: [],
+ },
+ releaseAssetLinkDelete: {
+ errors: [],
+ },
+ },
+ });
+ });
+
+ describe('when the delete is successful', () => {
+ beforeEach(() => {
+ window.sessionStorage.clear();
+ });
+
+ it('dispatches receiveSaveReleaseSuccess', async () => {
+ await actions.deleteRelease({ commit, dispatch, state, getters });
+ expect(dispatch.mock.calls).toEqual([
+ ['receiveSaveReleaseSuccess', state.releasesPagePath],
+ ]);
+ });
+
+ it('deletes the release', async () => {
+ await actions.deleteRelease({ commit, dispatch, state, getters });
+ expect(gqClient.mutate.mock.calls[0]).toEqual([
+ {
+ mutation: deleteReleaseMutation,
+ variables: getters.releaseDeleteMutationVariables,
+ },
+ ]);
+ });
+
+ it('stores the name for toasting', async () => {
+ await actions.deleteRelease({ commit, dispatch, state, getters });
+ expect(window.sessionStorage.getItem(deleteReleaseSessionKey(state.projectPath))).toBe(
+ state.release.name,
+ );
+ });
+ });
+
+ describe('when the delete request fails', () => {
+ beforeEach(() => {
+ gqClient.mutate.mockRejectedValue(error);
+ });
+
+ it('dispatches requestDeleteRelease and receiveSaveReleaseError with an error object', async () => {
+ await actions.deleteRelease({ commit, dispatch, state, getters });
+
+ expect(commit.mock.calls).toContainEqual([types.RECEIVE_SAVE_RELEASE_ERROR, error]);
+ });
+
+ it('shows a flash message', async () => {
+ await actions.deleteRelease({ commit, dispatch, state, getters });
+
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Something went wrong while deleting the release.',
+ });
+ });
+ });
+
+ describe('when the delete returns errors', () => {
+ beforeEach(() => {
+ gqClient.mutate.mockResolvedValue({
+ data: {
+ releaseUpdate: {
+ errors: ['Something went wrong!'],
+ },
+ releaseAssetLinkDelete: {
+ errors: [],
+ },
+ releaseAssetLinkCreate: {
+ errors: [],
+ },
+ },
+ });
+ });
+
+ it('dispatches requestDeleteRelease and receiveSaveReleaseError with an error object', async () => {
+ await actions.deleteRelease({ commit, dispatch, state, getters });
+
+ expect(commit.mock.calls).toContainEqual([
+ types.RECEIVE_SAVE_RELEASE_ERROR,
+ expect.any(Error),
+ ]);
+ });
+
+ it('shows a flash message', async () => {
+ await actions.deleteRelease({ commit, dispatch, state, getters });
+
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Something went wrong while deleting the release.',
+ });
+ });
+ });
+ });
+
describe('fetchTagNotes', () => {
const tagName = 'v8.0.0';
diff --git a/spec/frontend/releases/stores/modules/detail/getters_spec.js b/spec/frontend/releases/stores/modules/detail/getters_spec.js
index c42c6c00f56..4ac6eaebaa2 100644
--- a/spec/frontend/releases/stores/modules/detail/getters_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/getters_spec.js
@@ -2,20 +2,6 @@ import { s__ } from '~/locale';
import * as getters from '~/releases/stores/modules/edit_new/getters';
describe('Release edit/new getters', () => {
- describe('isExistingRelease', () => {
- it('returns true if the release is an existing release that already exists in the database', () => {
- const state = { tagName: 'test-tag-name' };
-
- expect(getters.isExistingRelease(state)).toBe(true);
- });
-
- it('returns false if the release is a new release that has not yet been saved to the database', () => {
- const state = { tagName: null };
-
- expect(getters.isExistingRelease(state)).toBe(false);
- });
- });
-
describe('releaseLinksToCreate', () => {
it("returns an empty array if state.release doesn't exist", () => {
const state = {};
@@ -302,6 +288,7 @@ describe('Release edit/new getters', () => {
name: 'release.name',
description: 'release.description',
milestones: ['release.milestone[0].title'],
+ releasedAt: new Date(2022, 5, 30),
},
},
{
@@ -310,6 +297,7 @@ describe('Release edit/new getters', () => {
name: 'release.name',
description: 'release.description',
milestones: ['release.milestone[0].title'],
+ releasedAt: new Date(2022, 5, 30),
},
],
[
@@ -381,6 +369,26 @@ describe('Release edit/new getters', () => {
});
});
+ describe('releaseDeleteMutationVariables', () => {
+ it('returns all the data needed for the releaseDelete GraphQL mutation', () => {
+ const state = {
+ projectPath: 'test-org/test',
+ release: { tagName: 'v1.0' },
+ };
+
+ const expectedVariables = {
+ input: {
+ projectPath: 'test-org/test',
+ tagName: 'v1.0',
+ },
+ };
+
+ const actualVariables = getters.releaseDeleteMutationVariables(state);
+
+ expect(actualVariables).toEqual(expectedVariables);
+ });
+ });
+
describe('formattedReleaseNotes', () => {
it.each`
description | includeTagNotes | tagNotes | included
diff --git a/spec/frontend/releases/stores/modules/detail/mutations_spec.js b/spec/frontend/releases/stores/modules/detail/mutations_spec.js
index 85844831e0b..60b57c7a7ff 100644
--- a/spec/frontend/releases/stores/modules/detail/mutations_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/mutations_spec.js
@@ -25,11 +25,12 @@ describe('Release edit/new mutations', () => {
mutations[types.INITIALIZE_EMPTY_RELEASE](state);
expect(state.release).toEqual({
- tagName: null,
+ tagName: 'v1.3',
name: '',
description: '',
milestones: [],
groupMilestones: [],
+ releasedAt: new Date(),
assets: {
links: [],
},
@@ -82,6 +83,16 @@ describe('Release edit/new mutations', () => {
});
});
+ describe(`${types.UPDATE_RELEASED_AT}`, () => {
+ it("updates the release's released at date", () => {
+ state.release = release;
+ const newDate = new Date();
+ mutations[types.UPDATE_RELEASED_AT](state, newDate);
+
+ expect(state.release.releasedAt).toBe(newDate);
+ });
+ });
+
describe(`${types.UPDATE_CREATE_FROM}`, () => {
it('updates the ref that the ref will be created from', () => {
state.createFrom = 'main';
@@ -92,6 +103,16 @@ describe('Release edit/new mutations', () => {
});
});
+ describe(`${types.UPDATE_SHOW_CREATE_FROM}`, () => {
+ it('updates the ref that the ref will be created from', () => {
+ state.showCreateFrom = true;
+ const newValue = false;
+ mutations[types.UPDATE_SHOW_CREATE_FROM](state, newValue);
+
+ expect(state.showCreateFrom).toBe(newValue);
+ });
+ });
+
describe(`${types.UPDATE_RELEASE_TITLE}`, () => {
it("updates the release's title", () => {
state.release = release;
diff --git a/spec/frontend/reports/components/grouped_issues_list_spec.js b/spec/frontend/reports/components/grouped_issues_list_spec.js
index c6eebf05dd7..95ef0bcbcc7 100644
--- a/spec/frontend/reports/components/grouped_issues_list_spec.js
+++ b/spec/frontend/reports/components/grouped_issues_list_spec.js
@@ -17,7 +17,6 @@ describe('Grouped Issues List', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
it('renders a smart virtual list with the correct props', () => {
@@ -35,13 +34,15 @@ describe('Grouped Issues List', () => {
});
describe('without data', () => {
- beforeEach(createComponent);
+ beforeEach(() => {
+ createComponent();
+ });
it.each(['unresolved', 'resolved'])('does not a render a header for %s issues', (issueName) => {
expect(findHeading(issueName).exists()).toBe(false);
});
- it.each('resolved', 'unresolved')('does not render report items for %s issues', () => {
+ it.each(['resolved', 'unresolved'])('does not render report items for %s issues', () => {
expect(wrapper.find(ReportItem).exists()).toBe(false);
});
});
diff --git a/spec/frontend/reports/mock_data/new_failures_report.json b/spec/frontend/reports/mock_data/new_failures_report.json
index 8b9c12c6271..438f7c82788 100644
--- a/spec/frontend/reports/mock_data/new_failures_report.json
+++ b/spec/frontend/reports/mock_data/new_failures_report.json
@@ -8,12 +8,14 @@
{
"result": "failure",
"name": "Test#sum when a is 1 and b is 2 returns summary",
+ "file": "spec/file_1.rb",
"execution_time": 0.009411,
"system_output": "Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in <top (required)>'"
},
{
"result": "failure",
"name": "Test#sum when a is 100 and b is 200 returns summary",
+ "file": "spec/file_2.rb",
"execution_time": 0.000162,
"system_output": "Failure/Error: is_expected.to eq(300)\n\n expected: 300\n got: -100\n\n (compared using ==)\n./spec/test_spec.rb:21:in `block (4 levels) in <top (required)>'"
}
diff --git a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
index 4732d68c8c6..cb56f392ec9 100644
--- a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
+++ b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
@@ -17,7 +17,7 @@ exports[`Repository last commit component renders commit widget 1`] = `
/>
<div
- class="commit-detail flex-list"
+ class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-flex-start gl-flex-grow-1 gl-min-w-0"
>
<div
class="commit-content qa-commit-content"
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index d498b6f0c4f..2b70cb84c67 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -136,6 +136,7 @@ describe('Blob content viewer component', () => {
const findBlobButtonGroup = () => wrapper.findComponent(BlobButtonGroup);
const findForkSuggestion = () => wrapper.findComponent(ForkSuggestion);
const findCodeIntelligence = () => wrapper.findComponent(CodeIntelligence);
+ const findSourceViewer = () => wrapper.findComponent(SourceViewer);
beforeEach(() => {
jest.spyOn(window, 'requestIdleCallback').mockImplementation(execImmediately);
@@ -197,6 +198,16 @@ describe('Blob content viewer component', () => {
expect(mockAxios.history.get[0].url).toBe(legacyViewerUrl);
});
+ it('loads a legacy viewer when the source viewer emits an error', async () => {
+ loadViewer.mockReturnValueOnce(SourceViewer);
+ await createComponent();
+ findSourceViewer().vm.$emit('error');
+ await waitForPromises();
+
+ expect(mockAxios.history.get).toHaveLength(1);
+ expect(mockAxios.history.get[0].url).toBe(legacyViewerUrl);
+ });
+
it('loads a legacy viewer when a viewer component is not available', async () => {
await createComponent({ blob: { ...simpleViewerMock, fileType: 'unknown' } });
diff --git a/spec/frontend/repository/components/last_commit_spec.js b/spec/frontend/repository/components/last_commit_spec.js
index cfbf74e34aa..3783b34e33a 100644
--- a/spec/frontend/repository/components/last_commit_spec.js
+++ b/spec/frontend/repository/components/last_commit_spec.js
@@ -1,179 +1,227 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
import { GlLoadingIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
import LastCommit from '~/repository/components/last_commit.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-
-let vm;
-
-function createCommitData(data = {}) {
- const defaultData = {
- sha: '123456789',
- title: 'Commit title',
- titleHtml: 'Commit title',
- message: 'Commit message',
- webPath: '/commit/123',
- authoredDate: '2019-01-01',
- author: {
- name: 'Test',
- avatarUrl: 'https://test.com',
- webPath: '/test',
- },
- pipeline: {
+import pathLastCommitQuery from 'shared_queries/repository/path_last_commit.query.graphql';
+import { refMock } from '../mock_data';
+
+let wrapper;
+let mockResolver;
+
+const findPipeline = () => wrapper.find('.js-commit-pipeline');
+const findTextExpander = () => wrapper.find('.text-expander');
+const findUserLink = () => wrapper.find('.js-user-link');
+const findUserAvatarLink = () => wrapper.findComponent(UserAvatarLink);
+const findLastCommitLabel = () => wrapper.findByTestId('last-commit-id-label');
+const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+const findCommitRowDescription = () => wrapper.find('.commit-row-description');
+const findStatusBox = () => wrapper.find('.gpg-status-box');
+const findItemTitle = () => wrapper.find('.item-title');
+
+const defaultPipelineEdges = [
+ {
+ __typename: 'PipelineEdge',
+ node: {
+ __typename: 'Pipeline',
+ id: 'gid://gitlab/Ci::Pipeline/167',
detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'id',
detailsPath: 'https://test.com/pipeline',
- icon: 'failed',
+ icon: 'status_running',
tooltip: 'failed',
text: 'failed',
- group: {},
+ group: 'failed',
},
},
- };
- return Object.assign(defaultData, data);
-}
-
-function factory(commit = createCommitData(), loading = false) {
- vm = shallowMount(LastCommit, {
- mocks: {
- $apollo: {
- queries: {
- commit: {
- loading: true,
+ },
+];
+
+const defaultAuthor = {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/1',
+ name: 'Test',
+ avatarUrl: 'https://test.com',
+ webPath: '/test',
+};
+
+const defaultMessage = 'Commit title';
+
+const createCommitData = ({
+ pipelineEdges = defaultPipelineEdges,
+ author = defaultAuthor,
+ descriptionHtml = '',
+ signatureHtml = null,
+ message = defaultMessage,
+}) => {
+ return {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 'gid://gitlab/Project/6',
+ repository: {
+ __typename: 'Repository',
+ paginatedTree: {
+ __typename: 'TreeConnection',
+ nodes: [
+ {
+ __typename: 'Tree',
+ lastCommit: {
+ __typename: 'Commit',
+ id: 'gid://gitlab/CommitPresenter/123456789',
+ sha: '123456789',
+ title: 'Commit title',
+ titleHtml: 'Commit title',
+ descriptionHtml,
+ message,
+ webPath: '/commit/123',
+ authoredDate: '2019-01-01',
+ authorName: 'Test',
+ authorGravatar: 'https://test.com',
+ author,
+ signatureHtml,
+ pipelines: {
+ __typename: 'PipelineConnection',
+ edges: pipelineEdges,
+ },
+ },
+ },
+ ],
},
},
},
},
- });
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- vm.setData({ commit });
- vm.vm.$apollo.queries.commit.loading = loading;
-}
+ };
+};
-const emptyMessageClass = 'font-italic';
+const createComponent = async (data = {}) => {
+ Vue.use(VueApollo);
-describe('Repository last commit component', () => {
- afterEach(() => {
- vm.destroy();
+ const currentPath = 'path';
+
+ mockResolver = jest.fn().mockResolvedValue(createCommitData(data));
+
+ wrapper = shallowMountExtended(LastCommit, {
+ apolloProvider: createMockApollo([[pathLastCommitQuery, mockResolver]]),
+ propsData: { currentPath },
+ mixins: [{ data: () => ({ ref: refMock }) }],
});
+};
+
+afterEach(() => {
+ wrapper.destroy();
+ mockResolver = null;
+});
+describe('Repository last commit component', () => {
it.each`
loading | label
${true} | ${'shows'}
${false} | ${'hides'}
- `('$label when loading icon $loading is true', async ({ loading }) => {
- factory(createCommitData(), loading);
+ `('$label when loading icon is $loading', async ({ loading }) => {
+ createComponent();
- await nextTick();
+ if (!loading) {
+ await waitForPromises();
+ }
- expect(vm.find(GlLoadingIcon).exists()).toBe(loading);
+ expect(findLoadingIcon().exists()).toBe(loading);
});
it('renders commit widget', async () => {
- factory();
+ createComponent();
+ await waitForPromises();
- await nextTick();
-
- expect(vm.element).toMatchSnapshot();
+ expect(wrapper.element).toMatchSnapshot();
});
it('renders short commit ID', async () => {
- factory();
-
- await nextTick();
+ createComponent();
+ await waitForPromises();
- expect(vm.find('[data-testid="last-commit-id-label"]').text()).toEqual('12345678');
+ expect(findLastCommitLabel().text()).toBe('12345678');
});
it('hides pipeline components when pipeline does not exist', async () => {
- factory(createCommitData({ pipeline: null }));
+ createComponent({ pipelineEdges: [] });
+ await waitForPromises();
- await nextTick();
-
- expect(vm.find('.js-commit-pipeline').exists()).toBe(false);
+ expect(findPipeline().exists()).toBe(false);
});
- it('renders pipeline components', async () => {
- factory();
-
- await nextTick();
+ it('renders pipeline components when pipeline exists', async () => {
+ createComponent();
+ await waitForPromises();
- expect(vm.find('.js-commit-pipeline').exists()).toBe(true);
+ expect(findPipeline().exists()).toBe(true);
});
it('hides author component when author does not exist', async () => {
- factory(createCommitData({ author: null }));
+ createComponent({ author: null });
+ await waitForPromises();
- await nextTick();
-
- expect(vm.find('.js-user-link').exists()).toBe(false);
- expect(vm.find(UserAvatarLink).exists()).toBe(false);
+ expect(findUserLink().exists()).toBe(false);
+ expect(findUserAvatarLink().exists()).toBe(false);
});
it('does not render description expander when description is null', async () => {
- factory(createCommitData({ descriptionHtml: null }));
-
- await nextTick();
+ createComponent();
+ await waitForPromises();
- expect(vm.find('.text-expander').exists()).toBe(false);
- expect(vm.find('.commit-row-description').exists()).toBe(false);
+ expect(findTextExpander().exists()).toBe(false);
+ expect(findCommitRowDescription().exists()).toBe(false);
});
- it('expands commit description when clicking expander', async () => {
- factory(createCommitData({ descriptionHtml: 'Test description' }));
-
- await nextTick();
-
- vm.find('.text-expander').vm.$emit('click');
-
- await nextTick();
-
- expect(vm.find('.commit-row-description').isVisible()).toBe(true);
- expect(vm.find('.text-expander').classes('open')).toBe(true);
- });
-
- it('strips the first newline of the description', async () => {
- factory(createCommitData({ descriptionHtml: '&#x000A;Update ADOPTERS.md' }));
-
- await nextTick();
-
- expect(vm.find('.commit-row-description').html()).toBe(
- '<pre class="commit-row-description gl-mb-3">Update ADOPTERS.md</pre>',
- );
+ describe('when the description is present', () => {
+ beforeEach(async () => {
+ createComponent({ descriptionHtml: '&#x000A;Update ADOPTERS.md' });
+ await waitForPromises();
+ });
+
+ it('strips the first newline of the description', () => {
+ expect(findCommitRowDescription().html()).toBe(
+ '<pre class="commit-row-description gl-mb-3">Update ADOPTERS.md</pre>',
+ );
+ });
+
+ it('expands commit description when clicking expander', async () => {
+ findTextExpander().vm.$emit('click');
+ await nextTick();
+
+ expect(findCommitRowDescription().isVisible()).toBe(true);
+ expect(findTextExpander().classes()).toContain('open');
+ });
});
it('renders the signature HTML as returned by the backend', async () => {
- factory(
- createCommitData({
- signatureHtml: `<a
- class="btn gpg-status-box valid"
- data-content="signature-content"
- data-html="true"
- data-placement="top"
- data-title="signature-title"
- data-toggle="popover"
- role="button"
- tabindex="0"
- >
- Verified
- </a>`,
- }),
- );
-
- await nextTick();
-
- expect(vm.find('.gpg-status-box').html()).toBe(
- `<a class="btn gpg-status-box valid" data-content="signature-content" data-html="true" data-placement="top" data-title="signature-title" data-toggle="popover" role="button" tabindex="0">
- Verified
-</a>`,
+ createComponent({
+ signatureHtml: `<a
+ class="btn gpg-status-box valid"
+ data-content="signature-content"
+ data-html="true"
+ data-placement="top"
+ data-title="signature-title"
+ data-toggle="popover"
+ role="button"
+ tabindex="0"
+ >Verified</a>`,
+ });
+ await waitForPromises();
+
+ expect(findStatusBox().html()).toBe(
+ `<a class="btn gpg-status-box valid" data-content="signature-content" data-html="true" data-placement="top" data-title="signature-title" data-toggle="popover" role="button" tabindex="0">Verified</a>`,
);
});
it('sets correct CSS class if the commit message is empty', async () => {
- factory(createCommitData({ message: '' }));
-
- await nextTick();
+ createComponent({ message: '' });
+ await waitForPromises();
- expect(vm.find('.item-title').classes()).toContain(emptyMessageClass);
+ expect(findItemTitle().classes()).toContain('font-italic');
});
});
diff --git a/spec/frontend/repository/components/table/row_spec.js b/spec/frontend/repository/components/table/row_spec.js
index 22570b2d6ed..13b09e57473 100644
--- a/spec/frontend/repository/components/table/row_spec.js
+++ b/spec/frontend/repository/components/table/row_spec.js
@@ -31,7 +31,7 @@ function factory(propsData = {}) {
GlHoverLoad: createMockDirective(),
},
provide: {
- glFeatures: { refactorBlobViewer: true, lazyLoadCommits: true },
+ glFeatures: { lazyLoadCommits: true },
},
mocks: {
$router,
@@ -244,8 +244,6 @@ describe('Repository table row component', () => {
});
describe('row visibility', () => {
- beforeAll(() => jest.useFakeTimers());
-
beforeEach(() => {
factory({
id: '1',
@@ -260,12 +258,13 @@ describe('Repository table row component', () => {
afterAll(() => jest.useRealTimers());
it('emits a `row-appear` event', async () => {
+ const setTimeoutSpy = jest.spyOn(global, 'setTimeout');
findIntersectionObserver().vm.$emit('appear');
jest.runAllTimers();
- expect(setTimeout).toHaveBeenCalledTimes(1);
- expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), ROW_APPEAR_DELAY);
+ expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
+ expect(setTimeoutSpy).toHaveBeenLastCalledWith(expect.any(Function), ROW_APPEAR_DELAY);
expect(vm.emitted('row-appear')).toEqual([[123]]);
});
});
diff --git a/spec/frontend/repository/log_tree_spec.js b/spec/frontend/repository/log_tree_spec.js
index 5186c9a8992..e3b4dcb8acc 100644
--- a/spec/frontend/repository/log_tree_spec.js
+++ b/spec/frontend/repository/log_tree_spec.js
@@ -16,19 +16,18 @@ const mockData = [
commit_path: `https://test.com`,
commit_title_html: 'commit title',
file_name: 'index.js',
- type: 'blob',
},
];
describe('resolveCommit', () => {
it('calls resolve when commit found', () => {
const resolver = {
- entry: { name: 'index.js', type: 'blob' },
+ entry: { name: 'index.js' },
resolve: jest.fn(),
};
const commits = [
- { fileName: 'index.js', filePath: '/index.js', type: 'blob' },
- { fileName: 'index.js', filePath: '/app/assets/index.js', type: 'blob' },
+ { fileName: 'index.js', filePath: '/index.js' },
+ { fileName: 'index.js', filePath: '/app/assets/index.js' },
];
resolveCommit(commits, '', resolver);
@@ -36,7 +35,6 @@ describe('resolveCommit', () => {
expect(resolver.resolve).toHaveBeenCalledWith({
fileName: 'index.js',
filePath: '/index.js',
- type: 'blob',
});
});
});
@@ -56,7 +54,7 @@ describe('fetchLogsTree', () => {
global.gon = { relative_url_root: '' };
resolver = {
- entry: { name: 'index.js', type: 'blob' },
+ entry: { name: 'index.js' },
resolve: jest.fn(),
};
@@ -119,7 +117,6 @@ describe('fetchLogsTree', () => {
filePath: '/index.js',
message: 'testing message',
sha: '123',
- type: 'blob',
}),
);
}));
@@ -136,7 +133,6 @@ describe('fetchLogsTree', () => {
message: 'testing message',
sha: '123',
titleHtml: 'commit title',
- type: 'blob',
}),
],
});
diff --git a/spec/frontend/repository/utils/commit_spec.js b/spec/frontend/repository/utils/commit_spec.js
index aaaa39f739f..b3dd5118308 100644
--- a/spec/frontend/repository/utils/commit_spec.js
+++ b/spec/frontend/repository/utils/commit_spec.js
@@ -10,7 +10,6 @@ const mockData = [
commit_path: `https://test.com`,
commit_title_html: 'testing message',
file_name: 'index.js',
- type: 'blob',
},
];
@@ -24,7 +23,6 @@ describe('normalizeData', () => {
commitPath: 'https://test.com',
fileName: 'index.js',
filePath: '/index.js',
- type: 'blob',
titleHtml: 'testing message',
__typename: 'LogTreeCommit',
},
diff --git a/spec/frontend/runner/admin_runner_show/admin_runner_show_app_spec.js b/spec/frontend/runner/admin_runner_show/admin_runner_show_app_spec.js
index 28e7d192938..433be5d5027 100644
--- a/spec/frontend/runner/admin_runner_show/admin_runner_show_app_spec.js
+++ b/spec/frontend/runner/admin_runner_show/admin_runner_show_app_spec.js
@@ -9,6 +9,7 @@ import { redirectTo } from '~/lib/utils/url_utility';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerHeader from '~/runner/components/runner_header.vue';
+import RunnerDetails from '~/runner/components/runner_details.vue';
import RunnerPauseButton from '~/runner/components/runner_pause_button.vue';
import RunnerDeleteButton from '~/runner/components/runner_delete_button.vue';
import RunnerEditButton from '~/runner/components/runner_edit_button.vue';
@@ -37,6 +38,7 @@ describe('AdminRunnerShowApp', () => {
let mockRunnerQuery;
const findRunnerHeader = () => wrapper.findComponent(RunnerHeader);
+ const findRunnerDetails = () => wrapper.findComponent(RunnerDetails);
const findRunnerDeleteButton = () => wrapper.findComponent(RunnerDeleteButton);
const findRunnerEditButton = () => wrapper.findComponent(RunnerEditButton);
const findRunnerPauseButton = () => wrapper.findComponent(RunnerPauseButton);
@@ -179,12 +181,32 @@ describe('AdminRunnerShowApp', () => {
});
});
+ describe('When loading', () => {
+ beforeEach(() => {
+ mockRunnerQueryResult();
+
+ createComponent();
+ });
+
+ it('does not show runner details', () => {
+ expect(findRunnerDetails().exists()).toBe(false);
+ });
+
+ it('does not show runner jobs', () => {
+ expect(findRunnersJobs().exists()).toBe(false);
+ });
+ });
+
describe('When there is an error', () => {
beforeEach(async () => {
mockRunnerQuery = jest.fn().mockRejectedValueOnce(new Error('Error!'));
await createComponent();
});
+ it('does not show runner details', () => {
+ expect(findRunnerDetails().exists()).toBe(false);
+ });
+
it('error is reported to sentry', () => {
expect(captureException).toHaveBeenCalledWith({
error: new Error('Error!'),
@@ -201,13 +223,6 @@ describe('AdminRunnerShowApp', () => {
const stubs = {
GlTab,
GlTabs,
- RunnerDetails: {
- template: `
- <div>
- <slot name="jobs-tab"></slot>
- </div>
- `,
- },
};
it('without a runner, shows no jobs', () => {
diff --git a/spec/frontend/runner/admin_runners/admin_runners_app_spec.js b/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
index 3d25ad075de..aa1aa723491 100644
--- a/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
+++ b/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
@@ -10,9 +10,11 @@ import {
} from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert } from '~/flash';
+import { s__ } from '~/locale';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { updateHistory } from '~/lib/utils/url_utility';
+import { upgradeStatusTokenConfig } from 'ee_else_ce/runner/components/search_tokens/upgrade_status_token_config';
import { createLocalState } from '~/runner/graphql/list/local_state';
import AdminRunnersApp from '~/runner/admin_runners/admin_runners_app.vue';
import RunnerTypeTabs from '~/runner/components/runner_type_tabs.vue';
@@ -20,6 +22,7 @@ import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_
import RunnerList from '~/runner/components/runner_list.vue';
import RunnerListEmptyState from '~/runner/components/runner_list_empty_state.vue';
import RunnerStats from '~/runner/components/stat/runner_stats.vue';
+import RunnerCount from '~/runner/components/stat/runner_count.vue';
import RunnerActionsCell from '~/runner/components/cells/runner_actions_cell.vue';
import RegistrationDropdown from '~/runner/components/registration/registration_dropdown.vue';
import RunnerPagination from '~/runner/components/runner_pagination.vue';
@@ -30,8 +33,6 @@ import {
CREATED_DESC,
DEFAULT_SORT,
INSTANCE_TYPE,
- GROUP_TYPE,
- PROJECT_TYPE,
PARAM_KEY_PAUSED,
PARAM_KEY_STATUS,
PARAM_KEY_TAG,
@@ -40,15 +41,14 @@ import {
STATUS_STALE,
RUNNER_PAGE_SIZE,
} from '~/runner/constants';
-import adminRunnersQuery from '~/runner/graphql/list/admin_runners.query.graphql';
-import adminRunnersCountQuery from '~/runner/graphql/list/admin_runners_count.query.graphql';
+import allRunnersQuery from 'ee_else_ce/runner/graphql/list/all_runners.query.graphql';
+import allRunnersCountQuery from '~/runner/graphql/list/all_runners_count.query.graphql';
import { captureException } from '~/runner/sentry_utils';
-import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
import {
- runnersData,
+ allRunnersData,
runnersCountData,
- runnersDataPaginated,
+ allRunnersDataPaginated,
onlineContactTimeoutSecs,
staleTimeoutSecs,
emptyStateSvgPath,
@@ -56,9 +56,12 @@ import {
} from '../mock_data';
const mockRegistrationToken = 'MOCK_REGISTRATION_TOKEN';
-const mockRunners = runnersData.data.runners.nodes;
+const mockRunners = allRunnersData.data.runners.nodes;
const mockRunnersCount = runnersCountData.data.runners.count;
+const mockRunnersHandler = jest.fn();
+const mockRunnersCountHandler = jest.fn();
+
jest.mock('~/flash');
jest.mock('~/runner/sentry_utils');
jest.mock('~/lib/utils/url_utility', () => ({
@@ -71,8 +74,6 @@ Vue.use(GlToast);
describe('AdminRunnersApp', () => {
let wrapper;
- let mockRunnersQuery;
- let mockRunnersCountQuery;
let cacheConfig;
let localMutations;
@@ -85,7 +86,6 @@ describe('AdminRunnersApp', () => {
const findRunnerPagination = () => extendedWrapper(wrapper.findComponent(RunnerPagination));
const findRunnerPaginationNext = () => findRunnerPagination().findByLabelText('Go to next page');
const findRunnerFilteredSearchBar = () => wrapper.findComponent(RunnerFilteredSearchBar);
- const findFilteredSearch = () => wrapper.findComponent(FilteredSearch);
const createComponent = ({
props = {},
@@ -96,8 +96,8 @@ describe('AdminRunnersApp', () => {
({ cacheConfig, localMutations } = createLocalState());
const handlers = [
- [adminRunnersQuery, mockRunnersQuery],
- [adminRunnersCountQuery, mockRunnersCountQuery],
+ [allRunnersQuery, mockRunnersHandler],
+ [allRunnersCountQuery, mockRunnersCountHandler],
];
wrapper = mountFn(AdminRunnersApp, {
@@ -116,110 +116,62 @@ describe('AdminRunnersApp', () => {
},
...options,
});
- };
- beforeEach(async () => {
- setWindowLocation('/admin/runners');
+ return waitForPromises();
+ };
- mockRunnersQuery = jest.fn().mockResolvedValue(runnersData);
- mockRunnersCountQuery = jest.fn().mockResolvedValue(runnersCountData);
- createComponent();
- await waitForPromises();
+ beforeEach(() => {
+ mockRunnersHandler.mockResolvedValue(allRunnersData);
+ mockRunnersCountHandler.mockResolvedValue(runnersCountData);
});
afterEach(() => {
- mockRunnersQuery.mockReset();
- mockRunnersCountQuery.mockReset();
+ mockRunnersHandler.mockReset();
+ mockRunnersCountHandler.mockReset();
wrapper.destroy();
});
it('shows the runner tabs with a runner count for each type', async () => {
- mockRunnersCountQuery.mockImplementation(({ type }) => {
- let count;
- switch (type) {
- case INSTANCE_TYPE:
- count = 3;
- break;
- case GROUP_TYPE:
- count = 2;
- break;
- case PROJECT_TYPE:
- count = 1;
- break;
- default:
- count = 6;
- break;
- }
- return Promise.resolve({ data: { runners: { count } } });
- });
-
- createComponent({ mountFn: mountExtended });
- await waitForPromises();
-
- expect(findRunnerTypeTabs().text()).toMatchInterpolatedText(
- `All 6 Instance 3 Group 2 Project 1`,
- );
- });
-
- it('shows the runner tabs with a formatted runner count', async () => {
- mockRunnersCountQuery.mockImplementation(({ type }) => {
- let count;
- switch (type) {
- case INSTANCE_TYPE:
- count = 3000;
- break;
- case GROUP_TYPE:
- count = 2000;
- break;
- case PROJECT_TYPE:
- count = 1000;
- break;
- default:
- count = 6000;
- break;
- }
- return Promise.resolve({ data: { runners: { count } } });
- });
-
- createComponent({ mountFn: mountExtended });
- await waitForPromises();
+ await createComponent({ mountFn: mountExtended });
expect(findRunnerTypeTabs().text()).toMatchInterpolatedText(
- `All 6,000 Instance 3,000 Group 2,000 Project 1,000`,
+ `All ${mockRunnersCount} Instance ${mockRunnersCount} Group ${mockRunnersCount} Project ${mockRunnersCount}`,
);
});
it('shows the runner setup instructions', () => {
+ createComponent();
+
expect(findRegistrationDropdown().props('registrationToken')).toBe(mockRegistrationToken);
expect(findRegistrationDropdown().props('type')).toBe(INSTANCE_TYPE);
});
it('shows total runner counts', async () => {
- expect(mockRunnersCountQuery).toHaveBeenCalledWith({
- status: STATUS_ONLINE,
- });
- expect(mockRunnersCountQuery).toHaveBeenCalledWith({
- status: STATUS_OFFLINE,
- });
- expect(mockRunnersCountQuery).toHaveBeenCalledWith({
- status: STATUS_STALE,
- });
+ await createComponent({ mountFn: mountExtended });
- expect(findRunnerStats().props()).toMatchObject({
- onlineRunnersCount: mockRunnersCount,
- offlineRunnersCount: mockRunnersCount,
- staleRunnersCount: mockRunnersCount,
- });
+ expect(mockRunnersCountHandler).toHaveBeenCalledWith({ status: STATUS_ONLINE });
+ expect(mockRunnersCountHandler).toHaveBeenCalledWith({ status: STATUS_OFFLINE });
+ expect(mockRunnersCountHandler).toHaveBeenCalledWith({ status: STATUS_STALE });
+
+ expect(findRunnerStats().text()).toContain(
+ `${s__('Runners|Online runners')} ${mockRunnersCount}`,
+ );
+ expect(findRunnerStats().text()).toContain(
+ `${s__('Runners|Offline runners')} ${mockRunnersCount}`,
+ );
+ expect(findRunnerStats().text()).toContain(
+ `${s__('Runners|Stale runners')} ${mockRunnersCount}`,
+ );
});
- it('shows the runners list', () => {
+ it('shows the runners list', async () => {
+ await createComponent();
+
expect(findRunnerList().props('runners')).toEqual(mockRunners);
});
it('runner item links to the runner admin page', async () => {
- createComponent({ mountFn: mountExtended });
-
- await waitForPromises();
+ await createComponent({ mountFn: mountExtended });
const { id, shortSha } = mockRunners[0];
const numericId = getIdFromGraphQLId(id);
@@ -231,12 +183,9 @@ describe('AdminRunnersApp', () => {
});
it('renders runner actions for each runner', async () => {
- createComponent({ mountFn: mountExtended });
-
- await waitForPromises();
+ await createComponent({ mountFn: mountExtended });
const runnerActions = wrapper.find('tr [data-testid="td-actions"]').find(RunnerActionsCell);
-
const runner = mockRunners[0];
expect(runnerActions.props()).toEqual({
@@ -245,8 +194,10 @@ describe('AdminRunnersApp', () => {
});
});
- it('requests the runners with no filters', () => {
- expect(mockRunnersQuery).toHaveBeenLastCalledWith({
+ it('requests the runners with no filters', async () => {
+ await createComponent();
+
+ expect(mockRunnersHandler).toHaveBeenLastCalledWith({
status: undefined,
type: undefined,
sort: DEFAULT_SORT,
@@ -255,9 +206,9 @@ describe('AdminRunnersApp', () => {
});
it('sets tokens in the filtered search', () => {
- createComponent({ mountFn: mountExtended });
+ createComponent();
- expect(findFilteredSearch().props('tokens')).toEqual([
+ expect(findRunnerFilteredSearchBar().props('tokens')).toEqual([
expect.objectContaining({
type: PARAM_KEY_PAUSED,
options: expect.any(Array),
@@ -270,6 +221,7 @@ describe('AdminRunnersApp', () => {
type: PARAM_KEY_TAG,
recentSuggestionsStorageKey: `${ADMIN_FILTERED_SEARCH_NAMESPACE}-recent-tags`,
}),
+ upgradeStatusTokenConfig,
]);
});
@@ -282,12 +234,10 @@ describe('AdminRunnersApp', () => {
const FILTERED_COUNT_QUERIES = 4; // Smart queries that display a count of runners in tabs
beforeEach(async () => {
- mockRunnersCountQuery.mockClear();
+ mockRunnersCountHandler.mockClear();
- createComponent({ mountFn: mountExtended });
+ await createComponent({ mountFn: mountExtended });
showToast = jest.spyOn(wrapper.vm.$root.$toast, 'show');
-
- await waitForPromises();
});
it('Links to the runner page', async () => {
@@ -298,12 +248,11 @@ describe('AdminRunnersApp', () => {
});
it('When runner is paused or unpaused, some data is refetched', async () => {
- expect(mockRunnersCountQuery).toHaveBeenCalledTimes(COUNT_QUERIES);
+ expect(mockRunnersCountHandler).toHaveBeenCalledTimes(COUNT_QUERIES);
findRunnerActionsCell().vm.$emit('toggledPaused');
- expect(mockRunnersCountQuery).toHaveBeenCalledTimes(COUNT_QUERIES + FILTERED_COUNT_QUERIES);
-
+ expect(mockRunnersCountHandler).toHaveBeenCalledTimes(COUNT_QUERIES + FILTERED_COUNT_QUERIES);
expect(showToast).toHaveBeenCalledTimes(0);
});
@@ -319,8 +268,12 @@ describe('AdminRunnersApp', () => {
beforeEach(async () => {
setWindowLocation(`?status[]=${STATUS_ONLINE}&runner_type[]=${INSTANCE_TYPE}&tag[]=tag1`);
- createComponent();
- await waitForPromises();
+ await createComponent({
+ stubs: {
+ RunnerStats,
+ RunnerCount,
+ },
+ });
});
it('sets the filters in the search bar', () => {
@@ -336,7 +289,7 @@ describe('AdminRunnersApp', () => {
});
it('requests the runners with filter parameters', () => {
- expect(mockRunnersQuery).toHaveBeenLastCalledWith({
+ expect(mockRunnersHandler).toHaveBeenLastCalledWith({
status: STATUS_ONLINE,
type: INSTANCE_TYPE,
tagList: ['tag1'],
@@ -346,21 +299,22 @@ describe('AdminRunnersApp', () => {
});
it('fetches count results for requested status', () => {
- expect(mockRunnersCountQuery).toHaveBeenCalledWith({
+ expect(mockRunnersCountHandler).toHaveBeenCalledWith({
type: INSTANCE_TYPE,
status: STATUS_ONLINE,
tagList: ['tag1'],
});
-
- expect(findRunnerStats().props()).toMatchObject({
- onlineRunnersCount: mockRunnersCount,
- });
});
});
describe('when a filter is selected by the user', () => {
beforeEach(() => {
- mockRunnersCountQuery.mockClear();
+ createComponent({
+ stubs: {
+ RunnerStats,
+ RunnerCount,
+ },
+ });
findRunnerFilteredSearchBar().vm.$emit('input', {
runnerType: null,
@@ -375,12 +329,12 @@ describe('AdminRunnersApp', () => {
it('updates the browser url', () => {
expect(updateHistory).toHaveBeenLastCalledWith({
title: expect.any(String),
- url: 'http://test.host/admin/runners?status[]=ONLINE&tag[]=tag1&sort=CREATED_ASC',
+ url: expect.stringContaining('?status[]=ONLINE&tag[]=tag1&sort=CREATED_ASC'),
});
});
it('requests the runners with filters', () => {
- expect(mockRunnersQuery).toHaveBeenLastCalledWith({
+ expect(mockRunnersHandler).toHaveBeenLastCalledWith({
status: STATUS_ONLINE,
tagList: ['tag1'],
sort: CREATED_ASC,
@@ -389,30 +343,10 @@ describe('AdminRunnersApp', () => {
});
it('fetches count results for requested status', () => {
- expect(mockRunnersCountQuery).toHaveBeenCalledWith({
+ expect(mockRunnersCountHandler).toHaveBeenCalledWith({
tagList: ['tag1'],
status: STATUS_ONLINE,
});
-
- expect(findRunnerStats().props()).toMatchObject({
- onlineRunnersCount: mockRunnersCount,
- });
- });
-
- it('skips fetching count results for status that were not in filter', () => {
- expect(mockRunnersCountQuery).not.toHaveBeenCalledWith({
- tagList: ['tag1'],
- status: STATUS_OFFLINE,
- });
- expect(mockRunnersCountQuery).not.toHaveBeenCalledWith({
- tagList: ['tag1'],
- status: STATUS_STALE,
- });
-
- expect(findRunnerStats().props()).toMatchObject({
- offlineRunnersCount: null,
- staleRunnersCount: null,
- });
});
});
@@ -458,14 +392,13 @@ describe('AdminRunnersApp', () => {
describe('when no runners are found', () => {
beforeEach(async () => {
- mockRunnersQuery = jest.fn().mockResolvedValue({
+ mockRunnersHandler.mockResolvedValue({
data: {
runners: { nodes: [] },
},
});
- createComponent();
- await waitForPromises();
+ await createComponent();
});
it('shows an empty state', () => {
@@ -490,9 +423,8 @@ describe('AdminRunnersApp', () => {
describe('when runners query fails', () => {
beforeEach(async () => {
- mockRunnersQuery = jest.fn().mockRejectedValue(new Error('Error!'));
- createComponent();
- await waitForPromises();
+ mockRunnersHandler.mockRejectedValue(new Error('Error!'));
+ await createComponent();
});
it('error is shown to the user', async () => {
@@ -509,19 +441,18 @@ describe('AdminRunnersApp', () => {
describe('Pagination', () => {
beforeEach(async () => {
- mockRunnersQuery = jest.fn().mockResolvedValue(runnersDataPaginated);
+ mockRunnersHandler.mockResolvedValue(allRunnersDataPaginated);
- createComponent({ mountFn: mountExtended });
- await waitForPromises();
+ await createComponent({ mountFn: mountExtended });
});
it('navigates to the next page', async () => {
await findRunnerPaginationNext().trigger('click');
- expect(mockRunnersQuery).toHaveBeenLastCalledWith({
+ expect(mockRunnersHandler).toHaveBeenLastCalledWith({
sort: CREATED_DESC,
first: RUNNER_PAGE_SIZE,
- after: runnersDataPaginated.data.runners.pageInfo.endCursor,
+ after: allRunnersDataPaginated.data.runners.pageInfo.endCursor,
});
});
});
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 7a949cb6505..ffd6f126627 100644
--- a/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
+++ b/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
@@ -4,9 +4,9 @@ import RunnerActionsCell from '~/runner/components/cells/runner_actions_cell.vue
import RunnerPauseButton from '~/runner/components/runner_pause_button.vue';
import RunnerEditButton from '~/runner/components/runner_edit_button.vue';
import RunnerDeleteButton from '~/runner/components/runner_delete_button.vue';
-import { runnersData } from '../../mock_data';
+import { allRunnersData } from '../../mock_data';
-const mockRunner = runnersData.data.runners.nodes[0];
+const mockRunner = allRunnersData.data.runners.nodes[0];
describe('RunnerActionsCell', () => {
let wrapper;
diff --git a/spec/frontend/runner/components/runner_delete_button_spec.js b/spec/frontend/runner/components/runner_delete_button_spec.js
index b11c749d0a7..52fe803c536 100644
--- a/spec/frontend/runner/components/runner_delete_button_spec.js
+++ b/spec/frontend/runner/components/runner_delete_button_spec.js
@@ -17,9 +17,9 @@ import {
import RunnerDeleteButton from '~/runner/components/runner_delete_button.vue';
import RunnerDeleteModal from '~/runner/components/runner_delete_modal.vue';
-import { runnersData } from '../mock_data';
+import { allRunnersData } from '../mock_data';
-const mockRunner = runnersData.data.runners.nodes[0];
+const mockRunner = allRunnersData.data.runners.nodes[0];
const mockRunnerId = getIdFromGraphQLId(mockRunner.id);
Vue.use(VueApollo);
diff --git a/spec/frontend/runner/components/runner_details_spec.js b/spec/frontend/runner/components/runner_details_spec.js
index 9e0f7014750..552ee29b6f9 100644
--- a/spec/frontend/runner/components/runner_details_spec.js
+++ b/spec/frontend/runner/components/runner_details_spec.js
@@ -25,12 +25,7 @@ describe('RunnerDetails', () => {
const findDetailGroups = () => wrapper.findComponent(RunnerGroups);
- const createComponent = ({
- props = {},
- stubs,
- mountFn = shallowMountExtended,
- ...options
- } = {}) => {
+ const createComponent = ({ props = {}, stubs, mountFn = shallowMountExtended } = {}) => {
wrapper = mountFn(RunnerDetails, {
propsData: {
...props,
@@ -39,7 +34,6 @@ describe('RunnerDetails', () => {
RunnerDetail,
...stubs,
},
- ...options,
});
};
@@ -47,16 +41,6 @@ describe('RunnerDetails', () => {
wrapper.destroy();
});
- it('when no runner is present, no contents are shown', () => {
- createComponent({
- props: {
- runner: null,
- },
- });
-
- expect(wrapper.text()).toBe('');
- });
-
describe('Details tab', () => {
describe.each`
field | runner | expectedValue
@@ -141,18 +125,4 @@ describe('RunnerDetails', () => {
});
});
});
-
- describe('Jobs tab slot', () => {
- it('shows job tab slot', () => {
- const JOBS_TAB = '<div>Jobs Tab</div>';
-
- createComponent({
- slots: {
- 'jobs-tab': JOBS_TAB,
- },
- });
-
- expect(wrapper.html()).toContain(JOBS_TAB);
- });
- });
});
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 b1b436e5443..83fb1764c6d 100644
--- a/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
+++ b/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
@@ -89,6 +89,16 @@ describe('RunnerList', () => {
]);
});
+ it('can be configured with null or undefined tokens, which are ignored', () => {
+ createComponent({
+ props: {
+ tokens: [statusTokenConfig, null, undefined],
+ },
+ });
+
+ expect(findFilteredSearch().props('tokens')).toEqual([statusTokenConfig]);
+ });
+
it('fails validation for v-model with the wrong shape', () => {
expect(() => {
createComponent({ props: { value: { filters: 'wrong_filters', sort: 'sort' } } });
diff --git a/spec/frontend/runner/components/runner_list_spec.js b/spec/frontend/runner/components/runner_list_spec.js
index 872394430ae..eca4bbc3490 100644
--- a/spec/frontend/runner/components/runner_list_spec.js
+++ b/spec/frontend/runner/components/runner_list_spec.js
@@ -7,9 +7,9 @@ import {
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerList from '~/runner/components/runner_list.vue';
import RunnerStatusPopover from '~/runner/components/runner_status_popover.vue';
-import { runnersData, onlineContactTimeoutSecs, staleTimeoutSecs } from '../mock_data';
+import { allRunnersData, onlineContactTimeoutSecs, staleTimeoutSecs } from '../mock_data';
-const mockRunners = runnersData.data.runners.nodes;
+const mockRunners = allRunnersData.data.runners.nodes;
const mockActiveRunnersCount = mockRunners.length;
describe('RunnerList', () => {
diff --git a/spec/frontend/runner/components/runner_pause_button_spec.js b/spec/frontend/runner/components/runner_pause_button_spec.js
index 9ebb30b6ed7..61476007571 100644
--- a/spec/frontend/runner/components/runner_pause_button_spec.js
+++ b/spec/frontend/runner/components/runner_pause_button_spec.js
@@ -1,4 +1,4 @@
-import Vue from 'vue';
+import Vue, { nextTick } from 'vue';
import { GlButton } from '@gitlab/ui';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -16,9 +16,9 @@ import {
} from '~/runner/constants';
import RunnerPauseButton from '~/runner/components/runner_pause_button.vue';
-import { runnersData } from '../mock_data';
+import { allRunnersData } from '../mock_data';
-const mockRunner = runnersData.data.runners.nodes[0];
+const mockRunner = allRunnersData.data.runners.nodes[0];
Vue.use(VueApollo);
@@ -115,15 +115,20 @@ describe('RunnerPauseButton', () => {
});
describe(`Immediately after the ${icon} button is clicked`, () => {
- beforeEach(async () => {
+ const setup = async () => {
findBtn().vm.$emit('click');
- });
+ await nextTick();
+ };
it('The button has a loading state', async () => {
+ await setup();
+
expect(findBtn().props('loading')).toBe(true);
});
it('The stale tooltip is removed', async () => {
+ await setup();
+
expect(getTooltip()).toBe('');
});
});
@@ -237,15 +242,20 @@ describe('RunnerPauseButton', () => {
});
describe('Immediately after the button is clicked', () => {
- beforeEach(async () => {
+ const setup = async () => {
findBtn().vm.$emit('click');
- });
+ await nextTick();
+ };
it('The button has a loading state', async () => {
+ await setup();
+
expect(findBtn().props('loading')).toBe(true);
});
it('The stale tooltip is removed', async () => {
+ await setup();
+
expect(getTooltip()).toBe('');
});
});
diff --git a/spec/frontend/runner/components/runner_type_tabs_spec.js b/spec/frontend/runner/components/runner_type_tabs_spec.js
index 9da5d842d8f..22d2a9e60f7 100644
--- a/spec/frontend/runner/components/runner_type_tabs_spec.js
+++ b/spec/frontend/runner/components/runner_type_tabs_spec.js
@@ -1,10 +1,30 @@
import { GlTab } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import RunnerTypeTabs from '~/runner/components/runner_type_tabs.vue';
+import RunnerCount from '~/runner/components/stat/runner_count.vue';
import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '~/runner/constants';
const mockSearch = { runnerType: null, filters: [], pagination: { page: 1 }, sort: 'CREATED_DESC' };
+const mockCount = (type, multiplier = 1) => {
+ let count;
+ switch (type) {
+ case INSTANCE_TYPE:
+ count = 3;
+ break;
+ case GROUP_TYPE:
+ count = 2;
+ break;
+ case PROJECT_TYPE:
+ count = 1;
+ break;
+ default:
+ count = 6;
+ break;
+ }
+ return count * multiplier;
+};
+
describe('RunnerTypeTabs', () => {
let wrapper;
@@ -13,33 +33,94 @@ describe('RunnerTypeTabs', () => {
findTabs()
.filter((tab) => tab.attributes('active') === 'true')
.at(0);
- const getTabsTitles = () => findTabs().wrappers.map((tab) => tab.text());
+ const getTabsTitles = () => findTabs().wrappers.map((tab) => tab.text().replace(/\s+/g, ' '));
- const createComponent = ({ props, ...options } = {}) => {
+ const createComponent = ({ props, stubs, ...options } = {}) => {
wrapper = shallowMount(RunnerTypeTabs, {
propsData: {
value: mockSearch,
+ countScope: INSTANCE_TYPE,
+ countVariables: {},
...props,
},
stubs: {
GlTab,
+ ...stubs,
},
...options,
});
};
- beforeEach(() => {
- createComponent();
- });
-
afterEach(() => {
wrapper.destroy();
});
it('Renders all options to filter runners by default', () => {
+ createComponent();
+
expect(getTabsTitles()).toEqual(['All', 'Instance', 'Group', 'Project']);
});
+ it('Shows count when receiving a number', () => {
+ createComponent({
+ stubs: {
+ RunnerCount: {
+ props: ['variables'],
+ render() {
+ return this.$scopedSlots.default({
+ count: mockCount(this.variables.type),
+ });
+ },
+ },
+ },
+ });
+
+ expect(getTabsTitles()).toEqual([`All 6`, `Instance 3`, `Group 2`, `Project 1`]);
+ });
+
+ it('Shows formatted count when receiving a large number', () => {
+ createComponent({
+ stubs: {
+ RunnerCount: {
+ props: ['variables'],
+ render() {
+ return this.$scopedSlots.default({
+ count: mockCount(this.variables.type, 1000),
+ });
+ },
+ },
+ },
+ });
+
+ expect(getTabsTitles()).toEqual([
+ `All 6,000`,
+ `Instance 3,000`,
+ `Group 2,000`,
+ `Project 1,000`,
+ ]);
+ });
+
+ it('Renders a count next to each tab', () => {
+ const mockVariables = {
+ paused: true,
+ status: 'ONLINE',
+ };
+
+ createComponent({
+ props: {
+ countVariables: mockVariables,
+ },
+ });
+
+ findTabs().wrappers.forEach((tab) => {
+ expect(tab.find(RunnerCount).props()).toEqual({
+ scope: INSTANCE_TYPE,
+ skip: false,
+ variables: expect.objectContaining(mockVariables),
+ });
+ });
+ });
+
it('Renders fewer options to filter runners', () => {
createComponent({
props: {
@@ -51,6 +132,8 @@ describe('RunnerTypeTabs', () => {
});
it('"All" is selected by default', () => {
+ createComponent();
+
expect(findActiveTab().text()).toBe('All');
});
@@ -71,6 +154,7 @@ describe('RunnerTypeTabs', () => {
const emittedValue = () => wrapper.emitted('input')[0][0];
beforeEach(() => {
+ createComponent();
findTabs().at(2).vm.$emit('click');
});
@@ -89,27 +173,30 @@ describe('RunnerTypeTabs', () => {
});
});
- describe('When using a custom slot', () => {
- const mockContent = 'content';
-
- beforeEach(() => {
- createComponent({
- scopedSlots: {
- title: `
- <span>
- {{props.tab.title}} ${mockContent}
- </span>`,
- },
+ describe('Component API', () => {
+ describe('When .refetch() is called', () => {
+ let mockRefetch;
+
+ beforeEach(() => {
+ mockRefetch = jest.fn();
+
+ createComponent({
+ stubs: {
+ RunnerCount: {
+ methods: {
+ refetch: mockRefetch,
+ },
+ render() {},
+ },
+ },
+ });
+
+ wrapper.vm.refetch();
});
- });
- it('Renders tabs with additional information', () => {
- expect(findTabs().wrappers.map((tab) => tab.text())).toEqual([
- `All ${mockContent}`,
- `Instance ${mockContent}`,
- `Group ${mockContent}`,
- `Project ${mockContent}`,
- ]);
+ it('refetch is called for each count', () => {
+ expect(mockRefetch).toHaveBeenCalledTimes(4);
+ });
});
});
});
diff --git a/spec/frontend/runner/components/search_tokens/tag_token_spec.js b/spec/frontend/runner/components/search_tokens/tag_token_spec.js
index 52557ff716d..22f0561ca5f 100644
--- a/spec/frontend/runner/components/search_tokens/tag_token_spec.js
+++ b/spec/frontend/runner/components/search_tokens/tag_token_spec.js
@@ -134,8 +134,6 @@ describe('TagToken', () => {
describe('when the users filters suggestions', () => {
beforeEach(async () => {
findGlFilteredSearchToken().vm.$emit('input', { data: mockSearchTerm });
-
- jest.runAllTimers();
});
it('requests filtered tags suggestions', async () => {
@@ -145,6 +143,7 @@ describe('TagToken', () => {
});
it('shows the loading icon', async () => {
+ findGlFilteredSearchToken().vm.$emit('input', { data: mockSearchTerm });
await nextTick();
expect(findGlLoadingIcon().exists()).toBe(true);
diff --git a/spec/frontend/runner/components/stat/runner_count_spec.js b/spec/frontend/runner/components/stat/runner_count_spec.js
new file mode 100644
index 00000000000..89b51b1b4a7
--- /dev/null
+++ b/spec/frontend/runner/components/stat/runner_count_spec.js
@@ -0,0 +1,148 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import { shallowMount } from '@vue/test-utils';
+import RunnerCount from '~/runner/components/stat/runner_count.vue';
+import { INSTANCE_TYPE, GROUP_TYPE } from '~/runner/constants';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { captureException } from '~/runner/sentry_utils';
+
+import allRunnersCountQuery from '~/runner/graphql/list/all_runners_count.query.graphql';
+import groupRunnersCountQuery from '~/runner/graphql/list/group_runners_count.query.graphql';
+
+import { runnersCountData, groupRunnersCountData } from '../../mock_data';
+
+jest.mock('~/runner/sentry_utils');
+
+Vue.use(VueApollo);
+
+describe('RunnerCount', () => {
+ let wrapper;
+ let mockRunnersCountHandler;
+ let mockGroupRunnersCountHandler;
+
+ const createComponent = ({ props = {}, ...options } = {}) => {
+ const handlers = [
+ [allRunnersCountQuery, mockRunnersCountHandler],
+ [groupRunnersCountQuery, mockGroupRunnersCountHandler],
+ ];
+
+ wrapper = shallowMount(RunnerCount, {
+ apolloProvider: createMockApollo(handlers),
+ propsData: {
+ ...props,
+ },
+ scopedSlots: {
+ default: '<strong>{{props.count}}</strong>',
+ },
+ ...options,
+ });
+
+ return waitForPromises();
+ };
+
+ beforeEach(() => {
+ mockRunnersCountHandler = jest.fn().mockResolvedValue(runnersCountData);
+ mockGroupRunnersCountHandler = jest.fn().mockResolvedValue(groupRunnersCountData);
+ });
+
+ describe('in admin scope', () => {
+ const mockVariables = { status: 'ONLINE' };
+
+ beforeEach(async () => {
+ await createComponent({ props: { scope: INSTANCE_TYPE } });
+ });
+
+ it('fetches data from admin query', () => {
+ expect(mockRunnersCountHandler).toHaveBeenCalledTimes(1);
+ expect(mockRunnersCountHandler).toHaveBeenCalledWith({});
+ });
+
+ it('fetches data with filters', async () => {
+ await createComponent({ props: { scope: INSTANCE_TYPE, variables: mockVariables } });
+
+ expect(mockRunnersCountHandler).toHaveBeenCalledTimes(2);
+ expect(mockRunnersCountHandler).toHaveBeenCalledWith(mockVariables);
+
+ expect(wrapper.html()).toBe(`<strong>${runnersCountData.data.runners.count}</strong>`);
+ });
+
+ it('does not fetch from the group query', async () => {
+ expect(mockGroupRunnersCountHandler).not.toHaveBeenCalled();
+ });
+
+ describe('when this query is skipped after data was loaded', () => {
+ beforeEach(async () => {
+ wrapper.setProps({ skip: true });
+
+ await nextTick();
+ });
+
+ it('clears current data', () => {
+ expect(wrapper.html()).toBe('<strong></strong>');
+ });
+ });
+ });
+
+ describe('when skipping query', () => {
+ beforeEach(async () => {
+ await createComponent({ props: { scope: INSTANCE_TYPE, skip: true } });
+ });
+
+ it('does not fetch data', async () => {
+ expect(mockRunnersCountHandler).not.toHaveBeenCalled();
+ expect(mockGroupRunnersCountHandler).not.toHaveBeenCalled();
+
+ expect(wrapper.html()).toBe('<strong></strong>');
+ });
+ });
+
+ describe('when runners query fails', () => {
+ const mockError = new Error('error!');
+
+ beforeEach(async () => {
+ mockRunnersCountHandler.mockRejectedValue(mockError);
+
+ await createComponent({ props: { scope: INSTANCE_TYPE } });
+ });
+
+ it('data is not shown and error is reported', async () => {
+ expect(wrapper.html()).toBe('<strong></strong>');
+
+ expect(captureException).toHaveBeenCalledWith({
+ component: 'RunnerCount',
+ error: mockError,
+ });
+ });
+ });
+
+ describe('in group scope', () => {
+ beforeEach(async () => {
+ await createComponent({ props: { scope: GROUP_TYPE } });
+ });
+
+ it('fetches data from the group query', async () => {
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledTimes(1);
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledWith({});
+
+ expect(wrapper.html()).toBe(
+ `<strong>${groupRunnersCountData.data.group.runners.count}</strong>`,
+ );
+ });
+
+ it('does not fetch from the group query', () => {
+ expect(mockRunnersCountHandler).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('when .refetch() is called', () => {
+ beforeEach(async () => {
+ await createComponent({ props: { scope: INSTANCE_TYPE } });
+ wrapper.vm.refetch();
+ });
+
+ it('data is not shown and error is reported', async () => {
+ expect(mockRunnersCountHandler).toHaveBeenCalledTimes(2);
+ });
+ });
+});
diff --git a/spec/frontend/runner/components/stat/runner_stats_spec.js b/spec/frontend/runner/components/stat/runner_stats_spec.js
index 68db8621ef0..f1ba6403dfb 100644
--- a/spec/frontend/runner/components/stat/runner_stats_spec.js
+++ b/spec/frontend/runner/components/stat/runner_stats_spec.js
@@ -1,21 +1,24 @@
import { shallowMount, mount } from '@vue/test-utils';
+import { s__ } from '~/locale';
import RunnerStats from '~/runner/components/stat/runner_stats.vue';
+import RunnerCount from '~/runner/components/stat/runner_count.vue';
import RunnerStatusStat from '~/runner/components/stat/runner_status_stat.vue';
-import { STATUS_ONLINE, STATUS_OFFLINE, STATUS_STALE } from '~/runner/constants';
+import { INSTANCE_TYPE, STATUS_ONLINE, STATUS_OFFLINE, STATUS_STALE } from '~/runner/constants';
describe('RunnerStats', () => {
let wrapper;
+ const findRunnerCountAt = (i) => wrapper.findAllComponents(RunnerCount).at(i);
const findRunnerStatusStatAt = (i) => wrapper.findAllComponents(RunnerStatusStat).at(i);
- const createComponent = ({ props = {}, mountFn = shallowMount } = {}) => {
+ const createComponent = ({ props = {}, mountFn = shallowMount, ...options } = {}) => {
wrapper = mountFn(RunnerStats, {
propsData: {
- onlineRunnersCount: 3,
- offlineRunnersCount: 2,
- staleRunnersCount: 1,
+ scope: INSTANCE_TYPE,
+ variables: {},
...props,
},
+ ...options,
});
};
@@ -24,13 +27,46 @@ describe('RunnerStats', () => {
});
it('Displays all the stats', () => {
- createComponent({ mountFn: mount });
+ const mockCounts = {
+ [STATUS_ONLINE]: 3,
+ [STATUS_OFFLINE]: 2,
+ [STATUS_STALE]: 1,
+ };
+
+ createComponent({
+ mountFn: mount,
+ stubs: {
+ RunnerCount: {
+ props: ['variables'],
+ render() {
+ return this.$scopedSlots.default({
+ count: mockCounts[this.variables.status],
+ });
+ },
+ },
+ },
+ });
+
+ const text = wrapper.text();
+ expect(text).toMatch(`${s__('Runners|Online runners')} 3`);
+ expect(text).toMatch(`${s__('Runners|Offline runners')} 2`);
+ expect(text).toMatch(`${s__('Runners|Stale runners')} 1`);
+ });
- const stats = wrapper.text();
+ it('Displays counts for filtered searches', () => {
+ createComponent({ props: { variables: { paused: true } } });
- expect(stats).toMatch('Online runners 3');
- expect(stats).toMatch('Offline runners 2');
- expect(stats).toMatch('Stale runners 1');
+ expect(findRunnerCountAt(0).props('variables').paused).toBe(true);
+ expect(findRunnerCountAt(1).props('variables').paused).toBe(true);
+ expect(findRunnerCountAt(2).props('variables').paused).toBe(true);
+ });
+
+ it('Skips overlapping statuses', () => {
+ createComponent({ props: { variables: { status: STATUS_ONLINE } } });
+
+ expect(findRunnerCountAt(0).props('skip')).toBe(false);
+ expect(findRunnerCountAt(1).props('skip')).toBe(true);
+ expect(findRunnerCountAt(2).props('skip')).toBe(true);
});
it.each`
@@ -38,9 +74,10 @@ describe('RunnerStats', () => {
${0} | ${STATUS_ONLINE}
${1} | ${STATUS_OFFLINE}
${2} | ${STATUS_STALE}
- `('Displays status types at index $i', ({ i, status }) => {
- createComponent();
+ `('Displays status $status at index $i', ({ i, status }) => {
+ createComponent({ mountFn: mount });
+ expect(findRunnerCountAt(i).props('variables').status).toBe(status);
expect(findRunnerStatusStatAt(i).props('status')).toBe(status);
});
});
diff --git a/spec/frontend/runner/group_runner_show/group_runner_show_app_spec.js b/spec/frontend/runner/group_runner_show/group_runner_show_app_spec.js
new file mode 100644
index 00000000000..2065874c288
--- /dev/null
+++ b/spec/frontend/runner/group_runner_show/group_runner_show_app_spec.js
@@ -0,0 +1,213 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { createAlert, VARIANT_SUCCESS } from '~/flash';
+import { redirectTo } from '~/lib/utils/url_utility';
+
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import RunnerHeader from '~/runner/components/runner_header.vue';
+import RunnerDetails from '~/runner/components/runner_details.vue';
+import RunnerPauseButton from '~/runner/components/runner_pause_button.vue';
+import RunnerDeleteButton from '~/runner/components/runner_delete_button.vue';
+import RunnerEditButton from '~/runner/components/runner_edit_button.vue';
+import runnerQuery from '~/runner/graphql/show/runner.query.graphql';
+import GroupRunnerShowApp from '~/runner/group_runner_show/group_runner_show_app.vue';
+import { captureException } from '~/runner/sentry_utils';
+import { saveAlertToLocalStorage } from '~/runner/local_storage_alert/save_alert_to_local_storage';
+
+import { runnerData } from '../mock_data';
+
+jest.mock('~/runner/local_storage_alert/save_alert_to_local_storage');
+jest.mock('~/flash');
+jest.mock('~/runner/sentry_utils');
+jest.mock('~/lib/utils/url_utility');
+
+const mockRunner = runnerData.data.runner;
+const mockRunnerGraphqlId = mockRunner.id;
+const mockRunnerId = `${getIdFromGraphQLId(mockRunnerGraphqlId)}`;
+const mockRunnersPath = '/groups/group1/-/runners';
+const mockEditGroupRunnerPath = `/groups/group1/-/runners/${mockRunnerId}/edit`;
+
+Vue.use(VueApollo);
+
+describe('GroupRunnerShowApp', () => {
+ let wrapper;
+ let mockRunnerQuery;
+
+ const findRunnerHeader = () => wrapper.findComponent(RunnerHeader);
+ const findRunnerDetails = () => wrapper.findComponent(RunnerDetails);
+ const findRunnerDeleteButton = () => wrapper.findComponent(RunnerDeleteButton);
+ const findRunnerEditButton = () => wrapper.findComponent(RunnerEditButton);
+ const findRunnerPauseButton = () => wrapper.findComponent(RunnerPauseButton);
+
+ const mockRunnerQueryResult = (runner = {}) => {
+ mockRunnerQuery = jest.fn().mockResolvedValue({
+ data: {
+ runner: { ...mockRunner, ...runner },
+ },
+ });
+ };
+
+ const createComponent = ({ props = {}, mountFn = shallowMountExtended, ...options } = {}) => {
+ wrapper = mountFn(GroupRunnerShowApp, {
+ apolloProvider: createMockApollo([[runnerQuery, mockRunnerQuery]]),
+ propsData: {
+ runnerId: mockRunnerId,
+ runnersPath: mockRunnersPath,
+ editGroupRunnerPath: mockEditGroupRunnerPath,
+ ...props,
+ },
+ ...options,
+ });
+
+ return waitForPromises();
+ };
+
+ afterEach(() => {
+ mockRunnerQuery.mockReset();
+ wrapper.destroy();
+ });
+
+ describe('When showing runner details', () => {
+ beforeEach(async () => {
+ mockRunnerQueryResult();
+
+ await createComponent({ mountFn: mountExtended });
+ });
+
+ it('expect GraphQL ID to be requested', async () => {
+ expect(mockRunnerQuery).toHaveBeenCalledWith({ id: mockRunnerGraphqlId });
+ });
+
+ it('displays the header', async () => {
+ expect(findRunnerHeader().text()).toContain(`Runner #${mockRunnerId}`);
+ });
+
+ it('displays edit, pause, delete buttons', async () => {
+ expect(findRunnerEditButton().exists()).toBe(true);
+ expect(findRunnerPauseButton().exists()).toBe(true);
+ expect(findRunnerDeleteButton().exists()).toBe(true);
+ });
+
+ it('shows basic runner details', () => {
+ const expected = `Description Instance runner
+ Last contact Never contacted
+ Version 1.0.0
+ IP Address 127.0.0.1
+ Executor None
+ Architecture None
+ Platform darwin
+ Configuration Runs untagged jobs
+ Maximum job timeout None
+ Tags None`.replace(/\s+/g, ' ');
+
+ expect(wrapper.text().replace(/\s+/g, ' ')).toContain(expected);
+ });
+
+ it('renders runner details component', () => {
+ expect(findRunnerDetails().props('runner')).toEqual(mockRunner);
+ });
+
+ describe('when runner cannot be updated', () => {
+ beforeEach(async () => {
+ mockRunnerQueryResult({
+ userPermissions: {
+ ...mockRunner.userPermissions,
+ updateRunner: false,
+ },
+ });
+
+ await createComponent({
+ mountFn: mountExtended,
+ });
+ });
+
+ it('does not display edit and pause buttons', () => {
+ expect(findRunnerEditButton().exists()).toBe(false);
+ expect(findRunnerPauseButton().exists()).toBe(false);
+ });
+
+ it('displays delete button', () => {
+ expect(findRunnerDeleteButton().exists()).toBe(true);
+ });
+ });
+
+ describe('when runner cannot be deleted', () => {
+ beforeEach(async () => {
+ mockRunnerQueryResult({
+ userPermissions: {
+ ...mockRunner.userPermissions,
+ deleteRunner: false,
+ },
+ });
+
+ await createComponent({
+ mountFn: mountExtended,
+ });
+ });
+
+ it('does not display delete button', () => {
+ expect(findRunnerDeleteButton().exists()).toBe(false);
+ });
+
+ it('displays edit and pause buttons', () => {
+ expect(findRunnerEditButton().exists()).toBe(true);
+ expect(findRunnerPauseButton().exists()).toBe(true);
+ });
+ });
+
+ describe('when runner is deleted', () => {
+ beforeEach(async () => {
+ await createComponent({
+ mountFn: mountExtended,
+ });
+ });
+
+ it('redirects to the runner list page', () => {
+ findRunnerDeleteButton().vm.$emit('deleted', { message: 'Runner deleted' });
+
+ expect(saveAlertToLocalStorage).toHaveBeenCalledWith({
+ message: 'Runner deleted',
+ variant: VARIANT_SUCCESS,
+ });
+ expect(redirectTo).toHaveBeenCalledWith(mockRunnersPath);
+ });
+ });
+ });
+
+ describe('When loading', () => {
+ beforeEach(() => {
+ mockRunnerQueryResult();
+
+ createComponent();
+ });
+
+ it('does not show runner details', () => {
+ expect(findRunnerDetails().exists()).toBe(false);
+ });
+ });
+
+ describe('When there is an error', () => {
+ beforeEach(async () => {
+ mockRunnerQuery = jest.fn().mockRejectedValueOnce(new Error('Error!'));
+ await createComponent();
+ });
+
+ it('does not show runner details', () => {
+ expect(findRunnerDetails().exists()).toBe(false);
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error('Error!'),
+ component: 'GroupRunnerShowApp',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createAlert).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/runner/group_runners/group_runners_app_spec.js b/spec/frontend/runner/group_runners/group_runners_app_spec.js
index eb9f85a7d0f..9c42b0d6865 100644
--- a/spec/frontend/runner/group_runners/group_runners_app_spec.js
+++ b/spec/frontend/runner/group_runners/group_runners_app_spec.js
@@ -10,6 +10,7 @@ import {
} from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert } from '~/flash';
+import { s__ } from '~/locale';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { updateHistory } from '~/lib/utils/url_utility';
@@ -18,6 +19,7 @@ import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_
import RunnerList from '~/runner/components/runner_list.vue';
import RunnerListEmptyState from '~/runner/components/runner_list_empty_state.vue';
import RunnerStats from '~/runner/components/stat/runner_stats.vue';
+import RunnerCount from '~/runner/components/stat/runner_count.vue';
import RunnerActionsCell from '~/runner/components/cells/runner_actions_cell.vue';
import RegistrationDropdown from '~/runner/components/registration/registration_dropdown.vue';
import RunnerPagination from '~/runner/components/runner_pagination.vue';
@@ -28,7 +30,6 @@ import {
DEFAULT_SORT,
INSTANCE_TYPE,
GROUP_TYPE,
- PROJECT_TYPE,
PARAM_KEY_PAUSED,
PARAM_KEY_STATUS,
PARAM_KEY_TAG,
@@ -38,11 +39,10 @@ import {
RUNNER_PAGE_SIZE,
I18N_EDIT,
} from '~/runner/constants';
-import getGroupRunnersQuery from '~/runner/graphql/list/group_runners.query.graphql';
-import getGroupRunnersCountQuery from '~/runner/graphql/list/group_runners_count.query.graphql';
+import groupRunnersQuery from '~/runner/graphql/list/group_runners.query.graphql';
+import groupRunnersCountQuery from '~/runner/graphql/list/group_runners_count.query.graphql';
import GroupRunnersApp from '~/runner/group_runners/group_runners_app.vue';
import { captureException } from '~/runner/sentry_utils';
-import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
import {
groupRunnersData,
groupRunnersDataPaginated,
@@ -61,6 +61,9 @@ const mockRegistrationToken = 'AABBCC';
const mockGroupRunnersEdges = groupRunnersData.data.group.runners.edges;
const mockGroupRunnersCount = mockGroupRunnersEdges.length;
+const mockGroupRunnersHandler = jest.fn();
+const mockGroupRunnersCountHandler = jest.fn();
+
jest.mock('~/flash');
jest.mock('~/runner/sentry_utils');
jest.mock('~/lib/utils/url_utility', () => ({
@@ -70,8 +73,6 @@ jest.mock('~/lib/utils/url_utility', () => ({
describe('GroupRunnersApp', () => {
let wrapper;
- let mockGroupRunnersQuery;
- let mockGroupRunnersCountQuery;
const findRunnerStats = () => wrapper.findComponent(RunnerStats);
const findRunnerActionsCell = () => wrapper.findComponent(RunnerActionsCell);
@@ -83,17 +84,11 @@ describe('GroupRunnersApp', () => {
const findRunnerPagination = () => extendedWrapper(wrapper.findComponent(RunnerPagination));
const findRunnerPaginationNext = () => findRunnerPagination().findByLabelText('Go to next page');
const findRunnerFilteredSearchBar = () => wrapper.findComponent(RunnerFilteredSearchBar);
- const findFilteredSearch = () => wrapper.findComponent(FilteredSearch);
-
- const mockCountQueryResult = (count) =>
- Promise.resolve({
- data: { group: { id: groupRunnersCountData.data.group.id, runners: { count } } },
- });
- const createComponent = ({ props = {}, mountFn = shallowMountExtended } = {}) => {
+ const createComponent = ({ props = {}, mountFn = shallowMountExtended, ...options } = {}) => {
const handlers = [
- [getGroupRunnersQuery, mockGroupRunnersQuery],
- [getGroupRunnersCountQuery, mockGroupRunnersCountQuery],
+ [groupRunnersQuery, mockGroupRunnersHandler],
+ [groupRunnersCountQuery, mockGroupRunnersCountHandler],
];
wrapper = mountFn(GroupRunnersApp, {
@@ -110,90 +105,76 @@ describe('GroupRunnersApp', () => {
emptyStateSvgPath,
emptyStateFilteredSvgPath,
},
+ ...options,
});
+
+ return waitForPromises();
};
beforeEach(async () => {
- setWindowLocation(`/groups/${mockGroupFullPath}/-/runners`);
+ mockGroupRunnersHandler.mockResolvedValue(groupRunnersData);
+ mockGroupRunnersCountHandler.mockResolvedValue(groupRunnersCountData);
+ });
- mockGroupRunnersQuery = jest.fn().mockResolvedValue(groupRunnersData);
- mockGroupRunnersCountQuery = jest.fn().mockResolvedValue(groupRunnersCountData);
+ afterEach(() => {
+ mockGroupRunnersHandler.mockReset();
+ mockGroupRunnersCountHandler.mockReset();
+ wrapper.destroy();
+ });
+
+ it('shows the runner tabs with a runner count for each type', async () => {
+ await createComponent({ mountFn: mountExtended });
+ expect(findRunnerTypeTabs().text()).toMatchInterpolatedText(
+ `All ${mockGroupRunnersCount} Group ${mockGroupRunnersCount} Project ${mockGroupRunnersCount}`,
+ );
+ });
+
+ it('shows the runner setup instructions', () => {
createComponent();
- await waitForPromises();
+
+ expect(findRegistrationDropdown().props('registrationToken')).toBe(mockRegistrationToken);
+ expect(findRegistrationDropdown().props('type')).toBe(GROUP_TYPE);
});
it('shows total runner counts', async () => {
- expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
- groupFullPath: mockGroupFullPath,
+ await createComponent({ mountFn: mountExtended });
+
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledWith({
status: STATUS_ONLINE,
- });
- expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
groupFullPath: mockGroupFullPath,
- status: STATUS_OFFLINE,
});
- expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledWith({
+ status: STATUS_OFFLINE,
groupFullPath: mockGroupFullPath,
- status: STATUS_STALE,
- });
-
- expect(findRunnerStats().props()).toMatchObject({
- onlineRunnersCount: mockGroupRunnersCount,
- offlineRunnersCount: mockGroupRunnersCount,
- staleRunnersCount: mockGroupRunnersCount,
- });
- });
-
- it('shows the runner tabs with a runner count for each type', async () => {
- mockGroupRunnersCountQuery.mockImplementation(({ type }) => {
- switch (type) {
- case GROUP_TYPE:
- return mockCountQueryResult(2);
- case PROJECT_TYPE:
- return mockCountQueryResult(1);
- default:
- return mockCountQueryResult(4);
- }
});
-
- createComponent({ mountFn: mountExtended });
- await waitForPromises();
-
- expect(findRunnerTypeTabs().text()).toMatchInterpolatedText('All 4 Group 2 Project 1');
- });
-
- it('shows the runner tabs with a formatted runner count', async () => {
- mockGroupRunnersCountQuery.mockImplementation(({ type }) => {
- switch (type) {
- case GROUP_TYPE:
- return mockCountQueryResult(2000);
- case PROJECT_TYPE:
- return mockCountQueryResult(1000);
- default:
- return mockCountQueryResult(3000);
- }
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledWith({
+ status: STATUS_STALE,
+ groupFullPath: mockGroupFullPath,
});
- createComponent({ mountFn: mountExtended });
- await waitForPromises();
-
- expect(findRunnerTypeTabs().text()).toMatchInterpolatedText(
- 'All 3,000 Group 2,000 Project 1,000',
+ expect(findRunnerStats().text()).toContain(
+ `${s__('Runners|Online runners')} ${mockGroupRunnersCount}`,
+ );
+ expect(findRunnerStats().text()).toContain(
+ `${s__('Runners|Offline runners')} ${mockGroupRunnersCount}`,
+ );
+ expect(findRunnerStats().text()).toContain(
+ `${s__('Runners|Stale runners')} ${mockGroupRunnersCount}`,
);
});
- it('shows the runner setup instructions', () => {
- expect(findRegistrationDropdown().props('registrationToken')).toBe(mockRegistrationToken);
- expect(findRegistrationDropdown().props('type')).toBe(GROUP_TYPE);
- });
+ it('shows the runners list', async () => {
+ await createComponent();
- it('shows the runners list', () => {
const runners = findRunnerList().props('runners');
expect(runners).toEqual(mockGroupRunnersEdges.map(({ node }) => node));
});
- it('requests the runners with group path and no other filters', () => {
- expect(mockGroupRunnersQuery).toHaveBeenLastCalledWith({
+ it('requests the runners with group path and no other filters', async () => {
+ await createComponent();
+
+ expect(mockGroupRunnersHandler).toHaveBeenLastCalledWith({
groupFullPath: mockGroupFullPath,
status: undefined,
type: undefined,
@@ -203,9 +184,9 @@ describe('GroupRunnersApp', () => {
});
it('sets tokens in the filtered search', () => {
- createComponent({ mountFn: mountExtended });
+ createComponent();
- const tokens = findFilteredSearch().props('tokens');
+ const tokens = findRunnerFilteredSearchBar().props('tokens');
expect(tokens).toEqual([
expect.objectContaining({
@@ -229,12 +210,8 @@ describe('GroupRunnersApp', () => {
const FILTERED_COUNT_QUERIES = 3; // Smart queries that display a count of runners in tabs
beforeEach(async () => {
- mockGroupRunnersCountQuery.mockClear();
-
- createComponent({ mountFn: mountExtended });
+ await createComponent({ mountFn: mountExtended });
showToast = jest.spyOn(wrapper.vm.$root.$toast, 'show');
-
- await waitForPromises();
});
it('view link is displayed correctly', () => {
@@ -254,11 +231,11 @@ describe('GroupRunnersApp', () => {
});
it('When runner is paused or unpaused, some data is refetched', async () => {
- expect(mockGroupRunnersCountQuery).toHaveBeenCalledTimes(COUNT_QUERIES);
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledTimes(COUNT_QUERIES);
findRunnerActionsCell().vm.$emit('toggledPaused');
- expect(mockGroupRunnersCountQuery).toHaveBeenCalledTimes(
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledTimes(
COUNT_QUERIES + FILTERED_COUNT_QUERIES,
);
@@ -277,8 +254,12 @@ describe('GroupRunnersApp', () => {
beforeEach(async () => {
setWindowLocation(`?status[]=${STATUS_ONLINE}&runner_type[]=${INSTANCE_TYPE}`);
- createComponent();
- await waitForPromises();
+ await createComponent({
+ stubs: {
+ RunnerStats,
+ RunnerCount,
+ },
+ });
});
it('sets the filters in the search bar', () => {
@@ -291,7 +272,7 @@ describe('GroupRunnersApp', () => {
});
it('requests the runners with filter parameters', () => {
- expect(mockGroupRunnersQuery).toHaveBeenLastCalledWith({
+ expect(mockGroupRunnersHandler).toHaveBeenLastCalledWith({
groupFullPath: mockGroupFullPath,
status: STATUS_ONLINE,
type: INSTANCE_TYPE,
@@ -301,20 +282,23 @@ describe('GroupRunnersApp', () => {
});
it('fetches count results for requested status', () => {
- expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledWith({
groupFullPath: mockGroupFullPath,
type: INSTANCE_TYPE,
status: STATUS_ONLINE,
});
-
- expect(findRunnerStats().props()).toMatchObject({
- onlineRunnersCount: mockGroupRunnersCount,
- });
});
});
describe('when a filter is selected by the user', () => {
beforeEach(async () => {
+ createComponent({
+ stubs: {
+ RunnerStats,
+ RunnerCount,
+ },
+ });
+
findRunnerFilteredSearchBar().vm.$emit('input', {
runnerType: null,
filters: [
@@ -330,12 +314,12 @@ describe('GroupRunnersApp', () => {
it('updates the browser url', () => {
expect(updateHistory).toHaveBeenLastCalledWith({
title: expect.any(String),
- url: 'http://test.host/groups/group1/-/runners?status[]=ONLINE&tag[]=tag1&sort=CREATED_ASC',
+ url: expect.stringContaining('?status[]=ONLINE&tag[]=tag1&sort=CREATED_ASC'),
});
});
it('requests the runners with filters', () => {
- expect(mockGroupRunnersQuery).toHaveBeenLastCalledWith({
+ expect(mockGroupRunnersHandler).toHaveBeenLastCalledWith({
groupFullPath: mockGroupFullPath,
status: STATUS_ONLINE,
tagList: ['tag1'],
@@ -345,33 +329,11 @@ describe('GroupRunnersApp', () => {
});
it('fetches count results for requested status', () => {
- expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
+ expect(mockGroupRunnersCountHandler).toHaveBeenCalledWith({
groupFullPath: mockGroupFullPath,
tagList: ['tag1'],
status: STATUS_ONLINE,
});
-
- expect(findRunnerStats().props()).toMatchObject({
- onlineRunnersCount: mockGroupRunnersCount,
- });
- });
-
- it('skips fetching count results for status that were not in filter', () => {
- expect(mockGroupRunnersCountQuery).not.toHaveBeenCalledWith({
- groupFullPath: mockGroupFullPath,
- tagList: ['tag1'],
- status: STATUS_OFFLINE,
- });
- expect(mockGroupRunnersCountQuery).not.toHaveBeenCalledWith({
- groupFullPath: mockGroupFullPath,
- tagList: ['tag1'],
- status: STATUS_STALE,
- });
-
- expect(findRunnerStats().props()).toMatchObject({
- offlineRunnersCount: null,
- staleRunnersCount: null,
- });
});
});
@@ -382,7 +344,7 @@ describe('GroupRunnersApp', () => {
describe('when no runners are found', () => {
beforeEach(async () => {
- mockGroupRunnersQuery = jest.fn().mockResolvedValue({
+ mockGroupRunnersHandler.mockResolvedValue({
data: {
group: {
id: '1',
@@ -390,8 +352,7 @@ describe('GroupRunnersApp', () => {
},
},
});
- createComponent();
- await waitForPromises();
+ await createComponent();
});
it('shows an empty state', async () => {
@@ -401,9 +362,8 @@ describe('GroupRunnersApp', () => {
describe('when runners query fails', () => {
beforeEach(async () => {
- mockGroupRunnersQuery = jest.fn().mockRejectedValue(new Error('Error!'));
- createComponent();
- await waitForPromises();
+ mockGroupRunnersHandler.mockRejectedValue(new Error('Error!'));
+ await createComponent();
});
it('error is shown to the user', async () => {
@@ -420,16 +380,15 @@ describe('GroupRunnersApp', () => {
describe('Pagination', () => {
beforeEach(async () => {
- mockGroupRunnersQuery = jest.fn().mockResolvedValue(groupRunnersDataPaginated);
+ mockGroupRunnersHandler.mockResolvedValue(groupRunnersDataPaginated);
- createComponent({ mountFn: mountExtended });
- await waitForPromises();
+ await createComponent({ mountFn: mountExtended });
});
it('navigates to the next page', async () => {
await findRunnerPaginationNext().trigger('click');
- expect(mockGroupRunnersQuery).toHaveBeenLastCalledWith({
+ expect(mockGroupRunnersHandler).toHaveBeenLastCalledWith({
groupFullPath: mockGroupFullPath,
sort: CREATED_DESC,
first: RUNNER_PAGE_SIZE,
diff --git a/spec/frontend/runner/mock_data.js b/spec/frontend/runner/mock_data.js
index 3368fc21544..e5472ace817 100644
--- a/spec/frontend/runner/mock_data.js
+++ b/spec/frontend/runner/mock_data.js
@@ -10,14 +10,216 @@ import runnerJobsData from 'test_fixtures/graphql/runner/show/runner_jobs.query.
import runnerFormData from 'test_fixtures/graphql/runner/edit/runner_form.query.graphql.json';
// List queries
-import runnersData from 'test_fixtures/graphql/runner/list/admin_runners.query.graphql.json';
-import runnersDataPaginated from 'test_fixtures/graphql/runner/list/admin_runners.query.graphql.paginated.json';
-import runnersCountData from 'test_fixtures/graphql/runner/list/admin_runners_count.query.graphql.json';
+import allRunnersData from 'test_fixtures/graphql/runner/list/all_runners.query.graphql.json';
+import allRunnersDataPaginated from 'test_fixtures/graphql/runner/list/all_runners.query.graphql.paginated.json';
+import runnersCountData from 'test_fixtures/graphql/runner/list/all_runners_count.query.graphql.json';
import groupRunnersData from 'test_fixtures/graphql/runner/list/group_runners.query.graphql.json';
import groupRunnersDataPaginated from 'test_fixtures/graphql/runner/list/group_runners.query.graphql.paginated.json';
import groupRunnersCountData from 'test_fixtures/graphql/runner/list/group_runners_count.query.graphql.json';
+import { RUNNER_PAGE_SIZE } from '~/runner/constants';
+
// Other mock data
+
+// Mock searches and their corresponding urls
+export const mockSearchExamples = [
+ {
+ name: 'a default query',
+ urlQuery: '',
+ search: { runnerType: null, filters: [], pagination: { page: 1 }, sort: 'CREATED_DESC' },
+ graphqlVariables: { sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ isDefault: true,
+ },
+ {
+ name: 'a single status',
+ urlQuery: '?status[]=ACTIVE',
+ search: {
+ runnerType: null,
+ filters: [{ type: 'status', value: { data: 'ACTIVE', operator: '=' } }],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { status: 'ACTIVE', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'a single term text search',
+ urlQuery: '?search=something',
+ search: {
+ runnerType: null,
+ filters: [
+ {
+ type: 'filtered-search-term',
+ value: { data: 'something' },
+ },
+ ],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { search: 'something', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'a two terms text search',
+ urlQuery: '?search=something+else',
+ search: {
+ runnerType: null,
+ filters: [
+ {
+ type: 'filtered-search-term',
+ value: { data: 'something' },
+ },
+ {
+ type: 'filtered-search-term',
+ value: { data: 'else' },
+ },
+ ],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { search: 'something else', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'single instance type',
+ urlQuery: '?runner_type[]=INSTANCE_TYPE',
+ search: {
+ runnerType: 'INSTANCE_TYPE',
+ filters: [],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { type: 'INSTANCE_TYPE', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'multiple runner status',
+ urlQuery: '?status[]=ACTIVE&status[]=PAUSED',
+ search: {
+ runnerType: null,
+ filters: [
+ { type: 'status', value: { data: 'ACTIVE', operator: '=' } },
+ { type: 'status', value: { data: 'PAUSED', operator: '=' } },
+ ],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { status: 'ACTIVE', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'multiple status, a single instance type and a non default sort',
+ urlQuery: '?status[]=ACTIVE&runner_type[]=INSTANCE_TYPE&sort=CREATED_ASC',
+ search: {
+ runnerType: 'INSTANCE_TYPE',
+ filters: [{ type: 'status', value: { data: 'ACTIVE', operator: '=' } }],
+ pagination: { page: 1 },
+ sort: 'CREATED_ASC',
+ },
+ graphqlVariables: {
+ status: 'ACTIVE',
+ type: 'INSTANCE_TYPE',
+ sort: 'CREATED_ASC',
+ first: RUNNER_PAGE_SIZE,
+ },
+ },
+ {
+ name: 'a tag',
+ urlQuery: '?tag[]=tag-1',
+ search: {
+ runnerType: null,
+ 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: {
+ runnerType: null,
+ 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: {
+ runnerType: null,
+ filters: [],
+ pagination: { page: 2, after: 'AFTER_CURSOR' },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { sort: 'CREATED_DESC', after: 'AFTER_CURSOR', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'the previous page',
+ urlQuery: '?page=2&before=BEFORE_CURSOR',
+ search: {
+ runnerType: null,
+ filters: [],
+ pagination: { page: 2, before: 'BEFORE_CURSOR' },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { sort: 'CREATED_DESC', before: 'BEFORE_CURSOR', last: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'the next page filtered by a status, an instance type, tags and a non default sort',
+ urlQuery:
+ '?status[]=ACTIVE&runner_type[]=INSTANCE_TYPE&tag[]=tag-1&tag[]=tag-2&sort=CREATED_ASC&page=2&after=AFTER_CURSOR',
+ search: {
+ runnerType: 'INSTANCE_TYPE',
+ filters: [
+ { type: 'status', value: { data: 'ACTIVE', operator: '=' } },
+ { type: 'tag', value: { data: 'tag-1', operator: '=' } },
+ { type: 'tag', value: { data: 'tag-2', operator: '=' } },
+ ],
+ pagination: { page: 2, after: 'AFTER_CURSOR' },
+ sort: 'CREATED_ASC',
+ },
+ graphqlVariables: {
+ status: 'ACTIVE',
+ type: 'INSTANCE_TYPE',
+ tagList: ['tag-1', 'tag-2'],
+ sort: 'CREATED_ASC',
+ after: 'AFTER_CURSOR',
+ first: RUNNER_PAGE_SIZE,
+ },
+ },
+ {
+ name: 'paused runners',
+ urlQuery: '?paused[]=true',
+ search: {
+ runnerType: null,
+ filters: [{ type: 'paused', value: { data: 'true', operator: '=' } }],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { paused: true, sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'active runners',
+ urlQuery: '?paused[]=false',
+ search: {
+ runnerType: null,
+ filters: [{ type: 'paused', value: { data: 'false', operator: '=' } }],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { paused: false, sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+];
+
export const onlineContactTimeoutSecs = 2 * 60 * 60;
export const staleTimeoutSecs = 7889238; // Ruby's `3.months`
@@ -25,8 +227,8 @@ export const emptyStateSvgPath = 'emptyStateSvgPath.svg';
export const emptyStateFilteredSvgPath = 'emptyStateFilteredSvgPath.svg';
export {
- runnersData,
- runnersDataPaginated,
+ allRunnersData,
+ allRunnersDataPaginated,
runnersCountData,
groupRunnersData,
groupRunnersDataPaginated,
diff --git a/spec/frontend/runner/runner_search_utils_spec.js b/spec/frontend/runner/runner_search_utils_spec.js
index 1f102f86b2a..6f954143ab1 100644
--- a/spec/frontend/runner/runner_search_utils_spec.js
+++ b/spec/frontend/runner/runner_search_utils_spec.js
@@ -1,4 +1,3 @@
-import { RUNNER_PAGE_SIZE } from '~/runner/constants';
import {
searchValidator,
updateOutdatedUrl,
@@ -6,209 +5,12 @@ import {
fromSearchToUrl,
fromSearchToVariables,
isSearchFiltered,
-} from '~/runner/runner_search_utils';
+} from 'ee_else_ce/runner/runner_search_utils';
+import { mockSearchExamples } from './mock_data';
describe('search_params.js', () => {
- const examples = [
- {
- name: 'a default query',
- urlQuery: '',
- search: { runnerType: null, filters: [], pagination: { page: 1 }, sort: 'CREATED_DESC' },
- graphqlVariables: { sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- isDefault: true,
- },
- {
- name: 'a single status',
- urlQuery: '?status[]=ACTIVE',
- search: {
- runnerType: null,
- filters: [{ type: 'status', value: { data: 'ACTIVE', operator: '=' } }],
- pagination: { page: 1 },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { status: 'ACTIVE', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- },
- {
- name: 'a single term text search',
- urlQuery: '?search=something',
- search: {
- runnerType: null,
- filters: [
- {
- type: 'filtered-search-term',
- value: { data: 'something' },
- },
- ],
- pagination: { page: 1 },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { search: 'something', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- },
- {
- name: 'a two terms text search',
- urlQuery: '?search=something+else',
- search: {
- runnerType: null,
- filters: [
- {
- type: 'filtered-search-term',
- value: { data: 'something' },
- },
- {
- type: 'filtered-search-term',
- value: { data: 'else' },
- },
- ],
- pagination: { page: 1 },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { search: 'something else', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- },
- {
- name: 'single instance type',
- urlQuery: '?runner_type[]=INSTANCE_TYPE',
- search: {
- runnerType: 'INSTANCE_TYPE',
- filters: [],
- pagination: { page: 1 },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { type: 'INSTANCE_TYPE', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- },
- {
- name: 'multiple runner status',
- urlQuery: '?status[]=ACTIVE&status[]=PAUSED',
- search: {
- runnerType: null,
- filters: [
- { type: 'status', value: { data: 'ACTIVE', operator: '=' } },
- { type: 'status', value: { data: 'PAUSED', operator: '=' } },
- ],
- pagination: { page: 1 },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { status: 'ACTIVE', sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- },
- {
- name: 'multiple status, a single instance type and a non default sort',
- urlQuery: '?status[]=ACTIVE&runner_type[]=INSTANCE_TYPE&sort=CREATED_ASC',
- search: {
- runnerType: 'INSTANCE_TYPE',
- filters: [{ type: 'status', value: { data: 'ACTIVE', operator: '=' } }],
- pagination: { page: 1 },
- sort: 'CREATED_ASC',
- },
- graphqlVariables: {
- status: 'ACTIVE',
- type: 'INSTANCE_TYPE',
- sort: 'CREATED_ASC',
- first: RUNNER_PAGE_SIZE,
- },
- },
- {
- name: 'a tag',
- urlQuery: '?tag[]=tag-1',
- search: {
- runnerType: null,
- 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: {
- runnerType: null,
- 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: {
- runnerType: null,
- filters: [],
- pagination: { page: 2, after: 'AFTER_CURSOR' },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { sort: 'CREATED_DESC', after: 'AFTER_CURSOR', first: RUNNER_PAGE_SIZE },
- },
- {
- name: 'the previous page',
- urlQuery: '?page=2&before=BEFORE_CURSOR',
- search: {
- runnerType: null,
- filters: [],
- pagination: { page: 2, before: 'BEFORE_CURSOR' },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { sort: 'CREATED_DESC', before: 'BEFORE_CURSOR', last: RUNNER_PAGE_SIZE },
- },
- {
- name: 'the next page filtered by a status, an instance type, tags and a non default sort',
- urlQuery:
- '?status[]=ACTIVE&runner_type[]=INSTANCE_TYPE&tag[]=tag-1&tag[]=tag-2&sort=CREATED_ASC&page=2&after=AFTER_CURSOR',
- search: {
- runnerType: 'INSTANCE_TYPE',
- filters: [
- { type: 'status', value: { data: 'ACTIVE', operator: '=' } },
- { type: 'tag', value: { data: 'tag-1', operator: '=' } },
- { type: 'tag', value: { data: 'tag-2', operator: '=' } },
- ],
- pagination: { page: 2, after: 'AFTER_CURSOR' },
- sort: 'CREATED_ASC',
- },
- graphqlVariables: {
- status: 'ACTIVE',
- type: 'INSTANCE_TYPE',
- tagList: ['tag-1', 'tag-2'],
- sort: 'CREATED_ASC',
- after: 'AFTER_CURSOR',
- first: RUNNER_PAGE_SIZE,
- },
- },
- {
- name: 'paused runners',
- urlQuery: '?paused[]=true',
- search: {
- runnerType: null,
- filters: [{ type: 'paused', value: { data: 'true', operator: '=' } }],
- pagination: { page: 1 },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { paused: true, sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- },
- {
- name: 'active runners',
- urlQuery: '?paused[]=false',
- search: {
- runnerType: null,
- filters: [{ type: 'paused', value: { data: 'false', operator: '=' } }],
- pagination: { page: 1 },
- sort: 'CREATED_DESC',
- },
- graphqlVariables: { paused: false, sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
- },
- ];
-
describe('searchValidator', () => {
- examples.forEach(({ name, search }) => {
+ mockSearchExamples.forEach(({ name, search }) => {
it(`Validates ${name} as a search object`, () => {
expect(searchValidator(search)).toBe(true);
});
@@ -235,7 +37,7 @@ describe('search_params.js', () => {
});
describe('fromUrlQueryToSearch', () => {
- examples.forEach(({ name, urlQuery, search }) => {
+ mockSearchExamples.forEach(({ name, urlQuery, search }) => {
it(`Converts ${name} to a search object`, () => {
expect(fromUrlQueryToSearch(urlQuery)).toEqual(search);
});
@@ -268,7 +70,7 @@ describe('search_params.js', () => {
});
describe('fromSearchToUrl', () => {
- examples.forEach(({ name, urlQuery, search }) => {
+ mockSearchExamples.forEach(({ name, urlQuery, search }) => {
it(`Converts ${name} to a url`, () => {
expect(fromSearchToUrl(search)).toBe(`http://test.host/${urlQuery}`);
});
@@ -295,7 +97,7 @@ describe('search_params.js', () => {
});
describe('fromSearchToVariables', () => {
- examples.forEach(({ name, graphqlVariables, search }) => {
+ mockSearchExamples.forEach(({ name, graphqlVariables, search }) => {
it(`Converts ${name} to a GraphQL query variables object`, () => {
expect(fromSearchToVariables(search)).toEqual(graphqlVariables);
});
@@ -335,7 +137,7 @@ describe('search_params.js', () => {
});
describe('isSearchFiltered', () => {
- examples.forEach(({ name, search, isDefault }) => {
+ mockSearchExamples.forEach(({ name, search, isDefault }) => {
it(`Given ${name}, evaluates to ${isDefault ? 'not ' : ''}filtered`, () => {
expect(isSearchFiltered(search)).toBe(!isDefault);
});
diff --git a/spec/frontend/security_configuration/components/app_spec.js b/spec/frontend/security_configuration/components/app_spec.js
index de91e51924d..222cabc6a63 100644
--- a/spec/frontend/security_configuration/components/app_spec.js
+++ b/spec/frontend/security_configuration/components/app_spec.js
@@ -1,11 +1,10 @@
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import { GlTab, GlTabs, GlLink } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import { makeMockUserCalloutDismisser } from 'helpers/mock_user_callout_dismisser';
import stubChildren from 'helpers/stub_children';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import SecurityConfigurationApp, { i18n } from '~/security_configuration/components/app.vue';
import AutoDevopsAlert from '~/security_configuration/components/auto_dev_ops_alert.vue';
import AutoDevopsEnabledAlert from '~/security_configuration/components/auto_dev_ops_enabled_alert.vue';
@@ -42,35 +41,57 @@ describe('App component', () => {
let wrapper;
let userCalloutDismissSpy;
- const createComponent = ({ shouldShowCallout = true, ...propsData }) => {
+ const securityFeaturesMock = [
+ {
+ name: SAST_NAME,
+ shortName: SAST_SHORT_NAME,
+ description: SAST_DESCRIPTION,
+ helpPath: SAST_HELP_PATH,
+ configurationHelpPath: SAST_CONFIG_HELP_PATH,
+ type: REPORT_TYPE_SAST,
+ available: true,
+ },
+ ];
+
+ const complianceFeaturesMock = [
+ {
+ name: LICENSE_COMPLIANCE_NAME,
+ description: LICENSE_COMPLIANCE_DESCRIPTION,
+ helpPath: LICENSE_COMPLIANCE_HELP_PATH,
+ type: REPORT_TYPE_LICENSE_COMPLIANCE,
+ configurationHelpPath: LICENSE_COMPLIANCE_HELP_PATH,
+ },
+ ];
+
+ const createComponent = ({ shouldShowCallout = true, ...propsData } = {}) => {
userCalloutDismissSpy = jest.fn();
- wrapper = extendedWrapper(
- mount(SecurityConfigurationApp, {
- propsData: {
- securityTrainingEnabled: true,
- ...propsData,
- },
- provide: {
- upgradePath,
- autoDevopsHelpPagePath,
- autoDevopsPath,
- projectFullPath,
- vulnerabilityTrainingDocsPath,
- },
- stubs: {
- ...stubChildren(SecurityConfigurationApp),
- GlLink: false,
- GlSprintf: false,
- LocalStorageSync: false,
- SectionLayout: false,
- UserCalloutDismisser: makeMockUserCalloutDismisser({
- dismiss: userCalloutDismissSpy,
- shouldShowCallout,
- }),
- },
- }),
- );
+ wrapper = mountExtended(SecurityConfigurationApp, {
+ propsData: {
+ augmentedSecurityFeatures: securityFeaturesMock,
+ augmentedComplianceFeatures: complianceFeaturesMock,
+ securityTrainingEnabled: true,
+ ...propsData,
+ },
+ provide: {
+ upgradePath,
+ autoDevopsHelpPagePath,
+ autoDevopsPath,
+ projectFullPath,
+ vulnerabilityTrainingDocsPath,
+ },
+ stubs: {
+ ...stubChildren(SecurityConfigurationApp),
+ GlLink: false,
+ GlSprintf: false,
+ LocalStorageSync: false,
+ SectionLayout: false,
+ UserCalloutDismisser: makeMockUserCalloutDismisser({
+ dismiss: userCalloutDismissSpy,
+ shouldShowCallout,
+ }),
+ },
+ });
};
const findMainHeading = () => wrapper.find('h1');
@@ -108,38 +129,13 @@ describe('App component', () => {
const findAutoDevopsEnabledAlert = () => wrapper.findComponent(AutoDevopsEnabledAlert);
const findVulnerabilityManagementTab = () => wrapper.findByTestId('vulnerability-management-tab');
- const securityFeaturesMock = [
- {
- name: SAST_NAME,
- shortName: SAST_SHORT_NAME,
- description: SAST_DESCRIPTION,
- helpPath: SAST_HELP_PATH,
- configurationHelpPath: SAST_CONFIG_HELP_PATH,
- type: REPORT_TYPE_SAST,
- available: true,
- },
- ];
-
- const complianceFeaturesMock = [
- {
- name: LICENSE_COMPLIANCE_NAME,
- description: LICENSE_COMPLIANCE_DESCRIPTION,
- helpPath: LICENSE_COMPLIANCE_HELP_PATH,
- type: REPORT_TYPE_LICENSE_COMPLIANCE,
- configurationHelpPath: LICENSE_COMPLIANCE_HELP_PATH,
- },
- ];
-
afterEach(() => {
wrapper.destroy();
});
describe('basic structure', () => {
- beforeEach(async () => {
- createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
- });
+ beforeEach(() => {
+ createComponent();
});
it('renders main-heading with correct text', () => {
@@ -199,10 +195,7 @@ describe('App component', () => {
describe('Manage via MR Error Alert', () => {
beforeEach(() => {
- createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
- });
+ createComponent();
});
describe('on initial load', () => {
@@ -238,8 +231,6 @@ describe('App component', () => {
describe('given the right props', () => {
beforeEach(() => {
createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
autoDevopsEnabled: false,
gitlabCiPresent: false,
canEnableAutoDevops: true,
@@ -261,10 +252,7 @@ describe('App component', () => {
describe('given the wrong props', () => {
beforeEach(() => {
- createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
- });
+ createComponent();
});
it('should not show AutoDevopsAlert', () => {
expect(findAutoDevopsAlert().exists()).toBe(false);
@@ -289,8 +277,6 @@ describe('App component', () => {
}
createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
autoDevopsEnabled,
});
});
@@ -348,7 +334,6 @@ describe('App component', () => {
describe('given at least one unavailable feature', () => {
beforeEach(() => {
createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
augmentedComplianceFeatures: complianceFeaturesMock.map(makeAvailable(false)),
});
});
@@ -369,7 +354,6 @@ describe('App component', () => {
describe('given at least one unavailable feature, but banner is already dismissed', () => {
beforeEach(() => {
createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
augmentedComplianceFeatures: complianceFeaturesMock.map(makeAvailable(false)),
shouldShowCallout: false,
});
@@ -397,8 +381,6 @@ describe('App component', () => {
describe('when given latestPipelinePath props', () => {
beforeEach(() => {
createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
latestPipelinePath: 'test/path',
});
});
@@ -425,8 +407,6 @@ describe('App component', () => {
describe('given gitlabCiPresent & gitlabCiHistoryPath props', () => {
beforeEach(() => {
createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
gitlabCiPresent: true,
gitlabCiHistoryPath,
});
@@ -442,42 +422,31 @@ describe('App component', () => {
});
describe('Vulnerability management', () => {
- it('does not show tab if security training is disabled', () => {
+ const props = { securityTrainingEnabled: true };
+
+ beforeEach(async () => {
createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
- securityTrainingEnabled: false,
+ ...props,
});
-
- expect(findVulnerabilityManagementTab().exists()).toBe(false);
});
- describe('security training enabled', () => {
- beforeEach(async () => {
- createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
- });
- });
-
- it('shows the tab if security training is enabled', () => {
- expect(findVulnerabilityManagementTab().exists()).toBe(true);
- });
+ it('shows the tab', () => {
+ expect(findVulnerabilityManagementTab().exists()).toBe(true);
+ });
- it('renders TrainingProviderList component', () => {
- expect(findTrainingProviderList().exists()).toBe(true);
- });
+ it('renders TrainingProviderList component', () => {
+ expect(findTrainingProviderList().props()).toMatchObject(props);
+ });
- it('renders security training description', () => {
- expect(findVulnerabilityManagementTab().text()).toContain(i18n.securityTrainingDescription);
- });
+ it('renders security training description', () => {
+ expect(findVulnerabilityManagementTab().text()).toContain(i18n.securityTrainingDescription);
+ });
- it('renders link to help docs', () => {
- const trainingLink = findVulnerabilityManagementTab().findComponent(GlLink);
+ it('renders link to help docs', () => {
+ const trainingLink = findVulnerabilityManagementTab().findComponent(GlLink);
- expect(trainingLink.text()).toBe('Learn more about vulnerability training');
- expect(trainingLink.attributes('href')).toBe(vulnerabilityTrainingDocsPath);
- });
+ expect(trainingLink.text()).toBe('Learn more about vulnerability training');
+ expect(trainingLink.attributes('href')).toBe(vulnerabilityTrainingDocsPath);
});
});
});
diff --git a/spec/frontend/security_configuration/components/training_provider_list_spec.js b/spec/frontend/security_configuration/components/training_provider_list_spec.js
index 309a9cd4cd6..184c16fda6e 100644
--- a/spec/frontend/security_configuration/components/training_provider_list_spec.js
+++ b/spec/frontend/security_configuration/components/training_provider_list_spec.js
@@ -36,7 +36,6 @@ import {
testProjectPath,
testProviderIds,
testProviderName,
- tempProviderLogos,
} from '../mock_data';
Vue.use(VueApollo);
@@ -54,6 +53,31 @@ const TEST_TRAINING_PROVIDERS_ALL_ENABLED = getSecurityTrainingProvidersData({
});
const TEST_TRAINING_PROVIDERS_DEFAULT = TEST_TRAINING_PROVIDERS_ALL_DISABLED;
+const TEMP_PROVIDER_LOGOS = {
+ Kontra: {
+ svg: '<svg>Kontra</svg>',
+ },
+ 'Secure Code Warrior': {
+ svg: '<svg>Secure Code Warrior</svg>',
+ },
+};
+jest.mock('~/security_configuration/components/constants', () => {
+ return {
+ TEMP_PROVIDER_URLS: jest.requireActual('~/security_configuration/components/constants')
+ .TEMP_PROVIDER_URLS,
+ // NOTE: Jest hoists all mocks to the top so we can't use TEMP_PROVIDER_LOGOS
+ // here directly.
+ TEMP_PROVIDER_LOGOS: {
+ Kontra: {
+ svg: '<svg>Kontra</svg>',
+ },
+ 'Secure Code Warrior': {
+ svg: '<svg>Secure Code Warrior</svg>',
+ },
+ },
+ };
+});
+
describe('TrainingProviderList component', () => {
let wrapper;
let apolloProvider;
@@ -76,7 +100,7 @@ describe('TrainingProviderList component', () => {
apolloProvider = createMockApollo(mergedHandlers);
};
- const createComponent = () => {
+ const createComponent = (props = {}) => {
wrapper = shallowMountExtended(TrainingProviderList, {
provide: {
projectFullPath: testProjectPath,
@@ -84,6 +108,10 @@ describe('TrainingProviderList component', () => {
directives: {
GlTooltip: createMockDirective(),
},
+ propsData: {
+ securityTrainingEnabled: true,
+ ...props,
+ },
apolloProvider,
});
};
@@ -99,6 +127,7 @@ describe('TrainingProviderList component', () => {
const findLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findErrorAlert = () => wrapper.findComponent(GlAlert);
const findLogos = () => wrapper.findAllByTestId('provider-logo');
+ const findUnavailableTexts = () => wrapper.findAllByTestId('unavailable-text');
const toggleFirstProvider = () => findFirstToggle().vm.$emit('change', testProviderIds[0]);
@@ -212,7 +241,6 @@ describe('TrainingProviderList component', () => {
describe('provider logo', () => {
beforeEach(async () => {
- wrapper.vm.$options.TEMP_PROVIDER_LOGOS = tempProviderLogos;
await waitForQueryToBeLoaded();
});
@@ -226,9 +254,9 @@ describe('TrainingProviderList component', () => {
expect(findLogos().at(provider).attributes('role')).toBe('presentation');
});
- it.each(providerIndexArray)('renders the svg content for provider %s', (provider) => {
+ it.each(providerIndexArray)('renders the svg content for provider %s', async (provider) => {
expect(findLogos().at(provider).html()).toContain(
- tempProviderLogos[testProviderName[provider]].svg,
+ TEMP_PROVIDER_LOGOS[testProviderName[provider]].svg,
);
});
});
@@ -351,6 +379,41 @@ describe('TrainingProviderList component', () => {
);
});
});
+
+ describe('non ultimate users', () => {
+ beforeEach(async () => {
+ createComponent({
+ securityTrainingEnabled: false,
+ });
+ await waitForQueryToBeLoaded();
+ });
+
+ it('displays unavailable text', () => {
+ findUnavailableTexts().wrappers.forEach((unavailableText) => {
+ expect(unavailableText.text()).toBe(TrainingProviderList.i18n.unavailableText);
+ });
+ });
+
+ it('has disabled state for toggle', () => {
+ findToggles().wrappers.forEach((toggle) => {
+ expect(toggle.props('disabled')).toBe(true);
+ });
+ });
+
+ it('has disabled state for radio', () => {
+ findPrimaryProviderRadios().wrappers.forEach((radio) => {
+ expect(radio.attributes('disabled')).toBeTruthy();
+ });
+ });
+
+ it('adds backgrounds color', () => {
+ findCards().wrappers.forEach((card) => {
+ expect(card.props('bodyClass')).toMatchObject({
+ 'gl-bg-gray-10': true,
+ });
+ });
+ });
+ });
});
describe('primary provider settings', () => {
@@ -442,7 +505,7 @@ describe('TrainingProviderList component', () => {
${'backend error'} | ${jest.fn().mockReturnValue(dismissUserCalloutErrorResponse)}
${'network error'} | ${jest.fn().mockRejectedValue()}
`('when dismissing the callout and a "$errorType" happens', ({ mutationHandler }) => {
- beforeEach(async () => {
+ it('logs the error to sentry', async () => {
jest.spyOn(Sentry, 'captureException').mockImplementation();
createApolloProvider({
@@ -460,9 +523,7 @@ describe('TrainingProviderList component', () => {
await waitForQueryToBeLoaded();
toggleFirstProvider();
- });
- it('logs the error to sentry', async () => {
expect(Sentry.captureException).not.toHaveBeenCalled();
await waitForMutationToBeLoaded();
diff --git a/spec/frontend/security_configuration/mock_data.js b/spec/frontend/security_configuration/mock_data.js
index 18a480bf082..2fe3b59cea3 100644
--- a/spec/frontend/security_configuration/mock_data.js
+++ b/spec/frontend/security_configuration/mock_data.js
@@ -100,14 +100,3 @@ export const updateSecurityTrainingProvidersErrorResponse = {
},
},
};
-
-// Will remove once this issue is resolved where the svg path will be available in the GraphQL query
-// https://gitlab.com/gitlab-org/gitlab/-/issues/346899
-export const tempProviderLogos = {
- [testProviderName[0]]: {
- svg: `<svg>${[testProviderName[0]]}</svg>`,
- },
- [testProviderName[1]]: {
- svg: `<svg>${[testProviderName[1]]}</svg>`,
- },
-};
diff --git a/spec/frontend/self_monitor/components/__snapshots__/self_monitor_form_spec.js.snap b/spec/frontend/self_monitor/components/__snapshots__/self_monitor_form_spec.js.snap
index 62a9ff98243..11841106ed0 100644
--- a/spec/frontend/self_monitor/components/__snapshots__/self_monitor_form_spec.js.snap
+++ b/spec/frontend/self_monitor/components/__snapshots__/self_monitor_form_spec.js.snap
@@ -8,7 +8,7 @@ exports[`self monitor component When the self monitor project has not been creat
class="settings-header"
>
<h4
- class="js-section-header"
+ class="js-section-header settings-title js-settings-toggle js-settings-toggle-trigger-only"
>
Self monitoring
diff --git a/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js b/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
index 0b672cbc93e..e3b5478290a 100644
--- a/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
+++ b/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
@@ -1,10 +1,11 @@
import { GlModal, GlFormCheckbox } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { initEmojiMock, clearEmojiMock } from 'helpers/emoji';
import * as UserApi from '~/api/user_api';
import EmojiPicker from '~/emoji/components/picker.vue';
import createFlash from '~/flash';
+import stubChildren from 'helpers/stub_children';
import SetStatusModalWrapper, {
AVAILABILITY_STATUS,
} from '~/set_status_modal/set_status_modal_wrapper.vue';
@@ -26,12 +27,23 @@ describe('SetStatusModalWrapper', () => {
defaultEmoji,
};
+ const EmojiPickerStub = {
+ props: EmojiPicker.props,
+ template: '<div></div>',
+ };
+
const createComponent = (props = {}) => {
- return shallowMount(SetStatusModalWrapper, {
+ return mount(SetStatusModalWrapper, {
propsData: {
...defaultProps,
...props,
},
+ stubs: {
+ ...stubChildren(SetStatusModalWrapper),
+ GlFormInput: false,
+ GlFormInputGroup: false,
+ EmojiPicker: EmojiPickerStub,
+ },
mocks: {
$toast,
},
@@ -43,7 +55,7 @@ describe('SetStatusModalWrapper', () => {
const findClearStatusButton = () => wrapper.find('.js-clear-user-status-button');
const findAvailabilityCheckbox = () => wrapper.find(GlFormCheckbox);
const findClearStatusAtMessage = () => wrapper.find('[data-testid="clear-status-at-message"]');
- const getEmojiPicker = () => wrapper.findComponent(EmojiPicker);
+ const getEmojiPicker = () => wrapper.findComponent(EmojiPickerStub);
const initModal = async ({ mockOnUpdateSuccess = true, mockOnUpdateFailure = true } = {}) => {
const modal = findModal();
@@ -88,7 +100,7 @@ describe('SetStatusModalWrapper', () => {
});
it('has a clear status button', () => {
- expect(findClearStatusButton().isVisible()).toBe(true);
+ expect(findClearStatusButton().exists()).toBe(true);
});
it('displays the clear status at dropdown', () => {
@@ -125,7 +137,7 @@ describe('SetStatusModalWrapper', () => {
});
it('hides the clear status button', () => {
- expect(findClearStatusButton().isVisible()).toBe(false);
+ expect(findClearStatusButton().exists()).toBe(false);
});
});
diff --git a/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js b/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js
index a286eeef14f..517b4f12559 100644
--- a/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js
+++ b/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js
@@ -120,6 +120,7 @@ describe('AssigneeAvatarLink component', () => {
it('passes the correct user id for REST API', () => {
createComponent({
tooltipHasName: true,
+ issuableType: 'issue',
user: userDataMock(),
});
@@ -131,9 +132,22 @@ describe('AssigneeAvatarLink component', () => {
createComponent({
tooltipHasName: true,
+ issuableType: 'issue',
user: { ...userDataMock(), id: convertToGraphQLId(TYPE_USER, userId) },
});
expect(findUserLink().attributes('data-user-id')).toBe(String(userId));
});
+
+ it.each`
+ issuableType | userId
+ ${'merge_request'} | ${undefined}
+ ${'issue'} | ${'1'}
+ `('it sets data-user-id as $userId for $issuableType', ({ issuableType, userId }) => {
+ createComponent({
+ issuableType,
+ });
+
+ expect(findUserLink().attributes('data-user-id')).toBe(userId);
+ });
});
diff --git a/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js b/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js
index 3ddd41c0bd4..8ebd2dabfc2 100644
--- a/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js
+++ b/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js
@@ -107,6 +107,7 @@ describe('SidebarDropdownWidget', () => {
currentMilestoneSpy = jest.fn().mockResolvedValue(noCurrentMilestoneResponse),
} = {}) => {
Vue.use(VueApollo);
+
mockApollo = createMockApollo([
[projectMilestonesQuery, projectMilestonesSpy],
[projectIssueMilestoneQuery, currentMilestoneSpy],
@@ -415,11 +416,9 @@ describe('SidebarDropdownWidget', () => {
describe('when currentAttribute is not equal to attribute id', () => {
describe('when update is successful', () => {
- beforeEach(() => {
+ it('calls setIssueAttribute mutation', () => {
findDropdownItemWithText(mockMilestone2.title).vm.$emit('click');
- });
- it('calls setIssueAttribute mutation', () => {
expect(milestoneMutationSpy).toHaveBeenCalledWith({
iid: mockIssue.iid,
attributeId: getIdFromGraphQLId(mockMilestone2.id),
@@ -428,6 +427,8 @@ describe('SidebarDropdownWidget', () => {
});
it('sets the value returned from the mutation to currentAttribute', async () => {
+ findDropdownItemWithText(mockMilestone2.title).vm.$emit('click');
+ await nextTick();
expect(findSelectedAttribute().text()).toBe(mockMilestone2.title);
});
});
diff --git a/spec/frontend/sidebar/components/subscriptions/sidebar_subscriptions_widget_spec.js b/spec/frontend/sidebar/components/subscriptions/sidebar_subscriptions_widget_spec.js
index 549ab99c6af..9a68940590d 100644
--- a/spec/frontend/sidebar/components/subscriptions/sidebar_subscriptions_widget_spec.js
+++ b/spec/frontend/sidebar/components/subscriptions/sidebar_subscriptions_widget_spec.js
@@ -8,15 +8,22 @@ import createFlash from '~/flash';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
import SidebarSubscriptionWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
import issueSubscribedQuery from '~/sidebar/queries/issue_subscribed.query.graphql';
-import { issueSubscriptionsResponse } from '../../mock_data';
+import updateMergeRequestSubscriptionMutation from '~/sidebar/queries/update_merge_request_subscription.mutation.graphql';
+import toast from '~/vue_shared/plugins/global_toast';
+import {
+ issueSubscriptionsResponse,
+ mergeRequestSubscriptionMutationResponse,
+} from '../../mock_data';
jest.mock('~/flash');
+jest.mock('~/vue_shared/plugins/global_toast');
Vue.use(VueApollo);
describe('Sidebar Subscriptions Widget', () => {
let wrapper;
let fakeApollo;
+ let subscriptionMutationHandler;
const findEditableItem = () => wrapper.findComponent(SidebarEditableItem);
const findToggle = () => wrapper.findComponent(GlToggle);
@@ -24,18 +31,29 @@ describe('Sidebar Subscriptions Widget', () => {
const createComponent = ({
subscriptionsQueryHandler = jest.fn().mockResolvedValue(issueSubscriptionsResponse()),
+ issuableType = 'issue',
+ movedMrSidebar = false,
} = {}) => {
- fakeApollo = createMockApollo([[issueSubscribedQuery, subscriptionsQueryHandler]]);
+ subscriptionMutationHandler = jest
+ .fn()
+ .mockResolvedValue(mergeRequestSubscriptionMutationResponse);
+ fakeApollo = createMockApollo([
+ [issueSubscribedQuery, subscriptionsQueryHandler],
+ [updateMergeRequestSubscriptionMutation, subscriptionMutationHandler],
+ ]);
wrapper = shallowMount(SidebarSubscriptionWidget, {
apolloProvider: fakeApollo,
provide: {
canUpdate: true,
+ glFeatures: {
+ movedMrSidebar,
+ },
},
propsData: {
fullPath: 'group/project',
iid: '1',
- issuableType: 'issue',
+ issuableType,
},
stubs: {
SidebarEditableItem,
@@ -128,4 +146,21 @@ describe('Sidebar Subscriptions Widget', () => {
expect(createFlash).toHaveBeenCalled();
});
+
+ describe('merge request', () => {
+ it('displays toast when mutation is successful', async () => {
+ createComponent({
+ issuableType: 'merge_request',
+ movedMrSidebar: true,
+ subscriptionsQueryHandler: jest.fn().mockResolvedValue(issueSubscriptionsResponse(true)),
+ });
+ await waitForPromises();
+
+ await wrapper.find('.dropdown-item').trigger('click');
+
+ await waitForPromises();
+
+ expect(toast).toHaveBeenCalledWith('Notifications turned on.');
+ });
+ });
});
diff --git a/spec/frontend/sidebar/lock/issuable_lock_form_spec.js b/spec/frontend/sidebar/lock/issuable_lock_form_spec.js
index 8478d3d674d..bb757fdf63b 100644
--- a/spec/frontend/sidebar/lock/issuable_lock_form_spec.js
+++ b/spec/frontend/sidebar/lock/issuable_lock_form_spec.js
@@ -1,17 +1,23 @@
import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
+import Vue, { nextTick } from 'vue';
+import Vuex from 'vuex';
import { mockTracking, triggerEvent } from 'helpers/tracking_helper';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import { createStore as createMrStore } from '~/mr_notes/stores';
import createStore from '~/notes/stores';
import EditForm from '~/sidebar/components/lock/edit_form.vue';
import IssuableLockForm from '~/sidebar/components/lock/issuable_lock_form.vue';
+import toast from '~/vue_shared/plugins/global_toast';
import { ISSUABLE_TYPE_ISSUE, ISSUABLE_TYPE_MR } from './constants';
+jest.mock('~/vue_shared/plugins/global_toast');
+
+Vue.use(Vuex);
+
describe('IssuableLockForm', () => {
let wrapper;
let store;
let issuableType; // Either ISSUABLE_TYPE_ISSUE or ISSUABLE_TYPE_MR
+ let updateLockedAttribute;
const setIssuableType = (pageType) => {
issuableType = pageType;
@@ -29,16 +35,27 @@ describe('IssuableLockForm', () => {
store = createStore();
store.getters.getNoteableData.targetType = 'issue';
} else {
- store = createMrStore();
+ updateLockedAttribute = jest.fn().mockResolvedValue();
+ store = new Vuex.Store({
+ getters: {
+ getNoteableData: () => ({ targetType: issuableType }),
+ },
+ actions: {
+ updateLockedAttribute,
+ },
+ });
}
store.getters.getNoteableData.discussion_locked = isLocked;
};
- const createComponent = ({ props = {} }) => {
+ const createComponent = ({ props = {} }, movedMrSidebar = false) => {
wrapper = shallowMount(IssuableLockForm, {
store,
provide: {
fullPath: '',
+ glFeatures: {
+ movedMrSidebar,
+ },
},
propsData: {
isEditable: true,
@@ -144,4 +161,24 @@ describe('IssuableLockForm', () => {
});
});
});
+
+ describe('merge requests', () => {
+ beforeEach(() => {
+ setIssuableType('merge_request');
+ });
+
+ it.each`
+ locked | message
+ ${true} | ${'Merge request locked.'}
+ ${false} | ${'Merge request unlocked.'}
+ `('displays $message when merge request is $locked', async ({ locked, message }) => {
+ initStore(locked);
+
+ createComponent({}, true);
+
+ await wrapper.find('.dropdown-item').trigger('click');
+
+ expect(toast).toHaveBeenCalledWith(message);
+ });
+ });
});
diff --git a/spec/frontend/sidebar/mock_data.js b/spec/frontend/sidebar/mock_data.js
index 2b421037339..229757ff40c 100644
--- a/spec/frontend/sidebar/mock_data.js
+++ b/spec/frontend/sidebar/mock_data.js
@@ -321,6 +321,19 @@ export const issueSubscriptionsResponse = (subscribed = false, emailsDisabled =
},
});
+export const mergeRequestSubscriptionMutationResponse = {
+ data: {
+ updateIssuableSubscription: {
+ issuable: {
+ __typename: 'MergeRequest',
+ id: 'gid://gitlab/MergeRequest/4',
+ subscribed: true,
+ },
+ errors: [],
+ },
+ },
+};
+
export const issuableQueryResponse = {
data: {
workspace: {
diff --git a/spec/frontend/snippets/components/edit_spec.js b/spec/frontend/snippets/components/edit_spec.js
index 8a767765149..f49ceb2fede 100644
--- a/spec/frontend/snippets/components/edit_spec.js
+++ b/spec/frontend/snippets/components/edit_spec.js
@@ -5,6 +5,7 @@ import { merge } from 'lodash';
import VueApollo, { ApolloMutation } from 'vue-apollo';
import { useFakeDate } from 'helpers/fake_date';
import createMockApollo from 'helpers/mock_apollo_helper';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import waitForPromises from 'helpers/wait_for_promises';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import GetSnippetQuery from 'shared_queries/snippet/snippet.query.graphql';
@@ -96,6 +97,8 @@ describe('Snippet Edit app', () => {
const originalRelativeUrlRoot = gon.relative_url_root;
beforeEach(() => {
+ stubPerformanceWebAPI();
+
getSpy = jest.fn().mockResolvedValue(createQueryResponse());
// See `mutateSpy` declaration comment for why we send a key
diff --git a/spec/frontend/snippets/components/show_spec.js b/spec/frontend/snippets/components/show_spec.js
index c73bf8f80a2..b29ed97099f 100644
--- a/spec/frontend/snippets/components/show_spec.js
+++ b/spec/frontend/snippets/components/show_spec.js
@@ -12,6 +12,7 @@ import {
SNIPPET_VISIBILITY_PUBLIC,
} from '~/snippets/constants';
import CloneDropdownButton from '~/vue_shared/components/clone_dropdown.vue';
+import { stubPerformanceWebAPI } from 'helpers/performance';
describe('Snippet view app', () => {
let wrapper;
@@ -45,6 +46,10 @@ describe('Snippet view app', () => {
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findEmbedDropdown = () => wrapper.findComponent(EmbedDropdown);
+ beforeEach(() => {
+ stubPerformanceWebAPI();
+ });
+
afterEach(() => {
wrapper.destroy();
});
diff --git a/spec/frontend/surveys/merge_request_performance/app_spec.js b/spec/frontend/surveys/merge_request_performance/app_spec.js
new file mode 100644
index 00000000000..6e8cc660b1d
--- /dev/null
+++ b/spec/frontend/surveys/merge_request_performance/app_spec.js
@@ -0,0 +1,143 @@
+import { nextTick } from 'vue';
+import { GlButton, GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking } from 'helpers/tracking_helper';
+import { makeMockUserCalloutDismisser } from 'helpers/mock_user_callout_dismisser';
+import MergeRequestExperienceSurveyApp from '~/surveys/merge_request_experience/app.vue';
+import SatisfactionRate from '~/surveys/components/satisfaction_rate.vue';
+
+describe('MergeRequestExperienceSurveyApp', () => {
+ let trackingSpy;
+ let wrapper;
+ let dismiss;
+ let dismisserComponent;
+
+ const findCloseButton = () =>
+ wrapper
+ .findAllComponents(GlButton)
+ .filter((button) => button.attributes('aria-label') === 'Close')
+ .at(0);
+
+ const createWrapper = ({ shouldShowCallout = true } = {}) => {
+ dismiss = jest.fn();
+ dismisserComponent = makeMockUserCalloutDismisser({
+ dismiss,
+ shouldShowCallout,
+ });
+ wrapper = shallowMountExtended(MergeRequestExperienceSurveyApp, {
+ stubs: {
+ UserCalloutDismisser: dismisserComponent,
+ GlSprintf,
+ },
+ });
+ };
+
+ describe('when user callout is visible', () => {
+ beforeEach(() => {
+ createWrapper();
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ it('shows survey', async () => {
+ expect(wrapper.html()).toContain('Overall, how satisfied are you with merge requests?');
+ expect(wrapper.findComponent(SatisfactionRate).exists()).toBe(true);
+ expect(wrapper.emitted().close).toBe(undefined);
+ });
+
+ it('triggers user callout on close', async () => {
+ findCloseButton().vm.$emit('click');
+ expect(dismiss).toHaveBeenCalledTimes(1);
+ });
+
+ it('emits close event on close button click', async () => {
+ findCloseButton().vm.$emit('click');
+ expect(wrapper.emitted()).toMatchObject({ close: [[]] });
+ });
+
+ it('applies correct feature name for user callout', () => {
+ expect(wrapper.findComponent(dismisserComponent).props('featureName')).toBe(
+ 'mr_experience_survey',
+ );
+ });
+
+ it('dismisses user callout on survey rate', async () => {
+ const rate = wrapper.findComponent(SatisfactionRate);
+ expect(dismiss).not.toHaveBeenCalled();
+ rate.vm.$emit('rate', 5);
+ expect(dismiss).toHaveBeenCalledTimes(1);
+ });
+
+ it('steps through survey steps', async () => {
+ const rate = wrapper.findComponent(SatisfactionRate);
+ rate.vm.$emit('rate', 5);
+ await nextTick();
+ expect(wrapper.text()).toContain(
+ 'How satisfied are you with speed/performance of merge requests?',
+ );
+ });
+
+ it('tracks survey rates', async () => {
+ const rate = wrapper.findComponent(SatisfactionRate);
+ rate.vm.$emit('rate', 5);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'survey:mr_experience', {
+ value: 5,
+ label: 'overall',
+ });
+ rate.vm.$emit('rate', 4);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'survey:mr_experience', {
+ value: 4,
+ label: 'performance',
+ });
+ });
+
+ it('shows legal note', async () => {
+ expect(wrapper.text()).toContain(
+ 'By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the GitLab Privacy Policy.',
+ );
+ });
+
+ it('hides legal note after first step', async () => {
+ const rate = wrapper.findComponent(SatisfactionRate);
+ rate.vm.$emit('rate', 5);
+ await nextTick();
+ expect(wrapper.text()).not.toContain(
+ 'By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the GitLab Privacy Policy.',
+ );
+ });
+
+ it('shows disappearing thanks message', async () => {
+ const rate = wrapper.findComponent(SatisfactionRate);
+ rate.vm.$emit('rate', 5);
+ await nextTick();
+ rate.vm.$emit('rate', 5);
+ await nextTick();
+ expect(wrapper.text()).toContain('Thank you for your feedback!');
+ expect(wrapper.emitted()).toMatchObject({});
+ jest.runOnlyPendingTimers();
+ expect(wrapper.emitted()).toMatchObject({ close: [[]] });
+ });
+ });
+
+ describe('when user callout is hidden', () => {
+ beforeEach(() => {
+ createWrapper({ shouldShowCallout: false });
+ });
+
+ it('emits close event', async () => {
+ expect(wrapper.emitted()).toMatchObject({ close: [[]] });
+ });
+ });
+
+ describe('when Escape key is pressed', () => {
+ beforeEach(() => {
+ createWrapper();
+ const event = new KeyboardEvent('keyup', { key: 'Escape' });
+ document.dispatchEvent(event);
+ });
+
+ it('emits close event', async () => {
+ expect(wrapper.emitted()).toMatchObject({ close: [[]] });
+ expect(dismiss).toHaveBeenCalledTimes(1);
+ });
+ });
+});
diff --git a/spec/frontend/tabs/index_spec.js b/spec/frontend/tabs/index_spec.js
index 67e3d707adb..1d61d38a488 100644
--- a/spec/frontend/tabs/index_spec.js
+++ b/spec/frontend/tabs/index_spec.js
@@ -1,9 +1,16 @@
-import { GlTabsBehavior, TAB_SHOWN_EVENT } from '~/tabs';
+import { GlTabsBehavior, TAB_SHOWN_EVENT, HISTORY_TYPE_HASH } from '~/tabs';
import { ACTIVE_PANEL_CLASS, ACTIVE_TAB_CLASSES } from '~/tabs/constants';
+import { getLocationHash } from '~/lib/utils/url_utility';
+import { NO_SCROLL_TO_HASH_CLASS } from '~/lib/utils/common_utils';
import { getFixture, setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import setWindowLocation from 'helpers/set_window_location_helper';
const tabsFixture = getFixture('tabs/tabs.html');
+global.CSS = {
+ escape: (val) => val,
+};
+
describe('GlTabsBehavior', () => {
let glTabs;
let tabShownEventSpy;
@@ -41,6 +48,7 @@ describe('GlTabsBehavior', () => {
});
expect(panel.classList.contains(ACTIVE_PANEL_CLASS)).toBe(true);
+ expect(panel.classList.contains(NO_SCROLL_TO_HASH_CLASS)).toBe(true);
};
const expectInactiveTabAndPanel = (name) => {
@@ -67,6 +75,7 @@ describe('GlTabsBehavior', () => {
});
expect(panel.classList.contains(ACTIVE_PANEL_CLASS)).toBe(false);
+ expect(panel.classList.contains(NO_SCROLL_TO_HASH_CLASS)).toBe(true);
};
const expectGlTabShownEvent = (name) => {
@@ -263,4 +272,98 @@ describe('GlTabsBehavior', () => {
expectInactiveTabAndPanel('foo');
});
});
+
+ describe('using history=hash', () => {
+ const defaultTab = 'foo';
+ let tab;
+ let tabsEl;
+
+ beforeEach(() => {
+ setHTMLFixture(tabsFixture);
+ tabsEl = findByTestId('tabs');
+ });
+
+ afterEach(() => {
+ glTabs.destroy();
+ resetHTMLFixture();
+ });
+
+ describe('when a hash exists onInit', () => {
+ beforeEach(() => {
+ tab = 'bar';
+ setWindowLocation(`http://foo.com/index#${tab}`);
+ glTabs = new GlTabsBehavior(tabsEl, { history: HISTORY_TYPE_HASH });
+ });
+
+ it('sets the active tab to the hash and preserves hash', () => {
+ expectActiveTabAndPanel(tab);
+ expect(getLocationHash()).toBe(tab);
+ });
+ });
+
+ describe('when a hash does not exist onInit', () => {
+ beforeEach(() => {
+ setWindowLocation(`http://foo.com/index`);
+ glTabs = new GlTabsBehavior(tabsEl, { history: HISTORY_TYPE_HASH });
+ });
+
+ it('sets the active tab to the first tab and sets hash', () => {
+ expectActiveTabAndPanel(defaultTab);
+ expect(getLocationHash()).toBe(defaultTab);
+ });
+ });
+
+ describe('clicking on an inactive tab', () => {
+ beforeEach(() => {
+ tab = 'qux';
+ setWindowLocation(`http://foo.com/index`);
+ glTabs = new GlTabsBehavior(tabsEl, { history: HISTORY_TYPE_HASH });
+
+ findTab(tab).click();
+ });
+
+ it('changes the tabs and updates the hash', () => {
+ expectInactiveTabAndPanel(defaultTab);
+ expectActiveTabAndPanel(tab);
+ expect(getLocationHash()).toBe(tab);
+ });
+ });
+
+ describe('keyboard navigation', () => {
+ const secondTab = 'bar';
+
+ beforeEach(() => {
+ setWindowLocation(`http://foo.com/index`);
+ glTabs = new GlTabsBehavior(tabsEl, { history: HISTORY_TYPE_HASH });
+ });
+
+ it.each(['ArrowRight', 'ArrowDown'])(
+ 'pressing %s moves to next tab and updates hash',
+ (code) => {
+ expectActiveTabAndPanel(defaultTab);
+
+ triggerKeyDown(code, glTabs.activeTab);
+
+ expectInactiveTabAndPanel(defaultTab);
+ expectActiveTabAndPanel(secondTab);
+ expect(getLocationHash()).toBe(secondTab);
+ },
+ );
+
+ it.each(['ArrowLeft', 'ArrowUp'])(
+ 'pressing %s moves to previous tab and updates hash',
+ (code) => {
+ // First, make the 2nd tab active
+ findTab(secondTab).click();
+ expectActiveTabAndPanel(secondTab);
+
+ triggerKeyDown(code, glTabs.activeTab);
+
+ expectInactiveTabAndPanel(secondTab);
+ expectActiveTabAndPanel(defaultTab);
+ expect(getLocationHash()).toBe(defaultTab);
+ },
+ );
+ });
+ });
});
diff --git a/spec/frontend/test_setup.js b/spec/frontend/test_setup.js
index 6c336152e9a..b4626625f31 100644
--- a/spec/frontend/test_setup.js
+++ b/spec/frontend/test_setup.js
@@ -2,8 +2,6 @@
import 'helpers/shared_test_setup';
import { initializeTestTimeout } from 'helpers/timeout';
-jest.mock('~/lib/utils/axios_utils', () => jest.requireActual('helpers/mocks/axios_utils'));
-
initializeTestTimeout(process.env.CI ? 6000 : 500);
afterEach(() =>
diff --git a/spec/frontend/tracking/tracking_spec.js b/spec/frontend/tracking/tracking_spec.js
index 08da3a9a465..4871644d99f 100644
--- a/spec/frontend/tracking/tracking_spec.js
+++ b/spec/frontend/tracking/tracking_spec.js
@@ -412,7 +412,7 @@ describe('Tracking', () => {
Tracking.setAnonymousUrls();
expect(snowplowSpy).not.toHaveBeenCalledWith('setReferrerUrl', testUrl);
- expect(localStorage.getItem(URLS_CACHE_STORAGE_KEY)).not.toContain(oldTimestamp);
+ expect(localStorage.getItem(URLS_CACHE_STORAGE_KEY)).not.toContain(oldTimestamp.toString());
});
});
});
diff --git a/spec/frontend/user_lists/store/edit/mutations_spec.js b/spec/frontend/user_lists/store/edit/mutations_spec.js
index 7971906429b..e07d9c0a1b5 100644
--- a/spec/frontend/user_lists/store/edit/mutations_spec.js
+++ b/spec/frontend/user_lists/store/edit/mutations_spec.js
@@ -35,7 +35,7 @@ describe('User List Edit Mutations', () => {
});
});
- describe(types.RECIEVE_USER_LIST_ERROR, () => {
+ describe(types.RECEIVE_USER_LIST_ERROR, () => {
beforeEach(() => {
mutations[types.RECEIVE_USER_LIST_ERROR](state, ['network error']);
});
@@ -44,7 +44,7 @@ describe('User List Edit Mutations', () => {
expect(state.status).toBe(statuses.ERROR);
});
- it('sets the error message to the recieved one', () => {
+ it('sets the error message to the received one', () => {
expect(state.errorMessage).toEqual(['network error']);
});
});
diff --git a/spec/frontend/user_lists/store/new/mutations_spec.js b/spec/frontend/user_lists/store/new/mutations_spec.js
index a928849e941..647ddd9c062 100644
--- a/spec/frontend/user_lists/store/new/mutations_spec.js
+++ b/spec/frontend/user_lists/store/new/mutations_spec.js
@@ -9,7 +9,7 @@ describe('User List Edit Mutations', () => {
state = createState({ projectId: '1' });
});
- describe(types.RECIEVE_USER_LIST_ERROR, () => {
+ describe(types.RECEIVE_USER_LIST_ERROR, () => {
beforeEach(() => {
mutations[types.RECEIVE_CREATE_USER_LIST_ERROR](state, ['network error']);
});
diff --git a/spec/frontend/user_popovers_spec.js b/spec/frontend/user_popovers_spec.js
index 1544fed5240..b171c8fc9ed 100644
--- a/spec/frontend/user_popovers_spec.js
+++ b/spec/frontend/user_popovers_spec.js
@@ -12,12 +12,8 @@ jest.mock('~/api/user_api', () => ({
describe('User Popovers', () => {
const fixtureTemplate = 'merge_requests/merge_request_with_mentions.html';
- const selector = '.js-user-link, .gfm-project_member';
- const findFixtureLinks = () => {
- return Array.from(document.querySelectorAll(selector)).filter(
- ({ dataset }) => dataset.user || dataset.userId,
- );
- };
+ const selector = '.js-user-link[data-user], .js-user-link[data-user-id]';
+ const findFixtureLinks = () => Array.from(document.querySelectorAll(selector));
const createUserLink = () => {
const link = document.createElement('a');
@@ -95,6 +91,24 @@ describe('User Popovers', () => {
});
});
+ it('does not initialize the popovers for group references', async () => {
+ const [groupLink] = Array.from(document.querySelectorAll('.js-user-link[data-group]'));
+
+ triggerEvent('mouseover', groupLink);
+ jest.runOnlyPendingTimers();
+
+ expect(findPopovers().length).toBe(0);
+ });
+
+ it('does not initialize the popovers for @all references', async () => {
+ const [projectLink] = Array.from(document.querySelectorAll('.js-user-link[data-project]'));
+
+ triggerEvent('mouseover', projectLink);
+ jest.runOnlyPendingTimers();
+
+ expect(findPopovers().length).toBe(0);
+ });
+
it('does not initialize the user popovers twice for the same element', async () => {
const [firstUserLink] = findFixtureLinks();
triggerEvent('mouseover', firstUserLink);
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 6386746aee4..6db82cedd80 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
@@ -2,6 +2,9 @@ import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import WidgetRebase from '~/vue_merge_request_widget/components/states/mr_widget_rebase.vue';
import eventHub from '~/vue_merge_request_widget/event_hub';
+import toast from '~/vue_shared/plugins/global_toast';
+
+jest.mock('~/vue_shared/plugins/global_toast');
let wrapper;
@@ -261,6 +264,7 @@ describe('Merge request widget rebase component', () => {
return Promise.resolve({
data: {
rebase_in_progress: false,
+ should_be_rebased: false,
merge_error: null,
},
});
@@ -280,6 +284,7 @@ describe('Merge request widget rebase component', () => {
await nextTick();
expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetRebaseSuccess');
+ expect(toast).toHaveBeenCalledWith('Rebase completed');
});
});
});
diff --git a/spec/frontend/vue_mr_widget/deployment/deployment_action_button_spec.js b/spec/frontend/vue_mr_widget/deployment/deployment_action_button_spec.js
index 8c5036e35f6..7e7438bcc0f 100644
--- a/spec/frontend/vue_mr_widget/deployment/deployment_action_button_spec.js
+++ b/spec/frontend/vue_mr_widget/deployment/deployment_action_button_spec.js
@@ -60,7 +60,7 @@ describe('Deployment action button', () => {
it('renders slot and icon prop correctly', () => {
expect(wrapper.find(GlIcon).exists()).toBe(true);
- expect(wrapper.text()).toContain(actionButtonMocks[DEPLOYING]);
+ expect(wrapper.text()).toContain(actionButtonMocks[DEPLOYING].toString());
});
});
diff --git a/spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js b/spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js
index da4b990c078..5c1d3c8e8e8 100644
--- a/spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js
+++ b/spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js
@@ -1,4 +1,4 @@
-import { GlButton } from '@gitlab/ui';
+import { nextTick } from 'vue';
import MockAdapter from 'axios-mock-adapter';
import testReportExtension from '~/vue_merge_request_widget/extensions/test_report';
import { i18n } from '~/vue_merge_request_widget/extensions/test_report/constants';
@@ -38,7 +38,8 @@ describe('Test report extension', () => {
};
const findToggleCollapsedButton = () => wrapper.findByTestId('toggle-button');
- const findTertiaryButton = () => wrapper.find(GlButton);
+ const findFullReportLink = () => wrapper.findByTestId('full-report-link');
+ const findCopyFailedSpecsBtn = () => wrapper.findByTestId('copy-failed-specs-btn');
const findAllExtensionListItems = () => wrapper.findAllByTestId('extension-list-item');
const findModal = () => wrapper.find(TestCaseDetails);
@@ -72,14 +73,23 @@ describe('Test report extension', () => {
});
describe('summary', () => {
- it('displays loading text', () => {
+ it('displays loading state initially', () => {
mockApi(httpStatusCodes.OK);
createComponent();
expect(wrapper.text()).toContain(i18n.loading);
});
- it('displays failed loading text', async () => {
+ it('with a 204 response, continues to display loading state', async () => {
+ mockApi(httpStatusCodes.NO_CONTENT, '');
+ createComponent();
+
+ await waitForPromises();
+
+ expect(wrapper.text()).toContain(i18n.loading);
+ });
+
+ it('with an error response, displays failed to load text', async () => {
mockApi(httpStatusCodes.INTERNAL_SERVER_ERROR);
createComponent();
@@ -121,8 +131,57 @@ describe('Test report extension', () => {
await waitForPromises();
- expect(findTertiaryButton().text()).toBe('Full report');
- expect(findTertiaryButton().attributes('href')).toBe('pipeline/path/test_report');
+ expect(findFullReportLink().text()).toBe('Full report');
+ expect(findFullReportLink().attributes('href')).toBe('pipeline/path/test_report');
+ });
+
+ it('hides copy failed tests button when there are no failing tests', async () => {
+ mockApi(httpStatusCodes.OK);
+ createComponent();
+
+ await waitForPromises();
+
+ expect(findCopyFailedSpecsBtn().exists()).toBe(false);
+ });
+
+ it('displays copy failed tests button when there are failing tests', async () => {
+ mockApi(httpStatusCodes.OK, newFailedTestReports);
+ createComponent();
+
+ await waitForPromises();
+
+ expect(findCopyFailedSpecsBtn().exists()).toBe(true);
+ expect(findCopyFailedSpecsBtn().text()).toBe(i18n.copyFailedSpecs);
+ expect(findCopyFailedSpecsBtn().attributes('data-clipboard-text')).toBe(
+ 'spec/file_1.rb spec/file_2.rb',
+ );
+ });
+
+ it('copy failed tests button updates tooltip text when clicked', async () => {
+ mockApi(httpStatusCodes.OK, newFailedTestReports);
+ createComponent();
+
+ await waitForPromises();
+
+ // original tooltip shows up
+ expect(findCopyFailedSpecsBtn().attributes()).toMatchObject({
+ title: i18n.copyFailedSpecsTooltip,
+ });
+
+ await findCopyFailedSpecsBtn().trigger('click');
+
+ // tooltip text is replaced for 1 second
+ expect(findCopyFailedSpecsBtn().attributes()).toMatchObject({
+ title: 'Copied',
+ });
+
+ jest.runAllTimers();
+ await nextTick();
+
+ // tooltip reverts back to original string
+ expect(findCopyFailedSpecsBtn().attributes()).toMatchObject({
+ title: i18n.copyFailedSpecsTooltip,
+ });
});
it('shows an error when a suite has a parsing error', async () => {
diff --git a/spec/frontend/vue_mr_widget/extensions/test_report/utils_spec.js b/spec/frontend/vue_mr_widget/extensions/test_report/utils_spec.js
new file mode 100644
index 00000000000..69ea70549fe
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/extensions/test_report/utils_spec.js
@@ -0,0 +1,242 @@
+import * as utils from '~/vue_merge_request_widget/extensions/test_report/utils';
+
+describe('test report widget extension utils', () => {
+ describe('summaryTextbuilder', () => {
+ it('should render text for no changed results in multiple tests', () => {
+ const name = 'Test summary';
+ const data = { total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}no%{strong_end} changed test results, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+
+ it('should render text for no changed results in one test', () => {
+ const name = 'Test summary';
+ const data = { total: 1 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}no%{strong_end} changed test results, %{strong_start}1%{strong_end} total test',
+ );
+ });
+
+ it('should render text for multiple failed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 3, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}3%{strong_end} failed, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+
+ it('should render text for multiple errored results', () => {
+ const name = 'Test summary';
+ const data = { errored: 7, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}7%{strong_end} errors, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+
+ it('should render text for multiple fixed results', () => {
+ const name = 'Test summary';
+ const data = { resolved: 4, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}4%{strong_end} fixed test results, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+
+ it('should render text for multiple fixed, and multiple failed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 3, resolved: 4, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}3%{strong_end} failed and %{strong_start}4%{strong_end} fixed test results, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+
+ it('should render text for a singular fixed, and a singular failed result', () => {
+ const name = 'Test summary';
+ const data = { failed: 1, resolved: 1, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}1%{strong_end} failed and %{strong_start}1%{strong_end} fixed test result, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+
+ it('should render text for singular failed, errored, and fixed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 1, errored: 1, resolved: 1, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}1%{strong_end} failed, %{strong_start}1%{strong_end} error and %{strong_start}1%{strong_end} fixed test result, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+
+ it('should render text for multiple failed, errored, and fixed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 2, errored: 3, resolved: 4, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary: %{strong_start}2%{strong_end} failed, %{strong_start}3%{strong_end} errors and %{strong_start}4%{strong_end} fixed test results, %{strong_start}10%{strong_end} total tests',
+ );
+ });
+ });
+
+ describe('reportTextBuilder', () => {
+ const name = 'Rspec';
+
+ it('should render text for no changed results in multiple tests', () => {
+ const data = { name, summary: { total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: no changed test results, 10 total tests');
+ });
+
+ it('should render text for no changed results in one test', () => {
+ const data = { name, summary: { total: 1 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: no changed test results, 1 total test');
+ });
+
+ it('should render text for multiple failed results', () => {
+ const data = { name, summary: { failed: 3, total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: 3 failed, 10 total tests');
+ });
+
+ it('should render text for multiple errored results', () => {
+ const data = { name, summary: { errored: 7, total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: 7 errors, 10 total tests');
+ });
+
+ it('should render text for multiple fixed results', () => {
+ const data = { name, summary: { resolved: 4, total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: 4 fixed test results, 10 total tests');
+ });
+
+ it('should render text for multiple fixed, and multiple failed results', () => {
+ const data = { name, summary: { failed: 3, resolved: 4, total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: 3 failed and 4 fixed test results, 10 total tests');
+ });
+
+ it('should render text for a singular fixed, and a singular failed result', () => {
+ const data = { name, summary: { failed: 1, resolved: 1, total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: 1 failed and 1 fixed test result, 10 total tests');
+ });
+
+ it('should render text for singular failed, errored, and fixed results', () => {
+ const data = { name, summary: { failed: 1, errored: 1, resolved: 1, total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: 1 failed, 1 error and 1 fixed test result, 10 total tests');
+ });
+
+ it('should render text for multiple failed, errored, and fixed results', () => {
+ const data = { name, summary: { failed: 2, errored: 3, resolved: 4, total: 10 } };
+ const result = utils.reportTextBuilder(data);
+
+ expect(result).toBe('Rspec: 2 failed, 3 errors and 4 fixed test results, 10 total tests');
+ });
+ });
+
+ describe('recentFailuresTextBuilder', () => {
+ it.each`
+ recentlyFailed | failed | expected
+ ${0} | ${1} | ${''}
+ ${1} | ${1} | ${'1 out of 1 failed test has failed more than once in the last 14 days'}
+ ${1} | ${2} | ${'1 out of 2 failed tests has failed more than once in the last 14 days'}
+ ${2} | ${3} | ${'2 out of 3 failed tests have failed more than once in the last 14 days'}
+ `(
+ 'should render summary for $recentlyFailed out of $failed failures',
+ ({ recentlyFailed, failed, expected }) => {
+ const result = utils.recentFailuresTextBuilder({ recentlyFailed, failed });
+
+ expect(result).toBe(expected);
+ },
+ );
+ });
+
+ describe('countRecentlyFailedTests', () => {
+ it('counts tests with more than one recent failure in a report', () => {
+ const report = {
+ new_failures: [{ recent_failures: { count: 2 } }],
+ existing_failures: [{ recent_failures: { count: 1 } }],
+ resolved_failures: [{ recent_failures: { count: 20 } }, { recent_failures: { count: 5 } }],
+ };
+ const result = utils.countRecentlyFailedTests(report);
+
+ expect(result).toBe(3);
+ });
+
+ it('counts tests with more than one recent failure in an array of reports', () => {
+ const reports = [
+ {
+ new_failures: [{ recent_failures: { count: 2 } }],
+ existing_failures: [
+ { recent_failures: { count: 20 } },
+ { recent_failures: { count: 5 } },
+ ],
+ resolved_failures: [{ recent_failures: { count: 2 } }],
+ },
+ {
+ new_failures: [{ recent_failures: { count: 8 } }, { recent_failures: { count: 14 } }],
+ existing_failures: [{ recent_failures: { count: 1 } }],
+ resolved_failures: [{ recent_failures: { count: 7 } }, { recent_failures: { count: 5 } }],
+ },
+ ];
+ const result = utils.countRecentlyFailedTests(reports);
+
+ expect(result).toBe(8);
+ });
+
+ it.each([
+ [],
+ {},
+ null,
+ undefined,
+ { new_failures: undefined },
+ [{ existing_failures: null }],
+ { resolved_failures: [{}] },
+ [{ new_failures: [{ recent_failures: {} }] }],
+ ])('returns 0 when subject is %s', (subject) => {
+ const result = utils.countRecentlyFailedTests(subject);
+
+ expect(result).toBe(0);
+ });
+ });
+
+ describe('formatFilePath', () => {
+ it.each`
+ file | expected
+ ${'./test.js'} | ${'test.js'}
+ ${'/test.js'} | ${'test.js'}
+ ${'.//////////////test.js'} | ${'test.js'}
+ ${'test.js'} | ${'test.js'}
+ ${'mock/path./test.js'} | ${'mock/path./test.js'}
+ ${'./mock/path./test.js'} | ${'mock/path./test.js'}
+ `('should format $file to be $expected', ({ file, expected }) => {
+ expect(utils.formatFilePath(file)).toBe(expected);
+ });
+ });
+});
diff --git a/spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js b/spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js
index 6d1b3bb34a5..a06ad930abe 100644
--- a/spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js
+++ b/spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js
@@ -62,7 +62,7 @@ describe('Accessibility extension', () => {
expect(wrapper.text()).toBe('Accessibility scanning failed loading results');
});
- it('displays detected errors', async () => {
+ it('displays detected errors and is expandable', async () => {
mockApi(httpStatusCodes.OK, accessibilityReportResponseErrors);
createComponent();
@@ -72,9 +72,10 @@ describe('Accessibility extension', () => {
expect(wrapper.text()).toBe(
'Accessibility scanning detected 8 issues for the source branch only',
);
+ expect(findToggleCollapsedButton().exists()).toBe(true);
});
- it('displays no detected errors', async () => {
+ it('displays no detected errors and is not expandable', async () => {
mockApi(httpStatusCodes.OK, accessibilityReportResponseSuccess);
createComponent();
@@ -84,6 +85,7 @@ describe('Accessibility extension', () => {
expect(wrapper.text()).toBe(
'Accessibility scanning detected no issues for the source branch only',
);
+ expect(findToggleCollapsedButton().exists()).toBe(false);
});
});
diff --git a/spec/frontend/vue_mr_widget/extentions/terraform/index_spec.js b/spec/frontend/vue_mr_widget/extentions/terraform/index_spec.js
index 77b3576a3d3..d9faa7b2d25 100644
--- a/spec/frontend/vue_mr_widget/extentions/terraform/index_spec.js
+++ b/spec/frontend/vue_mr_widget/extentions/terraform/index_spec.js
@@ -142,11 +142,11 @@ describe('Terraform extension', () => {
expect(api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_terraform_click_full_report',
+ 'i_code_review_merge_request_widget_terraform_click_full_report',
);
expect(api.trackRedisCounterEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisCounterEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_terraform_count_click_full_report',
+ 'i_code_review_merge_request_widget_terraform_count_click_full_report',
);
});
});
diff --git a/spec/frontend/vue_mr_widget/mr_widget_options_spec.js b/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
index 6abbb052aef..b3af5eba364 100644
--- a/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
+++ b/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
@@ -32,6 +32,7 @@ import {
fullReportExtension,
noTelemetryExtension,
pollingExtension,
+ pollingFullDataExtension,
pollingErrorExtension,
multiPollingExtension,
} from './test_extensions';
@@ -42,6 +43,13 @@ jest.mock('~/smart_interval');
jest.mock('~/lib/utils/favicon');
+jest.mock('@sentry/browser', () => ({
+ setExtra: jest.fn(),
+ setExtras: jest.fn(),
+ captureMessage: jest.fn(),
+ captureException: jest.fn(),
+}));
+
Vue.use(VueApollo);
describe('MrWidgetOptions', () => {
@@ -66,24 +74,16 @@ describe('MrWidgetOptions', () => {
afterEach(() => {
mock.restore();
wrapper.destroy();
- wrapper = null;
gl.mrWidgetData = {};
gon.features = {};
});
- const createComponent = (mrData = mockData, options = {}, glFeatures = {}) => {
- if (wrapper) {
- wrapper.destroy();
- }
-
+ const createComponent = (mrData = mockData, options = {}) => {
wrapper = mount(MrWidgetOptions, {
propsData: {
mrData: { ...mrData },
},
- provide: {
- glFeatures,
- },
...options,
});
@@ -521,7 +521,7 @@ describe('MrWidgetOptions', () => {
describe('rendering relatedLinks', () => {
beforeEach(() => {
- createComponent({
+ return createComponent({
...mockData,
issues_links: {
closing: `
@@ -531,8 +531,10 @@ describe('MrWidgetOptions', () => {
`,
},
});
+ });
- return nextTick();
+ afterEach(() => {
+ wrapper.destroy();
});
it('renders if there are relatedLinks', () => {
@@ -875,8 +877,8 @@ describe('MrWidgetOptions', () => {
});
describe('given feature flag is enabled', () => {
- beforeEach(() => {
- createComponent();
+ beforeEach(async () => {
+ await createComponent();
wrapper.vm.mr.hasCI = false;
});
@@ -905,6 +907,19 @@ describe('MrWidgetOptions', () => {
});
});
+ describe('merge error', () => {
+ it.each`
+ state | show | showText
+ ${'closed'} | ${false} | ${'hides'}
+ ${'merged'} | ${true} | ${'shows'}
+ ${'open'} | ${true} | ${'shows'}
+ `('it $showText merge error when state is $state', ({ state, show }) => {
+ createComponent({ ...mockData, state, merge_error: 'Error!' });
+
+ expect(wrapper.find('[data-testid="merge_error"]').exists()).toBe(show);
+ });
+ });
+
describe('mock extension', () => {
let pollRequest;
@@ -917,8 +932,6 @@ describe('MrWidgetOptions', () => {
});
afterEach(() => {
- pollRequest.mockRestore();
-
registeredExtensions.extensions = [];
});
@@ -970,16 +983,14 @@ describe('MrWidgetOptions', () => {
describe('expansion', () => {
it('hides collapse button', async () => {
registerExtension(workingExtension(false));
- createComponent();
- await waitForPromises();
+ await createComponent();
expect(findExtensionToggleButton().exists()).toBe(false);
});
it('shows collapse button', async () => {
registerExtension(workingExtension(true));
- createComponent();
- await waitForPromises();
+ await createComponent();
expect(findExtensionToggleButton().exists()).toBe(true);
});
@@ -997,17 +1008,7 @@ describe('MrWidgetOptions', () => {
});
afterEach(() => {
- pollRequest.mockRestore();
-
registeredExtensions.extensions = [];
-
- // Clear all left-over timeouts that may be registered in the poll class
- let id = window.setTimeout(() => {}, 0);
-
- while (id > 0) {
- window.clearTimeout(id);
- id -= 1;
- }
});
describe('success - multi polling', () => {
@@ -1058,87 +1059,81 @@ describe('MrWidgetOptions', () => {
describe('success', () => {
it('does not make additional requests after poll is successful', async () => {
registerExtension(pollingExtension);
+
await createComponent();
- // called two times due to parent component polling (mount) and extension polling
- expect(pollRequest).toHaveBeenCalledTimes(2);
+
+ expect(pollRequest).toHaveBeenCalledTimes(6);
});
+ });
+
+ describe('success - full data polling', () => {
+ it('sets data when polling is complete', async () => {
+ registerExtension(pollingFullDataExtension);
- it('keeps polling when poll-interval header is provided', async () => {
- registerExtension({
- ...pollingExtension,
- methods: {
- ...pollingExtension.methods,
- fetchCollapsedData() {
- return Promise.resolve({
- data: {},
- headers: { 'poll-interval': 1 },
- status: 204,
- });
- },
- },
- });
await createComponent();
- expect(findWidgetTestExtension().html()).toContain('Test extension loading...');
+
+ api.trackRedisHllUserEvent.mockClear();
+ api.trackRedisCounterEvent.mockClear();
+
+ findExtensionToggleButton().trigger('click');
+
+ // The default working extension is a "warning" type, which generates a second - more specific - telemetry event for expansions
+ expect(api.trackRedisHllUserEvent).toHaveBeenCalledTimes(2);
+ expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
+ 'i_code_review_merge_request_widget_test_extension_expand',
+ );
+ expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
+ 'i_code_review_merge_request_widget_test_extension_expand_warning',
+ );
+ expect(api.trackRedisCounterEvent).toHaveBeenCalledTimes(2);
+ expect(api.trackRedisCounterEvent).toHaveBeenCalledWith(
+ 'i_code_review_merge_request_widget_test_extension_count_expand',
+ );
+ expect(api.trackRedisCounterEvent).toHaveBeenCalledWith(
+ 'i_code_review_merge_request_widget_test_extension_count_expand_warning',
+ );
});
});
describe('error', () => {
- let captureException;
-
- beforeEach(() => {
- captureException = jest.spyOn(Sentry, 'captureException');
-
+ it('does not make additional requests after poll has failed', async () => {
registerExtension(pollingErrorExtension);
+ await createComponent();
- createComponent();
+ expect(pollRequest).toHaveBeenCalledTimes(6);
});
- it('does not make additional requests after poll has failed', () => {
- // called two times due to parent component polling (mount) and extension polling
- expect(pollRequest).toHaveBeenCalledTimes(2);
- });
+ it('captures sentry error and displays error when poll has failed', async () => {
+ registerExtension(pollingErrorExtension);
+ await createComponent();
- it('captures sentry error and displays error when poll has failed', () => {
- expect(captureException).toHaveBeenCalledTimes(1);
- expect(captureException).toHaveBeenCalledWith(new Error('Fetch error'));
+ expect(Sentry.captureException).toHaveBeenCalledTimes(5);
+ expect(Sentry.captureException).toHaveBeenCalledWith(new Error('Fetch error'));
expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('failed');
});
});
});
describe('mock extension errors', () => {
- let captureException;
-
- const itHandlesTheException = () => {
- expect(captureException).toHaveBeenCalledTimes(1);
- expect(captureException).toHaveBeenCalledWith(new Error('Fetch error'));
- expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('failed');
- };
-
- beforeEach(() => {
- captureException = jest.spyOn(Sentry, 'captureException');
- });
-
afterEach(() => {
registeredExtensions.extensions = [];
- captureException = null;
});
it('handles collapsed data fetch errors', async () => {
registerExtension(collapsedDataErrorExtension);
- createComponent();
- await waitForPromises();
+ await createComponent();
expect(
wrapper.find('[data-testid="widget-extension"] [data-testid="toggle-button"]').exists(),
).toBe(false);
- itHandlesTheException();
+ expect(Sentry.captureException).toHaveBeenCalledTimes(5);
+ expect(Sentry.captureException).toHaveBeenCalledWith(new Error('Fetch error'));
+ expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('failed');
});
it('handles full data fetch errors', async () => {
registerExtension(fullDataErrorExtension);
- createComponent();
- await waitForPromises();
+ await createComponent();
expect(wrapper.findComponent(StatusIcon).props('iconName')).not.toBe('error');
wrapper
@@ -1148,7 +1143,9 @@ describe('MrWidgetOptions', () => {
await nextTick();
await waitForPromises();
- itHandlesTheException();
+ expect(Sentry.captureException).toHaveBeenCalledTimes(1);
+ expect(Sentry.captureException).toHaveBeenCalledWith(new Error('Fetch error'));
+ expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('failed');
});
});
@@ -1163,11 +1160,11 @@ describe('MrWidgetOptions', () => {
expect(api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_view',
+ 'i_code_review_merge_request_widget_test_extension_view',
);
expect(api.trackRedisCounterEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisCounterEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_count_view',
+ 'i_code_review_merge_request_widget_test_extension_count_view',
);
});
@@ -1186,17 +1183,17 @@ describe('MrWidgetOptions', () => {
// The default working extension is a "warning" type, which generates a second - more specific - telemetry event for expansions
expect(api.trackRedisHllUserEvent).toHaveBeenCalledTimes(2);
expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_expand',
+ 'i_code_review_merge_request_widget_test_extension_expand',
);
expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_expand_warning',
+ 'i_code_review_merge_request_widget_test_extension_expand_warning',
);
expect(api.trackRedisCounterEvent).toHaveBeenCalledTimes(2);
expect(api.trackRedisCounterEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_count_expand',
+ 'i_code_review_merge_request_widget_test_extension_count_expand',
);
expect(api.trackRedisCounterEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_count_expand_warning',
+ 'i_code_review_merge_request_widget_test_extension_count_expand_warning',
);
});
@@ -1239,11 +1236,11 @@ describe('MrWidgetOptions', () => {
expect(api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_click_full_report',
+ 'i_code_review_merge_request_widget_test_extension_click_full_report',
);
expect(api.trackRedisCounterEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisCounterEvent).toHaveBeenCalledWith(
- 'i_merge_request_widget_test_extension_count_click_full_report',
+ 'i_code_review_merge_request_widget_test_extension_count_click_full_report',
);
});
diff --git a/spec/frontend/vue_mr_widget/test_extensions.js b/spec/frontend/vue_mr_widget/test_extensions.js
index 76644e0be77..1977f550577 100644
--- a/spec/frontend/vue_mr_widget/test_extensions.js
+++ b/spec/frontend/vue_mr_widget/test_extensions.js
@@ -109,6 +109,39 @@ export const pollingExtension = {
enablePolling: true,
};
+export const pollingFullDataExtension = {
+ ...workingExtension(),
+ enableExpandedPolling: true,
+ methods: {
+ fetchCollapsedData({ targetProjectFullPath }) {
+ return Promise.resolve({ targetProjectFullPath, count: 1 });
+ },
+ fetchFullData() {
+ return Promise.resolve([
+ {
+ headers: { 'poll-interval': 0 },
+ status: 200,
+ data: {
+ id: 1,
+ text: 'Hello world',
+ icon: {
+ name: EXTENSION_ICONS.failed,
+ },
+ badge: {
+ text: 'Closed',
+ },
+ link: {
+ href: 'https://gitlab.com',
+ text: 'GitLab.com',
+ },
+ actions: [{ text: 'Full report', href: 'https://gitlab.com', target: '_blank' }],
+ },
+ },
+ ]);
+ },
+ },
+};
+
export const fullReportExtension = {
...workingExtension(),
computed: {
diff --git a/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js b/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js
index 93b59800c27..441e21ee905 100644
--- a/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js
+++ b/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js
@@ -84,15 +84,15 @@ describe('LabelsSelectRoot', () => {
});
describe('if the variant is `sidebar`', () => {
- beforeEach(() => {
+ it('renders SidebarEditableItem component', () => {
createComponent();
- });
- it('renders SidebarEditableItem component', () => {
expect(findSidebarEditableItem().exists()).toBe(true);
});
it('renders correct props for the SidebarEditableItem component', () => {
+ createComponent();
+
expect(findSidebarEditableItem().props()).toMatchObject({
title: wrapper.vm.$options.i18n.widgetTitle,
canEdit: defaultProps.allowEdit,
@@ -135,7 +135,7 @@ describe('LabelsSelectRoot', () => {
it('handles DropdownContents setColor', () => {
findDropdownContents().vm.$emit('setColor', color);
- expect(wrapper.emitted('updateSelectedColor')).toEqual([[color]]);
+ expect(wrapper.emitted('updateSelectedColor')).toEqual([[{ color }]]);
});
});
@@ -157,20 +157,24 @@ describe('LabelsSelectRoot', () => {
createComponent({ propsData: { iid: undefined } });
findDropdownContents().vm.$emit('setColor', color);
- expect(wrapper.emitted('updateSelectedColor')).toEqual([[color]]);
+ expect(wrapper.emitted('updateSelectedColor')).toEqual([[{ color }]]);
});
describe('when updating color for epic', () => {
- beforeEach(() => {
+ const setup = () => {
createComponent();
findDropdownContents().vm.$emit('setColor', color);
- });
+ };
it('sets the loading state', () => {
+ setup();
+
expect(findSidebarEditableItem().props('loading')).toBe(true);
});
it('updates color correctly after successful mutation', async () => {
+ setup();
+
await waitForPromises();
expect(findDropdownValue().props('selectedColor').color).toEqual(
updateColorMutationResponse.data.updateIssuableColor.issuable.color,
diff --git a/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_contents_spec.js b/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_contents_spec.js
index 74f50b878e2..ee4d3a2630a 100644
--- a/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_contents_spec.js
+++ b/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_contents_spec.js
@@ -1,57 +1,30 @@
-import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { GlDropdown } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { DROPDOWN_VARIANT } from '~/vue_shared/components/color_select_dropdown/constants';
import DropdownContents from '~/vue_shared/components/color_select_dropdown/dropdown_contents.vue';
import DropdownContentsColorView from '~/vue_shared/components/color_select_dropdown/dropdown_contents_color_view.vue';
+import DropdownHeader from '~/vue_shared/components/color_select_dropdown/dropdown_header.vue';
import { color } from './mock_data';
-const showDropdown = jest.fn();
-const focusInput = jest.fn();
-
const defaultProps = {
dropdownTitle: '',
selectedColor: color,
- dropdownButtonText: '',
+ dropdownButtonText: 'Pick a color',
variant: '',
isVisible: false,
};
-const GlDropdownStub = {
- template: `
- <div>
- <slot name="header"></slot>
- <slot></slot>
- </div>
- `,
- methods: {
- show: showDropdown,
- hide: jest.fn(),
- },
-};
-
-const DropdownHeaderStub = {
- template: `
- <div>Hello, I am a header</div>
- `,
- methods: {
- focusInput,
- },
-};
-
describe('DropdownContent', () => {
let wrapper;
const createComponent = ({ propsData = {} } = {}) => {
- wrapper = shallowMount(DropdownContents, {
+ wrapper = mountExtended(DropdownContents, {
propsData: {
...defaultProps,
...propsData,
},
- stubs: {
- GlDropdown: GlDropdownStub,
- DropdownHeader: DropdownHeaderStub,
- },
});
};
@@ -60,16 +33,17 @@ describe('DropdownContent', () => {
});
const findColorView = () => wrapper.findComponent(DropdownContentsColorView);
- const findDropdownHeader = () => wrapper.findComponent(DropdownHeaderStub);
- const findDropdown = () => wrapper.findComponent(GlDropdownStub);
+ const findDropdownHeader = () => wrapper.findComponent(DropdownHeader);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
it('calls dropdown `show` method on `isVisible` prop change', async () => {
createComponent();
+ const spy = jest.spyOn(wrapper.vm.$refs.dropdown, 'show');
await wrapper.setProps({
isVisible: true,
});
- expect(showDropdown).toHaveBeenCalledTimes(1);
+ expect(spy).toHaveBeenCalledTimes(1);
});
it('does not emit `setColor` event on dropdown hide if color did not change', () => {
@@ -110,4 +84,12 @@ describe('DropdownContent', () => {
expect(findDropdownHeader().exists()).toBe(true);
});
+
+ it('handles no selected color', () => {
+ createComponent({ propsData: { selectedColor: {} } });
+
+ expect(wrapper.findByTestId('fallback-button-text').text()).toEqual(
+ defaultProps.dropdownButtonText,
+ );
+ });
});
diff --git a/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_value_spec.js b/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_value_spec.js
index f22592dd604..5bbdb136353 100644
--- a/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_value_spec.js
+++ b/spec/frontend/vue_shared/components/color_select_dropdown/dropdown_value_spec.js
@@ -33,7 +33,7 @@ describe('DropdownValue', () => {
it.each`
index | cssClass
- ${0} | ${['gl-font-base', 'gl-line-height-24']}
+ ${0} | ${[]}
${1} | ${['hide-collapsed']}
`(
'passes correct props to the ColorItem with CSS class `$cssClass`',
diff --git a/spec/frontend/vue_shared/components/deployment_instance/deployment_instance_spec.js b/spec/frontend/vue_shared/components/deployment_instance/deployment_instance_spec.js
index e3d8bfd22ca..79001b9282f 100644
--- a/spec/frontend/vue_shared/components/deployment_instance/deployment_instance_spec.js
+++ b/spec/frontend/vue_shared/components/deployment_instance/deployment_instance_spec.js
@@ -1,7 +1,6 @@
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import DeployBoardInstance from '~/vue_shared/components/deployment_instance.vue';
-import { folder } from './mock_data';
describe('Deploy Board Instance', () => {
let wrapper;
@@ -13,7 +12,6 @@ describe('Deploy Board Instance', () => {
...props,
},
provide: {
- glFeatures: { monitorLogging: true },
...provide,
},
});
@@ -25,7 +23,6 @@ describe('Deploy Board Instance', () => {
it('should render a div with the correct css status and tooltip data', () => {
wrapper = createComponent({
- logsPath: folder.logs_path,
tooltipText: 'This is a pod',
});
@@ -43,17 +40,6 @@ describe('Deploy Board Instance', () => {
expect(wrapper.classes('deployment-instance-deploying')).toBe(true);
expect(wrapper.attributes('title')).toEqual('');
});
-
- it('should have a log path computed with a pod name as a parameter', () => {
- wrapper = createComponent({
- logsPath: folder.logs_path,
- podName: 'tanuki-1',
- });
-
- expect(wrapper.vm.computedLogPath).toEqual(
- '/root/review-app/-/logs?environment_name=foo&pod_name=tanuki-1',
- );
- });
});
describe('as a canary deployment', () => {
@@ -76,46 +62,10 @@ describe('Deploy Board Instance', () => {
wrapper.destroy();
});
- it('should not be a link without a logsPath prop', async () => {
- wrapper = createComponent({
- stable: false,
- logsPath: '',
- });
-
- await nextTick();
- expect(wrapper.vm.computedLogPath).toBeNull();
- expect(wrapper.vm.isLink).toBeFalsy();
- });
-
- it('should render a link without href if path is not passed', () => {
- wrapper = createComponent();
-
- expect(wrapper.attributes('href')).toBeUndefined();
- });
-
it('should not have a tooltip', () => {
wrapper = createComponent();
expect(wrapper.attributes('title')).toEqual('');
});
});
-
- describe(':monitor_logging feature flag', () => {
- afterEach(() => {
- wrapper.destroy();
- });
-
- it.each`
- flagState | logsState | expected
- ${true} | ${'shows'} | ${'/root/review-app/-/logs?environment_name=foo&pod_name=tanuki-1'}
- ${false} | ${'hides'} | ${undefined}
- `('$logsState log link when flag state is $flagState', async ({ flagState, expected }) => {
- wrapper = createComponent(
- { logsPath: folder.logs_path, podName: 'tanuki-1' },
- { glFeatures: { monitorLogging: flagState } },
- );
-
- expect(wrapper.attributes('href')).toEqual(expected);
- });
- });
});
diff --git a/spec/frontend/vue_shared/components/deployment_instance/mock_data.js b/spec/frontend/vue_shared/components/deployment_instance/mock_data.js
index 6618c57948c..098787cd1b4 100644
--- a/spec/frontend/vue_shared/components/deployment_instance/mock_data.js
+++ b/spec/frontend/vue_shared/components/deployment_instance/mock_data.js
@@ -140,5 +140,4 @@ export const folder = {
created_at: '2017-02-01T19:42:18.400Z',
updated_at: '2017-02-01T19:42:18.400Z',
rollout_status: {},
- logs_path: '/root/review-app/-/logs?environment_name=foo',
};
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 d0fa8b8dacb..16f924b44d8 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
@@ -1,11 +1,9 @@
import { mount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-import { compileToFunctions } from 'vue-template-compiler';
-
+import { nextTick } from 'vue';
import { GREEN_BOX_IMAGE_URL, RED_BOX_IMAGE_URL } from 'spec/test_constants';
-import imageDiffViewer from '~/vue_shared/components/diff_viewer/viewers/image_diff_viewer.vue';
+import ImageDiffViewer from '~/vue_shared/components/diff_viewer/viewers/image_diff_viewer.vue';
-describe('ImageDiffViewer', () => {
+describe('ImageDiffViewer component', () => {
const requiredProps = {
diffMode: 'replaced',
newPath: GREEN_BOX_IMAGE_URL,
@@ -17,15 +15,12 @@ describe('ImageDiffViewer', () => {
newSize: 1024,
};
let wrapper;
- let vm;
- function createComponent(props) {
- const ImageDiffViewer = Vue.extend(imageDiffViewer);
- wrapper = mount(ImageDiffViewer, { propsData: props });
- vm = wrapper.vm;
- }
+ const createComponent = (props, slots) => {
+ wrapper = mount(ImageDiffViewer, { propsData: props, slots });
+ };
- const triggerEvent = (eventName, el = vm.$el, clientX = 0) => {
+ const triggerEvent = (eventName, el = wrapper.$el, clientX = 0) => {
const event = new MouseEvent(eventName, {
bubbles: true,
cancelable: true,
@@ -51,128 +46,76 @@ describe('ImageDiffViewer', () => {
wrapper.destroy();
});
- it('renders image diff for replaced', async () => {
- createComponent({ ...allProps });
-
- await nextTick();
- const metaInfoElements = vm.$el.querySelectorAll('.image-info');
-
- expect(vm.$el.querySelector('.added img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
-
- expect(vm.$el.querySelector('.deleted img').getAttribute('src')).toBe(RED_BOX_IMAGE_URL);
-
- expect(vm.$el.querySelector('.view-modes-menu li.active').textContent.trim()).toBe('2-up');
- expect(vm.$el.querySelector('.view-modes-menu li:nth-child(2)').textContent.trim()).toBe(
- 'Swipe',
- );
-
- expect(vm.$el.querySelector('.view-modes-menu li:nth-child(3)').textContent.trim()).toBe(
- 'Onion skin',
- );
-
- expect(metaInfoElements.length).toBe(2);
- expect(metaInfoElements[0]).toHaveText('2.00 KiB');
- expect(metaInfoElements[1]).toHaveText('1.00 KiB');
+ it('renders image diff for replaced', () => {
+ createComponent(allProps);
+ const metaInfoElements = wrapper.findAll('.image-info');
+
+ expect(wrapper.find('.added img').attributes('src')).toBe(GREEN_BOX_IMAGE_URL);
+ expect(wrapper.find('.deleted img').attributes('src')).toBe(RED_BOX_IMAGE_URL);
+ expect(wrapper.find('.view-modes-menu li.active').text()).toBe('2-up');
+ expect(wrapper.find('.view-modes-menu li:nth-child(2)').text()).toBe('Swipe');
+ expect(wrapper.find('.view-modes-menu li:nth-child(3)').text()).toBe('Onion skin');
+ expect(metaInfoElements).toHaveLength(2);
+ expect(metaInfoElements.at(0).text()).toBe('2.00 KiB');
+ expect(metaInfoElements.at(1).text()).toBe('1.00 KiB');
});
- it('renders image diff for new', async () => {
+ it('renders image diff for new', () => {
createComponent({ ...allProps, diffMode: 'new', oldPath: '' });
- await nextTick();
-
- const metaInfoElement = vm.$el.querySelector('.image-info');
-
- expect(vm.$el.querySelector('.added img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
- expect(metaInfoElement).toHaveText('1.00 KiB');
+ expect(wrapper.find('.added img').attributes('src')).toBe(GREEN_BOX_IMAGE_URL);
+ expect(wrapper.find('.image-info').text()).toBe('1.00 KiB');
});
- it('renders image diff for deleted', async () => {
+ it('renders image diff for deleted', () => {
createComponent({ ...allProps, diffMode: 'deleted', newPath: '' });
- await nextTick();
-
- const metaInfoElement = vm.$el.querySelector('.image-info');
-
- expect(vm.$el.querySelector('.deleted img').getAttribute('src')).toBe(RED_BOX_IMAGE_URL);
- expect(metaInfoElement).toHaveText('2.00 KiB');
+ expect(wrapper.find('.deleted img').attributes('src')).toBe(RED_BOX_IMAGE_URL);
+ expect(wrapper.find('.image-info').text()).toBe('2.00 KiB');
});
- it('renders image diff for renamed', async () => {
- vm = new Vue({
- components: {
- imageDiffViewer,
- },
- data() {
- return {
- ...allProps,
- diffMode: 'renamed',
- };
- },
- ...compileToFunctions(`
- <image-diff-viewer
- :diff-mode="diffMode"
- :new-path="newPath"
- :old-path="oldPath"
- :new-size="newSize"
- :old-size="oldSize"
- >
- <template #image-overlay>
- <span class="overlay">test</span>
- </template>
- </image-diff-viewer>
- `),
- }).$mount();
-
- await nextTick();
-
- const metaInfoElement = vm.$el.querySelector('.image-info');
-
- expect(vm.$el.querySelector('img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
- expect(vm.$el.querySelector('.overlay')).not.toBe(null);
-
- expect(metaInfoElement).toHaveText('2.00 KiB');
+ it('renders image diff for renamed', () => {
+ createComponent(
+ { ...allProps, diffMode: 'renamed' },
+ { 'image-overlay': '<span class="overlay">test</span>' },
+ );
+
+ expect(wrapper.find('img').attributes('src')).toBe(GREEN_BOX_IMAGE_URL);
+ expect(wrapper.find('.overlay').exists()).toBe(true);
+ expect(wrapper.find('.image-info').text()).toBe('2.00 KiB');
});
describe('swipeMode', () => {
beforeEach(() => {
- createComponent({ ...requiredProps });
-
- return nextTick();
+ createComponent(requiredProps);
});
it('switches to Swipe Mode', async () => {
- vm.$el.querySelector('.view-modes-menu li:nth-child(2)').click();
+ await wrapper.find('.view-modes-menu li:nth-child(2)').trigger('click');
- await nextTick();
- expect(vm.$el.querySelector('.view-modes-menu li.active').textContent.trim()).toBe('Swipe');
+ expect(wrapper.find('.view-modes-menu li.active').text()).toBe('Swipe');
});
});
describe('onionSkin', () => {
beforeEach(() => {
createComponent({ ...requiredProps });
-
- return nextTick();
});
it('switches to Onion Skin Mode', async () => {
- vm.$el.querySelector('.view-modes-menu li:nth-child(3)').click();
+ await wrapper.find('.view-modes-menu li:nth-child(3)').trigger('click');
- await nextTick();
- expect(vm.$el.querySelector('.view-modes-menu li.active').textContent.trim()).toBe(
- 'Onion skin',
- );
+ expect(wrapper.find('.view-modes-menu li.active').text()).toBe('Onion skin');
});
it('has working drag handler', async () => {
- vm.$el.querySelector('.view-modes-menu li:nth-child(3)').click();
+ await wrapper.find('.view-modes-menu li:nth-child(3)').trigger('click');
+ dragSlider(wrapper.find('.dragger').element, document, 20);
await nextTick();
- dragSlider(vm.$el.querySelector('.dragger'), document, 20);
- await nextTick();
- expect(vm.$el.querySelector('.dragger').style.left).toBe('20px');
- expect(vm.$el.querySelector('.added.frame').style.opacity).toBe('0.2');
+ expect(wrapper.find('.dragger').attributes('style')).toBe('left: 20px;');
+ expect(wrapper.find('.added.frame').attributes('style')).toBe('opacity: 0.2;');
});
});
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js b/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js
index e3e2ef5610d..86d1f21fd04 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js
@@ -8,6 +8,8 @@ import EmojiToken from '~/vue_shared/components/filtered_search_bar/tokens/emoji
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 ReleaseToken from '~/vue_shared/components/filtered_search_bar/tokens/release_token.vue';
+import CrmContactToken from '~/vue_shared/components/filtered_search_bar/tokens/crm_contact_token.vue';
+import CrmOrganizationToken from '~/vue_shared/components/filtered_search_bar/tokens/crm_organization_token.vue';
export const mockAuthor1 = {
id: 1,
@@ -62,6 +64,128 @@ export const mockMilestones = [
mockEscapedMilestone,
];
+export const mockCrmContacts = [
+ {
+ id: 'gid://gitlab/CustomerRelations::Contact/1',
+ firstName: 'John',
+ lastName: 'Smith',
+ email: 'john@smith.com',
+ },
+ {
+ id: 'gid://gitlab/CustomerRelations::Contact/2',
+ firstName: 'Andy',
+ lastName: 'Green',
+ email: 'andy@green.net',
+ },
+];
+
+export const mockCrmOrganizations = [
+ {
+ id: 'gid://gitlab/CustomerRelations::Organization/1',
+ name: 'First Org Ltd.',
+ },
+ {
+ id: 'gid://gitlab/CustomerRelations::Organization/2',
+ name: 'Organizer S.p.a.',
+ },
+];
+
+export const mockProjectCrmContactsQueryResponse = {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 1,
+ group: {
+ __typename: 'Group',
+ id: 1,
+ contacts: {
+ __typename: 'CustomerRelationsContactConnection',
+ nodes: [
+ {
+ __typename: 'CustomerRelationsContact',
+ ...mockCrmContacts[0],
+ },
+ {
+ __typename: 'CustomerRelationsContact',
+ ...mockCrmContacts[1],
+ },
+ ],
+ },
+ },
+ },
+ },
+};
+
+export const mockProjectCrmOrganizationsQueryResponse = {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 1,
+ group: {
+ __typename: 'Group',
+ id: 1,
+ organizations: {
+ __typename: 'CustomerRelationsOrganizationConnection',
+ nodes: [
+ {
+ __typename: 'CustomerRelationsOrganization',
+ ...mockCrmOrganizations[0],
+ },
+ {
+ __typename: 'CustomerRelationsOrganization',
+ ...mockCrmOrganizations[1],
+ },
+ ],
+ },
+ },
+ },
+ },
+};
+
+export const mockGroupCrmContactsQueryResponse = {
+ data: {
+ group: {
+ __typename: 'Group',
+ id: 1,
+ contacts: {
+ __typename: 'CustomerRelationsContactConnection',
+ nodes: [
+ {
+ __typename: 'CustomerRelationsContact',
+ ...mockCrmContacts[0],
+ },
+ {
+ __typename: 'CustomerRelationsContact',
+ ...mockCrmContacts[1],
+ },
+ ],
+ },
+ },
+ },
+};
+
+export const mockGroupCrmOrganizationsQueryResponse = {
+ data: {
+ group: {
+ __typename: 'Group',
+ id: 1,
+ organizations: {
+ __typename: 'CustomerRelationsOrganizationConnection',
+ nodes: [
+ {
+ __typename: 'CustomerRelationsOrganization',
+ ...mockCrmOrganizations[0],
+ },
+ {
+ __typename: 'CustomerRelationsOrganization',
+ ...mockCrmOrganizations[1],
+ },
+ ],
+ },
+ },
+ },
+};
+
export const mockEmoji1 = {
name: 'thumbsup',
};
@@ -134,6 +258,28 @@ export const mockReactionEmojiToken = {
fetchEmojis: () => Promise.resolve(mockEmojis),
};
+export const mockCrmContactToken = {
+ type: 'crm_contact',
+ title: 'Contact',
+ icon: 'user',
+ token: CrmContactToken,
+ isProject: false,
+ fullPath: 'group',
+ operators: OPERATOR_IS_ONLY,
+ unique: true,
+};
+
+export const mockCrmOrganizationToken = {
+ type: 'crm_contact',
+ title: 'Organization',
+ icon: 'user',
+ token: CrmOrganizationToken,
+ isProject: false,
+ fullPath: 'group',
+ operators: OPERATOR_IS_ONLY,
+ unique: true,
+};
+
export const mockMembershipToken = {
type: 'with_inherited_permissions',
icon: 'group',
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 ca8cd419d87..a0126c2bd63 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
@@ -418,8 +418,6 @@ describe('BaseToken', () => {
});
it('does not emit `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
- jest.useFakeTimers();
-
findGlFilteredSearchToken().vm.$emit('input', { data: 'foo' });
await nextTick();
@@ -437,8 +435,6 @@ describe('BaseToken', () => {
});
it('emits `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
- jest.useFakeTimers();
-
findGlFilteredSearchToken().vm.$emit('input', { data: 'foo' });
await nextTick();
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js
new file mode 100644
index 00000000000..157e021fc60
--- /dev/null
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js
@@ -0,0 +1,283 @@
+import {
+ GlFilteredSearchSuggestion,
+ GlFilteredSearchTokenSegment,
+ GlDropdownDivider,
+} from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import Vue, { nextTick } 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 { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { DEFAULT_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants';
+import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
+import CrmContactToken from '~/vue_shared/components/filtered_search_bar/tokens/crm_contact_token.vue';
+import searchCrmContactsQuery from '~/vue_shared/components/filtered_search_bar/queries/search_crm_contacts.query.graphql';
+
+import {
+ mockCrmContacts,
+ mockCrmContactToken,
+ mockGroupCrmContactsQueryResponse,
+ mockProjectCrmContactsQueryResponse,
+} from '../mock_data';
+
+jest.mock('~/flash');
+
+const defaultStubs = {
+ Portal: true,
+ BaseToken,
+ GlFilteredSearchSuggestionList: {
+ template: '<div></div>',
+ methods: {
+ getValue: () => '=',
+ },
+ },
+};
+
+describe('CrmContactToken', () => {
+ Vue.use(VueApollo);
+
+ let wrapper;
+ let fakeApollo;
+
+ const getBaseToken = () => wrapper.findComponent(BaseToken);
+
+ const searchGroupCrmContactsQueryHandler = jest
+ .fn()
+ .mockResolvedValue(mockGroupCrmContactsQueryResponse);
+ const searchProjectCrmContactsQueryHandler = jest
+ .fn()
+ .mockResolvedValue(mockProjectCrmContactsQueryResponse);
+
+ const mountComponent = ({
+ config = mockCrmContactToken,
+ value = { data: '' },
+ active = false,
+ stubs = defaultStubs,
+ listeners = {},
+ queryHandler = searchGroupCrmContactsQueryHandler,
+ } = {}) => {
+ fakeApollo = createMockApollo([[searchCrmContactsQuery, queryHandler]]);
+
+ wrapper = mount(CrmContactToken, {
+ propsData: {
+ config,
+ value,
+ active,
+ cursorPosition: 'start',
+ },
+ provide: {
+ portalName: 'fake target',
+ alignSuggestions: function fakeAlignSuggestions() {},
+ suggestionsListClass: () => 'custom-class',
+ },
+ stubs,
+ listeners,
+ apolloProvider: fakeApollo,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ fakeApollo = null;
+ });
+
+ describe('methods', () => {
+ describe('fetchContacts', () => {
+ describe('for groups', () => {
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ it('calls the apollo query providing the searchString when search term is a string', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', 'foo');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchGroupCrmContactsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'group',
+ isProject: false,
+ searchString: 'foo',
+ searchIds: null,
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmContacts);
+ });
+
+ it('calls the apollo query providing the searchId when search term is a number', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', '5');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchGroupCrmContactsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'group',
+ isProject: false,
+ searchString: null,
+ searchIds: ['gid://gitlab/CustomerRelations::Contact/5'],
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmContacts);
+ });
+ });
+
+ describe('for projects', () => {
+ beforeEach(() => {
+ mountComponent({
+ config: {
+ fullPath: 'project',
+ isProject: true,
+ },
+ queryHandler: searchProjectCrmContactsQueryHandler,
+ });
+ });
+
+ it('calls the apollo query providing the searchString when search term is a string', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', 'foo');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchProjectCrmContactsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'project',
+ isProject: true,
+ searchString: 'foo',
+ searchIds: null,
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmContacts);
+ });
+
+ it('calls the apollo query providing the searchId when search term is a number', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', '5');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchProjectCrmContactsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'project',
+ isProject: true,
+ searchString: null,
+ searchIds: ['gid://gitlab/CustomerRelations::Contact/5'],
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmContacts);
+ });
+ });
+
+ it('calls `createFlash` with flash error message when request fails', async () => {
+ mountComponent();
+
+ jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+
+ getBaseToken().vm.$emit('fetch-suggestions');
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'There was a problem fetching CRM contacts.',
+ });
+ });
+
+ it('sets `loading` to false when request completes', async () => {
+ mountComponent();
+
+ jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+
+ getBaseToken().vm.$emit('fetch-suggestions');
+
+ await waitForPromises();
+
+ expect(getBaseToken().props('suggestionsLoading')).toBe(false);
+ });
+ });
+ });
+
+ describe('template', () => {
+ const defaultContacts = DEFAULT_NONE_ANY;
+
+ it('renders base-token component', () => {
+ mountComponent({
+ config: { ...mockCrmContactToken, initialContacts: mockCrmContacts },
+ value: { data: '1' },
+ });
+
+ const baseTokenEl = wrapper.find(BaseToken);
+
+ expect(baseTokenEl.exists()).toBe(true);
+ expect(baseTokenEl.props()).toMatchObject({
+ suggestions: mockCrmContacts,
+ getActiveTokenValue: wrapper.vm.getActiveContact,
+ });
+ });
+
+ it.each(mockCrmContacts)('renders token item when value is selected', (contact) => {
+ mountComponent({
+ config: { ...mockCrmContactToken, initialContacts: mockCrmContacts },
+ value: { data: `${getIdFromGraphQLId(contact.id)}` },
+ });
+
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+
+ expect(tokenSegments).toHaveLength(3); // Contact, =, Contact name
+ expect(tokenSegments.at(2).text()).toBe(`${contact.firstName} ${contact.lastName}`); // Contact name
+ });
+
+ it('renders provided defaultContacts as suggestions', async () => {
+ mountComponent({
+ active: true,
+ config: { ...mockCrmContactToken, defaultContacts },
+ stubs: { Portal: true },
+ });
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+ const suggestionsSegment = tokenSegments.at(2);
+ suggestionsSegment.vm.$emit('activate');
+ await nextTick();
+
+ const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
+
+ expect(suggestions).toHaveLength(defaultContacts.length);
+ defaultContacts.forEach((contact, index) => {
+ expect(suggestions.at(index).text()).toBe(contact.text);
+ });
+ });
+
+ it('does not render divider when no defaultContacts', async () => {
+ mountComponent({
+ active: true,
+ config: { ...mockCrmContactToken, defaultContacts: [] },
+ stubs: { Portal: true },
+ });
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+ const suggestionsSegment = tokenSegments.at(2);
+ suggestionsSegment.vm.$emit('activate');
+ await nextTick();
+
+ expect(wrapper.find(GlFilteredSearchSuggestion).exists()).toBe(false);
+ expect(wrapper.find(GlDropdownDivider).exists()).toBe(false);
+ });
+
+ it('renders `DEFAULT_NONE_ANY` as default suggestions', () => {
+ mountComponent({
+ active: true,
+ config: { ...mockCrmContactToken },
+ stubs: { Portal: true },
+ });
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+ const suggestionsSegment = tokenSegments.at(2);
+ suggestionsSegment.vm.$emit('activate');
+
+ const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
+
+ expect(suggestions).toHaveLength(DEFAULT_NONE_ANY.length);
+ DEFAULT_NONE_ANY.forEach((contact, index) => {
+ expect(suggestions.at(index).text()).toBe(contact.text);
+ });
+ });
+
+ it('emits listeners in the base-token', () => {
+ const mockInput = jest.fn();
+ mountComponent({
+ listeners: {
+ input: mockInput,
+ },
+ });
+ wrapper.findComponent(BaseToken).vm.$emit('input', [{ data: 'mockData', operator: '=' }]);
+
+ expect(mockInput).toHaveBeenLastCalledWith([{ data: 'mockData', operator: '=' }]);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js
new file mode 100644
index 00000000000..977f8bbef61
--- /dev/null
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js
@@ -0,0 +1,282 @@
+import {
+ GlFilteredSearchSuggestion,
+ GlFilteredSearchTokenSegment,
+ GlDropdownDivider,
+} from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import Vue, { nextTick } 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 { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { DEFAULT_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants';
+import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
+import CrmOrganizationToken from '~/vue_shared/components/filtered_search_bar/tokens/crm_organization_token.vue';
+import searchCrmOrganizationsQuery from '~/vue_shared/components/filtered_search_bar/queries/search_crm_organizations.query.graphql';
+
+import {
+ mockCrmOrganizations,
+ mockCrmOrganizationToken,
+ mockGroupCrmOrganizationsQueryResponse,
+ mockProjectCrmOrganizationsQueryResponse,
+} from '../mock_data';
+
+jest.mock('~/flash');
+
+const defaultStubs = {
+ Portal: true,
+ BaseToken,
+ GlFilteredSearchSuggestionList: {
+ template: '<div></div>',
+ methods: {
+ getValue: () => '=',
+ },
+ },
+};
+
+describe('CrmOrganizationToken', () => {
+ Vue.use(VueApollo);
+
+ let wrapper;
+ let fakeApollo;
+
+ const getBaseToken = () => wrapper.findComponent(BaseToken);
+
+ const searchGroupCrmOrganizationsQueryHandler = jest
+ .fn()
+ .mockResolvedValue(mockGroupCrmOrganizationsQueryResponse);
+ const searchProjectCrmOrganizationsQueryHandler = jest
+ .fn()
+ .mockResolvedValue(mockProjectCrmOrganizationsQueryResponse);
+
+ const mountComponent = ({
+ config = mockCrmOrganizationToken,
+ value = { data: '' },
+ active = false,
+ stubs = defaultStubs,
+ listeners = {},
+ queryHandler = searchGroupCrmOrganizationsQueryHandler,
+ } = {}) => {
+ fakeApollo = createMockApollo([[searchCrmOrganizationsQuery, queryHandler]]);
+ wrapper = mount(CrmOrganizationToken, {
+ propsData: {
+ config,
+ value,
+ active,
+ cursorPosition: 'start',
+ },
+ provide: {
+ portalName: 'fake target',
+ alignSuggestions: function fakeAlignSuggestions() {},
+ suggestionsListClass: () => 'custom-class',
+ },
+ stubs,
+ listeners,
+ apolloProvider: fakeApollo,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ fakeApollo = null;
+ });
+
+ describe('methods', () => {
+ describe('fetchOrganizations', () => {
+ describe('for groups', () => {
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ it('calls the apollo query providing the searchString when search term is a string', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', 'foo');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchGroupCrmOrganizationsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'group',
+ isProject: false,
+ searchString: 'foo',
+ searchIds: null,
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmOrganizations);
+ });
+
+ it('calls the apollo query providing the searchId when search term is a number', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', '5');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchGroupCrmOrganizationsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'group',
+ isProject: false,
+ searchString: null,
+ searchIds: ['gid://gitlab/CustomerRelations::Organization/5'],
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmOrganizations);
+ });
+ });
+
+ describe('for projects', () => {
+ beforeEach(() => {
+ mountComponent({
+ config: {
+ fullPath: 'project',
+ isProject: true,
+ },
+ queryHandler: searchProjectCrmOrganizationsQueryHandler,
+ });
+ });
+
+ it('calls the apollo query providing the searchString when search term is a string', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', 'foo');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchProjectCrmOrganizationsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'project',
+ isProject: true,
+ searchString: 'foo',
+ searchIds: null,
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmOrganizations);
+ });
+
+ it('calls the apollo query providing the searchId when search term is a number', async () => {
+ getBaseToken().vm.$emit('fetch-suggestions', '5');
+ await waitForPromises();
+
+ expect(createFlash).not.toHaveBeenCalled();
+ expect(searchProjectCrmOrganizationsQueryHandler).toHaveBeenCalledWith({
+ fullPath: 'project',
+ isProject: true,
+ searchString: null,
+ searchIds: ['gid://gitlab/CustomerRelations::Organization/5'],
+ });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmOrganizations);
+ });
+ });
+
+ it('calls `createFlash` with flash error message when request fails', async () => {
+ mountComponent();
+
+ jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+
+ getBaseToken().vm.$emit('fetch-suggestions');
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'There was a problem fetching CRM organizations.',
+ });
+ });
+
+ it('sets `loading` to false when request completes', async () => {
+ mountComponent();
+
+ jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+
+ getBaseToken().vm.$emit('fetch-suggestions');
+
+ await waitForPromises();
+
+ expect(getBaseToken().props('suggestionsLoading')).toBe(false);
+ });
+ });
+ });
+
+ describe('template', () => {
+ const defaultOrganizations = DEFAULT_NONE_ANY;
+
+ it('renders base-token component', () => {
+ mountComponent({
+ config: { ...mockCrmOrganizationToken, initialOrganizations: mockCrmOrganizations },
+ value: { data: '1' },
+ });
+
+ const baseTokenEl = wrapper.find(BaseToken);
+
+ expect(baseTokenEl.exists()).toBe(true);
+ expect(baseTokenEl.props()).toMatchObject({
+ suggestions: mockCrmOrganizations,
+ getActiveTokenValue: wrapper.vm.getActiveOrganization,
+ });
+ });
+
+ it.each(mockCrmOrganizations)('renders token item when value is selected', (organization) => {
+ mountComponent({
+ config: { ...mockCrmOrganizationToken, initialOrganizations: mockCrmOrganizations },
+ value: { data: `${getIdFromGraphQLId(organization.id)}` },
+ });
+
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+
+ expect(tokenSegments).toHaveLength(3); // Organization, =, Organization name
+ expect(tokenSegments.at(2).text()).toBe(organization.name); // Organization name
+ });
+
+ it('renders provided defaultOrganizations as suggestions', async () => {
+ mountComponent({
+ active: true,
+ config: { ...mockCrmOrganizationToken, defaultOrganizations },
+ stubs: { Portal: true },
+ });
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+ const suggestionsSegment = tokenSegments.at(2);
+ suggestionsSegment.vm.$emit('activate');
+ await nextTick();
+
+ const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
+
+ expect(suggestions).toHaveLength(defaultOrganizations.length);
+ defaultOrganizations.forEach((organization, index) => {
+ expect(suggestions.at(index).text()).toBe(organization.text);
+ });
+ });
+
+ it('does not render divider when no defaultOrganizations', async () => {
+ mountComponent({
+ active: true,
+ config: { ...mockCrmOrganizationToken, defaultOrganizations: [] },
+ stubs: { Portal: true },
+ });
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+ const suggestionsSegment = tokenSegments.at(2);
+ suggestionsSegment.vm.$emit('activate');
+ await nextTick();
+
+ expect(wrapper.find(GlFilteredSearchSuggestion).exists()).toBe(false);
+ expect(wrapper.find(GlDropdownDivider).exists()).toBe(false);
+ });
+
+ it('renders `DEFAULT_NONE_ANY` as default suggestions', () => {
+ mountComponent({
+ active: true,
+ config: { ...mockCrmOrganizationToken },
+ stubs: { Portal: true },
+ });
+ const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
+ const suggestionsSegment = tokenSegments.at(2);
+ suggestionsSegment.vm.$emit('activate');
+
+ const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
+
+ expect(suggestions).toHaveLength(DEFAULT_NONE_ANY.length);
+ DEFAULT_NONE_ANY.forEach((organization, index) => {
+ expect(suggestions.at(index).text()).toBe(organization.text);
+ });
+ });
+
+ it('emits listeners in the base-token', () => {
+ const mockInput = jest.fn();
+ mountComponent({
+ listeners: {
+ input: mockInput,
+ },
+ });
+ wrapper.findComponent(BaseToken).vm.$emit('input', [{ data: 'mockData', operator: '=' }]);
+
+ expect(mockInput).toHaveBeenLastCalledWith([{ data: 'mockData', operator: '=' }]);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/markdown/field_spec.js b/spec/frontend/vue_shared/components/markdown/field_spec.js
index b3376f26a25..85a135d2b89 100644
--- a/spec/frontend/vue_shared/components/markdown/field_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/field_spec.js
@@ -67,11 +67,6 @@ describe('Markdown field component', () => {
enablePreview,
restrictedToolBarItems,
},
- provide: {
- glFeatures: {
- contactsAutocomplete: true,
- },
- },
},
);
}
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 5e956d66b6a..bf6c8e8c704 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
@@ -7,16 +7,19 @@ exports[`Issue placeholder note component matches snapshot 1`] = `
<div
class="timeline-icon"
>
- <user-avatar-link-stub
- imgalt=""
- imgcssclasses=""
- imgsize="40"
- imgsrc="mock_path"
- linkhref="/root"
- tooltipplacement="top"
- tooltiptext=""
- username=""
- />
+ <gl-avatar-link-stub
+ class="gl-mr-3"
+ href="/root"
+ >
+ <gl-avatar-stub
+ alt="Root"
+ entityid="0"
+ entityname="root"
+ shape="circle"
+ size="[object Object]"
+ src="mock_path"
+ />
+ </gl-avatar-link-stub>
</div>
<div
diff --git a/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js b/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
index 6881cb79740..f951cfd5cd9 100644
--- a/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
+++ b/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
@@ -1,8 +1,8 @@
import { shallowMount } from '@vue/test-utils';
+import { GlAvatar } from '@gitlab/ui';
import Vue from 'vue';
import Vuex from 'vuex';
import IssuePlaceholderNote from '~/vue_shared/components/notes/placeholder_note.vue';
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import { userDataMock } from 'jest/notes/mock_data';
Vue.use(Vuex);
@@ -56,14 +56,14 @@ describe('Issue placeholder note component', () => {
describe('avatar size', () => {
it.each`
- size | line | isOverviewTab
- ${40} | ${null} | ${false}
- ${24} | ${{ line_code: '123' }} | ${false}
- ${40} | ${{ line_code: '123' }} | ${true}
+ size | line | isOverviewTab
+ ${{ default: 24, md: 32 }} | ${null} | ${false}
+ ${24} | ${{ line_code: '123' }} | ${false}
+ ${{ default: 24, md: 32 }} | ${{ line_code: '123' }} | ${true}
`('renders avatar $size for $line and $isOverviewTab', ({ size, line, isOverviewTab }) => {
createComponent(false, { line, isOverviewTab });
- expect(wrapper.findComponent(UserAvatarLink).props('imgSize')).toBe(size);
+ expect(wrapper.findComponent(GlAvatar).props('size')).toEqual(size);
});
});
});
diff --git a/spec/frontend/vue_shared/components/page_size_selector_spec.js b/spec/frontend/vue_shared/components/page_size_selector_spec.js
new file mode 100644
index 00000000000..5ec0b863afd
--- /dev/null
+++ b/spec/frontend/vue_shared/components/page_size_selector_spec.js
@@ -0,0 +1,44 @@
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import PageSizeSelector, { PAGE_SIZES } from '~/vue_shared/components/page_size_selector.vue';
+
+describe('Page size selector component', () => {
+ let wrapper;
+
+ const createWrapper = ({ pageSize = 20 } = {}) => {
+ wrapper = shallowMount(PageSizeSelector, {
+ propsData: { value: pageSize },
+ });
+ };
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it.each(PAGE_SIZES)('shows expected text in the dropdown button for page size %s', (pageSize) => {
+ createWrapper({ pageSize });
+
+ expect(findDropdown().props('text')).toBe(`Show ${pageSize} items`);
+ });
+
+ it('shows the expected dropdown items', () => {
+ createWrapper();
+
+ PAGE_SIZES.forEach((pageSize, index) => {
+ expect(findDropdownItems().at(index).text()).toBe(`Show ${pageSize} items`);
+ });
+ });
+
+ it('will emit the new page size when a dropdown item is clicked', () => {
+ createWrapper();
+
+ findDropdownItems().wrappers.forEach((itemWrapper, index) => {
+ itemWrapper.vm.$emit('click');
+
+ expect(wrapper.emitted('input')[index][0]).toBe(PAGE_SIZES[index]);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js b/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
index 8270ff31574..51a936c0509 100644
--- a/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
+++ b/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
@@ -195,7 +195,7 @@ describe('AlertManagementEmptyState', () => {
tabs.forEach((tab, i) => {
const status = ITEMS_STATUS_TABS[i].status.toLowerCase();
expect(tab.attributes('data-testid')).toContain(ITEMS_STATUS_TABS[i].status);
- expect(badges.at(i).text()).toContain(itemsCount[status]);
+ expect(badges.at(i).text()).toContain(itemsCount[status].toString());
});
});
});
diff --git a/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap b/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
index 8ff49271eb5..2ea8985b16a 100644
--- a/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
+++ b/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
@@ -42,6 +42,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
>
<gl-accordion-item-stub
class="gl-font-weight-normal"
+ headerclass=""
title="More Details"
titlevisible="Less Details"
>
@@ -76,6 +77,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
>
<gl-accordion-item-stub
class="gl-font-weight-normal"
+ headerclass=""
title="More Details"
titlevisible="Less Details"
>
@@ -110,6 +112,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
>
<gl-accordion-item-stub
class="gl-font-weight-normal"
+ headerclass=""
title="More Details"
titlevisible="Less Details"
>
@@ -144,6 +147,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
>
<gl-accordion-item-stub
class="gl-font-weight-normal"
+ headerclass=""
title="More Details"
titlevisible="Less Details"
>
diff --git a/spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js b/spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js
index 7173abe1316..a38dcd626f4 100644
--- a/spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js
+++ b/spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js
@@ -79,7 +79,7 @@ describe('RunnerInstructionsModal component', () => {
}
};
- beforeEach(async () => {
+ beforeEach(() => {
runnerPlatformsHandler = jest.fn().mockResolvedValue(mockGraphqlRunnerPlatforms);
runnerSetupInstructionsHandler = jest.fn().mockResolvedValue(mockGraphqlInstructions);
});
@@ -259,11 +259,11 @@ describe('RunnerInstructionsModal component', () => {
});
describe('when apollo is loading', () => {
- beforeEach(() => {
+ it('should show a skeleton loader', async () => {
createComponent();
- });
+ await nextTick();
+ await nextTick();
- it('should show a skeleton loader', async () => {
expect(findSkeletonLoader().exists()).toBe(true);
expect(findGlLoadingIcon().exists()).toBe(false);
@@ -275,6 +275,8 @@ describe('RunnerInstructionsModal component', () => {
});
it('once loaded, should not show a loading state', async () => {
+ createComponent();
+
await waitForPromises();
expect(findSkeletonLoader().exists()).toBe(false);
diff --git a/spec/frontend/vue_shared/components/source_viewer/plugins/link_dependencies_spec.js b/spec/frontend/vue_shared/components/source_viewer/plugins/link_dependencies_spec.js
new file mode 100644
index 00000000000..3036ce43888
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_viewer/plugins/link_dependencies_spec.js
@@ -0,0 +1,14 @@
+import packageJsonLinker from '~/vue_shared/components/source_viewer/plugins/utils/package_json_linker';
+import linkDependencies from '~/vue_shared/components/source_viewer/plugins/link_dependencies';
+import { PACKAGE_JSON_FILE_TYPE, PACKAGE_JSON_CONTENT } from './mock_data';
+
+jest.mock('~/vue_shared/components/source_viewer/plugins/utils/package_json_linker');
+
+describe('Highlight.js plugin for linking dependencies', () => {
+ const hljsResultMock = { value: 'test' };
+
+ it('calls packageJsonLinker for package_json file types', () => {
+ linkDependencies(hljsResultMock, PACKAGE_JSON_FILE_TYPE, PACKAGE_JSON_CONTENT);
+ expect(packageJsonLinker).toHaveBeenCalled();
+ });
+});
diff --git a/spec/frontend/vue_shared/components/source_viewer/plugins/mock_data.js b/spec/frontend/vue_shared/components/source_viewer/plugins/mock_data.js
new file mode 100644
index 00000000000..75659770e2c
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_viewer/plugins/mock_data.js
@@ -0,0 +1,2 @@
+export const PACKAGE_JSON_FILE_TYPE = 'package_json';
+export const PACKAGE_JSON_CONTENT = '{ "dependencies": { "@babel/core": "^7.18.5" } }';
diff --git a/spec/frontend/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util_spec.js b/spec/frontend/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util_spec.js
new file mode 100644
index 00000000000..ee200747af9
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util_spec.js
@@ -0,0 +1,33 @@
+import {
+ createLink,
+ generateHLJSOpenTag,
+} from '~/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util';
+
+describe('createLink', () => {
+ it('generates a link with the correct attributes', () => {
+ const href = 'http://test.com';
+ const innerText = 'testing';
+ const result = `<a href="${href}" rel="nofollow noreferrer noopener">${innerText}</a>`;
+
+ expect(createLink(href, innerText)).toBe(result);
+ });
+
+ it('escapes the user-controlled content', () => {
+ const unescapedXSS = '<script>XSS</script>';
+ const escapedXSS = '&amp;lt;script&amp;gt;XSS&amp;lt;/script&amp;gt;';
+ const href = `http://test.com/${unescapedXSS}`;
+ const innerText = `testing${unescapedXSS}`;
+ const result = `<a href="http://test.com/${escapedXSS}" rel="nofollow noreferrer noopener">testing${escapedXSS}</a>`;
+
+ expect(createLink(href, innerText)).toBe(result);
+ });
+});
+
+describe('generateHLJSOpenTag', () => {
+ it('generates an open tag with the correct selector', () => {
+ const type = 'string';
+ const result = `<span class="hljs-${type}">&quot;`;
+
+ expect(generateHLJSOpenTag(type)).toBe(result);
+ });
+});
diff --git a/spec/frontend/vue_shared/components/source_viewer/plugins/utils/package_json_linker_spec.js b/spec/frontend/vue_shared/components/source_viewer/plugins/utils/package_json_linker_spec.js
new file mode 100644
index 00000000000..e83c129818c
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_viewer/plugins/utils/package_json_linker_spec.js
@@ -0,0 +1,15 @@
+import packageJsonLinker from '~/vue_shared/components/source_viewer/plugins/utils/package_json_linker';
+import { PACKAGE_JSON_CONTENT } from '../mock_data';
+
+describe('Highlight.js plugin for linking package.json dependencies', () => {
+ it('mutates the input value by wrapping dependency names and versions in anchors', () => {
+ const inputValue =
+ '<span class="hljs-attr">&quot;@babel/core&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;^7.18.5&quot;</span>';
+ const outputValue =
+ '<span class="hljs-attr">&quot;<a href="https://npmjs.com/package/@babel/core" rel="nofollow noreferrer noopener">@babel/core</a>&quot;</span>: <span class="hljs-attr">&quot;<a href="https://npmjs.com/package/@babel/core" rel="nofollow noreferrer noopener">^7.18.5</a>&quot;</span>';
+ const hljsResultMock = { value: inputValue };
+
+ const output = packageJsonLinker(hljsResultMock, PACKAGE_JSON_CONTENT);
+ expect(output).toBe(outputValue);
+ });
+});
diff --git a/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js b/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
index bb0945a1f3e..2c03b7aa7d3 100644
--- a/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
@@ -5,10 +5,16 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import SourceViewer from '~/vue_shared/components/source_viewer/source_viewer.vue';
import { registerPlugins } from '~/vue_shared/components/source_viewer/plugins/index';
import Chunk from '~/vue_shared/components/source_viewer/components/chunk.vue';
-import { ROUGE_TO_HLJS_LANGUAGE_MAP } from '~/vue_shared/components/source_viewer/constants';
+import {
+ EVENT_ACTION,
+ EVENT_LABEL_VIEWER,
+ EVENT_LABEL_FALLBACK,
+ ROUGE_TO_HLJS_LANGUAGE_MAP,
+} from '~/vue_shared/components/source_viewer/constants';
import waitForPromises from 'helpers/wait_for_promises';
import LineHighlighter from '~/blob/line_highlighter';
import eventHub from '~/notes/event_hub';
+import Tracking from '~/tracking';
jest.mock('~/blob/line_highlighter');
jest.mock('highlight.js/lib/core');
@@ -34,7 +40,8 @@ describe('Source Viewer component', () => {
const chunk2 = generateContent('// Some source code 2', 70);
const content = chunk1 + chunk2;
const path = 'some/path.js';
- const DEFAULT_BLOB_DATA = { language, rawTextBlob: content, path };
+ const fileType = 'javascript';
+ const DEFAULT_BLOB_DATA = { language, rawTextBlob: content, path, fileType };
const highlightedContent = `<span data-testid='test-highlighted' id='LC1'>${content}</span><span id='LC2'></span>`;
const createComponent = async (blob = {}) => {
@@ -52,17 +59,38 @@ describe('Source Viewer component', () => {
hljs.highlightAuto.mockImplementation(() => ({ value: highlightedContent }));
jest.spyOn(window, 'requestIdleCallback').mockImplementation(execImmediately);
jest.spyOn(eventHub, '$emit');
+ jest.spyOn(Tracking, 'event');
return createComponent();
});
afterEach(() => wrapper.destroy());
+ describe('event tracking', () => {
+ it('fires a tracking event when the component is created', () => {
+ const eventData = { label: EVENT_LABEL_VIEWER, property: language };
+ expect(Tracking.event).toHaveBeenCalledWith(undefined, EVENT_ACTION, eventData);
+ });
+
+ it('does not emit an error event when the language is supported', () => {
+ expect(wrapper.emitted('error')).toBeUndefined();
+ });
+
+ it('fires a tracking event and emits an error when the language is not supported', () => {
+ const unsupportedLanguage = 'apex';
+ const eventData = { label: EVENT_LABEL_FALLBACK, property: unsupportedLanguage };
+ createComponent({ language: unsupportedLanguage });
+
+ expect(Tracking.event).toHaveBeenCalledWith(undefined, EVENT_ACTION, eventData);
+ expect(wrapper.emitted('error')).toHaveLength(1);
+ });
+ });
+
describe('highlight.js', () => {
beforeEach(() => createComponent({ language: mappedLanguage }));
it('registers our plugins for Highlight.js', () => {
- expect(registerPlugins).toHaveBeenCalledWith(hljs);
+ expect(registerPlugins).toHaveBeenCalledWith(hljs, fileType, content);
});
it('registers the language definition', async () => {
@@ -74,6 +102,13 @@ describe('Source Viewer component', () => {
);
});
+ it('registers json language definition if fileType is package_json', async () => {
+ await createComponent({ language: 'json', fileType: 'package_json' });
+ const languageDefinition = await import(`highlight.js/lib/languages/json`);
+
+ expect(hljs.registerLanguage).toHaveBeenCalledWith('json', languageDefinition.default);
+ });
+
it('highlights the first chunk', () => {
expect(hljs.highlight).toHaveBeenCalledWith(chunk1.trim(), { language: mappedLanguage });
});
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 a54f3450633..9550368eefc 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
@@ -2,7 +2,6 @@ import { GlSkeletonLoader, GlIcon } from '@gitlab/ui';
import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
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';
import axios from '~/lib/utils/axios_utils';
import createFlash from '~/flash';
@@ -48,7 +47,6 @@ describe('User Popover Component', () => {
const findUserStatus = () => wrapper.findByTestId('user-popover-status');
const findTarget = () => document.querySelector('.js-user-link');
- const findUserName = () => wrapper.find(UserNameWithStatus);
const findSecurityBotDocsLink = () => wrapper.findByTestId('user-popover-bot-docs-link');
const findUserLocalTime = () => wrapper.findByTestId('user-popover-local-time');
const findToggleFollowButton = () => wrapper.findByTestId('toggle-follow-button');
@@ -245,9 +243,7 @@ describe('User Popover Component', () => {
createWrapper({ user });
- expect(findUserName().exists()).toBe(true);
- expect(wrapper.text()).toContain(user.name);
- expect(wrapper.text()).toContain('(Busy)');
+ expect(wrapper.findByText('(Busy)').exists()).toBe(true);
});
it('should hide the busy status for any other status', () => {
@@ -258,13 +254,32 @@ describe('User Popover Component', () => {
createWrapper({ user });
- expect(wrapper.text()).not.toContain('(Busy)');
+ expect(wrapper.findByText('(Busy)').exists()).toBe(false);
});
- it('passes `pronouns` prop to `UserNameWithStatus` component', () => {
+ it('shows pronouns when user has them set', () => {
createWrapper();
- expect(findUserName().props('pronouns')).toBe('they/them');
+ expect(wrapper.findByText('(they/them)').exists()).toBe(true);
+ });
+
+ describe.each`
+ pronouns
+ ${undefined}
+ ${null}
+ ${''}
+ ${' '}
+ `('when pronouns are set to $pronouns', ({ pronouns }) => {
+ it('does not render pronouns', () => {
+ const user = {
+ ...DEFAULT_PROPS.user,
+ pronouns,
+ };
+
+ createWrapper({ user });
+
+ expect(wrapper.findByTestId('user-popover-pronouns').exists()).toBe(false);
+ });
});
});
diff --git a/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js b/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js
index 70017903079..80f14dffd08 100644
--- a/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js
+++ b/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js
@@ -39,6 +39,8 @@ describe('IssuableItem', () => {
const originalUrl = gon.gitlab_url;
let wrapper;
+ const findTimestampWrapper = () => wrapper.find('[data-testid="issuable-timestamp"]');
+
beforeEach(() => {
gon.gitlab_url = MOCK_GITLAB_URL;
});
@@ -150,12 +152,54 @@ describe('IssuableItem', () => {
});
});
- describe('updatedAt', () => {
- it('returns string containing timeago string based on `issuable.updatedAt`', () => {
+ describe('timestamp', () => {
+ it('returns timestamp based on `issuable.updatedAt` when the issue is open', () => {
wrapper = createComponent();
- expect(wrapper.vm.updatedAt).toContain('updated');
- expect(wrapper.vm.updatedAt).toContain('ago');
+ expect(findTimestampWrapper().attributes('title')).toBe('Sep 10, 2020 11:41am UTC');
+ });
+
+ it('returns timestamp based on `issuable.closedAt` when the issue is closed', () => {
+ wrapper = createComponent({
+ issuable: { ...mockIssuable, closedAt: '2020-06-18T11:30:00Z', state: 'closed' },
+ });
+
+ expect(findTimestampWrapper().attributes('title')).toBe('Jun 18, 2020 11:30am UTC');
+ });
+
+ it('returns timestamp based on `issuable.updatedAt` when the issue is closed but `issuable.closedAt` is undefined', () => {
+ wrapper = createComponent({
+ issuable: { ...mockIssuable, closedAt: undefined, state: 'closed' },
+ });
+
+ expect(findTimestampWrapper().attributes('title')).toBe('Sep 10, 2020 11:41am UTC');
+ });
+ });
+
+ describe('formattedTimestamp', () => {
+ it('returns timeago string based on `issuable.updatedAt` when the issue is open', () => {
+ wrapper = createComponent();
+
+ expect(findTimestampWrapper().text()).toContain('updated');
+ expect(findTimestampWrapper().text()).toContain('ago');
+ });
+
+ it('returns timeago string based on `issuable.closedAt` when the issue is closed', () => {
+ wrapper = createComponent({
+ issuable: { ...mockIssuable, closedAt: '2020-06-18T11:30:00Z', state: 'closed' },
+ });
+
+ expect(findTimestampWrapper().text()).toContain('closed');
+ expect(findTimestampWrapper().text()).toContain('ago');
+ });
+
+ it('returns timeago string based on `issuable.updatedAt` when the issue is closed but `issuable.closedAt` is undefined', () => {
+ wrapper = createComponent({
+ issuable: { ...mockIssuable, closedAt: undefined, state: 'closed' },
+ });
+
+ expect(findTimestampWrapper().text()).toContain('updated');
+ expect(findTimestampWrapper().text()).toContain('ago');
});
});
@@ -456,18 +500,31 @@ describe('IssuableItem', () => {
it('renders issuable updatedAt info', () => {
wrapper = createComponent();
- const updatedAtEl = wrapper.find('[data-testid="issuable-updated-at"]');
+ const timestampEl = wrapper.find('[data-testid="issuable-timestamp"]');
- expect(updatedAtEl.attributes('title')).toBe('Sep 10, 2020 11:41am UTC');
- expect(updatedAtEl.text()).toBe(wrapper.vm.updatedAt);
+ expect(timestampEl.attributes('title')).toBe('Sep 10, 2020 11:41am UTC');
+ expect(timestampEl.text()).toBe(wrapper.vm.formattedTimestamp);
});
describe('when issuable is closed', () => {
it('renders issuable card with a closed style', () => {
- wrapper = createComponent({ issuable: { ...mockIssuable, closedAt: '2020-12-10' } });
+ wrapper = createComponent({
+ issuable: { ...mockIssuable, closedAt: '2020-12-10', state: 'closed' },
+ });
expect(wrapper.classes()).toContain('closed');
});
+
+ it('renders issuable closedAt info and does not render updatedAt info', () => {
+ wrapper = createComponent({
+ issuable: { ...mockIssuable, closedAt: '2022-06-18T11:30:00Z', state: 'closed' },
+ });
+
+ const timestampEl = wrapper.find('[data-testid="issuable-timestamp"]');
+
+ expect(timestampEl.attributes('title')).toBe('Jun 18, 2022 11:30am UTC');
+ expect(timestampEl.text()).toBe(wrapper.vm.formattedTimestamp);
+ });
});
describe('when issuable was created within the past 24 hours', () => {
diff --git a/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js b/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js
index 66f71c0b028..50e79dbe589 100644
--- a/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js
+++ b/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js
@@ -9,6 +9,7 @@ import IssuableItem from '~/vue_shared/issuable/list/components/issuable_item.vu
import IssuableListRoot from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import IssuableTabs from '~/vue_shared/issuable/list/components/issuable_tabs.vue';
import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
+import PageSizeSelector from '~/vue_shared/components/page_size_selector.vue';
import { mockIssuableListProps, mockIssuables } from '../mock_data';
@@ -44,6 +45,7 @@ describe('IssuableListRoot', () => {
const findIssuableItem = () => wrapper.findComponent(IssuableItem);
const findIssuableTabs = () => wrapper.findComponent(IssuableTabs);
const findVueDraggable = () => wrapper.findComponent(VueDraggable);
+ const findPageSizeSelector = () => wrapper.findComponent(PageSizeSelector);
afterEach(() => {
wrapper.destroy();
@@ -292,6 +294,7 @@ describe('IssuableListRoot', () => {
});
expect(findGlKeysetPagination().exists()).toBe(false);
+ expect(findPageSizeSelector().exists()).toBe(false);
expect(findGlPagination().props()).toMatchObject({
perPage: 20,
value: 1,
@@ -483,4 +486,24 @@ describe('IssuableListRoot', () => {
});
});
});
+
+ describe('page size selector', () => {
+ beforeEach(() => {
+ wrapper = createComponent({
+ props: {
+ showPageSizeChangeControls: true,
+ },
+ });
+ });
+
+ it('has the page size change component', async () => {
+ expect(findPageSizeSelector().exists()).toBe(true);
+ });
+
+ it('emits "page-size-change" event when its input is changed', () => {
+ const pageSize = 123;
+ findPageSizeSelector().vm.$emit('input', pageSize);
+ expect(wrapper.emitted('page-size-change')).toEqual([[pageSize]]);
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js
index 5aa67667033..6f62fb77353 100644
--- a/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js
+++ b/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js
@@ -70,7 +70,7 @@ describe('IssuableTitle', () => {
expect(titleEl.exists()).toBe(true);
expect(titleEl.html()).toBe(
- '<h1 dir="auto" data-testid="title" class="title qa-title gl-font-size-h-display"><b>Sample</b> title</h1>',
+ '<h1 dir="auto" data-qa-selector="title_content" data-testid="title" class="title gl-font-size-h-display"><b>Sample</b> title</h1>',
);
wrapperWithTitle.destroy();
diff --git a/spec/frontend/work_items/components/item_title_spec.js b/spec/frontend/work_items/components/item_title_spec.js
index 2c3f6ef8634..a55f448c9a2 100644
--- a/spec/frontend/work_items/components/item_title_spec.js
+++ b/spec/frontend/work_items/components/item_title_spec.js
@@ -1,5 +1,4 @@
import { shallowMount } from '@vue/test-utils';
-import { escape } from 'lodash';
import ItemTitle from '~/work_items/components/item_title.vue';
jest.mock('lodash/escape', () => jest.fn((fn) => fn));
@@ -51,6 +50,5 @@ describe('ItemTitle', () => {
await findInputEl().trigger(sourceEvent);
expect(wrapper.emitted(eventName)).toBeTruthy();
- expect(escape).toHaveBeenCalledWith(mockUpdatedTitle);
});
});
diff --git a/spec/frontend/work_items/components/work_item_assignees_spec.js b/spec/frontend/work_items/components/work_item_assignees_spec.js
index 0552fe5050e..299949a4baa 100644
--- a/spec/frontend/work_items/components/work_item_assignees_spec.js
+++ b/spec/frontend/work_items/components/work_item_assignees_spec.js
@@ -1,52 +1,90 @@
-import { GlLink, GlTokenSelector } from '@gitlab/ui';
-import { nextTick } from 'vue';
+import { GlLink, GlTokenSelector, GlSkeletonLoader } from '@gitlab/ui';
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking } from 'helpers/tracking_helper';
+import { stripTypenames } from 'helpers/graphql_helpers';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
+import userSearchQuery from '~/graphql_shared/queries/users_search.query.graphql';
+import currentUserQuery from '~/graphql_shared/queries/current_user.query.graphql';
+import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue';
-import localUpdateWorkItemMutation from '~/work_items/graphql/local_update_work_item.mutation.graphql';
-
-const mockAssignees = [
- {
- __typename: 'UserCore',
- id: 'gid://gitlab/User/1',
- avatarUrl: '',
- webUrl: '',
- name: 'John Doe',
- username: 'doe_I',
- },
- {
- __typename: 'UserCore',
- id: 'gid://gitlab/User/2',
- avatarUrl: '',
- webUrl: '',
- name: 'Marcus Rutherford',
- username: 'ruthfull',
- },
-];
+import { i18n, TASK_TYPE_NAME, TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
+import { temporaryConfig, resolvers } from '~/work_items/graphql/provider';
+import {
+ projectMembersResponseWithCurrentUser,
+ mockAssignees,
+ workItemQueryResponse,
+ currentUserResponse,
+ currentUserNullResponse,
+ projectMembersResponseWithoutCurrentUser,
+} from '../mock_data';
-const workItemId = 'gid://gitlab/WorkItem/1';
+Vue.use(VueApollo);
-const mutate = jest.fn();
+const workItemId = 'gid://gitlab/WorkItem/1';
+const dropdownItems = projectMembersResponseWithCurrentUser.data.workspace.users.nodes;
describe('WorkItemAssignees component', () => {
let wrapper;
const findAssigneeLinks = () => wrapper.findAllComponents(GlLink);
const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
+ const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findEmptyState = () => wrapper.findByTestId('empty-state');
+ const findAssignSelfButton = () => wrapper.findByTestId('assign-self');
+ const findAssigneesTitle = () => wrapper.findByTestId('assignees-title');
+
+ const successSearchQueryHandler = jest
+ .fn()
+ .mockResolvedValue(projectMembersResponseWithCurrentUser);
+ const successCurrentUserQueryHandler = jest.fn().mockResolvedValue(currentUserResponse);
+ const noCurrentUserQueryHandler = jest.fn().mockResolvedValue(currentUserNullResponse);
+
+ const errorHandler = jest.fn().mockRejectedValue('Houston, we have a problem');
+
+ const createComponent = ({
+ assignees = mockAssignees,
+ searchQueryHandler = successSearchQueryHandler,
+ currentUserQueryHandler = successCurrentUserQueryHandler,
+ allowsMultipleAssignees = true,
+ canUpdate = true,
+ } = {}) => {
+ const apolloProvider = createMockApollo(
+ [
+ [userSearchQuery, searchQueryHandler],
+ [currentUserQuery, currentUserQueryHandler],
+ ],
+ resolvers,
+ {
+ typePolicies: temporaryConfig.cacheConfig.typePolicies,
+ },
+ );
+
+ apolloProvider.clients.defaultClient.writeQuery({
+ query: workItemQuery,
+ variables: {
+ id: workItemId,
+ },
+ data: workItemQueryResponse.data,
+ });
- const createComponent = ({ assignees = mockAssignees } = {}) => {
wrapper = mountExtended(WorkItemAssignees, {
+ provide: {
+ fullPath: 'test-project-path',
+ },
propsData: {
assignees,
workItemId,
- },
- mocks: {
- $apollo: {
- mutate,
- },
+ allowsMultipleAssignees,
+ workItemType: TASK_TYPE_NAME,
+ canUpdate,
},
attachTo: document.body,
+ apolloProvider,
});
};
@@ -54,39 +92,316 @@ describe('WorkItemAssignees component', () => {
wrapper.destroy();
});
- it('should pass the correct data-user-id attribute', () => {
+ it('passes the correct data-user-id attribute', () => {
createComponent();
expect(findAssigneeLinks().at(0).attributes('data-user-id')).toBe('1');
});
- describe('when there are assignees', () => {
+ it('container does not have shadow by default', () => {
+ createComponent();
+ expect(findTokenSelector().props('containerClass')).toBe('gl-shadow-none!');
+ });
+
+ it('container has shadow after focusing token selector', async () => {
+ createComponent();
+ findTokenSelector().vm.$emit('focus');
+ await nextTick();
+
+ expect(findTokenSelector().props('containerClass')).toBe('');
+ });
+
+ it('focuses token selector on token selector input event', async () => {
+ createComponent();
+ findTokenSelector().vm.$emit('input', [mockAssignees[0]]);
+ await nextTick();
+
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findTokenSelector().element.contains(document.activeElement)).toBe(true);
+ });
+
+ it('calls a mutation on clicking outside the token selector', async () => {
+ createComponent();
+ findTokenSelector().vm.$emit('input', [mockAssignees[0]]);
+ findTokenSelector().vm.$emit('blur', new FocusEvent({ relatedTarget: null }));
+ await waitForPromises();
+
+ expect(findTokenSelector().props('selectedTokens')).toEqual([mockAssignees[0]]);
+ });
+
+ it('passes `false` to `viewOnly` token selector prop if user can update assignees', () => {
+ createComponent();
+
+ expect(findTokenSelector().props('viewOnly')).toBe(false);
+ });
+
+ it('passes `true` to `viewOnly` token selector prop if user can not update assignees', () => {
+ createComponent({ canUpdate: false });
+
+ expect(findTokenSelector().props('viewOnly')).toBe(true);
+ });
+
+ describe('when searching for users', () => {
beforeEach(() => {
createComponent();
});
- it('should focus token selector on token removal', async () => {
- findTokenSelector().vm.$emit('token-remove', mockAssignees[0].id);
+ it('does not start user search by default', () => {
+ expect(findTokenSelector().props('loading')).toBe(false);
+ expect(findTokenSelector().props('dropdownItems')).toEqual([]);
+ });
+
+ it('starts user search on hovering for more than 250ms', async () => {
+ findTokenSelector().trigger('mouseover');
+ jest.advanceTimersByTime(DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
await nextTick();
- expect(findEmptyState().exists()).toBe(false);
- expect(findTokenSelector().element.contains(document.activeElement)).toBe(true);
+ expect(findTokenSelector().props('loading')).toBe(true);
});
- it('should call a mutation on clicking outside the token selector', async () => {
- findTokenSelector().vm.$emit('input', [mockAssignees[0]]);
- findTokenSelector().vm.$emit('token-remove');
+ it('starts user search on focusing token selector', async () => {
+ findTokenSelector().vm.$emit('focus');
await nextTick();
- expect(mutate).not.toHaveBeenCalled();
- findTokenSelector().vm.$emit('blur', new FocusEvent({ relatedTarget: null }));
+ expect(findTokenSelector().props('loading')).toBe(true);
+ });
+
+ it('does not start searching if token-selector was hovered for less than 250ms', async () => {
+ findTokenSelector().trigger('mouseover');
+ jest.advanceTimersByTime(100);
+ await nextTick();
+
+ expect(findTokenSelector().props('loading')).toBe(false);
+ });
+
+ it('does not start searching if cursor was moved out from token selector before 250ms passed', async () => {
+ findTokenSelector().trigger('mouseover');
+ jest.advanceTimersByTime(100);
+
+ findTokenSelector().trigger('mouseout');
+ jest.advanceTimersByTime(DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ await nextTick();
+
+ expect(findTokenSelector().props('loading')).toBe(false);
+ });
+
+ it('shows skeleton loader on dropdown when loading users', async () => {
+ findTokenSelector().vm.$emit('focus');
await nextTick();
- expect(mutate).toHaveBeenCalledWith({
- mutation: localUpdateWorkItemMutation,
- variables: {
- input: { id: workItemId, assigneeIds: [mockAssignees[0].id] },
- },
+ expect(findSkeletonLoader().exists()).toBe(true);
+ });
+
+ it('shows correct users list in dropdown when loaded', async () => {
+ findTokenSelector().vm.$emit('focus');
+ await nextTick();
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+
+ await waitForPromises();
+
+ expect(findSkeletonLoader().exists()).toBe(false);
+ expect(findTokenSelector().props('dropdownItems')).toHaveLength(2);
+ });
+
+ it('should search for users with correct key after text input', async () => {
+ const searchKey = 'Hello';
+
+ findTokenSelector().vm.$emit('focus');
+ findTokenSelector().vm.$emit('text-input', searchKey);
+ await waitForPromises();
+
+ expect(successSearchQueryHandler).toHaveBeenCalledWith(
+ expect.objectContaining({ search: searchKey }),
+ );
+ });
+ });
+
+ it('emits error event if search users query fails', async () => {
+ createComponent({ searchQueryHandler: errorHandler });
+ findTokenSelector().vm.$emit('focus');
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[i18n.fetchError]]);
+ });
+
+ describe('when assigning to current user', () => {
+ it('does not show `Assign myself` button if current user is loading', () => {
+ createComponent();
+ findTokenSelector().trigger('mouseover');
+
+ expect(findAssignSelfButton().exists()).toBe(false);
+ });
+
+ it('does not show `Assign myself` button if work item has assignees', async () => {
+ createComponent();
+ await waitForPromises();
+ findTokenSelector().trigger('mouseover');
+
+ expect(findAssignSelfButton().exists()).toBe(false);
+ });
+
+ it('does now show `Assign myself` button if user is not logged in', async () => {
+ createComponent({ currentUserQueryHandler: noCurrentUserQueryHandler, assignees: [] });
+ await waitForPromises();
+ findTokenSelector().trigger('mouseover');
+
+ expect(findAssignSelfButton().exists()).toBe(false);
+ });
+ });
+
+ describe('when user is logged in and there are no assignees', () => {
+ beforeEach(() => {
+ createComponent({ assignees: [] });
+ return waitForPromises();
+ });
+
+ it('renders `Assign myself` button', async () => {
+ findTokenSelector().trigger('mouseover');
+ expect(findAssignSelfButton().exists()).toBe(true);
+ });
+
+ it('calls update work item assignees mutation with current user as a variable on button click', () => {
+ // TODO: replace this test as soon as we have a real mutation implemented
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockImplementation(jest.fn());
+
+ findTokenSelector().trigger('mouseover');
+ findAssignSelfButton().vm.$emit('click', new MouseEvent('click'));
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith(
+ expect.objectContaining({
+ variables: {
+ input: {
+ assignees: [stripTypenames(currentUserResponse.data.currentUser)],
+ id: workItemId,
+ },
+ },
+ }),
+ );
+ });
+ });
+
+ it('moves current user to the top of dropdown items if user is a project member', async () => {
+ createComponent();
+ await waitForPromises();
+
+ expect(findTokenSelector().props('dropdownItems')[0]).toEqual(
+ expect.objectContaining({
+ ...stripTypenames(currentUserResponse.data.currentUser),
+ }),
+ );
+ });
+
+ describe('when current user is not in the list of project members', () => {
+ const searchQueryHandler = jest
+ .fn()
+ .mockResolvedValue(projectMembersResponseWithoutCurrentUser);
+
+ beforeEach(() => {
+ createComponent({ searchQueryHandler });
+ return waitForPromises();
+ });
+
+ it('adds current user to the top of dropdown items', () => {
+ expect(findTokenSelector().props('dropdownItems')[0]).toEqual(
+ stripTypenames(currentUserResponse.data.currentUser),
+ );
+ });
+
+ it('does not add current user if search is not empty', async () => {
+ findTokenSelector().vm.$emit('text-input', 'test');
+ await waitForPromises();
+
+ expect(findTokenSelector().props('dropdownItems')[0]).not.toEqual(
+ stripTypenames(currentUserResponse.data.currentUser),
+ );
+ });
+ });
+
+ it('has `Assignee` label when only one assignee is present', () => {
+ createComponent({ assignees: [mockAssignees[0]] });
+
+ expect(findAssigneesTitle().text()).toBe('Assignee');
+ });
+
+ it('has `Assignees` label if more than one assignee is present', () => {
+ createComponent();
+
+ expect(findAssigneesTitle().text()).toBe('Assignees');
+ });
+
+ describe('when multiple assignees are allowed', () => {
+ beforeEach(() => {
+ createComponent({ allowsMultipleAssignees: true, assignees: [] });
+ return waitForPromises();
+ });
+
+ it('has `Add assignees` text on placeholder', () => {
+ expect(findEmptyState().text()).toContain('Add assignees');
+ });
+
+ it('adds multiple assignees when token-selector provides multiple values', async () => {
+ findTokenSelector().vm.$emit('input', dropdownItems);
+ await nextTick();
+
+ expect(findTokenSelector().props('selectedTokens')).toHaveLength(2);
+ });
+ });
+
+ describe('when multiple assignees are not allowed', () => {
+ beforeEach(() => {
+ createComponent({ allowsMultipleAssignees: false, assignees: [] });
+ return waitForPromises();
+ });
+
+ it('has `Add assignee` text on placeholder', () => {
+ expect(findEmptyState().text()).toContain('Add assignee');
+ expect(findEmptyState().text()).not.toContain('Add assignees');
+ });
+
+ it('adds a single assignee token-selector provides multiple values', async () => {
+ findTokenSelector().vm.$emit('input', dropdownItems);
+ await nextTick();
+
+ expect(findTokenSelector().props('selectedTokens')).toHaveLength(1);
+ });
+
+ it('removes shadow after token-selector input', async () => {
+ findTokenSelector().vm.$emit('input', dropdownItems);
+ await nextTick();
+
+ expect(findTokenSelector().props('containerClass')).toBe('gl-shadow-none!');
+ });
+ });
+
+ describe('tracking', () => {
+ let trackingSpy;
+
+ beforeEach(() => {
+ createComponent();
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ afterEach(() => {
+ trackingSpy = null;
+ });
+
+ it('does not track updating assignees until token selector blur event', async () => {
+ findTokenSelector().vm.$emit('input', [mockAssignees[0]]);
+ await waitForPromises();
+
+ expect(trackingSpy).not.toHaveBeenCalled();
+ });
+
+ it('tracks editing the assignees on token selector blur', async () => {
+ findTokenSelector().vm.$emit('input', [mockAssignees[0]]);
+ findTokenSelector().vm.$emit('blur', new FocusEvent({ relatedTarget: null }));
+ await waitForPromises();
+
+ expect(trackingSpy).toHaveBeenCalledWith(TRACKING_CATEGORY_SHOW, 'updated_assignees', {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_assignees',
+ property: 'type_Task',
});
});
});
diff --git a/spec/frontend/work_items/components/work_item_detail_modal_spec.js b/spec/frontend/work_items/components/work_item_detail_modal_spec.js
index d55ba318e46..70b1261bdb7 100644
--- a/spec/frontend/work_items/components/work_item_detail_modal_spec.js
+++ b/spec/frontend/work_items/components/work_item_detail_modal_spec.js
@@ -66,6 +66,7 @@ describe('WorkItemDetailModal component', () => {
createComponent();
expect(findWorkItemDetail().props()).toEqual({
+ isModal: true,
workItemId: '1',
workItemParentId: '2',
});
@@ -98,6 +99,15 @@ describe('WorkItemDetailModal component', () => {
expect(wrapper.emitted('close')).toBeTruthy();
});
+ it('hides the modal when WorkItemDetail emits `close` event', () => {
+ createComponent();
+ const closeSpy = jest.spyOn(wrapper.vm.$refs.modal, 'hide');
+
+ findWorkItemDetail().vm.$emit('close');
+
+ expect(closeSpy).toHaveBeenCalled();
+ });
+
describe('delete work item', () => {
it('emits workItemDeleted and closes modal', async () => {
createComponent();
diff --git a/spec/frontend/work_items/components/work_item_information_spec.js b/spec/frontend/work_items/components/work_item_information_spec.js
new file mode 100644
index 00000000000..d5f6921c2bc
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_information_spec.js
@@ -0,0 +1,48 @@
+import { mount } from '@vue/test-utils';
+import { GlAlert, GlLink } from '@gitlab/ui';
+import WorkItemInformation from '~/work_items/components/work_item_information.vue';
+import { helpPagePath } from '~/helpers/help_page_helper';
+
+const createComponent = () => mount(WorkItemInformation);
+
+describe('Work item information alert', () => {
+ let wrapper;
+ const tasksHelpPath = helpPagePath('user/tasks');
+ const workItemsHelpPath = helpPagePath('development/work_items');
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findHelpLink = () => wrapper.findComponent(GlLink);
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('should be visible', () => {
+ expect(findAlert().exists()).toBe(true);
+ });
+
+ it('should emit `work-item-banner-dismissed` event when cross icon is clicked', () => {
+ findAlert().vm.$emit('dismiss');
+ expect(wrapper.emitted('work-item-banner-dismissed').length).toBe(1);
+ });
+
+ it('the alert variant should be tip', () => {
+ expect(findAlert().props('variant')).toBe('tip');
+ });
+
+ it('should have the correct text for primary button and link', () => {
+ expect(findAlert().props('title')).toBe(WorkItemInformation.i18n.tasksInformationTitle);
+ expect(findAlert().props('primaryButtonText')).toBe(
+ WorkItemInformation.i18n.learnTasksButtonText,
+ );
+ expect(findAlert().props('primaryButtonLink')).toBe(tasksHelpPath);
+ });
+
+ it('should have the correct link to work item link', () => {
+ expect(findHelpLink().exists()).toBe(true);
+ expect(findHelpLink().attributes('href')).toBe(workItemsHelpPath);
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_labels_spec.js b/spec/frontend/work_items/components/work_item_labels_spec.js
new file mode 100644
index 00000000000..1734b901d1a
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_labels_spec.js
@@ -0,0 +1,171 @@
+import { GlTokenSelector, GlSkeletonLoader } from '@gitlab/ui';
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
+import labelSearchQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/project_labels.query.graphql';
+import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
+import WorkItemLabels from '~/work_items/components/work_item_labels.vue';
+import { i18n } from '~/work_items/constants';
+import { temporaryConfig, resolvers } from '~/work_items/graphql/provider';
+import { projectLabelsResponse, mockLabels, workItemQueryResponse } from '../mock_data';
+
+Vue.use(VueApollo);
+
+const workItemId = 'gid://gitlab/WorkItem/1';
+
+describe('WorkItemLabels component', () => {
+ let wrapper;
+
+ const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
+ const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+
+ const findEmptyState = () => wrapper.findByTestId('empty-state');
+
+ const successSearchQueryHandler = jest.fn().mockResolvedValue(projectLabelsResponse);
+ const errorHandler = jest.fn().mockRejectedValue('Houston, we have a problem');
+
+ const createComponent = ({
+ labels = mockLabels,
+ canUpdate = true,
+ searchQueryHandler = successSearchQueryHandler,
+ } = {}) => {
+ const apolloProvider = createMockApollo([[labelSearchQuery, searchQueryHandler]], resolvers, {
+ typePolicies: temporaryConfig.cacheConfig.typePolicies,
+ });
+
+ apolloProvider.clients.defaultClient.writeQuery({
+ query: workItemQuery,
+ variables: {
+ id: workItemId,
+ },
+ data: workItemQueryResponse.data,
+ });
+
+ wrapper = mountExtended(WorkItemLabels, {
+ provide: {
+ fullPath: 'test-project-path',
+ },
+ propsData: {
+ labels,
+ workItemId,
+ canUpdate,
+ },
+ attachTo: document.body,
+ apolloProvider,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('focuses token selector on token selector input event', async () => {
+ createComponent();
+ findTokenSelector().vm.$emit('input', [mockLabels[0]]);
+ await nextTick();
+
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findTokenSelector().element.contains(document.activeElement)).toBe(true);
+ });
+
+ it('does not start search by default', () => {
+ createComponent();
+
+ expect(findTokenSelector().props('loading')).toBe(false);
+ expect(findTokenSelector().props('dropdownItems')).toEqual([]);
+ });
+
+ it('starts search on hovering for more than 250ms', async () => {
+ createComponent();
+ findTokenSelector().trigger('mouseover');
+ jest.advanceTimersByTime(DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ await nextTick();
+
+ expect(findTokenSelector().props('loading')).toBe(true);
+ });
+
+ it('starts search on focusing token selector', async () => {
+ createComponent();
+ findTokenSelector().vm.$emit('focus');
+ await nextTick();
+
+ expect(findTokenSelector().props('loading')).toBe(true);
+ });
+
+ it('does not start searching if token-selector was hovered for less than 250ms', async () => {
+ createComponent();
+ findTokenSelector().trigger('mouseover');
+ jest.advanceTimersByTime(100);
+ await nextTick();
+
+ expect(findTokenSelector().props('loading')).toBe(false);
+ });
+
+ it('does not start searching if cursor was moved out from token selector before 250ms passed', async () => {
+ createComponent();
+ findTokenSelector().trigger('mouseover');
+ jest.advanceTimersByTime(100);
+
+ findTokenSelector().trigger('mouseout');
+ jest.advanceTimersByTime(DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ await nextTick();
+
+ expect(findTokenSelector().props('loading')).toBe(false);
+ });
+
+ it('shows skeleton loader on dropdown when loading', async () => {
+ createComponent();
+ findTokenSelector().vm.$emit('focus');
+ await nextTick();
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+ });
+
+ it('shows list in dropdown when loaded', async () => {
+ createComponent();
+ findTokenSelector().vm.$emit('focus');
+ await nextTick();
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+
+ await waitForPromises();
+
+ expect(findSkeletonLoader().exists()).toBe(false);
+ expect(findTokenSelector().props('dropdownItems')).toHaveLength(2);
+ });
+
+ it.each([true, false])(
+ 'passes canUpdate=%s prop to view-only of token-selector',
+ async (canUpdate) => {
+ createComponent({ canUpdate });
+
+ await waitForPromises();
+
+ expect(findTokenSelector().props('viewOnly')).toBe(!canUpdate);
+ },
+ );
+
+ it('emits error event if search query fails', async () => {
+ createComponent({ searchQueryHandler: errorHandler });
+ findTokenSelector().vm.$emit('focus');
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[i18n.fetchError]]);
+ });
+
+ it('should search for with correct key after text input', async () => {
+ const searchKey = 'Hello';
+
+ createComponent();
+ findTokenSelector().vm.$emit('focus');
+ findTokenSelector().vm.$emit('text-input', searchKey);
+ await waitForPromises();
+
+ expect(successSearchQueryHandler).toHaveBeenCalledWith(
+ expect.objectContaining({ search: searchKey }),
+ );
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
new file mode 100644
index 00000000000..93bf7286aa7
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
@@ -0,0 +1,65 @@
+import Vue from 'vue';
+import { GlForm, GlFormCombobox } from '@gitlab/ui';
+import VueApollo from 'vue-apollo';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import WorkItemLinksForm from '~/work_items/components/work_item_links/work_item_links_form.vue';
+import projectWorkItemsQuery from '~/work_items/graphql/project_work_items.query.graphql';
+import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
+import { availableWorkItemsResponse, updateWorkItemMutationResponse } from '../../mock_data';
+
+Vue.use(VueApollo);
+
+describe('WorkItemLinksForm', () => {
+ let wrapper;
+
+ const updateMutationResolver = jest.fn().mockResolvedValue(updateWorkItemMutationResponse);
+
+ const createComponent = async ({ listResponse = availableWorkItemsResponse } = {}) => {
+ wrapper = shallowMountExtended(WorkItemLinksForm, {
+ apolloProvider: createMockApollo([
+ [projectWorkItemsQuery, jest.fn().mockResolvedValue(listResponse)],
+ [updateWorkItemMutation, updateMutationResolver],
+ ]),
+ propsData: { issuableGid: 'gid://gitlab/WorkItem/1' },
+ provide: {
+ projectPath: 'project/path',
+ },
+ });
+
+ await waitForPromises();
+ };
+
+ const findForm = () => wrapper.findComponent(GlForm);
+ const findCombobox = () => wrapper.findComponent(GlFormCombobox);
+ const findAddChildButton = () => wrapper.findByTestId('add-child-button');
+
+ beforeEach(async () => {
+ await createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders form', () => {
+ expect(findForm().exists()).toBe(true);
+ });
+
+ it('passes available work items as prop when typing in combobox', async () => {
+ findCombobox().vm.$emit('input', 'Task');
+ await waitForPromises();
+
+ expect(findCombobox().exists()).toBe(true);
+ expect(findCombobox().props('tokenList').length).toBe(2);
+ });
+
+ it('selects and add child', async () => {
+ findCombobox().vm.$emit('input', availableWorkItemsResponse.data.workspace.workItems.edges[0]);
+
+ findAddChildButton().vm.$emit('click');
+ await waitForPromises();
+ expect(updateMutationResolver).toHaveBeenCalled();
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_menu_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_menu_spec.js
new file mode 100644
index 00000000000..f8471b7f167
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_links/work_item_links_menu_spec.js
@@ -0,0 +1,141 @@
+import Vue from 'vue';
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { cloneDeep } from 'lodash';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import WorkItemLinksMenu from '~/work_items/components/work_item_links/work_item_links_menu.vue';
+import changeWorkItemParentMutation from '~/work_items/graphql/change_work_item_parent_link.mutation.graphql';
+import getWorkItemLinksQuery from '~/work_items/graphql/work_item_links.query.graphql';
+import { WIDGET_TYPE_HIERARCHY } from '~/work_items/constants';
+import { workItemHierarchyResponse, changeWorkItemParentMutationResponse } from '../../mock_data';
+
+Vue.use(VueApollo);
+
+const PARENT_ID = 'gid://gitlab/WorkItem/1';
+const WORK_ITEM_ID = 'gid://gitlab/WorkItem/3';
+
+describe('WorkItemLinksMenu', () => {
+ let wrapper;
+ let mockApollo;
+
+ const $toast = {
+ show: jest.fn(),
+ };
+
+ const createComponent = async ({
+ data = {},
+ mutationHandler = jest.fn().mockResolvedValue(changeWorkItemParentMutationResponse),
+ } = {}) => {
+ mockApollo = createMockApollo([
+ [getWorkItemLinksQuery, jest.fn().mockResolvedValue(workItemHierarchyResponse)],
+ [changeWorkItemParentMutation, mutationHandler],
+ ]);
+
+ mockApollo.clients.defaultClient.cache.writeQuery({
+ query: getWorkItemLinksQuery,
+ variables: {
+ id: PARENT_ID,
+ },
+ data: workItemHierarchyResponse.data,
+ });
+
+ wrapper = shallowMountExtended(WorkItemLinksMenu, {
+ data() {
+ return {
+ ...data,
+ };
+ },
+ propsData: {
+ workItemId: WORK_ITEM_ID,
+ parentWorkItemId: PARENT_ID,
+ },
+ apolloProvider: mockApollo,
+ mocks: {
+ $toast,
+ },
+ });
+
+ await waitForPromises();
+ };
+
+ const findDropdown = () => wrapper.find(GlDropdown);
+ const findRemoveDropdownItem = () => wrapper.find(GlDropdownItem);
+
+ beforeEach(async () => {
+ await createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ mockApollo = null;
+ });
+
+ it('renders dropdown and dropdown items', () => {
+ expect(findDropdown().exists()).toBe(true);
+ expect(findRemoveDropdownItem().exists()).toBe(true);
+ });
+
+ it('calls correct mutation with correct variables', async () => {
+ const mutationHandler = jest.fn().mockResolvedValue(changeWorkItemParentMutationResponse);
+
+ createComponent({ mutationHandler });
+
+ findRemoveDropdownItem().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(mutationHandler).toHaveBeenCalledWith({
+ id: WORK_ITEM_ID,
+ parentId: null,
+ });
+ });
+
+ it('shows toast when mutation succeeds', async () => {
+ const mutationHandler = jest.fn().mockResolvedValue(changeWorkItemParentMutationResponse);
+
+ createComponent({ mutationHandler });
+
+ findRemoveDropdownItem().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect($toast.show).toHaveBeenCalledWith('Child removed', {
+ action: { onClick: expect.anything(), text: 'Undo' },
+ });
+ });
+
+ it('updates the cache when mutation succeeds', async () => {
+ const mutationHandler = jest.fn().mockResolvedValue(changeWorkItemParentMutationResponse);
+
+ createComponent({ mutationHandler });
+
+ mockApollo.clients.defaultClient.cache.readQuery = jest.fn(
+ () => workItemHierarchyResponse.data,
+ );
+
+ mockApollo.clients.defaultClient.cache.writeQuery = jest.fn();
+
+ findRemoveDropdownItem().vm.$emit('click');
+
+ await waitForPromises();
+
+ // Remove the work item from parent's children
+ const resp = cloneDeep(workItemHierarchyResponse);
+ const index = resp.data.workItem.widgets
+ .find((widget) => widget.type === WIDGET_TYPE_HIERARCHY)
+ .children.nodes.findIndex((child) => child.id === WORK_ITEM_ID);
+ resp.data.workItem.widgets
+ .find((widget) => widget.type === WIDGET_TYPE_HIERARCHY)
+ .children.nodes.splice(index, 1);
+
+ expect(mockApollo.clients.defaultClient.cache.writeQuery).toHaveBeenCalledWith(
+ expect.objectContaining({
+ query: expect.anything(),
+ variables: { id: PARENT_ID },
+ data: resp.data,
+ }),
+ );
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js
index 774e9198992..2ec9b1ec0ac 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js
@@ -51,6 +51,20 @@ describe('WorkItemLinks', () => {
expect(findLinksBody().exists()).toBe(false);
});
+ describe('add link form', () => {
+ it('displays form on click add button and hides form on cancel', async () => {
+ findToggleAddFormButton().vm.$emit('click');
+ await nextTick();
+
+ expect(findAddLinksForm().exists()).toBe(true);
+
+ findAddLinksForm().vm.$emit('cancel');
+ await nextTick();
+
+ expect(findAddLinksForm().exists()).toBe(false);
+ });
+ });
+
describe('when no child links', () => {
beforeEach(async () => {
await createComponent({ response: workItemHierarchyEmptyResponse });
@@ -59,22 +73,6 @@ describe('WorkItemLinks', () => {
it('displays empty state if there are no children', () => {
expect(findEmptyState().exists()).toBe(true);
});
-
- describe('add link form', () => {
- it('displays form on click add button and hides form on cancel', async () => {
- expect(findEmptyState().exists()).toBe(true);
-
- findToggleAddFormButton().vm.$emit('click');
- await nextTick();
-
- expect(findAddLinksForm().exists()).toBe(true);
-
- findAddLinksForm().vm.$emit('cancel');
- await nextTick();
-
- expect(findAddLinksForm().exists()).toBe(false);
- });
- });
});
it('renders all hierarchy widget children', () => {
diff --git a/spec/frontend/work_items/components/work_item_weight_spec.js b/spec/frontend/work_items/components/work_item_weight_spec.js
index 80a1d032ad7..c3bbea26cda 100644
--- a/spec/frontend/work_items/components/work_item_weight_spec.js
+++ b/spec/frontend/work_items/components/work_item_weight_spec.js
@@ -1,21 +1,51 @@
-import { shallowMount } from '@vue/test-utils';
+import { GlForm, GlFormInput } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { mockTracking } from 'helpers/tracking_helper';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { __ } from '~/locale';
import WorkItemWeight from '~/work_items/components/work_item_weight.vue';
+import { TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
+import localUpdateWorkItemMutation from '~/work_items/graphql/local_update_work_item.mutation.graphql';
-describe('WorkItemAssignees component', () => {
+describe('WorkItemWeight component', () => {
let wrapper;
- const createComponent = ({ weight, hasIssueWeightsFeature = true } = {}) => {
- wrapper = shallowMount(WorkItemWeight, {
+ const mutateSpy = jest.fn();
+ const workItemId = 'gid://gitlab/WorkItem/1';
+ const workItemType = 'Task';
+
+ const findForm = () => wrapper.findComponent(GlForm);
+ const findInput = () => wrapper.findComponent(GlFormInput);
+
+ const createComponent = ({
+ canUpdate = false,
+ hasIssueWeightsFeature = true,
+ isEditing = false,
+ weight,
+ } = {}) => {
+ wrapper = mountExtended(WorkItemWeight, {
propsData: {
+ canUpdate,
weight,
+ workItemId,
+ workItemType,
},
provide: {
hasIssueWeightsFeature,
},
+ mocks: {
+ $apollo: {
+ mutate: mutateSpy,
+ },
+ },
});
+
+ if (isEditing) {
+ findInput().vm.$emit('focus');
+ }
};
- describe('weight licensed feature', () => {
+ describe('`issue_weights` licensed feature', () => {
describe.each`
description | hasIssueWeightsFeature | exists
${'when available'} | ${true} | ${true}
@@ -24,23 +54,111 @@ describe('WorkItemAssignees component', () => {
it(hasIssueWeightsFeature ? 'renders component' : 'does not render component', () => {
createComponent({ hasIssueWeightsFeature });
- expect(wrapper.find('div').exists()).toBe(exists);
+ expect(findForm().exists()).toBe(exists);
});
});
});
- describe('weight text', () => {
- describe.each`
- description | weight | text
- ${'renders 1'} | ${1} | ${'1'}
- ${'renders 0'} | ${0} | ${'0'}
- ${'renders None'} | ${null} | ${'None'}
- ${'renders None'} | ${undefined} | ${'None'}
- `('when weight is $weight', ({ description, weight, text }) => {
- it(description, () => {
- createComponent({ weight });
-
- expect(wrapper.text()).toContain(text);
+ describe('weight input', () => {
+ it('has "Weight" label', () => {
+ createComponent();
+
+ expect(wrapper.findByLabelText(__('Weight')).exists()).toBe(true);
+ });
+
+ describe('placeholder attribute', () => {
+ describe.each`
+ description | isEditing | canUpdate | value
+ ${'when not editing and cannot update'} | ${false} | ${false} | ${__('None')}
+ ${'when editing and cannot update'} | ${true} | ${false} | ${__('None')}
+ ${'when not editing and can update'} | ${false} | ${true} | ${__('None')}
+ ${'when editing and can update'} | ${true} | ${true} | ${__('Enter a number')}
+ `('$description', ({ isEditing, canUpdate, value }) => {
+ it(`has a value of "${value}"`, async () => {
+ createComponent({ canUpdate, isEditing });
+ await nextTick();
+
+ expect(findInput().attributes('placeholder')).toBe(value);
+ });
+ });
+ });
+
+ describe('readonly attribute', () => {
+ describe.each`
+ description | canUpdate | value
+ ${'when cannot update'} | ${false} | ${'readonly'}
+ ${'when can update'} | ${true} | ${undefined}
+ `('$description', ({ canUpdate, value }) => {
+ it(`renders readonly=${value}`, () => {
+ createComponent({ canUpdate });
+
+ expect(findInput().attributes('readonly')).toBe(value);
+ });
+ });
+ });
+
+ describe('type attribute', () => {
+ describe.each`
+ description | isEditing | canUpdate | type
+ ${'when not editing and cannot update'} | ${false} | ${false} | ${'text'}
+ ${'when editing and cannot update'} | ${true} | ${false} | ${'text'}
+ ${'when not editing and can update'} | ${false} | ${true} | ${'text'}
+ ${'when editing and can update'} | ${true} | ${true} | ${'number'}
+ `('$description', ({ isEditing, canUpdate, type }) => {
+ it(`has a value of "${type}"`, async () => {
+ createComponent({ canUpdate, isEditing });
+ await nextTick();
+
+ expect(findInput().attributes('type')).toBe(type);
+ });
+ });
+ });
+
+ describe('value attribute', () => {
+ describe.each`
+ weight | value
+ ${1} | ${'1'}
+ ${0} | ${'0'}
+ ${null} | ${''}
+ ${undefined} | ${''}
+ `('when `weight` prop is "$weight"', ({ weight, value }) => {
+ it(`value is "${value}"`, () => {
+ createComponent({ weight });
+
+ expect(findInput().element.value).toBe(value);
+ });
+ });
+ });
+
+ describe('when blurred', () => {
+ it('calls a mutation to update the weight', () => {
+ const weight = 0;
+ createComponent({ isEditing: true, weight });
+
+ findInput().trigger('blur');
+
+ expect(mutateSpy).toHaveBeenCalledWith({
+ mutation: localUpdateWorkItemMutation,
+ variables: {
+ input: {
+ id: workItemId,
+ weight,
+ },
+ },
+ });
+ });
+
+ it('tracks updating the weight', () => {
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ createComponent();
+
+ findInput().trigger('blur');
+
+ expect(trackingSpy).toHaveBeenCalledWith(TRACKING_CATEGORY_SHOW, 'updated_weight', {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_weight',
+ property: 'type_Task',
+ });
});
});
});
diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js
index bf3f4e1364d..0359caf7116 100644
--- a/spec/frontend/work_items/mock_data.js
+++ b/spec/frontend/work_items/mock_data.js
@@ -1,3 +1,22 @@
+export const mockAssignees = [
+ {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/1',
+ avatarUrl: '',
+ webUrl: '',
+ name: 'John Doe',
+ username: 'doe_I',
+ },
+ {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/2',
+ avatarUrl: '',
+ webUrl: '',
+ name: 'Marcus Rutherford',
+ username: 'ruthfull',
+ },
+];
+
export const workItemQueryResponse = {
data: {
workItem: {
@@ -23,6 +42,32 @@ export const workItemQueryResponse = {
descriptionHtml:
'<p data-sourcepos="1:1-1:19" dir="auto">some <strong>great</strong> text</p>',
},
+ {
+ __typename: 'WorkItemWidgetAssignees',
+ type: 'ASSIGNEES',
+ allowsMultipleAssignees: true,
+ assignees: {
+ nodes: mockAssignees,
+ },
+ },
+ {
+ __typename: 'WorkItemWidgetHierarchy',
+ type: 'HIERARCHY',
+ parent: {
+ id: 'gid://gitlab/Issue/1',
+ iid: '5',
+ title: 'Parent title',
+ },
+ children: {
+ edges: [
+ {
+ node: {
+ id: 'gid://gitlab/WorkItem/444',
+ },
+ },
+ ],
+ },
+ },
],
},
},
@@ -47,13 +92,28 @@ export const updateWorkItemMutationResponse = {
deleteWorkItem: false,
updateWorkItem: false,
},
- widgets: [],
+ widgets: [
+ {
+ children: {
+ edges: [
+ {
+ node: 'gid://gitlab/WorkItem/444',
+ },
+ ],
+ },
+ },
+ ],
},
},
},
};
-export const workItemResponseFactory = ({ canUpdate } = {}) => ({
+export const workItemResponseFactory = ({
+ canUpdate = false,
+ allowsMultipleAssignees = true,
+ assigneesWidgetPresent = true,
+ parent = null,
+} = {}) => ({
data: {
workItem: {
__typename: 'WorkItem',
@@ -78,6 +138,30 @@ export const workItemResponseFactory = ({ canUpdate } = {}) => ({
descriptionHtml:
'<p data-sourcepos="1:1-1:19" dir="auto">some <strong>great</strong> text</p>',
},
+ assigneesWidgetPresent
+ ? {
+ __typename: 'WorkItemWidgetAssignees',
+ type: 'ASSIGNEES',
+ allowsMultipleAssignees,
+ assignees: {
+ nodes: mockAssignees,
+ },
+ }
+ : { type: 'MOCK TYPE' },
+ {
+ __typename: 'WorkItemWidgetHierarchy',
+ type: 'HIERARCHY',
+ children: {
+ edges: [
+ {
+ node: {
+ id: 'gid://gitlab/WorkItem/444',
+ },
+ },
+ ],
+ },
+ parent,
+ },
],
},
},
@@ -140,13 +224,45 @@ export const createWorkItemFromTaskMutationResponse = {
__typename: 'WorkItemCreateFromTaskPayload',
errors: [],
workItem: {
- descriptionHtml: '<p>New description</p>',
- id: 'gid://gitlab/WorkItem/13',
__typename: 'WorkItem',
+ description: 'New description',
+ id: 'gid://gitlab/WorkItem/1',
+ title: 'Updated title',
+ state: 'OPEN',
+ workItemType: {
+ __typename: 'WorkItemType',
+ id: 'gid://gitlab/WorkItems::Type/5',
+ name: 'Task',
+ },
userPermissions: {
deleteWorkItem: false,
updateWorkItem: false,
},
+ widgets: [
+ {
+ __typename: 'WorkItemWidgetDescription',
+ type: 'DESCRIPTION',
+ description: 'New description',
+ descriptionHtml: '<p>New description</p>',
+ },
+ ],
+ },
+ newWorkItem: {
+ __typename: 'WorkItem',
+ id: 'gid://gitlab/WorkItem/1000000',
+ title: 'Updated title',
+ state: 'OPEN',
+ description: '',
+ workItemType: {
+ __typename: 'WorkItemType',
+ id: 'gid://gitlab/WorkItems::Type/5',
+ name: 'Task',
+ },
+ userPermissions: {
+ deleteWorkItem: false,
+ updateWorkItem: false,
+ },
+ widgets: [],
},
},
},
@@ -275,3 +391,171 @@ export const workItemHierarchyResponse = {
},
},
};
+
+export const changeWorkItemParentMutationResponse = {
+ data: {
+ workItemUpdate: {
+ workItem: {
+ id: 'gid://gitlab/WorkItem/2',
+ workItemType: {
+ id: 'gid://gitlab/WorkItems::Type/5',
+ __typename: 'WorkItemType',
+ },
+ title: 'Foo',
+ state: 'OPEN',
+ __typename: 'WorkItem',
+ },
+ errors: [],
+ __typename: 'WorkItemUpdatePayload',
+ },
+ },
+};
+
+export const availableWorkItemsResponse = {
+ data: {
+ workspace: {
+ __typename: 'Project',
+ id: 'gid://gitlab/Project/2',
+ workItems: {
+ edges: [
+ {
+ node: {
+ id: 'gid://gitlab/WorkItem/458',
+ title: 'Task 1',
+ state: 'OPEN',
+ },
+ },
+ {
+ node: {
+ id: 'gid://gitlab/WorkItem/459',
+ title: 'Task 2',
+ state: 'OPEN',
+ },
+ },
+ ],
+ },
+ },
+ },
+};
+
+export const projectMembersResponseWithCurrentUser = {
+ data: {
+ workspace: {
+ id: '1',
+ __typename: 'Project',
+ users: {
+ nodes: [
+ {
+ id: 'user-2',
+ user: {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/5',
+ avatarUrl: '/avatar2',
+ name: 'rookie',
+ username: 'rookie',
+ webUrl: 'rookie',
+ status: null,
+ },
+ },
+ {
+ id: 'user-1',
+ user: {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/1',
+ avatarUrl:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: '/root',
+ status: null,
+ },
+ },
+ ],
+ },
+ },
+ },
+};
+
+export const projectMembersResponseWithoutCurrentUser = {
+ data: {
+ workspace: {
+ id: '1',
+ __typename: 'Project',
+ users: {
+ nodes: [
+ {
+ id: 'user-2',
+ user: {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/5',
+ avatarUrl: '/avatar2',
+ name: 'rookie',
+ username: 'rookie',
+ webUrl: 'rookie',
+ status: null,
+ },
+ },
+ ],
+ },
+ },
+ },
+};
+
+export const currentUserResponse = {
+ data: {
+ currentUser: {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/1',
+ avatarUrl:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: '/root',
+ },
+ },
+};
+
+export const currentUserNullResponse = {
+ data: {
+ currentUser: null,
+ },
+};
+
+export const mockLabels = [
+ {
+ __typename: 'Label',
+ id: 'gid://gitlab/Label/1',
+ title: 'Label 1',
+ description: '',
+ color: '#f00',
+ textColor: '#00f',
+ },
+ {
+ __typename: 'Label',
+ id: 'gid://gitlab/Label/2',
+ title: 'Label 2',
+ description: '',
+ color: '#b00',
+ textColor: '#00b',
+ },
+];
+
+export const projectLabelsResponse = {
+ data: {
+ workspace: {
+ id: '1',
+ __typename: 'Project',
+ labels: {
+ nodes: mockLabels,
+ },
+ },
+ },
+};
+
+export const mockParent = {
+ parent: {
+ id: 'gid://gitlab/Issue/1',
+ iid: '5',
+ title: 'Parent title',
+ },
+};
diff --git a/spec/frontend/work_items/pages/create_work_item_spec.js b/spec/frontend/work_items/pages/create_work_item_spec.js
index e89477ed599..fed8be3783a 100644
--- a/spec/frontend/work_items/pages/create_work_item_spec.js
+++ b/spec/frontend/work_items/pages/create_work_item_spec.js
@@ -9,11 +9,7 @@ import ItemTitle from '~/work_items/components/item_title.vue';
import projectWorkItemTypesQuery from '~/work_items/graphql/project_work_item_types.query.graphql';
import createWorkItemMutation from '~/work_items/graphql/create_work_item.mutation.graphql';
import createWorkItemFromTaskMutation from '~/work_items/graphql/create_work_item_from_task.mutation.graphql';
-import {
- projectWorkItemTypesQueryResponse,
- createWorkItemMutationResponse,
- createWorkItemFromTaskMutationResponse,
-} from '../mock_data';
+import { projectWorkItemTypesQueryResponse, createWorkItemMutationResponse } from '../mock_data';
jest.mock('~/lib/utils/uuids', () => ({ uuids: () => ['testuuid'] }));
@@ -25,9 +21,6 @@ describe('Create work item component', () => {
const querySuccessHandler = jest.fn().mockResolvedValue(projectWorkItemTypesQueryResponse);
const createWorkItemSuccessHandler = jest.fn().mockResolvedValue(createWorkItemMutationResponse);
- const createWorkItemFromTaskSuccessHandler = jest
- .fn()
- .mockResolvedValue(createWorkItemFromTaskMutationResponse);
const errorHandler = jest.fn().mockRejectedValue('Houston, we have a problem');
const findAlert = () => wrapper.findComponent(GlAlert);
@@ -122,49 +115,6 @@ describe('Create work item component', () => {
});
});
- describe('when displayed in a modal', () => {
- beforeEach(() => {
- createComponent({
- props: {
- isModal: true,
- },
- mutationHandler: createWorkItemFromTaskSuccessHandler,
- });
- });
-
- it('emits `closeModal` event on Cancel button click', () => {
- findCancelButton().vm.$emit('click');
-
- expect(wrapper.emitted('closeModal')).toEqual([[]]);
- });
-
- it('emits `onCreate` on successful mutation', async () => {
- findTitleInput().vm.$emit('title-input', 'Test title');
-
- wrapper.find('form').trigger('submit');
- await waitForPromises();
-
- expect(wrapper.emitted('onCreate')).toEqual([['<p>New description</p>']]);
- });
-
- it('does not right margin for create button', () => {
- expect(findCreateButton().classes()).not.toContain('gl-mr-3');
- });
-
- it('adds right margin for cancel button', () => {
- expect(findCancelButton().classes()).toContain('gl-mr-3');
- });
-
- it('adds padding for content', () => {
- expect(findContent().classes('gl-px-5')).toBe(true);
- });
-
- it('defaults type to `Task`', async () => {
- await waitForPromises();
- expect(findSelect().attributes('value')).toBe('gid://gitlab/WorkItems::Type/3');
- });
- });
-
it('displays a loading icon inside dropdown when work items query is loading', () => {
createComponent();
diff --git a/spec/frontend/work_items/pages/work_item_detail_spec.js b/spec/frontend/work_items/pages/work_item_detail_spec.js
index b9724034cb4..43869468ad0 100644
--- a/spec/frontend/work_items/pages/work_item_detail_spec.js
+++ b/spec/frontend/work_items/pages/work_item_detail_spec.js
@@ -1,26 +1,36 @@
-import { GlAlert, GlSkeletonLoader } from '@gitlab/ui';
+import { GlAlert, GlSkeletonLoader, GlButton } 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 LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
import WorkItemDescription from '~/work_items/components/work_item_description.vue';
import WorkItemState from '~/work_items/components/work_item_state.vue';
import WorkItemTitle from '~/work_items/components/work_item_title.vue';
import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue';
+import WorkItemLabels from '~/work_items/components/work_item_labels.vue';
import WorkItemWeight from '~/work_items/components/work_item_weight.vue';
+import WorkItemInformation from '~/work_items/components/work_item_information.vue';
import { i18n } from '~/work_items/constants';
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
import workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql';
import { temporaryConfig } from '~/work_items/graphql/provider';
-import { workItemTitleSubscriptionResponse, workItemQueryResponse } from '../mock_data';
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+import {
+ workItemTitleSubscriptionResponse,
+ workItemResponseFactory,
+ mockParent,
+} from '../mock_data';
describe('WorkItemDetail component', () => {
let wrapper;
+ useLocalStorageSpy();
Vue.use(VueApollo);
+ const workItemQueryResponse = workItemResponseFactory();
const successHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
const initialSubscriptionHandler = jest.fn().mockResolvedValue(workItemTitleSubscriptionResponse);
@@ -30,9 +40,17 @@ describe('WorkItemDetail component', () => {
const findWorkItemState = () => wrapper.findComponent(WorkItemState);
const findWorkItemDescription = () => wrapper.findComponent(WorkItemDescription);
const findWorkItemAssignees = () => wrapper.findComponent(WorkItemAssignees);
+ const findWorkItemLabels = () => wrapper.findComponent(WorkItemLabels);
const findWorkItemWeight = () => wrapper.findComponent(WorkItemWeight);
+ const findParent = () => wrapper.find('[data-testid="work-item-parent"]');
+ const findParentButton = () => findParent().findComponent(GlButton);
+ const findCloseButton = () => wrapper.find('[data-testid="work-item-close"]');
+ const findWorkItemType = () => wrapper.find('[data-testid="work-item-type"]');
+ const findWorkItemInformationAlert = () => wrapper.findComponent(WorkItemInformation);
+ const findLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
const createComponent = ({
+ isModal = false,
workItemId = workItemQueryResponse.data.workItem.id,
handler = successHandler,
subscriptionHandler = initialSubscriptionHandler,
@@ -50,7 +68,7 @@ describe('WorkItemDetail component', () => {
typePolicies: includeWidgets ? temporaryConfig.cacheConfig.typePolicies : {},
},
),
- propsData: { workItemId },
+ propsData: { isModal, workItemId },
provide: {
glFeatures: {
workItemsMvc2: workItemsMvc2Enabled,
@@ -98,6 +116,36 @@ describe('WorkItemDetail component', () => {
});
});
+ describe('close button', () => {
+ describe('when isModal prop is false', () => {
+ it('does not render', async () => {
+ createComponent({ isModal: false });
+ await waitForPromises();
+
+ expect(findCloseButton().exists()).toBe(false);
+ });
+ });
+
+ describe('when isModal prop is true', () => {
+ it('renders', async () => {
+ createComponent({ isModal: true });
+ await waitForPromises();
+
+ expect(findCloseButton().props('icon')).toBe('close');
+ expect(findCloseButton().attributes('aria-label')).toBe('Close');
+ });
+
+ it('emits `close` event when clicked', async () => {
+ createComponent({ isModal: true });
+ await waitForPromises();
+
+ findCloseButton().vm.$emit('click');
+
+ expect(wrapper.emitted('close')).toEqual([[]]);
+ });
+ });
+ });
+
describe('description', () => {
it('does not show description widget if loading description fails', () => {
createComponent();
@@ -107,13 +155,56 @@ describe('WorkItemDetail component', () => {
it('shows description widget if description loads', async () => {
createComponent();
-
await waitForPromises();
expect(findWorkItemDescription().exists()).toBe(true);
});
});
+ describe('secondary breadcrumbs', () => {
+ it('does not show secondary breadcrumbs by default', () => {
+ createComponent();
+
+ expect(findParent().exists()).toBe(false);
+ });
+
+ it('does not show secondary breadcrumbs if there is not a parent', async () => {
+ createComponent();
+
+ await waitForPromises();
+
+ expect(findParent().exists()).toBe(false);
+ });
+
+ it('shows work item type if there is not a parent', async () => {
+ createComponent();
+
+ await waitForPromises();
+ expect(findWorkItemType().exists()).toBe(true);
+ });
+
+ describe('with parent', () => {
+ beforeEach(() => {
+ const parentResponse = workItemResponseFactory(mockParent);
+ createComponent({ handler: jest.fn().mockResolvedValue(parentResponse) });
+
+ return waitForPromises();
+ });
+
+ it('shows secondary breadcrumbs if there is a parent', () => {
+ expect(findParent().exists()).toBe(true);
+ });
+
+ it('does not show work item type', async () => {
+ expect(findWorkItemType().exists()).toBe(false);
+ });
+
+ it('sets the parent breadcrumb URL', () => {
+ expect(findParentButton().attributes().href).toBe('../../issues/5');
+ });
+ });
+ });
+
it('shows an error message when the work item query was unsuccessful', async () => {
const errorHandler = jest.fn().mockRejectedValue('Oops');
createComponent({ handler: errorHandler });
@@ -145,7 +236,6 @@ describe('WorkItemDetail component', () => {
it('renders assignees component when assignees widget is returned from the API', async () => {
createComponent({
workItemsMvc2Enabled: true,
- includeWidgets: true,
});
await waitForPromises();
@@ -155,7 +245,9 @@ describe('WorkItemDetail component', () => {
it('does not render assignees component when assignees widget is not returned from the API', async () => {
createComponent({
workItemsMvc2Enabled: true,
- includeWidgets: false,
+ handler: jest
+ .fn()
+ .mockResolvedValue(workItemResponseFactory({ assigneesWidgetPresent: false })),
});
await waitForPromises();
@@ -170,6 +262,19 @@ describe('WorkItemDetail component', () => {
expect(findWorkItemAssignees().exists()).toBe(false);
});
+ describe('labels widget', () => {
+ it.each`
+ description | includeWidgets | exists
+ ${'renders when widget is returned from API'} | ${true} | ${true}
+ ${'does not render when widget is not returned from API'} | ${false} | ${false}
+ `('$description', async ({ includeWidgets, exists }) => {
+ createComponent({ includeWidgets, workItemsMvc2Enabled: true });
+ await waitForPromises();
+
+ expect(findWorkItemLabels().exists()).toBe(exists);
+ });
+ });
+
describe('weight widget', () => {
describe('when work_items_mvc_2 feature flag is enabled', () => {
describe.each`
@@ -201,4 +306,22 @@ describe('WorkItemDetail component', () => {
});
});
});
+
+ describe('work item information', () => {
+ beforeEach(() => {
+ createComponent();
+ return waitForPromises();
+ });
+
+ it('is visible when viewed for the first time and sets localStorage value', async () => {
+ localStorage.clear();
+ expect(findWorkItemInformationAlert().exists()).toBe(true);
+ expect(findLocalStorageSync().props('value')).toBe(true);
+ });
+
+ it('is not visible after reading local storage input', async () => {
+ await findLocalStorageSync().vm.$emit('input', false);
+ expect(findWorkItemInformationAlert().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/work_items/pages/work_item_root_spec.js b/spec/frontend/work_items/pages/work_item_root_spec.js
index 3c5da94114e..d9372f2bcf0 100644
--- a/spec/frontend/work_items/pages/work_item_root_spec.js
+++ b/spec/frontend/work_items/pages/work_item_root_spec.js
@@ -52,6 +52,7 @@ describe('Work items root component', () => {
createComponent();
expect(findWorkItemDetail().props()).toEqual({
+ isModal: false,
workItemId: 'gid://gitlab/WorkItem/1',
workItemParentId: null,
});
diff --git a/spec/frontend_integration/diffs/diffs_interopability_spec.js b/spec/frontend_integration/diffs/diffs_interopability_spec.js
index 064e3d21180..8e9bc4f0a5f 100644
--- a/spec/frontend_integration/diffs/diffs_interopability_spec.js
+++ b/spec/frontend_integration/diffs/diffs_interopability_spec.js
@@ -1,6 +1,7 @@
import { waitFor } from '@testing-library/dom';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import initDiffsApp from '~/diffs';
import { createStore } from '~/mr_notes/stores';
import {
@@ -74,6 +75,10 @@ const startDiffsApp = () => {
describe('diffs third party interoperability', () => {
let vm;
+ beforeEach(() => {
+ stubPerformanceWebAPI();
+ });
+
afterEach(() => {
vm.$destroy();
document.body.innerHTML = '';
diff --git a/spec/frontend_integration/ide/ide_integration_spec.js b/spec/frontend_integration/ide/ide_integration_spec.js
index a002ce91deb..da48c600764 100644
--- a/spec/frontend_integration/ide/ide_integration_spec.js
+++ b/spec/frontend_integration/ide/ide_integration_spec.js
@@ -3,8 +3,9 @@ import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { setTestTimeout } from 'helpers/timeout';
import waitForPromises from 'helpers/wait_for_promises';
import { waitForText } from 'helpers/wait_for_text';
-import { createCommitId } from 'test_helpers/factories/commit_id';
import { useOverclockTimers } from 'test_helpers/utils/overclock_timers';
+import { createCommitId } from 'test_helpers/factories/commit_id';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import * as ideHelper from './helpers/ide_helper';
import startWebIDE from './helpers/start';
@@ -15,6 +16,7 @@ describe('WebIDE', () => {
let container;
beforeEach(() => {
+ stubPerformanceWebAPI();
// For some reason these tests were timing out in CI.
// We will investigate in https://gitlab.com/gitlab-org/gitlab/-/issues/298714
setTestTimeout(20000);
diff --git a/spec/frontend_integration/ide/user_opens_file_spec.js b/spec/frontend_integration/ide/user_opens_file_spec.js
index c3131f6ad45..af6e2f3b44b 100644
--- a/spec/frontend_integration/ide/user_opens_file_spec.js
+++ b/spec/frontend_integration/ide/user_opens_file_spec.js
@@ -1,6 +1,7 @@
import { screen } from '@testing-library/dom';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useOverclockTimers } from 'test_helpers/utils/overclock_timers';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import * as ideHelper from './helpers/ide_helper';
import startWebIDE from './helpers/start';
@@ -11,6 +12,7 @@ describe('IDE: User opens a file in the Web IDE', () => {
let container;
beforeEach(async () => {
+ stubPerformanceWebAPI();
setHTMLFixture('<div class="webide-container"></div>');
container = document.querySelector('.webide-container');
diff --git a/spec/frontend_integration/ide/user_opens_ide_spec.js b/spec/frontend_integration/ide/user_opens_ide_spec.js
index b2b85452451..552888f04a5 100644
--- a/spec/frontend_integration/ide/user_opens_ide_spec.js
+++ b/spec/frontend_integration/ide/user_opens_ide_spec.js
@@ -1,6 +1,7 @@
import { screen } from '@testing-library/dom';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useOverclockTimers } from 'test_helpers/utils/overclock_timers';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import * as ideHelper from './helpers/ide_helper';
import startWebIDE from './helpers/start';
@@ -11,6 +12,8 @@ describe('IDE: User opens IDE', () => {
let container;
beforeEach(() => {
+ stubPerformanceWebAPI();
+
setHTMLFixture('<div class="webide-container"></div>');
container = document.querySelector('.webide-container');
});
diff --git a/spec/frontend_integration/ide/user_opens_mr_spec.js b/spec/frontend_integration/ide/user_opens_mr_spec.js
index 084aae9f297..af0276a5055 100644
--- a/spec/frontend_integration/ide/user_opens_mr_spec.js
+++ b/spec/frontend_integration/ide/user_opens_mr_spec.js
@@ -2,6 +2,7 @@ import { basename } from 'path';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { getMergeRequests, getMergeRequestWithChanges } from 'test_helpers/fixtures';
import { useOverclockTimers } from 'test_helpers/utils/overclock_timers';
+import { stubPerformanceWebAPI } from 'helpers/performance';
import * as ideHelper from './helpers/ide_helper';
import startWebIDE from './helpers/start';
@@ -16,6 +17,8 @@ describe('IDE: User opens Merge Request', () => {
let changes;
beforeEach(async () => {
+ stubPerformanceWebAPI();
+
const [{ iid: mrId }] = getMergeRequests();
changes = getRelevantChanges();
diff --git a/spec/frontend_integration/snippets/snippets_notes_spec.js b/spec/frontend_integration/snippets/snippets_notes_spec.js
new file mode 100644
index 00000000000..fdd3289bf58
--- /dev/null
+++ b/spec/frontend_integration/snippets/snippets_notes_spec.js
@@ -0,0 +1,62 @@
+import $ from 'jquery';
+import axios from '~/lib/utils/axios_utils';
+import initGFMInput from '~/behaviors/markdown/gfm_auto_complete';
+import initDeprecatedNotes from '~/init_deprecated_notes';
+import { loadHTMLFixture } from 'helpers/fixtures';
+
+describe('Integration Snippets notes', () => {
+ beforeEach(async () => {
+ loadHTMLFixture('snippets/show.html');
+
+ // Check if we have to Load GFM Input
+ const $gfmInputs = $('.js-gfm-input:not(.js-gfm-input-initialized)');
+ initGFMInput($gfmInputs);
+
+ initDeprecatedNotes();
+ });
+
+ describe('emoji autocomplete', () => {
+ const findNoteTextarea = () => document.getElementById('note_note');
+ const findAtViewEmojiMenu = () => document.getElementById('at-view-58');
+ const findAtwhoResult = () => {
+ return Array.from(findAtViewEmojiMenu().querySelectorAll('li')).map((x) =>
+ x.innerText.trim(),
+ );
+ };
+ const fillNoteTextarea = (val) => {
+ const textarea = findNoteTextarea();
+
+ textarea.dispatchEvent(new Event('focus'));
+ textarea.value = val;
+ textarea.dispatchEvent(new Event('input'));
+ textarea.dispatchEvent(new Event('click'));
+ };
+
+ it.each([
+ [
+ ':heart',
+ ['heart', 'heart decoration', 'heart with arrow', 'heart with ribbon', 'heart_exclamation'],
+ ],
+ [':red', ['red apple', 'red_car', 'red_circle', 'credit card', 'tired face']],
+ [
+ ':circle',
+ // TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/347549
+ // These autocompleted results aren't very good. The autocompletion should be improved.
+ [
+ 'circled ideograph accept',
+ 'circled ideograph advantage',
+ 'circled ideograph congratulation',
+ 'circled ideograph secret',
+ 'circled latin capital letter m',
+ ],
+ ],
+ ])('shows a correct list of matching emojis when user enters %s', async (input, expected) => {
+ fillNoteTextarea(input);
+
+ await axios.waitForAll();
+
+ const result = findAtwhoResult();
+ expect(result).toEqual(expected);
+ });
+ });
+});
diff --git a/spec/frontend_integration/test_helpers/mock_server/routes/emojis.js b/spec/frontend_integration/test_helpers/mock_server/routes/emojis.js
new file mode 100644
index 00000000000..64e9006a710
--- /dev/null
+++ b/spec/frontend_integration/test_helpers/mock_server/routes/emojis.js
@@ -0,0 +1,9 @@
+import { Response } from 'miragejs';
+import emojis from 'public/-/emojis/2/emojis.json';
+import { EMOJI_VERSION } from '~/emoji';
+
+export default (server) => {
+ server.get(`/-/emojis/${EMOJI_VERSION}/emojis.json`, () => {
+ return new Response(200, {}, emojis);
+ });
+};
diff --git a/spec/frontend_integration/test_helpers/mock_server/routes/index.js b/spec/frontend_integration/test_helpers/mock_server/routes/index.js
index 48eff2702dd..571a592456d 100644
--- a/spec/frontend_integration/test_helpers/mock_server/routes/index.js
+++ b/spec/frontend_integration/test_helpers/mock_server/routes/index.js
@@ -6,6 +6,7 @@ export default (server) => {
require('./repository'),
require('./ci'),
require('./diffs'),
+ require('./emojis'),
require('./404'),
].forEach(({ default: setup }) => {
setup(server);
diff --git a/spec/graphql/mutations/design_management/delete_spec.rb b/spec/graphql/mutations/design_management/delete_spec.rb
index 93fff5e5103..79196d4965d 100644
--- a/spec/graphql/mutations/design_management/delete_spec.rb
+++ b/spec/graphql/mutations/design_management/delete_spec.rb
@@ -86,9 +86,11 @@ RSpec.describe Mutations::DesignManagement::Delete do
end
end
- it 'runs no more than 29 queries' do
+ it 'runs no more than 30 queries' do
+ allow(Gitlab::Tracking).to receive(:event) # rubocop:disable RSpec/ExpectGitlabTracking
+
filenames.each(&:present?) # ignore setup
- # Queries: as of 2021-07-22
+ # Queries: as of 2022-06-15
# -------------
# 01. routing query
# 02. find project by id
@@ -106,20 +108,21 @@ RSpec.describe Mutations::DesignManagement::Delete do
# 15. current designs by filename and issue
# 16, 17 project.authorizations for user (same query as 5)
# 18. find route by id and source_type
+ # 19. find plan for standard context
# ------------- our queries are below:
- # 19. start transaction 1
- # 20. start transaction 2
- # 21. find version by sha and issue
- # 22. exists version with sha and issue?
- # 23. leave transaction 2
- # 24. create version with sha and issue
- # 25. create design-version links
- # 26. validate version.actions.present?
- # 27. validate version.issue.present?
- # 28. validate version.sha is unique
- # 29. leave transaction 1
+ # 20. start transaction 1
+ # 21. start transaction 2
+ # 22. find version by sha and issue
+ # 23. exists version with sha and issue?
+ # 24. leave transaction 2
+ # 25. create version with sha and issue
+ # 26. create design-version links
+ # 27. validate version.actions.present?
+ # 28. validate version.issue.present?
+ # 29. validate version.sha is unique
+ # 30. leave transaction 1
#
- expect { run_mutation }.not_to exceed_query_limit(29)
+ expect { run_mutation }.not_to exceed_query_limit(30)
end
end
diff --git a/spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb b/spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb
new file mode 100644
index 00000000000..c4ceecb9d46
--- /dev/null
+++ b/spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Pages::MarkOnboardingComplete do
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:owner) { create(:user) }
+
+ let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) }
+
+ let(:mutation_arguments) do
+ {
+ project_path: project.full_path
+ }
+ end
+
+ before_all do
+ project.add_owner(owner)
+ project.add_developer(developer)
+ end
+
+ describe '#resolve' do
+ subject(:resolve) do
+ mutation.resolve(**mutation_arguments)
+ end
+
+ context 'when the current user has access to update pages' do
+ let(:current_user) { owner }
+
+ it 'calls mark_pages_onboarding_complete on the project' do
+ allow_next_instance_of(::Project) do |project|
+ expect(project).to receive(:mark_pages_onboarding_complete)
+ end
+ end
+
+ it 'returns onboarding_complete state' do
+ expect(resolve).to include(onboarding_complete: true)
+ end
+
+ it 'returns no errors' do
+ expect(resolve).to include(errors: [])
+ end
+ end
+
+ context "when the current user doesn't have access to update pages" do
+ let(:current_user) { developer }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(
+ Gitlab::Graphql::Errors::ResourceNotAvailable,
+ Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR
+ )
+ end
+ end
+ 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
index 59616815de0..ac7cef20df4 100644
--- a/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Resolvers::Ci::JobTokenScopeResolver do
describe '#resolve' do
context 'with access to scope' do
before do
- project.add_user(current_user, :maintainer)
+ project.add_member(current_user, :maintainer)
end
it 'returns nil when scope is not enabled' do
@@ -51,7 +51,7 @@ RSpec.describe Resolvers::Ci::JobTokenScopeResolver do
context 'without access to scope' do
before do
- project.add_user(current_user, :developer)
+ project.add_member(current_user, :developer)
end
it 'generates an error' do
diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
index b1f5f7b3e43..8586d359336 100644
--- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
@@ -52,6 +52,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do
{
active: true,
status: 'active',
+ upgrade_status: 'recommended',
type: :instance_type,
tag_list: ['active_runner'],
search: 'abc',
@@ -63,6 +64,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do
{
active: true,
status_status: 'active',
+ upgrade_status: 'recommended',
type_type: :instance_type,
tag_name: ['active_runner'],
preload: { tag_name: nil },
diff --git a/spec/graphql/resolvers/container_repositories_resolver_spec.rb b/spec/graphql/resolvers/container_repositories_resolver_spec.rb
index d7aa761320f..ed922259903 100644
--- a/spec/graphql/resolvers/container_repositories_resolver_spec.rb
+++ b/spec/graphql/resolvers/container_repositories_resolver_spec.rb
@@ -62,7 +62,7 @@ RSpec.describe Resolvers::ContainerRepositoriesResolver do
context 'with authorized user' do
before do
- group.add_user(user, :maintainer)
+ group.add_member(user, :maintainer)
end
context 'when the object is a project' do
diff --git a/spec/graphql/resolvers/todo_resolver_spec.rb b/spec/graphql/resolvers/todo_resolver_spec.rb
deleted file mode 100644
index 0760935a2fe..00000000000
--- a/spec/graphql/resolvers/todo_resolver_spec.rb
+++ /dev/null
@@ -1,157 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Resolvers::TodoResolver do
- include GraphqlHelpers
- include DesignManagementTestHelpers
-
- specify do
- expect(described_class).to have_nullable_graphql_type(Types::TodoType.connection_type)
- end
-
- describe '#resolve' do
- let_it_be(:project) { create(:project) }
- let_it_be(:current_user) { create(:user) }
- let_it_be(:issue) { create(:issue, project: project) }
- let_it_be(:author1) { create(:user) }
- let_it_be(:author2) { create(:user) }
-
- let_it_be(:issue_todo_done) { create(:todo, user: current_user, state: :done, action: Todo::ASSIGNED, author: author2, target: issue) }
- let_it_be(:issue_todo_pending) { create(:todo, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue) }
-
- let(:merge_request) { create(:merge_request, source_project: project) }
- let!(:merge_request_todo_pending) { create(:todo, user: current_user, target: merge_request, state: :pending, action: Todo::MENTIONED, author: author1) }
-
- before_all do
- project.add_developer(current_user)
- end
-
- it 'calls TodosFinder' do
- expect_next_instance_of(TodosFinder) do |finder|
- expect(finder).to receive(:execute).and_call_original
- end
-
- resolve_todos
- end
-
- context 'when using no filter' do
- it 'returns pending todos' do
- expect(resolve_todos).to contain_exactly(merge_request_todo_pending, issue_todo_pending)
- end
- end
-
- context 'when using filters' do
- it 'returns the todos for multiple states' do
- todos = resolve_todos(state: [:done, :pending])
-
- expect(todos).to contain_exactly(merge_request_todo_pending, issue_todo_done, issue_todo_pending)
- end
-
- it 'returns the todos for multiple filters' do
- enable_design_management
- design = create(:design, issue: issue)
- design_todo_pending = create(:todo, target: design, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1)
-
- todos = resolve_todos(type: ['MergeRequest', 'DesignManagement::Design'])
-
- expect(todos).to contain_exactly(merge_request_todo_pending, design_todo_pending)
- end
-
- it 'returns the todos for single filter' do
- todos = resolve_todos(type: ['MergeRequest'])
-
- expect(todos).to contain_exactly(merge_request_todo_pending)
- end
-
- it 'returns the todos for multiple groups' do
- group1 = create(:group)
- group2 = create(:group)
- group3 = create(:group)
-
- group1.add_developer(current_user)
- issue1 = create(:issue, project: create(:project, group: group1))
- group2.add_developer(current_user)
- issue2 = create(:issue, project: create(:project, group: group2))
- group3.add_developer(current_user)
- issue3 = create(:issue, project: create(:project, group: group3))
-
- todo4 = create(:todo, group: group1, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue1)
- todo5 = create(:todo, group: group2, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue2)
- create(:todo, group: group3, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue3)
-
- todos = resolve_todos(group_id: [group2.id, group1.id])
-
- expect(todos).to contain_exactly(todo4, todo5)
- end
-
- it 'returns the todos for multiple authors' do
- author3 = create(:user)
-
- create(:todo, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author3)
-
- todos = resolve_todos(author_id: [author2.id, author1.id])
-
- expect(todos).to contain_exactly(merge_request_todo_pending, issue_todo_pending)
- end
-
- it 'returns the todos for multiple actions' do
- create(:todo, user: current_user, state: :pending, action: Todo::DIRECTLY_ADDRESSED, author: author1)
-
- todos = resolve_todos(action: [Todo::MENTIONED, Todo::ASSIGNED])
-
- expect(todos).to contain_exactly(merge_request_todo_pending, issue_todo_pending)
- end
-
- it 'returns the todos for multiple projects' do
- project1 = create(:project)
- project2 = create(:project)
- project3 = create(:project)
-
- project1.add_developer(current_user)
- project2.add_developer(current_user)
- project3.add_developer(current_user)
-
- todo4 = create(:todo, project: project1, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: create(:issue, project: project1))
- todo5 = create(:todo, project: project2, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: create(:issue, project: project2))
- create(:todo, project: project3, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: create(:issue, project: project3))
-
- todos = resolve_todos(project_id: [project2.id, project1.id])
-
- expect(todos).to contain_exactly(todo4, todo5)
- end
- end
-
- context 'when no target is provided' do
- it 'returns no todos' do
- todos = resolve(described_class, obj: nil, args: {}, ctx: { current_user: current_user })
-
- expect(todos).to be_empty
- end
- end
-
- context 'when target user is not the current user' do
- it 'returns no todos' do
- other_user = create(:user)
-
- todos = resolve(described_class, obj: other_user, args: {}, ctx: { current_user: current_user })
-
- expect(todos).to be_empty
- end
- end
-
- context 'when request is for a todo target' do
- it 'returns only the todos for the target' do
- target = issue_todo_pending.target
-
- todos = resolve(described_class, obj: target, args: {}, ctx: { current_user: current_user })
-
- expect(todos).to contain_exactly(issue_todo_pending)
- end
- end
- end
-
- def resolve_todos(args = {}, context = { current_user: current_user })
- resolve(described_class, obj: current_user, args: args, ctx: context)
- end
-end
diff --git a/spec/graphql/resolvers/todos_resolver_spec.rb b/spec/graphql/resolvers/todos_resolver_spec.rb
new file mode 100644
index 00000000000..40ca2de0385
--- /dev/null
+++ b/spec/graphql/resolvers/todos_resolver_spec.rb
@@ -0,0 +1,157 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::TodosResolver do
+ include GraphqlHelpers
+ include DesignManagementTestHelpers
+
+ specify do
+ expect(described_class).to have_nullable_graphql_type(Types::TodoType.connection_type)
+ end
+
+ describe '#resolve' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:author1) { create(:user) }
+ let_it_be(:author2) { create(:user) }
+
+ let_it_be(:issue_todo_done) { create(:todo, user: current_user, state: :done, action: Todo::ASSIGNED, author: author2, target: issue) }
+ let_it_be(:issue_todo_pending) { create(:todo, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue) }
+
+ let(:merge_request) { create(:merge_request, source_project: project) }
+ let!(:merge_request_todo_pending) { create(:todo, user: current_user, target: merge_request, state: :pending, action: Todo::MENTIONED, author: author1) }
+
+ before_all do
+ project.add_developer(current_user)
+ end
+
+ it 'calls TodosFinder' do
+ expect_next_instance_of(TodosFinder) do |finder|
+ expect(finder).to receive(:execute).and_call_original
+ end
+
+ resolve_todos
+ end
+
+ context 'when using no filter' do
+ it 'returns pending todos' do
+ expect(resolve_todos).to contain_exactly(merge_request_todo_pending, issue_todo_pending)
+ end
+ end
+
+ context 'when using filters' do
+ it 'returns the todos for multiple states' do
+ todos = resolve_todos(state: [:done, :pending])
+
+ expect(todos).to contain_exactly(merge_request_todo_pending, issue_todo_done, issue_todo_pending)
+ end
+
+ it 'returns the todos for multiple filters' do
+ enable_design_management
+ design = create(:design, issue: issue)
+ design_todo_pending = create(:todo, target: design, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1)
+
+ todos = resolve_todos(type: ['MergeRequest', 'DesignManagement::Design'])
+
+ expect(todos).to contain_exactly(merge_request_todo_pending, design_todo_pending)
+ end
+
+ it 'returns the todos for single filter' do
+ todos = resolve_todos(type: ['MergeRequest'])
+
+ expect(todos).to contain_exactly(merge_request_todo_pending)
+ end
+
+ it 'returns the todos for multiple groups' do
+ group1 = create(:group)
+ group2 = create(:group)
+ group3 = create(:group)
+
+ group1.add_developer(current_user)
+ issue1 = create(:issue, project: create(:project, group: group1))
+ group2.add_developer(current_user)
+ issue2 = create(:issue, project: create(:project, group: group2))
+ group3.add_developer(current_user)
+ issue3 = create(:issue, project: create(:project, group: group3))
+
+ todo4 = create(:todo, group: group1, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue1)
+ todo5 = create(:todo, group: group2, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue2)
+ create(:todo, group: group3, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: issue3)
+
+ todos = resolve_todos(group_id: [group2.id, group1.id])
+
+ expect(todos).to contain_exactly(todo4, todo5)
+ end
+
+ it 'returns the todos for multiple authors' do
+ author3 = create(:user)
+
+ create(:todo, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author3)
+
+ todos = resolve_todos(author_id: [author2.id, author1.id])
+
+ expect(todos).to contain_exactly(merge_request_todo_pending, issue_todo_pending)
+ end
+
+ it 'returns the todos for multiple actions' do
+ create(:todo, user: current_user, state: :pending, action: Todo::DIRECTLY_ADDRESSED, author: author1)
+
+ todos = resolve_todos(action: [Todo::MENTIONED, Todo::ASSIGNED])
+
+ expect(todos).to contain_exactly(merge_request_todo_pending, issue_todo_pending)
+ end
+
+ it 'returns the todos for multiple projects' do
+ project1 = create(:project)
+ project2 = create(:project)
+ project3 = create(:project)
+
+ project1.add_developer(current_user)
+ project2.add_developer(current_user)
+ project3.add_developer(current_user)
+
+ todo4 = create(:todo, project: project1, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: create(:issue, project: project1))
+ todo5 = create(:todo, project: project2, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: create(:issue, project: project2))
+ create(:todo, project: project3, user: current_user, state: :pending, action: Todo::ASSIGNED, author: author1, target: create(:issue, project: project3))
+
+ todos = resolve_todos(project_id: [project2.id, project1.id])
+
+ expect(todos).to contain_exactly(todo4, todo5)
+ end
+ end
+
+ context 'when no target is provided' do
+ it 'returns no todos' do
+ todos = resolve(described_class, obj: nil, args: {}, ctx: { current_user: current_user })
+
+ expect(todos).to be_empty
+ end
+ end
+
+ context 'when target user is not the current user' do
+ it 'returns no todos' do
+ other_user = create(:user)
+
+ todos = resolve(described_class, obj: other_user, args: {}, ctx: { current_user: current_user })
+
+ expect(todos).to be_empty
+ end
+ end
+
+ context 'when request is for a todo target' do
+ it 'returns only the todos for the target' do
+ target = issue_todo_pending.target
+
+ todos = resolve(described_class, obj: target, args: {}, ctx: { current_user: current_user })
+
+ expect(todos).to contain_exactly(issue_todo_pending)
+ end
+ end
+ end
+
+ def resolve_todos(args = {}, context = { current_user: current_user })
+ resolve(described_class, obj: current_user, args: args, ctx: context)
+ end
+end
diff --git a/spec/graphql/resolvers/users/groups_resolver_spec.rb b/spec/graphql/resolvers/users/groups_resolver_spec.rb
index bbe9b6371cf..1e0e001fbf7 100644
--- a/spec/graphql/resolvers/users/groups_resolver_spec.rb
+++ b/spec/graphql/resolvers/users/groups_resolver_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe Resolvers::Users::GroupsResolver do
let_it_be(:private_maintainer_group) { create(:group, :private, name: 'b private maintainer', path: 'b-private-maintainer') }
let_it_be(:public_developer_group) { create(:group, project_creation_level: nil, name: 'c public developer', path: 'c-public-developer') }
let_it_be(:public_maintainer_group) { create(:group, name: 'a public maintainer', path: 'a-public-maintainer') }
+ let_it_be(:public_owner_group) { create(:group, name: 'a public owner', path: 'a-public-owner') }
subject(:resolved_items) { resolve_groups(args: group_arguments, current_user: current_user, obj: resolver_object) }
@@ -24,6 +25,7 @@ RSpec.describe Resolvers::Users::GroupsResolver do
private_maintainer_group.add_maintainer(user)
public_developer_group.add_developer(user)
public_maintainer_group.add_maintainer(user)
+ public_owner_group.add_owner(user)
end
context 'when resolver object is current user' do
@@ -34,6 +36,7 @@ RSpec.describe Resolvers::Users::GroupsResolver do
is_expected.to match(
[
public_maintainer_group,
+ public_owner_group,
private_maintainer_group,
public_developer_group
]
@@ -41,10 +44,25 @@ RSpec.describe Resolvers::Users::GroupsResolver do
end
end
+ context 'when permission is :transfer_projects' do
+ let(:group_arguments) { { permission_scope: :transfer_projects } }
+
+ specify do
+ is_expected.to match(
+ [
+ public_maintainer_group,
+ public_owner_group,
+ private_maintainer_group
+ ]
+ )
+ end
+ end
+
specify do
is_expected.to match(
[
public_maintainer_group,
+ public_owner_group,
private_maintainer_group,
public_developer_group,
guest_group
@@ -82,6 +100,7 @@ RSpec.describe Resolvers::Users::GroupsResolver do
is_expected.to match(
[
public_maintainer_group,
+ public_owner_group,
private_maintainer_group,
public_developer_group,
guest_group
diff --git a/spec/graphql/types/ci/detailed_status_type_spec.rb b/spec/graphql/types/ci/detailed_status_type_spec.rb
index 0c05227aec2..686461cb9a5 100644
--- a/spec/graphql/types/ci/detailed_status_type_spec.rb
+++ b/spec/graphql/types/ci/detailed_status_type_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Types::Ci::DetailedStatusType do
:label, :text, :tooltip, :action)
end
- let_it_be(:stage) { create(:ci_stage_entity, status: :skipped) }
+ let_it_be(:stage) { create(:ci_stage, status: :skipped) }
describe 'id field' do
it 'correctly renders the field' do
diff --git a/spec/graphql/types/ci/job_token_scope_type_spec.rb b/spec/graphql/types/ci/job_token_scope_type_spec.rb
index 43225b2089b..c1a3c4dd54d 100644
--- a/spec/graphql/types/ci/job_token_scope_type_spec.rb
+++ b/spec/graphql/types/ci/job_token_scope_type_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe GitlabSchema.types['CiJobTokenScopeType'] do
context 'with access to scope' do
before do
- project.add_user(current_user, :maintainer)
+ project.add_member(current_user, :maintainer)
end
context 'when multiple projects in the allow list' do
@@ -46,7 +46,7 @@ RSpec.describe GitlabSchema.types['CiJobTokenScopeType'] do
context 'when linked projects are readable' do
before do
- link.target_project.add_user(current_user, :developer)
+ link.target_project.add_member(current_user, :developer)
end
it 'returns readable projects in scope' do
diff --git a/spec/graphql/types/ci/job_type_spec.rb b/spec/graphql/types/ci/job_type_spec.rb
index 655c3636883..bc9e64282bc 100644
--- a/spec/graphql/types/ci/job_type_spec.rb
+++ b/spec/graphql/types/ci/job_type_spec.rb
@@ -23,6 +23,7 @@ RSpec.describe Types::Ci::JobType do
id
kind
manual_job
+ manual_variables
name
needs
pipeline
@@ -33,6 +34,7 @@ RSpec.describe Types::Ci::JobType do
refName
refPath
retryable
+ retried
scheduledAt
schedulingType
shortSha
diff --git a/spec/graphql/types/ci/runner_upgrade_status_type_enum_spec.rb b/spec/graphql/types/ci/runner_upgrade_status_type_enum_spec.rb
index 81a852471b9..03c784dcbe7 100644
--- a/spec/graphql/types/ci/runner_upgrade_status_type_enum_spec.rb
+++ b/spec/graphql/types/ci/runner_upgrade_status_type_enum_spec.rb
@@ -3,11 +3,22 @@
require 'spec_helper'
RSpec.describe Types::Ci::RunnerUpgradeStatusTypeEnum do
+ let(:model_only_enum_values) { %w[not_processed] }
+ let(:expected_graphql_source_values) do
+ Ci::RunnerVersion.statuses.keys - model_only_enum_values
+ end
+
specify { expect(described_class.graphql_name).to eq('CiRunnerUpgradeStatusType') }
- it 'exposes all upgrade status values' do
- expect(described_class.values.keys).to eq(
- ['UNKNOWN'] + ::Gitlab::Ci::RunnerUpgradeCheck::STATUSES.map { |sym, _| sym.to_s.upcase }
+ it 'exposes all upgrade status values except not_processed' do
+ expect(described_class.values.keys).to match_array(
+ expected_graphql_source_values
+ .map(&:upcase)
+ .map { |v| v == 'INVALID_VERSION' ? 'INVALID' : v }
)
end
+
+ it 'exposes all upgrade status values except enum-only values' do
+ expect(described_class.values.values.map(&:value).map(&:to_s)).to match_array(expected_graphql_source_values)
+ end
end
diff --git a/spec/graphql/types/ci/status_action_type_spec.rb b/spec/graphql/types/ci/status_action_type_spec.rb
index 4c467bf240e..3f4b52610ae 100644
--- a/spec/graphql/types/ci/status_action_type_spec.rb
+++ b/spec/graphql/types/ci/status_action_type_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe Types::Ci::StatusActionType do
describe 'id field' do
it 'correctly renders the field' do
- stage = build(:ci_stage_entity, status: :skipped)
+ stage = build(:ci_stage, status: :skipped)
status = stage.detailed_status(stage.pipeline.user)
expected_id = "#{stage.class.name}-#{status.id}"
diff --git a/spec/graphql/types/ci/variable_type_enum_spec.rb b/spec/graphql/types/ci/variable_type_enum_spec.rb
new file mode 100644
index 00000000000..5604caebfff
--- /dev/null
+++ b/spec/graphql/types/ci/variable_type_enum_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['CiVariableType'] do
+ it 'matches the keys of Ci::Variable.variable_types' do
+ expect(described_class.values.keys).to contain_exactly('ENV_VAR', 'FILE')
+ end
+end
diff --git a/spec/graphql/types/ci/variable_type_spec.rb b/spec/graphql/types/ci/variable_type_spec.rb
new file mode 100644
index 00000000000..a81e6adbab6
--- /dev/null
+++ b/spec/graphql/types/ci/variable_type_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['CiVariable'] do
+ it 'contains attributes related to CI variables' do
+ expect(described_class).to have_graphql_fields(
+ :id, :key, :value, :variable_type, :protected, :masked, :raw, :environment_scope
+ )
+ end
+end
diff --git a/spec/graphql/types/group_type_spec.rb b/spec/graphql/types/group_type_spec.rb
index 82703948cea..69c7eaf111f 100644
--- a/spec/graphql/types/group_type_spec.rb
+++ b/spec/graphql/types/group_type_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe GitlabSchema.types['Group'] do
dependency_proxy_blob_count dependency_proxy_total_size
dependency_proxy_image_prefix dependency_proxy_image_ttl_policy
shared_runners_setting timelogs organizations contacts work_item_types
- recent_issue_boards
+ recent_issue_boards ci_variables
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/issue_type_enum_spec.rb b/spec/graphql/types/issue_type_enum_spec.rb
index 131e92aa5ed..8f4b6f3bf74 100644
--- a/spec/graphql/types/issue_type_enum_spec.rb
+++ b/spec/graphql/types/issue_type_enum_spec.rb
@@ -5,9 +5,9 @@ require 'spec_helper'
RSpec.describe Types::IssueTypeEnum do
specify { expect(described_class.graphql_name).to eq('IssueType') }
- it 'exposes all the existing issue type values except for task' do
+ it 'exposes all the existing issue type values' do
expect(described_class.values.keys).to match_array(
- %w[ISSUE INCIDENT TEST_CASE REQUIREMENT]
+ %w[ISSUE INCIDENT TEST_CASE REQUIREMENT TASK]
)
end
end
diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb
index 2e994bf7820..ed93d31da0f 100644
--- a/spec/graphql/types/project_type_spec.rb
+++ b/spec/graphql/types/project_type_spec.rb
@@ -36,7 +36,8 @@ RSpec.describe GitlabSchema.types['Project'] do
pipeline_analytics squash_read_only sast_ci_configuration
cluster_agent cluster_agents agent_configurations
ci_template timelogs merge_commit_template squash_commit_template work_item_types
- recent_issue_boards ci_config_path_or_default packages_cleanup_policy
+ recent_issue_boards ci_config_path_or_default packages_cleanup_policy ci_variables
+ recent_issue_boards ci_config_path_or_default ci_variables
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb
index 8b8c44c10f6..514d24a209e 100644
--- a/spec/graphql/types/query_type_spec.rb
+++ b/spec/graphql/types/query_type_spec.rb
@@ -30,6 +30,7 @@ RSpec.describe GitlabSchema.types['Query'] do
board_list
topics
gitpod_enabled
+ ci_variables
]
expect(described_class).to have_graphql_fields(*expected_fields).at_least
diff --git a/spec/graphql/types/release_type_spec.rb b/spec/graphql/types/release_type_spec.rb
index 0c05a68c5a6..a1dc8850f94 100644
--- a/spec/graphql/types/release_type_spec.rb
+++ b/spec/graphql/types/release_type_spec.rb
@@ -11,7 +11,8 @@ RSpec.describe GitlabSchema.types['Release'] do
description description_html
name milestones evidences author commit
assets links
- created_at released_at
+ created_at released_at upcoming_release
+ historical_release
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/work_items/widget_interface_spec.rb b/spec/graphql/types/work_items/widget_interface_spec.rb
index ee40bcc10ca..caf986c961f 100644
--- a/spec/graphql/types/work_items/widget_interface_spec.rb
+++ b/spec/graphql/types/work_items/widget_interface_spec.rb
@@ -17,6 +17,7 @@ RSpec.describe Types::WorkItems::WidgetInterface do
where(:widget_class, :widget_type_name) do
WorkItems::Widgets::Description | Types::WorkItems::Widgets::DescriptionType
WorkItems::Widgets::Hierarchy | Types::WorkItems::Widgets::HierarchyType
+ WorkItems::Widgets::Assignees | Types::WorkItems::Widgets::AssigneesType
end
with_them do
diff --git a/spec/graphql/types/work_items/widgets/assignees_type_spec.rb b/spec/graphql/types/work_items/widgets/assignees_type_spec.rb
new file mode 100644
index 00000000000..816e66f1db1
--- /dev/null
+++ b/spec/graphql/types/work_items/widgets/assignees_type_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::WorkItems::Widgets::AssigneesType do
+ it 'exposes the expected fields' do
+ expected_fields = %i[assignees allows_multiple_assignees can_invite_members type]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/work_items/widgets/description_input_type_spec.rb b/spec/graphql/types/work_items/widgets/description_input_type_spec.rb
new file mode 100644
index 00000000000..81c64bc38ab
--- /dev/null
+++ b/spec/graphql/types/work_items/widgets/description_input_type_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Types::WorkItems::Widgets::DescriptionInputType do
+ it { expect(described_class.graphql_name).to eq('WorkItemWidgetDescriptionInput') }
+
+ it { expect(described_class.arguments.keys).to match_array(%w[description]) }
+end
diff --git a/spec/graphql/types/work_items/widgets/hierarchy_update_input_type_spec.rb b/spec/graphql/types/work_items/widgets/hierarchy_update_input_type_spec.rb
new file mode 100644
index 00000000000..6221580605e
--- /dev/null
+++ b/spec/graphql/types/work_items/widgets/hierarchy_update_input_type_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Types::WorkItems::Widgets::HierarchyUpdateInputType do
+ it { expect(described_class.graphql_name).to eq('WorkItemWidgetHierarchyUpdateInput') }
+
+ it { expect(described_class.arguments.keys).to match_array(%w[parentId childrenIds]) }
+end
diff --git a/spec/helpers/avatars_helper_spec.rb b/spec/helpers/avatars_helper_spec.rb
index 192e48f43e5..9c0f8b77d45 100644
--- a/spec/helpers/avatars_helper_spec.rb
+++ b/spec/helpers/avatars_helper_spec.rb
@@ -221,48 +221,56 @@ RSpec.describe AvatarsHelper do
stub_application_setting(gravatar_enabled?: true)
end
- it 'returns a generic avatar when email is blank' do
- expect(helper.gravatar_icon('')).to match_asset_path(described_class::DEFAULT_AVATAR_PATH)
- end
+ context 'with FIPS not enabled', fips_mode: false do
+ it 'returns a generic avatar when email is blank' do
+ expect(helper.gravatar_icon('')).to match_asset_path(described_class::DEFAULT_AVATAR_PATH)
+ end
- it 'returns a valid Gravatar URL' do
- stub_config_setting(https: false)
+ it 'returns a valid Gravatar URL' do
+ stub_config_setting(https: false)
- expect(helper.gravatar_icon(user_email))
- .to match('https://www.gravatar.com/avatar/b58c6f14d292556214bd64909bcdb118')
- end
+ expect(helper.gravatar_icon(user_email))
+ .to match('https://www.gravatar.com/avatar/b58c6f14d292556214bd64909bcdb118')
+ end
- it 'uses HTTPs when configured' do
- stub_config_setting(https: true)
+ it 'uses HTTPs when configured' do
+ stub_config_setting(https: true)
- expect(helper.gravatar_icon(user_email))
- .to match('https://secure.gravatar.com')
- end
+ expect(helper.gravatar_icon(user_email))
+ .to match('https://secure.gravatar.com')
+ end
- it 'returns custom gravatar path when gravatar_url is set' do
- stub_gravatar_setting(plain_url: 'http://example.local/?s=%{size}&hash=%{hash}')
+ it 'returns custom gravatar path when gravatar_url is set' do
+ stub_gravatar_setting(plain_url: 'http://example.local/?s=%{size}&hash=%{hash}')
- expect(gravatar_icon(user_email, 20))
- .to eq('http://example.local/?s=40&hash=b58c6f14d292556214bd64909bcdb118')
- end
+ expect(gravatar_icon(user_email, 20))
+ .to eq('http://example.local/?s=40&hash=b58c6f14d292556214bd64909bcdb118')
+ end
- it 'accepts a custom size argument' do
- expect(helper.gravatar_icon(user_email, 64)).to include '?s=128'
- end
+ it 'accepts a custom size argument' do
+ expect(helper.gravatar_icon(user_email, 64)).to include '?s=128'
+ end
- it 'defaults size to 40@2x when given an invalid size' do
- expect(helper.gravatar_icon(user_email, nil)).to include '?s=80'
- end
+ it 'defaults size to 40@2x when given an invalid size' do
+ expect(helper.gravatar_icon(user_email, nil)).to include '?s=80'
+ end
- it 'accepts a scaling factor' do
- expect(helper.gravatar_icon(user_email, 40, 3)).to include '?s=120'
- end
+ it 'accepts a scaling factor' do
+ expect(helper.gravatar_icon(user_email, 40, 3)).to include '?s=120'
+ end
- it 'ignores case and surrounding whitespace' do
- normal = helper.gravatar_icon('foo@example.com')
- upcase = helper.gravatar_icon(' FOO@EXAMPLE.COM ')
+ it 'ignores case and surrounding whitespace' do
+ normal = helper.gravatar_icon('foo@example.com')
+ upcase = helper.gravatar_icon(' FOO@EXAMPLE.COM ')
- expect(normal).to eq upcase
+ expect(normal).to eq upcase
+ end
+ end
+
+ context 'with FIPS enabled', :fips_mode do
+ it 'returns a generic avatar' do
+ expect(helper.gravatar_icon(user_email)).to match_asset_path(described_class::DEFAULT_AVATAR_PATH)
+ end
end
end
end
diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb
index 8366506aa45..bc9e47a4ca1 100644
--- a/spec/helpers/ci/pipeline_editor_helper_spec.rb
+++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb
@@ -48,6 +48,7 @@ RSpec.describe Ci::PipelineEditorHelper do
"ci-config-path": project.ci_config_path_or_default,
"ci-examples-help-page-path" => help_page_path('ci/examples/index'),
"ci-help-page-path" => help_page_path('ci/index'),
+ "ci-lint-path" => project_ci_lint_path(project),
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'illustrations/empty.svg',
"initial-branch-name" => nil,
@@ -62,6 +63,7 @@ RSpec.describe Ci::PipelineEditorHelper do
"project-full-path" => project.full_path,
"project-namespace" => project.namespace.full_path,
"runner-help-page-path" => help_page_path('ci/runners/index'),
+ "simulate-pipeline-help-page-path" => help_page_path('ci/lint', anchor: 'simulate-a-pipeline'),
"total-branches" => project.repository.branches.length,
"validate-tab-illustration-path" => 'illustrations/validate.svg',
"yml-help-page-path" => help_page_path('ci/yaml/index')
@@ -77,6 +79,7 @@ RSpec.describe Ci::PipelineEditorHelper do
"ci-config-path": project.ci_config_path_or_default,
"ci-examples-help-page-path" => help_page_path('ci/examples/index'),
"ci-help-page-path" => help_page_path('ci/index'),
+ "ci-lint-path" => project_ci_lint_path(project),
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'illustrations/empty.svg',
"initial-branch-name" => nil,
@@ -91,6 +94,7 @@ RSpec.describe Ci::PipelineEditorHelper do
"project-full-path" => project.full_path,
"project-namespace" => project.namespace.full_path,
"runner-help-page-path" => help_page_path('ci/runners/index'),
+ "simulate-pipeline-help-page-path" => help_page_path('ci/lint', anchor: 'simulate-a-pipeline'),
"total-branches" => 0,
"validate-tab-illustration-path" => 'illustrations/validate.svg',
"yml-help-page-path" => help_page_path('ci/yaml/index')
diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb
index 961e7688202..b5b572e9719 100644
--- a/spec/helpers/commits_helper_spec.rb
+++ b/spec/helpers/commits_helper_spec.rb
@@ -94,7 +94,7 @@ RSpec.describe CommitsHelper do
it 'renders the correct select-rendered button' do
expect(node[:title]).to eq('Display rendered diff')
expect(node['data-file-hash']).to eq('abc')
- expect(node['data-diff-toggle-entity']).to eq('toShowBtn')
+ expect(node['data-diff-toggle-entity']).to eq('renderedButton')
expect(node.xpath("//a/svg")[0]["data-testid"]).to eq('doc-text-icon')
end
end
@@ -105,7 +105,7 @@ RSpec.describe CommitsHelper do
it 'renders the correct select-raw button' do
expect(node[:title]).to eq('Display raw diff')
expect(node['data-file-hash']).to eq('abc')
- expect(node['data-diff-toggle-entity']).to eq('toHideBtn')
+ expect(node['data-diff-toggle-entity']).to eq('rawButton')
expect(node.xpath("//a/svg")[0]["data-testid"]).to eq('doc-code-icon')
end
end
diff --git a/spec/helpers/diff_helper_spec.rb b/spec/helpers/diff_helper_spec.rb
index cf16807723b..93efce6b58b 100644
--- a/spec/helpers/diff_helper_spec.rb
+++ b/spec/helpers/diff_helper_spec.rb
@@ -470,22 +470,69 @@ RSpec.describe DiffHelper do
end
describe '#conflicts' do
- let(:merge_request) { instance_double(MergeRequest) }
+ let(:merge_request) { instance_double(MergeRequest, cannot_be_merged?: true) }
+ let(:merge_ref_head_diff) { true }
+ let(:can_be_resolved_in_ui?) { true }
+ let(:allow_tree_conflicts) { false }
+ let(:files) { [instance_double(Gitlab::Conflict::File, path: 'a')] }
+ let(:exception) { nil }
before do
allow(helper).to receive(:merge_request).and_return(merge_request)
- allow(helper).to receive(:options).and_return(merge_ref_head_diff: true)
+ allow(helper).to receive(:options).and_return(merge_ref_head_diff: merge_ref_head_diff)
+
+ allow_next_instance_of(MergeRequests::Conflicts::ListService, merge_request, allow_tree_conflicts: allow_tree_conflicts) do |svc|
+ allow(svc).to receive(:can_be_resolved_in_ui?).and_return(can_be_resolved_in_ui?)
+
+ if exception.present?
+ allow(svc).to receive_message_chain(:conflicts, :files).and_raise(exception)
+ else
+ allow(svc).to receive_message_chain(:conflicts, :files).and_return(files)
+ end
+ end
end
- context 'when Gitlab::Git::Conflict::Resolver::ConflictSideMissing exception is raised' do
- before do
- allow_next_instance_of(MergeRequests::Conflicts::ListService, merge_request, allow_tree_conflicts: true) do |svc|
- allow(svc).to receive_message_chain(:conflicts, :files).and_raise(Gitlab::Git::Conflict::Resolver::ConflictSideMissing)
+ it 'returns list of conflicts indexed by path' do
+ expect(helper.conflicts).to eq('a' => files.first)
+ end
+
+ context 'when merge_ref_head_diff option is false' do
+ let(:merge_ref_head_diff) { false }
+
+ it 'returns nil' do
+ expect(helper.conflicts).to be_nil
+ end
+ end
+
+ context 'when merge request can be merged' do
+ let(:merge_request) { instance_double(MergeRequest, cannot_be_merged?: false) }
+
+ it 'returns nil' do
+ expect(helper.conflicts).to be_nil
+ end
+ end
+
+ context 'when conflicts cannot be resolved in UI' do
+ let(:can_be_resolved_in_ui?) { false }
+
+ it 'returns nil' do
+ expect(helper.conflicts).to be_nil
+ end
+
+ context 'when allow_tree_conflicts is true' do
+ let(:allow_tree_conflicts) { true }
+
+ it 'returns list of conflicts' do
+ expect(helper.conflicts(allow_tree_conflicts: allow_tree_conflicts)).to eq('a' => files.first)
end
end
+ end
+
+ context 'when Gitlab::Git::Conflict::Resolver::ConflictSideMissing exception is raised' do
+ let(:exception) { Gitlab::Git::Conflict::Resolver::ConflictSideMissing }
it 'returns an empty hash' do
- expect(helper.conflicts(allow_tree_conflicts: true)).to eq({})
+ expect(helper.conflicts).to eq({})
end
end
end
diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb
index 220e154aad8..04653d9ff03 100644
--- a/spec/helpers/emails_helper_spec.rb
+++ b/spec/helpers/emails_helper_spec.rb
@@ -77,7 +77,7 @@ RSpec.describe EmailsHelper do
end
describe 'notification_reason_text' do
- subject { helper.notification_reason_text(reason_code) }
+ subject { helper.notification_reason_text(reason: reason_code) }
using RSpec::Parameterized::TableSyntax
diff --git a/spec/helpers/environments_helper_spec.rb b/spec/helpers/environments_helper_spec.rb
index e4d4f18ad68..c1eaf1b1bcd 100644
--- a/spec/helpers/environments_helper_spec.rb
+++ b/spec/helpers/environments_helper_spec.rb
@@ -129,7 +129,6 @@ RSpec.describe EnvironmentsHelper do
"environment_name": environment.name,
"environments_path": api_v4_projects_environments_path(id: project.id),
"environment_id": environment.id,
- "cluster_applications_documentation_path" => help_page_path('user/clusters/integrations.md', anchor: 'elastic-stack-cluster-integration'),
"clusters_path": project_clusters_path(project, format: :json)
}
diff --git a/spec/helpers/groups/group_members_helper_spec.rb b/spec/helpers/groups/group_members_helper_spec.rb
index d308df3a017..89c26c21338 100644
--- a/spec/helpers/groups/group_members_helper_spec.rb
+++ b/spec/helpers/groups/group_members_helper_spec.rb
@@ -44,6 +44,7 @@ RSpec.describe Groups::GroupMembersHelper do
members: present_members(members_collection),
invited: present_members(invited),
access_requests: present_members(access_requests),
+ banned: [],
include_relations: [:inherited, :direct],
search: nil
)
@@ -117,6 +118,7 @@ RSpec.describe Groups::GroupMembersHelper do
members: present_members(members_collection),
invited: present_members(invited),
access_requests: present_members(access_requests),
+ banned: [],
include_relations: include_relations,
search: nil
)
diff --git a/spec/helpers/groups_helper_spec.rb b/spec/helpers/groups_helper_spec.rb
index bcbe571db5e..d00cd8f1d6b 100644
--- a/spec/helpers/groups_helper_spec.rb
+++ b/spec/helpers/groups_helper_spec.rb
@@ -355,8 +355,8 @@ RSpec.describe GroupsHelper do
end
end
- describe '#show_thanks_for_purchase_banner?' do
- subject { helper.show_thanks_for_purchase_banner? }
+ describe '#show_thanks_for_purchase_alert?' do
+ subject { helper.show_thanks_for_purchase_alert? }
it 'returns true with purchased_quantity present in params' do
allow(controller).to receive(:params) { { purchased_quantity: '1' } }
diff --git a/spec/helpers/learn_gitlab_helper_spec.rb b/spec/helpers/learn_gitlab_helper_spec.rb
index 9fce7495b5a..7c9dfd6b5be 100644
--- a/spec/helpers/learn_gitlab_helper_spec.rb
+++ b/spec/helpers/learn_gitlab_helper_spec.rb
@@ -92,38 +92,6 @@ RSpec.describe LearnGitlabHelper do
it_behaves_like 'has all data'
- it 'sets correct paths' do
- expect(onboarding_actions_data).to match({
- trial_started: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/issues/2\z})
- ),
- pipeline_created: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/issues/7\z})
- ),
- code_owners_enabled: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/issues/10\z})
- ),
- required_mr_approvals_enabled: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/issues/11\z})
- ),
- issue_created: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/issues\z})
- ),
- git_write: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab\z})
- ),
- user_added: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/project_members\z})
- ),
- merge_request_created: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/merge_requests\z})
- ),
- security_scan_enabled: a_hash_including(
- url: a_string_matching(%r{/learn_gitlab/-/security/configuration\z})
- )
- })
- end
-
it 'sets correct completion statuses' do
expect(onboarding_actions_data).to match({
issue_created: a_hash_including(completed: false),
@@ -137,5 +105,58 @@ RSpec.describe LearnGitlabHelper do
security_scan_enabled: a_hash_including(completed: false)
})
end
+
+ describe 'security_actions_continuous_onboarding experiment' do
+ let(:base_paths) do
+ {
+ trial_started: a_hash_including(url: %r{/learn_gitlab/-/issues/2\z}),
+ pipeline_created: a_hash_including(url: %r{/learn_gitlab/-/issues/7\z}),
+ code_owners_enabled: a_hash_including(url: %r{/learn_gitlab/-/issues/10\z}),
+ required_mr_approvals_enabled: a_hash_including(url: %r{/learn_gitlab/-/issues/11\z}),
+ issue_created: a_hash_including(url: %r{/learn_gitlab/-/issues\z}),
+ git_write: a_hash_including(url: %r{/learn_gitlab\z}),
+ user_added: a_hash_including(url: %r{/learn_gitlab/-/project_members\z}),
+ merge_request_created: a_hash_including(url: %r{/learn_gitlab/-/merge_requests\z})
+ }
+ end
+
+ context 'when control' do
+ before do
+ stub_experiments(security_actions_continuous_onboarding: :control)
+ end
+
+ it 'sets correct paths' do
+ expect(onboarding_actions_data).to match(
+ base_paths.merge(
+ security_scan_enabled: a_hash_including(
+ url: %r{/learn_gitlab/-/security/configuration\z}
+ )
+ )
+ )
+ end
+ end
+
+ context 'when candidate' do
+ before do
+ stub_experiments(security_actions_continuous_onboarding: :candidate)
+ end
+
+ it 'sets correct paths' do
+ expect(onboarding_actions_data).to match(
+ base_paths.merge(
+ license_scanning_run: a_hash_including(
+ url: described_class::LICENSE_SCANNING_RUN_URL
+ ),
+ secure_dependency_scanning_run: a_hash_including(
+ url: project_security_configuration_path(project, anchor: 'dependency-scanning')
+ ),
+ secure_dast_run: a_hash_including(
+ url: project_security_configuration_path(project, anchor: 'dast')
+ )
+ )
+ )
+ end
+ end
+ end
end
end
diff --git a/spec/helpers/namespace_storage_limit_alert_helper_spec.rb b/spec/helpers/namespace_storage_limit_alert_helper_spec.rb
deleted file mode 100644
index ab3cf96edef..00000000000
--- a/spec/helpers/namespace_storage_limit_alert_helper_spec.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe NamespaceStorageLimitAlertHelper do
- describe '#display_namespace_storage_limit_alert!' do
- it 'is defined in CE' do
- expect { helper.display_namespace_storage_limit_alert! }.not_to raise_error
- end
- end
-end
diff --git a/spec/helpers/nav/new_dropdown_helper_spec.rb b/spec/helpers/nav/new_dropdown_helper_spec.rb
index 4f32ac5b5c6..2fe237fb996 100644
--- a/spec/helpers/nav/new_dropdown_helper_spec.rb
+++ b/spec/helpers/nav/new_dropdown_helper_spec.rb
@@ -55,7 +55,7 @@ RSpec.describe Nav::NewDropdownHelper do
end
it 'has title' do
- expect(subject[:title]).to eq('Create new')
+ expect(subject[:title]).to eq('Create new...')
end
context 'when current_user is nil (anonymous)' do
diff --git a/spec/helpers/projects/pipeline_helper_spec.rb b/spec/helpers/projects/pipeline_helper_spec.rb
index d04aa9a9d04..2b2dad286c7 100644
--- a/spec/helpers/projects/pipeline_helper_spec.rb
+++ b/spec/helpers/projects/pipeline_helper_spec.rb
@@ -11,7 +11,11 @@ RSpec.describe Projects::PipelineHelper do
let_it_be(:pipeline) { Ci::PipelinePresenter.new(raw_pipeline, current_user: user)}
describe '#js_pipeline_tabs_data' do
- subject(:pipeline_tabs_data) { helper.js_pipeline_tabs_data(project, pipeline) }
+ before do
+ project.add_developer(user)
+ end
+
+ subject(:pipeline_tabs_data) { helper.js_pipeline_tabs_data(project, pipeline, user) }
it 'returns pipeline tabs data' do
expect(pipeline_tabs_data).to include({
diff --git a/spec/helpers/projects/project_members_helper_spec.rb b/spec/helpers/projects/project_members_helper_spec.rb
index 2414a1782c5..844c33de635 100644
--- a/spec/helpers/projects/project_members_helper_spec.rb
+++ b/spec/helpers/projects/project_members_helper_spec.rb
@@ -14,7 +14,6 @@ RSpec.describe Projects::ProjectMembersHelper do
describe 'project members' do
let_it_be(:members) { create_list(:project_member, 2, project: project) }
- let_it_be(:group_links) { create_list(:project_group_link, 1, project: project) }
let_it_be(:invited) { create_list(:project_member, 2, :invited, project: project) }
let_it_be(:access_requests) { create_list(:project_member, 2, :access_request, project: project) }
@@ -26,9 +25,10 @@ RSpec.describe Projects::ProjectMembersHelper do
helper.project_members_app_data_json(
project,
members: present_members(members_collection),
- group_links: group_links,
invited: present_members(invited),
- access_requests: present_members(access_requests)
+ access_requests: present_members(access_requests),
+ include_relations: [:inherited, :direct],
+ search: nil
)
)
end
@@ -84,6 +84,70 @@ RSpec.describe Projects::ProjectMembersHelper do
expect(subject['user']['pagination']).to match(expected)
end
end
+
+ context 'group links' do
+ let_it_be(:shared_with_group) { create(:group) }
+ let_it_be(:group_link) { create(:project_group_link, project: project, group: shared_with_group) }
+
+ before do
+ allow(helper).to receive(:project_group_link_path).with(project, ':id').and_return('/foo-group/foo-project/-/group_links/:id')
+ end
+
+ it 'sets `group.members` property that matches json schema' do
+ expect(subject['group']['members'].to_json).to match_schema('group_link/project_group_links')
+ end
+
+ it 'sets `member_path` property' do
+ expect(subject['group']['member_path']).to eq('/foo-group/foo-project/-/group_links/:id')
+ end
+
+ context 'inherited' do
+ let_it_be(:shared_with_group_1) { create(:group) }
+ let_it_be(:shared_with_group_2) { create(:group) }
+ let_it_be(:shared_with_group_3) { create(:group) }
+ let_it_be(:shared_with_group_4) { create(:group) }
+ let_it_be(:shared_with_group_5) { create(:group) }
+ let_it_be(:top_group) { create(:group) }
+ let_it_be(:sub_group) { create(:group, parent: top_group) }
+ let_it_be(:project) { create(:project, group: sub_group) }
+ let_it_be(:group_link_1) { create(:group_group_link, shared_group: top_group, shared_with_group: shared_with_group_1, group_access: Gitlab::Access::GUEST) }
+ let_it_be(:group_link_2) { create(:group_group_link, shared_group: top_group, shared_with_group: shared_with_group_4, group_access: Gitlab::Access::GUEST) }
+ let_it_be(:group_link_3) { create(:group_group_link, shared_group: top_group, shared_with_group: shared_with_group_5, group_access: Gitlab::Access::DEVELOPER) }
+ let_it_be(:group_link_4) { create(:group_group_link, shared_group: sub_group, shared_with_group: shared_with_group_2, group_access: Gitlab::Access::DEVELOPER) }
+ let_it_be(:group_link_5) { create(:group_group_link, shared_group: sub_group, shared_with_group: shared_with_group_4, group_access: Gitlab::Access::DEVELOPER) }
+ let_it_be(:group_link_6) { create(:group_group_link, shared_group: sub_group, shared_with_group: shared_with_group_5, group_access: Gitlab::Access::GUEST) }
+ let_it_be(:group_link_7) { create(:project_group_link, project: project, group: shared_with_group_1, group_access: Gitlab::Access::DEVELOPER) }
+ let_it_be(:group_link_8) { create(:project_group_link, project: project, group: shared_with_group_2, group_access: Gitlab::Access::GUEST) }
+ let_it_be(:group_link_9) { create(:project_group_link, project: project, group: shared_with_group_3, group_access: Gitlab::Access::REPORTER) }
+
+ subject do
+ Gitlab::Json.parse(
+ helper.project_members_app_data_json(
+ project,
+ members: present_members(members_collection),
+ invited: present_members(invited),
+ access_requests: present_members(access_requests),
+ include_relations: include_relations,
+ search: nil
+ )
+ )
+ end
+
+ using RSpec::Parameterized::TableSyntax
+
+ where(:include_relations, :result) do
+ [:inherited, :direct] | lazy { [group_link_7, group_link_4, group_link_9, group_link_5, group_link_3].map(&:id) }
+ [:inherited] | lazy { [group_link_1, group_link_4, group_link_5, group_link_3].map(&:id) }
+ [:direct] | lazy { [group_link_7, group_link_8, group_link_9].map(&:id) }
+ end
+
+ with_them do
+ it 'returns correct group links' do
+ expect(subject['group']['members'].map { |link| link['id'] }).to match_array(result)
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index 4502729866c..b7cc8c217a4 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -698,7 +698,7 @@ RSpec.describe ProjectsHelper do
def grant_user_access(project, user, access)
case access
when :developer, :maintainer
- project.add_user(user, access)
+ project.add_member(user, access)
when :owner
project.namespace.update!(owner: user)
end
@@ -969,6 +969,10 @@ RSpec.describe ProjectsHelper do
containerRegistryAccessLevel: project.project_feature.container_registry_access_level
)
end
+
+ it 'includes membersPagePath' do
+ expect(subject).to include(membersPagePath: project_project_members_path(project))
+ end
end
describe '#project_classes' do
diff --git a/spec/helpers/releases_helper_spec.rb b/spec/helpers/releases_helper_spec.rb
index b7493e84c6a..59a92c067f4 100644
--- a/spec/helpers/releases_helper_spec.rb
+++ b/spec/helpers/releases_helper_spec.rb
@@ -64,7 +64,9 @@ RSpec.describe ReleasesHelper do
release_assets_docs_path
manage_milestones_path
new_milestone_path
- edit_release_docs_path)
+ upcoming_release_docs_path
+ edit_release_docs_path
+ delete_release_docs_path)
expect(helper.data_for_edit_release_page.keys).to match_array(keys)
end
@@ -76,6 +78,7 @@ RSpec.describe ReleasesHelper do
group_id
group_milestones_available
project_path
+ tag_name
releases_page_path
markdown_preview_path
markdown_docs_path
@@ -83,6 +86,7 @@ RSpec.describe ReleasesHelper do
manage_milestones_path
new_milestone_path
default_branch
+ upcoming_release_docs_path
edit_release_docs_path)
expect(helper.data_for_new_release_page.keys).to match_array(keys)
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index 4117d577f20..1ead1fc9b8b 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -741,7 +741,7 @@ RSpec.describe SearchHelper do
let(:for_group) { true }
it 'adds the :group and :group_metadata correctly to hash' do
- expect(header_search_context[:group]).to eq({ id: group.id, name: group.name })
+ expect(header_search_context[:group]).to eq({ id: group.id, name: group.name, full_name: group.full_name })
expect(header_search_context[:group_metadata]).to eq(group_metadata)
end
diff --git a/spec/helpers/sessions_helper_spec.rb b/spec/helpers/sessions_helper_spec.rb
index fd3d7100ba1..15424425060 100644
--- a/spec/helpers/sessions_helper_spec.rb
+++ b/spec/helpers/sessions_helper_spec.rb
@@ -50,4 +50,51 @@ RSpec.describe SessionsHelper do
expect(helper.unconfirmed_email?).to be_falsey
end
end
+
+ describe '#send_rate_limited?' do
+ let_it_be(:user) { build(:user) }
+
+ subject { helper.send_rate_limited?(user) }
+
+ before do
+ allow(::Gitlab::ApplicationRateLimiter)
+ .to receive(:peek)
+ .with(:email_verification_code_send, scope: user)
+ .and_return(rate_limited)
+ end
+
+ context 'when rate limited' do
+ let(:rate_limited) { true }
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when not rate limited' do
+ let(:rate_limited) { false }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ describe '#obfuscated_email' do
+ subject { helper.obfuscated_email(email) }
+
+ context 'when an email address is normal length' do
+ let(:email) { 'alex@gitlab.com' }
+
+ it { is_expected.to eq('al**@g*****.com') }
+ end
+
+ context 'when an email address contains multiple top level domains' do
+ let(:email) { 'alex@gl.co.uk' }
+
+ it { is_expected.to eq('al**@g****.uk') }
+ end
+
+ context 'when an email address is very short' do
+ let(:email) { 'a@b' }
+
+ it { is_expected.to eq('a@b') }
+ end
+ end
end
diff --git a/spec/helpers/storage_helper_spec.rb b/spec/helpers/storage_helper_spec.rb
index c2c508cf485..4b46bf169e0 100644
--- a/spec/helpers/storage_helper_spec.rb
+++ b/spec/helpers/storage_helper_spec.rb
@@ -51,14 +51,14 @@ RSpec.describe StorageHelper do
end
end
- describe "storage_enforcement_banner", :saas do
+ describe "storage_enforcement_banner" do
let_it_be_with_refind(:current_user) { create(:user) }
let_it_be(:free_group) { create(:group) }
let_it_be(:paid_group) { create(:group) }
before do
- allow(helper).to receive(:can?).with(current_user, :admin_namespace, free_group).and_return(true)
- allow(helper).to receive(:can?).with(current_user, :admin_namespace, paid_group).and_return(true)
+ allow(helper).to receive(:can?).with(current_user, :maintain_namespace, free_group).and_return(true)
+ allow(helper).to receive(:can?).with(current_user, :maintain_namespace, paid_group).and_return(true)
allow(helper).to receive(:current_user) { current_user }
allow(paid_group).to receive(:paid?).and_return(true)
@@ -84,7 +84,13 @@ RSpec.describe StorageHelper do
end
it 'returns nil when current_user do not have access usage quotas page' do
- allow(helper).to receive(:can?).with(current_user, :admin_namespace, free_group).and_return(false)
+ allow(helper).to receive(:can?).with(current_user, :maintain_namespace, free_group).and_return(false)
+
+ expect(helper.storage_enforcement_banner_info(free_group)).to be(nil)
+ end
+
+ it 'returns nil when namespace_storage_limit_show_preenforcement_banner FF is disabled' do
+ stub_feature_flags(namespace_storage_limit_show_preenforcement_banner: false)
expect(helper.storage_enforcement_banner_info(free_group)).to be(nil)
end
diff --git a/spec/helpers/todos_helper_spec.rb b/spec/helpers/todos_helper_spec.rb
index 922fb1d7c92..bbabfedc3ee 100644
--- a/spec/helpers/todos_helper_spec.rb
+++ b/spec/helpers/todos_helper_spec.rb
@@ -5,7 +5,8 @@ require 'spec_helper'
RSpec.describe TodosHelper do
let_it_be(:user) { create(:user) }
let_it_be(:author) { create(:user) }
- let_it_be(:issue) { create(:issue, title: 'Issue 1') }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:issue) { create(:issue, title: 'Issue 1', project: project) }
let_it_be(:design) { create(:design, issue: issue) }
let_it_be(:note) do
create(:note,
@@ -16,7 +17,7 @@ RSpec.describe TodosHelper do
let_it_be(:design_todo) do
create(:todo, :mentioned,
user: user,
- project: issue.project,
+ project: project,
target: design,
author: author,
note: note)
@@ -27,6 +28,15 @@ RSpec.describe TodosHelper do
create(:todo, target: alert)
end
+ let_it_be(:task_todo) do
+ task = create(:work_item, :task, project: project)
+ create(:todo, target: task, target_type: task.class.name, project: project)
+ end
+
+ let_it_be(:issue_todo) do
+ create(:todo, target: issue)
+ end
+
describe '#todos_count_format' do
it 'shows fuzzy count for 100 or more items' do
expect(helper.todos_count_format(100)).to eq '99+'
@@ -113,27 +123,62 @@ RSpec.describe TodosHelper do
)
end
end
+
+ context 'when given a task' do
+ let(:todo) { task_todo }
+
+ it 'responds with an appropriate path' do
+ path = helper.todo_target_path(todo)
+
+ expect(path).to eq("/#{todo.project.full_path}/-/work_items/#{todo.target.id}")
+ end
+ end
+
+ context 'when given an issue with a note anchor' do
+ let(:todo) { create(:todo, project: issue.project, target: issue, note: note) }
+
+ it 'responds with an appropriate path' do
+ path = helper.todo_target_path(todo)
+
+ expect(path).to eq("/#{issue.project.full_path}/-/issues/#{issue.iid}##{dom_id(note)}")
+ end
+ end
end
describe '#todo_target_type_name' do
+ subject { helper.todo_target_type_name(todo) }
+
context 'when given a design todo' do
let(:todo) { design_todo }
- it 'responds with an appropriate target type name' do
- name = helper.todo_target_type_name(todo)
-
- expect(name).to eq('design')
- end
+ it { is_expected.to eq('design') }
end
context 'when given an alert todo' do
let(:todo) { alert_todo }
- it 'responds with an appropriate target type name' do
- name = helper.todo_target_type_name(todo)
+ it { is_expected.to eq('alert') }
+ end
+
+ context 'when given a task todo' do
+ let(:todo) { task_todo }
- expect(name).to eq('alert')
+ it { is_expected.to eq('task') }
+ end
+
+ context 'when given an issue todo' do
+ let(:todo) { issue_todo }
+
+ it { is_expected.to eq('issue') }
+ end
+
+ context 'when given a merge request todo' do
+ let(:todo) do
+ merge_request = create(:merge_request, source_project: project)
+ create(:todo, target: merge_request)
end
+
+ it { is_expected.to eq('merge request') }
end
end
diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb
index 026432adf99..c40284ee933 100644
--- a/spec/helpers/tree_helper_spec.rb
+++ b/spec/helpers/tree_helper_spec.rb
@@ -3,63 +3,12 @@
require 'spec_helper'
RSpec.describe TreeHelper do
- let(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository) }
let(:repository) { project.repository }
let(:sha) { 'c1c67abbaf91f624347bb3ae96eabe3a1b742478' }
let_it_be(:user) { create(:user) }
- def create_file(filename)
- project.repository.create_file(
- project.creator,
- filename,
- 'test this',
- message: "Automatically created file #{filename}",
- branch_name: 'master'
- )
- end
-
- describe 'flatten_tree' do
- let(:tree) { repository.tree(sha, 'files') }
- let(:root_path) { 'files' }
- let(:tree_item) { tree.entries.find { |entry| entry.path == path } }
-
- subject { flatten_tree(root_path, tree_item) }
-
- context "on a directory containing more than one file/directory" do
- let(:path) { 'files/html' }
-
- it "returns the directory name" do
- expect(subject).to match('html')
- end
- end
-
- context "on a directory containing only one directory" do
- let(:path) { 'files/flat' }
-
- it "returns the flattened path" do
- expect(subject).to match('flat/path/correct')
- end
-
- context "with a nested root path" do
- let(:root_path) { 'files/flat' }
-
- it "returns the flattened path with the root path suffix removed" do
- expect(subject).to match('path/correct')
- end
- end
- end
-
- context 'when the root path contains a plus character' do
- let(:root_path) { 'gtk/C++' }
- let(:tree_item) { double(flat_path: 'gtk/C++/glade') }
-
- it 'returns the flattened path' do
- expect(subject).to eq('glade')
- end
- end
- end
-
describe '#commit_in_single_accessible_branch' do
it 'escapes HTML from the branch name' do
helper.instance_variable_set(:@branch_name, "<script>alert('escape me!');</script>")
@@ -163,6 +112,7 @@ RSpec.describe TreeHelper do
context 'user does not have write access but a personal fork exists' do
include ProjectForksHelper
+ let(:project) { create(:project, :repository) }
let(:forked_project) { create(:project, :repository, namespace: user.namespace) }
before do
diff --git a/spec/helpers/users/callouts_helper_spec.rb b/spec/helpers/users/callouts_helper_spec.rb
index 71a8d340b30..2c148aabead 100644
--- a/spec/helpers/users/callouts_helper_spec.rb
+++ b/spec/helpers/users/callouts_helper_spec.rb
@@ -222,4 +222,60 @@ RSpec.describe Users::CalloutsHelper do
it { is_expected.to be true }
end
end
+
+ describe '#web_hook_disabled_dismissed?' do
+ context 'without a project' do
+ it 'is false' do
+ expect(helper).not_to be_web_hook_disabled_dismissed(nil)
+ end
+ end
+
+ context 'with a project' do
+ let_it_be(:project) { create(:project) }
+
+ context 'the web-hook failure callout has never been dismissed' do
+ it 'is false' do
+ expect(helper).not_to be_web_hook_disabled_dismissed(project)
+ end
+ end
+
+ context 'the web-hook failure callout has been dismissed', :freeze_time do
+ before do
+ create(:namespace_callout,
+ feature_name: described_class::WEB_HOOK_DISABLED,
+ user: user,
+ namespace: project.namespace,
+ dismissed_at: 1.week.ago)
+ end
+
+ it 'is true' do
+ expect(helper).to be_web_hook_disabled_dismissed(project)
+ end
+
+ context 'when there was an older failure', :clean_gitlab_redis_shared_state do
+ let(:key) { "web_hooks:last_failure:project-#{project.id}" }
+
+ before do
+ Gitlab::Redis::SharedState.with { |r| r.set(key, 1.month.ago.iso8601) }
+ end
+
+ it 'is true' do
+ expect(helper).to be_web_hook_disabled_dismissed(project)
+ end
+ end
+
+ context 'when there has been a more recent failure', :clean_gitlab_redis_shared_state do
+ let(:key) { "web_hooks:last_failure:project-#{project.id}" }
+
+ before do
+ Gitlab::Redis::SharedState.with { |r| r.set(key, 1.day.ago.iso8601) }
+ end
+
+ it 'is false' do
+ expect(helper).not_to be_web_hook_disabled_dismissed(project)
+ end
+ end
+ end
+ end
+ end
end
diff --git a/spec/helpers/web_hooks/web_hooks_helper_spec.rb b/spec/helpers/web_hooks/web_hooks_helper_spec.rb
new file mode 100644
index 00000000000..473f33a982f
--- /dev/null
+++ b/spec/helpers/web_hooks/web_hooks_helper_spec.rb
@@ -0,0 +1,120 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WebHooks::WebHooksHelper do
+ let_it_be_with_reload(:project) { create(:project) }
+
+ let(:current_user) { nil }
+ let(:callout_dismissed) { false }
+ let(:web_hooks_disable_failed) { false }
+ let(:webhooks_failed_callout) { false }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(current_user)
+ allow(helper).to receive(:web_hook_disabled_dismissed?).with(project).and_return(callout_dismissed)
+
+ stub_feature_flags(
+ webhooks_failed_callout: webhooks_failed_callout,
+ web_hooks_disable_failed: web_hooks_disable_failed
+ )
+ end
+
+ shared_context 'user is logged in' do
+ let(:current_user) { create(:user) }
+ end
+
+ shared_context 'webhooks_failed_callout is enabled' do
+ let(:webhooks_failed_callout) { true }
+ end
+
+ shared_context 'webhooks_failed_callout is enabled for this project' do
+ let(:webhooks_failed_callout) { project }
+ end
+
+ shared_context 'web_hooks_disable_failed is enabled' do
+ let(:web_hooks_disable_failed) { true }
+ end
+
+ shared_context 'web_hooks_disable_failed is enabled for this project' do
+ let(:web_hooks_disable_failed) { project }
+ end
+
+ shared_context 'the user has permission' do
+ before do
+ project.add_maintainer(current_user)
+ end
+ end
+
+ shared_context 'the user dismissed the callout' do
+ let(:callout_dismissed) { true }
+ end
+
+ shared_context 'a hook has failed' do
+ before do
+ create(:project_hook, :permanently_disabled, project: project)
+ end
+ end
+
+ describe '#show_project_hook_failed_callout?' do
+ context 'all conditions are met' do
+ include_context 'user is logged in'
+ include_context 'webhooks_failed_callout is enabled'
+ include_context 'web_hooks_disable_failed is enabled'
+ include_context 'the user has permission'
+ include_context 'a hook has failed'
+
+ it 'is true' do
+ expect(helper).to be_show_project_hook_failed_callout(project: project)
+ end
+
+ it 'caches the DB calls until the TTL', :use_clean_rails_memory_store_caching, :request_store do
+ helper.show_project_hook_failed_callout?(project: project)
+
+ travel_to((described_class::EXPIRY_TTL - 1.second).from_now) do
+ expect do
+ helper.show_project_hook_failed_callout?(project: project)
+ end.not_to exceed_query_limit(0)
+ end
+
+ travel_to((described_class::EXPIRY_TTL + 1.second).from_now) do
+ expect do
+ helper.show_project_hook_failed_callout?(project: project)
+ end.to exceed_query_limit(0)
+ end
+ end
+ end
+
+ context 'all conditions are met, project scoped flags' do
+ include_context 'user is logged in'
+ include_context 'webhooks_failed_callout is enabled for this project'
+ include_context 'web_hooks_disable_failed is enabled for this project'
+ include_context 'the user has permission'
+ include_context 'a hook has failed'
+
+ it 'is true' do
+ expect(helper).to be_show_project_hook_failed_callout(project: project)
+ end
+ end
+
+ context 'one condition is not met' do
+ contexts = [
+ 'user is logged in',
+ 'webhooks_failed_callout is enabled',
+ 'web_hooks_disable_failed is enabled',
+ 'the user has permission',
+ 'a hook has failed'
+ ]
+
+ contexts.each do |name|
+ context "namely #{name}" do
+ contexts.each { |ctx| include_context(ctx) unless ctx == name }
+
+ it 'is false' do
+ expect(helper).not_to be_show_project_hook_failed_callout(project: project)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/initializers/00_connection_logger_spec.rb b/spec/initializers/00_connection_logger_spec.rb
deleted file mode 100644
index 8b288b463c4..00000000000
--- a/spec/initializers/00_connection_logger_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ActiveRecord::ConnectionAdapters::PostgreSQLAdapter do # rubocop:disable RSpec/FilePath
- before do
- allow(PG).to receive(:connect)
- end
-
- let(:conn_params) { PG::Connection.conndefaults_hash }
-
- context 'when warn_on_new_connection is enabled' do
- before do
- described_class.warn_on_new_connection = true
- end
-
- it 'warns on new connection' do
- expect(ActiveSupport::Deprecation)
- .to receive(:warn).with(/Database connection should not be called during initializers/, anything)
-
- expect(PG).to receive(:connect).with(conn_params)
-
- described_class.new_client(conn_params)
- end
- end
-
- context 'when warn_on_new_connection is disabled' do
- before do
- described_class.warn_on_new_connection = false
- end
-
- it 'does not warn on new connection' do
- expect(ActiveSupport::Deprecation).not_to receive(:warn)
- expect(PG).to receive(:connect).with(conn_params)
-
- described_class.new_client(conn_params)
- end
- end
-end
diff --git a/spec/initializers/0_log_deprecations_spec.rb b/spec/initializers/0_log_deprecations_spec.rb
index 35bceb2f132..f5065126eaf 100644
--- a/spec/initializers/0_log_deprecations_spec.rb
+++ b/spec/initializers/0_log_deprecations_spec.rb
@@ -3,6 +3,10 @@
require 'spec_helper'
RSpec.describe '0_log_deprecations' do
+ def setup_other_deprecations
+ Warning.process(__FILE__) { :default }
+ end
+
def load_initializer
load Rails.root.join('config/initializers/0_log_deprecations.rb')
end
@@ -11,16 +15,20 @@ RSpec.describe '0_log_deprecations' do
before do
stub_env('GITLAB_LOG_DEPRECATIONS', env_var)
+ setup_other_deprecations
load_initializer
end
after do
- # reset state changed by initializer
- Warning.clear
ActiveSupport::Notifications.unsubscribe('deprecation.rails')
end
- context 'for Ruby deprecations' do
+ around do |example|
+ # reset state changed by initializer
+ Warning.clear(&example)
+ end
+
+ describe 'Ruby deprecations' do
context 'when catching deprecations through Kernel#warn' do
it 'also logs them to deprecation logger' do
expect(Gitlab::DeprecationJsonLogger).to receive(:info).with(
@@ -32,7 +40,7 @@ RSpec.describe '0_log_deprecations' do
end
end
- context 'for other messages from Kernel#warn' do
+ describe 'other messages from Kernel#warn' do
it 'does not log them to deprecation logger' do
expect(Gitlab::DeprecationJsonLogger).not_to receive(:info)
@@ -51,7 +59,7 @@ RSpec.describe '0_log_deprecations' do
end
end
- context 'for Rails deprecations' do
+ describe 'Rails deprecations' do
it 'logs them to deprecation logger' do
expect(Gitlab::DeprecationJsonLogger).to receive(:info).with(
message: match(/^DEPRECATION WARNING: ABC will be removed/),
diff --git a/spec/initializers/100_patch_omniauth_oauth2_spec.rb b/spec/initializers/100_patch_omniauth_oauth2_spec.rb
index c30a1cdeafa..36a14816b7e 100644
--- a/spec/initializers/100_patch_omniauth_oauth2_spec.rb
+++ b/spec/initializers/100_patch_omniauth_oauth2_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'OmniAuth::Strategies::OAuth2' do
it 'verifies the gem version' do
current_version = OmniAuth::OAuth2::VERSION
- expected_version = '1.7.2'
+ expected_version = '1.7.3'
expect(current_version).to eq(expected_version), <<~EOF
New version #{current_version} of the `omniauth-oauth2` gem detected!
diff --git a/spec/initializers/1_acts_as_taggable_spec.rb b/spec/initializers/1_acts_as_taggable_spec.rb
new file mode 100644
index 00000000000..f9ccc9718d5
--- /dev/null
+++ b/spec/initializers/1_acts_as_taggable_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'ActsAsTaggableOn::Tag' do
+ describe '.find_or_create_all_with_like_by_name' do
+ let(:tags) { %w[tag] }
+
+ subject(:find_or_create) { ActsAsTaggableOn::Tag.find_or_create_all_with_like_by_name(tags) }
+
+ it 'creates a tag' do
+ expect { find_or_create }.to change(ActsAsTaggableOn::Tag, :count).by(1)
+ end
+
+ it 'returns the Tag record' do
+ results = find_or_create
+
+ expect(results.size).to eq(1)
+ expect(results.first).to be_an_instance_of(ActsAsTaggableOn::Tag)
+ expect(results.first.name).to eq('tag')
+ end
+
+ context 'some tags already existing' do
+ let(:tags) { %w[tag preexisting_tag tag2] }
+
+ before_all do
+ ActsAsTaggableOn::Tag.create!(name: 'preexisting_tag')
+ end
+
+ it 'creates only the missing tag' do
+ expect(ActsAsTaggableOn::Tag).to receive(:insert_all)
+ .with([{ name: 'tag' }, { name: 'tag2' }], unique_by: :name)
+ .and_call_original
+
+ expect { find_or_create }.to change(ActsAsTaggableOn::Tag, :count).by(2)
+ end
+
+ it 'returns the Tag records' do
+ results = find_or_create
+
+ expect(results.map(&:name)).to match_array(tags)
+ end
+ end
+
+ context 'all tags already existing' do
+ let(:tags) { %w[preexisting_tag preexisting_tag2] }
+
+ before_all do
+ ActsAsTaggableOn::Tag.create!(name: 'preexisting_tag')
+ ActsAsTaggableOn::Tag.create!(name: 'preexisting_tag2')
+ end
+
+ it 'does not create new tags' do
+ expect { find_or_create }.not_to change(ActsAsTaggableOn::Tag, :count)
+ end
+
+ it 'returns the Tag records' do
+ results = find_or_create
+
+ expect(results.map(&:name)).to match_array(tags)
+ end
+ end
+ end
+end
diff --git a/spec/initializers/enumerator_next_patch_spec.rb b/spec/initializers/enumerator_next_patch_spec.rb
new file mode 100644
index 00000000000..99e73af5e86
--- /dev/null
+++ b/spec/initializers/enumerator_next_patch_spec.rb
@@ -0,0 +1,167 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Enumerator#next patch fix' do
+ describe 'Enumerator' do
+ RSpec::Matchers.define :contain_unique_method_calls_in_order do |expected|
+ attr_reader :actual
+
+ match do |actual|
+ @actual_err = actual
+ regexps = expected.map { |method_name| { name: method_name, regexp: make_regexp(method_name) } }
+ @actual = actual.backtrace.filter_map do |line|
+ regexp = regexps.find { |r| r[:regexp].match? line }
+
+ regexp[:name] if regexp
+ end
+
+ expected == @actual
+ end
+
+ diffable
+
+ failure_message do
+ "#{super()}\n\nFull error backtrace:\n #{@actual_err.backtrace.join("\n ")}"
+ end
+
+ private
+
+ def make_regexp(method_name)
+ Regexp.new("/spec/initializers/enumerator_next_patch_spec\\.rb:[0-9]+:in `#{method_name}'$")
+ end
+ end
+
+ def have_been_raised_by_next_and_not_fixed_up
+ contain_unique_method_calls_in_order %w(call_enum_method)
+ end
+
+ def have_been_raised_by_enum_object_and_fixed_up
+ contain_unique_method_calls_in_order %w(make_error call_enum_method)
+ end
+
+ def have_been_raised_by_nested_next_and_fixed_up
+ contain_unique_method_calls_in_order %w(call_nested_next call_enum_method)
+ end
+
+ methods = [
+ {
+ name: 'next',
+ expected_value: 'Test value'
+ },
+ {
+ name: 'next_values',
+ expected_value: ['Test value']
+ },
+ {
+ name: 'peek',
+ expected_value: 'Test value'
+ },
+ {
+ name: 'peek_values',
+ expected_value: ['Test value']
+ }
+ ]
+
+ methods.each do |method|
+ describe "##{method[:name]}" do
+ def call_enum_method
+ enumerator.send(method_name)
+ end
+
+ let(:method_name) { method[:name] }
+
+ subject { call_enum_method }
+
+ describe 'normal yield' do
+ let(:enumerator) { Enumerator.new { |yielder| yielder << 'Test value' } }
+
+ it 'returns yielded value' do
+ is_expected.to eq(method[:expected_value])
+ end
+ end
+
+ describe 'end of iteration' do
+ let(:enumerator) { Enumerator.new { |_| } }
+
+ it 'does not fix up StopIteration' do
+ expect { subject }.to raise_error do |err|
+ expect(err).to be_a(StopIteration)
+ expect(err).to have_been_raised_by_next_and_not_fixed_up
+ end
+ end
+
+ context 'nested enum object' do
+ def call_nested_next
+ nested_enumerator.next
+ end
+
+ let(:nested_enumerator) { Enumerator.new { |_| } }
+ let(:enumerator) { Enumerator.new { |yielder| yielder << call_nested_next } }
+
+ it 'fixes up StopIteration thrown by another instance of #next' do
+ expect { subject }.to raise_error do |err|
+ expect(err).to be_a(StopIteration)
+ expect(err).to have_been_raised_by_nested_next_and_fixed_up
+ end
+ end
+ end
+ end
+
+ describe 'arguments error' do
+ def call_enum_method
+ enumerator.send(method_name, 'extra argument')
+ end
+
+ let(:enumerator) { Enumerator.new { |_| } }
+
+ it 'does not fix up ArgumentError' do
+ expect { subject }.to raise_error do |err|
+ expect(err).to be_a(ArgumentError)
+ expect(err).to have_been_raised_by_next_and_not_fixed_up
+ end
+ end
+ end
+
+ describe 'error' do
+ let(:enumerator) { Enumerator.new { |_| raise error } }
+ let(:error) { make_error }
+
+ it 'fixes up StopIteration' do
+ def make_error
+ StopIteration.new.tap { |err| err.set_backtrace(caller) }
+ end
+
+ expect { subject }.to raise_error do |err|
+ expect(err).to be(error)
+ expect(err).to have_been_raised_by_enum_object_and_fixed_up
+ end
+ end
+
+ it 'fixes up ArgumentError' do
+ def make_error
+ ArgumentError.new.tap { |err| err.set_backtrace(caller) }
+ end
+
+ expect { subject }.to raise_error do |err|
+ expect(err).to be(error)
+ expect(err).to have_been_raised_by_enum_object_and_fixed_up
+ end
+ end
+
+ it 'adds backtrace from other errors' do
+ def make_error
+ StandardError.new('This is a test').tap { |err| err.set_backtrace(caller) }
+ end
+
+ expect { subject }.to raise_error do |err|
+ expect(err).to be(error)
+ expect(err).to have_been_raised_by_enum_object_and_fixed_up
+ expect(err.message).to eq('This is a test')
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/initializers/set_active_support_hash_digest_class_spec.rb b/spec/initializers/set_active_support_hash_digest_class_spec.rb
deleted file mode 100644
index 256e8a1f218..00000000000
--- a/spec/initializers/set_active_support_hash_digest_class_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'setting ActiveSupport::Digest.hash_digest_class' do
- it 'sets overrides config.active_support.hash_digest_class' do
- expect(ActiveSupport::Digest.hash_digest_class).to eq(Gitlab::HashDigest::Facade)
- end
-end
diff --git a/spec/lib/api/ci/helpers/runner_spec.rb b/spec/lib/api/ci/helpers/runner_spec.rb
index 37277e7dcbd..6801d16d13e 100644
--- a/spec/lib/api/ci/helpers/runner_spec.rb
+++ b/spec/lib/api/ci/helpers/runner_spec.rb
@@ -66,4 +66,30 @@ RSpec.describe API::Ci::Helpers::Runner do
expect(helper.current_runner).to eq(runner)
end
end
+
+ describe '#track_runner_authentication', :prometheus do
+ subject { helper.track_runner_authentication }
+
+ let(:runner) { create(:ci_runner, token: 'foo') }
+
+ it 'increments gitlab_ci_runner_authentication_success_total' do
+ allow(helper).to receive(:params).and_return(token: runner.token)
+
+ success_counter = ::Gitlab::Ci::Runner::Metrics.runner_authentication_success_counter
+ failure_counter = ::Gitlab::Ci::Runner::Metrics.runner_authentication_failure_counter
+ expect { subject }.to change { success_counter.get(runner_type: 'instance_type') }.by(1)
+ .and not_change { success_counter.get(runner_type: 'project_type') }
+ .and not_change { failure_counter.get }
+ end
+
+ it 'increments gitlab_ci_runner_authentication_failure_total' do
+ allow(helper).to receive(:params).and_return(token: 'invalid')
+
+ success_counter = ::Gitlab::Ci::Runner::Metrics.runner_authentication_success_counter
+ failure_counter = ::Gitlab::Ci::Runner::Metrics.runner_authentication_failure_counter
+ expect { subject }.to change { failure_counter.get }.by(1)
+ .and not_change { success_counter.get(runner_type: 'instance_type') }
+ .and not_change { success_counter.get(runner_type: 'project_type') }
+ end
+ end
end
diff --git a/spec/lib/api/entities/ci/job_request/service_spec.rb b/spec/lib/api/entities/ci/job_request/service_spec.rb
new file mode 100644
index 00000000000..47c2c4e04c9
--- /dev/null
+++ b/spec/lib/api/entities/ci/job_request/service_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::Ci::JobRequest::Service do
+ let(:ports) { [{ number: 80, protocol: 'http', name: 'name' }]}
+ let(:service) do
+ instance_double(
+ ::Gitlab::Ci::Build::Image,
+ name: 'image_name',
+ entrypoint: ['foo'],
+ ports: ports,
+ pull_policy: ['if-not-present'],
+ alias: 'alias',
+ command: 'command',
+ variables: [{ key: 'key', value: 'value' }]
+ )
+ end
+
+ let(:entity) { described_class.new(service) }
+
+ subject(:result) { entity.as_json }
+
+ it 'exposes attributes' do
+ expect(result).to eq(
+ name: 'image_name',
+ entrypoint: ['foo'],
+ ports: ports,
+ pull_policy: ['if-not-present'],
+ alias: 'alias',
+ command: 'command',
+ variables: [{ key: 'key', value: 'value' }]
+ )
+ 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
+
+ context 'when the FF ci_docker_image_pull_policy is disabled' do
+ before do
+ stub_feature_flags(ci_docker_image_pull_policy: false)
+ end
+
+ it { is_expected.not_to have_key(:pull_policy) }
+ end
+end
diff --git a/spec/lib/api/entities/deploy_key_spec.rb b/spec/lib/api/entities/deploy_key_spec.rb
index 6427d6eac8f..50a27418488 100644
--- a/spec/lib/api/entities/deploy_key_spec.rb
+++ b/spec/lib/api/entities/deploy_key_spec.rb
@@ -15,8 +15,15 @@ RSpec.describe API::Entities::DeployKey do
title: deploy_key.title,
created_at: deploy_key.created_at,
expires_at: deploy_key.expires_at,
- key: deploy_key.key
+ key: deploy_key.key,
+ fingerprint_sha256: deploy_key.fingerprint_sha256
)
+
+ is_expected.to include(fingerprint: deploy_key.fingerprint) unless Gitlab::FIPS.enabled?
+ end
+
+ context 'when in FIPS mode', :fips_mode do
+ it { is_expected.not_to have_key(:fingerprint) }
end
end
end
diff --git a/spec/lib/api/helpers/pagination_strategies_spec.rb b/spec/lib/api/helpers/pagination_strategies_spec.rb
index e8a4243b407..16cc10182b0 100644
--- a/spec/lib/api/helpers/pagination_strategies_spec.rb
+++ b/spec/lib/api/helpers/pagination_strategies_spec.rb
@@ -55,9 +55,10 @@ RSpec.describe API::Helpers::PaginationStrategies do
allow(subject).to receive(:keyset_pagination_enabled?).and_return(false)
end
- context 'when keyset pagination is available for the relation' do
+ context 'when keyset pagination is available and enforced for the relation' do
before do
allow(Gitlab::Pagination::Keyset).to receive(:available_for_type?).and_return(true)
+ allow(Gitlab::Pagination::CursorBasedKeyset).to receive(:enforced_for_type?).and_return(true)
end
context 'when a request scope is given' do
@@ -70,6 +71,18 @@ RSpec.describe API::Helpers::PaginationStrategies do
subject.paginator(relation, request_scope)
end
+
+ context 'when keyset pagination is not enforced' do
+ before do
+ allow(Gitlab::Pagination::CursorBasedKeyset).to receive(:enforced_for_type?).and_return(false)
+ end
+
+ it 'returns no errors' do
+ expect(subject).not_to receive(:error!)
+
+ subject.paginator(relation, request_scope)
+ end
+ end
end
context 'when the scope limit is not exceeded' do
diff --git a/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb b/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
index 12ed47a1025..b3157dd15fb 100644
--- a/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
+++ b/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
@@ -4,6 +4,8 @@ require 'spec_helper'
RSpec.describe Atlassian::JiraConnect::Jwt::Asymmetric do
describe '#valid?' do
+ let_it_be(:private_key) { OpenSSL::PKey::RSA.generate 3072 }
+
subject(:asymmetric_jwt) { described_class.new(jwt, verification_claims) }
let(:verification_claims) { jwt_claims }
@@ -12,7 +14,6 @@ RSpec.describe Atlassian::JiraConnect::Jwt::Asymmetric do
let(:client_key) { '1234' }
let(:public_key_id) { '123e4567-e89b-12d3-a456-426614174000' }
let(:jwt_headers) { { kid: public_key_id } }
- let(:private_key) { OpenSSL::PKey::RSA.generate 2048 }
let(:jwt) { JWT.encode(jwt_claims, private_key, 'RS256', jwt_headers) }
let(:public_key) { private_key.public_key }
let(:install_keys_url) { "https://connect-install-keys.atlassian.com/#{public_key_id}" }
diff --git a/spec/lib/backup/gitaly_backup_spec.rb b/spec/lib/backup/gitaly_backup_spec.rb
index ab198fcbe1f..3a9c4dfe3fb 100644
--- a/spec/lib/backup/gitaly_backup_spec.rb
+++ b/spec/lib/backup/gitaly_backup_spec.rb
@@ -16,8 +16,8 @@ RSpec.describe Backup::GitalyBackup do
let(:expected_env) do
{
- 'SSL_CERT_FILE' => OpenSSL::X509::DEFAULT_CERT_FILE,
- 'SSL_CERT_DIR' => OpenSSL::X509::DEFAULT_CERT_DIR
+ 'SSL_CERT_FILE' => Gitlab::X509::Certificate.default_cert_file,
+ 'SSL_CERT_DIR' => Gitlab::X509::Certificate.default_cert_dir
}.merge(ENV)
end
diff --git a/spec/lib/banzai/filter/footnote_filter_spec.rb b/spec/lib/banzai/filter/footnote_filter_spec.rb
index 5ac7d3af733..26bca571fdc 100644
--- a/spec/lib/banzai/filter/footnote_filter_spec.rb
+++ b/spec/lib/banzai/filter/footnote_filter_spec.rb
@@ -56,6 +56,19 @@ RSpec.describe Banzai::Filter::FootnoteFilter do
it 'properly adds the necessary ids and classes' do
expect(doc.to_html).to eq filtered_footnote.strip
end
+
+ context 'when GITLAB_TEST_FOOTNOTE_ID is set' do
+ let(:test_footnote_id) { '42' }
+ let(:identifier) { test_footnote_id }
+
+ before do
+ stub_env('GITLAB_TEST_FOOTNOTE_ID', test_footnote_id)
+ end
+
+ it 'uses the test footnote ID instead of a random number' do
+ expect(doc.to_html).to eq filtered_footnote.strip
+ end
+ end
end
context 'when detecting footnotes' do
diff --git a/spec/lib/banzai/reference_parser/snippet_parser_spec.rb b/spec/lib/banzai/reference_parser/snippet_parser_spec.rb
index 3459784708f..e8ef4e7f6e3 100644
--- a/spec/lib/banzai/reference_parser/snippet_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/snippet_parser_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Banzai::ReferenceParser::SnippetParser do
end
before do
- project.add_user(project_member, :developer)
+ project.add_member(project_member, :developer)
end
describe '#nodes_visible_to_user' do
diff --git a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
index c42ca9bef3b..d775cf6b026 100644
--- a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
@@ -4,12 +4,12 @@ require 'spec_helper'
RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
describe '#transform' do
- let_it_be(:user) { create(:user) }
let_it_be(:parent) { create(:group) }
- let_it_be(:bulk_import) { create(:bulk_import, user: user) }
- let_it_be(:entity) do
- create(
+ let(:bulk_import) { build_stubbed(:bulk_import) }
+
+ let(:entity) do
+ build_stubbed(
:bulk_import_entity,
bulk_import: bulk_import,
source_full_path: 'source/full/path',
@@ -18,8 +18,8 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
)
end
- let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
- let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+ let(:tracker) { build_stubbed(:bulk_import_tracker, entity: entity) }
+ let(:context) { BulkImports::Pipeline::Context.new(tracker) }
let(:data) do
{
@@ -87,14 +87,63 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
end
context 'when destination namespace is empty' do
- it 'does not set parent id' do
- entity.update!(destination_namespace: '')
+ before do
+ entity.destination_namespace = ''
+ end
+ it 'does not set parent id' do
transformed_data = subject.transform(context, data)
expect(transformed_data).not_to have_key('parent_id')
end
end
end
+
+ describe 'group name transformation' do
+ context 'when destination namespace is empty' do
+ before do
+ entity.destination_namespace = ''
+ end
+
+ it 'does not transform name' do
+ transformed_data = subject.transform(context, data)
+
+ expect(transformed_data['name']).to eq('Source Group Name')
+ end
+ end
+
+ context 'when destination namespace is present' do
+ context 'when destination namespace does not have a group with same name' do
+ it 'does not transform name' do
+ transformed_data = subject.transform(context, data)
+
+ expect(transformed_data['name']).to eq('Source Group Name')
+ end
+ end
+
+ context 'when destination namespace already have a group with the same name' do
+ before do
+ create(:group, parent: parent, name: 'Source Group Name', path: 'group_1')
+ create(:group, parent: parent, name: 'Source Group Name(1)', path: 'group_2')
+ create(:group, parent: parent, name: 'Source Group Name(2)', path: 'group_3')
+ create(:group, parent: parent, name: 'Source Group Name(1)(1)', path: 'group_4')
+ end
+
+ it 'makes the name unique by appeding a counter', :aggregate_failures do
+ transformed_data = subject.transform(context, data.merge('name' => 'Source Group Name'))
+ expect(transformed_data['name']).to eq('Source Group Name(3)')
+
+ transformed_data = subject.transform(context, data.merge('name' => 'Source Group Name(2)'))
+ expect(transformed_data['name']).to eq('Source Group Name(2)(1)')
+
+ transformed_data = subject.transform(context, data.merge('name' => 'Source Group Name(1)'))
+ expect(transformed_data['name']).to eq('Source Group Name(1)(2)')
+
+ transformed_data = subject.transform(context, data.merge('name' => 'Source Group Name(1)(1)'))
+ expect(transformed_data['name']).to eq('Source Group Name(1)(1)(1)')
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/lib/bulk_imports/pipeline/runner_spec.rb b/spec/lib/bulk_imports/pipeline/runner_spec.rb
index 7235b7c95cd..810271818ae 100644
--- a/spec/lib/bulk_imports/pipeline/runner_spec.rb
+++ b/spec/lib/bulk_imports/pipeline/runner_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe BulkImports::Pipeline::Runner do
Class.new do
def initialize(options = {}); end
- def transform(context); end
+ def transform(context, data); end
end
end
@@ -23,7 +23,7 @@ RSpec.describe BulkImports::Pipeline::Runner do
Class.new do
def initialize(options = {}); end
- def load(context); end
+ def load(context, data); end
end
end
@@ -44,11 +44,73 @@ RSpec.describe BulkImports::Pipeline::Runner do
end
let_it_be_with_reload(:entity) { create(:bulk_import_entity) }
- let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
- let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker, extra: :data) }
+
+ let(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let(:context) { BulkImports::Pipeline::Context.new(tracker, extra: :data) }
subject { BulkImports::MyPipeline.new(context) }
+ shared_examples 'failed pipeline' do |exception_class, exception_message|
+ it 'logs import failure' do
+ expect_next_instance_of(Gitlab::Import::Logger) do |logger|
+ expect(logger).to receive(:error)
+ .with(
+ log_params(
+ context,
+ pipeline_step: :extractor,
+ pipeline_class: 'BulkImports::MyPipeline',
+ exception_class: exception_class,
+ exception_message: exception_message
+ )
+ )
+ end
+
+ expect { subject.run }
+ .to change(entity.failures, :count).by(1)
+
+ failure = entity.failures.first
+
+ expect(failure).to be_present
+ expect(failure.pipeline_class).to eq('BulkImports::MyPipeline')
+ expect(failure.pipeline_step).to eq('extractor')
+ expect(failure.exception_class).to eq(exception_class)
+ expect(failure.exception_message).to eq(exception_message)
+ end
+
+ context 'when pipeline is marked to abort on failure' do
+ before do
+ BulkImports::MyPipeline.abort_on_failure!
+ end
+
+ it 'logs a warn message and marks entity and tracker as failed' do
+ expect_next_instance_of(Gitlab::Import::Logger) do |logger|
+ expect(logger).to receive(:warn)
+ .with(
+ log_params(
+ context,
+ message: 'Aborting entity migration due to pipeline failure',
+ pipeline_class: 'BulkImports::MyPipeline'
+ )
+ )
+ end
+
+ subject.run
+
+ expect(entity.failed?).to eq(true)
+ expect(tracker.failed?).to eq(true)
+ end
+ end
+
+ context 'when pipeline is not marked to abort on failure' do
+ it 'does not mark entity as failed' do
+ subject.run
+
+ expect(tracker.failed?).to eq(true)
+ expect(entity.failed?).to eq(false)
+ end
+ end
+ end
+
describe 'pipeline runner' do
context 'when entity is not marked as failed' do
it 'runs pipeline extractor, transformer, loader' do
@@ -145,70 +207,65 @@ RSpec.describe BulkImports::Pipeline::Runner do
end
end
- context 'when exception is raised' do
+ context 'when the exception BulkImports::NetworkError is raised' do
before do
allow_next_instance_of(BulkImports::Extractor) do |extractor|
- allow(extractor).to receive(:extract).with(context).and_raise(StandardError, 'Error!')
+ allow(extractor).to receive(:extract).with(context).and_raise(
+ BulkImports::NetworkError.new(
+ 'Net::ReadTimeout',
+ response: instance_double(HTTParty::Response, code: reponse_status_code, headers: {})
+ )
+ )
end
end
- it 'logs import failure' do
- expect_next_instance_of(Gitlab::Import::Logger) do |logger|
- expect(logger).to receive(:error)
- .with(
- log_params(
- context,
- pipeline_step: :extractor,
- pipeline_class: 'BulkImports::MyPipeline',
- exception_class: 'StandardError',
- exception_message: 'Error!'
- )
- )
- end
+ context 'when exception is retriable' do
+ let(:reponse_status_code) { 429 }
- expect { subject.run }
- .to change(entity.failures, :count).by(1)
+ it 'raises the exception BulkImports::RetryPipelineError' do
+ expect { subject.run }.to raise_error(BulkImports::RetryPipelineError)
+ end
+ end
- failure = entity.failures.first
+ context 'when exception is not retriable' do
+ let(:reponse_status_code) { 503 }
- expect(failure).to be_present
- expect(failure.pipeline_class).to eq('BulkImports::MyPipeline')
- expect(failure.pipeline_step).to eq('extractor')
- expect(failure.exception_class).to eq('StandardError')
- expect(failure.exception_message).to eq('Error!')
+ it_behaves_like 'failed pipeline', 'BulkImports::NetworkError', 'Net::ReadTimeout'
end
+ end
- context 'when pipeline is marked to abort on failure' do
- before do
- BulkImports::MyPipeline.abort_on_failure!
- end
-
- it 'logs a warn message and marks entity as failed' do
- expect_next_instance_of(Gitlab::Import::Logger) do |logger|
- expect(logger).to receive(:warn)
- .with(
- log_params(
- context,
- message: 'Pipeline failed',
- pipeline_class: 'BulkImports::MyPipeline'
+ context 'when a retriable BulkImports::NetworkError exception is raised while extracting the next page' do
+ before do
+ call_count = 0
+ allow_next_instance_of(BulkImports::Extractor) do |extractor|
+ allow(extractor).to receive(:extract).with(context).twice do
+ if call_count.zero?
+ call_count += 1
+ extracted_data(has_next_page: true)
+ else
+ raise(
+ BulkImports::NetworkError.new(
+ response: instance_double(HTTParty::Response, code: 429, headers: {})
)
)
+ end
end
-
- subject.run
-
- expect(entity.status_name).to eq(:failed)
- expect(tracker.status_name).to eq(:failed)
end
end
- context 'when pipeline is not marked to abort on failure' do
- it 'does not mark entity as failed' do
- subject.run
+ it 'raises the exception BulkImports::RetryPipelineError' do
+ expect { subject.run }.to raise_error(BulkImports::RetryPipelineError)
+ end
+ end
- expect(entity.failed?).to eq(false)
+ context 'when the exception StandardError is raised' do
+ before do
+ allow_next_instance_of(BulkImports::Extractor) do |extractor|
+ allow(extractor).to receive(:extract).with(context).and_raise(StandardError, 'Error!')
end
end
+
+ it_behaves_like 'failed pipeline', 'StandardError', 'Error!'
end
end
diff --git a/spec/lib/bulk_imports/retry_pipeline_error_spec.rb b/spec/lib/bulk_imports/retry_pipeline_error_spec.rb
new file mode 100644
index 00000000000..9d96407b03a
--- /dev/null
+++ b/spec/lib/bulk_imports/retry_pipeline_error_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::RetryPipelineError do
+ describe '#retry_delay' do
+ it 'returns retry_delay' do
+ exception = described_class.new('Error!', 60)
+
+ expect(exception.retry_delay).to eq(60)
+ end
+ end
+end
diff --git a/spec/lib/container_registry/gitlab_api_client_spec.rb b/spec/lib/container_registry/gitlab_api_client_spec.rb
index 16d2c42f332..f2c627734a3 100644
--- a/spec/lib/container_registry/gitlab_api_client_spec.rb
+++ b/spec/lib/container_registry/gitlab_api_client_spec.rb
@@ -316,6 +316,17 @@ RSpec.describe ContainerRegistry::GitlabApiClient do
it { is_expected.to eq(nil) }
end
+
+ context 'with uppercase path' do
+ let(:path) { 'foo/Bar' }
+
+ before do
+ expect(Auth::ContainerRegistryAuthenticationService).to receive(:pull_nested_repositories_access_token).with(path.downcase).and_return(token)
+ stub_repository_details(path, sizing: :self_with_descendants, status_code: 200, respond_with: response)
+ end
+
+ it { is_expected.to eq(555) }
+ end
end
def stub_pre_import(path, status_code, pre:)
diff --git a/spec/lib/error_tracking/collector/dsn_spec.rb b/spec/lib/error_tracking/collector/dsn_spec.rb
deleted file mode 100644
index 3aa8719fe38..00000000000
--- a/spec/lib/error_tracking/collector/dsn_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ErrorTracking::Collector::Dsn do
- describe '.build_url' do
- let(:setting) do
- {
- protocol: 'https',
- https: true,
- port: 443,
- host: 'gitlab.example.com',
- relative_url_root: nil
- }
- end
-
- subject { described_class.build_url('abcdef1234567890', 778) }
-
- it 'returns a valid URL without explicit port' do
- stub_config_setting(setting)
-
- is_expected.to eq('https://abcdef1234567890@gitlab.example.com/api/v4/error_tracking/collector/778')
- end
-
- context 'with non-standard port' do
- it 'returns a valid URL with custom port' do
- setting[:port] = 4567
- stub_config_setting(setting)
-
- is_expected.to eq('https://abcdef1234567890@gitlab.example.com:4567/api/v4/error_tracking/collector/778')
- end
- end
- end
-end
diff --git a/spec/lib/error_tracking/stacktrace_builder_spec.rb b/spec/lib/error_tracking/stacktrace_builder_spec.rb
index 46d0bde8122..57eead13fc0 100644
--- a/spec/lib/error_tracking/stacktrace_builder_spec.rb
+++ b/spec/lib/error_tracking/stacktrace_builder_spec.rb
@@ -56,6 +56,35 @@ RSpec.describe ErrorTracking::StacktraceBuilder do
end
end
+ context 'when exception payload is a list' do
+ let(:payload_file) { 'error_tracking/go_two_exception_event.json' }
+
+ it 'extracts a stracktrace' do
+ expected_entry = {
+ 'lineNo' => 54,
+ 'context' => [
+ [49, "\t// Set the timeout to the maximum duration the program can afford to wait."],
+ [50, "\tdefer sentry.Flush(2 * time.Second)"],
+ [51, ""],
+ [52, "\tresp, err := http.Get(os.Args[1])"],
+ [53, "\tif err != nil {"],
+ [54, "\t\tsentry.CaptureException(err)"],
+ [55, "\t\tlog.Printf(\"reported to Sentry: %s\", err)"],
+ [56, "\t\treturn"],
+ [57, "\t}"],
+ [58, "\tdefer resp.Body.Close()"],
+ [59, ""]
+ ],
+ 'filename' => nil,
+ 'function' => 'main',
+ 'colNo' => 0
+ }
+
+ expect(stacktrace).to be_kind_of(Array)
+ expect(stacktrace.first).to eq(expected_entry)
+ end
+ end
+
context 'with empty payload' do
let(:payload) { {} }
diff --git a/spec/lib/feature_spec.rb b/spec/lib/feature_spec.rb
index 6e32db09426..4db3f04717b 100644
--- a/spec/lib/feature_spec.rb
+++ b/spec/lib/feature_spec.rb
@@ -512,6 +512,11 @@ RSpec.describe Feature, stub_feature_flags: false do
let(:expected_extra) { { "extra.thing" => "true" } }
end
+ # This is documented to return true, modify doc/administration/feature_flags.md if it changes
+ it 'returns true' do
+ expect(subject).to be true
+ end
+
context 'when thing is an actor' do
let(:thing) { create(:project) }
@@ -533,6 +538,11 @@ RSpec.describe Feature, stub_feature_flags: false do
let(:expected_extra) { { "extra.thing" => "false" } }
end
+ # This is documented to return true, modify doc/administration/feature_flags.md if it changes
+ it 'returns true' do
+ expect(subject).to be true
+ end
+
context 'when thing is an actor' do
let(:thing) { create(:project) }
diff --git a/spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb b/spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb
index 4cba9732c22..b6e1d59f6c0 100644
--- a/spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb
+++ b/spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb
@@ -38,6 +38,29 @@ RSpec.describe Gitlab::UsageMetricDefinition::RedisHllGenerator, :silence_stdout
expect(monthly_metric_definition["instrumentation_class"]).to eq('RedisHLLMetric')
end
+ context 'with multiple events', :aggregate_failures do
+ let(:event_2) { 'i_test_event_2' }
+ let(:args) { [category, event, event_2] }
+
+ it 'creates metric definition files' do
+ described_class.new(args).invoke_all
+
+ [event, event_2].each do |event|
+ weekly_metric_definition_path = Dir.glob(File.join(temp_dir, "metrics/counts_7d/*#{event}_weekly.yml")).first
+ monthly_metric_definition_path = Dir.glob(File.join(temp_dir, "metrics/counts_28d/*#{event}_monthly.yml")).first
+
+ weekly_metric_definition = YAML.safe_load(File.read(weekly_metric_definition_path))
+ monthly_metric_definition = YAML.safe_load(File.read(monthly_metric_definition_path))
+
+ expect(weekly_metric_definition).to include("key_path" => "redis_hll_counters.test_category.#{event}_weekly")
+ expect(monthly_metric_definition).to include("key_path" => "redis_hll_counters.test_category.#{event}_monthly")
+
+ expect(weekly_metric_definition["instrumentation_class"]).to eq('RedisHLLMetric')
+ expect(monthly_metric_definition["instrumentation_class"]).to eq('RedisHLLMetric')
+ end
+ end
+ end
+
context 'with ee option' do
let(:weekly_metric_definition_path) { Dir.glob(File.join(temp_dir, 'ee/config/metrics/counts_7d/*i_test_event_weekly.yml')).first }
let(:monthly_metric_definition_path) { Dir.glob(File.join(temp_dir, 'ee/config/metrics/counts_28d/*i_test_event_monthly.yml')).first }
diff --git a/spec/lib/generators/model/mocks/migration_file.txt b/spec/lib/generators/model/mocks/migration_file.txt
new file mode 100644
index 00000000000..e92c2d2b534
--- /dev/null
+++ b/spec/lib/generators/model/mocks/migration_file.txt
@@ -0,0 +1,26 @@
+# 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 CreateModelGeneratorTestFoos < Gitlab::Database::Migration[2.0]
+ # When using the methods "add_concurrent_index" or "remove_concurrent_index"
+ # you must disable the use of transactions
+ # as these methods can not run in an existing transaction.
+ # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure
+ # that either of them is the _only_ method called in the migration,
+ # any other changes should go in a separate migration.
+ # This ensures that upon failure _only_ the index creation or removing fails
+ # and can be retried or reverted easily.
+ #
+ # To disable transactions uncomment the following line and remove these
+ # comments:
+ # disable_ddl_transaction!
+
+ def change
+ create_table :model_generator_test_foos do |t|
+
+ t.timestamps null: false
+ end
+ end
+end
diff --git a/spec/lib/generators/model/mocks/model_file.txt b/spec/lib/generators/model/mocks/model_file.txt
new file mode 100644
index 00000000000..066db4bfd76
--- /dev/null
+++ b/spec/lib/generators/model/mocks/model_file.txt
@@ -0,0 +1,2 @@
+class ModelGeneratorTestFoo < ApplicationRecord
+end
diff --git a/spec/lib/generators/model/mocks/spec_file.txt b/spec/lib/generators/model/mocks/spec_file.txt
new file mode 100644
index 00000000000..efd700df0a1
--- /dev/null
+++ b/spec/lib/generators/model/mocks/spec_file.txt
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe ModelGeneratorTestFoo, type: :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
diff --git a/spec/lib/generators/model/model_generator_spec.rb b/spec/lib/generators/model/model_generator_spec.rb
new file mode 100644
index 00000000000..0e770190d25
--- /dev/null
+++ b/spec/lib/generators/model/model_generator_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Model::ModelGenerator do
+ let(:args) { ['ModelGeneratorTestFoo'] }
+ let(:options) { { 'migration' => true, 'timestamps' => true, 'indexes' => true, 'test_framework' => :rspec } }
+ let(:temp_dir) { Dir.mktmpdir }
+ let(:migration_file_path) { Dir.glob(File.join(temp_dir, 'db/migrate/*create_model_generator_test_foos.rb')).first }
+ let(:model_file_path) { File.join(temp_dir, 'app/models/model_generator_test_foo.rb') }
+ let(:spec_file_path) { File.join(temp_dir, 'spec/models/model_generator_test_foo_spec.rb') }
+
+ subject { described_class.new(args, options, { destination_root: temp_dir }) }
+
+ context 'when generating a model' do
+ after do
+ FileUtils.rm_rf(temp_dir)
+ end
+
+ it 'creates the model file with the right content' do
+ subject.invoke_all
+
+ expect(File).to exist(model_file_path)
+ mock_model_file_content = File.read(File.expand_path('./mocks/model_file.txt', __dir__))
+ model_file_content = File.read(model_file_path)
+ expect(model_file_content).to eq(mock_model_file_content)
+ end
+
+ it 'creates the migration file with the right content' do
+ subject.invoke_all
+
+ expect(File).to exist(migration_file_path)
+ mock_migration_file_content = File.read(File.expand_path('./mocks/migration_file.txt', __dir__))
+ migration_file_content = File.read(migration_file_path)
+ expect(migration_file_content).to eq(mock_migration_file_content)
+ end
+
+ it 'creates the spec file with the right content' do
+ subject.invoke_all
+
+ expect(File).to exist(spec_file_path)
+ mock_spec_file_content = File.read(File.expand_path('./mocks/spec_file.txt', __dir__))
+ spec_file_content = File.read(spec_file_path)
+ expect(spec_file_content).to eq(mock_spec_file_content)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb
index ec394bb9f05..34d5158a5ab 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::RecordsFetcher do
describe '#serialized_records' do
shared_context 'when records are loaded by maintainer' do
before do
- project.add_user(user, Gitlab::Access::DEVELOPER)
+ project.add_member(user, Gitlab::Access::DEVELOPER)
end
it 'returns all records' do
@@ -72,7 +72,7 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::RecordsFetcher do
context 'when records are loaded by guest' do
before do
- project.add_user(user, Gitlab::Access::GUEST)
+ project.add_member(user, Gitlab::Access::GUEST)
end
it 'filters out confidential issues' do
@@ -124,7 +124,7 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::RecordsFetcher do
end
before do
- project.add_user(user, Gitlab::Access::DEVELOPER)
+ project.add_member(user, Gitlab::Access::DEVELOPER)
stub_const('Gitlab::Analytics::CycleAnalytics::RecordsFetcher::MAX_RECORDS', 2)
end
diff --git a/spec/lib/gitlab/application_rate_limiter/base_strategy_spec.rb b/spec/lib/gitlab/application_rate_limiter/base_strategy_spec.rb
new file mode 100644
index 00000000000..b34ac538b24
--- /dev/null
+++ b/spec/lib/gitlab/application_rate_limiter/base_strategy_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::ApplicationRateLimiter::BaseStrategy do
+ describe '#increment' do
+ it 'raises NotImplementedError' do
+ expect { subject.increment('cache_key', 0) }.to raise_error(NotImplementedError)
+ end
+ end
+
+ describe '#read' do
+ it 'raises NotImplementedError' do
+ expect { subject.read('cache_key') }.to raise_error(NotImplementedError)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/application_rate_limiter/increment_per_action_spec.rb b/spec/lib/gitlab/application_rate_limiter/increment_per_action_spec.rb
new file mode 100644
index 00000000000..b74d2360711
--- /dev/null
+++ b/spec/lib/gitlab/application_rate_limiter/increment_per_action_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::ApplicationRateLimiter::IncrementPerAction, :freeze_time, :clean_gitlab_redis_rate_limiting do
+ let(:cache_key) { 'test' }
+ let(:expiry) { 60 }
+
+ subject(:counter) { described_class.new }
+
+ def increment
+ counter.increment(cache_key, expiry)
+ end
+
+ describe '#increment' do
+ it 'increments per call' do
+ expect(increment).to eq 1
+ expect(increment).to eq 2
+ expect(increment).to eq 3
+ end
+
+ it 'sets time to live (TTL) for the key' do
+ def ttl
+ Gitlab::Redis::RateLimiting.with { |r| r.ttl(cache_key) }
+ end
+
+ key_does_not_exist = -2
+
+ expect(ttl).to eq key_does_not_exist
+ expect { increment }.to change { ttl }.by(a_value > 0)
+ end
+ end
+
+ describe '#read' do
+ def read
+ counter.read(cache_key)
+ end
+
+ it 'returns 0 when there is no data' do
+ expect(read).to eq 0
+ end
+
+ it 'returns the correct value', :aggregate_failures do
+ increment
+ expect(read).to eq 1
+
+ increment
+ expect(read).to eq 2
+ end
+ end
+end
diff --git a/spec/lib/gitlab/application_rate_limiter/increment_per_actioned_resource_spec.rb b/spec/lib/gitlab/application_rate_limiter/increment_per_actioned_resource_spec.rb
new file mode 100644
index 00000000000..1f3ae2d749a
--- /dev/null
+++ b/spec/lib/gitlab/application_rate_limiter/increment_per_actioned_resource_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::ApplicationRateLimiter::IncrementPerActionedResource,
+ :freeze_time, :clean_gitlab_redis_rate_limiting do
+ let(:cache_key) { 'test' }
+ let(:expiry) { 60 }
+
+ def increment(resource_key)
+ described_class.new(resource_key).increment(cache_key, expiry)
+ end
+
+ describe '#increment' do
+ it 'increments per resource', :aggregate_failures do
+ expect(increment('resource_1')).to eq(1)
+ expect(increment('resource_1')).to eq(1)
+ expect(increment('resource_2')).to eq(2)
+ expect(increment('resource_2')).to eq(2)
+ expect(increment('resource_3')).to eq(3)
+ end
+
+ it 'sets time to live (TTL) for the key' do
+ def ttl
+ Gitlab::Redis::RateLimiting.with { |r| r.ttl(cache_key) }
+ end
+
+ key_does_not_exist = -2
+
+ expect(ttl).to eq key_does_not_exist
+ expect { increment('resource_1') }.to change { ttl }.by(a_value > 0)
+ end
+ end
+
+ describe '#read' do
+ def read
+ described_class.new(nil).read(cache_key)
+ end
+
+ it 'returns 0 when there is no data' do
+ expect(read).to eq 0
+ end
+
+ it 'returns the correct value', :aggregate_failures do
+ increment 'r1'
+ expect(read).to eq 1
+
+ increment 'r2'
+ expect(read).to eq 2
+ end
+ end
+end
diff --git a/spec/lib/gitlab/application_rate_limiter_spec.rb b/spec/lib/gitlab/application_rate_limiter_spec.rb
index efe78cd3a35..177ce1134d8 100644
--- a/spec/lib/gitlab/application_rate_limiter_spec.rb
+++ b/spec/lib/gitlab/application_rate_limiter_spec.rb
@@ -13,8 +13,8 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_rate_limiting
interval: 2.minutes
},
another_action: {
- threshold: 2,
- interval: 3.minutes
+ threshold: -> { 2 },
+ interval: -> { 3.minutes }
}
}
end
@@ -70,6 +70,44 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_rate_limiting
end
end
+ describe 'counting actions once per unique resource' do
+ let(:scope) { [user, project] }
+
+ let(:start_time) { Time.current.beginning_of_hour }
+ let(:project1) { instance_double(Project, id: '1') }
+ let(:project2) { instance_double(Project, id: '2') }
+
+ it 'returns true when unique actioned resources count exceeds threshold' do
+ travel_to(start_time) do
+ expect(subject.throttled?(:test_action, scope: scope, resource: project1)).to eq(false)
+ end
+
+ travel_to(start_time + 1.minute) do
+ expect(subject.throttled?(:test_action, scope: scope, resource: project2)).to eq(true)
+ end
+ end
+
+ it 'returns false when unique actioned resource count does not exceed threshold' do
+ travel_to(start_time) do
+ expect(subject.throttled?(:test_action, scope: scope, resource: project1)).to eq(false)
+ end
+
+ travel_to(start_time + 1.minute) do
+ expect(subject.throttled?(:test_action, scope: scope, resource: project1)).to eq(false)
+ end
+ end
+
+ it 'returns false when interval has elapsed' do
+ travel_to(start_time) do
+ expect(subject.throttled?(:test_action, scope: scope, resource: project1)).to eq(false)
+ end
+
+ travel_to(start_time + 2.minutes) do
+ expect(subject.throttled?(:test_action, scope: scope, resource: project2)).to eq(false)
+ end
+ end
+ end
+
shared_examples 'throttles based on key and scope' do
let(:start_time) { Time.current.beginning_of_hour }
@@ -91,7 +129,7 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_rate_limiting
travel_to(start_time) do
expect(subject.throttled?(:test_action, scope: scope)).to eq(false)
- # another_action has a threshold of 3 so we simulate 2 requests
+ # another_action has a threshold of 2 so we simulate 2 requests
expect(subject.throttled?(:another_action, scope: scope)).to eq(false)
expect(subject.throttled?(:another_action, scope: scope)).to eq(false)
end
@@ -189,4 +227,20 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_rate_limiting
end
end
end
+
+ context 'when interval is 0' do
+ let(:rate_limits) { { test_action: { threshold: 1, interval: 0 } } }
+ let(:scope) { user }
+ let(:start_time) { Time.current.beginning_of_hour }
+
+ it 'returns false' do
+ travel_to(start_time) do
+ expect(subject.throttled?(:test_action, scope: scope)).to eq(false)
+ end
+
+ travel_to(start_time + 1.minute) do
+ expect(subject.throttled?(:test_action, scope: scope)).to eq(false)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/auth/ldap/user_spec.rb b/spec/lib/gitlab/auth/ldap/user_spec.rb
index da0bb5fe675..b471a89b491 100644
--- a/spec/lib/gitlab/auth/ldap/user_spec.rb
+++ b/spec/lib/gitlab/auth/ldap/user_spec.rb
@@ -49,6 +49,24 @@ RSpec.describe Gitlab::Auth::Ldap::User do
end
end
+ describe '#valid_sign_in?' do
+ before do
+ gl_user.save!
+ end
+
+ it 'returns true' do
+ expect(Gitlab::Auth::Ldap::Access).to receive(:allowed?).and_return(true)
+ expect(ldap_user.valid_sign_in?).to be true
+ end
+
+ it 'returns false if the GitLab user is not valid' do
+ gl_user.update_column(:username, nil)
+
+ expect(Gitlab::Auth::Ldap::Access).not_to receive(:allowed?)
+ expect(ldap_user.valid_sign_in?).to be false
+ end
+ end
+
describe 'find or create' do
it "finds the user if already existing" do
create(:omniauth_user, extern_uid: 'uid=john smith,ou=people,dc=example,dc=com', provider: 'ldapmain')
diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb
index f5a74956174..1e869df0988 100644
--- a/spec/lib/gitlab/auth_spec.rb
+++ b/spec/lib/gitlab/auth_spec.rb
@@ -481,6 +481,17 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching do
end
it_behaves_like 'with an invalid access token'
+
+ context 'when the token belongs to a group via project share' do
+ let_it_be(:invited_group) { create(:group) }
+
+ before do
+ invited_group.add_maintainer(project_bot_user)
+ create(:project_group_link, group: invited_group, project: project)
+ end
+
+ it_behaves_like 'with a valid access token'
+ end
end
end
end
diff --git a/spec/lib/gitlab/background_migration/backfill_ci_runner_semver_spec.rb b/spec/lib/gitlab/background_migration/backfill_ci_runner_semver_spec.rb
new file mode 100644
index 00000000000..7c78d8b0305
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_ci_runner_semver_spec.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillCiRunnerSemver, :migration, schema: 20220601151900 do
+ let(:ci_runners) { table(:ci_runners, database: :ci) }
+
+ subject do
+ described_class.new(
+ start_id: 10,
+ end_id: 15,
+ batch_table: :ci_runners,
+ batch_column: :id,
+ sub_batch_size: 10,
+ pause_ms: 0,
+ connection: Ci::ApplicationRecord.connection)
+ end
+
+ describe '#perform' do
+ it 'populates semver column on all runners in range' do
+ ci_runners.create!(id: 10, runner_type: 1, version: %q(HEAD-fd84d97))
+ ci_runners.create!(id: 11, runner_type: 1, version: %q(v1.2.3))
+ ci_runners.create!(id: 12, runner_type: 1, version: %q(2.1.0))
+ ci_runners.create!(id: 13, runner_type: 1, version: %q(11.8.0~beta.935.g7f6d2abc))
+ ci_runners.create!(id: 14, runner_type: 1, version: %q(13.2.2/1.1.0))
+ ci_runners.create!(id: 15, runner_type: 1, version: %q('14.3.4'))
+
+ subject.perform
+
+ expect(ci_runners.all).to contain_exactly(
+ an_object_having_attributes(id: 10, semver: nil),
+ an_object_having_attributes(id: 11, semver: '1.2.3'),
+ an_object_having_attributes(id: 12, semver: '2.1.0'),
+ an_object_having_attributes(id: 13, semver: '11.8.0'),
+ an_object_having_attributes(id: 14, semver: '13.2.2'),
+ an_object_having_attributes(id: 15, semver: '14.3.4')
+ )
+ end
+
+ it 'skips runners that already have semver value' do
+ ci_runners.create!(id: 10, runner_type: 1, version: %q(1.2.4), semver: '1.2.3')
+ ci_runners.create!(id: 11, runner_type: 1, version: %q(1.2.5))
+ ci_runners.create!(id: 12, runner_type: 1, version: %q(HEAD), semver: '1.2.4')
+
+ subject.perform
+
+ expect(ci_runners.all).to contain_exactly(
+ an_object_having_attributes(id: 10, semver: '1.2.3'),
+ an_object_having_attributes(id: 11, semver: '1.2.5'),
+ an_object_having_attributes(id: 12, semver: '1.2.4')
+ )
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_imported_issue_search_data_spec.rb b/spec/lib/gitlab/background_migration/backfill_imported_issue_search_data_spec.rb
new file mode 100644
index 00000000000..e363a5a6b20
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_imported_issue_search_data_spec.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillImportedIssueSearchData,
+ :migration,
+ schema: 20220707075300 do
+ let!(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let!(:issue_search_data_table) { table(:issue_search_data) }
+
+ let!(:user) { table(:users).create!(email: 'author@example.com', username: 'author', projects_limit: 10) }
+ let!(:project) do
+ table(:projects)
+ .create!(
+ namespace_id: namespace.id,
+ creator_id: user.id,
+ name: 'projecty',
+ path: 'path',
+ project_namespace_id: namespace.id)
+ end
+
+ let!(:issue) do
+ table(:issues).create!(
+ project_id: project.id,
+ title: 'Patterson',
+ description: FFaker::HipsterIpsum.paragraph
+ )
+ end
+
+ let(:migration) do
+ described_class.new(start_id: issue.id,
+ end_id: issue.id + 30,
+ batch_table: :issues,
+ batch_column: :id,
+ sub_batch_size: 2,
+ pause_ms: 0,
+ connection: ApplicationRecord.connection)
+ end
+
+ let(:perform_migration) { migration.perform }
+
+ context 'when issue has search data record' do
+ let!(:issue_search_data) { issue_search_data_table.create!(project_id: project.id, issue_id: issue.id) }
+
+ it 'does not create or update any search data records' do
+ expect { perform_migration }
+ .to not_change { issue_search_data_table.count }
+ .and not_change { issue_search_data }
+
+ expect(issue_search_data_table.count).to eq(1)
+ end
+ end
+
+ context 'when issue has no search data record' do
+ let(:title_node) { "'#{issue.title.downcase}':1A" }
+
+ it 'creates search data records' do
+ expect { perform_migration }
+ .to change { issue_search_data_table.count }.from(0).to(1)
+
+ expect(issue_search_data_table.find_by(project_id: project.id).issue_id)
+ .to eq(issue.id)
+
+ expect(issue_search_data_table.find_by(project_id: project.id).search_vector)
+ .to include(title_node)
+ end
+ end
+
+ context 'error handling' do
+ let!(:issue2) do
+ table(:issues).create!(
+ project_id: project.id,
+ title: 'Chatterton',
+ description: FFaker::HipsterIpsum.paragraph
+ )
+ end
+
+ before do
+ issue.update!(description: Array.new(30_000) { SecureRandom.hex }.join(' '))
+ end
+
+ let(:title_node2) { "'#{issue2.title.downcase}':1A" }
+
+ it 'skips insertion for that issue but continues with migration' do
+ expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |logger|
+ expect(logger)
+ .to receive(:error)
+ .with(a_hash_including(message: /string is too long for tsvector/, model_id: issue.id))
+ end
+
+ expect { perform_migration }.to change { issue_search_data_table.count }.from(0).to(1)
+ expect(issue_search_data_table.find_by(issue_id: issue.id)).to eq(nil)
+ expect(issue_search_data_table.find_by(issue_id: issue2.id).search_vector)
+ .to include(title_node2)
+ end
+
+ it 're-raises exceptions' do
+ allow(migration)
+ .to receive(:update_search_data_individually)
+ .and_raise(ActiveRecord::StatementTimeout)
+
+ expect { perform_migration }.to raise_error(ActiveRecord::StatementTimeout)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
index cfa03db52fe..b5122af5cd4 100644
--- a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
@@ -47,10 +47,7 @@ RSpec.describe Gitlab::BackgroundMigration::BackfillSnippetRepositories, :migrat
before do
allow(snippet_with_repo).to receive(:disk_path).and_return(disk_path(snippet_with_repo))
- TestEnv.copy_repo(snippet_with_repo,
- bare_repo: TestEnv.factory_repo_path_bare,
- refs: TestEnv::BRANCH_SHA)
-
+ raw_repository(snippet_with_repo).create_from_bundle(TestEnv.factory_repo_bundle_path)
raw_repository(snippet_with_empty_repo).create_repository
end
diff --git a/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb b/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb
index f8b3a8681f0..98866bb765f 100644
--- a/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb
+++ b/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb
@@ -92,5 +92,69 @@ RSpec.describe Gitlab::BackgroundMigration::BatchedMigrationJob do
end
end
end
+
+ context 'when the subclass uses distinct each batch' do
+ let(:job_instance) do
+ job_class.new(start_id: 1,
+ end_id: 100,
+ batch_table: '_test_table',
+ batch_column: 'from_column',
+ sub_batch_size: 2,
+ pause_ms: 10,
+ connection: connection)
+ end
+
+ let(:job_class) do
+ Class.new(described_class) do
+ def perform(*job_arguments)
+ distinct_each_batch(operation_name: :insert) do |sub_batch|
+ sub_batch.pluck(:from_column).each do |value|
+ connection.execute("INSERT INTO _test_insert_table VALUES (#{value})")
+ end
+
+ sub_batch.size
+ end
+ end
+ end
+ end
+
+ let(:test_table) { table(:_test_table) }
+ let(:test_insert_table) { table(:_test_insert_table) }
+
+ before do
+ allow(job_instance).to receive(:sleep)
+
+ connection.create_table :_test_table do |t|
+ t.timestamps_with_timezone null: false
+ t.integer :from_column, null: false
+ end
+
+ connection.create_table :_test_insert_table, id: false do |t|
+ t.integer :to_column
+ t.index :to_column, unique: true
+ end
+
+ test_table.create!(id: 1, from_column: 5)
+ test_table.create!(id: 2, from_column: 10)
+ test_table.create!(id: 3, from_column: 10)
+ test_table.create!(id: 4, from_column: 5)
+ test_table.create!(id: 5, from_column: 15)
+ end
+
+ after do
+ connection.drop_table(:_test_table)
+ connection.drop_table(:_test_insert_table)
+ end
+
+ it 'calls the operation for each distinct batch' do
+ expect { perform_job }.to change { test_insert_table.pluck(:to_column) }.from([]).to([5, 10, 15])
+ end
+
+ it 'stores the affected rows' do
+ perform_job
+
+ expect(job_instance.batch_metrics.affected_rows[:insert]).to contain_exactly(2, 1)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb
new file mode 100644
index 00000000000..94e9bcf9207
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb
@@ -0,0 +1,138 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::BackfillProjectStatisticsWithContainerRegistrySizeBatchingStrategy, '#next_batch' do # rubocop:disable Layout/LineLength
+ let(:batching_strategy) { described_class.new(connection: ActiveRecord::Base.connection) }
+ let(:namespace) { table(:namespaces) }
+ let(:project) { table(:projects) }
+ let(:container_repositories) { table(:container_repositories) }
+
+ let!(:group) do
+ namespace.create!(
+ name: 'namespace1', type: 'Group', path: 'space1'
+ )
+ end
+
+ let!(:proj_namespace1) do
+ namespace.create!(
+ name: 'proj1', path: 'proj1', type: 'Project', parent_id: group.id
+ )
+ end
+
+ let!(:proj_namespace2) do
+ namespace.create!(
+ name: 'proj2', path: 'proj2', type: 'Project', parent_id: group.id
+ )
+ end
+
+ let!(:proj_namespace3) do
+ namespace.create!(
+ name: 'proj3', path: 'proj3', type: 'Project', parent_id: group.id
+ )
+ end
+
+ let!(:proj1) do
+ project.create!(
+ name: 'proj1', path: 'proj1', namespace_id: group.id, project_namespace_id: proj_namespace1.id
+ )
+ end
+
+ let!(:proj2) do
+ project.create!(
+ name: 'proj2', path: 'proj2', namespace_id: group.id, project_namespace_id: proj_namespace2.id
+ )
+ end
+
+ let!(:proj3) do
+ project.create!(
+ name: 'proj3', path: 'proj3', namespace_id: group.id, project_namespace_id: proj_namespace3.id
+ )
+ end
+
+ let!(:con1) do
+ container_repositories.create!(
+ project_id: proj1.id,
+ name: "ContReg_#{proj1.id}:1",
+ migration_state: 'import_done',
+ created_at: Date.new(2022, 01, 20)
+ )
+ end
+
+ let!(:con2) do
+ container_repositories.create!(
+ project_id: proj1.id,
+ name: "ContReg_#{proj1.id}:2",
+ migration_state: 'import_done',
+ created_at: Date.new(2022, 01, 20)
+ )
+ end
+
+ let!(:con3) do
+ container_repositories.create!(
+ project_id: proj2.id,
+ name: "ContReg_#{proj2.id}:1",
+ migration_state: 'import_done',
+ created_at: Date.new(2022, 01, 20)
+ )
+ end
+
+ let!(:con4) do
+ container_repositories.create!(
+ project_id: proj3.id,
+ name: "ContReg_#{proj3.id}:1",
+ migration_state: 'default',
+ created_at: Date.new(2022, 02, 20)
+ )
+ end
+
+ let!(:con5) do
+ container_repositories.create!(
+ project_id: proj3.id,
+ name: "ContReg_#{proj3.id}:2",
+ migration_state: 'default',
+ created_at: Date.new(2022, 02, 20)
+ )
+ end
+
+ it { expect(described_class).to be < Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy }
+
+ context 'when starting on the first batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = batching_strategy.next_batch(
+ :container_repositories,
+ :project_id,
+ batch_min_value: con1.project_id,
+ batch_size: 3,
+ job_arguments: []
+ )
+ expect(batch_bounds).to eq([con1.project_id, con4.project_id])
+ end
+ end
+
+ context 'when additional batches remain' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = batching_strategy.next_batch(
+ :container_repositories,
+ :project_id,
+ batch_min_value: con3.project_id,
+ batch_size: 3,
+ job_arguments: []
+ )
+
+ expect(batch_bounds).to eq([con3.project_id, con5.project_id])
+ end
+ end
+
+ context 'when no additional batches remain' do
+ it 'returns nil' do
+ batch_bounds = batching_strategy.next_batch(:container_repositories,
+ :project_id,
+ batch_min_value: con5.project_id + 1,
+ batch_size: 1, job_arguments: []
+ )
+
+ expect(batch_bounds).to be_nil
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy_spec.rb
new file mode 100644
index 00000000000..f96c7de50f2
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/batching_strategies/dismissed_vulnerabilities_strategy_spec.rb
@@ -0,0 +1,119 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::DismissedVulnerabilitiesStrategy, '#next_batch' do
+ let(:batching_strategy) { described_class.new(connection: ActiveRecord::Base.connection) }
+ let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let(:users) { table(:users) }
+ let(:user) { create_user! }
+ let(:project) do
+ table(:projects).create!(
+ namespace_id: namespace.id,
+ project_namespace_id: namespace.id,
+ packages_enabled: false)
+ end
+
+ let(:vulnerabilities) { table(:vulnerabilities) }
+
+ let!(:vulnerability1) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id,
+ dismissed_at: Time.current
+ )
+ end
+
+ let!(:vulnerability2) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id,
+ dismissed_at: Time.current
+ )
+ end
+
+ let!(:vulnerability3) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id,
+ dismissed_at: Time.current
+ )
+ end
+
+ let!(:vulnerability4) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id,
+ dismissed_at: nil
+ )
+ end
+
+ it { expect(described_class).to be < Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy }
+
+ context 'when starting on the first batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = batching_strategy.next_batch(
+ :vulnerabilities,
+ :id,
+ batch_min_value: vulnerability1.id,
+ batch_size: 2,
+ job_arguments: []
+ )
+ expect(batch_bounds).to eq([vulnerability1.id, vulnerability2.id])
+ end
+ end
+
+ context 'when additional batches remain' do
+ it 'returns the bounds of the next batch and skips the records that do not have `dismissed_at` set' do
+ batch_bounds = batching_strategy.next_batch(
+ :vulnerabilities,
+ :id,
+ batch_min_value: vulnerability3.id,
+ batch_size: 2,
+ job_arguments: []
+ )
+
+ expect(batch_bounds).to eq([vulnerability3.id, vulnerability3.id])
+ end
+ end
+
+ context 'when no additional batches remain' do
+ it 'returns nil' do
+ batch_bounds = batching_strategy.next_batch(
+ :vulnerabilities,
+ :id,
+ batch_min_value: vulnerability4.id + 1,
+ batch_size: 1,
+ job_arguments: []
+ )
+
+ expect(batch_bounds).to be_nil
+ end
+ end
+
+ private
+
+ def create_vulnerability!(
+ project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0, state: 1, dismissed_at: nil
+ )
+ vulnerabilities.create!(
+ project_id: project_id,
+ author_id: author_id,
+ title: title,
+ severity: severity,
+ confidence: confidence,
+ report_type: report_type,
+ state: state,
+ dismissed_at: dismissed_at
+ )
+ end
+
+ def create_user!(name: "Example User", email: "user@example.com", user_type: nil)
+ users.create!(
+ name: name,
+ email: email,
+ username: name,
+ projects_limit: 10
+ )
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy_spec.rb
new file mode 100644
index 00000000000..1a00fd7c8b3
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::LooseIndexScanBatchingStrategy, '#next_batch' do
+ let(:batching_strategy) { described_class.new(connection: ActiveRecord::Base.connection) }
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:issues) { table(:issues) }
+
+ let!(:namespace1) { namespaces.create!(name: 'ns1', path: 'ns1') }
+ let!(:namespace2) { namespaces.create!(name: 'ns2', path: 'ns2') }
+ let!(:namespace3) { namespaces.create!(name: 'ns3', path: 'ns3') }
+ let!(:namespace4) { namespaces.create!(name: 'ns4', path: 'ns4') }
+ let!(:namespace5) { namespaces.create!(name: 'ns5', path: 'ns5') }
+ let!(:project1) { projects.create!(name: 'p1', namespace_id: namespace1.id, project_namespace_id: namespace1.id) }
+ let!(:project2) { projects.create!(name: 'p2', namespace_id: namespace2.id, project_namespace_id: namespace2.id) }
+ let!(:project3) { projects.create!(name: 'p3', namespace_id: namespace3.id, project_namespace_id: namespace3.id) }
+ let!(:project4) { projects.create!(name: 'p4', namespace_id: namespace4.id, project_namespace_id: namespace4.id) }
+ let!(:project5) { projects.create!(name: 'p5', namespace_id: namespace5.id, project_namespace_id: namespace5.id) }
+
+ let!(:issue1) { issues.create!(title: 'title', description: 'description', project_id: project2.id) }
+ let!(:issue2) { issues.create!(title: 'title', description: 'description', project_id: project1.id) }
+ let!(:issue3) { issues.create!(title: 'title', description: 'description', project_id: project2.id) }
+ let!(:issue4) { issues.create!(title: 'title', description: 'description', project_id: project3.id) }
+ let!(:issue5) { issues.create!(title: 'title', description: 'description', project_id: project2.id) }
+ let!(:issue6) { issues.create!(title: 'title', description: 'description', project_id: project4.id) }
+ let!(:issue7) { issues.create!(title: 'title', description: 'description', project_id: project5.id) }
+
+ it { expect(described_class).to be < Gitlab::BackgroundMigration::BatchingStrategies::BaseStrategy }
+
+ context 'when starting on the first batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = batching_strategy
+ .next_batch(:issues, :project_id, batch_min_value: project1.id, batch_size: 2, job_arguments: [])
+
+ expect(batch_bounds).to eq([project1.id, project2.id])
+ end
+ end
+
+ context 'when additional batches remain' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = batching_strategy
+ .next_batch(:issues, :project_id, batch_min_value: project2.id, batch_size: 3, job_arguments: [])
+
+ expect(batch_bounds).to eq([project2.id, project4.id])
+ end
+ end
+
+ context 'when on the final batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = batching_strategy
+ .next_batch(:issues, :project_id, batch_min_value: project4.id, batch_size: 3, job_arguments: [])
+
+ expect(batch_bounds).to eq([project4.id, project5.id])
+ end
+ end
+
+ context 'when no additional batches remain' do
+ it 'returns nil' do
+ batch_bounds = batching_strategy
+ .next_batch(:issues, :project_id, batch_min_value: project5.id + 1, batch_size: 1, job_arguments: [])
+
+ expect(batch_bounds).to be_nil
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
index 521e2067744..943b5744b64 100644
--- a/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
+++ b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
@@ -45,10 +45,30 @@ RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchi
end
end
+ context 'when job_class is provided with a batching_scope' do
+ let(:job_class) do
+ Class.new(described_class) do
+ def self.batching_scope(relation, job_arguments:)
+ min_id = job_arguments.first
+
+ relation.where.not(type: 'Project').where('id >= ?', min_id)
+ end
+ end
+ end
+
+ it 'applies the batching scope' do
+ expect(job_class).to receive(:batching_scope).and_call_original
+
+ batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace4.id, batch_size: 3, job_arguments: [1], job_class: job_class)
+
+ expect(batch_bounds).to eq([namespace4.id, namespace4.id])
+ end
+ end
+
context 'additional filters' do
let(:strategy_with_filters) do
Class.new(described_class) do
- def apply_additional_filters(relation, job_arguments:)
+ def apply_additional_filters(relation, job_arguments:, job_class: nil)
min_id = job_arguments.first
relation.where.not(type: 'Project').where('id >= ?', min_id)
diff --git a/spec/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects_spec.rb b/spec/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects_spec.rb
new file mode 100644
index 00000000000..f5a2dc91185
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects_spec.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::DisableLegacyOpenSourceLicenseForInactivePublicProjects, :migration do
+ let(:namespaces_table) { table(:namespaces) }
+ let(:projects_table) { table(:projects) }
+ let(:project_settings_table) { table(:project_settings) }
+
+ subject(:perform_migration) do
+ described_class.new(start_id: projects_table.minimum(:id),
+ end_id: projects_table.maximum(:id),
+ batch_table: :projects,
+ batch_column: :id,
+ sub_batch_size: 2,
+ pause_ms: 0,
+ connection: ActiveRecord::Base.connection)
+ .perform
+ end
+
+ let(:queries) { ActiveRecord::QueryRecorder.new { perform_migration } }
+
+ let(:namespace_1) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-1') }
+ let(:project_namespace_2) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-2', type: 'Project') }
+ let(:project_namespace_3) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-3', type: 'Project') }
+ let(:project_namespace_4) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-4', type: 'Project') }
+ let(:project_namespace_5) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-5', type: 'Project') }
+
+ let(:project_1) do
+ projects_table
+ .create!(
+ name: 'proj-1', path: 'path-1', namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_2.id, visibility_level: 0
+ )
+ end
+
+ let(:project_2) do
+ projects_table
+ .create!(
+ name: 'proj-2', path: 'path-2', namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_3.id, visibility_level: 10
+ )
+ end
+
+ let(:project_3) do
+ projects_table
+ .create!(
+ name: 'proj-3', path: 'path-3', namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_4.id, visibility_level: 20, last_activity_at: '2021-01-01'
+ )
+ end
+
+ let(:project_4) do
+ projects_table
+ .create!(
+ name: 'proj-4', path: 'path-4', namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_5.id, visibility_level: 20, last_activity_at: '2022-01-01'
+ )
+ end
+
+ before do
+ project_settings_table.create!(project_id: project_1.id, legacy_open_source_license_available: true)
+ project_settings_table.create!(project_id: project_2.id, legacy_open_source_license_available: true)
+ project_settings_table.create!(project_id: project_3.id, legacy_open_source_license_available: true)
+ project_settings_table.create!(project_id: project_4.id, legacy_open_source_license_available: true)
+ end
+
+ it 'sets `legacy_open_source_license_available` attribute to false for inactive, public projects',
+ :aggregate_failures do
+ expect(queries.count).to eq(5)
+
+ expect(migrated_attribute(project_1.id)).to be_truthy
+ expect(migrated_attribute(project_2.id)).to be_truthy
+ expect(migrated_attribute(project_3.id)).to be_falsey
+ expect(migrated_attribute(project_4.id)).to be_truthy
+ end
+
+ def migrated_attribute(project_id)
+ project_settings_table.find(project_id).legacy_open_source_license_available
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations_spec.rb b/spec/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations_spec.rb
new file mode 100644
index 00000000000..1ebdca136a3
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::PopulateOperationVisibilityPermissionsFromOperations do
+ let(:namespaces) { table(:namespaces) }
+ let(:project_features) { table(:project_features) }
+ let(:projects) { table(:projects) }
+
+ let(:namespace) { namespaces.create!(name: 'user', path: 'user') }
+
+ let(:proj_namespace1) { namespaces.create!(name: 'proj1', path: 'proj1', type: 'Project', parent_id: namespace.id) }
+ let(:proj_namespace2) { namespaces.create!(name: 'proj2', path: 'proj2', type: 'Project', parent_id: namespace.id) }
+ let(:proj_namespace3) { namespaces.create!(name: 'proj3', path: 'proj3', type: 'Project', parent_id: namespace.id) }
+
+ let(:project1) { create_project('test1', proj_namespace1) }
+ let(:project2) { create_project('test2', proj_namespace2) }
+ let(:project3) { create_project('test3', proj_namespace3) }
+
+ let!(:record1) { create_project_feature(project1) }
+ let!(:record2) { create_project_feature(project2, 20) }
+ let!(:record3) { create_project_feature(project3) }
+
+ let(:sub_batch_size) { 2 }
+ let(:start_id) { record1.id }
+ let(:end_id) { record3.id }
+ let(:batch_table) { :project_features }
+ let(:batch_column) { :id }
+ let(:pause_ms) { 1 }
+ let(:connection) { ApplicationRecord.connection }
+
+ let(:job) do
+ described_class.new(
+ start_id: start_id,
+ end_id: end_id,
+ batch_table: batch_table,
+ batch_column: batch_column,
+ sub_batch_size: sub_batch_size,
+ pause_ms: pause_ms,
+ connection: connection
+ )
+ end
+
+ subject(:perform) { job.perform }
+
+ it 'updates all project settings records from their operations_access_level', :aggregate_failures do
+ perform
+
+ expect_project_features_match_operations_access_level(record1)
+ expect_project_features_match_operations_access_level(record2)
+ expect_project_features_match_operations_access_level(record3)
+ end
+
+ private
+
+ def expect_project_features_match_operations_access_level(record)
+ record.reload
+ expect(record.monitor_access_level).to eq(record.operations_access_level)
+ expect(record.infrastructure_access_level).to eq(record.operations_access_level)
+ expect(record.feature_flags_access_level).to eq(record.operations_access_level)
+ expect(record.environments_access_level).to eq(record.operations_access_level)
+ end
+
+ def create_project(proj_name, proj_namespace)
+ projects.create!(
+ namespace_id: namespace.id,
+ project_namespace_id: proj_namespace.id,
+ name: proj_name,
+ path: proj_name
+ )
+ end
+
+ def create_project_feature(project, operations_access_level = 10)
+ project_features.create!(
+ project_id: project.id,
+ pages_access_level: 10,
+ operations_access_level: operations_access_level
+ )
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb b/spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb
index a54c840dd8e..8d71b117107 100644
--- a/spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb
+++ b/spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb
@@ -73,26 +73,6 @@ RSpec.describe Gitlab::BackgroundMigration::RecalculateVulnerabilitiesOccurrence
subject { described_class.new.perform(start_id, end_id) }
- context 'when the migration is disabled by the feature flag' do
- let(:start_id) { 1 }
- let(:end_id) { 1001 }
-
- before do
- stub_feature_flags(migrate_vulnerability_finding_uuids: false)
- end
-
- it 'logs the info message and does not run the migration' do
- expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |instance|
- expect(instance).to receive(:info).once.with(message: 'Migration is disabled by the feature flag',
- migrator: 'RecalculateVulnerabilitiesOccurrencesUuid',
- start_id: start_id,
- end_id: end_id)
- end
-
- subject
- end
- end
-
context "when finding has a UUIDv4" do
before do
@uuid_v4 = create_finding!(
@@ -474,6 +454,16 @@ RSpec.describe Gitlab::BackgroundMigration::RecalculateVulnerabilitiesOccurrence
allow(Gitlab::ErrorTracking).to receive(:track_and_raise_exception)
expect(Gitlab::ErrorTracking).to have_received(:track_and_raise_exception).with(expected_error).once
end
+
+ it_behaves_like 'marks background migration job records' do
+ let(:arguments) { [1, 4] }
+ subject { described_class.new }
+ end
+ end
+
+ it_behaves_like 'marks background migration job records' do
+ let(:arguments) { [1, 4] }
+ subject { described_class.new }
end
private
diff --git a/spec/lib/gitlab/background_migration/set_correct_vulnerability_state_spec.rb b/spec/lib/gitlab/background_migration/set_correct_vulnerability_state_spec.rb
new file mode 100644
index 00000000000..d5b98e49a31
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/set_correct_vulnerability_state_spec.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::SetCorrectVulnerabilityState do
+ let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let(:users) { table(:users) }
+ let(:user) { create_user! }
+ let(:project) do
+ table(:projects).create!(
+ namespace_id: namespace.id,
+ project_namespace_id: namespace.id,
+ packages_enabled: false)
+ end
+
+ let(:vulnerabilities) { table(:vulnerabilities) }
+
+ let!(:vulnerability_with_dismissed_at) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id,
+ dismissed_at: Time.current
+ )
+ end
+
+ let!(:vulnerability_without_dismissed_at) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id,
+ dismissed_at: nil
+ )
+ end
+
+ let(:detected_state) { 1 }
+ let(:dismissed_state) { 2 }
+
+ subject(:perform_migration) do
+ described_class.new(start_id: vulnerability_with_dismissed_at.id,
+ end_id: vulnerability_without_dismissed_at.id,
+ batch_table: :vulnerabilities,
+ batch_column: :id,
+ sub_batch_size: 1,
+ pause_ms: 0,
+ connection: ActiveRecord::Base.connection)
+ .perform
+ end
+
+ it 'changes vulnerability state to `dismissed` when dismissed_at is not nil' do
+ expect { perform_migration }.to change { vulnerability_with_dismissed_at.reload.state }.to(dismissed_state)
+ end
+
+ it 'does not change the state when dismissed_at is nil' do
+ expect { perform_migration }.not_to change { vulnerability_without_dismissed_at.reload.state }
+ end
+
+ private
+
+ def create_vulnerability!(
+ project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0, state: 1, dismissed_at: nil
+ )
+ vulnerabilities.create!(
+ project_id: project_id,
+ author_id: author_id,
+ title: title,
+ severity: severity,
+ confidence: confidence,
+ report_type: report_type,
+ state: state,
+ dismissed_at: dismissed_at
+ )
+ end
+
+ def create_user!(name: "Example User", email: "user@example.com", user_type: nil)
+ users.create!(
+ name: name,
+ email: email,
+ username: name,
+ projects_limit: 10
+ )
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces_spec.rb b/spec/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces_spec.rb
new file mode 100644
index 00000000000..980a7771f4c
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::UpdateDelayedProjectRemovalToNullForUserNamespaces,
+ :migration do
+ let(:namespaces_table) { table(:namespaces) }
+ let(:namespace_settings_table) { table(:namespace_settings) }
+
+ subject(:perform_migration) do
+ described_class.new(
+ start_id: 1,
+ end_id: 30,
+ batch_table: :namespace_settings,
+ batch_column: :namespace_id,
+ sub_batch_size: 2,
+ pause_ms: 0,
+ connection: ActiveRecord::Base.connection
+ ).perform
+ end
+
+ before do
+ namespaces_table.create!(id: 1, name: 'group_namespace', path: 'path-1', type: 'Group')
+ namespaces_table.create!(id: 2, name: 'user_namespace', path: 'path-2', type: 'User')
+ namespaces_table.create!(id: 3, name: 'user_three_namespace', path: 'path-3', type: 'User')
+ namespaces_table.create!(id: 4, name: 'group_four_namespace', path: 'path-4', type: 'Group')
+ namespaces_table.create!(id: 5, name: 'group_five_namespace', path: 'path-5', type: 'Group')
+
+ namespace_settings_table.create!(namespace_id: 1, delayed_project_removal: false)
+ namespace_settings_table.create!(namespace_id: 2, delayed_project_removal: false)
+ namespace_settings_table.create!(namespace_id: 3, delayed_project_removal: nil)
+ namespace_settings_table.create!(namespace_id: 4, delayed_project_removal: true)
+ namespace_settings_table.create!(namespace_id: 5, delayed_project_removal: nil)
+ end
+
+ it 'updates `delayed_project_removal` column to null for user namespaces', :aggregate_failures do
+ expect(ActiveRecord::QueryRecorder.new { perform_migration }.count).to eq(7)
+
+ expect(migrated_attribute(1)).to be_falsey
+ expect(migrated_attribute(2)).to be_nil
+ expect(migrated_attribute(3)).to be_nil
+ expect(migrated_attribute(4)).to be_truthy
+ expect(migrated_attribute(5)).to be_nil
+ end
+
+ def migrated_attribute(namespace_id)
+ namespace_settings_table.find(namespace_id).delayed_project_removal
+ end
+end
diff --git a/spec/lib/gitlab/bare_repository_import/importer_spec.rb b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
index b0d721a74ce..8fb903154f3 100644
--- a/spec/lib/gitlab/bare_repository_import/importer_spec.rb
+++ b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
@@ -2,12 +2,12 @@
require 'spec_helper'
-RSpec.describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
+RSpec.describe Gitlab::BareRepositoryImport::Importer do
let!(:admin) { create(:admin) }
let!(:base_dir) { Dir.mktmpdir + '/' }
let(:bare_repository) { Gitlab::BareRepositoryImport::Repository.new(base_dir, File.join(base_dir, "#{project_path}.git")) }
let(:gitlab_shell) { Gitlab::Shell.new }
- let(:source_project) { TEST_REPO_PATH }
+ let(:source_project) { TestEnv.factory_repo_bundle_path }
subject(:importer) { described_class.new(admin, bare_repository) }
@@ -17,8 +17,6 @@ RSpec.describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
after do
FileUtils.rm_rf(base_dir)
- TestEnv.clean_test_path
- ensure_seeds
end
shared_examples 'importing a repository' do
@@ -150,7 +148,6 @@ RSpec.describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
end
context 'with a repository already on disk' do
- let!(:base_dir) { TestEnv.repos_path }
# This is a quick way to get a valid repository instead of copying an
# existing one. Since it's not persisted, the importer will try to
# create the project.
@@ -193,8 +190,6 @@ RSpec.describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
def prepare_repository(project_path, source_project)
repo_path = File.join(base_dir, project_path)
- return create_bare_repository(repo_path) unless source_project
-
cmd = %W(#{Gitlab.config.git.bin_path} clone --bare #{source_project} #{repo_path})
system(git_env, *cmd, chdir: SEED_STORAGE_PATH, out: '/dev/null', err: '/dev/null')
diff --git a/spec/lib/gitlab/bare_repository_import/repository_spec.rb b/spec/lib/gitlab/bare_repository_import/repository_spec.rb
index bf115046744..d29447ee376 100644
--- a/spec/lib/gitlab/bare_repository_import/repository_spec.rb
+++ b/spec/lib/gitlab/bare_repository_import/repository_spec.rb
@@ -59,18 +59,15 @@ RSpec.describe ::Gitlab::BareRepositoryImport::Repository do
let(:root_path) { TestEnv.repos_path }
let(:repo_path) { File.join(root_path, "#{hashed_path}.git") }
let(:wiki_path) { File.join(root_path, "#{hashed_path}.wiki.git") }
+ let(:raw_repository) { Gitlab::Git::Repository.new('default', "#{hashed_path}.git", nil, nil) }
before do
- TestEnv.create_bare_repository(repo_path)
-
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository = Rugged::Repository.new(repo_path)
- repository.config['gitlab.fullpath'] = 'to/repo'
- end
+ raw_repository.create_repository
+ raw_repository.set_full_path(full_path: 'to/repo')
end
after do
- FileUtils.rm_rf(repo_path)
+ raw_repository.remove
end
subject { described_class.new(root_path, repo_path) }
diff --git a/spec/lib/gitlab/bitbucket_import/importer_spec.rb b/spec/lib/gitlab/bitbucket_import/importer_spec.rb
index b723c31c4aa..e0a7044e5f9 100644
--- a/spec/lib/gitlab/bitbucket_import/importer_spec.rb
+++ b/spec/lib/gitlab/bitbucket_import/importer_spec.rb
@@ -328,6 +328,7 @@ RSpec.describe Gitlab::BitbucketImport::Importer do
expect(project.issues.where(state_id: Issue.available_states[:closed]).size).to eq(5)
expect(project.issues.where(state_id: Issue.available_states[:opened]).size).to eq(2)
+ expect(project.issues.map(&:namespace_id).uniq).to match_array([project.project_namespace_id])
end
describe 'wiki import' do
@@ -362,6 +363,14 @@ RSpec.describe Gitlab::BitbucketImport::Importer do
expect(project.issues.where("description LIKE ?", '%reporter3%').size).to eq(1)
expect(importer.errors).to be_empty
end
+
+ it 'sets work item type on new issues' do
+ allow(importer).to receive(:import_wiki)
+
+ importer.execute
+
+ expect(project.issues.map(&:work_item_type_id).uniq).to contain_exactly(WorkItems::Type.default_issue_type.id)
+ end
end
context 'metrics' do
diff --git a/spec/lib/gitlab/changelog/config_spec.rb b/spec/lib/gitlab/changelog/config_spec.rb
index 600682d30ad..92cad366cfd 100644
--- a/spec/lib/gitlab/changelog/config_spec.rb
+++ b/spec/lib/gitlab/changelog/config_spec.rb
@@ -20,6 +20,18 @@ RSpec.describe Gitlab::Changelog::Config do
described_class.from_git(project)
end
+ it "retrieves the specified configuration from git" do
+ allow(project.repository)
+ .to receive(:changelog_config).with('HEAD', 'specified_changelog_config.yml')
+ .and_return("---\ndate_format: '%Y'")
+
+ expect(described_class)
+ .to receive(:from_hash)
+ .with(project, { 'date_format' => '%Y' }, nil)
+
+ described_class.from_git(project, nil, 'specified_changelog_config.yml')
+ end
+
it 'returns the default configuration when no YAML file exists in Git' do
allow(project.repository)
.to receive(:changelog_config)
diff --git a/spec/lib/gitlab/ci/build/artifacts/expire_in_parser_spec.rb b/spec/lib/gitlab/ci/build/artifacts/expire_in_parser_spec.rb
deleted file mode 100644
index 889878cf3ef..00000000000
--- a/spec/lib/gitlab/ci/build/artifacts/expire_in_parser_spec.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Ci::Build::Artifacts::ExpireInParser do
- describe '.validate_duration', :request_store do
- subject { described_class.validate_duration(value) }
-
- context 'with never' do
- let(:value) { 'never' }
-
- it { is_expected.to be_truthy }
- end
-
- context 'with never value camelized' do
- let(:value) { 'Never' }
-
- it { is_expected.to be_truthy }
- end
-
- context 'with a duration' do
- let(:value) { '1 Day' }
- let(:other_value) { '30 seconds' }
-
- it { is_expected.to be_truthy }
-
- it 'caches data' do
- expect(ChronicDuration).to receive(:parse).with(value).once.and_call_original
- expect(ChronicDuration).to receive(:parse).with(other_value).once.and_call_original
-
- 2.times do
- expect(described_class.validate_duration(value)).to eq(86400)
- expect(described_class.validate_duration(other_value)).to eq(30)
- end
- end
- end
-
- context 'without a duration' do
- let(:value) { 'something' }
-
- it { is_expected.to be_falsy }
-
- it 'caches data' do
- expect(ChronicDuration).to receive(:parse).with(value).once.and_call_original
-
- 2.times do
- expect(described_class.validate_duration(value)).to be_falsey
- end
- end
- end
- end
-
- describe '#seconds_from_now' do
- subject { described_class.new(value).seconds_from_now }
-
- context 'with never' do
- let(:value) { 'never' }
-
- it { is_expected.to be_nil }
- end
-
- context 'with an empty string' do
- let(:value) { '' }
-
- it { is_expected.to be_nil }
- end
-
- context 'with a duration' do
- let(:value) { '1 day' }
-
- it { is_expected.to be_like_time(1.day.from_now) }
- end
- end
-end
diff --git a/spec/lib/gitlab/ci/build/duration_parser_spec.rb b/spec/lib/gitlab/ci/build/duration_parser_spec.rb
new file mode 100644
index 00000000000..7f5ff1eb0ee
--- /dev/null
+++ b/spec/lib/gitlab/ci/build/duration_parser_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Build::DurationParser do
+ describe '.validate_duration', :request_store do
+ subject { described_class.validate_duration(value) }
+
+ context 'with never' do
+ let(:value) { 'never' }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'with never value camelized' do
+ let(:value) { 'Never' }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'with a duration' do
+ let(:value) { '1 Day' }
+ let(:other_value) { '30 seconds' }
+
+ it { is_expected.to be_truthy }
+
+ it 'caches data' do
+ expect(ChronicDuration).to receive(:parse).with(value).once.and_call_original
+ expect(ChronicDuration).to receive(:parse).with(other_value).once.and_call_original
+
+ 2.times do
+ expect(described_class.validate_duration(value)).to eq(86400)
+ expect(described_class.validate_duration(other_value)).to eq(30)
+ end
+ end
+ end
+
+ context 'without a duration' do
+ let(:value) { 'something' }
+
+ it { is_expected.to be_falsy }
+
+ it 'caches data' do
+ expect(ChronicDuration).to receive(:parse).with(value).once.and_call_original
+
+ 2.times do
+ expect(described_class.validate_duration(value)).to be_falsey
+ end
+ end
+ end
+ end
+
+ describe '#seconds_from_now' do
+ subject { described_class.new(value).seconds_from_now }
+
+ context 'with never' do
+ let(:value) { 'never' }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'with an empty string' do
+ let(:value) { '' }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'with a duration' do
+ let(:value) { '1 day' }
+
+ it { is_expected.to be_like_time(1.day.from_now) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/build/image_spec.rb b/spec/lib/gitlab/ci/build/image_spec.rb
index 8f77a1f60ad..4895077a731 100644
--- a/spec/lib/gitlab/ci/build/image_spec.rb
+++ b/spec/lib/gitlab/ci/build/image_spec.rb
@@ -98,9 +98,11 @@ RSpec.describe Gitlab::Ci::Build::Image do
let(:service_entrypoint) { '/bin/sh' }
let(:service_alias) { 'db' }
let(:service_command) { 'sleep 30' }
+ let(:pull_policy) { %w[always if-not-present] }
let(:job) do
create(:ci_build, options: { services: [{ name: service_image_name, entrypoint: service_entrypoint,
- alias: service_alias, command: service_command, ports: [80] }] })
+ alias: service_alias, command: service_command, ports: [80],
+ pull_policy: pull_policy }] })
end
it 'fabricates an non-empty array of objects' do
@@ -114,6 +116,7 @@ RSpec.describe Gitlab::Ci::Build::Image do
expect(subject.first.entrypoint).to eq(service_entrypoint)
expect(subject.first.alias).to eq(service_alias)
expect(subject.first.command).to eq(service_command)
+ expect(subject.first.pull_policy).to eq(pull_policy)
port = subject.first.ports.first
expect(port.number).to eq 80
diff --git a/spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb b/spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb
index 4ac8bf61738..3892b88598a 100644
--- a/spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb
+++ b/spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb
@@ -6,19 +6,43 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule::Clause::Changes do
describe '#satisfied_by?' do
subject { described_class.new(globs).satisfied_by?(pipeline, context) }
- it_behaves_like 'a glob matching rule' do
+ context 'a glob matching rule' do
+ using RSpec::Parameterized::TableSyntax
+
let(:pipeline) { build(:ci_pipeline) }
let(:context) {}
before do
allow(pipeline).to receive(:modified_paths).and_return(files.keys)
end
+
+ # rubocop:disable Layout/LineLength
+ where(:case_name, :globs, :files, :satisfied) do
+ 'exact top-level match' | ['Dockerfile'] | { 'Dockerfile' => '', 'Gemfile' => '' } | true
+ 'exact top-level match' | { paths: ['Dockerfile'] } | { 'Dockerfile' => '', 'Gemfile' => '' } | true
+ 'exact top-level no match' | { paths: ['Dockerfile'] } | { 'Gemfile' => '' } | false
+ 'pattern top-level match' | { paths: ['Docker*'] } | { 'Dockerfile' => '', 'Gemfile' => '' } | true
+ 'pattern top-level no match' | ['Docker*'] | { 'Gemfile' => '' } | false
+ 'pattern top-level no match' | { paths: ['Docker*'] } | { 'Gemfile' => '' } | false
+ 'exact nested match' | { paths: ['project/build.properties'] } | { 'project/build.properties' => '' } | true
+ 'exact nested no match' | { paths: ['project/build.properties'] } | { 'project/README.md' => '' } | false
+ 'pattern nested match' | { paths: ['src/**/*.go'] } | { 'src/gitlab.com/goproject/goproject.go' => '' } | true
+ 'pattern nested no match' | { paths: ['src/**/*.go'] } | { 'src/gitlab.com/goproject/README.md' => '' } | false
+ 'ext top-level match' | { paths: ['*.go'] } | { 'main.go' => '', 'cmd/goproject/main.go' => '' } | true
+ 'ext nested no match' | { paths: ['*.go'] } | { 'cmd/goproject/main.go' => '' } | false
+ 'ext slash no match' | { paths: ['/*.go'] } | { 'main.go' => '', 'cmd/goproject/main.go' => '' } | false
+ end
+ # rubocop:enable Layout/LineLength
+
+ with_them do
+ it { is_expected.to eq(satisfied) }
+ end
end
context 'when pipeline is nil' do
let(:pipeline) {}
let(:context) {}
- let(:globs) { [] }
+ let(:globs) { { paths: [] } }
it { is_expected.to be_truthy }
end
@@ -26,8 +50,8 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule::Clause::Changes do
context 'when using variable expansion' do
let(:pipeline) { build(:ci_pipeline) }
let(:modified_paths) { ['helm/test.txt'] }
- let(:globs) { ['$HELM_DIR/**/*'] }
- let(:context) { double('context') }
+ let(:globs) { { paths: ['$HELM_DIR/**/*'] } }
+ let(:context) { instance_double(Gitlab::Ci::Build::Context::Base) }
before do
allow(pipeline).to receive(:modified_paths).and_return(modified_paths)
@@ -58,7 +82,7 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule::Clause::Changes do
end
context 'when variable expansion does not match' do
- let(:globs) { ['path/with/$in/it/*'] }
+ let(:globs) { { paths: ['path/with/$in/it/*'] } }
let(:modified_paths) { ['path/with/$in/it/file.txt'] }
before do
diff --git a/spec/lib/gitlab/ci/build/rules/rule_spec.rb b/spec/lib/gitlab/ci/build/rules/rule_spec.rb
index f905e229415..ac73b665f3a 100644
--- a/spec/lib/gitlab/ci/build/rules/rule_spec.rb
+++ b/spec/lib/gitlab/ci/build/rules/rule_spec.rb
@@ -14,10 +14,14 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule do
let(:ci_build) { build(:ci_build, pipeline: pipeline) }
let(:rule) { described_class.new(rule_hash) }
+ before do
+ allow(pipeline).to receive(:modified_paths).and_return(['file.rb'])
+ end
+
describe '#matches?' do
subject { rule.matches?(pipeline, seed) }
- context 'with one matching clause' do
+ context 'with one matching clause if' do
let(:rule_hash) do
{ if: '$VAR == null', when: 'always' }
end
@@ -25,9 +29,17 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule do
it { is_expected.to eq(true) }
end
+ context 'with one matching clause changes' do
+ let(:rule_hash) do
+ { changes: { paths: ['**/*'] }, when: 'always' }
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
context 'with two matching clauses' do
let(:rule_hash) do
- { if: '$VAR == null', changes: '**/*', when: 'always' }
+ { if: '$VAR == null', changes: { paths: ['**/*'] }, when: 'always' }
end
it { is_expected.to eq(true) }
@@ -35,7 +47,7 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule do
context 'with a matching and non-matching clause' do
let(:rule_hash) do
- { if: '$VAR != null', changes: '$VAR == null', when: 'always' }
+ { if: '$VAR != null', changes: { paths: ['invalid.xyz'] }, when: 'always' }
end
it { is_expected.to eq(false) }
@@ -43,7 +55,7 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule do
context 'with two non-matching clauses' do
let(:rule_hash) do
- { if: '$VAR != null', changes: 'README', when: 'always' }
+ { if: '$VAR != null', changes: { paths: ['README'] }, when: 'always' }
end
it { is_expected.to eq(false) }
diff --git a/spec/lib/gitlab/ci/config/entry/image_spec.rb b/spec/lib/gitlab/ci/config/entry/image_spec.rb
index bd1ab5d8c41..0fa6d4f8804 100644
--- a/spec/lib/gitlab/ci/config/entry/image_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/image_spec.rb
@@ -9,6 +9,8 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
before do
stub_feature_flags(ci_docker_image_pull_policy: true)
+
+ entry.compose!
end
let(:entry) { described_class.new(config) }
@@ -129,19 +131,16 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
describe '#valid?' do
it 'is valid' do
- entry.compose!
-
expect(entry).to be_valid
end
context 'when the feature flag ci_docker_image_pull_policy is disabled' do
before do
stub_feature_flags(ci_docker_image_pull_policy: false)
+ entry.compose!
end
it 'is not valid' do
- entry.compose!
-
expect(entry).not_to be_valid
expect(entry.errors).to include('image config contains unknown keys: pull_policy')
end
@@ -150,8 +149,6 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
describe '#value' do
it "returns value" do
- entry.compose!
-
expect(entry.value).to eq(
name: 'image:1.0',
pull_policy: ['if-not-present']
@@ -161,11 +158,10 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
context 'when the feature flag ci_docker_image_pull_policy is disabled' do
before do
stub_feature_flags(ci_docker_image_pull_policy: false)
+ entry.compose!
end
it 'is not valid' do
- entry.compose!
-
expect(entry.value).to eq(
name: 'image:1.0'
)
diff --git a/spec/lib/gitlab/ci/config/entry/rules/rule/changes_spec.rb b/spec/lib/gitlab/ci/config/entry/rules/rule/changes_spec.rb
index 3ed4a9f263f..295561b3c4d 100644
--- a/spec/lib/gitlab/ci/config/entry/rules/rule/changes_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/rules/rule/changes_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules::Rule::Changes do
it { is_expected.not_to be_valid }
it 'reports an error about invalid policy' do
- expect(entry.errors).to include(/should be an array of strings/)
+ expect(entry.errors).to include(/should be an array or a hash/)
end
end
@@ -64,7 +64,59 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules::Rule::Changes do
it 'returns information about errors' do
expect(entry.errors)
- .to include(/should be an array of strings/)
+ .to include(/should be an array or a hash/)
+ end
+ end
+
+ context 'with paths' do
+ context 'when paths is an array of strings' do
+ let(:config) { { paths: %w[app/ lib/] } }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when paths is not an array' do
+ let(:config) { { paths: 'string' } }
+
+ it { is_expected.not_to be_valid }
+
+ it 'returns information about errors' do
+ expect(entry.errors)
+ .to include(/should be an array of strings/)
+ end
+ end
+
+ context 'when paths is an array of integers' do
+ let(:config) { { paths: [1, 2] } }
+
+ it { is_expected.not_to be_valid }
+
+ it 'returns information about errors' do
+ expect(entry.errors)
+ .to include(/should be an array of strings/)
+ end
+ end
+
+ context 'when paths is an array of long strings' do
+ let(:config) { { paths: ['a'] * 51 } }
+
+ it { is_expected.not_to be_valid }
+
+ it 'returns information about errors' do
+ expect(entry.errors)
+ .to include(/has too many entries \(maximum 50\)/)
+ end
+ end
+
+ context 'when paths is nil' do
+ let(:config) { { paths: nil } }
+
+ it { is_expected.not_to be_valid }
+
+ it 'returns information about errors' do
+ expect(entry.errors)
+ .to include(/should be an array of strings/)
+ end
end
end
end
@@ -75,6 +127,14 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules::Rule::Changes do
context 'when using a string array' do
let(:config) { %w[app/ lib/ spec/ other/* paths/**/*.rb] }
+ it { is_expected.to eq(paths: config) }
+ end
+
+ context 'with paths' do
+ let(:config) do
+ { paths: ['app/', 'lib/'] }
+ end
+
it { is_expected.to eq(config) }
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/rules/rule_spec.rb b/spec/lib/gitlab/ci/config/entry/rules/rule_spec.rb
index 89d349efe8f..93f4a66bfb6 100644
--- a/spec/lib/gitlab/ci/config/entry/rules/rule_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/rules/rule_spec.rb
@@ -115,7 +115,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules::Rule do
it { is_expected.not_to be_valid }
it 'reports an error about invalid policy' do
- expect(subject.errors).to include(/should be an array of strings/)
+ expect(subject.errors).to include(/should be an array or a hash/)
end
end
@@ -411,7 +411,13 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules::Rule do
context 'when using a changes: clause' do
let(:config) { { changes: %w[app/ lib/ spec/ other/* paths/**/*.rb] } }
- it { is_expected.to eq(config) }
+ it { is_expected.to eq(changes: { paths: %w[app/ lib/ spec/ other/* paths/**/*.rb] }) }
+
+ context 'when using changes with paths' do
+ let(:config) { { changes: { paths: %w[app/ lib/ spec/ other/* paths/**/*.rb] } } }
+
+ it { is_expected.to eq(config) }
+ end
end
context 'when default value has been provided' do
@@ -426,7 +432,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules::Rule do
end
it 'does not add to provided configuration' do
- expect(entry.value).to eq(config)
+ expect(entry.value).to eq(changes: { paths: %w[app/**/*.rb] })
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/rules_spec.rb b/spec/lib/gitlab/ci/config/entry/rules_spec.rb
index cfec33003e4..b0871f2345e 100644
--- a/spec/lib/gitlab/ci/config/entry/rules_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/rules_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'support/helpers/stub_feature_flags'
require_dependency 'active_model'
RSpec.describe Gitlab::Ci::Config::Entry::Rules do
@@ -12,13 +11,12 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules do
end
let(:metadata) { { allowed_when: %w[always never] } }
- let(:entry) { factory.create! }
- describe '.new' do
- subject { entry }
+ subject(:entry) { factory.create! }
+ describe '.new' do
before do
- subject.compose!
+ entry.compose!
end
context 'with a list of rule rule' do
@@ -73,7 +71,11 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules do
end
describe '#value' do
- subject { entry.value }
+ subject(:value) { entry.value }
+
+ before do
+ entry.compose!
+ end
context 'with a list of rule rule' do
let(:config) do
@@ -99,7 +101,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Rules do
{ if: '$SKIP', when: 'never' }
end
- it { is_expected.to eq([config]) }
+ it { is_expected.to eq([]) }
end
context 'with nested rules' do
diff --git a/spec/lib/gitlab/ci/config/entry/service_spec.rb b/spec/lib/gitlab/ci/config/entry/service_spec.rb
index 2795cc9dddf..3c000fd09ed 100644
--- a/spec/lib/gitlab/ci/config/entry/service_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/service_spec.rb
@@ -1,14 +1,19 @@
# frozen_string_literal: true
-require 'spec_helper'
+require 'fast_spec_helper'
+require 'support/helpers/stubbed_feature'
+require 'support/helpers/stub_feature_flags'
RSpec.describe Gitlab::Ci::Config::Entry::Service do
- let(:entry) { described_class.new(config) }
+ include StubFeatureFlags
before do
+ stub_feature_flags(ci_docker_image_pull_policy: true)
entry.compose!
end
+ subject(:entry) { described_class.new(config) }
+
context 'when configuration is a string' do
let(:config) { 'postgresql:9.5' }
@@ -90,6 +95,12 @@ RSpec.describe Gitlab::Ci::Config::Entry::Service do
end
end
+ describe '#pull_policy' do
+ it "returns nil" do
+ expect(entry.pull_policy).to be_nil
+ end
+ end
+
context 'when configuration has ports' do
let(:ports) { [{ number: 80, protocol: 'http', name: 'foobar' }] }
let(:config) do
@@ -134,6 +145,49 @@ RSpec.describe Gitlab::Ci::Config::Entry::Service do
end
end
end
+
+ context 'when configuration has pull_policy' do
+ let(:config) { { name: 'postgresql:9.5', pull_policy: 'if-not-present' } }
+
+ describe '#valid?' do
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+
+ context 'when the feature flag ci_docker_image_pull_policy is disabled' do
+ before do
+ stub_feature_flags(ci_docker_image_pull_policy: false)
+ entry.compose!
+ end
+
+ it 'is not valid' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include('service config contains unknown keys: pull_policy')
+ end
+ end
+ end
+
+ describe '#value' do
+ it "returns value" do
+ expect(entry.value).to eq(
+ name: 'postgresql:9.5',
+ pull_policy: ['if-not-present']
+ )
+ end
+
+ context 'when the feature flag ci_docker_image_pull_policy is disabled' do
+ before do
+ stub_feature_flags(ci_docker_image_pull_policy: false)
+ end
+
+ it 'is not valid' do
+ expect(entry.value).to eq(
+ name: 'postgresql:9.5'
+ )
+ end
+ end
+ end
+ end
end
context 'when entry value is not correct' do
diff --git a/spec/lib/gitlab/ci/config/external/context_spec.rb b/spec/lib/gitlab/ci/config/external/context_spec.rb
index 800c563cd0b..40702e75404 100644
--- a/spec/lib/gitlab/ci/config/external/context_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/context_spec.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-require 'fast_spec_helper'
+require 'spec_helper'
RSpec.describe Gitlab::Ci::Config::External::Context do
- let(:project) { double('Project') }
+ let(:project) { build(:project) }
let(:user) { double('User') }
let(:sha) { '12345' }
let(:variables) { Gitlab::Ci::Variables::Collection.new([{ 'key' => 'a', 'value' => 'b' }]) }
@@ -126,7 +126,7 @@ RSpec.describe Gitlab::Ci::Config::External::Context do
end
context 'with attributes' do
- let(:new_attributes) { { project: double, user: double, sha: '56789' } }
+ let(:new_attributes) { { project: build(:project), user: double, sha: '56789' } }
it_behaves_like 'a mutated context'
end
diff --git a/spec/lib/gitlab/ci/config/external/file/project_spec.rb b/spec/lib/gitlab/ci/config/external/file/project_spec.rb
index 77e542cf933..72a85c9b03d 100644
--- a/spec/lib/gitlab/ci/config/external/file/project_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/project_spec.rb
@@ -177,6 +177,22 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
expect(project_file.error_message).to include("Project `xxxxxxxxxxxxxxxxxxxxxxx` not found or access denied!")
end
end
+
+ context 'when a project contained in an array is used with a masked variable' do
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new([
+ { key: 'VAR1', value: 'a_secret_variable_value', masked: true }
+ ])
+ end
+
+ let(:params) do
+ { project: ['a_secret_variable_value'], file: '/file.yml' }
+ end
+
+ it 'does not raise an error' do
+ expect { valid? }.not_to raise_error
+ end
+ end
end
describe '#expand_context' do
diff --git a/spec/lib/gitlab/ci/config/external/mapper_spec.rb b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
index 7e1b31fea6a..e74fdc2071b 100644
--- a/spec/lib/gitlab/ci/config/external/mapper_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
@@ -232,11 +232,9 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
image: 'image:1.0' }
end
- before do
- stub_const("#{described_class}::MAX_INCLUDES", 2)
- end
-
it 'does not raise an exception' do
+ allow(context).to receive(:max_includes).and_return(2)
+
expect { subject }.not_to raise_error
end
end
@@ -250,11 +248,9 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
image: 'image:1.0' }
end
- before do
- stub_const("#{described_class}::MAX_INCLUDES", 1)
- end
-
it 'raises an exception' do
+ allow(context).to receive(:max_includes).and_return(1)
+
expect { subject }.to raise_error(described_class::TooManyIncludesError)
end
@@ -264,6 +260,8 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
end
it 'raises an exception' do
+ allow(context).to receive(:max_includes).and_return(1)
+
expect { subject }.to raise_error(described_class::TooManyIncludesError)
end
end
diff --git a/spec/lib/gitlab/ci/config/external/processor_spec.rb b/spec/lib/gitlab/ci/config/external/processor_spec.rb
index 15a0ff40aa4..841a46e197d 100644
--- a/spec/lib/gitlab/ci/config/external/processor_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/processor_spec.rb
@@ -323,11 +323,9 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
end
context 'when too many includes is included' do
- before do
- stub_const('Gitlab::Ci::Config::External::Mapper::MAX_INCLUDES', 1)
- end
-
it 'raises an error' do
+ allow(context).to receive(:max_includes).and_return(1)
+
expect { subject }.to raise_error(Gitlab::Ci::Config::External::Processor::IncludeError, /Maximum of 1 nested/)
end
end
diff --git a/spec/lib/gitlab/ci/jwt_spec.rb b/spec/lib/gitlab/ci/jwt_spec.rb
index 179e2efc0c7..147801b6217 100644
--- a/spec/lib/gitlab/ci/jwt_spec.rb
+++ b/spec/lib/gitlab/ci/jwt_spec.rb
@@ -48,6 +48,7 @@ RSpec.describe Gitlab::Ci::Jwt do
expect(payload[:ref_protected]).to eq(build.protected.to_s)
expect(payload[:environment]).to be_nil
expect(payload[:environment_protected]).to be_nil
+ expect(payload[:deployment_tier]).to be_nil
end
end
@@ -96,7 +97,7 @@ RSpec.describe Gitlab::Ci::Jwt do
end
describe 'environment' do
- let(:environment) { build_stubbed(:environment, project: project, name: 'production') }
+ let(:environment) { build_stubbed(:environment, project: project, name: 'production', tier: 'production') }
let(:build) do
build_stubbed(
:ci_build,
@@ -114,6 +115,19 @@ RSpec.describe Gitlab::Ci::Jwt do
it 'has correct values for environment attributes' do
expect(payload[:environment]).to eq('production')
expect(payload[:environment_protected]).to eq('false')
+ expect(payload[:deployment_tier]).to eq('production')
+ end
+
+ describe 'deployment_tier' do
+ context 'when build options specifies a different deployment_tier' do
+ before do
+ build.options[:environment] = { name: environment.name, deployment_tier: 'development' }
+ end
+
+ it 'uses deployment_tier from build options' do
+ expect(payload[:deployment_tier]).to eq('development')
+ end
+ end
end
end
end
@@ -121,8 +135,8 @@ RSpec.describe Gitlab::Ci::Jwt do
describe '.for_build' do
shared_examples 'generating JWT for build' do
context 'when signing key is present' do
- let(:rsa_key) { OpenSSL::PKey::RSA.generate(1024) }
- let(:rsa_key_data) { rsa_key.to_s }
+ let_it_be(:rsa_key) { OpenSSL::PKey::RSA.generate(3072) }
+ let_it_be(:rsa_key_data) { rsa_key.to_s }
it 'generates JWT with key id' do
_payload, headers = JWT.decode(jwt, rsa_key.public_key, true, { algorithm: 'RS256' })
diff --git a/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb
index 375841ce236..cbf92f8fa83 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::CreateDeployments do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
- let(:stage) { build(:ci_stage_entity, project: project, statuses: [job]) }
+ let(:stage) { build(:ci_stage, project: project, statuses: [job]) }
let(:pipeline) { create(:ci_pipeline, project: project, stages: [stage]) }
let(:command) do
diff --git a/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
index 9057c4e99df..eba0db0adfb 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Create do
context 'tags persistence' do
let(:stage) do
- build(:ci_stage_entity, pipeline: pipeline, project: project)
+ build(:ci_stage, pipeline: pipeline, project: project)
end
let(:job) do
@@ -77,7 +77,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Create do
context 'without tags' do
it 'extracts an empty tag list' do
- expect(CommitStatus)
+ expect(Gitlab::Ci::Tags::BulkInsert)
.to receive(:bulk_insert_tags!)
.with([job])
.and_call_original
@@ -95,7 +95,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Create do
end
it 'bulk inserts tags' do
- expect(CommitStatus)
+ expect(Gitlab::Ci::Tags::BulkInsert)
.to receive(:bulk_insert_tags!)
.with([job])
.and_call_original
diff --git a/spec/lib/gitlab/ci/pipeline/chain/ensure_environments_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/ensure_environments_spec.rb
index 6a7d9b58a05..e07a3ca9033 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/ensure_environments_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/ensure_environments_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Pipeline::Chain::EnsureEnvironments do
let(:project) { create(:project) }
let(:user) { create(:user) }
- let(:stage) { build(:ci_stage_entity, project: project, statuses: [job]) }
+ let(:stage) { build(:ci_stage, project: project, statuses: [job]) }
let(:pipeline) { build(:ci_pipeline, project: project, stages: [stage]) }
let(:command) do
diff --git a/spec/lib/gitlab/ci/pipeline/chain/ensure_resource_groups_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/ensure_resource_groups_spec.rb
index 571455d6279..f14dd70a753 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/ensure_resource_groups_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/ensure_resource_groups_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Pipeline::Chain::EnsureResourceGroups do
let(:project) { create(:project) }
let(:user) { create(:user) }
- let(:stage) { build(:ci_stage_entity, project: project, statuses: [job]) }
+ let(:stage) { build(:ci_stage, project: project, statuses: [job]) }
let(:pipeline) { build(:ci_pipeline, project: project, stages: [stage]) }
let!(:environment) { create(:environment, name: 'production', project: project) }
diff --git a/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
index cebc4c02d11..eeac0c85a77 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
@@ -84,7 +84,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Validate::External do
end
end
- it 'respects the defined payload schema', :saas do
+ it 'respects the defined payload schema' do
expect(::Gitlab::HTTP).to receive(:post) do |_url, params|
expect(params[:body]).to match_schema('/external_validation')
expect(params[:timeout]).to eq(described_class::DEFAULT_VALIDATION_REQUEST_TIMEOUT)
@@ -235,6 +235,8 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Validate::External do
end
it 'logs the authorization' do
+ allow(Gitlab::AppLogger).to receive(:info)
+
expect(Gitlab::AppLogger).to receive(:info).with(message: 'Pipeline not authorized', project_id: project.id, user_id: user.id)
perform!
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
index 49505d397c2..040f3ab5830 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
@@ -858,14 +858,14 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
context 'with an explicit `when: never`' do
where(:rule_set) do
[
- [[{ changes: %w[*/**/*.rb], when: 'never' }, { changes: %w[*/**/*.rb], when: 'always' }]],
- [[{ changes: %w[app/models/ci/pipeline.rb], when: 'never' }, { changes: %w[app/models/ci/pipeline.rb], when: 'always' }]],
- [[{ changes: %w[spec/**/*.rb], when: 'never' }, { changes: %w[spec/**/*.rb], when: 'always' }]],
- [[{ changes: %w[*.yml], when: 'never' }, { changes: %w[*.yml], when: 'always' }]],
- [[{ changes: %w[.*.yml], when: 'never' }, { changes: %w[.*.yml], when: 'always' }]],
- [[{ changes: %w[**/*], when: 'never' }, { changes: %w[**/*], when: 'always' }]],
- [[{ changes: %w[*/**/*.rb *.yml], when: 'never' }, { changes: %w[*/**/*.rb *.yml], when: 'always' }]],
- [[{ changes: %w[.*.yml **/*], when: 'never' }, { changes: %w[.*.yml **/*], when: 'always' }]]
+ [[{ changes: { paths: %w[*/**/*.rb] }, when: 'never' }, { changes: { paths: %w[*/**/*.rb] }, when: 'always' }]],
+ [[{ changes: { paths: %w[app/models/ci/pipeline.rb] }, when: 'never' }, { changes: { paths: %w[app/models/ci/pipeline.rb] }, when: 'always' }]],
+ [[{ changes: { paths: %w[spec/**/*.rb] }, when: 'never' }, { changes: { paths: %w[spec/**/*.rb] }, when: 'always' }]],
+ [[{ changes: { paths: %w[*.yml] }, when: 'never' }, { changes: { paths: %w[*.yml] }, when: 'always' }]],
+ [[{ changes: { paths: %w[.*.yml] }, when: 'never' }, { changes: { paths: %w[.*.yml] }, when: 'always' }]],
+ [[{ changes: { paths: %w[**/*] }, when: 'never' }, { changes: { paths: %w[**/*] }, when: 'always' }]],
+ [[{ changes: { paths: %w[*/**/*.rb *.yml] }, when: 'never' }, { changes: { paths: %w[*/**/*.rb *.yml] }, when: 'always' }]],
+ [[{ changes: { paths: %w[.*.yml **/*] }, when: 'never' }, { changes: { paths: %w[.*.yml **/*] }, when: 'always' }]]
]
end
@@ -881,14 +881,14 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
context 'with an explicit `when: always`' do
where(:rule_set) do
[
- [[{ changes: %w[*/**/*.rb], when: 'always' }, { changes: %w[*/**/*.rb], when: 'never' }]],
- [[{ changes: %w[app/models/ci/pipeline.rb], when: 'always' }, { changes: %w[app/models/ci/pipeline.rb], when: 'never' }]],
- [[{ changes: %w[spec/**/*.rb], when: 'always' }, { changes: %w[spec/**/*.rb], when: 'never' }]],
- [[{ changes: %w[*.yml], when: 'always' }, { changes: %w[*.yml], when: 'never' }]],
- [[{ changes: %w[.*.yml], when: 'always' }, { changes: %w[.*.yml], when: 'never' }]],
- [[{ changes: %w[**/*], when: 'always' }, { changes: %w[**/*], when: 'never' }]],
- [[{ changes: %w[*/**/*.rb *.yml], when: 'always' }, { changes: %w[*/**/*.rb *.yml], when: 'never' }]],
- [[{ changes: %w[.*.yml **/*], when: 'always' }, { changes: %w[.*.yml **/*], when: 'never' }]]
+ [[{ changes: { paths: %w[*/**/*.rb] }, when: 'always' }, { changes: { paths: %w[*/**/*.rb] }, when: 'never' }]],
+ [[{ changes: { paths: %w[app/models/ci/pipeline.rb] }, when: 'always' }, { changes: { paths: %w[app/models/ci/pipeline.rb] }, when: 'never' }]],
+ [[{ changes: { paths: %w[spec/**/*.rb] }, when: 'always' }, { changes: { paths: %w[spec/**/*.rb] }, when: 'never' }]],
+ [[{ changes: { paths: %w[*.yml] }, when: 'always' }, { changes: { paths: %w[*.yml] }, when: 'never' }]],
+ [[{ changes: { paths: %w[.*.yml] }, when: 'always' }, { changes: { paths: %w[.*.yml] }, when: 'never' }]],
+ [[{ changes: { paths: %w[**/*] }, when: 'always' }, { changes: { paths: %w[**/*] }, when: 'never' }]],
+ [[{ changes: { paths: %w[*/**/*.rb *.yml] }, when: 'always' }, { changes: { paths: %w[*/**/*.rb *.yml] }, when: 'never' }]],
+ [[{ changes: { paths: %w[.*.yml **/*] }, when: 'always' }, { changes: { paths: %w[.*.yml **/*] }, when: 'never' }]]
]
end
@@ -904,14 +904,14 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
context 'without an explicit when: value' do
where(:rule_set) do
[
- [[{ changes: %w[*/**/*.rb] }]],
- [[{ changes: %w[app/models/ci/pipeline.rb] }]],
- [[{ changes: %w[spec/**/*.rb] }]],
- [[{ changes: %w[*.yml] }]],
- [[{ changes: %w[.*.yml] }]],
- [[{ changes: %w[**/*] }]],
- [[{ changes: %w[*/**/*.rb *.yml] }]],
- [[{ changes: %w[.*.yml **/*] }]]
+ [[{ changes: { paths: %w[*/**/*.rb] } }]],
+ [[{ changes: { paths: %w[app/models/ci/pipeline.rb] } }]],
+ [[{ changes: { paths: %w[spec/**/*.rb] } }]],
+ [[{ changes: { paths: %w[*.yml] } }]],
+ [[{ changes: { paths: %w[.*.yml] } }]],
+ [[{ changes: { paths: %w[**/*] } }]],
+ [[{ changes: { paths: %w[*/**/*.rb *.yml] } }]],
+ [[{ changes: { paths: %w[.*.yml **/*] } }]]
]
end
diff --git a/spec/lib/gitlab/ci/reports/coverage_report_generator_spec.rb b/spec/lib/gitlab/ci/reports/coverage_report_generator_spec.rb
index eec218346c2..f116b175fc7 100644
--- a/spec/lib/gitlab/ci/reports/coverage_report_generator_spec.rb
+++ b/spec/lib/gitlab/ci/reports/coverage_report_generator_spec.rb
@@ -75,16 +75,6 @@ RSpec.describe Gitlab::Ci::Reports::CoverageReportGenerator, factory_default: :k
end
it_behaves_like 'having a coverage report'
-
- context 'when feature flag ci_child_pipeline_coverage_reports is disabled' do
- before do
- stub_feature_flags(ci_child_pipeline_coverage_reports: false)
- end
-
- it 'returns empty coverage reports' do
- expect(subject).to be_empty
- end
- end
end
context 'when both parent and child pipeline have builds with coverage reports' do
diff --git a/spec/lib/gitlab/ci/reports/test_report_spec.rb b/spec/lib/gitlab/ci/reports/test_report_spec.rb
new file mode 100644
index 00000000000..539510bca9e
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_report_spec.rb
@@ -0,0 +1,189 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Reports::TestReport do
+ include TestReportsHelper
+
+ let(:test_reports) { described_class.new }
+
+ describe '#get_suite' do
+ subject { test_reports.get_suite(suite_name) }
+
+ context 'when suite name is rspec' do
+ let(:suite_name) { 'rspec' }
+
+ it { expect(subject.name).to eq('rspec') }
+
+ it 'initializes a new test suite and returns it' do
+ expect(Gitlab::Ci::Reports::TestSuite).to receive(:new).and_call_original
+
+ is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
+ end
+
+ context 'when suite name is already allocated' do
+ before do
+ subject
+ end
+
+ it 'does not initialize a new test suite' do
+ expect(Gitlab::Ci::Reports::TestSuite).not_to receive(:new)
+
+ is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
+ end
+ end
+ end
+ end
+
+ describe '#total_time' do
+ subject { test_reports.total_time }
+
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total time' do
+ is_expected.to eq(6.66)
+ end
+ end
+
+ describe '#total_count' do
+ subject { test_reports.total_count }
+
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ describe '#total_status' do
+ subject { test_reports.total_status }
+
+ context 'when all test cases succeeded' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is a failed test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+
+ context 'when there is a skipped test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_skipped)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is an error test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_error)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+ end
+
+ describe '#with_attachment' do
+ let(:test_case) { build(:report_test_case, :failed) }
+
+ subject { test_reports.with_attachment! }
+
+ context 'when test suites do not contain an attachment' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(test_case)
+ end
+
+ it 'returns empty test suites' do
+ expect(subject.test_suites).to be_empty
+ end
+ end
+
+ context 'when test suites contain an attachment' do
+ let(:test_case_succes) { build(:report_test_case) }
+ let(:test_case_with_attachment) { build(:report_test_case, :failed_with_attachment) }
+
+ before do
+ test_reports.get_suite('rspec').add_test_case(test_case_succes)
+ test_reports.get_suite('junit').add_test_case(test_case_with_attachment)
+ end
+
+ it 'returns test suites with attachment' do
+ expect(subject.test_suites.count).to eq(1)
+ expect(subject.test_suites['junit'].test_cases['failed']).to be_present
+ end
+ end
+ end
+
+ describe '#suite_errors' do
+ subject { test_reports.suite_errors }
+
+ context 'when a suite has normal spec errors or failures' do
+ before do
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_error)
+ end
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'when there is an error test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').set_suite_error('Existential parsing error')
+ end
+
+ it { is_expected.to eq({ 'junit' => 'Existential parsing error' }) }
+ end
+ end
+
+ Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
+ describe "##{status_type}_count" do
+ subject { test_reports.public_send("#{status_type}_count") }
+
+ context "when #{status_type} test case exists" do
+ before do
+ test_reports.get_suite('rspec').add_test_case(public_send("create_test_case_rspec_#{status_type}"))
+ test_reports.get_suite('junit').add_test_case(public_send("create_test_case_java_#{status_type}"))
+ end
+
+ it 'returns the count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ context "when #{status_type} test case do not exist" do
+ it 'returns nothing' do
+ is_expected.to be(0)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb b/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb
index 3483dddca3a..ac64e4699fe 100644
--- a/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb
+++ b/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb
@@ -6,8 +6,8 @@ RSpec.describe Gitlab::Ci::Reports::TestReportsComparer do
include TestReportsHelper
let(:comparer) { described_class.new(base_reports, head_reports) }
- let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
- let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReport.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReport.new }
describe '#suite_comparers' do
subject { comparer.suite_comparers }
diff --git a/spec/lib/gitlab/ci/reports/test_reports_spec.rb b/spec/lib/gitlab/ci/reports/test_reports_spec.rb
deleted file mode 100644
index 24c00de3731..00000000000
--- a/spec/lib/gitlab/ci/reports/test_reports_spec.rb
+++ /dev/null
@@ -1,189 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Ci::Reports::TestReports do
- include TestReportsHelper
-
- let(:test_reports) { described_class.new }
-
- describe '#get_suite' do
- subject { test_reports.get_suite(suite_name) }
-
- context 'when suite name is rspec' do
- let(:suite_name) { 'rspec' }
-
- it { expect(subject.name).to eq('rspec') }
-
- it 'initializes a new test suite and returns it' do
- expect(Gitlab::Ci::Reports::TestSuite).to receive(:new).and_call_original
-
- is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
- end
-
- context 'when suite name is already allocated' do
- before do
- subject
- end
-
- it 'does not initialize a new test suite' do
- expect(Gitlab::Ci::Reports::TestSuite).not_to receive(:new)
-
- is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
- end
- end
- end
- end
-
- describe '#total_time' do
- subject { test_reports.total_time }
-
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
- end
-
- it 'returns the total time' do
- is_expected.to eq(6.66)
- end
- end
-
- describe '#total_count' do
- subject { test_reports.total_count }
-
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
- end
-
- it 'returns the total count' do
- is_expected.to eq(2)
- end
- end
-
- describe '#total_status' do
- subject { test_reports.total_status }
-
- context 'when all test cases succeeded' do
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
- end
-
- it 'returns correct total status' do
- is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
- end
- end
-
- context 'when there is a failed test case' do
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
- end
-
- it 'returns correct total status' do
- is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
- end
- end
-
- context 'when there is a skipped test case' do
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_skipped)
- end
-
- it 'returns correct total status' do
- is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
- end
- end
-
- context 'when there is an error test case' do
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_error)
- end
-
- it 'returns correct total status' do
- is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
- end
- end
- end
-
- describe '#with_attachment' do
- let(:test_case) { build(:report_test_case, :failed) }
-
- subject { test_reports.with_attachment! }
-
- context 'when test suites do not contain an attachment' do
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').add_test_case(test_case)
- end
-
- it 'returns empty test suites' do
- expect(subject.test_suites).to be_empty
- end
- end
-
- context 'when test suites contain an attachment' do
- let(:test_case_succes) { build(:report_test_case) }
- let(:test_case_with_attachment) { build(:report_test_case, :failed_with_attachment) }
-
- before do
- test_reports.get_suite('rspec').add_test_case(test_case_succes)
- test_reports.get_suite('junit').add_test_case(test_case_with_attachment)
- end
-
- it 'returns test suites with attachment' do
- expect(subject.test_suites.count).to eq(1)
- expect(subject.test_suites['junit'].test_cases['failed']).to be_present
- end
- end
- end
-
- describe '#suite_errors' do
- subject { test_reports.suite_errors }
-
- context 'when a suite has normal spec errors or failures' do
- before do
- test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
- test_reports.get_suite('junit').add_test_case(create_test_case_java_error)
- end
-
- it { is_expected.to be_empty }
- end
-
- context 'when there is an error test case' do
- before do
- test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
- test_reports.get_suite('junit').set_suite_error('Existential parsing error')
- end
-
- it { is_expected.to eq({ 'junit' => 'Existential parsing error' }) }
- end
- end
-
- Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
- describe "##{status_type}_count" do
- subject { test_reports.public_send("#{status_type}_count") }
-
- context "when #{status_type} test case exists" do
- before do
- test_reports.get_suite('rspec').add_test_case(public_send("create_test_case_rspec_#{status_type}"))
- test_reports.get_suite('junit').add_test_case(public_send("create_test_case_java_#{status_type}"))
- end
-
- it 'returns the count' do
- is_expected.to eq(2)
- end
- end
-
- context "when #{status_type} test case do not exist" do
- it 'returns nothing' do
- is_expected.to be(0)
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/ci/runner/metrics_spec.rb b/spec/lib/gitlab/ci/runner/metrics_spec.rb
new file mode 100644
index 00000000000..3c459271092
--- /dev/null
+++ b/spec/lib/gitlab/ci/runner/metrics_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Runner::Metrics, :prometheus do
+ subject { described_class.new }
+
+ describe '#increment_runner_authentication_success_counter' do
+ it 'increments count for same type' do
+ expect { subject.increment_runner_authentication_success_counter(runner_type: 'instance_type') }
+ .to change { described_class.runner_authentication_success_counter.get(runner_type: 'instance_type') }.by(1)
+ end
+
+ it 'does not increment count for different type' do
+ expect { subject.increment_runner_authentication_success_counter(runner_type: 'group_type') }
+ .to not_change { described_class.runner_authentication_success_counter.get(runner_type: 'project_type') }
+ end
+
+ it 'does not increment failure count' do
+ expect { subject.increment_runner_authentication_success_counter(runner_type: 'project_type') }
+ .to not_change { described_class.runner_authentication_failure_counter.get }
+ end
+
+ it 'throws ArgumentError for invalid runner type' do
+ expect { subject.increment_runner_authentication_success_counter(runner_type: 'unknown_type') }
+ .to raise_error(ArgumentError, 'unknown runner type: unknown_type')
+ end
+ end
+
+ describe '#increment_runner_authentication_failure_counter' do
+ it 'increments count' do
+ expect { subject.increment_runner_authentication_failure_counter }
+ .to change { described_class.runner_authentication_failure_counter.get }.by(1)
+ end
+
+ it 'does not increment success count' do
+ expect { subject.increment_runner_authentication_failure_counter }
+ .to not_change { described_class.runner_authentication_success_counter.get(runner_type: 'instance_type') }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/runner_releases_spec.rb b/spec/lib/gitlab/ci/runner_releases_spec.rb
index 9e4a8739c0f..576eb02ad83 100644
--- a/spec/lib/gitlab/ci/runner_releases_spec.rb
+++ b/spec/lib/gitlab/ci/runner_releases_spec.rb
@@ -5,16 +5,25 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::RunnerReleases do
subject { described_class.instance }
- describe '#releases' do
- before do
- subject.reset!
+ let(:runner_releases_url) { 'the release API URL' }
- stub_application_setting(public_runner_releases_url: 'the release API URL')
- allow(Gitlab::HTTP).to receive(:try_get).with('the release API URL').once { mock_http_response(response) }
- end
+ def releases
+ subject.releases
+ end
+
+ def releases_by_minor
+ subject.releases_by_minor
+ end
+
+ before do
+ subject.reset_backoff!
- def releases
- subject.releases
+ stub_application_setting(public_runner_releases_url: runner_releases_url)
+ end
+
+ describe 'caching behavior', :use_clean_rails_memory_store_caching do
+ before do
+ allow(Gitlab::HTTP).to receive(:get).with(runner_releases_url, anything).once { mock_http_response(response) }
end
shared_examples 'requests that follow cache status' do |validity_period|
@@ -25,9 +34,14 @@ RSpec.describe Gitlab::Ci::RunnerReleases do
releases
travel followup_request_interval do
- expect(Gitlab::HTTP).not_to receive(:try_get)
+ expect(Gitlab::HTTP).not_to receive(:get)
- expect(releases).to eq(expected_result)
+ if expected_releases
+ expected_result_by_minor = expected_releases.group_by(&:without_patch).transform_values(&:max)
+ end
+
+ expect(releases).to eq(expected_releases)
+ expect(releases_by_minor).to eq(expected_result_by_minor)
end
end
end
@@ -40,75 +54,189 @@ RSpec.describe Gitlab::Ci::RunnerReleases do
releases
travel followup_request_interval do
- expect(Gitlab::HTTP).to receive(:try_get).with('the release API URL').once { mock_http_response(followup_response) }
-
- expect(releases).to eq((expected_result || []) + [Gitlab::VersionInfo.new(14, 9, 2)])
+ expect(Gitlab::HTTP).to receive(:get)
+ .with(runner_releases_url, anything)
+ .once { mock_http_response(followup_response) }
+
+ new_releases = (expected_releases || []) + [Gitlab::VersionInfo.new(14, 9, 2)]
+ new_releases_by_minor_version = (expected_releases_by_minor || {}).merge(
+ Gitlab::VersionInfo.new(14, 9, 0) => Gitlab::VersionInfo.new(14, 9, 2)
+ )
+ expect(releases).to eq(new_releases)
+ expect(releases_by_minor).to eq(new_releases_by_minor_version)
end
end
end
end
- context 'when response is nil' do
- let(:response) { nil }
- let(:expected_result) { nil }
-
- it 'returns nil' do
- expect(releases).to be_nil
- end
-
- it_behaves_like 'requests that follow cache status', 5.seconds
-
+ shared_examples 'a service implementing exponential backoff' do |opts|
it 'performs exponential backoff on requests', :aggregate_failures do
start_time = Time.now.utc.change(usec: 0)
http_call_timestamp_offsets = []
- allow(Gitlab::HTTP).to receive(:try_get).with('the release API URL') do
+ allow(Gitlab::HTTP).to receive(:get).with(runner_releases_url, anything) do
http_call_timestamp_offsets << Time.now.utc - start_time
+
+ raise Net::OpenTimeout if opts&.dig(:raise_timeout)
+
mock_http_response(response)
end
# An initial HTTP request fails
travel_to(start_time)
- subject.reset!
+ subject.reset_backoff!
expect(releases).to be_nil
+ expect(releases_by_minor).to be_nil
# Successive failed requests result in HTTP requests only after specific backoff periods
backoff_periods = [5, 10, 20, 40, 80, 160, 320, 640, 1280, 2560, 3600].map(&:seconds)
backoff_periods.each do |period|
travel(period - 1.second)
expect(releases).to be_nil
+ expect(releases_by_minor).to be_nil
travel 1.second
expect(releases).to be_nil
+ expect(releases_by_minor).to be_nil
end
expect(http_call_timestamp_offsets).to eq([0, 5, 15, 35, 75, 155, 315, 635, 1275, 2555, 5115, 8715])
# Finally a successful HTTP request results in releases being returned
- allow(Gitlab::HTTP).to receive(:try_get).with('the release API URL').once { mock_http_response([{ 'name' => 'v14.9.1' }]) }
+ allow(Gitlab::HTTP).to receive(:get)
+ .with(runner_releases_url, anything)
+ .once { mock_http_response([{ 'name' => 'v14.9.1-beta1-ee' }]) }
travel 1.hour
expect(releases).not_to be_nil
+ expect(releases_by_minor).not_to be_nil
end
end
+ context 'when request results in timeout' do
+ let(:response) { }
+ let(:expected_releases) { nil }
+ let(:expected_releases_by_minor) { nil }
+
+ it_behaves_like 'requests that follow cache status', 5.seconds
+ it_behaves_like 'a service implementing exponential backoff', raise_timeout: true
+ end
+
+ context 'when response is nil' do
+ let(:response) { nil }
+ let(:expected_releases) { nil }
+ let(:expected_releases_by_minor) { nil }
+
+ it_behaves_like 'requests that follow cache status', 5.seconds
+ it_behaves_like 'a service implementing exponential backoff'
+ end
+
context 'when response is not nil' do
- let(:response) { [{ 'name' => 'v14.9.1' }, { 'name' => 'v14.9.0' }] }
- let(:expected_result) { [Gitlab::VersionInfo.new(14, 9, 0), Gitlab::VersionInfo.new(14, 9, 1)] }
+ let(:response) { [{ 'name' => 'v14.9.1-beta1-ee' }, { 'name' => 'v14.9.0' }] }
+ let(:expected_releases) do
+ [
+ Gitlab::VersionInfo.new(14, 9, 0),
+ Gitlab::VersionInfo.new(14, 9, 1, '-beta1-ee')
+ ]
+ end
+
+ let(:expected_releases_by_minor) do
+ {
+ Gitlab::VersionInfo.new(14, 9, 0) => Gitlab::VersionInfo.new(14, 9, 1, '-beta1-ee')
+ }
+ end
+
+ it_behaves_like 'requests that follow cache status', 1.day
+ end
+ end
+
+ describe '#releases', :use_clean_rails_memory_store_caching do
+ before do
+ allow(Gitlab::HTTP).to receive(:get).with(runner_releases_url, anything).once { mock_http_response(response) }
+ end
+
+ context 'when response is nil' do
+ let(:response) { nil }
+ let(:expected_result) { nil }
+
+ it 'returns nil' do
+ expect(releases).to be_nil
+ end
+ end
+
+ context 'when response is not nil' do
+ let(:response) { [{ 'name' => 'v14.9.1-beta1-ee' }, { 'name' => 'v14.9.0' }] }
+ let(:expected_result) do
+ [
+ Gitlab::VersionInfo.new(14, 9, 0),
+ Gitlab::VersionInfo.new(14, 9, 1, '-beta1-ee')
+ ]
+ end
it 'returns parsed and sorted Gitlab::VersionInfo objects' do
expect(releases).to eq(expected_result)
end
+ end
- it_behaves_like 'requests that follow cache status', 1.day
+ context 'when response contains unexpected input type' do
+ let(:response) { 'error' }
+
+ it { expect(releases).to be_nil }
+ end
+
+ context 'when response contains unexpected input array' do
+ let(:response) { ['error'] }
+
+ it { expect(releases).to be_nil }
+ end
+ end
+
+ describe '#releases_by_minor', :use_clean_rails_memory_store_caching do
+ before do
+ allow(Gitlab::HTTP).to receive(:get).with(runner_releases_url, anything).once { mock_http_response(response) }
end
- def mock_http_response(response)
- http_response = instance_double(HTTParty::Response)
+ context 'when response is nil' do
+ let(:response) { nil }
+ let(:expected_result) { nil }
- allow(http_response).to receive(:success?).and_return(response.present?)
- allow(http_response).to receive(:parsed_response).and_return(response)
+ it 'returns nil' do
+ expect(releases_by_minor).to be_nil
+ end
+ end
- http_response
+ context 'when response is not nil' do
+ let(:response) { [{ 'name' => 'v14.9.1-beta1-ee' }, { 'name' => 'v14.9.0' }, { 'name' => 'v14.8.1' }] }
+ let(:expected_result) do
+ {
+ Gitlab::VersionInfo.new(14, 8, 0) => Gitlab::VersionInfo.new(14, 8, 1),
+ Gitlab::VersionInfo.new(14, 9, 0) => Gitlab::VersionInfo.new(14, 9, 1, '-beta1-ee')
+ }
+ end
+
+ it 'returns parsed and grouped Gitlab::VersionInfo objects' do
+ expect(releases_by_minor).to eq(expected_result)
+ end
end
+
+ context 'when response contains unexpected input type' do
+ let(:response) { 'error' }
+
+ it { expect(releases_by_minor).to be_nil }
+ end
+
+ context 'when response contains unexpected input array' do
+ let(:response) { ['error'] }
+
+ it { expect(releases_by_minor).to be_nil }
+ end
+ end
+
+ def mock_http_response(response)
+ http_response = instance_double(HTTParty::Response)
+
+ allow(http_response).to receive(:success?).and_return(!response.nil?)
+ allow(http_response).to receive(:parsed_response).and_return(response)
+
+ http_response
end
end
diff --git a/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
index 0353432741b..f2507a24b10 100644
--- a/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
+++ b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
@@ -3,84 +3,156 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::RunnerUpgradeCheck do
- include StubVersion
using RSpec::Parameterized::TableSyntax
describe '#check_runner_upgrade_status' do
subject(:result) { described_class.instance.check_runner_upgrade_status(runner_version) }
+ let(:gitlab_version) { '14.1.1' }
+ let(:parsed_runner_version) { ::Gitlab::VersionInfo.parse(runner_version, parse_suffix: true) }
+
before do
- runner_releases_double = instance_double(Gitlab::Ci::RunnerReleases)
+ allow(described_class.instance).to receive(:gitlab_version)
+ .and_return(::Gitlab::VersionInfo.parse(gitlab_version))
+ end
+
+ context 'with failing Gitlab::Ci::RunnerReleases request' do
+ let(:runner_version) { '14.1.123' }
+ let(:runner_releases_double) { instance_double(Gitlab::Ci::RunnerReleases) }
+
+ before do
+ allow(Gitlab::Ci::RunnerReleases).to receive(:instance).and_return(runner_releases_double)
+ allow(runner_releases_double).to receive(:releases).and_return(nil)
+ end
- allow(Gitlab::Ci::RunnerReleases).to receive(:instance).and_return(runner_releases_double)
- allow(runner_releases_double).to receive(:releases).and_return(available_runner_releases.map { |v| ::Gitlab::VersionInfo.parse(v) })
+ it 'returns :error' do
+ is_expected.to eq({ error: parsed_runner_version })
+ end
end
- context 'with available_runner_releases configured up to 14.1.1' do
- let(:available_runner_releases) { %w[13.9.0 13.9.1 13.9.2 13.10.0 13.10.1 14.0.0 14.0.1 14.0.2 14.1.0 14.1.1 14.1.1-rc3] }
+ context 'with available_runner_releases configured' do
+ before do
+ url = ::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url
- context 'with nil runner_version' do
- let(:runner_version) { nil }
+ WebMock.stub_request(:get, url).to_return(
+ body: available_runner_releases.map { |v| { name: v } }.to_json,
+ status: 200,
+ headers: { 'Content-Type' => 'application/json' }
+ )
+ end
- it 'returns :invalid' do
- is_expected.to eq(:invalid)
+ context 'with no available runner releases' do
+ let(:available_runner_releases) do
+ %w[]
end
- end
- context 'with invalid runner_version' do
- let(:runner_version) { 'junk' }
+ context 'with Gitlab::VERSION set to 14.1.1' do
+ let(:gitlab_version) { '14.1.1' }
- it 'raises ArgumentError' do
- expect { subject }.to raise_error(ArgumentError)
+ context 'with runner_version from last minor release' do
+ let(:runner_version) { 'v14.0.1' }
+
+ it 'returns :not_available' do
+ is_expected.to eq({ not_available: parsed_runner_version })
+ end
+ end
end
end
- context 'with Gitlab::VERSION set to 14.1.123' do
- before do
- stub_version('14.1.123', 'deadbeef')
+ context 'up to 14.1.1' do
+ let(:available_runner_releases) do
+ %w[13.9.0 13.9.1 13.9.2 13.10.0 13.10.1 14.0.0 14.0.1 14.0.2-rc1 14.0.2 14.1.0 14.1.1]
+ end
+
+ context 'with nil runner_version' do
+ let(:runner_version) { nil }
- described_class.instance.reset!
+ it 'returns :invalid_version' do
+ is_expected.to match({ invalid_version: anything })
+ end
end
- context 'with a runner_version that is too recent' do
- let(:runner_version) { 'v14.2.0' }
+ context 'with invalid runner_version' do
+ let(:runner_version) { 'junk' }
- it 'returns :not_available' do
- is_expected.to eq(:not_available)
+ it 'returns :invalid_version' do
+ is_expected.to match({ invalid_version: anything })
end
end
- end
- context 'with Gitlab::VERSION set to 14.0.1' do
- before do
- stub_version('14.0.1', 'deadbeef')
+ context 'with Gitlab::VERSION set to 14.1.123' do
+ let(:gitlab_version) { '14.1.123' }
+
+ context 'with a runner_version that is too recent' do
+ let(:runner_version) { 'v14.2.0' }
- described_class.instance.reset!
+ it 'returns :not_available' do
+ is_expected.to eq({ not_available: parsed_runner_version })
+ end
+ end
+ end
+
+ context 'with Gitlab::VERSION set to 14.0.1' do
+ let(:gitlab_version) { '14.0.1' }
+
+ context 'with valid params' do
+ where(:runner_version, :expected_result, :expected_suggested_version) do
+ 'v15.0.0' | :not_available | '15.0.0' # not available since the GitLab instance is still on 14.x, a major version might be incompatible, and a patch upgrade is not available
+ 'v14.1.0-rc3' | :recommended | '14.1.1' # recommended since even though the GitLab instance is still on 14.0.x, there is a patch release (14.1.1) available which might contain security fixes
+ 'v14.1.0~beta.1574.gf6ea9389' | :recommended | '14.1.1' # suffixes are correctly handled
+ 'v14.1.0/1.1.0' | :recommended | '14.1.1' # suffixes are correctly handled
+ 'v14.1.0' | :recommended | '14.1.1' # recommended since even though the GitLab instance is still on 14.0.x, there is a patch release (14.1.1) available which might contain security fixes
+ 'v14.0.1' | :recommended | '14.0.2' # recommended upgrade since 14.0.2 is available
+ 'v14.0.2-rc1' | :recommended | '14.0.2' # recommended upgrade since 14.0.2 is available and we'll move out of a release candidate
+ 'v14.0.2' | :not_available | '14.0.2' # not available since 14.0.2 is the latest 14.0.x release available within the instance's major.minor version
+ 'v13.10.1' | :available | '14.0.2' # available upgrade: 14.0.2
+ 'v13.10.1~beta.1574.gf6ea9389' | :recommended | '13.10.1' # suffixes are correctly handled, official 13.10.1 is available
+ 'v13.10.1/1.1.0' | :recommended | '13.10.1' # suffixes are correctly handled, official 13.10.1 is available
+ 'v13.10.0' | :recommended | '13.10.1' # recommended upgrade since 13.10.1 is available
+ 'v13.9.2' | :recommended | '14.0.2' # recommended upgrade since backports are no longer released for this version
+ 'v13.9.0' | :recommended | '14.0.2' # recommended upgrade since backports are no longer released for this version
+ 'v13.8.1' | :recommended | '14.0.2' # recommended upgrade since build is too old (missing in records)
+ 'v11.4.1' | :recommended | '14.0.2' # recommended upgrade since build is too old (missing in records)
+ end
+
+ with_them do
+ it { is_expected.to eq({ expected_result => Gitlab::VersionInfo.parse(expected_suggested_version) }) }
+ end
+ end
end
- context 'with valid params' do
- where(:runner_version, :expected_result) do
- 'v15.0.0' | :not_available # not available since the GitLab instance is still on 14.x and a major version might be incompatible
- 'v14.1.0-rc3' | :recommended # recommended since even though the GitLab instance is still on 14.0.x, there is a patch release (14.1.1) available which might contain security fixes
- 'v14.1.0~beta.1574.gf6ea9389' | :recommended # suffixes are correctly handled
- 'v14.1.0/1.1.0' | :recommended # suffixes are correctly handled
- 'v14.1.0' | :recommended # recommended since even though the GitLab instance is still on 14.0.x, there is a patch release (14.1.1) available which might contain security fixes
- 'v14.0.1' | :recommended # recommended upgrade since 14.0.2 is available
- 'v14.0.2' | :not_available # not available since 14.0.2 is the latest 14.0.x release available within the instance's major.minor version
- 'v13.10.1' | :available # available upgrade: 14.1.1
- 'v13.10.1~beta.1574.gf6ea9389' | :available # suffixes are correctly handled
- 'v13.10.1/1.1.0' | :available # suffixes are correctly handled
- 'v13.10.0' | :recommended # recommended upgrade since 13.10.1 is available
- 'v13.9.2' | :recommended # recommended upgrade since backports are no longer released for this version
- 'v13.9.0' | :recommended # recommended upgrade since backports are no longer released for this version
- 'v13.8.1' | :recommended # recommended upgrade since build is too old (missing in records)
- 'v11.4.1' | :recommended # recommended upgrade since build is too old (missing in records)
+ context 'with Gitlab::VERSION set to 13.9.0' do
+ let(:gitlab_version) { '13.9.0' }
+
+ context 'with valid params' do
+ where(:runner_version, :expected_result, :expected_suggested_version) do
+ 'v14.0.0' | :recommended | '14.0.2' # recommended upgrade since 14.0.2 is available, even though the GitLab instance is still on 13.x and a major version might be incompatible
+ 'v13.10.1' | :not_available | '13.10.1' # not available since 13.10.1 is already ahead of GitLab instance version and is the latest patch update for 13.10.x
+ 'v13.10.0' | :recommended | '13.10.1' # recommended upgrade since 13.10.1 is available
+ 'v13.9.2' | :not_available | '13.9.2' # not_available even though backports are no longer released for this version because the runner is already on the same version as the GitLab version
+ 'v13.9.0' | :recommended | '13.9.2' # recommended upgrade since backports are no longer released for this version
+ 'v13.8.1' | :recommended | '13.9.2' # recommended upgrade since build is too old (missing in records)
+ 'v11.4.1' | :recommended | '13.9.2' # recommended upgrade since build is too old (missing in records)
+ end
+
+ with_them do
+ it { is_expected.to eq({ expected_result => Gitlab::VersionInfo.parse(expected_suggested_version) }) }
+ end
end
+ end
+ end
+
+ context 'up to 15.1.0' do
+ let(:available_runner_releases) { %w[14.9.1 14.9.2 14.10.0 14.10.1 15.0.0 15.1.0] }
+
+ context 'with Gitlab::VERSION set to 15.2.0-pre' do
+ let(:gitlab_version) { '15.2.0-pre' }
+
+ context 'with unknown runner version' do
+ let(:runner_version) { '14.11.0~beta.29.gd0c550e3' }
- with_them do
- it 'returns symbol representing expected upgrade status' do
- is_expected.to be_a(Symbol)
- is_expected.to eq(expected_result)
+ it 'recommends 15.1.0 since 14.11 is an unknown release and 15.1.0 is available' do
+ is_expected.to eq({ recommended: Gitlab::VersionInfo.new(15, 1, 0) })
end
end
end
diff --git a/spec/lib/gitlab/ci/status/stage/factory_spec.rb b/spec/lib/gitlab/ci/status/stage/factory_spec.rb
index e0f5531f370..35d44281072 100644
--- a/spec/lib/gitlab/ci/status/stage/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/stage/factory_spec.rb
@@ -7,9 +7,7 @@ RSpec.describe Gitlab::Ci::Status::Stage::Factory do
let(:project) { create(:project) }
let(:pipeline) { create(:ci_empty_pipeline, project: project) }
- let(:stage) do
- build(:ci_stage, pipeline: pipeline, name: 'test')
- end
+ let(:stage) { create(:ci_stage, pipeline: pipeline) }
subject do
described_class.new(stage, user)
@@ -26,11 +24,7 @@ RSpec.describe Gitlab::Ci::Status::Stage::Factory do
context 'when stage has a core status' do
(Ci::HasStatus::AVAILABLE_STATUSES - %w(manual skipped scheduled)).each do |core_status|
context "when core status is #{core_status}" do
- before do
- create(:ci_build, pipeline: pipeline, stage: 'test', status: core_status)
- create(:commit_status, pipeline: pipeline, stage: 'test', status: core_status)
- create(:ci_build, pipeline: pipeline, stage: 'build', status: :failed)
- end
+ let(:stage) { create(:ci_stage, pipeline: pipeline, status: core_status) }
it "fabricates a core status #{core_status}" do
expect(status).to be_a(
@@ -48,12 +42,12 @@ RSpec.describe Gitlab::Ci::Status::Stage::Factory do
context 'when stage has warnings' do
let(:stage) do
- build(:ci_stage, name: 'test', status: :success, pipeline: pipeline)
+ create(:ci_stage, status: :success, pipeline: pipeline)
end
before do
create(:ci_build, :allowed_to_fail, :failed,
- stage: 'test', pipeline: stage.pipeline)
+ stage_id: stage.id, pipeline: stage.pipeline)
end
it 'fabricates extended "success with warnings" status' do
@@ -70,11 +64,7 @@ RSpec.describe Gitlab::Ci::Status::Stage::Factory do
context 'when stage has manual builds' do
(Ci::HasStatus::BLOCKED_STATUS + ['skipped']).each do |core_status|
context "when status is #{core_status}" do
- before do
- create(:ci_build, pipeline: pipeline, stage: 'test', status: core_status)
- create(:commit_status, pipeline: pipeline, stage: 'test', status: core_status)
- create(:ci_build, pipeline: pipeline, stage: 'build', status: :manual)
- end
+ let(:stage) { create(:ci_stage, pipeline: pipeline, status: core_status) }
it 'fabricates a play manual status' do
expect(status).to be_a(Gitlab::Ci::Status::Stage::PlayManual)
diff --git a/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb b/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb
index 25b79ff2099..9fdaddc083e 100644
--- a/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb
+++ b/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe Gitlab::Ci::Status::Stage::PlayManual do
end
describe '#action_path' do
- let(:stage) { create(:ci_stage_entity, status: 'manual') }
+ let(:stage) { create(:ci_stage, status: 'manual') }
let(:pipeline) { stage.pipeline }
let(:play_manual) { stage.detailed_status(create(:user)) }
@@ -46,25 +46,25 @@ RSpec.describe Gitlab::Ci::Status::Stage::PlayManual do
subject { described_class.matches?(stage, user) }
context 'when stage is skipped' do
- let(:stage) { create(:ci_stage_entity, status: :skipped) }
+ let(:stage) { create(:ci_stage, status: :skipped) }
it { is_expected.to be_truthy }
end
context 'when stage is manual' do
- let(:stage) { create(:ci_stage_entity, status: :manual) }
+ let(:stage) { create(:ci_stage, status: :manual) }
it { is_expected.to be_truthy }
end
context 'when stage is scheduled' do
- let(:stage) { create(:ci_stage_entity, status: :scheduled) }
+ let(:stage) { create(:ci_stage, status: :scheduled) }
it { is_expected.to be_truthy }
end
context 'when stage is success' do
- let(:stage) { create(:ci_stage_entity, status: :success) }
+ let(:stage) { create(:ci_stage, status: :success) }
context 'and does not have manual builds' do
it { is_expected.to be_falsy }
diff --git a/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb b/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb
index 6c4f69fb036..5ab859241c6 100644
--- a/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb
+++ b/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do
let(:error_message) do
<<~MESSAGE
A mechanism depending on internals of 'act-as-taggable-on` has been designed
- to bulk insert tags for Ci::Build records.
+ to bulk insert tags for Ci::Build/Ci::Runner records.
Please review the code carefully before updating the gem version
https://gitlab.com/gitlab-org/gitlab/-/issues/350053
MESSAGE
@@ -27,6 +27,21 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do
it { expect(ActsAsTaggableOn::VERSION).to eq(acceptable_version), error_message }
end
+ describe '.bulk_insert_tags!' do
+ let(:inserter) { instance_double(described_class) }
+
+ it 'delegates to bulk insert class' do
+ expect(Gitlab::Ci::Tags::BulkInsert)
+ .to receive(:new)
+ .with(statuses)
+ .and_return(inserter)
+
+ expect(inserter).to receive(:insert!)
+
+ described_class.bulk_insert_tags!(statuses)
+ end
+ end
+
describe '#insert!' do
context 'without tags' do
it { expect(service.insert!).to be_falsey }
@@ -44,6 +59,50 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do
expect(job.reload.tag_list).to match_array(%w[tag1 tag2])
expect(other_job.reload.tag_list).to match_array(%w[tag2 tag3 tag4])
end
+
+ it 'persists taggings' do
+ service.insert!
+
+ expect(job.taggings.size).to eq(2)
+ expect(other_job.taggings.size).to eq(3)
+
+ expect(Ci::Build.tagged_with('tag1')).to include(job)
+ expect(Ci::Build.tagged_with('tag2')).to include(job, other_job)
+ expect(Ci::Build.tagged_with('tag3')).to include(other_job)
+ end
+
+ it 'strips tags' do
+ job.tag_list = [' taga', 'tagb ', ' tagc ']
+
+ service.insert!
+ expect(job.tags.map(&:name)).to match_array(%w[taga tagb tagc])
+ end
+
+ context 'when batching inserts for tags' do
+ before do
+ stub_const("#{described_class}::TAGS_BATCH_SIZE", 2)
+ end
+
+ it 'inserts tags in batches' do
+ recorder = ActiveRecord::QueryRecorder.new { service.insert! }
+ count = recorder.log.count { |query| query.include?('INSERT INTO "tags"') }
+
+ expect(count).to eq(2)
+ end
+ end
+
+ context 'when batching inserts for taggings' do
+ before do
+ stub_const("#{described_class}::TAGGINGS_BATCH_SIZE", 2)
+ end
+
+ it 'inserts taggings in batches' do
+ recorder = ActiveRecord::QueryRecorder.new { service.insert! }
+ count = recorder.log.count { |query| query.include?('INSERT INTO "taggings"') }
+
+ expect(count).to eq(3)
+ end
+ end
end
context 'with tags for only one job' do
@@ -57,6 +116,15 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do
expect(job.reload.tag_list).to match_array(%w[tag1 tag2])
expect(other_job.reload.tag_list).to be_empty
end
+
+ it 'persists taggings' do
+ service.insert!
+
+ expect(job.taggings.size).to eq(2)
+
+ expect(Ci::Build.tagged_with('tag1')).to include(job)
+ expect(Ci::Build.tagged_with('tag2')).to include(job)
+ 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 27de8324206..65fd2b016ac 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
@@ -34,6 +34,16 @@ RSpec.describe 'Deploy-ECS.gitlab-ci.yml' do
expect(build_names).to include('production_ecs')
end
+ context 'when the DAST template is also included' do
+ let(:dast_template) { Gitlab::Template::GitlabCiYmlTemplate.find('Security/DAST') }
+
+ before do
+ stub_ci_pipeline_yaml_file(template.content + dast_template.content)
+ end
+
+ include_examples 'no pipeline yaml error'
+ end
+
context 'when running a pipeline for a branch' do
let(:pipeline_branch) { 'test_branch' }
diff --git a/spec/lib/gitlab/ci/variables/builder_spec.rb b/spec/lib/gitlab/ci/variables/builder_spec.rb
index b0704ad7f50..8ec0846bdca 100644
--- a/spec/lib/gitlab/ci/variables/builder_spec.rb
+++ b/spec/lib/gitlab/ci/variables/builder_spec.rb
@@ -166,9 +166,8 @@ RSpec.describe Gitlab::Ci::Variables::Builder do
allow(builder).to receive(:secret_instance_variables) { [var('J', 10), var('K', 10)] }
allow(builder).to receive(:secret_group_variables) { [var('K', 11), var('L', 11)] }
allow(builder).to receive(:secret_project_variables) { [var('L', 12), var('M', 12)] }
- allow(job).to receive(:trigger_request) { double(user_variables: [var('M', 13), var('N', 13)]) }
- allow(pipeline).to receive(:variables) { [var('N', 14), var('O', 14)] }
- allow(pipeline).to receive(:pipeline_schedule) { double(job_variables: [var('O', 15), var('P', 15)]) }
+ allow(pipeline).to receive(:variables) { [var('M', 13), var('N', 13)] }
+ allow(pipeline).to receive(:pipeline_schedule) { double(job_variables: [var('N', 14), var('O', 14)]) }
end
it 'returns variables in order depending on resource hierarchy' do
@@ -185,8 +184,7 @@ RSpec.describe Gitlab::Ci::Variables::Builder do
var('K', 11), var('L', 11),
var('L', 12), var('M', 12),
var('M', 13), var('N', 13),
- var('N', 14), var('O', 14),
- var('O', 15), var('P', 15)])
+ var('N', 14), var('O', 14)])
end
it 'overrides duplicate keys depending on resource hierarchy' do
@@ -198,7 +196,7 @@ RSpec.describe Gitlab::Ci::Variables::Builder do
'I' => '9', 'J' => '10',
'K' => '11', 'L' => '12',
'M' => '13', 'N' => '14',
- 'O' => '15', 'P' => '15')
+ 'O' => '14')
end
end
diff --git a/spec/lib/gitlab/ci/yaml_processor/feature_flags_spec.rb b/spec/lib/gitlab/ci/yaml_processor/feature_flags_spec.rb
new file mode 100644
index 00000000000..0bd9563d191
--- /dev/null
+++ b/spec/lib/gitlab/ci/yaml_processor/feature_flags_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Ci::YamlProcessor::FeatureFlags do
+ let(:feature_flag) { :my_feature_flag }
+
+ context 'when the actor is set' do
+ let(:actor) { double }
+ let(:another_actor) { double }
+
+ it 'checks the feature flag using the given actor' do
+ described_class.with_actor(actor) do
+ expect(Feature).to receive(:enabled?).with(feature_flag, actor)
+
+ described_class.enabled?(feature_flag)
+ end
+ end
+
+ it 'returns the value of the block' do
+ result = described_class.with_actor(actor) do
+ :test
+ end
+
+ expect(result).to eq(:test)
+ end
+
+ it 'restores the existing actor if any' do
+ described_class.with_actor(actor) do
+ described_class.with_actor(another_actor) do
+ expect(Feature).to receive(:enabled?).with(feature_flag, another_actor)
+
+ described_class.enabled?(feature_flag)
+ end
+
+ expect(Feature).to receive(:enabled?).with(feature_flag, actor)
+ described_class.enabled?(feature_flag)
+ end
+ end
+
+ it 'restores the actor to nil after the block' do
+ described_class.with_actor(actor) do
+ expect(Thread.current[described_class::ACTOR_KEY]).to eq(actor)
+ end
+
+ expect(Thread.current[described_class::ACTOR_KEY]).to be nil
+ end
+ end
+
+ context 'when feature flag is checked outside the "with_actor" block' do
+ it 'raises an error on dev/test environment' do
+ expect { described_class.enabled?(feature_flag) }.to raise_error(described_class::NoActorError)
+ end
+
+ context 'when on production' do
+ before do
+ allow(Gitlab::ErrorTracking).to receive(:should_raise_for_dev?).and_return(false)
+ end
+
+ it 'checks the feature flag without actor' do
+ expect(Feature).to receive(:enabled?).with(feature_flag, nil)
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_and_raise_for_dev_exception)
+ .and_call_original
+
+ described_class.enabled?(feature_flag)
+ end
+ end
+ end
+
+ context 'when actor is explicitly nil' do
+ it 'checks the feature flag without actor' do
+ described_class.with_actor(nil) do
+ expect(Feature).to receive(:enabled?).with(feature_flag, nil)
+
+ described_class.enabled?(feature_flag)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index 3dd9ca35881..22bc6b0db59 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -70,7 +70,7 @@ module Gitlab
options: { script: ['rspec'] },
rules: [
{ if: '$CI_COMMIT_REF_NAME == "master"' },
- { changes: %w[README.md] }
+ { changes: { paths: %w[README.md] } }
],
allow_failure: false,
when: 'on_success',
@@ -980,7 +980,7 @@ module Gitlab
it { is_expected.to be_valid }
- it "returns image and service when defined" do
+ it "returns with image" do
expect(processor.stage_builds_attributes("test")).to contain_exactly({
stage: "test",
stage_idx: 2,
@@ -1010,6 +1010,51 @@ module Gitlab
end
end
end
+
+ context 'when a service has pull_policy' do
+ let(:config) do
+ <<~YAML
+ services:
+ - name: postgres:11.9
+ pull_policy: if-not-present
+
+ test:
+ script: exit 0
+ YAML
+ end
+
+ it { is_expected.to be_valid }
+
+ it "returns with service" do
+ expect(processor.stage_builds_attributes("test")).to contain_exactly({
+ stage: "test",
+ stage_idx: 2,
+ name: "test",
+ only: { refs: %w[branches tags] },
+ options: {
+ script: ["exit 0"],
+ services: [{ name: "postgres:11.9", pull_policy: ["if-not-present"] }]
+ },
+ allow_failure: false,
+ when: "on_success",
+ job_variables: [],
+ root_variables_inheritance: true,
+ scheduling_type: :stage
+ })
+ end
+
+ context 'when the feature flag ci_docker_image_pull_policy is disabled' do
+ before do
+ stub_feature_flags(ci_docker_image_pull_policy: false)
+ end
+
+ it { is_expected.not_to be_valid }
+
+ it "returns no job" do
+ expect(processor.jobs).to eq({})
+ end
+ end
+ end
end
describe 'Variables' do
@@ -2848,6 +2893,51 @@ module Gitlab
end
end
+ describe 'Rules' do
+ context 'changes' do
+ let(:config) do
+ <<~YAML
+ rspec:
+ script: exit 0
+ rules:
+ - changes: [README.md]
+ YAML
+ end
+
+ it 'returns builds with correct rules' do
+ expect(processor.builds.size).to eq(1)
+ expect(processor.builds[0]).to match(
+ hash_including(
+ name: "rspec",
+ rules: [{ changes: { paths: ["README.md"] } }]
+ )
+ )
+ end
+
+ context 'with paths' do
+ let(:config) do
+ <<~YAML
+ rspec:
+ script: exit 0
+ rules:
+ - changes:
+ paths: [README.md]
+ YAML
+ end
+
+ it 'returns builds with correct rules' do
+ expect(processor.builds.size).to eq(1)
+ expect(processor.builds[0]).to match(
+ hash_including(
+ name: "rspec",
+ rules: [{ changes: { paths: ["README.md"] } }]
+ )
+ )
+ end
+ end
+ end
+ end
+
describe '#execute' do
subject { Gitlab::Ci::YamlProcessor.new(content).execute }
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 109e83be294..616fe15c1a6 100644
--- a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
+++ b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
@@ -92,11 +92,11 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
context 'when sentry is configured' do
before do
stub_sentry_settings
- stub_config_setting(host: 'example.com')
+ stub_config_setting(host: 'gitlab.example.com')
end
it 'adds sentry path to CSP without user' do
- expect(directives['connect_src']).to eq("'self' ws://example.com dummy://example.com/43")
+ expect(directives['connect_src']).to eq("'self' ws://gitlab.example.com dummy://example.com")
end
end
@@ -146,7 +146,7 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
let(:snowplow_micro_url) { "http://#{snowplow_micro_hostname}/" }
before do
- stub_env('SNOWPLOW_MICRO_ENABLE', 1)
+ stub_config(snowplow_micro: { enabled: true })
allow(Gitlab::Tracking).to receive(:collector_hostname).and_return(snowplow_micro_hostname)
end
@@ -169,9 +169,9 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
expect(directives['connect_src']).to match(Regexp.new(snowplow_micro_url))
end
- context 'when not enabled using ENV[SNOWPLOW_MICRO_ENABLE]' do
+ context 'when not enabled using config' do
before do
- stub_env('SNOWPLOW_MICRO_ENABLE', nil)
+ stub_config(snowplow_micro: { enabled: false })
end
it 'does not add Snowplow Micro URL to connect-src' do
@@ -220,10 +220,11 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
expect(policy.directives['base-uri']).to be_nil
end
- it 'returns default values for directives not defined by the user' do
+ it 'returns default values for directives not defined by the user or with <default_value> and disables directives set to false' do
# Explicitly disabling script_src and setting report_uri
csp_config[:directives] = {
script_src: false,
+ style_src: '<default_value>',
report_uri: 'https://example.org'
}
diff --git a/spec/lib/gitlab/data_builder/deployment_spec.rb b/spec/lib/gitlab/data_builder/deployment_spec.rb
index e8fe80f75cb..8ee57542d43 100644
--- a/spec/lib/gitlab/data_builder/deployment_spec.rb
+++ b/spec/lib/gitlab/data_builder/deployment_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::DataBuilder::Deployment do
it 'returns the object kind for a deployment' do
deployment = build(:deployment, deployable: nil, environment: create(:environment))
- data = described_class.build(deployment, Time.current)
+ data = described_class.build(deployment, 'success', Time.current)
expect(data[:object_kind]).to eq('deployment')
end
@@ -23,7 +23,7 @@ RSpec.describe Gitlab::DataBuilder::Deployment do
expected_commit_url = Gitlab::UrlBuilder.build(commit)
status_changed_at = Time.current
- data = described_class.build(deployment, status_changed_at)
+ data = described_class.build(deployment, 'failed', status_changed_at)
expect(data[:status]).to eq('failed')
expect(data[:status_changed_at]).to eq(status_changed_at)
@@ -42,7 +42,7 @@ RSpec.describe Gitlab::DataBuilder::Deployment do
it 'does not include the deployable URL when there is no deployable' do
deployment = create(:deployment, status: :failed, deployable: nil)
- data = described_class.build(deployment, Time.current)
+ data = described_class.build(deployment, 'failed', Time.current)
expect(data[:deployable_url]).to be_nil
end
@@ -51,7 +51,7 @@ RSpec.describe Gitlab::DataBuilder::Deployment do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:deployment) { create(:deployment, project: project) }
- subject(:data) { described_class.build(deployment, Time.current) }
+ subject(:data) { described_class.build(deployment, 'created', Time.current) }
before(:all) do
project.repository.remove
@@ -69,7 +69,7 @@ RSpec.describe Gitlab::DataBuilder::Deployment do
context 'when deployed_by is nil' do
let_it_be(:deployment) { create(:deployment, user: nil, deployable: nil) }
- subject(:data) { described_class.build(deployment, Time.current) }
+ subject(:data) { described_class.build(deployment, 'created', Time.current) }
before(:all) do
deployment.user = nil
diff --git a/spec/lib/gitlab/data_builder/pipeline_spec.rb b/spec/lib/gitlab/data_builder/pipeline_spec.rb
index c2bd20798f1..469812c80fc 100644
--- a/spec/lib/gitlab/data_builder/pipeline_spec.rb
+++ b/spec/lib/gitlab/data_builder/pipeline_spec.rb
@@ -36,6 +36,7 @@ RSpec.describe Gitlab::DataBuilder::Pipeline do
expect(build_data).to be_a(Hash)
expect(build_data[:id]).to eq(build.id)
expect(build_data[:status]).to eq(build.status)
+ expect(build_data[:failure_reason]).to be_nil
expect(build_data[:allow_failure]).to eq(build.allow_failure)
expect(build_data[:environment]).to be_nil
expect(runner_data).to eq(nil)
@@ -197,4 +198,14 @@ RSpec.describe Gitlab::DataBuilder::Pipeline do
end
end
end
+
+ describe '.build failed' do
+ let(:build) { create(:ci_build, :failed, pipeline: pipeline, failure_reason: :script_failure) }
+ let(:data) { described_class.build(pipeline) }
+ let(:build_data) { data[:builds].last }
+
+ it 'has failure_reason' do
+ expect(build_data[:failure_reason]).to eq(build.failure_reason)
+ end
+ end
end
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 c39f6a78e93..a7b3670da7c 100644
--- a/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
@@ -220,6 +220,12 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
expect(described_class.created_since(fixed_time)).to contain_exactly(stuck_job, failed_job, max_attempts_failed_job)
end
end
+
+ describe '.blocked_by_max_attempts' do
+ it 'returns blocked jobs' do
+ expect(described_class.blocked_by_max_attempts).to contain_exactly(max_attempts_failed_job)
+ end
+ end
end
describe 'delegated batched_migration attributes' do
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 97459d4a7be..b8ff78be333 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
@@ -14,6 +14,11 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
end
end
+ before do
+ allow(Gitlab::Database::BackgroundMigration::HealthStatus).to receive(:evaluate)
+ .and_return(Gitlab::Database::BackgroundMigration::HealthStatus::Signals::Normal)
+ end
+
describe '#run_migration_job' do
shared_examples_for 'it has completed the migration' do
it 'does not create and run a migration job' do
@@ -59,13 +64,48 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
sub_batch_size: migration.sub_batch_size)
end
- it 'optimizes the migration after executing the job' do
- migration.update!(min_value: event1.id, max_value: event2.id)
+ context 'migration health' do
+ let(:health_status) { Gitlab::Database::BackgroundMigration::HealthStatus }
+ let(:stop_signal) { health_status::Signals::Stop.new(:indicator, reason: 'Take a break') }
+ let(:normal_signal) { health_status::Signals::Normal.new(:indicator, reason: 'All good') }
+ let(:not_available_signal) { health_status::Signals::NotAvailable.new(:indicator, reason: 'Indicator is disabled') }
+ let(:unknown_signal) { health_status::Signals::Unknown.new(:indicator, reason: 'Something went wrong') }
- expect(migration_wrapper).to receive(:perform).ordered
- expect(migration).to receive(:optimize!).ordered
+ before do
+ migration.update!(min_value: event1.id, max_value: event2.id)
+ expect(migration_wrapper).to receive(:perform)
+ end
- runner.run_migration_job(migration)
+ it 'puts migration on hold on stop signal' do
+ expect(health_status).to receive(:evaluate).and_return(stop_signal)
+
+ expect { runner.run_migration_job(migration) }.to change { migration.on_hold? }
+ .from(false).to(true)
+ end
+
+ it 'optimizes migration on normal signal' do
+ expect(health_status).to receive(:evaluate).and_return(normal_signal)
+
+ expect(migration).to receive(:optimize!)
+
+ expect { runner.run_migration_job(migration) }.not_to change { migration.on_hold? }
+ end
+
+ it 'optimizes migration on no signal' do
+ expect(health_status).to receive(:evaluate).and_return(not_available_signal)
+
+ expect(migration).to receive(:optimize!)
+
+ expect { runner.run_migration_job(migration) }.not_to change { migration.on_hold? }
+ end
+
+ it 'optimizes migration on unknown signal' do
+ expect(health_status).to receive(:evaluate).and_return(unknown_signal)
+
+ expect(migration).to receive(:optimize!)
+
+ expect { runner.run_migration_job(migration) }.not_to change { migration.on_hold? }
+ end
end
end
@@ -362,6 +402,8 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
.with(gitlab_schemas, 'CopyColumnUsingBackgroundMigrationJob', table_name, column_name, job_arguments)
.and_return(batched_migration)
+ expect(batched_migration).to receive(:reset_attempts_of_blocked_jobs!).and_call_original
+
expect(batched_migration).to receive(:finalize!).and_call_original
expect do
@@ -380,8 +422,15 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
end
context 'when migration fails to complete' do
+ let(:error_message) do
+ "Batched migration #{batched_migration.job_class_name} could not be completed and a manual action is required."\
+ "Check the admin panel at (`/admin/background_migrations`) for more details."
+ end
+
it 'raises an error' do
- batched_migration.batched_jobs.with_status(:failed).update_all(attempts: Gitlab::Database::BackgroundMigration::BatchedJob::MAX_ATTEMPTS)
+ allow(Gitlab::Database::BackgroundMigration::BatchedMigration).to receive(:find_for_configuration).and_return(batched_migration)
+
+ allow(batched_migration).to receive(:finished?).and_return(false)
expect do
runner.finalize(
@@ -390,7 +439,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
column_name,
job_arguments
)
- end.to raise_error described_class::FailedToFinalize
+ end.to raise_error(described_class::FailedToFinalize, error_message)
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 8819171cfd0..55f607c0cb0 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
@@ -157,6 +157,27 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
end
end
+ describe '#reset_attempts_of_blocked_jobs!' do
+ let!(:migration) { create(:batched_background_migration) }
+ let(:max_attempts) { Gitlab::Database::BackgroundMigration::BatchedJob::MAX_ATTEMPTS }
+
+ before do
+ create(:batched_background_migration_job, attempts: max_attempts - 1, batched_migration: migration)
+ create(:batched_background_migration_job, attempts: max_attempts + 1, batched_migration: migration)
+ create(:batched_background_migration_job, attempts: max_attempts + 1, batched_migration: migration)
+ end
+
+ it 'sets the number of attempts to zero for blocked jobs' do
+ migration.reset_attempts_of_blocked_jobs!
+
+ expect(migration.batched_jobs.size).to eq(3)
+
+ migration.batched_jobs.blocked_by_max_attempts.each do |job|
+ expect(job.attempts).to be_zero
+ end
+ end
+ end
+
describe '#interval_elapsed?' do
context 'when the migration has no last_job' do
let(:batched_migration) { build(:batched_background_migration) }
@@ -322,6 +343,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
describe '#retry_failed_jobs!' do
let(:batched_migration) { create(:batched_background_migration, status: 'failed') }
+ let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
subject(:retry_failed_jobs) { batched_migration.retry_failed_jobs! }
@@ -335,7 +357,8 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
anything,
batch_min_value: 6,
batch_size: 5,
- job_arguments: batched_migration.job_arguments
+ job_arguments: batched_migration.job_arguments,
+ job_class: job_class
).and_return([6, 10])
end
end
@@ -570,6 +593,30 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
end
end
+ describe '#on_hold?', :freeze_time do
+ subject { migration.on_hold? }
+
+ let(:migration) { create(:batched_background_migration) }
+
+ it 'returns false if no on_hold_until is set' do
+ migration.on_hold_until = nil
+
+ expect(subject).to be_falsey
+ end
+
+ it 'returns false if on_hold_until has passed' do
+ migration.on_hold_until = 1.minute.ago
+
+ expect(subject).to be_falsey
+ end
+
+ it 'returns true if on_hold_until is in the future' do
+ migration.on_hold_until = 1.minute.from_now
+
+ expect(subject).to be_truthy
+ end
+ end
+
describe '.for_configuration' do
let!(:attributes) do
{
diff --git a/spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb b/spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb
new file mode 100644
index 00000000000..21204814f17
--- /dev/null
+++ b/spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::BackgroundMigration::HealthStatus::Indicators::AutovacuumActiveOnTable do
+ include Database::DatabaseHelpers
+
+ let(:connection) { Gitlab::Database.database_base_models[:main].connection }
+
+ around do |example|
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ example.run
+ end
+ end
+
+ describe '#evaluate' do
+ subject { described_class.new(context).evaluate }
+
+ before do
+ swapout_view_for_table(:postgres_autovacuum_activity)
+ end
+
+ let(:context) { Gitlab::Database::BackgroundMigration::HealthStatus::Context.new(tables) }
+ let(:tables) { [table] }
+ let(:table) { 'users' }
+
+ context 'without autovacuum activity' do
+ it 'returns Normal signal' do
+ expect(subject).to be_a(Gitlab::Database::BackgroundMigration::HealthStatus::Signals::Normal)
+ end
+
+ it 'remembers the indicator class' do
+ expect(subject.indicator_class).to eq(described_class)
+ end
+ end
+
+ context 'with autovacuum activity' do
+ before do
+ create(:postgres_autovacuum_activity, table: table, table_identifier: "public.#{table}")
+ end
+
+ it 'returns Stop signal' do
+ expect(subject).to be_a(Gitlab::Database::BackgroundMigration::HealthStatus::Signals::Stop)
+ end
+
+ it 'explains why' do
+ expect(subject.reason).to include('autovacuum running on: table public.users')
+ end
+
+ it 'remembers the indicator class' do
+ expect(subject.indicator_class).to eq(described_class)
+ end
+
+ it 'returns NoSignal signal in case the feature flag is disabled' do
+ stub_feature_flags(batched_migrations_health_status_autovacuum: false)
+
+ expect(subject).to be_a(Gitlab::Database::BackgroundMigration::HealthStatus::Signals::NotAvailable)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/background_migration/health_status_spec.rb b/spec/lib/gitlab/database/background_migration/health_status_spec.rb
new file mode 100644
index 00000000000..6d0430dcbbb
--- /dev/null
+++ b/spec/lib/gitlab/database/background_migration/health_status_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::BackgroundMigration::HealthStatus do
+ let(:connection) { Gitlab::Database.database_base_models[:main].connection }
+
+ around do |example|
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ example.run
+ end
+ end
+
+ describe '.evaluate' do
+ subject(:evaluate) { described_class.evaluate(migration, indicator_class) }
+
+ let(:migration) { build(:batched_background_migration, :active) }
+
+ let(:health_status) { 'Gitlab::Database::BackgroundMigration::HealthStatus' }
+ let(:indicator_class) { class_double("#{health_status}::Indicators::AutovacuumActiveOnTable") }
+ let(:indicator) { instance_double("#{health_status}::Indicators::AutovacuumActiveOnTable") }
+
+ before do
+ allow(indicator_class).to receive(:new).with(migration.health_context).and_return(indicator)
+ end
+
+ it 'returns a signal' do
+ signal = instance_double("#{health_status}::Signals::Normal", log_info?: false)
+
+ expect(indicator).to receive(:evaluate).and_return(signal)
+
+ expect(evaluate).to eq(signal)
+ end
+
+ it 'logs interesting signals' do
+ signal = instance_double("#{health_status}::Signals::Stop", log_info?: true)
+
+ expect(indicator).to receive(:evaluate).and_return(signal)
+ expect(described_class).to receive(:log_signal).with(signal, migration)
+
+ evaluate
+ end
+
+ it 'does not log signals of no interest' do
+ signal = instance_double("#{health_status}::Signals::Normal", log_info?: false)
+
+ expect(indicator).to receive(:evaluate).and_return(signal)
+ expect(described_class).not_to receive(:log_signal)
+
+ evaluate
+ end
+
+ context 'on indicator error' do
+ let(:error) { RuntimeError.new('everything broken') }
+
+ before do
+ expect(indicator).to receive(:evaluate).and_raise(error)
+ end
+
+ it 'does not fail' do
+ expect { evaluate }.not_to raise_error
+ end
+
+ it 'returns Unknown signal' do
+ expect(evaluate).to be_an_instance_of(Gitlab::Database::BackgroundMigration::HealthStatus::Signals::Unknown)
+ expect(evaluate.reason).to eq("unexpected error: everything broken (RuntimeError)")
+ end
+
+ it 'reports the exception to error tracking' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception)
+ .with(error, migration_id: migration.id, job_class_name: migration.job_class_name)
+
+ evaluate
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/each_database_spec.rb b/spec/lib/gitlab/database/each_database_spec.rb
index 8345cdfb8fb..2a6eb8f779d 100644
--- a/spec/lib/gitlab/database/each_database_spec.rb
+++ b/spec/lib/gitlab/database/each_database_spec.rb
@@ -4,9 +4,10 @@ require 'spec_helper'
RSpec.describe Gitlab::Database::EachDatabase do
describe '.each_database_connection', :add_ci_connection do
+ let(:database_base_models) { { main: ActiveRecord::Base, ci: Ci::ApplicationRecord }.with_indifferent_access }
+
before do
- allow(Gitlab::Database).to receive(:database_base_models)
- .and_return({ main: ActiveRecord::Base, ci: Ci::ApplicationRecord }.with_indifferent_access)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(database_base_models)
end
it 'yields each connection after connecting SharedModel' do
@@ -60,12 +61,20 @@ RSpec.describe Gitlab::Database::EachDatabase do
end
context 'when shared connections are not included' do
+ def clear_memoization(key)
+ Gitlab::Database.remove_instance_variable(key) if Gitlab::Database.instance_variable_defined?(key)
+ end
+
+ before do
+ allow(Gitlab::Database).to receive(:database_base_models).and_return(database_base_models)
+
+ # Clear the memoization because the return of Gitlab::Database#schemas_to_base_models depends stubbed value
+ clear_memoization(:@schemas_to_base_models)
+ clear_memoization(:@schemas_to_base_models_ee)
+ end
+
it 'only yields the unshared connections' do
- if Gitlab::Database.has_config?(:ci)
- expect(Gitlab::Database).to receive(:db_config_share_with).exactly(3).times.and_return(nil, 'main', 'main')
- else
- expect(Gitlab::Database).to receive(:db_config_share_with).twice.and_return(nil, 'main')
- end
+ expect(Gitlab::Database).to receive(:db_config_share_with).exactly(3).times.and_return(nil, 'main', 'main')
expect { |b| described_class.each_database_connection(include_shared: false, &b) }
.to yield_successive_args([ActiveRecord::Base.connection, 'main'])
@@ -79,7 +88,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
let(:model2) { Class.new(Gitlab::Database::SharedModel) }
before do
- allow(Gitlab::Database).to receive(:database_base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared)
.and_return({ main: ActiveRecord::Base, ci: Ci::ApplicationRecord }.with_indifferent_access)
end
@@ -136,7 +145,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
let(:ci_model) { Class.new(Ci::ApplicationRecord) }
before do
- allow(Gitlab::Database).to receive(:database_base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared)
.and_return({ main: ActiveRecord::Base, ci: Ci::ApplicationRecord }.with_indifferent_access)
allow(main_model).to receive_message_chain('connection_db_config.name').and_return('main')
diff --git a/spec/lib/gitlab/database/gitlab_schema_spec.rb b/spec/lib/gitlab/database/gitlab_schema_spec.rb
index 611b2fbad72..72950895022 100644
--- a/spec/lib/gitlab/database/gitlab_schema_spec.rb
+++ b/spec/lib/gitlab/database/gitlab_schema_spec.rb
@@ -3,26 +3,27 @@ require 'spec_helper'
RSpec.describe Gitlab::Database::GitlabSchema do
describe '.tables_to_schema' do
- subject { described_class.tables_to_schema }
-
it 'all tables have assigned a known gitlab_schema' do
- is_expected.to all(
- match([be_a(String), be_in([:gitlab_internal, :gitlab_shared, :gitlab_main, :gitlab_ci])])
+ expect(described_class.tables_to_schema).to all(
+ match([be_a(String), be_in(Gitlab::Database.schemas_to_base_models.keys.map(&:to_sym))])
)
end
# This being run across different databases indirectly also tests
# a general consistency of structure across databases
- Gitlab::Database.database_base_models.each do |db_config_name, db_class|
- let(:db_data_sources) { db_class.connection.data_sources }
-
+ Gitlab::Database.database_base_models.select { |k, _| k != 'geo' }.each do |db_config_name, db_class|
context "for #{db_config_name} using #{db_class}" do
+ let(:db_data_sources) { db_class.connection.data_sources }
+
+ # The Geo database does not share the same structure as all decomposed databases
+ subject { described_class.tables_to_schema.select { |_, v| v != :gitlab_geo } }
+
it 'new data sources are added' do
missing_tables = db_data_sources.to_set - subject.keys
expect(missing_tables).to be_empty, \
"Missing table(s) #{missing_tables.to_a} not found in #{described_class}.tables_to_schema. " \
- "Any new tables must be added to lib/gitlab/database/gitlab_schemas.yml."
+ "Any new tables must be added to #{described_class::GITLAB_SCHEMAS_FILE}."
end
it 'non-existing data sources are removed' do
@@ -30,7 +31,7 @@ RSpec.describe Gitlab::Database::GitlabSchema do
expect(extra_tables).to be_empty, \
"Extra table(s) #{extra_tables.to_a} found in #{described_class}.tables_to_schema. " \
- "Any removed or renamed tables must be removed from lib/gitlab/database/gitlab_schemas.yml."
+ "Any removed or renamed tables must be removed from #{described_class::GITLAB_SCHEMAS_FILE}."
end
end
end
diff --git a/spec/lib/gitlab/database/loose_foreign_keys_spec.rb b/spec/lib/gitlab/database/loose_foreign_keys_spec.rb
index ed11699e494..87a3e0f81e4 100644
--- a/spec/lib/gitlab/database/loose_foreign_keys_spec.rb
+++ b/spec/lib/gitlab/database/loose_foreign_keys_spec.rb
@@ -63,19 +63,22 @@ RSpec.describe Gitlab::Database::LooseForeignKeys do
Gitlab::Database.schemas_to_base_models.fetch(parent_table_schema)
end
- it 'all `to_table` tables are present' do
+ it 'all `to_table` tables are present', :aggregate_failures do
definitions.each do |definition|
base_models_for(definition.to_table).each do |model|
- expect(model.connection).to be_table_exist(definition.to_table)
+ expect(model.connection).to be_table_exist(definition.to_table),
+ "Table #{definition.from_table} does not exist"
end
end
end
- it 'all `from_table` tables are present' do
+ it 'all `from_table` tables are present', :aggregate_failures do
definitions.each do |definition|
base_models_for(definition.from_table).each do |model|
- expect(model.connection).to be_table_exist(definition.from_table)
- expect(model.connection).to be_column_exist(definition.from_table, definition.column)
+ expect(model.connection).to be_table_exist(definition.from_table),
+ "Table #{definition.from_table} does not exist"
+ expect(model.connection).to be_column_exist(definition.from_table, definition.column),
+ "Column #{definition.column} in #{definition.from_table} does not exist"
end
end
end
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index e09016b2b2b..3ccc3a17862 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -2477,6 +2477,9 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
describe '#backfill_iids' do
include MigrationsHelpers
+ let_it_be(:issue_base_type_enum) { 0 }
+ let_it_be(:issue_type) { table(:work_item_types).find_by(base_type: issue_base_type_enum) }
+
let(:issue_class) do
Class.new(ActiveRecord::Base) do
include AtomicInternalId
@@ -2490,6 +2493,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
scope: :project,
init: ->(s, _scope) { s&.project&.issues&.maximum(:iid) },
presence: false
+
+ before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id }
end
end
@@ -2515,7 +2520,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
it 'generates iids properly for models created after the migration when iids are backfilled' do
project = setup
- issue_a = issues.create!(project_id: project.id)
+ issue_a = issues.create!(project_id: project.id, work_item_type_id: issue_type.id)
model.backfill_iids('issues')
@@ -2528,14 +2533,14 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
it 'generates iids properly for models created after the migration across multiple projects' do
project_a = setup
project_b = setup
- issues.create!(project_id: project_a.id)
- issues.create!(project_id: project_b.id)
- issues.create!(project_id: project_b.id)
+ issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id)
+ issues.create!(project_id: project_b.id, work_item_type_id: issue_type.id)
+ issues.create!(project_id: project_b.id, work_item_type_id: issue_type.id)
model.backfill_iids('issues')
- issue_a = issue_class.create!(project_id: project_a.id)
- issue_b = issue_class.create!(project_id: project_b.id)
+ issue_a = issue_class.create!(project_id: project_a.id, work_item_type_id: issue_type.id)
+ issue_b = issue_class.create!(project_id: project_b.id, work_item_type_id: issue_type.id)
expect(issue_a.iid).to eq(2)
expect(issue_b.iid).to eq(3)
@@ -2545,7 +2550,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
it 'generates an iid' do
project_a = setup
project_b = setup
- issue_a = issues.create!(project_id: project_a.id)
+ issue_a = issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id)
model.backfill_iids('issues')
@@ -2559,8 +2564,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
context 'when a row already has an iid set in the database' do
it 'backfills iids' do
project = setup
- issue_a = issues.create!(project_id: project.id, iid: 1)
- issue_b = issues.create!(project_id: project.id, iid: 2)
+ issue_a = issues.create!(project_id: project.id, work_item_type_id: issue_type.id, iid: 1)
+ issue_b = issues.create!(project_id: project.id, work_item_type_id: issue_type.id, iid: 2)
model.backfill_iids('issues')
@@ -2571,9 +2576,9 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
it 'backfills for multiple projects' do
project_a = setup
project_b = setup
- issue_a = issues.create!(project_id: project_a.id, iid: 1)
- issue_b = issues.create!(project_id: project_b.id, iid: 1)
- issue_c = issues.create!(project_id: project_a.id, iid: 2)
+ issue_a = issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id, iid: 1)
+ issue_b = issues.create!(project_id: project_b.id, work_item_type_id: issue_type.id, iid: 1)
+ issue_c = issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id, iid: 2)
model.backfill_iids('issues')
diff --git a/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb b/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb
index f3414727245..5bfb2516ba1 100644
--- a/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb
@@ -173,17 +173,6 @@ RSpec.describe Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers d
expect(Gitlab::Database::BackgroundMigration::BatchedMigration.last).to be_finished
end
-
- context 'when within transaction' do
- before do
- allow(migration).to receive(:transaction_open?).and_return(true)
- end
-
- it 'does raise an exception' do
- expect { migration.queue_batched_background_migration('MyJobClass', :events, :id, job_interval: 5.minutes)}
- .to raise_error /`queue_batched_background_migration` cannot be run inside a transaction./
- end
- end
end
end
@@ -301,12 +290,8 @@ RSpec.describe Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers d
end
describe '#delete_batched_background_migration' do
- let(:transaction_open) { false }
-
before do
expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
-
- allow(migration).to receive(:transaction_open?).and_return(transaction_open)
end
context 'when migration exists' do
@@ -360,15 +345,6 @@ RSpec.describe Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers d
end.not_to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }
end
end
-
- context 'when within transaction' do
- let(:transaction_open) { true }
-
- it 'raises an exception' do
- expect { migration.delete_batched_background_migration('MyJobClass', :projects, :id, [[:id], [:id_convert_to_bigint]]) }
- .to raise_error /`#delete_batched_background_migration` cannot be run inside a transaction./
- end
- end
end
describe '#gitlab_schema_from_context' do
diff --git a/spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb b/spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb
index d197f39be40..c6327de98d1 100644
--- a/spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb
+++ b/spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Gitlab::Database::Migrations::ReestablishedConnectionStack do
end
describe '#with_restored_connection_stack' do
- Gitlab::Database.database_base_models.each do |db_config_name, _|
+ Gitlab::Database.database_base_models_with_gitlab_shared.each do |db_config_name, _|
context db_config_name do
it_behaves_like "reconfigures connection stack", db_config_name do
it 'does restore connection hierarchy' do
diff --git a/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb b/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb
index 2f3d44f6f8f..f1f72d71e1a 100644
--- a/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb
+++ b/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb
@@ -68,10 +68,10 @@ RSpec.describe Gitlab::Database::Migrations::TestBatchedBackgroundRunner, :freez
end
context 'with multiple jobs to run' do
- it 'runs all jobs created within the last 48 hours' do
+ it 'runs all jobs created within the last 3 hours' do
old_migration = define_background_migration(migration_name)
- travel 3.days
+ travel 4.hours
new_migration = define_background_migration('NewMigration') { travel 1.second }
migration.queue_batched_background_migration('NewMigration', table_name, :id,
diff --git a/spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb b/spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb
new file mode 100644
index 00000000000..c1ac8f0c9cd
--- /dev/null
+++ b/spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::PostgresAutovacuumActivity, type: :model do
+ include Database::DatabaseHelpers
+
+ it { is_expected.to be_a Gitlab::Database::SharedModel }
+
+ describe '.for_tables' do
+ subject { described_class.for_tables(tables) }
+
+ let(:tables) { %w[foo test] }
+
+ before do
+ swapout_view_for_table(:postgres_autovacuum_activity)
+
+ # unrelated
+ create(:postgres_autovacuum_activity, table: 'bar')
+
+ tables.each do |table|
+ create(:postgres_autovacuum_activity, table: table)
+ end
+
+ expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_primary).and_yield
+ end
+
+ it 'returns autovacuum activity for queries tables' do
+ expect(subject.map(&:table).sort).to eq(tables)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/reindexing_spec.rb b/spec/lib/gitlab/database/reindexing_spec.rb
index 0c576505e07..976b9896dfa 100644
--- a/spec/lib/gitlab/database/reindexing_spec.rb
+++ b/spec/lib/gitlab/database/reindexing_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Database::Reindexing do
include Database::DatabaseHelpers
describe '.invoke' do
- let(:databases) { Gitlab::Database.database_base_models }
+ let(:databases) { Gitlab::Database.database_base_models_with_gitlab_shared }
let(:databases_count) { databases.count }
it 'cleans up any leftover indexes' do
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 e676e5fe034..68c29bad287 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
@@ -38,7 +38,11 @@ RSpec.describe Gitlab::DatabaseImporters::InstanceAdministrators::CreateGroup do
end
end
- context 'with application settings and admin users', :do_not_mock_admin_mode_setting do
+ context(
+ 'with application settings and admin users',
+ :do_not_mock_admin_mode_setting,
+ :do_not_stub_snowplow_by_default
+ ) do
let(:group) { result[:group] }
let(:application_setting) { Gitlab::CurrentSettings.current_application_settings }
@@ -109,7 +113,7 @@ RSpec.describe Gitlab::DatabaseImporters::InstanceAdministrators::CreateGroup do
admin2 = create(:user, :admin)
existing_group.add_owner(user)
- existing_group.add_users([admin1, admin2], Gitlab::Access::MAINTAINER)
+ existing_group.add_members([admin1, admin2], Gitlab::Access::MAINTAINER)
application_setting.instance_administrators_group_id = existing_group.id
end
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index 064613074cd..452a662bdcb 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -337,7 +337,7 @@ RSpec.describe Gitlab::Database do
let(:model2) { Class.new(base_model) }
before do
- allow(described_class).to receive(:database_base_models)
+ allow(described_class).to receive(:database_base_models_using_load_balancing)
.and_return({ model1: model1, model2: model2 }.with_indifferent_access)
end
diff --git a/spec/lib/gitlab/dependency_linker/base_linker_spec.rb b/spec/lib/gitlab/dependency_linker/base_linker_spec.rb
index 678d4a90e8d..2811bc859da 100644
--- a/spec/lib/gitlab/dependency_linker/base_linker_spec.rb
+++ b/spec/lib/gitlab/dependency_linker/base_linker_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Gitlab::DependencyLinker::BaseLinker do
it 'only converts valid links' do
expect(subject).to eq(
<<~CONTENT
- <span><span>#{link('http://')}</span><span>#{link('\n', url: '%5Cn')}</span><span>#{link('javascript:alert(1)', url: nil)}</span></span>
+ <span><span>#{link('http://', url: nil)}</span><span>#{link('\n', url: nil)}</span><span>#{link('javascript:alert(1)', url: nil)}</span></span>
<span><span>#{link('https://gitlab.com/gitlab-org/gitlab')}</span></span>
CONTENT
)
diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb
index 34f4bdde3b5..28557aab830 100644
--- a/spec/lib/gitlab/diff/file_spec.rb
+++ b/spec/lib/gitlab/diff/file_spec.rb
@@ -129,6 +129,14 @@ RSpec.describe Gitlab::Diff::File do
expect(diff_file.rendered).to be_kind_of(Gitlab::Diff::Rendered::Notebook::DiffFile)
end
+ context 'when collapsed' do
+ it 'is nil' do
+ expect(diff).to receive(:collapsed?).and_return(true)
+
+ expect(diff_file.rendered).to be_nil
+ end
+ end
+
context 'when too large' do
it 'is nil' do
expect(diff).to receive(:too_large?).and_return(true)
diff --git a/spec/lib/gitlab/diff/formatters/image_formatter_spec.rb b/spec/lib/gitlab/diff/formatters/image_formatter_spec.rb
index 579776d44aa..73c0d0dba88 100644
--- a/spec/lib/gitlab/diff/formatters/image_formatter_spec.rb
+++ b/spec/lib/gitlab/diff/formatters/image_formatter_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe Gitlab::Diff::Formatters::ImageFormatter do
head_sha: 789,
old_path: 'old_image.png',
new_path: 'new_image.png',
- file_identifier_hash: '777',
position_type: 'image'
}
end
diff --git a/spec/lib/gitlab/diff/formatters/text_formatter_spec.rb b/spec/lib/gitlab/diff/formatters/text_formatter_spec.rb
index b6bdc5ff493..290585d0991 100644
--- a/spec/lib/gitlab/diff/formatters/text_formatter_spec.rb
+++ b/spec/lib/gitlab/diff/formatters/text_formatter_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe Gitlab::Diff::Formatters::TextFormatter do
head_sha: 789,
old_path: 'old_path.txt',
new_path: 'new_path.txt',
- file_identifier_hash: '777',
line_range: nil
}
end
diff --git a/spec/lib/gitlab/diff/highlight_cache_spec.rb b/spec/lib/gitlab/diff/highlight_cache_spec.rb
index e643b58ee32..5350dda5fb2 100644
--- a/spec/lib/gitlab/diff/highlight_cache_spec.rb
+++ b/spec/lib/gitlab/diff/highlight_cache_spec.rb
@@ -3,7 +3,8 @@
require 'spec_helper'
RSpec.describe Gitlab::Diff::HighlightCache, :clean_gitlab_redis_cache do
- let(:merge_request) { create(:merge_request_with_diffs) }
+ let_it_be(:merge_request) { create(:merge_request_with_diffs) }
+
let(:diff_hash) do
{ ".gitignore-false-false-false" =>
[{ line_code: nil, rich_text: nil, text: "@@ -17,3 +17,4 @@ rerun.txt", type: "match", index: 0, old_pos: 17, new_pos: 17 },
@@ -229,10 +230,10 @@ RSpec.describe Gitlab::Diff::HighlightCache, :clean_gitlab_redis_cache do
end
describe 'metrics' do
- let(:transaction) { Gitlab::Metrics::WebTransaction.new({} ) }
+ let(:transaction) { Gitlab::Metrics::WebTransaction.new({}) }
before do
- allow(cache).to receive(:current_transaction).and_return(transaction)
+ allow(::Gitlab::Metrics::WebTransaction).to receive(:current).and_return(transaction)
end
it 'observes :gitlab_redis_diff_caching_memory_usage_bytes' do
@@ -241,6 +242,18 @@ RSpec.describe Gitlab::Diff::HighlightCache, :clean_gitlab_redis_cache do
cache.write_if_empty
end
+
+ it 'records hit ratio metrics' do
+ expect(transaction)
+ .to receive(:increment).with(:gitlab_redis_diff_caching_requests_total).exactly(5).times
+ expect(transaction)
+ .to receive(:increment).with(:gitlab_redis_diff_caching_hits_total).exactly(4).times
+
+ 5.times do
+ cache = described_class.new(merge_request.diffs)
+ cache.write_if_empty
+ end
+ end
end
describe '#key' do
diff --git a/spec/lib/gitlab/diff/position_spec.rb b/spec/lib/gitlab/diff/position_spec.rb
index c9a20f40462..bb3522eb579 100644
--- a/spec/lib/gitlab/diff/position_spec.rb
+++ b/spec/lib/gitlab/diff/position_spec.rb
@@ -574,86 +574,6 @@ RSpec.describe Gitlab::Diff::Position do
end
end
- describe '#find_diff_file_from' do
- context "position for a diff file that has changed from symlink to regular file" do
- let(:commit) { project.commit("81e6355ce4e1544a3524b230952c12455de0777b") }
-
- let(:old_symlink_file_identifier_hash) { "bfa430463f33619872d52a6b85ced59c973e42dc" }
- let(:new_regular_file_identifier_hash) { "e25b60c2e5ffb977d2b1431b96c6f7800c3c3529" }
- let(:file_identifier_hash) { new_regular_file_identifier_hash }
-
- let(:args) do
- {
- file_identifier_hash: file_identifier_hash,
- old_path: "symlink",
- new_path: "symlink",
- old_line: nil,
- new_line: 1,
- diff_refs: commit.diff_refs
- }
- end
-
- let(:diffable) { commit.diff_refs.compare_in(project) }
-
- subject(:diff_file) { described_class.new(args).find_diff_file_from(diffable) }
-
- context 'when file_identifier_hash is disabled' do
- before do
- stub_feature_flags(file_identifier_hash: false)
- end
-
- it "returns the first diff file" do
- expect(diff_file.file_identifier_hash).to eq(old_symlink_file_identifier_hash)
- end
- end
-
- context 'when file_identifier_hash is enabled' do
- before do
- stub_feature_flags(file_identifier_hash: true)
- end
-
- context 'for new regular file' do
- it "returns the correct diff file" do
- expect(diff_file.file_identifier_hash).to eq(new_regular_file_identifier_hash)
- end
- end
-
- context 'for old symlink file' do
- let(:args) do
- {
- file_identifier_hash: old_symlink_file_identifier_hash,
- old_path: "symlink",
- new_path: "symlink",
- old_line: 1,
- new_line: nil,
- diff_refs: commit.diff_refs
- }
- end
-
- it "returns the correct diff file" do
- expect(diff_file.file_identifier_hash).to eq(old_symlink_file_identifier_hash)
- end
- end
-
- context 'when file_identifier_hash is missing' do
- let(:file_identifier_hash) { nil }
-
- it "returns the first diff file" do
- expect(diff_file.file_identifier_hash).to eq(old_symlink_file_identifier_hash)
- end
- end
-
- context 'when file_identifier_hash cannot be found' do
- let(:file_identifier_hash) { "missingidentifier" }
-
- it "returns nil" do
- expect(diff_file).to be_nil
- end
- end
- end
- end
- end
-
describe '#==' do
let(:commit) { project.commit("570e7b2abdd848b95f2f578043fc23bd6f6fd24d") }
diff --git a/spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb b/spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb
index 1414056ad6a..563480d214b 100644
--- a/spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb
+++ b/spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb
@@ -234,118 +234,5 @@ RSpec.describe Gitlab::Diff::PositionTracer::ImageStrategy do
end
end
end
-
- describe 'symlink scenarios' do
- let(:new_file) { old_file_status == :new }
- let(:deleted_file) { old_file_status == :deleted }
- let(:renamed_file) { old_file_status == :renamed }
-
- let(:file_identifier) { "#{file_name}-#{new_file}-#{deleted_file}-#{renamed_file}" }
- let(:file_identifier_hash) { Digest::SHA1.hexdigest(file_identifier) }
- let(:old_position) { position(old_path: file_name, new_path: file_name, position_type: 'image', file_identifier_hash: file_identifier_hash) }
-
- let(:update_file_commit) do
- initial_commit
-
- update_file(
- branch_name,
- file_name,
- Base64.encode64('morecontent')
- )
- end
-
- let(:delete_file_commit) do
- initial_commit
-
- delete_file(branch_name, file_name)
- end
-
- let(:create_second_file_commit) do
- initial_commit
-
- create_file(
- branch_name,
- second_file_name,
- Base64.encode64('morecontent')
- )
- end
-
- before do
- stub_feature_flags(file_identifier_hash: true)
- end
-
- describe 'from symlink to image' do
- let(:initial_commit) { project.commit('a19c7f9a147e35e535c797cf148d29c24dac5544') }
- let(:symlink_to_image_commit) { project.commit('8cfca8420812e5bd7479aa32cf33e0c95a3ca576') }
- let(:branch_name) { 'diff-files-symlink-to-image' }
- let(:file_name) { 'symlink-to-image.png' }
-
- context "when the old position is on the new image file" do
- let(:old_file_status) { :new }
-
- context "when the image file's content was unchanged between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit, symlink_to_image_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit, create_second_file_commit) }
-
- it "returns the new position" do
- expect_new_position(
- old_path: file_name,
- new_path: file_name
- )
- end
- end
-
- context "when the image file's content was changed between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit, symlink_to_image_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit, update_file_commit) }
- let(:change_diff_refs) { diff_refs(symlink_to_image_commit, update_file_commit) }
-
- it "returns the position of the change" do
- expect_change_position(
- old_path: file_name,
- new_path: file_name
- )
- end
- end
-
- context "when the image file was removed between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit, symlink_to_image_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit, delete_file_commit) }
- let(:change_diff_refs) { diff_refs(symlink_to_image_commit, delete_file_commit) }
-
- it "returns the position of the change" do
- expect_change_position(
- old_path: file_name,
- new_path: file_name
- )
- end
- end
- end
- end
-
- describe 'from image to symlink' do
- let(:initial_commit) { project.commit('d10dcdfbbb2b59a959a5f5d66a4adf28f0ea4008') }
- let(:image_to_symlink_commit) { project.commit('3e94fdaa60da8aed38401b91bc56be70d54ca424') }
- let(:branch_name) { 'diff-files-image-to-symlink' }
- let(:file_name) { 'image-to-symlink.png' }
-
- context "when the old position is on the added image file" do
- let(:old_file_status) { :new }
-
- context "when the image file gets changed to a symlink between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit.parent, initial_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit.parent, image_to_symlink_commit) }
- let(:change_diff_refs) { diff_refs(initial_commit, image_to_symlink_commit) }
-
- it "returns the position of the change" do
- expect_change_position(
- old_path: file_name,
- new_path: file_name
- )
- end
- end
- end
- end
- end
end
end
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 ea56a87dec2..2b21084d8e5 100644
--- a/spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb
+++ b/spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb
@@ -1860,143 +1860,5 @@ RSpec.describe Gitlab::Diff::PositionTracer::LineStrategy, :clean_gitlab_redis_c
end
end
end
-
- describe 'symlink scenarios' do
- let(:new_file) { old_file_status == :new }
- let(:deleted_file) { old_file_status == :deleted }
- let(:renamed_file) { old_file_status == :renamed }
-
- let(:file_identifier) { "#{file_name}-#{new_file}-#{deleted_file}-#{renamed_file}" }
- let(:file_identifier_hash) { Digest::SHA1.hexdigest(file_identifier) }
-
- let(:update_line_commit) do
- update_file(
- branch_name,
- file_name,
- <<-CONTENT.strip_heredoc
- A
- BB
- C
- CONTENT
- )
- end
-
- let(:delete_file_commit) do
- delete_file(branch_name, file_name)
- end
-
- let(:create_second_file_commit) do
- create_file(
- branch_name,
- second_file_name,
- <<-CONTENT.strip_heredoc
- D
- E
- CONTENT
- )
- end
-
- before do
- stub_feature_flags(file_identifier_hash: true)
- end
-
- describe 'from symlink to text' do
- let(:initial_commit) { project.commit('0e5b363105e9176a77bac94d7ff6d8c4fb35c3eb') }
- let(:symlink_to_text_commit) { project.commit('689815e617abc6889f1fded4834d2dd7d942a58e') }
- let(:branch_name) { 'diff-files-symlink-to-text' }
- let(:file_name) { 'symlink-to-text.txt' }
- let(:old_position) { position(old_path: file_name, new_path: file_name, new_line: 3, file_identifier_hash: file_identifier_hash) }
-
- before do
- create_branch('diff-files-symlink-to-text-test', branch_name)
- end
-
- context "when the old position is on the new text file" do
- let(:old_file_status) { :new }
-
- context "when the text file's content was unchanged between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit, symlink_to_text_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit, create_second_file_commit) }
-
- it "returns the new position" do
- expect_new_position(
- new_path: old_position.new_path,
- new_line: old_position.new_line
- )
- end
- end
-
- context "when the text file's content has change, but the line was unchanged between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit, symlink_to_text_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit, update_line_commit) }
-
- it "returns the new position" do
- expect_new_position(
- new_path: old_position.new_path,
- new_line: old_position.new_line
- )
- end
- end
-
- context "when the text file's line was changed between the old and the new diff" do
- let(:old_position) { position(old_path: file_name, new_path: file_name, new_line: 2, file_identifier_hash: file_identifier_hash) }
-
- let(:old_diff_refs) { diff_refs(initial_commit, symlink_to_text_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit, update_line_commit) }
- let(:change_diff_refs) { diff_refs(symlink_to_text_commit, update_line_commit) }
-
- it "returns the position of the change" do
- expect_change_position(
- old_path: file_name,
- new_path: file_name,
- old_line: 2,
- new_line: nil
- )
- end
- end
-
- context "when the text file was removed between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit, symlink_to_text_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit, delete_file_commit) }
- let(:change_diff_refs) { diff_refs(symlink_to_text_commit, delete_file_commit) }
-
- it "returns the position of the change" do
- expect_change_position(
- old_path: file_name,
- new_path: file_name,
- old_line: 3,
- new_line: nil
- )
- end
- end
- end
-
- describe 'from text to symlink' do
- let(:initial_commit) { project.commit('3db7bd90bab8ce8f02c9818590b84739a2e97230') }
- let(:text_to_symlink_commit) { project.commit('5e2c2708c2e403dece5dd25759369150aac51644') }
- let(:branch_name) { 'diff-files-text-to-symlink' }
- let(:file_name) { 'text-to-symlink.txt' }
-
- context "when the position is on the added text file" do
- let(:old_file_status) { :new }
-
- context "when the text file gets changed to a symlink between the old and the new diff" do
- let(:old_diff_refs) { diff_refs(initial_commit.parent, initial_commit) }
- let(:new_diff_refs) { diff_refs(initial_commit.parent, text_to_symlink_commit) }
- let(:change_diff_refs) { diff_refs(initial_commit, text_to_symlink_commit) }
-
- it "returns the position of the change" do
- expect_change_position(
- old_path: file_name,
- new_path: file_name,
- old_line: 3,
- new_line: nil
- )
- end
- end
- end
- end
- end
- end
end
end
diff --git a/spec/lib/gitlab/diff/rendered/notebook/diff_file_helper_spec.rb b/spec/lib/gitlab/diff/rendered/notebook/diff_file_helper_spec.rb
index cb046548880..42ab2d1d063 100644
--- a/spec/lib/gitlab/diff/rendered/notebook/diff_file_helper_spec.rb
+++ b/spec/lib/gitlab/diff/rendered/notebook/diff_file_helper_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFileHelper do
where(:case, :transformed_blocks, :result) do
'if transformed diff is empty' | [] | 0
'if the transformed line does not map to any in the original file' | [{ source_line: nil }] | 0
- 'if the transformed line maps to a line in the source file' | [{ source_line: 2 }] | 3
+ 'if the transformed line maps to a line in the source file' | [{ source_line: 3 }] | 3
end
with_them do
@@ -81,8 +81,8 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFileHelper do
let(:blocks) do
{
- from: [0, 2, 1, nil, nil, 3].map { |i| { source_line: i } },
- to: [0, 1, nil, 2, nil, 3].map { |i| { source_line: i } }
+ from: [1, 3, 2, nil, nil, 4].map { |i| { source_line: i } },
+ to: [1, 2, nil, 3, nil, 4].map { |i| { source_line: i } }
}
end
diff --git a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
index c38684a6dc3..b5137f9db6b 100644
--- a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
+++ b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
@@ -144,7 +144,7 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile do
context 'has image' do
it 'replaces rich text with img to the embedded image' do
- expect(nb_file.highlighted_diff_lines[58].rich_text).to include('<img')
+ expect(nb_file.highlighted_diff_lines[56].rich_text).to include('<img')
end
it 'adds image to src' do
@@ -159,11 +159,11 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile do
let(:commit) { project.commit("4963fefc990451a8ad34289ce266b757456fc88c") }
it 'prevents injected html to be rendered as html' do
- expect(nb_file.highlighted_diff_lines[45].rich_text).not_to include('<div>Hello')
+ expect(nb_file.highlighted_diff_lines[43].rich_text).not_to include('<div>Hello')
end
it 'keeps the injected html as part of the string' do
- expect(nb_file.highlighted_diff_lines[45].rich_text).to end_with('/div&gt;">')
+ expect(nb_file.highlighted_diff_lines[43].rich_text).to end_with('/div&gt;">')
end
end
end
diff --git a/spec/lib/gitlab/elasticsearch/logs/lines_spec.rb b/spec/lib/gitlab/elasticsearch/logs/lines_spec.rb
deleted file mode 100644
index f93c1aa1974..00000000000
--- a/spec/lib/gitlab/elasticsearch/logs/lines_spec.rb
+++ /dev/null
@@ -1,97 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Elasticsearch::Logs::Lines do
- let(:client) { Elasticsearch::Transport::Client }
-
- let(:es_message_1) { { timestamp: "2019-12-13T14:35:34.034Z", pod: "production-6866bc8974-m4sk4", message: "10.8.2.1 - - [25/Oct/2019:08:03:22 UTC] \"GET / HTTP/1.1\" 200 13" } }
- let(:es_message_2) { { timestamp: "2019-12-13T14:35:35.034Z", pod: "production-6866bc8974-m4sk4", message: "10.8.2.1 - - [27/Oct/2019:23:49:54 UTC] \"GET / HTTP/1.1\" 200 13" } }
- let(:es_message_3) { { timestamp: "2019-12-13T14:35:36.034Z", pod: "production-6866bc8974-m4sk4", message: "10.8.2.1 - - [04/Nov/2019:23:09:24 UTC] \"GET / HTTP/1.1\" 200 13" } }
- let(:es_message_4) { { timestamp: "2019-12-13T14:35:37.034Z", pod: "production-6866bc8974-m4sk4", message: "- -\u003e /" } }
-
- let(:es_response) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/logs_response.json')) }
-
- subject { described_class.new(client) }
-
- let(:namespace) { "autodevops-deploy-9-production" }
- let(:pod_name) { "production-6866bc8974-m4sk4" }
- let(:container_name) { "auto-deploy-app" }
- let(:search) { "foo +bar "}
- let(:start_time) { "2019-12-13T14:35:34.034Z" }
- let(:end_time) { "2019-12-13T14:35:34.034Z" }
- let(:cursor) { "9999934,1572449784442" }
-
- let(:body) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query.json')) }
- let(:body_with_container) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query_with_container.json')) }
- let(:body_with_search) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query_with_search.json')) }
- let(:body_with_times) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query_with_times.json')) }
- let(:body_with_start_time) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query_with_start_time.json')) }
- let(:body_with_end_time) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query_with_end_time.json')) }
- let(:body_with_cursor) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query_with_cursor.json')) }
- let(:body_with_filebeat_6) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/query_with_filebeat_6.json')) }
-
- RSpec::Matchers.define :a_hash_equal_to_json do |expected|
- match do |actual|
- actual.as_json == expected
- end
- end
-
- describe '#pod_logs' do
- it 'returns the logs as an array' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
-
- it 'can further filter the logs by container name' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body_with_container)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name, container_name: container_name)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
-
- it 'can further filter the logs by search' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body_with_search)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name, search: search)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
-
- it 'can further filter the logs by start_time and end_time' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body_with_times)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name, start_time: start_time, end_time: end_time)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
-
- it 'can further filter the logs by only start_time' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body_with_start_time)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name, start_time: start_time)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
-
- it 'can further filter the logs by only end_time' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body_with_end_time)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name, end_time: end_time)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
-
- it 'can search after a cursor' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body_with_cursor)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name, cursor: cursor)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
-
- it 'can search on filebeat 6' do
- expect(client).to receive(:search).with(body: a_hash_equal_to_json(body_with_filebeat_6)).and_return(es_response)
-
- result = subject.pod_logs(namespace, pod_name: pod_name, chart_above_v2: false)
- expect(result).to eq(logs: [es_message_4, es_message_3, es_message_2, es_message_1], cursor: cursor)
- end
- end
-end
diff --git a/spec/lib/gitlab/elasticsearch/logs/pods_spec.rb b/spec/lib/gitlab/elasticsearch/logs/pods_spec.rb
deleted file mode 100644
index 07fa0980d36..00000000000
--- a/spec/lib/gitlab/elasticsearch/logs/pods_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Elasticsearch::Logs::Pods do
- let(:client) { Elasticsearch::Transport::Client }
-
- let(:es_query) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/pods_query.json'), symbolize_names: true) }
- let(:es_response) { Gitlab::Json.parse(fixture_file('lib/elasticsearch/pods_response.json')) }
- let(:namespace) { "autodevops-deploy-9-production" }
-
- subject { described_class.new(client) }
-
- describe '#pods' do
- it 'returns the pods' do
- expect(client).to receive(:search).with(body: es_query).and_return(es_response)
-
- result = subject.pods(namespace)
- expect(result).to eq([
- {
- name: "runner-gitlab-runner-7bbfb5dcb5-p6smb",
- container_names: %w[runner-gitlab-runner]
- },
- {
- name: "elastic-stack-elasticsearch-master-1",
- container_names: %w[elasticsearch chown sysctl]
- },
- {
- name: "ingress-nginx-ingress-controller-76449bcc8d-8qgl6",
- container_names: %w[nginx-ingress-controller]
- }
- ])
- end
- end
-end
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 6e7806c5d53..d0aba70081b 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -52,14 +52,6 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
expect(new_issue.issue_email_participants.first.email).to eq(author_email)
end
- it 'attaches existing CRM contact' do
- contact = create(:contact, group: group, email: author_email)
- receiver.execute
- new_issue = Issue.last
-
- expect(new_issue.issue_customer_relations_contacts.last.contact).to eq(contact)
- end
-
it 'sends thank you email' do
expect { receiver.execute }.to have_enqueued_job.on_queue('mailers')
end
@@ -77,6 +69,16 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
context 'when everything is fine' do
it_behaves_like 'a new issue request'
+ it 'attaches existing CRM contacts' do
+ contact = create(:contact, group: group, email: author_email)
+ contact2 = create(:contact, group: group, email: "cc@example.com")
+ contact3 = create(:contact, group: group, email: "kk@example.org")
+ receiver.execute
+ new_issue = Issue.last
+
+ expect(new_issue.issue_customer_relations_contacts.map(&:contact)).to contain_exactly(contact, contact2, contact3)
+ end
+
context 'with legacy incoming email address' do
let(:email_raw) { fixture_file('emails/service_desk_legacy.eml') }
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
index dfa18c27d5e..ab6b1cd6171 100644
--- a/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
+++ b/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
@@ -99,7 +99,6 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Base do
:verify | true
:trial | true
:team | true
- :experience | true
end
with_them do
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb
deleted file mode 100644
index 8cd2345822e..00000000000
--- a/spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb
+++ /dev/null
@@ -1,115 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Email::Message::InProductMarketing::Experience do
- let_it_be(:group) { build(:group) }
- let_it_be(:user) { build(:user) }
-
- subject(:message) { described_class.new(group: group, user: user, series: series)}
-
- describe 'public methods' do
- context 'with series 0' do
- let(:series) { 0 }
-
- it 'returns value for series', :aggregate_failures do
- expect(message.subject_line).to be_present
- expect(message.tagline).to be_nil
- expect(message.title).to be_present
- expect(message.subtitle).to be_present
- expect(message.body_line1).to be_present
- expect(message.body_line2).to be_present
- expect(message.cta_text).to be_nil
- end
-
- describe 'feedback URL' do
- before do
- allow(message).to receive(:onboarding_progress).and_return(1)
- allow(message).to receive(:show_invite_link).and_return(true)
- end
-
- subject do
- message.feedback_link(1)
- end
-
- it { is_expected.to start_with(Gitlab::Saas.com_url) }
-
- context 'when in development' do
- let(:root_url) { 'http://example.com' }
-
- before do
- allow(message).to receive(:root_url).and_return(root_url)
- stub_rails_env('development')
- end
-
- it { is_expected.to start_with(root_url) }
- end
- end
-
- describe 'feedback URL show_invite_link query param' do
- let(:user_access) { GroupMember::DEVELOPER }
- let(:preferred_language) { 'en' }
-
- before do
- allow(message).to receive(:onboarding_progress).and_return(1)
- allow(group).to receive(:max_member_access_for_user).and_return(user_access)
- allow(user).to receive(:preferred_language).and_return(preferred_language)
- end
-
- subject do
- uri = URI.parse(message.feedback_link(1))
- Rack::Utils.parse_query(uri.query).with_indifferent_access[:show_invite_link]
- end
-
- it { is_expected.to eq('true') }
-
- context 'with less than developer access' do
- let(:user_access) { GroupMember::GUEST }
-
- it { is_expected.to eq('false') }
- end
-
- context 'with preferred language other than English' do
- let(:preferred_language) { 'nl' }
-
- it { is_expected.to eq('false') }
- end
- end
-
- describe 'feedback URL show_incentive query param' do
- let(:show_invite_link) { true }
- let(:member_count) { 2 }
- let(:query) do
- uri = URI.parse(message.feedback_link(1))
- Rack::Utils.parse_query(uri.query).with_indifferent_access
- end
-
- before do
- allow(message).to receive(:onboarding_progress).and_return(1)
- allow(message).to receive(:show_invite_link).and_return(show_invite_link)
- allow(group).to receive(:member_count).and_return(member_count)
- end
-
- subject { query[:show_incentive] }
-
- it { is_expected.to eq('true') }
-
- context 'with only one member' do
- let(:member_count) { 1 }
-
- it "is not present" do
- expect(query).not_to have_key(:show_incentive)
- end
- end
-
- context 'show_invite_link is false' do
- let(:show_invite_link) { false }
-
- it "is not present" do
- expect(query).not_to have_key(:show_incentive)
- end
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/email/message/in_product_marketing_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
index 40351bef8b9..1c59d9c8208 100644
--- a/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
+++ b/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
@@ -17,7 +17,6 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing do
:verify | described_class::Verify
:trial | described_class::Trial
:team | described_class::Team
- :experience | described_class::Experience
end
with_them do
diff --git a/spec/lib/gitlab/encoding_helper_spec.rb b/spec/lib/gitlab/encoding_helper_spec.rb
index 4c1fbb93c13..b0c67cdafe1 100644
--- a/spec/lib/gitlab/encoding_helper_spec.rb
+++ b/spec/lib/gitlab/encoding_helper_spec.rb
@@ -45,16 +45,26 @@ RSpec.describe Gitlab::EncodingHelper do
end
context 'with corrupted diff' do
+ let(:project) { create(:project, :empty_repo) }
+ let(:repository) { project.repository }
+ let(:content) { fixture_file('encoding/Japanese.md') }
let(:corrupted_diff) do
- with_empty_bare_repository do |repo|
- content = File.read(Rails.root.join(
- 'spec/fixtures/encoding/Japanese.md').to_s)
- commit_a = commit(repo, 'Japanese.md', content)
- commit_b = commit(repo, 'Japanese.md',
- content.sub('[TODO: Link]', '[ç¾åœ¨ä½œæ¥­ä¸­ã§ã™: Link]'))
-
- repo.diff(commit_a, commit_b).each_line.map(&:content).join
- end
+ commit_a = repository.create_file(
+ project.creator,
+ 'Japanese.md',
+ content,
+ branch_name: 'HEAD',
+ message: 'Create Japanese.md'
+ )
+ commit_b = repository.update_file(
+ project.creator,
+ 'Japanese.md',
+ content.sub('[TODO: Link]', '[ç¾åœ¨ä½œæ¥­ä¸­ã§ã™: Link]'),
+ branch_name: 'HEAD',
+ message: 'Update Japanese.md'
+ )
+
+ repository.diff(commit_a, commit_b).map(&:diff).join
end
let(:cleaned_diff) do
@@ -69,26 +79,6 @@ RSpec.describe Gitlab::EncodingHelper do
it 'does not corrupt data but remove invalid characters' do
expect(encoded_diff).to eq(cleaned_diff)
end
-
- def commit(repo, path, content)
- oid = repo.write(content, :blob)
- index = repo.index
-
- index.read_tree(repo.head.target.tree) unless repo.empty?
-
- index.add(path: path, oid: oid, mode: 0100644)
- user = { name: 'Test', email: 'test@example.com' }
-
- Rugged::Commit.create(
- repo,
- tree: index.write_tree(repo),
- author: user,
- committer: user,
- message: "Update #{path}",
- parents: repo.empty? ? [] : [repo.head.target].compact,
- update_ref: 'HEAD'
- )
- end
end
end
diff --git a/spec/lib/gitlab/error_tracking/error_repository/open_api_strategy_spec.rb b/spec/lib/gitlab/error_tracking/error_repository/open_api_strategy_spec.rb
new file mode 100644
index 00000000000..81e2a410962
--- /dev/null
+++ b/spec/lib/gitlab/error_tracking/error_repository/open_api_strategy_spec.rb
@@ -0,0 +1,436 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::ErrorTracking::ErrorRepository::OpenApiStrategy do
+ include AfterNextHelpers
+
+ let(:project) { build_stubbed(:project) }
+ let(:api_exception) { ErrorTrackingOpenAPI::ApiError.new(code: 500, response_body: 'b' * 101) }
+
+ subject(:repository) { Gitlab::ErrorTracking::ErrorRepository.build(project) }
+
+ before do
+ # Disabled in spec_helper by default thus we need to enable it here.
+ stub_feature_flags(use_click_house_database_for_error_tracking: true)
+ end
+
+ shared_examples 'exception logging' do
+ it 'logs error' do
+ expect(Gitlab::AppLogger).to receive(:error).with({
+ 'open_api.http_code' => api_exception.code,
+ 'open_api.response_body' => api_exception.response_body.truncate(100)
+ })
+
+ subject
+ end
+ end
+
+ shared_examples 'no logging' do
+ it 'does not log anything' do
+ expect(Gitlab::AppLogger).not_to receive(:debug)
+ expect(Gitlab::AppLogger).not_to receive(:info)
+ expect(Gitlab::AppLogger).not_to receive(:error)
+ end
+ end
+
+ describe '#report_error' do
+ let(:params) do
+ {
+ name: 'anything',
+ description: 'anything',
+ actor: 'anything',
+ platform: 'anything',
+ environment: 'anything',
+ level: 'anything',
+ occurred_at: Time.zone.now,
+ payload: {}
+ }
+ end
+
+ subject { repository.report_error(**params) }
+
+ it 'is not implemented' do
+ expect { subject }.to raise_error(NotImplementedError, 'Use ingestion endpoint')
+ end
+ end
+
+ describe '#find_error' do
+ let(:error) { build(:error_tracking_open_api_error, project_id: project.id) }
+
+ subject { repository.find_error(error.fingerprint) }
+
+ before do
+ allow_next_instance_of(ErrorTrackingOpenAPI::ErrorsApi) do |open_api|
+ allow(open_api).to receive(:get_error).with(project.id, error.fingerprint)
+ .and_return(error)
+
+ allow(open_api).to receive(:list_events)
+ .with(project.id, error.fingerprint, { sort: 'occurred_at_asc', limit: 1 })
+ .and_return(list_events_asc)
+
+ allow(open_api).to receive(:list_events)
+ .with(project.id, error.fingerprint, { sort: 'occurred_at_desc', limit: 1 })
+ .and_return(list_events_desc)
+ end
+ end
+
+ context 'when request succeeds' do
+ context 'without events returned' do
+ let(:list_events_asc) { [] }
+ let(:list_events_desc) { [] }
+
+ include_examples 'no logging'
+
+ it 'returns detailed error' do
+ is_expected.to have_attributes(
+ id: error.fingerprint.to_s,
+ title: error.name,
+ message: error.description,
+ culprit: error.actor,
+ first_seen: error.first_seen_at.to_s,
+ last_seen: error.last_seen_at.to_s,
+ count: error.event_count,
+ user_count: error.approximated_user_count,
+ project_id: error.project_id,
+ status: error.status,
+ tags: { level: nil, logger: nil },
+ external_url: "http://localhost/#{project.full_path}/-/error_tracking/#{error.fingerprint}/details",
+ external_base_url: "http://localhost/#{project.full_path}",
+ integrated: true
+ )
+ end
+
+ it 'returns no first and last release version' do
+ is_expected.to have_attributes(
+ first_release_version: nil,
+ last_release_version: nil
+ )
+ end
+ end
+
+ context 'with events returned' do
+ let(:first_event) { build(:error_tracking_open_api_error_event, project_id: project.id) }
+ let(:first_release) { parse_json(first_event.payload).fetch('release') }
+ let(:last_event) { build(:error_tracking_open_api_error_event, :golang, project_id: project.id) }
+ let(:last_release) { parse_json(last_event.payload).fetch('release') }
+
+ let(:list_events_asc) { [first_event] }
+ let(:list_events_desc) { [last_event] }
+
+ include_examples 'no logging'
+
+ it 'returns first and last release version' do
+ expect(first_release).to be_present
+ expect(last_release).to be_present
+
+ is_expected.to have_attributes(
+ first_release_version: first_release,
+ last_release_version: last_release
+ )
+ end
+
+ def parse_json(content)
+ Gitlab::Json.parse(content)
+ end
+ end
+ end
+
+ context 'when request fails' do
+ before do
+ allow_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:get_error)
+ .with(project.id, error.fingerprint)
+ .and_raise(api_exception)
+ end
+
+ include_examples 'exception logging'
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ describe '#list_errors' do
+ let(:errors) { [] }
+ let(:response_with_info) { [errors, 200, headers] }
+ let(:result_errors) { result.first }
+ let(:result_pagination) { result.last }
+
+ let(:headers) do
+ {
+ 'link' => [
+ '<url?cursor=next_cursor&param>; rel="next"',
+ '<url?cursor=prev_cursor&param>; rel="prev"'
+ ].join(', ')
+ }
+ end
+
+ subject(:result) { repository.list_errors(**params) }
+
+ before do
+ allow_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:list_errors_with_http_info)
+ .with(project.id, kind_of(Hash))
+ .and_return(response_with_info)
+ end
+
+ context 'with errors' do
+ let(:limit) { 3 }
+ let(:params) { { limit: limit } }
+ let(:errors_size) { limit }
+ let(:errors) { build_list(:error_tracking_open_api_error, errors_size, project_id: project.id) }
+
+ include_examples 'no logging'
+
+ it 'maps errors to models' do
+ # All errors are identical
+ error = errors.first
+
+ expect(result_errors).to all(
+ have_attributes(
+ id: error.fingerprint.to_s,
+ title: error.name,
+ message: error.description,
+ culprit: error.actor,
+ first_seen: error.first_seen_at,
+ last_seen: error.last_seen_at,
+ status: error.status,
+ count: error.event_count,
+ user_count: error.approximated_user_count
+ ))
+ end
+
+ context 'when n errors are returned' do
+ let(:errors_size) { limit }
+
+ include_examples 'no logging'
+
+ it 'returns the amount of errors' do
+ expect(result_errors.size).to eq(3)
+ end
+
+ it 'cursor links are preserved' do
+ expect(result_pagination).to have_attributes(
+ prev: 'prev_cursor',
+ next: 'next_cursor'
+ )
+ end
+ end
+
+ context 'when less errors than requested are returned' do
+ let(:errors_size) { limit - 1 }
+
+ include_examples 'no logging'
+
+ it 'returns the amount of errors' do
+ expect(result_errors.size).to eq(2)
+ end
+
+ it 'cursor link for next is removed' do
+ expect(result_pagination).to have_attributes(
+ prev: 'prev_cursor',
+ next: nil
+ )
+ end
+ end
+ end
+
+ context 'with params' do
+ let(:params) do
+ {
+ filters: { status: 'resolved', something: 'different' },
+ query: 'search term',
+ sort: 'first_seen',
+ limit: 2,
+ cursor: 'abc'
+ }
+ end
+
+ include_examples 'no logging'
+
+ it 'passes provided params to client' do
+ passed_params = {
+ sort: 'first_seen_desc',
+ status: 'resolved',
+ query: 'search term',
+ cursor: 'abc',
+ limit: 2
+ }
+
+ expect_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:list_errors_with_http_info)
+ .with(project.id, passed_params)
+ .and_return(response_with_info)
+
+ subject
+ end
+ end
+
+ context 'without explicit params' do
+ let(:params) { {} }
+
+ include_examples 'no logging'
+
+ it 'passes default params to client' do
+ passed_params = {
+ sort: 'last_seen_desc',
+ limit: 20,
+ cursor: {}
+ }
+
+ expect_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:list_errors_with_http_info)
+ .with(project.id, passed_params)
+ .and_return(response_with_info)
+
+ subject
+ end
+ end
+
+ context 'when request fails' do
+ let(:params) { {} }
+
+ before do
+ allow_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:list_errors_with_http_info)
+ .with(project.id, kind_of(Hash))
+ .and_raise(api_exception)
+ end
+
+ include_examples 'exception logging'
+
+ specify do
+ expect(result_errors).to eq([])
+ expect(result_pagination).to have_attributes(
+ next: nil,
+ prev: nil
+ )
+ end
+ end
+ end
+
+ describe '#last_event_for' do
+ let(:params) { { sort: 'occurred_at_desc', limit: 1 } }
+ let(:event) { build(:error_tracking_open_api_error_event, project_id: project.id) }
+ let(:error) { build(:error_tracking_open_api_error, project_id: project.id, fingerprint: event.fingerprint) }
+
+ subject { repository.last_event_for(error.fingerprint) }
+
+ context 'when both event and error is returned' do
+ before do
+ allow_next_instance_of(ErrorTrackingOpenAPI::ErrorsApi) do |open_api|
+ allow(open_api).to receive(:list_events).with(project.id, error.fingerprint, params)
+ .and_return([event])
+
+ allow(open_api).to receive(:get_error).with(project.id, error.fingerprint)
+ .and_return(error)
+ end
+ end
+
+ include_examples 'no logging'
+
+ it 'returns mapped error event' do
+ is_expected.to have_attributes(
+ issue_id: event.fingerprint.to_s,
+ date_received: error.last_seen_at,
+ stack_trace_entries: kind_of(Array)
+ )
+ end
+ end
+
+ context 'when event is not returned' do
+ before do
+ allow_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:list_events)
+ .with(project.id, event.fingerprint, params)
+ .and_return([])
+ end
+
+ include_examples 'no logging'
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when list_events request fails' do
+ before do
+ allow_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:list_events)
+ .with(project.id, event.fingerprint, params)
+ .and_raise(api_exception)
+ end
+
+ include_examples 'exception logging'
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when error is not returned' do
+ before do
+ allow_next_instance_of(ErrorTrackingOpenAPI::ErrorsApi) do |open_api|
+ allow(open_api).to receive(:list_events).with(project.id, error.fingerprint, params)
+ .and_return([event])
+
+ allow(open_api).to receive(:get_error).with(project.id, error.fingerprint)
+ .and_return(nil)
+ end
+ end
+
+ include_examples 'no logging'
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when get_error request fails' do
+ before do
+ allow_next_instance_of(ErrorTrackingOpenAPI::ErrorsApi) do |open_api|
+ allow(open_api).to receive(:list_events).with(project.id, error.fingerprint, params)
+ .and_return([event])
+
+ allow(open_api).to receive(:get_error).with(project.id, error.fingerprint)
+ .and_raise(api_exception)
+ end
+ end
+
+ include_examples 'exception logging'
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ describe '#update_error' do
+ let(:error) { build(:error_tracking_open_api_error, project_id: project.id) }
+ let(:update_params) { { status: 'resolved' } }
+ let(:passed_body) { ErrorTrackingOpenAPI::ErrorUpdatePayload.new(update_params) }
+
+ subject { repository.update_error(error.fingerprint, **update_params) }
+
+ before do
+ allow_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:update_error)
+ .with(project.id, error.fingerprint, passed_body)
+ .and_return(:anything)
+ end
+
+ context 'when update succeeds' do
+ include_examples 'no logging'
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when update fails' do
+ before do
+ allow_next(ErrorTrackingOpenAPI::ErrorsApi).to receive(:update_error)
+ .with(project.id, error.fingerprint, passed_body)
+ .and_raise(api_exception)
+ end
+
+ include_examples 'exception logging'
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ describe '#dsn_url' do
+ let(:public_key) { 'abc' }
+ let(:config) { ErrorTrackingOpenAPI::Configuration.default }
+
+ subject { repository.dsn_url(public_key) }
+
+ it do
+ is_expected
+ .to eq("#{config.scheme}://#{public_key}@#{config.host}/errortracking/api/v1/projects/api/#{project.id}")
+ end
+ end
+end
diff --git a/spec/lib/gitlab/error_tracking/processor/sanitizer_processor_spec.rb b/spec/lib/gitlab/error_tracking/processor/sanitizer_processor_spec.rb
new file mode 100644
index 00000000000..9673bfc5cd3
--- /dev/null
+++ b/spec/lib/gitlab/error_tracking/processor/sanitizer_processor_spec.rb
@@ -0,0 +1,114 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::ErrorTracking::Processor::SanitizerProcessor, :sentry do
+ describe '.call' do
+ let(:event) { Sentry.get_current_client.event_from_exception(exception) }
+ let(:result_hash) { described_class.call(event).to_hash }
+
+ before do
+ data.each do |key, value|
+ event.send("#{key}=", value)
+ end
+ end
+
+ after do
+ Sentry.get_current_scope.clear
+ end
+
+ context 'when event attributes contains sensitive information' do
+ let(:exception) { RuntimeError.new }
+ let(:data) do
+ {
+ contexts: {
+ jwt: 'abcdef',
+ controller: 'GraphController#execute'
+ },
+ tags: {
+ variables: %w[some sensitive information'],
+ deep_hash: {
+ sharedSecret: 'secret123'
+ }
+ },
+ user: {
+ email: 'a@a.com',
+ password: 'nobodyknows'
+ },
+ extra: {
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/-/issues/1',
+ my_token: '[FILTERED]',
+ another_token: '[FILTERED]'
+ }
+ }
+ end
+
+ it 'filters sensitive attributes' do
+ expect_next_instance_of(ActiveSupport::ParameterFilter) do |instance|
+ expect(instance).to receive(:filter).exactly(4).times.and_call_original
+ end
+
+ expect(result_hash).to include(
+ contexts: {
+ jwt: '[FILTERED]',
+ controller: 'GraphController#execute'
+ },
+ tags: {
+ variables: '[FILTERED]',
+ deep_hash: {
+ sharedSecret: '[FILTERED]'
+ }
+ },
+ user: {
+ email: 'a@a.com',
+ password: '[FILTERED]'
+ },
+ extra: {
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/-/issues/1',
+ my_token: '[FILTERED]',
+ another_token: '[FILTERED]'
+ }
+ )
+ end
+ end
+
+ context 'when request contains sensitive information' do
+ let(:exception) { RuntimeError.new }
+ let(:data) { {} }
+
+ before do
+ event.rack_env = {
+ 'HTTP_AUTHORIZATION' => 'Bearer 123456',
+ 'HTTP_PRIVATE_TOKEN' => 'abcdef',
+ 'HTTP_JOB_TOKEN' => 'secret123',
+ 'HTTP_GITLAB_WORKHORSE_PROXY_START' => 123456,
+ 'HTTP_COOKIE' => 'yummy_cookie=choco; tasty_cookie=strawberry',
+ 'QUERY_STRING' => 'token=secret&access_token=secret&job_token=secret&private_token=secret',
+ 'Content-Type' => 'application/json',
+ 'rack.input' => StringIO.new('{"name":"new_project", "some_token":"value"}')
+ }
+ end
+
+ it 'filters sensitive headers' do
+ expect(result_hash[:request][:headers]).to include(
+ 'Authorization' => '[FILTERED]',
+ 'Private-Token' => '[FILTERED]',
+ 'Job-Token' => '[FILTERED]',
+ 'Gitlab-Workhorse-Proxy-Start' => '123456'
+ )
+ end
+
+ it 'filters query string parameters' do
+ expect(result_hash[:request][:query_string]).not_to include('secret')
+ end
+
+ it 'removes cookies' do
+ expect(result_hash[:request][:cookies]).to be_empty
+ end
+
+ it 'removes data' do
+ expect(result_hash[:request][:data]).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/error_tracking_spec.rb b/spec/lib/gitlab/error_tracking_spec.rb
index 1ade3a51c55..fd859ae40fb 100644
--- a/spec/lib/gitlab/error_tracking_spec.rb
+++ b/spec/lib/gitlab/error_tracking_spec.rb
@@ -424,5 +424,25 @@ RSpec.describe Gitlab::ErrorTracking do
end
end
end
+
+ context 'when request contains sensitive information' do
+ before do
+ Sentry.get_current_scope.set_rack_env({
+ 'HTTP_AUTHORIZATION' => 'Bearer 123456',
+ 'HTTP_PRIVATE_TOKEN' => 'abcdef',
+ 'HTTP_JOB_TOKEN' => 'secret123'
+ })
+ end
+
+ it 'filters sensitive data' do
+ track_exception
+
+ expect(sentry_event.to_hash[:request][:headers]).to include(
+ 'Authorization' => '[FILTERED]',
+ 'Private-Token' => '[FILTERED]',
+ 'Job-Token' => '[FILTERED]'
+ )
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb b/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
index 96cd70b4ff1..a5115989e6b 100644
--- a/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
+++ b/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Git::AttributesAtRefParser, :seed_helper do
+RSpec.describe Gitlab::Git::AttributesAtRefParser do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
diff --git a/spec/lib/gitlab/git/attributes_parser_spec.rb b/spec/lib/gitlab/git/attributes_parser_spec.rb
index 4bc39921e85..295d62fa052 100644
--- a/spec/lib/gitlab/git/attributes_parser_spec.rb
+++ b/spec/lib/gitlab/git/attributes_parser_spec.rb
@@ -2,9 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::Git::AttributesParser, :seed_helper do
- let(:attributes_path) { File.join(SEED_STORAGE_PATH, 'with-git-attributes.git', 'info', 'attributes') }
- let(:data) { File.read(attributes_path) }
+RSpec.describe Gitlab::Git::AttributesParser do
+ let(:data) { fixture_file('gitlab/git/gitattributes') }
subject { described_class.new(data) }
@@ -141,11 +140,12 @@ RSpec.describe Gitlab::Git::AttributesParser, :seed_helper do
expect { |b| subject.each_line(&b) }.to yield_successive_args(*args)
end
- it 'does not yield when the attributes file has an unsupported encoding' do
- path = File.join(SEED_STORAGE_PATH, 'with-invalid-git-attributes.git', 'info', 'attributes')
- attrs = described_class.new(File.read(path))
+ context 'unsupported encoding' do
+ let(:data) { fixture_file('gitlab/git/gitattributes_invalid') }
- expect { |b| attrs.each_line(&b) }.not_to yield_control
+ it 'does not yield' do
+ expect { |b| subject.each_line(&b) }.not_to yield_control
+ end
end
end
end
diff --git a/spec/lib/gitlab/git/blame_spec.rb b/spec/lib/gitlab/git/blame_spec.rb
index 7dd7460b142..e514e128785 100644
--- a/spec/lib/gitlab/git/blame_spec.rb
+++ b/spec/lib/gitlab/git/blame_spec.rb
@@ -2,10 +2,10 @@
require "spec_helper"
-RSpec.describe Gitlab::Git::Blame, :seed_helper do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
-
- let(:sha) { SeedRepo::Commit::ID }
+RSpec.describe Gitlab::Git::Blame do
+ let(:project) { create(:project, :repository) }
+ let(:repository) { project.repository.raw }
+ let(:sha) { TestEnv::BRANCH_SHA['master'] }
let(:path) { 'CONTRIBUTING.md' }
let(:range) { nil }
@@ -37,19 +37,17 @@ RSpec.describe Gitlab::Git::Blame, :seed_helper do
end
context "ISO-8859 encoding" do
- let(:sha) { SeedRepo::EncodingCommit::ID }
let(:path) { 'encoding/iso8859.txt' }
it 'converts to UTF-8' do
expect(result.size).to eq(1)
expect(result.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
- expect(result.first[:line]).to eq("Ä ü")
+ expect(result.first[:line]).to eq("Äü")
expect(result.first[:line]).to be_utf8
end
end
context "unknown encoding" do
- let(:sha) { SeedRepo::EncodingCommit::ID }
let(:path) { 'encoding/iso8859.txt' }
it 'converts to UTF-8' do
@@ -59,14 +57,12 @@ RSpec.describe Gitlab::Git::Blame, :seed_helper do
expect(result.size).to eq(1)
expect(result.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
- expect(result.first[:line]).to eq(" ")
+ expect(result.first[:line]).to eq("")
expect(result.first[:line]).to be_utf8
end
end
context "renamed file" do
- let(:project) { create(:project, :repository) }
- let(:repository) { project.repository.raw_repository }
let(:commit) { project.commit('blame-on-renamed') }
let(:sha) { commit.id }
let(:path) { 'files/plain_text/renamed' }
diff --git a/spec/lib/gitlab/git/branch_spec.rb b/spec/lib/gitlab/git/branch_spec.rb
index 3cc52863976..97cd4777b4d 100644
--- a/spec/lib/gitlab/git/branch_spec.rb
+++ b/spec/lib/gitlab/git/branch_spec.rb
@@ -4,9 +4,6 @@ require "spec_helper"
RSpec.describe Gitlab::Git::Branch, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
- let(:rugged) do
- Rugged::Repository.new(File.join(TestEnv.repos_path, repository.relative_path))
- end
subject { repository.branches }
@@ -81,20 +78,6 @@ RSpec.describe Gitlab::Git::Branch, :seed_helper do
end
let(:user) { create(:user) }
- let(:committer) { { email: user.email, name: user.name } }
- let(:params) do
- parents = [rugged.head.target]
- tree = parents.first.tree
-
- {
- message: +'commit message',
- author: committer,
- committer: committer,
- tree: tree,
- parents: parents
- }
- end
-
let(:stale_sha) { travel_to(Gitlab::Git::Branch::STALE_BRANCH_THRESHOLD.ago - 5.days) { create_commit } }
let(:active_sha) { travel_to(Gitlab::Git::Branch::STALE_BRANCH_THRESHOLD.ago + 5.days) { create_commit } }
let(:future_sha) { travel_to(100.days.since) { create_commit } }
@@ -137,7 +120,11 @@ RSpec.describe Gitlab::Git::Branch, :seed_helper do
it { expect(repository.branches.size).to eq(SeedRepo::Repo::BRANCHES.size) }
def create_commit
- params[:message].delete!(+"\r")
- Rugged::Commit.create(rugged, params.merge(committer: committer.merge(time: Time.now)))
+ repository.multi_action(
+ user,
+ branch_name: 'HEAD',
+ message: 'commit message',
+ actions: []
+ ).newrev
end
end
diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb
index de342444c15..da77d8ee5d6 100644
--- a/spec/lib/gitlab/git/commit_spec.rb
+++ b/spec/lib/gitlab/git/commit_spec.rb
@@ -3,68 +3,8 @@
require "spec_helper"
RSpec.describe Gitlab::Git::Commit, :seed_helper do
- include GitHelpers
-
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
- let(:rugged_repo) do
- Rugged::Repository.new(File.join(TestEnv.repos_path, TEST_REPO_PATH))
- end
-
let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) }
- let(:rugged_commit) { rugged_repo.lookup(SeedRepo::Commit::ID) }
-
- describe "Commit info" do
- before do
- @committer = {
- email: 'mike@smith.com',
- name: "Mike Smith",
- time: Time.new(2000, 1, 1, 0, 0, 0, "+08:00")
- }
-
- @author = {
- email: 'john@smith.com',
- name: "John Smith",
- time: Time.new(2000, 1, 1, 0, 0, 0, "-08:00")
- }
-
- @parents = [rugged_repo.head.target]
- @gitlab_parents = @parents.map { |c| described_class.find(repository, c.oid) }
- @tree = @parents.first.tree
-
- sha = Rugged::Commit.create(
- rugged_repo,
- author: @author,
- committer: @committer,
- tree: @tree,
- parents: @parents,
- message: "Refactoring specs",
- update_ref: "HEAD"
- )
-
- @raw_commit = rugged_repo.lookup(sha)
- @commit = described_class.find(repository, sha)
- end
-
- it { expect(@commit.short_id).to eq(@raw_commit.oid[0..10]) }
- it { expect(@commit.id).to eq(@raw_commit.oid) }
- it { expect(@commit.sha).to eq(@raw_commit.oid) }
- it { expect(@commit.safe_message).to eq(@raw_commit.message) }
- it { expect(@commit.created_at).to eq(@raw_commit.committer[:time]) }
- it { expect(@commit.date).to eq(@raw_commit.committer[:time]) }
- it { expect(@commit.author_email).to eq(@author[:email]) }
- it { expect(@commit.author_name).to eq(@author[:name]) }
- it { expect(@commit.committer_name).to eq(@committer[:name]) }
- it { expect(@commit.committer_email).to eq(@committer[:email]) }
- it { expect(@commit.different_committer?).to be_truthy }
- it { expect(@commit.parents).to eq(@gitlab_parents) }
- it { expect(@commit.parent_id).to eq(@parents.first.oid) }
- it { expect(@commit.no_commit_message).to eq("No commit message") }
-
- after do
- # Erase the new commit so other tests get the original repo
- rugged_repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
- end
- end
describe "Commit info from gitaly commit" do
let(:subject) { (+"My commit").force_encoding('ASCII-8BIT') }
@@ -132,7 +72,7 @@ RSpec.describe Gitlab::Git::Commit, :seed_helper do
shared_examples '.find' do
it "returns first head commit if without params" do
expect(described_class.last(repository).id).to eq(
- rugged_repo.head.target.oid
+ repository.commit.sha
)
end
@@ -622,19 +562,6 @@ RSpec.describe Gitlab::Git::Commit, :seed_helper do
end
end
- skip 'move this test to gitaly-ruby' do
- RSpec.describe '#init_from_rugged' do
- let(:gitlab_commit) { described_class.new(repository, rugged_commit) }
-
- subject { gitlab_commit }
-
- describe '#id' do
- subject { super().id }
- it { is_expected.to eq(SeedRepo::Commit::ID) }
- end
- end
- end
-
describe '#init_from_hash' do
let(:commit) { described_class.new(repository, sample_commit_hash) }
diff --git a/spec/lib/gitlab/git/conflict/parser_spec.rb b/spec/lib/gitlab/git/conflict/parser_spec.rb
index 02b00f711b4..7d81af92412 100644
--- a/spec/lib/gitlab/git/conflict/parser_spec.rb
+++ b/spec/lib/gitlab/git/conflict/parser_spec.rb
@@ -86,43 +86,68 @@ RSpec.describe Gitlab::Git::Conflict::Parser do
CONFLICT
end
- let(:lines) do
- described_class.parse(text, our_path: 'files/ruby/regex.rb', their_path: 'files/ruby/regex.rb')
- end
+ shared_examples_for 'successful parsing' do
+ let(:lines) do
+ described_class.parse(content, our_path: 'files/ruby/regex.rb', their_path: 'files/ruby/regex.rb')
+ end
- let(:old_line_numbers) do
- lines.select { |line| line[:type] != 'new' }.map { |line| line[:line_old] }
- end
+ let(:old_line_numbers) do
+ lines.select { |line| line[:type] != 'new' }.map { |line| line[:line_old] }
+ end
- let(:new_line_numbers) do
- lines.select { |line| line[:type] != 'old' }.map { |line| line[:line_new] }
- end
+ let(:new_line_numbers) do
+ lines.select { |line| line[:type] != 'old' }.map { |line| line[:line_new] }
+ end
+
+ let(:line_indexes) { lines.map { |line| line[:line_obj_index] } }
- let(:line_indexes) { lines.map { |line| line[:line_obj_index] } }
+ it 'sets our lines as new lines' do
+ expect(lines[8..13]).to all(include(type: 'new'))
+ expect(lines[26..27]).to all(include(type: 'new'))
+ expect(lines[56..57]).to all(include(type: 'new'))
+ end
- it 'sets our lines as new lines' do
- expect(lines[8..13]).to all(include(type: 'new'))
- expect(lines[26..27]).to all(include(type: 'new'))
- expect(lines[56..57]).to all(include(type: 'new'))
+ it 'sets their lines as old lines' do
+ expect(lines[14..19]).to all(include(type: 'old'))
+ expect(lines[28..29]).to all(include(type: 'old'))
+ expect(lines[58..59]).to all(include(type: 'old'))
+ end
+
+ it 'sets non-conflicted lines as both' do
+ expect(lines[0..7]).to all(include(type: nil))
+ expect(lines[20..25]).to all(include(type: nil))
+ expect(lines[30..55]).to all(include(type: nil))
+ expect(lines[60..62]).to all(include(type: nil))
+ end
+
+ it 'sets consecutive line numbers for line_obj_index, line_old, and line_new' do
+ expect(line_indexes).to eq(0.upto(62).to_a)
+ expect(old_line_numbers).to eq(1.upto(53).to_a)
+ expect(new_line_numbers).to eq(1.upto(53).to_a)
+ end
end
- it 'sets their lines as old lines' do
- expect(lines[14..19]).to all(include(type: 'old'))
- expect(lines[28..29]).to all(include(type: 'old'))
- expect(lines[58..59]).to all(include(type: 'old'))
+ context 'content has LF endings' do
+ let(:content) { text }
+
+ it_behaves_like 'successful parsing'
end
- it 'sets non-conflicted lines as both' do
- expect(lines[0..7]).to all(include(type: nil))
- expect(lines[20..25]).to all(include(type: nil))
- expect(lines[30..55]).to all(include(type: nil))
- expect(lines[60..62]).to all(include(type: nil))
+ context 'content has CRLF endings' do
+ let(:content) { text.gsub("\n", "\r\n") }
+
+ it_behaves_like 'successful parsing'
end
- it 'sets consecutive line numbers for line_obj_index, line_old, and line_new' do
- expect(line_indexes).to eq(0.upto(62).to_a)
- expect(old_line_numbers).to eq(1.upto(53).to_a)
- expect(new_line_numbers).to eq(1.upto(53).to_a)
+ context 'content has mixed LF and CRLF endings' do
+ # Simulate mixed line endings by only changing some of the lines to CRLF
+ let(:content) do
+ text.each_line.map.with_index do |line, index|
+ index.odd? ? line.gsub("\n", "\r\n") : line
+ end.join
+ end
+
+ it_behaves_like 'successful parsing'
end
end
diff --git a/spec/lib/gitlab/git/object_pool_spec.rb b/spec/lib/gitlab/git/object_pool_spec.rb
index 91960ebbede..3b1eb0319f8 100644
--- a/spec/lib/gitlab/git/object_pool_spec.rb
+++ b/spec/lib/gitlab/git/object_pool_spec.rb
@@ -3,8 +3,6 @@
require 'spec_helper'
RSpec.describe Gitlab::Git::ObjectPool do
- include RepoHelpers
-
let(:pool_repository) { create(:pool_repository) }
let(:source_repository) { pool_repository.source_project.repository }
@@ -80,8 +78,6 @@ RSpec.describe Gitlab::Git::ObjectPool do
end
describe '#fetch' do
- let(:source_repository_path) { File.join(TestEnv.repos_path, source_repository.relative_path) }
- let(:source_repository_rugged) { Rugged::Repository.new(source_repository_path) }
let(:commit_count) { source_repository.commit_count }
context "when the object's pool repository exists" do
@@ -106,7 +102,13 @@ RSpec.describe Gitlab::Git::ObjectPool do
end
it 'fetches objects from the source repository' do
- new_commit_id = new_commit_edit_old_file(source_repository_rugged).oid
+ new_commit_id = source_repository.create_file(
+ pool_repository.source_project.owner,
+ 'a.file',
+ 'This is a file',
+ branch_name: source_repository.root_ref,
+ message: 'Add a file'
+ )
expect(subject.repository.exists?).to be false
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 47688c4b3e6..e20d5b928c4 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -352,12 +352,30 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
repository.create_branch('left-branch')
repository.create_branch('right-branch')
- left.times do
- new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'left-branch', 'some more content for a', 'some stuff')
+ left.times do |i|
+ repository.multi_action(
+ user,
+ branch_name: 'left-branch',
+ message: 'some more content for a',
+ actions: [{
+ action: i == 0 ? :create : :update,
+ file_path: 'encoding/CHANGELOG',
+ content: 'some stuff'
+ }]
+ )
end
- right.times do
- new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'right-branch', 'some more content for b', 'some stuff')
+ right.times do |i|
+ repository.multi_action(
+ user,
+ branch_name: 'right-branch',
+ message: 'some more content for b',
+ actions: [{
+ action: i == 0 ? :create : :update,
+ file_path: 'encoding/CHANGELOG',
+ content: 'some stuff'
+ }]
+ )
end
end
@@ -367,8 +385,8 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
it 'returns the correct count bounding at max_count' do
- branch_a_sha = repository_rugged.branches['left-branch'].target.oid
- branch_b_sha = repository_rugged.branches['right-branch'].target.oid
+ branch_a_sha = repository.find_branch('left-branch').dereferenced_target.sha
+ branch_b_sha = repository.find_branch('right-branch').dereferenced_target.sha
count = repository.diverging_commit_count(branch_a_sha, branch_b_sha, max_count: 1000)
@@ -392,12 +410,30 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
repository.create_branch('left-branch')
repository.create_branch('right-branch')
- left.times do
- new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'left-branch', 'some more content for a', 'some stuff')
+ left.times do |i|
+ repository.multi_action(
+ user,
+ branch_name: 'left-branch',
+ message: 'some more content for a',
+ actions: [{
+ action: i == 0 ? :create : :update,
+ file_path: 'encoding/CHANGELOG',
+ content: 'some stuff'
+ }]
+ )
end
- right.times do
- new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'right-branch', 'some more content for b', 'some stuff')
+ right.times do |i|
+ repository.multi_action(
+ user,
+ branch_name: 'right-branch',
+ message: 'some more content for b',
+ actions: [{
+ action: i == 0 ? :create : :update,
+ file_path: 'encoding/CHANGELOG',
+ content: 'some stuff'
+ }]
+ )
end
end
@@ -407,8 +443,8 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
it 'returns the correct count bounding at max_count' do
- branch_a_sha = repository_rugged.branches['left-branch'].target.oid
- branch_b_sha = repository_rugged.branches['right-branch'].target.oid
+ branch_a_sha = repository.find_branch('left-branch').dereferenced_target.sha
+ branch_b_sha = repository.find_branch('right-branch').dereferenced_target.sha
results = repository.diverging_commit_count(branch_a_sha, branch_b_sha, max_count: max_count)
@@ -469,16 +505,14 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
it 'deletes the ref' do
repository.delete_refs('refs/heads/feature')
- expect(repository_rugged.references['refs/heads/feature']).to be_nil
+ expect(repository.find_branch('feature')).to be_nil
end
it 'deletes all refs' do
refs = %w[refs/heads/wip refs/tags/v1.1.0]
repository.delete_refs(*refs)
- refs.each do |ref|
- expect(repository_rugged.references[ref]).to be_nil
- end
+ expect(repository.list_refs(refs)).to be_empty
end
it 'does not fail when deleting an empty list of refs' do
@@ -491,7 +525,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
describe '#branch_names_contains_sha' do
- let(:head_id) { repository_rugged.head.target.oid }
+ let(:head_id) { repository.commit.id }
let(:new_branch) { head_id }
let(:utf8_branch) { 'branch-é' }
@@ -525,7 +559,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
it 'does not error when dereferenced_target is nil' do
blob_id = repository.blob_at('master', 'README.md').id
- repository_rugged.tags.create("refs/tags/blob-tag", blob_id)
+ repository.add_tag("refs/tags/blob-tag", user: user, target: blob_id)
expect { subject }.not_to raise_error
end
@@ -559,14 +593,31 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
describe '#search_files_by_content' do
let(:repository) { mutable_repository }
- let(:repository_rugged) { mutable_repository_rugged }
let(:ref) { 'search-files-by-content-branch' }
let(:content) { 'foobarbazmepmep' }
before do
repository.create_branch(ref)
- new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', ref, 'committing something', content)
- new_commit_edit_new_file_on_branch(repository_rugged, 'anotherfile', ref, 'committing something', content)
+ repository.multi_action(
+ user,
+ branch_name: ref,
+ message: 'committing something',
+ actions: [{
+ action: :create,
+ file_path: 'encoding/CHANGELOG',
+ content: content
+ }]
+ )
+ repository.multi_action(
+ user,
+ branch_name: ref,
+ message: 'committing something',
+ actions: [{
+ action: :create,
+ file_path: 'anotherfile',
+ content: content
+ }]
+ )
end
after do
@@ -669,14 +720,42 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
before do
# Add new commits so that there's a renamed file in the commit history
- @commit_with_old_name_id = new_commit_edit_old_file(repository_rugged).oid
- @rename_commit_id = new_commit_move_file(repository_rugged).oid
- @commit_with_new_name_id = new_commit_edit_new_file(repository_rugged, "encoding/CHANGELOG", "Edit encoding/CHANGELOG", "I'm a new changelog with different text").oid
+ @commit_with_old_name_id = repository.multi_action(
+ user,
+ branch_name: repository.root_ref,
+ message: 'Update CHANGELOG',
+ actions: [{
+ action: :update,
+ file_path: 'CHANGELOG',
+ content: 'CHANGELOG'
+ }]
+ ).newrev
+ @rename_commit_id = repository.multi_action(
+ user,
+ branch_name: repository.root_ref,
+ message: 'Move CHANGELOG to encoding/',
+ actions: [{
+ action: :move,
+ previous_path: 'CHANGELOG',
+ file_path: 'encoding/CHANGELOG',
+ content: 'CHANGELOG'
+ }]
+ ).newrev
+ @commit_with_new_name_id = repository.multi_action(
+ user,
+ branch_name: repository.root_ref,
+ message: 'Edit encoding/CHANGELOG',
+ actions: [{
+ action: :update,
+ file_path: 'encoding/CHANGELOG',
+ content: "I'm a new changelog with different text"
+ }]
+ ).newrev
end
after do
# Erase our commits so other tests get the original repo
- repository_rugged.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
+ repository.write_ref(repository.root_ref, SeedRepo::LastCommit::ID)
end
context "where 'follow' == true" do
@@ -1649,27 +1728,28 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
describe '#gitattribute' do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_GITATTRIBUTES_REPO_PATH, '', 'group/project') }
+ let(:project) { create(:project, :repository) }
+ let(:repository) { project.repository }
- after do
- ensure_seeds
- end
+ context 'with gitattributes' do
+ before do
+ repository.copy_gitattributes('gitattributes')
+ end
- it 'returns matching language attribute' do
- expect(repository.gitattribute("custom-highlighting/test.gitlab-custom", 'gitlab-language')).to eq('ruby')
- end
+ it 'returns matching language attribute' do
+ expect(repository.gitattribute("custom-highlighting/test.gitlab-custom", 'gitlab-language')).to eq('ruby')
+ end
- it 'returns matching language attribute with additional options' do
- expect(repository.gitattribute("custom-highlighting/test.gitlab-cgi", 'gitlab-language')).to eq('erb?parent=json')
- end
+ it 'returns matching language attribute with additional options' do
+ expect(repository.gitattribute("custom-highlighting/test.gitlab-cgi", 'gitlab-language')).to eq('erb?parent=json')
+ end
- it 'returns nil if nothing matches' do
- expect(repository.gitattribute("report.xslt", 'gitlab-language')).to eq(nil)
+ it 'returns nil if nothing matches' do
+ expect(repository.gitattribute("report.xslt", 'gitlab-language')).to eq(nil)
+ end
end
- context 'without gitattributes file' do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
-
+ context 'without gitattributes' do
it 'returns nil' do
expect(repository.gitattribute("README.md", 'gitlab-language')).to eq(nil)
end
@@ -1760,25 +1840,13 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
describe '#languages' do
it 'returns exactly the expected results' do
languages = repository.languages('4b4918a572fa86f9771e5ba40fbd48e1eb03e2c6')
- expected_languages = [
- { value: 66.63, label: "Ruby", color: "#701516", highlight: "#701516" },
- { value: 22.96, label: "JavaScript", color: "#f1e05a", highlight: "#f1e05a" },
- { value: 7.9, label: "HTML", color: "#e34c26", highlight: "#e34c26" },
- { value: 2.51, label: "CoffeeScript", color: "#244776", highlight: "#244776" }
- ]
-
- expect(languages.size).to eq(expected_languages.size)
-
- expected_languages.size.times do |i|
- a = expected_languages[i]
- b = languages[i]
- expect(a.keys.sort).to eq(b.keys.sort)
- expect(a[:value]).to be_within(0.1).of(b[:value])
-
- non_float_keys = a.keys - [:value]
- expect(a.values_at(*non_float_keys)).to eq(b.values_at(*non_float_keys))
- end
+ expect(languages).to match_array([
+ { value: a_value_within(0.1).of(66.7), label: "Ruby", color: "#701516", highlight: "#701516" },
+ { value: a_value_within(0.1).of(22.96), label: "JavaScript", color: "#f1e05a", highlight: "#f1e05a" },
+ { value: a_value_within(0.1).of(7.9), label: "HTML", color: "#e34c26", highlight: "#e34c26" },
+ { value: a_value_within(0.1).of(2.51), label: "CoffeeScript", color: "#244776", highlight: "#244776" }
+ ])
end
it "uses the repository's HEAD when no ref is passed" do
@@ -1818,12 +1886,18 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
context 'when the branch exists' do
context 'when the commit does not exist locally' do
let(:source_branch) { 'new-branch-for-fetch-source-branch' }
- let(:source_path) { File.join(TestEnv.repos_path, source_repository.relative_path) }
- let(:source_rugged) { Rugged::Repository.new(source_path) }
- let(:new_oid) { new_commit_edit_old_file(source_rugged).oid }
- before do
- source_rugged.branches.create(source_branch, new_oid)
+ let!(:new_oid) do
+ source_repository.multi_action(
+ user,
+ branch_name: source_branch,
+ message: 'Add a file',
+ actions: [{
+ action: :create,
+ file_path: 'a.file',
+ content: 'This is a file.'
+ }]
+ ).newrev
end
it 'writes the ref' do
@@ -1869,7 +1943,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
it "removes the branch from the repo" do
repository.rm_branch(branch_name, user: user)
- expect(repository_rugged.branches[branch_name]).to be_nil
+ expect(repository.find_branch(branch_name)).to be_nil
end
end
@@ -2290,11 +2364,23 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
context 'when the diff contains a rename' do
- let(:end_sha) { new_commit_move_file(repository_rugged).oid }
+ let(:end_sha) do
+ repository.multi_action(
+ user,
+ branch_name: repository.root_ref,
+ message: 'Move CHANGELOG to encoding/',
+ actions: [{
+ action: :move,
+ previous_path: 'CHANGELOG',
+ file_path: 'encoding/CHANGELOG',
+ content: 'CHANGELOG'
+ }]
+ ).newrev
+ end
after do
# Erase our commits so other tests get the original repo
- repository_rugged.references.update('refs/heads/master', SeedRepo::LastCommit::ID)
+ repository.write_ref(repository.root_ref, SeedRepo::LastCommit::ID)
end
it 'does not include the renamed file in the sparse checkout' do
@@ -2342,24 +2428,15 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
def create_remote_branch(remote_name, branch_name, source_branch_name)
- source_branch = repository.branches.find { |branch| branch.name == source_branch_name }
- repository_rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha)
- end
-
- def refs(dir)
- IO.popen(%W[git -C #{dir} for-each-ref], &:read).split("\n").map do |line|
- line.split("\t").last
- end
+ source_branch = repository.find_branch(source_branch_name)
+ repository.write_ref("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha)
end
describe '#disconnect_alternates' do
let(:project) { create(:project, :repository) }
let(:pool_repository) { create(:pool_repository) }
let(:repository) { project.repository }
- let(:repository_path) { File.join(TestEnv.repos_path, repository.relative_path) }
let(:object_pool) { pool_repository.object_pool }
- let(:object_pool_path) { File.join(TestEnv.repos_path, object_pool.repository.relative_path) }
- let(:object_pool_rugged) { Rugged::Repository.new(object_pool_path) }
before do
object_pool.create # rubocop:disable Rails/SaveBang
@@ -2369,25 +2446,24 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
expect { repository.disconnect_alternates }.not_to raise_error
end
- it 'removes the alternates file' do
- object_pool.link(repository)
-
- alternates_file = File.join(repository_path, "objects", "info", "alternates")
- expect(File.exist?(alternates_file)).to be_truthy
-
- repository.disconnect_alternates
-
- expect(File.exist?(alternates_file)).to be_falsey
- end
-
it 'can still access objects in the object pool' do
object_pool.link(repository)
- new_commit = new_commit_edit_old_file(object_pool_rugged)
- expect(repository.commit(new_commit.oid).id).to eq(new_commit.oid)
+ new_commit_id = object_pool.repository.multi_action(
+ project.owner,
+ branch_name: object_pool.repository.root_ref,
+ message: 'Add a file',
+ actions: [{
+ action: :create,
+ file_path: 'a.file',
+ content: 'This is a file.'
+ }]
+ ).newrev
+
+ expect(repository.commit(new_commit_id).id).to eq(new_commit_id)
repository.disconnect_alternates
- expect(repository.commit(new_commit.oid).id).to eq(new_commit.oid)
+ expect(repository.commit(new_commit_id).id).to eq(new_commit_id)
end
end
@@ -2483,7 +2559,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
it 'mirrors the source repository' do
subject
- expect(refs(new_repository_path)).to eq(refs(repository_path))
+ expect(new_repository.list_refs(['refs/'])).to eq(repository.list_refs(['refs/']))
end
end
@@ -2495,7 +2571,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
it 'mirrors the source repository' do
subject
- expect(refs(new_repository_path)).to eq(refs(repository_path))
+ expect(new_repository.list_refs(['refs/'])).to eq(repository.list_refs(['refs/']))
end
context 'with keep-around refs' do
@@ -2511,8 +2587,8 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
it 'includes the temporary and keep-around refs' do
subject
- expect(refs(new_repository_path)).to include(keep_around_ref)
- expect(refs(new_repository_path)).to include(tmp_ref)
+ expect(new_repository.list_refs([keep_around_ref]).map(&:name)).to match_array([keep_around_ref])
+ expect(new_repository.list_refs([tmp_ref]).map(&:name)).to match_array([tmp_ref])
end
end
end
diff --git a/spec/lib/gitlab/git/tree_spec.rb b/spec/lib/gitlab/git/tree_spec.rb
index 97ba177da71..172d7a3f27b 100644
--- a/spec/lib/gitlab/git/tree_spec.rb
+++ b/spec/lib/gitlab/git/tree_spec.rb
@@ -3,6 +3,8 @@
require "spec_helper"
RSpec.describe Gitlab::Git::Tree, :seed_helper do
+ let_it_be(:user) { create(:user) }
+
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
shared_examples :repo do
@@ -85,51 +87,29 @@ RSpec.describe Gitlab::Git::Tree, :seed_helper do
context :flat_path do
let(:filename) { 'files/flat/path/correct/content.txt' }
- let(:sha) { create_file(filename) }
let(:path) { 'files/flat' }
# rubocop: disable Rails/FindBy
# This is not ActiveRecord where..first
let(:subdir_file) { entries.first }
# rubocop: enable Rails/FindBy
- let(:repository_rugged) { Rugged::Repository.new(File.join(SEED_STORAGE_PATH, TEST_REPO_PATH)) }
-
- it { expect(subdir_file.flat_path).to eq('files/flat/path/correct') }
- end
-
- def create_file(path)
- oid = repository_rugged.write('test', :blob)
- index = repository_rugged.index
- index.add(path: filename, oid: oid, mode: 0100644)
-
- options = commit_options(
- repository_rugged,
- index,
- repository_rugged.head.target,
- 'HEAD',
- 'Add new file')
+ let!(:sha) do
+ repository.multi_action(
+ user,
+ branch_name: 'HEAD',
+ message: "Create #{filename}",
+ actions: [{
+ action: :create,
+ file_path: filename,
+ contents: 'test'
+ }]
+ ).newrev
+ end
- Rugged::Commit.create(repository_rugged, options)
- end
+ after do
+ ensure_seeds
+ end
- # Build the options hash that's passed to Rugged::Commit#create
- def commit_options(repo, index, target, ref, message)
- options = {}
- options[:tree] = index.write_tree(repo)
- options[:author] = {
- email: "test@example.com",
- name: "Test Author",
- time: Time.gm(2014, "mar", 3, 20, 15, 1)
- }
- options[:committer] = {
- email: "test@example.com",
- name: "Test Author",
- time: Time.gm(2014, "mar", 3, 20, 15, 1)
- }
- options[:message] ||= message
- options[:parents] = repo.empty? ? [] : [target].compact
- options[:update_ref] = ref
-
- options
+ it { expect(subdir_file.flat_path).to eq('files/flat/path/correct') }
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 3a34d39c722..d5d1bef7bff 100644
--- a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
@@ -3,7 +3,8 @@
require 'spec_helper'
RSpec.describe Gitlab::GitalyClient::CommitService do
- let(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository) }
+
let(:storage_name) { project.repository_storage }
let(:relative_path) { project.disk_path + '.git' }
let(:repository) { project.repository }
diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
index 4320c5460da..e04895d975f 100644
--- a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
@@ -2,9 +2,6 @@
require 'spec_helper'
-require 'google/rpc/status_pb'
-require 'google/protobuf/well_known_types'
-
RSpec.describe Gitlab::GitalyClient::OperationService do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository) }
@@ -188,7 +185,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do
end
shared_examples 'a failed branch deletion' do
- it 'raises a PreRecieveError' do
+ it 'raises a PreReceiveError' do
expect_any_instance_of(Gitaly::OperationService::Stub)
.to receive(:user_delete_branch).with(request, kind_of(Hash))
.and_raise(custom_hook_error)
@@ -288,7 +285,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do
end
shared_examples 'a failed merge' do
- it 'raises a PreRecieveError' do
+ it 'raises a PreReceiveError' do
expect_any_instance_of(Gitaly::OperationService::Stub)
.to receive(:user_merge_branch).with(kind_of(Enumerator), kind_of(Hash))
.and_raise(custom_hook_error)
@@ -816,14 +813,4 @@ RSpec.describe Gitlab::GitalyClient::OperationService do
end
end
end
-
- def new_detailed_error(error_code, error_message, details)
- status_error = Google::Rpc::Status.new(
- code: error_code,
- message: error_message,
- details: [Google::Protobuf::Any.pack(details)]
- )
-
- GRPC::BadStatus.new(error_code, error_message, { "grpc-status-details-bin" => Google::Rpc::Status.encode(status_error) })
- end
end
diff --git a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb
index 2e37c98a591..566bdbacf4a 100644
--- a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb
@@ -241,30 +241,70 @@ RSpec.describe Gitlab::GitalyClient::RefService do
end
end
- describe '#ref_exists?', :seed_helper do
- it 'finds the master branch ref' do
- expect(client.ref_exists?('refs/heads/master')).to eq(true)
- end
+ describe '#ref_exists?' do
+ let(:ref) { 'refs/heads/master' }
- it 'returns false for an illegal tag name ref' do
- expect(client.ref_exists?('refs/tags/.this-tag-name-is-illegal')).to eq(false)
- end
+ it 'sends a ref_exists message' do
+ expect_any_instance_of(Gitaly::RefService::Stub)
+ .to receive(:ref_exists)
+ .with(gitaly_request_with_params(ref: ref), kind_of(Hash))
+ .and_return(double('ref_exists_response', value: true))
- it 'raises an argument error if the ref name parameter does not start with refs/' do
- expect { client.ref_exists?('reXXXXX') }.to raise_error(ArgumentError)
+ expect(client.ref_exists?(ref)).to be true
end
end
describe '#delete_refs' do
let(:prefixes) { %w(refs/heads refs/keep-around) }
+ subject(:delete_refs) { client.delete_refs(except_with_prefixes: prefixes) }
+
it 'sends a delete_refs message' do
expect_any_instance_of(Gitaly::RefService::Stub)
.to receive(:delete_refs)
.with(gitaly_request_with_params(except_with_prefix: prefixes), kind_of(Hash))
.and_return(double('delete_refs_response', git_error: ""))
- client.delete_refs(except_with_prefixes: prefixes)
+ delete_refs
+ end
+
+ context 'with a references locked error' do
+ let(:references_locked_error) do
+ new_detailed_error(
+ GRPC::Core::StatusCodes::FAILED_PRECONDITION,
+ "error message",
+ Gitaly::DeleteRefsError.new(references_locked: Gitaly::ReferencesLockedError.new))
+ end
+
+ it 'raises ReferencesLockedError' do
+ expect_any_instance_of(Gitaly::RefService::Stub).to receive(:delete_refs)
+ .with(gitaly_request_with_params(except_with_prefix: prefixes), kind_of(Hash))
+ .and_raise(references_locked_error)
+
+ expect { delete_refs }.to raise_error(Gitlab::Git::ReferencesLockedError)
+ end
+ end
+
+ context 'with a invalid format error' do
+ let(:invalid_refs) {['\invali.\d/1', '\.invali/d/2']}
+ let(:invalid_reference_format_error) do
+ new_detailed_error(
+ GRPC::Core::StatusCodes::INVALID_ARGUMENT,
+ "error message",
+ Gitaly::DeleteRefsError.new(invalid_format: Gitaly::InvalidRefFormatError.new(refs: invalid_refs)))
+ end
+
+ it 'raises InvalidRefFormatError' do
+ expect_any_instance_of(Gitaly::RefService::Stub)
+ .to receive(:delete_refs)
+ .with(gitaly_request_with_params(except_with_prefix: prefixes), kind_of(Hash))
+ .and_raise(invalid_reference_format_error)
+
+ expect { delete_refs }.to raise_error do |error|
+ expect(error).to be_a(Gitlab::Git::InvalidRefFormatError)
+ expect(error.message).to eq("references have an invalid format: #{invalid_refs.join(",")}")
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/gitaly_client_spec.rb b/spec/lib/gitlab/gitaly_client_spec.rb
index ba4ea1069d8..a3840ca843f 100644
--- a/spec/lib/gitlab/gitaly_client_spec.rb
+++ b/spec/lib/gitlab/gitaly_client_spec.rb
@@ -358,11 +358,7 @@ RSpec.describe Gitlab::GitalyClient do
end
end
- context 'when RequestStore is enabled and the maximum number of calls is not enforced by a feature flag', :request_store do
- before do
- stub_feature_flags(gitaly_enforce_requests_limits: false)
- end
-
+ shared_examples 'enforces maximum allowed Gitaly calls' do
it 'allows up the maximum number of allowed calls' do
expect { call_gitaly(Gitlab::GitalyClient::MAXIMUM_GITALY_CALLS) }.not_to raise_error
end
@@ -408,6 +404,18 @@ RSpec.describe Gitlab::GitalyClient do
end
end
+ context 'when RequestStore is enabled and the maximum number of calls is enforced by a feature flag', :request_store do
+ include_examples 'enforces maximum allowed Gitaly calls'
+ end
+
+ context 'when RequestStore is enabled and the maximum number of calls is not enforced by a feature flag', :request_store do
+ before do
+ stub_feature_flags(gitaly_enforce_requests_limits: false)
+ end
+
+ include_examples 'enforces maximum allowed Gitaly calls'
+ end
+
context 'in production and when RequestStore is enabled', :request_store do
before do
stub_rails_env('production')
@@ -537,4 +545,44 @@ RSpec.describe Gitlab::GitalyClient do
end
end
end
+
+ describe '.decode_detailed_error' do
+ let(:detailed_error) do
+ new_detailed_error(GRPC::Core::StatusCodes::INVALID_ARGUMENT,
+ "error message",
+ Gitaly::InvalidRefFormatError.new)
+ end
+
+ let(:error_without_details) do
+ error_code = GRPC::Core::StatusCodes::INVALID_ARGUMENT
+ error_message = "error message"
+
+ status_error = Google::Rpc::Status.new(
+ code: error_code,
+ message: error_message,
+ details: nil
+ )
+
+ GRPC::BadStatus.new(
+ error_code,
+ error_message,
+ { "grpc-status-details-bin" => Google::Rpc::Status.encode(status_error) })
+ end
+
+ context 'decodes a structured error' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:error, :result) do
+ detailed_error | Gitaly::InvalidRefFormatError.new
+ error_without_details | nil
+ StandardError.new | nil
+ end
+
+ with_them do
+ it 'returns correct detailed error' do
+ expect(described_class.decode_detailed_error(error)).to eq(result)
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/importer/events/changed_label_spec.rb b/spec/lib/gitlab/github_import/importer/events/changed_label_spec.rb
new file mode 100644
index 00000000000..b773598853d
--- /dev/null
+++ b/spec/lib/gitlab/github_import/importer/events/changed_label_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Importer::Events::ChangedLabel do
+ subject(:importer) { described_class.new(project, user.id) }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+
+ let(:issue) { create(:issue, project: project) }
+ let!(:label) { create(:label, project: project) }
+
+ let(:issue_event) do
+ Gitlab::GithubImport::Representation::IssueEvent.from_json_hash(
+ 'id' => 6501124486,
+ 'actor' => { 'id' => 4, 'login' => 'alice' },
+ 'event' => event_type,
+ 'commit_id' => nil,
+ 'label_title' => label.title,
+ 'issue_db_id' => issue.id,
+ 'created_at' => '2022-04-26 18:30:53 UTC'
+ )
+ end
+
+ let(:event_attrs) do
+ {
+ user_id: user.id,
+ issue_id: issue.id,
+ label_id: label.id,
+ created_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ shared_examples 'new event' do
+ it 'creates a new label event' do
+ expect { importer.execute(issue_event) }.to change { issue.resource_label_events.count }
+ .from(0).to(1)
+ expect(issue.resource_label_events.last)
+ .to have_attributes(expected_event_attrs)
+ end
+ end
+
+ before do
+ allow(Gitlab::Cache::Import::Caching).to receive(:read_integer).and_return(label.id)
+ end
+
+ context 'when importing a labeled event' do
+ let(:event_type) { 'labeled' }
+ let(:expected_event_attrs) { event_attrs.merge(action: 'add') }
+
+ it_behaves_like 'new event'
+ end
+
+ context 'when importing an unlabeled event' do
+ let(:event_type) { 'unlabeled' }
+ let(:expected_event_attrs) { event_attrs.merge(action: 'remove') }
+
+ it_behaves_like 'new event'
+ end
+end
diff --git a/spec/lib/gitlab/github_import/importer/events/closed_spec.rb b/spec/lib/gitlab/github_import/importer/events/closed_spec.rb
new file mode 100644
index 00000000000..116917d3e06
--- /dev/null
+++ b/spec/lib/gitlab/github_import/importer/events/closed_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Importer::Events::Closed do
+ subject(:importer) { described_class.new(project, user.id) }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+
+ let(:issue) { create(:issue, project: project) }
+ let(:commit_id) { nil }
+
+ let(:issue_event) do
+ Gitlab::GithubImport::Representation::IssueEvent.from_json_hash(
+ 'id' => 6501124486,
+ 'node_id' => 'CE_lADOHK9fA85If7x0zwAAAAGDf0mG',
+ 'url' => 'https://api.github.com/repos/elhowm/test-import/issues/events/6501124486',
+ 'actor' => { 'id' => 4, 'login' => 'alice' },
+ 'event' => 'closed',
+ 'created_at' => '2022-04-26 18:30:53 UTC',
+ 'commit_id' => commit_id,
+ 'issue_db_id' => issue.id
+ )
+ end
+
+ let(:expected_event_attrs) do
+ {
+ project_id: project.id,
+ author_id: user.id,
+ target_id: issue.id,
+ target_type: Issue.name,
+ action: 'closed',
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ let(:expected_state_event_attrs) do
+ {
+ user_id: user.id,
+ issue_id: issue.id,
+ state: 'closed',
+ created_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ it 'creates expected event and state event' do
+ importer.execute(issue_event)
+
+ expect(issue.events.count).to eq 1
+ expect(issue.events[0].attributes)
+ .to include expected_event_attrs
+
+ expect(issue.resource_state_events.count).to eq 1
+ expect(issue.resource_state_events[0].attributes)
+ .to include expected_state_event_attrs
+ end
+
+ context 'when closed by commit' do
+ let!(:closing_commit) { create(:commit, project: project) }
+ let(:commit_id) { closing_commit.id }
+
+ it 'creates expected event and state event' do
+ importer.execute(issue_event)
+
+ expect(issue.events.count).to eq 1
+ state_event = issue.resource_state_events.last
+ expect(state_event.source_commit).to eq commit_id[0..40]
+ end
+ end
+end
diff --git a/spec/lib/gitlab/github_import/importer/events/cross_referenced_spec.rb b/spec/lib/gitlab/github_import/importer/events/cross_referenced_spec.rb
new file mode 100644
index 00000000000..118c482a7d9
--- /dev/null
+++ b/spec/lib/gitlab/github_import/importer/events/cross_referenced_spec.rb
@@ -0,0 +1,96 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Importer::Events::CrossReferenced, :clean_gitlab_redis_cache do
+ subject(:importer) { described_class.new(project, user.id) }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+
+ let(:sawyer_stub) { Struct.new(:iid, :issuable_type, keyword_init: true) }
+
+ let(:issue) { create(:issue, project: project) }
+ let(:referenced_in) { build_stubbed(:issue, project: project) }
+ let(:commit_id) { nil }
+
+ let(:issue_event) do
+ Gitlab::GithubImport::Representation::IssueEvent.from_json_hash(
+ 'id' => 6501124486,
+ 'node_id' => 'CE_lADOHK9fA85If7x0zwAAAAGDf0mG',
+ 'url' => 'https://api.github.com/repos/elhowm/test-import/issues/events/6501124486',
+ 'actor' => { 'id' => 4, 'login' => 'alice' },
+ 'event' => 'cross-referenced',
+ 'source' => {
+ 'type' => 'issue',
+ 'issue' => {
+ 'number' => referenced_in.iid,
+ 'pull_request' => pull_request_resource
+ }
+ },
+ 'created_at' => '2022-04-26 18:30:53 UTC',
+ 'issue_db_id' => issue.id
+ )
+ end
+
+ let(:pull_request_resource) { nil }
+ let(:expected_note_attrs) do
+ {
+ system: true,
+ noteable_type: Issue.name,
+ noteable_id: issue_event.issue_db_id,
+ project_id: project.id,
+ author_id: user.id,
+ note: expected_note_body,
+ created_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ context 'when referenced in other issue' do
+ let(:expected_note_body) { "mentioned in issue ##{issue.iid}" }
+
+ before do
+ other_issue_resource = sawyer_stub.new(iid: referenced_in.iid, issuable_type: 'Issue')
+ Gitlab::GithubImport::IssuableFinder.new(project, other_issue_resource)
+ .cache_database_id(referenced_in.iid)
+ end
+
+ it 'creates expected note' do
+ importer.execute(issue_event)
+
+ expect(issue.notes.count).to eq 1
+ expect(issue.notes[0]).to have_attributes expected_note_attrs
+ expect(issue.notes[0].system_note_metadata.action).to eq 'cross_reference'
+ end
+ end
+
+ context 'when referenced in pull request' do
+ let(:referenced_in) { build_stubbed(:merge_request, project: project) }
+ let(:pull_request_resource) { { 'id' => referenced_in.iid } }
+
+ let(:expected_note_body) { "mentioned in merge request !#{referenced_in.iid}" }
+
+ before do
+ other_issue_resource =
+ sawyer_stub.new(iid: referenced_in.iid, issuable_type: 'MergeRequest')
+ Gitlab::GithubImport::IssuableFinder.new(project, other_issue_resource)
+ .cache_database_id(referenced_in.iid)
+ end
+
+ it 'creates expected note' do
+ importer.execute(issue_event)
+
+ expect(issue.notes.count).to eq 1
+ expect(issue.notes[0]).to have_attributes expected_note_attrs
+ expect(issue.notes[0].system_note_metadata.action).to eq 'cross_reference'
+ end
+ end
+
+ context 'when referenced in out of project issue/pull_request' do
+ it 'creates expected note' do
+ importer.execute(issue_event)
+
+ expect(issue.notes.count).to eq 0
+ end
+ end
+end
diff --git a/spec/lib/gitlab/github_import/importer/events/renamed_spec.rb b/spec/lib/gitlab/github_import/importer/events/renamed_spec.rb
new file mode 100644
index 00000000000..a8c3fbcb05d
--- /dev/null
+++ b/spec/lib/gitlab/github_import/importer/events/renamed_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Importer::Events::Renamed do
+ subject(:importer) { described_class.new(project, user.id) }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+
+ let(:issue) { create(:issue, project: project) }
+
+ let(:issue_event) do
+ Gitlab::GithubImport::Representation::IssueEvent.from_json_hash(
+ 'id' => 6501124486,
+ 'actor' => { 'id' => 4, 'login' => 'alice' },
+ 'event' => 'renamed',
+ 'commit_id' => nil,
+ 'created_at' => '2022-04-26 18:30:53 UTC',
+ 'old_title' => 'old title',
+ 'new_title' => 'new title',
+ 'issue_db_id' => issue.id
+ )
+ end
+
+ let(:expected_note_attrs) do
+ {
+ noteable_id: issue.id,
+ noteable_type: Issue.name,
+ project_id: project.id,
+ author_id: user.id,
+ note: "changed title from **{-old-} title** to **{+new+} title**",
+ system: true,
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ let(:expected_system_note_metadata_attrs) do
+ {
+ action: "title",
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ describe '#execute' do
+ it 'creates expected note' do
+ expect { importer.execute(issue_event) }.to change { issue.notes.count }
+ .from(0).to(1)
+
+ expect(issue.notes.last)
+ .to have_attributes(expected_note_attrs)
+ end
+
+ it 'creates expected system note metadata' do
+ expect { importer.execute(issue_event) }.to change { SystemNoteMetadata.count }
+ .from(0).to(1)
+
+ expect(SystemNoteMetadata.last)
+ .to have_attributes(
+ expected_system_note_metadata_attrs.merge(
+ note_id: Note.last.id
+ )
+ )
+ end
+ end
+end
diff --git a/spec/lib/gitlab/github_import/importer/events/reopened_spec.rb b/spec/lib/gitlab/github_import/importer/events/reopened_spec.rb
new file mode 100644
index 00000000000..81653b0ecdc
--- /dev/null
+++ b/spec/lib/gitlab/github_import/importer/events/reopened_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Importer::Events::Reopened, :aggregate_failures do
+ subject(:importer) { described_class.new(project, user.id) }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+
+ let(:issue) { create(:issue, project: project) }
+
+ let(:issue_event) do
+ Gitlab::GithubImport::Representation::IssueEvent.from_json_hash(
+ 'id' => 6501124486,
+ 'node_id' => 'CE_lADOHK9fA85If7x0zwAAAAGDf0mG',
+ 'url' => 'https://api.github.com/repos/elhowm/test-import/issues/events/6501124486',
+ 'actor' => { 'id' => 4, 'login' => 'alice' },
+ 'event' => 'reopened',
+ 'created_at' => '2022-04-26 18:30:53 UTC',
+ 'issue_db_id' => issue.id
+ )
+ end
+
+ let(:expected_event_attrs) do
+ {
+ project_id: project.id,
+ author_id: user.id,
+ target_id: issue.id,
+ target_type: Issue.name,
+ action: 'reopened',
+ created_at: issue_event.created_at,
+ updated_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ let(:expected_state_event_attrs) do
+ {
+ user_id: user.id,
+ state: 'reopened',
+ created_at: issue_event.created_at
+ }.stringify_keys
+ end
+
+ it 'creates expected event and state event' do
+ importer.execute(issue_event)
+
+ expect(issue.events.count).to eq 1
+ expect(issue.events[0].attributes)
+ .to include expected_event_attrs
+
+ expect(issue.resource_state_events.count).to eq 1
+ expect(issue.resource_state_events[0].attributes)
+ .to include expected_state_event_attrs
+ end
+end
diff --git a/spec/lib/gitlab/github_import/importer/issue_event_importer_spec.rb b/spec/lib/gitlab/github_import/importer/issue_event_importer_spec.rb
new file mode 100644
index 00000000000..da32a3b3766
--- /dev/null
+++ b/spec/lib/gitlab/github_import/importer/issue_event_importer_spec.rb
@@ -0,0 +1,112 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Importer::IssueEventImporter, :clean_gitlab_redis_cache do
+ let(:importer) { described_class.new(issue_event, project, client) }
+
+ let(:project) { create(:project) }
+ let(:client) { instance_double('Gitlab::GithubImport::Client') }
+ let(:user) { create(:user) }
+ let(:issue) { create(:issue, project: project) }
+
+ let(:issue_event) do
+ Gitlab::GithubImport::Representation::IssueEvent.from_json_hash(
+ 'id' => 6501124486,
+ 'node_id' => 'CE_lADOHK9fA85If7x0zwAAAAGDf0mG',
+ 'url' => 'https://api.github.com/repos/elhowm/test-import/issues/events/6501124486',
+ 'actor' => { 'id' => actor_id, 'login' => 'alice' },
+ 'event' => event_name,
+ 'commit_id' => '570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
+ 'commit_url' =>
+ 'https://api.github.com/repos/octocat/Hello-World/commits/570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
+ 'created_at' => '2022-04-26 18:30:53 UTC',
+ 'performed_via_github_app' => nil
+ )
+ end
+
+ let(:actor_id) { user.id }
+ let(:event_name) { 'closed' }
+
+ shared_examples 'triggers specific event importer' do |importer_class|
+ it importer_class.name do
+ specific_importer = double(importer_class.name) # rubocop:disable RSpec/VerifiedDoubles
+
+ expect(importer_class)
+ .to receive(:new).with(project, user.id)
+ .and_return(specific_importer)
+ expect(specific_importer).to receive(:execute).with(issue_event)
+
+ importer.execute
+ end
+ end
+
+ describe '#execute' do
+ before do
+ allow_next_instance_of(Gitlab::GithubImport::UserFinder) do |finder|
+ allow(finder).to receive(:author_id_for)
+ .with(issue_event, author_key: :actor)
+ .and_return(user.id, true)
+ end
+
+ issue_event.attributes[:issue_db_id] = issue.id
+ end
+
+ context "when it's closed issue event" do
+ let(:event_name) { 'closed' }
+
+ it_behaves_like 'triggers specific event importer',
+ Gitlab::GithubImport::Importer::Events::Closed
+ end
+
+ context "when it's reopened issue event" do
+ let(:event_name) { 'reopened' }
+
+ it_behaves_like 'triggers specific event importer',
+ Gitlab::GithubImport::Importer::Events::Reopened
+ end
+
+ context "when it's labeled issue event" do
+ let(:event_name) { 'labeled' }
+
+ it_behaves_like 'triggers specific event importer',
+ Gitlab::GithubImport::Importer::Events::ChangedLabel
+ end
+
+ context "when it's unlabeled issue event" do
+ let(:event_name) { 'unlabeled' }
+
+ it_behaves_like 'triggers specific event importer',
+ Gitlab::GithubImport::Importer::Events::ChangedLabel
+ end
+
+ context "when it's renamed issue event" do
+ let(:event_name) { 'renamed' }
+
+ it_behaves_like 'triggers specific event importer',
+ Gitlab::GithubImport::Importer::Events::Renamed
+ end
+
+ context "when it's cross-referenced issue event" do
+ let(:event_name) { 'cross-referenced' }
+
+ it_behaves_like 'triggers specific event importer',
+ Gitlab::GithubImport::Importer::Events::CrossReferenced
+ end
+
+ context "when it's unknown issue event" do
+ let(:event_name) { 'fake' }
+
+ it 'logs warning and skips' do
+ expect(Gitlab::GithubImport::Logger).to receive(:debug)
+ .with(
+ message: 'UNSUPPORTED_EVENT_TYPE',
+ event_type: issue_event.event,
+ event_github_id: issue_event.id
+ )
+
+ importer.execute
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
index 2a06983417d..570d26cdf2d 100644
--- a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
@@ -131,6 +131,7 @@ RSpec.describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redi
title: 'My Issue',
author_id: user.id,
project_id: project.id,
+ namespace_id: project.project_namespace_id,
description: 'This is my issue',
milestone_id: milestone.id,
state_id: 1,
@@ -160,6 +161,7 @@ RSpec.describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redi
title: 'My Issue',
author_id: project.creator_id,
project_id: project.id,
+ namespace_id: project.project_namespace_id,
description: "*Created by: alice*\n\nThis is my issue",
milestone_id: milestone.id,
state_id: 1,
diff --git a/spec/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer_spec.rb b/spec/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer_spec.rb
new file mode 100644
index 00000000000..087faeffe02
--- /dev/null
+++ b/spec/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer_spec.rb
@@ -0,0 +1,128 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Importer::SingleEndpointIssueEventsImporter do
+ let(:client) { double }
+
+ let_it_be(:project) { create(:project, :import_started, import_source: 'http://somegithub.com') }
+ let_it_be(:issue) { create(:issue, project: project) }
+
+ subject { described_class.new(project, client, parallel: parallel) }
+
+ let(:parallel) { true }
+
+ it { is_expected.to include_module(Gitlab::GithubImport::ParallelScheduling) }
+
+ describe '#importer_class' do
+ it { expect(subject.importer_class).to eq(Gitlab::GithubImport::Importer::IssueEventImporter) }
+ end
+
+ describe '#representation_class' do
+ it { expect(subject.representation_class).to eq(Gitlab::GithubImport::Representation::IssueEvent) }
+ end
+
+ describe '#sidekiq_worker_class' do
+ it { expect(subject.sidekiq_worker_class).to eq(Gitlab::GithubImport::ImportIssueEventWorker) }
+ end
+
+ describe '#object_type' do
+ it { expect(subject.object_type).to eq(:issue_event) }
+ end
+
+ describe '#collection_method' do
+ it { expect(subject.collection_method).to eq(:issue_timeline) }
+ end
+
+ describe '#page_counter_id' do
+ it { expect(subject.page_counter_id(issue)).to eq("issues/#{issue.iid}/issue_timeline") }
+ end
+
+ describe '#id_for_already_imported_cache' do
+ let(:event) { instance_double('Event', id: 1) }
+
+ it { expect(subject.id_for_already_imported_cache(event)).to eq(1) }
+ end
+
+ describe '#collection_options' do
+ it do
+ expect(subject.collection_options)
+ .to eq({ state: 'all', sort: 'created', direction: 'asc' })
+ end
+ end
+
+ describe '#each_object_to_import', :clean_gitlab_redis_cache do
+ let(:issue_event) do
+ struct = Struct.new(:id, :event, :created_at, :issue_db_id, keyword_init: true)
+ struct.new(id: rand(10), event: 'closed', created_at: '2022-04-26 18:30:53 UTC')
+ end
+
+ let(:page) do
+ instance_double(
+ Gitlab::GithubImport::Client::Page,
+ number: 1, objects: [issue_event]
+ )
+ end
+
+ let(:page_counter) { instance_double(Gitlab::GithubImport::PageCounter) }
+
+ before do
+ allow(client).to receive(:each_page)
+ .once
+ .with(
+ :issue_timeline,
+ project.import_source,
+ issue.iid,
+ { state: 'all', sort: 'created', direction: 'asc', page: 1 }
+ ).and_yield(page)
+ end
+
+ it 'imports each issue event page by page' do
+ counter = 0
+ subject.each_object_to_import do |object|
+ expect(object).to eq issue_event
+ expect(issue_event.issue_db_id).to eq issue.id
+ counter += 1
+ end
+ expect(counter).to eq 1
+ end
+
+ it 'triggers page number increment' do
+ expect(Gitlab::GithubImport::PageCounter)
+ .to receive(:new).with(project, 'issues/1/issue_timeline')
+ .and_return(page_counter)
+ expect(page_counter).to receive(:current).and_return(1)
+ expect(page_counter)
+ .to receive(:set).with(page.number).and_return(true)
+
+ counter = 0
+ subject.each_object_to_import { counter += 1 }
+ expect(counter).to eq 1
+ end
+
+ context 'when page is already processed' do
+ before do
+ page_counter = Gitlab::GithubImport::PageCounter.new(
+ project, subject.page_counter_id(issue)
+ )
+ page_counter.set(page.number)
+ end
+
+ it "doesn't process this page" do
+ counter = 0
+ subject.each_object_to_import { counter += 1 }
+ expect(counter).to eq 0
+ end
+ end
+
+ context 'when event is already processed' do
+ it "doesn't process this event" do
+ subject.mark_as_imported(issue_event)
+
+ counter = 0
+ subject.each_object_to_import { counter += 1 }
+ expect(counter).to eq 0
+ end
+ end
+ 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 2d159580b5f..ad45469a4c3 100644
--- a/spec/lib/gitlab/github_import/markdown_text_spec.rb
+++ b/spec/lib/gitlab/github_import/markdown_text_spec.rb
@@ -12,6 +12,54 @@ RSpec.describe Gitlab::GithubImport::MarkdownText do
end
end
+ describe '.convert_ref_links' do
+ let_it_be(:project) { create(:project) }
+
+ let(:paragraph) { FFaker::Lorem.paragraph }
+ let(:sentence) { FFaker::Lorem.sentence }
+ let(:issue_id) { rand(100) }
+ let(:pull_id) { rand(100) }
+
+ let(:text_in) do
+ <<-TEXT
+ #{paragraph}
+ https://github.com/#{project.import_source}/issues/#{issue_id}
+ #{sentence}
+ https://github.com/#{project.import_source}/pull/#{pull_id}
+ TEXT
+ end
+
+ let(:text_out) do
+ <<-TEXT
+ #{paragraph}
+ http://localhost/#{project.full_path}/-/issues/#{issue_id}
+ #{sentence}
+ http://localhost/#{project.full_path}/-/merge_requests/#{pull_id}
+ TEXT
+ end
+
+ it { expect(described_class.convert_ref_links(text_in, project)).to eq text_out }
+
+ context 'when Github EE with custom domain name' do
+ let(:github_domain) { 'https://custom.github.com/' }
+ let(:text_in) do
+ <<-TEXT
+ #{paragraph}
+ #{github_domain}#{project.import_source}/issues/#{issue_id}
+ #{sentence}
+ #{github_domain}#{project.import_source}/pull/#{pull_id}
+ TEXT
+ end
+
+ before do
+ allow(Gitlab::Auth::OAuth::Provider)
+ .to receive(:config_for).with('github').and_return({ 'url' => github_domain })
+ end
+
+ it { expect(described_class.convert_ref_links(text_in, project)).to eq text_out }
+ end
+ end
+
describe '#to_s' do
it 'returns the text when the author was found' do
author = double(:author, login: 'Alice')
diff --git a/spec/lib/gitlab/github_import/representation/issue_event_spec.rb b/spec/lib/gitlab/github_import/representation/issue_event_spec.rb
new file mode 100644
index 00000000000..23da8276f64
--- /dev/null
+++ b/spec/lib/gitlab/github_import/representation/issue_event_spec.rb
@@ -0,0 +1,156 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Representation::IssueEvent do
+ shared_examples 'an IssueEvent' do
+ it 'returns an instance of IssueEvent' do
+ expect(issue_event).to be_an_instance_of(described_class)
+ end
+
+ context 'the returned IssueEvent' do
+ it 'includes the issue event id' do
+ expect(issue_event.id).to eq(6501124486)
+ end
+
+ it 'includes the issue event "event"' do
+ expect(issue_event.event).to eq('closed')
+ end
+
+ it 'includes the issue event commit_id' do
+ expect(issue_event.commit_id).to eq('570e7b2abdd848b95f2f578043fc23bd6f6fd24d')
+ end
+
+ it 'includes the issue event source' do
+ expect(issue_event.source).to eq({ type: 'issue', id: 123456 })
+ end
+
+ it 'includes the issue_db_id' do
+ expect(issue_event.issue_db_id).to eq(100500)
+ end
+
+ context 'when actor data present' do
+ it 'includes the actor details' do
+ expect(issue_event.actor)
+ .to be_an_instance_of(Gitlab::GithubImport::Representation::User)
+
+ expect(issue_event.actor.id).to eq(4)
+ expect(issue_event.actor.login).to eq('alice')
+ end
+ end
+
+ context 'when actor data is empty' do
+ let(:with_actor) { false }
+
+ it 'does not return such info' do
+ expect(issue_event.actor).to eq nil
+ end
+ end
+
+ context 'when label data is present' do
+ it 'includes the label_title' do
+ expect(issue_event.label_title).to eq('label title')
+ end
+ end
+
+ context 'when label data is empty' do
+ let(:with_label) { false }
+
+ it 'does not return such info' do
+ expect(issue_event.label_title).to eq nil
+ end
+ end
+
+ context 'when rename field is present' do
+ it 'includes the old_title and new_title fields' do
+ expect(issue_event.old_title).to eq('old title')
+ expect(issue_event.new_title).to eq('new title')
+ end
+ end
+
+ context 'when rename field is empty' do
+ let(:with_rename) { false }
+
+ it 'does not return such info' do
+ expect(issue_event.old_title).to eq nil
+ expect(issue_event.new_title).to eq nil
+ end
+ end
+
+ it 'includes the created timestamp' do
+ expect(issue_event.created_at).to eq('2022-04-26 18:30:53 UTC')
+ end
+ end
+
+ describe '#github_identifiers' do
+ it 'returns a hash with needed identifiers' do
+ expect(issue_event.github_identifiers).to eq({ id: 6501124486 })
+ end
+ end
+ end
+
+ describe '.from_api_response' do
+ let(:response) do
+ event_resource = Struct.new(
+ :id, :node_id, :url, :actor, :event, :commit_id, :commit_url, :label,
+ :rename, :issue_db_id, :created_at, :performed_via_github_app, :source,
+ keyword_init: true
+ )
+ user_resource = Struct.new(:id, :login, keyword_init: true)
+ event_resource.new(
+ id: 6501124486,
+ node_id: 'CE_lADOHK9fA85If7x0zwAAAAGDf0mG',
+ url: 'https://api.github.com/repos/elhowm/test-import/issues/events/6501124486',
+ actor: with_actor ? user_resource.new(id: 4, login: 'alice') : nil,
+ event: 'closed',
+ commit_id: '570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
+ commit_url: 'https://api.github.com/repos/octocat/Hello-World/commits'\
+ '/570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
+ rename: with_rename ? { from: 'old title', to: 'new title' } : nil,
+ source: { type: 'issue', id: 123456 },
+ issue_db_id: 100500,
+ label: with_label ? { name: 'label title' } : nil,
+ created_at: '2022-04-26 18:30:53 UTC',
+ performed_via_github_app: nil
+ )
+ end
+
+ let(:with_actor) { true }
+ let(:with_label) { true }
+ let(:with_rename) { true }
+
+ it_behaves_like 'an IssueEvent' do
+ let(:issue_event) { described_class.from_api_response(response) }
+ end
+ end
+
+ describe '.from_json_hash' do
+ it_behaves_like 'an IssueEvent' do
+ let(:hash) do
+ {
+ 'id' => 6501124486,
+ 'node_id' => 'CE_lADOHK9fA85If7x0zwAAAAGDf0mG',
+ 'url' => 'https://api.github.com/repos/elhowm/test-import/issues/events/6501124486',
+ 'actor' => (with_actor ? { 'id' => 4, 'login' => 'alice' } : nil),
+ 'event' => 'closed',
+ 'commit_id' => '570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
+ 'commit_url' =>
+ 'https://api.github.com/repos/octocat/Hello-World/commits/570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
+ 'label_title' => (with_label ? 'label title' : nil),
+ 'old_title' => with_rename ? 'old title' : nil,
+ 'new_title' => with_rename ? 'new title' : nil,
+ 'source' => { 'type' => 'issue', 'id' => 123456 },
+ "issue_db_id" => 100500,
+ 'created_at' => '2022-04-26 18:30:53 UTC',
+ 'performed_via_github_app' => nil
+ }
+ end
+
+ let(:with_actor) { true }
+ let(:with_label) { true }
+ let(:with_rename) { true }
+
+ let(:issue_event) { described_class.from_json_hash(hash) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/github_import/single_endpoint_notes_importing_spec.rb b/spec/lib/gitlab/github_import/single_endpoint_notes_importing_spec.rb
new file mode 100644
index 00000000000..64dbc939348
--- /dev/null
+++ b/spec/lib/gitlab/github_import/single_endpoint_notes_importing_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::SingleEndpointNotesImporting do
+ let(:importer_class) do
+ Class.new do
+ def self.name
+ 'MyImporter'
+ end
+
+ include(Gitlab::GithubImport::SingleEndpointNotesImporting)
+ end
+ end
+
+ let(:importer_instance) { importer_class.new }
+
+ describe '#parent_collection' do
+ it { expect { importer_instance.parent_collection }.to raise_error(NotImplementedError) }
+ end
+
+ describe '#parent_imported_cache_key' do
+ it { expect { importer_instance.parent_imported_cache_key }.to raise_error(NotImplementedError) }
+ end
+
+ describe '#page_counter_id' do
+ it { expect { importer_instance.page_counter_id(build(:merge_request)) }.to raise_error(NotImplementedError) }
+ end
+end
diff --git a/spec/lib/gitlab/gitlab_import/importer_spec.rb b/spec/lib/gitlab/gitlab_import/importer_spec.rb
index eb4c404e454..984c690add6 100644
--- a/spec/lib/gitlab/gitlab_import/importer_spec.rb
+++ b/spec/lib/gitlab/gitlab_import/importer_spec.rb
@@ -21,8 +21,8 @@ RSpec.describe Gitlab::GitlabImport::Importer do
'name' => 'John Doe'
}
}
- ])
- stub_request('issues/3/notes', [])
+ ].to_json)
+ stub_request('issues/3/notes', [].to_json)
end
it 'persists issues' do
diff --git a/spec/lib/gitlab/gpg/commit_spec.rb b/spec/lib/gitlab/gpg/commit_spec.rb
index 9c399e78d80..919335bc9fa 100644
--- a/spec/lib/gitlab/gpg/commit_spec.rb
+++ b/spec/lib/gitlab/gpg/commit_spec.rb
@@ -3,6 +3,34 @@
require 'spec_helper'
RSpec.describe Gitlab::Gpg::Commit do
+ let_it_be(:project) { create(:project, :repository, path: 'sample-project') }
+
+ let(:commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' }
+ let(:committer_email) { GpgHelpers::User1.emails.first }
+ let(:user_email) { committer_email }
+ let(:public_key) { GpgHelpers::User1.public_key }
+ let(:user) { create(:user, email: user_email) }
+ let(:commit) { create(:commit, project: project, sha: commit_sha, committer_email: committer_email) }
+ let(:crypto) { instance_double(GPGME::Crypto) }
+ let(:mock_signature_data?) { true }
+ # gpg_keys must be pre-loaded so that they can be found during signature verification.
+ let!(:gpg_key) { create(:gpg_key, key: public_key, user: user) }
+
+ let(:signature_data) do
+ [
+ GpgHelpers::User1.signed_commit_signature,
+ GpgHelpers::User1.signed_commit_base_data
+ ]
+ end
+
+ before do
+ if mock_signature_data?
+ allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
+ .with(Gitlab::Git::Repository, commit_sha)
+ .and_return(signature_data)
+ end
+ end
+
describe '#signature' do
shared_examples 'returns the cached signature on second call' do
it 'returns the cached signature on second call' do
@@ -17,11 +45,8 @@ RSpec.describe Gitlab::Gpg::Commit do
end
end
- let!(:project) { create :project, :repository, path: 'sample-project' }
- let!(:commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' }
-
context 'unsigned commit' do
- let!(:commit) { create :commit, project: project, sha: commit_sha }
+ let(:signature_data) { nil }
it 'returns nil' do
expect(described_class.new(commit).signature).to be_nil
@@ -29,20 +54,12 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'invalid signature' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User1.emails.first }
-
- let!(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
-
- before do
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(
- [
- # Corrupt the key
- GpgHelpers::User1.signed_commit_signature.tr('=', 'a'),
- GpgHelpers::User1.signed_commit_base_data
- ]
- )
+ let(:signature_data) do
+ [
+ # Corrupt the key
+ GpgHelpers::User1.signed_commit_signature.tr('=', 'a'),
+ GpgHelpers::User1.signed_commit_base_data
+ ]
end
it 'returns nil' do
@@ -53,25 +70,6 @@ RSpec.describe Gitlab::Gpg::Commit do
context 'known key' do
context 'user matches the key uid' do
context 'user email matches the email committer' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User1.emails.first }
-
- let!(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
-
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User1.public_key, user: user
- end
-
- before do
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(
- [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
- )
- end
-
it 'returns a valid signature' do
signature = described_class.new(commit).signature
@@ -112,32 +110,13 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'valid key signed using recent version of Gnupg' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User1.emails.first }
-
- let!(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
-
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User1.public_key, user: user
- end
-
- let!(:crypto) { instance_double(GPGME::Crypto) }
-
before do
- fake_signature = [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
-
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(fake_signature)
- end
-
- it 'returns a valid signature' do
verified_signature = double('verified-signature', fingerprint: GpgHelpers::User1.fingerprint, valid?: true)
allow(GPGME::Crypto).to receive(:new).and_return(crypto)
allow(crypto).to receive(:verify).and_yield(verified_signature)
+ end
+ it 'returns a valid signature' do
signature = described_class.new(commit).signature
expect(signature).to have_attributes(
@@ -153,33 +132,14 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'valid key signed using older version of Gnupg' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User1.emails.first }
-
- let!(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
-
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User1.public_key, user: user
- end
-
- let!(:crypto) { instance_double(GPGME::Crypto) }
-
before do
- fake_signature = [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
-
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(fake_signature)
- end
-
- it 'returns a valid signature' do
keyid = GpgHelpers::User1.fingerprint.last(16)
verified_signature = double('verified-signature', fingerprint: keyid, valid?: true)
allow(GPGME::Crypto).to receive(:new).and_return(crypto)
allow(crypto).to receive(:verify).and_yield(verified_signature)
+ end
+ it 'returns a valid signature' do
signature = described_class.new(commit).signature
expect(signature).to have_attributes(
@@ -195,32 +155,13 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'commit with multiple signatures' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User1.emails.first }
-
- let!(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
-
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User1.public_key, user: user
- end
-
- let!(:crypto) { instance_double(GPGME::Crypto) }
-
before do
- fake_signature = [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
-
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(fake_signature)
- end
-
- it 'returns an invalid signatures error' do
verified_signature = double('verified-signature', fingerprint: GpgHelpers::User1.fingerprint, valid?: true)
allow(GPGME::Crypto).to receive(:new).and_return(crypto)
allow(crypto).to receive(:verify).and_yield(verified_signature).and_yield(verified_signature)
+ end
+ it 'returns an invalid signatures error' do
signature = described_class.new(commit).signature
expect(signature).to have_attributes(
@@ -236,27 +177,18 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'commit signed with a subkey' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User3.emails.first }
-
- let!(:user) { create(:user, email: GpgHelpers::User3.emails.first) }
-
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User3.public_key, user: user
- end
+ let(:committer_email) { GpgHelpers::User3.emails.first }
+ let(:public_key) { GpgHelpers::User3.public_key }
let(:gpg_key_subkey) do
gpg_key.subkeys.find_by(fingerprint: GpgHelpers::User3.subkey_fingerprints.last)
end
- before do
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(
- [
- GpgHelpers::User3.signed_commit_signature,
- GpgHelpers::User3.signed_commit_base_data
- ]
- )
+ let(:signature_data) do
+ [
+ GpgHelpers::User3.signed_commit_signature,
+ GpgHelpers::User3.signed_commit_base_data
+ ]
end
it 'returns a valid signature' do
@@ -275,7 +207,7 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'user email does not match the committer email, but is the same user' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User2.emails.first }
+ let(:committer_email) { GpgHelpers::User2.emails.first }
let(:user) do
create(:user, email: GpgHelpers::User1.emails.first).tap do |user|
@@ -283,21 +215,6 @@ RSpec.describe Gitlab::Gpg::Commit do
end
end
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User1.public_key, user: user
- end
-
- before do
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(
- [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
- )
- end
-
it 'returns an invalid signature' do
expect(described_class.new(commit).signature).to have_attributes(
commit_sha: commit_sha,
@@ -314,24 +231,8 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'user email does not match the committer email' do
- let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User2.emails.first }
-
- let(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
-
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User1.public_key, user: user
- end
-
- before do
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(
- [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
- )
- end
+ let(:committer_email) { GpgHelpers::User2.emails.first }
+ let(:user_email) { GpgHelpers::User1.emails.first }
it 'returns an invalid signature' do
expect(described_class.new(commit).signature).to have_attributes(
@@ -350,24 +251,8 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'user does not match the key uid' do
- let!(:commit) { create :commit, project: project, sha: commit_sha }
-
- let(:user) { create(:user, email: GpgHelpers::User2.emails.first) }
-
- let!(:gpg_key) do
- create :gpg_key, key: GpgHelpers::User1.public_key, user: user
- end
-
- before do
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(
- [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
- )
- end
+ let(:user_email) { GpgHelpers::User2.emails.first }
+ let(:public_key) { GpgHelpers::User1.public_key }
it 'returns an invalid signature' do
expect(described_class.new(commit).signature).to have_attributes(
@@ -386,18 +271,7 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'unknown key' do
- let!(:commit) { create :commit, project: project, sha: commit_sha }
-
- before do
- allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
- .with(Gitlab::Git::Repository, commit_sha)
- .and_return(
- [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
- )
- end
+ let(:gpg_key) { nil }
it 'returns an invalid signature' do
expect(described_class.new(commit).signature).to have_attributes(
@@ -415,15 +289,15 @@ RSpec.describe Gitlab::Gpg::Commit do
end
context 'multiple commits with signatures' do
- let(:first_signature) { create(:gpg_signature) }
-
- let(:gpg_key) { create(:gpg_key, key: GpgHelpers::User2.public_key) }
- let(:second_signature) { create(:gpg_signature, gpg_key: gpg_key) }
+ let(:mock_signature_data?) { false }
+ let!(:first_signature) { create(:gpg_signature) }
+ let!(:gpg_key) { create(:gpg_key, key: GpgHelpers::User2.public_key) }
+ let!(:second_signature) { create(:gpg_signature, gpg_key: gpg_key) }
let!(:first_commit) { create(:commit, project: project, sha: first_signature.commit_sha) }
let!(:second_commit) { create(:commit, project: project, sha: second_signature.commit_sha) }
- let(:commits) do
+ let!(:commits) do
[first_commit, second_commit].map do |commit|
gpg_commit = described_class.new(commit)
@@ -442,4 +316,21 @@ RSpec.describe Gitlab::Gpg::Commit do
end
end
end
+
+ describe '#update_signature!' do
+ let!(:gpg_key) { nil }
+
+ let(:signature) { described_class.new(commit).signature }
+
+ it 'updates signature record' do
+ signature
+
+ create(:gpg_key, key: public_key, user: user)
+
+ stored_signature = CommitSignatures::GpgSignature.find_by_commit_sha(commit_sha)
+ expect { described_class.new(commit).update_signature!(stored_signature) }.to(
+ change { signature.reload.verification_status }.from('unknown_key').to('verified')
+ )
+ end
+ end
end
diff --git a/spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb b/spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb
new file mode 100644
index 00000000000..94e880d979d
--- /dev/null
+++ b/spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GrapeLogging::Loggers::ResponseLogger do
+ let(:logger) { described_class.new }
+
+ describe '#parameters' do
+ let(:response1) { 'response1' }
+ let(:response) { [response1] }
+
+ subject { logger.parameters(nil, response) }
+
+ it { expect(subject).to eq({ response_bytes: response1.bytesize }) }
+
+ context 'with multiple response parts' do
+ let(:response2) { 'response2' }
+ let(:response) { [response1, response2] }
+
+ it { expect(subject).to eq({ response_bytes: response1.bytesize + response2.bytesize }) }
+ end
+
+ context 'with log_response_length disabled' do
+ before do
+ stub_feature_flags(log_response_length: false)
+ end
+
+ it { expect(subject).to eq({}) }
+ end
+ end
+end
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
index 97613edee5e..8a2b5ae0d38 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb
@@ -79,7 +79,7 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection 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'))
+ expect(decoded_cursor(cursor)).to include('updated_at' => project.updated_at.to_s(:inspect))
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 61a79d90546..6574b3e3131 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
@@ -92,7 +92,7 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
let(:nodes) { Project.order(:updated_at) }
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'))
+ expect(decoded_cursor(cursor)).to include('updated_at' => project.updated_at.to_s(:inspect))
end
it 'includes the :id even when not specified in the order' do
@@ -104,7 +104,7 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
let(:nodes) { Project.order(:updated_at).order(:created_at) }
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'))
+ expect(decoded_cursor(cursor)).to include('updated_at' => project.updated_at.to_s(:inspect))
end
end
@@ -112,7 +112,7 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
let(:nodes) { Project.order(Arel.sql('projects.updated_at IS NULL')).order(:updated_at).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'))
+ expect(decoded_cursor(cursor)).to include('updated_at' => project.updated_at.to_s(:inspect))
end
end
end
diff --git a/spec/lib/gitlab/harbor/client_spec.rb b/spec/lib/gitlab/harbor/client_spec.rb
index bc5b593370a..4e80b8b53e3 100644
--- a/spec/lib/gitlab/harbor/client_spec.rb
+++ b/spec/lib/gitlab/harbor/client_spec.rb
@@ -3,12 +3,277 @@
require 'spec_helper'
RSpec.describe Gitlab::Harbor::Client do
- let(:harbor_integration) { build(:harbor_integration) }
+ let_it_be(:harbor_integration) { create(:harbor_integration) }
subject(:client) { described_class.new(harbor_integration) }
+ describe '#initialize' do
+ context 'if integration is nil' do
+ let(:harbor_integration) { nil }
+
+ it 'raises ConfigError' do
+ expect { client }.to raise_error(described_class::ConfigError)
+ end
+ end
+
+ context 'integration is provided' do
+ it 'is initialized successfully' do
+ expect { client }.not_to raise_error
+ end
+ end
+ end
+
+ describe '#get_repositories' do
+ context 'with valid params' do
+ let(:mock_response) do
+ [
+ {
+ "artifact_count": 1,
+ "creation_time": "2022-03-13T09:36:43.240Z",
+ "id": 1,
+ "name": "jihuprivate/busybox",
+ "project_id": 4,
+ "pull_count": 0,
+ "update_time": "2022-03-13T09:36:43.240Z"
+ }
+ ]
+ end
+
+ let(:mock_repositories) do
+ {
+ body: mock_response,
+ total_count: 2
+ }
+ end
+
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 200, body: mock_response.to_json, headers: { "x-total-count": 2 })
+ end
+
+ it 'get repositories' do
+ expect(client.get_repositories({}).deep_stringify_keys).to eq(mock_repositories.deep_stringify_keys)
+ end
+ end
+
+ context 'when harbor project does not exist' do
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 404, body: {}.to_json)
+ end
+
+ it 'raises Gitlab::Harbor::Client::Error' do
+ expect do
+ client.get_repositories({})
+ end.to raise_error(Gitlab::Harbor::Client::Error, 'request error')
+ end
+ end
+
+ context 'with invalid response' do
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 200, body: '[not json}')
+ end
+
+ it 'raises Gitlab::Harbor::Client::Error' do
+ expect do
+ client.get_repositories({})
+ end.to raise_error(Gitlab::Harbor::Client::Error, 'invalid response format')
+ end
+ end
+ end
+
+ describe '#get_artifacts' do
+ context 'with valid params' do
+ let(:mock_response) do
+ [
+ {
+ "digest": "sha256:661e8e44e5d7290fbd42d0495ab4ff6fdf1ad251a9f358969b3264a22107c14d",
+ "icon": "sha256:0048162a053eef4d4ce3fe7518615bef084403614f8bca43b40ae2e762e11e06",
+ "id": 1,
+ "project_id": 1,
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-04-23T08:04:08.901Z",
+ "repository_id": 1,
+ "size": 126745886,
+ "tags": [
+ {
+ "artifact_id": 1,
+ "id": 1,
+ "immutable": false,
+ "name": "2",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-04-23T08:04:08.920Z",
+ "repository_id": 1,
+ "signed": false
+ }
+ ],
+ "type": "IMAGE"
+ }
+ ]
+ end
+
+ let(:mock_artifacts) do
+ {
+ body: mock_response,
+ total_count: 1
+ }
+ end
+
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 200, body: mock_response.to_json, headers: { "x-total-count": 1 })
+ end
+
+ it 'get artifacts' do
+ expect(client.get_artifacts({ repository_name: 'test' })
+ .deep_stringify_keys).to eq(mock_artifacts.deep_stringify_keys)
+ end
+ end
+
+ context 'when harbor repository does not exist' do
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 404, body: {}.to_json)
+ end
+
+ it 'raises Gitlab::Harbor::Client::Error' do
+ expect do
+ client.get_artifacts({ repository_name: 'test' })
+ end.to raise_error(Gitlab::Harbor::Client::Error, 'request error')
+ end
+ end
+
+ context 'with invalid response' do
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 200, body: '[not json}')
+ end
+
+ it 'raises Gitlab::Harbor::Client::Error' do
+ expect do
+ client.get_artifacts({ repository_name: 'test' })
+ end.to raise_error(Gitlab::Harbor::Client::Error, 'invalid response format')
+ end
+ end
+ end
+
+ describe '#get_tags' do
+ context 'with valid params' do
+ let(:mock_response) do
+ [
+ {
+ "artifact_id": 1,
+ "id": 1,
+ "immutable": false,
+ "name": "2",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-04-23T08:04:08.920Z",
+ "repository_id": 1,
+ "signed": false
+ }
+ ]
+ end
+
+ let(:mock_tags) do
+ {
+ body: mock_response,
+ total_count: 1
+ }
+ end
+
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts/1/tags")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 200, body: mock_response.to_json, headers: { "x-total-count": 1 })
+ end
+
+ it 'get tags' do
+ expect(client.get_tags({ repository_name: 'test', artifact_name: '1' })
+ .deep_stringify_keys).to eq(mock_tags.deep_stringify_keys)
+ end
+ end
+
+ context 'when harbor artifact does not exist' do
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts/1/tags")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 404, body: {}.to_json)
+ end
+
+ it 'raises Gitlab::Harbor::Client::Error' do
+ expect do
+ client.get_tags({ repository_name: 'test', artifact_name: '1' })
+ end.to raise_error(Gitlab::Harbor::Client::Error, 'request error')
+ end
+ end
+
+ context 'with invalid response' do
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts/1/tags")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 200, body: '[not json}')
+ end
+
+ it 'raises Gitlab::Harbor::Client::Error' do
+ expect do
+ client.get_tags({ repository_name: 'test', artifact_name: '1' })
+ end.to raise_error(Gitlab::Harbor::Client::Error, 'invalid response format')
+ end
+ end
+ end
+
describe '#ping' do
- let!(:harbor_ping_request) { stub_harbor_request("https://demo.goharbor.io/api/v2.0/ping") }
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/ping")
+ .with(
+ headers: {
+ 'Content-Type': 'application/json'
+ })
+ .to_return(status: 200, body: 'pong')
+ end
it "calls api/v2.0/ping successfully" do
expect(client.ping).to eq(success: true)
diff --git a/spec/lib/gitlab/harbor/query_spec.rb b/spec/lib/gitlab/harbor/query_spec.rb
new file mode 100644
index 00000000000..dcb9a16b27b
--- /dev/null
+++ b/spec/lib/gitlab/harbor/query_spec.rb
@@ -0,0 +1,375 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Harbor::Query do
+ let_it_be(:harbor_integration) { create(:harbor_integration) }
+
+ let(:params) { {} }
+
+ subject(:query) { described_class.new(harbor_integration, ActionController::Parameters.new(params)) }
+
+ describe 'Validations' do
+ context 'page' do
+ context 'with valid page' do
+ let(:params) { { page: 1 } }
+
+ it 'initialize successfully' do
+ expect(query.valid?).to eq(true)
+ end
+ end
+
+ context 'with invalid page' do
+ let(:params) { { page: -1 } }
+
+ it 'initialize failed' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+ end
+
+ context 'limit' do
+ context 'with valid limit' do
+ let(:params) { { limit: 1 } }
+
+ it 'initialize successfully' do
+ expect(query.valid?).to eq(true)
+ end
+ end
+
+ context 'with invalid limit' do
+ context 'with limit less than 0' do
+ let(:params) { { limit: -1 } }
+
+ it 'initialize failed' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+
+ context 'with limit greater than 25' do
+ let(:params) { { limit: 26 } }
+
+ it 'initialize failed' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+ end
+ end
+
+ context 'repository_id' do
+ context 'with valid repository_id' do
+ let(:params) { { repository_id: 'test' } }
+
+ it 'initialize successfully' do
+ expect(query.valid?).to eq(true)
+ end
+ end
+
+ context 'with invalid repository_id' do
+ let(:params) { { repository_id: 'test@@' } }
+
+ it 'initialize failed' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+ end
+
+ context 'artifact_id' do
+ context 'with valid artifact_id' do
+ let(:params) { { artifact_id: 'test' } }
+
+ it 'initialize successfully' do
+ expect(query.valid?).to eq(true)
+ end
+ end
+
+ context 'with invalid artifact_id' do
+ let(:params) { { artifact_id: 'test@@' } }
+
+ it 'initialize failed' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+ end
+
+ context 'sort' do
+ context 'with valid sort' do
+ let(:params) { { sort: 'creation_time desc' } }
+
+ it 'initialize successfully' do
+ expect(query.valid?).to eq(true)
+ end
+ end
+
+ context 'with invalid sort' do
+ let(:params) { { sort: 'blabla desc' } }
+
+ it 'initialize failed' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+ end
+
+ context 'search' do
+ context 'with valid search' do
+ let(:params) { { search: 'name=desc' } }
+
+ it 'initialize successfully' do
+ expect(query.valid?).to eq(true)
+ end
+ end
+
+ context 'with invalid search' do
+ let(:params) { { search: 'blabla' } }
+
+ it 'initialize failed' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+ end
+ end
+
+ describe '#repositories' do
+ let(:response) { { total_count: 0, repositories: [] } }
+
+ def expect_query_option_include(expected_params)
+ expect_next_instance_of(Gitlab::Harbor::Client) do |client|
+ expect(client).to receive(:get_repositories)
+ .with(hash_including(expected_params))
+ .and_return(response)
+ end
+
+ query.repositories
+ end
+
+ context 'when params is {}' do
+ it 'fills default params' do
+ expect_query_option_include(page_size: 10, page: 1)
+ end
+ end
+
+ context 'when params contains options' do
+ let(:params) { { search: 'name=bu', sort: 'creation_time desc', limit: 20, page: 3 } }
+
+ it 'fills params with standard of Harbor' do
+ expect_query_option_include(q: 'name=~bu', sort: '-creation_time', page_size: 20, page: 3)
+ end
+ end
+
+ context 'when params contains invalid sort option' do
+ let(:params) { { search: 'name=bu', sort: 'blabla desc', limit: 20, page: 3 } }
+
+ it 'ignores invalid sort params' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+
+ context 'when client.get_repositories returns data' do
+ let(:response_with_data) do
+ {
+ total_count: 1,
+ body:
+ [
+ {
+ "id": 3,
+ "name": "testproject/thirdbusybox",
+ "artifact_count": 1,
+ "creation_time": "2022-03-15T07:12:14.479Z",
+ "update_time": "2022-03-15T07:12:14.479Z",
+ "project_id": 3,
+ "pull_count": 0
+ }.with_indifferent_access
+ ]
+ }
+ end
+
+ it 'returns the right repositories data' do
+ expect_next_instance_of(Gitlab::Harbor::Client) do |client|
+ expect(client).to receive(:get_repositories)
+ .with(hash_including(page_size: 10, page: 1))
+ .and_return(response_with_data)
+ end
+
+ expect(query.repositories.first).to include(
+ "name": "testproject/thirdbusybox",
+ "artifact_count": 1
+ )
+ end
+ end
+ end
+
+ describe '#artifacts' do
+ let(:response) { { total_count: 0, artifacts: [] } }
+
+ def expect_query_option_include(expected_params)
+ expect_next_instance_of(Gitlab::Harbor::Client) do |client|
+ expect(client).to receive(:get_artifacts)
+ .with(hash_including(expected_params))
+ .and_return(response)
+ end
+
+ query.artifacts
+ end
+
+ context 'when params is {}' do
+ it 'fills default params' do
+ expect_query_option_include(page_size: 10, page: 1)
+ end
+ end
+
+ context 'when params contains options' do
+ let(:params) do
+ { search: 'tags=1', repository_id: 'jihuprivate', sort: 'creation_time desc', limit: 20, page: 3 }
+ end
+
+ it 'fills params with standard of Harbor' do
+ expect_query_option_include(q: 'tags=~1', sort: '-creation_time', page_size: 20, page: 3)
+ end
+ end
+
+ context 'when params contains invalid sort option' do
+ let(:params) { { search: 'tags=1', repository_id: 'jihuprivate', sort: 'blabla desc', limit: 20, page: 3 } }
+
+ it 'ignores invalid sort params' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+
+ context 'when client.get_artifacts returns data' do
+ let(:response_with_data) do
+ {
+ total_count: 1,
+ body:
+ [
+ {
+ "digest": "sha256:14d4f50961544fdb669075c442509f194bdc4c0e344bde06e35dbd55af842a38",
+ "icon": "sha256:0048162a053eef4d4ce3fe7518615bef084403614f8bca43b40ae2e762e11e06",
+ "id": 5,
+ "project_id": 14,
+ "push_time": "2022-03-22T09:04:56.170Z",
+ "repository_id": 5,
+ "size": 774790,
+ "tags": [
+ {
+ "artifact_id": 5,
+ "id": 7,
+ "immutable": false,
+ "name": "2",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-03-22T09:05:04.844Z",
+ "repository_id": 5
+ },
+ {
+ "artifact_id": 5,
+ "id": 6,
+ "immutable": false,
+ "name": "1",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-03-22T09:04:56.186Z",
+ "repository_id": 5
+ }
+ ],
+ "type": "IMAGE"
+ }.with_indifferent_access
+ ]
+ }
+ end
+
+ it 'returns the right artifacts data' do
+ expect_next_instance_of(Gitlab::Harbor::Client) do |client|
+ expect(client).to receive(:get_artifacts)
+ .with(hash_including(page_size: 10, page: 1))
+ .and_return(response_with_data)
+ end
+
+ artifact = query.artifacts.first
+
+ expect(artifact).to include(
+ "digest": "sha256:14d4f50961544fdb669075c442509f194bdc4c0e344bde06e35dbd55af842a38",
+ "push_time": "2022-03-22T09:04:56.170Z"
+ )
+ expect(artifact["tags"].size).to eq(2)
+ end
+ end
+ end
+
+ describe '#tags' do
+ let(:response) { { total_count: 0, tags: [] } }
+
+ def expect_query_option_include(expected_params)
+ expect_next_instance_of(Gitlab::Harbor::Client) do |client|
+ expect(client).to receive(:get_tags)
+ .with(hash_including(expected_params))
+ .and_return(response)
+ end
+
+ query.tags
+ end
+
+ context 'when params is {}' do
+ it 'fills default params' do
+ expect_query_option_include(page_size: 10, page: 1)
+ end
+ end
+
+ context 'when params contains options' do
+ let(:params) { { repository_id: 'jihuprivate', sort: 'creation_time desc', limit: 20, page: 3 } }
+
+ it 'fills params with standard of Harbor' do
+ expect_query_option_include(sort: '-creation_time', page_size: 20, page: 3)
+ end
+ end
+
+ context 'when params contains invalid sort option' do
+ let(:params) { { repository_id: 'jihuprivate', artifact_id: 'test', sort: 'blabla desc', limit: 20, page: 3 } }
+
+ it 'ignores invalid sort params' do
+ expect(query.valid?).to eq(false)
+ end
+ end
+
+ context 'when client.get_tags returns data' do
+ let(:response_with_data) do
+ {
+ total_count: 2,
+ body:
+ [
+ {
+ "artifact_id": 5,
+ "id": 7,
+ "immutable": false,
+ "name": "2",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-03-22T09:05:04.844Z",
+ "repository_id": 5
+ },
+ {
+ "artifact_id": 5,
+ "id": 6,
+ "immutable": false,
+ "name": "1",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-03-22T09:04:56.186Z",
+ "repository_id": 5
+ }.with_indifferent_access
+ ]
+ }
+ end
+
+ it 'returns the right tags data' do
+ expect_next_instance_of(Gitlab::Harbor::Client) do |client|
+ expect(client).to receive(:get_tags)
+ .with(hash_including(page_size: 10, page: 1))
+ .and_return(response_with_data)
+ end
+
+ tag = query.tags.first
+
+ expect(tag).to include(
+ "immutable": false,
+ "push_time": "2022-03-22T09:05:04.844Z"
+ )
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/hash_digest/facade_spec.rb b/spec/lib/gitlab/hash_digest/facade_spec.rb
deleted file mode 100644
index b352744513e..00000000000
--- a/spec/lib/gitlab/hash_digest/facade_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::HashDigest::Facade do
- describe '.hexdigest' do
- let(:plaintext) { 'something that is plaintext' }
-
- let(:sha256_hash) { OpenSSL::Digest::SHA256.hexdigest(plaintext) }
- let(:md5_hash) { Digest::MD5.hexdigest(plaintext) } # rubocop:disable Fips/MD5
-
- it 'uses SHA256' do
- expect(described_class.hexdigest(plaintext)).to eq(sha256_hash)
- end
-
- context 'when feature flags is not available' do
- before do
- allow(Feature).to receive(:feature_flags_available?).and_return(false)
- end
-
- it 'uses MD5' do
- expect(described_class.hexdigest(plaintext)).to eq(md5_hash)
- end
- end
-
- context 'when active_support_hash_digest_sha256 FF is disabled' do
- before do
- stub_feature_flags(active_support_hash_digest_sha256: false)
- end
-
- it 'uses MD5' do
- expect(described_class.hexdigest(plaintext)).to eq(md5_hash)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
index 771fc0218e2..25b84a67ab2 100644
--- a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
@@ -7,13 +7,12 @@ RSpec.describe Gitlab::HookData::MergeRequestBuilder do
let(:builder) { described_class.new(merge_request) }
- describe '#build' do
- let(:data) { builder.build }
+ describe '.safe_hook_attributes' do
+ let(:safe_attribute_keys) { described_class.safe_hook_attributes }
it 'includes safe attribute' do
- %w[
+ expected_safe_attribute_keys = %i[
assignee_id
- assignee_ids
author_id
blocking_discussions_resolved
created_at
@@ -32,17 +31,21 @@ RSpec.describe Gitlab::HookData::MergeRequestBuilder do
milestone_id
source_branch
source_project_id
- state
+ state_id
target_branch
target_project_id
time_estimate
title
updated_at
updated_by_id
- ].each do |key|
- expect(data).to include(key)
- end
+ ].freeze
+
+ expect(safe_attribute_keys).to match_array(expected_safe_attribute_keys)
end
+ end
+
+ describe '#build' do
+ let(:data) { builder.build }
%i[source target].each do |key|
describe "#{key} key" do
@@ -52,17 +55,30 @@ RSpec.describe Gitlab::HookData::MergeRequestBuilder do
end
end
+ it 'includes safe attributes' do
+ expect(data).to include(*described_class.safe_hook_attributes)
+ end
+
it 'includes additional attrs' do
- expect(data).to include(:source)
- expect(data).to include(:target)
- expect(data).to include(:last_commit)
- expect(data).to include(:work_in_progress)
- expect(data).to include(:total_time_spent)
- expect(data).to include(:time_change)
- expect(data).to include(:human_time_estimate)
- expect(data).to include(:human_total_time_spent)
- expect(data).to include(:human_time_change)
- expect(data).to include(:labels)
+ expected_additional_attributes = %w[
+ description
+ url
+ last_commit
+ work_in_progress
+ total_time_spent
+ time_change
+ human_total_time_spent
+ human_time_change
+ human_time_estimate
+ assignee_ids
+ assignee_id
+ labels
+ state
+ blocking_discussions_resolved
+ first_contribution
+ ].freeze
+
+ expect(data).to include(*expected_additional_attributes)
end
context 'when the MR has an image in the description' do
diff --git a/spec/lib/gitlab/http_connection_adapter_spec.rb b/spec/lib/gitlab/http_connection_adapter_spec.rb
index cde8376febd..a241a4b6490 100644
--- a/spec/lib/gitlab/http_connection_adapter_spec.rb
+++ b/spec/lib/gitlab/http_connection_adapter_spec.rb
@@ -15,18 +15,6 @@ RSpec.describe Gitlab::HTTPConnectionAdapter do
stub_all_dns('https://example.org', ip_address: '93.184.216.34')
end
- context 'with use_read_total_timeout option' do
- let(:options) { { use_read_total_timeout: true } }
-
- it 'sets up the connection using the Gitlab::NetHttpAdapter' do
- expect(connection).to be_a(Gitlab::NetHttpAdapter)
- expect(connection.address).to eq('93.184.216.34')
- expect(connection.hostname_override).to eq('example.org')
- expect(connection.addr_port).to eq('example.org')
- expect(connection.port).to eq(443)
- end
- end
-
context 'when local requests are allowed' do
let(:options) { { allow_local_requests: true } }
diff --git a/spec/lib/gitlab/http_spec.rb b/spec/lib/gitlab/http_spec.rb
index c2fb987d195..929fd37ee40 100644
--- a/spec/lib/gitlab/http_spec.rb
+++ b/spec/lib/gitlab/http_spec.rb
@@ -83,67 +83,25 @@ RSpec.describe Gitlab::HTTP do
subject(:request_slow_responder) { described_class.post('http://example.org', **options) }
- shared_examples 'tracks the timeout but does not raise an error' do
- specify :aggregate_failures do
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
- an_instance_of(Gitlab::HTTP::ReadTotalTimeout)
- ).once
-
- expect { request_slow_responder }.not_to raise_error
- end
-
- it 'still calls the block' do
- expect { |b| described_class.post('http://example.org', **options, &b) }.to yield_successive_args('a', 'b')
- end
- end
-
- shared_examples 'does not track or raise timeout error' do
- specify :aggregate_failures do
- expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
-
- expect { request_slow_responder }.not_to raise_error
- end
- end
-
- it_behaves_like 'tracks the timeout but does not raise an error'
-
- context 'and use_read_total_timeout option is truthy' do
- let(:options) { { use_read_total_timeout: true } }
-
- it 'raises an error' do
- expect { request_slow_responder }.to raise_error(Gitlab::HTTP::ReadTotalTimeout, /Request timed out after ?([0-9]*[.])?[0-9]+ seconds/)
- end
+ it 'raises an error' do
+ expect { request_slow_responder }.to raise_error(Gitlab::HTTP::ReadTotalTimeout, /Request timed out after ?([0-9]*[.])?[0-9]+ seconds/)
end
context 'and timeout option is greater than DEFAULT_READ_TOTAL_TIMEOUT' do
let(:options) { { timeout: 10.seconds } }
- it_behaves_like 'does not track or raise timeout error'
+ it 'does not raise an error' do
+ expect { request_slow_responder }.not_to raise_error
+ end
end
context 'and stream_body option is truthy' do
let(:options) { { stream_body: true } }
- it_behaves_like 'does not track or raise timeout error'
-
- context 'but skip_read_total_timeout option is falsey' do
- let(:options) { { stream_body: true, skip_read_total_timeout: false } }
-
- it_behaves_like 'tracks the timeout but does not raise an error'
+ it 'does not raise an error' do
+ expect { request_slow_responder }.not_to raise_error
end
end
-
- context 'and skip_read_total_timeout option is truthy' do
- let(:options) { { skip_read_total_timeout: true } }
-
- it_behaves_like 'does not track or raise timeout error'
- end
-
- context 'and skip_read_total_timeout option is falsely' do
- let(:options) { { skip_read_total_timeout: false } }
-
- it_behaves_like 'tracks the timeout but does not raise an error'
- end
end
it 'calls a block' do
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 9d516c8d7ac..af910b08fae 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -420,6 +420,8 @@ project:
- zentao_integration
# dingtalk_integration JiHu-specific, see https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/417
- dingtalk_integration
+# dingtalk_integration JiHu-specific, see https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/640
+- feishu_integration
- redmine_integration
- youtrack_integration
- custom_issue_tracker_integration
@@ -557,7 +559,6 @@ project:
- packages
- package_files
- packages_cleanup_policy
-- tracing_setting
- alerting_setting
- project_setting
- webide_pipelines
@@ -604,6 +605,7 @@ project:
- incident_management_oncall_schedules
- incident_management_oncall_rotations
- incident_management_escalation_policies
+- incident_management_issuable_escalation_statuses
- debian_distributions
- merge_request_metrics
- security_orchestration_policy_configuration
@@ -695,8 +697,6 @@ epic_issues:
feature_flag_issues:
- issue
- feature_flag
-tracing_setting:
-- project
reviews:
- project
- merge_request
diff --git a/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb b/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb
index 03f522ae490..3f73a730744 100644
--- a/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb
+++ b/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb
@@ -171,4 +171,27 @@ RSpec.describe Gitlab::ImportExport::Json::StreamingSerializer do
expect(described_class.batch_size(exportable)).to eq(described_class::BATCH_SIZE)
end
end
+
+ describe '#serialize_relation' do
+ context 'when record is a merge request' do
+ let(:json_writer) do
+ Class.new do
+ def write_relation_array(_, _, enumerator)
+ enumerator.each { _1 }
+ end
+ end.new
+ end
+
+ it 'removes cached external diff' do
+ merge_request = create(:merge_request, source_project: exportable, target_project: exportable)
+ cache_dir = merge_request.merge_request_diff.send(:external_diff_cache_dir)
+
+ expect(subject).to receive(:remove_cached_external_diff).with(merge_request).twice
+
+ subject.serialize_relation({ merge_requests: { include: [] } })
+
+ expect(Dir.exist?(cache_dir)).to eq(false)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/import_export/members_mapper_spec.rb b/spec/lib/gitlab/import_export/members_mapper_spec.rb
index 87ca899a87d..d7ad34255c1 100644
--- a/spec/lib/gitlab/import_export/members_mapper_spec.rb
+++ b/spec/lib/gitlab/import_export/members_mapper_spec.rb
@@ -258,7 +258,7 @@ RSpec.describe Gitlab::ImportExport::MembersMapper do
end
before do
- group.add_users([user, user2], GroupMember::DEVELOPER)
+ group.add_members([user, user2], GroupMember::DEVELOPER)
end
it 'maps the project member' do
@@ -281,7 +281,7 @@ RSpec.describe Gitlab::ImportExport::MembersMapper do
end
before do
- group.add_users([user, user2], GroupMember::DEVELOPER)
+ group.add_members([user, user2], GroupMember::DEVELOPER)
end
it 'maps the importer' do
@@ -315,7 +315,7 @@ RSpec.describe Gitlab::ImportExport::MembersMapper do
shared_examples_for 'it fetches the access level from parent group' do
before do
- group.add_users([user], group_access_level)
+ group.add_members([user], group_access_level)
end
it "and resolves it correctly" do
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 d3397e89f1f..157cd408da9 100644
--- a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
@@ -383,21 +383,52 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do
end
end
- it 'restores releases with links & milestones' do
- release = @project.releases.last
- link = release.links.last
+ context 'restores releases' do
+ it 'with links & milestones' do
+ release = @project.releases.last
+ link = release.links.last
+
+ aggregate_failures do
+ expect(release.tag).to eq('release-1.2')
+ expect(release.description).to eq('Some release notes')
+ expect(release.name).to eq('release-1.2')
+ expect(release.sha).to eq('903de3a8bd5573f4a049b1457d28bc1592ba6bf9')
+ expect(release.released_at).to eq('2019-12-27T10:17:14.615Z')
+ expect(release.milestone_releases.count).to eq(1)
+ expect(release.milestone_releases.first.milestone.title).to eq('test milestone')
+
+ expect(link.url).to eq('http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download')
+ expect(link.name).to eq('release-1.2.dmg')
+ end
+ end
- aggregate_failures do
- expect(release.tag).to eq('release-1.1')
- expect(release.description).to eq('Some release notes')
- expect(release.name).to eq('release-1.1')
- expect(release.sha).to eq('901de3a8bd5573f4a049b1457d28bc1592ba6bf9')
- expect(release.released_at).to eq('2019-12-26T10:17:14.615Z')
- expect(release.milestone_releases.count).to eq(1)
- expect(release.milestone_releases.first.milestone.title).to eq('test milestone')
-
- expect(link.url).to eq('http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download')
- expect(link.name).to eq('release-1.1.dmg')
+ context 'with author' do
+ it 'as ghost user when imported release author is empty' do
+ release = @project.releases.first
+
+ aggregate_failures do
+ expect(release.tag).to eq('release-1.0')
+ expect(release.author_id).to eq(User.select(:id).ghost.id)
+ end
+ end
+
+ it 'as existing member when imported release author is matched with existing user' do
+ release = @project.releases.second
+
+ aggregate_failures do
+ expect(release.tag).to eq('release-1.1')
+ expect(release.author_id).to eq(@existing_members.first.id)
+ end
+ end
+
+ it 'as import user when imported release author cannot be matched' do
+ release = @project.releases.last
+
+ aggregate_failures do
+ expect(release.tag).to eq('release-1.2')
+ expect(release.author_id).to eq(@user.id)
+ end
+ end
end
end
@@ -441,7 +472,7 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do
end
it 'has a new CI build token' do
- expect(Ci::Build.where(token: 'abcd')).to be_empty
+ expect(Ci::Build.find_by_token('abcd')).to be_nil
end
end
@@ -568,20 +599,10 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do
context 'when there is an existing build with build token' do
before do
- create(:ci_build, token: 'abcd')
- end
-
- it_behaves_like 'restores project successfully',
- issues: 1,
- labels: 2,
- label_with_priorities: 'A project label',
- milestones: 1,
- first_issue_labels: 1
- end
-
- context 'when there is an existing build with build token' do
- before do
- create(:ci_build, token: 'abcd')
+ create(:ci_build).tap do |job|
+ job.set_token('abcd')
+ job.save!
+ end
end
it_behaves_like 'restores project successfully',
@@ -885,7 +906,7 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do
context 'with group visibility' do
before do
group = create(:group, visibility_level: group_visibility)
- group.add_users([user], GroupMember::MAINTAINER)
+ group.add_members([user], GroupMember::MAINTAINER)
project.update!(group: group)
end
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index d7f07a1eadf..bd60bb53d49 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -564,8 +564,6 @@ Project:
- suggestion_commit_message
- merge_commit_template
- squash_commit_template
-ProjectTracingSetting:
-- external_url
Author:
- name
ProjectFeature:
diff --git a/spec/lib/gitlab/issuable/clone/attributes_rewriter_spec.rb b/spec/lib/gitlab/issuable/clone/attributes_rewriter_spec.rb
new file mode 100644
index 00000000000..dbb753d5b9f
--- /dev/null
+++ b/spec/lib/gitlab/issuable/clone/attributes_rewriter_spec.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Issuable::Clone::AttributesRewriter do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project1) { create(:project, :public, group: group) }
+ let_it_be(:project2) { create(:project, :public, group: group) }
+ let_it_be(:original_issue) { create(:issue, project: project1) }
+
+ let(:new_attributes) { described_class.new(user, original_issue, project2).execute }
+
+ context 'with missing target parent' do
+ it 'raises an ArgumentError' do
+ expect { described_class.new(user, original_issue, nil) }.to raise_error ArgumentError
+ end
+ end
+
+ context 'setting labels' do
+ it 'sets labels present in the new project and group labels' do
+ project1_label_1 = create(:label, title: 'label1', project: project1)
+ project1_label_2 = create(:label, title: 'label2', project: project1)
+ project2_label_1 = create(:label, title: 'label1', project: project2)
+ group_label = create(:group_label, title: 'group_label', group: group)
+ create(:label, title: 'label3', project: project2)
+
+ original_issue.update!(labels: [project1_label_1, project1_label_2, group_label])
+
+ expect(new_attributes[:label_ids]).to match_array([project2_label_1.id, group_label.id])
+ end
+
+ it 'does not set any labels when not used on the original issue' do
+ expect(new_attributes[:label_ids]).to be_empty
+ end
+ end
+
+ context 'setting milestones' do
+ it 'sets milestone to nil when old issue milestone is not in the new project' do
+ milestone = create(:milestone, title: 'milestone', project: project1)
+
+ original_issue.update!(milestone: milestone)
+
+ expect(new_attributes[:milestone_id]).to be_nil
+ end
+
+ it 'copies the milestone when old issue milestone title is in the new project' do
+ milestone_project1 = create(:milestone, title: 'milestone', project: project1)
+ milestone_project2 = create(:milestone, title: 'milestone', project: project2)
+
+ original_issue.update!(milestone: milestone_project1)
+
+ expect(new_attributes[:milestone_id]).to eq(milestone_project2.id)
+ end
+
+ it 'copies the milestone when old issue milestone is a group milestone' do
+ milestone = create(:milestone, title: 'milestone', group: group)
+
+ original_issue.update!(milestone: milestone)
+
+ expect(new_attributes[:milestone_id]).to eq(milestone.id)
+ end
+
+ context 'when include_milestone is false' do
+ let(:new_attributes) { described_class.new(user, original_issue, project2).execute(include_milestone: false) }
+
+ it 'does not return any milestone' do
+ milestone = create(:milestone, title: 'milestone', group: group)
+
+ original_issue.update!(milestone: milestone)
+
+ expect(new_attributes[:milestone_id]).to be_nil
+ end
+ end
+ end
+
+ context 'when target parent is a group' do
+ let(:new_attributes) { described_class.new(user, original_issue, group).execute }
+
+ context 'setting labels' do
+ let(:project_label1) { create(:label, title: 'label1', project: project1) }
+ let!(:project_label2) { create(:label, title: 'label2', project: project1) }
+ let(:group_label1) { create(:group_label, title: 'group_label', group: group) }
+ let!(:group_label2) { create(:group_label, title: 'label2', group: group) }
+
+ it 'keeps group labels and merges project labels where possible' do
+ original_issue.update!(labels: [project_label1, project_label2, group_label1])
+
+ expect(new_attributes[:label_ids]).to match_array([group_label1.id, group_label2.id])
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/issuable/clone/copy_resource_events_service_spec.rb b/spec/lib/gitlab/issuable/clone/copy_resource_events_service_spec.rb
new file mode 100644
index 00000000000..1700939f49e
--- /dev/null
+++ b/spec/lib/gitlab/issuable/clone/copy_resource_events_service_spec.rb
@@ -0,0 +1,91 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Issuable::Clone::CopyResourceEventsService do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project1) { create(:project, :public, group: group) }
+ let_it_be(:project2) { create(:project, :public, group: group) }
+ let_it_be(:new_issue) { create(:issue, project: project2) }
+ let_it_be_with_reload(:original_issue) { create(:issue, project: project1) }
+
+ subject { described_class.new(user, original_issue, new_issue) }
+
+ it 'copies the resource label events' do
+ resource_label_events = create_list(:resource_label_event, 2, issue: original_issue)
+
+ subject.execute
+
+ expected = resource_label_events.map(&:label_id)
+
+ expect(new_issue.resource_label_events.map(&:label_id)).to match_array(expected)
+ end
+
+ context 'with existing milestone events' do
+ let!(:milestone1_project1) { create(:milestone, title: 'milestone1', project: project1) }
+ let!(:milestone2_project1) { create(:milestone, title: 'milestone2', project: project1) }
+ let!(:milestone3_project1) { create(:milestone, title: 'milestone3', project: project1) }
+
+ let!(:milestone1_project2) { create(:milestone, title: 'milestone1', project: project2) }
+ let!(:milestone2_project2) { create(:milestone, title: 'milestone2', project: project2) }
+
+ before do
+ original_issue.update!(milestone: milestone2_project1)
+
+ create_event(milestone1_project1)
+ create_event(milestone2_project1)
+ create_event(nil, 'remove')
+ create_event(milestone3_project1)
+ end
+
+ it 'copies existing resource milestone events' do
+ subject.execute
+
+ new_issue_milestone_events = new_issue.reload.resource_milestone_events
+ expect(new_issue_milestone_events.count).to eq(3)
+
+ expect_milestone_event(
+ new_issue_milestone_events.first, milestone: milestone1_project2, action: 'add', state: 'opened'
+ )
+ expect_milestone_event(
+ new_issue_milestone_events.second, milestone: milestone2_project2, action: 'add', state: 'opened'
+ )
+ expect_milestone_event(
+ new_issue_milestone_events.third, milestone: nil, action: 'remove', state: 'opened'
+ )
+ end
+
+ def create_event(milestone, action = 'add')
+ create(:resource_milestone_event, issue: original_issue, milestone: milestone, action: action)
+ end
+
+ def expect_milestone_event(event, expected_attrs)
+ expect(event.milestone_id).to eq(expected_attrs[:milestone]&.id)
+ expect(event.action).to eq(expected_attrs[:action])
+ expect(event.state).to eq(expected_attrs[:state])
+ end
+ end
+
+ context 'with existing state events' do
+ let!(:event1) { create(:resource_state_event, issue: original_issue, state: 'opened') }
+ let!(:event2) { create(:resource_state_event, issue: original_issue, state: 'closed') }
+ let!(:event3) { create(:resource_state_event, issue: original_issue, state: 'reopened') }
+
+ it 'copies existing state events as expected' do
+ subject.execute
+
+ state_events = new_issue.reload.resource_state_events
+ expect(state_events.size).to eq(3)
+
+ expect_state_event(state_events.first, issue: new_issue, state: 'opened')
+ expect_state_event(state_events.second, issue: new_issue, state: 'closed')
+ expect_state_event(state_events.third, issue: new_issue, state: 'reopened')
+ end
+
+ def expect_state_event(event, expected_attrs)
+ expect(event.issue_id).to eq(expected_attrs[:issue]&.id)
+ expect(event.state).to eq(expected_attrs[:state])
+ end
+ end
+end
diff --git a/spec/lib/gitlab/jira_import/issue_serializer_spec.rb b/spec/lib/gitlab/jira_import/issue_serializer_spec.rb
index 198d2db234c..30ad24472b4 100644
--- a/spec/lib/gitlab/jira_import/issue_serializer_spec.rb
+++ b/spec/lib/gitlab/jira_import/issue_serializer_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe Gitlab::JiraImport::IssueSerializer do
let_it_be(:group_label) { create(:group_label, group: group, title: 'dev') }
let_it_be(:current_user) { create(:user) }
let_it_be(:user) { create(:user) }
+ let_it_be(:issue_type_id) { WorkItems::Type.default_issue_type.id }
let(:iid) { 5 }
let(:key) { 'PROJECT-5' }
@@ -54,7 +55,7 @@ RSpec.describe Gitlab::JiraImport::IssueSerializer do
let(:params) { { iid: iid } }
- subject { described_class.new(project, jira_issue, current_user.id, params).execute }
+ subject { described_class.new(project, jira_issue, current_user.id, issue_type_id, params).execute }
let(:expected_description) do
<<~MD
@@ -74,6 +75,7 @@ RSpec.describe Gitlab::JiraImport::IssueSerializer do
expect(subject).to eq(
iid: iid,
project_id: project.id,
+ namespace_id: project.project_namespace_id,
description: expected_description.strip,
title: "[#{key}] #{summary}",
state_id: 1,
@@ -81,7 +83,8 @@ RSpec.describe Gitlab::JiraImport::IssueSerializer do
created_at: created_at,
author_id: current_user.id,
assignee_ids: nil,
- label_ids: [project_label.id, group_label.id] + Label.reorder(id: :asc).last(2).pluck(:id)
+ label_ids: [project_label.id, group_label.id] + Label.reorder(id: :asc).last(2).pluck(:id),
+ work_item_type_id: issue_type_id
)
end
diff --git a/spec/lib/gitlab/jira_import/issues_importer_spec.rb b/spec/lib/gitlab/jira_import/issues_importer_spec.rb
index 565a9ad17e1..1bc052ee0b6 100644
--- a/spec/lib/gitlab/jira_import/issues_importer_spec.rb
+++ b/spec/lib/gitlab/jira_import/issues_importer_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe Gitlab::JiraImport::IssuesImporter do
let_it_be(:project) { create(:project) }
let_it_be(:jira_import) { create(:jira_import_state, project: project, user: current_user) }
let_it_be(:jira_integration) { create(:jira_integration, project: project) }
+ let_it_be(:default_issue_type_id) { WorkItems::Type.default_issue_type.id }
subject { described_class.new(project) }
@@ -47,12 +48,22 @@ RSpec.describe Gitlab::JiraImport::IssuesImporter do
count.times do |i|
if raise_exception_on_even_mocks && i.even?
- expect(Gitlab::JiraImport::IssueSerializer).to receive(:new)
- .with(project, jira_issues[i], current_user.id, { iid: next_iid + 1 }).and_raise('Some error')
+ expect(Gitlab::JiraImport::IssueSerializer).to receive(:new).with(
+ project,
+ jira_issues[i],
+ current_user.id,
+ default_issue_type_id,
+ { iid: next_iid + 1 }
+ ).and_raise('Some error')
else
next_iid += 1
- expect(Gitlab::JiraImport::IssueSerializer).to receive(:new)
- .with(project, jira_issues[i], current_user.id, { iid: next_iid }).and_return(serializer)
+ expect(Gitlab::JiraImport::IssueSerializer).to receive(:new).with(
+ project,
+ jira_issues[i],
+ current_user.id,
+ default_issue_type_id,
+ { iid: next_iid }
+ ).and_return(serializer)
end
end
end
diff --git a/spec/lib/gitlab/lograge/custom_options_spec.rb b/spec/lib/gitlab/lograge/custom_options_spec.rb
index 58b05be6ff9..090b79c5d3c 100644
--- a/spec/lib/gitlab/lograge/custom_options_spec.rb
+++ b/spec/lib/gitlab/lograge/custom_options_spec.rb
@@ -25,7 +25,8 @@ RSpec.describe Gitlab::Lograge::CustomOptions do
remote_ip: '192.168.1.2',
ua: 'Nyxt',
queue_duration_s: 0.2,
- etag_route: '/etag'
+ etag_route: '/etag',
+ response_bytes: 1234
}
end
@@ -55,6 +56,20 @@ RSpec.describe Gitlab::Lograge::CustomOptions do
expect(subject[:user_id]).to eq('test')
end
+ it 'adds the response length' do
+ expect(subject[:response_bytes]).to eq(1234)
+ end
+
+ context 'with log_response_length disabled' do
+ before do
+ stub_feature_flags(log_response_length: false)
+ end
+
+ it 'does not add the response length' do
+ expect(subject).not_to include(:response_bytes)
+ end
+ end
+
it 'adds Cloudflare headers' do
expect(subject[:cf_ray]).to eq(event.payload[:cf_ray])
expect(subject[:cf_request_id]).to eq(event.payload[:cf_request_id])
diff --git a/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb b/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
index d22bef5bda9..81910773dfa 100644
--- a/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
+++ b/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
@@ -11,6 +11,8 @@ RSpec.describe Gitlab::MarkdownCache::ActiveRecord::Extension do
attribute :author
attribute :project
+
+ before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id }
end
end
diff --git a/spec/lib/gitlab/memory/watchdog_spec.rb b/spec/lib/gitlab/memory/watchdog_spec.rb
new file mode 100644
index 00000000000..8b82078bcb9
--- /dev/null
+++ b/spec/lib/gitlab/memory/watchdog_spec.rb
@@ -0,0 +1,308 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Memory::Watchdog, :aggregate_failures, :prometheus do
+ context 'watchdog' do
+ let(:logger) { instance_double(::Logger) }
+ let(:handler) { instance_double(described_class::NullHandler) }
+
+ let(:heap_frag_limit_gauge) { instance_double(::Prometheus::Client::Gauge) }
+ let(:heap_frag_violations_counter) { instance_double(::Prometheus::Client::Counter) }
+ let(:heap_frag_violations_handled_counter) { instance_double(::Prometheus::Client::Counter) }
+
+ let(:sleep_time) { 0.1 }
+ let(:max_heap_fragmentation) { 0.2 }
+
+ subject(:watchdog) do
+ described_class.new(handler: handler, logger: logger, sleep_time_seconds: sleep_time,
+ max_strikes: max_strikes, max_heap_fragmentation: max_heap_fragmentation)
+ end
+
+ before do
+ allow(handler).to receive(:on_high_heap_fragmentation).and_return(true)
+
+ allow(logger).to receive(:warn)
+ allow(logger).to receive(:info)
+
+ allow(Gitlab::Metrics::Memory).to receive(:gc_heap_fragmentation).and_return(fragmentation)
+ end
+
+ after do
+ watchdog.stop
+ end
+
+ context 'when starting up' do
+ let(:fragmentation) { 0 }
+ let(:max_strikes) { 0 }
+
+ it 'sets the heap fragmentation limit gauge' do
+ allow(Gitlab::Metrics).to receive(:gauge).and_return(heap_frag_limit_gauge)
+
+ expect(heap_frag_limit_gauge).to receive(:set).with({}, max_heap_fragmentation)
+ end
+
+ context 'when no settings are set in the environment' do
+ it 'initializes with defaults' do
+ watchdog = described_class.new(handler: handler, logger: logger)
+
+ expect(watchdog.max_heap_fragmentation).to eq(described_class::DEFAULT_HEAP_FRAG_THRESHOLD)
+ expect(watchdog.max_strikes).to eq(described_class::DEFAULT_MAX_STRIKES)
+ expect(watchdog.sleep_time_seconds).to eq(described_class::DEFAULT_SLEEP_TIME_SECONDS)
+ end
+ end
+
+ context 'when settings are passed through the environment' do
+ before do
+ stub_env('GITLAB_MEMWD_MAX_HEAP_FRAG', 1)
+ stub_env('GITLAB_MEMWD_MAX_STRIKES', 2)
+ stub_env('GITLAB_MEMWD_SLEEP_TIME_SEC', 3)
+ end
+
+ it 'initializes with these settings' do
+ watchdog = described_class.new(handler: handler, logger: logger)
+
+ expect(watchdog.max_heap_fragmentation).to eq(1)
+ expect(watchdog.max_strikes).to eq(2)
+ expect(watchdog.sleep_time_seconds).to eq(3)
+ end
+ end
+ end
+
+ context 'when process does not exceed heap fragmentation threshold' do
+ let(:fragmentation) { max_heap_fragmentation - 0.1 }
+ let(:max_strikes) { 0 } # To rule out that we were granting too many strikes.
+
+ it 'does not signal the handler' do
+ expect(handler).not_to receive(:on_high_heap_fragmentation)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+ end
+
+ context 'when process exceeds heap fragmentation threshold permanently' do
+ let(:fragmentation) { max_heap_fragmentation + 0.1 }
+
+ before do
+ allow(Gitlab::Metrics).to receive(:counter)
+ .with(:gitlab_memwd_heap_frag_violations_total, anything, anything)
+ .and_return(heap_frag_violations_counter)
+ allow(Gitlab::Metrics).to receive(:counter)
+ .with(:gitlab_memwd_heap_frag_violations_handled_total, anything, anything)
+ .and_return(heap_frag_violations_handled_counter)
+ allow(heap_frag_violations_counter).to receive(:increment)
+ allow(heap_frag_violations_handled_counter).to receive(:increment)
+ end
+
+ context 'when process has not exceeded allowed number of strikes' do
+ let(:max_strikes) { 10 }
+
+ it 'does not signal the handler' do
+ expect(handler).not_to receive(:on_high_heap_fragmentation)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+
+ it 'does not log any events' do
+ expect(logger).not_to receive(:warn)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+
+ it 'increments the violations counter' do
+ expect(heap_frag_violations_counter).to receive(:increment)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+
+ it 'does not increment violations handled counter' do
+ expect(heap_frag_violations_handled_counter).not_to receive(:increment)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+ end
+
+ context 'when process exceeds the allowed number of strikes' do
+ let(:max_strikes) { 1 }
+
+ it 'signals the handler and resets strike counter' do
+ expect(handler).to receive(:on_high_heap_fragmentation).and_return(true)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+
+ expect(watchdog.strikes).to eq(0)
+ end
+
+ it 'logs the event' do
+ expect(::Prometheus::PidProvider).to receive(:worker_id).at_least(:once).and_return('worker_1')
+ expect(Gitlab::Metrics::System).to receive(:memory_usage_rss).at_least(:once).and_return(1024)
+ expect(logger).to receive(:warn).with({
+ message: 'heap fragmentation limit exceeded',
+ pid: Process.pid,
+ worker_id: 'worker_1',
+ memwd_handler_class: 'RSpec::Mocks::InstanceVerifyingDouble',
+ memwd_sleep_time_s: sleep_time,
+ memwd_max_heap_frag: max_heap_fragmentation,
+ memwd_cur_heap_frag: fragmentation,
+ memwd_max_strikes: max_strikes,
+ memwd_cur_strikes: max_strikes + 1,
+ memwd_rss_bytes: 1024
+ })
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+
+ it 'increments both the violations and violations handled counters' do
+ expect(heap_frag_violations_counter).to receive(:increment)
+ expect(heap_frag_violations_handled_counter).to receive(:increment)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+
+ context 'when enforce_memory_watchdog ops toggle is off' do
+ before do
+ stub_feature_flags(enforce_memory_watchdog: false)
+ end
+
+ it 'always uses the NullHandler' do
+ expect(handler).not_to receive(:on_high_heap_fragmentation)
+ expect(described_class::NullHandler.instance).to(
+ receive(:on_high_heap_fragmentation).with(fragmentation).and_return(true)
+ )
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+ end
+ end
+
+ context 'when handler result is true' do
+ let(:max_strikes) { 1 }
+
+ it 'considers the event handled and stops itself' do
+ expect(handler).to receive(:on_high_heap_fragmentation).once.and_return(true)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+ end
+
+ context 'when handler result is false' do
+ let(:max_strikes) { 1 }
+
+ it 'keeps running' do
+ # Return true the third time to terminate the daemon.
+ expect(handler).to receive(:on_high_heap_fragmentation).and_return(false, false, true)
+
+ watchdog.start
+
+ sleep sleep_time * 4
+ end
+ end
+ end
+
+ context 'when process exceeds heap fragmentation threshold temporarily' do
+ let(:fragmentation) { max_heap_fragmentation }
+ let(:max_strikes) { 1 }
+
+ before do
+ allow(Gitlab::Metrics::Memory).to receive(:gc_heap_fragmentation).and_return(
+ fragmentation - 0.1,
+ fragmentation + 0.2,
+ fragmentation - 0.1,
+ fragmentation + 0.1
+ )
+ end
+
+ it 'does not signal the handler' do
+ expect(handler).not_to receive(:on_high_heap_fragmentation)
+
+ watchdog.start
+
+ sleep sleep_time * 4
+ end
+ end
+
+ context 'when gitlab_memory_watchdog ops toggle is off' do
+ let(:fragmentation) { 0 }
+ let(:max_strikes) { 0 }
+
+ before do
+ stub_feature_flags(gitlab_memory_watchdog: false)
+ end
+
+ it 'does not monitor heap fragmentation' do
+ expect(Gitlab::Metrics::Memory).not_to receive(:gc_heap_fragmentation)
+
+ watchdog.start
+
+ sleep sleep_time * 3
+ end
+ end
+ end
+
+ context 'handlers' do
+ context 'NullHandler' do
+ subject(:handler) { described_class::NullHandler.instance }
+
+ describe '#on_high_heap_fragmentation' do
+ it 'does nothing' do
+ expect(handler.on_high_heap_fragmentation(1.0)).to be(false)
+ end
+ end
+ end
+
+ context 'TermProcessHandler' do
+ subject(:handler) { described_class::TermProcessHandler.new(42) }
+
+ describe '#on_high_heap_fragmentation' do
+ it 'sends SIGTERM to the current process' do
+ expect(Process).to receive(:kill).with(:TERM, 42)
+
+ expect(handler.on_high_heap_fragmentation(1.0)).to be(true)
+ end
+ end
+ end
+
+ context 'PumaHandler' do
+ # rubocop: disable RSpec/VerifiedDoubles
+ # In tests, the Puma constant is not loaded so we cannot make this an instance_double.
+ let(:puma_worker_handle_class) { double('Puma::Cluster::WorkerHandle') }
+ let(:puma_worker_handle) { double('worker') }
+ # rubocop: enable RSpec/VerifiedDoubles
+
+ subject(:handler) { described_class::PumaHandler.new({}) }
+
+ before do
+ stub_const('::Puma::Cluster::WorkerHandle', puma_worker_handle_class)
+ end
+
+ describe '#on_high_heap_fragmentation' do
+ it 'invokes orderly termination via Puma API' do
+ expect(puma_worker_handle_class).to receive(:new).and_return(puma_worker_handle)
+ expect(puma_worker_handle).to receive(:term)
+
+ expect(handler.on_high_heap_fragmentation(1.0)).to be(true)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb b/spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb
index 66fba7ab683..dc5c7eb2e55 100644
--- a/spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb
+++ b/spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb
@@ -19,6 +19,7 @@ RSpec.describe Gitlab::Metrics::Exporter::BaseExporter do
allow(settings).to receive(:enabled).and_return(true)
allow(settings).to receive(:port).and_return(0)
allow(settings).to receive(:address).and_return('127.0.0.1')
+ allow(settings).to receive(:[]).with('tls_enabled').and_return(false)
end
after do
@@ -88,6 +89,51 @@ RSpec.describe Gitlab::Metrics::Exporter::BaseExporter do
exporter
end
end
+
+ context 'with TLS enabled' do
+ let(:test_cert) { Rails.root.join('spec/fixtures/x509_certificate.crt').to_s }
+ let(:test_key) { Rails.root.join('spec/fixtures/x509_certificate_pk.key').to_s }
+
+ before do
+ allow(settings).to receive(:[]).with('tls_enabled').and_return(true)
+ allow(settings).to receive(:[]).with('tls_cert_path').and_return(test_cert)
+ allow(settings).to receive(:[]).with('tls_key_path').and_return(test_key)
+ end
+
+ it 'injects the necessary OpenSSL config for WEBrick' do
+ expect(::WEBrick::HTTPServer).to receive(:new).with(
+ a_hash_including(
+ SSLEnable: true,
+ SSLCertificate: an_instance_of(OpenSSL::X509::Certificate),
+ SSLPrivateKey: an_instance_of(OpenSSL::PKey::RSA),
+ SSLStartImmediately: true,
+ SSLExtraChainCert: []
+ ))
+
+ exporter.start
+ end
+
+ context 'with intermediate certificates' do
+ let(:test_cert) { Rails.root.join('spec/fixtures/clusters/chain_certificates.pem').to_s }
+ let(:test_key) { Rails.root.join('spec/fixtures/clusters/sample_key.key').to_s }
+
+ it 'injects them in the extra chain' do
+ expect(::WEBrick::HTTPServer).to receive(:new).with(
+ a_hash_including(
+ SSLEnable: true,
+ SSLCertificate: an_instance_of(OpenSSL::X509::Certificate),
+ SSLPrivateKey: an_instance_of(OpenSSL::PKey::RSA),
+ SSLStartImmediately: true,
+ SSLExtraChainCert: [
+ an_instance_of(OpenSSL::X509::Certificate),
+ an_instance_of(OpenSSL::X509::Certificate)
+ ]
+ ))
+
+ exporter.start
+ end
+ end
+ end
end
describe 'when thread is not alive' do
@@ -159,6 +205,7 @@ RSpec.describe Gitlab::Metrics::Exporter::BaseExporter do
allow(settings).to receive(:enabled).and_return(true)
allow(settings).to receive(:port).and_return(0)
allow(settings).to receive(:address).and_return('127.0.0.1')
+ allow(settings).to receive(:[]).with('tls_enabled').and_return(false)
stub_const('Gitlab::Metrics::Exporter::MetricsMiddleware', fake_collector)
diff --git a/spec/lib/gitlab/metrics/memory_spec.rb b/spec/lib/gitlab/metrics/memory_spec.rb
new file mode 100644
index 00000000000..fd8ca3b37c6
--- /dev/null
+++ b/spec/lib/gitlab/metrics/memory_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Metrics::Memory do
+ describe '.gc_heap_fragmentation' do
+ subject(:call) do
+ described_class.gc_heap_fragmentation(
+ heap_live_slots: gc_stat_heap_live_slots,
+ heap_eden_pages: gc_stat_heap_eden_pages
+ )
+ end
+
+ context 'when the Ruby heap is perfectly utilized' do
+ # All objects are located in a single heap page.
+ let(:gc_stat_heap_live_slots) { described_class::HEAP_SLOTS_PER_PAGE }
+ let(:gc_stat_heap_eden_pages) { 1 }
+
+ it { is_expected.to eq(0) }
+ end
+
+ context 'when the Ruby heap is greatly fragmented' do
+ # There is one object per heap page.
+ let(:gc_stat_heap_live_slots) { described_class::HEAP_SLOTS_PER_PAGE }
+ let(:gc_stat_heap_eden_pages) { described_class::HEAP_SLOTS_PER_PAGE }
+
+ # The heap can never be "perfectly fragmented" because that would require
+ # zero objects per page.
+ it { is_expected.to be > 0.99 }
+ end
+
+ context 'when the Ruby heap is semi-fragmented' do
+ # All objects are spread over two pages i.e. each page is 50% utilized.
+ let(:gc_stat_heap_live_slots) { described_class::HEAP_SLOTS_PER_PAGE }
+ let(:gc_stat_heap_eden_pages) { 2 }
+
+ it { is_expected.to eq(0.5) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb
index dfae5aa6784..b1566ffa7b4 100644
--- a/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb
+++ b/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb
@@ -125,5 +125,11 @@ RSpec.describe Gitlab::Metrics::Samplers::RubySampler do
sampler.sample
end
+
+ it 'adds a heap fragmentation metric' do
+ expect(sampler.metrics[:heap_fragmentation]).to receive(:set).with({}, anything)
+
+ sampler.sample
+ end
end
end
diff --git a/spec/lib/gitlab/metrics/sli_spec.rb b/spec/lib/gitlab/metrics/sli_spec.rb
index 102ea442b3a..d100f66be19 100644
--- a/spec/lib/gitlab/metrics/sli_spec.rb
+++ b/spec/lib/gitlab/metrics/sli_spec.rb
@@ -172,11 +172,11 @@ RSpec.describe Gitlab::Metrics::Sli do
fake_counter
end
- def fake_total_counter(name)
- fake_prometheus_counter("gitlab_sli:#{name}:total")
+ def fake_total_counter(name, separator = '_')
+ fake_prometheus_counter(['gitlab_sli', name, 'total'].join(separator))
end
- def fake_numerator_counter(name, numerator_name)
- fake_prometheus_counter("gitlab_sli:#{name}:#{numerator_name}_total")
+ def fake_numerator_counter(name, numerator_name, separator = '_')
+ fake_prometheus_counter(["gitlab_sli", name, "#{numerator_name}_total"].join(separator))
end
end
diff --git a/spec/lib/gitlab/pages/cache_control_spec.rb b/spec/lib/gitlab/pages/cache_control_spec.rb
new file mode 100644
index 00000000000..6ed823427fb
--- /dev/null
+++ b/spec/lib/gitlab/pages/cache_control_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Pages::CacheControl do
+ it 'fails with invalid type' do
+ expect { described_class.new(type: :unknown, id: nil) }
+ .to raise_error(ArgumentError, "type must be :namespace or :project")
+ end
+
+ describe '.for_namespace' do
+ let(:subject) { described_class.for_namespace(1) }
+
+ it { expect(subject.cache_key).to eq('pages_domain_for_namespace_1') }
+
+ describe '#clear_cache' do
+ it 'clears the cache' do
+ expect(Rails.cache)
+ .to receive(:delete)
+ .with('pages_domain_for_namespace_1')
+
+ subject.clear_cache
+ end
+ end
+ end
+
+ describe '.for_project' do
+ let(:subject) { described_class.for_project(1) }
+
+ it { expect(subject.cache_key).to eq('pages_domain_for_project_1') }
+
+ describe '#clear_cache' do
+ it 'clears the cache' do
+ expect(Rails.cache)
+ .to receive(:delete)
+ .with('pages_domain_for_project_1')
+
+ subject.clear_cache
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/pages/deployment_update_spec.rb b/spec/lib/gitlab/pages/deployment_update_spec.rb
new file mode 100644
index 00000000000..cf109248f36
--- /dev/null
+++ b/spec/lib/gitlab/pages/deployment_update_spec.rb
@@ -0,0 +1,140 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Pages::DeploymentUpdate do
+ let_it_be(:project, refind: true) { create(:project, :repository) }
+
+ let_it_be(:old_pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) }
+ 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') }
+
+ let(:file) { fixture_file_upload("spec/fixtures/pages.zip") }
+ let(:empty_file) { fixture_file_upload("spec/fixtures/pages_empty.zip") }
+ let(:empty_metadata_filename) { "spec/fixtures/pages_empty.zip.meta" }
+ let(:metadata_filename) { "spec/fixtures/pages.zip.meta" }
+ let(:metadata) { fixture_file_upload(metadata_filename) if File.exist?(metadata_filename) }
+
+ subject(:pages_deployment_update) { described_class.new(project, build) }
+
+ context 'for new artifacts' do
+ context 'for a valid job' do
+ let!(:artifacts_archive) { create(:ci_job_artifact, :correct_checksum, file: file, job: build) }
+
+ before do
+ create(:ci_job_artifact, file_type: :metadata, file_format: :gzip, file: metadata, job: build)
+
+ build.reload
+ end
+
+ it 'is valid' do
+ expect(pages_deployment_update).to be_valid
+ end
+
+ context 'when missing artifacts metadata' do
+ before do
+ expect(build).to receive(:artifacts_metadata?).and_return(false)
+ end
+
+ it 'is invalid' do
+ expect(pages_deployment_update).not_to be_valid
+ expect(pages_deployment_update.errors.full_messages).to include('missing artifacts metadata')
+ end
+ end
+ end
+
+ it 'is invalid for invalid archive' do
+ create(:ci_job_artifact, :archive, file: invalid_file, job: build)
+
+ expect(pages_deployment_update).not_to be_valid
+ expect(pages_deployment_update.errors.full_messages).to include('missing artifacts metadata')
+ end
+ end
+
+ describe 'maximum pages artifacts size' do
+ let(:metadata) { spy('metadata') } # rubocop: disable RSpec/VerifiedDoubles
+
+ before do
+ file = fixture_file_upload('spec/fixtures/pages.zip')
+ metafile = fixture_file_upload('spec/fixtures/pages.zip.meta')
+
+ create(:ci_job_artifact, :archive, :correct_checksum, file: file, job: build)
+ create(:ci_job_artifact, :metadata, file: metafile, job: build)
+
+ allow(build).to receive(:artifacts_metadata_entry)
+ .and_return(metadata)
+ end
+
+ context 'when maximum pages size is set to zero' do
+ before do
+ stub_application_setting(max_pages_size: 0)
+ end
+
+ context "when size is above the limit" do
+ before do
+ allow(metadata).to receive(:total_size).and_return(1.megabyte)
+ allow(metadata).to receive(:entries).and_return([])
+ end
+
+ it 'is valid' do
+ expect(pages_deployment_update).to be_valid
+ end
+ end
+ end
+
+ context 'when size is limited on the instance level' do
+ before do
+ stub_application_setting(max_pages_size: 100)
+ end
+
+ context "when size is below the limit" do
+ before do
+ allow(metadata).to receive(:total_size).and_return(1.megabyte)
+ allow(metadata).to receive(:entries).and_return([])
+ end
+
+ it 'is valid' do
+ expect(pages_deployment_update).to be_valid
+ end
+ end
+
+ context "when size is above the limit" do
+ before do
+ allow(metadata).to receive(:total_size).and_return(101.megabyte)
+ allow(metadata).to receive(:entries).and_return([])
+ end
+
+ it 'is invalid' do
+ expect(pages_deployment_update).not_to be_valid
+ expect(pages_deployment_update.errors.full_messages)
+ .to include('artifacts for pages are too large: 105906176')
+ end
+ end
+ end
+ end
+
+ context 'when retrying the job' do
+ let!(:older_deploy_job) do
+ create(
+ :generic_commit_status,
+ :failed,
+ pipeline: pipeline,
+ ref: build.ref,
+ stage: 'deploy',
+ name: 'pages:deploy'
+ )
+ end
+
+ before do
+ create(:ci_job_artifact, :correct_checksum, file: file, job: build)
+ create(:ci_job_artifact, file_type: :metadata, file_format: :gzip, file: metadata, job: build)
+ build.reload
+ end
+
+ it 'marks older pages:deploy jobs retried' do
+ expect(pages_deployment_update).to be_valid
+ end
+ end
+end
diff --git a/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb b/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb
index ac2695977c4..879c874b134 100644
--- a/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb
+++ b/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb
@@ -15,6 +15,22 @@ RSpec.describe Gitlab::Pagination::CursorBasedKeyset do
end
end
+ describe '.enforced_for_type?' do
+ subject { described_class.enforced_for_type?(relation) }
+
+ context 'when relation is Group' do
+ let(:relation) { Group.all }
+
+ it { is_expected.to be true }
+ end
+
+ context 'when relation is AuditEvent' do
+ let(:relation) { AuditEvent.all }
+
+ it { is_expected.to be false }
+ end
+ end
+
describe '.available?' do
let(:request_context) { double('request_context', params: { order_by: order_by, sort: sort }) }
let(:cursor_based_request_context) { Gitlab::Pagination::Keyset::CursorBasedRequestContext.new(request_context) }
diff --git a/spec/lib/gitlab/pagination/keyset/order_spec.rb b/spec/lib/gitlab/pagination/keyset/order_spec.rb
index abbb3a21cd4..c1fc73603d6 100644
--- a/spec/lib/gitlab/pagination/keyset/order_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/order_spec.rb
@@ -680,4 +680,28 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
end
end
+
+ describe '#attribute_names' do
+ let(:expected_attribute_names) { %w(id name) }
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ order_expression: Project.arel_table['id'].desc,
+ nullable: :not_nullable,
+ distinct: true
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'name',
+ order_expression: Project.arel_table['name'].desc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ ])
+ end
+
+ subject { order.attribute_names }
+
+ it { is_expected.to match_array(expected_attribute_names) }
+ end
end
diff --git a/spec/lib/gitlab/quick_actions/users_extractor_spec.rb b/spec/lib/gitlab/quick_actions/users_extractor_spec.rb
new file mode 100644
index 00000000000..d00f52bb056
--- /dev/null
+++ b/spec/lib/gitlab/quick_actions/users_extractor_spec.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::QuickActions::UsersExtractor do
+ subject(:extractor) { described_class.new(current_user, project: project, group: group, target: target, text: text) }
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:target) { create(:issue, project: project) }
+
+ let_it_be(:pancakes) { create(:user, username: 'pancakes') }
+ let_it_be(:waffles) { create(:user, username: 'waffles') }
+ let_it_be(:syrup) { create(:user, username: 'syrup') }
+
+ before do
+ allow(target).to receive(:allows_multiple_assignees?).and_return(false)
+ end
+
+ context 'when the text is nil' do
+ let(:text) { nil }
+
+ it 'returns an empty array' do
+ expect(extractor.execute).to be_empty
+ end
+ end
+
+ context 'when the text is blank' do
+ let(:text) { ' ' }
+
+ it 'returns an empty array' do
+ expect(extractor.execute).to be_empty
+ end
+ end
+
+ context 'when there are users to be found' do
+ context 'when using usernames' do
+ let(:text) { 'me, pancakes waffles and syrup' }
+
+ it 'finds the users' do
+ expect(extractor.execute).to contain_exactly(current_user, pancakes, waffles, syrup)
+ end
+ end
+
+ context 'when there are too many users' do
+ let(:text) { 'me, pancakes waffles and syrup' }
+
+ before do
+ stub_const("#{described_class}::MAX_QUICK_ACTION_USERS", 2)
+ end
+
+ it 'complains' do
+ expect { extractor.execute }.to raise_error(described_class::TooManyError)
+ end
+ end
+
+ context 'when using references' do
+ let(:text) { 'me, @pancakes @waffles and @syrup' }
+
+ it 'finds the users' do
+ expect(extractor.execute).to contain_exactly(current_user, pancakes, waffles, syrup)
+ end
+ end
+
+ context 'when using a mixture of usernames and references' do
+ let(:text) { 'me, @pancakes waffles and @syrup' }
+
+ it 'finds the users' do
+ expect(extractor.execute).to contain_exactly(current_user, pancakes, waffles, syrup)
+ end
+ end
+
+ context 'when one or more users cannot be found' do
+ let(:text) { 'me, @bacon @pancakes, chicken waffles and @syrup' }
+
+ it 'reports an error' do
+ expect { extractor.execute }.to raise_error(described_class::MissingError, include('bacon', 'chicken'))
+ end
+ end
+
+ context 'when trying to find group members' do
+ let(:group) { create(:group, path: 'breakfast-foods') }
+ let(:text) { group.to_reference }
+
+ it 'reports an error' do
+ [pancakes, waffles].each { group.add_developer(_1) }
+
+ expect { extractor.execute }.to raise_error(described_class::MissingError, include('breakfast-foods'))
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/redis/multi_store_spec.rb b/spec/lib/gitlab/redis/multi_store_spec.rb
index e127c89c303..50ebf43a05e 100644
--- a/spec/lib/gitlab/redis/multi_store_spec.rb
+++ b/spec/lib/gitlab/redis/multi_store_spec.rb
@@ -507,7 +507,7 @@ RSpec.describe Gitlab::Redis::MultiStore do
secondary_store.flushdb
end
- describe "command execution in a transaction" do
+ describe "command execution in a pipelined command" do
let(:counter) { Gitlab::Metrics::NullMetric.instance }
before do
@@ -557,7 +557,15 @@ RSpec.describe Gitlab::Redis::MultiStore do
include_examples 'verify that store contains values', :secondary_store
end
- describe 'return values from a transaction' do
+ describe 'return values from a pipelined command' do
+ RSpec::Matchers.define :pipeline_diff_error_with_stacktrace do |message|
+ match do |object|
+ expect(object).to be_a(Gitlab::Redis::MultiStore::PipelinedDiffError)
+ expect(object.backtrace).not_to be_nil
+ expect(object.message).to eq(message)
+ end
+ end
+
subject do
multi_store.send(name) do |redis|
redis.get(key1)
@@ -585,7 +593,10 @@ RSpec.describe Gitlab::Redis::MultiStore do
it 'returns the value from the secondary store, logging an error' do
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
- an_instance_of(Gitlab::Redis::MultiStore::PipelinedDiffError),
+ pipeline_diff_error_with_stacktrace(
+ 'Pipelined command executed on both stores successfully but results differ between them. ' \
+ "Result from the primary: [#{value1.inspect}]. Result from the secondary: [#{value2.inspect}]."
+ ),
hash_including(command_name: name, instance_name: instance_name)
).and_call_original
expect(counter).to receive(:increment).with(command: name, instance_name: instance_name)
@@ -601,7 +612,10 @@ RSpec.describe Gitlab::Redis::MultiStore do
it 'returns the value from the secondary store, logging an error' do
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
- an_instance_of(Gitlab::Redis::MultiStore::PipelinedDiffError),
+ pipeline_diff_error_with_stacktrace(
+ 'Pipelined command executed on both stores successfully but results differ between them. ' \
+ "Result from the primary: [nil]. Result from the secondary: [#{value2.inspect}]."
+ ),
hash_including(command_name: name, instance_name: instance_name)
)
expect(counter).to receive(:increment).with(command: name, instance_name: instance_name)
diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb
index d48e8183650..a3afbed18e2 100644
--- a/spec/lib/gitlab/regex_spec.rb
+++ b/spec/lib/gitlab/regex_spec.rb
@@ -968,4 +968,18 @@ RSpec.describe Gitlab::Regex do
it { is_expected.not_to match('abc!abc') }
it { is_expected.not_to match((['abc'] * 100).join('.') + '!') }
end
+
+ describe '.x509_subject_key_identifier_regex' do
+ subject { described_class.x509_subject_key_identifier_regex }
+
+ it { is_expected.to match('AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB') }
+ it { is_expected.to match('CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD') }
+ it { is_expected.to match('79:FB:C1:E5:6B:53:8B:0A') }
+ it { is_expected.to match('79:fb:c1:e5:6b:53:8b:0a') }
+
+ it { is_expected.not_to match('') }
+ it { is_expected.not_to match('CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:GG') }
+ it { is_expected.not_to match('random string') }
+ it { is_expected.not_to match('12321342545356434523412341245452345623453542345234523453245') }
+ end
end
diff --git a/spec/lib/gitlab/security/scan_configuration_spec.rb b/spec/lib/gitlab/security/scan_configuration_spec.rb
index 1760796c5a0..774a362617a 100644
--- a/spec/lib/gitlab/security/scan_configuration_spec.rb
+++ b/spec/lib/gitlab/security/scan_configuration_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe ::Gitlab::Security::ScanConfiguration do
let(:configured) { true }
context 'with a core scanner' do
- where(type: %i(sast sast_iac secret_detection))
+ where(type: %i(sast sast_iac secret_detection container_scanning))
with_them do
it { is_expected.to be_truthy }
diff --git a/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb b/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb
index 4a952a2040a..01b7270d761 100644
--- a/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb
+++ b/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb
@@ -129,7 +129,7 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
allow(Sidekiq).to receive(:options).and_return(timeout: 9)
end
- it 'return true when everything is within limit' do
+ it 'return true when everything is within limit', :aggregate_failures do
expect(memory_killer).to receive(:get_rss).and_return(100)
expect(memory_killer).to receive(:get_soft_limit_rss).and_return(200)
expect(memory_killer).to receive(:get_hard_limit_rss).and_return(300)
@@ -144,7 +144,7 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
expect(subject).to be true
end
- it 'return false when rss exceeds hard_limit_rss' do
+ it 'return false when rss exceeds hard_limit_rss', :aggregate_failures do
expect(memory_killer).to receive(:get_rss).at_least(:once).and_return(400)
expect(memory_killer).to receive(:get_soft_limit_rss).at_least(:once).and_return(200)
expect(memory_killer).to receive(:get_hard_limit_rss).at_least(:once).and_return(300)
@@ -159,12 +159,12 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
expect(Gitlab::Metrics::System).to receive(:monotonic_time).and_call_original
- expect(memory_killer).to receive(:log_rss_out_of_range).with(400, 300, 200)
+ expect(memory_killer).to receive(:out_of_range_description).with(400, 300, 200, true)
expect(subject).to be false
end
- it 'return false when rss exceed hard_limit_rss after a while' do
+ it 'return false when rss exceed hard_limit_rss after a while', :aggregate_failures do
expect(memory_killer).to receive(:get_rss).and_return(250, 400, 400)
expect(memory_killer).to receive(:get_soft_limit_rss).at_least(:once).and_return(200)
expect(memory_killer).to receive(:get_hard_limit_rss).at_least(:once).and_return(300)
@@ -180,12 +180,13 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
expect(Gitlab::Metrics::System).to receive(:monotonic_time).twice.and_call_original
expect(memory_killer).to receive(:sleep).with(check_interval_seconds)
- expect(memory_killer).to receive(:log_rss_out_of_range).with(400, 300, 200)
+ expect(memory_killer).to receive(:out_of_range_description).with(400, 300, 200, false)
+ expect(memory_killer).to receive(:out_of_range_description).with(400, 300, 200, true)
expect(subject).to be false
end
- it 'return true when rss below soft_limit_rss after a while within GRACE_BALLOON_SECONDS' do
+ it 'return true when rss below soft_limit_rss after a while within GRACE_BALLOON_SECONDS', :aggregate_failures do
expect(memory_killer).to receive(:get_rss).and_return(250, 100)
expect(memory_killer).to receive(:get_soft_limit_rss).and_return(200, 200)
expect(memory_killer).to receive(:get_hard_limit_rss).and_return(300, 300)
@@ -201,15 +202,15 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
expect(Gitlab::Metrics::System).to receive(:monotonic_time).twice.and_call_original
expect(memory_killer).to receive(:sleep).with(check_interval_seconds)
- expect(memory_killer).not_to receive(:log_rss_out_of_range)
+ expect(memory_killer).to receive(:out_of_range_description).with(100, 300, 200, false)
expect(subject).to be true
end
- context 'when exceeding GRACE_BALLOON_SECONDS' do
+ context 'when exceeds GRACE_BALLOON_SECONDS' do
let(:grace_balloon_seconds) { 0 }
- it 'return false when rss exceed soft_limit_rss' do
+ it 'return false when rss exceed soft_limit_rss', :aggregate_failures do
allow(memory_killer).to receive(:get_rss).and_return(250)
allow(memory_killer).to receive(:get_soft_limit_rss).and_return(200)
allow(memory_killer).to receive(:get_hard_limit_rss).and_return(300)
@@ -222,8 +223,7 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
.with(:above_soft_limit)
.and_call_original
- expect(memory_killer).to receive(:log_rss_out_of_range)
- .with(250, 300, 200)
+ expect(memory_killer).to receive(:out_of_range_description).with(250, 300, 200, true)
expect(subject).to be false
end
@@ -318,7 +318,7 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
subject { memory_killer.send(:signal_pgroup, signal, explanation) }
- it 'send signal to this proces if it is not group leader' do
+ it 'send signal to this process if it is not group leader' do
expect(Process).to receive(:getpgrp).and_return(pid + 1)
expect(Sidekiq.logger).to receive(:warn).once
@@ -351,12 +351,34 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
let(:current_rss) { 100 }
let(:soft_limit_rss) { 200 }
let(:hard_limit_rss) { 300 }
+ let(:jid) { 1 }
let(:reason) { 'rss out of range reason description' }
+ let(:queue) { 'default' }
+ let(:running_jobs) { [{ jid: jid, worker_class: 'DummyWorker' }] }
+ let(:worker) do
+ Class.new do
+ def self.name
+ 'DummyWorker'
+ end
+
+ include ApplicationWorker
+ end
+ end
+
+ before do
+ stub_const("DummyWorker", worker)
+
+ allow(memory_killer).to receive(:get_rss).and_return(*current_rss)
+ allow(memory_killer).to receive(:get_soft_limit_rss).and_return(soft_limit_rss)
+ allow(memory_killer).to receive(:get_hard_limit_rss).and_return(hard_limit_rss)
+
+ memory_killer.send(:refresh_state, :running)
+ end
- subject { memory_killer.send(:log_rss_out_of_range, current_rss, hard_limit_rss, soft_limit_rss) }
+ subject { memory_killer.send(:log_rss_out_of_range) }
it 'invoke sidekiq logger warn' do
- expect(memory_killer).to receive(:out_of_range_description).with(current_rss, hard_limit_rss, soft_limit_rss).and_return(reason)
+ expect(memory_killer).to receive(:out_of_range_description).with(current_rss, hard_limit_rss, soft_limit_rss, true).and_return(reason)
expect(Sidekiq.logger).to receive(:warn)
.with(
class: described_class.to_s,
@@ -365,9 +387,12 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
current_rss: current_rss,
hard_limit_rss: hard_limit_rss,
soft_limit_rss: soft_limit_rss,
- reason: reason)
+ reason: reason,
+ running_jobs: running_jobs)
- subject
+ Gitlab::SidekiqDaemon::Monitor.instance.within_job(DummyWorker, jid, queue) do
+ subject
+ end
end
end
@@ -375,8 +400,9 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
let(:hard_limit) { 300 }
let(:soft_limit) { 200 }
let(:grace_balloon_seconds) { 12 }
+ let(:deadline_exceeded) { true }
- subject { memory_killer.send(:out_of_range_description, rss, hard_limit, soft_limit) }
+ subject { memory_killer.send(:out_of_range_description, rss, hard_limit, soft_limit, deadline_exceeded) }
context 'when rss > hard_limit' do
let(:rss) { 400 }
@@ -389,9 +415,20 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
context 'when rss <= hard_limit' do
let(:rss) { 300 }
- it 'tells reason' do
- stub_const("#{described_class}::GRACE_BALLOON_SECONDS", grace_balloon_seconds)
- expect(subject).to eq("current_rss(#{rss}) > soft_limit_rss(#{soft_limit}) longer than GRACE_BALLOON_SECONDS(#{grace_balloon_seconds})")
+ context 'deadline exceeded' do
+ let(:deadline_exceeded) { true }
+
+ it 'tells reason' do
+ stub_const("#{described_class}::GRACE_BALLOON_SECONDS", grace_balloon_seconds)
+ expect(subject).to eq("current_rss(#{rss}) > soft_limit_rss(#{soft_limit}) longer than GRACE_BALLOON_SECONDS(#{grace_balloon_seconds})")
+ end
+ end
+ context 'deadline not exceeded' do
+ let(:deadline_exceeded) { false }
+
+ it 'tells reason' do
+ expect(subject).to eq("current_rss(#{rss}) > soft_limit_rss(#{soft_limit})")
+ end
end
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
index 7d31979a393..117b37ffda3 100644
--- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
@@ -169,6 +169,16 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
subject.call(worker, job, :test) { nil }
end
end
+
+ context 'when job is interrupted' do
+ let(:job) { { 'interrupted_count' => 1 } }
+
+ it 'sets sidekiq_jobs_interrupted_total metric' do
+ expect(interrupted_total_metric).to receive(:increment)
+
+ subject.call(worker, job, :test) { nil }
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/tracking/destinations/snowplow_micro_spec.rb b/spec/lib/gitlab/tracking/destinations/snowplow_micro_spec.rb
index 2b94eaa2db9..2554a15d97e 100644
--- a/spec/lib/gitlab/tracking/destinations/snowplow_micro_spec.rb
+++ b/spec/lib/gitlab/tracking/destinations/snowplow_micro_spec.rb
@@ -5,46 +5,83 @@ require 'spec_helper'
RSpec.describe Gitlab::Tracking::Destinations::SnowplowMicro do
include StubENV
+ let(:snowplow_micro_settings) do
+ {
+ enabled: true,
+ address: address
+ }
+ end
+
+ let(:address) { "gdk.test:9091" }
+
before do
- stub_application_setting(snowplow_enabled: true)
- stub_env('SNOWPLOW_MICRO_ENABLE', '1')
allow(Rails.env).to receive(:development?).and_return(true)
end
describe '#hostname' do
- context 'when SNOWPLOW_MICRO_URI is set' do
+ context 'when snowplow_micro config is set' do
+ let(:address) { '127.0.0.1:9091' }
+
before do
- stub_env('SNOWPLOW_MICRO_URI', 'http://gdk.test:9091')
+ stub_config(snowplow_micro: snowplow_micro_settings)
end
- it 'returns hostname URI part' do
- expect(subject.hostname).to eq('gdk.test:9091')
+ it 'returns proper URI' do
+ expect(subject.hostname).to eq('127.0.0.1:9091')
+ expect(subject.uri.scheme).to eq('http')
+ end
+
+ context 'when gitlab config has https scheme' do
+ before do
+ stub_config_setting(https: true)
+ end
+
+ it 'returns proper URI' do
+ expect(subject.hostname).to eq('127.0.0.1:9091')
+ expect(subject.uri.scheme).to eq('https')
+ end
end
end
- context 'when SNOWPLOW_MICRO_URI is without protocol' do
+ context 'when snowplow_micro config is not set' do
before do
- stub_env('SNOWPLOW_MICRO_URI', 'gdk.test:9091')
+ allow(Gitlab.config).to receive(:snowplow_micro).and_raise(Settingslogic::MissingSetting)
end
- it 'returns hostname URI part' do
- expect(subject.hostname).to eq('gdk.test:9091')
+ context 'when SNOWPLOW_MICRO_URI has scheme and port' do
+ before do
+ stub_env('SNOWPLOW_MICRO_URI', 'http://gdk.test:9091')
+ end
+
+ it 'returns hostname URI part' do
+ expect(subject.hostname).to eq('gdk.test:9091')
+ end
end
- end
- context 'when SNOWPLOW_MICRO_URI is hostname only' do
- before do
- stub_env('SNOWPLOW_MICRO_URI', 'uriwithoutport')
+ context 'when SNOWPLOW_MICRO_URI is without protocol' do
+ before do
+ stub_env('SNOWPLOW_MICRO_URI', 'gdk.test:9091')
+ end
+
+ it 'returns hostname URI part' do
+ expect(subject.hostname).to eq('gdk.test:9091')
+ end
end
- it 'returns hostname URI with default HTTP port' do
- expect(subject.hostname).to eq('uriwithoutport:80')
+ context 'when SNOWPLOW_MICRO_URI is hostname only' do
+ before do
+ stub_env('SNOWPLOW_MICRO_URI', 'uriwithoutport')
+ end
+
+ it 'returns hostname URI with default HTTP port' do
+ expect(subject.hostname).to eq('uriwithoutport:80')
+ end
end
- end
- context 'when SNOWPLOW_MICRO_URI is not set' do
- it 'returns localhost hostname' do
- expect(subject.hostname).to eq('localhost:9090')
+ context 'when SNOWPLOW_MICRO_URI is not set' do
+ it 'returns localhost hostname' do
+ expect(subject.hostname).to eq('localhost:9090')
+ end
end
end
end
@@ -53,7 +90,7 @@ RSpec.describe Gitlab::Tracking::Destinations::SnowplowMicro do
let_it_be(:group) { create :group }
before do
- stub_env('SNOWPLOW_MICRO_URI', 'http://gdk.test:9091')
+ stub_config(snowplow_micro: snowplow_micro_settings)
end
it 'includes protocol with the correct value' do
diff --git a/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb b/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
index 06cc2d3800c..1d4725cf405 100644
--- a/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
+++ b/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Tracking::Destinations::Snowplow do
+RSpec.describe Gitlab::Tracking::Destinations::Snowplow, :do_not_stub_snowplow_by_default do
let(:emitter) { SnowplowTracker::Emitter.new('localhost', buffer_size: 1) }
let(:tracker) { SnowplowTracker::Tracker.new(emitter, SnowplowTracker::Subject.new, 'namespace', 'app_id') }
diff --git a/spec/lib/gitlab/tracking/incident_management_spec.rb b/spec/lib/gitlab/tracking/incident_management_spec.rb
index fbcb9bf3e4c..ef7816aa0db 100644
--- a/spec/lib/gitlab/tracking/incident_management_spec.rb
+++ b/spec/lib/gitlab/tracking/incident_management_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Gitlab::Tracking::IncidentManagement do
described_class.track_from_params(params)
end
- context 'known params' do
+ context 'known params', :do_not_stub_snowplow_by_default do
known_params = described_class.tracking_keys
known_params.each do |key, values|
diff --git a/spec/lib/gitlab/tracking/standard_context_spec.rb b/spec/lib/gitlab/tracking/standard_context_spec.rb
index 508b33949a8..cfb83bc0528 100644
--- a/spec/lib/gitlab/tracking/standard_context_spec.rb
+++ b/spec/lib/gitlab/tracking/standard_context_spec.rb
@@ -93,30 +93,11 @@ RSpec.describe Gitlab::Tracking::StandardContext do
end
context 'with incorrect argument type' do
- context 'when standard_context_type_check FF is disabled' do
- before do
- stub_feature_flags(standard_context_type_check: false)
- end
-
- subject { described_class.new(project: create(:group)) }
-
- it 'does not call `track_and_raise_for_dev_exception`' do
- expect(Gitlab::ErrorTracking).not_to receive(:track_and_raise_for_dev_exception)
- snowplow_context
- end
- end
+ subject { described_class.new(project: create(:group)) }
- context 'when standard_context_type_check FF is enabled' do
- before do
- stub_feature_flags(standard_context_type_check: true)
- end
-
- subject { described_class.new(project: create(:group)) }
-
- it 'does call `track_and_raise_for_dev_exception`' do
- expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
- snowplow_context
- end
+ it 'does call `track_and_raise_for_dev_exception`' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ snowplow_context
end
end
diff --git a/spec/lib/gitlab/tracking_spec.rb b/spec/lib/gitlab/tracking_spec.rb
index cc973be8be9..dd62c832f6f 100644
--- a/spec/lib/gitlab/tracking_spec.rb
+++ b/spec/lib/gitlab/tracking_spec.rb
@@ -10,11 +10,11 @@ RSpec.describe Gitlab::Tracking do
stub_application_setting(snowplow_cookie_domain: '.gitfoo.com')
stub_application_setting(snowplow_app_id: '_abc123_')
- described_class.instance_variable_set("@snowplow", nil)
+ described_class.instance_variable_set("@tracker", nil)
end
after do
- described_class.instance_variable_set("@snowplow", nil)
+ described_class.instance_variable_set("@tracker", nil)
end
describe '.options' do
@@ -34,6 +34,26 @@ RSpec.describe Gitlab::Tracking do
end
end
+ shared_examples 'delegates to SnowplowMicro destination with proper options' do
+ it_behaves_like 'delegates to destination', Gitlab::Tracking::Destinations::SnowplowMicro
+
+ it 'returns useful client options' do
+ expected_fields = {
+ namespace: 'gl',
+ hostname: 'localhost:9090',
+ cookieDomain: '.gitlab.com',
+ appId: '_abc123_',
+ protocol: 'http',
+ port: 9090,
+ forceSecureTracker: false,
+ formTracking: true,
+ linkClickTracking: true
+ }
+
+ expect(subject.options(nil)).to match(expected_fields)
+ end
+ end
+
context 'when destination is Snowplow' do
it_behaves_like 'delegates to destination', Gitlab::Tracking::Destinations::Snowplow
@@ -53,26 +73,31 @@ RSpec.describe Gitlab::Tracking do
context 'when destination is SnowplowMicro' do
before do
- stub_env('SNOWPLOW_MICRO_ENABLE', '1')
allow(Rails.env).to receive(:development?).and_return(true)
end
- it_behaves_like 'delegates to destination', Gitlab::Tracking::Destinations::SnowplowMicro
+ context "enabled with yml config" do
+ let(:snowplow_micro_settings) do
+ {
+ enabled: true,
+ address: "localhost:9090"
+ }
+ end
- it 'returns useful client options' do
- expected_fields = {
- namespace: 'gl',
- hostname: 'localhost:9090',
- cookieDomain: '.gitlab.com',
- appId: '_abc123_',
- protocol: 'http',
- port: 9090,
- forceSecureTracker: false,
- formTracking: true,
- linkClickTracking: true
- }
+ before do
+ stub_config(snowplow_micro: snowplow_micro_settings)
+ end
- expect(subject.options(nil)).to match(expected_fields)
+ it_behaves_like 'delegates to SnowplowMicro destination with proper options'
+ end
+
+ context "enabled with env variable" do
+ before do
+ allow(Gitlab.config).to receive(:snowplow_micro).and_raise(Settingslogic::MissingSetting)
+ stub_env('SNOWPLOW_MICRO_ENABLE', '1')
+ end
+
+ it_behaves_like 'delegates to SnowplowMicro destination with proper options'
end
end
diff --git a/spec/lib/gitlab/tree_summary_spec.rb b/spec/lib/gitlab/tree_summary_spec.rb
index 3021d92244e..f45005fcc9b 100644
--- a/spec/lib/gitlab/tree_summary_spec.rb
+++ b/spec/lib/gitlab/tree_summary_spec.rb
@@ -30,50 +30,31 @@ RSpec.describe Gitlab::TreeSummary do
describe '#summarize' do
let(:project) { create(:project, :custom_repo, files: { 'a.txt' => '' }) }
- subject(:summarized) { summary.summarize }
+ subject(:entries) { summary.summarize }
- it 'returns an array of entries, and an array of commits' do
- expect(summarized).to be_a(Array)
- expect(summarized.size).to eq(2)
+ it 'returns an array of entries' do
+ expect(entries).to be_a(Array)
+ expect(entries.size).to eq(1)
- entries, commits = *summarized
aggregate_failures do
expect(entries).to contain_exactly(
a_hash_including(file_name: 'a.txt', commit: have_attributes(id: commit.id))
)
- expect(commits).to match_array(entries.map { |entry| entry[:commit] })
- end
- end
-
- context 'when offset is over the limit' do
- let(:offset) { 100 }
-
- it 'returns an empty array' do
- expect(summarized).to eq([[], []])
+ expect(summary.resolved_commits.values).to match_array(entries.map { |entry| entry[:commit] })
end
end
context 'with caching', :use_clean_rails_memory_store_caching do
subject { Rails.cache.fetch(key) }
- context 'Repository tree cache' do
- let(:key) { ['projects', project.id, 'content', commit.id, path] }
-
- it 'creates a cache for repository content' do
- summarized
-
- is_expected.to eq([{ file_name: 'a.txt', type: :blob }])
- end
- end
-
context 'Commits list cache' do
let(:offset) { 0 }
let(:limit) { 25 }
- let(:key) { ['projects', project.id, 'last_commits', commit.id, path, offset, limit] }
+ let(:key) { ['projects', project.id, 'last_commits', commit.id, path, offset, limit + 1] }
it 'creates a cache for commits list' do
- summarized
+ entries
is_expected.to eq('a.txt' => commit.to_hash)
end
@@ -93,7 +74,7 @@ RSpec.describe Gitlab::TreeSummary do
let(:expected_message) { message[0...1021] + '...' }
it 'truncates commit message to 1 kilobyte' do
- summarized
+ entries
is_expected.to include('long.txt' => a_hash_including(message: expected_message))
end
@@ -102,7 +83,7 @@ RSpec.describe Gitlab::TreeSummary do
end
end
- describe '#summarize (entries)' do
+ describe '#fetch_logs' do
let(:limit) { 4 }
custom_files = {
@@ -116,33 +97,32 @@ RSpec.describe Gitlab::TreeSummary do
let!(:project) { create(:project, :custom_repo, files: custom_files) }
let(:commit) { repo.head_commit }
- subject(:entries) { summary.summarize.first }
+ subject(:entries) { summary.fetch_logs.first }
it 'summarizes the entries within the window' do
is_expected.to contain_exactly(
- a_hash_including(type: :tree, file_name: 'directory'),
- a_hash_including(type: :blob, file_name: 'a.txt'),
- a_hash_including(type: :blob, file_name: ':file'),
- a_hash_including(type: :tree, file_name: ':dir')
+ a_hash_including('file_name' => 'directory'),
+ a_hash_including('file_name' => 'a.txt'),
+ a_hash_including('file_name' => ':file'),
+ a_hash_including('file_name' => ':dir')
# b.txt is excluded by the limit
)
end
it 'references the commit and commit path in entries' do
# There are 2 trees and the summary is not ordered
- entry = entries.find { |entry| entry[:commit].id == commit.id }
+ entry = entries.find { |entry| entry['commit']['id'] == commit.id }
expected_commit_path = Gitlab::Routing.url_helpers.project_commit_path(project, commit)
- expect(entry[:commit]).to be_a(::Commit)
- expect(entry[:commit_path]).to eq(expected_commit_path)
- expect(entry[:commit_title_html]).to eq(commit.message)
+ expect(entry['commit_path']).to eq(expected_commit_path)
+ expect(entry['commit_title_html']).to eq(commit.message)
end
context 'in a good subdirectory' do
let(:path) { 'directory' }
it 'summarizes the entries in the subdirectory' do
- is_expected.to contain_exactly(a_hash_including(type: :blob, file_name: 'c.txt'))
+ is_expected.to contain_exactly(a_hash_including('file_name' => 'c.txt'))
end
end
@@ -150,7 +130,7 @@ RSpec.describe Gitlab::TreeSummary do
let(:path) { ':dir' }
it 'summarizes the entries in the subdirectory' do
- is_expected.to contain_exactly(a_hash_including(type: :blob, file_name: 'test.txt'))
+ is_expected.to contain_exactly(a_hash_including('file_name' => 'test.txt'))
end
end
@@ -164,7 +144,25 @@ RSpec.describe Gitlab::TreeSummary do
let(:offset) { 4 }
it 'returns entries from the offset' do
- is_expected.to contain_exactly(a_hash_including(type: :blob, file_name: 'b.txt'))
+ is_expected.to contain_exactly(a_hash_including('file_name' => 'b.txt'))
+ end
+ end
+
+ context 'next offset' do
+ subject { summary.fetch_logs.last }
+
+ context 'when there are more entries to fetch' do
+ it 'returns next offset' do
+ is_expected.to eq(4)
+ end
+ end
+
+ context 'when there are no more entries to fetch' do
+ let(:limit) { 5 }
+
+ it 'returns next offset' do
+ is_expected.to be_nil
+ end
end
end
end
@@ -178,10 +176,11 @@ RSpec.describe Gitlab::TreeSummary do
let(:project) { create(:project, :repository) }
let(:commit) { repo.commit(test_commit_sha) }
let(:limit) { nil }
- let(:entries) { summary.summarize.first }
+ let(:entries) { summary.summarize }
subject(:commits) do
- summary.summarize.last
+ summary.summarize
+ summary.resolved_commits.values
end
it 'returns an Array of ::Commit objects' do
@@ -227,7 +226,7 @@ RSpec.describe Gitlab::TreeSummary do
let_it_be(:project) { create(:project, :empty_repo) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:entries) { summary.summarize.first }
+ let(:entries) { summary.summarize }
let(:entry) { entries.find { |entry| entry[:file_name] == 'issue.txt' } }
before_all do
@@ -264,67 +263,6 @@ RSpec.describe Gitlab::TreeSummary do
end
end
- describe '#more?' do
- let(:path) { 'tmp/more' }
-
- where(:num_entries, :offset, :limit, :expected_result) do
- 0 | 0 | 0 | false
- 0 | 0 | 1 | false
-
- 1 | 0 | 0 | true
- 1 | 0 | 1 | false
- 1 | 1 | 0 | false
- 1 | 1 | 1 | false
-
- 2 | 0 | 0 | true
- 2 | 0 | 1 | true
- 2 | 0 | 2 | false
- 2 | 0 | 3 | false
- 2 | 1 | 0 | true
- 2 | 1 | 1 | false
- 2 | 2 | 0 | false
- 2 | 2 | 1 | false
- end
-
- with_them do
- before do
- create_file('dummy', path: 'other') if num_entries == 0
- 1.upto(num_entries) { |n| create_file(n, path: path) }
- end
-
- subject { summary.more? }
-
- it { is_expected.to eq(expected_result) }
- end
- end
-
- describe '#next_offset' do
- let(:path) { 'tmp/next_offset' }
-
- where(:num_entries, :offset, :limit, :expected_result) do
- 0 | 0 | 0 | 0
- 0 | 0 | 1 | 1
- 0 | 1 | 0 | 1
- 0 | 1 | 1 | 1
-
- 1 | 0 | 0 | 0
- 1 | 0 | 1 | 1
- 1 | 1 | 0 | 1
- 1 | 1 | 1 | 2
- end
-
- with_them do
- before do
- create_file('dummy', path: 'other') if num_entries == 0
- 1.upto(num_entries) { |n| create_file(n, path: path) }
- end
-
- subject { summary.next_offset }
-
- it { is_expected.to eq(expected_result) }
- end
- end
-
def create_file(unique, path:)
repo.create_file(
project.creator,
diff --git a/spec/lib/gitlab/usage/metric_definition_spec.rb b/spec/lib/gitlab/usage/metric_definition_spec.rb
index 070586319a5..a1bddcb3a47 100644
--- a/spec/lib/gitlab/usage/metric_definition_spec.rb
+++ b/spec/lib/gitlab/usage/metric_definition_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
milestone: '14.1',
default_generation: 'generation_1',
key_path: 'uuid',
- product_group: 'group::product analytics',
+ product_group: 'product_analytics',
time_frame: 'none',
data_source: 'database',
distribution: %w(ee ce),
@@ -270,7 +270,7 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
milestone: '14.1',
default_generation: 'generation_1',
key_path: 'counter.category.event',
- product_group: 'group::product analytics',
+ product_group: 'product_analytics',
time_frame: 'none',
data_source: 'database',
distribution: %w(ee ce),
diff --git a/spec/lib/gitlab/usage/metric_spec.rb b/spec/lib/gitlab/usage/metric_spec.rb
index 10ae94e746b..8e0fce37e46 100644
--- a/spec/lib/gitlab/usage/metric_spec.rb
+++ b/spec/lib/gitlab/usage/metric_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Gitlab::Usage::Metric do
description: "Count of Issues created",
product_section: "dev",
product_stage: "plan",
- product_group: "group::plan",
+ product_group: "plan",
product_category: "issue_tracking",
value_type: "number",
status: "active",
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric_spec.rb
deleted file mode 100644
index 8a0ce61de74..00000000000
--- a/spec/lib/gitlab/usage/metrics/instrumentations/unique_active_users_metric_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Usage::Metrics::Instrumentations::UniqueActiveUsersMetric do
- let_it_be(:user1) { create(:user, last_activity_on: 1.day.ago) }
- let_it_be(:user2) { create(:user, last_activity_on: 5.days.ago) }
- let_it_be(:user3) { create(:user, last_activity_on: 50.days.ago) }
- let_it_be(:user4) { create(:user) }
- let_it_be(:user5) { create(:user, user_type: 1, last_activity_on: 5.days.ago ) } # support bot
- let_it_be(:user6) { create(:user, state: 'blocked') }
-
- context '28d' do
- let(:start) { 30.days.ago.to_date.to_s }
- let(:finish) { 2.days.ago.to_date.to_s }
- let(:expected_value) { 1 }
- let(:expected_query) do
- "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\".\"last_activity_on\" " \
- "BETWEEN '#{start}' AND '#{finish}'"
- end
-
- it_behaves_like 'a correct instrumented metric value and query', { time_frame: '28d' }
- end
-
- context 'all' do
- let(:expected_value) { 4 }
-
- it_behaves_like 'a correct instrumented metric value', { time_frame: 'all' }
- end
-end
diff --git a/spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb b/spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb
index 76548483cfa..9d2711c49c6 100644
--- a/spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb
+++ b/spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb
@@ -46,4 +46,54 @@ RSpec.describe Gitlab::Usage::ServicePing::InstrumentedPayload do
expect(described_class.new(['counts.ci_builds'], :with_value).build).to eq({})
end
end
+
+ context 'with broken metric definition file' do
+ let(:key_path) { 'counts.broken_metric_definition_test' }
+ let(:definitions) { [Gitlab::Usage::MetricDefinition.new(key_path, key_path: key_path)] }
+
+ subject(:build_metric) { described_class.new([key_path], :with_value).build }
+
+ before do
+ allow(Gitlab::Usage::MetricDefinition).to receive(:with_instrumentation_class).and_return(definitions)
+ allow_next_instance_of(Gitlab::Usage::Metric) do |instance|
+ allow(instance).to receive(:with_value).and_raise(error)
+ end
+ end
+
+ context 'when instrumentation class name is incorrect' do
+ let(:error) { NameError.new("uninitialized constant Gitlab::Usage::Metrics::Instrumentations::IDontExists") }
+
+ it 'tracks error and return fallback', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).with(error)
+ expect(build_metric).to eql(counts: { broken_metric_definition_test: -1 })
+ end
+ end
+
+ context 'when instrumentation class raises TypeError' do
+ let(:error) { TypeError.new("nil can't be coerced into BigDecimal") }
+
+ it 'tracks error and return fallback', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).with(error)
+ expect(build_metric).to eql(counts: { broken_metric_definition_test: -1 })
+ end
+ end
+
+ context 'when instrumentation class raises ArgumentError' do
+ let(:error) { ArgumentError.new("wrong number of arguments (given 2, expected 0)") }
+
+ it 'tracks error and return fallback', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).with(error)
+ expect(build_metric).to eql(counts: { broken_metric_definition_test: -1 })
+ end
+ end
+
+ context 'when instrumentation class raises StandardError' do
+ let(:error) { StandardError.new("something went very wrong") }
+
+ it 'tracks error and return fallback', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).with(error)
+ expect(build_metric).to eql(counts: { broken_metric_definition_test: -1 })
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb
index dbc34681660..bfbabd858f0 100644
--- a/spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Gitlab::UsageDataCounters::EditorUniqueCounter, :clean_gitlab_red
let(:user1) { build(:user, id: 1) }
let(:user2) { build(:user, id: 2) }
let(:user3) { build(:user, id: 3) }
+ let(:project) { build(:project) }
let(:time) { Time.zone.now }
shared_examples 'tracks and counts action' do
@@ -15,10 +16,9 @@ RSpec.describe Gitlab::UsageDataCounters::EditorUniqueCounter, :clean_gitlab_red
specify do
aggregate_failures do
- expect(track_action(author: user1)).to be_truthy
- expect(track_action(author: user1)).to be_truthy
- expect(track_action(author: user2)).to be_truthy
- expect(track_action(author: user3, time: time - 3.days)).to be_truthy
+ expect(track_action(author: user1, project: project)).to be_truthy
+ expect(track_action(author: user2, project: project)).to be_truthy
+ expect(track_action(author: user3, time: time - 3.days, project: project)).to be_truthy
expect(count_unique(date_from: time, date_to: Date.today)).to eq(2)
expect(count_unique(date_from: time - 5.days, date_to: Date.tomorrow)).to eq(3)
@@ -26,7 +26,7 @@ RSpec.describe Gitlab::UsageDataCounters::EditorUniqueCounter, :clean_gitlab_red
end
it 'does not track edit actions if author is not present' do
- expect(track_action(author: nil)).to be_nil
+ expect(track_action(author: nil, project: project)).to be_nil
end
end
@@ -67,16 +67,16 @@ RSpec.describe Gitlab::UsageDataCounters::EditorUniqueCounter, :clean_gitlab_red
end
it 'can return the count of actions per user deduplicated' do
- described_class.track_web_ide_edit_action(author: user1)
- described_class.track_live_preview_edit_action(author: user1)
- described_class.track_snippet_editor_edit_action(author: user1)
- described_class.track_sfe_edit_action(author: user1)
- described_class.track_web_ide_edit_action(author: user2, time: time - 2.days)
- described_class.track_web_ide_edit_action(author: user3, time: time - 3.days)
- described_class.track_live_preview_edit_action(author: user2, time: time - 2.days)
- described_class.track_live_preview_edit_action(author: user3, time: time - 3.days)
- described_class.track_snippet_editor_edit_action(author: user3, time: time - 3.days)
- described_class.track_sfe_edit_action(author: user3, time: time - 3.days)
+ described_class.track_web_ide_edit_action(author: user1, project: project)
+ described_class.track_live_preview_edit_action(author: user1, project: project)
+ described_class.track_snippet_editor_edit_action(author: user1, project: project)
+ described_class.track_sfe_edit_action(author: user1, project: project)
+ described_class.track_web_ide_edit_action(author: user2, time: time - 2.days, project: project)
+ described_class.track_web_ide_edit_action(author: user3, time: time - 3.days, project: project)
+ described_class.track_live_preview_edit_action(author: user2, time: time - 2.days, project: project)
+ described_class.track_live_preview_edit_action(author: user3, time: time - 3.days, project: project)
+ described_class.track_snippet_editor_edit_action(author: user3, time: time - 3.days, project: project)
+ described_class.track_sfe_edit_action(author: user3, time: time - 3.days, project: project)
expect(described_class.count_edit_using_editor(date_from: time, date_to: Date.today)).to eq(1)
expect(described_class.count_edit_using_editor(date_from: time - 5.days, date_to: Date.tomorrow)).to eq(3)
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 77cf94daa3f..54d49b432f4 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
@@ -19,6 +19,82 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
# Monday 6th of June
reference_time = Time.utc(2020, 6, 1)
travel_to(reference_time) { example.run }
+ described_class.clear_memoization(:known_events)
+ end
+
+ context 'migration to instrumentation classes data collection' do
+ let_it_be(:instrumented_events) do
+ ::Gitlab::Usage::MetricDefinition.all.map do |definition|
+ next unless definition.attributes[:instrumentation_class] == 'RedisHLLMetric' && definition.available?
+
+ definition.attributes.dig(:options, :events)&.sort
+ end.compact.to_set
+ end
+
+ def not_instrumented_events(category)
+ described_class
+ .events_for_category(category)
+ .sort
+ .reject do |event|
+ instrumented_events.include?([event])
+ end
+ end
+
+ def not_instrumented_aggregate(category)
+ events = described_class.events_for_category(category).sort
+
+ return unless described_class::CATEGORIES_FOR_TOTALS.include?(category)
+ return unless described_class.send(:eligible_for_totals?, events)
+ return if instrumented_events.include?(events)
+
+ events
+ end
+
+ describe 'Gitlab::UsageDataCounters::HLLRedisCounter::CATEGORIES_COLLECTED_FROM_METRICS_DEFINITIONS' do
+ it 'includes only fully migrated categories' do
+ wrong_skipped_events = described_class::CATEGORIES_COLLECTED_FROM_METRICS_DEFINITIONS.map do |category|
+ next if not_instrumented_events(category).empty? && not_instrumented_aggregate(category).nil?
+
+ [category, [not_instrumented_events(category), not_instrumented_aggregate(category)].compact]
+ end.compact.to_h
+
+ expect(wrong_skipped_events).to be_empty
+ end
+
+ context 'with not instrumented category' do
+ let(:instrumented_events) { [] }
+
+ it 'can detect not migrated category' do
+ wrong_skipped_events = described_class::CATEGORIES_COLLECTED_FROM_METRICS_DEFINITIONS.map do |category|
+ next if not_instrumented_events(category).empty? && not_instrumented_aggregate(category).nil?
+
+ [category, [not_instrumented_events(category), not_instrumented_aggregate(category)].compact]
+ end.compact.to_h
+
+ expect(wrong_skipped_events).not_to be_empty
+ end
+ end
+ end
+
+ describe '.unique_events_data' do
+ context 'with use_redis_hll_instrumentation_classes feature enabled' do
+ it 'does not include instrumented categories' do
+ stub_feature_flags(use_redis_hll_instrumentation_classes: true)
+
+ expect(described_class.unique_events_data.keys)
+ .not_to include(*described_class::CATEGORIES_COLLECTED_FROM_METRICS_DEFINITIONS)
+ end
+ end
+
+ context 'with use_redis_hll_instrumentation_classes feature disabled' do
+ it 'includes instrumented categories' do
+ stub_feature_flags(use_redis_hll_instrumentation_classes: false)
+
+ expect(described_class.unique_events_data.keys)
+ .to include(*described_class::CATEGORIES_COLLECTED_FROM_METRICS_DEFINITIONS)
+ end
+ end
+ end
end
describe '.categories' do
@@ -53,11 +129,40 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
'growth',
'work_items',
'ci_users',
- 'error_tracking'
+ 'error_tracking',
+ 'manage'
)
end
end
+ describe '.known_events' do
+ let(:ce_temp_dir) { Dir.mktmpdir }
+ let(:ce_temp_file) { Tempfile.new(%w[common .yml], ce_temp_dir) }
+ let(:ce_event) do
+ {
+ "name" => "ce_event",
+ "redis_slot" => "analytics",
+ "category" => "analytics",
+ "expiry" => 84,
+ "aggregation" => "weekly"
+ }
+ end
+
+ before do
+ stub_const("#{described_class}::KNOWN_EVENTS_PATH", File.expand_path('*.yml', ce_temp_dir))
+ File.open(ce_temp_file.path, "w+b") { |f| f.write [ce_event].to_yaml }
+ end
+
+ it 'returns ce events' do
+ expect(described_class.known_events).to include(ce_event)
+ end
+
+ after do
+ ce_temp_file.unlink
+ FileUtils.remove_entry(ce_temp_dir) if Dir.exist?(ce_temp_dir)
+ end
+ end
+
describe 'known_events' do
let(:feature) { 'test_hll_redis_counter_ff_check' }
diff --git a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
index cd3388701fe..3f44cfdcf27 100644
--- a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
@@ -82,11 +82,43 @@ RSpec.describe Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter, :cl
end
describe '.track_approve_mr_action' do
- subject { described_class.track_approve_mr_action(user: user) }
+ include ProjectForksHelper
+
+ let(:merge_request) { create(:merge_request, target_project: target_project, source_project: source_project) }
+ let(:source_project) { fork_project(target_project) }
+ let(:target_project) { create(:project) }
+
+ subject { described_class.track_approve_mr_action(user: user, merge_request: merge_request) }
it_behaves_like 'a tracked merge request unique event' do
let(:action) { described_class::MR_APPROVE_ACTION }
end
+
+ it 'records correct payload with Snowplow event', :snowplow do
+ stub_feature_flags(route_hll_to_snowplow_phase2: true)
+
+ subject
+
+ expect_snowplow_event(
+ category: 'merge_requests',
+ action: 'i_code_review_user_approve_mr',
+ namespace: target_project.namespace,
+ user: user,
+ project: target_project
+ )
+ end
+
+ context 'when FF is disabled' do
+ before do
+ stub_feature_flags(route_hll_to_snowplow_phase2: false)
+ end
+
+ it 'doesnt emit snowplow events', :snowplow do
+ subject
+
+ expect_no_snowplow_event
+ end
+ end
end
describe '.track_unapprove_mr_action' do
diff --git a/spec/lib/gitlab/usage_data_counters/work_item_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/work_item_activity_unique_counter_spec.rb
index 4561d898479..0264236f087 100644
--- a/spec/lib/gitlab/usage_data_counters/work_item_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/work_item_activity_unique_counter_spec.rb
@@ -5,46 +5,6 @@ require 'spec_helper'
RSpec.describe Gitlab::UsageDataCounters::WorkItemActivityUniqueCounter, :clean_gitlab_redis_shared_state do
let(:user) { build(:user, id: 1) }
- shared_examples 'counter that does not track the event' do
- it 'does not track the event' do
- expect { 3.times { track_event } }.to not_change {
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(
- event_names: event_name,
- start_date: 2.weeks.ago,
- end_date: 2.weeks.from_now
- )
- }
- end
- end
-
- shared_examples 'work item unique counter' do
- context 'when track_work_items_activity FF is enabled' do
- it 'tracks a unique event only once' do
- expect { 3.times { track_event } }.to change {
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(
- event_names: event_name,
- start_date: 2.weeks.ago,
- end_date: 2.weeks.from_now
- )
- }.by(1)
- end
-
- context 'when author is nil' do
- let(:user) { nil }
-
- it_behaves_like 'counter that does not track the event'
- end
- end
-
- context 'when track_work_items_activity FF is disabled' do
- before do
- stub_feature_flags(track_work_items_activity: false)
- end
-
- it_behaves_like 'counter that does not track the event'
- end
- end
-
describe '.track_work_item_created_action' do
subject(:track_event) { described_class.track_work_item_created_action(author: user) }
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 790f5b638b9..6eb00053b17 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -249,7 +249,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
)
end
- it 'includes imports usage data' do
+ it 'includes imports usage data', :clean_gitlab_redis_cache do
for_defined_days_back do
user = create(:user)
@@ -347,7 +347,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
cluster = create(:cluster, user: user)
project = create(:project, creator: user)
create(:clusters_integrations_prometheus, cluster: cluster)
- create(:project_tracing_setting)
create(:project_error_tracking_setting)
create(:incident)
create(:incident, alert_management_alert: create(:alert_management_alert))
@@ -358,7 +357,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
clusters: 2,
clusters_integrations_prometheus: 2,
operations_dashboard_default_dashboard: 2,
- projects_with_tracing_enabled: 2,
projects_with_error_tracking_enabled: 2,
projects_with_incidents: 4,
projects_with_alert_incidents: 2,
@@ -370,7 +368,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
clusters: 1,
clusters_integrations_prometheus: 1,
operations_dashboard_default_dashboard: 1,
- projects_with_tracing_enabled: 1,
projects_with_error_tracking_enabled: 1,
projects_with_incidents: 2,
projects_with_alert_incidents: 1
@@ -535,7 +532,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(count_data[:groups_inheriting_slack_active]).to eq(1)
expect(count_data[:projects_with_repositories_enabled]).to eq(3)
expect(count_data[:projects_with_error_tracking_enabled]).to eq(1)
- expect(count_data[:projects_with_tracing_enabled]).to eq(1)
expect(count_data[:projects_with_enabled_alert_integrations]).to eq(1)
expect(count_data[:projects_with_terraform_reports]).to eq(2)
expect(count_data[:projects_with_terraform_states]).to eq(2)
@@ -564,7 +560,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(count_data[:clusters_platforms_eks]).to eq(1)
expect(count_data[:clusters_platforms_gke]).to eq(1)
expect(count_data[:clusters_platforms_user]).to eq(1)
- expect(count_data[:clusters_integrations_elastic_stack]).to eq(1)
expect(count_data[:clusters_integrations_prometheus]).to eq(1)
expect(count_data[:grafana_integrated_projects]).to eq(2)
expect(count_data[:clusters_management_project]).to eq(1)
@@ -1157,35 +1152,36 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
let(:user2) { build(:user, id: 2) }
let(:user3) { build(:user, id: 3) }
let(:user4) { build(:user, id: 4) }
+ let(:project) { build(:project) }
before do
counter = Gitlab::UsageDataCounters::TrackUniqueEvents
- project = Event::TARGET_TYPES[:project]
+ project_type = Event::TARGET_TYPES[:project]
wiki = Event::TARGET_TYPES[:wiki]
design = Event::TARGET_TYPES[:design]
- counter.track_event(event_action: :pushed, event_target: project, author_id: 1)
- counter.track_event(event_action: :pushed, event_target: project, author_id: 1)
- counter.track_event(event_action: :pushed, event_target: project, author_id: 2)
- counter.track_event(event_action: :pushed, event_target: project, author_id: 3)
- counter.track_event(event_action: :pushed, event_target: project, author_id: 4, time: time - 3.days)
+ counter.track_event(event_action: :pushed, event_target: project_type, author_id: 1)
+ counter.track_event(event_action: :pushed, event_target: project_type, author_id: 1)
+ counter.track_event(event_action: :pushed, event_target: project_type, author_id: 2)
+ counter.track_event(event_action: :pushed, event_target: project_type, author_id: 3)
+ counter.track_event(event_action: :pushed, event_target: project_type, author_id: 4, time: time - 3.days)
counter.track_event(event_action: :created, event_target: wiki, author_id: 3)
counter.track_event(event_action: :created, event_target: design, author_id: 3)
counter.track_event(event_action: :created, event_target: design, author_id: 4)
counter = Gitlab::UsageDataCounters::EditorUniqueCounter
- counter.track_web_ide_edit_action(author: user1)
- counter.track_web_ide_edit_action(author: user1)
- counter.track_sfe_edit_action(author: user1)
- counter.track_snippet_editor_edit_action(author: user1)
- counter.track_snippet_editor_edit_action(author: user1, time: time - 3.days)
+ counter.track_web_ide_edit_action(author: user1, project: project)
+ counter.track_web_ide_edit_action(author: user1, project: project)
+ counter.track_sfe_edit_action(author: user1, project: project)
+ counter.track_snippet_editor_edit_action(author: user1, project: project)
+ counter.track_snippet_editor_edit_action(author: user1, time: time - 3.days, project: project)
- counter.track_web_ide_edit_action(author: user2)
- counter.track_sfe_edit_action(author: user2)
+ counter.track_web_ide_edit_action(author: user2, project: project)
+ counter.track_sfe_edit_action(author: user2, project: project)
- counter.track_web_ide_edit_action(author: user3, time: time - 3.days)
- counter.track_snippet_editor_edit_action(author: user3)
+ counter.track_web_ide_edit_action(author: user3, time: time - 3.days, project: project)
+ counter.track_snippet_editor_edit_action(author: user3, project: project)
end
it 'returns the distinct count of user actions within the specified time period' do
@@ -1212,6 +1208,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
let(:ignored_metrics) { ["i_package_composer_deploy_token_weekly"] }
it 'has all known_events' do
+ stub_feature_flags(use_redis_hll_instrumentation_classes: false)
expect(subject).to have_key(:redis_hll_counters)
expect(subject[:redis_hll_counters].keys).to match_array(categories)
@@ -1312,8 +1309,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
"in_product_marketing_email_team_1_sent" => -1,
"in_product_marketing_email_team_1_cta_clicked" => -1,
"in_product_marketing_email_team_2_sent" => -1,
- "in_product_marketing_email_team_2_cta_clicked" => -1,
- "in_product_marketing_email_experience_0_sent" => -1
+ "in_product_marketing_email_team_2_cta_clicked" => -1
}
expect(subject).to eq(expected_data)
@@ -1358,8 +1354,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
"in_product_marketing_email_team_1_sent" => 0,
"in_product_marketing_email_team_1_cta_clicked" => 0,
"in_product_marketing_email_team_2_sent" => 0,
- "in_product_marketing_email_team_2_cta_clicked" => 0,
- "in_product_marketing_email_experience_0_sent" => 0
+ "in_product_marketing_email_team_2_cta_clicked" => 0
}
expect(subject).to eq(expected_data)
@@ -1368,29 +1363,11 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
describe ".with_duration" do
- context 'with feature flag measure_service_ping_metric_collection turned off' do
- before do
- stub_feature_flags(measure_service_ping_metric_collection: false)
- end
-
- it 'does NOT record duration and return block response' do
- expect(::Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator).not_to receive(:new)
-
- expect(described_class.with_duration { 1 + 1 }).to be 2
- end
- end
+ it 'records duration' do
+ expect(::Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator)
+ .to receive(:new).with(2, kind_of(Float))
- context 'with feature flag measure_service_ping_metric_collection turned off' do
- before do
- stub_feature_flags(measure_service_ping_metric_collection: true)
- end
-
- it 'records duration' do
- expect(::Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator)
- .to receive(:new).with(2, kind_of(Float))
-
- described_class.with_duration { 1 + 1 }
- end
+ described_class.with_duration { 1 + 1 }
end
end
diff --git a/spec/lib/gitlab/user_access_spec.rb b/spec/lib/gitlab/user_access_spec.rb
index b1de3e21b77..1ae45d41f2d 100644
--- a/spec/lib/gitlab/user_access_spec.rb
+++ b/spec/lib/gitlab/user_access_spec.rb
@@ -219,19 +219,19 @@ RSpec.describe Gitlab::UserAccess do
describe '#can_create_tag?' do
describe 'push to none protected tag' do
it 'returns true if user is a maintainer' do
- project.add_user(user, :maintainer)
+ project.add_member(user, :maintainer)
expect(access.can_create_tag?('random_tag')).to be_truthy
end
it 'returns true if user is a developer' do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
expect(access.can_create_tag?('random_tag')).to be_truthy
end
it 'returns false if user is a reporter' do
- project.add_user(user, :reporter)
+ project.add_member(user, :reporter)
expect(access.can_create_tag?('random_tag')).to be_falsey
end
@@ -242,19 +242,19 @@ RSpec.describe Gitlab::UserAccess do
let(:not_existing_tag) { create :protected_tag, project: project }
it 'returns true if user is a maintainer' do
- project.add_user(user, :maintainer)
+ project.add_member(user, :maintainer)
expect(access.can_create_tag?(tag.name)).to be_truthy
end
it 'returns false if user is a developer' do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
expect(access.can_create_tag?(tag.name)).to be_falsey
end
it 'returns false if user is a reporter' do
- project.add_user(user, :reporter)
+ project.add_member(user, :reporter)
expect(access.can_create_tag?(tag.name)).to be_falsey
end
@@ -266,19 +266,19 @@ RSpec.describe Gitlab::UserAccess do
end
it 'returns true if user is a maintainer' do
- project.add_user(user, :maintainer)
+ project.add_member(user, :maintainer)
expect(access.can_create_tag?(@tag.name)).to be_truthy
end
it 'returns true if user is a developer' do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
expect(access.can_create_tag?(@tag.name)).to be_truthy
end
it 'returns false if user is a reporter' do
- project.add_user(user, :reporter)
+ project.add_member(user, :reporter)
expect(access.can_create_tag?(@tag.name)).to be_falsey
end
@@ -288,19 +288,19 @@ RSpec.describe Gitlab::UserAccess do
describe '#can_delete_branch?' do
describe 'delete unprotected branch' do
it 'returns true if user is a maintainer' do
- project.add_user(user, :maintainer)
+ project.add_member(user, :maintainer)
expect(access.can_delete_branch?('random_branch')).to be_truthy
end
it 'returns true if user is a developer' do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
expect(access.can_delete_branch?('random_branch')).to be_truthy
end
it 'returns false if user is a reporter' do
- project.add_user(user, :reporter)
+ project.add_member(user, :reporter)
expect(access.can_delete_branch?('random_branch')).to be_falsey
end
@@ -310,19 +310,19 @@ RSpec.describe Gitlab::UserAccess do
let(:branch) { create(:protected_branch, project: project, name: "test") }
it 'returns true if user is a maintainer' do
- project.add_user(user, :maintainer)
+ project.add_member(user, :maintainer)
expect(access.can_delete_branch?(branch.name)).to be_truthy
end
it 'returns false if user is a developer' do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
expect(access.can_delete_branch?(branch.name)).to be_falsey
end
it 'returns false if user is a reporter' do
- project.add_user(user, :reporter)
+ project.add_member(user, :reporter)
expect(access.can_delete_branch?(branch.name)).to be_falsey
end
@@ -334,7 +334,7 @@ RSpec.describe Gitlab::UserAccess do
context 'when user cannot push_code to a project repository (eg. as a guest)' do
it 'is false' do
- project.add_user(user, :guest)
+ project.add_member(user, :guest)
expect(access.can_push_for_ref?(ref)).to be_falsey
end
@@ -342,7 +342,7 @@ RSpec.describe Gitlab::UserAccess do
context 'when user can push_code to a project repository (eg. as a developer)' do
it 'is true' do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
expect(access.can_push_for_ref?(ref)).to be_truthy
end
diff --git a/spec/lib/gitlab/version_info_spec.rb b/spec/lib/gitlab/version_info_spec.rb
index f81e3aa070a..6ed094f11c8 100644
--- a/spec/lib/gitlab/version_info_spec.rb
+++ b/spec/lib/gitlab/version_info_spec.rb
@@ -1,73 +1,170 @@
# frozen_string_literal: true
-require 'spec_helper'
+require 'fast_spec_helper'
-RSpec.describe 'Gitlab::VersionInfo' do
+RSpec.describe Gitlab::VersionInfo do
before do
- @unknown = Gitlab::VersionInfo.new
- @v0_0_1 = Gitlab::VersionInfo.new(0, 0, 1)
- @v0_1_0 = Gitlab::VersionInfo.new(0, 1, 0)
- @v1_0_0 = Gitlab::VersionInfo.new(1, 0, 0)
- @v1_0_1 = Gitlab::VersionInfo.new(1, 0, 1)
- @v1_1_0 = Gitlab::VersionInfo.new(1, 1, 0)
- @v2_0_0 = Gitlab::VersionInfo.new(2, 0, 0)
+ @unknown = described_class.new
+ @v0_0_1 = described_class.new(0, 0, 1)
+ @v0_1_0 = described_class.new(0, 1, 0)
+ @v1_0_0 = described_class.new(1, 0, 0)
+ @v1_0_1 = described_class.new(1, 0, 1)
+ @v1_0_1_b1 = described_class.new(1, 0, 1, '-b1')
+ @v1_0_1_rc1 = described_class.new(1, 0, 1, '-rc1')
+ @v1_0_1_rc2 = described_class.new(1, 0, 1, '-rc2')
+ @v1_1_0 = described_class.new(1, 1, 0)
+ @v1_1_0_beta1 = described_class.new(1, 1, 0, '-beta1')
+ @v2_0_0 = described_class.new(2, 0, 0)
+ @v13_10_1_1574_89 = described_class.parse("v13.10.1~beta.1574.gf6ea9389", parse_suffix: true)
+ @v13_10_1_1575_89 = described_class.parse("v13.10.1~beta.1575.gf6ea9389", parse_suffix: true)
+ @v13_10_1_1575_90 = described_class.parse("v13.10.1~beta.1575.gf6ea9390", parse_suffix: true)
end
- context '>' do
+ describe '>' do
it { expect(@v2_0_0).to be > @v1_1_0 }
it { expect(@v1_1_0).to be > @v1_0_1 }
+ it { expect(@v1_0_1_b1).to be > @v1_0_0 }
+ it { expect(@v1_0_1_rc1).to be > @v1_0_0 }
+ it { expect(@v1_0_1_rc1).to be > @v1_0_1_b1 }
+ it { expect(@v1_0_1_rc2).to be > @v1_0_1_rc1 }
+ it { expect(@v1_0_1).to be > @v1_0_1_rc1 }
+ it { expect(@v1_0_1).to be > @v1_0_1_rc2 }
it { expect(@v1_0_1).to be > @v1_0_0 }
it { expect(@v1_0_0).to be > @v0_1_0 }
+ it { expect(@v1_1_0_beta1).to be > @v1_0_1_rc2 }
+ it { expect(@v1_1_0).to be > @v1_1_0_beta1 }
it { expect(@v0_1_0).to be > @v0_0_1 }
end
- context '>=' do
- it { expect(@v2_0_0).to be >= Gitlab::VersionInfo.new(2, 0, 0) }
+ describe '>=' do
+ it { expect(@v2_0_0).to be >= described_class.new(2, 0, 0) }
it { expect(@v2_0_0).to be >= @v1_1_0 }
+ it { expect(@v1_0_1_rc2).to be >= @v1_0_1_rc1 }
end
- context '<' do
+ describe '<' do
it { expect(@v0_0_1).to be < @v0_1_0 }
it { expect(@v0_1_0).to be < @v1_0_0 }
it { expect(@v1_0_0).to be < @v1_0_1 }
it { expect(@v1_0_1).to be < @v1_1_0 }
+ it { expect(@v1_0_0).to be < @v1_0_1_rc2 }
+ it { expect(@v1_0_1_rc1).to be < @v1_0_1 }
+ it { expect(@v1_0_1_rc1).to be < @v1_0_1_rc2 }
+ it { expect(@v1_0_1_rc2).to be < @v1_0_1 }
it { expect(@v1_1_0).to be < @v2_0_0 }
+ it { expect(@v13_10_1_1574_89).to be < @v13_10_1_1575_89 }
+ it { expect(@v13_10_1_1575_89).to be < @v13_10_1_1575_90 }
end
- context '<=' do
- it { expect(@v0_0_1).to be <= Gitlab::VersionInfo.new(0, 0, 1) }
+ describe '<=' do
+ it { expect(@v0_0_1).to be <= described_class.new(0, 0, 1) }
it { expect(@v0_0_1).to be <= @v0_1_0 }
+ it { expect(@v1_0_1_b1).to be <= @v1_0_1_rc1 }
+ it { expect(@v1_0_1_rc1).to be <= @v1_0_1_rc2 }
+ it { expect(@v1_1_0_beta1).to be <= @v1_1_0 }
end
- context '==' do
- it { expect(@v0_0_1).to eq(Gitlab::VersionInfo.new(0, 0, 1)) }
- it { expect(@v0_1_0).to eq(Gitlab::VersionInfo.new(0, 1, 0)) }
- it { expect(@v1_0_0).to eq(Gitlab::VersionInfo.new(1, 0, 0)) }
+ describe '==' do
+ it { expect(@v0_0_1).to eq(described_class.new(0, 0, 1)) }
+ it { expect(@v0_1_0).to eq(described_class.new(0, 1, 0)) }
+ it { expect(@v1_0_0).to eq(described_class.new(1, 0, 0)) }
+ it { expect(@v1_0_1_rc1).to eq(described_class.new(1, 0, 1, '-rc1')) }
end
- context '!=' do
+ describe '!=' do
it { expect(@v0_0_1).not_to eq(@v0_1_0) }
+ it { expect(@v1_0_1_rc1).not_to eq(@v1_0_1_rc2) }
end
- context 'unknown' do
+ describe '.unknown' do
it { expect(@unknown).not_to be @v0_0_1 }
- it { expect(@unknown).not_to be Gitlab::VersionInfo.new }
+ it { expect(@unknown).not_to be described_class.new }
it { expect {@unknown > @v0_0_1}.to raise_error(ArgumentError) }
it { expect {@unknown < @v0_0_1}.to raise_error(ArgumentError) }
end
- context 'parse' do
- it { expect(Gitlab::VersionInfo.parse("1.0.0")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("1.0.0.1")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("1.0.0-ee")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("1.0.0-rc1")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("1.0.0-rc1-ee")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("git 1.0.0b1")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("git 1.0b1")).not_to be_valid }
+ describe '.parse' do
+ it { expect(described_class.parse("1.0.0")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0.1")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0-ee")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0-rc1")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0-rc1-ee")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("git 1.0.0b1")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("git 1.0b1")).not_to be_valid }
+
+ context 'with parse_suffix: true' do
+ let(:versions) do
+ <<-VERSIONS.lines
+ 0.0.1
+ 0.1.0
+ 1.0.0
+ 1.0.1-b1
+ 1.0.1-rc1
+ 1.0.1-rc2
+ 1.0.1
+ 1.1.0-beta1
+ 1.1.0
+ 2.0.0
+ v13.10.0-pre
+ v13.10.0-rc1
+ v13.10.0-rc2
+ v13.10.0
+ v13.10.1~beta.1574.gf6ea9389
+ v13.10.1~beta.1575.gf6ea9389
+ v13.10.1-rc1
+ v13.10.1-rc2
+ v13.10.1
+ VERSIONS
+ end
+
+ let(:parsed_versions) do
+ versions.map(&:strip).map { |version| described_class.parse(version, parse_suffix: true) }
+ end
+
+ it 'versions are returned in a correct order' do
+ expect(parsed_versions.shuffle.sort).to eq(parsed_versions)
+ end
+ end
end
- context 'to_s' do
+ describe '.to_s' do
it { expect(@v1_0_0.to_s).to eq("1.0.0") }
+ it { expect(@v1_0_1_rc1.to_s).to eq("1.0.1-rc1") }
it { expect(@unknown.to_s).to eq("Unknown") }
end
+
+ describe '.hash' do
+ it { expect(described_class.parse("1.0.0").hash).to eq(@v1_0_0.hash) }
+ it { expect(described_class.parse("1.0.0.1").hash).to eq(@v1_0_0.hash) }
+ it { expect(described_class.parse("1.0.1b1").hash).to eq(@v1_0_1.hash) }
+ it { expect(described_class.parse("1.0.1-rc1", parse_suffix: true).hash).to eq(@v1_0_1_rc1.hash) }
+ end
+
+ describe '.eql?' do
+ it { expect(described_class.parse("1.0.0").eql?(@v1_0_0)).to be_truthy }
+ it { expect(described_class.parse("1.0.0.1").eql?(@v1_0_0)).to be_truthy }
+ it { expect(@v1_0_1_rc1.eql?(@v1_0_1_rc1)).to be_truthy }
+ it { expect(@v1_0_1_rc1.eql?(@v1_0_1_rc2)).to be_falsey }
+ it { expect(@v1_0_1_rc1.eql?(@v1_0_1)).to be_falsey }
+ it { expect(@v1_0_1.eql?(@v1_0_0)).to be_falsey }
+ it { expect(@v1_1_0.eql?(@v1_0_0)).to be_falsey }
+ it { expect(@v1_0_0.eql?(@v1_0_0)).to be_truthy }
+ it { expect([@v1_0_0, @v1_1_0, @v1_0_0, @v1_0_1_rc1, @v1_0_1_rc1].uniq).to eq [@v1_0_0, @v1_1_0, @v1_0_1_rc1] }
+ end
+
+ describe '.same_minor_version?' do
+ it { expect(@v0_1_0.same_minor_version?(@v0_0_1)).to be_falsey }
+ it { expect(@v1_0_1.same_minor_version?(@v1_0_0)).to be_truthy }
+ it { expect(@v1_0_1_rc1.same_minor_version?(@v1_0_0)).to be_truthy }
+ it { expect(@v1_0_0.same_minor_version?(@v1_0_1)).to be_truthy }
+ it { expect(@v1_1_0.same_minor_version?(@v1_0_0)).to be_falsey }
+ it { expect(@v2_0_0.same_minor_version?(@v1_0_0)).to be_falsey }
+ end
+
+ describe '.without_patch' do
+ it { expect(@v0_1_0.without_patch).to eq(@v0_1_0) }
+ it { expect(@v1_0_0.without_patch).to eq(@v1_0_0) }
+ it { expect(@v1_0_1.without_patch).to eq(@v1_0_0) }
+ it { expect(@v1_0_1_rc1.without_patch).to eq(@v1_0_0) }
+ end
end
diff --git a/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb b/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb
index c0629c8d795..3152dc2ad2f 100644
--- a/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb
+++ b/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb
@@ -3,10 +3,11 @@
require 'spec_helper'
RSpec.describe Gitlab::WikiPages::FrontMatterParser do
- subject(:parser) { described_class.new(raw_content) }
+ subject(:parser) { described_class.new(raw_content, gate) }
let(:content) { 'This is the content' }
let(:end_divider) { '---' }
+ let(:gate) { stub_feature_flag_gate('Gate') }
let(:with_front_matter) do
<<~MD
@@ -61,6 +62,32 @@ RSpec.describe Gitlab::WikiPages::FrontMatterParser do
it { is_expected.to have_attributes(reason: :no_match) }
end
+ context 'the feature flag is disabled' do
+ let(:raw_content) { with_front_matter }
+
+ before do
+ stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => false)
+ end
+
+ it { is_expected.to have_attributes(front_matter: be_empty, content: raw_content) }
+ end
+
+ context 'the feature flag is enabled for the gated object' do
+ let(:raw_content) { with_front_matter }
+
+ before do
+ stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => gate)
+ end
+
+ it do
+ is_expected.to have_attributes(
+ front_matter: have_correct_front_matter,
+ content: content + "\n",
+ reason: be_nil
+ )
+ end
+ end
+
context 'the end divider is ...' do
let(:end_divider) { '...' }
let(:raw_content) { with_front_matter }
diff --git a/spec/lib/gitlab/x509/certificate_spec.rb b/spec/lib/gitlab/x509/certificate_spec.rb
index 2dc30cc871d..d919b99de2a 100644
--- a/spec/lib/gitlab/x509/certificate_spec.rb
+++ b/spec/lib/gitlab/x509/certificate_spec.rb
@@ -116,9 +116,69 @@ RSpec.describe Gitlab::X509::Certificate do
end
end
+ describe '.default_cert_dir' do
+ before do
+ described_class.reset_default_cert_paths
+ end
+
+ after(:context) do
+ described_class.reset_default_cert_paths
+ end
+
+ context 'when SSL_CERT_DIR env variable is not set' do
+ before do
+ stub_env('SSL_CERT_DIR', nil)
+ end
+
+ it 'returns default directory from OpenSSL' do
+ expect(described_class.default_cert_dir).to eq(OpenSSL::X509::DEFAULT_CERT_DIR)
+ end
+ end
+
+ context 'when SSL_CERT_DIR env variable is set' do
+ before do
+ stub_env('SSL_CERT_DIR', '/tmp/foo/certs')
+ end
+
+ it 'returns specified directory' do
+ expect(described_class.default_cert_dir).to eq('/tmp/foo/certs')
+ end
+ end
+ end
+
+ describe '.default_cert_file' do
+ before do
+ described_class.reset_default_cert_paths
+ end
+
+ after(:context) do
+ described_class.reset_default_cert_paths
+ end
+
+ context 'when SSL_CERT_FILE env variable is not set' do
+ before do
+ stub_env('SSL_CERT_FILE', nil)
+ end
+
+ it 'returns default file from OpenSSL' do
+ expect(described_class.default_cert_file).to eq(OpenSSL::X509::DEFAULT_CERT_FILE)
+ end
+ end
+
+ context 'when SSL_CERT_FILE env variable is set' do
+ before do
+ stub_env('SSL_CERT_FILE', '/tmp/foo/cert.pem')
+ end
+
+ it 'returns specified file' do
+ expect(described_class.default_cert_file).to eq('/tmp/foo/cert.pem')
+ end
+ end
+ end
+
describe '.ca_certs_paths' do
it 'returns all files specified by OpenSSL defaults' do
- cert_paths = Dir["#{OpenSSL::X509::DEFAULT_CERT_DIR}/*"]
+ cert_paths = Dir["#{described_class.default_cert_dir}/*"]
expect(described_class.ca_certs_paths).to match_array(cert_paths + [sample_cert])
end
diff --git a/spec/lib/gitlab/x509/commit_spec.rb b/spec/lib/gitlab/x509/commit_spec.rb
index a81955b995e..c7d56e49fab 100644
--- a/spec/lib/gitlab/x509/commit_spec.rb
+++ b/spec/lib/gitlab/x509/commit_spec.rb
@@ -2,14 +2,21 @@
require 'spec_helper'
RSpec.describe Gitlab::X509::Commit do
- describe '#signature' do
- let(:signature) { described_class.new(commit).signature }
+ let(:commit_sha) { '189a6c924013fc3fe40d6f1ec1dc20214183bc97' }
+ let(:user) { create(:user, email: X509Helpers::User1.certificate_email) }
+ let(:project) { create(:project, :repository, path: X509Helpers::User1.path, creator: user) }
+ let(:commit) { project.commit_by(oid: commit_sha ) }
+ let(:signature) { Gitlab::X509::Commit.new(commit).signature }
+ let(:store) { OpenSSL::X509::Store.new }
+ let(:certificate) { OpenSSL::X509::Certificate.new(X509Helpers::User1.trust_cert) }
- context 'returns the cached signature' do
- let(:commit_sha) { '189a6c924013fc3fe40d6f1ec1dc20214183bc97' }
- let(:project) { create(:project, :public, :repository) }
- let(:commit) { create(:commit, project: project, sha: commit_sha) }
+ before do
+ store.add_cert(certificate) if certificate
+ allow(OpenSSL::X509::Store).to receive(:new).and_return(store)
+ end
+ describe '#signature' do
+ context 'returns the cached signature' do
it 'on second call' do
allow_any_instance_of(described_class).to receive(:new).and_call_original
expect_any_instance_of(described_class).to receive(:create_cached_signature!).and_call_original
@@ -23,13 +30,29 @@ RSpec.describe Gitlab::X509::Commit do
end
context 'unsigned commit' do
- let!(:project) { create :project, :repository, path: X509Helpers::User1.path }
- let!(:commit_sha) { X509Helpers::User1.commit }
- let!(:commit) { create :commit, project: project, sha: commit_sha }
+ let(:project) { create :project, :repository, path: X509Helpers::User1.path }
+ let(:commit_sha) { X509Helpers::User1.commit }
+ let(:commit) { create :commit, project: project, sha: commit_sha }
it 'returns nil' do
expect(signature).to be_nil
end
end
end
+
+ describe '#update_signature!' do
+ let(:certificate) { nil }
+
+ it 'updates verification status' do
+ signature
+
+ cert = OpenSSL::X509::Certificate.new(X509Helpers::User1.trust_cert)
+ store.add_cert(cert)
+
+ stored_signature = CommitSignatures::X509CommitSignature.find_by_commit_sha(commit_sha)
+ expect { described_class.new(commit).update_signature!(stored_signature) }.to(
+ change { signature.reload.verification_status }.from('unverified').to('verified')
+ )
+ end
+ end
end
diff --git a/spec/lib/gitlab/x509/signature_spec.rb b/spec/lib/gitlab/x509/signature_spec.rb
index 0e34d5393d6..5626e49bfe1 100644
--- a/spec/lib/gitlab/x509/signature_spec.rb
+++ b/spec/lib/gitlab/x509/signature_spec.rb
@@ -107,7 +107,7 @@ RSpec.describe Gitlab::X509::Signature do
f.print certificate.to_pem
end
- stub_const("OpenSSL::X509::DEFAULT_CERT_FILE", file_path)
+ allow(Gitlab::X509::Certificate).to receive(:default_cert_file).and_return(file_path)
allow(OpenSSL::X509::Store).to receive(:new).and_return(store)
end
diff --git a/spec/lib/google_api/cloud_platform/client_spec.rb b/spec/lib/google_api/cloud_platform/client_spec.rb
index a81ed38382b..ba49c00245e 100644
--- a/spec/lib/google_api/cloud_platform/client_spec.rb
+++ b/spec/lib/google_api/cloud_platform/client_spec.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
+require 'google/apis/sqladmin_v1beta4'
RSpec.describe GoogleApi::CloudPlatform::Client do
let(:token) { 'token' }
@@ -8,6 +9,7 @@ RSpec.describe GoogleApi::CloudPlatform::Client do
let(:user_agent_options) { client.instance_eval { user_agent_header } }
let(:gcp_project_id) { String('gcp_proj_id') }
let(:operation) { true }
+ let(:database_instance) { Google::Apis::SqladminV1beta4::DatabaseInstance.new(state: 'RUNNABLE') }
describe '.session_key_for_redirect_uri' do
let(:state) { 'random_string' }
@@ -350,4 +352,40 @@ RSpec.describe GoogleApi::CloudPlatform::Client do
.to_return(status: 200, body: "", headers: {})
end
end
+
+ describe '#create_cloudsql_database' do
+ subject { client.create_cloudsql_database(:gcp_project_id, :instance_name, :database_name) }
+
+ it 'calls Google Api SQLAdminService#insert_database' do
+ expect_any_instance_of(Google::Apis::SqladminV1beta4::SQLAdminService)
+ .to receive(:insert_database)
+ .with(any_args)
+ .and_return(operation)
+ is_expected.to eq(operation)
+ end
+ end
+
+ describe '#create_cloudsql_user' do
+ subject { client.create_cloudsql_user(:gcp_project_id, :instance_name, :database_name, :user_name) }
+
+ it 'calls Google Api SQLAdminService#insert_user' do
+ expect_any_instance_of(Google::Apis::SqladminV1beta4::SQLAdminService)
+ .to receive(:insert_user)
+ .with(any_args)
+ .and_return(operation)
+ is_expected.to eq(operation)
+ end
+ end
+
+ describe '#get_cloudsql_instance' do
+ subject { client.get_cloudsql_instance(:gcp_project_id, :instance_name) }
+
+ it 'calls Google Api SQLAdminService#get_instance' do
+ expect_any_instance_of(Google::Apis::SqladminV1beta4::SQLAdminService)
+ .to receive(:get_instance)
+ .with(any_args)
+ .and_return(database_instance)
+ is_expected.to eq(database_instance)
+ end
+ end
end
diff --git a/spec/lib/initializer_connections_spec.rb b/spec/lib/initializer_connections_spec.rb
new file mode 100644
index 00000000000..4ca283c4f22
--- /dev/null
+++ b/spec/lib/initializer_connections_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe InitializerConnections do
+ describe '.with_disabled_database_connections', :reestablished_active_record_base do
+ def block_with_database_call
+ described_class.with_disabled_database_connections do
+ Project.first
+ end
+ end
+
+ def block_with_error
+ described_class.with_disabled_database_connections do
+ raise "oops, an error"
+ end
+ end
+
+ it 'prevents any database connection within the block' do
+ expect { block_with_database_call }.to raise_error(/Database connection should not be called during initializer/)
+ end
+
+ it 'does not prevent database connection if SKIP_RAISE_ON_INITIALIZE_CONNECTIONS is set' do
+ stub_env('SKIP_RAISE_ON_INITIALIZE_CONNECTIONS', '1')
+
+ expect { block_with_database_call }.not_to raise_error
+ end
+
+ it 'prevents any database connection if SKIP_RAISE_ON_INITIALIZE_CONNECTIONS is false' do
+ stub_env('SKIP_RAISE_ON_INITIALIZE_CONNECTIONS', 'false')
+
+ expect { block_with_database_call }.to raise_error(/Database connection should not be called during initializer/)
+ end
+
+ it 'restores original connection handler' do
+ # rubocop:disable Database/MultipleDatabases
+ original_handler = ActiveRecord::Base.connection_handler
+
+ expect { block_with_database_call }.to raise_error(/Database connection should not be called during initializer/)
+
+ expect(ActiveRecord::Base.connection_handler).to eq(original_handler)
+ # rubocop:enabled Database/MultipleDatabases
+ end
+
+ it 'restores original connection handler even there is an error' do
+ # rubocop:disable Database/MultipleDatabases
+ original_handler = ActiveRecord::Base.connection_handler
+
+ expect { block_with_error }.to raise_error(/an error/)
+
+ expect(ActiveRecord::Base.connection_handler).to eq(original_handler)
+ # rubocop:enabled Database/MultipleDatabases
+ end
+
+ it 'raises if any new connection_pools are established in the block' do
+ expect do
+ described_class.with_disabled_database_connections do
+ ApplicationRecord.connects_to database: { writing: :main, reading: :main }
+ end
+ end.to raise_error(/Unxpected connection_pools/)
+ end
+ end
+end
diff --git a/spec/lib/json_web_token/rsa_token_spec.rb b/spec/lib/json_web_token/rsa_token_spec.rb
index 8f0d62d8f0c..6d2026752d6 100644
--- a/spec/lib/json_web_token/rsa_token_spec.rb
+++ b/spec/lib/json_web_token/rsa_token_spec.rb
@@ -41,7 +41,7 @@ RSpec.describe JSONWebToken::RSAToken do
end
context 'for invalid key to raise an exception' do
- let(:new_key) { OpenSSL::PKey::RSA.generate(512) }
+ let(:new_key) { OpenSSL::PKey::RSA.generate(3072) }
subject { JWT.decode(rsa_encoded, new_key, true, { algorithm: 'RS256' }) }
diff --git a/spec/lib/learn_gitlab/onboarding_spec.rb b/spec/lib/learn_gitlab/onboarding_spec.rb
index 8c7284ed7f5..3e22ce59091 100644
--- a/spec/lib/learn_gitlab/onboarding_spec.rb
+++ b/spec/lib/learn_gitlab/onboarding_spec.rb
@@ -6,11 +6,14 @@ RSpec.describe LearnGitlab::Onboarding do
describe '#completed_percentage' do
let(:completed_actions) { {} }
let(:onboarding_progress) { build(:onboarding_progress, namespace: namespace, **completed_actions) }
- let(:namespace) { build(:namespace) }
+ let(:namespace) { create(:namespace) }
let_it_be(:tracked_action_columns) do
- tracked_actions = described_class::ACTION_ISSUE_IDS.keys + described_class::ACTION_PATHS
- tracked_actions.map { |key| OnboardingProgress.column_name(key) }
+ [
+ *described_class::ACTION_ISSUE_IDS.keys,
+ *described_class::ACTION_PATHS,
+ :security_scan_enabled
+ ].map { |key| OnboardingProgress.column_name(key) }
end
before do
@@ -29,12 +32,6 @@ RSpec.describe LearnGitlab::Onboarding do
it { is_expected.to eq(0) }
end
- context 'when one action has been completed' do
- let(:completed_actions) { Hash[tracked_action_columns.first, Time.current] }
-
- it { is_expected.to eq(11) }
- end
-
context 'when all tracked actions have been completed' do
let(:completed_actions) do
tracked_action_columns.to_h { |action| [action, Time.current] }
@@ -42,5 +39,25 @@ RSpec.describe LearnGitlab::Onboarding do
it { is_expected.to eq(100) }
end
+
+ describe 'security_actions_continuous_onboarding experiment' do
+ let(:completed_actions) { Hash[tracked_action_columns.first, Time.current] }
+
+ context 'when control' do
+ before do
+ stub_experiments(security_actions_continuous_onboarding: :control)
+ end
+
+ it { is_expected.to eq(11) }
+ end
+
+ context 'when candidate' do
+ before do
+ stub_experiments(security_actions_continuous_onboarding: :candidate)
+ end
+
+ it { is_expected.to eq(9) }
+ 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 b11c9db4e46..ba5137e2b92 100644
--- a/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
@@ -68,34 +68,6 @@ RSpec.describe Sidebars::Projects::Menus::MonitorMenu do
it_behaves_like 'access rights checks'
end
- describe 'Logs' do
- let(:item_id) { :logs }
-
- it_behaves_like 'access rights checks'
-
- context 'when feature disabled' do
- before do
- stub_feature_flags(monitor_logging: false)
- end
-
- specify { is_expected.to be_nil }
- end
- end
-
- describe 'Tracing' do
- let(:item_id) { :tracing }
-
- it_behaves_like 'access rights checks'
-
- context 'when feature disabled' do
- before do
- stub_feature_flags(monitor_tracing: false)
- end
-
- specify { is_expected.to be_nil }
- end
- end
-
describe 'Error Tracking' do
let(:item_id) { :error_tracking }
diff --git a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
index d6136dddf40..f41f7a01d88 100644
--- a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
@@ -135,18 +135,20 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu do
describe 'Packages & Registries' do
let(:item_id) { :packages_and_registries }
+ let(:packages_enabled) { false }
before do
stub_container_registry_config(enabled: container_enabled)
+ stub_config(packages: { enabled: packages_enabled })
end
- describe 'when config registry setting is disabled' do
+ describe 'when container registry setting is disabled' do
let(:container_enabled) { false }
specify { is_expected.to be_nil }
end
- describe 'when config registry setting is enabled' do
+ describe 'when container registry setting is enabled' do
let(:container_enabled) { true }
specify { is_expected.not_to be_nil }
@@ -157,6 +159,19 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu do
specify { is_expected.to be_nil }
end
end
+
+ describe 'when package registry setting is enabled' do
+ let(:container_enabled) { false }
+ let(:packages_enabled) { true }
+
+ 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
end
describe 'Usage Quotas' do
diff --git a/spec/lib/unnested_in_filters/dsl_spec.rb b/spec/lib/unnested_in_filters/dsl_spec.rb
new file mode 100644
index 00000000000..bce4c88f94c
--- /dev/null
+++ b/spec/lib/unnested_in_filters/dsl_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe UnnestedInFilters::Dsl do
+ let(:test_model) do
+ Class.new(ApplicationRecord) do
+ include UnnestedInFilters::Dsl
+
+ self.table_name = 'users'
+ end
+ end
+
+ describe '#exists?' do
+ let(:states) { %w(active banned) }
+
+ subject { test_model.where(state: states).use_unnested_filters.exists? }
+
+ context 'when there is no record in the database with given filters' do
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when there is a record in the database with given filters' do
+ before do
+ create(:user, state: :active)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+end
diff --git a/spec/lib/unnested_in_filters/rewriter_spec.rb b/spec/lib/unnested_in_filters/rewriter_spec.rb
new file mode 100644
index 00000000000..e2ccbd92504
--- /dev/null
+++ b/spec/lib/unnested_in_filters/rewriter_spec.rb
@@ -0,0 +1,157 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe UnnestedInFilters::Rewriter do
+ let(:rewriter) { described_class.new(relation) }
+
+ before(:all) do
+ User.include(UnnestedInFilters::Dsl)
+ end
+
+ describe '#rewrite?' do
+ subject(:rewrite?) { rewriter.rewrite? }
+
+ context 'when the given relation does not have an `IN` predicate' do
+ let(:relation) { User.where(username: 'user') }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when the given relation has an `IN` predicate' do
+ context 'when there is no index coverage for the used columns' do
+ let(:relation) { User.where(username: %w(user_1 user_2), state: :active) }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when there is an index coverage for the used columns' do
+ let(:relation) { User.where(state: :active, user_type: [:support_bot, :alert_bot]) }
+
+ it { is_expected.to be_truthy }
+
+ context 'when there is an ordering' do
+ let(:relation) { User.where(state: %w(active blocked banned)).order(order).limit(2) }
+
+ context 'when the order is an Arel node' do
+ let(:order) { { user_type: :desc } }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when the order is a Keyset order' do
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'user_type',
+ order_expression: User.arel_table['user_type'].desc,
+ nullable: :not_nullable,
+ distinct: false
+ )
+ ])
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+ end
+ end
+
+ describe '#rewrite' do
+ let(:recorded_queries) { ActiveRecord::QueryRecorder.new { rewriter.rewrite.load } }
+ let(:relation) { User.where(state: :active, user_type: %i(support_bot alert_bot)).limit(2) }
+
+ let(:expected_query) do
+ <<~SQL
+ SELECT
+ "users".*
+ FROM
+ unnest('{1,2}'::smallint[]) AS "user_types"("user_type"),
+ LATERAL (
+ SELECT
+ "users".*
+ FROM
+ "users"
+ WHERE
+ "users"."state" = 'active' AND
+ (users."user_type" = "user_types"."user_type")
+ LIMIT 2
+ ) AS users
+ LIMIT 2
+ SQL
+ end
+
+ subject(:issued_query) { recorded_queries.occurrences.each_key.first }
+
+ it 'changes the query' do
+ expect(issued_query.gsub(/\s/, '')).to start_with(expected_query.gsub(/\s/, ''))
+ end
+
+ context 'when there is an order' do
+ let(:relation) { User.where(state: %w(active blocked banned)).order(order).limit(2) }
+ let(:expected_query) do
+ <<~SQL
+ SELECT
+ "users".*
+ FROM
+ unnest('{active,blocked,banned}'::charactervarying[]) AS "states"("state"),
+ LATERAL (
+ SELECT
+ "users".*
+ FROM
+ "users"
+ WHERE
+ (users."state" = "states"."state")
+ ORDER BY
+ "users"."user_type" DESC
+ LIMIT 2
+ ) AS users
+ ORDER BY
+ "users"."user_type" DESC
+ LIMIT 2
+ SQL
+ end
+
+ context 'when the order is an Arel node' do
+ let(:order) { { user_type: :desc } }
+
+ it 'changes the query' do
+ expect(issued_query.gsub(/\s/, '')).to start_with(expected_query.gsub(/\s/, ''))
+ end
+ end
+
+ context 'when the order is a Keyset order' do
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'user_type',
+ order_expression: User.arel_table['user_type'].desc,
+ nullable: :not_nullable,
+ distinct: false
+ )
+ ])
+ end
+
+ it 'changes the query' do
+ expect(issued_query.gsub(/\s/, '')).to start_with(expected_query.gsub(/\s/, ''))
+ end
+ end
+ end
+
+ describe 'logging' do
+ subject(:load_reload) { rewriter.rewrite }
+
+ before do
+ allow(::Gitlab::AppLogger).to receive(:info)
+ end
+
+ it 'logs the call' do
+ load_reload
+
+ expect(::Gitlab::AppLogger)
+ .to have_received(:info).with(message: 'Query is being rewritten by `UnnestedInFilters`', model: 'User')
+ end
+ end
+ end
+end
diff --git a/spec/mailers/devise_mailer_spec.rb b/spec/mailers/devise_mailer_spec.rb
index 2634d7c722b..360eb827927 100644
--- a/spec/mailers/devise_mailer_spec.rb
+++ b/spec/mailers/devise_mailer_spec.rb
@@ -126,4 +126,34 @@ RSpec.describe DeviseMailer do
is_expected.to have_link("Reset password", href: "#{Gitlab.config.gitlab.url}/users/password/edit?reset_password_token=faketoken")
end
end
+
+ describe '#email_changed' do
+ subject { described_class.email_changed(user, {}) }
+
+ let_it_be(:user) { create(:user) }
+
+ it_behaves_like 'an email sent from GitLab'
+
+ it 'is sent to the user' do
+ is_expected.to deliver_to user.email
+ end
+
+ it 'has the correct subject' do
+ is_expected.to have_subject 'Email Changed'
+ end
+
+ it 'greets the user' do
+ is_expected.to have_body_text /Hello, #{user.name}!/
+ end
+
+ context "email contains updated id" do
+ before do
+ user.update!(email: "new_email@test.com")
+ end
+
+ it 'includes changed email id' do
+ is_expected.to have_body_text /email is being changed to new_email@test.com./
+ end
+ end
+ end
end
diff --git a/spec/mailers/emails/admin_notification_spec.rb b/spec/mailers/emails/admin_notification_spec.rb
index a233be86a83..1b770d6d4a2 100644
--- a/spec/mailers/emails/admin_notification_spec.rb
+++ b/spec/mailers/emails/admin_notification_spec.rb
@@ -18,12 +18,14 @@ RSpec.describe Emails::AdminNotification do
let(:max_project_downloads) { 5 }
let(:time_period) { 600 }
+ let(:group) { nil }
subject do
Notify.user_auto_banned_email(
admin.id, user.id,
max_project_downloads: max_project_downloads,
- within_seconds: time_period
+ within_seconds: time_period,
+ group: group
)
end
@@ -45,6 +47,10 @@ RSpec.describe Emails::AdminNotification do
is_expected.to have_body_text user.name
end
+ it 'includes the scope of the ban' do
+ is_expected.to have_body_text "banned from your GitLab instance"
+ end
+
it 'includes the reason' do
is_expected.to have_body_text "due to them downloading more than 5 project repositories within 10 minutes"
end
@@ -58,7 +64,15 @@ RSpec.describe Emails::AdminNotification do
end
it 'includes the email reason' do
- is_expected.to have_body_text "You're receiving this email because of your account on localhost"
+ is_expected.to have_body_text %r{You're receiving this email because of your account on <a .*>localhost<\/a>}
+ end
+
+ context 'when scoped to a group' do
+ let(:group) { create(:group) }
+
+ it 'includes the scope of the ban' do
+ is_expected.to have_body_text "banned from your group (#{group.name})"
+ end
end
end
end
diff --git a/spec/mailers/emails/in_product_marketing_spec.rb b/spec/mailers/emails/in_product_marketing_spec.rb
index 7f3896a3d51..7c21e161ffe 100644
--- a/spec/mailers/emails/in_product_marketing_spec.rb
+++ b/spec/mailers/emails/in_product_marketing_spec.rb
@@ -65,7 +65,6 @@ RSpec.describe Emails::InProductMarketing do
:team | 0
:team | 1
:team | 2
- :experience | 0
:team_short | 0
:trial_short | 0
:admin_verify | 0
@@ -83,12 +82,7 @@ RSpec.describe Emails::InProductMarketing do
is_expected.to have_subject(message.subject_line)
is_expected.to have_body_text(message.title)
is_expected.to have_body_text(message.subtitle)
-
- if track == :experience
- is_expected.to have_body_text(CGI.unescapeHTML(message.feedback_link(1)))
- else
- is_expected.to have_body_text(CGI.unescapeHTML(message.cta_link))
- end
+ is_expected.to have_body_text(CGI.unescapeHTML(message.cta_link))
if track =~ /(create|verify)/
is_expected.to have_body_text(message.invite_text)
diff --git a/spec/mailers/emails/profile_spec.rb b/spec/mailers/emails/profile_spec.rb
index f4483f7e8f5..09ed27eb90f 100644
--- a/spec/mailers/emails/profile_spec.rb
+++ b/spec/mailers/emails/profile_spec.rb
@@ -151,7 +151,7 @@ RSpec.describe Emails::Profile do
end
it 'includes the email reason' do
- is_expected.to have_body_text /You're receiving this email because of your account on localhost/
+ is_expected.to have_body_text %r{You're receiving this email because of your account on <a .*>localhost<\/a>}
end
end
end
@@ -187,7 +187,7 @@ RSpec.describe Emails::Profile do
end
it 'includes the email reason' do
- is_expected.to have_body_text /You're receiving this email because of your account on localhost/
+ is_expected.to have_body_text %r{You're receiving this email because of your account on <a .*>localhost<\/a>}
end
context 'with User does not exist' do
@@ -222,7 +222,7 @@ RSpec.describe Emails::Profile do
end
it 'includes the email reason' do
- is_expected.to have_body_text /You're receiving this email because of your account on localhost/
+ is_expected.to have_body_text %r{You're receiving this email because of your account on <a .*>localhost<\/a>}
end
end
@@ -266,7 +266,7 @@ RSpec.describe Emails::Profile do
end
shared_examples 'includes the email reason' do
- it { is_expected.to have_body_text /You're receiving this email because of your account on localhost/ }
+ it { is_expected.to have_body_text %r{You're receiving this email because of your account on <a .*>localhost<\/a>} }
end
shared_examples 'valid use case' do
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index a9796c28870..8beb54bca4d 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Notify do
include EmailSpec::Helpers
include EmailSpec::Matchers
include EmailHelpers
+ include EmailsHelper
include RepoHelpers
include MembersHelper
@@ -396,7 +397,7 @@ RSpec.describe Notify do
end
end
- context 'when sent with a reason' do
+ context 'when sent with a reason', type: :helper do
subject { described_class.reassigned_merge_request_email(recipient.id, merge_request.id, [previous_assignee.id], current_user.id, NotificationReason::ASSIGNED) }
it_behaves_like 'appearance header and footer enabled'
@@ -407,15 +408,15 @@ RSpec.describe Notify do
end
it 'includes the reason in the footer' do
- text = EmailsHelper.instance_method(:notification_reason_text).bind(self).call(NotificationReason::ASSIGNED)
+ text = EmailsHelper.instance_method(:notification_reason_text).bind(self).call(reason: NotificationReason::ASSIGNED, format: :html)
is_expected.to have_body_text(text)
new_subject = described_class.reassigned_merge_request_email(recipient.id, merge_request.id, [previous_assignee.id], current_user.id, NotificationReason::MENTIONED)
- text = EmailsHelper.instance_method(:notification_reason_text).bind(self).call(NotificationReason::MENTIONED)
+ text = EmailsHelper.instance_method(:notification_reason_text).bind(self).call(reason: NotificationReason::MENTIONED, format: :html)
expect(new_subject).to have_body_text(text)
new_subject = described_class.reassigned_merge_request_email(recipient.id, merge_request.id, [previous_assignee.id], current_user.id, nil)
- text = EmailsHelper.instance_method(:notification_reason_text).bind(self).call(nil)
+ text = EmailsHelper.instance_method(:notification_reason_text).bind(self).call(format: :html)
expect(new_subject).to have_body_text(text)
end
end
@@ -1550,7 +1551,7 @@ RSpec.describe Notify do
end
describe 'invitations' do
- let(:owner) { create(:user).tap { |u| group.add_user(u, Gitlab::Access::OWNER) } }
+ let(:owner) { create(:user).tap { |u| group.add_member(u, Gitlab::Access::OWNER) } }
let(:group_member) { invite_to_group(group, inviter: inviter) }
let(:inviter) { owner }
@@ -1605,7 +1606,7 @@ RSpec.describe Notify do
end
describe 'group invitation reminders' do
- let_it_be(:inviter) { create(:user).tap { |u| group.add_user(u, Gitlab::Access::OWNER) } }
+ let_it_be(:inviter) { create(:user).tap { |u| group.add_member(u, Gitlab::Access::OWNER) } }
let(:group_member) { invite_to_group(group, inviter: inviter) }
@@ -1688,7 +1689,7 @@ RSpec.describe Notify do
describe 'group invitation accepted' do
let(:invited_user) { create(:user, name: 'invited user') }
- let(:owner) { create(:user).tap { |u| group.add_user(u, Gitlab::Access::OWNER) } }
+ let(:owner) { create(:user).tap { |u| group.add_member(u, Gitlab::Access::OWNER) } }
let(:group_member) do
invitee = invite_to_group(group, inviter: owner)
invitee.accept_invite!(invited_user)
@@ -1714,7 +1715,7 @@ RSpec.describe Notify do
end
describe 'group invitation declined' do
- let(:owner) { create(:user).tap { |u| group.add_user(u, Gitlab::Access::OWNER) } }
+ let(:owner) { create(:user).tap { |u| group.add_member(u, Gitlab::Access::OWNER) } }
let(:group_member) do
invitee = invite_to_group(group, inviter: owner)
invitee.decline_invite!
diff --git a/spec/metrics_server/metrics_server_spec.rb b/spec/metrics_server/metrics_server_spec.rb
index 4c188a6ba29..c7716184d48 100644
--- a/spec/metrics_server/metrics_server_spec.rb
+++ b/spec/metrics_server/metrics_server_spec.rb
@@ -171,6 +171,29 @@ RSpec.describe MetricsServer do # rubocop:disable RSpec/FilePath
described_class.spawn(target, metrics_dir: metrics_dir)
end
end
+
+ context 'when TLS settings are present' do
+ before do
+ %w(web_exporter sidekiq_exporter).each do |key|
+ settings[key]['tls_enabled'] = true
+ settings[key]['tls_cert_path'] = '/path/to/cert.pem'
+ settings[key]['tls_key_path'] = '/path/to/key.pem'
+ end
+ end
+
+ it 'sets the correct environment variables' do
+ expect(Process).to receive(:spawn).with(
+ expected_env.merge(
+ 'GME_CERT_FILE' => '/path/to/cert.pem',
+ 'GME_CERT_KEY' => '/path/to/key.pem'
+ ),
+ '/path/to/gme/gitlab-metrics-exporter',
+ hash_including(pgroup: true)
+ ).and_return(99)
+
+ described_class.spawn(target, metrics_dir: metrics_dir, path: '/path/to/gme/')
+ end
+ end
end
end
end
diff --git a/spec/migrations/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events_spec.rb b/spec/migrations/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events_spec.rb
new file mode 100644
index 00000000000..8cb6ab23fef
--- /dev/null
+++ b/spec/migrations/20220601152916_add_user_id_and_ip_address_success_index_to_authentication_events_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe AddUserIdAndIpAddressSuccessIndexToAuthenticationEvents do
+ let(:db) { described_class.new }
+ let(:old_index) { described_class::OLD_INDEX_NAME }
+ let(:new_index) { described_class::NEW_INDEX_NAME }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(db.connection.indexes(:authentication_events).map(&:name)).to include(old_index)
+ expect(db.connection.indexes(:authentication_events).map(&:name)).not_to include(new_index)
+ }
+
+ migration.after -> {
+ expect(db.connection.indexes(:authentication_events).map(&:name)).to include(new_index)
+ expect(db.connection.indexes(:authentication_events).map(&:name)).not_to include(old_index)
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences_spec.rb b/spec/migrations/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences_spec.rb
new file mode 100644
index 00000000000..1450811b3b9
--- /dev/null
+++ b/spec/migrations/20220606082910_add_tmp_index_for_potentially_misassociated_vulnerability_occurrences_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+require_migration!
+
+RSpec.describe AddTmpIndexForPotentiallyMisassociatedVulnerabilityOccurrences do
+ let(:async_index) { Gitlab::Database::AsyncIndexes::PostgresAsyncIndex }
+ let(:index_name) { described_class::INDEX_NAME }
+
+ it "schedules the index" do
+ reversible_migration do |migration|
+ migration.before -> do
+ expect(async_index.where(name: index_name).count).to be(0)
+ end
+
+ migration.after -> do
+ expect(async_index.where(name: index_name).count).to be(1)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220620132300_update_last_run_date_for_iterations_cadences_spec.rb b/spec/migrations/20220620132300_update_last_run_date_for_iterations_cadences_spec.rb
new file mode 100644
index 00000000000..d23ca8741a2
--- /dev/null
+++ b/spec/migrations/20220620132300_update_last_run_date_for_iterations_cadences_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe UpdateLastRunDateForIterationsCadences, :migration do
+ let(:current_date) { Date.parse(ApplicationRecord.connection.execute("SELECT CURRENT_DATE").first["current_date"]) }
+ let(:namespaces) { table(:namespaces) }
+ let(:iterations_cadences) { table(:iterations_cadences) }
+
+ let!(:group) { namespaces.create!(name: 'foo', path: 'foo') }
+ let!(:cadence_1) do
+ iterations_cadences.create!(group_id: group.id, title: "cadence 1", last_run_date: Date.today - 5.days)
+ end
+
+ let!(:cadence_2) { iterations_cadences.create!(group_id: group.id, title: "cadence 2", last_run_date: nil) }
+ let!(:cadence_3) do
+ iterations_cadences.create!(group_id: group.id, title: "cadence 2", last_run_date: nil, automatic: false)
+ end
+
+ it 'sets last_run_date to CURRENT_DATE for iterations cadences with automatic=true', :aggregate_failures do
+ migrate!
+
+ expect(cadence_1.reload.last_run_date).to eq(current_date)
+ expect(cadence_2.reload.last_run_date).to eq(current_date)
+ expect(cadence_3.reload.last_run_date).to eq(nil)
+ end
+end
diff --git a/spec/migrations/20220622080547_backfill_project_statistics_with_container_registry_size_spec.rb b/spec/migrations/20220622080547_backfill_project_statistics_with_container_registry_size_spec.rb
new file mode 100644
index 00000000000..52b75f0b8a9
--- /dev/null
+++ b/spec/migrations/20220622080547_backfill_project_statistics_with_container_registry_size_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe BackfillProjectStatisticsWithContainerRegistrySize do
+ let_it_be(:batched_migration) { described_class::MIGRATION_CLASS }
+
+ it 'does not schedule background jobs when Gitlab.com is false' do
+ allow(Gitlab).to receive(:com?).and_return(false)
+ allow(Gitlab).to receive(:dev_or_test_env?).and_return(false)
+
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(batched_migration).not_to have_scheduled_batched_migration
+ }
+
+ migration.after -> {
+ expect(batched_migration).not_to have_scheduled_batched_migration
+ }
+ end
+ end
+
+ it 'schedules background jobs for each batch of container_repository' do
+ allow(Gitlab).to receive(:com?).and_return(true)
+
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(batched_migration).not_to have_scheduled_batched_migration
+ }
+
+ migration.after -> {
+ expect(batched_migration).to have_scheduled_batched_migration(
+ table_name: :container_repositories,
+ column_name: :project_id,
+ interval: described_class::DELAY_INTERVAL
+ )
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects_spec.rb b/spec/migrations/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects_spec.rb
new file mode 100644
index 00000000000..3e7f2a3457b
--- /dev/null
+++ b/spec/migrations/20220627090231_schedule_disable_legacy_open_source_license_for_inactive_public_projects_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ScheduleDisableLegacyOpenSourceLicenseForInactivePublicProjects do
+ context 'on gitlab.com' do
+ let(:migration) { described_class::MIGRATION }
+
+ before do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ end
+
+ describe '#up' do
+ it 'schedules background jobs for each batch of projects' do
+ migrate!
+
+ expect(migration).to(
+ have_scheduled_batched_migration(
+ table_name: :projects,
+ column_name: :id,
+ interval: described_class::INTERVAL,
+ batch_size: described_class::BATCH_SIZE,
+ sub_batch_size: described_class::SUB_BATCH_SIZE
+ )
+ )
+ end
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+ end
+
+ context 'on self-managed instances' do
+ let(:migration) { described_class.new }
+
+ before do
+ allow(Gitlab).to receive(:com?).and_return(false)
+ end
+
+ describe '#up' do
+ it 'does not schedule background job' do
+ expect(migration).not_to receive(:queue_batched_background_migration)
+
+ migration.up
+ end
+ end
+
+ describe '#down' do
+ it 'does not delete background job' do
+ expect(migration).not_to receive(:delete_batched_background_migration)
+
+ migration.down
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace_spec.rb b/spec/migrations/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace_spec.rb
new file mode 100644
index 00000000000..190f1c830ae
--- /dev/null
+++ b/spec/migrations/20220627152642_queue_update_delayed_project_removal_to_null_for_user_namespace_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe QueueUpdateDelayedProjectRemovalToNullForUserNamespace do
+ let(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ it 'schedules background jobs for each batch of namespace settings' do
+ migrate!
+
+ expect(migration).to(
+ have_scheduled_batched_migration(
+ table_name: :namespace_settings,
+ column_name: :namespace_id,
+ interval: described_class::INTERVAL,
+ batch_size: described_class::BATCH_SIZE
+ )
+ )
+ end
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/migrations/20220628012902_finalise_project_namespace_members_spec.rb b/spec/migrations/20220628012902_finalise_project_namespace_members_spec.rb
new file mode 100644
index 00000000000..1f116cf6a7e
--- /dev/null
+++ b/spec/migrations/20220628012902_finalise_project_namespace_members_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe FinaliseProjectNamespaceMembers, :migration do
+ let(:batched_migrations) { table(:batched_background_migrations) }
+
+ let_it_be(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ shared_examples 'finalizes the migration' do
+ it 'finalizes the migration' do
+ allow_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner) do |runner|
+ expect(runner).to receive(:finalize).with('BackfillProjectMemberNamespaceId', :members, :id, [])
+ end
+ end
+ end
+
+ context 'when migration is missing' do
+ it 'warns migration not found' do
+ expect(Gitlab::AppLogger)
+ .to receive(:warn).with(/Could not find batched background migration for the given configuration:/)
+
+ migrate!
+ end
+ end
+
+ context 'with migration present' do
+ let!(:project_member_namespace_id_backfill) do
+ batched_migrations.create!(
+ job_class_name: 'BackfillProjectMemberNamespaceId',
+ table_name: :members,
+ column_name: :id,
+ job_arguments: [],
+ interval: 2.minutes,
+ min_value: 1,
+ max_value: 2,
+ batch_size: 1000,
+ sub_batch_size: 200,
+ gitlab_schema: :gitlab_main,
+ status: 3 # finished
+ )
+ end
+
+ context 'when migration finished successfully' do
+ it 'does not raise exception' do
+ expect { migrate! }.not_to raise_error
+ end
+ end
+
+ context 'with different migration statuses' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:status, :description) do
+ 0 | 'paused'
+ 1 | 'active'
+ 4 | 'failed'
+ 5 | 'finalizing'
+ end
+
+ with_them do
+ before do
+ project_member_namespace_id_backfill.update!(status: status)
+ end
+
+ it_behaves_like 'finalizes the migration'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb b/spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb
new file mode 100644
index 00000000000..bd821714605
--- /dev/null
+++ b/spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe UnsetEscalationPoliciesForAlertIncidents do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:issues) { table(:issues) }
+ let(:alerts) { table(:alert_management_alerts) }
+ let(:escalation_policies) { table(:incident_management_escalation_policies) }
+ let(:escalation_statuses) { table(:incident_management_issuable_escalation_statuses) }
+ let(:current_time) { Time.current.change(usec: 0) }
+
+ let!(:namespace) { namespaces.create!(name: 'namespace', path: 'namespace') }
+ let!(:project_namespace) { namespaces.create!(name: 'project', path: 'project', type: 'project') }
+ let!(:project) { projects.create!(namespace_id: namespace.id, project_namespace_id: project_namespace.id) }
+ let!(:policy) { escalation_policies.create!(project_id: project.id, name: 'escalation policy') }
+
+ # Escalation status with policy from alert; Policy & escalation start time should be nullified
+ let!(:issue_1) { create_issue }
+ let!(:escalation_status_1) { create_status(issue_1, policy, current_time) }
+ let!(:alert_1) { create_alert(1, issue_1) }
+
+ # Escalation status without policy, but with alert; Should be ignored
+ let!(:issue_2) { create_issue }
+ let!(:escalation_status_2) { create_status(issue_2, nil, current_time) }
+ let!(:alert_2) { create_alert(2, issue_2) }
+
+ # Escalation status without alert, but with policy; Should be ignored
+ let!(:issue_3) { create_issue }
+ let!(:escalation_status_3) { create_status(issue_3, policy, current_time) }
+
+ # Alert without issue; Should be ignored
+ let!(:alert_3) { create_alert(3) }
+
+ it 'removes the escalation policy if the incident corresponds to an alert' do
+ expect { migrate! }
+ .to change { escalation_status_1.reload.policy_id }.from(policy.id).to(nil)
+ .and change { escalation_status_1.escalations_started_at }.from(current_time).to(nil)
+ .and not_change { policy_attrs(escalation_status_2) }
+ .and not_change { policy_attrs(escalation_status_3) }
+ end
+
+ private
+
+ def create_issue
+ issues.create!(project_id: project.id)
+ end
+
+ def create_status(issue, policy = nil, escalations_started_at = nil)
+ escalation_statuses.create!(
+ issue_id: issue.id,
+ policy_id: policy&.id,
+ escalations_started_at: escalations_started_at
+ )
+ end
+
+ def create_alert(iid, issue = nil)
+ alerts.create!(
+ project_id: project.id,
+ started_at: current_time,
+ title: "alert #{iid}",
+ iid: iid.to_s,
+ issue_id: issue&.id
+ )
+ end
+
+ def policy_attrs(escalation_status)
+ escalation_status.reload.slice(:policy_id, :escalations_started_at)
+ end
+end
diff --git a/spec/migrations/20220715163254_update_notes_in_past_spec.rb b/spec/migrations/20220715163254_update_notes_in_past_spec.rb
new file mode 100644
index 00000000000..58e6cabc129
--- /dev/null
+++ b/spec/migrations/20220715163254_update_notes_in_past_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe UpdateNotesInPast, :migration do
+ let(:notes) { table(:notes) }
+
+ it 'updates created_at when it is too much in the past' do
+ notes.create!(id: 10, note: 'note', created_at: '2009-06-01')
+ notes.create!(id: 11, note: 'note', created_at: '1970-01-01')
+ notes.create!(id: 12, note: 'note', created_at: '1600-06-01')
+
+ migrate!
+
+ expect(notes.all).to contain_exactly(
+ an_object_having_attributes(id: 10, created_at: DateTime.parse('2009-06-01')),
+ an_object_having_attributes(id: 11, created_at: DateTime.parse('1970-01-01')),
+ an_object_having_attributes(id: 12, created_at: DateTime.parse('1970-01-01'))
+ )
+ end
+end
diff --git a/spec/migrations/change_public_projects_cost_factor_spec.rb b/spec/migrations/change_public_projects_cost_factor_spec.rb
new file mode 100644
index 00000000000..78030736093
--- /dev/null
+++ b/spec/migrations/change_public_projects_cost_factor_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ChangePublicProjectsCostFactor, :migration do
+ # This is a workaround to force the migration to run against the
+ # `gitlab_ci` schema. Otherwise it only runs against `gitlab_main`.
+ around do |example| # rubocop: disable Style/MultilineIfModifier
+ with_reestablished_active_record_base do
+ reconfigure_db_connection(name: :ci)
+ example.run
+ end
+ end if Gitlab::Database.has_config?(:ci)
+
+ let(:runners) { table(:ci_runners) }
+
+ let!(:shared_1) { runners.create!(runner_type: 1, public_projects_minutes_cost_factor: 0) }
+ let!(:shared_2) { runners.create!(runner_type: 1, public_projects_minutes_cost_factor: 0) }
+ let!(:shared_3) { runners.create!(runner_type: 1, public_projects_minutes_cost_factor: 1) }
+ let!(:group_1) { runners.create!(runner_type: 2, public_projects_minutes_cost_factor: 0) }
+
+ describe '#up' do
+ context 'when on SaaS' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ end
+
+ it 'updates the cost factor from 0 only for shared runners', :aggregate_failures do
+ migrate!
+
+ expect(shared_1.reload.public_projects_minutes_cost_factor).to eq(0.008)
+ expect(shared_2.reload.public_projects_minutes_cost_factor).to eq(0.008)
+ expect(shared_3.reload.public_projects_minutes_cost_factor).to eq(1)
+ expect(group_1.reload.public_projects_minutes_cost_factor).to eq(0)
+ end
+ end
+
+ context 'when on self-managed', :aggregate_failures do
+ it 'skips the migration' do
+ migrate!
+
+ expect(shared_1.public_projects_minutes_cost_factor).to eq(0)
+ expect(shared_2.public_projects_minutes_cost_factor).to eq(0)
+ expect(shared_3.public_projects_minutes_cost_factor).to eq(1)
+ expect(group_1.public_projects_minutes_cost_factor).to eq(0)
+ end
+ end
+ end
+
+ describe '#down' do
+ context 'when on SaaS' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ end
+
+ it 'resets the cost factor to 0 only for shared runners that were updated', :aggregate_failures do
+ migrate!
+ schema_migrate_down!
+
+ expect(shared_1.public_projects_minutes_cost_factor).to eq(0)
+ expect(shared_2.public_projects_minutes_cost_factor).to eq(0)
+ expect(shared_3.public_projects_minutes_cost_factor).to eq(1)
+ expect(group_1.public_projects_minutes_cost_factor).to eq(0)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/finalize_orphaned_routes_cleanup_spec.rb b/spec/migrations/finalize_orphaned_routes_cleanup_spec.rb
new file mode 100644
index 00000000000..dfc95ed9e63
--- /dev/null
+++ b/spec/migrations/finalize_orphaned_routes_cleanup_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe FinalizeOrphanedRoutesCleanup, :migration do
+ let(:batched_migrations) { table(:batched_background_migrations) }
+
+ let_it_be(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ shared_examples 'finalizes the migration' do
+ it 'finalizes the migration' do
+ allow_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner) do |runner|
+ expect(runner).to receive(:finalize).with('CleanupOrphanedRoutes', :projects, :id, [])
+ end
+ end
+ end
+
+ context 'when migration is missing' do
+ it 'warns migration not found' do
+ expect(Gitlab::AppLogger)
+ .to receive(:warn).with(/Could not find batched background migration for the given configuration:/)
+
+ migrate!
+ end
+ end
+
+ context 'with migration present' do
+ let!(:project_namespace_backfill) do
+ batched_migrations.create!(
+ job_class_name: 'CleanupOrphanedRoutes',
+ table_name: :routes,
+ column_name: :id,
+ job_arguments: [],
+ interval: 2.minutes,
+ min_value: 1,
+ max_value: 2,
+ batch_size: 1000,
+ sub_batch_size: 200,
+ gitlab_schema: :gitlab_main,
+ status: 3 # finished
+ )
+ end
+
+ context 'when migration finished successfully' do
+ it 'does not raise exception' do
+ expect { migrate! }.not_to raise_error
+ end
+ end
+
+ context 'with different migration statuses' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:status, :description) do
+ 0 | 'paused'
+ 1 | 'active'
+ 4 | 'failed'
+ 5 | 'finalizing'
+ end
+
+ with_them do
+ before do
+ project_namespace_backfill.update!(status: status)
+ end
+
+ it_behaves_like 'finalizes the migration'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/populate_operation_visibility_permissions_spec.rb b/spec/migrations/populate_operation_visibility_permissions_spec.rb
new file mode 100644
index 00000000000..6737a6f84c3
--- /dev/null
+++ b/spec/migrations/populate_operation_visibility_permissions_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe PopulateOperationVisibilityPermissions, :migration do
+ let(:migration) { described_class::MIGRATION }
+
+ before do
+ stub_const("#{described_class.name}::SUB_BATCH_SIZE", 2)
+ end
+
+ it 'schedules background migrations', :aggregate_failures do
+ migrate!
+
+ expect(migration).to have_scheduled_batched_migration(
+ table_name: :project_features,
+ column_name: :id,
+ interval: described_class::INTERVAL
+ )
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/migrations/reschedule_backfill_imported_issue_search_data_spec.rb b/spec/migrations/reschedule_backfill_imported_issue_search_data_spec.rb
new file mode 100644
index 00000000000..7d1377bbeba
--- /dev/null
+++ b/spec/migrations/reschedule_backfill_imported_issue_search_data_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe RescheduleBackfillImportedIssueSearchData do
+ let_it_be(:reschedule_migration) { described_class::MIGRATION }
+
+ context 'when BackfillIssueSearchData.max_value is nil' do
+ it 'schedules a new batched migration with a default value' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(reschedule_migration).not_to have_scheduled_batched_migration
+ }
+ migration.after -> {
+ expect(reschedule_migration).to have_scheduled_batched_migration(
+ table_name: :issues,
+ column_name: :id,
+ interval: described_class::DELAY_INTERVAL,
+ batch_min_value: described_class::BATCH_MIN_VALUE
+ )
+ }
+ end
+ end
+ end
+
+ context 'when BackfillIssueSearchData.max_value exists' do
+ before do
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .create!(
+ max_value: 200,
+ batch_size: 200,
+ sub_batch_size: 20,
+ interval: 120,
+ job_class_name: 'BackfillIssueSearchData',
+ table_name: 'issues',
+ column_name: 'id',
+ gitlab_schema: 'glschema'
+ )
+ end
+
+ it 'schedules a new batched migration with a custom max_value' do
+ reversible_migration do |migration|
+ migration.after -> {
+ expect(reschedule_migration).to have_scheduled_batched_migration(
+ table_name: :issues,
+ column_name: :id,
+ interval: described_class::DELAY_INTERVAL,
+ batch_min_value: 200
+ )
+ }
+ end
+ end
+ end
+end
diff --git a/spec/migrations/schedule_set_correct_vulnerability_state_spec.rb b/spec/migrations/schedule_set_correct_vulnerability_state_spec.rb
new file mode 100644
index 00000000000..08dccf1f37a
--- /dev/null
+++ b/spec/migrations/schedule_set_correct_vulnerability_state_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe ScheduleSetCorrectVulnerabilityState do
+ let_it_be(:migration) { described_class::MIGRATION_NAME }
+
+ describe '#up' do
+ it 'schedules background jobs for each batch of vulnerabilities' do
+ migrate!
+
+ expect(migration).to have_scheduled_batched_migration(
+ table_name: :vulnerabilities,
+ column_name: :id,
+ interval: described_class::JOB_INTERVAL,
+ batch_size: described_class::MAX_BATCH_SIZE,
+ batch_class_name: described_class::BATCH_CLASS_NAME,
+ sub_batch_size: described_class::SUB_BATCH_SIZE
+ )
+ end
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/models/ability_spec.rb b/spec/models/ability_spec.rb
index 5bd69ad9fad..422dd9a463b 100644
--- a/spec/models/ability_spec.rb
+++ b/spec/models/ability_spec.rb
@@ -151,6 +151,38 @@ RSpec.describe Ability do
end
end
+ describe '.users_that_can_read_internal_note' do
+ shared_examples 'filtering users that can read internal note' do
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+
+ let(:users) { [reporter, guest] }
+
+ before do
+ parent.add_guest(guest)
+ parent.add_reporter(reporter)
+ end
+
+ it 'returns users that can read internal notes' do
+ result = described_class.users_that_can_read_internal_notes(users, parent)
+
+ expect(result).to match_array([reporter])
+ end
+ end
+
+ context 'for groups' do
+ it_behaves_like 'filtering users that can read internal note' do
+ let(:parent) { create(:group) }
+ end
+ end
+
+ context 'for projects' do
+ it_behaves_like 'filtering users that can read internal note' do
+ let(:parent) { create(:project) }
+ end
+ end
+ end
+
describe '.merge_requests_readable_by_user' do
context 'with an admin when admin mode is enabled', :enable_admin_mode do
it 'returns all merge requests' do
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 61f008416ea..0b3521cdd0c 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -104,6 +104,9 @@ RSpec.describe ApplicationSetting do
it { is_expected.to validate_numericality_of(:packages_cleanup_package_file_worker_capacity).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.not_to allow_value(nil).for(:packages_cleanup_package_file_worker_capacity) }
+ it { is_expected.to validate_numericality_of(:package_registry_cleanup_policies_worker_capacity).only_integer.is_greater_than_or_equal_to(0) }
+ it { is_expected.not_to allow_value(nil).for(:package_registry_cleanup_policies_worker_capacity) }
+
it { is_expected.to validate_numericality_of(:snippet_size_limit).only_integer.is_greater_than(0) }
it { is_expected.to validate_numericality_of(:wiki_page_max_content_bytes).only_integer.is_greater_than_or_equal_to(1024) }
it { is_expected.to validate_presence_of(:max_artifacts_size) }
@@ -305,18 +308,20 @@ RSpec.describe ApplicationSetting do
end
end
- context 'when snowplow is enabled' do
- before do
- setting.snowplow_enabled = true
- end
+ describe 'snowplow settings', :do_not_stub_snowplow_by_default do
+ context 'when snowplow is enabled' do
+ before do
+ setting.snowplow_enabled = true
+ end
- it { is_expected.not_to allow_value(nil).for(:snowplow_collector_hostname) }
- it { is_expected.to allow_value("snowplow.gitlab.com").for(:snowplow_collector_hostname) }
- it { is_expected.not_to allow_value('/example').for(:snowplow_collector_hostname) }
- end
+ it { is_expected.not_to allow_value(nil).for(:snowplow_collector_hostname) }
+ it { is_expected.to allow_value("snowplow.gitlab.com").for(:snowplow_collector_hostname) }
+ it { is_expected.not_to allow_value('/example').for(:snowplow_collector_hostname) }
+ end
- context 'when snowplow is not enabled' do
- it { is_expected.to allow_value(nil).for(:snowplow_collector_hostname) }
+ context 'when snowplow is not enabled' do
+ it { is_expected.to allow_value(nil).for(:snowplow_collector_hostname) }
+ end
end
context 'when mailgun_events_enabled is enabled' do
@@ -1065,6 +1070,35 @@ RSpec.describe ApplicationSetting do
it { is_expected.to validate_numericality_of(:sidekiq_job_limiter_compression_threshold_bytes).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:sidekiq_job_limiter_limit_bytes).only_integer.is_greater_than_or_equal_to(0) }
end
+
+ context 'prometheus settings' do
+ it 'validates metrics_method_call_threshold' do
+ allow(subject).to receive(:prometheus_metrics_enabled).and_return(true)
+
+ is_expected.to validate_numericality_of(:metrics_method_call_threshold).is_greater_than_or_equal_to(0)
+ end
+ end
+
+ context 'error tracking settings' do
+ context 'with error tracking disabled' do
+ before do
+ setting.error_tracking_enabled = false
+ end
+
+ it { is_expected.to allow_value(nil).for(:error_tracking_api_url) }
+ end
+
+ context 'with error tracking enabled' do
+ before do
+ setting.error_tracking_enabled = true
+ end
+
+ it { is_expected.to allow_value(http).for(:error_tracking_api_url) }
+ it { is_expected.to allow_value(https).for(:error_tracking_api_url) }
+ it { is_expected.not_to allow_value(ftp).for(:error_tracking_api_url) }
+ it { is_expected.to validate_presence_of(:error_tracking_api_url) }
+ end
+ end
end
context 'restrict creating duplicates' do
diff --git a/spec/models/authentication_event_spec.rb b/spec/models/authentication_event_spec.rb
index 83598fa6765..23e253c2a28 100644
--- a/spec/models/authentication_event_spec.rb
+++ b/spec/models/authentication_event_spec.rb
@@ -44,4 +44,31 @@ RSpec.describe AuthenticationEvent do
expect(described_class.providers).to match_array %w(ldapmain google_oauth2 standard two-factor two-factor-via-u2f-device two-factor-via-webauthn-device)
end
end
+
+ describe '.initial_login_or_known_ip_address?' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:ip_address) { '127.0.0.1' }
+
+ subject { described_class.initial_login_or_known_ip_address?(user, ip_address) }
+
+ context 'on first login, when no record exists yet' do
+ it { is_expected.to eq(true) }
+ end
+
+ context 'on second login from the same ip address' do
+ before do
+ create(:authentication_event, :successful, user: user, ip_address: ip_address)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'on second login from another ip address' do
+ before do
+ create(:authentication_event, :successful, user: user, ip_address: '1.2.3.4')
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
end
diff --git a/spec/models/awareness_session_spec.rb b/spec/models/awareness_session_spec.rb
new file mode 100644
index 00000000000..854ce5957f7
--- /dev/null
+++ b/spec/models/awareness_session_spec.rb
@@ -0,0 +1,163 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe AwarenessSession, :clean_gitlab_redis_shared_state do
+ subject { AwarenessSession.for(session_id) }
+
+ let!(:user) { create(:user) }
+ let(:session_id) { 1 }
+
+ describe "when initiating a session" do
+ it "provides a string representation of the model instance" do
+ expected = "awareness_session=6b86b273ff34fce"
+
+ expect(subject.to_s).to eql(expected)
+ end
+
+ it "provides a parameterized version of the session identifier" do
+ expected = "6b86b273ff34fce"
+
+ expect(subject.to_param).to eql(expected)
+ end
+ end
+
+ describe "when a user joins a session" do
+ let(:user2) { create(:user) }
+
+ let(:presence_ttl) { 15.minutes }
+
+ it "changes number of session members" do
+ expect { subject.join(user) }.to change(subject, :size).by(1)
+ end
+
+ it "returns user as member of session with last_activity timestamp" do
+ freeze_time do
+ subject.join(user)
+
+ session_users = subject.users_with_last_activity
+ session_user, last_activity = session_users.first
+
+ expect(session_user.id).to be(user.id)
+ expect(last_activity).to be_eql(Time.now.utc)
+ end
+ end
+
+ it "maintains user ID and last_activity pairs" do
+ now = Time.zone.now
+
+ travel_to now - 1.minute do
+ subject.join(user2)
+ end
+
+ travel_to now do
+ subject.join(user)
+ end
+
+ session_users = subject.users_with_last_activity
+
+ expect(session_users[0].first.id).to eql(user.id)
+ expect(session_users[0].last.to_i).to eql(now.to_i)
+
+ expect(session_users[1].first.id).to eql(user2.id)
+ expect(session_users[1].last.to_i).to eql((now - 1.minute).to_i)
+ end
+
+ it "reports user as present" do
+ freeze_time do
+ subject.join(user)
+
+ expect(subject.present?(user, threshold: presence_ttl)).to be true
+ end
+ end
+
+ it "reports user as away after a certain time on inactivity" do
+ subject.join(user)
+
+ travel_to((presence_ttl + 1.minute).from_now) do
+ expect(subject.away?(user, threshold: presence_ttl)).to be true
+ end
+ end
+
+ it "reports user as present still when there was some activity" do
+ subject.join(user)
+
+ travel_to((presence_ttl - 1.minute).from_now) do
+ subject.touch!(user)
+ end
+
+ travel_to((presence_ttl + 1.minute).from_now) do
+ expect(subject.present?(user, threshold: presence_ttl)).to be true
+ end
+ end
+
+ it "creates user and session awareness keys in store" do
+ subject.join(user)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ keys = redis.scan_each(match: "gitlab:awareness:*").to_a
+
+ expect(keys.size).to be(2)
+ end
+ end
+
+ it "sets a timeout for user and session key" do
+ subject.join(user)
+ subject_id = Digest::SHA256.hexdigest(session_id.to_s)[0, 15]
+
+ Gitlab::Redis::SharedState.with do |redis|
+ ttl_session = redis.ttl("gitlab:awareness:session:#{subject_id}:users")
+ ttl_user = redis.ttl("gitlab:awareness:user:#{user.id}:sessions")
+
+ expect(ttl_session).to be > 0
+ expect(ttl_user).to be > 0
+ end
+ end
+
+ it "fetches user(s) from database" do
+ subject.join(user)
+
+ expect(subject.users.first).to eql(user)
+ end
+
+ it "fetches and filters online user(s) from database" do
+ subject.join(user)
+
+ travel 2.hours do
+ subject.join(user2)
+
+ online_users = subject.online_users_with_last_activity
+ online_user, _ = online_users.first
+
+ expect(online_users.size).to be 1
+ expect(online_user).to eql(user2)
+ end
+ end
+ end
+
+ describe "when a user leaves a session" do
+ it "changes number of session members" do
+ subject.join(user)
+
+ expect { subject.leave(user) }.to change(subject, :size).by(-1)
+ end
+
+ it "destroys the session when it was the last user" do
+ subject.join(user)
+
+ expect { subject.leave(user) }.to change(subject, :id).to(nil)
+ end
+ end
+
+ describe "when last user leaves a session" do
+ it "session and user keys are removed" do
+ subject.join(user)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ expect { subject.leave(user) }
+ .to change { redis.scan_each(match: "gitlab:awareness:*").to_a.size }
+ .to(0)
+ end
+ end
+ end
+end
diff --git a/spec/models/ci/build_report_result_spec.rb b/spec/models/ci/build_report_result_spec.rb
index 3f53c6c1c0e..09ea19cf077 100644
--- a/spec/models/ci/build_report_result_spec.rb
+++ b/spec/models/ci/build_report_result_spec.rb
@@ -70,10 +70,4 @@ RSpec.describe Ci::BuildReportResult do
expect(build_report_result.tests_skipped).to eq(0)
end
end
-
- describe '#tests_total' do
- it 'returns the total count' do
- expect(build_report_result.tests_total).to eq(2)
- end
- end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 6ad6bb16eb5..e0166ba64a4 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -43,30 +43,10 @@ RSpec.describe Ci::Build do
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)
+ it 'calls Ci::BuildFinishedWorker' do
+ expect(Ci::BuildFinishedWorker).to receive(:perform_async)
- subject
- end
+ subject
end
end
@@ -1364,7 +1344,7 @@ RSpec.describe Ci::Build do
before do
allow(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
- allow(deployment).to receive(:execute_hooks)
+ allow(Deployments::HooksWorker).to receive(:perform_async)
end
it 'has deployments record with created status' do
@@ -1420,7 +1400,7 @@ RSpec.describe Ci::Build do
before do
allow(Deployments::UpdateEnvironmentWorker).to receive(:perform_async)
- allow(deployment).to receive(:execute_hooks)
+ allow(Deployments::HooksWorker).to receive(:perform_async)
end
it_behaves_like 'avoid deadlock'
@@ -1506,28 +1486,14 @@ RSpec.describe Ci::Build do
it 'transitions to running and calls webhook' do
freeze_time do
- expect(deployment).to receive(:execute_hooks).with(Time.current)
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status: 'running', status_changed_at: Time.current)
subject
end
expect(deployment).to be_running
end
-
- context 'when `deployment_hooks_skip_worker` flag is disabled' do
- before do
- stub_feature_flags(deployment_hooks_skip_worker: false)
- end
-
- it 'executes Deployments::HooksWorker asynchronously' do
- freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
-
- subject
- end
- end
- end
end
end
end
@@ -1567,48 +1533,47 @@ RSpec.describe Ci::Build do
end
end
- describe 'deployment' do
- describe '#outdated_deployment?' do
- subject { build.outdated_deployment? }
-
- context 'when build succeeded' do
- let(:build) { create(:ci_build, :success) }
- let!(:deployment) { create(:deployment, :success, deployable: build) }
+ describe 'environment' do
+ describe '#has_environment?' do
+ subject { build.has_environment? }
- context 'current deployment is latest' do
- it { is_expected.to be_falsey }
+ context 'when environment is defined' do
+ before do
+ build.update!(environment: 'review')
end
- context 'current deployment is not latest on environment' do
- let!(:deployment2) { create(:deployment, :success, environment: deployment.environment) }
-
- it { is_expected.to be_truthy }
- end
+ it { is_expected.to be_truthy }
end
- context 'when build failed' do
- let(:build) { create(:ci_build, :failed) }
+ context 'when environment is not defined' do
+ before do
+ build.update!(environment: nil)
+ end
it { is_expected.to be_falsey }
end
end
- end
- describe 'environment' do
- describe '#has_environment?' do
- subject { build.has_environment? }
+ describe '#count_user_verification?' do
+ subject { build.count_user_verification? }
- context 'when environment is defined' do
- before do
- build.update!(environment: 'review')
+ context 'when build is the verify action for the environment' do
+ let(:build) do
+ create(:ci_build,
+ ref: 'master',
+ environment: 'staging',
+ options: { environment: { action: 'verify' } })
end
it { is_expected.to be_truthy }
end
- context 'when environment is not defined' do
- before do
- build.update!(environment: nil)
+ context 'when build is not the verify action for the environment' do
+ let(:build) do
+ create(:ci_build,
+ ref: 'master',
+ environment: 'staging',
+ options: { environment: { action: 'start' } })
end
it { is_expected.to be_falsey }
@@ -1975,16 +1940,6 @@ RSpec.describe Ci::Build do
end
end
- describe '#first_pending' do
- let!(:first) { create(:ci_build, pipeline: pipeline, status: 'pending', created_at: Date.yesterday) }
- let!(:second) { create(:ci_build, pipeline: pipeline, status: 'pending') }
-
- subject { described_class.first_pending }
-
- it { is_expected.to be_a(described_class) }
- it('returns with the first pending build') { is_expected.to eq(first) }
- end
-
describe '#failed_but_allowed?' do
subject { build.failed_but_allowed? }
@@ -2134,6 +2089,34 @@ RSpec.describe Ci::Build do
end
end
+ describe '#save_tags' do
+ let(:build) { create(:ci_build, tag_list: ['tag']) }
+
+ it 'saves tags' do
+ build.save!
+
+ expect(build.tags.count).to eq(1)
+ expect(build.tags.first.name).to eq('tag')
+ end
+
+ it 'strips tags' do
+ build.tag_list = [' taga', 'tagb ', ' tagc ']
+
+ build.save!
+ expect(build.tags.map(&:name)).to match_array(%w[taga tagb tagc])
+ end
+
+ context 'with BulkInsertableTags.with_bulk_insert_tags' do
+ it 'does not save_tags' do
+ Ci::BulkInsertableTags.with_bulk_insert_tags do
+ build.save!
+ end
+
+ expect(build.tags).to be_empty
+ end
+ end
+ end
+
describe '#has_tags?' do
context 'when build has tags' do
subject { create(:ci_build, tag_list: ['tag']) }
@@ -2641,7 +2624,7 @@ RSpec.describe Ci::Build do
context 'when token is empty' do
before do
- build.update_columns(token: nil, token_encrypted: nil)
+ build.update_columns(token_encrypted: nil)
end
it { is_expected.to be_nil}
@@ -3294,10 +3277,6 @@ RSpec.describe Ci::Build do
let(:trigger) { create(:ci_trigger, project: project) }
let(:trigger_request) { create(:ci_trigger_request, pipeline: pipeline, trigger: trigger) }
- let(:user_trigger_variable) do
- { key: 'TRIGGER_KEY_1', value: 'TRIGGER_VALUE_1', public: false, masked: false }
- end
-
let(:predefined_trigger_variable) do
{ key: 'CI_PIPELINE_TRIGGERED', value: 'true', public: true, masked: false }
end
@@ -3306,26 +3285,7 @@ RSpec.describe Ci::Build do
build.trigger_request = trigger_request
end
- shared_examples 'returns variables for triggers' do
- it { is_expected.to include(user_trigger_variable) }
- it { is_expected.to include(predefined_trigger_variable) }
- end
-
- context 'when variables are stored in trigger_request' do
- before do
- trigger_request.update_attribute(:variables, { 'TRIGGER_KEY_1' => 'TRIGGER_VALUE_1' } )
- end
-
- it_behaves_like 'returns variables for triggers'
- end
-
- context 'when variables are stored in pipeline_variables' do
- before do
- create(:ci_pipeline_variable, pipeline: pipeline, key: 'TRIGGER_KEY_1', value: 'TRIGGER_VALUE_1')
- end
-
- it_behaves_like 'returns variables for triggers'
- end
+ it { is_expected.to include(predefined_trigger_variable) }
end
context 'when pipeline has a variable' do
@@ -3848,7 +3808,7 @@ RSpec.describe Ci::Build do
end
it 'queues BuildHooksWorker' do
- expect(BuildHooksWorker).to receive(:perform_async).with(build.id)
+ expect(BuildHooksWorker).to receive(:perform_async).with(build)
build.enqueue
end
@@ -4321,7 +4281,7 @@ RSpec.describe Ci::Build do
describe '#collect_test_reports!' do
subject { build.collect_test_reports!(test_reports) }
- let(:test_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:test_reports) { Gitlab::Ci::Reports::TestReport.new }
it { expect(test_reports.get_suite(build.name).total_count).to eq(0) }
@@ -4372,7 +4332,7 @@ RSpec.describe Ci::Build do
context 'when build is part of parallel build' do
let(:build_1) { create(:ci_build, name: 'build 1/2') }
- let(:test_report) { Gitlab::Ci::Reports::TestReports.new }
+ let(:test_report) { Gitlab::Ci::Reports::TestReport.new }
before do
build_1.collect_test_reports!(test_report)
@@ -4396,7 +4356,7 @@ RSpec.describe Ci::Build do
end
context 'when build is part of matrix build' do
- let(:test_report) { Gitlab::Ci::Reports::TestReports.new }
+ let(:test_report) { Gitlab::Ci::Reports::TestReport.new }
let(:matrix_build_1) { create(:ci_build, :matrix) }
before do
diff --git a/spec/models/ci/group_spec.rb b/spec/models/ci/group_spec.rb
index 6c96e659a34..4900bc792af 100644
--- a/spec/models/ci/group_spec.rb
+++ b/spec/models/ci/group_spec.rb
@@ -70,7 +70,7 @@ RSpec.describe Ci::Group do
describe '.fabricate' do
let(:pipeline) { create(:ci_empty_pipeline) }
- let(:stage) { create(:ci_stage_entity, pipeline: pipeline) }
+ let(:stage) { create(:ci_stage, pipeline: pipeline) }
before do
create_build(:ci_build, name: 'rspec 0 2')
diff --git a/spec/models/ci/group_variable_spec.rb b/spec/models/ci/group_variable_spec.rb
index 3a4b836e453..fc5a9c879f6 100644
--- a/spec/models/ci/group_variable_spec.rb
+++ b/spec/models/ci/group_variable_spec.rb
@@ -56,4 +56,10 @@ RSpec.describe Ci::GroupVariable do
let!(:parent) { model.group }
end
+
+ describe '#audit_details' do
+ it "equals to the group variable's key" do
+ expect(subject.audit_details).to eq(subject.key)
+ end
+ end
end
diff --git a/spec/models/ci/legacy_stage_spec.rb b/spec/models/ci/legacy_stage_spec.rb
deleted file mode 100644
index 2487ad85889..00000000000
--- a/spec/models/ci/legacy_stage_spec.rb
+++ /dev/null
@@ -1,268 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Ci::LegacyStage do
- let(:stage) { build(:ci_stage) }
- let(:pipeline) { stage.pipeline }
- let(:stage_name) { stage.name }
-
- describe '#expectations' do
- subject { stage }
-
- it { is_expected.to include_module(StaticModel) }
-
- it { is_expected.to respond_to(:pipeline) }
- it { is_expected.to respond_to(:name) }
-
- it { is_expected.to delegate_method(:project).to(:pipeline) }
- end
-
- describe '#statuses' do
- let!(:stage_build) { create_job(:ci_build) }
- let!(:commit_status) { create_job(:commit_status) }
- let!(:other_build) { create_job(:ci_build, stage: 'other stage') }
-
- subject { stage.statuses }
-
- it "returns only matching statuses" do
- is_expected.to contain_exactly(stage_build, commit_status)
- end
- end
-
- describe '#groups' do
- before do
- create_job(:ci_build, name: 'rspec 0 2')
- create_job(:ci_build, name: 'rspec 0 1')
- create_job(:ci_build, name: 'spinach 0 1')
- create_job(:commit_status, name: 'aaaaa')
- end
-
- it 'returns an array of three groups' do
- expect(stage.groups).to be_a Array
- expect(stage.groups).to all(be_a Ci::Group)
- expect(stage.groups.size).to eq 3
- end
-
- it 'returns groups with correctly ordered statuses' do
- expect(stage.groups.first.jobs.map(&:name))
- .to eq ['aaaaa']
- expect(stage.groups.second.jobs.map(&:name))
- .to eq ['rspec 0 1', 'rspec 0 2']
- expect(stage.groups.third.jobs.map(&:name))
- .to eq ['spinach 0 1']
- end
-
- it 'returns groups with correct names' do
- expect(stage.groups.map(&:name))
- .to eq %w[aaaaa rspec spinach]
- end
-
- context 'when a name is nil on legacy pipelines' do
- before do
- pipeline.builds.first.update_attribute(:name, nil)
- end
-
- it 'returns an array of three groups' do
- expect(stage.groups.map(&:name))
- .to eq ['', 'aaaaa', 'rspec', 'spinach']
- end
- end
- end
-
- describe '#statuses_count' do
- before do
- create_job(:ci_build)
- create_job(:ci_build, stage: 'other stage')
- end
-
- subject { stage.statuses_count }
-
- it "counts statuses only from current stage" do
- is_expected.to eq(1)
- end
- end
-
- describe '#builds' do
- let!(:stage_build) { create_job(:ci_build) }
- let!(:commit_status) { create_job(:commit_status) }
-
- subject { stage.builds }
-
- it "returns only builds" do
- is_expected.to contain_exactly(stage_build)
- end
- end
-
- describe '#status' do
- subject { stage.status }
-
- context 'if status is already defined' do
- let(:stage) { build(:ci_stage, status: 'success') }
-
- it "returns defined status" do
- is_expected.to eq('success')
- end
- end
-
- context 'if status has to be calculated' do
- let!(:stage_build) { create_job(:ci_build, status: :failed) }
-
- it "returns status of a build" do
- is_expected.to eq('failed')
- end
-
- context 'and builds are retried' do
- let!(:new_build) { create_job(:ci_build, status: :success) }
-
- before do
- stage_build.update!(retried: true)
- end
-
- it "returns status of latest build" do
- is_expected.to eq('success')
- end
- end
- end
- end
-
- describe '#detailed_status' do
- let(:user) { create(:user) }
-
- subject { stage.detailed_status(user) }
-
- context 'when build is created' do
- let!(:stage_build) { create_job(:ci_build, status: :created) }
-
- it 'returns detailed status for created stage' do
- expect(subject.text).to eq s_('CiStatusText|created')
- end
- end
-
- context 'when build is pending' do
- let!(:stage_build) { create_job(:ci_build, status: :pending) }
-
- it 'returns detailed status for pending stage' do
- expect(subject.text).to eq s_('CiStatusText|pending')
- end
- end
-
- context 'when build is running' do
- let!(:stage_build) { create_job(:ci_build, status: :running) }
-
- it 'returns detailed status for running stage' do
- expect(subject.text).to eq s_('CiStatus|running')
- end
- end
-
- context 'when build is successful' do
- let!(:stage_build) { create_job(:ci_build, status: :success) }
-
- it 'returns detailed status for successful stage' do
- expect(subject.text).to eq s_('CiStatusText|passed')
- end
- end
-
- context 'when build is failed' do
- let!(:stage_build) { create_job(:ci_build, status: :failed) }
-
- it 'returns detailed status for failed stage' do
- expect(subject.text).to eq s_('CiStatusText|failed')
- end
- end
-
- context 'when build is canceled' do
- let!(:stage_build) { create_job(:ci_build, status: :canceled) }
-
- it 'returns detailed status for canceled stage' do
- expect(subject.text).to eq s_('CiStatusText|canceled')
- end
- end
-
- context 'when build is skipped' do
- let!(:stage_build) { create_job(:ci_build, status: :skipped) }
-
- it 'returns detailed status for skipped stage' do
- expect(subject.text).to eq s_('CiStatusText|skipped')
- end
- end
- end
-
- describe '#success?' do
- context 'when stage is successful' do
- before do
- create_job(:ci_build, status: :success)
- create_job(:generic_commit_status, status: :success)
- end
-
- it 'is successful' do
- expect(stage).to be_success
- end
- end
-
- context 'when stage is not successful' do
- before do
- create_job(:ci_build, status: :failed)
- create_job(:generic_commit_status, status: :success)
- end
-
- it 'is not successful' do
- expect(stage).not_to be_success
- end
- end
- end
-
- describe '#has_warnings?' do
- context 'when stage has warnings' do
- context 'when using memoized warnings flag' do
- context 'when there are warnings' do
- let(:stage) { build(:ci_stage, warnings: true) }
-
- it 'returns true using memoized value' do
- expect(stage).not_to receive(:statuses)
- expect(stage).to have_warnings
- end
- end
-
- context 'when there are no warnings' do
- let(:stage) { build(:ci_stage, warnings: false) }
-
- it 'returns false using memoized value' do
- expect(stage).not_to receive(:statuses)
- expect(stage).not_to have_warnings
- end
- end
- end
-
- context 'when calculating warnings from statuses' do
- before do
- create(:ci_build, :failed, :allowed_to_fail,
- stage: stage_name, pipeline: pipeline)
- end
-
- it 'has warnings calculated from statuses' do
- expect(stage).to receive(:statuses).and_call_original
- expect(stage).to have_warnings
- end
- end
- end
-
- context 'when stage does not have warnings' do
- before do
- create(:ci_build, :success, stage: stage_name,
- pipeline: pipeline)
- end
-
- it 'does not have warnings calculated from statuses' do
- expect(stage).to receive(:statuses).and_call_original
- expect(stage).not_to have_warnings
- end
- end
- end
-
- def create_job(type, status: 'success', stage: stage_name, **opts)
- create(type, pipeline: pipeline, stage: stage, status: status, **opts)
- end
-
- it_behaves_like 'manual playable stage', :ci_stage
-end
diff --git a/spec/models/ci/pending_build_spec.rb b/spec/models/ci/pending_build_spec.rb
index 5692444339f..4bb43233dbd 100644
--- a/spec/models/ci/pending_build_spec.rb
+++ b/spec/models/ci/pending_build_spec.rb
@@ -118,41 +118,27 @@ RSpec.describe Ci::PendingBuild do
project.shared_runners_enabled = true
end
- context 'when ci_pending_builds_maintain_denormalized_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 true' do
+ described_class.upsert_from_build!(build)
- it 'sets instance_runners_enabled to false' do
- described_class.upsert_from_build!(build)
+ expect(described_class.last.instance_runners_enabled).to be_truthy
+ end
- expect(described_class.last.instance_runners_enabled).to be_falsey
- end
+ context 'when project is about to be deleted' do
+ before do
+ build.project.update!(pending_delete: true)
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)
+ 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
+ expect(described_class.last.instance_runners_enabled).to be_falsey
end
end
- context 'when ci_pending_builds_maintain_denormalized_data is disabled' do
+ context 'when builds are disabled' do
before do
- stub_feature_flags(ci_pending_builds_maintain_denormalized_data: false)
+ build.project.project_feature.update!(builds_access_level: false)
end
it 'sets instance_runners_enabled to false' do
@@ -168,24 +154,10 @@ RSpec.describe Ci::PendingBuild do
subject(:ci_pending_build) { described_class.last }
- context 'when ci_pending_builds_maintain_denormalized_data is enabled' do
- it 'sets tag_ids' do
- described_class.upsert_from_build!(build)
-
- expect(ci_pending_build.tag_ids).to eq(build.tags_ids)
- end
- end
-
- context 'when ci_pending_builds_maintain_denormalized_data is disabled' do
- before do
- stub_feature_flags(ci_pending_builds_maintain_denormalized_data: false)
- end
-
- it 'does not set tag_ids' do
- described_class.upsert_from_build!(build)
+ it 'sets tag_ids' do
+ described_class.upsert_from_build!(build)
- expect(ci_pending_build.tag_ids).to be_empty
- end
+ expect(ci_pending_build.tag_ids).to eq(build.tags_ids)
end
end
diff --git a/spec/models/ci/pipeline_artifact_spec.rb b/spec/models/ci/pipeline_artifact_spec.rb
index 801505f0231..b051f646bd4 100644
--- a/spec/models/ci/pipeline_artifact_spec.rb
+++ b/spec/models/ci/pipeline_artifact_spec.rb
@@ -196,6 +196,80 @@ RSpec.describe Ci::PipelineArtifact, type: :model do
end
end
+ describe '.create_or_replace_for_pipeline!' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline) }
+
+ let(:file_type) { :code_coverage }
+ let(:file) { CarrierWaveStringFile.new_file(file_content: 'content', filename: 'file.json', content_type: 'json') }
+ let(:size) { file['tempfile'].size }
+
+ subject do
+ Ci::PipelineArtifact.create_or_replace_for_pipeline!(
+ pipeline: pipeline,
+ file_type: file_type,
+ file: file,
+ size: size
+ )
+ end
+
+ around do |example|
+ freeze_time { example.run }
+ end
+
+ context 'when there is no existing record' do
+ it 'creates a new pipeline artifact for the given parameters' do
+ expect { subject }.to change { Ci::PipelineArtifact.count }.from(0).to(1)
+
+ expect(subject.code_coverage?).to be(true)
+ expect(subject.pipeline).to eq(pipeline)
+ expect(subject.project_id).to eq(pipeline.project_id)
+ expect(subject.file.filename).to eq(file['filename'])
+ expect(subject.size).to eq(size)
+ expect(subject.file_format).to eq(Ci::PipelineArtifact::REPORT_TYPES[file_type].to_s)
+ expect(subject.expire_at).to eq(Ci::PipelineArtifact::EXPIRATION_DATE.from_now)
+ end
+ end
+
+ context 'when there are existing records with different types' do
+ let!(:existing_artifact) do
+ create(:ci_pipeline_artifact, pipeline: pipeline, file_type: file_type, expire_at: 1.day.from_now)
+ end
+
+ let!(:other_artifact) { create(:ci_pipeline_artifact, pipeline: pipeline, file_type: :code_quality_mr_diff) }
+
+ it 'replaces the existing pipeline artifact record with the given file type' do
+ expect { subject }.not_to change { Ci::PipelineArtifact.count }
+
+ expect(subject.id).not_to eq(existing_artifact.id)
+
+ expect(subject.code_coverage?).to be(true)
+ expect(subject.pipeline).to eq(pipeline)
+ expect(subject.project_id).to eq(pipeline.project_id)
+ expect(subject.file.filename).to eq(file['filename'])
+ expect(subject.size).to eq(size)
+ expect(subject.file_format).to eq(Ci::PipelineArtifact::REPORT_TYPES[file_type].to_s)
+ expect(subject.expire_at).to eq(Ci::PipelineArtifact::EXPIRATION_DATE.from_now)
+ end
+ end
+
+ context 'when ActiveRecordError is raised' do
+ let(:pipeline) { instance_double(Ci::Pipeline, id: 1) }
+ let(:file_type) { :code_coverage }
+ let(:error) { ActiveRecord::ActiveRecordError.new('something went wrong') }
+
+ before do
+ allow(pipeline).to receive(:pipeline_artifacts).and_raise(error)
+ end
+
+ it 'tracks and raise the exception' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_exception)
+ .with(error, { pipeline_id: pipeline.id, file_type: file_type }).and_call_original
+
+ expect { subject }.to raise_error(ActiveRecord::ActiveRecordError, 'something went wrong')
+ end
+ end
+ end
+
describe '#present' do
subject(:presenter) { report.present }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 31752f300f4..081fa6cbbae 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -106,6 +106,50 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
+ describe 'state machine transitions' do
+ context 'from failed to success' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :failed) }
+
+ it 'schedules CoverageReportWorker' do
+ expect(Ci::PipelineArtifacts::CoverageReportWorker).to receive(:perform_async).with(pipeline.id)
+
+ pipeline.succeed!
+ end
+ end
+ end
+
+ describe 'pipeline age metric' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
+ let(:pipeline_age_histogram) do
+ ::Gitlab::Ci::Pipeline::Metrics.pipeline_age_histogram
+ end
+
+ context 'when pipeline age histogram is enabled' do
+ before do
+ stub_feature_flags(ci_pipeline_age_histogram: true)
+ end
+
+ it 'observes pipeline age' do
+ expect(pipeline_age_histogram).to receive(:observe)
+
+ described_class.find(pipeline.id)
+ end
+ end
+
+ context 'when pipeline age histogram is disabled' do
+ before do
+ stub_feature_flags(ci_pipeline_age_histogram: false)
+ end
+
+ it 'observes pipeline age' do
+ expect(pipeline_age_histogram).not_to receive(:observe)
+
+ described_class.find(pipeline.id)
+ end
+ end
+ end
+
describe '#set_status' do
let(:pipeline) { build(:ci_empty_pipeline, :created) }
@@ -167,6 +211,28 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
+ describe '.created_after' do
+ let_it_be(:old_pipeline) { create(:ci_pipeline, created_at: 1.week.ago) }
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+
+ subject { described_class.created_after(1.day.ago) }
+
+ it 'returns the pipeline' do
+ is_expected.to contain_exactly(pipeline)
+ end
+ end
+
+ describe '.created_before_id' do
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+ let_it_be(:new_pipeline) { create(:ci_pipeline) }
+
+ subject { described_class.created_before_id(new_pipeline.id) }
+
+ it 'returns the pipeline' do
+ is_expected.to contain_exactly(pipeline)
+ end
+ end
+
describe '.for_sha' do
subject { described_class.for_sha(sha) }
@@ -997,6 +1063,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
'CI_MERGE_REQUEST_PROJECT_PATH' => merge_request.project.full_path,
'CI_MERGE_REQUEST_PROJECT_URL' => merge_request.project.web_url,
'CI_MERGE_REQUEST_TARGET_BRANCH_NAME' => merge_request.target_branch.to_s,
+ 'CI_MERGE_REQUEST_TARGET_BRANCH_PROTECTED' => ProtectedBranch.protected?(merge_request.target_project, merge_request.target_branch).to_s,
'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' => '',
'CI_MERGE_REQUEST_SOURCE_PROJECT_ID' => merge_request.source_project.id.to_s,
'CI_MERGE_REQUEST_SOURCE_PROJECT_PATH' => merge_request.source_project.full_path,
@@ -1093,6 +1160,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
'CI_MERGE_REQUEST_PROJECT_PATH' => merge_request.project.full_path,
'CI_MERGE_REQUEST_PROJECT_URL' => merge_request.project.web_url,
'CI_MERGE_REQUEST_TARGET_BRANCH_NAME' => merge_request.target_branch.to_s,
+ 'CI_MERGE_REQUEST_TARGET_BRANCH_PROTECTED' => ProtectedBranch.protected?(merge_request.target_project, merge_request.target_branch).to_s,
'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' => merge_request.target_branch_sha,
'CI_MERGE_REQUEST_SOURCE_PROJECT_ID' => merge_request.source_project.id.to_s,
'CI_MERGE_REQUEST_SOURCE_PROJECT_PATH' => merge_request.source_project.full_path,
@@ -1289,48 +1357,6 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
status: 'success')
end
- describe '#legacy_stages' do
- using RSpec::Parameterized::TableSyntax
-
- subject { pipeline.legacy_stages }
-
- context 'stages list' do
- it 'returns ordered list of stages' do
- expect(subject.map(&:name)).to eq(%w[build test deploy])
- end
- end
-
- context 'stages with statuses' do
- let(:statuses) do
- subject.map { |stage| [stage.name, stage.status] }
- end
-
- it 'returns list of stages with correct statuses' do
- expect(statuses).to eq([%w(build failed),
- %w(test success),
- %w(deploy running)])
- end
- end
-
- context 'when there is a stage with warnings' do
- before do
- create(:commit_status, pipeline: pipeline,
- stage: 'deploy',
- name: 'prod:2',
- stage_idx: 2,
- status: 'failed',
- allow_failure: true)
- end
-
- it 'populates stage with correct number of warnings' do
- deploy_stage = pipeline.legacy_stages.third
-
- expect(deploy_stage).not_to receive(:statuses)
- expect(deploy_stage).to have_warnings
- end
- end
- end
-
describe '#stages_count' do
it 'returns a valid number of stages' do
expect(pipeline.stages_count).to eq(3)
@@ -1344,37 +1370,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
- describe '#legacy_stage' do
- subject { pipeline.legacy_stage('test') }
-
- let(:pipeline) { build(:ci_empty_pipeline, :created) }
-
- context 'with status in stage' do
- before do
- create(:commit_status, pipeline: pipeline, stage: 'test')
- end
-
- it { expect(subject).to be_a Ci::LegacyStage }
- it { expect(subject.name).to eq 'test' }
- it { expect(subject.statuses).not_to be_empty }
- end
-
- context 'without status in stage' do
- before do
- create(:commit_status, pipeline: pipeline, stage: 'build')
- end
-
- it 'return stage object' do
- is_expected.to be_nil
- end
- end
- end
-
describe '#stages' do
let(:pipeline) { build(:ci_empty_pipeline, :created) }
before do
- create(:ci_stage_entity, project: project,
+ create(:ci_stage, project: project,
pipeline: pipeline,
position: 4,
name: 'deploy')
@@ -1391,12 +1391,12 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
stage_idx: 2,
name: 'build')
- create(:ci_stage_entity, project: project,
+ create(:ci_stage, project: project,
pipeline: pipeline,
position: 1,
name: 'sanity')
- create(:ci_stage_entity, project: project,
+ create(:ci_stage, project: project,
pipeline: pipeline,
position: 5,
name: 'cleanup')
@@ -1435,7 +1435,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
let(:build_c) { create_build('build3', queued_at: 0) }
%w[succeed! drop! cancel! skip! block! delay!].each do |action|
- context "when the pipeline recieved #{action} event" do
+ context "when the pipeline received #{action} event" do
it 'deletes a persistent ref' do
expect(pipeline.persistent_ref).to receive(:delete).once
@@ -1658,7 +1658,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
%w[succeed! drop! cancel! skip!].each do |action|
- context "when the pipeline recieved #{action} event" do
+ context "when the pipeline received #{action} event" do
it 'performs AutoMergeProcessWorker' do
expect(AutoMergeProcessWorker).to receive(:perform_async).with(merge_request.id)
@@ -3074,6 +3074,13 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
let(:pipeline_action) { action }
it 'schedules a new PipelineHooksWorker job' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ message: include("Enqueuing hooks for Pipeline #{pipeline.id}"),
+ class: described_class.name,
+ pipeline_id: pipeline.id,
+ project_id: pipeline.project_id,
+ pipeline_status: String
+ )
expect(PipelineHooksWorker).to receive(:perform_async).with(pipeline.id)
pipeline.public_send(pipeline_action)
@@ -3760,6 +3767,24 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
+ describe '#self_and_descendants_complete?' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :success) }
+ let_it_be(:child_pipeline) { create(:ci_pipeline, :success, child_of: pipeline) }
+ let_it_be_with_reload(:grandchild_pipeline) { create(:ci_pipeline, :success, child_of: child_pipeline) }
+
+ context 'when all pipelines in the hierarchy is complete' do
+ it { expect(pipeline.self_and_descendants_complete?).to be(true) }
+ end
+
+ context 'when a pipeline in the hierarchy is not complete' do
+ before do
+ grandchild_pipeline.update!(status: :running)
+ end
+
+ it { expect(pipeline.self_and_descendants_complete?).to be(false) }
+ end
+ end
+
describe '#builds_in_self_and_descendants' do
subject(:builds) { pipeline.builds_in_self_and_descendants }
@@ -3928,7 +3953,21 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline status is running' do
let(:pipeline) { create(:ci_pipeline, :running) }
- it { is_expected.to be_falsey }
+ context 'with mr_show_reports_immediately flag enabled' do
+ before do
+ stub_feature_flags(mr_show_reports_immediately: project)
+ end
+
+ it { expect(subject).to be_truthy }
+ end
+
+ context 'with mr_show_reports_immediately flag disabled' do
+ before do
+ stub_feature_flags(mr_show_reports_immediately: false)
+ end
+
+ it { expect(subject).to be_falsey }
+ end
end
context 'when pipeline status is success' do
@@ -4002,7 +4041,21 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline status is running' do
let(:pipeline) { create(:ci_pipeline, :running) }
- it { expect(subject).to be_falsey }
+ context 'with mr_show_reports_immediately flag enabled' do
+ before do
+ stub_feature_flags(mr_show_reports_immediately: project)
+ end
+
+ it { expect(subject).to be_truthy }
+ end
+
+ context 'with mr_show_reports_immediately flag disabled' do
+ before do
+ stub_feature_flags(mr_show_reports_immediately: false)
+ end
+
+ it { expect(subject).to be_falsey }
+ end
end
context 'when pipeline status is success' do
@@ -4251,13 +4304,13 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
- describe '#find_stage_by_name' do
+ describe 'fetching a stage by name' do
let_it_be(:pipeline) { create(:ci_pipeline) }
let(:stage_name) { 'test' }
let(:stage) do
- create(:ci_stage_entity,
+ create(:ci_stage,
pipeline: pipeline,
project: pipeline.project,
name: 'test')
@@ -4267,19 +4320,37 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
create_list(:ci_build, 2, pipeline: pipeline, stage: stage.name)
end
- subject { pipeline.find_stage_by_name!(stage_name) }
+ describe '#stage' do
+ subject { pipeline.stage(stage_name) }
- context 'when stage exists' do
- it { is_expected.to eq(stage) }
+ context 'when stage exists' do
+ it { is_expected.to eq(stage) }
+ end
+
+ context 'when stage does not exist' do
+ let(:stage_name) { 'build' }
+
+ it 'returns nil' do
+ is_expected.to be_nil
+ end
+ end
end
- context 'when stage does not exist' do
- let(:stage_name) { 'build' }
+ describe '#find_stage_by_name' do
+ subject { pipeline.find_stage_by_name!(stage_name) }
- it 'raises an ActiveRecord exception' do
- expect do
- subject
- end.to raise_exception(ActiveRecord::RecordNotFound)
+ context 'when stage exists' do
+ it { is_expected.to eq(stage) }
+ end
+
+ context 'when stage does not exist' do
+ let(:stage_name) { 'build' }
+
+ it 'raises an ActiveRecord exception' do
+ expect do
+ subject
+ end.to raise_exception(ActiveRecord::RecordNotFound)
+ end
end
end
end
@@ -4832,13 +4903,13 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
- describe '#has_expired_test_reports?' do
- subject { pipeline.has_expired_test_reports? }
+ describe '#has_test_reports?' do
+ subject { pipeline.has_test_reports? }
let(:pipeline) { create(:ci_pipeline, :success, :with_test_reports) }
context 'when artifacts are not expired' do
- it { is_expected.to be_falsey }
+ it { is_expected.to be_truthy }
end
context 'when artifacts are expired' do
@@ -4849,6 +4920,14 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
it { is_expected.to be_truthy }
end
+ context 'when artifacts are removed' do
+ before do
+ pipeline.job_artifacts.each(&:destroy)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
context 'when the pipeline is still running' do
let(:pipeline) { create(:ci_pipeline, :running) }
@@ -4942,4 +5021,34 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
end
+
+ describe '#age_in_minutes' do
+ let(:pipeline) { build(:ci_pipeline) }
+
+ context 'when pipeline has not been persisted' do
+ it 'returns zero' do
+ expect(pipeline.age_in_minutes).to eq 0
+ end
+ end
+
+ context 'when pipeline has been saved' do
+ it 'returns pipeline age in minutes' do
+ pipeline.save!
+
+ travel_to(pipeline.created_at + 2.hours) do
+ expect(pipeline.age_in_minutes).to eq 120
+ end
+ end
+ end
+
+ context 'when pipeline has been loaded without all attributes' do
+ it 'raises an exception' do
+ pipeline.save!
+
+ pipeline_id = Ci::Pipeline.where(id: pipeline.id).select(:id).first
+
+ expect { pipeline_id.age_in_minutes }.to raise_error(ArgumentError)
+ end
+ end
+ end
end
diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb
index cdd96d45561..789ae3a2ccc 100644
--- a/spec/models/ci/processable_spec.rb
+++ b/spec/models/ci/processable_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Ci::Processable do
new_proc
end
- let_it_be(:stage) { create(:ci_stage_entity, project: project, pipeline: pipeline, name: 'test') }
+ let_it_be(:stage) { create(:ci_stage, project: project, pipeline: pipeline, name: 'test') }
shared_context 'processable bridge' do
let_it_be(:downstream_project) { create(:project, :repository) }
@@ -57,7 +57,7 @@ RSpec.describe Ci::Processable do
let(:clone_accessors) { ::Ci::Build.clone_accessors.without(::Ci::Build.extra_accessors) }
let(:reject_accessors) do
- %i[id status user token token_encrypted coverage trace runner
+ %i[id status user token_encrypted coverage trace runner
artifacts_expire_at
created_at updated_at started_at finished_at queued_at erased_by
erased_at auto_canceled_by job_artifacts job_artifacts_archive
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 74d8b012b29..2fbfbbaf830 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Ci::Runner do
end
describe 'groups association' do
- # Due to other assoctions such as projects this whole spec is allowed to
+ # Due to other associations such as projects this whole spec is allowed to
# generate cross-database queries. So we have this temporary spec to
# validate that at least groups association does not generate cross-DB
# queries.
@@ -35,6 +35,46 @@ RSpec.describe Ci::Runner do
end
end
+ describe 'acts_as_taggable' do
+ let(:tag_name) { 'tag123' }
+
+ context 'on save' do
+ let_it_be_with_reload(:runner) { create(:ci_runner) }
+
+ before do
+ runner.tag_list = [tag_name]
+ end
+
+ context 'tag does not exist' do
+ it 'creates a tag' do
+ expect { runner.save! }.to change(ActsAsTaggableOn::Tag, :count).by(1)
+ end
+
+ it 'creates an association to the tag' do
+ runner.save!
+
+ expect(described_class.tagged_with(tag_name)).to include(runner)
+ end
+ end
+
+ context 'tag already exists' do
+ before do
+ ActsAsTaggableOn::Tag.create!(name: tag_name)
+ end
+
+ it 'does not create a tag' do
+ expect { runner.save! }.not_to change(ActsAsTaggableOn::Tag, :count)
+ end
+
+ it 'creates an association to the tag' do
+ runner.save!
+
+ expect(described_class.tagged_with(tag_name)).to include(runner)
+ end
+ end
+ end
+ end
+
describe 'validation' do
it { is_expected.to validate_presence_of(:access_level) }
it { is_expected.to validate_presence_of(:runner_type) }
@@ -1062,18 +1102,6 @@ RSpec.describe Ci::Runner do
end
end
end
-
- context 'with updated version' do
- before do
- runner.version = '1.2.3'
- end
-
- it 'updates version components with new version' do
- heartbeat
-
- expect(runner.reload.read_attribute(:semver)).to eq '15.0.1'
- end
- end
end
def expect_redis_update
@@ -1088,7 +1116,6 @@ RSpec.describe Ci::Runner do
.and change { runner.reload.read_attribute(:architecture) }
.and change { runner.reload.read_attribute(:config) }
.and change { runner.reload.read_attribute(:executor_type) }
- .and change { runner.reload.read_attribute(:semver) }
end
end
@@ -1193,6 +1220,47 @@ RSpec.describe Ci::Runner do
end
end
+ describe '#save_tags' do
+ let(:runner) { build(:ci_runner, tag_list: ['tag']) }
+
+ it 'saves tags' do
+ runner.save!
+
+ expect(runner.tags.count).to eq(1)
+ expect(runner.tags.first.name).to eq('tag')
+ end
+
+ it 'strips tags' do
+ runner.tag_list = [' taga', 'tagb ', ' tagc ']
+
+ runner.save!
+ expect(runner.tags.map(&:name)).to match_array(%w[taga tagb tagc])
+ end
+
+ context 'with BulkInsertableTags.with_bulk_insert_tags' do
+ it 'does not save_tags' do
+ Ci::BulkInsertableTags.with_bulk_insert_tags do
+ runner.save!
+ end
+
+ expect(runner.tags).to be_empty
+ end
+
+ context 'over TAG_LIST_MAX_LENGTH' do
+ let(:tag_list) { (1..described_class::TAG_LIST_MAX_LENGTH + 1).map { |i| "tag#{i}" } }
+ let(:runner) { build(:ci_runner, tag_list: tag_list) }
+
+ it 'fails validation if over tag limit' do
+ Ci::BulkInsertableTags.with_bulk_insert_tags do
+ expect { runner.save! }.to raise_error(ActiveRecord::RecordInvalid)
+ end
+
+ expect(runner.tags).to be_empty
+ end
+ end
+ end
+ end
+
describe '#has_tags?' do
context 'when runner has tags' do
subject { create(:ci_runner, tag_list: ['tag']) }
@@ -1700,40 +1768,37 @@ RSpec.describe Ci::Runner do
end
end
- describe '.save' do
- context 'with initial value' do
- let(:runner) { create(:ci_runner, version: 'v1.2.3') }
-
- it 'updates semver column' do
- expect(runner.semver).to eq '1.2.3'
- end
- end
+ describe '#with_upgrade_status' do
+ subject { described_class.with_upgrade_status(upgrade_status) }
- context 'with no initial version value' do
- let(:runner) { build(:ci_runner) }
+ let_it_be(:runner_14_0_0) { create(:ci_runner, version: '14.0.0') }
+ let_it_be(:runner_14_1_0) { create(:ci_runner, version: '14.1.0') }
+ let_it_be(:runner_14_1_1) { create(:ci_runner, version: '14.1.1') }
+ let_it_be(:runner_version_14_0_0) { create(:ci_runner_version, version: '14.0.0', status: :available) }
+ let_it_be(:runner_version_14_1_0) { create(:ci_runner_version, version: '14.1.0', status: :recommended) }
+ let_it_be(:runner_version_14_1_1) { create(:ci_runner_version, version: '14.1.1', status: :not_available) }
- context 'with version change' do
- subject(:update_version) { runner.update!(version: new_version) }
+ context ':not_available' do
+ let(:upgrade_status) { :not_available }
- context 'to invalid version' do
- let(:new_version) { 'invalid version' }
-
- it 'updates semver column to nil' do
- update_version
+ it 'returns runners whose version is assigned :not_available' do
+ is_expected.to contain_exactly(runner_14_1_1)
+ end
+ end
- expect(runner.reload.semver).to be_nil
- end
- end
+ context ':available' do
+ let(:upgrade_status) { :available }
- context 'to v14.10.1' do
- let(:new_version) { 'v14.10.1' }
+ it 'returns runners whose version is assigned :available' do
+ is_expected.to contain_exactly(runner_14_0_0)
+ end
+ end
- it 'updates semver column' do
- update_version
+ context ':recommended' do
+ let(:upgrade_status) { :recommended}
- expect(runner.reload.semver).to eq '14.10.1'
- end
- end
+ it 'returns runners whose version is assigned :recommended' do
+ is_expected.to contain_exactly(runner_14_1_0)
end
end
end
diff --git a/spec/models/ci/runner_version_spec.rb b/spec/models/ci/runner_version_spec.rb
new file mode 100644
index 00000000000..d3395942a39
--- /dev/null
+++ b/spec/models/ci/runner_version_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::RunnerVersion do
+ it_behaves_like 'having unique enum values'
+
+ let_it_be(:runner_version_not_available) do
+ create(:ci_runner_version, version: 'abc123', status: :not_available)
+ end
+
+ let_it_be(:runner_version_recommended) do
+ create(:ci_runner_version, version: 'abc234', status: :recommended)
+ end
+
+ describe '.not_available' do
+ subject { described_class.not_available }
+
+ it { is_expected.to match_array([runner_version_not_available]) }
+ end
+
+ describe '.potentially_outdated' do
+ subject { described_class.potentially_outdated }
+
+ let_it_be(:runner_version_nil) { create(:ci_runner_version, version: 'abc345', status: nil) }
+ let_it_be(:runner_version_available) do
+ create(:ci_runner_version, version: 'abc456', status: :available)
+ end
+
+ let_it_be(:runner_version_unknown) do
+ create(:ci_runner_version, version: 'abc567', status: :unknown)
+ end
+
+ it 'contains any runner version that is not already recommended' do
+ is_expected.to match_array([
+ runner_version_nil,
+ runner_version_not_available,
+ runner_version_available,
+ runner_version_unknown
+ ])
+ end
+ end
+
+ describe 'validation' do
+ context 'when runner version is too long' do
+ let(:runner_version) { build(:ci_runner_version, version: 'a' * 2049) }
+
+ it 'is not valid' do
+ expect(runner_version).to be_invalid
+ end
+ end
+ end
+end
diff --git a/spec/models/ci/stage_spec.rb b/spec/models/ci/stage_spec.rb
index b91348eb408..d55a8509a98 100644
--- a/spec/models/ci/stage_spec.rb
+++ b/spec/models/ci/stage_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Ci::Stage, :models do
let_it_be(:pipeline) { create(:ci_empty_pipeline) }
- let(:stage) { create(:ci_stage_entity, pipeline: pipeline, project: pipeline.project) }
+ let(:stage) { create(:ci_stage, pipeline: pipeline, project: pipeline.project) }
it_behaves_like 'having unique enum values'
@@ -30,9 +30,9 @@ RSpec.describe Ci::Stage, :models do
describe '.by_position' do
it 'finds stages by position' do
- a = create(:ci_stage_entity, position: 1)
- b = create(:ci_stage_entity, position: 2)
- c = create(:ci_stage_entity, position: 3)
+ a = create(:ci_stage, position: 1)
+ b = create(:ci_stage, position: 2)
+ c = create(:ci_stage, position: 3)
expect(described_class.by_position(1)).to contain_exactly(a)
expect(described_class.by_position(2)).to contain_exactly(b)
@@ -42,9 +42,9 @@ RSpec.describe Ci::Stage, :models do
describe '.by_name' do
it 'finds stages by name' do
- a = create(:ci_stage_entity, name: 'a')
- b = create(:ci_stage_entity, name: 'b')
- c = create(:ci_stage_entity, name: 'c')
+ a = create(:ci_stage, name: 'a')
+ b = create(:ci_stage, name: 'b')
+ c = create(:ci_stage, name: 'c')
expect(described_class.by_name('a')).to contain_exactly(a)
expect(described_class.by_name('b')).to contain_exactly(b)
@@ -54,7 +54,7 @@ RSpec.describe Ci::Stage, :models do
describe '#status' do
context 'when stage is pending' do
- let(:stage) { create(:ci_stage_entity, status: 'pending') }
+ let(:stage) { create(:ci_stage, status: 'pending') }
it 'has a correct status value' do
expect(stage.status).to eq 'pending'
@@ -62,7 +62,7 @@ RSpec.describe Ci::Stage, :models do
end
context 'when stage is success' do
- let(:stage) { create(:ci_stage_entity, status: 'success') }
+ let(:stage) { create(:ci_stage, status: 'success') }
it 'has a correct status value' do
expect(stage.status).to eq 'success'
@@ -119,7 +119,7 @@ RSpec.describe Ci::Stage, :models do
end
context 'when stage has only created builds' do
- let(:stage) { create(:ci_stage_entity, status: :created) }
+ let(:stage) { create(:ci_stage, status: :created) }
before do
create(:ci_build, :created, stage_id: stage.id)
@@ -206,7 +206,7 @@ RSpec.describe Ci::Stage, :models do
using RSpec::Parameterized::TableSyntax
let(:user) { create(:user) }
- let(:stage) { create(:ci_stage_entity, status: :created) }
+ let(:stage) { create(:ci_stage, status: :created) }
subject { stage.detailed_status(user) }
@@ -269,7 +269,7 @@ RSpec.describe Ci::Stage, :models do
describe '#delay' do
subject { stage.delay }
- let(:stage) { create(:ci_stage_entity, status: :created) }
+ let(:stage) { create(:ci_stage, status: :created) }
it 'updates stage status' do
subject
@@ -361,12 +361,12 @@ RSpec.describe Ci::Stage, :models do
end
end
- it_behaves_like 'manual playable stage', :ci_stage_entity
+ it_behaves_like 'manual playable stage', :ci_stage
context 'loose foreign key on ci_stages.project_id' do
it_behaves_like 'cleanup by a loose foreign key' do
let!(:parent) { create(:project) }
- let!(:model) { create(:ci_stage_entity, project: parent) }
+ let!(:model) { create(:ci_stage, project: parent) }
end
end
end
diff --git a/spec/models/ci/variable_spec.rb b/spec/models/ci/variable_spec.rb
index 29ca088ee04..f0af229ff2c 100644
--- a/spec/models/ci/variable_spec.rb
+++ b/spec/models/ci/variable_spec.rb
@@ -51,4 +51,10 @@ RSpec.describe Ci::Variable do
let!(:model) { create(:ci_variable, project: parent) }
end
end
+
+ describe '#audit_details' do
+ it "equals to the variable's key" do
+ expect(subject.audit_details).to eq(subject.key)
+ end
+ end
end
diff --git a/spec/models/clusters/applications/elastic_stack_spec.rb b/spec/models/clusters/applications/elastic_stack_spec.rb
deleted file mode 100644
index af2802d5e47..00000000000
--- a/spec/models/clusters/applications/elastic_stack_spec.rb
+++ /dev/null
@@ -1,177 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Applications::ElasticStack do
- include KubernetesHelpers
-
- include_examples 'cluster application core specs', :clusters_applications_elastic_stack
- include_examples 'cluster application status specs', :clusters_applications_elastic_stack
- include_examples 'cluster application version specs', :clusters_applications_elastic_stack
- include_examples 'cluster application helm specs', :clusters_applications_elastic_stack
-
- describe 'cluster.integration_elastic_stack state synchronization' do
- let!(:application) { create(:clusters_applications_elastic_stack) }
- let(:cluster) { application.cluster }
- let(:integration) { cluster.integration_elastic_stack }
-
- describe 'after_destroy' do
- it 'disables the corresponding integration' do
- application.destroy!
-
- expect(integration).not_to be_enabled
- end
- end
-
- describe 'on install' do
- it 'enables the corresponding integration' do
- application.make_scheduled!
- application.make_installing!
- application.make_installed!
-
- expect(integration).to be_enabled
- end
- end
-
- describe 'on uninstall' do
- it 'disables the corresponding integration' do
- application.make_scheduled!
- application.make_installing!
- application.make_installed!
- application.make_externally_uninstalled!
-
- expect(integration).not_to be_enabled
- end
- end
- end
-
- describe '#install_command' do
- let!(:elastic_stack) { create(:clusters_applications_elastic_stack) }
-
- subject { elastic_stack.install_command }
-
- it { is_expected.to be_an_instance_of(Gitlab::Kubernetes::Helm::V3::InstallCommand) }
-
- it 'is initialized with elastic stack arguments' do
- expect(subject.name).to eq('elastic-stack')
- expect(subject.chart).to eq('elastic-stack/elastic-stack')
- expect(subject.version).to eq('3.0.0')
- expect(subject.repository).to eq('https://charts.gitlab.io')
- expect(subject).to be_rbac
- expect(subject.files).to eq(elastic_stack.files)
- expect(subject.preinstall).to be_empty
- end
-
- context 'within values.yaml' do
- let(:values_yaml_content) {subject.files[:"values.yaml"]}
-
- it 'contains the disabled index lifecycle management' do
- expect(values_yaml_content).to include "setup.ilm.enabled: false"
- end
-
- it 'contains daily indices with respective template' do
- expect(values_yaml_content).to include "index: \"filebeat-%{[agent.version]}-%{+yyyy.MM.dd}\""
- expect(values_yaml_content).to include "setup.template.name: 'filebeat'"
- expect(values_yaml_content).to include "setup.template.pattern: 'filebeat-*'"
- end
- end
-
- context 'on a non rbac enabled cluster' do
- before do
- elastic_stack.cluster.platform_kubernetes.abac!
- end
-
- it { is_expected.not_to be_rbac }
- end
-
- context 'on versions older than 2' do
- before do
- elastic_stack.status = elastic_stack.status_states[:updating]
- elastic_stack.version = "1.9.0"
- end
-
- it 'includes a preinstall script' do
- expect(subject.preinstall).not_to be_empty
- expect(subject.preinstall.first).to include("helm uninstall")
- end
- end
-
- context 'on versions older than 3' do
- before do
- elastic_stack.status = elastic_stack.status_states[:updating]
- elastic_stack.version = "2.9.0"
- end
-
- it 'includes a preinstall script' do
- expect(subject.preinstall).not_to be_empty
- expect(subject.preinstall.first).to include("helm uninstall")
- end
- end
-
- context 'application failed to install previously' do
- let(:elastic_stack) { create(:clusters_applications_elastic_stack, :errored, version: '0.0.1') }
-
- it 'is initialized with the locked version' do
- expect(subject.version).to eq('3.0.0')
- end
- end
- end
-
- describe '#chart_above_v2?' do
- let(:elastic_stack) { create(:clusters_applications_elastic_stack, version: version) }
-
- subject { elastic_stack.chart_above_v2? }
-
- context 'on v1.9.0' do
- let(:version) { '1.9.0' }
-
- it { is_expected.to be_falsy }
- end
-
- context 'on v2.0.0' do
- let(:version) { '2.0.0' }
-
- it { is_expected.to be_truthy }
- end
- end
-
- describe '#chart_above_v3?' do
- let(:elastic_stack) { create(:clusters_applications_elastic_stack, version: version) }
-
- subject { elastic_stack.chart_above_v3? }
-
- context 'on v1.9.0' do
- let(:version) { '1.9.0' }
-
- it { is_expected.to be_falsy }
- end
-
- context 'on v3.0.0' do
- let(:version) { '3.0.0' }
-
- it { is_expected.to be_truthy }
- end
- end
-
- describe '#uninstall_command' do
- let!(:elastic_stack) { create(:clusters_applications_elastic_stack) }
-
- subject { elastic_stack.uninstall_command }
-
- it { is_expected.to be_an_instance_of(Gitlab::Kubernetes::Helm::V3::DeleteCommand) }
-
- it 'is initialized with elastic stack arguments' do
- expect(subject.name).to eq('elastic-stack')
- expect(subject).to be_rbac
- expect(subject.files).to eq(elastic_stack.files)
- end
-
- it 'specifies a post delete command to remove custom resource definitions' do
- expect(subject.postdelete).to eq([
- 'kubectl delete pvc --selector app\\=elastic-stack-elasticsearch-master --namespace gitlab-managed-apps'
- ])
- end
- end
-
- it_behaves_like 'cluster-based #elasticsearch_client', :clusters_applications_elastic_stack
-end
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb
index 30591a3ff5d..65ead01a2bd 100644
--- a/spec/models/clusters/cluster_spec.rb
+++ b/spec/models/clusters/cluster_spec.rb
@@ -42,7 +42,6 @@ RSpec.describe Clusters::Cluster, :use_clean_rails_memory_store_caching do
it { is_expected.to delegate_method(:available?).to(:application_helm).with_prefix }
it { is_expected.to delegate_method(:available?).to(:application_ingress).with_prefix }
it { is_expected.to delegate_method(:available?).to(:application_knative).with_prefix }
- it { is_expected.to delegate_method(:available?).to(:integration_elastic_stack).with_prefix }
it { is_expected.to delegate_method(:available?).to(:integration_prometheus).with_prefix }
it { is_expected.to delegate_method(:external_ip).to(:application_ingress).with_prefix }
it { is_expected.to delegate_method(:external_hostname).to(:application_ingress).with_prefix }
@@ -200,22 +199,6 @@ RSpec.describe Clusters::Cluster, :use_clean_rails_memory_store_caching do
end
end
- describe '.with_available_elasticstack' do
- subject { described_class.with_available_elasticstack }
-
- let_it_be(:cluster) { create(:cluster) }
-
- context 'cluster has ElasticStack application' do
- let!(:application) { create(:clusters_applications_elastic_stack, :installed, cluster: cluster) }
-
- it { is_expected.to include(cluster) }
- end
-
- context 'cluster does not have ElasticStack application' do
- it { is_expected.not_to include(cluster) }
- end
- end
-
describe '.distinct_with_deployed_environments' do
subject { described_class.distinct_with_deployed_environments }
diff --git a/spec/models/clusters/integrations/elastic_stack_spec.rb b/spec/models/clusters/integrations/elastic_stack_spec.rb
deleted file mode 100644
index be4d59b52a2..00000000000
--- a/spec/models/clusters/integrations/elastic_stack_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Integrations::ElasticStack do
- include KubernetesHelpers
- include StubRequests
-
- describe 'associations' do
- it { is_expected.to belong_to(:cluster).class_name('Clusters::Cluster') }
- end
-
- describe 'validations' do
- it { is_expected.to validate_presence_of(:cluster) }
- it { is_expected.not_to allow_value(nil).for(:enabled) }
- end
-
- it_behaves_like 'cluster-based #elasticsearch_client', :clusters_integrations_elastic_stack
-end
diff --git a/spec/models/clusters/integrations/prometheus_spec.rb b/spec/models/clusters/integrations/prometheus_spec.rb
index d1e40fffee0..90e99aefdce 100644
--- a/spec/models/clusters/integrations/prometheus_spec.rb
+++ b/spec/models/clusters/integrations/prometheus_spec.rb
@@ -26,19 +26,6 @@ RSpec.describe Clusters::Integrations::Prometheus do
integration.destroy!
end
-
- context 'when the FF :rename_integrations_workers is disabled' do
- before do
- stub_feature_flags(rename_integrations_workers: false)
- end
-
- it 'uses the old worker' do
- expect(Clusters::Applications::DeactivateServiceWorker)
- .to receive(:perform_async).with(cluster.id, 'prometheus')
-
- integration.destroy!
- end
- end
end
describe 'after_save' do
@@ -70,19 +57,6 @@ RSpec.describe Clusters::Integrations::Prometheus do
integration.update!(enabled: true)
end
-
- context 'when the FF :rename_integrations_workers is disabled' do
- before do
- stub_feature_flags(rename_integrations_workers: false)
- end
-
- it 'uses the old worker' do
- expect(Clusters::Applications::ActivateServiceWorker)
- .to receive(:perform_async).with(cluster.id, 'prometheus')
-
- integration.update!(enabled: true)
- end
- end
end
context 'when disabling' do
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index dbb15fad246..3cccc41a892 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -803,7 +803,7 @@ RSpec.describe CommitStatus do
describe 'ensure stage assignment' do
context 'when commit status has a stage_id assigned' do
let!(:stage) do
- create(:ci_stage_entity, project: project, pipeline: pipeline)
+ create(:ci_stage, project: project, pipeline: pipeline)
end
let(:commit_status) do
@@ -836,7 +836,7 @@ RSpec.describe CommitStatus do
context 'when commit status does not have stage but it exists' do
let!(:stage) do
- create(:ci_stage_entity, project: project,
+ create(:ci_stage, project: project,
pipeline: pipeline,
name: 'test')
end
@@ -984,22 +984,6 @@ RSpec.describe CommitStatus do
end
end
- describe '.bulk_insert_tags!' do
- let(:statuses) { double('statuses') }
- let(:inserter) { double('inserter') }
-
- it 'delegates to bulk insert class' do
- expect(Gitlab::Ci::Tags::BulkInsert)
- .to receive(:new)
- .with(statuses)
- .and_return(inserter)
-
- expect(inserter).to receive(:insert!)
-
- described_class.bulk_insert_tags!(statuses)
- end
- end
-
describe '#expire_etag_cache!' do
it 'expires the etag cache' do
expect_next_instance_of(Gitlab::EtagCaching::Store) do |etag_store|
diff --git a/spec/models/concerns/awareness_spec.rb b/spec/models/concerns/awareness_spec.rb
new file mode 100644
index 00000000000..67acacc7bb1
--- /dev/null
+++ b/spec/models/concerns/awareness_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Awareness, :clean_gitlab_redis_shared_state do
+ subject { create(:user) }
+
+ let(:session) { AwarenessSession.for(1) }
+
+ describe "when joining a session" do
+ it "increases the number of sessions" do
+ expect { subject.join(session) }
+ .to change { subject.session_ids.size }
+ .by(1)
+ end
+ end
+
+ describe "when leaving session" do
+ it "decreases the number of sessions" do
+ subject.join(session)
+
+ expect { subject.leave(session) }
+ .to change { subject.session_ids.size }
+ .by(-1)
+ end
+ end
+
+ describe "when joining multiple sessions" do
+ let(:session2) { AwarenessSession.for(2) }
+
+ it "increases number of active sessions for user" do
+ expect do
+ subject.join(session)
+ subject.join(session2)
+ end.to change { subject.session_ids.size }
+ .by(2)
+ end
+ end
+end
diff --git a/spec/models/concerns/cache_markdown_field_spec.rb b/spec/models/concerns/cache_markdown_field_spec.rb
index a00129b3fdf..19b9a1519eb 100644
--- a/spec/models/concerns/cache_markdown_field_spec.rb
+++ b/spec/models/concerns/cache_markdown_field_spec.rb
@@ -9,6 +9,8 @@ RSpec.describe CacheMarkdownField, :clean_gitlab_redis_cache do
include CacheMarkdownField
cache_markdown_field :title, pipeline: :single_line
cache_markdown_field :description
+
+ before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id }
end
end
diff --git a/spec/models/concerns/cacheable_attributes_spec.rb b/spec/models/concerns/cacheable_attributes_spec.rb
index dc80e30216a..0629debda15 100644
--- a/spec/models/concerns/cacheable_attributes_spec.rb
+++ b/spec/models/concerns/cacheable_attributes_spec.rb
@@ -205,7 +205,12 @@ RSpec.describe CacheableAttributes do
end
end
- it 'uses RequestStore in addition to process memory cache', :request_store, :do_not_mock_admin_mode_setting do
+ it(
+ 'uses RequestStore in addition to process memory cache',
+ :request_store,
+ :do_not_mock_admin_mode_setting,
+ :do_not_stub_snowplow_by_default
+ ) do
# Warm up the cache
create(:application_setting).cache!
diff --git a/spec/models/concerns/ci/artifactable_spec.rb b/spec/models/concerns/ci/artifactable_spec.rb
index b27a4d0dcc1..6af244a5a0f 100644
--- a/spec/models/concerns/ci/artifactable_spec.rb
+++ b/spec/models/concerns/ci/artifactable_spec.rb
@@ -53,6 +53,15 @@ RSpec.describe Ci::Artifactable do
expect { |b| artifact.each_blob(&b) }.to raise_error(described_class::NotSupportedAdapterError)
end
end
+
+ context 'pushes artifact_size to application context' do
+ let(:artifact) { create(:ci_job_artifact, :junit) }
+
+ it 'logs artifact size', :aggregate_failures do
+ expect { |b| artifact.each_blob(&b) }.to yield_control.once
+ expect(Gitlab::ApplicationContext.current).to include("meta.artifact_size" => artifact.size)
+ end
+ end
end
context 'ActiveRecord scopes' do
diff --git a/spec/models/concerns/ci/bulk_insertable_tags_spec.rb b/spec/models/concerns/ci/bulk_insertable_tags_spec.rb
new file mode 100644
index 00000000000..23f0831403d
--- /dev/null
+++ b/spec/models/concerns/ci/bulk_insertable_tags_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::BulkInsertableTags do
+ let(:taggable_class) do
+ Class.new do
+ prepend Ci::BulkInsertableTags
+
+ attr_reader :tags_saved
+
+ def save_tags
+ @tags_saved = true
+ end
+ end
+ end
+
+ let(:record) { taggable_class.new }
+
+ describe '.with_bulk_insert_tags' do
+ it 'changes the thread key to true' do
+ expect(Thread.current['ci_bulk_insert_tags']).to be_nil
+
+ described_class.with_bulk_insert_tags do
+ expect(Thread.current['ci_bulk_insert_tags']).to eq(true)
+ end
+
+ expect(Thread.current['ci_bulk_insert_tags']).to be_nil
+ end
+ end
+
+ describe '#save_tags' do
+ it 'calls super' do
+ record.save_tags
+
+ expect(record.tags_saved).to eq(true)
+ end
+
+ it 'does not call super with BulkInsertableTags.with_bulk_insert_tags' do
+ described_class.with_bulk_insert_tags do
+ record.save_tags
+ end
+
+ expect(record.tags_saved).to be_nil
+ end
+
+ it 'isolates bulk insert behavior between threads' do
+ record2 = taggable_class.new
+
+ t1 = Thread.new do
+ described_class.with_bulk_insert_tags do
+ record.save_tags
+ end
+ end
+
+ t2 = Thread.new do
+ record2.save_tags
+ end
+
+ [t1, t2].each(&:join)
+
+ expect(record.tags_saved).to be_nil
+ expect(record2.tags_saved).to eq(true)
+ end
+ end
+end
diff --git a/spec/models/concerns/each_batch_spec.rb b/spec/models/concerns/each_batch_spec.rb
index f1fb4fcbd03..2c75d4d5c41 100644
--- a/spec/models/concerns/each_batch_spec.rb
+++ b/spec/models/concerns/each_batch_spec.rb
@@ -3,17 +3,17 @@
require 'spec_helper'
RSpec.describe EachBatch do
- describe '.each_batch' do
- let(:model) do
- Class.new(ActiveRecord::Base) do
- include EachBatch
+ let(:model) do
+ Class.new(ActiveRecord::Base) do
+ include EachBatch
- self.table_name = 'users'
+ self.table_name = 'users'
- scope :never_signed_in, -> { where(sign_in_count: 0) }
- end
+ scope :never_signed_in, -> { where(sign_in_count: 0) }
end
+ end
+ describe '.each_batch' do
before do
create_list(:user, 5, updated_at: 1.day.ago)
end
@@ -86,4 +86,89 @@ RSpec.describe EachBatch do
end
end
end
+
+ describe '.distinct_each_batch' do
+ let_it_be(:users) { create_list(:user, 5, sign_in_count: 0) }
+
+ let(:params) { {} }
+
+ subject(:values) do
+ values = []
+
+ model.distinct_each_batch(**params) { |rel| values.concat(rel.pluck(params[:column])) }
+ values
+ end
+
+ context 'when iterating over a unique column' do
+ context 'when using ascending order' do
+ let(:expected_values) { users.pluck(:id).sort }
+ let(:params) { { column: :id, of: 1, order: :asc } }
+
+ it { is_expected.to eq(expected_values) }
+
+ context 'when using larger batch size' do
+ before do
+ params[:of] = 3
+ end
+
+ it { is_expected.to eq(expected_values) }
+ end
+
+ context 'when using larger batch size than the result size' do
+ before do
+ params[:of] = 100
+ end
+
+ it { is_expected.to eq(expected_values) }
+ end
+ end
+
+ context 'when using descending order' do
+ let(:expected_values) { users.pluck(:id).sort.reverse }
+ let(:params) { { column: :id, of: 1, order: :desc } }
+
+ it { is_expected.to eq(expected_values) }
+
+ context 'when using larger batch size' do
+ before do
+ params[:of] = 3
+ end
+
+ it { is_expected.to eq(expected_values) }
+ end
+ end
+ end
+
+ context 'when iterating over a non-unique column' do
+ let(:params) { { column: :sign_in_count, of: 2, order: :asc } }
+
+ context 'when only one value is present' do
+ it { is_expected.to eq([0]) }
+ end
+
+ context 'when duplicated values present' do
+ let(:expected_values) { [2, 5] }
+
+ before do
+ users[0].reload.update!(sign_in_count: 5)
+ users[1].reload.update!(sign_in_count: 2)
+ users[2].reload.update!(sign_in_count: 5)
+ users[3].reload.update!(sign_in_count: 2)
+ users[4].reload.update!(sign_in_count: 5)
+ end
+
+ it { is_expected.to eq(expected_values) }
+
+ context 'when using descending order' do
+ let(:expected_values) { [5, 2] }
+
+ before do
+ params[:order] = :desc
+ end
+
+ it { is_expected.to eq(expected_values) }
+ end
+ end
+ end
+ end
end
diff --git a/spec/models/concerns/loose_index_scan_spec.rb b/spec/models/concerns/loose_index_scan_spec.rb
new file mode 100644
index 00000000000..685819bfb86
--- /dev/null
+++ b/spec/models/concerns/loose_index_scan_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+# frozen_string_literal
+
+require 'spec_helper'
+
+RSpec.describe LooseIndexScan, type: :model do
+ let(:issue_model) do
+ Class.new(ApplicationRecord) do
+ include LooseIndexScan
+
+ self.table_name = 'issues'
+ end
+ end
+
+ let_it_be(:user_1) { create(:user) }
+ let_it_be(:user_2) { create(:user) }
+ let_it_be(:user_3) { create(:user) }
+
+ let_it_be(:issue_1) { create(:issue, author: user_2) }
+ let_it_be(:issue_2) { create(:issue, author: user_1) }
+ let_it_be(:issue_3) { create(:issue, author: user_1) }
+ let_it_be(:issue_4) { create(:issue, author: user_2) }
+ let_it_be(:issue_5) { create(:issue, author: user_3) }
+
+ context 'loading distinct author_ids' do
+ subject(:author_ids) { issue_model.loose_index_scan(column: :author_id, order: order).pluck(:author_id) }
+
+ shared_examples 'assert distinct values example' do
+ it 'loads the distinct values in the correct order' do
+ expect(author_ids).to eq(expected_order)
+ end
+ end
+
+ context 'when using ascending order' do
+ let(:order) { :asc }
+ let(:expected_order) { [user_1.id, user_2.id, user_3.id] }
+
+ it_behaves_like 'assert distinct values example'
+
+ context 'when null values are present' do
+ before do
+ issue_1.author_id = nil
+ issue_1.save!(validate: false)
+ end
+
+ it_behaves_like 'assert distinct values example'
+ end
+
+ context 'when using descending order' do
+ let(:order) { :desc }
+ let(:expected_order) { [user_3.id, user_2.id, user_1.id] }
+
+ it_behaves_like 'assert distinct values example'
+ end
+ end
+ end
+end
diff --git a/spec/models/concerns/participable_spec.rb b/spec/models/concerns/participable_spec.rb
index 99a3a0fb79a..b92c7c52f0b 100644
--- a/spec/models/concerns/participable_spec.rb
+++ b/spec/models/concerns/participable_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Participable do
expect(instance).to receive(:foo).and_return(user2)
expect(instance).to receive(:bar).and_return(user3)
- expect(instance).to receive(:project).twice.and_return(project)
+ expect(instance).to receive(:project).thrice.and_return(project)
participants = instance.participants(user1)
@@ -66,7 +66,7 @@ RSpec.describe Participable do
expect(instance).to receive(:foo).and_return(other)
expect(other).to receive(:bar).and_return(user2)
- expect(instance).to receive(:project).twice.and_return(project)
+ expect(instance).to receive(:project).thrice.and_return(project)
expect(instance.participants(user1)).to eq([user2])
end
@@ -86,7 +86,7 @@ RSpec.describe Participable do
instance = model.new
- expect(instance).to receive(:project).twice.and_return(project)
+ expect(instance).to receive(:project).thrice.and_return(project)
instance.participants(user1)
@@ -138,7 +138,7 @@ RSpec.describe Participable do
allow(instance).to receive_message_chain(:model_name, :element) { 'class' }
expect(instance).to receive(:foo).and_return(user2)
expect(instance).to receive(:bar).and_return(user3)
- expect(instance).to receive(:project).twice.and_return(project)
+ expect(instance).to receive(:project).thrice.and_return(project)
participants = instance.visible_participants(user1)
@@ -159,7 +159,7 @@ RSpec.describe Participable do
allow(instance).to receive_message_chain(:model_name, :element) { 'class' }
allow(instance).to receive(:bar).and_return(user2)
- expect(instance).to receive(:project).twice.and_return(project)
+ expect(instance).to receive(:project).thrice.and_return(project)
expect(instance.visible_participants(user1)).to be_empty
end
diff --git a/spec/models/concerns/pg_full_text_searchable_spec.rb b/spec/models/concerns/pg_full_text_searchable_spec.rb
index 84209999ab2..55e3caf3c4c 100644
--- a/spec/models/concerns/pg_full_text_searchable_spec.rb
+++ b/spec/models/concerns/pg_full_text_searchable_spec.rb
@@ -14,6 +14,8 @@ RSpec.describe PgFullTextSearchable do
belongs_to :project
has_one :search_data, class_name: 'Issues::SearchData'
+ before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id }
+
def persist_pg_full_text_search_vector(search_vector)
Issues::SearchData.upsert({ project_id: project_id, issue_id: id, search_vector: search_vector }, unique_by: %i(project_id issue_id))
end
@@ -185,6 +187,8 @@ RSpec.describe PgFullTextSearchable do
belongs_to :project
has_one :search_data, class_name: 'Issues::SearchData'
+ before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id }
+
def self.name
'Issue'
end
diff --git a/spec/models/concerns/require_email_verification_spec.rb b/spec/models/concerns/require_email_verification_spec.rb
new file mode 100644
index 00000000000..d087b2864f8
--- /dev/null
+++ b/spec/models/concerns/require_email_verification_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe RequireEmailVerification do
+ let_it_be(:model) do
+ Class.new(ApplicationRecord) do
+ self.table_name = 'users'
+
+ devise :lockable
+
+ include RequireEmailVerification
+ end
+ end
+
+ using RSpec::Parameterized::TableSyntax
+
+ where(:feature_flag_enabled, :two_factor_enabled, :overridden) do
+ false | false | false
+ false | true | false
+ true | false | true
+ true | true | false
+ end
+
+ with_them do
+ let(:instance) { model.new(id: 1) }
+ let(:another_instance) { model.new(id: 2) }
+
+ before do
+ stub_feature_flags(require_email_verification: feature_flag_enabled ? instance : another_instance)
+ allow(instance).to receive(:two_factor_enabled?).and_return(two_factor_enabled)
+ end
+
+ describe '#lock_access!' do
+ subject { instance.lock_access! }
+
+ before do
+ allow(instance).to receive(:save)
+ end
+
+ it 'sends Devise unlock instructions unless overridden and always sets locked_at' do
+ expect(instance).to receive(:send_unlock_instructions).exactly(overridden ? 0 : 1).times
+
+ expect { subject }.to change { instance.locked_at }.from(nil)
+ end
+ end
+
+ describe '#attempts_exceeded?' do
+ subject { instance.send(:attempts_exceeded?) }
+
+ context 'when failed_attempts is LT overridden amount' do
+ before do
+ instance.failed_attempts = 5
+ end
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when failed_attempts is GTE overridden amount but LT Devise default amount' do
+ before do
+ instance.failed_attempts = 6
+ end
+
+ it { is_expected.to eq(overridden) }
+ end
+
+ context 'when failed_attempts is GTE Devise default amount' do
+ before do
+ instance.failed_attempts = 10
+ end
+
+ it { is_expected.to eq(true) }
+ end
+ end
+
+ describe '#lock_expired?' do
+ subject { instance.send(:lock_expired?) }
+
+ context 'when locked shorter ago than Devise default time' do
+ before do
+ instance.locked_at = 9.minutes.ago
+ end
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when locked longer ago than Devise default time but shorter ago than overriden time' do
+ before do
+ instance.locked_at = 11.minutes.ago
+ end
+
+ it { is_expected.to eq(!overridden) }
+ end
+
+ context 'when locked longer ago than overriden time' do
+ before do
+ instance.locked_at = (24.hours + 1.minute).ago
+ end
+
+ it { is_expected.to eq(true) }
+ end
+ end
+ end
+end
diff --git a/spec/models/concerns/token_authenticatable_spec.rb b/spec/models/concerns/token_authenticatable_spec.rb
index d7bfcc3f579..a2ce02f4661 100644
--- a/spec/models/concerns/token_authenticatable_spec.rb
+++ b/spec/models/concerns/token_authenticatable_spec.rb
@@ -94,6 +94,7 @@ RSpec.describe ApplicationSetting, 'TokenAuthenticatable' do
end
it { is_expected.to respond_to(:ensure_runners_registration_token) }
+ it { is_expected.to respond_to(:ensure_error_tracking_access_token) }
it { is_expected.to respond_to(:ensure_yet_another_token) }
end
diff --git a/spec/models/container_registry/event_spec.rb b/spec/models/container_registry/event_spec.rb
index e0194a07f46..799d9d4fd1c 100644
--- a/spec/models/container_registry/event_spec.rb
+++ b/spec/models/container_registry/event_spec.rb
@@ -40,16 +40,18 @@ RSpec.describe ContainerRegistry::Event do
subject(:handle!) { described_class.new(raw_event).handle! }
- it 'enqueues a project statistics update' do
- expect(ProjectCacheWorker).to receive(:perform_async).with(project.id, [], [:container_registry_size])
+ shared_examples 'event with project statistics update' do
+ it 'enqueues a project statistics update' do
+ expect(ProjectCacheWorker).to receive(:perform_async).with(project.id, [], [:container_registry_size])
- handle!
- end
+ handle!
+ end
- it 'clears the cache for the namespace container repositories size' do
- expect(Rails.cache).to receive(:delete).with(group.container_repositories_size_cache_key)
+ it 'clears the cache for the namespace container repositories size' do
+ expect(Rails.cache).to receive(:delete).with(group.container_repositories_size_cache_key)
- handle!
+ handle!
+ end
end
shared_examples 'event without project statistics update' do
@@ -60,10 +62,32 @@ RSpec.describe ContainerRegistry::Event do
end
end
+ it_behaves_like 'event with project statistics update'
+
context 'with no target tag' do
let(:target) { super().without('tag') }
it_behaves_like 'event without project statistics update'
+
+ context 'with a target digest' do
+ let(:target) { super().merge('digest' => 'abc123') }
+
+ it_behaves_like 'event without project statistics update'
+ end
+
+ context 'with a delete action' do
+ let(:action) { 'delete' }
+
+ context 'without a target digest' do
+ it_behaves_like 'event without project statistics update'
+ end
+
+ context 'with a target digest' do
+ let(:target) { super().merge('digest' => 'abc123') }
+
+ it_behaves_like 'event with project statistics update'
+ end
+ end
end
context 'with an unsupported action' do
diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb
index 7d0dfad91b2..e35788b1848 100644
--- a/spec/models/container_repository_spec.rb
+++ b/spec/models/container_repository_spec.rb
@@ -689,10 +689,29 @@ RSpec.describe ContainerRepository, :aggregate_failures do
it { is_expected.to eq(nil) }
end
- context 'with an old repository' do
+ context 'supports gitlab api on .com with an old repository' do
+ let(:on_com) { true }
let(:created_at) { described_class::MIGRATION_PHASE_1_STARTED_AT - 3.months }
- it { is_expected.to eq(nil) }
+ before do
+ allow(repository.gitlab_api_client).to receive(:supports_gitlab_api?).and_return(true)
+ allow(repository.gitlab_api_client).to receive(:repository_details).with(repository.path, sizing: :self).and_return(response)
+ expect(repository).to receive(:migration_state).and_return(migration_state)
+ end
+
+ context 'with migration_state import_done' do
+ let(:response) { { 'size_bytes' => 12345 } }
+ let(:migration_state) { 'import_done' }
+
+ it { is_expected.to eq(12345) }
+ end
+
+ context 'with migration_state not import_done' do
+ let(:response) { { 'size_bytes' => 12345 } }
+ let(:migration_state) { 'default' }
+
+ it { is_expected.to eq(nil) }
+ end
end
end
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index a58d32dfe5d..0a4ee73f3d3 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -139,29 +139,16 @@ RSpec.describe Deployment do
end
end
- it 'executes deployment hooks' do
+ it 'executes Deployments::HooksWorker asynchronously' do
freeze_time do
- expect(deployment).to receive(:execute_hooks).with(Time.current)
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status: 'running',
+ status_changed_at: Time.current)
deployment.run!
end
end
- context 'when `deployment_hooks_skip_worker` flag is disabled' do
- before do
- stub_feature_flags(deployment_hooks_skip_worker: false)
- end
-
- it 'executes Deployments::HooksWorker asynchronously' do
- freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
-
- deployment.run!
- end
- end
- end
-
it 'executes Deployments::DropOlderDeploymentsWorker asynchronously' do
expect(Deployments::DropOlderDeploymentsWorker)
.to receive(:perform_async).once.with(deployment.id)
@@ -189,28 +176,15 @@ RSpec.describe Deployment do
deployment.succeed!
end
- it 'executes deployment hooks' do
+ it 'executes Deployments::HooksWorker asynchronously' do
freeze_time do
- expect(deployment).to receive(:execute_hooks).with(Time.current)
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status: 'success',
+ status_changed_at: Time.current)
deployment.succeed!
end
end
-
- context 'when `deployment_hooks_skip_worker` flag is disabled' do
- before do
- stub_feature_flags(deployment_hooks_skip_worker: false)
- end
-
- it 'executes Deployments::HooksWorker asynchronously' do
- freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
-
- deployment.succeed!
- end
- end
- end
end
context 'when deployment failed' do
@@ -232,28 +206,15 @@ RSpec.describe Deployment do
deployment.drop!
end
- it 'executes deployment hooks' do
+ it 'executes Deployments::HooksWorker asynchronously' do
freeze_time do
- expect(deployment).to receive(:execute_hooks).with(Time.current)
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status: 'failed',
+ status_changed_at: Time.current)
deployment.drop!
end
end
-
- context 'when `deployment_hooks_skip_worker` flag is disabled' do
- before do
- stub_feature_flags(deployment_hooks_skip_worker: false)
- end
-
- it 'executes Deployments::HooksWorker asynchronously' do
- freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
-
- deployment.drop!
- end
- end
- end
end
context 'when deployment was canceled' do
@@ -275,28 +236,15 @@ RSpec.describe Deployment do
deployment.cancel!
end
- it 'executes deployment hooks' do
+ it 'executes Deployments::HooksWorker asynchronously' do
freeze_time do
- expect(deployment).to receive(:execute_hooks).with(Time.current)
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status: 'canceled',
+ status_changed_at: Time.current)
deployment.cancel!
end
end
-
- context 'when `deployment_hooks_skip_worker` flag is disabled' do
- before do
- stub_feature_flags(deployment_hooks_skip_worker: false)
- end
-
- it 'executes Deployments::HooksWorker asynchronously' do
- freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
-
- deployment.cancel!
- end
- end
- end
end
context 'when deployment was skipped' do
@@ -324,12 +272,6 @@ RSpec.describe Deployment do
deployment.skip!
end
end
-
- it 'does not execute deployment hooks' do
- expect(deployment).not_to receive(:execute_hooks)
-
- deployment.skip!
- end
end
context 'when deployment is blocked' do
@@ -353,12 +295,6 @@ RSpec.describe Deployment do
deployment.block!
end
-
- it 'does not execute deployment hooks' do
- expect(deployment).not_to receive(:execute_hooks)
-
- deployment.block!
- end
end
describe 'synching status to Jira' do
@@ -756,6 +692,37 @@ RSpec.describe Deployment do
.to contain_exactly(stop_env_b)
end
end
+
+ context 'When last deployment for environment is a retried build' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:environment_b) { create(:environment, project: project) }
+
+ let(:build_a) do
+ create(:ci_build, :success, project: project, pipeline: pipeline, environment: environment.name)
+ end
+
+ let(:build_b) do
+ create(:ci_build, :success, project: project, pipeline: pipeline, environment: environment_b.name)
+ end
+
+ let!(:deployment_a) do
+ create(:deployment, :success, project: project, environment: environment, deployable: build_a)
+ end
+
+ let!(:deployment_b) do
+ create(:deployment, :success, project: project, environment: environment_b, deployable: build_b)
+ end
+
+ before do
+ # Retry build_b
+ build_b.update!(retried: true)
+
+ # New successful build after retry.
+ create(:ci_build, :success, project: project, pipeline: pipeline, environment: environment_b.name)
+ end
+
+ it { expect(subject_method(environment_b)).not_to be_nil }
+ end
end
end
@@ -1052,30 +1019,11 @@ RSpec.describe Deployment do
expect(Deployments::UpdateEnvironmentWorker).to receive(:perform_async)
expect(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
expect(Deployments::ArchiveInProjectWorker).to receive(:perform_async)
+ expect(Deployments::HooksWorker).to receive(:perform_async)
expect(deploy.update_status('success')).to eq(true)
end
- context 'when `deployment_hooks_skip_worker` flag is disabled' do
- before do
- stub_feature_flags(deployment_hooks_skip_worker: false)
- end
-
- it 'schedules `Deployments::HooksWorker` when finishing a deploy' do
- expect(Deployments::HooksWorker).to receive(:perform_async)
-
- deploy.update_status('success')
- end
- end
-
- it 'executes deployment hooks when finishing a deploy' do
- freeze_time do
- expect(deploy).to receive(:execute_hooks).with(Time.current)
-
- deploy.update_status('success')
- end
- end
-
it 'updates finished_at when transitioning to a finished status' do
freeze_time do
deploy.update_status('success')
diff --git a/spec/models/diff_note_spec.rb b/spec/models/diff_note_spec.rb
index f377b34679c..d379ffeee02 100644
--- a/spec/models/diff_note_spec.rb
+++ b/spec/models/diff_note_spec.rb
@@ -260,32 +260,12 @@ RSpec.describe DiffNote do
end
context 'when the discussion was created in the diff' do
- context 'when file_identifier_hash is disabled' do
- before do
- stub_feature_flags(file_identifier_hash: false)
- end
-
- it 'returns correct diff file' do
- diff_file = subject.diff_file
-
- expect(diff_file.old_path).to eq(position.old_path)
- expect(diff_file.new_path).to eq(position.new_path)
- expect(diff_file.diff_refs).to eq(position.diff_refs)
- end
- end
-
- context 'when file_identifier_hash is enabled' do
- before do
- stub_feature_flags(file_identifier_hash: true)
- end
-
- it 'returns correct diff file' do
- diff_file = subject.diff_file
+ it 'returns correct diff file' do
+ diff_file = subject.diff_file
- expect(diff_file.old_path).to eq(position.old_path)
- expect(diff_file.new_path).to eq(position.new_path)
- expect(diff_file.diff_refs).to eq(position.diff_refs)
- end
+ expect(diff_file.old_path).to eq(position.old_path)
+ expect(diff_file.new_path).to eq(position.new_path)
+ expect(diff_file.diff_refs).to eq(position.diff_refs)
end
end
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index fd89a3a2e22..e3207636bdc 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -34,6 +34,14 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
it { is_expected.to validate_length_of(:external_url).is_at_most(255) }
+ describe 'validation' do
+ it 'does not become invalid record when external_url is empty' do
+ environment = build(:environment, external_url: nil)
+
+ expect(environment).to be_valid
+ end
+ end
+
describe '.before_save' do
it 'ensures environment tier when a new object is created' do
environment = build(:environment, name: 'gprd', tier: nil)
@@ -1672,6 +1680,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
'abcdef' | ChronicDuration::DurationParseError
'' | nil
nil | nil
+ 'never' | nil
end
with_them do
it 'sets correct auto_stop_in' do
@@ -1711,25 +1720,6 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
end
end
- describe '#elastic_stack_available?' do
- let!(:cluster) { create(:cluster, :project, :provided_by_user, projects: [project]) }
- let!(:deployment) { create(:deployment, :success, environment: environment, project: project, cluster: cluster) }
-
- context 'when integration does not exist' do
- it 'returns false' do
- expect(environment.elastic_stack_available?).to be(false)
- end
- end
-
- context 'when integration is enabled' do
- let!(:integration) { create(:clusters_integrations_elastic_stack, cluster: cluster) }
-
- it 'returns true' do
- expect(environment.elastic_stack_available?).to be(true)
- end
- end
- end
-
describe '#destroy' do
it 'remove the deployment refs from gitaly' do
deployment = create(:deployment, :success, environment: environment, project: project)
diff --git a/spec/models/factories_spec.rb b/spec/models/factories_spec.rb
index 45c3f93e6cf..2993b2aee58 100644
--- a/spec/models/factories_spec.rb
+++ b/spec/models/factories_spec.rb
@@ -104,6 +104,7 @@ RSpec.describe 'factories' do
factories_based_on_view = %i[
postgres_index
postgres_index_bloat_estimate
+ postgres_autovacuum_activity
].to_set.freeze
without_fd, with_fd = FactoryBot.factories
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index d47f43a630d..e8e805b2678 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -42,6 +42,7 @@ RSpec.describe Group do
it { is_expected.to have_many(:organizations).class_name('CustomerRelations::Organization') }
it { is_expected.to have_one(:crm_settings) }
it { is_expected.to have_one(:group_feature) }
+ it { is_expected.to have_one(:harbor_integration) }
describe '#members & #requesters' do
let(:requester) { create(:user) }
@@ -726,7 +727,7 @@ RSpec.describe Group do
context 'when user is a member of private group' do
before do
- private_group.add_user(user, Gitlab::Access::DEVELOPER)
+ private_group.add_member(user, Gitlab::Access::DEVELOPER)
end
it { is_expected.to match_array([private_group, internal_group, group]) }
@@ -736,7 +737,7 @@ RSpec.describe Group do
let!(:private_subgroup) { create(:group, :private, parent: private_group) }
before do
- private_subgroup.add_user(user, Gitlab::Access::DEVELOPER)
+ private_subgroup.add_member(user, Gitlab::Access::DEVELOPER)
end
it { is_expected.to match_array([private_subgroup, internal_group, group]) }
@@ -848,7 +849,7 @@ RSpec.describe Group do
expect(member).to receive(:refresh_member_authorized_projects).with(blocking: true)
end
- group.add_user(user, GroupMember::MAINTAINER)
+ group.add_member(user, GroupMember::MAINTAINER)
expect(group.group_members.maintainers.map(&:user)).to include(user)
end
@@ -858,7 +859,7 @@ RSpec.describe Group do
expect(member).to receive(:refresh_member_authorized_projects).with(blocking: false)
end
- group.add_user(user, GroupMember::MAINTAINER, blocking_refresh: false)
+ group.add_member(user, GroupMember::MAINTAINER, blocking_refresh: false)
end
end
@@ -866,12 +867,12 @@ RSpec.describe Group do
let(:user) { create(:user) }
before do
- group.add_users([user.id], GroupMember::GUEST)
+ group.add_members([user.id], GroupMember::GUEST)
end
it "updates the group permission" do
expect(group.group_members.guests.map(&:user)).to include(user)
- group.add_users([user.id], GroupMember::DEVELOPER)
+ group.add_members([user.id], GroupMember::DEVELOPER)
expect(group.group_members.developers.map(&:user)).to include(user)
expect(group.group_members.guests.map(&:user)).not_to include(user)
end
@@ -880,7 +881,7 @@ RSpec.describe Group do
let!(:project) { create(:project, group: group) }
before do
- group.add_users([create(:user)], :developer, tasks_to_be_done: %w(ci code), tasks_project_id: project.id)
+ group.add_members([create(:user)], :developer, tasks_to_be_done: %w(ci code), tasks_project_id: project.id)
end
it 'creates a member_task with the correct attributes', :aggregate_failures do
@@ -896,7 +897,7 @@ RSpec.describe Group do
let(:user) { create(:user) }
before do
- group.add_user(user, GroupMember::MAINTAINER)
+ group.add_member(user, GroupMember::MAINTAINER)
end
it "is true if avatar is image" do
@@ -993,7 +994,7 @@ RSpec.describe Group do
context 'there is also a project_bot owner' do
before do
- group.add_user(create(:user, :project_bot), GroupMember::OWNER)
+ group.add_member(create(:user, :project_bot), GroupMember::OWNER)
end
it { expect(group.last_owner?(@members[:owner])).to be_truthy }
@@ -1024,7 +1025,7 @@ RSpec.describe Group do
let(:member) { blocked_user.group_members.last }
before do
- group.add_user(blocked_user, GroupMember::OWNER)
+ group.add_member(blocked_user, GroupMember::OWNER)
end
context 'when last_blocked_owner is set' do
@@ -1050,7 +1051,7 @@ RSpec.describe Group do
context 'with another active owner' do
before do
- group.add_user(create(:user), GroupMember::OWNER)
+ group.add_member(create(:user), GroupMember::OWNER)
end
it { expect(group.member_last_blocked_owner?(member)).to be(false) }
@@ -1058,7 +1059,7 @@ RSpec.describe Group do
context 'with 2 blocked owners' do
before do
- group.add_user(create(:user, :blocked), GroupMember::OWNER)
+ group.add_member(create(:user, :blocked), GroupMember::OWNER)
end
it { expect(group.member_last_blocked_owner?(member)).to be(false) }
@@ -1082,7 +1083,7 @@ RSpec.describe Group do
describe '#single_blocked_owner?' do
context 'when there is only one blocked owner' do
before do
- group.add_user(blocked_user, GroupMember::OWNER)
+ group.add_member(blocked_user, GroupMember::OWNER)
end
it 'returns true' do
@@ -1094,8 +1095,8 @@ RSpec.describe Group do
let_it_be(:blocked_user_2) { create(:user, :blocked) }
before do
- group.add_user(blocked_user, GroupMember::OWNER)
- group.add_user(blocked_user_2, GroupMember::OWNER)
+ group.add_member(blocked_user, GroupMember::OWNER)
+ group.add_member(blocked_user_2, GroupMember::OWNER)
end
it 'returns true' do
@@ -1114,8 +1115,8 @@ RSpec.describe Group do
let_it_be(:user) { create(:user) }
before do
- group.add_user(blocked_user, GroupMember::OWNER)
- group.add_user(user, GroupMember::OWNER)
+ group.add_member(blocked_user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
end
it 'has only blocked owners' do
@@ -1129,7 +1130,7 @@ RSpec.describe Group do
context 'when there is only one owner' do
let!(:owner) do
- group.add_user(user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
end
it 'returns the owner' do
@@ -1138,7 +1139,7 @@ RSpec.describe Group do
context 'and there is also a project_bot owner' do
before do
- group.add_user(create(:user, :project_bot), GroupMember::OWNER)
+ group.add_member(create(:user, :project_bot), GroupMember::OWNER)
end
it 'returns only the human owner' do
@@ -1151,11 +1152,11 @@ RSpec.describe Group do
let_it_be(:user_2) { create(:user) }
let!(:owner) do
- group.add_user(user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
end
let!(:owner2) do
- group.add_user(user_2, GroupMember::OWNER)
+ group.add_member(user_2, GroupMember::OWNER)
end
it 'returns both owners' do
@@ -1164,7 +1165,7 @@ RSpec.describe Group do
context 'and there is also a project_bot owner' do
before do
- group.add_user(create(:user, :project_bot), GroupMember::OWNER)
+ group.add_member(create(:user, :project_bot), GroupMember::OWNER)
end
it 'returns only the human owners' do
@@ -1186,7 +1187,7 @@ RSpec.describe Group do
let(:member) { group.members.last }
before do
- group.add_user(user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
end
context 'when last_owner is set' do
@@ -1284,11 +1285,11 @@ RSpec.describe Group do
requester: create(:user)
}
- group.add_user(members[:owner], GroupMember::OWNER)
- group.add_user(members[:maintainer], GroupMember::MAINTAINER)
- group.add_user(members[:developer], GroupMember::DEVELOPER)
- group.add_user(members[:reporter], GroupMember::REPORTER)
- group.add_user(members[:guest], GroupMember::GUEST)
+ group.add_member(members[:owner], GroupMember::OWNER)
+ group.add_member(members[:maintainer], GroupMember::MAINTAINER)
+ group.add_member(members[:developer], GroupMember::DEVELOPER)
+ group.add_member(members[:reporter], GroupMember::REPORTER)
+ group.add_member(members[:guest], GroupMember::GUEST)
group.request_access(members[:requester])
members
@@ -1464,8 +1465,8 @@ RSpec.describe Group do
describe '#direct_members' do
let_it_be(:group) { create(:group, :nested) }
- let_it_be(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
- let_it_be(:developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
+ let_it_be(:maintainer) { group.parent.add_member(create(:user), GroupMember::MAINTAINER) }
+ let_it_be(:developer) { group.add_member(create(:user), GroupMember::DEVELOPER) }
it 'does not return members of the parent' do
expect(group.direct_members).not_to include(maintainer)
@@ -1491,8 +1492,8 @@ RSpec.describe Group do
shared_examples_for 'members_with_parents' do
let!(:group) { create(:group, :nested) }
- let!(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
- let!(:developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
+ let!(:maintainer) { group.parent.add_member(create(:user), GroupMember::MAINTAINER) }
+ let!(:developer) { group.add_member(create(:user), GroupMember::DEVELOPER) }
let!(:pending_maintainer) { create(:group_member, :awaiting, :maintainer, group: group.parent) }
let!(:pending_developer) { create(:group_member, :awaiting, :developer, group: group) }
@@ -1603,9 +1604,9 @@ RSpec.describe Group do
context 'members-related methods' do
let!(:group) { create(:group, :nested) }
let!(:sub_group) { create(:group, parent: group) }
- let!(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
- let!(:developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
- let!(:other_developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
+ let!(:maintainer) { group.parent.add_member(create(:user), GroupMember::MAINTAINER) }
+ let!(:developer) { group.add_member(create(:user), GroupMember::DEVELOPER) }
+ let!(:other_developer) { group.add_member(create(:user), GroupMember::DEVELOPER) }
describe '#direct_and_indirect_members' do
it 'returns parents members' do
@@ -1619,7 +1620,7 @@ RSpec.describe Group do
end
describe '#direct_and_indirect_members_with_inactive' do
- let!(:maintainer_blocked) { group.parent.add_user(create(:user, :blocked), GroupMember::MAINTAINER) }
+ let!(:maintainer_blocked) { group.parent.add_member(create(:user, :blocked), GroupMember::MAINTAINER) }
it 'returns parents members' do
expect(group.direct_and_indirect_members_with_inactive).to include(developer)
@@ -1795,8 +1796,8 @@ RSpec.describe Group do
maintainer = create(:user)
developer = create(:user)
- group.add_user(maintainer, GroupMember::MAINTAINER)
- group.add_user(developer, GroupMember::DEVELOPER)
+ group.add_member(maintainer, GroupMember::MAINTAINER)
+ group.add_member(developer, GroupMember::DEVELOPER)
expect(group.user_ids_for_project_authorizations)
.to include(maintainer.id, developer.id)
@@ -1847,7 +1848,7 @@ RSpec.describe Group do
context 'group membership' do
before do
- group.add_user(user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
end
it 'is called when require_two_factor_authentication is changed' do
@@ -1870,7 +1871,7 @@ RSpec.describe Group do
it 'calls #update_two_factor_requirement on each group member' do
other_user = create(:user)
- group.add_user(other_user, GroupMember::OWNER)
+ group.add_member(other_user, GroupMember::OWNER)
calls = 0
allow_any_instance_of(User).to receive(:update_two_factor_requirement) do
@@ -1885,7 +1886,7 @@ RSpec.describe Group do
context 'sub groups and projects' do
it 'enables two_factor_requirement for group member' do
- group.add_user(user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
group.update!(require_two_factor_authentication: true)
@@ -1899,7 +1900,7 @@ RSpec.describe Group do
context 'two_factor_requirement is also enabled for ancestor group' do
it 'enables two_factor_requirement for subgroup member' do
subgroup = create(:group, :nested, parent: group)
- subgroup.add_user(indirect_user, GroupMember::OWNER)
+ subgroup.add_member(indirect_user, GroupMember::OWNER)
group.update!(require_two_factor_authentication: true)
@@ -1910,7 +1911,7 @@ RSpec.describe Group do
context 'two_factor_requirement is disabled for ancestor group' do
it 'enables two_factor_requirement for subgroup member' do
subgroup = create(:group, :nested, parent: group, require_two_factor_authentication: true)
- subgroup.add_user(indirect_user, GroupMember::OWNER)
+ subgroup.add_member(indirect_user, GroupMember::OWNER)
group.update!(require_two_factor_authentication: false)
@@ -1919,7 +1920,7 @@ RSpec.describe Group do
it 'enable two_factor_requirement for ancestor group member' do
ancestor_group = create(:group)
- ancestor_group.add_user(indirect_user, GroupMember::OWNER)
+ ancestor_group.add_member(indirect_user, GroupMember::OWNER)
group.update!(parent: ancestor_group)
group.update!(require_two_factor_authentication: true)
@@ -1933,7 +1934,7 @@ RSpec.describe Group do
context 'two_factor_requirement is enabled for ancestor group' do
it 'enables two_factor_requirement for subgroup member' do
subgroup = create(:group, :nested, parent: group)
- subgroup.add_user(indirect_user, GroupMember::OWNER)
+ subgroup.add_member(indirect_user, GroupMember::OWNER)
group.update!(require_two_factor_authentication: true)
@@ -1944,7 +1945,7 @@ RSpec.describe Group do
context 'two_factor_requirement is also disabled for ancestor group' do
it 'disables two_factor_requirement for subgroup member' do
subgroup = create(:group, :nested, parent: group)
- subgroup.add_user(indirect_user, GroupMember::OWNER)
+ subgroup.add_member(indirect_user, GroupMember::OWNER)
group.update!(require_two_factor_authentication: false)
@@ -1954,7 +1955,7 @@ RSpec.describe Group do
it 'disables two_factor_requirement for ancestor group member' do
ancestor_group = create(:group, require_two_factor_authentication: false)
indirect_user.update!(require_two_factor_authentication_from_group: true)
- ancestor_group.add_user(indirect_user, GroupMember::OWNER)
+ ancestor_group.add_member(indirect_user, GroupMember::OWNER)
group.update!(require_two_factor_authentication: false)
diff --git a/spec/models/hooks/project_hook_spec.rb b/spec/models/hooks/project_hook_spec.rb
index 4253686b843..923a6f92424 100644
--- a/spec/models/hooks/project_hook_spec.rb
+++ b/spec/models/hooks/project_hook_spec.rb
@@ -15,6 +15,19 @@ RSpec.describe ProjectHook do
subject { build(:project_hook, project: create(:project)) }
end
+ describe '.for_projects' do
+ it 'finds related project hooks' do
+ hook_a = create(:project_hook)
+ hook_b = create(:project_hook)
+ hook_c = create(:project_hook)
+
+ expect(described_class.for_projects([hook_a.project, hook_b.project]))
+ .to contain_exactly(hook_a, hook_b)
+ expect(described_class.for_projects(hook_c.project))
+ .to contain_exactly(hook_c)
+ end
+ end
+
describe '.push_hooks' do
it 'returns hooks for push events only' do
hook = create(:project_hook, push_events: true)
@@ -50,4 +63,62 @@ RSpec.describe ProjectHook do
)
end
end
+
+ describe '#update_last_failure', :clean_gitlab_redis_shared_state do
+ let_it_be(:hook) { create(:project_hook) }
+
+ it 'is a method of this class' do
+ expect { hook.update_last_failure }.not_to raise_error
+ end
+
+ context 'when the hook is executable' do
+ it 'does not update the state' do
+ expect(Gitlab::Redis::SharedState).not_to receive(:with)
+
+ hook.update_last_failure
+ end
+ end
+
+ context 'when the hook is failed' do
+ before do
+ allow(hook).to receive(:executable?).and_return(false)
+ end
+
+ def last_failure
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.get("web_hooks:last_failure:project-#{hook.project.id}")
+ end
+ end
+
+ context 'there is no prior value', :freeze_time do
+ it 'updates the state' do
+ expect { hook.update_last_failure }.to change { last_failure }.to(Time.current)
+ end
+ end
+
+ context 'there is a prior value, from before now' do
+ it 'updates the state' do
+ the_future = 1.minute.from_now
+
+ hook.update_last_failure
+
+ travel_to(the_future) do
+ expect { hook.update_last_failure }.to change { last_failure }.to(the_future.iso8601)
+ end
+ end
+ end
+
+ context 'there is a prior value, from after now' do
+ it 'does not update the state' do
+ the_past = 1.minute.ago
+
+ hook.update_last_failure
+
+ travel_to(the_past) do
+ expect { hook.update_last_failure }.not_to change { last_failure }
+ end
+ end
+ end
+ end
+ end
end
diff --git a/spec/models/hooks/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb
index fb4d1cee606..9faa5e1567c 100644
--- a/spec/models/hooks/web_hook_spec.rb
+++ b/spec/models/hooks/web_hook_spec.rb
@@ -78,6 +78,32 @@ RSpec.describe WebHook do
expect(hook.url).to eq('https://example.com')
end
+
+ context 'when there are URL variables' do
+ subject { hook }
+
+ before do
+ hook.url_variables = { 'one' => 'a', 'two' => 'b' }
+ end
+
+ it { is_expected.to allow_value('http://example.com').for(:url) }
+ it { is_expected.to allow_value('http://example.com/{one}/{two}').for(:url) }
+ it { is_expected.to allow_value('http://example.com/{one}').for(:url) }
+ it { is_expected.to allow_value('http://example.com/{two}').for(:url) }
+ it { is_expected.to allow_value('http://user:s3cret@example.com/{two}').for(:url) }
+ it { is_expected.to allow_value('http://{one}:{two}@example.com').for(:url) }
+
+ it { is_expected.not_to allow_value('http://example.com/{one}/{two}/{three}').for(:url) }
+ it { is_expected.not_to allow_value('http://example.com/{foo}').for(:url) }
+ it { is_expected.not_to allow_value('http:{user}:{pwd}//example.com/{foo}').for(:url) }
+
+ it 'mentions all missing variable names' do
+ hook.url = 'http://example.com/{one}/{foo}/{two}/{three}'
+
+ expect(hook).to be_invalid
+ expect(hook.errors[:url].to_sentence).to eq "Invalid URL template. Missing keys: [\"foo\", \"three\"]"
+ end
+ end
end
describe 'token' do
@@ -161,8 +187,8 @@ RSpec.describe WebHook do
end
end
- describe '.executable' do
- let(:not_executable) do
+ describe '.executable/.disabled' do
+ let!(:not_executable) do
[
[0, Time.current],
[0, 1.minute.from_now],
@@ -176,7 +202,7 @@ RSpec.describe WebHook do
end
end
- let(:executables) do
+ let!(:executables) do
[
[0, nil],
[0, 1.day.ago],
@@ -191,6 +217,7 @@ RSpec.describe WebHook do
it 'finds the correct set of project hooks' do
expect(described_class.where(project_id: project.id).executable).to match_array executables
+ expect(described_class.where(project_id: project.id).disabled).to match_array not_executable
end
context 'when the feature flag is not enabled' do
@@ -198,7 +225,7 @@ RSpec.describe WebHook do
stub_feature_flags(web_hooks_disable_failed: false)
end
- it 'is the same as all' do
+ specify 'enabled is the same as all' do
expect(described_class.where(project_id: project.id).executable).to match_array(executables + not_executable)
end
end
@@ -559,4 +586,60 @@ RSpec.describe WebHook do
expect(hook.to_json(unsafe_serialization_hash: true)).not_to include('encrypted_url_variables')
end
end
+
+ describe '#interpolated_url' do
+ subject(:hook) { build(:project_hook, project: project) }
+
+ context 'when the hook URL does not contain variables' do
+ before do
+ hook.url = 'http://example.com'
+ end
+
+ it { is_expected.to have_attributes(interpolated_url: hook.url) }
+ end
+
+ it 'is not vulnerable to malicious input' do
+ hook.url = 'something%{%<foo>2147483628G}'
+ hook.url_variables = { 'foo' => '1234567890.12345678' }
+
+ expect(hook).to have_attributes(interpolated_url: hook.url)
+ end
+
+ context 'when the hook URL contains variables' do
+ before do
+ hook.url = 'http://example.com/{path}/resource?token={token}'
+ hook.url_variables = { 'path' => 'abc', 'token' => 'xyz' }
+ end
+
+ it { is_expected.to have_attributes(interpolated_url: 'http://example.com/abc/resource?token=xyz') }
+
+ context 'when a variable is missing' do
+ before do
+ hook.url_variables = { 'path' => 'present' }
+ end
+
+ it 'raises an error' do
+ # We expect validations to prevent this entirely - this is not user-error
+ expect { hook.interpolated_url }
+ .to raise_error(described_class::InterpolationError, include('Missing key token'))
+ end
+ end
+
+ context 'when the URL appears to include percent formatting' do
+ before do
+ hook.url = 'http://example.com/%{path}/resource?token=%{token}'
+ end
+
+ it 'succeeds, interpolates correctly' do
+ expect(hook.interpolated_url).to eq 'http://example.com/%abc/resource?token=%xyz'
+ end
+ end
+ end
+ end
+
+ describe '#update_last_failure' do
+ it 'is a method of this class' do
+ expect { described_class.new.update_last_failure }.not_to raise_error
+ end
+ end
end
diff --git a/spec/models/incident_management/issuable_escalation_status_spec.rb b/spec/models/incident_management/issuable_escalation_status_spec.rb
index f956be3a04e..39d1fb325f5 100644
--- a/spec/models/incident_management/issuable_escalation_status_spec.rb
+++ b/spec/models/incident_management/issuable_escalation_status_spec.rb
@@ -11,7 +11,9 @@ RSpec.describe IncidentManagement::IssuableEscalationStatus do
describe 'associations' do
it { is_expected.to belong_to(:issue) }
- it { is_expected.to have_one(:project).through(:issue) }
+ it do
+ is_expected.to have_one(:project).through(:issue).inverse_of(:incident_management_issuable_escalation_statuses)
+ end
end
describe 'validatons' do
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index 038018fbd0c..86074765c7b 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -799,7 +799,7 @@ RSpec.describe Integration do
shared_examples '#api_field_names' do
it 'filters out secret fields' do
- safe_fields = %w[some_safe_field safe_field url trojan_gift]
+ safe_fields = %w[some_safe_field safe_field url trojan_gift api_only_field]
expect(fake_integration.new).to have_attributes(
api_field_names: match_array(safe_fields)
@@ -807,6 +807,12 @@ RSpec.describe Integration do
end
end
+ shared_examples '#form_fields' do
+ it 'filters out API only fields' do
+ expect(fake_integration.new.form_fields.pluck(:name)).not_to include('api_only_field')
+ end
+ end
+
context 'when the class overrides #fields' do
let(:fake_integration) do
Class.new(Integration) do
@@ -824,7 +830,8 @@ RSpec.describe Integration do
{ name: 'safe_field' },
{ name: 'url' },
{ name: 'trojan_horse', type: 'password' },
- { name: 'trojan_gift', type: 'gift' }
+ { name: 'trojan_gift', type: 'text' },
+ { name: 'api_only_field', api_only: true }
].shuffle
end
end
@@ -832,6 +839,7 @@ RSpec.describe Integration do
it_behaves_like '#fields'
it_behaves_like '#api_field_names'
+ it_behaves_like '#form_fields'
end
context 'when the class uses the field DSL' do
@@ -849,12 +857,14 @@ RSpec.describe Integration do
field :safe_field
field :url
field :trojan_horse, type: 'password'
- field :trojan_gift, type: 'gift'
+ field :trojan_gift, type: 'text'
+ field :api_only_field, api_only: true
end
end
it_behaves_like '#fields'
it_behaves_like '#api_field_names'
+ it_behaves_like '#form_fields'
end
end
@@ -1051,11 +1061,9 @@ RSpec.describe Integration do
field :bar, type: 'password'
field :password
- field :with_help,
- help: -> { 'help' }
-
- field :a_number,
- type: 'number'
+ field :with_help, help: -> { 'help' }
+ field :select, type: 'select'
+ field :boolean, type: 'checkbox'
end
end
@@ -1084,6 +1092,16 @@ RSpec.describe Integration do
expect(integration).to be_foo_p_changed
end
+ it 'provides boolean accessors for checkbox fields' do
+ expect(integration).to respond_to(:boolean)
+ expect(integration).to respond_to(:boolean?)
+
+ expect(integration).not_to respond_to(:foo?)
+ expect(integration).not_to respond_to(:bar?)
+ expect(integration).not_to respond_to(:password?)
+ expect(integration).not_to respond_to(:select?)
+ end
+
it 'provides data fields' do
integration.foo_dt = 3
expect(integration.foo_dt).to eq 3
@@ -1093,21 +1111,24 @@ RSpec.describe Integration do
it 'registers fields in the fields list' do
expect(integration.fields.pluck(:name)).to match_array %w[
- foo foo_p foo_dt bar password with_help a_number
+ foo foo_p foo_dt bar password with_help select boolean
]
expect(integration.api_field_names).to match_array %w[
- foo foo_p foo_dt with_help a_number
+ foo foo_p foo_dt with_help select boolean
]
end
specify 'fields have expected attributes' do
expect(integration.fields).to include(
have_attributes(name: 'foo', type: 'text'),
+ have_attributes(name: 'foo_p', type: 'text'),
+ have_attributes(name: 'foo_dt', type: 'text'),
have_attributes(name: 'bar', type: 'password'),
have_attributes(name: 'password', type: 'password'),
- have_attributes(name: 'a_number', type: 'number'),
- have_attributes(name: 'with_help', help: 'help')
+ have_attributes(name: 'with_help', help: 'help'),
+ have_attributes(name: 'select', type: 'select'),
+ have_attributes(name: 'boolean', type: 'checkbox')
)
end
end
@@ -1115,11 +1136,12 @@ RSpec.describe Integration do
describe 'boolean_accessor' do
let(:klass) do
Class.new(Integration) do
+ prop_accessor :test_value
boolean_accessor :test_value
end
end
- let(:integration) { klass.new(properties: { test_value: input }) }
+ let(:integration) { klass.new(test_value: input) }
where(:input, :method_result, :predicate_method_result) do
true | true | true
@@ -1149,6 +1171,35 @@ RSpec.describe Integration do
test_value: be(method_result),
test_value?: be(predicate_method_result)
)
+
+ # Make sure the original value is stored correctly
+ expect(integration.send(:test_value_before_type_cast)).to eq(input)
+ expect(integration.properties).to include('test_value' => input)
+ end
+
+ context 'when using data fields' do
+ let(:klass) do
+ Class.new(Integration) do
+ field :project_url, storage: :data_fields, type: 'checkbox'
+
+ def data_fields
+ issue_tracker_data || self.build_issue_tracker_data
+ end
+ end
+ end
+
+ let(:integration) { klass.new(project_url: input) }
+
+ it 'has the correct value' do
+ expect(integration).to have_attributes(
+ project_url: be(method_result),
+ project_url?: be(predicate_method_result)
+ )
+
+ # Make sure the original value is stored correctly
+ expect(integration.send(:project_url_before_type_cast)).to eq(input == false ? 'false' : input)
+ expect(integration.properties).not_to include('project_url')
+ end
end
end
@@ -1160,6 +1211,24 @@ RSpec.describe Integration do
test_value?: be(false)
)
end
+
+ context 'when getter is not defined' do
+ let(:input) { true }
+ let(:klass) do
+ Class.new(Integration) do
+ boolean_accessor :test_value
+ end
+ end
+
+ it 'defines a prop_accessor' do
+ expect(integration).to have_attributes(
+ test_value: true,
+ test_value?: true
+ )
+
+ expect(integration.properties['test_value']).to be(true)
+ end
+ end
end
describe '#attributes' do
@@ -1218,7 +1287,6 @@ RSpec.describe Integration do
it 'queues a Integrations::ExecuteWorker' do
expect(Integrations::ExecuteWorker).to receive(:perform_async).with(integration.id, data)
- expect(ProjectServiceWorker).not_to receive(:perform_async)
async_execute
end
@@ -1232,18 +1300,5 @@ RSpec.describe Integration do
async_execute
end
end
-
- context 'when the FF :rename_integration_workers is disabled' do
- before do
- stub_feature_flags(rename_integrations_workers: false)
- end
-
- it 'queues a ProjectServiceWorker' do
- expect(ProjectServiceWorker).to receive(:perform_async).with(integration.id, data)
- expect(Integrations::ExecuteWorker).not_to receive(:perform_async)
-
- async_execute
- end
- end
end
end
diff --git a/spec/models/integrations/base_chat_notification_spec.rb b/spec/models/integrations/base_chat_notification_spec.rb
index 672d8de1e14..eb503e501d6 100644
--- a/spec/models/integrations/base_chat_notification_spec.rb
+++ b/spec/models/integrations/base_chat_notification_spec.rb
@@ -285,4 +285,22 @@ RSpec.describe Integrations::BaseChatNotification do
expect { subject.webhook_placeholder }.to raise_error(NotImplementedError)
end
end
+
+ describe '#event_channel_name' do
+ it 'returns the channel field name for the given event' do
+ expect(subject.event_channel_name(:event)).to eq('event_channel')
+ end
+ end
+
+ describe '#event_channel_value' do
+ it 'returns the channel field value for the given event' do
+ subject.push_channel = '#pushes'
+
+ expect(subject.event_channel_value(:push)).to eq('#pushes')
+ end
+
+ it 'raises an error for unsupported events' do
+ expect { subject.event_channel_value(:foo) }.to raise_error(NoMethodError)
+ end
+ end
end
diff --git a/spec/models/integrations/chat_message/deployment_message_spec.rb b/spec/models/integrations/chat_message/deployment_message_spec.rb
index 6bcd29c0a00..8da27ef5aa0 100644
--- a/spec/models/integrations/chat_message/deployment_message_spec.rb
+++ b/spec/models/integrations/chat_message/deployment_message_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Integrations::ChatMessage::DeploymentMessage do
let_it_be(:deployment) { create(:deployment, status: :success, deployable: ci_build, environment: environment, project: project, user: user, sha: commit.sha) }
let(:args) do
- Gitlab::DataBuilder::Deployment.build(deployment, Time.current)
+ Gitlab::DataBuilder::Deployment.build(deployment, 'success', Time.current)
end
it_behaves_like Integrations::ChatMessage
diff --git a/spec/models/integrations/datadog_spec.rb b/spec/models/integrations/datadog_spec.rb
index cfc44b22a84..47f916e8457 100644
--- a/spec/models/integrations/datadog_spec.rb
+++ b/spec/models/integrations/datadog_spec.rb
@@ -240,4 +240,20 @@ RSpec.describe Integrations::Datadog do
end
end
end
+
+ describe '#fields' do
+ it 'includes the archive_trace_events field' do
+ expect(instance.fields).to include(have_attributes(name: 'archive_trace_events'))
+ end
+
+ context 'when the FF :datadog_integration_logs_collection is disabled' do
+ before do
+ stub_feature_flags(datadog_integration_logs_collection: false)
+ end
+
+ it 'does not include the archive_trace_events field' do
+ expect(instance.fields).not_to include(have_attributes(name: 'archive_trace_events'))
+ end
+ end
+ end
end
diff --git a/spec/models/integrations/field_spec.rb b/spec/models/integrations/field_spec.rb
index 6b1ce7fcbde..642fb1fbf7f 100644
--- a/spec/models/integrations/field_spec.rb
+++ b/spec/models/integrations/field_spec.rb
@@ -14,6 +14,37 @@ RSpec.describe ::Integrations::Field do
end
end
+ describe '#initialize' do
+ it 'sets type password for secret names' do
+ attrs[:name] = 'token'
+ attrs[:type] = 'text'
+
+ expect(field[:type]).to eq('password')
+ end
+
+ it 'uses the given type for other names' do
+ attrs[:name] = 'field'
+ attrs[:type] = 'select'
+
+ expect(field[:type]).to eq('select')
+ end
+
+ it 'raises an error if an invalid attribute is given' do
+ attrs[:foo] = 'foo'
+ attrs[:bar] = 'bar'
+ attrs[:name] = 'name'
+ attrs[:type] = 'text'
+
+ expect { field }.to raise_error(ArgumentError, "Invalid attributes [:foo, :bar]")
+ end
+
+ it 'raises an error if an invalid type is given' do
+ attrs[:type] = 'other'
+
+ expect { field }.to raise_error(ArgumentError, 'Invalid type "other"')
+ end
+ end
+
describe '#name' do
before do
attrs[:name] = :foo
@@ -59,7 +90,7 @@ RSpec.describe ::Integrations::Field do
it 'has the correct default' do
expect(field[name]).to have_correct_default
- expect(field.send(name)).to have_correct_default
+ expect(field.public_send(name)).to have_correct_default
end
end
@@ -69,32 +100,66 @@ RSpec.describe ::Integrations::Field do
end
it 'is known' do
+ next if name == :type
+
expect(field[name]).to eq(:known)
- expect(field.send(name)).to eq(:known)
+ expect(field.public_send(name)).to eq(:known)
end
end
context 'when set to a dynamic value' do
it 'is computed' do
+ next if name == :type
+
attrs[name] = -> { Time.current }
start = Time.current
travel_to(start + 1.minute) do
expect(field[name]).to be_after(start)
- expect(field.send(name)).to be_after(start)
+ expect(field.public_send(name)).to be_after(start)
end
end
it 'is executed in the class scope' do
+ next if name == :type
+
attrs[name] = -> { default_placeholder }
expect(field[name]).to eq('my placeholder')
- expect(field.send(name)).to eq('my placeholder')
+ expect(field.public_send(name)).to eq('my placeholder')
end
end
end
end
+ described_class::BOOLEAN_ATTRIBUTES.each do |name|
+ describe "##{name}?" do
+ it 'returns true if the value is truthy' do
+ attrs[name] = ''
+ expect(field.public_send("#{name}?")).to be(true)
+ end
+
+ it 'returns false if the value is falsey' do
+ attrs[name] = nil
+ expect(field.public_send("#{name}?")).to be(false)
+ end
+ end
+ end
+
+ described_class::TYPES.each do |type|
+ describe "##{type}?" do
+ it 'returns true if the type matches' do
+ attrs[:type] = type
+ expect(field.public_send("#{type}?")).to be(true)
+ end
+
+ it 'returns false if the type does not match' do
+ attrs[:type] = (described_class::TYPES - [type]).first
+ expect(field.public_send("#{type}?")).to be(false)
+ end
+ end
+ end
+
describe '#secret?' do
context 'when empty' do
it { is_expected.not_to be_secret }
diff --git a/spec/models/integrations/harbor_spec.rb b/spec/models/integrations/harbor_spec.rb
index 9e3d4b524a6..5d8597969a1 100644
--- a/spec/models/integrations/harbor_spec.rb
+++ b/spec/models/integrations/harbor_spec.rb
@@ -19,6 +19,14 @@ RSpec.describe Integrations::Harbor do
it { is_expected.to allow_value('helloworld').for(:password) }
end
+ describe 'url' do
+ subject { build(:harbor_integration) }
+
+ it { is_expected.not_to allow_value('https://192.168.1.1').for(:url) }
+ it { is_expected.not_to allow_value('https://127.0.0.1').for(:url) }
+ it { is_expected.to allow_value('https://demo.goharbor.io').for(:url)}
+ end
+
describe '#fields' do
it 'returns custom fields' do
expect(harbor_integration.fields.pluck(:name)).to eq(%w[url project_name username password])
diff --git a/spec/models/integrations/irker_spec.rb b/spec/models/integrations/irker_spec.rb
index 16487aa36e7..e98b8b54e03 100644
--- a/spec/models/integrations/irker_spec.rb
+++ b/spec/models/integrations/irker_spec.rb
@@ -76,19 +76,5 @@ RSpec.describe Integrations::Irker do
ensure
conn.close if conn
end
-
- context 'when the FF :rename_integrations_workers is disabled' do
- before do
- stub_feature_flags(rename_integrations_workers: false)
- end
-
- it 'queues a IrkerWorker' do
- expect(::IrkerWorker).to receive(:perform_async)
- .with(project.id, irker.channels, colorize_messages, sample_data, irker.settings)
- expect(Integrations::IrkerWorker).not_to receive(:perform_async)
-
- irker.execute(sample_data)
- end
- end
end
end
diff --git a/spec/models/integrations/jira_spec.rb b/spec/models/integrations/jira_spec.rb
index 28d97b74adb..2a994540bd3 100644
--- a/spec/models/integrations/jira_spec.rb
+++ b/spec/models/integrations/jira_spec.rb
@@ -164,7 +164,7 @@ RSpec.describe Integrations::Jira do
subject(:fields) { integration.fields }
it 'returns custom fields' do
- expect(fields.pluck(:name)).to eq(%w[url api_url username password])
+ expect(fields.pluck(:name)).to eq(%w[url api_url username password jira_issue_transition_id])
end
end
diff --git a/spec/models/integrations/prometheus_spec.rb b/spec/models/integrations/prometheus_spec.rb
index fbeaebfd807..ae965ed78d1 100644
--- a/spec/models/integrations/prometheus_spec.rb
+++ b/spec/models/integrations/prometheus_spec.rb
@@ -475,47 +475,4 @@ RSpec.describe Integrations::Prometheus, :use_clean_rails_memory_store_caching,
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|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/slack_spec.rb b/spec/models/integrations/slack_spec.rb
index 3997d69f947..5801a4c3749 100644
--- a/spec/models/integrations/slack_spec.rb
+++ b/spec/models/integrations/slack_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe Integrations::Slack do
context 'deployment notification' do
let_it_be(:deployment) { create(:deployment, user: user) }
- let(:data) { Gitlab::DataBuilder::Deployment.build(deployment, Time.current) }
+ let(:data) { Gitlab::DataBuilder::Deployment.build(deployment, deployment.status, Time.current) }
it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_deployment_notification'
end
diff --git a/spec/models/integrations/youtrack_spec.rb b/spec/models/integrations/youtrack_spec.rb
index f6a9dd8ef37..618ebcbb76a 100644
--- a/spec/models/integrations/youtrack_spec.rb
+++ b/spec/models/integrations/youtrack_spec.rb
@@ -37,4 +37,10 @@ RSpec.describe Integrations::Youtrack do
expect(described_class.reference_pattern.match('yt-123')[:issue]).to eq('yt-123')
end
end
+
+ describe '#fields' do
+ it 'only returns the project_url and issues_url fields' do
+ expect(subject.fields.pluck(:name)).to eq(%w[project_url issues_url])
+ end
+ end
end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index d45a23a7ef8..89c440dc49c 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -14,7 +14,6 @@ RSpec.describe Issue do
it { is_expected.to belong_to(:milestone) }
it { is_expected.to belong_to(:iteration) }
it { is_expected.to belong_to(:project) }
- it { is_expected.to have_one(:namespace).through(:project) }
it { is_expected.to belong_to(:work_item_type).class_name('WorkItems::Type') }
it { is_expected.to belong_to(:moved_to).class_name('Issue') }
it { is_expected.to have_one(:moved_from).class_name('Issue') }
@@ -132,6 +131,37 @@ RSpec.describe Issue do
create(:issue)
end
end
+
+ context 'issue namespace' do
+ let(:issue) { build(:issue, project: reusable_project) }
+
+ it 'sets the namespace_id' do
+ expect(issue).to be_valid
+ expect(issue.namespace).to eq(reusable_project.project_namespace)
+ end
+
+ context 'when issue is created' do
+ it 'sets the namespace_id' do
+ issue.save!
+
+ expect(issue.reload.namespace).to eq(reusable_project.project_namespace)
+ end
+ end
+
+ context 'when existing issue is saved' do
+ let(:issue) { create(:issue) }
+
+ before do
+ issue.update!(namespace_id: nil)
+ end
+
+ it 'sets the namespace id' do
+ issue.update!(title: "#{issue.title} and something extra")
+
+ expect(issue.namespace).to eq(issue.project.project_namespace)
+ end
+ end
+ end
end
context 'order by upvotes' do
@@ -651,28 +681,6 @@ RSpec.describe Issue do
end
end
- describe '#has_related_branch?' do
- let(:issue) { create(:issue, project: reusable_project, title: "Blue Bell Knoll") }
-
- subject { issue.has_related_branch? }
-
- context 'branch found' do
- before do
- allow(issue.project.repository).to receive(:branch_names).and_return(["iceblink-luck", issue.to_branch_name])
- end
-
- it { is_expected.to eq true }
- end
-
- context 'branch not found' do
- before do
- allow(issue.project.repository).to receive(:branch_names).and_return(["lazy-calm"])
- end
-
- it { is_expected.to eq false }
- end
- end
-
it_behaves_like 'an editable mentionable' do
subject { create(:issue, project: create(:project, :repository)) }
@@ -744,25 +752,11 @@ RSpec.describe Issue do
end
describe '#participants' do
- context 'using a public project' do
- let_it_be(:public_project) { create(:project, :public) }
- let_it_be(:issue) { create(:issue, project: public_project) }
+ it_behaves_like 'issuable participants' do
+ let_it_be(:issuable_parent) { create(:project, :public) }
+ let_it_be_with_refind(:issuable) { create(:issue, project: issuable_parent) }
- let!(:note1) do
- create(:note_on_issue, noteable: issue, project: public_project, note: 'a')
- end
-
- let!(:note2) do
- create(:note_on_issue, noteable: issue, project: public_project, note: 'b')
- end
-
- it 'includes the issue author' do
- expect(issue.participants).to include(issue.author)
- end
-
- it 'includes the authors of the notes' do
- expect(issue.participants).to include(note1.author, note2.author)
- end
+ let(:params) { { noteable: issuable, project: issuable_parent } }
end
context 'using a private project' do
diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb
index a9d1a8a5ef2..b98c0e8eae0 100644
--- a/spec/models/key_spec.rb
+++ b/spec/models/key_spec.rb
@@ -47,10 +47,9 @@ RSpec.describe Key, :mailer do
end
describe 'validation of banned keys' do
- let_it_be(:user) { create(:user) }
-
let(:key) { build(:key) }
- let(:banned_keys) do
+
+ where(:key_content) do
[
'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAwRIdDlHaIqZXND/l1vFT7ue3rc/DvXh2y' \
'x5EFtuxGQRHVxGMazDhV4vj5ANGXDQwUYI0iZh6aOVrDy8I/y9/y+YDGCvsnqrDbuPDjW' \
@@ -131,68 +130,13 @@ RSpec.describe Key, :mailer do
]
end
- context 'when ssh_banned_key feature flag is enabled with a user' do
- before do
- stub_feature_flags(ssh_banned_key: user)
- end
-
- where(:key_content) { banned_keys }
-
- with_them do
- it 'does not allow banned keys' do
- key.key = key_content
- key.user = user
-
- expect(key).to be_invalid
- expect(key.errors[:key]).to include(
- _('cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one.'))
- end
-
- it 'allows when the user is a ghost user' do
- key.key = key_content
- key.user = User.ghost
-
- expect(key).to be_valid
- end
-
- it 'allows when the user is nil' do
- key.key = key_content
- key.user = nil
-
- expect(key).to be_valid
- end
- end
-
- it 'allows other keys' do
- key.user = user
-
- expect(key).to be_valid
- end
-
- it 'allows other users' do
- key.user = User.ghost
-
- expect(key).to be_valid
- end
- end
-
- context 'when ssh_banned_key feature flag is disabled' do
- before do
- stub_feature_flags(ssh_banned_key: false)
- end
-
- where(:key_content) { banned_keys }
+ with_them do
+ it 'does not allow banned keys' do
+ key.key = key_content
- with_them do
- it 'allows banned keys' do
- key.key = key_content
-
- expect(key).to be_valid
- end
- end
-
- it 'allows other keys' do
- expect(key).to be_valid
+ expect(key).to be_invalid
+ expect(key.errors[:key]).to include(
+ _('cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one.'))
end
end
end
@@ -296,6 +240,39 @@ RSpec.describe Key, :mailer do
end
end
+ describe '#ensure_sha256_fingerprint!' do
+ let_it_be_with_reload(:user_key) { create(:personal_key) }
+
+ context 'with a valid SHA256 fingerprint' do
+ it 'does nothing' do
+ expect(user_key).not_to receive(:generate_fingerprint)
+
+ user_key.ensure_sha256_fingerprint!
+ end
+ end
+
+ context 'with a missing SHA256 fingerprint' do
+ before do
+ user_key.update_column(:fingerprint_sha256, nil)
+ user_key.ensure_sha256_fingerprint!
+ end
+
+ it 'fingerprints are present' do
+ expect(user_key.reload.fingerprint_sha256).to be_present
+ end
+ end
+
+ context 'with an invalid public key' do
+ before do
+ user_key.update_column(:key, 'a')
+ end
+
+ it 'does not throw an exception' do
+ expect { user_key.ensure_sha256_fingerprint! }.not_to raise_error
+ end
+ end
+ end
+
context 'fingerprint generation' do
it 'generates both md5 and sha256 fingerprints' do
key = build(:rsa_key_4096)
diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb
index f93c2d36966..94032146f51 100644
--- a/spec/models/members/group_member_spec.rb
+++ b/spec/models/members/group_member_spec.rb
@@ -219,7 +219,7 @@ RSpec.describe GroupMember do
end
context 'on create' do
- let(:action) { group.add_user(user, Gitlab::Access::GUEST) }
+ let(:action) { group.add_member(user, Gitlab::Access::GUEST) }
let(:blocking) { true }
it 'changes access level', :sidekiq_inline do
@@ -241,7 +241,7 @@ RSpec.describe GroupMember do
context 'on update' do
before do
- group.add_user(user, Gitlab::Access::GUEST)
+ group.add_member(user, Gitlab::Access::GUEST)
end
let(:action) { group.members.find_by(user: user).update!(access_level: Gitlab::Access::DEVELOPER) }
@@ -266,7 +266,7 @@ RSpec.describe GroupMember do
context 'on destroy' do
before do
- group.add_user(user, Gitlab::Access::GUEST)
+ group.add_member(user, Gitlab::Access::GUEST)
end
let(:action) { group.members.find_by(user: user).destroy! }
diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb
index 8c989f5aaca..39d9d25a98c 100644
--- a/spec/models/members/project_member_spec.rb
+++ b/spec/models/members/project_member_spec.rb
@@ -111,12 +111,12 @@ RSpec.describe ProjectMember do
end
end
- describe '.add_users_to_projects' do
+ describe '.add_members_to_projects' do
it 'adds the given users to the given projects' do
projects = create_list(:project, 2)
users = create_list(:user, 2)
- described_class.add_users_to_projects(
+ described_class.add_members_to_projects(
[projects.first.id, projects.second.id],
[users.first.id, users.second],
described_class::MAINTAINER)
@@ -174,8 +174,8 @@ RSpec.describe ProjectMember do
expect { project.destroy! }.to change { user.can?(:guest_access, project) }.from(true).to(false)
end
- it 'refreshes the authorization without calling AuthorizedProjectUpdate::ProjectRecalculatePerUserService' do
- expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserService).not_to receive(:new)
+ it 'refreshes the authorization without calling AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker).not_to receive(:bulk_perform_and_wait)
project.destroy!
end
@@ -199,7 +199,7 @@ RSpec.describe ProjectMember do
context 'when importing' do
it 'does not refresh' do
- expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserService).not_to receive(:new)
+ expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker).not_to receive(:bulk_perform_and_wait)
member = build(:project_member)
member.importing = true
@@ -212,11 +212,11 @@ RSpec.describe ProjectMember do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
- shared_examples_for 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService to recalculate authorizations' do
- it 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService' do
- expect_next_instance_of(AuthorizedProjectUpdate::ProjectRecalculatePerUserService, project, user) do |service|
- expect(service).to receive(:execute)
- end
+ shared_examples_for 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker inline to recalculate authorizations' do
+ it 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker).to receive(:bulk_perform_and_wait).with(
+ [[project.id, user.id]]
+ )
action
end
@@ -236,13 +236,13 @@ RSpec.describe ProjectMember do
end
context 'on create' do
- let(:action) { project.add_user(user, Gitlab::Access::GUEST) }
+ let(:action) { project.add_member(user, Gitlab::Access::GUEST) }
it 'changes access level' do
expect { action }.to change { user.can?(:guest_access, project) }.from(false).to(true)
end
- it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService to recalculate authorizations'
+ it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker inline to recalculate authorizations'
it_behaves_like 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations'
end
@@ -250,14 +250,14 @@ RSpec.describe ProjectMember do
let(:action) { project.members.find_by(user: user).update!(access_level: Gitlab::Access::DEVELOPER) }
before do
- project.add_user(user, Gitlab::Access::GUEST)
+ project.add_member(user, Gitlab::Access::GUEST)
end
it 'changes access level' do
expect { action }.to change { user.can?(:developer_access, project) }.from(false).to(true)
end
- it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService to recalculate authorizations'
+ it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker inline to recalculate authorizations'
it_behaves_like 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations'
end
@@ -265,7 +265,7 @@ RSpec.describe ProjectMember do
let(:action) { project.members.find_by(user: user).destroy! }
before do
- project.add_user(user, Gitlab::Access::GUEST)
+ project.add_member(user, Gitlab::Access::GUEST)
end
it 'changes access level', :sidekiq_inline do
diff --git a/spec/models/merge_request_diff_file_spec.rb b/spec/models/merge_request_diff_file_spec.rb
index c9bcb900eca..7dc550a6c93 100644
--- a/spec/models/merge_request_diff_file_spec.rb
+++ b/spec/models/merge_request_diff_file_spec.rb
@@ -13,50 +13,53 @@ RSpec.describe MergeRequestDiffFile do
let(:invalid_items_for_bulk_insertion) { [] } # class does not have any validations defined
end
+ let(:unpacked) { 'unpacked' }
+ let(:packed) { [unpacked].pack('m0') }
+ let(:file) { create(:merge_request).merge_request_diff.merge_request_diff_files.first }
+
describe '#diff' do
+ let(:file) { build(:merge_request_diff_file) }
+
context 'when diff is not stored' do
let(:unpacked) { 'unpacked' }
let(:packed) { [unpacked].pack('m0') }
before do
- subject.diff = packed
+ file.diff = packed
end
context 'when the diff is marked as binary' do
before do
- subject.binary = true
+ file.binary = true
end
it 'unpacks from base 64' do
- expect(subject.diff).to eq(unpacked)
+ expect(file.diff).to eq(unpacked)
end
context 'invalid base64' do
let(:packed) { '---/dev/null' }
it 'returns the raw diff' do
- expect(subject.diff).to eq(packed)
+ expect(file.diff).to eq(packed)
end
end
end
context 'when the diff is not marked as binary' do
it 'returns the raw diff' do
- expect(subject.diff).to eq(packed)
+ expect(file.diff).to eq(packed)
end
end
end
context 'when diff is stored in DB' do
- let(:file) { create(:merge_request).merge_request_diff.merge_request_diff_files.first }
-
it 'returns UTF-8 string' do
expect(file.diff.encoding).to eq Encoding::UTF_8
end
end
context 'when diff is stored in external storage' do
- let(:file) { create(:merge_request).merge_request_diff.merge_request_diff_files.first }
let(:test_dir) { 'tmp/tests/external-diffs' }
around do |example|
@@ -81,17 +84,141 @@ RSpec.describe MergeRequestDiffFile do
describe '#utf8_diff' do
it 'does not raise error when the diff is binary' do
- subject.diff = "\x05\x00\x68\x65\x6c\x6c\x6f"
+ file = build(:merge_request_diff_file)
+ file.diff = "\x05\x00\x68\x65\x6c\x6c\x6f"
- expect { subject.utf8_diff }.not_to raise_error
+ expect { file.utf8_diff }.not_to raise_error
end
it 'calls #diff once' do
- allow(subject).to receive(:diff).and_return('test')
+ allow(file).to receive(:diff).and_return('test')
+
+ expect(file).to receive(:diff).once
+
+ file.utf8_diff
+ end
+
+ context 'externally stored diff caching' do
+ let(:test_dir) { 'tmp/tests/external-diffs' }
+
+ around do |example|
+ FileUtils.mkdir_p(test_dir)
+
+ begin
+ example.run
+ ensure
+ FileUtils.rm_rf(test_dir)
+ end
+ end
+
+ before do
+ stub_external_diffs_setting(enabled: true, storage_path: test_dir)
+ end
+
+ context 'when external diff is not cached' do
+ it 'caches external diffs' do
+ expect(file.merge_request_diff).to receive(:cache_external_diff).and_call_original
+
+ expect(file.utf8_diff).to eq(file.diff)
+ end
+ end
+
+ context 'when external diff is already cached' do
+ it 'reads diff from cached external diff' do
+ file_stub = double
+
+ allow(file.merge_request_diff).to receive(:cached_external_diff).and_yield(file_stub)
+ expect(file_stub).to receive(:seek).with(file.external_diff_offset)
+ expect(file_stub).to receive(:read).with(file.external_diff_size)
+
+ file.utf8_diff
+ end
+ end
+
+ context 'when the diff is marked as binary' do
+ let(:file) { build(:merge_request_diff_file) }
- expect(subject).to receive(:diff).once
+ before do
+ allow(file.merge_request_diff).to receive(:stored_externally?).and_return(true)
+ allow(file.merge_request_diff).to receive(:cached_external_diff).and_return(packed)
+ end
- subject.utf8_diff
+ context 'when the diff is marked as binary' do
+ before do
+ file.binary = true
+ end
+
+ it 'unpacks from base 64' do
+ expect(file.utf8_diff).to eq(unpacked)
+ end
+
+ context 'invalid base64' do
+ let(:packed) { '---/dev/null' }
+
+ it 'returns the raw diff' do
+ expect(file.utf8_diff).to eq(packed)
+ end
+ end
+ end
+
+ context 'when the diff is not marked as binary' do
+ it 'returns the raw diff' do
+ expect(file.utf8_diff).to eq(packed)
+ end
+ end
+ end
+
+ context 'when content responds to #encoding' do
+ it 'encodes content to utf8 encoding' do
+ expect(file.utf8_diff.encoding).to eq(Encoding::UTF_8)
+ end
+ end
+
+ context 'when content is blank' do
+ it 'returns an empty string' do
+ allow(file.merge_request_diff).to receive(:cached_external_diff).and_return(nil)
+
+ expect(file.utf8_diff).to eq('')
+ end
+ end
+
+ context 'when exception is raised' do
+ it 'falls back to #diff' do
+ allow(file).to receive(:binary?).and_raise(StandardError, 'Error!')
+ expect(file).to receive(:diff)
+ expect(Gitlab::AppLogger)
+ .to receive(:warn)
+ .with(
+ a_hash_including(
+ :message => 'Cached external diff export failed',
+ :merge_request_diff_file_id => file.id,
+ :merge_request_diff_id => file.merge_request_diff.id,
+ 'exception.class' => 'StandardError',
+ 'exception.message' => 'Error!'
+ )
+ )
+
+ file.utf8_diff
+ end
+ end
+ end
+
+ context 'when externally_stored_diffs_caching_export feature flag is disabled' do
+ it 'calls #diff' do
+ stub_feature_flags(externally_stored_diffs_caching_export: false)
+
+ expect(file).to receive(:diff)
+
+ file.utf8_diff
+ end
+ end
+
+ context 'when diff is not stored externally' do
+ it 'calls #diff' do
+ expect(file).to receive(:diff)
+
+ file.utf8_diff
+ end
end
end
end
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index afe7251f59a..007e84164a8 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -1120,4 +1120,101 @@ RSpec.describe MergeRequestDiff do
expect(described_class.latest_diff_for_merge_requests(nil)).to be_empty
end
end
+
+ context 'external diff caching' do
+ let(:test_dir) { 'tmp/tests/external-diffs' }
+ let(:cache_dir) { File.join(Dir.tmpdir, "project-#{diff.project.id}-external-mr-#{diff.merge_request_id}-diff-#{diff.id}-cache") }
+ let(:cache_filepath) { File.join(cache_dir, "diff-#{diff.id}") }
+ let(:external_diff_content) { diff.opening_external_diff { |diff| diff.read } }
+
+ around do |example|
+ FileUtils.mkdir_p(test_dir)
+
+ begin
+ example.run
+ ensure
+ FileUtils.rm_rf(test_dir)
+ end
+ end
+
+ before do
+ stub_external_diffs_setting(enabled: true, storage_path: test_dir)
+ end
+
+ subject(:diff) { diff_with_commits }
+
+ describe '#cached_external_diff' do
+ context 'when diff is externally stored' do
+ context 'when diff is already cached' do
+ it 'yields cached file' do
+ Dir.mkdir(cache_dir)
+ File.open(cache_filepath, 'wb') { |f| f.write(external_diff_content) }
+
+ expect(diff).not_to receive(:cache_external_diff)
+
+ expect { |b| diff.cached_external_diff(&b) }.to yield_with_args(File)
+ end
+ end
+
+ context 'when diff is not cached' do
+ it 'caches external diff in tmp storage' do
+ expect(diff).to receive(:cache_external_diff).and_call_original
+ expect(File.exist?(cache_filepath)).to eq(false)
+ expect { |b| diff.cached_external_diff(&b) }.to yield_with_args(File)
+ expect(File.exist?(cache_filepath)).to eq(true)
+ expect(File.read(cache_filepath)).to eq(external_diff_content)
+ end
+ end
+ end
+
+ context 'when diff is not externally stored' do
+ it 'yields nil' do
+ stub_external_diffs_setting(enabled: false)
+
+ expect { |b| diff.cached_external_diff(&b) }.to yield_with_args(nil)
+ end
+ end
+ end
+
+ describe '#remove_cached_external_diff' do
+ before do
+ diff.cached_external_diff { |diff| diff }
+ end
+
+ it 'removes external diff cache diff' do
+ expect(Dir.exist?(cache_dir)).to eq(true)
+
+ diff.remove_cached_external_diff
+
+ expect(Dir.exist?(cache_dir)).to eq(false)
+ end
+
+ context 'when path is traversed' do
+ it 'raises' do
+ allow(diff).to receive(:external_diff_cache_dir).and_return(File.join(cache_dir, '..'))
+
+ expect { diff.remove_cached_external_diff }.to raise_error(Gitlab::Utils::PathTraversalAttackError, 'Invalid path')
+ end
+ end
+
+ context 'when path is not allowed' do
+ it 'raises' do
+ allow(diff).to receive(:external_diff_cache_dir).and_return('/')
+
+ expect { diff.remove_cached_external_diff }.to raise_error(StandardError, 'path / is not allowed')
+ end
+ end
+
+ context 'when dir does not exist' do
+ it 'returns' do
+ FileUtils.rm_rf(cache_dir)
+
+ expect(Dir.exist?(cache_dir)).to eq(false)
+ expect(FileUtils).not_to receive(:rm_rf).with(cache_dir)
+
+ diff.remove_cached_external_diff
+ end
+ end
+ end
+ end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 381eccf2376..c3e325c4e6c 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -658,7 +658,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
before do
- project.add_user(user, :developer)
+ project.add_member(user, :developer)
end
describe '.total_time_to_merge' do
@@ -4286,6 +4286,18 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
+ describe 'transition to closed' do
+ context 'with merge error' do
+ subject { create(:merge_request, merge_error: 'merge error') }
+
+ it 'clears merge error' do
+ subject.close!
+
+ expect(subject.reload.merge_error).to eq(nil)
+ end
+ end
+ end
+
describe 'transition to cannot_be_merged' do
let(:notification_service) { double(:notification_service) }
let(:todo_service) { double(:todo_service) }
@@ -4903,7 +4915,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
.to delegate_method(:builds_with_coverage)
.to(:head_pipeline)
.with_prefix
- .with_arguments(allow_nil: true)
+ .allow_nil
end
end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 96e06e617d5..664cdb27290 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -32,6 +32,7 @@ RSpec.describe Namespace do
it { is_expected.to have_one :namespace_route }
it { is_expected.to have_many :namespace_members }
it { is_expected.to have_one :cluster_enabled_grant }
+ it { is_expected.to have_many(:work_items) }
it do
is_expected.to have_one(:ci_cd_settings).class_name('NamespaceCiCdSetting').inverse_of(:namespace).autosave(true)
@@ -337,16 +338,13 @@ RSpec.describe Namespace do
end
describe 'delegate' do
- it { is_expected.to delegate_method(:name).to(:owner).with_prefix.with_arguments(allow_nil: true) }
- it { is_expected.to delegate_method(:avatar_url).to(:owner).with_arguments(allow_nil: true) }
- it do
- is_expected.to delegate_method(:prevent_sharing_groups_outside_hierarchy)
- .to(:namespace_settings).with_arguments(allow_nil: true)
- end
+ it { is_expected.to delegate_method(:name).to(:owner).with_prefix.allow_nil }
+ it { is_expected.to delegate_method(:avatar_url).to(:owner).allow_nil }
+ it { is_expected.to delegate_method(:prevent_sharing_groups_outside_hierarchy).to(:namespace_settings).allow_nil }
it do
- is_expected.to delegate_method(:prevent_sharing_groups_outside_hierarchy=)
- .to(:namespace_settings).with_arguments(allow_nil: true)
+ is_expected.to delegate_method(:prevent_sharing_groups_outside_hierarchy=).to(:namespace_settings)
+ .with_arguments(:args).allow_nil
end
end
@@ -1886,17 +1884,39 @@ RSpec.describe Namespace do
end
end
+ describe '#emails_enabled?' do
+ it "is the opposite of emails_disabled" do
+ group = create(:group, emails_disabled: false)
+
+ expect(group.emails_enabled?).to be_truthy
+ end
+ end
+
describe '#pages_virtual_domain' do
let(:project) { create(:project, namespace: namespace) }
+ let(:virtual_domain) { namespace.pages_virtual_domain }
- it 'returns the virual domain' do
+ before do
project.mark_pages_as_deployed
project.update_pages_deployment!(create(:pages_deployment, project: project))
+ end
- virtual_domain = namespace.pages_virtual_domain
-
+ it 'returns the virual domain' do
expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain)
expect(virtual_domain.lookup_paths).not_to be_empty
+ expect(virtual_domain.cache_key).to eq("pages_domain_for_namespace_#{namespace.root_ancestor.id}")
+ end
+
+ context 'when :cache_pages_domain_api is disabled' do
+ before do
+ stub_feature_flags(cache_pages_domain_api: false)
+ end
+
+ it 'returns the virual domain' do
+ expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain)
+ expect(virtual_domain.lookup_paths).not_to be_empty
+ expect(virtual_domain.cache_key).to be_nil
+ end
end
end
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index 4b262c1f3a9..fc6f7832c2c 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -106,6 +106,22 @@ RSpec.describe Note do
end
end
+ describe 'created_at in the past' do
+ let_it_be(:noteable) { create(:issue) }
+
+ context 'when creating a note not too much in the past' do
+ subject { build(:note, project: noteable.project, noteable: noteable, created_at: '1990-05-06') }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when creating a note too much in the past' do
+ subject { build(:note, project: noteable.project, noteable: noteable, created_at: '1600-05-06') }
+
+ it { is_expected.not_to be_valid }
+ end
+ end
+
describe 'confidentiality' do
context 'for existing public note' do
let_it_be(:existing_note) { create(:note) }
diff --git a/spec/models/oauth_access_token_spec.rb b/spec/models/oauth_access_token_spec.rb
index 65a7f6410cf..2b47da1ebe1 100644
--- a/spec/models/oauth_access_token_spec.rb
+++ b/spec/models/oauth_access_token_spec.rb
@@ -7,22 +7,40 @@ RSpec.describe OauthAccessToken do
let(:app_one) { create(:oauth_application) }
let(:app_two) { create(:oauth_application) }
let(:app_three) { create(:oauth_application) }
- let(:tokens) { described_class.all }
+ let(:token) { create(:oauth_access_token, application_id: app_one.id) }
- before do
- create(:oauth_access_token, application_id: app_one.id)
- create_list(:oauth_access_token, 2, resource_owner: user, application_id: app_two.id)
- end
+ describe 'scopes' do
+ describe '.distinct_resource_owner_counts' do
+ let(:tokens) { described_class.all }
+
+ before do
+ token
+ create_list(:oauth_access_token, 2, resource_owner: user, application_id: app_two.id)
+ end
+
+ it 'returns unique owners' do
+ expect(tokens.count).to eq(3)
+ expect(tokens.distinct_resource_owner_counts([app_one])).to eq({ app_one.id => 1 })
+ expect(tokens.distinct_resource_owner_counts([app_two])).to eq({ app_two.id => 1 })
+ expect(tokens.distinct_resource_owner_counts([app_three])).to eq({})
+ expect(tokens.distinct_resource_owner_counts([app_one, app_two]))
+ .to eq({
+ app_one.id => 1,
+ app_two.id => 1
+ })
+ end
+ end
+
+ describe '.latest_per_application' do
+ let!(:app_two_token1) { create(:oauth_access_token, application: app_two) }
+ let!(:app_two_token2) { create(:oauth_access_token, application: app_two) }
+ let!(:app_three_token1) { create(:oauth_access_token, application: app_three) }
+ let!(:app_three_token2) { create(:oauth_access_token, application: app_three) }
- it 'returns unique owners' do
- expect(tokens.count).to eq(3)
- expect(tokens.distinct_resource_owner_counts([app_one])).to eq({ app_one.id => 1 })
- expect(tokens.distinct_resource_owner_counts([app_two])).to eq({ app_two.id => 1 })
- expect(tokens.distinct_resource_owner_counts([app_three])).to eq({})
- expect(tokens.distinct_resource_owner_counts([app_one, app_two]))
- .to eq({
- app_one.id => 1,
- app_two.id => 1
- })
+ it 'returns only the latest token for each application' do
+ expect(described_class.latest_per_application.map(&:id))
+ .to match_array([app_two_token2.id, app_three_token2.id])
+ end
+ end
end
end
diff --git a/spec/models/operations/feature_flags_client_spec.rb b/spec/models/operations/feature_flags_client_spec.rb
index 05988d676f3..2ed3222c65c 100644
--- a/spec/models/operations/feature_flags_client_spec.rb
+++ b/spec/models/operations/feature_flags_client_spec.rb
@@ -3,7 +3,15 @@
require 'spec_helper'
RSpec.describe Operations::FeatureFlagsClient do
- subject { create(:operations_feature_flags_client) }
+ let_it_be(:project) { create(:project) }
+
+ let!(:client) { create(:operations_feature_flags_client, project: project) }
+
+ subject { client }
+
+ before do
+ client.unleash_app_name = 'production'
+ end
describe 'associations' do
it { is_expected.to belong_to(:project) }
@@ -18,4 +26,64 @@ RSpec.describe Operations::FeatureFlagsClient do
expect(subject.token).not_to be_empty
end
end
+
+ describe '.update_last_feature_flag_updated_at!' do
+ subject { described_class.update_last_feature_flag_updated_at!(project) }
+
+ it 'updates the last_feature_flag_updated_at of the project client' do
+ freeze_time do
+ expect { subject }.to change { client.reload.last_feature_flag_updated_at }.from(nil).to(Time.current)
+ end
+ end
+ end
+
+ describe '#unleash_api_version' do
+ subject { client.unleash_api_version }
+
+ it { is_expected.to eq(described_class::DEFAULT_UNLEASH_API_VERSION) }
+ end
+
+ describe '#unleash_api_features' do
+ subject { client.unleash_api_features }
+
+ it 'fetches' do
+ expect(Operations::FeatureFlag).to receive(:for_unleash_client).with(project, 'production').once
+
+ subject
+ end
+
+ context 'when unleash app name is not set' do
+ before do
+ client.unleash_app_name = nil
+ end
+
+ it 'does not fetch' do
+ expect(Operations::FeatureFlag).not_to receive(:for_unleash_client)
+
+ subject
+ end
+ end
+ end
+
+ describe '#unleash_api_cache_key' do
+ subject { client.unleash_api_cache_key }
+
+ it 'constructs the cache key' do
+ is_expected.to eq("api_version:#{client.unleash_api_version}"\
+ ":app_name:#{client.unleash_app_name}"\
+ ":updated_at:#{client.last_feature_flag_updated_at.to_i}")
+ end
+
+ context 'when unleash app name is not set' do
+ before do
+ client.unleash_app_name = nil
+ end
+
+ it 'constructs the cache key without unleash app name' do
+ is_expected.to eq("api_version:#{client.unleash_api_version}"\
+ ":app_name:"\
+ ":updated_at:#{client.last_feature_flag_updated_at.to_i}")
+ end
+ end
+ end
end
diff --git a/spec/models/packages/cleanup/policy_spec.rb b/spec/models/packages/cleanup/policy_spec.rb
index c08ae4aa7e7..a37042520e7 100644
--- a/spec/models/packages/cleanup/policy_spec.rb
+++ b/spec/models/packages/cleanup/policy_spec.rb
@@ -25,4 +25,40 @@ RSpec.describe Packages::Cleanup::Policy, type: :model do
it { is_expected.to contain_exactly(active_policy) }
end
+
+ describe '.with_packages' do
+ let_it_be(:policy_with_packages) { create(:packages_cleanup_policy) }
+ let_it_be(:policy_without_packages) { create(:packages_cleanup_policy) }
+ let_it_be(:package) { create(:package, project: policy_with_packages.project) }
+
+ subject { described_class.with_packages }
+
+ it { is_expected.to contain_exactly(policy_with_packages) }
+ end
+
+ describe '.runnable' do
+ let_it_be(:runnable_policy_with_packages) { create(:packages_cleanup_policy, :runnable) }
+ let_it_be(:runnable_policy_without_packages) { create(:packages_cleanup_policy, :runnable) }
+ let_it_be(:non_runnable_policy_with_packages) { create(:packages_cleanup_policy) }
+ let_it_be(:non_runnable_policy_without_packages) { create(:packages_cleanup_policy) }
+
+ let_it_be(:package1) { create(:package, project: runnable_policy_with_packages.project) }
+ let_it_be(:package2) { create(:package, project: non_runnable_policy_with_packages.project) }
+
+ subject { described_class.runnable }
+
+ it { is_expected.to contain_exactly(runnable_policy_with_packages) }
+ end
+
+ describe '#keep_n_duplicated_package_files_disabled?' do
+ subject { policy.keep_n_duplicated_package_files_disabled? }
+
+ %w[all 1].each do |value|
+ context "with value set to #{value}" do
+ let(:policy) { build(:packages_cleanup_policy, keep_n_duplicated_package_files: value) }
+
+ it { is_expected.to eq(value == 'all') }
+ end
+ end
+ end
end
diff --git a/spec/models/packages/debian/file_entry_spec.rb b/spec/models/packages/debian/file_entry_spec.rb
index e981adf69bc..ed6372f2873 100644
--- a/spec/models/packages/debian/file_entry_spec.rb
+++ b/spec/models/packages/debian/file_entry_spec.rb
@@ -31,6 +31,13 @@ RSpec.describe Packages::Debian::FileEntry, type: :model do
describe 'validations' do
it { is_expected.to be_valid }
+ context 'with FIPS mode', :fips_mode do
+ it 'raises an error' do
+ expect { subject.validate! }
+ .to raise_error(::Packages::FIPS::DisabledError, 'Debian registry is not FIPS compliant')
+ end
+ end
+
describe '#filename' do
it { is_expected.to validate_presence_of(:filename) }
it { is_expected.not_to allow_value('Hé').for(:filename) }
diff --git a/spec/models/pages/virtual_domain_spec.rb b/spec/models/pages/virtual_domain_spec.rb
index 29c14cbeb3e..b5a421295b2 100644
--- a/spec/models/pages/virtual_domain_spec.rb
+++ b/spec/models/pages/virtual_domain_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Pages::VirtualDomain do
let(:domain) { nil }
let(:project) { instance_double(Project) }
- subject(:virtual_domain) { described_class.new([project], domain: domain) }
+ subject(:virtual_domain) { described_class.new(projects: [project], domain: domain) }
it 'returns nil if there is no domain provided' do
expect(virtual_domain.certificate).to be_nil
@@ -35,7 +35,7 @@ RSpec.describe Pages::VirtualDomain do
context 'when there is pages domain provided' do
let(:domain) { instance_double(PagesDomain) }
- subject(:virtual_domain) { described_class.new([project_a, project_b, project_c], domain: domain) }
+ subject(:virtual_domain) { described_class.new(projects: [project_a, project_b, project_c], domain: domain) }
it 'returns collection of projects pages lookup paths sorted by prefix in reverse' do
expect(project_a).to receive(:pages_lookup_path).with(domain: domain, trim_prefix: nil).and_return(pages_lookup_path_a)
@@ -47,7 +47,7 @@ RSpec.describe Pages::VirtualDomain do
end
context 'when there is trim_prefix provided' do
- subject(:virtual_domain) { described_class.new([project_a, project_b], trim_prefix: 'group/') }
+ subject(:virtual_domain) { described_class.new(projects: [project_a, project_b], trim_prefix: 'group/') }
it 'returns collection of projects pages lookup paths sorted by prefix in reverse' do
expect(project_a).to receive(:pages_lookup_path).with(trim_prefix: 'group/', domain: nil).and_return(pages_lookup_path_a)
@@ -57,4 +57,19 @@ RSpec.describe Pages::VirtualDomain do
end
end
end
+
+ describe '#cache_key' do
+ it 'returns the cache key based in the given cache_control' do
+ cache_control = instance_double(::Gitlab::Pages::CacheControl, cache_key: 'cache_key')
+ virtual_domain = described_class.new(projects: [instance_double(Project)], cache: cache_control)
+
+ expect(virtual_domain.cache_key).to eq('cache_key')
+ end
+
+ it 'returns nil when no cache_control is given' do
+ virtual_domain = described_class.new(projects: [instance_double(Project)])
+
+ expect(virtual_domain.cache_key).to be_nil
+ end
+ end
end
diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb
index 7fde8d63947..4e463b1194c 100644
--- a/spec/models/pages_domain_spec.rb
+++ b/spec/models/pages_domain_spec.rb
@@ -544,16 +544,31 @@ RSpec.describe PagesDomain do
end
end
- it 'returns the virual domain when there are pages deployed for the project' do
- project.mark_pages_as_deployed
- project.update_pages_deployment!(create(:pages_deployment, project: project))
+ context 'when there are pages deployed for the project' do
+ let(:virtual_domain) { pages_domain.pages_virtual_domain }
- expect(Pages::VirtualDomain).to receive(:new).with([project], domain: pages_domain).and_call_original
+ before do
+ project.mark_pages_as_deployed
+ project.update_pages_deployment!(create(:pages_deployment, project: project))
+ end
+
+ it 'returns the virual domain when there are pages deployed for the project' do
+ expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain)
+ expect(virtual_domain.lookup_paths).not_to be_empty
+ expect(virtual_domain.cache_key).to eq("pages_domain_for_project_#{project.id}")
+ end
- virtual_domain = pages_domain.pages_virtual_domain
+ context 'when :cache_pages_domain_api is disabled' do
+ before do
+ stub_feature_flags(cache_pages_domain_api: false)
+ end
- expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain)
- expect(virtual_domain.lookup_paths).not_to be_empty
+ it 'returns the virual domain when there are pages deployed for the project' do
+ expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain)
+ expect(virtual_domain.lookup_paths).not_to be_empty
+ expect(virtual_domain.cache_key).to be_nil
+ end
+ end
end
end
diff --git a/spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb b/spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb
index 7d4268f74e9..7411bc95147 100644
--- a/spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb
+++ b/spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb
@@ -23,7 +23,8 @@ RSpec.describe Preloaders::UserMaxAccessLevelInProjectsPreloader do
# we have an existing N+1, one for each project for which user is not a member
# in this spec, project_3, project_4, project_5
# https://gitlab.com/gitlab-org/gitlab/-/issues/362890
- expect { query }.to make_queries(projects.size + 3)
+ ee_only_policy_check_queries = Gitlab.ee? ? 1 : 0
+ expect { query }.to make_queries(projects.size + 3 + ee_only_policy_check_queries)
end
end
diff --git a/spec/models/project_export_job_spec.rb b/spec/models/project_export_job_spec.rb
index 5a2b1443f8b..653d4d2df27 100644
--- a/spec/models/project_export_job_spec.rb
+++ b/spec/models/project_export_job_spec.rb
@@ -3,17 +3,14 @@
require 'spec_helper'
RSpec.describe ProjectExportJob, type: :model do
- let(:project) { create(:project) }
- let!(:job1) { create(:project_export_job, project: project, status: 0) }
- let!(:job2) { create(:project_export_job, project: project, status: 2) }
-
describe 'associations' do
- it { expect(job1).to belong_to(:project) }
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to have_many(:relation_exports) }
end
describe 'validations' do
- it { expect(job1).to validate_presence_of(:project) }
- it { expect(job1).to validate_presence_of(:jid) }
- it { expect(job1).to validate_presence_of(:status) }
+ it { is_expected.to validate_presence_of(:project) }
+ it { is_expected.to validate_presence_of(:jid) }
+ it { is_expected.to validate_presence_of(:status) }
end
end
diff --git a/spec/models/project_import_state_spec.rb b/spec/models/project_import_state_spec.rb
index f6e398bd23c..db79185d759 100644
--- a/spec/models/project_import_state_spec.rb
+++ b/spec/models/project_import_state_spec.rb
@@ -156,7 +156,7 @@ RSpec.describe ProjectImportState, type: :model do
project.import_state.finish
end
- it 'does not qneueue housekeeping when project does not have a valid import type' do
+ it 'does not enqueue housekeeping when project does not have a valid import type' do
project = create(:project, :import_started, import_type: nil)
expect(Projects::AfterImportWorker).not_to receive(:perform_async)
@@ -164,6 +164,43 @@ RSpec.describe ProjectImportState, type: :model do
project.import_state.finish
end
end
+
+ context 'state transition: [:none, :scheduled, :started] => [:canceled]' do
+ it 'updates the import status' do
+ import_state = create(:import_state, :none)
+ expect { import_state.cancel }
+ .to change { import_state.status }
+ .from('none').to('canceled')
+ end
+
+ it 'unsets the JID' do
+ import_state = create(:import_state, :started, jid: '123')
+
+ expect(Gitlab::SidekiqStatus)
+ .to receive(:unset)
+ .with('123')
+ .and_call_original
+
+ import_state.cancel!
+
+ expect(import_state.jid).to be_nil
+ end
+
+ it 'removes import data' do
+ import_data = ProjectImportData.new(data: { 'test' => 'some data' })
+ project = create(:project, :import_scheduled, import_data: import_data)
+
+ expect(project)
+ .to receive(:remove_import_data)
+ .and_call_original
+
+ expect do
+ project.import_state.cancel
+ project.reload
+ end.to change { project.import_data }
+ .from(import_data).to(nil)
+ end
+ end
end
describe 'clearing `jid` after finish', :clean_gitlab_redis_cache do
@@ -178,7 +215,7 @@ RSpec.describe ProjectImportState, type: :model do
end
end
- context 'with an JID' do
+ context 'with a JID' do
it 'unsets the JID' do
import_state = create(:import_state, :started, jid: '123')
diff --git a/spec/models/project_setting_spec.rb b/spec/models/project_setting_spec.rb
index 867ad843406..fb1601a5f9c 100644
--- a/spec/models/project_setting_spec.rb
+++ b/spec/models/project_setting_spec.rb
@@ -6,6 +6,17 @@ RSpec.describe ProjectSetting, type: :model do
using RSpec::Parameterized::TableSyntax
it { is_expected.to belong_to(:project) }
+ describe 'scopes' do
+ let_it_be(:project_1) { create(:project) }
+ let_it_be(:project_2) { create(:project) }
+ let_it_be(:project_setting_1) { create(:project_setting, project: project_1) }
+ let_it_be(:project_setting_2) { create(:project_setting, project: project_2) }
+
+ it 'returns project setting for the given projects' do
+ expect(described_class.for_projects(project_1)).to contain_exactly(project_setting_1)
+ end
+ end
+
describe 'validations' do
it { is_expected.not_to allow_value(nil).for(:target_platforms) }
it { is_expected.to allow_value([]).for(:target_platforms) }
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 2d84c1b843e..2171ee752fd 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -27,6 +27,7 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_many(:merge_requests) }
it { is_expected.to have_many(:merge_request_metrics).class_name('MergeRequest::Metrics') }
it { is_expected.to have_many(:issues) }
+ it { is_expected.to have_many(:incident_management_issuable_escalation_statuses).through(:issues).inverse_of(:project).class_name('IncidentManagement::IssuableEscalationStatus') }
it { is_expected.to have_many(:milestones) }
it { is_expected.to have_many(:iterations) }
it { is_expected.to have_many(:project_members).dependent(:delete_all) }
@@ -81,7 +82,6 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_one(:last_event).class_name('Event') }
it { is_expected.to have_one(:forked_from_project).through(:fork_network_member) }
it { is_expected.to have_one(:auto_devops).class_name('ProjectAutoDevops') }
- it { is_expected.to have_one(:tracing_setting).class_name('ProjectTracingSetting') }
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') }
@@ -821,31 +821,38 @@ RSpec.describe Project, factory_default: :keep do
end
describe 'delegation' do
- [:add_guest, :add_reporter, :add_developer, :add_maintainer, :add_user, :add_users].each do |method|
+ [:add_guest, :add_reporter, :add_developer, :add_maintainer, :add_member, :add_members].each do |method|
it { is_expected.to delegate_method(method).to(:team) }
end
it { is_expected.to delegate_method(:members).to(:team).with_prefix(true) }
- it { is_expected.to delegate_method(:name).to(:owner).with_prefix(true).with_arguments(allow_nil: true) }
- it { is_expected.to delegate_method(:root_ancestor).to(:namespace).with_arguments(allow_nil: true) }
- it { is_expected.to delegate_method(:certificate_based_clusters_enabled?).to(:namespace).with_arguments(allow_nil: true) }
- it { is_expected.to delegate_method(:last_pipeline).to(:commit).with_arguments(allow_nil: true) }
+ it { is_expected.to delegate_method(:name).to(:owner).with_prefix(true).allow_nil }
+ it { is_expected.to delegate_method(:root_ancestor).to(:namespace).allow_nil }
+ it { is_expected.to delegate_method(:certificate_based_clusters_enabled?).to(:namespace).allow_nil }
+ it { is_expected.to delegate_method(:last_pipeline).to(:commit).allow_nil }
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) }
- describe 'project settings' do
+ describe 'read project settings' do
%i(
show_default_award_emojis
- show_default_award_emojis=
show_default_award_emojis?
warn_about_potentially_unwanted_characters
- warn_about_potentially_unwanted_characters=
warn_about_potentially_unwanted_characters?
enforce_auth_checks_on_uploads
- enforce_auth_checks_on_uploads=
enforce_auth_checks_on_uploads?
).each do |method|
- it { is_expected.to delegate_method(method).to(:project_setting).with_arguments(allow_nil: true) }
+ it { is_expected.to delegate_method(method).to(:project_setting).allow_nil }
+ end
+ end
+
+ describe 'write project settings' do
+ %i(
+ show_default_award_emojis=
+ warn_about_potentially_unwanted_characters=
+ enforce_auth_checks_on_uploads=
+ ).each do |method|
+ it { is_expected.to delegate_method(method).to(:project_setting).with_arguments(:args).allow_nil }
end
end
@@ -1855,7 +1862,7 @@ RSpec.describe Project, factory_default: :keep do
describe 'when a user has access to a project' do
before do
- project.add_user(user, Gitlab::Access::MAINTAINER)
+ project.add_member(user, Gitlab::Access::MAINTAINER)
end
it { is_expected.to eq([project]) }
@@ -3588,6 +3595,14 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#emails_enabled?' do
+ let(:project) { build(:project, emails_disabled: false) }
+
+ it "is the opposite of emails_disabled" do
+ expect(project.emails_enabled?).to be_truthy
+ end
+ end
+
describe '#lfs_enabled?' do
let(:namespace) { create(:namespace) }
let(:project) { build(:project, namespace: namespace) }
@@ -8383,6 +8398,27 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#group_group_links' do
+ context 'with group project' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+
+ it 'returns group links of group' do
+ expect(group).to receive_message_chain(:shared_with_group_links, :of_ancestors_and_self)
+
+ project.group_group_links
+ end
+ end
+
+ context 'with personal project' do
+ let_it_be(:project) { create(:project) }
+
+ it 'returns none' do
+ expect(project.group_group_links).to eq(GroupGroupLink.none)
+ end
+ end
+ end
+
describe '#security_training_available?' do
subject { build(:project) }
diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb
index 2ddbab7779e..1fab07c1452 100644
--- a/spec/models/project_team_spec.rb
+++ b/spec/models/project_team_spec.rb
@@ -251,13 +251,13 @@ RSpec.describe ProjectTeam do
end
end
- describe '#add_users' do
+ describe '#add_members' do
let(:user1) { create(:user) }
let(:user2) { create(:user) }
let(:project) { create(:project) }
it 'add the given users to the team' do
- project.team.add_users([user1, user2], :reporter)
+ project.team.add_members([user1, user2], :reporter)
expect(project.team.reporter?(user1)).to be(true)
expect(project.team.reporter?(user2)).to be(true)
@@ -265,7 +265,7 @@ RSpec.describe ProjectTeam do
context 'when `tasks_to_be_done` and `tasks_project_id` are passed' do
before do
- project.team.add_users([user1], :developer, tasks_to_be_done: %w(ci code), tasks_project_id: project.id)
+ project.team.add_members([user1], :developer, tasks_to_be_done: %w(ci code), tasks_project_id: project.id)
end
it 'creates a member_task with the correct attributes', :aggregate_failures do
@@ -277,12 +277,12 @@ RSpec.describe ProjectTeam do
end
end
- describe '#add_user' do
+ describe '#add_member' do
let(:user) { create(:user) }
let(:project) { create(:project) }
it 'add the given user to the team' do
- project.team.add_user(user, :reporter)
+ project.team.add_member(user, :reporter)
expect(project.team.reporter?(user)).to be(true)
end
diff --git a/spec/models/project_tracing_setting_spec.rb b/spec/models/project_tracing_setting_spec.rb
deleted file mode 100644
index a7e4e557b25..00000000000
--- a/spec/models/project_tracing_setting_spec.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ProjectTracingSetting do
- describe '#external_url' do
- let_it_be(:project) { create(:project) }
-
- let(:tracing_setting) { project.build_tracing_setting }
-
- describe 'Validations' do
- describe 'external_url' do
- it 'accepts a valid url' do
- tracing_setting.external_url = 'https://gitlab.com'
-
- expect(tracing_setting).to be_valid
- end
-
- it 'fails with an invalid url' do
- tracing_setting.external_url = 'gitlab.com'
-
- expect(tracing_setting).to be_invalid
- end
-
- it 'fails with a blank string' do
- tracing_setting.external_url = nil
-
- expect(tracing_setting).to be_invalid
- end
-
- it 'sanitizes the url' do
- tracing_setting.external_url = %{https://replaceme.com/'><script>alert(document.cookie)</script>}
-
- expect(tracing_setting).to be_valid
- expect(tracing_setting.external_url).to eq(%{https://replaceme.com/'&gt;})
- end
- end
- end
- end
-end
diff --git a/spec/models/projects/import_export/relation_export_spec.rb b/spec/models/projects/import_export/relation_export_spec.rb
new file mode 100644
index 00000000000..c74ca82e161
--- /dev/null
+++ b/spec/models/projects/import_export/relation_export_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ImportExport::RelationExport, type: :model do
+ subject { create(:project_relation_export) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:project_export_job) }
+ it { is_expected.to have_one(:upload) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:project_export_job) }
+ it { is_expected.to validate_presence_of(:relation) }
+ it { is_expected.to validate_uniqueness_of(:relation).scoped_to(:project_export_job_id) }
+ it { is_expected.to validate_presence_of(:status) }
+ it { is_expected.to validate_numericality_of(:status).only_integer }
+ it { is_expected.to validate_length_of(:relation).is_at_most(255) }
+ it { is_expected.to validate_length_of(:jid).is_at_most(255) }
+ it { is_expected.to validate_length_of(:export_error).is_at_most(300) }
+ end
+end
diff --git a/spec/models/projects/import_export/relation_export_upload_spec.rb b/spec/models/projects/import_export/relation_export_upload_spec.rb
new file mode 100644
index 00000000000..c0014c5a14c
--- /dev/null
+++ b/spec/models/projects/import_export/relation_export_upload_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ImportExport::RelationExportUpload, type: :model do
+ subject { described_class.new(relation_export: project_relation_export) }
+
+ let_it_be(:project_relation_export) { create(:project_relation_export) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:relation_export) }
+ end
+
+ it 'stores export file' do
+ stub_uploads_object_storage(ImportExportUploader, enabled: false)
+
+ filename = 'labels.tar.gz'
+ subject.export_file = fixture_file_upload("spec/fixtures/gitlab/import_export/#{filename}")
+
+ subject.save!
+
+ url = "/uploads/-/system/projects/import_export/relation_export_upload/export_file/#{subject.id}/#{filename}"
+ expect(subject.export_file.url).to eq(url)
+ end
+end
diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb
index 366de809bed..a3fc09b31fb 100644
--- a/spec/models/protected_branch_spec.rb
+++ b/spec/models/protected_branch_spec.rb
@@ -190,6 +190,14 @@ RSpec.describe ProtectedBranch do
expect(described_class).not_to receive(:matching)
expect(described_class.protected?(project, protected_branch.name)).to eq(true)
end
+
+ it 'sets expires_in for a cache key' do
+ cache_key = described_class.protected_ref_cache_key(project, protected_branch.name)
+
+ expect(Rails.cache).to receive(:fetch).with(cache_key, expires_in: 1.hour)
+
+ described_class.protected?(project, protected_branch.name)
+ end
end
end
diff --git a/spec/models/remote_mirror_spec.rb b/spec/models/remote_mirror_spec.rb
index d2d7859e726..51351c9fdd1 100644
--- a/spec/models/remote_mirror_spec.rb
+++ b/spec/models/remote_mirror_spec.rb
@@ -5,6 +5,10 @@ require 'spec_helper'
RSpec.describe RemoteMirror, :mailer do
include GitHelpers
+ before do
+ stub_feature_flags(remote_mirror_no_delay: false)
+ end
+
describe 'URL validation' do
context 'with a valid URL' do
it 'is valid' do
@@ -343,6 +347,20 @@ RSpec.describe RemoteMirror, :mailer do
remote_mirror.sync
end
+
+ context 'when remote_mirror_no_delay is enabled' do
+ before do
+ stub_feature_flags(remote_mirror_no_delay: true)
+ end
+
+ it 'schedules a RepositoryUpdateRemoteMirrorWorker to run now' do
+ remote_mirror.last_update_started_at = Time.current - 30.seconds
+
+ expect(RepositoryUpdateRemoteMirrorWorker).to receive(:perform_async).with(remote_mirror.id, Time.current)
+
+ remote_mirror.sync
+ end
+ end
end
end
end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index e1d903a40cf..11323c40d28 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -125,11 +125,11 @@ RSpec.describe Repository do
let(:latest_tag) { 'v0.0.0' }
before do
- rugged_repo(repository).tags.create(latest_tag, repository.commit.id)
+ repository.add_tag(user, latest_tag, repository.commit.id)
end
after do
- rugged_repo(repository).tags.delete(latest_tag)
+ repository.rm_tag(user, latest_tag)
end
context 'desc' do
@@ -150,16 +150,13 @@ RSpec.describe Repository do
subject { repository.tags_sorted_by('updated_asc').map(&:name) & (tags_to_compare + [annotated_tag_name]) }
before do
- options = { message: 'test tag message\n',
- tagger: { name: 'John Smith', email: 'john@gmail.com' } }
-
- rugged_repo(repository).tags.create(annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', **options)
+ repository.add_tag(user, annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', 'test tag message\n')
end
it { is_expected.to eq(['v1.0.0', 'v1.1.0', annotated_tag_name]) }
after do
- rugged_repo(repository).tags.delete(annotated_tag_name)
+ repository.rm_tag(user, annotated_tag_name)
end
end
end
@@ -258,21 +255,10 @@ RSpec.describe Repository do
end
context 'with a commit with invalid UTF-8 path' do
- def create_commit_with_invalid_utf8_path
- rugged = rugged_repo(repository)
- blob_id = Rugged::Blob.from_buffer(rugged, "some contents")
- tree_builder = Rugged::Tree::Builder.new(rugged)
- tree_builder.insert({ oid: blob_id, name: "hello\x80world", filemode: 0100644 })
- tree_id = tree_builder.write
- user = { email: "jcai@gitlab.com", time: Time.current.to_time, name: "John Cai" }
-
- Rugged::Commit.create(rugged, message: 'some commit message', parents: [rugged.head.target.oid], tree: tree_id, committer: user, author: user)
- end
-
it 'does not raise an error' do
- commit = create_commit_with_invalid_utf8_path
+ response = create_file_in_repo(project, 'master', 'master', "hello\x80world", 'some contents')
- expect { repository.list_last_commits_for_tree(commit, '.', offset: 0) }.not_to raise_error
+ expect { repository.list_last_commits_for_tree(response[:result], '.', offset: 0) }.not_to raise_error
end
end
end
@@ -2262,20 +2248,12 @@ RSpec.describe Repository do
describe '#branch_count' do
it 'returns the number of branches' do
expect(repository.branch_count).to be_an(Integer)
-
- rugged_count = rugged_repo(repository).branches.count
-
- expect(repository.branch_count).to eq(rugged_count)
end
end
describe '#tag_count' do
it 'returns the number of tags' do
expect(repository.tag_count).to be_an(Integer)
-
- rugged_count = rugged_repo(repository).tags.count
-
- expect(repository.tag_count).to eq(rugged_count)
end
end
@@ -2757,6 +2735,33 @@ RSpec.describe Repository do
end
end
+ describe '#changelog_config' do
+ let(:user) { create(:user) }
+ let(:changelog_config_path) { Gitlab::Changelog::Config::DEFAULT_FILE_PATH }
+
+ before do
+ repository.create_file(
+ user,
+ changelog_config_path,
+ 'CONTENT',
+ message: '...',
+ branch_name: 'master'
+ )
+ end
+
+ context 'when there is a changelog_config_path at the commit' do
+ it 'returns the content' do
+ expect(repository.changelog_config(repository.commit.sha, changelog_config_path)).to eq('CONTENT')
+ end
+ end
+
+ context 'when there is no changelog_config_path at the commit' do
+ it 'returns nil' do
+ expect(repository.changelog_config(repository.commit.parent.sha, changelog_config_path)).to be_nil
+ end
+ end
+ end
+
describe '#route_map_for' do
before do
repository.create_file(User.last, '.gitlab/route-map.yml', 'CONTENT', message: 'Add .gitlab/route-map.yml', branch_name: 'master')
@@ -2776,8 +2781,7 @@ RSpec.describe Repository do
end
def create_remote_branch(remote_name, branch_name, target)
- rugged = rugged_repo(repository)
- rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id)
+ repository.write_ref("refs/remotes/#{remote_name}/#{branch_name}", target.id)
end
shared_examples '#ancestor?' do
diff --git a/spec/models/ssh_host_key_spec.rb b/spec/models/ssh_host_key_spec.rb
index 4b756846598..0348aab9f97 100644
--- a/spec/models/ssh_host_key_spec.rb
+++ b/spec/models/ssh_host_key_spec.rb
@@ -26,6 +26,9 @@ RSpec.describe SshHostKey do
'Ebi86VjJRi2sOuYoXQU1'
end
+ let(:ssh_key1) { Gitlab::SSHPublicKey.new(key1) }
+ let(:ssh_key2) { Gitlab::SSHPublicKey.new(key2) }
+
# Purposefully ordered so that `sort` will make changes
let(:known_hosts) do
<<~EOF
@@ -88,10 +91,17 @@ RSpec.describe SshHostKey do
it 'returns an array of indexed fingerprints when the cache is filled' do
stub_reactive_cache(ssh_host_key, known_hosts: known_hosts)
- expected = [key1, key2]
- .map { |data| Gitlab::SSHPublicKey.new(data) }
+ expected = [ssh_key1, ssh_key2]
.each_with_index
- .map { |key, i| { bits: key.bits, fingerprint: key.fingerprint, type: key.type, index: i } }
+ .map do |key, i|
+ {
+ bits: key.bits,
+ fingerprint: key.fingerprint,
+ fingerprint_sha256: key.fingerprint_sha256,
+ type: key.type,
+ index: i
+ }
+ end
expect(ssh_host_key.fingerprints.as_json).to eq(expected)
end
@@ -107,8 +117,16 @@ RSpec.describe SshHostKey do
expect(ssh_host_key.fingerprints.as_json).to eq(
[
- { bits: 2048, fingerprint: Gitlab::SSHPublicKey.new(key1).fingerprint, type: :rsa, index: 0 },
- { bits: 2048, fingerprint: Gitlab::SSHPublicKey.new(key2).fingerprint, type: :rsa, index: 1 }
+ { bits: 2048,
+ fingerprint: ssh_key1.fingerprint,
+ fingerprint_sha256: ssh_key1.fingerprint_sha256,
+ type: :rsa,
+ index: 0 },
+ { bits: 2048,
+ fingerprint: ssh_key2.fingerprint,
+ fingerprint_sha256: ssh_key2.fingerprint_sha256,
+ type: :rsa,
+ index: 1 }
]
)
end
@@ -116,6 +134,19 @@ RSpec.describe SshHostKey do
it 'returns an empty array when the cache is empty' do
expect(ssh_host_key.fingerprints).to eq([])
end
+
+ context 'when FIPS is enabled', :fips_mode do
+ it 'only includes SHA256 fingerprint' do
+ stub_reactive_cache(ssh_host_key, known_hosts: known_hosts)
+
+ expect(ssh_host_key.fingerprints.as_json).to eq(
+ [
+ { bits: 2048, fingerprint_sha256: ssh_key1.fingerprint_sha256, type: :rsa, index: 0 },
+ { bits: 2048, fingerprint_sha256: ssh_key2.fingerprint_sha256, type: :rsa, index: 1 }
+ ]
+ )
+ end
+ end
end
describe '#host_keys_changed?' do
diff --git a/spec/models/todo_spec.rb b/spec/models/todo_spec.rb
index 651e2cf273f..7df22078c6d 100644
--- a/spec/models/todo_spec.rb
+++ b/spec/models/todo_spec.rb
@@ -114,6 +114,26 @@ RSpec.describe Todo do
end
end
+ describe '#for_issue_or_work_item?' do
+ it 'returns true when target is an Issue' do
+ subject.target_type = 'Issue'
+
+ expect(subject.for_issue_or_work_item?).to be_truthy
+ end
+
+ it 'returns true when target is a WorkItem' do
+ subject.target_type = 'WorkItem'
+
+ expect(subject.for_issue_or_work_item?).to be_truthy
+ end
+
+ it 'returns false when target is not an Issue' do
+ subject.target_type = 'DesignManagement::Design'
+
+ expect(subject.for_issue_or_work_item?).to be_falsey
+ end
+ end
+
describe '#target' do
context 'for commits' do
let(:project) { create(:project, :repository) }
diff --git a/spec/models/tree_spec.rb b/spec/models/tree_spec.rb
index b7a8276ec55..20d786f311f 100644
--- a/spec/models/tree_spec.rb
+++ b/spec/models/tree_spec.rb
@@ -3,7 +3,8 @@
require 'spec_helper'
RSpec.describe Tree do
- let(:repository) { create(:project, :repository).repository }
+ let_it_be(:repository) { create(:project, :repository).repository }
+
let(:sha) { repository.root_ref }
subject(:tree) { described_class.new(repository, '54fcc214') }
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index abc02dd1f55..6d2ba66d5f4 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -136,6 +136,7 @@ RSpec.describe User do
it { is_expected.to have_many(:timelogs) }
it { is_expected.to have_many(:callouts).class_name('Users::Callout') }
it { is_expected.to have_many(:group_callouts).class_name('Users::GroupCallout') }
+ it { is_expected.to have_many(:namespace_callouts).class_name('Users::NamespaceCallout') }
describe '#user_detail' do
it 'does not persist `user_detail` by default' do
@@ -1109,6 +1110,20 @@ RSpec.describe User do
.to contain_exactly(user1, user2)
end
end
+
+ describe '.order_recent_last_activity' do
+ it 'sorts users by activity and id to make the ordes deterministic' do
+ expect(described_class.order_recent_last_activity.to_sql).to include(
+ 'ORDER BY "users"."last_activity_on" DESC NULLS LAST, "users"."id" ASC')
+ end
+ end
+
+ describe '.order_oldest_last_activity' do
+ it 'sorts users by activity and id to make the ordes deterministic' do
+ expect(described_class.order_oldest_last_activity.to_sql).to include(
+ 'ORDER BY "users"."last_activity_on" ASC NULLS FIRST, "users"."id" DESC')
+ end
+ end
end
context 'strip attributes' do
@@ -2278,7 +2293,7 @@ RSpec.describe User do
@group = create :group
@group.add_owner(@user)
- @group.add_user(@user2, GroupMember::OWNER)
+ @group.add_member(@user2, GroupMember::OWNER)
end
it { expect(@user2.several_namespaces?).to be_truthy }
@@ -2729,131 +2744,149 @@ RSpec.describe User do
end
end
- describe '.search' do
- let_it_be(:user) { create(:user, name: 'user', username: 'usern', email: 'email@example.com') }
- let_it_be(:public_email) do
- create(:email, :confirmed, user: user, email: 'publicemail@example.com').tap do |email|
- user.update!(public_email: email.email)
+ shared_examples '.search examples' do
+ describe '.search' do
+ let_it_be(:user) { create(:user, name: 'user', username: 'usern', email: 'email@example.com') }
+ let_it_be(:public_email) do
+ create(:email, :confirmed, user: user, email: 'publicemail@example.com').tap do |email|
+ user.update!(public_email: email.email)
+ end
end
- end
- let_it_be(:user2) { create(:user, name: 'user name', username: 'username', email: 'someemail@example.com') }
- let_it_be(:user3) { create(:user, name: 'us', username: 'se', email: 'foo@example.com') }
- let_it_be(:email) { create(:email, user: user, email: 'alias@example.com') }
+ let_it_be(:user2) { create(:user, name: 'user name', username: 'username', email: 'someemail@example.com') }
+ let_it_be(:user3) { create(:user, name: 'us', username: 'se', email: 'foo@example.com') }
+ let_it_be(:email) { create(:email, user: user, email: 'alias@example.com') }
- describe 'name user and email relative ordering' do
- let_it_be(:named_alexander) { create(:user, name: 'Alexander Person', username: 'abcd', email: 'abcd@example.com') }
- let_it_be(:username_alexand) { create(:user, name: 'Joao Alexander', username: 'Alexand', email: 'joao@example.com') }
+ describe 'name user and email relative ordering' do
+ let_it_be(:named_alexander) { create(:user, name: 'Alexander Person', username: 'abcd', email: 'abcd@example.com') }
+ let_it_be(:username_alexand) { create(:user, name: 'Joao Alexander', username: 'Alexand', email: 'joao@example.com') }
- it 'prioritizes exact matches' do
- expect(described_class.search('Alexand')).to eq([username_alexand, named_alexander])
- end
+ it 'prioritizes exact matches' do
+ expect(described_class.search('Alexand')).to eq([username_alexand, named_alexander])
+ end
- it 'falls back to ordering by name' do
- expect(described_class.search('Alexander')).to eq([named_alexander, username_alexand])
+ it 'falls back to ordering by name' do
+ expect(described_class.search('Alexander')).to eq([named_alexander, username_alexand])
+ end
end
- end
- describe 'name matching' do
- it 'returns users with a matching name with exact match first' do
- expect(described_class.search(user.name)).to eq([user, user2])
- end
+ describe 'name matching' do
+ it 'returns users with a matching name with exact match first' do
+ expect(described_class.search(user.name)).to eq([user, user2])
+ end
- it 'returns users with a partially matching name' do
- expect(described_class.search(user.name[0..2])).to eq([user, user2])
- end
+ it 'returns users with a partially matching name' do
+ expect(described_class.search(user.name[0..2])).to eq([user, user2])
+ end
- it 'returns users with a matching name regardless of the casing' do
- expect(described_class.search(user2.name.upcase)).to eq([user2])
- end
+ it 'returns users with a matching name regardless of the casing' do
+ expect(described_class.search(user2.name.upcase)).to eq([user2])
+ end
- it 'returns users with a exact matching name shorter than 3 chars' do
- expect(described_class.search(user3.name)).to eq([user3])
- end
+ it 'returns users with a exact matching name shorter than 3 chars' do
+ expect(described_class.search(user3.name)).to eq([user3])
+ end
- it 'returns users with a exact matching name shorter than 3 chars regardless of the casing' do
- expect(described_class.search(user3.name.upcase)).to eq([user3])
- end
+ it 'returns users with a exact matching name shorter than 3 chars regardless of the casing' do
+ expect(described_class.search(user3.name.upcase)).to eq([user3])
+ end
- context 'when use_minimum_char_limit is false' do
- it 'returns users with a partially matching name' do
- expect(described_class.search('u', use_minimum_char_limit: false)).to eq([user3, user, user2])
+ context 'when use_minimum_char_limit is false' do
+ it 'returns users with a partially matching name' do
+ expect(described_class.search('u', use_minimum_char_limit: false)).to eq([user3, user, user2])
+ end
end
end
- end
- describe 'email matching' do
- it 'returns users with a matching public email' do
- expect(described_class.search(user.public_email)).to match_array([user])
- end
+ describe 'email matching' do
+ it 'returns users with a matching public email' do
+ expect(described_class.search(user.public_email)).to match_array([user])
+ end
- it 'does not return users with a partially matching public email' do
- expect(described_class.search(user.public_email[1...-1])).to be_empty
- end
+ it 'does not return users with a partially matching public email' do
+ expect(described_class.search(user.public_email[1...-1])).to be_empty
+ end
- it 'returns users with a matching public email regardless of the casing' do
- expect(described_class.search(user.public_email.upcase)).to match_array([user])
- end
+ it 'returns users with a matching public email regardless of the casing' do
+ expect(described_class.search(user.public_email.upcase)).to match_array([user])
+ end
+
+ it 'does not return users with a matching private email' do
+ expect(described_class.search(user.email)).to be_empty
+ expect(described_class.search(email.email)).to be_empty
+ end
+
+ context 'with private emails search' do
+ it 'returns users with matching private email' do
+ expect(described_class.search(user.email, with_private_emails: true)).to match_array([user])
+ end
- it 'does not return users with a matching private email' do
- expect(described_class.search(user.email)).to be_empty
- expect(described_class.search(email.email)).to be_empty
+ it 'returns users with matching private secondary email' do
+ expect(described_class.search(email.email, with_private_emails: true)).to match_array([user])
+ end
+ end
end
- context 'with private emails search' do
- it 'returns users with matching private email' do
- expect(described_class.search(user.email, with_private_emails: true)).to match_array([user])
+ describe 'username matching' do
+ it 'returns users with a matching username' do
+ expect(described_class.search(user.username)).to eq([user, user2])
end
- it 'returns users with matching private secondary email' do
- expect(described_class.search(email.email, with_private_emails: true)).to match_array([user])
+ it 'returns users with a matching username starting with a @' do
+ expect(described_class.search("@#{user.username}")).to eq([user, user2])
end
- end
- end
- describe 'username matching' do
- it 'returns users with a matching username' do
- expect(described_class.search(user.username)).to eq([user, user2])
- end
+ it 'returns users with a partially matching username' do
+ expect(described_class.search(user.username[0..2])).to eq([user, user2])
+ end
- it 'returns users with a matching username starting with a @' do
- expect(described_class.search("@#{user.username}")).to eq([user, user2])
- end
+ it 'returns users with a partially matching username starting with @' do
+ expect(described_class.search("@#{user.username[0..2]}")).to eq([user, user2])
+ end
- it 'returns users with a partially matching username' do
- expect(described_class.search(user.username[0..2])).to eq([user, user2])
- end
+ it 'returns users with a matching username regardless of the casing' do
+ expect(described_class.search(user2.username.upcase)).to eq([user2])
+ end
- it 'returns users with a partially matching username starting with @' do
- expect(described_class.search("@#{user.username[0..2]}")).to eq([user, user2])
- end
+ it 'returns users with a exact matching username shorter than 3 chars' do
+ expect(described_class.search(user3.username)).to eq([user3])
+ end
- it 'returns users with a matching username regardless of the casing' do
- expect(described_class.search(user2.username.upcase)).to eq([user2])
- end
+ it 'returns users with a exact matching username shorter than 3 chars regardless of the casing' do
+ expect(described_class.search(user3.username.upcase)).to eq([user3])
+ end
- it 'returns users with a exact matching username shorter than 3 chars' do
- expect(described_class.search(user3.username)).to eq([user3])
+ context 'when use_minimum_char_limit is false' do
+ it 'returns users with a partially matching username' do
+ expect(described_class.search('se', use_minimum_char_limit: false)).to eq([user3, user, user2])
+ end
+ end
end
- it 'returns users with a exact matching username shorter than 3 chars regardless of the casing' do
- expect(described_class.search(user3.username.upcase)).to eq([user3])
+ it 'returns no matches for an empty string' do
+ expect(described_class.search('')).to be_empty
end
- context 'when use_minimum_char_limit is false' do
- it 'returns users with a partially matching username' do
- expect(described_class.search('se', use_minimum_char_limit: false)).to eq([user3, user, user2])
- end
+ it 'returns no matches for nil' do
+ expect(described_class.search(nil)).to be_empty
end
end
+ end
- it 'returns no matches for an empty string' do
- expect(described_class.search('')).to be_empty
+ context 'when the use_keyset_aware_user_search_query FF is on' do
+ before do
+ stub_feature_flags(use_keyset_aware_user_search_query: true)
end
- it 'returns no matches for nil' do
- expect(described_class.search(nil)).to be_empty
+ it_behaves_like '.search examples'
+ end
+
+ context 'when the use_keyset_aware_user_search_query FF is off' do
+ before do
+ stub_feature_flags(use_keyset_aware_user_search_query: false)
end
+
+ it_behaves_like '.search examples'
end
describe '.user_search_minimum_char_limit' do
@@ -3001,7 +3034,7 @@ RSpec.describe User do
it 'has all ssh keys' do
user = create :user
- key = create :key, key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD33bWLBxu48Sev9Fert1yzEO4WGcWglWF7K/AwblIUFselOt/QdOL9DSjpQGxLagO1s9wl53STIO8qGS4Ms0EJZyIXOEFMjFJ5xmjSy+S37By4sG7SsltQEHMxtbtFOaW5LV2wCrX+rUsRNqLMamZjgjcPO0/EgGCXIGMAYW4O7cwGZdXWYIhQ1Vwy+CsVMDdPkPgBXqK7nR/ey8KMs8ho5fMNgB5hBw/AL9fNGhRw3QTD6Q12Nkhl4VZES2EsZqlpNnJttnPdp847DUsT6yuLRlfiQfz5Cn9ysHFdXObMN5VYIiPFwHeYCZp1X2S4fDZooRE8uOLTfxWHPXwrhqSH", user_id: user.id
+ key = create :key_without_comment, user_id: user.id
expect(user.all_ssh_keys).to include(a_string_starting_with(key.key))
end
@@ -3428,6 +3461,15 @@ RSpec.describe User do
end
end
+ describe '#followed_by?' do
+ it 'check if followed by another user' do
+ follower = create :user
+ followee = create :user
+
+ expect { follower.follow(followee) }.to change { followee.followed_by?(follower) }.from(false).to(true)
+ end
+ end
+
describe '#follow' do
it 'follow another user' do
user = create :user
@@ -3518,49 +3560,45 @@ RSpec.describe User do
end
describe '#sort_by_attribute' do
- before do
- described_class.delete_all
- @user = create :user, created_at: Date.today, current_sign_in_at: Date.today, name: 'Alpha'
- @user1 = create :user, created_at: Date.today - 1, current_sign_in_at: Date.today - 1, name: 'Omega'
- @user2 = create :user, created_at: Date.today - 2, name: 'Beta'
- end
+ let_it_be(:user) { create :user, created_at: Date.today, current_sign_in_at: Date.today, username: 'user0' }
+ let_it_be(:user1) { create :user, created_at: Date.today - 1, last_activity_on: Date.today - 1, current_sign_in_at: Date.today - 1, username: 'user1' }
+ let_it_be(:user2) { create :user, created_at: Date.today - 2, username: 'user2' }
+ let_it_be(:user3) { create :user, created_at: Date.today - 3, last_activity_on: Date.today, username: "user3" }
context 'when sort by recent_sign_in' do
let(:users) { described_class.sort_by_attribute('recent_sign_in') }
- it 'sorts users by recent sign-in time' do
- expect(users.first).to eq(@user)
- expect(users.second).to eq(@user1)
- end
-
- it 'pushes users who never signed in to the end' do
- expect(users.third).to eq(@user2)
+ it 'sorts users by recent sign-in time with user that never signed in at the end' do
+ expect(users).to eq([user, user1, user2, user3])
end
end
context 'when sort by oldest_sign_in' do
let(:users) { described_class.sort_by_attribute('oldest_sign_in') }
- it 'sorts users by the oldest sign-in time' do
- expect(users.first).to eq(@user1)
- expect(users.second).to eq(@user)
- end
-
- it 'pushes users who never signed in to the end' do
- expect(users.third).to eq(@user2)
+ it 'sorts users by the oldest sign-in time with users that never signed in at the end' do
+ expect(users).to eq([user1, user, user2, user3])
end
end
it 'sorts users in descending order by their creation time' do
- expect(described_class.sort_by_attribute('created_desc').first).to eq(@user)
+ expect(described_class.sort_by_attribute('created_desc')).to eq([user, user1, user2, user3])
end
it 'sorts users in ascending order by their creation time' do
- expect(described_class.sort_by_attribute('created_asc').first).to eq(@user2)
+ expect(described_class.sort_by_attribute('created_asc')).to eq([user3, user2, user1, user])
end
it 'sorts users by id in descending order when nil is passed' do
- expect(described_class.sort_by_attribute(nil).first).to eq(@user2)
+ expect(described_class.sort_by_attribute(nil)).to eq([user3, user2, user1, user])
+ end
+
+ it 'sorts user by latest activity descending, nulls last ordered by ascending id' do
+ expect(described_class.sort_by_attribute('last_activity_on_desc')).to eq([user3, user1, user, user2])
+ end
+
+ it 'sorts user by latest activity ascending, nulls first ordered by descending id' do
+ expect(described_class.sort_by_attribute('last_activity_on_asc')).to eq([user2, user, user1, user3])
end
end
@@ -3824,7 +3862,7 @@ RSpec.describe User do
let!(:project) { create(:project, group: project_group) }
before do
- private_group.add_user(user, Gitlab::Access::MAINTAINER)
+ private_group.add_member(user, Gitlab::Access::MAINTAINER)
project.add_maintainer(user)
end
@@ -3851,7 +3889,7 @@ RSpec.describe User do
let_it_be(:parent_group) do
create(:group).tap do |g|
- g.add_user(user, Gitlab::Access::MAINTAINER)
+ g.add_member(user, Gitlab::Access::MAINTAINER)
end
end
@@ -4279,7 +4317,7 @@ RSpec.describe User do
let!(:runner) { create(:ci_runner, :group, groups: [group]) }
def add_user(access)
- group.add_user(user, access)
+ group.add_member(user, access)
end
it_behaves_like :group_member
@@ -4369,7 +4407,7 @@ RSpec.describe User do
let!(:project_runner) { create(:ci_runner, :project, projects: [project]) }
def add_user(access)
- project.add_user(user, access)
+ project.add_member(user, access)
end
it_behaves_like :project_member
@@ -4391,8 +4429,8 @@ RSpec.describe User do
let!(:another_user) { create(:user) }
def add_user(access)
- subgroup.add_user(user, access)
- group.add_user(another_user, :owner)
+ subgroup.add_member(user, access)
+ group.add_member(another_user, :owner)
end
it_behaves_like :group_member
@@ -4749,8 +4787,8 @@ RSpec.describe User do
let(:group2) { create :group, require_two_factor_authentication: true, two_factor_grace_period: 32 }
before do
- group1.add_user(user, GroupMember::OWNER)
- group2.add_user(user, GroupMember::OWNER)
+ group1.add_member(user, GroupMember::OWNER)
+ group2.add_member(user, GroupMember::OWNER)
user.update_two_factor_requirement
end
@@ -4769,7 +4807,7 @@ RSpec.describe User do
let!(:group1a) { create :group, parent: group1 }
before do
- group1a.add_user(user, GroupMember::OWNER)
+ group1a.add_member(user, GroupMember::OWNER)
user.update_two_factor_requirement
end
@@ -4784,7 +4822,7 @@ RSpec.describe User do
let!(:group1a) { create :group, require_two_factor_authentication: true, parent: group1 }
before do
- group1.add_user(user, GroupMember::OWNER)
+ group1.add_member(user, GroupMember::OWNER)
user.update_two_factor_requirement
end
@@ -4805,7 +4843,7 @@ RSpec.describe User do
group_access: ProjectGroupLink.default_access
)
- group2.add_user(user, GroupMember::OWNER)
+ group2.add_member(user, GroupMember::OWNER)
end
it 'does not require 2FA' do
@@ -4819,7 +4857,7 @@ RSpec.describe User do
let(:group) { create :group }
before do
- group.add_user(user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
user.update_two_factor_requirement
end
@@ -4848,8 +4886,8 @@ RSpec.describe User do
let(:user) { create :user }
before do
- group.add_user(user, GroupMember::OWNER)
- group_not_requiring_2FA.add_user(user, GroupMember::OWNER)
+ group.add_member(user, GroupMember::OWNER)
+ group_not_requiring_2FA.add_member(user, GroupMember::OWNER)
end
context 'when user is direct member of group requiring 2FA' do
@@ -5884,8 +5922,44 @@ RSpec.describe User do
end
end
+ describe '#authenticatable_salt' do
+ let(:user) { create(:user) }
+
+ subject(:authenticatable_salt) { user.authenticatable_salt }
+
+ it 'uses password_salt' do
+ expect(authenticatable_salt).to eq(user.password_salt)
+ end
+
+ context 'when the encrypted_password is an unknown type' do
+ let(:encrypted_password) { '$argon2i$v=19$m=512,t=4,p=2$eM+ZMyYkpDRGaI3xXmuNcQ$c5DeJg3eb5dskVt1mDdxfw' }
+
+ before do
+ user.update_attribute(:encrypted_password, encrypted_password)
+ end
+
+ it 'returns the first 30 characters of the encrypted_password' do
+ expect(authenticatable_salt).to eq(encrypted_password[0, 29])
+ end
+ end
+
+ context 'when pbkdf2_password_encryption is disabled' do
+ before do
+ stub_feature_flags(pbkdf2_password_encryption: false)
+ end
+
+ it 'returns the first 30 characters of the encrypted_password' do
+ expect(authenticatable_salt).to eq(user.encrypted_password[0, 29])
+ end
+ end
+ end
+
+ def compare_pbkdf2_password(user, password)
+ Devise::Pbkdf2Encryptable::Encryptors::Pbkdf2Sha512.compare(user.encrypted_password, password)
+ end
+
describe '#valid_password?' do
- subject { user.valid_password?(password) }
+ subject(:validate_password) { user.valid_password?(password) }
context 'user with password not in disallowed list' do
let(:user) { create(:user) }
@@ -5898,6 +5972,15 @@ RSpec.describe User do
it { is_expected.to be_falsey }
end
+
+ context 'when pbkdf2_sha512_encryption is disabled and the user password is pbkdf2+sha512' do
+ it 'does not validate correctly' do
+ user # Create the user while the feature is enabled
+ stub_feature_flags(pbkdf2_password_encryption: false)
+
+ expect(validate_password).to be_falsey
+ end
+ end
end
context 'user with disallowed password' do
@@ -5912,6 +5995,174 @@ RSpec.describe User do
it { is_expected.to be_falsey }
end
end
+
+ context 'user with a bcrypt password hash' do
+ # Plaintext password 'eiFubohV6iro'
+ let(:encrypted_password) { '$2a$10$xLTxCKOa75IU4RQGqqOrTuZOgZdJEzfSzjG6ZSEi/C31TB/yLZYpi' }
+ let(:user) { create(:user, encrypted_password: encrypted_password) }
+
+ shared_examples 'not re-encrypting with PBKDF2' do
+ it 'does not re-encrypt with PBKDF2' do
+ validate_password
+
+ expect(user.reload.encrypted_password).to eq(encrypted_password)
+ end
+ end
+
+ context 'using the wrong password' do
+ let(:password) { 'WRONG PASSWORD' }
+
+ it { is_expected.to be_falsey }
+ it_behaves_like 'not re-encrypting with PBKDF2'
+
+ context 'when pbkdf2_password_encryption is disabled' do
+ before do
+ stub_feature_flags(pbkdf2_password_encryption: false)
+ end
+
+ it { is_expected.to be_falsey }
+ it_behaves_like 'not re-encrypting with PBKDF2'
+ end
+ end
+
+ context 'using the correct password' do
+ let(:password) { 'eiFubohV6iro' }
+
+ it { is_expected.to be_truthy }
+
+ it 'validates the password and re-encrypts with PBKDF2' do
+ validate_password
+
+ current_encrypted_password = user.reload.encrypted_password
+
+ expect(compare_pbkdf2_password(user, password)).to eq(true)
+ expect { ::BCrypt::Password.new(current_encrypted_password) }
+ .to raise_error(::BCrypt::Errors::InvalidHash)
+ end
+
+ context 'when pbkdf2_password_encryption is disabled' do
+ before do
+ stub_feature_flags(pbkdf2_password_encryption: false)
+ end
+
+ it { is_expected.to be_truthy }
+ it_behaves_like 'not re-encrypting with PBKDF2'
+ end
+
+ context 'when pbkdf2_password_encryption_write is disabled' do
+ before do
+ stub_feature_flags(pbkdf2_password_encryption_write: false)
+ end
+
+ it { is_expected.to be_truthy }
+ it_behaves_like 'not re-encrypting with PBKDF2'
+ end
+ end
+ end
+
+ context 'user with password hash that is neither PBKDF2 nor BCrypt' do
+ let(:user) { create(:user, encrypted_password: '$argon2i$v=19$m=512,t=4,p=2$eM+ZMyYkpDRGaI3xXmuNcQ$c5DeJg3eb5dskVt1mDdxfw') }
+ let(:password) { 'password' }
+
+ it { is_expected.to be_falsey }
+
+ context 'when pbkdf2_password_encryption is disabled' do
+ before do
+ stub_feature_flags(pbkdf2_password_encryption: false)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+ end
+
+ # These entire test section can be removed once the :pbkdf2_password_encryption feature flag is removed.
+ describe '#password=' do
+ let(:user) { create(:user) }
+ let(:password) { 'Oot5iechahqu' }
+
+ def compare_bcrypt_password(user, password)
+ Devise::Encryptor.compare(User, user.encrypted_password, password)
+ end
+
+ context 'when pbkdf2_password_encryption is enabled' do
+ it 'calls PBKDF2 digest and not the default Devise encryptor' do
+ expect(Devise::Pbkdf2Encryptable::Encryptors::Pbkdf2Sha512).to receive(:digest).at_least(:once).and_call_original
+ expect(Devise::Encryptor).not_to receive(:digest)
+
+ user.password = password
+ end
+
+ it 'saves the password in PBKDF2 format' do
+ user.password = password
+ user.save!
+
+ expect(compare_pbkdf2_password(user, password)).to eq(true)
+ expect { compare_bcrypt_password(user, password) }.to raise_error(::BCrypt::Errors::InvalidHash)
+ end
+
+ context 'when pbkdf2_password_encryption_write is disabled' do
+ before do
+ stub_feature_flags(pbkdf2_password_encryption_write: false)
+ end
+
+ it 'calls default Devise encryptor and not the PBKDF2 encryptor' do
+ expect(Devise::Encryptor).to receive(:digest).at_least(:once).and_call_original
+ expect(Devise::Pbkdf2Encryptable::Encryptors::Pbkdf2Sha512).not_to receive(:digest)
+
+ user.password = password
+ end
+ end
+ end
+
+ context 'when pbkdf2_password_encryption is disabled' do
+ before do
+ stub_feature_flags(pbkdf2_password_encryption: false)
+ end
+
+ it 'calls default Devise encryptor and not the PBKDF2 encryptor' do
+ expect(Devise::Encryptor).to receive(:digest).at_least(:once).and_call_original
+ expect(Devise::Pbkdf2Encryptable::Encryptors::Pbkdf2Sha512).not_to receive(:digest)
+
+ user.password = password
+ end
+
+ it 'saves the password in BCrypt format' do
+ user.password = password
+ user.save!
+
+ expect { compare_pbkdf2_password(user, password) }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash
+ expect(compare_bcrypt_password(user, password)).to eq(true)
+ end
+ end
+ end
+
+ describe '#password_strategy' do
+ let(:user) { create(:user, encrypted_password: encrypted_password) }
+
+ context 'with a PBKDF2+SHA512 encrypted password' do
+ let(:encrypted_password) { '$pbkdf2-sha512$20000$boHGAw0hEyI$DBA67J7zNZebyzLtLk2X9wRDbmj1LNKVGnZLYyz6PGrIDGIl45fl/BPH0y1TPZnV90A20i.fD9C3G9Bp8jzzOA' }
+
+ it 'extracts the correct strategy', :aggregate_failures do
+ expect(user.password_strategy).to eq(:pbkdf2_sha512)
+ end
+ end
+
+ context 'with a BCrypt encrypted password' do
+ let(:encrypted_password) { '$2a$10$xLTxCKOa75IU4RQGqqOrTuZOgZdJEzfSzjG6ZSEi/C31TB/yLZYpi' }
+
+ it 'extracts the correct strategy', :aggregate_failures do
+ expect(user.password_strategy).to eq(:bcrypt)
+ end
+ end
+
+ context 'with an unknown encrypted password' do
+ let(:encrypted_password) { '$pbkdf2-sha256$6400$.6UI/S.nXIk8jcbdHx3Fhg$98jZicV16ODfEsEZeYPGHU3kbrUrvUEXOPimVSQDD44' }
+
+ it 'returns unknown strategy' do
+ expect(user.password_strategy).to eq(:unknown)
+ end
+ end
end
describe '#password_expired?' do
@@ -6165,6 +6416,96 @@ RSpec.describe User do
end
end
+ describe 'Users::NamespaceCallout' do
+ describe '#dismissed_callout_for_namespace?' do
+ let_it_be(:user, refind: true) { create(:user) }
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:feature_name) { Users::NamespaceCallout.feature_names.each_key.first }
+
+ let(:query) do
+ { feature_name: feature_name, namespace: namespace }
+ end
+
+ def have_dismissed_callout
+ be_dismissed_callout_for_namespace(**query)
+ end
+
+ context 'when no callout dismissal record exists' do
+ it 'returns false when no ignore_dismissal_earlier_than provided' do
+ expect(user).not_to have_dismissed_callout
+ end
+ end
+
+ context 'when dismissed callout exists' do
+ before_all do
+ create(:namespace_callout,
+ user: user,
+ namespace_id: namespace.id,
+ feature_name: feature_name,
+ dismissed_at: 4.months.ago)
+ end
+
+ it 'returns true when no ignore_dismissal_earlier_than provided' do
+ expect(user).to have_dismissed_callout
+ end
+
+ it 'returns true when ignore_dismissal_earlier_than is earlier than dismissed_at' do
+ query[:ignore_dismissal_earlier_than] = 6.months.ago
+
+ expect(user).to have_dismissed_callout
+ end
+
+ it 'returns false when ignore_dismissal_earlier_than is later than dismissed_at' do
+ query[:ignore_dismissal_earlier_than] = 2.months.ago
+
+ expect(user).not_to have_dismissed_callout
+ end
+ end
+ end
+
+ describe '#find_or_initialize_namespace_callout' do
+ let_it_be(:user, refind: true) { create(:user) }
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:feature_name) { Users::NamespaceCallout.feature_names.each_key.first }
+
+ subject(:callout_with_source) do
+ user.find_or_initialize_namespace_callout(feature_name, namespace.id)
+ end
+
+ context 'when callout exists' do
+ let!(:callout) do
+ create(:namespace_callout, user: user, feature_name: feature_name, namespace_id: namespace.id)
+ end
+
+ it 'returns existing callout' do
+ expect(callout_with_source).to eq(callout)
+ end
+ end
+
+ context 'when callout does not exist' do
+ context 'when feature name is valid' do
+ it 'initializes a new callout' do
+ expect(callout_with_source)
+ .to be_a_new(Users::NamespaceCallout)
+ .and be_valid
+ end
+ end
+
+ context 'when feature name is not valid' do
+ let(:feature_name) { 'notvalid' }
+
+ it 'initializes a new callout' do
+ expect(callout_with_source).to be_a_new(Users::NamespaceCallout)
+ end
+
+ it 'is not valid' do
+ expect(callout_with_source).not_to be_valid
+ end
+ end
+ end
+ end
+ end
+
describe '#dismissed_callout_for_group?' do
let_it_be(:user, refind: true) { create(:user) }
let_it_be(:group) { create(:group) }
diff --git a/spec/models/users/namespace_callout_spec.rb b/spec/models/users/namespace_callout_spec.rb
new file mode 100644
index 00000000000..f8207f2abc8
--- /dev/null
+++ b/spec/models/users/namespace_callout_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::NamespaceCallout do
+ let_it_be(:user) { create_default(:user) }
+ let_it_be(:namespace) { create_default(:namespace) }
+ let_it_be(:callout) { create(:namespace_callout) }
+
+ it_behaves_like 'having unique enum values'
+
+ describe 'relationships' do
+ it { is_expected.to belong_to(:namespace) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:namespace) }
+ it { is_expected.to validate_presence_of(:user) }
+ it { is_expected.to validate_presence_of(:feature_name) }
+
+ specify do
+ is_expected.to validate_uniqueness_of(:feature_name)
+ .scoped_to(:user_id, :namespace_id)
+ .ignoring_case_sensitivity
+ end
+
+ it { is_expected.to allow_value(:web_hook_disabled).for(:feature_name) }
+
+ it 'rejects invalid feature names' do
+ expect { callout.feature_name = :non_existent_feature }.to raise_error(ArgumentError)
+ end
+ end
+
+ describe '#source_feature_name' do
+ it 'provides string based off source and feature' do
+ expect(callout.source_feature_name).to eq "#{callout.feature_name}_#{callout.namespace_id}"
+ end
+ end
+end
diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb
index 51970064c54..96c396f085c 100644
--- a/spec/models/wiki_page_spec.rb
+++ b/spec/models/wiki_page_spec.rb
@@ -24,6 +24,14 @@ RSpec.describe WikiPage do
container.wiki
end
+ def disable_front_matter
+ stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => false)
+ end
+
+ def enable_front_matter_for(thing)
+ stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => thing)
+ end
+
# Use for groups of tests that do not modify their `subject`.
#
# include_context 'subject is persisted page', title: 'my title'
@@ -40,6 +48,12 @@ RSpec.describe WikiPage do
it { expect(wiki_page).to have_attributes(front_matter: {}, content: content) }
end
+ shared_examples 'a page with front-matter' do
+ let(:front_matter) { { title: 'Foo', slugs: %w[slug_a slug_b] } }
+
+ it { expect(wiki_page.front_matter).to eq(front_matter) }
+ end
+
context 'the wiki page has front matter' do
let(:content) do
<<~MD
@@ -54,13 +68,27 @@ RSpec.describe WikiPage do
MD
end
- it 'has front-matter' do
- expect(wiki_page.front_matter).to eq({ title: 'Foo', slugs: %w[slug_a slug_b] })
- end
+ it_behaves_like 'a page with front-matter'
it 'strips the front matter from the content' do
expect(wiki_page.content.strip).to eq('My actual content')
end
+
+ context 'the feature flag is off' do
+ before do
+ disable_front_matter
+ end
+
+ it_behaves_like 'a page without front-matter'
+
+ context 'but enabled for the container' do
+ before do
+ enable_front_matter_for(container)
+ end
+
+ it_behaves_like 'a page with front-matter'
+ end
+ end
end
context 'the wiki page does not have front matter' do
@@ -443,6 +471,29 @@ RSpec.describe WikiPage do
end
end
+ context 'the front-matter feature flag is not enabled' do
+ before do
+ disable_front_matter
+ end
+
+ it 'does not update the front-matter' do
+ content = subject.content
+ subject.update(front_matter: { slugs: ['x'] })
+
+ page = wiki.find_page(subject.title)
+
+ expect([subject, page]).to all(have_attributes(front_matter: be_empty, content: content))
+ end
+
+ context 'but it is enabled for the container' do
+ before do
+ enable_front_matter_for(container)
+ end
+
+ it_behaves_like 'able to update front-matter'
+ end
+ end
+
it 'updates the wiki-page front-matter and content together' do
content = 'totally new content'
subject.update(content: content, front_matter: { slugs: ['x'] })
diff --git a/spec/models/work_item_spec.rb b/spec/models/work_item_spec.rb
index 5e757c11f99..f33c8e0a186 100644
--- a/spec/models/work_item_spec.rb
+++ b/spec/models/work_item_spec.rb
@@ -3,7 +3,10 @@
require 'spec_helper'
RSpec.describe WorkItem do
+ let_it_be(:reusable_project) { create(:project) }
+
describe 'associations' do
+ it { is_expected.to belong_to(:namespace) }
it { is_expected.to have_one(:work_item_parent).class_name('WorkItem') }
it 'has one `parent_link`' do
@@ -38,7 +41,9 @@ RSpec.describe WorkItem do
it 'returns instances of supported widgets' do
is_expected.to match_array([instance_of(WorkItems::Widgets::Description),
- instance_of(WorkItems::Widgets::Hierarchy)])
+ instance_of(WorkItems::Widgets::Hierarchy),
+ instance_of(WorkItems::Widgets::Assignees),
+ instance_of(WorkItems::Widgets::Weight)])
end
end
@@ -52,5 +57,55 @@ RSpec.describe WorkItem do
create(:work_item)
end
end
+
+ context 'work item namespace' do
+ let(:work_item) { build(:work_item, project: reusable_project) }
+
+ it 'sets the namespace_id' do
+ expect(work_item).to be_valid
+ expect(work_item.namespace).to eq(reusable_project.project_namespace)
+ end
+
+ context 'when work item is saved' do
+ it 'sets the namespace_id' do
+ work_item.save!
+ expect(work_item.reload.namespace).to eq(reusable_project.project_namespace)
+ end
+ end
+
+ context 'when existing work item is saved' do
+ let(:work_item) { create(:work_item) }
+
+ before do
+ work_item.update!(namespace_id: nil)
+ end
+
+ it 'sets the namespace id' do
+ work_item.update!(title: "#{work_item.title} and something extra")
+
+ expect(work_item.namespace).to eq(work_item.project.project_namespace)
+ end
+ end
+ end
+ end
+
+ describe 'validations' do
+ subject { work_item.valid? }
+
+ describe 'issue_type' do
+ let(:work_item) { build(:work_item, issue_type: issue_type) }
+
+ context 'when a valid type' do
+ let(:issue_type) { :issue }
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'empty type' do
+ let(:issue_type) { nil }
+
+ it { is_expected.to eq(false) }
+ end
+ end
end
end
diff --git a/spec/models/work_items/parent_link_spec.rb b/spec/models/work_items/parent_link_spec.rb
index 9516baa7340..a16b15bbfc9 100644
--- a/spec/models/work_items/parent_link_spec.rb
+++ b/spec/models/work_items/parent_link_spec.rb
@@ -9,38 +9,46 @@ RSpec.describe WorkItems::ParentLink do
end
describe 'validations' do
+ subject { build(:parent_link) }
+
it { is_expected.to validate_presence_of(:work_item) }
it { is_expected.to validate_presence_of(:work_item_parent) }
+ it { is_expected.to validate_uniqueness_of(:work_item) }
describe 'hierarchy' do
let_it_be(:project) { create(:project) }
let_it_be(:issue) { build(:work_item, project: project) }
+ let_it_be(:incident) { build(:work_item, :incident, project: project) }
let_it_be(:task1) { build(:work_item, :task, project: project) }
let_it_be(:task2) { build(:work_item, :task, project: project) }
- it 'is valid if not-task parent has task child' do
+ it 'is valid if issue parent has task child' do
expect(build(:parent_link, work_item: task1, work_item_parent: issue)).to be_valid
end
+ it 'is valid if incident parent has task child' do
+ expect(build(:parent_link, work_item: task1, work_item_parent: incident)).to be_valid
+ end
+
it 'is not valid if child is not task' do
link = build(:parent_link, work_item: issue)
expect(link).not_to be_valid
- expect(link.errors[:work_item]).to include('Only Task can be assigned as a child in hierarchy.')
+ expect(link.errors[:work_item]).to include('only Task can be assigned as a child in hierarchy.')
end
it 'is not valid if parent is task' do
link = build(:parent_link, work_item_parent: task1)
expect(link).not_to be_valid
- expect(link.errors[:work_item_parent]).to include('Only Issue can be parent of Task.')
+ expect(link.errors[:work_item_parent]).to include('only Issue and Incident can be parent of Task.')
end
it 'is not valid if parent is in other project' do
link = build(:parent_link, work_item_parent: task1, work_item: build(:work_item))
expect(link).not_to be_valid
- expect(link.errors[:work_item_parent]).to include('Parent must be in the same project as child.')
+ expect(link.errors[:work_item_parent]).to include('parent must be in the same project as child.')
end
context 'when parent already has maximum number of links' do
@@ -54,7 +62,7 @@ RSpec.describe WorkItems::ParentLink do
link2 = build(:parent_link, work_item_parent: issue, work_item: task2)
expect(link2).not_to be_valid
- expect(link2.errors[:work_item_parent]).to include('Parent already has maximum number of children.')
+ expect(link2.errors[:work_item_parent]).to include('parent already has maximum number of children.')
end
it 'existing link is still valid' do
diff --git a/spec/models/work_items/type_spec.rb b/spec/models/work_items/type_spec.rb
index 81663d0eb41..e91617effc0 100644
--- a/spec/models/work_items/type_spec.rb
+++ b/spec/models/work_items/type_spec.rb
@@ -65,7 +65,9 @@ RSpec.describe WorkItems::Type do
it 'returns list of all possible widgets' do
is_expected.to match_array([::WorkItems::Widgets::Description,
- ::WorkItems::Widgets::Hierarchy])
+ ::WorkItems::Widgets::Hierarchy,
+ ::WorkItems::Widgets::Assignees,
+ ::WorkItems::Widgets::Weight])
end
end
diff --git a/spec/models/work_items/widgets/assignees_spec.rb b/spec/models/work_items/widgets/assignees_spec.rb
new file mode 100644
index 00000000000..a2c93c07fde
--- /dev/null
+++ b/spec/models/work_items/widgets/assignees_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::Widgets::Assignees do
+ let_it_be(:work_item) { create(:work_item, assignees: [create(:user)]) }
+
+ describe '.type' do
+ subject { described_class.type }
+
+ it { is_expected.to eq(:assignees) }
+ end
+
+ describe '#type' do
+ subject { described_class.new(work_item).type }
+
+ it { is_expected.to eq(:assignees) }
+ end
+
+ describe '#assignees' do
+ subject { described_class.new(work_item).assignees }
+
+ it { is_expected.to eq(work_item.assignees) }
+ end
+
+ describe '#allows_multiple_assignees?' do
+ subject { described_class.new(work_item).allows_multiple_assignees? }
+
+ it { is_expected.to eq(work_item.allows_multiple_assignees?) }
+ end
+end
diff --git a/spec/models/work_items/widgets/hierarchy_spec.rb b/spec/models/work_items/widgets/hierarchy_spec.rb
index 0141731529b..ab2bcfee13f 100644
--- a/spec/models/work_items/widgets/hierarchy_spec.rb
+++ b/spec/models/work_items/widgets/hierarchy_spec.rb
@@ -3,7 +3,10 @@
require 'spec_helper'
RSpec.describe WorkItems::Widgets::Hierarchy do
- let_it_be(:work_item) { create(:work_item) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:task) { create(:work_item, :task, project: project) }
+ let_it_be(:work_item_parent) { create(:work_item, project: project) }
describe '.type' do
subject { described_class.type }
@@ -12,41 +15,57 @@ RSpec.describe WorkItems::Widgets::Hierarchy do
end
describe '#type' do
- subject { described_class.new(work_item).type }
+ subject { described_class.new(task).type }
it { is_expected.to eq(:hierarchy) }
end
describe '#parent' do
- let_it_be(:parent_link) { create(:parent_link) }
+ let_it_be(:parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item_parent) }
subject { described_class.new(parent_link.work_item).parent }
- it { is_expected.to eq parent_link.work_item_parent }
+ it { is_expected.to eq(parent_link.work_item_parent) }
- context 'when work_items_hierarchy flag is disabled' do
+ context 'when work_items flag is disabled' do
before do
- stub_feature_flags(work_items_hierarchy: false)
+ stub_feature_flags(work_items: false)
end
it { is_expected.to be_nil }
end
+
+ context 'when work_items flag is enabled for the parent group' do
+ before do
+ stub_feature_flags(work_items: group)
+ end
+
+ it { is_expected.to eq(parent_link.work_item_parent) }
+ end
end
describe '#children' do
- let_it_be(:parent_link1) { create(:parent_link, work_item_parent: work_item) }
- let_it_be(:parent_link2) { create(:parent_link, work_item_parent: work_item) }
+ let_it_be(:parent_link1) { create(:parent_link, work_item_parent: work_item_parent, work_item: task) }
+ let_it_be(:parent_link2) { create(:parent_link, work_item_parent: work_item_parent) }
- subject { described_class.new(work_item).children }
+ subject { described_class.new(work_item_parent).children }
- it { is_expected.to match_array([parent_link1.work_item, parent_link2.work_item]) }
+ it { is_expected.to contain_exactly(parent_link1.work_item, parent_link2.work_item) }
- context 'when work_items_hierarchy flag is disabled' do
+ context 'when work_items flag is disabled' do
before do
- stub_feature_flags(work_items_hierarchy: false)
+ stub_feature_flags(work_items: false)
end
it { is_expected.to be_empty }
end
+
+ context 'when work_items flag is enabled for the parent group' do
+ before do
+ stub_feature_flags(work_items: group)
+ end
+
+ it { is_expected.to contain_exactly(parent_link1.work_item, parent_link2.work_item) }
+ end
end
end
diff --git a/spec/models/x509_certificate_spec.rb b/spec/models/x509_certificate_spec.rb
index d3b4470d3f4..5723bd80739 100644
--- a/spec/models/x509_certificate_spec.rb
+++ b/spec/models/x509_certificate_spec.rb
@@ -73,7 +73,9 @@ RSpec.describe X509Certificate do
it 'accepts correct subject_key_identifier' do
subject_key_identifiers = [
'AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB',
- 'CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD'
+ 'CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD',
+ '79:FB:C1:E5:6B:53:8B:0A',
+ '79:fb:c1:e5:6b:53:8b:0a'
]
subject_key_identifiers.each do |identifier|
@@ -83,7 +85,6 @@ RSpec.describe X509Certificate do
it 'rejects invalid subject_key_identifier' do
subject_key_identifiers = [
- 'AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB',
'CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:GG',
'random string',
'12321342545356434523412341245452345623453542345234523453245'
diff --git a/spec/models/x509_issuer_spec.rb b/spec/models/x509_issuer_spec.rb
index f1067cad655..3d04adf7e26 100644
--- a/spec/models/x509_issuer_spec.rb
+++ b/spec/models/x509_issuer_spec.rb
@@ -39,7 +39,9 @@ RSpec.describe X509Issuer do
it 'accepts correct subject_key_identifier' do
subject_key_identifiers = [
'AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB',
- 'CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD'
+ 'CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD',
+ '79:FB:C1:E5:6B:53:8B:0A',
+ '79:fb:c1:e5:6b:53:8b:0a'
]
subject_key_identifiers.each do |identifier|
@@ -49,7 +51,6 @@ RSpec.describe X509Issuer do
it 'rejects invalid subject_key_identifier' do
subject_key_identifiers = [
- 'AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB',
'CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:CD:GG',
'random string',
'12321342545356434523412341245452345623453542345234523453245'
diff --git a/spec/policies/environment_policy_spec.rb b/spec/policies/environment_policy_spec.rb
index 649b1a770c0..701fc7ac9ae 100644
--- a/spec/policies/environment_policy_spec.rb
+++ b/spec/policies/environment_policy_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe EnvironmentPolicy do
with_them do
before do
- project.add_user(user, access_level) unless access_level.nil?
+ project.add_member(user, access_level) unless access_level.nil?
end
it { expect(policy.allowed?(:stop_environment)).to be allowed? }
@@ -49,7 +49,7 @@ RSpec.describe EnvironmentPolicy do
context 'with protected branch' do
with_them do
before do
- project.add_user(user, access_level) unless access_level.nil?
+ project.add_member(user, access_level) unless access_level.nil?
create(:protected_branch, :no_one_can_push,
name: 'master', project: project)
end
@@ -86,7 +86,7 @@ RSpec.describe EnvironmentPolicy do
with_them do
before do
- project.add_user(user, access_level) unless access_level.nil?
+ project.add_member(user, access_level) unless access_level.nil?
end
it { expect(policy.allowed?(:stop_environment)).to be allowed? }
@@ -120,7 +120,7 @@ RSpec.describe EnvironmentPolicy do
with_them do
before do
- project.add_user(user, access_level) unless access_level.nil?
+ project.add_member(user, access_level) unless access_level.nil?
end
it { expect(policy).to be_disallowed :destroy_environment }
diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb
index 04d7eca6f09..da0427420e4 100644
--- a/spec/policies/global_policy_spec.rb
+++ b/spec/policies/global_policy_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe GlobalPolicy do
end
context "for an admin" do
- let(:current_user) { create(:admin) }
+ let_it_be(:current_user) { create(:admin) }
context "when the public level is restricted" do
before do
@@ -118,7 +118,7 @@ RSpec.describe GlobalPolicy do
end
context 'admin' do
- let(:current_user) { create(:user, :admin) }
+ let_it_be(:current_user) { create(:user, :admin) }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:read_custom_attribute) }
@@ -138,7 +138,7 @@ RSpec.describe GlobalPolicy do
end
context 'admin' do
- let(:current_user) { create(:admin) }
+ let_it_be(:current_user) { create(:admin) }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:approve_user) }
@@ -156,7 +156,7 @@ RSpec.describe GlobalPolicy do
end
context 'admin' do
- let(:current_user) { create(:admin) }
+ let_it_be(:current_user) { create(:admin) }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:reject_user) }
@@ -174,7 +174,7 @@ RSpec.describe GlobalPolicy do
end
context 'admin' do
- let(:current_user) { create(:user, :admin) }
+ let_it_be(:current_user) { create(:user, :admin) }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:use_project_statistics_filters) }
@@ -591,4 +591,34 @@ RSpec.describe GlobalPolicy do
it { is_expected.not_to be_allowed(:log_in) }
end
end
+
+ describe 'delete runners' do
+ context 'when anonymous' do
+ let(:current_user) { nil }
+
+ it { is_expected.not_to be_allowed(:delete_runners) }
+ end
+
+ context 'regular user' do
+ it { is_expected.not_to be_allowed(:delete_runners) }
+ end
+
+ context 'when external' do
+ let(:current_user) { build(:user, :external) }
+
+ it { is_expected.not_to be_allowed(:delete_runners) }
+ end
+
+ context 'admin user' do
+ let_it_be(:current_user) { create(:user, :admin) }
+
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:delete_runners) }
+ end
+
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_disallowed(:delete_runners) }
+ end
+ end
+ end
end
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index c513baea517..3ef859376a4 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe GroupPolicy do
include_context 'GroupPolicy context'
+ using RSpec::Parameterized::TableSyntax
context 'public group with no user' do
let(:group) { create(:group, :public, :crm_enabled) }
@@ -1229,4 +1230,30 @@ RSpec.describe GroupPolicy do
it { is_expected.to be_disallowed(:admin_crm_contact) }
it { is_expected.to be_disallowed(:admin_crm_organization) }
end
+
+ describe 'maintain_namespace' do
+ context 'with non-admin roles' do
+ where(:role, :allowed) do
+ :guest | false
+ :reporter | false
+ :developer | false
+ :maintainer | true
+ :owner | true
+ end
+
+ with_them do
+ let(:current_user) { public_send(role) }
+
+ it do
+ expect(subject.allowed?(:maintain_namespace)).to eq allowed
+ end
+ end
+ end
+
+ context 'as an admin', :enable_admin_mode do
+ let(:current_user) { admin }
+
+ it { is_expected.to be_allowed(:maintain_namespace) }
+ end
+ end
end
diff --git a/spec/policies/incident_management/timeline_event_policy_spec.rb b/spec/policies/incident_management/timeline_event_policy_spec.rb
new file mode 100644
index 00000000000..5a659054d7a
--- /dev/null
+++ b/spec/policies/incident_management/timeline_event_policy_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::TimelineEventPolicy, models: true do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:user) { developer }
+ let_it_be(:incident) { create(:incident, project: project, author: user) }
+
+ let_it_be(:editable_timeline_event) do
+ create(:incident_management_timeline_event, :editable, project: project, author: user, incident: incident)
+ end
+
+ let_it_be(:non_editable_timeline_event) do
+ create(:incident_management_timeline_event, :non_editable, project: project, author: user, incident: incident)
+ end
+
+ before do
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ end
+
+ describe '#rules' do
+ subject(:policies) { described_class.new(user, timeline_event) }
+
+ context 'when a user is not able to manage timeline events' do
+ let_it_be(:user) { reporter }
+
+ context 'when timeline event is editable' do
+ let(:timeline_event) { editable_timeline_event }
+
+ it 'does not allow to edit the timeline event' do
+ is_expected.not_to be_allowed(:edit_incident_management_timeline_event)
+ end
+ end
+ end
+
+ context 'when a user is able to manage timeline events' do
+ let_it_be(:user) { developer }
+
+ context 'when timeline event is editable' do
+ let(:timeline_event) { editable_timeline_event }
+
+ it 'allows to edit the timeline event' do
+ is_expected.to be_allowed(:edit_incident_management_timeline_event)
+ end
+ end
+
+ context 'when timeline event is not editable' do
+ let(:timeline_event) { non_editable_timeline_event }
+
+ it 'does not allow to edit the timeline event' do
+ is_expected.not_to be_allowed(:edit_incident_management_timeline_event)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/policies/issue_policy_spec.rb b/spec/policies/issue_policy_spec.rb
index 557bda985af..fefbb59a830 100644
--- a/spec/policies/issue_policy_spec.rb
+++ b/spec/policies/issue_policy_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe IssuePolicy do
let(:reporter_from_group_link) { create(:user) }
let(:non_member) { create(:user) }
let(:support_bot) { User.support_bot }
+ let(:alert_bot) { User.alert_bot }
def permissions(user, issue)
described_class.new(user, issue)
@@ -41,6 +42,14 @@ RSpec.describe IssuePolicy do
end
end
+ shared_examples 'alert bot' do
+ it 'allows alert_bot to read and set metadata on issues' do
+ expect(permissions(alert_bot, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(alert_bot, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(alert_bot, new_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ end
+ end
+
context 'a private project' do
let(:project) { create(:project, :private) }
let(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
@@ -106,6 +115,7 @@ RSpec.describe IssuePolicy do
expect(permissions(non_member, new_issue)).to be_disallowed(:create_issue, :set_issue_metadata, :set_confidentiality)
end
+ it_behaves_like 'alert bot'
it_behaves_like 'support bot with service desk disabled'
it_behaves_like 'support bot with service desk enabled'
@@ -270,6 +280,7 @@ RSpec.describe IssuePolicy do
expect(permissions(support_bot, new_issue)).to be_disallowed(:create_issue, :set_issue_metadata, :set_confidentiality)
end
+ it_behaves_like 'alert bot'
it_behaves_like 'support bot with service desk enabled'
context 'when issues are private' do
@@ -326,6 +337,7 @@ RSpec.describe IssuePolicy do
expect(permissions(non_member, new_issue)).to be_disallowed(:create_issue, :set_issue_metadata, :set_confidentiality)
end
+ it_behaves_like 'alert bot'
it_behaves_like 'support bot with service desk disabled'
it_behaves_like 'support bot with service desk enabled'
end
diff --git a/spec/policies/merge_request_policy_spec.rb b/spec/policies/merge_request_policy_spec.rb
index e05de25f182..dd42e1b9313 100644
--- a/spec/policies/merge_request_policy_spec.rb
+++ b/spec/policies/merge_request_policy_spec.rb
@@ -51,7 +51,8 @@ RSpec.describe MergeRequestPolicy do
end
context 'when merge request is public' do
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: author) }
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: user) }
+ let(:user) { author }
context 'and user is anonymous' do
subject { permissions(nil, merge_request) }
@@ -61,19 +62,62 @@ RSpec.describe MergeRequestPolicy do
end
end
- describe 'the author, who became a guest' do
- subject { permissions(author, merge_request) }
+ context 'and user is author' do
+ subject { permissions(user, merge_request) }
- it do
- is_expected.to be_allowed(:update_merge_request)
+ context 'and the user is a guest' do
+ let(:user) { guest }
+
+ it do
+ is_expected.to be_allowed(:update_merge_request)
+ end
+
+ it do
+ is_expected.to be_allowed(:reopen_merge_request)
+ end
+
+ it do
+ is_expected.to be_allowed(:approve_merge_request)
+ end
end
- it do
- is_expected.to be_allowed(:reopen_merge_request)
+ context 'and the user is a group member' do
+ let(:project) { create(:project, :public, group: group) }
+ let(:group) { create(:group) }
+ let(:user) { non_team_member }
+
+ before do
+ group.add_guest(non_team_member)
+ end
+
+ it do
+ is_expected.to be_allowed(:approve_merge_request)
+ end
end
- it do
- is_expected.to be_allowed(:approve_merge_request)
+ context 'and the user is a member of a shared group' do
+ let(:user) { non_team_member }
+
+ before do
+ group = create(:group)
+ project.project_group_links.create!(
+ group: group,
+ group_access: Gitlab::Access::DEVELOPER)
+
+ group.add_guest(non_team_member)
+ end
+
+ it do
+ is_expected.to be_allowed(:approve_merge_request)
+ end
+ end
+
+ context 'and the user is not a project member' do
+ let(:user) { non_team_member }
+
+ it do
+ is_expected.not_to be_allowed(:approve_merge_request)
+ end
end
end
end
diff --git a/spec/policies/namespace/root_storage_statistics_policy_spec.rb b/spec/policies/namespace/root_storage_statistics_policy_spec.rb
index e6b58bca4a8..89875f83c9b 100644
--- a/spec/policies/namespace/root_storage_statistics_policy_spec.rb
+++ b/spec/policies/namespace/root_storage_statistics_policy_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe Namespace::RootStorageStatisticsPolicy do
with_them do
before do
- group.add_user(user, user_type) unless user_type == :non_member
+ group.add_member(user, user_type) unless user_type == :non_member
end
it { is_expected.to eq(outcome) }
diff --git a/spec/policies/namespaces/user_namespace_policy_spec.rb b/spec/policies/namespaces/user_namespace_policy_spec.rb
index 22c3f6a6d67..e8a3c9b828d 100644
--- a/spec/policies/namespaces/user_namespace_policy_spec.rb
+++ b/spec/policies/namespaces/user_namespace_policy_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Namespaces::UserNamespacePolicy do
let_it_be(:admin) { create(:admin) }
let_it_be(:namespace) { create(:user_namespace, owner: owner) }
- let(:owner_permissions) { [:owner_access, :create_projects, :admin_namespace, :read_namespace, :read_statistics, :transfer_projects, :admin_package] }
+ let(:owner_permissions) { [:owner_access, :create_projects, :admin_namespace, :read_namespace, :read_statistics, :transfer_projects, :admin_package, :maintain_namespace] }
subject { described_class.new(current_user, namespace) }
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index d363a822d18..c041c72a0be 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -612,6 +612,24 @@ RSpec.describe ProjectPolicy do
end
end
+ describe 'create_task' do
+ context 'when user is member of the project' do
+ let(:current_user) { developer }
+
+ context 'when work_items feature flag is enabled' do
+ it { expect_allowed(:create_task) }
+ end
+
+ context 'when work_items feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it { expect_disallowed(:create_task) }
+ end
+ end
+ end
+
describe 'update_max_artifacts_size' do
context 'when no user' do
let(:current_user) { anonymous }
@@ -1462,43 +1480,142 @@ RSpec.describe ProjectPolicy do
end
describe 'view_package_registry_project_settings' do
- context 'with registry enabled' do
+ context 'with packages disabled and' do
before do
- stub_config(registry: { enabled: true })
+ stub_config(packages: { enabled: false })
end
- context 'with an admin user' do
- let(:current_user) { admin }
+ context 'with registry enabled' do
+ before do
+ stub_config(registry: { enabled: true })
+ end
- context 'when admin mode enabled', :enable_admin_mode do
- it { is_expected.to be_allowed(:view_package_registry_project_settings) }
+ context 'with an admin user' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:view_package_registry_project_settings) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
end
- context 'when admin mode disabled' do
- it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ %i[owner maintainer].each do |role|
+ context "with #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_allowed(:view_package_registry_project_settings) }
+ end
+ end
+
+ %i[developer reporter guest non_member anonymous].each do |role|
+ context "with #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
end
end
- %i[owner maintainer].each do |role|
- context "with #{role}" do
- let(:current_user) { public_send(role) }
+ context 'with registry disabled' do
+ before do
+ stub_config(registry: { enabled: false })
+ end
+
+ context 'with admin user' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
- it { is_expected.to be_allowed(:view_package_registry_project_settings) }
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
+ end
+
+ %i[owner maintainer developer reporter guest non_member anonymous].each do |role|
+ context "with #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
end
end
+ end
- %i[developer reporter guest non_member anonymous].each do |role|
- context "with #{role}" do
- let(:current_user) { public_send(role) }
+ context 'with registry disabled and' do
+ before do
+ stub_config(registry: { enabled: false })
+ end
- it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ context 'with packages enabled' do
+ before do
+ stub_config(packages: { enabled: true })
+ end
+
+ context 'with an admin user' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:view_package_registry_project_settings) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
+ end
+
+ %i[owner maintainer].each do |role|
+ context "with #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_allowed(:view_package_registry_project_settings) }
+ end
+ end
+
+ %i[developer reporter guest non_member anonymous].each do |role|
+ context "with #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
+ end
+ end
+
+ context 'with packages disabled' do
+ before do
+ stub_config(packages: { enabled: false })
+ end
+
+ context 'with admin user' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
+ end
+
+ %i[owner maintainer developer reporter guest non_member anonymous].each do |role|
+ context "with #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:view_package_registry_project_settings) }
+ end
end
end
end
- context 'with registry disabled' do
+ context 'with registry & packages both disabled' do
before do
stub_config(registry: { enabled: false })
+ stub_config(packages: { enabled: false })
end
context 'with admin user' do
@@ -1718,7 +1835,7 @@ RSpec.describe ProjectPolicy do
%w(guest reporter developer maintainer).each do |role|
context role do
before do
- project.add_user(current_user, role.to_sym)
+ project.add_member(current_user, role.to_sym)
end
if role == 'guest'
@@ -1752,7 +1869,7 @@ RSpec.describe ProjectPolicy do
%w(guest reporter developer maintainer).each do |role|
context role do
before do
- project.add_user(current_user, role.to_sym)
+ project.add_member(current_user, role.to_sym)
end
it { is_expected.to be_allowed(:read_ci_cd_analytics) }
@@ -1782,7 +1899,7 @@ RSpec.describe ProjectPolicy do
%w(guest reporter developer maintainer).each do |role|
context role do
before do
- project.add_user(current_user, role.to_sym)
+ project.add_member(current_user, role.to_sym)
end
if role == 'guest'
diff --git a/spec/policies/project_statistics_policy_spec.rb b/spec/policies/project_statistics_policy_spec.rb
index 74630dc38ad..56e6161a264 100644
--- a/spec/policies/project_statistics_policy_spec.rb
+++ b/spec/policies/project_statistics_policy_spec.rb
@@ -72,7 +72,7 @@ RSpec.describe ProjectStatisticsPolicy do
before do
unless [:unauthenticated, :non_member].include?(user_type)
- project.add_user(external, user_type)
+ project.add_member(external, user_type)
end
end
diff --git a/spec/policies/work_item_policy_spec.rb b/spec/policies/work_item_policy_spec.rb
index 9cfc4455979..f8ec7d9f9bc 100644
--- a/spec/policies/work_item_policy_spec.rb
+++ b/spec/policies/work_item_policy_spec.rb
@@ -131,4 +131,33 @@ RSpec.describe WorkItemPolicy do
end
end
end
+
+ describe 'admin_parent_link' do
+ context 'when user is reporter' do
+ let(:current_user) { reporter }
+
+ it { is_expected.to be_allowed(:admin_parent_link) }
+ end
+
+ context 'when user is guest' do
+ let(:current_user) { guest }
+
+ it { is_expected.to be_disallowed(:admin_parent_link) }
+
+ context 'when guest authored the work item' do
+ let(:work_item_subject) { authored_work_item }
+ let(:current_user) { guest_author }
+
+ it { is_expected.to be_disallowed(:admin_parent_link) }
+ end
+
+ context 'when guest is assigned to the work item' do
+ before do
+ work_item.assignees = [guest]
+ end
+
+ it { is_expected.to be_disallowed(:admin_parent_link) }
+ end
+ end
+ end
end
diff --git a/spec/presenters/blob_presenter_spec.rb b/spec/presenters/blob_presenter_spec.rb
index 7b7463e6abc..498b2a32a0e 100644
--- a/spec/presenters/blob_presenter_spec.rb
+++ b/spec/presenters/blob_presenter_spec.rb
@@ -106,7 +106,7 @@ RSpec.describe BlobPresenter do
end
describe '#find_file_path' do
- it { expect(presenter.find_file_path).to eq("/#{project.full_path}/-/find_file/HEAD/files/ruby/regex.rb") }
+ it { expect(presenter.find_file_path).to eq("/#{project.full_path}/-/find_file/HEAD") }
end
describe '#blame_path' do
diff --git a/spec/presenters/ci/build_presenter_spec.rb b/spec/presenters/ci/build_presenter_spec.rb
index 1ff2ea3d225..6bf36a52419 100644
--- a/spec/presenters/ci/build_presenter_spec.rb
+++ b/spec/presenters/ci/build_presenter_spec.rb
@@ -29,36 +29,6 @@ RSpec.describe Ci::BuildPresenter do
end
end
- describe '#erased_by_user?' do
- it 'takes a build and optional params' do
- expect(presenter).not_to be_erased_by_user
- end
- end
-
- describe '#erased_by_name' do
- context 'when build is not erased' do
- before do
- expect(presenter).to receive(:erased_by_user?).and_return(false)
- end
-
- it 'returns nil' do
- expect(presenter.erased_by_name).to be_nil
- end
- end
-
- context 'when build is erased' do
- before do
- expect(presenter).to receive(:erased_by_user?).and_return(true)
- expect(build).to receive(:erased_by)
- .and_return(double(:user, name: 'John Doe'))
- end
-
- it 'returns the name of the eraser' do
- expect(presenter.erased_by_name).to eq('John Doe')
- end
- end
- end
-
describe '#status_title' do
context 'when build is auto-canceled' do
before do
@@ -168,58 +138,6 @@ RSpec.describe Ci::BuildPresenter do
end
end
- describe '#tooltip_message' do
- context 'When build has failed' do
- let(:build) { create(:ci_build, :script_failure, pipeline: pipeline) }
-
- it 'returns the reason of failure' do
- tooltip = subject.tooltip_message
-
- expect(tooltip).to eq("#{build.name} - failed - (script failure)")
- end
- end
-
- context 'When build has failed and retried' do
- let(:build) { create(:ci_build, :script_failure, :retried, pipeline: pipeline) }
-
- it 'includes the reason of failure and the retried title' do
- tooltip = subject.tooltip_message
-
- expect(tooltip).to eq("#{build.name} - failed - (script failure) (retried)")
- end
- end
-
- context 'When build has failed and is allowed to' do
- let(:build) { create(:ci_build, :script_failure, :allowed_to_fail, pipeline: pipeline) }
-
- it 'includes the reason of failure' do
- tooltip = subject.tooltip_message
-
- expect(tooltip).to eq("#{build.name} - failed - (script failure) (allowed to fail)")
- end
- end
-
- context 'For any other build (no retried)' do
- let(:build) { create(:ci_build, :success, pipeline: pipeline) }
-
- it 'includes build name and status' do
- tooltip = subject.tooltip_message
-
- expect(tooltip).to eq("#{build.name} - passed")
- end
- end
-
- context 'For any other build (retried)' do
- let(:build) { create(:ci_build, :success, :retried, pipeline: pipeline) }
-
- it 'includes build name and status' do
- tooltip = subject.tooltip_message
-
- expect(tooltip).to eq("#{build.name} - passed (retried)")
- end
- end
- end
-
describe '#execute_in' do
subject { presenter.execute_in }
diff --git a/spec/presenters/ci/legacy_stage_presenter_spec.rb b/spec/presenters/ci/legacy_stage_presenter_spec.rb
deleted file mode 100644
index 5268ef0f246..00000000000
--- a/spec/presenters/ci/legacy_stage_presenter_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Ci::LegacyStagePresenter do
- let(:legacy_stage) { create(:ci_stage) }
- let(:presenter) { described_class.new(legacy_stage) }
-
- let!(:build) { create(:ci_build, :tags, :artifacts, pipeline: legacy_stage.pipeline, stage: legacy_stage.name) }
- let!(:retried_build) { create(:ci_build, :tags, :artifacts, :retried, pipeline: legacy_stage.pipeline, stage: legacy_stage.name) }
-
- before do
- create(:generic_commit_status, pipeline: legacy_stage.pipeline, stage: legacy_stage.name)
- end
-
- describe '#latest_ordered_statuses' do
- subject(:latest_ordered_statuses) { presenter.latest_ordered_statuses }
-
- it 'preloads build tags' do
- expect(latest_ordered_statuses.second.association(:tags)).to be_loaded
- end
-
- it 'preloads build artifacts archive' do
- expect(latest_ordered_statuses.second.association(:job_artifacts_archive)).to be_loaded
- end
-
- it 'preloads build artifacts metadata' do
- expect(latest_ordered_statuses.second.association(:metadata)).to be_loaded
- end
- end
-
- describe '#retried_ordered_statuses' do
- subject(:retried_ordered_statuses) { presenter.retried_ordered_statuses }
-
- it 'preloads build tags' do
- expect(retried_ordered_statuses.first.association(:tags)).to be_loaded
- end
-
- it 'preloads build artifacts archive' do
- expect(retried_ordered_statuses.first.association(:job_artifacts_archive)).to be_loaded
- end
-
- it 'preloads build artifacts metadata' do
- expect(retried_ordered_statuses.first.association(:metadata)).to be_loaded
- end
- end
-end
diff --git a/spec/presenters/clusters/cluster_presenter_spec.rb b/spec/presenters/clusters/cluster_presenter_spec.rb
index 6570ab56ed0..7349f444fac 100644
--- a/spec/presenters/clusters/cluster_presenter_spec.rb
+++ b/spec/presenters/clusters/cluster_presenter_spec.rb
@@ -148,84 +148,4 @@ RSpec.describe Clusters::ClusterPresenter do
it_behaves_like 'cluster health data'
end
end
-
- describe '#gitlab_managed_apps_logs_path' do
- context 'user can read logs' do
- let(:project) { cluster.project }
-
- before do
- project.add_maintainer(user)
- end
-
- it 'returns path to logs' do
- expect(presenter.gitlab_managed_apps_logs_path).to eq k8s_project_logs_path(project, cluster_id: cluster.id, format: :json)
- end
-
- context 'cluster has elastic stack integration enabled' do
- before do
- create(:clusters_integrations_elastic_stack, cluster: cluster)
- end
-
- it 'returns path to logs' do
- expect(presenter.gitlab_managed_apps_logs_path).to eq elasticsearch_project_logs_path(project, cluster_id: cluster.id, format: :json)
- end
- end
- end
-
- context 'group cluster' do
- let(:cluster) { create(:cluster, cluster_type: :group_type, groups: [group]) }
- let(:group) { create(:group, name: 'Foo') }
-
- context 'user can read logs' do
- before do
- group.add_maintainer(user)
- end
-
- context 'there are projects within group' do
- let!(:project) { create(:project, namespace: group) }
-
- it 'returns path to logs' do
- expect(presenter.gitlab_managed_apps_logs_path).to eq k8s_project_logs_path(project, cluster_id: cluster.id, format: :json)
- end
- end
-
- context 'there are no projects within group' do
- it 'returns nil' do
- expect(presenter.gitlab_managed_apps_logs_path).to be_nil
- end
- end
- end
- end
-
- context 'instance cluster' do
- let(:cluster) { create(:cluster, cluster_type: :instance_type) }
- let!(:project) { create(:project) }
- let(:user) { create(:admin) }
-
- before do
- project.add_maintainer(user)
- stub_application_setting(admin_mode: false)
- end
-
- context 'user can read logs' do
- it 'returns path to logs' do
- expect(presenter.gitlab_managed_apps_logs_path).to eq k8s_project_logs_path(project, cluster_id: cluster.id, format: :json)
- end
- end
- end
-
- context 'user can NOT read logs' do
- let(:cluster) { create(:cluster, cluster_type: :instance_type) }
- let!(:project) { create(:project) }
-
- before do
- project.add_developer(user)
- stub_application_setting(admin_mode: false)
- end
-
- it 'returns nil' do
- expect(presenter.gitlab_managed_apps_logs_path).to be_nil
- end
- end
- end
end
diff --git a/spec/presenters/gitlab/blame_presenter_spec.rb b/spec/presenters/gitlab/blame_presenter_spec.rb
index ff128416692..b3b9e133a73 100644
--- a/spec/presenters/gitlab/blame_presenter_spec.rb
+++ b/spec/presenters/gitlab/blame_presenter_spec.rb
@@ -8,8 +8,9 @@ RSpec.describe Gitlab::BlamePresenter do
let(:commit) { project.commit('master') }
let(:blob) { project.repository.blob_at(commit.id, path) }
let(:blame) { Gitlab::Blame.new(blob, commit) }
+ let(:page) { 1 }
- subject { described_class.new(blame, project: project, path: path) }
+ subject { described_class.new(blame, project: project, path: path, page: page) }
it 'precalculates necessary data on init' do
expect_any_instance_of(described_class)
diff --git a/spec/requests/admin/background_migrations_controller_spec.rb b/spec/requests/admin/background_migrations_controller_spec.rb
index 884448fdd95..fe2a2470511 100644
--- a/spec/requests/admin/background_migrations_controller_spec.rb
+++ b/spec/requests/admin/background_migrations_controller_spec.rb
@@ -97,6 +97,7 @@ RSpec.describe Admin::BackgroundMigrationsController, :enable_admin_mode do
describe 'POST #retry' do
let(:migration) { create(:batched_background_migration, :failed) }
+ let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
before do
create(:batched_background_migration_job, :failed, batched_migration: migration, batch_size: 10, min_value: 6, max_value: 15, attempts: 3)
@@ -107,7 +108,8 @@ RSpec.describe Admin::BackgroundMigrationsController, :enable_admin_mode do
anything,
batch_min_value: 6,
batch_size: 5,
- job_arguments: migration.job_arguments
+ job_arguments: migration.job_arguments,
+ job_class: job_class
).and_return([6, 10])
end
end
diff --git a/spec/requests/api/api_spec.rb b/spec/requests/api/api_spec.rb
index df9be2616c5..b6cb790bb71 100644
--- a/spec/requests/api/api_spec.rb
+++ b/spec/requests/api/api_spec.rb
@@ -133,7 +133,7 @@ RSpec.describe API::API do
'meta.caller_id' => 'GET /api/:version/broadcast_messages',
'meta.remote_ip' => an_instance_of(String),
'meta.client_id' => a_string_matching(%r{\Aip/.+}),
- 'meta.feature_category' => 'navigation',
+ 'meta.feature_category' => 'onboarding',
'route' => '/api/:version/broadcast_messages')
expect(data.stringify_keys).not_to include('meta.project', 'meta.root_namespace', 'meta.user')
@@ -209,7 +209,7 @@ RSpec.describe API::API do
'meta.caller_id' => 'GET /api/:version/broadcast_messages',
'meta.remote_ip' => an_instance_of(String),
'meta.client_id' => a_string_matching(%r{\Aip/.+}),
- 'meta.feature_category' => 'navigation',
+ 'meta.feature_category' => 'onboarding',
'route' => '/api/:version/broadcast_messages')
expect(data.stringify_keys).not_to include('meta.project', 'meta.root_namespace', 'meta.user')
diff --git a/spec/requests/api/award_emoji_spec.rb b/spec/requests/api/award_emoji_spec.rb
index 782e14593f7..67ddaf2fda5 100644
--- a/spec/requests/api/award_emoji_spec.rb
+++ b/spec/requests/api/award_emoji_spec.rb
@@ -3,8 +3,8 @@
require 'spec_helper'
RSpec.describe API::AwardEmoji do
+ let_it_be_with_reload(:project) { create(:project, :private) }
let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
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) }
@@ -16,10 +16,46 @@ RSpec.describe API::AwardEmoji do
project.add_maintainer(user)
end
+ shared_examples 'request with insufficient permissions' do |request_method|
+ let(:request_params) { {} }
+
+ context 'when user is not signed in' do
+ it 'returns 404' do
+ process request_method, api(request_path), params: request_params
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when user does not have access' do
+ it 'returns 404' do
+ other_user = create(:user)
+
+ process request_method, api(request_path, other_user), params: request_params
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ shared_examples 'unauthenticated request to public awardable' do
+ before do
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
+ end
+
+ it 'returns the awarded emoji' do
+ get api(request_path)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
describe "GET /projects/:id/awardable/:awardable_id/award_emoji" do
context 'on an issue' do
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/award_emoji" }
+
it "returns an array of award_emoji" do
- get api("/projects/#{project.id}/issues/#{issue.iid}/award_emoji", user)
+ get api(request_path, user)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Array
@@ -48,6 +84,9 @@ RSpec.describe API::AwardEmoji do
expect(response).to have_gitlab_http_status(:not_found)
end
+
+ it_behaves_like 'unauthenticated request to public awardable'
+ it_behaves_like 'request with insufficient permissions', :get
end
context 'on a merge request' do
@@ -73,34 +112,30 @@ RSpec.describe API::AwardEmoji do
expect(json_response.first['name']).to eq(award.name)
end
end
-
- context 'when the user has no access' do
- it 'returns a status code 404' do
- user1 = create(:user)
-
- get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/award_emoji", user1)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
end
describe 'GET /projects/:id/awardable/:awardable_id/notes/:note_id/award_emoji' do
- let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket') }
+ let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket') }
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji" }
it 'returns an array of award emoji' do
- get api("/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji", user)
+ get api(request_path, user)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Array
expect(json_response.first['name']).to eq(rocket.name)
end
+
+ it_behaves_like 'unauthenticated request to public awardable'
+ it_behaves_like 'request with insufficient permissions', :get
end
describe "GET /projects/:id/awardable/:awardable_id/award_emoji/:award_id" do
context 'on an issue' do
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/award_emoji/#{award_emoji.id}" }
+
it "returns the award emoji" do
- get api("/projects/#{project.id}/issues/#{issue.iid}/award_emoji/#{award_emoji.id}", user)
+ get api(request_path, user)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq(award_emoji.name)
@@ -113,6 +148,9 @@ RSpec.describe API::AwardEmoji do
expect(response).to have_gitlab_http_status(:not_found)
end
+
+ it_behaves_like 'unauthenticated request to public awardable'
+ it_behaves_like 'request with insufficient permissions', :get
end
context 'on a merge request' do
@@ -139,28 +177,22 @@ RSpec.describe API::AwardEmoji do
expect(json_response['awardable_type']).to eq("Snippet")
end
end
-
- context 'when the user has no access' do
- it 'returns a status code 404' do
- user1 = create(:user)
-
- get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/award_emoji/#{downvote.id}", user1)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
end
describe 'GET /projects/:id/awardable/:awardable_id/notes/:note_id/award_emoji/:award_id' do
- let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket') }
+ let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket') }
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji/#{rocket.id}" }
it 'returns an award emoji' do
- get api("/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji/#{rocket.id}", user)
+ get api(request_path, user)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).not_to be_an Array
expect(json_response['name']).to eq(rocket.name)
end
+
+ it_behaves_like 'unauthenticated request to public awardable'
+ it_behaves_like 'request with insufficient permissions', :get
end
describe "POST /projects/:id/awardable/:awardable_id/award_emoji" do
@@ -189,12 +221,6 @@ RSpec.describe API::AwardEmoji do
expect(response).to have_gitlab_http_status(:bad_request)
end
- it "returns a 401 unauthorized error if the user is not authenticated" do
- post api("/projects/#{project.id}/issues/#{issue.iid}/award_emoji"), params: { name: 'thumbsup' }
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
it "normalizes +1 as thumbsup award" do
post api("/projects/#{project.id}/issues/#{issue.iid}/award_emoji", user), params: { name: '+1' }
@@ -223,6 +249,11 @@ RSpec.describe API::AwardEmoji do
expect(json_response['user']['username']).to eq(user.username)
end
end
+
+ it_behaves_like 'request with insufficient permissions', :post do
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/award_emoji" }
+ let(:request_params) { { name: 'blowfish' } }
+ end
end
describe "POST /projects/:id/awardable/:awardable_id/notes/:note_id/award_emoji" do
@@ -260,6 +291,11 @@ RSpec.describe API::AwardEmoji do
expect(json_response["message"]).to match("has already been taken")
end
end
+
+ it_behaves_like 'request with insufficient permissions', :post do
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji" }
+ let(:request_params) { { name: 'rocket' } }
+ end
end
describe 'DELETE /projects/:id/awardable/:awardable_id/award_emoji/:award_id' do
@@ -319,9 +355,13 @@ RSpec.describe API::AwardEmoji do
let(:request) { api("/projects/#{project.id}/snippets/#{snippet.id}/award_emoji/#{award.id}", user) }
end
end
+
+ it_behaves_like 'request with insufficient permissions', :delete do
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/award_emoji/#{award_emoji.id}" }
+ end
end
- describe 'DELETE /projects/:id/awardable/:awardable_id/award_emoji/:award_emoji_id' do
+ describe 'DELETE /projects/:id/awardable/:awardable_id/notes/:note_id/award_emoji/:award_id' do
let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket', user: user) }
it 'deletes the award' do
@@ -335,5 +375,9 @@ RSpec.describe API::AwardEmoji do
it_behaves_like '412 response' do
let(:request) { api("/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji/#{rocket.id}", user) }
end
+
+ it_behaves_like 'request with insufficient permissions', :delete do
+ let(:request_path) { "/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji/#{rocket.id}" }
+ end
end
end
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 3c6f9ac2816..746be1ccc44 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -216,13 +216,17 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(json_response['token']).to eq(job.token)
expect(json_response['job_info']).to eq(expected_job_info)
expect(json_response['git_info']).to eq(expected_git_info)
- expect(json_response['image']).to eq({ 'name' => 'image:1.0', 'entrypoint' => '/bin/sh', 'ports' => [], 'pull_policy' => nil })
- expect(json_response['services']).to eq([{ 'name' => 'postgres', 'entrypoint' => nil,
- 'alias' => nil, 'command' => nil, 'ports' => [], 'variables' => nil },
- { 'name' => 'docker:stable-dind', 'entrypoint' => '/bin/sh',
- 'alias' => 'docker', 'command' => 'sleep 30', 'ports' => [], 'variables' => [] },
- { 'name' => 'mysql:latest', 'entrypoint' => nil,
- 'alias' => nil, 'command' => nil, 'ports' => [], 'variables' => [{ 'key' => 'MYSQL_ROOT_PASSWORD', 'value' => 'root123.' }] }])
+ expect(json_response['image']).to eq(
+ { 'name' => 'image:1.0', 'entrypoint' => '/bin/sh', 'ports' => [], 'pull_policy' => nil }
+ )
+ expect(json_response['services']).to eq([
+ { 'name' => 'postgres', 'entrypoint' => nil, 'alias' => nil, 'command' => nil, 'ports' => [],
+ 'variables' => nil, 'pull_policy' => nil },
+ { 'name' => 'docker:stable-dind', 'entrypoint' => '/bin/sh', 'alias' => 'docker', 'command' => 'sleep 30',
+ 'ports' => [], 'variables' => [], 'pull_policy' => nil },
+ { 'name' => 'mysql:latest', 'entrypoint' => nil, 'alias' => nil, 'command' => nil, 'ports' => [],
+ 'variables' => [{ 'key' => 'MYSQL_ROOT_PASSWORD', 'value' => 'root123.' }], 'pull_policy' => nil }
+ ])
expect(json_response['steps']).to eq(expected_steps)
expect(json_response['artifacts']).to eq(expected_artifacts)
expect(json_response['cache']).to match(expected_cache)
@@ -542,7 +546,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
let!(:job) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0) }
let!(:job2) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'rubocop', stage: 'test', stage_idx: 0) }
let!(:test_job) do
- create(:ci_build, :pending, :queued, pipeline: pipeline, token: 'test-job-token', name: 'deploy',
+ create(:ci_build, :pending, :queued, pipeline: pipeline, name: 'deploy',
stage: 'deploy', stage_idx: 1,
options: { script: ['bash'], dependencies: [job2.name] })
end
@@ -566,7 +570,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
let!(:job) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0) }
let!(:job2) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'rubocop', stage: 'test', stage_idx: 0) }
let!(:empty_dependencies_job) do
- create(:ci_build, :pending, :queued, pipeline: pipeline, token: 'test-job-token', name: 'empty_dependencies_job',
+ create(:ci_build, :pending, :queued, pipeline: pipeline, name: 'empty_dependencies_job',
stage: 'deploy', stage_idx: 1,
options: { script: ['bash'], dependencies: [] })
end
@@ -671,14 +675,6 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
end
- context 'when variables are stored in trigger_request' do
- before do
- trigger_request.update_attribute(:variables, { TRIGGER_KEY_1: 'TRIGGER_VALUE_1' } )
- end
-
- it_behaves_like 'expected variables behavior'
- end
-
context 'when variables are stored in pipeline_variables' do
before do
create(:ci_pipeline_variable, pipeline: pipeline, key: :TRIGGER_KEY_1, value: 'TRIGGER_VALUE_1')
@@ -849,10 +845,51 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
end
+ context 'when service has pull_policy' do
+ let(:job) { create(:ci_build, :pending, :queued, pipeline: pipeline, options: options) }
+
+ let(:options) do
+ {
+ services: [{
+ name: 'postgres:11.9',
+ pull_policy: ['if-not-present']
+ }]
+ }
+ end
+
+ it 'returns the service with pull policy' do
+ request_job
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response).to include(
+ 'id' => job.id,
+ 'services' => [{ 'alias' => nil, 'command' => nil, 'entrypoint' => nil, 'name' => 'postgres:11.9',
+ 'ports' => [], 'pull_policy' => ['if-not-present'], 'variables' => [] }]
+ )
+ end
+
+ context 'when the FF ci_docker_image_pull_policy is disabled' do
+ before do
+ stub_feature_flags(ci_docker_image_pull_policy: false)
+ end
+
+ it 'returns the service without pull policy' do
+ request_job
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response).to include(
+ 'id' => job.id,
+ 'services' => [{ 'alias' => nil, 'command' => nil, 'entrypoint' => nil, 'name' => 'postgres:11.9',
+ 'ports' => [], 'variables' => [] }]
+ )
+ end
+ end
+ end
+
describe 'a job with excluded artifacts' do
context 'when excluded paths are defined' do
let(:job) do
- create(:ci_build, :pending, :queued, pipeline: pipeline, token: 'test-job-token', name: 'test',
+ create(:ci_build, :pending, :queued, pipeline: pipeline, name: 'test',
stage: 'deploy', stage_idx: 1,
options: { artifacts: { paths: ['abc'], exclude: ['cde'] } })
end
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
index 67c2ec91540..9ef845f06bf 100644
--- a/spec/requests/api/commits_spec.rb
+++ b/spec/requests/api/commits_spec.rb
@@ -392,14 +392,25 @@ RSpec.describe API::Commits do
end
end
- context 'when using warden' do
- it 'increments usage counters', :clean_gitlab_redis_sessions do
- stub_session('warden.user.user.key' => [[user.id], user.encrypted_password[0, 29]])
+ context 'when using warden', :snowplow, :clean_gitlab_redis_sessions do
+ before do
+ stub_session('warden.user.user.key' => [[user.id], user.authenticatable_salt])
+ end
+
+ subject { post api(url), params: valid_c_params }
+ it 'increments usage counters' do
expect(::Gitlab::UsageDataCounters::WebIdeCounter).to receive(:increment_commits_count)
expect(::Gitlab::UsageDataCounters::EditorUniqueCounter).to receive(:track_web_ide_edit_action)
- post api(url), params: valid_c_params
+ subject
+ end
+
+ it_behaves_like 'Snowplow event tracking' do
+ let(:namespace) { project.namespace }
+ let(:category) { 'ide_edit' }
+ let(:action) { 'g_edit_by_web_ide' }
+ let(:feature_flag_name) { :route_hll_to_snowplow_phase2 }
end
end
diff --git a/spec/requests/api/conan_instance_packages_spec.rb b/spec/requests/api/conan_instance_packages_spec.rb
index ff3b332c620..54cad3093d7 100644
--- a/spec/requests/api/conan_instance_packages_spec.rb
+++ b/spec/requests/api/conan_instance_packages_spec.rb
@@ -17,6 +17,12 @@ RSpec.describe API::ConanInstancePackages do
let_it_be(:url) { '/packages/conan/v1/conans/search' }
it_behaves_like 'conan search endpoint'
+
+ it_behaves_like 'conan FIPS mode' do
+ let(:params) { { q: package.conan_recipe } }
+
+ subject { get api(url), params: params }
+ end
end
describe 'GET /api/v4/packages/conan/v1/users/authenticate' do
diff --git a/spec/requests/api/conan_project_packages_spec.rb b/spec/requests/api/conan_project_packages_spec.rb
index c108f2efaaf..e28105eb8eb 100644
--- a/spec/requests/api/conan_project_packages_spec.rb
+++ b/spec/requests/api/conan_project_packages_spec.rb
@@ -17,6 +17,12 @@ RSpec.describe API::ConanProjectPackages do
let(:url) { "/projects/#{project.id}/packages/conan/v1/conans/search" }
it_behaves_like 'conan search endpoint'
+
+ it_behaves_like 'conan FIPS mode' do
+ let(:params) { { q: package.conan_recipe } }
+
+ subject { get api(url), params: params }
+ end
end
describe 'GET /api/v4/projects/:id/packages/conan/v1/users/authenticate' do
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb
index 93f21c880a4..a35c1630caa 100644
--- a/spec/requests/api/environments_spec.rb
+++ b/spec/requests/api/environments_spec.rb
@@ -26,90 +26,7 @@ RSpec.describe API::Environments do
expect(json_response.first['tier']).to eq(environment.tier)
expect(json_response.first['external_url']).to eq(environment.external_url)
expect(json_response.first['project']).to match_schema('public_api/v4/project')
- expect(json_response.first['enable_advanced_logs_querying']).to eq(false)
expect(json_response.first).not_to have_key('last_deployment')
- expect(json_response.first).not_to have_key('gitlab_managed_apps_logs_path')
- end
-
- context 'when the user can read pod logs' do
- context 'with successful deployment on cluster' do
- let_it_be(:deployment) { create(:deployment, :on_cluster, :success, environment: environment, project: project) }
-
- it 'returns environment with enable_advanced_logs_querying and logs_api_path' do
- get api("/projects/#{project.id}/environments", user)
-
- 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.first['gitlab_managed_apps_logs_path']).to eq(
- "/#{project.full_path}/-/logs/k8s.json?cluster_id=#{deployment.cluster_id}"
- )
- end
- end
-
- context 'when elastic stack is available' do
- before do
- allow_next_found_instance_of(Environment) do |env|
- allow(env).to receive(:elastic_stack_available?).and_return(true)
- end
- end
-
- it 'returns environment with enable_advanced_logs_querying and logs_api_path' do
- get api("/projects/#{project.id}/environments", user)
-
- 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.first['enable_advanced_logs_querying']).to eq(true)
- expect(json_response.first['logs_api_path']).to eq(
- "/#{project.full_path}/-/logs/elasticsearch.json?environment_name=#{environment.name}"
- )
- end
- end
-
- context 'when elastic stack is not available' do
- before do
- allow_next_found_instance_of(Environment) do |env|
- allow(env).to receive(:elastic_stack_available?).and_return(false)
- end
- end
-
- it 'returns environment with enable_advanced_logs_querying logs_api_path' do
- get api("/projects/#{project.id}/environments", user)
-
- 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.first['enable_advanced_logs_querying']).to eq(false)
- expect(json_response.first['logs_api_path']).to eq(
- "/#{project.full_path}/-/logs/k8s.json?environment_name=#{environment.name}"
- )
- end
- end
- end
-
- context 'when the user cannot read pod logs' do
- before do
- allow_next_found_instance_of(User) do |user|
- allow(user).to receive(:can?).and_call_original
- allow(user).to receive(:can?).with(:read_pod_logs, project).and_return(false)
- end
- end
-
- it 'does not contain enable_advanced_logs_querying' do
- get api("/projects/#{project.id}/environments", user)
-
- 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.first).not_to have_key('enable_advanced_logs_querying')
- expect(json_response.first).not_to have_key('logs_api_path')
- expect(json_response.first).not_to have_key('gitlab_managed_apps_logs_path')
- end
end
context 'when filtering' do
diff --git a/spec/requests/api/events_spec.rb b/spec/requests/api/events_spec.rb
index 110d6e2f99e..d6c3999f22f 100644
--- a/spec/requests/api/events_spec.rb
+++ b/spec/requests/api/events_spec.rb
@@ -173,7 +173,7 @@ RSpec.describe API::Events do
let(:second_note) { create(:note_on_issue, project: create(:project)) }
before do
- second_note.project.add_user(user, :developer)
+ second_note.project.add_member(user, :developer)
[second_note].each do |note|
EventCreateService.new.leave_note(note, user)
diff --git a/spec/requests/api/feature_flags_user_lists_spec.rb b/spec/requests/api/feature_flags_user_lists_spec.rb
index e2a3f92df10..bfc57042ff4 100644
--- a/spec/requests/api/feature_flags_user_lists_spec.rb
+++ b/spec/requests/api/feature_flags_user_lists_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe API::FeatureFlagsUserLists do
let_it_be(:project, refind: true) { create(:project) }
+ let_it_be(:client, refind: true) { create(:operations_feature_flags_client, project: project) }
let_it_be(:developer) { create(:user) }
let_it_be(:reporter) { create(:user) }
@@ -215,6 +216,7 @@ RSpec.describe API::FeatureFlagsUserLists do
}
expect(response).to have_gitlab_http_status(:forbidden)
+ expect(client.reload.last_feature_flag_updated_at).to be_nil
end
it 'creates the flag' do
@@ -231,6 +233,7 @@ RSpec.describe API::FeatureFlagsUserLists do
})
expect(project.operations_feature_flags_user_lists.count).to eq(1)
expect(project.operations_feature_flags_user_lists.last.name).to eq('mylist')
+ expect(client.reload.last_feature_flag_updated_at).not_to be_nil
end
it 'requires name' do
@@ -298,6 +301,7 @@ RSpec.describe API::FeatureFlagsUserLists do
}
expect(response).to have_gitlab_http_status(:forbidden)
+ expect(client.reload.last_feature_flag_updated_at).to be_nil
end
it 'updates the list' do
@@ -313,6 +317,7 @@ RSpec.describe API::FeatureFlagsUserLists do
'user_xids' => '456,789'
})
expect(list.reload.name).to eq('mylist')
+ expect(client.reload.last_feature_flag_updated_at).not_to be_nil
end
it 'preserves attributes not listed in the request' do
@@ -377,6 +382,7 @@ RSpec.describe API::FeatureFlagsUserLists do
expect(response).to have_gitlab_http_status(:not_found)
expect(json_response).to eq({ 'message' => '404 Not found' })
+ expect(client.reload.last_feature_flag_updated_at).to be_nil
end
it 'deletes the list' do
@@ -387,6 +393,7 @@ RSpec.describe API::FeatureFlagsUserLists do
expect(response).to have_gitlab_http_status(:no_content)
expect(response.body).to be_blank
expect(project.operations_feature_flags_user_lists.count).to eq(0)
+ expect(client.reload.last_feature_flag_updated_at).not_to be_nil
end
it 'does not delete the list if it is associated with a strategy' do
diff --git a/spec/requests/api/geo_spec.rb b/spec/requests/api/geo_spec.rb
index edbca5eb1c6..4e77fa9405c 100644
--- a/spec/requests/api/geo_spec.rb
+++ b/spec/requests/api/geo_spec.rb
@@ -10,12 +10,24 @@ RSpec.describe API::Geo do
include_context 'workhorse headers'
+ let(:non_proxy_response_schema) do
+ {
+ 'type' => 'object',
+ 'additionalProperties' => false,
+ 'required' => %w(geo_enabled),
+ 'properties' => {
+ 'geo_enabled' => { 'type' => 'boolean' }
+ }
+ }
+ end
+
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
+ expect(json_response).to match_schema(non_proxy_response_schema)
+ expect(json_response['geo_enabled']).to be_falsey
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 eb206465bce..39ff108a9e1 100644
--- a/spec/requests/api/graphql/boards/board_lists_query_spec.rb
+++ b/spec/requests/api/graphql/boards/board_lists_query_spec.rb
@@ -96,7 +96,8 @@ RSpec.describe 'get board lists' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { }
+ include_context 'no sort argument'
+
let(:first_param) { 2 }
let(:all_records) { lists.map { |list| a_graphql_entity_for(list) } }
end
diff --git a/spec/requests/api/graphql/ci/group_variables_spec.rb b/spec/requests/api/graphql/ci/group_variables_spec.rb
new file mode 100644
index 00000000000..5ea6646ec2c
--- /dev/null
+++ b/spec/requests/api/graphql/ci/group_variables_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Query.group(fullPath).ciVariables' do
+ include GraphqlHelpers
+
+ let_it_be(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+
+ let(:query) do
+ %(
+ query {
+ group(fullPath: "#{group.full_path}") {
+ ciVariables {
+ nodes {
+ id
+ key
+ value
+ variableType
+ protected
+ masked
+ raw
+ environmentScope
+ }
+ }
+ }
+ }
+ )
+ end
+
+ context 'when the user can administer the group' do
+ before do
+ group.add_owner(user)
+ end
+
+ it "returns the group's CI variables" do
+ variable = create(:ci_group_variable, group: group, key: 'TEST_VAR', value: 'test',
+ masked: false, protected: true, raw: true, environment_scope: 'staging')
+
+ post_graphql(query, current_user: user)
+
+ expect(graphql_data.dig('group', 'ciVariables', 'nodes')).to contain_exactly({
+ 'id' => variable.to_global_id.to_s,
+ 'key' => 'TEST_VAR',
+ 'value' => 'test',
+ 'variableType' => 'ENV_VAR',
+ 'masked' => false,
+ 'protected' => true,
+ 'raw' => true,
+ 'environmentScope' => 'staging'
+ })
+ end
+ end
+
+ context 'when the user cannot administer the group' do
+ it 'returns nothing' do
+ create(:ci_group_variable, group: group, value: 'verysecret', masked: true)
+
+ group.add_developer(user)
+
+ post_graphql(query, current_user: user)
+
+ expect(graphql_data.dig('group', 'ciVariables')).to be_nil
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/ci/instance_variables_spec.rb b/spec/requests/api/graphql/ci/instance_variables_spec.rb
new file mode 100644
index 00000000000..7acf73a4e7a
--- /dev/null
+++ b/spec/requests/api/graphql/ci/instance_variables_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Query.ciVariables' do
+ include GraphqlHelpers
+
+ let(:query) do
+ %(
+ query {
+ ciVariables {
+ nodes {
+ id
+ key
+ value
+ variableType
+ protected
+ masked
+ raw
+ environmentScope
+ }
+ }
+ }
+ )
+ end
+
+ context 'when the user is an admin' do
+ let_it_be(:user) { create(:admin) }
+
+ it "returns the instance's CI variables" do
+ variable = create(:ci_instance_variable, key: 'TEST_VAR', value: 'test',
+ masked: false, protected: true, raw: true)
+
+ post_graphql(query, current_user: user)
+
+ expect(graphql_data.dig('ciVariables', 'nodes')).to contain_exactly({
+ 'id' => variable.to_global_id.to_s,
+ 'key' => 'TEST_VAR',
+ 'value' => 'test',
+ 'variableType' => 'ENV_VAR',
+ 'masked' => false,
+ 'protected' => true,
+ 'raw' => true,
+ 'environmentScope' => nil
+ })
+ end
+ end
+
+ context 'when the user is not an admin' do
+ let_it_be(:user) { create(:user) }
+
+ it 'returns nothing' do
+ create(:ci_instance_variable, value: 'verysecret', masked: true)
+
+ post_graphql(query, current_user: user)
+
+ expect(graphql_data.dig('ciVariables')).to be_nil
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/ci/job_spec.rb b/spec/requests/api/graphql/ci/job_spec.rb
index 2fb90dcd92b..3721155c71b 100644
--- a/spec/requests/api/graphql/ci/job_spec.rb
+++ b/spec/requests/api/graphql/ci/job_spec.rb
@@ -13,8 +13,8 @@ RSpec.describe 'Query.project(fullPath).pipelines.job(id)' do
let_it_be(:project) { create(:project, :repository, :public) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
- let_it_be(:prepare_stage) { create(:ci_stage_entity, pipeline: pipeline, project: project, name: 'prepare') }
- let_it_be(:test_stage) { create(:ci_stage_entity, pipeline: pipeline, project: project, name: 'test') }
+ let_it_be(:prepare_stage) { create(:ci_stage, pipeline: pipeline, project: project, name: 'prepare') }
+ let_it_be(:test_stage) { create(:ci_stage, pipeline: pipeline, project: project, name: 'test') }
let_it_be(:job_1) { create(:ci_build, pipeline: pipeline, stage: 'prepare', name: 'Job 1') }
let_it_be(:job_2) { create(:ci_build, pipeline: pipeline, stage: 'test', name: 'Job 2') }
diff --git a/spec/requests/api/graphql/ci/jobs_spec.rb b/spec/requests/api/graphql/ci/jobs_spec.rb
index d1737fc22ae..8c4ab13fc35 100644
--- a/spec/requests/api/graphql/ci/jobs_spec.rb
+++ b/spec/requests/api/graphql/ci/jobs_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe 'Query.project.pipeline' do
describe '.stages.groups.jobs' do
let(:pipeline) do
pipeline = create(:ci_pipeline, project: project, user: user)
- stage = create(:ci_stage_entity, project: project, pipeline: pipeline, name: 'first', position: 1)
+ stage = create(:ci_stage, project: project, pipeline: pipeline, name: 'first', position: 1)
create(:ci_build, stage_id: stage.id, pipeline: pipeline, name: 'my test job', scheduling_type: :stage)
pipeline
@@ -84,8 +84,8 @@ RSpec.describe 'Query.project.pipeline' do
context 'when there is more than one stage and job needs' do
before do
- build_stage = create(:ci_stage_entity, position: 2, name: 'build', project: project, pipeline: pipeline)
- test_stage = create(:ci_stage_entity, position: 3, name: 'test', project: project, pipeline: pipeline)
+ build_stage = create(:ci_stage, position: 2, name: 'build', project: project, pipeline: pipeline)
+ test_stage = create(:ci_stage, position: 3, name: 'test', project: project, pipeline: pipeline)
create(:ci_build, pipeline: pipeline, name: 'docker 1 2', scheduling_type: :stage, stage: build_stage, stage_idx: build_stage.position)
create(:ci_build, pipeline: pipeline, name: 'docker 2 2', stage: build_stage, stage_idx: build_stage.position, scheduling_type: :dag)
diff --git a/spec/requests/api/graphql/ci/manual_variables_spec.rb b/spec/requests/api/graphql/ci/manual_variables_spec.rb
new file mode 100644
index 00000000000..b7aa76511a3
--- /dev/null
+++ b/spec/requests/api/graphql/ci/manual_variables_spec.rb
@@ -0,0 +1,95 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Query.project(fullPath).pipelines.jobs.manualVariables' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+ let_it_be(:user) { create(:user) }
+
+ let(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ pipelines {
+ nodes {
+ jobs {
+ nodes {
+ manualVariables {
+ nodes {
+ key
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ )
+ end
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'returns the manual variables for the jobs' do
+ job = create(:ci_build, :manual, pipeline: pipeline)
+ create(:ci_job_variable, key: 'MANUAL_TEST_VAR', job: job)
+
+ post_graphql(query, current_user: user)
+
+ variables_data = graphql_data.dig('project', 'pipelines', 'nodes').first
+ .dig('jobs', 'nodes').flat_map { |job| job.dig('manualVariables', 'nodes') }
+ expect(variables_data.map { |var| var['key'] }).to match_array(['MANUAL_TEST_VAR'])
+ end
+
+ it 'does not fetch job variables for jobs that are not manual' do
+ job = create(:ci_build, pipeline: pipeline)
+ create(:ci_job_variable, key: 'THIS_VAR_WOULD_SHOULD_NEVER_EXIST', job: job)
+
+ post_graphql(query, current_user: user)
+
+ variables_data = graphql_data.dig('project', 'pipelines', 'nodes').first
+ .dig('jobs', 'nodes').flat_map { |job| job.dig('manualVariables', 'nodes') }
+ expect(variables_data).to be_empty
+ end
+
+ it 'does not fetch job variables for bridges' do
+ create(:ci_bridge, :manual, pipeline: pipeline)
+
+ post_graphql(query, current_user: user)
+
+ variables_data = graphql_data.dig('project', 'pipelines', 'nodes').first
+ .dig('jobs', 'nodes').flat_map { |job| job.dig('manualVariables', 'nodes') }
+ expect(variables_data).to be_empty
+ end
+
+ it 'does not produce N+1 queries', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/367991' do
+ second_user = create(:user)
+ project.add_maintainer(second_user)
+ job = create(:ci_build, :manual, pipeline: pipeline)
+ create(:ci_job_variable, key: 'MANUAL_TEST_VAR_1', job: job)
+
+ control_count = ActiveRecord::QueryRecorder.new do
+ post_graphql(query, current_user: user)
+ end
+
+ variables_data = graphql_data.dig('project', 'pipelines', 'nodes').first
+ .dig('jobs', 'nodes').flat_map { |job| job.dig('manualVariables', 'nodes') }
+ expect(variables_data.map { |var| var['key'] }).to match_array(['MANUAL_TEST_VAR_1'])
+
+ job = create(:ci_build, :manual, pipeline: pipeline)
+ create(:ci_job_variable, key: 'MANUAL_TEST_VAR_2', job: job)
+
+ expect do
+ post_graphql(query, current_user: second_user)
+ end.not_to exceed_query_limit(control_count)
+
+ variables_data = graphql_data.dig('project', 'pipelines', 'nodes').first
+ .dig('jobs', 'nodes').flat_map { |job| job.dig('manualVariables', 'nodes') }
+ expect(variables_data.map { |var| var['key'] }).to match_array(%w(MANUAL_TEST_VAR_1 MANUAL_TEST_VAR_2))
+ end
+end
diff --git a/spec/requests/api/graphql/ci/pipelines_spec.rb b/spec/requests/api/graphql/ci/pipelines_spec.rb
index 741af676b6d..a968e5508cb 100644
--- a/spec/requests/api/graphql/ci/pipelines_spec.rb
+++ b/spec/requests/api/graphql/ci/pipelines_spec.rb
@@ -86,8 +86,8 @@ RSpec.describe 'Query.project(fullPath).pipelines' do
describe '.stages' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:pipeline) { create(:ci_empty_pipeline, project: project) }
- let_it_be(:stage) { create(:ci_stage_entity, pipeline: pipeline, project: project) }
- let_it_be(:other_stage) { create(:ci_stage_entity, pipeline: pipeline, project: project, name: 'other') }
+ let_it_be(:stage) { create(:ci_stage, pipeline: pipeline, project: project) }
+ let_it_be(:other_stage) { create(:ci_stage, pipeline: pipeline, project: project, name: 'other') }
let(:first_n) { var('Int') }
let(:query_path) do
diff --git a/spec/requests/api/graphql/ci/project_variables_spec.rb b/spec/requests/api/graphql/ci/project_variables_spec.rb
new file mode 100644
index 00000000000..e61f146b24c
--- /dev/null
+++ b/spec/requests/api/graphql/ci/project_variables_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Query.project(fullPath).ciVariables' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+
+ let(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ ciVariables {
+ nodes {
+ id
+ key
+ value
+ variableType
+ protected
+ masked
+ raw
+ environmentScope
+ }
+ }
+ }
+ }
+ )
+ end
+
+ context 'when the user can administer builds' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it "returns the project's CI variables" do
+ variable = create(:ci_variable, project: project, key: 'TEST_VAR', value: 'test',
+ masked: false, protected: true, raw: true, environment_scope: 'production')
+
+ post_graphql(query, current_user: user)
+
+ expect(graphql_data.dig('project', 'ciVariables', 'nodes')).to contain_exactly({
+ 'id' => variable.to_global_id.to_s,
+ 'key' => 'TEST_VAR',
+ 'value' => 'test',
+ 'variableType' => 'ENV_VAR',
+ 'masked' => false,
+ 'protected' => true,
+ 'raw' => true,
+ 'environmentScope' => 'production'
+ })
+ end
+ end
+
+ context 'when the user cannot administer builds' do
+ it 'returns nothing' do
+ create(:ci_variable, project: project, value: 'verysecret', masked: true)
+
+ project.add_developer(user)
+
+ post_graphql(query, current_user: user)
+
+ expect(graphql_data.dig('project', 'ciVariables')).to be_nil
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index 446d1fb1bdb..e17a83d8e47 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -424,7 +424,7 @@ RSpec.describe 'Query.runner(id)' do
let(:user) { create(:user) }
before do
- group.add_user(user, Gitlab::Access::OWNER)
+ group.add_member(user, Gitlab::Access::OWNER)
end
it_behaves_like 'retrieval with no admin url' do
diff --git a/spec/requests/api/graphql/ci/stages_spec.rb b/spec/requests/api/graphql/ci/stages_spec.rb
index 50d2cf75097..1edd6e58486 100644
--- a/spec/requests/api/graphql/ci/stages_spec.rb
+++ b/spec/requests/api/graphql/ci/stages_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe 'Query.project.pipeline.stages' do
end
before_all do
- create(:ci_stage_entity, pipeline: pipeline, name: 'deploy')
+ create(:ci_stage, pipeline: pipeline, name: 'deploy')
create_list(:ci_build, 2, pipeline: pipeline, stage: 'deploy')
end
diff --git a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
index 847fa72522e..14c55e61a65 100644
--- a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
+++ b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe 'container repository details' do
with_them do
before do
project.update!(visibility_level: Gitlab::VisibilityLevel.const_get(project_visibility.to_s.upcase, false))
- project.add_user(user, role) unless role == :anonymous
+ project.add_member(user, role) unless role == :anonymous
end
it 'return the proper response' do
diff --git a/spec/requests/api/graphql/crm/contacts_spec.rb b/spec/requests/api/graphql/crm/contacts_spec.rb
new file mode 100644
index 00000000000..7e824140894
--- /dev/null
+++ b/spec/requests/api/graphql/crm/contacts_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'getting CRM contacts' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:group) { create(:group, :crm_enabled) }
+
+ let_it_be(:contact_a) do
+ create(
+ :contact,
+ group: group,
+ first_name: "ABC",
+ last_name: "DEF",
+ email: "ghi@test.com",
+ description: "LMNO",
+ state: "inactive"
+ )
+ end
+
+ let_it_be(:contact_b) do
+ create(
+ :contact,
+ group: group,
+ first_name: "ABC",
+ last_name: "DEF",
+ email: "vwx@test.com",
+ description: "YZ",
+ state: "active"
+ )
+ end
+
+ let_it_be(:contact_c) do
+ create(
+ :contact,
+ group: group,
+ first_name: "PQR",
+ last_name: "STU",
+ email: "aaa@test.com",
+ description: "YZ",
+ state: "active"
+ )
+ end
+
+ before do
+ group.add_reporter(current_user)
+ end
+
+ it_behaves_like 'sorted paginated query' do
+ let(:sort_argument) { {} }
+ let(:first_param) { 2 }
+ let(:all_records) { [contact_a, contact_b, contact_c] }
+ let(:data_path) { [:group, :contacts] }
+
+ def pagination_query(params)
+ graphql_query_for(
+ :group,
+ { full_path: group.full_path },
+ query_graphql_field(:contacts, params, "#{page_info} nodes { id }")
+ )
+ end
+
+ def pagination_results_data(nodes)
+ nodes.map { |item| GlobalID::Locator.locate(item['id']) }
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/current_user/groups_query_spec.rb b/spec/requests/api/graphql/current_user/groups_query_spec.rb
index 39f323b21a3..ef0f32bacf0 100644
--- a/spec/requests/api/graphql/current_user/groups_query_spec.rb
+++ b/spec/requests/api/graphql/current_user/groups_query_spec.rb
@@ -8,8 +8,9 @@ RSpec.describe 'Query current user groups' do
let_it_be(:user) { create(:user) }
let_it_be(:guest_group) { create(:group, name: 'public guest', path: 'public-guest') }
let_it_be(:private_maintainer_group) { create(:group, :private, name: 'b private maintainer', path: 'b-private-maintainer') }
- let_it_be(:public_developer_group) { create(:group, :private, project_creation_level: nil, name: 'c public developer', path: 'c-public-developer') }
- let_it_be(:public_maintainer_group) { create(:group, :private, name: 'a public maintainer', path: 'a-public-maintainer') }
+ let_it_be(:public_developer_group) { create(:group, project_creation_level: nil, name: 'c public developer', path: 'c-public-developer') }
+ let_it_be(:public_maintainer_group) { create(:group, name: 'a public maintainer', path: 'a-public-maintainer') }
+ let_it_be(:public_owner_group) { create(:group, name: 'a public owner', path: 'a-public-owner') }
let(:group_arguments) { {} }
let(:current_user) { user }
@@ -29,6 +30,7 @@ RSpec.describe 'Query current user groups' do
private_maintainer_group.add_maintainer(user)
public_developer_group.add_developer(user)
public_maintainer_group.add_maintainer(user)
+ public_owner_group.add_owner(user)
end
subject { graphql_data.dig('currentUser', 'groups', 'nodes') }
@@ -52,6 +54,7 @@ RSpec.describe 'Query current user groups' do
is_expected.to match(
expected_group_hash(
public_maintainer_group,
+ public_owner_group,
private_maintainer_group,
public_developer_group,
guest_group
@@ -66,6 +69,7 @@ RSpec.describe 'Query current user groups' do
is_expected.to match(
expected_group_hash(
public_maintainer_group,
+ public_owner_group,
private_maintainer_group,
public_developer_group
)
@@ -86,6 +90,32 @@ RSpec.describe 'Query current user groups' do
end
end
+ context 'when permission_scope is TRANSFER_PROJECTS' do
+ let(:group_arguments) { { permission_scope: :TRANSFER_PROJECTS } }
+
+ specify do
+ is_expected.to match(
+ expected_group_hash(
+ public_maintainer_group,
+ public_owner_group,
+ private_maintainer_group
+ )
+ )
+ end
+
+ context 'when search is provided' do
+ let(:group_arguments) { { permission_scope: :TRANSFER_PROJECTS, search: 'owner' } }
+
+ specify do
+ is_expected.to match(
+ expected_group_hash(
+ public_owner_group
+ )
+ )
+ end
+ end
+ end
+
context 'when search is provided' do
let(:group_arguments) { { search: 'maintainer' } }
diff --git a/spec/requests/api/graphql/group/container_repositories_spec.rb b/spec/requests/api/graphql/group/container_repositories_spec.rb
index be0b866af4a..8ec321c8d7c 100644
--- a/spec/requests/api/graphql/group/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/group/container_repositories_spec.rb
@@ -82,7 +82,7 @@ RSpec.describe 'getting container repositories in a group' do
group.update!(visibility_level: Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
project.update!(visibility_level: Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
- group.add_user(user, role) unless role == :anonymous
+ group.add_member(user, role) unless role == :anonymous
end
it 'return the proper response' do
diff --git a/spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb b/spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb
index cdb21512894..daa1483e956 100644
--- a/spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb
+++ b/spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb
@@ -75,7 +75,7 @@ RSpec.describe 'getting dependency proxy blobs in a group' do
with_them do
before do
group.update_column(:visibility_level, Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
- group.add_user(user, role) unless role == :anonymous
+ group.add_member(user, role) unless role == :anonymous
end
it 'return the proper response' do
diff --git a/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb b/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb
index d21c3046c1a..cc706c3051f 100644
--- a/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb
+++ b/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe 'getting dependency proxy settings for a group' do
with_them do
before do
group.update_column(:visibility_level, Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
- group.add_user(user, role) unless role == :anonymous
+ group.add_member(user, role) unless role == :anonymous
end
it 'return the proper response' do
diff --git a/spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb b/spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb
index 40f4b082072..3b2b04b1322 100644
--- a/spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb
+++ b/spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe 'getting dependency proxy image ttl policy for a group' do
with_them do
before do
group.update_column(:visibility_level, Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
- group.add_user(user, role) unless role == :anonymous
+ group.add_member(user, role) unless role == :anonymous
end
it 'return the proper response' do
diff --git a/spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb b/spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb
index c7149c100b2..37ef7089c2f 100644
--- a/spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb
+++ b/spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb
@@ -73,7 +73,7 @@ RSpec.describe 'getting dependency proxy manifests in a group' do
with_them do
before do
group.update_column(:visibility_level, Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
- group.add_user(user, role) unless role == :anonymous
+ group.add_member(user, role) unless role == :anonymous
end
it 'return the proper response' do
@@ -125,7 +125,8 @@ RSpec.describe 'getting dependency proxy manifests in a group' do
let_it_be(:descending_manifests) { manifests.reverse.map { |manifest| global_id_of(manifest) } }
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { '' }
+ include_context 'no sort argument'
+
let(:first_param) { 2 }
let(:all_records) { descending_manifests.map(&:to_s) }
end
@@ -134,7 +135,7 @@ RSpec.describe 'getting dependency proxy manifests in a group' do
def pagination_query(params)
# remove sort since the type does not accept sorting, but be future proof
graphql_query_for('group', { 'fullPath' => group.full_path },
- query_nodes(:dependencyProxyManifests, :id, include_pagination_info: true, args: params.merge(sort: nil))
+ query_nodes(:dependencyProxyManifests, :id, include_pagination_info: true, args: params)
)
end
end
diff --git a/spec/requests/api/graphql/group/group_members_spec.rb b/spec/requests/api/graphql/group/group_members_spec.rb
index fec866486ae..1ff5b134e92 100644
--- a/spec/requests/api/graphql/group/group_members_spec.rb
+++ b/spec/requests/api/graphql/group/group_members_spec.rb
@@ -7,8 +7,8 @@ RSpec.describe 'getting group members information' do
let_it_be(:parent_group) { create(:group, :public) }
let_it_be(:user) { create(:user) }
- let_it_be(:user_1) { create(:user, username: 'user') }
- let_it_be(:user_2) { create(:user, username: 'test') }
+ let_it_be(:user_1) { create(:user, username: 'user', name: 'Same Name') }
+ let_it_be(:user_2) { create(:user, username: 'test', name: 'Same Name') }
before_all do
[user_1, user_2].each { |user| parent_group.add_guest(user) }
@@ -45,11 +45,44 @@ RSpec.describe 'getting group members information' do
expect_array_response(user_1, user_2)
end
- it 'returns members that match the search query' do
- fetch_members(args: { search: 'test' })
+ describe 'search argument' do
+ it 'returns members that match the search query' do
+ fetch_members(args: { search: 'test' })
- expect(graphql_errors).to be_nil
- expect_array_response(user_2)
+ expect(graphql_errors).to be_nil
+ expect_array_response(user_2)
+ end
+
+ context 'when paginating' do
+ it 'returns correct results' do
+ fetch_members(args: { search: 'Same Name', first: 1 })
+
+ expect_array_response(user_1)
+
+ next_cursor = graphql_data_at(:group, :groupMembers, :pageInfo, :endCursor)
+ fetch_members(args: { search: 'Same Name', first: 1, after: next_cursor })
+
+ expect_array_response(user_2)
+ end
+
+ context 'when the use_keyset_aware_user_search_query FF is off' do
+ before do
+ stub_feature_flags(use_keyset_aware_user_search_query: false)
+ end
+
+ it 'raises error on the 2nd page due to missing cursor data' do
+ fetch_members(args: { search: 'Same Name', first: 1 })
+
+ # user_2 because the "old" order was undeterministic (insert order), no tie-breaker column
+ expect_array_response(user_2)
+
+ next_cursor = graphql_data_at(:group, :groupMembers, :pageInfo, :endCursor)
+ fetch_members(args: { search: 'Same Name', first: 1, after: next_cursor })
+
+ expect(graphql_errors.first['message']).to include('PG::UndefinedColumn')
+ end
+ end
+ end
end
end
@@ -196,6 +229,9 @@ RSpec.describe 'getting group members information' do
}
}
}
+ pageInfo {
+ endCursor
+ }
NODE
graphql_query_for("group",
diff --git a/spec/requests/api/graphql/mutations/issues/create_spec.rb b/spec/requests/api/graphql/mutations/issues/create_spec.rb
index 3d81b456c9c..9345735afe4 100644
--- a/spec/requests/api/graphql/mutations/issues/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/issues/create_spec.rb
@@ -53,6 +53,42 @@ RSpec.describe 'Create an issue' do
let(:mutation_class) { ::Mutations::Issues::Create }
end
+ context 'when creating an issue of type TASK' do
+ before do
+ input['type'] = 'TASK'
+ end
+
+ context 'when work_items feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it 'creates an issue with the default ISSUE type' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ end.to change(Issue, :count).by(1)
+
+ created_issue = Issue.last
+
+ expect(created_issue.work_item_type.base_type).to eq('issue')
+ expect(created_issue.issue_type).to eq('issue')
+ end
+ end
+
+ context 'when work_items feature flag is enabled' do
+ it 'creates an issue with TASK type' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ end.to change(Issue, :count).by(1)
+
+ created_issue = Issue.last
+
+ expect(created_issue.work_item_type.base_type).to eq('task')
+ expect(created_issue.issue_type).to eq('task')
+ end
+ end
+ end
+
context 'when position params are provided' do
let(:existing_issue) { create(:issue, project: project, relative_position: 50) }
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 8f3ae9f26f6..a432fb17a70 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
@@ -10,11 +10,12 @@ RSpec.describe 'Adding a DiffNote' do
let(:noteable) { create(:merge_request, source_project: project, target_project: project) }
let(:project) { create(:project, :repository) }
let(:diff_refs) { noteable.diff_refs }
+ let(:body) { 'Body text' }
let(:base_variables) do
{
noteable_id: GitlabSchema.id_from_object(noteable).to_s,
- body: 'Body text',
+ body: body,
position: {
paths: {
old_path: 'files/ruby/popen.rb',
@@ -65,6 +66,17 @@ RSpec.describe 'Adding a DiffNote' do
it_behaves_like 'a Note mutation when the given resource id is not for a Noteable'
end
+ context 'with /merge quick action' do
+ let(:body) { "Body text \n/merge" }
+
+ it 'merges the merge request', :sidekiq_inline do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(noteable.reload.state).to eq('merged')
+ expect(mutation_response['note']['body']).to eq('Body text')
+ end
+ end
+
it 'returns the note with the correct position' do
post_graphql_mutation(mutation, current_user: current_user)
diff --git a/spec/requests/api/graphql/mutations/snippets/update_spec.rb b/spec/requests/api/graphql/mutations/snippets/update_spec.rb
index eb7e6f840fe..1a5d3620f22 100644
--- a/spec/requests/api/graphql/mutations/snippets/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/snippets/update_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Updating a Snippet' do
include GraphqlHelpers
+ include SessionHelpers
let_it_be(:original_content) { 'Initial content' }
let_it_be(:original_description) { 'Initial description' }
@@ -162,7 +163,7 @@ RSpec.describe 'Updating a Snippet' do
end
end
- context 'when the author is a member of the project' do
+ context 'when the author is a member of the project', :snowplow do
before do
project.add_developer(current_user)
end
@@ -185,6 +186,20 @@ RSpec.describe 'Updating a Snippet' do
it_behaves_like 'has spam protection' do
let(:mutation_class) { ::Mutations::Snippets::Update }
end
+
+ context 'when not sessionless', :clean_gitlab_redis_sessions do
+ before do
+ stub_session('warden.user.user.key' => [[current_user.id], current_user.authenticatable_salt])
+ end
+
+ it_behaves_like 'Snowplow event tracking' do
+ let(:user) { current_user }
+ let(:namespace) { project.namespace }
+ let(:category) { 'ide_edit' }
+ let(:action) { 'g_edit_by_snippet_ide' }
+ let(:feature_flag_name) { :route_hll_to_snowplow_phase2 }
+ end
+ end
end
it_behaves_like 'when the snippet is not found'
diff --git a/spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb b/spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb
index 8d33f8e1806..b1356bbe6fd 100644
--- a/spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb
+++ b/spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb
@@ -47,6 +47,7 @@ RSpec.describe "Create a work item from a task in a work item's description" do
expect(work_item.description).to eq("- [ ] #{created_work_item.to_reference}+")
expect(created_work_item.issue_type).to eq('task')
expect(created_work_item.work_item_type.base_type).to eq('task')
+ expect(created_work_item.work_item_parent).to eq(work_item)
expect(mutation_response['workItem']).to include('id' => work_item.to_global_id.to_s)
expect(mutation_response['newWorkItem']).to include('id' => created_work_item.to_global_id.to_s)
end
diff --git a/spec/requests/api/graphql/mutations/work_items/create_spec.rb b/spec/requests/api/graphql/mutations/work_items/create_spec.rb
index 6abdaa2c850..911568bc39f 100644
--- a/spec/requests/api/graphql/mutations/work_items/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/work_items/create_spec.rb
@@ -63,6 +63,95 @@ RSpec.describe 'Create a work item' do
let(:mutation_class) { ::Mutations::WorkItems::Create }
end
+ context 'with hierarchy widget input' do
+ let(:widgets_response) { mutation_response['workItem']['widgets'] }
+ let(:fields) do
+ <<~FIELDS
+ workItem {
+ widgets {
+ type
+ ... on WorkItemWidgetHierarchy {
+ parent {
+ id
+ }
+ children {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+ }
+ }
+ }
+ errors
+ FIELDS
+ end
+
+ let(:mutation) { graphql_mutation(:workItemCreate, input.merge('projectPath' => project.full_path), fields) }
+
+ context 'when setting parent' do
+ let_it_be(:parent) { create(:work_item, project: project) }
+
+ let(:input) do
+ {
+ title: 'item1',
+ workItemTypeId: WorkItems::Type.default_by_type(:task).to_global_id.to_s,
+ hierarchyWidget: { 'parentId' => parent.to_global_id.to_s }
+ }
+ end
+
+ it 'updates the work item parent' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(widgets_response).to include(
+ {
+ 'children' => { 'edges' => [] },
+ 'parent' => { 'id' => parent.to_global_id.to_s },
+ 'type' => 'HIERARCHY'
+ }
+ )
+ end
+
+ context 'when parent work item type is invalid' do
+ let_it_be(:parent) { create(:work_item, :task, project: project) }
+
+ it 'returns error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['errors'])
+ .to contain_exactly(/cannot be added: only Issue and Incident can be parent of Task./)
+ expect(mutation_response['workItem']).to be_nil
+ end
+ end
+
+ context 'when parent work item is not found' do
+ let_it_be(:parent) { build_stubbed(:work_item, id: non_existing_record_id)}
+
+ it 'returns a top level error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(graphql_errors.first['message']).to include('No object found for `parentId')
+ end
+ end
+ end
+
+ context 'when unsupported widget input is sent' do
+ let(:input) do
+ {
+ 'title' => 'new title',
+ 'description' => 'new description',
+ 'workItemTypeId' => WorkItems::Type.default_by_type(:test_case).to_global_id.to_s,
+ 'hierarchyWidget' => {}
+ }
+ end
+
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: ['Following widget keys are not supported by Test Case type: [:hierarchy_widget]']
+ end
+ end
+
context 'when the work_items feature flag is disabled' do
before do
stub_feature_flags(work_items: false)
diff --git a/spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb b/spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb
index 05d3587d342..e576d0ee7ef 100644
--- a/spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb
+++ b/spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe "Delete a task in a work item's description" do
end.to change(WorkItem, :count).by(-1).and(
change(IssueLink, :count).by(-1)
).and(
- change(work_item, :description).from("- [ ] #{task.to_reference}+").to('')
+ change(work_item, :description).from("- [ ] #{task.to_reference}+").to("- [ ] #{task.title}")
)
expect(response).to have_gitlab_http_status(:success)
diff --git a/spec/requests/api/graphql/mutations/work_items/update_spec.rb b/spec/requests/api/graphql/mutations/work_items/update_spec.rb
index 71b03103115..77f7b9bacef 100644
--- a/spec/requests/api/graphql/mutations/work_items/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/work_items/update_spec.rb
@@ -11,8 +11,17 @@ RSpec.describe 'Update a work item' do
let(:work_item_event) { 'CLOSE' }
let(:input) { { 'stateEvent' => work_item_event, 'title' => 'updated title' } }
+ let(:fields) do
+ <<~FIELDS
+ workItem {
+ state
+ title
+ }
+ errors
+ FIELDS
+ end
- let(:mutation) { graphql_mutation(:workItemUpdate, input.merge('id' => work_item.to_global_id.to_s)) }
+ let(:mutation) { graphql_mutation(:workItemUpdate, input.merge('id' => work_item.to_global_id.to_s), fields) }
let(:mutation_response) { graphql_mutation_response(:work_item_update) }
@@ -62,6 +71,20 @@ RSpec.describe 'Update a work item' do
end
end
+ context 'when unsupported widget input is sent' do
+ let_it_be(:test_case) { create(:work_item_type, :default, :test_case, name: 'some_test_case_name') }
+ let_it_be(:work_item) { create(:work_item, work_item_type: test_case, project: project) }
+
+ let(:input) do
+ {
+ 'hierarchyWidget' => {}
+ }
+ end
+
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: ["Following widget keys are not supported by some_test_case_name type: [:hierarchy_widget]"]
+ end
+
it_behaves_like 'has spam protection' do
let(:mutation_class) { ::Mutations::WorkItems::Update }
end
@@ -80,5 +103,248 @@ RSpec.describe 'Update a work item' do
expect(mutation_response['errors']).to contain_exactly('`work_items` feature flag disabled for this project')
end
end
+
+ context 'with description widget input' do
+ let(:fields) do
+ <<~FIELDS
+ workItem {
+ description
+ widgets {
+ type
+ ... on WorkItemWidgetDescription {
+ description
+ }
+ }
+ }
+ errors
+ FIELDS
+ end
+
+ it_behaves_like 'update work item description widget' do
+ let(:new_description) { 'updated description' }
+ let(:input) do
+ { 'descriptionWidget' => { 'description' => new_description } }
+ end
+ end
+ end
+
+ context 'with weight widget input' do
+ let(:fields) do
+ <<~FIELDS
+ workItem {
+ widgets {
+ type
+ ... on WorkItemWidgetWeight {
+ weight
+ }
+ }
+ }
+ errors
+ FIELDS
+ end
+
+ it_behaves_like 'update work item weight widget' do
+ let(:new_weight) { 2 }
+
+ let(:input) do
+ { 'weightWidget' => { 'weight' => new_weight } }
+ end
+ end
+ end
+
+ context 'with hierarchy widget input' do
+ let(:widgets_response) { mutation_response['workItem']['widgets'] }
+ let(:fields) do
+ <<~FIELDS
+ workItem {
+ description
+ widgets {
+ type
+ ... on WorkItemWidgetHierarchy {
+ parent {
+ id
+ }
+ children {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+ }
+ }
+ }
+ errors
+ FIELDS
+ end
+
+ context 'when updating parent' do
+ let_it_be(:work_item) { create(:work_item, :task, project: project) }
+ let_it_be(:valid_parent) { create(:work_item, project: project) }
+ let_it_be(:invalid_parent) { create(:work_item, :task, project: project) }
+
+ context 'when parent work item type is invalid' do
+ let(:error) { "#{work_item.to_reference} cannot be added: only Issue and Incident can be parent of Task." }
+ let(:input) do
+ { 'hierarchyWidget' => { 'parentId' => invalid_parent.to_global_id.to_s }, 'title' => 'new title' }
+ end
+
+ it 'returns response with errors' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to not_change(work_item, :work_item_parent).and(not_change(work_item, :title))
+
+ expect(mutation_response['workItem']).to be_nil
+ expect(mutation_response['errors']).to match_array([error])
+ end
+ end
+
+ context 'when parent work item has a valid type' do
+ let(:input) { { 'hierarchyWidget' => { 'parentId' => valid_parent.to_global_id.to_s } } }
+
+ it 'sets the parent for the work item' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to change(work_item, :work_item_parent).from(nil).to(valid_parent)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(widgets_response).to include(
+ {
+ 'children' => { 'edges' => [] },
+ 'parent' => { 'id' => valid_parent.to_global_id.to_s },
+ 'type' => 'HIERARCHY'
+ }
+ )
+ end
+
+ context 'when a parent is already present' do
+ let_it_be(:existing_parent) { create(:work_item, project: project) }
+
+ before do
+ work_item.update!(work_item_parent: existing_parent)
+ end
+
+ it 'is replaced with new parent' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to change(work_item, :work_item_parent).from(existing_parent).to(valid_parent)
+ end
+ end
+ end
+
+ context 'when parentId is null' do
+ let(:input) { { 'hierarchyWidget' => { 'parentId' => nil } } }
+
+ context 'when parent is present' do
+ before do
+ work_item.update!(work_item_parent: valid_parent)
+ end
+
+ it 'removes parent and returns success message' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to change(work_item, :work_item_parent).from(valid_parent).to(nil)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(widgets_response)
+ .to include(
+ {
+ 'children' => { 'edges' => [] },
+ 'parent' => nil,
+ 'type' => 'HIERARCHY'
+ }
+ )
+ end
+ end
+
+ context 'when parent is not present' do
+ before do
+ work_item.update!(work_item_parent: nil)
+ end
+
+ it 'does not change work item and returns success message' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.not_to change(work_item, :work_item_parent)
+
+ expect(response).to have_gitlab_http_status(:success)
+ end
+ end
+ end
+
+ context 'when parent work item is not found' do
+ let(:input) { { 'hierarchyWidget' => { 'parentId' => "gid://gitlab/WorkItem/#{non_existing_record_id}" } } }
+
+ it 'returns a top level error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(graphql_errors.first['message']).to include('No object found for `parentId')
+ end
+ end
+ end
+
+ context 'when updating children' do
+ let_it_be(:valid_child1) { create(:work_item, :task, project: project) }
+ let_it_be(:valid_child2) { create(:work_item, :task, project: project) }
+ let_it_be(:invalid_child) { create(:work_item, project: project) }
+
+ let(:input) { { 'hierarchyWidget' => { 'childrenIds' => children_ids } } }
+ let(:error) do
+ "#{invalid_child.to_reference} cannot be added: only Task can be assigned as a child in hierarchy."
+ end
+
+ context 'when child work item type is invalid' do
+ let(:children_ids) { [invalid_child.to_global_id.to_s] }
+
+ it 'returns response with errors' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['workItem']).to be_nil
+ expect(mutation_response['errors']).to match_array([error])
+ end
+ end
+
+ context 'when there is a mix of existing and non existing work items' do
+ let(:children_ids) { [valid_child1.to_global_id.to_s, "gid://gitlab/WorkItem/#{non_existing_record_id}"] }
+
+ it 'returns a top level error and does not add valid work item' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.not_to change(work_item.work_item_children, :count)
+
+ expect(graphql_errors.first['message']).to include('No object found for `childrenIds')
+ end
+ end
+
+ context 'when child work item type is valid' do
+ let(:children_ids) { [valid_child1.to_global_id.to_s, valid_child2.to_global_id.to_s] }
+
+ it 'updates the work item children' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to change(work_item.work_item_children, :count).by(2)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(widgets_response).to include(
+ {
+ 'children' => { 'edges' => [
+ { 'node' => { 'id' => valid_child2.to_global_id.to_s } },
+ { 'node' => { 'id' => valid_child1.to_global_id.to_s } }
+ ] },
+ 'parent' => nil,
+ 'type' => 'HIERARCHY'
+ }
+ )
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/requests/api/graphql/mutations/work_items/update_widgets_spec.rb b/spec/requests/api/graphql/mutations/work_items/update_widgets_spec.rb
index 595d8fe97ed..2a5cb937a2f 100644
--- a/spec/requests/api/graphql/mutations/work_items/update_widgets_spec.rb
+++ b/spec/requests/api/graphql/mutations/work_items/update_widgets_spec.rb
@@ -9,16 +9,23 @@ RSpec.describe 'Update work item widgets' do
let_it_be(:developer) { create(:user).tap { |user| project.add_developer(user) } }
let_it_be(:work_item, refind: true) { create(:work_item, project: project) }
- let(:input) do
- {
- 'descriptionWidget' => { 'description' => 'updated description' }
+ let(:input) { { 'descriptionWidget' => { 'description' => 'updated description' } } }
+ let(:mutation_response) { graphql_mutation_response(:work_item_update_widgets) }
+ let(:mutation) do
+ graphql_mutation(:workItemUpdateWidgets, input.merge('id' => work_item.to_global_id.to_s), <<~FIELDS)
+ errors
+ workItem {
+ description
+ widgets {
+ type
+ ... on WorkItemWidgetDescription {
+ description
+ }
+ }
}
+ FIELDS
end
- let(:mutation) { graphql_mutation(:workItemUpdateWidgets, input.merge('id' => work_item.to_global_id.to_s)) }
-
- let(:mutation_response) { graphql_mutation_response(:work_item_update_widgets) }
-
context 'the user is not allowed to update a work item' do
let(:current_user) { create(:user) }
@@ -28,32 +35,8 @@ RSpec.describe 'Update work item widgets' do
context 'when user has permissions to update a work item', :aggregate_failures do
let(:current_user) { developer }
- context 'when the updated work item is not valid' do
- it 'returns validation errors without the work item' do
- errors = ActiveModel::Errors.new(work_item).tap { |e| e.add(:description, 'error message') }
-
- allow_next_found_instance_of(::WorkItem) do |instance|
- allow(instance).to receive(:valid?).and_return(false)
- allow(instance).to receive(:errors).and_return(errors)
- end
-
- post_graphql_mutation(mutation, current_user: current_user)
-
- expect(mutation_response['workItem']).to be_nil
- expect(mutation_response['errors']).to match_array(['Description error message'])
- end
- end
-
- it 'updates the work item widgets' do
- expect do
- post_graphql_mutation(mutation, current_user: current_user)
- work_item.reload
- end.to change(work_item, :description).from(nil).to('updated description')
-
- expect(response).to have_gitlab_http_status(:success)
- expect(mutation_response['workItem']).to include(
- 'title' => work_item.title
- )
+ it_behaves_like 'update work item description widget' do
+ let(:new_description) { 'updated description' }
end
it_behaves_like 'has spam protection' do
@@ -69,7 +52,7 @@ RSpec.describe 'Update work item widgets' do
expect do
post_graphql_mutation(mutation, current_user: current_user)
work_item.reload
- end.to not_change(work_item, :title)
+ end.to not_change(work_item, :description)
expect(mutation_response['errors']).to contain_exactly('`work_items` feature flag disabled for this project')
end
diff --git a/spec/requests/api/graphql/project/container_repositories_spec.rb b/spec/requests/api/graphql/project/container_repositories_spec.rb
index bbab6012f3f..01b117a89d8 100644
--- a/spec/requests/api/graphql/project/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/project/container_repositories_spec.rb
@@ -81,7 +81,7 @@ RSpec.describe 'getting container repositories in a project' do
with_them do
before do
project.update!(visibility_level: Gitlab::VisibilityLevel.const_get(project_visibility.to_s.upcase, false))
- project.add_user(user, role) unless role == :anonymous
+ project.add_member(user, role) unless role == :anonymous
end
it 'return the proper response' do
diff --git a/spec/requests/api/graphql/project/issues_spec.rb b/spec/requests/api/graphql/project/issues_spec.rb
index 69e14eace66..596e023a027 100644
--- a/spec/requests/api/graphql/project/issues_spec.rb
+++ b/spec/requests/api/graphql/project/issues_spec.rb
@@ -223,6 +223,7 @@ RSpec.describe 'getting an issue list for a project' do
end
describe 'sorting and pagination' do
+ let_it_be(:sort_project) { create(:project, :public) }
let_it_be(:data_path) { [:project, :issues] }
def pagination_query(params)
@@ -237,8 +238,38 @@ RSpec.describe 'getting an issue list for a project' do
data.map { |issue| issue['iid'].to_i }
end
+ context 'when sorting by severity' do
+ let_it_be(:severty_issue1) { create(:issue, project: sort_project) }
+ let_it_be(:severty_issue2) { create(:issue, project: sort_project) }
+ let_it_be(:severty_issue3) { create(:issue, project: sort_project) }
+ let_it_be(:severty_issue4) { create(:issue, project: sort_project) }
+ let_it_be(:severty_issue5) { create(:issue, project: sort_project) }
+
+ before(:all) do
+ create(:issuable_severity, issue: severty_issue1, severity: :unknown)
+ create(:issuable_severity, issue: severty_issue2, severity: :low)
+ create(:issuable_severity, issue: severty_issue4, severity: :critical)
+ create(:issuable_severity, issue: severty_issue5, severity: :high)
+ end
+
+ context 'when ascending' do
+ it_behaves_like 'sorted paginated query' do
+ let(:sort_param) { :SEVERITY_ASC }
+ let(:first_param) { 2 }
+ let(:all_records) { [severty_issue3.iid, severty_issue1.iid, severty_issue2.iid, severty_issue5.iid, severty_issue4.iid] }
+ end
+ end
+
+ context 'when descending' do
+ it_behaves_like 'sorted paginated query' do
+ let(:sort_param) { :SEVERITY_DESC }
+ let(:first_param) { 2 }
+ let(:all_records) { [severty_issue4.iid, severty_issue5.iid, severty_issue2.iid, severty_issue1.iid, severty_issue3.iid] }
+ end
+ end
+ end
+
context 'when sorting by due date' do
- let_it_be(:sort_project) { create(:project, :public) }
let_it_be(:due_issue1) { create(:issue, project: sort_project, due_date: 3.days.from_now) }
let_it_be(:due_issue2) { create(:issue, project: sort_project, due_date: nil) }
let_it_be(:due_issue3) { create(:issue, project: sort_project, due_date: 2.days.ago) }
@@ -263,7 +294,6 @@ RSpec.describe 'getting an issue list for a project' do
end
context 'when sorting by relative position' do
- let_it_be(:sort_project) { create(:project, :public) }
let_it_be(:relative_issue1) { create(:issue, project: sort_project, relative_position: 2000) }
let_it_be(:relative_issue2) { create(:issue, project: sort_project, relative_position: nil) }
let_it_be(:relative_issue3) { create(:issue, project: sort_project, relative_position: 1000) }
@@ -285,7 +315,6 @@ RSpec.describe 'getting an issue list for a project' do
end
context 'when sorting by priority' do
- let_it_be(:sort_project) { create(:project, :public) }
let_it_be(:on_project) { { project: sort_project } }
let_it_be(:early_milestone) { create(:milestone, **on_project, due_date: 10.days.from_now) }
let_it_be(:late_milestone) { create(:milestone, **on_project, due_date: 30.days.from_now) }
@@ -321,7 +350,6 @@ RSpec.describe 'getting an issue list for a project' do
end
context 'when sorting by label priority' do
- let_it_be(:sort_project) { create(:project, :public) }
let_it_be(:label1) { create(:label, project: sort_project, priority: 1) }
let_it_be(:label2) { create(:label, project: sort_project, priority: 5) }
let_it_be(:label3) { create(:label, project: sort_project, priority: 10) }
@@ -348,7 +376,6 @@ RSpec.describe 'getting an issue list for a project' do
end
context 'when sorting by milestone due date' do
- let_it_be(:sort_project) { create(:project, :public) }
let_it_be(:early_milestone) { create(:milestone, project: sort_project, due_date: 10.days.from_now) }
let_it_be(:late_milestone) { create(:milestone, project: sort_project, due_date: 30.days.from_now) }
let_it_be(:milestone_issue1) { create(:issue, project: sort_project) }
diff --git a/spec/requests/api/graphql/project/jobs_spec.rb b/spec/requests/api/graphql/project/jobs_spec.rb
index 1a823ede9ac..7d0eb203d60 100644
--- a/spec/requests/api/graphql/project/jobs_spec.rb
+++ b/spec/requests/api/graphql/project/jobs_spec.rb
@@ -31,8 +31,8 @@ RSpec.describe 'Query.project.jobs' do
end
it 'does not generate N+1 queries', :request_store, :use_sql_query_cache do
- build_stage = create(:ci_stage_entity, position: 1, name: 'build', project: project, pipeline: pipeline)
- test_stage = create(:ci_stage_entity, position: 2, name: 'test', project: project, pipeline: pipeline)
+ build_stage = create(:ci_stage, position: 1, name: 'build', project: project, pipeline: pipeline)
+ test_stage = create(:ci_stage, position: 2, name: 'test', project: project, pipeline: pipeline)
create(:ci_build, pipeline: pipeline, stage_idx: build_stage.position, name: 'docker 1 2', stage: build_stage)
create(:ci_build, pipeline: pipeline, stage_idx: build_stage.position, name: 'docker 2 2', stage: build_stage)
create(:ci_build, pipeline: pipeline, stage_idx: test_stage.position, name: 'rspec 1 2', stage: test_stage)
diff --git a/spec/requests/api/graphql/project/packages_cleanup_policy_spec.rb b/spec/requests/api/graphql/project/packages_cleanup_policy_spec.rb
index a025c57d4b8..33e1dbcba27 100644
--- a/spec/requests/api/graphql/project/packages_cleanup_policy_spec.rb
+++ b/spec/requests/api/graphql/project/packages_cleanup_policy_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe 'getting the packages cleanup policy linked to a project' do
with_them do
before do
project.update!(visibility: visibility.to_s)
- project.add_user(current_user, role) unless role == :anonymous
+ project.add_member(current_user, role) unless role == :anonymous
end
it 'return the proper response' do
diff --git a/spec/requests/api/graphql/project/pipeline_spec.rb b/spec/requests/api/graphql/project/pipeline_spec.rb
index ccf97918021..08c6a2d9927 100644
--- a/spec/requests/api/graphql/project/pipeline_spec.rb
+++ b/spec/requests/api/graphql/project/pipeline_spec.rb
@@ -105,6 +105,62 @@ RSpec.describe 'getting pipeline information nested in a project' do
end
end
+ context 'when a job has been retried' do
+ let_it_be(:retried) do
+ create(:ci_build, :retried,
+ name: build_job.name,
+ pipeline: pipeline,
+ stage_idx: 0,
+ stage: build_job.stage)
+ end
+
+ let(:fields) do
+ query_graphql_field(:jobs, { retried: retried_argument },
+ query_graphql_field(:nodes, {}, all_graphql_fields_for('CiJob', max_depth: 3)))
+ end
+
+ context 'when we filter out retried jobs' do
+ let(:retried_argument) { false }
+
+ it 'contains latest jobs' do
+ post_graphql(query, current_user: current_user)
+
+ expect(graphql_data_at(*path, :jobs, :nodes)).to include(
+ a_graphql_entity_for(build_job, :name, :duration, :retried)
+ )
+
+ expect(graphql_data_at(*path, :jobs, :nodes)).not_to include(
+ a_graphql_entity_for(retried)
+ )
+ end
+ end
+
+ context 'when we filter to only retried jobs' do
+ let(:retried_argument) { true }
+
+ it 'contains only retried jobs' do
+ post_graphql(query, current_user: current_user)
+
+ expect(graphql_data_at(*path, :jobs, :nodes)).to contain_exactly(
+ a_graphql_entity_for(retried)
+ )
+ end
+ end
+
+ context 'when we pass null explicitly' do
+ let(:retried_argument) { nil }
+
+ it 'contains all jobs' do
+ post_graphql(query, current_user: current_user)
+
+ expect(graphql_data_at(*path, :jobs, :nodes)).to include(
+ a_graphql_entity_for(build_job),
+ a_graphql_entity_for(retried)
+ )
+ end
+ end
+ end
+
context 'when requesting only builds with certain statuses' do
let(:variables) do
{
@@ -290,8 +346,8 @@ RSpec.describe 'getting pipeline information nested in a project' do
end
it 'does not generate N+1 queries', :request_store, :use_sql_query_cache do
- build_stage = create(:ci_stage_entity, position: 1, name: 'build', project: project, pipeline: pipeline)
- test_stage = create(:ci_stage_entity, position: 2, name: 'test', project: project, pipeline: pipeline)
+ build_stage = create(:ci_stage, position: 1, name: 'build', project: project, pipeline: pipeline)
+ test_stage = create(:ci_stage, position: 2, name: 'test', project: project, pipeline: pipeline)
create(:ci_build, pipeline: pipeline, stage_idx: build_stage.position, name: 'docker 1 2', stage: build_stage)
create(:ci_build, pipeline: pipeline, stage_idx: build_stage.position, name: 'docker 2 2', stage: build_stage)
create(:ci_build, pipeline: pipeline, stage_idx: test_stage.position, name: 'rspec 1 2', stage: test_stage)
diff --git a/spec/requests/api/graphql/project/project_members_spec.rb b/spec/requests/api/graphql/project/project_members_spec.rb
index c3281b44954..4225c3ad3e8 100644
--- a/spec/requests/api/graphql/project/project_members_spec.rb
+++ b/spec/requests/api/graphql/project/project_members_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe 'getting project members information' do
let_it_be(:parent_group) { create(:group, :public) }
let_it_be(:parent_project) { create(:project, :public, group: parent_group) }
let_it_be(:user) { create(:user) }
- let_it_be(:user_1) { create(:user, username: 'user') }
- let_it_be(:user_2) { create(:user, username: 'test') }
+ let_it_be(:user_1) { create(:user, username: 'user', name: 'Same Name') }
+ let_it_be(:user_2) { create(:user, username: 'test', name: 'Same Name') }
before_all do
[user_1, user_2].each { |user| parent_group.add_guest(user) }
@@ -29,11 +29,44 @@ RSpec.describe 'getting project members information' do
expect_array_response(user_1, user_2)
end
- it 'returns members that match the search query' do
- fetch_members(project: parent_project, args: { search: 'test' })
+ describe 'search argument' do
+ it 'returns members that match the search query' do
+ fetch_members(project: parent_project, args: { search: 'test' })
- expect(graphql_errors).to be_nil
- expect_array_response(user_2)
+ expect(graphql_errors).to be_nil
+ expect_array_response(user_2)
+ end
+
+ context 'when paginating' do
+ it 'returns correct results' do
+ fetch_members(project: parent_project, args: { search: 'Same Name', first: 1 })
+
+ expect_array_response(user_1)
+
+ next_cursor = graphql_data_at(:project, :projectMembers, :pageInfo, :endCursor)
+ fetch_members(project: parent_project, args: { search: 'Same Name', first: 1, after: next_cursor })
+
+ expect_array_response(user_2)
+ end
+
+ context 'when the use_keyset_aware_user_search_query FF is off' do
+ before do
+ stub_feature_flags(use_keyset_aware_user_search_query: false)
+ end
+
+ it 'raises error on the 2nd page due to missing cursor data' do
+ fetch_members(project: parent_project, args: { search: 'Same Name', first: 1 })
+
+ # user_2 because the "old" order was undeterministic (insert order), no tie-breaker column
+ expect_array_response(user_2)
+
+ next_cursor = graphql_data_at(:project, :projectMembers, :pageInfo, :endCursor)
+ fetch_members(project: parent_project, args: { search: 'Same Name', first: 1, after: next_cursor })
+
+ expect(graphql_errors.first['message']).to include('PG::UndefinedColumn')
+ end
+ end
+ end
end
end
@@ -231,6 +264,9 @@ RSpec.describe 'getting project members information' do
}
}
}
+ pageInfo {
+ endCursor
+ }
NODE
graphql_query_for('project',
diff --git a/spec/requests/api/graphql/todo_query_spec.rb b/spec/requests/api/graphql/todo_query_spec.rb
new file mode 100644
index 00000000000..3f743f4402a
--- /dev/null
+++ b/spec/requests/api/graphql/todo_query_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Todo Query' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { nil }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:issue) { create(:issue, project: project) }
+
+ let_it_be(:todo_owner) { create(:user) }
+
+ let_it_be(:todo) { create(:todo, user: todo_owner, target: project) }
+
+ before do
+ project.add_developer(todo_owner)
+ end
+
+ let(:fields) do
+ <<~GRAPHQL
+ id
+ GRAPHQL
+ end
+
+ let(:query) do
+ graphql_query_for(:todo, { id: todo.to_global_id.to_s }, fields)
+ end
+
+ subject do
+ result = GitlabSchema.execute(query, context: { current_user: current_user }).to_h
+ graphql_dig_at(result, :data, :todo)
+ end
+
+ context 'when requesting user is todo owner' do
+ let(:current_user) { todo_owner }
+
+ it { is_expected.to include('id' => todo.to_global_id.to_s) }
+ end
+
+ context 'when requesting user is not todo owner' do
+ let(:current_user) { create(:user) }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when unauthenticated' do
+ it { is_expected.to be_nil }
+ end
+end
diff --git a/spec/requests/api/graphql/work_item_spec.rb b/spec/requests/api/graphql/work_item_spec.rb
index 09bda8ee0d5..f17d2ebbb7e 100644
--- a/spec/requests/api/graphql/work_item_spec.rb
+++ b/spec/requests/api/graphql/work_item_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe 'Query.work_item(id)' do
let_it_be(:developer) { create(:user) }
let_it_be(:guest) { create(:user) }
let_it_be(:project) { create(:project, :private) }
- let_it_be(:work_item) { create(:work_item, project: project, description: '- List item') }
+ let_it_be(:work_item) { create(:work_item, project: project, description: '- List item', weight: 1) }
let_it_be(:child_item1) { create(:work_item, :task, project: project) }
let_it_be(:child_item2) { create(:work_item, :task, confidential: true, project: project) }
let_it_be(:child_link1) { create(:parent_link, work_item_parent: work_item, work_item: child_item1) }
@@ -64,16 +64,13 @@ RSpec.describe 'Query.work_item(id)' do
it 'returns widget information' do
expect(work_item_data).to include(
'id' => work_item.to_gid.to_s,
- 'widgets' => match_array([
+ 'widgets' => include(
hash_including(
'type' => 'DESCRIPTION',
'description' => work_item.description,
'descriptionHtml' => ::MarkupHelper.markdown_field(work_item, :description, {})
- ),
- hash_including(
- 'type' => 'HIERARCHY'
)
- ])
+ )
)
end
end
@@ -101,10 +98,7 @@ RSpec.describe 'Query.work_item(id)' do
it 'returns widget information' do
expect(work_item_data).to include(
'id' => work_item.to_gid.to_s,
- 'widgets' => match_array([
- hash_including(
- 'type' => 'DESCRIPTION'
- ),
+ 'widgets' => include(
hash_including(
'type' => 'HIERARCHY',
'parent' => nil,
@@ -113,7 +107,7 @@ RSpec.describe 'Query.work_item(id)' do
hash_including('id' => child_link2.work_item.to_gid.to_s)
]) }
)
- ])
+ )
)
end
@@ -137,10 +131,7 @@ RSpec.describe 'Query.work_item(id)' do
it 'filters out not accessible children or parent' do
expect(work_item_data).to include(
'id' => work_item.to_gid.to_s,
- 'widgets' => match_array([
- hash_including(
- 'type' => 'DESCRIPTION'
- ),
+ 'widgets' => include(
hash_including(
'type' => 'HIERARCHY',
'parent' => nil,
@@ -148,7 +139,7 @@ RSpec.describe 'Query.work_item(id)' do
hash_including('id' => child_link1.work_item.to_gid.to_s)
]) }
)
- ])
+ )
)
end
end
@@ -160,20 +151,85 @@ RSpec.describe 'Query.work_item(id)' do
it 'returns parent information' do
expect(work_item_data).to include(
'id' => work_item.to_gid.to_s,
- 'widgets' => match_array([
- hash_including(
- 'type' => 'DESCRIPTION'
- ),
+ 'widgets' => include(
hash_including(
'type' => 'HIERARCHY',
'parent' => hash_including('id' => parent_link.work_item_parent.to_gid.to_s),
'children' => { 'nodes' => match_array([]) }
)
- ])
+ )
)
end
end
end
+
+ describe 'weight widget' do
+ let(:work_item_fields) do
+ <<~GRAPHQL
+ id
+ widgets {
+ type
+ ... on WorkItemWidgetWeight {
+ weight
+ }
+ }
+ GRAPHQL
+ end
+
+ it 'returns widget information' do
+ expect(work_item_data).to include(
+ 'id' => work_item.to_gid.to_s,
+ 'widgets' => include(
+ hash_including(
+ 'type' => 'WEIGHT',
+ 'weight' => work_item.weight
+ )
+ )
+ )
+ end
+ end
+
+ describe 'assignees widget' do
+ let(:assignees) { create_list(:user, 2) }
+ let(:work_item) { create(:work_item, project: project, assignees: assignees) }
+
+ let(:work_item_fields) do
+ <<~GRAPHQL
+ id
+ widgets {
+ type
+ ... on WorkItemWidgetAssignees {
+ allowsMultipleAssignees
+ canInviteMembers
+ assignees {
+ nodes {
+ id
+ username
+ }
+ }
+ }
+ }
+ GRAPHQL
+ end
+
+ it 'returns widget information' do
+ expect(work_item_data).to include(
+ 'id' => work_item.to_gid.to_s,
+ 'widgets' => include(
+ hash_including(
+ 'type' => 'ASSIGNEES',
+ 'allowsMultipleAssignees' => boolean,
+ 'canInviteMembers' => boolean,
+ 'assignees' => {
+ 'nodes' => match_array(
+ assignees.map { |a| { 'id' => a.to_gid.to_s, 'username' => a.username } }
+ )
+ }
+ )
+ )
+ )
+ end
+ end
end
context 'when an Issue Global ID is provided' do
diff --git a/spec/requests/api/group_export_spec.rb b/spec/requests/api/group_export_spec.rb
index ffa313d4464..bda46f85140 100644
--- a/spec/requests/api/group_export_spec.rb
+++ b/spec/requests/api/group_export_spec.rb
@@ -32,9 +32,9 @@ RSpec.describe API::GroupExport do
context 'when export file exists' do
before do
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(0)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy).to receive(:increment).and_return(0)
+ end
upload.export_file = fixture_file_upload('spec/fixtures/group_export.tar.gz', "`/tar.gz")
upload.save!
@@ -149,9 +149,11 @@ RSpec.describe API::GroupExport do
before do
group.add_owner(user)
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:group_export][:threshold].call + 1)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy)
+ .to receive(:increment)
+ .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:group_export][:threshold].call + 1)
+ end
end
it 'throttles the endpoint' do
diff --git a/spec/requests/api/group_variables_spec.rb b/spec/requests/api/group_variables_spec.rb
index 6d5676bbe35..a7b4bea362f 100644
--- a/spec/requests/api/group_variables_spec.rb
+++ b/spec/requests/api/group_variables_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe API::GroupVariables do
let(:access_level) {}
before do
- group.add_user(user, access_level) if access_level
+ group.add_member(user, access_level) if access_level
end
describe 'GET /groups/:id/variables' do
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 56f08249bdd..3bc3cce5310 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -645,7 +645,7 @@ RSpec.describe API::Groups do
project = create(:project, namespace: group2, path: 'Foo')
create(:project_group_link, project: project, group: group1)
- get api("/groups/#{group1.id}", user1), params: { with_projects: false }
+ get api("/groups/#{group2.id}", user1), params: { with_projects: false }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['projects']).to be_nil
@@ -748,6 +748,18 @@ RSpec.describe API::Groups do
expect(json_response).to include('runners_token')
end
+ it "returns runners_token and no projects when with_projects option is set to false" do
+ project = create(:project, namespace: group2, path: 'Foo')
+ create(:project_group_link, project: project, group: group1)
+
+ get api("/groups/#{group2.id}", admin), params: { with_projects: false }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['projects']).to be_nil
+ expect(json_response['shared_projects']).to be_nil
+ expect(json_response).to include('runners_token')
+ end
+
it "does not return a non existing group" do
get api("/groups/#{non_existing_record_id}", admin)
diff --git a/spec/requests/api/integrations_spec.rb b/spec/requests/api/integrations_spec.rb
index cd9a0746581..b2db7f7caef 100644
--- a/spec/requests/api/integrations_spec.rb
+++ b/spec/requests/api/integrations_spec.rb
@@ -55,25 +55,20 @@ RSpec.describe API::Integrations do
describe "PUT /projects/:id/#{endpoint}/#{integration.dasherize}" do
include_context integration
- # NOTE: Some attributes are not supported for PUT requests, even though in most cases they should be.
- # For some of them the problem is somewhere else, i.e. most chat integrations don't support the `*_channel`
- # fields but they're incorrectly included in `#fields`.
- #
+ # NOTE: Some attributes are not supported for PUT requests, even though they probably should be.
# We can fix these manually, or with a generic approach like https://gitlab.com/gitlab-org/gitlab/-/issues/348208
- let(:missing_channel_attributes) { %i[push_channel issue_channel confidential_issue_channel merge_request_channel note_channel confidential_note_channel tag_push_channel pipeline_channel wiki_page_channel] }
let(:missing_attributes) do
{
datadog: %i[archive_trace_events],
- discord: missing_channel_attributes + %i[branches_to_be_notified notify_only_broken_pipelines],
- hangouts_chat: missing_channel_attributes + %i[notify_only_broken_pipelines],
+ discord: %i[branches_to_be_notified notify_only_broken_pipelines],
+ hangouts_chat: %i[notify_only_broken_pipelines],
jira: %i[issues_enabled project_key vulnerabilities_enabled vulnerabilities_issuetype],
mattermost: %i[deployment_channel labels_to_be_notified],
- microsoft_teams: missing_channel_attributes,
mock_ci: %i[enable_ssl_verification],
prometheus: %i[manual_configuration],
slack: %i[alert_events alert_channel deployment_channel labels_to_be_notified],
- unify_circuit: missing_channel_attributes + %i[branches_to_be_notified notify_only_broken_pipelines],
- webex_teams: missing_channel_attributes + %i[branches_to_be_notified notify_only_broken_pipelines]
+ unify_circuit: %i[branches_to_be_notified notify_only_broken_pipelines],
+ webex_teams: %i[branches_to_be_notified notify_only_broken_pipelines]
}
end
@@ -368,6 +363,31 @@ RSpec.describe API::Integrations do
end
end
+ describe 'Jira integration' do
+ let(:integration_name) { 'jira' }
+ let(:params) do
+ { url: 'https://jira.example.com', username: 'username', password: 'password' }
+ end
+
+ before do
+ project.create_jira_integration(active: true, properties: params)
+ end
+
+ it 'returns the jira_issue_transition_id for get request' do
+ get api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties']).to include('jira_issue_transition_id' => nil)
+ end
+
+ it 'returns the jira_issue_transition_id for put request' do
+ put api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user), params: params.merge(jira_issue_transition_id: '1')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties']['jira_issue_transition_id']).to eq('1')
+ end
+ end
+
describe 'Pipelines Email Integration' do
let(:integration_name) { 'pipelines-email' }
diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb
index 93e4e72f78f..acfe476a864 100644
--- a/spec/requests/api/internal/base_spec.rb
+++ b/spec/requests/api/internal/base_spec.rb
@@ -51,64 +51,6 @@ RSpec.describe API::Internal::Base do
end
end
- describe 'GET /internal/error_tracking_allowed' do
- let_it_be(:project) { create(:project) }
-
- let(:params) { { project_id: project.id, public_key: 'key' } }
-
- context 'when the secret header is missing' do
- it 'responds with unauthorized entity' do
- post api("/internal/error_tracking_allowed"), params: params
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
- end
-
- context 'when some params are missing' do
- it 'responds with unprocessable entity' do
- post api("/internal/error_tracking_allowed"), params: params.except(:public_key),
- headers: { API::Helpers::GITLAB_SHARED_SECRET_HEADER => Base64.encode64(secret_token) }
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- end
- end
-
- context 'when the error tracking is disabled' do
- it 'returns enabled: false' do
- create(:error_tracking_client_key, project: project, active: false)
-
- post api("/internal/error_tracking_allowed"), params: params,
- headers: { API::Helpers::GITLAB_SHARED_SECRET_HEADER => Base64.encode64(secret_token) }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq({ 'enabled' => false })
- end
-
- context 'when the error tracking record does not exist' do
- it 'returns enabled: false' do
- post api("/internal/error_tracking_allowed"), params: params,
- headers: { API::Helpers::GITLAB_SHARED_SECRET_HEADER => Base64.encode64(secret_token) }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq({ 'enabled' => false })
- end
- end
- end
-
- context 'when the error tracking is enabled' do
- it 'returns enabled: true' do
- client_key = create(:error_tracking_client_key, project: project, active: true)
- params[:public_key] = client_key.public_key
-
- post api("/internal/error_tracking_allowed"), params: params,
- headers: { API::Helpers::GITLAB_SHARED_SECRET_HEADER => Base64.encode64(secret_token) }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq({ 'enabled' => true })
- end
- end
- end
-
describe 'GET /internal/two_factor_recovery_codes' do
let(:key_id) { key.id }
diff --git a/spec/requests/api/internal/error_tracking_spec.rb b/spec/requests/api/internal/error_tracking_spec.rb
new file mode 100644
index 00000000000..69eb54d5ed2
--- /dev/null
+++ b/spec/requests/api/internal/error_tracking_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Internal::ErrorTracking do
+ let(:secret_token) { Gitlab::CurrentSettings.error_tracking_access_token }
+ let(:headers) do
+ { ::API::Internal::ErrorTracking::GITLAB_ERROR_TRACKING_TOKEN_HEADER => Base64.encode64(secret_token) }
+ end
+
+ describe 'GET /internal/error_tracking/allowed' do
+ let_it_be(:project) { create(:project) }
+
+ let(:params) { { project_id: project.id, public_key: 'key' } }
+
+ subject(:send_request) do
+ post api('/internal/error_tracking/allowed'), params: params, headers: headers
+ end
+
+ before do
+ # Because the feature flag is disabled in specs we have to enable it explicitly.
+ stub_feature_flags(use_click_house_database_for_error_tracking: true)
+ stub_feature_flags(gitlab_error_tracking: true)
+ end
+
+ context 'when the secret header is missing' do
+ let(:headers) { {} }
+
+ it 'responds with unauthorized entity' do
+ send_request
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+
+ context 'when some params are missing' do
+ let(:params) { { project_id: project.id } }
+
+ it 'responds with unprocessable entity' do
+ send_request
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
+ context 'when public_key is unknown' do
+ it 'returns enabled: false' do
+ send_request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq('enabled' => false)
+ end
+ end
+
+ context 'when unknown project_id is unknown' do
+ it 'responds with 404 not found' do
+ params[:project_id] = non_existing_record_id
+
+ send_request
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when the error tracking is disabled' do
+ it 'returns enabled: false' do
+ create(:error_tracking_client_key, :disabled, project: project)
+
+ send_request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq('enabled' => false)
+ end
+ end
+
+ context 'when the error tracking is enabled' do
+ let_it_be(:client_key) { create(:error_tracking_client_key, project: project) }
+
+ before do
+ params[:public_key] = client_key.public_key
+
+ stub_application_setting(error_tracking_enabled: true)
+ stub_application_setting(error_tracking_api_url: 'https://localhost/error_tracking')
+ end
+
+ it 'returns enabled: true' do
+ send_request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq('enabled' => true)
+ end
+
+ context 'when feature flags use_click_house_database_for_error_tracking or gitlab_error_tracking are disabled' do
+ before do
+ stub_feature_flags(use_click_house_database_for_error_tracking: false)
+ stub_feature_flags(gitlab_error_tracking: false)
+ end
+
+ it 'returns enabled: false' do
+ send_request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq('enabled' => false)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/internal/kubernetes_spec.rb b/spec/requests/api/internal/kubernetes_spec.rb
index 0e566dd8c0e..c0a979995c9 100644
--- a/spec/requests/api/internal/kubernetes_spec.rb
+++ b/spec/requests/api/internal/kubernetes_spec.rb
@@ -169,12 +169,12 @@ RSpec.describe API::Internal::Kubernetes do
'features' => {}
),
'gitaly_repository' => a_hash_including(
- 'default_branch' => project.default_branch_or_main,
'storage_name' => project.repository_storage,
'relative_path' => project.disk_path + '.git',
'gl_repository' => "project-#{project.id}",
'gl_project_path' => project.full_path
- )
+ ),
+ 'default_branch' => project.default_branch_or_main
)
)
end
diff --git a/spec/requests/api/invitations_spec.rb b/spec/requests/api/invitations_spec.rb
index 64ad5733c1b..53154aef21e 100644
--- a/spec/requests/api/invitations_spec.rb
+++ b/spec/requests/api/invitations_spec.rb
@@ -69,6 +69,20 @@ RSpec.describe API::Invitations do
end
end
+ context 'when invitee is already an invited member' do
+ it 'updates the member for that email' do
+ member = source.add_developer(email)
+
+ expect do
+ post invitations_url(source, maintainer),
+ params: { email: email, access_level: Member::MAINTAINER }
+
+ expect(response).to have_gitlab_http_status(:created)
+ end.to change { member.reset.access_level }.from(Member::DEVELOPER).to(Member::MAINTAINER)
+ .and not_change { source.members.invite.count }
+ end
+ end
+
it 'adds a new member by email' do
expect do
post invitations_url(source, maintainer),
@@ -320,7 +334,7 @@ RSpec.describe API::Invitations do
let(:source) { project }
end
- it 'records queries', :request_store, :use_sql_query_cache do
+ it 'does not exceed expected queries count for emails', :request_store, :use_sql_query_cache do
post invitations_url(project, maintainer), params: { email: email, access_level: Member::DEVELOPER }
control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
@@ -336,7 +350,25 @@ RSpec.describe API::Invitations do
end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
end
- it 'records queries with secondary emails', :request_store, :use_sql_query_cache do
+ it 'does not exceed expected queries count for user_ids', :request_store, :use_sql_query_cache do
+ stranger2 = create(:user)
+
+ post invitations_url(project, maintainer), params: { user_id: stranger.id, access_level: Member::DEVELOPER }
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ post invitations_url(project, maintainer), params: { user_id: stranger2.id, access_level: Member::DEVELOPER }
+ end
+
+ users = create_list(:user, 5)
+
+ unresolved_n_plus_ones = 136 # 54 for 1 vs 190 for 5 - currently there are 34 queries added per user
+
+ expect do
+ post invitations_url(project, maintainer), params: { user_id: users.map(&:id).join(','), access_level: Member::DEVELOPER }
+ end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
+ end
+
+ it 'does not exceed expected queries count with secondary emails', :request_store, :use_sql_query_cache do
create(:email, email: email, user: create(:user))
post invitations_url(project, maintainer), params: { email: email, access_level: Member::DEVELOPER }
@@ -365,7 +397,7 @@ RSpec.describe API::Invitations do
let(:source) { group }
end
- it 'records queries', :request_store, :use_sql_query_cache do
+ it 'does not exceed expected queries count for emails', :request_store, :use_sql_query_cache do
post invitations_url(group, maintainer), params: { email: email, access_level: Member::DEVELOPER }
control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
@@ -381,7 +413,7 @@ RSpec.describe API::Invitations do
end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
end
- it 'records queries with secondary emails', :request_store, :use_sql_query_cache do
+ it 'does not exceed expected queries count for secondary emails', :request_store, :use_sql_query_cache do
create(:email, email: email, user: create(:user))
post invitations_url(group, maintainer), params: { email: email, access_level: Member::DEVELOPER }
diff --git a/spec/requests/api/issues/issues_spec.rb b/spec/requests/api/issues/issues_spec.rb
index 480baff6eed..dd7d32f3565 100644
--- a/spec/requests/api/issues/issues_spec.rb
+++ b/spec/requests/api/issues/issues_spec.rb
@@ -20,6 +20,7 @@ RSpec.describe API::Issues do
let_it_be(:milestone) { create(:milestone, title: '1.0.0', project: project) }
let_it_be(:empty_milestone) { create(:milestone, title: '2.0.0', project: project) }
+ let_it_be(:task) { create(:issue, :task, author: user, project: project) }
let_it_be(:closed_issue) do
create :closed_issue,
@@ -1151,19 +1152,6 @@ RSpec.describe API::Issues do
expected_url = expose_url(api_v4_project_issue_path(id: new_issue.project_id, issue_iid: new_issue.iid))
expect(json_response.dig('_links', 'closed_as_duplicate_of')).to eq(expected_url)
end
-
- context 'feature flag is disabled' do
- before do
- stub_feature_flags(closed_as_duplicate_of_issues_api: false)
- end
-
- it 'does not return the issue as closed_as_duplicate_of' do
- get api("/projects/#{project.id}/issues/#{issue_closed_as_dup.iid}", user)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response.dig('_links', 'closed_as_duplicate_of')).to eq(nil)
- end
- end
end
end
end
diff --git a/spec/requests/api/markdown_snapshot_spec.rb b/spec/requests/api/markdown_snapshot_spec.rb
index 37607a4e866..1270efdfd6f 100644
--- a/spec/requests/api/markdown_snapshot_spec.rb
+++ b/spec/requests/api/markdown_snapshot_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
# See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
# for documentation on this spec.
RSpec.describe API::Markdown, 'Snapshot' do
+ # noinspection RubyMismatchedArgumentType (ignore RBS type warning: __dir__ can be nil, but 2nd argument can't be nil)
glfm_specification_dir = File.expand_path('../../../glfm_specification', __dir__)
- glfm_example_snapshots_dir = File.expand_path('../../fixtures/glfm/example_snapshots', __dir__)
- include_context 'with API::Markdown Snapshot shared context', glfm_specification_dir, glfm_example_snapshots_dir
+ include_context 'with API::Markdown Snapshot shared context', glfm_specification_dir
end
diff --git a/spec/requests/api/maven_packages_spec.rb b/spec/requests/api/maven_packages_spec.rb
index bc325aad823..ba82d2facc6 100644
--- a/spec/requests/api/maven_packages_spec.rb
+++ b/spec/requests/api/maven_packages_spec.rb
@@ -226,14 +226,26 @@ RSpec.describe API::MavenPackages do
end
end
+ shared_examples 'file download in FIPS mode' do
+ context 'in FIPS mode', :fips_mode do
+ it_behaves_like 'successfully returning the file'
+
+ it 'rejects the request for an md5 file' do
+ download_file(file_name: package_file.file_name + '.md5')
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+ end
+
describe 'GET /api/v4/packages/maven/*path/:file_name' do
context 'a public project' do
subject { download_file(file_name: package_file.file_name) }
shared_examples 'getting a file' do
it_behaves_like 'tracking the file download event'
-
it_behaves_like 'successfully returning the file'
+ it_behaves_like 'file download in FIPS mode'
it 'returns sha1 of the file' do
download_file(file_name: package_file.file_name + '.sha1')
@@ -402,8 +414,8 @@ RSpec.describe API::MavenPackages do
shared_examples 'getting a file for a group' do
it_behaves_like 'tracking the file download event'
-
it_behaves_like 'successfully returning the file'
+ it_behaves_like 'file download in FIPS mode'
it 'returns sha1 of the file' do
download_file(file_name: package_file.file_name + '.sha1')
@@ -625,8 +637,8 @@ RSpec.describe API::MavenPackages do
subject { download_file(file_name: package_file.file_name) }
it_behaves_like 'tracking the file download event'
-
it_behaves_like 'successfully returning the file'
+ it_behaves_like 'file download in FIPS mode'
it 'returns sha1 of the file' do
download_file(file_name: package_file.file_name + '.sha1')
@@ -833,6 +845,16 @@ RSpec.describe API::MavenPackages do
subject { upload_file_with_token(params: params) }
+ context 'FIPS mode', :fips_mode do
+ it_behaves_like 'package workhorse uploads'
+
+ it 'rejects the request for md5 file' do
+ upload_file_with_token(params: params, file_extension: 'jar.md5')
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
context 'file size is too large' do
it 'rejects the request' do
allow_next_instance_of(UploadedFile) do |uploaded_file|
@@ -995,12 +1017,22 @@ RSpec.describe API::MavenPackages do
end
context 'for md5 file' do
+ subject { upload_file_with_token(params: params, file_extension: 'jar.md5') }
+
it 'returns an empty body' do
- upload_file_with_token(params: params, file_extension: 'jar.md5')
+ subject
expect(response.body).to eq('')
expect(response).to have_gitlab_http_status(:ok)
end
+
+ context 'with FIPS mode enabled', :fips_mode do
+ it 'rejects the request' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
end
end
diff --git a/spec/requests/api/metadata_spec.rb b/spec/requests/api/metadata_spec.rb
new file mode 100644
index 00000000000..dbca06b7f3e
--- /dev/null
+++ b/spec/requests/api/metadata_spec.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Metadata do
+ shared_examples_for 'GET /metadata' do
+ context 'when unauthenticated' do
+ it 'returns authentication error' do
+ get api('/metadata')
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+
+ context 'when authenticated as user' do
+ let(:user) { create(:user) }
+
+ it 'returns the metadata information' do
+ get api('/metadata', user)
+
+ expect_metadata
+ end
+ end
+
+ context 'when authenticated with token' do
+ let(:personal_access_token) { create(:personal_access_token, scopes: scopes) }
+
+ context 'with api scope' do
+ let(:scopes) { %i(api) }
+
+ it 'returns the metadata information' do
+ get api('/metadata', personal_access_token: personal_access_token)
+
+ expect_metadata
+ end
+
+ it 'returns "200" response on head requests' do
+ head api('/metadata', personal_access_token: personal_access_token)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'with read_user scope' do
+ let(:scopes) { %i(read_user) }
+
+ it 'returns the metadata information' do
+ get api('/metadata', personal_access_token: personal_access_token)
+
+ expect_metadata
+ end
+
+ it 'returns "200" response on head requests' do
+ head api('/metadata', personal_access_token: personal_access_token)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'with neither api nor read_user scope' do
+ let(:scopes) { %i(read_repository) }
+
+ it 'returns authorization error' do
+ get api('/metadata', personal_access_token: personal_access_token)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
+ def expect_metadata
+ aggregate_failures("testing response") do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/metadata')
+ end
+ end
+ end
+
+ context 'with graphql enabled' do
+ before do
+ stub_feature_flags(graphql: true)
+ end
+
+ include_examples 'GET /metadata'
+ end
+
+ context 'with graphql disabled' do
+ before do
+ stub_feature_flags(graphql: false)
+ end
+
+ include_examples 'GET /metadata'
+ end
+end
diff --git a/spec/requests/api/npm_project_packages_spec.rb b/spec/requests/api/npm_project_packages_spec.rb
index 7c3f1890095..62809b432af 100644
--- a/spec/requests/api/npm_project_packages_spec.rb
+++ b/spec/requests/api/npm_project_packages_spec.rb
@@ -30,6 +30,7 @@ RSpec.describe API::NpmProjectPackages do
end
describe 'GET /api/v4/projects/:id/packages/npm/*package_name/-/*file_name' do
+ let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace } }
let(:package_file) { package.package_files.first }
let(:headers) { {} }
@@ -61,18 +62,18 @@ RSpec.describe API::NpmProjectPackages do
let(:headers) { build_token_auth_header(token.token) }
it_behaves_like 'successfully downloads the file'
+ it_behaves_like 'a package tracking event', 'API::NpmPackages', 'pull_package'
end
context 'with job token' do
let(:headers) { build_token_auth_header(job.token) }
it_behaves_like 'successfully downloads the file'
+ it_behaves_like 'a package tracking event', 'API::NpmPackages', 'pull_package'
end
end
context 'a public project' do
- let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace } }
-
it_behaves_like 'successfully downloads the file'
it_behaves_like 'a package tracking event', 'API::NpmPackages', 'pull_package'
@@ -112,6 +113,15 @@ RSpec.describe API::NpmProjectPackages do
end
it_behaves_like 'a package file that requires auth'
+
+ context 'with a job token for a different user' do
+ let_it_be(:other_user) { create(:user) }
+ let_it_be_with_reload(:other_job) { create(:ci_build, :running, user: other_user) }
+
+ let(:headers) { build_token_auth_header(other_job.token) }
+
+ it_behaves_like 'successfully downloads the file'
+ end
end
end
diff --git a/spec/requests/api/project_attributes.yml b/spec/requests/api/project_attributes.yml
index 35844631287..8d3622ca17d 100644
--- a/spec/requests/api/project_attributes.yml
+++ b/spec/requests/api/project_attributes.yml
@@ -100,6 +100,7 @@ ci_cd_settings:
forward_deployment_enabled: ci_forward_deployment_enabled
job_token_scope_enabled: ci_job_token_scope_enabled
separated_caches: ci_separated_caches
+ opt_in_jwt: ci_opt_in_jwt
build_import_state: # import_state
unexposed_attributes:
@@ -123,6 +124,11 @@ project_feature:
- created_at
- metrics_dashboard_access_level
- package_registry_access_level
+ - monitor_access_level
+ - infrastructure_access_level
+ - feature_flags_access_level
+ - environments_access_level
+ - releases_access_level
- project_id
- updated_at
computed_attributes:
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index 8a8cd8512f8..d74fd82ca09 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -248,9 +248,10 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache do
let(:request) { get api(download_path, admin) }
before do
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:project_download_export][:threshold].call + 1)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ threshold = Gitlab::ApplicationRateLimiter.rate_limits[:project_download_export][:threshold].call
+ allow(strategy).to receive(:increment).and_return(threshold + 1)
+ end
end
it 'prevents requesting project export' do
@@ -433,9 +434,10 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache do
context 'when rate limit is exceeded across projects' do
before do
- allow(Gitlab::ApplicationRateLimiter)
- .to receive(:increment)
- .and_return(Gitlab::ApplicationRateLimiter.rate_limits[:project_export][:threshold].call + 1)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ threshold = Gitlab::ApplicationRateLimiter.rate_limits[:project_export][:threshold].call
+ allow(strategy).to receive(:increment).and_return(threshold + 1)
+ end
end
it 'prevents requesting project export' do
diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb
index 26e0adc11b3..2d925620a91 100644
--- a/spec/requests/api/project_hooks_spec.rb
+++ b/spec/requests/api/project_hooks_spec.rb
@@ -3,10 +3,10 @@
require 'spec_helper'
RSpec.describe API::ProjectHooks, 'ProjectHooks' do
- let(:user) { create(:user) }
- let(:user3) { create(:user) }
- let!(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
- let!(:hook) do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:user3) { create(:user) }
+ let_it_be(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
+ let_it_be_with_refind(:hook) do
create(:project_hook,
:all_events_enabled,
project: project,
@@ -15,232 +15,55 @@ RSpec.describe API::ProjectHooks, 'ProjectHooks' do
push_events_branch_filter: 'master')
end
- before do
+ before_all do
project.add_maintainer(user)
project.add_developer(user3)
end
- describe "GET /projects/:id/hooks" do
- context "authorized user" do
- it "returns project hooks" do
- get api("/projects/#{project.id}/hooks", user)
+ it_behaves_like 'web-hook API endpoints', '/projects/:id' do
+ let(:unauthorized_user) { user3 }
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to be_an Array
- expect(response).to include_pagination_headers
- expect(json_response.count).to eq(1)
- expect(json_response.first['url']).to eq("http://example.com")
- expect(json_response.first['issues_events']).to eq(true)
- expect(json_response.first['confidential_issues_events']).to eq(true)
- expect(json_response.first['push_events']).to eq(true)
- expect(json_response.first['merge_requests_events']).to eq(true)
- expect(json_response.first['tag_push_events']).to eq(true)
- expect(json_response.first['note_events']).to eq(true)
- expect(json_response.first['confidential_note_events']).to eq(true)
- expect(json_response.first['job_events']).to eq(true)
- expect(json_response.first['pipeline_events']).to eq(true)
- expect(json_response.first['wiki_page_events']).to eq(true)
- expect(json_response.first['deployment_events']).to eq(true)
- expect(json_response.first['releases_events']).to eq(true)
- expect(json_response.first['enable_ssl_verification']).to eq(true)
- expect(json_response.first['push_events_branch_filter']).to eq('master')
- expect(json_response.first['alert_status']).to eq('executable')
- expect(json_response.first['disabled_until']).to be_nil
- end
+ def scope
+ project.hooks
end
- context "unauthorized user" do
- it "does not access project hooks" do
- get api("/projects/#{project.id}/hooks", user3)
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
- end
-
- describe "GET /projects/:id/hooks/:hook_id" do
- context "authorized user" do
- it "returns a project hook" do
- get api("/projects/#{project.id}/hooks/#{hook.id}", user)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['url']).to eq(hook.url)
- expect(json_response['issues_events']).to eq(hook.issues_events)
- expect(json_response['confidential_issues_events']).to eq(hook.confidential_issues_events)
- expect(json_response['push_events']).to eq(hook.push_events)
- expect(json_response['merge_requests_events']).to eq(hook.merge_requests_events)
- expect(json_response['tag_push_events']).to eq(hook.tag_push_events)
- expect(json_response['note_events']).to eq(hook.note_events)
- expect(json_response['confidential_note_events']).to eq(hook.confidential_note_events)
- expect(json_response['job_events']).to eq(hook.job_events)
- expect(json_response['pipeline_events']).to eq(hook.pipeline_events)
- expect(json_response['wiki_page_events']).to eq(hook.wiki_page_events)
- expect(json_response['releases_events']).to eq(hook.releases_events)
- expect(json_response['deployment_events']).to eq(true)
- expect(json_response['enable_ssl_verification']).to eq(hook.enable_ssl_verification)
- expect(json_response['alert_status']).to eq(hook.alert_status.to_s)
- expect(json_response['disabled_until']).to be_nil
- end
-
- it "returns a 404 error if hook id is not available" do
- get api("/projects/#{project.id}/hooks/#{non_existing_record_id}", user)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context "unauthorized user" do
- it "does not access an existing hook" do
- get api("/projects/#{project.id}/hooks/#{hook.id}", user3)
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
- end
-
- describe "POST /projects/:id/hooks" do
- it "adds hook to project" do
- expect do
- post(api("/projects/#{project.id}/hooks", user),
- params: { url: "http://example.com", issues_events: true,
- confidential_issues_events: true, wiki_page_events: true,
- job_events: true, deployment_events: true, releases_events: true,
- push_events_branch_filter: 'some-feature-branch' })
- end.to change {project.hooks.count}.by(1)
-
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response['url']).to eq('http://example.com')
- expect(json_response['issues_events']).to eq(true)
- expect(json_response['confidential_issues_events']).to eq(true)
- expect(json_response['push_events']).to eq(true)
- expect(json_response['merge_requests_events']).to eq(false)
- expect(json_response['tag_push_events']).to eq(false)
- expect(json_response['note_events']).to eq(false)
- expect(json_response['confidential_note_events']).to eq(nil)
- expect(json_response['job_events']).to eq(true)
- expect(json_response['pipeline_events']).to eq(false)
- expect(json_response['wiki_page_events']).to eq(true)
- expect(json_response['deployment_events']).to eq(true)
- expect(json_response['releases_events']).to eq(true)
- expect(json_response['enable_ssl_verification']).to eq(true)
- expect(json_response['push_events_branch_filter']).to eq('some-feature-branch')
- expect(json_response).not_to include('token')
+ def collection_uri
+ "/projects/#{project.id}/hooks"
end
- it "adds the token without including it in the response" do
- token = "secret token"
-
- expect do
- post api("/projects/#{project.id}/hooks", user), params: { url: "http://example.com", token: token }
- end.to change {project.hooks.count}.by(1)
-
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response["url"]).to eq("http://example.com")
- expect(json_response).not_to include("token")
-
- hook = project.hooks.find(json_response["id"])
-
- expect(hook.url).to eq("http://example.com")
- expect(hook.token).to eq(token)
+ def match_collection_schema
+ match_response_schema('public_api/v4/project_hooks')
end
- it "returns a 400 error if url not given" do
- post api("/projects/#{project.id}/hooks", user)
- expect(response).to have_gitlab_http_status(:bad_request)
+ def hook_uri(hook_id = hook.id)
+ "/projects/#{project.id}/hooks/#{hook_id}"
end
- it "returns a 422 error if url not valid" do
- post api("/projects/#{project.id}/hooks", user), params: { url: "ftp://example.com" }
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ def match_hook_schema
+ match_response_schema('public_api/v4/project_hook')
end
- it "returns a 422 error if branch filter is not valid" do
- post api("/projects/#{project.id}/hooks", user), params: { url: "http://example.com", push_events_branch_filter: '~badbranchname/' }
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ def event_names
+ %i[
+ push_events
+ tag_push_events
+ merge_requests_events
+ issues_events
+ confidential_issues_events
+ note_events
+ confidential_note_events
+ pipeline_events
+ wiki_page_events
+ job_events
+ deployment_events
+ releases_events
+ ]
end
- end
-
- describe "PUT /projects/:id/hooks/:hook_id" do
- it "updates an existing project hook" do
- put api("/projects/#{project.id}/hooks/#{hook.id}", user),
- params: { url: 'http://example.org', push_events: false, job_events: true }
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['url']).to eq('http://example.org')
- expect(json_response['issues_events']).to eq(hook.issues_events)
- expect(json_response['confidential_issues_events']).to eq(hook.confidential_issues_events)
- expect(json_response['push_events']).to eq(false)
- expect(json_response['merge_requests_events']).to eq(hook.merge_requests_events)
- expect(json_response['tag_push_events']).to eq(hook.tag_push_events)
- expect(json_response['note_events']).to eq(hook.note_events)
- expect(json_response['confidential_note_events']).to eq(hook.confidential_note_events)
- expect(json_response['job_events']).to eq(hook.job_events)
- expect(json_response['pipeline_events']).to eq(hook.pipeline_events)
- expect(json_response['wiki_page_events']).to eq(hook.wiki_page_events)
- expect(json_response['releases_events']).to eq(hook.releases_events)
- expect(json_response['enable_ssl_verification']).to eq(hook.enable_ssl_verification)
+ let(:default_values) do
+ { push_events: true, confidential_note_events: nil }
end
- it "adds the token without including it in the response" do
- token = "secret token"
-
- put api("/projects/#{project.id}/hooks/#{hook.id}", user), params: { url: "http://example.org", token: token }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response["url"]).to eq("http://example.org")
- expect(json_response).not_to include("token")
-
- expect(hook.reload.url).to eq("http://example.org")
- expect(hook.reload.token).to eq(token)
- end
-
- it "returns 404 error if hook id not found" do
- put api("/projects/#{project.id}/hooks/#{non_existing_record_id}", user), params: { url: 'http://example.org' }
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- it "returns 400 error if url is not given" do
- put api("/projects/#{project.id}/hooks/#{hook.id}", user)
- expect(response).to have_gitlab_http_status(:bad_request)
- end
-
- it "returns a 422 error if url is not valid" do
- put api("/projects/#{project.id}/hooks/#{hook.id}", user), params: { url: 'ftp://example.com' }
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- end
- end
-
- describe "DELETE /projects/:id/hooks/:hook_id" do
- it "deletes hook from project" do
- expect do
- delete api("/projects/#{project.id}/hooks/#{hook.id}", user)
-
- expect(response).to have_gitlab_http_status(:no_content)
- end.to change {project.hooks.count}.by(-1)
- end
-
- it "returns a 404 error when deleting non existent hook" do
- delete api("/projects/#{project.id}/hooks/42", user)
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- it "returns a 404 error if hook id not given" do
- delete api("/projects/#{project.id}/hooks", user)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- it "returns a 404 if a user attempts to delete project hooks they do not own" do
- test_user = create(:user)
- other_project = create(:project)
- other_project.add_maintainer(test_user)
-
- delete api("/projects/#{other_project.id}/hooks/#{hook.id}", test_user)
- expect(response).to have_gitlab_http_status(:not_found)
- expect(WebHook.exists?(hook.id)).to be_truthy
- end
-
- it_behaves_like '412 response' do
- let(:request) { api("/projects/#{project.id}/hooks/#{hook.id}", user) }
- end
+ it_behaves_like 'web-hook API endpoints with branch-filter', '/projects/:id'
end
end
diff --git a/spec/requests/api/project_import_spec.rb b/spec/requests/api/project_import_spec.rb
index 7e6d80c047c..8655e5b0238 100644
--- a/spec/requests/api/project_import_spec.rb
+++ b/spec/requests/api/project_import_spec.rb
@@ -462,6 +462,16 @@ RSpec.describe API::ProjectImport, :aggregate_failures do
expect(json_response).to include('import_status' => 'failed',
'import_error' => 'error')
end
+
+ it 'returns the import status if canceled' do
+ project = create(:project, :import_canceled)
+ project.add_maintainer(user)
+
+ get api("/projects/#{project.id}/import", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include('import_status' => 'canceled')
+ end
end
describe 'POST /projects/import/authorize' do
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 431d2e56cb5..ae689d7327b 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -328,6 +328,45 @@ RSpec.describe API::Projects do
end
end
+ context 'filter by topic_id' do
+ let_it_be(:topic1) { create(:topic) }
+ let_it_be(:topic2) { create(:topic) }
+
+ let(:current_user) { user }
+
+ before do
+ project.topics << topic1
+ end
+
+ context 'with id of assigned topic' do
+ it_behaves_like 'projects response' do
+ let(:filter) { { topic_id: topic1.id } }
+ let(:projects) { [project] }
+ end
+ end
+
+ context 'with id of unassigned topic' do
+ it_behaves_like 'projects response' do
+ let(:filter) { { topic_id: topic2.id } }
+ let(:projects) { [] }
+ end
+ end
+
+ context 'with non-existing topic id' do
+ it_behaves_like 'projects response' do
+ let(:filter) { { topic_id: non_existing_record_id } }
+ let(:projects) { [] }
+ end
+ end
+
+ context 'with empty topic id' do
+ it_behaves_like 'projects response' do
+ let(:filter) { { topic_id: '' } }
+ let(:projects) { user_projects }
+ end
+ end
+ end
+
context 'and with_issues_enabled=true' do
it 'only returns projects with issues enabled' do
project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED)
@@ -2388,6 +2427,7 @@ RSpec.describe API::Projects do
expect(json_response['only_allow_merge_if_all_discussions_are_resolved']).to eq(project.only_allow_merge_if_all_discussions_are_resolved)
expect(json_response['ci_default_git_depth']).to eq(project.ci_default_git_depth)
expect(json_response['ci_forward_deployment_enabled']).to eq(project.ci_forward_deployment_enabled)
+ expect(json_response['ci_separated_caches']).to eq(project.ci_separated_caches)
expect(json_response['merge_method']).to eq(project.merge_method.to_s)
expect(json_response['squash_option']).to eq(project.squash_option.to_s)
expect(json_response['readme_url']).to eq(project.readme_url)
@@ -3199,7 +3239,7 @@ RSpec.describe API::Projects do
measure_project.add_developer(create(:user))
measure_project.add_developer(create(:user)) # make this 2nd one to find any n+1
- unresolved_n_plus_ones = 21 # 21 queries added per member
+ unresolved_n_plus_ones = 27 # 27 queries added per member
expect do
post api("/projects/#{project.id}/import_project_members/#{measure_project.id}", user)
@@ -3652,6 +3692,7 @@ RSpec.describe API::Projects do
merge_method: 'ff',
ci_default_git_depth: 20,
ci_forward_deployment_enabled: false,
+ ci_separated_caches: false,
description: 'new description' }
put api("/projects/#{project3.id}", user4), params: project_param
diff --git a/spec/requests/api/protected_tags_spec.rb b/spec/requests/api/protected_tags_spec.rb
index cc7261dafc9..84b7df86f31 100644
--- a/spec/requests/api/protected_tags_spec.rb
+++ b/spec/requests/api/protected_tags_spec.rb
@@ -3,9 +3,10 @@
require 'spec_helper'
RSpec.describe API::ProtectedTags do
- let(:user) { create(:user) }
- let!(:project) { create(:project, :repository) }
- let(:project2) { create(:project, path: 'project2', namespace: user.namespace) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:project2) { create(:project, path: 'project2', namespace: user.namespace) }
+
let(:protected_name) { 'feature' }
let(:tag_name) { protected_name }
let!(:protected_tag) do
diff --git a/spec/requests/api/pypi_packages_spec.rb b/spec/requests/api/pypi_packages_spec.rb
index a24b852cdac..9e0d3780fd8 100644
--- a/spec/requests/api/pypi_packages_spec.rb
+++ b/spec/requests/api/pypi_packages_spec.rb
@@ -197,7 +197,7 @@ RSpec.describe API::PypiPackages do
let(:url) { "/projects/#{project.id}/packages/pypi" }
let(:headers) { {} }
let(:requires_python) { '>=3.7' }
- let(:base_params) { { requires_python: requires_python, version: '1.0.0', name: 'sample-project', sha256_digest: '1' * 64 } }
+ let(:base_params) { { requires_python: requires_python, version: '1.0.0', name: 'sample-project', sha256_digest: '1' * 64, md5_digest: '1' * 32 } }
let(:params) { base_params.merge(content: temp_file(file_name)) }
let(:send_rewritten_field) { true }
let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace, user: user } }
@@ -254,6 +254,19 @@ RSpec.describe API::PypiPackages do
it_behaves_like 'PyPI package creation', :developer, :created, true
end
+
+ context 'without md5_digest' do
+ let(:token) { personal_access_token.token }
+ let(:user_headers) { basic_auth_header(user.username, token) }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+ let(:params) { base_params.merge(content: temp_file(file_name)) }
+
+ before do
+ params.delete(:md5_digest)
+ end
+
+ it_behaves_like 'PyPI package creation', :developer, :created, true, false
+ end
end
context 'with required_python too big' do
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index d6d2bd5baf2..cf0165d123f 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -784,6 +784,40 @@ RSpec.describe API::Repositories do
expect(json_response['notes']).to be_present
end
+ it 'supports specified config file path' do
+ spy = instance_spy(Repositories::ChangelogService)
+
+ expect(Repositories::ChangelogService)
+ .to receive(:new)
+ .with(
+ project,
+ user,
+ version: '1.0.0',
+ from: 'foo',
+ to: 'bar',
+ date: DateTime.new(2020, 1, 1),
+ trailer: 'Foo',
+ config_file: 'specified_changelog_config.yml'
+ )
+ .and_return(spy)
+
+ expect(spy).to receive(:execute).with(commit_to_changelog: false)
+
+ get(
+ api("/projects/#{project.id}/repository/changelog", user),
+ params: {
+ version: '1.0.0',
+ from: 'foo',
+ to: 'bar',
+ date: '2020-01-01',
+ trailer: 'Foo',
+ config_file: 'specified_changelog_config.yml'
+ }
+ )
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
context 'when previous tag version does not exist' do
it_behaves_like '422 response' do
let(:request) { get api("/projects/#{project.id}/repository/changelog", user), params: { version: 'v0.0.0' } }
@@ -905,5 +939,45 @@ RSpec.describe API::Repositories do
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response['message']).to eq('Failed to generate the changelog: oops')
end
+
+ it "support specified config file path" do
+ spy = instance_spy(Repositories::ChangelogService)
+
+ expect(Repositories::ChangelogService)
+ .to receive(:new)
+ .with(
+ project,
+ user,
+ version: '1.0.0',
+ from: 'foo',
+ to: 'bar',
+ date: DateTime.new(2020, 1, 1),
+ branch: 'kittens',
+ trailer: 'Foo',
+ config_file: 'specified_changelog_config.yml',
+ file: 'FOO.md',
+ message: 'Commit message'
+ )
+ .and_return(spy)
+
+ allow(spy).to receive(:execute).with(commit_to_changelog: true)
+
+ post(
+ api("/projects/#{project.id}/repository/changelog", user),
+ params: {
+ version: '1.0.0',
+ from: 'foo',
+ to: 'bar',
+ date: '2020-01-01',
+ branch: 'kittens',
+ trailer: 'Foo',
+ config_file: 'specified_changelog_config.yml',
+ file: 'FOO.md',
+ message: 'Commit message'
+ }
+ )
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
end
end
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index cfda06da8f3..d4a8e591622 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -373,7 +373,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
end
end
- context "snowplow tracking settings" do
+ context "snowplow tracking settings", :do_not_stub_snowplow_by_default do
let(:settings) do
{
snowplow_collector_hostname: "snowplow.example.com",
diff --git a/spec/requests/api/snippets_spec.rb b/spec/requests/api/snippets_spec.rb
index 13160519996..0ba1011684a 100644
--- a/spec/requests/api/snippets_spec.rb
+++ b/spec/requests/api/snippets_spec.rb
@@ -9,9 +9,9 @@ RSpec.describe API::Snippets, factory_default: :keep do
let_it_be(:user) { create(:user) }
let_it_be(:other_user) { create(:user) }
- let_it_be(:public_snippet) { create(:personal_snippet, :repository, :public, author: user) }
- let_it_be(:private_snippet) { create(:personal_snippet, :repository, :private, author: user) }
- let_it_be(:internal_snippet) { create(:personal_snippet, :repository, :internal, author: user) }
+ let_it_be(:public_snippet) { create(:personal_snippet, :repository, :public, author: user) }
+ let_it_be_with_refind(:private_snippet) { create(:personal_snippet, :repository, :private, author: user) }
+ let_it_be(:internal_snippet) { create(:personal_snippet, :repository, :internal, author: user) }
let_it_be(:user_token) { create(:personal_access_token, user: user) }
let_it_be(:other_user_token) { create(:personal_access_token, user: other_user) }
@@ -63,6 +63,23 @@ RSpec.describe API::Snippets, factory_default: :keep do
expect(snippet["id"]).not_to eq(public_snippet.id)
end
end
+
+ context 'filtering snippets by created_after/created_before' do
+ let_it_be(:private_snippet_before_time_range) { create(:personal_snippet, :repository, :private, author: user, created_at: Time.parse("2021-08-20T00:00:00Z")) }
+ let_it_be(:private_snippet_in_time_range1) { create(:personal_snippet, :repository, :private, author: user, created_at: Time.parse("2021-08-22T00:00:00Z")) }
+ let_it_be(:private_snippet_in_time_range2) { create(:personal_snippet, :repository, :private, author: user, created_at: Time.parse("2021-08-24T00:00:00Z")) }
+ let_it_be(:private_snippet_after_time_range) { create(:personal_snippet, :repository, :private, author: user, created_at: Time.parse("2021-08-26T00:00:00Z")) }
+
+ let(:path) { "/snippets?created_after=2021-08-21T00:00:00Z&created_before=2021-08-25T00:00:00Z" }
+
+ it 'returns snippets available for user in given time range' do
+ get api(path, personal_access_token: user_token)
+
+ expect(json_response.map { |snippet| snippet['id']} ).to contain_exactly(
+ private_snippet_in_time_range1.id,
+ private_snippet_in_time_range2.id)
+ end
+ end
end
describe 'GET /snippets/public' do
@@ -98,6 +115,21 @@ RSpec.describe API::Snippets, factory_default: :keep do
expect(response).to have_gitlab_http_status(:unauthorized)
end
+
+ context 'filtering public snippets by created_after/created_before' do
+ let_it_be(:public_snippet_before_time_range) { create(:personal_snippet, :repository, :public, author: other_user, created_at: Time.parse("2021-08-20T00:00:00Z")) }
+ let_it_be(:public_snippet_in_time_range) { create(:personal_snippet, :repository, :public, author: other_user, created_at: Time.parse("2021-08-22T00:00:00Z")) }
+ let_it_be(:public_snippet_after_time_range) { create(:personal_snippet, :repository, :public, author: other_user, created_at: Time.parse("2021-08-24T00:00:00Z")) }
+
+ let(:path) { "/snippets/public?created_after=2021-08-21T00:00:00Z&created_before=2021-08-23T00:00:00Z" }
+
+ it 'returns public snippets available to user in given time range' do
+ get api(path, personal_access_token: user_token)
+
+ expect(json_response.map { |snippet| snippet['id']} ).to contain_exactly(
+ public_snippet_in_time_range.id)
+ end
+ end
end
describe 'GET /snippets/:id/raw' do
diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb
index 2460a98129f..0f1dbea2e73 100644
--- a/spec/requests/api/system_hooks_spec.rb
+++ b/spec/requests/api/system_hooks_spec.rb
@@ -3,221 +3,58 @@
require 'spec_helper'
RSpec.describe API::SystemHooks do
- include StubRequests
+ let_it_be(:non_admin) { create(:user) }
+ let_it_be(:admin) { create(:admin) }
+ let_it_be_with_refind(:hook) { create(:system_hook, url: "http://example.com") }
- let(:user) { create(:user) }
- let(:admin) { create(:admin) }
- let!(:hook) { create(:system_hook, url: "http://example.com") }
+ it_behaves_like 'web-hook API endpoints', '' do
+ let(:user) { admin }
+ let(:unauthorized_user) { non_admin }
- before do
- stub_full_request(hook.url, method: :post)
- end
-
- describe "GET /hooks" do
- context "when no user" do
- it "returns authentication error" do
- get api("/hooks")
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
+ def scope
+ SystemHook
end
- context "when not an admin" do
- it "returns forbidden error" do
- get api("/hooks", user)
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
+ def collection_uri
+ "/hooks"
end
- context "when authenticated as admin" do
- it "returns an array of hooks" do
- get api("/hooks", admin)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to include_pagination_headers
- expect(response).to match_response_schema('public_api/v4/system_hooks')
- expect(json_response.first).not_to have_key("token")
- expect(json_response.first['url']).to eq(hook.url)
- expect(json_response.first['push_events']).to be false
- expect(json_response.first['tag_push_events']).to be false
- expect(json_response.first['merge_requests_events']).to be false
- expect(json_response.first['repository_update_events']).to be true
- expect(json_response.first['enable_ssl_verification']).to be true
- expect(json_response.first['disabled_until']).to be nil
- expect(json_response.first['alert_status']).to eq 'executable'
- end
+ def match_collection_schema
+ match_response_schema('public_api/v4/system_hooks')
end
- end
- describe "GET /hooks/:id" do
- context "when no user" do
- it "returns authentication error" do
- get api("/hooks/#{hook.id}")
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
+ def hook_uri(hook_id = hook.id)
+ "/hooks/#{hook_id}"
end
- context "when not an admin" do
- it "returns forbidden error" do
- get api("/hooks/#{hook.id}", user)
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
-
- context "when authenticated as admin" do
- it "gets a hook", :aggregate_failures do
- get api("/hooks/#{hook.id}", admin)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to match_response_schema('public_api/v4/system_hook')
- expect(json_response).to match(
- 'id' => be(hook.id),
- 'url' => eq(hook.url),
- 'created_at' => eq(hook.created_at.iso8601(3)),
- 'push_events' => be(hook.push_events),
- 'tag_push_events' => be(hook.tag_push_events),
- 'merge_requests_events' => be(hook.merge_requests_events),
- 'repository_update_events' => be(hook.repository_update_events),
- 'enable_ssl_verification' => be(hook.enable_ssl_verification),
- 'alert_status' => eq(hook.alert_status.to_s),
- 'disabled_until' => eq(hook.disabled_until&.iso8601(3))
- )
- end
-
- context 'the hook is disabled' do
- before do
- hook.disable!
- end
-
- it "has the correct alert status", :aggregate_failures do
- get api("/hooks/#{hook.id}", admin)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to match_response_schema('public_api/v4/system_hook')
- expect(json_response).to include('alert_status' => 'disabled')
- end
- end
-
- context 'the hook is backed-off' do
- before do
- hook.backoff!
- end
-
- it "has the correct alert status", :aggregate_failures do
- get api("/hooks/#{hook.id}", admin)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to match_response_schema('public_api/v4/system_hook')
- expect(json_response).to include(
- 'alert_status' => 'temporarily_disabled',
- 'disabled_until' => hook.disabled_until.iso8601(3)
- )
- end
- end
-
- it 'returns 404 if the system hook does not exist' do
- get api("/hooks/#{non_existing_record_id}", admin)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ def match_hook_schema
+ match_response_schema('public_api/v4/system_hook')
end
- end
- describe "POST /hooks" do
- it "creates new hook" do
- expect do
- post api("/hooks", admin), params: { url: 'http://example.com' }
- end.to change { SystemHook.count }.by(1)
+ def event_names
+ %i[
+ push_events
+ tag_push_events
+ merge_requests_events
+ repository_update_events
+ ]
end
- it "responds with 400 if url not given" do
- post api("/hooks", admin)
-
- expect(response).to have_gitlab_http_status(:bad_request)
+ def hook_param_overrides
+ {}
end
- it "responds with 400 if url is invalid" do
- post api("/hooks", admin), params: { url: 'hp://mep.mep' }
-
- expect(response).to have_gitlab_http_status(:bad_request)
+ let(:update_params) do
+ {
+ push_events: false,
+ tag_push_events: true
+ }
end
- it "does not create new hook without url" do
- expect do
- post api("/hooks", admin)
- end.not_to change { SystemHook.count }
+ let(:default_values) do
+ { repository_update_events: true }
end
- it 'sets default values for events' do
- stub_full_request('http://mep.mep', method: :post)
-
- post api('/hooks', admin), params: { url: 'http://mep.mep' }
-
- expect(response).to have_gitlab_http_status(:created)
- expect(response).to match_response_schema('public_api/v4/system_hook')
- expect(json_response['enable_ssl_verification']).to be true
- 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
- stub_full_request('http://mep.mep', method: :post)
-
- post api('/hooks', admin),
- params: {
- url: 'http://mep.mep',
- enable_ssl_verification: false,
- push_events: true,
- tag_push_events: true,
- merge_requests_events: true,
- repository_update_events: false
- }
-
- expect(response).to have_gitlab_http_status(:created)
- expect(response).to match_response_schema('public_api/v4/system_hook')
- expect(json_response['enable_ssl_verification']).to be false
- 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
-
- describe 'POST /hooks/:id' do
- it "returns and trigger hook by id" do
- post api("/hooks/#{hook.id}", admin)
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response['event_name']).to eq('project_create')
- end
-
- it "returns 404 on failure" do
- post api("/hooks/404", admin)
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- describe "DELETE /hooks/:id" do
- it "deletes a hook" do
- expect do
- delete api("/hooks/#{hook.id}", admin)
-
- expect(response).to have_gitlab_http_status(:no_content)
- end.to change { SystemHook.count }.by(-1)
- end
-
- it 'returns 404 if the system hook does not exist' do
- delete api("/hooks/#{non_existing_record_id}", admin)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- it_behaves_like '412 response' do
- let(:request) { api("/hooks/#{hook.id}", admin) }
- end
+ it_behaves_like 'web-hook API endpoints test hook', ''
end
end
diff --git a/spec/requests/api/tags_spec.rb b/spec/requests/api/tags_spec.rb
index 3558babf2f1..e81e9e0bf2f 100644
--- a/spec/requests/api/tags_spec.rb
+++ b/spec/requests/api/tags_spec.rb
@@ -90,6 +90,13 @@ RSpec.describe API::Tags do
let(:request) { get api(route, current_user) }
end
end
+
+ context 'when repository does not exist' do
+ it_behaves_like '404 response' do
+ let(:project) { create(:project, creator: user) }
+ let(:request) { get api(route, current_user) }
+ end
+ end
end
context 'when unauthenticated', 'and project is public' do
diff --git a/spec/requests/api/terraform/modules/v1/packages_spec.rb b/spec/requests/api/terraform/modules/v1/packages_spec.rb
index 12bce4da011..dff44a45de4 100644
--- a/spec/requests/api/terraform/modules/v1/packages_spec.rb
+++ b/spec/requests/api/terraform/modules/v1/packages_spec.rb
@@ -98,6 +98,216 @@ RSpec.describe API::Terraform::Modules::V1::Packages do
end
end
+ describe 'GET /api/v4/packages/terraform/modules/v1/:module_namespace/:module_name/:module_system/download' do
+ context 'empty registry' do
+ let(:url) { api("/packages/terraform/modules/v1/#{group.path}/module-2/system/download") }
+ let(:headers) { {} }
+
+ subject { get(url, headers: headers) }
+
+ it 'returns not found when there is no module' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'with valid namespace' do
+ let(:url) { api("/packages/terraform/modules/v1/#{group.path}/#{package.name}/download") }
+ let(:headers) { {} }
+
+ subject { get(url, headers: headers) }
+
+ before_all do
+ create(:terraform_module_package, project: project, name: package.name, version: '1.0.1')
+ end
+
+ where(:visibility, :user_role, :member, :token_type, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | 'redirects to version download' | :found
+ :public | :guest | true | :personal_access_token | 'redirects to version download' | :found
+ :public | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | 'redirects to version download' | :found
+ :public | :guest | false | :personal_access_token | 'redirects to version download' | :found
+ :public | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :anonymous | false | nil | 'redirects to version download' | :found
+ :private | :developer | true | :personal_access_token | 'redirects to version download' | :found
+ :private | :guest | true | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :guest | false | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :anonymous | false | nil | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | true | :job_token | 'redirects to version download' | :found
+ :public | :guest | true | :job_token | 'redirects to version download' | :found
+ :public | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | false | :job_token | 'redirects to version download' | :found
+ :public | :guest | false | :job_token | 'redirects to version download' | :found
+ :public | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | true | :job_token | 'redirects to version download' | :found
+ :private | :guest | true | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | false | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :guest | false | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:headers) { user_role == :anonymous ? {} : { 'Authorization' => "Bearer #{token}" } }
+
+ before do
+ group.update!(visibility: visibility.to_s)
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
+ end
+
+ describe 'GET /api/v4/packages/terraform/modules/v1/:module_namespace/:module_name/:module_system' do
+ context 'empty registry' do
+ let(:url) { api("/packages/terraform/modules/v1/#{group.path}/non-existent/system") }
+ let(:headers) { { 'Authorization' => "Bearer #{tokens[:personal_access_token]}" } }
+
+ subject { get(url, headers: headers) }
+
+ it 'returns not found when there is no module' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'with valid namespace' do
+ let(:url) { api("/packages/terraform/modules/v1/#{group.path}/#{package.name}") }
+
+ subject { get(url, headers: headers) }
+
+ where(:visibility, :user_role, :member, :token_type, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | 'returns terraform module version' | :success
+ :public | :guest | true | :personal_access_token | 'returns terraform module version' | :success
+ :public | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | 'returns terraform module version' | :success
+ :public | :guest | false | :personal_access_token | 'returns terraform module version' | :success
+ :public | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :anonymous | false | nil | 'returns terraform module version' | :success
+ :private | :developer | true | :personal_access_token | 'returns terraform module version' | :success
+ :private | :guest | true | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :guest | false | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :anonymous | false | nil | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | true | :job_token | 'returns terraform module version' | :success
+ :public | :guest | true | :job_token | 'returns terraform module version' | :success
+ :public | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | false | :job_token | 'returns terraform module version' | :success
+ :public | :guest | false | :job_token | 'returns terraform module version' | :success
+ :public | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | true | :job_token | 'returns terraform module version' | :success
+ :private | :guest | true | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | false | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :guest | false | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:headers) { user_role == :anonymous ? {} : { 'Authorization' => "Bearer #{token}" } }
+
+ before do
+ group.update!(visibility: visibility.to_s)
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
+ end
+
+ describe 'GET /api/v4/packages/terraform/modules/v1/:module_namespace/:module_name/:module_system/:module_version' do
+ let(:url) { api("/packages/terraform/modules/v1/#{group.path}/#{package.name}/#{package.version}") }
+ let(:headers) { {} }
+
+ subject { get(url, headers: headers) }
+
+ context 'not found' do
+ let(:url) { api("/packages/terraform/modules/v1/#{group.path}/#{package.name}/2.0.0") }
+ let(:headers) { { 'Authorization' => "Bearer #{tokens[:job_token]}" } }
+
+ subject { get(url, headers: headers) }
+
+ it 'returns not found when the specified version is not present in the registry' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'with valid namespace' do
+ where(:visibility, :user_role, :member, :token_type, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | 'returns terraform module version' | :success
+ :public | :guest | true | :personal_access_token | 'returns terraform module version' | :success
+ :public | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | 'returns terraform module version' | :success
+ :public | :guest | false | :personal_access_token | 'returns terraform module version' | :success
+ :public | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :anonymous | false | nil | 'returns terraform module version' | :success
+ :private | :developer | true | :personal_access_token | 'returns terraform module version' | :success
+ :private | :guest | true | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :guest | false | :personal_access_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :anonymous | false | nil | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | true | :job_token | 'returns terraform module version' | :success
+ :public | :guest | true | :job_token | 'returns terraform module version' | :success
+ :public | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :developer | false | :job_token | 'returns terraform module version' | :success
+ :public | :guest | false | :job_token | 'returns terraform module version' | :success
+ :public | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :public | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | true | :job_token | 'returns terraform module version' | :success
+ :private | :guest | true | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | true | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :developer | false | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :guest | false | :job_token | 'rejects terraform module packages access' | :forbidden
+ :private | :developer | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ :private | :guest | false | :invalid | 'rejects terraform module packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:headers) { user_role == :anonymous ? {} : { 'Authorization' => "Bearer #{token}" } }
+
+ before do
+ group.update!(visibility: visibility.to_s)
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
+ end
+
describe 'GET /api/v4/packages/terraform/modules/v1/:module_namespace/:module_name/:module_system/:module_version/download' do
let(:url) { api("/packages/terraform/modules/v1/#{group.path}/#{package.name}/#{package.version}/download") }
let(:headers) { {} }
diff --git a/spec/requests/api/unleash_spec.rb b/spec/requests/api/unleash_spec.rb
index 6cb801538c6..7bdb89fb286 100644
--- a/spec/requests/api/unleash_spec.rb
+++ b/spec/requests/api/unleash_spec.rb
@@ -168,7 +168,7 @@ RSpec.describe API::Unleash do
end
%w(/feature_flags/unleash/:project_id/features /feature_flags/unleash/:project_id/client/features).each do |features_endpoint|
- describe "GET #{features_endpoint}" do
+ describe "GET #{features_endpoint}", :use_clean_rails_redis_caching do
let(:features_url) { features_endpoint.sub(':project_id', project_id.to_s) }
let(:client) { create(:operations_feature_flags_client, project: project) }
@@ -176,6 +176,46 @@ RSpec.describe API::Unleash do
it_behaves_like 'authenticated request'
+ context 'when a client fetches feature flags several times' do
+ let(:headers) { { 'UNLEASH-INSTANCEID' => client.token, 'UNLEASH-APPNAME' => 'production' } }
+
+ before do
+ create_list(:operations_feature_flag, 3, project: project)
+ end
+
+ it 'serializes feature flags for the first time and read cached data from the second time' do
+ expect(API::Entities::Unleash::ClientFeatureFlags)
+ .to receive(:represent).with(instance_of(Operations::FeatureFlagsClient), any_args)
+ .once
+
+ 5.times { get api(features_url), params: params, headers: headers }
+ end
+
+ it 'increments the cache key when feature flags are modified' do
+ expect(API::Entities::Unleash::ClientFeatureFlags)
+ .to receive(:represent).with(instance_of(Operations::FeatureFlagsClient), any_args)
+ .twice
+
+ 2.times { get api(features_url), params: params, headers: headers }
+
+ ::FeatureFlags::CreateService.new(project, project.owner, name: 'feature_flag').execute
+
+ 3.times { get api(features_url), params: params, headers: headers }
+ end
+
+ context 'when cache_unleash_client_api is disabled' do
+ before do
+ stub_feature_flags(cache_unleash_client_api: false)
+ end
+
+ it 'serializes feature flags every time' do
+ expect(::API::Entities::UnleashFeature).to receive(:represent).exactly(5).times
+
+ 5.times { get api(features_url), params: params, headers: headers }
+ end
+ end
+ end
+
context 'with version 2 feature flags' do
it 'does not return a flag without any strategies' do
create(:operations_feature_flag, project: project,
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index d4dc7375e9e..68d5fad8ff4 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -17,6 +17,8 @@ RSpec.describe API::Users do
let(:deactivated_user) { create(:user, state: 'deactivated') }
let(:banned_user) { create(:user, :banned) }
let(:internal_user) { create(:user, :bot) }
+ let(:user_with_2fa) { create(:user, :two_factor_via_otp) }
+ let(:admin_with_2fa) { create(:admin, :two_factor_via_otp) }
context 'admin notes' do
let_it_be(:admin) { create(:admin, note: '2019-10-06 | 2FA added | user requested | www.gitlab.com') }
@@ -81,6 +83,79 @@ RSpec.describe API::Users do
end
end
+ describe "PATCH /users/:id/disable_two_factor" do
+ context "when current user is an admin" do
+ it "returns a 204 when 2FA is disabled for the target user" do
+ expect do
+ patch api("/users/#{user_with_2fa.id}/disable_two_factor", admin)
+ end.to change { user_with_2fa.reload.two_factor_enabled? }
+ .from(true)
+ .to(false)
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+
+ it "uses TwoFactor Destroy Service" do
+ destroy_service = instance_double(TwoFactor::DestroyService, execute: nil)
+ expect(TwoFactor::DestroyService).to receive(:new)
+ .with(admin, user: user_with_2fa)
+ .and_return(destroy_service)
+ expect(destroy_service).to receive(:execute)
+
+ patch api("/users/#{user_with_2fa.id}/disable_two_factor", admin)
+ end
+
+ it "returns a 400 if 2FA is not enabled for the target user" do
+ expect(TwoFactor::DestroyService).to receive(:new).and_call_original
+
+ expect do
+ patch api("/users/#{user.id}/disable_two_factor", admin)
+ end.not_to change { user.reload.two_factor_enabled? }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq("400 Bad request - Two-factor authentication is not enabled for this user")
+ end
+
+ it "returns a 403 if the target user is an admin" do
+ expect(TwoFactor::DestroyService).to receive(:new).never
+
+ expect do
+ patch api("/users/#{admin_with_2fa.id}/disable_two_factor", admin)
+ end.not_to change { admin_with_2fa.reload.two_factor_enabled? }
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(json_response['message']).to eq("403 Forbidden - Two-factor authentication for admins cannot be disabled via the API. Use the Rails console")
+ end
+
+ it "returns a 404 if the target user cannot be found" do
+ expect(TwoFactor::DestroyService).to receive(:new).never
+
+ patch api("/users/#{non_existing_record_id}/disable_two_factor", admin)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq("404 User Not Found")
+ end
+ end
+
+ context "when current user is not an admin" do
+ it "returns a 403" do
+ expect do
+ patch api("/users/#{user_with_2fa.id}/disable_two_factor", user)
+ end.not_to change { user_with_2fa.reload.two_factor_enabled? }
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(json_response['message']).to eq("403 Forbidden")
+ end
+ end
+
+ context "when unauthenticated" do
+ it "returns a 401" do
+ patch api("/users/#{user_with_2fa.id}/disable_two_factor")
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+ end
+
describe 'GET /users/' do
context 'when unauthenticated' do
it "does not contain certain fields" do
@@ -110,6 +185,40 @@ RSpec.describe API::Users do
expect(json_response.first['note']).to eq '2018-11-05 | 2FA removed | user requested | www.gitlab.com'
end
end
+
+ context 'N+1 queries' do
+ before do
+ create_list(:user, 2)
+ end
+
+ it 'avoids N+1 queries when requested by admin' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ get api("/users", admin)
+ end.count
+
+ create_list(:user, 3)
+
+ # There is a still a pending N+1 query related to fetching
+ # project count for each user.
+ # Refer issue https://gitlab.com/gitlab-org/gitlab/-/issues/367080
+
+ expect do
+ get api("/users", admin)
+ end.not_to exceed_all_query_limit(control_count + 3)
+ end
+
+ it 'avoids N+1 queries when requested by a regular user' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ get api("/users", user)
+ end.count
+
+ create_list(:user, 3)
+
+ expect do
+ get api("/users", user)
+ end.not_to exceed_all_query_limit(control_count)
+ end
+ end
end
end
diff --git a/spec/requests/groups/harbor/artifacts_controller_spec.rb b/spec/requests/groups/harbor/artifacts_controller_spec.rb
new file mode 100644
index 00000000000..ea9529119a6
--- /dev/null
+++ b/spec/requests/groups/harbor/artifacts_controller_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Groups::Harbor::ArtifactsController do
+ it_behaves_like 'a harbor artifacts controller', anonymous_status_code: '404' do
+ let_it_be(:container) { create(:group) }
+ let_it_be(:harbor_integration) { create(:harbor_integration, group: container, project: nil) }
+ end
+end
diff --git a/spec/requests/groups/harbor/repositories_controller_spec.rb b/spec/requests/groups/harbor/repositories_controller_spec.rb
index 3e475dc410e..b4022561f54 100644
--- a/spec/requests/groups/harbor/repositories_controller_spec.rb
+++ b/spec/requests/groups/harbor/repositories_controller_spec.rb
@@ -3,67 +3,8 @@
require 'spec_helper'
RSpec.describe Groups::Harbor::RepositoriesController do
- let_it_be(:group, reload: true) { create(:group) }
- let_it_be(:user) { create(:user) }
-
- shared_examples 'responds with 404 status' do
- it 'returns 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- shared_examples 'responds with 200 status' do
- it 'renders the index template' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:index)
- end
- end
-
- before do
- stub_feature_flags(harbor_registry_integration: true)
- group.add_reporter(user)
- login_as(user)
- end
-
- describe 'GET #index' do
- subject do
- get group_harbor_registries_path(group)
- response
- end
-
- context 'with harbor registry feature flag enabled' do
- it_behaves_like 'responds with 200 status'
- end
-
- context 'with harbor registry feature flag disabled' do
- before do
- stub_feature_flags(harbor_registry_integration: false)
- end
-
- it_behaves_like 'responds with 404 status'
- end
- end
-
- describe 'GET #show' do
- subject do
- get group_harbor_registry_path(group, 1)
- response
- end
-
- context 'with harbor registry feature flag enabled' do
- it_behaves_like 'responds with 200 status'
- end
-
- context 'with harbor registry feature flag disabled' do
- before do
- stub_feature_flags(harbor_registry_integration: false)
- end
-
- it_behaves_like 'responds with 404 status'
- end
+ it_behaves_like 'a harbor repositories controller', anonymous_status_code: '404' do
+ let_it_be(:container, reload: true) { create(:group) }
+ let_it_be(:harbor_integration) { create(:harbor_integration, group: container, project: nil) }
end
end
diff --git a/spec/requests/groups/harbor/tags_controller_spec.rb b/spec/requests/groups/harbor/tags_controller_spec.rb
new file mode 100644
index 00000000000..257d4366837
--- /dev/null
+++ b/spec/requests/groups/harbor/tags_controller_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Groups::Harbor::TagsController do
+ it_behaves_like 'a harbor tags controller', anonymous_status_code: '404' do
+ let_it_be(:container) { create(:group) }
+ let_it_be(:harbor_integration) { create(:harbor_integration, group: container, project: nil) }
+ end
+end
diff --git a/spec/requests/jira_authorizations_spec.rb b/spec/requests/jira_authorizations_spec.rb
index b43d36e94f4..f67288b286b 100644
--- a/spec/requests/jira_authorizations_spec.rb
+++ b/spec/requests/jira_authorizations_spec.rb
@@ -27,14 +27,16 @@ RSpec.describe 'Jira authorization requests' do
redirect_uri: redirect_uri
})
oauth_response = json_response
+ oauth_response_access_token, scope, token_type = oauth_response.values_at('access_token', 'scope', 'token_type')
post '/login/oauth/access_token', params: post_data.merge({
code: generate_access_grant.token
})
jira_response = response.body
+ jira_response_access_token = Rack::Utils.parse_nested_query(jira_response)['access_token']
- access_token, scope, token_type = oauth_response.values_at('access_token', 'scope', 'token_type')
- expect(jira_response).to eq("access_token=#{access_token}&scope=#{scope}&token_type=#{token_type}")
+ expect(jira_response).to include("scope=#{scope}&token_type=#{token_type}")
+ expect(oauth_response_access_token).not_to eql(jira_response_access_token)
end
context 'when authorization fails' do
diff --git a/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb b/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb
index ffeaf1075f3..b0c2eaec4e2 100644
--- a/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb
+++ b/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb
@@ -3,7 +3,40 @@
require 'spec_helper'
RSpec.describe JiraConnect::OauthApplicationIdsController do
+ describe 'OPTIONS /-/jira_connect/oauth_application_id' do
+ before do
+ stub_application_setting(jira_connect_application_key: '123456')
+
+ options '/-/jira_connect/oauth_application_id', headers: { 'Origin' => 'http://notgitlab.com' }
+ end
+
+ it 'returns 200' do
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'allows cross-origin requests', :aggregate_failures do
+ expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
+ expect(response.headers['Access-Control-Allow-Methods']).to eq 'GET, OPTIONS'
+ expect(response.headers['Access-Control-Allow-Credentials']).to be_nil
+ end
+
+ context 'on GitLab.com' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ end
+
+ it 'renders not found' do
+ options '/-/jira_connect/oauth_application_id'
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(response.headers['Access-Control-Allow-Origin']).not_to eq '*'
+ end
+ end
+ end
+
describe 'GET /-/jira_connect/oauth_application_id' do
+ let(:cors_request_headers) { { 'Origin' => 'http://notgitlab.com' } }
+
before do
stub_application_setting(jira_connect_application_key: '123456')
end
@@ -15,6 +48,14 @@ RSpec.describe JiraConnect::OauthApplicationIdsController do
expect(json_response).to eq({ "application_id" => "123456" })
end
+ it 'allows cross-origin requests', :aggregate_failures do
+ get '/-/jira_connect/oauth_application_id', headers: cors_request_headers
+
+ expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
+ expect(response.headers['Access-Control-Allow-Methods']).to eq 'GET, OPTIONS'
+ expect(response.headers['Access-Control-Allow-Credentials']).to be_nil
+ end
+
context 'application ID is empty' do
before do
stub_application_setting(jira_connect_application_key: '')
@@ -38,5 +79,17 @@ RSpec.describe JiraConnect::OauthApplicationIdsController 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
+
+ it 'renders not found' do
+ get '/-/jira_connect/oauth_application_id'
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
end
end
diff --git a/spec/requests/jira_connect/subscriptions_controller_spec.rb b/spec/requests/jira_connect/subscriptions_controller_spec.rb
new file mode 100644
index 00000000000..b10d07b3771
--- /dev/null
+++ b/spec/requests/jira_connect/subscriptions_controller_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe JiraConnect::SubscriptionsController do
+ describe 'GET /-/jira_connect/subscriptions' do
+ let_it_be(:installation) { create(:jira_connect_installation, instance_url: 'http://self-managed-gitlab.com') }
+
+ let(:qsh) do
+ Atlassian::Jwt.create_query_string_hash('https://gitlab.test/subscriptions', 'GET', 'https://gitlab.test')
+ end
+
+ let(:jwt) { Atlassian::Jwt.encode({ iss: installation.client_key, qsh: qsh }, installation.shared_secret) }
+
+ before do
+ get '/-/jira_connect/subscriptions', params: { jwt: jwt }
+ end
+
+ subject(:content_security_policy) { response.headers['Content-Security-Policy'] }
+
+ it { is_expected.to include('http://self-managed-gitlab.com/-/jira_connect/oauth_application_ids')}
+
+ context 'with no self-managed instance configured' do
+ let_it_be(:installation) { create(:jira_connect_installation, instance_url: '') }
+
+ it { is_expected.not_to include('http://self-managed-gitlab.com')}
+ end
+ end
+end
diff --git a/spec/requests/jwks_controller_spec.rb b/spec/requests/jwks_controller_spec.rb
index 6dbb5988f58..c9dcc238c29 100644
--- a/spec/requests/jwks_controller_spec.rb
+++ b/spec/requests/jwks_controller_spec.rb
@@ -18,9 +18,9 @@ RSpec.describe JwksController do
end
describe 'GET /-/jwks' do
- let(:ci_jwt_signing_key) { OpenSSL::PKey::RSA.generate(1024) }
- let(:ci_jwk) { ci_jwt_signing_key.to_jwk }
- let(:oidc_jwk) { OpenSSL::PKey::RSA.new(Rails.application.secrets.openid_connect_signing_key).to_jwk }
+ let_it_be(:ci_jwt_signing_key) { OpenSSL::PKey::RSA.generate(3072) }
+ let_it_be(:ci_jwk) { ci_jwt_signing_key.to_jwk }
+ let_it_be(:oidc_jwk) { OpenSSL::PKey::RSA.new(Rails.application.secrets.openid_connect_signing_key).to_jwk }
before do
stub_application_setting(ci_jwt_signing_key: ci_jwt_signing_key.to_s)
diff --git a/spec/requests/oauth_tokens_spec.rb b/spec/requests/oauth_tokens_spec.rb
index 30659a5b896..180341fc85d 100644
--- a/spec/requests/oauth_tokens_spec.rb
+++ b/spec/requests/oauth_tokens_spec.rb
@@ -5,44 +5,92 @@ require 'spec_helper'
RSpec.describe 'OAuth Tokens requests' do
let(:user) { create :user }
let(:application) { create :oauth_application, scopes: 'api' }
+ let(:grant_type) { 'authorization_code' }
+ let(:refresh_token) { nil }
def request_access_token(user)
post '/oauth/token',
params: {
- grant_type: 'authorization_code',
+ grant_type: grant_type,
code: generate_access_grant(user).token,
redirect_uri: application.redirect_uri,
client_id: application.uid,
- client_secret: application.secret
+ client_secret: application.secret,
+ refresh_token: refresh_token
+
}
end
def generate_access_grant(user)
- create :oauth_access_grant, application: application, resource_owner_id: user.id
+ create(:oauth_access_grant, application: application, resource_owner_id: user.id)
end
context 'when there is already a token for the application' do
- let!(:existing_token) { create :oauth_access_token, application: application, resource_owner_id: user.id }
+ let!(:existing_token) { create(:oauth_access_token, application: application, resource_owner_id: user.id) }
- context 'and the request is done by the resource owner' do
- it 'reuses and returns the stored token' do
+ shared_examples 'issues a new token' do
+ it 'issues a new token' do
expect do
request_access_token(user)
- end.not_to change { Doorkeeper::AccessToken.count }
+ end.to change { Doorkeeper::AccessToken.count }.from(1).to(2)
+
+ expect(json_response['access_token']).not_to eq existing_token.token
+ expect(json_response['refresh_token']).not_to eq existing_token.refresh_token
+ end
+ end
- expect(json_response['access_token']).to eq existing_token.token
+ shared_examples 'revokes previous token' do
+ it 'revokes previous token' do
+ expect { request_access_token(user) }.to(
+ change { existing_token.reload.revoked_at }.from(nil))
end
end
- context 'and the request is done by a different user' do
- let(:other_user) { create :user }
+ context 'and the request is done by the resource owner' do
+ context 'with authorization code grant type' do
+ include_examples 'issues a new token'
- it 'generates and returns a different token for a different owner' do
- expect do
- request_access_token(other_user)
- end.to change { Doorkeeper::AccessToken.count }.by(1)
+ it 'does not revoke previous token' do
+ request_access_token(user)
+
+ expect(existing_token.reload.revoked_at).to be_nil
+ end
+ end
+
+ context 'with refresh token grant type' do
+ let(:grant_type) { 'refresh_token' }
+ let(:refresh_token) { existing_token.refresh_token }
+
+ include_examples 'issues a new token'
+ include_examples 'revokes previous token'
+
+ context 'expired refresh token' do
+ let!(:existing_token) do
+ create(:oauth_access_token, application: application,
+ resource_owner_id: user.id,
+ created_at: 10.minutes.ago,
+ expires_in: 5)
+ end
+
+ include_examples 'issues a new token'
+ include_examples 'revokes previous token'
+ end
+
+ context 'revoked refresh token' do
+ let!(:existing_token) do
+ create(:oauth_access_token, application: application,
+ resource_owner_id: user.id,
+ created_at: 2.hours.ago,
+ revoked_at: 1.hour.ago,
+ expires_in: 5)
+ end
+
+ it 'does not issue a new token' do
+ request_access_token(user)
- expect(json_response['access_token']).not_to be_nil
+ expect(json_response['error']).to eq('invalid_grant')
+ end
+ end
end
end
end
diff --git a/spec/requests/openid_connect_spec.rb b/spec/requests/openid_connect_spec.rb
index c647fee1564..afaa6168bfd 100644
--- a/spec/requests/openid_connect_spec.rb
+++ b/spec/requests/openid_connect_spec.rb
@@ -120,9 +120,9 @@ RSpec.describe 'OpenID Connect requests' do
let!(:group4) { create :group, parent: group3 }
before do
- group1.add_user(user, GroupMember::OWNER)
- group3.add_user(user, Gitlab::Access::DEVELOPER)
- group4.add_user(user, Gitlab::Access::MAINTAINER)
+ group1.add_member(user, GroupMember::OWNER)
+ group3.add_member(user, Gitlab::Access::DEVELOPER)
+ group4.add_member(user, Gitlab::Access::MAINTAINER)
request_user_info!
end
@@ -163,8 +163,8 @@ RSpec.describe 'OpenID Connect requests' do
let!(:group4) { create :group, parent: group3 }
before do
- group1.add_user(user, Gitlab::Access::OWNER)
- group3.add_user(user, Gitlab::Access::DEVELOPER)
+ group1.add_member(user, Gitlab::Access::OWNER)
+ group3.add_member(user, Gitlab::Access::DEVELOPER)
request_access_token!
@payload = JSON::JWT.decode(json_response['id_token'], :skip_verification)
@@ -358,8 +358,8 @@ RSpec.describe 'OpenID Connect requests' do
let!(:group4) { create :group, parent: group3 }
before do
- group1.add_user(user, Gitlab::Access::OWNER)
- group3.add_user(user, Gitlab::Access::DEVELOPER)
+ group1.add_member(user, Gitlab::Access::OWNER)
+ group3.add_member(user, Gitlab::Access::DEVELOPER)
request_access_token!
@payload = JSON::JWT.decode(json_response['id_token'], :skip_verification)
diff --git a/spec/requests/projects/environments_controller_spec.rb b/spec/requests/projects/environments_controller_spec.rb
index 5cdf507abef..0890b0c45da 100644
--- a/spec/requests/projects/environments_controller_spec.rb
+++ b/spec/requests/projects/environments_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Projects::EnvironmentsController do
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be_with_refind(:project) { create(:project, :repository) }
let(:environment) { create(:environment, name: 'production', project: project) }
diff --git a/spec/requests/projects/google_cloud/configuration_controller_spec.rb b/spec/requests/projects/google_cloud/configuration_controller_spec.rb
new file mode 100644
index 00000000000..08d4ad2f9ba
--- /dev/null
+++ b/spec/requests/projects/google_cloud/configuration_controller_spec.rb
@@ -0,0 +1,141 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# Mock Types
+MockGoogleOAuth2Credentials = Struct.new(:app_id, :app_secret)
+
+RSpec.describe Projects::GoogleCloud::ConfigurationController do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:url) { project_google_cloud_configuration_path(project) }
+
+ let_it_be(:user_guest) { create(:user) }
+ let_it_be(:user_developer) { create(:user) }
+ let_it_be(:user_maintainer) { create(:user) }
+
+ let_it_be(:unauthorized_members) { [user_guest, user_developer] }
+ let_it_be(:authorized_members) { [user_maintainer] }
+
+ before do
+ project.add_guest(user_guest)
+ project.add_developer(user_developer)
+ project.add_maintainer(user_maintainer)
+ end
+
+ context 'when accessed by unauthorized members' do
+ it 'returns not found on GET request' do
+ unauthorized_members.each do |unauthorized_member|
+ sign_in(unauthorized_member)
+
+ get url
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'admin_project_google_cloud!',
+ label: 'error_access_denied',
+ property: 'invalid_user',
+ project: project,
+ user: unauthorized_member
+ )
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ context 'when accessed by authorized members' do
+ it 'returns successful' do
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to be_successful
+ expect(response).to render_template('projects/google_cloud/configuration/index')
+ end
+ end
+
+ context 'but gitlab instance is not configured for google oauth2' do
+ it 'returns forbidden' do
+ unconfigured_google_oauth2 = MockGoogleOAuth2Credentials.new('', '')
+ allow(Gitlab::Auth::OAuth::Provider).to receive(:config_for)
+ .with('google_oauth2')
+ .and_return(unconfigured_google_oauth2)
+
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'google_oauth2_enabled!',
+ label: 'error_access_denied',
+ extra: { reason: 'google_oauth2_not_configured',
+ config: unconfigured_google_oauth2 },
+ project: project,
+ user: authorized_member
+ )
+ end
+ end
+ end
+
+ context 'but feature flag is disabled' do
+ before do
+ stub_feature_flags(incubation_5mp_google_cloud: false)
+ end
+
+ it 'returns not found' do
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'feature_flag_enabled!',
+ label: 'error_access_denied',
+ property: 'feature_flag_not_enabled',
+ project: project,
+ user: authorized_member
+ )
+ end
+ end
+ end
+
+ context 'but google oauth2 token is not valid' do
+ it 'does not return revoke oauth url' do
+ allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
+ allow(client).to receive(:validate_token).and_return(false)
+ end
+
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to be_successful
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'configuration#index',
+ label: 'success',
+ extra: {
+ configurationUrl: project_google_cloud_configuration_path(project),
+ deploymentsUrl: project_google_cloud_deployments_path(project),
+ databasesUrl: project_google_cloud_databases_path(project),
+ serviceAccounts: [],
+ createServiceAccountUrl: project_google_cloud_service_accounts_path(project),
+ emptyIllustrationUrl: ActionController::Base.helpers.image_path('illustrations/pipelines_empty.svg'),
+ configureGcpRegionsUrl: project_google_cloud_gcp_regions_path(project),
+ gcpRegions: [],
+ revokeOauthUrl: nil
+ },
+ project: project,
+ user: authorized_member
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/google_cloud/databases_controller_spec.rb b/spec/requests/projects/google_cloud/databases_controller_spec.rb
new file mode 100644
index 00000000000..c9335f8f317
--- /dev/null
+++ b/spec/requests/projects/google_cloud/databases_controller_spec.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# Mock Types
+MockGoogleOAuth2Credentials = Struct.new(:app_id, :app_secret)
+
+RSpec.describe Projects::GoogleCloud::DatabasesController do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:url) { project_google_cloud_databases_path(project) }
+
+ let_it_be(:user_guest) { create(:user) }
+ let_it_be(:user_developer) { create(:user) }
+ let_it_be(:user_maintainer) { create(:user) }
+
+ let_it_be(:unauthorized_members) { [user_guest, user_developer] }
+ let_it_be(:authorized_members) { [user_maintainer] }
+
+ before do
+ project.add_guest(user_guest)
+ project.add_developer(user_developer)
+ project.add_maintainer(user_maintainer)
+ end
+
+ context 'when accessed by unauthorized members' do
+ it 'returns not found on GET request' do
+ unauthorized_members.each do |unauthorized_member|
+ sign_in(unauthorized_member)
+
+ get url
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'admin_project_google_cloud!',
+ label: 'error_access_denied',
+ property: 'invalid_user',
+ project: project,
+ user: unauthorized_member
+ )
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ context 'when accessed by authorized members' do
+ it 'returns successful' do
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to be_successful
+ expect(response).to render_template('projects/google_cloud/databases/index')
+ end
+ end
+
+ context 'but gitlab instance is not configured for google oauth2' do
+ it 'returns forbidden' do
+ unconfigured_google_oauth2 = MockGoogleOAuth2Credentials.new('', '')
+ allow(Gitlab::Auth::OAuth::Provider).to receive(:config_for)
+ .with('google_oauth2')
+ .and_return(unconfigured_google_oauth2)
+
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'google_oauth2_enabled!',
+ label: 'error_access_denied',
+ extra: { reason: 'google_oauth2_not_configured',
+ config: unconfigured_google_oauth2 },
+ project: project,
+ user: authorized_member
+ )
+ end
+ end
+ end
+
+ context 'but feature flag is disabled' do
+ before do
+ stub_feature_flags(incubation_5mp_google_cloud: false)
+ end
+
+ it 'returns not found' do
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'feature_flag_enabled!',
+ label: 'error_access_denied',
+ property: 'feature_flag_not_enabled',
+ project: project,
+ user: authorized_member
+ )
+ end
+ end
+ end
+
+ context 'but google oauth2 token is not valid' do
+ it 'does not return revoke oauth url' do
+ allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
+ allow(client).to receive(:validate_token).and_return(false)
+ end
+
+ authorized_members.each do |authorized_member|
+ sign_in(authorized_member)
+
+ get url
+
+ expect(response).to be_successful
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'databases#index',
+ label: 'success',
+ extra: {
+ configurationUrl: project_google_cloud_configuration_path(project),
+ deploymentsUrl: project_google_cloud_deployments_path(project),
+ databasesUrl: project_google_cloud_databases_path(project)
+ },
+ project: project,
+ user: authorized_member
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/google_cloud/deployments_controller_spec.rb b/spec/requests/projects/google_cloud/deployments_controller_spec.rb
index 7bd9609a7dc..9e854e01516 100644
--- a/spec/requests/projects/google_cloud/deployments_controller_spec.rb
+++ b/spec/requests/projects/google_cloud/deployments_controller_spec.rb
@@ -9,10 +9,9 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
let_it_be(:user_guest) { create(:user) }
let_it_be(:user_developer) { create(:user) }
let_it_be(:user_maintainer) { create(:user) }
- let_it_be(:user_creator) { project.creator }
let_it_be(:unauthorized_members) { [user_guest, user_developer] }
- let_it_be(:authorized_members) { [user_maintainer, user_creator] }
+ let_it_be(:authorized_members) { [user_maintainer] }
let_it_be(:urls_list) { %W[#{project_google_cloud_deployments_cloud_run_path(project)} #{project_google_cloud_deployments_cloud_storage_path(project)}] }
@@ -32,7 +31,7 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'admin_project_google_cloud!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'invalid_user',
project: project,
user: nil
@@ -51,7 +50,7 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'admin_project_google_cloud!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'invalid_user',
project: project,
user: nil
@@ -87,15 +86,15 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
end
end
- it 'redirects to google_cloud home on enable service error' do
+ it 'redirects to google cloud deployments on enable service error' do
get url
- expect(response).to redirect_to(project_google_cloud_index_path(project))
+ expect(response).to redirect_to(project_google_cloud_deployments_path(project))
# since GPC_PROJECT_ID is not set, enable cloud run service should return an error
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'deployments#cloud_run',
- label: 'enable_cloud_run_error',
+ label: 'error_enable_cloud_run',
extra: { message: 'No GCP projects found. Configure a service account or GCP_PROJECT_ID ci variable.',
status: :error },
project: project,
@@ -103,7 +102,7 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
)
end
- it 'redirects to gcp_error' do
+ it 'redirects to google cloud deployments with error' do
mock_gcp_error = Google::Apis::ClientError.new('some_error')
allow_next_instance_of(GoogleCloud::EnableCloudRunService) do |service|
@@ -112,11 +111,11 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
get url
- expect(response).to render_template(:gcp_error)
+ expect(response).to redirect_to(project_google_cloud_deployments_path(project))
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'deployments#cloud_run',
- label: 'gcp_error',
+ label: 'error_gcp',
extra: mock_gcp_error,
project: project,
user: user_maintainer
@@ -124,7 +123,7 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
end
context 'GCP_PROJECT_IDs are defined' do
- it 'redirects to google_cloud home on generate pipeline error' do
+ it 'redirects to google_cloud deployments on generate pipeline error' do
allow_next_instance_of(GoogleCloud::EnableCloudRunService) do |enable_cloud_run_service|
allow(enable_cloud_run_service).to receive(:execute).and_return({ status: :success })
end
@@ -135,11 +134,11 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
get url
- expect(response).to redirect_to(project_google_cloud_index_path(project))
+ expect(response).to redirect_to(project_google_cloud_deployments_path(project))
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'deployments#cloud_run',
- label: 'generate_pipeline_error',
+ label: 'error_generate_pipeline',
extra: { status: :error },
project: project,
user: user_maintainer
@@ -162,7 +161,7 @@ RSpec.describe Projects::GoogleCloud::DeploymentsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'deployments#cloud_run',
- label: 'cloud_run_success',
+ label: 'success',
extra: { "title": "Enable deployments to Cloud Run",
"description": "This merge request includes a Cloud Run deployment job in the pipeline definition (.gitlab-ci.yml).\n\nThe `deploy-to-cloud-run` job:\n* Requires the following environment variables\n * `GCP_PROJECT_ID`\n * `GCP_SERVICE_ACCOUNT_KEY`\n* Job definition can be found at: https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/library\n\nThis pipeline definition has been committed to the branch ``.\nYou may modify the pipeline definition further or accept the changes as-is if suitable.\n",
"source_project_id": project.id,
diff --git a/spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb b/spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb
index 56474b6520d..f88273080d5 100644
--- a/spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb
+++ b/spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb
@@ -6,8 +6,8 @@ RSpec.describe Projects::GoogleCloud::GcpRegionsController do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:repository) { project.repository }
- let(:user_guest) { create(:user) }
- let(:user_maintainer) { create(:user) }
+ let_it_be(:user_guest) { create(:user) }
+ let_it_be(:user_maintainer) { create(:user) }
RSpec.shared_examples "should track not_found event" do
it "tracks event" do
@@ -15,7 +15,7 @@ RSpec.describe Projects::GoogleCloud::GcpRegionsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'admin_project_google_cloud!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'invalid_user',
project: project,
user: nil
@@ -29,7 +29,7 @@ RSpec.describe Projects::GoogleCloud::GcpRegionsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'admin_project_google_cloud!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'invalid_user',
project: project,
user: nil
@@ -43,7 +43,7 @@ RSpec.describe Projects::GoogleCloud::GcpRegionsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'feature_flag_enabled!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'feature_flag_not_enabled',
project: project,
user: user_maintainer
@@ -57,7 +57,7 @@ RSpec.describe Projects::GoogleCloud::GcpRegionsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'google_oauth2_enabled!',
- label: 'access_denied',
+ label: 'error_access_denied',
extra: { reason: 'google_oauth2_not_configured', config: config },
project: project,
user: user_maintainer
@@ -144,8 +144,8 @@ RSpec.describe Projects::GoogleCloud::GcpRegionsController do
sign_in(user_maintainer)
end
- it 'redirects to google cloud index' do
- is_expected.to redirect_to(project_google_cloud_index_path(project))
+ it 'redirects to google cloud configurations' do
+ is_expected.to redirect_to(project_google_cloud_configuration_path(project))
end
end
end
diff --git a/spec/requests/projects/google_cloud/revoke_oauth_controller_spec.rb b/spec/requests/projects/google_cloud/revoke_oauth_controller_spec.rb
index 07590d3710e..36441a184cb 100644
--- a/spec/requests/projects/google_cloud/revoke_oauth_controller_spec.rb
+++ b/spec/requests/projects/google_cloud/revoke_oauth_controller_spec.rb
@@ -47,13 +47,13 @@ RSpec.describe Projects::GoogleCloud::RevokeOauthController do
post url
expect(request.session[GoogleApi::CloudPlatform::Client.session_key_for_token]).to be_nil
- expect(response).to redirect_to(project_google_cloud_index_path(project))
+ expect(response).to redirect_to(project_google_cloud_configuration_path(project))
expect(flash[:notice]).to eq('Google OAuth2 token revocation requested')
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'revoke_oauth#create',
- label: 'create',
- property: 'success',
+ label: 'success',
+ property: '{}',
project: project,
user: user
)
@@ -70,13 +70,13 @@ RSpec.describe Projects::GoogleCloud::RevokeOauthController do
post url
expect(request.session[GoogleApi::CloudPlatform::Client.session_key_for_token]).to be_nil
- expect(response).to redirect_to(project_google_cloud_index_path(project))
+ expect(response).to redirect_to(project_google_cloud_configuration_path(project))
expect(flash[:alert]).to eq('Google OAuth2 token revocation request failed')
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'revoke_oauth#create',
- label: 'create',
- property: 'failed',
+ label: 'error',
+ property: '{}',
project: project,
user: user
)
diff --git a/spec/requests/projects/google_cloud/service_accounts_controller_spec.rb b/spec/requests/projects/google_cloud/service_accounts_controller_spec.rb
index 4b32965e2b0..ae2519855db 100644
--- a/spec/requests/projects/google_cloud/service_accounts_controller_spec.rb
+++ b/spec/requests/projects/google_cloud/service_accounts_controller_spec.rb
@@ -8,13 +8,15 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
describe 'GET index', :snowplow do
let_it_be(:url) { "#{project_google_cloud_service_accounts_path(project)}" }
- let(:user_guest) { create(:user) }
- let(:user_developer) { create(:user) }
- let(:user_maintainer) { create(:user) }
- let(:user_creator) { project.creator }
+ let_it_be(:user_guest) { create(:user) }
+ let_it_be(:user_developer) { create(:user) }
+ let_it_be(:user_maintainer) { create(:user) }
+ let_it_be(:user_creator) { project.creator }
- let(:unauthorized_members) { [user_guest, user_developer] }
- let(:authorized_members) { [user_maintainer, user_creator] }
+ let_it_be(:unauthorized_members) { [user_guest, user_developer] }
+ let_it_be(:authorized_members) { [user_maintainer, user_creator] }
+
+ let_it_be(:google_client_error) { Google::Apis::ClientError.new('client-error') }
before do
project.add_guest(user_guest)
@@ -30,7 +32,7 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'admin_project_google_cloud!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'invalid_user',
project: project,
user: nil
@@ -53,7 +55,7 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'admin_project_google_cloud!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'invalid_user',
project: project,
user: unauthorized_member
@@ -71,7 +73,7 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
expect_snowplow_event(
category: 'Projects::GoogleCloud',
action: 'admin_project_google_cloud!',
- label: 'access_denied',
+ label: 'error_access_denied',
property: 'invalid_user',
project: project,
user: unauthorized_member
@@ -116,7 +118,7 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
end
end
- it 'renders no_gcp_projects' do
+ it 'flashes error and redirects to google cloud configurations' do
authorized_members.each do |authorized_member|
allow_next_instance_of(BranchesFinder) do |branches_finder|
allow(branches_finder).to receive(:execute).and_return([])
@@ -130,7 +132,16 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
get url
- expect(response).to render_template('projects/google_cloud/errors/no_gcp_projects')
+ expect(response).to redirect_to(project_google_cloud_configuration_path(project))
+ expect(flash[:warning]).to eq('No Google Cloud projects - You need at least one Google Cloud project')
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'service_accounts#index',
+ label: 'error_form',
+ property: 'no_gcp_projects',
+ project: project,
+ user: authorized_member
+ )
end
end
end
@@ -171,7 +182,7 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
post url, params: { gcp_project: 'prj1', ref: 'env1' }
- expect(response).to redirect_to(project_google_cloud_index_path(project))
+ expect(response).to redirect_to(project_google_cloud_configuration_path(project))
end
end
end
@@ -181,29 +192,47 @@ RSpec.describe Projects::GoogleCloud::ServiceAccountsController do
before do
allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
allow(client).to receive(:validate_token).and_return(true)
- allow(client).to receive(:list_projects).and_raise(Google::Apis::ClientError.new(''))
- allow(client).to receive(:create_service_account).and_raise(Google::Apis::ClientError.new(''))
- allow(client).to receive(:create_service_account_key).and_raise(Google::Apis::ClientError.new(''))
+ allow(client).to receive(:list_projects).and_raise(google_client_error)
+ allow(client).to receive(:create_service_account).and_raise(google_client_error)
+ allow(client).to receive(:create_service_account_key).and_raise(google_client_error)
end
end
- it 'renders gcp_error template on GET' do
+ it 'GET flashes error and redirects to -/google_cloud/configurations' do
authorized_members.each do |authorized_member|
sign_in(authorized_member)
get url
- expect(response).to render_template(:gcp_error)
+ expect(response).to redirect_to(project_google_cloud_configuration_path(project))
+ expect(flash[:warning]).to eq('Google Cloud Error - client-error')
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'service_accounts#index',
+ label: 'error_gcp',
+ extra: google_client_error,
+ project: project,
+ user: authorized_member
+ )
end
end
- it 'renders gcp_error template on POST' do
+ it 'POST flashes error and redirects to -/google_cloud/configurations' do
authorized_members.each do |authorized_member|
sign_in(authorized_member)
post url, params: { gcp_project: 'prj1', environment: 'env1' }
- expect(response).to render_template(:gcp_error)
+ expect(response).to redirect_to(project_google_cloud_configuration_path(project))
+ expect(flash[:warning]).to eq('Google Cloud Error - client-error')
+ expect_snowplow_event(
+ category: 'Projects::GoogleCloud',
+ action: 'service_accounts#create',
+ label: 'error_gcp',
+ extra: google_client_error,
+ project: project,
+ user: authorized_member
+ )
end
end
end
diff --git a/spec/requests/projects/google_cloud_controller_spec.rb b/spec/requests/projects/google_cloud_controller_spec.rb
deleted file mode 100644
index d0814990989..00000000000
--- a/spec/requests/projects/google_cloud_controller_spec.rb
+++ /dev/null
@@ -1,178 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-# Mock Types
-MockGoogleOAuth2Credentials = Struct.new(:app_id, :app_secret)
-
-RSpec.describe Projects::GoogleCloudController do
- let_it_be(:project) { create(:project, :public) }
-
- describe 'GET index', :snowplow do
- let_it_be(:url) { "#{project_google_cloud_index_path(project)}" }
-
- context 'when a public request is made' do
- it 'returns not found' do
- get url
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect_snowplow_event(
- category: 'Projects::GoogleCloud',
- action: 'admin_project_google_cloud!',
- label: 'access_denied',
- property: 'invalid_user',
- project: project,
- user: nil)
- end
- end
-
- context 'when a project.guest makes request' do
- let(:user) { create(:user) }
-
- it 'returns not found' do
- project.add_guest(user)
- sign_in(user)
-
- get url
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect_snowplow_event(
- category: 'Projects::GoogleCloud',
- action: 'admin_project_google_cloud!',
- label: 'access_denied',
- property: 'invalid_user',
- project: project,
- user: user
- )
- end
- end
-
- context 'when project.developer makes request' do
- let(:user) { create(:user) }
-
- it 'returns not found' do
- project.add_developer(user)
- sign_in(user)
-
- get url
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect_snowplow_event(
- category: 'Projects::GoogleCloud',
- action: 'admin_project_google_cloud!',
- label: 'access_denied',
- property: 'invalid_user',
- project: project,
- user: user
- )
- end
- end
-
- context 'when project.maintainer makes request' do
- let(:user) { create(:user) }
-
- it 'returns successful' do
- project.add_maintainer(user)
- sign_in(user)
-
- get url
-
- expect(response).to be_successful
- end
- end
-
- context 'when project.creator makes request' do
- let(:user) { project.creator }
-
- it 'returns successful' do
- sign_in(user)
-
- get url
-
- expect(response).to be_successful
- end
- end
-
- describe 'when authorized user makes request' do
- let(:user) { project.creator }
-
- context 'but gitlab instance is not configured for google oauth2' do
- it 'returns forbidden' do
- unconfigured_google_oauth2 = MockGoogleOAuth2Credentials.new('', '')
- allow(Gitlab::Auth::OAuth::Provider).to receive(:config_for)
- .with('google_oauth2')
- .and_return(unconfigured_google_oauth2)
-
- sign_in(user)
-
- get url
-
- expect(response).to have_gitlab_http_status(:forbidden)
- expect_snowplow_event(
- category: 'Projects::GoogleCloud',
- action: 'google_oauth2_enabled!',
- label: 'access_denied',
- extra: { reason: 'google_oauth2_not_configured',
- config: unconfigured_google_oauth2 },
- project: project,
- user: user
- )
- end
- end
-
- context 'but feature flag is disabled' do
- before do
- stub_feature_flags(incubation_5mp_google_cloud: false)
- end
-
- it 'returns not found' do
- sign_in(user)
-
- get url
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect_snowplow_event(
- category: 'Projects::GoogleCloud',
- action: 'feature_flag_enabled!',
- label: 'access_denied',
- property: 'feature_flag_not_enabled',
- project: project,
- user: user
- )
- end
- end
-
- context 'but google oauth2 token is not valid' do
- it 'does not return revoke oauth url' do
- allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
- allow(client).to receive(:validate_token).and_return(false)
- end
-
- sign_in(user)
-
- get url
-
- expect(response).to be_successful
- expect_snowplow_event(
- category: 'Projects::GoogleCloud',
- action: 'google_cloud#index',
- label: 'index',
- extra: {
- screen: 'home',
- serviceAccounts: [],
- createServiceAccountUrl: project_google_cloud_service_accounts_path(project),
- enableCloudRunUrl: project_google_cloud_deployments_cloud_run_path(project),
- enableCloudStorageUrl: project_google_cloud_deployments_cloud_storage_path(project),
- emptyIllustrationUrl: ActionController::Base.helpers.image_path('illustrations/pipelines_empty.svg'),
- configureGcpRegionsUrl: project_google_cloud_gcp_regions_path(project),
- gcpRegions: [],
- revokeOauthUrl: nil
- },
- project: project,
- user: user
- )
- end
- end
- end
- end
-end
diff --git a/spec/requests/projects/harbor/artifacts_controller_spec.rb b/spec/requests/projects/harbor/artifacts_controller_spec.rb
new file mode 100644
index 00000000000..310fbcf0a0f
--- /dev/null
+++ b/spec/requests/projects/harbor/artifacts_controller_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::Harbor::ArtifactsController do
+ it_behaves_like 'a harbor artifacts controller', anonymous_status_code: '302' do
+ let_it_be(:container) { create(:project) }
+ let_it_be(:harbor_integration) { create(:harbor_integration, project: container) }
+ end
+end
diff --git a/spec/requests/projects/harbor/repositories_controller_spec.rb b/spec/requests/projects/harbor/repositories_controller_spec.rb
index cdb5a696d7e..751becaa20a 100644
--- a/spec/requests/projects/harbor/repositories_controller_spec.rb
+++ b/spec/requests/projects/harbor/repositories_controller_spec.rb
@@ -3,67 +3,8 @@
require 'spec_helper'
RSpec.describe Projects::Harbor::RepositoriesController do
- let_it_be(:project, reload: true) { create(:project) }
- let_it_be(:user) { create(:user) }
-
- shared_examples 'responds with 404 status' do
- it 'returns 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- shared_examples 'responds with 200 status' do
- it 'renders the index template' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:index)
- end
- end
-
- before do
- stub_feature_flags(harbor_registry_integration: true)
- project.add_developer(user)
- sign_in(user)
- end
-
- describe 'GET #index' do
- subject do
- get project_harbor_registry_index_path(project)
- response
- end
-
- context 'with harbor registry feature flag enabled' do
- it_behaves_like 'responds with 200 status'
- end
-
- context 'with harbor registry feature flag disabled' do
- before do
- stub_feature_flags(harbor_registry_integration: false)
- end
-
- it_behaves_like 'responds with 404 status'
- end
- end
-
- describe 'GET #show' do
- subject do
- get project_harbor_registry_path(project, 1)
- response
- end
-
- context 'with harbor registry feature flag enabled' do
- it_behaves_like 'responds with 200 status'
- end
-
- context 'with harbor registry feature flag disabled' do
- before do
- stub_feature_flags(harbor_registry_integration: false)
- end
-
- it_behaves_like 'responds with 404 status'
- end
+ it_behaves_like 'a harbor repositories controller', anonymous_status_code: '302' do
+ let_it_be(:container, reload: true) { create(:project) }
+ let_it_be(:harbor_integration) { create(:harbor_integration, project: container) }
end
end
diff --git a/spec/requests/projects/harbor/tags_controller_spec.rb b/spec/requests/projects/harbor/tags_controller_spec.rb
new file mode 100644
index 00000000000..119d1c746ac
--- /dev/null
+++ b/spec/requests/projects/harbor/tags_controller_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::Harbor::TagsController do
+ it_behaves_like 'a harbor tags controller', anonymous_status_code: '302' do
+ let_it_be(:container) { create(:project) }
+ let_it_be(:harbor_integration) { create(:harbor_integration, project: container) }
+ end
+end
diff --git a/spec/requests/projects/issues_controller_spec.rb b/spec/requests/projects/issues_controller_spec.rb
index 248e3e3a92b..de1d55ff5be 100644
--- a/spec/requests/projects/issues_controller_spec.rb
+++ b/spec/requests/projects/issues_controller_spec.rb
@@ -50,22 +50,6 @@ RSpec.describe Projects::IssuesController do
a_hash_including('id' => discussion_2.id.to_s)
])
end
-
- context 'when paginated_issue_discussions is disabled' do
- before do
- stub_feature_flags(paginated_issue_discussions: false)
- end
-
- it 'returns all discussions and ignores per_page param' do
- get_discussions(per_page: 2)
-
- discussions = Gitlab::Json.parse(response.body)
- notes = discussions.flat_map { |d| d['notes'] }
-
- expect(discussions.count).to eq(4)
- expect(notes.count).to eq(5)
- end
- end
end
end
diff --git a/spec/requests/projects/pipelines_controller_spec.rb b/spec/requests/projects/pipelines_controller_spec.rb
new file mode 100644
index 00000000000..1c6b1039aee
--- /dev/null
+++ b/spec/requests/projects/pipelines_controller_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::PipelinesController do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+
+ before_all do
+ create(:ci_build, pipeline: pipeline, stage: 'build')
+ create(:ci_bridge, pipeline: pipeline, stage: 'build')
+ create(:generic_commit_status, pipeline: pipeline, stage: 'build')
+
+ project.add_developer(user)
+ end
+
+ before do
+ login_as(user)
+ end
+
+ describe "GET stages.json" do
+ it 'does not execute N+1 queries' do
+ request_build_stage
+
+ control_count = ActiveRecord::QueryRecorder.new do
+ request_build_stage
+ end.count
+
+ create(:ci_build, pipeline: pipeline, stage: 'build')
+
+ expect { request_build_stage }.not_to exceed_query_limit(control_count)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ context 'with retried builds' do
+ it 'does not execute N+1 queries' do
+ create(:ci_build, :retried, :failed, pipeline: pipeline, stage: 'build')
+
+ request_build_stage(retried: true)
+
+ control_count = ActiveRecord::QueryRecorder.new do
+ request_build_stage(retried: true)
+ end.count
+
+ create(:ci_build, :retried, :failed, pipeline: pipeline, stage: 'build')
+
+ expect { request_build_stage(retried: true) }.not_to exceed_query_limit(control_count)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ def request_build_stage(params = {})
+ get stage_namespace_project_pipeline_path(
+ params.merge(
+ namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ id: pipeline.id,
+ stage: 'build',
+ format: :json
+ )
+ )
+ end
+ end
+end
diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb
index d033ce15b00..42f14392117 100644
--- a/spec/requests/users_controller_spec.rb
+++ b/spec/requests/users_controller_spec.rb
@@ -236,14 +236,14 @@ RSpec.describe UsersController do
let!(:deploy_key) { create(:deploy_key, user: user) }
shared_examples_for 'renders all public keys' do
- it 'renders all non-deploy keys separated with a new line with text/plain content type without the comment key' do
+ it 'renders all non-deploy keys terminated with a new line with text/plain content type without the comment key' do
get "/#{user.username}.keys"
expect(response).to be_successful
expect(response.media_type).to eq("text/plain")
expect(response.body).not_to eq('')
- expect(response.body).to eq(user.all_ssh_keys.join("\n"))
+ expect(response.body).to eq(user.all_ssh_keys.map { |key| key + "\n" }.join)
expect(response.body).to include(key.key.sub(' dummy@gitlab.com', ''))
expect(response.body).to include(another_key.key.sub(' dummy@gitlab.com', ''))
@@ -308,7 +308,7 @@ RSpec.describe UsersController do
let!(:another_gpg_key) { create(:another_gpg_key, user: user.reload) }
shared_examples_for 'renders all verified GPG keys' do
- it 'renders all verified keys separated with a new line with text/plain content type' do
+ it 'renders all verified keys terminated with a new line with text/plain content type' do
get "/#{user.username}.gpg"
expect(response).to be_successful
@@ -316,7 +316,7 @@ RSpec.describe UsersController do
expect(response.media_type).to eq("text/plain")
expect(response.body).not_to eq('')
- expect(response.body).to eq(user.gpg_keys.select(&:verified?).map(&:key).join("\n"))
+ expect(response.body).to eq(user.gpg_keys.filter_map { |gpg_key| gpg_key.key + "\n" if gpg_key.verified? }.join)
expect(response.body).to include(gpg_key.key)
expect(response.body).to include(another_gpg_key.key)
diff --git a/spec/requests/verifies_with_email_spec.rb b/spec/requests/verifies_with_email_spec.rb
new file mode 100644
index 00000000000..2f249952455
--- /dev/null
+++ b/spec/requests/verifies_with_email_spec.rb
@@ -0,0 +1,234 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'VerifiesWithEmail', :clean_gitlab_redis_sessions, :clean_gitlab_redis_rate_limiting do
+ include SessionHelpers
+ include EmailHelpers
+
+ let(:user) { create(:user) }
+
+ shared_examples_for 'send verification instructions' do
+ it 'locks the user' do
+ user.reload
+ expect(user.unlock_token).not_to be_nil
+ expect(user.locked_at).not_to be_nil
+ end
+
+ it 'sends an email' do
+ mail = find_email_for(user)
+ expect(mail.to).to match_array([user.email])
+ expect(mail.subject).to eq('Verify your identity')
+ end
+ end
+
+ shared_examples_for 'prompt for email verification' do
+ it 'sets the verification_user_id session variable and renders the email verification template' do
+ expect(request.session[:verification_user_id]).to eq(user.id)
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('devise/sessions/email_verification')
+ end
+ end
+
+ describe 'verify_with_email' do
+ context 'when user is locked and a verification_user_id session variable exists' do
+ before do
+ encrypted_token = Devise.token_generator.digest(User, :unlock_token, 'token')
+ user.update!(locked_at: Time.current, unlock_token: encrypted_token)
+ stub_session(verification_user_id: user.id)
+ end
+
+ context 'when rate limited and a verification_token param exists' do
+ before do
+ allow(Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
+
+ post(user_session_path(user: { verification_token: 'token' }))
+ end
+
+ it_behaves_like 'prompt for email verification'
+
+ it 'adds a verification error message' do
+ expect(response.body)
+ .to include("You&#39;ve reached the maximum amount of tries. "\
+ 'Wait 10 minutes or resend a new code and try again.')
+ end
+ end
+
+ context 'when an invalid verification_token param exists' do
+ before do
+ post(user_session_path(user: { verification_token: 'invalid_token' }))
+ end
+
+ it_behaves_like 'prompt for email verification'
+
+ it 'adds a verification error message' do
+ expect(response.body).to include(('The code is incorrect. Enter it again, or resend a new code.'))
+ end
+ end
+
+ context 'when an expired verification_token param exists' do
+ before do
+ user.update!(locked_at: 1.hour.ago)
+ post(user_session_path(user: { verification_token: 'token' }))
+ end
+
+ it_behaves_like 'prompt for email verification'
+
+ it 'adds a verification error message' do
+ expect(response.body).to include(('The code has expired. Resend a new code and try again.'))
+ end
+ end
+
+ context 'when a valid verification_token param exists' do
+ before do
+ post(user_session_path(user: { verification_token: 'token' }))
+ end
+
+ it 'unlocks the user' do
+ user.reload
+ expect(user.unlock_token).to be_nil
+ expect(user.locked_at).to be_nil
+ end
+
+ it 'redirects to the successful verification path' do
+ expect(response).to redirect_to(users_successful_verification_path)
+ end
+ end
+ end
+
+ context 'when signing in with a valid password' do
+ let(:sign_in) { post(user_session_path(user: { login: user.username, password: user.password })) }
+
+ context 'when the feature flag is toggled on' do
+ before do
+ stub_feature_flags(require_email_verification: user)
+ end
+
+ context 'when rate limited' do
+ before do
+ allow(Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
+ sign_in
+ end
+
+ it 'redirects to the login form and shows an alert message' do
+ expect(response).to redirect_to(new_user_session_path)
+ expect(flash[:alert]).to eq('Maximum login attempts exceeded. Wait 10 minutes and try again.')
+ end
+ end
+
+ context 'when the user already has an unlock_token set' do
+ before do
+ user.update!(unlock_token: 'token')
+ sign_in
+ end
+
+ it_behaves_like 'prompt for email verification'
+ end
+
+ context 'when the user is already locked' do
+ before do
+ user.update!(locked_at: Time.current)
+ perform_enqueued_jobs { sign_in }
+ end
+
+ it_behaves_like 'send verification instructions'
+ it_behaves_like 'prompt for email verification'
+ end
+
+ context 'when the user is signing in from an unknown ip address' do
+ before do
+ allow(AuthenticationEvent)
+ .to receive(:initial_login_or_known_ip_address?)
+ .and_return(false)
+
+ perform_enqueued_jobs { sign_in }
+ end
+
+ it_behaves_like 'send verification instructions'
+ it_behaves_like 'prompt for email verification'
+ end
+ end
+
+ context 'when the feature flag is toggled off' do
+ let(:another_user) { build(:user) }
+
+ before do
+ stub_feature_flags(require_email_verification: another_user)
+ sign_in
+ end
+
+ it 'redirects to the root path' do
+ expect(response).to redirect_to(root_path)
+ end
+ end
+ end
+ end
+
+ describe 'resend_verification_code' do
+ context 'when no verification_user_id session variable exists' do
+ before do
+ post(users_resend_verification_code_path)
+ end
+
+ it 'returns 204 No Content' do
+ expect(response).to have_gitlab_http_status(:no_content)
+ expect(response.body).to be_empty
+ end
+ end
+
+ context 'when a verification_user_id session variable exists' do
+ before do
+ stub_session(verification_user_id: user.id)
+
+ perform_enqueued_jobs do
+ post(users_resend_verification_code_path)
+ end
+ end
+
+ it_behaves_like 'send verification instructions'
+ it_behaves_like 'prompt for email verification'
+ end
+
+ context 'when exceeding the rate limit' do
+ before do
+ allow(Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
+
+ stub_session(verification_user_id: user.id)
+
+ perform_enqueued_jobs do
+ post(users_resend_verification_code_path)
+ end
+ end
+
+ it 'does not lock the user' do
+ user.reload
+ expect(user.unlock_token).to be_nil
+ expect(user.locked_at).to be_nil
+ end
+
+ it 'does not send an email' do
+ mail = find_email_for(user)
+ expect(mail).to be_nil
+ end
+
+ it_behaves_like 'prompt for email verification'
+ end
+ end
+
+ describe 'successful_verification' do
+ before do
+ sign_in(user)
+ end
+
+ it 'renders the template and removes the verification_user_id session variable' do
+ stub_session(verification_user_id: user.id)
+
+ get(users_successful_verification_path)
+
+ expect(request.session.has_key?(:verification_user_id)).to eq(false)
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('successful_verification', layout: 'minimal')
+ expect(response.body).to include(root_path)
+ end
+ end
+end
diff --git a/spec/routing/group_routing_spec.rb b/spec/routing/group_routing_spec.rb
index 5c2ef62683e..9f5f821cc61 100644
--- a/spec/routing/group_routing_spec.rb
+++ b/spec/routing/group_routing_spec.rb
@@ -59,6 +59,18 @@ RSpec.shared_examples 'groups routing' do
expect(get('/groups/gitlabhq/-/boards')).to route_to('groups/boards#index', group_id: 'gitlabhq')
end
+
+ it 'routes to the harbor repositories controller' do
+ expect(get("groups/#{group_path}/-/harbor/repositories")).to route_to('groups/harbor/repositories#index', group_id: group_path)
+ end
+
+ it 'routes to the harbor artifacts controller' do
+ expect(get("groups/#{group_path}/-/harbor/repositories/test/artifacts")).to route_to('groups/harbor/artifacts#index', group_id: group_path, repository_id: 'test')
+ end
+
+ it 'routes to the harbor tags controller' do
+ expect(get("groups/#{group_path}/-/harbor/repositories/test/artifacts/test/tags")).to route_to('groups/harbor/tags#index', group_id: group_path, repository_id: 'test', artifact_id: 'test')
+ end
end
RSpec.describe "Groups", "routing" do
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index 47fd1622306..1d58a31bd6e 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -788,20 +788,6 @@ RSpec.describe 'project routing' do
it 'to #test' do
expect(put('/gitlab/gitlabhq/-/settings/integrations/acme/test')).to route_to('projects/settings/integrations#test', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'acme')
end
-
- context 'legacy routes' do
- it 'to #edit' do
- expect(get('/gitlab/gitlabhq/-/integrations/acme/edit')).to route_to('projects/settings/integrations#edit', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'acme')
- end
-
- it 'to #update' do
- expect(put('/gitlab/gitlabhq/-/integrations/acme')).to route_to('projects/settings/integrations#update', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'acme')
- end
-
- it 'to #test' do
- expect(put('/gitlab/gitlabhq/-/integrations/acme/test')).to route_to('projects/settings/integrations#test', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'acme')
- end
- end
end
describe Projects::Settings::IntegrationHookLogsController do
@@ -812,16 +798,6 @@ RSpec.describe 'project routing' do
it 'to #retry' do
expect(post('/gitlab/gitlabhq/-/settings/integrations/acme/hook_logs/log/retry')).to route_to('projects/settings/integration_hook_logs#retry', namespace_id: 'gitlab', project_id: 'gitlabhq', integration_id: 'acme', id: 'log')
end
-
- context 'legacy routes' do
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/-/integrations/acme/hook_logs/log')).to route_to('projects/settings/integration_hook_logs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', integration_id: 'acme', id: 'log')
- end
-
- it 'to #retry' do
- expect(post('/gitlab/gitlabhq/-/integrations/acme/hook_logs/log/retry')).to route_to('projects/settings/integration_hook_logs#retry', namespace_id: 'gitlab', project_id: 'gitlabhq', integration_id: 'acme', id: 'log')
- end
- end
end
describe Projects::TemplatesController, 'routing' do
diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb
index 79edfdd2b3f..2bd23340a88 100644
--- a/spec/routing/routing_spec.rb
+++ b/spec/routing/routing_spec.rb
@@ -310,6 +310,26 @@ RSpec.describe "Authentication", "routing" do
expect(post("/users/auth/ldapmain/callback")).not_to be_routable
end
end
+
+ context 'with multiple LDAP providers configured' do
+ let(:ldap_settings) do
+ {
+ enabled: true,
+ servers: {
+ main: { 'provider_name' => 'ldapmain' },
+ secondary: { 'provider_name' => 'ldapsecondary' }
+ }
+ }
+ end
+
+ it 'POST /users/auth/ldapmain/callback' do
+ expect(post("/users/auth/ldapmain/callback")).to route_to('ldap/omniauth_callbacks#ldapmain')
+ end
+
+ it 'POST /users/auth/ldapsecondary/callback' do
+ expect(post("/users/auth/ldapsecondary/callback")).to route_to('ldap/omniauth_callbacks#ldapsecondary')
+ end
+ end
end
end
diff --git a/spec/rubocop/cop/database/rescue_query_canceled_spec.rb b/spec/rubocop/cop/database/rescue_query_canceled_spec.rb
new file mode 100644
index 00000000000..56314a18bf5
--- /dev/null
+++ b/spec/rubocop/cop/database/rescue_query_canceled_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/database/rescue_query_canceled'
+
+RSpec.describe RuboCop::Cop::Database::RescueQueryCanceled do
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of ActiveRecord::QueryCanceled' do
+ expect_offense(<<~CODE)
+ begin
+ do_something
+ rescue ActiveRecord::QueryCanceled => e
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid rescuing the `ActiveRecord::QueryCanceled` [...]
+ try_something_else
+ end
+ CODE
+ end
+
+ it 'does not flag a different exception' do
+ expect_no_offenses(<<~CODE)
+ begin
+ do_something
+ rescue ActiveRecord::RecordNotFound => e
+ try_something_else
+ end
+ CODE
+ end
+end
diff --git a/spec/rubocop/cop/database/rescue_statement_timeout_spec.rb b/spec/rubocop/cop/database/rescue_statement_timeout_spec.rb
new file mode 100644
index 00000000000..b9b2ce1c16b
--- /dev/null
+++ b/spec/rubocop/cop/database/rescue_statement_timeout_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/database/rescue_statement_timeout'
+
+RSpec.describe RuboCop::Cop::Database::RescueStatementTimeout do
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of ActiveRecord::StatementTimeout' do
+ expect_offense(<<~CODE)
+ begin
+ do_something
+ rescue ActiveRecord::StatementTimeout => e
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid rescuing the `ActiveRecord::StatementTimeout` [...]
+ try_something_else
+ end
+ CODE
+ end
+
+ it 'does not flag a different exception' do
+ expect_no_offenses(<<~CODE)
+ begin
+ do_something
+ rescue ActiveRecord::RecordNotFound => e
+ try_something_else
+ end
+ CODE
+ end
+end
diff --git a/spec/rubocop/cop/gitlab/namespaced_class_spec.rb b/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
index d9209a8672c..83d0eaf4884 100644
--- a/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
+++ b/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe RuboCop::Cop::Gitlab::NamespacedClass do
it 'flags a class definition without additional namespace' do
expect_offense(namespaced(<<~SOURCE))
class MyClass
- ^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^ #{described_class::MSG}
end
SOURCE
end
@@ -28,7 +28,7 @@ RSpec.describe RuboCop::Cop::Gitlab::NamespacedClass do
it 'flags a compact class definition without additional namespace' do
expect_offense(<<~SOURCE, namespace: namespace)
class %{namespace}::MyClass
- ^{namespace}^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^{namespace}^^^^^^^^^ #{described_class::MSG}
end
SOURCE
end
@@ -36,7 +36,7 @@ RSpec.describe RuboCop::Cop::Gitlab::NamespacedClass do
it 'flags a class definition with inheritance without additional namespace' do
expect_offense(namespaced(<<~SOURCE))
class MyClass < ApplicationRecord
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^ #{described_class::MSG}
def some_method
true
end
diff --git a/spec/scripts/determine-qa-tests_spec.rb b/spec/scripts/determine-qa-tests_spec.rb
new file mode 100644
index 00000000000..043eb7f2dc9
--- /dev/null
+++ b/spec/scripts/determine-qa-tests_spec.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+require 'fast_spec_helper'
+
+load File.expand_path('../../scripts/determine-qa-tests', __dir__)
+
+RSpec.describe 'scripts/determine-qa-tests' do
+ describe DetermineQATests do
+ describe '.execute' do
+ let(:qa_spec_files) do
+ %w[qa/qa/specs/features/browser_ui/1_manage/test1.rb
+ qa/qa/specs/features/browser_ui/1_manage/user/test2.rb]
+ end
+
+ let(:qa_spec_and_non_spec_files) do
+ %w[qa/qa/specs/features/browser_ui/1_manage/test1.rb
+ qa/qa/page/admin/menu.rb]
+ end
+
+ let(:non_qa_files) do
+ %w[rubocop/code_reuse_helpers.rb
+ app/components/diffs/overflow_warning_component.rb]
+ end
+
+ let(:non_qa_and_feature_flag_files) do
+ %w[rubocop/code_reuse_helpers.rb
+ app/components/diffs/overflow_warning_component.rb
+ config/feature_flags/development/access_token_ajax.yml]
+ end
+
+ let(:qa_spec_and_non_qa_files) do
+ %w[rubocop/code_reuse_helpers.rb
+ app/components/diffs/overflow_warning_component.rb
+ qa/qa/specs/features/browser_ui/1_manage/test1.rb]
+ end
+
+ let(:qa_non_spec_and_non_qa_files) do
+ %w[rubocop/code_reuse_helpers.rb
+ app/components/diffs/overflow_warning_component.rb
+ qa/qa/page/admin/menu.rb]
+ end
+
+ shared_examples 'determine qa tests' do
+ context 'when only qa spec files have changed' do
+ it 'returns only the changed qa specs' do
+ subject = described_class.new({ changed_files: qa_spec_files }.merge(labels))
+
+ expect(subject.execute).to eql qa_spec_files.map { |path| path.delete_prefix("qa/") }.join(' ')
+ end
+ end
+
+ context 'when qa spec and non spec files have changed' do
+ it 'does not return any specs' do
+ subject = described_class.new({ changed_files: qa_spec_and_non_spec_files }.merge(labels))
+ expect(subject.execute).to be_nil
+ end
+ end
+
+ context 'when non-qa and feature flag files have changed' do
+ it 'does not return any specs' do
+ subject = described_class.new({ changed_files: non_qa_and_feature_flag_files }.merge(labels))
+ expect(subject.execute).to be_nil
+ end
+ end
+
+ context 'when qa spec and non-qa files have changed' do
+ it 'does not return any specs' do
+ subject = described_class.new({ changed_files: qa_spec_and_non_qa_files }.merge(labels))
+ expect(subject.execute).to be_nil
+ end
+ end
+
+ context 'when qa non-spec and non-qa files have changed' do
+ it 'does not return any specs' do
+ subject = described_class.new({ changed_files: qa_non_spec_and_non_qa_files }.merge(labels))
+ expect(subject.execute).to be_nil
+ end
+ end
+ end
+
+ context 'when a devops label is not specified' do
+ let(:labels) { { mr_labels: ['type::feature'] } }
+
+ it_behaves_like 'determine qa tests'
+
+ context 'when only non-qa files have changed' do
+ it 'does not return any specs' do
+ subject = described_class.new({ changed_files: non_qa_files })
+ expect(subject.execute).to be_nil
+ end
+ end
+ end
+
+ context 'when a devops label is specified' do
+ let(:labels) { { mr_labels: %w[devops::manage type::feature] } }
+
+ it_behaves_like 'determine qa tests'
+
+ context 'when only non-qa files have changed' do
+ it 'returns the specs for the devops label' do
+ subject = described_class.new({ changed_files: non_qa_files }.merge(labels))
+ allow(subject).to receive(:qa_spec_directories_for_devops_stage)
+ .and_return(['qa/qa/specs/features/browser_ui/1_manage/'])
+ expect(subject.execute).to eql 'qa/specs/features/browser_ui/1_manage/'
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/scripts/lib/glfm/update_example_snapshots_spec.rb b/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
index 82ed8563c3a..149a384d31e 100644
--- a/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
+++ b/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
@@ -14,7 +14,7 @@ require_relative '../../../../scripts/lib/glfm/update_example_snapshots'
# This is because the invocation of the full script is slow, because it executes
# two subshells for processing, one which runs a full Rails environment, and one
# which runs a jest test environment. This results in each full run of the script
-# taking between 30-60 seconds. The majority of this is spent loading the Rails environmnent.
+# taking between 30-60 seconds. The majority of this is spent loading the Rails environment.
#
# However, only the `writing html.yml and prosemirror_json.yml` context is used
# to test these slow sub-processes, and it only contains a single example.
@@ -79,6 +79,31 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process' do
<div class="extension">
+ ### Motivation
+
+ This is a third-level heading with no examples, as exists in the actual GHFM
+ specification. It exists to drive a fix for a bug where this caused the
+ indexing and ordering to in examples_index.yml to be incorrect.
+
+ ### Another H3
+
+ This is a second consecutive third-level heading. It exists to drive full code coverage
+ for this scenario, although it doesn't (yet) exist in the actual spec.txt.
+
+ ## An H2 with all disabled examples
+
+ In the GHFM specification, the 'Task list items (extension)' contains only "disabled"
+ examples, which are ignored by the GitHub fork of `spec_test.py`, and thus not part of the
+ Markdown conformance tests, but are part of the HTML-rendered version of the specification.
+ We also exclude them from our GLFM specification for consistency, but we may add
+ GitLab-specific examples for the behavior instead.
+
+ ```````````````````````````````` example disabled
+ this example is disabled during conformance testing
+ .
+ <p>this example is disabled during conformance testing</p>
+ ````````````````````````````````
+
## Strikethrough (extension)
GFM enables the `strikethrough` extension.
@@ -202,7 +227,7 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process' do
"existing": "This entry is existing, but not skipped, so it will be overwritten."
}
# 02_01__inlines__strong__002: is omitted from the existing file and skipped, to test that scenario.
- 02_02__inlines__strikethrough_extension__001: |-
+ 02_03__inlines__strikethrough_extension__001: |-
{
"type": "doc",
"content": [
@@ -314,20 +339,20 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process' do
02_01__inlines__strong__002:
spec_txt_example_position: 2
source_specification: github
- 02_02__inlines__strikethrough_extension__001:
- spec_txt_example_position: 3
+ 02_03__inlines__strikethrough_extension__001:
+ spec_txt_example_position: 4
source_specification: github
03_01__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__001:
- spec_txt_example_position: 4
+ spec_txt_example_position: 5
source_specification: gitlab
04_01__second_gitlab_specific_section_with_examples__strong_but_with_html__001:
- spec_txt_example_position: 5
+ spec_txt_example_position: 6
source_specification: gitlab
05_01__third_gitlab_specific_section_with_skipped_examples__strong_but_skipped__001:
- spec_txt_example_position: 6
+ spec_txt_example_position: 7
source_specification: gitlab
05_02__third_gitlab_specific_section_with_skipped_examples__strong_but_manually_modified_and_skipped__001:
- spec_txt_example_position: 7
+ spec_txt_example_position: 8
source_specification: gitlab
ES_EXAMPLES_INDEX_YML_CONTENTS
end
@@ -349,7 +374,7 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process' do
__bold__
02_01__inlines__strong__002: |
__bold with more text__
- 02_02__inlines__strikethrough_extension__001: |
+ 02_03__inlines__strikethrough_extension__001: |
~~Hi~~ Hello, world!
03_01__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__001: |
**bold**
@@ -413,7 +438,7 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process' do
<p data-sourcepos="1:1-1:23" dir="auto"><strong>bold with more text</strong></p>
wysiwyg: |-
<p><strong>bold with more text</strong></p>
- 02_02__inlines__strikethrough_extension__001:
+ 02_03__inlines__strikethrough_extension__001:
canonical: |
<p><del>Hi</del> Hello, world!</p>
static: |-
@@ -468,7 +493,7 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process' do
}
]
}
- 02_02__inlines__strikethrough_extension__001: |-
+ 02_03__inlines__strikethrough_extension__001: |-
{
"type": "doc",
"content": [
diff --git a/spec/scripts/pipeline_test_report_builder_spec.rb b/spec/scripts/pipeline_test_report_builder_spec.rb
index 8553ada044e..198cdefc530 100644
--- a/spec/scripts/pipeline_test_report_builder_spec.rb
+++ b/spec/scripts/pipeline_test_report_builder_spec.rb
@@ -103,16 +103,18 @@ RSpec.describe PipelineTestReportBuilder do
end
describe '#test_report_for_latest_pipeline' do
+ let(:failed_build_uri) { "#{failed_pipeline_url}/tests/suite.json?build_ids[]=#{failed_build_id}" }
+
+ before do
+ allow(subject).to receive(:fetch).with(failed_build_uri).and_return(failed_builds_for_pipeline)
+ end
+
it 'fetches builds from pipeline related to MR' do
- expect(subject).to receive(:fetch).with("#{failed_pipeline_url}/tests/suite.json?build_ids[]=#{failed_build_id}").and_return(failed_builds_for_pipeline)
- subject.test_report_for_latest_pipeline
+ expected = { "suites" => [failed_builds_for_pipeline] }.to_json
+ expect(subject.test_report_for_latest_pipeline).to eq(expected)
end
context 'canonical pipeline' do
- before do
- allow(subject).to receive(:test_report_for_build).and_return(test_report_for_build)
- end
-
context 'no previous pipeline' do
let(:mr_pipelines) { [] }
@@ -171,6 +173,10 @@ RSpec.describe PipelineTestReportBuilder do
end
context 'failed pipeline and failed test builds' do
+ before do
+ allow(subject).to receive(:fetch).with(failed_build_uri).and_return(test_report_for_build)
+ end
+
it 'returns populated test list for suites' do
actual = subject.test_report_for_latest_pipeline
expected = {
@@ -180,6 +186,36 @@ RSpec.describe PipelineTestReportBuilder do
expect(actual).to eq(expected)
end
end
+
+ context 'when receiving a server error' do
+ let(:response) { instance_double('Net::HTTPResponse') }
+ let(:error) { Net::HTTPServerException.new('server error', response) }
+ let(:test_report_for_latest_pipeline) { subject.test_report_for_latest_pipeline }
+
+ before do
+ allow(response).to receive(:code).and_return(response_code)
+ allow(subject).to receive(:fetch).with(failed_build_uri).and_raise(error)
+ end
+
+ context 'when response code is 404' do
+ let(:response_code) { 404 }
+
+ it 'continues without the missing reports' do
+ expected = { 'suites' => [] }.to_json
+
+ expect { test_report_for_latest_pipeline }.not_to raise_error
+ expect(test_report_for_latest_pipeline).to eq(expected)
+ end
+ end
+
+ context 'when response code is unexpected' do
+ let(:response_code) { 500 }
+
+ it 'raises HTTPServerException' do
+ expect { test_report_for_latest_pipeline }.to raise_error(error)
+ end
+ end
+ end
end
end
end
diff --git a/spec/serializers/ci/dag_job_group_entity_spec.rb b/spec/serializers/ci/dag_job_group_entity_spec.rb
index 5a75c04efe5..b654b21f583 100644
--- a/spec/serializers/ci/dag_job_group_entity_spec.rb
+++ b/spec/serializers/ci/dag_job_group_entity_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Ci::DagJobGroupEntity do
subject { entity.as_json }
context 'when group contains 1 job' do
- let(:job) { create(:ci_build, stage: stage, pipeline: pipeline, name: 'test') }
+ let(:job) { create(:ci_build, stage_id: stage.id, pipeline: pipeline, name: 'test') }
let(:jobs) { [job] }
it 'exposes a name' do
@@ -38,8 +38,8 @@ RSpec.describe Ci::DagJobGroupEntity do
end
context 'when group contains multiple parallel jobs' do
- let(:job_1) { create(:ci_build, stage: stage, pipeline: pipeline, name: 'test 1/2') }
- let(:job_2) { create(:ci_build, stage: stage, pipeline: pipeline, name: 'test 2/2') }
+ let(:job_1) { create(:ci_build, stage_id: stage.id, pipeline: pipeline, name: 'test 1/2') }
+ let(:job_2) { create(:ci_build, stage_id: stage.id, pipeline: pipeline, name: 'test 2/2') }
let(:jobs) { [job_1, job_2] }
it 'exposes a name' do
diff --git a/spec/serializers/ci/dag_pipeline_entity_spec.rb b/spec/serializers/ci/dag_pipeline_entity_spec.rb
index 31a0dc5c048..548fd247743 100644
--- a/spec/serializers/ci/dag_pipeline_entity_spec.rb
+++ b/spec/serializers/ci/dag_pipeline_entity_spec.rb
@@ -43,9 +43,9 @@ RSpec.describe Ci::DagPipelineEntity do
end
context 'when pipeline has parallel jobs, DAG needs and GenericCommitStatus' do
- let!(:stage_build) { create(:ci_stage_entity, name: 'build', position: 1, pipeline: pipeline) }
- let!(:stage_test) { create(:ci_stage_entity, name: 'test', position: 2, pipeline: pipeline) }
- let!(:stage_deploy) { create(:ci_stage_entity, name: 'deploy', position: 3, pipeline: pipeline) }
+ let!(:stage_build) { create(:ci_stage, name: 'build', position: 1, pipeline: pipeline) }
+ let!(:stage_test) { create(:ci_stage, name: 'test', position: 2, pipeline: pipeline) }
+ let!(:stage_deploy) { create(:ci_stage, name: 'deploy', position: 3, pipeline: pipeline) }
let!(:job_build_1) { create(:ci_build, name: 'build 1', stage: 'build', pipeline: pipeline) }
let!(:job_build_2) { create(:ci_build, name: 'build 2', stage: 'build', pipeline: pipeline) }
diff --git a/spec/serializers/ci/dag_stage_entity_spec.rb b/spec/serializers/ci/dag_stage_entity_spec.rb
index 0262ccdac68..3530a5e2bae 100644
--- a/spec/serializers/ci/dag_stage_entity_spec.rb
+++ b/spec/serializers/ci/dag_stage_entity_spec.rb
@@ -6,10 +6,10 @@ RSpec.describe Ci::DagStageEntity do
let_it_be(:pipeline) { create(:ci_pipeline) }
let_it_be(:request) { double(:request) }
- let(:stage) { build(:ci_stage, pipeline: pipeline, name: 'test') }
+ let(:stage) { create(:ci_stage, pipeline: pipeline, name: 'test') }
let(:entity) { described_class.new(stage, request: request) }
- let!(:job) { create(:ci_build, :success, pipeline: pipeline) }
+ let!(:job) { create(:ci_build, :success, pipeline: pipeline, stage_id: stage.id) }
describe '#as_json' do
subject { entity.as_json }
diff --git a/spec/serializers/ci/job_entity_spec.rb b/spec/serializers/ci/job_entity_spec.rb
index 05b9e38444c..174d9a0aadb 100644
--- a/spec/serializers/ci/job_entity_spec.rb
+++ b/spec/serializers/ci/job_entity_spec.rb
@@ -52,6 +52,14 @@ RSpec.describe Ci::JobEntity do
expect(subject[:status]).to include :icon, :favicon, :text, :label, :tooltip
end
+ it 'contains queued_at' do
+ expect(subject).to include :queued_at
+ end
+
+ it 'contains queued_duration' do
+ expect(subject).to include :queued_duration
+ end
+
context 'when job is retryable' do
before do
job.update!(status: :failed)
diff --git a/spec/serializers/ci/job_serializer_spec.rb b/spec/serializers/ci/job_serializer_spec.rb
index d47c9fdbf24..5f889a10f3d 100644
--- a/spec/serializers/ci/job_serializer_spec.rb
+++ b/spec/serializers/ci/job_serializer_spec.rb
@@ -28,36 +28,4 @@ RSpec.describe Ci::JobSerializer do
end
end
end
-
- describe '#represent_status' do
- context 'for a failed build' do
- let(:resource) { create(:ci_build, :failed) }
- let(:status) { resource.detailed_status(double('user')) }
-
- subject { serializer.represent_status(resource) }
-
- it 'serializes only status' do
- expect(subject[:text]).to eq(status.text)
- expect(subject[:label]).to eq('failed')
- expect(subject[:tooltip]).to eq('failed - (unknown failure)')
- expect(subject[:icon]).to eq(status.icon)
- expect(subject[:favicon]).to match_asset_path("/assets/ci_favicons/#{status.favicon}.png")
- end
- end
-
- context 'for any other type of build' do
- let(:resource) { create(:ci_build, :success) }
- let(:status) { resource.detailed_status(double('user')) }
-
- subject { serializer.represent_status(resource) }
-
- it 'serializes only status' do
- expect(subject[:text]).to eq(status.text)
- expect(subject[:label]).to eq('passed')
- expect(subject[:tooltip]).to eq('passed')
- expect(subject[:icon]).to eq(status.icon)
- expect(subject[:favicon]).to match_asset_path("/assets/ci_favicons/#{status.favicon}.png")
- end
- end
- end
end
diff --git a/spec/serializers/cluster_entity_spec.rb b/spec/serializers/cluster_entity_spec.rb
index 514828e3c69..7c4c146575d 100644
--- a/spec/serializers/cluster_entity_spec.rb
+++ b/spec/serializers/cluster_entity_spec.rb
@@ -55,65 +55,5 @@ RSpec.describe ClusterEntity do
expect(helm[:status]).to eq(:not_installable)
end
end
-
- context 'gitlab_managed_apps_logs_path' do
- let(:cluster) { create(:cluster, :project) }
- let(:user) { create(:user) }
-
- subject { described_class.new(cluster, request: request).as_json }
-
- before do
- allow_next_instance_of(Clusters::ClusterPresenter) do |presenter|
- allow(presenter).to receive(:show_path).and_return(nil)
- end
- end
-
- it 'return projects log explorer path' do
- log_explorer_path = project_logs_path(cluster.project, cluster_id: cluster.id)
-
- expect_next_instance_of(Clusters::ClusterPresenter, cluster, current_user: user) do |presenter|
- expect(presenter).to receive(:gitlab_managed_apps_logs_path).and_return(log_explorer_path)
- end
-
- expect(subject[:gitlab_managed_apps_logs_path]).to eq(log_explorer_path)
- end
-
- context 'when feature is disabled' do
- before do
- stub_feature_flags(monitor_logging: false)
- end
-
- specify { is_expected.not_to include(:gitlab_managed_apps_logs_path) }
- end
- end
-
- context 'enable_advanced_logs_querying' do
- let(:cluster) { create(:cluster, :project) }
- let(:user) { create(:user) }
-
- subject { described_class.new(cluster, request: request).as_json }
-
- context 'elastic stack is not installed on cluster' do
- it 'returns false' do
- expect(subject[:enable_advanced_logs_querying]).to be false
- end
- end
-
- context 'elastic stack is enabled on cluster' do
- it 'returns true' do
- create(:clusters_integrations_elastic_stack, cluster: cluster)
-
- expect(subject[:enable_advanced_logs_querying]).to be true
- end
- end
-
- context 'when feature is disabled' do
- before do
- stub_feature_flags(monitor_logging: false)
- end
-
- specify { is_expected.not_to include(:enable_advanced_logs_querying) }
- end
- end
end
end
diff --git a/spec/serializers/cluster_serializer_spec.rb b/spec/serializers/cluster_serializer_spec.rb
index e65e97b6ae0..7ec6d3c8bb8 100644
--- a/spec/serializers/cluster_serializer_spec.rb
+++ b/spec/serializers/cluster_serializer_spec.rb
@@ -14,8 +14,6 @@ RSpec.describe ClusterSerializer do
:enabled,
:environment_scope,
:id,
- :gitlab_managed_apps_logs_path,
- :enable_advanced_logs_querying,
:kubernetes_errors,
:name,
:nodes,
diff --git a/spec/serializers/diffs_entity_spec.rb b/spec/serializers/diffs_entity_spec.rb
index aef7d3732f8..72777bde30c 100644
--- a/spec/serializers/diffs_entity_spec.rb
+++ b/spec/serializers/diffs_entity_spec.rb
@@ -100,6 +100,7 @@ RSpec.describe DiffsEntity do
let(:options) { super().merge(merge_ref_head_diff: merge_ref_head_diff) }
before do
+ allow(merge_request).to receive(:cannot_be_merged?).and_return(true)
allow(MergeRequests::Conflicts::ListService).to receive(:new).and_return(conflicts)
end
diff --git a/spec/serializers/diffs_metadata_entity_spec.rb b/spec/serializers/diffs_metadata_entity_spec.rb
index 3311b434ce5..0e3d808aaac 100644
--- a/spec/serializers/diffs_metadata_entity_spec.rb
+++ b/spec/serializers/diffs_metadata_entity_spec.rb
@@ -65,6 +65,7 @@ RSpec.describe DiffsMetadataEntity do
let(:conflicts) { double(conflicts: double(files: [conflict_file]), can_be_resolved_in_ui?: false) }
before do
+ allow(merge_request).to receive(:cannot_be_merged?).and_return(true)
allow(MergeRequests::Conflicts::ListService).to receive(:new).and_return(conflicts)
end
diff --git a/spec/serializers/environment_entity_spec.rb b/spec/serializers/environment_entity_spec.rb
index 9b6a293da16..cbe32600941 100644
--- a/spec/serializers/environment_entity_spec.rb
+++ b/spec/serializers/environment_entity_spec.rb
@@ -133,54 +133,6 @@ RSpec.describe EnvironmentEntity do
end
end
- context 'pod_logs' do
- context 'with reporter access' do
- before do
- project.add_reporter(user)
- end
-
- it 'does not expose logs keys' do
- expect(subject).not_to include(:logs_path)
- expect(subject).not_to include(:logs_api_path)
- expect(subject).not_to include(:enable_advanced_logs_querying)
- end
- end
-
- context 'with developer access' do
- before do
- project.add_developer(user)
- end
-
- it 'exposes logs keys' do
- expect(subject).to include(:logs_path)
- expect(subject).to include(:logs_api_path)
- expect(subject).to include(:enable_advanced_logs_querying)
- end
-
- it 'uses k8s api when ES is not available' do
- expect(subject[:logs_api_path]).to eq(k8s_project_logs_path(project, environment_name: environment.name, format: :json))
- end
-
- it 'uses ES api when ES is available' do
- allow(environment).to receive(:elastic_stack_available?).and_return(true)
-
- expect(subject[:logs_api_path]).to eq(elasticsearch_project_logs_path(project, environment_name: environment.name, format: :json))
- end
-
- context 'with feature flag disabled' do
- before do
- stub_feature_flags(monitor_logging: false)
- end
-
- it 'does not expose logs keys' do
- expect(subject).not_to include(:logs_path)
- expect(subject).not_to include(:logs_api_path)
- expect(subject).not_to include(:enable_advanced_logs_querying)
- end
- end
- end
- end
-
context 'with deployment service ready' do
before do
allow(environment).to receive(:has_terminals?).and_return(true)
diff --git a/spec/serializers/integrations/field_entity_spec.rb b/spec/serializers/integrations/field_entity_spec.rb
index e75dc051f5e..7af17cf6df6 100644
--- a/spec/serializers/integrations/field_entity_spec.rb
+++ b/spec/serializers/integrations/field_entity_spec.rb
@@ -114,6 +114,6 @@ RSpec.describe Integrations::FieldEntity do
end
def integration_field(name)
- integration.global_fields.find { |f| f[:name] == name }
+ integration.form_fields.find { |f| f[:name] == name }
end
end
diff --git a/spec/serializers/integrations/harbor_serializers/artifact_entity_spec.rb b/spec/serializers/integrations/harbor_serializers/artifact_entity_spec.rb
new file mode 100644
index 00000000000..c9a95c02e19
--- /dev/null
+++ b/spec/serializers/integrations/harbor_serializers/artifact_entity_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::HarborSerializers::ArtifactEntity do
+ let_it_be(:harbor_integration) { create(:harbor_integration) }
+
+ let(:artifact) do
+ {
+ "digest": "sha256:14d4f50961544fdb669075c442509f194bdc4c0e344bde06e35dbd55af842a38",
+ "id": 5,
+ "project_id": 14,
+ "push_time": "2022-03-22T09:04:56.170Z",
+ "repository_id": 5,
+ "size": 774790,
+ "tags": [
+ {
+ "artifact_id": 5,
+ "id": 7,
+ "immutable": false,
+ "name": "2",
+ "push_time": "2022-03-22T09:05:04.844Z",
+ "repository_id": 5,
+ "signed": false
+ },
+ {
+ "artifact_id": 5,
+ "id": 6,
+ "immutable": false,
+ "name": "1",
+ "push_time": "2022-03-22T09:04:56.186Z",
+ "repository_id": 5,
+ "signed": false
+ }
+ ],
+ "type": "IMAGE"
+ }.deep_stringify_keys
+ end
+
+ subject { described_class.new(artifact).as_json }
+
+ it 'returns the Harbor artifact' do
+ expect(subject).to include({
+ harbor_id: 5,
+ size: 774790,
+ push_time: "2022-03-22T09:04:56.170Z".to_datetime,
+ digest: "sha256:14d4f50961544fdb669075c442509f194bdc4c0e344bde06e35dbd55af842a38",
+ tags: %w[2 1]
+ })
+ end
+end
diff --git a/spec/serializers/integrations/harbor_serializers/artifact_serializer_spec.rb b/spec/serializers/integrations/harbor_serializers/artifact_serializer_spec.rb
new file mode 100644
index 00000000000..9879c0a6434
--- /dev/null
+++ b/spec/serializers/integrations/harbor_serializers/artifact_serializer_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::HarborSerializers::ArtifactSerializer do
+ it 'represents Integrations::HarborSerializers::ArtifactEntity entities' do
+ expect(described_class.entity_class).to eq(Integrations::HarborSerializers::ArtifactEntity)
+ end
+end
diff --git a/spec/serializers/integrations/harbor_serializers/repository_entity_spec.rb b/spec/serializers/integrations/harbor_serializers/repository_entity_spec.rb
new file mode 100644
index 00000000000..29708bd0416
--- /dev/null
+++ b/spec/serializers/integrations/harbor_serializers/repository_entity_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::HarborSerializers::RepositoryEntity do
+ let_it_be(:harbor_integration) { create(:harbor_integration) }
+
+ let(:repo) do
+ {
+ "artifact_count" => 1,
+ "creation_time" => "2022-03-13T09:36:43.240Z",
+ "id" => 1,
+ "name" => "jihuprivate/busybox",
+ "project_id" => 4,
+ "pull_count" => 0,
+ "update_time" => "2022-03-13T09:36:43.240Z"
+ }.deep_stringify_keys
+ end
+
+ subject { described_class.new(repo, url: "https://demo.goharbor.io", project_name: "jihuprivate").as_json }
+
+ context 'with normal repository data' do
+ it 'returns the Harbor repository' do
+ expect(subject).to include({
+ artifact_count: 1,
+ creation_time: "2022-03-13T09:36:43.240Z".to_datetime,
+ harbor_id: 1,
+ name: "jihuprivate/busybox",
+ harbor_project_id: 4,
+ pull_count: 0,
+ update_time: "2022-03-13T09:36:43.240Z".to_datetime,
+ location: "https://demo.goharbor.io/harbor/projects/4/repositories/busybox"
+ })
+ end
+ end
+
+ context 'with data that may contain path traversal attacks' do
+ before do
+ repo["project_id"] = './../../../../../etc/hosts'
+ end
+
+ it 'returns empty location' do
+ expect(subject).to include({
+ artifact_count: 1,
+ creation_time: "2022-03-13T09:36:43.240Z".to_datetime,
+ harbor_id: 1,
+ name: "jihuprivate/busybox",
+ harbor_project_id: './../../../../../etc/hosts',
+ pull_count: 0,
+ update_time: "2022-03-13T09:36:43.240Z".to_datetime,
+ location: "https://demo.goharbor.io/"
+ })
+ end
+ end
+end
diff --git a/spec/serializers/integrations/harbor_serializers/repository_serializer_spec.rb b/spec/serializers/integrations/harbor_serializers/repository_serializer_spec.rb
new file mode 100644
index 00000000000..1a4235bea1e
--- /dev/null
+++ b/spec/serializers/integrations/harbor_serializers/repository_serializer_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::HarborSerializers::RepositorySerializer do
+ it 'represents Integrations::HarborSerializers::RepositoryEntity entities' do
+ expect(described_class.entity_class).to eq(Integrations::HarborSerializers::RepositoryEntity)
+ end
+end
diff --git a/spec/serializers/integrations/harbor_serializers/tag_entity_spec.rb b/spec/serializers/integrations/harbor_serializers/tag_entity_spec.rb
new file mode 100644
index 00000000000..f4bc5f71d5b
--- /dev/null
+++ b/spec/serializers/integrations/harbor_serializers/tag_entity_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::HarborSerializers::TagEntity do
+ let_it_be(:harbor_integration) { create(:harbor_integration) }
+
+ let(:push_time) { "2022-03-22T09:04:56.186Z" }
+ let(:pull_time) { "2022-03-23T09:04:56.186Z" }
+
+ let(:tag) do
+ {
+ "artifact_id": 5,
+ "id": 6,
+ "immutable": false,
+ "name": "1",
+ "push_time": push_time,
+ "pull_time": pull_time,
+ "repository_id": 5,
+ "signed": false
+ }.deep_stringify_keys
+ end
+
+ subject { described_class.new(tag).as_json }
+
+ it 'returns the Harbor artifact' do
+ expect(subject).to include({
+ harbor_repository_id: 5,
+ harbor_artifact_id: 5,
+ harbor_id: 6,
+ name: "1",
+ pull_time: pull_time.to_datetime.utc,
+ push_time: push_time.to_datetime.utc,
+ signed: false,
+ immutable: false
+ })
+ end
+end
diff --git a/spec/serializers/integrations/harbor_serializers/tag_serializer_spec.rb b/spec/serializers/integrations/harbor_serializers/tag_serializer_spec.rb
new file mode 100644
index 00000000000..45fee0b9b17
--- /dev/null
+++ b/spec/serializers/integrations/harbor_serializers/tag_serializer_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::HarborSerializers::TagSerializer do
+ it 'represents Integrations::HarborSerializers::TagEntity entities' do
+ expect(described_class.entity_class).to eq(Integrations::HarborSerializers::TagEntity)
+ end
+end
diff --git a/spec/serializers/issue_entity_spec.rb b/spec/serializers/issue_entity_spec.rb
index 9525ed02314..6b9c703c627 100644
--- a/spec/serializers/issue_entity_spec.rb
+++ b/spec/serializers/issue_entity_spec.rb
@@ -139,7 +139,7 @@ RSpec.describe IssueEntity do
end
it 'returns archived project doc' do
- expect(subject[:archived_project_docs_path]).to eq('/help/user/project/settings/index.md#archiving-a-project')
+ expect(subject[:archived_project_docs_path]).to eq('/help/user/project/settings/index.md#archive-a-project')
end
end
end
diff --git a/spec/serializers/member_user_entity_spec.rb b/spec/serializers/member_user_entity_spec.rb
index 85f29845d65..4dd6848c47b 100644
--- a/spec/serializers/member_user_entity_spec.rb
+++ b/spec/serializers/member_user_entity_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe MemberUserEntity do
shared_examples 'correctly exposes user two_factor_enabled' do
context 'when the current_user has a role lower than minimum manage member role' do
before do
- source.add_user(current_user, Gitlab::Access::DEVELOPER)
+ source.add_member(current_user, Gitlab::Access::DEVELOPER)
end
it 'does not expose user two_factor_enabled' do
@@ -65,7 +65,7 @@ RSpec.describe MemberUserEntity do
context 'when the current user has a minimum manage member role or higher' do
before do
- source.add_user(current_user, minimum_manage_member_role)
+ source.add_member(current_user, minimum_manage_member_role)
end
it 'matches json schema' do
diff --git a/spec/serializers/paginated_diff_entity_spec.rb b/spec/serializers/paginated_diff_entity_spec.rb
index db8bf92cbf5..9d4456c11d6 100644
--- a/spec/serializers/paginated_diff_entity_spec.rb
+++ b/spec/serializers/paginated_diff_entity_spec.rb
@@ -43,6 +43,7 @@ RSpec.describe PaginatedDiffEntity do
let(:options) { super().merge(merge_ref_head_diff: merge_ref_head_diff) }
before do
+ allow(merge_request).to receive(:cannot_be_merged?).and_return(true)
allow(MergeRequests::Conflicts::ListService).to receive(:new).and_return(conflicts)
end
diff --git a/spec/serializers/stage_entity_spec.rb b/spec/serializers/stage_entity_spec.rb
index b977d5d33aa..95d3fd254d4 100644
--- a/spec/serializers/stage_entity_spec.rb
+++ b/spec/serializers/stage_entity_spec.rb
@@ -12,12 +12,12 @@ RSpec.describe StageEntity do
end
let(:stage) do
- build(:ci_stage, pipeline: pipeline, name: 'test')
+ create(:ci_stage, pipeline: pipeline, status: :success)
end
before do
allow(request).to receive(:current_user).and_return(user)
- create(:ci_build, :success, pipeline: pipeline)
+ create(:ci_build, :success, pipeline: pipeline, stage_id: stage.id)
end
describe '#as_json' do
@@ -74,7 +74,7 @@ RSpec.describe StageEntity do
end
context 'with a skipped stage ' do
- let(:stage) { create(:ci_stage_entity, status: 'skipped') }
+ let(:stage) { create(:ci_stage, status: 'skipped') }
it 'contains play_all_manual' do
expect(subject[:status][:action]).to be_present
@@ -82,7 +82,7 @@ RSpec.describe StageEntity do
end
context 'with a scheduled stage ' do
- let(:stage) { create(:ci_stage_entity, status: 'scheduled') }
+ let(:stage) { create(:ci_stage, status: 'scheduled') }
it 'contains play_all_manual' do
expect(subject[:status][:action]).to be_present
@@ -90,7 +90,7 @@ RSpec.describe StageEntity do
end
context 'with a manual stage ' do
- let(:stage) { create(:ci_stage_entity, status: 'manual') }
+ let(:stage) { create(:ci_stage, status: 'manual') }
it 'contains play_all_manual' do
expect(subject[:status][:action]).to be_present
diff --git a/spec/serializers/stage_serializer_spec.rb b/spec/serializers/stage_serializer_spec.rb
index 0b5e87dc95b..24e8057375b 100644
--- a/spec/serializers/stage_serializer_spec.rb
+++ b/spec/serializers/stage_serializer_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe StageSerializer do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
- let(:resource) { create(:ci_stage_entity) }
+ let(:resource) { create(:ci_stage) }
let(:serializer) do
described_class.new(current_user: user, project: project)
@@ -21,7 +21,7 @@ RSpec.describe StageSerializer do
end
context 'with an array of entities' do
- let(:resource) { create_list(:ci_stage_entity, 2) }
+ let(:resource) { create_list(:ci_stage, 2) }
it 'serializes the array of pipelines' do
expect(subject).not_to be_empty
diff --git a/spec/serializers/test_reports_comparer_entity_spec.rb b/spec/serializers/test_reports_comparer_entity_spec.rb
index 3f88438ccde..78aa64edae0 100644
--- a/spec/serializers/test_reports_comparer_entity_spec.rb
+++ b/spec/serializers/test_reports_comparer_entity_spec.rb
@@ -7,8 +7,8 @@ RSpec.describe TestReportsComparerEntity do
let(:entity) { described_class.new(comparer) }
let(:comparer) { Gitlab::Ci::Reports::TestReportsComparer.new(base_reports, head_reports) }
- let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
- let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReport.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReport.new }
describe '#as_json' do
subject { entity.as_json }
diff --git a/spec/serializers/test_reports_comparer_serializer_spec.rb b/spec/serializers/test_reports_comparer_serializer_spec.rb
index f9c37f49039..d19d9681e07 100644
--- a/spec/serializers/test_reports_comparer_serializer_spec.rb
+++ b/spec/serializers/test_reports_comparer_serializer_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe TestReportsComparerSerializer do
let(:project) { double(:project) }
let(:serializer) { described_class.new(project: project).represent(comparer) }
let(:comparer) { Gitlab::Ci::Reports::TestReportsComparer.new(base_reports, head_reports) }
- let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
- let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReport.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReport.new }
describe '#to_json' do
subject { serializer.to_json }
diff --git a/spec/services/alert_management/alerts/update_service_spec.rb b/spec/services/alert_management/alerts/update_service_spec.rb
index 9bdc9970807..8375c8cdf7d 100644
--- a/spec/services/alert_management/alerts/update_service_spec.rb
+++ b/spec/services/alert_management/alerts/update_service_spec.rb
@@ -249,57 +249,6 @@ RSpec.describe AlertManagement::Alerts::UpdateService do
it_behaves_like 'adds a system note'
end
-
- context 'with an associated issue' do
- let_it_be(:issue, reload: true) { create(:issue, project: project) }
-
- before do
- alert.update!(issue: issue)
- end
-
- shared_examples 'does not sync with the incident status' do
- specify do
- expect(::Issues::UpdateService).not_to receive(:new)
- expect { response }.to change { alert.acknowledged? }.to(true)
- end
- end
-
- it_behaves_like 'does not sync with the incident status'
-
- context 'when the issue is an incident' do
- before do
- issue.update!(issue_type: Issue.issue_types[:incident])
- end
-
- it_behaves_like 'does not sync with the incident status'
-
- context 'when the incident has an escalation status' do
- let_it_be(:escalation_status, reload: true) { create(:incident_management_issuable_escalation_status, issue: issue) }
-
- it 'updates the incident escalation status with the new alert status' do
- expect(::Issues::UpdateService).to receive(:new).once.and_call_original
- expect(described_class).to receive(:new).once.and_call_original
-
- expect { response }.to change { escalation_status.reload.acknowledged? }.to(true)
- .and change { alert.reload.acknowledged? }.to(true)
- end
-
- context 'when the statuses match' do
- before do
- escalation_status.update!(status_event: :acknowledge)
- end
-
- it_behaves_like 'does not sync with the incident status'
- end
- end
- end
- end
-
- context 'when a status change reason is included' do
- let(:params) { { status: new_status, status_change_reason: ' by changing the incident status' } }
-
- it_behaves_like 'adds a system note', /changed the status to \*\*Acknowledged\*\* by changing the incident status/
- end
end
end
end
diff --git a/spec/services/ci/abort_pipelines_service_spec.rb b/spec/services/ci/abort_pipelines_service_spec.rb
index 9f9519d6829..e43faf0af51 100644
--- a/spec/services/ci/abort_pipelines_service_spec.rb
+++ b/spec/services/ci/abort_pipelines_service_spec.rb
@@ -12,13 +12,13 @@ RSpec.describe Ci::AbortPipelinesService do
let_it_be(:cancelable_build, reload: true) { create(:ci_build, :running, pipeline: cancelable_pipeline) }
let_it_be(:non_cancelable_build, reload: true) { create(:ci_build, :success, pipeline: cancelable_pipeline) }
- let_it_be(:cancelable_stage, reload: true) { create(:ci_stage_entity, name: 'stageA', status: :running, pipeline: cancelable_pipeline, project: project) }
- let_it_be(:non_cancelable_stage, reload: true) { create(:ci_stage_entity, name: 'stageB', status: :success, pipeline: cancelable_pipeline, project: project) }
+ let_it_be(:cancelable_stage, reload: true) { create(:ci_stage, name: 'stageA', status: :running, pipeline: cancelable_pipeline, project: project) }
+ let_it_be(:non_cancelable_stage, reload: true) { create(:ci_stage, name: 'stageB', status: :success, pipeline: cancelable_pipeline, project: project) }
let_it_be(:manual_pipeline_cancelable_build, reload: true) { create(:ci_build, :created, pipeline: manual_pipeline) }
let_it_be(:manual_pipeline_non_cancelable_build, reload: true) { create(:ci_build, :manual, pipeline: manual_pipeline) }
- let_it_be(:manual_pipeline_cancelable_stage, reload: true) { create(:ci_stage_entity, name: 'stageA', status: :created, pipeline: manual_pipeline, project: project) }
- let_it_be(:manual_pipeline_non_cancelable_stage, reload: true) { create(:ci_stage_entity, name: 'stageB', status: :success, pipeline: manual_pipeline, project: project) }
+ let_it_be(:manual_pipeline_cancelable_stage, reload: true) { create(:ci_stage, name: 'stageA', status: :created, pipeline: manual_pipeline, project: project) }
+ let_it_be(:manual_pipeline_non_cancelable_stage, reload: true) { create(:ci_stage, name: 'stageB', status: :success, pipeline: manual_pipeline, project: project) }
describe '#execute' do
def expect_correct_pipeline_cancellations
diff --git a/spec/services/ci/create_pipeline_service/include_spec.rb b/spec/services/ci/create_pipeline_service/include_spec.rb
index 3116801d50c..849eb5885f6 100644
--- a/spec/services/ci/create_pipeline_service/include_spec.rb
+++ b/spec/services/ci/create_pipeline_service/include_spec.rb
@@ -126,5 +126,51 @@ RSpec.describe Ci::CreatePipelineService do
it_behaves_like 'not including the file'
end
end
+
+ context 'with ci_increase_includes_to_250 enabled on root project' do
+ let_it_be(:included_project) do
+ create(:project, :repository).tap { |p| p.add_developer(user) }
+ end
+
+ before do
+ stub_const('::Gitlab::Ci::Config::External::Context::MAX_INCLUDES', 0)
+ stub_const('::Gitlab::Ci::Config::External::Context::TRIAL_MAX_INCLUDES', 3)
+
+ stub_feature_flags(ci_increase_includes_to_250: false)
+ stub_feature_flags(ci_increase_includes_to_250: project)
+
+ allow(Project)
+ .to receive(:find_by_full_path)
+ .with(included_project.full_path)
+ .and_return(included_project)
+
+ allow(included_project.repository)
+ .to receive(:blob_data_at).with(included_project.commit.id, '.gitlab-ci.yml')
+ .and_return(local_config)
+
+ allow(included_project.repository)
+ .to receive(:blob_data_at).with(included_project.commit.id, file_location)
+ .and_return(File.read(Rails.root.join(file_location)))
+ end
+
+ let(:config) do
+ <<~EOY
+ include:
+ - project: #{included_project.full_path}
+ file: .gitlab-ci.yml
+ EOY
+ end
+
+ let(:local_config) do
+ <<~EOY
+ include: #{file_location}
+
+ job:
+ script: exit 0
+ EOY
+ end
+
+ it_behaves_like 'including the file'
+ end
end
end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index aac059f2104..9cef7f7dadb 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -2087,6 +2087,12 @@ RSpec.describe Ci::CreatePipelineService do
rules:
- changes:
- $CI_JOB_NAME*
+
+ changes-paths:
+ script: "I am using a new syntax!"
+ rules:
+ - changes:
+ paths: [README.md]
EOY
end
@@ -2098,8 +2104,9 @@ RSpec.describe Ci::CreatePipelineService do
it 'creates five jobs' do
expect(pipeline).to be_persisted
- expect(build_names)
- .to contain_exactly('regular-job', 'rules-job', 'delayed-job', 'negligible-job', 'README')
+ expect(build_names).to contain_exactly(
+ 'regular-job', 'rules-job', 'delayed-job', 'negligible-job', 'README', 'changes-paths'
+ )
end
it 'sets when: for all jobs' do
diff --git a/spec/services/ci/ensure_stage_service_spec.rb b/spec/services/ci/ensure_stage_service_spec.rb
index 3ede214cdd4..026814edda6 100644
--- a/spec/services/ci/ensure_stage_service_spec.rb
+++ b/spec/services/ci/ensure_stage_service_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Ci::EnsureStageService, '#execute' do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
- let(:stage) { create(:ci_stage_entity) }
+ let(:stage) { create(:ci_stage) }
let(:job) { build(:ci_build) }
let(:service) { described_class.new(project, user) }
diff --git a/spec/services/ci/generate_coverage_reports_service_spec.rb b/spec/services/ci/generate_coverage_reports_service_spec.rb
index d12a9268e7e..212e6be9d07 100644
--- a/spec/services/ci/generate_coverage_reports_service_spec.rb
+++ b/spec/services/ci/generate_coverage_reports_service_spec.rb
@@ -3,8 +3,9 @@
require 'spec_helper'
RSpec.describe Ci::GenerateCoverageReportsService do
+ let_it_be(:project) { create(:project, :repository) }
+
let(:service) { described_class.new(project) }
- let(:project) { create(:project, :repository) }
describe '#execute' do
subject { service.execute(base_pipeline, head_pipeline) }
@@ -52,4 +53,41 @@ RSpec.describe Ci::GenerateCoverageReportsService do
end
end
end
+
+ describe '#latest?' do
+ subject { service.latest?(base_pipeline, head_pipeline, data) }
+
+ let!(:base_pipeline) { nil }
+ let!(:head_pipeline) { create(:ci_pipeline, :with_coverage_reports, project: project) }
+ let!(:child_pipeline) { create(:ci_pipeline, child_of: head_pipeline) }
+ let!(:key) { service.send(:key, base_pipeline, head_pipeline) }
+
+ let(:data) { { key: key } }
+
+ context 'when cache key is latest' do
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when head pipeline has been updated' do
+ before do
+ head_pipeline.update_column(:updated_at, 1.minute.from_now)
+ end
+
+ it { is_expected.to be_falsy }
+ end
+
+ context 'when cache key is empty' do
+ let(:data) { { key: nil } }
+
+ it { is_expected.to be_falsy }
+ end
+
+ context 'when the pipeline has a child that is updated' do
+ before do
+ child_pipeline.update_column(:updated_at, 1.minute.from_now)
+ end
+
+ it { is_expected.to be_falsy }
+ end
+ end
end
diff --git a/spec/services/ci/job_artifacts/create_service_spec.rb b/spec/services/ci/job_artifacts/create_service_spec.rb
index 01f240805f5..b7a810ce47e 100644
--- a/spec/services/ci/job_artifacts/create_service_spec.rb
+++ b/spec/services/ci/job_artifacts/create_service_spec.rb
@@ -30,14 +30,6 @@ RSpec.describe Ci::JobArtifacts::CreateService do
UploadedFile.new(upload.path, **params)
end
- def unique_metrics_report_uploaders
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(
- event_names: described_class::METRICS_REPORT_UPLOAD_EVENT_NAME,
- start_date: 2.weeks.ago,
- end_date: 2.weeks.from_now
- )
- end
-
describe '#execute' do
subject { service.execute(artifacts_file, params, metadata_file: metadata_file) }
@@ -61,12 +53,6 @@ RSpec.describe Ci::JobArtifacts::CreateService do
expect(new_artifact.locked).to eq(job.pipeline.locked)
end
- it 'does not track the job user_id' do
- subject
-
- expect(unique_metrics_report_uploaders).to eq(0)
- end
-
context 'when metadata file is also uploaded' do
let(:metadata_file) do
file_to_upload('spec/fixtures/ci_build_artifacts_metadata.gz', sha256: artifacts_sha256)
@@ -188,20 +174,6 @@ RSpec.describe Ci::JobArtifacts::CreateService do
end
end
- context 'when artifact_type is metrics' do
- before do
- allow(job).to receive(:user_id).and_return(123)
- end
-
- let(:params) { { 'artifact_type' => 'metrics', 'artifact_format' => 'gzip' }.with_indifferent_access }
-
- it 'tracks the job user_id' do
- subject
-
- expect(unique_metrics_report_uploaders).to eq(1)
- end
- end
-
shared_examples 'rescues object storage error' do |klass, message, expected_message|
it "handles #{klass}" do
allow_next_instance_of(JobArtifactUploader) do |uploader|
diff --git a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
index 3a04a3af03e..05069054483 100644
--- a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
@@ -181,6 +181,26 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do
end
end
+ context 'when artifact belongs to a project not undergoing refresh' do
+ context 'and skip_projects_on_refresh is set to false (default)' do
+ it 'does not log any warnings', :aggregate_failures do
+ expect(Gitlab::ProjectStatsRefreshConflictsLogger).not_to receive(:warn_artifact_deletion_during_stats_refresh)
+
+ expect { subject }.to change { Ci::JobArtifact.count }.by(-2)
+ end
+ end
+
+ context 'and skip_projects_on_refresh is set to true' do
+ let(:skip_projects_on_refresh) { true }
+
+ it 'does not log any warnings', :aggregate_failures do
+ expect(Gitlab::ProjectStatsRefreshConflictsLogger).not_to receive(:warn_skipped_artifact_deletion_during_stats_refresh)
+
+ expect { subject }.to change { Ci::JobArtifact.count }.by(-2)
+ end
+ end
+ end
+
context 'ProjectStatistics' do
it 'resets project statistics' do
expect(ProjectStatistics).to receive(:increment_statistic).once
diff --git a/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb b/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
index 403afde5da3..31548793bac 100644
--- a/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
+++ b/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
@@ -2,16 +2,18 @@
require 'spec_helper'
-RSpec.describe ::Ci::PipelineArtifacts::CoverageReportService do
+RSpec.describe Ci::PipelineArtifacts::CoverageReportService do
describe '#execute' do
let_it_be(:project) { create(:project, :repository) }
subject { described_class.new(pipeline).execute }
- shared_examples 'creating a pipeline coverage report' do
+ shared_examples 'creating or updating a pipeline coverage report' do
context 'when pipeline is finished' do
- it 'creates a pipeline artifact' do
- expect { subject }.to change { Ci::PipelineArtifact.count }.from(0).to(1)
+ it 'creates or updates a pipeline artifact' do
+ subject
+
+ expect(pipeline.reload.pipeline_artifacts.count).to eq(1)
end
it 'persists the default file name' do
@@ -22,7 +24,7 @@ RSpec.describe ::Ci::PipelineArtifacts::CoverageReportService do
expect(file.filename).to eq('code_coverage.json')
end
- it 'sets expire_at to 1 week' do
+ it 'sets expire_at to 1 week from now' do
freeze_time do
subject
@@ -31,13 +33,16 @@ RSpec.describe ::Ci::PipelineArtifacts::CoverageReportService do
expect(pipeline_artifact.expire_at).to eq(1.week.from_now)
end
end
- end
- context 'when pipeline artifact has already been created' do
- it 'does not raise an error and does not persist the same artifact twice' do
- expect { 2.times { described_class.new(pipeline).execute } }.not_to raise_error
+ it 'logs relevant information' do
+ expect(Gitlab::AppLogger).to receive(:info).with({
+ project_id: project.id,
+ pipeline_id: pipeline.id,
+ pipeline_artifact_id: kind_of(Numeric),
+ message: kind_of(String)
+ })
- expect(Ci::PipelineArtifact.count).to eq(1)
+ subject
end
end
end
@@ -45,21 +50,32 @@ RSpec.describe ::Ci::PipelineArtifacts::CoverageReportService do
context 'when pipeline has coverage report' do
let!(:pipeline) { create(:ci_pipeline, :with_coverage_reports, project: project) }
- it_behaves_like 'creating a pipeline coverage report'
+ it_behaves_like 'creating or updating a pipeline coverage report'
end
context 'when pipeline has coverage report from child pipeline' do
let!(:pipeline) { create(:ci_pipeline, :success, project: project) }
let!(:child_pipeline) { create(:ci_pipeline, :with_coverage_reports, project: project, child_of: pipeline) }
- it_behaves_like 'creating a pipeline coverage report'
+ it_behaves_like 'creating or updating a pipeline coverage report'
+ end
+
+ context 'when pipeline has existing pipeline artifact for coverage report' do
+ let!(:pipeline) { create(:ci_pipeline, :with_coverage_reports, project: project) }
+ let!(:child_pipeline) { create(:ci_pipeline, :with_coverage_reports, project: project, child_of: pipeline) }
+
+ let!(:pipeline_artifact) do
+ create(:ci_pipeline_artifact, :with_coverage_report, pipeline: pipeline, expire_at: 1.day.from_now)
+ end
+
+ it_behaves_like 'creating or updating a pipeline coverage report'
end
context 'when pipeline is running and coverage report does not exist' do
let(:pipeline) { create(:ci_pipeline, :running) }
it 'does not persist data' do
- expect { subject }.not_to change { Ci::PipelineArtifact.count }
+ expect { subject }.not_to change { Ci::PipelineArtifact.count }.from(0)
end
end
end
diff --git a/spec/services/ci/play_manual_stage_service_spec.rb b/spec/services/ci/play_manual_stage_service_spec.rb
index 3e2a95ee975..b3ae92aa787 100644
--- a/spec/services/ci/play_manual_stage_service_spec.rb
+++ b/spec/services/ci/play_manual_stage_service_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Ci::PlayManualStageService, '#execute' do
let(:stage_status) { 'manual' }
let(:stage) do
- create(:ci_stage_entity,
+ create(:ci_stage,
pipeline: pipeline,
project: project,
name: 'test')
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index 74adbc4efc8..2316575f164 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -750,41 +750,7 @@ module Ci
end
context 'when using pending builds table' do
- before do
- stub_feature_flags(ci_pending_builds_queue_source: true)
- end
-
- context 'with ci_queuing_use_denormalized_data_strategy enabled' do
- before do
- stub_feature_flags(ci_queuing_use_denormalized_data_strategy: true)
- end
-
- include_examples 'handles runner assignment'
- end
-
- context 'with ci_queuing_use_denormalized_data_strategy disabled' do
- before do
- skip_if_multiple_databases_are_setup
-
- stub_feature_flags(ci_queuing_use_denormalized_data_strategy: false)
- end
-
- around do |example|
- allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
- example.run
- end
- end
-
- include_examples 'handles runner assignment'
- end
-
- context 'with ci_queuing_use_denormalized_data_strategy enabled' do
- before do
- stub_feature_flags(ci_queuing_use_denormalized_data_strategy: true)
- end
-
- include_examples 'handles runner assignment'
- end
+ include_examples 'handles runner assignment'
context 'when a conflicting data is stored in denormalized table' do
let!(:specific_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[conflict]) }
@@ -805,22 +771,6 @@ module Ci
end
end
end
-
- context 'when not using pending builds table' do
- before do
- skip_if_multiple_databases_are_setup
-
- stub_feature_flags(ci_pending_builds_queue_source: false)
- end
-
- around do |example|
- allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
- example.run
- end
- end
-
- include_examples 'handles runner assignment'
- end
end
describe '#register_success' do
@@ -888,14 +838,6 @@ module Ci
shared_examples 'metrics collector' do
it_behaves_like 'attempt counter collector'
it_behaves_like 'jobs queueing time histogram collector'
-
- context 'when using denormalized data is disabled' do
- before do
- stub_feature_flags(ci_pending_builds_maintain_denormalized_data: false)
- end
-
- it_behaves_like 'jobs queueing time histogram collector'
- end
end
context 'when shared runner is used' do
diff --git a/spec/services/ci/retry_job_service_spec.rb b/spec/services/ci/retry_job_service_spec.rb
index acc7a99637b..f042471bd1f 100644
--- a/spec/services/ci/retry_job_service_spec.rb
+++ b/spec/services/ci/retry_job_service_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Ci::RetryJobService do
end
let_it_be(:stage) do
- create(:ci_stage_entity, project: project,
+ create(:ci_stage, project: project,
pipeline: pipeline,
name: 'test')
end
@@ -154,7 +154,7 @@ RSpec.describe Ci::RetryJobService do
end
context 'when the pipeline has other jobs' do
- let!(:stage2) { create(:ci_stage_entity, project: project, pipeline: pipeline, name: 'deploy') }
+ let!(:stage2) { create(:ci_stage, project: project, pipeline: pipeline, name: 'deploy') }
let!(:build2) { create(:ci_build, pipeline: pipeline, stage_id: stage.id ) }
let!(:deploy) { create(:ci_build, pipeline: pipeline, stage_id: stage2.id) }
let!(:deploy_needs_build2) { create(:ci_build_need, build: deploy, name: build2.name) }
diff --git a/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb b/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb
new file mode 100644
index 00000000000..f8313eaab90
--- /dev/null
+++ b/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb
@@ -0,0 +1,149 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Ci::Runners::ReconcileExistingRunnerVersionsService, '#execute' do
+ subject(:execute) { described_class.new.execute }
+
+ let_it_be(:runner_14_0_1) { create(:ci_runner, version: '14.0.1') }
+ let_it_be(:runner_version_14_0_1) do
+ create(:ci_runner_version, version: '14.0.1', status: :not_available)
+ end
+
+ context 'with RunnerUpgradeCheck recommending 14.0.2' do
+ before do
+ stub_const('Ci::Runners::ReconcileExistingRunnerVersionsService::VERSION_BATCH_SIZE', 1)
+
+ allow(::Gitlab::Ci::RunnerUpgradeCheck.instance)
+ .to receive(:check_runner_upgrade_status)
+ .and_return({ recommended: ::Gitlab::VersionInfo.new(14, 0, 2) })
+ end
+
+ context 'with runner with new version' do
+ let!(:runner_14_0_2) { create(:ci_runner, version: '14.0.2') }
+ let!(:runner_version_14_0_0) { create(:ci_runner_version, version: '14.0.0', status: :not_available) }
+ let!(:runner_14_0_0) { create(:ci_runner, version: '14.0.0') }
+
+ before do
+ allow(::Gitlab::Ci::RunnerUpgradeCheck.instance)
+ .to receive(:check_runner_upgrade_status)
+ .with('14.0.2')
+ .and_return({ not_available: ::Gitlab::VersionInfo.new(14, 0, 2) })
+ .once
+ end
+
+ it 'creates and updates expected ci_runner_versions entries', :aggregate_failures do
+ expect(Ci::RunnerVersion).to receive(:insert_all)
+ .ordered
+ .with([{ version: '14.0.2' }], anything)
+ .once
+ .and_call_original
+
+ result = nil
+ expect { result = execute }
+ .to change { runner_version_14_0_0.reload.status }.from('not_available').to('recommended')
+ .and change { runner_version_14_0_1.reload.status }.from('not_available').to('recommended')
+ .and change { ::Ci::RunnerVersion.find_by(version: '14.0.2')&.status }.from(nil).to('not_available')
+
+ expect(result).to eq({
+ status: :success,
+ total_inserted: 1, # 14.0.2 is inserted
+ total_updated: 3, # 14.0.0, 14.0.1 are updated, and newly inserted 14.0.2's status is calculated
+ total_deleted: 0
+ })
+ end
+ end
+
+ context 'with orphan ci_runner_version' do
+ let!(:runner_version_14_0_2) { create(:ci_runner_version, version: '14.0.2', status: :not_available) }
+
+ before do
+ allow(::Gitlab::Ci::RunnerUpgradeCheck.instance)
+ .to receive(:check_runner_upgrade_status)
+ .and_return({ not_available: ::Gitlab::VersionInfo.new(14, 0, 2) })
+ end
+
+ it 'deletes orphan ci_runner_versions entry', :aggregate_failures do
+ result = nil
+ expect { result = execute }
+ .to change { ::Ci::RunnerVersion.find_by_version('14.0.2')&.status }.from('not_available').to(nil)
+ .and not_change { runner_version_14_0_1.reload.status }.from('not_available')
+
+ expect(result).to eq({
+ status: :success,
+ total_inserted: 0,
+ total_updated: 0,
+ total_deleted: 1 # 14.0.2 is deleted
+ })
+ end
+ end
+
+ context 'with no runner version changes' do
+ before do
+ allow(::Gitlab::Ci::RunnerUpgradeCheck.instance)
+ .to receive(:check_runner_upgrade_status)
+ .and_return({ not_available: ::Gitlab::VersionInfo.new(14, 0, 1) })
+ end
+
+ it 'does not modify ci_runner_versions entries', :aggregate_failures do
+ result = nil
+ expect { result = execute }.not_to change { runner_version_14_0_1.reload.status }.from('not_available')
+
+ expect(result).to eq({
+ status: :success,
+ total_inserted: 0,
+ total_updated: 0,
+ total_deleted: 0
+ })
+ end
+ end
+
+ context 'with failing version check' do
+ before do
+ allow(::Gitlab::Ci::RunnerUpgradeCheck.instance)
+ .to receive(:check_runner_upgrade_status)
+ .and_return({ error: ::Gitlab::VersionInfo.new(14, 0, 1) })
+ end
+
+ it 'makes no changes to ci_runner_versions', :aggregate_failures do
+ result = nil
+ expect { result = execute }.not_to change { runner_version_14_0_1.reload.status }.from('not_available')
+
+ expect(result).to eq({
+ status: :success,
+ total_inserted: 0,
+ total_updated: 0,
+ total_deleted: 0
+ })
+ end
+ end
+ end
+
+ context 'integration testing with Gitlab::Ci::RunnerUpgradeCheck' do
+ let(:available_runner_releases) do
+ %w[14.0.0 14.0.1]
+ end
+
+ before do
+ url = ::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url
+
+ WebMock.stub_request(:get, url).to_return(
+ body: available_runner_releases.map { |v| { name: v } }.to_json,
+ status: 200,
+ headers: { 'Content-Type' => 'application/json' }
+ )
+ end
+
+ it 'does not modify ci_runner_versions entries', :aggregate_failures do
+ result = nil
+ expect { result = execute }.not_to change { runner_version_14_0_1.reload.status }.from('not_available')
+
+ expect(result).to eq({
+ status: :success,
+ total_inserted: 0,
+ total_updated: 0,
+ total_deleted: 0
+ })
+ end
+ end
+end
diff --git a/spec/services/ci/runners/register_runner_service_spec.rb b/spec/services/ci/runners/register_runner_service_spec.rb
index f43fd823078..03dcf851e53 100644
--- a/spec/services/ci/runners/register_runner_service_spec.rb
+++ b/spec/services/ci/runners/register_runner_service_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute' do
stub_application_setting(valid_runner_registrars: ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
end
- subject { described_class.new.execute(token, args) }
+ subject(:runner) { described_class.new.execute(token, args) }
context 'when no token is provided' do
let(:token) { '' }
@@ -83,6 +83,9 @@ RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute' do
expect(subject.platform).to eq args[:platform]
expect(subject.architecture).to eq args[:architecture]
expect(subject.ip_address).to eq args[:ip_address]
+
+ expect(Ci::Runner.tagged_with('tag1')).to include(subject)
+ expect(Ci::Runner.tagged_with('tag2')).to include(subject)
end
end
@@ -230,5 +233,41 @@ RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute' do
end
end
end
+
+ context 'when tags are provided' do
+ let(:token) { registration_token }
+
+ let(:args) do
+ { tag_list: %w(tag1 tag2) }
+ end
+
+ it 'creates runner with tags' do
+ expect(runner).to be_persisted
+
+ expect(runner.tags).to contain_exactly(
+ an_object_having_attributes(name: 'tag1'),
+ an_object_having_attributes(name: 'tag2')
+ )
+ end
+
+ it 'creates tags in bulk' do
+ expect(Gitlab::Ci::Tags::BulkInsert).to receive(:bulk_insert_tags!).and_call_original
+
+ expect(runner).to be_persisted
+ end
+
+ context 'and tag list exceeds limit' do
+ let(:args) do
+ { tag_list: (1..Ci::Runner::TAG_LIST_MAX_LENGTH + 1).map { |i| "tag#{i}" } }
+ end
+
+ it 'does not create any tags' do
+ expect(Gitlab::Ci::Tags::BulkInsert).not_to receive(:bulk_insert_tags!)
+
+ expect(runner).not_to be_persisted
+ expect(runner.tags).to be_empty
+ end
+ end
+ end
end
end
diff --git a/spec/services/ci/unlock_artifacts_service_spec.rb b/spec/services/ci/unlock_artifacts_service_spec.rb
index 8ee07fc44c8..94d39fc9f14 100644
--- a/spec/services/ci/unlock_artifacts_service_spec.rb
+++ b/spec/services/ci/unlock_artifacts_service_spec.rb
@@ -130,7 +130,7 @@ RSpec.describe Ci::UnlockArtifactsService do
WHERE
"ci_pipelines"."ci_ref_id" = #{ci_ref.id}
AND "ci_pipelines"."locked" = 1
- AND (ci_pipelines.id < #{before_pipeline.id})
+ AND "ci_pipelines"."id" < #{before_pipeline.id}
AND "ci_pipelines"."id" NOT IN
(WITH RECURSIVE
"base_and_descendants"
diff --git a/spec/services/ci/update_pending_build_service_spec.rb b/spec/services/ci/update_pending_build_service_spec.rb
index 2bb0aded24a..e49b22299f0 100644
--- a/spec/services/ci/update_pending_build_service_spec.rb
+++ b/spec/services/ci/update_pending_build_service_spec.rb
@@ -42,19 +42,6 @@ RSpec.describe Ci::UpdatePendingBuildService do
expect(pending_build_1.instance_runners_enabled).to be_truthy
expect(pending_build_2.instance_runners_enabled).to be_truthy
end
-
- context 'when ci_pending_builds_maintain_denormalized_data is disabled' do
- before do
- stub_feature_flags(ci_pending_builds_maintain_denormalized_data: false)
- end
-
- it 'does not update all pending builds', :aggregate_failures do
- update_pending_builds
-
- expect(pending_build_1.instance_runners_enabled).to be_falsey
- expect(pending_build_2.instance_runners_enabled).to be_truthy
- end
- end
end
context 'when model is a project with pending builds' do
@@ -66,19 +53,6 @@ RSpec.describe Ci::UpdatePendingBuildService do
expect(pending_build_1.instance_runners_enabled).to be_truthy
expect(pending_build_2.instance_runners_enabled).to be_truthy
end
-
- context 'when ci_pending_builds_maintain_denormalized_data is disabled' do
- before do
- stub_feature_flags(ci_pending_builds_maintain_denormalized_data: false)
- end
-
- it 'does not update all pending builds', :aggregate_failures do
- update_pending_builds
-
- expect(pending_build_1.instance_runners_enabled).to be_falsey
- expect(pending_build_2.instance_runners_enabled).to be_truthy
- end
- end
end
end
end
diff --git a/spec/services/clusters/applications/create_service_spec.rb b/spec/services/clusters/applications/create_service_spec.rb
index eb907377ca8..00a67a9b2ef 100644
--- a/spec/services/clusters/applications/create_service_spec.rb
+++ b/spec/services/clusters/applications/create_service_spec.rb
@@ -168,29 +168,6 @@ RSpec.describe Clusters::Applications::CreateService do
subject
end
end
-
- context 'elastic stack application' do
- let(:params) do
- {
- application: 'elastic_stack'
- }
- end
-
- before do
- create(:clusters_applications_ingress, :installed, external_ip: "127.0.0.0", cluster: cluster)
- expect_any_instance_of(Clusters::Applications::ElasticStack)
- .to receive(:make_scheduled!)
- .and_call_original
- end
-
- it 'creates the application' do
- expect do
- subject
-
- cluster.reload
- end.to change(cluster, :application_elastic_stack)
- end
- end
end
context 'invalid application' do
diff --git a/spec/services/clusters/integrations/create_service_spec.rb b/spec/services/clusters/integrations/create_service_spec.rb
index 6dac97ebf8f..016511a3c01 100644
--- a/spec/services/clusters/integrations/create_service_spec.rb
+++ b/spec/services/clusters/integrations/create_service_spec.rb
@@ -61,7 +61,6 @@ RSpec.describe Clusters::Integrations::CreateService, '#execute' do
end
it_behaves_like 'a cluster integration', 'prometheus'
- it_behaves_like 'a cluster integration', 'elastic_stack'
context 'when application_type is invalid' do
let(:params) do
diff --git a/spec/services/deployments/create_for_build_service_spec.rb b/spec/services/deployments/create_for_build_service_spec.rb
index 6fc7c9e56a6..38d94580512 100644
--- a/spec/services/deployments/create_for_build_service_spec.rb
+++ b/spec/services/deployments/create_for_build_service_spec.rb
@@ -25,6 +25,7 @@ RSpec.describe Deployments::CreateForBuildService do
expect(build.deployment.deployable).to eq(build)
expect(build.deployment.deployable_type).to eq('CommitStatus')
expect(build.deployment.environment).to eq(build.persisted_environment)
+ expect(build.deployment.valid?).to be_truthy
end
context 'when creation failure occures' do
diff --git a/spec/services/deployments/create_service_spec.rb b/spec/services/deployments/create_service_spec.rb
index f6f4c68a6f1..0f2a6ce32e1 100644
--- a/spec/services/deployments/create_service_spec.rb
+++ b/spec/services/deployments/create_service_spec.rb
@@ -21,34 +21,11 @@ RSpec.describe Deployments::CreateService do
expect(Deployments::UpdateEnvironmentWorker).to receive(:perform_async)
expect(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
- expect_next_instance_of(Deployment) do |deployment|
- expect(deployment).to receive(:execute_hooks)
- end
+ expect(Deployments::HooksWorker).to receive(:perform_async)
expect(service.execute).to be_persisted
end
- context 'when `deployment_hooks_skip_worker` flag is disabled' do
- before do
- stub_feature_flags(deployment_hooks_skip_worker: false)
- end
-
- it 'executes Deployments::HooksWorker asynchronously' do
- service = described_class.new(
- environment,
- user,
- sha: 'b83d6e391c22777fca1ed3012fce84f633d7fed0',
- ref: 'master',
- tag: false,
- status: 'success'
- )
-
- expect(Deployments::HooksWorker).to receive(:perform_async)
-
- service.execute
- end
- end
-
it 'does not change the status if no status is given' do
service = described_class.new(
environment,
@@ -60,9 +37,7 @@ RSpec.describe Deployments::CreateService do
expect(Deployments::UpdateEnvironmentWorker).not_to receive(:perform_async)
expect(Deployments::LinkMergeRequestWorker).not_to receive(:perform_async)
- expect_next_instance_of(Deployment) do |deployment|
- expect(deployment).not_to receive(:execute_hooks)
- end
+ expect(Deployments::HooksWorker).not_to receive(:perform_async)
expect(service.execute).to be_persisted
end
@@ -80,9 +55,11 @@ RSpec.describe Deployments::CreateService do
it 'does not create a new deployment' do
described_class.new(environment, user, params).execute
- expect do
- described_class.new(environment.reload, user, params).execute
- end.not_to change { Deployment.count }
+ expect(Deployments::UpdateEnvironmentWorker).not_to receive(:perform_async)
+ expect(Deployments::LinkMergeRequestWorker).not_to receive(:perform_async)
+ expect(Deployments::HooksWorker).not_to receive(:perform_async)
+
+ described_class.new(environment.reload, user, params).execute
end
end
end
diff --git a/spec/services/deployments/update_environment_service_spec.rb b/spec/services/deployments/update_environment_service_spec.rb
index e2d7a80fde3..8ab53a37a33 100644
--- a/spec/services/deployments/update_environment_service_spec.rb
+++ b/spec/services/deployments/update_environment_service_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Deployments::UpdateEnvironmentService do
before do
allow(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
- allow(deployment).to receive(:execute_hooks)
+ allow(Deployments::HooksWorker).to receive(:perform_async)
job.success! # Create/Succeed deployment
end
diff --git a/spec/services/draft_notes/publish_service_spec.rb b/spec/services/draft_notes/publish_service_spec.rb
index 51ef30c91c0..81443eed7d3 100644
--- a/spec/services/draft_notes/publish_service_spec.rb
+++ b/spec/services/draft_notes/publish_service_spec.rb
@@ -168,7 +168,7 @@ RSpec.describe DraftNotes::PublishService do
# NOTE: This should be reduced as we work on reducing Gitaly calls.
# Gitaly requests shouldn't go above this threshold as much as possible
# as it may add more to the Gitaly N+1 issue we are experiencing.
- expect { publish }.to change { Gitlab::GitalyClient.get_request_count }.by(21)
+ expect { publish }.to change { Gitlab::GitalyClient.get_request_count }.by(20)
end
end
diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb
index 56da85cc4a0..e66b413a5c9 100644
--- a/spec/services/event_create_service_spec.rb
+++ b/spec/services/event_create_service_spec.rb
@@ -379,10 +379,14 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi
end
end
- describe 'design events' do
+ describe 'design events', :snowplow do
let_it_be(:design) { create(:design, project: project) }
let_it_be(:author) { user }
+ before do
+ allow(Gitlab::Tracking).to receive(:event) # rubocop:disable RSpec/ExpectGitlabTracking
+ end
+
describe '#save_designs' do
let_it_be(:updated) { create_list(:design, 5) }
let_it_be(:created) { create_list(:design, 3) }
@@ -411,6 +415,44 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi
it_behaves_like "it records the event in the event counter" do
let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION }
end
+
+ it 'records correct create payload with Snowplow event' do
+ service.save_designs(author, create: [design])
+
+ expect_snowplow_event(
+ category: Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s,
+ action: 'create',
+ namespace: design.project.namespace,
+ user: author,
+ project: design.project,
+ label: 'design_users'
+ )
+ end
+
+ it 'records correct update payload with Snowplow event' do
+ service.save_designs(author, update: [design])
+
+ expect_snowplow_event(
+ category: Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s,
+ action: 'update',
+ namespace: design.project.namespace,
+ user: author,
+ project: design.project,
+ label: 'design_users'
+ )
+ end
+
+ context 'when FF is disabled' do
+ before do
+ stub_feature_flags(route_hll_to_snowplow_phase2: false)
+ end
+
+ it 'doesnt emit snowwplow events', :snowplow do
+ subject
+
+ expect_no_snowplow_event
+ end
+ end
end
describe '#destroy_designs' do
@@ -434,6 +476,31 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi
it_behaves_like "it records the event in the event counter" do
let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION }
end
+
+ it 'records correct payload with Snowplow event' do
+ service.destroy_designs([design], author)
+
+ expect_snowplow_event(
+ category: Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s,
+ action: 'destroy',
+ namespace: design.project.namespace,
+ user: author,
+ project: design.project,
+ label: 'design_users'
+ )
+ end
+
+ context 'when FF is disabled' do
+ before do
+ stub_feature_flags(route_hll_to_snowplow_phase2: false)
+ end
+
+ it 'doesnt emit snowwplow events', :snowplow do
+ subject
+
+ expect_no_snowplow_event
+ end
+ end
end
end
diff --git a/spec/services/feature_flags/create_service_spec.rb b/spec/services/feature_flags/create_service_spec.rb
index e37d41562f9..1c9bde70af3 100644
--- a/spec/services/feature_flags/create_service_spec.rb
+++ b/spec/services/feature_flags/create_service_spec.rb
@@ -41,6 +41,8 @@ RSpec.describe FeatureFlags::CreateService do
subject
end
+
+ it_behaves_like 'does not update feature flag client'
end
context 'when feature flag is saved correctly' do
@@ -62,6 +64,8 @@ RSpec.describe FeatureFlags::CreateService do
expect { subject }.to change { Operations::FeatureFlag.count }.by(1)
end
+ it_behaves_like 'update feature flag client'
+
context 'when Jira Connect subscription does not exist' do
it 'does not sync the feature flag to Jira' do
expect(::JiraConnect::SyncFeatureFlagsWorker).not_to receive(:perform_async)
diff --git a/spec/services/feature_flags/destroy_service_spec.rb b/spec/services/feature_flags/destroy_service_spec.rb
index d3796ef6b4d..740923db9b6 100644
--- a/spec/services/feature_flags/destroy_service_spec.rb
+++ b/spec/services/feature_flags/destroy_service_spec.rb
@@ -36,6 +36,8 @@ RSpec.describe FeatureFlags::DestroyService do
expect(audit_event_message).to eq("Deleted feature flag #{feature_flag.name}.")
end
+ it_behaves_like 'update feature flag client'
+
context 'when user is reporter' do
let(:user) { reporter }
@@ -57,6 +59,8 @@ RSpec.describe FeatureFlags::DestroyService do
it 'does not create audit log' do
expect { subject }.not_to change { AuditEvent.count }
end
+
+ it_behaves_like 'does not update feature flag client'
end
end
end
diff --git a/spec/services/feature_flags/update_service_spec.rb b/spec/services/feature_flags/update_service_spec.rb
index f5e94c4af0f..8f985d34961 100644
--- a/spec/services/feature_flags/update_service_spec.rb
+++ b/spec/services/feature_flags/update_service_spec.rb
@@ -58,6 +58,8 @@ RSpec.describe FeatureFlags::UpdateService do
)
end
+ it_behaves_like 'update feature flag client'
+
context 'with invalid params' do
let(:params) { { name: nil } }
@@ -79,6 +81,8 @@ RSpec.describe FeatureFlags::UpdateService do
subject
end
+
+ it_behaves_like 'does not update feature flag client'
end
context 'when user is reporter' do
diff --git a/spec/services/git/branch_hooks_service_spec.rb b/spec/services/git/branch_hooks_service_spec.rb
index 79c2cb1fca3..5de1c0e27be 100644
--- a/spec/services/git/branch_hooks_service_spec.rb
+++ b/spec/services/git/branch_hooks_service_spec.rb
@@ -387,6 +387,27 @@ RSpec.describe Git::BranchHooksService, :clean_gitlab_redis_shared_state do
expect(commits_count).to eq(project.repository.commit_count_for_ref(newrev))
end
+
+ it 'collects the related metrics' do
+ expect(Gitlab::Metrics).to receive(:add_event).with(:push_commit, { branch: 'master' })
+ expect(Gitlab::Metrics).to receive(:add_event).with(:push_branch, {})
+ expect(Gitlab::Metrics).to receive(:add_event).with(:change_default_branch, {})
+ expect(Gitlab::Metrics).to receive(:add_event).with(:process_commit_limit_overflow)
+
+ service.execute
+ end
+
+ context 'when limit is not hit' do
+ before do
+ stub_const("::Git::BaseHooksService::PROCESS_COMMIT_LIMIT", 100)
+ end
+
+ it 'does not collect the corresponding metric' do
+ expect(Gitlab::Metrics).not_to receive(:add_event).with(:process_commit_limit_overflow)
+
+ service.execute
+ end
+ end
end
context 'updating the default branch' do
diff --git a/spec/services/git/branch_push_service_spec.rb b/spec/services/git/branch_push_service_spec.rb
index befa9598964..8d41b20c8a9 100644
--- a/spec/services/git/branch_push_service_spec.rb
+++ b/spec/services/git/branch_push_service_spec.rb
@@ -19,11 +19,13 @@ RSpec.describe Git::BranchPushService, services: true do
project.add_maintainer(user)
end
- describe 'Push branches' do
- subject do
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref, push_options: push_options)
- end
+ subject(:execute_service) do
+ described_class
+ .new(project, user, change: { oldrev: oldrev, newrev: newrev, ref: ref }, push_options: push_options)
+ .execute
+ end
+ describe 'Push branches' do
context 'new branch' do
let(:oldrev) { blankrev }
@@ -72,8 +74,6 @@ RSpec.describe Git::BranchPushService, services: true do
end
describe "Pipelines" do
- subject { execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref) }
-
before do
stub_ci_pipeline_to_return_yaml_file
end
@@ -117,7 +117,7 @@ RSpec.describe Git::BranchPushService, services: true do
end
context 'with push options' do
- let(:push_options) { ['mr.create'] }
+ let(:push_options) { { 'mr' => { 'create' => true } } }
it 'sanitizes push options' do
allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
@@ -148,27 +148,34 @@ RSpec.describe Git::BranchPushService, services: true do
end
describe "Updates merge requests" do
+ let(:oldrev) { blankrev }
+
it "when pushing a new branch for the first time" do
expect(UpdateMergeRequestsWorker)
.to receive(:perform_async)
- .with(project.id, user.id, blankrev, newrev, ref)
+ .with(project.id, user.id, blankrev, newrev, ref, { 'push_options' => nil })
+ .ordered
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref)
+ subject
end
end
describe "Updates git attributes" do
context "for default branch" do
- it "calls the copy attributes method for the first push to the default branch" do
- expect(project.repository).to receive(:copy_gitattributes).with('master')
+ context "when first push" do
+ let(:oldrev) { blankrev }
+
+ it "calls the copy attributes method for the first push to the default branch" do
+ expect(project.repository).to receive(:copy_gitattributes).with('master')
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref)
+ subject
+ end
end
it "calls the copy attributes method for changes to the default branch" do
expect(project.repository).to receive(:copy_gitattributes).with(ref)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
@@ -181,49 +188,53 @@ RSpec.describe Git::BranchPushService, services: true do
it "does not call copy attributes method" do
expect(project.repository).not_to receive(:copy_gitattributes)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
end
describe "Webhooks" do
- context "execute webhooks" do
- before do
- create(:project_hook, push_events: true, project: project)
- end
+ before do
+ create(:project_hook, push_events: true, project: project)
+ end
- it "when pushing a branch for the first time" do
+ context "when pushing a branch for the first time" do
+ let(:oldrev) { blankrev }
+
+ it "executes webhooks" do
expect(project).to receive(:execute_hooks)
expect(project.default_branch).to eq("master")
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref)
+
+ subject
+
expect(project.protected_branches).not_to be_empty
expect(project.protected_branches.first.push_access_levels.map(&:access_level)).to eq([Gitlab::Access::MAINTAINER])
expect(project.protected_branches.first.merge_access_levels.map(&:access_level)).to eq([Gitlab::Access::MAINTAINER])
end
- it "when pushing a branch for the first time with default branch protection disabled" do
+ it "with default branch protection disabled" do
expect(project.namespace).to receive(:default_branch_protection).and_return(Gitlab::Access::PROTECTION_NONE)
expect(project).to receive(:execute_hooks)
expect(project.default_branch).to eq("master")
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref)
+ subject
expect(project.protected_branches).to be_empty
end
- it "when pushing a branch for the first time with default branch protection set to 'developers can push'" do
+ it "with default branch protection set to 'developers can push'" do
expect(project.namespace).to receive(:default_branch_protection).and_return(Gitlab::Access::PROTECTION_DEV_CAN_PUSH)
expect(project).to receive(:execute_hooks)
expect(project.default_branch).to eq("master")
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref)
+ subject
expect(project.protected_branches).not_to be_empty
expect(project.protected_branches.last.push_access_levels.map(&:access_level)).to eq([Gitlab::Access::DEVELOPER])
expect(project.protected_branches.last.merge_access_levels.map(&:access_level)).to eq([Gitlab::Access::MAINTAINER])
end
- it "when pushing a branch for the first time with an existing branch permission configured" do
+ it "with an existing branch permission configured" do
expect(project.namespace).to receive(:default_branch_protection).and_return(Gitlab::Access::PROTECTION_DEV_CAN_PUSH)
create(:protected_branch, :no_one_can_push, :developers_can_merge, project: project, name: 'master')
@@ -231,27 +242,29 @@ RSpec.describe Git::BranchPushService, services: true do
expect(project.default_branch).to eq("master")
expect(ProtectedBranches::CreateService).not_to receive(:new)
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref)
+ subject
expect(project.protected_branches).not_to be_empty
expect(project.protected_branches.last.push_access_levels.map(&:access_level)).to eq([Gitlab::Access::NO_ACCESS])
expect(project.protected_branches.last.merge_access_levels.map(&:access_level)).to eq([Gitlab::Access::DEVELOPER])
end
- it "when pushing a branch for the first time with default branch protection set to 'developers can merge'" do
+ it "with default branch protection set to 'developers can merge'" do
expect(project.namespace).to receive(:default_branch_protection).and_return(Gitlab::Access::PROTECTION_DEV_CAN_MERGE)
expect(project).to receive(:execute_hooks)
expect(project.default_branch).to eq("master")
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref)
+ subject
expect(project.protected_branches).not_to be_empty
expect(project.protected_branches.first.push_access_levels.map(&:access_level)).to eq([Gitlab::Access::MAINTAINER])
expect(project.protected_branches.first.merge_access_levels.map(&:access_level)).to eq([Gitlab::Access::DEVELOPER])
end
+ end
- it "when pushing new commits to existing branch" do
+ context "when pushing new commits to existing branch" do
+ it "executes webhooks" do
expect(project).to receive(:execute_hooks)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
end
@@ -281,7 +294,7 @@ RSpec.describe Git::BranchPushService, services: true do
it "creates a note if a pushed commit mentions an issue", :sidekiq_might_not_need_inline do
expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, commit_author)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
it "only creates a cross-reference note if one doesn't already exist" do
@@ -289,7 +302,7 @@ RSpec.describe Git::BranchPushService, services: true do
expect(SystemNoteService).not_to receive(:cross_reference).with(issue, commit, commit_author)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
it "defaults to the pushing user if the commit's author is not known", :sidekiq_inline, :use_clean_rails_redis_caching do
@@ -299,16 +312,21 @@ RSpec.describe Git::BranchPushService, services: true do
)
expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, user)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
- it "finds references in the first push to a non-default branch", :sidekiq_might_not_need_inline do
- allow(project.repository).to receive(:commits_between).with(blankrev, newrev).and_return([])
- allow(project.repository).to receive(:commits_between).with("master", newrev).and_return([commit])
+ context "when first push on a non-default branch" do
+ let(:oldrev) { blankrev }
+ let(:ref) { 'refs/heads/other' }
- expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, commit_author)
+ it "finds references", :sidekiq_might_not_need_inline do
+ allow(project.repository).to receive(:commits_between).with(blankrev, newrev).and_return([])
+ allow(project.repository).to receive(:commits_between).with("master", newrev).and_return([commit])
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: 'refs/heads/other')
+ expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, commit_author)
+
+ subject
+ end
end
end
@@ -338,14 +356,14 @@ RSpec.describe Git::BranchPushService, services: true do
context "while saving the 'first_mentioned_in_commit_at' metric for an issue" do
it 'sets the metric for referenced issues', :sidekiq_inline, :use_clean_rails_redis_caching do
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(issue.reload.metrics.first_mentioned_in_commit_at).to be_like_time(commit_time)
end
it 'does not set the metric for non-referenced issues' do
non_referenced_issue = create(:issue, project: project)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(non_referenced_issue.reload.metrics.first_mentioned_in_commit_at).to be_nil
end
@@ -376,19 +394,21 @@ RSpec.describe Git::BranchPushService, services: true do
end
context "to default branches" do
+ let(:user) { commit_author }
+
it "closes issues", :sidekiq_might_not_need_inline do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(Issue.find(issue.id)).to be_closed
end
it "adds a note indicating that the issue is now closed", :sidekiq_might_not_need_inline do
expect(SystemNoteService).to receive(:change_status).with(issue, project, commit_author, "closed", closing_commit)
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
it "doesn't create additional cross-reference notes" do
expect(SystemNoteService).not_to receive(:cross_reference)
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
@@ -400,11 +420,11 @@ RSpec.describe Git::BranchPushService, services: true do
it "creates cross-reference notes", :sidekiq_inline, :use_clean_rails_redis_caching do
expect(SystemNoteService).to receive(:cross_reference).with(issue, closing_commit, commit_author)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
it "doesn't close issues" do
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(Issue.find(issue.id)).to be_opened
end
end
@@ -441,7 +461,7 @@ RSpec.describe Git::BranchPushService, services: true do
let(:message) { "this is some work.\n\nrelated to JIRA-1" }
it "initiates one api call to jira server to mention the issue", :sidekiq_inline, :use_clean_rails_redis_caching do
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(WebMock).to have_requested(:post, jira_api_comment_url('JIRA-1')).with(
body: /mentioned this issue in/
@@ -468,37 +488,43 @@ RSpec.describe Git::BranchPushService, services: true do
end
context "using right markdown", :sidekiq_might_not_need_inline do
+ let(:user) { commit_author }
+
it "initiates one api call to jira server to close the issue" do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(WebMock).to have_requested(:post, jira_api_transition_url('JIRA-1')).once
end
it "initiates one api call to jira server to comment on the issue" do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
- expect(WebMock).to have_requested(:post, jira_api_comment_url('JIRA-1')).with(
- body: comment_body
- ).once
+ expect(WebMock)
+ .to have_requested(:post, jira_api_comment_url('JIRA-1'))
+ .with(body: comment_body)
+ .once
end
end
context "using internal issue reference" do
+ let(:user) { commit_author }
+
context 'when internal issues are disabled' do
before do
project.issues_enabled = false
project.save!
end
+
let(:message) { "this is some work.\n\ncloses #1" }
it "does not initiates one api call to jira server to close the issue" do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(WebMock).not_to have_requested(:post, jira_api_transition_url('JIRA-1'))
end
it "does not initiates one api call to jira server to comment on the issue" do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(WebMock).not_to have_requested(:post, jira_api_comment_url('JIRA-1')).with(
body: comment_body
@@ -511,13 +537,13 @@ RSpec.describe Git::BranchPushService, services: true do
let(:message) { "this is some work.\n\ncloses JIRA-1 \n\n closes #{issue.to_reference}" }
it "initiates one api call to jira server to close the jira issue" do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(WebMock).to have_requested(:post, jira_api_transition_url('JIRA-1')).once
end
it "initiates one api call to jira server to comment on the jira issue" do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(WebMock).to have_requested(:post, jira_api_comment_url('JIRA-1')).with(
body: comment_body
@@ -525,14 +551,14 @@ RSpec.describe Git::BranchPushService, services: true do
end
it "closes the internal issue" do
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
expect(issue.reload).to be_closed
end
it "adds a note indicating that the issue is now closed" do
expect(SystemNoteService).to receive(:change_status)
.with(issue, project, commit_author, "closed", closing_commit)
- execute_service(project, commit_author, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
end
@@ -542,7 +568,8 @@ RSpec.describe Git::BranchPushService, services: true do
describe "empty project" do
let(:project) { create(:project_empty_repo) }
- let(:new_ref) { 'refs/heads/feature' }
+ let(:ref) { 'refs/heads/feature' }
+ let(:oldrev) { blankrev }
before do
allow(project).to receive(:default_branch).and_return('feature')
@@ -550,7 +577,7 @@ RSpec.describe Git::BranchPushService, services: true do
end
it 'push to first branch updates HEAD' do
- execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: new_ref)
+ subject
end
end
@@ -561,7 +588,7 @@ RSpec.describe Git::BranchPushService, services: true do
it 'does nothing' do
expect(::Environments::StopService).not_to receive(:new)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
@@ -569,7 +596,7 @@ RSpec.describe Git::BranchPushService, services: true do
it 'does nothing' do
expect(::Environments::StopService).not_to receive(:new)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
@@ -583,7 +610,7 @@ RSpec.describe Git::BranchPushService, services: true do
expect(stop_service).to receive(:execute_for_branch).with(branch)
end
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
end
@@ -595,7 +622,7 @@ RSpec.describe Git::BranchPushService, services: true do
it 'does nothing' do
expect(::Ci::RefDeleteUnlockArtifactsWorker).not_to receive(:perform_async)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
@@ -603,7 +630,7 @@ RSpec.describe Git::BranchPushService, services: true do
it 'does nothing' do
expect(::Ci::RefDeleteUnlockArtifactsWorker).not_to receive(:perform_async)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
@@ -614,7 +641,7 @@ RSpec.describe Git::BranchPushService, services: true do
expect(::Ci::RefDeleteUnlockArtifactsWorker)
.to receive(:perform_async).with(project.id, user.id, "refs/heads/#{branch}")
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
end
@@ -636,7 +663,7 @@ RSpec.describe Git::BranchPushService, services: true do
expect(hooks_service).to receive(:execute)
end
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
@@ -646,38 +673,24 @@ RSpec.describe Git::BranchPushService, services: true do
it 'does nothing' do
expect(::Git::BranchHooksService).not_to receive(:new)
- execute_service(project, user, oldrev: oldrev, newrev: newrev, ref: ref)
+ subject
end
end
end
- def execute_service(project, user, change, push_options = {})
- service = described_class.new(project, user, change: change, push_options: push_options)
- service.execute
- service
- end
-
context 'Jira Connect hooks' do
- let_it_be(:project) { create(:project, :repository) }
-
let(:branch_to_sync) { nil }
let(:commits_to_sync) { [] }
- let(:params) do
- { change: { oldrev: oldrev, newrev: newrev, ref: ref } }
- end
-
- subject do
- described_class.new(project, user, params)
- end
shared_examples 'enqueues Jira sync worker' do
specify :aggregate_failures do
Sidekiq::Testing.fake! do
- expect(JiraConnect::SyncBranchWorker).to receive(:perform_async)
- .with(project.id, branch_to_sync, commits_to_sync, kind_of(Numeric))
- .and_call_original
+ expect(JiraConnect::SyncBranchWorker)
+ .to receive(:perform_async)
+ .with(project.id, branch_to_sync, commits_to_sync, kind_of(Numeric))
+ .and_call_original
- expect { subject.execute }.to change(JiraConnect::SyncBranchWorker.jobs, :size).by(1)
+ expect { subject }.to change(JiraConnect::SyncBranchWorker.jobs, :size).by(1)
end
end
end
@@ -685,7 +698,7 @@ RSpec.describe Git::BranchPushService, services: true do
shared_examples 'does not enqueue Jira sync worker' do
specify do
Sidekiq::Testing.fake! do
- expect { subject.execute }.not_to change(JiraConnect::SyncBranchWorker.jobs, :size)
+ expect { subject }.not_to change(JiraConnect::SyncBranchWorker.jobs, :size)
end
end
end
@@ -723,12 +736,12 @@ RSpec.describe Git::BranchPushService, services: true do
end
describe 'project target platforms detection' do
- subject(:execute) { execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref) }
+ let(:oldrev) { blankrev }
it 'calls enqueue_record_project_target_platforms on the project' do
expect(project).to receive(:enqueue_record_project_target_platforms)
- execute
+ subject
end
end
end
diff --git a/spec/services/git/process_ref_changes_service_spec.rb b/spec/services/git/process_ref_changes_service_spec.rb
index 05c1f898cab..8d2da4a899e 100644
--- a/spec/services/git/process_ref_changes_service_spec.rb
+++ b/spec/services/git/process_ref_changes_service_spec.rb
@@ -243,14 +243,37 @@ RSpec.describe Git::ProcessRefChangesService do
end
it 'schedules job for existing merge requests' do
- expect(UpdateMergeRequestsWorker).to receive(:perform_async)
- .with(project.id, user.id, Gitlab::Git::BLANK_SHA, '789012', "#{ref_prefix}/create1").ordered
- expect(UpdateMergeRequestsWorker).to receive(:perform_async)
- .with(project.id, user.id, Gitlab::Git::BLANK_SHA, '789013', "#{ref_prefix}/create2").ordered
- expect(UpdateMergeRequestsWorker).to receive(:perform_async)
- .with(project.id, user.id, '789015', '789016', "#{ref_prefix}/changed1").ordered
- expect(UpdateMergeRequestsWorker).to receive(:perform_async)
- .with(project.id, user.id, '789020', Gitlab::Git::BLANK_SHA, "#{ref_prefix}/removed2").ordered
+ expect(UpdateMergeRequestsWorker).to receive(:perform_async).with(
+ project.id,
+ user.id,
+ Gitlab::Git::BLANK_SHA,
+ '789012',
+ "#{ref_prefix}/create1",
+ { 'push_options' => nil }).ordered
+
+ expect(UpdateMergeRequestsWorker).to receive(:perform_async).with(
+ project.id,
+ user.id,
+ Gitlab::Git::BLANK_SHA,
+ '789013',
+ "#{ref_prefix}/create2",
+ { 'push_options' => nil }).ordered
+
+ expect(UpdateMergeRequestsWorker).to receive(:perform_async).with(
+ project.id,
+ user.id,
+ '789015',
+ '789016',
+ "#{ref_prefix}/changed1",
+ { 'push_options' => nil }).ordered
+
+ expect(UpdateMergeRequestsWorker).to receive(:perform_async).with(
+ project.id,
+ user.id,
+ '789020',
+ Gitlab::Git::BLANK_SHA,
+ "#{ref_prefix}/removed2",
+ { 'push_options' => nil }).ordered
subject.execute
end
diff --git a/spec/services/git/tag_hooks_service_spec.rb b/spec/services/git/tag_hooks_service_spec.rb
index dae2f63f2f9..2d50c64d63c 100644
--- a/spec/services/git/tag_hooks_service_spec.rb
+++ b/spec/services/git/tag_hooks_service_spec.rb
@@ -138,7 +138,7 @@ RSpec.describe Git::TagHooksService, :service do
before do
# Create the lightweight tag
- rugged_repo(project.repository).tags.create(tag_name, newrev)
+ project.repository.write_ref("refs/tags/#{tag_name}", newrev)
# Clear tag list cache
project.repository.expire_tags_cache
diff --git a/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb b/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb
index e2f5a2e719e..b2cd5632be0 100644
--- a/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb
+++ b/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe GoogleCloud::GcpRegionAddOrReplaceService do
service.execute('env_2', 'loc_2')
service.execute('env_1', 'loc_3')
- list = project.variables.reload.filter { |variable| variable.key == Projects::GoogleCloudController::GCP_REGION_CI_VAR_KEY }
+ list = project.variables.reload.filter { |variable| variable.key == Projects::GoogleCloud::GcpRegionsController::GCP_REGION_CI_VAR_KEY }
list = list.sort_by(&:environment_scope)
aggregate_failures 'testing list of gcp regions' do
diff --git a/spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb b/spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb
new file mode 100644
index 00000000000..55553097423
--- /dev/null
+++ b/spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb
@@ -0,0 +1,158 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GoogleCloud::SetupCloudsqlInstanceService do
+ let(:random_user) { create(:user) }
+ let(:project) { create(:project) }
+
+ context 'when unauthorized user triggers worker' do
+ subject do
+ params = {
+ gcp_project_id: :gcp_project_id,
+ instance_name: :instance_name,
+ database_version: :database_version,
+ environment_name: :environment_name,
+ is_protected: :is_protected
+ }
+ described_class.new(project, random_user, params).execute
+ end
+
+ it 'raises unauthorized error' do
+ message = subject[:message]
+ status = subject[:status]
+
+ expect(status).to eq(:error)
+ expect(message).to eq('Unauthorized user')
+ end
+ end
+
+ context 'when authorized user triggers worker' do
+ subject do
+ user = project.creator
+ params = {
+ gcp_project_id: :gcp_project_id,
+ instance_name: :instance_name,
+ database_version: :database_version,
+ environment_name: :environment_name,
+ is_protected: :is_protected
+ }
+ described_class.new(project, user, params).execute
+ end
+
+ context 'when instance is not RUNNABLE' do
+ let(:get_instance_response_pending) do
+ Google::Apis::SqladminV1beta4::DatabaseInstance.new(state: 'PENDING')
+ end
+
+ it 'raises error' do
+ allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |google_api_client|
+ expect(google_api_client).to receive(:get_cloudsql_instance).and_return(get_instance_response_pending)
+ end
+
+ message = subject[:message]
+ status = subject[:status]
+
+ expect(status).to eq(:error)
+ expect(message).to eq('CloudSQL instance not RUNNABLE: {"state":"PENDING"}')
+ end
+ end
+
+ context 'when instance is RUNNABLE' do
+ let(:get_instance_response_runnable) do
+ Google::Apis::SqladminV1beta4::DatabaseInstance.new(
+ connection_name: 'mock-connection-name',
+ ip_addresses: [Struct.new(:ip_address).new('1.2.3.4')],
+ state: 'RUNNABLE'
+ )
+ end
+
+ let(:operation_fail) { Google::Apis::SqladminV1beta4::Operation.new(status: 'FAILED') }
+
+ let(:operation_done) { Google::Apis::SqladminV1beta4::Operation.new(status: 'DONE') }
+
+ context 'when database creation fails' do
+ it 'raises error' do
+ allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |google_api_client|
+ expect(google_api_client).to receive(:get_cloudsql_instance).and_return(get_instance_response_runnable)
+ expect(google_api_client).to receive(:create_cloudsql_database).and_return(operation_fail)
+ end
+
+ message = subject[:message]
+ status = subject[:status]
+
+ expect(status).to eq(:error)
+ expect(message).to eq('Database creation failed: {"status":"FAILED"}')
+ end
+ end
+
+ context 'when user creation fails' do
+ it 'raises error' do
+ allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |google_api_client|
+ expect(google_api_client).to receive(:get_cloudsql_instance).and_return(get_instance_response_runnable)
+ expect(google_api_client).to receive(:create_cloudsql_database).and_return(operation_done)
+ expect(google_api_client).to receive(:create_cloudsql_user).and_return(operation_fail)
+ end
+
+ message = subject[:message]
+ status = subject[:status]
+
+ expect(status).to eq(:error)
+ expect(message).to eq('User creation failed: {"status":"FAILED"}')
+ end
+ end
+
+ context 'when database and user creation succeeds' do
+ it 'stores project CI vars' do
+ allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |google_api_client|
+ expect(google_api_client).to receive(:get_cloudsql_instance).and_return(get_instance_response_runnable)
+ expect(google_api_client).to receive(:create_cloudsql_database).and_return(operation_done)
+ expect(google_api_client).to receive(:create_cloudsql_user).and_return(operation_done)
+ end
+
+ subject
+
+ aggregate_failures 'test generated vars' do
+ variables = project.reload.variables
+
+ expect(variables.count).to eq(8)
+ expect(variables.find_by(key: 'GCP_PROJECT_ID').value).to eq("gcp_project_id")
+ expect(variables.find_by(key: 'GCP_CLOUDSQL_INSTANCE_NAME').value).to eq("instance_name")
+ expect(variables.find_by(key: 'GCP_CLOUDSQL_CONNECTION_NAME').value).to eq("mock-connection-name")
+ expect(variables.find_by(key: 'GCP_CLOUDSQL_PRIMARY_IP_ADDRESS').value).to eq("1.2.3.4")
+ expect(variables.find_by(key: 'GCP_CLOUDSQL_VERSION').value).to eq("database_version")
+ expect(variables.find_by(key: 'GCP_CLOUDSQL_DATABASE_NAME').value).to eq("main_db")
+ expect(variables.find_by(key: 'GCP_CLOUDSQL_DATABASE_USER').value).to eq("main_user")
+ expect(variables.find_by(key: 'GCP_CLOUDSQL_DATABASE_PASS').value).to be_present
+ end
+ end
+
+ context 'when the ci variable already exists' do
+ before do
+ create(
+ :ci_variable,
+ project: project,
+ key: 'GCP_PROJECT_ID',
+ value: 'previous_gcp_project_id',
+ environment_scope: :environment_name
+ )
+ end
+
+ it 'overwrites existing GCP_PROJECT_ID var' do
+ allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |google_api_client|
+ expect(google_api_client).to receive(:get_cloudsql_instance).and_return(get_instance_response_runnable)
+ expect(google_api_client).to receive(:create_cloudsql_database).and_return(operation_done)
+ expect(google_api_client).to receive(:create_cloudsql_user).and_return(operation_done)
+ end
+
+ subject
+
+ variables = project.reload.variables
+ value = variables.find_by(key: 'GCP_PROJECT_ID', environment_scope: :environment_name).value
+ expect(value).to eq("gcp_project_id")
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/groups/destroy_service_spec.rb b/spec/services/groups/destroy_service_spec.rb
index 628943e40ff..57a151efda6 100644
--- a/spec/services/groups/destroy_service_spec.rb
+++ b/spec/services/groups/destroy_service_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Groups::DestroyService do
let(:remove_path) { group.path + "+#{group.id}+deleted" }
before do
- group.add_user(user, Gitlab::Access::OWNER)
+ group.add_member(user, Gitlab::Access::OWNER)
end
def destroy_group(group, user, async)
@@ -168,8 +168,8 @@ RSpec.describe Groups::DestroyService do
let(:group2_user) { create(:user) }
before do
- group1.add_user(group1_user, Gitlab::Access::OWNER)
- group2.add_user(group2_user, Gitlab::Access::OWNER)
+ group1.add_member(group1_user, Gitlab::Access::OWNER)
+ group2.add_member(group2_user, Gitlab::Access::OWNER)
end
context 'when a project is shared with a group' do
@@ -203,7 +203,7 @@ RSpec.describe Groups::DestroyService do
let(:group3_user) { create(:user) }
before do
- group3.add_user(group3_user, Gitlab::Access::OWNER)
+ group3.add_member(group3_user, Gitlab::Access::OWNER)
create(:group_group_link, shared_group: group2, shared_with_group: group3)
group3.refresh_members_authorized_projects
@@ -290,7 +290,7 @@ RSpec.describe Groups::DestroyService do
let!(:shared_with_group_user) { create(:user) }
before do
- shared_with_group.add_user(shared_with_group_user, Gitlab::Access::MAINTAINER)
+ shared_with_group.add_member(shared_with_group_user, Gitlab::Access::MAINTAINER)
create(:group_group_link, shared_group: shared_group, shared_with_group: shared_with_group)
shared_with_group.refresh_members_authorized_projects
diff --git a/spec/services/groups/group_links/destroy_service_spec.rb b/spec/services/groups/group_links/destroy_service_spec.rb
index 6aaf5f45069..03de7175edd 100644
--- a/spec/services/groups/group_links/destroy_service_spec.rb
+++ b/spec/services/groups/group_links/destroy_service_spec.rb
@@ -24,11 +24,29 @@ 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', :sidekiq_inline do
- group.add_developer(user)
+ context 'with skip_group_share_unlink_auth_refresh feature flag disabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: false)
+ end
- expect { subject.execute(link) }.to(
- change { Ability.allowed?(user, :read_project, project) }.from(true).to(false))
+ it 'revokes project authorization', :sidekiq_inline do
+ group.add_developer(user)
+
+ expect { subject.execute(link) }.to(
+ change { Ability.allowed?(user, :read_project, project) }.from(true).to(false))
+ end
+ end
+
+ context 'with skip_group_share_unlink_auth_refresh feature flag enabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: true)
+ end
+
+ it 'maintains project authorization', :sidekiq_inline do
+ group.add_developer(user)
+
+ expect(Ability.allowed?(user, :read_project, project)).to be_truthy
+ end
end
end
@@ -45,12 +63,32 @@ RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do
]
end
- 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, blocking: false).once
- expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true, blocking: false).once
+ context 'with skip_group_share_unlink_auth_refresh feature flag disabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: false)
+ end
+
+ 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, blocking: false).once
+ expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true, blocking: false).once
+
+ subject.execute(links)
+ end
+ end
+
+ context 'with skip_group_share_unlink_auth_refresh feature flag enabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: true)
+ end
+
+ it 'does not update project authorization once per group' do
+ expect(GroupGroupLink).to receive(:delete).and_call_original
+ expect(group).not_to receive(:refresh_members_authorized_projects)
+ expect(another_group).not_to receive(:refresh_members_authorized_projects)
- subject.execute(links)
+ subject.execute(links)
+ end
end
end
end
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 20ea8b2bf1b..fbcca215282 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -439,6 +439,7 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
before do
TestEnv.clean_test_path
create(:group_member, :owner, group: new_parent_group, user: user)
+ allow(transfer_service).to receive(:update_project_settings)
transfer_service.execute(new_parent_group)
end
@@ -478,6 +479,11 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
end
end
+ it 'invokes #update_project_settings' do
+ expect(transfer_service).to have_received(:update_project_settings)
+ .with(group.projects.pluck(:id))
+ end
+
it_behaves_like 'project namespace path is in sync with project path' do
let(:group_full_path) { "#{new_parent_group.path}/#{group.path}" }
let(:projects_with_project_namespace) { [project1, project2] }
@@ -601,8 +607,8 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
}.from(0).to(1)
end
- it 'performs authorizations job immediately' do
- expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to receive(:bulk_perform_inline)
+ it 'performs authorizations job' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to receive(:bulk_perform_async)
transfer_service.execute(new_parent_group)
end
@@ -659,7 +665,7 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
it 'schedules authorizations job' do
expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to receive(:bulk_perform_async)
- .with(array_including(group.all_projects.ids.map { |id| [id, anything] }))
+ .with(array_including(group.all_projects.ids.map { |id| [id] }))
transfer_service.execute(new_parent_group)
end
diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb
index 46c5e2a9818..c0e1691fe26 100644
--- a/spec/services/groups/update_service_spec.rb
+++ b/spec/services/groups/update_service_spec.rb
@@ -58,7 +58,7 @@ RSpec.describe Groups::UpdateService do
let!(:service) { described_class.new(public_group, user, visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
before do
- public_group.add_user(user, Gitlab::Access::OWNER)
+ public_group.add_member(user, Gitlab::Access::OWNER)
create(:project, :public, group: public_group)
expect(TodosDestroyer::GroupPrivateWorker).not_to receive(:perform_in)
@@ -119,7 +119,7 @@ RSpec.describe Groups::UpdateService do
let!(:service) { described_class.new(internal_group, user, visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
before do
- internal_group.add_user(user, Gitlab::Access::OWNER)
+ internal_group.add_member(user, Gitlab::Access::OWNER)
create(:project, :internal, group: internal_group)
expect(TodosDestroyer::GroupPrivateWorker).not_to receive(:perform_in)
@@ -135,7 +135,7 @@ RSpec.describe Groups::UpdateService do
let!(:service) { described_class.new(internal_group, user, visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
before do
- internal_group.add_user(user, Gitlab::Access::OWNER)
+ internal_group.add_member(user, Gitlab::Access::OWNER)
create(:project, :private, group: internal_group)
expect(TodosDestroyer::GroupPrivateWorker).to receive(:perform_in)
@@ -233,7 +233,7 @@ RSpec.describe Groups::UpdateService do
let!(:service) { described_class.new(internal_group, user, visibility_level: 99) }
before do
- internal_group.add_user(user, Gitlab::Access::MAINTAINER)
+ internal_group.add_member(user, Gitlab::Access::MAINTAINER)
end
it "does not change permission level" do
@@ -246,7 +246,7 @@ RSpec.describe Groups::UpdateService do
let(:service) { described_class.new(internal_group, user, emails_disabled: true) }
it 'updates the attribute' do
- internal_group.add_user(user, Gitlab::Access::OWNER)
+ internal_group.add_member(user, Gitlab::Access::OWNER)
expect { service.execute }.to change { internal_group.emails_disabled }.to(true)
end
@@ -280,7 +280,7 @@ RSpec.describe Groups::UpdateService do
let!(:service) { described_class.new(internal_group, user, path: SecureRandom.hex) }
before do
- internal_group.add_user(user, Gitlab::Access::MAINTAINER)
+ internal_group.add_member(user, Gitlab::Access::MAINTAINER)
create(:project, :internal, group: internal_group)
end
diff --git a/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb
index 731406613dd..4b0c8d9113c 100644
--- a/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb
+++ b/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb
@@ -7,14 +7,11 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::AfterUpdateServic
let_it_be(:escalation_status, reload: true) { create(:incident_management_issuable_escalation_status, :triggered) }
let_it_be(:issue, reload: true) { escalation_status.issue }
let_it_be(:project) { issue.project }
- let_it_be(:alert) { create(:alert_management_alert, issue: issue, project: project) }
- let(:status_event) { :acknowledge }
- let(:update_params) { { incident_management_issuable_escalation_status_attributes: { status_event: status_event } } }
let(:service) { IncidentManagement::IssuableEscalationStatuses::AfterUpdateService.new(issue, current_user) }
subject(:result) do
- issue.update!(update_params)
+ issue.update!(incident_management_issuable_escalation_status_attributes: update_params)
service.execute
end
@@ -22,46 +19,31 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::AfterUpdateServic
issue.project.add_developer(current_user)
end
- shared_examples 'does not attempt to update the alert' do
- specify do
- expect(::AlertManagement::Alerts::UpdateService).not_to receive(:new)
-
- expect(result).to be_success
- end
- end
-
- shared_examples 'adds a status change system note' do
- specify do
- expect { result }.to change { issue.reload.notes.count }.by(1)
- end
- end
-
context 'with status attributes' do
- it_behaves_like 'adds a status change system note'
-
- it 'updates the alert with the new alert status' do
- expect(::AlertManagement::Alerts::UpdateService).to receive(:new).once.and_call_original
- expect(described_class).to receive(:new).once.and_call_original
+ let(:status_event) { :acknowledge }
+ let(:update_params) { { status_event: status_event } }
- expect { result }.to change { escalation_status.reload.acknowledged? }.to(true)
- .and change { alert.reload.acknowledged? }.to(true)
+ it 'adds a status change system note' do
+ expect { result }.to change { issue.reload.notes.count }.by(1)
end
- context 'when incident is not associated with an alert' do
- before do
- alert.destroy!
- end
+ it 'adds a status change timeline event' do
+ expect(IncidentManagement::TimelineEvents::CreateService)
+ .to receive(:change_incident_status)
+ .with(issue, current_user, escalation_status)
+ .and_call_original
- it_behaves_like 'does not attempt to update the alert'
- it_behaves_like 'adds a status change system note'
+ expect { result }.to change { issue.reload.incident_management_timeline_events.count }.by(1)
end
+ end
- context 'when new status matches the current status' do
- let(:status_event) { :trigger }
-
- it_behaves_like 'does not attempt to update the alert'
+ context 'with non-status attributes' do
+ let(:update_params) { { updated_at: Time.current } }
- specify { expect { result }.not_to change { issue.reload.notes.count } }
+ it 'does not add a status change system note or timeline event' do
+ expect { result }
+ .to not_change { issue.reload.notes.count }
+ .and not_change { issue.reload.incident_management_timeline_events.count }
end
end
end
diff --git a/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb
index c20a0688ac2..b5c5238d483 100644
--- a/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb
+++ b/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb
@@ -11,10 +11,4 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::BuildService do
subject(:execute) { service.execute }
it_behaves_like 'initializes new escalation status with expected attributes'
-
- context 'with associated alert' do
- let_it_be(:alert) { create(:alert_management_alert, :acknowledged, project: project, issue: incident) }
-
- it_behaves_like 'initializes new escalation status with expected attributes', { status_event: :acknowledge }
- end
end
diff --git a/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb
index 2c7d330766c..b6ae03a19fe 100644
--- a/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb
+++ b/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb
@@ -27,19 +27,4 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::CreateService do
expect { execute }.not_to change { incident.reload.escalation_status }
end
end
-
- context 'with associated alert' do
- before do
- create(:alert_management_alert, :acknowledged, project: project, issue: incident)
- end
-
- it 'creates an escalation status matching the alert attributes' do
- expect { execute }.to change { incident.reload.escalation_status }.from(nil)
- expect(incident.escalation_status).to have_attributes(
- status_name: :acknowledged,
- policy_id: nil,
- escalations_started_at: nil
- )
- end
- end
end
diff --git a/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb
index 6c99631fcb0..761cc5c92ea 100644
--- a/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb
+++ b/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb
@@ -102,10 +102,4 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::PrepareUpdateServ
it_behaves_like 'successful response', { status_event: :acknowledge }
end
end
-
- context 'with status_change_reason param' do
- let(:params) { { status_change_reason: ' by changing the incident status' } }
-
- it_behaves_like 'successful response', { status_change_reason: ' by changing the incident status' }
- end
end
diff --git a/spec/services/incident_management/timeline_events/create_service_spec.rb b/spec/services/incident_management/timeline_events/create_service_spec.rb
index 133a644f243..a4e928b98f4 100644
--- a/spec/services/incident_management/timeline_events/create_service_spec.rb
+++ b/spec/services/incident_management/timeline_events/create_service_spec.rb
@@ -132,6 +132,40 @@ RSpec.describe IncidentManagement::TimelineEvents::CreateService do
it 'creates a system note' do
expect { execute }.to change { incident.notes.reload.count }.by(1)
end
+
+ context 'with auto_created param' do
+ let(:args) do
+ {
+ note: 'note',
+ occurred_at: Time.current,
+ action: 'new comment',
+ promoted_from_note: comment,
+ auto_created: auto_created
+ }
+ end
+
+ context 'when auto_created is true' do
+ let(:auto_created) { true }
+
+ it 'does not create a system note' do
+ expect { execute }.not_to change { incident.notes.reload.count }
+ end
+
+ context 'when user does not have permissions' do
+ let(:current_user) { user_without_permissions }
+
+ it_behaves_like 'success response'
+ end
+ end
+
+ context 'when auto_created is false' do
+ let(:auto_created) { false }
+
+ it 'creates a system note' do
+ expect { execute }.to change { incident.notes.reload.count }.by(1)
+ end
+ end
+ end
end
context 'when incident_timeline feature flag is disabled' do
@@ -144,4 +178,71 @@ RSpec.describe IncidentManagement::TimelineEvents::CreateService do
end
end
end
+
+ describe 'automatically created timeline events' do
+ shared_examples 'successfully created timeline event' do
+ it 'creates a timeline event', :aggregate_failures do
+ expect(execute).to be_success
+
+ result = execute.payload[:timeline_event]
+ expect(result).to be_a(::IncidentManagement::TimelineEvent)
+ expect(result.author).to eq(current_user)
+ expect(result.incident).to eq(incident)
+ expect(result.project).to eq(project)
+ expect(result.note).to eq(expected_note)
+ expect(result.editable).to eq(false)
+ expect(result.action).to eq(expected_action)
+ end
+
+ it_behaves_like 'an incident management tracked event', :incident_management_timeline_event_created
+
+ it 'successfully creates a database record', :aggregate_failures do
+ expect { execute }.to change { ::IncidentManagement::TimelineEvent.count }.by(1)
+ end
+
+ it 'does not create a system note' do
+ expect { execute }.not_to change { incident.notes.reload.count }
+ end
+ end
+
+ describe '.create_incident' do
+ subject(:execute) { described_class.create_incident(incident, current_user) }
+
+ let(:expected_note) { "@#{current_user.username} created the incident" }
+ let(:expected_action) { 'issues' }
+
+ it_behaves_like 'successfully created timeline event'
+ end
+
+ describe '.reopen_incident' do
+ subject(:execute) { described_class.reopen_incident(incident, current_user) }
+
+ let(:expected_note) { "@#{current_user.username} reopened the incident" }
+ let(:expected_action) { 'issues' }
+
+ it_behaves_like 'successfully created timeline event'
+ end
+
+ describe '.resolve_incident' do
+ subject(:execute) { described_class.resolve_incident(incident, current_user) }
+
+ let(:expected_note) { "@#{current_user.username} resolved the incident" }
+ let(:expected_action) { 'status' }
+
+ it_behaves_like 'successfully created timeline event'
+ end
+
+ describe '.change_incident_status' do
+ subject(:execute) { described_class.change_incident_status(incident, current_user, escalation_status) }
+
+ let(:escalation_status) do
+ instance_double('IncidentManagement::IssuableEscalationStatus', status_name: 'acknowledged')
+ end
+
+ let(:expected_note) { "@#{current_user.username} changed the incident status to **Acknowledged**" }
+ let(:expected_action) { 'status' }
+
+ it_behaves_like 'successfully created timeline event'
+ end
+ end
end
diff --git a/spec/services/incident_management/timeline_events/update_service_spec.rb b/spec/services/incident_management/timeline_events/update_service_spec.rb
index 3da533fb2a6..728f2fa3e9d 100644
--- a/spec/services/incident_management/timeline_events/update_service_spec.rb
+++ b/spec/services/incident_management/timeline_events/update_service_spec.rb
@@ -146,7 +146,8 @@ RSpec.describe IncidentManagement::TimelineEvents::UpdateService do
create(:incident_management_timeline_event, :non_editable, project: project, incident: incident)
end
- it_behaves_like 'error response', 'You cannot edit this timeline event.'
+ it_behaves_like 'error response',
+ 'You have insufficient permissions to manage timeline events for this incident'
end
end
@@ -155,7 +156,8 @@ RSpec.describe IncidentManagement::TimelineEvents::UpdateService do
project.add_reporter(user)
end
- it_behaves_like 'error response', 'You have insufficient permissions to manage timeline events for this incident'
+ it_behaves_like 'error response',
+ 'You have insufficient permissions to manage timeline events for this incident'
end
end
end
diff --git a/spec/services/issuable/clone/attributes_rewriter_spec.rb b/spec/services/issuable/clone/attributes_rewriter_spec.rb
deleted file mode 100644
index 7f434b8b246..00000000000
--- a/spec/services/issuable/clone/attributes_rewriter_spec.rb
+++ /dev/null
@@ -1,140 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Issuable::Clone::AttributesRewriter do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project1) { create(:project, :public, group: group) }
- let(:project2) { create(:project, :public, group: group) }
- let(:original_issue) { create(:issue, project: project1) }
- let(:new_issue) { create(:issue, project: project2) }
-
- subject { described_class.new(user, original_issue, new_issue) }
-
- context 'setting labels' do
- it 'sets labels present in the new project and group labels' do
- project1_label_1 = create(:label, title: 'label1', project: project1)
- project1_label_2 = create(:label, title: 'label2', project: project1)
- project2_label_1 = create(:label, title: 'label1', project: project2)
- group_label = create(:group_label, title: 'group_label', group: group)
- create(:label, title: 'label3', project: project2)
-
- original_issue.update!(labels: [project1_label_1, project1_label_2, group_label])
-
- subject.execute
-
- expect(new_issue.reload.labels).to match_array([project2_label_1, group_label])
- end
-
- it 'does not set any labels when not used on the original issue' do
- subject.execute
-
- expect(new_issue.reload.labels).to be_empty
- end
-
- it 'copies the resource label events' do
- resource_label_events = create_list(:resource_label_event, 2, issue: original_issue)
-
- subject.execute
-
- expected = resource_label_events.map(&:label_id)
-
- expect(new_issue.resource_label_events.map(&:label_id)).to match_array(expected)
- end
- end
-
- context 'setting milestones' do
- it 'sets milestone to nil when old issue milestone is not in the new project' do
- milestone = create(:milestone, title: 'milestone', project: project1)
-
- original_issue.update!(milestone: milestone)
-
- subject.execute
-
- expect(new_issue.reload.milestone).to be_nil
- end
-
- it 'copies the milestone when old issue milestone title is in the new project' do
- milestone_project1 = create(:milestone, title: 'milestone', project: project1)
- milestone_project2 = create(:milestone, title: 'milestone', project: project2)
-
- original_issue.update!(milestone: milestone_project1)
-
- subject.execute
-
- expect(new_issue.reload.milestone).to eq(milestone_project2)
- end
-
- it 'copies the milestone when old issue milestone is a group milestone' do
- milestone = create(:milestone, title: 'milestone', group: group)
-
- original_issue.update!(milestone: milestone)
-
- subject.execute
-
- expect(new_issue.reload.milestone).to eq(milestone)
- end
-
- context 'with existing milestone events' do
- let!(:milestone1_project1) { create(:milestone, title: 'milestone1', project: project1) }
- let!(:milestone2_project1) { create(:milestone, title: 'milestone2', project: project1) }
- let!(:milestone3_project1) { create(:milestone, title: 'milestone3', project: project1) }
-
- let!(:milestone1_project2) { create(:milestone, title: 'milestone1', project: project2) }
- let!(:milestone2_project2) { create(:milestone, title: 'milestone2', project: project2) }
-
- before do
- original_issue.update!(milestone: milestone2_project1)
-
- create_event(milestone1_project1)
- create_event(milestone2_project1)
- create_event(nil, 'remove')
- create_event(milestone3_project1)
- end
-
- it 'copies existing resource milestone events' do
- subject.execute
-
- new_issue_milestone_events = new_issue.reload.resource_milestone_events
- expect(new_issue_milestone_events.count).to eq(3)
-
- expect_milestone_event(new_issue_milestone_events.first, milestone: milestone1_project2, action: 'add', state: 'opened')
- expect_milestone_event(new_issue_milestone_events.second, milestone: milestone2_project2, action: 'add', state: 'opened')
- expect_milestone_event(new_issue_milestone_events.third, milestone: nil, action: 'remove', state: 'opened')
- end
-
- def create_event(milestone, action = 'add')
- create(:resource_milestone_event, issue: original_issue, milestone: milestone, action: action)
- end
-
- def expect_milestone_event(event, expected_attrs)
- expect(event.milestone_id).to eq(expected_attrs[:milestone]&.id)
- expect(event.action).to eq(expected_attrs[:action])
- expect(event.state).to eq(expected_attrs[:state])
- end
- end
-
- context 'with existing state events' do
- let!(:event1) { create(:resource_state_event, issue: original_issue, state: 'opened') }
- let!(:event2) { create(:resource_state_event, issue: original_issue, state: 'closed') }
- let!(:event3) { create(:resource_state_event, issue: original_issue, state: 'reopened') }
-
- it 'copies existing state events as expected' do
- subject.execute
-
- state_events = new_issue.reload.resource_state_events
- expect(state_events.size).to eq(3)
-
- expect_state_event(state_events.first, issue: new_issue, state: 'opened')
- expect_state_event(state_events.second, issue: new_issue, state: 'closed')
- expect_state_event(state_events.third, issue: new_issue, state: 'reopened')
- end
-
- def expect_state_event(event, expected_attrs)
- expect(event.issue_id).to eq(expected_attrs[:issue]&.id)
- expect(event.state).to eq(expected_attrs[:state])
- end
- end
- end
-end
diff --git a/spec/services/issues/clone_service_spec.rb b/spec/services/issues/clone_service_spec.rb
index abbcb1c1d48..858dfc4ab3a 100644
--- a/spec/services/issues/clone_service_spec.rb
+++ b/spec/services/issues/clone_service_spec.rb
@@ -82,12 +82,14 @@ RSpec.describe Issues::CloneService do
expect(new_issue.iid).to be_present
end
- it 'preserves create time' do
- expect(old_issue.created_at.strftime('%D')).to eq new_issue.created_at.strftime('%D')
- end
+ it 'sets created_at of new issue to the time of clone' do
+ future_time = 5.days.from_now
- it 'does not copy system notes' do
- expect(new_issue.notes.count).to eq(1)
+ travel_to(future_time) do
+ new_issue = clone_service.execute(old_issue, new_project, with_notes: with_notes)
+
+ expect(new_issue.created_at).to be_like_time(future_time)
+ end
end
it 'does not set moved_issue' do
@@ -105,6 +107,24 @@ RSpec.describe Issues::CloneService do
end
end
+ context 'issue with system notes and resource events' do
+ before do
+ create(:note, :system, noteable: old_issue, project: old_project)
+ create(:resource_label_event, label: create(:label, project: old_project), issue: old_issue)
+ create(:resource_state_event, issue: old_issue, state: :reopened)
+ create(:resource_milestone_event, issue: old_issue, action: 'remove', milestone_id: nil)
+ end
+
+ it 'does not copy system notes and resource events' do
+ new_issue = clone_service.execute(old_issue, new_project)
+
+ # 1 here is for the "cloned from" system note
+ expect(new_issue.notes.count).to eq(1)
+ expect(new_issue.resource_state_events).to be_empty
+ expect(new_issue.resource_milestone_events).to be_empty
+ end
+ end
+
context 'issue with award emoji' do
let!(:award_emoji) { create(:award_emoji, awardable: old_issue) }
@@ -124,14 +144,27 @@ RSpec.describe Issues::CloneService do
create(:issue, title: title, description: description, project: old_project, author: author, milestone: milestone)
end
- before do
- create(:resource_milestone_event, issue: old_issue, milestone: milestone, action: :add)
+ it 'copies the milestone and creates a resource_milestone_event' do
+ new_issue = clone_service.execute(old_issue, new_project)
+
+ expect(new_issue.milestone).to eq(milestone)
+ expect(new_issue.resource_milestone_events.count).to eq(1)
+ end
+ end
+
+ context 'issue with label' do
+ let(:label) { create(:group_label, group: sub_group_1) }
+ let(:new_project) { create(:project, namespace: sub_group_1) }
+
+ let(:old_issue) do
+ create(:issue, project: old_project, labels: [label])
end
- it 'does not create extra milestone events' do
+ it 'copies the label and creates a resource_label_event' do
new_issue = clone_service.execute(old_issue, new_project)
- expect(new_issue.resource_milestone_events.count).to eq(old_issue.resource_milestone_events.count)
+ expect(new_issue.labels).to contain_exactly(label)
+ expect(new_issue.resource_label_events.count).to eq(1)
end
end
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index 344da5a6582..e88fe1b42f0 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -122,14 +122,29 @@ RSpec.describe Issues::CloseService do
expect(new_note.author).to eq(user)
end
+ it 'adds a timeline event', :aggregate_failures do
+ expect(IncidentManagement::TimelineEvents::CreateService)
+ .to receive(:resolve_incident)
+ .with(issue, user)
+ .and_call_original
+
+ expect { service.execute(issue) }.to change { issue.incident_management_timeline_events.count }.by(1)
+ end
+
context 'when the escalation status did not change to resolved' do
let(:escalation_status) { instance_double('IncidentManagement::IssuableEscalationStatus', resolve: false) }
- it 'does not create a system note' do
+ before do
allow(issue).to receive(:incident_management_issuable_escalation_status).and_return(escalation_status)
+ end
+ it 'does not create a system note' do
expect { service.execute(issue) }.not_to change { issue.notes.count }
end
+
+ it 'does not create a timeline event' do
+ expect { service.execute(issue) }.not_to change { issue.incident_management_timeline_events.count }
+ end
end
end
end
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 9f006603f29..0bc8511e3e3 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -135,6 +135,14 @@ RSpec.describe Issues::CreateService do
issue
end
+ it 'calls IncidentManagement::TimelineEvents::CreateService.create_incident' do
+ expect(IncidentManagement::TimelineEvents::CreateService)
+ .to receive(:create_incident)
+ .with(a_kind_of(Issue), reporter)
+
+ issue
+ end
+
context 'when invalid' do
before do
opts.merge!(title: '')
@@ -489,6 +497,23 @@ RSpec.describe Issues::CreateService do
end
end
end
+
+ context 'with alert bot author' do
+ let_it_be(:user) { User.alert_bot }
+ let_it_be(:label) { create(:label, project: project) }
+
+ let(:opts) do
+ {
+ title: 'Title',
+ description: %(/label #{label.to_reference(format: :name)}")
+ }
+ end
+
+ it 'can apply labels' do
+ expect(issue).to be_persisted
+ expect(issue.labels).to eq([label])
+ end
+ end
end
context 'resolving discussions' do
diff --git a/spec/services/issues/import_csv_service_spec.rb b/spec/services/issues/import_csv_service_spec.rb
index fa40b75190f..9ad1d7dba9f 100644
--- a/spec/services/issues/import_csv_service_spec.rb
+++ b/spec/services/issues/import_csv_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Issues::ImportCsvService do
let(:project) { create(:project) }
let(:user) { create(:user) }
+ let(:assignee) { create(:user, username: 'csv_assignee') }
let(:service) do
uploader = FileUploader.new(project)
uploader.store!(file)
@@ -16,4 +17,27 @@ RSpec.describe Issues::ImportCsvService do
let(:issuables) { project.issues }
let(:email_method) { :import_issues_csv_email }
end
+
+ describe '#execute' do
+ let(:file) { fixture_file_upload('spec/fixtures/csv_complex.csv') }
+
+ subject { service.execute }
+
+ it 'sets all issueable attributes and executes quick actions' do
+ project.add_developer(user)
+ project.add_developer(assignee)
+
+ expect { subject }.to change { issuables.count }.by 3
+
+ expect(issuables.reload).to include(
+ have_attributes(
+ title: 'Title with quote"',
+ description: 'Description',
+ time_estimate: 3600,
+ assignees: include(assignee),
+ due_date: Date.new(2022, 6, 28)
+ )
+ )
+ end
+ end
end
diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb
index 56a3c22cd7f..5a1bb2e8b74 100644
--- a/spec/services/issues/move_service_spec.rb
+++ b/spec/services/issues/move_service_spec.rb
@@ -47,6 +47,7 @@ RSpec.describe Issues::MoveService do
it 'creates a new issue in a new project' do
expect(new_issue.project).to eq new_project
+ expect(new_issue.namespace_id).to eq new_project.project_namespace_id
end
it 'copies issue title' do
diff --git a/spec/services/issues/related_branches_service_spec.rb b/spec/services/issues/related_branches_service_spec.rb
index 7a4bae7f852..95d456c1b05 100644
--- a/spec/services/issues/related_branches_service_spec.rb
+++ b/spec/services/issues/related_branches_service_spec.rb
@@ -3,88 +3,47 @@
require 'spec_helper'
RSpec.describe Issues::RelatedBranchesService do
+ let_it_be(:project) { create(:project, :repository, :public, public_builds: false) }
let_it_be(:developer) { create(:user) }
- let_it_be(:issue) { create(:issue) }
+ let_it_be(:issue) { create(:issue, project: project) }
let(:user) { developer }
- subject { described_class.new(project: issue.project, current_user: user) }
+ subject { described_class.new(project: project, current_user: user) }
- before do
- issue.project.add_developer(developer)
+ before_all do
+ project.add_developer(developer)
end
describe '#execute' do
- let(:sha) { 'abcdef' }
- let(:repo) { issue.project.repository }
- let(:project) { issue.project }
let(:branch_info) { subject.execute(issue) }
- def make_branch
- double('Branch', dereferenced_target: double('Target', sha: sha))
- end
-
- before do
- allow(repo).to receive(:branch_names).and_return(branch_names)
- end
-
- context 'no branches are available' do
- let(:branch_names) { [] }
-
- it 'returns an empty array' do
- expect(branch_info).to be_empty
- end
- end
-
context 'branches are available' do
- let(:missing_branch) { "#{issue.to_branch_name}-missing" }
- let(:unreadable_branch_name) { "#{issue.to_branch_name}-unreadable" }
- let(:pipeline) { build(:ci_pipeline, :success, project: project) }
- let(:unreadable_pipeline) { build(:ci_pipeline, :running) }
-
- let(:branch_names) do
- [
- generate(:branch),
- "#{issue.iid}doesnt-match",
- issue.to_branch_name,
- missing_branch,
- unreadable_branch_name
- ]
- end
+ let_it_be(:pipeline) { create(:ci_pipeline, :success, project: project, ref: issue.to_branch_name) }
- before do
- {
- issue.to_branch_name => pipeline,
- unreadable_branch_name => unreadable_pipeline
- }.each do |name, pipeline|
- allow(repo).to receive(:find_branch).with(name).and_return(make_branch)
- allow(project).to receive(:latest_pipeline).with(name, sha).and_return(pipeline)
- end
+ before_all do
+ project.repository.create_branch(issue.to_branch_name, pipeline.sha)
+ project.repository.create_branch("#{issue.iid}doesnt-match", project.repository.root_ref)
+ project.repository.create_branch("#{issue.iid}-0-stable", project.repository.root_ref)
- allow(repo).to receive(:find_branch).with(missing_branch).and_return(nil)
+ project.repository.add_tag(developer, issue.to_branch_name, pipeline.sha)
end
- it 'selects relevant branches, along with pipeline status where available' do
- expect(branch_info).to contain_exactly(
- { name: issue.to_branch_name, pipeline_status: an_instance_of(Gitlab::Ci::Status::Success) },
- { name: missing_branch, pipeline_status: be_nil },
- { name: unreadable_branch_name, pipeline_status: be_nil }
- )
+ context 'when user has access to pipelines' do
+ it 'selects relevant branches, along with pipeline status' do
+ expect(branch_info).to contain_exactly(
+ { name: issue.to_branch_name, pipeline_status: an_instance_of(Gitlab::Ci::Status::Success) }
+ )
+ end
end
- context 'the user has access to otherwise unreadable pipelines' do
- let(:user) { create(:admin) }
+ context 'when user does not have access to pipelines' do
+ let(:user) { create(:user) }
- context 'when admin mode is enabled', :enable_admin_mode do
- it 'returns info a developer could not see' do
- expect(branch_info.pluck(:pipeline_status)).to include(an_instance_of(Gitlab::Ci::Status::Running))
- end
- end
-
- context 'when admin mode is disabled' do
- it 'does not return info a developer could not see' do
- expect(branch_info.pluck(:pipeline_status)).not_to include(an_instance_of(Gitlab::Ci::Status::Running))
- end
+ it 'returns branches without pipeline status' do
+ expect(branch_info).to contain_exactly(
+ { name: issue.to_branch_name, pipeline_status: nil }
+ )
end
end
@@ -103,10 +62,10 @@ RSpec.describe Issues::RelatedBranchesService do
end
end
- context 'one of the branches is stable' do
- let(:branch_names) { ["#{issue.iid}-0-stable"] }
+ context 'no branches are available' do
+ let(:project) { create(:project, :empty_repo) }
- it 'is excluded' do
+ it 'returns an empty array' do
expect(branch_info).to be_empty
end
end
diff --git a/spec/services/issues/reopen_service_spec.rb b/spec/services/issues/reopen_service_spec.rb
index c9469b861ac..477b44f4c2c 100644
--- a/spec/services/issues/reopen_service_spec.rb
+++ b/spec/services/issues/reopen_service_spec.rb
@@ -33,6 +33,8 @@ RSpec.describe Issues::ReopenService do
context 'when user is authorized to reopen issue' do
let(:user) { create(:user) }
+ subject(:execute) { described_class.new(project: project, current_user: user).execute(issue) }
+
before do
project.add_maintainer(user)
end
@@ -41,14 +43,12 @@ RSpec.describe Issues::ReopenService do
issue.assignees << user
expect_any_instance_of(User).to receive(:invalidate_issue_cache_counts)
- described_class.new(project: project, current_user: user).execute(issue)
+ execute
end
it 'refreshes the number of opened issues' do
- service = described_class.new(project: project, current_user: user)
-
expect do
- service.execute(issue)
+ execute
BatchLoader::Executor.clear_current
end.to change { project.open_issues_count }.from(0).to(1)
@@ -61,16 +61,27 @@ RSpec.describe Issues::ReopenService do
expect(service).to receive(:delete_cache).and_call_original
end
- described_class.new(project: project, current_user: user).execute(issue)
+ execute
+ end
+
+ it 'does not create timeline event' do
+ expect { execute }.not_to change { issue.incident_management_timeline_events.count }
end
context 'issue is incident type' do
let(:issue) { create(:incident, :closed, project: project) }
let(:current_user) { user }
- subject { described_class.new(project: project, current_user: user).execute(issue) }
-
it_behaves_like 'an incident management tracked event', :incident_management_incident_reopened
+
+ it 'creates a timeline event' do
+ expect(IncidentManagement::TimelineEvents::CreateService)
+ .to receive(:reopen_incident)
+ .with(issue, current_user)
+ .and_call_original
+
+ expect { execute }.to change { issue.incident_management_timeline_events.count }.by(1)
+ end
end
context 'when issue is not confidential' do
@@ -78,18 +89,18 @@ RSpec.describe Issues::ReopenService 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)
- described_class.new(project: project, current_user: user).execute(issue)
+ execute
end
end
context 'when issue is confidential' do
- it 'executes confidential issue hooks' do
- issue = create(:issue, :confidential, :closed, project: project)
+ let(:issue) { create(:issue, :confidential, :closed, project: project) }
+ 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_integrations).with(an_instance_of(Hash), :confidential_issue_hooks)
- described_class.new(project: project, current_user: user).execute(issue)
+ execute
end
end
end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index d11fe772023..e2e8828ae89 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -1146,11 +1146,11 @@ RSpec.describe Issues::UpdateService, :mailer do
let(:opts) { { escalation_status: { status: 'acknowledged' } } }
let(:escalation_update_class) { ::IncidentManagement::IssuableEscalationStatuses::AfterUpdateService }
- shared_examples 'updates the escalation status record' do |expected_status, expected_reason = nil|
+ shared_examples 'updates the escalation status record' do |expected_status|
let(:service_double) { instance_double(escalation_update_class) }
it 'has correct value' do
- expect(escalation_update_class).to receive(:new).with(issue, user, status_change_reason: expected_reason).and_return(service_double)
+ expect(escalation_update_class).to receive(:new).with(issue, user).and_return(service_double)
expect(service_double).to receive(:execute)
update_issue(opts)
@@ -1193,23 +1193,6 @@ RSpec.describe Issues::UpdateService, :mailer do
it_behaves_like 'updates the escalation status record', :acknowledged
- context 'with associated alert' do
- let!(:alert) { create(:alert_management_alert, issue: issue, project: project) }
-
- it 'syncs the update back to the alert' do
- update_issue(opts)
-
- expect(issue.escalation_status.status_name).to eq(:acknowledged)
- expect(alert.reload.status_name).to eq(:acknowledged)
- end
- end
-
- context 'with a status change reason provided' do
- let(:opts) { { escalation_status: { status: 'acknowledged', status_change_reason: ' by changing the alert status' } } }
-
- it_behaves_like 'updates the escalation status record', :acknowledged, ' by changing the alert status'
- end
-
context 'with unsupported status value' do
let(:opts) { { escalation_status: { status: 'unsupported-status' } } }
diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb
index e79e13af769..fe9f3ddc14d 100644
--- a/spec/services/members/create_service_spec.rb
+++ b/spec/services/members/create_service_spec.rb
@@ -146,12 +146,14 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when passing an existing invite user id' do
- let(:user_id) { create(:project_member, :invited, project: source).invite_email }
+ let(:invited_member) { create(:project_member, :guest, :invited, project: source) }
+ let(:user_id) { invited_member.invite_email }
+ let(:access_level) { ProjectMember::MAINTAINER }
- it 'does not add a member' do
- expect(execute_service[:status]).to eq(:error)
- expect(execute_service[:message]).to eq("The member's email address has already been taken")
- expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(false)
+ it 'allows already invited members to be re-invited by email and updates the member access' do
+ expect(execute_service[:status]).to eq(:success)
+ expect(invited_member.reset.access_level).to eq ProjectMember::MAINTAINER
+ expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(true)
end
end
diff --git a/spec/services/members/creator_service_spec.rb b/spec/services/members/creator_service_spec.rb
index 8b1df2ab86d..ad4c649086b 100644
--- a/spec/services/members/creator_service_spec.rb
+++ b/spec/services/members/creator_service_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Members::CreatorService do
describe '#execute' do
it 'raises error for new member on authorization check implementation' do
expect do
- described_class.add_user(source, user, :maintainer, current_user: current_user)
+ described_class.add_member(source, user, :maintainer, current_user: current_user)
end.to raise_error(NotImplementedError)
end
@@ -19,7 +19,7 @@ RSpec.describe Members::CreatorService do
source.add_developer(user)
expect do
- described_class.add_user(source, user, :maintainer, current_user: current_user)
+ described_class.add_member(source, user, :maintainer, current_user: current_user)
end.to raise_error(NotImplementedError)
end
end
diff --git a/spec/services/members/groups/creator_service_spec.rb b/spec/services/members/groups/creator_service_spec.rb
index b80b7998eac..4130fbd44fa 100644
--- a/spec/services/members/groups/creator_service_spec.rb
+++ b/spec/services/members/groups/creator_service_spec.rb
@@ -14,13 +14,13 @@ RSpec.describe Members::Groups::CreatorService do
it_behaves_like 'owner management'
- describe '.add_users' do
+ describe '.add_members' do
it_behaves_like 'bulk member creation' do
let_it_be(:member_type) { GroupMember }
end
end
- describe '.add_user' do
+ describe '.add_member' do
it_behaves_like 'member creation' do
let_it_be(:member_type) { GroupMember }
end
@@ -30,7 +30,7 @@ RSpec.describe Members::Groups::CreatorService do
expect(AuthorizedProjectsWorker).to receive(:bulk_perform_and_wait).once
1.upto(3) do
- described_class.add_user(source, user, :maintainer)
+ described_class.add_member(source, user, :maintainer)
end
end
end
diff --git a/spec/services/members/invite_member_builder_spec.rb b/spec/services/members/invite_member_builder_spec.rb
new file mode 100644
index 00000000000..52de65364c4
--- /dev/null
+++ b/spec/services/members/invite_member_builder_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Members::InviteMemberBuilder do
+ let_it_be(:source) { create(:group) }
+ let_it_be(:existing_member) { create(:group_member) }
+
+ let(:existing_members) { { existing_member.user.id => existing_member } }
+
+ describe '#execute' do
+ context 'when user record found by email' do
+ it 'returns member from existing members hash' do
+ expect(described_class.new(source, existing_member.user.email, existing_members).execute).to eq existing_member
+ end
+
+ it 'builds a new member' do
+ user = create(:user)
+
+ member = described_class.new(source, user.email, existing_members).execute
+
+ expect(member).to be_new_record
+ expect(member.user).to eq user
+ end
+ end
+ end
+
+ context 'when no existing users found by the email' do
+ it 'finds existing member' do
+ member = create(:group_member, :invited, source: source)
+
+ expect(described_class.new(source, member.invite_email, existing_members).execute).to eq member
+ end
+
+ it 'builds a new member' do
+ email = 'test@example.com'
+
+ member = described_class.new(source, email, existing_members).execute
+
+ expect(member).to be_new_record
+ expect(member.invite_email).to eq email
+ end
+ end
+end
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index a948041479b..7a1512970b4 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -353,15 +353,16 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
context 'when member already exists' do
context 'with email' do
- let!(:invited_member) { create(:project_member, :invited, project: project) }
- let(:params) { { email: "#{invited_member.invite_email},#{project_user.email}" } }
+ let!(:invited_member) { create(:project_member, :guest, :invited, project: project) }
+ let(:params) do
+ { email: "#{invited_member.invite_email},#{project_user.email}", access_level: ProjectMember::MAINTAINER }
+ end
- it 'adds new email and returns an error for the already invited email' do
+ it 'adds new email and allows already invited members to be re-invited by email and updates the member access' do
expect_to_create_members(count: 1)
- expect(result[:status]).to eq(:error)
- expect(result[:message][invited_member.invite_email])
- .to eq("The member's email address has already been taken")
+ expect(result[:status]).to eq(:success)
expect(project.users).to include project_user
+ expect(invited_member.reset.access_level).to eq ProjectMember::MAINTAINER
end
end
diff --git a/spec/services/members/projects/creator_service_spec.rb b/spec/services/members/projects/creator_service_spec.rb
index 38955122ab0..8304bee2ffc 100644
--- a/spec/services/members/projects/creator_service_spec.rb
+++ b/spec/services/members/projects/creator_service_spec.rb
@@ -14,13 +14,13 @@ RSpec.describe Members::Projects::CreatorService do
it_behaves_like 'owner management'
- describe '.add_users' do
+ describe '.add_members' do
it_behaves_like 'bulk member creation' do
let_it_be(:member_type) { ProjectMember }
end
end
- describe '.add_user' do
+ describe '.add_member' do
it_behaves_like 'member creation' do
let_it_be(:member_type) { ProjectMember }
end
@@ -30,7 +30,7 @@ RSpec.describe Members::Projects::CreatorService do
expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to receive(:bulk_perform_in).once
1.upto(3) do
- described_class.add_user(source, user, :maintainer)
+ described_class.add_member(source, user, :maintainer)
end
end
end
diff --git a/spec/services/members/standard_member_builder_spec.rb b/spec/services/members/standard_member_builder_spec.rb
new file mode 100644
index 00000000000..16daff53d31
--- /dev/null
+++ b/spec/services/members/standard_member_builder_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Members::StandardMemberBuilder do
+ let_it_be(:source) { create(:group) }
+ let_it_be(:existing_member) { create(:group_member) }
+
+ let(:existing_members) { { existing_member.user.id => existing_member } }
+
+ describe '#execute' do
+ it 'returns member from existing members hash' do
+ expect(described_class.new(source, existing_member.user, existing_members).execute).to eq existing_member
+ end
+
+ it 'builds a new member' do
+ user = create(:user)
+
+ member = described_class.new(source, user, existing_members).execute
+
+ expect(member).to be_new_record
+ expect(member.user).to eq user
+ end
+ end
+end
diff --git a/spec/services/merge_requests/approval_service_spec.rb b/spec/services/merge_requests/approval_service_spec.rb
index e500102a00c..e1fbb945ee3 100644
--- a/spec/services/merge_requests/approval_service_spec.rb
+++ b/spec/services/merge_requests/approval_service_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe MergeRequests::ApprovalService do
it 'tracks merge request approve action' do
expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
- .to receive(:track_approve_mr_action).with(user: user)
+ .to receive(:track_approve_mr_action).with(user: user, merge_request: merge_request)
service.execute(merge_request)
end
diff --git a/spec/services/merge_requests/create_pipeline_service_spec.rb b/spec/services/merge_requests/create_pipeline_service_spec.rb
index 08ad05b54da..03a37ea59a3 100644
--- a/spec/services/merge_requests/create_pipeline_service_spec.rb
+++ b/spec/services/merge_requests/create_pipeline_service_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe MergeRequests::CreatePipelineService do
let(:params) { {} }
before do
- stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: false)
project.add_developer(user)
end
@@ -92,16 +91,6 @@ RSpec.describe MergeRequests::CreatePipelineService do
end
end
end
-
- context 'when ci_disallow_to_create_merge_request_pipelines_in_target_project feature flag is enabled' do
- before do
- stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: true)
- end
-
- it 'creates a pipeline in the source project' do
- expect(response.payload.project).to eq(source_project)
- end
- end
end
context 'when actor has permission to create pipelines in forked project' do
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
index c0c56a72192..9c9bcb79990 100644
--- a/spec/services/merge_requests/create_service_spec.rb
+++ b/spec/services/merge_requests/create_service_spec.rb
@@ -212,7 +212,6 @@ RSpec.describe MergeRequests::CreateService, :clean_gitlab_redis_shared_state do
end
before do
- stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: false)
target_project.add_developer(user2)
target_project.add_maintainer(user)
end
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index eecf7c21cba..4b7dd84474a 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -243,6 +243,25 @@ RSpec.describe MergeRequests::RefreshService do
end
end
+ context 'when ci.skip push_options are passed' do
+ let(:params) { { push_options: { ci: { skip: true } } } }
+ let(:service_instance) { service.new(project: project, current_user: @user, params: params) }
+
+ subject { service_instance.execute(@oldrev, @newrev, ref) }
+
+ it 'creates a skipped detached merge request pipeline with commits' do
+ expect { subject }
+ .to change { @merge_request.pipelines_for_merge_request.count }.by(1)
+ .and change { @another_merge_request.pipelines_for_merge_request.count }.by(0)
+
+ expect(@merge_request.has_commits?).to be_truthy
+ expect(@another_merge_request.has_commits?).to be_falsy
+
+ pipeline = @merge_request.pipelines_for_merge_request.last
+ expect(pipeline).to be_skipped
+ end
+ end
+
it 'does not create detached merge request pipeline for forked project' do
expect { subject }
.not_to change { @fork_merge_request.pipelines_for_merge_request.count }
@@ -267,10 +286,6 @@ RSpec.describe MergeRequests::RefreshService do
context 'when service runs on forked project' do
let(:project) { @fork_project }
- before do
- stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: false)
- end
-
it 'creates detached merge request pipeline for fork merge request' do
expect { subject }
.to change { @fork_merge_request.pipelines_for_merge_request.count }.by(1)
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 7164ba8fac0..212f75d853f 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -845,6 +845,8 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
end
context 'when the draft status is changed' do
+ let(:title) { 'New Title' }
+ let(:draft_title) { "Draft: #{title}" }
let!(:non_subscriber) { create(:user) }
let!(:subscriber) do
create(:user) { |u| merge_request.toggle_subscription(u, project) }
@@ -857,7 +859,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
context 'removing draft status' do
before do
- merge_request.update_attribute(:title, 'Draft: New Title')
+ merge_request.update_attribute(:title, draft_title)
end
it 'sends notifications for subscribers', :sidekiq_might_not_need_inline do
@@ -870,9 +872,22 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
should_email(subscriber)
should_not_email(non_subscriber)
end
+
+ context 'when removing through wip_event param' do
+ it 'removes Draft from the title' do
+ expect { update_merge_request({ wip_event: "ready" }) }
+ .to change { merge_request.title }
+ .from(draft_title)
+ .to(title)
+ end
+ end
end
context 'adding draft status' do
+ before do
+ merge_request.update_attribute(:title, title)
+ end
+
it 'does not send notifications', :sidekiq_might_not_need_inline do
opts = { title: 'Draft: New title' }
@@ -883,6 +898,15 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
should_not_email(subscriber)
should_not_email(non_subscriber)
end
+
+ context 'when adding through wip_event param' do
+ it 'adds Draft to the title' do
+ expect { update_merge_request({ wip_event: "draft" }) }
+ .to change { merge_request.title }
+ .from(title)
+ .to(draft_title)
+ 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 de84666ca1d..b44c256802f 100644
--- a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
+++ b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
@@ -54,7 +54,6 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
:team | 1 | { created_at: frozen_time - 2.days, git_write_at: frozen_time - 2.days, pipeline_created_at: frozen_time - 2.days, trial_started_at: frozen_time - 2.days }
:team | 5 | { created_at: frozen_time - 6.days, git_write_at: frozen_time - 6.days, pipeline_created_at: frozen_time - 6.days, trial_started_at: frozen_time - 6.days }
:team | 10 | { created_at: frozen_time - 11.days, git_write_at: frozen_time - 11.days, pipeline_created_at: frozen_time - 11.days, trial_started_at: frozen_time - 11.days }
- :experience | 30 | { created_at: frozen_time - 31.days, git_write_at: frozen_time - 31.days }
end
with_them do
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 032f35cfc29..98fe8a40c61 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -147,6 +147,34 @@ RSpec.describe NotificationService, :mailer do
end
end
+ shared_examples 'participating by confidential note notification' do
+ context 'when user is mentioned on confidential note' do
+ let_it_be(:guest_1) { create(:user) }
+ let_it_be(:guest_2) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+
+ before do
+ issuable.resource_parent.add_guest(guest_1)
+ issuable.resource_parent.add_guest(guest_2)
+ issuable.resource_parent.add_reporter(reporter)
+ end
+
+ it 'only emails authorized users' do
+ confidential_note_text = "#{guest_1.to_reference} and #{guest_2.to_reference} and #{reporter.to_reference}"
+ note_text = "Mentions #{guest_2.to_reference}"
+ create(:note_on_issue, noteable: issuable, project_id: project.id, note: confidential_note_text, confidential: true)
+ create(:note_on_issue, noteable: issuable, project_id: project.id, note: note_text)
+ reset_delivered_emails!
+
+ notification_trigger
+
+ should_not_email(guest_1)
+ should_email(guest_2)
+ should_email(reporter)
+ end
+ end
+ end
+
shared_examples 'participating by assignee notification' do
it 'emails the participant' do
issuable.assignees << participant
@@ -554,8 +582,8 @@ RSpec.describe NotificationService, :mailer do
before do
note.project.namespace_id = group.id
- group.add_user(@u_watcher, GroupMember::MAINTAINER)
- group.add_user(@u_custom_global, GroupMember::MAINTAINER)
+ group.add_member(@u_watcher, GroupMember::MAINTAINER)
+ group.add_member(@u_custom_global, GroupMember::MAINTAINER)
note.project.save!
@u_watcher.notification_settings_for(note.project).participating!
@@ -736,6 +764,20 @@ RSpec.describe NotificationService, :mailer do
let(:notification_target) { note }
let(:notification_trigger) { notification.new_note(note) }
end
+
+ context 'when note is confidential' do
+ let(:note) { create(:note_on_issue, author: author, noteable: issue, project_id: issue.project_id, note: '@all mentioned', confidential: true) }
+ let(:guest) { create(:user) }
+
+ it 'does not notify users that cannot read note' do
+ project.add_guest(guest)
+ reset_delivered_emails!
+
+ notification.new_note(note)
+
+ should_not_email(guest)
+ end
+ end
end
end
@@ -1376,6 +1418,11 @@ RSpec.describe NotificationService, :mailer do
let(:notification_trigger) { notification.reassigned_issue(issue, @u_disabled, [assignee]) }
end
+ it_behaves_like 'participating by confidential note notification' do
+ let(:issuable) { issue }
+ let(:notification_trigger) { notification.reassigned_issue(issue, @u_disabled, [assignee]) }
+ end
+
it_behaves_like 'project emails are disabled' do
let(:notification_target) { issue }
let(:notification_trigger) { notification.reassigned_issue(issue, @u_disabled, [assignee]) }
@@ -1494,6 +1541,11 @@ RSpec.describe NotificationService, :mailer do
let(:notification_target) { issue }
let(:notification_trigger) { notification.removed_milestone_issue(issue, issue.author) }
end
+
+ it_behaves_like 'participating by confidential note notification' do
+ let(:issuable) { issue }
+ let(:notification_trigger) { notification.removed_milestone_issue(issue, issue.author) }
+ end
end
context 'confidential issues' do
@@ -1616,6 +1668,11 @@ RSpec.describe NotificationService, :mailer do
let(:notification_trigger) { notification.close_issue(issue, @u_disabled) }
end
+ it_behaves_like 'participating by confidential note notification' do
+ let(:issuable) { issue }
+ let(:notification_trigger) { notification.close_issue(issue, @u_disabled) }
+ end
+
it 'adds "subscribed" reason to subscriber emails' do
user_1 = create(:user)
issue.subscribe(user_1)
@@ -1658,6 +1715,11 @@ RSpec.describe NotificationService, :mailer do
let(:notification_trigger) { notification.reopen_issue(issue, @u_disabled) }
end
+ it_behaves_like 'participating by confidential note notification' do
+ let(:issuable) { issue }
+ let(:notification_trigger) { notification.reopen_issue(issue, @u_disabled) }
+ end
+
it_behaves_like 'project emails are disabled' do
let(:notification_target) { issue }
let(:notification_trigger) { notification.reopen_issue(issue, @u_disabled) }
@@ -1689,6 +1751,11 @@ RSpec.describe NotificationService, :mailer do
let(:notification_trigger) { notification.issue_moved(issue, new_issue, @u_disabled) }
end
+ it_behaves_like 'participating by confidential note notification' do
+ let(:issuable) { issue }
+ let(:notification_trigger) { notification.issue_moved(issue, new_issue, @u_disabled) }
+ end
+
it_behaves_like 'project emails are disabled' do
let(:notification_target) { issue }
let(:notification_trigger) { notification.issue_moved(issue, new_issue, @u_disabled) }
@@ -1720,6 +1787,11 @@ RSpec.describe NotificationService, :mailer do
let(:notification_trigger) { notification.issue_cloned(issue, new_issue, @u_disabled) }
end
+ it_behaves_like 'participating by confidential note notification' do
+ let(:issuable) { issue }
+ let(:notification_trigger) { notification.issue_cloned(issue, new_issue, @u_disabled) }
+ end
+
it_behaves_like 'project emails are disabled' do
let(:notification_target) { issue }
let(:notification_trigger) { notification.issue_cloned(issue, new_issue, @u_disabled) }
@@ -1765,6 +1837,11 @@ RSpec.describe NotificationService, :mailer do
let(:notification_trigger) { notification.issue_due(issue) }
end
+ it_behaves_like 'participating by confidential note notification' do
+ let(:issuable) { issue }
+ let(:notification_trigger) { notification.issue_due(issue) }
+ end
+
it_behaves_like 'project emails are disabled' do
let(:notification_target) { issue }
let(:notification_trigger) { notification.issue_due(issue) }
@@ -3773,7 +3850,7 @@ RSpec.describe NotificationService, :mailer do
# Group member: global=watch, group=global
@g_global_watcher ||= create_global_setting_for(create(:user), :watch)
- group.add_users([@g_watcher, @g_global_watcher], :maintainer)
+ group.add_members([@g_watcher, @g_global_watcher], :maintainer)
group
end
diff --git a/spec/services/packages/cleanup/execute_policy_service_spec.rb b/spec/services/packages/cleanup/execute_policy_service_spec.rb
new file mode 100644
index 00000000000..93335c4a821
--- /dev/null
+++ b/spec/services/packages/cleanup/execute_policy_service_spec.rb
@@ -0,0 +1,163 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Packages::Cleanup::ExecutePolicyService do
+ let_it_be(:project) { create(:project) }
+ let_it_be_with_reload(:policy) { create(:packages_cleanup_policy, project: project) }
+
+ let(:service) { described_class.new(policy) }
+
+ describe '#execute' do
+ subject(:execute) { service.execute }
+
+ context 'with the keep_n_duplicated_files parameter' do
+ let_it_be(:package1) { create(:package, project: project) }
+ let_it_be(:package2) { create(:package, project: project) }
+ let_it_be(:package3) { create(:package, project: project) }
+ let_it_be(:package4) { create(:package, :pending_destruction, project: project) }
+
+ let_it_be(:package_file1_1) { create(:package_file, package: package1, file_name: 'file_name1') }
+ let_it_be(:package_file1_2) { create(:package_file, package: package1, file_name: 'file_name1') }
+ let_it_be(:package_file1_3) { create(:package_file, package: package1, file_name: 'file_name1') }
+
+ let_it_be(:package_file1_4) { create(:package_file, package: package1, file_name: 'file_name2') }
+ let_it_be(:package_file1_5) { create(:package_file, package: package1, file_name: 'file_name2') }
+ let_it_be(:package_file1_6) { create(:package_file, package: package1, file_name: 'file_name2') }
+ let_it_be(:package_file1_7) do
+ create(:package_file, :pending_destruction, package: package1, file_name: 'file_name2')
+ end
+
+ let_it_be(:package_file2_1) { create(:package_file, package: package2, file_name: 'file_name1') }
+ let_it_be(:package_file2_2) { create(:package_file, package: package2, file_name: 'file_name1') }
+ let_it_be(:package_file2_3) { create(:package_file, package: package2, file_name: 'file_name1') }
+ let_it_be(:package_file2_4) { create(:package_file, package: package2, file_name: 'file_name1') }
+
+ let_it_be(:package_file3_1) { create(:package_file, package: package3, file_name: 'file_name_test') }
+
+ let_it_be(:package_file4_1) { create(:package_file, package: package4, file_name: 'file_name1') }
+ let_it_be(:package_file4_2) { create(:package_file, package: package4, file_name: 'file_name1') }
+
+ let(:package_files_1) { package1.package_files.installable }
+ let(:package_files_2) { package2.package_files.installable }
+ let(:package_files_3) { package3.package_files.installable }
+
+ context 'set to less than the total number of duplicated files' do
+ before do
+ # for each package file duplicate, we keep only the most recent one
+ policy.update!(keep_n_duplicated_package_files: '1')
+ end
+
+ shared_examples 'keeping the most recent package files' do
+ let(:response_payload) do
+ {
+ counts: {
+ marked_package_files_total_count: 7,
+ unique_package_id_and_file_name_total_count: 3
+ },
+ timeout: false
+ }
+ end
+
+ it 'only keeps the most recent package files' do
+ expect { execute }.to change { ::Packages::PackageFile.installable.count }.by(-7)
+
+ expect(package_files_1).to contain_exactly(package_file1_3, package_file1_6)
+ expect(package_files_2).to contain_exactly(package_file2_4)
+ expect(package_files_3).to contain_exactly(package_file3_1)
+
+ expect(execute).to be_success
+ expect(execute.message).to eq("Packages cleanup policy executed for project #{project.id}")
+ expect(execute.payload).to eq(response_payload)
+ end
+ end
+
+ it_behaves_like 'keeping the most recent package files'
+
+ context 'when the service needs to loop' do
+ before do
+ stub_const("#{described_class.name}::DUPLICATED_FILES_BATCH_SIZE", 2)
+ end
+
+ it_behaves_like 'keeping the most recent package files' do
+ before do
+ expect(::Packages::MarkPackageFilesForDestructionService)
+ .to receive(:new).exactly(3).times.and_call_original
+ end
+ end
+
+ context 'when a timeout is hit' do
+ let(:response_payload) do
+ {
+ counts: {
+ marked_package_files_total_count: 4,
+ unique_package_id_and_file_name_total_count: 3
+ },
+ timeout: true
+ }
+ end
+
+ let(:service_timeout_response) do
+ ServiceResponse.error(
+ message: 'Timeout while marking package files as pending destruction',
+ payload: { marked_package_files_count: 0 }
+ )
+ end
+
+ before do
+ mock_service_timeout(on_iteration: 3)
+ end
+
+ it 'keeps part of the most recent package files' do
+ expect { execute }
+ .to change { ::Packages::PackageFile.installable.count }.by(-4)
+ .and not_change { package_files_2.count } # untouched because of the timeout
+ .and not_change { package_files_3.count } # untouched because of the timeout
+
+ expect(package_files_1).to contain_exactly(package_file1_3, package_file1_6)
+ expect(execute).to be_success
+ expect(execute.message).to eq("Packages cleanup policy executed for project #{project.id}")
+ expect(execute.payload).to eq(response_payload)
+ end
+
+ def mock_service_timeout(on_iteration:)
+ execute_call_count = 1
+ expect_next_instances_of(::Packages::MarkPackageFilesForDestructionService, 3) do |service|
+ expect(service).to receive(:execute).and_wrap_original do |m, *args|
+ # timeout if we are on the right iteration
+ if execute_call_count == on_iteration
+ service_timeout_response
+ else
+ execute_call_count += 1
+ m.call(*args)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+
+ context 'set to more than the total number of duplicated files' do
+ before do
+ # using the biggest value for keep_n_duplicated_package_files
+ policy.update!(keep_n_duplicated_package_files: '50')
+ end
+
+ it 'keeps all package files' do
+ expect { execute }.not_to change { ::Packages::PackageFile.installable.count }
+ end
+ end
+
+ context 'set to all' do
+ before do
+ policy.update!(keep_n_duplicated_package_files: 'all')
+ end
+
+ it 'skips the policy' do
+ expect(::Packages::MarkPackageFilesForDestructionService).not_to receive(:new)
+ expect { execute }.not_to change { ::Packages::PackageFile.installable.count }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/packages/debian/create_package_file_service_spec.rb b/spec/services/packages/debian/create_package_file_service_spec.rb
index 74b97a4f941..c8292b2d5c2 100644
--- a/spec/services/packages/debian/create_package_file_service_spec.rb
+++ b/spec/services/packages/debian/create_package_file_service_spec.rb
@@ -102,5 +102,13 @@ RSpec.describe Packages::Debian::CreatePackageFileService do
expect { subject.execute }.to raise_error(ActiveRecord::RecordInvalid)
end
end
+
+ context 'FIPS mode enabled', :fips_mode do
+ let(:file) { nil }
+
+ it 'raises an error' do
+ expect { subject.execute }.to raise_error(::Packages::FIPS::DisabledError)
+ end
+ end
end
end
diff --git a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb
index ced846866c2..4765e6c3bd4 100644
--- a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb
+++ b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb
@@ -13,6 +13,12 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do
subject { service.execute }
+ context 'with FIPS mode enabled', :fips_mode do
+ it 'raises an error' do
+ expect { subject }.to raise_error(::Packages::FIPS::DisabledError)
+ end
+ end
+
context 'with valid package file' do
it 'extract metadata', :aggregate_failures do
expected_fields = { 'Architecture' => 'source amd64', 'Binary' => 'libsample0 sample-dev sample-udeb' }
diff --git a/spec/services/packages/debian/generate_distribution_service_spec.rb b/spec/services/packages/debian/generate_distribution_service_spec.rb
index 53805d03655..fe5fbfbbe1f 100644
--- a/spec/services/packages/debian/generate_distribution_service_spec.rb
+++ b/spec/services/packages/debian/generate_distribution_service_spec.rb
@@ -15,6 +15,12 @@ RSpec.describe Packages::Debian::GenerateDistributionService do
context "for #{container_type}" do
include_context 'with Debian distribution', container_type
+ context 'with FIPS mode enabled', :fips_mode do
+ it 'raises an error' do
+ expect { subject }.to raise_error(::Packages::FIPS::DisabledError)
+ end
+ end
+
it_behaves_like 'Generate Debian Distribution and component files'
end
end
diff --git a/spec/services/packages/mark_package_files_for_destruction_service_spec.rb b/spec/services/packages/mark_package_files_for_destruction_service_spec.rb
index a836de1f7f6..66534338003 100644
--- a/spec/services/packages/mark_package_files_for_destruction_service_spec.rb
+++ b/spec/services/packages/mark_package_files_for_destruction_service_spec.rb
@@ -6,9 +6,11 @@ RSpec.describe Packages::MarkPackageFilesForDestructionService, :aggregate_failu
let(:service) { described_class.new(package_files) }
describe '#execute', :aggregate_failures do
- subject { service.execute }
+ let(:batch_deadline) { nil }
- shared_examples 'executing successfully' do
+ subject { service.execute(batch_deadline: batch_deadline) }
+
+ shared_examples 'executing successfully' do |marked_package_files_count: 0|
it 'marks package files for destruction' do
expect { subject }
.to change { ::Packages::PackageFile.pending_destruction.count }.by(package_files.size)
@@ -17,6 +19,7 @@ RSpec.describe Packages::MarkPackageFilesForDestructionService, :aggregate_failu
it 'executes successfully' do
expect(subject).to be_success
expect(subject.message).to eq('Package files are now pending destruction')
+ expect(subject.payload).to eq(marked_package_files_count: marked_package_files_count)
end
end
@@ -30,13 +33,49 @@ RSpec.describe Packages::MarkPackageFilesForDestructionService, :aggregate_failu
let_it_be(:package_file) { create(:package_file) }
let_it_be(:package_files) { ::Packages::PackageFile.id_in(package_file.id) }
- it_behaves_like 'executing successfully'
+ it_behaves_like 'executing successfully', marked_package_files_count: 1
end
context 'with many package files' do
let_it_be(:package_files) { ::Packages::PackageFile.id_in(create_list(:package_file, 3).map(&:id)) }
- it_behaves_like 'executing successfully'
+ it_behaves_like 'executing successfully', marked_package_files_count: 3
+
+ context 'with a batch deadline' do
+ let_it_be(:batch_deadline) { 250.seconds.from_now }
+
+ context 'when the deadline is not hit' do
+ before do
+ expect(Time.zone).to receive(:now).and_return(batch_deadline - 10.seconds)
+ end
+
+ it_behaves_like 'executing successfully', marked_package_files_count: 3
+ end
+
+ context 'when the deadline is hit' do
+ it 'does not execute the batch loop' do
+ expect(Time.zone).to receive(:now).and_return(batch_deadline + 10.seconds)
+ expect { subject }.to not_change { ::Packages::PackageFile.pending_destruction.count }
+ expect(subject).to be_error
+ expect(subject.message).to eq('Timeout while marking package files as pending destruction')
+ expect(subject.payload).to eq(marked_package_files_count: 0)
+ end
+ end
+ end
+
+ context 'when a batch size is defined' do
+ let_it_be(:batch_deadline) { 250.seconds.from_now }
+
+ let(:batch_size) { 2 }
+
+ subject { service.execute(batch_deadline: batch_deadline, batch_size: batch_size) }
+
+ before do
+ expect(Time.zone).to receive(:now).twice.and_call_original
+ end
+
+ it_behaves_like 'executing successfully', marked_package_files_count: 3
+ end
end
context 'with an error during the update' do
diff --git a/spec/services/packages/pypi/create_package_service_spec.rb b/spec/services/packages/pypi/create_package_service_spec.rb
index 354ac92b99a..6794ab4d9d6 100644
--- a/spec/services/packages/pypi/create_package_service_spec.rb
+++ b/spec/services/packages/pypi/create_package_service_spec.rb
@@ -42,6 +42,21 @@ RSpec.describe Packages::Pypi::CreatePackageService, :aggregate_failures do
end
end
+ context 'with FIPS mode', :fips_mode do
+ it 'does not generate file_md5' do
+ expect { subject }.to change { Packages::Package.pypi.count }.by(1)
+
+ expect(created_package.name).to eq 'foo'
+ expect(created_package.version).to eq '1.0'
+
+ expect(created_package.pypi_metadatum.required_python).to eq '>=2.7'
+ expect(created_package.package_files.size).to eq 1
+ expect(created_package.package_files.first.file_name).to eq 'foo.tgz'
+ expect(created_package.package_files.first.file_sha256).to eq sha256
+ expect(created_package.package_files.first.file_md5).to be_nil
+ end
+ end
+
context 'without required_python' do
before do
params.delete(:requires_python)
diff --git a/spec/services/pages/delete_service_spec.rb b/spec/services/pages/delete_service_spec.rb
index 0c0b2c0431b..29d9a47c72e 100644
--- a/spec/services/pages/delete_service_spec.rb
+++ b/spec/services/pages/delete_service_spec.rb
@@ -45,7 +45,11 @@ RSpec.describe Pages::DeleteService do
end
it 'publishes a ProjectDeleted event with project id and namespace id' do
- expected_data = { project_id: project.id, namespace_id: project.namespace_id }
+ expected_data = {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
+ }
expect { service.execute }.to publish_event(Pages::PageDeletedEvent).with(expected_data)
end
diff --git a/spec/services/pod_logs/base_service_spec.rb b/spec/services/pod_logs/base_service_spec.rb
deleted file mode 100644
index d2f6300ab65..00000000000
--- a/spec/services/pod_logs/base_service_spec.rb
+++ /dev/null
@@ -1,147 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-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' }
- let(:pod_name_2) { 'pod-2' }
- let(:container_name) { 'container-0' }
- let(:params) { {} }
- let(:raw_pods) do
- [
- {
- name: pod_name,
- container_names: %w(container-0-0 container-0-1)
- },
- {
- name: pod_name_2,
- container_names: %w(container-1-0 container-1-1)
- }
- ]
- end
-
- subject { described_class.new(cluster, namespace, params: params) }
-
- describe '#initialize' do
- let(:params) do
- {
- 'container_name' => container_name,
- 'another_param' => 'foo'
- }
- end
-
- it 'filters the parameters' do
- expect(subject.cluster).to eq(cluster)
- expect(subject.namespace).to eq(namespace)
- expect(subject.params).to eq({
- 'container_name' => container_name
- })
- expect(subject.params.equal?(params)).to be(false)
- end
- end
-
- describe '#check_arguments' do
- context 'when cluster and namespace are provided' do
- it 'returns success' do
- result = subject.send(:check_arguments, {})
-
- expect(result[:status]).to eq(:success)
- end
- end
-
- context 'when cluster is nil' do
- let(:cluster) { nil }
-
- it 'returns an error' do
- result = subject.send(:check_arguments, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Cluster does not exist')
- end
- end
-
- context 'when namespace is nil' do
- let(:namespace) { nil }
-
- it 'returns an error' do
- result = subject.send(:check_arguments, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Namespace is empty')
- end
- end
-
- context 'when namespace is empty' do
- let(:namespace) { '' }
-
- it 'returns an error' do
- result = subject.send(:check_arguments, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Namespace is empty')
- end
- end
-
- context 'when pod_name and container_name are provided' do
- let(:params) do
- {
- 'pod_name' => pod_name,
- 'container_name' => container_name
- }
- end
-
- it 'returns success' do
- result = subject.send(:check_arguments, {})
-
- expect(result[:status]).to eq(:success)
- expect(result[:pod_name]).to eq(pod_name)
- expect(result[:container_name]).to eq(container_name)
- end
- end
-
- context 'when pod_name is not a string' do
- let(:params) do
- {
- 'pod_name' => { something_that_is: :not_a_string }
- }
- end
-
- it 'returns error' do
- result = subject.send(:check_arguments, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Invalid pod_name')
- end
- end
-
- context 'when container_name is not a string' do
- let(:params) do
- {
- 'container_name' => { something_that_is: :not_a_string }
- }
- end
-
- it 'returns error' do
- result = subject.send(:check_arguments, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Invalid container_name')
- end
- end
- end
-
- describe '#get_pod_names' do
- it 'returns success with a list of pods' do
- result = subject.send(:get_pod_names, raw_pods: raw_pods)
-
- expect(result[:status]).to eq(:success)
- expect(result[:pods]).to eq([pod_name, pod_name_2])
- end
- end
-end
diff --git a/spec/services/pod_logs/elasticsearch_service_spec.rb b/spec/services/pod_logs/elasticsearch_service_spec.rb
deleted file mode 100644
index 1111d9b9307..00000000000
--- a/spec/services/pod_logs/elasticsearch_service_spec.rb
+++ /dev/null
@@ -1,309 +0,0 @@
-# frozen_string_literal: true
-
-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' }
- let(:container_name) { 'container-1' }
- let(:search) { 'foo -bar' }
- let(:start_time) { '2019-01-02T12:13:14+02:00' }
- let(:end_time) { '2019-01-03T12:13:14+02:00' }
- let(:cursor) { '9999934,1572449784442' }
- let(:params) { {} }
- let(:expected_logs) do
- [
- { message: "Log 1", timestamp: "2019-12-13T14:04:22.123456Z" },
- { message: "Log 2", timestamp: "2019-12-13T14:04:23.123456Z" },
- { message: "Log 3", timestamp: "2019-12-13T14:04:24.123456Z" }
- ]
- end
-
- let(:raw_pods) do
- [
- {
- name: pod_name,
- container_names: [container_name, "#{container_name}-1"]
- }
- ]
- end
-
- subject { described_class.new(cluster, namespace, params: params) }
-
- describe '#get_raw_pods' do
- before do
- create(:clusters_integrations_elastic_stack, cluster: cluster)
- end
-
- it 'returns success with elasticsearch response' do
- allow_any_instance_of(::Clusters::Integrations::ElasticStack)
- .to receive(:elasticsearch_client)
- .and_return(Elasticsearch::Transport::Client.new)
- allow_any_instance_of(::Gitlab::Elasticsearch::Logs::Pods)
- .to receive(:pods)
- .with(namespace)
- .and_return(raw_pods)
-
- result = subject.send(:get_raw_pods, {})
-
- expect(result[:status]).to eq(:success)
- expect(result[:raw_pods]).to eq(raw_pods)
- end
-
- it 'returns an error when ES is unreachable' do
- allow_any_instance_of(::Clusters::Integrations::ElasticStack)
- .to receive(:elasticsearch_client)
- .and_return(nil)
-
- result = subject.send(:get_raw_pods, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Unable to connect to Elasticsearch')
- end
-
- it 'handles server errors from elasticsearch' do
- allow_any_instance_of(::Clusters::Integrations::ElasticStack)
- .to receive(:elasticsearch_client)
- .and_return(Elasticsearch::Transport::Client.new)
- allow_any_instance_of(::Gitlab::Elasticsearch::Logs::Pods)
- .to receive(:pods)
- .and_raise(Elasticsearch::Transport::Transport::Errors::ServiceUnavailable.new)
-
- result = subject.send(:get_raw_pods, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Elasticsearch returned status code: ServiceUnavailable')
- end
- end
-
- describe '#check_times' do
- context 'with start and end provided and valid' do
- let(:params) do
- {
- 'start_time' => start_time,
- 'end_time' => end_time
- }
- end
-
- it 'returns success with times' do
- result = subject.send(:check_times, {})
-
- expect(result[:status]).to eq(:success)
- expect(result[:start_time]).to eq(start_time)
- expect(result[:end_time]).to eq(end_time)
- end
- end
-
- context 'with start and end not provided' do
- let(:params) do
- {}
- end
-
- it 'returns success with nothing else' do
- result = subject.send(:check_times, {})
-
- expect(result.keys.length).to eq(1)
- expect(result[:status]).to eq(:success)
- end
- end
-
- context 'with start valid and end invalid' do
- let(:params) do
- {
- 'start_time' => start_time,
- 'end_time' => 'invalid date'
- }
- end
-
- it 'returns error' do
- result = subject.send(:check_times, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Invalid start or end time format')
- end
- end
-
- context 'with start invalid and end valid' do
- let(:params) do
- {
- 'start_time' => 'invalid date',
- 'end_time' => end_time
- }
- end
-
- it 'returns error' do
- result = subject.send(:check_times, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Invalid start or end time format')
- end
- end
- end
-
- describe '#check_search' do
- context 'with search provided and valid' do
- let(:params) do
- {
- 'search' => search
- }
- end
-
- it 'returns success with search' do
- result = subject.send(:check_search, {})
-
- expect(result[:status]).to eq(:success)
- expect(result[:search]).to eq(search)
- end
- end
-
- context 'with search provided and invalid' do
- let(:params) do
- {
- 'search' => { term: "foo-bar" }
- }
- end
-
- it 'returns error' do
- result = subject.send(:check_search, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq("Invalid search parameter")
- end
- end
-
- context 'with search not provided' do
- let(:params) do
- {}
- end
-
- it 'returns success with nothing else' do
- result = subject.send(:check_search, {})
-
- expect(result.keys.length).to eq(1)
- expect(result[:status]).to eq(:success)
- end
- end
- end
-
- describe '#check_cursor' do
- context 'with cursor provided and valid' do
- let(:params) do
- {
- 'cursor' => cursor
- }
- end
-
- it 'returns success with cursor' do
- result = subject.send(:check_cursor, {})
-
- expect(result[:status]).to eq(:success)
- expect(result[:cursor]).to eq(cursor)
- end
- end
-
- context 'with cursor provided and invalid' do
- let(:params) do
- {
- 'cursor' => { term: "foo-bar" }
- }
- end
-
- it 'returns error' do
- result = subject.send(:check_cursor, {})
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq("Invalid cursor parameter")
- end
- end
-
- context 'with cursor not provided' do
- let(:params) do
- {}
- end
-
- it 'returns success with nothing else' do
- result = subject.send(:check_cursor, {})
-
- expect(result.keys.length).to eq(1)
- expect(result[:status]).to eq(:success)
- end
- end
- end
-
- describe '#pod_logs' do
- let(:result_arg) do
- {
- pod_name: pod_name,
- container_name: container_name,
- search: search,
- start_time: start_time,
- end_time: end_time,
- cursor: cursor
- }
- end
-
- let(:expected_cursor) { '9999934,1572449784442' }
-
- before do
- create(:clusters_integrations_elastic_stack, cluster: cluster)
- end
-
- it 'returns the logs' do
- allow_any_instance_of(::Clusters::Integrations::ElasticStack)
- .to receive(:elasticsearch_client)
- .and_return(Elasticsearch::Transport::Client.new)
- allow_any_instance_of(::Gitlab::Elasticsearch::Logs::Lines)
- .to receive(:pod_logs)
- .with(namespace, pod_name: pod_name, container_name: container_name, search: search, start_time: start_time, end_time: end_time, cursor: cursor, chart_above_v2: true)
- .and_return({ logs: expected_logs, cursor: expected_cursor })
-
- result = subject.send(:pod_logs, result_arg)
-
- expect(result[:status]).to eq(:success)
- expect(result[:logs]).to eq(expected_logs)
- expect(result[:cursor]).to eq(expected_cursor)
- end
-
- it 'returns an error when ES is unreachable' do
- allow_any_instance_of(::Clusters::Integrations::ElasticStack)
- .to receive(:elasticsearch_client)
- .and_return(nil)
-
- result = subject.send(:pod_logs, result_arg)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Unable to connect to Elasticsearch')
- end
-
- it 'handles server errors from elasticsearch' do
- allow_any_instance_of(::Clusters::Integrations::ElasticStack)
- .to receive(:elasticsearch_client)
- .and_return(Elasticsearch::Transport::Client.new)
- allow_any_instance_of(::Gitlab::Elasticsearch::Logs::Lines)
- .to receive(:pod_logs)
- .and_raise(Elasticsearch::Transport::Transport::Errors::ServiceUnavailable.new)
-
- result = subject.send(:pod_logs, result_arg)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Elasticsearch returned status code: ServiceUnavailable')
- end
-
- it 'handles cursor errors from elasticsearch' do
- allow_any_instance_of(::Clusters::Integrations::ElasticStack)
- .to receive(:elasticsearch_client)
- .and_return(Elasticsearch::Transport::Client.new)
- allow_any_instance_of(::Gitlab::Elasticsearch::Logs::Lines)
- .to receive(:pod_logs)
- .and_raise(::Gitlab::Elasticsearch::Logs::Lines::InvalidCursor.new)
-
- result = subject.send(:pod_logs, result_arg)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Invalid cursor value provided')
- end
- end
-end
diff --git a/spec/services/pod_logs/kubernetes_service_spec.rb b/spec/services/pod_logs/kubernetes_service_spec.rb
deleted file mode 100644
index c06a87830ca..00000000000
--- a/spec/services/pod_logs/kubernetes_service_spec.rb
+++ /dev/null
@@ -1,310 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-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' }
- let(:pod_name_2) { 'pod-2' }
- let(:container_name) { 'container-0' }
- let(:container_name_2) { 'foo-0' }
- let(:params) { {} }
-
- let(:raw_logs) do
- "2019-12-13T14:04:22.123456Z Log 1\n2019-12-13T14:04:23.123456Z Log 2\n" \
- "2019-12-13T14:04:24.123456Z Log 3"
- end
-
- let(:raw_pods) do
- [
- {
- name: pod_name,
- container_names: [container_name, "#{container_name}-1"]
- },
- {
- name: pod_name_2,
- container_names: [container_name_2, "#{container_name_2}-1"]
- }
- ]
- end
-
- subject { described_class.new(cluster, namespace, params: params) }
-
- describe '#get_raw_pods' do
- let(:service) { create(:cluster_platform_kubernetes, :configured) }
-
- it 'returns success with passthrough k8s response' do
- stub_kubeclient_pods(namespace)
-
- result = subject.send(:get_raw_pods, {})
-
- expect(result[:status]).to eq(:success)
- expect(result[:raw_pods]).to eq([{
- name: 'kube-pod',
- container_names: %w(container-0 container-0-1)
- }])
- end
- end
-
- describe '#pod_logs' do
- let(:result_arg) do
- {
- pod_name: pod_name,
- container_name: container_name
- }
- end
-
- let(:expected_logs) { raw_logs }
- let(:service) { create(:cluster_platform_kubernetes, :configured) }
-
- it 'returns the logs' do
- stub_kubeclient_logs(pod_name, namespace, container: container_name)
-
- result = subject.send(:pod_logs, result_arg)
-
- expect(result[:status]).to eq(:success)
- expect(result[:logs]).to eq(expected_logs)
- end
-
- it 'handles Not Found errors from k8s' do
- allow_any_instance_of(Gitlab::Kubernetes::KubeClient)
- .to receive(:get_pod_log)
- .with(any_args)
- .and_raise(Kubeclient::ResourceNotFoundError.new(404, 'Not Found', {}))
-
- result = subject.send(:pod_logs, result_arg)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Pod not found')
- end
-
- it 'handles HTTP errors from k8s' do
- allow_any_instance_of(Gitlab::Kubernetes::KubeClient)
- .to receive(:get_pod_log)
- .with(any_args)
- .and_raise(Kubeclient::HttpError.new(500, 'Error', {}))
-
- result = subject.send(:pod_logs, result_arg)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Kubernetes API returned status code: 500')
- end
- end
-
- describe '#encode_logs_to_utf8', :aggregate_failures do
- let(:service) { create(:cluster_platform_kubernetes, :configured) }
- let(:expected_logs) { '2019-12-13T14:04:22.123456Z ✔ Started logging errors to Sentry' }
- let(:raw_logs) { expected_logs.dup.force_encoding(Encoding::ASCII_8BIT) }
- let(:result) { subject.send(:encode_logs_to_utf8, result_arg) }
-
- let(:result_arg) do
- {
- pod_name: pod_name,
- container_name: container_name,
- logs: raw_logs
- }
- end
-
- it 'converts logs to utf-8' do
- expect(result[:status]).to eq(:success)
- expect(result[:logs]).to eq(expected_logs)
- end
-
- it 'returns error if output of encoding helper is blank' do
- allow(Gitlab::EncodingHelper).to receive(:encode_utf8).and_return('')
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Unable to convert Kubernetes logs encoding to UTF-8')
- end
-
- it 'returns error if output of encoding helper is nil' do
- allow(Gitlab::EncodingHelper).to receive(:encode_utf8).and_return(nil)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Unable to convert Kubernetes logs encoding to UTF-8')
- end
-
- it 'returns error if output of encoding helper is not UTF-8' do
- allow(Gitlab::EncodingHelper).to receive(:encode_utf8)
- .and_return(expected_logs.encode(Encoding::UTF_16BE))
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Unable to convert Kubernetes logs encoding to UTF-8')
- end
-
- context 'when logs are nil' do
- let(:raw_logs) { nil }
- let(:expected_logs) { nil }
-
- it 'returns nil' do
- expect(result[:status]).to eq(:success)
- expect(result[:logs]).to eq(expected_logs)
- end
- end
-
- context 'when logs are blank' do
- let(:raw_logs) { (+'').force_encoding(Encoding::ASCII_8BIT) }
- let(:expected_logs) { '' }
-
- it 'returns blank string' do
- expect(result[:status]).to eq(:success)
- expect(result[:logs]).to eq(expected_logs)
- end
- end
-
- context 'when logs are already in utf-8' do
- let(:raw_logs) { expected_logs }
-
- it 'does not fail' do
- expect(result[:status]).to eq(:success)
- expect(result[:logs]).to eq(expected_logs)
- end
- end
- end
-
- describe '#split_logs' do
- let(:service) { create(:cluster_platform_kubernetes, :configured) }
-
- let(:expected_logs) do
- [
- { message: "Log 1", pod: 'pod-1', timestamp: "2019-12-13T14:04:22.123456Z" },
- { message: "Log 2", pod: 'pod-1', timestamp: "2019-12-13T14:04:23.123456Z" },
- { message: "Log 3", pod: 'pod-1', timestamp: "2019-12-13T14:04:24.123456Z" }
- ]
- end
-
- let(:result_arg) do
- {
- pod_name: pod_name,
- container_name: container_name,
- logs: raw_logs
- }
- end
-
- it 'returns the logs' do
- result = subject.send(:split_logs, result_arg)
-
- aggregate_failures do
- expect(result[:status]).to eq(:success)
- expect(result[:logs]).to eq(expected_logs)
- end
- end
- end
-
- describe '#check_pod_name' do
- it 'returns success if pod_name was specified' do
- result = subject.send(:check_pod_name, pod_name: pod_name, pods: [pod_name])
-
- expect(result[:status]).to eq(:success)
- expect(result[:pod_name]).to eq(pod_name)
- end
-
- it 'returns success if pod_name was not specified but there are pods' do
- result = subject.send(:check_pod_name, pod_name: nil, pods: [pod_name])
-
- expect(result[:status]).to eq(:success)
- expect(result[:pod_name]).to eq(pod_name)
- end
-
- it 'returns error if pod_name was not specified and there are no pods' do
- result = subject.send(:check_pod_name, pod_name: nil, pods: [])
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('No pods available')
- end
-
- it 'returns error if pod_name was specified but does not exist' do
- result = subject.send(:check_pod_name, pod_name: 'another-pod', pods: [pod_name])
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Pod does not exist')
- end
-
- it 'returns error if pod_name is too long' do
- result = subject.send(:check_pod_name, pod_name: "a very long string." * 15, pods: [pod_name])
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('pod_name cannot be larger than 253 chars')
- end
-
- it 'returns error if pod_name is in invalid format' do
- result = subject.send(:check_pod_name, pod_name: "Invalid_pod_name", pods: [pod_name])
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('pod_name can contain only lowercase letters, digits, \'-\', and \'.\' and must start and end with an alphanumeric character')
- end
- end
-
- describe '#check_container_name' do
- it 'returns success if container_name was specified' do
- result = subject.send(:check_container_name,
- container_name: container_name,
- pod_name: pod_name,
- raw_pods: raw_pods
- )
-
- expect(result[:status]).to eq(:success)
- expect(result[:container_name]).to eq(container_name)
- end
-
- it 'returns success if container_name was not specified and there are containers' do
- result = subject.send(:check_container_name,
- pod_name: pod_name_2,
- raw_pods: raw_pods
- )
-
- expect(result[:status]).to eq(:success)
- expect(result[:container_name]).to eq(container_name_2)
- end
-
- it 'returns error if container_name was not specified and there are no containers on the pod' do
- raw_pods.first[:container_names] = []
-
- result = subject.send(:check_container_name,
- pod_name: pod_name,
- raw_pods: raw_pods
- )
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('No containers available')
- end
-
- it 'returns error if container_name was specified but does not exist' do
- result = subject.send(:check_container_name,
- container_name: 'foo',
- pod_name: pod_name,
- raw_pods: raw_pods
- )
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Container does not exist')
- end
-
- it 'returns error if container_name is too long' do
- result = subject.send(:check_container_name,
- container_name: "a very long string." * 15,
- pod_name: pod_name,
- raw_pods: raw_pods
- )
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('container_name cannot be larger than 253 chars')
- end
-
- it 'returns error if container_name is in invalid format' do
- result = subject.send(:check_container_name,
- container_name: "Invalid_container_name",
- pod_name: pod_name,
- raw_pods: raw_pods
- )
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('container_name can contain only lowercase letters, digits, \'-\', and \'.\' and must start and end with an alphanumeric character')
- end
- end
-end
diff --git a/spec/services/preview_markdown_service_spec.rb b/spec/services/preview_markdown_service_spec.rb
index 53f8f5b7253..fe1ab6b1d58 100644
--- a/spec/services/preview_markdown_service_spec.rb
+++ b/spec/services/preview_markdown_service_spec.rb
@@ -172,4 +172,24 @@ RSpec.describe PreviewMarkdownService do
expect(result[:commands]).to eq 'Tags this commit to v1.2.3 with "Stable release".'
end
end
+
+ context 'note with multiple quick actions' do
+ let(:issue) { create(:issue, project: project) }
+ let(:params) do
+ {
+ text: "/confidential\n/due 2001-12-31\n/estimate 2y\n/assign #{user.to_reference}",
+ target_type: 'Issue',
+ target_id: issue.id
+ }
+ end
+
+ let(:service) { described_class.new(project, user, params) }
+
+ it 'renders quick actions on multiple lines' do
+ result = service.execute
+
+ expect(result[:commands]).to eq "Makes this issue confidential.<br>Sets the due date to Dec 31, 2001.<br>" \
+ "Sets time estimate to 2y.<br>Assigns #{user.to_reference}."
+ end
+ end
end
diff --git a/spec/services/projects/after_rename_service_spec.rb b/spec/services/projects/after_rename_service_spec.rb
index a9329f092fa..9dc15131bc5 100644
--- a/spec/services/projects/after_rename_service_spec.rb
+++ b/spec/services/projects/after_rename_service_spec.rb
@@ -59,22 +59,6 @@ RSpec.describe Projects::AfterRenameService do
end
end
- context 'gitlab pages' do
- before do
- allow(project_storage).to receive(:rename_repo) { true }
- end
-
- context 'when the project does not have pages deployed' do
- it 'does nothing with the pages directory' do
- allow(project).to receive(:pages_deployed?).and_return(false)
-
- expect(PagesTransferWorker).not_to receive(:perform_async)
-
- service_execute
- end
- end
- end
-
context 'attachments' do
before do
expect(project_storage).to receive(:rename_repo) { true }
@@ -204,6 +188,22 @@ RSpec.describe Projects::AfterRenameService do
)
end
end
+
+ context 'EventStore' do
+ let(:project) { create(:project, :repository, skip_disk_validation: true) }
+
+ it 'publishes a ProjectPathChangedEvent' do
+ expect { service_execute }
+ .to publish_event(Projects::ProjectPathChangedEvent)
+ .with(
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id,
+ old_path: full_path_before_rename,
+ new_path: full_path_after_rename
+ )
+ end
+ end
end
def service_execute
diff --git a/spec/services/projects/blame_service_spec.rb b/spec/services/projects/blame_service_spec.rb
index 40b2bc869dc..54c4315d242 100644
--- a/spec/services/projects/blame_service_spec.rb
+++ b/spec/services/projects/blame_service_spec.rb
@@ -98,31 +98,21 @@ RSpec.describe Projects::BlameService, :aggregate_failures do
end
end
- describe 'Current page' do
- subject { service.pagination.current_page }
-
- context 'with page = 1' do
- let(:page) { 1 }
-
- it { is_expected.to eq(1) }
- end
-
- context 'with page = 2' do
- let(:page) { 2 }
-
- it { is_expected.to eq(2) }
+ describe 'Pagination attributes' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:page, :current_page, :total_pages) do
+ 1 | 1 | 2
+ 2 | 2 | 2
+ 3 | 1 | 2 # Overlimit
+ 0 | 1 | 2 # Incorrect
end
- context 'with page = 3 (overlimit)' do
- let(:page) { 3 }
-
- it { is_expected.to eq(1) }
- end
-
- context 'with page = 0 (incorrect)' do
- let(:page) { 0 }
-
- it { is_expected.to eq(1) }
+ with_them do
+ it 'returns the correct pagination attributes' do
+ expect(subject.current_page).to eq(current_page)
+ expect(subject.total_pages).to eq(total_pages)
+ end
end
end
end
diff --git a/spec/services/projects/create_from_template_service_spec.rb b/spec/services/projects/create_from_template_service_spec.rb
index 7e23daabcd3..fba6225b87a 100644
--- a/spec/services/projects/create_from_template_service_spec.rb
+++ b/spec/services/projects/create_from_template_service_spec.rb
@@ -49,7 +49,7 @@ RSpec.describe Projects::CreateFromTemplateService do
end
it 'is not scheduled' do
- expect(project.import_scheduled?).to be_nil
+ expect(project.import_scheduled?).to be(false)
end
it 'repository is empty' do
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index cd1e629e1d2..59dee209ff9 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -152,6 +152,20 @@ RSpec.describe Projects::CreateService, '#execute' do
create_project(user, opts)
end
+
+ it 'publishes a ProjectCreatedEvent' do
+ group = create(:group, :nested).tap do |group|
+ group.add_owner(user)
+ end
+
+ expect { create_project(user, name: 'Project', path: 'project', namespace_id: group.id) }
+ .to publish_event(Projects::ProjectCreatedEvent)
+ .with(
+ project_id: kind_of(Numeric),
+ namespace_id: group.id,
+ root_namespace_id: group.parent_id
+ )
+ end
end
context "admin creates project with other user's namespace_id" do
@@ -543,15 +557,15 @@ RSpec.describe Projects::CreateService, '#execute' do
end
context 'with legacy storage' do
- let(:fake_repo_path) { File.join(TestEnv.repos_path, user.namespace.full_path, 'existing.git') }
+ let(:raw_fake_repo) { Gitlab::Git::Repository.new('default', File.join(user.namespace.full_path, 'existing.git'), nil, nil) }
before do
stub_application_setting(hashed_storage_enabled: false)
- TestEnv.create_bare_repository(fake_repo_path)
+ raw_fake_repo.create_repository
end
after do
- FileUtils.rm_rf(fake_repo_path)
+ raw_fake_repo.remove
end
it 'does not allow to create a project when path matches existing repository on disk' do
@@ -578,15 +592,15 @@ RSpec.describe Projects::CreateService, '#execute' do
context 'with hashed storage' do
let(:hash) { '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b' }
let(:hashed_path) { '@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b' }
- let(:fake_repo_path) { File.join(TestEnv.repos_path, "#{hashed_path}.git") }
+ let(:raw_fake_repo) { Gitlab::Git::Repository.new('default', "#{hashed_path}.git", nil, nil) }
before do
allow(Digest::SHA2).to receive(:hexdigest) { hash }
- TestEnv.create_bare_repository(fake_repo_path)
+ raw_fake_repo.create_repository
end
after do
- FileUtils.rm_rf(fake_repo_path)
+ raw_fake_repo.remove
end
it 'does not allow to create a project when path matches existing repository on disk' do
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index c00438199fd..955384e518c 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -25,8 +25,12 @@ RSpec.describe Projects::DestroyService, :aggregate_failures, :event_store_publi
expect(project.gitlab_shell.repository_exists?(project.repository_storage, path + '.git')).to be_falsey
end
- it 'publishes a ProjectDeleted event with project id and namespace id' do
- expected_data = { project_id: project.id, namespace_id: project.namespace_id }
+ it 'publishes a ProjectDeletedEvent' do
+ expected_data = {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
+ }
expect { destroy_project(project, user, {}) }.to publish_event(Projects::ProjectDeletedEvent).with(expected_data)
end
@@ -119,14 +123,15 @@ RSpec.describe Projects::DestroyService, :aggregate_failures, :event_store_publi
allow(project).to receive(:destroy!).and_return(true)
end
- it "deletes merge request and related records" do
- merge_request_diffs = merge_request.merge_request_diffs
- expect(merge_request_diffs.size).to eq(1)
+ [MergeRequestDiffCommit, MergeRequestDiffFile].each do |model|
+ it "deletes #{model} records of the merge request" do
+ merge_request_diffs = merge_request.merge_request_diffs
+ expect(merge_request_diffs.size).to eq(1)
- mrdc_count = MergeRequestDiffCommit.where(merge_request_diff_id: merge_request_diffs.first.id).count
+ records_count = model.where(merge_request_diff_id: merge_request_diffs.first.id).count
- expect { destroy_project(project, user, {}) }
- .to change { MergeRequestDiffCommit.count }.by(-mrdc_count)
+ expect { destroy_project(project, user, {}) }.to change { model.count }.by(-records_count)
+ end
end
end
@@ -220,7 +225,7 @@ RSpec.describe Projects::DestroyService, :aggregate_failures, :event_store_publi
context 'when flushing caches fail due to Redis' do
before do
new_user = create(:user)
- project.team.add_user(new_user, Gitlab::Access::DEVELOPER)
+ project.team.add_member(new_user, Gitlab::Access::DEVELOPER)
allow_any_instance_of(described_class).to receive(:flush_caches).and_raise(::Redis::CannotConnectError)
end
@@ -454,10 +459,10 @@ RSpec.describe Projects::DestroyService, :aggregate_failures, :event_store_publi
it 'deletes webhooks and logs related to project' do
expect_next_instance_of(WebHooks::DestroyService, user) do |instance|
- expect(instance).to receive(:sync_destroy).with(web_hook1).and_call_original
+ expect(instance).to receive(:execute).with(web_hook1).and_call_original
end
expect_next_instance_of(WebHooks::DestroyService, user) do |instance|
- expect(instance).to receive(:sync_destroy).with(web_hook2).and_call_original
+ expect(instance).to receive(:execute).with(web_hook2).and_call_original
end
expect do
@@ -468,7 +473,7 @@ RSpec.describe Projects::DestroyService, :aggregate_failures, :event_store_publi
context 'when an error is raised deleting webhooks' do
before do
allow_next_instance_of(WebHooks::DestroyService) do |instance|
- allow(instance).to receive(:sync_destroy).and_return(message: 'foo', status: :error)
+ allow(instance).to receive(:execute).and_return(message: 'foo', status: :error)
end
end
diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb
index ce30a20edf4..48756cf774b 100644
--- a/spec/services/projects/fork_service_spec.rb
+++ b/spec/services/projects/fork_service_spec.rb
@@ -32,14 +32,14 @@ RSpec.describe Projects::ForkService do
external_authorization_classification_label: 'classification-label')
@to_user = create(:user)
@to_namespace = @to_user.namespace
- @from_project.add_user(@to_user, :developer)
+ @from_project.add_member(@to_user, :developer)
end
context 'fork project' do
context 'when forker is a guest' do
before do
@guest = create(:user)
- @from_project.add_user(@guest, :guest)
+ @from_project.add_member(@guest, :guest)
end
subject { fork_project(@from_project, @guest, using_service: true) }
@@ -68,6 +68,9 @@ RSpec.describe Projects::ForkService do
it { expect(to_project.avatar.file).to be_exists }
it { expect(to_project.ci_config_path).to eq(@from_project.ci_config_path) }
it { expect(to_project.external_authorization_classification_label).to eq(@from_project.external_authorization_classification_label) }
+ it { expect(to_project.suggestion_commit_message).to eq(@from_project.suggestion_commit_message) }
+ it { expect(to_project.merge_commit_template).to eq(@from_project.merge_commit_template) }
+ it { expect(to_project.squash_commit_template).to eq(@from_project.squash_commit_template) }
# This test is here because we had a bug where the from-project lost its
# avatar after being forked.
@@ -156,16 +159,16 @@ RSpec.describe Projects::ForkService do
end
context 'repository in legacy storage already exists' do
- let(:fake_repo_path) { File.join(TestEnv.repos_path, @to_user.namespace.full_path, "#{@from_project.path}.git") }
+ let(:raw_fake_repo) { Gitlab::Git::Repository.new('default', File.join(@to_user.namespace.full_path, "#{@from_project.path}.git"), nil, nil) }
let(:params) { { namespace: @to_user.namespace, using_service: true } }
before do
stub_application_setting(hashed_storage_enabled: false)
- TestEnv.create_bare_repository(fake_repo_path)
+ raw_fake_repo.create_repository
end
after do
- FileUtils.rm_rf(fake_repo_path)
+ raw_fake_repo.remove
end
subject { fork_project(@from_project, @to_user, params) }
@@ -261,10 +264,10 @@ RSpec.describe Projects::ForkService do
description: 'Wow, such a cool project!',
ci_config_path: 'debian/salsa-ci.yml')
@group = create(:group)
- @group.add_user(@group_owner, GroupMember::OWNER)
- @group.add_user(@developer, GroupMember::DEVELOPER)
- @project.add_user(@developer, :developer)
- @project.add_user(@group_owner, :developer)
+ @group.add_member(@group_owner, GroupMember::OWNER)
+ @group.add_member(@developer, GroupMember::DEVELOPER)
+ @project.add_member(@developer, :developer)
+ @project.add_member(@group_owner, :developer)
@opts = { namespace: @group, using_service: true }
end
diff --git a/spec/services/projects/group_links/update_service_spec.rb b/spec/services/projects/group_links/update_service_spec.rb
index ff1618c3bbe..20616890ebd 100644
--- a/spec/services/projects/group_links/update_service_spec.rb
+++ b/spec/services/projects/group_links/update_service_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Projects::GroupLinks::UpdateService, '#execute' do
expires_at: expiry_date }
end
- subject { described_class.new(link).execute(group_link_params) }
+ subject { described_class.new(link, user).execute(group_link_params) }
before do
group.add_developer(user)
diff --git a/spec/services/projects/move_deploy_keys_projects_service_spec.rb b/spec/services/projects/move_deploy_keys_projects_service_spec.rb
index bd93b80f712..59674a3a4ef 100644
--- a/spec/services/projects/move_deploy_keys_projects_service_spec.rb
+++ b/spec/services/projects/move_deploy_keys_projects_service_spec.rb
@@ -56,5 +56,22 @@ RSpec.describe Projects::MoveDeployKeysProjectsService do
expect(project_with_deploy_keys.deploy_keys_projects.count).not_to eq 0
end
end
+
+ context 'when SHA256 fingerprint is missing' do
+ before do
+ create(:deploy_keys_project, project: target_project)
+ DeployKey.all.update_all(fingerprint_sha256: nil)
+ end
+
+ it 'moves the user\'s deploy keys from one project to another' do
+ combined_keys = project_with_deploy_keys.deploy_keys + target_project.deploy_keys
+
+ subject.execute(project_with_deploy_keys)
+
+ expect(project_with_deploy_keys.deploy_keys.reload).to be_empty
+ expect(target_project.deploy_keys.reload).to match_array(combined_keys)
+ expect(DeployKey.all.select(:fingerprint_sha256)).to all(be_present)
+ end
+ end
end
end
diff --git a/spec/services/projects/operations/update_service_spec.rb b/spec/services/projects/operations/update_service_spec.rb
index 3ee867ba6f2..bee91c358ce 100644
--- a/spec/services/projects/operations/update_service_spec.rb
+++ b/spec/services/projects/operations/update_service_spec.rb
@@ -462,93 +462,5 @@ RSpec.describe Projects::Operations::UpdateService do
end
end
end
-
- context 'tracing setting' do
- context 'with valid params' do
- let(:params) do
- {
- tracing_setting_attributes: {
- external_url: 'http://some-url.com'
- }
- }
- end
-
- context 'with an existing setting' do
- before do
- create(:project_tracing_setting, project: project)
- end
-
- shared_examples 'setting deletion' do
- let!(:original_params) { params.deep_dup }
-
- it 'deletes the setting' do
- expect(result[:status]).to eq(:success)
- expect(project.reload.tracing_setting).to be_nil
- end
-
- it 'does not modify original params' do
- subject.execute
-
- expect(params).to eq(original_params)
- end
- end
-
- it 'updates the setting' do
- expect(project.tracing_setting).not_to be_nil
-
- expect(result[:status]).to eq(:success)
- expect(project.reload.tracing_setting.external_url)
- .to eq('http://some-url.com')
- end
-
- context 'with missing external_url' do
- before do
- params[:tracing_setting_attributes].delete(:external_url)
- end
-
- it_behaves_like 'setting deletion'
- end
-
- context 'with empty external_url' do
- before do
- params[:tracing_setting_attributes][:external_url] = ''
- end
-
- it_behaves_like 'setting deletion'
- end
-
- context 'with blank external_url' do
- before do
- params[:tracing_setting_attributes][:external_url] = ' '
- end
-
- it_behaves_like 'setting deletion'
- end
- end
-
- context 'without an existing setting' do
- it 'creates a setting' do
- expect(project.tracing_setting).to be_nil
-
- expect(result[:status]).to eq(:success)
- expect(project.reload.tracing_setting.external_url)
- .to eq('http://some-url.com')
- end
- end
- end
-
- context 'with empty params' do
- let(:params) { {} }
-
- let!(:tracing_setting) do
- create(:project_tracing_setting, project: project)
- end
-
- it 'does nothing' do
- expect(result[:status]).to eq(:success)
- expect(project.reload.tracing_setting).to eq(tracing_setting)
- end
- end
- end
end
end
diff --git a/spec/services/projects/prometheus/alerts/notify_service_spec.rb b/spec/services/projects/prometheus/alerts/notify_service_spec.rb
index 0d0bb317df2..6f760e6dbfa 100644
--- a/spec/services/projects/prometheus/alerts/notify_service_spec.rb
+++ b/spec/services/projects/prometheus/alerts/notify_service_spec.rb
@@ -228,12 +228,14 @@ RSpec.describe Projects::Prometheus::Alerts::NotifyService do
context 'when payload exceeds max amount of processable alerts' do
# We are defining 2 alerts in payload_raw above
let(:max_alerts) { 1 }
+ let(:fingerprint) { prometheus_alert_payload_fingerprint(alert_resolved) }
before do
stub_const("#{described_class}::PROCESS_MAX_ALERTS", max_alerts)
create(:prometheus_integration, project: project)
create(:project_alerting_setting, project: project, token: token)
+ create(:alert_management_alert, project: project, fingerprint: fingerprint)
allow(Gitlab::AppLogger).to receive(:warn)
end
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index bebe80b710b..ecf9f92d74f 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -372,16 +372,16 @@ RSpec.describe Projects::TransferService do
end
context 'namespace which contains orphan repository with same projects path name' do
- let(:fake_repo_path) { File.join(TestEnv.repos_path, group.full_path, "#{project.path}.git") }
+ let(:raw_fake_repo) { Gitlab::Git::Repository.new('default', File.join(group.full_path, "#{project.path}.git"), nil, nil) }
before do
group.add_owner(user)
- TestEnv.create_bare_repository(fake_repo_path)
+ raw_fake_repo.create_repository
end
after do
- FileUtils.rm_rf(fake_repo_path)
+ raw_fake_repo.remove
end
it 'does not allow the project transfer' do
@@ -715,20 +715,6 @@ RSpec.describe Projects::TransferService do
end
end
- context 'moving pages' do
- let_it_be(:project) { create(:project, namespace: user.namespace) }
-
- before do
- group.add_owner(user)
- end
-
- it 'does not schedule a job when no pages are deployed' do
- expect(PagesTransferWorker).not_to receive(:perform_async)
-
- execute_transfer
- end
- end
-
context 'handling issue contacts' do
let_it_be(:root_group) { create(:group) }
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index cbbed82aa0b..24b5e35e422 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -43,6 +43,16 @@ RSpec.describe Projects::UpdatePagesService do
expect(project.pages_deployed?).to be_truthy
end
+ it 'publishes a PageDeployedEvent event with project id and namespace id' do
+ expected_data = {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
+ }
+
+ expect { subject.execute }.to publish_event(Pages::PageDeployedEvent).with(expected_data)
+ end
+
it 'creates pages_deployment and saves it in the metadata' do
expect do
expect(execute).to eq(:success)
@@ -161,16 +171,6 @@ RSpec.describe Projects::UpdatePagesService do
end
end
- shared_examples 'fails with outdated reference message' do
- it 'fails' do
- expect(execute).not_to eq(:success)
- expect(project.reload.pages_metadatum).not_to be_deployed
-
- expect(deploy_status).to be_failed
- expect(deploy_status.description).to eq('build SHA is outdated for this ref')
- end
- end
-
shared_examples 'successfully deploys' do
it 'succeeds' do
expect do
@@ -202,27 +202,29 @@ RSpec.describe Projects::UpdatePagesService do
project.update_pages_deployment!(new_deployment)
end
- include_examples 'fails with outdated reference message'
+ it 'fails with outdated reference message' do
+ expect(execute).to eq(:error)
+ expect(project.reload.pages_metadatum).not_to be_deployed
+
+ expect(deploy_status).to be_failed
+ expect(deploy_status.description).to eq('build SHA is outdated for this ref')
+ end
end
end
- context 'when uploaded deployment size is wrong' do
- it 'raises an error' do
- allow_next_instance_of(PagesDeployment) do |deployment|
- allow(deployment)
- .to receive(:size)
- .and_return(file.size + 1)
- end
+ it 'fails when uploaded deployment size is wrong' do
+ allow_next_instance_of(PagesDeployment) do |deployment|
+ allow(deployment)
+ .to receive(:size)
+ .and_return(file.size + 1)
+ end
- expect do
- expect(execute).not_to eq(:success)
+ expect(execute).not_to eq(:success)
- expect(GenericCommitStatus.last.description).to eq("Error: The uploaded artifact size does not match the expected value.")
- project.pages_metadatum.reload
- expect(project.pages_metadatum).not_to be_deployed
- expect(project.pages_metadatum.pages_deployment).to be_ni
- end.to raise_error(Projects::UpdatePagesService::WrongUploadedDeploymentSizeError)
- end
+ expect(GenericCommitStatus.last.description).to eq('The uploaded artifact size does not match the expected value')
+ project.pages_metadatum.reload
+ expect(project.pages_metadatum).not_to be_deployed
+ expect(project.pages_metadatum.pages_deployment).to be_nil
end
end
end
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index 7b5bf1db030..f019434a4fe 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -289,6 +289,42 @@ RSpec.describe Projects::UpdateService do
end
end
+ context 'when changing operations feature visibility' do
+ let(:feature_params) { { operations_access_level: ProjectFeature::DISABLED } }
+
+ it 'does not sync the changes to the related fields' do
+ result = update_project(project, user, project_feature_attributes: feature_params)
+
+ expect(result).to eq({ status: :success })
+ feature = project.project_feature
+
+ expect(feature.operations_access_level).to eq(ProjectFeature::DISABLED)
+ expect(feature.monitor_access_level).not_to eq(ProjectFeature::DISABLED)
+ expect(feature.infrastructure_access_level).not_to eq(ProjectFeature::DISABLED)
+ expect(feature.feature_flags_access_level).not_to eq(ProjectFeature::DISABLED)
+ expect(feature.environments_access_level).not_to eq(ProjectFeature::DISABLED)
+ end
+
+ context 'when split_operations_visibility_permissions feature is disabled' do
+ before do
+ stub_feature_flags(split_operations_visibility_permissions: false)
+ end
+
+ it 'syncs the changes to the related fields' do
+ result = update_project(project, user, project_feature_attributes: feature_params)
+
+ expect(result).to eq({ status: :success })
+ feature = project.project_feature
+
+ expect(feature.operations_access_level).to eq(ProjectFeature::DISABLED)
+ expect(feature.monitor_access_level).to eq(ProjectFeature::DISABLED)
+ expect(feature.infrastructure_access_level).to eq(ProjectFeature::DISABLED)
+ expect(feature.feature_flags_access_level).to eq(ProjectFeature::DISABLED)
+ expect(feature.environments_access_level).to eq(ProjectFeature::DISABLED)
+ end
+ end
+ end
+
context 'when updating a project that contains container images' do
before do
stub_container_registry_config(enabled: true)
@@ -312,17 +348,17 @@ RSpec.describe Projects::UpdateService do
end
context 'when renaming a project' do
- let(:fake_repo_path) { File.join(TestEnv.repos_path, user.namespace.full_path, 'existing.git') }
+ let(:raw_fake_repo) { Gitlab::Git::Repository.new('default', File.join(user.namespace.full_path, 'existing.git'), nil, nil) }
context 'with legacy storage' do
let(:project) { create(:project, :legacy_storage, :repository, creator: user, namespace: user.namespace) }
before do
- TestEnv.create_bare_repository(fake_repo_path)
+ raw_fake_repo.create_repository
end
after do
- FileUtils.rm_rf(fake_repo_path)
+ raw_fake_repo.remove
end
it 'does not allow renaming when new path matches existing repository on disk' do
@@ -388,7 +424,7 @@ RSpec.describe Projects::UpdateService do
it 'does not update when not project owner' do
maintainer = create(:user)
- project.add_user(maintainer, :maintainer)
+ project.add_member(maintainer, :maintainer)
expect { update_project(project, maintainer, emails_disabled: true) }
.not_to change { project.emails_disabled }
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index f7ed6006099..3f11eaa7e93 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe QuickActions::InterpretService do
+ include AfterNextHelpers
+
let_it_be(:group) { create(:group, :crm_enabled) }
let_it_be(:public_project) { create(:project, :public, group: group) }
let_it_be(:repository_project) { create(:project, :repository) }
@@ -17,8 +19,9 @@ RSpec.describe QuickActions::InterpretService do
let(:milestone) { create(:milestone, project: project, title: '9.10') }
let(:commit) { create(:commit, project: project) }
+ let(:current_user) { developer }
- subject(:service) { described_class.new(project, developer) }
+ subject(:service) { described_class.new(project, current_user) }
before_all do
public_project.add_developer(developer)
@@ -682,6 +685,58 @@ RSpec.describe QuickActions::InterpretService do
end
shared_examples 'assign command' do
+ it 'assigns to me' do
+ cmd = '/assign me'
+
+ _, updates, _ = service.execute(cmd, issuable)
+
+ expect(updates).to eq(assignee_ids: [current_user.id])
+ end
+
+ it 'does not assign to group members' do
+ grp = create(:group)
+ grp.add_developer(developer)
+ grp.add_developer(developer2)
+
+ cmd = "/assign #{grp.to_reference}"
+
+ _, updates, message = service.execute(cmd, issuable)
+
+ expect(updates).to be_blank
+ expect(message).to include('Failed to find users')
+ end
+
+ context 'when there are too many references' do
+ before do
+ stub_const('Gitlab::QuickActions::UsersExtractor::MAX_QUICK_ACTION_USERS', 2)
+ end
+
+ it 'says what went wrong' do
+ cmd = '/assign her and you, me and them'
+
+ _, updates, message = service.execute(cmd, issuable)
+
+ expect(updates).to be_blank
+ expect(message).to include('Too many references. Quick actions are limited to at most 2 user references')
+ end
+ end
+
+ context 'when the user extractor raises an uninticipated error' do
+ before do
+ allow_next(Gitlab::QuickActions::UsersExtractor)
+ .to receive(:execute).and_raise(Gitlab::QuickActions::UsersExtractor::Error)
+ end
+
+ it 'tracks the exception in dev, and reports a generic message in production' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).twice
+
+ _, updates, message = service.execute('/assign some text', issuable)
+
+ expect(updates).to be_blank
+ expect(message).to include('Something went wrong')
+ end
+ end
+
it 'assigns to users with escaped underscores' do
user = create(:user)
base = user.username
diff --git a/spec/services/repositories/changelog_service_spec.rb b/spec/services/repositories/changelog_service_spec.rb
index 82546ae810b..3615747e191 100644
--- a/spec/services/repositories/changelog_service_spec.rb
+++ b/spec/services/repositories/changelog_service_spec.rb
@@ -194,6 +194,25 @@ RSpec.describe Repositories::ChangelogService do
end
end
end
+
+ context 'with specified changelog config file path' do
+ it 'return specified changelog content' do
+ config = Gitlab::Changelog::Config.from_hash(project, { 'template' => 'specified_changelog_content' }, creator)
+
+ allow(Gitlab::Changelog::Config)
+ .to receive(:from_git)
+ .with(project, creator, 'specified_changelog_config.yml')
+ .and_return(config)
+
+ described_class
+ .new(project, creator, version: '1.0.0', from: sha1, config_file: 'specified_changelog_config.yml')
+ .execute(commit_to_changelog: commit_to_changelog)
+
+ changelog = project.repository.blob_at('master', 'CHANGELOG.md')&.data
+
+ expect(changelog).to include('specified_changelog_content')
+ end
+ end
end
describe '#start_of_commit_range' do
diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb
index d7a36ff370e..5edea13afa4 100644
--- a/spec/services/search_service_spec.rb
+++ b/spec/services/search_service_spec.rb
@@ -511,7 +511,7 @@ RSpec.describe SearchService do
end
context 'with :with_api_entity_associations' do
- it_behaves_like "redaction limits N+1 queries", limit: 13
+ it_behaves_like "redaction limits N+1 queries", limit: 14
end
end
@@ -599,25 +599,13 @@ RSpec.describe SearchService do
let(:search_service) { double(:search_service) }
before do
- stub_feature_flags(prevent_abusive_searches: should_detect_abuse)
expect(Gitlab::Search::Params).to receive(:new)
- .with(raw_params, detect_abuse: should_detect_abuse).and_call_original
+ .with(raw_params, detect_abuse: true).and_call_original
allow(subject).to receive(:search_service).and_return search_service
end
- context 'when abusive search but prevent_abusive_searches FF is disabled' do
- let(:should_detect_abuse) { false }
- let(:scope) { '1;drop%20table' }
-
- it 'executes search even if params are abusive' do
- expect(search_service).to receive(:execute)
- subject.search_results
- end
- end
-
context 'a search is abusive' do
- let(:should_detect_abuse) { true }
let(:scope) { '1;drop%20table' }
it 'does NOT execute search service' do
@@ -627,7 +615,6 @@ RSpec.describe SearchService do
end
context 'a search is NOT abusive' do
- let(:should_detect_abuse) { true }
let(:scope) { 'issues' }
it 'executes search service' do
diff --git a/spec/services/service_ping/submit_service_ping_service_spec.rb b/spec/services/service_ping/submit_service_ping_service_spec.rb
index 7a8bd1910fe..b863b2a46b0 100644
--- a/spec/services/service_ping/submit_service_ping_service_spec.rb
+++ b/spec/services/service_ping/submit_service_ping_service_spec.rb
@@ -377,12 +377,15 @@ RSpec.describe ServicePing::SubmitService do
stub_database_flavor_check
stub_application_setting(usage_ping_enabled: true)
stub_response(body: with_conv_index_params)
+ allow_next_instance_of(ServicePing::BuildPayload) do |service|
+ allow(service).to receive(:execute).and_return(payload)
+ end
end
- context 'with feature flag measure_service_ping_metric_collection turned on' do
- let(:metric_double) { instance_double(Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator, duration: 123) }
- let(:payload) do
- {
+ let(:metric_double) { instance_double(Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator, duration: 123) }
+ let(:payload) do
+ {
+ uuid: 'uuid',
metric_a: metric_double,
metric_group: {
metric_b: metric_double
@@ -390,49 +393,27 @@ RSpec.describe ServicePing::SubmitService do
metric_without_timing: "value",
recorded_at: Time.current
}
- end
+ end
- let(:metadata_payload) do
- {
- metadata: {
+ let(:metadata_payload) do
+ {
+ metadata: {
+ uuid: 'uuid',
metrics: [
{ name: 'metric_a', time_elapsed: 123 },
{ name: 'metric_group.metric_b', time_elapsed: 123 }
]
}
}
- end
-
- before do
- stub_feature_flags(measure_service_ping_metric_collection: true)
-
- allow_next_instance_of(ServicePing::BuildPayload) do |service|
- allow(service).to receive(:execute).and_return(payload)
- end
- end
-
- it 'submits metadata' do
- response = stub_full_request(service_ping_metadata_url, method: :post)
- .with(body: metadata_payload)
-
- subject.execute
-
- expect(response).to have_been_requested
- end
end
- context 'with feature flag measure_service_ping_metric_collection turned off' do
- before do
- stub_feature_flags(measure_service_ping_metric_collection: false)
- end
+ it 'submits metadata' do
+ response = stub_full_request(service_ping_metadata_url, method: :post)
+ .with(body: metadata_payload)
- it 'does NOT submit metadata' do
- response = stub_full_request(service_ping_metadata_url, method: :post)
-
- subject.execute
+ subject.execute
- expect(response).not_to have_been_requested
- end
+ expect(response).to have_been_requested
end
end
diff --git a/spec/services/suggestions/apply_service_spec.rb b/spec/services/suggestions/apply_service_spec.rb
index dc330a5546f..6052882813e 100644
--- a/spec/services/suggestions/apply_service_spec.rb
+++ b/spec/services/suggestions/apply_service_spec.rb
@@ -581,8 +581,7 @@ RSpec.describe Suggestions::ApplyService do
let(:project) { create(:project, :public, :repository) }
let(:forked_project) do
- fork_project_with_submodules(project,
- user, repository: project.repository)
+ fork_project_with_submodules(project, user)
end
let(:merge_request) do
diff --git a/spec/services/system_notes/incidents_service_spec.rb b/spec/services/system_notes/incidents_service_spec.rb
index d1b831e9c4c..6439f9fae93 100644
--- a/spec/services/system_notes/incidents_service_spec.rb
+++ b/spec/services/system_notes/incidents_service_spec.rb
@@ -3,8 +3,6 @@
require 'spec_helper'
RSpec.describe SystemNotes::IncidentsService do
- include Gitlab::Routing
-
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
let_it_be(:author) { create(:user) }
@@ -22,14 +20,12 @@ RSpec.describe SystemNotes::IncidentsService do
end
it 'posts the correct text to the system note' do
- path = project_issues_incident_path(project, incident, anchor: "timeline_event_#{timeline_event.id}")
- expect(subject.note).to match("added an [incident timeline event](#{path})")
+ expect(subject.note).to match("added an incident timeline event")
end
end
describe '#edit_timeline_event' do
let(:was_changed) { :unknown }
- let(:path) { project_issues_incident_path(project, incident, anchor: "timeline_event_#{timeline_event.id}") }
subject do
described_class.new(noteable: incident).edit_timeline_event(timeline_event, author, was_changed: was_changed)
@@ -44,7 +40,7 @@ RSpec.describe SystemNotes::IncidentsService do
let(:was_changed) { :occurred_at }
it 'posts the correct text to the system note' do
- expect(subject.note).to match("edited the event time/date on [incident timeline event](#{path})")
+ expect(subject.note).to match("edited the event time/date on incident timeline event")
end
end
@@ -52,7 +48,7 @@ RSpec.describe SystemNotes::IncidentsService do
let(:was_changed) { :note }
it 'posts the correct text to the system note' do
- expect(subject.note).to match("edited the text on [incident timeline event](#{path})")
+ expect(subject.note).to match("edited the text on incident timeline event")
end
end
@@ -60,7 +56,7 @@ RSpec.describe SystemNotes::IncidentsService do
let(:was_changed) { :occurred_at_and_note }
it 'posts the correct text to the system note' do
- expect(subject.note).to match("edited the event time/date and text on [incident timeline event](#{path})")
+ expect(subject.note).to match("edited the event time/date and text on incident timeline event")
end
end
@@ -68,7 +64,7 @@ RSpec.describe SystemNotes::IncidentsService do
let(:was_changed) { :unknown }
it 'posts the correct text to the system note' do
- expect(subject.note).to match("edited [incident timeline event](#{path})")
+ expect(subject.note).to match("edited incident timeline event")
end
end
end
diff --git a/spec/services/terraform/states/trigger_destroy_service_spec.rb b/spec/services/terraform/states/trigger_destroy_service_spec.rb
index 2e96331779c..459f4c3bdb9 100644
--- a/spec/services/terraform/states/trigger_destroy_service_spec.rb
+++ b/spec/services/terraform/states/trigger_destroy_service_spec.rb
@@ -9,7 +9,9 @@ RSpec.describe Terraform::States::TriggerDestroyService do
describe '#execute', :aggregate_failures do
let_it_be(:state) { create(:terraform_state, project: project) }
- subject { described_class.new(state, current_user: user).execute }
+ let(:service) { described_class.new(state, current_user: user) }
+
+ subject { service.execute }
it 'marks the state as deleted and schedules a cleanup worker' do
expect(Terraform::States::DestroyWorker).to receive(:perform_async).with(state.id).once
@@ -18,6 +20,15 @@ RSpec.describe Terraform::States::TriggerDestroyService do
expect(state.deleted_at).to be_like_time(Time.current)
end
+ context 'within a database transaction' do
+ subject { state.with_lock { service.execute } }
+
+ it 'does not raise an EnqueueFromTransactionError' do
+ expect { subject }.not_to raise_error
+ expect(state.deleted_at).to be_like_time(Time.current)
+ end
+ end
+
shared_examples 'unable to delete state' do
it 'does not modify the state' do
expect(Terraform::States::DestroyWorker).not_to receive(:perform_async)
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index e4582e19416..1cb44366457 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -186,8 +186,8 @@ RSpec.describe TodoService do
before do
group.add_owner(author)
- group.add_user(member, Gitlab::Access::DEVELOPER)
- group.add_user(john_doe, Gitlab::Access::DEVELOPER)
+ group.add_member(member, Gitlab::Access::DEVELOPER)
+ group.add_member(john_doe, Gitlab::Access::DEVELOPER)
service.new_issue(issue, author)
end
diff --git a/spec/services/users/activity_service_spec.rb b/spec/services/users/activity_service_spec.rb
index 092c5cd3e5e..47a4b943d83 100644
--- a/spec/services/users/activity_service_spec.rb
+++ b/spec/services/users/activity_service_spec.rb
@@ -34,6 +34,13 @@ RSpec.describe Users::ActivityService do
subject.execute
end
+
+ it 'tracks RedisHLL event' do
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event)
+ .with('unique_active_user', values: user.id)
+
+ subject.execute
+ end
end
context 'when a bad object is passed' do
diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb
index 068550ec234..339ffc44e4d 100644
--- a/spec/services/web_hook_service_spec.rb
+++ b/spec/services/web_hook_service_spec.rb
@@ -84,8 +84,74 @@ RSpec.describe WebHookService, :request_store, :clean_gitlab_redis_shared_state
Gitlab::WebHooks::RecursionDetection.set_request_uuid(uuid)
end
+ context 'when there is an interpolation error' do
+ let(:error) { ::WebHook::InterpolationError.new('boom') }
+
+ before do
+ stub_full_request(project_hook.url, method: :post)
+ allow(project_hook).to receive(:interpolated_url).and_raise(error)
+ end
+
+ it 'logs the error' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(error)
+
+ expect(service_instance).to receive(:log_execution).with(
+ execution_duration: (be > 0),
+ response: have_attributes(code: 200)
+ )
+
+ service_instance.execute
+ end
+ end
+
+ context 'when there are URL variables' do
+ before do
+ project_hook.update!(
+ url: 'http://example.com/{one}/{two}',
+ url_variables: { 'one' => 'a', 'two' => 'b' }
+ )
+ end
+
+ it 'POSTs to the interpolated URL, and logs the hook.url' do
+ stub_full_request(project_hook.interpolated_url, method: :post)
+
+ expect(service_instance).to receive(:queue_log_execution_with_retry).with(
+ include(url: project_hook.url),
+ :ok
+ )
+
+ service_instance.execute
+
+ expect(WebMock)
+ .to have_requested(:post, stubbed_hostname(project_hook.interpolated_url)).once
+ end
+
+ context 'there is userinfo' do
+ before do
+ project_hook.update!(url: 'http://{one}:{two}@example.com')
+ stub_full_request('http://example.com', method: :post)
+ end
+
+ it 'POSTs to the interpolated URL, and logs the hook.url' do
+ expect(service_instance).to receive(:queue_log_execution_with_retry).with(
+ include(url: project_hook.url),
+ :ok
+ )
+
+ service_instance.execute
+
+ expect(WebMock)
+ .to have_requested(:post, stubbed_hostname('http://example.com'))
+ .with(headers: headers.merge('Authorization' => 'Basic YTpi'))
+ .once
+ end
+ end
+ end
+
context 'when token is defined' do
- let_it_be(:project_hook) { create(:project_hook, :token) }
+ before do
+ project_hook.token = generate(:token)
+ end
it 'POSTs to the webhook URL' do
stub_full_request(project_hook.url, method: :post)
diff --git a/spec/services/web_hooks/log_execution_service_spec.rb b/spec/services/web_hooks/log_execution_service_spec.rb
index 0ba0372b99d..873f6adc8dc 100644
--- a/spec/services/web_hooks/log_execution_service_spec.rb
+++ b/spec/services/web_hooks/log_execution_service_spec.rb
@@ -35,6 +35,12 @@ RSpec.describe WebHooks::LogExecutionService do
expect(WebHookLog.recent.first).to have_attributes(data)
end
+ it 'updates the last failure' do
+ expect(project_hook).to receive(:update_last_failure)
+
+ service.execute
+ end
+
context 'obtaining an exclusive lease' do
let(:lease_key) { "web_hooks:update_hook_failure_state:#{project_hook.id}" }
diff --git a/spec/services/work_items/create_and_link_service_spec.rb b/spec/services/work_items/create_and_link_service_spec.rb
index 93c029bdab1..81be15f9e2f 100644
--- a/spec/services/work_items/create_and_link_service_spec.rb
+++ b/spec/services/work_items/create_and_link_service_spec.rb
@@ -7,13 +7,16 @@ RSpec.describe WorkItems::CreateAndLinkService do
let_it_be(:project) { create(:project, group: group) }
let_it_be(:user) { create(:user) }
let_it_be(:related_work_item) { create(:work_item, project: project) }
+ let_it_be(:invalid_parent) { create(:work_item, :task, project: project) }
let(:spam_params) { double }
let(:link_params) { {} }
+
let(:params) do
{
title: 'Awesome work item',
- description: 'please fix'
+ description: 'please fix',
+ work_item_type_id: WorkItems::Type.default_by_type(:task).id
}
end
@@ -40,32 +43,32 @@ RSpec.describe WorkItems::CreateAndLinkService do
end
context 'when link params are valid' do
- let(:link_params) { { issuable_references: [related_work_item.to_reference] } }
+ let(:link_params) { { parent_work_item: related_work_item } }
it 'creates a work item successfully with links' do
expect do
service_result
end.to change(WorkItem, :count).by(1).and(
- change(IssueLink, :count).by(1)
+ change(WorkItems::ParentLink, :count).by(1)
)
end
end
- context 'when link params are invalid' do
- let(:link_params) { { issuable_references: ['invalid reference'] } }
+ context 'when link creation fails' do
+ let(:link_params) { { parent_work_item: invalid_parent } }
it { is_expected.to be_error }
it 'does not create a link and does not rollback transaction' do
expect do
service_result
- end.to not_change(IssueLink, :count).and(
+ end.to not_change(WorkItems::ParentLink, :count).and(
change(WorkItem, :count).by(1)
)
end
it 'returns a link creation error message' do
- expect(service_result.errors).to contain_exactly('No matching issue found. Make sure that you are adding a valid issue URL.')
+ expect(service_result.errors).to contain_exactly(/only Issue and Incident can be parent of Task./)
end
end
end
@@ -84,7 +87,7 @@ RSpec.describe WorkItems::CreateAndLinkService do
expect do
service_result
end.to not_change(WorkItem, :count).and(
- not_change(IssueLink, :count)
+ not_change(WorkItems::ParentLink, :count)
)
end
diff --git a/spec/services/work_items/create_from_task_service_spec.rb b/spec/services/work_items/create_from_task_service_spec.rb
index b4db925f053..7d2dab228b1 100644
--- a/spec/services/work_items/create_from_task_service_spec.rb
+++ b/spec/services/work_items/create_from_task_service_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe WorkItems::CreateFromTaskService do
expect do
service_result
end.to not_change(WorkItem, :count).and(
- not_change(IssueLink, :count)
+ not_change(WorkItems::ParentLink, :count)
)
end
end
@@ -47,12 +47,14 @@ RSpec.describe WorkItems::CreateFromTaskService do
context 'when work item params are valid' do
it { is_expected.to be_success }
- it 'creates a work item and links it to the original work item successfully' do
+ it 'creates a work item and creates parent link to the original work item' do
expect do
service_result
end.to change(WorkItem, :count).by(1).and(
- change(IssueLink, :count)
+ change(WorkItems::ParentLink, :count).by(1)
)
+
+ expect(work_item_to_update.reload.work_item_children).not_to be_empty
end
it 'replaces the original issue markdown description with new work item reference' do
@@ -73,7 +75,7 @@ RSpec.describe WorkItems::CreateFromTaskService do
expect do
service_result
end.to not_change(WorkItem, :count).and(
- not_change(IssueLink, :count)
+ not_change(WorkItems::ParentLink, :count)
)
end
diff --git a/spec/services/work_items/create_service_spec.rb b/spec/services/work_items/create_service_spec.rb
index f495e967b26..4009c85bacd 100644
--- a/spec/services/work_items/create_service_spec.rb
+++ b/spec/services/work_items/create_service_spec.rb
@@ -6,9 +6,12 @@ RSpec.describe WorkItems::CreateService do
include AfterNextHelpers
let_it_be_with_reload(:project) { create(:project) }
+ let_it_be(:parent) { create(:work_item, project: project) }
let_it_be(:guest) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
let_it_be(:user_with_no_access) { create(:user) }
+ let(:widget_params) { {} }
let(:spam_params) { double }
let(:current_user) { guest }
let(:opts) do
@@ -20,10 +23,21 @@ RSpec.describe WorkItems::CreateService do
before_all do
project.add_guest(guest)
+ project.add_reporter(reporter)
end
describe '#execute' do
- subject(:service_result) { described_class.new(project: project, current_user: current_user, params: opts, spam_params: spam_params).execute }
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ params: opts,
+ spam_params: spam_params,
+ widget_params: widget_params
+ )
+ end
+
+ subject(:service_result) { service.execute }
before do
stub_spam_services
@@ -61,6 +75,14 @@ RSpec.describe WorkItems::CreateService do
it 'returns validation errors' do
expect(service_result.errors).to contain_exactly("Title can't be blank")
end
+
+ it 'does not execute after-create transaction widgets' do
+ expect(service).to receive(:create).and_call_original
+ expect(service).not_to receive(:execute_widgets)
+ .with(callback: :after_create_in_transaction, widget_params: widget_params)
+
+ service_result
+ end
end
context 'checking spam' do
@@ -80,5 +102,104 @@ RSpec.describe WorkItems::CreateService do
service_result
end
end
+
+ it_behaves_like 'work item widgetable service' do
+ let(:widget_params) do
+ {
+ hierarchy_widget: { parent: parent }
+ }
+ end
+
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ params: opts,
+ spam_params: spam_params,
+ widget_params: widget_params
+ )
+ end
+
+ let(:service_execute) { service.execute }
+
+ let(:supported_widgets) do
+ [
+ {
+ klass: WorkItems::Widgets::HierarchyService::CreateService,
+ callback: :after_create_in_transaction,
+ params: { parent: parent }
+ }
+ ]
+ end
+ end
+
+ describe 'hierarchy widget' do
+ let(:widget_params) { { hierarchy_widget: { parent: parent } } }
+
+ shared_examples 'fails creating work item and returns errors' do
+ it 'does not create new work item if parent can not be set' do
+ expect { service_result }.not_to change(WorkItem, :count)
+
+ expect(service_result[:status]).to be(:error)
+ expect(service_result[:message]).to match(error_message)
+ end
+ end
+
+ context 'when user can admin parent link' do
+ let(:current_user) { reporter }
+
+ context 'when parent is valid work item' do
+ let(:opts) do
+ {
+ title: 'Awesome work_item',
+ description: 'please fix',
+ work_item_type: create(:work_item_type, :task)
+ }
+ end
+
+ it 'creates new work item and sets parent reference' do
+ expect { service_result }.to change(
+ WorkItem, :count).by(1).and(change(
+ WorkItems::ParentLink, :count).by(1))
+
+ expect(service_result[:status]).to be(:success)
+ end
+ end
+
+ context 'when parent type is invalid' do
+ let_it_be(:parent) { create(:work_item, :task, project: project) }
+
+ it_behaves_like 'fails creating work item and returns errors' do
+ let(:error_message) { 'only Issue and Incident can be parent of Task.'}
+ end
+ end
+
+ context 'when hierarchy feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items_hierarchy: false)
+ end
+
+ it_behaves_like 'fails creating work item and returns errors' do
+ let(:error_message) { '`work_items_hierarchy` feature flag disabled for this project' }
+ end
+ end
+ end
+
+ context 'when user cannot admin parent link' do
+ let(:current_user) { guest }
+
+ let(:opts) do
+ {
+ title: 'Awesome work_item',
+ description: 'please fix',
+ work_item_type: create(:work_item_type, :task)
+ }
+ end
+
+ it_behaves_like 'fails creating work item and returns errors' do
+ let(:error_message) { 'No matching task found. Make sure that you are adding a valid task ID.'}
+ end
+ end
+ end
end
end
diff --git a/spec/services/work_items/delete_task_service_spec.rb b/spec/services/work_items/delete_task_service_spec.rb
index 04944645c9b..07a0d8d6c1a 100644
--- a/spec/services/work_items/delete_task_service_spec.rb
+++ b/spec/services/work_items/delete_task_service_spec.rb
@@ -67,7 +67,7 @@ RSpec.describe WorkItems::DeleteTaskService do
it 'removes the task list item with the work item reference' do
expect do
service_result
- end.to change(list_work_item, :description).from(list_work_item.description).to('')
+ end.to change(list_work_item, :description).from(list_work_item.description).to("- [ ] #{task.title}")
end
end
diff --git a/spec/services/work_items/parent_links/create_service_spec.rb b/spec/services/work_items/parent_links/create_service_spec.rb
new file mode 100644
index 00000000000..85b0ee040cd
--- /dev/null
+++ b/spec/services/work_items/parent_links/create_service_spec.rb
@@ -0,0 +1,173 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::ParentLinks::CreateService do
+ describe '#execute' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:work_item) { create(:work_item, project: project) }
+ let_it_be(:task) { create(:work_item, :task, project: project) }
+ let_it_be(:task1) { create(:work_item, :task, project: project) }
+ let_it_be(:task2) { create(:work_item, :task, project: project) }
+ let_it_be(:guest_task) { create(:work_item, :task) }
+ let_it_be(:invalid_task) { build_stubbed(:work_item, :task, id: non_existing_record_id)}
+ let_it_be(:another_project) { (create :project) }
+ let_it_be(:other_project_task) { create(:work_item, :task, iid: 100, project: another_project) }
+ let_it_be(:existing_parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item)}
+
+ let(:parent_link_class) { WorkItems::ParentLink }
+ let(:issuable_type) { :task }
+ let(:params) { {} }
+
+ before do
+ project.add_reporter(user)
+ project.add_guest(guest)
+ guest_task.project.add_guest(user)
+ another_project.add_reporter(user)
+ end
+
+ shared_examples 'returns not found error' do
+ it 'returns error' do
+ error = "No matching #{issuable_type} found. Make sure that you are adding a valid #{issuable_type} ID."
+
+ is_expected.to eq(service_error(error))
+ end
+
+ it 'no relationship is created' do
+ expect { subject }.not_to change(parent_link_class, :count)
+ end
+ end
+
+ subject { described_class.new(work_item, user, params).execute }
+
+ context 'when the reference list is empty' do
+ let(:params) { { issuable_references: [] } }
+
+ it_behaves_like 'returns not found error'
+ end
+
+ context 'when work item not found' do
+ let(:params) { { issuable_references: [invalid_task] } }
+
+ it_behaves_like 'returns not found error'
+ end
+
+ context 'when user has no permission to link work items' do
+ let(:params) { { issuable_references: [guest_task] } }
+
+ it_behaves_like 'returns not found error'
+ end
+
+ context 'child and parent are the same work item' do
+ let(:params) { { issuable_references: [work_item] } }
+
+ it 'no relationship is created' do
+ expect { subject }.not_to change(parent_link_class, :count)
+ end
+ end
+
+ context 'when there are tasks to relate' do
+ let(:params) { { issuable_references: [task1, task2] } }
+
+ it 'creates relationships', :aggregate_failures do
+ expect { subject }.to change(parent_link_class, :count).by(2)
+
+ tasks_parent = parent_link_class.where(work_item: [task1, task2]).map(&:work_item_parent).uniq
+ expect(tasks_parent).to match_array([work_item])
+ end
+
+ it 'returns success status and created links', :aggregate_failures do
+ expect(subject.keys).to match_array([:status, :created_references])
+ expect(subject[:status]).to eq(:success)
+ expect(subject[:created_references].map(&:work_item_id)).to match_array([task1.id, task2.id])
+ end
+
+ context 'when task is already assigned' do
+ let(:params) { { issuable_references: [task, task2] } }
+
+ it 'creates links only for non related tasks' do
+ expect { subject }.to change(parent_link_class, :count).by(1)
+
+ expect(subject[:created_references].map(&:work_item_id)).to match_array([task2.id])
+ end
+ end
+
+ context 'when there are invalid children' do
+ let_it_be(:issue) { create(:work_item, project: project) }
+
+ let(:params) { { issuable_references: [task1, issue, other_project_task] } }
+
+ it 'creates links only for valid children' do
+ expect { subject }.to change { parent_link_class.count }.by(1)
+ end
+
+ it 'returns error status' do
+ error = "#{issue.to_reference} cannot be added: only Task can be assigned as a child in hierarchy.. " \
+ "#{other_project_task.to_reference} cannot be added: parent must be in the same project as child."
+
+ is_expected.to eq(service_error(error, http_status: 422))
+ end
+ end
+
+ context 'when parent type is invalid' do
+ let(:work_item) { create :work_item, :task, project: project }
+
+ let(:params) { { target_issuable: task1 } }
+
+ it 'returns error status' do
+ error = "#{task1.to_reference} cannot be added: only Issue and Incident can be parent of Task."
+
+ is_expected.to eq(service_error(error, http_status: 422))
+ end
+ end
+
+ context 'when max depth is reached' do
+ let(:params) { { issuable_references: [task2] } }
+
+ before do
+ stub_const("#{parent_link_class}::MAX_CHILDREN", 1)
+ end
+
+ it 'returns error status' do
+ error = "#{task2.to_reference} cannot be added: parent already has maximum number of children."
+
+ is_expected.to eq(service_error(error, http_status: 422))
+ end
+ end
+
+ context 'when params include invalid ids' do
+ let(:params) { { issuable_references: [task1, invalid_task] } }
+
+ it 'creates links only for valid IDs' do
+ expect { subject }.to change(parent_link_class, :count).by(1)
+ end
+ end
+
+ context 'when user is a guest' do
+ let(:user) { guest }
+
+ it_behaves_like 'returns not found error'
+ end
+
+ context 'when user is a guest assigned to the work item' do
+ let(:user) { guest }
+
+ before do
+ work_item.assignees = [guest]
+ end
+
+ it_behaves_like 'returns not found error'
+ end
+ end
+ end
+
+ def service_error(message, http_status: 404)
+ {
+ message: message,
+ status: :error,
+ http_status: http_status
+ }
+ end
+end
diff --git a/spec/services/work_items/parent_links/destroy_service_spec.rb b/spec/services/work_items/parent_links/destroy_service_spec.rb
new file mode 100644
index 00000000000..574b70af397
--- /dev/null
+++ b/spec/services/work_items/parent_links/destroy_service_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::ParentLinks::DestroyService do
+ describe '#execute' do
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:work_item) { create(:work_item, project: project) }
+ let_it_be(:task) { create(:work_item, :task, project: project) }
+ let_it_be(:parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item)}
+
+ let(:parent_link_class) { WorkItems::ParentLink }
+
+ subject { described_class.new(parent_link, user).execute }
+
+ before do
+ project.add_reporter(reporter)
+ project.add_guest(guest)
+ end
+
+ context 'when user has permissions to update work items' do
+ let(:user) { reporter }
+
+ it 'removes relation' do
+ expect { subject }.to change(parent_link_class, :count).by(-1)
+ end
+
+ it 'returns success message' do
+ is_expected.to eq(message: 'Relation was removed', status: :success)
+ end
+ end
+
+ context 'when user has insufficient permissions' do
+ let(:user) { guest }
+
+ it 'does not remove relation' do
+ expect { subject }.not_to change(parent_link_class, :count).from(1)
+ end
+
+ it 'returns error message' do
+ is_expected.to eq(message: 'No Work Item Link found', status: :error, http_status: 404)
+ end
+ end
+ end
+end
diff --git a/spec/services/work_items/task_list_reference_removal_service_spec.rb b/spec/services/work_items/task_list_reference_removal_service_spec.rb
index bca72da0efa..91b7814ae92 100644
--- a/spec/services/work_items/task_list_reference_removal_service_spec.rb
+++ b/spec/services/work_items/task_list_reference_removal_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe WorkItems::TaskListReferenceRemovalService do
let_it_be(:developer) { create(:user) }
let_it_be(:project) { create(:project, :repository).tap { |project| project.add_developer(developer) } }
- let_it_be(:task) { create(:work_item, project: project) }
+ let_it_be(:task) { create(:work_item, project: project, title: 'Task title') }
let_it_be(:single_line_work_item, refind: true) do
create(:work_item, project: project, description: "- [ ] #{task.to_reference}+ single line")
end
@@ -82,7 +82,7 @@ RSpec.describe WorkItems::TaskListReferenceRemovalService do
let(:line_number_end) { 1 }
let(:work_item) { single_line_work_item }
- it_behaves_like 'successful work item task reference removal service', ''
+ it_behaves_like 'successful work item task reference removal service', '- [ ] Task title single line'
context 'when description does not contain a task' do
let_it_be(:no_matching_work_item) { create(:work_item, project: project, description: 'no matching task') }
@@ -102,7 +102,8 @@ RSpec.describe WorkItems::TaskListReferenceRemovalService do
end
context 'when task mardown spans multiple lines' do
- it_behaves_like 'successful work item task reference removal service', "Any text\n\n* [x] task\n\nMore text"
+ it_behaves_like 'successful work item task reference removal service',
+ "Any text\n\n* [ ] Item to be converted\n Task title second line\n third line\n* [x] task\n\nMore text"
end
context 'when updating the work item fails' do
diff --git a/spec/services/work_items/task_list_reference_replacement_service_spec.rb b/spec/services/work_items/task_list_reference_replacement_service_spec.rb
index e7914eb4a92..965c5f1d554 100644
--- a/spec/services/work_items/task_list_reference_replacement_service_spec.rb
+++ b/spec/services/work_items/task_list_reference_replacement_service_spec.rb
@@ -3,7 +3,8 @@
require 'spec_helper'
RSpec.describe WorkItems::TaskListReferenceReplacementService do
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:project) { create(:project, :repository).tap { |project| project.add_developer(developer) } }
let_it_be(:single_line_work_item, refind: true) { create(:work_item, project: project, description: '- [ ] single line', lock_version: 3) }
let_it_be(:multiple_line_work_item, refind: true) { create(:work_item, project: project, description: "Any text\n\n* [ ] Item to be converted\n second line\n third line", lock_version: 3) }
@@ -37,6 +38,7 @@ RSpec.describe WorkItems::TaskListReferenceReplacementService do
subject(:result) do
described_class.new(
work_item: work_item,
+ current_user: developer,
work_item_reference: reference,
line_number_start: line_number_start,
line_number_end: line_number_end,
@@ -52,6 +54,12 @@ RSpec.describe WorkItems::TaskListReferenceReplacementService do
let(:task_prefix) { '- [ ]' }
it_behaves_like 'successful work item task reference replacement service'
+
+ it 'creates description version note' do
+ expect { result }.to change(Note, :count).by(1)
+ expect(work_item.notes.last.note).to eq('changed the description')
+ expect(work_item.saved_description_version.id).to eq(work_item.notes.last.system_note_metadata.description_version_id)
+ end
end
context 'when task mardown spans multiple lines' do
diff --git a/spec/services/work_items/update_service_spec.rb b/spec/services/work_items/update_service_spec.rb
index 9030326dadb..b17c9ffb4fb 100644
--- a/spec/services/work_items/update_service_spec.rb
+++ b/spec/services/work_items/update_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe WorkItems::UpdateService do
let_it_be(:developer) { create(:user) }
let_it_be(:project) { create(:project).tap { |proj| proj.add_developer(developer) } }
+ let_it_be(:parent) { create(:work_item, project: project) }
let_it_be_with_reload(:work_item) { create(:work_item, project: project, assignees: [developer]) }
let(:spam_params) { double }
@@ -13,7 +14,15 @@ RSpec.describe WorkItems::UpdateService do
let(:current_user) { developer }
describe '#execute' do
- subject(:update_work_item) { described_class.new(project: project, current_user: current_user, params: opts, spam_params: spam_params, widget_params: widget_params).execute(work_item) }
+ subject(:update_work_item) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ params: opts,
+ spam_params: spam_params,
+ widget_params: widget_params
+ ).execute(work_item)
+ end
before do
stub_spam_services
@@ -27,8 +36,7 @@ RSpec.describe WorkItems::UpdateService do
expect(Gitlab::UsageDataCounters::WorkItemActivityUniqueCounter).to receive(:track_work_item_title_changed_action).with(author: current_user)
# During the work item transition we also want to track work items as issues
expect(Gitlab::UsageDataCounters::IssueActivityUniqueCounter).to receive(:track_issue_title_changed_action)
-
- update_work_item
+ expect(update_work_item[:status]).to eq(:success)
end
end
@@ -38,8 +46,7 @@ RSpec.describe WorkItems::UpdateService do
it 'does not trigger issuable_title_updated graphql subscription' do
expect(GraphqlTriggers).not_to receive(:issuable_title_updated)
expect(Gitlab::UsageDataCounters::WorkItemActivityUniqueCounter).not_to receive(:track_work_item_title_changed_action)
-
- update_work_item
+ expect(update_work_item[:status]).to eq(:success)
end
end
@@ -71,16 +78,104 @@ RSpec.describe WorkItems::UpdateService do
end
end
+ it_behaves_like 'work item widgetable service' do
+ let(:widget_params) do
+ {
+ hierarchy_widget: { parent: parent },
+ description_widget: { description: 'foo' },
+ weight_widget: { weight: 1 }
+ }
+ end
+
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ params: opts,
+ spam_params: spam_params,
+ widget_params: widget_params
+ )
+ end
+
+ let(:service_execute) { service.execute(work_item) }
+
+ let(:supported_widgets) do
+ [
+ { klass: WorkItems::Widgets::DescriptionService::UpdateService, callback: :update, params: { description: 'foo' } },
+ { klass: WorkItems::Widgets::WeightService::UpdateService, callback: :update, params: { weight: 1 } },
+ { klass: WorkItems::Widgets::HierarchyService::UpdateService, callback: :before_update_in_transaction, params: { parent: parent } }
+ ]
+ end
+ end
+
context 'when updating widgets' do
- context 'for the description widget' do
- let(:widget_params) { { description_widget: { description: 'changed' } } }
+ let(:widget_service_class) { WorkItems::Widgets::DescriptionService::UpdateService }
+ let(:widget_params) { { description_widget: { description: 'changed' } } }
+
+ context 'when widget service is not present' do
+ before do
+ allow(widget_service_class).to receive(:new).and_return(nil)
+ end
+
+ it 'ignores widget param' do
+ expect { update_work_item }.not_to change(work_item, :description)
+ end
+ end
+ context 'when the widget does not support update callback' do
+ before do
+ allow_next_instance_of(widget_service_class) do |instance|
+ allow(instance)
+ .to receive(:update)
+ .with(params: { description: 'changed' }).and_return(nil)
+ end
+ end
+
+ it 'ignores widget param' do
+ expect { update_work_item }.not_to change(work_item, :description)
+ end
+ end
+
+ context 'for the description widget' do
it 'updates the description of the work item' do
update_work_item
expect(work_item.description).to eq('changed')
end
end
+
+ context 'for the hierarchy widget' do
+ let(:opts) { { title: 'changed' } }
+ let_it_be(:child_work_item) { create(:work_item, :task, project: project) }
+
+ let(:widget_params) { { hierarchy_widget: { children: [child_work_item] } } }
+
+ it 'updates the children of the work item' do
+ expect do
+ update_work_item
+ work_item.reload
+ end.to change(WorkItems::ParentLink, :count).by(1)
+
+ expect(work_item.work_item_children).to include(child_work_item)
+ end
+
+ context 'when child type is invalid' do
+ let_it_be(:child_work_item) { create(:work_item, project: project) }
+
+ it 'returns error status' do
+ expect(subject[:status]).to be(:error)
+ expect(subject[:message])
+ .to match("#{child_work_item.to_reference} cannot be added: only Task can be assigned as a child in hierarchy.")
+ end
+
+ it 'does not update work item attributes' do
+ expect do
+ update_work_item
+ work_item.reload
+ end.to not_change(WorkItems::ParentLink, :count).and(not_change(work_item, :title))
+ end
+ end
+ end
end
end
end
diff --git a/spec/services/work_items/widgets/description_service/update_service_spec.rb b/spec/services/work_items/widgets/description_service/update_service_spec.rb
new file mode 100644
index 00000000000..a2eceb97f09
--- /dev/null
+++ b/spec/services/work_items/widgets/description_service/update_service_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::Widgets::DescriptionService::UpdateService do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be_with_reload(:work_item) { create(:work_item, project: project, description: 'old description') }
+
+ let(:widget) { work_item.widgets.find {|widget| widget.is_a?(WorkItems::Widgets::Description) } }
+
+ describe '#update' do
+ subject { described_class.new(widget: widget, current_user: user).update(params: params) } # rubocop:disable Rails/SaveBang
+
+ context 'when description param is present' do
+ let(:params) { { description: 'updated description' } }
+
+ it 'correctly sets work item description value' do
+ subject
+
+ expect(work_item.description).to eq('updated description')
+ end
+ end
+
+ context 'when description param is not present' do
+ let(:params) { {} }
+
+ it 'does not change work item description value' do
+ subject
+
+ expect(work_item.description).to eq('old description')
+ end
+ end
+ end
+end
diff --git a/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb b/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb
new file mode 100644
index 00000000000..4f6ff1b8676
--- /dev/null
+++ b/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb
@@ -0,0 +1,160 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+
+ let_it_be(:work_item) { create(:work_item, project: project) }
+ let_it_be(:parent_work_item) { create(:work_item, project: project) }
+ let_it_be(:child_work_item) { create(:work_item, :task, project: project) }
+ let_it_be(:existing_link) { create(:parent_link, work_item: child_work_item, work_item_parent: work_item) }
+
+ let(:widget) { work_item.widgets.find {|widget| widget.is_a?(WorkItems::Widgets::Hierarchy) } }
+ let(:not_found_error) { 'No matching task found. Make sure that you are adding a valid task ID.' }
+
+ shared_examples 'raises a WidgetError' do
+ it { expect { subject }.to raise_error(described_class::WidgetError, message) }
+ end
+
+ describe '#update' do
+ subject { described_class.new(widget: widget, current_user: user).before_update_in_transaction(params: params) }
+
+ context 'when parent and children params are present' do
+ let(:params) { { parent: parent_work_item, children: [child_work_item] } }
+
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) { 'A Work Item can be a parent or a child, but not both.' }
+ end
+ end
+
+ context 'when updating children' do
+ let_it_be(:child_work_item2) { create(:work_item, :task, project: project) }
+ let_it_be(:child_work_item3) { create(:work_item, :task, project: project) }
+ let_it_be(:child_work_item4) { create(:work_item, :task, project: project) }
+
+ context 'when work_items_hierarchy feature flag is disabled' do
+ let(:params) { { children: [child_work_item4] }}
+
+ before do
+ stub_feature_flags(work_items_hierarchy: false)
+ end
+
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) { '`work_items_hierarchy` feature flag disabled for this project' }
+ end
+ end
+
+ context 'when user has insufficient permissions to link work items' do
+ let(:params) { { children: [child_work_item4] }}
+
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) { not_found_error }
+ end
+ end
+
+ context 'when user has sufficient permissions to link work item' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'with valid params' do
+ let(:params) { { children: [child_work_item2, child_work_item3] }}
+
+ it 'correctly sets work item parent' do
+ subject
+
+ expect(work_item.reload.work_item_children)
+ .to contain_exactly(child_work_item, child_work_item2, child_work_item3)
+ end
+ end
+
+ context 'when child is already assigned' do
+ let(:params) { { children: [child_work_item] }}
+
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) { 'Task(s) already assigned' }
+ end
+ end
+
+ context 'when child type is invalid' do
+ let_it_be(:child_issue) { create(:work_item, project: project) }
+
+ let(:params) { { children: [child_issue] }}
+
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) do
+ "#{child_issue.to_reference} cannot be added: only Task can be assigned as a child in hierarchy."
+ end
+ end
+ end
+ end
+ end
+
+ context 'when updating parent' do
+ let_it_be(:work_item) { create(:work_item, :task, project: project) }
+
+ let(:params) {{ parent: parent_work_item } }
+
+ context 'when work_items_hierarchy feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items_hierarchy: false)
+ end
+
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) { '`work_items_hierarchy` feature flag disabled for this project' }
+ end
+ end
+
+ context 'when user has insufficient permissions to link work items' do
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) { not_found_error }
+ end
+ end
+
+ context 'when user has sufficient permissions to link work item' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'correctly sets new parent' do
+ expect(subject[:status]).to eq(:success)
+ expect(work_item.work_item_parent).to eq(parent_work_item)
+ end
+
+ context 'when parent is nil' do
+ let(:params) { { parent: nil } }
+
+ it 'removes the work item parent if present' do
+ work_item.update!(work_item_parent: parent_work_item)
+
+ expect do
+ subject
+ work_item.reload
+ end.to change(work_item, :work_item_parent).from(parent_work_item).to(nil)
+ end
+
+ it 'returns success status if parent not present', :aggregate_failure do
+ work_item.update!(work_item_parent: nil)
+
+ expect(subject[:status]).to eq(:success)
+ expect(work_item.reload.work_item_parent).to be_nil
+ end
+ end
+
+ context 'when type is invalid' do
+ let_it_be(:parent_task) { create(:work_item, :task, project: project)}
+
+ let(:params) {{ parent: parent_task } }
+
+ it_behaves_like 'raises a WidgetError' do
+ let(:message) do
+ "#{work_item.to_reference} cannot be added: only Issue and Incident can be parent of Task."
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/work_items/widgets/weight_service/update_service_spec.rb b/spec/services/work_items/widgets/weight_service/update_service_spec.rb
new file mode 100644
index 00000000000..97e17f1c526
--- /dev/null
+++ b/spec/services/work_items/widgets/weight_service/update_service_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::Widgets::WeightService::UpdateService do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be_with_reload(:work_item) { create(:work_item, project: project, weight: 1) }
+
+ let(:widget) { work_item.widgets.find {|widget| widget.is_a?(WorkItems::Widgets::Weight) } }
+
+ describe '#update' do
+ subject { described_class.new(widget: widget, current_user: user).update(params: params) } # rubocop:disable Rails/SaveBang
+
+ context 'when weight param is present' do
+ let(:params) { { weight: 2 } }
+
+ it 'correctly sets work item weight value' do
+ subject
+
+ expect(work_item.weight).to eq(2)
+ end
+ end
+
+ context 'when weight param is not present' do
+ let(:params) { {} }
+
+ it 'does not change work item weight value', :aggregate_failures do
+ expect { subject }
+ .to not_change { work_item.weight }
+
+ expect(work_item.weight).to eq(1)
+ end
+ end
+ end
+end
diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb
index da4a0e8da80..dbaecc6a233 100644
--- a/spec/simplecov_env.rb
+++ b/spec/simplecov_env.rb
@@ -9,7 +9,7 @@ module SimpleCovEnv
extend self
def start!
- return unless ENV['SIMPLECOV']
+ return if !ENV.key?('SIMPLECOV') || ENV['SIMPLECOV'] == '0'
configure_profile
configure_job
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index b39153e79fc..47cd78873f8 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -201,10 +201,13 @@ RSpec.configure do |config|
config.include SidekiqMiddleware
config.include StubActionCableConnection, type: :channel
config.include StubSpamServices
+ config.include SnowplowHelpers
config.include RenderedHelpers
config.include RSpec::Benchmark::Matchers, type: :benchmark
+ config.include DetailedErrorHelpers
include StubFeatureFlags
+ include StubSnowplow
if ENV['CI'] || ENV['RETRIES']
# This includes the first try, i.e. tests will be run 4 times before failing.
@@ -273,6 +276,9 @@ RSpec.configure do |config|
# (ie. ApplicationSetting#auto_devops_enabled)
stub_feature_flags(force_autodevops_on_by_default: false)
+ # The survey popover can block the diffs causing specs to fail
+ stub_feature_flags(mr_experience_survey: false)
+
# Merge request widget GraphQL requests are disabled in the tests
# for now whilst we migrate as much as we can over the GraphQL
# stub_feature_flags(merge_request_widget_graphql: false)
@@ -289,6 +295,10 @@ RSpec.configure do |config|
stub_feature_flags(ci_queueing_disaster_recovery_disable_fair_scheduling: false)
stub_feature_flags(ci_queueing_disaster_recovery_disable_quota: false)
+ # It's disabled in specs because we don't support certain features which
+ # cause spec failures.
+ stub_feature_flags(use_click_house_database_for_error_tracking: false)
+
enable_rugged = example.metadata[:enable_rugged].present?
# Disable Rugged features by default
@@ -296,10 +306,6 @@ RSpec.configure do |config|
stub_feature_flags(flag => enable_rugged)
end
- # Disable the usage of file_identifier_hash by default until it is ready
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/33867
- stub_feature_flags(file_identifier_hash: false)
-
# Disable `main_branch_over_master` as we migrate
# from `master` to `main` accross our codebase.
# It's done in order to preserve the concistency in tests
@@ -320,6 +326,14 @@ RSpec.configure do |config|
# most cases. We do test the CAPTCHA flow in the appropriate specs.
stub_feature_flags(arkose_labs_login_challenge: false)
+ # Specs should not require email verification by default, this makes the sign-in flow simpler in
+ # most cases. We do test the email verification flow in the appropriate specs.
+ stub_feature_flags(require_email_verification: false)
+
+ # This feature flag is for selectively disabling by actor, therefore we don't enable it by default.
+ # See https://docs.gitlab.com/ee/development/feature_flags/#selectively-disable-by-actor
+ stub_feature_flags(legacy_merge_request_state_check_for_merged_result_pipelines: false)
+
allow(Gitlab::GitalyClient).to receive(:can_use_disk?).and_return(enable_rugged)
else
unstub_all_feature_flags
@@ -363,6 +377,9 @@ RSpec.configure do |config|
stub_application_setting(admin_mode: true) unless example.metadata[:do_not_mock_admin_mode_setting]
allow(Gitlab::CurrentSettings).to receive(:current_application_settings?).and_return(false)
+
+ # Ensure that Snowplow is enabled by default unless forced to the opposite
+ stub_snowplow unless example.metadata[:do_not_stub_snowplow_by_default]
end
config.around(:example, :quarantine) do |example|
diff --git a/spec/support/finder_collection.rb b/spec/support/finder_collection.rb
new file mode 100644
index 00000000000..494dd4bdca1
--- /dev/null
+++ b/spec/support/finder_collection.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'set'
+
+module Support
+ # Ensure that finders' `execute` method always returns
+ # `ActiveRecord::Relation`.
+ #
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/298771
+ module FinderCollection
+ def self.install_check(finder_class)
+ return unless check?(finder_class)
+
+ finder_class.prepend CheckResult
+ end
+
+ ALLOWLIST_YAML = File.join(__dir__, 'finder_collection_allowlist.yml')
+
+ def self.check?(finder_class)
+ @allowlist ||= YAML.load_file(ALLOWLIST_YAML).to_set
+
+ @allowlist.exclude?(finder_class.name)
+ end
+
+ module CheckResult
+ def execute(...)
+ result = super
+
+ unless result.is_a?(ActiveRecord::Relation)
+ raise <<~MESSAGE
+ #{self.class}#execute returned `#{result.class}` instead of `ActiveRecord::Relation`.
+ All finder classes are expected to return `ActiveRecord::Relation`.
+
+ Read more at https://docs.gitlab.com/ee/development/reusing_abstractions.html#finders
+ MESSAGE
+ end
+
+ result
+ end
+ end
+ end
+end
+
+RSpec.configure do |config|
+ config.before(:all, type: :finder) do
+ Support::FinderCollection.install_check(described_class)
+ end
+end
diff --git a/spec/support/finder_collection_allowlist.yml b/spec/support/finder_collection_allowlist.yml
new file mode 100644
index 00000000000..8f09153afec
--- /dev/null
+++ b/spec/support/finder_collection_allowlist.yml
@@ -0,0 +1,66 @@
+# Allow list for spec/support/finder_collection.rb
+
+# Permenant excludes
+# For example:
+# FooFinder # Reason: It uses a memory backend
+
+# Temporary excludes (aka TODOs)
+# For example:
+# BarFinder # See <ISSUE_URL>
+- AccessRequestsFinder
+- Admin::PlansFinder
+- Analytics::CycleAnalytics::StageFinder
+- ApplicationsFinder
+- Autocomplete::GroupFinder
+- Autocomplete::ProjectFinder
+- Autocomplete::UsersFinder
+- BilledUsersFinder
+- Boards::BoardsFinder
+- Boards::VisitsFinder
+- BranchesFinder
+- Ci::AuthJobFinder
+- Ci::CommitStatusesFinder
+- Ci::DailyBuildGroupReportResultsFinder
+- ClusterAncestorsFinder
+- Clusters::AgentAuthorizationsFinder
+- Clusters::KubernetesNamespaceFinder
+- ComplianceManagement::MergeRequests::ComplianceViolationsFinder
+- ContainerRepositoriesFinder
+- ContextCommitsFinder
+- Environments::EnvironmentNamesFinder
+- Environments::EnvironmentsByDeploymentsFinder
+- EventsFinder
+- GroupDescendantsFinder
+- Groups::ProjectsRequiringAuthorizationsRefresh::OnDirectMembershipFinder
+- Groups::ProjectsRequiringAuthorizationsRefresh::OnTransferFinder
+- KeysFinder
+- LfsPointersFinder
+- LicenseTemplateFinder
+- MergeRequests::OldestPerCommitFinder
+- NotesFinder
+- Packages::BuildInfosFinder
+- Packages::Conan::PackageFileFinder
+- Packages::Go::ModuleFinder
+- Packages::Go::PackageFinder
+- Packages::Go::VersionFinder
+- Packages::PackageFileFinder
+- Packages::PackageFinder
+- Packages::Pypi::PackageFinder
+- Projects::Integrations::Jira::ByIdsFinder
+- Projects::Integrations::Jira::IssuesFinder
+- Releases::EvidencePipelineFinder
+- Repositories::BranchNamesFinder
+- Repositories::ChangelogTagFinder
+- Repositories::TreeFinder
+- Security::FindingsFinder
+- Security::PipelineVulnerabilitiesFinder
+- Security::ScanExecutionPoliciesFinder
+- Security::TrainingProviders::BaseUrlFinder
+- Security::TrainingUrlsFinder
+- SentryIssueFinder
+- ServerlessDomainFinder
+- TagsFinder
+- TemplateFinder
+- UploaderFinder
+- UserGroupNotificationSettingsFinder
+- UserGroupsCounter
diff --git a/spec/support/gitlab_experiment.rb b/spec/support/gitlab_experiment.rb
index 823aab0436e..4236091ca6c 100644
--- a/spec/support/gitlab_experiment.rb
+++ b/spec/support/gitlab_experiment.rb
@@ -2,7 +2,6 @@
# Require the provided spec helper and matchers.
require 'gitlab/experiment/rspec'
-require_relative 'stub_snowplow'
RSpec.configure do |config|
config.include StubSnowplow, :experiment
diff --git a/spec/support/gitlab_stubs/gitlab_ci_dast_includes.yml b/spec/support/gitlab_stubs/gitlab_ci_dast_includes.yml
new file mode 100644
index 00000000000..583d44c452e
--- /dev/null
+++ b/spec/support/gitlab_stubs/gitlab_ci_dast_includes.yml
@@ -0,0 +1,10 @@
+dast:
+ stage: dast
+ image:
+ name: "$SECURE_ANALYZERS_PREFIX/dast:$DAST_VERSION"
+ variables:
+ GIT_STRATEGY: none
+ allow_failure: true
+ dast_configuration:
+ site_profile: "site_profile_name_included"
+ scanner_profile: "scanner_profile_name_included" \ No newline at end of file
diff --git a/spec/support/graphql/arguments.rb b/spec/support/graphql/arguments.rb
index a5bb01c31a3..478a460a0f6 100644
--- a/spec/support/graphql/arguments.rb
+++ b/spec/support/graphql/arguments.rb
@@ -5,7 +5,7 @@ module Graphql
delegate :blank?, :empty?, to: :to_h
def initialize(values)
- @values = values.compact
+ @values = values
end
def to_h
@@ -42,7 +42,7 @@ module Graphql
when Integer, Float, Symbol then value.to_s
when String, GlobalID then "\"#{value.to_s.gsub(/"/, '\\"')}\""
when Time, Date then "\"#{value.iso8601}\""
- when nil then 'null'
+ when NilClass then 'null'
when true then 'true'
when false then 'false'
else
diff --git a/spec/support/helpers/database/database_helpers.rb b/spec/support/helpers/database/database_helpers.rb
index db093bcef85..f3b2a2a6147 100644
--- a/spec/support/helpers/database/database_helpers.rb
+++ b/spec/support/helpers/database/database_helpers.rb
@@ -4,8 +4,10 @@ module Database
module DatabaseHelpers
# In order to directly work with views using factories,
# we can swapout the view for a table of identical structure.
- def swapout_view_for_table(view)
- ActiveRecord::Base.connection.execute(<<~SQL.squish)
+ def swapout_view_for_table(view, connection: nil)
+ connection ||= ActiveRecord::Base.connection
+
+ connection.execute(<<~SQL.squish)
CREATE TABLE #{view}_copy (LIKE #{view});
DROP VIEW #{view};
ALTER TABLE #{view}_copy RENAME TO #{view};
diff --git a/spec/support/helpers/detailed_error_helpers.rb b/spec/support/helpers/detailed_error_helpers.rb
new file mode 100644
index 00000000000..2da53a6bffd
--- /dev/null
+++ b/spec/support/helpers/detailed_error_helpers.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'google/rpc/status_pb'
+require 'google/protobuf/well_known_types'
+
+module DetailedErrorHelpers
+ def new_detailed_error(error_code, error_message, details)
+ status_error = Google::Rpc::Status.new(
+ code: error_code,
+ message: error_message,
+ details: [Google::Protobuf::Any.pack(details)]
+ )
+
+ GRPC::BadStatus.new(
+ error_code,
+ error_message,
+ { "grpc-status-details-bin" => Google::Rpc::Status.encode(status_error) })
+ 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 7ed64615020..b56ac5b32c6 100644
--- a/spec/support/helpers/features/invite_members_modal_helper.rb
+++ b/spec/support/helpers/features/invite_members_modal_helper.rb
@@ -9,18 +9,28 @@ module Spec
click_on 'Invite members'
page.within invite_modal_selector do
- Array.wrap(names).each do |name|
- find(member_dropdown_selector).set(name)
+ select_members(names)
+ choose_options(role, expires_at)
+ click_button 'Invite'
+ end
- wait_for_requests
- click_button name
- end
+ page.refresh if refresh
+ end
- choose_options(role, expires_at)
+ def input_invites(names)
+ click_on 'Invite members'
- click_button 'Invite'
+ page.within invite_modal_selector do
+ select_members(names)
+ end
+ end
+
+ def select_members(names)
+ Array.wrap(names).each do |name|
+ find(member_dropdown_selector).set(name)
- page.refresh if refresh
+ wait_for_requests
+ click_button name
end
end
@@ -64,6 +74,24 @@ module Spec
'[data-testid="invite-modal"]'
end
+ def member_token_error_selector(id)
+ "[data-testid='error-icon-#{id}']"
+ end
+
+ def member_token_avatar_selector
+ "[data-testid='token-avatar']"
+ end
+
+ def member_token_selector(id)
+ "[data-token-id='#{id}']"
+ end
+
+ def remove_token(id)
+ page.within member_token_selector(id) do
+ find('[data-testid="close-icon"]').click
+ end
+ end
+
def expect_to_have_group(group)
expect(page).to have_selector("[entity-id='#{group.id}']")
end
diff --git a/spec/support/helpers/features/source_editor_spec_helpers.rb b/spec/support/helpers/features/source_editor_spec_helpers.rb
index 57057b47fbb..cdc59f9cbe1 100644
--- a/spec/support/helpers/features/source_editor_spec_helpers.rb
+++ b/spec/support/helpers/features/source_editor_spec_helpers.rb
@@ -15,13 +15,6 @@ module Spec
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
diff --git a/spec/support/helpers/features/web_ide_spec_helpers.rb b/spec/support/helpers/features/web_ide_spec_helpers.rb
index 358bfacce05..70dedc3ac50 100644
--- a/spec/support/helpers/features/web_ide_spec_helpers.rb
+++ b/spec/support/helpers/features/web_ide_spec_helpers.rb
@@ -12,7 +12,7 @@
# ide_commit
#
module WebIdeSpecHelpers
- include ActionView::Helpers::JavaScriptHelper
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
def ide_visit(project)
visit project_path(project)
@@ -97,17 +97,7 @@ module WebIdeSpecHelpers
end
def ide_set_editor_value(value)
- editor = find('.monaco-editor')
- uri = editor['data-uri']
-
- execute_script("monaco.editor.getModel('#{uri}').setValue('#{escape_javascript(value)}')")
- end
-
- def ide_editor_value
- editor = find('.monaco-editor')
- uri = editor['data-uri']
-
- evaluate_script("monaco.editor.getModel('#{uri}').getValue()")
+ editor_set_value(value)
end
def ide_commit_tab_selector
diff --git a/spec/support/helpers/harbor_helper.rb b/spec/support/helpers/harbor_helper.rb
new file mode 100644
index 00000000000..3f13710ede6
--- /dev/null
+++ b/spec/support/helpers/harbor_helper.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module HarborHelper
+ def harbor_repository_url(container, *args)
+ if container.is_a?(Project)
+ project_harbor_repositories_path(container, *args)
+ else
+ group_harbor_repositories_path(container, *args)
+ end
+ end
+
+ def harbor_artifact_url(container, *args)
+ if container.is_a?(Project)
+ project_harbor_repository_artifacts_path(container, *args)
+ else
+ group_harbor_repository_artifacts_path(container, *args)
+ end
+ end
+
+ def harbor_tag_url(container, *args)
+ if container.is_a?(Project)
+ project_harbor_repository_artifact_tags_path(container, *args)
+ else
+ group_harbor_repository_artifact_tags_path(container, *args)
+ end
+ end
+end
diff --git a/spec/support/helpers/kubernetes_helpers.rb b/spec/support/helpers/kubernetes_helpers.rb
index 29064f01913..dd210f02ae7 100644
--- a/spec/support/helpers/kubernetes_helpers.rb
+++ b/spec/support/helpers/kubernetes_helpers.rb
@@ -126,24 +126,6 @@ module KubernetesHelpers
WebMock.stub_request(:get, pod_url).to_return(response || kube_pod_response)
end
- def stub_kubeclient_logs(pod_name, namespace, container: nil, status: nil, message: nil)
- stub_kubeclient_discover(service.api_url)
-
- if container
- container_query_param = "container=#{container}&"
- end
-
- logs_url = service.api_url + "/api/v1/namespaces/#{namespace}/pods/#{pod_name}" \
- "/log?#{container_query_param}tailLines=#{::PodLogs::KubernetesService::LOGS_LIMIT}&timestamps=true"
-
- if status
- response = { status: status }
- response[:body] = { message: message }.to_json if message
- end
-
- WebMock.stub_request(:get, logs_url).to_return(response || kube_logs_response)
- end
-
def stub_kubeclient_deployments(namespace, status: nil)
stub_kubeclient_discover(service.api_url)
deployments_url = service.api_url + "/apis/apps/v1/namespaces/#{namespace}/deployments"
diff --git a/spec/support/helpers/project_forks_helper.rb b/spec/support/helpers/project_forks_helper.rb
index 84b5dbc1d23..1504625bb00 100644
--- a/spec/support/helpers/project_forks_helper.rb
+++ b/spec/support/helpers/project_forks_helper.rb
@@ -70,12 +70,9 @@ module ProjectForksHelper
def fork_project_with_submodules(project, user = nil, params = {})
Gitlab::GitalyClient.allow_n_plus_1_calls do
forked_project = fork_project_direct(project, user, params)
- TestEnv.copy_repo(
- forked_project,
- bare_repo: TestEnv.forked_repo_path_bare,
- refs: TestEnv::FORKED_BRANCH_SHA
- )
- forked_project.repository.expire_content_cache
+ repo = Gitlab::GlRepository::PROJECT.repository_for(forked_project)
+ repo.create_from_bundle(TestEnv.forked_repo_bundle_path)
+ repo.expire_content_cache
forked_project
end
diff --git a/spec/support/helpers/project_helpers.rb b/spec/support/helpers/project_helpers.rb
index ef8947ab340..2427ed2bcc9 100644
--- a/spec/support/helpers/project_helpers.rb
+++ b/spec/support/helpers/project_helpers.rb
@@ -13,7 +13,7 @@ module ProjectHelpers
when :admin
create(:user, :admin, name: 'admin')
else
- create(:user, name: membership).tap { |u| target.add_user(u, membership) }
+ create(:user, name: membership).tap { |u| target.add_member(u, membership) }
end
end
diff --git a/spec/support/helpers/prometheus_helpers.rb b/spec/support/helpers/prometheus_helpers.rb
index d49abbf3f19..e1f5e6dee14 100644
--- a/spec/support/helpers/prometheus_helpers.rb
+++ b/spec/support/helpers/prometheus_helpers.rb
@@ -267,6 +267,13 @@ module PrometheusHelpers
}
end
+ def prometheus_alert_payload_fingerprint(prometheus_alert)
+ # timestamp is hard-coded in #prometheus_map_alert_payload
+ fingerprint = "#{prometheus_alert.prometheus_metric_id}/2018-09-24T08:57:31.095725221Z"
+
+ Gitlab::AlertManagement::Fingerprint.generate(fingerprint)
+ end
+
private
def prometheus_map_alert_payload(status, alert)
diff --git a/spec/support/helpers/repo_helpers.rb b/spec/support/helpers/repo_helpers.rb
index f275be39dc4..e76a1dd5a74 100644
--- a/spec/support/helpers/repo_helpers.rb
+++ b/spec/support/helpers/repo_helpers.rb
@@ -137,80 +137,4 @@ eos
file_content: content
).execute
end
-
- def commit_options(repo, index, target, ref, message)
- options = {}
- options[:tree] = index.write_tree(repo)
- options[:author] = {
- email: "test@example.com",
- name: "Test Author",
- time: Time.gm(2014, "mar", 3, 20, 15, 1)
- }
- options[:committer] = {
- email: "test@example.com",
- name: "Test Author",
- time: Time.gm(2014, "mar", 3, 20, 15, 1)
- }
- options[:message] ||= message
- options[:parents] = repo.empty? ? [] : [target].compact
- options[:update_ref] = ref
-
- options
- end
-
- # Writes a new commit to the repo and returns a Rugged::Commit. Replaces the
- # contents of CHANGELOG with a single new line of text.
- def new_commit_edit_old_file(repo)
- oid = repo.write("I replaced the changelog with this text", :blob)
- index = repo.index
- index.read_tree(repo.head.target.tree)
- index.add(path: "CHANGELOG", oid: oid, mode: 0100644)
-
- options = commit_options(
- repo,
- index,
- repo.head.target,
- "HEAD",
- "Edit CHANGELOG in its original location"
- )
-
- sha = Rugged::Commit.create(repo, options)
- repo.lookup(sha)
- end
-
- # Writes a new commit to the repo and returns a Rugged::Commit. Replaces the
- # contents of the specified file_path with new text.
- def new_commit_edit_new_file(repo, file_path, commit_message, text, branch = repo.head)
- oid = repo.write(text, :blob)
- index = repo.index
- index.read_tree(branch.target.tree)
- index.add(path: file_path, oid: oid, mode: 0100644)
- options = commit_options(repo, index, branch.target, branch.canonical_name, commit_message)
- sha = Rugged::Commit.create(repo, options)
- repo.lookup(sha)
- end
-
- # Writes a new commit to the repo and returns a Rugged::Commit. Replaces the
- # contents of encoding/CHANGELOG with new text.
- def new_commit_edit_new_file_on_branch(repo, file_path, branch_name, commit_message, text)
- branch = repo.branches[branch_name]
- new_commit_edit_new_file(repo, file_path, commit_message, text, branch)
- end
-
- # Writes a new commit to the repo and returns a Rugged::Commit. Moves the
- # CHANGELOG file to the encoding/ directory.
- def new_commit_move_file(repo)
- blob_oid = repo.head.target.tree.detect { |i| i[:name] == "CHANGELOG" }[:oid]
- file_content = repo.lookup(blob_oid).content
- oid = repo.write(file_content, :blob)
- index = repo.index
- index.read_tree(repo.head.target.tree)
- index.add(path: "encoding/CHANGELOG", oid: oid, mode: 0100644)
- index.remove("CHANGELOG")
-
- options = commit_options(repo, index, repo.head.target, "HEAD", "Move CHANGELOG to encoding/")
-
- sha = Rugged::Commit.create(repo, options)
- repo.lookup(sha)
- end
end
diff --git a/spec/support/helpers/seed_helper.rb b/spec/support/helpers/seed_helper.rb
index f65993efa05..59723583cbc 100644
--- a/spec/support/helpers/seed_helper.rb
+++ b/spec/support/helpers/seed_helper.rb
@@ -9,7 +9,6 @@ TEST_REPO_PATH = 'gitlab-git-test.git'
TEST_NORMAL_REPO_PATH = 'not-bare-repo.git'
TEST_MUTABLE_REPO_PATH = 'mutable-repo.git'
TEST_BROKEN_REPO_PATH = 'broken-repo.git'
-TEST_GITATTRIBUTES_REPO_PATH = 'with-git-attributes.git'
module SeedHelper
GITLAB_GIT_TEST_REPO_URL = File.expand_path('../gitlab-git-test.git', __dir__)
@@ -25,8 +24,6 @@ module SeedHelper
create_normal_seeds
create_mutable_seeds
create_broken_seeds
- create_git_attributes
- create_invalid_git_attributes
end
def create_bare_seeds
@@ -67,48 +64,4 @@ module SeedHelper
FileUtils.rm_r(refs_path)
end
-
- def create_git_attributes
- system(git_env, *%W(#{Gitlab.config.git.bin_path} clone --bare #{TEST_REPO_PATH} #{TEST_GITATTRIBUTES_REPO_PATH}),
- chdir: SEED_STORAGE_PATH,
- out: '/dev/null',
- err: '/dev/null')
-
- dir = File.join(SEED_STORAGE_PATH, 'with-git-attributes.git', 'info')
-
- FileUtils.mkdir_p(dir)
-
- File.open(File.join(dir, 'attributes'), 'w') do |handle|
- handle.write <<-EOF.strip
-# This is a comment, it should be ignored.
-
-*.txt text
-*.jpg -text
-*.sh eol=lf gitlab-language=shell
-*.haml.* gitlab-language=haml
-foo/bar.* foo
-*.cgi key=value?p1=v1&p2=v2
-/*.png gitlab-language=png
-*.binary binary
-/custom-highlighting/*.gitlab-custom gitlab-language=ruby
-/custom-highlighting/*.gitlab-cgi gitlab-language=erb?parent=json
-
-# This uses a tab instead of spaces to ensure the parser also supports this.
-*.md\tgitlab-language=markdown
-bla/bla.txt
- EOF
- end
- end
-
- def create_invalid_git_attributes
- dir = File.join(SEED_STORAGE_PATH, 'with-invalid-git-attributes.git', 'info')
-
- FileUtils.mkdir_p(dir)
-
- enc = Encoding::UTF_16
-
- File.open(File.join(dir, 'attributes'), 'w', encoding: enc) do |handle|
- handle.write('# hello'.encode(enc))
- end
- end
end
diff --git a/spec/support/helpers/stub_snowplow.rb b/spec/support/helpers/stub_snowplow.rb
new file mode 100644
index 00000000000..85c605efea3
--- /dev/null
+++ b/spec/support/helpers/stub_snowplow.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module StubSnowplow
+ def stub_snowplow
+ # Using a high buffer size to not cause early flushes
+ buffer_size = 100
+ # WebMock is set up to allow requests to `localhost`
+ host = 'localhost'
+
+ # rubocop:disable RSpec/AnyInstanceOf
+ allow_any_instance_of(Gitlab::Tracking::Destinations::Snowplow)
+ .to receive(:emitter)
+ .and_return(SnowplowTracker::Emitter.new(host, buffer_size: buffer_size))
+ # rubocop:enable RSpec/AnyInstanceOf
+
+ stub_application_setting(snowplow_enabled: true, snowplow_collector_hostname: host)
+
+ allow(SnowplowTracker::SelfDescribingJson).to receive(:new).and_call_original
+ allow(Gitlab::Tracking).to receive(:event).and_call_original # rubocop:disable RSpec/ExpectGitlabTracking
+ end
+end
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index 7c865dd7e11..03e9ad1a08e 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -82,7 +82,13 @@ module TestEnv
'trailers' => 'f0a5ed6',
'add_commit_with_5mb_subject' => '8cf8e80',
'blame-on-renamed' => '32c33da',
- 'with-executables' => '6b8dc4a'
+ 'with-executables' => '6b8dc4a',
+ 'spooky-stuff' => 'ba3343b',
+ 'few-commits' => '0031876',
+ 'two-commits' => '304d257',
+ 'utf-16' => 'f05a987',
+ 'gitaly-rename-test' => '94bb47c',
+ 'smime-signed-commits' => 'ed775cc'
}.freeze
# gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily
@@ -259,43 +265,35 @@ module TestEnv
# Create repository for FactoryBot.create(:project)
def setup_factory_repo
- setup_repo(factory_repo_path, factory_repo_path_bare, factory_repo_name, BRANCH_SHA)
+ setup_repo(factory_repo_path, factory_repo_bundle_path, 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
- setup_repo(forked_repo_path, forked_repo_path_bare, forked_repo_name, FORKED_BRANCH_SHA)
+ setup_repo(forked_repo_path, forked_repo_bundle_path, forked_repo_name, FORKED_BRANCH_SHA)
end
- def setup_repo(repo_path, repo_path_bare, repo_name, refs)
+ def setup_repo(repo_path, repo_bundle_path, repo_name, refs)
clone_url = "https://gitlab.com/gitlab-org/#{repo_name}.git"
unless File.directory?(repo_path)
start = Time.now
system(*%W(#{Gitlab.config.git.bin_path} clone --quiet -- #{clone_url} #{repo_path}))
+ system(*%W(#{Gitlab.config.git.bin_path} -C #{repo_path} remote remove origin))
puts "==> #{repo_path} set up in #{Time.now - start} seconds...\n"
end
set_repo_refs(repo_path, refs)
- unless File.directory?(repo_path_bare)
+ unless File.file?(repo_bundle_path)
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"
+ system(git_env, *%W(#{Gitlab.config.git.bin_path} -C #{repo_path} bundle create #{repo_bundle_path} --all))
+ puts "==> #{repo_bundle_path} generated in #{Time.now - start} seconds...\n"
end
end
- def copy_repo(subject, bare_repo:, refs:)
- target_repo_path = File.expand_path(repos_path + "/#{subject.disk_path}.git")
-
- FileUtils.mkdir_p(target_repo_path)
- FileUtils.cp_r("#{File.expand_path(bare_repo)}/.", target_repo_path)
- FileUtils.chmod_R 0755, target_repo_path
- end
-
def rm_storage_dir(storage, dir)
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
target_repo_refs_path = File.join(GitalySetup.repos_path(storage), dir)
@@ -310,14 +308,6 @@ module TestEnv
end
end
- def create_bare_repository(path)
- FileUtils.mkdir_p(path)
-
- system(git_env, *%W(#{Gitlab.config.git.bin_path} -C #{path} init --bare),
- out: '/dev/null',
- err: '/dev/null')
- end
-
def repos_path
@repos_path ||= GitalySetup.repos_path
end
@@ -357,20 +347,12 @@ module TestEnv
Capybara.current_session.visit '/'
end
- def factory_repo_path_bare
- "#{factory_repo_path}_bare"
- end
-
- def forked_repo_path_bare
- "#{forked_repo_path}_bare"
+ def factory_repo_bundle_path
+ "#{factory_repo_path}.bundle"
end
- def with_empty_bare_repository(name = nil)
- path = Rails.root.join('tmp/tests', name || 'empty-bare-repository').to_s
-
- yield(Rugged::Repository.init_at(path, :bare))
- ensure
- FileUtils.rm_rf(path)
+ def forked_repo_bundle_path
+ "#{forked_repo_path}.bundle"
end
def seed_db
@@ -386,9 +368,9 @@ module TestEnv
gitaly
gitlab-shell
gitlab-test
- gitlab-test_bare
+ gitlab-test.bundle
gitlab-test-fork
- gitlab-test-fork_bare
+ gitlab-test-fork.bundle
gitlab-workhorse
gitlab_workhorse_secret
]
diff --git a/spec/support/helpers/usage_data_helpers.rb b/spec/support/helpers/usage_data_helpers.rb
index 50d1b14cf56..2a9144614d0 100644
--- a/spec/support/helpers/usage_data_helpers.rb
+++ b/spec/support/helpers/usage_data_helpers.rb
@@ -53,7 +53,6 @@ module UsageDataHelpers
clusters_platforms_eks
clusters_platforms_gke
clusters_platforms_user
- clusters_integrations_elastic_stack
clusters_integrations_prometheus
clusters_management_project
in_review_folder
@@ -91,7 +90,6 @@ module UsageDataHelpers
projects_with_repositories_enabled
projects_with_error_tracking_enabled
projects_with_enabled_alert_integrations
- projects_with_tracing_enabled
projects_with_expiration_policy_enabled
projects_with_expiration_policy_disabled
projects_with_expiration_policy_enabled_with_keep_n_unset
diff --git a/spec/support/matchers/background_migrations_matchers.rb b/spec/support/matchers/background_migrations_matchers.rb
index c5b3e140585..9f39f576b95 100644
--- a/spec/support/matchers/background_migrations_matchers.rb
+++ b/spec/support/matchers/background_migrations_matchers.rb
@@ -74,6 +74,13 @@ RSpec::Matchers.define :have_scheduled_batched_migration do |gitlab_schema: :git
.for_configuration(gitlab_schema, migration, table_name, column_name, job_arguments)
expect(batched_migrations.count).to be(1)
+
+ # the :batch_min_value & :batch_max_value attribute argument values get applied to the
+ # :min_value & :max_value columns on the database. Here we change the attribute names
+ # for the rspec have_attributes matcher used below to pass
+ attributes[:min_value] = attributes.delete :batch_min_value if attributes.include?(:batch_min_value)
+ attributes[:max_value] = attributes.delete :batch_max_value if attributes.include?(:batch_max_value)
+
expect(batched_migrations).to all(have_attributes(attributes)) if attributes.present?
end
diff --git a/spec/support/matchers/event_store.rb b/spec/support/matchers/event_store.rb
index eb5b37f39e5..14f6a42d7f4 100644
--- a/spec/support/matchers/event_store.rb
+++ b/spec/support/matchers/event_store.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
RSpec::Matchers.define :publish_event do |expected_event_class|
+ include RSpec::Matchers::Composable
+
supports_block_expectations
match do |proc|
@@ -15,10 +17,17 @@ RSpec::Matchers.define :publish_event do |expected_event_class|
proc.call
@events.any? do |event|
- event.instance_of?(expected_event_class) && event.data == @expected_data
+ event.instance_of?(expected_event_class) && match_data?(event.data, @expected_data)
end
end
+ def match_data?(actual, expected)
+ values_match?(actual.keys, expected.keys) &&
+ actual.keys.each do |key|
+ values_match?(actual[key], expected[key])
+ end
+ end
+
chain :with do |expected_data|
@expected_data = expected_data
end
diff --git a/spec/support/matchers/match_file.rb b/spec/support/matchers/match_file.rb
index 4e522b52912..0c1f95d45f5 100644
--- a/spec/support/matchers/match_file.rb
+++ b/spec/support/matchers/match_file.rb
@@ -2,6 +2,6 @@
RSpec::Matchers.define :match_file do |expected|
match do |actual|
- expect(Digest::MD5.hexdigest(actual)).to eq(Digest::MD5.hexdigest(File.read(expected)))
+ expect(Digest::SHA256.hexdigest(actual)).to eq(Digest::SHA256.hexdigest(File.read(expected)))
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 07118198969..0dea6cfb729 100644
--- a/spec/support/services/issuable_import_csv_service_shared_examples.rb
+++ b/spec/support/services/issuable_import_csv_service_shared_examples.rb
@@ -37,6 +37,10 @@ RSpec.shared_examples 'issuable import csv service' do |issuable_type|
end
describe '#execute' do
+ before do
+ project.add_developer(user)
+ end
+
context 'invalid file extension' do
let(:file) { fixture_file_upload('spec/fixtures/banana_sample.gif') }
diff --git a/spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb b/spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb
index 8635c9a8ff9..b31fe9ee0d1 100644
--- a/spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb
+++ b/spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb
@@ -14,6 +14,8 @@ RSpec.shared_context 'Ldap::OmniauthCallbacksController' do
{ main: ldap_config_defaults(:main) }
end
+ let(:multiple_ldap_servers_license_available) { true }
+
def ldap_config_defaults(key, hash = {})
{
provider_name: "ldap#{key}",
@@ -23,6 +25,7 @@ RSpec.shared_context 'Ldap::OmniauthCallbacksController' do
end
before do
+ stub_licensed_features(multiple_ldap_servers: multiple_ldap_servers_license_available)
stub_ldap_setting(ldap_settings)
described_class.define_providers!
Rails.application.reload_routes!
diff --git a/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb b/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb
index aa8bc6fa79f..a3c688bb69e 100644
--- a/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb
+++ b/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb
@@ -16,9 +16,6 @@ RSpec.shared_context 'structured_logger' do
"created_at" => created_at.to_f,
"enqueued_at" => created_at.to_f,
"correlation_id" => 'cid',
- "error_message" => "wrong number of arguments (2 for 3)",
- "error_class" => "ArgumentError",
- "error_backtrace" => [],
"exception.message" => "wrong number of arguments (2 for 3)",
"exception.class" => "ArgumentError",
"exception.backtrace" => []
@@ -32,7 +29,6 @@ RSpec.shared_context 'structured_logger' do
let(:clock_thread_cputime_end) { 1.333333799 }
let(:start_payload) do
job.except(
- 'error_message', 'error_class', 'error_backtrace',
'exception.backtrace', 'exception.class', 'exception.message'
).merge(
'message' => 'TestWorker JID-da883554ee4fe414012f5f42: start',
@@ -73,9 +69,6 @@ RSpec.shared_context 'structured_logger' do
end_payload.merge(
'message' => 'TestWorker JID-da883554ee4fe414012f5f42: fail: 0.0 sec',
'job_status' => 'fail',
- 'error_class' => 'ArgumentError',
- 'error_message' => 'Something went wrong',
- 'error_backtrace' => be_a(Array).and(be_present),
'exception.class' => 'ArgumentError',
'exception.message' => 'Something went wrong',
'exception.backtrace' => be_a(Array).and(be_present)
diff --git a/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb b/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb
index 0d992f33c61..449db59e35d 100644
--- a/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb
+++ b/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb
@@ -10,6 +10,7 @@ RSpec.shared_context 'server metrics with mocked prometheus' do
let(:gitaly_seconds_metric) { double('gitaly seconds metric') }
let(:failed_total_metric) { double('failed total metric') }
let(:retried_total_metric) { double('retried total metric') }
+ let(:interrupted_total_metric) { double('interrupted total metric') }
let(:redis_requests_total) { double('redis calls total metric') }
let(:running_jobs_metric) { double('running jobs metric') }
let(:redis_seconds_metric) { double('redis seconds metric') }
@@ -30,6 +31,7 @@ RSpec.shared_context 'server metrics with mocked prometheus' do
allow(Gitlab::Metrics).to receive(:histogram).with(:sidekiq_elasticsearch_requests_duration_seconds, anything, anything, anything).and_return(elasticsearch_seconds_metric)
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_jobs_failed_total, anything).and_return(failed_total_metric)
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_jobs_retried_total, anything).and_return(retried_total_metric)
+ allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_jobs_interrupted_total, anything).and_return(interrupted_total_metric)
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_redis_requests_total, anything).and_return(redis_requests_total)
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_elasticsearch_requests_total, anything).and_return(elasticsearch_requests_total)
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_load_balancing_count, anything).and_return(load_balancing_metric)
diff --git a/spec/support/shared_contexts/markdown_snapshot_shared_examples.rb b/spec/support/shared_contexts/markdown_snapshot_shared_examples.rb
index de52b58982e..a90fe9e1723 100644
--- a/spec/support/shared_contexts/markdown_snapshot_shared_examples.rb
+++ b/spec/support/shared_contexts/markdown_snapshot_shared_examples.rb
@@ -5,12 +5,12 @@ require 'spec_helper'
# See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
# for documentation on this spec.
# rubocop:disable Layout/LineLength
-RSpec.shared_context 'with API::Markdown Snapshot shared context' do |glfm_specification_dir, glfm_example_snapshots_dir|
+RSpec.shared_context 'with API::Markdown Snapshot shared context' do |glfm_specification_dir|
# rubocop:enable Layout/LineLength
include ApiHelpers
markdown_examples, html_examples = %w[markdown.yml html.yml].map do |file_name|
- yaml = File.read("#{glfm_example_snapshots_dir}/#{file_name}")
+ yaml = File.read("#{glfm_specification_dir}/example_snapshots/#{file_name}")
YAML.safe_load(yaml, symbolize_names: true, aliases: true)
end
diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb
index d277a45584d..6c2ed79b343 100644
--- a/spec/support/shared_contexts/navbar_structure_context.rb
+++ b/spec/support/shared_contexts/navbar_structure_context.rb
@@ -83,8 +83,6 @@ RSpec.shared_context 'project navbar structure' do
nav_item: _('Monitor'),
nav_sub_items: [
_('Metrics'),
- _('Logs'),
- _('Tracing'),
_('Error Tracking'),
_('Alerts'),
_('Incidents'),
@@ -112,6 +110,7 @@ RSpec.shared_context 'project navbar structure' do
_('Access Tokens'),
_('Repository'),
_('CI/CD'),
+ _('Packages & Registries'),
_('Monitor'),
s_('UsageQuota|Usage Quotas')
]
diff --git a/spec/support/shared_contexts/policies/group_policy_shared_context.rb b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
index 483bca07ba6..eec6e92c5fe 100644
--- a/spec/support/shared_contexts/policies/group_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
@@ -31,6 +31,7 @@ RSpec.shared_context 'GroupPolicy context' do
admin_milestone
admin_issue_board
read_container_image
+ read_harbor_registry
read_metrics_dashboard_annotation
read_prometheus
read_crm_contact
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 7396643823c..789b385c435 100644
--- a/spec/support/shared_contexts/policies/project_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
@@ -12,6 +12,7 @@ RSpec.shared_context 'ProjectPolicy context' do
let_it_be_with_refind(:private_project) { create(:project, :private, namespace: owner.namespace) }
let_it_be_with_refind(:internal_project) { create(:project, :internal, namespace: owner.namespace) }
let_it_be_with_refind(:public_project) { create(:project, :public, namespace: owner.namespace) }
+ let_it_be_with_refind(:public_project_in_group) { create(:project, :public, namespace: create(:group, :public)) }
let(:base_guest_permissions) do
%i[
@@ -29,7 +30,7 @@ RSpec.shared_context 'ProjectPolicy context' do
create_snippet create_incident daily_statistics create_merge_request_in download_code
download_wiki_code fork_project metrics_dashboard read_build
read_commit_status read_confidential_issues read_container_image
- read_deployment read_environment read_merge_request
+ read_harbor_registry read_deployment read_environment read_merge_request
read_metrics_dashboard_annotation read_pipeline read_prometheus
read_sentry_issue update_issue create_merge_request_in
]
@@ -93,7 +94,7 @@ RSpec.shared_context 'ProjectPolicy context' do
let(:owner_permissions) { base_owner_permissions + additional_owner_permissions }
before_all do
- [private_project, internal_project, public_project].each do |project|
+ [private_project, internal_project, public_project, public_project_in_group].each do |project|
project.add_guest(guest)
project.add_reporter(reporter)
project.add_developer(developer)
diff --git a/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
new file mode 100644
index 00000000000..98fc52add51
--- /dev/null
+++ b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+#
+# Requires a context containing:
+# - subject
+# - project
+# - feature_flag_name
+# - category
+# - action
+# - namespace
+# - user
+
+shared_examples 'Snowplow event tracking' do
+ let(:label) { nil }
+
+ it 'is not emitted if FF is disabled' do
+ stub_feature_flags(feature_flag_name => false)
+
+ subject
+
+ expect_no_snowplow_event
+ end
+
+ it 'is emitted' do
+ params = {
+ category: category,
+ action: action,
+ namespace: namespace,
+ user: user,
+ project: project,
+ label: label
+ }.compact
+
+ subject
+
+ expect_snowplow_event(**params)
+ end
+end
diff --git a/spec/support/shared_examples/csp.rb b/spec/support/shared_examples/csp.rb
index 9143d0f4720..91242ae9f37 100644
--- a/spec/support/shared_examples/csp.rb
+++ b/spec/support/shared_examples/csp.rb
@@ -15,64 +15,66 @@ RSpec.shared_examples 'setting CSP' do |rule_name|
end
end
- context 'when no CSP config' do
- include_context 'csp config', nil
+ context 'csp config and feature toggle', :do_not_stub_snowplow_by_default do
+ context 'when no CSP config' do
+ include_context 'csp config', nil
- it 'does not add CSP directives' do
- is_expected.to be_blank
+ it 'does not add CSP directives' do
+ is_expected.to be_blank
+ end
end
- end
- describe "when a CSP config exists for #{rule_name}" do
- include_context 'csp config', rule_name.parameterize.underscore.to_sym
+ describe "when a CSP config exists for #{rule_name}" do
+ include_context 'csp config', rule_name.parameterize.underscore.to_sym
- context 'when feature is enabled' do
- it "appends to #{rule_name}" do
- is_expected.to eql("#{rule_name} #{default_csp_values} #{allowlisted_url}")
+ context 'when feature is enabled' do
+ it "appends to #{rule_name}" do
+ is_expected.to eql("#{rule_name} #{default_csp_values} #{allowlisted_url}")
+ end
end
- end
- context 'when feature is disabled' do
- include_context 'disable feature'
+ context 'when feature is disabled' do
+ include_context 'disable feature'
- it "keeps original #{rule_name}" do
- is_expected.to eql("#{rule_name} #{default_csp_values}")
+ it "keeps original #{rule_name}" do
+ is_expected.to eql("#{rule_name} #{default_csp_values}")
+ end
end
end
- end
- describe "when a CSP config exists for default-src but not #{rule_name}" do
- include_context 'csp config', :default_src
+ describe "when a CSP config exists for default-src but not #{rule_name}" do
+ include_context 'csp config', :default_src
- context 'when feature is enabled' do
- it "uses default-src values in #{rule_name}" do
- is_expected.to eql("default-src #{default_csp_values}; #{rule_name} #{default_csp_values} #{allowlisted_url}")
+ context 'when feature is enabled' do
+ it "uses default-src values in #{rule_name}" do
+ is_expected.to eql("default-src #{default_csp_values}; #{rule_name} #{default_csp_values} #{allowlisted_url}")
+ end
end
- end
- context 'when feature is disabled' do
- include_context 'disable feature'
+ context 'when feature is disabled' do
+ include_context 'disable feature'
- it "does not add #{rule_name}" do
- is_expected.to eql("default-src #{default_csp_values}")
+ it "does not add #{rule_name}" do
+ is_expected.to eql("default-src #{default_csp_values}")
+ end
end
end
- end
- describe "when a CSP config exists for font-src but not #{rule_name}" do
- include_context 'csp config', :font_src
+ describe "when a CSP config exists for font-src but not #{rule_name}" do
+ include_context 'csp config', :font_src
- context 'when feature is enabled' do
- it "uses default-src values in #{rule_name}" do
- is_expected.to eql("font-src #{default_csp_values}; #{rule_name} #{allowlisted_url}")
+ context 'when feature is enabled' do
+ it "uses default-src values in #{rule_name}" do
+ is_expected.to eql("font-src #{default_csp_values}; #{rule_name} #{allowlisted_url}")
+ end
end
- end
- context 'when feature is disabled' do
- include_context 'disable feature'
+ context 'when feature is disabled' do
+ include_context 'disable feature'
- it "does not add #{rule_name}" do
- is_expected.to eql("font-src #{default_csp_values}")
+ it "does not add #{rule_name}" do
+ is_expected.to eql("font-src #{default_csp_values}")
+ end
end
end
end
diff --git a/spec/support/shared_examples/features/content_editor_shared_examples.rb b/spec/support/shared_examples/features/content_editor_shared_examples.rb
index 591f7973454..0ea82f37db0 100644
--- a/spec/support/shared_examples/features/content_editor_shared_examples.rb
+++ b/spec/support/shared_examples/features/content_editor_shared_examples.rb
@@ -31,8 +31,6 @@ RSpec.shared_examples 'edits content using the content editor' do
page.go_back
refresh
-
- click_button 'Edit rich text'
end
it 'applies theme classes to code blocks' do
diff --git a/spec/support/shared_examples/features/discussion_comments_shared_example.rb b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
index 6c06cbf9082..24dc4bcfc59 100644
--- a/spec/support/shared_examples/features/discussion_comments_shared_example.rb
+++ b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
@@ -293,7 +293,7 @@ RSpec.shared_examples 'thread comments for issue, epic and merge request' do |re
it 'can be collapsed' do
submit_reply('another text')
- find('.js-collapse-replies').click
+ click_button s_('Notes|Collapse replies'), match: :first
expect(page).to have_css('.discussion-notes .note', count: 1)
expect(page).to have_content '1 reply'
end
diff --git a/spec/support/shared_examples/features/inviting_members_shared_examples.rb b/spec/support/shared_examples/features/inviting_members_shared_examples.rb
index 58357b262f5..bca0e02fcdd 100644
--- a/spec/support/shared_examples/features/inviting_members_shared_examples.rb
+++ b/spec/support/shared_examples/features/inviting_members_shared_examples.rb
@@ -23,6 +23,22 @@ RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
)
end
+ it 'displays the user\'s avatar in the member input token', :js do
+ visit members_page_path
+
+ input_invites(user2.name)
+
+ expect(page).to have_selector(member_token_avatar_selector)
+ end
+
+ it 'does not display an avatar in the member input token for an email address', :js do
+ visit members_page_path
+
+ input_invites('test@example.com')
+
+ expect(page).not_to have_selector(member_token_avatar_selector)
+ end
+
it 'invites user by email', :js, :snowplow, :aggregate_failures do
visit members_page_path
@@ -78,22 +94,23 @@ RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
end
context 'when member is already a member by email' do
- it 'fails with an error', :js do
+ it 'updates the member for that email', :js do
+ email = 'test@example.com'
+
visit members_page_path
- invite_member('test@example.com', role: 'Developer')
+ invite_member(email, role: 'Developer')
- invite_member('test@example.com', role: 'Reporter', refresh: false)
+ invite_member(email, role: 'Reporter', refresh: false)
- expect(page).to have_selector(invite_modal_selector)
- expect(page).to have_content("The member's email address has already been taken")
+ expect(page).not_to have_selector(invite_modal_selector)
page.refresh
click_link 'Invited'
- page.within find_invited_member_row('test@example.com') do
- expect(page).to have_button('Developer')
+ page.within find_invited_member_row(email) do
+ expect(page).to have_button('Reporter')
end
end
end
@@ -131,8 +148,8 @@ RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
invite_member(user2.name, role: role, refresh: false)
expect(page).to have_selector(invite_modal_selector)
- expect(page).to have_content "Access level should be greater than or equal to Developer inherited membership " \
- "from group #{group.name}"
+ expect(page).to have_content "#{user2.name}: Access level should be greater than or equal to Developer " \
+ "inherited membership from group #{group.name}"
page.refresh
@@ -149,13 +166,31 @@ RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
group.add_maintainer(user3)
end
- it 'only shows the first user error', :js do
+ it 'shows the user errors and then removes them from the form', :js do
visit subentity_members_page_path
invite_member([user2.name, user3.name], role: role, refresh: false)
expect(page).to have_selector(invite_modal_selector)
- expect(page).to have_text("Access level should be greater than or equal to", count: 1)
+ expect(page).to have_selector(member_token_error_selector(user2.id))
+ expect(page).to have_selector(member_token_error_selector(user3.id))
+ expect(page).to have_text("The following 2 members couldn't be invited")
+ expect(page).to have_text("#{user2.name}: Access level should be greater than or equal to")
+ expect(page).to have_text("#{user3.name}: Access level should be greater than or equal to")
+
+ remove_token(user2.id)
+
+ expect(page).not_to have_selector(member_token_error_selector(user2.id))
+ expect(page).to have_selector(member_token_error_selector(user3.id))
+ expect(page).to have_text("The following member couldn't be invited")
+ expect(page).not_to have_text("#{user2.name}: Access level should be greater than or equal to")
+
+ remove_token(user3.id)
+
+ expect(page).not_to have_selector(member_token_error_selector(user3.id))
+ expect(page).not_to have_text("The following member couldn't be invited")
+ expect(page).not_to have_text("Review the invite errors and try again")
+ expect(page).not_to have_text("#{user3.name}: Access level should be greater than or equal to")
page.refresh
@@ -169,6 +204,19 @@ RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
expect(page).not_to have_button('Maintainer')
end
end
+
+ it 'only shows the error for an invalid formatted email and does not display other member errors', :js do
+ visit subentity_members_page_path
+
+ invite_member([user2.name, user3.name, 'bad@email'], role: role, refresh: false)
+
+ expect(page).to have_selector(invite_modal_selector)
+ expect(page).to have_text('email contains an invalid email address')
+ expect(page).not_to have_text("The following 2 members couldn't be invited")
+ expect(page).not_to have_text("Review the invite errors and try again")
+ expect(page).not_to have_text("#{user2.name}: Access level should be greater than or equal to")
+ expect(page).not_to have_text("#{user3.name}: Access level should be greater than or equal to")
+ end
end
end
end
diff --git a/spec/support/shared_examples/features/multiple_assignees_mr_shared_examples.rb b/spec/support/shared_examples/features/multiple_assignees_mr_shared_examples.rb
index 4565108b5e4..9d023d9514a 100644
--- a/spec/support/shared_examples/features/multiple_assignees_mr_shared_examples.rb
+++ b/spec/support/shared_examples/features/multiple_assignees_mr_shared_examples.rb
@@ -4,7 +4,7 @@ RSpec.shared_examples 'multiple assignees merge request' do |action, save_button
it "#{action} a MR with multiple assignees", :js do
find('.js-assignee-search').click
page.within '.dropdown-menu-user' do
- click_link user.name unless action == 'creates'
+ click_link user.name
click_link user2.name
end
diff --git a/spec/support/shared_examples/features/multiple_assignees_widget_mr_shared_examples.rb b/spec/support/shared_examples/features/multiple_assignees_widget_mr_shared_examples.rb
index a44a699c878..bbde448a1a1 100644
--- a/spec/support/shared_examples/features/multiple_assignees_widget_mr_shared_examples.rb
+++ b/spec/support/shared_examples/features/multiple_assignees_widget_mr_shared_examples.rb
@@ -4,7 +4,7 @@ RSpec.shared_examples 'multiple assignees widget merge request' do |action, save
it "#{action} a MR with multiple assignees", :js do
find('.js-assignee-search').click
page.within '.dropdown-menu-user' do
- click_link user.name unless action == 'creates'
+ click_link user.name
click_link user2.name
end
diff --git a/spec/support/shared_examples/features/wiki/autocomplete_shared_examples.rb b/spec/support/shared_examples/features/wiki/autocomplete_shared_examples.rb
new file mode 100644
index 00000000000..79de2aedf3b
--- /dev/null
+++ b/spec/support/shared_examples/features/wiki/autocomplete_shared_examples.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'autocompletes items' do
+ before do
+ if defined?(project)
+ create(:issue, project: project, title: 'My Cool Linked Issue')
+ create(:merge_request, source_project: project, title: 'My Cool Merge Request')
+ create(:label, project: project, title: 'My Cool Label')
+ create(:milestone, project: project, title: 'My Cool Milestone')
+
+ project.add_maintainer(create(:user, name: 'JohnDoe123'))
+ else # group wikis
+ project = create(:project, group: group)
+
+ create(:issue, project: project, title: 'My Cool Linked Issue')
+ create(:merge_request, source_project: project, title: 'My Cool Merge Request')
+ create(:group_label, group: group, title: 'My Cool Label')
+ create(:milestone, group: group, title: 'My Cool Milestone')
+
+ project.add_maintainer(create(:user, name: 'JohnDoe123'))
+ end
+ end
+
+ it 'works well for issues, labels, MRs, members, etc' do
+ fill_in :wiki_content, with: "#"
+ expect(page).to have_text 'My Cool Linked Issue'
+
+ fill_in :wiki_content, with: "~"
+ expect(page).to have_text 'My Cool Label'
+
+ fill_in :wiki_content, with: "!"
+ expect(page).to have_text 'My Cool Merge Request'
+
+ fill_in :wiki_content, with: "%"
+ expect(page).to have_text 'My Cool Milestone'
+
+ fill_in :wiki_content, with: "@"
+ expect(page).to have_text 'JohnDoe123'
+
+ fill_in :wiki_content, with: ':smil'
+ expect(page).to have_text 'smile_cat'
+ 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 12a4c6d7583..79c7c1891ac 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
@@ -146,6 +146,8 @@ RSpec.shared_examples 'User updates wiki page' do
it_behaves_like 'edits content using the content editor'
end
end
+
+ it_behaves_like 'autocompletes items'
end
context 'when the page is in a subdir', :js do
diff --git a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
index 622a88e8323..9d8f37a3e64 100644
--- a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
+++ b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
@@ -269,6 +269,17 @@ RSpec.shared_examples 'issues or work items finder' do |factory, execute_context
it 'returns items not assigned to that milestone' do
expect(items).to contain_exactly(item2, item3, item4, item5)
end
+
+ context 'with multiple milestones' do
+ let(:milestone2) { create(:milestone, project: project2) }
+ let(:params) { { not: { milestone_title: [milestone.title, milestone2.title] } } }
+
+ it 'returns items not assigned to both milestones' do
+ item2.update!(milestone: milestone2)
+
+ expect(items).to contain_exactly(item3, item4, item5)
+ end
+ end
end
context 'filtering by group milestone' do
@@ -962,7 +973,7 @@ RSpec.shared_examples 'issues or work items finder' do |factory, execute_context
group = create(:group)
project = create(:project, group: group)
item = create(factory, project: project)
- group.add_user(user, :owner)
+ group.add_member(user, :owner)
expect(items).to include(item)
end
diff --git a/spec/support/shared_examples/graphql/mutations/work_items/update_description_widget_shared_examples.rb b/spec/support/shared_examples/graphql/mutations/work_items/update_description_widget_shared_examples.rb
new file mode 100644
index 00000000000..56c2ca22e15
--- /dev/null
+++ b/spec/support/shared_examples/graphql/mutations/work_items/update_description_widget_shared_examples.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'update work item description widget' do
+ it 'updates the description widget' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to change(work_item, :description).from(nil).to(new_description)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['workItem']['widgets']).to include(
+ {
+ 'description' => new_description,
+ 'type' => 'DESCRIPTION'
+ }
+ )
+ end
+
+ context 'when the updated work item is not valid' do
+ it 'returns validation errors without the work item' do
+ errors = ActiveModel::Errors.new(work_item).tap { |e| e.add(:description, 'error message') }
+
+ allow_next_found_instance_of(::WorkItem) do |instance|
+ allow(instance).to receive(:valid?).and_return(false)
+ allow(instance).to receive(:errors).and_return(errors)
+ end
+
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['workItem']).to be_nil
+ expect(mutation_response['errors']).to match_array(['Description error message'])
+ end
+ end
+end
diff --git a/spec/support/shared_examples/graphql/mutations/work_items/update_weight_widget_shared_examples.rb b/spec/support/shared_examples/graphql/mutations/work_items/update_weight_widget_shared_examples.rb
new file mode 100644
index 00000000000..3c32b7e0310
--- /dev/null
+++ b/spec/support/shared_examples/graphql/mutations/work_items/update_weight_widget_shared_examples.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'update work item weight widget' do
+ it 'updates the weight widget' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to change(work_item, :weight).from(nil).to(new_weight)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['workItem']['widgets']).to include(
+ {
+ 'weight' => new_weight,
+ 'type' => 'WEIGHT'
+ }
+ )
+ end
+
+ context 'when the updated work item is not valid' do
+ it 'returns validation errors without the work item' do
+ errors = ActiveModel::Errors.new(work_item).tap { |e| e.add(:weight, 'error message') }
+
+ allow_next_found_instance_of(::WorkItem) do |instance|
+ allow(instance).to receive(:valid?).and_return(false)
+ allow(instance).to receive(:errors).and_return(errors)
+ end
+
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['workItem']).to be_nil
+ expect(mutation_response['errors']).to match_array(['Weight error message'])
+ end
+ end
+end
diff --git a/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb b/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb
index 6d6e7b761f6..59927fa1cc9 100644
--- a/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb
@@ -44,19 +44,25 @@
# end
# end
#
+
+# Include this context if your field does not accept a sort argument
+RSpec.shared_context 'no sort argument' do
+ let(:sort_argument) { graphql_args }
+end
+
RSpec.shared_examples 'sorted paginated query' do |conditions = {}|
# Provided as a convenience when constructing queries using string concatenation
let(:page_info) { 'pageInfo { startCursor endCursor }' }
# Convenience for using default implementation of pagination_results_data
let(:node_path) { ['id'] }
+ let(:sort_argument) { graphql_args(sort: sort_param) }
it_behaves_like 'requires variables' do
- let(:required_variables) { [:sort_param, :first_param, :all_records, :data_path, :current_user] }
+ let(:required_variables) { [:first_param, :all_records, :data_path, :current_user] }
end
describe do
- let(:sort_argument) { graphql_args(sort: sort_param) }
- let(:params) { sort_argument }
+ let(:params) { sort_argument }
# Convenience helper for the large number of queries defined as a projection
# from some root value indexed by full_path to a collection of objects with IID
diff --git a/spec/support/shared_examples/harbor/artifacts_controller_shared_examples.rb b/spec/support/shared_examples/harbor/artifacts_controller_shared_examples.rb
new file mode 100644
index 00000000000..85fcd426e3d
--- /dev/null
+++ b/spec/support/shared_examples/harbor/artifacts_controller_shared_examples.rb
@@ -0,0 +1,162 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'a harbor artifacts controller' do |args|
+ include HarborHelper
+ let_it_be(:user) { create(:user) }
+ let_it_be(:unauthorized_user) { create(:user) }
+ let_it_be(:json_header) { { accept: 'application/json' } }
+
+ let(:mock_artifacts) do
+ [
+ {
+ "digest": "sha256:661e8e44e5d7290fbd42d0495ab4ff6fdf1ad251a9f358969b3264a22107c14d",
+ "icon": "sha256:0048162a053eef4d4ce3fe7518615bef084403614f8bca43b40ae2e762e11e06",
+ "id": 1,
+ "project_id": 1,
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-04-23T08:04:08.901Z",
+ "repository_id": 1,
+ "size": 126745886,
+ "tags": [
+ {
+ "artifact_id": 1,
+ "id": 1,
+ "immutable": false,
+ "name": "2",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-04-23T08:04:08.920Z",
+ "repository_id": 1,
+ "signed": false
+ }
+ ],
+ "type": "IMAGE"
+ }
+ ]
+ end
+
+ let(:repository_id) { 'test' }
+
+ shared_examples 'responds with 404 status' do
+ it 'returns 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ shared_examples 'responds with 200 status with json' do
+ it 'renders the index template' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).not_to render_template(:index)
+ end
+ end
+
+ shared_examples 'responds with 302 status' do
+ it 'returns 302' do
+ subject
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ shared_examples 'responds with 422 status with json' do
+ it 'returns 422' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
+ before do
+ stub_request(:get,
+ "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts"\
+ "?page=1&page_size=10&with_tag=true")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ }).to_return(status: 200, body: mock_artifacts.to_json, headers: { "x-total-count": 2 })
+ container.add_reporter(user)
+ sign_in(user)
+ end
+
+ describe 'GET #index.json' do
+ subject do
+ get harbor_artifact_url(container, repository_id), headers: json_header
+ end
+
+ context 'with harbor registry feature flag enabled' do
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with harbor registry feature flag disabled' do
+ before do
+ stub_feature_flags(harbor_registry_integration: false)
+ end
+
+ it_behaves_like 'responds with 404 status'
+ end
+
+ context 'with anonymous user' do
+ before do
+ sign_out(user)
+ end
+
+ it_behaves_like "responds with #{args[:anonymous_status_code]} status"
+ end
+
+ context 'with unauthorized user' do
+ before do
+ sign_in(unauthorized_user)
+ end
+
+ it_behaves_like 'responds with 404 status'
+ end
+
+ context 'with valid params' do
+ context 'with valid repository' do
+ subject do
+ get harbor_artifact_url(container, repository_id), headers: json_header
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with valid page' do
+ subject do
+ get harbor_artifact_url(container, repository_id, page: '1'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with valid limit' do
+ subject do
+ get harbor_artifact_url(container, repository_id, limit: '10'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+ end
+
+ context 'with invalid params' do
+ context 'with invalid page' do
+ subject do
+ get harbor_artifact_url(container, repository_id, page: 'aaa'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 422 status with json'
+ end
+
+ context 'with invalid limit' do
+ subject do
+ get harbor_artifact_url(container, repository_id, limit: 'aaa'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 422 status with json'
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/harbor/container_shared_examples.rb b/spec/support/shared_examples/harbor/container_shared_examples.rb
new file mode 100644
index 00000000000..57274e0b457
--- /dev/null
+++ b/spec/support/shared_examples/harbor/container_shared_examples.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'raises NotImplementedError when calling #container' do
+ describe '#container' do
+ it 'raises NotImplementedError' do
+ expect { controller.send(:container) }.to raise_error(NotImplementedError)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/harbor/repositories_controller_shared_examples.rb b/spec/support/shared_examples/harbor/repositories_controller_shared_examples.rb
new file mode 100644
index 00000000000..b35595a10b2
--- /dev/null
+++ b/spec/support/shared_examples/harbor/repositories_controller_shared_examples.rb
@@ -0,0 +1,172 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'a harbor repositories controller' do |args|
+ include HarborHelper
+ let_it_be(:user) { create(:user) }
+ let_it_be(:unauthorized_user) { create(:user) }
+ let_it_be(:json_header) { { accept: 'application/json' } }
+
+ let(:mock_repositories) do
+ [
+ {
+ "artifact_count": 6,
+ "creation_time": "2022-04-24T10:59:02.719Z",
+ "id": 33,
+ "name": "test/photon",
+ "project_id": 3,
+ "pull_count": 12,
+ "update_time": "2022-04-24T11:06:27.678Z"
+ },
+ {
+ "artifact_count": 1,
+ "creation_time": "2022-04-23T08:04:08.880Z",
+ "id": 1,
+ "name": "test/gemnasium",
+ "project_id": 3,
+ "pull_count": 0,
+ "update_time": "2022-04-23T08:04:08.880Z"
+ }
+ ]
+ end
+
+ shared_examples 'responds with 404 status' do
+ it 'returns 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ shared_examples 'responds with 200 status with html' do
+ it 'renders the index template' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:index)
+ end
+ end
+
+ shared_examples 'responds with 302 status' do
+ it 'returns 302' do
+ subject
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ shared_examples 'responds with 200 status with json' do
+ it 'renders the index template' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).not_to render_template(:index)
+ end
+ end
+
+ shared_examples 'responds with 422 status with json' do
+ it 'returns 422' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
+ before do
+ stub_request(:get, "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories?page=1&page_size=10")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ }).to_return(status: 200, body: mock_repositories.to_json, headers: { "x-total-count": 2 })
+ container.add_reporter(user)
+ sign_in(user)
+ end
+
+ describe 'GET #index.html' do
+ subject do
+ get harbor_repository_url(container)
+ end
+
+ context 'with harbor registry feature flag enabled' do
+ it_behaves_like 'responds with 200 status with html'
+ end
+
+ context 'with harbor registry feature flag disabled' do
+ before do
+ stub_feature_flags(harbor_registry_integration: false)
+ end
+
+ it_behaves_like 'responds with 404 status'
+ end
+
+ context 'with anonymous user' do
+ before do
+ sign_out(user)
+ end
+
+ it_behaves_like "responds with #{args[:anonymous_status_code]} status"
+ end
+
+ context 'with unauthorized user' do
+ before do
+ sign_in(unauthorized_user)
+ end
+
+ it_behaves_like 'responds with 404 status'
+ end
+ end
+
+ describe 'GET #index.json' do
+ subject do
+ get harbor_repository_url(container), headers: json_header
+ end
+
+ context 'with harbor registry feature flag enabled' do
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with harbor registry feature flag disabled' do
+ before do
+ stub_feature_flags(harbor_registry_integration: false)
+ end
+
+ it_behaves_like 'responds with 404 status'
+ end
+
+ context 'with valid params' do
+ context 'with valid page params' do
+ subject do
+ get harbor_repository_url(container, page: '1'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with valid limit params' do
+ subject do
+ get harbor_repository_url(container, limit: '10'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+ end
+
+ context 'with invalid params' do
+ context 'with invalid page params' do
+ subject do
+ get harbor_repository_url(container, page: 'aaa'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 422 status with json'
+ end
+
+ context 'with invalid limit params' do
+ subject do
+ get harbor_repository_url(container, limit: 'aaa'), headers: json_header
+ end
+
+ it_behaves_like 'responds with 422 status with json'
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/harbor/tags_controller_shared_examples.rb b/spec/support/shared_examples/harbor/tags_controller_shared_examples.rb
new file mode 100644
index 00000000000..46fea7fdff6
--- /dev/null
+++ b/spec/support/shared_examples/harbor/tags_controller_shared_examples.rb
@@ -0,0 +1,155 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'a harbor tags controller' do |args|
+ include HarborHelper
+ let_it_be(:user) { create(:user) }
+ let_it_be(:unauthorized_user) { create(:user) }
+ let_it_be(:json_header) { { accept: 'application/json' } }
+
+ let(:mock_artifacts) do
+ [
+ {
+ "artifact_id": 1,
+ "id": 1,
+ "immutable": false,
+ "name": "2",
+ "pull_time": "0001-01-01T00:00:00.000Z",
+ "push_time": "2022-04-23T08:04:08.920Z",
+ "repository_id": 1,
+ "signed": false
+ }
+ ]
+ end
+
+ let(:repository_id) { 'test' }
+ let(:artifact_id) { '1' }
+
+ shared_examples 'responds with 404 status' do
+ it 'returns 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ shared_examples 'responds with 200 status with json' do
+ it 'renders the index template' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).not_to render_template(:index)
+ end
+ end
+
+ shared_examples 'responds with 302 status' do
+ it 'returns 302' do
+ subject
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ shared_examples 'responds with 422 status with json' do
+ it 'returns 422' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
+ before do
+ stub_request(:get,
+ "https://demo.goharbor.io/api/v2.0/projects/testproject/repositories/test/artifacts/1/tags"\
+ "?page=1&page_size=10")
+ .with(
+ headers: {
+ 'Authorization': 'Basic aGFyYm9ydXNlcm5hbWU6aGFyYm9ycGFzc3dvcmQ=',
+ 'Content-Type': 'application/json'
+ }).to_return(status: 200, body: mock_artifacts.to_json, headers: { "x-total-count": 2 })
+ container.add_reporter(user)
+ sign_in(user)
+ end
+
+ describe 'GET #index.json' do
+ subject do
+ get(harbor_tag_url(container, repository_id, artifact_id),
+ headers: json_header)
+ end
+
+ context 'with harbor registry feature flag enabled' do
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with harbor registry feature flag disabled' do
+ before do
+ stub_feature_flags(harbor_registry_integration: false)
+ end
+
+ it_behaves_like 'responds with 404 status'
+ end
+
+ context 'with anonymous user' do
+ before do
+ sign_out(user)
+ end
+
+ it_behaves_like "responds with #{args[:anonymous_status_code]} status"
+ end
+
+ context 'with unauthorized user' do
+ before do
+ sign_in(unauthorized_user)
+ end
+
+ it_behaves_like 'responds with 404 status'
+ end
+
+ context 'with valid params' do
+ context 'with valid repository' do
+ subject do
+ get harbor_tag_url(container, repository_id, artifact_id), headers: json_header
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with valid page' do
+ subject do
+ get(harbor_tag_url(container, repository_id, artifact_id, page: '1'),
+ headers: json_header)
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+
+ context 'with valid limit' do
+ subject do
+ get(harbor_tag_url(container, repository_id, artifact_id, limit: '10'),
+ headers: json_header)
+ end
+
+ it_behaves_like 'responds with 200 status with json'
+ end
+ end
+
+ context 'with invalid params' do
+ context 'with invalid page' do
+ subject do
+ get(harbor_tag_url(container, repository_id, artifact_id, page: 'aaa'),
+ headers: json_header)
+ end
+
+ it_behaves_like 'responds with 422 status with json'
+ end
+
+ context 'with invalid limit' do
+ subject do
+ get(harbor_tag_url(container, repository_id, artifact_id, limit: 'aaa'),
+ headers: json_header)
+ end
+
+ it_behaves_like 'responds with 422 status with json'
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/integrations/integration_settings_form.rb b/spec/support/shared_examples/integrations/integration_settings_form.rb
index dfe5a071f91..5041ac4a660 100644
--- a/spec/support/shared_examples/integrations/integration_settings_form.rb
+++ b/spec/support/shared_examples/integrations/integration_settings_form.rb
@@ -20,6 +20,11 @@ RSpec.shared_examples 'integration settings form' do
"#{integration.title} field #{field_name} not present"
end
+ api_only_fields = integration.fields.select { _1[:api_only] }
+ api_only_fields.each do |field|
+ expect(page).not_to have_field("service[#{field.name}]", wait: 0)
+ end
+
sections = integration.sections
events = parse_json(trigger_events_for_integration(integration))
diff --git a/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb
index 284c129221b..b786d7e5527 100644
--- a/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb
@@ -265,10 +265,9 @@ RSpec.shared_examples 'common trace features' do
end
context 'build token' do
- let(:token) { 'my_secret_token' }
+ let(:token) { build.token }
before do
- build.update!(token: token)
trace.append(token, 0)
end
diff --git a/spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb
index 326800e6dc2..c9300aff3e6 100644
--- a/spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb
@@ -32,21 +32,7 @@ RSpec.shared_examples "position formatter" do
subject { formatter.to_h }
- context 'when file_identifier_hash is disabled' do
- before do
- stub_feature_flags(file_identifier_hash: false)
- end
-
- it { is_expected.to eq(formatter_hash.except(:file_identifier_hash)) }
- end
-
- context 'when file_identifier_hash is enabled' do
- before do
- stub_feature_flags(file_identifier_hash: true)
- end
-
- it { is_expected.to eq(formatter_hash) }
- end
+ it { is_expected.to eq(formatter_hash) }
end
describe '#==' do
diff --git a/spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb
new file mode 100644
index 00000000000..a3e4379f4d3
--- /dev/null
+++ b/spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'search results filtered by language' do
+ let(:scope) { 'blobs' }
+ let(:filters) { { language: %w[Ruby Markdown] } }
+ let(:query) { 'def | popen | test' }
+
+ before do
+ project.repository.index_commits_and_blobs
+
+ ensure_elasticsearch_index!
+ end
+
+ subject(:blob_results) { results.objects('blobs') }
+
+ it 'filters by language', :sidekiq_inline, :aggregate_failures do
+ expected_paths = %w[
+ files/ruby/popen.rb
+ files/markdown/ruby-style-guide.md
+ files/ruby/regex.rb
+ files/ruby/version_info.rb
+ CONTRIBUTING.md
+ ]
+
+ paths = blob_results.map { |blob| blob.binary_path }
+ expect(blob_results.size).to eq(5)
+ expect(paths).to match_array(expected_paths)
+ end
+
+ context 'when the search_blobs_language_aggregation feature flag is disabled' do
+ before do
+ stub_feature_flags(search_blobs_language_aggregation: false)
+ end
+
+ it 'does not filter by language', :sidekiq_inline, :aggregate_failures do
+ expected_paths = %w[
+ CHANGELOG
+ CONTRIBUTING.md
+ bar/branch-test.txt
+ custom-highlighting/test.gitlab-custom
+ files/ruby/popen.rb
+ files/ruby/regex.rb
+ files/ruby/version_info.rb
+ files/whitespace
+ encoding/test.txt
+ files/markdown/ruby-style-guide.md
+ ]
+
+ paths = blob_results.map { |blob| blob.binary_path }
+ expect(blob_results.size).to eq(10)
+ expect(paths).to match_array(expected_paths)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
index b5d93aec1bf..9d280d9404a 100644
--- a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
@@ -32,3 +32,45 @@ RSpec.shared_examples 'does not track when feature flag is disabled' do |feature
end
end
end
+
+RSpec.shared_examples 'a daily tracked issuable snowplow and service ping events' do
+ before do
+ stub_application_setting(usage_ping_enabled: true)
+ end
+
+ def count_unique(date_from: 1.minute.ago, date_to: 1.minute.from_now)
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: action, start_date: date_from, end_date: date_to)
+ end
+
+ specify do
+ aggregate_failures do
+ expect(track_action(author: user1, project: project)).to be_truthy
+ expect(track_action(author: user1, project: project)).to be_truthy
+ expect(track_action(author: user2, project: project)).to be_truthy
+ expect(count_unique).to eq(2)
+ end
+ end
+
+ it 'does not track edit actions if author is not present' do
+ expect(track_action(author: nil, project: project)).to be_nil
+ end
+
+ it 'emits snowplow event' do
+ track_action(author: user1, project: project)
+
+ expect_snowplow_event(category: 'issues_edit', action: action, user: user1,
+ namespace: project.namespace, project: project)
+ end
+
+ context 'with route_hll_to_snowplow_phase2 disabled' do
+ before do
+ stub_feature_flags(route_hll_to_snowplow_phase2: false)
+ end
+
+ it 'does not emit snowplow event' do
+ track_action(author: user1, project: project)
+
+ expect_no_snowplow_event
+ end
+ end
+end
diff --git a/spec/support/shared_examples/merge_request_author_auto_assign_shared_examples.rb b/spec/support/shared_examples/merge_request_author_auto_assign_shared_examples.rb
deleted file mode 100644
index d4986975f03..00000000000
--- a/spec/support/shared_examples/merge_request_author_auto_assign_shared_examples.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'merge request author auto assign' do
- it 'populates merge request author as assignee' do
- expect(find('.js-assignee-search')).to have_content(user.name)
- expect(page).not_to have_content 'Assign yourself'
- 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 fa10b03fa90..d189e91effd 100644
--- a/spec/support/shared_examples/models/chat_integration_shared_examples.rb
+++ b/spec/support/shared_examples/models/chat_integration_shared_examples.rb
@@ -357,7 +357,8 @@ RSpec.shared_examples "chat integration" do |integration_name|
end
context 'deployment events' do
- let(:sample_data) { Gitlab::DataBuilder::Deployment.build(create(:deployment), Time.now) }
+ let(:deployment) { create(:deployment) }
+ let(:sample_data) { Gitlab::DataBuilder::Deployment.build(deployment, deployment.status, Time.now) }
it_behaves_like "untriggered #{integration_name} integration"
end
diff --git a/spec/support/shared_examples/models/clusters/elastic_stack_client_shared.rb b/spec/support/shared_examples/models/clusters/elastic_stack_client_shared.rb
deleted file mode 100644
index 744262d79ea..00000000000
--- a/spec/support/shared_examples/models/clusters/elastic_stack_client_shared.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-# frozen_string_literal: true
-
-# Input
-# - factory: [:clusters_applications_elastic_stack, :clusters_integrations_elastic_stack]
-RSpec.shared_examples 'cluster-based #elasticsearch_client' do |factory|
- describe '#elasticsearch_client' do
- context 'cluster is nil' do
- subject { build(factory, cluster: nil) }
-
- it 'returns nil' do
- expect(subject.cluster).to be_nil
- expect(subject.elasticsearch_client).to be_nil
- end
- end
-
- context "cluster doesn't have kubeclient" do
- let(:cluster) { create(:cluster) }
-
- subject { create(factory, cluster: cluster) }
-
- it 'returns nil' do
- expect(subject.elasticsearch_client).to be_nil
- end
- end
-
- context 'cluster has kubeclient' do
- let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
- let(:kubernetes_url) { subject.cluster.platform_kubernetes.api_url }
- let(:kube_client) { subject.cluster.kubeclient.core_client }
-
- subject { create(factory, cluster: cluster) }
-
- before do
- subject.cluster.platform_kubernetes.namespace = 'a-namespace'
- stub_kubeclient_discover(cluster.platform_kubernetes.api_url)
-
- create(:cluster_kubernetes_namespace,
- cluster: cluster,
- cluster_project: cluster.cluster_project,
- project: cluster.cluster_project.project)
- end
-
- it 'creates proxy elasticsearch_client' do
- expect(subject.elasticsearch_client).to be_instance_of(Elasticsearch::Transport::Client)
- end
-
- it 'copies proxy_url, options and headers from kube client to elasticsearch_client' do
- expect(Elasticsearch::Client)
- .to(receive(:new))
- .with(url: a_valid_url, adapter: :net_http)
- .and_call_original
-
- client = subject.elasticsearch_client
- faraday_connection = client.transport.connections.first.connection
-
- expect(faraday_connection.headers["Authorization"]).to eq(kube_client.headers[:Authorization])
- expect(faraday_connection.ssl.cert_store).to be_instance_of(OpenSSL::X509::Store)
- expect(faraday_connection.ssl.verify).to eq(1)
- expect(faraday_connection.options.timeout).to be_nil
- end
-
- context 'when cluster is not reachable' do
- before do
- allow(kube_client).to receive(:proxy_url).and_raise(Kubeclient::HttpError.new(401, 'Unauthorized', nil))
- end
-
- it 'returns nil' do
- expect(subject.elasticsearch_client).to be_nil
- end
- end
-
- context 'when timeout is provided' do
- it 'sets timeout in elasticsearch_client' do
- client = subject.elasticsearch_client(timeout: 123)
- faraday_connection = client.transport.connections.first.connection
-
- expect(faraday_connection.options.timeout).to eq(123)
- end
- end
- end
- end
-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 2e062cda4e9..d80be5be3b3 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
@@ -230,7 +230,7 @@ RSpec.shared_examples Integrations::SlackMattermostNotifier do |integration_name
context 'deployment events' do
let_it_be(:deployment) { create(:deployment) }
- let(:data) { Gitlab::DataBuilder::Deployment.build(deployment, Time.current) }
+ let(:data) { Gitlab::DataBuilder::Deployment.build(deployment, 'created', Time.current) }
it_behaves_like 'calls the integration API with the event message', /Deploy to (.*?) created/
end
@@ -677,7 +677,7 @@ RSpec.shared_examples Integrations::SlackMattermostNotifier do |integration_name
create(:deployment, :success, project: project, sha: project.commit.sha, ref: project.default_branch)
end
- let(:data) { Gitlab::DataBuilder::Deployment.build(deployment, Time.now) }
+ let(:data) { Gitlab::DataBuilder::Deployment.build(deployment, deployment.status, Time.now) }
before do
allow(chat_integration).to receive_messages(
diff --git a/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb b/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb
index a2b4cdc33d0..d06e8391a9a 100644
--- a/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb
@@ -82,7 +82,7 @@ RSpec.shared_examples 'a timebox' do |timebox_type|
it { is_expected.to belong_to(:group) }
it { is_expected.to have_many(:issues) }
it { is_expected.to have_many(:merge_requests) }
- it { is_expected.to have_many(:labels) }
+ it { is_expected.to have_many(:labels).through(:issues) }
end
describe '#timebox_name' do
diff --git a/spec/support/shared_examples/models/issuable_participants_shared_examples.rb b/spec/support/shared_examples/models/issuable_participants_shared_examples.rb
new file mode 100644
index 00000000000..c3eaae0ace2
--- /dev/null
+++ b/spec/support/shared_examples/models/issuable_participants_shared_examples.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'issuable participants' do
+ context 'when resource parent is public' do
+ context 'and users are referenced on notes' do
+ let_it_be(:notes_author) { create(:user) }
+
+ let(:note_params) { params.merge(author: notes_author) }
+
+ before do
+ create(:note, note_params)
+ end
+
+ it 'includes the issue author' do
+ expect(issuable.participants).to include(issuable.author)
+ end
+
+ it 'includes the authors of the notes' do
+ expect(issuable.participants).to include(notes_author)
+ end
+
+ context 'and note is confidential' do
+ context 'and mentions users' do
+ let_it_be(:guest_1) { create(:user) }
+ let_it_be(:guest_2) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+
+ before do
+ issuable_parent.add_guest(guest_1)
+ issuable_parent.add_guest(guest_2)
+ issuable_parent.add_reporter(reporter)
+
+ confidential_note_params =
+ note_params.merge(
+ confidential: true,
+ note: "mentions #{guest_1.to_reference} and #{guest_2.to_reference} and #{reporter.to_reference}"
+ )
+
+ regular_note_params =
+ note_params.merge(note: "Mentions #{guest_2.to_reference}")
+
+ create(:note, confidential_note_params)
+ create(:note, regular_note_params)
+ end
+
+ it 'only includes users that can read the note as participants' do
+ expect(issuable.participants).to contain_exactly(issuable.author, notes_author, reporter, guest_2)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/member_shared_examples.rb b/spec/support/shared_examples/models/member_shared_examples.rb
index 75fff11cecd..aa40a2c7135 100644
--- a/spec/support/shared_examples/models/member_shared_examples.rb
+++ b/spec/support/shared_examples/models/member_shared_examples.rb
@@ -80,7 +80,7 @@ RSpec.shared_examples_for "member creation" do
let_it_be(:admin) { create(:admin) }
it 'returns a Member object', :aggregate_failures do
- member = described_class.add_user(source, user, :maintainer)
+ member = described_class.add_member(source, user, :maintainer)
expect(member).to be_a member_type
expect(member).to be_persisted
@@ -99,7 +99,7 @@ RSpec.shared_examples_for "member creation" do
end
it 'does not update the member' do
- member = described_class.add_user(source, project_bot, :maintainer, current_user: user)
+ member = described_class.add_member(source, project_bot, :maintainer, current_user: user)
expect(source.users.reload).to include(project_bot)
expect(member).to be_persisted
@@ -110,7 +110,7 @@ RSpec.shared_examples_for "member creation" do
context 'when project_bot is not already a member' do
it 'adds the member' do
- member = described_class.add_user(source, project_bot, :maintainer, current_user: user)
+ member = described_class.add_member(source, project_bot, :maintainer, current_user: user)
expect(source.users.reload).to include(project_bot)
expect(member).to be_persisted
@@ -120,7 +120,7 @@ RSpec.shared_examples_for "member creation" do
context 'when admin mode is enabled', :enable_admin_mode, :aggregate_failures do
it 'sets members.created_by to the given admin current_user' do
- member = described_class.add_user(source, user, :maintainer, current_user: admin)
+ member = described_class.add_member(source, user, :maintainer, current_user: admin)
expect(member).to be_persisted
expect(source.users.reload).to include(user)
@@ -130,7 +130,7 @@ RSpec.shared_examples_for "member creation" do
context 'when admin mode is disabled' do
it 'rejects setting members.created_by to the given admin current_user', :aggregate_failures do
- member = described_class.add_user(source, user, :maintainer, current_user: admin)
+ member = described_class.add_member(source, user, :maintainer, current_user: admin)
expect(member).not_to be_persisted
expect(source.users.reload).not_to include(user)
@@ -139,7 +139,7 @@ RSpec.shared_examples_for "member creation" do
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))
+ member = described_class.add_member(source, user, :maintainer, expires_at: Date.new(2016, 9, 22))
expect(member.expires_at).to eq(Date.new(2016, 9, 22))
end
@@ -148,7 +148,7 @@ RSpec.shared_examples_for "member creation" do
it "accepts the :#{sym_key} symbol as access level", :aggregate_failures do
expect(source.users).not_to include(user)
- member = described_class.add_user(source, user.id, sym_key)
+ member = described_class.add_member(source, user.id, sym_key)
expect(member.access_level).to eq(int_access_level)
expect(source.users.reload).to include(user)
@@ -157,7 +157,7 @@ RSpec.shared_examples_for "member creation" do
it "accepts the #{int_access_level} integer as access level", :aggregate_failures do
expect(source.users).not_to include(user)
- member = described_class.add_user(source, user.id, int_access_level)
+ member = described_class.add_member(source, user.id, int_access_level)
expect(member.access_level).to eq(int_access_level)
expect(source.users.reload).to include(user)
@@ -169,7 +169,7 @@ RSpec.shared_examples_for "member creation" do
it 'adds the user as a member' do
expect(source.users).not_to include(user)
- described_class.add_user(source, user.id, :maintainer)
+ described_class.add_member(source, user.id, :maintainer)
expect(source.users.reload).to include(user)
end
@@ -179,7 +179,7 @@ RSpec.shared_examples_for "member creation" do
it 'does not add the user as a member' do
expect(source.users).not_to include(user)
- described_class.add_user(source, non_existing_record_id, :maintainer)
+ described_class.add_member(source, non_existing_record_id, :maintainer)
expect(source.users.reload).not_to include(user)
end
@@ -189,7 +189,7 @@ RSpec.shared_examples_for "member creation" do
it 'adds the user as a member' do
expect(source.users).not_to include(user)
- described_class.add_user(source, user, :maintainer)
+ described_class.add_member(source, user, :maintainer)
expect(source.users.reload).to include(user)
end
@@ -205,7 +205,7 @@ RSpec.shared_examples_for "member creation" do
expect(source.requesters.exists?(user_id: user)).to be_truthy
expect do
- described_class.add_user(source, user, :maintainer)
+ described_class.add_member(source, user, :maintainer)
end.to raise_error(Gitlab::Access::AccessDeniedError)
expect(source.users.reload).not_to include(user)
@@ -217,7 +217,7 @@ RSpec.shared_examples_for "member creation" do
it 'adds the user as a member' do
expect(source.users).not_to include(user)
- described_class.add_user(source, user.email, :maintainer)
+ described_class.add_member(source, user.email, :maintainer)
expect(source.users.reload).to include(user)
end
@@ -227,7 +227,7 @@ RSpec.shared_examples_for "member creation" do
it 'creates an invited member' do
expect(source.users).not_to include(user)
- described_class.add_user(source, 'user@example.com', :maintainer)
+ described_class.add_member(source, 'user@example.com', :maintainer)
expect(source.members.invite.pluck(:invite_email)).to include('user@example.com')
end
@@ -237,7 +237,7 @@ RSpec.shared_examples_for "member creation" 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)
+ described_class.add_member(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)
@@ -249,7 +249,7 @@ RSpec.shared_examples_for "member creation" do
it 'creates the member' do
expect(source.users).not_to include(user)
- described_class.add_user(source, user, :maintainer, current_user: admin)
+ described_class.add_member(source, user, :maintainer, current_user: admin)
expect(source.users.reload).to include(user)
end
@@ -263,7 +263,7 @@ RSpec.shared_examples_for "member creation" 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)
+ described_class.add_member(source, user, :maintainer, current_user: admin)
expect(source.users.reload).to include(user)
expect(source.requesters.reload.exists?(user_id: user)).to be_falsy
@@ -275,7 +275,7 @@ RSpec.shared_examples_for "member creation" do
it 'does not create the member', :aggregate_failures do
expect(source.users).not_to include(user)
- member = described_class.add_user(source, user, :maintainer, current_user: user)
+ member = described_class.add_member(source, user, :maintainer, current_user: user)
expect(source.users.reload).not_to include(user)
expect(member).not_to be_persisted
@@ -290,7 +290,7 @@ RSpec.shared_examples_for "member creation" 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)
+ described_class.add_member(source, user, :maintainer, current_user: user)
expect(source.users.reload).not_to include(user)
expect(source.requesters.exists?(user_id: user)).to be_truthy
@@ -299,37 +299,51 @@ RSpec.shared_examples_for "member creation" do
end
context 'when member already exists' do
- before do
- source.add_user(user, :developer)
- end
+ context 'when member is a user' do
+ before do
+ source.add_member(user, :developer)
+ end
- context 'with no current_user' do
- it 'updates the member' do
- expect(source.users).to include(user)
+ context 'with no current_user' do
+ it 'updates the member' do
+ expect(source.users).to include(user)
- described_class.add_user(source, user, :maintainer)
+ described_class.add_member(source, user, :maintainer)
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
+ end
end
- end
- context 'when current_user can update member', :enable_admin_mode do
- it 'updates the member' do
- expect(source.users).to include(user)
+ 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)
+ described_class.add_member(source, user, :maintainer, current_user: admin)
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
+ end
end
- end
- context 'when current_user cannot update member' do
- it 'does not update the member' do
- expect(source.users).to include(user)
+ context 'when current_user cannot update member' do
+ it 'does not update the member' do
+ expect(source.users).to include(user)
+
+ described_class.add_member(source, user, :maintainer, current_user: user)
+
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::DEVELOPER)
+ end
+ end
+ end
- described_class.add_user(source, user, :maintainer, current_user: user)
+ context 'when member is an invite by email' do
+ let_it_be(:email) { 'user@email.com' }
+ let_it_be(:existing_member) { source.add_developer(email) }
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::DEVELOPER)
+ it 'updates the member for that email' do
+ expect do
+ described_class.add_member(source, email, :maintainer)
+ end.to change { existing_member.reset.access_level }.from(Member::DEVELOPER).to(Member::MAINTAINER)
+ .and not_change { source.members.invite.count }
end
end
end
@@ -345,12 +359,12 @@ RSpec.shared_examples_for "bulk member creation" do
# maintainers cannot add owners
source.add_maintainer(user)
- expect(described_class.add_users(source, [user1, user2], :owner, current_user: user)).to be_empty
+ expect(described_class.add_members(source, [user1, user2], :owner, current_user: user)).to be_empty
end
end
it 'returns Member objects' do
- members = described_class.add_users(source, [user1, user2], :maintainer)
+ members = described_class.add_members(source, [user1, user2], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1, user2)
expect(members).to all(be_a(member_type))
@@ -358,7 +372,7 @@ RSpec.shared_examples_for "bulk member creation" do
end
it 'returns an empty array' do
- members = described_class.add_users(source, [], :maintainer)
+ members = described_class.add_members(source, [], :maintainer)
expect(members).to be_a Array
expect(members).to be_empty
@@ -367,7 +381,7 @@ RSpec.shared_examples_for "bulk member creation" do
it 'supports different formats' do
list = ['joe@local.test', admin, user1.id, user2.id.to_s]
- members = described_class.add_users(source, list, :maintainer)
+ members = described_class.add_members(source, list, :maintainer)
expect(members.size).to eq(4)
expect(members.first).to be_invite
@@ -375,7 +389,7 @@ RSpec.shared_examples_for "bulk member creation" do
context 'with de-duplication' do
it 'has the same user by id and user' do
- members = described_class.add_users(source, [user1.id, user1, user1.id, user2, user2.id, user2], :maintainer)
+ members = described_class.add_members(source, [user1.id, user1, user1.id, user2, user2.id, user2], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1, user2)
expect(members).to all(be_a(member_type))
@@ -383,7 +397,7 @@ RSpec.shared_examples_for "bulk member creation" do
end
it 'has the same user sent more than once' do
- members = described_class.add_users(source, [user1, user1], :maintainer)
+ members = described_class.add_members(source, [user1, user1], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1)
expect(members).to all(be_a(member_type))
@@ -392,7 +406,7 @@ RSpec.shared_examples_for "bulk member creation" do
end
it 'with the same user sent more than once by user and by email' do
- members = described_class.add_users(source, [user1, user1.email], :maintainer)
+ members = described_class.add_members(source, [user1, user1.email], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1)
expect(members).to all(be_a(member_type))
@@ -400,7 +414,7 @@ RSpec.shared_examples_for "bulk member creation" do
end
it 'with the same user sent more than once by user id and by email' do
- members = described_class.add_users(source, [user1.id, user1.email], :maintainer)
+ members = described_class.add_members(source, [user1.id, user1.email], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1)
expect(members).to all(be_a(member_type))
@@ -409,12 +423,12 @@ RSpec.shared_examples_for "bulk member creation" do
context 'when a member already exists' do
before do
- source.add_user(user1, :developer)
+ source.add_member(user1, :developer)
end
it 'has the same user sent more than once with the member already existing' do
expect do
- members = described_class.add_users(source, [user1, user1, user2], :maintainer)
+ members = described_class.add_members(source, [user1, user1, user2], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1, user2)
expect(members).to all(be_a(member_type))
expect(members).to all(be_persisted)
@@ -425,7 +439,7 @@ RSpec.shared_examples_for "bulk member creation" do
user3 = create(:user)
expect do
- members = described_class.add_users(source, [user1.id, user2, user3.id], :maintainer)
+ members = described_class.add_members(source, [user1.id, user2, user3.id], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1, user2, user3)
expect(members).to all(be_a(member_type))
expect(members).to all(be_persisted)
@@ -436,7 +450,7 @@ RSpec.shared_examples_for "bulk member creation" do
user3 = create(:user)
expect do
- members = described_class.add_users(source, [user1, user2, user3], :maintainer)
+ members = described_class.add_members(source, [user1, user2, user3], :maintainer)
expect(members.map(&:user)).to contain_exactly(user1, user2, user3)
expect(members).to all(be_a(member_type))
expect(members).to all(be_persisted)
@@ -448,7 +462,7 @@ RSpec.shared_examples_for "bulk member creation" do
let(:task_project) { source.is_a?(Group) ? create(:project, group: source) : source }
it 'creates a member_task with the correct attributes', :aggregate_failures do
- members = described_class.add_users(source, [user1], :developer, tasks_to_be_done: %w(ci code), tasks_project_id: task_project.id)
+ members = described_class.add_members(source, [user1], :developer, tasks_to_be_done: %w(ci code), tasks_project_id: task_project.id)
member = members.last
expect(member.tasks_to_be_done).to match_array([:ci, :code])
@@ -457,7 +471,7 @@ RSpec.shared_examples_for "bulk member creation" do
context 'with an already existing member' do
before do
- source.add_user(user1, :developer)
+ source.add_member(user1, :developer)
end
it 'does not update tasks to be done if tasks already exist', :aggregate_failures do
@@ -465,7 +479,7 @@ RSpec.shared_examples_for "bulk member creation" do
create(:member_task, member: member, project: task_project, tasks_to_be_done: %w(code ci))
expect do
- described_class.add_users(source,
+ described_class.add_members(source,
[user1.id],
:developer,
tasks_to_be_done: %w(issues),
@@ -479,7 +493,7 @@ RSpec.shared_examples_for "bulk member creation" do
it 'adds tasks to be done if they do not exist', :aggregate_failures do
expect do
- described_class.add_users(source,
+ described_class.add_members(source,
[user1.id],
:developer,
tasks_to_be_done: %w(issues),
diff --git a/spec/support/shared_examples/models/mentionable_shared_examples.rb b/spec/support/shared_examples/models/mentionable_shared_examples.rb
index e23658d1774..f9612dd61be 100644
--- a/spec/support/shared_examples/models/mentionable_shared_examples.rb
+++ b/spec/support/shared_examples/models/mentionable_shared_examples.rb
@@ -260,6 +260,25 @@ RSpec.shared_examples 'mentions in notes' do |mentionable_type|
expect(mentionable.referenced_projects(user)).to eq [mentionable.project].compact # epic.project is nil, and we want empty []
expect(mentionable.referenced_groups(user)).to eq [group]
end
+
+ if [:epic, :issue].include?(mentionable_type)
+ context 'and note is confidential' do
+ let_it_be(:guest) { create(:user) }
+
+ let(:note_desc) { "#{guest.to_reference} and #{user2.to_reference} and #{user.to_reference}" }
+
+ before do
+ note.resource_parent.add_reporter(user2)
+ note.resource_parent.add_guest(guest)
+ # Bypass :confidential update model validation for testing purposes
+ note.update_attribute(:confidential, true)
+ end
+
+ it 'returns only mentioned users that has permissions' do
+ expect(note.mentioned_users).to contain_exactly(user, user2)
+ end
+ end
+ end
end
end
@@ -294,6 +313,26 @@ RSpec.shared_examples 'load mentions from DB' do |mentionable_type|
end
end
+ if [:epic, :issue].include?(mentionable_type)
+ context 'and note is confidential' do
+ let_it_be(:guest) { create(:user) }
+
+ let(:note_desc) { "#{guest.to_reference} and #{mentioned_user.to_reference}" }
+
+ before do
+ note.resource_parent.add_reporter(mentioned_user)
+ note.resource_parent.add_guest(guest)
+ # Bypass :confidential update model validation for testing purposes
+ note.update_attribute(:confidential, true)
+ note.store_mentions!
+ end
+
+ it 'stores only mentioned users that has permissions' do
+ expect(mentionable.referenced_users).to contain_exactly(mentioned_user)
+ end
+ end
+ end
+
context 'when private projects and groups are mentioned' do
let(:mega_user) { create(:user) }
let(:private_project) { create(:project, :private) }
diff --git a/spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb
index ab04692616a..d42e925ed22 100644
--- a/spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb
@@ -89,10 +89,13 @@ RSpec.shared_examples 'clone quick action' do
let(:bug) { create(:label, project: project, title: 'bug') }
let(:wontfix) { create(:label, project: project, title: 'wontfix') }
- let!(:target_milestone) { create(:milestone, title: '1.0', project: target_project) }
-
before do
target_project.add_maintainer(user)
+
+ # create equivalent labels and milestones in the target project
+ create(:label, project: target_project, title: 'bug')
+ create(:label, project: target_project, title: 'wontfix')
+ create(:milestone, title: '1.0', project: target_project)
end
shared_examples 'applies the commands to issues in both projects, target and source' do
diff --git a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
index e6b0772aec1..bb2f8965294 100644
--- a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
@@ -1,6 +1,10 @@
# frozen_string_literal: true
RSpec.shared_examples 'conan ping endpoint' do
+ it_behaves_like 'conan FIPS mode' do
+ subject { get api(url) }
+ end
+
it 'responds with 200 OK when no token provided' do
get api(url)
@@ -68,7 +72,7 @@ RSpec.shared_examples 'conan search endpoint' do
project.update!(visibility: 'private')
project.team.truncate
user.project_authorizations.delete_all
- project.add_user(user, role) unless role == :anonymous
+ project.add_member(user, role) unless role == :anonymous
get api(url), params: params, headers: headers
end
@@ -85,6 +89,8 @@ end
RSpec.shared_examples 'conan authenticate endpoint' do
subject { get api(url), headers: headers }
+ it_behaves_like 'conan FIPS mode'
+
context 'when using invalid token' do
let(:auth_token) { 'invalid_token' }
@@ -159,6 +165,10 @@ RSpec.shared_examples 'conan authenticate endpoint' do
end
RSpec.shared_examples 'conan check_credentials endpoint' do
+ it_behaves_like 'conan FIPS mode' do
+ subject { get api(url), headers: headers }
+ end
+
it 'responds with a 200 OK with PAT' do
get api(url), headers: headers
@@ -390,6 +400,7 @@ end
RSpec.shared_examples 'recipe snapshot endpoint' do
subject { get api(url), headers: headers }
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects recipe for invalid project'
it_behaves_like 'empty recipe for not found package'
@@ -415,6 +426,7 @@ end
RSpec.shared_examples 'package snapshot endpoint' do
subject { get api(url), headers: headers }
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects recipe for invalid project'
it_behaves_like 'empty recipe for not found package'
@@ -436,6 +448,10 @@ RSpec.shared_examples 'package snapshot endpoint' do
end
RSpec.shared_examples 'recipe download_urls endpoint' do
+ it_behaves_like 'conan FIPS mode' do
+ let(:recipe_path) { package.conan_recipe_path }
+ end
+
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects recipe for invalid project'
it_behaves_like 'recipe download_urls'
@@ -443,6 +459,10 @@ RSpec.shared_examples 'recipe download_urls endpoint' do
end
RSpec.shared_examples 'package download_urls endpoint' do
+ it_behaves_like 'conan FIPS mode' do
+ let(:recipe_path) { package.conan_recipe_path }
+ end
+
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects recipe for invalid project'
it_behaves_like 'package download_urls'
@@ -457,6 +477,7 @@ RSpec.shared_examples 'recipe upload_urls endpoint' do
'conanmanifest.txt': 123 }
end
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects invalid upload_url params'
it_behaves_like 'handling empty values for username and channel'
@@ -519,6 +540,7 @@ RSpec.shared_examples 'package upload_urls endpoint' do
'conan_package.tgz': 523 }
end
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects invalid upload_url params'
it_behaves_like 'handling empty values for username and channel'
@@ -556,6 +578,7 @@ end
RSpec.shared_examples 'delete package endpoint' do
let(:recipe_path) { package.conan_recipe_path }
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'handling empty values for username and channel'
@@ -665,6 +688,7 @@ RSpec.shared_examples 'not found request' do
end
RSpec.shared_examples 'recipe file download endpoint' do
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'a public project with packages'
it_behaves_like 'an internal project with packages'
it_behaves_like 'a private project with packages'
@@ -672,6 +696,7 @@ RSpec.shared_examples 'recipe file download endpoint' do
end
RSpec.shared_examples 'package file download endpoint' do
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'a public project with packages'
it_behaves_like 'an internal project with packages'
it_behaves_like 'a private project with packages'
@@ -697,6 +722,7 @@ RSpec.shared_examples 'project not found by project id' do
end
RSpec.shared_examples 'workhorse authorize endpoint' do
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects invalid file_name', 'conanfile.py.git%2fgit-upload-pack'
it_behaves_like 'workhorse authorization'
@@ -718,6 +744,7 @@ RSpec.shared_examples 'workhorse recipe file upload endpoint' do
)
end
+ it_behaves_like 'conan FIPS mode'
it_behaves_like 'rejects invalid recipe'
it_behaves_like 'rejects invalid file_name', 'conanfile.py.git%2fgit-upload-pack'
it_behaves_like 'uploads a package file'
@@ -979,3 +1006,9 @@ RSpec.shared_examples 'workhorse authorization' do
end
end
end
+
+RSpec.shared_examples 'conan FIPS mode' do
+ context 'when FIPS mode is enabled', :fips_mode do
+ it_behaves_like 'returning response status', :not_found
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/debian_common_shared_examples.rb b/spec/support/shared_examples/requests/api/debian_common_shared_examples.rb
index e0225070986..2ba42b8e8fa 100644
--- a/spec/support/shared_examples/requests/api/debian_common_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/debian_common_shared_examples.rb
@@ -15,3 +15,9 @@ RSpec.shared_examples 'rejects Debian access with unknown container id' do |anon
end
end
end
+
+RSpec.shared_examples 'Debian API FIPS mode' do
+ context 'when FIPS mode is enabled', :fips_mode do
+ it_behaves_like 'returning response status', :not_found
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb b/spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb
index 5cd63c33936..f13ac05591c 100644
--- a/spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb
@@ -3,6 +3,8 @@
RSpec.shared_examples 'Debian distributions GET request' do |status, body = nil|
and_body = body.nil? ? '' : ' and expected body'
+ it_behaves_like 'Debian API FIPS mode'
+
it "returns #{status}#{and_body}" do
subject
@@ -17,6 +19,8 @@ end
RSpec.shared_examples 'Debian distributions PUT request' do |status, body|
and_body = body.nil? ? '' : ' and expected body'
+ it_behaves_like 'Debian API FIPS mode'
+
if status == :success
it 'updates distribution', :aggregate_failures do
expect(::Packages::Debian::UpdateDistributionService).to receive(:new).with(distribution, api_params.except(:codename)).and_call_original
@@ -49,6 +53,8 @@ end
RSpec.shared_examples 'Debian distributions DELETE request' do |status, body|
and_body = body.nil? ? '' : ' and expected body'
+ it_behaves_like 'Debian API FIPS mode'
+
if status == :success
it 'updates distribution', :aggregate_failures do
expect { subject }
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 9f96cb2a164..de7032450a5 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
@@ -3,6 +3,8 @@
RSpec.shared_examples 'Debian packages GET request' do |status, body = nil|
and_body = body.nil? ? '' : ' and expected body'
+ it_behaves_like 'Debian API FIPS mode'
+
it "returns #{status}#{and_body}" do
subject
@@ -17,6 +19,8 @@ end
RSpec.shared_examples 'Debian packages upload request' do |status, body = nil|
and_body = body.nil? ? '' : ' and expected body'
+ it_behaves_like 'Debian API FIPS mode'
+
if status == :created
it 'creates package files', :aggregate_failures do
expect(::Packages::Debian::FindOrCreateIncomingService).to receive(:new).with(container, user).and_call_original
diff --git a/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb
index e534a02e562..8ab820e9d43 100644
--- a/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb
@@ -64,7 +64,8 @@ RSpec.shared_examples 'group and project boards query' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { }
+ include_context 'no sort argument'
+
let(:first_param) { 2 }
def pagination_results_data(nodes)
diff --git a/spec/support/shared_examples/requests/api/graphql/mutations/snippets_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/mutations/snippets_shared_examples.rb
index a42a1fda62e..b459e479c91 100644
--- a/spec/support/shared_examples/requests/api/graphql/mutations/snippets_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/mutations/snippets_shared_examples.rb
@@ -22,7 +22,7 @@ RSpec.shared_examples 'snippet edit usage data counters' do
context 'when user is not sessionless', :clean_gitlab_redis_sessions do
before do
- stub_session('warden.user.user.key' => [[current_user.id], current_user.encrypted_password[0, 29]])
+ stub_session('warden.user.user.key' => [[current_user.id], current_user.authenticatable_salt])
end
it 'tracks usage data actions', :clean_gitlab_redis_sessions do
diff --git a/spec/support/shared_examples/requests/api/hooks_shared_examples.rb b/spec/support/shared_examples/requests/api/hooks_shared_examples.rb
new file mode 100644
index 00000000000..013945bd578
--- /dev/null
+++ b/spec/support/shared_examples/requests/api/hooks_shared_examples.rb
@@ -0,0 +1,415 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'web-hook API endpoints test hook' do |prefix|
+ describe "POST #{prefix}/:hook_id" do
+ it 'tests the hook' do
+ expect(WebHookService)
+ .to receive(:new).with(hook, anything, String, force: false)
+ .and_return(instance_double(WebHookService, execute: nil))
+
+ post api(hook_uri, user)
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+ end
+end
+
+RSpec.shared_examples 'web-hook API endpoints with branch-filter' do |prefix|
+ describe "POST #{prefix}/hooks" do
+ it "returns a 422 error if branch filter is not valid" do
+ post api(collection_uri, user),
+ params: { url: "http://example.com", push_events_branch_filter: '~badbranchname/' }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+end
+
+RSpec.shared_examples 'web-hook API endpoints' do |prefix|
+ def hooks_count
+ scope.count
+ end
+
+ def hook_param_overrides
+ if defined?(super)
+ super
+ else
+ { push_events_branch_filter: 'some-feature-branch' }
+ end
+ end
+
+ let(:hook_params) do
+ event_names.to_h { [_1, true] }.merge(hook_param_overrides).merge(
+ url: "http://example.com",
+ url_variables: [
+ { key: 'token', value: 'very-secret' },
+ { key: 'abc', value: 'other value' }
+ ]
+ )
+ end
+
+ let(:update_params) do
+ {
+ push_events: false,
+ job_events: true,
+ push_events_branch_filter: 'updated-branch-filter'
+ }
+ end
+
+ let(:default_values) { {} }
+
+ describe "GET #{prefix}/hooks" do
+ context "authorized user" do
+ it "returns all hooks" do
+ get api(collection_uri, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_collection_schema
+ end
+ end
+
+ context "when user is forbidden" do
+ it "prevents access to hooks" do
+ get api(collection_uri, unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context "when user is unauthorized" do
+ it "prevents access to hooks" do
+ get api(collection_uri, nil)
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+
+ context 'the hook has URL variables' do
+ before do
+ hook.update!(url_variables: { 'token' => 'supers3cret' })
+ end
+
+ it 'returns the names of the url variables' do
+ get api(collection_uri, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to contain_exactly(
+ a_hash_including(
+ 'url_variables' => [{ 'key' => 'token' }]
+ )
+ )
+ end
+ end
+ end
+
+ describe "GET #{prefix}/hooks/:hook_id" do
+ context "authorized user" do
+ it "returns a project hook" do
+ get api(hook_uri, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_hook_schema
+
+ expect(json_response['url']).to eq(hook.url)
+ end
+
+ it "returns a 404 error if hook id is not available" do
+ get api(hook_uri(non_existing_record_id), user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ context 'the hook is disabled' do
+ before do
+ hook.disable!
+ end
+
+ it "has the correct alert status", :aggregate_failures do
+ get api(hook_uri, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include('alert_status' => 'disabled')
+ end
+ end
+
+ context 'the hook is backed-off' do
+ before do
+ hook.backoff!
+ end
+
+ it "has the correct alert status", :aggregate_failures do
+ get api(hook_uri, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ 'alert_status' => 'temporarily_disabled',
+ 'disabled_until' => hook.disabled_until.iso8601(3)
+ )
+ end
+ end
+ end
+
+ context "when user is forbidden" do
+ it "does not access an existing hook" do
+ get api(hook_uri, unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context "when user is unauthorized" do
+ it "does not access an existing hook" do
+ get api(hook_uri, nil)
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+ end
+
+ describe "POST #{prefix}/hooks" do
+ let(:hook_creation_params) { hook_params }
+
+ it "adds hook", :aggregate_failures do
+ expect do
+ post api(collection_uri, user),
+ params: hook_creation_params
+ end.to change { hooks_count }.by(1)
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(response).to match_hook_schema
+
+ expect(json_response['url']).to eq(hook_creation_params[:url])
+ hook_param_overrides.each do |k, v|
+ expect(json_response[k.to_s]).to eq(v)
+ end
+ event_names.each do |name|
+ expect(json_response[name.to_s]).to eq(true), name
+ end
+ expect(json_response['url_variables']).to match_array [
+ { 'key' => 'token' },
+ { 'key' => 'abc' }
+ ]
+ expect(json_response).not_to include('token')
+ end
+
+ it "adds the token without including it in the response" do
+ token = "secret token"
+
+ expect do
+ post api(collection_uri, user),
+ params: { url: "http://example.com", token: token }
+ end.to change { hooks_count }.by(1)
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response["url"]).to eq("http://example.com")
+ expect(json_response).not_to include("token")
+
+ hook = scope.find(json_response["id"])
+
+ expect(hook.url).to eq("http://example.com")
+ expect(hook.token).to eq(token)
+ end
+
+ it "returns a 400 error if url not given" do
+ post api(collection_uri, user), params: { event_names.first => true }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it "returns a 400 error if no parameters are provided" do
+ post api(collection_uri, user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it 'sets default values for events', :aggregate_failures do
+ post api(collection_uri, user), params: { url: 'http://mep.mep' }
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(response).to match_hook_schema
+ expect(json_response['enable_ssl_verification']).to be true
+ event_names.each do |name|
+ expect(json_response[name.to_s]).to eq(default_values.fetch(name, false)), name
+ end
+ end
+
+ it "returns a 422 error if token not valid" do
+ post api(collection_uri, user),
+ params: { url: "http://example.com", token: "foo\nbar" }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+
+ it "returns a 422 error if url not valid" do
+ post api(collection_uri, user), params: { url: "ftp://example.com" }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
+ describe "PUT #{prefix}/hooks/:hook_id" do
+ it "updates an existing hook" do
+ put api(hook_uri, user), params: update_params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_hook_schema
+
+ update_params.each do |k, v|
+ expect(json_response[k.to_s]).to eq(v)
+ end
+ end
+
+ it 'updates the URL variables' do
+ hook.update!(url_variables: { 'abc' => 'some value' })
+
+ put api(hook_uri, user),
+ params: { url_variables: [{ key: 'def', value: 'other value' }] }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['url_variables']).to match_array [
+ { 'key' => 'abc' },
+ { 'key' => 'def' }
+ ]
+ end
+
+ it "adds the token without including it in the response" do
+ token = "secret token"
+
+ put api(hook_uri, user), params: { url: "http://example.org", token: token }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response["url"]).to eq("http://example.org")
+ expect(json_response).not_to include("token")
+
+ expect(hook.reload.url).to eq("http://example.org")
+ expect(hook.reload.token).to eq(token)
+ end
+
+ it "returns 404 error if hook id not found" do
+ put api(hook_uri(non_existing_record_id), user), params: { url: 'http://example.org' }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it "returns 400 error if no parameters are provided" do
+ put api(hook_uri, user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it "returns a 422 error if url is not valid" do
+ put api(hook_uri, user), params: { url: 'ftp://example.com' }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+
+ it "returns a 422 error if token is not valid" do
+ put api(hook_uri, user), params: { token: %w[foo bar].join("\n") }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
+ describe "DELETE /projects/:id/hooks/:hook_id" do
+ it "deletes hook from project" do
+ expect do
+ delete api(hook_uri, user)
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end.to change { hooks_count }.by(-1)
+ end
+
+ it "returns a 404 error when deleting non existent hook" do
+ delete api(hook_uri(non_existing_record_id), user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it "returns a 404 error if hook id not given" do
+ delete api(collection_uri, user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it "returns forbidden if a user attempts to delete hooks they do not own" do
+ delete api(hook_uri, unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(WebHook.exists?(hook.id)).to be_truthy
+ end
+
+ it_behaves_like '412 response' do
+ let(:request) { api(hook_uri, user) }
+ end
+ end
+
+ describe "PUT #{prefix}/hooks/:hook_id/url_variables/:key", :aggregate_failures do
+ it 'sets the variable' do
+ expect do
+ put api("#{hook_uri}/url_variables/abc", user),
+ params: { value: 'some secret value' }
+ end.to change { hook.reload.url_variables }.to(eq('abc' => 'some secret value'))
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+
+ it 'overwrites existing values' do
+ hook.update!(url_variables: { 'abc' => 'xyz', 'def' => 'other value' })
+
+ put api("#{hook_uri}/url_variables/abc", user),
+ params: { value: 'some secret value' }
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ expect(hook.reload.url_variables).to eq('abc' => 'some secret value', 'def' => 'other value')
+ end
+
+ it "returns a 404 error when editing non existent hook" do
+ put api("#{hook_uri(non_existing_record_id)}/url_variables/abc", user),
+ params: { value: 'xyz' }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it "returns a 422 error when the key is illegal" do
+ put api("#{hook_uri}/url_variables/abc%20def", user),
+ params: { value: 'xyz' }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+
+ it "returns a 422 error when the value is illegal" do
+ put api("#{hook_uri}/url_variables/abc", user),
+ params: { value: '' }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+
+ describe "DELETE #{prefix}/hooks/:hook_id/url_variables/:key", :aggregate_failures do
+ before do
+ hook.update!(url_variables: { 'abc' => 'prior value', 'def' => 'other value' })
+ end
+
+ it 'unsets the variable' do
+ expect do
+ delete api("#{hook_uri}/url_variables/abc", user)
+ end.to change { hook.reload.url_variables }.to(eq({ 'def' => 'other value' }))
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+
+ it 'returns 404 for keys that do not exist' do
+ hook.update!(url_variables: { 'def' => 'other value' })
+
+ delete api("#{hook_uri}/url_variables/abc", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it "returns a 404 error when deleting a variable from a non existent hook" do
+ delete api(hook_uri(non_existing_record_id) + "/url_variables/abc", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/notes_shared_examples.rb b/spec/support/shared_examples/requests/api/notes_shared_examples.rb
index e7e30665b08..a59235486ec 100644
--- a/spec/support/shared_examples/requests/api/notes_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/notes_shared_examples.rb
@@ -275,7 +275,9 @@ RSpec.shared_examples 'noteable API' do |parent_type, noteable_type, id_name|
context 'when request exceeds the rate limit', :freeze_time, :clean_gitlab_redis_rate_limiting do
before do
stub_application_setting(notes_create_limit: 1)
- allow(::Gitlab::ApplicationRateLimiter).to receive(:increment).and_return(2)
+ allow_next_instance_of(Gitlab::ApplicationRateLimiter::BaseStrategy) do |strategy|
+ allow(strategy).to receive(:increment).and_return(2)
+ end
end
it 'prevents user from creating more notes' do
diff --git a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb
index 795545e4ad1..1a248bb04e7 100644
--- a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-RSpec.shared_examples 'PyPI package creation' do |user_type, status, add_member = true|
+RSpec.shared_examples 'PyPI package creation' do |user_type, status, add_member = true, md5_digest = true|
RSpec.shared_examples 'creating pypi package files' do
it 'creates package files' do
expect { subject }
@@ -14,6 +14,17 @@ RSpec.shared_examples 'PyPI package creation' do |user_type, status, add_member
expect(package.name).to eq params[:name]
expect(package.version).to eq params[:version]
expect(package.pypi_metadatum.required_python).to eq params[:requires_python]
+
+ if md5_digest
+ expect(package.package_files.first.file_md5).not_to be_nil
+ else
+ expect(package.package_files.first.file_md5).to be_nil
+ end
+ end
+
+ context 'with FIPS mode', :fips_mode do
+ it_behaves_like 'returning response status', :unprocessable_entity if md5_digest
+ it_behaves_like 'returning response status', status unless md5_digest
end
end
diff --git a/spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb b/spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb
index 70cc9b1e6b5..544a0ed8fdd 100644
--- a/spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb
@@ -52,6 +52,24 @@ RSpec.shared_examples 'an unimplemented route' do
it_behaves_like 'when package feature is disabled'
end
+RSpec.shared_examples 'redirects to version download' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ group.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it_behaves_like 'returning response status', status
+
+ it 'returns a valid response' do
+ subject
+
+ expect(request.url).to include 'module-1/system/download'
+ expect(response.headers).to include 'Location'
+ expect(response.headers['Location']).to include 'module-1/system/1.0.1/download'
+ end
+ end
+end
+
RSpec.shared_examples 'grants terraform module download' do |user_type, status, add_member = true|
context "for user type #{user_type}" do
before do
@@ -84,6 +102,22 @@ RSpec.shared_examples 'returns terraform module packages' do |user_type, status,
end
end
+RSpec.shared_examples 'returns terraform module version' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ group.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it_behaves_like 'returning response status', status
+
+ it 'returning a valid response' do
+ subject
+
+ expect(json_response).to match_schema('public_api/v4/packages/terraform/modules/v1/single_version')
+ end
+ end
+end
+
RSpec.shared_examples 'returns no terraform module packages' do |user_type, status, add_member = true|
context "for user type #{user_type}" do
before do
diff --git a/spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb b/spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb
index 86e7da5bcbe..f8e096297d3 100644
--- a/spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb
+++ b/spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb
@@ -56,7 +56,7 @@ RSpec.shared_examples 'processes recovery alert' do
context 'seen for the first time' do
let(:alert) { AlertManagement::Alert.last }
- include_examples 'processes never-before-seen recovery alert'
+ it_behaves_like 'alerts service responds with an error and takes no actions', :bad_request
end
context 'for an existing alert with the same fingerprint' do
@@ -107,7 +107,7 @@ RSpec.shared_examples 'processes recovery alert' do
context 'which is resolved' do
let_it_be(:alert) { create(:alert_management_alert, :resolved, project: project, fingerprint: gitlab_fingerprint, monitoring_tool: source) }
- include_examples 'processes never-before-seen recovery alert'
+ it_behaves_like 'alerts service responds with an error and takes no actions', :bad_request
end
end
end
diff --git a/spec/support/shared_examples/services/alert_management/alert_processing/incident_resolution_shared_examples.rb b/spec/support/shared_examples/services/alert_management/alert_processing/incident_resolution_shared_examples.rb
index 132f1e0422e..3add5485fca 100644
--- a/spec/support/shared_examples/services/alert_management/alert_processing/incident_resolution_shared_examples.rb
+++ b/spec/support/shared_examples/services/alert_management/alert_processing/incident_resolution_shared_examples.rb
@@ -6,18 +6,24 @@
# - `alert`, alert for which related incidents should be closed
# - `project`, project of the alert
RSpec.shared_examples 'closes related incident if enabled' do
- context 'with issue' do
+ context 'with incident' do
before do
- alert.update!(issue: create(:issue, project: project))
+ alert.update!(issue: create(:incident, project: project))
end
- it { expect { subject }.to change { alert.issue.reload.closed? }.from(false).to(true) }
- it { expect { subject }.to change(ResourceStateEvent, :count).by(1) }
+ specify do
+ expect { Sidekiq::Testing.inline! { subject } }
+ .to change { alert.issue.reload.closed? }.from(false).to(true)
+ .and change(ResourceStateEvent, :count).by(1)
+ end
end
- context 'without issue' do
- it { expect { subject }.not_to change { alert.reload.issue } }
- it { expect { subject }.not_to change(ResourceStateEvent, :count) }
+ context 'without incident' do
+ specify do
+ expect(::IncidentManagement::CloseIncidentWorker).not_to receive(:perform_async)
+
+ subject
+ end
end
context 'with incident setting disabled' do
@@ -28,17 +34,23 @@ RSpec.shared_examples 'closes related incident if enabled' do
end
RSpec.shared_examples 'does not close related incident' do
- context 'with issue' do
+ context 'with incident' do
before do
- alert.update!(issue: create(:issue, project: project))
+ alert.update!(issue: create(:incident, project: project))
end
- it { expect { subject }.not_to change { alert.issue.reload.state } }
- it { expect { subject }.not_to change(ResourceStateEvent, :count) }
+ specify do
+ expect { Sidekiq::Testing.inline! { subject } }
+ .to not_change { alert.issue.reload.state }
+ .and not_change(ResourceStateEvent, :count)
+ end
end
- context 'without issue' do
- it { expect { subject }.not_to change { alert.reload.issue } }
- it { expect { subject }.not_to change(ResourceStateEvent, :count) }
+ context 'without incident' do
+ specify do
+ expect(::IncidentManagement::CloseIncidentWorker).not_to receive(:perform_async)
+
+ subject
+ end
end
end
diff --git a/spec/support/shared_examples/services/alert_management_shared_examples.rb b/spec/support/shared_examples/services/alert_management_shared_examples.rb
index f644f1a1687..571cb7dc03d 100644
--- a/spec/support/shared_examples/services/alert_management_shared_examples.rb
+++ b/spec/support/shared_examples/services/alert_management_shared_examples.rb
@@ -68,14 +68,14 @@ RSpec.shared_examples 'processes one firing and one resolved prometheus alerts'
expect(Gitlab::AppLogger).not_to receive(:warn)
expect { subject }
- .to change(AlertManagement::Alert, :count).by(2)
- .and change(Note, :count).by(4)
+ .to change(AlertManagement::Alert, :count).by(1)
+ .and change(Note, :count).by(1)
expect(subject).to be_success
expect(subject.payload[:alerts]).to all(be_a_kind_of(AlertManagement::Alert))
- expect(subject.payload[:alerts].size).to eq(2)
+ expect(subject.payload[:alerts].size).to eq(1)
end
it_behaves_like 'processes incident issues'
- it_behaves_like 'sends alert notification emails', count: 2
+ it_behaves_like 'sends alert notification emails'
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 f18869fb380..3be59af6a37 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
@@ -1,10 +1,11 @@
# frozen_string_literal: true
RSpec.shared_context 'container registry auth service context' do
+ let_it_be(:rsa_key) { OpenSSL::PKey::RSA.generate(3072) }
+
let(:current_project) { nil }
let(:current_user) { nil }
let(:current_params) { {} }
- let(:rsa_key) { OpenSSL::PKey::RSA.generate(512) }
let(:payload) { JWT.decode(subject[:token], rsa_key, true, { algorithm: 'RS256' }).first }
let(:authentication_abilities) do
diff --git a/spec/support/shared_examples/services/feature_flags/client_shared_examples.rb b/spec/support/shared_examples/services/feature_flags/client_shared_examples.rb
new file mode 100644
index 00000000000..a62cffc0e1b
--- /dev/null
+++ b/spec/support/shared_examples/services/feature_flags/client_shared_examples.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+shared_examples_for 'update feature flag client' do
+ let!(:client) { create(:operations_feature_flags_client, project: project) }
+
+ it 'updates last feature flag updated at' do
+ freeze_time do
+ expect { subject }.to change { client.reload.last_feature_flag_updated_at }.from(nil).to(Time.current)
+ end
+ end
+end
+
+shared_examples_for 'does not update feature flag client' do
+ let!(:client) { create(:operations_feature_flags_client, project: project) }
+
+ it 'does not update last feature flag updated at' do
+ expect { subject }.not_to change { client.reload.last_feature_flag_updated_at }
+ end
+end
diff --git a/spec/support/shared_examples/usage_data_counters/work_item_activity_unique_counter_shared_examples.rb b/spec/support/shared_examples/usage_data_counters/work_item_activity_unique_counter_shared_examples.rb
new file mode 100644
index 00000000000..4655585a092
--- /dev/null
+++ b/spec/support/shared_examples/usage_data_counters/work_item_activity_unique_counter_shared_examples.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'counter that does not track the event' do
+ it 'does not track the event' do
+ expect { 3.times { track_event } }.to not_change {
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(
+ event_names: event_name,
+ start_date: 2.weeks.ago,
+ end_date: 2.weeks.from_now
+ )
+ }
+ end
+end
+
+RSpec.shared_examples 'work item unique counter' do
+ context 'when track_work_items_activity FF is enabled' do
+ it 'tracks a unique event only once' do
+ expect { 3.times { track_event } }.to change {
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(
+ event_names: event_name,
+ start_date: 2.weeks.ago,
+ end_date: 2.weeks.from_now
+ )
+ }.by(1)
+ end
+
+ context 'when author is nil' do
+ let(:user) { nil }
+
+ it_behaves_like 'counter that does not track the event'
+ end
+ end
+
+ context 'when track_work_items_activity FF is disabled' do
+ before do
+ stub_feature_flags(track_work_items_activity: false)
+ end
+
+ it_behaves_like 'counter that does not track the event'
+ end
+end
diff --git a/spec/support/shared_examples/views/themed_layout_examples.rb b/spec/support/shared_examples/views/themed_layout_examples.rb
new file mode 100644
index 00000000000..b6c53dce4cb
--- /dev/null
+++ b/spec/support/shared_examples/views/themed_layout_examples.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples "a layout which reflects the application theme setting", :themed_layout do
+ context 'as a themed layout' do
+ let(:default_theme_class) { ::Gitlab::Themes.default.css_class }
+
+ context 'when no theme is explicitly selected' do
+ it 'renders with the default theme' do
+ render
+
+ expect(rendered).to have_selector("body.#{default_theme_class}")
+ end
+ end
+
+ context 'when user is authenticated & has selected a specific theme' do
+ before do
+ allow(view).to receive(:user_application_theme).and_return(chosen_theme.css_class)
+ end
+
+ where(chosen_theme: ::Gitlab::Themes.available_themes)
+
+ with_them do
+ it "renders with the #{params[:chosen_theme].name} theme" do
+ render
+
+ if chosen_theme.css_class != default_theme_class
+ expect(rendered).not_to have_selector("body.#{default_theme_class}")
+ end
+
+ expect(rendered).to have_selector("body.#{chosen_theme.css_class}")
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/work_items/widgetable_service_shared_examples.rb b/spec/support/shared_examples/work_items/widgetable_service_shared_examples.rb
new file mode 100644
index 00000000000..491662d17d3
--- /dev/null
+++ b/spec/support/shared_examples/work_items/widgetable_service_shared_examples.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples_for 'work item widgetable service' do
+ it 'executes callbacks for expected widgets' do
+ supported_widgets.each do |widget|
+ expect_next_instance_of(widget[:klass]) do |widget_instance|
+ expect(widget_instance).to receive(widget[:callback]).with(params: widget[:params])
+ end
+ end
+
+ service_execute
+ end
+end
diff --git a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
index 54962eac100..1da21633504 100644
--- a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
+++ b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
@@ -229,6 +229,7 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
describe 'executing an entire migration', :freeze_time, if: Gitlab::Database.has_config?(tracking_database) do
include Gitlab::Database::DynamicModelHelpers
+ include Database::DatabaseHelpers
let(:migration_class) do
Class.new(Gitlab::BackgroundMigration::BatchedMigrationJob) do
@@ -347,5 +348,20 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
it 'does not update non-matching records in the range' do
expect { full_migration_run }.not_to change { example_data.where('status <> 1 AND some_column <> 0').count }
end
+
+ context 'health status' do
+ subject(:migration_run) { described_class.new.perform }
+
+ it 'puts migration on hold when there is autovaccum activity on related tables' do
+ swapout_view_for_table(:postgres_autovacuum_activity, connection: connection)
+ create(
+ :postgres_autovacuum_activity,
+ table: migration.table_name,
+ table_identifier: "public.#{migration.table_name}"
+ )
+
+ expect { migration_run }.to change { migration.reload.on_hold? }.from(false).to(true)
+ end
+ end
end
end
diff --git a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
index 77c4a3431e2..503e331ea2e 100644
--- a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
+++ b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
@@ -1,10 +1,6 @@
# frozen_string_literal: true
-require 'fileutils'
-
RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
- include GitHelpers
-
let!(:lease_uuid) { SecureRandom.uuid }
let!(:lease_key) { "resource_housekeeping:#{resource.id}" }
let(:params) { [resource.id, task, lease_key, lease_uuid] }
@@ -246,39 +242,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
subject.perform(resource.id, 'prune', lease_key, lease_uuid)
end
-
- # Create a new commit on a random new branch
- def create_objects(resource)
- rugged = rugged_repo(resource.repository)
- old_commit = rugged.branches.first.target
- new_commit_sha = Rugged::Commit.create(
- rugged,
- message: "hello world #{SecureRandom.hex(6)}",
- author: { email: 'foo@bar', name: 'baz' },
- committer: { email: 'foo@bar', name: 'baz' },
- tree: old_commit.tree,
- parents: [old_commit]
- )
- rugged.references.create("refs/heads/#{SecureRandom.hex(6)}", new_commit_sha)
- end
-
- def packs(resource)
- Dir["#{path_to_repo}/objects/pack/*.pack"]
- end
-
- def packed_refs(resource)
- path = File.join(path_to_repo, 'packed-refs')
- FileUtils.touch(path)
- File.read(path)
- end
-
- def path_to_repo
- @path_to_repo ||= File.join(TestEnv.repos_path, resource.repository.relative_path)
- end
-
- def bitmap_path(pack)
- pack.sub(/\.pack\z/, '.bitmap')
- end
end
context 'with bitmaps enabled' do
diff --git a/spec/support/snowplow.rb b/spec/support/snowplow.rb
deleted file mode 100644
index e58be667b37..00000000000
--- a/spec/support/snowplow.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require_relative 'stub_snowplow'
-
-RSpec.configure do |config|
- config.include SnowplowHelpers, :snowplow
- config.include StubSnowplow, :snowplow
-
- config.before(:each, :snowplow) do
- stub_snowplow
- end
-
- config.after(:each, :snowplow) do
- Gitlab::Tracking.send(:snowplow).send(:tracker).flush
- end
-end
diff --git a/spec/support/stub_snowplow.rb b/spec/support/stub_snowplow.rb
deleted file mode 100644
index c6e3b40972f..00000000000
--- a/spec/support/stub_snowplow.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module StubSnowplow
- def stub_snowplow
- # Using a high buffer size to not cause early flushes
- buffer_size = 100
- # WebMock is set up to allow requests to `localhost`
- host = 'localhost'
-
- # rubocop:disable RSpec/AnyInstanceOf
- allow_any_instance_of(Gitlab::Tracking::Destinations::Snowplow)
- .to receive(:emitter)
- .and_return(SnowplowTracker::Emitter.new(host, buffer_size: buffer_size))
- # rubocop:enable RSpec/AnyInstanceOf
-
- stub_application_setting(snowplow_enabled: true)
-
- allow(SnowplowTracker::SelfDescribingJson).to receive(:new).and_call_original
- allow(Gitlab::Tracking).to receive(:event).and_call_original # rubocop:disable RSpec/ExpectGitlabTracking
- end
-end
diff --git a/spec/support_specs/graphql/arguments_spec.rb b/spec/support_specs/graphql/arguments_spec.rb
index ffb58503a0e..925af1ab79c 100644
--- a/spec/support_specs/graphql/arguments_spec.rb
+++ b/spec/support_specs/graphql/arguments_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe Graphql::Arguments do
float: 2.7,
string: %q[he said "no"],
enum: :OFF,
- null: nil, # we expect this to be omitted - absence is the same as explicit nullness
+ null: nil,
bool_true: true,
bool_false: false,
var: ::Graphql::Var.new('x', 'Int')
@@ -64,6 +64,7 @@ RSpec.describe Graphql::Arguments do
'int: 42, float: 2.7',
%q(string: "he said \\"no\\""),
'enum: OFF',
+ 'null: null',
'boolTrue: true, boolFalse: false',
'var: $x'
].join(', '))
diff --git a/spec/support_specs/helpers/graphql_helpers_spec.rb b/spec/support_specs/helpers/graphql_helpers_spec.rb
index f567097af6f..c02e4adf983 100644
--- a/spec/support_specs/helpers/graphql_helpers_spec.rb
+++ b/spec/support_specs/helpers/graphql_helpers_spec.rb
@@ -305,6 +305,7 @@ RSpec.describe GraphqlHelpers do
aFloat: 0.1,
aString: "wibble",
anEnum: LOW,
+ null: null,
aBool: false,
aVar: #{x.to_graphql_value}
EXP
diff --git a/spec/tasks/dev_rake_spec.rb b/spec/tasks/dev_rake_spec.rb
index fa093db414f..14a5ccfa323 100644
--- a/spec/tasks/dev_rake_spec.rb
+++ b/spec/tasks/dev_rake_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'dev rake tasks' do
subject(:setup_task) { run_rake_task('dev:setup') }
- let(:connections) { Gitlab::Database.database_base_models.values.map(&:connection) }
+ let(:connections) { Gitlab::Database.database_base_models_with_gitlab_shared.values.map(&:connection) }
it 'sets up the development environment', :aggregate_failures do
expect(Rake::Task['gitlab:setup']).to receive(:invoke)
@@ -50,8 +50,12 @@ RSpec.describe 'dev rake tasks' do
end
describe 'terminate_all_connections' do
+ before do
+ allow(ActiveRecord::Base).to receive(:clear_all_connections!)
+ end
+
let(:connections) do
- Gitlab::Database.database_base_models.values.filter_map do |model|
+ Gitlab::Database.database_base_models_with_gitlab_shared.values.filter_map do |model|
model.connection if Gitlab::Database.db_config_share_with(model.connection_db_config).nil?
end
end
@@ -75,6 +79,8 @@ RSpec.describe 'dev rake tasks' do
it 'terminates all connections' do
expect_connections_to_be_terminated
+ expect(ActiveRecord::Base).to receive(:clear_all_connections!)
+
terminate_task
end
@@ -82,6 +88,7 @@ RSpec.describe 'dev rake tasks' do
it 'does not terminate connections' do
expect(Rails.env).to receive(:production?).and_return(true)
expect_connections_not_to_be_terminated
+ expect(ActiveRecord::Base).not_to receive(:clear_all_connections!)
terminate_task
end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index 4a3b81a072f..9e914f8202e 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -348,14 +348,16 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
project_a = create(:project, :repository)
project_snippet_a = create(:project_snippet, :repository, project: project_a, author: project_a.first_owner)
project_b = create(:project, :repository, repository_storage: second_storage_name)
- project_snippet_b = create(:project_snippet, :repository, project: project_b, author: project_b.first_owner)
- project_snippet_b.snippet_repository.update!(shard: project_b.project_repository.shard)
+ project_snippet_b = create(
+ :project_snippet,
+ :repository,
+ project: project_b,
+ author: project_b.first_owner,
+ repository_storage: second_storage_name
+ )
create(:wiki_page, container: project_a)
create(:design, :with_file, issue: create(:issue, project: project_a))
- move_repository_to_secondary(project_b)
- move_repository_to_secondary(project_snippet_b)
-
expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout_from_any_process
tar_contents, exit_status = Gitlab::Popen.popen(
@@ -400,14 +402,16 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
project_a = create(:project, :repository)
project_snippet_a = create(:project_snippet, :repository, project: project_a, author: project_a.first_owner)
project_b = create(:project, :repository, repository_storage: second_storage_name)
- project_snippet_b = create(:project_snippet, :repository, project: project_b, author: project_b.first_owner)
- project_snippet_b.snippet_repository.update!(shard: project_b.project_repository.shard)
+ project_snippet_b = create(
+ :project_snippet,
+ :repository,
+ project: project_b,
+ author: project_b.first_owner,
+ repository_storage: second_storage_name
+ )
create(:wiki_page, container: project_a)
create(:design, :with_file, issue: create(:issue, project: project_a))
- move_repository_to_secondary(project_b)
- move_repository_to_secondary(project_snippet_b)
-
expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout_from_any_process
tar_contents, exit_status = Gitlab::Popen.popen(
@@ -435,21 +439,6 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
end
end
end
-
- def move_repository_to_secondary(record)
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- default_shard_legacy_path = Gitlab.config.repositories.storages.default.legacy_disk_path
- secondary_legacy_path = Gitlab.config.repositories.storages[second_storage_name].legacy_disk_path
- dst_dir = File.join(secondary_legacy_path, File.dirname(record.disk_path))
-
- FileUtils.mkdir_p(dst_dir) unless Dir.exist?(dst_dir)
-
- FileUtils.mv(
- File.join(default_shard_legacy_path, record.disk_path + '.git'),
- File.join(secondary_legacy_path, record.disk_path + '.git')
- )
- end
- end
end
context 'concurrency settings' do
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index d8199c09ca1..74bec406947 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
before do
skip_unless_ci_uses_database_tasks
- allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(base_models)
end
it 'marks the migration complete on each database' do
@@ -90,7 +90,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
let(:base_models) { { 'main' => main_model } }
before do
- allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(base_models)
end
it 'prints a warning message' do
@@ -110,7 +110,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
let(:base_models) { { 'main' => main_model } }
before do
- allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(base_models)
end
it 'prints an error and exits' do
@@ -136,6 +136,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
context 'when geo is not configured' do
before do
allow(ActiveRecord::Base).to receive_message_chain('configurations.configs_for').and_return([main_config])
+ allow(Gitlab::Database).to receive(:has_config?).with(:geo).and_return(false)
end
context 'when the schema is already loaded' do
@@ -260,7 +261,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
before do
skip_unless_ci_uses_database_tasks
- allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(base_models)
end
context 'when geo is not configured' do
@@ -444,7 +445,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
before do
skip_unless_ci_uses_database_tasks
- allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(base_models)
allow(main_model.connection).to receive(:table_exists?).with('schema_migrations').and_return(true)
allow(ci_model.connection).to receive(:table_exists?).with('schema_migrations').and_return(true)
@@ -574,7 +575,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
before do
skip_if_multiple_databases_not_setup
- allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(base_models)
end
it 'delegates to Gitlab::Database::Reindexing without a specific database' do
diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb
index f48ca5b8f8c..2f52c0fd36c 100644
--- a/spec/tooling/danger/project_helper_spec.rb
+++ b/spec/tooling/danger/project_helper_spec.rb
@@ -229,7 +229,6 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'app/serializers/jira_connect/app_data_serializer.rb' | [:integrations_be, :backend]
'lib/api/github/entities.rb' | [:integrations_be, :backend]
'lib/api/v3/github.rb' | [:integrations_be, :backend]
- 'app/models/clusters/integrations/elastic_stack.rb' | [:backend]
'app/controllers/clusters/integrations_controller.rb' | [:backend]
'app/services/clusters/integrations/prometheus_health_check_service.rb' | [:backend]
'app/graphql/types/alert_management/integration_type.rb' | [:backend]
@@ -271,6 +270,8 @@ RSpec.describe Tooling::Danger::ProjectHelper do
[:integrations_be, :backend] | '+ Integrations::Foo' | ['app/foo/bar.rb']
[:integrations_be, :backend] | '+ project.execute_hooks(foo, :bar)' | ['ee/lib/ee/foo.rb']
[:integrations_be, :backend] | '+ project.execute_integrations(foo, :bar)' | ['app/foo.rb']
+ [:frontend, :product_intelligence] | '+ api.trackRedisCounterEvent("foo")' | ['app/assets/javascripts/telemetry.js', 'ee/app/assets/javascripts/mr_widget.vue']
+ [:frontend, :product_intelligence] | '+ api.trackRedisHllUserEvent("bar")' | ['app/assets/javascripts/telemetry.js', 'ee/app/assets/javascripts/mr_widget.vue']
end
with_them do
diff --git a/spec/views/admin/application_settings/general.html.haml_spec.rb b/spec/views/admin/application_settings/general.html.haml_spec.rb
index 3614090d3cb..c7d156cde39 100644
--- a/spec/views/admin/application_settings/general.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/general.html.haml_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'admin/application_settings/general.html.haml' do
- let(:app_settings) { build(:application_setting) }
+ let(:app_settings) { Gitlab::CurrentSettings.current_application_settings }
let(:user) { create(:admin) }
before do
@@ -97,4 +97,33 @@ RSpec.describe 'admin/application_settings/general.html.haml' do
expect(rendered).to match ' data-minimum-password-length='
end
end
+
+ describe 'error tracking integration' do
+ context 'with error tracking feature flag enabled' do
+ before do
+ stub_feature_flags(gitlab_error_tracking: true)
+
+ render
+ end
+
+ it 'expects error tracking settings to be available' do
+ expect(rendered).to have_field('application_setting_error_tracking_api_url')
+ end
+
+ it 'expects display token and reset token to be available' do
+ expect(rendered).to have_content(app_settings.error_tracking_access_token)
+ expect(rendered).to have_button('Reset error tracking access token')
+ end
+ end
+
+ context 'with error tracking feature flag disabled' do
+ it 'expects error tracking settings to not be avaiable' do
+ stub_feature_flags(gitlab_error_tracking: false)
+
+ render
+
+ expect(rendered).not_to have_field('application_setting_error_tracking_api_url')
+ end
+ end
+ end
end
diff --git a/spec/views/dashboard/projects/_blank_state_welcome.html.haml_spec.rb b/spec/views/dashboard/projects/_blank_state_welcome.html.haml_spec.rb
new file mode 100644
index 00000000000..edec46ad0a3
--- /dev/null
+++ b/spec/views/dashboard/projects/_blank_state_welcome.html.haml_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'dashboard/projects/_blank_state_welcome.html.haml' do
+ let_it_be(:user) { create(:user) }
+
+ before do
+ allow(view).to receive(:current_user).and_return(user)
+ end
+
+ it 'has a doc_url' do
+ render
+
+ expect(rendered).to have_link(href: Gitlab::Saas.doc_url)
+ 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 e8232a2c067..b3cd1493149 100644
--- a/spec/views/devise/sessions/new.html.haml_spec.rb
+++ b/spec/views/devise/sessions/new.html.haml_spec.rb
@@ -63,6 +63,36 @@ RSpec.describe 'devise/sessions/new' do
end
end
+ describe 'Google Tag Manager' do
+ let!(:gtm_id) { 'GTM-WWKMTWS'}
+
+ subject { rendered }
+
+ before do
+ stub_devise
+ disable_captcha
+ stub_config(extra: { google_tag_manager_id: gtm_id, google_tag_manager_nonce_id: gtm_id })
+ end
+
+ describe 'when Google Tag Manager is enabled' do
+ before do
+ enable_gtm
+ render
+ end
+
+ it { is_expected.to match /www.googletagmanager.com/ }
+ end
+
+ describe 'when Google Tag Manager is disabled' do
+ before do
+ disable_gtm
+ render
+ end
+
+ it { is_expected.not_to match /www.googletagmanager.com/ }
+ end
+ end
+
def disable_other_signin_methods
allow(view).to receive(:password_authentication_enabled_for_web?).and_return(false)
allow(view).to receive(:omniauth_enabled?).and_return(false)
@@ -94,4 +124,12 @@ RSpec.describe 'devise/sessions/new' do
allow(view).to receive(:captcha_enabled?).and_return(false)
allow(view).to receive(:captcha_on_login_required?).and_return(false)
end
+
+ def disable_gtm
+ allow(view).to receive(:google_tag_manager_enabled?).and_return(false)
+ end
+
+ def enable_gtm
+ allow(view).to receive(:google_tag_manager_enabled?).and_return(true)
+ end
end
diff --git a/spec/views/errors/omniauth_error.html.haml_spec.rb b/spec/views/errors/omniauth_error.html.haml_spec.rb
new file mode 100644
index 00000000000..e99cb536bd8
--- /dev/null
+++ b/spec/views/errors/omniauth_error.html.haml_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'errors/omniauth_error' do
+ let(:provider) { FFaker::Product.brand }
+ let(:error) { FFaker::Lorem.sentence }
+
+ before do
+ assign(:provider, provider)
+ assign(:error, error)
+ end
+
+ it 'renders template' do
+ render
+
+ expect(rendered).to have_content(provider)
+ expect(rendered).to have_content(_('Sign-in failed because %{error}.') % { error: error })
+ expect(rendered).to have_link('Sign in')
+ expect(rendered).to have_content(_('If none of the options work, try contacting a GitLab administrator.'))
+ end
+end
diff --git a/spec/views/groups/edit.html.haml_spec.rb b/spec/views/groups/edit.html.haml_spec.rb
index eaa909a5da0..ddcfea0ab10 100644
--- a/spec/views/groups/edit.html.haml_spec.rb
+++ b/spec/views/groups/edit.html.haml_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'groups/edit.html.haml' do
render
- expect(rendered).to have_content("Prevent sharing a project within #{test_group.name} with other groups")
+ expect(rendered).to have_content("Projects in #{test_group.name} cannot be shared with other groups")
expect(rendered).to have_content('help text here')
expect(rendered).to have_field('group_share_with_group_lock', **checkbox_options)
end
diff --git a/spec/views/groups/group_members/index.html.haml_spec.rb b/spec/views/groups/group_members/index.html.haml_spec.rb
index 40d4c9d33c9..2d7d50555d6 100644
--- a/spec/views/groups/group_members/index.html.haml_spec.rb
+++ b/spec/views/groups/group_members/index.html.haml_spec.rb
@@ -37,4 +37,16 @@ RSpec.describe 'groups/group_members/index', :aggregate_failures do
expect(rendered).not_to have_content('You can invite a new member')
end
end
+
+ context 'when @banned is nil' do
+ before do
+ assign(:banned, nil)
+ end
+
+ it 'calls group_members_app_data with { banned: [] }' do
+ expect(view).to receive(:group_members_app_data).with(group, a_hash_including(banned: []))
+
+ render
+ end
+ end
end
diff --git a/spec/views/layouts/_flash.html.haml_spec.rb b/spec/views/layouts/_flash.html.haml_spec.rb
index 82c06feb4fb..a4bed09368f 100644
--- a/spec/views/layouts/_flash.html.haml_spec.rb
+++ b/spec/views/layouts/_flash.html.haml_spec.rb
@@ -9,7 +9,11 @@ RSpec.describe 'layouts/_flash' do
end
describe 'closable flash messages' do
- %w(alert notice success).each do |flash_type|
+ where(:flash_type) do
+ %w[alert notice success]
+ end
+
+ with_them do
let(:flash) { { flash_type => 'This is a closable flash message' } }
it 'shows a close button' do
@@ -19,10 +23,14 @@ RSpec.describe 'layouts/_flash' do
end
describe 'non closable flash messages' do
- %w(error message toast warning).each do |flash_type|
+ where(:flash_type) do
+ %w[error message toast warning]
+ end
+
+ with_them do
let(:flash) { { flash_type => 'This is a non closable flash message' } }
- it 'shows a close button' do
+ it 'does not show a close button' do
expect(rendered).not_to include('js-close-icon')
end
end
diff --git a/spec/views/layouts/application.html.haml_spec.rb b/spec/views/layouts/application.html.haml_spec.rb
index 0f359219718..30c27078ad8 100644
--- a/spec/views/layouts/application.html.haml_spec.rb
+++ b/spec/views/layouts/application.html.haml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'layouts/application' do
+RSpec.describe 'layouts/application', :themed_layout do
let(:user) { create(:user) }
before do
diff --git a/spec/views/layouts/devise.html.haml_spec.rb b/spec/views/layouts/devise.html.haml_spec.rb
new file mode 100644
index 00000000000..e69cf93cfb4
--- /dev/null
+++ b/spec/views/layouts/devise.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'layouts/devise' do
+ it_behaves_like 'a layout which reflects the application theme setting'
+end
diff --git a/spec/views/layouts/devise_empty.html.haml_spec.rb b/spec/views/layouts/devise_empty.html.haml_spec.rb
new file mode 100644
index 00000000000..06d742e74dd
--- /dev/null
+++ b/spec/views/layouts/devise_empty.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'layouts/devise_empty' do
+ it_behaves_like 'a layout which reflects the application theme setting'
+end
diff --git a/spec/views/layouts/fullscreen.html.haml_spec.rb b/spec/views/layouts/fullscreen.html.haml_spec.rb
new file mode 100644
index 00000000000..0ae2c76ebcb
--- /dev/null
+++ b/spec/views/layouts/fullscreen.html.haml_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'layouts/fullscreen' do
+ let_it_be(:user) { create(:user) }
+
+ before do
+ allow(view).to receive(:current_user_mode).and_return(Gitlab::Auth::CurrentUserMode.new(user))
+ end
+
+ it_behaves_like 'a layout which reflects the application theme setting'
+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 3943355bffd..9ae3f814679 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -419,50 +419,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- describe 'Logs' do
- it 'has a link to the pod logs page' do
- render
-
- expect(rendered).to have_link('Logs', href: project_logs_path(project))
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the pod logs page' do
- render
-
- expect(rendered).not_to have_link('Logs')
- end
- end
- end
-
- describe 'Tracing' do
- it 'has a link to the tracing page' do
- render
-
- expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
- end
-
- context 'without project.tracing_external_url' do
- it 'has a link to the tracing page' do
- render
-
- expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
- end
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the tracing page' do
- render
-
- expect(rendered).not_to have_text 'Tracing'
- end
- end
- end
-
describe 'Error Tracking' do
it 'has a link to the error tracking page' do
render
@@ -576,7 +532,7 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
describe 'Google Cloud' do
it 'has a link to the google cloud page' do
render
- expect(rendered).to have_link('Google Cloud', href: project_google_cloud_index_path(project))
+ expect(rendered).to have_link('Google Cloud', href: project_google_cloud_configuration_path(project))
end
describe 'when the user does not have access' do
@@ -953,8 +909,11 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
describe 'Packages & Registries' do
+ let(:packages_enabled) { false }
+
before do
stub_container_registry_config(enabled: registry_enabled)
+ stub_config(packages: { enabled: packages_enabled })
end
context 'when registry is enabled' do
@@ -976,6 +935,17 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(rendered).not_to have_link('Packages & Registries', href: project_settings_packages_and_registries_path(project))
end
end
+
+ context 'when packages config is enabled' do
+ let(:registry_enabled) { false }
+ let(:packages_enabled) { true }
+
+ it 'has a link to the Packages & Registries settings' do
+ render
+
+ expect(rendered).to have_link('Packages & Registries', href: project_settings_packages_and_registries_path(project))
+ end
+ end
end
describe 'Usage Quotas' do
diff --git a/spec/views/layouts/signup_onboarding.html.haml_spec.rb b/spec/views/layouts/signup_onboarding.html.haml_spec.rb
new file mode 100644
index 00000000000..8748c673616
--- /dev/null
+++ b/spec/views/layouts/signup_onboarding.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'layouts/signup_onboarding' do
+ it_behaves_like 'a layout which reflects the application theme setting'
+end
diff --git a/spec/views/layouts/simple_registration.html.haml_spec.rb b/spec/views/layouts/simple_registration.html.haml_spec.rb
new file mode 100644
index 00000000000..98553a12ad8
--- /dev/null
+++ b/spec/views/layouts/simple_registration.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'layouts/simple_registration' do
+ it_behaves_like 'a layout which reflects the application theme setting'
+end
diff --git a/spec/views/layouts/terms.html.haml_spec.rb b/spec/views/layouts/terms.html.haml_spec.rb
new file mode 100644
index 00000000000..520882449c5
--- /dev/null
+++ b/spec/views/layouts/terms.html.haml_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'layouts/terms' do
+ let_it_be(:user) { create(:user) }
+
+ before do
+ allow(view).to receive(:current_user_mode).and_return(Gitlab::Auth::CurrentUserMode.new(user))
+ end
+
+ it_behaves_like 'a layout which reflects the application theme setting'
+end
diff --git a/spec/views/projects/commits/_commit.html.haml_spec.rb b/spec/views/projects/commits/_commit.html.haml_spec.rb
index da93871e0e4..2ca23d4cb2d 100644
--- a/spec/views/projects/commits/_commit.html.haml_spec.rb
+++ b/spec/views/projects/commits/_commit.html.haml_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'projects/commits/_commit.html.haml' do
- let(:template) { 'projects/commits/commit.html.haml' }
+ let(:template) { 'projects/commits/commit' }
let(:project) { create(:project, :repository) }
let(:commit) { project.repository.commit(ref) }
diff --git a/spec/views/projects/issues/_issue.html.haml_spec.rb b/spec/views/projects/issues/_issue.html.haml_spec.rb
new file mode 100644
index 00000000000..29bef557304
--- /dev/null
+++ b/spec/views/projects/issues/_issue.html.haml_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'projects/issues/_issue.html.haml' do
+ before do
+ assign(:project, issue.project)
+ assign(:issuable_meta_data, {
+ issue.id => Gitlab::IssuableMetadata::IssuableMeta.new(1, 1, 1, 1)
+ })
+
+ render partial: 'projects/issues/issue', locals: { issue: issue }
+ end
+
+ describe 'timestamp', :freeze_time do
+ context 'when issue is open' do
+ let(:issue) { create(:issue, updated_at: 1.day.ago) }
+
+ it 'shows last updated date' do
+ expect(rendered).to have_content("updated #{format_timestamp(1.day.ago)}")
+ end
+ end
+
+ context 'when issue is closed' do
+ let(:issue) { create(:issue, :closed, closed_at: 2.days.ago, updated_at: 1.day.ago) }
+
+ it 'shows closed date' do
+ expect(rendered).to have_content("closed #{format_timestamp(2.days.ago)}")
+ end
+ end
+
+ context 'when issue is closed but closed_at is empty' do
+ let(:issue) { create(:issue, :closed, closed_at: nil, updated_at: 1.day.ago) }
+
+ it 'shows last updated date' do
+ expect(rendered).to have_content("updated #{format_timestamp(1.day.ago)}")
+ end
+ end
+
+ def format_timestamp(time)
+ l(time, format: "%b %d, %Y")
+ end
+ end
+end
diff --git a/spec/views/projects/jobs/show.html.haml_spec.rb b/spec/views/projects/jobs/show.html.haml_spec.rb
index 8242d20a9e7..2ea3dc9f76a 100644
--- a/spec/views/projects/jobs/show.html.haml_spec.rb
+++ b/spec/views/projects/jobs/show.html.haml_spec.rb
@@ -27,7 +27,6 @@ RSpec.describe 'projects/jobs/show' do
it 'shows job vue app' do
expect(rendered).to have_css('#js-job-page')
- expect(rendered).not_to have_css('#js-bridge-page')
end
context 'when job is running' do
@@ -42,18 +41,4 @@ RSpec.describe 'projects/jobs/show' do
end
end
end
-
- context 'when showing a bridge job' do
- let(:bridge) { create(:ci_bridge, status: :pending) }
-
- before do
- assign(:build, bridge)
- render
- end
-
- it 'shows bridge vue app' do
- expect(rendered).to have_css('#js-bridge-page')
- expect(rendered).not_to have_css('#js-job-page')
- end
- end
end
diff --git a/spec/views/projects/project_members/index.html.haml_spec.rb b/spec/views/projects/project_members/index.html.haml_spec.rb
index 0446e1a7fc8..382d400b961 100644
--- a/spec/views/projects/project_members/index.html.haml_spec.rb
+++ b/spec/views/projects/project_members/index.html.haml_spec.rb
@@ -23,7 +23,8 @@ RSpec.describe 'projects/project_members/index', :aggregate_failures do
expect(rendered).to have_content('Project members')
expect(rendered).to have_content('You can invite a new member')
- expect(rendered).to have_selector('.js-import-a-project-modal')
+ expect(rendered).to have_selector('.js-import-project-members-trigger')
+ expect(rendered).to have_selector('.js-import-project-members-modal')
expect(rendered).to have_selector('.js-invite-group-trigger')
expect(rendered).to have_selector('.js-invite-members-trigger')
expect(rendered).not_to have_content('Members can be added by project')
@@ -51,7 +52,8 @@ RSpec.describe 'projects/project_members/index', :aggregate_failures do
expect(rendered).to have_content('Project members')
expect(rendered).not_to have_content('You can invite a new member')
- expect(rendered).not_to have_selector('.js-import-a-project-modal')
+ expect(rendered).not_to have_selector('.js-import-project-members-trigger')
+ expect(rendered).not_to have_selector('.js-import-project-members-modal')
expect(rendered).not_to have_selector('.js-invite-group-trigger')
expect(rendered).not_to have_selector('.js-invite-members-trigger')
expect(rendered).to have_content('Members can be added by project')
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 8853b34074a..664c8b7432e 100644
--- a/spec/views/projects/settings/operations/show.html.haml_spec.rb
+++ b/spec/views/projects/settings/operations/show.html.haml_spec.rb
@@ -10,10 +10,6 @@ RSpec.describe 'projects/settings/operations/show' do
create(:project_error_tracking_setting, project: project)
end
- let_it_be_with_reload(:tracing_setting) do
- create(:project_tracing_setting, project: project)
- end
-
let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
before_all do
@@ -25,8 +21,6 @@ RSpec.describe 'projects/settings/operations/show' do
allow(view).to receive(:error_tracking_setting)
.and_return(error_tracking_setting)
- allow(view).to receive(:tracing_setting)
- .and_return(tracing_setting)
allow(view).to receive(:prometheus_integration)
.and_return(prometheus_integration)
allow(view).to receive(:current_user).and_return(user)
@@ -51,14 +45,4 @@ RSpec.describe 'projects/settings/operations/show' do
end
end
end
-
- describe 'Operations > Tracing' do
- context 'Settings page ' do
- it 'renders the Tracing Settings page' do
- render
-
- expect(rendered).to have_content _('Embed an image of your existing Jaeger server in GitLab.')
- end
- end
- end
end
diff --git a/spec/views/projects/tracing/show.html.haml_spec.rb b/spec/views/projects/tracing/show.html.haml_spec.rb
deleted file mode 100644
index 96dc6a18fc7..00000000000
--- a/spec/views/projects/tracing/show.html.haml_spec.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'projects/tracings/show' do
- let_it_be_with_reload(:project) { create(:project) }
- let_it_be(:error_tracking_setting) { create(:project_error_tracking_setting, project: project) }
-
- before do
- assign(:project, project)
- allow(view).to receive(:error_tracking_setting)
- .and_return(error_tracking_setting)
- end
-
- context 'with project.tracing_external_url' do
- let_it_be(:tracing_url) { 'https://tracing.url' }
- let_it_be(:tracing_setting) { create(:project_tracing_setting, project: project, external_url: tracing_url) }
-
- before do
- allow(view).to receive(:can?).and_return(true)
- allow(view).to receive(:tracing_setting).and_return(tracing_setting)
- end
-
- it 'renders iframe' do
- render
-
- expect(rendered).to match(/iframe/)
- end
-
- context 'with malicious external_url' do
- let(:malicious_tracing_url) { "https://replaceme.com/'><script>alert(document.cookie)</script>" }
- let(:cleaned_url) { "https://replaceme.com/'&gt;" }
-
- before do
- tracing_setting.update_column(:external_url, malicious_tracing_url)
- end
-
- it 'sanitizes external_url' do
- render
-
- expect(tracing_setting.external_url).to eq(malicious_tracing_url)
- expect(rendered).to have_xpath("//iframe[@src=\"#{cleaned_url}\"]")
- end
- end
- end
-
- context 'without project.tracing_external_url' do
- before do
- allow(view).to receive(:can?).and_return(true)
- end
-
- it 'renders empty state' do
- render
-
- expect(rendered).to have_link('Add Jaeger URL')
- expect(rendered).not_to match(/iframe/)
- end
- end
-end
diff --git a/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb b/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb
index 5ac42952f78..74ad0ccb77a 100644
--- a/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb
+++ b/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe 'shared/deploy_tokens/_form.html.haml' do
RSpec.shared_examples "display deploy token settings" do |role, shows_package_registry_permissions|
before do
- subject.add_user(user, role)
+ subject.add_member(user, role)
allow(view).to receive(:current_user).and_return(user)
stub_config(packages: { enabled: packages_enabled })
end
diff --git a/spec/workers/build_finished_worker_spec.rb b/spec/workers/build_finished_worker_spec.rb
index b4b986662d2..2ff173c1558 100644
--- a/spec/workers/build_finished_worker_spec.rb
+++ b/spec/workers/build_finished_worker_spec.rb
@@ -12,7 +12,6 @@ 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
@@ -30,18 +29,6 @@ RSpec.describe BuildFinishedWorker do
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_hooks_worker_spec.rb b/spec/workers/build_hooks_worker_spec.rb
index a69e188b441..426eb03638c 100644
--- a/spec/workers/build_hooks_worker_spec.rb
+++ b/spec/workers/build_hooks_worker_spec.rb
@@ -23,6 +23,25 @@ RSpec.describe BuildHooksWorker do
end
end
+ describe '.perform_async' do
+ it 'sends a message to the application logger, before performing', :sidekiq_inline do
+ build = create(:ci_build)
+
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ message: include('Enqueuing hooks for Build'),
+ class: described_class.name,
+ build_id: build.id,
+ pipeline_id: build.pipeline_id,
+ project_id: build.project_id,
+ build_status: build.status
+ )
+
+ expect_any_instance_of(Ci::Build).to receive(:execute_hooks)
+
+ described_class.perform_async(build)
+ end
+ end
+
it_behaves_like 'worker with data consistency',
described_class,
data_consistency: :delayed
diff --git a/spec/workers/bulk_imports/pipeline_worker_spec.rb b/spec/workers/bulk_imports/pipeline_worker_spec.rb
index b5f20e9ff76..fe2039bd79e 100644
--- a/spec/workers/bulk_imports/pipeline_worker_spec.rb
+++ b/spec/workers/bulk_imports/pipeline_worker_spec.rb
@@ -189,7 +189,7 @@ RSpec.describe BulkImports::PipelineWorker do
end
end
- context 'when network error is raised' do
+ context 'when retry pipeline error is raised' do
let(:pipeline_tracker) do
create(
:bulk_import_tracker,
@@ -200,7 +200,7 @@ RSpec.describe BulkImports::PipelineWorker do
end
let(:exception) do
- BulkImports::NetworkError.new(response: instance_double(HTTParty::Response, code: 429, headers: {}))
+ BulkImports::RetryPipelineError.new('Error!', 60)
end
before do
@@ -213,54 +213,36 @@ RSpec.describe BulkImports::PipelineWorker do
end
end
- context 'when error is retriable' do
- it 'reenqueues the worker' do
- expect_any_instance_of(BulkImports::Tracker) do |tracker|
- expect(tracker).to receive(:retry).and_call_original
- end
-
- expect_next_instance_of(Gitlab::Import::Logger) do |logger|
- expect(logger)
- .to receive(:info)
- .with(
- hash_including(
- 'pipeline_name' => 'FakePipeline',
- 'entity_id' => entity.id
- )
- )
- end
+ it 'reenqueues the worker' do
+ expect_any_instance_of(BulkImports::Tracker) do |tracker|
+ expect(tracker).to receive(:retry).and_call_original
+ end
- expect(described_class)
- .to receive(:perform_in)
+ expect_next_instance_of(Gitlab::Import::Logger) do |logger|
+ expect(logger)
+ .to receive(:info)
.with(
- 60.seconds,
- pipeline_tracker.id,
- pipeline_tracker.stage,
- pipeline_tracker.entity.id
+ hash_including(
+ 'pipeline_name' => 'FakePipeline',
+ 'entity_id' => entity.id
+ )
)
-
- subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
-
- pipeline_tracker.reload
-
- expect(pipeline_tracker.enqueued?).to be_truthy
end
- context 'when error is not retriable' do
- let(:exception) do
- BulkImports::NetworkError.new(response: instance_double(HTTParty::Response, code: 503, headers: {}))
- end
-
- it 'marks tracker as failed and logs the error' do
- expect(described_class).not_to receive(:perform_in)
+ expect(described_class)
+ .to receive(:perform_in)
+ .with(
+ 60.seconds,
+ pipeline_tracker.id,
+ pipeline_tracker.stage,
+ pipeline_tracker.entity.id
+ )
- subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
+ subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
- pipeline_tracker.reload
+ pipeline_tracker.reload
- expect(pipeline_tracker.failed?).to eq(true)
- end
- end
+ expect(pipeline_tracker.enqueued?).to be_truthy
end
end
end
diff --git a/spec/workers/ci/archive_trace_worker_spec.rb b/spec/workers/ci/archive_trace_worker_spec.rb
index 52723ff5823..3ac769aab9e 100644
--- a/spec/workers/ci/archive_trace_worker_spec.rb
+++ b/spec/workers/ci/archive_trace_worker_spec.rb
@@ -27,23 +27,6 @@ RSpec.describe Ci::ArchiveTraceWorker do
subject
end
-
- context 'when sticky_ci_archive_trace_worker is disabled' do
- before do
- stub_feature_flags(sticky_ci_archive_trace_worker: false)
- end
-
- it 'does not preload associations' do
- allow_next_instance_of(Ci::ArchiveTraceService) do |instance|
- allow(instance).to receive(:execute) do |job|
- expect(job.association(:project)).not_to be_loaded
- expect(job.association(:pending_state)).not_to be_loaded
- end
- end
-
- subject
- end
- end
end
context 'when job is not found' do
diff --git a/spec/workers/ci/build_finished_worker_spec.rb b/spec/workers/ci/build_finished_worker_spec.rb
index e9e7a057f98..201182636e7 100644
--- a/spec/workers/ci/build_finished_worker_spec.rb
+++ b/spec/workers/ci/build_finished_worker_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe Ci::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
@@ -28,18 +27,6 @@ RSpec.describe Ci::BuildFinishedWorker do
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/ci/pipeline_artifacts/coverage_report_worker_spec.rb b/spec/workers/ci/pipeline_artifacts/coverage_report_worker_spec.rb
index 000eda055af..7b28384a5bf 100644
--- a/spec/workers/ci/pipeline_artifacts/coverage_report_worker_spec.rb
+++ b/spec/workers/ci/pipeline_artifacts/coverage_report_worker_spec.rb
@@ -2,28 +2,57 @@
require 'spec_helper'
-RSpec.describe ::Ci::PipelineArtifacts::CoverageReportWorker do
+RSpec.describe Ci::PipelineArtifacts::CoverageReportWorker do
describe '#perform' do
+ let(:pipeline_id) { pipeline.id }
+
subject { described_class.new.perform(pipeline_id) }
context 'when pipeline exists' do
- let(:pipeline) { create(:ci_pipeline) }
- let(:pipeline_id) { pipeline.id }
+ let(:pipeline) { create(:ci_pipeline, :success) }
- it 'calls pipeline report result service' do
- expect_next_instance_of(::Ci::PipelineArtifacts::CoverageReportService) do |create_artifact_service|
- expect(create_artifact_service).to receive(:execute)
+ it 'calls the pipeline coverage report service' do
+ expect_next_instance_of(::Ci::PipelineArtifacts::CoverageReportService, pipeline) do |service|
+ expect(service).to receive(:execute)
end
subject
end
end
+ context 'when the pipeline is part of a hierarchy' do
+ let_it_be(:root_ancestor_pipeline) { create(:ci_pipeline, :success) }
+ let_it_be(:pipeline) { create(:ci_pipeline, :success, child_of: root_ancestor_pipeline) }
+ let_it_be(:another_child_pipeline) { create(:ci_pipeline, :success, child_of: root_ancestor_pipeline) }
+
+ context 'when all pipelines is complete' do
+ it 'calls the pipeline coverage report service on the root ancestor pipeline' do
+ expect_next_instance_of(::Ci::PipelineArtifacts::CoverageReportService, root_ancestor_pipeline) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ subject
+ end
+ end
+
+ context 'when the pipeline hierarchy has incomplete pipeline' do
+ before do
+ another_child_pipeline.update!(status: :running)
+ end
+
+ it 'does not call pipeline coverage report service' do
+ expect(Ci::PipelineArtifacts::CoverageReportService).not_to receive(:new)
+
+ subject
+ end
+ end
+ end
+
context 'when pipeline does not exist' do
let(:pipeline_id) { non_existing_record_id }
it 'does not call pipeline create artifact service' do
- expect(Ci::PipelineArtifacts::CoverageReportService).not_to receive(:execute)
+ expect(Ci::PipelineArtifacts::CoverageReportService).not_to receive(:new)
subject
end
diff --git a/spec/workers/clusters/applications/activate_integration_worker_spec.rb b/spec/workers/clusters/applications/activate_integration_worker_spec.rb
index ecb49be5a4b..5163e4681fa 100644
--- a/spec/workers/clusters/applications/activate_integration_worker_spec.rb
+++ b/spec/workers/clusters/applications/activate_integration_worker_spec.rb
@@ -40,15 +40,6 @@ RSpec.describe Clusters::Applications::ActivateIntegrationWorker, '#perform' do
expect { described_class.new.perform(cluster.id, integration_name) }
.to change { project.reload.prometheus_integration&.active }.from(nil).to(true)
end
-
- context 'when using the old worker class' do
- let(:described_class) { Clusters::Applications::ActivateServiceWorker }
-
- 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
end
end
diff --git a/spec/workers/clusters/applications/deactivate_integration_worker_spec.rb b/spec/workers/clusters/applications/deactivate_integration_worker_spec.rb
index 3f0188eee23..62792a3b7d9 100644
--- a/spec/workers/clusters/applications/deactivate_integration_worker_spec.rb
+++ b/spec/workers/clusters/applications/deactivate_integration_worker_spec.rb
@@ -46,15 +46,6 @@ RSpec.describe Clusters::Applications::DeactivateIntegrationWorker, '#perform' d
expect { described_class.new.perform(cluster.id, integration_name) }
.to change { prometheus_integration.reload.active }.from(true).to(false)
end
-
- context 'when using the old worker class' do
- let(:described_class) { Clusters::Applications::ActivateServiceWorker }
-
- 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
end
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 3cd82b8bf4d..5a32c1b40bb 100644
--- a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
@@ -22,6 +22,7 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter, :aggregate_failures do
end
let_it_be(:project) { create(:project, :import_started) }
+ let_it_be(:project2) { create(:project, :import_canceled) }
let(:importer_class) { double(:importer_class, name: 'klass_name') }
let(:importer_instance) { double(:importer_instance) }
@@ -110,6 +111,27 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter, :aggregate_failures do
})
end
+ it 'logs info if the import state is canceled' do
+ expect(project2.import_state.status).to eq('canceled')
+
+ expect(importer_class).not_to receive(:new)
+
+ expect(importer_instance).not_to receive(:execute)
+
+ expect(Gitlab::GithubImport::Logger)
+ .to receive(:info)
+ .with(
+ {
+ github_identifiers: nil,
+ message: 'project import canceled',
+ project_id: project2.id,
+ importer: 'klass_name'
+ }
+ )
+
+ worker.import(project2, client, { 'number' => 11, 'github_id' => 2 } )
+ end
+
it 'logs error when the import fails' do
expect(importer_class)
.to receive(:new)
diff --git a/spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb b/spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb
index 1e088929f66..0ac1733781a 100644
--- a/spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::GithubImport::StageMethods do
let_it_be(:project) { create(:project, :import_started, import_url: 'https://t0ken@github.com/repo/repo.git') }
+ let_it_be(:project2) { create(:project, :import_canceled) }
let(:worker) do
Class.new do
@@ -22,6 +23,37 @@ RSpec.describe Gitlab::GithubImport::StageMethods do
worker.perform(-1)
end
+ it 'returns if the import state is canceled' do
+ allow(worker)
+ .to receive(:find_project)
+ .with(project2.id)
+ .and_return(project2)
+
+ expect(worker).not_to receive(:try_import)
+
+ expect(Gitlab::GithubImport::Logger)
+ .to receive(:info)
+ .with(
+ {
+ message: 'starting stage',
+ project_id: project2.id,
+ import_stage: 'DummyStage'
+ }
+ )
+
+ expect(Gitlab::GithubImport::Logger)
+ .to receive(:info)
+ .with(
+ {
+ message: 'project import canceled',
+ project_id: project2.id,
+ import_stage: 'DummyStage'
+ }
+ )
+
+ worker.perform(project2.id)
+ end
+
it 'imports the data when the project exists' do
allow(worker)
.to receive(:find_project)
diff --git a/spec/workers/concerns/waitable_worker_spec.rb b/spec/workers/concerns/waitable_worker_spec.rb
index 824ae8fcf83..f6d4cc4679d 100644
--- a/spec/workers/concerns/waitable_worker_spec.rb
+++ b/spec/workers/concerns/waitable_worker_spec.rb
@@ -29,40 +29,41 @@ RSpec.describe WaitableWorker do
subject(:job) { worker.new }
describe '.bulk_perform_and_wait' do
- it 'schedules the jobs and waits for them to complete' do
- worker.bulk_perform_and_wait([[1], [2]])
-
- expect(worker.counter).to eq(3)
+ context '1 job' do
+ it 'inlines the job' do
+ args_list = [[1]]
+ 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'))
+ .once)
+
+ worker.bulk_perform_and_wait(args_list)
+
+ expect(worker.counter).to eq(1)
+ end
end
- 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)
+ context 'between 2 and 3 jobs' do
+ it 'runs the jobs asynchronously' do
+ arguments = [[1], [2], [3]]
- expect(worker.counter).to eq(6)
- end
-
- it 'runs > 3 jobs using sidekiq and a waiter key' do
- expect(worker).to receive(:bulk_perform_async)
- .with([[1, anything], [2, anything], [3, anything], [4, anything]])
+ expect(worker).to receive(:bulk_perform_async).with(arguments)
- worker.bulk_perform_and_wait([[1], [2], [3], [4]])
+ worker.bulk_perform_and_wait(arguments)
+ end
end
- it 'runs > 10 * timeout jobs using sidekiq and no waiter key' do
- arguments = 1.upto(21).map { |i| [i] }
+ context '>= 4 jobs' do
+ it 'runs jobs using sidekiq' do
+ arguments = 1.upto(5).map { |i| [i] }
- expect(worker).to receive(:bulk_perform_async).with(arguments)
+ expect(worker).to receive(:bulk_perform_async).with(arguments)
- worker.bulk_perform_and_wait(arguments, timeout: 2)
+ worker.bulk_perform_and_wait(arguments)
+ end
end
end
diff --git a/spec/workers/container_registry/migration/enqueuer_worker_spec.rb b/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
index ab3bd8f75d4..c2381c0ced7 100644
--- a/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
+++ b/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
@@ -158,7 +158,7 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
expect(worker).to receive(:handle_next_migration).exactly(3).times.and_call_original
- expect { subject }.to make_queries_matching(/LIMIT 2/)
+ expect { subject }.to make_queries_matching(/LIMIT 25/)
expect(container_repository.reload).to be_pre_importing
expect(container_repository2.reload).to be_pre_importing
diff --git a/spec/workers/disallow_two_factor_for_group_worker_spec.rb b/spec/workers/disallow_two_factor_for_group_worker_spec.rb
index a69dd893f81..f30b12dd7f4 100644
--- a/spec/workers/disallow_two_factor_for_group_worker_spec.rb
+++ b/spec/workers/disallow_two_factor_for_group_worker_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe DisallowTwoFactorForGroupWorker do
end
it "updates group members" do
- group.add_user(user, GroupMember::DEVELOPER)
+ group.add_member(user, GroupMember::DEVELOPER)
described_class.new.perform(group.id)
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index a9e886de52a..e8ec7c28537 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -181,9 +181,7 @@ RSpec.describe 'Every Sidekiq worker' do
'ClusterWaitForAppUpdateWorker' => 3,
'ClusterWaitForIngressIpAddressWorker' => 3,
'Clusters::Applications::ActivateIntegrationWorker' => 3,
- 'Clusters::Applications::ActivateServiceWorker' => 3,
'Clusters::Applications::DeactivateIntegrationWorker' => 3,
- 'Clusters::Applications::DeactivateServiceWorker' => 3,
'Clusters::Applications::UninstallWorker' => 3,
'Clusters::Applications::WaitForUninstallAppWorker' => 3,
'Clusters::Cleanup::AppWorker' => 3,
@@ -261,6 +259,7 @@ RSpec.describe 'Every Sidekiq worker' do
'Gitlab::GithubImport::AdvanceStageWorker' => 3,
'Gitlab::GithubImport::ImportDiffNoteWorker' => 5,
'Gitlab::GithubImport::ImportIssueWorker' => 5,
+ 'Gitlab::GithubImport::ImportIssueEventWorker' => 5,
'Gitlab::GithubImport::ImportLfsObjectWorker' => 5,
'Gitlab::GithubImport::ImportNoteWorker' => 5,
'Gitlab::GithubImport::ImportPullRequestMergedByWorker' => 5,
@@ -270,6 +269,7 @@ RSpec.describe 'Every Sidekiq worker' do
'Gitlab::GithubImport::Stage::FinishImportWorker' => 5,
'Gitlab::GithubImport::Stage::ImportBaseDataWorker' => 5,
'Gitlab::GithubImport::Stage::ImportIssuesAndDiffNotesWorker' => 5,
+ 'Gitlab::GithubImport::Stage::ImportIssueEventsWorker' => 5,
'Gitlab::GithubImport::Stage::ImportLfsObjectsWorker' => 5,
'Gitlab::GithubImport::Stage::ImportNotesWorker' => 5,
'Gitlab::GithubImport::Stage::ImportPullRequestsMergedByWorker' => 5,
@@ -310,7 +310,6 @@ RSpec.describe 'Every Sidekiq worker' do
'Integrations::ExecuteWorker' => 3,
'Integrations::IrkerWorker' => 3,
'InvalidGpgSignatureUpdateWorker' => 3,
- 'IrkerWorker' => 3,
'IssuableExportCsvWorker' => 3,
'Issues::PlacementWorker' => 3,
'Issues::RebalancingWorker' => 3,
@@ -358,6 +357,7 @@ RSpec.describe 'Every Sidekiq worker' do
'ObjectStorage::BackgroundMoveWorker' => 5,
'ObjectStorage::MigrateUploadsWorker' => 3,
'Packages::CleanupPackageFileWorker' => 0,
+ 'Packages::Cleanup::ExecutePolicyWorker' => 0,
'Packages::Composer::CacheUpdateWorker' => false,
'Packages::Go::SyncPackagesWorker' => 3,
'Packages::MarkPackageFilesForDestructionWorker' => 3,
@@ -366,7 +366,6 @@ RSpec.describe 'Every Sidekiq worker' do
'Packages::Rubygems::ExtractionWorker' => 3,
'PagesDomainSslRenewalWorker' => 3,
'PagesDomainVerificationWorker' => 3,
- 'PagesTransferWorker' => 3,
'PagesWorker' => 3,
'PersonalAccessTokens::Groups::PolicyWorker' => 3,
'PersonalAccessTokens::Instance::PolicyWorker' => 3,
@@ -381,7 +380,6 @@ RSpec.describe 'Every Sidekiq worker' do
'ProjectExportWorker' => false,
'ProjectImportScheduleWorker' => 1,
'ProjectScheduleBulkRepositoryShardMovesWorker' => 3,
- 'ProjectServiceWorker' => 3,
'ProjectTemplateExportWorker' => false,
'ProjectUpdateRepositoryStorageWorker' => 3,
'Projects::GitGarbageCollectWorker' => false,
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 af15f465107..15bc55c1526 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
@@ -7,7 +7,8 @@ RSpec.describe Gitlab::GithubImport::ImportDiffNoteWorker do
describe '#import' do
it 'imports a diff note' do
- project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
+ import_state = create(:import_state, :started)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: import_state)
client = double(:client)
importer = double(:importer)
hash = {
diff --git a/spec/workers/gitlab/github_import/import_issue_event_worker_spec.rb b/spec/workers/gitlab/github_import/import_issue_event_worker_spec.rb
new file mode 100644
index 00000000000..03a6503fb84
--- /dev/null
+++ b/spec/workers/gitlab/github_import/import_issue_event_worker_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::ImportIssueEventWorker do
+ subject(:worker) { described_class.new }
+
+ describe '#import' do
+ let(:import_state) { create(:import_state, :started) }
+
+ let(:project) do
+ instance_double('Project', full_path: 'foo/bar', id: 1, import_state: import_state)
+ end
+
+ let(:client) { instance_double('Gitlab::GithubImport::Client') }
+ let(:importer) { instance_double('Gitlab::GithubImport::Importer::IssueEventImporter') }
+
+ let(:event_hash) do
+ {
+ 'id' => 6501124486,
+ 'node_id' => 'CE_lADOHK9fA85If7x0zwAAAAGDf0mG',
+ 'url' => 'https://api.github.com/repos/elhowm/test-import/issues/events/6501124486',
+ 'actor' => { 'id' => 4, 'login' => 'alice' },
+ 'event' => 'closed',
+ 'commit_id' => nil,
+ 'commit_url' => nil,
+ 'created_at' => '2022-04-26 18:30:53 UTC',
+ 'performed_via_github_app' => nil
+ }
+ end
+
+ it 'imports an issue event' do
+ expect(Gitlab::GithubImport::Importer::IssueEventImporter)
+ .to receive(:new)
+ .with(
+ an_instance_of(Gitlab::GithubImport::Representation::IssueEvent),
+ project,
+ client
+ )
+ .and_return(importer)
+
+ expect(importer).to receive(:execute)
+
+ expect(Gitlab::GithubImport::ObjectCounter)
+ .to receive(:increment)
+ .and_call_original
+
+ worker.import(project, client, event_hash)
+ end
+ end
+end
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 29f21c1d184..c2a7639fde4 100644
--- a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
@@ -7,7 +7,8 @@ RSpec.describe Gitlab::GithubImport::ImportIssueWorker do
describe '#import' do
it 'imports an issue' do
- project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
+ import_state = create(:import_state, :started)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: import_state)
client = double(:client)
importer = double(:importer)
hash = {
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 f4598340938..16ca5658f77 100644
--- a/spec/workers/gitlab/github_import/import_note_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_note_worker_spec.rb
@@ -7,7 +7,8 @@ RSpec.describe Gitlab::GithubImport::ImportNoteWorker do
describe '#import' do
it 'imports a note' do
- project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
+ import_state = create(:import_state, :started)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: import_state)
client = double(:client)
importer = double(:importer)
hash = {
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 faed2f8f340..59f45b437c4 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
@@ -7,7 +7,8 @@ RSpec.describe Gitlab::GithubImport::ImportPullRequestWorker do
describe '#import' do
it 'imports a pull request' do
- project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
+ import_state = create(:import_state, :started)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: import_state)
client = double(:client)
importer = double(:importer)
hash = {
diff --git a/spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb
new file mode 100644
index 00000000000..b3c6a48767c
--- /dev/null
+++ b/spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Stage::ImportIssueEventsWorker do
+ subject(:worker) { described_class.new }
+
+ let(:project) { create(:project) }
+ let!(:group) { create(:group, projects: [project]) }
+ let(:feature_flag_state) { [group] }
+
+ describe '#import' do
+ let(:importer) { instance_double('Gitlab::GithubImport::Importer::SingleEndpointIssueEventsImporter') }
+ let(:client) { instance_double('Gitlab::GithubImport::Client') }
+
+ before do
+ stub_feature_flags(github_importer_issue_events_import: feature_flag_state)
+ end
+
+ it 'imports all the issue events' do
+ waiter = Gitlab::JobWaiter.new(2, '123')
+
+ expect(Gitlab::GithubImport::Importer::SingleEndpointIssueEventsImporter)
+ .to receive(:new)
+ .with(project, client)
+ .and_return(importer)
+
+ expect(importer).to receive(:execute).and_return(waiter)
+
+ expect(Gitlab::GithubImport::AdvanceStageWorker)
+ .to receive(:perform_async)
+ .with(project.id, { '123' => 2 }, :notes)
+
+ worker.import(client, project)
+ end
+
+ context 'when feature flag is disabled' do
+ let(:feature_flag_state) { false }
+
+ it 'skips issue events import and calls next stage' do
+ expect(Gitlab::GithubImport::Importer::SingleEndpointIssueEventsImporter).not_to receive(:new)
+ expect(Gitlab::GithubImport::AdvanceStageWorker).to receive(:perform_async).with(project.id, {}, :notes)
+
+ worker.import(client, project)
+ end
+ end
+ end
+end
diff --git a/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb
index c0dd4f488cc..a88256b3cae 100644
--- a/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportIssuesAndDiffNotesWorker do
expect(Gitlab::GithubImport::AdvanceStageWorker)
.to receive(:perform_async)
- .with(project.id, { '123' => 2 }, :notes)
+ .with(project.id, { '123' => 2 }, :issue_events)
worker.import(client, project)
end
diff --git a/spec/workers/gitlab_service_ping_worker_spec.rb b/spec/workers/gitlab_service_ping_worker_spec.rb
index 057639dcf1d..c88708dc50a 100644
--- a/spec/workers/gitlab_service_ping_worker_spec.rb
+++ b/spec/workers/gitlab_service_ping_worker_spec.rb
@@ -21,29 +21,12 @@ RSpec.describe GitlabServicePingWorker, :clean_gitlab_redis_shared_state do
subject.perform
end
- context 'with prerecord_service_ping_data feature enabled' do
- it 'delegates to ServicePing::SubmitService' do
- stub_feature_flags(prerecord_service_ping_data: true)
-
- expect_next_instance_of(ServicePing::SubmitService, payload: payload) do |service|
- expect(service).to receive(:execute)
- end
-
- subject.perform
+ it 'delegates to ServicePing::SubmitService' do
+ expect_next_instance_of(ServicePing::SubmitService, payload: payload) do |service|
+ expect(service).to receive(:execute)
end
- end
- context 'with prerecord_service_ping_data feature disabled' do
- it 'does not prerecord ServicePing, and calls SubmitService', :aggregate_failures do
- stub_feature_flags(prerecord_service_ping_data: false)
-
- expect(ServicePing::BuildPayload).not_to receive(:new)
- expect(ServicePing::BuildPayload).not_to receive(:new)
- expect_next_instance_of(ServicePing::SubmitService, payload: nil) do |service|
- expect(service).to receive(:execute)
- end
- expect { subject.perform }.not_to change { RawUsageData.count }
- end
+ subject.perform
end
context 'payload computation' do
diff --git a/spec/workers/google_cloud/create_cloudsql_instance_worker_spec.rb b/spec/workers/google_cloud/create_cloudsql_instance_worker_spec.rb
new file mode 100644
index 00000000000..5d595a3679b
--- /dev/null
+++ b/spec/workers/google_cloud/create_cloudsql_instance_worker_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'google/apis/sqladmin_v1beta4'
+
+RSpec.describe GoogleCloud::CreateCloudsqlInstanceWorker do
+ let(:random_user) { create(:user) }
+ let(:project) { create(:project) }
+ let(:worker_options) do
+ {
+ gcp_project_id: :gcp_project_id,
+ instance_name: :instance_name,
+ database_version: :database_version,
+ environment_name: :environment_name,
+ is_protected: true
+ }
+ end
+
+ context 'when triggered' do
+ subject do
+ user_id = project.creator.id
+ project_id = project.id
+ described_class.new.perform(user_id, project_id, worker_options)
+ end
+
+ it 'calls GoogleCloud::SetupCloudsqlInstanceService' do
+ allow_next_instance_of(GoogleCloud::SetupCloudsqlInstanceService) do |service|
+ expect(service).to receive(:execute).and_return({ status: :success })
+ end
+
+ subject
+ end
+
+ context 'when GoogleCloud::SetupCloudsqlInstanceService fails' do
+ subject do
+ user_id = random_user.id
+ project_id = project.id
+ described_class.new.perform(user_id, project_id, worker_options)
+ end
+
+ it 'raises error' do
+ allow_next_instance_of(GoogleCloud::SetupCloudsqlInstanceService) do |service|
+ expect(service).to receive(:execute).and_return({ status: :error })
+ end
+
+ expect { subject }.to raise_error(Exception)
+ end
+ end
+ end
+end
diff --git a/spec/workers/incident_management/close_incident_worker_spec.rb b/spec/workers/incident_management/close_incident_worker_spec.rb
new file mode 100644
index 00000000000..b0d284ba5db
--- /dev/null
+++ b/spec/workers/incident_management/close_incident_worker_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::CloseIncidentWorker do
+ subject(:worker) { described_class.new }
+
+ describe '#perform' do
+ let_it_be(:user) { User.alert_bot }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:issue, reload: true) { create(:incident, project: project) }
+
+ let(:issue_id) { issue.id }
+
+ it 'calls the close issue service' do
+ expect_next_instance_of(Issues::CloseService, project: project, current_user: user) do |service|
+ expect(service).to receive(:execute).with(issue, system_note: false).and_call_original
+ end
+
+ expect { worker.perform(issue_id) }.to change(ResourceStateEvent, :count).by(1)
+ end
+
+ shared_examples 'does not call the close issue service' do
+ specify do
+ expect(Issues::CloseService).not_to receive(:new)
+
+ expect { worker.perform(issue_id) }.not_to change(ResourceStateEvent, :count)
+ end
+ end
+
+ context 'when the incident does not exist' do
+ let(:issue_id) { non_existing_record_id }
+
+ it_behaves_like 'does not call the close issue service'
+ end
+
+ context 'when issue type is not incident' do
+ before do
+ issue.update!(issue_type: :issue)
+ end
+
+ it_behaves_like 'does not call the close issue service'
+ end
+
+ context 'when incident is not open' do
+ before do
+ issue.close
+ end
+
+ it_behaves_like 'does not call the close issue service'
+ end
+
+ context 'when incident fails to close' do
+ before do
+ allow_next_instance_of(Issues::CloseService) do |service|
+ expect(service).to receive(:close_issue).and_return(issue)
+ end
+ end
+
+ specify do
+ expect { worker.perform(issue_id) }.not_to change(ResourceStateEvent, :count)
+ end
+ end
+ end
+end
diff --git a/spec/workers/integrations/execute_worker_spec.rb b/spec/workers/integrations/execute_worker_spec.rb
index 19600f35c8f..0e585e3006c 100644
--- a/spec/workers/integrations/execute_worker_spec.rb
+++ b/spec/workers/integrations/execute_worker_spec.rb
@@ -36,26 +36,4 @@ RSpec.describe Integrations::ExecuteWorker, '#perform' do
end.not_to raise_error
end
end
-
- context 'when using the old worker class' do
- let(:described_class) { ProjectServiceWorker }
-
- it 'uses the correct worker attributes', :aggregate_failures do
- expect(described_class.sidekiq_options).to include('retry' => 3, 'dead' => false)
- expect(described_class.get_data_consistency).to eq(:always)
- expect(described_class.get_feature_category).to eq(:integrations)
- expect(described_class.get_urgency).to eq(:low)
- expect(described_class.worker_has_external_dependencies?).to be(true)
- end
-
- it 'executes integration with given data' do
- data = { test: 'test' }
-
- expect_next_found_instance_of(integration.class) do |integration|
- expect(integration).to receive(:execute).with(data)
- end
-
- worker.perform(integration.id, data)
- end
- end
end
diff --git a/spec/workers/integrations/irker_worker_spec.rb b/spec/workers/integrations/irker_worker_spec.rb
index 27dc08212ea..3b7b9af72fd 100644
--- a/spec/workers/integrations/irker_worker_spec.rb
+++ b/spec/workers/integrations/irker_worker_spec.rb
@@ -101,12 +101,6 @@ RSpec.describe Integrations::IrkerWorker, '#perform' do
subject.perform(*arguments)
end
end
-
- context 'when using the old worker class' do
- let(:described_class) { ::IrkerWorker }
-
- it { expect(subject.perform(*arguments)).to be_truthy }
- end
end
def wrap_message(text)
diff --git a/spec/workers/loose_foreign_keys/cleanup_worker_spec.rb b/spec/workers/loose_foreign_keys/cleanup_worker_spec.rb
index 632e4fb3071..77190dc49d9 100644
--- a/spec/workers/loose_foreign_keys/cleanup_worker_spec.rb
+++ b/spec/workers/loose_foreign_keys/cleanup_worker_spec.rb
@@ -169,7 +169,7 @@ RSpec.describe LooseForeignKeys::CleanupWorker do
let(:expected_connection) { expected_connection_model.constantize.connection }
before do
- allow(Gitlab::Database).to receive(:database_base_models).and_return(database_base_models)
+ allow(Gitlab::Database).to receive(:database_base_models_with_gitlab_shared).and_return(database_base_models)
if database_base_models.has_key?(:ci)
Gitlab::Database::SharedModel.using_connection(database_base_models[:ci].connection) do
diff --git a/spec/workers/namespaces/onboarding_issue_created_worker_spec.rb b/spec/workers/namespaces/onboarding_issue_created_worker_spec.rb
index 32e7bdd563d..53116815ce7 100644
--- a/spec/workers/namespaces/onboarding_issue_created_worker_spec.rb
+++ b/spec/workers/namespaces/onboarding_issue_created_worker_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Namespaces::OnboardingIssueCreatedWorker, '#perform' do
let_it_be(:issue) { create(:issue) }
- let(:namespace) { issue.namespace }
+ let(:namespace) { issue.project.namespace }
it_behaves_like 'records an onboarding progress action', :issue_created do
subject { described_class.new.perform(namespace.id) }
diff --git a/spec/workers/packages/cleanup/execute_policy_worker_spec.rb b/spec/workers/packages/cleanup/execute_policy_worker_spec.rb
new file mode 100644
index 00000000000..81fcec1a360
--- /dev/null
+++ b/spec/workers/packages/cleanup/execute_policy_worker_spec.rb
@@ -0,0 +1,160 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Cleanup::ExecutePolicyWorker do
+ let(:worker) { described_class.new }
+
+ describe '#perform_work' do
+ subject(:perform_work) { worker.perform_work }
+
+ shared_examples 'not executing any policy' do
+ it 'is a no op' do
+ expect(::Packages::Cleanup::ExecutePolicyService).not_to receive(:new)
+
+ expect { perform_work }.not_to change { Packages::PackageFile.installable.count }
+ end
+ end
+
+ context 'with no policies' do
+ it_behaves_like 'not executing any policy'
+ end
+
+ context 'with no runnable policies' do
+ let_it_be(:policy) { create(:packages_cleanup_policy) }
+
+ it_behaves_like 'not executing any policy'
+ end
+
+ context 'with runnable policies linked to no packages' do
+ let_it_be(:policy) { create(:packages_cleanup_policy, :runnable) }
+
+ it_behaves_like 'not executing any policy'
+ end
+
+ context 'with runnable policies linked to packages' do
+ let_it_be(:policy) { create(:packages_cleanup_policy, :runnable, keep_n_duplicated_package_files: '1') }
+ let_it_be(:package) { create(:package, project: policy.project) }
+
+ let_it_be(:package_file1) { create(:package_file, file_name: 'test1', package: package) }
+ let_it_be(:package_file2) { create(:package_file, file_name: 'test1', package: package) }
+
+ include_examples 'an idempotent worker' do
+ it 'executes the policy' do
+ expect(::Packages::Cleanup::ExecutePolicyService)
+ .to receive(:new).with(policy).and_call_original
+ expect_log_extra_metadata(:project_id, policy.project_id)
+ expect_log_extra_metadata(:execution_timeout, false)
+ expect_log_extra_metadata(:marked_package_files_total_count, 1)
+ expect_log_extra_metadata(:unique_package_id_and_file_name_total_count, 1)
+
+ expect { perform_work }
+ .to change { package.package_files.installable.count }.by(-1)
+ .and change { policy.reload.next_run_at.future? }.from(false).to(true)
+ end
+
+ context 'with a timeout' do
+ let(:mark_service_response) do
+ ServiceResponse.error(
+ message: 'Timeout',
+ payload: { marked_package_files_count: 1 }
+ )
+ end
+
+ it 'executes the policy partially' do
+ expect_next_instance_of(::Packages::MarkPackageFilesForDestructionService) do |service|
+ expect(service).to receive(:execute).and_return(mark_service_response)
+ end
+
+ expect_log_extra_metadata(:project_id, policy.project_id)
+ expect_log_extra_metadata(:execution_timeout, true)
+ expect_log_extra_metadata(:marked_package_files_total_count, 1)
+ expect_log_extra_metadata(:unique_package_id_and_file_name_total_count, 1)
+
+ expect { perform_work }
+ .to change { policy.reload.next_run_at.future? }.from(false).to(true)
+ end
+ end
+ end
+
+ context 'with several eligible policies' do
+ let_it_be(:policy2) { create(:packages_cleanup_policy, :runnable) }
+ let_it_be(:package2) { create(:package, project: policy2.project) }
+
+ before do
+ policy2.update_column(:next_run_at, 100.years.ago)
+ end
+
+ it 'executes the most urgent policy' do
+ expect(::Packages::Cleanup::ExecutePolicyService)
+ .to receive(:new).with(policy2).and_call_original
+ expect_log_extra_metadata(:project_id, policy2.project_id)
+ expect_log_extra_metadata(:execution_timeout, false)
+ expect_log_extra_metadata(:marked_package_files_total_count, 0)
+ expect_log_extra_metadata(:unique_package_id_and_file_name_total_count, 0)
+
+ expect { perform_work }
+ .to change { policy2.reload.next_run_at.future? }.from(false).to(true)
+ .and not_change { policy.reload.next_run_at }
+ end
+ end
+ end
+
+ context 'with runnable policy linked to packages in a disabled state' do
+ let_it_be(:policy) { create(:packages_cleanup_policy, :runnable, keep_n_duplicated_package_files: 'all') }
+ let_it_be(:package) { create(:package, project: policy.project) }
+
+ it_behaves_like 'not executing any policy'
+ end
+
+ def expect_log_extra_metadata(key, value)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(key, value)
+ end
+ end
+
+ describe '#remaining_work_count' do
+ subject { worker.remaining_work_count}
+
+ context 'with no policies' do
+ it { is_expected.to eq(0) }
+ end
+
+ context 'with no runnable policies' do
+ let_it_be(:policy) { create(:packages_cleanup_policy) }
+
+ it { is_expected.to eq(0) }
+ end
+
+ context 'with runnable policies linked to no packages' do
+ let_it_be(:policy) { create(:packages_cleanup_policy, :runnable) }
+
+ it { is_expected.to eq(0) }
+ end
+
+ context 'with runnable policies linked to packages' do
+ let_it_be(:policy) { create(:packages_cleanup_policy, :runnable) }
+ let_it_be(:package) { create(:package, project: policy.project) }
+
+ it { is_expected.to eq(1) }
+ end
+
+ context 'with runnable policy linked to packages in a disabled state' do
+ let_it_be(:policy) { create(:packages_cleanup_policy, :runnable, keep_n_duplicated_package_files: 'all') }
+ let_it_be(:package) { create(:package, project: policy.project) }
+
+ it { is_expected.to eq(0) }
+ end
+ end
+
+ describe '#max_running_jobs' do
+ let(:capacity) { 50 }
+
+ subject { worker.max_running_jobs }
+
+ before do
+ stub_application_setting(package_registry_cleanup_policies_worker_capacity: capacity)
+ end
+
+ it { is_expected.to eq(capacity) }
+ end
+end
diff --git a/spec/workers/packages/cleanup_package_file_worker_spec.rb b/spec/workers/packages/cleanup_package_file_worker_spec.rb
index 380e8916d13..95cf65c18c5 100644
--- a/spec/workers/packages/cleanup_package_file_worker_spec.rb
+++ b/spec/workers/packages/cleanup_package_file_worker_spec.rb
@@ -52,6 +52,7 @@ RSpec.describe Packages::CleanupPackageFileWorker do
end
it 'handles the error' do
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(instance_of(RuntimeError), class: described_class.name)
expect { subject }.to change { Packages::PackageFile.error.count }.from(0).to(1)
expect(package_file.reload).to be_error
end
@@ -71,7 +72,9 @@ RSpec.describe Packages::CleanupPackageFileWorker do
end
it 'handles the error' do
- expect { subject }.to change { Packages::PackageFile.count }.by(-1)
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(instance_of(RuntimeError), class: described_class.name)
+ expect { subject }.not_to change { Packages::PackageFile.count }
+ expect(package_file.reload).to be_error
end
end
end
diff --git a/spec/workers/packages/cleanup_package_registry_worker_spec.rb b/spec/workers/packages/cleanup_package_registry_worker_spec.rb
index e43864975f6..e12f2198f66 100644
--- a/spec/workers/packages/cleanup_package_registry_worker_spec.rb
+++ b/spec/workers/packages/cleanup_package_registry_worker_spec.rb
@@ -5,6 +5,8 @@ require 'spec_helper'
RSpec.describe Packages::CleanupPackageRegistryWorker do
describe '#perform' do
let_it_be_with_reload(:package_files) { create_list(:package_file, 2, :pending_destruction) }
+ let_it_be(:policy) { create(:packages_cleanup_policy, :runnable) }
+ let_it_be(:package) { create(:package, project: policy.project) }
let(:worker) { described_class.new }
@@ -34,6 +36,28 @@ RSpec.describe Packages::CleanupPackageRegistryWorker do
end
end
+ context 'with runnable policies' do
+ it_behaves_like 'an idempotent worker'
+
+ it 'queues the cleanup job' do
+ expect(Packages::Cleanup::ExecutePolicyWorker).to receive(:perform_with_capacity)
+
+ perform
+ end
+ end
+
+ context 'with no runnable policies' do
+ before do
+ policy.update_column(:next_run_at, 5.minutes.from_now)
+ end
+
+ it 'does not queue the cleanup job' do
+ expect(Packages::Cleanup::ExecutePolicyWorker).not_to receive(:perform_with_capacity)
+
+ perform
+ end
+ end
+
describe 'counts logging' do
let_it_be(:processing_package_file) { create(:package_file, status: :processing) }
@@ -41,6 +65,7 @@ RSpec.describe Packages::CleanupPackageRegistryWorker do
expect(worker).to receive(:log_extra_metadata_on_done).with(:pending_destruction_package_files_count, 2)
expect(worker).to receive(:log_extra_metadata_on_done).with(:processing_package_files_count, 1)
expect(worker).to receive(:log_extra_metadata_on_done).with(:error_package_files_count, 0)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:pending_cleanup_policies_count, 1)
perform
end
diff --git a/spec/workers/packages/debian/generate_distribution_worker_spec.rb b/spec/workers/packages/debian/generate_distribution_worker_spec.rb
index a4627ec5d36..a3e956f14c8 100644
--- a/spec/workers/packages/debian/generate_distribution_worker_spec.rb
+++ b/spec/workers/packages/debian/generate_distribution_worker_spec.rb
@@ -18,6 +18,12 @@ RSpec.describe Packages::Debian::GenerateDistributionWorker, type: :worker do
context "for #{container_type}" do
include_context 'with Debian distribution', container_type
+ context 'with FIPS mode enabled', :fips_mode do
+ it 'raises an error' do
+ expect { subject }.to raise_error(::Packages::FIPS::DisabledError)
+ end
+ end
+
context 'with mocked service' do
it 'calls GenerateDistributionService' do
expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
diff --git a/spec/workers/packages/debian/process_changes_worker_spec.rb b/spec/workers/packages/debian/process_changes_worker_spec.rb
index 4a8eb855398..93eba4bfa9a 100644
--- a/spec/workers/packages/debian/process_changes_worker_spec.rb
+++ b/spec/workers/packages/debian/process_changes_worker_spec.rb
@@ -16,6 +16,12 @@ RSpec.describe Packages::Debian::ProcessChangesWorker, type: :worker do
subject { worker.perform(package_file_id, user_id) }
+ context 'with FIPS mode enabled', :fips_mode do
+ it 'raises an error' do
+ expect { subject }.to raise_error(::Packages::FIPS::DisabledError)
+ end
+ end
+
context 'with mocked service' do
it 'calls ProcessChangesService' do
expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
diff --git a/spec/workers/pages/invalidate_domain_cache_worker_spec.rb b/spec/workers/pages/invalidate_domain_cache_worker_spec.rb
new file mode 100644
index 00000000000..1c1586ef199
--- /dev/null
+++ b/spec/workers/pages/invalidate_domain_cache_worker_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Pages::InvalidateDomainCacheWorker do
+ shared_examples 'clears caches with' do |event_class:, event_data:, caches:|
+ let(:event) do
+ event_class.new(data: event_data)
+ end
+
+ subject { consume_event(subscriber: described_class, event: event) }
+
+ it_behaves_like 'subscribes to event'
+
+ it 'clears the cache with Gitlab::Pages::CacheControl' do
+ caches.each do |cache_type, cache_id|
+ expect_next_instance_of(Gitlab::Pages::CacheControl, type: cache_type, id: cache_id) do |cache_control|
+ expect(cache_control).to receive(:clear_cache)
+ end
+ end
+
+ subject
+ end
+ end
+
+ it_behaves_like 'clears caches with',
+ event_class: Pages::PageDeployedEvent,
+ event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
+ caches: { namespace: 3, project: 1 }
+
+ it_behaves_like 'clears caches with',
+ event_class: Pages::PageDeletedEvent,
+ event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
+ caches: { namespace: 3, project: 1 }
+
+ it_behaves_like 'clears caches with',
+ event_class: Projects::ProjectDeletedEvent,
+ event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
+ caches: { namespace: 3, project: 1 }
+
+ it_behaves_like 'clears caches with',
+ event_class: Projects::ProjectCreatedEvent,
+ event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
+ caches: { namespace: 3, project: 1 }
+end
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index 3951c20c048..4ddb793516f 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -274,6 +274,32 @@ RSpec.describe PostReceive do
expect { perform }.to change { counter.read(:pushes) }.by(1)
end
+
+ it 'records correct payload with Snowplow event', :snowplow do
+ stub_feature_flags(route_hll_to_snowplow_phase2: true)
+
+ perform
+
+ expect_snowplow_event(
+ category: 'PostReceive',
+ action: 'source_code_pushes',
+ namespace: project.namespace,
+ user: project.first_owner,
+ project: project
+ )
+ end
+
+ context 'when FF is disabled' do
+ before do
+ stub_feature_flags(route_hll_to_snowplow_phase2: false)
+ end
+
+ it 'doesnt emit snowplow events', :snowplow do
+ perform
+
+ expect_no_snowplow_event
+ end
+ end
end
end
diff --git a/spec/workers/projects/after_import_worker_spec.rb b/spec/workers/projects/after_import_worker_spec.rb
index 332b547bb66..a14b2443173 100644
--- a/spec/workers/projects/after_import_worker_spec.rb
+++ b/spec/workers/projects/after_import_worker_spec.rb
@@ -39,8 +39,7 @@ RSpec.describe Projects::AfterImportWorker do
end
it 'removes refs/pull/**/*' do
- expect(rugged.references.map(&:name))
- .not_to include(%r{\Arefs/pull/})
+ expect(repository.list_refs(['refs/pull/'])).to be_empty
end
end
@@ -53,8 +52,7 @@ RSpec.describe Projects::AfterImportWorker do
end
it "does not remove refs/#{name}/tmp" do
- expect(rugged.references.map(&:name))
- .to include("refs/#{name}/tmp")
+ expect(repository.list_refs(["refs/#{name}/tmp"]).length).to be(1)
end
end
end
@@ -100,8 +98,7 @@ RSpec.describe Projects::AfterImportWorker do
it 'removes refs/pull/**/*' do
subject
- expect(rugged.references.map(&:name))
- .not_to include(%r{\Arefs/pull/})
+ expect(repository.list_refs(['refs/pull/'])).to be_empty
end
it 'records the failures in the database', :aggregate_failures do
@@ -123,9 +120,5 @@ RSpec.describe Projects::AfterImportWorker do
expect(import_failure.correlation_id_value).not_to be_empty
end
end
-
- def rugged
- rugged_repo(repository)
- end
end
end
diff --git a/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb b/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb
index 4a6a525a5a7..c7e45e7e4d7 100644
--- a/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb
+++ b/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb
@@ -62,32 +62,11 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsWorker do
describe '#max_running_jobs' do
subject { worker.max_running_jobs }
- context 'when all projects_build_artifacts_size_refresh flags are enabled' do
- it { is_expected.to eq(described_class::MAX_RUNNING_HIGH) }
- end
-
- context 'when projects_build_artifacts_size_refresh_high flags is disabled' do
- before do
- stub_feature_flags(projects_build_artifacts_size_refresh_high: false)
- end
-
- it { is_expected.to eq(described_class::MAX_RUNNING_MEDIUM) }
- end
-
- context 'when projects_build_artifacts_size_refresh_high and projects_build_artifacts_size_refresh_medium flags are disabled' do
- before do
- stub_feature_flags(projects_build_artifacts_size_refresh_high: false)
- stub_feature_flags(projects_build_artifacts_size_refresh_medium: false)
- end
-
- it { is_expected.to eq(described_class::MAX_RUNNING_LOW) }
- end
+ it { is_expected.to eq(10) }
- context 'when all projects_build_artifacts_size_refresh flags are disabled' do
+ context 'when projects_build_artifacts_size_refresh flag is disabled' do
before do
- stub_feature_flags(projects_build_artifacts_size_refresh_low: false)
- stub_feature_flags(projects_build_artifacts_size_refresh_medium: false)
- stub_feature_flags(projects_build_artifacts_size_refresh_high: false)
+ stub_feature_flags(projects_build_artifacts_size_refresh: false)
end
it { is_expected.to eq(0) }
diff --git a/spec/workers/remove_expired_group_links_worker_spec.rb b/spec/workers/remove_expired_group_links_worker_spec.rb
index 151bbb75226..7bdf6fc0d59 100644
--- a/spec/workers/remove_expired_group_links_worker_spec.rb
+++ b/spec/workers/remove_expired_group_links_worker_spec.rb
@@ -51,16 +51,41 @@ RSpec.describe RemoveExpiredGroupLinksWorker do
subject.perform
end
- 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)
+ context 'with skip_group_share_unlink_auth_refresh feature flag disabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: false)
+ end
+
+ 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)
+
+ user = create(:user)
+ shared_with_group.add_maintainer(user)
+
+ expect { subject.perform }.to(
+ change { user.can?(:read_project, project) }.from(true).to(false))
+ end
+ end
+
+ context 'with skip_group_share_unlink_auth_refresh feature flag enabled' do
+ before do
+ stub_feature_flags(skip_group_share_unlink_auth_refresh: true)
+ end
+
+ it 'does not remove 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)
+
+ user = create(:user)
+ shared_with_group.add_maintainer(user)
- user = create(:user)
- shared_with_group.add_maintainer(user)
+ subject.perform
- expect { subject.perform }.to(
- change { user.can?(:read_project, project) }.from(true).to(false))
+ expect(user.can?(:read_project, project)).to be_truthy
+ end
end
end
diff --git a/spec/workers/remove_expired_members_worker_spec.rb b/spec/workers/remove_expired_members_worker_spec.rb
index 6d0d4aeef89..8d7d488094f 100644
--- a/spec/workers/remove_expired_members_worker_spec.rb
+++ b/spec/workers/remove_expired_members_worker_spec.rb
@@ -47,7 +47,7 @@ RSpec.describe RemoveExpiredMembersWorker do
let_it_be(:expired_project_bot) { create(:user, :project_bot) }
before do
- project.add_user(expired_project_bot, :maintainer, expires_at: 1.day.from_now)
+ project.add_member(expired_project_bot, :maintainer, expires_at: 1.day.from_now)
travel_to(3.days.from_now)
end
@@ -67,7 +67,7 @@ RSpec.describe RemoveExpiredMembersWorker do
let_it_be(:other_project_bot) { create(:user, :project_bot) }
before do
- project.add_user(other_project_bot, :maintainer, expires_at: 10.days.from_now)
+ project.add_member(other_project_bot, :maintainer, expires_at: 10.days.from_now)
travel_to(3.days.from_now)
end
diff --git a/spec/workers/stage_update_worker_spec.rb b/spec/workers/stage_update_worker_spec.rb
index 75b324a9e0a..e50c7183153 100644
--- a/spec/workers/stage_update_worker_spec.rb
+++ b/spec/workers/stage_update_worker_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe StageUpdateWorker do
describe '#perform' do
context 'when stage exists' do
- let(:stage) { create(:ci_stage_entity) }
+ let(:stage) { create(:ci_stage) }
it 'updates stage status' do
expect_any_instance_of(Ci::Stage).to receive(:set_status).with('skipped')
diff --git a/spec/workers/web_hooks/destroy_worker_spec.rb b/spec/workers/web_hooks/destroy_worker_spec.rb
deleted file mode 100644
index 8e75610a031..00000000000
--- a/spec/workers/web_hooks/destroy_worker_spec.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe WebHooks::DestroyWorker do
- include AfterNextHelpers
-
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
-
- before_all do
- project.add_maintainer(user)
- end
-
- subject { described_class.new }
-
- describe "#perform" do
- context 'with a Web hook' do
- let!(:hook) { create(:project_hook, project: project) }
- let!(:other_hook) { create(:project_hook, project: project) }
- let!(:log) { create(:web_hook_log, web_hook: hook) }
- let!(:other_log) { create(:web_hook_log, web_hook: other_hook) }
-
- it "deletes the Web hook and logs", :aggregate_failures do
- expect(WebHooks::LogDestroyWorker).to receive(:perform_async)
-
- expect { subject.perform(user.id, hook.id) }
- .to change { WebHook.count }.from(2).to(1)
-
- expect(WebHook.find(other_hook.id)).to be_present
- expect(WebHookLog.find(other_log.id)).to be_present
- end
-
- it "raises and tracks an error if destroy failed" do
- expect_next(::WebHooks::DestroyService)
- .to receive(:sync_destroy).with(anything)
- .and_return(ServiceResponse.error(message: "failed"))
-
- expect(Gitlab::ErrorTracking)
- .to receive(:track_and_raise_exception)
- .with(an_instance_of(described_class::DestroyError), { web_hook_id: hook.id })
- .and_call_original
-
- expect { subject.perform(user.id, hook.id) }.to raise_error(described_class::DestroyError)
- end
-
- context 'with unknown hook' do
- it 'does not raise an error' do
- expect { subject.perform(user.id, non_existing_record_id) }.not_to raise_error
-
- expect(WebHook.count).to eq(2)
- end
- end
-
- context 'with unknown user' do
- it 'does not raise an error' do
- expect { subject.perform(non_existing_record_id, hook.id) }.not_to raise_error
-
- expect(WebHook.count).to eq(2)
- end
- end
- end
- end
-end
diff --git a/tooling/bin/qa/check_if_qa_only_spec_changes b/tooling/bin/qa/check_if_qa_only_spec_changes
deleted file mode 100755
index 5b9166b41fe..00000000000
--- a/tooling/bin/qa/check_if_qa_only_spec_changes
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env ruby
-# frozen_string_literal: true
-
-# This script assumes the first argument is a path to a file containing a list of changed files and the second argument
-# is the path of a file where a list of end-to-end spec files with the leading 'qa/' trimmed will be written to if
-# all the files are end-to-end test spec files.
-
-abort("ERROR: Please specify the file containing the list of changed files and a file where the qa only spec files will be written") if ARGV.size != 2
-
-changed_files_path = ARGV.shift
-output_file = ARGV.shift
-
-return unless File.exist?(changed_files_path)
-
-changed_files = File.read(changed_files_path).split(' ')
-
-all_files_are_qa_specs = changed_files.all? { |file_path| file_path =~ %r{^qa\/qa\/specs\/features\/} }
-
-if all_files_are_qa_specs
- qa_spec_paths_trimmed = changed_files.map { |path| path.sub('qa/', '') }
- File.write(output_file, qa_spec_paths_trimmed.join(' '))
-end
diff --git a/tooling/config/CODEOWNERS.yml b/tooling/config/CODEOWNERS.yml
index 4fa7338b32d..a8ae90437e2 100644
--- a/tooling/config/CODEOWNERS.yml
+++ b/tooling/config/CODEOWNERS.yml
@@ -15,8 +15,8 @@
- '/{,ee/}lib/**/*%{keyword}*{,/**/*}'
deny:
keywords:
- - '*author.*'
- - '*author_*'
+ - '*author{,s}.*'
+ - '*author{,s}_*'
- '*authored*'
- '*authoring*'
- '*.png'
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index dbe3e6edd98..b37b86ceecc 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -26,7 +26,7 @@ module Tooling
%r{\Adoc/.*(\.(md|png|gif|jpg|yml))\z} => :docs,
%r{\A(CONTRIBUTING|LICENSE|MAINTENANCE|PHILOSOPHY|PROCESS|README)(\.md)?\z} => :docs,
%r{\Adata/whats_new/} => :docs,
- %r{\Adb/docs/.yml\z} => :docs,
+ %r{\Adb/docs/.+\.yml\z} => :docs,
%r{\Adata/deprecations/} => :none,
%r{\Adata/removals/} => :none,
@@ -57,6 +57,7 @@ module Tooling
spec/frontend/tracking/.*\.js |
spec/frontend/tracking_spec\.js
)\z}x => [:frontend, :product_intelligence],
+ [%r{\.(vue|js)\z}, %r{trackRedis}] => [:frontend, :product_intelligence],
%r{\A((ee|jh)/)?app/assets/} => :frontend,
%r{\A((ee|jh)/)?app/views/.*\.svg} => :frontend,
%r{\A((ee|jh)/)?app/views/} => [:frontend, :backend],
@@ -111,6 +112,7 @@ module Tooling
%r{\Atooling/} => :tooling,
%r{(CODEOWNERS)} => :tooling,
%r{(tests.yml)} => :tooling,
+ %r{\A\.gitpod\.yml} => :tooling,
%r{\Alib/gitlab/ci/templates} => :ci_template,
diff --git a/tooling/graphql/docs/renderer.rb b/tooling/graphql/docs/renderer.rb
index 0c2e8cb3b86..811d5f0f770 100644
--- a/tooling/graphql/docs/renderer.rb
+++ b/tooling/graphql/docs/renderer.rb
@@ -22,7 +22,7 @@ module Tooling
@output_dir = output_dir
@template = template
@layout = Haml::Engine.new(File.read(template))
- @parsed_schema = GraphQLDocs::Parser.new(schema.graphql_definition, {}).parse
+ @parsed_schema = GraphQLDocs::Parser.new(schema, {}).parse
@schema = schema
@seen = Set.new
end
diff --git a/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml b/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml
new file mode 100644
index 00000000000..a2517953178
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml
@@ -0,0 +1,26 @@
+workflow:
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+
+.rspec:
+ cache:
+ key: devise-pbkdf2-encryptable
+ paths:
+ - vendor/gems/devise-pbkdf2-encryptable/vendor/ruby
+ before_script:
+ - cd vendor/gems/devise-pbkdf2-encryptable
+ - ruby -v # Print out ruby version for debugging
+ - gem install bundler --no-document # Bundler is not installed with the image
+ - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
+ - bundle config set with 'development'
+ - bundle install -j $(nproc)
+ script:
+ - bundle exec rspec
+
+rspec-2.7:
+ image: "ruby:2.7"
+ extends: .rspec
+
+rspec-3.0:
+ image: "ruby:3.0"
+ extends: .rspec
diff --git a/vendor/gems/devise-pbkdf2-encryptable/Gemfile b/vendor/gems/devise-pbkdf2-encryptable/Gemfile
new file mode 100644
index 00000000000..be173b205f7
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/Gemfile
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+gemspec
diff --git a/vendor/gems/devise-pbkdf2-encryptable/Gemfile.lock b/vendor/gems/devise-pbkdf2-encryptable/Gemfile.lock
new file mode 100644
index 00000000000..ce0cb0c1025
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/Gemfile.lock
@@ -0,0 +1,103 @@
+PATH
+ remote: .
+ specs:
+ devise-pbkdf2-encryptable (0.0.0)
+ devise (~> 4.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actionpack (6.1.6)
+ actionview (= 6.1.6)
+ activesupport (= 6.1.6)
+ rack (~> 2.0, >= 2.0.9)
+ rack-test (>= 0.6.3)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
+ actionview (6.1.6)
+ activesupport (= 6.1.6)
+ builder (~> 3.1)
+ erubi (~> 1.4)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
+ activemodel (6.1.6)
+ activesupport (= 6.1.6)
+ activesupport (6.1.6)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ zeitwerk (~> 2.3)
+ bcrypt (3.1.18)
+ builder (3.2.4)
+ concurrent-ruby (1.1.10)
+ crass (1.0.6)
+ devise (4.8.1)
+ bcrypt (~> 3.0)
+ orm_adapter (~> 0.1)
+ railties (>= 4.1.0)
+ responders
+ warden (~> 1.2.3)
+ diff-lcs (1.5.0)
+ erubi (1.10.0)
+ i18n (1.10.0)
+ concurrent-ruby (~> 1.0)
+ loofah (2.18.0)
+ crass (~> 1.0.2)
+ nokogiri (>= 1.5.9)
+ method_source (1.0.0)
+ mini_portile2 (2.8.0)
+ minitest (5.16.0)
+ nokogiri (1.13.6)
+ mini_portile2 (~> 2.8.0)
+ racc (~> 1.4)
+ orm_adapter (0.5.0)
+ racc (1.6.0)
+ rack (2.2.3.1)
+ rack-test (1.1.0)
+ rack (>= 1.0, < 3)
+ rails-dom-testing (2.0.3)
+ activesupport (>= 4.2.0)
+ nokogiri (>= 1.6)
+ rails-html-sanitizer (1.4.3)
+ loofah (~> 2.3)
+ railties (6.1.6)
+ actionpack (= 6.1.6)
+ activesupport (= 6.1.6)
+ method_source
+ rake (>= 12.2)
+ thor (~> 1.0)
+ rake (13.0.6)
+ responders (3.0.1)
+ actionpack (>= 5.0)
+ railties (>= 5.0)
+ rspec (3.10.0)
+ rspec-core (~> 3.10.0)
+ rspec-expectations (~> 3.10.0)
+ rspec-mocks (~> 3.10.0)
+ rspec-core (3.10.2)
+ rspec-support (~> 3.10.0)
+ rspec-expectations (3.10.2)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.10.0)
+ rspec-mocks (3.10.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.10.0)
+ rspec-support (3.10.3)
+ thor (1.2.1)
+ tzinfo (2.0.4)
+ concurrent-ruby (~> 1.0)
+ warden (1.2.9)
+ rack (>= 2.0.9)
+ zeitwerk (2.6.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ activemodel (~> 6.1, < 8)
+ devise-pbkdf2-encryptable!
+ rspec (~> 3.10.0)
+
+BUNDLED WITH
+ 2.3.16
diff --git a/vendor/gems/devise-pbkdf2-encryptable/LICENSE b/vendor/gems/devise-pbkdf2-encryptable/LICENSE
new file mode 100644
index 00000000000..d5a25c59027
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/LICENSE
@@ -0,0 +1,201 @@
+Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright 2012-2015 Plataformatec (opensource@plataformatec.com.br)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/vendor/gems/devise-pbkdf2-encryptable/devise-pbkdf2-encryptable.gemspec b/vendor/gems/devise-pbkdf2-encryptable/devise-pbkdf2-encryptable.gemspec
new file mode 100644
index 00000000000..e507633c0bf
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/devise-pbkdf2-encryptable.gemspec
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+lib = File.expand_path('lib', __dir__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+
+Gem::Specification.new do |spec|
+ spec.name = 'devise-pbkdf2-encryptable'
+ spec.authors = ['Drew Blessing']
+ spec.email = ['drew@gitlab.com']
+
+ spec.summary = 'Extension that allows Devise to use PBKDF2 password hashing'
+ spec.homepage = 'https://gitlab.com/gitlab-org/gitlab/-/tree/master/vendor/gems/devise-pbkdf2-encryptable'
+ spec.metadata = { 'source_code_uri' => 'https://gitlab.com/gitlab-org/gitlab/-/tree/master/vendor/gems/devise-pbkdf2-encryptable' }
+ spec.license = 'Apache-2.0'
+
+ spec.files = Dir['lib/**/*.rb']
+ spec.require_paths = ['lib']
+
+ spec.version = '0.0.0'
+
+ spec.add_runtime_dependency 'devise', '~> 4.0'
+
+ spec.add_development_dependency 'activemodel', '~> 6.1', '< 8'
+ spec.add_development_dependency 'rspec', '~> 3.10.0'
+end
diff --git a/vendor/gems/devise-pbkdf2-encryptable/lib/devise-pbkdf2-encryptable.rb b/vendor/gems/devise-pbkdf2-encryptable/lib/devise-pbkdf2-encryptable.rb
new file mode 100644
index 00000000000..4db9b82052f
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/lib/devise-pbkdf2-encryptable.rb
@@ -0,0 +1 @@
+require "devise/pbkdf2_encryptable/encryptable"
diff --git a/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptable.rb b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptable.rb
new file mode 100644
index 00000000000..027032f46c1
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptable.rb
@@ -0,0 +1,16 @@
+module Devise
+ # Used to define the password encryption algorithm.
+ mattr_accessor :encryptor
+ @@encryptor = nil
+
+ module Pbkdf2Encryptable
+ module Encryptors
+ InvalidHash = Class.new(StandardError)
+
+ autoload :Base, 'devise/pbkdf2_encryptable/encryptors/base'
+ autoload :Pbkdf2Sha512, 'devise/pbkdf2_encryptable/encryptors/pbkdf2_sha512'
+ end
+ end
+end
+
+Devise.add_module(:pbkdf2_encryptable, :model => 'devise/pbkdf2_encryptable/model')
diff --git a/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/base.rb b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/base.rb
new file mode 100644
index 00000000000..970be7f51a6
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/base.rb
@@ -0,0 +1,52 @@
+module Devise
+ module Pbkdf2Encryptable
+ module Encryptors
+ class Base
+ def self.split_digest(hash)
+ split_digest = hash.split('$')
+ _, strategy, stretches, salt, checksum = split_digest
+
+ unless split_digest.length == 5 && strategy.start_with?('pbkdf2-')
+ raise InvalidHash.new('invalid PBKDF2 hash')
+ end
+
+ { strategy: strategy, stretches: stretches.to_i,
+ salt: passlib_decode64(salt), checksum: passlib_decode64(checksum) }
+ end
+
+ # Passlib-style Base64 encoding:
+ # - Replaces '+' with '.'
+ # - Strips trailing newline and '=='
+ private_class_method def self.passlib_encode64(value)
+ Base64.strict_encode64([value].pack('H*')).tr('+', '.').delete('=')
+ end
+
+ private_class_method def self.passlib_decode64(value)
+ enc = value.tr('.', '+')
+ Base64.decode64(enc).unpack1('H*')
+ end
+
+ # Passlib-style hash: $pbkdf2-sha512$rounds$salt$checksum
+ # where salt and checksum are "adapted" Base64 encoded
+ private_class_method def self.format_hash(strategy, stretches, salt, checksum)
+ encoded_salt = passlib_encode64(salt)
+ encoded_checksum = passlib_encode64(checksum)
+
+ "$#{strategy}$#{stretches}$#{encoded_salt}$#{encoded_checksum}"
+ end
+
+ private_class_method def self.pbkdf2_checksum(hash, password, stretches, salt)
+ raise 'Stretches must be greater than zero' unless stretches.to_i > 0
+
+ OpenSSL::KDF.pbkdf2_hmac(
+ password.to_s,
+ salt: [salt].pack("H*"),
+ iterations: stretches,
+ hash: hash,
+ length: hash.digest_length
+ ).unpack1('H*')
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/pbkdf2_sha512.rb b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/pbkdf2_sha512.rb
new file mode 100644
index 00000000000..3fedc724c06
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/encryptors/pbkdf2_sha512.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Devise
+ module Pbkdf2Encryptable
+ module Encryptors
+ class Pbkdf2Sha512 < Base
+ STRATEGY = 'pbkdf2-sha512'
+ STRETCHES = 20_000
+
+ def self.compare(encrypted_password, password)
+ split_digest = self.split_digest(encrypted_password)
+ value_to_test = self.sha512_checksum(password, split_digest[:stretches], split_digest[:salt])
+
+ Devise.secure_compare(split_digest[:checksum], value_to_test)
+ end
+
+ def self.digest(password, stretches, salt)
+ checksum = sha512_checksum(password, stretches, salt)
+
+ format_hash(STRATEGY, stretches, salt, checksum)
+ end
+
+ def self.split_digest(hash)
+ split_digest = super
+
+ unless split_digest[:strategy] == STRATEGY
+ raise InvalidHash.new('invalid PBKDF2 SHA512 hash')
+ end
+
+ split_digest
+ end
+
+ private_class_method def self.sha512_checksum(password, stretches, salt)
+ hash = OpenSSL::Digest.new('SHA512')
+
+ pbkdf2_checksum(hash, password, stretches, salt)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/model.rb b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/model.rb
new file mode 100644
index 00000000000..06430b26db9
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/lib/devise/pbkdf2_encryptable/model.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'devise/strategies/database_authenticatable'
+
+# Based on `devise-encryptable` Encryptable model
+# https://github.com/heartcombo/devise-encryptable/blob/main/lib/devise/encryptable/model.rb
+module Devise
+ module Models
+ module Pbkdf2Encryptable
+ extend ActiveSupport::Concern
+
+ def valid_password?(password)
+ encryptor_class.compare(encrypted_password, password)
+ end
+
+ def password_strategy
+ split_encrypted_password[:strategy]&.tr('-', '_')&.to_sym
+ end
+
+ def password_salt
+ split_encrypted_password[:salt]
+ end
+
+ # Used by warden and other modules where there is a
+ # need for a random token based on the user password.
+ alias_method :authenticatable_salt, :password_salt
+
+ def password_stretches
+ split_encrypted_password[:stretches]
+ end
+
+ def password_checksum
+ split_encrypted_password[:checksum]
+ end
+
+ protected
+
+ # Used by Devise DatabaseAuthenticatable when setting a password
+ def password_digest(password)
+ remove_instance_variable('@split_encrypted_password') if defined?(@split_encrypted_password)
+
+ encryptor_class.digest(password, encryptor_class::STRETCHES, Devise.friendly_token[0, 16])
+ end
+
+ def encryptor_class
+ self.class.encryptor_class
+ end
+
+ private
+
+ def split_encrypted_password
+ return {} unless encrypted_password.present?
+ return @split_encrypted_password if defined?(@split_encrypted_password)
+
+ @split_encrypted_password = encryptor_class.split_digest(encrypted_password)
+ end
+
+ module ClassMethods
+ Devise::Models.config(self, :encryptor)
+
+ # Returns the class for the configured encryptor.
+ def encryptor_class
+ @encryptor_class ||= case encryptor
+ when :bcrypt
+ raise "In order to use bcrypt as encryptor, simply remove :pbkdf2_encryptable from your devise model"
+ when nil
+ raise "You need to specify an :encryptor in Devise configuration in order to use :pbkdf2_encryptable"
+ else
+ Devise::Pbkdf2Encryptable::Encryptors.const_get(encryptor.to_s.classify)
+ end
+ rescue NameError
+ raise "Configured encryptor '#{encryptor.to_sym}' could not be found for pbkdf2_encryptable"
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/encryptors/pbkdf2_sha512_spec.rb b/vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/encryptors/pbkdf2_sha512_spec.rb
new file mode 100644
index 00000000000..3a9b692db6e
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/encryptors/pbkdf2_sha512_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Devise::Pbkdf2Encryptable::Encryptors::Pbkdf2Sha512 do
+ let(:bcrypt_hash) { '$2a$12$ftnD4XSrhVdlEaEgCn/lxO0Pt3QplwgblmhCug3nSeRhh5a9UDBWK' }
+ let(:pbkdf2_sha512_hash) { '$pbkdf2-sha512$20000$boHGAw0hEyI$DBA67J7zNZebyzLtLk2X9wRDbmj1LNKVGnZLYyz6PGrIDGIl45fl/BPH0y1TPZnV90A20i.fD9C3G9Bp8jzzOA' }
+
+ describe '.compare' do
+ subject(:compare) { described_class.compare(encrypted_password, password) }
+
+ context 'with a PBKDF2+SHA512 encrypted password' do
+ let(:encrypted_password) { pbkdf2_sha512_hash }
+
+ context 'with a matching password' do
+ let(:password) { 'password' }
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'with an incorrect password' do
+ let(:password) { 'other_password' }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ context 'with a non PBKDF2+SHA512 encrypted password' do
+ let(:encrypted_password) { bcrypt_hash }
+ let(:password) { 'password' }
+
+ it 'raises an invalid hash error ' do
+ expect { compare }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash, 'invalid PBKDF2 hash'
+ end
+ end
+ end
+
+ describe '.digest' do
+ it 'returns a properly formatted and correct hash' do
+ expect(described_class.digest('password', 20000, '6e81c6030d211322')).to eq(pbkdf2_sha512_hash)
+ end
+
+ it 'raises an error if stretches is not greater than 0' do
+ expect { described_class.digest('password', 0, '6e81c6030d211322') }
+ .to raise_error('Stretches must be greater than zero')
+ end
+ end
+
+ describe '.split_digest' do
+ subject(:split_digest) { described_class.split_digest(digest) }
+
+ context 'with a PBKDF2+SHA512 digest' do
+ let(:digest) { pbkdf2_sha512_hash }
+
+ it { is_expected.to eq({
+ strategy: 'pbkdf2-sha512',
+ stretches: 20000,
+ salt: '6e81c6030d211322',
+ checksum: '0c103aec9ef335979bcb32ed2e4d97f704436e68f52cd2951a764b632cfa3c6ac80c6225e397e5fc13c7d32d533d99d5f74036d22f9f0fd0b71bd069f23cf338'
+ })
+ }
+ end
+
+ context 'with a PBKDF2+SHA256 digest' do
+ let(:digest) { '$pbkdf2-sha256$6400$.6UI/S.nXIk8jcbdHx3Fhg$98jZicV16ODfEsEZeYPGHU3kbrUrvUEXOPimVSQDD44' }
+
+ it 'raises invalid hash error' do
+ expect { split_digest }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash, 'invalid PBKDF2 SHA512 hash'
+ end
+ end
+
+ context 'with a BCrypt digest' do
+ let(:digest) { bcrypt_hash }
+
+ it 'raises invalid hash error' do
+ expect { split_digest }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash, 'invalid PBKDF2 hash'
+ end
+ end
+ end
+end
diff --git a/vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/model_spec.rb b/vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/model_spec.rb
new file mode 100644
index 00000000000..ebb94c1d68c
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/spec/lib/pbkdf2_encryptable/model_spec.rb
@@ -0,0 +1,127 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'active_model'
+
+RSpec.describe Devise::Models::Pbkdf2Encryptable do
+ let(:unconfigured_model) do
+ Class.new do
+ include ActiveModel::Model
+ extend ActiveModel::Callbacks
+ include ActiveModel::Validations::Callbacks
+ extend Devise::Models
+
+ define_model_callbacks :update, only: :after
+
+ devise :database_authenticatable, :pbkdf2_encryptable
+
+ attr_accessor :encrypted_password
+
+ def initialize(encrypted_password: '')
+ self.encrypted_password = encrypted_password
+ end
+ end
+ end
+
+ let(:bcrypt_configured_model) do
+ Class.new(unconfigured_model) do
+ devise :database_authenticatable, :pbkdf2_encryptable, encryptor: :bcrypt
+ end
+ end
+
+ let(:unknown_configured_model) do
+ Class.new(unconfigured_model) do
+ devise :database_authenticatable, :pbkdf2_encryptable, encryptor: :sha512
+ end
+ end
+
+ let(:configured_model) do
+ Class.new(unconfigured_model) do
+ devise :database_authenticatable, :pbkdf2_encryptable, encryptor: :pbkdf2_sha512
+ end
+ end
+
+ let(:user) { configured_model.new }
+ let(:pbkdf2_sha512_hash) { '$pbkdf2-sha512$20000$boHGAw0hEyI$DBA67J7zNZebyzLtLk2X9wRDbmj1LNKVGnZLYyz6PGrIDGIl45fl/BPH0y1TPZnV90A20i.fD9C3G9Bp8jzzOA' }
+
+ describe '#valid_password?' do
+ let(:user) { configured_model.new(encrypted_password: pbkdf2_sha512_hash) }
+
+ it 'validates a correct password' do
+ expect(user.valid_password?('password')).to eq(true)
+ end
+
+ it 'does not validate an incorrect password' do
+ expect(user.valid_password?('other_password')).to eq(false)
+ end
+ end
+
+ describe '#password=' do
+ it 'sets the correct encrypted_password value', :aggregate_failures do
+ expect(user.encrypted_password).to be_empty
+
+ user.password = 'password'
+
+ expect(user.encrypted_password).to start_with('$pbkdf2-sha512$')
+ end
+
+ it 'clears split digest memoization' do
+ user.encrypted_password = '$pbkdf2-sha512$1000$boHGAw0hEyI$DBA67J7zNZebyzLtLk2X9wRDbmj1LNKVGnZLYyz6PGrIDGIl45fl/BPH0y1TPZnV90A20i.fD9C3G9Bp8jzzOA'
+
+ expect(user.password_stretches).to eq(1_000)
+
+ user.password = 'other_password'
+
+ expect(user.password_stretches).to eq(20_000)
+ end
+ end
+
+ describe 'password_* methods' do
+ let(:user) { configured_model.new(encrypted_password: encrypted_password) }
+
+ context 'with a PBKDF2+SHA512 encrypted password' do
+ let(:encrypted_password) { pbkdf2_sha512_hash }
+
+ it 'extracts the correct split hash values', :aggregate_failures do
+ expect(Devise::Pbkdf2Encryptable::Encryptors::Pbkdf2Sha512).to receive(:split_digest).once.and_call_original
+
+ expect(user.password_strategy).to eq(:pbkdf2_sha512)
+ expect(user.password_salt).to eq('6e81c6030d211322')
+ expect(user.password_stretches).to eq(20_000)
+ expect(user.password_checksum).to eq('0c103aec9ef335979bcb32ed2e4d97f704436e68f52cd2951a764b632cfa3c6ac80c6225e397e5fc13c7d32d533d99d5f74036d22f9f0fd0b71bd069f23cf338')
+ end
+ end
+
+ context 'with a BCrypt encrypted password' do
+ let(:encrypted_password) { '$2a$10$xLTxCKOa75IU4RQGqqOrTuZOgZdJEzfSzjG6ZSEi/C31TB/yLZYpi' }
+
+ it 'raises errors', :aggregate_failures do
+ expect { user.password_strategy }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash
+ expect { user.password_salt }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash
+ expect { user.password_stretches }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash
+ expect { user.password_checksum }.to raise_error Devise::Pbkdf2Encryptable::Encryptors::InvalidHash
+ end
+ end
+ end
+
+ describe '.encryptor_class' do
+ it 'returns a class when configured' do
+ expect(configured_model.encryptor_class).to eq(Devise::Pbkdf2Encryptable::Encryptors::Pbkdf2Sha512)
+ end
+
+ it 'raises an error when unconfigured' do
+ expect { unconfigured_model.encryptor_class }
+ .to raise_error('You need to specify an :encryptor in Devise configuration in order to use :pbkdf2_encryptable')
+ end
+
+ it 'raises an error when BCrypt is configured' do
+ expect { bcrypt_configured_model.encryptor_class }
+ .to raise_error('In order to use bcrypt as encryptor, simply remove :pbkdf2_encryptable from your devise model')
+ end
+
+ it 'raises an error when a class cannot be found' do
+ expect { unknown_configured_model.encryptor_class }
+ .to raise_error("Configured encryptor 'sha512' could not be found for pbkdf2_encryptable")
+ end
+ end
+end
diff --git a/vendor/gems/devise-pbkdf2-encryptable/spec/spec_helper.rb b/vendor/gems/devise-pbkdf2-encryptable/spec/spec_helper.rb
new file mode 100644
index 00000000000..ced0cf6fdab
--- /dev/null
+++ b/vendor/gems/devise-pbkdf2-encryptable/spec/spec_helper.rb
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+require 'devise'
+require 'devise/pbkdf2_encryptable/encryptable'
diff --git a/vendor/gems/error_tracking_open_api/.gitignore b/vendor/gems/error_tracking_open_api/.gitignore
new file mode 100644
index 00000000000..05a17cb8f0a
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/.gitignore
@@ -0,0 +1,39 @@
+# Generated by: https://openapi-generator.tech
+#
+
+*.gem
+*.rbc
+/.config
+/coverage/
+/InstalledFiles
+/pkg/
+/spec/reports/
+/spec/examples.txt
+/test/tmp/
+/test/version_tmp/
+/tmp/
+
+## Specific to RubyMotion:
+.dat*
+.repl_history
+build/
+
+## Documentation cache and generated files:
+/.yardoc/
+/_yardoc/
+/doc/
+/rdoc/
+
+## Environment normalization:
+/.bundle/
+/vendor/bundle
+/lib/bundler/man/
+
+# for a library or gem, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# Gemfile.lock
+# .ruby-version
+# .ruby-gemset
+
+# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
+.rvmrc
diff --git a/vendor/gems/error_tracking_open_api/.openapi-generator-ignore b/vendor/gems/error_tracking_open_api/.openapi-generator-ignore
new file mode 100644
index 00000000000..7484ee590a3
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/vendor/gems/error_tracking_open_api/.openapi-generator/FILES b/vendor/gems/error_tracking_open_api/.openapi-generator/FILES
new file mode 100644
index 00000000000..cf42a5d9e36
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/.openapi-generator/FILES
@@ -0,0 +1,36 @@
+.gitignore
+.openapi-generator-ignore
+.rspec
+.rubocop.yml
+.travis.yml
+Gemfile
+README.md
+Rakefile
+docs/Error.md
+docs/ErrorEvent.md
+docs/ErrorUpdatePayload.md
+docs/ErrorsApi.md
+docs/EventsApi.md
+docs/ProjectsApi.md
+error_tracking_open_api.gemspec
+git_push.sh
+lib/error_tracking_open_api.rb
+lib/error_tracking_open_api/api/errors_api.rb
+lib/error_tracking_open_api/api/events_api.rb
+lib/error_tracking_open_api/api/projects_api.rb
+lib/error_tracking_open_api/api_client.rb
+lib/error_tracking_open_api/api_error.rb
+lib/error_tracking_open_api/configuration.rb
+lib/error_tracking_open_api/models/error.rb
+lib/error_tracking_open_api/models/error_event.rb
+lib/error_tracking_open_api/models/error_update_payload.rb
+lib/error_tracking_open_api/version.rb
+spec/api/errors_api_spec.rb
+spec/api/events_api_spec.rb
+spec/api/projects_api_spec.rb
+spec/api_client_spec.rb
+spec/configuration_spec.rb
+spec/models/error_event_spec.rb
+spec/models/error_spec.rb
+spec/models/error_update_payload_spec.rb
+spec/spec_helper.rb
diff --git a/vendor/gems/error_tracking_open_api/.openapi-generator/VERSION b/vendor/gems/error_tracking_open_api/.openapi-generator/VERSION
new file mode 100644
index 00000000000..f4965a313a2
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/.openapi-generator/VERSION
@@ -0,0 +1 @@
+6.0.0 \ No newline at end of file
diff --git a/vendor/gems/error_tracking_open_api/LICENSE b/vendor/gems/error_tracking_open_api/LICENSE
new file mode 100644
index 00000000000..aafb7f79450
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/LICENSE
@@ -0,0 +1,7 @@
+Copyright 2022 GitLab B.V.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/gems/error_tracking_open_api/README.md b/vendor/gems/error_tracking_open_api/README.md
new file mode 100644
index 00000000000..18757e2e183
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/README.md
@@ -0,0 +1,103 @@
+# Generated by `rake gems:error_tracking_open_api:generate` on 2022-07-14
+
+See https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/rake_tasks.md#update-openapi-client-for-error-tracking-feature
+
+# error_tracking_open_api
+
+ErrorTrackingOpenAPI - the Ruby gem for the Error Trackig REST API
+
+This schema describes the API endpoints for the error tracking feature
+
+This SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
+
+- API version: 0.0.1
+- Package version: 1.0.0
+- Build package: org.openapitools.codegen.languages.RubyClientCodegen
+
+## Installation
+
+### Build a gem
+
+To build the Ruby code into a gem:
+
+```shell
+gem build error_tracking_open_api.gemspec
+```
+
+Then either install the gem locally:
+
+```shell
+gem install ./error_tracking_open_api-1.0.0.gem
+```
+
+(for development, run `gem install --dev ./error_tracking_open_api-1.0.0.gem` to install the development dependencies)
+
+or publish the gem to a gem hosting service, e.g. [RubyGems](https://rubygems.org/).
+
+Finally add this to the Gemfile:
+
+ gem 'error_tracking_open_api', '~> 1.0.0'
+
+### Install from Git
+
+If the Ruby gem is hosted at a git repository: https://github.com/GIT_USER_ID/GIT_REPO_ID, then add the following in the Gemfile:
+
+ gem 'error_tracking_open_api', :git => 'https://github.com/GIT_USER_ID/GIT_REPO_ID.git'
+
+### Include the Ruby code directly
+
+Include the Ruby code directly using `-I` as follows:
+
+```shell
+ruby -Ilib script.rb
+```
+
+## Getting Started
+
+Please follow the [installation](#installation) procedure and then run the following code:
+
+```ruby
+# Load the gem
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::ErrorsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+fingerprint = 56 # Integer | ID of the error that needs to be updated deleted
+
+begin
+ #Get information about the error
+ result = api_instance.get_error(project_id, fingerprint)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Exception when calling ErrorsApi->get_error: #{e}"
+end
+
+```
+
+## Documentation for API Endpoints
+
+All URIs are relative to *https://localhost/errortracking/api/v1*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*ErrorTrackingOpenAPI::ErrorsApi* | [**get_error**](docs/ErrorsApi.md#get_error) | **GET** /projects/{projectId}/errors/{fingerprint} | Get information about the error
+*ErrorTrackingOpenAPI::ErrorsApi* | [**list_errors**](docs/ErrorsApi.md#list_errors) | **GET** /projects/{projectId}/errors | List of errors
+*ErrorTrackingOpenAPI::ErrorsApi* | [**list_events**](docs/ErrorsApi.md#list_events) | **GET** /projects/{projectId}/errors/{fingerprint}/events | Get information about the events related to the error
+*ErrorTrackingOpenAPI::ErrorsApi* | [**update_error**](docs/ErrorsApi.md#update_error) | **PUT** /projects/{projectId}/errors/{fingerprint} | Update the status of the error
+*ErrorTrackingOpenAPI::EventsApi* | [**list_events**](docs/EventsApi.md#list_events) | **GET** /projects/{projectId}/errors/{fingerprint}/events | Get information about the events related to the error
+*ErrorTrackingOpenAPI::EventsApi* | [**projects_api_project_id_envelope_post**](docs/EventsApi.md#projects_api_project_id_envelope_post) | **POST** /projects/api/{projectId}/envelope | Ingestion endpoint for error events sent from client SDKs
+*ErrorTrackingOpenAPI::EventsApi* | [**projects_api_project_id_store_post**](docs/EventsApi.md#projects_api_project_id_store_post) | **POST** /projects/api/{projectId}/store | Ingestion endpoint for error events sent from client SDKs
+*ErrorTrackingOpenAPI::ProjectsApi* | [**delete_project**](docs/ProjectsApi.md#delete_project) | **DELETE** /projects/{id} | Deletes all project related data. Mostly for testing purposes and later for production to clean updeleted projects.
+
+
+## Documentation for Models
+
+ - [ErrorTrackingOpenAPI::Error](docs/Error.md)
+ - [ErrorTrackingOpenAPI::ErrorEvent](docs/ErrorEvent.md)
+ - [ErrorTrackingOpenAPI::ErrorUpdatePayload](docs/ErrorUpdatePayload.md)
+
+
+## Documentation for Authorization
+
+ All endpoints do not require authorization.
+
diff --git a/vendor/gems/error_tracking_open_api/Rakefile b/vendor/gems/error_tracking_open_api/Rakefile
new file mode 100644
index 00000000000..c72ca30d454
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/Rakefile
@@ -0,0 +1,10 @@
+require "bundler/gem_tasks"
+
+begin
+ require 'rspec/core/rake_task'
+
+ RSpec::Core::RakeTask.new(:spec)
+ task default: :spec
+rescue LoadError
+ # no rspec available
+end
diff --git a/vendor/gems/error_tracking_open_api/docs/Error.md b/vendor/gems/error_tracking_open_api/docs/Error.md
new file mode 100644
index 00000000000..45aa4cf6b8a
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/docs/Error.md
@@ -0,0 +1,36 @@
+# ErrorTrackingOpenAPI::Error
+
+## Properties
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **fingerprint** | **Integer** | | [optional] |
+| **project_id** | **Integer** | | [optional] |
+| **name** | **String** | | [optional] |
+| **description** | **String** | | [optional] |
+| **actor** | **String** | | [optional] |
+| **event_count** | **Integer** | | [optional] |
+| **approximated_user_count** | **Integer** | | [optional] |
+| **last_seen_at** | **Time** | | [optional] |
+| **first_seen_at** | **Time** | | [optional] |
+| **status** | **String** | Status of the error | [optional] |
+
+## Example
+
+```ruby
+require 'error_tracking_open_api'
+
+instance = ErrorTrackingOpenAPI::Error.new(
+ fingerprint: null,
+ project_id: null,
+ name: ActionView::MissingTemplate,
+ description: Missing template posts/edit,
+ actor: PostsController#edit,
+ event_count: null,
+ approximated_user_count: null,
+ last_seen_at: null,
+ first_seen_at: null,
+ status: null
+)
+```
+
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorEvent.md b/vendor/gems/error_tracking_open_api/docs/ErrorEvent.md
new file mode 100644
index 00000000000..205b7b57cc9
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/docs/ErrorEvent.md
@@ -0,0 +1,32 @@
+# ErrorTrackingOpenAPI::ErrorEvent
+
+## Properties
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **fingerprint** | **Integer** | | [optional] |
+| **project_id** | **Integer** | | [optional] |
+| **payload** | **String** | JSON encoded string | [optional] |
+| **name** | **String** | | [optional] |
+| **description** | **String** | | [optional] |
+| **actor** | **String** | | [optional] |
+| **environment** | **String** | | [optional] |
+| **platform** | **String** | | [optional] |
+
+## Example
+
+```ruby
+require 'error_tracking_open_api'
+
+instance = ErrorTrackingOpenAPI::ErrorEvent.new(
+ fingerprint: null,
+ project_id: null,
+ payload: null,
+ name: ActionView::MissingTemplate,
+ description: Missing template posts/edit,
+ actor: PostsController#edit,
+ environment: production,
+ platform: ruby
+)
+```
+
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorUpdatePayload.md b/vendor/gems/error_tracking_open_api/docs/ErrorUpdatePayload.md
new file mode 100644
index 00000000000..8a6180f835e
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/docs/ErrorUpdatePayload.md
@@ -0,0 +1,20 @@
+# ErrorTrackingOpenAPI::ErrorUpdatePayload
+
+## Properties
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **status** | **String** | Status of the error | [optional] |
+| **updated_by_id** | **Integer** | GitLab user id who triggered the update | [optional] |
+
+## Example
+
+```ruby
+require 'error_tracking_open_api'
+
+instance = ErrorTrackingOpenAPI::ErrorUpdatePayload.new(
+ status: null,
+ updated_by_id: null
+)
+```
+
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorsApi.md b/vendor/gems/error_tracking_open_api/docs/ErrorsApi.md
new file mode 100644
index 00000000000..79d0c2a46de
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/docs/ErrorsApi.md
@@ -0,0 +1,287 @@
+# ErrorTrackingOpenAPI::ErrorsApi
+
+All URIs are relative to *https://localhost/errortracking/api/v1*
+
+| Method | HTTP request | Description |
+| ------ | ------------ | ----------- |
+| [**get_error**](ErrorsApi.md#get_error) | **GET** /projects/{projectId}/errors/{fingerprint} | Get information about the error |
+| [**list_errors**](ErrorsApi.md#list_errors) | **GET** /projects/{projectId}/errors | List of errors |
+| [**list_events**](ErrorsApi.md#list_events) | **GET** /projects/{projectId}/errors/{fingerprint}/events | Get information about the events related to the error |
+| [**update_error**](ErrorsApi.md#update_error) | **PUT** /projects/{projectId}/errors/{fingerprint} | Update the status of the error |
+
+
+## get_error
+
+> <Error> get_error(project_id, fingerprint)
+
+Get information about the error
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::ErrorsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+fingerprint = 56 # Integer | ID of the error that needs to be updated deleted
+
+begin
+ # Get information about the error
+ result = api_instance.get_error(project_id, fingerprint)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->get_error: #{e}"
+end
+```
+
+#### Using the get_error_with_http_info variant
+
+This returns an Array which contains the response data, status code and headers.
+
+> <Array(<Error>, Integer, Hash)> get_error_with_http_info(project_id, fingerprint)
+
+```ruby
+begin
+ # Get information about the error
+ data, status_code, headers = api_instance.get_error_with_http_info(project_id, fingerprint)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => <Error>
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->get_error_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **project_id** | **Integer** | ID of the project where the error was created | |
+| **fingerprint** | **Integer** | ID of the error that needs to be updated deleted | |
+
+### Return type
+
+[**Error**](Error.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: */*
+
+
+## list_errors
+
+> <Array<Error>> list_errors(project_id, opts)
+
+List of errors
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::ErrorsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+opts = {
+ sort: 'last_seen_desc', # String |
+ status: 'unresolved', # String |
+ query: 'query_example', # String |
+ cursor: 'cursor_example', # String | Base64 encoded information for pagination
+ limit: 56 # Integer | Number of entries to return
+}
+
+begin
+ # List of errors
+ result = api_instance.list_errors(project_id, opts)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->list_errors: #{e}"
+end
+```
+
+#### Using the list_errors_with_http_info variant
+
+This returns an Array which contains the response data, status code and headers.
+
+> <Array(<Array<Error>>, Integer, Hash)> list_errors_with_http_info(project_id, opts)
+
+```ruby
+begin
+ # List of errors
+ data, status_code, headers = api_instance.list_errors_with_http_info(project_id, opts)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => <Array<Error>>
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->list_errors_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **project_id** | **Integer** | ID of the project where the error was created | |
+| **sort** | **String** | | [optional][default to &#39;last_seen_desc&#39;] |
+| **status** | **String** | | [optional][default to &#39;unresolved&#39;] |
+| **query** | **String** | | [optional] |
+| **cursor** | **String** | Base64 encoded information for pagination | [optional] |
+| **limit** | **Integer** | Number of entries to return | [optional][default to 20] |
+
+### Return type
+
+[**Array&lt;Error&gt;**](Error.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: */*
+
+
+## list_events
+
+> <Array<ErrorEvent>> list_events(project_id, fingerprint, opts)
+
+Get information about the events related to the error
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::ErrorsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+fingerprint = 56 # Integer | ID of the error within the project
+opts = {
+ sort: 'occurred_at_asc', # String |
+ cursor: 'cursor_example', # String | Base64 encoded information for pagination
+ limit: 56 # Integer | Number of entries to return
+}
+
+begin
+ # Get information about the events related to the error
+ result = api_instance.list_events(project_id, fingerprint, opts)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->list_events: #{e}"
+end
+```
+
+#### Using the list_events_with_http_info variant
+
+This returns an Array which contains the response data, status code and headers.
+
+> <Array(<Array<ErrorEvent>>, Integer, Hash)> list_events_with_http_info(project_id, fingerprint, opts)
+
+```ruby
+begin
+ # Get information about the events related to the error
+ data, status_code, headers = api_instance.list_events_with_http_info(project_id, fingerprint, opts)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => <Array<ErrorEvent>>
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->list_events_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **project_id** | **Integer** | ID of the project where the error was created | |
+| **fingerprint** | **Integer** | ID of the error within the project | |
+| **sort** | **String** | | [optional][default to &#39;occurred_at_asc&#39;] |
+| **cursor** | **String** | Base64 encoded information for pagination | [optional] |
+| **limit** | **Integer** | Number of entries to return | [optional][default to 20] |
+
+### Return type
+
+[**Array&lt;ErrorEvent&gt;**](ErrorEvent.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: */*
+
+
+## update_error
+
+> <Error> update_error(project_id, fingerprint, body)
+
+Update the status of the error
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::ErrorsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+fingerprint = 56 # Integer | ID of the error that needs to be updated deleted
+body = ErrorTrackingOpenAPI::ErrorUpdatePayload.new # ErrorUpdatePayload | Error update object with the new values
+
+begin
+ # Update the status of the error
+ result = api_instance.update_error(project_id, fingerprint, body)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->update_error: #{e}"
+end
+```
+
+#### Using the update_error_with_http_info variant
+
+This returns an Array which contains the response data, status code and headers.
+
+> <Array(<Error>, Integer, Hash)> update_error_with_http_info(project_id, fingerprint, body)
+
+```ruby
+begin
+ # Update the status of the error
+ data, status_code, headers = api_instance.update_error_with_http_info(project_id, fingerprint, body)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => <Error>
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ErrorsApi->update_error_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **project_id** | **Integer** | ID of the project where the error was created | |
+| **fingerprint** | **Integer** | ID of the error that needs to be updated deleted | |
+| **body** | [**ErrorUpdatePayload**](ErrorUpdatePayload.md) | Error update object with the new values | |
+
+### Return type
+
+[**Error**](Error.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
diff --git a/vendor/gems/error_tracking_open_api/docs/EventsApi.md b/vendor/gems/error_tracking_open_api/docs/EventsApi.md
new file mode 100644
index 00000000000..3b4586be611
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/docs/EventsApi.md
@@ -0,0 +1,206 @@
+# ErrorTrackingOpenAPI::EventsApi
+
+All URIs are relative to *https://localhost/errortracking/api/v1*
+
+| Method | HTTP request | Description |
+| ------ | ------------ | ----------- |
+| [**list_events**](EventsApi.md#list_events) | **GET** /projects/{projectId}/errors/{fingerprint}/events | Get information about the events related to the error |
+| [**projects_api_project_id_envelope_post**](EventsApi.md#projects_api_project_id_envelope_post) | **POST** /projects/api/{projectId}/envelope | Ingestion endpoint for error events sent from client SDKs |
+| [**projects_api_project_id_store_post**](EventsApi.md#projects_api_project_id_store_post) | **POST** /projects/api/{projectId}/store | Ingestion endpoint for error events sent from client SDKs |
+
+
+## list_events
+
+> <Array<ErrorEvent>> list_events(project_id, fingerprint, opts)
+
+Get information about the events related to the error
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::EventsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+fingerprint = 56 # Integer | ID of the error within the project
+opts = {
+ sort: 'occurred_at_asc', # String |
+ cursor: 'cursor_example', # String | Base64 encoded information for pagination
+ limit: 56 # Integer | Number of entries to return
+}
+
+begin
+ # Get information about the events related to the error
+ result = api_instance.list_events(project_id, fingerprint, opts)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling EventsApi->list_events: #{e}"
+end
+```
+
+#### Using the list_events_with_http_info variant
+
+This returns an Array which contains the response data, status code and headers.
+
+> <Array(<Array<ErrorEvent>>, Integer, Hash)> list_events_with_http_info(project_id, fingerprint, opts)
+
+```ruby
+begin
+ # Get information about the events related to the error
+ data, status_code, headers = api_instance.list_events_with_http_info(project_id, fingerprint, opts)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => <Array<ErrorEvent>>
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling EventsApi->list_events_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **project_id** | **Integer** | ID of the project where the error was created | |
+| **fingerprint** | **Integer** | ID of the error within the project | |
+| **sort** | **String** | | [optional][default to &#39;occurred_at_asc&#39;] |
+| **cursor** | **String** | Base64 encoded information for pagination | [optional] |
+| **limit** | **Integer** | Number of entries to return | [optional][default to 20] |
+
+### Return type
+
+[**Array&lt;ErrorEvent&gt;**](ErrorEvent.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: */*
+
+
+## projects_api_project_id_envelope_post
+
+> <ErrorEvent> projects_api_project_id_envelope_post(project_id)
+
+Ingestion endpoint for error events sent from client SDKs
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::EventsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+
+begin
+ # Ingestion endpoint for error events sent from client SDKs
+ result = api_instance.projects_api_project_id_envelope_post(project_id)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling EventsApi->projects_api_project_id_envelope_post: #{e}"
+end
+```
+
+#### Using the projects_api_project_id_envelope_post_with_http_info variant
+
+This returns an Array which contains the response data, status code and headers.
+
+> <Array(<ErrorEvent>, Integer, Hash)> projects_api_project_id_envelope_post_with_http_info(project_id)
+
+```ruby
+begin
+ # Ingestion endpoint for error events sent from client SDKs
+ data, status_code, headers = api_instance.projects_api_project_id_envelope_post_with_http_info(project_id)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => <ErrorEvent>
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling EventsApi->projects_api_project_id_envelope_post_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **project_id** | **Integer** | ID of the project where the error was created | |
+
+### Return type
+
+[**ErrorEvent**](ErrorEvent.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: */*
+
+
+## projects_api_project_id_store_post
+
+> <ErrorEvent> projects_api_project_id_store_post(project_id)
+
+Ingestion endpoint for error events sent from client SDKs
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::EventsApi.new
+project_id = 56 # Integer | ID of the project where the error was created
+
+begin
+ # Ingestion endpoint for error events sent from client SDKs
+ result = api_instance.projects_api_project_id_store_post(project_id)
+ p result
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling EventsApi->projects_api_project_id_store_post: #{e}"
+end
+```
+
+#### Using the projects_api_project_id_store_post_with_http_info variant
+
+This returns an Array which contains the response data, status code and headers.
+
+> <Array(<ErrorEvent>, Integer, Hash)> projects_api_project_id_store_post_with_http_info(project_id)
+
+```ruby
+begin
+ # Ingestion endpoint for error events sent from client SDKs
+ data, status_code, headers = api_instance.projects_api_project_id_store_post_with_http_info(project_id)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => <ErrorEvent>
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling EventsApi->projects_api_project_id_store_post_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **project_id** | **Integer** | ID of the project where the error was created | |
+
+### Return type
+
+[**ErrorEvent**](ErrorEvent.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: */*
+
diff --git a/vendor/gems/error_tracking_open_api/docs/ProjectsApi.md b/vendor/gems/error_tracking_open_api/docs/ProjectsApi.md
new file mode 100644
index 00000000000..e6397b23f8f
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/docs/ProjectsApi.md
@@ -0,0 +1,69 @@
+# ErrorTrackingOpenAPI::ProjectsApi
+
+All URIs are relative to *https://localhost/errortracking/api/v1*
+
+| Method | HTTP request | Description |
+| ------ | ------------ | ----------- |
+| [**delete_project**](ProjectsApi.md#delete_project) | **DELETE** /projects/{id} | Deletes all project related data. Mostly for testing purposes and later for production to clean updeleted projects. |
+
+
+## delete_project
+
+> delete_project(id)
+
+Deletes all project related data. Mostly for testing purposes and later for production to clean updeleted projects.
+
+### Examples
+
+```ruby
+require 'time'
+require 'error_tracking_open_api'
+
+api_instance = ErrorTrackingOpenAPI::ProjectsApi.new
+id = 56 # Integer | ID of the project
+
+begin
+ # Deletes all project related data. Mostly for testing purposes and later for production to clean updeleted projects.
+ api_instance.delete_project(id)
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ProjectsApi->delete_project: #{e}"
+end
+```
+
+#### Using the delete_project_with_http_info variant
+
+This returns an Array which contains the response data (`nil` in this case), status code and headers.
+
+> <Array(nil, Integer, Hash)> delete_project_with_http_info(id)
+
+```ruby
+begin
+ # Deletes all project related data. Mostly for testing purposes and later for production to clean updeleted projects.
+ data, status_code, headers = api_instance.delete_project_with_http_info(id)
+ p status_code # => 2xx
+ p headers # => { ... }
+ p data # => nil
+rescue ErrorTrackingOpenAPI::ApiError => e
+ puts "Error when calling ProjectsApi->delete_project_with_http_info: #{e}"
+end
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+| ---- | ---- | ----------- | ----- |
+| **id** | **Integer** | ID of the project | |
+
+### Return type
+
+nil (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
diff --git a/vendor/gems/error_tracking_open_api/error_tracking_open_api.gemspec b/vendor/gems/error_tracking_open_api/error_tracking_open_api.gemspec
new file mode 100644
index 00000000000..45f07204725
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/error_tracking_open_api.gemspec
@@ -0,0 +1,38 @@
+# -*- encoding: utf-8 -*-
+
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+$:.push File.expand_path("../lib", __FILE__)
+require "error_tracking_open_api/version"
+
+Gem::Specification.new do |s|
+ s.name = "error_tracking_open_api"
+ s.version = ErrorTrackingOpenAPI::VERSION
+ s.platform = Gem::Platform::RUBY
+ s.authors = ["OpenAPI-Generator"]
+ s.email = [""]
+ s.homepage = "https://openapi-generator.tech"
+ s.summary = "Error Trackig REST API Ruby Gem"
+ s.description = "This schema describes the API endpoints for the error tracking feature"
+ s.license = "MIT"
+ s.required_ruby_version = ">= 2.4"
+
+ s.add_runtime_dependency 'typhoeus', '~> 1.0', '>= 1.0.1'
+
+ s.add_development_dependency 'rspec', '~> 3.6', '>= 3.6.0'
+
+ s.files = Dir.glob("lib/**/*")
+ s.test_files = []
+ s.executables = []
+ s.require_paths = ["lib"]
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api.rb
new file mode 100644
index 00000000000..9107f44414d
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api.rb
@@ -0,0 +1,45 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+# Common files
+require 'error_tracking_open_api/api_client'
+require 'error_tracking_open_api/api_error'
+require 'error_tracking_open_api/version'
+require 'error_tracking_open_api/configuration'
+
+# Models
+require 'error_tracking_open_api/models/error'
+require 'error_tracking_open_api/models/error_event'
+require 'error_tracking_open_api/models/error_update_payload'
+
+# APIs
+require 'error_tracking_open_api/api/errors_api'
+require 'error_tracking_open_api/api/events_api'
+require 'error_tracking_open_api/api/projects_api'
+
+module ErrorTrackingOpenAPI
+ class << self
+ # Customize default settings for the SDK using block.
+ # ErrorTrackingOpenAPI.configure do |config|
+ # config.username = "xxx"
+ # config.password = "xxx"
+ # end
+ # If no block given, return the default Configuration object.
+ def configure
+ if block_given?
+ yield(Configuration.default)
+ else
+ Configuration.default
+ end
+ end
+ end
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb
new file mode 100644
index 00000000000..f21d3c51baf
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb
@@ -0,0 +1,347 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+require 'cgi'
+
+module ErrorTrackingOpenAPI
+ class ErrorsApi
+ attr_accessor :api_client
+
+ def initialize(api_client = ApiClient.default)
+ @api_client = api_client
+ end
+ # Get information about the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error that needs to be updated deleted
+ # @param [Hash] opts the optional parameters
+ # @return [Error]
+ def get_error(project_id, fingerprint, opts = {})
+ data, _status_code, _headers = get_error_with_http_info(project_id, fingerprint, opts)
+ data
+ end
+
+ # Get information about the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error that needs to be updated deleted
+ # @param [Hash] opts the optional parameters
+ # @return [Array<(Error, Integer, Hash)>] Error data, response status code and response headers
+ def get_error_with_http_info(project_id, fingerprint, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: ErrorsApi.get_error ...'
+ end
+ # verify the required parameter 'project_id' is set
+ if @api_client.config.client_side_validation && project_id.nil?
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ErrorsApi.get_error"
+ end
+ # verify the required parameter 'fingerprint' is set
+ if @api_client.config.client_side_validation && fingerprint.nil?
+ fail ArgumentError, "Missing the required parameter 'fingerprint' when calling ErrorsApi.get_error"
+ end
+ # resource path
+ local_var_path = '/projects/{projectId}/errors/{fingerprint}'.sub('{' + 'projectId' + '}', CGI.escape(project_id.to_s)).sub('{' + 'fingerprint' + '}', CGI.escape(fingerprint.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+ # HTTP header 'Accept' (if needed)
+ header_params['Accept'] = @api_client.select_header_accept(['*/*'])
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body]
+
+ # return_type
+ return_type = opts[:debug_return_type] || 'Error'
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"ErrorsApi.get_error",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: ErrorsApi#get_error\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+
+ # List of errors
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param [Hash] opts the optional parameters
+ # @option opts [String] :sort (default to 'last_seen_desc')
+ # @option opts [String] :status (default to 'unresolved')
+ # @option opts [String] :query
+ # @option opts [String] :cursor Base64 encoded information for pagination
+ # @option opts [Integer] :limit Number of entries to return (default to 20)
+ # @return [Array<Error>]
+ def list_errors(project_id, opts = {})
+ data, _status_code, _headers = list_errors_with_http_info(project_id, opts)
+ data
+ end
+
+ # List of errors
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param [Hash] opts the optional parameters
+ # @option opts [String] :sort (default to 'last_seen_desc')
+ # @option opts [String] :status (default to 'unresolved')
+ # @option opts [String] :query
+ # @option opts [String] :cursor Base64 encoded information for pagination
+ # @option opts [Integer] :limit Number of entries to return (default to 20)
+ # @return [Array<(Array<Error>, Integer, Hash)>] Array<Error> data, response status code and response headers
+ def list_errors_with_http_info(project_id, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: ErrorsApi.list_errors ...'
+ end
+ # verify the required parameter 'project_id' is set
+ if @api_client.config.client_side_validation && project_id.nil?
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ErrorsApi.list_errors"
+ end
+ allowable_values = ["last_seen_desc", "first_seen_desc", "frequency_desc"]
+ if @api_client.config.client_side_validation && opts[:'sort'] && !allowable_values.include?(opts[:'sort'])
+ fail ArgumentError, "invalid value for \"sort\", must be one of #{allowable_values}"
+ end
+ allowable_values = ["unresolved", "resolved", "ignored"]
+ if @api_client.config.client_side_validation && opts[:'status'] && !allowable_values.include?(opts[:'status'])
+ fail ArgumentError, "invalid value for \"status\", must be one of #{allowable_values}"
+ end
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling ErrorsApi.list_errors, must be smaller than or equal to 100.'
+ end
+
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling ErrorsApi.list_errors, must be greater than or equal to 1.'
+ end
+
+ # resource path
+ local_var_path = '/projects/{projectId}/errors'.sub('{' + 'projectId' + '}', CGI.escape(project_id.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+ query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil?
+ query_params[:'status'] = opts[:'status'] if !opts[:'status'].nil?
+ query_params[:'query'] = opts[:'query'] if !opts[:'query'].nil?
+ query_params[:'cursor'] = opts[:'cursor'] if !opts[:'cursor'].nil?
+ query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+ # HTTP header 'Accept' (if needed)
+ header_params['Accept'] = @api_client.select_header_accept(['*/*'])
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body]
+
+ # return_type
+ return_type = opts[:debug_return_type] || 'Array<Error>'
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"ErrorsApi.list_errors",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: ErrorsApi#list_errors\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+
+ # Get information about the events related to the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error within the project
+ # @param [Hash] opts the optional parameters
+ # @option opts [String] :sort (default to 'occurred_at_asc')
+ # @option opts [String] :cursor Base64 encoded information for pagination
+ # @option opts [Integer] :limit Number of entries to return (default to 20)
+ # @return [Array<ErrorEvent>]
+ def list_events(project_id, fingerprint, opts = {})
+ data, _status_code, _headers = list_events_with_http_info(project_id, fingerprint, opts)
+ data
+ end
+
+ # Get information about the events related to the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error within the project
+ # @param [Hash] opts the optional parameters
+ # @option opts [String] :sort (default to 'occurred_at_asc')
+ # @option opts [String] :cursor Base64 encoded information for pagination
+ # @option opts [Integer] :limit Number of entries to return (default to 20)
+ # @return [Array<(Array<ErrorEvent>, Integer, Hash)>] Array<ErrorEvent> data, response status code and response headers
+ def list_events_with_http_info(project_id, fingerprint, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: ErrorsApi.list_events ...'
+ end
+ # verify the required parameter 'project_id' is set
+ if @api_client.config.client_side_validation && project_id.nil?
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ErrorsApi.list_events"
+ end
+ # verify the required parameter 'fingerprint' is set
+ if @api_client.config.client_side_validation && fingerprint.nil?
+ fail ArgumentError, "Missing the required parameter 'fingerprint' when calling ErrorsApi.list_events"
+ end
+ allowable_values = ["occurred_at_asc", "occurred_at_desc"]
+ if @api_client.config.client_side_validation && opts[:'sort'] && !allowable_values.include?(opts[:'sort'])
+ fail ArgumentError, "invalid value for \"sort\", must be one of #{allowable_values}"
+ end
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling ErrorsApi.list_events, must be smaller than or equal to 100.'
+ end
+
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling ErrorsApi.list_events, must be greater than or equal to 1.'
+ end
+
+ # resource path
+ local_var_path = '/projects/{projectId}/errors/{fingerprint}/events'.sub('{' + 'projectId' + '}', CGI.escape(project_id.to_s)).sub('{' + 'fingerprint' + '}', CGI.escape(fingerprint.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+ query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil?
+ query_params[:'cursor'] = opts[:'cursor'] if !opts[:'cursor'].nil?
+ query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+ # HTTP header 'Accept' (if needed)
+ header_params['Accept'] = @api_client.select_header_accept(['*/*'])
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body]
+
+ # return_type
+ return_type = opts[:debug_return_type] || 'Array<ErrorEvent>'
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"ErrorsApi.list_events",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: ErrorsApi#list_events\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+
+ # Update the status of the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error that needs to be updated deleted
+ # @param body [ErrorUpdatePayload] Error update object with the new values
+ # @param [Hash] opts the optional parameters
+ # @return [Error]
+ def update_error(project_id, fingerprint, body, opts = {})
+ data, _status_code, _headers = update_error_with_http_info(project_id, fingerprint, body, opts)
+ data
+ end
+
+ # Update the status of the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error that needs to be updated deleted
+ # @param body [ErrorUpdatePayload] Error update object with the new values
+ # @param [Hash] opts the optional parameters
+ # @return [Array<(Error, Integer, Hash)>] Error data, response status code and response headers
+ def update_error_with_http_info(project_id, fingerprint, body, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: ErrorsApi.update_error ...'
+ end
+ # verify the required parameter 'project_id' is set
+ if @api_client.config.client_side_validation && project_id.nil?
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ErrorsApi.update_error"
+ end
+ # verify the required parameter 'fingerprint' is set
+ if @api_client.config.client_side_validation && fingerprint.nil?
+ fail ArgumentError, "Missing the required parameter 'fingerprint' when calling ErrorsApi.update_error"
+ end
+ # verify the required parameter 'body' is set
+ if @api_client.config.client_side_validation && body.nil?
+ fail ArgumentError, "Missing the required parameter 'body' when calling ErrorsApi.update_error"
+ end
+ # resource path
+ local_var_path = '/projects/{projectId}/errors/{fingerprint}'.sub('{' + 'projectId' + '}', CGI.escape(project_id.to_s)).sub('{' + 'fingerprint' + '}', CGI.escape(fingerprint.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+ # HTTP header 'Accept' (if needed)
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
+ # HTTP header 'Content-Type'
+ content_type = @api_client.select_header_content_type(['application/json'])
+ if !content_type.nil?
+ header_params['Content-Type'] = content_type
+ end
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body] || @api_client.object_to_http_body(body)
+
+ # return_type
+ return_type = opts[:debug_return_type] || 'Error'
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"ErrorsApi.update_error",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:PUT, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: ErrorsApi#update_error\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+ end
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb
new file mode 100644
index 00000000000..49e2af7bb64
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb
@@ -0,0 +1,232 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+require 'cgi'
+
+module ErrorTrackingOpenAPI
+ class EventsApi
+ attr_accessor :api_client
+
+ def initialize(api_client = ApiClient.default)
+ @api_client = api_client
+ end
+ # Get information about the events related to the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error within the project
+ # @param [Hash] opts the optional parameters
+ # @option opts [String] :sort (default to 'occurred_at_asc')
+ # @option opts [String] :cursor Base64 encoded information for pagination
+ # @option opts [Integer] :limit Number of entries to return (default to 20)
+ # @return [Array<ErrorEvent>]
+ def list_events(project_id, fingerprint, opts = {})
+ data, _status_code, _headers = list_events_with_http_info(project_id, fingerprint, opts)
+ data
+ end
+
+ # Get information about the events related to the error
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param fingerprint [Integer] ID of the error within the project
+ # @param [Hash] opts the optional parameters
+ # @option opts [String] :sort (default to 'occurred_at_asc')
+ # @option opts [String] :cursor Base64 encoded information for pagination
+ # @option opts [Integer] :limit Number of entries to return (default to 20)
+ # @return [Array<(Array<ErrorEvent>, Integer, Hash)>] Array<ErrorEvent> data, response status code and response headers
+ def list_events_with_http_info(project_id, fingerprint, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: EventsApi.list_events ...'
+ end
+ # verify the required parameter 'project_id' is set
+ if @api_client.config.client_side_validation && project_id.nil?
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling EventsApi.list_events"
+ end
+ # verify the required parameter 'fingerprint' is set
+ if @api_client.config.client_side_validation && fingerprint.nil?
+ fail ArgumentError, "Missing the required parameter 'fingerprint' when calling EventsApi.list_events"
+ end
+ allowable_values = ["occurred_at_asc", "occurred_at_desc"]
+ if @api_client.config.client_side_validation && opts[:'sort'] && !allowable_values.include?(opts[:'sort'])
+ fail ArgumentError, "invalid value for \"sort\", must be one of #{allowable_values}"
+ end
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling EventsApi.list_events, must be smaller than or equal to 100.'
+ end
+
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling EventsApi.list_events, must be greater than or equal to 1.'
+ end
+
+ # resource path
+ local_var_path = '/projects/{projectId}/errors/{fingerprint}/events'.sub('{' + 'projectId' + '}', CGI.escape(project_id.to_s)).sub('{' + 'fingerprint' + '}', CGI.escape(fingerprint.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+ query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil?
+ query_params[:'cursor'] = opts[:'cursor'] if !opts[:'cursor'].nil?
+ query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+ # HTTP header 'Accept' (if needed)
+ header_params['Accept'] = @api_client.select_header_accept(['*/*'])
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body]
+
+ # return_type
+ return_type = opts[:debug_return_type] || 'Array<ErrorEvent>'
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"EventsApi.list_events",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: EventsApi#list_events\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+
+ # Ingestion endpoint for error events sent from client SDKs
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param [Hash] opts the optional parameters
+ # @return [ErrorEvent]
+ def projects_api_project_id_envelope_post(project_id, opts = {})
+ data, _status_code, _headers = projects_api_project_id_envelope_post_with_http_info(project_id, opts)
+ data
+ end
+
+ # Ingestion endpoint for error events sent from client SDKs
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param [Hash] opts the optional parameters
+ # @return [Array<(ErrorEvent, Integer, Hash)>] ErrorEvent data, response status code and response headers
+ def projects_api_project_id_envelope_post_with_http_info(project_id, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: EventsApi.projects_api_project_id_envelope_post ...'
+ end
+ # verify the required parameter 'project_id' is set
+ if @api_client.config.client_side_validation && project_id.nil?
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling EventsApi.projects_api_project_id_envelope_post"
+ end
+ # resource path
+ local_var_path = '/projects/api/{projectId}/envelope'.sub('{' + 'projectId' + '}', CGI.escape(project_id.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+ # HTTP header 'Accept' (if needed)
+ header_params['Accept'] = @api_client.select_header_accept(['*/*'])
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body]
+
+ # return_type
+ return_type = opts[:debug_return_type] || 'ErrorEvent'
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"EventsApi.projects_api_project_id_envelope_post",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: EventsApi#projects_api_project_id_envelope_post\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+
+ # Ingestion endpoint for error events sent from client SDKs
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param [Hash] opts the optional parameters
+ # @return [ErrorEvent]
+ def projects_api_project_id_store_post(project_id, opts = {})
+ data, _status_code, _headers = projects_api_project_id_store_post_with_http_info(project_id, opts)
+ data
+ end
+
+ # Ingestion endpoint for error events sent from client SDKs
+ # @param project_id [Integer] ID of the project where the error was created
+ # @param [Hash] opts the optional parameters
+ # @return [Array<(ErrorEvent, Integer, Hash)>] ErrorEvent data, response status code and response headers
+ def projects_api_project_id_store_post_with_http_info(project_id, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: EventsApi.projects_api_project_id_store_post ...'
+ end
+ # verify the required parameter 'project_id' is set
+ if @api_client.config.client_side_validation && project_id.nil?
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling EventsApi.projects_api_project_id_store_post"
+ end
+ # resource path
+ local_var_path = '/projects/api/{projectId}/store'.sub('{' + 'projectId' + '}', CGI.escape(project_id.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+ # HTTP header 'Accept' (if needed)
+ header_params['Accept'] = @api_client.select_header_accept(['*/*'])
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body]
+
+ # return_type
+ return_type = opts[:debug_return_type] || 'ErrorEvent'
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"EventsApi.projects_api_project_id_store_post",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: EventsApi#projects_api_project_id_store_post\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+ end
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb
new file mode 100644
index 00000000000..15ebe6efc35
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb
@@ -0,0 +1,81 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+require 'cgi'
+
+module ErrorTrackingOpenAPI
+ class ProjectsApi
+ attr_accessor :api_client
+
+ def initialize(api_client = ApiClient.default)
+ @api_client = api_client
+ end
+ # Deletes all project related data. Mostly for testing purposes and later for production to clean updeleted projects.
+ # @param id [Integer] ID of the project
+ # @param [Hash] opts the optional parameters
+ # @return [nil]
+ def delete_project(id, opts = {})
+ delete_project_with_http_info(id, opts)
+ nil
+ end
+
+ # Deletes all project related data. Mostly for testing purposes and later for production to clean updeleted projects.
+ # @param id [Integer] ID of the project
+ # @param [Hash] opts the optional parameters
+ # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
+ def delete_project_with_http_info(id, opts = {})
+ if @api_client.config.debugging
+ @api_client.config.logger.debug 'Calling API: ProjectsApi.delete_project ...'
+ end
+ # verify the required parameter 'id' is set
+ if @api_client.config.client_side_validation && id.nil?
+ fail ArgumentError, "Missing the required parameter 'id' when calling ProjectsApi.delete_project"
+ end
+ # resource path
+ local_var_path = '/projects/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s))
+
+ # query parameters
+ query_params = opts[:query_params] || {}
+
+ # header parameters
+ header_params = opts[:header_params] || {}
+
+ # form parameters
+ form_params = opts[:form_params] || {}
+
+ # http body (model)
+ post_body = opts[:debug_body]
+
+ # return_type
+ return_type = opts[:debug_return_type]
+
+ # auth_names
+ auth_names = opts[:debug_auth_names] || []
+
+ new_options = opts.merge(
+ :operation => :"ProjectsApi.delete_project",
+ :header_params => header_params,
+ :query_params => query_params,
+ :form_params => form_params,
+ :body => post_body,
+ :auth_names => auth_names,
+ :return_type => return_type
+ )
+
+ data, status_code, headers = @api_client.call_api(:DELETE, local_var_path, new_options)
+ if @api_client.config.debugging
+ @api_client.config.logger.debug "API called: ProjectsApi#delete_project\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
+ end
+ return data, status_code, headers
+ end
+ end
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb
new file mode 100644
index 00000000000..e2dedf57925
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb
@@ -0,0 +1,391 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+require 'date'
+require 'json'
+require 'logger'
+require 'tempfile'
+require 'time'
+require 'typhoeus'
+
+module ErrorTrackingOpenAPI
+ class ApiClient
+ # The Configuration object holding settings to be used in the API client.
+ attr_accessor :config
+
+ # Defines the headers to be used in HTTP requests of all API calls by default.
+ #
+ # @return [Hash]
+ attr_accessor :default_headers
+
+ # Initializes the ApiClient
+ # @option config [Configuration] Configuration for initializing the object, default to Configuration.default
+ def initialize(config = Configuration.default)
+ @config = config
+ @user_agent = "OpenAPI-Generator/#{VERSION}/ruby"
+ @default_headers = {
+ 'Content-Type' => 'application/json',
+ 'User-Agent' => @user_agent
+ }
+ end
+
+ def self.default
+ @@default ||= ApiClient.new
+ end
+
+ # Call an API with given options.
+ #
+ # @return [Array<(Object, Integer, Hash)>] an array of 3 elements:
+ # the data deserialized from response body (could be nil), response status code and response headers.
+ def call_api(http_method, path, opts = {})
+ request = build_request(http_method, path, opts)
+ response = request.run
+
+ if @config.debugging
+ @config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n"
+ end
+
+ unless response.success?
+ if response.timed_out?
+ fail ApiError.new('Connection timed out')
+ elsif response.code == 0
+ # Errors from libcurl will be made visible here
+ fail ApiError.new(:code => 0,
+ :message => response.return_message)
+ else
+ fail ApiError.new(:code => response.code,
+ :response_headers => response.headers,
+ :response_body => response.body),
+ response.status_message
+ end
+ end
+
+ if opts[:return_type]
+ data = deserialize(response, opts[:return_type])
+ else
+ data = nil
+ end
+ return data, response.code, response.headers
+ end
+
+ # Builds the HTTP request
+ #
+ # @param [String] http_method HTTP method/verb (e.g. POST)
+ # @param [String] path URL path (e.g. /account/new)
+ # @option opts [Hash] :header_params Header parameters
+ # @option opts [Hash] :query_params Query parameters
+ # @option opts [Hash] :form_params Query parameters
+ # @option opts [Object] :body HTTP body (JSON/XML)
+ # @return [Typhoeus::Request] A Typhoeus Request
+ def build_request(http_method, path, opts = {})
+ url = build_request_url(path, opts)
+ http_method = http_method.to_sym.downcase
+
+ header_params = @default_headers.merge(opts[:header_params] || {})
+ query_params = opts[:query_params] || {}
+ form_params = opts[:form_params] || {}
+ follow_location = opts[:follow_location] || true
+
+
+ # set ssl_verifyhosts option based on @config.verify_ssl_host (true/false)
+ _verify_ssl_host = @config.verify_ssl_host ? 2 : 0
+
+ req_opts = {
+ :method => http_method,
+ :headers => header_params,
+ :params => query_params,
+ :params_encoding => @config.params_encoding,
+ :timeout => @config.timeout,
+ :ssl_verifypeer => @config.verify_ssl,
+ :ssl_verifyhost => _verify_ssl_host,
+ :sslcert => @config.cert_file,
+ :sslkey => @config.key_file,
+ :verbose => @config.debugging,
+ :followlocation => follow_location
+ }
+
+ # set custom cert, if provided
+ req_opts[:cainfo] = @config.ssl_ca_cert if @config.ssl_ca_cert
+
+ if [:post, :patch, :put, :delete].include?(http_method)
+ req_body = build_request_body(header_params, form_params, opts[:body])
+ req_opts.update :body => req_body
+ if @config.debugging
+ @config.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n"
+ end
+ end
+
+ request = Typhoeus::Request.new(url, req_opts)
+ download_file(request) if opts[:return_type] == 'File'
+ request
+ end
+
+ # Builds the HTTP request body
+ #
+ # @param [Hash] header_params Header parameters
+ # @param [Hash] form_params Query parameters
+ # @param [Object] body HTTP body (JSON/XML)
+ # @return [String] HTTP body data in the form of string
+ def build_request_body(header_params, form_params, body)
+ # http form
+ if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
+ header_params['Content-Type'] == 'multipart/form-data'
+ data = {}
+ form_params.each do |key, value|
+ case value
+ when ::File, ::Array, nil
+ # let typhoeus handle File, Array and nil parameters
+ data[key] = value
+ else
+ data[key] = value.to_s
+ end
+ end
+ elsif body
+ data = body.is_a?(String) ? body : body.to_json
+ else
+ data = nil
+ end
+ data
+ end
+
+ # Save response body into a file in (the defined) temporary folder, using the filename
+ # from the "Content-Disposition" header if provided, otherwise a random filename.
+ # The response body is written to the file in chunks in order to handle files which
+ # size is larger than maximum Ruby String or even larger than the maximum memory a Ruby
+ # process can use.
+ #
+ # @see Configuration#temp_folder_path
+ def download_file(request)
+ tempfile = nil
+ encoding = nil
+ request.on_headers do |response|
+ content_disposition = response.headers['Content-Disposition']
+ if content_disposition && content_disposition =~ /filename=/i
+ filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
+ prefix = sanitize_filename(filename)
+ else
+ prefix = 'download-'
+ end
+ prefix = prefix + '-' unless prefix.end_with?('-')
+ encoding = response.body.encoding
+ tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
+ @tempfile = tempfile
+ end
+ request.on_body do |chunk|
+ chunk.force_encoding(encoding)
+ tempfile.write(chunk)
+ end
+ request.on_complete do |response|
+ if tempfile
+ tempfile.close
+ @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
+ "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
+ "will be deleted automatically with GC. It's also recommended to delete the temp file "\
+ "explicitly with `tempfile.delete`"
+ end
+ end
+ end
+
+ # Check if the given MIME is a JSON MIME.
+ # JSON MIME examples:
+ # application/json
+ # application/json; charset=UTF8
+ # APPLICATION/JSON
+ # */*
+ # @param [String] mime MIME
+ # @return [Boolean] True if the MIME is application/json
+ def json_mime?(mime)
+ (mime == '*/*') || !(mime =~ /Application\/.*json(?!p)(;.*)?/i).nil?
+ end
+
+ # Deserialize the response to the given return type.
+ #
+ # @param [Response] response HTTP response
+ # @param [String] return_type some examples: "User", "Array<User>", "Hash<String, Integer>"
+ def deserialize(response, return_type)
+ body = response.body
+
+ # handle file downloading - return the File instance processed in request callbacks
+ # note that response body is empty when the file is written in chunks in request on_body callback
+ return @tempfile if return_type == 'File'
+
+ return nil if body.nil? || body.empty?
+
+ # return response body directly for String return type
+ return body if return_type == 'String'
+
+ # ensuring a default content type
+ content_type = response.headers['Content-Type'] || 'application/json'
+
+ fail "Content-Type is not supported: #{content_type}" unless json_mime?(content_type)
+
+ begin
+ data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
+ rescue JSON::ParserError => e
+ if %w(String Date Time).include?(return_type)
+ data = body
+ else
+ raise e
+ end
+ end
+
+ convert_to_type data, return_type
+ end
+
+ # Convert data to the given return type.
+ # @param [Object] data Data to be converted
+ # @param [String] return_type Return type
+ # @return [Mixed] Data in a particular type
+ def convert_to_type(data, return_type)
+ return nil if data.nil?
+ case return_type
+ when 'String'
+ data.to_s
+ when 'Integer'
+ data.to_i
+ when 'Float'
+ data.to_f
+ when 'Boolean'
+ data == true
+ when 'Time'
+ # parse date time (expecting ISO 8601 format)
+ Time.parse data
+ when 'Date'
+ # parse date time (expecting ISO 8601 format)
+ Date.parse data
+ when 'Object'
+ # generic object (usually a Hash), return directly
+ data
+ when /\AArray<(.+)>\z/
+ # e.g. Array<Pet>
+ sub_type = $1
+ data.map { |item| convert_to_type(item, sub_type) }
+ when /\AHash\<String, (.+)\>\z/
+ # e.g. Hash<String, Integer>
+ sub_type = $1
+ {}.tap do |hash|
+ data.each { |k, v| hash[k] = convert_to_type(v, sub_type) }
+ end
+ else
+ # models (e.g. Pet) or oneOf
+ klass = ErrorTrackingOpenAPI.const_get(return_type)
+ klass.respond_to?(:openapi_one_of) ? klass.build(data) : klass.build_from_hash(data)
+ end
+ end
+
+ # Sanitize filename by removing path.
+ # e.g. ../../sun.gif becomes sun.gif
+ #
+ # @param [String] filename the filename to be sanitized
+ # @return [String] the sanitized filename
+ def sanitize_filename(filename)
+ filename.gsub(/.*[\/\\]/, '')
+ end
+
+ def build_request_url(path, opts = {})
+ # Add leading and trailing slashes to path
+ path = "/#{path}".gsub(/\/+/, '/')
+ @config.base_url(opts[:operation]) + path
+ end
+
+ # Update header and query params based on authentication settings.
+ #
+ # @param [Hash] header_params Header parameters
+ # @param [Hash] query_params Query parameters
+ # @param [String] auth_names Authentication scheme name
+ def update_params_for_auth!(header_params, query_params, auth_names)
+ Array(auth_names).each do |auth_name|
+ auth_setting = @config.auth_settings[auth_name]
+ next unless auth_setting
+ case auth_setting[:in]
+ when 'header' then header_params[auth_setting[:key]] = auth_setting[:value]
+ when 'query' then query_params[auth_setting[:key]] = auth_setting[:value]
+ else fail ArgumentError, 'Authentication token must be in `query` or `header`'
+ end
+ end
+ end
+
+ # Sets user agent in HTTP header
+ #
+ # @param [String] user_agent User agent (e.g. openapi-generator/ruby/1.0.0)
+ def user_agent=(user_agent)
+ @user_agent = user_agent
+ @default_headers['User-Agent'] = @user_agent
+ end
+
+ # Return Accept header based on an array of accepts provided.
+ # @param [Array] accepts array for Accept
+ # @return [String] the Accept header (e.g. application/json)
+ def select_header_accept(accepts)
+ return nil if accepts.nil? || accepts.empty?
+ # use JSON when present, otherwise use all of the provided
+ json_accept = accepts.find { |s| json_mime?(s) }
+ json_accept || accepts.join(',')
+ end
+
+ # Return Content-Type header based on an array of content types provided.
+ # @param [Array] content_types array for Content-Type
+ # @return [String] the Content-Type header (e.g. application/json)
+ def select_header_content_type(content_types)
+ # return nil by default
+ return if content_types.nil? || content_types.empty?
+ # use JSON when present, otherwise use the first one
+ json_content_type = content_types.find { |s| json_mime?(s) }
+ json_content_type || content_types.first
+ end
+
+ # Convert object (array, hash, object, etc) to JSON string.
+ # @param [Object] model object to be converted into JSON string
+ # @return [String] JSON string representation of the object
+ def object_to_http_body(model)
+ return model if model.nil? || model.is_a?(String)
+ local_body = nil
+ if model.is_a?(Array)
+ local_body = model.map { |m| object_to_hash(m) }
+ else
+ local_body = object_to_hash(model)
+ end
+ local_body.to_json
+ end
+
+ # Convert object(non-array) to hash.
+ # @param [Object] obj object to be converted into JSON string
+ # @return [String] JSON string representation of the object
+ def object_to_hash(obj)
+ if obj.respond_to?(:to_hash)
+ obj.to_hash
+ else
+ obj
+ end
+ end
+
+ # Build parameter value according to the given collection format.
+ # @param [String] collection_format one of :csv, :ssv, :tsv, :pipes and :multi
+ def build_collection_param(param, collection_format)
+ case collection_format
+ when :csv
+ param.join(',')
+ when :ssv
+ param.join(' ')
+ when :tsv
+ param.join("\t")
+ when :pipes
+ param.join('|')
+ when :multi
+ # return the array directly as typhoeus will handle it as expected
+ param
+ else
+ fail "unknown collection format: #{collection_format.inspect}"
+ end
+ end
+ end
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb
new file mode 100644
index 00000000000..b04d1b37a0b
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb
@@ -0,0 +1,57 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+module ErrorTrackingOpenAPI
+ class ApiError < StandardError
+ attr_reader :code, :response_headers, :response_body
+
+ # Usage examples:
+ # ApiError.new
+ # ApiError.new("message")
+ # ApiError.new(:code => 500, :response_headers => {}, :response_body => "")
+ # ApiError.new(:code => 404, :message => "Not Found")
+ def initialize(arg = nil)
+ if arg.is_a? Hash
+ if arg.key?(:message) || arg.key?('message')
+ super(arg[:message] || arg['message'])
+ else
+ super arg
+ end
+
+ arg.each do |k, v|
+ instance_variable_set "@#{k}", v
+ end
+ else
+ super arg
+ end
+ end
+
+ # Override to_s to display a friendly error message
+ def to_s
+ message
+ end
+
+ def message
+ if @message.nil?
+ msg = "Error message: the server returns an error"
+ else
+ msg = @message
+ end
+
+ msg += "\nHTTP status code: #{code}" if code
+ msg += "\nResponse headers: #{response_headers}" if response_headers
+ msg += "\nResponse body: #{response_body}" if response_body
+
+ msg
+ end
+ end
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb
new file mode 100644
index 00000000000..c27c0aa3bb9
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb
@@ -0,0 +1,276 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+module ErrorTrackingOpenAPI
+ class Configuration
+ # Defines url scheme
+ attr_accessor :scheme
+
+ # Defines url host
+ attr_accessor :host
+
+ # Defines url base path
+ attr_accessor :base_path
+
+ # Define server configuration index
+ attr_accessor :server_index
+
+ # Define server operation configuration index
+ attr_accessor :server_operation_index
+
+ # Default server variables
+ attr_accessor :server_variables
+
+ # Default server operation variables
+ attr_accessor :server_operation_variables
+
+ # Defines API keys used with API Key authentications.
+ #
+ # @return [Hash] key: parameter name, value: parameter value (API key)
+ #
+ # @example parameter name is "api_key", API key is "xxx" (e.g. "api_key=xxx" in query string)
+ # config.api_key['api_key'] = 'xxx'
+ attr_accessor :api_key
+
+ # Defines API key prefixes used with API Key authentications.
+ #
+ # @return [Hash] key: parameter name, value: API key prefix
+ #
+ # @example parameter name is "Authorization", API key prefix is "Token" (e.g. "Authorization: Token xxx" in headers)
+ # config.api_key_prefix['api_key'] = 'Token'
+ attr_accessor :api_key_prefix
+
+ # Defines the username used with HTTP basic authentication.
+ #
+ # @return [String]
+ attr_accessor :username
+
+ # Defines the password used with HTTP basic authentication.
+ #
+ # @return [String]
+ attr_accessor :password
+
+ # Defines the access token (Bearer) used with OAuth2.
+ attr_accessor :access_token
+
+ # Set this to enable/disable debugging. When enabled (set to true), HTTP request/response
+ # details will be logged with `logger.debug` (see the `logger` attribute).
+ # Default to false.
+ #
+ # @return [true, false]
+ attr_accessor :debugging
+
+ # Defines the logger used for debugging.
+ # Default to `Rails.logger` (when in Rails) or logging to STDOUT.
+ #
+ # @return [#debug]
+ attr_accessor :logger
+
+ # Defines the temporary folder to store downloaded files
+ # (for API endpoints that have file response).
+ # Default to use `Tempfile`.
+ #
+ # @return [String]
+ attr_accessor :temp_folder_path
+
+ # The time limit for HTTP request in seconds.
+ # Default to 0 (never times out).
+ attr_accessor :timeout
+
+ # Set this to false to skip client side validation in the operation.
+ # Default to true.
+ # @return [true, false]
+ attr_accessor :client_side_validation
+
+ ### TLS/SSL setting
+ # Set this to false to skip verifying SSL certificate when calling API from https server.
+ # Default to true.
+ #
+ # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
+ #
+ # @return [true, false]
+ attr_accessor :verify_ssl
+
+ ### TLS/SSL setting
+ # Set this to false to skip verifying SSL host name
+ # Default to true.
+ #
+ # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
+ #
+ # @return [true, false]
+ attr_accessor :verify_ssl_host
+
+ ### TLS/SSL setting
+ # Set this to customize the certificate file to verify the peer.
+ #
+ # @return [String] the path to the certificate file
+ #
+ # @see The `cainfo` option of Typhoeus, `--cert` option of libcurl. Related source code:
+ # https://github.com/typhoeus/typhoeus/blob/master/lib/typhoeus/easy_factory.rb#L145
+ attr_accessor :ssl_ca_cert
+
+ ### TLS/SSL setting
+ # Client certificate file (for client certificate)
+ attr_accessor :cert_file
+
+ ### TLS/SSL setting
+ # Client private key file (for client certificate)
+ attr_accessor :key_file
+
+ # Set this to customize parameters encoding of array parameter with multi collectionFormat.
+ # Default to nil.
+ #
+ # @see The params_encoding option of Ethon. Related source code:
+ # https://github.com/typhoeus/ethon/blob/master/lib/ethon/easy/queryable.rb#L96
+ attr_accessor :params_encoding
+
+
+ attr_accessor :inject_format
+
+ attr_accessor :force_ending_format
+
+ def initialize
+ @scheme = 'https'
+ @host = 'localhost'
+ @base_path = '/errortracking/api/v1'
+ @server_index = 0
+ @server_operation_index = {}
+ @server_variables = {}
+ @server_operation_variables = {}
+ @api_key = {}
+ @api_key_prefix = {}
+ @client_side_validation = true
+ @verify_ssl = true
+ @verify_ssl_host = true
+ @cert_file = nil
+ @key_file = nil
+ @timeout = 0
+ @params_encoding = nil
+ @debugging = false
+ @inject_format = false
+ @force_ending_format = false
+ @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
+
+ yield(self) if block_given?
+ end
+
+ # The default Configuration object.
+ def self.default
+ @@default ||= Configuration.new
+ end
+
+ def configure
+ yield(self) if block_given?
+ end
+
+ def scheme=(scheme)
+ # remove :// from scheme
+ @scheme = scheme.sub(/:\/\//, '')
+ end
+
+ def host=(host)
+ # remove http(s):// and anything after a slash
+ @host = host.sub(/https?:\/\//, '').split('/').first
+ end
+
+ def base_path=(base_path)
+ # Add leading and trailing slashes to base_path
+ @base_path = "/#{base_path}".gsub(/\/+/, '/')
+ @base_path = '' if @base_path == '/'
+ end
+
+ # Returns base URL for specified operation based on server settings
+ def base_url(operation = nil)
+ index = server_operation_index.fetch(operation, server_index)
+ return "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '') if index == nil
+
+ server_url(index, server_operation_variables.fetch(operation, server_variables), operation_server_settings[operation])
+ end
+
+ # Gets API key (with prefix if set).
+ # @param [String] param_name the parameter name of API key auth
+ def api_key_with_prefix(param_name, param_alias = nil)
+ key = @api_key[param_name]
+ key = @api_key.fetch(param_alias, key) unless param_alias.nil?
+ if @api_key_prefix[param_name]
+ "#{@api_key_prefix[param_name]} #{key}"
+ else
+ key
+ end
+ end
+
+ # Gets Basic Auth token string
+ def basic_auth_token
+ 'Basic ' + ["#{username}:#{password}"].pack('m').delete("\r\n")
+ end
+
+ # Returns Auth Settings hash for api client.
+ def auth_settings
+ {
+ }
+ end
+
+ # Returns an array of Server setting
+ def server_settings
+ [
+ {
+ url: "https://localhost/errortracking/api/v1",
+ description: "No description provided",
+ },
+ {
+ url: "http://localhost/errortracking/api/v1",
+ description: "No description provided",
+ }
+ ]
+ end
+
+ def operation_server_settings
+ {
+ }
+ end
+
+ # Returns URL based on server settings
+ #
+ # @param index array index of the server settings
+ # @param variables hash of variable and the corresponding value
+ def server_url(index, variables = {}, servers = nil)
+ servers = server_settings if servers == nil
+
+ # check array index out of bound
+ if (index < 0 || index >= servers.size)
+ fail ArgumentError, "Invalid index #{index} when selecting the server. Must be less than #{servers.size}"
+ end
+
+ server = servers[index]
+ url = server[:url]
+
+ return url unless server.key? :variables
+
+ # go through variable and assign a value
+ server[:variables].each do |name, variable|
+ if variables.key?(name)
+ if (!server[:variables][name].key?(:enum_values) || server[:variables][name][:enum_values].include?(variables[name]))
+ url.gsub! "{" + name.to_s + "}", variables[name]
+ else
+ fail ArgumentError, "The variable `#{name}` in the server URL has invalid value #{variables[name]}. Must be #{server[:variables][name][:enum_values]}."
+ end
+ else
+ # use default value
+ url.gsub! "{" + name.to_s + "}", server[:variables][name][:default_value]
+ end
+ end
+
+ url
+ end
+
+ end
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb
new file mode 100644
index 00000000000..1bad99e1e30
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb
@@ -0,0 +1,335 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+require 'date'
+require 'time'
+
+module ErrorTrackingOpenAPI
+ class Error
+ attr_accessor :fingerprint
+
+ attr_accessor :project_id
+
+ attr_accessor :name
+
+ attr_accessor :description
+
+ attr_accessor :actor
+
+ attr_accessor :event_count
+
+ attr_accessor :approximated_user_count
+
+ attr_accessor :last_seen_at
+
+ attr_accessor :first_seen_at
+
+ # Status of the error
+ attr_accessor :status
+
+ class EnumAttributeValidator
+ attr_reader :datatype
+ attr_reader :allowable_values
+
+ def initialize(datatype, allowable_values)
+ @allowable_values = allowable_values.map do |value|
+ case datatype.to_s
+ when /Integer/i
+ value.to_i
+ when /Float/i
+ value.to_f
+ else
+ value
+ end
+ end
+ end
+
+ def valid?(value)
+ !value || allowable_values.include?(value)
+ end
+ end
+
+ # Attribute mapping from ruby-style variable name to JSON key.
+ def self.attribute_map
+ {
+ :'fingerprint' => :'fingerprint',
+ :'project_id' => :'project_id',
+ :'name' => :'name',
+ :'description' => :'description',
+ :'actor' => :'actor',
+ :'event_count' => :'event_count',
+ :'approximated_user_count' => :'approximated_user_count',
+ :'last_seen_at' => :'last_seen_at',
+ :'first_seen_at' => :'first_seen_at',
+ :'status' => :'status'
+ }
+ end
+
+ # Returns all the JSON keys this model knows about
+ def self.acceptable_attributes
+ attribute_map.values
+ end
+
+ # Attribute type mapping.
+ def self.openapi_types
+ {
+ :'fingerprint' => :'Integer',
+ :'project_id' => :'Integer',
+ :'name' => :'String',
+ :'description' => :'String',
+ :'actor' => :'String',
+ :'event_count' => :'Integer',
+ :'approximated_user_count' => :'Integer',
+ :'last_seen_at' => :'Time',
+ :'first_seen_at' => :'Time',
+ :'status' => :'String'
+ }
+ end
+
+ # List of attributes with nullable: true
+ def self.openapi_nullable
+ Set.new([
+ ])
+ end
+
+ # Initializes the object
+ # @param [Hash] attributes Model attributes in the form of hash
+ def initialize(attributes = {})
+ if (!attributes.is_a?(Hash))
+ fail ArgumentError, "The input argument (attributes) must be a hash in `ErrorTrackingOpenAPI::Error` initialize method"
+ end
+
+ # check to see if the attribute exists and convert string to symbol for hash key
+ attributes = attributes.each_with_object({}) { |(k, v), h|
+ if (!self.class.attribute_map.key?(k.to_sym))
+ fail ArgumentError, "`#{k}` is not a valid attribute in `ErrorTrackingOpenAPI::Error`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
+ end
+ h[k.to_sym] = v
+ }
+
+ if attributes.key?(:'fingerprint')
+ self.fingerprint = attributes[:'fingerprint']
+ end
+
+ if attributes.key?(:'project_id')
+ self.project_id = attributes[:'project_id']
+ end
+
+ if attributes.key?(:'name')
+ self.name = attributes[:'name']
+ end
+
+ if attributes.key?(:'description')
+ self.description = attributes[:'description']
+ end
+
+ if attributes.key?(:'actor')
+ self.actor = attributes[:'actor']
+ end
+
+ if attributes.key?(:'event_count')
+ self.event_count = attributes[:'event_count']
+ end
+
+ if attributes.key?(:'approximated_user_count')
+ self.approximated_user_count = attributes[:'approximated_user_count']
+ end
+
+ if attributes.key?(:'last_seen_at')
+ self.last_seen_at = attributes[:'last_seen_at']
+ end
+
+ if attributes.key?(:'first_seen_at')
+ self.first_seen_at = attributes[:'first_seen_at']
+ end
+
+ if attributes.key?(:'status')
+ self.status = attributes[:'status']
+ end
+ end
+
+ # Show invalid properties with the reasons. Usually used together with valid?
+ # @return Array for valid properties with the reasons
+ def list_invalid_properties
+ invalid_properties = Array.new
+ invalid_properties
+ end
+
+ # Check to see if the all the properties in the model are valid
+ # @return true if the model is valid
+ def valid?
+ status_validator = EnumAttributeValidator.new('String', ["unresolved", "resolved", "ignored"])
+ return false unless status_validator.valid?(@status)
+ true
+ end
+
+ # Custom attribute writer method checking allowed values (enum).
+ # @param [Object] status Object to be assigned
+ def status=(status)
+ validator = EnumAttributeValidator.new('String', ["unresolved", "resolved", "ignored"])
+ unless validator.valid?(status)
+ fail ArgumentError, "invalid value for \"status\", must be one of #{validator.allowable_values}."
+ end
+ @status = status
+ end
+
+ # Checks equality by comparing each attribute.
+ # @param [Object] Object to be compared
+ def ==(o)
+ return true if self.equal?(o)
+ self.class == o.class &&
+ fingerprint == o.fingerprint &&
+ project_id == o.project_id &&
+ name == o.name &&
+ description == o.description &&
+ actor == o.actor &&
+ event_count == o.event_count &&
+ approximated_user_count == o.approximated_user_count &&
+ last_seen_at == o.last_seen_at &&
+ first_seen_at == o.first_seen_at &&
+ status == o.status
+ end
+
+ # @see the `==` method
+ # @param [Object] Object to be compared
+ def eql?(o)
+ self == o
+ end
+
+ # Calculates hash code according to all attributes.
+ # @return [Integer] Hash code
+ def hash
+ [fingerprint, project_id, name, description, actor, event_count, approximated_user_count, last_seen_at, first_seen_at, status].hash
+ end
+
+ # Builds the object from hash
+ # @param [Hash] attributes Model attributes in the form of hash
+ # @return [Object] Returns the model itself
+ def self.build_from_hash(attributes)
+ new.build_from_hash(attributes)
+ end
+
+ # Builds the object from hash
+ # @param [Hash] attributes Model attributes in the form of hash
+ # @return [Object] Returns the model itself
+ def build_from_hash(attributes)
+ return nil unless attributes.is_a?(Hash)
+ attributes = attributes.transform_keys(&:to_sym)
+ self.class.openapi_types.each_pair do |key, type|
+ if attributes[self.class.attribute_map[key]].nil? && self.class.openapi_nullable.include?(key)
+ self.send("#{key}=", nil)
+ elsif type =~ /\AArray<(.*)>/i
+ # check to ensure the input is an array given that the attribute
+ # is documented as an array but the input is not
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
+ end
+ elsif !attributes[self.class.attribute_map[key]].nil?
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
+ end
+ end
+
+ self
+ end
+
+ # Deserializes the data based on type
+ # @param string type Data type
+ # @param string value Value to be deserialized
+ # @return [Object] Deserialized data
+ def _deserialize(type, value)
+ case type.to_sym
+ when :Time
+ Time.parse(value)
+ when :Date
+ Date.parse(value)
+ when :String
+ value.to_s
+ when :Integer
+ value.to_i
+ when :Float
+ value.to_f
+ when :Boolean
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
+ true
+ else
+ false
+ end
+ when :Object
+ # generic object (usually a Hash), return directly
+ value
+ when /\AArray<(?<inner_type>.+)>\z/
+ inner_type = Regexp.last_match[:inner_type]
+ value.map { |v| _deserialize(inner_type, v) }
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
+ k_type = Regexp.last_match[:k_type]
+ v_type = Regexp.last_match[:v_type]
+ {}.tap do |hash|
+ value.each do |k, v|
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
+ end
+ end
+ else # model
+ # models (e.g. Pet) or oneOf
+ klass = ErrorTrackingOpenAPI.const_get(type)
+ klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
+ end
+ end
+
+ # Returns the string representation of the object
+ # @return [String] String presentation of the object
+ def to_s
+ to_hash.to_s
+ end
+
+ # to_body is an alias to to_hash (backward compatibility)
+ # @return [Hash] Returns the object in the form of hash
+ def to_body
+ to_hash
+ end
+
+ # Returns the object in the form of hash
+ # @return [Hash] Returns the object in the form of hash
+ def to_hash
+ hash = {}
+ self.class.attribute_map.each_pair do |attr, param|
+ value = self.send(attr)
+ if value.nil?
+ is_nullable = self.class.openapi_nullable.include?(attr)
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
+ end
+
+ hash[param] = _to_hash(value)
+ end
+ hash
+ end
+
+ # Outputs non-array value in the form of hash
+ # For object, use to_hash. Otherwise, just return the value
+ # @param [Object] value Any valid value
+ # @return [Hash] Returns the value in the form of hash
+ def _to_hash(value)
+ if value.is_a?(Array)
+ value.compact.map { |v| _to_hash(v) }
+ elsif value.is_a?(Hash)
+ {}.tap do |hash|
+ value.each { |k, v| hash[k] = _to_hash(v) }
+ end
+ elsif value.respond_to? :to_hash
+ value.to_hash
+ else
+ value
+ end
+ end
+
+ end
+
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb
new file mode 100644
index 00000000000..b0dc1fc58df
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb
@@ -0,0 +1,283 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+require 'date'
+require 'time'
+
+module ErrorTrackingOpenAPI
+ class ErrorEvent
+ attr_accessor :fingerprint
+
+ attr_accessor :project_id
+
+ # JSON encoded string
+ attr_accessor :payload
+
+ attr_accessor :name
+
+ attr_accessor :description
+
+ attr_accessor :actor
+
+ attr_accessor :environment
+
+ attr_accessor :platform
+
+ # Attribute mapping from ruby-style variable name to JSON key.
+ def self.attribute_map
+ {
+ :'fingerprint' => :'fingerprint',
+ :'project_id' => :'projectId',
+ :'payload' => :'payload',
+ :'name' => :'name',
+ :'description' => :'description',
+ :'actor' => :'actor',
+ :'environment' => :'environment',
+ :'platform' => :'platform'
+ }
+ end
+
+ # Returns all the JSON keys this model knows about
+ def self.acceptable_attributes
+ attribute_map.values
+ end
+
+ # Attribute type mapping.
+ def self.openapi_types
+ {
+ :'fingerprint' => :'Integer',
+ :'project_id' => :'Integer',
+ :'payload' => :'String',
+ :'name' => :'String',
+ :'description' => :'String',
+ :'actor' => :'String',
+ :'environment' => :'String',
+ :'platform' => :'String'
+ }
+ end
+
+ # List of attributes with nullable: true
+ def self.openapi_nullable
+ Set.new([
+ ])
+ end
+
+ # Initializes the object
+ # @param [Hash] attributes Model attributes in the form of hash
+ def initialize(attributes = {})
+ if (!attributes.is_a?(Hash))
+ fail ArgumentError, "The input argument (attributes) must be a hash in `ErrorTrackingOpenAPI::ErrorEvent` initialize method"
+ end
+
+ # check to see if the attribute exists and convert string to symbol for hash key
+ attributes = attributes.each_with_object({}) { |(k, v), h|
+ if (!self.class.attribute_map.key?(k.to_sym))
+ fail ArgumentError, "`#{k}` is not a valid attribute in `ErrorTrackingOpenAPI::ErrorEvent`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
+ end
+ h[k.to_sym] = v
+ }
+
+ if attributes.key?(:'fingerprint')
+ self.fingerprint = attributes[:'fingerprint']
+ end
+
+ if attributes.key?(:'project_id')
+ self.project_id = attributes[:'project_id']
+ end
+
+ if attributes.key?(:'payload')
+ self.payload = attributes[:'payload']
+ end
+
+ if attributes.key?(:'name')
+ self.name = attributes[:'name']
+ end
+
+ if attributes.key?(:'description')
+ self.description = attributes[:'description']
+ end
+
+ if attributes.key?(:'actor')
+ self.actor = attributes[:'actor']
+ end
+
+ if attributes.key?(:'environment')
+ self.environment = attributes[:'environment']
+ end
+
+ if attributes.key?(:'platform')
+ self.platform = attributes[:'platform']
+ end
+ end
+
+ # Show invalid properties with the reasons. Usually used together with valid?
+ # @return Array for valid properties with the reasons
+ def list_invalid_properties
+ invalid_properties = Array.new
+ invalid_properties
+ end
+
+ # Check to see if the all the properties in the model are valid
+ # @return true if the model is valid
+ def valid?
+ true
+ end
+
+ # Checks equality by comparing each attribute.
+ # @param [Object] Object to be compared
+ def ==(o)
+ return true if self.equal?(o)
+ self.class == o.class &&
+ fingerprint == o.fingerprint &&
+ project_id == o.project_id &&
+ payload == o.payload &&
+ name == o.name &&
+ description == o.description &&
+ actor == o.actor &&
+ environment == o.environment &&
+ platform == o.platform
+ end
+
+ # @see the `==` method
+ # @param [Object] Object to be compared
+ def eql?(o)
+ self == o
+ end
+
+ # Calculates hash code according to all attributes.
+ # @return [Integer] Hash code
+ def hash
+ [fingerprint, project_id, payload, name, description, actor, environment, platform].hash
+ end
+
+ # Builds the object from hash
+ # @param [Hash] attributes Model attributes in the form of hash
+ # @return [Object] Returns the model itself
+ def self.build_from_hash(attributes)
+ new.build_from_hash(attributes)
+ end
+
+ # Builds the object from hash
+ # @param [Hash] attributes Model attributes in the form of hash
+ # @return [Object] Returns the model itself
+ def build_from_hash(attributes)
+ return nil unless attributes.is_a?(Hash)
+ attributes = attributes.transform_keys(&:to_sym)
+ self.class.openapi_types.each_pair do |key, type|
+ if attributes[self.class.attribute_map[key]].nil? && self.class.openapi_nullable.include?(key)
+ self.send("#{key}=", nil)
+ elsif type =~ /\AArray<(.*)>/i
+ # check to ensure the input is an array given that the attribute
+ # is documented as an array but the input is not
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
+ end
+ elsif !attributes[self.class.attribute_map[key]].nil?
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
+ end
+ end
+
+ self
+ end
+
+ # Deserializes the data based on type
+ # @param string type Data type
+ # @param string value Value to be deserialized
+ # @return [Object] Deserialized data
+ def _deserialize(type, value)
+ case type.to_sym
+ when :Time
+ Time.parse(value)
+ when :Date
+ Date.parse(value)
+ when :String
+ value.to_s
+ when :Integer
+ value.to_i
+ when :Float
+ value.to_f
+ when :Boolean
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
+ true
+ else
+ false
+ end
+ when :Object
+ # generic object (usually a Hash), return directly
+ value
+ when /\AArray<(?<inner_type>.+)>\z/
+ inner_type = Regexp.last_match[:inner_type]
+ value.map { |v| _deserialize(inner_type, v) }
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
+ k_type = Regexp.last_match[:k_type]
+ v_type = Regexp.last_match[:v_type]
+ {}.tap do |hash|
+ value.each do |k, v|
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
+ end
+ end
+ else # model
+ # models (e.g. Pet) or oneOf
+ klass = ErrorTrackingOpenAPI.const_get(type)
+ klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
+ end
+ end
+
+ # Returns the string representation of the object
+ # @return [String] String presentation of the object
+ def to_s
+ to_hash.to_s
+ end
+
+ # to_body is an alias to to_hash (backward compatibility)
+ # @return [Hash] Returns the object in the form of hash
+ def to_body
+ to_hash
+ end
+
+ # Returns the object in the form of hash
+ # @return [Hash] Returns the object in the form of hash
+ def to_hash
+ hash = {}
+ self.class.attribute_map.each_pair do |attr, param|
+ value = self.send(attr)
+ if value.nil?
+ is_nullable = self.class.openapi_nullable.include?(attr)
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
+ end
+
+ hash[param] = _to_hash(value)
+ end
+ hash
+ end
+
+ # Outputs non-array value in the form of hash
+ # For object, use to_hash. Otherwise, just return the value
+ # @param [Object] value Any valid value
+ # @return [Hash] Returns the value in the form of hash
+ def _to_hash(value)
+ if value.is_a?(Array)
+ value.compact.map { |v| _to_hash(v) }
+ elsif value.is_a?(Hash)
+ {}.tap do |hash|
+ value.each { |k, v| hash[k] = _to_hash(v) }
+ end
+ elsif value.respond_to? :to_hash
+ value.to_hash
+ else
+ value
+ end
+ end
+
+ end
+
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb
new file mode 100644
index 00000000000..937854d58f7
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb
@@ -0,0 +1,264 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+require 'date'
+require 'time'
+
+module ErrorTrackingOpenAPI
+ class ErrorUpdatePayload
+ # Status of the error
+ attr_accessor :status
+
+ # GitLab user id who triggered the update
+ attr_accessor :updated_by_id
+
+ class EnumAttributeValidator
+ attr_reader :datatype
+ attr_reader :allowable_values
+
+ def initialize(datatype, allowable_values)
+ @allowable_values = allowable_values.map do |value|
+ case datatype.to_s
+ when /Integer/i
+ value.to_i
+ when /Float/i
+ value.to_f
+ else
+ value
+ end
+ end
+ end
+
+ def valid?(value)
+ !value || allowable_values.include?(value)
+ end
+ end
+
+ # Attribute mapping from ruby-style variable name to JSON key.
+ def self.attribute_map
+ {
+ :'status' => :'status',
+ :'updated_by_id' => :'updated_by_id'
+ }
+ end
+
+ # Returns all the JSON keys this model knows about
+ def self.acceptable_attributes
+ attribute_map.values
+ end
+
+ # Attribute type mapping.
+ def self.openapi_types
+ {
+ :'status' => :'String',
+ :'updated_by_id' => :'Integer'
+ }
+ end
+
+ # List of attributes with nullable: true
+ def self.openapi_nullable
+ Set.new([
+ ])
+ end
+
+ # Initializes the object
+ # @param [Hash] attributes Model attributes in the form of hash
+ def initialize(attributes = {})
+ if (!attributes.is_a?(Hash))
+ fail ArgumentError, "The input argument (attributes) must be a hash in `ErrorTrackingOpenAPI::ErrorUpdatePayload` initialize method"
+ end
+
+ # check to see if the attribute exists and convert string to symbol for hash key
+ attributes = attributes.each_with_object({}) { |(k, v), h|
+ if (!self.class.attribute_map.key?(k.to_sym))
+ fail ArgumentError, "`#{k}` is not a valid attribute in `ErrorTrackingOpenAPI::ErrorUpdatePayload`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
+ end
+ h[k.to_sym] = v
+ }
+
+ if attributes.key?(:'status')
+ self.status = attributes[:'status']
+ end
+
+ if attributes.key?(:'updated_by_id')
+ self.updated_by_id = attributes[:'updated_by_id']
+ end
+ end
+
+ # Show invalid properties with the reasons. Usually used together with valid?
+ # @return Array for valid properties with the reasons
+ def list_invalid_properties
+ invalid_properties = Array.new
+ invalid_properties
+ end
+
+ # Check to see if the all the properties in the model are valid
+ # @return true if the model is valid
+ def valid?
+ status_validator = EnumAttributeValidator.new('String', ["unresolved", "resolved", "ignored"])
+ return false unless status_validator.valid?(@status)
+ true
+ end
+
+ # Custom attribute writer method checking allowed values (enum).
+ # @param [Object] status Object to be assigned
+ def status=(status)
+ validator = EnumAttributeValidator.new('String', ["unresolved", "resolved", "ignored"])
+ unless validator.valid?(status)
+ fail ArgumentError, "invalid value for \"status\", must be one of #{validator.allowable_values}."
+ end
+ @status = status
+ end
+
+ # Checks equality by comparing each attribute.
+ # @param [Object] Object to be compared
+ def ==(o)
+ return true if self.equal?(o)
+ self.class == o.class &&
+ status == o.status &&
+ updated_by_id == o.updated_by_id
+ end
+
+ # @see the `==` method
+ # @param [Object] Object to be compared
+ def eql?(o)
+ self == o
+ end
+
+ # Calculates hash code according to all attributes.
+ # @return [Integer] Hash code
+ def hash
+ [status, updated_by_id].hash
+ end
+
+ # Builds the object from hash
+ # @param [Hash] attributes Model attributes in the form of hash
+ # @return [Object] Returns the model itself
+ def self.build_from_hash(attributes)
+ new.build_from_hash(attributes)
+ end
+
+ # Builds the object from hash
+ # @param [Hash] attributes Model attributes in the form of hash
+ # @return [Object] Returns the model itself
+ def build_from_hash(attributes)
+ return nil unless attributes.is_a?(Hash)
+ attributes = attributes.transform_keys(&:to_sym)
+ self.class.openapi_types.each_pair do |key, type|
+ if attributes[self.class.attribute_map[key]].nil? && self.class.openapi_nullable.include?(key)
+ self.send("#{key}=", nil)
+ elsif type =~ /\AArray<(.*)>/i
+ # check to ensure the input is an array given that the attribute
+ # is documented as an array but the input is not
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
+ end
+ elsif !attributes[self.class.attribute_map[key]].nil?
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
+ end
+ end
+
+ self
+ end
+
+ # Deserializes the data based on type
+ # @param string type Data type
+ # @param string value Value to be deserialized
+ # @return [Object] Deserialized data
+ def _deserialize(type, value)
+ case type.to_sym
+ when :Time
+ Time.parse(value)
+ when :Date
+ Date.parse(value)
+ when :String
+ value.to_s
+ when :Integer
+ value.to_i
+ when :Float
+ value.to_f
+ when :Boolean
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
+ true
+ else
+ false
+ end
+ when :Object
+ # generic object (usually a Hash), return directly
+ value
+ when /\AArray<(?<inner_type>.+)>\z/
+ inner_type = Regexp.last_match[:inner_type]
+ value.map { |v| _deserialize(inner_type, v) }
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
+ k_type = Regexp.last_match[:k_type]
+ v_type = Regexp.last_match[:v_type]
+ {}.tap do |hash|
+ value.each do |k, v|
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
+ end
+ end
+ else # model
+ # models (e.g. Pet) or oneOf
+ klass = ErrorTrackingOpenAPI.const_get(type)
+ klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
+ end
+ end
+
+ # Returns the string representation of the object
+ # @return [String] String presentation of the object
+ def to_s
+ to_hash.to_s
+ end
+
+ # to_body is an alias to to_hash (backward compatibility)
+ # @return [Hash] Returns the object in the form of hash
+ def to_body
+ to_hash
+ end
+
+ # Returns the object in the form of hash
+ # @return [Hash] Returns the object in the form of hash
+ def to_hash
+ hash = {}
+ self.class.attribute_map.each_pair do |attr, param|
+ value = self.send(attr)
+ if value.nil?
+ is_nullable = self.class.openapi_nullable.include?(attr)
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
+ end
+
+ hash[param] = _to_hash(value)
+ end
+ hash
+ end
+
+ # Outputs non-array value in the form of hash
+ # For object, use to_hash. Otherwise, just return the value
+ # @param [Object] value Any valid value
+ # @return [Hash] Returns the value in the form of hash
+ def _to_hash(value)
+ if value.is_a?(Array)
+ value.compact.map { |v| _to_hash(v) }
+ elsif value.is_a?(Hash)
+ {}.tap do |hash|
+ value.each { |k, v| hash[k] = _to_hash(v) }
+ end
+ elsif value.respond_to? :to_hash
+ value.to_hash
+ else
+ value
+ end
+ end
+
+ end
+
+end
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb
new file mode 100644
index 00000000000..84e675fda64
--- /dev/null
+++ b/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb
@@ -0,0 +1,15 @@
+=begin
+#Error Trackig REST API
+
+#This schema describes the API endpoints for the error tracking feature
+
+The version of the OpenAPI document: 0.0.1
+
+Generated by: https://openapi-generator.tech
+OpenAPI Generator version: 6.0.0
+
+=end
+
+module ErrorTrackingOpenAPI
+ VERSION = '1.0.0'
+end
diff --git a/vendor/gems/ipynbdiff/.gitignore b/vendor/gems/ipynbdiff/.gitignore
new file mode 100644
index 00000000000..4f284c35a42
--- /dev/null
+++ b/vendor/gems/ipynbdiff/.gitignore
@@ -0,0 +1,2 @@
+*.gem
+.bundle
diff --git a/vendor/gems/ipynbdiff/.gitlab-ci.yml b/vendor/gems/ipynbdiff/.gitlab-ci.yml
new file mode 100644
index 00000000000..7b0c9df6cd9
--- /dev/null
+++ b/vendor/gems/ipynbdiff/.gitlab-ci.yml
@@ -0,0 +1,32 @@
+# 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
+workflow:
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+
+.rspec:
+ cache:
+ key: ipynbdiff
+ paths:
+ - vendor/gems/ipynbdiff/vendor/ruby
+ before_script:
+ - cd vendor/gems/ipynbdiff
+ - ruby -v # Print out ruby version for debugging
+ - gem install bundler --no-document # Bundler is not installed with the image
+ - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
+ - bundle config set with 'development'
+ - bundle install -j $(nproc)
+ script:
+ - bundle exec rspec
+
+rspec-2.7:
+ image: "ruby:2.7"
+ extends: .rspec
+
+rspec-3.0:
+ image: "ruby:3.0"
+ extends: .rspec
diff --git a/vendor/gems/ipynbdiff/Gemfile b/vendor/gems/ipynbdiff/Gemfile
new file mode 100644
index 00000000000..7f4f5e950d1
--- /dev/null
+++ b/vendor/gems/ipynbdiff/Gemfile
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+source 'https://rubygems.org'
+
+gemspec
diff --git a/vendor/gems/ipynbdiff/Gemfile.lock b/vendor/gems/ipynbdiff/Gemfile.lock
new file mode 100644
index 00000000000..1c2fd81e3b4
--- /dev/null
+++ b/vendor/gems/ipynbdiff/Gemfile.lock
@@ -0,0 +1,67 @@
+PATH
+ remote: .
+ specs:
+ ipynbdiff (0.4.7)
+ diffy (~> 3.3)
+ oj (~> 3.13.16)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ ast (2.4.2)
+ benchmark-memory (0.2.0)
+ memory_profiler (~> 1)
+ binding_ninja (0.2.3)
+ coderay (1.1.3)
+ diff-lcs (1.5.0)
+ diffy (3.4.2)
+ memory_profiler (1.0.0)
+ method_source (1.0.0)
+ oj (3.13.16)
+ parser (3.1.2.0)
+ ast (~> 2.4.1)
+ proc_to_ast (0.1.0)
+ coderay
+ parser
+ unparser
+ pry (0.14.1)
+ coderay (~> 1.1)
+ method_source (~> 1.0)
+ rake (13.0.6)
+ rspec (3.11.0)
+ rspec-core (~> 3.11.0)
+ rspec-expectations (~> 3.11.0)
+ rspec-mocks (~> 3.11.0)
+ rspec-core (3.11.0)
+ rspec-support (~> 3.11.0)
+ rspec-expectations (3.11.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-mocks (3.11.1)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-parameterized (0.5.2)
+ binding_ninja (>= 0.2.3)
+ parser
+ proc_to_ast
+ rspec (>= 2.13, < 4)
+ unparser
+ rspec-support (3.11.0)
+ unparser (0.6.5)
+ diff-lcs (~> 1.3)
+ parser (>= 3.1.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ benchmark-memory (~> 0.2.0)
+ bundler (~> 2.2)
+ ipynbdiff!
+ pry (~> 0.14)
+ rake (~> 13.0)
+ rspec (~> 3.10)
+ rspec-parameterized (~> 0.5.1)
+
+BUNDLED WITH
+ 2.3.16
diff --git a/vendor/gems/ipynbdiff/LICENSE b/vendor/gems/ipynbdiff/LICENSE
new file mode 100644
index 00000000000..e6de2f90864
--- /dev/null
+++ b/vendor/gems/ipynbdiff/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016-2021 GitLab B.V.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/gems/ipynbdiff/README.md b/vendor/gems/ipynbdiff/README.md
new file mode 100644
index 00000000000..f046f678a4d
--- /dev/null
+++ b/vendor/gems/ipynbdiff/README.md
@@ -0,0 +1,56 @@
+# IpynbDiff: Better diff for Jupyter Notebooks
+
+This is a simple diff tool that cleans up Jupyter notebooks, transforming each [notebook](example/1/from.ipynb)
+into a [readable markdown file](example/1/from_html.md), keeping the output of cells, and running the
+diff after. Markdowns are generated using an opinionated Jupyter to Markdown conversion. This means
+that the entire file is readable on the diff.
+
+The result are diffs that are much easier to read:
+
+| Diff | IpynbDiff |
+| ----------------------------------- | ----------------------------------------------------- |
+| [Diff text](example/diff.txt) | [IpynbDiff text](example/ipynbdiff_percent.txt) |
+| ![Diff image](example/img/diff.png) | ![IpynbDiff image](example/img/ipynbdiff_percent.png) |
+
+This started as a port of [ipynbdiff](https://gitlab.com/gitlab-org/incubation-engineering/mlops/poc/ipynbdiff),
+but now has extended functionality although not working as git driver.
+
+## Usage
+
+### Generating diffs
+
+```ruby
+IpynbDiff.diff(from_path, to_path, options)
+```
+
+Options:
+
+```ruby
+@default_transform_options = {
+ preprocess_input: true, # Whether the input should be transformed
+ write_output_to: nil, # Pass a path to save the output to a file
+ format: :text, # These are the formats Diffy accepts https://github.com/samg/diffy
+ sources_are_files: false, # Weather to use the from/to as string or path to a file
+ raise_if_invalid_notebook: false, # Raises an error if the notebooks are invalid, otherwise returns nil
+ transform_options: @default_transform_options, # See below for transform options
+ diff_opts: {
+ include_diff_info: false # These are passed to Diffy https://github.com/samg/diffy
+ }
+}
+```
+
+### Transforming the notebooks
+
+It might be necessary to have the transformed files in addition to the diff.
+
+```ruby
+IpynbDiff.transform(notebook, options)
+```
+
+Options:
+
+```ruby
+@default_transform_options = {
+ include_frontmatter: false, # Whether to include or not the notebook metadata (kernel, language, etc)
+}
+```
diff --git a/vendor/gems/ipynbdiff/ipynbdiff.gemspec b/vendor/gems/ipynbdiff/ipynbdiff.gemspec
new file mode 100644
index 00000000000..3054118ea47
--- /dev/null
+++ b/vendor/gems/ipynbdiff/ipynbdiff.gemspec
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+lib = File.expand_path('lib/..', __dir__)
+$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
+
+require 'lib/version'
+
+Gem::Specification.new do |s|
+ s.name = 'ipynbdiff'
+ s.version = IpynbDiff::VERSION
+ s.summary = 'Human Readable diffs for Jupyter Notebooks'
+ s.description = 'Better diff for Jupyter Notebooks by first preprocessing them and removing clutter'
+ s.authors = ['Eduardo Bonet']
+ s.email = 'ebonet@gitlab.com'
+ # Specify which files should be added to the gem when it is released.
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
+ s.files = Dir.glob("lib/**/*.*")
+ s.test_files = Dir.glob("spec/**/*.*")
+ s.homepage =
+ 'https://gitlab.com/gitlab-org/incubation-engineering/mlops/rb-ipynbdiff'
+ s.license = 'MIT'
+
+ s.require_paths = ['lib']
+
+ s.add_runtime_dependency 'diffy', '~> 3.3'
+ s.add_runtime_dependency 'oj', '~> 3.13.16'
+
+ s.add_development_dependency 'bundler', '~> 2.2'
+ s.add_development_dependency 'pry', '~> 0.14'
+ s.add_development_dependency 'rake', '~> 13.0'
+ s.add_development_dependency 'rspec', '~> 3.10'
+ s.add_development_dependency 'rspec-parameterized', '~> 0.5.1'
+ s.add_development_dependency 'benchmark-memory', '~>0.2.0'
+end
diff --git a/vendor/gems/ipynbdiff/lib/diff.rb b/vendor/gems/ipynbdiff/lib/diff.rb
new file mode 100644
index 00000000000..3554ac55d99
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/diff.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+# Custom differ for Jupyter Notebooks
+module IpynbDiff
+ require 'delegate'
+
+ # The result of a diff object
+ class Diff < SimpleDelegator
+ require 'diffy'
+
+ attr_reader :from, :to
+
+ def initialize(from, to, diffy_opts)
+ super(Diffy::Diff.new(from.as_text, to.as_text, **diffy_opts))
+
+ @from = from
+ @to = to
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/ipynbdiff.rb b/vendor/gems/ipynbdiff/lib/ipynbdiff.rb
new file mode 100644
index 00000000000..1765e434bf9
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/ipynbdiff.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+# Human Readable Jupyter Diffs
+module IpynbDiff
+ require 'transformer'
+ require 'diff'
+
+ def self.diff(from, to, raise_if_invalid_nb: false, include_frontmatter: false, hide_images: false, diffy_opts: {})
+ transformer = Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images)
+
+ Diff.new(transformer.transform(from), transformer.transform(to), diffy_opts)
+ rescue InvalidNotebookError
+ raise if raise_if_invalid_nb
+ end
+
+ def self.transform(notebook, raise_errors: false, include_frontmatter: true, hide_images: false)
+ return unless notebook
+
+ Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images).transform(notebook).as_text
+ rescue InvalidNotebookError
+ raise if raise_errors
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/output_transformer.rb b/vendor/gems/ipynbdiff/lib/output_transformer.rb
new file mode 100644
index 00000000000..57e8a9edce3
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/output_transformer.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ # Transforms Jupyter output data into markdown
+ class OutputTransformer
+ require 'symbolized_markdown_helper'
+ include SymbolizedMarkdownHelper
+
+ HIDDEN_IMAGE_OUTPUT = ' [Hidden Image Output]'
+
+ ORDERED_KEYS = {
+ 'execute_result' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex text/plain],
+ 'display_data' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex],
+ 'stream' => %w[text]
+ }.freeze
+
+ def initialize(hide_images = false)
+ @hide_images = hide_images
+ end
+
+ def transform(output, symbol)
+ case (output_type = output['output_type'])
+ when 'error'
+ transform_error(output['traceback'], symbol / 'traceback')
+ when 'execute_result', 'display_data'
+ transform_non_error(ORDERED_KEYS[output_type], output['data'], symbol / 'data')
+ when 'stream'
+ transform_element('text', output['text'], symbol)
+ end
+ end
+
+ def transform_error(traceback, symbol)
+ traceback.map.with_index do |t, idx|
+ t.split("\n").map do |l|
+ _(symbol / idx, l.gsub(/\[[0-9][0-9;]*m/, '').sub("\u001B", ' ').gsub(/\u001B/, '').rstrip)
+ end
+ end
+ end
+
+ def transform_non_error(accepted_keys, elements, symbol)
+ accepted_keys.filter { |key| elements.key?(key) }.map do |key|
+ transform_element(key, elements[key], symbol)
+ end
+ end
+
+ def transform_element(output_type, output_element, symbol_prefix)
+ new_symbol = symbol_prefix / output_type
+ case output_type
+ when 'image/png', 'image/jpeg'
+ transform_image(output_type + ';base64', output_element, new_symbol)
+ when 'image/svg+xml'
+ transform_image(output_type + ';utf8', output_element, new_symbol)
+ when 'text/markdown', 'text/latex', 'text/plain', 'text'
+ transform_text(output_element, new_symbol)
+ end
+ end
+
+ def transform_image(image_type, image_content, symbol)
+ return _(nil, HIDDEN_IMAGE_OUTPUT) if @hide_images
+
+ lines = image_content.is_a?(Array) ? image_content : [image_content]
+
+ single_line = lines.map(&:strip).join.gsub(/\s+/, ' ')
+
+ _(symbol, " ![](data:#{image_type},#{single_line})")
+ end
+
+ def transform_text(text_content, symbol)
+ symbolize_array(symbol, text_content) { |l| " #{l.rstrip}" }
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/symbol_map.rb b/vendor/gems/ipynbdiff/lib/symbol_map.rb
new file mode 100644
index 00000000000..89cbccbed1b
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/symbol_map.rb
@@ -0,0 +1,107 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ require 'oj'
+
+ # Creates a map from a symbol to the line number it appears in a Json file
+ #
+ # Example:
+ #
+ # Input:
+ #
+ # 1. {
+ # 2. 'obj1': [
+ # 3. {
+ # 4. 'obj2': 5
+ # 5. },
+ # 6. 3,
+ # 7. {
+ # 8. 'obj3': {
+ # 9. 'obj4': 'b'
+ # 10. }
+ # 11. }
+ # 12. ]
+ # 13.}
+ #
+ # Output:
+ #
+ # Symbol Line Number
+ # .obj1 -> 2
+ # .obj1.0 -> 3
+ # .obj1.0 -> 3
+ # .obj1.0.obj2 -> 4
+ # .obj1.1 -> 6
+ # .obj1.2 -> 7
+ # .obj1.2.obj3 -> 8
+ # .obj1.2.obj3.obj4 -> 9
+ #
+ class SymbolMap
+ class << self
+ def handler
+ @handler ||= SymbolMap.new
+ end
+
+ def parser
+ @parser ||= Oj::Parser.new(:saj).tap { |p| p.handler = handler }
+ end
+
+ def parse(notebook, *args)
+ handler.reset
+ parser.parse(notebook)
+ handler.symbols
+ end
+ end
+
+ attr_accessor :symbols
+
+ def hash_start(key, line, column)
+ add_symbol(key_or_index(key), line)
+ end
+
+ def hash_end(key, line, column)
+ @current_path.pop
+ end
+
+ def array_start(key, line, column)
+ @current_array_index << 0
+
+ add_symbol(key, line)
+ end
+
+ def array_end(key, line, column)
+ @current_path.pop
+ @current_array_index.pop
+ end
+
+ def add_value(value, key, line, column)
+ add_symbol(key_or_index(key), line)
+
+ @current_path.pop
+ end
+
+ def add_symbol(symbol, line)
+ @symbols[@current_path.append(symbol).join('.')] = line if symbol
+ end
+
+ def key_or_index(key)
+ if key.nil? # value in an array
+ if @current_path.empty?
+ @current_path = ['']
+ return nil
+ end
+
+ symbol = @current_array_index.last
+ @current_array_index[-1] += 1
+ symbol
+ else
+ key
+ end
+ end
+
+ def reset
+ @current_path = []
+ @symbols = {}
+ @current_array_index = []
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb b/vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb
new file mode 100644
index 00000000000..918666ed899
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ # Helper functions
+ module SymbolizedMarkdownHelper
+
+ def _(symbol = nil, content = '')
+ { symbol: symbol, content: content }
+ end
+
+ def symbolize_array(symbol, content, &block)
+ if content.is_a?(Array)
+ content.map.with_index { |l, idx| _(symbol / idx, block.call(l)) }
+ else
+ _(symbol, content)
+ end
+ end
+ end
+
+ # Simple wrapper for a string
+ class JsonSymbol < String
+ def /(other)
+ JsonSymbol.new((other.is_a?(Array) ? [self, *other] : [self, other]).join('.'))
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/transformed_notebook.rb b/vendor/gems/ipynbdiff/lib/transformed_notebook.rb
new file mode 100644
index 00000000000..f98e5f68086
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/transformed_notebook.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ # Notebook that was transformed into md, including location of source cells
+ class TransformedNotebook
+ attr_reader :blocks
+
+ def as_text
+ @blocks.map { |b| b[:content].gsub(/\n/, '\\n') }.join("\n")
+ end
+
+ private
+
+ def initialize(lines = [], symbol_map = {})
+ @blocks = lines.map do |line|
+ { content: line[:content], source_symbol: (symbol = line[:symbol]), source_line: symbol && symbol_map[symbol] }
+ end
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/transformer.rb b/vendor/gems/ipynbdiff/lib/transformer.rb
new file mode 100644
index 00000000000..1b2c63bb35c
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/transformer.rb
@@ -0,0 +1,112 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ require 'oj'
+
+ class InvalidNotebookError < StandardError
+ end
+
+ # Returns a markdown version of the Jupyter Notebook
+ class Transformer
+ require 'json'
+ require 'yaml'
+ require 'output_transformer'
+ require 'symbolized_markdown_helper'
+ require 'symbol_map'
+ require 'transformed_notebook'
+ include SymbolizedMarkdownHelper
+
+ @include_frontmatter = true
+
+ def initialize(include_frontmatter: true, hide_images: false)
+ @include_frontmatter = include_frontmatter
+ @hide_images = hide_images
+ @out_transformer = OutputTransformer.new(hide_images)
+ end
+
+ def validate_notebook(notebook)
+ notebook_json = Oj::Parser.usual.parse(notebook)
+
+ return notebook_json if notebook_json.key?('cells')
+
+ raise InvalidNotebookError
+ rescue EncodingError, Oj::ParseError, JSON::ParserError
+ raise InvalidNotebookError
+ end
+
+ def transform(notebook)
+ return TransformedNotebook.new unless notebook
+
+ notebook_json = validate_notebook(notebook)
+ transformed = transform_document(notebook_json)
+ symbol_map = SymbolMap.parse(notebook)
+
+ TransformedNotebook.new(transformed, symbol_map)
+ end
+
+ def transform_document(notebook)
+ symbol = JsonSymbol.new('.cells')
+
+ transformed_blocks = notebook['cells'].map.with_index do |cell, idx|
+ decorate_cell(transform_cell(cell, notebook, symbol / idx), cell, symbol / idx)
+ end
+
+ transformed_blocks.prepend(transform_metadata(notebook)) if @include_frontmatter
+ transformed_blocks.flatten
+ end
+
+ def decorate_cell(rows, cell, symbol)
+ tags = cell['metadata']&.fetch('tags', [])
+ type = cell['cell_type'] || 'raw'
+
+ [
+ _(symbol, %(%% Cell type:#{type} id:#{cell['id']} tags:#{tags&.join(',')})),
+ _,
+ rows,
+ _
+ ]
+ end
+
+ def transform_cell(cell, notebook, symbol)
+ cell['cell_type'] == 'code' ? transform_code_cell(cell, notebook, symbol) : transform_text_cell(cell, symbol)
+ end
+
+ def transform_code_cell(cell, notebook, symbol)
+ [
+ _(symbol / 'source', %(``` #{notebook.dig('metadata', 'kernelspec', 'language') || ''})),
+ symbolize_array(symbol / 'source', cell['source'], &:rstrip),
+ _(nil, '```'),
+ transform_outputs(cell['outputs'], symbol)
+ ]
+ end
+
+ def transform_outputs(outputs, symbol)
+ transformed = outputs.map
+ .with_index { |output, i| @out_transformer.transform(output, symbol / ['outputs', i]) }
+ .compact
+ .map { |el| [_, el] }
+
+ [
+ transformed.empty? ? [] : [_, _(symbol / 'outputs', '%% Output')],
+ transformed
+ ]
+ end
+
+ def transform_text_cell(cell, symbol)
+ symbolize_array(symbol / 'source', cell['source'], &:rstrip)
+ end
+
+ def transform_metadata(notebook_json)
+ as_yaml = {
+ 'jupyter' => {
+ 'kernelspec' => notebook_json['metadata']['kernelspec'],
+ 'language_info' => notebook_json['metadata']['language_info'],
+ 'nbformat' => notebook_json['nbformat'],
+ 'nbformat_minor' => notebook_json['nbformat_minor']
+ }
+ }.to_yaml
+
+ as_yaml.split("\n").map { |l| _(nil, l) }.append(_(nil, '---'), _)
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/version.rb b/vendor/gems/ipynbdiff/lib/version.rb
new file mode 100644
index 00000000000..1451bb4ef32
--- /dev/null
+++ b/vendor/gems/ipynbdiff/lib/version.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ VERSION = '0.4.7'
+end
diff --git a/vendor/gems/ipynbdiff/spec/benchmark.rb b/vendor/gems/ipynbdiff/spec/benchmark.rb
new file mode 100644
index 00000000000..99f088f2056
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/benchmark.rb
@@ -0,0 +1,64 @@
+require 'ipynbdiff'
+require 'benchmark'
+require 'benchmark/memory'
+require_relative 'test_helper'
+
+large_cell = '{
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "24f32781-48bf-4378-b30c-ccdce7b05ba0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABj0AAAHwCAYAAAD91q10AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPSUlEQVR4nO39eZCfd34f+L2fxkmAAAiCBO/7PobHkCAxIEjcV/eWHTl/yOVKvFaloo3kTZXjlKUa2bVS4tiyna2JElmudaUqK+0m9m4ceVVxutEAiIMXeIEEObyG4PC+QPAEQIA4+8kfD1pf/DgkhwC78XT/+vWqYmHQnybxLml6COCNz/dT1XUdAAAAAACA8a6n7QAAAAAAAAAjQekBAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BUmtx3g66qqqpJcnGR/21kAAAAAAIAxYVaSD+q6rr/rk8Zc6ZGm8Hiv7RAAAAAAAMCYcmmS97/rE8Zi6bE/Sd59993Mnj277SwAAAAAAECL9u3bl8suuyz5Hi9EjcXSI0kye/ZspQcAAAAAAPC9OWQOAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQegAAAAAAAF1B6QEAAAAAAHQFpQcAAAAAANAVlB4AAAAAAEBXUHoAAAAAAABdQekBAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXeGUSo+qqn5aVdXTVVXtr6pqT1VVf1VV1Q1f+5w/r6qq/tpfT4xsbAAAAAAA6DKffJJs2dJ2inFt8il+/pIkf5bk6RN/7z9LsrGqqpvruj5w0ucNJvmtk75/5AelBAAAAACAblPXyXPPJf39ycBA8sQTyfTpyaefJmed1Xa6cemUSo+6rtee/P2qqn4ryZ4kdyV5+KTR4bqud//weAAAAAAA0EX27082by5FxwcfdM6vvz55773kuuvayTfOneqmx9fNOfHtZ1/7+NKqqvYk+SLJQ0n+cV3Xe77pH1BV1bQk00760KwfmAkAAAAAAMaO115rSo7+/uThh5MjJz2ONGNGsnJl0teX9PYml17aXs4ucNqlR1VVVZKfJXm0rusXTxqtT/Ifkryd5Kok/zTJlqqq7qrr+vA3/KN+muQPTzcHAAAAAACMKYcPN+XG8DbHa691zq+5pik5+vqSBx5onrRiRFR1XZ/e31hVf5akL8niuq7f+47PuyhNAfK367r+j98w/6ZNj/f27t2b2bNnn1Y2AAAAAAA4o95/vyk4BgaSTZuSAyedwZ4ypSk3enubouP665Oqai/rOLNv377MmTMnSebUdb3vuz73tDY9qqr60yR/I8kD31V4JEld1x9WVfV2km98gOzE9sdfb4BU/h8NAAAAAMBYd/x48tRT5dmq557rnF94YSk5Vq5M/CH/M+KUSo8TT1r9aZLfSLK0rus3v8ffMy/JZUk+PK2EAAAAAAAwFnz2WbJhQ1NyDA4mn35aZlWV3HNPebbqjjuSnp7Wok5Up7rp8WdJ/k6Sv5lkf1VVF574+N66rr+qqursJH+U5C/TlBxXJvnnST5J8j+NRGAAAAAAADgj6jp54YXmyar+/mT79mRoqMznzEnWrGlKjrVrk/nz28tKklMvPX7nxLfbvvbx30ry50mOJ/lRkr+b5Jw0xcfWJL9Z1/X+0w0JAAAAAABnxIEDyZYt5Qj5u+92zm+5pWxzLFqUTD6tKxKMklP6/0Zd1995cKOu66+SrPlBiQAAAAAA4Ex6441ym2PbtuTw4TKbPj1ZsaIpOXp7kyuuaC0mv54KCgAAAACAieXo0eTRR0vR8YtfdM6vuKJscyxblpx1Vjs5OWVKDwAAAAAAut/u3cn69U3JsWlTsm9fmU2alCxeXIqOm25qDpMz7ig9AAAAAADoPkNDyY4d5Qj5jh2d8/PPb56r6u1NVq9OzjmnlZiMLKUHAAAAAADdYe/eZOPGpuRYvz7Zs6dzfvfdTcnR19f8556ednIyapQeAAAAAACMT3WdvPJKU3IMDDR3Oo4dK/NZs5otjr6+ZN265MIL28vKGaH0AAAAAABg/Pjqq2TbtnKE/K23Ouc33lhuc9x3XzJ1ahspaYnSAwAAAACAse2dd8o2x+bNTfExbNq0ZNmy8mzV1Ve3l5PWKT0AAAAAABhbjh1LHn+8bHO8+GLn/NJLyzbH8uXJzJnt5GTMUXoAAAAAANC+jz9OBgebkmPDhuSLL8qspydZtKgUHbfemlRVa1EZu5QeAAAAAACceXWd7NxZtjmeeqr52LB585K1a5uSY82a5Nxz28vKuKH0AAAAAADgzNi/P9m0qbnNMTCQfPhh5/yOO8o2xz33JJMmtRKT8UvpAQAAAADA6Nm1q2xzPPxwcvRomc2cmaxa1ZQc69Yll1zSXk66gtIDAAAAAICRc/hw8tBDTckxMJD88ped82uvLdscDzyQTJvWTk66ktIDAAAAAIAf5v33m4Kjvz958MHkwIEymzIlWbKkFB3XXddeTrqe0gMAAAAAgFNz/Hjy5JPl2arnn++cX3RR0tvblBwrVyazZrWTkwlH6QEAAAAAwK/32WfJ4GBTcgwONt8fVlXJvfeWbY477mg+BmeY0gMAAAAAgF9V18kLL5RtjscfT4aGyvycc5K1a5uNjrVrk/PPby0qDFN6AAAAAADQOHAg2by5HCF/773O+a23lm2On/wkmey3mBlb/DcSAAAAAGAie/31coR827bk8OEyO+usZMWKZpujtze54orWYsL3ofQAAAAAAJhIjhxJHn20PFv16qud8yuvLNscS5c2xQeME0oPAAAAAIBut3t3s80xMJBs3Jjs319mkycnixeXouPGGx0hZ9xSegAAAAAAdJuhoWTHjrLN8cwznfP588uTVatXJ3PmtJMTRpjSAwAAAACgG3zxRbPFMTCQrF+f7NnTOb/77rLNcdddSU9PKzFhNCk9AAAAAADGo7pOXnmlbHM8+mhy/HiZz57dbHH09ibr1iUXXtheVjhDlB4AAAAAAOPFV18lW7c2JcfAQPLWW53zG28s2xz33ZdMndpKTGiL0gMAAAAAYCx7++1ScmzZ0hQfw6ZNS5Yta7Y5+vqSq69uLyeMAUoPAAAAAICx5NixZPv28mzVSy91zi+9tGxzLF+ezJzZTk4Yg5QeAAAAAABt+/jj5vh4f3+yYUOyd2+Z9fQkixaVouPWW5Oqai8rjGFKDwAAAACAM21oKNm5s2xzPP10c5h82Lx5zfHxvr7mGPm557aXFcYRpQcAAAAAwJmwb1/y4IPlPsfu3Z3zO+8stznuuSeZNKmdnDCOKT0AAAAAAEZDXSe7dpVtjkceSY4eLfOZM5NVq5qSo7c3ufji9rJCl1B6AAAAAACMlEOHkoceKtscr7/eOb/uunKb4/77k2nT2skJXUrpAQAAAADwQ7z3XlNw9Pc3z1cdPFhmU6cmS5aUZ6uuu669nDABKD0AAAAAAE7F8ePJE0+UZ6t+/vPO+cUXl5Jj5crk7LPbyQkTkNIDAAAAAODX+fTTZHCw2egYHEw++6zMqipZuLA8W3X77c3HgDNO6QEAAAAA8HV13WxwDG9zPPFEMjRU5nPnJmvXNhsda9cm553XXlbgryk9AAAAAACS5Msvk82bm22OgYHmVsfJfvSjss2xcGEy2W+vwljjqxIAAAAAmLhef71sc2zblhw5UmZnndXc5Ojtbf66/PLWYgLfj9IDAAAAAJg4jhxJHnmkFB27dnXOr7qqbHMsXZpMn95KTOD0KD0AAAAAgO724YflyapNm5L9+8ts8uTk/vubTY6+vuTGGx0hh3FM6QEAAAAAdJehoeTpp8s2x7PPds7nzy8lx6pVyZw57eQERpzSAwAAAAAY/774ItmwoSk5BgeTjz/unC9Y0JQcvb3JXXclPT2txARGl9IDAAAAABh/6jp56aXmyar+/uSxx5Ljx8t89uxk9eqm6Fi3LrnggvayAmeM0gMAAAAAGB8OHky2bm1KjoGB5O23O+c33VSOkN93XzJlSjs5gdYoPQAAAACAseutt8ptjq1bk0OHymzatGT58vJs1VVXtRYTGBuUHgAAAADA2HH0aLJ9eyk6Xn65c37ZZWWbY/nyZMaMdnICY5LSAwAAAABo1549yfr1TcmxcWOyd2+ZTZqULFpUio5bbkmqqr2swJim9AAAAAAAzqyhoeTZZ8s2x44dzWHyYeed1xwf7+1N1qxJ5s5tLyswrig9AAAAAIDRt29fsmlTOUL+0Ued8x//uCk5+vqSBQuaDQ+AU6T0AAAAAABGXl0nr75atjkeeSQ5dqzMzz47WbWqKTnWrUsuvri9rEDXUHoAAAAAACPj0KFk27ayzfHGG53z668v2xz3359Mm9ZKTKB7KT0AAAAAgNP37rtNwdHfn2zenBw8WGZTpyZLl5ai49prW4sJTAxKDwAAAADg+zt2LHniifJs1QsvdM4vvrgpOPr6khUrmmesAM4QpQcAAAAA8N0++STZsKEpOQYHk88/L7OenmThwrLNcfvtSVW1lxWY0JQeAAAAAECnuk6ef75sczz5ZDI0VOZz5yZr1zYlx5o1yXnntZcV4CRKDwAAAAAg+fLL5MEHyxHyDz7onN92W1Ny9PY2mx2T/dYiMPb4XyYAAAAAmKh++cuyzfHQQ8mRI2U2Y0Zzk2O46LjssvZyAnxPSg8AAAAAmCiOHEkefrhsc+za1Tm/+upyhHzJkmT69HZyApwmpQcAAAAAdLMPPkjWr2+Kjk2bmmeshk2enNx/fyk6brjBEXJgXFN6AAAAAEA3OX48efrp8mzVzp2d8wsuaJ6r6utLVq1KZs9uJyfAKFB6AAAAAMB49/nnyYYNTckxOJh88kmZVVWyYEG5zfHjHyc9Pe1lBRhFSg8AAAAAGG/qOnnppbLNsX17s+ExbM6cZM2apuRYty6ZP7+9rABnkNIDAAAAAMaDgweTLVvKEfJ33umc33xzuc2xaFEyZUo7OQFapPQAAAAAgLHqzTdLybF1a3LoUJlNn54sX16erbryytZiAowVSg8AAAAAGCuOHk0efbQpOfr7k1de6ZxffnnZ5li2LJkxo52cAGOU0gMAAAAA2vTRR8n69U3JsXFjsm9fmU2alNx3Xyk6br65OUwOwDdSegAAAADAmTQ0lDzzTDlCvmNH5/z885vj4319yapVydy57eQEGIeUHgAAAAAw2vbuTTZtakqO9eub7Y6T3XVXc5ejry9ZsCDp6WknJ8A4p/QAAAAAgJFW18kvflG2OR59NDl2rMxnzWq2OPr6mq2Oiy5qLytAF1F6AAAAAMBIOHQo2bq1HCF/883O+Q03NCVHb29y//3J1Knt5AToYkoPAAAAADhd775btjk2b06++qrMpk5Nli4tR8ivuaa1mAATxSmVHlVV/TTJ30pyY5KvkmxP8vt1Xb960udUSf4wyW8nmZvkySR/v67rl0YqNAAAAAC04tix5PHHyzbHCy90zi+5pGxzrFiRnH12OzkBJqhT3fRYkuTPkjx94u/9Z0k2VlV1c13XB058zu8l+YdJ/l6SXUn+SZJNVVXdUNf1/hFJDQAAAABnyiefJIODTcmxYUPy+edl1tOTLFxYtjluuy2pqvayAkxwVV3Xp/83V9X5SfYkWVLX9cMntjw+SPIndV3/yxOfMy3JR2k2Qv7t9/hnzk6yd+/evZk9e/ZpZwMAAACA01LXyXPPNSXHwEDyxBPNx4ade26ydm1TcqxZk8yb11pUgIlg3759mTNnTpLMqet633d97g+96THnxLefnfj2qiQXJtk4/Al1XR+uquqhJIuS/ErpcaIUmXbSh2b9wEwAAAAAcGr2729ucgwXHR980Dm/7bayzXHvvclkp3IBxqLT/l/nE1sdP0vyaF3XL5748IUnvv3oa5/+UZIrvuUf9dM0N0AAAAAA4Mx57bVyhPzhh5MjR8psxoxk5cpyn+PSS9vLCcD39kMq6X+d5LYki79h9vU3s6pv+NiwP05TngybleS9H5ALAAAAAH7V4cNNuTG8zfHaa53za64pJceSJcn06e3kBOC0nVbpUVXVnyb5G0keqOv65IJi94lvL0zy4Ukfn59f3f5I0jx/leTwSf/s04kEAAAAAL/q/feT9eubouPBB5MvvyyzyZOTBx4oz1Zdf70j5ADj3CmVHieetPrTJL+RZGld129+7VPeTFN8rEqy88TfMzXJkiS//4PTAgAAAMB3OX48eeqp8mzVc891zi+8sNnk6Otrnq+aPbuVmACMjlPd9PizJH8nyd9Msr+qquEbHnvruv6qruu6qqo/SfIHVVW9luS1JH+Q5GCSfzdCmQEAAACg+OyzZMOGpuQYHEw+/bTMqiq5557ybNWddyY9Pe1lBWBUnWrp8Tsnvt32tY//VpI/P/Gf/1WSs5L8myRzkzyZZHVd1/tPLyIAAAAAnKSukxdeaO5y9Pcn27cnQ0NlPmdOsmZNU3SsXZvMn99eVgDOqKquv+2+eDuqqpqdZO/evXsz23ohAAAAAEly4ECyZUs5Qv7uu53zW24ptzkWLWrudQDQFfbt25c5c+YkyZy6rvd91+f6X38AAAAAxqY33ii3ObZtSw4fLrPp05MVK8qzVVdc0VpMAMYOpQcAAAAAY8ORI8ljj5Wi4xe/6JxfcUXZ5li2LDnrrHZyAjBmKT0AAAAAaM/u3cn69U3JsXFjsv+ks7CTJiWLF5ei46abmsPkAPAtlB4AAAAAnDlDQ8mOHeU2x44dnfPzz2+eq+rtTVavTs45p5WYAIxPSg8AAAAARtcXXySbNjVFx/r1yZ49nfO77irbHHffnfT0tBITgPFP6QEAAADAyKrr5JVXym2Oxx5Ljh0r81mzmi2Ovr5k3brkwgvbywpAV1F6AAAAAPDDffVVsm1bKTreeqtzfsMNZZtj8eJk6tQ2UgLQ5ZQeAAAAAJyed94pJceWLU3xMWzatGTp0qbk6O1NrrmmtZgATBxKDwAAAAC+n2PHku3byxHyF1/snF96aSk5VqxIZs5sJycAE5bSAwAAAIBv9/HHyeBgU3Rs2NAcJR/W05P85Cfl2aof/SipqtaiAoDSAwAAAICirpOdO8s2x5NPNh8bdu65zfHxvr7mGPm8ee1lBYCvUXoAAAAATHT79ycPPliKjg8/7JzffnvZ5rj33mTSpHZyAsCvofQAAAAAmIh27SpHyB9+ODl6tMxmzkxWrmxKjnXrmlsdADAOKD0AAAAAJoLDh5tyY7jo+OUvO+fXXFO2OZYsSaZNaycnAPwASg8AAACAbvX++81zVf39zfNVBw6U2ZQpyQMPlKLj+uvbywkAI0TpAQAAANAtjh9vDo8PFx3PPdc5v+iipLe3KTlWrkxmzWolJgCMFqUHAAAAwHj22WfJhg1NyTE4mHz6aZlVVXLPPWWb4447kp6e1qICwGhTegAAAACMJ3WdvPBCuc3x+OPJ0FCZn3NOsmZNU3KsXZucf35rUQHgTFN6AAAAAIx1Bw4kmzc3JcfAQPLee53zW29tSo7e3mTRomSy3/IBYGLyb0AAAACAsej118ttjm3bksOHy+yss5Lly0vRccUVrcUEgLFE6QEAAAAwFhw5kjz6aHm26tVXO+dXXllucyxd2hQfAEAHpQcAAABAW3bvbrY5BgaSjRuT/fvLbPLkZPHiZpOjry+56abmMDkA8K2UHgAAAABnytBQ8vTT5dmqZ57pnM+fn6xb15Qcq1cnc+a0kxMAximlBwAAAMBo+uKLZoujvz9Zvz75+OPO+d13l2er7ror6elpJSYAdAOlBwAAAMBIquvk5ZfLbY7HHkuOHy/z2bObLY7e3mar48IL28sKAF1G6QEAAADwQ331VbJ1ayk63n67c37jjWWb4777kqlT28kJAF1O6QEAAABwOt5+u5QcW7Ykhw6V2bRpybJl5Qj51Ve3lxMAJhClBwAAAMD3cexYsn17KTpeeqlzfumlZZtj+fJk5sx2cgLABKb0AAAAAPg2H3/cHB/v7082bEj27i2znp5k0aJSdNx6a1JV7WUFAJQeAAAAAH9taCjZuTMZGGiKjqeeag6TD5s3L1m7tik51qxJzj23vawAwK9QegAAAAAT2/79yaZNTckxMJDs3t05v+OOss1xzz3JpEmtxAQAfj2lBwAAADCx1HWya1fZ5nj44eTo0TKfOTNZtaopOdatSy65pL2sAMApUXoAAAAA3e/w4eShh8oR8tdf75xfd11TcvT2Jg88kEyb1k5OAOAHUXoAAAAA3en998uTVQ8+mBw4UGZTpiRLlpRnq667rr2cAMCIUXoAAAAA3eH48eTJJ8s2x/PPd84vvrjZ5OjrS1asSGbNaicnADBqlB4AAADA+PXZZ8ngYFNyDA423x9WVcnCheXZqjvuaD4GAHQtpQcAAAAwftR18vOfl2erHn88GRoq83POSdaubYqOtWuT885rLSoAcOYpPQAAAICx7cCBZPPmUnS8917n/Ec/Krc5Fi5MJvvtDgCYqPwsAAAAABh7Xn+93ObYti05cqTMzjorWbmyebKqtze5/PLWYgIAY4vSAwAAAGjfkSPJI4+UomPXrs75VVeVbY6lS5Pp01uJCQCMbUoPAAAAoB0ffpisX9+UHJs2Jfv3l9nkycn99zebHH19yY03OkIOAPxaSg8AAADgzBgaSp5+umxzPPts53z+/FJyrFqVzJnTTk4AYNxSegAAAACj54svkg0bmpJjcDD5+OPO+YIFTcnR25vcdVfS09NKTACgOyg9AAAAgJFT18nLL5dtjsceS44fL/PZs5PVq5uiY9265IIL2ssKAHQdpQcAAADwwxw8mGzd2pQcAwPJ2293zm+6qRwhv+++ZMqUdnICAF1P6QEAAACcurfeagqO/v5ky5bk0KEymzYtWbasFB1XXdVaTABgYlF6AAAAAL/e0aPJ9u3l2aqXX+6cX3ZZKTmWL09mzGgnJwAwoSk9AAAAgG+2Z0+yfn2z0bFhQ7J3b5lNmpQsWlSOkN96a1JV7WUFAIjSAwAAABg2NJTs3Fm2OZ5+ujlMPmzevOb4eF9fsmZNMndue1kBAL6B0gMAAAAmsn37kk2bmpJj/fpk9+7O+Z13lmerFixoNjwAAMYopQcAAABMJHWd7NpVtjkeeaS51zHs7LOTVauaJ6t6e5OLL24vKwDAKVJ6AAAAQLc7dCh56KFSdLzxRuf8uuvKNsf99yfTprWTEwDgB1J6AAAAQDd6772m4BgYSB58MDl4sMymTk2WLClHyK+7rr2cAAAjSOkBAAAA3eDYseTJJ8s2x89/3jm/+OKyzbFiRfOMFQBAl1F6AAAAwHj16afJ4GBTcmzYkHz2WZn19CQLFzabHH19ye23J1XVXlYAgDNA6QEAAADjRV0nzz/fPFnV35888UQyNFTmc+cma9c2JceaNcl557WXFQCgBUoPAAAAGMu+/DLZvLnc53j//c75bbeV2xwLFyaT/VIfAJi4/EwIAAAAxppf/rLc5njooeTIkTKbMaO5yTFcdFx2WXs5AQDGGKUHAAAAtO3IkeThh8uzVbt2dc6vvrocIV+yJJk+vZ2cAABjnNIDAAAA2vDhh6Xk2LSpecZq2OTJyQMPlG2OG25whBwA4HtQegAAAMCZcPx48vTT5TbHs892zi+4oCk4+vqSVauS2bPbyQkAMI4pPQAAAGC0fP55snFjU3SsX5988kmZVVWyYEHZ5vjxj5OenvayAgB0AaUHAAAAjJS6Tl56qRwh37692fAYNnt2smZNU3SsW5fMn99eVgCALqT0AAAAgB/i4MFky5Zyn+OddzrnN99cjpAvWpRMmdJOTgCACUDpAQAAAKfqrbfKNsfWrcmhQ2U2fXqyfHm5z3HllW2lBACYcJQeAAAA8OscPZo89lg5Qv7yy53zyy8v2xzLliUzZrSTEwBgglN6AAAAwDfZs6c5Pt7f3xwj37u3zCZNSu67r2xz3HJLc5gcAIBWKT0AAAAgSYaGkmefLc9W7djRHCYfdt55zfHxvr5k9epk7tz2sgIA8I2UHgAAAExc+/Y1WxwDA81fH33UOf/xj8uzVXff3Wx4AAAwZik9AAAAmDjqOnn11bLN8cgjybFjZX722cmqVU3JsW5dcvHF7WUFAOCUKT0AAADobocOJdu2lSPkb7zROb/++rLNcf/9ydSprcQEAOCHO+XSo6qqB5L8oyR3JbkoyW/Udf1XJ83/PMl//rW/7cm6rheefkwAAAA4Be++2xQc/f3J5s3JwYNlNnVqsnRpU3L09ibXXttaTAAARtbpbHrMTPJ8kv82yV9+y+cMJvmtk75/5DR+HAAAAPh+jh1LnniiPFv1wgud80suaQqOvr5kxYrmGSsAALrOKZcedV2vT7I+Saqq+rZPO1zX9e4fkAsAAAC+2yefJIODTcmxYUPy+edl1tOTLFxYnq267bbk238NCwBAlxitmx5Lq6rak+SLJA8l+cd1Xe/5pk+sqmpakmknfWjWKGUCAABgPKvr5Lnnym2OJ55oPjbs3HOTtWubjY61a5N581qLCgBAO0aj9Fif5D8keTvJVUn+aZItVVXdVdf14W/4/J8m+cNRyAEAAMB49+WXyYMPlqLjgw8657fdVrY57r03mTxaf7YPAIDxYMR/NljX9f940ndfrKpqR5oCpC/Jf/yGv+WPk/zspO/PSvLeSOcCAABgnHjttXKb4+GHkyMnnYmcMSNZubIcIb/00vZyAgAw5oz6H4Gp6/rDqqreTnLdt8wPJ/nrDZDvuBMCAABANzp8uCk3hrc5Xnutc3711WWbY8mSZPr0dnICADDmjXrpUVXVvCSXJflwtH8sAAAAxokPPmgKjv7+5vmqL78ss8mTkwceKEXH9dc7Qg4AwPdyyqVHVVVnJ7n2pA9dVVXVHUk+O/HXHyX5yzQlx5VJ/nmST5L8Tz8sKgAAAOPW8ePJU0+VbY6dOzvnF17YPFfV19c8XzV7djs5AQAY105n0+PuJFtP+v7wPY6/SPI7SX6U5O8mOSdN8bE1yW/Wdb3/9GMCAAAw7nz+ebJhQ1N0DA4mn3xSZlWVLFhQtjnuvDPp6WkvKwAAXeGUS4+6rrcl+a694jWnnQYAAIDxq66TF18sR8i3b0+Ghsp8zpxkzZqm5Fi7Npk/v72sAAB0pVG/6QEAAEAXO3gw2by53Od4993O+S23lGerFi1KpkxpJycAABOC0gMAAIBT8+abZZtj69bk8OEymz49Wb68KTl6e5Mrr2wtJgAAE4/SAwAAgO929Gjy6KNlm+OVVzrnV1xRbnMsXZrMmNFKTAAAUHoAAADwqz76KFm/vik5Nm5M9u0rs0mTkvvuK0XHzTc3h8kBAKBlSg8AAACag+PPPFOerdqxo3N+/vnJunXNk1WrVydz57aTEwAAvoPSAwAAYKLau7fZ4hgYaLY6Pvqoc37XXeU2x4IFSU9POzkBAOB7UnoAAABMFHXd3OMYvs3x6KPJsWNlPmtWsmpVU3SsW5dcdFF7WQEA4DQoPQAAALrZV18l27aVZ6veeqtzfsMN5TbH4sXJ1KltpAQAgBGh9AAAAOg277zTFBwDA8nmzU3xMWzq1GTZsvJs1TXXtJcTAABGmNIDAABgvDt2LHn88bLN8eKLnfNLL20Kjr6+ZMWKZObMdnICAMAoU3oAAACMRx9/nAwONiXHhg3JF1+UWU9P8pOflGerfvSjpKpaiwoAAGeK0gMAAGA8qOtk587ybNWTTzYfG3buuc3x8b6+ZPXqZN689rICAEBLlB4AAABj1f79yYMPlqLjww8757ffXrY57r03mTSpnZwAADBGKD0AAADGkl27Ssnx0EPJ0aNlNnNmsnJlOUJ+ySXt5QQAgDFI6QEAANCmw4eThx8uR8h/+cvO+bXXlpJjyZJk2rR2cgIAwDig9AAAADjT3n+/2eTo72+erzpwoMymTEkeeKA8W3X99e3lBACAcUbpAQAAMNqOH0+eeqpsczz3XOf8oouaTY6+vub5qlmzWokJAADjndIDAABgNHz2WbJhQ1NyDA4mn35aZlWV3HNP2ea4446kp6e1qAAA0C2UHgAAACOhrpMXXijPVm3fngwNlfk55yRr1jQlx9q1yfnntxYVAAC6ldIDAADgdB04kGzZ0pQcAwPJu+92zm+9tTxbtWhRMtkvwQAAYDT5GTcAAMCpeOONcptj27bk8OEyO+usZPnypuTo7U2uuKK1mAAAMBEpPQAAAL7LkSPJY4+VouMXv+icX3llKTmWLWuKDwAAoBVKDwAAgK/bvTtZv74pOTZuTPbvL7NJk5LFi8sR8ptuag6TAwAArVN6AAAADA0lO3aUbY5nnumcz5+frFvXlByrVjVHyQEAgDFH6QEAAExMX3zRbHEMDDRbHXv2dM7vvrs8W3X33UlPTysxAQCA70/pAQAATAx1nbzyStnmePTR5PjxMp81K1m9uik61q1LLrywvawAAMBpUXoAAADd66uvkq1bm5JjYCB5663O+Y03ltsc992XTJ3aSkwAAGBkKD0AAIDu8vbbpeTYsqUpPoZNm5YsW9Y8WdXXl1x9dXs5AQCAEaf0AAAAxrdjx5Lt28uzVS+91Dm/9NKyzbF8eTJzZjs5AQCAUaf0AAAAxp+PP26Oj/f3Jxs2JHv3lllPT7JoUSk6br01qar2sgIAAGeM0gMAABj7hoaSnTubJ6v6+5OnnmoOkw+bNy9Zu7YpOdasSc49t72sAABAa5QeAADA2LR/f7JpU7nPsXt35/yOO8o2xz33JJMmtRITAAAYO5QeAADA2FDXya5dZZvj4YeTo0fLfObMZNWqpuRYty655JL2sgIAAGOS0gMAAGjP4cPJQw+VI+Svv945v/bass3xwAPJtGnt5AQAAMYFpQcAAHBmvfde2ebYvDk5cKDMpkxJlixpSo7e3uT669vLCQAAjDtKDwAAYHQdP548+WTZ5nj++c75RRc1BUdfX7JyZTJrVjs5AQCAcU/pAQAAjLzPPksGB5uSY3Cw+f6wqkruvbc8W3XHHc3HAAAAfiClBwAA8MPVdfLznzclx8BA8vjjydBQmZ9zTrJmTVNyrF2bnH9+a1EBAIDupfQAAABOz4EDzU2O4aLjvfc657feWrY5fvKTZLJffgAAAKPLrzoAAIDv7/XXy22ObduSI0fK7KyzkhUryhHyyy9vLSYAADAxKT0AAIBvd+RI8sgjZZvj1Vc751ddVUqOpUub4gMAAKAlSg8AAKDThx82BcfAQLJpU7J/f5lNnpwsXlyerbrxRkfIAQCAMUPpAQAAE93QUPL00+XZqmef7ZzPn99scvT1JatWJXPmtJMTAADg11B6AADARPTFF8mGDU3JMTiYfPxx53zBgvJs1V13JT09rcQEAAA4FUoPAACYCOo6eeml5smq/v7ksceS48fLfPbsZPXqpuhYty654IL2sgIAAJwmpQcAAHSrgweTrVvLEfK33+6c33RTuc1x333JlCnt5AQAABghSg8AAOgmb71VSo4tW5JDh8ps2rRk+fJyn+Oqq1qLCQAAMBqUHgAAMJ4dPZps316OkL/8cuf8ssvKNsfy5cmMGe3kBAAAOAOUHgAAMN7s2ZOsX9+UHBs3Jnv3ltmkScmiRaXouOWWpKraywoAAHAGKT0AAGCsGxpKdu4s2xxPP90cJh82b15zfLyvL1mzJpk7t72sAAAALVJ6AADAWLRvX7JpU1NyrF+f7N7dOb/zzrLNsWBBs+EBAAAwwSk9AABgLKjrZNeuss3xyCPNvY5hZ5+drFrVHCHv7U0uvri9rAAAAGOU0gMAANpy6FDy0EOl6Hjjjc75ddeVbY7770+mTWsnJwAAwDih9AAAgDPpvfeSgYGm5HjwweTgwTKbOjVZsqQpOXp7m9IDAACA703pAQAAo+n48eSJJ8o2x89/3jm/+OKm4OjrS1aubJ6xAgAA4LQoPQAAYKR9+mkyONhsdAwOJp99VmZVlSxcWJ6tuv325mMAAAD8YEoPAAD4oeq62eAY3uZ44olkaKjM585N1q5tSo41a5LzzmsvKwAAQBdTegAAwOn48stk8+Zmm2NgoLnVcbLbbivPVi1cmEz2U28AAIDR5ldeAADwfb3+etnm2LYtOXKkzGbMSFasKEfIL7ustZgAAAATldIDAAC+zZEjySOPlKJj167O+dVXl5Jj6dJk+vRWYgIAANBQegAAwMk+/DBZv74pOTZtSvbvL7PJk5P77y9HyG+4wRFyAACAMUTpAQDAxDY0lDz9dNnmePbZzvkFF5TbHKtWJbNnt5MTAACAX0vpAQDAxPPFF8mGDU3JMTiYfPxxmVVVsmBB2ea4886kp6e1qAAAAHx/Sg8AALpfXScvvZQMDDRFx2OPJcePl/mcOcmaNc1Gx7p1yfz57WUFAADgtCk9AADoTgcPJlu3NiXHwEDy9tud85tvLtscixYlU6a0kxMAAIARo/QAAKB7vPVWuc2xdWty6FCZTZ+eLF9e7nNceWVbKQEAABglSg8AAMavo0eT7dtL0fHyy53zyy8v2xzLliUzZrSTEwAAgDNC6QEAwPiyZ0+yfn1TcmzcmOzdW2aTJiX33deUHL29yS23NIfJAQAAmBCUHgAAjG1DQ8mzz5Ztjh07msPkw847rzk+3teXrF6dzJ3bXlYAAABapfQAAGDs2bcv2bSpHCH/6KPO+Y9/XLY5FixoNjwAAACY8JQeAAC0r66TV18t2xyPPJIcO1bmZ5+drFrVFB3r1iUXX9xeVgAAAMasUy49qqp6IMk/SnJXkouS/EZd13910rxK8odJfjvJ3CRPJvn7dV2/NBKBAQDoEocOJdu2lW2ON97onF9/fbPJ0deX3H9/Mm1aKzEBAAAYP05n02NmkueT/LdJ/vIb5r+X5B8m+XtJdiX5J0k2VVV1Q13X+08zJwAA3eDdd5uCo78/2bw5OXiwzKZOTZYuLUXHtde2FhMAAIDx6ZRLj7qu1ydZnyTNUkdxYsvjHyT5Z3Vd/8cTH/vPk3yU5O8k+bc/LC4AAOPKsWPJE0+UZ6teeKFzfvHFTcHR15esWNE8YwUAAACnaaRvelyV5MIkG4c/UNf14aqqHkqyKN9QelRVNS3JyW8VzBrhTAAAnEmffJJs2NCUHIODyeefl1lPT7JwYdnmuP325Gt/kAYAAABO10iXHhee+Pajr338oyRXfMvf89M0N0AAABiP6jp5/vmyzfHkk8nQUJnPnZusXduUHGvWJOed115WAAAAutpIlx7D6q99v/qGjw374yQ/O+n7s5K8NxqhAAAYIV9+mTz4YDlC/sEHnfPbbmtKjt7eZrNj8mj9tBMAAACKkf7V5+4T316Y5MOTPj4/v7r9kaR5/irJ4eHvf/1OCAAAY8Qvf1m2OR56KDlypMxmzGhucgwXHZdd1l5OAAAAJqyRLj3eTFN8rEqyM0mqqpqaZEmS3x/hHwsAgNF05Ejy8MNlm2PXrs751VeXI+RLliTTp7eTEwAAAE445dKjqqqzk1x70oeuqqrqjiSf1XX9TlVVf5LkD6qqei3Ja0n+IMnBJP/uh8cFAGBUffBBsn59U3Rs2tQ8YzVs8uTk/vtL0XHDDY6QAwAAMKaczqbH3Um2nvT94Xscf5Hk7yX5V0nOSvJvksxN8mSS1XVd7z/9mAAAjIrjx5Onny7PVu3c2Tm/4ILmuaq+vmTVqmT27HZyAgAAwPdQ1fW33RdvR1VVs5Ps3bt3b2b7RTUAwMj7/PNkw4am5BgcTD75pMyqKlmwoNzm+PGPk56e9rICAAAw4e3bty9z5sxJkjl1Xe/7rs8d6ZseAACMNXWdvPRS2ebYvr3Z8Bg2Z06yZk1Tcqxbl8yf315WAAAA+AGUHgAA3ejgwWTLlnKE/J13Ouc331xucyxalEyZ0k5OAAAAGEFKDwCAbvHmm6Xk2Lo1OXSozKZPT5YvL89WXXllazEBAABgtCg9AADGq6NHk0cfbUqO/v7klVc655dfXrY5li1LZsxoJycAAACcIUoPAIDx5KOPkvXrm5Jj48Zk30n32yZNSu67rxQdN9/cHCYHAACACULpAQAwlg0NJc88U7Y5nn66c37++c3x8b6+ZNWqZO7cdnICAADAGKD0AAAYa/buTTZtakqO9eub7Y6T3XVXc5ejry9ZsCDp6WknJwAAAIwxSg8AgLbVdfKLXzQlR39/c6fj2LEynzWr2eLo62u2Oi66qL2sAAAAMIYpPQAA2nDoULJ1a3m26s03O+c33NCUHL29yf33J1OntpMTAAAAxhGlBwDAmfLuu2WbY/Pm5Kuvymzq1GTp0nKE/JprWosJAAAA45XSAwBgtBw7ljz+eNnmeOGFzvkll5SSY8WKZObMdnICAABAl1B6AACMpE8+SQYHm5Jjw4bk88/LrKcnWbiwFB233ZZUVXtZAQAAoMsoPQAAfoi6Tp57rik5BgaSJ55oPjbs3HOTtWubkmPNmmTevNaiAgAAQLdTegAAnKr9+5ubHMNFxwcfdM5vv70cIV+4MJk0qZ2cAAAAMMEoPQAAvo/XXitHyB9+ODlypMxmzEhWrixFx6WXtpcTAAAAJjClBwDANzl8uCk3hrc5Xnutc37NNeU2xwMPJNOnt5MTAAAA+GtKDwCAYe+/n6xf3xQdDz6YfPllmU2Z0pQbvb1N0XH99Y6QAwAAwBij9AAAJq7jx5OnnirPVj33XOf8wgtLybFyZTJ7disxAQAAgO9H6QEATCyffZZs2NCUHIODyaeflllVJffcU56tuuOOpKentagAAADAqVF6AADdra6TF15o7nL09yfbtydDQ2U+Z06yZk1Tcqxdm8yf315WAAAA4AdRegAA3efAgWTLlnKE/N13O+e33FK2ORYtSib7KREAAAB0A7/CBwC6wxtvlNsc27Ylhw+X2fTpyYoVTcnR25tccUVrMQEAAIDRo/QAAManI0eSxx4rRccvftE5v+KKss2xbFly1lnt5AQAAADOGKUHADB+7N6drF/flBwbNyb795fZpEnJ4sWl6LjppuYwOQAAADBhKD0AgLFraCjZsaPc5tixo3N+/vnNc1W9vcnq1ck557QSEwAAABgblB4AwNiyd2+zxdHf32x17NnTOb/rrrLNcffdSU9POzkBAACAMUfpAQC0q66TV14p2xyPPpocO1bms2Y1Wxx9fcm6dcmFF7aXFQAAABjTlB4AwJn31VfJtm3lCPlbb3XOb7ihbHMsXpxMndpGSgAAAGCcUXoAAGfGO++UkmPLlqb4GDZtWrJ0aVNy9PYm11zTWkwAAABg/FJ6AACj49ix5PHHS9Hx4oud80svLSXHihXJzJnt5AQAAAC6htIDABg5H3+cDA42JceGDckXX5RZT0/yk5+UZ6t+9KOkqlqLCgAAAHQfpQcAcPrqOtm5s2xzPPVU87Fh556brF3blBxr1iTz5rWXFQAAAOh6Sg8A4NTs359s2pQMDDR/ffhh5/yOO5onq/r6knvvTSZNaiUmAAAAMPEoPQCAX2/XrrLN8fDDydGjZTZzZrJyZbnPcckl7eUEAAAAJjSlBwDwqw4fTh56qCk5BgaSX/6yc37tteU2xwMPJNOmtZMTAAAA4CRKDwCg8d575cmqBx9MDhwosylTmnJjuOi4/vr2cgIAAAB8C6UHAExUx48nTz5Znq16/vnO+UUXldscK1cms2a1kxMAAADge1J6AMBE8tlnyeBgU3IMDjbfH1ZVzeHx4W2OO+5oPgYAAAAwTig9AKCb1XXy85+X2xyPP54MDZX5Oecka9c2Gx1r1ybnn99aVAAAAIAfSukBAN3mwIFk8+ZSdLz3Xuf81lvLNsdPfpJM9tMBAAAAoDv4XQ4A6Aavv15Kjm3bksOHy+yss5IVK5qSY9265IorWosJAAAAMJqUHgAwHh05kjz6aDlC/uqrnfOrrmpKjt7eZOnSpvgAAAAA6HJKDwAYL3bvbjY5+vuTTZuS/fvLbPLkZPHi8mzVjTc6Qg4AAABMOEoPABirhoaSHTvKNsczz3TO589vNjl6e5PVq5M5c9rJCQAAADBGKD0AYCz54otk48am5Fi/Pvn448753XeXbY677kp6elqJCQAAADAWKT0AoE11nbzyStnmePTR5PjxMp89u9ni6OtL1q5NLrywvawAAAAAY5zSAwDOtK++SrZubUqOgYHkrbc65zfeWLY5Fi9OpkxpJSYAAADAeKP0AIAz4e23S8mxZUtTfAybNi1ZtqwpOXp7k6uvbi8nAAAAwDim9ACA0XD0aPL44+XZqpde6pxfemnZ5li+PJk5s52cAAAAAF1E6QEAI+Xjj5vj4/39yYYNyd69ZdbTkyxaVIqOW29Nqqq9rAAAAABdSOkBAKdraCjZubNsczz9dHOYfNi8ecm6dU3JsXp1cu657WUFAAAAmACUHgBwKvbtSx58sNzn2L27c37nneU2xz33JJMmtZMTAAAAYAJSegDAd6nrZNeuss3xyCPNvY5hM2cmq1aVouPii9vLCgAAADDBKT0A4OsOHUoeeqhsc7z+euf8uuvKbY7770+mTWsnJwAAAAAdlB4AkCTvvdcUHP39zfNVBw+W2dSpyZIlzSZHX19TegAAAAAw5ig9AJiYjh9PnniiPFv18593zi++uJQcK1cmZ5/dTk4AAAAAvjelBwATx6efJoODzUbH4GDy2WdlVlXJwoXl2arbb28+BgAAAMC4ofQAoHvVdbPBMbzN8cQTydBQmc+dm6xd22x0rF2bnHdee1kBAAAA+MGUHgB0ly+/TDZvLkfI33+/c/6jH5VtjoULk8n+VQgAAADQLfxODwDj3+uvl22ObduSI0fKbMaMZMWKpuRYty65/PLWYgIAAAAwupQeAIw/R44kjzxSio5duzrnV11VtjmWLk2mT28lJgAAAABnltIDgPHhww+b56oGBpJNm5L9+8ts8uTk/vubkqO3N7nxRkfIAQAAACYgpQcAY9PQUPL002Wb49lnO+cXXNA8V9XXl6xalcyZ005OAAAAAMYMpQcAY8cXXyQbNjTbHOvXJx9/3DlfsKA8W/XjHyc9Pa3EBAAAAGBsUnoA0J66Tl56qSk5+vuTxx5Ljh8v89mzk9WryxHyCy5oLysAAAAAY57SA4Az6+DBZOvWpuQYGEjefrtzftNN5TbH4sXJlCnt5AQAAABg3FF6ADD63nqr3ObYujU5dKjMpk1Lli8vRcdVV7UWEwAAAIDxTekBwMg7erR5qmr42aqXX+6cX3ZZuc2xfHkyY0Y7OQEAAADoKkoPAEbGnj3N8fH+/mTjxmTv3jKbNClZtKgUHbfcklRVe1kBAAAA6EpKDwBOz9BQ8uyz5dmqHTuaw+TDzjuvOT7e19ccI587t72sAAAAAEwISg8Avr99+5otjoGB5q+PPuqc//jHzV2Ovr5kwYJmwwMAAAAAzpARLz2qqvqjJH/4tQ9/VNf1hSP9YwEwyuo6efXVss3xyCPJsWNlfvbZyapVTcmxbl1y8cXtZQUAAABgwhutTY+Xkqw86fvHR+nHAWCkHTqUbNvWlBwDA8kbb3TOr7++3OZYvDiZNq2VmAAAAADwdaNVehyr63r3KP2zARhp777bFBz9/cnmzcnBg2U2dWqyZEkpOq69tr2cAAAAAPAdRqv0uK6qqg+SHE7yZJI/qOv6jW/6xKqqpiU5+Y8JzxqlTAAMO3YseeKJ8mzVCy90zi+5pNzmWLGiecYKAAAAAMa40Sg9nkzyd5PsSnJBkn+SZHtVVbfUdf3pN3z+T/OrN0AAGGmffJIMDjYlx4YNyeefl1lPT7JwYVNy9PYmt9+eVFV7WQEAAADgNFR1XY/uD1BVM5O8nuRf1XX9s2+Yf9Omx3t79+7N7NmzRzUbQFer6+T558s2x5NPJkNDZT53brJ2bVN0rF2bzJvXXlYAAAAA+Bb79u3LnDlzkmROXdf7vutzR+t5q79W1/WBqqpeSHLdt8wPp3kGK0lS+ZPFAKfvyy+TBx8sR8g/+KBzfttt5TbHvfcmk0f9XwMAAAAAcMaM+u92ndjkuCnJI6P9YwFMSK+9Vo6QP/RQcuRImc2Y0dzkGH626rLL2ssJAAAAAKNsxEuPqqr+6yT/Kck7SeanuekxO8lfjPSPBTAhHTmSPPxwebbqtdc651dfXbY5lixJpk9vJycAAAAAnGGjselxaZJ/n+S8JB8neSLJwrqu3x6FHwtgYvjgg2T9+qbk2LSpecZq2OTJyQMPlG2OG25whBwAAACACWnES4+6rv/2SP8zASac48eTp58u2xw7d3bOL7igKTj6+pJVq5LZs9vJCQAAAABjiAu2AGPF558nGzY09znWr08++aTMqipZsKBsc/z4x0lPT3tZAQAAAGAMUnoAtKWuk5deKtsc27c3Gx7D5sxJ1qxpSo5165L589vLCgAAAADjgNID4Ew6eDDZsqUpOQYGknfe6ZzffHM5Qr5oUTJlSjs5AQAAAGAcUnoAjLa33irbHFu3JocOldn06cny5eXZqiuvbCslAAAAAIx7Sg+AkXb0aPLYY2Wb4+WXO+eXX162OZYtS2bMaCcnAAAAAHQZpQfASNizpzk+3t+fbNyY7N1bZpMmJffdV4qOm29uDpMDAAAAACNK6QFwOoaGkmefLc9W7djRHCYfdv75zfHxvr5k9erknHNaiwoAAAAAE4XSA+D72rev2eIYGGj++uijzvldd5XbHAsWJD097eQEAAAAgAlK6QHwbeo6efXVss3xyCPJsWNlPmtWsmpVU3SsW5dcdFF7WQEAAAAApQdAh0OHkm3byhHyN97onN9wQ7nNsXhxMnVqKzEBAAAAgF+l9AB4992m4OjvTzZvTg4eLLOpU5OlS0vRcc01rcUEAAAAAL6b0gOYeI4dS554ojxb9cILnfNLLiklx4oVycyZ7eQEAAAAAE6J0gOYGD75JBkcbEqODRuSzz8vs56eZOHCUnTcdltSVe1lBQAAAABOi9ID6E51nTz3XLnN8cQTzceGnXtusnZtU3KsWZPMm9daVAAAAABgZCg9gO7x5ZfJgw+WouODDzrnt9/elBy9vc1mx6RJ7eQEAAAAAEaF0gMY3157rdzmePjh5MiRMpsxI1m5shQdl17aXk4AAAAAYNQpPYDx5fDhptwY3uZ47bXO+dVXl9scS5Yk06e3kxMAAAAAOOOUHsDY98EHTcHR3988X/Xll2U2eXLywAOl6Lj+ekfIAQAAAGCCUnoAY8/x48lTT5Vtjp07O+cXXtg8V9XX1zxfNXt2OzkBAAAAgDFF6QGMDZ9/nmzY0BQdg4PJJ5+UWVUlCxaUbY4770x6etrLCgAAAACMSUoPoB11nbz4YjlCvn17MjRU5nPmJGvWNCXH2rXJ/PntZQUAAAAAxgWlB3DmHDyYbN5c7nO8+27n/JZbyrNVixYlU6a0kxMAAAAAGJeUHsDoevPNss2xdWty+HCZTZ+eLF/elBy9vcmVV7YWEwAAAAAY/5QewMg6ejR59NGyzfHKK53zK64otzmWLk1mzGglJgAAAADQfZQewA/30UfJ+vVNybFxY7JvX5lNmpTcd18pOm6+uTlMDgAAAAAwwpQewKkbGkqeeaY8W7VjR+f8/POTdeuaJ6tWr07mzm0nJwAAAAAwoSg9gO9n795mi6O/v9nq2LOnc37XXeU2x4IFSU9POzkBAAAAgAlL6QF8s7pu7nEM3+Z49NHk2LEynzUrWbWqKTrWrUsuuqi9rAAAAAAAUXoAJ/vqq2TbtvJs1Vtvdc5vuKHc5li8OJk6tY2UAAAAAADfSOkBE9077zQFx8BAsnlzU3wMmzo1WbasPFt1zTXt5QQAAAAA+DWUHjDRHDuWbN9enq168cXO+aWXNgVHX1+yYkUyc2Y7OQEAAAAATpHSAyaCjz9OBgebkmPDhuSLL8qspyf5yU/Ks1U/+lFSVa1FBQAAAAA4XUoP6EZ1nezcWW5zPPVU87Fh557bHB/v60tWr07mzWsvKwAAAADACFF6QLfYvz958MFyn+PDDzvnd9xRnq26995k0qRWYgIAAAAAjBalB4xnu3aVbY6HH06OHi2zmTOTlSvLEfJLLmkvJwAAAADAGaD0gPHk8OGm3BguOn75y875NdeU2xxLliTTprWTEwAAAACgBUoPGOvef795rqq/v3m+6sCBMpsyJXnggVJ0XH99ezkBAAAAAFqm9ICx5vjx5MknS9Hx3HOd84suKrc5Vq5MZs1qJSYAAAAAwFij9ICx4LPPkg0bmpJjcDD59NMyq6rknnvKNscddyQ9Pa1FBQAAAAAYq5Qe0Ia6Tl54oWxzbN+eDA2V+TnnJGvWNCXH2rXJ+ee3FhUAAAAAYLxQesCZcuBAsmVLU3IMDCTvvts5v/XW8mzVokXJZF+eAAAAAACnwu+qwmh6442m5OjvT7ZtSw4fLrOzzkqWL29Kjt7e5IorWosJAAAAANANlB4wko4cSR57rBQdv/hF5/zKK0vJsWxZU3wAAAAAADAilB7wQ+3enaxf35QcGzcm+/eX2aRJyeLF5Qj5TTc1h8kBAAAAABhxSg84VUNDyY4dZZvjmWc65/PnJ+vWNSXHqlXNUXIAAAAAAEad0gO+jy++aLY4BgaarY49ezrnd99dnq26++6kp6eVmAAAAAAAE5nSA75JXSevvFK2OR59NDl+vMxnz05Wr25KjnXrkgsvbC8rAAAAAABJlB5QfPVVsnVrU3IMDCRvvdU5v/HGcpvjvvuSqVNbiQkAAAAAwDdTejCxvf12KTm2bGmKj2HTpiXLlpVnq66+ur2cAAAAAAD8WkoPJpZjx5Lt28uzVS+91Dm/9NKyzbF8eTJzZjs5AQAAAAA4ZUoPut/HHzfHx/v7kw0bkr17y6ynJ1m0qBQdt96aVFV7WQEAAAAAOG1KD7rP0FCyc2fzZFV/f/LUU81h8mHz5jXHx/v6mmPk557bXlYAAAAAAEaM0oPusH9/smlTuc+xe3fn/I47yjbHPfckkya1EhMAAAAAgNGj9GB8qutk166yzfHww8nRo2U+c2ayalVTcqxbl1xySXtZAQAAAAA4I5QejB+HDycPPVSOkL/+euf82mvLNscDDyTTprWTEwAAAACAVig9GNvee69sc2zenBw4UGZTpiRLlpSi47rr2ssJAAAAAEDrlB6MLcePJ08+WbY5nn++c37RRUlvb1NyrFyZzJrVTk4AAAAAAMYcpQft++yzZHCwKTkGB5vvD6uq5N57yzbHHXc0HwMAAAAAgK9RenDm1XXy8583JcfAQPL448nQUJmfc06yZk1Tcqxdm5x/fmtRAQAAAAAYP5QenBkHDjQ3OYaLjvfe65zfemvZ5vjJT5LJ/qsJAAAAAMCp8TvLjJ7XXy+3ObZtS44cKbOzzkpWrGhKjt7e5PLLW4sJAAAAAEB3UHowco4cSR55pGxzvPpq5/yqq0rJsXRpU3wAAAAAAMAIUXrww3z4YVNwDAwkmzYl+/eX2eTJyeLF5dmqG290hBwAAAAAgFGj9ODUDA0lTz9dnq169tnO+fz5zSZHX1+yalUyZ047OQEAAAAAmHCUHvx6X3yRbNjQlByDg8nHH3fOFywoz1bddVfS09NKTAAAAAAAJjalB7+qrpOXXmqerOrvTx57LDl+vMxnz05Wr26KjnXrkgsuaC8rAAAAAACcoPSgcfBgsnVrOUL+9tud85tuKrc57rsvmTKlnZwAAAAAAPAtlB4T2VtvlZJjy5bk0KEymzYtWb683Oe46qrWYgIAAAAAwPeh9JhIjh5Ntm8vR8hffrlzftllZZtj+fJkxox2cgIAAAAAwGlQenS7PXuS9eubkmPjxmTv3jKbNClZtKgUHbfcklRVe1kBAAAAAOAHUHp0m6GhZOfOss3x9NPNYfJh8+Y1x8f7+pI1a5K5c9vLCgAAAAAAI2jUSo+qqn43yT9KclGSl5L8g7quHxmtH29C27cv2bSpKTnWr0927+6c33ln2eZYsKDZ8AAAAAAAgC4zKqVHVVW/meRPkvxukseS/BdJ1ldVdXNd1++Mxo85odR1smtX2eZ45JHmXsewmTOTVauakqO3N7n44vayAgAAAADAGVLVJz99NFL/0Kp6MsmzdV3/zkkfeyXJX9V1/dNf8/fOTrJ37969mT179ohnG7cOH062bStFxxtvdM6vu65sc9x/fzJtWisxAQAAAABgJO3bty9z5sxJkjl1Xe/7rs8d8U2PqqqmJrkryb/42mhjkkXf8PnTkpz8O/SzRjpTV9i5M1m7tnx/6tRkyZJmk6Ovryk9AAAAAABgAhuN563OSzIpyUdf+/hHSS78hs//aZI/HIUc3WXBguT225tv+/qSlSuTs89uOxUAAAAAAIwZo3bIPMnX382qvuFjSfLHSX520vdnJXlvtEKNW5MmJc8913YKAAAAAAAYs0aj9PgkyfH86lbH/Pzq9kfquj6c5PDw96uqGoVIAAAAAABAt+sZ6X9gXddHkjyTZNXXRquSbB/pHw8AAAAAACAZveetfpbkv6+qakeSx5P8dpLLk/w3o/TjAQAAAAAAE9yolB51Xf+PVVXNS/JfJbkoyYtJeuu6fns0fjwAAAAAAIBRO2Re1/W/SfJvRuufDwAAAAAAcLIRv+kBAAAAAADQBqUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQegAAAAAAAF1B6QEAAAAAAHQFpQcAAAAAANAVlB4AAAAAAEBXUHoAAAAAAABdYXLbAb7Nvn372o4AAAAAAAC07FT6gqqu61GMcuqqqrokyXtt5wAAAAAAAMaUS+u6fv+7PmEslh5VkouT7G87yxg0K00hdGn83wfONF9/0B5ff9AuX4PQHl9/0B5ff9AuX4N8k1lJPqh/Takx5p63OhH4O5uaiarpg5Ik++u69v4XnEG+/qA9vv6gXb4GoT2+/qA9vv6gXb4G+Rbf678LDpkDAAAAAABdQekBAAAAAAB0BaXH+HI4yf/hxLfAmeXrD9rj6w/a5WsQ2uPrD9rj6w/a5WuQ0zbmDpkDAAAAAACcDpseAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQeowTVVX9blVVb1ZVdaiqqmeqqrq/7UwwEVRV9dOqqp6uqmp/VVV7qqr6q6qqbmg7F0xEJ74e66qq/qTtLDARVFV1SVVV/8+qqj6tqupgVVXPVVV1V9u5YCKoqmpyVVX/pxO/Bvyqqqo3qqr6r6qq8mt4GGFVVT1QVdV/qqrqgxM/1/yffW1eVVX1RyfmX1VVta2qqltaigtd5bu+/qqqmlJV1b+squqFqqoOnPic/66qqotbjMw44SdM40BVVb+Z5E+S/LMkdyZ5JMn6qqoubzMXTBBLkvxZkoVJViWZnGRjVVUzW00FE0xVVQuS/HaSn7edBSaCqqrmJnksydEk65LcnOR/n+SLFmPBRPL7Sf43Sf7LJDcl+b0k/yjJ/7bNUNClZiZ5Ps3X2zf5vST/8MR8QZLdSTZVVTXrzMSDrvZdX38zkvw4yT898e3fSnJ9kv/vGUvHuFXVdd12Bn6NqqqeTPJsXde/c9LHXknyV3Vd/7S9ZDDxVFV1fpI9SZbUdf1w23lgIqiq6uwkzyb53ST/JMlzdV3/g1ZDQZerqupfJLmvrmvbxdCCqqr+f0k+quv6f3XSx/4yycG6rv+X7SWD7lZVVZ3kN+q6/qsT36+SfJDkT+q6/pcnPjYtyUdJfr+u63/bVlboNl//+vuWz1mQ5KkkV9R1/c6Zysb4Y9NjjKuqamqSu5Js/NpoY5JFZz4RTHhzTnz7WaspYGL5syT9dV0/2HYQmED+RpIdVVX9hxPPO+6squp/3XYomEAeTbKiqqrrk6SqqtuTLE4y0GoqmHiuSnJhTvo9mbquDyd5KH5PBtowJ0kd28f8GpPbDsCvdV6SSWn+FMHJPkrzL17gDDnxp3x+luTRuq5fbDsPTARVVf3tNKvMC9rOAhPM1Ul+J82/9/55knuS/N+qqjpc1/V/12oymBj+ZZrf2PlFVVXH0/ya8B/Xdf3v240FE87w77t80+/JXHGGs8CEVlXV9CT/Ism/q+t6X9t5GNuUHuPH198hq77hY8Do+tdJbkvzp+yAUVZV1WVJ/q9JVtd1fajtPDDB9CTZUdf1H5z4/s4TR1t/J4nSA0bfbyb5XyT5O0leSnJHkj+pquqDuq7/os1gMEH5PRloUVVVU5L8D2l+jvq7LcdhHFB6jH2fJDmeX93qmJ9f/ZMGwCipqupP0zz18UBd1++1nQcmiLvS/PvumWbRKknzJ10fqKrqv0wyra7r422Fgy73YZKXv/axV5L8z1vIAhPR/znJv6jr+n848f0Xqqq6IslPkyg94MzZfeLbC9P8u3GY35OBM+RE4fH/TvPc3HJbHnwfbnqMcXVdH0nyTJJVXxutSrL9zCeCiaVq/OskfyvNv1zfbDsTTCCbk/wozZ9uHf5rR5L/V5I7FB4wqh5LcsPXPnZ9krdbyAIT0YwkQ1/72PH4NTycaW+mKT7++vdkTtxeXRK/JwOj7qTC47okK+u6/rTlSIwTNj3Gh58l+e+rqtqR5PEkv53k8iT/TaupYGL4szTPCvzNJPurqhreutpb1/VX7cWC7lfX9f4kHfdzqqo6kORTd3Vg1P1fkmyvquoP0vxC8540Pwf97VZTwcTxn5L846qq3knzvNWdSf5hkv9Hq6mgC1VVdXaSa0/60FVVVd2R5LO6rt+pqupPkvxBVVWvJXktyR8kOZjk353prNBtvuvrL8kHSf4/aW48/mdJJp30ezKfnfiD4vCNqrr2BOF4UFXV7yb5vSQXpfkNoP9dXdcPt5sKul9VVd/2P5K/Vdf1n5/JLEBSVdW2JM/Vdf0PWo4CXa+qqv8syR+n+ZN1byb5WV3X//d2U8HEUFXVrCT/NMlvpHlG54Mk/z7J/9Fv8sDIqqpqaZKt3zD6i7qu/17VvLP6h0n+iyRzkzyZ5O/7Qzjww33X11+SP0rzc9Bvsqyu622jEoquoPQAAAAAAAC6gvdAAQAAAACArqD0AAAAAAAAuoLSAwAAAAAA6ApKDwAAAAAAoCsoPQAAAAAAgK6g9AAAAAAAALqC0gMAAAAAAOgKSg8AAAAAAKArKD0AAAAAAICuoPQAAAAAAAC6gtIDAAAAAADoCv9/1MXeuKac8eEAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ "<Figure size 2000x600 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "do_plot(is_sin = False)"
+ ]
+},'
+
+base = '{
+ "cells": [
+ <<>>{
+ "cell_type": "markdown",
+ "id": "1",
+ "metadata": {
+ "tags": [
+ "hello",
+ "world"
+ ]
+ },
+ "source": [
+ "# A\n",
+ "\n",
+ "B"
+ ]
+ }
+ ],
+ "metadata": {
+ }
+}'
+
+SMALL_NOTEBOOK = base.gsub('<<>>', large_cell)
+LARGE_NOTEBOOK = base.gsub('<<>>', Array.new(100, large_cell).join("\n"))
+
+puts "Small Notebook: #{SMALL_NOTEBOOK.bytesize}"
+puts "Large Notebook: #{LARGE_NOTEBOOK.bytesize}"
+
+def cases(benchmark_runner)
+ benchmark_runner.report('small_notebook') { IpynbDiff.transform(SMALL_NOTEBOOK) }
+ benchmark_runner.report('large_notebook') { IpynbDiff.transform(LARGE_NOTEBOOK) }
+end
+
+Benchmark.benchmark { |x| cases(x) }
+Benchmark.memory { |x| cases(x) }
diff --git a/vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb b/vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb
new file mode 100644
index 00000000000..1c2a2188edf
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb
@@ -0,0 +1,126 @@
+# frozen_string_literal: true
+
+require 'ipynbdiff'
+require 'rspec'
+require 'rspec-parameterized'
+
+BASE_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'testdata')
+
+describe IpynbDiff do
+ def diff_signs(diff)
+ diff.to_s(:text).scan(/.*\n/).map { |l| l[0] }.join('')
+ end
+
+ describe 'diff' do
+ let(:from_path) { File.join(BASE_PATH, 'from.ipynb') }
+ let(:to_path) { File.join(BASE_PATH,'to.ipynb') }
+ let(:from) { File.read(from_path) }
+ let(:to) { File.read(to_path) }
+ let(:include_frontmatter) { false }
+ let(:hide_images) { false }
+
+ subject { IpynbDiff.diff(from, to, include_frontmatter: include_frontmatter, hide_images: hide_images) }
+
+ context 'if preprocessing is active' do
+ it 'html tables are stripped' do
+ is_expected.to_not include('<td>')
+ end
+ end
+
+ context 'when to is nil' do
+ let(:to) { nil }
+ let(:from_path) { File.join(BASE_PATH, 'only_md', 'input.ipynb') }
+
+ it 'all lines are removals' do
+ expect(diff_signs(subject)).to eq('-----')
+ end
+ end
+
+ context 'when to is nil' do
+ let(:from) { nil }
+ let(:to_path) { File.join(BASE_PATH, 'only_md', 'input.ipynb') }
+
+ it 'all lines are additions' do
+ expect(diff_signs(subject)).to eq('+++++')
+ end
+ end
+
+ context 'When include_frontmatter is true' do
+ let(:include_frontmatter) { true }
+
+ it 'should show changes metadata in the metadata' do
+ expect(subject.to_s(:text)).to include('+ display_name: New Python 3 (ipykernel)')
+ end
+ end
+
+ context 'When hide_images is true' do
+ let(:hide_images) { true }
+
+ it 'hides images' do
+ expect(subject.to_s(:text)).to include(' [Hidden Image Output]')
+ end
+ end
+
+ context 'When include_frontmatter is false' do
+ it 'should drop metadata from the diff' do
+ expect(subject.to_s(:text)).to_not include('+ display_name: New Python 3 (ipykernel)')
+ end
+ end
+
+ context 'when either notebook can not be processed' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:ctx, :from, :to) do
+ 'because from is invalid' | 'a' | nil
+ 'because from does not have the cell tag' | '{"metadata":[]}' | nil
+ 'because to is invalid' | nil | 'a'
+ 'because to does not have the cell tag' | nil | '{"metadata":[]}'
+ end
+
+ with_them do
+ it { is_expected.to be_nil }
+ end
+ end
+ end
+
+ describe 'transform' do
+ [nil, 'a', '{"metadata":[]}'].each do |invalid_nb|
+ context "when json is invalid (#{invalid_nb || 'nil'})" do
+ it 'is nil' do
+ expect(IpynbDiff.transform(invalid_nb)).to be_nil
+ end
+ end
+ end
+
+ context 'options' do
+ let(:include_frontmatter) { false }
+ let(:hide_images) { false }
+
+ subject do
+ IpynbDiff.transform(File.read(File.join(BASE_PATH, 'from.ipynb')),
+ include_frontmatter: include_frontmatter,
+ hide_images: hide_images)
+ end
+
+ context 'include_frontmatter is false' do
+ it { is_expected.to_not include('display_name: Python 3 (ipykernel)') }
+ end
+
+ context 'include_frontmatter is true' do
+ let(:include_frontmatter) { true }
+
+ it { is_expected.to include('display_name: Python 3 (ipykernel)') }
+ end
+
+ context 'hide_images is false' do
+ it { is_expected.not_to include('[Hidden Image Output]') }
+ end
+
+ context 'hide_images is true' do
+ let(:hide_images) { true }
+
+ it { is_expected.to include(' [Hidden Image Output]') }
+ end
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/spec/symbol_map_spec.rb b/vendor/gems/ipynbdiff/spec/symbol_map_spec.rb
new file mode 100644
index 00000000000..5fba47c85af
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/symbol_map_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'json'
+require 'rspec-parameterized'
+require 'symbol_map'
+
+describe IpynbDiff::SymbolMap do
+ def res(*cases)
+ cases&.to_h || []
+ end
+
+ describe '#parse' do
+ subject { IpynbDiff::SymbolMap.parse(JSON.pretty_generate(source)) }
+
+ context 'Object with blank key' do
+ let(:source) { { "": { "": 5 } }}
+
+ it { is_expected.to match_array(res([".", 2], ["..", 3])) }
+ end
+
+ context 'Empty object' do
+ let(:source) { {} }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'Empty array' do
+ let(:source) { [] }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'Object with inner object and number' do
+ let(:source) { { obj1: { obj2: 1 } } }
+
+ it { is_expected.to match_array(res( ['.obj1', 2], ['.obj1.obj2', 3])) }
+ end
+
+ context 'Object with inner object and number, string and array with object' do
+ let(:source) { { obj1: { obj2: [123, 2, true], obj3: "hel\nlo", obj4: true, obj5: 123, obj6: 'a' } } }
+
+ it do
+ is_expected.to match_array(
+ res(['.obj1', 2],
+ ['.obj1.obj2', 3],
+ ['.obj1.obj2.0', 4],
+ ['.obj1.obj2.1', 5],
+ ['.obj1.obj2.2', 6],
+ ['.obj1.obj3', 8],
+ ['.obj1.obj4', 9],
+ ['.obj1.obj5', 10],
+ ['.obj1.obj6', 11])
+ )
+ end
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/spec/test_helper.rb b/vendor/gems/ipynbdiff/spec/test_helper.rb
new file mode 100644
index 00000000000..f9c416885a1
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/test_helper.rb
@@ -0,0 +1,23 @@
+BASE_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'testdata')
+
+FROM_PATH = File.join(BASE_PATH, 'from.ipynb')
+TO_PATH = File.join(BASE_PATH, 'to.ipynb')
+
+FROM_IPYNB = File.read(FROM_PATH)
+TO_IPYNB = File.read(TO_PATH)
+
+def input_for_test(test_case)
+ File.join(BASE_PATH, test_case, 'input.ipynb')
+end
+
+def expected_symbols(test_case)
+ File.join(BASE_PATH, test_case, 'expected_symbols.txt')
+end
+
+def expected_md(test_case)
+ File.join(BASE_PATH, test_case, 'expected.md')
+end
+
+def expected_line_numbers(test_case)
+ File.join(BASE_PATH, test_case, 'expected_line_numbers.txt')
+end
diff --git a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md b/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md
new file mode 100644
index 00000000000..299e286c679
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md
@@ -0,0 +1,7 @@
+%% Cell type:markdown id: tags:
+
+\
+
+%% Cell type:markdown id: tags:
+
+a
diff --git a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt
new file mode 100644
index 00000000000..6fa29ae28de
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt
@@ -0,0 +1,7 @@
+.cells.0
+
+.cells.0.source.0
+
+.cells.1
+
+.cells.1.source.0
diff --git a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb
new file mode 100644
index 00000000000..0714044e3ae
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb
@@ -0,0 +1,16 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "\\"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "a"
+ ]
+ }
+ ]
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md
new file mode 100644
index 00000000000..e6e8a075598
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md
@@ -0,0 +1,16 @@
+%% Cell type:code id:5 tags:
+
+``` python
+# A cell that has an error
+y = sin(x)
+```
+
+%% Output
+
+ ---------------------------------------------------------------------------
+ NameError Traceback (most recent call last)
+ /var/folders/cq/l637k4x13gx6y9p_gfs4c_gc0000gn/T/ipykernel_72857/3962062127.py in <module>
+ 1 # A cell that has an error
+ ----> 2 y = sin(x)
+
+ NameError: name 'sin' is not defined
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
new file mode 100644
index 00000000000..5d2f248135d
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
@@ -0,0 +1,16 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+.cells.0.source.1
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.traceback.0
+.cells.0.outputs.0.traceback.1
+.cells.0.outputs.0.traceback.2
+.cells.0.outputs.0.traceback.2
+.cells.0.outputs.0.traceback.2
+.cells.0.outputs.0.traceback.2
+.cells.0.outputs.0.traceback.3
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/error_output/input.ipynb
new file mode 100644
index 00000000000..45ee81a0e2d
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/error_output/input.ipynb
@@ -0,0 +1,32 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "5",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'sin' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m/var/folders/cq/l637k4x13gx6y9p_gfs4c_gc0000gn/T/ipykernel_72857/3962062127.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# A cell that has an error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'sin' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "# A cell that has an error\n",
+ "y = sin(x)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/from.ipynb b/vendor/gems/ipynbdiff/spec/testdata/from.ipynb
new file mode 100644
index 00000000000..68a4b11cbbc
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/from.ipynb
@@ -0,0 +1,197 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "0aac5da7-745c-4eda-847a-3d0d07a1bb9b",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "# This is a markdown cell\n",
+ "\n",
+ "This paragraph has\n",
+ "With\n",
+ "Many\n",
+ "Lines. How we will he handle MR notes?\n",
+ "\n",
+ "But I can add another paragraph"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "faecea5b-de0a-49fa-9a3a-61c2add652da",
+ "metadata": {},
+ "source": [
+ "This is a raw cell\n",
+ "With\n",
+ "Multiple lines"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "893ca2c0-ab75-4276-9dad-be1c40e16e8a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "0d707fb5-226f-46d6-80bd-489ebfb8905c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "np.random.seed(42)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "35467fcf-28b1-4c7b-bb09-4cb192c35293",
+ "metadata": {
+ "tags": [
+ "senoid"
+ ]
+ }, "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[<matplotlib.lines.Line2D at 0x123e39370>]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "some_invalid_base64_image_here\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "x = np.linspace(0, 4*np.pi,50)\n",
+ "y = np.sin(x)\n",
+ "\n",
+ "plt.plot(x, y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "dc1178cd-c46d-4da3-9ab5-08f000699884",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.DataFrame({\"x\": x, \"y\": y})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "6e749b4f-b409-4700-870f-f68c39462490",
+ "metadata": {
+ "tags": [
+ "some-table"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<div>\n",
+ "<style scoped>\n",
+ " .dataframe tbody tr th:only-of-type {\n",
+ " vertical-align: middle;\n",
+ " }\n",
+ "\n",
+ " .dataframe tbody tr th {\n",
+ " vertical-align: top;\n",
+ " }\n",
+ "\n",
+ " .dataframe thead th {\n",
+ " text-align: right;\n",
+ " }\n",
+ "</style>\n",
+ "<table border=\"1\" class=\"dataframe\">\n",
+ " <thead>\n",
+ " <tr style=\"text-align: right;\">\n",
+ " <th></th>\n",
+ " <th>x</th>\n",
+ " <th>y</th>\n",
+ " </tr>\n",
+ " </thead>\n",
+ " <tbody>\n",
+ " <tr>\n",
+ " <th>0</th>\n",
+ " <td>0.000000</td>\n",
+ " <td>0.000000</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <th>1</th>\n",
+ " <td>0.256457</td>\n",
+ " <td>0.253655</td>\n",
+ " </tr>\n",
+ " </tbody>\n",
+ "</table>\n",
+ "</div>"
+ ],
+ "text/plain": [
+ " x y\n",
+ "0 0.000000 0.000000\n",
+ "1 0.256457 0.253655"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[:2]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0ddef5ef-94a3-4afd-9c70-ddee9694f512",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.7"
+ },
+ "toc-showtags": true
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md
new file mode 100644
index 00000000000..ff63d351a3b
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md
@@ -0,0 +1,10 @@
+%% Cell type:code id:5 tags:senoid
+
+``` python
+```
+
+%% Output
+
+ [Hidden Image Output]
+
+ [Hidden Image Output]
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
new file mode 100644
index 00000000000..b8f24f9fba5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
@@ -0,0 +1,10 @@
+.cells.0
+
+.cells.0.source
+
+
+.cells.0.outputs
+
+
+
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb
new file mode 100644
index 00000000000..dab0e5bb9cf
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb
@@ -0,0 +1,45 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "5",
+ "metadata": {
+ "tags": [
+ "senoid"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "this_is_an_invalid_hash_for_testing_purposes\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/svg+xml": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><circle cx=\"50\" cy=\"50\" r=\"50\"/></svg>",
+ "text/plain": [
+ "<IPython.core.display.SVG object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
new file mode 100644
index 00000000000..3085da739ed
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
@@ -0,0 +1,11 @@
+%% Cell type:code id:5 tags:some-table
+
+``` python
+df[:2]
+```
+
+%% Output
+
+ x y
+ 0 0.000000 0.000000
+ 1 0.256457 0.507309
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
new file mode 100644
index 00000000000..3bf319d1fa6
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
@@ -0,0 +1,11 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.data.text/plain.0
+.cells.0.outputs.0.data.text/plain.1
+.cells.0.outputs.0.data.text/plain.2
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb
new file mode 100644
index 00000000000..26117a78934
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb
@@ -0,0 +1,74 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "5",
+ "metadata": {
+ "tags": [
+ "some-table"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<div>\n",
+ "<style scoped>\n",
+ " .dataframe tbody tr th:only-of-type {\n",
+ " vertical-align: middle;\n",
+ " }\n",
+ "\n",
+ " .dataframe tbody tr th {\n",
+ " vertical-align: top;\n",
+ " }\n",
+ "\n",
+ " .dataframe thead th {\n",
+ " text-align: right;\n",
+ " }\n",
+ "</style>\n",
+ "<table border=\"1\" class=\"dataframe\">\n",
+ " <thead>\n",
+ " <tr style=\"text-align: right;\">\n",
+ " <th></th>\n",
+ " <th>x</th>\n",
+ " <th>y</th>\n",
+ " </tr>\n",
+ " </thead>\n",
+ " <tbody>\n",
+ " <tr>\n",
+ " <th>0</th>\n",
+ " <td>0.000000</td>\n",
+ " <td>0.000000</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <th>1</th>\n",
+ " <td>0.256457</td>\n",
+ " <td>0.507309</td>\n",
+ " </tr>\n",
+ " </tbody>\n",
+ "</table>\n",
+ "</div>"
+ ],
+ "text/plain": [
+ " x y\n",
+ "0 0.000000 0.000000\n",
+ "1 0.256457 0.507309"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[:2]"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md
new file mode 100644
index 00000000000..194c1f43c42
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md
@@ -0,0 +1,10 @@
+%% Cell type:code id:5 tags:
+
+``` python
+from IPython.display import display, Math
+display(Math(r'Dims: {}x{}m \\ Area: {}m^2 \\ Volume: {}m^3'.format(1, round(2,2), 3, 4)))
+```
+
+%% Output
+
+ $\displaystyle Dims: 1x2m \\ Area: 3m^2 \\ Volume: 4m^3$
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
new file mode 100644
index 00000000000..868adca2712
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
@@ -0,0 +1,10 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+.cells.0.source.1
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.data.text/latex.0
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb
new file mode 100644
index 00000000000..f8ff3e72beb
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb
@@ -0,0 +1,34 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "5",
+ "outputs": [
+ {
+ "data": {
+ "text/latex": [
+ "$\\displaystyle Dims: 1x2m \\\\ Area: 3m^2 \\\\ Volume: 4m^3$"
+ ],
+ "text/plain": [
+ "<IPython.core.display.Math object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from IPython.display import display, Math\n",
+ "display(Math(r'Dims: {}x{}m \\\\ Area: {}m^2 \\\\ Volume: {}m^3'.format(1, round(2,2), 3, 4)))"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
new file mode 100644
index 00000000000..0a69c8370e7
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
@@ -0,0 +1,9 @@
+%% Cell type:code id:5 tags:
+
+```
+Some Image
+```
+
+%% Output
+
+ ![](data:image/png;base64,this_is_an_invalid_hash_for_testing_purposes)
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
new file mode 100644
index 00000000000..1b66012ef20
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
@@ -0,0 +1,9 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.data.image/png
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb
new file mode 100644
index 00000000000..4d19a504553
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb
@@ -0,0 +1,25 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "id": "5",
+ "metadata": {
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": [
+ "this_is_an_invalid_hash_for_testing_purposes"
+ ]
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "Some Image"
+ ]
+ }
+ ],
+ "metadata": {
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected.md b/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected.md
new file mode 100644
index 00000000000..b7c09c51fb8
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected.md
@@ -0,0 +1,19 @@
+---
+jupyter:
+ kernelspec:
+ display_name: Python 3 (ipykernel)
+ language: python
+ name: python3
+ language_info:
+ codemirror_mode:
+ name: ipython
+ version: 3
+ file_extension: ".py"
+ mimetype: text/x-python
+ name: python
+ nbconvert_exporter: python
+ pygments_lexer: ipython3
+ version: 3.9.7
+ nbformat: 4
+ nbformat_minor: 5
+---
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt
new file mode 100644
index 00000000000..a60f3032882
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb
new file mode 100644
index 00000000000..c2ba0ebf50a
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb
@@ -0,0 +1,25 @@
+{
+ "cells": [],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.7"
+ },
+ "toc-showtags": true
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/app/assets/javascripts/pipeline_wizard/templates/.gitkeep b/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md
index e69de29bb2d..e69de29bb2d 100644
--- a/app/assets/javascripts/pipeline_wizard/templates/.gitkeep
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md
diff --git a/tmp/run/.gitkeep b/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tmp/run/.gitkeep
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb
new file mode 100644
index 00000000000..c2ba0ebf50a
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb
@@ -0,0 +1,25 @@
+{
+ "cells": [],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.7"
+ },
+ "toc-showtags": true
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md b/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md
new file mode 100644
index 00000000000..d9d72bf8f76
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md
@@ -0,0 +1,13 @@
+%% Cell type:markdown id:1 tags:
+
+# A
+
+B
+
+%% Cell type:code id:3 tags:
+
+``` python
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+```
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt
new file mode 100644
index 00000000000..a7000494a1b
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt
@@ -0,0 +1,13 @@
+.cells.0
+
+.cells.0.source.0
+.cells.0.source.1
+.cells.0.source.2
+
+.cells.1
+
+.cells.1.source
+.cells.1.source.0
+.cells.1.source.1
+.cells.1.source.2
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb
new file mode 100644
index 00000000000..62060124a2a
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb
@@ -0,0 +1,29 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "1",
+ "source": [
+ "# A\n",
+ "\n",
+ "B"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3",
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code/expected.md b/vendor/gems/ipynbdiff/spec/testdata/only_code/expected.md
new file mode 100644
index 00000000000..124b8217a6a
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code/expected.md
@@ -0,0 +1,7 @@
+%% Cell type:code id:3 tags:
+
+``` python
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+```
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt
new file mode 100644
index 00000000000..59b11103195
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt
@@ -0,0 +1,7 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+.cells.0.source.1
+.cells.0.source.2
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/only_code/input.ipynb
new file mode 100644
index 00000000000..a93108dccb8
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code/input.ipynb
@@ -0,0 +1,21 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md
new file mode 100644
index 00000000000..9100045e0f5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md
@@ -0,0 +1,5 @@
+%% Cell type:code id:3 tags:
+
+```
+
+```
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt
new file mode 100644
index 00000000000..5f9ad320b8c
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt
@@ -0,0 +1,5 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb
new file mode 100644
index 00000000000..c3ff71057a6
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb
@@ -0,0 +1,12 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3",
+ "source": "",
+ "outputs": []
+ }
+ ],
+ "metadata": {}
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md
new file mode 100644
index 00000000000..9100045e0f5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md
@@ -0,0 +1,5 @@
+%% Cell type:code id:3 tags:
+
+```
+
+```
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt
new file mode 100644
index 00000000000..5f9ad320b8c
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt
@@ -0,0 +1,5 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb
new file mode 100644
index 00000000000..fb16b106cbe
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb
@@ -0,0 +1,14 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3",
+ "source": "",
+ "outputs": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {}
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md
new file mode 100644
index 00000000000..9100045e0f5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md
@@ -0,0 +1,5 @@
+%% Cell type:code id:3 tags:
+
+```
+
+```
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt
new file mode 100644
index 00000000000..5f9ad320b8c
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt
@@ -0,0 +1,5 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb
new file mode 100644
index 00000000000..364c080168b
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb
@@ -0,0 +1,11 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3",
+ "source": "",
+ "outputs": []
+ }
+ ]
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_md/expected.md b/vendor/gems/ipynbdiff/spec/testdata/only_md/expected.md
new file mode 100644
index 00000000000..bdf4db5aea5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_md/expected.md
@@ -0,0 +1,5 @@
+%% Cell type:markdown id:1 tags:hello,world
+
+# A
+
+B
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt
new file mode 100644
index 00000000000..d3d6d526fc3
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt
@@ -0,0 +1,5 @@
+.cells.0
+
+.cells.0.source.0
+.cells.0.source.1
+.cells.0.source.2
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_md/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/only_md/input.ipynb
new file mode 100644
index 00000000000..9d6b550af31
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_md/input.ipynb
@@ -0,0 +1,21 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "1",
+ "metadata": {
+ "tags": [
+ "hello",
+ "world"
+ ]
+ },
+ "source": [
+ "# A\n",
+ "\n",
+ "B"
+ ]
+ }
+ ],
+ "metadata": {
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected.md b/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected.md
new file mode 100644
index 00000000000..91c476e843b
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected.md
@@ -0,0 +1,4 @@
+%% Cell type:raw id:2 tags:
+
+A
+B
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt
new file mode 100644
index 00000000000..bceaf355c2f
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt
@@ -0,0 +1,4 @@
+.cells.0
+
+.cells.0.source.0
+.cells.0.source.1
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb
new file mode 100644
index 00000000000..750e1bba615
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb
@@ -0,0 +1,15 @@
+{
+ "cells": [
+ {
+ "cell_type": "raw",
+ "id": "2",
+ "metadata": {},
+ "source": [
+ "A\n",
+ "B"
+ ]
+ }
+ ],
+ "metadata": {
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
new file mode 100644
index 00000000000..1ece1f2fd06
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
@@ -0,0 +1,68 @@
+%% Cell type:markdown id:0aac5da7-745c-4eda-847a-3d0d07a1bb9b tags:
+
+# This is a markdown cell
+
+This paragraph has
+With
+Many
+Lines. How we will he handle MR notes?
+
+But I can add another paragraph
+
+%% Cell type:raw id:faecea5b-de0a-49fa-9a3a-61c2add652da tags:
+
+This is a raw cell
+With
+Multiple lines
+
+%% Cell type:code id:893ca2c0-ab75-4276-9dad-be1c40e16e8a tags:
+
+``` python
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+```
+
+%% Cell type:code id:0d707fb5-226f-46d6-80bd-489ebfb8905c tags:
+
+``` python
+np.random.seed(42)
+```
+
+%% Cell type:code id:35467fcf-28b1-4c7b-bb09-4cb192c35293 tags:senoid
+
+``` python
+x = np.linspace(0, 4*np.pi,50)
+y = np.sin(x)
+
+plt.plot(x, y)
+```
+
+%% Output
+
+ [<matplotlib.lines.Line2D at 0x123e39370>]
+
+ ![](data:image/png;base64,some_invalid_base64_image_here)
+
+%% Cell type:code id:dc1178cd-c46d-4da3-9ab5-08f000699884 tags:
+
+``` python
+df = pd.DataFrame({"x": x, "y": y})
+```
+
+%% Cell type:code id:6e749b4f-b409-4700-870f-f68c39462490 tags:some-table
+
+``` python
+df[:2]
+```
+
+%% Output
+
+ x y
+ 0 0.000000 0.000000
+ 1 0.256457 0.253655
+
+%% Cell type:code id:0ddef5ef-94a3-4afd-9c70-ddee9694f512 tags:
+
+``` python
+```
diff --git a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
new file mode 100644
index 00000000000..c95665d1903
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
@@ -0,0 +1,68 @@
+.cells.0
+
+.cells.0.source.0
+.cells.0.source.1
+.cells.0.source.2
+.cells.0.source.3
+.cells.0.source.4
+.cells.0.source.5
+.cells.0.source.6
+.cells.0.source.7
+
+.cells.1
+
+.cells.1.source.0
+.cells.1.source.1
+.cells.1.source.2
+
+.cells.2
+
+.cells.2.source
+.cells.2.source.0
+.cells.2.source.1
+.cells.2.source.2
+
+
+.cells.3
+
+.cells.3.source
+.cells.3.source.0
+
+
+.cells.4
+
+.cells.4.source
+.cells.4.source.0
+.cells.4.source.1
+.cells.4.source.2
+.cells.4.source.3
+
+
+.cells.4.outputs
+
+.cells.4.outputs.0.data.text/plain.0
+
+.cells.4.outputs.1.data.image/png
+
+.cells.5
+
+.cells.5.source
+.cells.5.source.0
+
+
+.cells.6
+
+.cells.6.source
+.cells.6.source.0
+
+
+.cells.6.outputs
+
+.cells.6.outputs.0.data.text/plain.0
+.cells.6.outputs.0.data.text/plain.1
+.cells.6.outputs.0.data.text/plain.2
+
+.cells.7
+
+.cells.7.source
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected.md b/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected.md
new file mode 100644
index 00000000000..392a5048f59
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected.md
@@ -0,0 +1,3 @@
+%% Cell type:markdown id:1 tags:hello,world
+
+A
diff --git a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt
new file mode 100644
index 00000000000..86a7f6b3960
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt
@@ -0,0 +1,3 @@
+.cells.0
+
+.cells.0.source
diff --git a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb
new file mode 100644
index 00000000000..5ebd41adbfa
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb
@@ -0,0 +1,17 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "1",
+ "metadata": {
+ "tags": [
+ "hello",
+ "world"
+ ]
+ },
+ "source": "A"
+ }
+ ],
+ "metadata": {
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md b/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md
new file mode 100644
index 00000000000..c62e8fd6b9a
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md
@@ -0,0 +1,3 @@
+%% Cell type:markdown id: tags:
+
+> This is a test\n>\n> To see if I can duplicate my bug
diff --git a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt
new file mode 100644
index 00000000000..86a7f6b3960
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt
@@ -0,0 +1,3 @@
+.cells.0
+
+.cells.0.source
diff --git a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb
new file mode 100644
index 00000000000..faacc703969
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb
@@ -0,0 +1,11 @@
+{
+ "metadata": {
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": "> This is a test\n>\n> To see if I can duplicate my bug",
+ "metadata": {}
+ }
+ ]
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md
new file mode 100644
index 00000000000..0448bf21111
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md
@@ -0,0 +1,9 @@
+%% Cell type:code id:123 tags:
+
+``` python
+print("G'bye")
+```
+
+%% Output
+
+ G'bye
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
new file mode 100644
index 00000000000..be4e2861ea9
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
@@ -0,0 +1,9 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.text.0
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb
new file mode 100644
index 00000000000..14601fe35e5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb
@@ -0,0 +1,27 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "123",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "G'bye\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"G'bye\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md b/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md
new file mode 100644
index 00000000000..a5a167d31c5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md
@@ -0,0 +1,17 @@
+%% Cell type:code id:5 tags:
+
+``` python
+from IPython.display import SVG, display
+
+svg = """<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="50" cy="50" r="50"/>
+</svg>"""
+
+display(SVG(svg))
+```
+
+%% Output
+
+ ![](data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="50"/></svg>)
+
+ ![](data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="50"/></svg>)
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
new file mode 100644
index 00000000000..861198a8c92
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
@@ -0,0 +1,17 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+.cells.0.source.1
+.cells.0.source.2
+.cells.0.source.3
+.cells.0.source.4
+.cells.0.source.5
+.cells.0.source.6
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.data.image/svg+xml
+
+.cells.0.outputs.1.data.image/svg+xml
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/svg/input.ipynb
new file mode 100644
index 00000000000..a02d01f7bf2
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/svg/input.ipynb
@@ -0,0 +1,66 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">\n",
+ " <circle cx=\"50\" cy=\"50\" r=\"50\"/>\n",
+ "</svg>"
+ ],
+ "text/plain": [
+ "<IPython.core.display.SVG object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/svg+xml": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><circle cx=\"50\" cy=\"50\" r=\"50\"/></svg>",
+ "text/plain": [
+ "<IPython.core.display.SVG object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from IPython.display import SVG, display\n",
+ "\n",
+ "svg = \"\"\"<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n",
+ " <circle cx=\"50\" cy=\"50\" r=\"50\"/>\n",
+ "</svg>\"\"\"\n",
+ "\n",
+ "display(SVG(svg))"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md
new file mode 100644
index 00000000000..1b6c086ecd5
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md
@@ -0,0 +1,9 @@
+%% Cell type:code id:5 tags:senoid
+
+``` python
+plt.plot(x, y)
+```
+
+%% Output
+
+ [<matplotlib.lines.Line2D at 0x12a4e43d0>]
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
new file mode 100644
index 00000000000..a004d852ba4
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
@@ -0,0 +1,9 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.data.text/plain.0
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/text_output/input.ipynb
new file mode 100644
index 00000000000..b1b387bb99d
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_output/input.ipynb
@@ -0,0 +1,31 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "id": "5",
+ "metadata": {
+ "tags": [
+ "senoid"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[<matplotlib.lines.Line2D at 0x12a4e43d0>]"
+ ]
+ },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "plt.plot(x, y)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
new file mode 100644
index 00000000000..c77f109378c
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
@@ -0,0 +1,14 @@
+%% Cell type:code id:5 tags:senoid
+
+``` python
+x = np.linspace(0, 4*np.pi,50)
+y = 2 * np.sin(x)
+
+plt.plot(x, y)
+```
+
+%% Output
+
+ [<matplotlib.lines.Line2D at 0x12a4e43d0>]
+
+ ![](data:image/png;base64,this_is_an_invalid_hash_for_testing_purposes)
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt
new file mode 100644
index 00000000000..62e35deb96d
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt
@@ -0,0 +1,14 @@
+3
+
+36
+37
+38
+39
+40
+
+
+12
+
+16
+
+25
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
new file mode 100644
index 00000000000..49f2d7149d8
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
@@ -0,0 +1,14 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+.cells.0.source.1
+.cells.0.source.2
+.cells.0.source.3
+
+
+.cells.0.outputs
+
+.cells.0.outputs.0.data.text/plain.0
+
+.cells.0.outputs.1.data.image/png
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb
new file mode 100644
index 00000000000..3728b129d26
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb
@@ -0,0 +1,49 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "5",
+ "metadata": {
+ "tags": [
+ "senoid"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[<matplotlib.lines.Line2D at 0x12a4e43d0>]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "this_is_an_invalid_hash_for_testing_purposes\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "x = np.linspace(0, 4*np.pi,50)\n",
+ "y = 2 * np.sin(x)\n",
+ "\n",
+ "plt.plot(x, y)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/to.ipynb b/vendor/gems/ipynbdiff/spec/testdata/to.ipynb
new file mode 100644
index 00000000000..99b51f3b857
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/to.ipynb
@@ -0,0 +1,200 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "0aac5da7-745c-4eda-847a-3d0d07a1bb9b",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "# This is a markdown cell\n",
+ "\n",
+ "This paragraph has\n",
+ "With\n",
+ "Many\n",
+ "Lines. How we will he handle MR notes?\n",
+ "\n",
+ "But I can add another paragraph\n",
+ "\n",
+ "Another paragraph added"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "faecea5b-de0a-49fa-9a3a-61c2add652da",
+ "metadata": {},
+ "source": [
+ "This is a raw cell\n",
+ "With\n",
+ "Multiple lines"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "893ca2c0-ab75-4276-9dad-be1c40e16e8a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "0d707fb5-226f-46d6-80bd-489ebfb8905c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "np.random.seed(42)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "35467fcf-28b1-4c7b-bb09-4cb192c35293",
+ "metadata": {
+ "tags": [
+ "senoid"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[<matplotlib.lines.Line2D at 0x12a4e43d0>]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "another_invalid_base64_image_here\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "x = np.linspace(0, 4*np.pi,50)\n",
+ "y = 2 * np.sin(x)\n",
+ "\n",
+ "plt.plot(x, y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "dc1178cd-c46d-4da3-9ab5-08f000699884",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.DataFrame({\"x\": x, \"y\": y})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "6e749b4f-b409-4700-870f-f68c39462490",
+ "metadata": {
+ "tags": [
+ "some-table"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<div>\n",
+ "<style scoped>\n",
+ " .dataframe tbody tr th:only-of-type {\n",
+ " vertical-align: middle;\n",
+ " }\n",
+ "\n",
+ " .dataframe tbody tr th {\n",
+ " vertical-align: top;\n",
+ " }\n",
+ "\n",
+ " .dataframe thead th {\n",
+ " text-align: right;\n",
+ " }\n",
+ "</style>\n",
+ "<table border=\"1\" class=\"dataframe\">\n",
+ " <thead>\n",
+ " <tr style=\"text-align: right;\">\n",
+ " <th></th>\n",
+ " <th>x</th>\n",
+ " <th>y</th>\n",
+ " </tr>\n",
+ " </thead>\n",
+ " <tbody>\n",
+ " <tr>\n",
+ " <th>0</th>\n",
+ " <td>0.000000</td>\n",
+ " <td>0.000000</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <th>1</th>\n",
+ " <td>0.256457</td>\n",
+ " <td>0.507309</td>\n",
+ " </tr>\n",
+ " </tbody>\n",
+ "</table>\n",
+ "</div>"
+ ],
+ "text/plain": [
+ " x y\n",
+ "0 0.000000 0.000000\n",
+ "1 0.256457 0.507309"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[:2]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0ddef5ef-94a3-4afd-9c70-ddee9694f512",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "New Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.7"
+ },
+ "toc-showtags": true
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md b/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md
new file mode 100644
index 00000000000..af34d6eb8c3
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md
@@ -0,0 +1,5 @@
+%% Cell type:code id:123 tags:
+
+``` python
+print("G'bye")
+```
diff --git a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt
new file mode 100644
index 00000000000..cb35f88c897
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt
@@ -0,0 +1,5 @@
+.cells.0
+
+.cells.0.source
+.cells.0.source.0
+
diff --git a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb b/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb
new file mode 100644
index 00000000000..42f4b39b365
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb
@@ -0,0 +1,27 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "123",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "unknown_output",
+ "text": [
+ "G'bye\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"G'bye\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "language": "python"
+ }
+ }
+}
diff --git a/vendor/gems/ipynbdiff/spec/transformer_spec.rb b/vendor/gems/ipynbdiff/spec/transformer_spec.rb
new file mode 100644
index 00000000000..c5873906ca9
--- /dev/null
+++ b/vendor/gems/ipynbdiff/spec/transformer_spec.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'ipynbdiff'
+require 'json'
+require 'rspec-parameterized'
+
+TRANSFORMER_BASE_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'testdata')
+
+def read_file(*paths)
+ File.read(File.join(TRANSFORMER_BASE_PATH, *paths))
+end
+
+def default_config
+ @default_config ||= {
+ include_frontmatter: false,
+ hide_images: false
+ }
+end
+
+def from_ipynb
+ @from_ipynb ||= read_file('from.ipynb')
+end
+
+def read_notebook(input_path)
+ read_file(input_path, 'input.ipynb')
+rescue Errno::ENOENT
+ from_ipynb
+end
+
+describe IpynbDiff::Transformer do
+ describe 'When notebook is valid' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:ctx, :test_case, :config) do
+ 'renders metadata' | 'no_cells' | { include_frontmatter: true }
+ 'is empty for no cells, but metadata is false' | 'no_cells_no_metadata' | {}
+ 'adds markdown cell' | 'only_md' | {}
+ 'adds block with only one line of markdown' | 'single_line_md' | {}
+ 'adds raw block' | 'only_raw' | {}
+ 'code cell, but no output' | 'only_code' | {}
+ 'code cell, but no language' | 'only_code_no_language' | {}
+ 'code cell, but no kernelspec' | 'only_code_no_kernelspec' | {}
+ 'code cell, but no nb metadata' | 'only_code_no_metadata' | {}
+ 'text output' | 'text_output' | {}
+ 'ignores html output' | 'ignore_html_output' | {}
+ 'extracts png output along with text' | 'text_png_output' | {}
+ 'embeds svg as image' | 'svg' | {}
+ 'extracts latex output' | 'latex_output' | {}
+ 'extracts error output' | 'error_output' | {}
+ 'does not fetch tags if there is no cell metadata' | 'no_metadata_on_cell' | {}
+ 'generates :percent decorator' | 'percent_decorator' | {}
+ 'parses stream output' | 'stream_text' | {}
+ 'ignores unknown output type' | 'unknown_output_type' | {}
+ 'handles backslash correctly' | 'backslash_as_last_char' | {}
+ 'multiline png output' | 'multiline_png_output' | {}
+ 'hides images when option passed' | 'hide_images' | { hide_images: true }
+ '\n within source lines' | 'source_with_linebreak' | { hide_images: true }
+ end
+
+ with_them do
+ let(:expected_md) { read_file(test_case, 'expected.md') }
+ let(:expected_symbols) { read_file(test_case, 'expected_symbols.txt') }
+ let(:input) { read_notebook(test_case) }
+ let(:transformed) { IpynbDiff::Transformer.new(**default_config.merge(config)).transform(input) }
+
+ it 'generates the expected markdown' do
+ expect(transformed.as_text).to eq expected_md
+ end
+
+ it 'marks the lines correctly' do
+ blocks = transformed.blocks.map { |b| b[:source_symbol] }.join("\n")
+ result = expected_symbols
+
+ expect(blocks).to eq result
+ end
+ end
+ end
+
+ it 'generates the correct transformed to source line map' do
+ input = read_file('text_png_output', 'input.ipynb' )
+ expected_line_numbers = read_file('text_png_output', 'expected_line_numbers.txt' )
+
+ transformed = IpynbDiff::Transformer.new(**{ include_frontmatter: false }).transform(input)
+
+ line_numbers = transformed.blocks.map { |b| b[:source_line] }.join("\n")
+
+ expect(line_numbers).to eq(expected_line_numbers)
+
+ end
+
+ context 'When the notebook is invalid' do
+ [
+ ['because the json is invalid', 'a'],
+ ['because it doesnt have the cell tag', '{"metadata":[]}']
+ ].each do |ctx, notebook|
+ context ctx do
+ it 'raises error' do
+ expect do
+ IpynbDiff::Transformer.new.transform(notebook)
+ end.to raise_error(IpynbDiff::InvalidNotebookError)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/omniauth-gitlab/.gitignore b/vendor/gems/omniauth-gitlab/.gitignore
new file mode 100644
index 00000000000..062d4acf0a9
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/.gitignore
@@ -0,0 +1,17 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+.rvmrc
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
diff --git a/vendor/gems/omniauth-gitlab/.gitlab-ci.yml b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
new file mode 100644
index 00000000000..ad9545e2998
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
@@ -0,0 +1,30 @@
+workflow:
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+
+.rspec:
+ cache:
+ key: omniauth-gitlab-ruby
+ paths:
+ - vendor/gems/omniauth-gitlab/vendor/ruby
+ before_script:
+ - cd vendor/gems/omniauth-gitlab
+ - ruby -v # Print out ruby version for debugging
+ - gem install bundler --no-document # Bundler is not installed with the image
+ - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
+ - bundle config set with 'development'
+ - bundle install -j $(nproc)
+ script:
+ - bundle exec rspec
+
+rspec-2.6:
+ image: "ruby:2.6"
+ extends: .rspec
+
+rspec-2.7:
+ image: "ruby:2.7"
+ extends: .rspec
+
+rspec-3.0:
+ image: "ruby:3.0"
+ extends: .rspec \ No newline at end of file
diff --git a/vendor/gems/omniauth-gitlab/Gemfile b/vendor/gems/omniauth-gitlab/Gemfile
new file mode 100644
index 00000000000..ad0c84b6ac8
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in omniauth-gitlab.gemspec
+gemspec
diff --git a/vendor/gems/omniauth-gitlab/Gemfile.lock b/vendor/gems/omniauth-gitlab/Gemfile.lock
new file mode 100644
index 00000000000..b5979104080
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/Gemfile.lock
@@ -0,0 +1,73 @@
+PATH
+ remote: .
+ specs:
+ omniauth-gitlab (4.0.0)
+ omniauth (~> 1.0)
+ omniauth-oauth2 (~> 1.7.1)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ diff-lcs (1.5.0)
+ docile (1.4.0)
+ faraday (2.3.0)
+ faraday-net_http (~> 2.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-net_http (2.0.3)
+ hashie (5.0.0)
+ jwt (2.4.1)
+ multi_xml (0.6.0)
+ oauth2 (2.0.1)
+ faraday (>= 0.17.3, < 3.0)
+ jwt (>= 1.0, < 3.0)
+ multi_xml (~> 0.5)
+ rack (>= 1.2, < 3)
+ rash_alt (>= 0.4, < 1)
+ version_gem (~> 1.0)
+ omniauth (1.9.1)
+ hashie (>= 3.4.6)
+ rack (>= 1.6.2, < 3)
+ omniauth-oauth2 (1.7.3)
+ oauth2 (>= 1.4, < 3)
+ omniauth (>= 1.9, < 3)
+ rack (2.2.3.1)
+ rake (13.0.6)
+ rash_alt (0.4.12)
+ hashie (>= 3.4)
+ rspec (3.11.0)
+ rspec-core (~> 3.11.0)
+ rspec-expectations (~> 3.11.0)
+ rspec-mocks (~> 3.11.0)
+ rspec-core (3.11.0)
+ rspec-support (~> 3.11.0)
+ rspec-expectations (3.11.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-its (1.3.0)
+ rspec-core (>= 3.0.0)
+ rspec-expectations (>= 3.0.0)
+ rspec-mocks (3.11.1)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-support (3.11.0)
+ ruby2_keywords (0.0.5)
+ simplecov (0.21.2)
+ docile (~> 1.1)
+ simplecov-html (~> 0.11)
+ simplecov_json_formatter (~> 0.1)
+ simplecov-html (0.12.3)
+ simplecov_json_formatter (0.1.4)
+ version_gem (1.0.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ omniauth-gitlab!
+ rake (>= 12.0)
+ rspec (~> 3.1)
+ rspec-its (~> 1.0)
+ simplecov
+
+BUNDLED WITH
+ 2.3.15
diff --git a/vendor/gems/omniauth-gitlab/LICENSE.txt b/vendor/gems/omniauth-gitlab/LICENSE.txt
new file mode 100644
index 00000000000..ccdae5ea15c
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2013 ssein
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/vendor/gems/omniauth-gitlab/README.md b/vendor/gems/omniauth-gitlab/README.md
new file mode 100644
index 00000000000..f22f14266f6
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/README.md
@@ -0,0 +1,94 @@
+# Omniauth::Gitlab
+
+This is fork of [omniauth-gitlab](https://github.com/linchus/omniauth-gitlab) to support:
+
+1. OmniAuth v1 and v2. OmniAuth v2 disables GET requests by default
+ and defaults to POST. GitLab already has patched v1 to use POST,
+ but other dependencies need to be updated:
+ https://gitlab.com/gitlab-org/gitlab/-/issues/30073.
+
+2. [`oauth2`](https://github.com/oauth-xx/oauth2) v1.4.9 and up.
+ [v1.4.9 fixed relative URL handling](https://github.com/oauth-xx/oauth2/pull/469).
+
+ However, this breaks the default GitLab.com configuration and
+ existing configurations that use the `/api/v4` suffix in the `site`
+ parameter.
+ [omniauth-gitlab v4.0.0 fixed the first issue](https://github.com/linchus/omniauth-gitlab/pull/22),
+ but the second issue requires an admin to update `site` to drop the suffix.
+
+ This fork restores backwards compatibility that was removed in omniauth-gitlab v2.0.0:
+ https://github.com/linchus/omniauth-gitlab/commit/bb4cec2c9f8f067fdfe1f9aa219973e5d8e4a0a3
+
+[![Join the chat at https://gitter.im/linchus/omniauth-gitlab](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/linchus/omniauth-gitlab?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+This is the OAuth2 strategy for authenticating to your GitLab service.
+
+## Requirements
+
+Gitlab 7.7.0+
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+ gem 'omniauth-gitlab'
+
+And then execute:
+
+ $ bundle
+
+Or install it yourself as:
+
+ $ gem install omniauth-gitlab
+
+## Basic Usage
+
+ use OmniAuth::Builder do
+ provider :gitlab, ENV['GITLAB_KEY'], ENV['GITLAB_SECRET']
+ end
+
+## Standalone Usage
+
+ use OmniAuth::Builder do
+ provider :gitlab, ENV['GITLAB_KEY'], ENV['GITLAB_SECRET'],
+ {
+ client_options: {
+ site: 'https://gitlab.YOURDOMAIN.com/api/v4'
+ }
+ }
+ end
+
+## Custom scopes
+
+By default, the `api` scope is requested and must be allowed in GitLab's application configuration. To use different scopes:
+
+ use OmniAuth::Builder do
+ provider :gitlab, ENV['GITLAB_KEY'], ENV['GITLAB_SECRET'], scope: 'read_user openid'
+ end
+
+Requesting a scope that is not configured will result the error "The requested scope is invalid, unknown, or malformed.".
+
+## Old API version
+
+API V3 will be unsupported from GitLab 9.5 and will be removed in GitLab 9.5 or later.
+
+[https://gitlab.com/help/api/v3_to_v4.md](https://gitlab.com/help/api/v3_to_v4.md)
+
+If you use GitLab 9.0 and below you could configure V3 API:
+
+ use OmniAuth::Builder do
+ provider :gitlab, ENV['GITLAB_KEY'], ENV['GITLAB_SECRET'],
+ {
+ client_options: {
+ site: 'https://gitlab.YOURDOMAIN.com/api/v3'
+ }
+ }
+ end
+
+## Contributing
+
+1. Fork it
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Commit your changes (`git commit -am 'Add some feature'`)
+4. Push to the branch (`git push origin my-new-feature`)
+5. Create new Pull Request
diff --git a/vendor/gems/omniauth-gitlab/Rakefile b/vendor/gems/omniauth-gitlab/Rakefile
new file mode 100644
index 00000000000..db953c9a1c5
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/Rakefile
@@ -0,0 +1,7 @@
+require 'bundler/gem_tasks'
+require 'rspec/core/rake_task'
+
+RSpec::Core::RakeTask.new
+
+desc 'Run specs'
+task default: :spec
diff --git a/vendor/gems/omniauth-gitlab/lib/omniauth-gitlab.rb b/vendor/gems/omniauth-gitlab/lib/omniauth-gitlab.rb
new file mode 100644
index 00000000000..dfe9d2131c9
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/lib/omniauth-gitlab.rb
@@ -0,0 +1,2 @@
+require 'omniauth-gitlab/version'
+require 'omniauth/strategies/gitlab'
diff --git a/vendor/gems/omniauth-gitlab/lib/omniauth-gitlab/version.rb b/vendor/gems/omniauth-gitlab/lib/omniauth-gitlab/version.rb
new file mode 100644
index 00000000000..6465d4ca199
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/lib/omniauth-gitlab/version.rb
@@ -0,0 +1,5 @@
+module Omniauth
+ module Gitlab
+ VERSION = '4.0.0'
+ end
+end
diff --git a/vendor/gems/omniauth-gitlab/lib/omniauth/strategies/gitlab.rb b/vendor/gems/omniauth-gitlab/lib/omniauth/strategies/gitlab.rb
new file mode 100644
index 00000000000..19ee02e78c4
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/lib/omniauth/strategies/gitlab.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'omniauth-oauth2'
+
+module OmniAuth
+ module Strategies
+ class GitLab < OmniAuth::Strategies::OAuth2
+ API_SUFFIX_REGEX = %r{/api/v(\d+)/?$}.freeze
+
+ option :client_options, site: 'https://gitlab.com'
+
+ option :redirect_url
+
+ uid { raw_info['id'].to_s }
+
+ info do
+ {
+ name: raw_info['name'],
+ username: raw_info['username'],
+ email: raw_info['email'],
+ image: raw_info['avatar_url']
+ }
+ end
+
+ extra do
+ { raw_info: raw_info }
+ end
+
+ def raw_info
+ @raw_info ||= access_token.get(user_endpoint_url).parsed
+ end
+
+ private
+
+ def user_endpoint_url
+ options.client_options.site.match(API_SUFFIX_REGEX) ? 'user' : 'api/v4/user'
+ end
+
+ def callback_url
+ options.redirect_url || (full_host + script_name + callback_path)
+ end
+ end
+ end
+end
+
+OmniAuth.config.add_camelization 'gitlab', 'GitLab'
diff --git a/vendor/gems/omniauth-gitlab/omniauth-gitlab.gemspec b/vendor/gems/omniauth-gitlab/omniauth-gitlab.gemspec
new file mode 100644
index 00000000000..be25cb50af6
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/omniauth-gitlab.gemspec
@@ -0,0 +1,25 @@
+# -*- encoding: utf-8 -*-
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'omniauth-gitlab/version'
+
+Gem::Specification.new do |gem|
+ gem.name = 'omniauth-gitlab'
+ gem.version = Omniauth::Gitlab::VERSION
+ gem.authors = ['Sergey Sein']
+ gem.email = ['linchus@gmail.com']
+ gem.description = 'This is the strategy for authenticating to your GitLab service'
+ gem.summary = 'This is the strategy for authenticating to your GitLab service'
+ gem.homepage = 'https://github.com/linchus/omniauth-gitlab'
+
+ gem.files = Dir['lib/**/*.rb']
+ gem.test_files = Dir['spec/**/*.rb']
+ gem.require_paths = ['lib']
+
+ gem.add_dependency 'omniauth', '~> 1.0'
+ gem.add_dependency 'omniauth-oauth2', '~> 1.7.1'
+ gem.add_development_dependency 'rspec', '~> 3.1'
+ gem.add_development_dependency 'rspec-its', '~> 1.0'
+ gem.add_development_dependency 'simplecov'
+ gem.add_development_dependency 'rake', '>= 12.0'
+end
diff --git a/vendor/gems/omniauth-gitlab/spec/omniauth/strategies/gitlab_spec.rb b/vendor/gems/omniauth-gitlab/spec/omniauth/strategies/gitlab_spec.rb
new file mode 100644
index 00000000000..a599386b26c
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/spec/omniauth/strategies/gitlab_spec.rb
@@ -0,0 +1,80 @@
+require 'spec_helper'
+
+describe OmniAuth::Strategies::GitLab do
+ let(:access_token) { double('AccessToken') }
+ let(:parsed_response) { double('ParsedResponse') }
+ let(:response) { double('Response', parsed: parsed_response) }
+
+ let(:enterprise_site) { 'https://some.other.site.com' }
+
+ let(:gitlab_service) { OmniAuth::Strategies::GitLab.new({}) }
+ let(:enterprise) do
+ OmniAuth::Strategies::GitLab.new(
+ 'GITLAB_KEY',
+ 'GITLAB_SECRET',
+ client_options: { site: enterprise_site },
+ redirect_url: 'http://localhost:9292/callback_url'
+ )
+ end
+
+ subject { gitlab_service }
+
+ before(:each) do
+ allow(subject).to receive(:access_token).and_return(access_token)
+ end
+
+ describe 'client options' do
+ context 'with defaults' do
+ subject { gitlab_service.options.client_options }
+
+ its(:site) { is_expected.to eq 'https://gitlab.com' }
+ end
+
+ context 'with override' do
+ subject { enterprise.options.client_options }
+
+ its(:site) { is_expected.to eq enterprise_site }
+ end
+ end
+
+ describe 'redirect_url' do
+ context 'with defaults' do
+ subject { gitlab_service.options }
+ its(:redirect_url) { is_expected.to be_nil }
+ end
+
+ context 'with customs' do
+ subject { enterprise.options }
+ its(:redirect_url) { is_expected.to eq 'http://localhost:9292/callback_url' }
+ end
+ end
+
+ describe '#raw_info' do
+ context 'with new configuration' do
+ it 'sent request to current user endpoint' do
+ expect(access_token).to receive(:get).with('api/v4/user').and_return(response)
+ expect(subject.raw_info).to eq(parsed_response)
+ end
+ end
+
+ context 'with old style configuration' do
+ let(:enterprise_site) { 'https://some.other.site.com/api/v4' }
+
+ subject { enterprise }
+
+ it 'sent request to current user endpoint' do
+ expect(access_token).to receive(:get).with('user').and_return(response)
+ expect(subject.raw_info).to eq(parsed_response)
+ end
+
+ context 'with a trailing slash' do
+ let(:enterprise_site) { 'https://some.other.site.com/api/v4/' }
+
+ it 'sent request to current user endpoint' do
+ expect(access_token).to receive(:get).with('user').and_return(response)
+ expect(subject.raw_info).to eq(parsed_response)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/omniauth-gitlab/spec/spec_helper.rb b/vendor/gems/omniauth-gitlab/spec/spec_helper.rb
new file mode 100644
index 00000000000..38553547e98
--- /dev/null
+++ b/vendor/gems/omniauth-gitlab/spec/spec_helper.rb
@@ -0,0 +1,8 @@
+$LOAD_PATH.unshift File.expand_path('..', __FILE__)
+$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
+require 'simplecov'
+SimpleCov.start
+require 'rspec'
+require 'rspec/its'
+require 'omniauth'
+require 'omniauth-gitlab'
diff --git a/vendor/gems/omniauth_crowd/.gitlab-ci.yml b/vendor/gems/omniauth_crowd/.gitlab-ci.yml
new file mode 100644
index 00000000000..98e686db4e3
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/.gitlab-ci.yml
@@ -0,0 +1,30 @@
+workflow:
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+
+.rspec:
+ cache:
+ key: omniauth-gitlab-ruby
+ paths:
+ - vendor/gems/omniauth_crowd/vendor/ruby
+ before_script:
+ - cd vendor/gems/omniauth_crowd
+ - ruby -v # Print out ruby version for debugging
+ - gem install bundler --no-document # Bundler is not installed with the image
+ - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
+ - bundle config set with 'development'
+ - bundle install -j $(nproc)
+ script:
+ - bundle exec rspec
+
+rspec-2.6:
+ image: "ruby:2.6"
+ extends: .rspec
+
+rspec-2.7:
+ image: "ruby:2.7"
+ extends: .rspec
+
+rspec-3.0:
+ image: "ruby:3.0"
+ extends: .rspec
diff --git a/vendor/gems/omniauth_crowd/Gemfile b/vendor/gems/omniauth_crowd/Gemfile
new file mode 100644
index 00000000000..e2305d86b8d
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/Gemfile
@@ -0,0 +1,4 @@
+source 'http://rubygems.org'
+
+# Specify your gem's dependencies in omniauth-github.gemspec
+gemspec
diff --git a/vendor/gems/omniauth_crowd/Gemfile.lock b/vendor/gems/omniauth_crowd/Gemfile.lock
new file mode 100644
index 00000000000..0ac781e9948
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/Gemfile.lock
@@ -0,0 +1,74 @@
+PATH
+ remote: .
+ specs:
+ omniauth_crowd (2.4.0)
+ activesupport
+ nokogiri (>= 1.4.4)
+ omniauth (~> 1.0, < 3)
+
+GEM
+ remote: http://rubygems.org/
+ specs:
+ activesupport (5.0.0.1)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (~> 0.7)
+ minitest (~> 5.1)
+ tzinfo (~> 1.1)
+ addressable (2.5.2)
+ public_suffix (>= 2.0.2, < 4.0)
+ concurrent-ruby (1.0.5)
+ crack (0.4.3)
+ safe_yaml (~> 1.0.0)
+ diff-lcs (1.2.5)
+ hashdiff (0.3.6)
+ hashie (3.4.3)
+ i18n (0.8.1)
+ mini_portile2 (2.1.0)
+ minitest (5.10.1)
+ nokogiri (1.6.8.1)
+ mini_portile2 (~> 2.1.0)
+ omniauth (1.3.1)
+ hashie (>= 1.2, < 4)
+ rack (>= 1.0, < 3)
+ public_suffix (3.0.0)
+ rack (1.6.4)
+ rack-test (0.6.3)
+ rack (>= 1.0)
+ rake (10.5.0)
+ rexml (3.2.5)
+ rspec (3.0.0)
+ rspec-core (~> 3.0.0)
+ rspec-expectations (~> 3.0.0)
+ rspec-mocks (~> 3.0.0)
+ rspec-core (3.0.4)
+ rspec-support (~> 3.0.0)
+ rspec-expectations (3.0.4)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.0.0)
+ rspec-mocks (3.0.4)
+ rspec-support (~> 3.0.0)
+ rspec-support (3.0.4)
+ safe_yaml (1.0.4)
+ thread_safe (0.3.6)
+ tzinfo (1.2.2)
+ thread_safe (~> 0.1)
+ webmock (3.0.1)
+ addressable (>= 2.3.6)
+ crack (>= 0.3.2)
+ hashdiff
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ bundler (> 1.0.0)
+ omniauth_crowd!
+ rack
+ rack-test
+ rake
+ rexml (~> 3.2.5)
+ rspec (~> 3.0.0)
+ webmock (~> 3.0.0)
+
+BUNDLED WITH
+ 2.3.15
diff --git a/vendor/gems/omniauth_crowd/LICENSE.txt b/vendor/gems/omniauth_crowd/LICENSE.txt
new file mode 100644
index 00000000000..463a011fbaf
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2011 Rob Di Marco
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/gems/omniauth_crowd/README.md b/vendor/gems/omniauth_crowd/README.md
new file mode 100644
index 00000000000..01d8119b15d
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/README.md
@@ -0,0 +1,52 @@
+# omniauth_crowd
+
+This is fork of [omniauth_crowd](https://github.com/robdimarco/omniauth_crowd) to support:
+
+1. OmniAuth v1 and v2. OmniAuth v2 disables GET requests by default
+ and defaults to POST. GitLab already has patched v1 to use POST,
+ but other dependencies need to be updated:
+ https://gitlab.com/gitlab-org/gitlab/-/issues/30073.
+2. We may deprecate this library entirely in the future:
+ https://gitlab.com/gitlab-org/gitlab/-/issues/366212
+
+The omniauth_crowd library is an OmniAuth provider that supports authentication against Atlassian Crowd REST apis.
+
+[![Build Status](https://travis-ci.org/robdimarco/omniauth_crowd.svg?branch=master)](https://travis-ci.org/robdimarco/omniauth_crowd)
+
+## Helpful links
+
+* [Documentation](http://github.com/robdimarco/omniauth_crow)
+* [OmniAuth](https://github.com/intridea/omniauth/)
+* [Atlassian Crowd](http://www.atlassian.com/software/crowd/)
+* [Atlassian Crowd REST API](http://confluence.atlassian.com/display/CROWDDEV/Crowd+REST+APIs)
+
+## Install and use
+
+### 1. Add the OmniAuth Crowd REST plugin to your Gemfile
+
+ gem 'omniauth', '>= 1.0.0' # We depend on this
+ gem "omniauth_crowd"
+
+### 2. You will need to configure OmniAuth to use your crowd authentication. This is generally done in Rails in the config/initializers/omniauth.rb with...
+
+ Rails.application.config.middleware.use OmniAuth::Builder do
+ provider :crowd, :crowd_server_url=>"https://crowd.mycompanyname.com/crowd", :application_name=>"app", :application_password=>"password"
+ end
+
+You will need to supply the correct server URL, application name and password
+
+## Contributing to omniauth_crowd
+
+* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
+* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
+* Fork the project
+* Start a feature/bugfix branch
+* Commit and push until you are happy with your contribution
+* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
+* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
+
+## Copyright
+
+Copyright (c) 2011-14 Rob Di Marco. See LICENSE.txt for
+further details.
+
diff --git a/vendor/gems/omniauth_crowd/Rakefile b/vendor/gems/omniauth_crowd/Rakefile
new file mode 100644
index 00000000000..4786a6c34d1
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/Rakefile
@@ -0,0 +1,12 @@
+#!/usr/bin/env rake
+require "bundler/gem_tasks"
+require 'rspec/core/rake_task'
+
+desc 'Default: run specs.'
+task :default => :spec
+
+desc "Run specs"
+RSpec::Core::RakeTask.new
+
+desc 'Run specs'
+task :default => :spec \ No newline at end of file
diff --git a/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd.rb b/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd.rb
new file mode 100755
index 00000000000..7e3829b9b95
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd.rb
@@ -0,0 +1,97 @@
+require 'omniauth'
+require 'active_support'
+require 'active_support/core_ext/object'
+module OmniAuth
+ module Strategies
+ class Crowd
+ include OmniAuth::Strategy
+
+ autoload :Configuration, 'omniauth/strategies/crowd/configuration'
+ autoload :CrowdValidator, 'omniauth/strategies/crowd/crowd_validator'
+ def initialize(app, options = {}, &block)
+ options.symbolize_keys!()
+ super(app, {:name=> :crowd}.merge(options), &block)
+ @configuration = OmniAuth::Strategies::Crowd::Configuration.new(options)
+ end
+
+ protected
+
+ def request_phase
+ if env['REQUEST_METHOD'] == 'GET'
+
+ if @configuration.use_sessions? && request.cookies[@configuration.session_cookie]
+ redirect callback_url
+ else
+ get_credentials
+ end
+
+ elsif (env['REQUEST_METHOD'] == 'POST') && (not request.params['username'])
+ get_credentials
+ else
+ session['omniauth.crowd'] = {'username' => request['username'], 'password' => request['password']}
+ redirect callback_url
+ end
+ end
+
+ def get_client_ip
+ env['HTTP_X_FORWARDED_FOR'] ? env['HTTP_X_FORWARDED_FOR'] : env['REMOTE_ADDRESS']
+ end
+
+ def get_sso_tokens
+ env['HTTP_COOKIE'].split(';').select { |val|
+ val.strip.start_with?(@configuration.session_cookie)
+ }.map { |val|
+ val.strip.split('=').last
+ }
+ end
+
+ def get_credentials
+
+ configuration = @configuration
+
+ OmniAuth::Form.build(:title => (options[:title] || "Crowd Authentication")) do
+ text_field 'Login', 'username'
+ password_field 'Password', 'password'
+
+ if configuration.use_sessions? && configuration.sso_url
+ fieldset 'SSO' do
+ html "<a href=\"#{configuration.sso_url}/users/auth/crowd/callback\">" + (configuration.sso_url_image ? "<img src=\"#{configuration.sso_url_image}\" />" : '') + "</a>"
+ end
+ end
+
+ end.to_response
+
+ end
+
+ def callback_phase
+
+ creds = session.delete 'omniauth.crowd'
+ username = creds.nil? ? nil : creds['username']
+ password = creds.nil? ? nil : creds['password']
+
+ unless creds
+ if @configuration.use_sessions? && request.cookies[@configuration.session_cookie]
+ validator = CrowdValidator.new(@configuration, username, password, get_client_ip, get_sso_tokens)
+ else
+ return fail!(:no_credentials)
+ end
+ else
+ validator = CrowdValidator.new(@configuration, username, password, get_client_ip, nil)
+ end
+
+ @user_info = validator.user_info
+
+ return fail!(:invalid_credentials) if @user_info.nil? || @user_info.empty?
+
+ super
+ end
+
+ def auth_hash
+ OmniAuth::Utils.deep_merge(super, {
+ 'uid' => @user_info.delete("user"),
+ 'info' => @user_info
+ })
+ end
+ end
+ end
+end
diff --git a/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/configuration.rb b/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/configuration.rb
new file mode 100644
index 00000000000..8816651054f
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/configuration.rb
@@ -0,0 +1,110 @@
+require 'rack'
+
+module OmniAuth
+ module Strategies
+ class Crowd
+ class Configuration
+ DEFAULT_SESSION_URL = "%s/rest/usermanagement/latest/session"
+ DEFAULT_AUTHENTICATION_URL = "%s/rest/usermanagement/latest/authentication"
+ DEFAULT_USER_GROUP_URL = "%s/rest/usermanagement/latest/user/group/direct"
+ DEFAULT_CONTENT_TYPE = 'application/xml'
+ DEFAULT_SESSION_COOKIE = 'crowd.token_key'
+
+ attr_reader :crowd_application_name, :crowd_password, :disable_ssl_verification, :include_users_groups, :use_sessions, :session_url, :content_type, :session_cookie, :sso_url, :sso_url_image
+
+ alias :"disable_ssl_verification?" :disable_ssl_verification
+ alias :"include_users_groups?" :include_users_groups
+ alias :"use_sessions?" :use_sessions
+
+ # @param [Hash] params configuration options
+ # @option params [String, nil] :crowd_server_url the Crowd server root URL; probably something like
+ # `https://crowd.mycompany.com` or `https://crowd.mycompany.com/crowd`; optional.
+ # @option params [String, nil] :crowd_authentication_url (:crowd_server_url + '/rest/usermanagement/latest/authentication') the URL to which to
+ # use for authenication; optional if `:crowd_server_url` is specified,
+ # required otherwise.
+ # @option params [String, nil] :application_name the application name specified in Crowd for this application, required.
+ # @option params [String, nil] :application_password the application password specified in Crowd for this application, required.
+ # @option params [Boolean, nil] :disable_ssl_verification disable verification for SSL cert,
+ # helpful when you developing with a fake cert.
+ # @option params [Boolean, true] : include a list of user groups when getting information ont he user
+ # @option params [String, nil] :crowd_user_group_url (:crowd_server_url + '/rest/usermanagement/latest/user/group/direct') the URL to which to
+ # use for retrieving users groups optional if `:crowd_server_url` is specified, or if `:include_user_groups` is false
+ # required otherwise.
+ # @option params [Boolean, false] :use_sessions Use Crowd sessions. If the user logins with user and password create a new Crowd session. Update the session if only a session token is sent (Cookie name set by option session_cookie)
+ # @option params [String, 'crowd.token_key'] :session_cookie Session cookie name. Defaults to: 'crowd.token_key'
+ # @option params [String, nil] :sso_url URL of the external SSO page. If this parameter is defined the login form will have a link which will redirect to the SSO page. The SSO must return to the URL of the page using omniauth_crowd (Path portion '/users/auth/crowd/callback' is appended to the URL)
+ # @option params [String, nil] :sso_url_image Optional image URL to be used in SSO link in the login form
+ def initialize(params)
+ parse_params params
+ end
+
+ # Build a Crowd authentication URL from +username+.
+ #
+ # @param [String] username the username to validate
+ #
+ # @return [String] a URL like `https://crowd.myhost.com/crowd/rest/usermanagement/latest/authentication?username=USERNAME`
+ def authentication_url(username)
+ append_username @authentication_url, username
+ end
+
+ def user_group_url(username)
+ @user_group_url.nil? ? nil : append_username( @user_group_url, username)
+ end
+
+ private
+ def parse_params(options)
+ options= {:include_user_groups => true}.merge(options || {})
+ %w(application_name application_password).each do |opt|
+ raise ArgumentError.new(":#{opt} MUST be provided") if options[opt.to_sym] == ""
+ end
+ @crowd_application_name = options[:application_name]
+ @crowd_password = options[:application_password]
+ @use_sessions = options[:use_sessions]
+ @content_type = options[:content_type] || DEFAULT_CONTENT_TYPE
+ @session_cookie = options[:session_cookie] || DEFAULT_SESSION_COOKIE
+ @sso_url = options[:sso_url]
+ @sso_url_image = options[:sso_url_image]
+
+ unless options.include?(:crowd_server_url) || options.include?(:crowd_authentication_url)
+ raise ArgumentError.new("Either :crowd_server_url or :crowd_authentication_url MUST be provided")
+ end
+
+ if @use_sessions
+ @session_url = options[:crowd_session_url] || DEFAULT_SESSION_URL % options[:crowd_server_url]
+ validate_is_url 'session URL', @session_url
+ end
+ @authentication_url = options[:crowd_authentication_url] || DEFAULT_AUTHENTICATION_URL % options[:crowd_server_url]
+ validate_is_url 'authentication URL', @authentication_url
+ @disable_ssl_verification = options[:disable_ssl_verification]
+ @include_users_groups = options[:include_user_groups]
+ if @include_users_groups
+ @user_group_url = options[:crowd_user_group_url] || DEFAULT_USER_GROUP_URL % options[:crowd_server_url]
+ validate_is_url 'user group URL', @user_group_url
+ end
+
+ end
+
+ IS_NOT_URL_ERROR_MESSAGE = "%s is not a valid URL"
+
+ def validate_is_url(name, possibly_a_url)
+ url = URI.parse(possibly_a_url) rescue nil
+ raise ArgumentError.new(IS_NOT_URL_ERROR_MESSAGE % name) unless url.kind_of?(URI::HTTP)
+ end
+
+ # Adds +service+ as an URL-escaped parameter to +base+.
+ #
+ # @param [String] base the base URL
+ # @param [String] service the service (a.k.a. return-to) URL.
+ #
+ # @return [String] the new joined URL.
+ def append_username(base, username)
+ result = base.dup
+ result << (result.include?('?') ? '&' : '?')
+ result << 'username='
+ result << Rack::Utils.escape(username)
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/crowd_validator.rb b/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/crowd_validator.rb
new file mode 100755
index 00000000000..319ebf5e013
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/lib/omniauth/strategies/crowd/crowd_validator.rb
@@ -0,0 +1,186 @@
+require 'nokogiri'
+require 'net/http'
+require 'net/https'
+
+module OmniAuth
+ module Strategies
+ class Crowd
+ class CrowdValidator
+ AUTHENTICATION_REQUEST_BODY = "<password><value>%s</value></password>"
+ def initialize(configuration, username, password, client_ip, tokens)
+ @configuration, @username, @password, @client_ip, @tokens = configuration, username, password, client_ip, tokens
+ @authentiction_uri = URI.parse(@configuration.authentication_url(@username))
+ @session_uri = URI.parse(@configuration.session_url) if @configuration.use_sessions
+ end
+
+ def user_info
+ user_info_hash = retrieve_user_info!
+
+ if user_info_hash && @configuration.include_users_groups?
+ user_info_hash = add_user_groups!(user_info_hash)
+ else
+ user_info_hash
+ end
+
+ if user_info_hash && @configuration.use_sessions?
+ user_info_hash = set_session!(user_info_hash)
+ end
+
+ user_info_hash
+ end
+
+ private
+ def set_session!(user_info_hash)
+
+ response = nil
+
+ if user_info_hash["sso_token"]
+ response = make_session_request(user_info_hash["sso_token"])
+ else
+ response = make_session_request(nil)
+ end
+
+ if response.kind_of?(Net::HTTPSuccess) && response.body
+ doc = Nokogiri::XML(response.body)
+ user_info_hash["sso_token"] = doc.xpath('//token/text()').to_s
+ else
+ OmniAuth.logger.send(:warn, "(crowd) [set_session!] response code: #{response.code.to_s}")
+ OmniAuth.logger.send(:warn, "(crowd) [set_session!] response body: #{response.body}")
+ end
+
+ user_info_hash
+ end
+
+ def add_user_groups!(user_info_hash)
+ response = make_user_group_request(user_info_hash['user'])
+ unless response.code.to_i != 200 || response.body.nil? || response.body == ''
+ doc = Nokogiri::XML(response.body)
+ user_info_hash["groups"] = doc.xpath("//groups/group/@name").map(&:to_s)
+ end
+ user_info_hash
+ end
+
+ def retrieve_user_info!
+ response = make_authorization_request
+
+ unless response === nil
+ unless response.code.to_i != 200 || response.body.nil? || response.body == ''
+
+ doc = Nokogiri::XML(response.body)
+ result = {
+ "user" => doc.xpath("//user/@name").to_s,
+ "name" => doc.xpath("//user/display-name/text()").to_s,
+ "first_name" => doc.xpath("//user/first-name/text()").to_s,
+ "last_name" => doc.xpath("//user/last-name/text()").to_s,
+ "email" => doc.xpath("//user/email/text()").to_s
+ }
+
+ if doc.at_xpath("//token")
+ result["sso_token"] = doc.xpath("//token/text()").to_s
+ end
+
+ result
+
+ else
+ OmniAuth.logger.send(:warn, "(crowd) [retrieve_user_info!] response code: #{response.code.to_s}")
+ OmniAuth.logger.send(:warn, "(crowd) [retrieve_user_info!] response body: #{response.body}")
+ nil
+ end
+ else
+ OmniAuth.logger.send(:warn, "(crowd) [retrieve_user_info!] None of the session tokens were valid")
+ nil
+ end
+ end
+
+ def make_request(uri, body=nil)
+ http_method = body.nil? ? Net::HTTP::Get : Net::HTTP::Post
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = uri.port == 443 || uri.instance_of?(URI::HTTPS)
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl? && @configuration.disable_ssl_verification?
+ http.start do |c|
+ req = http_method.new(uri.query.nil? ? uri.path : "#{uri.path}?#{uri.query}")
+ req.body = body if body
+ req.basic_auth @configuration.crowd_application_name, @configuration.crowd_password
+ if @configuration.content_type
+ req.add_field 'Content-Type', @configuration.content_type
+ end
+ http.request(req)
+ end
+ end
+
+ def make_user_group_request(username)
+ make_request(URI.parse(@configuration.user_group_url(username)))
+ end
+
+ def make_authorization_request
+
+ if @configuration.use_sessions? && @tokens.kind_of?(Array)
+ make_session_retrieval_request
+ else
+ make_request(@authentiction_uri, make_authentication_request_body(@password))
+ end
+ end
+
+ def make_session_request(token)
+
+ root = url = validation_factor = nil
+ doc = Nokogiri::XML::Document.new
+
+ if token === nil
+
+ url = @session_uri
+ root = doc.create_element('authentication-context')
+
+ doc.root = root
+ root.add_child(doc.create_element('username', @username))
+ root.add_child(doc.create_element('password', @password))
+
+ else
+ url = URI.parse(@session_uri.to_s() + "/#{token}")
+ end
+
+ if @configuration.use_sessions? || @client_ip
+
+ if root === nil
+ root = doc.create_element('validation-factors')
+ doc.root = root
+ else
+ root.add_child(doc.create_element('validation-factors'))
+ end
+
+ validation_factor = doc.create_element('validation-factor')
+ validation_factor.add_child(doc.create_element('name', 'remote_address'))
+ validation_factor.add_child(doc.create_element('value', @client_ip))
+
+ doc.xpath('//validation-factors').first.add_child(validation_factor)
+
+ end
+
+ make_request(url, doc.to_s)
+
+ end
+
+ # create the body using Nokogiri so proper encoding of passwords can be ensured
+ def make_authentication_request_body(password)
+ request_body = Nokogiri::XML(AUTHENTICATION_REQUEST_BODY)
+ password_value = request_body.at_css "value"
+ password_value.content = password
+ return request_body.root.to_s # return the body without the xml header
+ end
+
+ def make_session_retrieval_request
+
+ response = nil
+
+ @tokens.any? { |token|
+ response = make_request(URI.parse(@session_uri.to_s() + "/#{token}"))
+ response.code.to_i == 200 && !response.body.nil? && response.body != ''
+ }
+
+ response
+
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/omniauth_crowd/lib/omniauth_crowd.rb b/vendor/gems/omniauth_crowd/lib/omniauth_crowd.rb
new file mode 100644
index 00000000000..56cf75c4e36
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/lib/omniauth_crowd.rb
@@ -0,0 +1 @@
+require 'omniauth/strategies/crowd' \ No newline at end of file
diff --git a/vendor/gems/omniauth_crowd/lib/omniauth_crowd/version.rb b/vendor/gems/omniauth_crowd/lib/omniauth_crowd/version.rb
new file mode 100644
index 00000000000..378fb1c9e69
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/lib/omniauth_crowd/version.rb
@@ -0,0 +1,5 @@
+module OmniAuth
+ module Crowd
+ VERSION = "2.4.0"
+ end
+end
diff --git a/vendor/gems/omniauth_crowd/omniauth_crowd.gemspec b/vendor/gems/omniauth_crowd/omniauth_crowd.gemspec
new file mode 100644
index 00000000000..4963c5fef1b
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/omniauth_crowd.gemspec
@@ -0,0 +1,28 @@
+# -*- encoding: utf-8 -*-
+require File.expand_path('../lib/omniauth_crowd/version', __FILE__)
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+
+Gem::Specification.new do |gem|
+ gem.authors = ["Robert Di Marco"]
+ gem.email = ["rob@innovationontherun.com"]
+ gem.description = "This is an OmniAuth provider for Atlassian Crowd's REST API. It allows you to easily integrate your Rack application in with Atlassian Crowd."
+ gem.summary = "An OmniAuth provider for Atlassian Crowd REST API"
+ gem.homepage = "http://github.com/robdimarco/omniauth_crowd"
+ gem.files = Dir.glob("lib/**/*.*")
+ gem.test_files = Dir.glob("spec/**/**/*.*")
+ gem.name = "omniauth_crowd"
+ gem.require_paths = ["lib"]
+ gem.version = OmniAuth::Crowd::VERSION
+
+ gem.add_runtime_dependency 'omniauth', '~> 1.0', '< 3'
+ gem.add_runtime_dependency 'nokogiri', '>= 1.4.4'
+ gem.add_runtime_dependency 'activesupport', '>= 0'
+ gem.add_development_dependency(%q<rack>, [">= 0"])
+ gem.add_development_dependency(%q<rake>, [">= 0"])
+ gem.add_development_dependency(%q<rack-test>, [">= 0"])
+ gem.add_development_dependency(%q<rexml>, ["~> 3.2.5"])
+ gem.add_development_dependency(%q<rspec>, ["~> 3.0.0"])
+ gem.add_development_dependency(%q<webmock>, ["~> 3.0.0"])
+ gem.add_development_dependency(%q<bundler>, ["> 1.0.0"])
+end
diff --git a/vendor/gems/omniauth_crowd/spec/fixtures/groups.xml b/vendor/gems/omniauth_crowd/spec/fixtures/groups.xml
new file mode 100644
index 00000000000..dd71a00436d
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/spec/fixtures/groups.xml
@@ -0,0 +1,8 @@
+<groups expand="group">
+<group name="Developers">
+<link rel="self" href="http://crowd.bogus.com/crowd/rest/usermanagement/latest/group?groupname=Developers"/>
+</group>
+<group name="jira-users">
+<link rel="self" href="http://crowd.bogus.com/crowd/rest/usermanagement/latest/group?groupname=jira-users"/>
+</group>
+</groups> \ No newline at end of file
diff --git a/vendor/gems/omniauth_crowd/spec/fixtures/session.xml b/vendor/gems/omniauth_crowd/spec/fixtures/session.xml
new file mode 100644
index 00000000000..42719d25f3f
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/spec/fixtures/session.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<session expand="user">
+ <token>rtk8eMvqq00EiGn5iJCMZQ00</token>
+ <user name="foo">
+ <link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user?username=foo"/>
+ </user>
+ <link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/session/rtk8eMvqq00EiGn5iJCMZQ00"/>
+</session> \ No newline at end of file
diff --git a/vendor/gems/omniauth_crowd/spec/fixtures/success.xml b/vendor/gems/omniauth_crowd/spec/fixtures/success.xml
new file mode 100644
index 00000000000..a2324ab6b40
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/spec/fixtures/success.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<user name="foo" expand="attributes">
+ <link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user?username=foo"/>
+ <first-name>Foo</first-name>
+ <last-name>Foobaz</last-name>
+ <display-name>Foo Foobaz</display-name>
+ <email>foo@example.org</email>
+ <password><link rel="edit" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user/password?username=foo"/></password>
+ <active>true</active>
+ <attributes><link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user/attribute?username=foo"/></attributes>
+</user>
diff --git a/vendor/gems/omniauth_crowd/spec/omniauth/strategies/crowd_spec.rb b/vendor/gems/omniauth_crowd/spec/omniauth/strategies/crowd_spec.rb
new file mode 100755
index 00000000000..f234ef82e76
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/spec/omniauth/strategies/crowd_spec.rb
@@ -0,0 +1,387 @@
+require 'spec_helper'
+
+describe OmniAuth::Strategies::Crowd, :type=>:strategy do
+ include OmniAuth::Test::StrategyTestCase
+ def strategy
+ @crowd_server_url ||= 'https://crowd.example.org'
+ @application_name ||= 'bogus_app'
+ @application_password ||= 'bogus_app_password'
+ [OmniAuth::Strategies::Crowd, {:crowd_server_url => @crowd_server_url,
+ :application_name => @application_name,
+ :application_password => @application_password,
+ :use_sessions => @using_sessions,
+ :sso_url => @sso_url,
+ :sso_url_image => @sso_url_image
+ }]
+ end
+
+ @using_sessions = false
+ @sso_url = nil
+ @sso_url_image = nil
+ let(:config) { OmniAuth::Strategies::Crowd::Configuration.new(strategy[1]) }
+ let(:validator) { OmniAuth::Strategies::Crowd::CrowdValidator.new(config, 'foo', 'bar', nil, nil) }
+
+ describe 'Authentication Request Body' do
+
+ it 'should send password in session request' do
+ body = <<-BODY.strip
+<password>
+ <value>bar</value>
+</password>
+BODY
+ expect(validator.send(:make_authentication_request_body, 'bar')).to eq(body)
+ end
+
+ it 'should escape special characters username and password in session request' do
+ body = <<-BODY.strip
+<password>
+ <value>bar&lt;</value>
+</password>
+BODY
+ expect(validator.send(:make_authentication_request_body, 'bar<')).to eq(body)
+ end
+ end
+
+ describe 'GET /auth/crowd' do
+ it 'should show the login form' do
+ get '/auth/crowd'
+ expect(last_response).to be_ok
+ end
+ end
+
+ describe 'POST /auth/crowd' do
+ it 'should redirect to callback' do
+ post '/auth/crowd', :username=>'foo', :password=>'bar'
+ expect(last_response).to be_redirect
+ expect(last_response.headers['Location']).to eq('http://example.org/auth/crowd/callback')
+ end
+ end
+
+ describe 'GET /auth/crowd/callback without any credentials' do
+ it 'should fail' do
+ get '/auth/crowd/callback'
+ expect(last_response).to be_redirect
+ expect(last_response.headers['Location']).to match(/no_credentials/)
+ end
+ end
+
+ describe 'GET /auth/crowd/callback with credentials can be successful' do
+ context "when using authentication endpoint" do
+ before do
+ stub_request(:post, "https://crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
+ to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'success.xml')))
+
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").
+ to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
+
+ #Adding this to prevent Content-Type text/xml from being added back in the future
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").with(:headers => {"Content-Type" => "text/xml"}).
+ to_return(:status => [415, "Unsupported Media Type"])
+ get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
+ end
+ it 'should call through to the master app' do
+ expect(last_response.body).to eq('true')
+ end
+ it 'should have an auth hash' do
+ auth = last_request.env['omniauth.auth']
+ expect(auth).to be_kind_of(Hash)
+ end
+ it 'should have good data' do
+ auth = last_request.env['omniauth.auth']
+ expect(auth['provider']).to eq(:crowd)
+ expect(auth['uid']).to eq('foo')
+ expect(auth['info']).to be_kind_of(Hash)
+ expect(auth['info']['groups'].sort).to eq(["Developers", "jira-users"].sort)
+ end
+ end
+
+ describe "when using session endpoint" do
+ before do
+ @using_sessions = true
+ stub_request(:post, "https://crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
+ to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'success.xml')))
+ stub_request(:post, "https://crowd.example.org/rest/usermanagement/latest/session").
+ to_return(:status => 201, :body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'session.xml')))
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").
+ to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
+ end
+
+ after { @using_sessions = false }
+
+ it 'should call through to the master app' do
+ get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
+ expect(last_response.body).to eq('true')
+ end
+
+ it 'should have an auth hash' do
+ get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
+ expect(last_request.env['omniauth.auth']).to be_kind_of(Hash)
+ end
+
+ it 'should have good data' do
+ get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
+ auth = last_request.env['omniauth.auth']
+ expect(auth['provider']).to eq(:crowd)
+ expect(auth['uid']).to eq('foo')
+ expect(auth['info']).to be_kind_of(Hash)
+ expect(auth['info']['sso_token']).to eq('rtk8eMvqq00EiGn5iJCMZQ00')
+ expect(auth['info']['groups'].sort).to eq(["Developers", "jira-users"].sort)
+ end
+ end
+ end
+
+ describe 'GET /auth/crowd/callback with credentials will fail' do
+ before do
+ stub_request(:post, "https://crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
+ to_return(:status=>400)
+ get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
+ end
+ it 'should fail' do
+ expect(last_response).to be_redirect
+ expect(last_response.headers['Location']).to match(/invalid_credentials/)
+ end
+ end
+
+ describe 'GET /auth/crowd without credentials will redirect to login form' do
+
+ sso_url = 'https://foo.bar'
+
+ before do
+ @using_sessions = true
+ @sso_url = sso_url
+ end
+
+ it 'should have the SSO button in the response body' do
+
+ found_legend = found_anchor = nil
+
+ get '/auth/crowd'
+
+ Nokogiri::HTML(last_response.body).xpath('//html/body/form/fieldset/*').each do |element|
+
+ if element.name === 'legend' && element.content() === 'SSO'
+ found_legend = true
+ elsif element.name === 'a' && element.attr('href') === "#{sso_url}/users/auth/crowd/callback"
+ found_anchor = true
+ end
+ end
+
+ expect(found_legend).to(be(true))
+ expect(found_anchor).to(be(true))
+
+ end
+
+ after do
+ @using_sessions = false
+ @sso_url = nil
+ end
+
+ end
+
+ describe 'GET /auth/crowd without credentials will redirect to login form which has custom image in the SSO link' do
+
+ sso_url = 'https://foo.bar'
+ sso_url_image = 'https://foo.bar/image.png'
+
+ before do
+ @using_sessions = true
+ @sso_url = sso_url
+ @sso_url_image = 'https://foo.bar/image.png'
+ end
+
+ it 'should have the SSO button with a custom image in the response body' do
+
+ found_legend = found_anchor = found_image = false
+
+ get '/auth/crowd'
+
+ Nokogiri::HTML(last_response.body).xpath('//html/body/form/fieldset/*').each do |element|
+
+ if element.name === 'legend' && element.content() === 'SSO'
+ found_legend = true
+ elsif element.name === 'a' && element.attr('href') === "#{sso_url}/users/auth/crowd/callback"
+
+ found_anchor = true
+
+ if element.children.length === 1 && element.children.first.name === 'img' && element.children.first.attr('src') === sso_url_image
+ found_image = true
+ end
+
+ end
+ end
+
+ expect(found_legend).to(be(true))
+ expect(found_anchor).to(be(true))
+ expect(found_image).to(be(true))
+
+ end
+
+ after do
+ @using_sessions = false
+ @sso_url = nil
+ @sso_url_image = nil
+ end
+
+ end
+
+ describe 'GET /auth/crowd without credentials but with SSO cookie will redirect to callback' do
+
+ sso_url = 'https://foo.bar'
+
+ before do
+
+ @using_sessions = true
+ @sso_url = sso_url
+
+ set_cookie('crowd.token_key=foobar')
+
+ end
+
+ it 'should redirect to callback' do
+ get '/auth/crowd'
+ expect(last_response).to be_redirect
+ expect(last_response.headers['Location']).to eq('http://example.org/auth/crowd/callback')
+ end
+
+ after do
+
+ @using_sessions = false
+ @sso_url = nil
+
+ clear_cookies()
+
+ end
+
+ end
+
+ describe 'POST /auth/crowd/callback without credentials but with SSO cookie will redirect to login form because session is invalid' do
+
+ sso_url = 'https://foo.bar'
+ token = 'foobar'
+
+ before do
+
+ @using_sessions = true
+ @sso_url = sso_url
+
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/session/#{token}").
+ to_return(:status => [404])
+
+ set_cookie("crowd.token_key=#{token}")
+
+ end
+
+ it 'should redirect to login form' do
+ post '/auth/crowd/callback'
+ expect(last_response).to be_redirect
+ expect(last_response.headers['Location']).to match(/invalid_credentials/)
+ end
+
+ after do
+
+ @using_sessions = false
+ @sso_url = nil
+
+ clear_cookies()
+
+ end
+
+ end
+
+ describe 'GET /auth/crowd/callback without credentials but with SSO cookie will succeed' do
+
+ sso_url = 'https://foo.bar'
+ token = 'rtk8eMvqq00EiGn5iJCMZQ00'
+
+ before do
+
+ @using_sessions = true
+ @sso_url = sso_url
+
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/session/#{token}").
+ to_return(:status => 200, :body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'session.xml')))
+ stub_request(:post, "https://crowd.example.org/rest/usermanagement/latest/session/#{token}").
+ to_return(:status => 200)
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").
+ to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
+
+ set_cookie("crowd.token_key=#{token}")
+
+ end
+
+ it 'should return user data' do
+
+ auth = nil
+
+ get '/auth/crowd/callback'
+
+ auth = last_request.env['omniauth.auth']
+
+ expect(auth['provider']).to eq(:crowd)
+ expect(auth['uid']).to eq('foo')
+ expect(auth['info']).to be_kind_of(Hash)
+ expect(auth['info']['groups'].sort).to eq(["Developers", "jira-users"].sort)
+
+ end
+
+ after do
+
+ @using_sessions = false
+ @sso_url = nil
+
+ clear_cookies()
+
+ end
+
+ end
+
+ describe 'GET /auth/crowd/callback without credentials but with multiple SSO cookies will succeed because one of them is valid' do
+
+ sso_url = 'https://foo.bar'
+
+ before do
+
+ @using_sessions = true
+ @sso_url = sso_url
+
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/session/foo").
+ to_return(:status => 404)
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/session/fubar").
+ to_return(:status => 404)
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/session/rtk8eMvqq00EiGn5iJCMZQ00").
+ to_return(:status => 200, :body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'session.xml')))
+ stub_request(:post, "https://crowd.example.org/rest/usermanagement/latest/session/rtk8eMvqq00EiGn5iJCMZQ00").
+ to_return(:status => 200)
+ stub_request(:get, "https://crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").
+ to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
+
+ header('Cookie', "crowd.token_key=foo;crowd.token_key=rtk8eMvqq00EiGn5iJCMZQ00;crowd.token_key=fubar")
+
+ end
+
+ it 'should return user data' do
+
+ auth = nil
+
+ get '/auth/crowd/callback'
+
+ auth = last_request.env['omniauth.auth']
+
+ expect(auth['provider']).to eq(:crowd)
+ expect(auth['uid']).to eq('foo')
+ expect(auth['info']).to be_kind_of(Hash)
+ expect(auth['info']['groups'].sort).to eq(["Developers", "jira-users"].sort)
+
+ end
+
+ after do
+
+ @using_sessions = false
+ @sso_url = nil
+
+ header('Cookie', nil)
+
+ end
+
+ end
+end
diff --git a/vendor/gems/omniauth_crowd/spec/spec_helper.rb b/vendor/gems/omniauth_crowd/spec/spec_helper.rb
new file mode 100644
index 00000000000..13683c95062
--- /dev/null
+++ b/vendor/gems/omniauth_crowd/spec/spec_helper.rb
@@ -0,0 +1,14 @@
+require 'bundler/setup'
+Bundler.setup
+require 'rack/test'
+require 'webmock'
+require 'webmock/rspec'
+require 'nokogiri'
+
+require 'omniauth_crowd'
+RSpec.configure do |config|
+ WebMock.disable_net_connect!
+ config.include Rack::Test::Methods
+ config.raise_errors_for_deprecations!
+end
+
diff --git a/vendor/project_templates/gatsby.tar.gz b/vendor/project_templates/gatsby.tar.gz
index 52bb056630e..1c0e413b2ec 100644
--- a/vendor/project_templates/gatsby.tar.gz
+++ b/vendor/project_templates/gatsby.tar.gz
Binary files differ
diff --git a/vendor/project_templates/rails.tar.gz b/vendor/project_templates/rails.tar.gz
index 357a049da44..17706a67dd0 100644
--- a/vendor/project_templates/rails.tar.gz
+++ b/vendor/project_templates/rails.tar.gz
Binary files differ
diff --git a/workhorse/gitaly_integration_test.go b/workhorse/gitaly_integration_test.go
index b6842808480..d578ae50765 100644
--- a/workhorse/gitaly_integration_test.go
+++ b/workhorse/gitaly_integration_test.go
@@ -17,7 +17,7 @@ import (
"testing"
"github.com/stretchr/testify/require"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
diff --git a/workhorse/gitaly_test.go b/workhorse/gitaly_test.go
index 838e5ecb2fd..234a11e5dc9 100644
--- a/workhorse/gitaly_test.go
+++ b/workhorse/gitaly_test.go
@@ -23,7 +23,7 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/git"
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 0e102180cb6..10a0b13b50e 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -4,39 +4,39 @@ go 1.17
require (
github.com/Azure/azure-storage-blob-go v0.14.0
- github.com/BurntSushi/toml v0.3.1
- github.com/FZambia/sentinel v1.0.0
- github.com/alecthomas/chroma v0.10.0
+ github.com/BurntSushi/toml v1.1.0
+ github.com/FZambia/sentinel v1.1.0
+ github.com/alecthomas/chroma/v2 v2.2.0
github.com/aws/aws-sdk-go v1.43.31
github.com/disintegration/imaging v1.6.2
github.com/getsentry/raven-go v0.2.0
- github.com/golang-jwt/jwt/v4 v4.4.1
- github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721
+ github.com/golang-jwt/jwt/v4 v4.4.2
+ github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f
github.com/golang/protobuf v1.5.2
github.com/gomodule/redigo v2.0.0+incompatible
- github.com/gorilla/websocket v1.4.1
+ github.com/gorilla/websocket v1.5.0
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
- github.com/johannesboyne/gofakes3 v0.0.0-20200510090907-02d71f533bec
+ github.com/johannesboyne/gofakes3 v0.0.0-20220627085814-c3ac35da23b2
github.com/jpillora/backoff v1.0.0
- github.com/mitchellh/copystructure v1.0.0
- github.com/prometheus/client_golang v1.12.1
- github.com/rafaeljusto/redigomock v0.0.0-20190202135759-257e089e14a1
+ github.com/mitchellh/copystructure v1.2.0
+ github.com/prometheus/client_golang v1.12.2
+ github.com/rafaeljusto/redigomock/v3 v3.1.1
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a
github.com/sirupsen/logrus v1.8.1
- github.com/smartystreets/goconvey v1.6.4
- github.com/stretchr/testify v1.7.0
- gitlab.com/gitlab-org/gitaly/v14 v14.10.0-rc1.0.20220426135705-ccfab390f7c3
+ github.com/smartystreets/goconvey v1.7.2
+ github.com/stretchr/testify v1.8.0
+ gitlab.com/gitlab-org/gitaly/v15 v15.1.2
gitlab.com/gitlab-org/golang-archive-zip v0.1.1
- gitlab.com/gitlab-org/labkit v1.15.0
+ gitlab.com/gitlab-org/labkit v1.16.0
gocloud.dev v0.25.0
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
- golang.org/x/net v0.0.0-20220401154927-543a649e0bdd
- golang.org/x/tools v0.1.5
+ golang.org/x/net v0.0.0-20220531201128-c960675eff93
+ golang.org/x/tools v0.1.11
google.golang.org/grpc v1.45.0
google.golang.org/protobuf v1.28.0
- honnef.co/go/tools v0.1.3
+ honnef.co/go/tools v0.3.2
)
require (
@@ -81,7 +81,7 @@ require (
github.com/lightstep/lightstep-tracer-go v0.25.0 // indirect
github.com/mattn/go-ieproxy v0.0.6 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
- github.com/mitchellh/reflectwalk v1.0.0 // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/oklog/ulid/v2 v2.0.2 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/philhofer/fwd v1.1.1 // indirect
@@ -93,7 +93,7 @@ require (
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect
github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 // indirect
github.com/shirou/gopsutil/v3 v3.21.2 // indirect
- github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect
+ github.com/smartystreets/assertions v1.2.0 // indirect
github.com/tinylib/msgp v1.1.2 // indirect
github.com/tklauser/go-sysconf v0.3.4 // indirect
github.com/tklauser/numcpus v0.2.1 // indirect
@@ -101,17 +101,18 @@ require (
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
go.opencensus.io v0.23.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
- golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
- golang.org/x/mod v0.5.0 // indirect
+ golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
+ golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect
+ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a // indirect
- golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
- golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f // indirect
+ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
+ golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 // indirect
golang.org/x/text v0.3.7 // indirect
- golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect
+ golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/api v0.74.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de // indirect
gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 // indirect
- gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/workhorse/go.sum b/workhorse/go.sum
index 61f11579d18..ec1ee3eac11 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -1,5 +1,6 @@
bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg=
+cloud.google.com/go v0.16.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -142,8 +143,10 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
+github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw=
github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno=
@@ -154,8 +157,8 @@ github.com/DataDog/datadog-go v4.4.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3
github.com/DataDog/gostackparse v0.5.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM=
github.com/DataDog/sketches-go v1.0.0 h1:chm5KSXO7kO+ywGWJ0Zs6tdmWU8PBXSbywFVciL6BG4=
github.com/DataDog/sketches-go v1.0.0/go.mod h1:O+XkJHWk9w4hDwY2ZUDU31ZC9sNYlYo8DiFsxjYeo1k=
-github.com/FZambia/sentinel v1.0.0 h1:KJ0ryjKTZk5WMp0dXvSdNqp3lFaW1fNFuEYfrkLOYIc=
-github.com/FZambia/sentinel v1.0.0/go.mod h1:ytL1Am/RLlAoAXG6Kj5LNuw/TRRQrv2rt2FT26vP5gI=
+github.com/FZambia/sentinel v1.1.0 h1:qrCBfxc8SvJihYNjBWgwUI93ZCvFe/PJIPTHKmlp8a8=
+github.com/FZambia/sentinel v1.1.0/go.mod h1:ytL1Am/RLlAoAXG6Kj5LNuw/TRRQrv2rt2FT26vP5gI=
github.com/GoogleCloudPlatform/cloudsql-proxy v1.22.0/go.mod h1:mAm5O/zik2RFmcpigNjg6nMotDL8ZXJaxKzgGVcSMFA=
github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8=
github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
@@ -181,14 +184,17 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
-github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek=
-github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
+github.com/alecthomas/chroma/v2 v2.2.0 h1:Aten8jfQwUqEdadVFFjNyjx7HTexhKP0XuqBG67mRDY=
+github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
+github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae h1:zzGwJfFlFGD94CyyYwCJeSuD32Gj9GTaSi5y9hoVzdY=
+github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/alexbrainman/sspi v0.0.0-20180125232955-4729b3d4d858/go.mod h1:976q2ETgjT2snVCf2ZaBnyBbVoPERGjUz+0sofzEfro=
+github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
@@ -200,6 +206,7 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
github.com/avast/retry-go v2.4.2+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
+github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
github.com/aws/aws-sdk-go v1.17.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
@@ -258,7 +265,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
+github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -334,6 +341,8 @@ github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dpotapov/go-spnego v0.0.0-20190506202455-c2c609116ad0/go.mod h1:P4f4MSk7h52F2PK0lCapn5+fu47Uf8aRdxDSqgezxZE=
+github.com/dpotapov/go-spnego v0.0.0-20210315154721-298b63a54430/go.mod h1:AVSs/gZKt1bOd2AhkhbS7Qh56Hv7klde22yXVbwYJhc=
+github.com/dpotapov/go-spnego v0.0.0-20220426193508-b7f82e4507db/go.mod h1:AVSs/gZKt1bOd2AhkhbS7Qh56Hv7klde22yXVbwYJhc=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
@@ -364,9 +373,11 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
+github.com/fsnotify/fsnotify v1.4.3-0.20170329110642-4da3e2cfbabc/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
+github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc=
github.com/getsentry/raven-go v0.1.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
github.com/getsentry/raven-go v0.1.2/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
@@ -384,9 +395,14 @@ github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwv
github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
github.com/git-lfs/git-lfs v1.5.1-0.20210304194248-2e1d981afbe3/go.mod h1:8Xqs4mqL7o6xEnaXckIgELARTeK7RYtm3pBab7S79Js=
+github.com/git-lfs/git-lfs/v3 v3.2.0/go.mod h1:GZZO3jw2Yn3/1KFV4nRoXUzH+yPzGypIdTeQpkzxEvQ=
github.com/git-lfs/gitobj/v2 v2.0.1/go.mod h1:q6aqxl6Uu3gWsip5GEKpw+7459F97er8COmU45ncAxw=
+github.com/git-lfs/gitobj/v2 v2.1.0/go.mod h1:q6aqxl6Uu3gWsip5GEKpw+7459F97er8COmU45ncAxw=
github.com/git-lfs/go-netrc v0.0.0-20180525200031-e0e9ca483a18/go.mod h1:70O4NAtvWn1jW8V8V+OKrJJYcxDLTmIozfi2fmSz5SI=
+github.com/git-lfs/go-netrc v0.0.0-20210914205454-f0c862dd687a/go.mod h1:70O4NAtvWn1jW8V8V+OKrJJYcxDLTmIozfi2fmSz5SI=
+github.com/git-lfs/pktline v0.0.0-20210330133718-06e9096e2825/go.mod h1:fenKRzpXDjNpsIBhuhUzvjCKlDjKam0boRAenTE0Q6A=
github.com/git-lfs/wildmatch v1.0.4/go.mod h1:SdHAGnApDpnFYQ0vAxbniWR0sn7yLJ3QXo9RRfhn2ew=
+github.com/git-lfs/wildmatch/v2 v2.0.1/go.mod h1:EVqonpk9mXbREP3N8UkwoWdrF249uHpCUo5CPXY81gw=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
github.com/go-enry/go-license-detector/v4 v4.3.0/go.mod h1:HaM4wdNxSlz/9Gw0uVOKSQS5JVFqf2Pk8xUPEn6bldI=
@@ -420,6 +436,7 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w=
@@ -442,13 +459,14 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
-github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ=
github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
+github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
-github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 h1:KRMr9A3qfbVM7iV/WcLY/rL5LICqwMHLhwRXKu99fXw=
-github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4=
+github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f h1:16RtHeWGkJMc80Etb8RPCcKevXGldr57+LOyZt8zOlg=
+github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f/go.mod h1:ijRvpgDJDI262hYq/IQVYgf8hd8IHUs93Ol0kvMBAx4=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -456,6 +474,7 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/lint v0.0.0-20170918230701-e5d664eb928e/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
@@ -485,13 +504,16 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/gomodule/redigo v1.8.8/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -554,6 +576,8 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
+github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU=
+github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
@@ -565,10 +589,14 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gregjones/httpcache v0.0.0-20170920190843-316c5e0ff04e/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.2.3-0.20210213123510-be4c235f9d1c/go.mod h1:RXwzibsL7UhPcEmGyGvXKJ8kyJsOCOEaLgGce4igMFs=
@@ -592,11 +620,14 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
@@ -613,6 +644,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=
+github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI=
@@ -664,8 +696,13 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv
github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
+github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
+github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
+github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
+github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
+github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
github.com/jdkato/prose v1.1.0/go.mod h1:jkF0lkxaX5PFSlk9l4Gh9Y+T57TqUZziWT7uZbW5ADg=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
@@ -675,8 +712,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
-github.com/johannesboyne/gofakes3 v0.0.0-20200510090907-02d71f533bec h1:jEZFmuFe51KdrceqM4NL3dJiuog0zojzcN/VculG26o=
-github.com/johannesboyne/gofakes3 v0.0.0-20200510090907-02d71f533bec/go.mod h1:fNiSoOiEI5KlkWXn26OwKnNe58ilTIkpBlgOrt7Olu8=
+github.com/johannesboyne/gofakes3 v0.0.0-20220627085814-c3ac35da23b2 h1:V5q1Mx2WTE5coXLG2QpkRZ7LsJvgkedm6Ib4AwC1Lfg=
+github.com/johannesboyne/gofakes3 v0.0.0-20220627085814-c3ac35da23b2/go.mod h1:LIAXxPvcUXwOcTIj9LSNSUpE9/eMHalTWxsP/kmWxQI=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
@@ -728,6 +765,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -740,6 +778,7 @@ github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvf
github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/leonelquinteros/gotext v1.5.0/go.mod h1:OCiUVHuhP9LGFBQ1oAmdtNCHJCiHiQA8lf4nAifHkr0=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -760,8 +799,10 @@ github.com/lightstep/lightstep-tracer-go v0.24.0/go.mod h1:RnONwHKg89zYPmF+Uig5P
github.com/lightstep/lightstep-tracer-go v0.25.0 h1:sGVnz8h3jTQuHKMbUe2949nXm3Sg09N1UcR3VoQNN5E=
github.com/lightstep/lightstep-tracer-go v0.25.0/go.mod h1:G1ZAEaqTHFPWpWunnbUn1ADEY/Jvzz7jIOaXwAfD6A8=
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
+github.com/magiconair/properties v1.7.4-0.20170902060319-8d7837e64d3c/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.0.10-0.20170816031813-ad5389df28cd/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
@@ -771,6 +812,7 @@ github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/
github.com/mattn/go-ieproxy v0.0.3/go.mod h1:6ZpRmhBaYuBX1U2za+9rC9iCGLsSp2tftelZne7CPko=
github.com/mattn/go-ieproxy v0.0.6 h1:tVDlituRyeHMMkHpGpUu8CJG+hxPMwbYCkIUK2PUCbo=
github.com/mattn/go-ieproxy v0.0.6/go.mod h1:6ZpRmhBaYuBX1U2za+9rC9iCGLsSp2tftelZne7CPko=
+github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
@@ -781,6 +823,7 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-shellwords v0.0.0-20190425161501-2444a32a19f4/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@@ -794,8 +837,8 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
-github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -803,12 +846,13 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v0.0.0-20170523030023-d0303fe80992/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
-github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
@@ -837,6 +881,7 @@ github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOE
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/olekukonko/ts v0.0.0-20171002115256-78ecb04241c0/go.mod h1:F/7q8/HZz+TXjlsoZQQKVYvXTZaFH4QRa3y+j1p7MS0=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -868,6 +913,7 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
@@ -895,8 +941,9 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU=
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -920,8 +967,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/rafaeljusto/redigomock v0.0.0-20190202135759-257e089e14a1 h1:+kGqA4dNN5hn7WwvKdzHl0rdN5AEkbNZd0VjRltAiZg=
-github.com/rafaeljusto/redigomock v0.0.0-20190202135759-257e089e14a1/go.mod h1:JaY6n2sDr+z2WTsXkOmNRUfDy6FN0L6Nk7x06ndm4tY=
+github.com/rafaeljusto/redigomock/v3 v3.1.1 h1:SdWE9v+SPy3x6G5hS3aofIJgHJY3OdBJ0BdUTk4dYbA=
+github.com/rafaeljusto/redigomock/v3 v3.1.1/go.mod h1:F9zPqz8rMriScZkPtUiLJoLruYcpGo/XXREpeyasREM=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
@@ -969,22 +1016,29 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
+github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
+github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v0.0.0-20170901052352-ee1bd8ee15a1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
+github.com/spf13/cast v1.1.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+github.com/spf13/jwalterweatherman v0.0.0-20170901151539-12bd96e66386/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.1-0.20170901120850-7aff26db30c1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/ssgelm/cookiejarparser v1.0.1/go.mod h1:DUfC0mpjIzlDN7DzKjXpHj0qMI5m9VrZuz3wSlI+OEI=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
@@ -992,16 +1046,19 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
@@ -1049,13 +1106,14 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
gitlab.com/gitlab-org/gitaly v1.68.0 h1:VlcJs1+PrhW7lqJUU7Fh1q8FMJujmbbivdfde/cwB98=
gitlab.com/gitlab-org/gitaly v1.68.0/go.mod h1:/pCsB918Zu5wFchZ9hLYin9WkJ2yQqdVNz0zlv5HbXg=
gitlab.com/gitlab-org/gitaly/v14 v14.0.0-rc1/go.mod h1:4Cz8tOAyueSZX5o6gYum1F/unupaOclxqETPcg4ODvQ=
-gitlab.com/gitlab-org/gitaly/v14 v14.10.0-rc1.0.20220426135705-ccfab390f7c3 h1:KH7aVyzByU4hqF0Eut/3oAJRkMzT+o0sQZOpYMFMmTk=
-gitlab.com/gitlab-org/gitaly/v14 v14.10.0-rc1.0.20220426135705-ccfab390f7c3/go.mod h1:XwFaJr9WBf9gxrZr78jgllYXyjTAmueaqkrnAmruhiE=
+gitlab.com/gitlab-org/gitaly/v15 v15.1.2 h1:6NcpZENpvV4ialIjtrPuxCFHLn6VOrE3mJ9rd/4DuzU=
+gitlab.com/gitlab-org/gitaly/v15 v15.1.2/go.mod h1:fZSeTXPLtbmTxNRk9AECM2shtJ6JNzIiLxAgknWBdT4=
gitlab.com/gitlab-org/gitlab-shell v1.9.8-0.20201117050822-3f9890ef73dc/go.mod h1:5QSTbpAHY2v0iIH5uHh2KA9w7sPUqPmnLjDApI/sv1U=
gitlab.com/gitlab-org/gitlab-shell v1.9.8-0.20210720163109-50da611814d2/go.mod h1:QWDYBwuy24qGMandtCngLRPzFgnGPg6LSNoJWPKmJMc=
gitlab.com/gitlab-org/golang-archive-zip v0.1.1 h1:35k9giivbxwF03+8A05Cm8YoxoakU8FBCj5gysjCTCE=
@@ -1064,10 +1122,11 @@ gitlab.com/gitlab-org/labkit v0.0.0-20190221122536-0c3fc7cdd57c/go.mod h1:rYhLgf
gitlab.com/gitlab-org/labkit v0.0.0-20200908084045-45895e129029/go.mod h1:SNfxkfUwVNECgtmluVayv0GWFgEjjBs5AzgsowPQuo0=
gitlab.com/gitlab-org/labkit v1.0.0/go.mod h1:nohrYTSLDnZix0ebXZrbZJjymRar8HeV2roWL5/jw2U=
gitlab.com/gitlab-org/labkit v1.4.1/go.mod h1:x5JO5uvdX4t6e/TZXLXZnFL5AcKz2uLLd3uKXZcuO4k=
-gitlab.com/gitlab-org/labkit v1.5.0/go.mod h1:1ZuVZpjSpCKUgjLx8P6jzkkQFxJI1thUKr6yKV3p0vY=
-gitlab.com/gitlab-org/labkit v1.15.0 h1:rMdhIdONc7bcd5qGRtWav6iInpeDmavDmP9A1tai92k=
-gitlab.com/gitlab-org/labkit v1.15.0/go.mod h1:bcxc4ZpAC+WyACgyKl7FcvT2XXAbl8CrzN6UY+w8cMc=
+gitlab.com/gitlab-org/labkit v1.14.0/go.mod h1:bcxc4ZpAC+WyACgyKl7FcvT2XXAbl8CrzN6UY+w8cMc=
+gitlab.com/gitlab-org/labkit v1.16.0 h1:Vm3NAMZ8RqAunXlvPWby3GJ2R35vsYGP6Uu0YjyMIlY=
+gitlab.com/gitlab-org/labkit v1.16.0/go.mod h1:bcxc4ZpAC+WyACgyKl7FcvT2XXAbl8CrzN6UY+w8cMc=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
@@ -1127,6 +1186,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
@@ -1135,8 +1195,10 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
+golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1150,7 +1212,10 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5 h1:FR+oGxGfbQu1d+jglI3rCkjAjUnhRSZcUxr+DqlDLNo=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
+golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e h1:qyrTQ++p1afMkO4DPEeLGq/3oTsdlvdH4vqZUBWzUKM=
+golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -1181,8 +1246,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q=
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1241,14 +1307,17 @@ golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220401154927-543a649e0bdd h1:zYlwaUHTmxuf6H7hwO2dgwqozQmH7zf4x+/qql4oVWc=
golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93 h1:MYimHLfoXEpOhqd/zgoA/uoXzHB86AEky4LAx5ij9xA=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1272,6 +1341,7 @@ golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM=
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1282,8 +1352,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8=
+golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1296,7 +1367,6 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1375,7 +1445,7 @@ golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211102192858-4dd72447c267/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1387,8 +1457,10 @@ golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f h1:rlezHXNlxYWvBCzNses9Dlc7nGFaNMJeqLolcmQSSZY=
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 h1:PgOr27OhUx2IRqGJ2RxAWI4dJQ7bi9cSrB82uzFzfUA=
+golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1402,6 +1474,7 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1409,8 +1482,9 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs=
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
+golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1458,6 +1532,7 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
@@ -1483,8 +1558,10 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
+golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=
+golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1497,6 +1574,7 @@ gonum.org/v1/gonum v0.7.0/go.mod h1:L02bwd0sqlsvRv41G7wGWFCsVNZFv/k1xzGIxeANHGM=
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
+google.golang.org/api v0.0.0-20170921000349-586095a6e407/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
@@ -1555,6 +1633,7 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20170918111702-1e559d0a00ee/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1648,6 +1727,7 @@ google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de h1:9Ti5SG2U4cAcluryUo/sFay3TQKoxiFMfaT0pbizU7k=
google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -1744,8 +1824,9 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1754,8 +1835,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o=
-honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
+honnef.co/go/tools v0.3.2 h1:ytYb4rOqyp1TSa2EPvNVwtPQJctSELKaMyLfqNP4+34=
+honnef.co/go/tools v0.3.2/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw=
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/workhorse/internal/api/api.go b/workhorse/internal/api/api.go
index a536435a587..aa6d7cf1bc7 100644
--- a/workhorse/internal/api/api.go
+++ b/workhorse/internal/api/api.go
@@ -14,7 +14,7 @@ import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
@@ -65,11 +65,13 @@ func NewAPI(myURL *url.URL, version string, roundTripper http.RoundTripper) *API
type GeoProxyEndpointResponse struct {
GeoProxyURL string `json:"geo_proxy_url"`
GeoProxyExtraData string `json:"geo_proxy_extra_data"`
+ GeoEnabled bool `json:"geo_enabled"`
}
type GeoProxyData struct {
GeoProxyURL *url.URL
GeoProxyExtraData string
+ GeoEnabled bool
}
type HandleFunc func(http.ResponseWriter, *http.Request, *Response)
@@ -109,7 +111,7 @@ type RemoteObject struct {
// ID is a unique identifier of object storage upload
ID string
// Timeout is a number that represents timeout in seconds for sending data to StoreURL
- Timeout int
+ Timeout float32
// MultipartUpload contains presigned URLs for S3 MultipartUpload
MultipartUpload *MultipartUploadParams
// Object storage config for Workhorse client
@@ -306,6 +308,7 @@ func (api *API) PreAuthorizeFixedPath(r *http.Request, method string, path strin
return nil, fmt.Errorf("construct auth request: %w", err)
}
authReq.Header = helper.HeaderClone(r.Header)
+ authReq.URL.RawQuery = r.URL.RawQuery
failureResponse, apiResponse, err := api.PreAuthorize(path, authReq)
if err != nil {
@@ -457,5 +460,6 @@ func (api *API) GetGeoProxyData() (*GeoProxyData, error) {
return &GeoProxyData{
GeoProxyURL: geoProxyURL,
GeoProxyExtraData: response.GeoProxyExtraData,
+ GeoEnabled: response.GeoEnabled,
}, nil
}
diff --git a/workhorse/internal/api/api_test.go b/workhorse/internal/api/api_test.go
index 346f32b4a36..e3457eb0f47 100644
--- a/workhorse/internal/api/api_test.go
+++ b/workhorse/internal/api/api_test.go
@@ -2,15 +2,15 @@ package api
import (
"fmt"
+ "io"
"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"
@@ -73,16 +73,39 @@ func testRailsServer(url *regexp.Regexp, code int, body string) *httptest.Server
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)
})
}
+
+func TestPreAuthorizeFixedPath(t *testing.T) {
+ var (
+ upstreamHeaders http.Header
+ upstreamQuery url.Values
+ )
+
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.URL.Path != "/my/api/path" {
+ return
+ }
+
+ upstreamHeaders = r.Header
+ upstreamQuery = r.URL.Query()
+ w.Header().Set("Content-Type", ResponseContentType)
+ io.WriteString(w, `{"TempPath":"HELLO!!"}`)
+ }))
+ defer ts.Close()
+
+ req, err := http.NewRequest("GET", "/original/request/path?q1=Q1&q2=Q2", nil)
+ require.NoError(t, err)
+ req.Header.Set("key1", "value1")
+
+ api := NewAPI(helper.URLMustParse(ts.URL), "123", http.DefaultTransport)
+ resp, err := api.PreAuthorizeFixedPath(req, "POST", "/my/api/path")
+ require.NoError(t, err)
+
+ require.Equal(t, "value1", upstreamHeaders.Get("key1"), "original headers must propagate")
+ require.Equal(t, url.Values{"q1": []string{"Q1"}, "q2": []string{"Q2"}}, upstreamQuery,
+ "original query must propagate")
+ require.Equal(t, "HELLO!!", resp.TempPath, "sanity check: successful API call")
+}
diff --git a/workhorse/internal/badgateway/embed/gitlab-logo-500.png b/workhorse/internal/badgateway/embed/gitlab-logo-500.png
new file mode 100644
index 00000000000..516f5bb27a1
--- /dev/null
+++ b/workhorse/internal/badgateway/embed/gitlab-logo-500.png
Binary files differ
diff --git a/workhorse/internal/badgateway/roundtripper.go b/workhorse/internal/badgateway/roundtripper.go
index 240a4ebc86b..cc982b092a7 100644
--- a/workhorse/internal/badgateway/roundtripper.go
+++ b/workhorse/internal/badgateway/roundtripper.go
@@ -2,6 +2,8 @@ package badgateway
import (
"bytes"
+ _ "embed"
+ "encoding/base64"
"fmt"
"html/template"
"io"
@@ -12,6 +14,9 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
)
+//go:embed embed/gitlab-logo-500.png
+var gitlabLogo []byte
+
// Error is a custom error for pretty Sentry 'issues'
type sentryError struct{ error }
@@ -68,9 +73,10 @@ func (t *roundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
func developmentModeResponse(err error) (body string, contentType string) {
data := TemplateData{
- Time: time.Now().Format("15:04:05"),
- Error: err.Error(),
- ReloadSeconds: 5,
+ Time: time.Now().Format("15:04:05"),
+ Error: err.Error(),
+ ReloadSeconds: 5,
+ Base64EncodedGitLabLogo: base64.StdEncoding.EncodeToString(gitlabLogo),
}
buf := &bytes.Buffer{}
@@ -82,28 +88,44 @@ func developmentModeResponse(err error) (body string, contentType string) {
}
type TemplateData struct {
- Time string
- Error string
- ReloadSeconds int
+ Time string
+ Error string
+ ReloadSeconds int
+ Base64EncodedGitLabLogo string
}
var developmentErrorTemplate = template.Must(template.New("error502").Parse(`
-<html>
+<!DOCTYPE html>
+<html lang="en">
+
<head>
-<title>502: GitLab is not responding</title>
-<script>
-window.setTimeout(function() { location.reload() }, {{.ReloadSeconds}} * 1000)
-</script>
+ <title>Waiting for GitLab to boot</title>
</head>
<body>
-<h1>502</h1>
-<p>GitLab is not responding. The error was:</p>
+ <div style="text-align: center; font-family: Source Sans Pro, sans-serif">
+ <img style="padding: 60px 0" src="data:image/png;base64,{{.Base64EncodedGitLabLogo}}" alt="GitLab" />
+
+ <h1>Waiting for GitLab to boot</h1>
+
+ <pre>{{.Error}}</pre>
-<pre>{{.Error}}</pre>
+ <br/>
-<p>If you just started GDK it can take 60-300 seconds before GitLab has finished booting. This page will automatically reload every {{.ReloadSeconds}} seconds.</p>
-<footer>Generated by gitlab-workhorse running in development mode at {{.Time}}.</footer>
+ <p>It can take 60-180 seconds for GitLab to boot completely.</p>
+ <p>This page will automatically reload every {{.ReloadSeconds}} seconds.</p>
+
+ <br/>
+
+ <footer>
+ <p>Generated by gitlab-workhorse running in development mode at {{.Time}}.</p>
+ </footer>
+ </div>
+
+ <script>
+ window.setTimeout(function() { location.reload(); }, {{.ReloadSeconds}} * 1000)
+ </script>
</body>
+
</html>
`))
diff --git a/workhorse/internal/git/archive.go b/workhorse/internal/git/archive.go
index 5dcbb7f262e..4c7b519310f 100644
--- a/workhorse/internal/git/archive.go
+++ b/workhorse/internal/git/archive.go
@@ -19,7 +19,7 @@ import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
diff --git a/workhorse/internal/git/archive_test.go b/workhorse/internal/git/archive_test.go
index b87800f492c..4348f5fe6f5 100644
--- a/workhorse/internal/git/archive_test.go
+++ b/workhorse/internal/git/archive_test.go
@@ -5,7 +5,7 @@ import (
"os"
"testing"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
diff --git a/workhorse/internal/git/blob.go b/workhorse/internal/git/blob.go
index 192978e6c75..39bd4490e66 100644
--- a/workhorse/internal/git/blob.go
+++ b/workhorse/internal/git/blob.go
@@ -4,7 +4,7 @@ import (
"fmt"
"net/http"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
diff --git a/workhorse/internal/git/diff.go b/workhorse/internal/git/diff.go
index 252db6f150b..b4878384e2b 100644
--- a/workhorse/internal/git/diff.go
+++ b/workhorse/internal/git/diff.go
@@ -4,7 +4,7 @@ import (
"fmt"
"net/http"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
diff --git a/workhorse/internal/git/error.go b/workhorse/internal/git/error.go
index 86a2ba44767..e073df19fff 100644
--- a/workhorse/internal/git/error.go
+++ b/workhorse/internal/git/error.go
@@ -5,7 +5,7 @@ import (
"fmt"
"io"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"google.golang.org/grpc/status"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
@@ -44,7 +44,7 @@ func handleLimitErr(err error, w io.Writer, f func(w io.Writer) error) {
}
// writeReceivePackError writes a "server is busy" error message to the
-// git-recieve-pack-result.
+// git-receive-pack-result.
//
// 0023\x01001aunpack server is busy
// 00000044\x2GitLab is currently unable to handle this request due to load.
diff --git a/workhorse/internal/git/error_test.go b/workhorse/internal/git/error_test.go
index d87c81fc83c..11c9baa7d08 100644
--- a/workhorse/internal/git/error_test.go
+++ b/workhorse/internal/git/error_test.go
@@ -7,7 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/require"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
@@ -30,7 +30,7 @@ func TestHandleLimitErr(t *testing.T) {
}, []byte{}),
},
{
- desc: "recieve pack",
+ desc: "receive pack",
errWriter: writeReceivePackError,
expectedBytes: bytes.Join([][]byte{
{'0', '0', '2', '3', 1, '0', '0', '1', 'a'},
diff --git a/workhorse/internal/git/format-patch.go b/workhorse/internal/git/format-patch.go
index d52c4ef7dee..264a4001232 100644
--- a/workhorse/internal/git/format-patch.go
+++ b/workhorse/internal/git/format-patch.go
@@ -4,7 +4,7 @@ import (
"fmt"
"net/http"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
diff --git a/workhorse/internal/git/info-refs_test.go b/workhorse/internal/git/info-refs_test.go
index 0df74abe81d..6f45caed01e 100644
--- a/workhorse/internal/git/info-refs_test.go
+++ b/workhorse/internal/git/info-refs_test.go
@@ -8,7 +8,7 @@ import (
grpccodes "google.golang.org/grpc/codes"
grpcstatus "google.golang.org/grpc/status"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
)
diff --git a/workhorse/internal/git/snapshot.go b/workhorse/internal/git/snapshot.go
index 77b32f8a05d..70832ec9211 100644
--- a/workhorse/internal/git/snapshot.go
+++ b/workhorse/internal/git/snapshot.go
@@ -5,7 +5,7 @@ import (
"io"
"net/http"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
diff --git a/workhorse/internal/git/upload-pack_test.go b/workhorse/internal/git/upload-pack_test.go
index d1184f95d88..efe7977acc0 100644
--- a/workhorse/internal/git/upload-pack_test.go
+++ b/workhorse/internal/git/upload-pack_test.go
@@ -14,8 +14,8 @@ import (
"github.com/stretchr/testify/require"
"google.golang.org/grpc"
- "gitlab.com/gitlab-org/gitaly/v14/client"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/client"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
diff --git a/workhorse/internal/gitaly/blob.go b/workhorse/internal/gitaly/blob.go
index 123fa6e9a4c..0a47b2da5ff 100644
--- a/workhorse/internal/gitaly/blob.go
+++ b/workhorse/internal/gitaly/blob.go
@@ -7,8 +7,8 @@ import (
"net/http"
"strconv"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
- "gitlab.com/gitlab-org/gitaly/v14/streamio"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/streamio"
)
type BlobClient struct {
diff --git a/workhorse/internal/gitaly/diff.go b/workhorse/internal/gitaly/diff.go
index 50bf848b8d3..cd63dbcbd13 100644
--- a/workhorse/internal/gitaly/diff.go
+++ b/workhorse/internal/gitaly/diff.go
@@ -6,8 +6,8 @@ import (
"io"
"net/http"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
- "gitlab.com/gitlab-org/gitaly/v14/streamio"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/streamio"
)
type DiffClient struct {
diff --git a/workhorse/internal/gitaly/gitaly.go b/workhorse/internal/gitaly/gitaly.go
index db1fd3f8abb..b695acbb688 100644
--- a/workhorse/internal/gitaly/gitaly.go
+++ b/workhorse/internal/gitaly/gitaly.go
@@ -15,9 +15,9 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
- gitalyauth "gitlab.com/gitlab-org/gitaly/v14/auth"
- gitalyclient "gitlab.com/gitlab-org/gitaly/v14/client"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ gitalyauth "gitlab.com/gitlab-org/gitaly/v15/auth"
+ gitalyclient "gitlab.com/gitlab-org/gitaly/v15/client"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
diff --git a/workhorse/internal/gitaly/namespace.go b/workhorse/internal/gitaly/namespace.go
index e2fe7a3c63f..1e6cb079ee0 100644
--- a/workhorse/internal/gitaly/namespace.go
+++ b/workhorse/internal/gitaly/namespace.go
@@ -1,6 +1,6 @@
package gitaly
-import "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+import "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
// NamespaceClient encapsulates NamespaceService calls
type NamespaceClient struct {
diff --git a/workhorse/internal/gitaly/repository.go b/workhorse/internal/gitaly/repository.go
index 425a28befe8..cd5ae463a19 100644
--- a/workhorse/internal/gitaly/repository.go
+++ b/workhorse/internal/gitaly/repository.go
@@ -5,8 +5,8 @@ import (
"fmt"
"io"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
- "gitlab.com/gitlab-org/gitaly/v14/streamio"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/streamio"
)
// RepositoryClient encapsulates RepositoryService calls
diff --git a/workhorse/internal/gitaly/smarthttp.go b/workhorse/internal/gitaly/smarthttp.go
index 12dffc3ccff..06ed215f4ec 100644
--- a/workhorse/internal/gitaly/smarthttp.go
+++ b/workhorse/internal/gitaly/smarthttp.go
@@ -5,9 +5,9 @@ import (
"fmt"
"io"
- gitalyclient "gitlab.com/gitlab-org/gitaly/v14/client"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
- "gitlab.com/gitlab-org/gitaly/v14/streamio"
+ gitalyclient "gitlab.com/gitlab-org/gitaly/v15/client"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/streamio"
)
type SmartHTTPClient struct {
diff --git a/workhorse/internal/gitaly/unmarshal_test.go b/workhorse/internal/gitaly/unmarshal_test.go
index 730eff4005a..2e59fe973bf 100644
--- a/workhorse/internal/gitaly/unmarshal_test.go
+++ b/workhorse/internal/gitaly/unmarshal_test.go
@@ -5,7 +5,7 @@ import (
"github.com/golang/protobuf/proto" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
"github.com/stretchr/testify/require"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
)
func TestUnmarshalJSON(t *testing.T) {
diff --git a/workhorse/internal/log/logging.go b/workhorse/internal/log/logging.go
index ae7164db920..80c09c1bf02 100644
--- a/workhorse/internal/log/logging.go
+++ b/workhorse/internal/log/logging.go
@@ -67,14 +67,6 @@ func (b *Builder) WithError(err error) *Builder {
return b
}
-func Debug(args ...interface{}) {
- NewBuilder().Debug(args...)
-}
-
-func (b *Builder) Debug(args ...interface{}) {
- b.entry.Debug(args...)
-}
-
func Info(args ...interface{}) {
NewBuilder().Info(args...)
}
diff --git a/workhorse/internal/log/logging_test.go b/workhorse/internal/log/logging_test.go
index 9daf282daf4..1cb6438532e 100644
--- a/workhorse/internal/log/logging_test.go
+++ b/workhorse/internal/log/logging_test.go
@@ -7,7 +7,6 @@ import (
"net/http/httptest"
"testing"
- "github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
)
@@ -15,7 +14,6 @@ func captureLogs(b *Builder, testFn func()) string {
buf := &bytes.Buffer{}
logger := b.entry.Logger
- logger.SetLevel(logrus.DebugLevel)
oldOut := logger.Out
logger.Out = buf
defer func() {
@@ -27,15 +25,6 @@ func captureLogs(b *Builder, testFn func()) string {
return buf.String()
}
-func TestLogDebug(t *testing.T) {
- b := NewBuilder()
- logLine := captureLogs(b, func() {
- b.Debug("an observation")
- })
-
- require.Regexp(t, `level=debug msg="an observation"`, logLine)
-}
-
func TestLogInfo(t *testing.T) {
b := NewBuilder()
logLine := captureLogs(b, func() {
diff --git a/workhorse/internal/lsif_transformer/parser/code_hover.go b/workhorse/internal/lsif_transformer/parser/code_hover.go
index 5651ea8e5a3..25550cce29e 100644
--- a/workhorse/internal/lsif_transformer/parser/code_hover.go
+++ b/workhorse/internal/lsif_transformer/parser/code_hover.go
@@ -5,8 +5,8 @@ import (
"strings"
"unicode/utf8"
- "github.com/alecthomas/chroma"
- "github.com/alecthomas/chroma/lexers"
+ "github.com/alecthomas/chroma/v2"
+ "github.com/alecthomas/chroma/v2/lexers"
)
const maxValueSize = 250
diff --git a/workhorse/internal/redis/keywatcher_test.go b/workhorse/internal/redis/keywatcher_test.go
index a2f2b73898f..29041226b14 100644
--- a/workhorse/internal/redis/keywatcher_test.go
+++ b/workhorse/internal/redis/keywatcher_test.go
@@ -7,7 +7,7 @@ import (
"time"
"github.com/gomodule/redigo/redis"
- "github.com/rafaeljusto/redigomock"
+ "github.com/rafaeljusto/redigomock/v3"
"github.com/stretchr/testify/require"
)
diff --git a/workhorse/internal/redis/redis_test.go b/workhorse/internal/redis/redis_test.go
index c3e4ded8878..64b3a842a54 100644
--- a/workhorse/internal/redis/redis_test.go
+++ b/workhorse/internal/redis/redis_test.go
@@ -6,7 +6,7 @@ import (
"time"
"github.com/gomodule/redigo/redis"
- "github.com/rafaeljusto/redigomock"
+ "github.com/rafaeljusto/redigomock/v3"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
diff --git a/workhorse/internal/testhelper/gitaly.go b/workhorse/internal/testhelper/gitaly.go
index 488fb2eaf01..55fbcf2db2d 100644
--- a/workhorse/internal/testhelper/gitaly.go
+++ b/workhorse/internal/testhelper/gitaly.go
@@ -19,8 +19,8 @@ import (
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
- "gitlab.com/gitlab-org/gitaly/v14/client"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/client"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/labkit/log"
)
diff --git a/workhorse/internal/upload/artifacts_store_test.go b/workhorse/internal/upload/artifacts_store_test.go
index 7032313fbde..edba13d38ae 100644
--- a/workhorse/internal/upload/artifacts_store_test.go
+++ b/workhorse/internal/upload/artifacts_store_test.go
@@ -206,14 +206,10 @@ func TestUploadHandlerSendingToExternalStorageAndItReturnsAnError(t *testing.T)
}
func TestUploadHandlerSendingToExternalStorageAndSupportRequestTimeout(t *testing.T) {
- putCalledTimes := 0
-
+ shutdown := make(chan struct{})
storeServerMux := http.NewServeMux()
storeServerMux.HandleFunc("/url/put", func(w http.ResponseWriter, r *http.Request) {
- putCalledTimes++
- require.Equal(t, "PUT", r.Method)
- time.Sleep(10 * time.Second)
- w.WriteHeader(510)
+ <-shutdown
})
responseProcessor := func(w http.ResponseWriter, r *http.Request) {
@@ -221,13 +217,16 @@ func TestUploadHandlerSendingToExternalStorageAndSupportRequestTimeout(t *testin
}
storeServer := httptest.NewServer(storeServerMux)
- defer storeServer.Close()
+ defer func() {
+ close(shutdown)
+ storeServer.Close()
+ }()
authResponse := &api.Response{
RemoteObject: api.RemoteObject{
StoreURL: storeServer.URL + "/url/put",
ID: "store-id",
- Timeout: 1,
+ Timeout: 0.001,
},
}
@@ -235,8 +234,8 @@ func TestUploadHandlerSendingToExternalStorageAndSupportRequestTimeout(t *testin
defer ts.Close()
response := testUploadArtifactsFromTestZip(t, ts)
- require.Equal(t, http.StatusInternalServerError, response.Code)
- require.Equal(t, 1, putCalledTimes, "upload should be called only once")
+ // HTTP status 504 (gateway timeout) proves that the timeout was enforced
+ require.Equal(t, http.StatusGatewayTimeout, response.Code)
}
func TestUploadHandlerMultipartUploadSizeLimit(t *testing.T) {
diff --git a/workhorse/internal/upload/body_uploader_test.go b/workhorse/internal/upload/body_uploader_test.go
index 837d119e72e..eff33757845 100644
--- a/workhorse/internal/upload/body_uploader_test.go
+++ b/workhorse/internal/upload/body_uploader_test.go
@@ -92,7 +92,11 @@ func echoProxy(t *testing.T, expectedBodyLength int) http.Handler {
require.Equal(t, "application/x-www-form-urlencoded", r.Header.Get("Content-Type"), "Wrong Content-Type header")
- require.Contains(t, r.PostForm, "file.md5")
+ if destination.FIPSEnabled() {
+ require.NotContains(t, r.PostForm, "file.md5")
+ } else {
+ require.Contains(t, r.PostForm, "file.md5")
+ }
require.Contains(t, r.PostForm, "file.sha1")
require.Contains(t, r.PostForm, "file.sha256")
require.Contains(t, r.PostForm, "file.sha512")
@@ -119,7 +123,11 @@ func echoProxy(t *testing.T, expectedBodyLength int) http.Handler {
require.Contains(t, uploadFields, "remote_url")
require.Contains(t, uploadFields, "remote_id")
require.Contains(t, uploadFields, "size")
- require.Contains(t, uploadFields, "md5")
+ if destination.FIPSEnabled() {
+ require.NotContains(t, uploadFields, "md5")
+ } else {
+ require.Contains(t, uploadFields, "md5")
+ }
require.Contains(t, uploadFields, "sha1")
require.Contains(t, uploadFields, "sha256")
require.Contains(t, uploadFields, "sha512")
diff --git a/workhorse/internal/upload/destination/destination_test.go b/workhorse/internal/upload/destination/destination_test.go
index 6ebe163468b..97645be168f 100644
--- a/workhorse/internal/upload/destination/destination_test.go
+++ b/workhorse/internal/upload/destination/destination_test.go
@@ -206,7 +206,11 @@ func TestUpload(t *testing.T) {
}
require.Equal(t, test.ObjectSize, fh.Size)
- require.Equal(t, test.ObjectMD5, fh.MD5())
+ if destination.FIPSEnabled() {
+ require.Empty(t, fh.MD5())
+ } else {
+ require.Equal(t, test.ObjectMD5, fh.MD5())
+ }
require.Equal(t, test.ObjectSHA256, fh.SHA256())
require.Equal(t, expectedPuts, osStub.PutsCnt(), "ObjectStore PutObject count mismatch")
@@ -478,7 +482,11 @@ func checkFileHandlerWithFields(t *testing.T, fh *destination.FileHandler, field
require.Equal(t, fh.RemoteURL, fields[key("remote_url")])
require.Equal(t, fh.RemoteID, fields[key("remote_id")])
require.Equal(t, strconv.FormatInt(test.ObjectSize, 10), fields[key("size")])
- require.Equal(t, test.ObjectMD5, fields[key("md5")])
+ if destination.FIPSEnabled() {
+ require.Empty(t, fields[key("md5")])
+ } else {
+ require.Equal(t, test.ObjectMD5, fields[key("md5")])
+ }
require.Equal(t, test.ObjectSHA1, fields[key("sha1")])
require.Equal(t, test.ObjectSHA256, fields[key("sha256")])
require.Equal(t, test.ObjectSHA512, fields[key("sha512")])
diff --git a/workhorse/internal/upload/destination/multi_hash.go b/workhorse/internal/upload/destination/multi_hash.go
index 7d4884af3dc..8d5bf4424a8 100644
--- a/workhorse/internal/upload/destination/multi_hash.go
+++ b/workhorse/internal/upload/destination/multi_hash.go
@@ -8,6 +8,9 @@ import (
"encoding/hex"
"hash"
"io"
+ "os"
+
+ "gitlab.com/gitlab-org/labkit/fips"
)
var hashFactories = map[string](func() hash.Hash){
@@ -17,6 +20,28 @@ var hashFactories = map[string](func() hash.Hash){
"sha512": sha512.New,
}
+var fipsHashFactories = map[string](func() hash.Hash){
+ "sha1": sha1.New,
+ "sha256": sha256.New,
+ "sha512": sha512.New,
+}
+
+func factories() map[string](func() hash.Hash) {
+ if FIPSEnabled() {
+ return fipsHashFactories
+ }
+
+ return hashFactories
+}
+
+func FIPSEnabled() bool {
+ if fips.Enabled() {
+ return true
+ }
+
+ return os.Getenv("WORKHORSE_TEST_FIPS_ENABLED") == "1"
+}
+
type multiHash struct {
io.Writer
hashes map[string]hash.Hash
@@ -27,7 +52,7 @@ func newMultiHash() (m *multiHash) {
m.hashes = make(map[string]hash.Hash)
var writers []io.Writer
- for hash, hashFactory := range hashFactories {
+ for hash, hashFactory := range factories() {
writer := hashFactory()
m.hashes[hash] = writer
diff --git a/workhorse/internal/upload/destination/objectstore/object.go b/workhorse/internal/upload/destination/objectstore/object.go
index 68c566861af..36ffa0eb12e 100644
--- a/workhorse/internal/upload/destination/objectstore/object.go
+++ b/workhorse/internal/upload/destination/objectstore/object.go
@@ -52,7 +52,7 @@ func newObject(putURL, deleteURL string, putHeaders map[string]string, size int6
func (o *Object) Upload(ctx context.Context, r io.Reader) error {
// we should prevent pr.Close() otherwise it may shadow error set with pr.CloseWithError(err)
- req, err := http.NewRequest(http.MethodPut, o.putURL, io.NopCloser(r))
+ req, err := http.NewRequestWithContext(ctx, http.MethodPut, o.putURL, io.NopCloser(r))
if err != nil {
return fmt.Errorf("PUT %q: %v", mask.URL(o.putURL), err)
@@ -65,7 +65,7 @@ func (o *Object) Upload(ctx context.Context, r io.Reader) error {
resp, err := httpClient.Do(req)
if err != nil {
- return fmt.Errorf("PUT request %q: %v", mask.URL(o.putURL), err)
+ return fmt.Errorf("PUT request %q: %w", mask.URL(o.putURL), err)
}
defer resp.Body.Close()
diff --git a/workhorse/internal/upload/destination/upload_opts.go b/workhorse/internal/upload/destination/upload_opts.go
index b2223fac912..58427b38b30 100644
--- a/workhorse/internal/upload/destination/upload_opts.go
+++ b/workhorse/internal/upload/destination/upload_opts.go
@@ -80,7 +80,11 @@ func (s *UploadOpts) IsMultipart() bool {
// GetOpts converts GitLab api.Response to a proper UploadOpts
func GetOpts(apiResponse *api.Response) (*UploadOpts, error) {
- timeout := time.Duration(apiResponse.RemoteObject.Timeout) * time.Second
+ timeout := time.Duration(
+ // By converting time.Second to a float32 value we can correctly handle
+ // small Timeout values like 0.1.
+ apiResponse.RemoteObject.Timeout * float32(time.Second),
+ )
if timeout == 0 {
timeout = DefaultObjectStoreTimeout
}
diff --git a/workhorse/internal/upload/multipart_uploader.go b/workhorse/internal/upload/multipart_uploader.go
index 2456a2c8626..e55937186a6 100644
--- a/workhorse/internal/upload/multipart_uploader.go
+++ b/workhorse/internal/upload/multipart_uploader.go
@@ -19,23 +19,15 @@ func Multipart(rails PreAuthorizer, h http.Handler, p Preparer) http.Handler {
}, "/authorize")
}
-// SkipRailsPreAuthMultipart behaves like Multipart except it does not
-// pre-authorize with Rails. It is intended for use on catch-all routes
-// where we cannot pre-authorize both because we don't know which Rails
-// endpoint to call, and because eagerly pre-authorizing would add too
-// much overhead.
-func SkipRailsPreAuthMultipart(tempPath string, myAPI *api.API, h http.Handler, p Preparer) http.Handler {
+// FixedPreAuthMultipart behaves like Multipart except it makes lazy
+// preauthorization requests when it encounters a multipart upload. The
+// preauthorization requests go to a fixed internal GitLab Rails API
+// endpoint. This endpoint currently does not support direct upload, so
+// using FixedPreAuthMultipart implies disk buffering.
+func FixedPreAuthMultipart(myAPI *api.API, h http.Handler, p Preparer) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
s := &SavedFileTracker{Request: r}
-
- // We use testAuthorizer as a temporary measure. When
- // https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/742 is done, we
- // should only be using apiAuthorizer.
- fa := &testAuthorizer{
- test: &apiAuthorizer{myAPI},
- actual: &eagerAuthorizer{&api.Response{TempPath: tempPath}},
- }
-
+ fa := &apiAuthorizer{myAPI}
interceptMultipartFiles(w, r, h, s, fa, p)
})
}
diff --git a/workhorse/internal/upload/rewrite.go b/workhorse/internal/upload/rewrite.go
index d03445923fa..7b9ac6b996e 100644
--- a/workhorse/internal/upload/rewrite.go
+++ b/workhorse/internal/upload/rewrite.go
@@ -15,8 +15,6 @@ import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
-
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/exif"
@@ -161,7 +159,7 @@ func (rew *rewriter) handleFilePart(r *http.Request, name string, p *multipart.P
case destination.ErrEntityTooLarge, exif.ErrRemovingExif:
return err
default:
- return fmt.Errorf("persisting multipart file: %v", err)
+ return fmt.Errorf("persisting multipart file: %w", err)
}
}
@@ -222,21 +220,3 @@ func (aa *apiAuthorizer) AuthorizeFile(r *http.Request) (*api.Response, error) {
}
var _ fileAuthorizer = &apiAuthorizer{}
-
-type testAuthorizer struct {
- test fileAuthorizer
- actual fileAuthorizer
-}
-
-func (ta *testAuthorizer) AuthorizeFile(r *http.Request) (*api.Response, error) {
- logger := log.WithRequest(r)
- if response, err := ta.test.AuthorizeFile(r); err != nil {
- logger.WithError(err).Error("test api preauthorize request failed")
- } else {
- logger.WithFields(log.Fields{
- "temp_path": response.TempPath,
- }).Info("test api preauthorize request")
- }
-
- return ta.actual.AuthorizeFile(r)
-}
diff --git a/workhorse/internal/upload/uploads.go b/workhorse/internal/upload/uploads.go
index 61b419901a7..f214e1ac297 100644
--- a/workhorse/internal/upload/uploads.go
+++ b/workhorse/internal/upload/uploads.go
@@ -3,6 +3,7 @@ package upload
import (
"bytes"
"context"
+ "errors"
"fmt"
"io"
"mime/multipart"
@@ -63,7 +64,11 @@ func interceptMultipartFiles(w http.ResponseWriter, r *http.Request, h http.Hand
case exif.ErrRemovingExif:
helper.CaptureAndFail(w, r, err, "Failed to process image", http.StatusUnprocessableEntity)
default:
- helper.Fail500(w, r, fmt.Errorf("handleFileUploads: extract files from multipart: %v", err))
+ if errors.Is(err, context.DeadlineExceeded) {
+ helper.CaptureAndFail(w, r, err, "deadline exceeded", http.StatusGatewayTimeout)
+ } else {
+ helper.Fail500(w, r, fmt.Errorf("handleFileUploads: extract files from multipart: %v", err))
+ }
}
return
}
diff --git a/workhorse/internal/upload/uploads_test.go b/workhorse/internal/upload/uploads_test.go
index ffe9fec302e..3655e9fc8c9 100644
--- a/workhorse/internal/upload/uploads_test.go
+++ b/workhorse/internal/upload/uploads_test.go
@@ -24,6 +24,7 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/proxy"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upstream/roundtripper"
)
@@ -99,7 +100,6 @@ func TestUploadHandlerRewritingMultiPartData(t *testing.T) {
require.Equal(t, "4", r.FormValue("file.size"), "Expected to receive the file size")
hashes := map[string]string{
- "md5": "098f6bcd4621d373cade4e832627b4f6",
"sha1": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
"sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"sha512": "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff",
@@ -109,7 +109,16 @@ func TestUploadHandlerRewritingMultiPartData(t *testing.T) {
require.Equal(t, hash, r.FormValue("file."+algo), "file hash %s", algo)
}
- require.Len(t, r.MultipartForm.Value, 12, "multipart form values")
+ expectedLen := 12
+
+ if destination.FIPSEnabled() {
+ expectedLen--
+ require.Empty(t, r.FormValue("file.md5"), "file hash md5")
+ } else {
+ require.Equal(t, "098f6bcd4621d373cade4e832627b4f6", r.FormValue("file.md5"), "file hash md5")
+ }
+
+ require.Len(t, r.MultipartForm.Value, expectedLen, "multipart form values")
w.WriteHeader(202)
fmt.Fprint(w, "RESPONSE")
diff --git a/workhorse/internal/upstream/routes.go b/workhorse/internal/upstream/routes.go
index 95c9b99b833..c889f87ed96 100644
--- a/workhorse/internal/upstream/routes.go
+++ b/workhorse/internal/upstream/routes.go
@@ -3,7 +3,6 @@ package upstream
import (
"net/http"
"net/url"
- "path"
"regexp"
"github.com/gorilla/websocket"
@@ -222,8 +221,7 @@ func configureRoutes(u *upstream) {
requestBodyUploader := upload.RequestBody(api, signingProxy, preparer)
mimeMultipartUploader := upload.Multipart(api, signingProxy, preparer)
- uploadPath := path.Join(u.DocumentRoot, "uploads/tmp")
- tempfileMultipartProxy := upload.SkipRailsPreAuthMultipart(uploadPath, api, proxy, preparer)
+ tempfileMultipartProxy := upload.FixedPreAuthMultipart(api, proxy, preparer)
ciAPIProxyQueue := queueing.QueueRequests("ci_api_job_requests", tempfileMultipartProxy, u.APILimit, u.APIQueueLimit, u.APIQueueTimeout)
ciAPILongPolling := builds.RegisterHandler(ciAPIProxyQueue, redis.WatchKey, u.APICILongPollingDuration)
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go
index 6d107fc28cd..43b470b568f 100644
--- a/workhorse/internal/upstream/upstream.go
+++ b/workhorse/internal/upstream/upstream.go
@@ -23,7 +23,6 @@ import (
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"
proxypkg "gitlab.com/gitlab-org/gitlab/workhorse/internal/proxy"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/rejectmethods"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload"
@@ -52,6 +51,7 @@ type upstream struct {
geoProxyCableRoute routeEntry
geoProxyRoute routeEntry
geoProxyPollSleep func(time.Duration)
+ geoPollerDone chan struct{}
accessLogger *logrus.Logger
enableGeoProxyFeature bool
mu sync.RWMutex
@@ -81,6 +81,7 @@ func newUpstream(cfg config.Config, accessLogger *logrus.Logger, routesCallback
if up.CableSocket == "" {
up.CableSocket = up.Socket
}
+ up.geoPollerDone = make(chan struct{})
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()
@@ -92,9 +93,7 @@ func newUpstream(cfg config.Config, accessLogger *logrus.Logger, routesCallback
routesCallback(&up)
- if up.enableGeoProxyFeature {
- go up.pollGeoProxyAPI()
- }
+ go up.pollGeoProxyAPI()
var correlationOpts []correlation.InboundHandlerOption
if cfg.PropagateCorrelationID {
@@ -165,10 +164,8 @@ func (u *upstream) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
func (u *upstream) findRoute(cleanedPath string, r *http.Request) *routeEntry {
- if u.enableGeoProxyFeature {
- if route := u.findGeoProxyRoute(cleanedPath, r); route != nil {
- return route
- }
+ if route := u.findGeoProxyRoute(cleanedPath, r); route != nil {
+ return route
}
for _, ro := range u.Routes {
@@ -185,20 +182,16 @@ func (u *upstream) findGeoProxyRoute(cleanedPath string, r *http.Request) *route
defer u.mu.RUnlock()
if u.geoProxyBackend.String() == "" {
- log.WithRequest(r).Debug("Geo Proxy: Not a Geo proxy")
return nil
}
// Some routes are safe to serve from this GitLab instance
for _, ro := range u.geoLocalRoutes {
if ro.isMatch(cleanedPath, r) {
- log.WithRequest(r).Debug("Geo Proxy: Handle this request locally")
return &ro
}
}
- log.WithRequest(r).WithFields(log.Fields{"geoProxyBackend": u.geoProxyBackend}).Debug("Geo Proxy: Forward this request")
-
if cleanedPath == "/-/cable" {
return &u.geoProxyCableRoute
}
@@ -207,7 +200,15 @@ func (u *upstream) findGeoProxyRoute(cleanedPath string, r *http.Request) *route
}
func (u *upstream) pollGeoProxyAPI() {
+ defer close(u.geoPollerDone)
+
for {
+ // Check enableGeoProxyFeature every time because `callGeoProxyApi()` can change its value.
+ // This is can also be disabled through the GEO_SECONDARY_PROXY env var.
+ if !u.enableGeoProxyFeature {
+ break
+ }
+
u.callGeoProxyAPI()
u.geoProxyPollSleep(geoProxyApiPollingInterval)
}
@@ -217,19 +218,26 @@ func (u *upstream) pollGeoProxyAPI() {
func (u *upstream) callGeoProxyAPI() {
geoProxyData, err := u.APIClient.GetGeoProxyData()
if err != nil {
- log.WithError(err).WithFields(log.Fields{"geoProxyBackend": u.geoProxyBackend}).Error("Geo Proxy: Unable to determine Geo Proxy URL. Fallback on cached value.")
+ // Unable to determine Geo Proxy URL. Fallback on cached value.
+ return
+ }
+
+ if !geoProxyData.GeoEnabled {
+ // When Geo is not enabled, we don't need to proxy, as it unnecessarily polls the
+ // API, whereas a restart is necessary to enable Geo in the first place; at which
+ // point we get fresh data from the API.
+ u.enableGeoProxyFeature = false
return
}
hasProxyDataChanged := false
if u.geoProxyBackend.String() != geoProxyData.GeoProxyURL.String() {
- log.WithFields(log.Fields{"oldGeoProxyURL": u.geoProxyBackend, "newGeoProxyURL": geoProxyData.GeoProxyURL}).Info("Geo Proxy: URL changed")
+ // URL changed
hasProxyDataChanged = true
}
if u.geoProxyExtraData != geoProxyData.GeoProxyExtraData {
- // extra data is usually a JWT, thus not explicitly logging it
- log.Info("Geo Proxy: signed data changed")
+ // Signed data changed
hasProxyDataChanged = true
}
diff --git a/workhorse/internal/upstream/upstream_test.go b/workhorse/internal/upstream/upstream_test.go
index f931c1b31b3..21fa7b81fdb 100644
--- a/workhorse/internal/upstream/upstream_test.go
+++ b/workhorse/internal/upstream/upstream_test.go
@@ -12,9 +12,11 @@ import (
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
+ 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/testhelper"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/upstream/roundtripper"
)
const (
@@ -72,6 +74,54 @@ func TestRouting(t *testing.T) {
runTestCases(t, ts, testCases)
}
+func TestPollGeoProxyApiStopsWhenExplicitlyDisabled(t *testing.T) {
+ up := upstream{
+ enableGeoProxyFeature: false,
+ geoProxyPollSleep: func(time.Duration) {},
+ geoPollerDone: make(chan struct{}),
+ }
+
+ go up.pollGeoProxyAPI()
+
+ select {
+ case <-up.geoPollerDone:
+ // happy
+ case <-time.After(10 * time.Second):
+ t.Fatal("timeout")
+ }
+}
+
+func TestPollGeoProxyApiStopsWhenGeoNotEnabled(t *testing.T) {
+ remoteServer, rsDeferredClose := startRemoteServer("Geo primary")
+ defer rsDeferredClose()
+
+ geoProxyEndpointResponseBody := `{"geo_enabled":false}`
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
+ defer deferredClose()
+
+ cfg := newUpstreamConfig(railsServer.URL)
+ roundTripper := roundtripper.NewBackendRoundTripper(cfg.Backend, "", 1*time.Minute, true)
+ remoteServerUrl := helper.URLMustParse(remoteServer.URL)
+
+ up := upstream{
+ Config: *cfg,
+ RoundTripper: roundTripper,
+ APIClient: apipkg.NewAPI(remoteServerUrl, "", roundTripper),
+ enableGeoProxyFeature: true,
+ geoProxyPollSleep: func(time.Duration) {},
+ geoPollerDone: make(chan struct{}),
+ }
+
+ go up.pollGeoProxyAPI()
+
+ select {
+ case <-up.geoPollerDone:
+ // happy
+ case <-time.After(10 * time.Second):
+ t.Fatal("timeout")
+ }
+}
+
// This test can be removed when the environment variable `GEO_SECONDARY_PROXY` is removed
func TestGeoProxyFeatureDisabledOnGeoSecondarySite(t *testing.T) {
// We could just not set up the primary, but then we'd have to assert
@@ -79,7 +129,7 @@ func TestGeoProxyFeatureDisabledOnGeoSecondarySite(t *testing.T) {
remoteServer, rsDeferredClose := startRemoteServer("Geo primary")
defer rsDeferredClose()
- geoProxyEndpointResponseBody := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
+ geoProxyEndpointResponseBody := fmt.Sprintf(`{"geo_enabled":true,"geo_proxy_url":"%v"}`, remoteServer.URL)
railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
@@ -109,7 +159,7 @@ func TestGeoProxyFeatureEnabledOnGeoSecondarySite(t *testing.T) {
// This test can be removed when the environment variable `GEO_SECONDARY_PROXY` is removed
func TestGeoProxyFeatureDisabledOnNonGeoSecondarySite(t *testing.T) {
- geoProxyEndpointResponseBody := "{}"
+ geoProxyEndpointResponseBody := `{"geo_enabled":false}`
railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
@@ -127,7 +177,7 @@ func TestGeoProxyFeatureDisabledOnNonGeoSecondarySite(t *testing.T) {
}
func TestGeoProxyFeatureEnabledOnNonGeoSecondarySite(t *testing.T) {
- geoProxyEndpointResponseBody := "{}"
+ geoProxyEndpointResponseBody := `{"geo_enabled":false}`
railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
@@ -166,8 +216,8 @@ func TestGeoProxyFeatureEnablingAndDisabling(t *testing.T) {
remoteServer, rsDeferredClose := startRemoteServer("Geo primary")
defer rsDeferredClose()
- geoProxyEndpointEnabledResponseBody := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
- geoProxyEndpointDisabledResponseBody := "{}"
+ geoProxyEndpointEnabledResponseBody := fmt.Sprintf(`{"geo_enabled":true,"geo_proxy_url":"%v"}`, remoteServer.URL)
+ geoProxyEndpointDisabledResponseBody := `{"geo_enabled":true}`
geoProxyEndpointResponseBody := geoProxyEndpointEnabledResponseBody
railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
@@ -218,9 +268,9 @@ func TestGeoProxyUpdatesExtraDataWhenChanged(t *testing.T) {
}))
defer remoteServer.Close()
- geoProxyEndpointExtraData1 := fmt.Sprintf(`{"geo_proxy_url":"%v","geo_proxy_extra_data":"data1"}`, remoteServer.URL)
- geoProxyEndpointExtraData2 := fmt.Sprintf(`{"geo_proxy_url":"%v","geo_proxy_extra_data":"data2"}`, remoteServer.URL)
- geoProxyEndpointExtraData3 := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
+ geoProxyEndpointExtraData1 := fmt.Sprintf(`{"geo_enabled":true,"geo_proxy_url":"%v","geo_proxy_extra_data":"data1"}`, remoteServer.URL)
+ geoProxyEndpointExtraData2 := fmt.Sprintf(`{"geo_enabled":true,"geo_proxy_url":"%v","geo_proxy_extra_data":"data2"}`, remoteServer.URL)
+ geoProxyEndpointExtraData3 := fmt.Sprintf(`{"geo_enabled":true,"geo_proxy_url":"%v"}`, remoteServer.URL)
geoProxyEndpointResponseBody := geoProxyEndpointExtraData1
expectedGeoProxyExtraData = "data1"
@@ -253,8 +303,8 @@ func TestGeoProxySetsCustomHeader(t *testing.T) {
json string
extraData string
}{
- {"no extra data", `{"geo_proxy_url":"%v"}`, ""},
- {"with extra data", `{"geo_proxy_url":"%v","geo_proxy_extra_data":"extra-geo-data"}`, "extra-geo-data"},
+ {"no extra data", `{"geo_enabled":true,"geo_proxy_url":"%v"}`, ""},
+ {"with extra data", `{"geo_enabled":true,"geo_proxy_url":"%v","geo_proxy_extra_data":"extra-geo-data"}`, "extra-geo-data"},
}
for _, tc := range testCases {
@@ -299,7 +349,7 @@ func runTestCasesWithGeoProxyEnabled(t *testing.T, testCases []testCase) {
remoteServer, rsDeferredClose := startRemoteServer("Geo primary")
defer rsDeferredClose()
- geoProxyEndpointResponseBody := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
+ geoProxyEndpointResponseBody := fmt.Sprintf(`{"geo_enabled":true,"geo_proxy_url":"%v"}`, remoteServer.URL)
railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
diff --git a/workhorse/main_test.go b/workhorse/main_test.go
index b6a09efa8db..195b1166c75 100644
--- a/workhorse/main_test.go
+++ b/workhorse/main_test.go
@@ -22,7 +22,7 @@ import (
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
- "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/labkit/log"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
diff --git a/workhorse/upload_test.go b/workhorse/upload_test.go
index dedda4ea655..9947059770f 100644
--- a/workhorse/upload_test.go
+++ b/workhorse/upload_test.go
@@ -20,6 +20,7 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/secret"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
)
type uploadArtifactsFunction func(url, contentType string, body io.Reader) (*http.Response, string, error)
@@ -82,7 +83,13 @@ func uploadTestServer(t *testing.T, authorizeTests func(r *http.Request), extraT
require.NoError(t, r.ParseMultipartForm(100000))
- const nValues = 11 // file name, path, remote_url, remote_id, size, md5, sha1, sha256, sha512, upload_duration, gitlab-workhorse-upload for just the upload (no metadata because we are not POSTing a valid zip file)
+ var nValues int // file name, path, remote_url, remote_id, size, md5, sha1, sha256, sha512, upload_duration, gitlab-workhorse-upload for just the upload (no metadata because we are not POSTing a valid zip file)
+ if destination.FIPSEnabled() {
+ nValues = 10
+ } else {
+ nValues = 11
+ }
+
require.Len(t, r.MultipartForm.Value, nValues)
require.Empty(t, r.MultipartForm.File, "multipart form files")
@@ -183,7 +190,11 @@ func TestAcceleratedUpload(t *testing.T) {
require.Contains(t, uploadFields, "remote_url")
require.Contains(t, uploadFields, "remote_id")
require.Contains(t, uploadFields, "size")
- require.Contains(t, uploadFields, "md5")
+ if destination.FIPSEnabled() {
+ require.NotContains(t, uploadFields, "md5")
+ } else {
+ require.Contains(t, uploadFields, "md5")
+ }
require.Contains(t, uploadFields, "sha1")
require.Contains(t, uploadFields, "sha256")
require.Contains(t, uploadFields, "sha512")
@@ -287,30 +298,38 @@ func TestBlockingRewrittenFieldsHeader(t *testing.T) {
}
for _, tc := range testCases {
- ts := testhelper.TestServerWithHandler(regexp.MustCompile(`.`), func(w http.ResponseWriter, r *http.Request) {
- key := upload.RewrittenFieldsHeader
- if tc.present && r.URL.Path != "/api/v4/internal/workhorse/authorize_upload" {
- require.Contains(t, r.Header, key)
- } else {
- require.NotContains(t, r.Header, key)
- }
+ t.Run(tc.desc, func(t *testing.T) {
+ ts := testhelper.TestServerWithHandler(regexp.MustCompile(`.`), func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ case "/api/v4/internal/workhorse/authorize_upload":
+ w.Header().Set("Content-Type", api.ResponseContentType)
+ io.WriteString(w, `{"TempPath":"`+os.TempDir()+`"}`)
+ default:
+ if tc.present {
+ require.Contains(t, r.Header, upload.RewrittenFieldsHeader)
+ } else {
+ require.NotContains(t, r.Header, upload.RewrittenFieldsHeader)
- require.NotEqual(t, canary, r.Header.Get(key), "Found canary %q in header %q", canary, key)
- })
- defer ts.Close()
- ws := startWorkhorseServer(ts.URL)
- defer ws.Close()
+ }
+ }
+
+ require.NotEqual(t, canary, r.Header.Get(upload.RewrittenFieldsHeader), "Found canary %q in header", canary)
+ })
+ defer ts.Close()
+ ws := startWorkhorseServer(ts.URL)
+ defer ws.Close()
- req, err := http.NewRequest("POST", ws.URL+"/something", tc.body)
- require.NoError(t, err)
+ req, err := http.NewRequest("POST", ws.URL+"/something", tc.body)
+ require.NoError(t, err)
- req.Header.Set("Content-Type", tc.contentType)
- req.Header.Set(upload.RewrittenFieldsHeader, canary)
- resp, err := http.DefaultClient.Do(req)
- require.NoError(t, err)
- defer resp.Body.Close()
+ req.Header.Set("Content-Type", tc.contentType)
+ req.Header.Set(upload.RewrittenFieldsHeader, canary)
+ resp, err := http.DefaultClient.Do(req)
+ require.NoError(t, err)
+ defer resp.Body.Close()
- require.Equal(t, 200, resp.StatusCode, "status code")
+ require.Equal(t, 200, resp.StatusCode, "status code")
+ })
}
}
diff --git a/yarn.lock b/yarn.lock
index 7bbe41b71e7..45b79207b6b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -976,6 +976,11 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
+"@csstools/selector-specificity@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz#b6b8d81780b9a9f6459f4bfe9226ac6aefaefe87"
+ integrity sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA==
+
"@discoveryjs/json-ext@^0.5.0":
version "0.5.6"
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f"
@@ -1011,18 +1016,18 @@
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
-"@gitlab/eslint-plugin@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-12.1.0.tgz#e62f2591164895f8cfccb3dd9ac77f3586b6e3d8"
- integrity sha512-rq+aaF45s3FSzFFoK2BZ7X/uzOIhAWA0rfG4q5SnoecbMuEpPEX2OGZFRh8VOePZLmiylfwyxH0Cv12evzyUtg==
+"@gitlab/eslint-plugin@13.1.0":
+ version "13.1.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-13.1.0.tgz#d0698251e601d8732b6db994c8ebd8c37be404fa"
+ integrity sha512-/eWbTomAipyp/nbaNLq8aU1IcqG029+clvUOgkckm704q38G0/r6KHgcuXvxWj2erzwcEveEXXyilZAaTQquRA==
dependencies:
"@babel/core" "^7.17.0"
"@babel/eslint-parser" "^7.17.0"
"@babel/eslint-plugin" "^7.17.7"
- eslint-config-airbnb-base "^14.2.1"
+ eslint-config-airbnb-base "^15.0.0"
eslint-config-prettier "^6.10.0"
eslint-plugin-babel "^5.3.0"
- eslint-plugin-import "^2.22.1"
+ eslint-plugin-import "^2.26.0"
eslint-plugin-jest "^23.8.2"
eslint-plugin-promise "^4.2.1"
eslint-plugin-unicorn "^40.1.0"
@@ -1034,28 +1039,28 @@
resolved "https://registry.yarnpkg.com/@gitlab/favicon-overlay/-/favicon-overlay-2.0.0.tgz#2f32d0b6a4d5b8ac44e2927083d9ab478a78c984"
integrity sha512-GNcORxXJ98LVGzOT9dDYKfbheqH6lNgPDD72lyXRnQIH7CjgGyos8i17aSBPq1f4s3zF3PyedFiAR4YEZbva2Q==
-"@gitlab/stylelint-config@4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@gitlab/stylelint-config/-/stylelint-config-4.0.0.tgz#d24646592908d92dce35aaa8e7bea66fd53e4160"
- integrity sha512-5avbb8XQLdnL/vdrxf9jvdPl/HPaXnI7Y/fArOHe1uMpgcBoBWUKmon15+lHJ4MgURsGuYSiM2FIgArDSylR4g==
+"@gitlab/stylelint-config@4.1.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/stylelint-config/-/stylelint-config-4.1.0.tgz#bd431406c8f8725afba353652f08e42c3301a982"
+ integrity sha512-WiTLRKoXutmAKR0z4Z/kuXiTAtblyA2XWX6vb2/NHhLd7oboKrxR8CiznSfw7SNxmYtqW/ripaQOdanR1fYMwA==
dependencies:
- postcss-scss "4.0.3"
+ postcss-scss "4.0.4"
stylelint-declaration-strict-value "1.8.0"
- stylelint-scss "4.1.0"
+ stylelint-scss "4.2.0"
-"@gitlab/svgs@2.21.0":
- version "2.21.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.21.0.tgz#bc71951dc35a61647fb2c0267cca6fb55a04d317"
- integrity sha512-cVa5cgvVmY2MsRdV61id+rLTsY/tAGPq7Og9ETblUuZXl06ciw8H/g7cYPMxN39DdEfDklzbUnS98OJlMmD9TQ==
+"@gitlab/svgs@2.28.0":
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.28.0.tgz#a22ad2a4716db18af993d544a628d1d1f128aa7e"
+ integrity sha512-V1CO91bcYVYuYiYrc6EV02BEzutp06SclzRtC6CRvGoz8mf+qEh7L25a7GxpJyW7hbLo+xajY+IJYhKNmB/qVg==
-"@gitlab/ui@41.10.0":
- version "41.10.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-41.10.0.tgz#20c6475b5b8e47e4eda97d2d76d851191c981251"
- integrity sha512-ANxKD7YGSHTPphZE/oGrvyMraLUrC/cll8xGGizipPFo9pza9krobQfBt1tfLMs7DLSbtdmPoIpFjrOLaYM4NA==
+"@gitlab/ui@42.22.0":
+ version "42.22.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-42.22.0.tgz#22102109cbe64884fbbc69993f1c517962d78bae"
+ integrity sha512-I5n8FeRRgLVyj4FpnXbUUBElTHH1yhCyNarSwcf/qIeR4LeZIOm7Dm5wLAahUlGsStaq0SXlBguImtTRL7Re+g==
dependencies:
"@popperjs/core" "^2.11.2"
bootstrap-vue "2.20.1"
- dompurify "^2.3.8"
+ dompurify "^2.3.9"
echarts "^5.3.2"
iframe-resizer "^4.3.2"
lodash "^4.17.20"
@@ -1067,10 +1072,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/visual-review-tools/-/visual-review-tools-1.7.3.tgz#9ea641146436da388ffbad25d7f2abe0df52c235"
integrity sha512-NMV++7Ew1FSBDN1xiZaauU9tfeSfgDHcOLpn+8bGpP+O5orUPm2Eu66R5eC5gkjBPaXosNAxNWtriee+aFk4+g==
-"@graphql-eslint/eslint-plugin@3.10.4":
- version "3.10.4"
- resolved "https://registry.yarnpkg.com/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.10.4.tgz#fcc3b54ef1d6d38e89daf848d93be2d5359fef98"
- integrity sha512-+Vmi1E5uSWOgtylosHS3HYWHF+x0GMgaMOHmSfOflTE51VXnLM2tvGKMd3lpyngCEZG1wjvqdlB5rn2iwhhzqA==
+"@graphql-eslint/eslint-plugin@3.10.6":
+ version "3.10.6"
+ resolved "https://registry.yarnpkg.com/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.10.6.tgz#4d5748fade6c11d74aeff9a99d6e38d2ed8f6310"
+ integrity sha512-rxGSrKVsDHCuZRvP81ElgtCs0sikdhcHqQySiyhir4G+VhiNlPZ7SQJWrXm9JJEAeB0wQ50kabvse5NRk0hqog==
dependencies:
"@babel/code-frame" "^7.16.7"
"@graphql-tools/code-file-loader" "^7.2.14"
@@ -2766,16 +2771,16 @@ array-flatten@^2.1.2:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
-array-includes@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8"
- integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==
+array-includes@^3.1.4:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb"
+ integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==
dependencies:
- call-bind "^1.0.0"
- define-properties "^1.1.3"
- es-abstract "^1.18.0-next.1"
- get-intrinsic "^1.0.1"
- is-string "^1.0.5"
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.19.5"
+ get-intrinsic "^1.1.1"
+ is-string "^1.0.7"
array-union@^2.1.0:
version "2.1.0"
@@ -2787,14 +2792,15 @@ array-unique@^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.3:
- 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==
+array.prototype.flat@^1.2.5:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b"
+ integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==
dependencies:
- call-bind "^1.0.0"
+ call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.1"
+ es-abstract "^1.19.2"
+ es-shim-unscopables "^1.0.0"
arrify@^1.0.1:
version "1.0.1"
@@ -3170,7 +3176,7 @@ braces@^2.3.1:
split-string "^3.0.2"
to-regex "^3.0.1"
-braces@^3.0.1, braces@~3.0.2:
+braces@^3.0.2, 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==
@@ -3855,10 +3861,10 @@ confusing-browser-globals@^1.0.10:
resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59"
integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==
-connect-history-api-fallback@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
- integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+connect-history-api-fallback@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8"
+ integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
consola@^2.15.0:
version "2.15.3"
@@ -3884,11 +3890,6 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
-contains-path@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
- integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
-
content-disposition@0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
@@ -3965,10 +3966,10 @@ core-js-pure@^3.0.0:
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
-core-js@^3.23.1:
- version "3.23.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.1.tgz#9f9a9255115f62c512db56d567f636da32ca0b78"
- integrity sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w==
+core-js@^3.23.5:
+ version "3.23.5"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.5.tgz#1f82b0de5eece800827a2f59d597509c67650475"
+ integrity sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg==
core-js@~2.3.0:
version "2.3.0"
@@ -4114,6 +4115,11 @@ css-color-names@0.0.4:
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+css-functions-list@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b"
+ integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==
+
css-loader@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea"
@@ -4788,7 +4794,7 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
+debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -4874,12 +4880,13 @@ define-lazy-prop@^2.0.0:
resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
-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==
+define-properties@^1.1.3, define-properties@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
+ integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
dependencies:
- object-keys "^1.0.12"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
define-property@^0.2.5:
version "0.2.5"
@@ -5016,13 +5023,12 @@ docdash@^1.0.2:
resolved "https://registry.yarnpkg.com/docdash/-/docdash-1.0.2.tgz#0449a8f6bb247f563020b78a5485dea95ae2e094"
integrity sha512-IEM57bWPLtVXpUeCKbiGvHsHtW9O9ZiiBPfeQDAZ7JdQiAF3aNWQoJ3e/+uJ63lHO009yn0tbJjtKpXJ2AURCQ==
-doctrine@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
- integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
dependencies:
esutils "^2.0.2"
- isarray "^1.0.0"
doctrine@^3.0.0:
version "3.0.0"
@@ -5084,10 +5090,10 @@ dompurify@2.3.6:
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.6.tgz#2e019d7d7617aacac07cbbe3d88ae3ad354cf875"
integrity sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==
-dompurify@^2.3.8:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f"
- integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==
+dompurify@^2.3.9:
+ version "2.3.9"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.9.tgz#a4be5e7278338d6db09922dffcf6182cd099d70a"
+ integrity sha512-3zOnuTwup4lPV/GfGS6UzG4ub9nhSYagR/5tB3AvDEwqyy5dtyCM2dVjwGDCnrPerXifBKTYh/UWCGKK7ydhhw==
domutils@^2.5.2, domutils@^2.6.0:
version "2.6.0"
@@ -5273,32 +5279,48 @@ errno@^0.1.3, errno@~0.1.7:
dependencies:
prr "~1.0.1"
-error-ex@^1.2.0, error-ex@^1.3.1:
+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.18.0-next.1:
- version "1.18.0-next.2"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2"
- integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==
+es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5:
+ version "1.20.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814"
+ integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==
dependencies:
call-bind "^1.0.2"
es-to-primitive "^1.2.1"
function-bind "^1.1.1"
- get-intrinsic "^1.0.2"
+ function.prototype.name "^1.1.5"
+ get-intrinsic "^1.1.1"
+ get-symbol-description "^1.0.0"
has "^1.0.3"
- has-symbols "^1.0.1"
- is-callable "^1.2.2"
- is-negative-zero "^2.0.1"
- is-regex "^1.1.1"
- object-inspect "^1.9.0"
+ has-property-descriptors "^1.0.0"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.3"
+ is-callable "^1.2.4"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.0"
object-keys "^1.1.1"
object.assign "^4.1.2"
- string.prototype.trimend "^1.0.3"
- string.prototype.trimstart "^1.0.3"
+ regexp.prototype.flags "^1.4.3"
+ string.prototype.trimend "^1.0.5"
+ string.prototype.trimstart "^1.0.5"
+ unbox-primitive "^1.0.2"
+
+es-shim-unscopables@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
+ integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+ dependencies:
+ has "^1.0.3"
es-to-primitive@^1.2.1:
version "1.2.1"
@@ -5373,14 +5395,15 @@ escodegen@^1.14.1:
optionalDependencies:
source-map "~0.6.1"
-eslint-config-airbnb-base@^14.2.1:
- version "14.2.1"
- resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e"
- integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==
+eslint-config-airbnb-base@^15.0.0:
+ version "15.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236"
+ integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==
dependencies:
confusing-browser-globals "^1.0.10"
object.assign "^4.1.2"
- object.entries "^1.1.2"
+ object.entries "^1.1.5"
+ semver "^6.3.0"
eslint-config-prettier@^6.10.0:
version "6.10.0"
@@ -5397,13 +5420,13 @@ eslint-import-resolver-jest@3.0.2:
find-root "^1.1.0"
resolve "^1.12.0"
-eslint-import-resolver-node@^0.3.4:
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717"
- integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
+eslint-import-resolver-node@^0.3.6:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd"
+ integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
dependencies:
- debug "^2.6.9"
- resolve "^1.13.1"
+ debug "^3.2.7"
+ resolve "^1.20.0"
eslint-import-resolver-webpack@0.13.2:
version "0.13.2"
@@ -5422,13 +5445,13 @@ eslint-import-resolver-webpack@0.13.2:
resolve "^1.20.0"
semver "^5.7.1"
-eslint-module-utils@^2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
- integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
+eslint-module-utils@^2.7.3:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee"
+ integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==
dependencies:
- debug "^2.6.9"
- pkg-dir "^2.0.0"
+ debug "^3.2.7"
+ find-up "^2.1.0"
eslint-plugin-babel@^5.3.0:
version "5.3.0"
@@ -5437,24 +5460,24 @@ eslint-plugin-babel@^5.3.0:
dependencies:
eslint-rule-composer "^0.3.0"
-eslint-plugin-import@^2.22.1:
- version "2.22.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702"
- integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==
+eslint-plugin-import@^2.26.0:
+ version "2.26.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b"
+ integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==
dependencies:
- array-includes "^3.1.1"
- array.prototype.flat "^1.2.3"
- contains-path "^0.1.0"
+ array-includes "^3.1.4"
+ array.prototype.flat "^1.2.5"
debug "^2.6.9"
- doctrine "1.5.0"
- eslint-import-resolver-node "^0.3.4"
- eslint-module-utils "^2.6.0"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.6"
+ eslint-module-utils "^2.7.3"
has "^1.0.3"
- minimatch "^3.0.4"
- object.values "^1.1.1"
- read-pkg-up "^2.0.0"
- resolve "^1.17.0"
- tsconfig-paths "^3.9.0"
+ is-core-module "^2.8.1"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.values "^1.1.5"
+ resolve "^1.22.0"
+ tsconfig-paths "^3.14.1"
eslint-plugin-jest@^23.8.2:
version "23.8.2"
@@ -6030,7 +6053,7 @@ find-root@^1.1.0:
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
-find-up@^2.0.0, find-up@^2.1.0:
+find-up@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
@@ -6193,11 +6216,26 @@ function-bind@^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.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
+ integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.0"
+ functions-have-names "^1.2.2"
+
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+functions-have-names@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
fuzzaldrin-plus@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/fuzzaldrin-plus/-/fuzzaldrin-plus-0.6.0.tgz#832f6489fbe876769459599c914a670ec22947ee"
@@ -6213,14 +6251,14 @@ get-caller-file@^2.0.1:
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.1, get-intrinsic@^1.0.2:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
- integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
+ integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
dependencies:
function-bind "^1.1.1"
has "^1.0.3"
- has-symbols "^1.0.1"
+ has-symbols "^1.0.3"
get-package-type@^0.1.0:
version "0.1.0"
@@ -6261,6 +6299,14 @@ get-stream@^6.0.0:
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
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"
@@ -6494,6 +6540,11 @@ hard-rejection@^2.1.0:
resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -6504,10 +6555,17 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-has-symbols@^1.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-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
has-tostringtag@^1.0.0:
version "1.0.0"
@@ -6650,13 +6708,6 @@ hast-util-to-parse5@^7.0.0:
web-namespaces "^2.0.0"
zwitch "^2.0.0"
-hast-util-to-string@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz#b008b0a4ea472bf34dd390b7eea1018726ae152a"
- integrity sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==
- dependencies:
- "@types/hast" "^2.0.0"
-
hastscript@^7.0.0:
version "7.0.2"
resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.0.2.tgz#d811fc040817d91923448a28156463b2e40d590a"
@@ -6673,10 +6724,10 @@ he@^1.1.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-highlight.js@^11.3.1, highlight.js@~11.4.0:
- version "11.4.0"
- resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.4.0.tgz#34ceadd49e1596ee5aba3d99346cdfd4845ee05a"
- integrity sha512-nawlpCBCSASs7EdvZOYOYVkJpGmAOKMYZgZtUqSRqodZE0GRVcFKwo1RcpeOemqh9hyttTdd5wDBwHkuSyUfnA==
+highlight.js@^11.5.1, highlight.js@~11.5.0:
+ version "11.5.1"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.5.1.tgz#027c24e4509e2f4dcd00b4a6dda542ce0a1f7aea"
+ integrity sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==
highlight.js@~10.7.0:
version "10.7.2"
@@ -6738,10 +6789,10 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491"
integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==
-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-tags@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961"
+ integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==
html-void-elements@^2.0.0:
version "2.0.1"
@@ -6920,6 +6971,11 @@ immer@^7.0.7:
resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.7.tgz#9dfe713d49bf871cc59aedfce59b1992fa37a977"
integrity sha512-Q8yYwVADJXrNfp1ZUAh4XDHkcoE3wpdpb4mC5abDSajs2EbW8+cGdPyAnglMyLnm7EF6ojD2xBFX7L5i4TIytw==
+immutable@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
+ integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
+
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -7004,6 +7060,15 @@ inline-style-parser@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"
+
"internmap@1 - 2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
@@ -7053,6 +7118,13 @@ is-arrayish@^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.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
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"
@@ -7060,6 +7132,14 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
is-buffer@^1.1.5, is-buffer@~1.1.1:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@@ -7077,10 +7157,10 @@ is-builtin-module@^3.1.0:
dependencies:
builtin-modules "^3.0.0"
-is-callable@^1.1.4, is-callable@^1.2.2:
- 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-callable@^1.1.4, is-callable@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
+ integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
is-ci@^2.0.0:
version "2.0.0"
@@ -7089,10 +7169,10 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
-is-core-module@^2.5.0, is-core-module@^2.7.0, is-core-module@^2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
- integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+is-core-module@^2.5.0, is-core-module@^2.7.0, is-core-module@^2.8.1, is-core-module@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
dependencies:
has "^1.0.3"
@@ -7170,7 +7250,7 @@ is-generator-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -7185,16 +7265,23 @@ is-installed-globally@^0.3.1:
global-dirs "^2.0.1"
is-path-inside "^3.0.1"
-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-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
is-npm@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@@ -7249,7 +7336,7 @@ is-potential-custom-element-name@^1.0.0:
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397"
integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c=
-is-regex@^1.1.1, is-regex@^1.1.4:
+is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
@@ -7262,6 +7349,13 @@ is-regexp@^2.0.0:
resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -7272,23 +7366,32 @@ is-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
-is-string@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
- integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
-is-symbol@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
- integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
+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.0"
+ 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-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
is-whitespace@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
@@ -8112,10 +8215,10 @@ kleur@^4.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d"
integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==
-known-css-properties@^0.24.0:
- version "0.24.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.24.0.tgz#19aefd85003ae5698a5560d2b55135bf5432155c"
- integrity sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==
+known-css-properties@^0.25.0:
+ version "0.25.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776"
+ integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==
latest-version@^5.0.0:
version "5.1.0"
@@ -8169,16 +8272,6 @@ linkifyjs@^3.0.5:
resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-3.0.5.tgz#99e51a3a0c0e232fcb63ebb89eea3ff923378f34"
integrity sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==
-load-json-file@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
- integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.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"
@@ -8400,14 +8493,14 @@ lowlight@^1.20.0:
fault "^1.0.0"
highlight.js "~10.7.0"
-lowlight@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-2.5.0.tgz#723a39fc0d9b911731a395b320519cbb0790ab14"
- integrity sha512-OXGUch9JZu4q5r4Ir6QlUp5pBXMxS7NHaclhRiUlxNRcOSK0gtXZcVrsGP4eM7bv0/KDHg/TXQagx/X35EULsA==
+lowlight@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-2.6.1.tgz#d3cbc7ae0530c848e512b8e6528609587520b44f"
+ integrity sha512-t0ueDL6SIn9FKHipm78CNjWcJQv0xi6WCjYAICyO6GyPzoT7E58yom1mNwvI7AMwVe3pLwwFT0Bt2gml7uaUeQ==
dependencies:
"@types/hast" "^2.0.0"
fault "^2.0.0"
- highlight.js "~11.4.0"
+ highlight.js "~11.5.0"
lru-cache@^4.1.2, lru-cache@^4.1.5:
version "4.1.5"
@@ -9085,13 +9178,13 @@ micromatch@^3.1.10, micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.2, micromatch@^4.0.4:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
- integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
dependencies:
- braces "^3.0.1"
- picomatch "^2.2.3"
+ braces "^3.0.2"
+ picomatch "^2.3.1"
miller-rabin@^4.0.0:
version "4.0.1"
@@ -9162,7 +9255,14 @@ minimatch@4.2.1:
dependencies:
brace-expansion "^1.1.7"
-minimatch@^3.0.4, minimatch@~3.0.4:
+minimatch@^3.0.4, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@~3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -9178,10 +9278,10 @@ minimist-options@4.1.0:
is-plain-obj "^1.1.0"
kind-of "^6.0.3"
-minimist@^1.1.1, 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==
+minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
minipass-collect@^1.0.2:
version "1.0.2"
@@ -9361,10 +9461,10 @@ multicast-dns@^7.2.4:
dns-packet "^5.2.2"
thunky "^1.0.2"
-nanoid@^3.1.30:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c"
- integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
+nanoid@^3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
nanomatch@^1.2.9:
version "1.2.13"
@@ -9512,7 +9612,7 @@ nopt@~1.0.10:
dependencies:
abbrev "1"
-normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
+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==
@@ -9544,11 +9644,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-normalize-selector@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
- integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=
-
normalize-url@^4.1.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
@@ -9599,12 +9694,12 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
-object-inspect@^1.9.0:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a"
- integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==
+object-inspect@^1.12.0, object-inspect@^1.9.0:
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
+ integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
-object-keys@^1.0.12, object-keys@^1.1.1:
+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==
@@ -9626,15 +9721,14 @@ object.assign@^4.1.0, object.assign@^4.1.2:
has-symbols "^1.0.1"
object-keys "^1.1.1"
-object.entries@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6"
- integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==
+object.entries@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
+ integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
dependencies:
- call-bind "^1.0.0"
+ call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.1"
- has "^1.0.3"
+ es-abstract "^1.19.1"
object.pick@^1.3.0:
version "1.3.0"
@@ -9643,15 +9737,14 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
-object.values@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731"
- integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==
+object.values@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
+ integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
dependencies:
- call-bind "^1.0.0"
+ call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.1"
- has "^1.0.3"
+ es-abstract "^1.19.1"
obuf@^1.0.0, obuf@^1.1.2:
version "1.1.2"
@@ -9902,13 +9995,6 @@ parse-color@^1.0.0:
dependencies:
color-convert "~0.5.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@^5.0.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
@@ -10005,13 +10091,6 @@ path-to-regexp@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@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
- integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
- dependencies:
- pify "^2.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"
@@ -10051,15 +10130,10 @@ picocolors@^1.0.0:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
-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=
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pify@^4.0.1:
version "4.0.1"
@@ -10078,13 +10152,6 @@ pirates@^4.0.1:
dependencies:
node-modules-regexp "^1.0.0"
-pkg-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
- integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
- dependencies:
- find-up "^2.1.0"
-
pkg-dir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
@@ -10171,15 +10238,15 @@ postcss-safe-parser@^6.0.0:
resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1"
integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==
-postcss-scss@4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.3.tgz#36c23c19a804274e722e83a54d20b838ab4767ac"
- integrity sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA==
+postcss-scss@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.4.tgz#aa8f60e19ee18259bc193db9e4b96edfce3f3b1f"
+ integrity sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg==
-postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9:
- version "6.0.9"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f"
- integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9:
+ version "6.0.10"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
+ integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
@@ -10194,14 +10261,14 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@8.4.5, postcss@^8.2.1, postcss@^8.4.5:
- version "8.4.5"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95"
- integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==
+postcss@8.4.14, postcss@^8.2.1, postcss@^8.4.14:
+ version "8.4.14"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
+ integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
dependencies:
- nanoid "^3.1.30"
+ nanoid "^3.3.4"
picocolors "^1.0.0"
- source-map-js "^1.0.1"
+ source-map-js "^1.0.2"
postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.39"
@@ -10649,14 +10716,6 @@ react-is@^17.0.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
-read-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
- integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^2.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"
@@ -10666,15 +10725,6 @@ read-pkg-up@^7.0.1:
read-pkg "^5.2.0"
type-fest "^0.8.1"
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
- integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
- dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.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"
@@ -10778,6 +10828,15 @@ regexp-tree@^0.1.24, regexp-tree@~0.1.1:
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d"
integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==
+regexp.prototype.flags@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"
+ integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ functions-have-names "^1.2.2"
+
regexpp@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
@@ -10979,12 +11038,12 @@ resolve-url@^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.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.9.0:
- version "1.22.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
- integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
dependencies:
- is-core-module "^2.8.1"
+ is-core-module "^2.9.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -11132,12 +11191,14 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
-sass@^1.32.12:
- version "1.32.12"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.12.tgz#a2a47ad0f1c168222db5206444a30c12457abb9f"
- integrity sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==
+sass@^1.49.9:
+ version "1.49.9"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9"
+ integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==
dependencies:
chokidar ">=3.0.0 <4.0.0"
+ immutable "^4.0.0"
+ source-map-js ">=0.6.2 <2.0.0"
sax@1.2.1, sax@>=0.6.0:
version "1.2.1"
@@ -11394,15 +11455,24 @@ shortcss@^0.1.3:
dependencies:
css-shorthand-properties "^1.0.0"
+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"
+
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
-signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
- integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
+signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
sirv@^1.0.7:
version "1.0.11"
@@ -11495,7 +11565,7 @@ source-list-map@^2.0.0:
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==
-source-map-js@^1.0.1:
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@@ -11593,11 +11663,6 @@ spdy@^4.0.2:
select-hose "^2.0.0"
spdy-transport "^3.0.0"
-specificity@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
- integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
-
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"
@@ -11732,21 +11797,23 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
-string.prototype.trimend@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b"
- integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==
+string.prototype.trimend@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0"
+ integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==
dependencies:
- call-bind "^1.0.0"
- define-properties "^1.1.3"
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.19.5"
-string.prototype.trimstart@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa"
- integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==
+string.prototype.trimstart@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef"
+ integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==
dependencies:
- call-bind "^1.0.0"
- define-properties "^1.1.3"
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.19.5"
string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1:
version "1.1.1"
@@ -11839,10 +11906,10 @@ stylelint-declaration-strict-value@1.8.0:
css-values "^0.1.0"
shortcss "^0.1.3"
-stylelint-scss@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-4.1.0.tgz#39b808696f8152081163d970449257ff80b5c041"
- integrity sha512-BNYTo7MMamhFOlcaAWp2dMpjg6hPyM/FFqfDIYzmYVLMmQJqc8lWRIiTqP4UX5bresj9Vo0dKC6odSh43VP2NA==
+stylelint-scss@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-4.2.0.tgz#e25fd390ee38a7e89fcfaec2a8f9dce2ec6ddee8"
+ integrity sha512-HHHMVKJJ5RM9pPIbgJ/XA67h9H0407G68Rm69H4fzFbFkyDMcTV1Byep3qdze5+fJ3c0U7mJrbj6S0Fg072uZA==
dependencies:
lodash "^4.17.21"
postcss-media-query-parser "^0.2.3"
@@ -11850,15 +11917,17 @@ stylelint-scss@4.1.0:
postcss-selector-parser "^6.0.6"
postcss-value-parser "^4.1.0"
-stylelint@^14.3.0:
- version "14.3.0"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.3.0.tgz#26b62730da7b3dc320021fc469d80048d7b77ebe"
- integrity sha512-PZXSwtJe4f4qBPWBwAbHL0M0Qjrv8iHN+cLpUNsffaVMS3YzpDDRI73+2lsqLAYfQEzxRwpll6BDKImREbpHWA==
+stylelint@^14.9.1:
+ version "14.9.1"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.9.1.tgz#6494ed38f148b1e75b402d678a3b6a8aae86dfda"
+ integrity sha512-RdAkJdPiLqHawCSnu21nE27MjNXaVd4WcOHA4vK5GtIGjScfhNnaOuWR2wWdfKFAvcWQPOYe311iveiVKSmwsA==
dependencies:
+ "@csstools/selector-specificity" "^2.0.1"
balanced-match "^2.0.0"
colord "^2.9.2"
cosmiconfig "^7.0.1"
- debug "^4.3.3"
+ css-functions-list "^3.1.0"
+ debug "^4.3.4"
execall "^2.0.0"
fast-glob "^3.2.11"
fastest-levenshtein "^1.0.12"
@@ -11867,26 +11936,24 @@ stylelint@^14.3.0:
global-modules "^2.0.0"
globby "^11.1.0"
globjoin "^0.1.4"
- html-tags "^3.1.0"
+ html-tags "^3.2.0"
ignore "^5.2.0"
import-lazy "^4.0.0"
imurmurhash "^0.1.4"
is-plain-object "^5.0.0"
- known-css-properties "^0.24.0"
+ known-css-properties "^0.25.0"
mathml-tag-names "^2.1.3"
meow "^9.0.0"
- micromatch "^4.0.4"
+ micromatch "^4.0.5"
normalize-path "^3.0.0"
- normalize-selector "^0.2.0"
picocolors "^1.0.0"
- postcss "^8.4.5"
+ postcss "^8.4.14"
postcss-media-query-parser "^0.2.3"
postcss-resolve-nested-selector "^0.1.1"
postcss-safe-parser "^6.0.0"
- postcss-selector-parser "^6.0.9"
+ postcss-selector-parser "^6.0.10"
postcss-value-parser "^4.2.0"
resolve-from "^5.0.0"
- specificity "^0.4.1"
string-width "^4.2.3"
strip-ansi "^6.0.1"
style-search "^0.1.0"
@@ -11894,7 +11961,7 @@ stylelint@^14.3.0:
svg-tags "^1.0.0"
table "^6.8.0"
v8-compile-cache "^2.3.0"
- write-file-atomic "^4.0.0"
+ write-file-atomic "^4.0.1"
stylis@^4.0.10:
version "4.0.10"
@@ -11944,10 +12011,10 @@ svg-tags@^1.0.0:
resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
-swagger-ui-dist@4.8.0:
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.8.0.tgz#5f39a038a02ffbd5defb8e1921a9ac1620d779ae"
- integrity sha512-jdcO4XcbwkAtrwvHp90Usjx3d4JZMjaiS02CxBFfuSxr6G8DBXPcK471+N6BcBkwZK7VTgpUBFAyyarsAvKYFQ==
+swagger-ui-dist@4.12.0:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.12.0.tgz#986d90f05e81fb9db3ca40372278a5d8ce71db3a"
+ integrity sha512-B0Iy2ueXtbByE6OOyHTi3lFQkpPi/L7kFOKFeKTr44za7dJIELa9kzaca6GkndCgpK1QTjArnoXG+aUy0XQp1w==
symbol-observable@^1.0.4:
version "1.2.0"
@@ -12267,14 +12334,14 @@ ts-node@^9:
source-map-support "^0.5.17"
yn "3.1.1"
-tsconfig-paths@^3.9.0:
- version "3.9.0"
- resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
- integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+tsconfig-paths@^3.14.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
+ integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
- minimist "^1.2.0"
+ minimist "^1.2.6"
strip-bom "^3.0.0"
tslib@2.3.0, tslib@~2.3.0:
@@ -12375,11 +12442,6 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
-typedarray-to-buffer@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz#cdd2933c61dd3f5f02eda5d012d441f95bfeb50a"
- integrity sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==
-
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -12395,6 +12457,16 @@ uc.micro@^1.0.1, uc.micro@^1.0.5:
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
undefsafe@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76"
@@ -13101,10 +13173,10 @@ webpack-dev-middleware@^5.3.1:
range-parser "^1.2.1"
schema-utils "^4.0.0"
-webpack-dev-server@4.9.2:
- version "4.9.2"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz#c188db28c7bff12f87deda2a5595679ebbc3c9bc"
- integrity sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==
+webpack-dev-server@4.9.3:
+ version "4.9.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz#2360a5d6d532acb5410a668417ad549ee3b8a3c9"
+ integrity sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==
dependencies:
"@types/bonjour" "^3.5.9"
"@types/connect-history-api-fallback" "^1.3.5"
@@ -13118,7 +13190,7 @@ webpack-dev-server@4.9.2:
chokidar "^3.5.3"
colorette "^2.0.10"
compression "^1.7.4"
- connect-history-api-fallback "^1.6.0"
+ connect-history-api-fallback "^2.0.0"
default-gateway "^6.0.3"
express "^4.17.3"
graceful-fs "^4.2.6"
@@ -13229,6 +13301,17 @@ whatwg-url@^8.0.0:
tr46 "^2.0.2"
webidl-conversions "^5.0.0"
+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"
@@ -13304,15 +13387,13 @@ write-file-atomic@^3.0.0:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
-write-file-atomic@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.0.tgz#0eff5dc687d3e22535ca3fca8558124645a4b053"
- integrity sha512-JhcWoKffJNF7ivO9yflBhc7tn3wKnokMUfWpBriM9yCXj4ePQnRPcWglBkkg1AHC8nsW/EfxwwhqsLtOy59djA==
+write-file-atomic@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
+ integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
dependencies:
imurmurhash "^0.1.4"
- is-typedarray "^1.0.0"
- signal-exit "^3.0.2"
- typedarray-to-buffer "^4.0.0"
+ signal-exit "^3.0.7"
"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.2.3, ws@^7.3.1:
version "7.5.5"